diff --git a/.eslintrc.js b/.eslintrc.js
index d9d382247..1adb6b36d 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -37,6 +37,7 @@ module.exports = {
'scriptlet',
'trustedScriptlet',
'redirect',
+ 'added',
'jest-environment',
],
}],
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 727372552..9ba659b71 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,9 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+
+
## [Unreleased]
### Changed
diff --git a/scripts/build-docs.js b/scripts/build-docs.js
index 3f33fc341..699f68cc4 100644
--- a/scripts/build-docs.js
+++ b/scripts/build-docs.js
@@ -102,18 +102,21 @@ const getMarkdownData = (dataItems) => {
const output = dataItems.reduce((acc, {
name,
type,
+ versionAdded,
description,
source,
}) => {
- // low case name should be used as anchor
+ // low case name should be used as an anchor in the table of content
acc.list.push(`* [${name}](#${name.toLowerCase()})${EOL}`);
const typeOfSrc = type.toLowerCase().includes('scriptlet') ? 'Scriptlet' : 'Redirect';
- // low case name should be used as anchor
- const body = `### ⚡️ ${name}
+ // 1. Low case name should be used as an anchor
+ // 2. There is no EOL after 'version' string because `description` starts with `\n`
+ const body = `### ⚡️ ${name}${EOL}
+${versionAdded ? `> Added in ${versionAdded}` : '> Adding version is unknown.'}
${description}${EOL}
-[${typeOfSrc} source](${source})
+[${typeOfSrc} source](${source})${EOL}
* * *${EOL}${EOL}`;
acc.body.push(body);
@@ -135,18 +138,25 @@ const getMarkdownDataForStaticRedirects = () => {
const staticRedirects = fs.readFileSync(path.resolve(__dirname, staticRedirectsPath), { encoding: 'utf8' });
const parsedStaticRedirects = yaml.safeLoad(staticRedirects);
- const output = parsedStaticRedirects.reduce((acc, { title, description }) => {
- if (description) {
- acc.list.push(`* [${title}](#${title})${EOL}`);
+ const output = parsedStaticRedirects.reduce((acc, { title, description, added }) => {
+ if (!title) {
+ throw new Error('No title for static redirect');
+ }
+ if (!description) {
+ throw new Error(`No description for static redirect '${title}'`);
+ }
+ if (!added) {
+ throw new Error(`No added version for static redirect '${title}'`);
+ }
+
+ acc.list.push(`* [${title}](#${title})${EOL}`);
- const body = `### ⚡️ ${title}
-${description}
-[Redirect source](${STATIC_REDIRECTS_RELATIVE_SOURCE})
+ const body = `### ⚡️ ${title}${EOL}
+${added ? `> Added in ${added}.` : '> Adding version is unknown.'}${EOL}
+${description}${EOL}
+[Redirect source](${STATIC_REDIRECTS_RELATIVE_SOURCE})${EOL}
* * *${EOL}${EOL}`;
- acc.body.push(body);
- } else {
- throw new Error(`No description for ${title}`);
- }
+ acc.body.push(body);
return acc;
}, { list: [], body: [] });
@@ -170,18 +180,25 @@ const getMarkdownDataForBlockingRedirects = () => {
const blockingRedirects = fs.readFileSync(blockingRedirectsPath, { encoding: 'utf8' });
const parsedBlockingRedirects = yaml.safeLoad(blockingRedirects);
- const output = parsedBlockingRedirects.reduce((acc, { title, description }) => {
- if (description) {
- acc.list.push(`* [${title}](#${title})${EOL}`);
+ const output = parsedBlockingRedirects.reduce((acc, { title, description, added }) => {
+ if (!title) {
+ throw new Error('No title for blocking redirect');
+ }
+ if (!description) {
+ throw new Error(`No description for blocking redirect '${title}'`);
+ }
+ if (!added) {
+ throw new Error(`No added version for blocking redirect '${title}'`);
+ }
+
+ acc.list.push(`* [${title}](#${title})${EOL}`);
- const body = `### ⚡️ ${title}
-${description}
-[Redirect source](${BLOCKING_REDIRECTS_RELATIVE_SOURCE}/${title})
+ const body = `### ⚡️ ${title}${EOL}
+${added ? `> Added in ${added}.` : '> Adding version is unknown.'}${EOL}
+${description}${EOL}
+[Redirect source](${BLOCKING_REDIRECTS_RELATIVE_SOURCE}/${title})${EOL}
* * *${EOL}${EOL}`;
- acc.body.push(body);
- } else {
- throw new Error(`No description for ${title}`);
- }
+ acc.body.push(body);
return acc;
}, { list: [], body: [] });
@@ -206,8 +223,8 @@ const buildWikiAboutPages = () => {
const staticRedirectsMarkdownData = getMarkdownDataForStaticRedirects();
const blockingRedirectsMarkdownData = getMarkdownDataForBlockingRedirects();
- const scriptletsPageContent = `## Available Scriptlets
-${scriptletsMarkdownData.list}* * *
+ const scriptletsPageContent = `## Available Scriptlets${EOL}
+${scriptletsMarkdownData.list}* * *${EOL}
${scriptletsMarkdownData.body}`;
fs.writeFileSync(
path.resolve(__dirname, aboutScriptletsPath),
diff --git a/scripts/helpers.js b/scripts/helpers.js
index 8dcec4ef8..e81fb1055 100644
--- a/scripts/helpers.js
+++ b/scripts/helpers.js
@@ -32,15 +32,15 @@ const getFilesList = (relativeDirPath) => {
/**
* @typedef {Object} CommentTag
- * @property {string} type tag name
- * @property {string} string text following the tag
+ * @property {string} type Tag name, e.g. `@scriptlet`, `@redirect`, `@added`.
+ * @property {string} string Text following the tag name.
*/
/**
* Returns parsed tags data which we use to describe the sources:
* - `@scriptlet`/`trustedScriptlet`/`@redirect` to describe the type and name of source;
* - `@description` actual description for scriptlet or redirect.
- * required comments from file.
+ * - `@added` means version when scriptlet or redirect was implemented.
* In one file might be comments describing scriptlet and redirect as well.
*
* @param {string} filePath absolute path to file
@@ -95,11 +95,17 @@ Please add one OR edit the list of NON_SCRIPTLETS_FILES / NON_REDIRECTS_FILES.`)
* @returns {DescribingCommentData}
*/
const prepareCommentsData = (commentTags, source) => {
- const [base, sup] = commentTags;
+ const [typeTag, descriptionTag, addedTag] = commentTags;
+ const name = typeTag.string;
+ const versionAdded = addedTag?.string;
+ if (!versionAdded) {
+ throw new Error(`No @added tag for ${name}`);
+ }
return {
- type: base.type,
- name: base.string,
- description: sup.string,
+ type: typeTag.type,
+ name,
+ description: descriptionTag.string,
+ versionAdded,
source,
};
};
diff --git a/src/redirects/amazon-apstag.js b/src/redirects/amazon-apstag.js
index 959dca690..9869fce66 100644
--- a/src/redirects/amazon-apstag.js
+++ b/src/redirects/amazon-apstag.js
@@ -2,6 +2,7 @@ import { hit, noopFunc } from '../helpers/index';
/**
* @redirect amazon-apstag
+ *
* @description
* Mocks Amazon's apstag.js
*
@@ -12,6 +13,8 @@ import { hit, noopFunc } from '../helpers/index';
* ```
* ||amazon-adsystem.com/aax2/apstag.js$script,redirect=amazon-apstag
* ```
+ *
+ * @added v1.2.3.
*/
export function AmazonApstag(source) {
const apstagWrapper = {
diff --git a/src/redirects/ati-smarttag.js b/src/redirects/ati-smarttag.js
index 4a00ab27f..99383725f 100644
--- a/src/redirects/ati-smarttag.js
+++ b/src/redirects/ati-smarttag.js
@@ -2,6 +2,7 @@ import { hit, noopFunc } from '../helpers/index';
/**
* @redirect ati-smarttag
+ *
* @description
* Mocks AT Internat SmartTag.
* https://developers.atinternet-solutions.com/as2-tagging-en/javascript-en/getting-started-javascript-en/tracker-initialisation-javascript-en/
@@ -10,6 +11,8 @@ import { hit, noopFunc } from '../helpers/index';
* ```
* ||bloctel.gouv.fr/assets/scripts/smarttag.js$script,redirect=ati-smarttag
* ```
+ *
+ * @added v1.5.0.
*/
export function ATInternetSmartTag(source) {
const setNoopFuncWrapper = {
diff --git a/src/redirects/blocking-redirects.yml b/src/redirects/blocking-redirects.yml
index 8925ad6b4..9dfc4f628 100644
--- a/src/redirects/blocking-redirects.yml
+++ b/src/redirects/blocking-redirects.yml
@@ -4,6 +4,7 @@
# use ">" if property contains long string
- title: click2load.html
+ added: v1.5.0
description: |-
Redirects resource and replaces supposed content by decoy frame with button for original content recovering
@@ -11,6 +12,7 @@
https://github.com/gorhill/uBlock/blob/1.31.0/src/web_accessible_resources/click2load.html
**Example**
+
```
||youtube.com/embed/$frame,third-party,redirect=click2load.html
```
diff --git a/src/redirects/didomi-loader.js b/src/redirects/didomi-loader.js
index 06b28f13f..2ba9a60fe 100644
--- a/src/redirects/didomi-loader.js
+++ b/src/redirects/didomi-loader.js
@@ -9,6 +9,7 @@ import {
/**
* @redirect didomi-loader
+ *
* @description
* Mocks Didomi's CMP loader script.
* https://developers.didomi.io/
@@ -17,6 +18,8 @@ import {
* ```
* ||sdk.privacy-center.org/fbf86806f86e/loader.js$script,redirect=didomi-loader
* ```
+ *
+ * @added v1.6.2.
*/
export function DidomiLoader(source) {
function UserConsentStatusForVendorSubscribe() { }
diff --git a/src/redirects/fingerprintjs2.js b/src/redirects/fingerprintjs2.js
index a3f04a8d8..258dd7b28 100644
--- a/src/redirects/fingerprintjs2.js
+++ b/src/redirects/fingerprintjs2.js
@@ -3,6 +3,7 @@ import { hit } from '../helpers/index';
/**
* @redirect fingerprintjs2
+ *
* @description
* Mocks FingerprintJS v2
* https://github.com/fingerprintjs
@@ -14,6 +15,8 @@ import { hit } from '../helpers/index';
* ```
* ||the-japan-news.com/modules/js/lib/fgp/fingerprint2.js$script,redirect=fingerprintjs2
* ```
+ *
+ * @added v1.5.0.
*/
export function Fingerprintjs2(source) {
let browserId = '';
diff --git a/src/redirects/fingerprintjs3.js b/src/redirects/fingerprintjs3.js
index 2c073b336..22a25fbd6 100644
--- a/src/redirects/fingerprintjs3.js
+++ b/src/redirects/fingerprintjs3.js
@@ -6,6 +6,7 @@ import {
/**
* @redirect fingerprintjs3
+ *
* @description
* Mocks FingerprintJS v3
* https://github.com/fingerprintjs
@@ -17,6 +18,8 @@ import {
* ```
* ||sephora.com/js/ufe/isomorphic/thirdparty/fp.min.js$script,redirect=fingerprintjs3
* ```
+ *
+ * @added v1.6.2.
*/
export function Fingerprintjs3(source) {
const visitorId = (() => {
diff --git a/src/redirects/gemius.js b/src/redirects/gemius.js
index cfaf62849..7c6ce9b24 100644
--- a/src/redirects/gemius.js
+++ b/src/redirects/gemius.js
@@ -3,6 +3,7 @@ import { hit, noopFunc } from '../helpers/index';
/**
* @redirect gemius
+ *
* @description
* Mocks Gemius Analytics.
* https://flowplayer.com/developers/plugins/gemius
@@ -11,6 +12,8 @@ import { hit, noopFunc } from '../helpers/index';
* ```
* ||gapt.hit.gemius.pl/gplayer.js$script,redirect=gemius
* ```
+ *
+ * @added v1.5.0.
*/
export function Gemius(source) {
const GemiusPlayer = function () {};
diff --git a/src/redirects/google-analytics-ga.js b/src/redirects/google-analytics-ga.js
index 9e86a66b9..0ea8fb61a 100644
--- a/src/redirects/google-analytics-ga.js
+++ b/src/redirects/google-analytics-ga.js
@@ -7,6 +7,7 @@ import {
/**
* @redirect google-analytics-ga
+ *
* @description
* Mocks old Google Analytics API.
*
@@ -17,6 +18,8 @@ import {
* ```
* ||google-analytics.com/ga.js$script,redirect=google-analytics-ga
* ```
+ *
+ * @added v1.0.10.
*/
export function GoogleAnalyticsGa(source) {
// Gaq constructor
diff --git a/src/redirects/google-analytics.js b/src/redirects/google-analytics.js
index e42214d96..d1590d6ca 100644
--- a/src/redirects/google-analytics.js
+++ b/src/redirects/google-analytics.js
@@ -7,6 +7,7 @@ import {
/**
* @redirect google-analytics
+ *
* @description
* Mocks Google's Analytics and Tag Manager APIs.
* [Covers obsolete googletagmanager-gtm redirect functionality](https://github.com/AdguardTeam/Scriptlets/issues/127).
@@ -19,6 +20,8 @@ import {
* ||google-analytics.com/analytics.js$script,redirect=google-analytics
* ||googletagmanager.com/gtm.js$script,redirect=googletagmanager-gtm
* ```
+ *
+ * @added v1.0.10.
*/
export function GoogleAnalytics(source) {
// eslint-disable-next-line func-names
diff --git a/src/redirects/google-ima3.js b/src/redirects/google-ima3.js
index 807bbb799..fd8a2bdf2 100644
--- a/src/redirects/google-ima3.js
+++ b/src/redirects/google-ima3.js
@@ -7,6 +7,7 @@ import {
/**
* @redirect google-ima3
+ *
* @description
* Mocks the IMA SDK of Google.
*
@@ -14,6 +15,8 @@ import {
* ```
* ||imasdk.googleapis.com/js/sdkloader/ima3.js$script,redirect=google-ima3
* ```
+ *
+ * @added v1.6.2.
*/
export function GoogleIma3(source) {
diff --git a/src/redirects/googlesyndication-adsbygoogle.js b/src/redirects/googlesyndication-adsbygoogle.js
index 80832f5a4..241b26674 100644
--- a/src/redirects/googlesyndication-adsbygoogle.js
+++ b/src/redirects/googlesyndication-adsbygoogle.js
@@ -3,6 +3,7 @@ import { hit } from '../helpers/index';
/* eslint-disable max-len */
/**
* @redirect googlesyndication-adsbygoogle
+ *
* @description
* Mocks Google AdSense API.
*
@@ -13,6 +14,8 @@ import { hit } from '../helpers/index';
* ```
* ||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$script,redirect=googlesyndication-adsbygoogle
* ```
+ *
+ * @added v1.0.10.
*/
/* eslint-enable max-len */
export function GoogleSyndicationAdsByGoogle(source) {
diff --git a/src/redirects/googletagservices-gpt.js b/src/redirects/googletagservices-gpt.js
index f2ece88d1..8b0cf68cf 100644
--- a/src/redirects/googletagservices-gpt.js
+++ b/src/redirects/googletagservices-gpt.js
@@ -11,6 +11,7 @@ import {
/**
* @redirect googletagservices-gpt
+ *
* @description
* Mocks Google Publisher Tag API.
*
@@ -21,6 +22,8 @@ import {
* ```
* ||googletagservices.com/tag/js/gpt.js$script,redirect=googletagservices-gpt
* ```
+ *
+ * @added v1.0.10.
*/
export function GoogleTagServicesGpt(source) {
const slots = new Map();
diff --git a/src/redirects/matomo.js b/src/redirects/matomo.js
index 649c87ccc..8a51ea93a 100644
--- a/src/redirects/matomo.js
+++ b/src/redirects/matomo.js
@@ -3,6 +3,7 @@ import { hit, noopFunc } from '../helpers/index';
/**
* @redirect matomo
+ *
* @description
* Mocks the piwik.js file of Matomo (formerly Piwik).
*
@@ -10,6 +11,8 @@ import { hit, noopFunc } from '../helpers/index';
* ```
* ||example.org/piwik.js$script,redirect=matomo
* ```
+ *
+ * @added v1.5.0.
*/
export function Matomo(source) {
diff --git a/src/redirects/metrika-yandex-tag.js b/src/redirects/metrika-yandex-tag.js
index a432926b4..3ddeab3c1 100644
--- a/src/redirects/metrika-yandex-tag.js
+++ b/src/redirects/metrika-yandex-tag.js
@@ -2,6 +2,7 @@ import { hit, noopFunc } from '../helpers/index';
/**
* @redirect metrika-yandex-tag
+ *
* @description
* Mocks Yandex Metrika API.
* https://yandex.ru/support/metrica/objects/method-reference.html
@@ -10,6 +11,8 @@ import { hit, noopFunc } from '../helpers/index';
* ```
* ||mc.yandex.ru/metrika/tag.js$script,redirect=metrika-yandex-tag
* ```
+ *
+ * @added v1.0.10.
*/
export function metrikaYandexTag(source) {
const asyncCallbackFromOptions = (id, param, options = {}) => {
diff --git a/src/redirects/metrika-yandex-watch.js b/src/redirects/metrika-yandex-watch.js
index f2646de7a..10caacc6f 100644
--- a/src/redirects/metrika-yandex-watch.js
+++ b/src/redirects/metrika-yandex-watch.js
@@ -2,6 +2,7 @@ import { hit, noopFunc, noopArray } from '../helpers/index';
/**
* @redirect metrika-yandex-watch
+ *
* @description
* Mocks the old Yandex Metrika API.
* https://yandex.ru/support/metrica/objects/_method-reference.html
@@ -10,6 +11,8 @@ import { hit, noopFunc, noopArray } from '../helpers/index';
* ```
* ||mc.yandex.ru/metrika/watch.js$script,redirect=metrika-yandex-watch
* ```
+ *
+ * @added v1.0.10.
*/
export function metrikaYandexWatch(source) {
const cbName = 'yandex_metrika_callbacks';
diff --git a/src/redirects/naver-wcslog.js b/src/redirects/naver-wcslog.js
index e84f0f118..df75e0b6a 100644
--- a/src/redirects/naver-wcslog.js
+++ b/src/redirects/naver-wcslog.js
@@ -3,6 +3,7 @@ import { hit, noopFunc } from '../helpers/index';
/**
* @redirect naver-wcslog
+ *
* @description
* Mocks wcslog.js of Naver Analytics.
*
@@ -10,6 +11,8 @@ import { hit, noopFunc } from '../helpers/index';
* ```
* ||wcs.naver.net/wcslog.js$script,redirect=naver-wcslog
* ```
+ *
+ * @added v1.6.2.
*/
export function NaverWcslog(source) {
diff --git a/src/redirects/noeval.js b/src/redirects/noeval.js
index 698f46427..b449582e8 100644
--- a/src/redirects/noeval.js
+++ b/src/redirects/noeval.js
@@ -2,6 +2,7 @@ import { noeval } from '../scriptlets/noeval';
/**
* @redirect noeval
+ *
* @description
* Redirects request to the source which sets static properties to PopAds and popns objects.
*
@@ -18,5 +19,7 @@ import { noeval } from '../scriptlets/noeval';
* ```
* ||example.org/index.js$script,redirect=noeval
* ```
+ *
+ * @added v1.0.4.
*/
export { noeval };
diff --git a/src/redirects/pardot-1.0.js b/src/redirects/pardot-1.0.js
index e23f19040..426429e72 100644
--- a/src/redirects/pardot-1.0.js
+++ b/src/redirects/pardot-1.0.js
@@ -8,6 +8,7 @@ import {
/**
* @redirect pardot-1.0
+ *
* @description
* Mocks the pd.js file of Salesforce.
* https://pi.pardot.com/pd.js
@@ -18,6 +19,8 @@ import {
* ||pi.pardot.com/pd.js$script,redirect=pardot
* ||pacedg.com.au/pd.js$redirect=pardot
* ```
+ *
+ * @added v1.6.55.
*/
export function Pardot(source) {
diff --git a/src/redirects/prebid-ads.js b/src/redirects/prebid-ads.js
index ff4fccc76..19483cc25 100644
--- a/src/redirects/prebid-ads.js
+++ b/src/redirects/prebid-ads.js
@@ -3,6 +3,7 @@ import { hit } from '../helpers/index';
/**
* @redirect prebid-ads
+ *
* @description
* Sets predefined constants on a page:
* - `canRunAds`: `true`
@@ -12,6 +13,8 @@ import { hit } from '../helpers/index';
* ```
* ||playerdrive.me/assets/js/prebid-ads.js$script,redirect=prebid-ads
* ```
+ *
+ * @added v1.6.2.
*/
export function prebidAds(source) {
window.canRunAds = true;
diff --git a/src/redirects/prebid.js b/src/redirects/prebid.js
index 77356c57a..911aa806c 100644
--- a/src/redirects/prebid.js
+++ b/src/redirects/prebid.js
@@ -8,6 +8,7 @@ import {
/**
* @redirect prebid
+ *
* @description
* Mocks the prebid.js header bidding suit.
* https://docs.prebid.org/
@@ -16,6 +17,8 @@ import {
* ```
* ||tmgrup.com.tr/bd/hb/prebid.js$script,redirect=prebid
* ```
+ *
+ * @added v1.6.2.
*/
export function Prebid(source) {
diff --git a/src/redirects/prevent-bab.js b/src/redirects/prevent-bab.js
index bbf4feeff..3a76f087e 100644
--- a/src/redirects/prevent-bab.js
+++ b/src/redirects/prevent-bab.js
@@ -2,6 +2,7 @@ import { preventBab as preventBabScriptlet } from '../scriptlets/prevent-bab';
/**
* @redirect prevent-bab
+ *
* @description
* Prevents BlockAdblock script from detecting an ad blocker.
*
@@ -15,6 +16,8 @@ import { preventBab as preventBabScriptlet } from '../scriptlets/prevent-bab';
* ```
* /blockadblock.$script,redirect=prevent-bab
* ```
+ *
+ * @added v1.3.19.
*/
const preventBab = preventBabScriptlet;
preventBab.names = [
diff --git a/src/redirects/prevent-bab2.js b/src/redirects/prevent-bab2.js
index 85ac55237..674d9f159 100644
--- a/src/redirects/prevent-bab2.js
+++ b/src/redirects/prevent-bab2.js
@@ -3,6 +3,7 @@ import { hit } from '../helpers/index';
/**
* @redirect prevent-bab2
+ *
* @description
* Prevents BlockAdblock script from detecting an ad blocker.
*
@@ -15,6 +16,8 @@ import { hit } from '../helpers/index';
* ```
* /blockadblock.$script,redirect=prevent-bab2
* ```
+ *
+ * @added v1.5.0.
*/
export function preventBab2(source) {
const script = document.currentScript;
diff --git a/src/redirects/prevent-fab-3.2.0.js b/src/redirects/prevent-fab-3.2.0.js
index c4973295c..04f86983d 100644
--- a/src/redirects/prevent-fab-3.2.0.js
+++ b/src/redirects/prevent-fab-3.2.0.js
@@ -2,6 +2,7 @@ import { preventFab } from '../scriptlets/prevent-fab-3.2.0';
/**
* @redirect prevent-fab-3.2.0
+ *
* @description
* Redirects fuckadblock script to the source js file.
*
@@ -9,5 +10,7 @@ import { preventFab } from '../scriptlets/prevent-fab-3.2.0';
* ```
* \*\/fuckadblock-$script,redirect=prevent-fab-3.2.0
* ```
+ *
+ * @added v1.0.4.
*/
export { preventFab };
diff --git a/src/redirects/prevent-popads-net.js b/src/redirects/prevent-popads-net.js
index b0d2bb54e..54f0b8bf2 100644
--- a/src/redirects/prevent-popads-net.js
+++ b/src/redirects/prevent-popads-net.js
@@ -2,6 +2,7 @@ import { preventPopadsNet } from '../scriptlets/prevent-popads-net';
/**
* @redirect prevent-popads-net
+ *
* @description
* Redirects request to the source which sets static properties to PopAds and popns objects.
*
@@ -9,5 +10,7 @@ import { preventPopadsNet } from '../scriptlets/prevent-popads-net';
* ```
* ||popads.net/pop.js$script,redirect=prevent-popads-net
* ```
+ *
+ * @added v1.0.4.
*/
export { preventPopadsNet };
diff --git a/src/redirects/scorecardresearch-beacon.js b/src/redirects/scorecardresearch-beacon.js
index 9900706a2..1644a1cd7 100644
--- a/src/redirects/scorecardresearch-beacon.js
+++ b/src/redirects/scorecardresearch-beacon.js
@@ -2,6 +2,7 @@ import { hit } from '../helpers/index';
/**
* @redirect scorecardresearch-beacon
+ *
* @description
* Mocks Scorecard Research API.
*
@@ -12,6 +13,8 @@ import { hit } from '../helpers/index';
* ```
* ||sb.scorecardresearch.com/beacon.js$script,redirect=scorecardresearch-beacon
* ```
+ *
+ * @added v1.0.10.
*/
export function ScoreCardResearchBeacon(source) {
window.COMSCORE = {
diff --git a/src/redirects/set-popads-dummy.js b/src/redirects/set-popads-dummy.js
index 70af5001c..ca7e03496 100644
--- a/src/redirects/set-popads-dummy.js
+++ b/src/redirects/set-popads-dummy.js
@@ -2,6 +2,7 @@ import { setPopadsDummy } from '../scriptlets/set-popads-dummy';
/**
* @redirect set-popads-dummy
+ *
* @description
* Redirects request to the source which sets static properties to PopAds and popns objects.
*
@@ -9,5 +10,7 @@ import { setPopadsDummy } from '../scriptlets/set-popads-dummy';
* ```
* ||popads.net^$script,redirect=set-popads-dummy,domain=example.org
* ```
+ *
+ * @added v1.0.4.
*/
export { setPopadsDummy };
diff --git a/src/redirects/static-redirects.yml b/src/redirects/static-redirects.yml
index 118952a4e..300b04908 100644
--- a/src/redirects/static-redirects.yml
+++ b/src/redirects/static-redirects.yml
@@ -3,8 +3,10 @@
# add ";base64" into contentType if your source already in base64
- title: 1x1-transparent.gif
+ added: v1.0.4
description: |-
**Example**
+
```
||example.org^$image,redirect=1x1-transparent.gif
```
@@ -17,8 +19,10 @@
content: R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
- title: 2x2-transparent.png
+ added: v1.0.4
description: |-
**Example**
+
```
||example.org^$image,redirect=2x2-transparent.png
```
@@ -32,8 +36,10 @@
SUVORK5CYII=
- title: 3x2-transparent.png
+ added: v1.0.4
description: |-
**Example**
+
```
||example.org^$image,redirect=3x2-transparent.png
```
@@ -47,8 +53,10 @@
SUVORK5CYII=
- title: 32x32-transparent.png
+ added: v1.0.4
description: |-
**Example**
+
```
||example.org^$image,redirect=32x32-transparent.png
```
@@ -62,8 +70,10 @@
AO8GECAAAZf3V9cAAAAASUVORK5CYII=
- title: noopframe
+ added: v1.0.4
description: |-
**Example**
+
```
||example.com^$subdocument,redirect=noopframe,domain=example.org
```
@@ -80,8 +90,10 @@