diff options
Diffstat (limited to 'config/webpack/plugins/create-rules-webpack-plugin.js')
| -rw-r--r-- | config/webpack/plugins/create-rules-webpack-plugin.js | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/config/webpack/plugins/create-rules-webpack-plugin.js b/config/webpack/plugins/create-rules-webpack-plugin.js index ce2fbef..e2a2568 100644 --- a/config/webpack/plugins/create-rules-webpack-plugin.js +++ b/config/webpack/plugins/create-rules-webpack-plugin.js @@ -7,6 +7,12 @@ import webpack from "webpack"; * Webpack plugin that reads all JSON rule files from `src/rules/`, * assigns sequential IDs to each rule, and emits a single `rules.json` * asset used by `declarativeNetRequest`. + * + * If `src/rules/` is missing or contains no JSON rule files, no asset is + * emitted and a build warning is raised. `CreateManifestPlugin` relies on + * that: it drops the `declarative_net_request` manifest key when + * `rules.json` is absent, so the extension never ships a dangling ruleset + * reference. */ class CreateRulesPlugin { /** @@ -21,12 +27,25 @@ class CreateRulesPlugin { stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL }, (_assets) => { - const ruleFileNames = fs.readdirSync(path.resolve(SOURCE_DIR, "rules")); + const rulesDirectoryPath = path.resolve(SOURCE_DIR, "rules"); + const ruleFileNames = fs.existsSync(rulesDirectoryPath) + ? fs.readdirSync(rulesDirectoryPath).filter((ruleFileName) => ruleFileName.endsWith(".json")) + : []; const rules = []; let ruleId = 1; + if (ruleFileNames.length === 0) { + compilation.warnings.push( + new Error( + `No *.json rule files found in ${rulesDirectoryPath}; skipping the rules.json asset and the declarative_net_request manifest key.` + ) + ); + + return; + } + for (const ruleFileName of ruleFileNames) { - const rule = JSON.parse(fs.readFileSync(path.resolve("src/rules", ruleFileName))); + const rule = JSON.parse(fs.readFileSync(path.resolve(rulesDirectoryPath, ruleFileName))); if (rule instanceof Array) { for (const currentRule of rule) { |
