diff --git a/src/plugins/esmShim.ts b/src/plugins/esmShim.ts index 4bf4f1f..3546599 100644 --- a/src/plugins/esmShim.ts +++ b/src/plugins/esmShim.ts @@ -1,9 +1,3 @@ -/* - * The core of this plugin was conceived by pi0 and is taken from the following repository: - * https://github.com/unjs/unbuild/blob/main/src/builder/plugins/cjs.ts - * license: https://github.com/unjs/unbuild/blob/main/LICENSE - */ - import MagicString from 'magic-string' import type { Plugin } from 'vite' @@ -13,37 +7,22 @@ const CJSyntaxRe = /__filename|__dirname|require\(|require\.resolve\(/ const CJSShim_normal = ` // -- CommonJS Shims -- -import __cjs_url__ from 'node:url'; -import __cjs_path__ from 'node:path'; -import __cjs_mod__ from 'node:module'; -const __filename = __cjs_url__.fileURLToPath(import.meta.url); -const __dirname = __cjs_path__.dirname(__filename); -const require = __cjs_mod__.createRequire(import.meta.url); +import __shims_url__ from 'node:url'; +import __shims_path__ from 'node:path'; +import __shims_module__ from 'node:module'; +const __filename = __shims_url__.fileURLToPath(import.meta.url); +const __dirname = __shims_path__.dirname(__filename); +const require = __shims_module__.createRequire(import.meta.url); ` const CJSShim_node_20_11 = ` // -- CommonJS Shims -- -import __cjs_mod__ from 'node:module'; +import __shims_module__ from 'node:module'; const __filename = import.meta.filename; const __dirname = import.meta.dirname; -const require = __cjs_mod__.createRequire(import.meta.url); +const require = __shims_module__.createRequire(import.meta.url); ` -const ESMStaticImportRe = - /(?<=\s|^|;)import\s*([\s"']*(?[\p{L}\p{M}\w\t\n\r $*,/{}@.]+)from\s*)?["']\s*(?(?<="\s*)[^"]*[^\s"](?=\s*")|(?<='\s*)[^']*[^\s'](?=\s*'))\s*["'][\s;]*/gmu - -interface StaticImport { - end: number -} - -function findStaticImports(code: string): StaticImport[] { - const matches: StaticImport[] = [] - for (const match of code.matchAll(ESMStaticImportRe)) { - matches.push({ end: (match.index || 0) + match[0].length }) - } - return matches -} - export default function esmShimPlugin(): Plugin { const CJSShim = supportImportMetaPaths() ? CJSShim_node_20_11 : CJSShim_normal @@ -53,11 +32,14 @@ export default function esmShimPlugin(): Plugin { enforce: 'post', renderChunk(code, _chunk, { format, sourcemap }) { if (format === 'es') { + // Rolldown may remove unused shim bindings after this hook; referenced bindings remain available. if (code.includes(CJSShim) || !CJSyntaxRe.test(code)) { return null } - const lastESMImport = findStaticImports(code).pop() + const lastESMImport = this.parse(code) + .body.filter(node => node.type === 'ImportDeclaration') + .pop() const indexToAppend = lastESMImport ? lastESMImport.end : 0 const s = new MagicString(code) s.appendRight(indexToAppend, CJSShim)