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"