@sveltejs/kit 3.0.0-next.24 → 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 (71) hide show
  1. package/package.json +16 -10
  2. package/src/constants.js +6 -0
  3. package/src/core/adapt/builder.js +128 -33
  4. package/src/core/adapt/index.js +3 -0
  5. package/src/core/config/index.js +4 -7
  6. package/src/core/env.js +39 -14
  7. package/src/core/generate_manifest/index.js +42 -43
  8. package/src/core/postbuild/analyse.js +4 -4
  9. package/src/core/postbuild/fallback.js +1 -1
  10. package/src/core/postbuild/prerender.js +4 -4
  11. package/src/core/sync/create_manifest_data/index.js +0 -1
  12. package/src/core/sync/write_app_manifest.js +3 -2
  13. package/src/core/sync/write_server.js +3 -17
  14. package/src/core/utils.js +10 -0
  15. package/src/exports/adapter.js +22 -0
  16. package/src/exports/public.d.ts +101 -49
  17. package/src/exports/vite/build/index.js +1173 -0
  18. package/src/exports/vite/build/remote.js +4 -4
  19. package/src/exports/vite/build/service-worker.js +98 -0
  20. package/src/exports/vite/dev/generate_manifest.js +308 -0
  21. package/src/exports/vite/dev/index.js +40 -282
  22. package/src/exports/vite/index.js +156 -1717
  23. package/src/exports/vite/plugins/env-vars.js +53 -34
  24. package/src/exports/vite/plugins/guard.js +217 -0
  25. package/src/exports/vite/plugins/remote.js +237 -0
  26. package/src/exports/vite/preview/index.js +8 -8
  27. package/src/exports/vite/static_analysis/index.js +15 -15
  28. package/src/exports/vite/utils.js +98 -1
  29. package/src/runner.js +4 -3
  30. package/src/runtime/app/paths/server.js +2 -2
  31. package/src/runtime/app/server/index.js +3 -3
  32. package/src/runtime/app/server/public.d.ts +114 -57
  33. package/src/runtime/app/server/remote/query.js +2 -2
  34. package/src/runtime/app/server/remote/requested.js +31 -15
  35. package/src/runtime/app/state/client.svelte.js +3 -1
  36. package/src/runtime/client/client.js +43 -198
  37. package/src/runtime/client/fetcher.js +6 -6
  38. package/src/runtime/client/focus.js +120 -0
  39. package/src/runtime/client/remote-functions/command.svelte.js +20 -9
  40. package/src/runtime/client/remote-functions/form.svelte.js +12 -7
  41. package/src/runtime/client/remote-functions/query/instance.svelte.js +19 -5
  42. package/src/runtime/client/remote-functions/shared.svelte.js +22 -1
  43. package/src/runtime/client/scroll.js +39 -0
  44. package/src/runtime/client/utils.js +28 -0
  45. package/src/runtime/form-utils.js +254 -264
  46. package/src/runtime/server/data/index.js +14 -36
  47. package/src/runtime/server/errors.js +7 -10
  48. package/src/runtime/server/fetch.js +21 -25
  49. package/src/runtime/server/index.js +35 -31
  50. package/src/runtime/server/internal.js +34 -5
  51. package/src/runtime/server/page/actions.js +6 -8
  52. package/src/runtime/server/page/data_serializer.js +6 -10
  53. package/src/runtime/server/page/index.js +18 -28
  54. package/src/runtime/server/page/load_data.js +2 -2
  55. package/src/runtime/server/page/render.js +22 -40
  56. package/src/runtime/server/page/respond_with_error.js +10 -13
  57. package/src/runtime/server/page/server_routing.js +21 -27
  58. package/src/runtime/server/remote-functions.js +136 -136
  59. package/src/runtime/server/respond.js +66 -64
  60. package/src/runtime/server/state.js +2 -0
  61. package/src/runtime/server/utils.js +4 -11
  62. package/src/runtime/shared.js +9 -0
  63. package/src/runtime/utils.js +41 -0
  64. package/src/types/ambient-private.d.ts +1 -2
  65. package/src/types/global-private.d.ts +8 -0
  66. package/src/types/internal.d.ts +56 -17
  67. package/src/utils/filesystem.js +44 -28
  68. package/src/utils/streaming.js +5 -15
  69. package/src/version.js +1 -1
  70. package/types/index.d.ts +235 -93
  71. package/types/index.d.ts.map +9 -2
