diff --git a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/element-attributes.only/expected.json b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/element-attributes.only/expected.json new file mode 100644 index 000000000..d9e983195 --- /dev/null +++ b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/element-attributes.only/expected.json @@ -0,0 +1,10 @@ +[ + { + "range": { "start": { "line": 10, "character": 4 }, "end": { "line": 10, "character": 4 } }, + "severity": 1, + "source": "ts", + "message": "Type '{ bar: string; }' is not assignable to type 'HTMLProps'.\n Property 'bar' does not exist on type 'HTMLProps'.", + "code": 2322, + "tags": [] + } +] diff --git a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/element-attributes.only/expectedv2.json b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/element-attributes.only/expectedv2.json new file mode 100644 index 000000000..c39d0a9e7 --- /dev/null +++ b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/element-attributes.only/expectedv2.json @@ -0,0 +1,18 @@ +[ + { + "range": { "start": { "line": 9, "character": 5 }, "end": { "line": 9, "character": 19 } }, + "severity": 1, + "source": "ts", + "message": "Argument of type '{ \"this-is\": string; }' is not assignable to parameter of type 'HTMLProps'.\n Object literal may only specify known properties, and '\"this-is\"' does not exist in type 'HTMLProps'.", + "code": 2345, + "tags": [] + }, + { + "range": { "start": { "line": 10, "character": 6 }, "end": { "line": 10, "character": 9 } }, + "severity": 1, + "source": "ts", + "message": "Argument of type '{ bar: string; }' is not assignable to parameter of type 'HTMLProps'.\n Object literal may only specify known properties, and 'bar' does not exist in type 'HTMLProps'.", + "code": 2345, + "tags": [] + } +] diff --git a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/element-attributes.only/input.svelte b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/element-attributes.only/input.svelte new file mode 100644 index 000000000..a901da58e --- /dev/null +++ b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/element-attributes.only/input.svelte @@ -0,0 +1,11 @@ + + + +
+
+ + +
+
diff --git a/packages/svelte2tsx/src/htmlxtojsx_v2/nodes/Attribute.ts b/packages/svelte2tsx/src/htmlxtojsx_v2/nodes/Attribute.ts index 7c4cd4e24..9e3d79508 100644 --- a/packages/svelte2tsx/src/htmlxtojsx_v2/nodes/Attribute.ts +++ b/packages/svelte2tsx/src/htmlxtojsx_v2/nodes/Attribute.ts @@ -69,8 +69,18 @@ export function handleAttribute( const addAttribute = element instanceof Element - ? (name: TransformationArray, value?: TransformationArray) => - element.addAttribute(name, value) + ? (name: TransformationArray, value?: TransformationArray) => { + if (attr.name.startsWith('data-')) { + // any attribute prefixed with data- is valid, but we can't + // type that statically, so we need this workaround + name.unshift('...__sveltets_2_empty({'); + if (!value) { + value = ['__sveltets_2_any()']; + } + value.push('})'); + } + element.addAttribute(name, value); + } : (name: TransformationArray, value?: TransformationArray) => { if (attr.name.startsWith('--') && attr.value !== true) { // CSS custom properties are not part of the props diff --git a/packages/svelte2tsx/svelte-shims.d.ts b/packages/svelte2tsx/svelte-shims.d.ts index 58bd6aeb1..e7320188c 100644 --- a/packages/svelte2tsx/svelte-shims.d.ts +++ b/packages/svelte2tsx/svelte-shims.d.ts @@ -222,6 +222,7 @@ declare function __sveltets_2_createCreateSlot): Svelte2TsxComponent; declare function __sveltets_2_any(...dummy: any[]): any; +declare function __sveltets_2_empty(...dummy: any[]): {}; declare function __sveltets_2_cssProp(prop: Record): {}; diff --git a/packages/svelte2tsx/test/htmlx2jsx/samples/attribute-data/expected.jsx b/packages/svelte2tsx/test/htmlx2jsx/samples/attribute-data/expected.jsx new file mode 100644 index 000000000..3eec850de --- /dev/null +++ b/packages/svelte2tsx/test/htmlx2jsx/samples/attribute-data/expected.jsx @@ -0,0 +1 @@ +<>
\ No newline at end of file diff --git a/packages/svelte2tsx/test/htmlx2jsx/samples/attribute-data/expectedv2.js b/packages/svelte2tsx/test/htmlx2jsx/samples/attribute-data/expectedv2.js new file mode 100644 index 000000000..4586f3773 --- /dev/null +++ b/packages/svelte2tsx/test/htmlx2jsx/samples/attribute-data/expectedv2.js @@ -0,0 +1 @@ + { svelteHTML.createElement("div", { ...__sveltets_2_empty({"data-foo":true}),...__sveltets_2_empty({"data-bare":true}),...__sveltets_2_empty({"data-bar":"to"}),});} \ No newline at end of file diff --git a/packages/svelte2tsx/test/htmlx2jsx/samples/attribute-data/input.svelte b/packages/svelte2tsx/test/htmlx2jsx/samples/attribute-data/input.svelte new file mode 100644 index 000000000..618a3c4a5 --- /dev/null +++ b/packages/svelte2tsx/test/htmlx2jsx/samples/attribute-data/input.svelte @@ -0,0 +1 @@ +