diff --git a/bamboo-specs/adguard-api-increment.yaml b/bamboo-specs/adguard-api-increment.yaml index 600363a151..4b55cf4373 100644 --- a/bamboo-specs/adguard-api-increment.yaml +++ b/bamboo-specs/adguard-api-increment.yaml @@ -28,7 +28,7 @@ Increment: scripts: - |- branch="${bamboo.planRepository.branchName}" - + # Throw error if current branch is not "master", # because we do not deploy changes from other branches if [ $branch != "master" ] diff --git a/bamboo-specs/tsurlfilter-build.yaml b/bamboo-specs/tsurlfilter-build.yaml index 4fcee65474..a30f54c3bf 100644 --- a/bamboo-specs/tsurlfilter-build.yaml +++ b/bamboo-specs/tsurlfilter-build.yaml @@ -38,7 +38,7 @@ Build: ls -alt npx lerna@6 bootstrap --scope @adguard/tsurlfilter --include-dependencies - npx lerna@6 run --scope @adguard/tsurlfilter build + npx lerna@6 run --scope @adguard/tsurlfilter build cd packages/tsurlfilter/ yarn pack --filename tsurlfilter.tgz diff --git a/bamboo-specs/tsurlfilter-increment.yaml b/bamboo-specs/tsurlfilter-increment.yaml index 45990116b6..6a4c9cd85f 100644 --- a/bamboo-specs/tsurlfilter-increment.yaml +++ b/bamboo-specs/tsurlfilter-increment.yaml @@ -30,7 +30,7 @@ Increment: branch="${bamboo.planRepository.branchName}" # Throw error if current branch is neither "master" nor "v1", - # because we do not deploy changes from other branches + # because we do not deploy changes from other branches if [ $branch != "master" && $branch != "v1" ] then echo "increment is not supported on branch ${branch}" diff --git a/bamboo-specs/tsurlfilter-tests.yaml b/bamboo-specs/tsurlfilter-tests.yaml index 5eb4024d61..ee72206d9b 100644 --- a/bamboo-specs/tsurlfilter-tests.yaml +++ b/bamboo-specs/tsurlfilter-tests.yaml @@ -36,8 +36,8 @@ Test: ls -alt npx lerna@6 bootstrap --scope @adguard/tsurlfilter --include-dependencies - npx lerna@6 run --scope @adguard/tsurlfilter test:prod - npx lerna@6 run --scope @adguard/tsurlfilter build + npx lerna@6 run --scope @adguard/tsurlfilter test:prod + npx lerna@6 run --scope @adguard/tsurlfilter build # cleanup parent rm -rf node_modules diff --git a/bamboo-specs/tswebextension-tests.yaml b/bamboo-specs/tswebextension-tests.yaml index 8b638fa19a..4ed4daa6d2 100644 --- a/bamboo-specs/tswebextension-tests.yaml +++ b/bamboo-specs/tswebextension-tests.yaml @@ -47,7 +47,7 @@ Test: # build tsurlfilter first, because it is used in tswebextension tests npx lerna@6 run --scope @adguard/tsurlfilter build - + npx lerna@6 run --scope @adguard/tswebextension test:prod npx lerna@6 run --scope @adguard/tswebextension build diff --git a/packages/agtree/src/compatibility-tables/modifiers/all.yml b/packages/agtree/src/compatibility-tables/modifiers/all.yml index 64a432e463..12ea0bc6f6 100644 --- a/packages/agtree/src/compatibility-tables/modifiers/all.yml +++ b/packages/agtree/src/compatibility-tables/modifiers/all.yml @@ -1,28 +1,28 @@ adg_os_any: name: all description: $all modifier is made of $document, $popup, and all content-type modifiers combined. - docs: https://adguard.com/kb/general/ad-filtering/create-own-filters/#all-modifier + docs: https://adguard.app/kb/general/ad-filtering/create-own-filters/#all-modifier negatable: false block_only: true adg_ext_any: name: all description: $all modifier is made of $document, $popup, and all content-type modifiers combined. - docs: https://adguard.com/kb/general/ad-filtering/create-own-filters/#all-modifier + docs: https://adguard.app/kb/general/ad-filtering/create-own-filters/#all-modifier negatable: false block_only: true adg_cb_ios: name: all description: The `$all` modifier is made of `$document`, `$popup`, and all content-type modifiers combined. - docs: https://adguard.com/kb/general/ad-filtering/create-own-filters/#all-modifier + docs: https://adguard.app/kb/general/ad-filtering/create-own-filters/#all-modifier negatable: false block_only: true adg_cb_safari: name: all description: The `$all` modifier is made of `$document`, `$popup`, and all content-type modifiers combined. - docs: https://adguard.com/kb/general/ad-filtering/create-own-filters/#all-modifier + docs: https://adguard.app/kb/general/ad-filtering/create-own-filters/#all-modifier negatable: false block_only: true diff --git a/packages/agtree/src/compatibility-tables/modifiers/app.yml b/packages/agtree/src/compatibility-tables/modifiers/app.yml index 4b06b67578..72b802dc1a 100644 --- a/packages/agtree/src/compatibility-tables/modifiers/app.yml +++ b/packages/agtree/src/compatibility-tables/modifiers/app.yml @@ -3,6 +3,6 @@ adg_os_any: description: |- The `$app` modifier lets you narrow the rule coverage down to a specific application or a list of applications. The modifier's behavior and syntax perfectly match the corresponding basic rules `$app` modifier. - docs: https://adguard.com/kb/general/ad-filtering/create-own-filters/#app-modifier + docs: https://adguard.app/kb/general/ad-filtering/create-own-filters/#app-modifier assignable: true negatable: false diff --git a/packages/agtree/src/compatibility-tables/modifiers/badfilter.yml b/packages/agtree/src/compatibility-tables/modifiers/badfilter.yml index e0ec8f4eb5..4a83e93871 100644 --- a/packages/agtree/src/compatibility-tables/modifiers/badfilter.yml +++ b/packages/agtree/src/compatibility-tables/modifiers/badfilter.yml @@ -3,7 +3,7 @@ adg_os_any: description: |- The rules with the `$badfilter` modifier disable other basic rules to which they refer. It means that the text of the disabled rule should match the text of the `$badfilter` rule (without the `$badfilter` modifier). - docs: https://adguard.com/kb/general/ad-filtering/create-own-filters/#badfilter-modifier + docs: https://adguard.app/kb/general/ad-filtering/create-own-filters/#badfilter-modifier negatable: false adg_ext_any: @@ -11,7 +11,7 @@ adg_ext_any: description: |- The rules with the `$badfilter` modifier disable other basic rules to which they refer. It means that the text of the disabled rule should match the text of the `$badfilter` rule (without the `$badfilter` modifier). - docs: https://adguard.com/kb/general/ad-filtering/create-own-filters/#badfilter-modifier + docs: https://adguard.app/kb/general/ad-filtering/create-own-filters/#badfilter-modifier negatable: false adg_cb_ios: @@ -19,7 +19,7 @@ adg_cb_ios: description: |- The rules with the `$badfilter` modifier disable other basic rules to which they refer. It means that the text of the disabled rule should match the text of the `$badfilter` rule (without the `$badfilter` modifier). - docs: https://adguard.com/kb/general/ad-filtering/create-own-filters/#badfilter-modifier + docs: https://adguard.app/kb/general/ad-filtering/create-own-filters/#badfilter-modifier negatable: false adg_cb_safari: @@ -27,7 +27,7 @@ adg_cb_safari: description: |- The rules with the `$badfilter` modifier disable other basic rules to which they refer. It means that the text of the disabled rule should match the text of the `$badfilter` rule (without the `$badfilter` modifier). - docs: https://adguard.com/kb/general/ad-filtering/create-own-filters/#badfilter-modifier + docs: https://adguard.app/kb/general/ad-filtering/create-own-filters/#badfilter-modifier negatable: false ubo_ext_any: diff --git a/packages/agtree/src/compatibility-tables/modifiers/content.yml b/packages/agtree/src/compatibility-tables/modifiers/content.yml index 860ebd81e4..12a3a8dbff 100644 --- a/packages/agtree/src/compatibility-tables/modifiers/content.yml +++ b/packages/agtree/src/compatibility-tables/modifiers/content.yml @@ -1,6 +1,6 @@ adg_os_any: name: content description: Disables HTML filtering and `$replace` rules on the pages that match the rule. - docs: https://adguard.com/kb/general/ad-filtering/create-own-filters/#content-modifier + docs: https://adguard.app/kb/general/ad-filtering/create-own-filters/#content-modifier negatable: false exception_only: true diff --git a/packages/agtree/src/compatibility-tables/modifiers/cookie.yml b/packages/agtree/src/compatibility-tables/modifiers/cookie.yml index fd3666b04e..3b08c15f25 100644 --- a/packages/agtree/src/compatibility-tables/modifiers/cookie.yml +++ b/packages/agtree/src/compatibility-tables/modifiers/cookie.yml @@ -3,7 +3,7 @@ adg_os_any: description: |- The `$cookie` modifier completely changes rule behavior. Instead of blocking a request, this modifier makes us suppress or modify the Cookie and Set-Cookie headers. - docs: https://adguard.com/kb/general/ad-filtering/create-own-filters/#cookie-modifier + docs: https://adguard.app/kb/general/ad-filtering/create-own-filters/#cookie-modifier assignable: true negatable: false value_format: ^([^;=\s]*?)((?:;(maxAge=\d+;?)?|(sameSite=(lax|none|strict);?)?){1,3})(? => { return names; }; +/** + * Returns modifier data for given modifier name and adblocker. + * + * @param modifiersData Parsed all modifiers data map. + * @param blockerPrefix Prefix of the adblocker, e.g. 'adg_', 'ubo_', or 'abp_'. + * @param modifierName Modifier name. + * + * @returns Modifier data or `null` if not found. + */ +const getSpecificBlockerData = ( + modifiersData: ModifierDataMap, + blockerPrefix: string, + modifierName: string, +): SpecificPlatformModifierData | null => { + let specificBlockerData: SpecificPlatformModifierData | null = null; + + modifiersData.forEach((modifierData: ModifierData) => { + Object.keys(modifierData).forEach((blockerId) => { + const blockerData = modifierData[blockerId]; + if (blockerData.name === modifierName + || (blockerData.aliases && blockerData.aliases.includes(modifierName))) { + // modifier is found by name or alias + // so its support by specific adblocker should be checked + if (blockerId.startsWith(blockerPrefix)) { + // so maybe other data objects should be checked as well (not sure) + specificBlockerData = blockerData; + } + } + }); + }); + + return specificBlockerData; +}; + /** * Returns invalid validation result with given error message. * @@ -86,25 +120,10 @@ const validateForBlocker = ( modifier: Modifier, isBlocking: boolean, ): ValidationResult => { - // needed for validation of negation, assignment, etc. - let specificBlockerData: SpecificPlatformModifierData | undefined; - const modifierName = modifier.modifier.value; - modifiersData.forEach((modifierData: ModifierData) => { - Object.keys(modifierData).forEach((blockerId) => { - const blockerData = modifierData[blockerId]; - if (blockerData.name === modifierName - || (blockerData.aliases && blockerData.aliases.includes(modifierName))) { - // modifier is found by name or alias - // so its support by specific adblocker should be checked - if (blockerId.startsWith(blockerPrefix)) { - // so maybe other data objects should be checked as well (not sure) - specificBlockerData = blockerData; - } - } - }); - }); + // needed for validation of negation, assignment, etc. + const specificBlockerData = getSpecificBlockerData(modifiersData, blockerPrefix, modifierName); // if no specific blocker data is found if (!specificBlockerData) { @@ -161,6 +180,24 @@ const validateForBlocker = ( return { ok: true }; }; +/** + * Returns documentation URL for given modifier and adblocker. + * + * @param modifiersData Parsed all modifiers data map. + * @param blockerPrefix Prefix of the adblocker, e.g. 'adg_', 'ubo_', or 'abp_'. + * @param modifier Parsed modifier AST node. + * + * @returns Documentation URL or `null` if not found. + */ +const getBlockerDocumentationLink = ( + modifiersData: ModifierDataMap, + blockerPrefix: string, + modifier: Modifier, +): string | null => { + const specificBlockerData = getSpecificBlockerData(modifiersData, blockerPrefix, modifier.modifier.value); + return specificBlockerData?.docs || null; +}; + /** * Modifier validator class. */ @@ -184,17 +221,14 @@ export class ModifierValidator { this.allModifierNames = getAllModifierNames(this.modifiersData); } - // TODO: check the statement about deprecated modifiers. /** * Simply checks whether the modifier exists in any adblocker. * - * **Deprecated** modifiers are considered as **existent**. + * **Deprecated** and **removed** modifiers are considered as **existent**. * * @param modifier Already parsed modifier AST node. * * @returns True if modifier exists, false otherwise. - * If given modifier is a string and it cannot be parsed as a valid modifier, - * e.g. 'domain=', false is returned. */ public exists = (modifier: Modifier): boolean => { return this.allModifierNames.has(modifier.modifier.value); @@ -247,4 +281,46 @@ export class ModifierValidator { } return validateForBlocker(this.modifiersData, BLOCKER_PREFIX.ABP, modifier, isBlocking); }; + + /** + * Returns AdGuard documentation URL for given modifier. + * + * @param modifier Parsed modifier AST node. + * + * @returns AdGuard documentation URL or `null` if not found. + */ + public getAdgDocumentationLink = (modifier: Modifier): string | null => { + if (!this.exists(modifier)) { + return null; + } + return getBlockerDocumentationLink(this.modifiersData, BLOCKER_PREFIX.ADG, modifier); + }; + + /** + * Returns Ublock Origin documentation URL for given modifier. + * + * @param modifier Parsed modifier AST node. + * + * @returns Ublock Origin documentation URL or `null` if not found. + */ + public getUboDocumentationLink = (modifier: Modifier): string | null => { + if (!this.exists(modifier)) { + return null; + } + return getBlockerDocumentationLink(this.modifiersData, BLOCKER_PREFIX.UBO, modifier); + }; + + /** + * Returns AdBlock Plus documentation URL for given modifier. + * + * @param modifier Parsed modifier AST node. + * + * @returns AdBlock Plus documentation URL or `null` if not found. + */ + public getAbpDocumentationLink = (modifier: Modifier): string | null => { + if (!this.exists(modifier)) { + return null; + } + return getBlockerDocumentationLink(this.modifiersData, BLOCKER_PREFIX.ABP, modifier); + }; } diff --git a/packages/agtree/test/validator/index.test.ts b/packages/agtree/test/validator/index.test.ts index 4a5975d663..aed61cb79d 100644 --- a/packages/agtree/test/validator/index.test.ts +++ b/packages/agtree/test/validator/index.test.ts @@ -4,6 +4,12 @@ import { ModifierValidator } from '../../src/validator'; import { StringUtils } from '../../src/utils/string'; import { INVALID_ERROR_PREFIX } from '../../src/validator/constants'; +const DOCS_BASE_URL = { + ADG: 'https://adguard.app/kb/general/ad-filtering/create-own-filters/', + UBO: 'https://github.com/gorhill/uBlock/wiki/Static-filter-syntax', + ABP: 'https://help.adblockplus.org/', +}; + /** * Returns modifier AST node for given rawModifier. * @@ -236,6 +242,10 @@ describe('ModifierValidator', () => { actual: 'denyallow', expected: INVALID_ERROR_PREFIX.VALUE_REQUIRED, }, + { + actual: 'network=8.8.8.8', + expected: INVALID_ERROR_PREFIX.VALUE_FORBIDDEN, + }, { actual: 'third-party=true', expected: INVALID_ERROR_PREFIX.VALUE_FORBIDDEN, @@ -327,7 +337,6 @@ describe('ModifierValidator', () => { ]; test.each(supportedModifiers)('%s', (rawModifier) => { const modifier = getModifier(rawModifier); - // toBeTruthy() is not used because non-empty string can be returned which is truthy const validationResult = modifierValidator.validateUbo(modifier); expect(validationResult.ok).toBeTruthy(); }); @@ -459,7 +468,6 @@ describe('ModifierValidator', () => { ]; test.each(supportedModifiers)('%s', (rawModifier) => { const modifier = getModifier(rawModifier); - // toBeTruthy() is not used because non-empty string can be returned which is truthy const validationResult = modifierValidator.validateAbp(modifier); expect(validationResult.ok).toBeTruthy(); }); @@ -543,4 +551,110 @@ describe('ModifierValidator', () => { }); }); }); + + describe('getAdgDocumentationLink', () => { + const modifierValidator = new ModifierValidator(); + + describe('has docs', () => { + const modifiers = [ + 'denyallow', + 'domain=example.com', + 'third-party', + 'important', + // deprecated + 'empty', + 'mp4', + // 'webrtc' is removed and not supported but it has docs url + 'webrtc', + ]; + test.each(modifiers)('%s', (rawModifier) => { + const modifier = getModifier(rawModifier); + const docsUrl = modifierValidator.getAdgDocumentationLink(modifier); + expect(docsUrl?.startsWith(DOCS_BASE_URL.ADG)).toBeTruthy(); + }); + }); + + describe('no docs', () => { + const modifiers = [ + // not existent + 'protobuf', + // not supported by ADG + 'cname', + ]; + test.each(modifiers)('%s', (rawModifier) => { + const modifier = getModifier(rawModifier); + const docsUrl = modifierValidator.getAdgDocumentationLink(modifier); + expect(docsUrl).toBeNull(); + }); + }); + }); + + describe('getUboDocumentationLink', () => { + const modifierValidator = new ModifierValidator(); + + describe('has docs', () => { + const modifiers = [ + 'cname', + 'from=example.com', + 'third-party', + 'important', + // deprecated modifiers + 'empty', + 'mp4', + // 'webrtc' is removed and not supported but it has docs url + 'webrtc', + ]; + test.each(modifiers)('%s', (rawModifier) => { + const modifier = getModifier(rawModifier); + const docsUrl = modifierValidator.getUboDocumentationLink(modifier); + expect(docsUrl?.startsWith(DOCS_BASE_URL.UBO)).toBeTruthy(); + }); + }); + + describe('no docs', () => { + const modifiers = [ + // not existent + 'protobuf', + // not supported by UBO + 'removeheader', + ]; + test.each(modifiers)('%s', (rawModifier) => { + const modifier = getModifier(rawModifier); + const docsUrl = modifierValidator.getUboDocumentationLink(modifier); + expect(docsUrl).toBeNull(); + }); + }); + }); + + describe('getAbpDocumentationLink', () => { + const modifierValidator = new ModifierValidator(); + + describe('has docs', () => { + const modifiers = [ + 'domain=example.com', + 'third-party', + 'webrtc', + ]; + test.each(modifiers)('%s', (rawModifier) => { + const modifier = getModifier(rawModifier); + const docsUrl = modifierValidator.getAbpDocumentationLink(modifier); + expect(docsUrl?.startsWith(DOCS_BASE_URL.ABP)).toBeTruthy(); + }); + }); + + describe('no docs', () => { + const modifiers = [ + // not existent + 'protobuf', + // not supported by ABP + 'denyallow', + 'important', + ]; + test.each(modifiers)('%s', (rawModifier) => { + const modifier = getModifier(rawModifier); + const docsUrl = modifierValidator.getAbpDocumentationLink(modifier); + expect(docsUrl).toBeNull(); + }); + }); + }); }); diff --git a/packages/examples/tswebextension-mv3/package.json b/packages/examples/tswebextension-mv3/package.json index dab8dc6be9..67fcca9d5e 100644 --- a/packages/examples/tswebextension-mv3/package.json +++ b/packages/examples/tswebextension-mv3/package.json @@ -5,11 +5,11 @@ "author": "adguard@adguard.com", "license": "GPL-3.0", "scripts": { - "build": "yarn build:precompile-rules && yarn build:extension", + "build": "yarn lint && yarn build:precompile-rules && yarn build:extension", "build:extension": "node -r esbuild-register ./scripts/build", "build:tsurl": "cd ../../tsurlfilter && yarn build", "build:tsweb": "cd ../../tswebextension && yarn build", - "build:precompile-rules": "yarn lint && node -r esbuild-register ./scripts/precompile-rules.ts", + "build:precompile-rules": "node -r esbuild-register ./scripts/precompile-rules.ts", "lint": "eslint 'extension/**/*.ts' 'scripts/**/*.ts' && tsc --noEmit", "tswebextension": "tswebextension", "test": "rimraf tmp && cross-env PW_EXPERIMENTAL_SERVICE_WORKER_NETWORK_EVENTS=1 node -r esbuild-register ./scripts/browser-test/index.ts" @@ -45,6 +45,7 @@ "playwright": "^1.27.1", "rimraf": "^3.0.2", "style-loader": "^3.3.1", + "typescript": "4.7.4", "webpack": "^5.64.2" } } diff --git a/packages/examples/tswebextension-mv3/scripts/build/webpack.config.ts b/packages/examples/tswebextension-mv3/scripts/build/webpack.config.ts index 5b87e65151..fd2588d186 100644 --- a/packages/examples/tswebextension-mv3/scripts/build/webpack.config.ts +++ b/packages/examples/tswebextension-mv3/scripts/build/webpack.config.ts @@ -124,6 +124,7 @@ export const config: Configuration = { context: 'extension', from: 'filters', to: 'filters', + noErrorOnMissing: true, }, ], }), diff --git a/packages/tsurlfilter/CHANGELOG.md b/packages/tsurlfilter/CHANGELOG.md index cf95bb815c..045cbcff48 100644 --- a/packages/tsurlfilter/CHANGELOG.md +++ b/packages/tsurlfilter/CHANGELOG.md @@ -14,6 +14,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Support for $csp modifier in the MV3 converter. - Scheme for converting network rules into declarative rules. +### Changed +- Converting rules in MV3 with these modifiers `$elemhide`, `$specifichide` + and `$generichide` now does not cause any errors and is simply skipped. + ## [2.1.3] - 2023-06-26 ### Added diff --git a/packages/tsurlfilter/package.json b/packages/tsurlfilter/package.json index 611d5436fd..da7899dcb7 100644 --- a/packages/tsurlfilter/package.json +++ b/packages/tsurlfilter/package.json @@ -71,8 +71,7 @@ "start": "rollup -c rollup.config.ts -w", "test": "jest --coverage", "test:watch": "jest --coverage --watch", - "test:smoke": "cd test/builders/rollup-ts && yarn test", - "test:prod": "yarn lint && yarn test:smoke && yarn test --no-cache --runInBand", + "test:prod": "yarn lint && yarn test --no-cache --runInBand", "test:debug": "node --inspect node_modules/.bin/jest --watch --runInBand", "report-coverage": "cat ./coverage/lcov.info | coveralls", "precommit": "lint-staged", diff --git a/packages/tsurlfilter/src/rules/declarative-converter/README.md b/packages/tsurlfilter/src/rules/declarative-converter/README.md index 14346eec6b..69fb54407b 100644 --- a/packages/tsurlfilter/src/rules/declarative-converter/README.md +++ b/packages/tsurlfilter/src/rules/declarative-converter/README.md @@ -70,7 +70,7 @@ rules and describes some MV3-specific limitations of the converted rules. ## allowrules Allowrules currently are not supported for these modifiers: -1. all specific exceptions: '$elemhide', '$generichide', '$specifichide', '$genericblock', '$jsinject', '$urlblock', '$content', '$stealth'. +1. some specific exceptions: '$genericblock', '$jsinject', '$urlblock', '$content', '$stealth'. 1. `$redirect` 1. `$removeparam` 1. `$removeheader` @@ -1428,11 +1428,11 @@ example 2 # Exception rules modifiers ## $elemhide -Status: not implemented yet +Status: is supported but not converted.
MV3 limitations:
-Not convertible to DNR in MV3, but uses tsurlfilter's [CosmeticEngine](https://github.com/AdguardTeam/tsurlfilter/blob/epic/tswebextension/packages/tsurlfilter/src/engine/cosmetic-engine/cosmetic-engine.ts#L15) for work +Not convertible to DNR in MV3, but in MV3 [tswebextension](https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/tswebextension) uses content-script to request cosmetic rules from tsurlfilter's with [MatchingResult.getCosmeticOption](https://github.com/AdguardTeam/tsurlfilter/blob/master/packages/tsurlfilter/src/engine/matching-result.ts#L235), where $elemhide, $specifichide and $generichide will be applied.
Examples:
@@ -1542,7 +1542,11 @@ example 2 ``` ## $generichide -Status: not implemented yet +Status: is supported but not converted. +
+MV3 limitations: +
+Not convertible to DNR in MV3, but in MV3 [tswebextension](https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/tswebextension) uses content-script to request cosmetic rules from tsurlfilter's with [MatchingResult.getCosmeticOption](https://github.com/AdguardTeam/tsurlfilter/blob/master/packages/tsurlfilter/src/engine/matching-result.ts#L235), where $elemhide, $specifichide and $generichide will be applied.
Examples:
@@ -1576,7 +1580,11 @@ example 2 ``` ## $specifichide -Status: not implemented yet +Status: is supported but not converted. +
+MV3 limitations: +
+Not convertible to DNR in MV3, but in MV3 [tswebextension](https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/tswebextension) uses content-script to request cosmetic rules from tsurlfilter's with [MatchingResult.getCosmeticOption](https://github.com/AdguardTeam/tsurlfilter/blob/master/packages/tsurlfilter/src/engine/matching-result.ts#L235), where $elemhide, $specifichide and $generichide will be applied.
Examples:
diff --git a/packages/tsurlfilter/src/rules/declarative-converter/errors/conversion-errors/unsupported-modifier-error.ts b/packages/tsurlfilter/src/rules/declarative-converter/errors/conversion-errors/unsupported-modifier-error.ts index 8d97f11406..e158e4b115 100644 --- a/packages/tsurlfilter/src/rules/declarative-converter/errors/conversion-errors/unsupported-modifier-error.ts +++ b/packages/tsurlfilter/src/rules/declarative-converter/errors/conversion-errors/unsupported-modifier-error.ts @@ -4,7 +4,7 @@ import { NetworkRule } from '../../../network-rule'; * Describes an error when a source network rule contains some of * the unsupported modifiers. * - * @see {@link DeclarativeRuleConverter.checkNetworkRuleApplicable} for more details. + * @see {@link DeclarativeRuleConverter.checkNetworkRuleConvertible} for more details. */ export class UnsupportedModifierError extends Error { networkRule: NetworkRule; diff --git a/packages/tsurlfilter/src/rules/declarative-converter/grouped-rules-converters/abstract-rule-converter.ts b/packages/tsurlfilter/src/rules/declarative-converter/grouped-rules-converters/abstract-rule-converter.ts index c5d2332cbc..762059dfe3 100644 --- a/packages/tsurlfilter/src/rules/declarative-converter/grouped-rules-converters/abstract-rule-converter.ts +++ b/packages/tsurlfilter/src/rules/declarative-converter/grouped-rules-converters/abstract-rule-converter.ts @@ -25,13 +25,13 @@ * │ │ protected convertRule() ├─────────┼───────────────────────┐ * │ │ │ │ │ * │ └───────────────────────────┘ │ │ - * │ Transforms a single Network Rule │ ┌─────────────────▼───────────────────┐ - * │ into one or several │ │ │ - * │ declarative rules. │ ┌──┤ static checkNetworkRuleApplicable() │ - * │ │ │ │ │ - * │ │ │ └─────────────────────────────────────┘ - * │ │ │ Verifies whether the conversion of - * │ │ │ a Network Rule is supported. + * │ Transforms a single Network Rule │ ┌─────────────────▼────────────────────┐ + * │ into one or several │ │ │ + * │ declarative rules. │ ┌──┤ static checkNetworkRuleConvertible() │ + * │ │ │ │ │ + * │ │ │ └──────────────────────────────────────┘ + * │ │ │ Checks if network rule conversion + * │ │ │ is supported and if it is needed at all. * │ │ │ * │ │ │ ┌──────────────────────────┐ * │ │ └──► │ @@ -515,9 +515,12 @@ export abstract class DeclarativeRuleConverter { rule: NetworkRule, id: number, ): DeclarativeRule[] { - const unsupportedErr = DeclarativeRuleConverter.checkNetworkRuleApplicable(rule); - if (unsupportedErr) { - throw unsupportedErr; + // If the rule is not convertible - method will throw an error. + const shouldConvert = DeclarativeRuleConverter.checkNetworkRuleConvertible(rule); + + // The rule does not require conversion. + if (!shouldConvert) { + return []; } const declarativeRule: DeclarativeRule = { @@ -546,13 +549,11 @@ export abstract class DeclarativeRuleConverter { * TODO: Move this method to separate static class, because it accumulates * a lot of logic tied to different types of rules and the method gets * really puffy. + * * Checks if a network rule can be converted to a declarative format or not. * We skip the following modifiers: * - * all specific exceptions: - * $elemhide; - * $generichide; - * $specifichide; + * All specific exceptions: * $genericblock; * $jsinject; * $urlblock; @@ -560,7 +561,13 @@ export abstract class DeclarativeRuleConverter { * $extension; * $stealth; * - * other: + * Following specific exceptions are not require conversion, but they + * are used in the {@link MatchingResult.getCosmeticOption}: + * $elemhide + * $generichide; + * $specifichide; + * + * Other: * $popup; * $csp; * $replace; @@ -575,9 +582,13 @@ export abstract class DeclarativeRuleConverter { * * @param rule - Network rule. * - * @returns UnsupportedModifierError if not applicable OR null. + * @throws Error with type {@link UnsupportedModifierError} if the rule is not + * convertible. + * + * @returns Boolean flag - `false` if the rule does not require conversion + * and `true` if the rule is convertible. */ - private static checkNetworkRuleApplicable(rule: NetworkRule): UnsupportedModifierError | null { + private static checkNetworkRuleConvertible(rule: NetworkRule): boolean { /** * Checks if the $redirect values in the provided network rule * are supported for conversion to MV3. @@ -661,9 +672,9 @@ export abstract class DeclarativeRuleConverter { const unsupportedOptions = [ /* Specific exceptions */ - { option: NetworkRuleOption.Elemhide, name: '$elemhide' }, - { option: NetworkRuleOption.Generichide, name: '$generichide' }, - { option: NetworkRuleOption.Specifichide, name: '$specifichide' }, + { option: NetworkRuleOption.Elemhide, name: '$elemhide', skipConversion: true }, + { option: NetworkRuleOption.Generichide, name: '$generichide', skipConversion: true }, + { option: NetworkRuleOption.Specifichide, name: '$specifichide', skipConversion: true }, { option: NetworkRuleOption.Genericblock, name: '$genericblock' }, { option: NetworkRuleOption.Jsinject, name: '$jsinject' }, { option: NetworkRuleOption.Urlblock, name: '$urlblock' }, @@ -703,25 +714,35 @@ export abstract class DeclarativeRuleConverter { ]; for (let i = 0; i < unsupportedOptions.length; i += 1) { - const { option, name, customChecks } = unsupportedOptions[i]; + const { + option, + name, + customChecks, + skipConversion, + } = unsupportedOptions[i]; + if (!rule.isSingleOptionEnabled(option)) { continue; } + if (skipConversion) { + return false; + } + if (customChecks) { for (let j = 0; j < customChecks.length; j += 1) { const err = customChecks[j](rule, name); - if (err) { - return err; + if (err !== null) { + throw err; } } } else { const msg = `Unsupported option "${name}" found in the rule: "${rule.getText()}"`; - return new UnsupportedModifierError(msg, rule); + throw new UnsupportedModifierError(msg, rule); } } - return null; + return true; } /** diff --git a/packages/tsurlfilter/src/rules/declarative-converter/readme.txt b/packages/tsurlfilter/src/rules/declarative-converter/readme.txt index c2bd16989e..d1adde49f3 100644 --- a/packages/tsurlfilter/src/rules/declarative-converter/readme.txt +++ b/packages/tsurlfilter/src/rules/declarative-converter/readme.txt @@ -8,7 +8,7 @@ ! # MV3 specific limitations ! ## allowrules ! Allowrules currently are not supported for these modifiers: -! 1. all specific exceptions: '$elemhide', '$generichide', '$specifichide', '$genericblock', '$jsinject', '$urlblock', '$content', '$stealth'. +! 1. some specific exceptions: '$genericblock', '$jsinject', '$urlblock', '$content', '$stealth'. ! 1. `$redirect` ! 1. `$removeparam` ! 1. `$removeheader` @@ -231,11 +231,11 @@ page$domain=targetdomain.com|~example.org ! # Exception rules modifiers ! ## $elemhide -! Status: not implemented yet +! Status: is supported but not converted. !
! MV3 limitations: !
-! Not convertible to DNR in MV3, but uses tsurlfilter's [CosmeticEngine](https://github.com/AdguardTeam/tsurlfilter/blob/epic/tswebextension/packages/tsurlfilter/src/engine/cosmetic-engine/cosmetic-engine.ts#L15) for work +! Not convertible to DNR in MV3, but in MV3 [tswebextension](https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/tswebextension) uses content-script to request cosmetic rules from tsurlfilter's with [MatchingResult.getCosmeticOption](https://github.com/AdguardTeam/tsurlfilter/blob/master/packages/tsurlfilter/src/engine/matching-result.ts#L235), where $elemhide, $specifichide and $generichide will be applied. !
! Examples: !
@@ -285,7 +285,11 @@ page$domain=targetdomain.com|~example.org @@||domain.com^$script,stealth,domain=example.com ! ## $generichide -! Status: not implemented yet +! Status: is supported but not converted. +!
+! MV3 limitations: +!
+! Not convertible to DNR in MV3, but in MV3 [tswebextension](https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/tswebextension) uses content-script to request cosmetic rules from tsurlfilter's with [MatchingResult.getCosmeticOption](https://github.com/AdguardTeam/tsurlfilter/blob/master/packages/tsurlfilter/src/engine/matching-result.ts#L235), where $elemhide, $specifichide and $generichide will be applied. !
! Examples: !
@@ -299,7 +303,11 @@ page$domain=targetdomain.com|~example.org @@||example.com^$genericblock ! ## $specifichide -! Status: not implemented yet +! Status: is supported but not converted. +!
+! MV3 limitations: +!
+! Not convertible to DNR in MV3, but in MV3 [tswebextension](https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/tswebextension) uses content-script to request cosmetic rules from tsurlfilter's with [MatchingResult.getCosmeticOption](https://github.com/AdguardTeam/tsurlfilter/blob/master/packages/tsurlfilter/src/engine/matching-result.ts#L235), where $elemhide, $specifichide and $generichide will be applied. !
! Examples: !
diff --git a/packages/tsurlfilter/test/builders/rollup-ts/.eslintrc.js b/packages/tsurlfilter/test/builders/rollup-ts/.eslintrc.js deleted file mode 100644 index 4532b51dee..0000000000 --- a/packages/tsurlfilter/test/builders/rollup-ts/.eslintrc.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - rules: { - 'no-console': 'off', - 'import/no-extraneous-dependencies': 'off', - }, -}; \ No newline at end of file diff --git a/packages/tsurlfilter/test/builders/rollup-ts/src/content-script.ts b/packages/tsurlfilter/test/builders/rollup-ts/src/content-script.ts deleted file mode 100644 index 5ea42dd719..0000000000 --- a/packages/tsurlfilter/test/builders/rollup-ts/src/content-script.ts +++ /dev/null @@ -1,7 +0,0 @@ -import TSUrlFilterContentScript from '@adguard/tsurlfilter/content-script'; - -const contentScript = () => { - console.log(TSUrlFilterContentScript); -}; - -export { contentScript }; diff --git a/packages/tsurlfilter/test/builders/rollup-ts/src/css-hits-counter.ts b/packages/tsurlfilter/test/builders/rollup-ts/src/css-hits-counter.ts deleted file mode 100644 index 632acda499..0000000000 --- a/packages/tsurlfilter/test/builders/rollup-ts/src/css-hits-counter.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { CssHitsCounter } from '@adguard/tsurlfilter/content-script/css-hits-counter'; - -const cssHitsCounter = () => { - console.log(CssHitsCounter); -}; - -export { cssHitsCounter }; diff --git a/packages/tsurlfilter/test/builders/rollup-ts/tsconfig.json b/packages/tsurlfilter/test/builders/rollup-ts/tsconfig.json deleted file mode 100644 index 6747d5e16f..0000000000 --- a/packages/tsurlfilter/test/builders/rollup-ts/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "target": "es2016", - "module": "esnext", - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "strict": true, - "skipLibCheck": true, - "moduleResolution": "node" - } -} diff --git a/packages/tsurlfilter/test/rules/declarative-converter/declarative-rule-converter.test.ts b/packages/tsurlfilter/test/rules/declarative-converter/declarative-rule-converter.test.ts index 4fd3c262ef..99dbbe23a7 100644 --- a/packages/tsurlfilter/test/rules/declarative-converter/declarative-rule-converter.test.ts +++ b/packages/tsurlfilter/test/rules/declarative-converter/declarative-rule-converter.test.ts @@ -1319,4 +1319,21 @@ describe('DeclarativeRuleConverter', () => { }); }); }); + + describe('skips convert cosmetic exclusions modifiers without errors', () => { + const cosmeticExclusionsModifiers = ['elemhide', 'specifichide', 'generichide']; + + it.each(cosmeticExclusionsModifiers)('skips %s', (modifier) => { + const badRule = `@@||example.com$${modifier}`; + const rules = createRulesFromText(0, [badRule]); + + const { + declarativeRules, + errors, + } = DeclarativeRulesConverter.convert([[0, rules]]); + + expect(declarativeRules).toHaveLength(0); + expect(errors).toHaveLength(0); + }); + }); }); diff --git a/packages/tswebextension/CHANGELOG.md b/packages/tswebextension/CHANGELOG.md index b2f46d7892..22f0b8dae2 100644 --- a/packages/tswebextension/CHANGELOG.md +++ b/packages/tswebextension/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 +## Unreleased + +### Added +- Support of $elemhide, $specifichide and $generichide modifiers. + ## [0.3.3] - 2023-06-19 ### Changed diff --git a/packages/tswebextension/package.json b/packages/tswebextension/package.json index ad0e94b4ec..8bdce37a1a 100644 --- a/packages/tswebextension/package.json +++ b/packages/tswebextension/package.json @@ -68,7 +68,8 @@ "build:types": "tsc --project tsconfig.build.json --declaration --emitDeclarationOnly --outdir dist/types", "start": "rollup -c rollup.config.ts -w", "test": "jest --coverage", - "test:prod": "yarn lint && yarn test --no-cache --runInBand", + "test:smoke": "cd test/builders/rollup-ts && yarn test", + "test:prod": "yarn lint && yarn test:smoke && yarn test --no-cache --runInBand", "report-coverage": "cat ./coverage/lcov.info | coveralls", "precommit": "lint-staged", "prepublishOnly": "yarn build", diff --git a/packages/tswebextension/src/lib/common/message.ts b/packages/tswebextension/src/lib/common/message.ts index a305fa1720..47ec00737e 100644 --- a/packages/tswebextension/src/lib/common/message.ts +++ b/packages/tswebextension/src/lib/common/message.ts @@ -52,6 +52,7 @@ export type GetExtendedCssPayloadValidator = z.infer & { filters: IFilter[], }; +/** + * Request Match Query, contains request details. + */ +interface MatchQuery { + requestUrl: string; + sourceUrl: string; + requestType: RequestType; + frameRule?: NetworkRule | null; +} + export type CosmeticRules = { css: string[], extendedCss: string[], @@ -108,6 +120,21 @@ class EngineApi { this.engine = undefined; } + /** + * Matches current frame and returns document-level allowlist rule if found. + * + * @param frameUrl Url of current frame. + * + * @returns Document-level allowlist rule if found, otherwise null. + */ + public matchFrame(frameUrl: string): NetworkRule | null { + if (!this.engine) { + return null; + } + + return this.engine.matchFrame(frameUrl); + } + /** * Gets cosmetic result for the specified url and cosmetic options if * engine is started. @@ -124,8 +151,9 @@ class EngineApi { const frameUrl = getHost(url); + // Checks if an allowlist rule exists at the document level, + // then discards all cosmetic rules. const frameRule = this.engine.matchFrame(url); - if (frameRule?.isAllowlist()) { return new CosmeticResult(); } @@ -241,6 +269,34 @@ class EngineApi { return scriptletDataList; } + /** + * Matches the specified request against the filtering engine and returns the matching result. + * + * @param matchQuery Item of {@link MatchQuery}, contains request details. + * + * @returns Item of {@link MatchingResult} or null, if engine is not started. + */ + public matchRequest(matchQuery: MatchQuery): MatchingResult | null { + if (!this.engine) { + return null; + } + + const { + requestUrl, + sourceUrl, + requestType, + frameRule, + } = matchQuery; + + const request = new Request( + requestUrl, + sourceUrl, + requestType, + ); + + return this.engine.matchRequest(request, frameRule); + } + /** * Builds the final output string for the specified page. * Depending on the browser we either allow or forbid the new remote rules diff --git a/packages/tswebextension/src/lib/mv3/background/messages-api.ts b/packages/tswebextension/src/lib/mv3/background/messages-api.ts index b72d495e13..4b17cdb791 100644 --- a/packages/tswebextension/src/lib/mv3/background/messages-api.ts +++ b/packages/tswebextension/src/lib/mv3/background/messages-api.ts @@ -1,4 +1,4 @@ -import { CosmeticOption } from '@adguard/tsurlfilter'; +import { RequestType } from '@adguard/tsurlfilter'; import { getAssistantCreateRulePayloadValidator, getCssPayloadValidator } from '../../common'; import { isHttpOrWsRequest } from '../../common/utils'; @@ -74,15 +74,15 @@ export class MessagesApi { return undefined; } - let { url } = res.data; + const { referrer, url } = res.data; // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1498 // When document url for iframe is about:blank then we use tab url if (!isHttpOrWsRequest(url) && sender.frameId !== 0 && sender.tab?.url) { - url = sender.tab.url; + return this.getCss(sender.tab.url, referrer, true); } - return this.getCss(url); + return this.getCss(url, referrer); } case ExtendedMV3MessageType.GetCollectedLog: { return declarativeFilteringLog.getCollected(); @@ -104,17 +104,35 @@ export class MessagesApi { /** * Builds css for specified url. * - * @param url Url for which build css. + * @param requestUrl Url for which build css. + * @param referrerUrl Referrer url of the request. + * @param isSubDocument Is request from iframe or not; defaults to false. * - * @returns Cosmetic css. + * @returns Cosmetic css or undefined if there are no css rules for this request. */ - private getCss(url: string): CosmeticRules | undefined { - logger.debug('[GET CSS]: received call', url); + private getCss(requestUrl: string, referrerUrl: string, isSubDocument = false): CosmeticRules | undefined { + logger.debug('[GET CSS]: received call', requestUrl); if (this.tsWebExtension.isStarted) { + const result = engineApi.matchRequest({ + requestUrl, + sourceUrl: referrerUrl, + // Always RequestType.Document or RequestType.SubDocument, + // because in MV3 we request CSS for the already loaded page + // from content-script. + requestType: isSubDocument ? RequestType.SubDocument : RequestType.Document, + frameRule: engineApi.matchFrame(requestUrl), + }); + + const cosmeticOption = result?.getCosmeticOption(); + + if (cosmeticOption === undefined) { + return undefined; + } + return engineApi.buildCosmeticCss( - url, - CosmeticOption.CosmeticOptionAll, + requestUrl, + cosmeticOption, false, false, ); diff --git a/packages/tswebextension/src/lib/mv3/background/messages.ts b/packages/tswebextension/src/lib/mv3/background/messages.ts index cf7f1f483e..0dfe001446 100644 --- a/packages/tswebextension/src/lib/mv3/background/messages.ts +++ b/packages/tswebextension/src/lib/mv3/background/messages.ts @@ -2,6 +2,7 @@ import { z as zod } from 'zod'; import { messageValidator as commonMessageValidator, + getCssPayloadValidator as commonGetCssPayloadValidator, MessageType as CommonMessageType, } from '../../common'; @@ -16,3 +17,9 @@ export const messageMV3Validator = commonMessageValidator.extend({ }); export type MessageMV3 = zod.infer; + +export const getCssPayloadValidator = commonGetCssPayloadValidator.extend({ + referrer: zod.string(), +}); + +export type GetCssPayload = zod.infer; diff --git a/packages/tswebextension/src/lib/mv3/content-script/index.ts b/packages/tswebextension/src/lib/mv3/content-script/index.ts index 961458e900..e419c2c0ba 100644 --- a/packages/tswebextension/src/lib/mv3/content-script/index.ts +++ b/packages/tswebextension/src/lib/mv3/content-script/index.ts @@ -2,6 +2,7 @@ import { ExtendedCss } from '@adguard/extended-css'; import { MessageType } from '../../common/message-constants'; import { sendAppMessage } from '../../common/content-script/send-app-message'; +import type { GetCssPayload } from '../background/messages'; import { logger } from '../utils/logger'; import { initAssistant } from './assistant'; @@ -48,11 +49,14 @@ const applyExtendedCss = (extendedCssRules: string[] | undefined): void => { }; (async (): Promise => { + const payload: GetCssPayload = { + url: document.location.href, + referrer: document.referrer, + }; + const res = await sendAppMessage({ type: MessageType.GetCss, - payload: { - url: document.location.href, - }, + payload, }); logger.debug('[GET_CSS]: result ', res); diff --git a/packages/tswebextension/test/builders/rollup-ts/.eslintrc.js b/packages/tswebextension/test/builders/rollup-ts/.eslintrc.js new file mode 100644 index 0000000000..30e3e210b6 --- /dev/null +++ b/packages/tswebextension/test/builders/rollup-ts/.eslintrc.js @@ -0,0 +1,12 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + sourceType: 'module', + tsconfigRootDir: __dirname, + project: ['./tsconfig.json'], + }, + rules: { + 'no-console': 'off', + 'import/no-extraneous-dependencies': 'off', + }, +}; diff --git a/packages/tsurlfilter/test/builders/rollup-ts/package.json b/packages/tswebextension/test/builders/rollup-ts/package.json similarity index 100% rename from packages/tsurlfilter/test/builders/rollup-ts/package.json rename to packages/tswebextension/test/builders/rollup-ts/package.json diff --git a/packages/tsurlfilter/test/builders/rollup-ts/rollup.config.mjs b/packages/tswebextension/test/builders/rollup-ts/rollup.config.mjs similarity index 72% rename from packages/tsurlfilter/test/builders/rollup-ts/rollup.config.mjs rename to packages/tswebextension/test/builders/rollup-ts/rollup.config.mjs index 91c6226763..a06aeef135 100644 --- a/packages/tsurlfilter/test/builders/rollup-ts/rollup.config.mjs +++ b/packages/tswebextension/test/builders/rollup-ts/rollup.config.mjs @@ -1,15 +1,6 @@ import typescript from '@rollup/plugin-typescript'; import resolve from '@rollup/plugin-node-resolve'; -const contentScriptConfig = { - input: 'src/content-script.ts', - output: { - dir: 'dist', - format: 'cjs', - }, - plugins: [typescript(), resolve()] -}; - const cssHitsCounterConfig = { input: 'src/css-hits-counter.ts', output: { @@ -30,6 +21,5 @@ const backgroundConfig = { export default [ backgroundConfig, - contentScriptConfig, cssHitsCounterConfig, ]; diff --git a/packages/tsurlfilter/test/builders/rollup-ts/src/background.ts b/packages/tswebextension/test/builders/rollup-ts/src/background.ts similarity index 77% rename from packages/tsurlfilter/test/builders/rollup-ts/src/background.ts rename to packages/tswebextension/test/builders/rollup-ts/src/background.ts index 8d80f13fe4..ecb72f067b 100644 --- a/packages/tsurlfilter/test/builders/rollup-ts/src/background.ts +++ b/packages/tswebextension/test/builders/rollup-ts/src/background.ts @@ -1,6 +1,6 @@ import * as TSUrlFilter from '@adguard/tsurlfilter'; -const background = () => { +const background = (): void => { console.log(TSUrlFilter); }; diff --git a/packages/tswebextension/test/builders/rollup-ts/src/css-hits-counter.ts b/packages/tswebextension/test/builders/rollup-ts/src/css-hits-counter.ts new file mode 100644 index 0000000000..9abd8acff6 --- /dev/null +++ b/packages/tswebextension/test/builders/rollup-ts/src/css-hits-counter.ts @@ -0,0 +1,7 @@ +import { CssHitsCounter } from '@adguard/tswebextension/content-script/css-hits-counter'; + +const cssHitsCounter = (): void => { + console.log(CssHitsCounter); +}; + +export { cssHitsCounter }; diff --git a/packages/tsurlfilter/test/builders/rollup-ts/test.sh b/packages/tswebextension/test/builders/rollup-ts/test.sh similarity index 61% rename from packages/tsurlfilter/test/builders/rollup-ts/test.sh rename to packages/tswebextension/test/builders/rollup-ts/test.sh index d3ff149f5a..bf9d758d9b 100755 --- a/packages/tsurlfilter/test/builders/rollup-ts/test.sh +++ b/packages/tswebextension/test/builders/rollup-ts/test.sh @@ -5,15 +5,15 @@ echo "Testing bundling with rollup-ts" # install other deps yarn install -# pack @adguard/tsurlfilter +# pack @adguard/tswebextension curr_path="test/builders/rollup-ts" -tsurlfilter="tsurlfilter.tgz" -(cd ../../.. && yarn pack --filename $curr_path/$tsurlfilter) +tswebextension="tswebextension.tgz" +(cd ../../.. && yarn pack --filename $curr_path/$tswebextension) -# unzip to @adguard/tsurlfilter to node_modules -tsurlfilter_nm="node_modules/@adguard/tsurlfilter" -mkdir -p $tsurlfilter_nm -tar -xzf tsurlfilter.tgz -C $tsurlfilter_nm +# unzip to @adguard/tswebextension to node_modules +tswebextension_nm="node_modules/@adguard/tswebextension" +mkdir -p $tswebextension_nm +tar -xzf $tswebextension --strip-components=1 -C $tswebextension_nm # bundle with rollup yarn build @@ -30,7 +30,6 @@ else echo "$filename is less than or equal to $max_size bytes" fi -rm $tsurlfilter +rm $tswebextension echo "Testing bundling with rollup-ts ended successfully" - diff --git a/packages/tswebextension/test/builders/rollup-ts/tsconfig.json b/packages/tswebextension/test/builders/rollup-ts/tsconfig.json new file mode 100644 index 0000000000..29dfb05985 --- /dev/null +++ b/packages/tswebextension/test/builders/rollup-ts/tsconfig.json @@ -0,0 +1,15 @@ +{ + "include": [ + "src", + ".eslintrc.js" + ], + "compilerOptions": { + "target": "es2016", + "module": "esnext", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "moduleResolution": "node" + } +} diff --git a/packages/tsurlfilter/test/builders/rollup-ts/yarn.lock b/packages/tswebextension/test/builders/rollup-ts/yarn.lock similarity index 100% rename from packages/tsurlfilter/test/builders/rollup-ts/yarn.lock rename to packages/tswebextension/test/builders/rollup-ts/yarn.lock diff --git a/packages/tswebextension/yarn.lock b/packages/tswebextension/yarn.lock index 3db54f9e34..52dbcc4211 100644 --- a/packages/tswebextension/yarn.lock +++ b/packages/tswebextension/yarn.lock @@ -20,22 +20,6 @@ "@babel/runtime" "^7.7.2" js-yaml "^3.13.1" -"@adguard/tsurlfilter@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@adguard/tsurlfilter/-/tsurlfilter-2.1.2.tgz#9b0d7e22b6aa194b1adf0ff7183d9cef36e92967" - integrity sha512-r/QmqtcJ4ZtJOKEcs9p5KhLNeJXO22SsRU0lQg1m36l1BmcL2s6UGha6sx+zVUfNRHzshdU2QHWWYW/qKAXl9g== - dependencies: - "@adguard/scriptlets" "^1.9.37" - commander "9.4.1" - ip6addr "0.2.3" - is-cidr "4.0.2" - is-ip "3.1.0" - lru_map "0.4.1" - netmask "2.0.2" - punycode "2.1.1" - tldts "5.6.45" - zod "3.19.1" - "@ampproject/remapping@^2.2.0": version "2.2.1" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" @@ -1613,13 +1597,6 @@ ci-info@^3.2.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== -cidr-regex@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-3.1.1.tgz#ba1972c57c66f61875f18fd7dd487469770b571d" - integrity sha512-RBqYd32aDwbCMFJRL6wHOlDNYJsPNTt8vC82ErHF5vKt8QQzxm1FrkW8s/R5pVrXMf17sba09Uoy91PKiddAsw== - dependencies: - ip-regex "^4.1.0" - cjs-module-lexer@^1.0.0: version "1.2.3" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" @@ -1713,11 +1690,6 @@ commander@11.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-11.0.0.tgz#43e19c25dbedc8256203538e8d7e9346877a6f67" integrity sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ== -commander@9.4.1: - version "9.4.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.1.tgz#d1dd8f2ce6faf93147295c0df13c7c21141cfbdd" - integrity sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw== - commander@^10.0.0: version "10.0.1" resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" @@ -2780,19 +2752,6 @@ internal-slot@^1.0.5: has "^1.0.3" side-channel "^1.0.4" -ip-regex@^4.0.0, ip-regex@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" - integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== - -ip6addr@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/ip6addr/-/ip6addr-0.2.3.tgz#660df0d27092434f0aadee025aba8337c6d7d4d4" - integrity sha512-qA9DXRAUW+lT47/i/4+Q3GHPwZjGt/atby1FH/THN6GVATA6+Pjp2nztH7k6iKeil7hzYnBwfSsxjthlJ8lJKw== - dependencies: - assert-plus "^1.0.0" - jsprim "^1.4.0" - is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" @@ -2834,13 +2793,6 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-cidr@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-4.0.2.tgz#94c7585e4c6c77ceabf920f8cde51b8c0fda8814" - integrity sha512-z4a1ENUajDbEl/Q6/pVBpTR1nBjjEE1X7qb7bmWYanNnPoKAvUCPFKeXV6Fe4mgTkWKBqiHIcwsI3SndiO5FeA== - dependencies: - cidr-regex "^3.1.1" - is-core-module@^2.11.0: version "2.12.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" @@ -2882,13 +2834,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: dependencies: is-extglob "^2.1.1" -is-ip@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" - integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== - dependencies: - ip-regex "^4.0.0" - is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -3558,7 +3503,7 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsprim@^1.2.2, jsprim@^1.4.0: +jsprim@^1.2.2: version "1.4.2" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== @@ -3856,11 +3801,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -netmask@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" - integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== - nise@^1.5.2: version "1.5.3" resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.3.tgz#9d2cfe37d44f57317766c6e9408a359c5d3ac1f7" @@ -4172,11 +4112,6 @@ psl@^1.1.28, psl@^1.1.33: resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== -punycode@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - punycode@^2.1.0, punycode@^2.1.1: version "2.3.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" @@ -4714,23 +4649,11 @@ through@^2.3.8: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== -tldts-core@^5.6.45: - version "5.7.112" - resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-5.7.112.tgz#168459aa79495f5d46407a685a7a9f0cdc9a272b" - integrity sha512-mutrEUgG2sp0e/MIAnv9TbSLR0IPbvmAImpzqul5O/HJ2XM1/I1sajchQ/fbj0fPdA31IiuWde8EUhfwyldY1Q== - tldts-core@^6.0.8: version "6.0.8" resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.0.8.tgz#e94a920485d00dcf79514f2195199c492466fadb" integrity sha512-9DoeDV0eqDmXKkg43LGxLdJZstcdNfdhAElerrChj78Y3fYcidTKtVSLjXC0w6naMWYejPvJtTpnRPWHJJD4yw== -tldts@5.6.45: - version "5.6.45" - resolved "https://registry.yarnpkg.com/tldts/-/tldts-5.6.45.tgz#346344ba7d0d4694c6fbaa4eeb0b485c121a1ff9" - integrity sha512-Arp9q296eI/ALgV1QjjMstjGV18In4WkwGoiY6ZtkqOeZ0KiSLEA+LkHk3YJv2BYqTgnrPUSsSOK6d1tfcCdBA== - dependencies: - tldts-core "^5.6.45" - tldts@^6.0.8: version "6.0.8" resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.0.8.tgz#e2838d0d78fb6565d0c6a3d2c6cdbadb30fe9738" @@ -5153,11 +5076,6 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -zod@3.19.1: - version "3.19.1" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.19.1.tgz#112f074a97b50bfc4772d4ad1576814bd8ac4473" - integrity sha512-LYjZsEDhCdYET9ikFu6dVPGp2YH9DegXjdJToSzD9rO6fy4qiRYFoyEYwps88OseJlPyl2NOe2iJuhEhL7IpEA== - zod@3.21.4: version "3.21.4" resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db"