diff --git a/tests/__snapshots__/fixtures.test.ts.snap b/tests/__snapshots__/fixtures.test.ts.snap index 7012a26..d544c70 100644 --- a/tests/__snapshots__/fixtures.test.ts.snap +++ b/tests/__snapshots__/fixtures.test.ts.snap @@ -1,37 +1,32 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html +// Bun Snapshot v1, https://goo.gl/fbAQLP -exports[`fixtures (JSON) > 'anchor-props/input.svelte' 1`] = ` +exports[`fixtures (JSON) "svg-props/input.svelte" 1`] = ` "{ "props": [], "moduleExports": [], - "slots": [ - { - "name": "__default__", - "default": true, - "slot_props": "{}" - } - ], + "slots": [], "events": [], "typedefs": [], "rest_props": { "type": "Element", - "name": "a" + "name": "svg" } }" `; -exports[`fixtures (JSON) > 'bind-this/input.svelte' 1`] = ` +exports[`fixtures (JSON) "slots-named/input.svelte" 1`] = ` "{ "props": [ { - "name": "ref", + "name": "text", "kind": "let", - "type": "null | HTMLButtonElement", + "type": "string", + "value": "\"\"", "isFunction": false, "isFunctionDeclaration": false, - "isRequired": true, + "isRequired": false, "constant": false, - "reactive": true + "reactive": false } ], "moduleExports": [], @@ -39,7 +34,26 @@ exports[`fixtures (JSON) > 'bind-this/input.svelte' 1`] = ` { "name": "__default__", "default": true, + "fallback": "Default text", "slot_props": "{}" + }, + { + "name": "bold heading", + "default": false, + "fallback": "{text}", + "slot_props": "{ text: string }" + }, + { + "name": "subheading", + "default": false, + "fallback": "{text}", + "slot_props": "{ text: string }" + }, + { + "name": "text", + "default": false, + "fallback": "{text}", + "slot_props": "{ text: string }" } ], "events": [], @@ -47,55 +61,79 @@ exports[`fixtures (JSON) > 'bind-this/input.svelte' 1`] = ` }" `; -exports[`fixtures (JSON) > 'bind-this-multiple/input.svelte' 1`] = ` +exports[`fixtures (JSON) "dispatched-events-dynamic/input.svelte" 1`] = ` +"{ + "props": [], + "moduleExports": [], + "slots": [], + "events": [ + { + "type": "dispatched", + "name": "KEY", + "detail": "{key: string;}" + } + ], + "typedefs": [] +}" +`; + +exports[`fixtures (JSON) "function-declaration/input.svelte" 1`] = ` "{ "props": [ { - "name": "ref", + "name": "fnA", "kind": "let", - "type": "null | HTMLButtonElement | HTMLHeadingElement", - "isFunction": false, + "type": "() => {}", + "value": "() => {}", + "isFunction": true, "isFunctionDeclaration": false, - "isRequired": true, + "isRequired": false, "constant": false, - "reactive": true + "reactive": false }, { - "name": "ref2", - "kind": "let", - "type": "null | HTMLDivElement", - "isFunction": false, + "name": "fnB", + "kind": "const", + "type": "() => {}", + "value": "() => {}", + "isFunction": true, "isFunctionDeclaration": false, - "isRequired": true, + "isRequired": false, + "constant": true, + "reactive": false + }, + { + "name": "add", + "kind": "function", + "type": "() => any", + "value": "() => { return a + b; }", + "isFunction": true, + "isFunctionDeclaration": true, + "isRequired": false, "constant": false, - "reactive": true + "reactive": false }, { - "name": "propBool", - "kind": "let", - "type": "boolean", - "value": "false", - "isFunction": false, - "isFunctionDeclaration": false, + "name": "multiply", + "kind": "function", + "description": "Multiplies two numbers", + "type": "(a: number, b: number) => number", + "value": "() => { return a * b; }", + "isFunction": true, + "isFunctionDeclaration": true, "isRequired": false, "constant": false, "reactive": false } ], "moduleExports": [], - "slots": [ - { - "name": "__default__", - "default": true, - "slot_props": "{}" - } - ], + "slots": [], "events": [], "typedefs": [] }" `; -exports[`fixtures (JSON) > 'component-comment-multi/input.svelte' 1`] = ` +exports[`fixtures (JSON) "forwarded-events/input.svelte" 1`] = ` "{ "props": [], "moduleExports": [], @@ -106,141 +144,199 @@ exports[`fixtures (JSON) > 'component-comment-multi/input.svelte' 1`] = ` "slot_props": "{}" } ], - "events": [], - "typedefs": [], - "componentComment": "\\n@example\\n
\\n Component comment\\n
" + "events": [ + { + "type": "forwarded", + "name": "click", + "element": "button" + }, + { + "type": "forwarded", + "name": "focus", + "element": "button" + }, + { + "type": "forwarded", + "name": "blur", + "element": "button" + }, + { + "type": "forwarded", + "name": "mouseover", + "element": "h1" + } + ], + "typedefs": [] }" `; -exports[`fixtures (JSON) > 'component-comment-single/input.svelte' 1`] = ` +exports[`fixtures (JSON) "mixed-events/input.svelte" 1`] = ` "{ "props": [], "moduleExports": [], - "slots": [ + "slots": [], + "events": [ { - "name": "__default__", - "default": true, - "slot_props": "{}" + "type": "dispatched", + "name": "custom-focus", + "detail": "FocusEvent | number" + }, + { + "type": "dispatched", + "name": "blur", + "detail": "FocusEvent | CustomEvent" } ], - "events": [], - "typedefs": [], - "componentComment": " Component comment" + "typedefs": [] }" `; -exports[`fixtures (JSON) > 'context-module/input.svelte' 1`] = ` +exports[`fixtures (JSON) "infer-basic/input.svelte" 1`] = ` "{ "props": [ { - "name": "a", - "kind": "const", - "type": "string", - "value": "\\"\\"", + "name": "ref", + "kind": "let", + "value": "null", "isFunction": false, "isFunctionDeclaration": false, "isRequired": false, - "constant": true, + "constant": false, "reactive": false - } - ], - "moduleExports": [ + }, { - "name": "bool", - "kind": "const", - "type": "string", - "value": "\\"\\"", + "name": "propBool", + "kind": "let", + "type": "boolean", + "value": "true", "isFunction": false, "isFunctionDeclaration": false, "isRequired": false, - "constant": true, - "reactive": false + "constant": false, + "reactive": true }, { - "name": "a", - "kind": "const", - "type": "{ b: 4 }", - "value": "{ b: 4 }", + "name": "propString", + "kind": "let", + "type": "string", + "value": "\"\"", "isFunction": false, "isFunctionDeclaration": false, "isRequired": false, - "constant": true, + "constant": false, "reactive": false }, { - "name": "e", - "kind": "const", - "description": "Description for e", - "type": "{ [key: string]: any; }", - "value": "{ b: 4 }", + "name": "name", + "kind": "let", "isFunction": false, "isFunctionDeclaration": false, - "isRequired": false, - "constant": true, - "reactive": false - }, - { - "name": "log", - "kind": "function", - "description": "Log something", - "type": "(message: string) => void", - "value": "() => { console.log(message); }", - "isFunction": true, - "isFunctionDeclaration": true, - "isRequired": false, + "isRequired": true, "constant": false, "reactive": false }, { - "name": "b", - "kind": "const", - "type": "() => {}", - "value": "() => {}", - "isFunction": true, + "name": "id", + "kind": "let", + "type": "string", + "value": "\"\" + Math.random().toString(36)", + "isFunction": false, "isFunctionDeclaration": false, "isRequired": false, - "constant": true, + "constant": false, "reactive": false }, { - "name": "b2", + "name": "propConst", "kind": "const", - "type": "() => () => {}", - "value": "() => () => {}", - "isFunction": true, + "type": "{ [\"1\"]: true }", + "value": "{ [\"1\"]: true }", + "isFunction": false, "isFunctionDeclaration": false, "isRequired": false, "constant": true, "reactive": false }, { - "name": "b3", - "kind": "const", - "type": "() => () => false", - "value": "() => () => false", + "name": "fn", + "kind": "function", + "type": "() => any", + "value": "() => { localBool = !localBool; }", "isFunction": true, - "isFunctionDeclaration": false, + "isFunctionDeclaration": true, "isRequired": false, - "constant": true, + "constant": false, "reactive": false } ], - "slots": [], + "moduleExports": [], + "slots": [ + { + "name": "__default__", + "default": true, + "fallback": "{name}", + "slot_props": "{}" + } + ], "events": [], "typedefs": [] }" `; -exports[`fixtures (JSON) > 'dispatched-events/input.svelte' 1`] = ` +exports[`fixtures (JSON) "empty-export/input.svelte" 1`] = ` "{ "props": [], "moduleExports": [], - "slots": [ + "slots": [], + "events": [], + "typedefs": [] +}" +`; + +exports[`fixtures (JSON) "typed-slots/input.svelte" 1`] = ` +"{ + "props": [ { - "name": "__default__", - "default": true, - "slot_props": "{}" - } + "name": "prop", + "kind": "let", + "type": "number", + "value": "0", + "isFunction": false, + "isFunctionDeclaration": false, + "isRequired": false, + "constant": false, + "reactive": false + } + ], + "moduleExports": [], + "slots": [ + { + "name": "__default__", + "default": true, + "slot_props": "{ prop: number; doubled: number; }" + }, + { + "name": "description", + "default": false, + "slot_props": "{ props: { class?: string; } }", + "description": "description" + } + ], + "events": [], + "typedefs": [] +}" +`; + +exports[`fixtures (JSON) "dispatched-events/input.svelte" 1`] = ` +"{ + "props": [], + "moduleExports": [], + "slots": [ + { + "name": "__default__", + "default": true, + "slot_props": "{}" + } ], "events": [ { @@ -267,23 +363,84 @@ exports[`fixtures (JSON) > 'dispatched-events/input.svelte' 1`] = ` }" `; -exports[`fixtures (JSON) > 'dispatched-events-dynamic/input.svelte' 1`] = ` +exports[`fixtures (JSON) "typedefs/input.svelte" 1`] = ` "{ - "props": [], + "props": [ + { + "name": "prop1", + "kind": "let", + "type": "MyTypedef", + "value": "{ [\"1\"]: true }", + "isFunction": false, + "isFunctionDeclaration": false, + "isRequired": false, + "constant": false, + "reactive": false + }, + { + "name": "prop2", + "kind": "let", + "type": "MyTypedefArray", + "value": "[]", + "isFunction": false, + "isFunctionDeclaration": false, + "isRequired": false, + "constant": false, + "reactive": false + } + ], "moduleExports": [], - "slots": [], - "events": [ + "slots": [ { - "type": "dispatched", - "name": "KEY", - "detail": "{key: string;}" + "name": "__default__", + "default": true, + "slot_props": "{ prop1: MyTypedef, prop2: MyTypedefArray }" + } + ], + "events": [], + "typedefs": [ + { + "type": "{ [key: string]: boolean; }", + "name": "MyTypedef", + "ts": "interface MyTypedef { [key: string]: boolean; }" + }, + { + "type": "MyTypedef[]", + "name": "MyTypedefArray", + "ts": "type MyTypedefArray = MyTypedef[]" + } + ] +}" +`; + +exports[`fixtures (JSON) "bind-this/input.svelte" 1`] = ` +"{ + "props": [ + { + "name": "ref", + "kind": "let", + "type": "null | HTMLButtonElement", + "isFunction": false, + "isFunctionDeclaration": false, + "isRequired": true, + "constant": false, + "reactive": true + } + ], + "moduleExports": [], + "slots": [ + { + "name": "__default__", + "default": true, + "slot_props": "{}" } ], + "events": [], "typedefs": [] }" `; -exports[`fixtures (JSON) > 'dispatched-events-typed/input.svelte' 1`] = ` +exports[`fixtures (JSON) "dispatched-events-typed/input.svelte" 1`] = ` "{ "props": [], "moduleExports": [], @@ -311,116 +468,101 @@ exports[`fixtures (JSON) > 'dispatched-events-typed/input.svelte' 1`] = ` }" `; -exports[`fixtures (JSON) > 'empty-export/input.svelte' 1`] = ` +exports[`fixtures (JSON) "input-events/input.svelte" 1`] = ` "{ "props": [], "moduleExports": [], "slots": [], - "events": [], - "typedefs": [] -}" -`; - -exports[`fixtures (JSON) > 'forwarded-events/input.svelte' 1`] = ` -"{ - "props": [], - "moduleExports": [], - "slots": [ - { - "name": "__default__", - "default": true, - "slot_props": "{}" - } - ], "events": [ { "type": "forwarded", - "name": "click", - "element": "button" - }, - { - "type": "forwarded", - "name": "focus", - "element": "button" + "name": "input", + "element": "input" }, { "type": "forwarded", - "name": "blur", - "element": "button" + "name": "change", + "element": "input" }, { "type": "forwarded", - "name": "mouseover", - "element": "h1" + "name": "paste", + "element": "input" } ], "typedefs": [] }" `; -exports[`fixtures (JSON) > 'function-declaration/input.svelte' 1`] = ` +exports[`fixtures (JSON) "required/input.svelte" 1`] = ` "{ "props": [ { - "name": "fnA", + "name": "prop", "kind": "let", - "type": "() => {}", - "value": "() => {}", - "isFunction": true, + "description": "@required ", + "type": "boolean", + "value": "true", + "isFunction": false, "isFunctionDeclaration": false, "isRequired": false, "constant": false, "reactive": false }, { - "name": "fnB", - "kind": "const", - "type": "() => {}", - "value": "() => {}", - "isFunction": true, + "name": "prop1", + "kind": "let", + "description": "This is a comment.\n@required ", + "type": "boolean | string", + "value": "true", + "isFunction": false, "isFunctionDeclaration": false, "isRequired": false, - "constant": true, + "constant": false, "reactive": false }, { - "name": "add", - "kind": "function", - "type": "() => any", - "value": "() => { return a + b; }", - "isFunction": true, - "isFunctionDeclaration": true, - "isRequired": false, + "name": "prop2", + "kind": "let", + "isFunction": false, + "isFunctionDeclaration": false, + "isRequired": true, "constant": false, "reactive": false }, { - "name": "multiply", - "kind": "function", - "description": "Multiplies two numbers", - "type": "(a: number, b: number) => number", - "value": "() => { return a * b; }", - "isFunction": true, - "isFunctionDeclaration": true, - "isRequired": false, + "name": "prop3", + "kind": "let", + "type": "boolean", + "isFunction": false, + "isFunctionDeclaration": false, + "isRequired": true, "constant": false, "reactive": false } ], "moduleExports": [], - "slots": [], + "slots": [ + { + "name": "__default__", + "default": true, + "slot_props": "{ prop: boolean, prop1: boolean | string, prop2: any, prop3: boolean }" + } + ], "events": [], "typedefs": [] }" `; -exports[`fixtures (JSON) > 'infer-basic/input.svelte' 1`] = ` +exports[`fixtures (JSON) "prop-comments/input.svelte" 1`] = ` "{ "props": [ { - "name": "ref", + "name": "prop", "kind": "let", - "value": "null", + "description": "This is a comment.\n@see https://github.com/\n@deprecated this prop will be removed in the next major release.", + "type": "boolean | string", + "value": "true", "isFunction": false, "isFunctionDeclaration": false, "isRequired": false, @@ -428,66 +570,26 @@ exports[`fixtures (JSON) > 'infer-basic/input.svelte' 1`] = ` "reactive": false }, { - "name": "propBool", + "name": "prop1", "kind": "let", + "description": "@see https://github.com/", "type": "boolean", "value": "true", "isFunction": false, "isFunctionDeclaration": false, "isRequired": false, "constant": false, - "reactive": true - }, - { - "name": "propString", - "kind": "let", - "type": "string", - "value": "\\"\\"", - "isFunction": false, - "isFunctionDeclaration": false, - "isRequired": false, - "constant": false, - "reactive": false - }, - { - "name": "name", - "kind": "let", - "isFunction": false, - "isFunctionDeclaration": false, - "isRequired": true, - "constant": false, "reactive": false }, { - "name": "id", + "name": "prop2", "kind": "let", - "type": "string", - "value": "\\"\\" + Math.random().toString(36)", - "isFunction": false, - "isFunctionDeclaration": false, - "isRequired": false, - "constant": false, - "reactive": false - }, - { - "name": "propConst", - "kind": "const", - "type": "{ [\\"1\\"]: true }", - "value": "{ [\\"1\\"]: true }", + "description": "This is a comment.", + "type": "boolean | string", + "value": "true", "isFunction": false, "isFunctionDeclaration": false, "isRequired": false, - "constant": true, - "reactive": false - }, - { - "name": "fn", - "kind": "function", - "type": "() => any", - "value": "() => { localBool = !localBool; }", - "isFunction": true, - "isFunctionDeclaration": true, - "isRequired": false, "constant": false, "reactive": false } @@ -497,8 +599,7 @@ exports[`fixtures (JSON) > 'infer-basic/input.svelte' 1`] = ` { "name": "__default__", "default": true, - "fallback": "{name}", - "slot_props": "{}" + "slot_props": "{ prop: boolean | string, prop1: boolean, prop2: boolean | string }" } ], "events": [], @@ -506,13 +607,36 @@ exports[`fixtures (JSON) > 'infer-basic/input.svelte' 1`] = ` }" `; -exports[`fixtures (JSON) > 'infer-with-types/input.svelte' 1`] = ` +exports[`fixtures (JSON) "renamed-props/input.svelte" 1`] = ` "{ "props": [ { - "name": "propBool", + "name": "class", "kind": "let", - "type": "boolean", + "description": "Just your average CSS class string.", + "type": "string|null", + "value": "\"test\"", + "isFunction": false, + "isFunctionDeclaration": false, + "isRequired": false, + "constant": false, + "reactive": false + } + ], + "moduleExports": [], + "slots": [], + "events": [], + "typedefs": [] +}" +`; + +exports[`fixtures (JSON) "infer-with-types/input.svelte" 1`] = ` +"{ + "props": [ + { + "name": "propBool", + "kind": "let", + "type": "boolean", "value": "true", "isFunction": false, "isFunctionDeclaration": false, @@ -524,7 +648,7 @@ exports[`fixtures (JSON) > 'infer-with-types/input.svelte' 1`] = ` "name": "propString", "kind": "let", "type": "string", - "value": "\\"\\"", + "value": "\"\"", "isFunction": false, "isFunctionDeclaration": false, "isRequired": false, @@ -545,7 +669,7 @@ exports[`fixtures (JSON) > 'infer-with-types/input.svelte' 1`] = ` "name": "id", "kind": "let", "type": "string", - "value": "\\"\\" + Math.random().toString(36)", + "value": "\"\" + Math.random().toString(36)", "isFunction": false, "isFunctionDeclaration": false, "isRequired": false, @@ -556,7 +680,7 @@ exports[`fixtures (JSON) > 'infer-with-types/input.svelte' 1`] = ` "name": "propConst", "kind": "const", "type": "{ [key: string]: boolean; }", - "value": "{ [\\"1\\"]: true }", + "value": "{ [\"1\"]: true }", "isFunction": false, "isFunctionDeclaration": false, "isRequired": false, @@ -589,190 +713,109 @@ exports[`fixtures (JSON) > 'infer-with-types/input.svelte' 1`] = ` }" `; -exports[`fixtures (JSON) > 'input-events/input.svelte' 1`] = ` -"{ - "props": [], - "moduleExports": [], - "slots": [], - "events": [ - { - "type": "forwarded", - "name": "input", - "element": "input" - }, - { - "type": "forwarded", - "name": "change", - "element": "input" - }, - { - "type": "forwarded", - "name": "paste", - "element": "input" - } - ], - "typedefs": [] -}" -`; - -exports[`fixtures (JSON) > 'mixed-events/input.svelte' 1`] = ` -"{ - "props": [], - "moduleExports": [], - "slots": [], - "events": [ - { - "type": "dispatched", - "name": "custom-focus", - "detail": "FocusEvent | number" - }, - { - "type": "dispatched", - "name": "blur", - "detail": "FocusEvent | CustomEvent" - } - ], - "typedefs": [] -}" -`; - -exports[`fixtures (JSON) > 'prop-comments/input.svelte' 1`] = ` +exports[`fixtures (JSON) "context-module/input.svelte" 1`] = ` "{ "props": [ { - "name": "prop", - "kind": "let", - "description": "This is a comment.\\n@see https://github.com/\\n@deprecated this prop will be removed in the next major release.", - "type": "boolean | string", - "value": "true", + "name": "a", + "kind": "const", + "type": "string", + "value": "\"\"", "isFunction": false, "isFunctionDeclaration": false, "isRequired": false, - "constant": false, + "constant": true, "reactive": false - }, + } + ], + "moduleExports": [ { - "name": "prop1", - "kind": "let", - "description": "@see https://github.com/", - "type": "boolean", - "value": "true", + "name": "bool", + "kind": "const", + "type": "string", + "value": "\"\"", "isFunction": false, "isFunctionDeclaration": false, "isRequired": false, - "constant": false, + "constant": true, "reactive": false }, { - "name": "prop2", - "kind": "let", - "description": "This is a comment.", - "type": "boolean | string", - "value": "true", + "name": "a", + "kind": "const", + "type": "{ b: 4 }", + "value": "{ b: 4 }", "isFunction": false, "isFunctionDeclaration": false, "isRequired": false, - "constant": false, + "constant": true, "reactive": false - } - ], - "moduleExports": [], - "slots": [ - { - "name": "__default__", - "default": true, - "slot_props": "{ prop: boolean | string, prop1: boolean, prop2: boolean | string }" - } - ], - "events": [], - "typedefs": [] -}" -`; - -exports[`fixtures (JSON) > 'renamed-props/input.svelte' 1`] = ` -"{ - "props": [ + }, { - "name": "class", - "kind": "let", - "description": "Just your average CSS class string.", - "type": "string|null", - "value": "\\"test\\"", + "name": "e", + "kind": "const", + "description": "Description for e", + "type": "{ [key: string]: any; }", + "value": "{ b: 4 }", "isFunction": false, "isFunctionDeclaration": false, "isRequired": false, - "constant": false, + "constant": true, "reactive": false - } - ], - "moduleExports": [], - "slots": [], - "events": [], - "typedefs": [] -}" -`; - -exports[`fixtures (JSON) > 'required/input.svelte' 1`] = ` -"{ - "props": [ + }, { - "name": "prop", - "kind": "let", - "description": "@required ", - "type": "boolean", - "value": "true", - "isFunction": false, - "isFunctionDeclaration": false, + "name": "log", + "kind": "function", + "description": "Log something", + "type": "(message: string) => void", + "value": "() => { console.log(message); }", + "isFunction": true, + "isFunctionDeclaration": true, "isRequired": false, "constant": false, "reactive": false }, { - "name": "prop1", - "kind": "let", - "description": "This is a comment.\\n@required ", - "type": "boolean | string", - "value": "true", - "isFunction": false, + "name": "b", + "kind": "const", + "type": "() => {}", + "value": "() => {}", + "isFunction": true, "isFunctionDeclaration": false, "isRequired": false, - "constant": false, + "constant": true, "reactive": false }, { - "name": "prop2", - "kind": "let", - "isFunction": false, + "name": "b2", + "kind": "const", + "type": "() => () => {}", + "value": "() => () => {}", + "isFunction": true, "isFunctionDeclaration": false, - "isRequired": true, - "constant": false, + "isRequired": false, + "constant": true, "reactive": false }, { - "name": "prop3", - "kind": "let", - "type": "boolean", - "isFunction": false, + "name": "b3", + "kind": "const", + "type": "() => () => false", + "value": "() => () => false", + "isFunction": true, "isFunctionDeclaration": false, - "isRequired": true, - "constant": false, + "isRequired": false, + "constant": true, "reactive": false } ], - "moduleExports": [], - "slots": [ - { - "name": "__default__", - "default": true, - "slot_props": "{ prop: boolean, prop1: boolean | string, prop2: any, prop3: boolean }" - } - ], + "slots": [], "events": [], "typedefs": [] }" `; -exports[`fixtures (JSON) > 'rest-props/input.svelte' 1`] = ` +exports[`fixtures (JSON) "rest-props/input.svelte" 1`] = ` "{ "props": [], "moduleExports": [], @@ -786,7 +829,7 @@ exports[`fixtures (JSON) > 'rest-props/input.svelte' 1`] = ` }" `; -exports[`fixtures (JSON) > 'rest-props-multiple/input.svelte' 1`] = ` +exports[`fixtures (JSON) "rest-props-multiple/input.svelte" 1`] = ` "{ "props": [ { @@ -823,14 +866,51 @@ exports[`fixtures (JSON) > 'rest-props-multiple/input.svelte' 1`] = ` }" `; -exports[`fixtures (JSON) > 'slots-named/input.svelte' 1`] = ` +exports[`fixtures (JSON) "component-comment-single/input.svelte" 1`] = ` +"{ + "props": [], + "moduleExports": [], + "slots": [ + { + "name": "__default__", + "default": true, + "slot_props": "{}" + } + ], + "events": [], + "typedefs": [], + "componentComment": " Component comment" +}" +`; + +exports[`fixtures (JSON) "bind-this-multiple/input.svelte" 1`] = ` "{ "props": [ { - "name": "text", + "name": "ref", "kind": "let", - "type": "string", - "value": "\\"\\"", + "type": "null | HTMLButtonElement | HTMLHeadingElement", + "isFunction": false, + "isFunctionDeclaration": false, + "isRequired": true, + "constant": false, + "reactive": true + }, + { + "name": "ref2", + "kind": "let", + "type": "null | HTMLDivElement", + "isFunction": false, + "isFunctionDeclaration": false, + "isRequired": true, + "constant": false, + "reactive": true + }, + { + "name": "propBool", + "kind": "let", + "type": "boolean", + "value": "false", "isFunction": false, "isFunctionDeclaration": false, "isRequired": false, @@ -843,34 +923,60 @@ exports[`fixtures (JSON) > 'slots-named/input.svelte' 1`] = ` { "name": "__default__", "default": true, - "fallback": "Default text", "slot_props": "{}" - }, + } + ], + "events": [], + "typedefs": [] +}" +`; + +exports[`fixtures (JSON) "typedef/input.svelte" 1`] = ` +"{ + "props": [ { - "name": "bold heading", - "default": false, - "fallback": "{text}", - "slot_props": "{ text: string }" + "name": "id", + "kind": "let", + "type": "string", + "value": "\"id-\" + Math.random().toString(36)", + "isFunction": false, + "isFunctionDeclaration": false, + "isRequired": false, + "constant": false, + "reactive": false }, { - "name": "subheading", - "default": false, - "fallback": "{text}", - "slot_props": "{ text: string }" - }, + "name": "prop1", + "kind": "let", + "type": "MyTypedef", + "value": "{ [\"1\"]: true }", + "isFunction": false, + "isFunctionDeclaration": false, + "isRequired": false, + "constant": false, + "reactive": false + } + ], + "moduleExports": [], + "slots": [ { - "name": "text", - "default": false, - "fallback": "{text}", - "slot_props": "{ text: string }" + "name": "__default__", + "default": true, + "slot_props": "{ prop1: MyTypedef }" } ], "events": [], - "typedefs": [] + "typedefs": [ + { + "type": "{ [key: string]: boolean; }", + "name": "MyTypedef", + "ts": "interface MyTypedef { [key: string]: boolean; }" + } + ] }" `; -exports[`fixtures (JSON) > 'slots-spread/input.svelte' 1`] = ` +exports[`fixtures (JSON) "anchor-props/input.svelte" 1`] = ` "{ "props": [], "moduleExports": [], @@ -878,21 +984,19 @@ exports[`fixtures (JSON) > 'slots-spread/input.svelte' 1`] = ` { "name": "__default__", "default": true, - "fallback": "Default text", - "slot_props": "{}" - }, - { - "name": "text", - "default": false, "slot_props": "{}" } ], "events": [], - "typedefs": [] + "typedefs": [], + "rest_props": { + "type": "Element", + "name": "a" + } }" `; -exports[`fixtures (JSON) > 'slots-spread-typed/input.svelte' 1`] = ` +exports[`fixtures (JSON) "component-comment-multi/input.svelte" 1`] = ` "{ "props": [], "moduleExports": [], @@ -900,116 +1004,52 @@ exports[`fixtures (JSON) > 'slots-spread-typed/input.svelte' 1`] = ` { "name": "__default__", "default": true, - "fallback": "Default text", - "slot_props": "{ a: number; }" - }, - { - "name": "text", - "default": false, - "slot_props": "{ a: number; }" + "slot_props": "{}" } ], "events": [], - "typedefs": [] + "typedefs": [], + "componentComment": "\n@example\n
\n Component comment\n
" }" `; -exports[`fixtures (JSON) > 'svg-props/input.svelte' 1`] = ` +exports[`fixtures (JSON) "slots-spread/input.svelte" 1`] = ` "{ "props": [], "moduleExports": [], - "slots": [], - "events": [], - "typedefs": [], - "rest_props": { - "type": "Element", - "name": "svg" - } -}" -`; - -exports[`fixtures (JSON) > 'typed-props/input.svelte' 1`] = ` -"{ - "props": [ - { - "name": "prop1", - "kind": "let", - "description": "prop1 description 1\\nprop1 description 2", - "type": "string", - "isFunction": false, - "isFunctionDeclaration": false, - "isRequired": true, - "constant": false, - "reactive": false - }, - { - "name": "prop2", - "kind": "let", - "description": "prop2 description 1\\nprop2 description 2", - "value": "null", - "isFunction": false, - "isFunctionDeclaration": false, - "isRequired": false, - "constant": false, - "reactive": false - }, + "slots": [ { - "name": "prop3", - "kind": "let", - "type": "4 | '4'", - "value": "4", - "isFunction": false, - "isFunctionDeclaration": false, - "isRequired": false, - "constant": false, - "reactive": false + "name": "__default__", + "default": true, + "fallback": "Default text", + "slot_props": "{}" }, { - "name": "prop4", - "kind": "let", - "type": "\\"red\\" | \\"blue\\"", - "value": "\\"red\\"", - "isFunction": false, - "isFunctionDeclaration": false, - "isRequired": false, - "constant": false, - "reactive": false + "name": "text", + "default": false, + "slot_props": "{}" } ], - "moduleExports": [], - "slots": [], "events": [], "typedefs": [] }" `; -exports[`fixtures (JSON) > 'typed-slots/input.svelte' 1`] = ` +exports[`fixtures (JSON) "slots-spread-typed/input.svelte" 1`] = ` "{ - "props": [ - { - "name": "prop", - "kind": "let", - "type": "number", - "value": "0", - "isFunction": false, - "isFunctionDeclaration": false, - "isRequired": false, - "constant": false, - "reactive": false - } - ], + "props": [], "moduleExports": [], "slots": [ { "name": "__default__", "default": true, - "slot_props": "{ prop: number; doubled: number; }" + "fallback": "Default text", + "slot_props": "{ a: number; }" }, { - "name": "description", + "name": "text", "default": false, - "slot_props": "{ props: { class?: string; } }", - "description": "description" + "slot_props": "{ a: number; }" } ], "events": [], @@ -1017,59 +1057,36 @@ exports[`fixtures (JSON) > 'typed-slots/input.svelte' 1`] = ` }" `; -exports[`fixtures (JSON) > 'typedef/input.svelte' 1`] = ` +exports[`fixtures (JSON) "typed-props/input.svelte" 1`] = ` "{ "props": [ { - "name": "id", + "name": "prop1", "kind": "let", + "description": "prop1 description 1\nprop1 description 2", "type": "string", - "value": "\\"id-\\" + Math.random().toString(36)", "isFunction": false, "isFunctionDeclaration": false, - "isRequired": false, + "isRequired": true, "constant": false, "reactive": false }, { - "name": "prop1", + "name": "prop2", "kind": "let", - "type": "MyTypedef", - "value": "{ [\\"1\\"]: true }", + "description": "prop2 description 1\nprop2 description 2", + "value": "null", "isFunction": false, "isFunctionDeclaration": false, "isRequired": false, "constant": false, "reactive": false - } - ], - "moduleExports": [], - "slots": [ - { - "name": "__default__", - "default": true, - "slot_props": "{ prop1: MyTypedef }" - } - ], - "events": [], - "typedefs": [ - { - "type": "{ [key: string]: boolean; }", - "name": "MyTypedef", - "ts": "interface MyTypedef { [key: string]: boolean; }" - } - ] -}" -`; - -exports[`fixtures (JSON) > 'typedefs/input.svelte' 1`] = ` -"{ - "props": [ + }, { - "name": "prop1", + "name": "prop3", "kind": "let", - "type": "MyTypedef", - "value": "{ [\\"1\\"]: true }", + "type": "4 | '4'", + "value": "4", "isFunction": false, "isFunctionDeclaration": false, "isRequired": false, @@ -1077,180 +1094,57 @@ exports[`fixtures (JSON) > 'typedefs/input.svelte' 1`] = ` "reactive": false }, { - "name": "prop2", + "name": "prop4", "kind": "let", - "type": "MyTypedefArray", - "value": "[]", + "type": "\"red\" | \"blue\"", + "value": "\"red\"", "isFunction": false, "isFunctionDeclaration": false, - "isRequired": false, - "constant": false, - "reactive": false - } - ], - "moduleExports": [], - "slots": [ - { - "name": "__default__", - "default": true, - "slot_props": "{ prop1: MyTypedef, prop2: MyTypedefArray }" - } - ], - "events": [], - "typedefs": [ - { - "type": "{ [key: string]: boolean; }", - "name": "MyTypedef", - "ts": "interface MyTypedef { [key: string]: boolean; }" - }, - { - "type": "MyTypedef[]", - "name": "MyTypedefArray", - "ts": "type MyTypedefArray = MyTypedef[]" - } - ] -}" -`; - -exports[`fixtures (TypeScript) > 'anchor-props/input.svelte' 1`] = ` -"import type { SvelteComponentTyped } from "svelte"; -import type { SvelteHTMLElements } from "svelte/elements"; - -type RestProps = SvelteHTMLElements["a"]; - -export interface AnchorPropsProps extends RestProps { - [key: \`data-\${string}\`]: any; -} - -export default class AnchorProps extends SvelteComponentTyped, { default: {} }> {} -" -`; - -exports[`fixtures (TypeScript) > 'bind-this/input.svelte' 1`] = ` -"import type { SvelteComponentTyped } from "svelte"; - -export interface BindThisProps { - /** - * @default undefined - */ - ref: null | HTMLButtonElement; -} - -export default class BindThis extends SvelteComponentTyped, { default: {} }> {} -" -`; - -exports[`fixtures (TypeScript) > 'bind-this-multiple/input.svelte' 1`] = ` -"import type { SvelteComponentTyped } from "svelte"; - -export interface BindThisMultipleProps { - /** - * @default undefined - */ - ref: null | HTMLButtonElement | HTMLHeadingElement; - - /** - * @default undefined - */ - ref2: null | HTMLDivElement; - - /** - * @default false - */ - propBool?: boolean; -} - -export default class BindThisMultiple extends SvelteComponentTyped< - BindThisMultipleProps, - Record, - { default: {} } -> {} -" + "isRequired": false, + "constant": false, + "reactive": false + } + ], + "moduleExports": [], + "slots": [], + "events": [], + "typedefs": [] +}" `; -exports[`fixtures (TypeScript) > 'component-comment-multi/input.svelte' 1`] = ` +exports[`fixtures (TypeScript) "svg-props/input.svelte" 1`] = ` "import type { SvelteComponentTyped } from "svelte"; +import type { SvelteHTMLElements } from "svelte/elements"; -export interface ComponentCommentMultiProps {} - -/** - * @example - *
- * Component comment - *
- */ -export default class ComponentCommentMulti extends SvelteComponentTyped< - ComponentCommentMultiProps, - Record, - { default: {} } -> {} -" -`; - -exports[`fixtures (TypeScript) > 'component-comment-single/input.svelte' 1`] = ` -"import type { SvelteComponentTyped } from "svelte"; +type RestProps = SvelteHTMLElements["svg"]; -export interface ComponentCommentSingleProps {} +export interface SvgPropsProps extends RestProps { + [key: \`data-${string}\`]: any; +} -/** Component comment */ -export default class ComponentCommentSingle extends SvelteComponentTyped< - ComponentCommentSingleProps, - Record, - { default: {} } -> {} +export default class SvgProps extends SvelteComponentTyped, {}> {} " `; -exports[`fixtures (TypeScript) > 'context-module/input.svelte' 1`] = ` +exports[`fixtures (TypeScript) "slots-named/input.svelte" 1`] = ` "import type { SvelteComponentTyped } from "svelte"; -export type bool = string; - -export type a = { b: 4 }; - -/** - * Description for e - */ -export type e = { [key: string]: any }; - -/** - * Log something - */ -export declare function log(message: string): void; - -export declare function b(): {}; - -export declare function b2(): () => {}; - -export declare function b3(): () => false; - -export interface ContextModuleProps {} - -export default class ContextModule extends SvelteComponentTyped, {}> { - a: string; +export interface SlotsNamedProps { + /** + * @default "" + */ + text?: string; } -" -`; - -exports[`fixtures (TypeScript) > 'dispatched-events/input.svelte' 1`] = ` -"import type { SvelteComponentTyped } from "svelte"; -export interface DispatchedEventsProps {} - -export default class DispatchedEvents extends SvelteComponentTyped< - DispatchedEventsProps, - { - hover: CustomEvent; - destroy: CustomEvent; - ["destroy--component"]: CustomEvent; - ["destroy:component"]: CustomEvent; - }, - { default: {} } +export default class SlotsNamed extends SvelteComponentTyped< + SlotsNamedProps, + Record, + { default: {}; ["bold heading"]: { text: string }; subheading: { text: string }; text: { text: string } } > {} " `; -exports[`fixtures (TypeScript) > 'dispatched-events-dynamic/input.svelte' 1`] = ` +exports[`fixtures (TypeScript) "dispatched-events-dynamic/input.svelte" 1`] = ` "import type { SvelteComponentTyped } from "svelte"; export interface DispatchedEventsDynamicProps {} @@ -1263,32 +1157,34 @@ export default class DispatchedEventsDynamic extends SvelteComponentTyped< " `; -exports[`fixtures (TypeScript) > 'dispatched-events-typed/input.svelte' 1`] = ` +exports[`fixtures (TypeScript) "function-declaration/input.svelte" 1`] = ` "import type { SvelteComponentTyped } from "svelte"; -export interface DispatchedEventsTypedProps {} - -export default class DispatchedEventsTyped extends SvelteComponentTyped< - DispatchedEventsTypedProps, - { - /** Fired on mouseover. */ hover: CustomEvent<{ h1: boolean }>; - destroy: CustomEvent; - }, - { default: {} } -> {} -" -`; +export interface FunctionDeclarationProps { + /** + * @default () => {} + */ + fnA?: () => {}; +} -exports[`fixtures (TypeScript) > 'empty-export/input.svelte' 1`] = ` -"import type { SvelteComponentTyped } from "svelte"; +export default class FunctionDeclaration extends SvelteComponentTyped< + FunctionDeclarationProps, + Record, + {} +> { + fnB: () => {}; -export interface EmptyExportProps {} + add: () => any; -export default class EmptyExport extends SvelteComponentTyped, {}> {} + /** + * Multiplies two numbers + */ + multiply: (a: number, b: number) => number; +} " `; -exports[`fixtures (TypeScript) > 'forwarded-events/input.svelte' 1`] = ` +exports[`fixtures (TypeScript) "forwarded-events/input.svelte" 1`] = ` "import type { SvelteComponentTyped } from "svelte"; export interface ForwardedEventsProps {} @@ -1306,34 +1202,20 @@ export default class ForwardedEvents extends SvelteComponentTyped< " `; -exports[`fixtures (TypeScript) > 'function-declaration/input.svelte' 1`] = ` +exports[`fixtures (TypeScript) "mixed-events/input.svelte" 1`] = ` "import type { SvelteComponentTyped } from "svelte"; -export interface FunctionDeclarationProps { - /** - * @default () => {} - */ - fnA?: () => {}; -} +export interface MixedEventsProps {} -export default class FunctionDeclaration extends SvelteComponentTyped< - FunctionDeclarationProps, - Record, +export default class MixedEvents extends SvelteComponentTyped< + MixedEventsProps, + { ["custom-focus"]: CustomEvent; blur: FocusEvent | CustomEvent }, {} -> { - fnB: () => {}; - - add: () => any; - - /** - * Multiplies two numbers - */ - multiply: (a: number, b: number) => number; -} +> {} " `; -exports[`fixtures (TypeScript) > 'infer-basic/input.svelte' 1`] = ` +exports[`fixtures (TypeScript) "infer-basic/input.svelte" 1`] = ` "import type { SvelteComponentTyped } from "svelte"; export interface InferBasicProps { @@ -1371,44 +1253,115 @@ export default class InferBasic extends SvelteComponentTyped 'infer-with-types/input.svelte' 1`] = ` +exports[`fixtures (TypeScript) "empty-export/input.svelte" 1`] = ` "import type { SvelteComponentTyped } from "svelte"; -export interface InferWithTypesProps { - /** - * @default true - */ - propBool?: boolean; +export interface EmptyExportProps {} + +export default class EmptyExport extends SvelteComponentTyped, {}> {} +" +`; + +exports[`fixtures (TypeScript) "typed-slots/input.svelte" 1`] = ` +"import type { SvelteComponentTyped } from "svelte"; +export interface TypedSlotsProps { /** - * @default "" + * @default 0 */ - propString?: string; + prop?: number; +} + +export default class TypedSlots extends SvelteComponentTyped< + TypedSlotsProps, + Record, + { + default: { prop: number; doubled: number }; + /** description */ + description: { props: { class?: string } }; + } +> {} +" +`; + +exports[`fixtures (TypeScript) "dispatched-events/input.svelte" 1`] = ` +"import type { SvelteComponentTyped } from "svelte"; + +export interface DispatchedEventsProps {} + +export default class DispatchedEvents extends SvelteComponentTyped< + DispatchedEventsProps, + { + hover: CustomEvent; + destroy: CustomEvent; + ["destroy--component"]: CustomEvent; + ["destroy:component"]: CustomEvent; + }, + { default: {} } +> {} +" +`; + +exports[`fixtures (TypeScript) "typedefs/input.svelte" 1`] = ` +"import type { SvelteComponentTyped } from "svelte"; + +export interface MyTypedef { + [key: string]: boolean; +} + +export type MyTypedefArray = MyTypedef[]; +export interface TypedefsProps { /** - * @default undefined + * @default { ["1"]: true } */ - name: string; + prop1?: MyTypedef; /** - * @default "" + Math.random().toString(36) + * @default [] */ - id?: string; + prop2?: MyTypedefArray; } -export default class InferWithTypes extends SvelteComponentTyped< - InferWithTypesProps, +export default class Typedefs extends SvelteComponentTyped< + TypedefsProps, Record, - { default: {} } -> { - propConst: { [key: string]: boolean }; + { default: { prop1: MyTypedef; prop2: MyTypedefArray } } +> {} +" +`; - fn: () => any; +exports[`fixtures (TypeScript) "bind-this/input.svelte" 1`] = ` +"import type { SvelteComponentTyped } from "svelte"; + +export interface BindThisProps { + /** + * @default undefined + */ + ref: null | HTMLButtonElement; } + +export default class BindThis extends SvelteComponentTyped, { default: {} }> {} +" +`; + +exports[`fixtures (TypeScript) "dispatched-events-typed/input.svelte" 1`] = ` +"import type { SvelteComponentTyped } from "svelte"; + +export interface DispatchedEventsTypedProps {} + +export default class DispatchedEventsTyped extends SvelteComponentTyped< + DispatchedEventsTypedProps, + { + /** Fired on mouseover. */ hover: CustomEvent<{ h1: boolean }>; + destroy: CustomEvent; + }, + { default: {} } +> {} " `; -exports[`fixtures (TypeScript) > 'input-events/input.svelte' 1`] = ` +exports[`fixtures (TypeScript) "input-events/input.svelte" 1`] = ` "import type { SvelteComponentTyped } from "svelte"; export interface InputEventsProps {} @@ -1425,20 +1378,43 @@ export default class InputEvents extends SvelteComponentTyped< " `; -exports[`fixtures (TypeScript) > 'mixed-events/input.svelte' 1`] = ` -"import type { SvelteComponentTyped } from "svelte"; +exports[`fixtures (TypeScript) "required/input.svelte" 1`] = ` +"import type { SvelteComponentTyped } from "svelte"; + +export interface RequiredProps { + /** + * @required + * @default true + */ + prop?: boolean; + + /** + * This is a comment. + * @required + * @default true + */ + prop1?: boolean | string; + + /** + * @default undefined + */ + prop2: undefined; -export interface MixedEventsProps {} + /** + * @default undefined + */ + prop3: boolean; +} -export default class MixedEvents extends SvelteComponentTyped< - MixedEventsProps, - { ["custom-focus"]: CustomEvent; blur: FocusEvent | CustomEvent }, - {} +export default class Required extends SvelteComponentTyped< + RequiredProps, + Record, + { default: { prop: boolean; prop1: boolean | string; prop2: any; prop3: boolean } } > {} " `; -exports[`fixtures (TypeScript) > 'prop-comments/input.svelte' 1`] = ` +exports[`fixtures (TypeScript) "prop-comments/input.svelte" 1`] = ` "import type { SvelteComponentTyped } from "svelte"; export interface PropCommentsProps { @@ -1471,7 +1447,7 @@ export default class PropComments extends SvelteComponentTyped< " `; -exports[`fixtures (TypeScript) > 'renamed-props/input.svelte' 1`] = ` +exports[`fixtures (TypeScript) "renamed-props/input.svelte" 1`] = ` "import type { SvelteComponentTyped } from "svelte"; export interface RenamedPropsProps { @@ -1486,57 +1462,89 @@ export default class RenamedProps extends SvelteComponentTyped 'required/input.svelte' 1`] = ` +exports[`fixtures (TypeScript) "infer-with-types/input.svelte" 1`] = ` "import type { SvelteComponentTyped } from "svelte"; -export interface RequiredProps { +export interface InferWithTypesProps { /** - * @required * @default true */ - prop?: boolean; + propBool?: boolean; /** - * This is a comment. - * @required - * @default true + * @default "" */ - prop1?: boolean | string; + propString?: string; /** * @default undefined */ - prop2: undefined; + name: string; /** - * @default undefined + * @default "" + Math.random().toString(36) */ - prop3: boolean; + id?: string; } -export default class Required extends SvelteComponentTyped< - RequiredProps, +export default class InferWithTypes extends SvelteComponentTyped< + InferWithTypesProps, Record, - { default: { prop: boolean; prop1: boolean | string; prop2: any; prop3: boolean } } -> {} + { default: {} } +> { + propConst: { [key: string]: boolean }; + + fn: () => any; +} +" +`; + +exports[`fixtures (TypeScript) "context-module/input.svelte" 1`] = ` +"import type { SvelteComponentTyped } from "svelte"; + +export type bool = string; + +export type a = { b: 4 }; + +/** + * Description for e + */ +export type e = { [key: string]: any }; + +/** + * Log something + */ +export declare function log(message: string): void; + +export declare function b(): {}; + +export declare function b2(): () => {}; + +export declare function b3(): () => false; + +export interface ContextModuleProps {} + +export default class ContextModule extends SvelteComponentTyped, {}> { + a: string; +} " `; -exports[`fixtures (TypeScript) > 'rest-props/input.svelte' 1`] = ` +exports[`fixtures (TypeScript) "rest-props/input.svelte" 1`] = ` "import type { SvelteComponentTyped } from "svelte"; import type { SvelteHTMLElements } from "svelte/elements"; type RestProps = SvelteHTMLElements["h1"]; export interface RestPropsProps extends RestProps { - [key: \`data-\${string}\`]: any; + [key: \`data-${string}\`]: any; } export default class RestProps extends SvelteComponentTyped, {}> {} " `; -exports[`fixtures (TypeScript) > 'rest-props-multiple/input.svelte' 1`] = ` +exports[`fixtures (TypeScript) "rest-props-multiple/input.svelte" 1`] = ` "import type { SvelteComponentTyped } from "svelte"; import type { SvelteHTMLElements } from "svelte/elements"; @@ -1553,178 +1561,170 @@ export interface RestPropsMultipleProps extends RestProps { */ heading?: boolean; - [key: \`data-\${string}\`]: any; + [key: \`data-${string}\`]: any; } export default class RestPropsMultiple extends SvelteComponentTyped, {}> {} " `; -exports[`fixtures (TypeScript) > 'slots-named/input.svelte' 1`] = ` +exports[`fixtures (TypeScript) "component-comment-single/input.svelte" 1`] = ` "import type { SvelteComponentTyped } from "svelte"; -export interface SlotsNamedProps { - /** - * @default "" - */ - text?: string; -} +export interface ComponentCommentSingleProps {} -export default class SlotsNamed extends SvelteComponentTyped< - SlotsNamedProps, +/** Component comment */ +export default class ComponentCommentSingle extends SvelteComponentTyped< + ComponentCommentSingleProps, Record, - { default: {}; ["bold heading"]: { text: string }; subheading: { text: string }; text: { text: string } } + { default: {} } > {} " `; -exports[`fixtures (TypeScript) > 'slots-spread/input.svelte' 1`] = ` +exports[`fixtures (TypeScript) "bind-this-multiple/input.svelte" 1`] = ` "import type { SvelteComponentTyped } from "svelte"; -export interface SlotsSpreadProps {} +export interface BindThisMultipleProps { + /** + * @default undefined + */ + ref: null | HTMLButtonElement | HTMLHeadingElement; -export default class SlotsSpread extends SvelteComponentTyped< - SlotsSpreadProps, + /** + * @default undefined + */ + ref2: null | HTMLDivElement; + + /** + * @default false + */ + propBool?: boolean; +} + +export default class BindThisMultiple extends SvelteComponentTyped< + BindThisMultipleProps, Record, - { default: {}; text: {} } + { default: {} } > {} " `; -exports[`fixtures (TypeScript) > 'slots-spread-typed/input.svelte' 1`] = ` +exports[`fixtures (TypeScript) "typedef/input.svelte" 1`] = ` "import type { SvelteComponentTyped } from "svelte"; -export interface SlotsSpreadTypedProps {} +export interface MyTypedef { + [key: string]: boolean; +} -export default class SlotsSpreadTyped extends SvelteComponentTyped< - SlotsSpreadTypedProps, +export interface TypedefProps { + /** + * @default "id-" + Math.random().toString(36) + */ + id?: string; + + /** + * @default { ["1"]: true } + */ + prop1?: MyTypedef; +} + +export default class Typedef extends SvelteComponentTyped< + TypedefProps, Record, - { default: { a: number }; text: { a: number } } + { default: { prop1: MyTypedef } } > {} " `; -exports[`fixtures (TypeScript) > 'svg-props/input.svelte' 1`] = ` +exports[`fixtures (TypeScript) "anchor-props/input.svelte" 1`] = ` "import type { SvelteComponentTyped } from "svelte"; import type { SvelteHTMLElements } from "svelte/elements"; -type RestProps = SvelteHTMLElements["svg"]; +type RestProps = SvelteHTMLElements["a"]; -export interface SvgPropsProps extends RestProps { - [key: \`data-\${string}\`]: any; +export interface AnchorPropsProps extends RestProps { + [key: \`data-${string}\`]: any; } -export default class SvgProps extends SvelteComponentTyped, {}> {} +export default class AnchorProps extends SvelteComponentTyped, { default: {} }> {} " `; -exports[`fixtures (TypeScript) > 'typed-props/input.svelte' 1`] = ` +exports[`fixtures (TypeScript) "component-comment-multi/input.svelte" 1`] = ` "import type { SvelteComponentTyped } from "svelte"; -export interface TypedPropsProps { - /** - * prop1 description 1 - * prop1 description 2 - * @default undefined - */ - prop1: string; - - /** - * prop2 description 1 - * prop2 description 2 - * @default null - */ - prop2?: undefined; - - /** - * @default 4 - */ - prop3?: 4 | "4"; - - /** - * @default "red" - */ - prop4?: "red" | "blue"; -} +export interface ComponentCommentMultiProps {} -export default class TypedProps extends SvelteComponentTyped, {}> {} +/** + * @example + *
+ * Component comment + *
+ */ +export default class ComponentCommentMulti extends SvelteComponentTyped< + ComponentCommentMultiProps, + Record, + { default: {} } +> {} " `; -exports[`fixtures (TypeScript) > 'typed-slots/input.svelte' 1`] = ` +exports[`fixtures (TypeScript) "slots-spread/input.svelte" 1`] = ` "import type { SvelteComponentTyped } from "svelte"; -export interface TypedSlotsProps { - /** - * @default 0 - */ - prop?: number; -} +export interface SlotsSpreadProps {} -export default class TypedSlots extends SvelteComponentTyped< - TypedSlotsProps, +export default class SlotsSpread extends SvelteComponentTyped< + SlotsSpreadProps, Record, - { - default: { prop: number; doubled: number }; - /** description */ - description: { props: { class?: string } }; - } + { default: {}; text: {} } > {} " `; -exports[`fixtures (TypeScript) > 'typedef/input.svelte' 1`] = ` +exports[`fixtures (TypeScript) "slots-spread-typed/input.svelte" 1`] = ` "import type { SvelteComponentTyped } from "svelte"; -export interface MyTypedef { - [key: string]: boolean; -} - -export interface TypedefProps { - /** - * @default "id-" + Math.random().toString(36) - */ - id?: string; - - /** - * @default { ["1"]: true } - */ - prop1?: MyTypedef; -} +export interface SlotsSpreadTypedProps {} -export default class Typedef extends SvelteComponentTyped< - TypedefProps, +export default class SlotsSpreadTyped extends SvelteComponentTyped< + SlotsSpreadTypedProps, Record, - { default: { prop1: MyTypedef } } + { default: { a: number }; text: { a: number } } > {} " `; -exports[`fixtures (TypeScript) > 'typedefs/input.svelte' 1`] = ` +exports[`fixtures (TypeScript) "typed-props/input.svelte" 1`] = ` "import type { SvelteComponentTyped } from "svelte"; -export interface MyTypedef { - [key: string]: boolean; -} +export interface TypedPropsProps { + /** + * prop1 description 1 + * prop1 description 2 + * @default undefined + */ + prop1: string; -export type MyTypedefArray = MyTypedef[]; + /** + * prop2 description 1 + * prop2 description 2 + * @default null + */ + prop2?: undefined; -export interface TypedefsProps { /** - * @default { ["1"]: true } + * @default 4 */ - prop1?: MyTypedef; + prop3?: 4 | "4"; /** - * @default [] + * @default "red" */ - prop2?: MyTypedefArray; + prop4?: "red" | "blue"; } -export default class Typedefs extends SvelteComponentTyped< - TypedefsProps, - Record, - { default: { prop1: MyTypedef; prop2: MyTypedefArray } } -> {} +export default class TypedProps extends SvelteComponentTyped, {}> {} " `; diff --git a/tests/fixtures.test.ts b/tests/fixtures.test.ts index 54534aa..899e6f5 100644 --- a/tests/fixtures.test.ts +++ b/tests/fixtures.test.ts @@ -1,21 +1,16 @@ -import fg from "fast-glob"; -import fsp from "node:fs/promises"; +import { Glob } from "bun"; import path from "node:path"; import ComponentParser from "../src/ComponentParser"; import Writer from "../src/writer/Writer"; import { writeTsDefinition } from "../src/writer/writer-ts-definitions"; const folder = path.join(process.cwd(), "tests", "fixtures"); +const fixtures_map = new Map(); -const svelteFiles = fg.sync(["**/*.svelte"], { cwd: folder }); -const fixtures = await Promise.all( - svelteFiles.map(async (file) => { - return { - path: file, - source: await fsp.readFile(path.join(folder, file), "utf-8"), - }; - }) -); +for await (const file of new Glob("**/*.svelte").scan(folder)) { + const source = await Bun.file(path.join(folder, file)).text(); + fixtures_map.set(file, source); +} const createMetadata = (filePath: string) => { const { dir } = path.parse(filePath); @@ -29,31 +24,32 @@ const createMetadata = (filePath: string) => { const parser = new ComponentParser(); const writer = new Writer({ parser: "typescript", printWidth: 120 }); +const files = Array.from(fixtures_map.keys()); describe("fixtures (JSON)", async () => { - test.each(fixtures)("$path", async (fixture) => { - const { dir, ...metadata } = createMetadata(fixture.path); - const parsed_component = parser.parseSvelteComponent(fixture.source, metadata); + test.each(files)("%p", async (file) => { + const { dir, ...metadata } = createMetadata(file); + const parsed_component = parser.parseSvelteComponent(fixtures_map.get(file)!, metadata); const api_json = JSON.stringify(parsed_component, null, 2); // Snapshot the output; if the test fails, output has changed. expect(api_json).toMatchSnapshot(); // Still write to disk to manually assert types as needed. - await fsp.writeFile(path.join(folder, dir, "output.json"), api_json); + await Bun.write(path.join(folder, dir, "output.json"), api_json); }); }); describe("fixtures (TypeScript)", async () => { - test.each(fixtures)("$path", async (fixture) => { - const { dir, ...metadata } = createMetadata(fixture.path); - const parsed_component = parser.parseSvelteComponent(fixture.source, metadata); + test.each(files)("%p", async (file) => { + const { dir, ...metadata } = createMetadata(file); + const parsed_component = parser.parseSvelteComponent(fixtures_map.get(file)!, metadata); const api_ts = writer.format(writeTsDefinition({ ...metadata, ...parsed_component })); // Snapshot the output; if the test fails, output has changed. expect(api_ts).toMatchSnapshot(); // Still write to disk to manually assert types as needed. - await fsp.writeFile(path.join(folder, dir, "output.d.ts"), api_ts); + await Bun.write(path.join(folder, dir, "output.d.ts"), api_ts); }); });