@sveltejs/kit 2.52.0 → 2.53.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.52.0",
3
+ "version": "2.53.0",
4
4
  "description": "SvelteKit is the fastest way to build Svelte apps",
5
5
  "keywords": [
6
6
  "framework",
@@ -23,12 +23,11 @@
23
23
  "@types/cookie": "^0.6.0",
24
24
  "acorn": "^8.14.1",
25
25
  "cookie": "^0.6.0",
26
- "devalue": "^5.6.2",
26
+ "devalue": "^5.6.3",
27
27
  "esm-env": "^1.2.2",
28
28
  "kleur": "^4.1.5",
29
29
  "magic-string": "^0.30.5",
30
30
  "mrmime": "^2.0.0",
31
- "sade": "^1.8.1",
32
31
  "set-cookie-parser": "^3.0.0",
33
32
  "sirv": "^3.0.0"
34
33
  },
@@ -41,18 +40,18 @@
41
40
  "@types/set-cookie-parser": "^2.4.7",
42
41
  "dts-buddy": "^0.6.2",
43
42
  "rollup": "^4.14.2",
44
- "svelte": "^5.48.4",
43
+ "svelte": "^5.51.5",
45
44
  "svelte-preprocess": "^6.0.0",
46
45
  "typescript": "^5.3.3",
47
46
  "vite": "^6.3.5",
48
47
  "vitest": "^4.0.0"
49
48
  },
50
49
  "peerDependencies": {
51
- "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0",
50
+ "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0",
52
51
  "@opentelemetry/api": "^1.0.0",
53
52
  "svelte": "^4.0.0 || ^5.0.0-next.0",
54
53
  "typescript": "^5.3.3",
55
- "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0"
54
+ "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0"
56
55
  },
