diff options
-rw-r--r-- | src/bun.js/bindings/ImportMetaObject.cpp | 2 | ||||
-rw-r--r-- | src/js_parser.zig | 25 | ||||
-rw-r--r-- | test/bun.js/transpiler.test.js | 25 |
3 files changed, 41 insertions, 11 deletions
diff --git a/src/bun.js/bindings/ImportMetaObject.cpp b/src/bun.js/bindings/ImportMetaObject.cpp index cdd00ced2..bcd8f4be6 100644 --- a/src/bun.js/bindings/ImportMetaObject.cpp +++ b/src/bun.js/bindings/ImportMetaObject.cpp @@ -124,7 +124,7 @@ JSC_DEFINE_CUSTOM_GETTER(functionRequireResolveLazyGetter, JSC::JSFunction* resolverFunction = JSC::JSNativeStdFunction::create( - globalObject->vm(), globalObject, 1, "resolve"_s, [pathString_ = WTFMove(pathString)](JSC::JSGlobalObject* globalObject, JSC::CallFrame* callFrame) -> const JSC::EncodedJSValue { + globalObject->vm(), globalObject, 2, "resolve"_s, [pathString_ = WTFMove(pathString)](JSC::JSGlobalObject* globalObject, JSC::CallFrame* callFrame) -> const JSC::EncodedJSValue { return functionRequireResolve(globalObject, callFrame, JSValue::encode(pathString_.get())); }); require->putDirect(vm, builtinNames.resolvePrivateName(), resolverFunction, 0); diff --git a/src/js_parser.zig b/src/js_parser.zig index 96039d54b..5731a9c8d 100644 --- a/src/js_parser.zig +++ b/src/js_parser.zig @@ -8357,6 +8357,14 @@ fn NewParser_( // This assumes the caller has already parsed the "import" token + fn importMetaRequire(p: *P, loc: logger.Loc) Expr { + return p.e(E.Dot{ + .target = p.e(E.ImportMeta{}, loc), + .name = "require", + .name_loc = loc, + }, loc); + } + fn parseTypeScriptImportEqualsStmt(p: *P, loc: logger.Loc, opts: *ParseStatementOptions, default_name_loc: logger.Loc, default_name: string) anyerror!Stmt { try p.lexer.expect(.t_equals); @@ -13095,7 +13103,7 @@ fn NewParser_( }, .e_identifier => { var e_ = expr.data.e_identifier; - const is_delete_target = @as(Expr.Tag, p.delete_target) == .e_identifier and expr.data.e_identifier.ref.eql(p.delete_target.e_identifier.ref); + const is_delete_target = @as(Expr.Tag, p.delete_target) == .e_identifier and e_.ref.eql(p.delete_target.e_identifier.ref); const name = p.loadNameFromRef(e_.ref); if (p.isStrictMode() and js_lexer.StrictModeReservedWords.has(name)) { @@ -13142,6 +13150,15 @@ fn NewParser_( e_.call_can_be_unwrapped_if_unused = true; } } + + if (!p.options.enable_bundling and p.options.features.dynamic_require) { + const is_call_target = @as(Expr.Tag, p.call_target) == .e_identifier and expr.data.e_identifier.ref.eql(p.call_target.e_identifier.ref); + if (!is_call_target and p.require_ref.eql(e_.ref)) { + // Substitute "require" for import.meta.require + p.ignoreUsage(e_.ref); + return p.importMetaRequire(expr.loc); + } + } } return p.handleIdentifier(expr.loc, e_, original_name, IdentifierOpts{ @@ -14555,11 +14572,7 @@ fn NewParser_( p.ignoreUsage(p.require_ref); return p.e( E.Call{ - .target = p.e(E.Dot{ - .target = p.e(E.ImportMeta{}, expr.loc), - .name = "require", - .name_loc = expr.loc, - }, expr.loc), + .target = p.importMetaRequire(expr.loc), .args = e_.args, .close_paren_loc = e_.close_paren_loc, .optional_chain = e_.optional_chain, diff --git a/test/bun.js/transpiler.test.js b/test/bun.js/transpiler.test.js index 02d4f11e2..dca0e1a59 100644 --- a/test/bun.js/transpiler.test.js +++ b/test/bun.js/transpiler.test.js @@ -1067,19 +1067,36 @@ export const { dead } = { dead: "hello world!" }; `export const foo = require('bar.node')`, `export const foo = import.meta.require("bar.node")`, ); + expectBunPrinted_( + `export const foo = require('bar.node')`, + `export const foo = import.meta.require("bar.node")`, + ); }); - it("require.resolve -> import.meta.resolveSync", () => { + it("require.resolve -> import.meta.require.resolve", () => { expectBunPrinted_( `export const foo = require.resolve('bar.node')`, - `export const foo = import.meta.resolveSync("bar.node")`, + `export const foo = import.meta.require.resolve("bar.node")`, ); }); - it('require.resolve(path, {paths: ["blah"]}) -> import.meta.resolveSync', () => { + it('require.resolve(path, {paths: ["blah"]}) -> import.meta.require.resolve', () => { expectBunPrinted_( `export const foo = require.resolve('bar.node', {paths: ["blah"]})`, - `export const foo = import.meta.resolveSync("bar.node", { paths: ["blah"] })`, + `export const foo = import.meta.require.resolve("bar.node", { paths: ["blah"] })`, + ); + }); + + it("require is defined", () => { + expectBunPrinted_( + ` +const {resolve} = require; +console.log(resolve.length) + `.trim(), + ` +const { resolve } = import.meta.require; +console.log(resolve.length) + `.trim(), ); }); }); |