From e3c31c54a08ee482c5c65a5419ed972e5c1d197b Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 19 Jul 2022 13:32:13 -0400 Subject: [PATCH 1/2] handle circular dependencies in dynamic imports - closes #5399 --- .changeset/eleven-crews-knock.md | 5 +++++ packages/kit/src/vite/build/utils.js | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 .changeset/eleven-crews-knock.md 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) { From 664963c24b27b590d70413f41599f97cabfa3b1c Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 19 Jul 2022 13:40:31 -0400 Subject: [PATCH 2/2] add test --- .../basics/src/routes/cyclical-dynamic-import/_is_even.js | 5 +++++ .../basics/src/routes/cyclical-dynamic-import/_is_odd.js | 5 +++++ .../src/routes/cyclical-dynamic-import/index.svelte | 8 ++++++++ 3 files changed, 18 insertions(+) create mode 100644 packages/kit/test/apps/basics/src/routes/cyclical-dynamic-import/_is_even.js create mode 100644 packages/kit/test/apps/basics/src/routes/cyclical-dynamic-import/_is_odd.js create mode 100644 packages/kit/test/apps/basics/src/routes/cyclical-dynamic-import/index.svelte 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 @@ +