@sveltejs/kit 2.65.2 → 2.67.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sveltejs/kit",
3
- "version": "2.65.2",
3
+ "version": "2.67.0",
4
4
  "description": "SvelteKit is the fastest way to build Svelte apps",
5
5
  "keywords": [
6
6
  "framework",
@@ -97,7 +97,7 @@
97
97
  "import": "./src/exports/internal/env.js"
98
98
  },
99
99
  "./internal/types": {
100
- "import": "./src/exports/internal/types.js"
100
+ "types": "./src/exports/internal/types.d.ts"
101
101
  },
102
102
  "./internal/server": {
103
103
  "types": "./types/index.d.ts",
@@ -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 = ['.html', '.js', '.mjs', '.json', '.css', '.svg', '.xml', '.wasm', '.txt'];
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.
@@ -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')) {
@@ -281,6 +281,20 @@ const options = object(
281
281
  }
282
282
  ),
283
283
 
284
+ handleInvalidUrl: validate(
285
+ (/** @type {any} */ { message }) => {
286
+ throw new Error(
287
+ message +
288
+ '\nTo suppress or handle this error, implement `handleInvalidUrl` in https://svelte.dev/docs/kit/configuration#prerender'
289
+ );
290
+ },
291
+ (input, keypath) => {
292
+ if (typeof input === 'function') return input;
293
+ if (['fail', 'warn', 'ignore'].includes(input)) return input;
294
+ throw new Error(`${keypath} should be "fail", "warn", "ignore" or a custom function`);
295
+ }
296
+ ),
297
+
284
298
  origin: validate('http://sveltekit-prerender', (input, keypath) => {
285
299
  assert_string(input, keypath);
286
300
 
@@ -326,6 +340,17 @@ const options = object(
326
340
  true
327
341
  );
328
342
 
343
+ // Derive the names of SvelteKit's own config options from the schema, so they
344
+ // stay in sync automatically. These are used to separate Kit's options from
345
+ // `vite-plugin-svelte`'s options when config is passed via the Vite plugin.
346
+ const defaults = /** @type {Record<string, any>} */ (options({}, 'config'));
347
+
348
+ /** The names of the options that live under the `kit` namespace */
349
+ export const kit_options = Object.keys(defaults.kit);
350
+
351
+ /** The names of the options that live under the `kit.experimental` namespace */
352
+ export const kit_experimental_options = Object.keys(defaults.kit.experimental);
353
+
329
354
  /**
330
355
  * @param {Validator} fn
331
356
  * @param {(keypath: string) => string} get_message
@@ -502,5 +527,3 @@ function assert_trusted_types_supported(keypath) {
502
527
  );
503
528
  }
504
529
  }
505
-
506
- export default options;
@@ -38,6 +38,18 @@ export function crawl(html, base) {
38
38
  /** @type {string[]} */
39
39
  const hrefs = [];
40
40
 
41
+ /** @type {string[]} */
42
+ const invalid = [];
43
+
44
+ /** @param {string} url */
45
+ const push_href = (url) => {
46
+ try {
47
+ hrefs.push(resolve(base, url));
48
+ } catch {
49
+ invalid.push(url);
50
+ }
51
+ };
52
+
41
53
  let i = 0;
42
54
  main: while (i < html.length) {
43
55
  const char = html[i];
@@ -186,9 +198,13 @@ export function crawl(html, base) {
186
198
 
187
199
  if (href) {
188
200
  if (tag === 'BASE') {
189
- base = resolve(base, href);
201
+ try {
202
+ base = resolve(base, href);
203
+ } catch {
204
+ invalid.push(href);
205
+ }
190
206
  } else if (!rel || !/\bexternal\b/i.test(rel)) {
191
- hrefs.push(resolve(base, href));
207
+ push_href(href);
192
208
  }
193
209
  }
194
210
 
@@ -201,7 +217,7 @@ export function crawl(html, base) {
201
217
  }
202
218
 
203
219
  if (src) {
204
- hrefs.push(resolve(base, src));
220
+ push_href(src);
205
221
  }
206
222
 
207
223
  if (srcset) {
@@ -222,7 +238,7 @@ export function crawl(html, base) {
222
238
  candidates.push(value);
223
239
  for (const candidate of candidates) {
224
240
  const src = candidate.split(WHITESPACE)[0];
225
- if (src) hrefs.push(resolve(base, src));
241
+ if (src) push_href(src);
226
242
  }
227
243
  }
228
244
 
@@ -230,7 +246,7 @@ export function crawl(html, base) {
230
246
  const attr = name ?? property;
231
247
 
232
248
  if (attr && CRAWLABLE_META_NAME_ATTRS.has(attr)) {
233
- hrefs.push(resolve(base, content));
249
+ push_href(content);
234
250
  }
235
251
  }
236
252
  }
@@ -239,5 +255,5 @@ export function crawl(html, base) {
239
255
  i += 1;
240
256
  }
241
257
 
242
- return { ids, hrefs };
258
+ return { ids, hrefs, invalid };
243
259
  }
@@ -178,6 +178,14 @@ async function prerender({ hash, out, manifest_path, metadata, verbose, env }) {
178
178
  }
179
179
  );
180
180
 
181
+ const handle_invalid_url = normalise_error_handler(
182
+ log,
183
+ config.prerender.handleInvalidUrl,
184
+ ({ href, referrer }) => {
185
+ return `Invalid URL ${href}${referrer ? ` (linked from ${referrer})` : ''}`;
186
+ }
187
+ );
188
+
181
189
  const q = queue(config.prerender.concurrency);
182
190
 
183
191
  /**
@@ -332,7 +340,11 @@ async function prerender({ hash, out, manifest_path, metadata, verbose, env }) {
332
340
 
333
341
  // if it's a 200 HTML response, crawl it. Skip error responses, as we don't save those
334
342
  if (response.ok && config.prerender.crawl && headers['content-type'] === 'text/html') {
335
- const { ids, hrefs } = crawl(body.toString(), decoded);
343
+ const { ids, hrefs, invalid } = crawl(body.toString(), decoded);
344
+
345
+ for (const href of invalid) {
346
+ handle_invalid_url({ href, referrer: decoded });
347
+ }
336
348
 
337
349
  actual_hashlinks.set(decoded, ids);
338
350
 
@@ -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: ({ status, message }) => ${s(error_page)
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
@@ -11,6 +11,7 @@ import {
11
11
  Prerendered,
12
12
  PrerenderEntryGeneratorMismatchHandlerValue,
13
13
  PrerenderHttpErrorHandlerValue,
14
+ PrerenderInvalidUrlHandlerValue,
14
15
  PrerenderMissingIdHandlerValue,
15
16
  PrerenderUnseenRoutesHandlerValue,
16
17
  PrerenderOption,
@@ -796,6 +797,18 @@ export interface KitConfig {
796
797
  * @since 2.16.0
797
798
  */
798
799
  handleUnseenRoutes?: PrerenderUnseenRoutesHandlerValue;
800
+ /**
801
+ * How to respond when SvelteKit encounters a URL it cannot parse while crawling prerendered HTML (for example, an AT Protocol URL such as `at://did:plc:...`).
802
+ *
803
+ * - `'fail'` — fail the build
804
+ * - `'ignore'` - silently ignore the failure and continue
805
+ * - `'warn'` — continue, but print a warning
806
+ * - `(details) => void` — a custom error handler that takes a `details` object with `href`, `referrer` and `message` properties. If you `throw` from this function, the build will fail
807
+ *
808
+ * @default "fail"
809
+ * @since 2.67.0
810
+ */
811
+ handleInvalidUrl?: PrerenderInvalidUrlHandlerValue;
799
812
  /**
800
813
  * The value of `url.origin` during prerendering; useful if it is included in rendered content.
801
814
  * @default "http://sveltekit-prerender"
@@ -2109,7 +2122,7 @@ type RecursiveFormFields = RemoteFormFieldContainer<any> & {
2109
2122
  type MaybeArray<T> = T | T[];
2110
2123
 
2111
2124
  export interface RemoteFormInput {
2112
- [key: string]: MaybeArray<string | number | boolean | File | RemoteFormInput>;
2125
+ [key: string]: MaybeArray<string | number | boolean | File | RemoteFormInput> | undefined;
2113
2126
  }
2114
2127
 
2115
2128
  export interface RemoteFormIssue {
@@ -165,13 +165,6 @@ export async function build_service_worker(
165
165
  }
166
166
  };
167
167
 
168
- // we must reference Vite 8 options conditionally. Otherwise, older Vite
169
- // versions throw an error about unknown config options
170
- if (is_rolldown && config?.build?.rollupOptions?.output) {
171
- // @ts-ignore only available in Vite 8
172
- config.build.rollupOptions.output.codeSplitting = true;
173
- }
174
-
175
168
  await vite.build(config);
176
169
 
177
170
  // rename .mjs to .js to avoid incorrect MIME types with ancient webservers
@@ -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
- * @param {KitConfig & Omit<SvelteConfig, 'onwarn'>} [config]
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 { extensions, compilerOptions, vitePlugin, preprocess, ...kit } = config;
155
- svelte_config = process_config(
156
- { extensions, compilerOptions, vitePlugin, preprocess, kit },
157
- { cwd, source: 'SvelteKit options from Vite config' }
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,
@@ -1136,9 +1147,9 @@ async function kit({ svelte_config }) {
1136
1147
 
1137
1148
  // we must reference Vite 8 options conditionally. Otherwise, older Vite
1138
1149
  // versions throw an error about unknown config options
1139
- if (is_rolldown && new_config?.build?.rollupOptions?.output) {
1150
+ if (is_rolldown && !split && new_config.build?.rollupOptions?.output) {
1140
1151
  // @ts-ignore only available in Vite 8
1141
- new_config.build.rollupOptions.output.codeSplitting = split;
1152
+ new_config.build.rollupOptions.output.codeSplitting = false;
1142
1153
  }
1143
1154
  } else {
1144
1155
  new_config = {
@@ -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
- export function create_node_analyser() {
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
- const after_base = store.event.url.pathname.slice(initial_base.length);
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
- // TODO: this falls back to the server when a server exists, but what about SPA mode?
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, '&amp;')
1495
+ .replace(/</g, '&lt;')
1496
+ .replace(/>/g, '&gt;');
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 validated = await preflight_schema?.['~standard'].validate(data);
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 preflight_schema?.['~standard'].validate(data);
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
- // TODO how much special handling does this need?
146
- // should we even try to reconnect if this is the case?
147
- if (done && !this.#ready) {
148
- throw new Error('Live query completed before yielding a value');
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
- // The previous fan-out may have been closed by `done()`/`fail()`. Future
349
- // `for await` consumers need a fresh, open fan-out attached to the new
350
- // `#main` lifetime.
351
- this.#fan_out = new SharedIterator();
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 = {
@@ -50,6 +50,7 @@ export function convert_formdata(data) {
50
50
  values = values.filter(
51
51
  (entry) => typeof entry === 'string' || entry.name !== '' || entry.size > 0
52
52
  );
53
+ if (values.length === 0 && !is_array) continue;
53
54
 
54
55
  if (key.startsWith('n:')) {
55
56
  key = key.slice(2);
@@ -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
- const segments = event.url.pathname.slice(paths.base.length).split('/').slice(2);
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 = __sveltekit_${options.version_hash}.app.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 (route.endpoint && (!route.page || is_endpoint_request(event))) {
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) {
@@ -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 = 'http:' | 'https:' | 'data:' | 'mediastream:' | 'blob:' | 'filesystem:';
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
  }
@@ -212,6 +224,10 @@ export interface PrerenderUnseenRoutesHandler {
212
224
  (details: { routes: string[]; message: string }): void;
213
225
  }
214
226
 
227
+ export interface PrerenderInvalidUrlHandler {
228
+ (details: { href: string; referrer: string | null; message: string }): void;
229
+ }
230
+
215
231
  export type PrerenderHttpErrorHandlerValue = 'fail' | 'warn' | 'ignore' | PrerenderHttpErrorHandler;
216
232
  export type PrerenderMissingIdHandlerValue = 'fail' | 'warn' | 'ignore' | PrerenderMissingIdHandler;
217
233
  export type PrerenderUnseenRoutesHandlerValue =
@@ -224,6 +240,11 @@ export type PrerenderEntryGeneratorMismatchHandlerValue =
224
240
  | 'warn'
225
241
  | 'ignore'
226
242
  | PrerenderEntryGeneratorMismatchHandler;
243
+ export type PrerenderInvalidUrlHandlerValue =
244
+ | 'fail'
245
+ | 'warn'
246
+ | 'ignore'
247
+ | PrerenderInvalidUrlHandler;
227
248
 
228
249
  export type PrerenderOption = boolean | 'auto';
229
250
 
@@ -252,3 +273,14 @@ export type DeepPartial<T> = T extends Record<PropertyKey, unknown> | unknown[]
252
273
  : T | undefined;
253
274
 
254
275
  export type IsAny<T> = 0 extends 1 & T ? true : false;
276
+
277
+ export type HasNonOptionalBoolean<T> =
278
+ IsAny<T> extends true
279
+ ? never
280
+ : [T] extends [boolean]
281
+ ? true
282
+ : T extends Array<infer U>
283
+ ? HasNonOptionalBoolean<U>
284
+ : T extends Record<string, any>
285
+ ? { [K in keyof T]: HasNonOptionalBoolean<T[K]> }[keyof T]
286
+ : 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
@@ -1,4 +1,4 @@
1
1
  // generated during release, do not modify
2
2
 
3
3
  /** @type {string} */
4
- export const VERSION = '2.65.2';
4
+ export const VERSION = '2.67.0';
package/types/index.d.ts CHANGED
@@ -770,6 +770,18 @@ declare module '@sveltejs/kit' {
770
770
  * @since 2.16.0
771
771
  */
772
772
  handleUnseenRoutes?: PrerenderUnseenRoutesHandlerValue;
773
+ /**
774
+ * How to respond when SvelteKit encounters a URL it cannot parse while crawling prerendered HTML (for example, an AT Protocol URL such as `at://did:plc:...`).
775
+ *
776
+ * - `'fail'` — fail the build
777
+ * - `'ignore'` - silently ignore the failure and continue
778
+ * - `'warn'` — continue, but print a warning
779
+ * - `(details) => void` — a custom error handler that takes a `details` object with `href`, `referrer` and `message` properties. If you `throw` from this function, the build will fail
780
+ *
781
+ * @default "fail"
782
+ * @since 2.67.0
783
+ */
784
+ handleInvalidUrl?: PrerenderInvalidUrlHandlerValue;
773
785
  /**
774
786
  * The value of `url.origin` during prerendering; useful if it is included in rendered content.
775
787
  * @default "http://sveltekit-prerender"
@@ -2083,7 +2095,7 @@ declare module '@sveltejs/kit' {
2083
2095
  type MaybeArray<T> = T | T[];
2084
2096
 
2085
2097
  export interface RemoteFormInput {
2086
- [key: string]: MaybeArray<string | number | boolean | File | RemoteFormInput>;
2098
+ [key: string]: MaybeArray<string | number | boolean | File | RemoteFormInput> | undefined;
2087
2099
  }
2088
2100
 
2089
2101
  export interface RemoteFormIssue {
@@ -2396,7 +2408,10 @@ declare module '@sveltejs/kit' {
2396
2408
  | 'unsafe-eval'
2397
2409
  | 'unsafe-hashes'
2398
2410
  | 'unsafe-inline'
2411
+ | 'unsafe-allow-redirects'
2412
+ | 'unsafe-webtransport-hashes'
2399
2413
  | 'wasm-unsafe-eval'
2414
+ | 'trusted-types-eval'
2400
2415
  | 'none';
2401
2416
  type CryptoSource = `${'nonce' | 'sha256' | 'sha384' | 'sha512'}-${string}`;
2402
2417
  type FrameSource = HostSource | SchemeSource | 'self' | 'none';
@@ -2405,7 +2420,16 @@ declare module '@sveltejs/kit' {
2405
2420
  type HostProtocolSchemes = `${string}://` | '';
2406
2421
  type HttpDelineator = '/' | '?' | '#' | '\\';
2407
2422
  type PortScheme = `:${number}` | '' | ':*';
2408
- type SchemeSource = 'http:' | 'https:' | 'data:' | 'mediastream:' | 'blob:' | 'filesystem:';
2423
+ type SchemeSource =
2424
+ | 'http:'
2425
+ | 'https:'
2426
+ | 'ws:'
2427
+ | 'wss:'
2428
+ | 'data:'
2429
+ | 'mediastream:'
2430
+ | 'blob:'
2431
+ | 'filesystem:'
2432
+ | (`${string}:` & {});
2409
2433
  type Source = HostSource | SchemeSource | CryptoSource | BaseSource;
2410
2434
  type Sources = Source[];
2411
2435
  }
@@ -2547,6 +2571,10 @@ declare module '@sveltejs/kit' {
2547
2571
  (details: { routes: string[]; message: string }): void;
2548
2572
  }
2549
2573
 
2574
+ interface PrerenderInvalidUrlHandler {
2575
+ (details: { href: string; referrer: string | null; message: string }): void;
2576
+ }
2577
+
2550
2578
  type PrerenderHttpErrorHandlerValue = 'fail' | 'warn' | 'ignore' | PrerenderHttpErrorHandler;
2551
2579
  type PrerenderMissingIdHandlerValue = 'fail' | 'warn' | 'ignore' | PrerenderMissingIdHandler;
2552
2580
  type PrerenderUnseenRoutesHandlerValue =
@@ -2559,6 +2587,11 @@ declare module '@sveltejs/kit' {
2559
2587
  | 'warn'
2560
2588
  | 'ignore'
2561
2589
  | PrerenderEntryGeneratorMismatchHandler;
2590
+ type PrerenderInvalidUrlHandlerValue =
2591
+ | 'fail'
2592
+ | 'warn'
2593
+ | 'ignore'
2594
+ | PrerenderInvalidUrlHandler;
2562
2595
 
2563
2596
  export type PrerenderOption = boolean | 'auto';
2564
2597
 
@@ -3106,13 +3139,14 @@ declare module '@sveltejs/kit/node/polyfills' {
3106
3139
 
3107
3140
  declare module '@sveltejs/kit/vite' {
3108
3141
  import type { KitConfig } from '@sveltejs/kit';
3109
- import type { SvelteConfig } from '@sveltejs/vite-plugin-svelte';
3142
+ import type { Options, SvelteConfig } from '@sveltejs/vite-plugin-svelte';
3110
3143
  import type { Plugin } from 'vite';
3111
3144
  /**
3112
3145
  * Returns the SvelteKit Vite plugins.
3113
3146
  * Since version 2.62.0 you can pass [configuration](configuration) directly, in which case `svelte.config.js` is ignored.
3147
+ * Any options that don't belong to SvelteKit are passed through to `vite-plugin-svelte`.
3114
3148
  * */
3115
- export function sveltekit(config?: KitConfig & Omit<SvelteConfig, "onwarn">): Promise<Plugin[]>;
3149
+ export function sveltekit(config?: KitConfig & Omit<Options, "onwarn"> & Pick<SvelteConfig, "vitePlugin">): Promise<Plugin[]>;
3116
3150
 
3117
3151
  export {};
3118
3152
  }
@@ -3522,7 +3556,7 @@ declare module '$app/server' {
3522
3556
  *
3523
3557
  * @since 2.27
3524
3558
  */
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>;
3559
+ 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
3560
  /**
3527
3561
  * Creates a remote prerender function. When called from the browser, the function will be invoked on the server via a `fetch` call.
3528
3562
  *
@@ -3690,6 +3724,19 @@ declare module '$app/server' {
3690
3724
  type RemotePrerenderInputsGenerator<Input = any> = () => MaybePromise<Input[]>;
3691
3725
  type MaybePromise<T> = T | Promise<T>;
3692
3726
 
3727
+ type IsAny<T> = 0 extends 1 & T ? true : false;
3728
+
3729
+ type HasNonOptionalBoolean<T> =
3730
+ IsAny<T> extends true
3731
+ ? never
3732
+ : [T] extends [boolean]
3733
+ ? true
3734
+ : T extends Array<infer U>
3735
+ ? HasNonOptionalBoolean<U>
3736
+ : T extends Record<string, any>
3737
+ ? { [K in keyof T]: HasNonOptionalBoolean<T[K]> }[keyof T]
3738
+ : never;
3739
+
3693
3740
  export {};
3694
3741
  }
3695
3742
 
@@ -108,10 +108,12 @@
108
108
  "PrerenderMissingIdHandler",
109
109
  "PrerenderEntryGeneratorMismatchHandler",
110
110
  "PrerenderUnseenRoutesHandler",
111
+ "PrerenderInvalidUrlHandler",
111
112
  "PrerenderHttpErrorHandlerValue",
112
113
  "PrerenderMissingIdHandlerValue",
113
114
  "PrerenderUnseenRoutesHandlerValue",
114
115
  "PrerenderEntryGeneratorMismatchHandlerValue",
116
+ "PrerenderInvalidUrlHandlerValue",
115
117
  "PrerenderOption",
116
118
  "RequestOptions",
117
119
  "RouteSegment",
@@ -189,6 +191,7 @@
189
191
  "getRequestEvent",
190
192
  "RemoteLiveQueryUserFunctionReturnType",
191
193
  "RemotePrerenderInputsGenerator",
194
+ "HasNonOptionalBoolean",
192
195
  "page",
193
196
  "navigating",
194
197
  "updated",
@@ -246,6 +249,6 @@
246
249
  null,
247
250
  null
248
251
  ],
249
- "mappings": "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",
252
+ "mappings": "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",
250
253
  "ignoreList": []
251
254
  }