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 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
@@ -88,8 +88,6 @@ interface DomainRecord {
88
88
  rawWhois?: string;
89
89
  /** Which source produced data */
90
90
  source: LookupSource;
91
- /** ISO 8601 timestamp at time of lookup */
92
- fetchedAt: string;
93
91
  /** Warnings generated during lookup */
94
92
  warnings?: string[];
95
93
  }
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, fetchedAtISO, includeRaw = false) {
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, fetchedAtISO, includeRaw = false) {
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], now, !!opts?.includeRaw)
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, now, !!opts?.includeRaw)
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, now, !!opts?.includeRaw)
1026
+ record: normalizeWhois(domain, tld, res.text, res.serverQueried, !!opts?.includeRaw)
1030
1027
  };
1031
1028
  } catch (err) {
1032
1029
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rdapper",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "license": "MIT",
5
5
  "description": "🎩 RDAP/WHOIS fetcher, parser, and normalizer for Node",
6
6
  "repository": {