@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sveltejs/kit",
3
- "version": "2.65.2",
3
+ "version": "2.66.0",
4
4
  "description": "SvelteKit is the fastest way to build Svelte apps",
5
5
  "keywords": [
6
6
  "framework",
@@ -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')) {
@@ -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: ({ 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
@@ -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,
@@ -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
  }
@@ -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
@@ -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.66.0';
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 = 'http:' | 'https:' | 'data:' | 'mediastream:' | 'blob:' | 'filesystem:';
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<SvelteConfig, "onwarn">): Promise<Plugin[]>;
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
 
@@ -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": ";;;;;;;;MAiCKA,IAAIA;;;;;kBAKQC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAiCZC,cAAcA;;;;;;aAMdC,cAAcA;;;;;;;;MAQrBC,aAAaA;;;;;OAKJC,YAAYA;;kBAETC,aAAaA;;;;;;MAMzBC,qBAAqBA;;;;;;;;;;;kBAWTC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA8IPC,MAAMA;;;;;;;;;;;kBAWNC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA4DPC,QAAQA;;;;;;;;kBAQRC,SAASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAylBdC,MAAMA;;;;;;;;;;;aAWNC,iBAAiBA;;;;;;;;;;;;aAYjBC,qBAAqBA;;;;;;;;;aASrBC,iBAAiBA;;;;;;;;;;aAUjBC,WAAWA;;;;;;;;;;aAUXC,UAAUA;;;;;;aAMVC,UAAUA;;;;;;aAMVC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;aA0BPC,SAASA;;;;;kBAKJC,WAAWA;;;;;;;;;;;;aAYhBC,IAAIA;;;;;;;;;;;;kBAYCC,SAASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAyHTC,eAAeA;;;;;;;;;;;;;;;;;;;;;;;;;;kBA0BfC,gBAAgBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA6CrBC,cAAcA;;kBAETC,cAAcA;;;;;;;;;;;;;;;;;;;;kBAoBdC,eAAeA;;;;;;;;;;;;;;;;;;aAkBpBC,kBAAkBA;;kBAEbC,cAAcA;;;;;;;;;;;;;;;kBAedC,eAAeA;;;;;;;;;;;;;;;kBAefC,oBAAoBA;;;;;;;;;;;;;;;;;;;;kBAoBpBC,kBAAkBA;;;;;;;;;;;;;;;;;;kBAkBlBC,cAAcA;;;;;;;;;;;;;;;;;;;;aAoBnBC,UAAUA;;;;;;;;;aASVC,cAAcA;;;;;;;;;;aAUdC,UAAUA;;;;;;;;;;;aAWVC,aAAaA;;;;;;;;;;;kBAWRC,IAAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA8CTC,YAAYA;;;;;;;;;aASZC,cAAcA;;;;;;;;;;;aAWdC,kBAAkBA;;;;;aAKlBC,oBAAoBA;;;;;;;;;;;;;;;;aAgBpBC,wBAAwBA;;;;;;;;;;;;;;;;;;aAkBxBC,eAAeA;;;;kBAIVC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA2HjBC,cAAcA;;;;;kBAKTC,cAAcA;;;;;;;;;;;;;;;;;;;;;;;kBAuBdC,eAAeA;;;;;;;;;;;;;;;cAenBC,MAAMA;;;;;;kBAMFC,iBAAiBA;;;;;;;kBAOjBC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;;aAyBhBC,UAAUA;;;;;;;kBAOLC,eAAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAkFpBC,MAAMA;;;;;;;;;;aAUNC,OAAOA;;;;;;;;;;;;;;;;aAgBPC,YAAYA;;;;;;;;;;;;kBC/yDXC,SAASA;;;;;;;;;;kBAqBTC,QAAQA;;;;;;;aDuzDTC,cAAcA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA6BTC,QAAQA;;;;;;MAMpBC,uBAAuBA;;;MAGvBC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA6BLC,mBAAmBA;;;;;MAK1BC,iBAAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAkDjBC,sBAAsBA;;;;;;;;;;;MAWtBC,WAAWA;MACXC,eAAeA;;;;;;aAMRC,oBAAoBA;;MAE3BC,MAAMA;;;;;;;;;;;;;;;;;;;aAmBCC,eAAeA;;;;;;;;;;;;;;MActBC,wBAAwBA;;;;;MAKxBC,YAAYA;;;;;;;;;;;;;;;;;;MAkBZC,oBAAoBA;;;;;;;;;;;;;;;aAebC,gBAAgBA;;;;;;;;;;;;;;;;;;;;;MAqBvBC,mBAAmBA;;;;MAInBC,UAAUA;;kBAEEC,eAAeA;;;;kBAIfC,eAAeA;;;;;;;MAO3BC,SAASA;;;;;;;;;;;;;aAaFC,YAAYA;;;;;;;;;;;;;;;;;;kBAkBPC,eAAeA;;;;;;;;aAQpBC,UAAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA2DVC,aAAaA;;;;;;;;aAQbC,iBAAiBA;;;;;;;aAOjBC,cAAcA;;;;;;;;;;;;;;;;;;aAkBdC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAqCXC,eAAeA;;;;;;;;;;aAUfC,mBAAmBA;;;;;aAKnBC,uBAAuBA;;;;;;;;;;;;;;;;aAgBvBC,mBAAmBA;;;;;;;;;;;aAWnBC,uBAAuBA;;;;;;;;kBAQlBC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;WE7xEZC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAkDZC,GAAGA;;;;;;;;;;;;;;;;;;;;;WAqBHC,aAAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAmElBC,UAAUA;;WAELC,MAAMA;;;;;;;;;MASXC,YAAYA;;WAEPC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAmCXC,yBAAyBA;;;;;;;;;;WAUzBC,yBAAyBA;;;;WAIzBC,sCAAsCA;;;;WAItCC,4BAA4BA;;;;MAIjCC,8BAA8BA;MAC9BC,8BAA8BA;MAC9BC,iCAAiCA;;;;;MAKjCC,2CAA2CA;;;;;;aAM3CC,eAAeA;;WAIVC,cAAcA;;;;;WAKdC,YAAYA;;;;;;;MAOjBC,aAAaA;;MAEbC,WAAWA;;;;;;;;MAQXC,KAAKA;WCrMAC,KAAKA;;;;;;WAeLC,SAASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAgITC,YAAYA;;;;;;;;;;;;;WAkBZC,QAAQA;;;;;;;;;;;;;;;;MA+BbC,iBAAiBA;;;;;;;;;WAWZC,UAAUA;;;;;;;;;;;;;WAaVC,SAASA;;;;;;;;;;;;;;;;;;;;;;;;;WAyJTC,YAAYA;;;;;;;;;;;;;;;;;;;;MAoBjBC,kBAAkBA;;WAEbC,aAAaA;;;;;;;;;;;WAWbC,UAAUA;;;;;;;;;;;WAWVC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA4BZC,aAAaA;;WA+BRC,eAAeA;;;;;;MAMpBC,uBAAuBA;;MAGvBC,WAAWA;;;;;;;;WAQNC,QAAQA;;;;;;;;;WASRC,cAAcA;;;;;;;;;MAqDnBC,eAAeA;;;;;MAKfC,kBAAkBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBC3gBdC,WAAWA;;;;;;;;;;;;;;;;;;;iBAsBXC,QAAQA;;;;;iBAiBRC,UAAUA;;;;;;iBASVC,IAAIA;;;;;;iBA4BJC,IAAIA;;;;;;;;;;;;;;;;iBAkDJC,eAAeA;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+BfC,OAAOA;;;;;;iBAYPC,iBAAiBA;;;;;;;;;;;;;;iBAmBjBC,YAAYA;;;;;;;MClRvBC,eAAeA;;MAERC,WAAWA;;;;;;;;;cCFVC,OAAOA;;;;;;;;;;;;;;;;OCEPC,wBAAwBA;;;;;;;;;;;iBCMrBC,aAAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBCoEbC,QAAQA;;;;;;iBCyCFC,UAAUA;;;;;;iBAgDVC,WAAWA;;;;;iBAwEjBC,oBAAoBA;;;;;;;;;;;iBC9NpBC,gBAAgBA;;;;;;;;;;;;;iBCkIVC,SAASA;;;;;;;;;cCjJlBC,OAAOA;;;;;cAKPC,GAAGA;;;;;cAKHC,QAAQA;;;;;cAKRC,OAAOA;;;;;;;;;cCfPH,OAAOA;;;;;cAKPC,GAAGA;;;;;cAKHC,QAAQA;;;;;cAKRC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;iBCaJC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;iBAgDXC,OAAOA;;;;;;;iBCk6EDC,WAAWA;;;;;;;;;;;iBAhVjBC,aAAaA;;;;;;;;;;;;iBAiBbC,cAAcA;;;;;;;;;;iBAedC,UAAUA;;;;;iBASVC,qBAAqBA;;;;;;;;;;iBA8BrBC,IAAIA;;;;;;;;;;;;;;;;;;;;;;;;;iBAsCJC,UAAUA;;;;iBA0BVC,aAAaA;;;;;iBAebC,UAAUA;;;;;;;;;;;;;;iBAqBJC,WAAWA;;;;;;;;;;;;;;;;;;iBAoCXC,WAAWA;;;;;iBAwCjBC,SAASA;;;;;iBA+CTC,YAAYA;Md5yEhB1E,YAAYA;;;;;;;;;;;;;;Ye/Ib2E,IAAIA;;;;;;;;;YASJC,MAAMA;;;;;iBAKDC,YAAYA;;;MCnBvBC,iBAAiBA;;;;;;MAMVC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;;;iBCWPC,KAAKA;;;;;;;;;;;;;;;;;;;;;iBA6BLC,OAAOA;;;;;;;;;;;;;;;;;;;iBAmCDC,KAAKA;;;;;;;;;;;;;;;;;;;;;;;iBCtEXC,IAAIA;;;;;;;;iBCUJC,eAAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MlB8TnBC,qCAAqCA;;;;;;;;MA6LrCC,8BAA8BA;MD5X9BtF,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;coB1GXuF,IAAIA;;;;;cAQJC,UAAUA;;;;;;;;;;;cAMVC,OAAOA;;;;;;;;;iBCrDPC,SAASA;;;;;;;;;;;;;;;cAyBTH,IAAIA;;;;;;;;;;cAiBJC,UAAUA;;;;;;;;cAeVC,OAAOA",
250
+ "mappings": "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",
250
251
  "ignoreList": []
251
252
  }