@slicedearth/whoisleuth-cli 1.32.0

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.
Files changed (189) hide show
  1. package/LICENSE +661 -0
  2. package/LICENSES/Retire.js-Apache-2.0.txt +199 -0
  3. package/NOTICE +76 -0
  4. package/README.md +84 -0
  5. package/TRADEMARKS.md +41 -0
  6. package/bin/whoisleuth.mjs +35 -0
  7. package/cli/archive-inspect.mjs +198 -0
  8. package/cli/arguments.mjs +1022 -0
  9. package/cli/artifact-verify.mjs +210 -0
  10. package/cli/bulk-checkpoint.mjs +218 -0
  11. package/cli/bulk-command-runner.mjs +109 -0
  12. package/cli/bulk-output.mjs +112 -0
  13. package/cli/bulk.mjs +133 -0
  14. package/cli/compare.mjs +238 -0
  15. package/cli/completion.mjs +175 -0
  16. package/cli/csv.mjs +1 -0
  17. package/cli/discover.mjs +50 -0
  18. package/cli/discovery-command-runner.mjs +36 -0
  19. package/cli/discovery-observation-snapshot.mjs +315 -0
  20. package/cli/discovery-scan-command-runner.mjs +141 -0
  21. package/cli/discovery-scan.mjs +325 -0
  22. package/cli/discovery-snapshot.mjs +133 -0
  23. package/cli/discovery-workflow.mjs +73 -0
  24. package/cli/doctor.mjs +137 -0
  25. package/cli/errors.mjs +21 -0
  26. package/cli/evidence-command-arguments.mjs +145 -0
  27. package/cli/evidence-command-runner.mjs +106 -0
  28. package/cli/evidence-signing.mjs +215 -0
  29. package/cli/exit-codes.mjs +9 -0
  30. package/cli/export-evidence.mjs +28 -0
  31. package/cli/formatters/evidence-report.mjs +3 -0
  32. package/cli/formatters/html.mjs +69 -0
  33. package/cli/formatters/json.mjs +135 -0
  34. package/cli/formatters/markdown.mjs +3 -0
  35. package/cli/formatters/terminal.mjs +658 -0
  36. package/cli/http.mjs +27 -0
  37. package/cli/lookup-command-runner.mjs +87 -0
  38. package/cli/lookup-diff.mjs +171 -0
  39. package/cli/mail-review.mjs +204 -0
  40. package/cli/manual.mjs +34 -0
  41. package/cli/network-command-runner.mjs +88 -0
  42. package/cli/output-file.mjs +97 -0
  43. package/cli/page-compare.mjs +123 -0
  44. package/cli/posture.mjs +20 -0
  45. package/cli/progress-events.mjs +53 -0
  46. package/cli/progress.mjs +56 -0
  47. package/cli/registry-access.mjs +3 -0
  48. package/cli/registry-support.mjs +120 -0
  49. package/cli/risk-calibration.mjs +294 -0
  50. package/cli/runner-types.mjs +1 -0
  51. package/cli/runner.mjs +726 -0
  52. package/cli/saved-lookup.mjs +87 -0
  53. package/cli/source-reliability.mjs +727 -0
  54. package/cli/strict-exit.mjs +55 -0
  55. package/cli/terminal-presentation.mjs +147 -0
  56. package/docs/cli.md +827 -0
  57. package/frontend/src/lib/analysis/acquisition-decision-packet.js +93 -0
  58. package/frontend/src/lib/analysis/acquisition-due-diligence.js +391 -0
  59. package/frontend/src/lib/analysis/artifact-integrity.js +21 -0
  60. package/frontend/src/lib/analysis/brand-profile-model.js +421 -0
  61. package/frontend/src/lib/analysis/bulk-domain-comparison.js +246 -0
  62. package/frontend/src/lib/analysis/bulk-mail-exposure.js +192 -0
  63. package/frontend/src/lib/analysis/bulk-retry-plan.js +86 -0
  64. package/frontend/src/lib/analysis/bulk-review-export.js +62 -0
  65. package/frontend/src/lib/analysis/bulk-review-model.js +266 -0
  66. package/frontend/src/lib/analysis/bulk-session-model.js +515 -0
  67. package/frontend/src/lib/analysis/bulk-sort.js +49 -0
  68. package/frontend/src/lib/analysis/campaign-model.js +265 -0
  69. package/frontend/src/lib/analysis/case-evidence-model.js +642 -0
  70. package/frontend/src/lib/analysis/case-migration-model.js +248 -0
  71. package/frontend/src/lib/analysis/case-model.js +5 -0
  72. package/frontend/src/lib/analysis/case-record-contracts.js +44 -0
  73. package/frontend/src/lib/analysis/case-record-core.js +232 -0
  74. package/frontend/src/lib/analysis/case-record-model.js +7 -0
  75. package/frontend/src/lib/analysis/case-record-operations.js +224 -0
  76. package/frontend/src/lib/analysis/case-response-model.js +640 -0
  77. package/frontend/src/lib/analysis/case-response-packet.js +573 -0
  78. package/frontend/src/lib/analysis/case-storage-model.js +93 -0
  79. package/frontend/src/lib/analysis/detection-rule-model.js +306 -0
  80. package/frontend/src/lib/analysis/dns-record-normalization.js +11 -0
  81. package/frontend/src/lib/analysis/http-summary.js +165 -0
  82. package/frontend/src/lib/analysis/investigation-guide.js +500 -0
  83. package/frontend/src/lib/analysis/investigation-template-model.js +144 -0
  84. package/frontend/src/lib/analysis/page-baseline.js +272 -0
  85. package/frontend/src/lib/analysis/page-similarity.js +179 -0
  86. package/frontend/src/lib/analysis/relationship-evidence.js +265 -0
  87. package/frontend/src/lib/analysis/relationship-observation-model.js +423 -0
  88. package/frontend/src/lib/analysis/scoring.js +135 -0
  89. package/frontend/src/lib/analysis/shortlist-model.js +209 -0
  90. package/frontend/src/lib/analysis/utils.js +265 -0
  91. package/frontend/src/lib/analysis/watchlist-history.js +643 -0
  92. package/frontend/src/lib/analysis/watchlist-store.js +127 -0
  93. package/frontend/src/lib/analysis/website-snapshot-model.js +302 -0
  94. package/frontend/src/lib/analysis/workspace-archive-crypto.js +282 -0
  95. package/frontend/src/lib/analysis/workspace-archive.js +472 -0
  96. package/lib/abort.mjs +26 -0
  97. package/lib/abusech-auth.mjs +19 -0
  98. package/lib/availability.mjs +716 -0
  99. package/lib/bounded-contract-normalizers.mjs +61 -0
  100. package/lib/browser-library-profile.mjs +310 -0
  101. package/lib/bulk-comparison-evidence.mjs +83 -0
  102. package/lib/classify.mjs +93 -0
  103. package/lib/client-behavior-profile.mjs +83 -0
  104. package/lib/credential-surface-profile.mjs +66 -0
  105. package/lib/csv.mjs +23 -0
  106. package/lib/ct-query.mjs +27 -0
  107. package/lib/ct-search.mjs +393 -0
  108. package/lib/distributed-operation-budget.mjs +461 -0
  109. package/lib/dns-delegation-health.mjs +344 -0
  110. package/lib/dns-intelligence.mjs +739 -0
  111. package/lib/dns-mx.mjs +24 -0
  112. package/lib/dns-resolver-selection.mjs +33 -0
  113. package/lib/domain-posture-analysis.mjs +254 -0
  114. package/lib/domain-posture-parsers.mjs +358 -0
  115. package/lib/domain-posture.mjs +745 -0
  116. package/lib/error-detail.mjs +10 -0
  117. package/lib/evidence-export.mjs +431 -0
  118. package/lib/evidence-report-markdown.mjs +71 -0
  119. package/lib/evidence-report.mjs +391 -0
  120. package/lib/external-intelligence-risk.mjs +108 -0
  121. package/lib/favicon.mjs +146 -0
  122. package/lib/feature-policy.mjs +70 -0
  123. package/lib/generated/retire-browser-catalog.mjs +8724 -0
  124. package/lib/generated/unicode-confusables-17.mjs +93 -0
  125. package/lib/hostname.mjs +38 -0
  126. package/lib/html-signals.mjs +680 -0
  127. package/lib/http-intelligence.mjs +232 -0
  128. package/lib/idn-confusable-policy.mjs +86 -0
  129. package/lib/idn-confusables.mjs +465 -0
  130. package/lib/lookup-cache.mjs +130 -0
  131. package/lib/lookup-progress.mjs +291 -0
  132. package/lib/lookup-source-progress.mjs +109 -0
  133. package/lib/lookup-threat-provider-inventory.mjs +13 -0
  134. package/lib/lookup.mjs +592 -0
  135. package/lib/observation.mjs +114 -0
  136. package/lib/observed-network-context.mjs +355 -0
  137. package/lib/operation-budget.mjs +489 -0
  138. package/lib/page-fingerprints.mjs +481 -0
  139. package/lib/page-role-profile.mjs +117 -0
  140. package/lib/perceptual-hash.mjs +451 -0
  141. package/lib/rdap-attempts.mjs +34 -0
  142. package/lib/rdap-bootstrap.mjs +173 -0
  143. package/lib/rdap-capabilities.mjs +292 -0
  144. package/lib/rdap-client.mjs +125 -0
  145. package/lib/rdap-normalization.mjs +691 -0
  146. package/lib/rdap-registrar.mjs +196 -0
  147. package/lib/rdap-transport.mjs +39 -0
  148. package/lib/rdap-types.mjs +1 -0
  149. package/lib/rdap-validation.mjs +94 -0
  150. package/lib/rdap.mjs +16 -0
  151. package/lib/registry-access.mjs +32 -0
  152. package/lib/registry-capabilities.mjs +117 -0
  153. package/lib/registry-capability-catalogue.mjs +1206 -0
  154. package/lib/registry-comparison.mjs +318 -0
  155. package/lib/registry-dates.mjs +190 -0
  156. package/lib/registry-insights.mjs +325 -0
  157. package/lib/response-policy.mjs +256 -0
  158. package/lib/risk-scoring.mjs +164 -0
  159. package/lib/safe-fetch.mjs +446 -0
  160. package/lib/security-txt.mjs +359 -0
  161. package/lib/service-binding-dns.mjs +608 -0
  162. package/lib/sslbl-certificates.generated.mjs +143 -0
  163. package/lib/sslbl-intelligence.mjs +241 -0
  164. package/lib/static-html-analysis.mjs +340 -0
  165. package/lib/structured-data-identity.mjs +323 -0
  166. package/lib/threat-intelligence-contract.mjs +5 -0
  167. package/lib/threat-intelligence-definition-registry.mjs +34 -0
  168. package/lib/threat-intelligence-fixtures.mjs +82 -0
  169. package/lib/threat-intelligence-manifests.mjs +512 -0
  170. package/lib/threat-intelligence-runtime.mjs +662 -0
  171. package/lib/threat-intelligence-targets.mjs +168 -0
  172. package/lib/threat-intelligence-types.mjs +3 -0
  173. package/lib/threatfox-intelligence.mjs +307 -0
  174. package/lib/tls-intelligence.mjs +814 -0
  175. package/lib/typosquat-generator.mjs +884 -0
  176. package/lib/urlhaus-intelligence.mjs +361 -0
  177. package/lib/urlscan-intelligence.mjs +349 -0
  178. package/lib/website-security-posture.mjs +325 -0
  179. package/lib/website-technology.mjs +437 -0
  180. package/lib/whois-authority.mjs +98 -0
  181. package/lib/whois-chain.mjs +261 -0
  182. package/lib/whois-contacts.mjs +163 -0
  183. package/lib/whois-contracts.mjs +3 -0
  184. package/lib/whois-normalization.mjs +27 -0
  185. package/lib/whois-transport.mjs +100 -0
  186. package/lib/whois-values.mjs +92 -0
  187. package/lib/whois.mjs +1187 -0
  188. package/package.json +55 -0
  189. package/third-party-notices.txt +5571 -0
