diff options
| author | Adam Mathes <adam@adammathes.com> | 2026-02-13 21:34:48 -0800 |
|---|---|---|
| committer | Adam Mathes <adam@adammathes.com> | 2026-02-13 21:34:48 -0800 |
| commit | 76cb9c2a39d477a64824a985ade40507e3bbade1 (patch) | |
| tree | 41e997aa9c6f538d3a136af61dae9424db2005a9 /vanilla/node_modules/tldts-core/src/factory.ts | |
| parent | 819a39a21ac992b1393244a4c283bbb125208c69 (diff) | |
| download | neko-76cb9c2a39d477a64824a985ade40507e3bbade1.tar.gz neko-76cb9c2a39d477a64824a985ade40507e3bbade1.tar.bz2 neko-76cb9c2a39d477a64824a985ade40507e3bbade1.zip | |
feat(vanilla): add testing infrastructure and tests (NK-wjnczv)
Diffstat (limited to 'vanilla/node_modules/tldts-core/src/factory.ts')
| -rw-r--r-- | vanilla/node_modules/tldts-core/src/factory.ts | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/vanilla/node_modules/tldts-core/src/factory.ts b/vanilla/node_modules/tldts-core/src/factory.ts new file mode 100644 index 0000000..fe0880e --- /dev/null +++ b/vanilla/node_modules/tldts-core/src/factory.ts @@ -0,0 +1,163 @@ +/** + * Implement a factory allowing to plug different implementations of suffix + * lookup (e.g.: using a trie or the packed hashes datastructures). This is used + * and exposed in `tldts.ts` and `tldts-experimental.ts` bundle entrypoints. + */ + +import getDomain from './domain'; +import getDomainWithoutSuffix from './domain-without-suffix'; +import extractHostname from './extract-hostname'; +import isIp from './is-ip'; +import isValidHostname from './is-valid'; +import { IPublicSuffix, ISuffixLookupOptions } from './lookup/interface'; +import { IOptions, setDefaults } from './options'; +import getSubdomain from './subdomain'; + +export interface IResult { + // `hostname` is either a registered name (including but not limited to a + // hostname), or an IP address. IPv4 addresses must be in dot-decimal + // notation, and IPv6 addresses must be enclosed in brackets ([]). This is + // directly extracted from the input URL. + hostname: string | null; + + // Is `hostname` an IP? (IPv4 or IPv6) + isIp: boolean | null; + + // `hostname` split between subdomain, domain and its public suffix (if any) + subdomain: string | null; + domain: string | null; + publicSuffix: string | null; + domainWithoutSuffix: string | null; + + // Specifies if `publicSuffix` comes from the ICANN or PRIVATE section of the list + isIcann: boolean | null; + isPrivate: boolean | null; +} + +export function getEmptyResult(): IResult { + return { + domain: null, + domainWithoutSuffix: null, + hostname: null, + isIcann: null, + isIp: null, + isPrivate: null, + publicSuffix: null, + subdomain: null, + }; +} + +export function resetResult(result: IResult): void { + result.domain = null; + result.domainWithoutSuffix = null; + result.hostname = null; + result.isIcann = null; + result.isIp = null; + result.isPrivate = null; + result.publicSuffix = null; + result.subdomain = null; +} + +// Flags representing steps in the `parse` function. They are used to implement +// an early stop mechanism (simulating some form of laziness) to avoid doing +// more work than necessary to perform a given action (e.g.: we don't need to +// extract the domain and subdomain if we are only interested in public suffix). +export const enum FLAG { + HOSTNAME, + IS_VALID, + PUBLIC_SUFFIX, + DOMAIN, + SUB_DOMAIN, + ALL, +} + +export function parseImpl( + url: string, + step: FLAG, + suffixLookup: ( + _1: string, + _2: ISuffixLookupOptions, + _3: IPublicSuffix, + ) => void, + partialOptions: Partial<IOptions>, + result: IResult, +): IResult { + const options: IOptions = /*@__INLINE__*/ setDefaults(partialOptions); + + // Very fast approximate check to make sure `url` is a string. This is needed + // because the library will not necessarily be used in a typed setup and + // values of arbitrary types might be given as argument. + if (typeof url !== 'string') { + return result; + } + + // Extract hostname from `url` only if needed. This can be made optional + // using `options.extractHostname`. This option will typically be used + // whenever we are sure the inputs to `parse` are already hostnames and not + // arbitrary URLs. + // + // `mixedInput` allows to specify if we expect a mix of URLs and hostnames + // as input. If only hostnames are expected then `extractHostname` can be + // set to `false` to speed-up parsing. If only URLs are expected then + // `mixedInputs` can be set to `false`. The `mixedInputs` is only a hint + // and will not change the behavior of the library. + if (!options.extractHostname) { + result.hostname = url; + } else if (options.mixedInputs) { + result.hostname = extractHostname(url, isValidHostname(url)); + } else { + result.hostname = extractHostname(url, false); + } + + // Check if `hostname` is a valid ip address + if (options.detectIp && result.hostname !== null) { + result.isIp = isIp(result.hostname); + if (result.isIp) { + return result; + } + } + + // Perform hostname validation if enabled. If hostname is not valid, no need to + // go further as there will be no valid domain or sub-domain. This validation + // is applied before any early returns to ensure consistent behavior across + // all API methods including getHostname(). + if ( + options.validateHostname && + options.extractHostname && + result.hostname !== null && + !isValidHostname(result.hostname) + ) { + result.hostname = null; + return result; + } + + if (step === FLAG.HOSTNAME || result.hostname === null) { + return result; + } + + // Extract public suffix + suffixLookup(result.hostname, options, result); + if (step === FLAG.PUBLIC_SUFFIX || result.publicSuffix === null) { + return result; + } + + // Extract domain + result.domain = getDomain(result.publicSuffix, result.hostname, options); + if (step === FLAG.DOMAIN || result.domain === null) { + return result; + } + + // Extract subdomain + result.subdomain = getSubdomain(result.hostname, result.domain); + if (step === FLAG.SUB_DOMAIN) { + return result; + } + + // Extract domain without suffix + result.domainWithoutSuffix = getDomainWithoutSuffix( + result.domain, + result.publicSuffix, + ); + + return result; +} |
