diff --git a/src/index.ts b/src/index.ts index f8793cf..694850e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -55,32 +55,44 @@ export function RequireCJS(userOptions: Options = {}): Plugin { s.overwriteNode(stmt, `require(${s.sliceNode(stmt.source)});`) } else { const mapping: Record = {} + let modId: string | undefined let namespaceId: string | undefined + let defaultId: string | undefined for (const specifier of stmt.specifiers) { // namespace if (specifier.type === 'ImportNamespaceSpecifier') { // import * as name from 'cjs-module' // const name = require('cjs-module') namespaceId = s.sliceNode(specifier.local) + } else if (specifier.type === 'ImportSpecifier') { + // named import + mapping[s.sliceNode(specifier.imported)] = s.sliceNode( + specifier.local, + ) } else { - // default or named - mapping[ - specifier.type === 'ImportSpecifier' - ? s.sliceNode(specifier.imported) - : 'default' - ] = s.sliceNode(specifier.local) + // default import + defaultId = s.sliceNode(specifier.local) } } const requireCode = `require(${s.sliceNode(stmt.source)})` let str = '' + if (defaultId || namespaceId) { + modId ||= `_cjs_${defaultId || namespaceId}_mod` + } + if (modId) { + str += `const ${modId} = ${requireCode};` + } if (namespaceId) { - str += `const ${namespaceId} = ${requireCode};` + str += `const ${namespaceId} = { ...${modId}, default: ${modId} };` + } + if (defaultId) { + str += `const ${defaultId} = ${modId}?.default || ${modId};` } if (Object.keys(mapping).length > 0) { str += `const { ${Object.entries(mapping) .map(([k, v]) => `${k}: ${v}`) - .join(', ')} } = ${namespaceId || requireCode};` + .join(', ')} } = ${modId || requireCode};` } s.overwriteNode(stmt, str) } diff --git a/tests/__snapshots__/index.test.ts.snap b/tests/__snapshots__/index.test.ts.snap index cdb7299..a3986e4 100644 --- a/tests/__snapshots__/index.test.ts.snap +++ b/tests/__snapshots__/index.test.ts.snap @@ -11,12 +11,23 @@ var __require = /* @__PURE__ */ createRequire(import.meta.url); //#endregion //#region tests/fixtures/basic.js __require("typescript"); -const ns = __require("typescript"); -const { default: _default } = __require("typescript"); +const _cjs_ns_mod = __require("typescript"); +const ns = { + ..._cjs_ns_mod, + default: _cjs_ns_mod +}; +const _cjs__default_mod = __require("typescript"); +const _default = _cjs__default_mod?.default || _cjs__default_mod; const { named, imported: local } = __require("typescript"); -const { default: _default2, named: local2 } = __require("typescript"); -const ns2 = __require("typescript"); -const { default: _default3 } = ns2; +const _cjs__default2_mod = __require("typescript"); +const _default2 = _cjs__default2_mod?.default || _cjs__default2_mod; +const { named: local2 } = _cjs__default2_mod; +const _cjs__default3_mod = __require("typescript"); +const ns2 = { + ..._cjs__default3_mod, + default: _cjs__default3_mod +}; +const _default3 = _cjs__default3_mod?.default || _cjs__default3_mod; __require("force"); //#endregion