@sveltejs/kit 3.0.0-next.2 → 3.0.0-next.21

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 (195) hide show
  1. package/package.json +62 -36
  2. package/src/cli.js +15 -12
  3. package/src/constants.js +6 -1
  4. package/src/core/adapt/builder.js +66 -72
  5. package/src/core/adapt/index.js +17 -6
  6. package/src/core/config/index.js +134 -80
  7. package/src/core/config/options.js +295 -273
  8. package/src/core/config/types.d.ts +1 -1
  9. package/src/core/env.js +146 -16
  10. package/src/core/generate_manifest/index.js +18 -15
  11. package/src/core/postbuild/analyse.js +8 -20
  12. package/src/core/postbuild/crawl.js +22 -6
  13. package/src/core/postbuild/entities.js +8 -2
  14. package/src/core/postbuild/fallback.js +4 -2
  15. package/src/core/postbuild/prerender.js +222 -70
  16. package/src/core/postbuild/queue.js +2 -1
  17. package/src/core/sync/create_manifest_data/conflict.js +1 -1
  18. package/src/core/sync/create_manifest_data/index.js +82 -62
  19. package/src/core/sync/sync.js +40 -31
  20. package/src/core/sync/ts.js +1 -1
  21. package/src/core/sync/utils.js +22 -2
  22. package/src/core/sync/{write_non_ambient.js → write_app_types.js} +107 -58
  23. package/src/core/sync/write_client_manifest.js +14 -29
  24. package/src/core/sync/write_env.js +7 -5
  25. package/src/core/sync/write_server.js +37 -45
  26. package/src/core/sync/write_tsconfig/index.js +274 -0
  27. package/src/core/sync/write_tsconfig/test-app/package.json +7 -0
  28. package/src/core/sync/write_tsconfig/utils.js +77 -0
  29. package/src/core/sync/write_tsconfig/validate.js +128 -0
  30. package/src/core/sync/write_types/index.js +127 -123
  31. package/src/core/utils.js +30 -5
  32. package/src/exports/env/index.js +77 -0
  33. package/src/exports/env/public.d.ts +55 -0
  34. package/src/exports/hooks/index.js +3 -9
  35. package/src/exports/hooks/public.d.ts +195 -0
  36. package/src/exports/hooks/sequence.js +9 -6
  37. package/src/exports/index.js +52 -29
  38. package/src/exports/internal/client.js +5 -0
  39. package/src/exports/internal/env.js +8 -5
  40. package/src/exports/internal/index.js +1 -90
  41. package/src/exports/internal/{event.js → server/event.js} +2 -3
  42. package/src/exports/internal/server/index.js +37 -0
  43. package/src/exports/internal/server/telemetry.js +95 -0
  44. package/src/exports/internal/shared.js +90 -0
  45. package/src/exports/node/index.js +64 -22
  46. package/src/exports/params/index.js +70 -0
  47. package/src/exports/params/public.d.ts +63 -0
  48. package/src/exports/public.d.ts +50 -1733
  49. package/src/exports/remote/index.js +11 -0
  50. package/src/exports/remote/public.d.ts +519 -0
  51. package/src/exports/url.js +86 -0
  52. package/src/exports/vite/build/build_server.js +54 -65
  53. package/src/exports/vite/build/remote.js +24 -19
  54. package/src/exports/vite/build/utils.js +0 -8
  55. package/src/exports/vite/dev/index.js +218 -146
  56. package/src/exports/vite/index.js +1590 -858
  57. package/src/exports/vite/module_ids.js +2 -2
  58. package/src/exports/vite/preview/index.js +40 -32
  59. package/src/exports/vite/public.d.ts +588 -0
  60. package/src/exports/vite/utils.js +84 -46
  61. package/src/pathname.js +55 -0
  62. package/src/runner.js +15 -0
  63. package/src/runtime/app/env/internal.js +4 -4
  64. package/src/runtime/app/env/types.d.ts +1 -1
  65. package/src/runtime/app/environment/index.js +3 -3
  66. package/src/runtime/app/{forms.js → forms/index.js} +73 -42
  67. package/src/runtime/app/forms/public.d.ts +2 -0
  68. package/src/runtime/app/forms/types.d.ts +56 -0
  69. package/src/runtime/app/internal/transport.js +53 -0
  70. package/src/runtime/app/manifest/index.js +1 -0
  71. package/src/runtime/app/{navigation.js → navigation/index.js} +2 -1
  72. package/src/runtime/app/navigation/public.d.ts +237 -0
  73. package/src/runtime/app/paths/client.js +37 -37
  74. package/src/runtime/app/paths/index.js +1 -1
  75. package/src/runtime/app/paths/internal/client.js +34 -2
  76. package/src/runtime/app/paths/internal/server.js +6 -23
  77. package/src/runtime/app/paths/internal.d.ts +3 -0
  78. package/src/runtime/app/paths/public.d.ts +1 -29
  79. package/src/runtime/app/paths/server.js +36 -17
  80. package/src/runtime/app/paths/types.d.ts +11 -19
  81. package/src/runtime/app/server/index.js +2 -2
  82. package/src/runtime/app/server/public.d.ts +201 -0
  83. package/src/runtime/app/server/remote/command.js +13 -11
  84. package/src/runtime/app/server/remote/form.js +61 -39
  85. package/src/runtime/app/server/remote/prerender.js +45 -45
  86. package/src/runtime/app/server/remote/query.js +106 -108
  87. package/src/runtime/app/server/remote/requested.js +27 -19
  88. package/src/runtime/app/server/remote/shared.js +76 -76
  89. package/src/runtime/app/service-worker/index.js +24 -0
  90. package/src/runtime/app/state/client.js +4 -2
  91. package/src/runtime/app/state/index.js +7 -5
  92. package/src/runtime/app/state/public.d.ts +72 -0
  93. package/src/runtime/app/state/server.js +3 -0
  94. package/src/runtime/app/stores.js +15 -78
  95. package/src/runtime/client/bundle.js +1 -1
  96. package/src/runtime/client/client-entry.js +3 -0
  97. package/src/runtime/client/client.js +1336 -648
  98. package/src/runtime/client/constants.js +3 -6
  99. package/src/runtime/client/entry.js +24 -3
  100. package/src/runtime/client/fetcher.js +25 -25
  101. package/src/runtime/client/ndjson.js +1 -1
  102. package/src/runtime/client/parse.js +1 -1
  103. package/src/runtime/client/payload.js +17 -0
  104. package/src/runtime/client/remote-functions/cache.svelte.js +3 -1
  105. package/src/runtime/client/remote-functions/command.svelte.js +37 -61
  106. package/src/runtime/client/remote-functions/form.svelte.js +267 -178
  107. package/src/runtime/client/remote-functions/prerender.svelte.js +32 -11
  108. package/src/runtime/client/remote-functions/query/index.js +10 -17
  109. package/src/runtime/client/remote-functions/query/instance.svelte.js +64 -18
  110. package/src/runtime/client/remote-functions/query/proxy.js +5 -5
  111. package/src/runtime/client/remote-functions/query-batch.svelte.js +61 -70
  112. package/src/runtime/client/remote-functions/query-live/index.js +1 -1
  113. package/src/runtime/client/remote-functions/query-live/instance.svelte.js +63 -21
  114. package/src/runtime/client/remote-functions/query-live/iterator.js +15 -12
  115. package/src/runtime/client/remote-functions/query-live/proxy.js +2 -12
  116. package/src/runtime/client/remote-functions/shared.svelte.js +90 -65
  117. package/src/runtime/client/snapshots.js +147 -0
  118. package/src/runtime/client/state.svelte.js +94 -55
  119. package/src/runtime/client/stream.js +3 -2
  120. package/src/runtime/client/types.d.ts +13 -9
  121. package/src/runtime/client/utils.js +22 -110
  122. package/src/runtime/components/root.svelte +56 -0
  123. package/src/runtime/env/dynamic/private.js +7 -0
  124. package/src/runtime/env/dynamic/public.js +7 -0
  125. package/src/runtime/env/static/private.js +6 -0
  126. package/src/runtime/env/static/public.js +6 -0
  127. package/src/runtime/form-utils.js +172 -61
  128. package/src/runtime/pathname.js +20 -32
  129. package/src/runtime/props.svelte.js +72 -0
  130. package/src/runtime/server/constants.js +0 -3
  131. package/src/runtime/server/cookie.js +72 -55
  132. package/src/runtime/server/csrf.js +65 -0
  133. package/src/runtime/server/data/index.js +49 -53
  134. package/src/runtime/server/dev.js +22 -0
  135. package/src/runtime/server/endpoint.js +6 -7
  136. package/src/runtime/server/env_module.js +0 -5
  137. package/src/runtime/server/errors.js +160 -0
  138. package/src/runtime/server/fetch.js +32 -39
  139. package/src/runtime/server/index.js +90 -64
  140. package/src/runtime/server/internal.js +71 -0
  141. package/src/runtime/server/page/actions.js +85 -64
  142. package/src/runtime/server/page/crypto.js +2 -2
  143. package/src/runtime/server/page/csp.js +88 -104
  144. package/src/runtime/server/page/data_serializer.js +24 -25
  145. package/src/runtime/server/page/index.js +36 -53
  146. package/src/runtime/server/page/load_data.js +50 -57
  147. package/src/runtime/server/page/render.js +173 -239
  148. package/src/runtime/server/page/respond_with_error.js +17 -31
  149. package/src/runtime/server/page/serialize_data.js +2 -13
  150. package/src/runtime/server/page/server_routing.js +85 -26
  151. package/src/runtime/server/remote-functions.js +640 -0
  152. package/src/runtime/server/respond.js +190 -131
  153. package/src/runtime/server/sourcemaps.js +183 -0
  154. package/src/runtime/server/state.js +53 -0
  155. package/src/runtime/server/utils.js +13 -155
  156. package/src/runtime/shared.js +20 -40
  157. package/src/runtime/utils.js +3 -0
  158. package/src/types/ambient-private.d.ts +11 -1
  159. package/src/types/ambient.d.ts +87 -36
  160. package/src/types/global-private.d.ts +25 -25
  161. package/src/types/internal.d.ts +163 -157
  162. package/src/types/private.d.ts +41 -1
  163. package/src/utils/error.js +28 -4
  164. package/src/utils/escape.js +9 -25
  165. package/src/utils/features.js +1 -1
  166. package/src/utils/filesystem.js +1 -23
  167. package/src/utils/fork.js +7 -2
  168. package/src/utils/hash.js +21 -0
  169. package/src/utils/http.js +8 -7
  170. package/src/utils/import.js +9 -2
  171. package/src/utils/imports.js +83 -0
  172. package/src/utils/mime.js +9 -0
  173. package/src/utils/page_nodes.js +6 -7
  174. package/src/utils/params.js +67 -0
  175. package/src/utils/regex.js +9 -0
  176. package/src/utils/routing.js +145 -73
  177. package/src/utils/shared-iterator.js +5 -0
  178. package/src/utils/streaming.js +14 -4
  179. package/src/utils/url.js +33 -2
  180. package/src/version.js +1 -1
  181. package/types/index.d.ts +2616 -2433
  182. package/types/index.d.ts.map +120 -106
  183. package/src/core/sync/write_ambient.js +0 -18
  184. package/src/core/sync/write_root.js +0 -148
  185. package/src/core/sync/write_tsconfig.js +0 -250
  186. package/src/exports/internal/server.js +0 -22
  187. package/src/exports/node/polyfills.js +0 -30
  188. package/src/runtime/server/app.js +0 -9
  189. package/src/runtime/server/remote.js +0 -457
  190. package/src/runtime/shared-server.js +0 -7
  191. package/src/runtime/telemetry/otel.js +0 -21
  192. package/src/runtime/telemetry/record_span.js +0 -65
  193. package/src/types/synthetic/$lib.md +0 -5
  194. /package/src/exports/internal/{remote-functions.js → server/remote-functions.js} +0 -0
  195. /package/src/{runtime/telemetry/noop.js → telemetry.js} +0 -0
