diff --git a/CHANGELOG.md b/CHANGELOG.md index 779396bd5..5baa08442 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,16 @@ The format is based on [Keep a Changelog], and this project adheres to [Semantic +## Unreleased + +### Added + +- `isRedirectResourceCompatibleWithAdg()` method to check compatibility of redirect resources with AdGuard + without needing the full rule text [#420] + +[#420]: https://github.com/AdguardTeam/Scriptlets/issues/420 + + ## [v1.10.25] - 2024-03-28 ### Added diff --git a/README.md b/README.md index e35171b84..8c1293655 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ AdGuard's Scriptlets and Redirect resources library which provides extended capa - [`getCode()`](#redirects-api--getCode) - [`isAdgRedirectRule()`](#redirects-api--isAdgRedirectRule) - [`isValidAdgRedirectRule()`](#redirects-api--isValidAdgRedirectRule) + - [`isRedirectResourceCompatibleWithAdg()`](#redirects-api--isRedirectResourceCompatibleWithAdg) - [`isAdgRedirectCompatibleWithUbo()`](#redirects-api--isAdgRedirectCompatibleWithUbo) - [`isUboRedirectCompatibleWithAdg()`](#redirects-api--isUboRedirectCompatibleWithAdg) - [`isAbpRedirectCompatibleWithAdg()`](#redirects-api--isAbpRedirectCompatibleWithAdg) @@ -609,6 +610,18 @@ redirects.isAdgRedirectRule(rule) redirects.isValidAdgRedirectRule(rule); ``` +##### `isRedirectResourceCompatibleWithAdg()` + +```javascript +/** + * Checks if the specified redirect resource is compatible with AdGuard + * + * @param redirectName - Redirect resource name to check + * @returns true if the redirect resource is compatible with AdGuard + */ +redirects.isRedirectResourceCompatibleWithAdg(redirectName); +``` + ##### `isAdgRedirectCompatibleWithUbo()` ```javascript diff --git a/scripts/compatibility-table.json b/scripts/compatibility-table.json index abe8ea160..f818c8192 100644 --- a/scripts/compatibility-table.json +++ b/scripts/compatibility-table.json @@ -382,6 +382,9 @@ }, { "ubo": "trusted-replace-argument.js" + }, + { + "ubo": "trusted-replace-outbound-text.js" } ], "redirects": [ @@ -597,4 +600,4 @@ "ubo": "noop-0.5s.mp3" } ] -} +} \ No newline at end of file diff --git a/src/helpers/validator.ts b/src/helpers/validator.ts index 969c72fcb..e213bfe6c 100644 --- a/src/helpers/validator.ts +++ b/src/helpers/validator.ts @@ -440,6 +440,16 @@ const isValidAdgRedirectRule = (rule: string): boolean => { return isRedirectRuleByType(rule, RedirectRuleType.ValidAdg); }; +/** + * Checks if the specified redirect resource is compatible with AdGuard + * + * @param redirectName - Redirect resource name to check + * @returns - true if the redirect resource is compatible with AdGuard + */ +export const isRedirectResourceCompatibleWithAdg = (redirectName: string): boolean => { + return Object.keys(validAdgCompatibility).includes(redirectName); +}; + /** * Checks if the AdGuard redirect `rule` has Ubo analog. Needed for Adg->Ubo conversion * @@ -519,6 +529,7 @@ const validator = { ABSENT_SOURCE_TYPE_REPLACEMENT, isAdgRedirectRule, isValidAdgRedirectRule, + isRedirectResourceCompatibleWithAdg, isAdgRedirectCompatibleWithUbo, isUboRedirectCompatibleWithAdg, isAbpRedirectCompatibleWithAdg, diff --git a/src/redirects/index.js b/src/redirects/index.js index 09b23eb07..5e055e66e 100644 --- a/src/redirects/index.js +++ b/src/redirects/index.js @@ -72,6 +72,7 @@ export const redirects = { getCode: getRedirectCode, isAdgRedirectRule: validator.isAdgRedirectRule, isValidAdgRedirectRule: validator.isValidAdgRedirectRule, + isRedirectResourceCompatibleWithAdg: validator.isRedirectResourceCompatibleWithAdg, isAdgRedirectCompatibleWithUbo: validator.isAdgRedirectCompatibleWithUbo, isUboRedirectCompatibleWithAdg: validator.isUboRedirectCompatibleWithAdg, isAbpRedirectCompatibleWithAdg: validator.isAbpRedirectCompatibleWithAdg, diff --git a/tests/api/index.spec.js b/tests/api/index.spec.js index 52a4cddc4..203fc4485 100644 --- a/tests/api/index.spec.js +++ b/tests/api/index.spec.js @@ -410,6 +410,24 @@ describe('Test redirects api methods', () => { }); }); + describe('isRedirectResourceCompatibleWithAdg()', () => { + const validRedirectNames = [ + 'noopvast-4.0', // adg only + 'empty', // adg/ubo + ]; + test.each(validRedirectNames)('%s', (name) => { + expect(validator.isRedirectResourceCompatibleWithAdg(name)).toBeTruthy(); + }); + + const invalidRedirectNames = [ + 'outbrain-widget.js', // ubo only + 'blank-css', // name abp-only + ]; + test.each(invalidRedirectNames)('%s', (name) => { + expect(validator.isRedirectResourceCompatibleWithAdg(name)).toBeFalsy(); + }); + }); + describe('isValidAdgRedirectRule()', () => { const validRules = [ '||example.org$xmlhttprequest,redirect=noopvast-2.0', diff --git a/types/scriptlets.d.ts b/types/scriptlets.d.ts index 4d30f3075..152add3f5 100644 --- a/types/scriptlets.d.ts +++ b/types/scriptlets.d.ts @@ -168,6 +168,14 @@ declare module '@adguard/scriptlets' { */ isAdgRedirectRule(rule: string): boolean; + /** + * Checks if the specified redirect resource is compatible with AdGuard + * + * @param redirectName - Redirect resource name to check + * @returns - true if the redirect resource is compatible with AdGuard + */ + isRedirectResourceCompatibleWithAdg(redirectName: string): boolean; + /** * Checks if the `rule` is **valid** AdGuard redirect resource rule * diff --git a/wiki/compatibility-table.md b/wiki/compatibility-table.md index 53be19dd6..35dcee2aa 100644 --- a/wiki/compatibility-table.md +++ b/wiki/compatibility-table.md @@ -120,6 +120,7 @@ | | trusted-replace-node-text.js (trusted-rpnt.js, replace-node-text.js, rpnt.js) | | | | remove-cache-storage-item.js | | | | trusted-replace-argument.js | | +| | trusted-replace-outbound-text.js | | ## Redirects compatibility table