UNPKG

@adguard/agtree

Version:
60 lines (57 loc) 2.03 kB
/* * AGTree v3.4.3 (build date: Thu, 11 Dec 2025 13:43:19 GMT) * (c) 2025 Adguard Software Ltd. * Released under the MIT license * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme */ import { parse } from 'tldts'; import { WILDCARD, DOT } from './constants.js'; /** * @file Utility functions for domain and hostname validation. */ /** * Marker for a wildcard top-level domain — `.*`. * * @example * `example.*` — matches with any TLD, e.g. `example.org`, `example.com`, etc. */ const WILDCARD_TLD = DOT + WILDCARD; /** * Marker for a wildcard subdomain — `*.`. * * @example * `*.example.org` — matches with any subdomain, e.g. `foo.example.org` or `bar.example.org` */ const WILDCARD_SUBDOMAIN = WILDCARD + DOT; /** * Utility functions for domain and hostname validation. */ class DomainUtils { /** * Check if the input is a valid domain or hostname. * * @param domain Domain to check * @returns `true` if the domain is valid, `false` otherwise */ static isValidDomainOrHostname(domain) { let domainToCheck = domain; // Wildcard-only domain, typically a generic rule if (domainToCheck === WILDCARD) { return true; } // https://adguard.com/kb/general/ad-filtering/create-own-filters/#wildcard-for-tld if (domainToCheck.endsWith(WILDCARD_TLD)) { // Remove the wildcard TLD domainToCheck = domainToCheck.substring(0, domainToCheck.length - WILDCARD_TLD.length); } if (domainToCheck.startsWith(WILDCARD_SUBDOMAIN)) { // Remove the wildcard subdomain domainToCheck = domainToCheck.substring(WILDCARD_SUBDOMAIN.length); } // Parse the domain with tldts const tldtsResult = parse(domainToCheck); // Check if the domain is valid return domainToCheck === tldtsResult.domain || domainToCheck === tldtsResult.hostname; } } export { DomainUtils, WILDCARD_SUBDOMAIN, WILDCARD_TLD };