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

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 (105) hide show
  1. package/package.json +51 -8
  2. package/src/cli.js +3 -3
  3. package/src/constants.js +19 -1
  4. package/src/core/adapt/builder.js +3 -5
  5. package/src/core/env.js +137 -182
  6. package/src/core/postbuild/analyse.js +9 -4
  7. package/src/core/postbuild/prerender.js +5 -6
  8. package/src/core/sync/create_manifest_data/index.js +29 -33
  9. package/src/core/sync/sync.js +23 -40
  10. package/src/core/sync/write_app_manifest.js +83 -0
  11. package/src/core/sync/write_client_manifest.js +6 -4
  12. package/src/core/sync/write_server.js +12 -22
  13. package/src/core/sync/write_types/index.js +2 -2
  14. package/src/core/utils.js +10 -28
  15. package/src/exports/adapter.js +22 -0
  16. package/src/exports/hooks/public.d.ts +9 -1
  17. package/src/exports/node/index.js +77 -5
  18. package/src/exports/public.d.ts +1 -1
  19. package/src/exports/vite/build/build_server.js +3 -3
  20. package/src/exports/vite/build/service-worker.js +98 -0
  21. package/src/exports/vite/build/utils.js +48 -4
  22. package/src/exports/vite/dev/index.js +28 -25
  23. package/src/exports/vite/index.js +94 -747
  24. package/src/exports/vite/module_ids.js +1 -11
  25. package/src/exports/vite/plugins/env-vars.js +159 -0
  26. package/src/exports/vite/plugins/guard.js +205 -0
  27. package/src/exports/vite/preview/index.js +6 -4
  28. package/src/exports/vite/utils.js +99 -4
  29. package/src/runtime/app/env/{types.d.ts → client.js} +9 -4
  30. package/src/runtime/app/env/index.js +1 -2
  31. package/src/runtime/app/env/private/index.js +1 -0
  32. package/src/runtime/app/env/public/client.js +1 -1
  33. package/src/runtime/app/env/public/server.js +1 -1
  34. package/src/runtime/app/env/{internal.js → server.js} +4 -4
  35. package/src/runtime/app/forms/client.js +263 -0
  36. package/src/runtime/app/forms/index.js +1 -263
  37. package/src/runtime/app/forms/public.d.ts +1 -1
  38. package/src/runtime/app/forms/server.js +6 -0
  39. package/src/runtime/app/forms/shared.js +34 -0
  40. package/src/runtime/app/manifest/index.js +1 -1
  41. package/src/runtime/app/navigation/client.js +15 -0
  42. package/src/runtime/app/navigation/index.js +1 -15
  43. package/src/runtime/app/navigation/public.d.ts +1 -1
  44. package/src/runtime/app/navigation/server.js +15 -0
  45. package/src/runtime/app/paths/server.js +1 -1
  46. package/src/runtime/app/server/remote/form.js +11 -1
  47. package/src/runtime/app/server/remote/prerender.js +1 -2
  48. package/src/runtime/app/server/remote/query.js +3 -3
  49. package/src/runtime/app/state/client.svelte.js +207 -0
  50. package/src/runtime/app/state/index.js +1 -66
  51. package/src/runtime/app/state/public.d.ts +1 -1
  52. package/src/runtime/client/bundle.js +1 -1
  53. package/src/runtime/client/client.js +210 -278
  54. package/src/runtime/client/fetcher.js +18 -8
  55. package/src/runtime/client/remote-functions/form.svelte.js +9 -6
  56. package/src/runtime/client/remote-functions/prerender.svelte.js +1 -1
  57. package/src/runtime/client/remote-functions/query-live/iterator.js +1 -1
  58. package/src/runtime/client/remote-functions/shared.svelte.js +2 -2
  59. package/src/runtime/client/snapshots.js +1 -3
  60. package/src/runtime/client/stream.js +27 -20
  61. package/src/runtime/client/utils.js +7 -3
  62. package/src/runtime/components/root.svelte +5 -5
  63. package/src/runtime/env/dynamic/private.js +1 -1
  64. package/src/runtime/env/static/private.js +1 -1
  65. package/src/runtime/error-chain.js +54 -0
  66. package/src/runtime/form-utils.js +55 -87
  67. package/src/runtime/invalid-import.js +1 -0
  68. package/src/runtime/props.svelte.js +1 -1
  69. package/src/runtime/server/data/index.js +12 -27
  70. package/src/runtime/server/endpoint.js +8 -3
  71. package/src/runtime/server/env_module.js +1 -1
  72. package/src/runtime/server/errors.js +9 -12
  73. package/src/runtime/server/fetch.js +14 -16
  74. package/src/runtime/server/index.js +30 -27
  75. package/src/runtime/server/internal.js +34 -4
  76. package/src/runtime/server/page/actions.js +77 -124
  77. package/src/runtime/server/page/data_serializer.js +6 -10
  78. package/src/runtime/server/page/index.js +45 -82
  79. package/src/runtime/server/page/render.js +34 -52
  80. package/src/runtime/server/page/respond_with_error.js +7 -9
  81. package/src/runtime/server/remote-functions.js +138 -166
  82. package/src/runtime/server/respond.js +75 -30
  83. package/src/runtime/server/state.js +1 -0
  84. package/src/runtime/server/utils.js +0 -7
  85. package/src/runtime/utils.js +41 -0
  86. package/src/telemetry.js +1 -33
  87. package/src/types/ambient-private.d.ts +9 -17
  88. package/src/types/global-private.d.ts +8 -0
  89. package/src/types/internal.d.ts +27 -15
  90. package/src/types/private.d.ts +1 -1
  91. package/src/utils/exports.js +1 -0
  92. package/src/utils/filesystem.js +10 -22
  93. package/src/utils/functions.js +10 -0
  94. package/src/utils/routing.js +0 -11
  95. package/src/utils/streaming.js +5 -15
  96. package/src/utils/url.js +0 -11
  97. package/src/version.js +1 -1
  98. package/types/index.d.ts +54 -29
  99. package/types/index.d.ts.map +10 -5
  100. package/src/runtime/app/env/private.js +0 -1
  101. package/src/runtime/app/env/standard-schema.d.ts +0 -0
  102. package/src/runtime/app/state/client.js +0 -63
  103. package/src/runtime/client/state.svelte.js +0 -98
  104. package/src/runtime/server/ambient.d.ts +0 -4
  105. package/src/utils/path.js +0 -23
