aboutsummaryrefslogtreecommitdiffstats
path: root/config/webpack/plugins/create-rules-webpack-plugin.js
diff options
context:
space:
mode:
Diffstat (limited to 'config/webpack/plugins/create-rules-webpack-plugin.js')
-rw-r--r--config/webpack/plugins/create-rules-webpack-plugin.js23
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) {