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

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 (192) hide show
  1. package/package.json +58 -36
  2. package/src/cli.js +14 -11
  3. package/src/constants.js +6 -1
  4. package/src/core/adapt/builder.js +54 -60
  5. package/src/core/adapt/index.js +2 -5
  6. package/src/core/config/index.js +141 -76
  7. package/src/core/config/options.js +260 -260
  8. package/src/core/config/types.d.ts +1 -1
  9. package/src/core/env.js +143 -13
  10. package/src/core/generate_manifest/index.js +18 -15
  11. package/src/core/postbuild/analyse.js +7 -19
  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 +193 -69
  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 +72 -52
  19. package/src/core/sync/sync.js +35 -26
  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} +105 -56
  23. package/src/core/sync/write_client_manifest.js +13 -28
  24. package/src/core/sync/write_env.js +7 -5
  25. package/src/core/sync/write_server.js +25 -33
  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 +119 -116
  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 +194 -0
  36. package/src/exports/hooks/sequence.js +9 -6
  37. package/src/exports/index.js +53 -20
  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} +1 -2
  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 +219 -1118
  49. package/src/exports/url.js +86 -0
  50. package/src/exports/vite/build/build_server.js +53 -64
  51. package/src/exports/vite/build/remote.js +24 -19
  52. package/src/exports/vite/build/utils.js +0 -8
  53. package/src/exports/vite/dev/index.js +199 -125
  54. package/src/exports/vite/index.js +1514 -833
  55. package/src/exports/vite/module_ids.js +2 -2
  56. package/src/exports/vite/preview/index.js +32 -24
  57. package/src/exports/vite/utils.js +83 -45
  58. package/src/pathname.js +55 -0
  59. package/src/runner.js +15 -0
  60. package/src/runtime/app/env/internal.js +4 -4
  61. package/src/runtime/app/env/types.d.ts +1 -1
  62. package/src/runtime/app/environment/index.js +3 -3
  63. package/src/runtime/app/{forms.js → forms/index.js} +73 -42
  64. package/src/runtime/app/forms/public.d.ts +2 -0
  65. package/src/runtime/app/forms/types.d.ts +56 -0
  66. package/src/runtime/app/internal/transport.js +53 -0
  67. package/src/runtime/app/manifest/index.js +1 -0
  68. package/src/runtime/app/{navigation.js → navigation/index.js} +2 -1
  69. package/src/runtime/app/navigation/public.d.ts +237 -0
  70. package/src/runtime/app/paths/client.js +37 -37
  71. package/src/runtime/app/paths/index.js +1 -1
  72. package/src/runtime/app/paths/internal/client.js +34 -2
  73. package/src/runtime/app/paths/internal/server.js +6 -23
  74. package/src/runtime/app/paths/internal.d.ts +3 -0
  75. package/src/runtime/app/paths/public.d.ts +1 -29
  76. package/src/runtime/app/paths/server.js +36 -17
  77. package/src/runtime/app/paths/types.d.ts +11 -19
  78. package/src/runtime/app/server/index.js +2 -2
  79. package/src/runtime/app/server/public.d.ts +519 -0
  80. package/src/runtime/app/server/remote/command.js +13 -11
  81. package/src/runtime/app/server/remote/form.js +61 -39
  82. package/src/runtime/app/server/remote/prerender.js +45 -45
  83. package/src/runtime/app/server/remote/query.js +106 -108
  84. package/src/runtime/app/server/remote/requested.js +27 -19
  85. package/src/runtime/app/server/remote/shared.js +75 -75
  86. package/src/runtime/app/service-worker/index.js +24 -0
  87. package/src/runtime/app/state/client.js +4 -2
  88. package/src/runtime/app/state/index.js +7 -5
  89. package/src/runtime/app/state/public.d.ts +72 -0
  90. package/src/runtime/app/state/server.js +3 -0
  91. package/src/runtime/app/stores.js +15 -78
  92. package/src/runtime/client/bundle.js +1 -1
  93. package/src/runtime/client/client-entry.js +3 -0
  94. package/src/runtime/client/client.js +1336 -648
  95. package/src/runtime/client/constants.js +3 -6
  96. package/src/runtime/client/entry.js +24 -3
  97. package/src/runtime/client/fetcher.js +25 -25
  98. package/src/runtime/client/ndjson.js +1 -1
  99. package/src/runtime/client/parse.js +1 -1
  100. package/src/runtime/client/payload.js +17 -0
  101. package/src/runtime/client/remote-functions/cache.svelte.js +3 -1
  102. package/src/runtime/client/remote-functions/command.svelte.js +37 -61
  103. package/src/runtime/client/remote-functions/form.svelte.js +267 -178
  104. package/src/runtime/client/remote-functions/prerender.svelte.js +32 -11
  105. package/src/runtime/client/remote-functions/query/index.js +10 -17
  106. package/src/runtime/client/remote-functions/query/instance.svelte.js +64 -18
  107. package/src/runtime/client/remote-functions/query/proxy.js +5 -5
  108. package/src/runtime/client/remote-functions/query-batch.svelte.js +61 -70
  109. package/src/runtime/client/remote-functions/query-live/index.js +1 -1
  110. package/src/runtime/client/remote-functions/query-live/instance.svelte.js +63 -21
  111. package/src/runtime/client/remote-functions/query-live/iterator.js +15 -12
  112. package/src/runtime/client/remote-functions/query-live/proxy.js +2 -12
  113. package/src/runtime/client/remote-functions/shared.svelte.js +90 -65
  114. package/src/runtime/client/snapshots.js +147 -0
  115. package/src/runtime/client/state.svelte.js +94 -55
  116. package/src/runtime/client/stream.js +3 -2
  117. package/src/runtime/client/types.d.ts +13 -9
  118. package/src/runtime/client/utils.js +22 -110
  119. package/src/runtime/components/root.svelte +56 -0
  120. package/src/runtime/env/dynamic/private.js +7 -0
  121. package/src/runtime/env/dynamic/public.js +7 -0
  122. package/src/runtime/env/static/private.js +6 -0
  123. package/src/runtime/env/static/public.js +6 -0
  124. package/src/runtime/form-utils.js +172 -61
  125. package/src/runtime/pathname.js +20 -32
  126. package/src/runtime/props.svelte.js +72 -0
  127. package/src/runtime/server/constants.js +0 -3
  128. package/src/runtime/server/cookie.js +70 -53
  129. package/src/runtime/server/csrf.js +65 -0
  130. package/src/runtime/server/data/index.js +48 -52
  131. package/src/runtime/server/dev.js +22 -0
  132. package/src/runtime/server/endpoint.js +3 -4
  133. package/src/runtime/server/env_module.js +0 -5
  134. package/src/runtime/server/errors.js +160 -0
  135. package/src/runtime/server/fetch.js +31 -38
  136. package/src/runtime/server/index.js +90 -64
  137. package/src/runtime/server/internal.js +71 -0
  138. package/src/runtime/server/page/actions.js +84 -64
  139. package/src/runtime/server/page/crypto.js +2 -2
  140. package/src/runtime/server/page/csp.js +88 -104
  141. package/src/runtime/server/page/data_serializer.js +22 -23
  142. package/src/runtime/server/page/index.js +35 -53
  143. package/src/runtime/server/page/load_data.js +47 -54
  144. package/src/runtime/server/page/render.js +172 -238
  145. package/src/runtime/server/page/respond_with_error.js +16 -30
  146. package/src/runtime/server/page/serialize_data.js +2 -13
  147. package/src/runtime/server/page/server_routing.js +85 -26
  148. package/src/runtime/server/remote-functions.js +639 -0
  149. package/src/runtime/server/respond.js +188 -129
  150. package/src/runtime/server/sourcemaps.js +183 -0
  151. package/src/runtime/server/state.js +53 -0
  152. package/src/runtime/server/utils.js +12 -154
  153. package/src/runtime/shared.js +20 -40
  154. package/src/runtime/utils.js +3 -0
  155. package/src/types/ambient-private.d.ts +11 -1
  156. package/src/types/ambient.d.ts +87 -36
  157. package/src/types/global-private.d.ts +25 -25
  158. package/src/types/internal.d.ts +160 -150
  159. package/src/types/private.d.ts +41 -1
  160. package/src/utils/error.js +28 -4
  161. package/src/utils/escape.js +9 -25
  162. package/src/utils/features.js +1 -1
  163. package/src/utils/filesystem.js +1 -23
  164. package/src/utils/fork.js +7 -2
  165. package/src/utils/hash.js +21 -0
  166. package/src/utils/http.js +8 -7
  167. package/src/utils/import.js +9 -2
  168. package/src/utils/imports.js +83 -0
  169. package/src/utils/mime.js +9 -0
  170. package/src/utils/page_nodes.js +6 -7
  171. package/src/utils/params.js +67 -0
  172. package/src/utils/regex.js +9 -0
  173. package/src/utils/routing.js +145 -73
  174. package/src/utils/shared-iterator.js +5 -0
  175. package/src/utils/streaming.js +14 -4
  176. package/src/utils/url.js +33 -2
  177. package/src/version.js +1 -1
  178. package/types/index.d.ts +2291 -2135
  179. package/types/index.d.ts.map +116 -108
  180. package/src/core/sync/write_ambient.js +0 -18
  181. package/src/core/sync/write_root.js +0 -148
  182. package/src/core/sync/write_tsconfig.js +0 -250
  183. package/src/exports/internal/server.js +0 -22
  184. package/src/exports/node/polyfills.js +0 -30
  185. package/src/runtime/server/app.js +0 -9
  186. package/src/runtime/server/remote.js +0 -457
  187. package/src/runtime/shared-server.js +0 -7
  188. package/src/runtime/telemetry/otel.js +0 -21
  189. package/src/runtime/telemetry/record_span.js +0 -65
  190. package/src/types/synthetic/$lib.md +0 -5
  191. /package/src/exports/internal/{remote-functions.js → server/remote-functions.js} +0 -0
  192. /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
