From ac6ffca02d323e4a576229d9441d72376eaeda56 Mon Sep 17 00:00:00 2001 From: inottn Date: Thu, 6 Feb 2025 21:41:24 +0800 Subject: [PATCH 1/2] fix(types): correct BuildInfo and BuildMeta type definitions (#19200) --- lib/Module.js | 8 ++++---- types.d.ts | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) 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/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; From 80826c5cf235d8a14407c609d7e6eabb63e57ef8 Mon Sep 17 00:00:00 2001 From: Alexander Akait <4567934+alexander-akait@users.noreply.github.com> Date: Thu, 6 Feb 2025 21:08:08 +0300 Subject: [PATCH 2/2] feat: implement `/* webpackIgnore: true */` for `require.resolve` (#19201) --- .../CommonJsImportsParserPlugin.js | 30 +++++++++++++++++++ .../parsing/require-resolve-ignore/index.js | 9 ++++++ .../parsing/require-resolve-ignore/other.js | 8 +++++ .../require-resolve-ignore/webpack.config.js | 20 +++++++++++++ 4 files changed, 67 insertions(+) create mode 100644 test/configCases/parsing/require-resolve-ignore/index.js create mode 100644 test/configCases/parsing/require-resolve-ignore/other.js create mode 100644 test/configCases/parsing/require-resolve-ignore/webpack.config.js 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 + } +};