You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
3.0 KiB
115 lines
3.0 KiB
/* |
|
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 { someInIterable } = require("./util/IterableHelpers"); |
|
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 |
|
*/ |
|
|
|
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.canBeInitial()) { |
|
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;
|
|
|