From 3c6c63a7c0de9daf7a481a4e5a687b66c6fd4e36 Mon Sep 17 00:00:00 2001 From: Manuel Serret Date: Sun, 18 May 2025 10:59:36 +0200 Subject: [PATCH 1/3] utils --- package.json | 2 +- packages/core/package.json | 4 +- packages/core/tooling/html/index.ts | 10 ++- packages/core/tooling/index.ts | 13 ++- packages/core/tooling/parsers.ts | 134 ++-------------------------- pnpm-lock.yaml | 91 +++++++++++-------- 6 files changed, 84 insertions(+), 170 deletions(-) diff --git a/package.json b/package.json index 391cd4f3..059e4299 100644 --- a/package.json +++ b/package.json @@ -46,4 +46,4 @@ "esbuild" ] } -} +} \ No newline at end of file diff --git a/packages/core/package.json b/packages/core/package.json index 41232984..d4a0bab3 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -57,7 +57,9 @@ "picocolors": "^1.1.1", "postcss": "^8.4.49", "silver-fleece": "^1.2.1", - "zimmerframe": "^1.1.2" + "zimmerframe": "^1.1.2", + "svelte": "^5.30.2", + "svelte-ast-print": "^1.0.1" }, "keywords": [ "create", diff --git a/packages/core/tooling/html/index.ts b/packages/core/tooling/html/index.ts index 94dcd881..7339f840 100644 --- a/packages/core/tooling/html/index.ts +++ b/packages/core/tooling/html/index.ts @@ -1,3 +1,4 @@ +import type { AST as SvelteAst } from 'svelte/compiler'; import { type AstTypes, type HtmlChildNode, @@ -7,9 +8,10 @@ import { parseHtml } from '../index.ts'; import { addFromString } from '../js/common.ts'; +import { parseSvelte } from '../parsers.ts'; export { HtmlElement, HtmlElementType }; -export type { HtmlDocument }; +export type { HtmlDocument, SvelteAst }; export function div(attributes: Record = {}): HtmlElement { return element('div', attributes); @@ -53,3 +55,9 @@ export function addSlot( addFromString(jsAst, 'let { children } = $props();'); addFromRawHtml(htmlAst.childNodes, '{@render children()}'); } + +export function toSvelteFragment(content: string): SvelteAst.Fragment['nodes'] { + // TODO write test + const { ast } = parseSvelte(content); + return ast.fragment.nodes; +} diff --git a/packages/core/tooling/index.ts b/packages/core/tooling/index.ts index 27e41cbe..fe5be511 100644 --- a/packages/core/tooling/index.ts +++ b/packages/core/tooling/index.ts @@ -16,6 +16,8 @@ import * as fleece from 'silver-fleece'; import { print as esrapPrint } from 'esrap'; import * as acorn from 'acorn'; import { tsPlugin } from '@sveltejs/acorn-typescript'; +import { parse as svelteParse, type AST as SvelteAst } from 'svelte/compiler'; +import { print as sveltePrint } from 'svelte-ast-print'; export { // html @@ -37,11 +39,12 @@ export { export type { // html ChildNode as HtmlChildNode, + SvelteAst, // js TsEstree as AstTypes, - //css + // css CssChildNode }; @@ -240,3 +243,11 @@ export function guessQuoteStyle(ast: TsEstree.Node): 'single' | 'double' | undef return singleCount > doubleCount ? 'single' : 'double'; } + +export function parseSvelte(content: string): SvelteAst.Root { + return svelteParse(content, { modern: true }); +} + +export function serializeSvelte(ast: SvelteAst.Root): string { + return sveltePrint(ast).code; +} diff --git a/packages/core/tooling/parsers.ts b/packages/core/tooling/parsers.ts index f7764d34..ceee301c 100644 --- a/packages/core/tooling/parsers.ts +++ b/packages/core/tooling/parsers.ts @@ -1,5 +1,4 @@ import * as utils from './index.ts'; -import MagicString from 'magic-string'; type ParseBase = { source: string; @@ -35,136 +34,13 @@ export function parseJson(source: string): { data: any } & ParseBase { return { data, source, generateCode }; } -type SvelteGenerator = (code: { - script?: string; - module?: string; - css?: string; - template?: string; -}) => string; -export function parseSvelte( - source: string, - options?: { typescript?: boolean } -): { - script: ReturnType; - module: ReturnType; - css: ReturnType; - template: ReturnType; - generateCode: SvelteGenerator; -} { - // `xTag` captures the whole tag block (ex: ) - // `xSource` is the contents within the tags - const scripts = extractScripts(source); - // instance block - const { tag: scriptTag = '', src: scriptSource = '' } = - scripts.find(({ attrs }) => !attrs.includes('module')) ?? {}; - // module block - const { tag: moduleScriptTag = '', src: moduleSource = '' } = - scripts.find(({ attrs }) => attrs.includes('module')) ?? {}; - // style block - const { styleTag, cssSource } = extractStyle(source); - // rest of the template - // TODO: needs more testing - const templateSource = source - .replace(moduleScriptTag, '') - .replace(scriptTag, '') - .replace(styleTag, '') - .trim(); - - const script = parseScript(scriptSource); - const module = parseScript(moduleSource); - const css = parseCss(cssSource); - const template = parseHtml(templateSource); - - const generateCode: SvelteGenerator = (code) => { - const ms = new MagicString(source); - // TODO: this is imperfect and needs adjustments - if (code.script !== undefined) { - if (scriptSource.length === 0) { - const ts = options?.typescript ? ' lang="ts"' : ''; - const indented = code.script.split('\n').join('\n\t'); - const script = `\n\t${indented}\n\n\n`; - ms.prepend(script); - } else { - const { start, end } = locations(source, scriptSource); - const formatted = indent(code.script, ms.getIndentString()); - ms.update(start, end, formatted); - } - } - if (code.module !== undefined) { - if (moduleSource.length === 0) { - const ts = options?.typescript ? ' lang="ts"' : ''; - const indented = code.module.split('\n').join('\n\t'); - // TODO: make a svelte 5 variant - const module = `\n\t${indented}\n\n\n`; - ms.prepend(module); - } else { - const { start, end } = locations(source, moduleSource); - const formatted = indent(code.module, ms.getIndentString()); - ms.update(start, end, formatted); - } - } - if (code.css !== undefined) { - if (cssSource.length === 0) { - const indented = code.css.split('\n').join('\n\t'); - const style = `\n\n`; - ms.append(style); - } else { - const { start, end } = locations(source, cssSource); - const formatted = indent(code.css, ms.getIndentString()); - ms.update(start, end, formatted); - } - } - if (code.template !== undefined) { - if (templateSource.length === 0) { - ms.appendLeft(0, code.template); - } else { - const { start, end } = locations(source, templateSource); - ms.update(start, end, code.template); - } - } - return ms.toString(); - }; +export function parseSvelte(source: string): { ast: utils.SvelteAst.Root } & ParseBase { + const ast = utils.parseSvelte(source); + const generateCode = () => utils.serializeSvelte(ast); return { - script: { ...script, source: scriptSource }, - module: { ...module, source: moduleSource }, - css: { ...css, source: cssSource }, - template: { ...template, source: templateSource }, + ast, + source, generateCode }; } - -function locations(source: string, search: string): { start: number; end: number } { - const start = source.indexOf(search); - const end = start + search.length; - return { start, end }; -} - -function indent(content: string, indent: string): string { - const indented = indent + content.split('\n').join(`\n${indent}`); - return `\n${indented}\n`; -} - -// sourced from Svelte: https://github.com/sveltejs/svelte/blob/0d3d5a2a85c0f9eccb2c8dbbecc0532ec918b157/packages/svelte/src/compiler/preprocess/index.js#L253-L256 -const regexScriptTags = - /|'"/\s]+=(?:"[^"]*"|'[^']*'|[^>\s]+)|\s+[^=>'"/\s]+)*\s*)(?:\/>|>([\S\s]*?)<\/script>)/; -const regexStyleTags = - /|'"/\s]+=(?:"[^"]*"|'[^']*'|[^>\s]+)|\s+[^=>'"/\s]+)*\s*)(?:\/>|>([\S\s]*?)<\/style>)/; - -type Script = { tag: string; attrs: string; src: string }; -function extractScripts(source: string): Script[] { - const scripts = []; - const [tag = '', attrs = '', src = ''] = regexScriptTags.exec(source) ?? []; - if (tag) { - const stripped = source.replace(tag, ''); - scripts.push({ tag, attrs, src }, ...extractScripts(stripped)); - return scripts; - } - - return []; -} - -function extractStyle(source: string) { - const [styleTag = '', attributes = '', cssSource = ''] = regexStyleTags.exec(source) ?? []; - return { styleTag, attributes, cssSource }; -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7ad25f51..aec48be0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,7 +19,7 @@ importers: version: link:packages/create '@sveltejs/eslint-config': specifier: ^8.2.0 - version: 8.2.0(@stylistic/eslint-plugin-js@2.10.1(eslint@9.24.0))(eslint-config-prettier@9.1.0(eslint@9.24.0))(eslint-plugin-n@17.13.1(eslint@9.24.0))(eslint-plugin-svelte@3.5.1(eslint@9.24.0)(svelte@5.25.7))(eslint@9.24.0)(typescript-eslint@8.29.0(eslint@9.24.0)(typescript@5.8.3))(typescript@5.8.3) + version: 8.2.0(@stylistic/eslint-plugin-js@2.10.1(eslint@9.24.0))(eslint-config-prettier@9.1.0(eslint@9.24.0))(eslint-plugin-n@17.13.1(eslint@9.24.0))(eslint-plugin-svelte@3.5.1(eslint@9.24.0)(svelte@5.30.2))(eslint@9.24.0)(typescript-eslint@8.29.0(eslint@9.24.0)(typescript@5.8.3))(typescript@5.8.3) '@svitejs/changesets-changelog-github-compact': specifier: ^1.2.0 version: 1.2.0 @@ -34,7 +34,7 @@ importers: version: 9.24.0 eslint-plugin-svelte: specifier: ^3.5.1 - version: 3.5.1(eslint@9.24.0)(svelte@5.25.7) + version: 3.5.1(eslint@9.24.0)(svelte@5.30.2) magic-string: specifier: ^0.30.17 version: 0.30.17 @@ -46,7 +46,7 @@ importers: version: 2.5.10(prettier@3.5.3) prettier-plugin-svelte: specifier: ^3.3.3 - version: 3.3.3(prettier@3.5.3)(svelte@5.25.7) + version: 3.3.3(prettier@3.5.3)(svelte@5.30.2) rolldown: specifier: 1.0.0-beta.1 version: 1.0.0-beta.1(@babel/runtime@7.27.0) @@ -55,7 +55,7 @@ importers: version: link:packages/cli svelte: specifier: ^5.25.7 - version: 5.25.7 + version: 5.30.2 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -216,6 +216,12 @@ importers: silver-fleece: specifier: ^1.2.1 version: 1.2.1 + svelte: + specifier: ^5.30.2 + version: 5.30.2 + svelte-ast-print: + specifier: ^1.0.1 + version: 1.0.1(svelte@5.30.2) zimmerframe: specifier: ^1.1.2 version: 1.1.2 @@ -254,7 +260,7 @@ importers: version: 1.1.1 semver: specifier: ^7.7.1 - version: 7.7.1 + version: 7.7.2 tiny-glob: specifier: ^0.2.9 version: 0.2.9 @@ -514,8 +520,8 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.5.1': - resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -1956,8 +1962,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} hasBin: true @@ -2055,6 +2061,12 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + svelte-ast-print@1.0.1: + resolution: {integrity: sha512-RJiwV6E9I2pmz4RtLt6yVtIZc15sAqxsZ8Ai8lfDC2b+Kze69rJNLQ9OJr8NU1dUThZx56FY0TyfiqAuIAZoqA==} + engines: {node: '>=20'} + peerDependencies: + svelte: ^5.20.0 + svelte-eslint-parser@1.1.2: resolution: {integrity: sha512-vqFBRamDKo1l70KMfxxXj1/0Cco5TfMDnqaAjgz6D8PyoMhfMcDOLRkAwPg8WkMyZjMtQL3wW66TZ0x59iqO2w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2068,8 +2080,8 @@ packages: resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==} engines: {node: '>=16'} - svelte@5.25.7: - resolution: {integrity: sha512-0fzXbXaKfSvFUs6Wxev2h4CoEhexZotbTF9EJ4+Cg7MHW64ZnZ9+xUedZyEpgj0Tt9HrYGv9aASHkqjn9b/cPw==} + svelte@5.30.2: + resolution: {integrity: sha512-zfGFEwwPeILToOxOqQyFq/vc8euXrX2XyoffkBNgn/k8D1nxbLt5+mNaqQBmZF/vVhBGmkY6VmNK18p9Gf0auQ==} engines: {node: '>=18'} synckit@0.9.2: @@ -2363,7 +2375,7 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.7.1 + semver: 7.7.2 '@changesets/assemble-release-plan@6.0.6': dependencies: @@ -2372,7 +2384,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - semver: 7.7.1 + semver: 7.7.2 '@changesets/changelog-git@0.2.1': dependencies: @@ -2405,7 +2417,7 @@ snapshots: package-manager-detector: 0.2.11 picocolors: 1.1.1 resolve-from: 5.0.0 - semver: 7.7.1 + semver: 7.7.2 spawndamnit: 3.0.1 term-size: 2.2.1 @@ -2428,7 +2440,7 @@ snapshots: '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 picocolors: 1.1.1 - semver: 7.7.1 + semver: 7.7.2 '@changesets/get-github-info@0.6.0': dependencies: @@ -2600,7 +2612,7 @@ snapshots: '@esbuild/win32-x64@0.25.2': optional: true - '@eslint-community/eslint-utils@4.5.1(eslint@9.24.0)': + '@eslint-community/eslint-utils@4.7.0(eslint@9.24.0)': dependencies: eslint: 9.24.0 eslint-visitor-keys: 3.4.3 @@ -2875,13 +2887,13 @@ snapshots: dependencies: acorn: 8.14.1 - '@sveltejs/eslint-config@8.2.0(@stylistic/eslint-plugin-js@2.10.1(eslint@9.24.0))(eslint-config-prettier@9.1.0(eslint@9.24.0))(eslint-plugin-n@17.13.1(eslint@9.24.0))(eslint-plugin-svelte@3.5.1(eslint@9.24.0)(svelte@5.25.7))(eslint@9.24.0)(typescript-eslint@8.29.0(eslint@9.24.0)(typescript@5.8.3))(typescript@5.8.3)': + '@sveltejs/eslint-config@8.2.0(@stylistic/eslint-plugin-js@2.10.1(eslint@9.24.0))(eslint-config-prettier@9.1.0(eslint@9.24.0))(eslint-plugin-n@17.13.1(eslint@9.24.0))(eslint-plugin-svelte@3.5.1(eslint@9.24.0)(svelte@5.30.2))(eslint@9.24.0)(typescript-eslint@8.29.0(eslint@9.24.0)(typescript@5.8.3))(typescript@5.8.3)': dependencies: '@stylistic/eslint-plugin-js': 2.10.1(eslint@9.24.0) eslint: 9.24.0 eslint-config-prettier: 9.1.0(eslint@9.24.0) eslint-plugin-n: 17.13.1(eslint@9.24.0) - eslint-plugin-svelte: 3.5.1(eslint@9.24.0)(svelte@5.25.7) + eslint-plugin-svelte: 3.5.1(eslint@9.24.0)(svelte@5.30.2) globals: 15.15.0 typescript: 5.8.3 typescript-eslint: 8.29.0(eslint@9.24.0)(typescript@5.8.3) @@ -2995,7 +3007,7 @@ snapshots: fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.2 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -3003,7 +3015,7 @@ snapshots: '@typescript-eslint/utils@8.29.0(eslint@9.24.0)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.24.0) '@typescript-eslint/scope-manager': 8.29.0 '@typescript-eslint/types': 8.29.0 '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.8.3) @@ -3326,7 +3338,7 @@ snapshots: eslint-compat-utils@0.5.1(eslint@9.24.0): dependencies: eslint: 9.24.0 - semver: 7.7.1 + semver: 7.7.2 eslint-config-prettier@9.1.0(eslint@9.24.0): dependencies: @@ -3334,14 +3346,14 @@ snapshots: eslint-plugin-es-x@7.8.0(eslint@9.24.0): dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.24.0) '@eslint-community/regexpp': 4.12.1 eslint: 9.24.0 eslint-compat-utils: 0.5.1(eslint@9.24.0) eslint-plugin-n@17.13.1(eslint@9.24.0): dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.24.0) enhanced-resolve: 5.18.1 eslint: 9.24.0 eslint-plugin-es-x: 7.8.0(eslint@9.24.0) @@ -3349,11 +3361,11 @@ snapshots: globals: 15.15.0 ignore: 5.3.2 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.2 - eslint-plugin-svelte@3.5.1(eslint@9.24.0)(svelte@5.25.7): + eslint-plugin-svelte@3.5.1(eslint@9.24.0)(svelte@5.30.2): dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.24.0) '@jridgewell/sourcemap-codec': 1.5.0 eslint: 9.24.0 esutils: 2.0.3 @@ -3361,10 +3373,10 @@ snapshots: postcss: 8.5.3 postcss-load-config: 3.1.4(postcss@8.5.3) postcss-safe-parser: 7.0.1(postcss@8.5.3) - semver: 7.7.1 - svelte-eslint-parser: 1.1.2(svelte@5.25.7) + semver: 7.7.2 + svelte-eslint-parser: 1.1.2(svelte@5.30.2) optionalDependencies: - svelte: 5.25.7 + svelte: 5.30.2 transitivePeerDependencies: - ts-node @@ -3379,7 +3391,7 @@ snapshots: eslint@9.24.0: dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.24.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.20.0 '@eslint/config-helpers': 0.2.1 @@ -3896,10 +3908,10 @@ snapshots: optionalDependencies: prettier: 3.5.3 - prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.25.7): + prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.30.2): dependencies: prettier: 3.5.3 - svelte: 5.25.7 + svelte: 5.30.2 prettier@2.8.8: {} @@ -3987,7 +3999,7 @@ snapshots: safer-buffer@2.1.2: {} - semver@7.7.1: {} + semver@7.7.2: {} shebang-command@2.0.0: dependencies: @@ -4020,7 +4032,7 @@ snapshots: get-stdin: 9.0.0 git-hooks-list: 3.2.0 is-plain-obj: 4.1.0 - semver: 7.7.1 + semver: 7.7.2 sort-object-keys: 1.1.3 tinyglobby: 0.2.12 @@ -4090,7 +4102,12 @@ snapshots: dependencies: has-flag: 4.0.0 - svelte-eslint-parser@1.1.2(svelte@5.25.7): + svelte-ast-print@1.0.1(svelte@5.30.2): + dependencies: + esrap: 1.4.6 + svelte: 5.30.2 + + svelte-eslint-parser@1.1.2(svelte@5.30.2): dependencies: eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 @@ -4099,7 +4116,7 @@ snapshots: postcss-scss: 4.0.9(postcss@8.5.3) postcss-selector-parser: 7.1.0 optionalDependencies: - svelte: 5.25.7 + svelte: 5.30.2 svelte@4.2.19: dependencies: @@ -4118,7 +4135,7 @@ snapshots: magic-string: 0.30.17 periscopic: 3.1.0 - svelte@5.25.7: + svelte@5.30.2: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 From 4f84d6821b92e8b6c6050b3d5d7dca89a8bb4f8d Mon Sep 17 00:00:00 2001 From: Manuel Serret Date: Sun, 18 May 2025 10:59:46 +0200 Subject: [PATCH 2/3] make paraglide work --- packages/addons/common.ts | 29 +++++++++++++----- packages/addons/paraglide/index.ts | 49 ++++++++++++++++-------------- 2 files changed, 48 insertions(+), 30 deletions(-) diff --git a/packages/addons/common.ts b/packages/addons/common.ts index b03d9d5e..2e068420 100644 --- a/packages/addons/common.ts +++ b/packages/addons/common.ts @@ -1,4 +1,5 @@ import { imports, exports, common } from '@sveltejs/cli-core/js'; +import { toSvelteFragment, type SvelteAst } from '@sveltejs/cli-core/html'; import { parseScript, parseSvelte } from '@sveltejs/cli-core/parsers'; import process from 'node:process'; @@ -64,17 +65,29 @@ export function addEslintConfigPrettier(content: string): string { } export function addToDemoPage(content: string, path: string): string { - const { template, generateCode } = parseSvelte(content); - - for (const node of template.ast.childNodes) { - if (node.type === 'tag' && node.attribs['href'] === `/demo/${path}`) { - return content; + const { ast, generateCode } = parseSvelte(content); + + for (const node of ast.fragment.nodes) { + if (node.type === 'RegularElement') { + const hrefAttribute = node.attributes.find( + (x) => x.type === 'Attribute' && x.name === 'href' + ) as SvelteAst.Attribute; + if (!hrefAttribute || !hrefAttribute.value) continue; + + if (!Array.isArray(hrefAttribute.value)) continue; + + const hasDemo = hrefAttribute.value.find( + (x) => x.type === 'Text' && x.data === `/demo/${path}` + ); + if (hasDemo) { + return content; + } } } - const newLine = template.source ? '\n' : ''; - const src = template.source + `${newLine}${path}`; - return generateCode({ template: src }); + ast.fragment.nodes.push(...toSvelteFragment(`${path}`)); + + return generateCode(); } /** diff --git a/packages/addons/paraglide/index.ts b/packages/addons/paraglide/index.ts index 455ee24b..644b7bd4 100644 --- a/packages/addons/paraglide/index.ts +++ b/packages/addons/paraglide/index.ts @@ -1,4 +1,3 @@ -import MagicString from 'magic-string'; import { colors, defineAddon, defineAddonOptions, log } from '@sveltejs/cli-core'; import { array, @@ -187,38 +186,44 @@ export default defineAddon({ // add usage example sv.file(`${kit.routesDirectory}/demo/paraglide/+page.svelte`, (content) => { - const { script, template, generateCode } = parseSvelte(content, { typescript }); + console.log(content); + const { ast, generateCode } = parseSvelte(content); + + let scriptAst = ast.instance?.content; + if (!scriptAst) { + scriptAst = parseScript('').ast; + ast.instance = { + type: 'Script', + start: 0, + end: 0, + context: 'default', + attributes: [], + content: scriptAst + }; + } - imports.addNamed(script.ast, '$lib/paraglide/messages.js', { m: 'm' }); - imports.addNamed(script.ast, '$app/navigation', { goto: 'goto' }); - imports.addNamed(script.ast, '$app/state', { page: 'page' }); - imports.addNamed(script.ast, '$lib/paraglide/runtime', { + imports.addNamed(scriptAst, '$lib/paraglide/messages.js', { m: 'm' }); + imports.addNamed(scriptAst, '$lib/paraglide/runtime', { setLocale: 'setLocale' }); - const scriptCode = new MagicString(script.generateCode()); - - const templateCode = new MagicString(template.source); - // add localized message - templateCode.append("\n\n

{m.hello_world({ name: 'SvelteKit User' })}

\n"); + let templateCode = "

{m.hello_world({ name: 'SvelteKit User' })}

"; // add links to other localized pages, the first one is the default // language, thus it does not require any localized route const { validLanguageTags } = parseLanguageTagInput(options.languageTags); const links = validLanguageTags - .map( - (x) => - `${templateCode.getIndentString()}` - ) - .join('\n'); - templateCode.append(`
\n${links}\n
`); - - templateCode.append( - '

\nIf you use VSCode, install the Sherlock i18n extension for a better i18n experience.\n

' - ); + .map((x) => ``) + .join(''); + templateCode += `
${links}
`; - return generateCode({ script: scriptCode.toString(), template: templateCode.toString() }); + templateCode += + '

If you use VSCode, install the Sherlock i18n extension for a better i18n experience.

'; + + ast.fragment.nodes.push(...html.toSvelteFragment(templateCode)); + + return generateCode(); }); } From e67665644650d1d0f8b107e5b673c142e2a34f27 Mon Sep 17 00:00:00 2001 From: Manuel Serret Date: Sat, 21 Jun 2025 12:14:13 +0200 Subject: [PATCH 3/3] use print (local svelte & esrap setup required) --- package.json | 5 +- packages/addons/paraglide/index.ts | 1 - packages/core/package.json | 5 +- packages/core/tooling/index.ts | 3 +- pnpm-lock.yaml | 150 ++++++----------------------- 5 files changed, 34 insertions(+), 130 deletions(-) diff --git a/package.json b/package.json index 01d226ea..91572df8 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,9 @@ "pnpm": { "onlyBuiltDependencies": [ "esbuild" - ] + ], + "overrides": { + "svelte": "link:..\\..\\..\\svelte\\packages\\svelte" + } } } \ No newline at end of file diff --git a/packages/addons/paraglide/index.ts b/packages/addons/paraglide/index.ts index 9f9f8f6f..7961cc75 100644 --- a/packages/addons/paraglide/index.ts +++ b/packages/addons/paraglide/index.ts @@ -188,7 +188,6 @@ export default defineAddon({ // add usage example sv.file(`${kit.routesDirectory}/demo/paraglide/+page.svelte`, (content) => { - console.log(content); const { ast, generateCode } = parseSvelte(content); let scriptAst = ast.instance?.content; diff --git a/packages/core/package.json b/packages/core/package.json index 36eb71e0..64a37d0c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -51,15 +51,14 @@ "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", - "esrap": "^1.4.9", + "esrap": "https://pkg.pr.new/sveltejs/esrap@a275a5c", "htmlparser2": "^9.1.0", "magic-string": "^0.30.17", "picocolors": "^1.1.1", "postcss": "^8.5.6", "silver-fleece": "^1.2.1", - "zimmerframe": "^1.1.2", "svelte": "^5.30.2", - "svelte-ast-print": "^1.0.1" + "zimmerframe": "^1.1.2" }, "keywords": [ "create", diff --git a/packages/core/tooling/index.ts b/packages/core/tooling/index.ts index fe5be511..837d8161 100644 --- a/packages/core/tooling/index.ts +++ b/packages/core/tooling/index.ts @@ -16,8 +16,7 @@ import * as fleece from 'silver-fleece'; import { print as esrapPrint } from 'esrap'; import * as acorn from 'acorn'; import { tsPlugin } from '@sveltejs/acorn-typescript'; -import { parse as svelteParse, type AST as SvelteAst } from 'svelte/compiler'; -import { print as sveltePrint } from 'svelte-ast-print'; +import { parse as svelteParse, type AST as SvelteAst, print as sveltePrint } from 'svelte/compiler'; export { // html diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 32d8b3f1..d958235b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,9 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + svelte: link:..\..\..\svelte\packages\svelte + importers: .: @@ -19,7 +22,7 @@ importers: version: link:packages/create '@sveltejs/eslint-config': specifier: ^8.2.0 - version: 8.2.0(@stylistic/eslint-plugin-js@2.10.1(eslint@9.29.0))(eslint-config-prettier@9.1.0(eslint@9.29.0))(eslint-plugin-n@17.13.1(eslint@9.29.0))(eslint-plugin-svelte@3.9.2(eslint@9.29.0)(svelte@5.34.7))(eslint@9.29.0)(typescript-eslint@8.34.1(eslint@9.29.0)(typescript@5.8.3))(typescript@5.8.3) + version: 8.2.0(@stylistic/eslint-plugin-js@2.10.1(eslint@9.29.0))(eslint-config-prettier@9.1.0(eslint@9.29.0))(eslint-plugin-n@17.13.1(eslint@9.29.0))(eslint-plugin-svelte@3.9.2(eslint@9.29.0)(svelte@svelte+packages+svelte))(eslint@9.29.0)(typescript-eslint@8.34.1(eslint@9.29.0)(typescript@5.8.3))(typescript@5.8.3) '@svitejs/changesets-changelog-github-compact': specifier: ^1.2.0 version: 1.2.0 @@ -34,7 +37,7 @@ importers: version: 9.29.0 eslint-plugin-svelte: specifier: ^3.9.2 - version: 3.9.2(eslint@9.29.0)(svelte@5.34.7) + version: 3.9.2(eslint@9.29.0)(svelte@svelte+packages+svelte) magic-string: specifier: ^0.30.17 version: 0.30.17 @@ -46,7 +49,7 @@ importers: version: 2.5.15(prettier@3.5.3) prettier-plugin-svelte: specifier: ^3.4.0 - version: 3.4.0(prettier@3.5.3)(svelte@5.34.7) + version: 3.4.0(prettier@3.5.3)(svelte@svelte+packages+svelte) rolldown: specifier: 1.0.0-beta.1 version: 1.0.0-beta.1(@babel/runtime@7.27.6) @@ -54,8 +57,8 @@ importers: specifier: workspace:* version: link:packages/cli svelte: - specifier: ^5.34.6 - version: 5.34.7 + specifier: link:../svelte/packages/svelte + version: link:../svelte/packages/svelte typescript: specifier: ^5.8.3 version: 5.8.3 @@ -170,8 +173,8 @@ importers: specifier: ^3.2.2 version: 3.2.2 esrap: - specifier: ^1.4.9 - version: 1.4.9 + specifier: https://pkg.pr.new/sveltejs/esrap@a275a5c + version: https://pkg.pr.new/sveltejs/esrap@a275a5c htmlparser2: specifier: ^9.1.0 version: 9.1.0 @@ -188,11 +191,8 @@ importers: specifier: ^1.2.1 version: 1.2.1 svelte: - specifier: ^5.30.2 - version: 5.30.2 - svelte-ast-print: - specifier: ^1.0.1 - version: 1.0.1(svelte@5.30.2) + specifier: link:../../../svelte/packages/svelte + version: link:../../../svelte/packages/svelte zimmerframe: specifier: ^1.1.2 version: 1.1.2 @@ -255,15 +255,11 @@ importers: specifier: ^7.7.0 version: 7.7.0 svelte: - specifier: ^5.34.0 - version: 5.34.7 + specifier: link:../../../svelte/packages/svelte + version: link:../../../svelte/packages/svelte packages: - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - '@babel/runtime@7.27.6': resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} engines: {node: '>=6.9.0'} @@ -1027,10 +1023,6 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.3.2: - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} - engines: {node: '>= 0.4'} - array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -1039,10 +1031,6 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1087,10 +1075,6 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - code-block-writer@13.0.3: resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} @@ -1286,9 +1270,6 @@ packages: jiti: optional: true - esm-env@1.2.2: - resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} - espree@10.4.0: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1302,8 +1283,9 @@ packages: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} - esrap@1.4.9: - resolution: {integrity: sha512-3OMlcd0a03UGuZpPeUC1HxR3nA23l+HEyCiZw3b3FumJIN9KphoGzDJKMXI1S72jVS1dsenDyQC0kJlO1U9E1g==} + esrap@https://pkg.pr.new/sveltejs/esrap@a275a5c: + resolution: {tarball: https://pkg.pr.new/sveltejs/esrap@a275a5c} + version: 1.4.9 esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} @@ -1516,9 +1498,6 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-reference@3.0.3: - resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} - is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} @@ -1574,9 +1553,6 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - locate-character@3.0.0: - resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} - locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -1977,12 +1953,6 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - svelte-ast-print@1.0.1: - resolution: {integrity: sha512-RJiwV6E9I2pmz4RtLt6yVtIZc15sAqxsZ8Ai8lfDC2b+Kze69rJNLQ9OJr8NU1dUThZx56FY0TyfiqAuIAZoqA==} - engines: {node: '>=20'} - peerDependencies: - svelte: ^5.20.0 - svelte-eslint-parser@1.2.0: resolution: {integrity: sha512-mbPtajIeuiyU80BEyGvwAktBeTX7KCr5/0l+uRGLq1dafwRNrjfM5kHGJScEBlPG3ipu6dJqfW/k0/fujvIEVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1992,14 +1962,6 @@ packages: svelte: optional: true - svelte@5.30.2: - resolution: {integrity: sha512-zfGFEwwPeILToOxOqQyFq/vc8euXrX2XyoffkBNgn/k8D1nxbLt5+mNaqQBmZF/vVhBGmkY6VmNK18p9Gf0auQ==} - engines: {node: '>=18'} - - svelte@5.34.7: - resolution: {integrity: sha512-5PEg+QQKce4t1qiOtVUhUS3AQRTtxJyGBTpxLcNWnr0Ve8q4r06bMo0Gv8uhtCPWlztZHoi3Ye7elLhu+PCTMg==} - engines: {node: '>=18'} - synckit@0.11.8: resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} engines: {node: ^14.18.0 || >=16.0.0} @@ -2256,11 +2218,6 @@ packages: snapshots: - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - '@babel/runtime@7.27.6': {} '@changesets/apply-release-plan@7.0.12': @@ -2789,13 +2746,13 @@ snapshots: dependencies: acorn: 8.15.0 - '@sveltejs/eslint-config@8.2.0(@stylistic/eslint-plugin-js@2.10.1(eslint@9.29.0))(eslint-config-prettier@9.1.0(eslint@9.29.0))(eslint-plugin-n@17.13.1(eslint@9.29.0))(eslint-plugin-svelte@3.9.2(eslint@9.29.0)(svelte@5.34.7))(eslint@9.29.0)(typescript-eslint@8.34.1(eslint@9.29.0)(typescript@5.8.3))(typescript@5.8.3)': + '@sveltejs/eslint-config@8.2.0(@stylistic/eslint-plugin-js@2.10.1(eslint@9.29.0))(eslint-config-prettier@9.1.0(eslint@9.29.0))(eslint-plugin-n@17.13.1(eslint@9.29.0))(eslint-plugin-svelte@3.9.2(eslint@9.29.0)(svelte@svelte+packages+svelte))(eslint@9.29.0)(typescript-eslint@8.34.1(eslint@9.29.0)(typescript@5.8.3))(typescript@5.8.3)': dependencies: '@stylistic/eslint-plugin-js': 2.10.1(eslint@9.29.0) eslint: 9.29.0 eslint-config-prettier: 9.1.0(eslint@9.29.0) eslint-plugin-n: 17.13.1(eslint@9.29.0) - eslint-plugin-svelte: 3.9.2(eslint@9.29.0)(svelte@5.34.7) + eslint-plugin-svelte: 3.9.2(eslint@9.29.0)(svelte@svelte+packages+svelte) globals: 15.15.0 typescript: 5.8.3 typescript-eslint: 8.34.1(eslint@9.29.0)(typescript@5.8.3) @@ -3027,14 +2984,10 @@ snapshots: argparse@2.0.1: {} - aria-query@5.3.2: {} - array-union@2.1.0: {} assertion-error@2.0.1: {} - axobject-query@4.1.0: {} - balanced-match@1.0.2: {} better-path-resolve@1.0.0: @@ -3077,8 +3030,6 @@ snapshots: ci-info@3.9.0: {} - clsx@2.1.1: {} - code-block-writer@13.0.3: {} color-convert@2.0.1: @@ -3229,7 +3180,7 @@ snapshots: minimatch: 9.0.5 semver: 7.7.2 - eslint-plugin-svelte@3.9.2(eslint@9.29.0)(svelte@5.34.7): + eslint-plugin-svelte@3.9.2(eslint@9.29.0)(svelte@svelte+packages+svelte): dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0) '@jridgewell/sourcemap-codec': 1.5.0 @@ -3241,9 +3192,9 @@ snapshots: postcss-load-config: 3.1.4(postcss@8.5.6) postcss-safe-parser: 7.0.1(postcss@8.5.6) semver: 7.7.2 - svelte-eslint-parser: 1.2.0(svelte@5.34.7) + svelte-eslint-parser: 1.2.0(svelte@svelte+packages+svelte) optionalDependencies: - svelte: 5.34.7 + svelte: link:../svelte/packages/svelte transitivePeerDependencies: - ts-node @@ -3296,8 +3247,6 @@ snapshots: transitivePeerDependencies: - supports-color - esm-env@1.2.2: {} - espree@10.4.0: dependencies: acorn: 8.15.0 @@ -3310,7 +3259,7 @@ snapshots: dependencies: estraverse: 5.3.0 - esrap@1.4.9: + esrap@https://pkg.pr.new/sveltejs/esrap@a275a5c: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -3510,10 +3459,6 @@ snapshots: is-plain-obj@4.1.0: {} - is-reference@3.0.3: - dependencies: - '@types/estree': 1.0.8 - is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 @@ -3564,8 +3509,6 @@ snapshots: lines-and-columns@1.2.4: {} - locate-character@3.0.0: {} - locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -3761,10 +3704,10 @@ snapshots: optionalDependencies: prettier: 3.5.3 - prettier-plugin-svelte@3.4.0(prettier@3.5.3)(svelte@5.34.7): + prettier-plugin-svelte@3.4.0(prettier@3.5.3)(svelte@svelte+packages+svelte): dependencies: prettier: 3.5.3 - svelte: 5.34.7 + svelte: link:../svelte/packages/svelte prettier@2.8.8: {} @@ -3940,12 +3883,7 @@ snapshots: dependencies: has-flag: 4.0.0 - svelte-ast-print@1.0.1(svelte@5.30.2): - dependencies: - esrap: 1.4.9 - svelte: 5.30.2 - - svelte-eslint-parser@1.2.0(svelte@5.34.7): + svelte-eslint-parser@1.2.0(svelte@svelte+packages+svelte): dependencies: eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -3954,41 +3892,7 @@ snapshots: postcss-scss: 4.0.9(postcss@8.5.6) postcss-selector-parser: 7.1.0 optionalDependencies: - svelte: 5.34.7 - - svelte@5.30.2: - dependencies: - '@ampproject/remapping': 2.3.0 - '@jridgewell/sourcemap-codec': 1.5.0 - '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) - '@types/estree': 1.0.7 - acorn: 8.15.0 - aria-query: 5.3.2 - axobject-query: 4.1.0 - clsx: 2.1.1 - esm-env: 1.2.2 - esrap: 1.4.9 - is-reference: 3.0.3 - locate-character: 3.0.0 - magic-string: 0.30.17 - zimmerframe: 1.1.2 - - svelte@5.34.7: - dependencies: - '@ampproject/remapping': 2.3.0 - '@jridgewell/sourcemap-codec': 1.5.0 - '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) - '@types/estree': 1.0.8 - acorn: 8.15.0 - aria-query: 5.3.2 - axobject-query: 4.1.0 - clsx: 2.1.1 - esm-env: 1.2.2 - esrap: 1.4.9 - is-reference: 3.0.3 - locate-character: 3.0.0 - magic-string: 0.30.17 - zimmerframe: 1.1.2 + svelte: link:../svelte/packages/svelte synckit@0.11.8: dependencies: