Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions lib/detector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ function reconstructSpecifiers(
}

function reconstruct(node: babelTypes.Node) {
// @ts-expect-error Type mismatch due to @babel/types version in @types/babel__generator
let v = generate(node, { comments: false }).code.replace(/\n/g, '');
let v2;

Expand Down
47 changes: 19 additions & 28 deletions lib/esm-transformer.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import * as babel from '@babel/core';
import * as babel from '@babel/parser';
import traverse, { NodePath } from '@babel/traverse';
import * as t from '@babel/types';
import * as esbuild from 'esbuild';
import { log } from './log';
import { unlikelyJavascript } from './common';

Expand Down Expand Up @@ -29,8 +31,7 @@ function detectUnsupportedESMFeatures(
filename: string,
): UnsupportedFeature[] | null {
try {
const ast = babel.parseSync(code, {
filename,
const ast = babel.parse(code, {
sourceType: 'module',
plugins: [],
});
Expand All @@ -41,9 +42,10 @@ function detectUnsupportedESMFeatures(

const unsupportedFeatures: UnsupportedFeature[] = [];

traverse(ast, {
// @ts-expect-error Type mismatch due to @babel/types version in @types/babel__traverse
traverse(ast as t.File, {
// Detect import.meta usage
MetaProperty(path) {
MetaProperty(path: NodePath<t.MetaProperty>) {
if (
path.node.meta.name === 'import' &&
path.node.property.name === 'meta'
Expand All @@ -57,7 +59,7 @@ function detectUnsupportedESMFeatures(
},

// Detect top-level await
AwaitExpression(path) {
AwaitExpression(path: NodePath<t.AwaitExpression>) {
// Check if await is at top level (not inside a function)
let parent: NodePath | null = path.parentPath;
let isTopLevel = true;
Expand Down Expand Up @@ -86,7 +88,7 @@ function detectUnsupportedESMFeatures(
},

// Detect for-await-of at top level
ForOfStatement(path) {
ForOfStatement(path: NodePath<t.ForOfStatement>) {
if (path.node.await) {
let parent: NodePath | null = path.parentPath;
let isTopLevel = true;
Expand Down Expand Up @@ -129,8 +131,9 @@ function detectUnsupportedESMFeatures(
}

/**
* Transform ESM code to CommonJS using Babel
* Transform ESM code to CommonJS using esbuild
* This allows ESM modules to be compiled to bytecode via vm.Script
* Uses Babel parser for detecting unsupported ESM features, then esbuild for fast transformation
*
* @param code - The ESM source code to transform
* @param filename - The filename for error reporting
Expand Down Expand Up @@ -183,29 +186,17 @@ export function transformESMtoCJS(
}

try {
const result = babel.transformSync(code, {
filename,
plugins: [
[
'@babel/plugin-transform-modules-commonjs',
{
strictMode: true,
allowTopLevelThis: true,
},
],
],
sourceMaps: false,
compact: false,
// Don't modify other syntax, only transform import/export
presets: [],
// Prevent Babel from loading user config files
babelrc: false,
configFile: false,
sourceType: 'module',
const result = esbuild.transformSync(code, {
loader: 'js',
format: 'cjs',
target: 'node18',
sourcemap: false,
minify: false,
keepNames: true,
});

if (!result || !result.code) {
log.warn(`Babel transform returned no code for ${filename}`);
log.warn(`esbuild transform returned no code for ${filename}`);
return {
code,
isTransformed: false,
Expand Down
6 changes: 2 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,11 @@
"singleQuote": true
},
"dependencies": {
"@babel/core": "^7.23.0",
"@babel/generator": "^7.23.0",
"@babel/parser": "^7.23.0",
"@babel/plugin-transform-modules-commonjs": "^7.27.1",
"@babel/traverse": "^7.23.0",
"@babel/types": "^7.23.0",
"esbuild": "^0.24.0",
"@yao-pkg/pkg-fetch": "3.5.32",
"into-stream": "^6.0.0",
"minimist": "^1.2.6",
Expand All @@ -44,8 +43,8 @@
},
"devDependencies": {
"@release-it/conventional-changelog": "^7.0.2",
"@types/babel__core": "^7.20.5",
"@types/babel__generator": "^7.6.5",
"@types/babel__traverse": "^7.20.3",
"@types/minimist": "^1.2.2",
"@types/multistream": "^4.1.0",
"@types/node": "^16.18.113",
Expand All @@ -56,7 +55,6 @@
"@types/unzipper": "^0.10.10",
"@typescript-eslint/eslint-plugin": "^6.7.4",
"@typescript-eslint/parser": "^6.7.4",
"esbuild": "^0.24.0",
"esbuild-register": "^3.6.0",
"eslint": "^8.50.0",
"eslint-config-airbnb-base": "^15.0.0",
Expand Down
Loading