From 68a64809d9b1d5ac4eb2d668ab8a4fce99fc5c91 Mon Sep 17 00:00:00 2001 From: Nick Saunders Date: Sat, 6 Jul 2024 10:45:39 -0700 Subject: [PATCH] Fix reusable conditions (#62) * Fix typing for complex reusable conditions. * add changeset --- .changeset/fuzzy-dogs-relate.md | 6 ++++++ docs/api/react.createconditions.md | 6 +++--- packages/core/package.json | 3 ++- packages/core/src/index.ts | 12 ++++-------- packages/core/test/index.ts | 16 ++++++++++++++++ packages/core/test/tsconfig.json | 7 +++++++ 6 files changed, 38 insertions(+), 12 deletions(-) create mode 100644 .changeset/fuzzy-dogs-relate.md create mode 100644 packages/core/test/index.ts create mode 100644 packages/core/test/tsconfig.json diff --git a/.changeset/fuzzy-dogs-relate.md b/.changeset/fuzzy-dogs-relate.md new file mode 100644 index 0000000..506c091 --- /dev/null +++ b/.changeset/fuzzy-dogs-relate.md @@ -0,0 +1,6 @@ +--- +"@embellish/core": patch +"@embellish/react": patch +--- + +Fixed typing for complex reusable conditions. diff --git a/docs/api/react.createconditions.md b/docs/api/react.createconditions.md index b98a8b9..980896b 100644 --- a/docs/api/react.createconditions.md +++ b/docs/api/react.createconditions.md @@ -9,7 +9,7 @@ Creates reusable conditions based on the provided hooks, each consisting of eith **Signature:** ```typescript -export declare function createConditions, ConditionName extends string, S extends keyof AvailableHooks = AvailableHooks extends Hooks ? S : never>(hooks: AvailableHooks, conditions: { +export declare function createConditions(hooks: Hooks, conditions: Record> & { [Name in ConditionName]: ValidConditionName & Condition; }): Conditions; ``` @@ -39,7 +39,7 @@ hooks -AvailableHooks +[Hooks](./react.hooks.md)<S> @@ -55,7 +55,7 @@ conditions -{ \[Name in ConditionName\]: [ValidConditionName](./react.validconditionname.md)<Name> & [Condition](./react.condition.md)<S>; } +Record<string, [Condition](./react.condition.md)<S>> & { \[Name in ConditionName\]: [ValidConditionName](./react.validconditionname.md)<Name> & [Condition](./react.condition.md)<S>; } diff --git a/packages/core/package.json b/packages/core/package.json index 876e624..1552777 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -11,7 +11,8 @@ "module": "dist/index.js", "types": "dist/index.d.ts", "scripts": { - "prepare": "tsc" + "prepare": "tsc", + "test": "tsc --project test" }, "exports": { ".": { diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 189368a..199c64b 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -169,10 +169,9 @@ export type Conditions = Branded< * either a hook id or a logical combination using the `and`, `or`, and `not` * operators. * - * @typeParam AvailableHooks - The type of hooks available for use in conditions - * @typeParam ConditionName - The type of the names of conditions to create * @typeParam S - The selector logic of the hooks available for use in * conditions + * @typeParam ConditionName - The type of the names of conditions to create * @param hooks - The hooks available for use in conditions * @param conditions - The conditions to create * @@ -181,14 +180,11 @@ export type Conditions = Branded< * @public */ export function createConditions< - AvailableHooks extends Hooks, + S extends Selector, ConditionName extends string, - S extends keyof AvailableHooks = AvailableHooks extends Hooks - ? S - : never, >( - hooks: AvailableHooks, - conditions: { + hooks: Hooks, + conditions: Record> & { [Name in ConditionName]: ValidConditionName & Condition; }, ) { diff --git a/packages/core/test/index.ts b/packages/core/test/index.ts new file mode 100644 index 0000000..72d16bb --- /dev/null +++ b/packages/core/test/index.ts @@ -0,0 +1,16 @@ +import { createConditions, createHooks } from "../src/index.js"; + +// type-level tests + +() => { + // complex reusable conditions + const { hooks } = createHooks([ + "@media (prefers-color-scheme: dark)", + "&:hover", + "&.active", + ]); + createConditions(hooks, { + dark: "@media (prefers-color-scheme: dark)", + hoverUnselected: { and: ["&:hover", { not: "&.active" }] }, + }); +}; diff --git a/packages/core/test/tsconfig.json b/packages/core/test/tsconfig.json new file mode 100644 index 0000000..db7d75b --- /dev/null +++ b/packages/core/test/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "noEmit": true + }, + "include": ["."] +}