| | |
| | | |
| | | "use strict"; |
| | | |
| | | const parseJson = require("json-parse-even-better-errors"); |
| | | const DelegatedModuleFactoryPlugin = require("./DelegatedModuleFactoryPlugin"); |
| | | const ExternalModuleFactoryPlugin = require("./ExternalModuleFactoryPlugin"); |
| | | const WebpackError = require("./WebpackError"); |
| | | const DelegatedSourceDependency = require("./dependencies/DelegatedSourceDependency"); |
| | | const createSchemaValidation = require("./util/create-schema-validation"); |
| | | const makePathsRelative = require("./util/identifier").makePathsRelative; |
| | | const { makePathsRelative } = require("./util/identifier"); |
| | | const parseJson = require("./util/parseJson"); |
| | | |
| | | /** @typedef {import("../declarations/WebpackOptions").Externals} Externals */ |
| | | /** @typedef {import("../declarations/plugins/DllReferencePlugin").DllReferencePluginOptions} DllReferencePluginOptions */ |
| | |
| | | /** @typedef {import("./Compiler").CompilationParams} CompilationParams */ |
| | | /** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */ |
| | | |
| | | const validate = createSchemaValidation( |
| | | require("../schemas/plugins/DllReferencePlugin.check"), |
| | | () => require("../schemas/plugins/DllReferencePlugin.json"), |
| | | { |
| | | name: "Dll Reference Plugin", |
| | | baseDataPath: "options" |
| | | } |
| | | ); |
| | | |
| | | /** @typedef {{ path: string, data: DllReferencePluginOptionsManifest | undefined, error: Error | undefined }} CompilationDataItem */ |
| | | |
| | | const PLUGIN_NAME = "DllReferencePlugin"; |
| | | |
| | | class DllReferencePlugin { |
| | | /** |
| | | * Creates an instance of DllReferencePlugin. |
| | | * @param {DllReferencePluginOptions} options options object |
| | | */ |
| | | constructor(options) { |
| | | validate(options); |
| | | this.options = options; |
| | | /** @type {WeakMap<CompilationParams, CompilationDataItem>} */ |
| | | this._compilationData = new WeakMap(); |
| | | } |
| | | |
| | | /** |
| | | * Apply the plugin |
| | | * Applies the plugin by registering its hooks on the compiler. |
| | | * @param {Compiler} compiler the compiler instance |
| | | * @returns {void} |
| | | */ |
| | | apply(compiler) { |
| | | compiler.hooks.validate.tap(PLUGIN_NAME, () => { |
| | | compiler.validate( |
| | | () => require("../schemas/plugins/DllReferencePlugin.json"), |
| | | this.options, |
| | | { |
| | | name: "Dll Reference Plugin", |
| | | baseDataPath: "options" |
| | | }, |
| | | (options) => |
| | | require("../schemas/plugins/DllReferencePlugin.check")(options) |
| | | ); |
| | | }); |
| | | compiler.hooks.compilation.tap( |
| | | PLUGIN_NAME, |
| | | (compilation, { normalModuleFactory }) => { |
| | |
| | | ); |
| | | } |
| | | ); |
| | | |
| | | /** @type {WeakMap<CompilationParams, CompilationDataItem>} */ |
| | | const compilationData = new WeakMap(); |
| | | |
| | | compiler.hooks.beforeCompile.tapAsync(PLUGIN_NAME, (params, callback) => { |
| | | if ("manifest" in this.options) { |
| | |
| | | // Catch errors parsing the manifest so that blank |
| | | // or malformed manifest files don't kill the process. |
| | | try { |
| | | data.data = parseJson( |
| | | /** @type {Buffer} */ (result).toString("utf8") |
| | | ); |
| | | data.data = |
| | | /** @type {DllReferencePluginOptionsManifest} */ |
| | | ( |
| | | /** @type {unknown} */ |
| | | (parseJson(/** @type {Buffer} */ (result).toString("utf8"))) |
| | | ); |
| | | } catch (parseErr) { |
| | | // Store the error in the params so that it can |
| | | // be added as a compilation error later on. |
| | |
| | | /** @type {Error} */ (parseErr).message |
| | | ); |
| | | } |
| | | this._compilationData.set(params, data); |
| | | compilationData.set(params, data); |
| | | return callback(); |
| | | }); |
| | | return; |
| | |
| | | "content" in this.options ? this.options.content : undefined; |
| | | if ("manifest" in this.options) { |
| | | const manifestParameter = this.options.manifest; |
| | | /** @type {undefined | DllReferencePluginOptionsManifest} */ |
| | | let manifest; |
| | | if (typeof manifestParameter === "string") { |
| | | const data = |
| | | /** @type {CompilationDataItem} */ |
| | | (this._compilationData.get(params)); |
| | | (compilationData.get(params)); |
| | | // If there was an error parsing the manifest |
| | | // file, exit now because the error will be added |
| | | // as a compilation error in the "compilation" hook. |
| | |
| | | if ("manifest" in this.options) { |
| | | const manifest = this.options.manifest; |
| | | if (typeof manifest === "string") { |
| | | const data = /** @type {CompilationDataItem} */ ( |
| | | this._compilationData.get(params) |
| | | ); |
| | | const data = |
| | | /** @type {CompilationDataItem} */ |
| | | (compilationData.get(params)); |
| | | // If there was an error parsing the manifest file, add the |
| | | // error as a compilation error to make the compilation fail. |
| | | if (data.error) { |
| | |
| | | |
| | | class DllManifestError extends WebpackError { |
| | | /** |
| | | * Creates an instance of DllManifestError. |
| | | * @param {string} filename filename of the manifest |
| | | * @param {string} message error message |
| | | */ |