@sveltejs/kit 3.0.0-next.25 → 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 (59) hide show
  1. package/package.json +5 -7
  2. package/src/core/adapt/builder.js +127 -31
  3. package/src/core/adapt/index.js +3 -0
  4. package/src/core/config/index.js +4 -7
  5. package/src/core/env.js +36 -8
  6. package/src/core/generate_manifest/index.js +42 -43
  7. package/src/core/postbuild/analyse.js +4 -4
  8. package/src/core/postbuild/fallback.js +1 -1
  9. package/src/core/postbuild/prerender.js +2 -2
  10. package/src/core/sync/create_manifest_data/index.js +0 -1
  11. package/src/core/sync/write_app_manifest.js +3 -2
  12. package/src/exports/public.d.ts +100 -48
  13. package/src/exports/vite/build/index.js +1173 -0
  14. package/src/exports/vite/build/remote.js +4 -4
  15. package/src/exports/vite/dev/generate_manifest.js +308 -0
  16. package/src/exports/vite/dev/index.js +28 -284
  17. package/src/exports/vite/index.js +117 -1308
  18. package/src/exports/vite/plugins/env-vars.js +11 -34
  19. package/src/exports/vite/plugins/guard.js +19 -7
  20. package/src/exports/vite/plugins/remote.js +237 -0
  21. package/src/exports/vite/preview/index.js +8 -8
  22. package/src/exports/vite/static_analysis/index.js +15 -15
  23. package/src/exports/vite/utils.js +1 -1
  24. package/src/runner.js +4 -3
  25. package/src/runtime/app/paths/server.js +2 -2
  26. package/src/runtime/app/server/index.js +3 -3
  27. package/src/runtime/app/server/public.d.ts +114 -57
  28. package/src/runtime/app/server/remote/requested.js +31 -15
  29. package/src/runtime/app/state/client.svelte.js +3 -1
  30. package/src/runtime/client/client.js +39 -194
  31. package/src/runtime/client/fetcher.js +6 -6
  32. package/src/runtime/client/focus.js +120 -0
  33. package/src/runtime/client/remote-functions/command.svelte.js +20 -9
  34. package/src/runtime/client/remote-functions/form.svelte.js +12 -7
  35. package/src/runtime/client/remote-functions/query/instance.svelte.js +19 -5
  36. package/src/runtime/client/remote-functions/shared.svelte.js +22 -1
  37. package/src/runtime/client/scroll.js +39 -0
  38. package/src/runtime/client/utils.js +28 -0
  39. package/src/runtime/form-utils.js +243 -245
  40. package/src/runtime/server/data/index.js +3 -10
  41. package/src/runtime/server/fetch.js +13 -15
  42. package/src/runtime/server/index.js +8 -7
  43. package/src/runtime/server/internal.js +1 -2
  44. package/src/runtime/server/page/index.js +10 -15
  45. package/src/runtime/server/page/load_data.js +2 -2
  46. package/src/runtime/server/page/render.js +8 -13
  47. package/src/runtime/server/page/respond_with_error.js +4 -5
  48. package/src/runtime/server/page/server_routing.js +21 -27
  49. package/src/runtime/server/remote-functions.js +14 -14
  50. package/src/runtime/server/respond.js +17 -40
  51. package/src/runtime/server/state.js +1 -0
  52. package/src/runtime/server/utils.js +4 -4
  53. package/src/runtime/shared.js +9 -0
  54. package/src/types/ambient-private.d.ts +1 -2
  55. package/src/types/internal.d.ts +49 -6
  56. package/src/utils/filesystem.js +43 -27
  57. package/src/version.js +1 -1
  58. package/types/index.d.ts +215 -92
  59. package/types/index.d.ts.map +6 -2
@@ -2,21 +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 { hooks, 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
- * manifest: import('@sveltejs/kit').SSRManifest;
13
12
  * state: import('types').RequestState;
14
13
  * get_cookie_header: (url: URL, header: string | null) => string;
15
14
  * set_internal: (name: string, value: string, opts: import('./page/types.js').Cookie['options']) => void;
16
15
  * }} opts
17
16
  * @returns {typeof fetch}
18
17
  */
