UNPKG

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
"use strict"; /* 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;