TeaWeb/webpack/ManifestPlugin.ts

49 lines
1.5 KiB
TypeScript
Raw Normal View History

2020-03-30 23:27:59 +00:00
import * as webpack from "webpack";
import * as fs from "fs";
interface Options {
file?: string;
}
class ManifestGenerator {
private manifest_content;
readonly options: Options;
constructor(options: Options) {
this.options = options || {};
}
apply(compiler: webpack.Compiler) {
compiler.hooks.afterCompile.tap(this.constructor.name, compilation => {
const chunks_data = {};
for(const chunk_group of compilation.chunkGroups) {
console.log(chunk_group.options.name);
const js_files = [];
for(const chunk of chunk_group.chunks) {
if(chunk.files.length !== 1) throw "expected only one file per chunk";
const file = chunk.files[0];
console.log("Chunk: %s - %s - %s", chunk.id, chunk.hash, file);
//console.log(chunk);
//console.log(" - %s - %o", chunk.id, chunk);
js_files.push({
hash: chunk.hash,
file: file
})
}
chunks_data[chunk_group.options.name] = js_files;
}
this.manifest_content = {
version: 1,
chunks: chunks_data
};
});
compiler.hooks.done.tap(this.constructor.name, () => {
fs.writeFileSync(this.options.file || "manifest.json", JSON.stringify(this.manifest_content));
});
}
}
export = ManifestGenerator;