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;
 |