@sveltejs/kit 2.2.1 → 2.3.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.2.1",
3
+ "version": "2.3.0",
4
4
  "description": "The fastest way to build Svelte apps",
5
5
  "repository": {
6
6
  "type": "git",
@@ -93,6 +93,7 @@ function process_config(config, { cwd = process.cwd() } = {}) {
93
93
  if (key === 'hooks') {
94
94
  validated.kit.files.hooks.client = path.resolve(cwd, validated.kit.files.hooks.client);
95
95
  validated.kit.files.hooks.server = path.resolve(cwd, validated.kit.files.hooks.server);
96
+ validated.kit.files.hooks.universal = path.resolve(cwd, validated.kit.files.hooks.universal);
96
97
  } else {
97
98
  // @ts-expect-error
98
99
  validated.kit.files[key] = path.resolve(cwd, validated.kit.files[key]);
@@ -123,7 +123,8 @@ const options = object(
123
123
  assets: string('static'),
124
124
  hooks: object({
125
125
  client: string(join('src', 'hooks.client')),
126
- server: string(join('src', 'hooks.server'))
126
+ server: string(join('src', 'hooks.server')),
127
+ universal: string(join('src', 'hooks'))
127
128
  }),
128
129
  lib: string(join('src', 'lib')),
129
130
  params: string(join('src', 'params')),
@@ -108,7 +108,8 @@ export function write_client_manifest(kit, manifest_data, output, metadata) {
108
108
  }
109
109
  `;
110
110
 
111
- const hooks_file = resolve_entry(kit.files.hooks.client);
111
+ const client_hooks_file = resolve_entry(kit.files.hooks.client);
112
+ const universal_hooks_file = resolve_entry(kit.files.hooks.universal);
112
113
 
113
114
  const typo = resolve_entry('src/+hooks.client');
114
115
  if (typo) {
@@ -125,7 +126,16 @@ export function write_client_manifest(kit, manifest_data, output, metadata) {
125
126
  write_if_changed(
126
127
  `${output}/app.js`,
127
128
  dedent`
128
- ${hooks_file ? `import * as client_hooks from '${relative_path(output, hooks_file)}';` : ''}
129
+ ${
130
+ client_hooks_file
131
+ ? `import * as client_hooks from '${relative_path(output, client_hooks_file)}';`
132
+ : ''
133
+ }
134
+ ${
135
+ universal_hooks_file
136
+ ? `import * as universal_hooks from '${relative_path(output, universal_hooks_file)}';`
137
+ : ''
138
+ }
129
139
 
130
140
  export { matchers } from './matchers.js';
131
141
 
@@ -139,8 +149,10 @@ export function write_client_manifest(kit, manifest_data, output, metadata) {
139
149
 
140
150
  export const hooks = {
141
151
  handleError: ${
142
- hooks_file ? 'client_hooks.handleError || ' : ''
152
+ client_hooks_file ? 'client_hooks.handleError || ' : ''
143
153
  }(({ error }) => { console.error(error) }),
154
+
155
+ reroute: ${universal_hooks_file ? 'universal_hooks.reroute || ' : ''}(() => {})
144
156
  };
145
157
 
146
158
  export { default as root } from '../root.${isSvelte5Plus() ? 'js' : 'svelte'}';
@@ -9,7 +9,8 @@ import colors from 'kleur';
9
9
 
10
10
  /**
11
11
  * @param {{
12
- * hooks: string | null;
12
+ * server_hooks: string | null;
13
+ * universal_hooks: string | null;
13
14
  * config: import('types').ValidatedConfig;
14
15
  * has_service_worker: boolean;
15
16
  * runtime_directory: string;
@@ -19,7 +20,8 @@ import colors from 'kleur';
19
20
  */
20
21
  const server_template = ({
21
22
  config,
22
- hooks,
23
+ server_hooks,
24
+ universal_hooks,
23
25
  has_service_worker,
24
26
  runtime_directory,
25
27
  template,
@@ -59,8 +61,11 @@ export const options = {
59
61
  version_hash: ${s(hash(config.kit.version.name))}
60
62
  };
61
63
 
62
- export function get_hooks() {
63
- return ${hooks ? `import(${s(hooks)})` : '{}'};
64
+ export async function get_hooks() {
65
+ return {
66
+ ${server_hooks ? `...(await import(${s(server_hooks)})),` : ''}
67
+ ${universal_hooks ? `...(await import(${s(universal_hooks)})),` : ''}
68
+ };
64
69
  }
65
70
 
66
71
  export { set_assets, set_building, set_prerendering, set_private_env, set_public_env, set_safe_public_env };
@@ -76,7 +81,8 @@ export { set_assets, set_building, set_prerendering, set_private_env, set_public
76
81
  * @param {string} output
77
82
  */
78
83
  export function write_server(config, output) {
79
- const hooks_file = resolve_entry(config.kit.files.hooks.server);
84
+ const server_hooks_file = resolve_entry(config.kit.files.hooks.server);
85
+ const universal_hooks_file = resolve_entry(config.kit.files.hooks.universal);
80
86
 
81
87
  const typo = resolve_entry('src/+hooks.server');
82
88
  if (typo) {
@@ -99,7 +105,8 @@ export function write_server(config, output) {
99
105
  `${output}/server/internal.js`,
100
106
  server_template({
101
107
  config,
102
- hooks: hooks_file ? relative(hooks_file) : null,
108
+ server_hooks: server_hooks_file ? relative(server_hooks_file) : null,
109
+ universal_hooks: universal_hooks_file ? relative(universal_hooks_file) : null,
103
110
  has_service_worker:
104
111
  config.kit.serviceWorker.register && !!resolve_entry(config.kit.files.serviceWorker),
105
112
  runtime_directory: relative(runtime_directory),
@@ -394,6 +394,12 @@ export interface KitConfig {
394
394
  * @default "src/hooks.server"
395
395
  */
396
396
  server?: string;
397
+ /**
398
+ * The location of your universal [hooks](https://kit.svelte.dev/docs/hooks).
399
+ * @default "src/hooks"
400
+ * @since 2.3.0
401
+ */
402
+ universal?: string;
397
403
  };
398
404
  /**
399
405
  * your app's internal library, accessible throughout the codebase as `$lib`
@@ -683,6 +689,12 @@ export type HandleFetch = (input: {
683
689
  fetch: typeof fetch;
684
690
  }) => MaybePromise<Response>;
685
691
 
692
+ /**
693
+ * The [`reroute`](https://kit.svelte.dev/docs/hooks#universal-hooks-reroute) hook allows you to modify the URL before it is used to determine which route to render.
694
+ * @since 2.3.0
695
+ */
696
+ export type Reroute = (event: { url: URL }) => void | string;
697
+
686
698
  /**
687
699
  * The generic form of `PageLoad` and `LayoutLoad`. You should import those from `./$types` (see [generated types](https://kit.svelte.dev/docs/types#generated-types))
688
700
  * rather than using `Load` directly.
@@ -1082,13 +1082,31 @@ async function load_root_error_page({ status, error, url, route }) {
1082
1082
  }
1083
1083
 
1084
1084
  /**
1085
- * @param {URL} url
1085
+ * @param {URL | undefined} url
1086
1086
  * @param {boolean} invalidating
1087
1087
  */
1088
1088
  function get_navigation_intent(url, invalidating) {
1089
+ if (!url) return undefined;
1089
1090
  if (is_external_url(url, base)) return;
1090
1091
 
1091
- const path = get_url_path(url.pathname);
1092
+ // reroute could alter the given URL, so we pass a copy
1093
+ let rerouted;
1094
+ try {
1095
+ rerouted = app.hooks.reroute({ url: new URL(url) }) ?? url.pathname;
1096
+ } catch (e) {
1097
+ if (DEV) {
1098
+ // in development, print the error...
1099
+ console.error(e);
1100
+
1101
+ // ...and pause execution, since otherwise we will immediately reload the page
1102
+ debugger; // eslint-disable-line
1103
+ }
1104
+
1105
+ // fall back to native navigation
1106
+ return undefined;
1107
+ }
1108
+
1109
+ const path = get_url_path(rerouted);
1092
1110
 
1093
1111
  for (const route of routes) {
1094
1112
  const params = route.exec(path);
@@ -1096,7 +1114,13 @@ function get_navigation_intent(url, invalidating) {
1096
1114
  if (params) {
1097
1115
  const id = url.pathname + url.search;
1098
1116
  /** @type {import('./types.js').NavigationIntent} */
1099
- const intent = { id, invalidating, route, params: decode_params(params), url };
1117
+ const intent = {
1118
+ id,
1119
+ invalidating,
1120
+ route,
1121
+ params: decode_params(params),
1122
+ url
1123
+ };
1100
1124
  return intent;
1101
1125
  }
1102
1126
  }
@@ -1462,7 +1486,7 @@ function setup_preload() {
1462
1486
 
1463
1487
  if (!options.reload) {
1464
1488
  if (priority <= options.preload_data) {
1465
- const intent = get_navigation_intent(/** @type {URL} */ (url), false);
1489
+ const intent = get_navigation_intent(url, false);
1466
1490
  if (intent) {
1467
1491
  if (DEV) {
1468
1492
  _preload_data(intent).then((result) => {
@@ -1,8 +1,4 @@
1
1
  declare module '__SERVER__/internal.js' {
2
2
  export const options: import('types').SSROptions;
3
- export const get_hooks: () => Promise<{
4
- handle?: import('@sveltejs/kit').Handle;
5
- handleError?: import('@sveltejs/kit').HandleServerError;
6
- handleFetch?: import('@sveltejs/kit').HandleFetch;
7
- }>;
3
+ export const get_hooks: () => Promise<Partial<import('types').ServerHooks>>;
8
4
  }
@@ -62,7 +62,8 @@ export class Server {
62
62
  this.#options.hooks = {
63
63
  handle: module.handle || (({ event, resolve }) => resolve(event)),
64
64
  handleError: module.handleError || (({ error }) => console.error(error)),
65
- handleFetch: module.handleFetch || (({ request, fetch }) => fetch(request))
65
+ handleFetch: module.handleFetch || (({ request, fetch }) => fetch(request)),
66
+ reroute: module.reroute || (() => {})
66
67
  };
67
68
  } catch (error) {
68
69
  if (DEV) {
@@ -71,7 +72,8 @@ export class Server {
71
72
  throw error;
72
73
  },
73
74
  handleError: ({ error }) => console.error(error),
74
- handleFetch: ({ request, fetch }) => fetch(request)
75
+ handleFetch: ({ request, fetch }) => fetch(request),
76
+ reroute: () => {}
75
77
  };
76
78
  } else {
77
79
  throw error;
@@ -194,7 +194,7 @@ class BaseProvider {
194
194
  this.#style_src_elem.push(`sha256-${hash}`);
195
195
  }
196
196
  } else {
197
- if (this.#style_src.length === 0) {
197
+ if (this.#style_src.length === 0 && !d['style-src']?.includes('unsafe-inline')) {
198
198
  this.#style_src.push(`nonce-${this.#nonce}`);
199
199
  }
200
200
  if (d['style-src-attr']?.length) {
@@ -79,9 +79,19 @@ export async function respond(request, options, manifest, state) {
79
79
  }
80
80
  }
81
81
 
82
+ // reroute could alter the given URL, so we pass a copy
83
+ let rerouted_path;
84
+ try {
85
+ rerouted_path = options.hooks.reroute({ url: new URL(url) }) ?? url.pathname;
86
+ } catch (e) {
87
+ return text('Internal Server Error', {
88
+ status: 500
89
+ });
90
+ }
91
+
82
92
  let decoded;
83
93
  try {
84
- decoded = decode_pathname(url.pathname);
94
+ decoded = decode_pathname(rerouted_path);
85
95
  } catch {
86
96
  return text('Malformed URI', { status: 400 });
87
97
  }
@@ -12,7 +12,8 @@ import {
12
12
  ServerInitOptions,
13
13
  HandleFetch,
14
14
  Actions,
15
- HandleClientError
15
+ HandleClientError,
16
+ Reroute
16
17
  } from '@sveltejs/kit';
17
18
  import {
18
19
  HttpMethod,
@@ -99,10 +100,12 @@ export interface ServerHooks {
99
100
  handleFetch: HandleFetch;
100
101
  handle: Handle;
101
102
  handleError: HandleServerError;
103
+ reroute: Reroute;
102
104
  }
103
105
 
104
106
  export interface ClientHooks {
105
107
  handleError: HandleClientError;
108
+ reroute: Reroute;
106
109
  }
107
110
 
108
111
  export interface Env {
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.2.1';
4
+ export const VERSION = '2.3.0';
package/types/index.d.ts CHANGED
@@ -376,6 +376,12 @@ declare module '@sveltejs/kit' {
376
376
  * @default "src/hooks.server"
377
377
  */
378
378
  server?: string;
379
+ /**
380
+ * The location of your universal [hooks](https://kit.svelte.dev/docs/hooks).
381
+ * @default "src/hooks"
382
+ * @since 2.3.0
383
+ */
384
+ universal?: string;
379
385
  };
380
386
  /**
381
387
  * your app's internal library, accessible throughout the codebase as `$lib`
@@ -665,6 +671,12 @@ declare module '@sveltejs/kit' {
665
671
  fetch: typeof fetch;
666
672
  }) => MaybePromise<Response>;
667
673
 
674
+ /**
675
+ * The [`reroute`](https://kit.svelte.dev/docs/hooks#universal-hooks-reroute) hook allows you to modify the URL before it is used to determine which route to render.
676
+ * @since 2.3.0
677
+ */
678
+ export type Reroute = (event: { url: URL }) => void | string;
679
+
668
680
  /**
669
681
  * The generic form of `PageLoad` and `LayoutLoad`. You should import those from `./$types` (see [generated types](https://kit.svelte.dev/docs/types#generated-types))
670
682
  * rather than using `Load` directly.
@@ -14,6 +14,7 @@
14
14
  "HandleServerError",
15
15
  "HandleClientError",
16
16
  "HandleFetch",
17
+ "Reroute",
17
18
  "Load",
18
19
  "LoadEvent",
19
20
  "NavigationEvent",
@@ -143,5 +144,5 @@
143
144
  null,
144
145
  null
145
146
  ],
146
- "mappings": "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"
147
+ "mappings": ";;;;;;;;;kBA2BiBA,OAAOA;;;;;;;;;;;;aAYZC,cAAcA;;;;;;aAMdC,cAAcA;;;;;;;;;;;;;;;kBAeTC,aAAaA;;;;;;;;;;;;;;;;kBAgBbC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA4FPC,MAAMA;;;;;;;;;;;;;;;;;;;;;kBAqBNC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAyDPC,SAASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAqZdC,MAAMA;;;;;;;;;;;aAWNC,iBAAiBA;;;;;;;;;;;;;aAajBC,iBAAiBA;;;;;;;;;;aAUjBC,WAAWA;;;;;;;;;;aAUXC,OAAOA;;;;;;aAMPC,IAAIA;;;;;;;;;;;;kBAYCC,SAASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA4GTC,eAAeA;;;;;;;;;;;;;;;;;;;;;;;;;;kBA0BfC,gBAAgBA;;;;;;;;;;;;;;;;;;;;;;;;aAwBrBC,cAAcA;;kBAETC,UAAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAoCVC,cAAcA;;;;;;;;;;kBAUdC,UAAUA;;;;;;;;;;;;;;;;;;kBAkBVC,aAAaA;;;;;;;;;;;;;;;;;;;kBAmBbC,IAAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA8CTC,YAAYA;;kBAEPC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA4FjBC,cAAcA;;;;;kBAKTC,cAAcA;;;;;;;;;;;;;;;;;;;;;;;kBAuBdC,eAAeA;;;;;;;;;;;;;;;cAenBC,MAAMA;;;;;;kBAMFC,iBAAiBA;;;;kBAIjBC,WAAWA;;;;;;;;;;;;;;;;;;;aAmBhBC,UAAUA;;;;;;;kBAOLC,eAAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAqEpBC,MAAMA;;;;;;;;;;aAUNC,OAAOA;;;;;;;;;;;;;;;;aAgBPC,YAAYA;;;;;;;;;;;;kBCtvCXC,SAASA;;;;;;;;;;kBAqBTC,QAAQA;;;;;;;aD8vCTC,cAAcA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA6BTC,QAAQA;;;;WE1yCRC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAkDZC,GAAGA;;;;;;;;;;;;;;;;;;;;;;WAsBHC,aAAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAmElBC,UAAUA;;WAELC,MAAMA;;;;;;;;;MASXC,YAAYA;;WAEPC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAmCXC,yBAAyBA;;;;;;;;;;WAUzBC,yBAAyBA;;;;WAIzBC,sCAAsCA;;;;MAI3CC,8BAA8BA;MAC9BC,8BAA8BA;MAC9BC,2CAA2CA;;;;;;aAM3CC,eAAeA;;WAIVC,cAAcA;;;;;WAKdC,YAAYA;;;;;;MAMjBC,aAAaA;WClMRC,KAAKA;;;;;;WAaLC,SAASA;;;;;;;;;;;;;;;;WAyETC,YAAYA;;;;;;;WAOZC,QAAQA;;;;;;;;;;;;;MAwBbC,iBAAiBA;;;;;;;;WAUZC,UAAUA;;;;;;;;;;;;;WAaVC,SAASA;;;;;;;;;;;;;;;;;;;;;;;WAsGTC,YAAYA;;;;;;;;;;;;;MAajBC,kBAAkBA;;WAEbC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAsCZC,aAAaA;;WA2BRC,eAAeA;;;;;;MAMpBC,uBAAuBA;;MAEvBC,WAAWA;;;;;;;;WAQNC,QAAQA;;;;;;;;;MAyCbC,eAAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBCzVXC,WAAWA;;;;;;;;;;;iBAcXC,QAAQA;;;;;iBAaRC,UAAUA;;;;;;iBASVC,IAAIA;;;;;;iBA8BJC,IAAIA;;;;;;;;;;;;aApI6CC,QAAQA;aAMVC,YAAYA;cCX9DC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBCiEJC,QAAQA;;;;iBC+BFC,UAAUA;;;;;;iBAeVC,WAAWA;;;;;;;;;iBChGjBC,gBAAgBA;;;;;;;iBCyHVC,SAASA;;;;;;;;cCrIlBC,OAAOA;;;;cAKPC,GAAGA;;;;;;;;;;;;;;;;;;;;;;iBCkBAC,WAAWA;;;;;;;;;;;;;;;;;;;;;iBAyCXC,OAAOA;;;;;;;iBCmwDDC,WAAWA;;;;;;;;;iBA5RjBC,aAAaA;;;;;;;;;;;;iBAiBbC,cAAcA;;;;;;;;;;iBAedC,UAAUA;;;;;iBASVC,qBAAqBA;;;;;;;;iBA2BrBC,IAAIA;;;;;;;;;;;;;;;;;;;;;;;;iBAsCJC,UAAUA;;;;iBAmBVC,aAAaA;;;;;;;;;;;;iBAqBPC,WAAWA;;;;;;;;;;;;;;;;;;iBAoCjBC,WAAWA;;;;;iBA2BXC,SAASA;;;;;iBAuCTC,YAAYA;MVzoDhBxD,YAAYA;;;;;;;;;;;;;;;;;;iBWxIRyD,YAAYA;;;;iBCZfC,SAASA;;;;;;;;;;;;;;cAwBTC,IAAIA;;;;;;;;cAeJC,UAAUA;;;;;;cAaVC,OAAOA"
147
148
  }