19
- export function create_fetch({ event, manifest, state, get_cookie_header, set_internal }) {
18
+ export function create_fetch({ event, state, get_cookie_header, set_internal }) {
20
19
  /**
21
20
  * @type {typeof fetch}
22
21
  */
@@ -87,24 +86,24 @@ export function create_fetch({ event, manifest, state, get_cookie_header, set_in
87
86
  ).slice(1);
88
87
  const filename_html = `${filename}/index.html`; // path may also match path/index.html
89
88
 
90
- 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;
91
90
  const is_asset_html =
92
- manifest.assets.has(filename_html) || filename_html in manifest._.server_assets;
91
+ manifest.assets.has(filename_html) || filename_html in manifest.server_assets;
93
92
 
94
93
  if (is_asset || is_asset_html) {
95
94
  const file = is_asset ? filename : filename_html;
96
95
 
97
96
  if (state.read) {
98
97
  const type = is_asset
99
- ? manifest.mimeTypes[filename.slice(filename.lastIndexOf('.'))]
98
+ ? manifest.mime_types[filename.slice(filename.lastIndexOf('.'))]
100
99
  : 'text/html';
101
100
 
102
101
  return new Response(state.read(file), {
103
102
  headers: type ? { 'content-type': type } : {}
104
103
  });
105
- } else if (read_implementation && file in manifest._.server_assets) {
106
- const length = manifest._.server_assets[file];
107
- 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('.'))];
108
107
 
109
108
  return new Response(read_implementation(file), {
110
109
  headers: {
@@ -117,7 +116,7 @@ export function create_fetch({ event, manifest, state, get_cookie_header, set_in
117
116
  return await fetch(request);
118
117
  }
119
118
 
120
- if (has_prerendered_path(manifest, decoded)) {
119
+ if (has_prerendered_path(decoded)) {
121
120
  // The path of something prerendered could match a different route
122
121
  // that is still in the manifest, leading to the wrong route being loaded.
123
122
  // We therefore bail early here. The prerendered logic is different for
@@ -147,7 +146,7 @@ export function create_fetch({ event, manifest, state, get_cookie_header, set_in
147
146
  request.headers.set('accept-language', accept_language);
148
147
  }
149
148
 
150
- const response = await internal_fetch(request, manifest, state);
149
+ const response = await internal_fetch(request, state);
151
150
 
152
151
  for (const str of response.headers.getSetCookie()) {
153
152
  const { name, value, ...cookie_options } = parseSetCookie(str, { decode: (v) => v });
@@ -193,11 +192,10 @@ function normalize_fetch_input(info, init, url) {
193
192
 
194
193
  /**
195
194
  * @param {Request} request
196
- * @param {import('@sveltejs/kit').SSRManifest} manifest
197
195
  * @param {import('types').RequestState} state
198
196
  * @returns {Promise<Response>}
199
197
  */
200
- async function internal_fetch(request, manifest, state) {
198
+ async function internal_fetch(request, state) {
201
199
  if (request.signal?.aborted) {
202
200
  throw new DOMException('The operation was aborted.', 'AbortError');
203
201
  }
@@ -205,7 +203,7 @@ async function internal_fetch(request, manifest, state) {
205
203
  const subrequest_state = fork_state_for_subrequest(state);
206
204
 
207
205
  if (!request.signal) {
208
- return await respond(request, manifest, subrequest_state);
206
+ return await respond(request, subrequest_state);
209
207
  }
210
208
 
211
209
  let remove_abort_listener = noop;
@@ -218,7 +216,7 @@ async function internal_fetch(request, manifest, state) {
218
216
  remove_abort_listener = () => request.signal.removeEventListener('abort', on_abort);
219
217
  });
220
218
 
221
- return Promise.race([respond(request, manifest, subrequest_state), abort_promise]).finally(
219
+ return Promise.race([respond(request, subrequest_state), abort_promise]).finally(
222
220
  remove_abort_listener
223
221
  );
224
222
  }
@@ -58,13 +58,8 @@ if (DEV) {
58
58
  }
59
59
 
60
60
  export class Server {
61
- /** @type {import('@sveltejs/kit').SSRManifest} */
62
- #manifest;
63
-
64
- /** @param {import('@sveltejs/kit').SSRManifest} manifest */
61
+ /** @param {import('types').SSRManifest} manifest */
65
62
  constructor(manifest) {
66
- this.#manifest = manifest;
67
-
68
63
  // Since AsyncLocalStorage is not working in webcontainers, we don't reset `sync_store`
69
64
  // in `src/exports/internal/server/event.js` and handle only one request at a time.
70
65
  if (IN_WEBCONTAINER) {
@@ -187,7 +182,7 @@ export class Server {
187
182
  async respond(request, options) {
188
183
  const request_state = create_request_state(options);
189
184
 
190
- const response = await respond(request, this.#manifest, request_state);
185
+ const response = await respond(request, request_state);
191
186
 
192
187
  if (DEV) {
193
188
  const error = decoded_responses.get(response);
@@ -198,6 +193,12 @@ export class Server {
198
193
  response.headers.set(REROUTED_URL_HEADER, request_state.rerouted_url);
199
194
  }
200
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
+
201
202
  return response;
202
203
  }
203
204
  }
@@ -1,5 +1,4 @@
1
- /** @import { SSRManifest } from '@sveltejs/kit'; */
2
- /** @import { ServerHooks, SSROptions } from 'types'; */
1
+ /** @import { ServerHooks, SSROptions, SSRManifest } from 'types'; */
3
2
  import { restore, save } from './dev.js';
4
3
  import {
5
4
  has_data_suffix,
@@ -1,4 +1,4 @@
1
- /** @import { RequestEvent, SSRManifest } from '@sveltejs/kit' */
1
+ /** @import { RequestEvent } from '@sveltejs/kit' */
2
2
  /** @import { PageNodeIndexes, RequestState, RequiredResolveOptions, ServerDataNode, SSRNode } from 'types' */
3
3
  import { text } from '@sveltejs/kit';
4
4
  import { Redirect } from '@sveltejs/kit/internal';
@@ -8,6 +8,7 @@ import { noop } from '../../../utils/functions.js';
8
8
  import { add_data_suffix } from '../../pathname.js';
9
9
  import { build_error_chain, nearest_error_pages } from '../../error-chain.js';
10
10
  import { redirect_response } from '../utils.js';
11
+ import { manifest } from '../internal.js';
11
12
  import { static_error_page, handle_error_and_jsonify } from '../errors.js';
12
13
  import {
13
14
  handle_action_json_request,
@@ -32,12 +33,11 @@ const MAX_DEPTH = 10;
32
33
  * @param {RequestEvent} event
33
34
  * @param {RequestState} state
34
35
  * @param {PageNodeIndexes} page
35
- * @param {SSRManifest} manifest
36
36
  * @param {import('../../../utils/page_nodes.js').PageNodes} nodes
37
37
  * @param {RequiredResolveOptions} resolve_opts
38
38
  * @returns {Promise<Response>}
39
39
  */
40
- export async function render_page(event, state, page, manifest, nodes, resolve_opts) {
40
+ export async function render_page(event, state, page, nodes, resolve_opts) {
41
41
  if (state.depth > MAX_DEPTH) {
42
42
  // infinite request cycle detected
43
43
  return text(`Not found: ${event.url.pathname}`, {
@@ -46,7 +46,7 @@ export async function render_page(event, state, page, manifest, nodes, resolve_o
46
46
  }
47
47
 
48
48
  if (is_action_json_request(event)) {
49
- const node = await manifest._.nodes[page.leaf]();
49
+ const node = await manifest.nodes[page.leaf]();
50
50
  return handle_action_json_request(event, state, node?.server);
51
51
  }
52
52
 
@@ -61,7 +61,7 @@ export async function render_page(event, state, page, manifest, nodes, resolve_o
61
61
  if (is_action_request(event)) {
62
62
  const remote_id = get_remote_action(event.url);
63
63
  if (remote_id) {
64
- action_result = await handle_remote_form_post(event, state, manifest, remote_id);
64
+ action_result = await handle_remote_form_post(event, state, remote_id);
65
65
  } else {
66
66
  // for action requests, first call handler in +page.server.js
67
67
  // (this also determines status code)
@@ -149,7 +149,6 @@ export async function render_page(event, state, page, manifest, nodes, resolve_o
149
149
  error: null,
150
150
  event,
151
151
  state,
152
- manifest,
153
152
  resolve_opts,
154
153
  data_serializer: server_data_serializer(event, state)
155
154
  });
@@ -276,7 +275,7 @@ export async function render_page(event, state, page, manifest, nodes, resolve_o
276
275
  const status = error.status;
277
276
 
278
277
  for (const { error: index, idx } of nearest_error_pages(i, branch, page.errors)) {
279
- const node = await manifest._.nodes[index]();
278
+ const node = await manifest.nodes[index]();
280
279
 
281
280
  data_serializer.set_max_nodes(idx);
282
281
 
@@ -291,7 +290,6 @@ export async function render_page(event, state, page, manifest, nodes, resolve_o
291
290
  return await render_response({
292
291
  event,
293
292
  state,
294
- manifest,
295
293
  resolve_opts,
296
294
  page_config: {
297
295
  ssr: nodes.ssr(),
@@ -299,7 +297,7 @@ export async function render_page(event, state, page, manifest, nodes, resolve_o
299
297
  },
300
298
  status,
301
299
  error,
302
- error_components: await load_error_components(ssr, error_branch, page, manifest),
300
+ error_components: await load_error_components(ssr, error_branch, page),
303
301
  branch: error_branch,
304
302
  fetched,
305
303
  data_serializer
@@ -336,7 +334,6 @@ export async function render_page(event, state, page, manifest, nodes, resolve_o
336
334
  return await render_response({
337
335
  event,
338
336
  state,
339
- manifest,
340
337
  resolve_opts,
341
338
  page_config: {
342
339
  csr,
@@ -348,7 +345,7 @@ export async function render_page(event, state, page, manifest, nodes, resolve_o
348
345
  action_result,
349
346
  fetched,
350
347
  data_serializer: !ssr ? server_data_serializer(event, state) : data_serializer,
351
- error_components: await load_error_components(ssr, branch, page, manifest)
348
+ error_components: await load_error_components(ssr, branch, page)
352
349
  });
353
350
  } catch (e) {
354
351
  // a remote function could have thrown a redirect during render
@@ -361,7 +358,6 @@ export async function render_page(event, state, page, manifest, nodes, resolve_o
361
358
  return await respond_with_error({
362
359
  event,
363
360
  state,
364
- manifest,
365
361
  error: e,
366
362
  resolve_opts
367
363
  });
@@ -372,12 +368,11 @@ export async function render_page(event, state, page, manifest, nodes, resolve_o
372
368
  * @param {boolean} ssr
373
369
  * @param {Array<import('./types.js').Loaded | null>} branch
374
370
  * @param {PageNodeIndexes} page
375
- * @param {SSRManifest} manifest
376
371
  */
377
- function load_error_components(ssr, branch, page, manifest) {
372
+ function load_error_components(ssr, branch, page) {
378
373
  if (!ssr) return undefined;
379
374
 
380
375
  return build_error_chain(branch, page.errors, (idx) =>
381
- manifest._.nodes[idx]?.().then((e) => e.component?.())
376
+ manifest.nodes[idx]?.().then((e) => e.component?.())
382
377
  );
383
378
  }
@@ -1,7 +1,7 @@
1
1
  import { DEV } from 'esm-env';
2
2
  import { noop } from '../../../utils/functions.js';
3
3
  import { disable_search, make_trackable } from '../../../utils/url.js';
4
- import { validate_depends, validate_load_response } from '../../shared.js';
4
+ import { fetch_cache_url, validate_depends, validate_load_response } from '../../shared.js';
5
5
  import { with_request_store, merge_tracing, record_span } from '@sveltejs/kit/internal/server';
6
6
  import { base64_encode } from '../../utils.js';
7
7
  import { NULL_BODY_STATUS } from '../constants.js';
@@ -344,7 +344,7 @@ export function create_universal_fetch(event, prerendering, fetched, csr, resolv
344
344
  }
345
345
 
346
346
  fetched.push({
347
- url: same_origin ? url.href.slice(event.url.origin.length) : url.href,
347
+ url: fetch_cache_url(url, event.url),
348
348
  method: event.request.method,
349
349
  request_body: /** @type {string | ArrayBufferView | null | undefined} */ (request_body),
350
350
  request_headers: cloned_headers,
@@ -1,4 +1,5 @@
1
1
  /** @import { Component } from 'svelte'; */
2
+ /** @import { SyncRenderOutput } from 'svelte/server' */
2
3
  import * as devalue from 'devalue';
3
4
  import { DEV } from 'esm-env';
4
5
  import { isRedirect, text } from '@sveltejs/kit';
@@ -27,7 +28,7 @@ import Root from '../../components/root.svelte';
27
28
  import { render } from 'svelte/server';
28
29
  import { Props, RenderNode } from '../../props.svelte.js';
29
30
  import { has_custom_transporters, uneval } from '#app/internal/transport';
30
- import { options } from '../internal.js';
31
+ import { manifest, options } from '../internal.js';
31
32
 
32
33
  // TODO rename this function/module
33
34
 
@@ -36,7 +37,6 @@ import { options } from '../internal.js';
36
37
  * @param {{
37
38
  * branch: Array<import('./types.js').Loaded>;
38
39
  * fetched: Array<import('./types.js').Fetched>;
39
- * manifest: import('@sveltejs/kit').SSRManifest;
40
40
  * page_config: { ssr: boolean; csr: boolean };
41
41
  * status: number;
42
42
  * error: App.Error | null;
@@ -51,7 +51,6 @@ import { options } from '../internal.js';
51
51
  export async function render_response({
52
52
  branch,
53
53
  fetched,
54
- manifest,
55
54
  page_config,
56
55
  status,
57
56
  error = null,
@@ -72,7 +71,7 @@ export async function render_response({
72
71
  }
73
72
  }
74
73
 
75
- const { client } = manifest._;
74
+ const client = manifest.client;
76
75
 
77
76
  const modulepreloads = new Set(client?.imports);
78
77
  const stylesheets = new Set(client?.stylesheets);
@@ -90,8 +89,7 @@ export async function render_response({
90
89
  // TODO if we add a client entry point one day, we will need to include inline_styles with the entry, otherwise stylesheets will be linked even if they are below inlineStyleThreshold
91
90
  const inline_styles = new Map();
92
91
 
93
- // TODO `svelte/server` should expose `RenderOutput`
94
- /** @type {Omit<Awaited<ReturnType<typeof render>>, 'html'>} */
92
+ /** @type {Omit<SyncRenderOutput, 'html'>} */
95
93
  let rendered;
96
94
 
97
95
  const form_value =
@@ -286,7 +284,7 @@ export async function render_response({
286
284
  // Vite makes the start script available through the base path and without it.
287
285
  // We load it via the base path in order to support remote IDE environments which proxy
288
286
  // all URLs under the base path during development.
289
- return paths.base + path;
287
+ return relative ? `${base}/${path.slice(1)}` : paths.base + path;
290
288
  }
291
289
  return `${assets}/${path}`;
292
290
  };
@@ -654,12 +652,9 @@ export async function render_response({
654
652
  }
655
653
  }
656
654
 
657
- return !chunks
658
- ? text(transformed, {
659
- status,
660
- headers
661
- })
662
- : new Response(stream_text(transformed + '\n', chunks), { headers });
655
+ return chunks
656
+ ? new Response(stream_text(transformed + '\n', chunks), { status, headers })
657
+ : text(transformed, { status, headers });
663
658
  }
664
659
 
665
660
  class Head {
@@ -5,6 +5,7 @@ import { redirect_response } from '../utils.js';
5
5
  import { handle_error_and_jsonify, static_error_page } from '../errors.js';
6
6
  import { PageNodes } from '../../../utils/page_nodes.js';
7
7
  import { server_data_serializer } from './data_serializer.js';
8
+ import { manifest } from '../internal.js';
8
9
 
9
10
  /**
10
11
  * @typedef {import('./types.js').Loaded} Loaded
@@ -14,12 +15,11 @@ import { server_data_serializer } from './data_serializer.js';
14
15
  * @param {{
15
16
  * event: import('@sveltejs/kit').RequestEvent;
16
17
  * state: import('types').RequestState;
17
- * manifest: import('@sveltejs/kit').SSRManifest;
18
18
  * error: unknown;
19
19
  * resolve_opts: import('types').RequiredResolveOptions;
20
20
  * }} opts
21
21
  */
22
- export async function respond_with_error({ event, state, manifest, error, resolve_opts }) {
22
+ export async function respond_with_error({ event, state, error, resolve_opts }) {
23
23
  // reroute to the fallback page to prevent an infinite chain of requests.
24
24
  if (event.request.headers.get('x-sveltekit-error')) {
25
25
  const transformed = await handle_error_and_jsonify(event, state, error);
@@ -30,7 +30,7 @@ export async function respond_with_error({ event, state, manifest, error, resolv
30
30
  const fetched = [];
31
31
  try {
32
32
  const branch = [];
33
- const default_layout = await manifest._.nodes[0](); // 0 is always the root layout
33
+ const default_layout = await manifest.nodes[0](); // 0 is always the root layout
34
34
  const nodes = new PageNodes([default_layout]);
35
35
  const ssr = nodes.ssr();
36
36
  const csr = nodes.csr();
@@ -71,7 +71,7 @@ export async function respond_with_error({ event, state, manifest, error, resolv
71
71
  data
72
72
  },
73
73
  {
74
- node: await manifest._.nodes[1](), // 1 is always the root error
74
+ node: await manifest.nodes[1](), // 1 is always the root error
75
75
  data: null,
76
76
  server_data: null
77
77
  }
@@ -79,7 +79,6 @@ export async function respond_with_error({ event, state, manifest, error, resolv
79
79
  }
80
80
 
81
81
  return await render_response({
82
- manifest,
83
82
  page_config: {
84
83
  ssr,
85
84
  csr
@@ -1,15 +1,16 @@
1
- /** @import { SSRManifest } from '@sveltejs/kit' */
1
+ /** @import { SSRManifest } from 'types' */
2
2
  import { base, assets } from '#app/paths';
3
3
  import { relative } from '$app/paths/internal/server';
4
4
  import { text } from '@sveltejs/kit';
5
5
  import { s } from '../../../utils/misc.js';
6
6
  import { find_route } from '../../../utils/routing.js';
7
7
  import { get_relative_path } from '../../utils.js';
8
+ import { manifest } from '../internal.js';
8
9
 
9
10
  /**
10
11
  * @param {import('types').SSRClientRoute} route
11
12
  * @param {URL} url
12
- * @param {NonNullable<SSRManifest['_']['client']>} client
13
+ * @param {NonNullable<SSRManifest['client']>} client
13
14
  * @returns {string}
14
15
  */
15
16
  export function generate_route_object(route, url, client) {
@@ -38,23 +39,18 @@ export function generate_route_object(route, url, client) {
38
39
  function create_client_import(import_path, url) {
39
40
  if (!import_path) return 'Promise.resolve({})';
40
41
 
41
- // During DEV, Vite will make the paths absolute (e.g. /@fs/...)
42
- if (import_path[0] === '/') {
43
- return `import('${import_path}')`;
44
- }
45
-
46
42
  // During PROD, they're root-relative
47
- if (assets !== '') {
43
+ if (assets !== '' && import_path[0] !== '/') {
48
44
  return `import('${assets}/${import_path}')`;
49
45
  }
50
46
 
51
- if (!relative) {
52
- return `import('${base}/${import_path}')`;
53
- }
47
+ // During DEV, Vite will make the paths absolute (e.g. /@fs/...)
48
+ const absolute = import_path[0] === '/' ? import_path : `${base}/${import_path}`;
49
+ if (!relative) return `import('${absolute}')`;
54
50
 
55
51
  // Else we make them relative to the server-side route resolution request
56
52
  // to support IPFS, the internet archive, etc.
57
- let path = get_relative_path(url.pathname, `${base}/${import_path}`);
53
+ let path = get_relative_path(url.pathname, absolute);
58
54
  if (path[0] !== '.') path = `./${path}`;
59
55
  return `import('${path}')`;
60
56
  }
@@ -62,23 +58,22 @@ function create_client_import(import_path, url) {
62
58
  /**
63
59
  * @param {string} resolved_path
64
60
  * @param {URL} url
65
- * @param {SSRManifest} manifest
66
61
  * @returns {Promise<Response>}
67
62
  */
68
- export async function resolve_route(resolved_path, url, manifest) {
69
- if (!manifest._.client?.routes) {
63
+ export async function resolve_route(resolved_path, url) {
64
+ if (!manifest.client?.routes) {
70
65
  return text('Server-side route resolution disabled', { status: 400 });
71
66
  }
72
67
 
73
68
  try {
74
- const matchers = await manifest._.matchers();
75
- const result = find_route(resolved_path, manifest._.client.routes, matchers);
69
+ const matchers = await manifest.matchers();
70
+ const result = find_route(resolved_path, manifest.client.routes, matchers);
76
71
 
77
72
  return create_server_routing_response(
78
73
  result?.route ?? null,
79
74
  result?.params ?? {},
80
75
  url,
81
- manifest._.client
76
+ manifest.client
82
77
  ).response;
83
78
  } catch {
84
79
  return text('Error resolving route', { status: 500 });
@@ -99,29 +94,28 @@ export async function resolve_route(resolved_path, url, manifest) {
99
94
  *
100
95
  * @param {string} route_id
101
96
  * @param {URL} url
102
- * @param {SSRManifest} manifest
103
97
  * @returns {Response}
104
98
  */
105
- export function resolve_route_by_id(route_id, url, manifest) {
106
- if (!manifest._.client?.routes) {
99
+ export function resolve_route_by_id(route_id, url) {
100
+ if (!manifest.client?.routes) {
107
101
  return text('Server-side route resolution disabled', { status: 400 });
108
102
  }
109
103
 
110
104
  try {
111
- const route = manifest._.client.routes.find((r) => r.id === route_id);
105
+ const route = manifest.client.routes.find((r) => r.id === route_id);
112
106
 
113
107
  if (route) {
114
- return create_server_routing_response(route, null, url, manifest._.client).response;
108
+ return create_server_routing_response(route, null, url, manifest.client).response;
115
109
  }
116
110
 
117
111
  // `client.routes` only contains routes with a `+page`, so a miss above doesn't mean the
118
112
  // route doesn't exist — it might be a `+server.js`-only route. `_.routes` includes those
119
113
  // (with `page: null`), so we can distinguish "exists but has no code" from "unknown".
120
- if (manifest._.routes.some((r) => r.id === route_id && !r.page)) {
114
+ if (manifest.routes.some((r) => r.id === route_id && !r.page)) {
121
115
  return text('export const endpoint_only = true;', { headers: js_headers() });
122
116
  }
123
117
 
124
- return create_server_routing_response(null, null, url, manifest._.client).response;
118
+ return create_server_routing_response(null, null, url, manifest.client).response;
125
119
  } catch {
126
120
  return text('Error resolving route', { status: 500 });
127
121
  }
@@ -137,7 +131,7 @@ function js_headers() {
137
131
  * @param {import('types').SSRClientRoute | null} route
138
132
  * @param {Partial<Record<string, string>> | null} params
139
133
  * @param {URL} url
140
- * @param {NonNullable<SSRManifest['_']['client']>} client
134
+ * @param {NonNullable<SSRManifest['client']>} client
141
135
  * @returns {{response: Response, body: string}}
142
136
  */
143
137
  export function create_server_routing_response(route, params, url, client) {
@@ -164,7 +158,7 @@ export function create_server_routing_response(route, params, url, client) {
164
158
  *
165
159
  * @param {import('types').SSRClientRoute} route
166
160
  * @param {URL} url
167
- * @param {NonNullable<SSRManifest['_']['client']>} client
161
+ * @param {NonNullable<SSRManifest['client']>} client
168
162
  * @returns {string}
169
163
  */
170
164
  function create_css_import(route, url, client) {
@@ -1,4 +1,4 @@
1
- /** @import { RequestEvent, SSRManifest } from '@sveltejs/kit' */
1
+ /** @import { RequestEvent } from '@sveltejs/kit' */
2
2
  /** @import { RemoteForm } from '$app/server' */
3
3
  /** @import { RemoteFormInternals, RemoteFunctionData, RemoteFunctionResponse, RemoteInternals, RequestState, ServerActionResult } from 'types' */
4
4
 
@@ -18,6 +18,7 @@ import {
18
18
  import { deserialize_binary_form } from '../form-utils.js';
19
19
  import { text_encoder } from '../utils.js';
20
20
  import { with_version_header } from './utils.js';
21
+ import { manifest } from './internal.js';
21
22
 
22
23
  /**
23
24
  * How long (in milliseconds) to wait after the last message was sent before
@@ -140,7 +141,7 @@ export function create_live_query_response(event, state, internals, arg) {
140
141
  }
141
142
 
142
143
  /** @type {typeof handle_remote_call_internal} */
143
- export async function handle_remote_call(event, state, manifest, id) {
144
+ export async function handle_remote_call(event, state, id) {
144
145
  return record_span({
145
146
  name: 'sveltekit.remote.call',
146
147
  attributes: {
@@ -149,7 +150,7 @@ export async function handle_remote_call(event, state, manifest, id) {
149
150
  fn: async (current) => {
150
151
  const traced_event = merge_tracing(event, current);
151
152
  const response = await with_request_store({ event: traced_event, state }, () =>
152
- handle_remote_call_internal(traced_event, state, manifest, id)
153
+ handle_remote_call_internal(traced_event, state, id)
153
154
  );
154
155
  return with_version_header(response);
155
156
  }
@@ -159,12 +160,11 @@ export async function handle_remote_call(event, state, manifest, id) {
159
160
  /**
160
161
  * @param {RequestEvent} event
161
162
  * @param {RequestState} state
162
- * @param {SSRManifest} manifest
163
163
  * @param {string} id
164
164
  */
165
- async function handle_remote_call_internal(event, state, manifest, id) {
165
+ async function handle_remote_call_internal(event, state, id) {
166
166
  const [hash, name, additional_args] = id.split('/');
167
- const remotes = manifest._.remotes;
167
+ const remotes = manifest.remotes;
168
168
 
169
169
  if (!Object.hasOwn(remotes, hash)) error(404);
170
170
 
@@ -311,6 +311,7 @@ async function handle_remote_call_internal(event, state, manifest, id) {
311
311
  }
312
312
 
313
313
  await collect_remote_data(data, event, state);
314
+ if (state.remote.ignored?.size) data.i = Array.from(state.remote.ignored);
314
315
 
315
316
  return Response.json(
316
317
  /** @type {RemoteFunctionResponse} */ ({
@@ -493,7 +494,7 @@ export async function collect_remote_data(data, event, state) {
493
494
  * @param {string[] | undefined} refreshes
494
495
  */
495
496
  function create_requested_map(refreshes) {
496
- /** @type {Map<string, string[]>} */
497
+ /** @type {Map<string, Set<string>>} */
497
498
  const requested = new Map();
498
499
 
499
500
  for (const key of refreshes ?? []) {
@@ -502,9 +503,9 @@ function create_requested_map(refreshes) {
502
503
  const existing = requested.get(parts.id);
503
504
 
504
505
  if (existing) {
505
- existing.push(parts.payload);
506
+ existing.add(parts.payload);
506
507
  } else {
507
- requested.set(parts.id, [parts.payload]);
508
+ requested.set(parts.id, new Set([parts.payload]));
508
509
  }
509
510
  }
510
511
 
@@ -512,7 +513,7 @@ function create_requested_map(refreshes) {
512
513
  }
513
514
 
514
515
  /** @type {typeof handle_remote_form_post_internal} */
515
- export async function handle_remote_form_post(event, state, manifest, id) {
516
+ export async function handle_remote_form_post(event, state, id) {
516
517
  return record_span({
517
518
  name: 'sveltekit.remote.form.post',
518
519
  attributes: {
@@ -521,7 +522,7 @@ export async function handle_remote_form_post(event, state, manifest, id) {
521
522
  fn: (current) => {
522
523
  const traced_event = merge_tracing(event, current);
523
524
  return with_request_store({ event: traced_event, state }, () =>
524
- handle_remote_form_post_internal(traced_event, state, manifest, id)
525
+ handle_remote_form_post_internal(traced_event, state, id)
525
526
  );
526
527
  }
527
528
  });
@@ -530,17 +531,16 @@ export async function handle_remote_form_post(event, state, manifest, id) {
530
531
  /**
531
532
  * @param {RequestEvent} event
532
533
  * @param {RequestState} state
533
- * @param {SSRManifest} manifest
534
534
  * @param {string} id
535
535
  * @returns {Promise<ServerActionResult>}
536
536
  */
537
- async function handle_remote_form_post_internal(event, state, manifest, id) {
537
+ async function handle_remote_form_post_internal(event, state, id) {
538
538
  const location = get_action_location(event.url);
539
539
  // `hash` and `name` can never contain a `/`, but the JSON-stringified key of a
540
540
  // keyed (`form.for(key)`) instance can — rejoin the remaining segments
541
541
  const [hash, name, ...rest] = id.split('/');
542
542
  const action_id = rest.join('/');
543
- const remotes = manifest._.remotes;
543
+ const remotes = manifest.remotes;
544
544
  const module = Object.hasOwn(remotes, hash) ? await remotes[hash]() : undefined;
545
545
 
546
546
  let form = /** @type {RemoteForm<any, any>} */ (