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(),          );        });      }); | 
