@sveltejs/kit 2.17.2 → 2.17.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.17.2",
3
+ "version": "2.17.3",
4
4
  "description": "SvelteKit is the fastest way to build Svelte apps",
5
5
  "keywords": [
6
6
  "framework",
@@ -25,45 +25,52 @@ export function build_server_nodes(out, kit, manifest_data, server_manifest, cli
25
25
  /** @type {Set<string>} */
26
26
  const client_stylesheets = new Set();
27
27
  for (const key in client_manifest) {
28
- const file = client_manifest[key];
29
- if (file.css?.[0]) {
30
- client_stylesheets.add(file.css[0]);
31
- }
28
+ client_manifest[key].css?.forEach((filename) => {
29
+ client_stylesheets.add(filename);
30
+ });
32
31
  }
33
32
 
34
- /** @type {Map<number, string>} */
33
+ /** @type {Map<number, string[]>} */
35
34
  const server_stylesheets = new Map();
35
+ manifest_data.nodes.forEach((node, i) => {
36
+ if (!node.component || !server_manifest[node.component]) return;
36
37
 
37
- const component_stylesheet_map = new Map(Object.values(server_manifest).map((file) => [file.src, file.css?.[0]]));
38
+ const { stylesheets } = find_deps(server_manifest, node.component, false);
38
39
 
39
- manifest_data.nodes.forEach((node, i) => {
40
- const server_stylesheet = component_stylesheet_map.get(node.component);
41
- if (node.component && server_stylesheet) {
42
- server_stylesheets.set(i, server_stylesheet);
40
+ if (stylesheets.length) {
41
+ server_stylesheets.set(i, stylesheets);
43
42
  }
44
43
  });
45
44
 
46
- // ignore dynamically imported stylesheets since we can't inline those
47
- css.filter(asset => client_stylesheets.has(asset.fileName))
48
- .forEach((asset) => {
49
- if (asset.source.length < kit.inlineStyleThreshold) {
50
- // We know that the names for entry points are numbers.
51
- const [index] = basename(asset.fileName).split('.');
52
- // There can also be other CSS files from shared components
53
- // for example, which we need to ignore here.
54
- if (isNaN(+index)) return;
55
-
56
- const server_stylesheet = server_stylesheets.get(+index);
57
- const file = `${out}/server/stylesheets/${index}.js`;
58
-
59
- // we need to inline the server stylesheet instead of the client one
60
- // so that asset paths are correct on document load
61
- const source = fs.readFileSync(`${out}/server/${server_stylesheet}`, 'utf-8');
62
-
63
- fs.writeFileSync(file, `// ${server_stylesheet}\nexport default ${s(source)};`);
64
- stylesheet_lookup.set(asset.fileName, index);
65
- }
45
+ for (const asset of css) {
46
+ // ignore dynamically imported stylesheets since we don't need to inline those
47
+ if (!client_stylesheets.has(asset.fileName) || asset.source.length >= kit.inlineStyleThreshold) {
48
+ continue;
49
+ }
50
+
51
+ // We know that the names for entry points are numbers.
52
+ const [index] = basename(asset.fileName).split('.');
53
+ // There can also be other CSS files from shared components
54
+ // for example, which we need to ignore here.
55
+ if (isNaN(+index)) continue;
56
+
57
+ const file = `${out}/server/stylesheets/${index}.js`;
58
+
59
+ // we need to inline the server stylesheet instead of the client one
60
+ // so that asset paths are correct on document load
61
+ const filenames = server_stylesheets.get(+index);
62
+
63
+ if (!filenames) {
64
+ throw new Error('This should never happen, but if it does, it means we failed to find the server stylesheet for a node.');
65
+ }
66
+
67
+ const sources = filenames.map((filename) => {
68
+ return fs.readFileSync(`${out}/server/${filename}`, 'utf-8');
66
69
  });
70
+ fs.writeFileSync(file, `// ${filenames.join(', ')}\nexport default ${s(sources.join('\n'))};`);
71
+
72
+ stylesheet_lookup.set(asset.fileName, index);
73
+ }
67
74
  }
68
75
 
69
76
  manifest_data.nodes.forEach((node, i) => {
@@ -145,6 +145,7 @@ export async function dev(vite, vite_config, svelte_config) {
145
145
  return `${svelte_config.kit.paths.base}${to_fs(svelte_config.kit.outDir)}/generated/client/nodes/${i}.js`;
146
146
  }
147
147
  }),
148
+ // `css` is not necessary in dev, as the JS file from `nodes` will reference the CSS file
148
149
  routes:
149
150
  svelte_config.kit.router.resolution === 'client'
150
151
  ? undefined
@@ -866,8 +866,12 @@ Tips:
866
866
  /** @type {import('vite').Manifest} */
867
867
  const client_manifest = JSON.parse(read(`${out}/client/${vite_config.build.manifest}`));
868
868
 
869
- const deps_of = /** @param {string} f */ (f) =>
870
- find_deps(client_manifest, posixify(path.relative('.', f)), false);
869
+ /**
870
+ * @param {string} entry
871
+ * @param {boolean} [add_dynamic_css]
872
+ */
873
+ const deps_of = (entry, add_dynamic_css = false) =>
874
+ find_deps(client_manifest, posixify(path.relative('.', entry)), add_dynamic_css);
871
875
 
872
876
  if (svelte_config.kit.output.bundleStrategy === 'split') {
873
877
  const start = deps_of(`${runtime_directory}/client/entry.js`);
@@ -888,14 +892,20 @@ Tips:
888
892
  // similar to that on the client, with as much information computed upfront so that we
889
893
  // don't need to include any code of the actual routes in the server bundle.
890
894
  if (svelte_config.kit.router.resolution === 'server') {
891
- build_data.client.nodes = manifest_data.nodes.map((node, i) => {
895
+ const nodes = manifest_data.nodes.map((node, i) => {
892
896
  if (node.component || node.universal) {
893
- return resolve_symlinks(
897
+ const entry = `${kit.outDir}/generated/client-optimized/nodes/${i}.js`;
898
+ const deps = deps_of(entry, true);
899
+ const file = resolve_symlinks(
894
900
  client_manifest,
895
901
  `${kit.outDir}/generated/client-optimized/nodes/${i}.js`
896
902
  ).chunk.file;
903
+
904
+ return { file, css: deps.stylesheets };
897
905
  }
898
906
  });
907
+ build_data.client.nodes = nodes.map((node) => node?.file);
908
+ build_data.client.css = nodes.map((node) => node?.css);
899
909
 
900
910
  build_data.client.routes = compact(
901
911
  manifest_data.routes.map((route) => {
@@ -19,7 +19,8 @@ import {
19
19
  origin,
20
20
  scroll_state,
21
21
  notifiable_store,
22
- create_updated_store
22
+ create_updated_store,
23
+ load_css
23
24
  } from './utils.js';
24
25
  import { base } from '__sveltekit/paths';
25
26
  import * as devalue from 'devalue';
@@ -41,6 +42,8 @@ import { writable } from 'svelte/store';
41
42
  import { page, update, navigating } from './state.svelte.js';
42
43
  import { add_data_suffix, add_resolution_suffix } from '../pathname.js';
43
44
 
45
+ export { load_css };
46
+
44
47
  const ICON_REL_ATTRIBUTES = new Set(['icon', 'shortcut icon', 'apple-touch-icon']);
45
48
 
46
49
  let errored = false;
@@ -1677,8 +1680,6 @@ function setup_preload() {
1677
1680
  const a = find_anchor(element, container);
1678
1681
  if (!a || a === current_a) return;
1679
1682
 
1680
- current_a = a;
1681
-
1682
1683
  const { url, external, download } = get_link_info(a, base, app.hash);
1683
1684
  if (external || download) return;
1684
1685
 
@@ -1689,6 +1690,7 @@ function setup_preload() {
1689
1690
 
1690
1691
  if (!options.reload && !same_url) {
1691
1692
  if (priority <= options.preload_data) {
1693
+ current_a = a;
1692
1694
  const intent = await get_navigation_intent(url, false);
1693
1695
  if (intent) {
1694
1696
  if (DEV) {
@@ -1707,6 +1709,7 @@ function setup_preload() {
1707
1709
  }
1708
1710
  }
1709
1711
  } else if (priority <= options.preload_code) {
1712
+ current_a = a;
1710
1713
  void _preload_code(/** @type {URL} */ (url));
1711
1714
  }
1712
1715
  }
@@ -1,3 +1,3 @@
1
1
  // we expose this as a separate entry point (rather than treating client.js as the entry point)
2
- // so that everything other than `start` can be treeshaken
3
- export { start } from './client.js';
2
+ // so that everything other than `start`/`load_css` can be treeshaken
3
+ export { start, load_css } from './client.js';
@@ -331,3 +331,40 @@ export function is_external_url(url, base, hash_routing) {
331
331
 
332
332
  return false;
333
333
  }
334
+
335
+ /** @type {Record<string, boolean>} */
336
+ const seen = {};
337
+
338
+ /**
339
+ * Used for server-side resolution, to replicate Vite's CSS loading behaviour in production.
340
+ *
341
+ * Closely modelled after https://github.com/vitejs/vite/blob/3dd12f4724130fdf8ba44c6d3252ebdff407fd47/packages/vite/src/node/plugins/importAnalysisBuild.ts#L214
342
+ * (which ideally we could just use directly, but it's not exported)
343
+ * @param {string[]} deps
344
+ */
345
+ export function load_css(deps) {
346
+ if (__SVELTEKIT_CLIENT_ROUTING__) return;
347
+
348
+ const csp_nonce_meta = /** @type {HTMLMetaElement} */ (
349
+ document.querySelector('meta[property=csp-nonce]')
350
+ );
351
+ const csp_nonce = csp_nonce_meta?.nonce || csp_nonce_meta?.getAttribute('nonce');
352
+
353
+ for (const dep of deps) {
354
+ if (dep in seen) continue;
355
+ seen[dep] = true;
356
+
357
+ if (document.querySelector(`link[href="${dep}"][rel="stylesheet"]`)) {
358
+ continue;
359
+ }
360
+
361
+ const link = document.createElement('link');
362
+ link.rel = 'stylesheet';
363
+ link.crossOrigin = '';
364
+ link.href = dep;
365
+ if (csp_nonce) {
366
+ link.setAttribute('nonce', csp_nonce);
367
+ }
368
+ document.head.appendChild(link);
369
+ }
370
+ }
@@ -242,7 +242,7 @@ export function create_universal_fetch(event, state, fetched, csr, resolve_opts)
242
242
  dependency = { response, body: null };
243
243
  state.prerendering.dependencies.set(url.pathname, dependency);
244
244
  }
245
- } else {
245
+ } else if (url.protocol === 'https:' || url.protocol === 'http:') {
246
246
  // simulate CORS errors and "no access to body in no-cors mode" server-side for consistency with client-side behaviour
247
247
  const mode = input instanceof Request ? input.mode : (init?.mode ?? 'cors');
248
248
  if (mode === 'no-cors') {
@@ -105,10 +105,39 @@ export function create_server_routing_response(route, params, url, manifest) {
105
105
 
106
106
  if (route) {
107
107
  const csr_route = generate_route_object(route, url, manifest);
108
- const body = `export const route = ${csr_route}; export const params = ${JSON.stringify(params)};`;
108
+ const body = `${create_css_import(route, url, manifest)}\nexport const route = ${csr_route}; export const params = ${JSON.stringify(params)};`;
109
109
 
110
110
  return { response: text(body, { headers }), body };
111
111
  } else {
112
112
  return { response: text('', { headers }), body: '' };
113
113
  }
114
114
  }
115
+
116
+ /**
117
+ * This function generates the client-side import for the CSS files that are
118
+ * associated with the current route. Vite takes care of that when using
119
+ * client-side route resolution, but for server-side resolution it does
120
+ * not know about the CSS files automatically.
121
+ *
122
+ * @param {import('types').SSRClientRoute} route
123
+ * @param {URL} url
124
+ * @param {import('@sveltejs/kit').SSRManifest} manifest
125
+ * @returns {string}
126
+ */
127
+ function create_css_import(route, url, manifest) {
128
+ const { errors, layouts, leaf } = route;
129
+
130
+ let css = '';
131
+
132
+ for (const node of [...errors, ...layouts.map((l) => l?.[1]), leaf[1]]) {
133
+ if (typeof node !== 'number') continue;
134
+ const node_css = manifest._.client.css?.[node];
135
+ for (const css_path of node_css ?? []) {
136
+ css += `'${assets || base}/${css_path}',`;
137
+ }
138
+ }
139
+
140
+ if (!css) return '';
141
+
142
+ return `${create_client_import(/** @type {string} */ (manifest._.client.start), url)}.then(x => x.load_css([${css}]));`;
143
+ }
@@ -80,6 +80,12 @@ export interface BuildData {
80
80
  * Only set in case of `router.resolution === 'server'`.
81
81
  */
82
82
  nodes?: (string | undefined)[];
83
+ /**
84
+ * CSS files referenced in the entry points of the layouts/pages.
85
+ * An entry is undefined if the layout/page has no component or universal file (i.e. only has a `.server.js` file) or if has no CSS.
86
+ * Only set in case of `router.resolution === 'server'`.
87
+ */
88
+ css?: (string[] | undefined)[];
83
89
  /**
84
90
  * Contains the client route manifest in a form suitable for the server which is used for server side route resolution.
85
91
  * Notably, it contains all routes, regardless of whether they are prerendered or not (those are missing in the optimized server route manifest).
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.17.2';
4
+ export const VERSION = '2.17.3';
package/types/index.d.ts CHANGED
@@ -1727,6 +1727,12 @@ declare module '@sveltejs/kit' {
1727
1727
  * Only set in case of `router.resolution === 'server'`.
1728
1728
  */
1729
1729
  nodes?: (string | undefined)[];
1730
+ /**
1731
+ * CSS files referenced in the entry points of the layouts/pages.
1732
+ * An entry is undefined if the layout/page has no component or universal file (i.e. only has a `.server.js` file) or if has no CSS.
1733
+ * Only set in case of `router.resolution === 'server'`.
1734
+ */
1735
+ css?: (string[] | undefined)[];
1730
1736
  /**
1731
1737
  * Contains the client route manifest in a form suitable for the server which is used for server side route resolution.
1732
1738
  * Notably, it contains all routes, regardless of whether they are prerendered or not (those are missing in the optimized server route manifest).
@@ -160,6 +160,6 @@
160
160
  null,
161
161
  null
162
162
  ],
163
- "mappings": ";;;;;;;;;kBA2BiBA,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;aA2BZC,cAAcA;;;;;;aAMdC,cAAcA;;;;;;;;;;;;;;;kBAeTC,aAAaA;;;;;;;;;;;;;;;;;kBAiBbC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAkGPC,MAAMA;;;;;;;;;;;;;;;;;;;;;kBAqBNC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA4DPC,QAAQA;;;;;;;;kBAQRC,SAASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAiedC,MAAMA;;;;;;;;;;;aAWNC,iBAAiBA;;;;;;;;;;;;;aAajBC,iBAAiBA;;;;;;;;;;aAUjBC,WAAWA;;;;;;;;;;aAUXC,UAAUA;;;;;;aAMVC,UAAUA;;;;;;aAMVC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;aA0BPC,SAASA;;;;;kBAKJC,WAAWA;;;;;;;;;;;;aAYhBC,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;;;;;;;kBAOjBC,WAAWA;;;;;;;;;;;;;;;;;;;;;;aAsBhBC,UAAUA;;;;;;;kBAOLC,eAAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAqEpBC,MAAMA;;;;;;;;;;aAUNC,OAAOA;;;;;;;;;;;;;;;;aAgBPC,YAAYA;;;;;;;;;;;;kBC15CXC,SAASA;;;;;;;;;;kBAqBTC,QAAQA;;;;;;;aDk6CTC,cAAcA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA6BTC,QAAQA;;;;WE98CRC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAkDZC,GAAGA;;;;;;;;;;;;;;;;;;;;;WAqBHC,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;WCxLRC,KAAKA;;;;;;WAcLC,SAASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAgHTC,YAAYA;;;;;;;;;;;;WAYZC,QAAQA;;;;;;;;;;;;;;MAyBbC,iBAAiBA;;;;;;;;WAUZC,UAAUA;;;;;;;;;;;;;WAaVC,SAASA;;;;;;;;;;;;;;;;;;;;;;;WAyGTC,YAAYA;;;;;;;;;;;;;;;;MAgBjBC,kBAAkBA;;WAEbC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAsCZC,aAAaA;;WA2BRC,eAAeA;;;;;;MAMpBC,uBAAuBA;;MAEvBC,WAAWA;;;;;;;;WAQNC,QAAQA;;;;;;;;;WASRC,cAAcA;;;;;;;;;MA2CnBC,eAAeA;;;;;MAKfC,kBAAkBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBCladC,WAAWA;;;;;;;;;;;;;;;;;;;iBAsBXC,QAAQA;;;;;iBAiBRC,UAAUA;;;;;;iBASVC,IAAIA;;;;;;iBA8BJC,IAAIA;;;;;;;;;;;;;;;;iBAkDJC,eAAeA;;;cC3MlBC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBCoEJC,QAAQA;;;;;;iBCoCFC,UAAUA;;;;;;iBAkCVC,WAAWA;;;;;iBAgFjBC,oBAAoBA;;;;;;;;;;;iBC3MpBC,gBAAgBA;;;;;;;;;iBCgHVC,SAASA;;;;;;;;;cC/HlBC,OAAOA;;;;;cAKPC,GAAGA;;;;;cAKHC,QAAQA;;;;;cAKRC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;iBCWJC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;iBA8CXC,OAAOA;;;;;;;iBC2+DDC,WAAWA;;;;;;;;;;;iBA/TjBC,aAAaA;;;;;;;;;;;;iBAiBbC,cAAcA;;;;;;;;;;iBAedC,UAAUA;;;;;iBASVC,qBAAqBA;;;;;;;;;;iBA8BrBC,IAAIA;;;;;;;;;;;;;;;;;;;;;;;;;iBAsCJC,UAAUA;;;;iBA0BVC,aAAaA;;;;;;;;;;;;iBAqBPC,WAAWA;;;;;;;;;;;;;;;;;;iBAoCXC,WAAWA;;;;;iBAsCjBC,SAASA;;;;;iBA+CTC,YAAYA;MVj3DhB5D,YAAYA;;;;;;;;;;;YWtJb6D,IAAIA;;;;;;;YAOJC,MAAMA;;;;;;;;;;;;;;;;;iBAiBDC,YAAYA;;;;;;;;;;;;;;;;;;iBCVZC,IAAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cC8BPC,IAAIA;;;;;cAQJC,UAAUA;;;;;;;;;;;cAMVC,OAAOA;;;;;;;;;iBCrDPC,SAASA;;;;;;;;;;;;;;;cAyBTH,IAAIA;;;;;;;;;;cAiBJC,UAAUA;;;;;;;;cAeVC,OAAOA",
163
+ "mappings": "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",
164
164
  "ignoreList": []
165
165
  }