mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
				
	
	
		
			91 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
/*
 | 
						|
	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;
 |