diff --git a/.changeset/jolly-deer-write.md b/.changeset/jolly-deer-write.md new file mode 100644 index 00000000..1be7c4c6 --- /dev/null +++ b/.changeset/jolly-deer-write.md @@ -0,0 +1,7 @@ +--- +"@marko/language-tools": patch +"@marko/type-check": patch +"marko-vscode": patch +--- + +Type narrowing fix for attribute tags diff --git a/packages/language-server/src/__tests__/fixtures/script/attr-tag-target-property/__snapshots__/attr-tag-target-property.expected/index.md b/packages/language-server/src/__tests__/fixtures/script/attr-tag-target-property/__snapshots__/attr-tag-target-property.expected/index.md index dda2f592..036527b5 100644 --- a/packages/language-server/src/__tests__/fixtures/script/attr-tag-target-property/__snapshots__/attr-tag-target-property.expected/index.md +++ b/packages/language-server/src/__tests__/fixtures/script/attr-tag-target-property/__snapshots__/attr-tag-target-property.expected/index.md @@ -4,9 +4,9 @@ 4 | 5 | > 6 | <@item x=1> - | ^^^^^ Type 'AttrTag<{ x: number; renderBody: () => MarkoReturn; [Symbol.iterator]: any; }> | AttrTag<{ renderBody: () => MarkoReturn; [Symbol.iterator]: any; }>' is not assignable to type 'AttrTag<{ x: number; renderBody?: Body<[], void> | undefined; }>'. - Type 'AttrTag<{ renderBody: () => MarkoReturn; [Symbol.iterator]: any; }>' is not assignable to type 'AttrTag<{ x: number; renderBody?: Body<[], void> | undefined; }>'. - Property 'x' is missing in type 'AttrTag<{ renderBody: () => MarkoReturn; [Symbol.iterator]: any; }>' but required in type '{ x: number; renderBody?: Body<[], void> | undefined; }'. + | ^^^^^ Type 'AttrTag<{ readonly x: 1; readonly renderBody: () => MarkoReturn; readonly [Symbol.iterator]: any; }> | AttrTag<{ readonly renderBody: () => MarkoReturn; readonly [Symbol.iterator]: any; }>' is not assignable to type 'AttrTag<{ x: number; renderBody?: Body<[], void> | undefined; }>'. + Type 'AttrTag<{ readonly renderBody: () => MarkoReturn; readonly [Symbol.iterator]: any; }>' is not assignable to type 'AttrTag<{ x: number; renderBody?: Body<[], void> | undefined; }>'. + Property 'x' is missing in type 'AttrTag<{ readonly renderBody: () => MarkoReturn; readonly [Symbol.iterator]: any; }>' but required in type '{ x: number; renderBody?: Body<[], void> | undefined; }'. 7 | Hello! 8 | 9 | diff --git a/packages/language-server/src/__tests__/fixtures/script/attr-tags-for-narrowing/__snapshots__/attr-tags-for-narrowing.expected/index.md b/packages/language-server/src/__tests__/fixtures/script/attr-tags-for-narrowing/__snapshots__/attr-tags-for-narrowing.expected/index.md index 50dd0eac..e28a00d7 100644 --- a/packages/language-server/src/__tests__/fixtures/script/attr-tags-for-narrowing/__snapshots__/attr-tags-for-narrowing.expected/index.md +++ b/packages/language-server/src/__tests__/fixtures/script/attr-tags-for-narrowing/__snapshots__/attr-tags-for-narrowing.expected/index.md @@ -15,7 +15,7 @@ 5 | 6 | > 7 | <@item size="small"/> - | ^ (property) "size": string + | ^ (property) "size": "small" 8 | // ^? 9 | <@item size="huge"/> 10 | // ^? @@ -26,7 +26,7 @@ 7 | <@item size="small"/> 8 | // ^? > 9 | <@item size="huge"/> - | ^ (property) "size": string + | ^ (property) "size": "huge" 10 | // ^? 11 | 12 | @@ -51,15 +51,15 @@ > 8 | // ^? | ^^^^^^^^^^^^^^^^^^^^^^^^^ > 9 | <@item size="huge"/> - | ^^^^^^^^^^^ Argument of type '{ item: Marko.AttrTag<{ readonly size: "small"; readonly [Symbol.iterator]: any; }> | Marko.AttrTag | Marko.AttrTag<...>> | undefined; }' is not assignable to parameter of type 'Directives & Input'. - Type '{ item: Marko.AttrTag<{ readonly size: "small"; readonly [Symbol.iterator]: any; }> | Marko.AttrTag | Marko.AttrTag<...>> | undefined; }' is not assignable to type 'Input'. + | ^^^^^^^^^^^ Argument of type '{ item: Marko.AttrTag<{ readonly size: "small"; readonly [Symbol.iterator]: any; }> | Marko.AttrTag | Marko.AttrTag<...>> | undefined; }' is not assignable to parameter of type 'Directives & Input'. + Type '{ item: Marko.AttrTag<{ readonly size: "small"; readonly [Symbol.iterator]: any; }> | Marko.AttrTag | Marko.AttrTag<...>> | undefined; }' is not assignable to type 'Input'. Types of property 'item' are incompatible. - Type 'AttrTag<{ readonly size: "small"; readonly [Symbol.iterator]: any; }> | AttrTag | AttrTag<...>> | undefined' is not assignable to type 'AttrTag<{ size?: "small" | "large" | undefined; }> | undefined'. - Type '{ size: string; [Symbol.iterator]: any; } & { [Symbol.iterator](): Iterator<{ size: string; [Symbol.iterator]: any; }, any, any>; } & { ...; }' is not assignable to type 'AttrTag<{ size?: "small" | "large" | undefined; }> | undefined'. - Type '{ size: string; [Symbol.iterator]: any; } & { [Symbol.iterator](): Iterator<{ size: string; [Symbol.iterator]: any; }, any, any>; } & { ...; }' is not assignable to type 'AttrTag<{ size?: "small" | "large" | undefined; }>'. - Type '{ size: string; [Symbol.iterator]: any; } & { [Symbol.iterator](): Iterator<{ size: string; [Symbol.iterator]: any; }, any, any>; } & { ...; }' is not assignable to type '{ size?: "small" | "large" | undefined; }'. + Type 'AttrTag<{ readonly size: "small"; readonly [Symbol.iterator]: any; }> | AttrTag | AttrTag<...>> | undefined' is not assignable to type 'AttrTag<{ size?: "small" | "large" | undefined; }> | undefined'. + Type '{ readonly size: "huge"; readonly [Symbol.iterator]: any; } & { [Symbol.iterator](): Iterator<{ readonly size: "huge"; readonly [Symbol.iterator]: any; }, any, any>; } & { ...; }' is not assignable to type 'AttrTag<{ size?: "small" | "large" | undefined; }> | undefined'. + Type '{ readonly size: "huge"; readonly [Symbol.iterator]: any; } & { [Symbol.iterator](): Iterator<{ readonly size: "huge"; readonly [Symbol.iterator]: any; }, any, any>; } & { ...; }' is not assignable to type 'AttrTag<{ size?: "small" | "large" | undefined; }>'. + Type '{ readonly size: "huge"; readonly [Symbol.iterator]: any; } & { [Symbol.iterator](): Iterator<{ readonly size: "huge"; readonly [Symbol.iterator]: any; }, any, any>; } & { ...; }' is not assignable to type '{ size?: "small" | "large" | undefined; }'. Types of property 'size' are incompatible. - Type 'string' is not assignable to type '"small" | "large" | undefined'. + Type '"huge"' is not assignable to type '"small" | "large" | undefined'. 10 | // ^? 11 | 12 | diff --git a/packages/language-tools/marko.internal.d.ts b/packages/language-tools/marko.internal.d.ts index 1ae0ee8c..03309cb1 100644 --- a/packages/language-tools/marko.internal.d.ts +++ b/packages/language-tools/marko.internal.d.ts @@ -402,7 +402,7 @@ declare global { ...path: Path ): < Name extends string, - AttrTags extends readonly ([0] extends [1 & Tag] + const AttrTags extends readonly ([0] extends [1 & Tag] ? Record> : Record< Name,