@sveltejs/kit 2.65.2 → 2.66.0
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 +1 -1
- package/src/core/adapt/builder.js +13 -1
- package/src/core/config/index.js +60 -2
- package/src/core/config/options.js +12 -3
- package/src/core/sync/create_manifest_data/index.js +13 -2
- package/src/core/sync/write_client_manifest.js +2 -0
- package/src/core/sync/write_server.js +11 -8
- package/src/core/sync/write_tsconfig.js +1 -2
- package/src/exports/vite/index.js +19 -7
- package/src/exports/vite/static_analysis/index.js +8 -3
- package/src/runtime/app/paths/server.js +7 -1
- package/src/runtime/app/server/remote/form.js +2 -2
- package/src/runtime/client/client.js +27 -7
- package/src/runtime/client/remote-functions/form.svelte.js +13 -4
- package/src/runtime/client/remote-functions/query-live/instance.svelte.js +24 -8
- package/src/runtime/client/types.d.ts +6 -0
- package/src/runtime/form-utils.js +1 -0
- package/src/runtime/server/page/render.js +8 -3
- package/src/runtime/server/respond.js +4 -1
- package/src/types/private.d.ts +24 -1
- package/src/utils/shared-iterator.js +5 -0
- package/src/utils/url.js +1 -1
- package/src/version.js +1 -1
- package/types/index.d.ts +30 -4
- package/types/index.d.ts.map +2 -1
package/package.json
CHANGED
|
@@ -22,7 +22,19 @@ import { reserved } from '../env.js';
|
|
|
22
22
|
import { handle_issues, validate } from '../../exports/internal/env.js';
|
|
23
23
|
|
|
24
24
|
const pipe = promisify(pipeline);
|
|
25
|
-
const extensions = [
|
|
25
|
+
const extensions = [
|
|
26
|
+
'.html',
|
|
27
|
+
'.js',
|
|
28
|
+
'.mjs',
|
|
29
|
+
'.json',
|
|
30
|
+
'.css',
|
|
31
|
+
'.svg',
|
|
32
|
+
'.xml',
|
|
33
|
+
'.wasm',
|
|
34
|
+
'.txt',
|
|
35
|
+
'.md',
|
|
36
|
+
'.mdx'
|
|
37
|
+
];
|
|
26
38
|
|
|
27
39
|
/**
|
|
28
40
|
* Creates the Builder which is passed to adapters for building the application.
|
package/src/core/config/index.js
CHANGED
|
@@ -1,14 +1,72 @@
|
|
|
1
|
-
/** @import { Config } from '@sveltejs/kit' */
|
|
1
|
+
/** @import { Config, KitConfig } from '@sveltejs/kit' */
|
|
2
|
+
/** @import { Options, SvelteConfig } from '@sveltejs/vite-plugin-svelte' */
|
|
2
3
|
/** @import { ValidatedConfig } from 'types' */
|
|
3
4
|
/** @import { ResolvedConfig } from 'vite' */
|
|
4
5
|
import fs from 'node:fs';
|
|
5
6
|
import path from 'node:path';
|
|
6
7
|
import process from 'node:process';
|
|
7
8
|
import * as url from 'node:url';
|
|
8
|
-
import options from './options.js';
|
|
9
|
+
import { options, kit_options, kit_experimental_options } from './options.js';
|
|
9
10
|
import { resolve_entry } from '../../utils/filesystem.js';
|
|
10
11
|
import { import_peer } from '../../utils/import.js';
|
|
11
12
|
|
|
13
|
+
/**
|
|
14
|
+
* Splits the config passed to the `sveltekit` Vite plugin into the options that
|
|
15
|
+
* SvelteKit processes itself and the options that are forwarded to
|
|
16
|
+
* `vite-plugin-svelte`. SvelteKit makes no assumptions about which options
|
|
17
|
+
* `vite-plugin-svelte` accepts — it plucks out its own options and passes
|
|
18
|
+
* everything else along (`vite-plugin-svelte` does its own validation).
|
|
19
|
+
* @param {KitConfig & Omit<Options, 'onwarn'> & Pick<SvelteConfig, 'vitePlugin'>} config
|
|
20
|
+
* @returns {{ svelte_config: Config, vite_plugin_svelte_config: Record<string, any> }}
|
|
21
|
+
*/
|
|
22
|
+
export function split_config(config) {
|
|
23
|
+
const { extensions, compilerOptions, vitePlugin, preprocess, ...rest } = config;
|
|
24
|
+
|
|
25
|
+
/** @type {KitConfig} */
|
|
26
|
+
const kit = {};
|
|
27
|
+
|
|
28
|
+
/** @type {Record<string, any>} */
|
|
29
|
+
const vite_plugin_svelte_config = {};
|
|
30
|
+
|
|
31
|
+
for (const key in rest) {
|
|
32
|
+
if (key === 'experimental') {
|
|
33
|
+
// `experimental` is a namespace that both SvelteKit and vite-plugin-svelte
|
|
34
|
+
// use, so pluck out the flags SvelteKit recognises and pass the rest along
|
|
35
|
+
const experimental = /** @type {Record<string, any>} */ (rest[key]) ?? {};
|
|
36
|
+
|
|
37
|
+
/** @type {Record<string, any>} */
|
|
38
|
+
const kit_experimental = {};
|
|
39
|
+
/** @type {Record<string, any>} */
|
|
40
|
+
const vps_experimental = {};
|
|
41
|
+
|
|
42
|
+
for (const flag in experimental) {
|
|
43
|
+
if (kit_experimental_options.includes(flag)) {
|
|
44
|
+
kit_experimental[flag] = experimental[flag];
|
|
45
|
+
} else {
|
|
46
|
+
vps_experimental[flag] = experimental[flag];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (Object.keys(kit_experimental).length > 0) {
|
|
51
|
+
kit.experimental = kit_experimental;
|
|
52
|
+
}
|
|
53
|
+
if (Object.keys(vps_experimental).length > 0) {
|
|
54
|
+
vite_plugin_svelte_config.experimental = vps_experimental;
|
|
55
|
+
}
|
|
56
|
+
} else if (kit_options.includes(key)) {
|
|
57
|
+
// @ts-expect-error - we've verified this is one of SvelteKit's own options
|
|
58
|
+
kit[key] = rest[key];
|
|
59
|
+
} else {
|
|
60
|
+
vite_plugin_svelte_config[key] = /** @type {Record<string, any>} */ (rest)[key];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return {
|
|
65
|
+
svelte_config: { extensions, compilerOptions, vitePlugin, preprocess, kit },
|
|
66
|
+
vite_plugin_svelte_config
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
12
70
|
/**
|
|
13
71
|
* Loads the template (src/app.html by default) and validates that it has the
|
|
14
72
|
* required content.
|
|
@@ -45,7 +45,7 @@ const directives = object({
|
|
|
45
45
|
});
|
|
46
46
|
|
|
47
47
|
/** @type {Validator} */
|
|
48
|
-
const options = object(
|
|
48
|
+
export const options = object(
|
|
49
49
|
{
|
|
50
50
|
extensions: validate(['.svelte'], (input, keypath) => {
|
|
51
51
|
if (!Array.isArray(input) || !input.every((page) => typeof page === 'string')) {
|
|
@@ -326,6 +326,17 @@ const options = object(
|
|
|
326
326
|
true
|
|
327
327
|
);
|
|
328
328
|
|
|
329
|
+
// Derive the names of SvelteKit's own config options from the schema, so they
|
|
330
|
+
// stay in sync automatically. These are used to separate Kit's options from
|
|
331
|
+
// `vite-plugin-svelte`'s options when config is passed via the Vite plugin.
|
|
332
|
+
const defaults = /** @type {Record<string, any>} */ (options({}, 'config'));
|
|
333
|
+
|
|
334
|
+
/** The names of the options that live under the `kit` namespace */
|
|
335
|
+
export const kit_options = Object.keys(defaults.kit);
|
|
336
|
+
|
|
337
|
+
/** The names of the options that live under the `kit.experimental` namespace */
|
|
338
|
+
export const kit_experimental_options = Object.keys(defaults.kit.experimental);
|
|
339
|
+
|
|
329
340
|
/**
|
|
330
341
|
* @param {Validator} fn
|
|
331
342
|
* @param {(keypath: string) => string} get_message
|
|
@@ -502,5 +513,3 @@ function assert_trusted_types_supported(keypath) {
|
|
|
502
513
|
);
|
|
503
514
|
}
|
|
504
515
|
}
|
|
505
|
-
|
|
506
|
-
export default options;
|
|
@@ -426,7 +426,7 @@ function create_routes_and_nodes(cwd, config, fallback) {
|
|
|
426
426
|
|
|
427
427
|
const indexes = new Map(nodes.map((node, i) => [node, i]));
|
|
428
428
|
|
|
429
|
-
const node_analyser = create_node_analyser();
|
|
429
|
+
const node_analyser = create_node_analyser(cwd);
|
|
430
430
|
|
|
431
431
|
// add the related layout, page, and error nodes for a route
|
|
432
432
|
for (const route of routes) {
|
|
@@ -495,7 +495,18 @@ function create_routes_and_nodes(cwd, config, fallback) {
|
|
|
495
495
|
|
|
496
496
|
for (const route of routes) {
|
|
497
497
|
if (route.endpoint) {
|
|
498
|
-
route.endpoint.page_options = get_page_options(route.endpoint.file);
|
|
498
|
+
route.endpoint.page_options = get_page_options(path.join(cwd, route.endpoint.file));
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
if (route.page && route.endpoint) {
|
|
502
|
+
const page = nodes[route.page.leaf];
|
|
503
|
+
if (page.page_options?.prerender || route.endpoint.page_options?.prerender) {
|
|
504
|
+
const endpoint_file = route.endpoint.file.split('/').pop();
|
|
505
|
+
|
|
506
|
+
throw new Error(
|
|
507
|
+
`Cannot prerender a route (${route.id}) with both a \`+page.svelte\` and a \`${endpoint_file}\``
|
|
508
|
+
);
|
|
509
|
+
}
|
|
499
510
|
}
|
|
500
511
|
}
|
|
501
512
|
|
|
@@ -183,6 +183,8 @@ export function write_client_manifest(kit, manifest_data, output, metadata) {
|
|
|
183
183
|
export const decode = (type, value) => decoders[type](value);
|
|
184
184
|
|
|
185
185
|
export { default as root } from '../root.${isSvelte5Plus() ? 'js' : 'svelte'}';
|
|
186
|
+
|
|
187
|
+
export const get_error_template = () => import('../shared/error-template.js').then(m => m.default);
|
|
186
188
|
`
|
|
187
189
|
);
|
|
188
190
|
|
|
@@ -17,7 +17,6 @@ import { escape_html } from '../../utils/escape.js';
|
|
|
17
17
|
* has_service_worker: boolean;
|
|
18
18
|
* runtime_directory: string;
|
|
19
19
|
* template: string;
|
|
20
|
-
* error_page: string;
|
|
21
20
|
* }} opts
|
|
22
21
|
*/
|
|
23
22
|
const server_template = ({
|
|
@@ -26,14 +25,14 @@ const server_template = ({
|
|
|
26
25
|
universal_hooks,
|
|
27
26
|
has_service_worker,
|
|
28
27
|
runtime_directory,
|
|
29
|
-
template
|
|
30
|
-
error_page
|
|
28
|
+
template
|
|
31
29
|
}) => `
|
|
32
30
|
import root from '../root.${isSvelte5Plus() ? 'js' : 'svelte'}';
|
|
33
31
|
import { set_building, set_prerendering } from '$app/env/internal';
|
|
34
32
|
import { set_assets } from '$app/paths/internal/server';
|
|
35
33
|
import { set_manifest, set_read_implementation } from '__sveltekit/server';
|
|
36
34
|
import { set_private_env, set_public_env } from '${runtime_directory}/shared-server.js';
|
|
35
|
+
import error from '../shared/error-template.js';
|
|
37
36
|
|
|
38
37
|
export const options = {
|
|
39
38
|
app_template_contains_nonce: ${template.includes('%sveltekit.nonce%')},
|
|
@@ -62,9 +61,7 @@ export const options = {
|
|
|
62
61
|
/%sveltekit\.env\.([^%]+)%/g,
|
|
63
62
|
(_match, capture) => `" + (env[${s(capture)}] ?? "") + "`
|
|
64
63
|
)},
|
|
65
|
-
error
|
|
66
|
-
.replace(/%sveltekit\.status%/g, '" + status + "')
|
|
67
|
-
.replace(/%sveltekit\.error\.message%/g, '" + message + "')}
|
|
64
|
+
error
|
|
68
65
|
},
|
|
69
66
|
version_hash: ${s(hash(config.kit.version.name))}
|
|
70
67
|
};
|
|
@@ -125,6 +122,13 @@ export function write_server(config, output) {
|
|
|
125
122
|
return posixify(path.relative(`${output}/server`, file));
|
|
126
123
|
}
|
|
127
124
|
|
|
125
|
+
write_if_changed(
|
|
126
|
+
`${output}/shared/error-template.js`,
|
|
127
|
+
`export default ({ status, message }) => ${s(load_error_page(config))
|
|
128
|
+
.replace(/%sveltekit\.status%/g, '" + status + "')
|
|
129
|
+
.replace(/%sveltekit\.error\.message%/g, '" + message + "')};`
|
|
130
|
+
);
|
|
131
|
+
|
|
128
132
|
// Contains the stringified version of
|
|
129
133
|
/** @type {import('types').SSROptions} */
|
|
130
134
|
write_if_changed(
|
|
@@ -136,8 +140,7 @@ export function write_server(config, output) {
|
|
|
136
140
|
has_service_worker:
|
|
137
141
|
config.kit.serviceWorker.register && !!resolve_entry(config.kit.files.serviceWorker),
|
|
138
142
|
runtime_directory: relative(runtime_directory),
|
|
139
|
-
template: load_template(process.cwd(), config)
|
|
140
|
-
error_page: load_error_page(config)
|
|
143
|
+
template: load_template(process.cwd(), config)
|
|
141
144
|
})
|
|
142
145
|
);
|
|
143
146
|
}
|
|
@@ -122,8 +122,7 @@ export function get_tsconfig(kit) {
|
|
|
122
122
|
moduleResolution: 'bundler',
|
|
123
123
|
module: 'esnext',
|
|
124
124
|
noEmit: true, // prevent tsconfig error "overwriting input files" - Vite handles the build and ignores this
|
|
125
|
-
target: 'esnext'
|
|
126
|
-
types: ['node']
|
|
125
|
+
target: 'esnext'
|
|
127
126
|
},
|
|
128
127
|
include: [...include],
|
|
129
128
|
exclude
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
import * as sync from '../../core/sync/sync.js';
|
|
23
23
|
import { create_assets } from '../../core/sync/create_manifest_data/index.js';
|
|
24
24
|
import { runtime_directory, logger } from '../../core/utils.js';
|
|
25
|
-
import { load_svelte_config, process_config } from '../../core/config/index.js';
|
|
25
|
+
import { load_svelte_config, process_config, split_config } from '../../core/config/index.js';
|
|
26
26
|
import { generate_manifest } from '../../core/generate_manifest/index.js';
|
|
27
27
|
import { build_server_nodes } from './build/build_server.js';
|
|
28
28
|
import { build_service_worker } from './build/build_service_worker.js';
|
|
@@ -143,19 +143,27 @@ const warning_preprocessor = {
|
|
|
143
143
|
/**
|
|
144
144
|
* Returns the SvelteKit Vite plugins.
|
|
145
145
|
* Since version 2.62.0 you can pass [configuration](configuration) directly, in which case `svelte.config.js` is ignored.
|
|
146
|
-
*
|
|
146
|
+
* Any options that don't belong to SvelteKit are passed through to `vite-plugin-svelte`.
|
|
147
|
+
* @param {KitConfig & Omit<Options, 'onwarn'> & Pick<SvelteConfig, 'vitePlugin'>} [config]
|
|
147
148
|
* @returns {Promise<Plugin[]>}
|
|
148
149
|
*/
|
|
149
150
|
export async function sveltekit(config) {
|
|
150
151
|
/** @type {ValidatedConfig} */
|
|
151
152
|
let svelte_config;
|
|
152
153
|
|
|
154
|
+
// any options passed to the plugin that SvelteKit doesn't use itself are
|
|
155
|
+
// forwarded to vite-plugin-svelte, which does its own validation
|
|
156
|
+
/** @type {Record<string, any>} */
|
|
157
|
+
let vite_plugin_svelte_config = {};
|
|
158
|
+
|
|
153
159
|
if (config !== undefined) {
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
160
|
+
const split = split_config(config);
|
|
161
|
+
vite_plugin_svelte_config = split.vite_plugin_svelte_config;
|
|
162
|
+
|
|
163
|
+
svelte_config = process_config(split.svelte_config, {
|
|
164
|
+
cwd,
|
|
165
|
+
source: 'SvelteKit options from Vite config'
|
|
166
|
+
});
|
|
159
167
|
|
|
160
168
|
const config_file = ['svelte.config.js', 'svelte.config.ts'].find((file) =>
|
|
161
169
|
fs.existsSync(file)
|
|
@@ -180,6 +188,9 @@ export async function sveltekit(config) {
|
|
|
180
188
|
|
|
181
189
|
/** @type {Options} */
|
|
182
190
|
const vite_plugin_svelte_options = {
|
|
191
|
+
// pass through any options that SvelteKit doesn't use itself first, so
|
|
192
|
+
// that the options SvelteKit manages below always take precedence
|
|
193
|
+
...vite_plugin_svelte_config,
|
|
183
194
|
configFile: false,
|
|
184
195
|
extensions: svelte_config.extensions,
|
|
185
196
|
preprocess,
|
|
@@ -1670,6 +1681,7 @@ const create_service_worker_module = (config) => dedent`
|
|
|
1670
1681
|
throw new Error('This module can only be imported inside a service worker');
|
|
1671
1682
|
}
|
|
1672
1683
|
|
|
1684
|
+
export const base = location.pathname.split('/').slice(0, -1).join('/');
|
|
1673
1685
|
export const build = [];
|
|
1674
1686
|
export const files = [
|
|
1675
1687
|
${create_assets(config)
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
/** @import { PageOptions } from './types.js' */
|
|
2
|
+
import process from 'node:process';
|
|
3
|
+
import path from 'node:path';
|
|
2
4
|
import { tsPlugin } from '@sveltejs/acorn-typescript';
|
|
3
5
|
import { Parser } from 'acorn';
|
|
4
6
|
import { read } from '../../../utils/filesystem.js';
|
|
@@ -227,7 +229,10 @@ export function get_page_options(filepath) {
|
|
|
227
229
|
}
|
|
228
230
|
}
|
|
229
231
|
|
|
230
|
-
|
|
232
|
+
/**
|
|
233
|
+
* @param {string} cwd
|
|
234
|
+
*/
|
|
235
|
+
export function create_node_analyser(cwd = process.cwd()) {
|
|
231
236
|
const static_exports = new Map();
|
|
232
237
|
|
|
233
238
|
/**
|
|
@@ -271,7 +276,7 @@ export function create_node_analyser() {
|
|
|
271
276
|
}
|
|
272
277
|
|
|
273
278
|
if (node.server) {
|
|
274
|
-
const server_page_options = get_page_options(node.server);
|
|
279
|
+
const server_page_options = get_page_options(path.join(cwd, node.server));
|
|
275
280
|
if (server_page_options === null) {
|
|
276
281
|
cache(key, null);
|
|
277
282
|
return null;
|
|
@@ -280,7 +285,7 @@ export function create_node_analyser() {
|
|
|
280
285
|
}
|
|
281
286
|
|
|
282
287
|
if (node.universal) {
|
|
283
|
-
const universal_page_options = get_page_options(node.universal);
|
|
288
|
+
const universal_page_options = get_page_options(path.join(cwd, node.universal));
|
|
284
289
|
if (universal_page_options === null) {
|
|
285
290
|
cache(key, null);
|
|
286
291
|
return null;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { base, assets, relative, initial_base } from './internal/server.js';
|
|
2
2
|
import { resolve_route, find_route } from '../../../utils/routing.js';
|
|
3
3
|
import { decode_pathname } from '../../../utils/url.js';
|
|
4
|
+
import { add_data_suffix } from '../../pathname.js';
|
|
4
5
|
import { try_get_request_store } from '@sveltejs/kit/internal/server';
|
|
5
6
|
import { manifest } from '__sveltekit/server';
|
|
6
7
|
import { get_hooks } from '__SERVER__/internal.js';
|
|
@@ -26,7 +27,12 @@ export function resolve(id, params) {
|
|
|
26
27
|
const store = try_get_request_store();
|
|
27
28
|
|
|
28
29
|
if (store && !store.state.prerendering?.fallback) {
|
|
29
|
-
|
|
30
|
+
// the relative path depth must reflect the URL the browser is actually at, which
|
|
31
|
+
// for a data request includes the `__data.json` suffix that was stripped during routing
|
|
32
|
+
const pathname = store.event.isDataRequest
|
|
33
|
+
? add_data_suffix(store.event.url.pathname)
|
|
34
|
+
: store.event.url.pathname;
|
|
35
|
+
const after_base = pathname.slice(initial_base.length);
|
|
30
36
|
const segments = after_base.split('/').slice(2);
|
|
31
37
|
const prefix = segments.map(() => '..').join('/') || '.';
|
|
32
38
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** @import { RemoteFormInput, RemoteForm, InvalidField } from '@sveltejs/kit' */
|
|
2
|
-
/** @import { InternalRemoteFormIssue, MaybePromise, RemoteFormInternals } from 'types' */
|
|
2
|
+
/** @import { InternalRemoteFormIssue, MaybePromise, HasNonOptionalBoolean, RemoteFormInternals } from 'types' */
|
|
3
3
|
/** @import { StandardSchemaV1 } from '@standard-schema/spec' */
|
|
4
4
|
import { get_request_store } from '@sveltejs/kit/internal/server';
|
|
5
5
|
import { DEV } from 'esm-env';
|
|
@@ -46,7 +46,7 @@ import { ValidationError } from '@sveltejs/kit/internal';
|
|
|
46
46
|
* @template {StandardSchemaV1<RemoteFormInput, Record<string, any>>} Schema
|
|
47
47
|
* @template Output
|
|
48
48
|
* @overload
|
|
49
|
-
* @param {Schema} validate
|
|
49
|
+
* @param {true extends HasNonOptionalBoolean<StandardSchemaV1.InferInput<Schema>> ? 'Error: All booleans in form schemas must be optional (e.g. `v.optional(v.boolean(), false)`) because checkbox inputs do not send a false value when unchecked.' : Schema} validate
|
|
50
50
|
* @param {(data: StandardSchemaV1.InferOutput<Schema>, issue: InvalidField<StandardSchemaV1.InferInput<Schema>>) => MaybePromise<Output>} fn
|
|
51
51
|
* @returns {RemoteForm<StandardSchemaV1.InferInput<Schema>, Output>}
|
|
52
52
|
* @since 2.27
|
|
@@ -718,8 +718,6 @@ async function initialize(result, target, hydrate) {
|
|
|
718
718
|
// which causes component script blocks to run asynchronously
|
|
719
719
|
void (await Promise.resolve());
|
|
720
720
|
|
|
721
|
-
restore_snapshot(current_navigation_index);
|
|
722
|
-
|
|
723
721
|
if (hydrate) {
|
|
724
722
|
/** @type {import('@sveltejs/kit').AfterNavigate} */
|
|
725
723
|
const navigation = {
|
|
@@ -736,6 +734,8 @@ async function initialize(result, target, hydrate) {
|
|
|
736
734
|
after_navigate_callbacks.forEach((fn) => fn(navigation));
|
|
737
735
|
}
|
|
738
736
|
|
|
737
|
+
restore_snapshot(current_navigation_index);
|
|
738
|
+
|
|
739
739
|
started = true;
|
|
740
740
|
}
|
|
741
741
|
|
|
@@ -1488,7 +1488,17 @@ async function load_root_error_page({ status, error, url, route }) {
|
|
|
1488
1488
|
return _goto(new URL(error.location, location.href), {}, 0);
|
|
1489
1489
|
}
|
|
1490
1490
|
|
|
1491
|
-
|
|
1491
|
+
const error_template = await app.get_error_template();
|
|
1492
|
+
const handled = await handle_error(error, { url, params, route });
|
|
1493
|
+
const message = String(handled?.message ?? '')
|
|
1494
|
+
.replace(/&/g, '&')
|
|
1495
|
+
.replace(/</g, '<')
|
|
1496
|
+
.replace(/>/g, '>');
|
|
1497
|
+
const html = error_template({ status, message });
|
|
1498
|
+
const parsed = new DOMParser().parseFromString(html, 'text/html');
|
|
1499
|
+
document.documentElement.replaceChild(document.adoptNode(parsed.head), document.head);
|
|
1500
|
+
document.documentElement.replaceChild(document.adoptNode(parsed.body), document.body);
|
|
1501
|
+
|
|
1492
1502
|
throw error;
|
|
1493
1503
|
}
|
|
1494
1504
|
}
|
|
@@ -1907,6 +1917,16 @@ async function navigate({
|
|
|
1907
1917
|
navigation_result.props.page.url = url;
|
|
1908
1918
|
}
|
|
1909
1919
|
|
|
1920
|
+
// Remove focus before updating the component tree, so that blur/focusout
|
|
1921
|
+
// handlers fire while the old component's data is still valid (#14575)
|
|
1922
|
+
if (
|
|
1923
|
+
!keepfocus &&
|
|
1924
|
+
document.activeElement instanceof HTMLElement &&
|
|
1925
|
+
document.activeElement !== document.body
|
|
1926
|
+
) {
|
|
1927
|
+
document.activeElement.blur();
|
|
1928
|
+
}
|
|
1929
|
+
|
|
1910
1930
|
const fork = load_cache_fork && (await load_cache_fork);
|
|
1911
1931
|
|
|
1912
1932
|
if (fork) {
|
|
@@ -1985,10 +2005,6 @@ async function navigate({
|
|
|
1985
2005
|
|
|
1986
2006
|
is_navigating = false;
|
|
1987
2007
|
|
|
1988
|
-
if (type === 'popstate') {
|
|
1989
|
-
restore_snapshot(current_navigation_index);
|
|
1990
|
-
}
|
|
1991
|
-
|
|
1992
2008
|
nav.fulfil(undefined);
|
|
1993
2009
|
|
|
1994
2010
|
// Update to.scroll to the actual scroll position after navigation completed
|
|
@@ -2000,6 +2016,10 @@ async function navigate({
|
|
|
2000
2016
|
fn(/** @type {import('@sveltejs/kit').AfterNavigate} */ (nav.navigation))
|
|
2001
2017
|
);
|
|
2002
2018
|
|
|
2019
|
+
if (type === 'popstate') {
|
|
2020
|
+
restore_snapshot(current_navigation_index);
|
|
2021
|
+
}
|
|
2022
|
+
|
|
2003
2023
|
stores.navigating.set((navigating.current = null));
|
|
2004
2024
|
|
|
2005
2025
|
updating = false;
|
|
@@ -53,6 +53,9 @@ export function form(id) {
|
|
|
53
53
|
/** @type {Map<any, { count: number, instance: RemoteForm<T, U> }>} */
|
|
54
54
|
const instances = new Map();
|
|
55
55
|
|
|
56
|
+
/** @type {StandardSchemaV1 | null} */
|
|
57
|
+
let shared_preflight_schema = null;
|
|
58
|
+
|
|
56
59
|
/** @param {string | number | boolean} [key] */
|
|
57
60
|
function create_instance(key) {
|
|
58
61
|
const action_id_without_key = id;
|
|
@@ -90,6 +93,7 @@ export function form(id) {
|
|
|
90
93
|
*/
|
|
91
94
|
let enhance_callback = async (instance) => {
|
|
92
95
|
if (await instance.submit()) {
|
|
96
|
+
await tick();
|
|
93
97
|
instance.element.reset();
|
|
94
98
|
}
|
|
95
99
|
};
|
|
@@ -319,7 +323,8 @@ export function form(id) {
|
|
|
319
323
|
*/
|
|
320
324
|
async function preflight(form_data) {
|
|
321
325
|
const data = convert(form_data);
|
|
322
|
-
const
|
|
326
|
+
const schema = preflight_schema ?? shared_preflight_schema;
|
|
327
|
+
const validated = await schema?.['~standard'].validate(data);
|
|
323
328
|
|
|
324
329
|
if (validated?.issues) {
|
|
325
330
|
raw_issues = merge_with_server_issues(
|
|
@@ -520,7 +525,6 @@ export function form(id) {
|
|
|
520
525
|
form.removeEventListener('input', handle_input);
|
|
521
526
|
form.removeEventListener('reset', handle_reset);
|
|
522
527
|
element = null;
|
|
523
|
-
preflight_schema = undefined;
|
|
524
528
|
};
|
|
525
529
|
};
|
|
526
530
|
|
|
@@ -612,6 +616,11 @@ export function form(id) {
|
|
|
612
616
|
/** @type {RemoteForm<T, U>['preflight']} */
|
|
613
617
|
value: (schema) => {
|
|
614
618
|
preflight_schema = schema;
|
|
619
|
+
|
|
620
|
+
if (key === undefined) {
|
|
621
|
+
shared_preflight_schema = schema;
|
|
622
|
+
}
|
|
623
|
+
|
|
615
624
|
return instance;
|
|
616
625
|
}
|
|
617
626
|
},
|
|
@@ -635,8 +644,8 @@ export function form(id) {
|
|
|
635
644
|
let array = [];
|
|
636
645
|
|
|
637
646
|
const data = convert(form_data);
|
|
638
|
-
|
|
639
|
-
const validated = await
|
|
647
|
+
const schema = preflight_schema ?? shared_preflight_schema;
|
|
648
|
+
const validated = await schema?.['~standard'].validate(data);
|
|
640
649
|
|
|
641
650
|
if (validate_id !== id) {
|
|
642
651
|
return;
|
|
@@ -124,6 +124,7 @@ export class LiveQuery {
|
|
|
124
124
|
|
|
125
125
|
/** @type {PromiseWithResolvers<void>} */
|
|
126
126
|
const { promise: stopped, resolve: on_stop } = with_resolvers();
|
|
127
|
+
let connected = false;
|
|
127
128
|
|
|
128
129
|
while (!this.#done) {
|
|
129
130
|
const controller = new AbortController();
|
|
@@ -136,16 +137,22 @@ export class LiveQuery {
|
|
|
136
137
|
const generator = create_live_iterator(this.#id, this.#payload, controller, () => {
|
|
137
138
|
this.#connected = true;
|
|
138
139
|
this.#attempt = 0;
|
|
140
|
+
connected = true;
|
|
139
141
|
on_connect();
|
|
140
142
|
});
|
|
141
143
|
|
|
142
144
|
try {
|
|
143
145
|
const { done, value } = await generator.next();
|
|
144
146
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
147
|
+
if (done) {
|
|
148
|
+
if (!this.#ready) {
|
|
149
|
+
throw new Error('Live query completed before yielding a value');
|
|
150
|
+
}
|
|
151
|
+
// stream completed without yielding (e.g. the generator returned
|
|
152
|
+
// immediately on reconnect) — keep the last good value
|
|
153
|
+
this.#done = true;
|
|
154
|
+
this.#fan_out.done();
|
|
155
|
+
break;
|
|
149
156
|
}
|
|
150
157
|
|
|
151
158
|
this.set(value);
|
|
@@ -202,6 +209,12 @@ export class LiveQuery {
|
|
|
202
209
|
}
|
|
203
210
|
|
|
204
211
|
this.#interrupt = null;
|
|
212
|
+
// If the loop exited without ever successfully connecting, settle the
|
|
213
|
+
// reconnect handshake so callers (e.g. `invalidateAll()`) never await
|
|
214
|
+
// a forever-pending promise.
|
|
215
|
+
if (!connected) {
|
|
216
|
+
on_connect_failed(this.#error ?? new Error('Live query connection was interrupted'));
|
|
217
|
+
}
|
|
205
218
|
on_stop();
|
|
206
219
|
}
|
|
207
220
|
|
|
@@ -345,10 +358,13 @@ export class LiveQuery {
|
|
|
345
358
|
promise.catch(noop);
|
|
346
359
|
this.#done = false;
|
|
347
360
|
this.#attempt = 0;
|
|
348
|
-
//
|
|
349
|
-
//
|
|
350
|
-
//
|
|
351
|
-
|
|
361
|
+
// Keep the existing fan-out open so active `for await` consumers
|
|
362
|
+
// continue receiving values from the new connection without interruption.
|
|
363
|
+
// Only replace it if it was already closed by a prior `done()`/`fail()`
|
|
364
|
+
// (e.g. reconnecting after a finite or hard-failed stream)
|
|
365
|
+
if (this.#fan_out.closed) {
|
|
366
|
+
this.#fan_out = new SharedIterator();
|
|
367
|
+
}
|
|
352
368
|
this.#main({ on_connect, on_connect_failed }).catch(noop);
|
|
353
369
|
await promise;
|
|
354
370
|
}
|
|
@@ -58,6 +58,12 @@ export interface SvelteKitApp {
|
|
|
58
58
|
hash: boolean;
|
|
59
59
|
|
|
60
60
|
root: typeof SvelteComponent;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Lazily loads the contents of src/error.html, used as a last-resort
|
|
64
|
+
* error page when the root layout's load function throws during client-side rendering.
|
|
65
|
+
*/
|
|
66
|
+
get_error_template: () => Promise<(data: { status: number; message: string }) => string>;
|
|
61
67
|
}
|
|
62
68
|
|
|
63
69
|
export type NavigationIntent = {
|
|
@@ -12,7 +12,7 @@ import { public_env } from '../../shared-server.js';
|
|
|
12
12
|
import { SVELTE_KIT_ASSETS } from '../../../constants.js';
|
|
13
13
|
import { SCHEME } from '../../../utils/url.js';
|
|
14
14
|
import { create_server_routing_response, generate_route_object } from './server_routing.js';
|
|
15
|
-
import { add_resolution_suffix } from '../../pathname.js';
|
|
15
|
+
import { add_data_suffix, add_resolution_suffix } from '../../pathname.js';
|
|
16
16
|
import { try_get_request_store, with_request_store } from '@sveltejs/kit/internal/server';
|
|
17
17
|
import { text_encoder } from '../../utils.js';
|
|
18
18
|
import {
|
|
@@ -120,7 +120,12 @@ export async function render_response({
|
|
|
120
120
|
// if appropriate, use relative paths for greater portability
|
|
121
121
|
if (paths.relative) {
|
|
122
122
|
if (!state.prerendering?.fallback) {
|
|
123
|
-
|
|
123
|
+
// the relative path depth must reflect the URL the browser is actually at, which
|
|
124
|
+
// for a data request includes the `__data.json` suffix that was stripped during routing
|
|
125
|
+
const pathname = event.isDataRequest
|
|
126
|
+
? add_data_suffix(event.url.pathname)
|
|
127
|
+
: event.url.pathname;
|
|
128
|
+
const segments = pathname.slice(paths.base.length).split('/').slice(2);
|
|
124
129
|
|
|
125
130
|
base = segments.map(() => '..').join('/') || '.';
|
|
126
131
|
|
|
@@ -430,7 +435,7 @@ export async function render_response({
|
|
|
430
435
|
|
|
431
436
|
if (Object.keys(options.hooks.transport).length > 0) {
|
|
432
437
|
if (client.inline) {
|
|
433
|
-
app_declaration = `const app =
|
|
438
|
+
app_declaration = `const app = ${global}.app.app;`;
|
|
434
439
|
} else if (client.app) {
|
|
435
440
|
app_declaration = `const app = await import(${s(prefixed(client.app))});`;
|
|
436
441
|
} else {
|
|
@@ -619,7 +619,10 @@ export async function internal_respond(request, options, manifest, state) {
|
|
|
619
619
|
invalidated_data_nodes,
|
|
620
620
|
trailing_slash
|
|
621
621
|
);
|
|
622
|
-
} else if (
|
|
622
|
+
} else if (
|
|
623
|
+
route.endpoint &&
|
|
624
|
+
(!route.page || (!state.prerendering && is_endpoint_request(event)))
|
|
625
|
+
) {
|
|
623
626
|
response = await render_endpoint(event, event_state, await route.endpoint(), state);
|
|
624
627
|
} else if (route.page) {
|
|
625
628
|
if (!page_nodes) {
|
package/src/types/private.d.ts
CHANGED
|
@@ -61,7 +61,10 @@ export namespace Csp {
|
|
|
61
61
|
| 'unsafe-eval'
|
|
62
62
|
| 'unsafe-hashes'
|
|
63
63
|
| 'unsafe-inline'
|
|
64
|
+
| 'unsafe-allow-redirects'
|
|
65
|
+
| 'unsafe-webtransport-hashes'
|
|
64
66
|
| 'wasm-unsafe-eval'
|
|
67
|
+
| 'trusted-types-eval'
|
|
65
68
|
| 'none';
|
|
66
69
|
type CryptoSource = `${'nonce' | 'sha256' | 'sha384' | 'sha512'}-${string}`;
|
|
67
70
|
type FrameSource = HostSource | SchemeSource | 'self' | 'none';
|
|
@@ -70,7 +73,16 @@ export namespace Csp {
|
|
|
70
73
|
type HostProtocolSchemes = `${string}://` | '';
|
|
71
74
|
type HttpDelineator = '/' | '?' | '#' | '\\';
|
|
72
75
|
type PortScheme = `:${number}` | '' | ':*';
|
|
73
|
-
type SchemeSource =
|
|
76
|
+
type SchemeSource =
|
|
77
|
+
| 'http:'
|
|
78
|
+
| 'https:'
|
|
79
|
+
| 'ws:'
|
|
80
|
+
| 'wss:'
|
|
81
|
+
| 'data:'
|
|
82
|
+
| 'mediastream:'
|
|
83
|
+
| 'blob:'
|
|
84
|
+
| 'filesystem:'
|
|
85
|
+
| (`${string}:` & {});
|
|
74
86
|
type Source = HostSource | SchemeSource | CryptoSource | BaseSource;
|
|
75
87
|
type Sources = Source[];
|
|
76
88
|
}
|
|
@@ -252,3 +264,14 @@ export type DeepPartial<T> = T extends Record<PropertyKey, unknown> | unknown[]
|
|
|
252
264
|
: T | undefined;
|
|
253
265
|
|
|
254
266
|
export type IsAny<T> = 0 extends 1 & T ? true : false;
|
|
267
|
+
|
|
268
|
+
export type HasNonOptionalBoolean<T> =
|
|
269
|
+
IsAny<T> extends true
|
|
270
|
+
? never
|
|
271
|
+
: [T] extends [boolean]
|
|
272
|
+
? true
|
|
273
|
+
: T extends Array<infer U>
|
|
274
|
+
? HasNonOptionalBoolean<U>
|
|
275
|
+
: T extends Record<string, any>
|
|
276
|
+
? { [K in keyof T]: HasNonOptionalBoolean<T[K]> }[keyof T]
|
|
277
|
+
: never;
|
|
@@ -52,6 +52,11 @@ export class SharedIterator {
|
|
|
52
52
|
/** @type {unknown} */
|
|
53
53
|
#terminal_error = undefined;
|
|
54
54
|
|
|
55
|
+
/** Whether `done()` or `fail()` has been broadcast. */
|
|
56
|
+
get closed() {
|
|
57
|
+
return this.#closed;
|
|
58
|
+
}
|
|
59
|
+
|
|
55
60
|
/**
|
|
56
61
|
* @param {(instance: SharedIterator<T>) => (() => void)} [start]
|
|
57
62
|
*/
|
package/src/utils/url.js
CHANGED
|
@@ -119,6 +119,7 @@ export function make_trackable(url, callback, search_params_callback, allow_hash
|
|
|
119
119
|
/**
|
|
120
120
|
* URL properties that could change during the lifetime of the page,
|
|
121
121
|
* which excludes things like `origin`
|
|
122
|
+
* @type {(keyof URL)[]}
|
|
122
123
|
*/
|
|
123
124
|
const tracked_url_properties = ['href', 'pathname', 'search', 'toString', 'toJSON'];
|
|
124
125
|
if (allow_hash) tracked_url_properties.push('hash');
|
|
@@ -127,7 +128,6 @@ export function make_trackable(url, callback, search_params_callback, allow_hash
|
|
|
127
128
|
Object.defineProperty(tracked, property, {
|
|
128
129
|
get() {
|
|
129
130
|
callback();
|
|
130
|
-
// @ts-expect-error
|
|
131
131
|
return url[property];
|
|
132
132
|
},
|
|
133
133
|
|
package/src/version.js
CHANGED
package/types/index.d.ts
CHANGED
|
@@ -2396,7 +2396,10 @@ declare module '@sveltejs/kit' {
|
|
|
2396
2396
|
| 'unsafe-eval'
|
|
2397
2397
|
| 'unsafe-hashes'
|
|
2398
2398
|
| 'unsafe-inline'
|
|
2399
|
+
| 'unsafe-allow-redirects'
|
|
2400
|
+
| 'unsafe-webtransport-hashes'
|
|
2399
2401
|
| 'wasm-unsafe-eval'
|
|
2402
|
+
| 'trusted-types-eval'
|
|
2400
2403
|
| 'none';
|
|
2401
2404
|
type CryptoSource = `${'nonce' | 'sha256' | 'sha384' | 'sha512'}-${string}`;
|
|
2402
2405
|
type FrameSource = HostSource | SchemeSource | 'self' | 'none';
|
|
@@ -2405,7 +2408,16 @@ declare module '@sveltejs/kit' {
|
|
|
2405
2408
|
type HostProtocolSchemes = `${string}://` | '';
|
|
2406
2409
|
type HttpDelineator = '/' | '?' | '#' | '\\';
|
|
2407
2410
|
type PortScheme = `:${number}` | '' | ':*';
|
|
2408
|
-
type SchemeSource =
|
|
2411
|
+
type SchemeSource =
|
|
2412
|
+
| 'http:'
|
|
2413
|
+
| 'https:'
|
|
2414
|
+
| 'ws:'
|
|
2415
|
+
| 'wss:'
|
|
2416
|
+
| 'data:'
|
|
2417
|
+
| 'mediastream:'
|
|
2418
|
+
| 'blob:'
|
|
2419
|
+
| 'filesystem:'
|
|
2420
|
+
| (`${string}:` & {});
|
|
2409
2421
|
type Source = HostSource | SchemeSource | CryptoSource | BaseSource;
|
|
2410
2422
|
type Sources = Source[];
|
|
2411
2423
|
}
|
|
@@ -3106,13 +3118,14 @@ declare module '@sveltejs/kit/node/polyfills' {
|
|
|
3106
3118
|
|
|
3107
3119
|
declare module '@sveltejs/kit/vite' {
|
|
3108
3120
|
import type { KitConfig } from '@sveltejs/kit';
|
|
3109
|
-
import type { SvelteConfig } from '@sveltejs/vite-plugin-svelte';
|
|
3121
|
+
import type { Options, SvelteConfig } from '@sveltejs/vite-plugin-svelte';
|
|
3110
3122
|
import type { Plugin } from 'vite';
|
|
3111
3123
|
/**
|
|
3112
3124
|
* Returns the SvelteKit Vite plugins.
|
|
3113
3125
|
* Since version 2.62.0 you can pass [configuration](configuration) directly, in which case `svelte.config.js` is ignored.
|
|
3126
|
+
* Any options that don't belong to SvelteKit are passed through to `vite-plugin-svelte`.
|
|
3114
3127
|
* */
|
|
3115
|
-
export function sveltekit(config?: KitConfig & Omit<
|
|
3128
|
+
export function sveltekit(config?: KitConfig & Omit<Options, "onwarn"> & Pick<SvelteConfig, "vitePlugin">): Promise<Plugin[]>;
|
|
3116
3129
|
|
|
3117
3130
|
export {};
|
|
3118
3131
|
}
|
|
@@ -3522,7 +3535,7 @@ declare module '$app/server' {
|
|
|
3522
3535
|
*
|
|
3523
3536
|
* @since 2.27
|
|
3524
3537
|
*/
|
|
3525
|
-
export function form<Schema extends StandardSchemaV1<RemoteFormInput, Record<string, any>>, Output>(validate: Schema, fn: (data: StandardSchemaV1.InferOutput<Schema>, issue: InvalidField<StandardSchemaV1.InferInput<Schema>>) => MaybePromise<Output>): RemoteForm<StandardSchemaV1.InferInput<Schema>, Output>;
|
|
3538
|
+
export function form<Schema extends StandardSchemaV1<RemoteFormInput, Record<string, any>>, Output>(validate: true extends HasNonOptionalBoolean<StandardSchemaV1.InferInput<Schema>> ? "Error: All booleans in form schemas must be optional (e.g. `v.optional(v.boolean(), false)`) because checkbox inputs do not send a false value when unchecked." : Schema, fn: (data: StandardSchemaV1.InferOutput<Schema>, issue: InvalidField<StandardSchemaV1.InferInput<Schema>>) => MaybePromise<Output>): RemoteForm<StandardSchemaV1.InferInput<Schema>, Output>;
|
|
3526
3539
|
/**
|
|
3527
3540
|
* Creates a remote prerender function. When called from the browser, the function will be invoked on the server via a `fetch` call.
|
|
3528
3541
|
*
|
|
@@ -3690,6 +3703,19 @@ declare module '$app/server' {
|
|
|
3690
3703
|
type RemotePrerenderInputsGenerator<Input = any> = () => MaybePromise<Input[]>;
|
|
3691
3704
|
type MaybePromise<T> = T | Promise<T>;
|
|
3692
3705
|
|
|
3706
|
+
type IsAny<T> = 0 extends 1 & T ? true : false;
|
|
3707
|
+
|
|
3708
|
+
type HasNonOptionalBoolean<T> =
|
|
3709
|
+
IsAny<T> extends true
|
|
3710
|
+
? never
|
|
3711
|
+
: [T] extends [boolean]
|
|
3712
|
+
? true
|
|
3713
|
+
: T extends Array<infer U>
|
|
3714
|
+
? HasNonOptionalBoolean<U>
|
|
3715
|
+
: T extends Record<string, any>
|
|
3716
|
+
? { [K in keyof T]: HasNonOptionalBoolean<T[K]> }[keyof T]
|
|
3717
|
+
: never;
|
|
3718
|
+
|
|
3693
3719
|
export {};
|
|
3694
3720
|
}
|
|
3695
3721
|
|
package/types/index.d.ts.map
CHANGED
|
@@ -189,6 +189,7 @@
|
|
|
189
189
|
"getRequestEvent",
|
|
190
190
|
"RemoteLiveQueryUserFunctionReturnType",
|
|
191
191
|
"RemotePrerenderInputsGenerator",
|
|
192
|
+
"HasNonOptionalBoolean",
|
|
192
193
|
"page",
|
|
193
194
|
"navigating",
|
|
194
195
|
"updated",
|
|
@@ -246,6 +247,6 @@
|
|
|
246
247
|
null,
|
|
247
248
|
null
|
|
248
249
|
],
|
|
249
|
-
"mappings": "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
|
|
250
|
+
"mappings": "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",
|
|
250
251
|
"ignoreList": []
|
|
251
252
|
}
|