From d4e080d578f39a3b456f520e8d6e75db2d0ad3b5 Mon Sep 17 00:00:00 2001 From: Ryan Turnquist Date: Thu, 16 Apr 2026 14:59:47 -0700 Subject: [PATCH] fix: improve commonjs translation in dev ssr (#268) --- .changeset/shaky-lilies-enter.md | 5 ++++ src/cjs-to-esm.ts | 43 +++++++++++++++++++++++++------- 2 files changed, 39 insertions(+), 9 deletions(-) create mode 100644 .changeset/shaky-lilies-enter.md diff --git a/.changeset/shaky-lilies-enter.md b/.changeset/shaky-lilies-enter.md new file mode 100644 index 0000000..a6c93e5 --- /dev/null +++ b/.changeset/shaky-lilies-enter.md @@ -0,0 +1,5 @@ +--- +"@marko/vite": patch +--- + +Improve default import helper for commonjs translation in dev SSR diff --git a/src/cjs-to-esm.ts b/src/cjs-to-esm.ts index df6d491..95f107d 100644 --- a/src/cjs-to-esm.ts +++ b/src/cjs-to-esm.ts @@ -6,19 +6,44 @@ const REQUIRE_RE = /([^.\w$]|^)require\s*\(\s*(['"])(.*?)\2\s*\)/g; const REQUIRE_TEST_RE = /([^.\w$]|^)require\s*\(\s*['"]/; const EXPORTS_RE = /\b(module\.exports|exports)\b/; const CJS_INTEROP_HELPER = `function __cjs_default__(ns) { - var keys = Object.getOwnPropertyNames(ns); - var hasNamed = false; - var hasDefault = false; - for (var i = 0; i < keys.length; i++) { - var k = keys[i]; + let hasDefault = false; + let hasNamed = false; + const mod = Object.create(null); + + Object.defineProperty(mod, '__esModule', { + value: true, + enumerable: false, + configurable: true, + }); + + for (const k of Object.getOwnPropertyNames(ns)) { if (k === "default") { hasDefault = true; - } else if (k !== "__esModule" && k !== "module.exports") { - try { if (ns[k] != null) hasNamed = true; } catch(e) {} + } else if (!hasNamed && !(k === "__esModule" || k === "module.exports")) { + try { + if (ns[k] == null) continue; + if (ns.__esModule) return ns; + } catch {} + hasNamed = true; } + + Object.defineProperty(mod, k, { + get() { return ns[k]; }, + enumerable: true, + configurable: false, + }); + } + + for (const k of Object.getOwnPropertySymbols(ns)) { + Object.defineProperty(mod, k, { + get() { return ns[k]; }, + enumerable: false, + configurable: false, + }); } - if (hasNamed) return ns; - if (hasDefault) return ns["default"]; + + if (hasNamed) return mod; + if (hasDefault) return mod.default; return ns; }`;