From 64661f9e7ef1f50ee7cf1fa1f298cffef840b2fb Mon Sep 17 00:00:00 2001 From: Krzysztof Modras Date: Thu, 9 Nov 2023 14:43:27 +0100 Subject: [PATCH] Cleanup --- packages/adblocker/package.json | 2 +- packages/adblocker/src/filters/cosmetic.ts | 32 +++++++++++++++------- tsconfig.json | 2 +- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/packages/adblocker/package.json b/packages/adblocker/package.json index 7393b0b113..cf3e6d712c 100644 --- a/packages/adblocker/package.json +++ b/packages/adblocker/package.json @@ -29,7 +29,7 @@ "bundle": "tsc --build ./tsconfig.bundle.json && rollup --config ./rollup.config.ts --configPlugin typescript", "prepack": "yarn run bundle", "test": "nyc mocha --config ../../.mocharc.js", - "dev": "mocha --config ../../.mocharc.js --watch", + "dev": "mocha --config ../../.mocharc.js --watch -f 'scriptlets arguments parsing'", "bench-metadata": "ts-node --project ./tools/tsconfig.json ./tools/bench-metadata.ts", "bump-internal-engine-version": "ts-node --project ./tools/tsconfig.json ./tools/auto-bump-engine-version.ts", "generate-codebooks": "concurrently -n build: \"yarn:codebook-*\" && yarn bump-internal-engine-version", diff --git a/packages/adblocker/src/filters/cosmetic.ts b/packages/adblocker/src/filters/cosmetic.ts index a31e81f350..0a482c33bf 100644 --- a/packages/adblocker/src/filters/cosmetic.ts +++ b/packages/adblocker/src/filters/cosmetic.ts @@ -95,6 +95,15 @@ function isSimpleHrefSelector(selector: string, start: number): boolean { ); } +// source https://stackoverflow.com/a/1144788 +function escapeRegExp(string: string): string { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +function replaceAll(str: string, find: string, replace: string): string { + return str.replace(new RegExp(escapeRegExp(find), 'g'), replace); +} + /** * Validate CSS selector. There is a fast path for simple selectors (e.g.: #foo * or .bar) which are the most common case. For complex ones, we rely on @@ -759,16 +768,19 @@ export default class CosmeticFilter implements IFilter { } return part; }) - .map((part: string) => - // eslint-disable-next-line @typescript-eslint/no-unsafe-call - part - .replaceAll(String.raw`\u002C`, ',') - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - .replaceAll(String.raw`\u005C`, '\\') - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - .replaceAll(/\\([^bfnrtvxu0])/g, String.raw`\\$1`), - ); - + .map((part: string) => { + const withoutUnicodeCommas = replaceAll(part, String.raw`\u002C`, ','); + const withoutUnicodeBackslashed = replaceAll( + withoutUnicodeCommas, + String.raw`\u005C`, + '\\', + ); + const withDoubleEscaping = withoutUnicodeBackslashed.replace( + /\\([^bfnrtvxu0])/g, + String.raw`\\$1`, + ); + return withDoubleEscaping; + }); return { name: parts[0], args }; } diff --git a/tsconfig.json b/tsconfig.json index eeedb03391..2cc3d1d9d3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,7 @@ "declaration": true, "declarationMap": true, "sourceMap": true, - "target": "es2021", + "target": "es2017", "module": "commonjs", "moduleResolution": "node", "strict": true,