From 21f9fc828f9b115f2d0db5da025394e4aee9530e Mon Sep 17 00:00:00 2001 From: dave caruso Date: Sun, 12 Mar 2023 06:43:32 -0400 Subject: [PATCH] fix `require.resolve` with an empty options object #2370 (#2371) * fix #2370 and import-meta test * edit test to not allow transpiler optimization --- src/bun.js/bindings/ImportMetaObject.cpp | 8 +++++--- test/js/bun/resolve/import-meta.test.js | 8 ++++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/bun.js/bindings/ImportMetaObject.cpp b/src/bun.js/bindings/ImportMetaObject.cpp index 89d59b541e..f8b6d0f9b0 100644 --- a/src/bun.js/bindings/ImportMetaObject.cpp +++ b/src/bun.js/bindings/ImportMetaObject.cpp @@ -84,9 +84,11 @@ static EncodedJSValue functionRequireResolve(JSC::JSGlobalObject* globalObject, // require.resolve also supports a paths array // we only support a single path if (!fromValue.isUndefinedOrNull() && fromValue.isObject()) { - if (JSC::JSArray* array = JSC::jsDynamicCast(fromValue.getObject()->getIfPropertyExists(globalObject, JSC::Identifier::fromString(vm, "paths"_s)))) { - if (array->length() > 0) { - fromValue = array->getIndex(globalObject, 0); + if (JSValue pathsValue = fromValue.getObject()->getIfPropertyExists(globalObject, JSC::Identifier::fromString(vm, "paths"_s))) { + if (JSC::JSArray* array = JSC::jsDynamicCast(pathsValue)) { + if (array->length() > 0) { + fromValue = array->getIndex(globalObject, 0); + } } } } diff --git a/test/js/bun/resolve/import-meta.test.js b/test/js/bun/resolve/import-meta.test.js index f87c8f89f5..a95b1a0ea3 100644 --- a/test/js/bun/resolve/import-meta.test.js +++ b/test/js/bun/resolve/import-meta.test.js @@ -1,7 +1,7 @@ import { it, expect } from "bun:test"; import { mkdirSync, rmSync, writeFileSync } from "node:fs"; import * as Module from "node:module"; -import sync from "./require-json.json.js"; +import sync from "./require-json.json"; const { path, dir } = import.meta; @@ -50,7 +50,7 @@ it("require with a query string works on dynamically created content", () => { it("import.meta.require (json)", () => { expect(import.meta.require("./require-json.json").hello).toBe(sync.hello); const require = Module.createRequire(import.meta.path); - expect(require("./require-json.json.js").hello).toBe(sync.hello); + expect(require("./require-json").hello).toBe(sync.hello); }); it("const f = require;require(json)", () => { @@ -162,3 +162,7 @@ it('require("bun") works', () => { it('import("bun") works', async () => { expect(await import("bun")).toBe(Bun); }); + +it("require.resolve with empty options object", () => { + expect(require.resolve(import.meta.path + String(""), {})).toBe(import.meta.path); +});