@adguard/agtree
Version:
Tool set for working with adblock filter lists
70 lines (67 loc) • 2.14 kB
JavaScript
/*
* AGTree v3.2.2 (build date: Tue, 08 Jul 2025 13:39:47 GMT)
* (c) 2025 Adguard Software Ltd.
* Released under the MIT license
* https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
*/
import zod from 'zod';
import { SPECIFIC_PLATFORM_MAP, GENERIC_PLATFORM_MAP } from '../utils/platform-helpers.js';
import { isUndefined } from '../../utils/type-guards.js';
/* eslint-disable no-bitwise */
/**
* @file Platform schema.
*/
/**
* Platform separator, e.g. 'adg_os_any|adg_safari_any' means any AdGuard OS platform and
* any AdGuard Safari content blocker platform.
*/
const PLATFORM_SEPARATOR = '|';
/**
* Platform negation character, e.g. 'adg_any|~adg_safari_any' means any AdGuard product except
* Safari content blockers.
*/
const PLATFORM_NEGATION = '~';
/**
* Parses a raw platform string into a platform bitmask.
*
* @param rawPlatforms Raw platform string, e.g. 'adg_safari_any|adg_os_any'.
*
* @returns Platform bitmask.
*/
const parseRawPlatforms = (rawPlatforms) => {
// e.g. 'adg_safari_any|adg_os_any'
const rawPlatformList = rawPlatforms
.split(PLATFORM_SEPARATOR)
.map((rawPlatform) => rawPlatform.trim());
let result = 0;
for (let rawPlatform of rawPlatformList) {
// negation, e.g. 'adg_any|~adg_safari_any' means any AdGuard product except Safari content blockers
let negated = false;
if (rawPlatform.startsWith(PLATFORM_NEGATION)) {
negated = true;
rawPlatform = rawPlatform.slice(1).trim();
}
const platform = SPECIFIC_PLATFORM_MAP.get(rawPlatform) ?? GENERIC_PLATFORM_MAP.get(rawPlatform);
if (isUndefined(platform)) {
throw new Error(`Unknown platform: ${rawPlatform}`);
}
if (negated) {
result &= ~platform;
}
else {
result |= platform;
}
}
if (result === 0) {
throw new Error('No platforms specified');
}
return result;
};
/**
* Platform schema.
*/
zod
.string()
.min(1)
.transform((value) => parseRawPlatforms(value));
export { parseRawPlatforms };