@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.
- package/package.json +5 -7
- package/src/core/adapt/builder.js +127 -31
- package/src/core/adapt/index.js +3 -0
- package/src/core/config/index.js +4 -7
- package/src/core/env.js +36 -8
- package/src/core/generate_manifest/index.js +42 -43
- package/src/core/postbuild/analyse.js +4 -4
- package/src/core/postbuild/fallback.js +1 -1
- package/src/core/postbuild/prerender.js +2 -2
- package/src/core/sync/create_manifest_data/index.js +0 -1
- package/src/core/sync/write_app_manifest.js +3 -2
- package/src/exports/public.d.ts +100 -48
- package/src/exports/vite/build/index.js +1173 -0
- package/src/exports/vite/build/remote.js +4 -4
- package/src/exports/vite/dev/generate_manifest.js +308 -0
- package/src/exports/vite/dev/index.js +28 -284
- package/src/exports/vite/index.js +117 -1308
- package/src/exports/vite/plugins/env-vars.js +11 -34
- package/src/exports/vite/plugins/guard.js +19 -7
- package/src/exports/vite/plugins/remote.js +237 -0
- package/src/exports/vite/preview/index.js +8 -8
- package/src/exports/vite/static_analysis/index.js +15 -15
- package/src/exports/vite/utils.js +1 -1
- package/src/runner.js +4 -3
- package/src/runtime/app/paths/server.js +2 -2
- package/src/runtime/app/server/index.js +3 -3
- package/src/runtime/app/server/public.d.ts +114 -57
- package/src/runtime/app/server/remote/requested.js +31 -15
- package/src/runtime/app/state/client.svelte.js +3 -1
- package/src/runtime/client/client.js +39 -194
- package/src/runtime/client/fetcher.js +6 -6
- package/src/runtime/client/focus.js +120 -0
- package/src/runtime/client/remote-functions/command.svelte.js +20 -9
- package/src/runtime/client/remote-functions/form.svelte.js +12 -7
- package/src/runtime/client/remote-functions/query/instance.svelte.js +19 -5
- package/src/runtime/client/remote-functions/shared.svelte.js +22 -1
- package/src/runtime/client/scroll.js +39 -0
- package/src/runtime/client/utils.js +28 -0
- package/src/runtime/form-utils.js +243 -245
- package/src/runtime/server/data/index.js +3 -10
- package/src/runtime/server/fetch.js +13 -15
- package/src/runtime/server/index.js +8 -7
- package/src/runtime/server/internal.js +1 -2
- package/src/runtime/server/page/index.js +10 -15
- package/src/runtime/server/page/load_data.js +2 -2
- package/src/runtime/server/page/render.js +8 -13
- package/src/runtime/server/page/respond_with_error.js +4 -5
- package/src/runtime/server/page/server_routing.js +21 -27
- package/src/runtime/server/remote-functions.js +14 -14
- package/src/runtime/server/respond.js +17 -40
- package/src/runtime/server/state.js +1 -0
- package/src/runtime/server/utils.js +4 -4
- package/src/runtime/shared.js +9 -0
- package/src/types/ambient-private.d.ts +1 -2
- package/src/types/internal.d.ts +49 -6
- package/src/utils/filesystem.js +43 -27
- package/src/version.js +1 -1
- package/types/index.d.ts +215 -92
- 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,
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
106
|
-
const length = manifest.
|
|
107
|
-
const type = manifest.
|
|
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(
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
/** @
|
|
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,
|
|
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,4 +1,4 @@
|
|
|
1
|
-
/** @import { RequestEvent
|
|
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,
|
|
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.
|
|
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,
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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:
|
|
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
|
|
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
|
-
|
|
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
|
|
658
|
-
?
|
|
659
|
-
|
|
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,
|
|
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.
|
|
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.
|
|
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 '
|
|
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['
|
|
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
|
-
|
|
52
|
-
|
|
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,
|
|
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
|
|
69
|
-
if (!manifest.
|
|
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.
|
|
75
|
-
const result = find_route(resolved_path, manifest.
|
|
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.
|
|
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
|
|
106
|
-
if (!manifest.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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['
|
|
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['
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
165
|
+
async function handle_remote_call_internal(event, state, id) {
|
|
166
166
|
const [hash, name, additional_args] = id.split('/');
|
|
167
|
-
const remotes = manifest.
|
|
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.
|
|
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,
|
|
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,
|
|
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,
|
|
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.
|
|
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>} */ (
|