diff --git a/lib/Module.js b/lib/Module.js index b07066f38bc..b3d2abbfbb4 100644 --- a/lib/Module.js +++ b/lib/Module.js @@ -97,10 +97,6 @@ const makeSerializable = require("./util/makeSerializable"); /** * @typedef {object} KnownBuildMeta - * @property {string=} moduleArgument - * @property {string=} exportsArgument - * @property {boolean=} strict - * @property {string=} moduleConcatenationBailout * @property {("default" | "namespace" | "flagged" | "dynamic")=} exportsType * @property {(false | "redirect" | "redirect-warn")=} defaultObject * @property {boolean=} strictHarmonyModule @@ -113,6 +109,10 @@ const makeSerializable = require("./util/makeSerializable"); * @typedef {object} KnownBuildInfo * @property {boolean=} cacheable * @property {boolean=} parsed + * @property {string=} moduleArgument + * @property {string=} exportsArgument + * @property {boolean=} strict + * @property {string=} moduleConcatenationBailout * @property {LazySet=} fileDependencies * @property {LazySet=} contextDependencies * @property {LazySet=} missingDependencies diff --git a/lib/dependencies/CommonJsImportsParserPlugin.js b/lib/dependencies/CommonJsImportsParserPlugin.js index 15e87b90817..5d91201a6b6 100644 --- a/lib/dependencies/CommonJsImportsParserPlugin.js +++ b/lib/dependencies/CommonJsImportsParserPlugin.js @@ -464,6 +464,36 @@ class CommonJsImportsParserPlugin { * @returns {boolean | void} true when handled */ const processResolve = (expr, weak) => { + if (!weak && options.commonjsMagicComments) { + const { options: requireOptions, errors: commentErrors } = + parser.parseCommentOptions(/** @type {Range} */ (expr.range)); + + if (commentErrors) { + for (const e of commentErrors) { + const { comment } = e; + parser.state.module.addWarning( + new CommentCompilationWarning( + `Compilation error while processing magic comment(-s): /*${comment.value}*/: ${e.message}`, + /** @type {DependencyLocation} */ (comment.loc) + ) + ); + } + } + if (requireOptions && requireOptions.webpackIgnore !== undefined) { + if (typeof requireOptions.webpackIgnore !== "boolean") { + parser.state.module.addWarning( + new UnsupportedFeatureWarning( + `\`webpackIgnore\` expected a boolean, but received: ${requireOptions.webpackIgnore}.`, + /** @type {DependencyLocation} */ (expr.loc) + ) + ); + } else if (requireOptions.webpackIgnore) { + // Do not instrument `require()` if `webpackIgnore` is `true` + return true; + } + } + } + if (expr.arguments.length !== 1) return; const param = parser.evaluateExpression(expr.arguments[0]); if (param.isConditional()) { diff --git a/test/configCases/parsing/require-resolve-ignore/index.js b/test/configCases/parsing/require-resolve-ignore/index.js new file mode 100644 index 00000000000..7511c4570ca --- /dev/null +++ b/test/configCases/parsing/require-resolve-ignore/index.js @@ -0,0 +1,9 @@ +const fs = require("fs"); +const path = require("path"); + +it("should be able to ignore require.resolve()", () => { + const source = fs.readFileSync(path.join(__dirname, "bundle1.js"), "utf-8"); + expect(source).toMatch(`require.resolve(/* webpackIgnore: true */ "./non-exists")`); + expect(source).toMatch(`createRequire(import.meta.url).resolve(/* webpackIgnore: true */ "./non-exists")`); + expect(source).toMatch(`require.resolve(/* webpackIgnore: true */ "./non-exists")`); +}); diff --git a/test/configCases/parsing/require-resolve-ignore/other.js b/test/configCases/parsing/require-resolve-ignore/other.js new file mode 100644 index 00000000000..a8c4d14ea19 --- /dev/null +++ b/test/configCases/parsing/require-resolve-ignore/other.js @@ -0,0 +1,8 @@ +import { createRequire } from 'node:module'; + +const resolve = require.resolve(/* webpackIgnore: true */ "./non-exists"); +const createRequireResolve1 = createRequire(import.meta.url).resolve(/* webpackIgnore: true */ "./non-exists"); +const require = createRequire(import.meta.url); +const createRequireResolve2 = require.resolve(/* webpackIgnore: true */ "./non-exists"); + +export { resolve, createRequireResolve1, createRequireResolve2 } diff --git a/test/configCases/parsing/require-resolve-ignore/webpack.config.js b/test/configCases/parsing/require-resolve-ignore/webpack.config.js new file mode 100644 index 00000000000..4323daf6d9d --- /dev/null +++ b/test/configCases/parsing/require-resolve-ignore/webpack.config.js @@ -0,0 +1,20 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + bundle0: "./index.js", + bundle1: "./other.js" + }, + module: { + parser: { + javascript: { + commonjsMagicComments: true + } + } + }, + output: { + filename: "[name].js" + }, + node: { + __dirname: false + } +}; diff --git a/types.d.ts b/types.d.ts index 633504c8656..4e5fdf84fc6 100644 --- a/types.d.ts +++ b/types.d.ts @@ -7482,6 +7482,10 @@ declare interface KnownAssetInfo { declare interface KnownBuildInfo { cacheable?: boolean; parsed?: boolean; + moduleArgument?: string; + exportsArgument?: string; + strict?: boolean; + moduleConcatenationBailout?: string; fileDependencies?: LazySet; contextDependencies?: LazySet; missingDependencies?: LazySet; @@ -7493,10 +7497,6 @@ declare interface KnownBuildInfo { snapshot?: null | Snapshot; } declare interface KnownBuildMeta { - moduleArgument?: string; - exportsArgument?: string; - strict?: boolean; - moduleConcatenationBailout?: string; exportsType?: "namespace" | "dynamic" | "default" | "flagged"; defaultObject?: false | "redirect" | "redirect-warn"; strictHarmonyModule?: boolean;