@@ -0,0 +1,1206 @@
1
+ // Registry compatibility metadata. IANA bootstrap and referral discovery
2
+ // remain authoritative. Explicit query profiles may alter only the first
3
+ // referred registry query after a fixture-backed adapter is integrated.
4
+ const REGISTRY_CAPABILITIES_VERSION = 27;
5
+ const MAX_CAPABILITY_INPUT_LENGTH = 253;
6
+ const REGISTRY_STANDARDS_COVERAGE_SNAPSHOT = Object.freeze({
7
+ schema: 'whoisleuth.registry-standards-coverage',
8
+ version: 1,
9
+ verifiedAt: '2026-08-01',
10
+ sources: Object.freeze({
11
+ rootZoneVersion: '2026073100',
12
+ rootZoneLastUpdatedAt: '2026-07-31T07:07:01.000Z',
13
+ rdapBootstrapPublication: '2026-07-23T02:00:03.000Z',
14
+ rdapBootstrapVersion: '1.0',
15
+ urls: Object.freeze([
16
+ 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt',
17
+ 'https://data.iana.org/rdap/dns.json',
18
+ 'https://www.iana.org/domains/root/db',
19
+ ]),
20
+ }),
21
+ counts: Object.freeze({
22
+ activeTlds: 1438,
23
+ countryCode: 309,
24
+ nonCountryCode: 1129,
25
+ generic: 1111,
26
+ genericRestricted: 3,
27
+ sponsored: 14,
28
+ infrastructure: 1,
29
+ rdapBootstrapServiceGroups: 590,
30
+ genericAndRestrictedRdapCovered: 1114,
31
+ sponsoredRdapCovered: 12,
32
+ infrastructureRdapCovered: 0,
33
+ }),
34
+ exceptions: Object.freeze([
35
+ Object.freeze({
36
+ suffix: 'edu', registryClass: 'sponsored',
37
+ rdapAccessProfile: 'no-iana-service',
38
+ whoisAccessProfile: 'iana-referral',
39
+ }),
40
+ Object.freeze({
41
+ suffix: 'mil', registryClass: 'sponsored',
42
+ rdapAccessProfile: 'no-iana-service',
43
+ whoisAccessProfile: 'no-iana-service',
44
+ }),
45
+ Object.freeze({
46
+ suffix: 'arpa', registryClass: 'infrastructure',
47
+ rdapAccessProfile: 'no-iana-service',
48
+ whoisAccessProfile: 'iana-referral',
49
+ }),
50
+ ]),
51
+ interpretation: 'This official-source snapshot describes published service coverage at the verification date. It does not test current reachability or decide registration, availability, ownership, safety, or maliciousness.',
52
+ });
53
+ const DISCOVERY_LIMITATION = 'IANA discovery is available, but no suffix-specific query, encoding, or parser behavior is fixture-verified.';
54
+ const FIXTURE_LIMITATION = 'Synthetic fixtures verify the current parser profile; they do not prove current live-registry reachability, policy, or field publication.';
55
+ const ES_ACCESS_LIMITATION = 'The registry WHOIS service requires advance source-IP authorization. A failed or unavailable query is not evidence that the domain is unregistered.';
56
+ const SWITCH_ACCESS_LIMITATION = 'The registry directs public domain searches to its official lookup. Its non-standard-port Domain Check is not integrated, and IANA publishes no RDAP service. Missing registry data is not evidence that the domain is unregistered.';
57
+ const VN_ACCESS_LIMITATION = 'IANA publishes no domain WHOIS or RDAP service for this suffix. The official browser lookup is not integrated, and missing registry data is not evidence that the domain is unregistered.';
58
+ const UK_TRANSITION_LIMITATION = 'Synthetic fixtures verify the documented sectioned port-43 response while that WHOIS service is phased out. RDAP remains the preferred registry source, and fixture coverage does not prove current reachability or field publication.';
59
+ const MY_ACCESS_LIMITATION = 'Synthetic fixtures verify the current parser profile. The registry limits public WHOIS use, prohibits abusive high-volume automation, and states that a missing record is not proof of availability; WHOISleuth retains bounded request controls and authority-aware interpretation. IANA publishes no RDAP bootstrap service for this suffix.';
60
+ const NO_IANA_MACHINE_SERVICE_LIMITATION = 'IANA publishes no domain WHOIS or RDAP service for this suffix. Missing registry data is not evidence that the domain is unregistered.';
61
+ const RDAP_ONLY_MACHINE_SERVICE_LIMITATION = 'IANA publishes an RDAP bootstrap service but no domain WHOIS referral for this suffix. Missing WHOIS data is contextual only and is not evidence that the domain is unregistered.';
62
+ const SHARED_WHOIS_NO_RDAP_LIMITATION = 'Synthetic fixture reuse is limited to an exact shared IANA WHOIS service. IANA publishes no RDAP bootstrap service for this suffix, and missing registry data is not evidence that the domain is unregistered.';
63
+ const WHOIS_ONLY_FIXTURE_LIMITATION = 'Synthetic fixtures verify the current WHOIS parser profile. IANA publishes no RDAP bootstrap service for this suffix, and missing registry data is not evidence that the domain is unregistered.';
64
+ const NEGATIVE_ONLY_FIXTURE_LIMITATION = 'Synthetic fixtures verify only the authoritative no-record dialect; registered-field compatibility is not claimed, and fixture coverage does not prove current live-registry reachability or policy.';
65
+ const WHOIS_ONLY_NEGATIVE_FIXTURE_LIMITATION = 'Synthetic fixtures verify only the authoritative WHOIS no-record dialect; registered-field compatibility is not claimed, IANA publishes no RDAP bootstrap service, and missing registry data is not evidence that the domain is unregistered.';
66
+ const UNVERIFIED_WHOIS_REFERRAL_LIMITATION = 'IANA publishes a domain WHOIS referral, but its response behavior is not fixture-verified. A failed, restricted, prohibited, reserved, or otherwise inconclusive response is not evidence that the domain is unregistered, and IANA publishes no RDAP bootstrap service for this suffix.';
67
+ const UNVERIFIED_WHOIS_WITH_RDAP_LIMITATION = 'IANA publishes domain WHOIS and RDAP discovery, but the WHOIS response behavior is not fixture-verified. A failed, restricted, prohibited, reserved, or otherwise inconclusive WHOIS response is not evidence that the domain is unregistered; RDAP remains separately attributed.';
68
+ const NORID_CLOSED_SUFFIX_LIMITATION = 'The registry has not opened this suffix for registrations, and IANA publishes no domain WHOIS or RDAP service. Missing registry data is contextual only and must not be interpreted as a live availability result.';
69
+ const MIL_ACCESS_LIMITATION = 'IANA publishes no public domain WHOIS or RDAP service for this sponsored suffix. Missing registry data is contextual only and is not evidence that a name is unregistered or available.';
70
+ const ARPA_ACCESS_LIMITATION = 'This infrastructure suffix is not ordinary public registration space. IANA publishes WHOIS metadata but no RDAP bootstrap service, and missing or non-domain-shaped data must not be interpreted as registration availability.';
71
+ const VERSION_15_NO_IANA_MACHINE_SERVICE_SUFFIXES = Object.freeze([
72
+ 'ao', 'az', 'bb', 'bd', 'bs', 'bt', 'bz', 'cd', 'cg', 'ck',
73
+ 'cu', 'cw', 'dj', 'eg', 'et', 'fk', 'gm', 'gu', 'jo', 'kh',
74
+ ]);
75
+ const VERSION_16_NO_IANA_MACHINE_SERVICE_SUFFIXES = Object.freeze([
76
+ 'aq', 'er', 'ga', 'gb', 'gw', 'jm', 'km', 'kp', 'kw', 'lc',
77
+ 'lk', 'lr', 'mh', 'mp', 'mt', 'mv', 'ne', 'ni', 'np', 'nr',
78
+ 'pa', 'ps', 'py', 'sl', 'sv', 'sz', 'tj', 'tt', 'va',
79
+ 'xn--54b7fta0cc', 'xn--fzc2c9e2c', 'xn--node', 'xn--xkc2al3hye2a', 'zw',
80
+ ]);
81
+ const VERSION_19_NO_IANA_MACHINE_SERVICE_SUFFIXES = Object.freeze([
82
+ 'xn--mgbai9azgqp6j', 'xn--mgbayh7gpa', 'xn--mgbc0a9azcg',
83
+ 'xn--mgbcpq6gpa1a', 'xn--mgbpl2fh', 'xn--wgbh1c',
84
+ ]);
85
+ const VERSION_19_RDAP_ONLY_SUFFIXES = Object.freeze(['na', 'pn']);
86
+ const VERSION_20_FIXTURE_SUFFIXES = Object.freeze([
87
+ 'as', 'bm', 'cm', 'cv', 'cx', 'ec', 'fm', 'fo', 'gd', 'gy',
88
+ 'hn', 'ht', 'ky', 'lb', 'mg', 'ml', 'ms', 'mu', 'ng', 'pw',
89
+ 'rw', 'sd', 'sr', 'ss', 'to',
90
+ ]);
91
+ const VERSION_21_STANDARD_SUFFIXES = Object.freeze([
92
+ 'bf', 'dm', 'fj', 'kn', 'ly', 'mr', 'pe', 'pg', 'qa',
93
+ 'st', 'sx', 'sy', 'tv', 'ug', 'uz', 'ws', 'ye', 'zm',
94
+ ]);
95
+ const VERSION_21_CONTACT_SUFFIXES = Object.freeze(['mw', 'tz', 've']);
96
+ const VERSION_21_RDAP_SUFFIXES = Object.freeze([
97
+ 'fj', 'kg', 'ly', 'pg', 'tv', 'tz', 'uz', 'vg', 'ye', 'zm',
98
+ ]);
99
+ const VERSION_21_NEGATIVE_ONLY_SUFFIXES = Object.freeze(['nc', 'vg']);
100
+ const VERSION_22_NEGATIVE_ONLY_SUFFIXES = Object.freeze([
101
+ 'ag', 'aw', 'ax', 'bi', 'bn', 'ci', 'gh', 'gn', 'gs',
102
+ 'im', 'ki', 'ma', 'mz', 'nf', 'pr', 'sc', 'sh', 'sn',
103
+ 'so', 'tc', 'td', 'tg', 'tm', 'vu', 'xn--j1amh',
104
+ 'xn--mgbah1a3hjkrd', 'xn--ogbpf8fl',
105
+ ]);
106
+ const VERSION_22_RDAP_SUFFIXES = Object.freeze(['gs', 'nf', 'sn']);
107
+ const VERSION_23_NEGATIVE_ONLY_SUFFIXES = Object.freeze(['bj', 'do']);
108
+ const VERSION_23_UNVERIFIED_REFERRAL_SUFFIXES = Object.freeze([
109
+ 'bo', 'bw', 'cf', 'ge', 'gp', 'gq', 'hm', 'iq', 'pf', 'sb',
110
+ 'sm', 'tk', 'tl', 'uy', 'vi', 'xn--90ae', 'xn--l1acc',
111
+ 'xn--mgbtx2b', 'xn--wgbl6a', 'xn--ygbi2ammx',
112
+ ]);
113
+ const VERSION_23_RDAP_SUFFIXES = Object.freeze(['vi']);
114
+ const VERSION_24_PROMOTED_SUFFIXES = Object.freeze([
115
+ 'xn--90ae', 'xn--l1acc', 'xn--wgbl6a',
116
+ ]);
117
+ const CURRENT_UNVERIFIED_REFERRAL_SUFFIXES = Object.freeze(VERSION_23_UNVERIFIED_REFERRAL_SUFFIXES.filter((suffix) => !VERSION_24_PROMOTED_SUFFIXES.includes(suffix)));
118
+ const VERSION_26_NO_RDAP_SUFFIXES = Object.freeze([
119
+ 'ac', 'ae', 'af', 'am', 'at', 'be', 'bg', 'by', 'cl', 'cn',
120
+ 'co', 'de', 'dk', 'ee', 'eu', 'gf', 'gi', 'gt', 'hk', 'hr',
121
+ 'hu', 'ie', 'il', 'io', 'ir', 'it', 'jp', 'kr', 'kz', 'la',
122
+ 'lt', 'lu', 'lv', 'md', 'me', 'mk', 'mo', 'mq', 'mx', 'my',
123
+ 'nz', 'pk', 'pt', 'ro', 'rs', 'ru', 'sa', 'se', 'sk', 'su',
124
+ 'tn', 'tr', 'us', 'vc', 'xn--2scrj9c', 'xn--3e0b707e',
125
+ 'xn--3hcrj9c', 'xn--45br5cyl', 'xn--45brj9c', 'xn--80ao21a',
126
+ 'xn--90a3ac', 'xn--90ais', 'xn--d1alf', 'xn--e1a4c',
127
+ 'xn--fiqs8s', 'xn--fiqz9s', 'xn--fpcrj9c3d', 'xn--gecrj9c',
128
+ 'xn--h2breg3eve', 'xn--h2brj9c', 'xn--h2brj9c8c', 'xn--j6w193g',
129
+ 'xn--kprw13d', 'xn--mix891f', 'xn--p1ai', 'xn--q7ce6a',
130
+ 'xn--qxa6a', 'xn--rvc1e0am3e', 'xn--s9brj9c',
131
+ 'xn--xkc2dl3a5ee0h', 'xn--y9a3aq',
132
+ ]);
133
+ const VERSION_26_NO_RDAP_SUFFIX_SET = new Set(VERSION_26_NO_RDAP_SUFFIXES);
134
+ const VERSION_27_RDAP_ONLY_GENERIC_SUFFIXES = Object.freeze([
135
+ 'app', 'boo', 'channel', 'dad', 'day', 'dev', 'esq', 'foo', 'how', 'info',
136
+ 'ing', 'meme', 'mov', 'new', 'nexus', 'page', 'phd', 'prof', 'rsvp', 'soy',
137
+ 'web', 'xn--q9jyb4c', 'zip',
138
+ ]);
139
+ const NO_IANA_MACHINE_SERVICE_SUFFIXES = Object.freeze([
140
+ ...VERSION_15_NO_IANA_MACHINE_SERVICE_SUFFIXES,
141
+ ...VERSION_16_NO_IANA_MACHINE_SERVICE_SUFFIXES,
142
+ ...VERSION_19_NO_IANA_MACHINE_SERVICE_SUFFIXES,
143
+ ]);
144
+ function freezeCapability(capability) {
145
+ Object.freeze(capability.suffixes);
146
+ Object.freeze(capability.fixtureScenarios);
147
+ Object.freeze(capability.verificationFiles);
148
+ Object.freeze(capability.documentationUrls);
149
+ return Object.freeze(capability);
150
+ }
151
+ const DEFAULT_CAPABILITY = freezeCapability({
152
+ id: 'iana-generic',
153
+ suffixes: [],
154
+ registryClass: 'unknown',
155
+ rdapDiscovery: 'iana-bootstrap',
156
+ whoisDiscovery: 'iana-referral',
157
+ whoisQueryProfile: 'plain-domain',
158
+ whoisQueryScope: 'first-referral',
159
+ whoisEncodingProfile: 'utf-8',
160
+ whoisParserProfile: 'generic-colon',
161
+ fallbackProfile: null,
162
+ whoisAccessProfile: 'iana-referral',
163
+ rdapAccessProfile: 'iana-bootstrap',
164
+ coverageState: 'discovery_only',
165
+ fixtureScenarios: ['registered', 'not_found', 'rate_limited'],
166
+ verificationFiles: ['fixtures/whois-registry-fixtures.mts'],
167
+ documentationUrls: [],
168
+ limitation: DISCOVERY_LIMITATION,
169
+ });
170
+ const EXPLICIT_CAPABILITY_SEEDS = [
171
+ {
172
+ id: 'generic-rdap-only-documented',
173
+ suffixes: [...VERSION_27_RDAP_ONLY_GENERIC_SUFFIXES],
174
+ registryClass: 'generic',
175
+ whoisParserProfile: 'generic-colon',
176
+ fixtureScenarios: [],
177
+ coverageState: 'access_documented',
178
+ whoisAccessProfile: 'no-iana-service',
179
+ rdapAccessProfile: 'iana-bootstrap',
180
+ verificationFiles: [],
181
+ documentationUrls: VERSION_27_RDAP_ONLY_GENERIC_SUFFIXES.map((suffix) => `https://www.iana.org/domains/root/db/${suffix}.html`),
182
+ limitation: RDAP_ONLY_MACHINE_SERVICE_LIMITATION,
183
+ },
184
+ {
185
+ id: 'nic-ar-colon', suffixes: ['ar'], registryClass: 'country-code',
186
+ whoisParserProfile: 'nic-ar-colon', fixtureScenarios: ['registered', 'not_found'],
187
+ documentationUrls: [
188
+ 'https://nic.ar/index.php/en/whois',
189
+ 'https://www.iana.org/domains/root/db/ar.html',
190
+ ],
191
+ },
192
+ {
193
+ id: 'nic-at-colon', suffixes: ['at'], registryClass: 'country-code',
194
+ whoisParserProfile: 'nic-at-colon', fixtureScenarios: ['registered', 'not_found'],
195
+ documentationUrls: [
196
+ 'https://www.nic.at/en/my-at-domain/domain-search/whois',
197
+ 'https://www.iana.org/domains/root/db/at.html',
198
+ ],
199
+ },
200
+ {
201
+ id: 'eligibility-contact', suffixes: ['au'], registryClass: 'country-code',
202
+ whoisParserProfile: 'eligibility-contact', fixtureScenarios: ['registered'],
203
+ },
204
+ {
205
+ id: 'dns-belgium-sectioned', suffixes: ['be'], registryClass: 'country-code',
206
+ whoisParserProfile: 'sectioned-registrar-and-nameservers', fixtureScenarios: ['registered'],
207
+ documentationUrls: [
208
+ 'https://www.dnsbelgium.be/en/our-role/registry-registrar-registrant',
209
+ 'https://www.iana.org/domains/root/db/be.html',
210
+ ],
211
+ },
212
+ {
213
+ id: 'register-bg-sectioned', suffixes: ['bg'], registryClass: 'country-code',
214
+ whoisParserProfile: 'register-bg-sectioned', fixtureScenarios: ['registered', 'not_found'],
215
+ documentationUrls: [
216
+ 'https://www.register.bg/',
217
+ 'https://www.iana.org/domains/root/db/bg.html',
218
+ ],
219
+ },
220
+ {
221
+ id: 'imena-bg-idn-sectioned', suffixes: ['xn--90ae'], registryClass: 'country-code',
222
+ whoisQueryProfile: 'registry-domain-unicode',
223
+ whoisParserProfile: 'register-bg-sectioned', fixtureScenarios: ['registered', 'not_found'],
224
+ rdapAccessProfile: 'no-iana-service',
225
+ documentationUrls: ['https://www.iana.org/domains/root/db/xn--90ae.html'],
226
+ limitation: WHOIS_ONLY_FIXTURE_LIMITATION,
227
+ },
228
+ {
229
+ id: 'registro-br-colon', suffixes: ['br'], registryClass: 'country-code',
230
+ whoisParserProfile: 'registro-br-colon', fixtureScenarios: ['registered', 'not_found'],
231
+ documentationUrls: [
232
+ 'https://registro.br/tecnologia/ferramentas/whois/',
233
+ 'https://www.iana.org/domains/root/db/br.html',
234
+ ],
235
+ },
236
+ {
237
+ id: 'cira-colon', suffixes: ['ca'], registryClass: 'country-code',
238
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered', 'not_found'],
239
+ documentationUrls: [
240
+ 'https://www.cira.ca/en/ca-domains/whois/',
241
+ 'https://www.iana.org/domains/root/db/ca.html',
242
+ ],
243
+ },
244
+ {
245
+ id: 'nic-chile-colon', suffixes: ['cl'], registryClass: 'country-code',
246
+ whoisParserProfile: 'nic-chile-colon', fixtureScenarios: ['registered', 'not_found'],
247
+ documentationUrls: [
248
+ 'https://www.nic.cl/normativa/politica-publicacion-de-datos-cl.pdf',
249
+ 'https://www.iana.org/domains/root/db/cl.html',
250
+ ],
251
+ },
252
+ {
253
+ id: 'switch-policy-restricted', suffixes: ['ch', 'li'], registryClass: 'country-code',
254
+ whoisParserProfile: 'generic-colon', fixtureScenarios: [],
255
+ coverageState: 'access_documented', whoisAccessProfile: 'registry-policy-restricted',
256
+ rdapAccessProfile: 'no-iana-service', verificationFiles: [],
257
+ documentationUrls: [
258
+ 'https://www.nic.ch/whois/',
259
+ 'https://www.nic.ch/whois/domaincheck/',
260
+ 'https://www.iana.org/domains/root/db/ch.html',
261
+ 'https://www.iana.org/domains/root/db/li.html',
262
+ ],
263
+ limitation: SWITCH_ACCESS_LIMITATION,
264
+ },
265
+ {
266
+ id: 'aeda-colon', suffixes: ['ae'], registryClass: 'country-code',
267
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered'],
268
+ documentationUrls: ['https://www.iana.org/domains/root/db/ae.html'],
269
+ },
270
+ {
271
+ id: 'identity-digital-colon-ai', suffixes: ['ai'], registryClass: 'country-code',
272
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered'],
273
+ documentationUrls: ['https://www.iana.org/domains/root/db/ai.html'],
274
+ },
275
+ {
276
+ id: 'amnic-sectioned', suffixes: ['am', 'xn--y9a3aq'], registryClass: 'country-code',
277
+ whoisParserProfile: 'amnic-sectioned', fixtureScenarios: ['registered'],
278
+ documentationUrls: [
279
+ 'https://www.amnic.net/',
280
+ 'https://www.iana.org/domains/root/db/am.html',
281
+ 'https://www.iana.org/domains/root/db/xn--y9a3aq.html',
282
+ ],
283
+ },
284
+ {
285
+ id: 'no-iana-machine-service-al', suffixes: ['al'], registryClass: 'country-code',
286
+ whoisParserProfile: 'generic-colon', fixtureScenarios: [],
287
+ coverageState: 'access_documented', whoisAccessProfile: 'no-iana-service',
288
+ rdapAccessProfile: 'no-iana-service', verificationFiles: [],
289
+ documentationUrls: ['https://www.iana.org/domains/root/db/al.html'],
290
+ limitation: NO_IANA_MACHINE_SERVICE_LIMITATION,
291
+ },
292
+ ...NO_IANA_MACHINE_SERVICE_SUFFIXES.map((suffix) => ({
293
+ id: `no-iana-machine-service-${suffix}`,
294
+ suffixes: [suffix],
295
+ registryClass: 'country-code',
296
+ whoisParserProfile: 'generic-colon', fixtureScenarios: [],
297
+ coverageState: 'access_documented', whoisAccessProfile: 'no-iana-service',
298
+ rdapAccessProfile: 'no-iana-service', verificationFiles: [],
299
+ documentationUrls: [`https://www.iana.org/domains/root/db/${suffix}.html`],
300
+ limitation: NO_IANA_MACHINE_SERVICE_LIMITATION,
301
+ })),
302
+ ...VERSION_19_RDAP_ONLY_SUFFIXES.map((suffix) => ({
303
+ id: `iana-rdap-only-${suffix}`,
304
+ suffixes: [suffix],
305
+ registryClass: 'country-code',
306
+ whoisParserProfile: 'generic-colon', fixtureScenarios: [],
307
+ coverageState: 'access_documented', whoisAccessProfile: 'no-iana-service',
308
+ rdapAccessProfile: 'iana-bootstrap', verificationFiles: [],
309
+ documentationUrls: [`https://www.iana.org/domains/root/db/${suffix}.html`],
310
+ limitation: RDAP_ONLY_MACHINE_SERVICE_LIMITATION,
311
+ })),
312
+ ...VERSION_20_FIXTURE_SUFFIXES.map((suffix) => ({
313
+ id: `iana-cc-colon-${suffix}`,
314
+ suffixes: [suffix],
315
+ registryClass: 'country-code',
316
+ whoisParserProfile: 'icann-style-colon',
317
+ fixtureScenarios: ['registered'],
318
+ documentationUrls: [`https://www.iana.org/domains/root/db/${suffix}.html`],
319
+ })),
320
+ ...VERSION_21_STANDARD_SUFFIXES.map((suffix) => ({
321
+ id: `iana-cc-colon-${suffix}`,
322
+ suffixes: [suffix],
323
+ registryClass: 'country-code',
324
+ whoisParserProfile: 'icann-style-colon',
325
+ fixtureScenarios: ['registered'],
326
+ rdapAccessProfile: VERSION_21_RDAP_SUFFIXES.includes(suffix)
327
+ ? 'iana-bootstrap'
328
+ : 'no-iana-service',
329
+ documentationUrls: [`https://www.iana.org/domains/root/db/${suffix}.html`],
330
+ limitation: VERSION_21_RDAP_SUFFIXES.includes(suffix)
331
+ ? FIXTURE_LIMITATION
332
+ : WHOIS_ONLY_FIXTURE_LIMITATION,
333
+ })),
334
+ {
335
+ id: 'qatar-idn-colon', suffixes: ['xn--wgbl6a'], registryClass: 'country-code',
336
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered', 'not_found'],
337
+ rdapAccessProfile: 'no-iana-service',
338
+ documentationUrls: ['https://www.iana.org/domains/root/db/xn--wgbl6a.html'],
339
+ limitation: SHARED_WHOIS_NO_RDAP_LIMITATION,
340
+ },
341
+ ...VERSION_21_CONTACT_SUFFIXES.map((suffix) => ({
342
+ id: `iana-cc-contact-${suffix}`,
343
+ suffixes: [suffix],
344
+ registryClass: 'country-code',
345
+ whoisParserProfile: 'contact-indirection',
346
+ fixtureScenarios: ['registered'],
347
+ rdapAccessProfile: VERSION_21_RDAP_SUFFIXES.includes(suffix)
348
+ ? 'iana-bootstrap'
349
+ : 'no-iana-service',
350
+ documentationUrls: [`https://www.iana.org/domains/root/db/${suffix}.html`],
351
+ limitation: VERSION_21_RDAP_SUFFIXES.includes(suffix)
352
+ ? FIXTURE_LIMITATION
353
+ : WHOIS_ONLY_FIXTURE_LIMITATION,
354
+ })),
355
+ {
356
+ id: 'internetstiftelsen-nu-colon', suffixes: ['nu'], registryClass: 'country-code',
357
+ whoisParserProfile: 'internetstiftelsen-colon', fixtureScenarios: ['registered'],
358
+ rdapAccessProfile: 'no-iana-service',
359
+ documentationUrls: ['https://www.iana.org/domains/root/db/nu.html'],
360
+ limitation: WHOIS_ONLY_FIXTURE_LIMITATION,
361
+ },
362
+ {
363
+ id: 'nic-kg-sectioned', suffixes: ['kg'], registryClass: 'country-code',
364
+ whoisParserProfile: 'nic-kg-sectioned', fixtureScenarios: ['registered'],
365
+ documentationUrls: ['https://www.iana.org/domains/root/db/kg.html'],
366
+ },
367
+ ...VERSION_21_NEGATIVE_ONLY_SUFFIXES.map((suffix) => ({
368
+ id: `iana-cc-negative-${suffix}`,
369
+ suffixes: [suffix],
370
+ registryClass: 'country-code',
371
+ whoisParserProfile: 'generic-colon',
372
+ fixtureScenarios: ['not_found'],
373
+ rdapAccessProfile: VERSION_21_RDAP_SUFFIXES.includes(suffix)
374
+ ? 'iana-bootstrap'
375
+ : 'no-iana-service',
376
+ documentationUrls: [`https://www.iana.org/domains/root/db/${suffix}.html`],
377
+ limitation: VERSION_21_RDAP_SUFFIXES.includes(suffix)
378
+ ? NEGATIVE_ONLY_FIXTURE_LIMITATION
379
+ : WHOIS_ONLY_NEGATIVE_FIXTURE_LIMITATION,
380
+ })),
381
+ ...VERSION_22_NEGATIVE_ONLY_SUFFIXES.map((suffix) => ({
382
+ id: `iana-cc-negative-${suffix}`,
383
+ suffixes: [suffix],
384
+ registryClass: 'country-code',
385
+ whoisParserProfile: 'generic-colon',
386
+ fixtureScenarios: ['not_found'],
387
+ rdapAccessProfile: VERSION_22_RDAP_SUFFIXES.includes(suffix)
388
+ ? 'iana-bootstrap'
389
+ : 'no-iana-service',
390
+ documentationUrls: [`https://www.iana.org/domains/root/db/${suffix}.html`],
391
+ limitation: VERSION_22_RDAP_SUFFIXES.includes(suffix)
392
+ ? NEGATIVE_ONLY_FIXTURE_LIMITATION
393
+ : WHOIS_ONLY_NEGATIVE_FIXTURE_LIMITATION,
394
+ })),
395
+ ...VERSION_23_NEGATIVE_ONLY_SUFFIXES.map((suffix) => ({
396
+ id: `iana-cc-negative-${suffix}`,
397
+ suffixes: [suffix],
398
+ registryClass: 'country-code',
399
+ whoisParserProfile: 'generic-colon',
400
+ fixtureScenarios: ['not_found'],
401
+ rdapAccessProfile: 'no-iana-service',
402
+ documentationUrls: [`https://www.iana.org/domains/root/db/${suffix}.html`],
403
+ limitation: WHOIS_ONLY_NEGATIVE_FIXTURE_LIMITATION,
404
+ })),
405
+ ...CURRENT_UNVERIFIED_REFERRAL_SUFFIXES.map((suffix) => ({
406
+ id: `iana-referral-unverified-${suffix}`,
407
+ suffixes: [suffix],
408
+ registryClass: 'country-code',
409
+ whoisParserProfile: 'generic-colon', fixtureScenarios: [],
410
+ coverageState: 'access_documented', whoisAccessProfile: 'iana-referral',
411
+ rdapAccessProfile: VERSION_23_RDAP_SUFFIXES.includes(suffix)
412
+ ? 'iana-bootstrap'
413
+ : 'no-iana-service',
414
+ verificationFiles: [],
415
+ documentationUrls: [`https://www.iana.org/domains/root/db/${suffix}.html`],
416
+ limitation: VERSION_23_RDAP_SUFFIXES.includes(suffix)
417
+ ? UNVERIFIED_WHOIS_WITH_RDAP_LIMITATION
418
+ : UNVERIFIED_WHOIS_REFERRAL_LIMITATION,
419
+ })),
420
+ {
421
+ id: 'no-iana-machine-service-ba', suffixes: ['ba'], registryClass: 'country-code',
422
+ whoisParserProfile: 'generic-colon', fixtureScenarios: [],
423
+ coverageState: 'access_documented', whoisAccessProfile: 'no-iana-service',
424
+ rdapAccessProfile: 'no-iana-service', verificationFiles: [],
425
+ documentationUrls: ['https://www.iana.org/domains/root/db/ba.html'],
426
+ limitation: NO_IANA_MACHINE_SERVICE_LIMITATION,
427
+ },
428
+ {
429
+ id: 'cctld-by-colon', suffixes: ['by', 'xn--90ais'], registryClass: 'country-code',
430
+ whoisParserProfile: 'cctld-by-colon', fixtureScenarios: ['registered'],
431
+ documentationUrls: [
432
+ 'https://cctld.by/',
433
+ 'https://www.iana.org/domains/root/db/by.html',
434
+ 'https://www.iana.org/domains/root/db/xn--90ais.html',
435
+ ],
436
+ },
437
+ {
438
+ id: 'registry-co-colon', suffixes: ['co'], registryClass: 'country-code',
439
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered'],
440
+ documentationUrls: ['https://www.iana.org/domains/root/db/co.html'],
441
+ },
442
+ {
443
+ id: 'no-iana-machine-service-cy', suffixes: ['cy'], registryClass: 'country-code',
444
+ whoisParserProfile: 'generic-colon', fixtureScenarios: [],
445
+ coverageState: 'access_documented', whoisAccessProfile: 'no-iana-service',
446
+ rdapAccessProfile: 'no-iana-service', verificationFiles: [],
447
+ documentationUrls: ['https://www.iana.org/domains/root/db/cy.html'],
448
+ limitation: NO_IANA_MACHINE_SERVICE_LIMITATION,
449
+ },
450
+ {
451
+ id: 'no-iana-machine-service-gr', suffixes: ['gr', 'xn--qxam'], registryClass: 'country-code',
452
+ whoisParserProfile: 'generic-colon', fixtureScenarios: [],
453
+ coverageState: 'access_documented', whoisAccessProfile: 'no-iana-service',
454
+ rdapAccessProfile: 'no-iana-service', verificationFiles: [],
455
+ documentationUrls: [
456
+ 'https://www.iana.org/domains/root/db/gr.html',
457
+ 'https://www.iana.org/domains/root/db/xn--qxam.html',
458
+ ],
459
+ limitation: NO_IANA_MACHINE_SERVICE_LIMITATION,
460
+ },
461
+ {
462
+ id: 'hkirc-sectioned', suffixes: ['hk', 'xn--j6w193g'], registryClass: 'country-code',
463
+ whoisParserProfile: 'hkirc-sectioned', fixtureScenarios: ['registered', 'not_found'],
464
+ documentationUrls: [
465
+ 'https://www.hkirc.hk/',
466
+ 'https://www.iana.org/domains/root/db/hk.html',
467
+ 'https://www.iana.org/domains/root/db/xn--j6w193g.html',
468
+ ],
469
+ },
470
+ {
471
+ id: 'irnic-handle-blocks', suffixes: ['ir'], registryClass: 'country-code',
472
+ whoisParserProfile: 'irnic-handle-blocks', fixtureScenarios: ['registered'],
473
+ documentationUrls: ['https://www.nic.ir/', 'https://www.iana.org/domains/root/db/ir.html'],
474
+ },
475
+ {
476
+ id: 'kenic-colon', suffixes: ['ke'], registryClass: 'country-code',
477
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered'],
478
+ documentationUrls: ['https://kenic.or.ke/', 'https://www.iana.org/domains/root/db/ke.html'],
479
+ },
480
+ {
481
+ id: 'nic-kz-dot-leader', suffixes: ['kz', 'xn--80ao21a'], registryClass: 'country-code',
482
+ whoisParserProfile: 'nic-kz-dot-leader', fixtureScenarios: ['registered'],
483
+ documentationUrls: [
484
+ 'https://nic.kz/',
485
+ 'https://www.iana.org/domains/root/db/kz.html',
486
+ 'https://www.iana.org/domains/root/db/xn--80ao21a.html',
487
+ ],
488
+ },
489
+ {
490
+ id: 'dns-lu-hyphenated', suffixes: ['lu'], registryClass: 'country-code',
491
+ whoisParserProfile: 'dns-lu-hyphenated', fixtureScenarios: ['registered'],
492
+ documentationUrls: ['https://www.dns.lu/', 'https://www.iana.org/domains/root/db/lu.html'],
493
+ },
494
+ {
495
+ id: 'nic-md-colon', suffixes: ['md'], registryClass: 'country-code',
496
+ whoisParserProfile: 'nic-md-colon', fixtureScenarios: ['registered'],
497
+ documentationUrls: ['https://nic.md/', 'https://www.iana.org/domains/root/db/md.html'],
498
+ },
499
+ {
500
+ id: 'identity-digital-colon-me', suffixes: ['me'], registryClass: 'country-code',
501
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered'],
502
+ documentationUrls: ['https://www.iana.org/domains/root/db/me.html'],
503
+ },
504
+ {
505
+ id: 'identity-digital-colon-mn', suffixes: ['mn', 'xn--l1acc'], registryClass: 'country-code',
506
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered'],
507
+ rdapAccessProfile: 'no-iana-service',
508
+ documentationUrls: [
509
+ 'https://www.iana.org/domains/root/db/mn.html',
510
+ 'https://www.iana.org/domains/root/db/xn--l1acc.html',
511
+ ],
512
+ limitation: SHARED_WHOIS_NO_RDAP_LIMITATION,
513
+ },
514
+ {
515
+ id: 'nic-pk-colon', suffixes: ['pk'], registryClass: 'country-code',
516
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered'],
517
+ documentationUrls: ['https://www.pknic.net.pk/', 'https://www.iana.org/domains/root/db/pk.html'],
518
+ },
519
+ {
520
+ id: 'nic-sa-colon', suffixes: ['sa'], registryClass: 'country-code',
521
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered'],
522
+ documentationUrls: ['https://nic.sa/', 'https://www.iana.org/domains/root/db/sa.html'],
523
+ },
524
+ {
525
+ id: 'thnic-holder-colon', suffixes: ['th', 'xn--o3cw4h'], registryClass: 'country-code',
526
+ whoisParserProfile: 'thnic-holder-colon', fixtureScenarios: ['registered'],
527
+ documentationUrls: [
528
+ 'https://www.thnic.co.th/',
529
+ 'https://www.iana.org/domains/root/db/th.html',
530
+ 'https://www.iana.org/domains/root/db/xn--o3cw4h.html',
531
+ ],
532
+ },
533
+ {
534
+ id: 'ati-tn-dot-leader', suffixes: ['tn'], registryClass: 'country-code',
535
+ whoisParserProfile: 'ati-tn-dot-leader', fixtureScenarios: ['registered'],
536
+ documentationUrls: ['https://www.ati.tn/', 'https://www.iana.org/domains/root/db/tn.html'],
537
+ },
538
+ {
539
+ id: 'nic-io-colon', suffixes: ['io', 'ac'], registryClass: 'country-code',
540
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered'],
541
+ documentationUrls: [
542
+ 'https://www.iana.org/domains/root/db/io.html',
543
+ 'https://www.iana.org/domains/root/db/ac.html',
544
+ ],
545
+ },
546
+ {
547
+ id: 'nic-af-colon', suffixes: ['af'], registryClass: 'country-code',
548
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered'],
549
+ documentationUrls: ['https://nic.af/', 'https://www.iana.org/domains/root/db/af.html'],
550
+ },
551
+ {
552
+ id: 'no-iana-machine-service-ph', suffixes: ['ph'], registryClass: 'country-code',
553
+ whoisParserProfile: 'generic-colon', fixtureScenarios: [],
554
+ coverageState: 'access_documented', whoisAccessProfile: 'no-iana-service',
555
+ rdapAccessProfile: 'no-iana-service', verificationFiles: [],
556
+ documentationUrls: ['https://www.iana.org/domains/root/db/ph.html'],
557
+ limitation: NO_IANA_MACHINE_SERVICE_LIMITATION,
558
+ },
559
+ {
560
+ id: 'no-iana-machine-service-za', suffixes: ['za'], registryClass: 'country-code',
561
+ whoisParserProfile: 'generic-colon', fixtureScenarios: [],
562
+ coverageState: 'access_documented', whoisAccessProfile: 'no-iana-service',
563
+ rdapAccessProfile: 'no-iana-service', verificationFiles: [],
564
+ documentationUrls: ['https://www.iana.org/domains/root/db/za.html'],
565
+ limitation: NO_IANA_MACHINE_SERVICE_LIMITATION,
566
+ },
567
+ {
568
+ id: 'cnnic-colon', suffixes: ['cn', 'xn--fiqs8s', 'xn--fiqz9s'], registryClass: 'country-code',
569
+ whoisParserProfile: 'cnnic-roid-and-lifecycle', fixtureScenarios: ['registered'],
570
+ documentationUrls: [
571
+ 'https://www2.cnnic.cn/2/3/index.html',
572
+ 'https://www.iana.org/domains/root/db/cn.html',
573
+ 'https://www.iana.org/domains/root/db/xn--fiqs8s.html',
574
+ 'https://www.iana.org/domains/root/db/xn--fiqz9s.html',
575
+ ],
576
+ },
577
+ {
578
+ id: 'ustld-colon', suffixes: ['us'], registryClass: 'country-code',
579
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered'],
580
+ documentationUrls: [
581
+ 'https://www.about.us/faqs',
582
+ 'https://www.iana.org/domains/root/db/us.html',
583
+ ],
584
+ },
585
+ {
586
+ id: 'fred-contact-indirection', suffixes: ['cz'], registryClass: 'country-code',
587
+ whoisParserProfile: 'fred-contact-indirection', fixtureScenarios: ['registered', 'not_found'],
588
+ documentationUrls: [
589
+ 'https://www.nic.cz/whois/',
590
+ 'https://www.iana.org/domains/root/db/cz.html',
591
+ ],
592
+ },
593
+ {
594
+ id: 'denic-domain-ace', suffixes: ['de'], registryClass: 'country-code',
595
+ whoisQueryProfile: 'denic-domain-ace', whoisParserProfile: 'alternate-labels',
596
+ fixtureScenarios: ['registered'],
597
+ },
598
+ {
599
+ id: 'punktum-sectioned', suffixes: ['dk'], registryClass: 'country-code',
600
+ whoisParserProfile: 'punktum-domain-dns-and-hostname', fixtureScenarios: ['registered'],
601
+ documentationUrls: [
602
+ 'https://punktum.dk/en/articles/additional-services',
603
+ 'https://www.iana.org/domains/root/db/dk.html',
604
+ ],
605
+ },
606
+ {
607
+ id: 'educause-indented', suffixes: ['edu'], registryClass: 'sponsored',
608
+ whoisParserProfile: 'indented-contact-blocks', fixtureScenarios: ['registered'],
609
+ rdapAccessProfile: 'no-iana-service',
610
+ documentationUrls: ['https://www.iana.org/domains/root/db/edu.html'],
611
+ limitation: WHOIS_ONLY_FIXTURE_LIMITATION,
612
+ },
613
+ {
614
+ id: 'no-iana-machine-service-mil', suffixes: ['mil'], registryClass: 'sponsored',
615
+ whoisParserProfile: 'generic-colon', fixtureScenarios: [],
616
+ coverageState: 'access_documented', whoisAccessProfile: 'no-iana-service',
617
+ rdapAccessProfile: 'no-iana-service', verificationFiles: [],
618
+ documentationUrls: ['https://www.iana.org/domains/root/db/mil.html'],
619
+ limitation: MIL_ACCESS_LIMITATION,
620
+ },
621
+ {
622
+ id: 'iana-infrastructure-arpa', suffixes: ['arpa'], registryClass: 'infrastructure',
623
+ whoisParserProfile: 'generic-colon', fixtureScenarios: [],
624
+ coverageState: 'access_documented', rdapAccessProfile: 'no-iana-service',
625
+ verificationFiles: [],
626
+ documentationUrls: [
627
+ 'https://www.iana.org/domains/root/db/arpa.html',
628
+ 'https://www.iana.org/domains/arpa',
629
+ ],
630
+ limitation: ARPA_ACCESS_LIMITATION,
631
+ },
632
+ {
633
+ id: 'eif-sectioned', suffixes: ['ee'], registryClass: 'country-code',
634
+ whoisParserProfile: 'eif-sectioned', fixtureScenarios: ['registered', 'not_found'],
635
+ documentationUrls: [
636
+ 'https://www.internet.ee/domains/whois-terms-and-conditions',
637
+ 'https://www.internet.ee/registrar-portal/help-and-info/eif-s-information-systems-and-technical-conditions',
638
+ 'https://www.iana.org/domains/root/db/ee.html',
639
+ ],
640
+ },
641
+ {
642
+ id: 'source-ip-authorized-whois', suffixes: ['es'], registryClass: 'country-code',
643
+ whoisParserProfile: 'generic-colon', fixtureScenarios: [],
644
+ coverageState: 'access_documented', whoisAccessProfile: 'source-ip-authorization-required',
645
+ rdapAccessProfile: 'no-iana-service', verificationFiles: [],
646
+ documentationUrls: [
647
+ 'https://www.iana.org/domains/root/db/es.html',
648
+ 'https://www.dominios.es/es/sobre-dominios/valores-anadidos/whois-43',
649
+ ],
650
+ limitation: ES_ACCESS_LIMITATION,
651
+ },
652
+ {
653
+ id: 'eurid-sectioned', suffixes: ['eu', 'xn--e1a4c', 'xn--qxa6a'], registryClass: 'country-code',
654
+ whoisParserProfile: 'sectioned-registrar-and-nameservers', fixtureScenarios: ['registered', 'not_found', 'malformed'],
655
+ documentationUrls: [
656
+ 'https://eurid.eu/en/knowledge-centre/rules-for-eu-domains/',
657
+ 'https://eurid.eu/d/22380/whois_policy_en.pdf',
658
+ 'https://www.iana.org/domains/root/db/eu.html',
659
+ 'https://www.iana.org/domains/root/db/xn--e1a4c.html',
660
+ 'https://www.iana.org/domains/root/db/xn--qxa6a.html',
661
+ ],
662
+ },
663
+ {
664
+ id: 'gt-registry-web', suffixes: ['gt'], registryClass: 'country-code',
665
+ whoisParserProfile: 'generic-colon', fallbackProfile: 'gt-registry-web',
666
+ fixtureScenarios: ['registered', 'not_found', 'unavailable'],
667
+ verificationFiles: ['test/whois-gt-fallback.test.mts'],
668
+ },
669
+ {
670
+ id: 'carnet-icann-colon', suffixes: ['hr'], registryClass: 'country-code',
671
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered', 'not_found'],
672
+ documentationUrls: [
673
+ 'https://domene.hr/en/portal/home',
674
+ 'https://www.iana.org/domains/root/db/hr.html',
675
+ ],
676
+ },
677
+ {
678
+ id: 'iszt-minimal-colon', suffixes: ['hu'], registryClass: 'country-code',
679
+ whoisParserProfile: 'iszt-minimal-colon', fixtureScenarios: ['registered'],
680
+ documentationUrls: [
681
+ 'https://www.domain.hu/domain-search/',
682
+ 'https://www.iana.org/domains/root/db/hu.html',
683
+ ],
684
+ },
685
+ {
686
+ id: 'weare-ie-colon', suffixes: ['ie'], registryClass: 'country-code',
687
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered', 'not_found'],
688
+ documentationUrls: [
689
+ 'https://www.weare.ie/wp-content/uploads/2023/12/WHOIS-Services-Policy-2023.pdf',
690
+ 'https://www.iana.org/domains/root/db/ie.html',
691
+ ],
692
+ },
693
+ {
694
+ id: 'nixi-colon', suffixes: ['in'], registryClass: 'country-code',
695
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered'],
696
+ documentationUrls: [
697
+ 'https://www.registry.in/policies',
698
+ 'https://www.iana.org/domains/root/db/in.html',
699
+ ],
700
+ },
701
+ {
702
+ id: 'nixi-idn-colon', suffixes: [
703
+ 'xn--2scrj9c',
704
+ 'xn--3hcrj9c',
705
+ 'xn--45br5cyl',
706
+ 'xn--45brj9c',
707
+ 'xn--fpcrj9c3d',
708
+ 'xn--gecrj9c',
709
+ 'xn--h2breg3eve',
710
+ 'xn--h2brj9c',
711
+ 'xn--h2brj9c8c',
712
+ 'xn--rvc1e0am3e',
713
+ 'xn--s9brj9c',
714
+ 'xn--xkc2dl3a5ee0h',
715
+ ], registryClass: 'country-code',
716
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered'],
717
+ documentationUrls: [
718
+ 'https://www.registry.in/policies',
719
+ 'https://www.iana.org/domains/root/db/xn--2scrj9c.html',
720
+ 'https://www.iana.org/domains/root/db/xn--3hcrj9c.html',
721
+ 'https://www.iana.org/domains/root/db/xn--45br5cyl.html',
722
+ 'https://www.iana.org/domains/root/db/xn--45brj9c.html',
723
+ 'https://www.iana.org/domains/root/db/xn--fpcrj9c3d.html',
724
+ 'https://www.iana.org/domains/root/db/xn--gecrj9c.html',
725
+ 'https://www.iana.org/domains/root/db/xn--h2breg3eve.html',
726
+ 'https://www.iana.org/domains/root/db/xn--h2brj9c.html',
727
+ 'https://www.iana.org/domains/root/db/xn--h2brj9c8c.html',
728
+ 'https://www.iana.org/domains/root/db/xn--rvc1e0am3e.html',
729
+ 'https://www.iana.org/domains/root/db/xn--s9brj9c.html',
730
+ 'https://www.iana.org/domains/root/db/xn--xkc2dl3a5ee0h.html',
731
+ ],
732
+ limitation: SHARED_WHOIS_NO_RDAP_LIMITATION,
733
+ },
734
+ {
735
+ id: 'pandi-colon', suffixes: ['id'], registryClass: 'country-code',
736
+ whoisParserProfile: 'pandi-domain-id-and-sponsor', fixtureScenarios: ['registered'],
737
+ documentationUrls: [
738
+ 'https://pandi.id/public/files/2024/9/kebijakan-umum-nama-domain-versi-7-0-bilingual-1727681641.pdf',
739
+ 'https://www.iana.org/domains/root/db/id.html',
740
+ ],
741
+ },
742
+ {
743
+ id: 'isoc-il-colon', suffixes: ['il'], registryClass: 'country-code',
744
+ whoisParserProfile: 'isoc-validity-and-multiword-status', fixtureScenarios: ['registered'],
745
+ documentationUrls: [
746
+ 'https://en.isoc.org.il/whois',
747
+ 'https://www.iana.org/domains/root/db/il.html',
748
+ ],
749
+ },
750
+ {
751
+ id: 'isnic-handle-blocks', suffixes: ['is'], registryClass: 'country-code',
752
+ whoisParserProfile: 'isnic-handle-blocks', fixtureScenarios: ['registered', 'not_found'],
753
+ documentationUrls: [
754
+ 'https://www.isnic.is/en/about/copyright',
755
+ 'https://www.iana.org/domains/root/db/is.html',
756
+ ],
757
+ },
758
+ {
759
+ id: 'alternate-labels', suffixes: ['it'], registryClass: 'country-code',
760
+ whoisParserProfile: 'alternate-labels-and-bare-nameservers', fixtureScenarios: ['registered'],
761
+ },
762
+ {
763
+ id: 'bracketed-bilingual', suffixes: ['jp'], registryClass: 'country-code',
764
+ whoisQueryProfile: 'jprs-domain-english', whoisParserProfile: 'bracketed-bilingual',
765
+ fixtureScenarios: ['registered'],
766
+ },
767
+ {
768
+ id: 'fi-dot-leader', suffixes: ['fi'], registryClass: 'country-code',
769
+ whoisParserProfile: 'dot-leader', fixtureScenarios: ['registered', 'not_found'],
770
+ documentationUrls: [
771
+ 'https://www.traficom.fi/en/fi-domains/point-contact-and-contact-channels/whois-shows-public-information-domain-name',
772
+ 'https://www.iana.org/domains/root/db/fi.html',
773
+ ],
774
+ },
775
+ {
776
+ id: 'dot-leader', suffixes: ['kr', 'xn--3e0b707e'], registryClass: 'country-code',
777
+ whoisParserProfile: 'dot-leader', fixtureScenarios: ['registered'],
778
+ documentationUrls: [
779
+ 'https://www.iana.org/domains/root/db/kr.html',
780
+ 'https://www.iana.org/domains/root/db/xn--3e0b707e.html',
781
+ ],
782
+ },
783
+ {
784
+ id: 'domreg-lt-colon', suffixes: ['lt'], registryClass: 'country-code',
785
+ whoisParserProfile: 'domreg-lt-colon', fixtureScenarios: ['registered'],
786
+ documentationUrls: [
787
+ 'https://www.domreg.lt/en/faq/for-domain-registrants/how-to-access-public-information-on-domains/',
788
+ 'https://www.iana.org/domains/root/db/lt.html',
789
+ ],
790
+ },
791
+ {
792
+ id: 'nic-lv-sectioned', suffixes: ['lv'], registryClass: 'country-code',
793
+ whoisParserProfile: 'nic-lv-sectioned', fixtureScenarios: ['registered', 'not_found'],
794
+ documentationUrls: [
795
+ 'https://www.nic.lv/whois?lang=en',
796
+ 'https://www.iana.org/domains/root/db/lv.html',
797
+ ],
798
+ },
799
+ {
800
+ id: 'registry-mx-colon', suffixes: ['mx'], registryClass: 'country-code',
801
+ whoisParserProfile: 'contact-blocks-and-colon', fixtureScenarios: ['registered'],
802
+ documentationUrls: [
803
+ 'https://www.dominios.mx/whois/',
804
+ 'https://www.iana.org/domains/root/db/mx.html',
805
+ ],
806
+ },
807
+ {
808
+ id: 'mynic-colon', suffixes: ['my'], registryClass: 'country-code',
809
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered'],
810
+ documentationUrls: [
811
+ 'https://mynic.my/WHOIS',
812
+ 'https://www.iana.org/domains/root/db/my.html',
813
+ ],
814
+ limitation: MY_ACCESS_LIMITATION,
815
+ },
816
+ {
817
+ id: 'norid-dot-leader', suffixes: ['no'], registryClass: 'country-code',
818
+ whoisParserProfile: 'norid-handle-dot-leader', fixtureScenarios: ['registered', 'not_found'],
819
+ documentationUrls: [
820
+ 'https://teknisk.norid.no/uploads/2018/08/Whois_DAS_Interface_Specification.10e1.pdf',
821
+ 'https://www.norid.no/en/domeneoppslag/',
822
+ 'https://www.iana.org/domains/root/db/no.html',
823
+ ],
824
+ },
825
+ {
826
+ id: 'norid-closed-no-iana-service', suffixes: ['bv', 'sj'], registryClass: 'country-code',
827
+ whoisParserProfile: 'generic-colon', fixtureScenarios: [],
828
+ coverageState: 'access_documented', whoisAccessProfile: 'no-iana-service',
829
+ rdapAccessProfile: 'no-iana-service', verificationFiles: [],
830
+ documentationUrls: [
831
+ 'https://www.norid.no/en/omnorid/',
832
+ 'https://www.norid.no/en/omnorid/toppdomenet-bv/',
833
+ 'https://www.iana.org/domains/root/db/bv.html',
834
+ 'https://www.iana.org/domains/root/db/sj.html',
835
+ ],
836
+ limitation: NORID_CLOSED_SUFFIX_LIMITATION,
837
+ },
838
+ {
839
+ id: 'sidn-sectioned', suffixes: ['nl'], registryClass: 'country-code',
840
+ whoisParserProfile: 'sidn-sectioned', fixtureScenarios: ['registered', 'not_found'],
841
+ documentationUrls: [
842
+ 'https://www.sidn.nl/en/nl-domain-name/looking-up-a-domain-name',
843
+ 'https://www.iana.org/domains/root/db/nl.html',
844
+ ],
845
+ },
846
+ {
847
+ id: 'afnic-colon', suffixes: ['fr', 'pm', 're', 'tf', 'wf', 'yt'], registryClass: 'country-code',
848
+ whoisParserProfile: 'afnic-colon', fixtureScenarios: ['registered', 'not_found'],
849
+ documentationUrls: [
850
+ 'https://www.afnic.fr/en/domain-names-and-support/everything-there-is-to-know-about-domain-names/find-a-domain-name-or-a-holder-using-whois/',
851
+ 'https://www.iana.org/domains/root/db/fr.html',
852
+ 'https://www.iana.org/domains/root/db/pm.html',
853
+ 'https://www.iana.org/domains/root/db/re.html',
854
+ 'https://www.iana.org/domains/root/db/tf.html',
855
+ 'https://www.iana.org/domains/root/db/wf.html',
856
+ 'https://www.iana.org/domains/root/db/yt.html',
857
+ ],
858
+ },
859
+ {
860
+ id: 'structured-underscore', suffixes: ['nz'], registryClass: 'country-code',
861
+ whoisParserProfile: 'structured-underscore',
862
+ fixtureScenarios: ['registered', 'not_found', 'rate_limited', 'restricted'],
863
+ documentationUrls: [
864
+ 'https://docs.internetnz.nz/whois/',
865
+ 'https://www.iana.org/domains/root/db/nz.html',
866
+ ],
867
+ },
868
+ {
869
+ id: 'nask-sectioned', suffixes: ['pl'], registryClass: 'country-code',
870
+ whoisParserProfile: 'nask-sectioned', fixtureScenarios: ['registered', 'malformed'],
871
+ documentationUrls: [
872
+ 'https://www.dns.pl/en/whois',
873
+ 'https://www.iana.org/domains/root/db/pl.html',
874
+ ],
875
+ },
876
+ {
877
+ id: 'dns-pt-colon', suffixes: ['pt'], registryClass: 'country-code',
878
+ whoisParserProfile: 'dns-pt-colon', fixtureScenarios: ['registered'],
879
+ documentationUrls: [
880
+ 'https://www.dns.pt/fotos/editor2/pt_registration_rules_apos_consulta.pdf',
881
+ 'https://www.iana.org/domains/root/db/pt.html',
882
+ ],
883
+ },
884
+ {
885
+ id: 'rotld-colon', suffixes: ['ro'], registryClass: 'country-code',
886
+ whoisParserProfile: 'rotld-colon', fixtureScenarios: ['registered'],
887
+ documentationUrls: [
888
+ 'https://www.rotld.ro/reguli-de-inregistrare/',
889
+ 'https://www.iana.org/domains/root/db/ro.html',
890
+ ],
891
+ },
892
+ {
893
+ id: 'rnids-colon', suffixes: ['rs', 'xn--90a3ac'], registryClass: 'country-code',
894
+ whoisParserProfile: 'rnids-colon', fixtureScenarios: ['registered', 'not_found'],
895
+ documentationUrls: [
896
+ 'https://www.rnids.rs/en/domain-names',
897
+ 'https://www.iana.org/domains/root/db/rs.html',
898
+ 'https://www.iana.org/domains/root/db/xn--90a3ac.html',
899
+ ],
900
+ },
901
+ {
902
+ id: 'tci-colon', suffixes: ['ru', 'su', 'xn--p1ai'], registryClass: 'country-code',
903
+ whoisParserProfile: 'tci-colon', fixtureScenarios: ['registered', 'not_found'],
904
+ documentationUrls: [
905
+ 'https://cctld.ru/en/service/whois/',
906
+ 'https://www.iana.org/domains/root/db/ru.html',
907
+ 'https://www.iana.org/domains/root/db/su.html',
908
+ 'https://www.iana.org/domains/root/db/xn--p1ai.html',
909
+ ],
910
+ },
911
+ {
912
+ id: 'internetstiftelsen-colon', suffixes: ['se'], registryClass: 'country-code',
913
+ whoisParserProfile: 'internetstiftelsen-colon', fixtureScenarios: ['registered', 'not_found'],
914
+ documentationUrls: [
915
+ 'https://internetstiftelsen.se/domaner/registrera-ett-domannamn/regler-och-beskrivning-av-domannamnssokningar/',
916
+ 'https://www.iana.org/domains/root/db/se.html',
917
+ ],
918
+ },
919
+ {
920
+ id: 'sgnic-colon', suffixes: ['sg', 'xn--clchc0ea0b2g2a9gcd', 'xn--yfro4i67o'], registryClass: 'country-code',
921
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered'],
922
+ documentationUrls: [
923
+ 'https://www.sgnic.sg/docs/default-source/policies-and-agreements/whois-policy.pdf',
924
+ 'https://www.sgnic.sg/faq/being-a-registrar',
925
+ 'https://www.iana.org/domains/root/db/sg.html',
926
+ 'https://www.iana.org/domains/root/db/xn--clchc0ea0b2g2a9gcd.html',
927
+ 'https://www.iana.org/domains/root/db/xn--yfro4i67o.html',
928
+ ],
929
+ },
930
+ {
931
+ id: 'register-si-colon', suffixes: ['si'], registryClass: 'country-code',
932
+ whoisParserProfile: 'register-si-colon', fixtureScenarios: ['registered', 'not_found'],
933
+ documentationUrls: [
934
+ 'https://www.register.si/en/disclosure-of-information-about-a-si-domain-holder/',
935
+ 'https://www.iana.org/domains/root/db/si.html',
936
+ ],
937
+ },
938
+ {
939
+ id: 'sk-nic-colon', suffixes: ['sk'], registryClass: 'country-code',
940
+ whoisParserProfile: 'sk-nic-colon', fixtureScenarios: ['registered', 'not_found'],
941
+ documentationUrls: [
942
+ 'https://sk-nic.sk/en/faq-en/general/',
943
+ 'https://www.iana.org/domains/root/db/sk.html',
944
+ ],
945
+ },
946
+ {
947
+ id: 'prefixed-dot-leader', suffixes: ['tr'], registryClass: 'country-code',
948
+ whoisParserProfile: 'prefixed-dot-leader-and-bare-nameservers', fixtureScenarios: ['registered'],
949
+ },
950
+ {
951
+ id: 'twnic-colon', suffixes: ['tw', 'xn--kpry57d'], registryClass: 'country-code',
952
+ whoisParserProfile: 'twnic-record-dates-and-provider', fixtureScenarios: ['registered'],
953
+ documentationUrls: [
954
+ 'https://www.twnic.tw/dnservice/policy/?lang=en',
955
+ 'https://www.iana.org/domains/root/db/tw.html',
956
+ 'https://www.iana.org/domains/root/db/xn--kpry57d.html',
957
+ ],
958
+ },
959
+ {
960
+ id: 'twnic-no-rdap-colon', suffixes: ['xn--kprw13d'], registryClass: 'country-code',
961
+ whoisParserProfile: 'twnic-record-dates-and-provider', fixtureScenarios: ['registered'],
962
+ documentationUrls: [
963
+ 'https://www.twnic.tw/dnservice/policy/?lang=en',
964
+ 'https://www.iana.org/domains/root/db/xn--kprw13d.html',
965
+ ],
966
+ limitation: SHARED_WHOIS_NO_RDAP_LIMITATION,
967
+ },
968
+ {
969
+ id: 'hostmaster-ua-colon', suffixes: ['ua'], registryClass: 'country-code',
970
+ whoisParserProfile: 'hostmaster-ua-colon', fixtureScenarios: ['registered'],
971
+ documentationUrls: [
972
+ 'https://www.hostmaster.ua/policy/Reglament_UA_1.0_EN.pdf',
973
+ 'https://www.iana.org/domains/root/db/ua.html',
974
+ ],
975
+ },
976
+ {
977
+ id: 'sectioned-registry-response', suffixes: ['uk'], registryClass: 'country-code',
978
+ whoisParserProfile: 'indented-section-values-and-bare-nameservers',
979
+ fixtureScenarios: ['registered', 'not_found', 'malformed'],
980
+ documentationUrls: [
981
+ 'https://registrars.nominet.uk/uk-namespace/registration-and-domain-management/query-tools/whois/',
982
+ 'https://registrars.nominet.uk/uk-namespace/registration-and-domain-management/query-tools/whois/whois-basic-instructions/',
983
+ 'https://registrars.nominet.uk/uk-namespace/registration-and-domain-management/query-tools/whois/whois-detailed-instructions/',
984
+ 'https://registrars.nominet.uk/uk-namespace/registration-and-domain-management/acceptable-use-policy/',
985
+ ],
986
+ limitation: UK_TRANSITION_LIMITATION,
987
+ },
988
+ {
989
+ id: 'identity-digital-shared-colon', suffixes: ['gi', 'vc'], registryClass: 'country-code',
990
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered', 'not_found'],
991
+ documentationUrls: [
992
+ 'https://www.iana.org/domains/root/db/gi.html',
993
+ 'https://www.iana.org/domains/root/db/vc.html',
994
+ ],
995
+ },
996
+ {
997
+ id: 'mediaserv-object-colon', suffixes: ['gf', 'mq'], registryClass: 'country-code',
998
+ whoisParserProfile: 'mediaserv-object-colon', fixtureScenarios: ['registered', 'not_found'],
999
+ documentationUrls: [
1000
+ 'https://www.iana.org/domains/root/db/gf.html',
1001
+ 'https://www.iana.org/domains/root/db/mq.html',
1002
+ ],
1003
+ },
1004
+ {
1005
+ id: 'marnet-contact-indirection', suffixes: ['mk', 'xn--d1alf'], registryClass: 'country-code',
1006
+ whoisParserProfile: 'fred-contact-indirection', fixtureScenarios: ['registered', 'not_found'],
1007
+ documentationUrls: [
1008
+ 'https://www.iana.org/domains/root/db/mk.html',
1009
+ 'https://www.iana.org/domains/root/db/xn--d1alf.html',
1010
+ ],
1011
+ },
1012
+ {
1013
+ id: 'monic-minimal-colon', suffixes: ['mo', 'xn--mix891f'], registryClass: 'country-code',
1014
+ whoisParserProfile: 'monic-minimal-colon', fixtureScenarios: ['registered', 'not_found'],
1015
+ documentationUrls: [
1016
+ 'https://www.iana.org/domains/root/db/mo.html',
1017
+ 'https://www.iana.org/domains/root/db/xn--mix891f.html',
1018
+ ],
1019
+ },
1020
+ {
1021
+ id: 'lanic-icann-colon', suffixes: ['la', 'xn--q7ce6a'], registryClass: 'country-code',
1022
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered', 'not_found'],
1023
+ documentationUrls: [
1024
+ 'https://www.iana.org/domains/root/db/la.html',
1025
+ 'https://www.iana.org/domains/root/db/xn--q7ce6a.html',
1026
+ ],
1027
+ },
1028
+ {
1029
+ id: 'andorra-rdds-colon', suffixes: ['ad'], registryClass: 'country-code',
1030
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered', 'not_found'],
1031
+ documentationUrls: ['https://www.iana.org/domains/root/db/ad.html'],
1032
+ },
1033
+ {
1034
+ id: 'nic-bh-icann-colon', suffixes: ['bh'], registryClass: 'country-code',
1035
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered', 'not_found'],
1036
+ rdapAccessProfile: 'no-iana-service',
1037
+ documentationUrls: ['https://www.iana.org/domains/root/db/bh.html'],
1038
+ },
1039
+ {
1040
+ id: 'cc-registry-colon', suffixes: ['cc'], registryClass: 'country-code',
1041
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered', 'not_found'],
1042
+ documentationUrls: ['https://www.iana.org/domains/root/db/cc.html'],
1043
+ },
1044
+ {
1045
+ id: 'nic-cr-contact-indirection', suffixes: ['cr'], registryClass: 'country-code',
1046
+ whoisParserProfile: 'fred-contact-indirection', fixtureScenarios: ['registered', 'not_found'],
1047
+ documentationUrls: ['https://www.iana.org/domains/root/db/cr.html'],
1048
+ },
1049
+ {
1050
+ id: 'nic-dz-colon', suffixes: ['dz'], registryClass: 'country-code',
1051
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered', 'not_found'],
1052
+ rdapAccessProfile: 'no-iana-service',
1053
+ documentationUrls: ['https://www.iana.org/domains/root/db/dz.html'],
1054
+ },
1055
+ {
1056
+ id: 'channel-islands-sectioned', suffixes: ['gg', 'je'], registryClass: 'country-code',
1057
+ whoisParserProfile: 'indented-section-values-and-bare-nameservers',
1058
+ fixtureScenarios: ['registered', 'not_found'], rdapAccessProfile: 'no-iana-service',
1059
+ documentationUrls: [
1060
+ 'https://www.iana.org/domains/root/db/gg.html',
1061
+ 'https://www.iana.org/domains/root/db/je.html',
1062
+ ],
1063
+ },
1064
+ {
1065
+ id: 'nic-gl-colon', suffixes: ['gl'], registryClass: 'country-code',
1066
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered', 'not_found'],
1067
+ rdapAccessProfile: 'no-iana-service',
1068
+ documentationUrls: ['https://www.iana.org/domains/root/db/gl.html'],
1069
+ },
1070
+ {
1071
+ id: 'lsnic-contact-indirection', suffixes: ['ls'], registryClass: 'country-code',
1072
+ whoisParserProfile: 'fred-contact-indirection', fixtureScenarios: ['registered', 'not_found'],
1073
+ rdapAccessProfile: 'no-iana-service',
1074
+ documentationUrls: ['https://www.iana.org/domains/root/db/ls.html'],
1075
+ },
1076
+ {
1077
+ id: 'nic-mc-colon', suffixes: ['mc'], registryClass: 'country-code',
1078
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered', 'not_found'],
1079
+ rdapAccessProfile: 'no-iana-service',
1080
+ documentationUrls: ['https://www.iana.org/domains/root/db/mc.html'],
1081
+ },
1082
+ {
1083
+ id: 'mm-registry-colon', suffixes: ['mm'], registryClass: 'country-code',
1084
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered', 'not_found'],
1085
+ rdapAccessProfile: 'no-iana-service',
1086
+ documentationUrls: ['https://www.iana.org/domains/root/db/mm.html'],
1087
+ },
1088
+ {
1089
+ id: 'aeda-idn-colon', suffixes: ['xn--mgbaam7a8h'], registryClass: 'country-code',
1090
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered'],
1091
+ rdapAccessProfile: 'no-iana-service',
1092
+ documentationUrls: ['https://www.iana.org/domains/root/db/xn--mgbaam7a8h.html'],
1093
+ limitation: SHARED_WHOIS_NO_RDAP_LIMITATION,
1094
+ },
1095
+ {
1096
+ id: 'ati-tn-idn-dot-leader', suffixes: ['xn--pgbs0dh'], registryClass: 'country-code',
1097
+ whoisParserProfile: 'ati-tn-dot-leader', fixtureScenarios: ['registered'],
1098
+ rdapAccessProfile: 'no-iana-service',
1099
+ documentationUrls: ['https://www.iana.org/domains/root/db/xn--pgbs0dh.html'],
1100
+ limitation: SHARED_WHOIS_NO_RDAP_LIMITATION,
1101
+ },
1102
+ {
1103
+ id: 'isoc-il-idn-colon', suffixes: ['xn--4dbrk0ce'], registryClass: 'country-code',
1104
+ whoisParserProfile: 'isoc-validity-and-multiword-status', fixtureScenarios: ['registered'],
1105
+ rdapAccessProfile: 'no-iana-service',
1106
+ documentationUrls: ['https://www.iana.org/domains/root/db/xn--4dbrk0ce.html'],
1107
+ limitation: SHARED_WHOIS_NO_RDAP_LIMITATION,
1108
+ },
1109
+ {
1110
+ id: 'mynic-idn-colon', suffixes: ['xn--mgbx4cd0ab'], registryClass: 'country-code',
1111
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered'],
1112
+ rdapAccessProfile: 'no-iana-service',
1113
+ documentationUrls: ['https://www.iana.org/domains/root/db/xn--mgbx4cd0ab.html'],
1114
+ limitation: `${MY_ACCESS_LIMITATION} ${SHARED_WHOIS_NO_RDAP_LIMITATION}`,
1115
+ },
1116
+ {
1117
+ id: 'nic-dz-idn-colon', suffixes: ['xn--lgbbat1ad8j'], registryClass: 'country-code',
1118
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered', 'not_found'],
1119
+ rdapAccessProfile: 'no-iana-service',
1120
+ documentationUrls: ['https://www.iana.org/domains/root/db/xn--lgbbat1ad8j.html'],
1121
+ limitation: SHARED_WHOIS_NO_RDAP_LIMITATION,
1122
+ },
1123
+ {
1124
+ id: 'irnic-idn-handle-blocks', suffixes: ['xn--mgba3a4f16a'], registryClass: 'country-code',
1125
+ whoisParserProfile: 'irnic-handle-blocks', fixtureScenarios: ['registered'],
1126
+ rdapAccessProfile: 'no-iana-service',
1127
+ documentationUrls: ['https://www.iana.org/domains/root/db/xn--mgba3a4f16a.html'],
1128
+ limitation: SHARED_WHOIS_NO_RDAP_LIMITATION,
1129
+ },
1130
+ {
1131
+ id: 'nic-sa-idn-colon', suffixes: ['xn--mgberp4a5d4ar'], registryClass: 'country-code',
1132
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered'],
1133
+ rdapAccessProfile: 'no-iana-service',
1134
+ documentationUrls: ['https://www.iana.org/domains/root/db/xn--mgberp4a5d4ar.html'],
1135
+ limitation: SHARED_WHOIS_NO_RDAP_LIMITATION,
1136
+ },
1137
+ {
1138
+ id: 'nixi-arabic-colon',
1139
+ suffixes: ['xn--mgbbh1a', 'xn--mgbbh1a71e', 'xn--mgbgu82a'],
1140
+ registryClass: 'country-code', whoisParserProfile: 'icann-style-colon',
1141
+ fixtureScenarios: ['registered'], rdapAccessProfile: 'no-iana-service',
1142
+ documentationUrls: [
1143
+ 'https://www.iana.org/domains/root/db/xn--mgbbh1a.html',
1144
+ 'https://www.iana.org/domains/root/db/xn--mgbbh1a71e.html',
1145
+ 'https://www.iana.org/domains/root/db/xn--mgbgu82a.html',
1146
+ ],
1147
+ limitation: SHARED_WHOIS_NO_RDAP_LIMITATION,
1148
+ },
1149
+ {
1150
+ id: 'om-registry-colon', suffixes: ['om', 'xn--mgb9awbf'], registryClass: 'country-code',
1151
+ whoisParserProfile: 'icann-style-colon', fixtureScenarios: ['registered', 'not_found'],
1152
+ rdapAccessProfile: 'no-iana-service',
1153
+ documentationUrls: [
1154
+ 'https://www.iana.org/domains/root/db/om.html',
1155
+ 'https://www.iana.org/domains/root/db/xn--mgb9awbf.html',
1156
+ ],
1157
+ },
1158
+ {
1159
+ id: 'no-iana-registry-service', suffixes: ['vn'], registryClass: 'country-code',
1160
+ whoisParserProfile: 'generic-colon', fixtureScenarios: [],
1161
+ coverageState: 'access_documented', whoisAccessProfile: 'no-iana-service',
1162
+ rdapAccessProfile: 'no-iana-service', verificationFiles: [],
1163
+ documentationUrls: [
1164
+ 'https://www.iana.org/domains/root/db/vn.html',
1165
+ 'https://whois.vnnic.vn/',
1166
+ ],
1167
+ limitation: VN_ACCESS_LIMITATION,
1168
+ },
1169
+ ];
1170
+ function resolvedSeedRdapAccessProfile(entry) {
1171
+ const declared = entry.rdapAccessProfile || 'iana-bootstrap';
1172
+ const resolved = new Set(entry.suffixes.map((suffix) => (VERSION_26_NO_RDAP_SUFFIX_SET.has(suffix) ? 'no-iana-service' : declared)));
1173
+ if (resolved.size !== 1) {
1174
+ throw new Error(`Registry capability ${entry.id} mixes RDAP access profiles and must be split by suffix.`);
1175
+ }
1176
+ return [...resolved][0];
1177
+ }
1178
+ const EXPLICIT_CAPABILITIES = EXPLICIT_CAPABILITY_SEEDS.map((entry) => {
1179
+ const rdapAccessProfile = resolvedSeedRdapAccessProfile(entry);
1180
+ return freezeCapability({
1181
+ ...entry,
1182
+ fallbackProfile: entry.fallbackProfile || null,
1183
+ rdapDiscovery: 'iana-bootstrap',
1184
+ whoisDiscovery: 'iana-referral',
1185
+ whoisQueryProfile: entry.whoisQueryProfile || 'plain-domain',
1186
+ whoisQueryScope: 'first-referral',
1187
+ whoisEncodingProfile: 'utf-8',
1188
+ whoisAccessProfile: entry.whoisAccessProfile || 'iana-referral',
1189
+ rdapAccessProfile,
1190
+ coverageState: entry.coverageState || 'fixture_verified',
1191
+ verificationFiles: entry.verificationFiles || ['fixtures/whois-registry-fixtures.mts'],
1192
+ documentationUrls: entry.documentationUrls || [],
1193
+ limitation: entry.limitation || (rdapAccessProfile === 'no-iana-service'
1194
+ ? WHOIS_ONLY_FIXTURE_LIMITATION
1195
+ : FIXTURE_LIMITATION),
1196
+ });
1197
+ });
1198
+ const CAPABILITY_BY_SUFFIX = new Map();
1199
+ for (const capability of EXPLICIT_CAPABILITIES) {
1200
+ for (const suffix of capability.suffixes) {
1201
+ if (CAPABILITY_BY_SUFFIX.has(suffix))
1202
+ throw new Error(`Duplicate registry capability suffix: ${suffix}`);
1203
+ CAPABILITY_BY_SUFFIX.set(suffix, capability);
1204
+ }
1205
+ }
1206
+ export { REGISTRY_CAPABILITIES_VERSION, MAX_CAPABILITY_INPUT_LENGTH, VERSION_26_NO_RDAP_SUFFIXES, VERSION_27_RDAP_ONLY_GENERIC_SUFFIXES, REGISTRY_STANDARDS_COVERAGE_SNAPSHOT, DEFAULT_CAPABILITY, EXPLICIT_CAPABILITIES, CAPABILITY_BY_SUFFIX, };