@@ -1,22 +1,19 @@
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 {
5
- clarify_devalue_error,
6
- get_global_name,
7
- handle_error_and_jsonify,
8
- serialize_uses
9
- } from '../utils.js';
4
+ import { clarify_devalue_error, get_global_name, serialize_uses } from '../utils.js';
5
+ import { handle_error_and_jsonify } from '../errors.js';
6
+ import { encoders } from '#app/internal/transport';
10
7
 
11
8
  /**
12
9
  * If the serialized data contains promises, `chunks` will be an
13
10
  * async iterable containing their resolutions
14
- * @param {import('@sveltejs/kit').RequestEvent} event
15
- * @param {import('types').RequestState} event_state
11
+ * @param {import('$app/server').RequestEvent} event
12
+ * @param {import('types').RequestState} state
16
13
  * @param {import('types').SSROptions} options
17
14
  * @returns {import('./types.js').ServerDataSerializer}
18
15
  */
19
- export function server_data_serializer(event, event_state, options) {
16
+ export function server_data_serializer(event, state, options) {
20
17
  let promise_id = 1;
21
18
  let max_nodes = -1;
22
19
 
@@ -34,7 +31,7 @@ export function server_data_serializer(event, event_state, options) {
34
31
  .then(/** @param {any} data */ (data) => ({ data }))
35
32
  .catch(
36
33
  /** @param {any} error */ async (error) => ({
37
- error: await handle_error_and_jsonify(event, event_state, options, error)
34
+ error: await handle_error_and_jsonify(event, state, options, error)
38
35
  })
39
36
  )
40
37
  .then(
@@ -45,12 +42,14 @@ export function server_data_serializer(event, event_state, options) {
45
42
  let str;
46
43
  try {
47
44
  str = devalue.uneval(error ? [, error] : [data], replacer);
48
- } catch {
45
+ } catch (e) {
49
46
  error = await handle_error_and_jsonify(
50
47
  event,
51
- event_state,
48
+ state,
52
49
  options,
53
- new Error(`Failed to serialize promise while rendering ${event.route.id}`)
50
+ new Error(`Failed to serialize promise while rendering ${event.route.id}`, {
51
+ cause: e
52
+ })
54
53
  );
55
54
  str = devalue.uneval([, error], replacer);
56
55
  }
@@ -66,8 +65,8 @@ export function server_data_serializer(event, event_state, options) {
66
65
 
67
66
  return `${global}.defer(${id})`;
68
67
  } else {
69
- for (const key in options.hooks.transport) {
70
- const encoded = options.hooks.transport[key].encode(thing);
68
+ for (const key in encoders) {
69
+ const encoded = encoders[key](thing);
71
70
  if (encoded) {
72
71
  return `app.decode('${key}', ${devalue.uneval(encoded, replacer)})`;
73
72
  }
@@ -126,20 +125,18 @@ export function server_data_serializer(event, event_state, options) {
126
125
  /**
127
126
  * If the serialized data contains promises, `chunks` will be an
128
127
  * async iterable containing their resolutions
129
- * @param {import('@sveltejs/kit').RequestEvent} event
130
- * @param {import('types').RequestState} event_state
128
+ * @param {import('$app/server').RequestEvent} event
129
+ * @param {import('types').RequestState} state
131
130
  * @param {import('types').SSROptions} options
132
131
  * @returns {import('./types.js').ServerDataSerializerJson}
133
132
  */
134
- export function server_data_serializer_json(event, event_state, options) {
133
+ export function server_data_serializer_json(event, state, options) {
135
134
  let promise_id = 1;
136
135
 
137
136
  const iterator = create_async_iterator();
138
137
 
139
138
  const reducers = {
140
- ...Object.fromEntries(
141
- Object.entries(options.hooks.transport).map(([key, value]) => [key, value.encode])
142
- ),
139
+ ...encoders,
143
140
  /** @param {any} thing */
144
141
  Promise: (thing) => {
145
142
  if (typeof thing?.then !== 'function') {
@@ -155,7 +152,7 @@ export function server_data_serializer_json(event, event_state, options) {
155
152
  .catch(
156
153
  /** @param {any} e */ async (e) => {
157
154
  key = 'error';
158
- return handle_error_and_jsonify(event, event_state, options, /** @type {any} */ (e));
155
+ return handle_error_and_jsonify(event, state, options, /** @type {any} */ (e));
159
156
  }
160
157
  )
161
158
  .then(
@@ -164,12 +161,14 @@ export function server_data_serializer_json(event, event_state, options) {
164
161
  let str;
165
162
  try {
166
163
  str = devalue.stringify(value, reducers);
167
- } catch {
164
+ } catch (e) {
168
165
  const error = await handle_error_and_jsonify(
169
166
  event,
170
- event_state,
167
+ state,
171
168
  options,
172
- new Error(`Failed to serialize promise while rendering ${event.route.id}`)
169
+ new Error(`Failed to serialize promise while rendering ${event.route.id}`, {
170
+ cause: e
171
+ })
173
172
  );
174
173
 
175
174
  key = 'error';
@@ -1,12 +1,16 @@
1
- /** @import { ActionResult, RequestEvent, SSRManifest } from '@sveltejs/kit' */
2
- /** @import { PageNodeIndexes, RequestState, RequiredResolveOptions, ServerDataNode, SSRComponent, SSRNode, SSROptions, SSRState } from 'types' */
1
+ /** @import { Component } from 'svelte' */
2
+ /** @import { SSRManifest } from '@sveltejs/kit' */
3
+ /** @import { RequestEvent } from '$app/server' */
4
+ /** @import { ActionResult } from '$app/forms' */
5
+ /** @import { PageNodeIndexes, RequestState, RequiredResolveOptions, ServerDataNode, SSRNode, SSROptions } from 'types' */
3
6
  import { text } from '@sveltejs/kit';
4
- import { HttpError, Redirect } from '@sveltejs/kit/internal';
7
+ import { Redirect } from '@sveltejs/kit/internal';
5
8
  import { compact } from '../../../utils/array.js';
6
9
  import { get_status, normalize_error } from '../../../utils/error.js';
7
10
  import { noop } from '../../../utils/functions.js';
8
11
  import { add_data_suffix } from '../../pathname.js';
9
- import { redirect_response, static_error_page, handle_error_and_jsonify } from '../utils.js';
12
+ import { redirect_response } from '../utils.js';
13
+ import { static_error_page, handle_error_and_jsonify } from '../errors.js';
10
14
  import {
11
15
  handle_action_json_request,
12
16
  handle_action_request,
@@ -18,7 +22,7 @@ import { load_data, load_server_data } from './load_data.js';
18
22
  import { render_response } from './render.js';
19
23
  import { respond_with_error } from './respond_with_error.js';
20
24
  import { DEV } from 'esm-env';
21
- import { get_remote_action, handle_remote_form_post } from '../remote.js';
25
+ import { get_remote_action, handle_remote_form_post } from '../remote-functions.js';
22
26
  import { PageNodes } from '../../../utils/page_nodes.js';
23
27
 
24
28
  /**
@@ -28,25 +32,15 @@ const MAX_DEPTH = 10;
28
32
 
29
33
  /**
30
34
  * @param {RequestEvent} event
31
- * @param {RequestState} event_state
35
+ * @param {RequestState} state
32
36
  * @param {PageNodeIndexes} page
33
37
  * @param {SSROptions} options
34
38
  * @param {SSRManifest} manifest
35
- * @param {SSRState} state
36
39
  * @param {import('../../../utils/page_nodes.js').PageNodes} nodes
37
40
  * @param {RequiredResolveOptions} resolve_opts
38
41
  * @returns {Promise<Response>}
39
42
  */
40
- export async function render_page(
41
- event,
42
- event_state,
43
- page,
44
- options,
45
- manifest,
46
- state,
47
- nodes,
48
- resolve_opts
49
- ) {
43
+ export async function render_page(event, state, page, options, manifest, nodes, resolve_opts) {
50
44
  if (state.depth > MAX_DEPTH) {
51
45
  // infinite request cycle detected
52
46
  return text(`Not found: ${event.url.pathname}`, {
@@ -56,7 +50,7 @@ export async function render_page(
56
50
 
57
51
  if (is_action_json_request(event)) {
58
52
  const node = await manifest._.nodes[page.leaf]();
59
- return handle_action_json_request(event, event_state, options, node?.server);
53
+ return handle_action_json_request(event, state, options, node?.server);
60
54
  }
61
55
 
62
56
  try {
@@ -70,11 +64,11 @@ export async function render_page(
70
64
  if (is_action_request(event)) {
71
65
  const remote_id = get_remote_action(event.url);
72
66
  if (remote_id) {
73
- action_result = await handle_remote_form_post(event, event_state, manifest, remote_id);
67
+ action_result = await handle_remote_form_post(event, state, manifest, remote_id);
74
68
  } else {
75
69
  // for action requests, first call handler in +page.server.js
76
70
  // (this also determines status code)
77
- action_result = await handle_action_request(event, event_state, leaf_node.server);
71
+ action_result = await handle_action_request(event, state, leaf_node.server);
78
72
  }
79
73
 
80
74
  if (action_result?.type === 'redirect') {
@@ -120,7 +114,10 @@ export async function render_page(
120
114
  // renders an empty 'shell' page if SSR is turned off and if there is
121
115
  // no server data to prerender. As a result, the load functions and rendering
122
116
  // only occur client-side.
123
- if (ssr === false && !(state.prerendering && should_prerender_data)) {
117
+ if (
118
+ ssr === false &&
119
+ !((state.prerendering || state.prerender_default === true) && should_prerender_data)
120
+ ) {
124
121
  // if the user makes a request through a non-enhanced form, the returned value is lost
125
122
  // because there is no SSR or client-side handling of the response
126
123
  if (DEV && action_result && !event.request.headers.has('x-sveltekit-action')) {
@@ -154,12 +151,11 @@ export async function render_page(
154
151
  status,
155
152
  error: null,
156
153
  event,
157
- event_state,
154
+ state,
158
155
  options,
159
156
  manifest,
160
- state,
161
157
  resolve_opts,
162
- data_serializer: server_data_serializer(event, event_state, options)
158
+ data_serializer: server_data_serializer(event, state, options)
163
159
  });
164
160
  }
165
161
 
@@ -169,10 +165,10 @@ export async function render_page(
169
165
  /** @type {Error | null} */
170
166
  let load_error = null;
171
167
 
172
- const data_serializer = server_data_serializer(event, event_state, options);
168
+ const data_serializer = server_data_serializer(event, state, options);
173
169
  const data_serializer_json =
174
- state.prerendering && should_prerender_data
175
- ? server_data_serializer_json(event, event_state, options)
170
+ (state.prerendering || state.prerender_default === true) && should_prerender_data
171
+ ? server_data_serializer_json(event, state, options)
176
172
  : null;
177
173
 
178
174
  /** @type {Array<Promise<ServerDataNode | null>>} */
@@ -192,7 +188,6 @@ export async function render_page(
192
188
 
193
189
  const server_data = await load_server_data({
194
190
  event,
195
- event_state,
196
191
  state,
197
192
  node,
198
193
  parent: async () => {
@@ -227,7 +222,7 @@ export async function render_page(
227
222
  try {
228
223
  return await load_data({
229
224
  event,
230
- event_state,
225
+ state,
231
226
  fetched,
232
227
  node,
233
228
  parent: async () => {
@@ -239,7 +234,6 @@ export async function render_page(
239
234
  },
240
235
  resolve_opts,
241
236
  server_data_promise: server_promises[i],
242
- state,
243
237
  csr
244
238
  });
245
239
  } catch (e) {
@@ -269,6 +263,7 @@ export async function render_page(
269
263
  if (state.prerendering && should_prerender_data) {
270
264
  const body = JSON.stringify({
271
265
  type: 'redirect',
266
+ status: err.status,
272
267
  location: err.location
273
268
  });
274
269
 
@@ -281,8 +276,8 @@ export async function render_page(
281
276
  return redirect_response(err.status, err.location);
282
277
  }
283
278
 
284
- const status = get_status(err);
285
- const error = await handle_error_and_jsonify(event, event_state, options, err);
279
+ const error = await handle_error_and_jsonify(event, state, options, err);
280
+ const status = error.status;
286
281
 
287
282
  while (i--) {
288
283
  if (page.errors[i]) {
@@ -304,10 +299,9 @@ export async function render_page(
304
299
 
305
300
  return await render_response({
306
301
  event,
307
- event_state,
302
+ state,
308
303
  options,
309
304
  manifest,
310
- state,
311
305
  resolve_opts,
312
306
  page_config: {
313
307
  ssr: nodes.ssr(),
@@ -315,13 +309,7 @@ export async function render_page(
315
309
  },
316
310
  status,
317
311
  error,
318
- error_components: await load_error_components(
319
- options,
320
- ssr,
321
- error_branch,
322
- page,
323
- manifest
324
- ),
312
+ error_components: await load_error_components(ssr, error_branch, page, manifest),
325
313
  branch: error_branch,
326
314
  fetched,
327
315
  data_serializer
@@ -358,10 +346,9 @@ export async function render_page(
358
346
 
359
347
  return await render_response({
360
348
  event,
361
- event_state,
349
+ state,
362
350
  options,
363
351
  manifest,
364
- state,
365
352
  resolve_opts,
366
353
  page_config: {
367
354
  csr,
@@ -372,8 +359,8 @@ export async function render_page(
372
359
  branch: compact(branch),
373
360
  action_result,
374
361
  fetched,
375
- data_serializer: !ssr ? server_data_serializer(event, event_state, options) : data_serializer,
376
- error_components: await load_error_components(options, ssr, branch, page, manifest)
362
+ data_serializer: !ssr ? server_data_serializer(event, state, options) : data_serializer,
363
+ error_components: await load_error_components(ssr, branch, page, manifest)
377
364
  });
378
365
  } catch (e) {
379
366
  // a remote function could have thrown a redirect during render
@@ -385,11 +372,9 @@ export async function render_page(
385
372
  // but the page failed to render, or that a prerendering error occurred
386
373
  return await respond_with_error({
387
374
  event,
388
- event_state,
375
+ state,
389
376
  options,
390
377
  manifest,
391
- state,
392
- status: e instanceof HttpError ? e.status : 500,
393
378
  error: e,
394
379
  resolve_opts
395
380
  });
@@ -397,18 +382,16 @@ export async function render_page(
397
382
  }
398
383
 
399
384
  /**
400
- *
401
- * @param {SSROptions} options
402
385
  * @param {boolean} ssr
403
386
  * @param {Array<import('./types.js').Loaded | null>} branch
404
387
  * @param {PageNodeIndexes} page
405
388
  * @param {SSRManifest} manifest
406
389
  */
407
- async function load_error_components(options, ssr, branch, page, manifest) {
408
- /** @type {Array<SSRComponent | undefined> | undefined} */
390
+ async function load_error_components(ssr, branch, page, manifest) {
391
+ /** @type {Array<Component | undefined> | undefined} */
409
392
  let error_components;
410
393
 
411
- if (options.server_error_boundaries && ssr) {
394
+ if (ssr) {
412
395
  let last_idx = -1;
413
396
  error_components = await Promise.all(
414
397
  // eslint-disable-next-line @typescript-eslint/await-thenable
@@ -2,8 +2,7 @@ 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
4
  import { validate_depends, validate_load_response } from '../../shared.js';
5
- import { with_request_store, merge_tracing } from '@sveltejs/kit/internal/server';
6
- import { record_span } from '../../telemetry/record_span.js';
5
+ import { with_request_store, merge_tracing, record_span } from '@sveltejs/kit/internal/server';
7
6
  import { base64_encode } from '../../utils.js';
8
7
  import { NULL_BODY_STATUS } from '../constants.js';
9
8
  import { get_node_type } from '../utils.js';
@@ -11,15 +10,14 @@ import { get_node_type } from '../utils.js';
11
10
  /**
12
11
  * Calls the user's server `load` function.
13
12
  * @param {{
14
- * event: import('@sveltejs/kit').RequestEvent;
15
- * event_state: import('types').RequestState;
16
- * state: import('types').SSRState;
13
+ * event: import('$app/server').RequestEvent;
14
+ * state: import('types').RequestState;
17
15
  * node: import('types').SSRNode | undefined;
18
16
  * parent: () => Promise<Record<string, any>>;
19
17
  * }} opts
20
18
  * @returns {Promise<import('types').ServerDataNode | null>}
21
19
  */
22
- export async function load_server_data({ event, event_state, state, node, parent }) {
20
+ export async function load_server_data({ event, state, node, parent }) {
23
21
  if (!node?.server) return null;
24
22
 
25
23
  let is_tracking = true;
@@ -67,7 +65,7 @@ export async function load_server_data({ event, event_state, state, node, parent
67
65
  }
68
66
  );
69
67
 
70
- if (state.prerendering) {
68
+ if (state.prerendering || state.prerender_default === true) {
71
69
  disable_search(url);
72
70
  }
73
71
 
@@ -83,7 +81,7 @@ export async function load_server_data({ event, event_state, state, node, parent
83
81
  },
84
82
  fn: async (current) => {
85
83
  const traced_event = merge_tracing(event, current);
86
- const result = await with_request_store({ event: traced_event, state: event_state }, () =>
84
+ const result = await with_request_store({ event: traced_event, state }, () =>
87
85
  load.call(null, {
88
86
  ...traced_event,
89
87
  fetch: (info, init) => {
@@ -193,26 +191,24 @@ export async function load_server_data({ event, event_state, state, node, parent
193
191
  /**
194
192
  * Calls the user's `load` function.
195
193
  * @param {{
196
- * event: import('@sveltejs/kit').RequestEvent;
197
- * event_state: import('types').RequestState;
194
+ * event: import('$app/server').RequestEvent;
195
+ * state: import('types').RequestState;
198
196
  * fetched: import('./types.js').Fetched[];
199
197
  * node: import('types').SSRNode | undefined;
200
198
  * parent: () => Promise<Record<string, any>>;
201
199
  * resolve_opts: import('types').RequiredResolveOptions;
202
200
  * server_data_promise: Promise<import('types').ServerDataNode | null>;
203
- * state: import('types').SSRState;
204
201
  * csr: boolean;
205
202
  * }} opts
206
203
  * @returns {Promise<Record<string, any | Promise<any>> | null>}
207
204
  */
208
205
  export async function load_data({
209
206
  event,
210
- event_state,
207
+ state,
211
208
  fetched,
212
209
  node,
213
210
  parent,
214
211
  server_data_promise,
215
- state,
216
212
  resolve_opts,
217
213
  csr
218
214
  }) {
@@ -234,15 +230,14 @@ export async function load_data({
234
230
  },
235
231
  fn: async (current) => {
236
232
  const traced_event = merge_tracing(event, current);
237
- const child_state = { ...event_state, is_in_universal_load: true };
238
233
 
239
- return await with_request_store({ event: traced_event, state: child_state }, () =>
234
+ return await with_request_store({ event: traced_event, state }, () =>
240
235
  load.call(null, {
241
236
  url: event.url,
242
237
  params: event.params,
243
238
  data: server_data_node?.data ?? null,
244
239
  route: event.route,
245
- fetch: create_universal_fetch(event, state, fetched, csr, resolve_opts),
240
+ fetch: create_universal_fetch(event, state.prerendering, fetched, csr, resolve_opts),
246
241
  setHeaders: event.setHeaders,
247
242
  depends: noop,
248
243
  parent,
@@ -261,14 +256,14 @@ export async function load_data({
261
256
  }
262
257
 
263
258
  /**
264
- * @param {Pick<import('@sveltejs/kit').RequestEvent, 'fetch' | 'url' | 'request' | 'route'>} event
265
- * @param {import('types').SSRState} state
259
+ * @param {Pick<import('$app/server').RequestEvent, 'fetch' | 'url' | 'request' | 'route'>} event
260
+ * @param {import('types').PrerenderOptions | undefined} prerendering
266
261
  * @param {import('./types.js').Fetched[]} fetched
267
262
  * @param {boolean} csr
268
- * @param {Pick<Required<import('@sveltejs/kit').ResolveOptions>, 'filterSerializedResponseHeaders'>} resolve_opts
263
+ * @param {Pick<Required<import('@sveltejs/kit/hooks').ResolveOptions>, 'filterSerializedResponseHeaders'>} resolve_opts
269
264
  * @returns {typeof fetch}
270
265
  */
271
- export function create_universal_fetch(event, state, fetched, csr, resolve_opts) {
266
+ export function create_universal_fetch(event, prerendering, fetched, csr, resolve_opts) {
272
267
  /**
273
268
  * @param {URL | RequestInfo} input
274
269
  * @param {RequestInit} [init]
@@ -290,9 +285,9 @@ export function create_universal_fetch(event, state, fetched, csr, resolve_opts)
290
285
  let dependency;
291
286
 
292
287
  if (same_origin) {
293
- if (state.prerendering) {
288
+ if (prerendering) {
294
289
  dependency = { response, body: null };
295
- state.prerendering.dependencies.set(url.pathname, dependency);
290
+ prerendering.dependencies.set(url.pathname, dependency);
296
291
  }
297
292
  } else if (url.protocol === 'https:' || url.protocol === 'http:') {
298
293
  // simulate CORS errors and "no access to body in no-cors mode" server-side for consistency with client-side behaviour
@@ -334,14 +329,24 @@ export function create_universal_fetch(event, state, fetched, csr, resolve_opts)
334
329
  );
335
330
  }
336
331
 
332
+ const request_body =
333
+ input instanceof Request && cloned_body
334
+ ? await new Response(cloned_body).text()
335
+ : init?.body;
336
+
337
+ if (
338
+ request_body &&
339
+ typeof request_body !== 'string' &&
340
+ !ArrayBuffer.isView(request_body)
341
+ ) {
342
+ // requests whose body can't be hashed aren't serialized — the browser repeats the fetch
343
+ return;
344
+ }
345
+
337
346
  fetched.push({
338
347
  url: same_origin ? url.href.slice(event.url.origin.length) : url.href,
339
348
  method: event.request.method,
340
- request_body: /** @type {string | ArrayBufferView | undefined} */ (
341
- input instanceof Request && cloned_body
342
- ? await stream_to_string(cloned_body)
343
- : init?.body
344
- ),
349
+ request_body: /** @type {string | ArrayBufferView | null | undefined} */ (request_body),
345
350
  request_headers: cloned_headers,
346
351
  response_body: body,
347
352
  response,
@@ -361,23 +366,14 @@ export function create_universal_fetch(event, state, fetched, csr, resolve_opts)
361
366
  const [a, b] = response.body.tee();
362
367
 
363
368
  void (async () => {
364
- let result = new Uint8Array();
365
-
366
- for await (const chunk of a) {
367
- const combined = new Uint8Array(result.length + chunk.length);
368
-
369
- combined.set(result, 0);
370
- combined.set(chunk, result.length);
371
-
372
- result = combined;
373
- }
369
+ const result = new Uint8Array(await new Response(a).arrayBuffer());
374
370
 
375
371
  if (dependency) {
376
372
  dependency.body = new Uint8Array(result);
377
373
  }
378
374
 
379
375
  void push_fetched(base64_encode(result), true);
380
- })();
376
+ })().catch(noop); // prevent unhandled rejection potentially crashing the process
381
377
 
382
378
  return (teed_body = b);
383
379
  }
@@ -465,13 +461,28 @@ export function create_universal_fetch(event, state, fetched, csr, resolve_opts)
465
461
  const included = resolve_opts.filterSerializedResponseHeaders(lower, value);
466
462
  if (!included) {
467
463
  throw new Error(
468
- `Failed to get response header "${lower}" — it must be included by the \`filterSerializedResponseHeaders\` option: https://svelte.dev/docs/kit/hooks#Server-hooks-handle (at ${event.route.id})`
464
+ `Failed to get response header "${lower}" — it must be included by the \`filterSerializedResponseHeaders\` option: https://svelte.dev/docs/kit/hooks#handle (at ${event.route.id})`
469
465
  );
470
466
  }
471
467
  }
472
468
 
473
469
  return value;
474
470
  };
471
+
472
+ const get_set_cookie = response.headers.getSetCookie;
473
+ response.headers.getSetCookie = () => {
474
+ const values = get_set_cookie.call(response.headers);
475
+ for (const value of values) {
476
+ const included = resolve_opts.filterSerializedResponseHeaders('set-cookie', value);
477
+ if (!included) {
478
+ throw new Error(
479
+ `Failed to get response header "set-cookie" — it must be included by the \`filterSerializedResponseHeaders\` option: https://svelte.dev/docs/kit/hooks#handle (at ${event.route.id})`
480
+ );
481
+ }
482
+ }
483
+
484
+ return values;
485
+ };
475
486
  }
476
487
 
477
488
  return proxy;
@@ -486,21 +497,3 @@ export function create_universal_fetch(event, state, fetched, csr, resolve_opts)
486
497
  return response;
487
498
  };
488
499
  }
489
-
490
- /**
491
- * @param {ReadableStream<Uint8Array>} stream
492
- */
493
- async function stream_to_string(stream) {
494
- let result = '';
495
- const reader = stream.getReader();
496
- const decoder = new TextDecoder();
497
- while (true) {
498
- const { done, value } = await reader.read();
499
- if (done) {
500
- result += decoder.decode();
501
- break;
502
- }
503
- result += decoder.decode(value, { stream: true });
504
- }
505
- return result;
506
- }