@sveltejs/kit 2.66.0 → 2.68.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.66.0",
3
+ "version": "2.68.0",
4
4
  "description": "SvelteKit is the fastest way to build Svelte apps",
5
5
  "keywords": [
6
6
  "framework",
@@ -44,7 +44,7 @@
44
44
  "svelte": "^5.56.3",
45
45
  "typescript": "^5.3.3",
46
46
  "vite": "^6.4.3",
47
- "vitest": "^4.1.7"
47
+ "vitest": "^4.1.8"
48
48
  },
49
49
  "peerDependencies": {
50
50
  "@opentelemetry/api": "^1.0.0",
@@ -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",
@@ -281,6 +281,20 @@ export 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
 
@@ -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
 
@@ -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"
@@ -1235,14 +1248,24 @@ export interface NavigationTarget<
1235
1248
  /**
1236
1249
  * - `enter`: The app has hydrated/started
1237
1250
  * - `form`: The user submitted a `<form method="GET">`
1251
+ * - `goto`: Navigation was triggered by a `goto(...)` call or a redirect
1238
1252
  * - `leave`: The app is being left either because the tab is being closed or a navigation to a different document is occurring
1239
1253
  * - `link`: Navigation was triggered by a link click
1240
- * - `goto`: Navigation was triggered by a `goto(...)` call or a redirect
1241
1254
  * - `popstate`: Navigation was triggered by back/forward navigation
1242
1255
  */
1243
1256
  export type NavigationType = 'enter' | 'form' | 'leave' | 'link' | 'goto' | 'popstate';
1244
1257
 
1245
1258
  export interface NavigationBase {
1259
+ /**
1260
+ * The type of navigation:
1261
+ * - `enter`: The app has hydrated/started
1262
+ * - `form`: The user submitted a `<form method="GET">`
1263
+ * - `goto`: Navigation was triggered by a `goto(...)` call or a redirect
1264
+ * - `leave`: The app is being left either because the tab is being closed or a navigation to a different document is occurring
1265
+ * - `link`: Navigation was triggered by a link click
1266
+ * - `popstate`: Navigation was triggered by back/forward navigation
1267
+ */
1268
+ type: NavigationType;
1246
1269
  /**
1247
1270
  * Where navigation was triggered from
1248
1271
  */
@@ -1262,11 +1285,10 @@ export interface NavigationBase {
1262
1285
  complete: Promise<void>;
1263
1286
  }
1264
1287
 
1288
+ /**
1289
+ * The navigation that occurs when the app starts/hydrates
1290
+ */
1265
1291
  export interface NavigationEnter extends NavigationBase {
1266
- /**
1267
- * The type of navigation:
1268
- * - `enter`: The app has hydrated/started
1269
- */
1270
1292
  type: 'enter';
1271
1293
 
1272
1294
  /**
@@ -1282,11 +1304,10 @@ export interface NavigationEnter extends NavigationBase {
1282
1304
 
1283
1305
  export type NavigationExternal = NavigationGoto | NavigationLeave;
1284
1306
 
1307
+ /**
1308
+ * A navigation triggered by a `goto(...)` call or a redirect
1309
+ */
1285
1310
  export interface NavigationGoto extends NavigationBase {
1286
- /**
1287
- * The type of navigation:
1288
- * - `goto`: Navigation was triggered by a `goto(...)` call or a redirect
1289
- */
1290
1311
  type: 'goto';
1291
1312
 
1292
1313
  // TODO 3.0 remove this property, so that it only exists when type is 'popstate'
@@ -1297,11 +1318,10 @@ export interface NavigationGoto extends NavigationBase {
1297
1318
  delta?: undefined;
1298
1319
  }
1299
1320
 
1321
+ /**
1322
+ * A navigation triggered by the tab being closed, or the user navigating to a different document
1323
+ */
1300
1324
  export interface NavigationLeave extends NavigationBase {
1301
- /**
1302
- * The type of navigation:
1303
- * - `leave`: The app is being left either because the tab is being closed or a navigation to a different document is occurring
1304
- */
1305
1325
  type: 'leave';
1306
1326
 
1307
1327
  // TODO 3.0 remove this property, so that it only exists when type is 'popstate'
@@ -1312,11 +1332,10 @@ export interface NavigationLeave extends NavigationBase {
1312
1332
  delta?: undefined;
1313
1333
  }
1314
1334
 
1335
+ /**
1336
+ * A navigation triggered by a `<form method="GET">`
1337
+ */
1315
1338
  export interface NavigationFormSubmit extends NavigationBase {
1316
- /**
1317
- * The type of navigation:
1318
- * - `form`: The user submitted a `<form method="GET">`
1319
- */
1320
1339
  type: 'form';
1321
1340
 
1322
1341
  /**
@@ -1332,11 +1351,10 @@ export interface NavigationFormSubmit extends NavigationBase {
1332
1351
  delta?: undefined;
1333
1352
  }
1334
1353
 
1354
+ /**
1355
+ * A navigation triggered by back/forward navigation
1356
+ */
1335
1357
  export interface NavigationPopState extends NavigationBase {
1336
- /**
1337
- * The type of navigation:
1338
- * - `popstate`: Navigation was triggered by back/forward navigation
1339
- */
1340
1358
  type: 'popstate';
1341
1359
 
1342
1360
  /**
@@ -1350,11 +1368,10 @@ export interface NavigationPopState extends NavigationBase {
1350
1368
  event: PopStateEvent;
1351
1369
  }
1352
1370
 
1371
+ /**
1372
+ * A navigation triggered by a link click
1373
+ */
1353
1374
  export interface NavigationLink extends NavigationBase {
1354
- /**
1355
- * The type of navigation:
1356
- * - `link`: Navigation was triggered by a link click
1357
- */
1358
1375
  type: 'link';
1359
1376
 
1360
1377
  /**
@@ -2109,7 +2126,7 @@ type RecursiveFormFields = RemoteFormFieldContainer<any> & {
2109
2126
  type MaybeArray<T> = T | T[];
2110
2127
 
2111
2128
  export interface RemoteFormInput {
2112
- [key: string]: MaybeArray<string | number | boolean | File | RemoteFormInput>;
2129
+ [key: string]: MaybeArray<string | number | boolean | File | RemoteFormInput> | undefined;
2113
2130
  }
2114
2131
 
2115
2132
  export interface RemoteFormIssue {
@@ -2155,6 +2172,24 @@ export interface ValidationError {
2155
2172
  issues: StandardSchemaV1.Issue[];
2156
2173
  }
2157
2174
 
2175
+ /**
2176
+ * The form instance as received inside an `enhance` callback. See [Remote functions](https://svelte.dev/docs/kit/remote-functions#form) for full documentation.
2177
+ */
2178
+ export type RemoteFormEnhanceInstance<
2179
+ Input extends RemoteFormInput | void = RemoteFormInput | void,
2180
+ Output = any
2181
+ > = Omit<RemoteForm<Input, Output>, 'enhance' | 'element'> & {
2182
+ readonly element: HTMLFormElement;
2183
+ };
2184
+
2185
+ /**
2186
+ * The callback passed to a remote form's `enhance` method. See [Remote functions](https://svelte.dev/docs/kit/remote-functions#form) for full documentation.
2187
+ */
2188
+ export type RemoteFormEnhanceCallback<
2189
+ Input extends RemoteFormInput | void = RemoteFormInput | void,
2190
+ Output = any
2191
+ > = (form: RemoteFormEnhanceInstance<Input, Output>) => MaybePromise<void>;
2192
+
2158
2193
  /**
2159
2194
  * The type of a remote `form` function. See [Remote functions](https://svelte.dev/docs/kit/remote-functions#form) for full documentation.
2160
2195
  */
@@ -2171,13 +2206,7 @@ export type RemoteForm<Input extends RemoteFormInput | void, Output> = {
2171
2206
  updates: (...updates: RemoteQueryUpdate[]) => Promise<boolean>;
2172
2207
  };
2173
2208
  /** Use the `enhance` method to influence what happens when the form is submitted. */
2174
- enhance(
2175
- callback: (
2176
- form: Omit<RemoteForm<Input, Output>, 'enhance' | 'element'> & {
2177
- readonly element: HTMLFormElement;
2178
- }
2179
- ) => MaybePromise<void>
2180
- ): {
2209
+ enhance(callback: RemoteFormEnhanceCallback<Input, Output>): {
2181
2210
  method: 'POST';
2182
2211
  action: string;
2183
2212
  [attachment: symbol]: (node: HTMLFormElement) => void;
@@ -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
@@ -1147,9 +1147,9 @@ async function kit({ svelte_config }) {
1147
1147
 
1148
1148
  // we must reference Vite 8 options conditionally. Otherwise, older Vite
1149
1149
  // versions throw an error about unknown config options
1150
- if (is_rolldown && new_config?.build?.rollupOptions?.output) {
1150
+ if (is_rolldown && !split && new_config.build?.rollupOptions?.output) {
1151
1151
  // @ts-ignore only available in Vite 8
1152
- new_config.build.rollupOptions.output.codeSplitting = split;
1152
+ new_config.build.rollupOptions.output.codeSplitting = false;
1153
1153
  }
1154
1154
  } else {
1155
1155
  new_config = {
@@ -8,8 +8,8 @@ import { get_cache } from './shared.js';
8
8
  import { refresh } from './query.js';
9
9
 
10
10
  /**
11
- * In the context of a remote `command` or `form` request, returns an iterable
12
- * of `{ arg, query }` entries for the refreshes requested by the client, up to
11
+ * Inside a remote `command` or `form` callback, returns an iterable
12
+ * of `{ arg, query }` entries for the query instances the client asked to refresh, up to
13
13
  * the supplied `limit`. Each `query` is a `RemoteQuery` bound to the original
14
14
  * client-side cache key, so `refresh()` / `set()` propagate correctly even when
15
15
  * the query's schema transforms the input. `arg` is the *validated* argument,
@@ -18,6 +18,8 @@ import { refresh } from './query.js';
18
18
  *
19
19
  * Arguments that fail validation or exceed `limit` are recorded as failures in
20
20
  * the response to the client.
21
+ * See [Client-requested refreshes](https://svelte.dev/docs/kit/remote-functions#Single-flight-mutations-Client-requested-refreshes)
22
+ * for usage in a remote `command` or `form`.
21
23
  *
22
24
  * @example
23
25
  * ```ts
@@ -54,14 +56,16 @@ import { refresh } from './query.js';
54
56
  * @returns {QueryRequestedResult<Validated, Output>}
55
57
  */
56
58
  /**
57
- * In the context of a remote `command` or `form` request, returns an iterable
58
- * of `{ arg, query }` entries for the reconnects requested by the client, up to
59
+ * Inside a remote `command` or `form` callback, returns an iterable
60
+ * of `{ arg, query }` entries for the live query instances the client asked to reconnect, up to
59
61
  * the supplied `limit`. Each `query` is a `RemoteLiveQuery` bound to the original
60
62
  * client-side cache key, so `reconnect()` propagates correctly even when
61
63
  * the query's schema transforms the input. `arg` is the *validated* argument.
62
64
  *
63
65
  * Arguments that fail validation or exceed `limit` are recorded as failures in
64
66
  * the response to the client.
67
+ * See [Client-requested refreshes](https://svelte.dev/docs/kit/remote-functions#Single-flight-mutations-Client-requested-refreshes)
68
+ * for usage in a remote `command` or `form`.
65
69
  *
66
70
  * @example
67
71
  * ```ts
@@ -90,8 +90,6 @@ const snapshots = storage.get(SNAPSHOT_KEY) ?? {};
90
90
  if (DEV && BROWSER) {
91
91
  let warned = false;
92
92
 
93
- const current_module_url = import.meta.url.split('?')[0]; // remove query params that vite adds to the URL when it is loaded from node_modules
94
-
95
93
  const warn = () => {
96
94
  if (warned) return;
97
95
 
@@ -100,9 +98,13 @@ if (DEV && BROWSER) {
100
98
  let stack = new Error().stack?.split('\n');
101
99
  if (!stack) return;
102
100
  if (!stack[0].includes('https:') && !stack[0].includes('http:')) stack = stack.slice(1); // Chrome includes the error message in the stack
103
- stack = stack.slice(2); // remove `warn` and the place where `warn` was called
104
- // Can be falsy if was called directly from an anonymous function
105
- if (stack[0]?.includes(current_module_url)) return;
101
+
102
+ // skip over `warn` and the place where `warn` was called
103
+ const frame = stack[2];
104
+
105
+ // ignore calls that happen inside dependencies, including SvelteKit.
106
+ // `frame` can be falsy if we came from an anonymous function
107
+ if (frame?.includes('node_modules')) return;
106
108
 
107
109
  warned = true;
108
110
 
@@ -163,7 +165,8 @@ function clear_onward_history(current_history_index, current_navigation_index) {
163
165
  * Returns a `Promise` that never resolves (to prevent any
164
166
  * subsequent work, e.g. history manipulation, from happening)
165
167
  * @param {URL} url
166
- * @param {boolean} [replace] If `true`, will replace the current `history` entry rather than creating a new one with `pushState`
168
+ * @param {boolean} [replace] if `true`, will replace the current `history` entry rather than creating a new one with `pushState`
169
+ * @returns {Promise<any>} a promise that never resolves
167
170
  */
168
171
  function native_navigation(url, replace = false) {
169
172
  if (replace) {
@@ -301,6 +304,7 @@ let token;
301
304
  * If a preload token is in the set and the preload errors, the error
302
305
  * handling logic (for example reloading) is skipped.
303
306
  */
307
+ /** @type {Set<{}>} */
304
308
  const preload_tokens = new Set();
305
309
 
306
310
  /** @type {Promise<void> | null} */
@@ -527,6 +531,7 @@ function persist_state() {
527
531
  * @param {{ replaceState?: boolean; noScroll?: boolean; keepFocus?: boolean; invalidateAll?: boolean; invalidate?: Array<string | URL | ((url: URL) => boolean)>; state?: Record<string, any> }} options
528
532
  * @param {number} redirect_count
529
533
  * @param {{}} [nav_token]
534
+ * @returns {Promise<void>}
530
535
  */
531
536
  export async function _goto(url, options, redirect_count, nav_token) {
532
537
  /** @type {Set<string>} */
@@ -1167,9 +1172,19 @@ function preload_error({ error, url, route, params }) {
1167
1172
  }
1168
1173
 
1169
1174
  /**
1170
- * @param {import('./types.js').NavigationIntent & { preload?: {} }} intent
1175
+ * @overload
1176
+ * @param {import('./types.js').NavigationIntent} intent
1177
+ * @returns {Promise<import('./types.js').NavigationResult | undefined>}
1178
+ */
1179
+ /**
1180
+ * @overload
1181
+ * @param {import('./types.js').NavigationIntent & { preload: {} }} intent
1171
1182
  * @returns {Promise<import('./types.js').NavigationResult>}
1172
1183
  */
1184
+ /**
1185
+ * @param {import('./types.js').NavigationIntent & { preload?: {} }} intent
1186
+ * @returns {Promise<import('./types.js').NavigationResult | undefined>}
1187
+ */
1173
1188
  async function load_route({ id, invalidating, url, params, route, preload }) {
1174
1189
  if (load_cache?.id === id) {
1175
1190
  // the preload becomes the real navigation
@@ -1225,7 +1240,7 @@ async function load_route({ id, invalidating, url, params, route, preload }) {
1225
1240
  } catch (error) {
1226
1241
  const handled_error = await handle_error(error, { url, params, route: { id } });
1227
1242
 
1228
- if (preload_tokens.has(preload)) {
1243
+ if (preload && preload_tokens.has(preload)) {
1229
1244
  return preload_error({ error: handled_error, url, params, route });
1230
1245
  }
1231
1246
 
@@ -1315,7 +1330,7 @@ async function load_route({ id, invalidating, url, params, route, preload }) {
1315
1330
  };
1316
1331
  }
1317
1332
 
1318
- if (preload_tokens.has(preload)) {
1333
+ if (preload && preload_tokens.has(preload)) {
1319
1334
  return preload_error({
1320
1335
  error: await handle_error(err, { params, url, route: { id: route.id } }),
1321
1336
  url,
@@ -1418,7 +1433,7 @@ async function load_nearest_error_page(i, branch, errors) {
1418
1433
  * url: URL;
1419
1434
  * route: { id: string | null }
1420
1435
  * }} opts
1421
- * @returns {Promise<import('./types.js').NavigationFinished>}
1436
+ * @returns {Promise<import('./types.js').NavigationFinished | undefined>} returns `undefined` in case of a redirect
1422
1437
  */
1423
1438
  async function load_root_error_page({ status, error, url, route }) {
1424
1439
  /** @type {Record<string, string>} */
@@ -1444,11 +1459,15 @@ async function load_root_error_page({ status, error, url, route }) {
1444
1459
  }
1445
1460
 
1446
1461
  server_data_node = server_data.nodes[0] ?? null;
1447
- } catch {
1462
+ } catch (e) {
1448
1463
  // at this point we have no choice but to fall back to the server, if it wouldn't
1449
- // bring us right back here, turning this into an endless loop
1450
- if (url.origin !== origin || url.pathname !== location.pathname || hydrated) {
1451
- await native_navigation(url);
1464
+ // bring us right back here, turning this into an endless loop.
1465
+ // if __data.json returned 404, the route doesn't exist don't reload or we loop
1466
+ if (
1467
+ !(e instanceof HttpError && e.status === 404) &&
1468
+ (url.origin !== origin || url.pathname !== location.pathname || hydrated)
1469
+ ) {
1470
+ return await native_navigation(url);
1452
1471
  }
1453
1472
  }
1454
1473
  }
@@ -1483,11 +1502,14 @@ async function load_root_error_page({ status, error, url, route }) {
1483
1502
  route: null
1484
1503
  });
1485
1504
  } catch (error) {
1505
+ // client-side navigation if the root layout loader throws a redirect while
1506
+ // rendering the default error page
1486
1507
  if (error instanceof Redirect) {
1487
- // @ts-expect-error TODO investigate this
1488
- return _goto(new URL(error.location, location.href), {}, 0);
1508
+ await _goto(new URL(error.location, location.href), {}, 0);
1509
+ return;
1489
1510
  }
1490
1511
 
1512
+ // otherwise, render the static error page
1491
1513
  const error_template = await app.get_error_template();
1492
1514
  const handled = await handle_error(error, { url, params, route });
1493
1515
  const message = String(handled?.message ?? '')
@@ -1685,6 +1707,7 @@ function _before_navigate({ url, type, intent, delta, event, scroll }) {
1685
1707
  * block?: () => void;
1686
1708
  * event?: Event
1687
1709
  * }} opts
1710
+ * @returns {Promise<void>}
1688
1711
  */
1689
1712
  async function navigate({
1690
1713
  type,
@@ -1785,9 +1808,11 @@ async function navigate({
1785
1808
  // abort if user navigated during update
1786
1809
  if (token !== nav_token) {
1787
1810
  nav.reject(new Error('navigation aborted'));
1788
- return false;
1811
+ return;
1789
1812
  }
1790
1813
 
1814
+ if (!navigation_result) return;
1815
+
1791
1816
  if (navigation_result.type === 'redirect') {
1792
1817
  // whatwg fetch spec https://fetch.spec.whatwg.org/#http-redirect-fetch says to error after 20 redirects
1793
1818
  if (redirect_count < 20) {
@@ -1817,12 +1842,14 @@ async function navigate({
1817
1842
  url,
1818
1843
  route: { id: null }
1819
1844
  });
1845
+
1846
+ if (!navigation_result) return;
1820
1847
  } else if (/** @type {number} */ (navigation_result.props.page.status) >= 400) {
1821
1848
  const updated = await stores.updated.check();
1822
1849
  if (updated) {
1823
1850
  // Before reloading, try to update the service worker if it exists
1824
1851
  await update_service_worker();
1825
- await native_navigation(url, replace_state);
1852
+ return await native_navigation(url, replace_state);
1826
1853
  }
1827
1854
  }
1828
1855
 
@@ -1961,7 +1988,7 @@ async function navigate({
1961
1988
  if (token !== nav_token) {
1962
1989
  // a new navigation happened while we were waiting for the DOM to update, so abort
1963
1990
  nav.reject(new Error('navigation aborted'));
1964
- return false;
1991
+ return;
1965
1992
  }
1966
1993
 
1967
1994
  // Check for async rendering error
@@ -2032,7 +2059,7 @@ async function navigate({
2032
2059
  * @param {App.Error} error
2033
2060
  * @param {number} status
2034
2061
  * @param {boolean} [replace_state]
2035
- * @returns {Promise<import('./types.js').NavigationFinished>}
2062
+ * @returns {Promise<import('./types.js').NavigationFinished | undefined>}
2036
2063
  */
2037
2064
  async function server_fallback(url, route, error, status, replace_state) {
2038
2065
  if (url.origin === origin && url.pathname === location.pathname && !hydrated) {
@@ -2963,6 +2990,7 @@ function _start_router() {
2963
2990
  /**
2964
2991
  * @param {HTMLElement} target
2965
2992
  * @param {import('./types.js').HydrateOptions} opts
2993
+ * @returns {Promise<void>}
2966
2994
  */
2967
2995
  async function _hydrate(
2968
2996
  target,
@@ -3049,8 +3077,7 @@ async function _hydrate(
3049
3077
  if (error instanceof Redirect) {
3050
3078
  // this is a real edge case — `load` would need to return
3051
3079
  // a redirect but only in the browser
3052
- await native_navigation(new URL(error.location, location.href));
3053
- return;
3080
+ return await native_navigation(new URL(error.location, location.href));
3054
3081
  }
3055
3082
 
3056
3083
  result = await load_root_error_page({
@@ -3064,6 +3091,10 @@ async function _hydrate(
3064
3091
  hydrate = false;
3065
3092
  }
3066
3093
 
3094
+ // Exit early when we encounter a redirect while loading the root error page.
3095
+ // In this case, `initialize` will be called later on
3096
+ if (!result) return;
3097
+
3067
3098
  if (result.props.page) {
3068
3099
  result.props.page.state = {};
3069
3100
  }
@@ -94,7 +94,8 @@ export function form(id) {
94
94
  let enhance_callback = async (instance) => {
95
95
  if (await instance.submit()) {
96
96
  await tick();
97
- instance.element.reset();
97
+ // We call reset from the prototype to avoid DOM clobbering
98
+ HTMLFormElement.prototype.reset.call(instance.element);
98
99
  }
99
100
  };
100
101
 
@@ -109,6 +110,9 @@ export function form(id) {
109
110
  /** @type {InternalRemoteFormIssue[] | null} */
110
111
  let unread_issues = null;
111
112
 
113
+ /** @type {string | null} */
114
+ let previous_submitter_name = null;
115
+
112
116
  /**
113
117
  * In dev, warn if there are validation issues going unread
114
118
  */
@@ -401,6 +405,29 @@ export function form(id) {
401
405
 
402
406
  const form_data = new FormData(form, event.submitter);
403
407
 
408
+ if (
409
+ previous_submitter_name !== null &&
410
+ !Array.from(form_data.keys()).map(strip_prefix).includes(previous_submitter_name)
411
+ ) {
412
+ // Strip any `n:`/`b:` type prefix before clearing, otherwise
413
+ // `set_nested_value` would coerce `undefined` to `NaN`/`false`
414
+ // instead of clearing the previously-submitted value.
415
+ set_nested_value(input, previous_submitter_name, undefined);
416
+ }
417
+
418
+ if (event.submitter) {
419
+ const name = event.submitter.getAttribute('name');
420
+ const value = /** @type {any} */ (event.submitter).value;
421
+
422
+ if (name !== null && value !== undefined) {
423
+ set_nested_value(input, name, value);
424
+ }
425
+
426
+ previous_submitter_name = strip_prefix(name);
427
+ } else {
428
+ previous_submitter_name = null;
429
+ }
430
+
404
431
  if (DEV) {
405
432
  validate_form_data(form_data, clone(form).enctype);
406
433
  }
@@ -503,7 +530,7 @@ export function form(id) {
503
530
  );
504
531
  }
505
532
 
506
- name = name.replace(/^[nb]:/, '');
533
+ name = strip_prefix(name);
507
534
 
508
535
  touched[name] = true;
509
536
  };
@@ -769,3 +796,13 @@ function validate_form_data(form_data, enctype) {
769
796
  }
770
797
  }
771
798
  }
799
+
800
+ /**
801
+ * Remove the `n:` or `b:` prefix from a field name
802
+ * @template {string | null} T
803
+ * @param {T} name
804
+ * @returns {T}
805
+ */
806
+ function strip_prefix(name) {
807
+ return /** @type {T} */ (name && name.replace(/^[nb]:/, ''));
808
+ }
@@ -42,10 +42,6 @@ export function convert_formdata(data) {
42
42
 
43
43
  if (is_array) key = key.slice(0, -2);
44
44
 
45
- if (values.length > 1 && !is_array) {
46
- throw new Error(`Form cannot contain duplicated keys — "${key}" has ${values.length} values`);
47
- }
48
-
49
45
  // an empty `<input type="file">` will submit a non-existent file, bizarrely
50
46
  values = values.filter(
51
47
  (entry) => typeof entry === 'string' || entry.name !== '' || entry.size > 0
@@ -60,6 +56,10 @@ export function convert_formdata(data) {
60
56
  values = values.map((v) => v === 'on');
61
57
  }
62
58
 
59
+ if (values.length > 1 && !is_array) {
60
+ throw new Error(`Form cannot contain duplicated keys — "${key}" has ${values.length} values`);
61
+ }
62
+
63
63
  set_nested_value(result, key, is_array ? values : values[0]);
64
64
  }
65
65
 
@@ -607,6 +607,34 @@ function get_type_prefix(field_type, is_array, input_value) {
607
607
  return '';
608
608
  }
609
609
 
610
+ /**
611
+ * A deep-clone implementation specifically for form data, where
612
+ * we don't need to worry about cycles and whatnot
613
+ * @param {any} value
614
+ * @returns {any}
615
+ */
616
+ function deep_clone(value) {
617
+ if (value !== null && typeof value === 'object') {
618
+ if (value instanceof File) {
619
+ return value;
620
+ }
621
+
622
+ if (Array.isArray(value)) {
623
+ return value.map(deep_clone);
624
+ }
625
+
626
+ /** @type {Record<string, any>} */
627
+ const clone = {};
628
+ for (const key of Object.keys(value)) {
629
+ clone[key] = deep_clone(value[key]);
630
+ }
631
+
632
+ return clone;
633
+ }
634
+
635
+ return value;
636
+ }
637
+
610
638
  /**
611
639
  * Creates a proxy-based field accessor for form data
612
640
  * @param {any} target - Function or empty POJO
@@ -618,7 +646,8 @@ function get_type_prefix(field_type, is_array, input_value) {
618
646
  */
619
647
  export function create_field_proxy(target, get_input, set_input, get_issues, path = []) {
620
648
  const get_value = () => {
621
- return deep_get(get_input(), path);
649
+ const value = deep_get(get_input(), path);
650
+ return deep_clone(value);
622
651
  };
623
652
 
624
653
  return new Proxy(target, {
@@ -224,6 +224,10 @@ export interface PrerenderUnseenRoutesHandler {
224
224
  (details: { routes: string[]; message: string }): void;
225
225
  }
226
226
 
227
+ export interface PrerenderInvalidUrlHandler {
228
+ (details: { href: string; referrer: string | null; message: string }): void;
229
+ }
230
+
227
231
  export type PrerenderHttpErrorHandlerValue = 'fail' | 'warn' | 'ignore' | PrerenderHttpErrorHandler;
228
232
  export type PrerenderMissingIdHandlerValue = 'fail' | 'warn' | 'ignore' | PrerenderMissingIdHandler;
229
233
  export type PrerenderUnseenRoutesHandlerValue =
@@ -236,6 +240,11 @@ export type PrerenderEntryGeneratorMismatchHandlerValue =
236
240
  | 'warn'
237
241
  | 'ignore'
238
242
  | PrerenderEntryGeneratorMismatchHandler;
243
+ export type PrerenderInvalidUrlHandlerValue =
244
+ | 'fail'
245
+ | 'warn'
246
+ | 'ignore'
247
+ | PrerenderInvalidUrlHandler;
239
248
 
240
249
  export type PrerenderOption = boolean | 'auto';
241
250
 
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.66.0';
4
+ export const VERSION = '2.68.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"
@@ -1209,14 +1221,24 @@ declare module '@sveltejs/kit' {
1209
1221
  /**
1210
1222
  * - `enter`: The app has hydrated/started
1211
1223
  * - `form`: The user submitted a `<form method="GET">`
1224
+ * - `goto`: Navigation was triggered by a `goto(...)` call or a redirect
1212
1225
  * - `leave`: The app is being left either because the tab is being closed or a navigation to a different document is occurring
1213
1226
  * - `link`: Navigation was triggered by a link click
1214
- * - `goto`: Navigation was triggered by a `goto(...)` call or a redirect
1215
1227
  * - `popstate`: Navigation was triggered by back/forward navigation
1216
1228
  */
1217
1229
  export type NavigationType = 'enter' | 'form' | 'leave' | 'link' | 'goto' | 'popstate';
1218
1230
 
1219
1231
  export interface NavigationBase {
1232
+ /**
1233
+ * The type of navigation:
1234
+ * - `enter`: The app has hydrated/started
1235
+ * - `form`: The user submitted a `<form method="GET">`
1236
+ * - `goto`: Navigation was triggered by a `goto(...)` call or a redirect
1237
+ * - `leave`: The app is being left either because the tab is being closed or a navigation to a different document is occurring
1238
+ * - `link`: Navigation was triggered by a link click
1239
+ * - `popstate`: Navigation was triggered by back/forward navigation
1240
+ */
1241
+ type: NavigationType;
1220
1242
  /**
1221
1243
  * Where navigation was triggered from
1222
1244
  */
@@ -1236,11 +1258,10 @@ declare module '@sveltejs/kit' {
1236
1258
  complete: Promise<void>;
1237
1259
  }
1238
1260
 
1261
+ /**
1262
+ * The navigation that occurs when the app starts/hydrates
1263
+ */
1239
1264
  export interface NavigationEnter extends NavigationBase {
1240
- /**
1241
- * The type of navigation:
1242
- * - `enter`: The app has hydrated/started
1243
- */
1244
1265
  type: 'enter';
1245
1266
 
1246
1267
  /**
@@ -1256,11 +1277,10 @@ declare module '@sveltejs/kit' {
1256
1277
 
1257
1278
  export type NavigationExternal = NavigationGoto | NavigationLeave;
1258
1279
 
1280
+ /**
1281
+ * A navigation triggered by a `goto(...)` call or a redirect
1282
+ */
1259
1283
  export interface NavigationGoto extends NavigationBase {
1260
- /**
1261
- * The type of navigation:
1262
- * - `goto`: Navigation was triggered by a `goto(...)` call or a redirect
1263
- */
1264
1284
  type: 'goto';
1265
1285
 
1266
1286
  // TODO 3.0 remove this property, so that it only exists when type is 'popstate'
@@ -1271,11 +1291,10 @@ declare module '@sveltejs/kit' {
1271
1291
  delta?: undefined;
1272
1292
  }
1273
1293
 
1294
+ /**
1295
+ * A navigation triggered by the tab being closed, or the user navigating to a different document
1296
+ */
1274
1297
  export interface NavigationLeave extends NavigationBase {
1275
- /**
1276
- * The type of navigation:
1277
- * - `leave`: The app is being left either because the tab is being closed or a navigation to a different document is occurring
1278
- */
1279
1298
  type: 'leave';
1280
1299
 
1281
1300
  // TODO 3.0 remove this property, so that it only exists when type is 'popstate'
@@ -1286,11 +1305,10 @@ declare module '@sveltejs/kit' {
1286
1305
  delta?: undefined;
1287
1306
  }
1288
1307
 
1308
+ /**
1309
+ * A navigation triggered by a `<form method="GET">`
1310
+ */
1289
1311
  export interface NavigationFormSubmit extends NavigationBase {
1290
- /**
1291
- * The type of navigation:
1292
- * - `form`: The user submitted a `<form method="GET">`
1293
- */
1294
1312
  type: 'form';
1295
1313
 
1296
1314
  /**
@@ -1306,11 +1324,10 @@ declare module '@sveltejs/kit' {
1306
1324
  delta?: undefined;
1307
1325
  }
1308
1326
 
1327
+ /**
1328
+ * A navigation triggered by back/forward navigation
1329
+ */
1309
1330
  export interface NavigationPopState extends NavigationBase {
1310
- /**
1311
- * The type of navigation:
1312
- * - `popstate`: Navigation was triggered by back/forward navigation
1313
- */
1314
1331
  type: 'popstate';
1315
1332
 
1316
1333
  /**
@@ -1324,11 +1341,10 @@ declare module '@sveltejs/kit' {
1324
1341
  event: PopStateEvent;
1325
1342
  }
1326
1343
 
1344
+ /**
1345
+ * A navigation triggered by a link click
1346
+ */
1327
1347
  export interface NavigationLink extends NavigationBase {
1328
- /**
1329
- * The type of navigation:
1330
- * - `link`: Navigation was triggered by a link click
1331
- */
1332
1348
  type: 'link';
1333
1349
 
1334
1350
  /**
@@ -2083,7 +2099,7 @@ declare module '@sveltejs/kit' {
2083
2099
  type MaybeArray<T> = T | T[];
2084
2100
 
2085
2101
  export interface RemoteFormInput {
2086
- [key: string]: MaybeArray<string | number | boolean | File | RemoteFormInput>;
2102
+ [key: string]: MaybeArray<string | number | boolean | File | RemoteFormInput> | undefined;
2087
2103
  }
2088
2104
 
2089
2105
  export interface RemoteFormIssue {
@@ -2129,6 +2145,24 @@ declare module '@sveltejs/kit' {
2129
2145
  issues: StandardSchemaV1.Issue[];
2130
2146
  }
2131
2147
 
2148
+ /**
2149
+ * The form instance as received inside an `enhance` callback. See [Remote functions](https://svelte.dev/docs/kit/remote-functions#form) for full documentation.
2150
+ */
2151
+ export type RemoteFormEnhanceInstance<
2152
+ Input extends RemoteFormInput | void = RemoteFormInput | void,
2153
+ Output = any
2154
+ > = Omit<RemoteForm<Input, Output>, 'enhance' | 'element'> & {
2155
+ readonly element: HTMLFormElement;
2156
+ };
2157
+
2158
+ /**
2159
+ * The callback passed to a remote form's `enhance` method. See [Remote functions](https://svelte.dev/docs/kit/remote-functions#form) for full documentation.
2160
+ */
2161
+ export type RemoteFormEnhanceCallback<
2162
+ Input extends RemoteFormInput | void = RemoteFormInput | void,
2163
+ Output = any
2164
+ > = (form: RemoteFormEnhanceInstance<Input, Output>) => MaybePromise<void>;
2165
+
2132
2166
  /**
2133
2167
  * The type of a remote `form` function. See [Remote functions](https://svelte.dev/docs/kit/remote-functions#form) for full documentation.
2134
2168
  */
@@ -2145,13 +2179,7 @@ declare module '@sveltejs/kit' {
2145
2179
  updates: (...updates: RemoteQueryUpdate[]) => Promise<boolean>;
2146
2180
  };
2147
2181
  /** Use the `enhance` method to influence what happens when the form is submitted. */
2148
- enhance(
2149
- callback: (
2150
- form: Omit<RemoteForm<Input, Output>, 'enhance' | 'element'> & {
2151
- readonly element: HTMLFormElement;
2152
- }
2153
- ) => MaybePromise<void>
2154
- ): {
2182
+ enhance(callback: RemoteFormEnhanceCallback<Input, Output>): {
2155
2183
  method: 'POST';
2156
2184
  action: string;
2157
2185
  [attachment: symbol]: (node: HTMLFormElement) => void;
@@ -2559,6 +2587,10 @@ declare module '@sveltejs/kit' {
2559
2587
  (details: { routes: string[]; message: string }): void;
2560
2588
  }
2561
2589
 
2590
+ interface PrerenderInvalidUrlHandler {
2591
+ (details: { href: string; referrer: string | null; message: string }): void;
2592
+ }
2593
+
2562
2594
  type PrerenderHttpErrorHandlerValue = 'fail' | 'warn' | 'ignore' | PrerenderHttpErrorHandler;
2563
2595
  type PrerenderMissingIdHandlerValue = 'fail' | 'warn' | 'ignore' | PrerenderMissingIdHandler;
2564
2596
  type PrerenderUnseenRoutesHandlerValue =
@@ -2571,6 +2603,11 @@ declare module '@sveltejs/kit' {
2571
2603
  | 'warn'
2572
2604
  | 'ignore'
2573
2605
  | PrerenderEntryGeneratorMismatchHandler;
2606
+ type PrerenderInvalidUrlHandlerValue =
2607
+ | 'fail'
2608
+ | 'warn'
2609
+ | 'ignore'
2610
+ | PrerenderInvalidUrlHandler;
2574
2611
 
2575
2612
  export type PrerenderOption = boolean | 'auto';
2576
2613
 
@@ -3623,8 +3660,8 @@ declare module '$app/server' {
3623
3660
  function live<Schema extends StandardSchemaV1, Output>(schema: Schema, fn: (arg: StandardSchemaV1.InferOutput<Schema>) => RemoteLiveQueryUserFunctionReturnType<Output>): RemoteLiveQueryFunction<StandardSchemaV1.InferInput<Schema>, Output, StandardSchemaV1.InferOutput<Schema>>;
3624
3661
  }
3625
3662
  /**
3626
- * In the context of a remote `command` or `form` request, returns an iterable
3627
- * of `{ arg, query }` entries for the refreshes requested by the client, up to
3663
+ * Inside a remote `command` or `form` callback, returns an iterable
3664
+ * of `{ arg, query }` entries for the query instances the client asked to refresh, up to
3628
3665
  * the supplied `limit`. Each `query` is a `RemoteQuery` bound to the original
3629
3666
  * client-side cache key, so `refresh()` / `set()` propagate correctly even when
3630
3667
  * the query's schema transforms the input. `arg` is the *validated* argument,
@@ -3633,6 +3670,8 @@ declare module '$app/server' {
3633
3670
  *
3634
3671
  * Arguments that fail validation or exceed `limit` are recorded as failures in
3635
3672
  * the response to the client.
3673
+ * See [Client-requested refreshes](https://svelte.dev/docs/kit/remote-functions#Single-flight-mutations-Client-requested-refreshes)
3674
+ * for usage in a remote `command` or `form`.
3636
3675
  *
3637
3676
  * @example
3638
3677
  * ```ts
@@ -3663,14 +3702,16 @@ declare module '$app/server' {
3663
3702
  * */
3664
3703
  export function requested<Input, Output, Validated = Input>(query: RemoteQueryFunction<Input, Output, Validated>, limit: number): QueryRequestedResult<Validated, Output>;
3665
3704
  /**
3666
- * In the context of a remote `command` or `form` request, returns an iterable
3667
- * of `{ arg, query }` entries for the reconnects requested by the client, up to
3705
+ * Inside a remote `command` or `form` callback, returns an iterable
3706
+ * of `{ arg, query }` entries for the live query instances the client asked to reconnect, up to
3668
3707
  * the supplied `limit`. Each `query` is a `RemoteLiveQuery` bound to the original
3669
3708
  * client-side cache key, so `reconnect()` propagates correctly even when
3670
3709
  * the query's schema transforms the input. `arg` is the *validated* argument.
3671
3710
  *
3672
3711
  * Arguments that fail validation or exceed `limit` are recorded as failures in
3673
3712
  * the response to the client.
3713
+ * See [Client-requested refreshes](https://svelte.dev/docs/kit/remote-functions#Single-flight-mutations-Client-requested-refreshes)
3714
+ * for usage in a remote `command` or `form`.
3674
3715
  *
3675
3716
  * @example
3676
3717
  * ```ts
@@ -86,6 +86,8 @@
86
86
  "ExtractId",
87
87
  "InvalidField",
88
88
  "ValidationError",
89
+ "RemoteFormEnhanceInstance",
90
+ "RemoteFormEnhanceCallback",
89
91
  "RemoteForm",
90
92
  "RemoteCommand",
91
93
  "RemoteQueryUpdate",
@@ -108,10 +110,12 @@
108
110
  "PrerenderMissingIdHandler",
109
111
  "PrerenderEntryGeneratorMismatchHandler",
110
112
  "PrerenderUnseenRoutesHandler",
113
+ "PrerenderInvalidUrlHandler",
111
114
  "PrerenderHttpErrorHandlerValue",
112
115
  "PrerenderMissingIdHandlerValue",
113
116
  "PrerenderUnseenRoutesHandlerValue",
114
117
  "PrerenderEntryGeneratorMismatchHandlerValue",
118
+ "PrerenderInvalidUrlHandlerValue",
115
119
  "PrerenderOption",
116
120
  "RequestOptions",
117
121
  "RouteSegment",
@@ -247,6 +251,6 @@
247
251
  null,
248
252
  null
249
253
  ],
250
- "mappings": "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",
254
+ "mappings": "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",
251
255
  "ignoreList": []
252
256
  }