@sveltejs/kit 3.0.0-next.25 → 3.0.0-next.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/package.json +5 -7
  2. package/src/core/adapt/builder.js +127 -31
  3. package/src/core/adapt/index.js +3 -0
  4. package/src/core/config/index.js +4 -7
  5. package/src/core/env.js +36 -8
  6. package/src/core/generate_manifest/index.js +42 -43
  7. package/src/core/postbuild/analyse.js +4 -4
  8. package/src/core/postbuild/fallback.js +1 -1
  9. package/src/core/postbuild/prerender.js +2 -2
  10. package/src/core/sync/create_manifest_data/index.js +0 -1
  11. package/src/core/sync/write_app_manifest.js +3 -2
  12. package/src/exports/public.d.ts +100 -48
  13. package/src/exports/vite/build/index.js +1173 -0
  14. package/src/exports/vite/build/remote.js +4 -4
  15. package/src/exports/vite/dev/generate_manifest.js +308 -0
  16. package/src/exports/vite/dev/index.js +28 -284
  17. package/src/exports/vite/index.js +117 -1308
  18. package/src/exports/vite/plugins/env-vars.js +11 -34
  19. package/src/exports/vite/plugins/guard.js +19 -7
  20. package/src/exports/vite/plugins/remote.js +237 -0
  21. package/src/exports/vite/preview/index.js +8 -8
  22. package/src/exports/vite/static_analysis/index.js +15 -15
  23. package/src/exports/vite/utils.js +1 -1
  24. package/src/runner.js +4 -3
  25. package/src/runtime/app/paths/server.js +2 -2
  26. package/src/runtime/app/server/index.js +3 -3
  27. package/src/runtime/app/server/public.d.ts +114 -57
  28. package/src/runtime/app/server/remote/requested.js +31 -15
  29. package/src/runtime/app/state/client.svelte.js +3 -1
  30. package/src/runtime/client/client.js +39 -194
  31. package/src/runtime/client/fetcher.js +6 -6
  32. package/src/runtime/client/focus.js +120 -0
  33. package/src/runtime/client/remote-functions/command.svelte.js +20 -9
  34. package/src/runtime/client/remote-functions/form.svelte.js +12 -7
  35. package/src/runtime/client/remote-functions/query/instance.svelte.js +19 -5
  36. package/src/runtime/client/remote-functions/shared.svelte.js +22 -1
  37. package/src/runtime/client/scroll.js +39 -0
  38. package/src/runtime/client/utils.js +28 -0
  39. package/src/runtime/form-utils.js +243 -245
  40. package/src/runtime/server/data/index.js +3 -10
  41. package/src/runtime/server/fetch.js +13 -15
  42. package/src/runtime/server/index.js +8 -7
  43. package/src/runtime/server/internal.js +1 -2
  44. package/src/runtime/server/page/index.js +10 -15
  45. package/src/runtime/server/page/load_data.js +2 -2
  46. package/src/runtime/server/page/render.js +8 -13
  47. package/src/runtime/server/page/respond_with_error.js +4 -5
  48. package/src/runtime/server/page/server_routing.js +21 -27
  49. package/src/runtime/server/remote-functions.js +14 -14
  50. package/src/runtime/server/respond.js +17 -40
  51. package/src/runtime/server/state.js +1 -0
  52. package/src/runtime/server/utils.js +4 -4
  53. package/src/runtime/shared.js +9 -0
  54. package/src/types/ambient-private.d.ts +1 -2
  55. package/src/types/internal.d.ts +49 -6
  56. package/src/utils/filesystem.js +43 -27
  57. package/src/version.js +1 -1
  58. package/types/index.d.ts +215 -92
  59. package/types/index.d.ts.map +6 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sveltejs/kit",
3
- "version": "3.0.0-next.25",
3
+ "version": "3.0.0-next.27",
4
4
  "description": "SvelteKit is the fastest way to build Svelte apps",
