| | |
| | | const WorkerPlugin = require("./dependencies/WorkerPlugin"); |
| | | |
| | | const JavascriptModulesPlugin = require("./javascript/JavascriptModulesPlugin"); |
| | | const JavascriptParser = require("./javascript/JavascriptParser"); |
| | | |
| | | const JsonModulesPlugin = require("./json/JsonModulesPlugin"); |
| | | |
| | |
| | | |
| | | const { cleverMerge } = require("./util/cleverMerge"); |
| | | |
| | | /** @typedef {import("../declarations/WebpackOptions").WebpackPluginFunction} WebpackPluginFunction */ |
| | | /** @typedef {import("./webpack").WebpackPluginFunction} WebpackPluginFunction */ |
| | | /** @typedef {import("./config/defaults").WebpackOptionsNormalizedWithDefaults} WebpackOptions */ |
| | | /** @typedef {import("./config/normalization").WebpackOptionsInterception} WebpackOptionsInterception */ |
| | | /** @typedef {import("./Compiler")} Compiler */ |
| | | /** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */ |
| | | /** @typedef {import("./util/fs").IntermediateFileSystem} IntermediateFileSystem */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * Returns options object. |
| | | * @param {WebpackOptions} options options object |
| | | * @param {Compiler} compiler compiler object |
| | | * @param {WebpackOptionsInterception=} interception intercepted options |
| | | * @returns {WebpackOptions} options object |
| | | */ |
| | | process(options, compiler) { |
| | | process(options, compiler, interception) { |
| | | compiler.outputPath = options.output.path; |
| | | compiler.recordsInputPath = options.recordsInputPath || null; |
| | | compiler.recordsOutputPath = options.recordsOutputPath || null; |
| | |
| | | const NodeTargetPlugin = require("./node/NodeTargetPlugin"); |
| | | |
| | | // Some older versions of Node.js don't support all built-in modules via import, only via `require`, |
| | | // but шt seems like there shouldn't be a warning here since these versions are rarely used in real applications |
| | | // but it seems like there shouldn't be a warning here since these versions are rarely used in real applications |
| | | new NodeTargetPlugin( |
| | | options.output.module && |
| | | compiler.platform.node === null && |
| | | compiler.platform.web === null |
| | | ? "module-import" |
| | | : "node-commonjs" |
| | | options.output.module ? "module-import" : "node-commonjs" |
| | | ).apply(compiler); |
| | | |
| | | // Handle external CSS `@import` and `url()` |
| | |
| | | "module", |
| | | ({ request, dependencyType, contextInfo }, callback) => { |
| | | if ( |
| | | /\.css(\?|$)/.test(contextInfo.issuer) && |
| | | /^(\/\/|https?:\/\/|#)/.test(request) |
| | | /\.css(?:\?|$)/.test(contextInfo.issuer) && |
| | | /^(?:\/\/|https?:\/\/|#)/.test(request) |
| | | ) { |
| | | if (dependencyType === "url") { |
| | | return callback(null, `asset ${request}`); |
| | |
| | | const ExternalsPlugin = require("./ExternalsPlugin"); |
| | | |
| | | new ExternalsPlugin(type, ({ request, dependencyType }, callback) => { |
| | | if (/^(\/\/|https?:\/\/|#|std:|jsr:|npm:)/.test(request)) { |
| | | if (/^(?:\/\/|https?:\/\/|#|std:|jsr:|npm:)/.test(request)) { |
| | | if (dependencyType === "url") { |
| | | return callback(null, `asset ${request}`); |
| | | } else if ( |
| | |
| | | options.experiments.css |
| | | ) { |
| | | return callback(null, `css-import ${request}`); |
| | | } else if (/^(\/\/|https?:\/\/|std:|jsr:|npm:)/.test(request)) { |
| | | } else if (/^(?:\/\/|https?:\/\/|std:|jsr:|npm:)/.test(request)) { |
| | | return callback(null, `${type} ${request}`); |
| | | } |
| | | } |
| | |
| | | ).apply(compiler); |
| | | } |
| | | |
| | | if (options.devtool) { |
| | | if (options.devtool.includes("source-map")) { |
| | | const hidden = options.devtool.includes("hidden"); |
| | | const inline = options.devtool.includes("inline"); |
| | | const evalWrapped = options.devtool.includes("eval"); |
| | | const cheap = options.devtool.includes("cheap"); |
| | | const moduleMaps = options.devtool.includes("module"); |
| | | const noSources = options.devtool.includes("nosources"); |
| | | const debugIds = options.devtool.includes("debugids"); |
| | | const Plugin = evalWrapped |
| | | ? require("./EvalSourceMapDevToolPlugin") |
| | | : require("./SourceMapDevToolPlugin"); |
| | | new Plugin({ |
| | | filename: inline ? null : options.output.sourceMapFilename, |
| | | moduleFilenameTemplate: options.output.devtoolModuleFilenameTemplate, |
| | | fallbackModuleFilenameTemplate: |
| | | options.output.devtoolFallbackModuleFilenameTemplate, |
| | | append: hidden ? false : undefined, |
| | | module: moduleMaps ? true : !cheap, |
| | | columns: !cheap, |
| | | noSources, |
| | | namespace: options.output.devtoolNamespace, |
| | | debugIds |
| | | }).apply(compiler); |
| | | } else if (options.devtool.includes("eval")) { |
| | | const EvalDevToolModulePlugin = require("./EvalDevToolModulePlugin"); |
| | | let devtool = |
| | | interception === undefined ? options.devtool : interception.devtool; |
| | | devtool = Array.isArray(devtool) |
| | | ? devtool |
| | | : typeof devtool === "string" |
| | | ? [{ type: "all", use: devtool }] |
| | | : []; |
| | | |
| | | new EvalDevToolModulePlugin({ |
| | | moduleFilenameTemplate: options.output.devtoolModuleFilenameTemplate, |
| | | namespace: options.output.devtoolNamespace |
| | | }).apply(compiler); |
| | | for (const item of devtool) { |
| | | const { type, use } = item; |
| | | |
| | | if (use) { |
| | | if (use.includes("source-map")) { |
| | | const hidden = use.includes("hidden"); |
| | | const inline = use.includes("inline"); |
| | | const evalWrapped = use.includes("eval"); |
| | | const cheap = use.includes("cheap"); |
| | | const moduleMaps = use.includes("module"); |
| | | const noSources = use.includes("nosources"); |
| | | const debugIds = use.includes("debugids"); |
| | | const Plugin = evalWrapped |
| | | ? require("./EvalSourceMapDevToolPlugin") |
| | | : require("./SourceMapDevToolPlugin"); |
| | | const assetExt = |
| | | type === "javascript" |
| | | ? /\.((c|m)?js)($|\?)/i |
| | | : type === "css" |
| | | ? /\.(css)($|\?)/i |
| | | : /\.((c|m)?js|css)($|\?)/i; |
| | | |
| | | new Plugin({ |
| | | test: evalWrapped ? undefined : assetExt, |
| | | filename: inline ? null : options.output.sourceMapFilename, |
| | | moduleFilenameTemplate: |
| | | options.output.devtoolModuleFilenameTemplate, |
| | | fallbackModuleFilenameTemplate: |
| | | options.output.devtoolFallbackModuleFilenameTemplate, |
| | | append: hidden ? false : undefined, |
| | | module: moduleMaps ? true : !cheap, |
| | | columns: !cheap, |
| | | noSources, |
| | | namespace: options.output.devtoolNamespace, |
| | | debugIds |
| | | }).apply(compiler); |
| | | } else if (use.includes("eval")) { |
| | | const EvalDevToolModulePlugin = require("./EvalDevToolModulePlugin"); |
| | | |
| | | new EvalDevToolModulePlugin({ |
| | | moduleFilenameTemplate: |
| | | options.output.devtoolModuleFilenameTemplate, |
| | | namespace: options.output.devtoolNamespace |
| | | }).apply(compiler); |
| | | } |
| | | } |
| | | } |
| | | |
| | | new JavascriptModulesPlugin().apply(compiler); |
| | | new JsonModulesPlugin().apply(compiler); |
| | | new AssetModulesPlugin().apply(compiler); |
| | | new AssetModulesPlugin({ |
| | | sideEffectFree: options.experiments.futureDefaults |
| | | }).apply(compiler); |
| | | |
| | | if (!options.experiments.outputModule) { |
| | | if (options.output.module) { |
| | |
| | | typeof options.experiments.lazyCompilation === "object" |
| | | ? options.experiments.lazyCompilation |
| | | : {}; |
| | | const isUniversalTarget = |
| | | options.output.module && |
| | | compiler.platform.node === null && |
| | | compiler.platform.web === null; |
| | | |
| | | if (isUniversalTarget) { |
| | | const emitter = require.resolve("../hot/emitter-event-target.js"); |
| | | |
| | | const NormalModuleReplacementPlugin = require("./NormalModuleReplacementPlugin"); |
| | | |
| | | // Override emitter that using `EventEmitter` to `EventTarget` |
| | | // TODO webpack 6 - migrate to `EventTarget` by default |
| | | new NormalModuleReplacementPlugin(/emitter(\.js)?$/, (result) => { |
| | | if ( |
| | | /webpack[/\\]hot|webpack-dev-server[/\\]client|webpack-hot-middleware[/\\]client/.test( |
| | | result.context |
| | | ) |
| | | ) { |
| | | result.request = emitter; |
| | | } |
| | | |
| | | return result; |
| | | }).apply(compiler); |
| | | } |
| | | |
| | | const backend = require.resolve( |
| | | isUniversalTarget |
| | | ? "../hot/lazy-compilation-universal.js" |
| | | : `../hot/lazy-compilation-${ |
| | | options.externalsPresets.node ? "node" : "web" |
| | | }.js` |
| | | ); |
| | | |
| | | new LazyCompilationPlugin({ |
| | | backend: |
| | | typeof lazyOptions.backend === "function" |
| | |
| | | : require("./hmr/lazyCompilationBackend")({ |
| | | ...lazyOptions.backend, |
| | | client: |
| | | (lazyOptions.backend && lazyOptions.backend.client) || |
| | | require.resolve( |
| | | `../hot/lazy-compilation-${ |
| | | options.externalsPresets.node ? "node" : "web" |
| | | }.js` |
| | | ) |
| | | (lazyOptions.backend && lazyOptions.backend.client) || backend |
| | | }), |
| | | entries: !lazyOptions || lazyOptions.entries !== false, |
| | | imports: !lazyOptions || lazyOptions.imports !== false, |
| | |
| | | new HttpUriPlugin(httpOptions).apply(compiler); |
| | | } |
| | | |
| | | if (options.experiments.deferImport) { |
| | | const JavascriptParser = require("./javascript/JavascriptParser"); |
| | | if ( |
| | | !( |
| | | /** @type {typeof JavascriptParser & { __importPhasesExtended?: true }} */ |
| | | (JavascriptParser).__importPhasesExtended |
| | | ) && |
| | | (options.experiments.deferImport || options.experiments.sourceImport) |
| | | ) { |
| | | const importPhases = require("acorn-import-phases"); |
| | | |
| | | JavascriptParser.extend(importPhases({ source: false })); |
| | | JavascriptParser.extend(importPhases({ source: true, defer: true })); |
| | | /** @type {typeof JavascriptParser & { __importPhasesExtended?: true }} */ |
| | | (JavascriptParser).__importPhasesExtended = true; |
| | | } |
| | | |
| | | new EntryOptionPlugin().apply(compiler); |