From 313d8c9f47978a990361ce0385b0db713362e6fb Mon Sep 17 00:00:00 2001 From: dominikg Date: Wed, 15 May 2024 00:45:50 +0200 Subject: [PATCH] feat: add rootDir option and set __svelte_meta.file like in svelte4 --- .changeset/khaki-mails-scream.md | 5 +++++ .changeset/kind-doors-grin.md | 5 +++++ .../phases/3-transform/client/transform-client.js | 10 ++++++---- packages/svelte/src/compiler/types/index.d.ts | 9 ++++++++- packages/svelte/src/compiler/validate-options.js | 4 ++++ packages/svelte/src/internal/client/dev/elements.js | 2 +- .../src/internal/client/dom/blocks/svelte-element.js | 2 +- .../samples/non-local-mutation-discouraged/_config.js | 2 +- .../non-local-mutation-with-binding-2/_config.js | 2 +- .../non-local-mutation-with-binding-3/_config.js | 2 +- .../samples/svelte-meta-dynamic/_config.js | 6 +++--- .../tests/runtime-runes/samples/svelte-meta/_config.js | 6 +++--- 12 files changed, 39 insertions(+), 16 deletions(-) create mode 100644 .changeset/khaki-mails-scream.md create mode 100644 .changeset/kind-doors-grin.md diff --git a/.changeset/khaki-mails-scream.md b/.changeset/khaki-mails-scream.md new file mode 100644 index 0000000000..c3fc2c00f2 --- /dev/null +++ b/.changeset/khaki-mails-scream.md @@ -0,0 +1,5 @@ +--- +"svelte": patch +--- + +feat: introduce rootDir option and strip rootDir from filename in dev diff --git a/.changeset/kind-doors-grin.md b/.changeset/kind-doors-grin.md new file mode 100644 index 0000000000..830957e218 --- /dev/null +++ b/.changeset/kind-doors-grin.md @@ -0,0 +1,5 @@ +--- +"svelte": patch +--- + +fix: rename **svelte_meta.filename to **svelte_meta.file to align with svelte4 diff --git a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js index 1be8fa7b79..c5e4719804 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js @@ -473,10 +473,12 @@ export function client_component(source, analysis, options) { if (options.dev) { if (options.filename) { let filename = options.filename; - if (/(\/|\w:)/.test(options.filename)) { - // filename is absolute — truncate it - const parts = filename.split(/[/\\]/); - filename = parts.length > 3 ? ['...', ...parts.slice(-3)].join('/') : filename; + if(options.rootDir && filename.startsWith(options.rootDir)) { + filename = filename.replace(options.rootDir,''); + if(filename !== options.filename) { + // if after remove of rootDir first char is a path separator, remove that too + filename = filename.replace(/^[/\\]/,'') + } } // add `App.filename = 'App.svelte'` so that we can print useful messages later diff --git a/packages/svelte/src/compiler/types/index.d.ts b/packages/svelte/src/compiler/types/index.d.ts index 1b4a09d989..f86de09519 100644 --- a/packages/svelte/src/compiler/types/index.d.ts +++ b/packages/svelte/src/compiler/types/index.d.ts @@ -216,12 +216,19 @@ export interface ModuleCompileOptions { * Used for debugging hints and sourcemaps. Your bundler plugin will set it automatically. */ filename?: string; + + /** + * Used for ensuring filenames don't leak filesystem information. Your bundler plugin will set it automatically. + * @default process.cwd() on node-like environments, undefined elsewhere + */ + rootDir?: string; } // The following two somewhat scary looking types ensure that certain types are required but can be undefined still -export type ValidatedModuleCompileOptions = Omit, 'filename'> & { +export type ValidatedModuleCompileOptions = Omit, 'filename' | 'rootDir'> & { filename: ModuleCompileOptions['filename']; + rootDir: ModuleCompileOptions['rootDir']; }; export type ValidatedCompileOptions = ValidatedModuleCompileOptions & diff --git a/packages/svelte/src/compiler/validate-options.js b/packages/svelte/src/compiler/validate-options.js index a55258550d..7f95870970 100644 --- a/packages/svelte/src/compiler/validate-options.js +++ b/packages/svelte/src/compiler/validate-options.js @@ -10,6 +10,10 @@ import * as w from './warnings.js'; const common = { filename: string(undefined), + // default to process.cwd() where it exists to replicate svelte4 behavior + // see https://github.com/sveltejs/svelte/blob/b62fc8c8fd2640c9b99168f01b9d958cb2f7574f/packages/svelte/src/compiler/compile/Component.js#L211 + rootDir: string(process?.cwd?.()), + dev: boolean(false), generate: validator('client', (input, keypath) => { diff --git a/packages/svelte/src/internal/client/dev/elements.js b/packages/svelte/src/internal/client/dev/elements.js index b39b51b1c7..0d061f26e5 100644 --- a/packages/svelte/src/internal/client/dev/elements.js +++ b/packages/svelte/src/internal/client/dev/elements.js @@ -34,7 +34,7 @@ export function add_locations(fn, filename, locations) { function assign_location(element, filename, location) { // @ts-expect-error element.__svelte_meta = { - loc: { filename, line: location[0], column: location[1] } + loc: { file: filename, line: location[0], column: location[1] } }; if (location[2]) { diff --git a/packages/svelte/src/internal/client/dom/blocks/svelte-element.js b/packages/svelte/src/internal/client/dom/blocks/svelte-element.js index 3b39c91710..a5ba7f7dca 100644 --- a/packages/svelte/src/internal/client/dom/blocks/svelte-element.js +++ b/packages/svelte/src/internal/client/dom/blocks/svelte-element.js @@ -116,7 +116,7 @@ export function element(anchor, get_tag, is_svg, render_fn, get_namespace, locat // @ts-expect-error element.__svelte_meta = { loc: { - filename, + file: filename, line: location[0], column: location[1] } diff --git a/packages/svelte/tests/runtime-runes/samples/non-local-mutation-discouraged/_config.js b/packages/svelte/tests/runtime-runes/samples/non-local-mutation-discouraged/_config.js index 5cef52a86b..9c33ce782a 100644 --- a/packages/svelte/tests/runtime-runes/samples/non-local-mutation-discouraged/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/non-local-mutation-discouraged/_config.js @@ -26,7 +26,7 @@ export default test({ assert.htmlEqual(target.innerHTML, ``); assert.deepEqual(warnings, [ - '.../samples/non-local-mutation-discouraged/Counter.svelte mutated a value owned by .../samples/non-local-mutation-discouraged/main.svelte. This is strongly discouraged. Consider passing values to child components with `bind:`, or use a callback instead' + 'packages/svelte/tests/runtime-runes/samples/non-local-mutation-discouraged/Counter.svelte mutated a value owned by packages/svelte/tests/runtime-runes/samples/non-local-mutation-discouraged/main.svelte. This is strongly discouraged. Consider passing values to child components with `bind:`, or use a callback instead' ]); } }); diff --git a/packages/svelte/tests/runtime-runes/samples/non-local-mutation-with-binding-2/_config.js b/packages/svelte/tests/runtime-runes/samples/non-local-mutation-with-binding-2/_config.js index 1aef4cc3f1..251dd02e5f 100644 --- a/packages/svelte/tests/runtime-runes/samples/non-local-mutation-with-binding-2/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/non-local-mutation-with-binding-2/_config.js @@ -8,6 +8,6 @@ export default test({ }, warnings: [ - '.../samples/non-local-mutation-with-binding-2/Intermediate.svelte passed a value to .../samples/non-local-mutation-with-binding-2/Counter.svelte with `bind:`, but the value is owned by .../samples/non-local-mutation-with-binding-2/main.svelte. Consider creating a binding between .../samples/non-local-mutation-with-binding-2/main.svelte and .../samples/non-local-mutation-with-binding-2/Intermediate.svelte' + 'packages/svelte/tests/runtime-runes/samples/non-local-mutation-with-binding-2/Intermediate.svelte passed a value to packages/svelte/tests/runtime-runes/samples/non-local-mutation-with-binding-2/Counter.svelte with `bind:`, but the value is owned by packages/svelte/tests/runtime-runes/samples/non-local-mutation-with-binding-2/main.svelte. Consider creating a binding between packages/svelte/tests/runtime-runes/samples/non-local-mutation-with-binding-2/main.svelte and packages/svelte/tests/runtime-runes/samples/non-local-mutation-with-binding-2/Intermediate.svelte' ] }); diff --git a/packages/svelte/tests/runtime-runes/samples/non-local-mutation-with-binding-3/_config.js b/packages/svelte/tests/runtime-runes/samples/non-local-mutation-with-binding-3/_config.js index fd0ace4fda..a77163669d 100644 --- a/packages/svelte/tests/runtime-runes/samples/non-local-mutation-with-binding-3/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/non-local-mutation-with-binding-3/_config.js @@ -33,7 +33,7 @@ export default test({ assert.htmlEqual(target.innerHTML, ``); assert.deepEqual(warnings, [ - '.../samples/non-local-mutation-with-binding-3/Counter.svelte mutated a value owned by .../samples/non-local-mutation-with-binding-3/main.svelte. This is strongly discouraged. Consider passing values to child components with `bind:`, or use a callback instead' + 'packages/svelte/tests/runtime-runes/samples/non-local-mutation-with-binding-3/Counter.svelte mutated a value owned by packages/svelte/tests/runtime-runes/samples/non-local-mutation-with-binding-3/main.svelte. This is strongly discouraged. Consider passing values to child components with `bind:`, or use a callback instead' ]); } }); diff --git a/packages/svelte/tests/runtime-runes/samples/svelte-meta-dynamic/_config.js b/packages/svelte/tests/runtime-runes/samples/svelte-meta-dynamic/_config.js index 6490ddb2f4..a075b4e22e 100644 --- a/packages/svelte/tests/runtime-runes/samples/svelte-meta-dynamic/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/svelte-meta-dynamic/_config.js @@ -14,14 +14,14 @@ export default test({ // @ts-expect-error assert.deepEqual(ps[0].__svelte_meta.loc, { - filename: '.../samples/svelte-meta-dynamic/main.svelte', + file: 'packages/svelte/tests/runtime-runes/samples/svelte-meta-dynamic/main.svelte', line: 7, column: 0 }); // @ts-expect-error assert.deepEqual(ps[1].__svelte_meta.loc, { - filename: '.../samples/svelte-meta-dynamic/main.svelte', + file: 'packages/svelte/tests/runtime-runes/samples/svelte-meta-dynamic/main.svelte', line: 13, column: 0 }); @@ -32,7 +32,7 @@ export default test({ // @ts-expect-error assert.deepEqual(strong.__svelte_meta.loc, { - filename: '.../samples/svelte-meta-dynamic/main.svelte', + file: 'packages/svelte/tests/runtime-runes/samples/svelte-meta-dynamic/main.svelte', line: 10, column: 1 }); diff --git a/packages/svelte/tests/runtime-runes/samples/svelte-meta/_config.js b/packages/svelte/tests/runtime-runes/samples/svelte-meta/_config.js index 300e030c4e..65d003fd1e 100644 --- a/packages/svelte/tests/runtime-runes/samples/svelte-meta/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/svelte-meta/_config.js @@ -14,14 +14,14 @@ export default test({ // @ts-expect-error assert.deepEqual(ps[0].__svelte_meta.loc, { - filename: '.../samples/svelte-meta/main.svelte', + file: 'packages/svelte/tests/runtime-runes/samples/svelte-meta/main.svelte', line: 7, column: 0 }); // @ts-expect-error assert.deepEqual(ps[1].__svelte_meta.loc, { - filename: '.../samples/svelte-meta/main.svelte', + file: 'packages/svelte/tests/runtime-runes/samples/svelte-meta/main.svelte', line: 13, column: 0 }); @@ -32,7 +32,7 @@ export default test({ // @ts-expect-error assert.deepEqual(strong.__svelte_meta.loc, { - filename: '.../samples/svelte-meta/main.svelte', + file: 'packages/svelte/tests/runtime-runes/samples/svelte-meta/main.svelte', line: 10, column: 1 });