@sveltejs/kit 2.15.1 → 2.15.3

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.15.1",
3
+ "version": "2.15.3",
4
4
  "description": "SvelteKit is the fastest way to build Svelte apps",
5
5
  "keywords": [
6
6
  "framework",
@@ -21,7 +21,7 @@
21
21
  "@types/cookie": "^0.6.0",
22
22
  "cookie": "^0.6.0",
23
23
  "devalue": "^5.1.0",
24
- "esm-env": "^1.2.1",
24
+ "esm-env": "^1.2.2",
25
25
  "import-meta-resolve": "^4.1.0",
26
26
  "kleur": "^4.1.5",
27
27
  "magic-string": "^0.30.5",
@@ -585,7 +585,7 @@ function replace_ext_with_js(file_path) {
585
585
  function generate_params_type(params, outdir, config) {
586
586
  /** @param {string} matcher */
587
587
  const path_to_matcher = (matcher) =>
588
- posixify(path.relative(outdir, path.join(config.kit.files.params, matcher)));
588
+ posixify(path.relative(outdir, path.join(config.kit.files.params, matcher + '.js')));
589
589
 
590
590
  return `{ ${params
591
591
  .map(
@@ -499,11 +499,41 @@ export interface KitConfig {
499
499
  */
500
500
  preloadStrategy?: 'modulepreload' | 'preload-js' | 'preload-mjs';
501
501
  /**
502
+ * The bundle strategy option affects how your app's JavaScript and CSS files are loaded.
502
503
  * - If `'split'`, splits the app up into multiple .js/.css files so that they are loaded lazily as the user navigates around the app. This is the default, and is recommended for most scenarios.
503
504
  * - If `'single'`, creates just one .js bundle and one .css file containing code for the entire app.
504
505
  * - If `'inline'`, inlines all JavaScript and CSS of the entire app into the HTML. The result is usable without a server (i.e. you can just open the file in your browser).
505
506
  *
506
- * When using `'split'`, you can also adjust the bundling behaviour by setting [`output.experimentalMinChunkSize`](https://rollupjs.org/configuration-options/#output-experimentalminchunksize) and [`output.manualChunks`](https://rollupjs.org/configuration-options/#output-manualchunks)inside your Vite config's [`build.rollupOptions`](https://vite.dev/config/build-options.html#build-rollupoptions).
507
+ * When using `'split'`, you can also adjust the bundling behaviour by setting [`output.experimentalMinChunkSize`](https://rollupjs.org/configuration-options/#output-experimentalminchunksize) and [`output.manualChunks`](https://rollupjs.org/configuration-options/#output-manualchunks) inside your Vite config's [`build.rollupOptions`](https://vite.dev/config/build-options.html#build-rollupoptions).
508
+ *
509
+ * If you want to inline your assets, you'll need to set Vite's [`build.assetsInlineLimit`](https://vite.dev/config/build-options.html#build-assetsinlinelimit) option to an appropriate size then import your assets through Vite.
510
+ *
511
+ * ```js
512
+ * /// file: vite.config.js
513
+ * import { sveltekit } from '@sveltejs/kit/vite';
514
+ * import { defineConfig } from 'vite';
515
+ *
516
+ * export default defineConfig({
517
+ * plugins: [sveltekit()],
518
+ * build: {
519
+ * // inline all imported assets
520
+ * assetsInlineLimit: Infinity
521
+ * }
522
+ * });
523
+ * ```
524
+ *
525
+ * ```svelte
526
+ * /// file: src/routes/+layout.svelte
527
+ * <script>
528
+ * // import the asset through Vite
529
+ * import favicon from './favicon.png';
530
+ * </script>
531
+ *
532
+ * <svelte:head>
533
+ * <!-- this asset will be inlined as a base64 URL -->
534
+ * <link rel="icon" href={favicon} />
535
+ * </svelte:head>
536
+ * ```
507
537
  * @default 'split'
508
538
  * @since 2.13.0
509
539
  */
@@ -2,7 +2,7 @@ import fs from 'node:fs';
2
2
  import * as vite from 'vite';
3
3
  import { dedent } from '../../../core/sync/utils.js';
4
4
  import { s } from '../../../utils/misc.js';
5
- import { get_config_aliases, strip_virtual_prefix, get_env } from '../utils.js';
5
+ import { get_config_aliases, strip_virtual_prefix, get_env, normalize_id } from '../utils.js';
6
6
  import { create_static_module } from '../../../core/env.js';
7
7
  import { env_static_public, service_worker } from '../module_ids.js';
8
8
 
@@ -68,7 +68,8 @@ export async function build_service_worker(
68
68
  name: 'service-worker-build-virtual-modules',
69
69
  resolveId(id) {
70
70
  if (id.startsWith('$env/') || id.startsWith('$app/') || id === '$service-worker') {
71
- return `\0virtual:${id}`;
71
+ // ids with :$ don't work with reverse proxies like nginx
72
+ return `\0virtual:${id.substring(1)}`;
72
73
  }
73
74
  },
74
75
 
@@ -83,7 +84,10 @@ export async function build_service_worker(
83
84
  return create_static_module('$env/static/public', env.public);
84
85
  }
85
86
 
86
- const stripped = strip_virtual_prefix(id);
87
+ const normalized_cwd = vite.normalizePath(process.cwd());
88
+ const normalized_lib = vite.normalizePath(kit.files.lib);
89
+ const relative = normalize_id(id, normalized_lib, normalized_cwd);
90
+ const stripped = strip_virtual_prefix(relative);
87
91
  throw new Error(
88
92
  `Cannot import ${stripped} into service-worker code. Only the modules $service-worker and $env/static/public are available in service workers.`
89
93
  );
@@ -1,6 +1,6 @@
1
1
  import path from 'node:path';
2
2
  import { posixify } from '../../../utils/filesystem.js';
3
- import { strip_virtual_prefix } from '../utils.js';
3
+ import { normalize_id, strip_virtual_prefix } from '../utils.js';
4
4
  import { app_server, env_dynamic_private, env_static_private } from '../module_ids.js';
5
5
 
6
6
  const ILLEGAL_IMPORTS = new Set([env_dynamic_private, env_static_private, app_server]);
@@ -85,25 +85,3 @@ export function module_guard(context, { cwd, lib }) {
85
85
  }
86
86
  };
87
87
  }
88
-
89
- /**
90
- * Removes cwd/lib path from the start of the id
91
- * @param {string} id
92
- * @param {string} lib
93
- * @param {string} cwd
94
- */
95
- export function normalize_id(id, lib, cwd) {
96
- if (id.startsWith(lib)) {
97
- id = id.replace(lib, '$lib');
98
- }
99
-
100
- if (id.startsWith(cwd)) {
101
- id = path.relative(cwd, id);
102
- }
103
-
104
- if (id === app_server) {
105
- return '$app/server';
106
- }
107
-
108
- return posixify(id);
109
- }
@@ -15,9 +15,9 @@ import { build_server_nodes } from './build/build_server.js';
15
15
  import { build_service_worker } from './build/build_service_worker.js';
16
16
  import { assets_base, find_deps } from './build/utils.js';
17
17
  import { dev } from './dev/index.js';
18
- import { is_illegal, module_guard, normalize_id } from './graph_analysis/index.js';
18
+ import { is_illegal, module_guard } from './graph_analysis/index.js';
19
19
  import { preview } from './preview/index.js';
20
- import { get_config_aliases, get_env, strip_virtual_prefix } from './utils.js';
20
+ import { get_config_aliases, get_env, normalize_id, strip_virtual_prefix } from './utils.js';
21
21
  import { write_client_manifest } from '../../core/sync/write_client_manifest.js';
22
22
  import prerender from '../../core/postbuild/prerender.js';
23
23
  import analyse from '../../core/postbuild/analyse.js';
@@ -376,8 +376,14 @@ async function kit({ svelte_config }) {
376
376
  parsed_importer.name === parsed_service_worker.name;
377
377
 
378
378
  if (importer_is_service_worker && id !== '$service-worker' && id !== '$env/static/public') {
379
+ const normalized_cwd = vite.normalizePath(cwd);
380
+ const normalized_lib = vite.normalizePath(kit.files.lib);
379
381
  throw new Error(
380
- `Cannot import ${id} into service-worker code. Only the modules $service-worker and $env/static/public are available in service workers.`
382
+ `Cannot import ${normalize_id(
383
+ id,
384
+ normalized_lib,
385
+ normalized_cwd
386
+ )} into service-worker code. Only the modules $service-worker and $env/static/public are available in service workers.`
381
387
  );
382
388
  }
383
389
 
@@ -385,7 +391,11 @@ async function kit({ svelte_config }) {
385
391
  }
386
392
 
387
393
  // treat $env/static/[public|private] as virtual
388
- if (id.startsWith('$env/') || id.startsWith('__sveltekit/') || id === '$service-worker') {
394
+ if (id.startsWith('$env/') || id === '$service-worker') {
395
+ // ids with :$ don't work with reverse proxies like nginx
396
+ return `\0virtual:${id.substring(1)}`;
397
+ }
398
+ if (id.startsWith('__sveltekit/')) {
389
399
  return `\0virtual:${id}`;
390
400
  }
391
401
  },
@@ -1,11 +1,11 @@
1
1
  import { fileURLToPath } from 'node:url';
2
2
 
3
- export const env_static_private = '\0virtual:$env/static/private';
4
- export const env_static_public = '\0virtual:$env/static/public';
5
- export const env_dynamic_private = '\0virtual:$env/dynamic/private';
6
- export const env_dynamic_public = '\0virtual:$env/dynamic/public';
3
+ export const env_static_private = '\0virtual:env/static/private';
4
+ export const env_static_public = '\0virtual:env/static/public';
5
+ export const env_dynamic_private = '\0virtual:env/dynamic/private';
6
+ export const env_dynamic_public = '\0virtual:env/dynamic/public';
7
7
 
8
- export const service_worker = '\0virtual:$service-worker';
8
+ export const service_worker = '\0virtual:service-worker';
9
9
 
10
10
  export const sveltekit_environment = '\0virtual:__sveltekit/environment';
11
11
  export const sveltekit_paths = '\0virtual:__sveltekit/paths';
@@ -4,6 +4,14 @@ import { posixify } from '../../utils/filesystem.js';
4
4
  import { negotiate } from '../../utils/http.js';
5
5
  import { filter_private_env, filter_public_env } from '../../utils/env.js';
6
6
  import { escape_html } from '../../utils/escape.js';
7
+ import {
8
+ app_server,
9
+ env_dynamic_private,
10
+ env_dynamic_public,
11
+ env_static_private,
12
+ env_static_public,
13
+ service_worker
14
+ } from './module_ids.js';
7
15
 
8
16
  /**
9
17
  * Transforms kit.alias to a valid vite.resolve.alias array.
@@ -105,4 +113,46 @@ export function not_found(req, res, base) {
105
113
  }
106
114
  }
107
115
 
116
+ /**
117
+ * Removes cwd/lib path from the start of the id
118
+ * @param {string} id
119
+ * @param {string} lib
120
+ * @param {string} cwd
121
+ */
122
+ export function normalize_id(id, lib, cwd) {
123
+ if (id.startsWith(lib)) {
124
+ id = id.replace(lib, '$lib');
125
+ }
126
+
127
+ if (id.startsWith(cwd)) {
128
+ id = path.relative(cwd, id);
129
+ }
130
+
131
+ if (id === app_server) {
132
+ return '$app/server';
133
+ }
134
+
135
+ if (id === env_static_private) {
136
+ return '$env/static/private';
137
+ }
138
+
139
+ if (id === env_static_public) {
140
+ return '$env/static/public';
141
+ }
142
+
143
+ if (id === env_dynamic_private) {
144
+ return '$env/dynamic/private';
145
+ }
146
+
147
+ if (id === env_dynamic_public) {
148
+ return '$env/dynamic/public';
149
+ }
150
+
151
+ if (id === service_worker) {
152
+ return '$service-worker';
153
+ }
154
+
155
+ return posixify(id);
156
+ }
157
+
108
158
  export const strip_virtual_prefix = /** @param {string} id */ (id) => id.replace('\0virtual:', '');
@@ -11,7 +11,7 @@ import {
11
11
  import { BROWSER } from 'esm-env';
12
12
 
13
13
  /**
14
- * A reactive object with information about the current page, serving several use cases:
14
+ * A read-only reactive object with information about the current page, serving several use cases:
15
15
  * - retrieving the combined `data` of all pages/layouts anywhere in your component tree (also see [loading data](https://svelte.dev/docs/kit/load))
16
16
  * - retrieving the current value of the `form` prop anywhere in your component tree (also see [form actions](https://svelte.dev/docs/kit/form-actions))
17
17
  * - retrieving the page state that was set through `goto`, `pushState` or `replaceState` (also see [goto](https://svelte.dev/docs/kit/$app-navigation#goto) and [shallow routing](https://svelte.dev/docs/kit/shallow-routing))
@@ -39,7 +39,7 @@ import { BROWSER } from 'esm-env';
39
39
  export const page = BROWSER ? client_page : server_page;
40
40
 
41
41
  /**
42
- * An object representing an in-progress navigation, with `from`, `to`, `type` and (if `type === 'popstate'`) `delta` properties.
42
+ * A read-only object representing an in-progress navigation, with `from`, `to`, `type` and (if `type === 'popstate'`) `delta` properties.
43
43
  * Values are `null` when no navigation is occurring, or during server rendering.
44
44
  * @type {import('@sveltejs/kit').Navigation | { from: null, to: null, type: null, willUnload: null, delta: null, complete: null }}
45
45
  */
@@ -47,7 +47,7 @@ export const page = BROWSER ? client_page : server_page;
47
47
  export const navigating = BROWSER ? client_navigating : server_navigating;
48
48
 
49
49
  /**
50
- * A reactive value that's initially `false`. If [`version.pollInterval`](https://svelte.dev/docs/kit/configuration#version) is a non-zero value, SvelteKit will poll for new versions of the app and update `current` to `true` when it detects one. `updated.check()` will force an immediate check, regardless of polling.
50
+ * A read-only reactive value that's initially `false`. If [`version.pollInterval`](https://svelte.dev/docs/kit/configuration#version) is a non-zero value, SvelteKit will poll for new versions of the app and update `current` to `true` when it detects one. `updated.check()` will force an immediate check, regardless of polling.
51
51
  * @type {{ get current(): boolean; check(): Promise<boolean>; }}
52
52
  */
53
53
  export const updated = BROWSER ? client_updated : server_updated;
@@ -191,14 +191,18 @@ const components = [];
191
191
  /** @type {{id: string, token: {}, promise: Promise<import('./types.js').NavigationResult>} | null} */
192
192
  let load_cache = null;
193
193
 
194
- /** @type {Array<(navigation: import('@sveltejs/kit').BeforeNavigate) => void>} */
195
- const before_navigate_callbacks = [];
194
+ /**
195
+ * Note on before_navigate_callbacks, on_navigate_callbacks and after_navigate_callbacks:
196
+ * do not re-assign as some closures keep references to these Sets
197
+ */
198
+ /** @type {Set<(navigation: import('@sveltejs/kit').BeforeNavigate) => void>} */
199
+ const before_navigate_callbacks = new Set();
196
200
 
197
- /** @type {Array<(navigation: import('@sveltejs/kit').OnNavigate) => import('types').MaybePromise<(() => void) | void>>} */
198
- const on_navigate_callbacks = [];
201
+ /** @type {Set<(navigation: import('@sveltejs/kit').OnNavigate) => import('types').MaybePromise<(() => void) | void>>} */
202
+ const on_navigate_callbacks = new Set();
199
203
 
200
- /** @type {Array<(navigation: import('@sveltejs/kit').AfterNavigate) => void>} */
201
- let after_navigate_callbacks = [];
204
+ /** @type {Set<(navigation: import('@sveltejs/kit').AfterNavigate) => void>} */
205
+ const after_navigate_callbacks = new Set();
202
206
 
203
207
  /** @type {import('./types.js').NavigationState} */
204
208
  let current = {
@@ -520,7 +524,7 @@ function get_navigation_result_from_branch({ url, params, branch, status, error,
520
524
  props: {
521
525
  // @ts-ignore Somehow it's getting SvelteComponent and SvelteComponentDev mixed up
522
526
  constructors: compact(branch).map((branch_node) => branch_node.node.component),
523
- page
527
+ page: clone_page(page)
524
528
  }
525
529
  };
526
530
 
@@ -861,7 +865,10 @@ function preload_error({ error, url, route, params }) {
861
865
  params,
862
866
  branch: []
863
867
  },
864
- props: { page, constructors: [] }
868
+ props: {
869
+ page: clone_page(page),
870
+ constructors: []
871
+ }
865
872
  };
866
873
  }
867
874
 
@@ -1146,32 +1153,41 @@ async function load_root_error_page({ status, error, url, route }) {
1146
1153
  }
1147
1154
  }
1148
1155
 
1149
- const root_layout = await load_node({
1150
- loader: default_layout_loader,
1151
- url,
1152
- params,
1153
- route,
1154
- parent: () => Promise.resolve({}),
1155
- server_data_node: create_data_node(server_data_node)
1156
- });
1156
+ try {
1157
+ const root_layout = await load_node({
1158
+ loader: default_layout_loader,
1159
+ url,
1160
+ params,
1161
+ route,
1162
+ parent: () => Promise.resolve({}),
1163
+ server_data_node: create_data_node(server_data_node)
1164
+ });
1157
1165
 
1158
- /** @type {import('./types.js').BranchNode} */
1159
- const root_error = {
1160
- node: await default_error_loader(),
1161
- loader: default_error_loader,
1162
- universal: null,
1163
- server: null,
1164
- data: null
1165
- };
1166
+ /** @type {import('./types.js').BranchNode} */
1167
+ const root_error = {
1168
+ node: await default_error_loader(),
1169
+ loader: default_error_loader,
1170
+ universal: null,
1171
+ server: null,
1172
+ data: null
1173
+ };
1166
1174
 
1167
- return get_navigation_result_from_branch({
1168
- url,
1169
- params,
1170
- branch: [root_layout, root_error],
1171
- status,
1172
- error,
1173
- route: null
1174
- });
1175
+ return get_navigation_result_from_branch({
1176
+ url,
1177
+ params,
1178
+ branch: [root_layout, root_error],
1179
+ status,
1180
+ error,
1181
+ route: null
1182
+ });
1183
+ } catch (error) {
1184
+ if (error instanceof Redirect) {
1185
+ return _goto(new URL(error.location, location.href), {}, 0);
1186
+ }
1187
+
1188
+ // TODO: this falls back to the server when a server exists, but what about SPA mode?
1189
+ throw error;
1190
+ }
1175
1191
  }
1176
1192
 
1177
1193
  /**
@@ -1460,7 +1476,7 @@ async function navigate({
1460
1476
 
1461
1477
  const after_navigate = (
1462
1478
  await Promise.all(
1463
- on_navigate_callbacks.map((fn) =>
1479
+ Array.from(on_navigate_callbacks, (fn) =>
1464
1480
  fn(/** @type {import('@sveltejs/kit').OnNavigate} */ (nav.navigation))
1465
1481
  )
1466
1482
  )
@@ -1468,14 +1484,16 @@ async function navigate({
1468
1484
 
1469
1485
  if (after_navigate.length > 0) {
1470
1486
  function cleanup() {
1471
- after_navigate_callbacks = after_navigate_callbacks.filter(
1472
- // @ts-ignore
1473
- (fn) => !after_navigate.includes(fn)
1474
- );
1487
+ after_navigate.forEach((fn) => {
1488
+ after_navigate_callbacks.delete(fn);
1489
+ });
1475
1490
  }
1476
1491
 
1477
1492
  after_navigate.push(cleanup);
1478
- after_navigate_callbacks.push(...after_navigate);
1493
+
1494
+ after_navigate.forEach((fn) => {
1495
+ after_navigate_callbacks.add(fn);
1496
+ });
1479
1497
  }
1480
1498
 
1481
1499
  root.$set(navigation_result.props);
@@ -1677,7 +1695,7 @@ function setup_preload() {
1677
1695
  }
1678
1696
  }
1679
1697
 
1680
- after_navigate_callbacks.push(after_navigate);
1698
+ after_navigate_callbacks.add(after_navigate);
1681
1699
  after_navigate();
1682
1700
  }
1683
1701
 
@@ -1706,22 +1724,21 @@ function handle_error(error, event) {
1706
1724
 
1707
1725
  /**
1708
1726
  * @template {Function} T
1709
- * @param {T[]} callbacks
1727
+ * @param {Set<T>} callbacks
1710
1728
  * @param {T} callback
1711
1729
  */
1712
1730
  function add_navigation_callback(callbacks, callback) {
1713
1731
  onMount(() => {
1714
- callbacks.push(callback);
1732
+ callbacks.add(callback);
1715
1733
 
1716
1734
  return () => {
1717
- const i = callbacks.indexOf(callback);
1718
- callbacks.splice(i, 1);
1735
+ callbacks.delete(callback);
1719
1736
  };
1720
1737
  });
1721
1738
  }
1722
1739
 
1723
1740
  /**
1724
- * A lifecycle function that runs the supplied `callback` when the current component mounts, and also whenever we navigate to a new URL.
1741
+ * A lifecycle function that runs the supplied `callback` when the current component mounts, and also whenever we navigate to a URL.
1725
1742
  *
1726
1743
  * `afterNavigate` must be called during a component initialization. It remains active as long as the component is mounted.
1727
1744
  * @param {(navigation: import('@sveltejs/kit').AfterNavigate) => void} callback
@@ -1972,7 +1989,10 @@ export function pushState(url, state) {
1972
1989
  has_navigated = true;
1973
1990
 
1974
1991
  page.state = state;
1975
- root.$set({ page });
1992
+ root.$set({
1993
+ // we need to assign a new page object so that subscribers are correctly notified
1994
+ page: clone_page(page)
1995
+ });
1976
1996
 
1977
1997
  clear_onward_history(current_history_index, current_navigation_index);
1978
1998
  }
@@ -2013,7 +2033,9 @@ export function replaceState(url, state) {
2013
2033
  history.replaceState(opts, '', resolve_url(url));
2014
2034
 
2015
2035
  page.state = state;
2016
- root.$set({ page });
2036
+ root.$set({
2037
+ page: clone_page(page)
2038
+ });
2017
2039
  }
2018
2040
 
2019
2041
  /**
@@ -2064,7 +2086,7 @@ export async function applyAction(result) {
2064
2086
  // this brings Svelte's view of the world in line with SvelteKit's
2065
2087
  // after use:enhance reset the form....
2066
2088
  form: null,
2067
- page
2089
+ page: clone_page(page)
2068
2090
  });
2069
2091
 
2070
2092
  // ...so that setting the `form` prop takes effect and isn't ignored
@@ -2308,7 +2330,7 @@ function _start_router() {
2308
2330
  const state = event.state[STATES_KEY] ?? {};
2309
2331
  const url = new URL(event.state[PAGE_URL_KEY] ?? location.href);
2310
2332
  const navigation_index = event.state[NAVIGATION_INDEX];
2311
- const is_hash_change = strip_hash(location) === strip_hash(current.url);
2333
+ const is_hash_change = current.url ? strip_hash(location) === strip_hash(current.url) : false;
2312
2334
  const shallow =
2313
2335
  navigation_index === current_navigation_index && (has_navigated || is_hash_change);
2314
2336
 
@@ -2317,16 +2339,15 @@ function _start_router() {
2317
2339
  // This happens with hash links and `pushState`/`replaceState`. The
2318
2340
  // exception is if we haven't navigated yet, since we could have
2319
2341
  // got here after a modal navigation then a reload
2342
+ if (state !== page.state) {
2343
+ page.state = state;
2344
+ }
2345
+
2320
2346
  update_url(url);
2321
2347
 
2322
2348
  scroll_positions[current_history_index] = scroll_state();
2323
2349
  if (scroll) scrollTo(scroll.x, scroll.y);
2324
2350
 
2325
- if (state !== page.state) {
2326
- page.state = state;
2327
- root.$set({ page });
2328
- }
2329
-
2330
2351
  current_history_index = history_index;
2331
2352
  return;
2332
2353
  }
@@ -2409,16 +2430,7 @@ function _start_router() {
2409
2430
  */
2410
2431
  function update_url(url) {
2411
2432
  current.url = page.url = url;
2412
- stores.page.set({
2413
- data: page.data,
2414
- error: page.error,
2415
- form: page.form,
2416
- params: page.params,
2417
- route: page.route,
2418
- state: page.state,
2419
- status: page.status,
2420
- url
2421
- });
2433
+ stores.page.set(clone_page(page));
2422
2434
  stores.page.notify();
2423
2435
  }
2424
2436
  }
@@ -2759,6 +2771,28 @@ function create_navigation(current, intent, url, type) {
2759
2771
  };
2760
2772
  }
2761
2773
 
2774
+ /**
2775
+ * TODO: remove this in 3.0 when the page store is also removed
2776
+ *
2777
+ * We need to assign a new page object so that subscribers are correctly notified.
2778
+ * However, spreading `{ ...page }` returns an empty object so we manually
2779
+ * assign to each property instead.
2780
+ *
2781
+ * @param {import('@sveltejs/kit').Page} page
2782
+ */
2783
+ function clone_page(page) {
2784
+ return {
2785
+ data: page.data,
2786
+ error: page.error,
2787
+ form: page.form,
2788
+ params: page.params,
2789
+ route: page.route,
2790
+ state: page.state,
2791
+ status: page.status,
2792
+ url: page.url
2793
+ };
2794
+ }
2795
+
2762
2796
  if (DEV) {
2763
2797
  // Nasty hack to silence harmless warnings the user can do nothing about
2764
2798
  const console_warn = console.warn;
@@ -70,7 +70,10 @@ export async function render_page(event, page, options, manifest, state, resolve
70
70
  }
71
71
  }
72
72
 
73
- const should_prerender_data = nodes.some((node) => node?.server?.load);
73
+ const should_prerender_data = nodes.some(
74
+ // prerender in case of trailingSlash because the client retrieves that value from the server
75
+ (node) => node?.server?.load || node?.server?.trailingSlash !== undefined
76
+ );
74
77
  const data_pathname = add_data_suffix(event.url.pathname);
75
78
 
76
79
  // it's crucial that we do this before returning the non-SSR response, otherwise
@@ -1,5 +1,4 @@
1
- // @ts-ignore - need to publish types for sub-package imports
2
- import BROWSER from 'esm-env/browser';
1
+ import { BROWSER } from 'esm-env';
3
2
 
4
3
  const param_pattern = /^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/;
5
4
 
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.15.1';
4
+ export const VERSION = '2.15.3';
package/types/index.d.ts CHANGED
@@ -481,11 +481,41 @@ declare module '@sveltejs/kit' {
481
481
  */
482
482
  preloadStrategy?: 'modulepreload' | 'preload-js' | 'preload-mjs';
483
483
  /**
484
+ * The bundle strategy option affects how your app's JavaScript and CSS files are loaded.
484
485
  * - If `'split'`, splits the app up into multiple .js/.css files so that they are loaded lazily as the user navigates around the app. This is the default, and is recommended for most scenarios.
485
486
  * - If `'single'`, creates just one .js bundle and one .css file containing code for the entire app.
486
487
  * - If `'inline'`, inlines all JavaScript and CSS of the entire app into the HTML. The result is usable without a server (i.e. you can just open the file in your browser).
487
488
  *
488
- * When using `'split'`, you can also adjust the bundling behaviour by setting [`output.experimentalMinChunkSize`](https://rollupjs.org/configuration-options/#output-experimentalminchunksize) and [`output.manualChunks`](https://rollupjs.org/configuration-options/#output-manualchunks)inside your Vite config's [`build.rollupOptions`](https://vite.dev/config/build-options.html#build-rollupoptions).
489
+ * When using `'split'`, you can also adjust the bundling behaviour by setting [`output.experimentalMinChunkSize`](https://rollupjs.org/configuration-options/#output-experimentalminchunksize) and [`output.manualChunks`](https://rollupjs.org/configuration-options/#output-manualchunks) inside your Vite config's [`build.rollupOptions`](https://vite.dev/config/build-options.html#build-rollupoptions).
490
+ *
491
+ * If you want to inline your assets, you'll need to set Vite's [`build.assetsInlineLimit`](https://vite.dev/config/build-options.html#build-assetsinlinelimit) option to an appropriate size then import your assets through Vite.
492
+ *
493
+ * ```js
494
+ * /// file: vite.config.js
495
+ * import { sveltekit } from '@sveltejs/kit/vite';
496
+ * import { defineConfig } from 'vite';
497
+ *
498
+ * export default defineConfig({
499
+ * plugins: [sveltekit()],
500
+ * build: {
501
+ * // inline all imported assets
502
+ * assetsInlineLimit: Infinity
503
+ * }
504
+ * });
505
+ * ```
506
+ *
507
+ * ```svelte
508
+ * /// file: src/routes/+layout.svelte
509
+ * <script>
510
+ * // import the asset through Vite
511
+ * import favicon from './favicon.png';
512
+ * </script>
513
+ *
514
+ * <svelte:head>
515
+ * <!-- this asset will be inlined as a base64 URL -->
516
+ * <link rel="icon" href={favicon} />
517
+ * </svelte:head>
518
+ * ```
489
519
  * @default 'split'
490
520
  * @since 2.13.0
491
521
  */
@@ -2123,7 +2153,7 @@ declare module '$app/forms' {
2123
2153
 
2124
2154
  declare module '$app/navigation' {
2125
2155
  /**
2126
- * A lifecycle function that runs the supplied `callback` when the current component mounts, and also whenever we navigate to a new URL.
2156
+ * A lifecycle function that runs the supplied `callback` when the current component mounts, and also whenever we navigate to a URL.
2127
2157
  *
2128
2158
  * `afterNavigate` must be called during a component initialization. It remains active as long as the component is mounted.
2129
2159
  * */
@@ -2293,7 +2323,7 @@ declare module '$app/server' {
2293
2323
 
2294
2324
  declare module '$app/state' {
2295
2325
  /**
2296
- * A reactive object with information about the current page, serving several use cases:
2326
+ * A read-only reactive object with information about the current page, serving several use cases:
2297
2327
  * - retrieving the combined `data` of all pages/layouts anywhere in your component tree (also see [loading data](https://svelte.dev/docs/kit/load))
2298
2328
  * - retrieving the current value of the `form` prop anywhere in your component tree (also see [form actions](https://svelte.dev/docs/kit/form-actions))
2299
2329
  * - retrieving the page state that was set through `goto`, `pushState` or `replaceState` (also see [goto](https://svelte.dev/docs/kit/$app-navigation#goto) and [shallow routing](https://svelte.dev/docs/kit/shallow-routing))
@@ -2319,7 +2349,7 @@ declare module '$app/state' {
2319
2349
  * */
2320
2350
  export const page: import("@sveltejs/kit").Page;
2321
2351
  /**
2322
- * An object representing an in-progress navigation, with `from`, `to`, `type` and (if `type === 'popstate'`) `delta` properties.
2352
+ * A read-only object representing an in-progress navigation, with `from`, `to`, `type` and (if `type === 'popstate'`) `delta` properties.
2323
2353
  * Values are `null` when no navigation is occurring, or during server rendering.
2324
2354
  * */
2325
2355
  export const navigating: import("@sveltejs/kit").Navigation | {
@@ -2331,7 +2361,7 @@ declare module '$app/state' {
2331
2361
  complete: null;
2332
2362
  };
2333
2363
  /**
2334
- * A reactive value that's initially `false`. If [`version.pollInterval`](https://svelte.dev/docs/kit/configuration#version) is a non-zero value, SvelteKit will poll for new versions of the app and update `current` to `true` when it detects one. `updated.check()` will force an immediate check, regardless of polling.
2364
+ * A read-only reactive value that's initially `false`. If [`version.pollInterval`](https://svelte.dev/docs/kit/configuration#version) is a non-zero value, SvelteKit will poll for new versions of the app and update `current` to `true` when it detects one. `updated.check()` will force an immediate check, regardless of polling.
2335
2365
  * */
2336
2366
  export const updated: {
2337
2367
  get current(): boolean;
@@ -159,6 +159,6 @@
159
159
  null,
160
160
  null
161
161
  ],
162
- "mappings": "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",
162
+ "mappings": "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",
163
163
  "ignoreList": []
164
164
  }