From a97ecc0f86c829c061ad30b8dd7efeee52d39c1e Mon Sep 17 00:00:00 2001 From: HoJeong Go Date: Mon, 5 Aug 2024 16:21:06 +0900 Subject: [PATCH 1/8] chore: update dependencies --- .tool-versions | 2 +- bun.lockb | Bin 63503 -> 40699 bytes package.json | 5 +++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.tool-versions b/.tool-versions index 431bb17..fc3ac29 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1 +1 @@ -bun 1.0.1 +bun 1.1.17 diff --git a/bun.lockb b/bun.lockb index da0d06cb09f375fda3b5b1202ed2b8ed75c444cc..70fdf566b5b2e22b4ff83bd8e2cf8dfd7d0381bd 100755 GIT binary patch delta 13355 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 O9me|UgJ-k``@aB^9~Msl literal 63503 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 $a46tz(@JV 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 diff --git a/package.json b/package.json index 6fc6cb6..db8f2ed 100644 --- a/package.json +++ b/package.json @@ -11,11 +11,12 @@ "test.e2e": "playwright test test/e2e/index.spec.js" }, "dependencies": { + "@adguard/scriptlets": "^1.11.16", "@adguard/tsurlfilter": "2.2.15", "@eyeo/webext-ad-filtering-solution": "1.5.0" }, "devDependencies": { - "@ghostery/trackerdb": "^1.0.36", - "@playwright/test": "^1.38.0" + "@ghostery/trackerdb": "^1.0.208", + "@playwright/test": "^1.45.3" } } From 9ae7d4fba3a930e0562d047d98c1f5119d3fd881 Mon Sep 17 00:00:00 2001 From: HoJeong Go Date: Mon, 5 Aug 2024 16:29:59 +0900 Subject: [PATCH 2/8] feat: normalise resource names --- src/converters/helpers.js | 60 +++++++++++++++++++++++++++++++++++++++ tsconfig.json | 8 ++++++ 2 files changed, 68 insertions(+) create mode 100644 tsconfig.json diff --git a/src/converters/helpers.js b/src/converters/helpers.js index 85f0b4e..e1ef06f 100644 --- a/src/converters/helpers.js +++ b/src/converters/helpers.js @@ -1,3 +1,53 @@ +import * as path from 'node:path' +import * as redirects from '@adguard/scriptlets/dist/redirects.json' with { type: 'json' } + +function generateResourcesMapping() { + const resourcesMapping = new Map(); + + function getPreferredResource(aliases) { + for (let i = 0; i < aliases.length; i++) { + if (!allowedResourceExtensions.includes(aliases[i].split('.').pop())) { + continue; + } + + // Skip manually created uBO aliases by AdGuard + if (aliases[i].startsWith('ubo-')) { + continue; + } + + return aliases[i]; + } + + return null; + } + + for (const redirect of redirects) { + // Skip, in case of AdGuard-only resource + if (redirect.aliases === undefined) { + continue; + } + + const preferredResourceName = getPreferredResource(redirect.aliases); + + // Skip, in case of safe redirect resource name that's safe to use wasn't found + if (preferredResourceName === null) { + continue; + } + + // Register to mapping + resourcesMapping.set(redirect.title, preferredResourceName); + for (const alias of redirect.aliases) { + if (alias !== preferredResourceName) { + resourcesMapping.set(alias, preferredResourceName); + } + } + } + + return resourcesMapping; +} + +export const RESOURCES_MAPPING = generateResourcesMapping(); + export const DEFAULT_PARAM_MAPPING = { '3p': 'third-party', }; @@ -67,5 +117,15 @@ export function normalizeRule(rule) { delete newRule.condition.domains; } + if (newRule.action && newRule.action.type === 'redirect') { + const filename = path.basename(newRule.action.redirect.extensionPath); + const preferredFilename = RESOURCES_MAPPING.get(filename) + + if (preferredFilename !== undefined) { + newRule.action.redirect.extensionPath = + path.dirname(newRule.action.redirect.extensionPath) + '/' + preferredFilename; + } + } + return newRule; } diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..6344649 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + // https://bun.sh/docs/runtime/modules#path-re-mapping + "paths": { + "@adguard/scriptlets/dist/redirects.json": ["./node_modules/@adguard/scriptlets/dist/redirects.json"] + } + } +} From fb92c42ea5f4bc1d552500644227586787b524cf Mon Sep 17 00:00:00 2001 From: HoJeong Go Date: Tue, 6 Aug 2024 12:10:54 +0900 Subject: [PATCH 3/8] fix: tests --- .gitignore | 2 +- bun.lockb | Bin 40699 -> 39591 bytes package.json | 2 +- src/converters/helpers.js | 25 +++++++++++++++++++------ test/unit/helpers.js | 3 +++ 5 files changed, 24 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 4175924..0f59a68 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ node_modules dist - +test-results diff --git a/bun.lockb b/bun.lockb index 70fdf566b5b2e22b4ff83bd8e2cf8dfd7d0381bd..296ec1859620187502eed89197c20d7ab07145e2 100755 GIT binary patch delta 7652 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 IHc<`#1zNAWl>h($ diff --git a/package.json b/package.json index db8f2ed..55633bb 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@adguard/scriptlets": "^1.11.16", - "@adguard/tsurlfilter": "2.2.15", + "@adguard/tsurlfilter": "2.2.23", "@eyeo/webext-ad-filtering-solution": "1.5.0" }, "devDependencies": { diff --git a/src/converters/helpers.js b/src/converters/helpers.js index e1ef06f..fffe35e 100644 --- a/src/converters/helpers.js +++ b/src/converters/helpers.js @@ -1,8 +1,19 @@ import * as path from 'node:path' -import * as redirects from '@adguard/scriptlets/dist/redirects.json' with { type: 'json' } +import redirects from '@adguard/scriptlets/dist/redirects.json' with { type: 'json' } -function generateResourcesMapping() { +export function generateResourcesMapping() { const resourcesMapping = new Map(); + const allowedResourceExtensions = [ + 'html', + 'js', + 'css', + 'mp4', + 'mp3', + 'xml', + 'txt', + 'json', + 'empty', + ]; function getPreferredResource(aliases) { for (let i = 0; i < aliases.length; i++) { @@ -46,10 +57,10 @@ function generateResourcesMapping() { return resourcesMapping; } -export const RESOURCES_MAPPING = generateResourcesMapping(); - export const DEFAULT_PARAM_MAPPING = { '3p': 'third-party', + 'xhr': 'xmlhttprequest', + 'frame': 'subdocument' }; export function normalizeFilter(filter, { mapping = DEFAULT_PARAM_MAPPING } = {}) { @@ -80,7 +91,9 @@ export function normalizeFilter(filter, { mapping = DEFAULT_PARAM_MAPPING } = {} return `${front}$${params.join(',')}`; } -export function normalizeRule(rule) { +export const DEFAULT_RESOURCE_MAPPING = generateResourcesMapping(); + +export function normalizeRule(rule, { resourcesMapping = DEFAULT_RESOURCE_MAPPING } = {}) { if (!rule) { return; } @@ -119,7 +132,7 @@ export function normalizeRule(rule) { if (newRule.action && newRule.action.type === 'redirect') { const filename = path.basename(newRule.action.redirect.extensionPath); - const preferredFilename = RESOURCES_MAPPING.get(filename) + const preferredFilename = resourcesMapping.get(filename); if (preferredFilename !== undefined) { newRule.action.redirect.extensionPath = diff --git a/test/unit/helpers.js b/test/unit/helpers.js index 55869a8..81b6f42 100644 --- a/test/unit/helpers.js +++ b/test/unit/helpers.js @@ -7,6 +7,9 @@ function normalize(rule) { if (!rule) { return undefined; } + if (rule.condition?.resourceTypes !== undefined) { + rule.condition.resourceTypes = rule.condition.resourceTypes.sort(); + } delete rule.priority; delete rule.id; return rule; From 5690b4457681eeec8ec1966ff62aaa43676c5076 Mon Sep 17 00:00:00 2001 From: HoJeong Go Date: Tue, 6 Aug 2024 12:18:59 +0900 Subject: [PATCH 4/8] test: generateResourcesMapping filters resources without file extension --- test/unit/converters/helpers.spec.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/test/unit/converters/helpers.spec.js b/test/unit/converters/helpers.spec.js index b87fe34..d1b7f6f 100644 --- a/test/unit/converters/helpers.spec.js +++ b/test/unit/converters/helpers.spec.js @@ -1,6 +1,6 @@ import { describe, it, expect } from "bun:test"; -import { normalizeFilter, normalizeRule } from "../../../src/converters/helpers.js"; +import { generateResourcesMapping, normalizeFilter, normalizeRule } from "../../../src/converters/helpers.js"; describe("normalizeFilter", () => { it("format params", () => { @@ -122,3 +122,13 @@ describe('normalizeRule', () => { }); }); }); + +describe('generateResourcesMapping', () => { + const mapping = generateResourcesMapping(); + + it('filters resources without file extension', () => { + for (const destination of mapping.values()) { + expect(destination.match(/\w+\.\w+|empty/)).not.toBe(null); + } + }); +}); From 29e659258b4d33bc87bf0fc79110f8cd3b963b64 Mon Sep 17 00:00:00 2001 From: HoJeong Go Date: Tue, 6 Aug 2024 12:40:08 +0900 Subject: [PATCH 5/8] test: normalizeRule replaces extensionPath respecting existing dirname --- test/unit/converters/helpers.spec.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/test/unit/converters/helpers.spec.js b/test/unit/converters/helpers.spec.js index d1b7f6f..d67364d 100644 --- a/test/unit/converters/helpers.spec.js +++ b/test/unit/converters/helpers.spec.js @@ -121,6 +121,31 @@ describe('normalizeRule', () => { }, }); }); + + it('replaces extensionPath respecting existing dirname', () => { + expect(normalizeRule({ + action: { + type: 'redirect', + redirect: { + extensionPath: '/rule_resources/redirects/alias', + }, + }, + }, { + resourcesMapping: new Map([ + [ + 'alias', + 'test.js', + ], + ]), + })).toEqual({ + action: { + type: 'redirect', + redirect: { + extensionPath: '/rule_resources/redirects/test.js', + }, + }, + }); + }); }); describe('generateResourcesMapping', () => { From 1e7e9bdeda93339cfa84cfa02d3f3256f2bcd845 Mon Sep 17 00:00:00 2001 From: HoJeong Go Date: Tue, 6 Aug 2024 18:15:35 +0900 Subject: [PATCH 6/8] chore: avoid making calls in `describe` and `context` Co-authored-by: chrmod --- test/unit/converters/helpers.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unit/converters/helpers.spec.js b/test/unit/converters/helpers.spec.js index d67364d..4ec0309 100644 --- a/test/unit/converters/helpers.spec.js +++ b/test/unit/converters/helpers.spec.js @@ -149,9 +149,9 @@ describe('normalizeRule', () => { }); describe('generateResourcesMapping', () => { - const mapping = generateResourcesMapping(); - it('filters resources without file extension', () => { + const mapping = generateResourcesMapping(); + for (const destination of mapping.values()) { expect(destination.match(/\w+\.\w+|empty/)).not.toBe(null); } From 453e9d829e2d2b71ed47d3b0f5d72b12084fbda9 Mon Sep 17 00:00:00 2001 From: HoJeong Go Date: Wed, 7 Aug 2024 15:13:38 +0900 Subject: [PATCH 7/8] Update src/converters/helpers.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Philipp Claßen --- src/converters/helpers.js | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/src/converters/helpers.js b/src/converters/helpers.js index fffe35e..8973dde 100644 --- a/src/converters/helpers.js +++ b/src/converters/helpers.js @@ -16,21 +16,11 @@ export function generateResourcesMapping() { ]; function getPreferredResource(aliases) { - for (let i = 0; i < aliases.length; i++) { - if (!allowedResourceExtensions.includes(aliases[i].split('.').pop())) { - continue; - } - - // Skip manually created uBO aliases by AdGuard - if (aliases[i].startsWith('ubo-')) { - continue; - } - - return aliases[i]; - } - - return null; - } +// ignore non-supported files and manually created uBO aliases by AdGuard +return aliases.find(alias => { + const extension = alias.split('.').pop(); + return allowedResourceExtensions.includes(extension) && !alias.startsWith('ubo-'); +}); for (const redirect of redirects) { // Skip, in case of AdGuard-only resource From 85fac0af8c1aafb52caea0dda985c0b3432eda5d Mon Sep 17 00:00:00 2001 From: HoJeong Go Date: Wed, 7 Aug 2024 15:14:58 +0900 Subject: [PATCH 8/8] chore: fix autos --- src/converters/helpers.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/converters/helpers.js b/src/converters/helpers.js index 8973dde..a5eb8dd 100644 --- a/src/converters/helpers.js +++ b/src/converters/helpers.js @@ -16,11 +16,12 @@ export function generateResourcesMapping() { ]; function getPreferredResource(aliases) { -// ignore non-supported files and manually created uBO aliases by AdGuard -return aliases.find(alias => { - const extension = alias.split('.').pop(); - return allowedResourceExtensions.includes(extension) && !alias.startsWith('ubo-'); -}); + // ignore non-supported files and manually created uBO aliases by AdGuard + return aliases.find(alias => { + const extension = alias.split('.').pop(); + return allowedResourceExtensions.includes(extension) && !alias.startsWith('ubo-'); + }); + } for (const redirect of redirects) { // Skip, in case of AdGuard-only resource @@ -31,7 +32,7 @@ return aliases.find(alias => { const preferredResourceName = getPreferredResource(redirect.aliases); // Skip, in case of safe redirect resource name that's safe to use wasn't found - if (preferredResourceName === null) { + if (preferredResourceName === undefined) { continue; }