From 3ba12f3d4d863f2703a54ac96a5ac7a6a8103b56 Mon Sep 17 00:00:00 2001 From: jycouet Date: Sun, 22 Mar 2026 00:15:43 +0100 Subject: [PATCH 1/5] feat: build cli repo types during docs sync for twoslash support --- apps/svelte.dev/package.json | 1 + apps/svelte.dev/scripts/sync-docs/index.ts | 22 +++++++++++++++++-- .../site-kit/src/lib/markdown/renderer.ts | 3 ++- pnpm-lock.yaml | 8 +++++++ 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/apps/svelte.dev/package.json b/apps/svelte.dev/package.json index 1efb1c4ad2..d4ee2f1ceb 100644 --- a/apps/svelte.dev/package.json +++ b/apps/svelte.dev/package.json @@ -73,6 +73,7 @@ "prettier-plugin-svelte": "^3.5.0", "satori": "^0.19.2", "satori-html": "^0.3.2", + "@sveltejs/sv-utils": "^0.0.3", "sv": "^0.12.2", "svelte": "^5.53.5", "svelte-check": "^4.4.3", diff --git a/apps/svelte.dev/scripts/sync-docs/index.ts b/apps/svelte.dev/scripts/sync-docs/index.ts index c41eefc6a0..1a6929181e 100644 --- a/apps/svelte.dev/scripts/sync-docs/index.ts +++ b/apps/svelte.dev/scripts/sync-docs/index.ts @@ -9,7 +9,7 @@ import ts from 'typescript'; import glob from 'tiny-glob/sync.js'; import chokidar from 'chokidar'; import { fileURLToPath } from 'node:url'; -import { clone_repo, migrate_meta_json } from './utils.ts'; +import { clone_repo, invoke, migrate_meta_json } from './utils.ts'; import { get_types, read_d_ts_file, read_types } from './types.ts'; import type { Modules } from '@sveltejs/site-kit/markdown'; import { generate_crosslinks } from './crosslinks.ts'; @@ -24,6 +24,8 @@ interface Package { docs: string; types: string | null; process_modules?: (modules: Modules, pkg: Package) => Promise; + /** Runs after cloning the repo (e.g. to install deps and build types) */ + post_clone?: (dir: string) => Promise; } const get_trigger = (pkg: Package) => pkg.trigger ?? pkg.name; @@ -170,7 +172,20 @@ const packages: Package[] = [ branch: branches['cli']?.branch ?? 'main', pkg: 'packages/sv', docs: 'documentation/docs', - types: null + types: null, + post_clone: async (dir) => { + await invoke('npx', ['pnpm@10', 'install'], { cwd: dir }); + await invoke('npx', ['pnpm@10', 'build'], { cwd: dir }); + + // Point node_modules symlinks at the cloned repo so twoslash uses PR types + const app_nm = path.join(dirname, '../../node_modules'); + const sv_link = path.join(app_nm, 'sv'); + const sv_utils_link = path.join(app_nm, '@sveltejs/sv-utils'); + fs.rmSync(sv_link, { force: true }); + fs.rmSync(sv_utils_link, { force: true }); + fs.symlinkSync(path.join(dir, 'packages/sv'), sv_link); + fs.symlinkSync(path.join(dir, 'packages/sv-utils'), sv_utils_link); + } }, { name: 'ai', @@ -213,6 +228,9 @@ if (parsed.values.pull) { for (const pkg of filtered) { await clone_repo(`https://github.com/${pkg.repo}.git`, pkg.name, pkg.branch, REPOS); + if (pkg.post_clone) { + await pkg.post_clone(`${REPOS}/${pkg.name}`); + } } } diff --git a/packages/site-kit/src/lib/markdown/renderer.ts b/packages/site-kit/src/lib/markdown/renderer.ts index d5a11228c4..68f5046033 100644 --- a/packages/site-kit/src/lib/markdown/renderer.ts +++ b/packages/site-kit/src/lib/markdown/renderer.ts @@ -1087,7 +1087,7 @@ async function syntax_highlight({ compilerOptions: { allowJs: true, checkJs: true, - types: ['svelte', '@sveltejs/kit', 'sv'] + types: ['svelte', '@sveltejs/kit', 'sv', '@sveltejs/sv-utils'] } }, // by default, twoslash does not run on .js files, change that through this option @@ -1109,6 +1109,7 @@ async function syntax_highlight({ // munge the twoslash output so that it renders sensibly. the order of operations // here is important — we need to work backwards, to avoid corrupting the offsets + // TODO JYC: look at this later — replacing with '' may break layout, '\n' was too aggressive // first, strip out unwanted error lines html = html.replace( /
[^]+?<\/div>/g, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index da8f2c673c..11ff387067 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -129,6 +129,9 @@ importers: '@sveltejs/site-kit': specifier: workspace:* version: link:../../packages/site-kit + '@sveltejs/sv-utils': + specifier: ^0.0.3 + version: 0.0.3 '@sveltejs/vite-plugin-svelte': specifier: ^7.0.0 version: 7.0.0(svelte@5.53.5)(vite@8.0.0-beta.15(@types/node@20.19.33)(esbuild@0.27.3)(tsx@4.21.0)) @@ -1742,6 +1745,9 @@ packages: peerDependencies: svelte: ^3.44.0 || ^4.0.0 || ^5.0.0-next.1 + '@sveltejs/sv-utils@0.0.3': + resolution: {integrity: sha512-rILMrx0zQMR0OlFXR/peTu+9z6x/5iOsEiWJelkI670WPWdAunikKLQrIE7zN8U/8DjN5WBvIWu0OAyEuZ4ohA==} + '@sveltejs/svelte-json-tree@2.2.1': resolution: {integrity: sha512-M8l23/R3y1fI2+RaOzfUzmkysTWWsw/NClUgGpvydl9vXRonPN1/btQQievaNyeWNfUj12tjPfh5yTrXWpaKkg==} engines: {pnpm: ^9.0.0} @@ -4881,6 +4887,8 @@ snapshots: transitivePeerDependencies: - typescript + '@sveltejs/sv-utils@0.0.3': {} + '@sveltejs/svelte-json-tree@2.2.1(svelte@5.53.5)': dependencies: svelte: 5.53.5 From df60f6c983e3019611fcf2fe96aafd84eaf6446f Mon Sep 17 00:00:00 2001 From: jycouet Date: Sun, 22 Mar 2026 00:18:49 +0100 Subject: [PATCH 2/5] rmv TODO JYC as we have no error anymore --- packages/site-kit/src/lib/markdown/renderer.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/site-kit/src/lib/markdown/renderer.ts b/packages/site-kit/src/lib/markdown/renderer.ts index 68f5046033..9bf5ae95c0 100644 --- a/packages/site-kit/src/lib/markdown/renderer.ts +++ b/packages/site-kit/src/lib/markdown/renderer.ts @@ -1109,7 +1109,6 @@ async function syntax_highlight({ // munge the twoslash output so that it renders sensibly. the order of operations // here is important — we need to work backwards, to avoid corrupting the offsets - // TODO JYC: look at this later — replacing with '' may break layout, '\n' was too aggressive // first, strip out unwanted error lines html = html.replace( /
[^]+?<\/div>/g, From 0f1abf2f5df8fb87601531b6f32710375576f890 Mon Sep 17 00:00:00 2001 From: jycouet Date: Sun, 22 Mar 2026 00:25:28 +0100 Subject: [PATCH 3/5] pnpm i --- apps/svelte.dev/package.json | 4 ++-- pnpm-lock.yaml | 12 +++++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/apps/svelte.dev/package.json b/apps/svelte.dev/package.json index d4ee2f1ceb..cdfe44c6fc 100644 --- a/apps/svelte.dev/package.json +++ b/apps/svelte.dev/package.json @@ -57,6 +57,7 @@ "@sveltejs/enhanced-img": "^0.10.3", "@sveltejs/kit": "^2.53.2", "@sveltejs/site-kit": "workspace:*", + "@sveltejs/sv-utils": "^0.0.3", "@sveltejs/vite-plugin-svelte": "^7.0.0", "@types/node": "^20.19.33", "browserslist": "^4.28.1", @@ -73,8 +74,7 @@ "prettier-plugin-svelte": "^3.5.0", "satori": "^0.19.2", "satori-html": "^0.3.2", - "@sveltejs/sv-utils": "^0.0.3", - "sv": "^0.12.2", + "sv": "^0.12.8", "svelte": "^5.53.5", "svelte-check": "^4.4.3", "svelte-preprocess": "^6.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 11ff387067..0414be3207 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -181,8 +181,8 @@ importers: specifier: ^0.3.2 version: 0.3.2 sv: - specifier: ^0.12.2 - version: 0.12.2 + specifier: ^0.12.8 + version: 0.12.8 svelte: specifier: ^5.53.5 version: 5.53.5 @@ -3166,8 +3166,8 @@ packages: style-mod@4.1.3: resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} - sv@0.12.2: - resolution: {integrity: sha512-W1jn3pjIjVDOjM04JBY5jACsvotE198ahRQm8zuv5hMY6UHrB5ucpwIbPIYEeoXSPjirrLr1rcQ46S+tvFb3vw==} + sv@0.12.8: + resolution: {integrity: sha512-sTe/Lbc5HsT8rCoUhvwi8zFi+d819/pdI5z9JDObISuhhG0j4tFNNcyaJ0AoZwKVCfo3JYroz8ECCtoMz+2Ncw==} hasBin: true svelte-check@4.4.3: @@ -6444,7 +6444,9 @@ snapshots: style-mod@4.1.3: {} - sv@0.12.2: {} + sv@0.12.8: + dependencies: + '@sveltejs/sv-utils': 0.0.3 svelte-check@4.4.3(picomatch@4.0.3)(svelte@5.53.5)(typescript@5.9.3): dependencies: From 7cc842b7411cf1cc0bb73b90ea76c216acdf77df Mon Sep 17 00:00:00 2001 From: jycouet Date: Sun, 22 Mar 2026 18:01:01 +0100 Subject: [PATCH 4/5] patch types of svelte & kit --- apps/svelte.dev/scripts/sync-docs/index.ts | 36 +++++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/apps/svelte.dev/scripts/sync-docs/index.ts b/apps/svelte.dev/scripts/sync-docs/index.ts index 1a6929181e..2d383eaf83 100644 --- a/apps/svelte.dev/scripts/sync-docs/index.ts +++ b/apps/svelte.dev/scripts/sync-docs/index.ts @@ -81,6 +81,26 @@ const get_downstream_repo = (name: string) => { return `${owner}/${downstream}`; }; +function patch_node_modules( + cloned_dir: string, + pkg_subdir: string, + npm_name: string, + onlyDirs?: string[] +) { + const source = path.join(cloned_dir, pkg_subdir); + const target = path.join(dirname, '../../node_modules', npm_name); + if (onlyDirs) { + for (const dir of onlyDirs) { + const t = path.join(target, dir); + fs.rmSync(t, { recursive: true, force: true }); + fs.cpSync(path.join(source, dir), t, { recursive: true }); + } + } else { + fs.rmSync(target, { force: true }); + fs.symlinkSync(source, target); + } +} + const packages: Package[] = [ { name: 'svelte', @@ -89,6 +109,9 @@ const packages: Package[] = [ pkg: 'packages/svelte', docs: 'documentation/docs', types: 'types', + post_clone: async (dir) => { + patch_node_modules(dir, 'packages/svelte', 'svelte', ['types']); + }, process_modules: async (modules: Modules) => { // Remove $$_attributes from ActionReturn const module_with_ActionReturn = modules.find((m) => @@ -113,6 +136,9 @@ const packages: Package[] = [ pkg: 'packages/kit', docs: 'documentation/docs', types: 'types', + post_clone: async (dir) => { + patch_node_modules(dir, 'packages/kit', '@sveltejs/kit', ['types']); + }, process_modules: async (modules, pkg) => { const kit_base = `${REPOS}/${pkg.name}/${pkg.pkg}/`; @@ -177,14 +203,8 @@ const packages: Package[] = [ await invoke('npx', ['pnpm@10', 'install'], { cwd: dir }); await invoke('npx', ['pnpm@10', 'build'], { cwd: dir }); - // Point node_modules symlinks at the cloned repo so twoslash uses PR types - const app_nm = path.join(dirname, '../../node_modules'); - const sv_link = path.join(app_nm, 'sv'); - const sv_utils_link = path.join(app_nm, '@sveltejs/sv-utils'); - fs.rmSync(sv_link, { force: true }); - fs.rmSync(sv_utils_link, { force: true }); - fs.symlinkSync(path.join(dir, 'packages/sv'), sv_link); - fs.symlinkSync(path.join(dir, 'packages/sv-utils'), sv_utils_link); + patch_node_modules(dir, 'packages/sv', 'sv'); + patch_node_modules(dir, 'packages/sv-utils', '@sveltejs/sv-utils'); } }, { From 9675761eda49c92112e7d6fccdc828a561ec5bb4 Mon Sep 17 00:00:00 2001 From: jycouet Date: Sun, 22 Mar 2026 18:07:55 +0100 Subject: [PATCH 5/5] no need comment! --- apps/svelte.dev/scripts/sync-docs/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/svelte.dev/scripts/sync-docs/index.ts b/apps/svelte.dev/scripts/sync-docs/index.ts index 2d383eaf83..e6524d6110 100644 --- a/apps/svelte.dev/scripts/sync-docs/index.ts +++ b/apps/svelte.dev/scripts/sync-docs/index.ts @@ -24,7 +24,6 @@ interface Package { docs: string; types: string | null; process_modules?: (modules: Modules, pkg: Package) => Promise; - /** Runs after cloning the repo (e.g. to install deps and build types) */ post_clone?: (dir: string) => Promise; }