From b171b5ec75467e925931ff92de4435ba966ff231 Mon Sep 17 00:00:00 2001 From: Jake Jarvis Date: Fri, 17 Oct 2025 22:04:37 -0400 Subject: [PATCH] Update `getDomainParts` to allow passing options to `tldts.parse()`. --- package-lock.json | 131 ++++++++++++++++++++++++---------------------- package.json | 6 +-- src/index.ts | 7 ++- src/lib/domain.ts | 35 ++++++++++--- 4 files changed, 105 insertions(+), 74 deletions(-) diff --git a/package-lock.json b/package-lock.json index 16d5391..90c0706 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,10 +11,13 @@ "dependencies": { "tldts": "7.0.17" }, + "bin": { + "rdapper": "bin/cli.js" + }, "devDependencies": { - "@biomejs/biome": "2.2.5", - "@types/node": "24.7.2", - "tsdown": "0.15.6", + "@biomejs/biome": "2.2.6", + "@types/node": "24.8.1", + "tsdown": "0.15.7", "typescript": "5.9.3", "vitest": "^3.2.4" }, @@ -90,9 +93,9 @@ } }, "node_modules/@biomejs/biome": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.2.5.tgz", - "integrity": "sha512-zcIi+163Rc3HtyHbEO7CjeHq8DjQRs40HsGbW6vx2WI0tg8mYQOPouhvHSyEnCBAorfYNnKdR64/IxO7xQ5faw==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.2.6.tgz", + "integrity": "sha512-yKTCNGhek0rL5OEW1jbLeZX8LHaM8yk7+3JRGv08my+gkpmtb5dDE+54r2ZjZx0ediFEn1pYBOJSmOdDP9xtFw==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -106,20 +109,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.2.5", - "@biomejs/cli-darwin-x64": "2.2.5", - "@biomejs/cli-linux-arm64": "2.2.5", - "@biomejs/cli-linux-arm64-musl": "2.2.5", - "@biomejs/cli-linux-x64": "2.2.5", - "@biomejs/cli-linux-x64-musl": "2.2.5", - "@biomejs/cli-win32-arm64": "2.2.5", - "@biomejs/cli-win32-x64": "2.2.5" + "@biomejs/cli-darwin-arm64": "2.2.6", + "@biomejs/cli-darwin-x64": "2.2.6", + "@biomejs/cli-linux-arm64": "2.2.6", + "@biomejs/cli-linux-arm64-musl": "2.2.6", + "@biomejs/cli-linux-x64": "2.2.6", + "@biomejs/cli-linux-x64-musl": "2.2.6", + "@biomejs/cli-win32-arm64": "2.2.6", + "@biomejs/cli-win32-x64": "2.2.6" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.5.tgz", - "integrity": "sha512-MYT+nZ38wEIWVcL5xLyOhYQQ7nlWD0b/4mgATW2c8dvq7R4OQjt/XGXFkXrmtWmQofaIM14L7V8qIz/M+bx5QQ==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.6.tgz", + "integrity": "sha512-UZPmn3M45CjTYulgcrFJFZv7YmK3pTxTJDrFYlNElT2FNnkkX4fsxjExTSMeWKQYoZjvekpH5cvrYZZlWu3yfA==", "cpu": [ "arm64" ], @@ -134,9 +137,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.5.tgz", - "integrity": "sha512-FLIEl73fv0R7dI10EnEiZLw+IMz3mWLnF95ASDI0kbx6DDLJjWxE5JxxBfmG+udz1hIDd3fr5wsuP7nwuTRdAg==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.6.tgz", + "integrity": "sha512-HOUIquhHVgh/jvxyClpwlpl/oeMqntlteL89YqjuFDiZ091P0vhHccwz+8muu3nTyHWM5FQslt+4Jdcd67+xWQ==", "cpu": [ "x64" ], @@ -151,9 +154,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.5.tgz", - "integrity": "sha512-5DjiiDfHqGgR2MS9D+AZ8kOfrzTGqLKywn8hoXpXXlJXIECGQ32t+gt/uiS2XyGBM2XQhR6ztUvbjZWeccFMoQ==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.6.tgz", + "integrity": "sha512-BpGtuMJGN+o8pQjvYsUKZ+4JEErxdSmcRD/JG3mXoWc6zrcA7OkuyGFN1mDggO0Q1n7qXxo/PcupHk8gzijt5g==", "cpu": [ "arm64" ], @@ -168,9 +171,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.5.tgz", - "integrity": "sha512-5Ov2wgAFwqDvQiESnu7b9ufD1faRa+40uwrohgBopeY84El2TnBDoMNXx6iuQdreoFGjwW8vH6k68G21EpNERw==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.6.tgz", + "integrity": "sha512-TjCenQq3N6g1C+5UT3jE1bIiJb5MWQvulpUngTIpFsL4StVAUXucWD0SL9MCW89Tm6awWfeXBbZBAhJwjyFbRQ==", "cpu": [ "arm64" ], @@ -185,9 +188,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.5.tgz", - "integrity": "sha512-fq9meKm1AEXeAWan3uCg6XSP5ObA6F/Ovm89TwaMiy1DNIwdgxPkNwxlXJX8iM6oRbFysYeGnT0OG8diCWb9ew==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.6.tgz", + "integrity": "sha512-1HaM/dpI/1Z68zp8ZdT6EiBq+/O/z97a2AiHMl+VAdv5/ELckFt9EvRb8hDHpk8hUMoz03gXkC7VPXOVtU7faA==", "cpu": [ "x64" ], @@ -202,9 +205,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.5.tgz", - "integrity": "sha512-AVqLCDb/6K7aPNIcxHaTQj01sl1m989CJIQFQEaiQkGr2EQwyOpaATJ473h+nXDUuAcREhccfRpe/tu+0wu0eQ==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.6.tgz", + "integrity": "sha512-1ZcBux8zVM3JhWN2ZCPaYf0+ogxXG316uaoXJdgoPZcdK/rmRcRY7PqHdAos2ExzvjIdvhQp72UcveI98hgOog==", "cpu": [ "x64" ], @@ -219,9 +222,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.5.tgz", - "integrity": "sha512-xaOIad4wBambwJa6mdp1FigYSIF9i7PCqRbvBqtIi9y29QtPVQ13sDGtUnsRoe6SjL10auMzQ6YAe+B3RpZXVg==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.6.tgz", + "integrity": "sha512-h3A88G8PGM1ryTeZyLlSdfC/gz3e95EJw9BZmA6Po412DRqwqPBa2Y9U+4ZSGUAXCsnSQE00jLV8Pyrh0d+jQw==", "cpu": [ "arm64" ], @@ -236,9 +239,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.5.tgz", - "integrity": "sha512-F/jhuXCssPFAuciMhHKk00xnCAxJRS/pUzVfXYmOMUp//XW7mO6QeCjsjvnm8L4AO/dG2VOB0O+fJPiJ2uXtIw==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.6.tgz", + "integrity": "sha512-yx0CqeOhPjYQ5ZXgPfu8QYkgBhVJyvWe36as7jRuPrKPO5ylVDfwVtPQ+K/mooNTADW0IhxOZm3aPu16dP8yNQ==", "cpu": [ "x64" ], @@ -1392,9 +1395,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.7.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.2.tgz", - "integrity": "sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA==", + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.8.1.tgz", + "integrity": "sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1537,17 +1540,17 @@ } }, "node_modules/ast-kit": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.1.2.tgz", - "integrity": "sha512-cl76xfBQM6pztbrFWRnxbrDm9EOqDr1BF6+qQnnDZG2Co2LjyUktkN9GTJfBAfdae+DbT2nJf2nCGAdDDN7W2g==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.1.3.tgz", + "integrity": "sha512-TH+b3Lv6pUjy/Nu0m6A2JULtdzLpmqF9x1Dhj00ZoEiML8qvVA9j1flkzTKNYgdEhWrjDwtWNpyyCUbfQe514g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.0", + "@babel/parser": "^7.28.4", "pathe": "^2.0.3" }, "engines": { - "node": ">=20.18.0" + "node": ">=20.19.0" }, "funding": { "url": "https://github.com/sponsors/sxzz" @@ -1795,9 +1798,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", - "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.12.0.tgz", + "integrity": "sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==", "dev": true, "license": "MIT", "dependencies": { @@ -2029,20 +2032,20 @@ } }, "node_modules/rolldown-plugin-dts": { - "version": "0.16.9", - "resolved": "https://registry.npmjs.org/rolldown-plugin-dts/-/rolldown-plugin-dts-0.16.9.tgz", - "integrity": "sha512-65fAQjQAAXW7j2V5/872r++jjjR2/Pur18/PQO/JgfJl3vKxapXO2KU1l5bUdRoFuuryF+23+Hfu0Cw3bhM97g==", + "version": "0.16.12", + "resolved": "https://registry.npmjs.org/rolldown-plugin-dts/-/rolldown-plugin-dts-0.16.12.tgz", + "integrity": "sha512-9dGjm5oqtKcbZNhpzyBgb8KrYiU616A7IqcFWG7Msp1RKAXQ/hapjivRg+g5IYWSiFhnk3OKYV5T4Ft1t8Cczg==", "dev": true, "license": "MIT", "dependencies": { "@babel/generator": "^7.28.3", "@babel/parser": "^7.28.4", "@babel/types": "^7.28.4", - "ast-kit": "^2.1.2", + "ast-kit": "^2.1.3", "birpc": "^2.6.1", "debug": "^4.4.3", "dts-resolver": "^2.1.2", - "get-tsconfig": "^4.10.1", + "get-tsconfig": "^4.12.0", "magic-string": "^0.30.19" }, "engines": { @@ -2056,7 +2059,7 @@ "@typescript/native-preview": ">=7.0.0-dev.20250601.1", "rolldown": "^1.0.0-beta.9", "typescript": "^5.0.0", - "vue-tsc": "~3.0.3" + "vue-tsc": "~3.1.0" }, "peerDependenciesMeta": { "@ts-macro/tsc": { @@ -2116,9 +2119,9 @@ } }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -2262,13 +2265,13 @@ } }, "node_modules/tsdown": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/tsdown/-/tsdown-0.15.6.tgz", - "integrity": "sha512-W6++O3JeV9gm3JY6P/vLiC7zzTcJbZhQxXb+p3AvRMpDOPBIg82yXULyZCcwjsihY/bFG+Qw37HkezZbP7fzUg==", + "version": "0.15.7", + "resolved": "https://registry.npmjs.org/tsdown/-/tsdown-0.15.7.tgz", + "integrity": "sha512-uFaVgWAogjOMqjY+CQwrUt3C6wzy6ynt82CIoXymnbS17ipUZ8WDXUceJjkislUahF/BZc5+W44Ue3p2oWtqUg==", "dev": true, "license": "MIT", "dependencies": { - "ansis": "^4.1.0", + "ansis": "^4.2.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "debug": "^4.4.3", @@ -2276,8 +2279,8 @@ "empathic": "^2.0.0", "hookable": "^5.5.3", "rolldown": "latest", - "rolldown-plugin-dts": "^0.16.8", - "semver": "^7.7.2", + "rolldown-plugin-dts": "^0.16.11", + "semver": "^7.7.3", "tinyexec": "^1.0.1", "tinyglobby": "^0.2.15", "tree-kill": "^1.2.2", diff --git a/package.json b/package.json index a26c859..ce24388 100644 --- a/package.json +++ b/package.json @@ -47,9 +47,9 @@ "tldts": "7.0.17" }, "devDependencies": { - "@biomejs/biome": "2.2.5", - "@types/node": "24.7.2", - "tsdown": "0.15.6", + "@biomejs/biome": "2.2.6", + "@types/node": "24.8.1", + "tsdown": "0.15.7", "typescript": "5.9.3", "vitest": "^3.2.4" }, diff --git a/src/index.ts b/src/index.ts index 46637e3..2855173 100644 --- a/src/index.ts +++ b/src/index.ts @@ -118,5 +118,10 @@ export async function isRegistered( return res.record.isRegistered === true; } -export { toRegistrableDomain } from "./lib/domain"; +export { + getDomainParts, + getDomainTld, + isLikelyDomain, + toRegistrableDomain, +} from "./lib/domain"; export type * from "./types"; diff --git a/src/lib/domain.ts b/src/lib/domain.ts index 2796705..cc8dbed 100644 --- a/src/lib/domain.ts +++ b/src/lib/domain.ts @@ -1,11 +1,28 @@ import { parse } from "tldts"; +type ParseOptions = Parameters[1]; + /** - * Parse a domain into its parts. + * Parse a domain into its parts. Accepts options which are passed to tldts.parse(). + * @see https://github.com/remusao/tldts/blob/master/packages/tldts-core/src/options.ts */ -export function getDomainParts(domain: string) { - const result = parse(domain); - return result; +export function getDomainParts( + domain: string, + opts?: ParseOptions, +): ReturnType { + return parse(domain, { ...opts }); +} + +/** Get the TLD (ICANN-only public suffix) of a domain. */ +export function getDomainTld( + domain: string, + opts?: ParseOptions, +): string | null { + const result = getDomainParts(domain, { + allowPrivateDomains: false, + ...opts, + }); + return result.publicSuffix ?? null; } /** @@ -32,11 +49,17 @@ export function punyToUnicode(domain: string): string { * Normalize arbitrary input (domain or URL) to its registrable domain (eTLD+1). * Returns null when the input is not a valid ICANN domain (e.g., invalid TLD, IPs). */ -export function toRegistrableDomain(input: string): string | null { +export function toRegistrableDomain( + input: string, + opts?: ParseOptions, +): string | null { const raw = (input ?? "").trim(); if (raw === "") return null; - const result = parse(raw); + const result = getDomainParts(raw, { + allowPrivateDomains: false, + ...opts, + }); // Reject IPs and non-ICANN/public suffixes. if (result.isIp) return null;