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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/package.json +16 -10
  2. package/src/constants.js +6 -0
  3. package/src/core/adapt/builder.js +128 -33
  4. package/src/core/adapt/index.js +3 -0
  5. package/src/core/config/index.js +4 -7
  6. package/src/core/env.js +39 -14
  7. package/src/core/generate_manifest/index.js +42 -43
  8. package/src/core/postbuild/analyse.js +4 -4
  9. package/src/core/postbuild/fallback.js +1 -1
  10. package/src/core/postbuild/prerender.js +4 -4
  11. package/src/core/sync/create_manifest_data/index.js +0 -1
  12. package/src/core/sync/write_app_manifest.js +3 -2
  13. package/src/core/sync/write_server.js +3 -17
  14. package/src/core/utils.js +10 -0
  15. package/src/exports/adapter.js +22 -0
  16. package/src/exports/public.d.ts +101 -49
  17. package/src/exports/vite/build/index.js +1173 -0
  18. package/src/exports/vite/build/remote.js +4 -4
  19. package/src/exports/vite/build/service-worker.js +98 -0
  20. package/src/exports/vite/dev/generate_manifest.js +308 -0
  21. package/src/exports/vite/dev/index.js +40 -282
  22. package/src/exports/vite/index.js +156 -1717
  23. package/src/exports/vite/plugins/env-vars.js +53 -34
  24. package/src/exports/vite/plugins/guard.js +217 -0
  25. package/src/exports/vite/plugins/remote.js +237 -0
  26. package/src/exports/vite/preview/index.js +8 -8
  27. package/src/exports/vite/static_analysis/index.js +15 -15
  28. package/src/exports/vite/utils.js +98 -1
  29. package/src/runner.js +4 -3
  30. package/src/runtime/app/paths/server.js +2 -2
  31. package/src/runtime/app/server/index.js +3 -3
  32. package/src/runtime/app/server/public.d.ts +114 -57
  33. package/src/runtime/app/server/remote/query.js +2 -2
  34. package/src/runtime/app/server/remote/requested.js +31 -15
  35. package/src/runtime/app/state/client.svelte.js +3 -1
  36. package/src/runtime/client/client.js +43 -198
  37. package/src/runtime/client/fetcher.js +6 -6
  38. package/src/runtime/client/focus.js +120 -0
  39. package/src/runtime/client/remote-functions/command.svelte.js +20 -9
  40. package/src/runtime/client/remote-functions/form.svelte.js +12 -7
  41. package/src/runtime/client/remote-functions/query/instance.svelte.js +19 -5
  42. package/src/runtime/client/remote-functions/shared.svelte.js +22 -1
  43. package/src/runtime/client/scroll.js +39 -0
  44. package/src/runtime/client/utils.js +28 -0
  45. package/src/runtime/form-utils.js +254 -264
  46. package/src/runtime/server/data/index.js +14 -36
  47. package/src/runtime/server/errors.js +7 -10
  48. package/src/runtime/server/fetch.js +21 -25
  49. package/src/runtime/server/index.js +35 -31
  50. package/src/runtime/server/internal.js +34 -5
  51. package/src/runtime/server/page/actions.js +6 -8
  52. package/src/runtime/server/page/data_serializer.js +6 -10
  53. package/src/runtime/server/page/index.js +18 -28
  54. package/src/runtime/server/page/load_data.js +2 -2
  55. package/src/runtime/server/page/render.js +22 -40
  56. package/src/runtime/server/page/respond_with_error.js +10 -13
  57. package/src/runtime/server/page/server_routing.js +21 -27
  58. package/src/runtime/server/remote-functions.js +136 -136
  59. package/src/runtime/server/respond.js +66 -64
  60. package/src/runtime/server/state.js +2 -0
  61. package/src/runtime/server/utils.js +4 -11
  62. package/src/runtime/shared.js +9 -0
  63. package/src/runtime/utils.js +41 -0
  64. package/src/types/ambient-private.d.ts +1 -2
  65. package/src/types/global-private.d.ts +8 -0
  66. package/src/types/internal.d.ts +56 -17
  67. package/src/utils/filesystem.js +44 -28
  68. package/src/utils/streaming.js +5 -15
  69. package/src/version.js +1 -1
  70. package/types/index.d.ts +235 -93
  71. package/types/index.d.ts.map +9 -2
