UNPKG

transform-esm-to-commonjs

Version:
84 lines (82 loc) 3.25 kB
import oxc from "oxc-parser"; import MagicString from "magic-string"; //#region src/index.ts function buildRequireDeclaration(name, source, isDefaultImport, withRequire = true) { name = isDefaultImport ? name : `{${name}}`; const right = withRequire ? `require('${source}')` : source; return `let ${name}=${right};`; } function transformModulesToCommonjs(code, lang = "tsx") { const ms = new MagicString(code); const ast = oxc.parseSync("es", code, { lang }); const moudle = ast.module; const { staticImports, staticExports, dynamicImports } = moudle; if (dynamicImports.length > 0) { const inject = "let __require__=(...args)=>new Promise((r)=>r(require(...args)));\n"; ms.prepend(inject); } for (const { start, end, moduleRequest } of dynamicImports) { const module = code.slice(moduleRequest.start, moduleRequest.end); ms.update(start, end, `__require__(${module})`); } const moduleSet = /* @__PURE__ */ new Map(); for (const staticImport of staticImports) { let defaultImportStr = ""; const namedImports = []; let importSource = staticImport.moduleRequest.value; let cachelocalname = moduleSet.get(importSource); let withRequire = !cachelocalname; for (const { importName, localName, isType } of staticImport.entries) { if (isType || localName == null) continue; if (!cachelocalname) moduleSet.set(importSource, localName.value); const importKind = importName.kind; if (importKind === "Default" || importKind === "NamespaceObject") { importSource = localName.value; const requireStr = buildRequireDeclaration(localName.value, importSource, true, withRequire); withRequire = false; defaultImportStr += requireStr; } else if (importKind === "Name") { let value = localName.value; if (importName.name && importName.name !== value) value = `${importName.name}: ${localName.value}`; namedImports.push(value); } } const namedMembers = namedImports.join(","); const namedImportStr = namedMembers.trim() ? buildRequireDeclaration(namedMembers, importSource, false, withRequire) : ""; ms.update(staticImport.start, staticImport.end, defaultImportStr + namedImportStr); } for (const staticExport of staticExports) for (const { exportName, importName, localName, isType } of staticExport.entries) { if (isType) continue; const exportKind = exportName.kind; const importKind = importName.kind; /** * ignore * export * from "mod" * export * as ns from "mod" * export { xxx } from 'mod' */ if (importKind === "None") { if (exportKind === "Default") { if (exportName.start == null || exportName.end == null) continue; /** * localName.kind === 'Name' * export default function a() {} */ /** * localName.kind === 'None' * export default function() {} */ /** * localName.kind === 'Default' * exprt default App */ ms.appendLeft(staticExport.start + exportName.end - exportName.start - 1, "s."); ms.appendRight(exportName.end, "="); } else if (exportKind === "Name") ms.update(staticExport.start, staticExport.end, `exports.${exportName.name}=${localName.name};`); } } return ms.toString(); } var src_default = transformModulesToCommonjs; //#endregion export { src_default as default };