diff --git a/.changeset/pink-pots-read.md b/.changeset/pink-pots-read.md new file mode 100644 index 000000000000..69c12cf155a5 --- /dev/null +++ b/.changeset/pink-pots-read.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/package': patch +--- + +fix: better alias resolution diff --git a/eslint.config.js b/eslint.config.js index b0e8e3968706..d13c045dac5a 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -16,7 +16,9 @@ export default [ '**/.custom-out-dir', 'packages/adapter-*/files', 'packages/kit/src/core/config/fixtures/multiple', // dir contains svelte config with multiple extensions tripping eslint - 'packages/package/test/fixtures/typescript-svelte-config/expected' + 'packages/package/test/fixtures/typescript-svelte-config/expected', + 'packages/package/test/errors/**/*', + 'packages/package/test/fixtures/**/*' ] }, { @@ -43,8 +45,6 @@ export default [ 'packages/kit/test/apps/**/*', 'packages/kit/test/build-errors/**/*', 'packages/kit/test/prerendering/**/*', - 'packages/package/test/errors/**/*', - 'packages/package/test/fixtures/**/*', 'packages/test-redirect-importer/index.js' ] } diff --git a/packages/package/src/utils.js b/packages/package/src/utils.js index 7262a32ba9b5..06ba720d8a06 100644 --- a/packages/package/src/utils.js +++ b/packages/package/src/utils.js @@ -17,9 +17,10 @@ const is_svelte_5_plus = Number(VERSION.split('.')[0]) >= 5; export function resolve_aliases(input, file, content, aliases) { /** * @param {string} match + * @param {string} quote * @param {string} import_path */ - const replace_import_path = (match, import_path) => { + const replace_import_path = (match, quote, import_path) => { for (const [alias, value] of Object.entries(aliases)) { if (!import_path.startsWith(alias)) continue; @@ -27,29 +28,27 @@ export function resolve_aliases(input, file, content, aliases) { const full_import_path = path.join(value, import_path.slice(alias.length)); let resolved = posixify(path.relative(path.dirname(full_path), full_import_path)); resolved = resolved.startsWith('.') ? resolved : './' + resolved; - return match.replace(import_path, resolved); + return match.replace(quote + import_path + quote, quote + resolved + quote); } return match; }; // import/export ... from ... content = content.replace( - /\b(import|export)\s+([\w*\s{},]*)\s+from\s+(['"])([^'";]+)\3/g, - (_, keyword, specifier, quote, import_path) => - replace_import_path( - `${keyword} ${specifier} from ${quote}${import_path}${quote}`, - import_path - ) + /\b(import|export)(?:\s+type)?\s+((?:\p{L}[\p{L}0-9]*\s+)|(?:\{[^}]*\}\s*))from\s*(['"])([^'";]+)\3/gmu, + (match, _keyword, _specifier, quote, import_path) => + replace_import_path(match, quote, import_path) ); // import(...) - content = content.replace(/\bimport\s*\(\s*(['"])([^'";]+)\1\s*\)/g, (_, quote, import_path) => - replace_import_path(`import(${quote}${import_path}${quote})`, import_path) + content = content.replace( + /\bimport\s*\(\s*(['"])([^'";]+)\1\s*\)/g, + (match, quote, import_path) => replace_import_path(match, quote, import_path) ); // import '...' - content = content.replace(/\bimport\s+(['"])([^'";]+)\1/g, (_, quote, import_path) => - replace_import_path(`import ${quote}${import_path}${quote}`, import_path) + content = content.replace(/\bimport\s+(['"])([^'";]+)\1/g, (match, quote, import_path) => + replace_import_path(match, quote, import_path) ); return content; diff --git a/packages/package/test/fixtures/resolve-alias/expected/sub/bar.d.ts b/packages/package/test/fixtures/resolve-alias/expected/sub/bar.d.ts index fac8707fc2ad..d03c778f4534 100644 --- a/packages/package/test/fixtures/resolve-alias/expected/sub/bar.d.ts +++ b/packages/package/test/fixtures/resolve-alias/expected/sub/bar.d.ts @@ -1,3 +1,6 @@ +import type { Baz } from '../baz'; export declare const dynamic: () => Promise; export declare const bar1: import('./foo').Foo; -export declare const bar2: import('../baz').Baz; +export declare const bar2: Baz; +export declare const bar3: Baz; +export declare const bar4: import('./foo').Foo; diff --git a/packages/package/test/fixtures/resolve-alias/expected/sub/bar.js b/packages/package/test/fixtures/resolve-alias/expected/sub/bar.js index 6c2ec176b703..83b32dbdc7b6 100644 --- a/packages/package/test/fixtures/resolve-alias/expected/sub/bar.js +++ b/packages/package/test/fixtures/resolve-alias/expected/sub/bar.js @@ -1,5 +1,11 @@ import { baz } from '../baz'; import { foo } from './foo'; +import { + // some comment + foo as $foo, +} from "./foo"; export const dynamic = () => import('../Test.svelte'); export const bar1 = foo; export const bar2 = baz; +export const bar3 = { baz: "bar" }; +export const bar4 = $foo; diff --git a/packages/package/test/fixtures/resolve-alias/src/lib/sub/bar.ts b/packages/package/test/fixtures/resolve-alias/src/lib/sub/bar.ts index c1d073daa6d0..f2dc27a6aff3 100644 --- a/packages/package/test/fixtures/resolve-alias/src/lib/sub/bar.ts +++ b/packages/package/test/fixtures/resolve-alias/src/lib/sub/bar.ts @@ -1,6 +1,13 @@ import { baz } from '$lib/baz'; import { foo } from '$lib/sub/foo'; +import type { Baz } from '$lib/baz'; +import { + // some comment + foo as $foo +} from '$lib/sub/foo'; export const dynamic = () => import('$lib/Test.svelte'); export const bar1 = foo; export const bar2 = baz; +export const bar3: Baz = { baz: 'bar' }; +export const bar4 = $foo;