11
  * @param {import('@sveltejs/kit').RequestEvent} event
15
- * @param {import('types').RequestState} event_state
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
  }
@@ -127,19 +126,17 @@ export function server_data_serializer(event, event_state, options) {
127
126
  * If the serialized data contains promises, `chunks` will be an
128
127
  * async iterable containing their resolutions
129
128
  * @param {import('@sveltejs/kit').RequestEvent} event
130
- * @param {import('types').RequestState} event_state
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,15 @@
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 { RequestEvent, SSRManifest } from '@sveltejs/kit' */
3
+ /** @import { ActionResult } from '$app/forms' */
4
+ /** @import { PageNodeIndexes, RequestState, RequiredResolveOptions, ServerDataNode, SSRNode, SSROptions } from 'types' */
3
5
  import { text } from '@sveltejs/kit';
4
- import { HttpError, Redirect } from '@sveltejs/kit/internal';
6
+ import { Redirect } from '@sveltejs/kit/internal';
5
7
  import { compact } from '../../../utils/array.js';
6
8
  import { get_status, normalize_error } from '../../../utils/error.js';
7
9
  import { noop } from '../../../utils/functions.js';
8
10
  import { add_data_suffix } from '../../pathname.js';
9
- import { redirect_response, static_error_page, handle_error_and_jsonify } from '../utils.js';
11
+ import { redirect_response } from '../utils.js';
12
+ import { static_error_page, handle_error_and_jsonify } from '../errors.js';
10
13
  import {
11
14
  handle_action_json_request,
12
15
  handle_action_request,
@@ -18,7 +21,7 @@ import { load_data, load_server_data } from './load_data.js';
18
21
  import { render_response } from './render.js';
19
22
  import { respond_with_error } from './respond_with_error.js';
20
23
  import { DEV } from 'esm-env';
21
- import { get_remote_action, handle_remote_form_post } from '../remote.js';
24
+ import { get_remote_action, handle_remote_form_post } from '../remote-functions.js';
22
25
  import { PageNodes } from '../../../utils/page_nodes.js';
23
26
 
24
27
  /**
@@ -28,25 +31,15 @@ const MAX_DEPTH = 10;
28
31
 
29
32
  /**
30
33
  * @param {RequestEvent} event
31
- * @param {RequestState} event_state
34
+ * @param {RequestState} state
32
35
  * @param {PageNodeIndexes} page
33
36
  * @param {SSROptions} options
34
37
  * @param {SSRManifest} manifest
35
- * @param {SSRState} state
36
38
  * @param {import('../../../utils/page_nodes.js').PageNodes} nodes
37
39
  * @param {RequiredResolveOptions} resolve_opts
38
40
  * @returns {Promise<Response>}
39
41
  */
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
- ) {
42
+ export async function render_page(event, state, page, options, manifest, nodes, resolve_opts) {
50
43
  if (state.depth > MAX_DEPTH) {
51
44
  // infinite request cycle detected
52
45
  return text(`Not found: ${event.url.pathname}`, {
@@ -56,7 +49,7 @@ export async function render_page(
56
49
 
57
50
  if (is_action_json_request(event)) {
58
51
  const node = await manifest._.nodes[page.leaf]();
59
- return handle_action_json_request(event, event_state, options, node?.server);
52
+ return handle_action_json_request(event, state, options, node?.server);
60
53
  }
61
54
 
62
55
  try {
@@ -70,11 +63,11 @@ export async function render_page(
70
63
  if (is_action_request(event)) {
71
64
  const remote_id = get_remote_action(event.url);
72
65
  if (remote_id) {
73
- action_result = await handle_remote_form_post(event, event_state, manifest, remote_id);
66
+ action_result = await handle_remote_form_post(event, state, manifest, remote_id);
74
67
  } else {
75
68
  // for action requests, first call handler in +page.server.js
76
69
  // (this also determines status code)
77
- action_result = await handle_action_request(event, event_state, leaf_node.server);
70
+ action_result = await handle_action_request(event, state, leaf_node.server);
78
71
  }
79
72
 
80
73
  if (action_result?.type === 'redirect') {
@@ -120,7 +113,10 @@ export async function render_page(
120
113
  // renders an empty 'shell' page if SSR is turned off and if there is
121
114
  // no server data to prerender. As a result, the load functions and rendering
122
115
  // only occur client-side.
123
- if (ssr === false && !(state.prerendering && should_prerender_data)) {
116
+ if (
117
+ ssr === false &&
118
+ !((state.prerendering || state.prerender_default === true) && should_prerender_data)
119
+ ) {
124
120
  // if the user makes a request through a non-enhanced form, the returned value is lost
125
121
  // because there is no SSR or client-side handling of the response
126
122
  if (DEV && action_result && !event.request.headers.has('x-sveltekit-action')) {
@@ -154,12 +150,11 @@ export async function render_page(
154
150
  status,
155
151
  error: null,
156
152
  event,
157
- event_state,
153
+ state,
158
154
  options,
159
155
  manifest,
160
- state,
161
156
  resolve_opts,
162
- data_serializer: server_data_serializer(event, event_state, options)
157
+ data_serializer: server_data_serializer(event, state, options)
163
158
  });
164
159
  }
165
160
 
@@ -169,10 +164,10 @@ export async function render_page(
169
164
  /** @type {Error | null} */
170
165
  let load_error = null;
171
166
 
172
- const data_serializer = server_data_serializer(event, event_state, options);
167
+ const data_serializer = server_data_serializer(event, state, options);
173
168
  const data_serializer_json =
174
- state.prerendering && should_prerender_data
175
- ? server_data_serializer_json(event, event_state, options)
169
+ (state.prerendering || state.prerender_default === true) && should_prerender_data
170
+ ? server_data_serializer_json(event, state, options)
176
171
  : null;
177
172
 
178
173
  /** @type {Array<Promise<ServerDataNode | null>>} */
@@ -192,7 +187,6 @@ export async function render_page(
192
187
 
193
188
  const server_data = await load_server_data({
194
189
  event,
195
- event_state,
196
190
  state,
197
191
  node,
198
192
  parent: async () => {
@@ -227,7 +221,7 @@ export async function render_page(
227
221
  try {
228
222
  return await load_data({
229
223
  event,
230
- event_state,
224
+ state,
231
225
  fetched,
232
226
  node,
233
227
  parent: async () => {
@@ -239,7 +233,6 @@ export async function render_page(
239
233
  },
240
234
  resolve_opts,
241
235
  server_data_promise: server_promises[i],
242
- state,
243
236
  csr
244
237
  });
245
238
  } catch (e) {
@@ -269,6 +262,7 @@ export async function render_page(
269
262
  if (state.prerendering && should_prerender_data) {
270
263
  const body = JSON.stringify({
271
264
  type: 'redirect',
265
+ status: err.status,
272
266
  location: err.location
273
267
  });
274
268
 
@@ -281,8 +275,8 @@ export async function render_page(
281
275
  return redirect_response(err.status, err.location);
282
276
  }
283
277
 
284
- const status = get_status(err);
285
- const error = await handle_error_and_jsonify(event, event_state, options, err);
278
+ const error = await handle_error_and_jsonify(event, state, options, err);
279
+ const status = error.status;
286
280
 
287
281
  while (i--) {
288
282
  if (page.errors[i]) {
@@ -304,10 +298,9 @@ export async function render_page(
304
298
 
305
299
  return await render_response({
306
300
  event,
307
- event_state,
301
+ state,
308
302
  options,
309
303
  manifest,
310
- state,
311
304
  resolve_opts,
312
305
  page_config: {
313
306
  ssr: nodes.ssr(),
@@ -315,13 +308,7 @@ export async function render_page(
315
308
  },
316
309
  status,
317
310
  error,
318
- error_components: await load_error_components(
319
- options,
320
- ssr,
321
- error_branch,
322
- page,
323
- manifest
324
- ),
311
+ error_components: await load_error_components(ssr, error_branch, page, manifest),
325
312
  branch: error_branch,
326
313
  fetched,
327
314
  data_serializer
@@ -358,10 +345,9 @@ export async function render_page(
358
345
 
359
346
  return await render_response({
360
347
  event,
361
- event_state,
348
+ state,
362
349
  options,
363
350
  manifest,
364
- state,
365
351
  resolve_opts,
366
352
  page_config: {
367
353
  csr,
@@ -372,8 +358,8 @@ export async function render_page(
372
358
  branch: compact(branch),
373
359
  action_result,
374
360
  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)
361
+ data_serializer: !ssr ? server_data_serializer(event, state, options) : data_serializer,
362
+ error_components: await load_error_components(ssr, branch, page, manifest)
377
363
  });
378
364
  } catch (e) {
379
365
  // a remote function could have thrown a redirect during render
@@ -385,11 +371,9 @@ export async function render_page(
385
371
  // but the page failed to render, or that a prerendering error occurred
386
372
  return await respond_with_error({
387
373
  event,
388
- event_state,
374
+ state,
389
375
  options,
390
376
  manifest,
391
- state,
392
- status: e instanceof HttpError ? e.status : 500,
393
377
  error: e,
394
378
  resolve_opts
395
379
  });
@@ -397,18 +381,16 @@ export async function render_page(
397
381
  }
398
382
 
399
383
  /**
400
- *
401
- * @param {SSROptions} options
402
384
  * @param {boolean} ssr
403
385
  * @param {Array<import('./types.js').Loaded | null>} branch
404
386
  * @param {PageNodeIndexes} page
405
387
  * @param {SSRManifest} manifest
406
388
  */
407
- async function load_error_components(options, ssr, branch, page, manifest) {
408
- /** @type {Array<SSRComponent | undefined> | undefined} */
389
+ async function load_error_components(ssr, branch, page, manifest) {
390
+ /** @type {Array<Component | undefined> | undefined} */
409
391
  let error_components;
410
392
 
411
- if (options.server_error_boundaries && ssr) {
393
+ if (ssr) {
412
394
  let last_idx = -1;
413
395
  error_components = await Promise.all(
414
396
  // 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';
@@ -12,14 +11,13 @@ import { get_node_type } from '../utils.js';
12
11
  * Calls the user's server `load` function.
13
12
  * @param {{
14
13
  * event: import('@sveltejs/kit').RequestEvent;
15
- * event_state: import('types').RequestState;
16
- * state: import('types').SSRState;
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) => {
@@ -194,25 +192,23 @@ export async function load_server_data({ event, event_state, state, node, parent
194
192
  * Calls the user's `load` function.
195
193
  * @param {{
196
194
  * event: import('@sveltejs/kit').RequestEvent;
197
- * event_state: import('types').RequestState;
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,
@@ -262,13 +257,13 @@ export async function load_data({
262
257
 
263
258
  /**
264
259
  * @param {Pick<import('@sveltejs/kit').RequestEvent, 'fetch' | 'url' | 'request' | 'route'>} event
265
- * @param {import('types').SSRState} state
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
- }