rdapper 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -3
- package/dist/index.d.ts +0 -2
- package/dist/index.js +73 -76
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -123,7 +123,6 @@ interface DomainRecord {
|
|
|
123
123
|
rawRdap?: unknown; // raw RDAP JSON (only when options.includeRaw)
|
|
124
124
|
rawWhois?: string; // raw WHOIS text (only when options.includeRaw)
|
|
125
125
|
source: "rdap" | "whois"; // which path produced data
|
|
126
|
-
fetchedAt: string; // ISO 8601 timestamp
|
|
127
126
|
warnings?: string[];
|
|
128
127
|
}
|
|
129
128
|
```
|
|
@@ -139,8 +138,7 @@ interface DomainRecord {
|
|
|
139
138
|
"statuses": [{ "status": "clientTransferProhibited" }],
|
|
140
139
|
"nameservers": [{ "host": "a.iana-servers.net" }, { "host": "b.iana-servers.net" }],
|
|
141
140
|
"dnssec": { "enabled": true },
|
|
142
|
-
"source": "rdap"
|
|
143
|
-
"fetchedAt": "2025-01-01T00:00:00Z"
|
|
141
|
+
"source": "rdap"
|
|
144
142
|
}
|
|
145
143
|
```
|
|
146
144
|
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,74 +1,6 @@
|
|
|
1
1
|
import psl from "psl";
|
|
2
2
|
import { createConnection } from "node:net";
|
|
3
3
|
|
|
4
|
-
//#region src/lib/dates.ts
|
|
5
|
-
function toISO(dateLike) {
|
|
6
|
-
if (dateLike == null) return void 0;
|
|
7
|
-
if (dateLike instanceof Date) return toIsoFromDate(dateLike);
|
|
8
|
-
if (typeof dateLike === "number") return toIsoFromDate(new Date(dateLike));
|
|
9
|
-
const raw = String(dateLike).trim();
|
|
10
|
-
if (!raw) return void 0;
|
|
11
|
-
for (const re of [
|
|
12
|
-
/^(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2}):(\d{2})(?:Z|([+-]\d{2})(?::?(\d{2}))?)?$/,
|
|
13
|
-
/^(\d{4})\/(\d{2})\/(\d{2})[ T](\d{2}):(\d{2}):(\d{2})(?:Z|([+-]\d{2})(?::?(\d{2}))?)?$/,
|
|
14
|
-
/^(\d{2})-([A-Za-z]{3})-(\d{4})$/,
|
|
15
|
-
/^([A-Za-z]{3})\s+(\d{1,2})\s+(\d{4})$/
|
|
16
|
-
]) {
|
|
17
|
-
const m = raw.match(re);
|
|
18
|
-
if (!m) continue;
|
|
19
|
-
const d = parseDateWithRegex(m, re);
|
|
20
|
-
if (d) return toIsoFromDate(d);
|
|
21
|
-
}
|
|
22
|
-
const native = new Date(raw);
|
|
23
|
-
if (!Number.isNaN(native.getTime())) return toIsoFromDate(native);
|
|
24
|
-
}
|
|
25
|
-
function toIsoFromDate(d) {
|
|
26
|
-
try {
|
|
27
|
-
return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), 0)).toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
28
|
-
} catch {
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
function parseDateWithRegex(m, _re) {
|
|
33
|
-
const monthMap = {
|
|
34
|
-
jan: 0,
|
|
35
|
-
feb: 1,
|
|
36
|
-
mar: 2,
|
|
37
|
-
apr: 3,
|
|
38
|
-
may: 4,
|
|
39
|
-
jun: 5,
|
|
40
|
-
jul: 6,
|
|
41
|
-
aug: 7,
|
|
42
|
-
sep: 8,
|
|
43
|
-
oct: 9,
|
|
44
|
-
nov: 10,
|
|
45
|
-
dec: 11
|
|
46
|
-
};
|
|
47
|
-
try {
|
|
48
|
-
if (m[0].includes(":")) {
|
|
49
|
-
const [_$1, y, mo, d, hh, mm, ss, offH, offM] = m;
|
|
50
|
-
let dt = Date.UTC(Number(y), Number(mo) - 1, Number(d), Number(hh), Number(mm), Number(ss));
|
|
51
|
-
if (offH) {
|
|
52
|
-
const sign = offH.startsWith("-") ? -1 : 1;
|
|
53
|
-
const hours = Math.abs(Number(offH));
|
|
54
|
-
const minutes = offM ? Number(offM) : 0;
|
|
55
|
-
const offsetMs = sign * (hours * 60 + minutes) * 60 * 1e3;
|
|
56
|
-
dt -= offsetMs;
|
|
57
|
-
}
|
|
58
|
-
return new Date(dt);
|
|
59
|
-
}
|
|
60
|
-
if (m[0].includes("-")) {
|
|
61
|
-
const [_$1, dd$1, monStr$1, yyyy$1] = m;
|
|
62
|
-
const mon$1 = monthMap[monStr$1.toLowerCase()];
|
|
63
|
-
return new Date(Date.UTC(Number(yyyy$1), mon$1, Number(dd$1)));
|
|
64
|
-
}
|
|
65
|
-
const [_, monStr, dd, yyyy] = m;
|
|
66
|
-
const mon = monthMap[monStr.toLowerCase()];
|
|
67
|
-
return new Date(Date.UTC(Number(yyyy), mon, Number(dd)));
|
|
68
|
-
} catch {}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
//#endregion
|
|
72
4
|
//#region src/lib/domain.ts
|
|
73
5
|
function getDomainParts(domain) {
|
|
74
6
|
const lower = domain.toLowerCase().trim();
|
|
@@ -302,6 +234,74 @@ function sameDomain(a, b) {
|
|
|
302
234
|
return a.toLowerCase() === b.toLowerCase();
|
|
303
235
|
}
|
|
304
236
|
|
|
237
|
+
//#endregion
|
|
238
|
+
//#region src/lib/dates.ts
|
|
239
|
+
function toISO(dateLike) {
|
|
240
|
+
if (dateLike == null) return void 0;
|
|
241
|
+
if (dateLike instanceof Date) return toIsoFromDate(dateLike);
|
|
242
|
+
if (typeof dateLike === "number") return toIsoFromDate(new Date(dateLike));
|
|
243
|
+
const raw = String(dateLike).trim();
|
|
244
|
+
if (!raw) return void 0;
|
|
245
|
+
for (const re of [
|
|
246
|
+
/^(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2}):(\d{2})(?:Z|([+-]\d{2})(?::?(\d{2}))?)?$/,
|
|
247
|
+
/^(\d{4})\/(\d{2})\/(\d{2})[ T](\d{2}):(\d{2}):(\d{2})(?:Z|([+-]\d{2})(?::?(\d{2}))?)?$/,
|
|
248
|
+
/^(\d{2})-([A-Za-z]{3})-(\d{4})$/,
|
|
249
|
+
/^([A-Za-z]{3})\s+(\d{1,2})\s+(\d{4})$/
|
|
250
|
+
]) {
|
|
251
|
+
const m = raw.match(re);
|
|
252
|
+
if (!m) continue;
|
|
253
|
+
const d = parseDateWithRegex(m, re);
|
|
254
|
+
if (d) return toIsoFromDate(d);
|
|
255
|
+
}
|
|
256
|
+
const native = new Date(raw);
|
|
257
|
+
if (!Number.isNaN(native.getTime())) return toIsoFromDate(native);
|
|
258
|
+
}
|
|
259
|
+
function toIsoFromDate(d) {
|
|
260
|
+
try {
|
|
261
|
+
return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), 0)).toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
262
|
+
} catch {
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
function parseDateWithRegex(m, _re) {
|
|
267
|
+
const monthMap = {
|
|
268
|
+
jan: 0,
|
|
269
|
+
feb: 1,
|
|
270
|
+
mar: 2,
|
|
271
|
+
apr: 3,
|
|
272
|
+
may: 4,
|
|
273
|
+
jun: 5,
|
|
274
|
+
jul: 6,
|
|
275
|
+
aug: 7,
|
|
276
|
+
sep: 8,
|
|
277
|
+
oct: 9,
|
|
278
|
+
nov: 10,
|
|
279
|
+
dec: 11
|
|
280
|
+
};
|
|
281
|
+
try {
|
|
282
|
+
if (m[0].includes(":")) {
|
|
283
|
+
const [_$1, y, mo, d, hh, mm, ss, offH, offM] = m;
|
|
284
|
+
let dt = Date.UTC(Number(y), Number(mo) - 1, Number(d), Number(hh), Number(mm), Number(ss));
|
|
285
|
+
if (offH) {
|
|
286
|
+
const sign = offH.startsWith("-") ? -1 : 1;
|
|
287
|
+
const hours = Math.abs(Number(offH));
|
|
288
|
+
const minutes = offM ? Number(offM) : 0;
|
|
289
|
+
const offsetMs = sign * (hours * 60 + minutes) * 60 * 1e3;
|
|
290
|
+
dt -= offsetMs;
|
|
291
|
+
}
|
|
292
|
+
return new Date(dt);
|
|
293
|
+
}
|
|
294
|
+
if (m[0].includes("-")) {
|
|
295
|
+
const [_$1, dd$1, monStr$1, yyyy$1] = m;
|
|
296
|
+
const mon$1 = monthMap[monStr$1.toLowerCase()];
|
|
297
|
+
return new Date(Date.UTC(Number(yyyy$1), mon$1, Number(dd$1)));
|
|
298
|
+
}
|
|
299
|
+
const [_, monStr, dd, yyyy] = m;
|
|
300
|
+
const mon = monthMap[monStr.toLowerCase()];
|
|
301
|
+
return new Date(Date.UTC(Number(yyyy), mon, Number(dd)));
|
|
302
|
+
} catch {}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
305
|
//#endregion
|
|
306
306
|
//#region src/lib/privacy.ts
|
|
307
307
|
const PRIVACY_NAME_KEYWORDS = [
|
|
@@ -382,7 +382,7 @@ function asDateLike(value) {
|
|
|
382
382
|
* Convert RDAP JSON into our normalized DomainRecord.
|
|
383
383
|
* This function is defensive: RDAP servers vary in completeness and field naming.
|
|
384
384
|
*/
|
|
385
|
-
function normalizeRdap(inputDomain, tld, rdap, rdapServersTried,
|
|
385
|
+
function normalizeRdap(inputDomain, tld, rdap, rdapServersTried, includeRaw = false) {
|
|
386
386
|
const doc = rdap ?? {};
|
|
387
387
|
const ldhName = asString(doc.ldhName) || asString(doc.handle);
|
|
388
388
|
const unicodeName = asString(doc.unicodeName);
|
|
@@ -450,7 +450,6 @@ function normalizeRdap(inputDomain, tld, rdap, rdapServersTried, fetchedAtISO, i
|
|
|
450
450
|
rawRdap: includeRaw ? rdap : void 0,
|
|
451
451
|
rawWhois: void 0,
|
|
452
452
|
source: "rdap",
|
|
453
|
-
fetchedAt: fetchedAtISO,
|
|
454
453
|
warnings: void 0
|
|
455
454
|
};
|
|
456
455
|
}
|
|
@@ -737,7 +736,7 @@ function normalizeServer(server) {
|
|
|
737
736
|
* Convert raw WHOIS text into our normalized DomainRecord.
|
|
738
737
|
* Heuristics cover many gTLD and ccTLD formats; exact fields vary per registry.
|
|
739
738
|
*/
|
|
740
|
-
function normalizeWhois(domain, tld, whoisText, whoisServer,
|
|
739
|
+
function normalizeWhois(domain, tld, whoisText, whoisServer, includeRaw = false) {
|
|
741
740
|
const map = parseKeyValueLines(whoisText);
|
|
742
741
|
const creationDate = anyValue(map, [
|
|
743
742
|
"creation date",
|
|
@@ -848,7 +847,6 @@ function normalizeWhois(domain, tld, whoisText, whoisServer, fetchedAtISO, inclu
|
|
|
848
847
|
rawRdap: void 0,
|
|
849
848
|
rawWhois: includeRaw ? whoisText : void 0,
|
|
850
849
|
source: "whois",
|
|
851
|
-
fetchedAt: fetchedAtISO,
|
|
852
850
|
warnings: void 0
|
|
853
851
|
};
|
|
854
852
|
}
|
|
@@ -980,7 +978,6 @@ async function lookupDomain(domain, opts) {
|
|
|
980
978
|
error: "Input does not look like a domain"
|
|
981
979
|
};
|
|
982
980
|
const { publicSuffix, tld } = getDomainParts(domain);
|
|
983
|
-
const now = toISO(/* @__PURE__ */ new Date()) ?? (/* @__PURE__ */ new Date()).toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
984
981
|
if (!opts?.whoisOnly) {
|
|
985
982
|
const bases = await getRdapBaseUrlsForTld(tld, opts);
|
|
986
983
|
const tried = [];
|
|
@@ -991,7 +988,7 @@ async function lookupDomain(domain, opts) {
|
|
|
991
988
|
const rdapEnriched = await fetchAndMergeRdapRelated(domain, json, opts);
|
|
992
989
|
return {
|
|
993
990
|
ok: true,
|
|
994
|
-
record: normalizeRdap(domain, tld, rdapEnriched.merged, [...tried, ...rdapEnriched.serversTried],
|
|
991
|
+
record: normalizeRdap(domain, tld, rdapEnriched.merged, [...tried, ...rdapEnriched.serversTried], !!opts?.includeRaw)
|
|
995
992
|
};
|
|
996
993
|
} catch {}
|
|
997
994
|
}
|
|
@@ -1020,13 +1017,13 @@ async function lookupDomain(domain, opts) {
|
|
|
1020
1017
|
const alt = await whoisQuery(server, domain, opts);
|
|
1021
1018
|
if (alt.text && !/error/i.test(alt.text)) return {
|
|
1022
1019
|
ok: true,
|
|
1023
|
-
record: normalizeWhois(domain, tld, alt.text, alt.serverQueried,
|
|
1020
|
+
record: normalizeWhois(domain, tld, alt.text, alt.serverQueried, !!opts?.includeRaw)
|
|
1024
1021
|
};
|
|
1025
1022
|
} catch {}
|
|
1026
1023
|
}
|
|
1027
1024
|
return {
|
|
1028
1025
|
ok: true,
|
|
1029
|
-
record: normalizeWhois(domain, tld, res.text, res.serverQueried,
|
|
1026
|
+
record: normalizeWhois(domain, tld, res.text, res.serverQueried, !!opts?.includeRaw)
|
|
1030
1027
|
};
|
|
1031
1028
|
} catch (err) {
|
|
1032
1029
|
return {
|