wext-manifest-webpack-plugin
Version:
Webpack plugin to solve the problem of generating js file for manifest.json entry
98 lines (97 loc) • 4.34 kB
JavaScript
;
/* eslint-disable import/no-extraneous-dependencies */
Object.defineProperty(exports, "__esModule", { value: true });
exports.WextManifestWebpackPlugin = void 0;
const PLUGIN_NAME = 'wext-manifest-webpack-plugin';
function getEntryResources(module) {
const resources = [];
if (module && typeof module.resource === 'string') {
resources.push(module.resource);
}
return resources;
}
function collectEntryResources(compilation, module, cache) {
var _a;
const hasModuleGraphSupport = Object.prototype.hasOwnProperty.call(compilation, 'moduleGraph');
// index of module is unique per compilation
// module.id can be null, not used here
const index = hasModuleGraphSupport
? (_a = compilation.moduleGraph.getPreOrderIndex(module)) !== null && _a !== void 0 ? _a : 1
: 1;
// get from cache
if (cache[index] !== undefined) {
return cache[index];
}
if (module && typeof module.resource === 'string') {
cache[index] = getEntryResources(module);
return cache[index];
}
const resources = [];
// if the json file is imported using a javascript file
// will need to go through dependencies to extract the resources
if (module && module.dependencies) {
module.dependencies.forEach((dep) => {
if (dep) {
const depModule = hasModuleGraphSupport
? compilation.moduleGraph.getModule(dep)
: dep.module;
const originModule = hasModuleGraphSupport
? compilation.moduleGraph.getParentModule(dep)
: dep.originModule;
const nextModule = depModule || originModule;
if (nextModule) {
const depResources = collectEntryResources(compilation, nextModule, cache);
for (let i = 0; i < depResources.length; i += 1) {
resources.push(depResources[i]);
}
}
}
});
}
cache[index] = resources;
return resources;
}
class WextManifestWebpackPlugin {
// Define `apply` as its prototype method which is supplied with compiler as its argument
apply(compiler) {
const { hooks } = compiler;
if (hooks) {
// Runs plugin after a compilation has been created.
hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
const resourcesCache = [];
// Triggered when an asset from a chunk was added to the compilation.
compilation.hooks.chunkAsset.tap(PLUGIN_NAME, (chunk, file) => {
const hasChunkGraphSupport = Object.prototype.hasOwnProperty.call(compilation, 'chunkGraph');
// Only handle js files with entry modules
if (!file.endsWith('.js') ||
(hasChunkGraphSupport &&
compilation.chunkGraph.getNumberOfEntryModules(chunk) < 1)) {
return;
}
const entryModules = hasChunkGraphSupport
? Array.from(compilation.chunkGraph.getChunkEntryModulesIterable(chunk))
: [chunk.entryModule];
if (entryModules.length < 1) {
return;
}
const entryModule = entryModules[0];
const resources = collectEntryResources(compilation, entryModule, resourcesCache);
const isManifest = resources.every((resource) => resource && /manifest\.json$/.test(resource));
if (isManifest) {
if (Array.isArray(chunk.files)) {
chunk.files = chunk.files.filter((f) => {
return f !== file;
});
}
else if (chunk.files instanceof Set) {
chunk.files.delete(file);
}
delete compilation.assets[file];
console.log(`${PLUGIN_NAME}: removed ${file}`);
}
});
});
}
}
}
exports.WextManifestWebpackPlugin = WextManifestWebpackPlugin;