From 2bd09e6f84a1b7e3acb16640604674b873c43001 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 20 Apr 2025 12:14:29 -0400 Subject: [PATCH] [mv3] Code review of conversion to DNR ruleset - Ensure no duplicates in domain collection fields - Sort rules according to the number of entries in their domain collections --- platform/mv3/make-rulesets.js | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/platform/mv3/make-rulesets.js b/platform/mv3/make-rulesets.js index b69e27a59..6ebadfcdc 100644 --- a/platform/mv3/make-rulesets.js +++ b/platform/mv3/make-rulesets.js @@ -405,6 +405,23 @@ function pruneHostnameArray(hostnames) { * */ function toJSONRuleset(ruleset) { + const nodupProps = [ 'domains', 'excludedDomains', 'requestDomains', 'excludedRequestDomains', 'initiatorDomains', 'excludedInitiatorDomains' ]; + for ( const { condition } of ruleset ) { + if ( condition === undefined ) { continue; } + for ( const prop of nodupProps ) { + if ( condition[prop] === undefined ) { continue; } + condition[prop] = Array.from(new Set(condition[prop])); + } + } + const sortProps = [ 'requestDomains', 'initiatorDomains', 'domains' ]; + ruleset.sort((a, b) => { + let aLen = 0, bLen = 0; + for ( const prop of sortProps ) { + aLen += a.condition[prop]?.length ?? 0; + bLen += b.condition[prop]?.length ?? 0; + } + return bLen - aLen; + }); const replacer = (k, v) => { if ( k.startsWith('_') ) { return; } if ( Array.isArray(v) ) { @@ -421,7 +438,9 @@ function toJSONRuleset(ruleset) { }; const indent = ruleset.length > 10 ? undefined : 1; const out = []; + let id = 1; for ( const rule of ruleset ) { + rule.id = id++; out.push(JSON.stringify(rule, replacer, indent)); } return `[\n${out.join(',\n')}\n]\n`; @@ -651,10 +670,6 @@ async function processNetworkFilters(assetDetails, network) { } if ( strictBlocked.size !== 0 ) { mergeRules(strictBlocked, 'requestDomains'); - let id = 1; - for ( const rule of strictBlocked.values() ) { - rule.id = id++; - } writeFile(`${rulesetDir}/strictblock/${assetDetails.id}.json`, toJSONRuleset(Array.from(strictBlocked.values())) );