@sveltejs/kit 2.50.1 → 2.50.2

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.50.1",
3
+ "version": "2.50.2",
4
4
  "description": "SvelteKit is the fastest way to build Svelte apps",
5
5
  "keywords": [
6
6
  "framework",
@@ -29,7 +29,7 @@
29
29
  "magic-string": "^0.30.5",
30
30
  "mrmime": "^2.0.0",
31
31
  "sade": "^1.8.1",
32
- "set-cookie-parser": "^2.6.0",
32
+ "set-cookie-parser": "^3.0.0",
33
33
  "sirv": "^3.0.0"
34
34
  },
35
35
  "devDependencies": {
@@ -41,7 +41,7 @@
41
41
  "@types/set-cookie-parser": "^2.4.7",
42
42
  "dts-buddy": "^0.6.2",
43
43
  "rollup": "^4.14.2",
44
- "svelte": "^5.46.4",
44
+ "svelte": "^5.48.4",
45
45
  "svelte-preprocess": "^6.0.0",
46
46
  "typescript": "^5.3.3",
47
47
  "vite": "^6.3.5",
@@ -1,4 +1,4 @@
1
- import { resolve } from '../../utils/url.js';
1
+ import { resolve, decode_uri } from '../../utils/url.js';
2
2
  import { decode } from './entities.js';
3
3
 
4
4
  const DOCTYPE = 'DOCTYPE';
@@ -193,11 +193,11 @@ export function crawl(html, base) {
193
193
  }
194
194
 
195
195
  if (id) {
196
- ids.push(id);
196
+ ids.push(decode_uri(id));
197
197
  }
198
198
 
199
199
  if (name && tag === 'A') {
200
- ids.push(name);
200
+ ids.push(decode_uri(name));
201
201
  }
202
202
 
203
203
  if (src) {
@@ -5,14 +5,43 @@ import { s } from '../../../utils/misc.js';
5
5
  import { normalizePath } from 'vite';
6
6
  import { basename, join } from 'node:path';
7
7
  import { create_node_analyser } from '../static_analysis/index.js';
8
+ import { fix_css_urls } from '../../../utils/css.js';
8
9
 
10
+ /**
11
+ * Regenerate server nodes after acquiring client manifest
12
+ * @overload
13
+ * @param {string} out
14
+ * @param {import('types').ValidatedKitConfig} kit
15
+ * @param {import('types').ManifestData} manifest_data
16
+ * @param {import('vite').Manifest} server_manifest
17
+ * @param {import('vite').Manifest} client_manifest
18
+ * @param {string} assets_path
19
+ * @param {import('vite').Rollup.RollupOutput['output']} client_chunks
20
+ * @param {import('types').RecursiveRequired<import('types').ValidatedConfig['kit']['output']>} output_config
21
+ * @param {Map<string, { page_options: Record<string, any> | null, children: string[] }>} static_exports
22
+ * @returns {Promise<void>}
23
+ */
24
+ /**
25
+ * Build server nodes without client manifest for analysis phase
26
+ * @overload
27
+ * @param {string} out
28
+ * @param {import('types').ValidatedKitConfig} kit
29
+ * @param {import('types').ManifestData} manifest_data
30
+ * @param {import('vite').Manifest} server_manifest
31
+ * @param {null} client_manifest
32
+ * @param {null} assets_path
33
+ * @param {null} client_chunks
34
+ * @param {import('types').RecursiveRequired<import('types').ValidatedConfig['kit']['output']>} output_config
35
+ * @param {Map<string, { page_options: Record<string, any> | null, children: string[] }>} static_exports
36
+ * @returns {Promise<void>}
37
+ */
9
38
  /**
10
39
  * @param {string} out
11
40
  * @param {import('types').ValidatedKitConfig} kit
12
41
  * @param {import('types').ManifestData} manifest_data
13
42
  * @param {import('vite').Manifest} server_manifest
14
43
  * @param {import('vite').Manifest | null} client_manifest
15
- * @param {import('vite').Rollup.OutputBundle | null} server_bundle
44
+ * @param {string | null} assets_path
16
45
  * @param {import('vite').Rollup.RollupOutput['output'] | null} client_chunks
17
46
  * @param {import('types').RecursiveRequired<import('types').ValidatedConfig['kit']['output']>} output_config
18
47
  * @param {Map<string, { page_options: Record<string, any> | null, children: string[] }>} static_exports
@@ -23,7 +52,7 @@ export async function build_server_nodes(
23
52
  manifest_data,
24
53
  server_manifest,
25
54
  client_manifest,
26
- server_bundle,
55
+ assets_path,
27
56
  client_chunks,
28
57
  output_config,
29
58
  static_exports
@@ -31,38 +60,59 @@ export async function build_server_nodes(
31
60
  mkdirp(`${out}/server/nodes`);
32
61
  mkdirp(`${out}/server/stylesheets`);
33
62
 
34
- /** @type {Map<string, string>} */
63
+ /**
64
+ * Stylesheet names and their contents which are below the inline threshold
65
+ * @type {Map<string, string>}
66
+ */
35
67
  const stylesheets_to_inline = new Map();
36
68
 
37
- if (server_bundle && client_chunks && kit.inlineStyleThreshold > 0) {
38
- const client = get_stylesheets(client_chunks);
39
- const server = get_stylesheets(Object.values(server_bundle));
69
+ /**
70
+ * For CSS inlining, we either store a string or a function that returns the
71
+ * styles with the correct relative URLs
72
+ * @type {(css: string, eager_assets: Set<string>) => string}
73
+ */
74
+ let prepare_css_for_inlining = (css) => s(css);
40
75
 
41
- // map server stylesheet name to the client stylesheet name
42
- for (const [id, client_stylesheet] of client.stylesheets_used) {
43
- const server_stylesheet = server.stylesheets_used.get(id);
44
- if (!server_stylesheet) {
76
+ if (client_chunks && kit.inlineStyleThreshold > 0 && output_config.bundleStrategy === 'split') {
77
+ for (const chunk of client_chunks) {
78
+ if (chunk.type !== 'asset' || !chunk.fileName.endsWith('.css')) {
45
79
  continue;
46
80
  }
47
- client_stylesheet.forEach((file, i) => {
48
- stylesheets_to_inline.set(file, server_stylesheet[i]);
49
- });
50
- }
51
81
 
52
- // filter out stylesheets that should not be inlined
53
- for (const [fileName, content] of client.stylesheet_content) {
54
- if (content.length >= kit.inlineStyleThreshold) {
55
- stylesheets_to_inline.delete(fileName);
82
+ const source = chunk.source.toString();
83
+ if (source.length < kit.inlineStyleThreshold) {
84
+ stylesheets_to_inline.set(chunk.fileName, source);
56
85
  }
57
86
  }
58
87
 
59
- // map server stylesheet source to the client stylesheet name
60
- for (const [client_file, server_file] of stylesheets_to_inline) {
61
- const source = server.stylesheet_content.get(server_file);
62
- if (!source) {
63
- throw new Error(`Server stylesheet source not found for client stylesheet ${client_file}`);
64
- }
65
- stylesheets_to_inline.set(client_file, source);
88
+ // If the client CSS has URL references to assets, we need to adjust the
89
+ // relative path so that they are correct when inlined into the document.
90
+ // Although `paths.assets` is static, we need to pass in a fake path
91
+ // `/_svelte_kit_assets` at runtime when running `vite preview`
92
+ if (kit.paths.assets || kit.paths.relative) {
93
+ const static_assets = new Set(
94
+ manifest_data.assets.map((asset) => decodeURIComponent(asset.file))
95
+ );
96
+
97
+ const segments = /** @type {string} */ (assets_path).split('/');
98
+ const static_asset_prefix = segments.map(() => '..').join('/') + '/';
99
+
100
+ prepare_css_for_inlining = (css, eager_assets) => {
101
+ const transformed_css = fix_css_urls({
102
+ css,
103
+ vite_assets: eager_assets,
104
+ static_assets,
105
+ paths_assets: '${assets}',
106
+ base: '${base}',
107
+ static_asset_prefix
108
+ });
109
+
110
+ // only convert to a function if we have adjusted any URLs
111
+ if (css !== transformed_css) {
112
+ return `function css(assets, base) { return \`${s(transformed_css).slice(1, -1)}\`; }`;
113
+ }
114
+ return s(css);
115
+ };
66
116
  }
67
117
  }
68
118
 
@@ -96,6 +146,9 @@ export async function build_server_nodes(
96
146
  /** @type {string[]} */
97
147
  let fonts = [];
98
148
 
149
+ /** @type {Set<string>} */
150
+ let eager_assets = new Set();
151
+
99
152
  if (node.component && client_manifest) {
100
153
  exports.push(
101
154
  'let component_cache;',
@@ -135,7 +188,7 @@ export async function build_server_nodes(
135
188
  const entry_path = `${normalizePath(kit.outDir)}/generated/client-optimized/nodes/${i}.js`;
136
189
  const entry = find_deps(client_manifest, entry_path, true);
137
190
 
138
- // eagerly load client stylesheets and fonts imported by the SSR-ed page to avoid FOUC.
191
+ // Eagerly load client stylesheets and fonts imported by the SSR-ed page to avoid FOUC.
139
192
  // However, if it is not used during SSR (not present in the server manifest),
140
193
  // then it can be lazily loaded in the browser.
141
194
 
@@ -153,8 +206,6 @@ export async function build_server_nodes(
153
206
 
154
207
  /** @type {Set<string>} */
155
208
  const eager_css = new Set();
156
- /** @type {Set<string>} */
157
- const eager_assets = new Set();
158
209
 
159
210
  entry.stylesheet_map.forEach((value, filepath) => {
160
211
  // pages and layouts are renamed to node indexes when optimised for the client
@@ -180,27 +231,46 @@ export async function build_server_nodes(
180
231
  `export const fonts = ${s(fonts)};`
181
232
  );
182
233
 
183
- /** @type {string[]} */
184
- const inline_styles = [];
185
-
186
- stylesheets.forEach((file, i) => {
187
- if (stylesheets_to_inline.has(file)) {
188
- const filename = basename(file);
189
- const dest = `${out}/server/stylesheets/${filename}.js`;
190
- const source = stylesheets_to_inline.get(file);
191
- if (!source) {
192
- throw new Error(`Server stylesheet source not found for client stylesheet ${file}`);
234
+ /**
235
+ * Assets that have been processed by Vite (decoded and with the asset path stripped)
236
+ * @type {Set<string>}
237
+ */
238
+ let vite_assets = new Set();
239
+
240
+ // Keep track of Vite asset filenames so that we avoid touching unrelated ones
241
+ // when adjusting the inlined CSS
242
+ if (stylesheets_to_inline.size && assets_path && eager_assets.size) {
243
+ vite_assets = new Set(
244
+ Array.from(eager_assets).map((asset) => {
245
+ return decodeURIComponent(asset.replace(`${assets_path}/`, ''));
246
+ })
247
+ );
248
+ }
249
+
250
+ if (stylesheets_to_inline.size) {
251
+ /** @type {string[]} */
252
+ const inline_styles = [];
253
+
254
+ stylesheets.forEach((file, i) => {
255
+ if (stylesheets_to_inline.has(file)) {
256
+ const filename = basename(file);
257
+ const dest = `${out}/server/stylesheets/${filename}.js`;
258
+
259
+ let css = /** @type {string} */ (stylesheets_to_inline.get(file));
260
+
261
+ fs.writeFileSync(
262
+ dest,
263
+ `// ${filename}\nexport default ${prepare_css_for_inlining(css, vite_assets)};`
264
+ );
265
+ const name = `stylesheet_${i}`;
266
+ imports.push(`import ${name} from '../stylesheets/${filename}.js';`);
267
+ inline_styles.push(`\t${s(file)}: ${name}`);
193
268
  }
194
- fs.writeFileSync(dest, `// ${filename}\nexport default ${s(source)};`);
269
+ });
195
270
 
196
- const name = `stylesheet_${i}`;
197
- imports.push(`import ${name} from '../stylesheets/${filename}.js';`);
198
- inline_styles.push(`\t${s(file)}: ${name}`);
271
+ if (inline_styles.length > 0) {
272
+ exports.push(`export const inline_styles = () => ({\n${inline_styles.join(',\n')}\n});`);
199
273
  }
200
- });
201
-
202
- if (inline_styles.length > 0) {
203
- exports.push(`export const inline_styles = () => ({\n${inline_styles.join(',\n')}\n});`);
204
274
  }
205
275
 
206
276
  fs.writeFileSync(
@@ -209,37 +279,3 @@ export async function build_server_nodes(
209
279
  );
210
280
  }
211
281
  }
212
-
213
- /**
214
- * @param {(import('vite').Rollup.OutputAsset | import('vite').Rollup.OutputChunk)[]} chunks
215
- */
216
- function get_stylesheets(chunks) {
217
- /**
218
- * A map of module IDs and the stylesheets they use.
219
- * @type {Map<string, string[]>}
220
- */
221
- const stylesheets_used = new Map();
222
-
223
- /**
224
- * A map of stylesheet names and their content.
225
- * @type {Map<string, string>}
226
- */
227
- const stylesheet_content = new Map();
228
-
229
- for (const chunk of chunks) {
230
- if (chunk.type === 'asset') {
231
- if (chunk.fileName.endsWith('.css')) {
232
- stylesheet_content.set(chunk.fileName, chunk.source.toString());
233
- }
234
- continue;
235
- }
236
-
237
- if (chunk.viteMetadata?.importedCss.size) {
238
- const css = Array.from(chunk.viteMetadata.importedCss);
239
- for (const id of chunk.moduleIds) {
240
- stylesheets_used.set(id, css);
241
- }
242
- }
243
- }
244
- return { stylesheets_used, stylesheet_content };
245
- }
@@ -1031,7 +1031,7 @@ async function kit({ svelte_config }) {
1031
1031
  */
1032
1032
  writeBundle: {
1033
1033
  sequential: true,
1034
- async handler(_options, bundle) {
1034
+ async handler(_options) {
1035
1035
  if (secondary_build_started) return; // only run this once
1036
1036
 
1037
1037
  const verbose = vite_config.logLevel === 'info';
@@ -1271,7 +1271,7 @@ async function kit({ svelte_config }) {
1271
1271
  manifest_data,
1272
1272
  server_manifest,
1273
1273
  client_manifest,
1274
- bundle,
1274
+ assets_path,
1275
1275
  client_chunks,
1276
1276
  svelte_config.kit.output,
1277
1277
  static_exports
@@ -1,6 +1,2 @@
1
- import { BROWSER, DEV } from 'esm-env';
1
+ export { BROWSER as browser, DEV as dev } from 'esm-env';
2
2
  export { building, version } from '__sveltekit/environment';
3
-
4
- export const browser = BROWSER;
5
-
6
- export const dev = DEV;
@@ -78,7 +78,9 @@ export function command(validate_or_fn, maybe_fn) {
78
78
 
79
79
  state.refreshes ??= {};
80
80
 
81
- const promise = Promise.resolve(run_remote_function(event, state, true, arg, validate, fn));
81
+ const promise = Promise.resolve(
82
+ run_remote_function(event, state, true, () => validate(arg), fn)
83
+ );
82
84
 
83
85
  // @ts-expect-error
84
86
  promise.updates = () => {
@@ -145,8 +145,7 @@ export function form(validate_or_fn, maybe_fn) {
145
145
  event,
146
146
  state,
147
147
  true,
148
- data,
149
- (d) => d,
148
+ () => data,
150
149
  (data) => (!maybe_fn ? fn() : fn(data, issue))
151
150
  );
152
151
  } catch (e) {
@@ -131,7 +131,7 @@ export function prerender(validate_or_fn, fn_or_options, maybe_options) {
131
131
  }
132
132
 
133
133
  const promise = get_response(__, arg, state, () =>
134
- run_remote_function(event, state, false, arg, validate, fn)
134
+ run_remote_function(event, state, false, () => validate(arg), fn)
135
135
  );
136
136
 
137
137
  if (state.prerendering) {
@@ -5,6 +5,8 @@ import { get_request_store } from '@sveltejs/kit/internal/server';
5
5
  import { create_remote_key, stringify_remote_arg } from '../../../shared.js';
6
6
  import { prerendering } from '__sveltekit/environment';
7
7
  import { create_validator, get_cache, get_response, run_remote_function } from './shared.js';
8
+ import { handle_error_and_jsonify } from '../../../server/utils.js';
9
+ import { HttpError, SvelteKitError } from '@sveltejs/kit/internal';
8
10
 
9
11
  /**
10
12
  * Creates a remote query. When called from the browser, the function will be invoked on the server via a `fetch` call.
@@ -73,7 +75,7 @@ export function query(validate_or_fn, maybe_fn) {
73
75
  const { event, state } = get_request_store();
74
76
 
75
77
  const get_remote_function_result = () =>
76
- run_remote_function(event, state, false, arg, validate, fn);
78
+ run_remote_function(event, state, false, () => validate(arg), fn);
77
79
 
78
80
  /** @type {Promise<any> & Partial<RemoteQuery<any>>} */
79
81
  const promise = get_response(__, arg, state, get_remote_function_result);
@@ -137,7 +139,7 @@ export function query(validate_or_fn, maybe_fn) {
137
139
  */
138
140
  /*@__NO_SIDE_EFFECTS__*/
139
141
  function batch(validate_or_fn, maybe_fn) {
140
- /** @type {(args?: Input[]) => (arg: Input, idx: number) => Output} */
142
+ /** @type {(args?: Input[]) => MaybePromise<(arg: Input, idx: number) => Output>} */
141
143
  const fn = maybe_fn ?? validate_or_fn;
142
144
 
143
145
  /** @type {(arg?: any) => MaybePromise<Input>} */
@@ -148,16 +150,34 @@ function batch(validate_or_fn, maybe_fn) {
148
150
  type: 'query_batch',
149
151
  id: '',
150
152
  name: '',
151
- run: (args) => {
153
+ run: async (args, options) => {
152
154
  const { event, state } = get_request_store();
153
155
 
154
156
  return run_remote_function(
155
157
  event,
156
158
  state,
157
159
  false,
158
- args,
159
- (array) => Promise.all(array.map(validate)),
160
- fn
160
+ async () => Promise.all(args.map(validate)),
161
+ async (/** @type {any[]} */ input) => {
162
+ const get_result = await fn(input);
163
+
164
+ return Promise.all(
165
+ input.map(async (arg, i) => {
166
+ try {
167
+ return { type: 'result', data: get_result(arg, i) };
168
+ } catch (error) {
169
+ return {
170
+ type: 'error',
171
+ error: await handle_error_and_jsonify(event, state, options, error),
172
+ status:
173
+ error instanceof HttpError || error instanceof SvelteKitError
174
+ ? error.status
175
+ : 500
176
+ };
177
+ }
178
+ })
179
+ );
180
+ }
161
181
  );
162
182
  }
163
183
  };
@@ -190,22 +210,23 @@ function batch(validate_or_fn, maybe_fn) {
190
210
  batching = { args: [], resolvers: [] };
191
211
 
192
212
  try {
193
- const get_result = await run_remote_function(
213
+ return await run_remote_function(
194
214
  event,
195
215
  state,
196
216
  false,
197
- batched.args,
198
- (array) => Promise.all(array.map(validate)),
199
- fn
200
- );
201
-
202
- for (let i = 0; i < batched.resolvers.length; i++) {
203
- try {
204
- batched.resolvers[i].resolve(get_result(batched.args[i], i));
205
- } catch (error) {
206
- batched.resolvers[i].reject(error);
217
+ async () => Promise.all(batched.args.map(validate)),
218
+ async (input) => {
219
+ const get_result = await fn(input);
220
+
221
+ for (let i = 0; i < batched.resolvers.length; i++) {
222
+ try {
223
+ batched.resolvers[i].resolve(get_result(input[i], i));
224
+ } catch (error) {
225
+ batched.resolvers[i].reject(error);
226
+ }
227
+ }
207
228
  }
208
- }
229
+ );
209
230
  } catch (error) {
210
231
  for (const resolver of batched.resolvers) {
211
232
  resolver.reject(error);
@@ -97,11 +97,10 @@ export function parse_remote_response(data, transport) {
97
97
  * @param {RequestEvent} event
98
98
  * @param {RequestState} state
99
99
  * @param {boolean} allow_cookies
100
- * @param {any} arg
101
- * @param {(arg: any) => any} validate
100
+ * @param {() => any} get_input
102
101
  * @param {(arg?: any) => T} fn
103
102
  */
104
- export async function run_remote_function(event, state, allow_cookies, arg, validate, fn) {
103
+ export async function run_remote_function(event, state, allow_cookies, get_input, fn) {
105
104
  /** @type {RequestStore} */
106
105
  const store = {
107
106
  event: {
@@ -142,8 +141,8 @@ export async function run_remote_function(event, state, allow_cookies, arg, vali
142
141
  };
143
142
 
144
143
  // In two parts, each with_event, so that runtimes without async local storage can still get the event at the start of the function
145
- const validated = await with_request_store(store, () => validate(arg));
146
- return with_request_store(store, () => fn(validated));
144
+ const input = await with_request_store(store, get_input);
145
+ return with_request_store(store, () => fn(input));
147
146
  }
148
147
 
149
148
  /**
@@ -138,14 +138,20 @@ class BaseProvider {
138
138
  }
139
139
 
140
140
  /** @param {(import('types').Csp.Source | import('types').Csp.ActionSource)[] | undefined} directive */
141
- const needs_csp = (directive) =>
141
+ const style_needs_csp = (directive) =>
142
142
  !!directive && !directive.some((value) => value === 'unsafe-inline');
143
143
 
144
- this.#script_src_needs_csp = needs_csp(effective_script_src);
145
- this.#script_src_elem_needs_csp = needs_csp(script_src_elem);
146
- this.#style_src_needs_csp = needs_csp(effective_style_src);
147
- this.#style_src_attr_needs_csp = needs_csp(style_src_attr);
148
- this.#style_src_elem_needs_csp = needs_csp(style_src_elem);
144
+ /** @param {(import('types').Csp.Source | import('types').Csp.ActionSource)[] | undefined} directive */
145
+ const script_needs_csp = (directive) =>
146
+ !!directive &&
147
+ (!directive.some((value) => value === 'unsafe-inline') ||
148
+ directive.some((value) => value === 'strict-dynamic'));
149
+
150
+ this.#script_src_needs_csp = script_needs_csp(effective_script_src);
151
+ this.#script_src_elem_needs_csp = script_needs_csp(script_src_elem);
152
+ this.#style_src_needs_csp = style_needs_csp(effective_style_src);
153
+ this.#style_src_attr_needs_csp = style_needs_csp(style_src_attr);
154
+ this.#style_src_elem_needs_csp = style_needs_csp(style_src_elem);
149
155
 
150
156
  this.#script_needs_csp = this.#script_src_needs_csp || this.#script_src_elem_needs_csp;
151
157
  this.#style_needs_csp =
@@ -245,7 +245,14 @@ export async function render_response({
245
245
  for (const url of node.fonts) fonts.add(url);
246
246
 
247
247
  if (node.inline_styles && !client.inline) {
248
- Object.entries(await node.inline_styles()).forEach(([k, v]) => inline_styles.set(k, v));
248
+ Object.entries(await node.inline_styles()).forEach(([filename, css]) => {
249
+ if (typeof css === 'string') {
250
+ inline_styles.set(filename, css);
251
+ return;
252
+ }
253
+
254
+ inline_styles.set(filename, css(`${assets}/${paths.app_dir}/immutable/assets`, assets));
255
+ });
249
256
  }
250
257
  }
251
258
  } else {
@@ -73,23 +73,12 @@ async function handle_remote_call_internal(event, state, options, manifest, id)
73
73
  /** @type {{ payloads: string[] }} */
74
74
  const { payloads } = await event.request.json();
75
75
 
76
- const args = payloads.map((payload) => parse_remote_arg(payload, transport));
77
- const get_result = await with_request_store({ event, state }, () => info.run(args));
78
- const results = await Promise.all(
79
- args.map(async (arg, i) => {
80
- try {
81
- return { type: 'result', data: get_result(arg, i) };
82
- } catch (error) {
83
- return {
84
- type: 'error',
85
- error: await handle_error_and_jsonify(event, state, options, error),
86
- status:
87
- error instanceof HttpError || error instanceof SvelteKitError ? error.status : 500
88
- };
89
- }
90
- })
76
+ const args = await Promise.all(
77
+ payloads.map((payload) => parse_remote_arg(payload, transport))
91
78
  );
92
79
 
80
+ const results = await with_request_store({ event, state }, () => info.run(args, options));
81
+
93
82
  return json(
94
83
  /** @type {RemoteFunctionResponse} */ ({
95
84
  type: 'result',
@@ -431,7 +431,9 @@ export interface SSRNode {
431
431
  server_id?: string;
432
432
 
433
433
  /** inlined styles */
434
- inline_styles?(): MaybePromise<Record<string, string>>;
434
+ inline_styles?(): MaybePromise<
435
+ Record<string, string | ((assets: string, base: string) => string)>
436
+ >;
435
437
  /** Svelte component */
436
438
  component?: SSRComponentLoader;
437
439
  /** +page.js or +layout.js */
@@ -570,8 +572,8 @@ export type RemoteInfo =
570
572
  type: 'query_batch';
571
573
  id: string;
572
574
  name: string;
573
- /** Direct access to the function without batching etc logic, for remote functions called from the client */
574
- run: (args: any[]) => Promise<(arg: any, idx: number) => any>;
575
+ /** Direct access to the function, for remote functions called from the client */
576
+ run: (args: any[], options: SSROptions) => Promise<any[]>;
575
577
  }
576
578
  | {
577
579
  type: 'form';
@@ -0,0 +1,210 @@
1
+ import MagicString from 'magic-string';
2
+ import * as svelte from 'svelte/compiler';
3
+
4
+ /** @typedef {ReturnType<typeof import('svelte/compiler').parseCss>['children']} StyleSheetChildren */
5
+
6
+ /** @typedef {{ property: string; value: string; start: number; end: number; type: 'Declaration' }} Declaration */
7
+
8
+ const parse = svelte.parseCss
9
+ ? svelte.parseCss
10
+ : /** @param {string} css */
11
+ (css) => {
12
+ return /** @type {{ css: { children: StyleSheetChildren } }} */ (
13
+ svelte.parse(`<style>${css}</style>`)
14
+ ).css;
15
+ };
16
+
17
+ const SKIP_PARSING_REGEX = /url\(/i;
18
+
19
+ /** Capture a single url(...) so we can process them one at a time */
20
+ const URL_FUNCTION_REGEX = /url\(\s*.*?\)/gi;
21
+
22
+ /** Captures the value inside a CSS url(...) */
23
+ const URL_PARAMETER_REGEX = /url\(\s*(['"]?)(.*?)\1\s*\)/i;
24
+
25
+ /** Splits the URL if there's a query string or hash fragment */
26
+ const HASH_OR_QUERY_REGEX = /[#?]/;
27
+
28
+ /**
29
+ * Assets handled by Vite that are referenced in the stylesheet always start
30
+ * with this prefix because Vite emits them into the same directory as the CSS file
31
+ */
32
+ const VITE_ASSET_PREFIX = './';
33
+
34
+ const AST_OFFSET = '<style>'.length;
35
+
36
+ /**
37
+ * We need to fix the asset URLs in the CSS before we inline them into a document
38
+ * because they are now relative to the document instead of the CSS file.
39
+ * @param {{
40
+ * css: string;
41
+ * vite_assets: Set<string>;
42
+ * static_assets: Set<string>;
43
+ * paths_assets: string;
44
+ * base: string;
45
+ * static_asset_prefix: string;
46
+ * }} opts
47
+ * @returns {string}
48
+ */
49
+ export function fix_css_urls({
50
+ css,
51
+ vite_assets,
52
+ static_assets,
53
+ paths_assets,
54
+ base,
55
+ static_asset_prefix
56
+ }) {
57
+ // skip parsing if there are no url(...) occurrences
58
+ if (!SKIP_PARSING_REGEX.test(css)) {
59
+ return css;
60
+ }
61
+
62
+ // safe guard in case of trailing slashes (but this should never happen)
63
+ if (paths_assets.endsWith('/')) {
64
+ paths_assets = paths_assets.slice(0, -1);
65
+ }
66
+
67
+ if (base.endsWith('/')) {
68
+ base = base.slice(0, -1);
69
+ }
70
+
71
+ const s = new MagicString(css);
72
+
73
+ const parsed = parse(css);
74
+
75
+ for (const child of parsed.children) {
76
+ find_declarations(child, (declaration) => {
77
+ if (!SKIP_PARSING_REGEX.test) return;
78
+
79
+ const cleaned = tippex_comments_and_strings(declaration.value);
80
+
81
+ /** @type {string} */
82
+ let new_value = declaration.value;
83
+
84
+ /** @type {RegExpExecArray | null} */
85
+ let url_function_found;
86
+ URL_FUNCTION_REGEX.lastIndex = 0;
87
+ while ((url_function_found = URL_FUNCTION_REGEX.exec(cleaned))) {
88
+ const [url_function] = url_function_found;
89
+
90
+ // After finding a legitimate url(...), we want to operate on the original
91
+ // that may have a string inside it
92
+ const original_url_function = declaration.value.slice(
93
+ url_function_found.index,
94
+ url_function_found.index + url_function.length
95
+ );
96
+
97
+ const url_parameter_found = URL_PARAMETER_REGEX.exec(original_url_function);
98
+ if (!url_parameter_found) continue;
99
+
100
+ const [, , url] = url_parameter_found;
101
+ const [url_without_hash_or_query] = url.split(HASH_OR_QUERY_REGEX);
102
+
103
+ /** @type {string | undefined} */
104
+ let new_prefix;
105
+
106
+ // Check if it's an asset processed by Vite...
107
+ let current_prefix = url_without_hash_or_query.slice(0, VITE_ASSET_PREFIX.length);
108
+ let filename = url_without_hash_or_query.slice(VITE_ASSET_PREFIX.length);
109
+ const decoded = decodeURIComponent(filename);
110
+
111
+ if (current_prefix === VITE_ASSET_PREFIX && vite_assets.has(decoded)) {
112
+ new_prefix = paths_assets;
113
+ } else {
114
+ // ...or if it's from the static directory
115
+ current_prefix = url_without_hash_or_query.slice(0, static_asset_prefix.length);
116
+ filename = url_without_hash_or_query.slice(static_asset_prefix.length);
117
+ const decoded = decodeURIComponent(filename);
118
+
119
+ if (current_prefix === static_asset_prefix && static_assets.has(decoded)) {
120
+ new_prefix = base;
121
+ }
122
+ }
123
+
124
+ if (!new_prefix) continue;
125
+
126
+ new_value = new_value.replace(`${current_prefix}${filename}`, `${new_prefix}/${filename}`);
127
+ }
128
+
129
+ if (declaration.value === new_value) return;
130
+
131
+ if (!svelte.parseCss) {
132
+ declaration.start = declaration.start - AST_OFFSET;
133
+ declaration.end = declaration.end - AST_OFFSET;
134
+ }
135
+
136
+ s.update(declaration.start, declaration.end, `${declaration.property}: ${new_value}`);
137
+ });
138
+ }
139
+
140
+ return s.toString();
141
+ }
142
+
143
+ /**
144
+ * @param {StyleSheetChildren[0]} rule
145
+ * @param {(declaration: Declaration) => void} callback
146
+ */
147
+ function find_declarations(rule, callback) {
148
+ // Vite already inlines relative @import rules, so we don't need to handle them here
149
+ if (!rule.block) return;
150
+
151
+ for (const child of rule.block.children) {
152
+ if (child.type !== 'Declaration') {
153
+ find_declarations(child, callback);
154
+ continue;
155
+ }
156
+ callback(child);
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Replaces comment and string contents with whitespace.
162
+ * @param {string} value
163
+ * @returns {string}
164
+ */
165
+ export function tippex_comments_and_strings(value) {
166
+ let new_value = '';
167
+ let escaped = false;
168
+ let in_comment = false;
169
+
170
+ /** @type {null | '"' | "'"} */
171
+ let quote_mark = null;
172
+
173
+ let i = 0;
174
+ while (i < value.length) {
175
+ const char = value[i];
176
+
177
+ if (in_comment) {
178
+ if (char === '*' && value[i + 1] === '/') {
179
+ in_comment = false;
180
+ new_value += char;
181
+ } else {
182
+ new_value += ' ';
183
+ }
184
+ } else if (!quote_mark && char === '/' && value[i + 1] === '*') {
185
+ in_comment = true;
186
+ new_value += '/*';
187
+ i++; // skip the '*' since we already added it
188
+ } else if (escaped) {
189
+ new_value += ' ';
190
+ escaped = false;
191
+ } else if (quote_mark && char === '\\') {
192
+ escaped = true;
193
+ new_value += ' ';
194
+ } else if (char === quote_mark) {
195
+ quote_mark = null;
196
+ new_value += char;
197
+ } else if (quote_mark) {
198
+ new_value += ' ';
199
+ } else if (quote_mark === null && (char === '"' || char === "'")) {
200
+ quote_mark = char;
201
+ new_value += char;
202
+ } else {
203
+ new_value += char;
204
+ }
205
+
206
+ i++;
207
+ }
208
+
209
+ return new_value;
210
+ }
@@ -162,8 +162,12 @@ export function exec(match, params, matchers) {
162
162
 
163
163
  // if `value` is undefined, it means this is an optional or rest parameter
164
164
  if (value === undefined) {
165
- if (param.rest) result[param.name] = '';
166
- continue;
165
+ if (param.rest) {
166
+ // We need to allow the matcher to run so that it can decide if this optional rest param should be allowed to match
167
+ value = '';
168
+ } else {
169
+ continue;
170
+ }
167
171
  }
168
172
 
169
173
  if (!param.matcher || matchers[param.matcher](value)) {
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.50.1';
4
+ export const VERSION = '2.50.2';
package/types/index.d.ts CHANGED
@@ -2560,7 +2560,9 @@ declare module '@sveltejs/kit' {
2560
2560
  server_id?: string;
2561
2561
 
2562
2562
  /** inlined styles */
2563
- inline_styles?(): MaybePromise<Record<string, string>>;
2563
+ inline_styles?(): MaybePromise<
2564
+ Record<string, string | ((assets: string, base: string) => string)>
2565
+ >;
2564
2566
  /** Svelte component */
2565
2567
  component?: SSRComponentLoader;
2566
2568
  /** +page.js or +layout.js */
@@ -217,6 +217,6 @@
217
217
  null,
218
218
  null
219
219
  ],
220
- "mappings": "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",
220
+ "mappings": ";;;;;;;;MAgCKA,IAAIA;;;;;kBAKQC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAiCZC,cAAcA;;;;;;aAMdC,cAAcA;;;;;;;;MAQrBC,aAAaA;;;;;OAKJC,YAAYA;;kBAETC,aAAaA;;;;;;MAMzBC,qBAAqBA;;;;;;;;;;;kBAWTC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA8IPC,MAAMA;;;;;;;;;;;kBAWNC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA4DPC,QAAQA;;;;;;;;kBAQRC,SAASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAykBdC,MAAMA;;;;;;;;;;;aAWNC,iBAAiBA;;;;;;;;;;;;aAYjBC,qBAAqBA;;;;;;;;;aASrBC,iBAAiBA;;;;;;;;;;aAUjBC,WAAWA;;;;;;;;;;aAUXC,UAAUA;;;;;;aAMVC,UAAUA;;;;;;aAMVC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;aA0BPC,SAASA;;;;;kBAKJC,WAAWA;;;;;;;;;;;;aAYhBC,IAAIA;;;;;;;;;;;;kBAYCC,SAASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAyHTC,eAAeA;;;;;;;;;;;;;;;;;;;;;;;;;;kBA0BfC,gBAAgBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAgCrBC,cAAcA;;kBAETC,cAAcA;;;;;;;;;;;;;;;;;;;;kBAoBdC,eAAeA;;;;;;;;;;;;;;;;;;;;;;kBAsBfC,kBAAkBA;;;;;;;;;;;;;;;;;;;kBAmBlBC,oBAAoBA;;;;;;;;;;;;;;;;;;;;;;;;kBAwBpBC,kBAAkBA;;;;;;;;;;;;;;;;;;;;;;kBAsBlBC,cAAcA;;;;;;;;;;;;;;;;;;;;;;;;aAwBnBC,UAAUA;;;;;;;;;aASVC,cAAcA;;;;;;;;;;aAUdC,UAAUA;;;;;;;;;;;;;;;;;;aAkBVC,aAAaA;;;;;;;;;;;;;;;;;;;kBAmBRC,IAAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA8CTC,YAAYA;;kBAEPC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA+GjBC,cAAcA;;;;;kBAKTC,cAAcA;;;;;;;;;;;;;;;;;;;;;;;kBAuBdC,eAAeA;;;;;;;;;;;;;;;cAenBC,MAAMA;;;;;;kBAMFC,iBAAiBA;;;;;;;kBAOjBC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;;aAyBhBC,UAAUA;;;;;;;kBAOLC,eAAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAkFpBC,MAAMA;;;;;;;;;;aAUNC,OAAOA;;;;;;;;;;;;;;;;aAgBPC,YAAYA;;;;;;;;;;;;kBC1tDXC,SAASA;;;;;;;;;;kBAqBTC,QAAQA;;;;;;;aDkuDTC,cAAcA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA6BTC,QAAQA;;;;;;MAMpBC,uBAAuBA;;;MAGvBC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA6BLC,mBAAmBA;;;;;MAK1BC,iBAAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAwCjBC,sBAAsBA;;;;;;;;;aASfC,oBAAoBA;;MAE3BC,MAAMA;;;;;;;;;;;aAWCC,eAAeA;;;;;;;;;;;;;;MActBC,wBAAwBA;;;;;MAKxBC,YAAYA;;;;;;;;;;;;;;;;;;MAkBZC,oBAAoBA;;;;;;;;;;;;;;;aAebC,gBAAgBA;;;;;;;;;;;;;;;;MAgBvBC,mBAAmBA;;;;MAInBC,UAAUA;;kBAEEC,eAAeA;;;;kBAIfC,eAAeA;;;;;;;MAO3BC,SAASA;;;;;;;;;;;;;aAaFC,YAAYA;;;;;;;;;;;;;;;;;;kBAkBPC,eAAeA;;;;;;;;aAQpBC,UAAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAuDVC,aAAaA;;;;;;;;aAQbC,cAAcA;;;;;;;;;;;;;;;;;;aAkBdC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAqCNC,mBAAmBA;;;;;;;;aAQxBC,uBAAuBA;;;;;aAKvBC,mBAAmBA;WExnEdC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAkDZC,GAAGA;;;;;;;;;;;;;;;;;;;;;WAqBHC,aAAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAmElBC,UAAUA;;WAELC,MAAMA;;;;;;;;;MASXC,YAAYA;;WAEPC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAmCXC,yBAAyBA;;;;;;;;;;WAUzBC,yBAAyBA;;;;WAIzBC,sCAAsCA;;;;WAItCC,4BAA4BA;;;;MAIjCC,8BAA8BA;MAC9BC,8BAA8BA;MAC9BC,iCAAiCA;;;;;MAKjCC,2CAA2CA;;;;;;aAM3CC,eAAeA;;WAIVC,cAAcA;;;;;WAKdC,YAAYA;;;;;;MAMjBC,aAAaA;;MAEbC,KAAKA;WChMAC,KAAKA;;;;;;WAeLC,SAASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAuHTC,YAAYA;;;;;;;;;;;;;WAkBZC,QAAQA;;;;;;;;;;;;;;MAgCbC,iBAAiBA;;;;;;;;;WAWZC,UAAUA;;;;;;;;;;;;;WAaVC,SAASA;;;;;;;;;;;;;;;;;;;;;;;WAuHTC,YAAYA;;;;;;;;;;;;;;;;MAgBjBC,kBAAkBA;;WAEbC,aAAaA;;;;;;;;;;;WAWbC,UAAUA;;;;;;;;;;;WAWVC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;MAyBZC,aAAaA;;WA8BRC,eAAeA;;;;;;MAMpBC,uBAAuBA;;MAGvBC,WAAWA;;;;;;;;WAQNC,QAAQA;;;;;;;;;WASRC,cAAcA;;;;;;;;;MA+CnBC,eAAeA;;;;;MAKfC,kBAAkBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBC/cdC,WAAWA;;;;;;;;;;;;;;;;;;;iBAsBXC,QAAQA;;;;;iBAiBRC,UAAUA;;;;;;iBASVC,IAAIA;;;;;;iBA4BJC,IAAIA;;;;;;;;;;;;;;;;iBAkDJC,eAAeA;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+BfC,OAAOA;;;;;;iBAYPC,iBAAiBA;;;;;;;;;;;;;;iBAmBjBC,YAAYA;;;;;;;cClRfC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBC4EJC,QAAQA;;;;;;iBC4BFC,UAAUA;;;;;;iBAgDVC,WAAWA;;;;;iBAgFjBC,oBAAoBA;;;;;;;;;;;iBCzNpBC,gBAAgBA;;;;;;;;;iBCqHVC,SAASA;;;;;;;;;cCpIlBC,OAAOA;;;;;cAKPC,GAAGA;;;;;cAKHC,QAAQA;;;;;cAKRC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;iBCYJC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;iBAgDXC,OAAOA;;;;;;;iBCkuEDC,WAAWA;;;;;;;;;;;iBAhVjBC,aAAaA;;;;;;;;;;;;iBAiBbC,cAAcA;;;;;;;;;;iBAedC,UAAUA;;;;;iBASVC,qBAAqBA;;;;;;;;;;iBA8BrBC,IAAIA;;;;;;;;;;;;;;;;;;;;;;;;;iBAsCJC,UAAUA;;;;iBA0BVC,aAAaA;;;;;iBAebC,UAAUA;;;;;;;;;;;;;;iBAuBJC,WAAWA;;;;;;;;;;;;;;;;;;iBAoCXC,WAAWA;;;;;iBAsCjBC,SAASA;;;;;iBA+CTC,YAAYA;MV3mEhBrE,YAAYA;;;;;;;;;;;;;;YW/IbsE,IAAIA;;;;;;;;;YASJC,MAAMA;;;;;iBAKDC,YAAYA;;;MCxBhBC,WAAWA;;;;;;;;;;;;;;;;;;;;;iBCqBPC,KAAKA;;;;;;;;;;;;;;;;;;;;;iBA6BLC,OAAOA;;;;;;;;;;;;;;;;;;;;iBCjCPC,IAAIA;;;;;;;;iBCSJC,eAAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MdqcnBC,8BAA8BA;MDtU9B9E,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cgB1GX+E,IAAIA;;;;;cAQJC,UAAUA;;;;;;;;;;;cAMVC,OAAOA;;;;;;;;;iBCrDPC,SAASA;;;;;;;;;;;;;;;cAyBTH,IAAIA;;;;;;;;;;cAiBJC,UAAUA;;;;;;;;cAeVC,OAAOA",
221
221
  "ignoreList": []
222
222
  }