@@ -6,28 +6,19 @@ import { server_data_serializer_json } from '../page/data_serializer.js';
6
6
  import { load_server_data } from '../page/load_data.js';
7
7
  import { handle_error_and_jsonify } from '../errors.js';
8
8
  import { normalize_path } from '../../../utils/url.js';
9
- import { text_encoder } from '../../utils.js';
9
+ import { stream_text } from '../../utils.js';
10
10
  import { with_version_header } from '../utils.js';
11
+ import { manifest } from '../internal.js';
11
12
 
12
13
  /**
13
14
  * @param {import('@sveltejs/kit').RequestEvent} event
14
15
  * @param {import('types').RequestState} state
15
16
  * @param {{ page: Pick<import('types').PageNodeIndexes, 'layouts' | 'leaf'> | null }} route
16
- * @param {import('types').SSROptions} options
17
- * @param {import('@sveltejs/kit').SSRManifest} manifest
18
17
  * @param {boolean[] | undefined} invalidated_data_nodes
19
18
  * @param {import('types').TrailingSlash} trailing_slash
20
19
  * @returns {Promise<Response>}
21
20
  */
22
- export async function render_data(
23
- event,
24
- state,
25
- route,
26
- options,
27
- manifest,
28
- invalidated_data_nodes,
29
- trailing_slash
30
- ) {
21
+ export async function render_data(event, state, route, invalidated_data_nodes, trailing_slash) {
31
22
  if (!route.page) {
32
23
  // requesting /__data.json should fail for a +server.js
33
24
  return with_version_header(new Response(undefined, { status: 404 }));
@@ -54,7 +45,7 @@ export async function render_data(
54
45
  }
55
46
 
56
47
  // == because it could be undefined (in dev) or null (in build, because of JSON.stringify)
57
- const node = n == undefined ? n : await manifest._.nodes[n]();
48
+ const node = n == undefined ? n : await manifest.nodes[n]();
58
49
  // load this. for the child, return as is. for the final result, stream things
59
50
  return load_server_data({
60
51
  event: new_event,
@@ -92,7 +83,7 @@ export async function render_data(
92
83
  return fn();
93
84
  });
94
85
 
95
- const data_serializer = server_data_serializer_json(event, state, options);
86
+ const data_serializer = server_data_serializer_json(event, state);
96
87
  await Promise.all(
97
88
  promises.map(async (p, i) => {
98
89
  const node = await p.catch(async (error) => {
@@ -100,7 +91,7 @@ export async function render_data(
100
91
  throw error;
101
92
  }
102
93
 
103
- const transformed = await handle_error_and_jsonify(event, state, options, error);
94
+ const transformed = await handle_error_and_jsonify(event, state, error);
104
95
 
105
96
  return /** @type {import('types').ServerErrorNode} */ ({
106
97
  type: 'error',
@@ -120,27 +111,14 @@ export async function render_data(
120
111
  }
121
112
 
122
113
  return with_version_header(
123
- new Response(
124
- new ReadableStream({
125
- async start(controller) {
126
- controller.enqueue(text_encoder.encode(data));
127
- for await (const chunk of chunks) {
128
- controller.enqueue(text_encoder.encode(chunk));
129
- }
130
- controller.close();
131
- },
132
-
133
- type: 'bytes'
134
- }),
135
- {
136
- headers: {
137
- // we use a proprietary content type to prevent buffering.
138
- // the `text` prefix makes it inspectable
139
- 'content-type': 'text/sveltekit-data',
140
- 'cache-control': 'private, no-store'
141
- }
114
+ new Response(stream_text(data, chunks), {
115
+ headers: {
116
+ // we use a proprietary content type to prevent buffering.
117
+ // the `text` prefix makes it inspectable
118
+ 'content-type': 'text/sveltekit-data',
119
+ 'cache-control': 'private, no-store'
142
120
  }
143
- )
121
+ })
144
122
  );
145
123
  } catch (e) {
146
124
  const error = normalize_error(e);
@@ -148,7 +126,7 @@ export async function render_data(
148
126
  if (error instanceof Redirect) {
149
127
  return redirect_json_response(error);
150
128
  } else {
151
- const transformed = await handle_error_and_jsonify(event, state, options, error);
129
+ const transformed = await handle_error_and_jsonify(event, state, error);
152
130
  return json_response(transformed, transformed.status);
153
131
  }
154
132
  }
@@ -8,17 +8,16 @@ import {
8
8
  import { with_request_store } from '@sveltejs/kit/internal/server';
9
9
  import { add_deprecated_handle_error_properties, coalesce_to_error } from '../../utils/error.js';
10
10
  import { negotiate } from '../../utils/http.js';
11
- import { fix_stack_trace } from './internal.js';
11
+ import { fix_stack_trace, hooks, options } from './internal.js';
12
12
  import { escape_html } from '../../utils/escape.js';
13
13
 
14
14
  /**
15
15
  * @param {import('@sveltejs/kit').RequestEvent} event
16
16
  * @param {import('types').RequestState} state
17
- * @param {import('types').SSROptions} options
18
17
  * @param {unknown} error
19
18
  */
20
- export async function handle_fatal_error(event, state, options, error) {
21
- const body = await handle_error_and_jsonify(event, state, options, error);
19
+ export async function handle_fatal_error(event, state, error) {
20
+ const body = await handle_error_and_jsonify(event, state, error);
22
21
  const status = body.status;
23
22
 
24
23
  // sec-fetch-dest would be nicer, but non-browser clients and plain HTTP hosts don't send it
@@ -33,17 +32,16 @@ export async function handle_fatal_error(event, state, options, error) {
33
32
  });
34
33
  }
35
34
 
36
- return static_error_page(options, status, body.message);
35
+ return static_error_page(status, body.message);
37
36
  }
38
37
 
39
38
  /**
40
39
  * @param {import('@sveltejs/kit').RequestEvent} event
41
40
  * @param {import('types').RequestState} state
42
- * @param {import('types').SSROptions} options
43
41
  * @param {any} error
44
42
  * @returns {App.Error | Promise<App.Error>}
45
43
  */
46
- export function handle_error_and_jsonify(event, state, options, error) {
44
+ export function handle_error_and_jsonify(event, state, error) {
47
45
  if (error instanceof HandledHttpError) {
48
46
  return error.body;
49
47
  }
@@ -90,7 +88,7 @@ export function handle_error_and_jsonify(event, state, options, error) {
90
88
  const input = { ...caught, event };
91
89
  if (__SVELTEKIT_DEV__) add_deprecated_handle_error_properties(input, fallback);
92
90
 
93
- result = with_request_store({ event, state }, () => options.hooks.handleError(input));
91
+ result = with_request_store({ event, state }, () => hooks.handleError(input));
94
92
  } catch (hook_error) {
95
93
  log_handle_error_hook_failure(error, hook_error);
96
94
  return { status: fallback.status, message: 'Internal Error' };
@@ -141,11 +139,10 @@ function log_handle_error_hook_failure(error, hook_error) {
141
139
  /**
142
140
  * Return as a response that renders the error.html
143
141
  *
144
- * @param {import('types').SSROptions} options
145
142
  * @param {number} status
146
143
  * @param {string} message
147
144
  */
148
- export function static_error_page(options, status, message) {
145
+ export function static_error_page(status, message) {
149
146
  let page = options.templates.error({ status, message: escape_html(message) });
150
147
 
151
148
  if (__SVELTEKIT_DEV__) {
@@ -2,22 +2,20 @@ import { parseSetCookie } from 'cookie';
2
2
  import { noop } from '../../utils/functions.js';
3
3
  import { respond } from './respond.js';
4
4
  import * as paths from '#app/paths';
5
- import { read_implementation } from './internal.js';
5
+ import { hooks, manifest, read_implementation } from './internal.js';
6
6
  import { has_prerendered_path } from './utils.js';
7
7
  import { fork_state_for_subrequest } from './state.js';
8
8
 
9
9
  /**
10
10
  * @param {{
11
11
  * event: import('@sveltejs/kit').RequestEvent;
12
- * options: import('types').SSROptions;
13
- * manifest: import('@sveltejs/kit').SSRManifest;
14
12
  * state: import('types').RequestState;
15
13
  * get_cookie_header: (url: URL, header: string | null) => string;
16
14
  * set_internal: (name: string, value: string, opts: import('./page/types.js').Cookie['options']) => void;
17
15
  * }} opts
18
16
  * @returns {typeof fetch}
19
17
  */
20
- export function create_fetch({ event, options, manifest, state, get_cookie_header, set_internal }) {
18
+ export function create_fetch({ event, state, get_cookie_header, set_internal }) {
21
19
  /**
22
20
  * @type {typeof fetch}
23
21
  */
@@ -30,7 +28,7 @@ export function create_fetch({ event, options, manifest, state, get_cookie_heade
30
28
  let credentials =
31
29
  (info instanceof Request ? info.credentials : init?.credentials) ?? 'same-origin';
32
30
 
33
- return options.hooks.handleFetch({
31
+ return hooks.handleFetch({
34
32
  event,
35
33
  request: original_request,
36
34
  fetch: async (info, init) => {
@@ -88,24 +86,24 @@ export function create_fetch({ event, options, manifest, state, get_cookie_heade
88
86
  ).slice(1);
89
87
  const filename_html = `${filename}/index.html`; // path may also match path/index.html
90
88
 
91
- const is_asset = manifest.assets.has(filename) || filename in manifest._.server_assets;
89
+ const is_asset = manifest.assets.has(filename) || filename in manifest.server_assets;
92
90
  const is_asset_html =
93
- manifest.assets.has(filename_html) || filename_html in manifest._.server_assets;
91
+ manifest.assets.has(filename_html) || filename_html in manifest.server_assets;
94
92
 
95
93
  if (is_asset || is_asset_html) {
96
94
  const file = is_asset ? filename : filename_html;
97
95
 
98
96
  if (state.read) {
99
97
  const type = is_asset
100
- ? manifest.mimeTypes[filename.slice(filename.lastIndexOf('.'))]
98
+ ? manifest.mime_types[filename.slice(filename.lastIndexOf('.'))]
101
99
  : 'text/html';
102
100
 
103
101
  return new Response(state.read(file), {
104
102
  headers: type ? { 'content-type': type } : {}
105
103
  });
106
- } else if (read_implementation && file in manifest._.server_assets) {
107
- const length = manifest._.server_assets[file];
108
- const type = manifest.mimeTypes[file.slice(file.lastIndexOf('.'))];
104
+ } else if (read_implementation && file in manifest.server_assets) {
105
+ const length = manifest.server_assets[file];
106
+ const type = manifest.mime_types[file.slice(file.lastIndexOf('.'))];
109
107
 
110
108
  return new Response(read_implementation(file), {
111
109
  headers: {
@@ -118,7 +116,7 @@ export function create_fetch({ event, options, manifest, state, get_cookie_heade
118
116
  return await fetch(request);
119
117
  }
120
118
 
121
- if (has_prerendered_path(manifest, decoded)) {
119
+ if (has_prerendered_path(decoded)) {
122
120
  // The path of something prerendered could match a different route
123
121
  // that is still in the manifest, leading to the wrong route being loaded.
124
122
  // We therefore bail early here. The prerendered logic is different for
@@ -148,18 +146,19 @@ export function create_fetch({ event, options, manifest, state, get_cookie_heade
148
146
  request.headers.set('accept-language', accept_language);
149
147
  }
150
148
 
151
- const response = await internal_fetch(request, options, manifest, state);
149
+ const response = await internal_fetch(request, state);
152
150
 
153
151
  for (const str of response.headers.getSetCookie()) {
154
- const { name, value, ...options } = parseSetCookie(str, { decode: (v) => v });
152
+ const { name, value, ...cookie_options } = parseSetCookie(str, { decode: (v) => v });
155
153
 
156
- const path = options.path ?? (url.pathname.split('/').slice(0, -1).join('/') || '/');
154
+ const path =
155
+ cookie_options.path ?? (url.pathname.split('/').slice(0, -1).join('/') || '/');
157
156
 
158
- // options.sameSite is string, something more specific is required - type cast is safe
157
+ // sameSite is string, something more specific is required - type cast is safe
159
158
  set_internal(name, /** @type {string} */ (value), {
160
159
  path,
161
160
  encode: (value) => value,
162
- .../** @type {import('cookie').SerializeOptions} */ (options)
161
+ .../** @type {import('cookie').SerializeOptions} */ (cookie_options)
163
162
  });
164
163
  }
165
164
 
@@ -193,12 +192,10 @@ function normalize_fetch_input(info, init, url) {
193
192
 
194
193
  /**
195
194
  * @param {Request} request
196
- * @param {import('types').SSROptions} options
197
- * @param {import('@sveltejs/kit').SSRManifest} manifest
198
195
  * @param {import('types').RequestState} state
199
196
  * @returns {Promise<Response>}
200
197
  */
201
- async function internal_fetch(request, options, manifest, state) {
198
+ async function internal_fetch(request, state) {
202
199
  if (request.signal?.aborted) {
203
200
  throw new DOMException('The operation was aborted.', 'AbortError');
204
201
  }
@@ -206,7 +203,7 @@ async function internal_fetch(request, options, manifest, state) {
206
203
  const subrequest_state = fork_state_for_subrequest(state);
207
204
 
208
205
  if (!request.signal) {
209
- return await respond(request, options, manifest, subrequest_state);
206
+ return await respond(request, subrequest_state);
210
207
  }
211
208
 
212
209
  let remove_abort_listener = noop;
@@ -219,8 +216,7 @@ async function internal_fetch(request, options, manifest, state) {
219
216
  remove_abort_listener = () => request.signal.removeEventListener('abort', on_abort);
220
217
  });
221
218
 
222
- return Promise.race([
223
- respond(request, options, manifest, subrequest_state),
224
- abort_promise
225
- ]).finally(remove_abort_listener);
219
+ return Promise.race([respond(request, subrequest_state), abort_promise]).finally(
220
+ remove_abort_listener
221
+ );
226
222
  }
@@ -1,14 +1,24 @@
1
1
  import { noop } from '../../utils/functions.js';
2
- import { IN_WEBCONTAINER } from '../../constants.js';
2
+ import { stream_from_iterable } from '../utils.js';
3
+ import { IN_WEBCONTAINER, REROUTED_URL_HEADER } from '../../constants.js';
3
4
  import { respond } from './respond.js';
4
5
  import { create_request_state } from './state.js';
5
6
  import { options, get_hooks } from '<sveltekit:generated>/server.js';
6
- import { set_read_implementation, set_manifest, fix_stack_trace } from './internal.js';
7
+ import {
8
+ set_read_implementation,
9
+ set_manifest,
10
+ set_options,
11
+ set_hooks,
12
+ fix_stack_trace
13
+ } from './internal.js';
7
14
  import { set_env } from '<sveltekit:generated>/env/config.js';
8
15
  import { init_tracing } from '@sveltejs/kit/internal/server';
9
16
  import { DEV } from 'esm-env';
10
17
  import { init_transport } from '#app/internal/transport';
11
18
 
19
+ // set at module scope because prerendering evaluates user modules before constructing a `Server`
20
+ set_options(options);
21
+
12
22
  /** @type {Promise<any>} */
13
23
  let init_promise;
14
24
 
@@ -48,18 +58,8 @@ if (DEV) {
48
58
  }
49
59
 
50
60
  export class Server {
51
- /** @type {import('types').SSROptions} */
52
- #options;
53
-
54
- /** @type {import('@sveltejs/kit').SSRManifest} */
55
- #manifest;
56
-
57
- /** @param {import('@sveltejs/kit').SSRManifest} manifest */
61
+ /** @param {import('types').SSRManifest} manifest */
58
62
  constructor(manifest) {
59
- /** @type {import('types').SSROptions} */
60
- this.#options = options;
61
- this.#manifest = manifest;
62
-
63
63
  // Since AsyncLocalStorage is not working in webcontainers, we don't reset `sync_store`
64
64
  // in `src/exports/internal/server/event.js` and handle only one request at a time.
65
65
  if (IN_WEBCONTAINER) {
@@ -105,14 +105,11 @@ export class Server {
105
105
  return result;
106
106
  }
107
107
 
108
- // TODO remove the cast once TypeScript's lib includes `ReadableStream.from`
109
- return /** @type {ReadableStream} */ (
110
- /** @type {any} */ (ReadableStream).from(
111
- (async function* () {
112
- const stream = await result;
113
- if (stream) yield* stream;
114
- })()
115
- )
108
+ return stream_from_iterable(
109
+ (async function* () {
110
+ const stream = await result;
111
+ if (stream) yield* stream;
112
+ })()
116
113
  );
117
114
  };
118
115
 
@@ -125,7 +122,7 @@ export class Server {
125
122
  try {
126
123
  const module = await get_hooks();
127
124
 
128
- this.#options.hooks = {
125
+ set_hooks({
129
126
  handle: module.handle || (({ event, resolve }) => resolve(event)),
130
127
  handleError:
131
128
  module.handleError ||
@@ -154,7 +151,7 @@ export class Server {
154
151
  }),
155
152
  handleFetch: module.handleFetch || (({ request, fetch }) => fetch(request)),
156
153
  reroute: module.reroute || noop
157
- };
154
+ });
158
155
 
159
156
  init_transport(module.transport ?? {});
160
157
 
@@ -163,14 +160,14 @@ export class Server {
163
160
  }
164
161
  } catch (e) {
165
162
  if (__SVELTEKIT_DEV__) {
166
- this.#options.hooks = {
163
+ set_hooks({
167
164
  handle: () => {
168
165
  throw e;
169
166
  },
170
167
  handleError: ({ error }) => console.error(error),
171
168
  handleFetch: ({ request, fetch }) => fetch(request),
172
169
  reroute: noop
173
- };
170
+ });
174
171
  } else {
175
172
  throw e;
176
173
  }
@@ -183,18 +180,25 @@ export class Server {
183
180
  * @param {import('types').InternalRequestOptions} options
184
181
  */
185
182
  async respond(request, options) {
186
- const response = await respond(
187
- request,
188
- this.#options,
189
- this.#manifest,
190
- create_request_state(options)
191
- );
183
+ const request_state = create_request_state(options);
184
+
185
+ const response = await respond(request, request_state);
192
186
 
193
187
  if (DEV) {
194
188
  const error = decoded_responses.get(response);
195
189
  if (error) console.error(fix_stack_trace(error));
196
190
  }
197
191
 
192
+ if (request_state.rerouted_url) {
193
+ response.headers.set(REROUTED_URL_HEADER, request_state.rerouted_url);
194
+ }
195
+
196
+ // the HTTP layer discards HEAD response bodies, but nothing does when the server is called directly
197
+ if (request.method === 'HEAD' && response.body !== null) {
198
+ response.body.cancel().catch(noop);
199
+ return new Response(null, response);
200
+ }
201
+
198
202
  return response;
199
203
  }
200
204
  }
@@ -1,4 +1,4 @@
1
- /** @import { SSRManifest } from '@sveltejs/kit'; */
1
+ /** @import { ServerHooks, SSROptions, SSRManifest } from 'types'; */
2
2
  import { restore, save } from './dev.js';
3
3
  import {
4
4
  has_data_suffix,
@@ -16,6 +16,8 @@ const styleText =
16
16
 
17
17
  const read_implementation_key = Symbol.for('sveltekit.read_implementation');
18
18
  const manifest_key = Symbol.for('sveltekit.manifest');
19
+ const options_key = Symbol.for('sveltekit.options');
20
+ const hooks_key = Symbol.for('sveltekit.hooks');
19
21
 
20
22
  export let read_implementation = /** @type {((path: string) => ReadableStream<any>) | null} */ (
21
23
  (__SVELTEKIT_DEV__ && restore(read_implementation_key)) ?? null
@@ -25,6 +27,12 @@ export let manifest = /** @type {SSRManifest} */ (
25
27
  (__SVELTEKIT_DEV__ && restore(manifest_key)) ?? null
26
28
  );
27
29
 
30
+ export let options = /** @type {SSROptions} */ (
31
+ (__SVELTEKIT_DEV__ && restore(options_key)) ?? null
32
+ );
33
+
34
+ export let hooks = /** @type {ServerHooks} */ ((__SVELTEKIT_DEV__ && restore(hooks_key)) ?? null);
35
+
28
36
  /**
29
37
  * @param {(path: string) => ReadableStream<any>} fn
30
38
  */
@@ -42,11 +50,28 @@ export function set_manifest(value) {
42
50
  if (__SVELTEKIT_DEV__) save(manifest_key, value);
43
51
  }
44
52
 
53
+ /**
54
+ * @param {SSROptions} value
55
+ */
56
+ export function set_options(value) {
57
+ options = value;
58
+ if (__SVELTEKIT_DEV__) save(options_key, value);
59
+ }
60
+
61
+ /**
62
+ * @param {ServerHooks} value
63
+ */
64
+ export function set_hooks(value) {
65
+ hooks = value;
66
+ if (__SVELTEKIT_DEV__) save(hooks_key, value);
67
+ }
68
+
45
69
  /**
46
70
  * @param {number} status
47
71
  * @param {Request} request
72
+ * @returns {string}
48
73
  */
49
- export function log_response(status, request) {
74
+ export function format_response(status, request) {
50
75
  const url = new URL(request.url);
51
76
  const requested = url.href.replace(url.origin, '');
52
77
 
@@ -59,13 +84,17 @@ export function log_response(status, request) {
59
84
  const pathname = strip_resolution_suffix(url.pathname) || '/';
60
85
  log += pathname + styleText('dim', requested.slice(pathname.length));
61
86
  } else if (has_remote_prefix(url)) {
62
- const id = /** @type {string} */ (strip_remote_prefix(url).split('/').pop());
63
- log += styleText('dim', url.pathname.slice(0, -id.length)) + id + styleText('dim', url.search);
87
+ const id = /** @type {string} */ (strip_remote_prefix(url));
88
+ const [file_hash, name, arg_hash] = id.split('/');
89
+
90
+ log += styleText('dim', `${url.pathname.slice(0, -id.length)}${file_hash}/`) + name;
91
+ if (arg_hash) log += styleText('dim', `/${arg_hash}`);
92
+ if (url.search) log += styleText('dim', url.search);
64
93
  } else {
65
94
  log += requested;
66
95
  }
67
96
 
68
- console.log(log);
97
+ return log;
69
98
  }
70
99
 
71
100
  export { fix_stack_trace, set_fix_stack_trace } from './sourcemaps.js';
@@ -1,6 +1,6 @@
1
1
  /** @import { RequestEvent, Actions } from '@sveltejs/kit' */
2
2
  /** @import { ActionResult } from '$app/forms' */
3
- /** @import { SSROptions, SSRNode, ServerNode, ServerActionResult } from 'types' */
3
+ /** @import { SSRNode, ServerNode, ServerActionResult } from 'types' */
4
4
  import { DEV } from 'esm-env';
5
5
  import { HttpError, Redirect, ActionFailure, SvelteKitError } from '@sveltejs/kit/internal';
6
6
  import { with_request_store, merge_tracing, record_span } from '@sveltejs/kit/internal/server';
@@ -23,28 +23,26 @@ export function is_action_json_request(event) {
23
23
  /**
24
24
  * @param {RequestEvent} event
25
25
  * @param {import('types').RequestState} state
26
- * @param {SSROptions} options
27
26
  * @param {SSRNode['server'] | undefined} server
28
27
  */
29
- export async function handle_action_json_request(event, state, options, server) {
28
+ export async function handle_action_json_request(event, state, server) {
30
29
  const result = await handle_action_request(event, state, server);
31
- return action_result_json(event, state, options, result);
30
+ return action_result_json(event, state, result);
32
31
  }
33
32
 
34
33
  /**
35
34
  * @param {RequestEvent} event
36
35
  * @param {import('types').RequestState} state
37
- * @param {SSROptions} options
38
36
  * @param {ServerActionResult} result
39
37
  * @returns {Promise<Response>}
40
38
  */
41
- async function action_result_json(event, state, options, result) {
39
+ async function action_result_json(event, state, result) {
42
40
  if (result.type === 'redirect') {
43
41
  return action_json(result);
44
42
  }
45
43
 
46
44
  if (result.type === 'error') {
47
- const error = await handle_error_and_jsonify(event, state, options, result.error);
45
+ const error = await handle_error_and_jsonify(event, state, result.error);
48
46
  return action_json({ ...result, error }, { status: error.status });
49
47
  }
50
48
 
@@ -64,7 +62,7 @@ async function action_result_json(event, state, options, result) {
64
62
  { status: result.status }
65
63
  );
66
64
  } catch (e) {
67
- return action_result_json(event, state, options, action_error_result(e, result.location));
65
+ return action_result_json(event, state, action_error_result(e, result.location));
68
66
  }
69
67
  }
70
68
 
@@ -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
  })