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