57
56
  "peerDependenciesMeta": {
58
57
  "@opentelemetry/api": {
package/src/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import fs from 'node:fs';
2
2
  import process from 'node:process';
3
+ import { parseArgs } from 'node:util';
3
4
  import colors from 'kleur';
4
- import sade from 'sade';
5
5
  import { load_config } from './core/config/index.js';
6
6
  import { coalesce_to_error } from './utils/error.js';
7
7
 
@@ -20,28 +20,76 @@ function handle_error(e) {
20
20
  }
21
21
 
22
22
  const pkg = JSON.parse(fs.readFileSync(new URL('../package.json', import.meta.url), 'utf-8'));
23
- const prog = sade('svelte-kit').version(pkg.version);
24
-
25
- prog
26
- .command('sync')
27
- .describe('Synchronise generated type definitions')
28
- .option('--mode', 'Specify a mode for loading environment variables', 'development')
29
- .action(async ({ mode }) => {
30
- const config_files = ['js', 'ts']
31
- .map((ext) => `svelte.config.${ext}`)
32
- .filter((f) => fs.existsSync(f));
33
- if (config_files.length === 0) {
34
- console.warn(`Missing Svelte config file in ${process.cwd()} — skipping`);
35
- return;
36
- }
37
-
38
- try {
39
- const config = await load_config();
40
- const sync = await import('./core/sync/sync.js');
41
- sync.all_types(config, mode);
42
- } catch (error) {
43
- handle_error(error);
44
- }
23
+
24
+ const help = `
25
+ Usage: svelte-kit <command> [options]
26
+
27
+ Commands:
28
+ sync Synchronise generated type definitions
29
+
30
+ Options:
31
+ --version, -v Show version number
32
+ --help, -h Show this help message
33
+
34
+ Sync Options:
35
+ --mode <mode> Specify a mode for loading environment variables (default: development)
36
+ `;
37
+
38
+ let parsed;
39
+ try {
40
+ parsed = parseArgs({
41
+ options: {
42
+ version: { type: 'boolean', short: 'v' },
43
+ help: { type: 'boolean', short: 'h' },
44
+ mode: { type: 'string', default: 'development' }
45
+ },
46
+ allowPositionals: true,
47
+ strict: true
45
48
  });
49
+ } catch (err) {
50
+ const error = /** @type {Error} */ (err);
51
+ console.error(colors.bold().red(`> ${error.message}`));
52
+ console.log(help);
53
+ process.exit(1);
54
+ }
55
+
56
+ const { values, positionals } = parsed;
57
+
58
+ if (values.version) {
59
+ console.log(pkg.version);
60
+ process.exit(0);
61
+ }
46
62
 
47
- prog.parse(process.argv, { unknown: (arg) => `Unknown option: ${arg}` });
63
+ if (values.help) {
64
+ console.log(help);
65
+ process.exit(0);
66
+ }
67
+
68
+ const command = positionals[0];
69
+
70
+ if (!command) {
71
+ console.log(help);
72
+ process.exit(0);
73
+ }
74
+
75
+ if (command === 'sync') {
76
+ const config_files = ['js', 'ts']
77
+ .map((ext) => `svelte.config.${ext}`)
78
+ .filter((f) => fs.existsSync(f));
79
+ if (config_files.length === 0) {
80
+ console.warn(`Missing Svelte config file in ${process.cwd()} — skipping`);
81
+ process.exit(0);
82
+ }
83
+
84
+ try {
85
+ const config = await load_config();
86
+ const sync = await import('./core/sync/sync.js');
87
+ sync.all_types(config, values.mode);
88
+ } catch (error) {
89
+ handle_error(error);
90
+ }
91
+ } else {
92
+ console.error(colors.bold().red(`> Unknown command: ${command}`));
93
+ console.log(help);
94
+ process.exit(1);
95
+ }
@@ -19,7 +19,7 @@ import { find_server_assets } from '../generate_manifest/find_server_assets.js';
19
19
  import { reserved } from '../env.js';
20
20
 
21
21
  const pipe = promisify(pipeline);
22
- const extensions = ['.html', '.js', '.mjs', '.json', '.css', '.svg', '.xml', '.wasm'];
22
+ const extensions = ['.html', '.js', '.mjs', '.json', '.css', '.svg', '.xml', '.wasm', '.txt'];
23
23
 
24
24
  /**
25
25
  * Creates the Builder which is passed to adapters for building the application.
@@ -1,6 +1,6 @@
1
1
  import fs from 'node:fs';
2
2
  import { mkdirp } from '../../../utils/filesystem.js';
3
- import { filter_fonts, find_deps, resolve_symlinks } from './utils.js';
3
+ import { create_function_as_string, filter_fonts, find_deps, resolve_symlinks } from './utils.js';
4
4
  import { s } from '../../../utils/misc.js';
5
5
  import { normalizePath } from 'vite';
6
6
  import { basename } from 'node:path';
@@ -78,8 +78,9 @@ export function build_server_nodes(
78
78
 
79
79
  // only convert to a function if we have adjusted any URLs
80
80
  if (css !== transformed_css) {
81
- return `function css(assets, base) { return \`${s(transformed_css).slice(1, -1)}\`; }`;
81
+ return create_function_as_string('css', ['assets', 'base'], transformed_css);
82
82
  }
83
+
83
84
  return s(css);
84
85
  };
85
86
  }
@@ -1,6 +1,7 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import { normalizePath } from 'vite';
4
+ import { s } from '../../../utils/misc.js';
4
5
 
5
6
  /**
6
7
  * Adds transitive JS and CSS dependencies to the js and css inputs.
@@ -129,3 +130,18 @@ export function filter_fonts(assets) {
129
130
  export function assets_base(config) {
130
131
  return (config.paths.assets || config.paths.base || '.') + '/';
131
132
  }
133
+
134
+ /**
135
+ * Writes a function with arguments used by a template literal.
136
+ * This helps us store strings in a module and inject values at runtime.
137
+ * @param {string} name The name of the function
138
+ * @param {string[]} placeholder_names The names of the placeholders in the string
139
+ * @param {string} str A string with placeholders such as "Hello ${arg0}".
140
+ * It must have backticks and dollar signs escaped.
141
+ * @returns {string} The function written as a string
142
+ */
143
+ export function create_function_as_string(name, placeholder_names, str) {
144
+ str = s(str).slice(1, -1);
145
+ const args = placeholder_names ? placeholder_names.join(', ') : '';
146
+ return `function ${name}(${args}) { return \`${str}\`; }`;
147
+ }
@@ -190,8 +190,8 @@ async function kit({ svelte_config }) {
190
190
  /** @type {import('vite')} */
191
191
  const vite = await import_peer('vite');
192
192
 
193
- // @ts-ignore `vite.rolldownVersion` only exists in `rolldown-vite`
194
- const isRolldown = !!vite.rolldownVersion;
193
+ // @ts-ignore `vite.rolldownVersion` only exists in `vite 8`
194
+ const is_rolldown = !!vite.rolldownVersion;
195
195
 
196
196
  const { kit } = svelte_config;
197
197
  const out = `${kit.outDir}/output`;
@@ -296,23 +296,6 @@ async function kit({ svelte_config }) {
296
296
  `${kit.files.routes}/**/+*.{svelte,js,ts}`,
297
297
  `!${kit.files.routes}/**/+*server.*`
298
298
  ],
299
- esbuildOptions: {
300
- plugins: [
301
- {
302
- name: 'vite-plugin-sveltekit-setup:optimize',
303
- setup(build) {
304
- if (!kit.experimental.remoteFunctions) return;
305
-
306
- const filter = new RegExp(
307
- `.remote(${kit.moduleExtensions.join('|')})$`.replaceAll('.', '\\.')
308
- );
309
-
310
- // treat .remote.js files as empty for the purposes of prebundling
311
- build.onLoad({ filter }, () => ({ contents: '' }));
312
- }
313
- }
314
- ]
315
- },
316
299
  exclude: [
317
300
  // Without this SvelteKit will be prebundled on the client, which means we end up with two versions of Redirect etc.
318
301
  // Also see https://github.com/sveltejs/kit/issues/5952#issuecomment-1218844057
@@ -340,6 +323,40 @@ async function kit({ svelte_config }) {
340
323
  }
341
324
  };
342
325
 
326
+ if (kit.experimental.remoteFunctions) {
327
+ // treat .remote.js files as empty for the purposes of prebundling
328
+ // detects rolldown to avoid a warning message in vite 8 beta
329
+ const remote_id_filter = new RegExp(
330
+ `.remote(${kit.moduleExtensions.join('|')})$`.replaceAll('.', '\\.')
331
+ );
332
+ new_config.optimizeDeps ??= {}; // for some reason ts says this could be undefined even though it was set above
333
+ if (is_rolldown) {
334
+ // @ts-ignore
335
+ new_config.optimizeDeps.rolldownOptions ??= {};
336
+ // @ts-ignore
337
+ new_config.optimizeDeps.rolldownOptions.plugins ??= [];
338
+ // @ts-ignore
339
+ new_config.optimizeDeps.rolldownOptions.plugins.push({
340
+ name: 'vite-plugin-sveltekit-setup:optimize-remote-functions',
341
+ load: {
342
+ filter: { id: remote_id_filter },
343
+ handler() {
344
+ return '';
345
+ }
346
+ }
347
+ });
348
+ } else {
349
+ new_config.optimizeDeps.esbuildOptions ??= {};
350
+ new_config.optimizeDeps.esbuildOptions.plugins ??= [];
351
+ new_config.optimizeDeps.esbuildOptions.plugins.push({
352
+ name: 'vite-plugin-sveltekit-setup:optimize-remote-functions',
353
+ setup(build) {
354
+ build.onLoad({ filter: remote_id_filter }, () => ({ contents: '' }));
355
+ }
356
+ });
357
+ }
358
+ }
359
+
343
360
  const define = {
344
361
  __SVELTEKIT_APP_DIR__: s(kit.appDir),
345
362
  __SVELTEKIT_EMBEDDED__: s(kit.embedded),
@@ -920,7 +937,7 @@ async function kit({ svelte_config }) {
920
937
  preserveEntrySignatures: 'strict',
921
938
  onwarn(warning, handler) {
922
939
  if (
923
- (isRolldown
940
+ (is_rolldown
924
941
  ? warning.code === 'IMPORT_IS_UNDEFINED'
925
942
  : warning.code === 'MISSING_EXPORT') &&
926
943
  warning.id === `${kit.outDir}/generated/client-optimized/app.js`
@@ -41,7 +41,7 @@ export async function match(url) {
41
41
 
42
42
  const { reroute } = await get_hooks();
43
43
 
44
- let resolved_path = url.pathname;
44
+ let resolved_path;
45
45
 
46
46
  try {
47
47
  resolved_path = decode_pathname(
@@ -565,7 +565,11 @@ async function _preload_code(url) {
565
565
  const route = (await get_navigation_intent(url, false))?.route;
566
566
 
567
567
  if (route) {
568
- await Promise.all([...route.layouts, route.leaf].map((load) => load?.[1]()));
568
+ await Promise.all(
569
+ /** @type {[has_server_load: boolean, node_loader: import('types').CSRPageNodeLoader][]} */ (
570
+ [...route.layouts, route.leaf].filter(Boolean)
571
+ ).map((load) => load[1]())
572
+ );
569
573
  }
570
574
  }
571
575
 
@@ -1707,6 +1711,7 @@ async function navigate({
1707
1711
  if (started) {
1708
1712
  const after_navigate = (
1709
1713
  await Promise.all(
1714
+ // eslint-disable-next-line @typescript-eslint/await-thenable -- we need to await because they can be asynchronous
1710
1715
  Array.from(on_navigate_callbacks, (fn) =>
1711
1716
  fn(/** @type {import('@sveltejs/kit').OnNavigate} */ (nav.navigation))
1712
1717
  )
@@ -2279,7 +2284,7 @@ export function pushState(url, state) {
2279
2284
  devalue.stringify(state);
2280
2285
  } catch (error) {
2281
2286
  // @ts-expect-error
2282
- throw new Error(`Could not serialize state${error.path}`);
2287
+ throw new Error(`Could not serialize state${error.path}`, { cause: error });
2283
2288
  }
2284
2289
  }
2285
2290
 
@@ -2326,7 +2331,7 @@ export function replaceState(url, state) {
2326
2331
  devalue.stringify(state);
2327
2332
  } catch (error) {
2328
2333
  // @ts-expect-error
2329
- throw new Error(`Could not serialize state${error.path}`);
2334
+ throw new Error(`Could not serialize state${error.path}`, { cause: error });
2330
2335
  }
2331
2336
  }
2332
2337
 
@@ -53,6 +53,7 @@ function merge_with_server_issues(form_data, current_issues, client_issues) {
53
53
  */
54
54
  export function form(id) {
55
55
  /** @type {Map<any, { count: number, instance: RemoteForm<T, U> }>} */
56
+ // eslint-disable-next-line svelte/prefer-svelte-reactivity -- we don't need reactivity for this
56
57
  const instances = new Map();
57
58
 
58
59
  /** @param {string | number | boolean} [key] */
@@ -110,6 +111,10 @@ export function form(id) {
110
111
 
111
112
  submitted = true;
112
113
 
114
+ // Increment pending count immediately so that `pending` reflects
115
+ // the in-progress state during async preflight validation
116
+ pending_count++;
117
+
113
118
  const validated = await preflight_schema?.['~standard'].validate(data);
114
119
 
115
120
  if (validated?.issues) {
@@ -118,9 +123,15 @@ export function form(id) {
118
123
  raw_issues,
119
124
  validated.issues.map((issue) => normalize_issue(issue, false))
120
125
  );
126
+ pending_count--;
121
127
  return;
122
128
  }
123
129
 
130
+ // Preflight passed - clear stale client-side preflight issues
131
+ if (preflight_schema) {
132
+ raw_issues = raw_issues.filter((issue) => issue.server);
133
+ }
134
+
124
135
  // TODO 3.0 remove this warning
125
136
  if (DEV) {
126
137
  const error = () => {
@@ -174,9 +185,6 @@ export function form(id) {
174
185
  entry.count++;
175
186
  }
176
187
 
177
- // Increment pending count when submission starts
178
- pending_count++;
179
-
180
188
  /** @type {Array<Query<any> | RemoteQueryOverride>} */
181
189
  let updates = [];
182
190
 
@@ -277,6 +285,7 @@ export function form(id) {
277
285
 
278
286
  if (method !== 'post') return;
279
287
 
288
+ // eslint-disable-next-line svelte/prefer-svelte-reactivity
280
289
  const action = new URL(
281
290
  // We can't do submitter.formAction directly because that property is always set
282
291
  event.submitter?.hasAttribute('formaction')
@@ -319,7 +328,8 @@ export function form(id) {
319
328
 
320
329
  form.addEventListener('submit', onsubmit);
321
330
 
322
- form.addEventListener('input', (e) => {
331
+ /** @param {Event} e */
332
+ const handle_input = (e) => {
323
333
  // strictly speaking it can be an HTMLTextAreaElement or HTMLSelectElement
324
334
  // but that makes the types unnecessarily awkward
325
335
  const element = /** @type {HTMLInputElement} */ (e.target);
@@ -398,17 +408,24 @@ export function form(id) {
398
408
  name = name.replace(/^[nb]:/, '');
399
409
 
400
410
  touched[name] = true;
401
- });
411
+ };
412
+
413
+ form.addEventListener('input', handle_input);
402
414
 
403
- form.addEventListener('reset', async () => {
415
+ const handle_reset = async () => {
404
416
  // need to wait a moment, because the `reset` event occurs before
405
417
  // the inputs are actually updated (so that it can be cancelled)
406
418
  await tick();
407
419
 
408
420
  input = convert_formdata(new FormData(form));
409
- });
421
+ };
422
+
423
+ form.addEventListener('reset', handle_reset);
410
424
 
411
425
  return () => {
426
+ form.removeEventListener('submit', onsubmit);
427
+ form.removeEventListener('input', handle_input);
428
+ form.removeEventListener('reset', handle_reset);
412
429
  element = null;
413
430
  preflight_schema = undefined;
414
431
  };
@@ -43,6 +43,7 @@ export function query(id) {
43
43
  */
44
44
  export function query_batch(id) {
45
45
  /** @type {Map<string, Array<{resolve: (value: any) => void, reject: (error: any) => void}>>} */
46
+ // eslint-disable-next-line svelte/prefer-svelte-reactivity -- we don't need reactivity for this
46
47
  let batching = new Map();
47
48
 
48
49
  return create_remote_function(id, (cache_key, payload) => {
@@ -66,6 +67,7 @@ export function query_batch(id) {
66
67
  // and flushes could reveal more queries that should be batched.
67
68
  setTimeout(async () => {
68
69
  const batched = batching;
70
+ // eslint-disable-next-line svelte/prefer-svelte-reactivity
69
71
  batching = new Map();
70
72
 
71
73
  try {
@@ -254,14 +254,30 @@ export async function deserialize_binary_form(request) {
254
254
  const file_offsets_buffer = await get_buffer(HEADER_BYTES + data_length, file_offsets_length);
255
255
  if (!file_offsets_buffer) throw deserialize_error('file offset table too short');
256
256
 
257
- file_offsets = /** @type {Array<number>} */ (
258
- JSON.parse(text_decoder.decode(file_offsets_buffer))
259
- );
257
+ const parsed_offsets = JSON.parse(text_decoder.decode(file_offsets_buffer));
258
+
259
+ if (
260
+ !Array.isArray(parsed_offsets) ||
261
+ parsed_offsets.some((n) => typeof n !== 'number' || !Number.isInteger(n) || n < 0)
262
+ ) {
263
+ throw deserialize_error('invalid file offset table');
264
+ }
265
+
266
+ file_offsets = /** @type {Array<number>} */ (parsed_offsets);
260
267
  files_start_offset = HEADER_BYTES + data_length + file_offsets_length;
261
268
  }
262
269
 
263
270
  const [data, meta] = devalue.parse(text_decoder.decode(data_buffer), {
264
271
  File: ([name, type, size, last_modified, index]) => {
272
+ if (
273
+ typeof name !== 'string' ||
274
+ typeof type !== 'string' ||
275
+ typeof size !== 'number' ||
276
+ typeof last_modified !== 'number' ||
277
+ typeof index !== 'number'
278
+ ) {
279
+ throw deserialize_error('invalid file metadata');
280
+ }
265
281
  if (files_start_offset + file_offsets[index] + size > content_length) {
266
282
  throw deserialize_error('file data overflow');
267
283
  }
@@ -377,7 +393,8 @@ class LazyFile {
377
393
  return new ReadableStream({
378
394
  start: async (controller) => {
379
395
  let chunk_start = 0;
380
- let start_chunk = null;
396
+ /** @type {Uint8Array} */
397
+ let start_chunk;
381
398
  for (chunk_index = 0; ; chunk_index++) {
382
399
  const chunk = await this.#get_chunk(chunk_index);
383
400
  if (!chunk) return null;
@@ -340,7 +340,8 @@ function try_serialize(data, fn, route_id) {
340
340
  // if someone tries to use `json()` in their action
341
341
  if (data instanceof Response) {
342
342
  throw new Error(
343
- `Data returned from action inside ${route_id} is not serializable. Form actions need to return plain objects or fail(). E.g. return { success: true } or return fail(400, { message: "invalid" });`
343
+ `Data returned from action inside ${route_id} is not serializable. Form actions need to return plain objects or fail(). E.g. return { success: true } or return fail(400, { message: "invalid" });`,
344
+ { cause: e }
344
345
  );
345
346
  }
346
347
 
@@ -348,7 +349,7 @@ function try_serialize(data, fn, route_id) {
348
349
  if ('path' in error) {
349
350
  let message = `Data returned from action inside ${route_id} is not serializable: ${error.message}`;
350
351
  if (error.path !== '') message += ` (data.${error.path})`;
351
- throw new Error(message);
352
+ throw new Error(message, { cause: e });
352
353
  }
353
354
 
354
355
  throw error;
@@ -52,7 +52,6 @@ export function server_data_serializer(event, event_state, options) {
52
52
  options,
53
53
  new Error(`Failed to serialize promise while rendering ${event.route.id}`)
54
54
  );
55
- data = undefined;
56
55
  str = devalue.uneval([, error], replacer);
57
56
  }
58
57
 
@@ -99,7 +98,7 @@ export function server_data_serializer(event, event_state, options) {
99
98
  } catch (e) {
100
99
  // @ts-expect-error
101
100
  e.path = e.path.slice(1);
102
- throw new Error(clarify_devalue_error(event, /** @type {any} */ (e)));
101
+ throw new Error(clarify_devalue_error(event, /** @type {any} */ (e)), { cause: e });
103
102
  }
104
103
  },
105
104
 
@@ -209,7 +208,7 @@ export function server_data_serializer_json(event, event_state, options) {
209
208
  } catch (e) {
210
209
  // @ts-expect-error
211
210
  e.path = 'data' + e.path;
212
- throw new Error(clarify_devalue_error(event, /** @type {any} */ (e)));
211
+ throw new Error(clarify_devalue_error(event, /** @type {any} */ (e)), { cause: e });
213
212
  }
214
213
  },
215
214
 
@@ -108,6 +108,8 @@ async function handle_remote_call_internal(event, state, options, manifest, id)
108
108
 
109
109
  const { data, meta, form_data } = await deserialize_binary_form(event.request);
110
110
 
111
+ form_client_refreshes = meta.remote_refreshes;
112
+
111
113
  // If this is a keyed form instance (created via form.for(key)), add the key to the form data (unless already set)
112
114
  // Note that additional_args will only be set if the form is not enhanced, as enhanced forms transfer the key inside `data`.
113
115
  if (additional_args && !('id' in data)) {
package/src/utils/css.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import MagicString from 'magic-string';
2
2
  import * as svelte from 'svelte/compiler';
3
+ import { escape_for_interpolation } from './escape.js';
3
4
 
4
5
  /** @typedef {ReturnType<typeof import('svelte/compiler').parseCss>['children']} StyleSheetChildren */
5
6
 
@@ -59,6 +60,8 @@ export function fix_css_urls({
59
60
  return css;
60
61
  }
61
62
 
63
+ css = escape_for_interpolation(css);
64
+
62
65
  // safe guard in case of trailing slashes (but this should never happen)
63
66
  if (paths_assets.endsWith('/')) {
64
67
  paths_assets = paths_assets.slice(0, -1);
@@ -60,3 +60,12 @@ export function escape_html(str, is_attr) {
60
60
 
61
61
  return escaped_str;
62
62
  }
63
+
64
+ /**
65
+ * Escapes backticks and dollar signs so that they can be safely used in template literals.
66
+ * @param {string} str
67
+ * @returns {string} escaped string
68
+ */
69
+ export function escape_for_interpolation(str) {
70
+ return str.replaceAll('`', '\\`').replaceAll('$', '\\$');
71
+ }
@@ -8,7 +8,9 @@ export function mkdirp(dir) {
8
8
  } catch (/** @type {any} */ e) {
9
9
  if (e.code === 'EEXIST') {
10
10
  if (!fs.statSync(dir).isDirectory()) {
11
- throw new Error(`Cannot create directory ${dir}, a file already exists at this position`);
11
+ throw new Error(`Cannot create directory ${dir}, a file already exists at this position`, {
12
+ cause: e
13
+ });
12
14
  }
13
15
  return;
14
16
  }
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.52.0';
4
+ export const VERSION = '2.53.0';
@@ -223,6 +223,6 @@
223
223
  null,
224
224
  null
225
225
  ],
226
- "mappings": "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",
226
+ "mappings": "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",
227
227
  "ignoreList": []
228
228
  }