Permalink
Cannot retrieve contributors at this time
Join GitHub today
GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.
Sign up
Fetching contributors…
| /* | |
| MIT License http://www.opensource.org/licenses/mit-license.php | |
| Author Tobias Koppers @sokra | |
| */ | |
| "use strict"; | |
| const asyncLib = require("neo-async"); | |
| const EntryDependency = require("./dependencies/EntryDependency"); | |
| const { compareModulesById } = require("./util/comparators"); | |
| const { dirname, mkdirp } = require("./util/fs"); | |
| /** @typedef {import("./Compiler")} Compiler */ | |
| /** | |
| * @typedef {Object} ManifestModuleData | |
| * @property {string | number} id | |
| * @property {Object} buildMeta | |
| * @property {boolean | string[]} exports | |
| */ | |
| /** | |
| * @template T | |
| * @param {Iterable<T>} iterable iterable | |
| * @param {function(T): boolean} filter predicate | |
| * @returns {boolean} true, if some items match the filter predicate | |
| */ | |
| const someInIterable = (iterable, filter) => { | |
| for (const item of iterable) { | |
| if (filter(item)) return true; | |
| } | |
| return false; | |
| }; | |
| class LibManifestPlugin { | |
| constructor(options) { | |
| this.options = options; | |
| } | |
| /** | |
| * Apply the plugin | |
| * @param {Compiler} compiler the compiler instance | |
| * @returns {void} | |
| */ | |
| apply(compiler) { | |
| compiler.hooks.emit.tapAsync( | |
| "LibManifestPlugin", | |
| (compilation, callback) => { | |
| const moduleGraph = compilation.moduleGraph; | |
| asyncLib.forEach( | |
| Array.from(compilation.chunks), | |
| (chunk, callback) => { | |
| if (!chunk.isOnlyInitial()) { | |
| callback(); | |
| return; | |
| } | |
| const chunkGraph = compilation.chunkGraph; | |
| const targetPath = compilation.getPath(this.options.path, { | |
| chunk | |
| }); | |
| const name = | |
| this.options.name && | |
| compilation.getPath(this.options.name, { | |
| chunk | |
| }); | |
| const content = Object.create(null); | |
| for (const module of chunkGraph.getOrderedChunkModulesIterable( | |
| chunk, | |
| compareModulesById(chunkGraph) | |
| )) { | |
| if ( | |
| this.options.entryOnly && | |
| !someInIterable( | |
| moduleGraph.getIncomingConnections(module), | |
| c => c.dependency instanceof EntryDependency | |
| ) | |
| ) { | |
| continue; | |
| } | |
| const ident = module.libIdent({ | |
| context: this.options.context || compiler.options.context, | |
| associatedObjectForCache: compiler.root | |
| }); | |
| if (ident) { | |
| const exportsInfo = moduleGraph.getExportsInfo(module); | |
| const providedExports = exportsInfo.getProvidedExports(); | |
| /** @type {ManifestModuleData} */ | |
| const data = { | |
| id: chunkGraph.getModuleId(module), | |
| buildMeta: module.buildMeta, | |
| exports: Array.isArray(providedExports) | |
| ? providedExports | |
| : undefined | |
| }; | |
| content[ident] = data; | |
| } | |
| } | |
| const manifest = { | |
| name, | |
| type: this.options.type, | |
| content | |
| }; | |
| // Apply formatting to content if format flag is true; | |
| const manifestContent = this.options.format | |
| ? JSON.stringify(manifest, null, 2) | |
| : JSON.stringify(manifest); | |
| const buffer = Buffer.from(manifestContent, "utf8"); | |
| mkdirp( | |
| compiler.intermediateFileSystem, | |
| dirname(compiler.intermediateFileSystem, targetPath), | |
| err => { | |
| if (err) return callback(err); | |
| compiler.intermediateFileSystem.writeFile( | |
| targetPath, | |
| buffer, | |
| callback | |
| ); | |
| } | |
| ); | |
| }, | |
| callback | |
| ); | |
| } | |
| ); | |
| } | |
| } | |
| module.exports = LibManifestPlugin; |