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/is-ip.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/is-ip.ts')
| -rw-r--r-- | vanilla/node_modules/tldts-core/src/is-ip.ts | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/vanilla/node_modules/tldts-core/src/is-ip.ts b/vanilla/node_modules/tldts-core/src/is-ip.ts new file mode 100644 index 0000000..33151c1 --- /dev/null +++ b/vanilla/node_modules/tldts-core/src/is-ip.ts @@ -0,0 +1,87 @@ +/** + * Check if a hostname is an IP. You should be aware that this only works + * because `hostname` is already garanteed to be a valid hostname! + */ +function isProbablyIpv4(hostname: string): boolean { + // Cannot be shorted than 1.1.1.1 + if (hostname.length < 7) { + return false; + } + + // Cannot be longer than: 255.255.255.255 + if (hostname.length > 15) { + return false; + } + + let numberOfDots = 0; + + for (let i = 0; i < hostname.length; i += 1) { + const code = hostname.charCodeAt(i); + + if (code === 46 /* '.' */) { + numberOfDots += 1; + } else if (code < 48 /* '0' */ || code > 57 /* '9' */) { + return false; + } + } + + return ( + numberOfDots === 3 && + hostname.charCodeAt(0) !== 46 /* '.' */ && + hostname.charCodeAt(hostname.length - 1) !== 46 /* '.' */ + ); +} + +/** + * Similar to isProbablyIpv4. + */ +function isProbablyIpv6(hostname: string): boolean { + if (hostname.length < 3) { + return false; + } + + let start = hostname.startsWith('[') ? 1 : 0; + let end = hostname.length; + + if (hostname[end - 1] === ']') { + end -= 1; + } + + // We only consider the maximum size of a normal IPV6. Note that this will + // fail on so-called "IPv4 mapped IPv6 addresses" but this is a corner-case + // and a proper validation library should be used for these. + if (end - start > 39) { + return false; + } + + let hasColon = false; + + for (; start < end; start += 1) { + const code = hostname.charCodeAt(start); + + if (code === 58 /* ':' */) { + hasColon = true; + } else if ( + !( + ( + (code >= 48 && code <= 57) || // 0-9 + (code >= 97 && code <= 102) || // a-f + (code >= 65 && code <= 90) + ) // A-F + ) + ) { + return false; + } + } + + return hasColon; +} + +/** + * Check if `hostname` is *probably* a valid ip addr (either ipv6 or ipv4). + * This *will not* work on any string. We need `hostname` to be a valid + * hostname. + */ +export default function isIp(hostname: string): boolean { + return isProbablyIpv6(hostname) || isProbablyIpv4(hostname); +} |