5
5
  "keywords": [
6
6
  "framework",
@@ -20,8 +20,6 @@
20
20
  "dependencies": {
21
21
  "@rolldown/pluginutils": "^1.0.1",
22
22
  "@standard-schema/spec": "^1.1.0",
23
- "@sveltejs/acorn-typescript": "^1.0.12",
24
- "acorn": "^8.18.0",
25
23
  "cookie": "^2.0.1",
26
24
  "devalue": "^5.9.0",
27
25
  "esm-env": "^1.2.2",
@@ -31,14 +29,14 @@
31
29
  },
32
30
  "devDependencies": {
33
31
  "@opentelemetry/api": "^1.9.1",
34
- "@playwright/test": "^1.62.0",
32
+ "@playwright/test": "^1.62.1",
35
33
  "@sveltejs/vite-plugin-svelte": "^7.3.0",
36
34
  "@types/connect": "^3.4.38",
37
35
  "@typescript/native": "npm:typescript@^7.0.2",
38
36
  "@types/node": "^22.19.19",
39
37
  "dts-buddy": "^0.8.3",
40
38
  "jsdom": "^30.0.0",
41
- "svelte": "^5.56.8",
39
+ "svelte": "^5.57.0",
42
40
  "svelte-preprocess": "^6.0.5",
43
41
  "typescript": "~6.0.3",
44
42
  "valibot": "^1.4.2",
@@ -66,8 +64,8 @@
66
64
  "files": [
67
65
  "src",
68
66
  "!src/**/*.spec.js",
69
- "!src/core/**/fixtures",
70
- "!src/core/**/test",
67
+ "!src/**/fixtures",
68
+ "!src/**/test",
71
69
  "types",
72
70
  "svelte-kit.js"
73
71
  ],
@@ -13,19 +13,21 @@ import {
13
13
  rmSync,
14
14
  statSync
15
15
  } from 'node:fs';
16
- import { extname, resolve, join, dirname, relative } from 'node:path';
16
+ import path from 'node:path';
17
17
  import { pipeline } from 'node:stream';
18
18
  import { promisify } from 'node:util';
19
19
  import zlib from 'node:zlib';
20
- import { copy, walk } from '../../utils/filesystem.js';
20
+ import { copy, relative_path, walk } from '../../utils/filesystem.js';
21
21
  import { posixify } from '../../utils/os.js';
22
22
  import { generate_manifest } from '../generate_manifest/index.js';
23
23
  import { get_route_segments } from '../../utils/routing.js';
24
24
  import generate_fallback from '../postbuild/fallback.js';
25
- import { write } from '../sync/utils.js';
25
+ import { dedent, write } from '../sync/utils.js';
26
26
  import { find_server_assets } from '../generate_manifest/find_server_assets.js';
27
27
  import { create_exported_declarations } from '../env.js';
28
28
  import { handle_issues, validate } from '../../exports/internal/env.js';
29
+ import { get_mime_lookup } from '../utils.js';
30
+ import { lookup as mime_lookup } from '../../utils/mime.js';
29
31
 
30
32
  const pipe = promisify(pipeline);
31
33
  const extensions = [
@@ -51,6 +53,7 @@ const extensions = [
51
53
  * route_data: RouteData[];
52
54
  * prerendered: Prerendered;
53
55
  * prerender_map: PrerenderMap;
56
+ * app_manifest: typeof import('$app/manifest');
54
57
  * log: Logger;
55
58
  * vite_config: ResolvedConfig;
56
59
  * remotes: RemoteChunk[];
@@ -65,6 +68,7 @@ export function create_builder({
65
68
  route_data,
66
69
  prerendered,
67
70
  prerender_map,
71
+ app_manifest,
68
72
  log,
69
73
  vite_config,
70
74
  remotes,
@@ -103,6 +107,12 @@ export function create_builder({
103
107
  return facade;
104
108
  });
105
109
 
110
+ // $app/manifest cannot include the service worker because it's used by the service worker itself,
111
+ // but the adapter needs to know about it so we add it here.
112
+ if (build_data.service_worker) {
113
+ app_manifest.assets.push({ path: build_data.service_worker });
114
+ }
115
+
106
116
  return {
107
117
  log,
108
118
  rimraf: (dir) => rmSync(dir, { force: true, recursive: true }),
@@ -112,17 +122,38 @@ export function create_builder({
112
122
  config,
113
123
  prerendered,
114
124
  routes,
125
+ manifest: app_manifest,
126
+ get mimeTypes() {
127
+ // TODO - make the `generate_manifest` function return data instead of a string, and retrieve mime types from there
128
+ const mime_types = get_mime_lookup(build_data.manifest_data);
129
+ const server_assets = find_server_assets(
130
+ build_data,
131
+ route_data.filter((route) => prerender_map.get(route.id) !== true),
132
+ vite_config.root
133
+ );
134
+ for (const file of server_assets) {
135
+ const ext = path.extname(file);
136
+ mime_types[ext] ??= mime_lookup(ext) || '';
137
+ }
138
+
139
+ // record extensions that only exist in prerendered output, e.g. a prerendered favicon.ico
140
+ for (const pathname of prerendered.paths) {
141
+ const ext = path.extname(pathname);
142
+ if (ext) mime_types[ext] ??= mime_lookup(ext) || '';
143
+ }
144
+ return mime_types;
145
+ },
115
146
 
116
147
  async compress(directory) {
117
148
  if (!existsSync(directory)) {
118
149
  return [];
119
150
  }
120
151
 
121
- const files = [...walk(directory)].filter((file) => extensions.includes(extname(file)));
152
+ const files = [...walk(directory)].filter((file) => extensions.includes(path.extname(file)));
122
153
 
123
154
  await Promise.all(
124
155
  files.flatMap((file) => {
125
- const abs = resolve(directory, file);
156
+ const abs = path.resolve(directory, file);
126
157
  return [compress_file(abs, 'gz'), compress_file(abs, 'br')];
127
158
  })
128
159
  );
@@ -184,17 +215,34 @@ export function create_builder({
184
215
  write(`${dest}/env.js`, `export const env=${payload}`);
185
216
  },
186
217
 
187
- generateManifest({ relativePath, routes: subset }) {
188
- return generate_manifest({
189
- build_data,
190
- prerendered: prerendered.paths,
191
- relative_path: relativePath,
192
- routes: subset
193
- ? subset.map((route) => /** @type {import('types').RouteData} */ (lookup.get(route)))
194
- : route_data.filter((route) => prerender_map.get(route.id) !== true),
195
- remotes,
196
- root: vite_config.root
197
- });
218
+ generateManifest() {
219
+ throw new Error(
220
+ 'The `generateManifest` adapter API has been removed — use `generateServerInstance` or `builder.manifest` instead. You may need to update your adapter'
221
+ );
222
+ },
223
+
224
+ generateServerInstance(dest, { routes: subset, serverDirectory } = {}) {
225
+ const relative = relative_path(
226
+ path.dirname(dest),
227
+ serverDirectory ?? this.getServerDirectory()
228
+ );
229
+ write(
230
+ dest,
231
+ dedent`
232
+ import { Server } from '${relative}/index.js';
233
+ const manifest = ${generate_manifest({
234
+ build_data,
235
+ prerendered: prerendered.paths,
236
+ relative_path: relative,
237
+ routes: subset
238
+ ? subset.map((route) => /** @type {import('types').RouteData} */ (lookup.get(route)))
239
+ : route_data.filter((route) => prerender_map.get(route.id) !== true),
240
+ remotes,
241
+ root: vite_config.root
242
+ })};
243
+ export const server = new Server(manifest);
244
+ `
245
+ );
198
246
  },
199
247
 
200
248
  getBuildDirectory(name) {
@@ -234,6 +282,30 @@ export function create_builder({
234
282
  return copy(`${config.outDir}/output/server`, dest);
235
283
  },
236
284
 
285
+ createInstrumentationInitializer({
286
+ outputDirectory,
287
+ environment,
288
+ serverDirectory = `${config.outDir}/output/server`
289
+ }) {
290
+ const provider = path.join(outputDirectory, '__sveltekit_env.js');
291
+ write(provider, environment ?? 'export default process.env;');
292
+
293
+ const initializer = path.join(outputDirectory, '__sveltekit_env_init.js');
294
+ write(
295
+ initializer,
296
+ create_env_module({
297
+ environment: to_import_specifier(
298
+ posixify(path.relative(path.dirname(initializer), provider))
299
+ ),
300
+ set_env: to_import_specifier(
301
+ posixify(path.relative(path.dirname(initializer), `${serverDirectory}/env.js`))
302
+ )
303
+ })
304
+ );
305
+
306
+ return initializer;
307
+ },
308
+
237
309
  hasServerInstrumentationFile() {
238
310
  return existsSync(`${config.outDir}/output/server/instrumentation.server.js`);
239
311
  },
@@ -241,7 +313,8 @@ export function create_builder({
241
313
  instrument({
242
314
  entrypoint,
243
315
  instrumentation,
244
- start = join(dirname(entrypoint), 'start.js'),
316
+ start = path.join(path.dirname(entrypoint), 'start.js'),
317
+ initializer,
245
318
  module = {
246
319
  exports: ['default']
247
320
  }
@@ -256,25 +329,35 @@ export function create_builder({
256
329
  `Entrypoint file ${entrypoint} not found. This is probably a bug in your adapter.`
257
330
  );
258
331
  }
332
+ if (!existsSync(initializer)) {
333
+ throw new Error(
334
+ `Instrumentation initializer ${initializer} not found. This is probably a bug in your adapter.`
335
+ );
336
+ }
259
337
 
260
338
  copy(entrypoint, start);
261
339
  if (existsSync(`${entrypoint}.map`)) {
262
340
  copy(`${entrypoint}.map`, `${start}.map`);
263
341
  }
264
342
 
265
- const relative_instrumentation = posixify(relative(dirname(entrypoint), instrumentation));
266
- const relative_start = posixify(relative(dirname(entrypoint), start));
343
+ const relative_instrumentation = posixify(
344
+ path.relative(path.dirname(entrypoint), instrumentation)
345
+ );
346
+ const relative_start = posixify(path.relative(path.dirname(entrypoint), start));
347
+ const relative_initializer = posixify(path.relative(path.dirname(entrypoint), initializer));
267
348
 
268
349
  const facade =
269
350
  'generateText' in module
270
351
  ? module.generateText({
271
352
  instrumentation: relative_instrumentation,
272
- start: relative_start
353
+ start: relative_start,
354
+ initializer: relative_initializer
273
355
  })
274
356
  : create_instrumentation_facade({
275
357
  instrumentation: relative_instrumentation,
276
358
  start: relative_start,
277
- exports: module.exports
359
+ exports: module.exports,
360
+ initializer: relative_initializer
278
361
  });
279
362
 
280
363
  rmSync(entrypoint, { force: true, recursive: true });
@@ -307,16 +390,15 @@ async function compress_file(file, format = 'gz') {
307
390
 
308
391
  /**
309
392
  * Given a list of exports, generate a facade that:
393
+ * - Imports the environment initializer
310
394
  * - Imports the instrumentation file
311
- * - Imports `exports` from the entrypoint (dynamically, if `tla` is true)
395
+ * - Imports `exports` from the entrypoint (dynamically)
312
396
  * - Re-exports `exports` from the entrypoint
313
397
  *
314
- * @param {{ instrumentation: string; start: string; exports: string[] }} opts
398
+ * @param {{ instrumentation: string; start: string; exports: string[]; initializer: string }} opts
315
399
  * @returns {string}
316
400
  */
317
- function create_instrumentation_facade({ instrumentation, start, exports }) {
318
- const import_instrumentation = `import './${instrumentation}';`;
319
-
401
+ function create_instrumentation_facade({ instrumentation, start, exports, initializer }) {
320
402
  const { namespace, declarations, reexports } = create_exported_declarations(
321
403
  exports,
322
404
  (name, ns) => `${ns}.${name}`,
@@ -324,12 +406,26 @@ function create_instrumentation_facade({ instrumentation, start, exports }) {
324
406
  );
325
407
 
326
408
  const parts = [
327
- `const ${namespace} = await import('./${start}');`,
409
+ `import ${JSON.stringify(to_import_specifier(initializer))};`,
410
+ `import ${JSON.stringify(to_import_specifier(instrumentation))};`,
411
+ `const ${namespace} = await import(${JSON.stringify(to_import_specifier(start))});`,
328
412
  declarations.join('\n'),
329
413
  reexports.length > 0 ? `export { ${reexports.join(', ')} };` : ''
330
- ]
331
- .filter(Boolean)
332
- .join('\n');
414
+ ];
333
415
 
334
- return `${import_instrumentation}\n${parts}`;
416
+ return parts.filter(Boolean).join('\n');
417
+ }
418
+
419
+ /**
420
+ * @param {string} path
421
+ */
422
+ function to_import_specifier(path) {
423
+ return path.startsWith('.') ? path : `./${path}`;
424
+ }
425
+
426
+ /**
427
+ * @param {{ environment: string; set_env: string }} opts
428
+ */
429
+ function create_env_module({ environment, set_env }) {
430
+ return `import env from ${JSON.stringify(environment)};\nimport { set_env } from ${JSON.stringify(set_env)};\nset_env(env);\n`;
335
431
  }
@@ -7,6 +7,7 @@ import { create_builder } from './builder.js';
7
7
  * @param {import('types').ServerMetadata} server_metadata
8
8
  * @param {import('types').Prerendered} prerendered
9
9
  * @param {import('types').PrerenderMap} prerender_map
10
+ * @param {typeof import('$app/manifest')} app_manifest
10
11
  * @param {import('types').Logger} log
11
12
  * @param {import('types').RemoteChunk[]} remotes
12
13
  * @param {import('vite').ResolvedConfig} vite_config
@@ -18,6 +19,7 @@ export async function adapt(
18
19
  server_metadata,
19
20
  prerendered,
20
21
  prerender_map,
22
+ app_manifest,
21
23
  log,
22
24
  remotes,
23
25
  vite_config,
@@ -48,6 +50,7 @@ export async function adapt(
48
50
  route_data: build_data.manifest_data.routes.filter((route) => route.page || route.endpoint),
49
51
  prerendered,
50
52
  prerender_map,
53
+ app_manifest,
51
54
  log,
52
55
  remotes,
53
56
  vite_config,
@@ -200,13 +200,10 @@ export function validate_config(config) {
200
200
  }
201
201
  }
202
202
 
203
- if (
204
- validated.csp?.directives?.['require-trusted-types-for']?.includes('script') &&
205
- !validated.csp?.directives?.['trusted-types']?.includes('svelte-trusted-html')
206
- ) {
207
- throw new Error(
208
- "The `csp.directives['trusted-types']` option must include 'svelte-trusted-html'"
209
- );
203
+ if (typeof config.adapter?.vite === 'function') {
204
+ validated.adapter.vite = config.adapter.vite({
205
+ config: validated
206
+ });
210
207
  }
211
208
 
212
209
  return validated;
package/src/core/env.js CHANGED
@@ -5,6 +5,7 @@ import path from 'node:path';
5
5
  import * as devalue from 'devalue';
6
6
  import { dedent } from './sync/utils.js';
7
7
  import { get_global_name, runtime_directory } from './utils.js';
8
+ import { stackless } from '../utils/error.js';
8
9
  import { resolve_entry } from '../utils/filesystem.js';
9
10
  import { handle_issues, validate } from '../exports/internal/env.js';
10
11
  import { get_config_aliases } from '../exports/vite/utils.js';
@@ -22,7 +23,9 @@ import { posixify } from '../utils/os.js';
22
23
  * @returns {string | null}
23
24
  */
24
25
  export function resolve_env_entry(config, root) {
25
- return resolve_entry(path.resolve(root, config.files.src, 'env'));
26
+ const entry = resolve_entry(path.resolve(root, config.files.src, 'env'));
27
+ // posix, like the paths Vite hands to `hotUpdate`
28
+ return entry && posixify(entry);
26
29
  }
27
30
 
28
31
  /**
@@ -35,6 +38,8 @@ export function resolve_env_entry(config, root) {
35
38
  export async function load_explicit_env(kit, file, root, mode) {
36
39
  /** @type {Set<string>} */
37
40
  const deps = new Set();
41
+ /** @type {Map<EnvType, string>} */
42
+ const env_importers = new Map();
38
43
 
39
44
  if (!file) {
40
45
  return { variables: null, deps };
@@ -62,6 +67,16 @@ export async function load_explicit_env(kit, file, root, mode) {
62
67
  plugins: [
63
68
  {
64
69
  name: 'dependency-scanner',
70
+ enforce: 'pre',
71
+ resolveId(id, importer) {
72
+ const prefixes = ['$app/env/', `${runtime_directory}/app/env/`];
73
+ const prefix = prefixes.find((prefix) => id.startsWith(prefix));
74
+ const type = prefix && id.slice(prefix.length);
75
+
76
+ if (importer && (type === 'private' || type === 'public')) {
77
+ env_importers.set(type, importer);
78
+ }
79
+ },
65
80
  load(id) {
66
81
  deps.add(id);
67
82
  }
@@ -94,14 +109,27 @@ export async function load_explicit_env(kit, file, root, mode) {
94
109
  } catch (e) {
95
110
  const error = /** @type {any} */ (e || {});
96
111
 
97
- if (
98
- error.code === 'ERR_MODULE_NOT_FOUND' &&
99
- error.message?.includes(`Cannot find module '$app`)
100
- ) {
101
- throw new Error(
102
- `Cannot import \`$app/*\` modules other than \`$app/env\` inside \`src/env\``,
103
- { cause: e }
112
+ if (error.code === 'ERR_MODULE_NOT_FOUND') {
113
+ const match = error.message?.match(
114
+ /<sveltekit:generated>\/env\/(private|public)\/server\.js/
104
115
  );
116
+
117
+ if (match) {
118
+ const type = /** @type {EnvType} */ (match[1]);
119
+ const importer = env_importers.get(type);
120
+ const message = importer
121
+ ? `Module \`${posixify(path.relative(root, importer))}\` imports \`$app/env/${type}\`, which creates a circular dependency with \`src/env\``
122
+ : `Cannot import \`$app/env/${type}\` inside \`src/env\` or its dependencies because it creates a circular dependency`;
123
+
124
+ throw stackless(message);
125
+ }
126
+
127
+ if (error.message?.includes(`Cannot find module '$app`)) {
128
+ throw new Error(
129
+ `Cannot import \`$app/*\` modules other than \`$app/env\` inside \`src/env\``,
130
+ { cause: e }
131
+ );
132
+ }
105
133
  }
106
134
 
107
135
  throw error;
@@ -1,4 +1,4 @@
1
- /** @import { RemoteChunk } from 'types' */
1
+ /** @import { BuildData, RemoteChunk, RouteData } from 'types' */
2
2
  import fs from 'node:fs';
3
3
  import path from 'node:path';
4
4
  import { lookup as mime_lookup } from '../../utils/mime.js';
@@ -15,10 +15,10 @@ import { uneval } from 'devalue';
15
15
  * Generates the data used to write the server-side manifest.js file. This data is used in the Vite
16
16
  * build process, to power routing, etc.
17
17
  * @param {{
18
- * build_data: import('types').BuildData;
18
+ * build_data: BuildData;
19
19
  * prerendered: string[];
20
20
  * relative_path: string;
21
- * routes: import('types').RouteData[];
21
+ * routes: RouteData[];
22
22
  * remotes: RemoteChunk[];
23
23
  * root: string;
24
24
  * }} opts
@@ -102,49 +102,48 @@ export function generate_manifest({
102
102
 
103
103
  // prettier-ignore
104
104
  // String representation of
105
- /** @template {import('@sveltejs/kit').SSRManifest} T */
105
+ /** @template {import('types').SSRManifest} T */
106
106
  const manifest_expr = dedent`
107
107
  {
108
- appDir: ${s(build_data.app_dir)},
109
- appPath: ${s(build_data.app_path)},
108
+ app_dir: ${s(build_data.app_dir)},
109
+ app_path: ${s(build_data.app_path)},
110
110
  assets: new Set(${s(assets)}),
111
- mimeTypes: ${s(mime_types)},
112
- _: {
113
- client: ${uneval(build_data.client)},
114
- nodes: [
115
- ${(node_paths).map(loader).join(',\n')}
116
- ],
117
- remotes: {
118
- ${remotes.map((remote) => `'${remote.hash}': ${loader(join_relative(relative_path, `chunks/remote-${remote.hash}.js`))}`).join(',\n')}
119
- },
120
- routes: [
121
- ${routes.map(route => {
122
- if (!route.page && !route.endpoint) return;
123
-
124
- return dedent`
125
- {
126
- id: ${s(route.id)},
127
- pattern: ${route.pattern},
128
- params: ${s(route.params)},
129
- page: ${route.page ? `{ layouts: ${get_nodes(route.page.layouts)}, errors: ${get_nodes(route.page.errors)}, leaf: ${reindexed.get(route.page.leaf)} }` : 'null'},
130
- endpoint: ${route.endpoint ? loader(join_relative(relative_path, resolve_symlinks(build_data.server_manifest, route.endpoint.file, root).chunk.file)) : 'null'}
131
- }
132
- `;
133
- }).filter(Boolean).join(',\n')}
134
- ],
135
- prerendered_routes: new Set(${s(prerendered)}),
136
- matchers: async () => {
137
- ${
138
- uses_matchers && build_data.manifest_data.params
139
- ? dedent`
140
- const { params } = await import('${join_relative(relative_path, '/entries/params.js')}');
141
- return params;
142
- `
143
- : 'return {};'
144
- }
145
- },
146
- server_assets: ${s(files)}
147
- }
111
+ mime_types: ${s(mime_types)},
112
+ client: ${uneval(build_data.client)},
113
+
114
+ nodes: [
115
+ ${(node_paths).map(loader).join(',\n')}
116
+ ],
117
+ remotes: {
118
+ ${remotes.map((remote) => `'${remote.hash}': ${loader(join_relative(relative_path, `chunks/remote-${remote.hash}.js`))}`).join(',\n')}
119
+ },
120
+ routes: [
121
+ ${routes.map(route => {
122
+ if (!route.page && !route.endpoint) return;
123
+
124
+ return dedent`
125
+ {
126
+ id: ${s(route.id)},
127
+ pattern: ${route.pattern},
128
+ params: ${s(route.params)},
129
+ page: ${route.page ? `{ layouts: ${get_nodes(route.page.layouts)}, errors: ${get_nodes(route.page.errors)}, leaf: ${reindexed.get(route.page.leaf)} }` : 'null'},
130
+ endpoint: ${route.endpoint ? loader(join_relative(relative_path, resolve_symlinks(build_data.server_manifest, route.endpoint.file, root).chunk.file)) : 'null'}
131
+ }
132
+ `;
133
+ }).filter(Boolean).join(',\n')}
134
+ ],
135
+ prerendered_routes: new Set(${s(prerendered)}),
136
+ matchers: async () => {
137
+ ${
138
+ uses_matchers && build_data.manifest_data.params
139
+ ? dedent`
140
+ const { params } = await import('${join_relative(relative_path, '/entries/params.js')}');
141
+ return params;
142
+ `
143
+ : 'return {};'
144
+ }
145
+ },
146
+ server_assets: ${s(files)}
148
147
  }
149
148
  `;
150
149
 
@@ -34,7 +34,7 @@ async function analyse({
34
34
  remotes,
35
35
  vite_config_file
36
36
  }) {
37
- /** @type {import('@sveltejs/kit').SSRManifest} */
37
+ /** @type {import('types').SSRManifest} */
38
38
  const manifest = (await import(pathToFileURL(manifest_path).href)).manifest;
39
39
 
40
40
  const vite_config = await load_vite_config(vite_config_file);
@@ -65,7 +65,7 @@ async function analyse({
65
65
  remotes: new Map()
66
66
  };
67
67
 
68
- const nodes = await Promise.all(manifest._.nodes.map((loader) => loader()));
68
+ const nodes = await Promise.all(manifest.nodes.map((loader) => loader()));
69
69
 
70
70
  // analyse nodes
71
71
  for (const node of nodes) {
@@ -88,7 +88,7 @@ async function analyse({
88
88
  }
89
89
 
90
90
  // analyse routes
91
- for (const route of manifest._.routes) {
91
+ for (const route of manifest.routes) {
92
92
  const page =
93
93
  route.page &&
94
94
  analyse_page(
@@ -147,7 +147,7 @@ async function analyse({
147
147
 
148
148
  // analyse remotes
149
149
  for (const remote of remotes) {
150
- const loader = manifest._.remotes[remote.hash];
150
+ const loader = manifest.remotes[remote.hash];
151
151
  const { default: functions } = await loader();
152
152
 
153
153
  const exports = new Map();
@@ -24,7 +24,7 @@ async function generate_fallback({ manifest_path, env, out_dir, origin, assets }
24
24
  /** @type {import('types').ServerModule} */
25
25
  const { Server } = await import(pathToFileURL(`${server_root}/server/index.js`).href);
26
26
 
27
- /** @type {import('@sveltejs/kit').SSRManifest} */
27
+ /** @type {import('types').SSRManifest} */
28
28
  const manifest = (await import(pathToFileURL(manifest_path).href)).manifest;
29
29
 
30
30
  set_building();
@@ -48,7 +48,7 @@ async function prerender({
48
48
  vite_config_file,
49
49
  is_tty
50
50
  }) {
51
- /** @type {import('@sveltejs/kit').SSRManifest} */
51
+ /** @type {import('types').SSRManifest} */
52
52
  const manifest = (await import(pathToFileURL(manifest_path).href)).manifest;
53
53
 
54
54
  /** @type {import('types').ServerInternalModule} */
@@ -659,7 +659,7 @@ async function prerender({
659
659
  /** @type {Array<import('types').RemotePrerenderInternals>} */
660
660
  const prerender_functions = [];
661
661
 
662
- for (const loader of Object.values(manifest._.remotes)) {
662
+ for (const loader of Object.values(manifest.remotes)) {
663
663
  const module = await loader();
664
664
 
665
665
  for (const fn of Object.values(module.default)) {
@@ -82,7 +82,6 @@ export function create_assets(config) {
82
82
 
83
83
  return [...walk(config.files.assets)].map((file) => ({
84
84
  file,
85
- size: fs.statSync(path.resolve(config.files.assets, file)).size,
86
85
  type: lookup(file) || null
87
86
  }));
88
87
  }
@@ -1,4 +1,5 @@
1
1
  /** @import { Asset, ManifestData, RouteData } from 'types' */
2
+ /** @import { ManifestRoute } from '$app/manifest' */
2
3
 
3
4
  import { s } from '../../utils/misc.js';
4
5
  import { is_app_route, is_endpoint_route, is_page_route } from './create_manifest_data/index.js';
@@ -60,11 +61,11 @@ function stringify_assets(assets) {
60
61
 
61
62
  /**
62
63
  * @param {RouteData[] | undefined} routes
63
- * @returns {Array<{ id: string; page: boolean; endpoint: boolean }>}
64
+ * @returns {ManifestRoute[]}
64
65
  */
65
66
  export function get_manifest_routes(routes) {
66
67
  return (
67
- routes?.filter(is_app_route).map((route) => ({
68
+ routes?.filter(is_app_route).map((route) => /** @type {ManifestRoute} */ ({
68
69
  id: route.id,
69
70
  page: is_page_route(route),
70
71
  endpoint: is_endpoint_route(route)