diff --git a/apps/svelte.dev/content/docs/kit/30-advanced/25-errors.md b/apps/svelte.dev/content/docs/kit/30-advanced/25-errors.md index e2472b0f90..231ff5b619 100644 --- a/apps/svelte.dev/content/docs/kit/30-advanced/25-errors.md +++ b/apps/svelte.dev/content/docs/kit/30-advanced/25-errors.md @@ -58,8 +58,7 @@ This throws an exception that SvelteKit catches, causing it to set the response You can add extra properties to the error object if needed... ```js -import { error } from '@sveltejs/kit'; - +// @filename: ambient.d.ts declare global { namespace App { interface Error { @@ -68,7 +67,10 @@ declare global { } } } +export {} +// @filename: index.js +import { error } from '@sveltejs/kit'; // ---cut--- error(404, { message: 'Not found', diff --git a/apps/svelte.dev/content/docs/svelte/02-runes/02-$state.md b/apps/svelte.dev/content/docs/svelte/02-runes/02-$state.md index 5cccb2456f..509efb007b 100644 --- a/apps/svelte.dev/content/docs/svelte/02-runes/02-$state.md +++ b/apps/svelte.dev/content/docs/svelte/02-runes/02-$state.md @@ -45,12 +45,7 @@ todos[0].done = !todos[0].done; If you push a new object to the array, it will also be proxified: ```js -// @filename: ambient.d.ts -declare global { - const todos: Array<{ done: boolean, text: string }> -} - -// @filename: index.js +let todos = [{ done: false, text: 'add more todos' }]; // ---cut--- todos.push({ done: false, diff --git a/packages/site-kit/src/lib/markdown/renderer.ts b/packages/site-kit/src/lib/markdown/renderer.ts index 74117ca5ef..3dde3c71a7 100644 --- a/packages/site-kit/src/lib/markdown/renderer.ts +++ b/packages/site-kit/src/lib/markdown/renderer.ts @@ -498,6 +498,31 @@ async function convert_to_ts(js_code: string, indent = '', offset = '') { if (code.original[end - 1] === ';') end -= 1; code.appendLeft(end, ` satisfies ${satisfies}`); } + } else if ( + (ts.isPropertyAssignment(node) && ts.isArrowFunction(node.initializer)) || + ts.isMethodDeclaration(node) + ) { + if (type) { + throw new Error('@type on property methods does nothing'); + } + + const parameters = ts.isMethodDeclaration(node) + ? node.parameters + : (node.initializer as ts.ArrowFunction).parameters; + for (let i = 0; i < parameters.length; i += 1) { + if (params[i] !== undefined) { + code.appendLeft(parameters[i].getEnd(), `: ${params[i]}`); + } + } + + if (returns) { + const body = ts.isMethodDeclaration(node) + ? node.body + : (node.initializer as ts.ArrowFunction).body; + let start = body!.getStart(); + while (code.original[start - 1] !== ')') start -= 1; + code.appendLeft(start, `: ${returns}`); + } } else { throw new Error('Unhandled @type JsDoc->TS conversion: ' + js_code); } @@ -699,16 +724,20 @@ async function syntax_highlight({ try { html = await codeToHtml(prelude + redacted, { - lang: 'ts', + lang: language, theme, transformers: check ? [ transformerTwoslash({ twoslashOptions: { compilerOptions: { + allowJs: true, + checkJs: true, types: ['svelte', '@sveltejs/kit'] } - } + }, + // by default, twoslash does not run on .js files, change that through this option + filter: () => true }) ] : []