@@ -1,5 +1,5 @@
1
- /** @import { RequestEvent, SSRManifest } from '@sveltejs/kit' */
2
- /** @import { PageNodeIndexes, RequestState, RequiredResolveOptions, ServerDataNode, SSRNode, SSROptions } from 'types' */
1
+ /** @import { RequestEvent } from '@sveltejs/kit' */
2
+ /** @import { PageNodeIndexes, RequestState, RequiredResolveOptions, ServerDataNode, SSRNode } from 'types' */
3
3
  import { text } from '@sveltejs/kit';
4
4
  import { Redirect } from '@sveltejs/kit/internal';
5
5
  import { compact } from '../../../utils/array.js';
@@ -8,6 +8,7 @@ import { noop } from '../../../utils/functions.js';
8
8
  import { add_data_suffix } from '../../pathname.js';
9
9
  import { build_error_chain, nearest_error_pages } from '../../error-chain.js';
10
10
  import { redirect_response } from '../utils.js';
11
+ import { manifest } from '../internal.js';
11
12
  import { static_error_page, handle_error_and_jsonify } from '../errors.js';
12
13
  import {
13
14
  handle_action_json_request,
@@ -32,13 +33,11 @@ const MAX_DEPTH = 10;
32
33
  * @param {RequestEvent} event
33
34
  * @param {RequestState} state
34
35
  * @param {PageNodeIndexes} page
35
- * @param {SSROptions} options
36
- * @param {SSRManifest} manifest
37
36
  * @param {import('../../../utils/page_nodes.js').PageNodes} nodes
38
37
  * @param {RequiredResolveOptions} resolve_opts
39
38
  * @returns {Promise<Response>}
40
39
  */
41
- export async function render_page(event, state, page, options, manifest, nodes, resolve_opts) {
40
+ export async function render_page(event, state, page, nodes, resolve_opts) {
42
41
  if (state.depth > MAX_DEPTH) {
43
42
  // infinite request cycle detected
44
43
  return text(`Not found: ${event.url.pathname}`, {
@@ -47,8 +46,8 @@ export async function render_page(event, state, page, options, manifest, nodes,
47
46
  }
48
47
 
49
48
  if (is_action_json_request(event)) {
50
- const node = await manifest._.nodes[page.leaf]();
51
- return handle_action_json_request(event, state, options, node?.server);
49
+ const node = await manifest.nodes[page.leaf]();
50
+ return handle_action_json_request(event, state, node?.server);
52
51
  }
53
52
 
54
53
  try {
@@ -62,7 +61,7 @@ export async function render_page(event, state, page, options, manifest, nodes,
62
61
  if (is_action_request(event)) {
63
62
  const remote_id = get_remote_action(event.url);
64
63
  if (remote_id) {
65
- action_result = await handle_remote_form_post(event, state, manifest, remote_id);
64
+ action_result = await handle_remote_form_post(event, state, remote_id);
66
65
  } else {
67
66
  // for action requests, first call handler in +page.server.js
68
67
  // (this also determines status code)
@@ -150,10 +149,8 @@ export async function render_page(event, state, page, options, manifest, nodes,
150
149
  error: null,
151
150
  event,
152
151
  state,
153
- options,
154
- manifest,
155
152
  resolve_opts,
156
- data_serializer: server_data_serializer(event, state, options)
153
+ data_serializer: server_data_serializer(event, state)
157
154
  });
158
155
  }
159
156
 
@@ -163,10 +160,10 @@ export async function render_page(event, state, page, options, manifest, nodes,
163
160
  /** @type {Error | null} */
164
161
  let load_error = null;
165
162
 
166
- const data_serializer = server_data_serializer(event, state, options);
163
+ const data_serializer = server_data_serializer(event, state);
167
164
  const data_serializer_json =
168
165
  (state.prerendering || state.prerender_default === true) && should_prerender_data
169
- ? server_data_serializer_json(event, state, options)
166
+ ? server_data_serializer_json(event, state)
170
167
  : null;
171
168
 
172
169
  /** @type {Array<Promise<ServerDataNode | null>>} */
@@ -274,11 +271,11 @@ export async function render_page(event, state, page, options, manifest, nodes,
274
271
  return redirect_response(err.status, err.location);
275
272
  }
276
273
 
277
- const error = await handle_error_and_jsonify(event, state, options, err);
274
+ const error = await handle_error_and_jsonify(event, state, err);
278
275
  const status = error.status;
279
276
 
280
277
  for (const { error: index, idx } of nearest_error_pages(i, branch, page.errors)) {
281
- const node = await manifest._.nodes[index]();
278
+ const node = await manifest.nodes[index]();
282
279
 
283
280
  data_serializer.set_max_nodes(idx);
284
281
 
@@ -293,8 +290,6 @@ export async function render_page(event, state, page, options, manifest, nodes,
293
290
  return await render_response({
294
291
  event,
295
292
  state,
296
- options,
297
- manifest,
298
293
  resolve_opts,
299
294
  page_config: {
300
295
  ssr: nodes.ssr(),
@@ -302,7 +297,7 @@ export async function render_page(event, state, page, options, manifest, nodes,
302
297
  },
303
298
  status,
304
299
  error,
305
- error_components: await load_error_components(ssr, error_branch, page, manifest),
300
+ error_components: await load_error_components(ssr, error_branch, page),
306
301
  branch: error_branch,
307
302
  fetched,
308
303
  data_serializer
@@ -311,7 +306,7 @@ export async function render_page(event, state, page, options, manifest, nodes,
311
306
 
312
307
  // if we're still here, it means the error happened in the root layout,
313
308
  // which means we have to fall back to error.html
314
- return static_error_page(options, status, error.message);
309
+ return static_error_page(status, error.message);
315
310
  }
316
311
  } else {
317
312
  // push an empty slot so we can rewind past gaps to the
@@ -339,8 +334,6 @@ export async function render_page(event, state, page, options, manifest, nodes,
339
334
  return await render_response({
340
335
  event,
341
336
  state,
342
- options,
343
- manifest,
344
337
  resolve_opts,
345
338
  page_config: {
346
339
  csr,
@@ -351,8 +344,8 @@ export async function render_page(event, state, page, options, manifest, nodes,
351
344
  branch: compact(branch),
352
345
  action_result,
353
346
  fetched,
354
- data_serializer: !ssr ? server_data_serializer(event, state, options) : data_serializer,
355
- error_components: await load_error_components(ssr, branch, page, manifest)
347
+ data_serializer: !ssr ? server_data_serializer(event, state) : data_serializer,
348
+ error_components: await load_error_components(ssr, branch, page)
356
349
  });
357
350
  } catch (e) {
358
351
  // a remote function could have thrown a redirect during render
@@ -365,8 +358,6 @@ export async function render_page(event, state, page, options, manifest, nodes,
365
358
  return await respond_with_error({
366
359
  event,
367
360
  state,
368
- options,
369
- manifest,
370
361
  error: e,
371
362
  resolve_opts
372
363
  });
@@ -377,12 +368,11 @@ export async function render_page(event, state, page, options, manifest, nodes,
377
368
  * @param {boolean} ssr
378
369
  * @param {Array<import('./types.js').Loaded | null>} branch
379
370
  * @param {PageNodeIndexes} page
380
- * @param {SSRManifest} manifest
381
371
  */
382
- function load_error_components(ssr, branch, page, manifest) {
372
+ function load_error_components(ssr, branch, page) {
383
373
  if (!ssr) return undefined;
384
374
 
385
375
  return build_error_chain(branch, page.errors, (idx) =>
386
- manifest._.nodes[idx]?.().then((e) => e.component?.())
376
+ manifest.nodes[idx]?.().then((e) => e.component?.())
387
377
  );
388
378
  }
@@ -1,7 +1,7 @@
1
1
  import { DEV } from 'esm-env';
2
2
  import { noop } from '../../../utils/functions.js';
3
3
  import { disable_search, make_trackable } from '../../../utils/url.js';
4
- import { validate_depends, validate_load_response } from '../../shared.js';
4
+ import { fetch_cache_url, validate_depends, validate_load_response } from '../../shared.js';
5
5
  import { with_request_store, merge_tracing, record_span } from '@sveltejs/kit/internal/server';
6
6
  import { base64_encode } from '../../utils.js';
7
7
  import { NULL_BODY_STATUS } from '../constants.js';
@@ -344,7 +344,7 @@ export function create_universal_fetch(event, prerendering, fetched, csr, resolv
344
344
  }
345
345
 
346
346
  fetched.push({
347
- url: same_origin ? url.href.slice(event.url.origin.length) : url.href,
347
+ url: fetch_cache_url(url, event.url),
348
348
  method: event.request.method,
349
349
  request_body: /** @type {string | ArrayBufferView | null | undefined} */ (request_body),
350
350
  request_headers: cloned_headers,
@@ -1,4 +1,5 @@
1
1
  /** @import { Component } from 'svelte'; */
2
+ /** @import { SyncRenderOutput } from 'svelte/server' */
2
3
  import * as devalue from 'devalue';
3
4
  import { DEV } from 'esm-env';
4
5
  import { isRedirect, text } from '@sveltejs/kit';
@@ -18,8 +19,8 @@ import {
18
19
  route_id_resolution_pathname
19
20
  } from '../../pathname.js';
20
21
  import { try_get_request_store, with_request_store } from '@sveltejs/kit/internal/server';
21
- import { text_encoder } from '../../utils.js';
22
- import { count_non_ssi_comments, get_global_name } from '../utils.js';
22
+ import { stream_text } from '../../utils.js';
23
+ import { count_non_ssi_comments } from '../utils.js';
23
24
  import { handle_error_and_jsonify } from '../errors.js';
24
25
  import * as env from '<sveltekit:generated>/env/config.js';
25
26
  import { collect_remote_data } from '../remote-functions.js';
@@ -27,6 +28,7 @@ import Root from '../../components/root.svelte';
27
28
  import { render } from 'svelte/server';
28
29
  import { Props, RenderNode } from '../../props.svelte.js';
29
30
  import { has_custom_transporters, uneval } from '#app/internal/transport';
31
+ import { manifest, options } from '../internal.js';
30
32
 
31
33
  // TODO rename this function/module
32
34
 
@@ -35,8 +37,6 @@ import { has_custom_transporters, uneval } from '#app/internal/transport';
35
37
  * @param {{
36
38
  * branch: Array<import('./types.js').Loaded>;
37
39
  * fetched: Array<import('./types.js').Fetched>;
38
- * options: import('types').SSROptions;
39
- * manifest: import('@sveltejs/kit').SSRManifest;
40
40
  * page_config: { ssr: boolean; csr: boolean };
41
41
  * status: number;
42
42
  * error: App.Error | null;
@@ -51,8 +51,6 @@ import { has_custom_transporters, uneval } from '#app/internal/transport';
51
51
  export async function render_response({
52
52
  branch,
53
53
  fetched,
54
- options,
55
- manifest,
56
54
  page_config,
57
55
  status,
58
56
  error = null,
@@ -73,7 +71,7 @@ export async function render_response({
73
71
  }
74
72
  }
75
73
 
76
- const { client } = manifest._;
74
+ const client = manifest.client;
77
75
 
78
76
  const modulepreloads = new Set(client?.imports);
79
77
  const stylesheets = new Set(client?.stylesheets);
@@ -91,8 +89,7 @@ export async function render_response({
91
89
  // TODO if we add a client entry point one day, we will need to include inline_styles with the entry, otherwise stylesheets will be linked even if they are below inlineStyleThreshold
92
90
  const inline_styles = new Map();
93
91
 
94
- // TODO `svelte/server` should expose `RenderOutput`
95
- /** @type {Omit<Awaited<ReturnType<typeof render>>, 'html'>} */
92
+ /** @type {Omit<SyncRenderOutput, 'html'>} */
96
93
  let rendered;
97
94
 
98
95
  const form_value =
@@ -134,7 +131,7 @@ export async function render_response({
134
131
  if (!paths.assets || (paths.assets[0] === '/' && paths.assets !== SVELTE_KIT_ASSETS)) {
135
132
  assets = base;
136
133
  }
137
- } else if (options.hash_routing) {
134
+ } else if (__SVELTEKIT_HASH_ROUTING__) {
138
135
  // we have to assume that we're in the right place
139
136
  base_expression = "new URL('.', location).pathname.slice(0, -1)";
140
137
  }
@@ -203,7 +200,7 @@ export async function render_response({
203
200
  throw e;
204
201
  }
205
202
 
206
- const handled = handle_error_and_jsonify(event, render_state, options, e);
203
+ const handled = handle_error_and_jsonify(event, render_state, e);
207
204
 
208
205
  // TODO 4.0 make this an async function and await `handled`
209
206
  if (handled instanceof Promise) {
@@ -287,7 +284,7 @@ export async function render_response({
287
284
  // Vite makes the start script available through the base path and without it.
288
285
  // We load it via the base path in order to support remote IDE environments which proxy
289
286
  // all URLs under the base path during development.
290
- return paths.base + path;
287
+ return relative ? `${base}/${path.slice(1)}` : paths.base + path;
291
288
  }
292
289
  return `${assets}/${path}`;
293
290
  };
@@ -312,7 +309,10 @@ export async function render_response({
312
309
  * @param {string[]} attributes
313
310
  */
314
311
  const add_preload = (path, attributes) => {
315
- if (options.link_header_preload && !(state.prerendering || state.prerender_default === true)) {
312
+ if (
313
+ __SVELTEKIT_LINK_HEADER_PRELOAD__ &&
314
+ !(state.prerendering || state.prerender_default === true)
315
+ ) {
316
316
  link_headers.add(`<${encodeURI(path)}>; ${attributes.join('; ')}; nopush`);
317
317
  } else {
318
318
  head.add_link_tag(path, attributes);
@@ -329,7 +329,7 @@ export async function render_response({
329
329
  // include them in disabled state so that Vite can detect them and doesn't try to add them
330
330
  attributes.push('disabled', 'media="(max-width: 0)"');
331
331
  } else {
332
- if (options.link_header_preload && resolve_opts.preload({ type: 'css', path })) {
332
+ if (__SVELTEKIT_LINK_HEADER_PRELOAD__ && resolve_opts.preload({ type: 'css', path })) {
333
333
  link_headers.add(`<${encodeURI(path)}>; rel="preload"; as="style"; nopush`);
334
334
  }
335
335
  }
@@ -347,7 +347,7 @@ export async function render_response({
347
347
  }
348
348
  }
349
349
 
350
- const global = get_global_name(options);
350
+ const global = __SVELTEKIT_GLOBAL_NAME__;
351
351
  const { data, chunks } = data_serializer.get_data(csp);
352
352
 
353
353
  if (page_config.ssr && page_config.csr) {
@@ -509,7 +509,7 @@ export async function render_response({
509
509
  ); // make output after it's put together with the rest more readable
510
510
  hydrate.push(`params: ${devalue.uneval(event.params)}`, `server_route: ${stringified}`);
511
511
  }
512
- } else if (options.embedded) {
512
+ } else if (__SVELTEKIT_EMBEDDED__) {
513
513
  hydrate.push(`params: ${devalue.uneval(event.params)}`, `route: ${s(event.route)}`);
514
514
  }
515
515
 
@@ -517,7 +517,7 @@ export async function render_response({
517
517
  args.push(`{\n${indent}\t${hydrate.join(`,\n${indent}\t`)}\n${indent}}`);
518
518
  }
519
519
 
520
- const remote_data = await collect_remote_data({}, event, state, options);
520
+ const remote_data = await collect_remote_data({}, event, state);
521
521
 
522
522
  const serialized_data =
523
523
  Object.keys(remote_data).length > 0
@@ -549,7 +549,7 @@ export async function render_response({
549
549
  blocks.push(boot);
550
550
  }
551
551
 
552
- if (options.service_worker) {
552
+ if (__SVELTEKIT_SERVICE_WORKER__) {
553
553
  let opts = ", { type: 'module' }";
554
554
  if (options.service_worker_options != null) {
555
555
  const service_worker_options = { ...options.service_worker_options, type: 'module' };
@@ -610,7 +610,7 @@ export async function render_response({
610
610
  headers.set('content-security-policy-report-only', report_only_header);
611
611
  }
612
612
 
613
- if (options.link_header_preload && link_headers.size) {
613
+ if (__SVELTEKIT_LINK_HEADER_PRELOAD__ && link_headers.size) {
614
614
  headers.set('link', Array.from(link_headers).join(', '));
615
615
  }
616
616
  }
@@ -652,27 +652,9 @@ export async function render_response({
652
652
  }
653
653
  }
654
654
 
655
- return !chunks
656
- ? text(transformed, {
657
- status,
658
- headers
659
- })
660
- : new Response(
661
- new ReadableStream({
662
- async start(controller) {
663
- controller.enqueue(text_encoder.encode(transformed + '\n'));
664
- for await (const chunk of chunks) {
665
- if (chunk.length) controller.enqueue(text_encoder.encode(chunk));
666
- }
667
- controller.close();
668
- },
669
-
670
- type: 'bytes'
671
- }),
672
- {
673
- headers
674
- }
675
- );
655
+ return chunks
656
+ ? new Response(stream_text(transformed + '\n', chunks), { status, headers })
657
+ : text(transformed, { status, headers });
676
658
  }
677
659
 
678
660
  class Head {
@@ -5,6 +5,7 @@ import { redirect_response } from '../utils.js';
5
5
  import { handle_error_and_jsonify, static_error_page } from '../errors.js';
6
6
  import { PageNodes } from '../../../utils/page_nodes.js';
7
7
  import { server_data_serializer } from './data_serializer.js';
8
+ import { manifest } from '../internal.js';
8
9
 
9
10
  /**
10
11
  * @typedef {import('./types.js').Loaded} Loaded
@@ -14,30 +15,28 @@ import { server_data_serializer } from './data_serializer.js';
14
15
  * @param {{
15
16
  * event: import('@sveltejs/kit').RequestEvent;
16
17
  * state: import('types').RequestState;
17
- * options: import('types').SSROptions;
18
- * manifest: import('@sveltejs/kit').SSRManifest;
19
18
  * error: unknown;
20
19
  * resolve_opts: import('types').RequiredResolveOptions;
21
20
  * }} opts
22
21
  */
23
- export async function respond_with_error({ event, state, options, manifest, error, resolve_opts }) {
22
+ export async function respond_with_error({ event, state, error, resolve_opts }) {
24
23
  // reroute to the fallback page to prevent an infinite chain of requests.
25
24
  if (event.request.headers.get('x-sveltekit-error')) {
26
- const transformed = await handle_error_and_jsonify(event, state, options, error);
27
- return static_error_page(options, transformed.status, transformed.message);
25
+ const transformed = await handle_error_and_jsonify(event, state, error);
26
+ return static_error_page(transformed.status, transformed.message);
28
27
  }
29
28
 
30
29
  /** @type {import('./types.js').Fetched[]} */
31
30
  const fetched = [];
32
31
  try {
33
32
  const branch = [];
34
- const default_layout = await manifest._.nodes[0](); // 0 is always the root layout
33
+ const default_layout = await manifest.nodes[0](); // 0 is always the root layout
35
34
  const nodes = new PageNodes([default_layout]);
36
35
  const ssr = nodes.ssr();
37
36
  const csr = nodes.csr();
38
- const data_serializer = server_data_serializer(event, state, options);
37
+ const data_serializer = server_data_serializer(event, state);
39
38
  // Do this here first in case the awaits below before rendering themselves error
40
- const transformed = await handle_error_and_jsonify(event, state, options, error);
39
+ const transformed = await handle_error_and_jsonify(event, state, error);
41
40
 
42
41
  if (ssr) {
43
42
  state.error = true;
@@ -72,7 +71,7 @@ export async function respond_with_error({ event, state, options, manifest, erro
72
71
  data
73
72
  },
74
73
  {
75
- node: await manifest._.nodes[1](), // 1 is always the root error
74
+ node: await manifest.nodes[1](), // 1 is always the root error
76
75
  data: null,
77
76
  server_data: null
78
77
  }
@@ -80,8 +79,6 @@ export async function respond_with_error({ event, state, options, manifest, erro
80
79
  }
81
80
 
82
81
  return await render_response({
83
- options,
84
- manifest,
85
82
  page_config: {
86
83
  ssr,
87
84
  csr
@@ -103,8 +100,8 @@ export async function respond_with_error({ event, state, options, manifest, erro
103
100
  return redirect_response(e.status, e.location);
104
101
  }
105
102
 
106
- const transformed = await handle_error_and_jsonify(event, state, options, e);
103
+ const transformed = await handle_error_and_jsonify(event, state, e);
107
104
 
108
- return static_error_page(options, transformed.status, transformed.message);
105
+ return static_error_page(transformed.status, transformed.message);
109
106
  }
110
107
  }
@@ -1,15 +1,16 @@
1
- /** @import { SSRManifest } from '@sveltejs/kit' */
1
+ /** @import { SSRManifest } from 'types' */
2
2
  import { base, assets } from '#app/paths';
3
3
  import { relative } from '$app/paths/internal/server';
4
4
  import { text } from '@sveltejs/kit';
5
5
  import { s } from '../../../utils/misc.js';
6
6
  import { find_route } from '../../../utils/routing.js';
7
7
  import { get_relative_path } from '../../utils.js';
8
+ import { manifest } from '../internal.js';
8
9
 
9
10
  /**
10
11
  * @param {import('types').SSRClientRoute} route
11
12
  * @param {URL} url
12
- * @param {NonNullable<SSRManifest['_']['client']>} client
13
+ * @param {NonNullable<SSRManifest['client']>} client
13
14
  * @returns {string}
14
15
  */
15
16
  export function generate_route_object(route, url, client) {
@@ -38,23 +39,18 @@ export function generate_route_object(route, url, client) {
38
39
  function create_client_import(import_path, url) {
39
40
  if (!import_path) return 'Promise.resolve({})';
40
41
 
41
- // During DEV, Vite will make the paths absolute (e.g. /@fs/...)
42
- if (import_path[0] === '/') {
43
- return `import('${import_path}')`;
44
- }
45
-
46
42
  // During PROD, they're root-relative
47
- if (assets !== '') {
43
+ if (assets !== '' && import_path[0] !== '/') {
48
44
  return `import('${assets}/${import_path}')`;
49
45
  }
50
46
 
51
- if (!relative) {
52
- return `import('${base}/${import_path}')`;
53
- }
47
+ // During DEV, Vite will make the paths absolute (e.g. /@fs/...)
48
+ const absolute = import_path[0] === '/' ? import_path : `${base}/${import_path}`;
49
+ if (!relative) return `import('${absolute}')`;
54
50
 
55
51
  // Else we make them relative to the server-side route resolution request
56
52
  // to support IPFS, the internet archive, etc.
57
- let path = get_relative_path(url.pathname, `${base}/${import_path}`);
53
+ let path = get_relative_path(url.pathname, absolute);
58
54
  if (path[0] !== '.') path = `./${path}`;
59
55
  return `import('${path}')`;
60
56
  }
@@ -62,23 +58,22 @@ function create_client_import(import_path, url) {
62
58
  /**
63
59
  * @param {string} resolved_path
64
60
  * @param {URL} url
65
- * @param {SSRManifest} manifest
66
61
  * @returns {Promise<Response>}
67
62
  */
68
- export async function resolve_route(resolved_path, url, manifest) {
69
- if (!manifest._.client?.routes) {
63
+ export async function resolve_route(resolved_path, url) {
64
+ if (!manifest.client?.routes) {
70
65
  return text('Server-side route resolution disabled', { status: 400 });
71
66
  }
72
67
 
73
68
  try {
74
- const matchers = await manifest._.matchers();
75
- const result = find_route(resolved_path, manifest._.client.routes, matchers);
69
+ const matchers = await manifest.matchers();
70
+ const result = find_route(resolved_path, manifest.client.routes, matchers);
76
71
 
77
72
  return create_server_routing_response(
78
73
  result?.route ?? null,
79
74
  result?.params ?? {},
80
75
  url,
81
- manifest._.client
76
+ manifest.client
82
77
  ).response;
83
78
  } catch {
84
79
  return text('Error resolving route', { status: 500 });
@@ -99,29 +94,28 @@ export async function resolve_route(resolved_path, url, manifest) {
99
94
  *
100
95
  * @param {string} route_id
101
96
  * @param {URL} url
102
- * @param {SSRManifest} manifest
103
97
  * @returns {Response}
104
98
  */
105
- export function resolve_route_by_id(route_id, url, manifest) {
106
- if (!manifest._.client?.routes) {
99
+ export function resolve_route_by_id(route_id, url) {
100
+ if (!manifest.client?.routes) {
107
101
  return text('Server-side route resolution disabled', { status: 400 });
108
102
  }
109
103
 
110
104
  try {
111
- const route = manifest._.client.routes.find((r) => r.id === route_id);
105
+ const route = manifest.client.routes.find((r) => r.id === route_id);
112
106
 
113
107
  if (route) {
114
- return create_server_routing_response(route, null, url, manifest._.client).response;
108
+ return create_server_routing_response(route, null, url, manifest.client).response;
115
109
  }
116
110
 
117
111
  // `client.routes` only contains routes with a `+page`, so a miss above doesn't mean the
118
112
  // route doesn't exist — it might be a `+server.js`-only route. `_.routes` includes those
119
113
  // (with `page: null`), so we can distinguish "exists but has no code" from "unknown".
120
- if (manifest._.routes.some((r) => r.id === route_id && !r.page)) {
114
+ if (manifest.routes.some((r) => r.id === route_id && !r.page)) {
121
115
  return text('export const endpoint_only = true;', { headers: js_headers() });
122
116
  }
123
117
 
124
- return create_server_routing_response(null, null, url, manifest._.client).response;
118
+ return create_server_routing_response(null, null, url, manifest.client).response;
125
119
  } catch {
126
120
  return text('Error resolving route', { status: 500 });
127
121
  }
@@ -137,7 +131,7 @@ function js_headers() {
137
131
  * @param {import('types').SSRClientRoute | null} route
138
132
  * @param {Partial<Record<string, string>> | null} params
139
133
  * @param {URL} url
140
- * @param {NonNullable<SSRManifest['_']['client']>} client
134
+ * @param {NonNullable<SSRManifest['client']>} client
141
135
  * @returns {{response: Response, body: string}}
142
136
  */
143
137
  export function create_server_routing_response(route, params, url, client) {
@@ -164,7 +158,7 @@ export function create_server_routing_response(route, params, url, client) {
164
158
  *
165
159
  * @param {import('types').SSRClientRoute} route
166
160
  * @param {URL} url
167
- * @param {NonNullable<SSRManifest['_']['client']>} client
161
+ * @param {NonNullable<SSRManifest['client']>} client
168
162
  * @returns {string}
169
163
  */
170
164
  function create_css_import(route, url, client) {