75 lines
		
	
	
		
			No EOL
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			No EOL
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const webpack = require('webpack');
 | |
| const path = require('path');
 | |
| const fs = require('fs');
 | |
| 
 | |
| function getStat(path) {
 | |
| 	try {
 | |
| 		const stat = fs.statSync(path);
 | |
| 
 | |
| 		return stat ? {
 | |
| 			mtime: stat.mtimeMs,
 | |
| 			size: stat.size,
 | |
| 			inode: stat.ino,
 | |
| 		} : null;
 | |
| 	} catch {
 | |
| 		return null;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| class SaveStatePlugin {
 | |
| 	constructor(inp) {
 | |
| 		this.cache = [];
 | |
| 		this.cachePath = inp.cachePath;
 | |
| 	}
 | |
| 
 | |
| 	apply(compiler) {
 | |
| 		compiler.hooks.afterCompile.tap('SaveStatePlugin', (compilation) => {
 | |
| 			for (const file of compilation.fileDependencies) {
 | |
| 				this.cache.push({
 | |
| 					name: file,
 | |
| 					stats: getStat(file)
 | |
| 				});
 | |
| 			}
 | |
| 		});
 | |
| 
 | |
| 		compiler.hooks.done.tap('SaveStatePlugin', (stats) => {
 | |
| 			if (stats.hasErrors()) {
 | |
| 				return;
 | |
| 			}
 | |
| 
 | |
| 			fs.writeFile(this.cachePath, JSON.stringify(this.cache), () => {
 | |
| 
 | |
| 			});
 | |
| 		});
 | |
| 	}
 | |
| }
 | |
| 
 | |
| module.exports = (inp, callback) => {
 | |
| 	const config = require(inp.configPath);
 | |
| 	
 | |
| 	config.context = inp.resourcePath;
 | |
| 	
 | |
| 	if (config.output && config.output.path) {
 | |
| 		config.output.path = path.resolve(inp.resourcePath, config.output.path);
 | |
| 	}
 | |
| 
 | |
| 	if (!config.plugins) {
 | |
| 		config.plugins = [];
 | |
| 	}
 | |
| 
 | |
| 	config.plugins.push(new SaveStatePlugin(inp));
 | |
| 	
 | |
| 	webpack(config, (err, stats) => {
 | |
| 		if (err) {
 | |
| 			callback(err);
 | |
| 			return;
 | |
| 		}
 | |
| 		
 | |
| 		if (stats.hasErrors()) {
 | |
| 			callback(null, stats.toJson());
 | |
| 			return;
 | |
| 		}
 | |
| 		
 | |
| 		callback(null, {});
 | |
| 	});
 | |
| }; | 
