mirror of https://github.com/webpack/webpack.git
fix: detect `createRequire` when imported with `node:` prefix
This commit is contained in:
parent
eed37e93c5
commit
2145fde855
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
module.exports = 4;
|
|
@ -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", () => {
|
||||
|
|
Loading…
Reference in New Issue