|
|
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- "use strict";
-
- const path = require("path");
- const asyncLib = require("neo-async");
- const SingleEntryDependency = require("./dependencies/SingleEntryDependency");
-
- class LibManifestPlugin {
- constructor(options) {
- this.options = options;
- }
-
- apply(compiler) {
- compiler.hooks.emit.tapAsync(
- "LibManifestPlugin",
- (compilation, callback) => {
- asyncLib.forEach(
- compilation.chunks,
- (chunk, callback) => {
- if (!chunk.isOnlyInitial()) {
- callback();
- return;
- }
- const targetPath = compilation.getPath(this.options.path, {
- hash: compilation.hash,
- chunk
- });
- const name =
- this.options.name &&
- compilation.getPath(this.options.name, {
- hash: compilation.hash,
- chunk
- });
- const manifest = {
- name,
- type: this.options.type,
- content: Array.from(chunk.modulesIterable, module => {
- if (
- this.options.entryOnly &&
- !module.reasons.some(
- r => r.dependency instanceof SingleEntryDependency
- )
- ) {
- return;
- }
- if (module.libIdent) {
- const ident = module.libIdent({
- context: this.options.context || compiler.options.context
- });
- if (ident) {
- return {
- ident,
- data: {
- id: module.id,
- buildMeta: module.buildMeta
- }
- };
- }
- }
- })
- .filter(Boolean)
- .reduce((obj, item) => {
- obj[item.ident] = item.data;
- return obj;
- }, Object.create(null))
- };
- // Apply formatting to content if format flag is true;
- const manifestContent = this.options.format
- ? JSON.stringify(manifest, null, 2)
- : JSON.stringify(manifest);
- const content = Buffer.from(manifestContent, "utf8");
- compiler.outputFileSystem.mkdirp(path.dirname(targetPath), err => {
- if (err) return callback(err);
- compiler.outputFileSystem.writeFile(
- targetPath,
- content,
- callback
- );
- });
- },
- callback
- );
- }
- );
- }
- }
- module.exports = LibManifestPlugin;
|