aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bun.js/bindings/ImportMetaObject.cpp2
-rw-r--r--src/js_parser.zig25
-rw-r--r--test/bun.js/transpiler.test.js25
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(),
);
});
});