From 2145fde85506426eb00ecb5fc1f3d3cbb74f72cc Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Tue, 4 Apr 2023 02:42:29 +0300 Subject: [PATCH] fix: detect `createRequire` when imported with `node:` prefix --- lib/dependencies/CommonJsImportsParserPlugin.js | 9 +++++---- test/configCases/require/module-require/d.js | 1 + .../configCases/require/module-require/index.js | 17 +++++++++++++++++ 3 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 test/configCases/require/module-require/d.js diff --git a/lib/dependencies/CommonJsImportsParserPlugin.js b/lib/dependencies/CommonJsImportsParserPlugin.js index e74e5c9743b..95f505b57c4 100644 --- a/lib/dependencies/CommonJsImportsParserPlugin.js +++ b/lib/dependencies/CommonJsImportsParserPlugin.js @@ -444,13 +444,14 @@ class CommonJsImportsParserPlugin { if (!options.createRequire) return; - let moduleName; + let moduleName = []; let specifierName; if (options.createRequire === true) { - moduleName = "module"; + moduleName = ["module", "node:module"]; specifierName = "createRequire"; } else { + let moduleName; const match = /^(.*) from (.*)$/.exec(options.createRequire); if (match) { [, specifierName, moduleName] = match; @@ -545,7 +546,7 @@ class CommonJsImportsParserPlugin { }, (statement, source) => { if ( - source !== moduleName || + !moduleName.includes(source) || statement.specifiers.length !== 1 || statement.specifiers[0].type !== "ImportSpecifier" || statement.specifiers[0].imported.type !== "Identifier" || @@ -570,7 +571,7 @@ class CommonJsImportsParserPlugin { stage: -10 }, (statement, source, id, name) => { - if (source !== moduleName || id !== specifierName) return; + if (!moduleName.includes(source) || id !== specifierName) return; parser.tagVariable(name, createRequireSpecifierTag); return true; } diff --git a/test/configCases/require/module-require/d.js b/test/configCases/require/module-require/d.js new file mode 100644 index 00000000000..a9bbdd80578 --- /dev/null +++ b/test/configCases/require/module-require/d.js @@ -0,0 +1 @@ +module.exports = 4; diff --git a/test/configCases/require/module-require/index.js b/test/configCases/require/module-require/index.js index b98010a1d85..dfbe396ebdb 100644 --- a/test/configCases/require/module-require/index.js +++ b/test/configCases/require/module-require/index.js @@ -1,5 +1,6 @@ import { createRequire as _createRequire } from "module"; import { createRequire as __createRequire, builtinModules } from "module"; +import { createRequire as ___createRequire} from "node:module"; it("should evaluate require/createRequire", () => { expect( @@ -15,24 +16,38 @@ it("should evaluate require/createRequire", () => { expect( (function() { if (typeof require); }).toString() ).toBe('function() { if (true); }'); + expect( + (function() { return typeof ___createRequire; }).toString() + ).toBe('function() { return "function"; }'); + expect( + (function() { if (typeof ___createRequire); }).toString() + ).toBe('function() { if (true); }'); }); it("should create require", () => { const require = _createRequire(import.meta.url); expect(require("./a")).toBe(1); expect(_createRequire(import.meta.url)("./c")).toBe(3); + expect(__createRequire(import.meta.url)("./b")).toBe(2); + expect(___createRequire(import.meta.url)("./d")).toBe(4); + const requireNodePrefix = __createRequire(import.meta.url); + expect(requireNodePrefix("./a")).toBe(1); }); it("should resolve using created require", () => { const require = _createRequire(import.meta.url); expect(require.resolve("./b")).toBe("./b.js"); expect(_createRequire(import.meta.url).resolve("./b")).toBe("./b.js"); + expect(__createRequire(import.meta.url).resolve("./b")).toBe("./b.js"); + expect(___createRequire(import.meta.url).resolve("./b")).toBe("./b.js"); }); it("should provide require.cache", () => { const _require = _createRequire(import.meta.url); expect(require.cache).toBe(_require.cache); expect(require.cache).toBe(_createRequire(import.meta.url).cache); + expect(require.cache).toBe(__createRequire(import.meta.url).cache); + expect(require.cache).toBe(___createRequire(import.meta.url).cache); }); it("should provide dependency context", () => { @@ -40,6 +55,8 @@ it("should provide dependency context", () => { expect(_require("./a")).toBe(4); const _require1 = _createRequire(new URL("./foo/", import.meta.url)); expect(_require1("./c")).toBe(5); + const _require2 = ___createRequire(new URL("./foo/", import.meta.url)); + expect(_require2("./c")).toBe(5); }); it("should add warning on using as expression", () => {