@@ -1,7 +1,7 @@
1
1
  import * as devalue from 'devalue';
2
2
  import { compact } from '../../../utils/array.js';
3
3
  import { create_async_iterator } from '../../../utils/streaming.js';
4
- import { clarify_devalue_error, get_global_name, serialize_uses } from '../utils.js';
4
+ import { clarify_devalue_error, serialize_uses } from '../utils.js';
5
5
  import { handle_error_and_jsonify } from '../errors.js';
6
6
  import { encoders } from '#app/internal/transport';
7
7
 
@@ -10,15 +10,14 @@ import { encoders } from '#app/internal/transport';
10
10
  * async iterable containing their resolutions
11
11
  * @param {import('@sveltejs/kit').RequestEvent} event
12
12
  * @param {import('types').RequestState} state
13
- * @param {import('types').SSROptions} options
14
13
  * @returns {import('./types.js').ServerDataSerializer}
15
14
  */
16
- export function server_data_serializer(event, state, options) {
15
+ export function server_data_serializer(event, state) {
17
16
  let promise_id = 1;
18
17
  let max_nodes = -1;
19
18
 
20
19
  const iterator = create_async_iterator();
21
- const global = get_global_name(options);
20
+ const global = __SVELTEKIT_GLOBAL_NAME__;
22
21
 
23
22
  /** @param {number} index */
24
23
  function get_replacer(index) {
@@ -31,7 +30,7 @@ export function server_data_serializer(event, state, options) {
31
30
  .then(/** @param {any} data */ (data) => ({ data }))
32
31
  .catch(
33
32
  /** @param {any} error */ async (error) => ({
34
- error: await handle_error_and_jsonify(event, state, options, error)
33
+ error: await handle_error_and_jsonify(event, state, error)
35
34
  })
36
35
  )
37
36
  .then(
@@ -46,7 +45,6 @@ export function server_data_serializer(event, state, options) {
46
45
  error = await handle_error_and_jsonify(
47
46
  event,
48
47
  state,
49
- options,
50
48
  new Error(`Failed to serialize promise while rendering ${event.route.id}`, {
51
49
  cause: e
52
50
  })
@@ -127,10 +125,9 @@ export function server_data_serializer(event, state, options) {
127
125
  * async iterable containing their resolutions
128
126
  * @param {import('@sveltejs/kit').RequestEvent} event
129
127
  * @param {import('types').RequestState} state
130
- * @param {import('types').SSROptions} options
131
128
  * @returns {import('./types.js').ServerDataSerializerJson}
132
129
  */
133
- export function server_data_serializer_json(event, state, options) {
130
+ export function server_data_serializer_json(event, state) {
134
131
  let promise_id = 1;
135
132
 
136
133
  const iterator = create_async_iterator();
@@ -152,7 +149,7 @@ export function server_data_serializer_json(event, state, options) {
152
149
  .catch(
153
150
  /** @param {any} e */ async (e) => {
154
151
  key = 'error';
155
- return handle_error_and_jsonify(event, state, options, /** @type {any} */ (e));
152
+ return handle_error_and_jsonify(event, state, /** @type {any} */ (e));
156
153
  }
157
154
  )
158
155
  .then(
@@ -165,7 +162,6 @@ export function server_data_serializer_json(event, state, options) {
165
162
  const error = await handle_error_and_jsonify(
166
163
  event,
167
164
  state,
168
- options,
169
165
  new Error(`Failed to serialize promise while rendering ${event.route.id}`, {
170
166
  cause: e
171
167
  })
@@ -1,13 +1,12 @@
1
- /** @import { Component } from 'svelte' */
2
1
  /** @import { RequestEvent, SSRManifest } from '@sveltejs/kit' */
3
- /** @import { ActionResult } from '$app/forms' */
4
- /** @import { PageNodeIndexes, RequestState, RequiredResolveOptions, ServerDataNode, SSRNode, SSROptions } from 'types' */
2
+ /** @import { PageNodeIndexes, RequestState, RequiredResolveOptions, ServerDataNode, SSRNode } from 'types' */
5
3
  import { text } from '@sveltejs/kit';
6
4
  import { Redirect } from '@sveltejs/kit/internal';
7
5
  import { compact } from '../../../utils/array.js';
8
6
  import { get_status, normalize_error } from '../../../utils/error.js';
9
7
  import { noop } from '../../../utils/functions.js';
10
8
  import { add_data_suffix } from '../../pathname.js';
9
+ import { build_error_chain, nearest_error_pages } from '../../error-chain.js';
11
10
  import { redirect_response } from '../utils.js';
12
11
  import { static_error_page, handle_error_and_jsonify } from '../errors.js';
13
12
  import {
@@ -33,13 +32,12 @@ const MAX_DEPTH = 10;
33
32
  * @param {RequestEvent} event
34
33
  * @param {RequestState} state
35
34
  * @param {PageNodeIndexes} page
36
- * @param {SSROptions} options
37
35
  * @param {SSRManifest} manifest
38
36
  * @param {import('../../../utils/page_nodes.js').PageNodes} nodes
39
37
  * @param {RequiredResolveOptions} resolve_opts
40
38
  * @returns {Promise<Response>}
41
39
  */
42
- export async function render_page(event, state, page, options, manifest, nodes, resolve_opts) {
40
+ export async function render_page(event, state, page, manifest, nodes, resolve_opts) {
43
41
  if (state.depth > MAX_DEPTH) {
44
42
  // infinite request cycle detected
45
43
  return text(`Not found: ${event.url.pathname}`, {
@@ -49,7 +47,7 @@ export async function render_page(event, state, page, options, manifest, nodes,
49
47
 
50
48
  if (is_action_json_request(event)) {
51
49
  const node = await manifest._.nodes[page.leaf]();
52
- return handle_action_json_request(event, state, options, node?.server);
50
+ return handle_action_json_request(event, state, node?.server);
53
51
  }
54
52
 
55
53
  try {
@@ -57,7 +55,7 @@ export async function render_page(event, state, page, options, manifest, nodes,
57
55
 
58
56
  let status = 200;
59
57
 
60
- /** @type {ActionResult | undefined} */
58
+ /** @type {import('types').ServerActionResult | undefined} */
61
59
  let action_result = undefined;
62
60
 
63
61
  if (is_action_request(event)) {
@@ -151,10 +149,9 @@ export async function render_page(event, state, page, options, manifest, nodes,
151
149
  error: null,
152
150
  event,
153
151
  state,
154
- options,
155
152
  manifest,
156
153
  resolve_opts,
157
- data_serializer: server_data_serializer(event, state, options)
154
+ data_serializer: server_data_serializer(event, state)
158
155
  });
159
156
  }
160
157
 
@@ -164,10 +161,10 @@ export async function render_page(event, state, page, options, manifest, nodes,
164
161
  /** @type {Error | null} */
165
162
  let load_error = null;
166
163
 
167
- const data_serializer = server_data_serializer(event, state, options);
164
+ const data_serializer = server_data_serializer(event, state);
168
165
  const data_serializer_json =
169
166
  (state.prerendering || state.prerender_default === true) && should_prerender_data
170
- ? server_data_serializer_json(event, state, options)
167
+ ? server_data_serializer_json(event, state)
171
168
  : null;
172
169
 
173
170
  /** @type {Array<Promise<ServerDataNode | null>>} */
@@ -275,50 +272,43 @@ export async function render_page(event, state, page, options, manifest, nodes,
275
272
  return redirect_response(err.status, err.location);
276
273
  }
277
274
 
278
- const error = await handle_error_and_jsonify(event, state, options, err);
275
+ const error = await handle_error_and_jsonify(event, state, err);
279
276
  const status = error.status;
280
277
 
281
- while (i--) {
282
- if (page.errors[i]) {
283
- const index = /** @type {number} */ (page.errors[i]);
284
- const node = await manifest._.nodes[index]();
285
-
286
- let j = i;
287
- while (!branch[j]) j -= 1;
288
-
289
- data_serializer.set_max_nodes(j + 1);
290
-
291
- const layouts = compact(branch.slice(0, j + 1));
292
- const nodes = new PageNodes(layouts.map((layout) => layout.node));
293
- const error_branch = layouts.concat({
294
- node,
295
- data: null,
296
- server_data: null
297
- });
298
-
299
- return await render_response({
300
- event,
301
- state,
302
- options,
303
- manifest,
304
- resolve_opts,
305
- page_config: {
306
- ssr: nodes.ssr(),
307
- csr: nodes.csr()
308
- },
309
- status,
310
- error,
311
- error_components: await load_error_components(ssr, error_branch, page, manifest),
312
- branch: error_branch,
313
- fetched,
314
- data_serializer
315
- });
316
- }
278
+ for (const { error: index, idx } of nearest_error_pages(i, branch, page.errors)) {
279
+ const node = await manifest._.nodes[index]();
280
+
281
+ data_serializer.set_max_nodes(idx);
282
+
283
+ const layouts = compact(branch.slice(0, idx));
284
+ const nodes = new PageNodes(layouts.map((layout) => layout.node));
285
+ const error_branch = layouts.concat({
286
+ node,
287
+ data: null,
288
+ server_data: null
289
+ });
290
+
291
+ return await render_response({
292
+ event,
293
+ state,
294
+ manifest,
295
+ resolve_opts,
296
+ page_config: {
297
+ ssr: nodes.ssr(),
298
+ csr: nodes.csr()
299
+ },
300
+ status,
301
+ error,
302
+ error_components: await load_error_components(ssr, error_branch, page, manifest),
303
+ branch: error_branch,
304
+ fetched,
305
+ data_serializer
306
+ });
317
307
  }
318
308
 
319
309
  // if we're still here, it means the error happened in the root layout,
320
310
  // which means we have to fall back to error.html
321
- return static_error_page(options, status, error.message);
311
+ return static_error_page(status, error.message);
322
312
  }
323
313
  } else {
324
314
  // push an empty slot so we can rewind past gaps to the
@@ -346,7 +336,6 @@ export async function render_page(event, state, page, options, manifest, nodes,
346
336
  return await render_response({
347
337
  event,
348
338
  state,
349
- options,
350
339
  manifest,
351
340
  resolve_opts,
352
341
  page_config: {
@@ -358,7 +347,7 @@ export async function render_page(event, state, page, options, manifest, nodes,
358
347
  branch: compact(branch),
359
348
  action_result,
360
349
  fetched,
361
- data_serializer: !ssr ? server_data_serializer(event, state, options) : data_serializer,
350
+ data_serializer: !ssr ? server_data_serializer(event, state) : data_serializer,
362
351
  error_components: await load_error_components(ssr, branch, page, manifest)
363
352
  });
364
353
  } catch (e) {
@@ -372,7 +361,6 @@ export async function render_page(event, state, page, options, manifest, nodes,
372
361
  return await respond_with_error({
373
362
  event,
374
363
  state,
375
- options,
376
364
  manifest,
377
365
  error: e,
378
366
  resolve_opts
@@ -386,35 +374,10 @@ export async function render_page(event, state, page, options, manifest, nodes,
386
374
  * @param {PageNodeIndexes} page
387
375
  * @param {SSRManifest} manifest
388
376
  */
389
- async function load_error_components(ssr, branch, page, manifest) {
390
- /** @type {Array<Component | undefined> | undefined} */
391
- let error_components;
392
-
393
- if (ssr) {
394
- let last_idx = -1;
395
- error_components = await Promise.all(
396
- // eslint-disable-next-line @typescript-eslint/await-thenable
397
- branch
398
- .map((b, i) => {
399
- if (i === 0) return undefined; // root layout wraps root error component, not the other way around
400
- if (!b) return null;
401
-
402
- i--;
403
- // Find the closest error component up to the previous branch
404
- while (i > last_idx + 1 && page.errors[i] === undefined) i -= 1;
405
- last_idx = i;
406
-
407
- const idx = page.errors[i];
408
- if (idx == null) return undefined;
409
-
410
- return manifest._.nodes[idx]?.()
411
- .then((e) => e.component?.())
412
- .catch(() => undefined);
413
- })
414
- // filter out indexes where there was no branch, but keep indexes where there was a branch but no error component
415
- .filter((e) => e !== null)
416
- );
417
- }
377
+ function load_error_components(ssr, branch, page, manifest) {
378
+ if (!ssr) return undefined;
418
379
 
419
- return error_components;
380
+ return build_error_chain(branch, page.errors, (idx) =>
381
+ manifest._.nodes[idx]?.().then((e) => e.component?.())
382
+ );
420
383
  }
@@ -18,15 +18,16 @@ import {
18
18
  route_id_resolution_pathname
19
19
  } from '../../pathname.js';
20
20
  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';
21
+ import { stream_text } from '../../utils.js';
22
+ import { count_non_ssi_comments } from '../utils.js';
23
23
  import { handle_error_and_jsonify } from '../errors.js';
24
- import * as env from '__sveltekit/env';
24
+ import * as env from '<sveltekit:generated>/env/config.js';
25
25
  import { collect_remote_data } from '../remote-functions.js';
26
26
  import Root from '../../components/root.svelte';
27
27
  import { render } from 'svelte/server';
28
28
  import { Props, RenderNode } from '../../props.svelte.js';
29
29
  import { has_custom_transporters, uneval } from '#app/internal/transport';
30
+ import { options } from '../internal.js';
30
31
 
31
32
  // TODO rename this function/module
32
33
 
@@ -35,7 +36,6 @@ import { has_custom_transporters, uneval } from '#app/internal/transport';
35
36
  * @param {{
36
37
  * branch: Array<import('./types.js').Loaded>;
37
38
  * fetched: Array<import('./types.js').Fetched>;
38
- * options: import('types').SSROptions;
39
39
  * manifest: import('@sveltejs/kit').SSRManifest;
40
40
  * page_config: { ssr: boolean; csr: boolean };
41
41
  * status: number;
@@ -43,7 +43,7 @@ import { has_custom_transporters, uneval } from '#app/internal/transport';
43
43
  * event: import('@sveltejs/kit').RequestEvent;
44
44
  * state: import('types').RequestState;
45
45
  * resolve_opts: import('types').RequiredResolveOptions;
46
- * action_result?: import('$app/forms').ActionResult;
46
+ * action_result?: import('types').ServerActionResult;
47
47
  * data_serializer: import('./types.js').ServerDataSerializer;
48
48
  * error_components?: Array<import('svelte').Component | undefined>
49
49
  * }} opts
@@ -51,7 +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
54
  manifest,
56
55
  page_config,
57
56
  status,
@@ -77,7 +76,9 @@ export async function render_response({
77
76
 
78
77
  const modulepreloads = new Set(client?.imports);
79
78
  const stylesheets = new Set(client?.stylesheets);
80
- const fonts = new Set(client?.fonts);
79
+
80
+ /** @type {Map<string, import('types').FontDependency>} */
81
+ const fonts = new Map(client?.fonts.map((font) => [font.file, font]));
81
82
 
82
83
  /**
83
84
  * The value of the Link header that is added to the response when not prerendering
@@ -90,7 +91,7 @@ export async function render_response({
90
91
  const inline_styles = new Map();
91
92
 
92
93
  // TODO `svelte/server` should expose `RenderOutput`
93
- /** @type {{ head: string, body: string, hashes: { script: string[] } }} */
94
+ /** @type {Omit<Awaited<ReturnType<typeof render>>, 'html'>} */
94
95
  let rendered;
95
96
 
96
97
  const form_value =
@@ -132,7 +133,7 @@ export async function render_response({
132
133
  if (!paths.assets || (paths.assets[0] === '/' && paths.assets !== SVELTE_KIT_ASSETS)) {
133
134
  assets = base;
134
135
  }
135
- } else if (options.hash_routing) {
136
+ } else if (__SVELTEKIT_HASH_ROUTING__) {
136
137
  // we have to assume that we're in the right place
137
138
  base_expression = "new URL('.', location).pathname.slice(0, -1)";
138
139
  }
@@ -156,7 +157,7 @@ export async function render_response({
156
157
  tree: new RenderNode(
157
158
  // TODO tidy up
158
159
  /** @type {Component} */ (await branch[0].node.component?.()),
159
- /** @type {Component} */ (error_components?.[1])
160
+ undefined
160
161
  ),
161
162
  form: form_value,
162
163
  error: error ?? undefined
@@ -176,7 +177,7 @@ export async function render_response({
176
177
  current_node = current_node.child = new RenderNode(
177
178
  // TODO tidy up
178
179
  /** @type {Component} */ (await branch[i + 1].node.component?.()),
179
- /** @type {Component} */ (error_components?.slice(0, i + 2).findLast((x) => x))
180
+ error_components?.[i + 1]
180
181
  );
181
182
  }
182
183
  }
@@ -201,7 +202,7 @@ export async function render_response({
201
202
  throw e;
202
203
  }
203
204
 
204
- const handled = handle_error_and_jsonify(event, render_state, options, e);
205
+ const handled = handle_error_and_jsonify(event, render_state, e);
205
206
 
206
207
  // TODO 4.0 make this an async function and await `handled`
207
208
  if (handled instanceof Promise) {
@@ -244,19 +245,12 @@ export async function render_response({
244
245
  }
245
246
 
246
247
  rendered = await with_request_store({ event, state: render_state }, async () => {
247
- // We have to invoke .then eagerly here in order to kick off rendering: it's only starting on access,
248
- // and `await maybe_promise` would eagerly access the .then property but call its function only after a tick, which is too late
249
- // for the paths.reset() below and for any eager getRequestEvent() calls during rendering without AsyncLocalStorage available.
250
- const rendered = render(Root, { ...render_opts, props });
251
-
252
- const { head, body, hashes } = await rendered;
253
-
254
- if (hashes) {
255
- csp.add_script_hashes(hashes.script);
256
- }
257
-
258
- return { head, body, hashes };
248
+ return render(Root, { ...render_opts, props });
259
249
  });
250
+
251
+ if (rendered.hashes) {
252
+ csp.add_script_hashes(rendered.hashes.script);
253
+ }
260
254
  } finally {
261
255
  if (DEV) {
262
256
  globalThis.fetch = fetch;
@@ -269,7 +263,7 @@ export async function render_response({
269
263
  for (const { node } of branch) {
270
264
  for (const url of node.imports) modulepreloads.add(url);
271
265
  for (const url of node.stylesheets) stylesheets.add(url);
272
- for (const url of node.fonts) fonts.add(url);
266
+ for (const font of node.fonts) fonts.set(font.file, font);
273
267
 
274
268
  if (node.inline_styles && !client?.inline) {
275
269
  Object.entries(await node.inline_styles()).forEach(([filename, css]) => {
@@ -317,7 +311,10 @@ export async function render_response({
317
311
  * @param {string[]} attributes
318
312
  */
319
313
  const add_preload = (path, attributes) => {
320
- if (options.link_header_preload && !(state.prerendering || state.prerender_default === true)) {
314
+ if (
315
+ __SVELTEKIT_LINK_HEADER_PRELOAD__ &&
316
+ !(state.prerendering || state.prerender_default === true)
317
+ ) {
321
318
  link_headers.add(`<${encodeURI(path)}>; ${attributes.join('; ')}; nopush`);
322
319
  } else {
323
320
  head.add_link_tag(path, attributes);
@@ -334,7 +331,7 @@ export async function render_response({
334
331
  // include them in disabled state so that Vite can detect them and doesn't try to add them
335
332
  attributes.push('disabled', 'media="(max-width: 0)"');
336
333
  } else {
337
- if (options.link_header_preload && resolve_opts.preload({ type: 'css', path })) {
334
+ if (__SVELTEKIT_LINK_HEADER_PRELOAD__ && resolve_opts.preload({ type: 'css', path })) {
338
335
  link_headers.add(`<${encodeURI(path)}>; rel="preload"; as="style"; nopush`);
339
336
  }
340
337
  }
@@ -342,17 +339,17 @@ export async function render_response({
342
339
  head.add_stylesheet(path, attributes);
343
340
  }
344
341
 
345
- for (const dep of fonts) {
346
- const path = prefixed(dep);
342
+ for (const { file, filename } of fonts.values()) {
343
+ const path = prefixed(file);
347
344
 
348
- if (resolve_opts.preload({ type: 'font', path })) {
349
- const ext = dep.slice(dep.lastIndexOf('.') + 1);
345
+ if (resolve_opts.preload({ type: 'font', path, filename })) {
346
+ const ext = file.slice(file.lastIndexOf('.') + 1);
350
347
 
351
348
  add_preload(path, ['rel="preload"', 'as="font"', `type="font/${ext}"`, 'crossorigin']);
352
349
  }
353
350
  }
354
351
 
355
- const global = get_global_name(options);
352
+ const global = __SVELTEKIT_GLOBAL_NAME__;
356
353
  const { data, chunks } = data_serializer.get_data(csp);
357
354
 
358
355
  if (page_config.ssr && page_config.csr) {
@@ -514,7 +511,7 @@ export async function render_response({
514
511
  ); // make output after it's put together with the rest more readable
515
512
  hydrate.push(`params: ${devalue.uneval(event.params)}`, `server_route: ${stringified}`);
516
513
  }
517
- } else if (options.embedded) {
514
+ } else if (__SVELTEKIT_EMBEDDED__) {
518
515
  hydrate.push(`params: ${devalue.uneval(event.params)}`, `route: ${s(event.route)}`);
519
516
  }
520
517
 
@@ -522,7 +519,7 @@ export async function render_response({
522
519
  args.push(`{\n${indent}\t${hydrate.join(`,\n${indent}\t`)}\n${indent}}`);
523
520
  }
524
521
 
525
- const remote_data = await collect_remote_data({}, event, state, options);
522
+ const remote_data = await collect_remote_data({}, event, state);
526
523
 
527
524
  const serialized_data =
528
525
  Object.keys(remote_data).length > 0
@@ -554,7 +551,7 @@ export async function render_response({
554
551
  blocks.push(boot);
555
552
  }
556
553
 
557
- if (options.service_worker) {
554
+ if (__SVELTEKIT_SERVICE_WORKER__) {
558
555
  let opts = ", { type: 'module' }";
559
556
  if (options.service_worker_options != null) {
560
557
  const service_worker_options = { ...options.service_worker_options, type: 'module' };
@@ -615,7 +612,7 @@ export async function render_response({
615
612
  headers.set('content-security-policy-report-only', report_only_header);
616
613
  }
617
614
 
618
- if (options.link_header_preload && link_headers.size) {
615
+ if (__SVELTEKIT_LINK_HEADER_PRELOAD__ && link_headers.size) {
619
616
  headers.set('link', Array.from(link_headers).join(', '));
620
617
  }
621
618
  }
@@ -662,22 +659,7 @@ export async function render_response({
662
659
  status,
663
660
  headers
664
661
  })
665
- : new Response(
666
- new ReadableStream({
667
- async start(controller) {
668
- controller.enqueue(text_encoder.encode(transformed + '\n'));
669
- for await (const chunk of chunks) {
670
- if (chunk.length) controller.enqueue(text_encoder.encode(chunk));
671
- }
672
- controller.close();
673
- },
674
-
675
- type: 'bytes'
676
- }),
677
- {
678
- headers
679
- }
680
- );
662
+ : new Response(stream_text(transformed + '\n', chunks), { headers });
681
663
  }
682
664
 
683
665
  class Head {
@@ -14,17 +14,16 @@ import { server_data_serializer } from './data_serializer.js';
14
14
  * @param {{
15
15
  * event: import('@sveltejs/kit').RequestEvent;
16
16
  * state: import('types').RequestState;
17
- * options: import('types').SSROptions;
18
17
  * 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, manifest, 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[]} */
@@ -35,9 +34,9 @@ export async function respond_with_error({ event, state, options, manifest, erro
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;
@@ -80,7 +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
82
  manifest,
85
83
  page_config: {
86
84
  ssr,
@@ -103,8 +101,8 @@ export async function respond_with_error({ event, state, options, manifest, erro
103
101
  return redirect_response(e.status, e.location);
104
102
  }
105
103
 
106
- const transformed = await handle_error_and_jsonify(event, state, options, e);
104
+ const transformed = await handle_error_and_jsonify(event, state, e);
107
105
 
108
- return static_error_page(options, transformed.status, transformed.message);
106
+ return static_error_page(transformed.status, transformed.message);
109
107
  }
110
108
  }