diff --git a/.changeset/eleven-crews-knock.md b/.changeset/eleven-crews-knock.md new file mode 100644 index 000000000000..51a1d778d97f --- /dev/null +++ b/.changeset/eleven-crews-knock.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +Handle circular dependencies in dynamic imports diff --git a/packages/kit/src/vite/build/utils.js b/packages/kit/src/vite/build/utils.js index 68e7d26d1249..a82045414ac5 100644 --- a/packages/kit/src/vite/build/utils.js +++ b/packages/kit/src/vite/build/utils.js @@ -35,6 +35,9 @@ export async function create_build(config) { * @param {boolean} add_dynamic_css */ export function find_deps(manifest, entry, add_dynamic_css) { + /** @type {Set} */ + const seen = new Set(); + /** @type {Set} */ const imports = new Set(); @@ -46,9 +49,11 @@ export function find_deps(manifest, entry, add_dynamic_css) { * @param {boolean} add_js */ function traverse(file, add_js) { + if (seen.has(file)) return; + seen.add(file); + const chunk = manifest[file]; - if (imports.has(chunk.file)) return; if (add_js) imports.add(chunk.file); if (chunk.css) { diff --git a/packages/kit/test/apps/basics/src/routes/cyclical-dynamic-import/_is_even.js b/packages/kit/test/apps/basics/src/routes/cyclical-dynamic-import/_is_even.js new file mode 100644 index 000000000000..88d2321ddfb3 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/cyclical-dynamic-import/_is_even.js @@ -0,0 +1,5 @@ +export async function is_even(num) { + const { is_odd } = await import('./_is_odd.js'); + if (num === 0) return true; + return is_odd(num - 1); +} diff --git a/packages/kit/test/apps/basics/src/routes/cyclical-dynamic-import/_is_odd.js b/packages/kit/test/apps/basics/src/routes/cyclical-dynamic-import/_is_odd.js new file mode 100644 index 000000000000..6020ff85a235 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/cyclical-dynamic-import/_is_odd.js @@ -0,0 +1,5 @@ +export async function is_odd(num) { + const { is_even } = await import('./_is_even.js'); + if (num === 1) return true; + return is_even(num - 1); +} diff --git a/packages/kit/test/apps/basics/src/routes/cyclical-dynamic-import/index.svelte b/packages/kit/test/apps/basics/src/routes/cyclical-dynamic-import/index.svelte new file mode 100644 index 000000000000..0edda85a8d07 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/cyclical-dynamic-import/index.svelte @@ -0,0 +1,8 @@ +