parse-domain 8.3.1 → 8.3.2

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 (44) hide show
  1. package/README.md +1 -3
  2. package/dist/bin/update.js.map +1 -1
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js.map +1 -1
  5. package/dist/from-url.d.ts.map +1 -1
  6. package/dist/from-url.js +2 -4
  7. package/dist/from-url.js.map +1 -1
  8. package/dist/parse-domain.d.ts +14 -26
  9. package/dist/parse-domain.d.ts.map +1 -1
  10. package/dist/parse-domain.js +8 -16
  11. package/dist/parse-domain.js.map +1 -1
  12. package/dist/psl/build-tries.d.ts +3 -2
  13. package/dist/psl/build-tries.d.ts.map +1 -1
  14. package/dist/psl/build-tries.js +3 -3
  15. package/dist/psl/build-tries.js.map +1 -1
  16. package/dist/psl/fetch-psl.d.ts.map +1 -1
  17. package/dist/psl/fetch-psl.js.map +1 -1
  18. package/dist/punycode.d.ts.map +1 -1
  19. package/dist/punycode.js.map +1 -1
  20. package/dist/sanitize.d.ts +3 -5
  21. package/dist/sanitize.d.ts.map +1 -1
  22. package/dist/sanitize.js +3 -5
  23. package/dist/sanitize.js.map +1 -1
  24. package/dist/scripts/update-psl-fixture.js.map +1 -1
  25. package/dist/scripts/update-tries.js.map +1 -1
  26. package/dist/smoke-test.d.ts.map +1 -1
  27. package/dist/smoke-test.js.map +1 -1
  28. package/dist/trie/create-trie.d.ts +2 -1
  29. package/dist/trie/create-trie.d.ts.map +1 -1
  30. package/dist/trie/create-trie.js.map +1 -1
  31. package/dist/trie/look-up.d.ts +1 -1
  32. package/dist/trie/look-up.d.ts.map +1 -1
  33. package/dist/trie/look-up.js.map +1 -1
  34. package/dist/trie/nodes.d.ts.map +1 -1
  35. package/dist/trie/nodes.js.map +1 -1
  36. package/dist/trie/parse-trie.d.ts +2 -1
  37. package/dist/trie/parse-trie.d.ts.map +1 -1
  38. package/dist/trie/parse-trie.js.map +1 -1
  39. package/dist/update-tries.d.ts.map +1 -1
  40. package/dist/update-tries.js.map +1 -1
  41. package/package.json +37 -31
  42. package/serialized-tries/icann.js +1 -1
  43. package/serialized-tries/info.json +1 -1
  44. package/serialized-tries/private.js +1 -1
package/README.md CHANGED
@@ -235,9 +235,7 @@ switch (parseResult.type) {
235
235
  What's surprising to a lot of people is that the definition of public suffix means that regular user domains can become effective top-level domains:
236
236
 
237
237
  ```javascript
238
- const { subDomains, domain, topLevelDomains } = parseDomain(
239
- "parse-domain.github.io",
240
- );
238
+ const { subDomains, domain, topLevelDomains } = parseDomain("parse-domain.github.io");
241
239
 
242
240
  console.log(subDomains); // []
243
241
  console.log(domain); // "parse-domain"
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/bin/update.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CACrC,MAAM,CAAC,IAAI,CAAC,OAAO,EACnB,wBAAwB,CACzB,CAAC;AAEF,MAAM,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,GAClD,MAAM,wBAAwB,EAAE,CAAC;AAEnC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAEjE,MAAM,OAAO,CAAC,GAAG,CAAC;IAChB,EAAE,CAAC,QAAQ,CAAC,SAAS,CACnB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAC,EACzC,kBAAkB,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,GAAG,CACzD;IACD,EAAE,CAAC,QAAQ,CAAC,SAAS,CACnB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,EAC3C,kBAAkB,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,GAAG,CAC3D;IACD,EAAE,CAAC,QAAQ,CAAC,SAAS,CACnB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,EAC1C,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAC1C;CACF,CAAC,CAAC;AAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;AAC/C,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAC1D,YAAY,EAAE,CAAC;AACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC","sourcesContent":["#!/usr/bin/env node\nimport * as fs from \"node:fs\";\nimport { EOL } from \"node:os\";\nimport * as path from \"node:path\";\nimport { fetchBuildSerializeTries } from \"../update-tries.js\";\n\nconst serializedTriesDir = path.resolve(\n import.meta.dirname,\n \"../../serialized-tries\",\n);\n\nconst { serializedIcannTrie, serializedPrivateTrie } =\n await fetchBuildSerializeTries();\n\nawait fs.promises.mkdir(serializedTriesDir, { recursive: true });\n\nawait Promise.all([\n fs.promises.writeFile(\n path.join(serializedTriesDir, \"icann.js\"),\n `export default ${JSON.stringify(serializedIcannTrie)};`,\n ),\n fs.promises.writeFile(\n path.join(serializedTriesDir, \"private.js\"),\n `export default ${JSON.stringify(serializedPrivateTrie)};`,\n ),\n fs.promises.writeFile(\n path.join(serializedTriesDir, \"info.json\"),\n JSON.stringify({ updatedAt: new Date() }),\n ),\n]);\n\nprocess.stderr.write(\"Running smoke test... \");\nconst { runSmokeTest } = await import(\"../smoke-test.js\");\nrunSmokeTest();\nprocess.stdout.write(\"ok\" + EOL);\n"]}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/bin/update.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;AAEvF,MAAM,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,GAAG,MAAM,wBAAwB,EAAE,CAAC;AAExF,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAEjE,MAAM,OAAO,CAAC,GAAG,CAAC;IAChB,EAAE,CAAC,QAAQ,CAAC,SAAS,CACnB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAC,EACzC,kBAAkB,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,GAAG,CACzD;IACD,EAAE,CAAC,QAAQ,CAAC,SAAS,CACnB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,EAC3C,kBAAkB,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,GAAG,CAC3D;IACD,EAAE,CAAC,QAAQ,CAAC,SAAS,CACnB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,EAC1C,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAC1C;CACF,CAAC,CAAC;AAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;AAC/C,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAC1D,YAAY,EAAE,CAAC;AACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC","sourcesContent":["#!/usr/bin/env node\nimport * as fs from \"node:fs\";\nimport { EOL } from \"node:os\";\nimport * as path from \"node:path\";\n\nimport { fetchBuildSerializeTries } from \"../update-tries.js\";\n\nconst serializedTriesDir = path.resolve(import.meta.dirname, \"../../serialized-tries\");\n\nconst { serializedIcannTrie, serializedPrivateTrie } = await fetchBuildSerializeTries();\n\nawait fs.promises.mkdir(serializedTriesDir, { recursive: true });\n\nawait Promise.all([\n fs.promises.writeFile(\n path.join(serializedTriesDir, \"icann.js\"),\n `export default ${JSON.stringify(serializedIcannTrie)};`,\n ),\n fs.promises.writeFile(\n path.join(serializedTriesDir, \"private.js\"),\n `export default ${JSON.stringify(serializedPrivateTrie)};`,\n ),\n fs.promises.writeFile(\n path.join(serializedTriesDir, \"info.json\"),\n JSON.stringify({ updatedAt: new Date() }),\n ),\n]);\n\nprocess.stderr.write(\"Running smoke test... \");\nconst { runSmokeTest } = await import(\"../smoke-test.js\");\nrunSmokeTest();\nprocess.stdout.write(\"ok\" + EOL);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,yDAC0B,CAAC;AACzD,eAAO,MAAM,gCAAgC,iCAAiC,CAAC;AAC/E,eAAO,MAAM,8BAA8B,+BAA+B,CAAC;AAC3E,eAAO,MAAM,kCAAkC,mCACb,CAAC;AACnC,eAAO,MAAM,gCAAgC,iCAAiC,CAAC;AAC/E,eAAO,MAAM,6BAA6B,SAAU,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,yDAAyD,CAAC;AACxF,eAAO,MAAM,gCAAgC,iCAAiC,CAAC;AAC/E,eAAO,MAAM,8BAA8B,+BAA+B,CAAC;AAC3E,eAAO,MAAM,kCAAkC,mCAAmC,CAAC;AACnF,eAAO,MAAM,gCAAgC,iCAAiC,CAAC;AAC/E,eAAO,MAAM,6BAA6B,SAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAC5B,sDAAsD,CAAC;AACzD,MAAM,CAAC,MAAM,gCAAgC,GAAG,8BAA8B,CAAC;AAC/E,MAAM,CAAC,MAAM,8BAA8B,GAAG,4BAA4B,CAAC;AAC3E,MAAM,CAAC,MAAM,kCAAkC,GAC7C,gCAAgC,CAAC;AACnC,MAAM,CAAC,MAAM,gCAAgC,GAAG,8BAA8B,CAAC;AAC/E,MAAM,CAAC,MAAM,6BAA6B,GAAG,OAAO,CAAC","sourcesContent":["export const PUBLIC_SUFFIX_URL =\n \"https://publicsuffix.org/list/public_suffix_list.dat\";\nexport const PUBLIC_SUFFIX_MARKER_ICANN_START = \"// ===BEGIN ICANN DOMAINS===\";\nexport const PUBLIC_SUFFIX_MARKER_ICANN_END = \"// ===END ICANN DOMAINS===\";\nexport const PUBLIC_SUFFIX_MARKER_PRIVATE_START =\n \"// ===BEGIN PRIVATE DOMAINS===\";\nexport const PUBLIC_SUFFIX_MARKER_PRIVATE_END = \"// ===END PRIVATE DOMAINS===\";\nexport const FETCH_PSL_EXPECTED_MIN_LENGTH = 313_150;\n"]}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,sDAAsD,CAAC;AACxF,MAAM,CAAC,MAAM,gCAAgC,GAAG,8BAA8B,CAAC;AAC/E,MAAM,CAAC,MAAM,8BAA8B,GAAG,4BAA4B,CAAC;AAC3E,MAAM,CAAC,MAAM,kCAAkC,GAAG,gCAAgC,CAAC;AACnF,MAAM,CAAC,MAAM,gCAAgC,GAAG,8BAA8B,CAAC;AAC/E,MAAM,CAAC,MAAM,6BAA6B,GAAG,OAAO,CAAC","sourcesContent":["export const PUBLIC_SUFFIX_URL = \"https://publicsuffix.org/list/public_suffix_list.dat\";\nexport const PUBLIC_SUFFIX_MARKER_ICANN_START = \"// ===BEGIN ICANN DOMAINS===\";\nexport const PUBLIC_SUFFIX_MARKER_ICANN_END = \"// ===END ICANN DOMAINS===\";\nexport const PUBLIC_SUFFIX_MARKER_PRIVATE_START = \"// ===BEGIN PRIVATE DOMAINS===\";\nexport const PUBLIC_SUFFIX_MARKER_PRIVATE_END = \"// ===END PRIVATE DOMAINS===\";\nexport const FETCH_PSL_EXPECTED_MIN_LENGTH = 313_150;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"from-url.d.ts","sourceRoot":"","sources":["../src/from-url.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW,EAAE,OAAO,MAA8B,CAAC;AAEhE,eAAO,MAAM,OAAO,GAAI,SAAS,MAAM,KAAG,MAAM,GAAG,OAAO,WA8BzD,CAAC"}
1
+ {"version":3,"file":"from-url.d.ts","sourceRoot":"","sources":["../src/from-url.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,EAAE,OAAO,MAA8B,CAAC;AAEhE,eAAO,MAAM,OAAO,GAAI,SAAS,MAAM,KAAG,MAAM,GAAG,OAAO,WA4BzD,CAAC"}
package/dist/from-url.js CHANGED
@@ -14,11 +14,9 @@ export const fromUrl = (urlLike) => {
14
14
  let url = urlLike.startsWith("//")
15
15
  ? `http:${urlLike}`
16
16
  : // URLs that start with / do not have a hostname section
17
- urlLike.startsWith("/")
17
+ urlLike.startsWith("/") || urlPattern.test(urlLike)
18
18
  ? urlLike
19
- : urlPattern.test(urlLike)
20
- ? urlLike
21
- : `http://${urlLike}`;
19
+ : `http://${urlLike}`;
22
20
  url = url.replace(invalidIpv6Pattern, "$1[$2]$3");
23
21
  try {
24
22
  return new URL(url).hostname;
@@ -1 +1 @@
1
- {"version":3,"file":"from-url.js","sourceRoot":"","sources":["../src/from-url.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAAG,wBAAwB,CAAC;AAC5C,MAAM,kBAAkB,GACtB,wDAAwD,CAAC;AAE3D,MAAM,CAAC,MAAM,WAAW,GAAkB,MAAM,CAAC,aAAa,CAAC,CAAC;AAEhE,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,OAAe,EAA+B,EAAE;IACtE,0BAA0B;IAC1B,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;QAC9B,MAAM,IAAI,SAAS,CACjB,yHAAyH,CAC1H,CAAC;IACJ,CAAC;IAED,uCAAuC;IACvC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,gDAAgD;IAChD,IAAI,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;QAChC,CAAC,CAAC,QAAQ,OAAO,EAAE;QACnB,CAAC,CAAC,wDAAwD;YACxD,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;gBACvB,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;oBACxB,CAAC,CAAC,OAAO;oBACT,CAAC,CAAC,UAAU,OAAO,EAAE,CAAC;IAE5B,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;IAElD,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,WAAW,CAAC;IACrB,CAAC;AACH,CAAC,CAAC","sourcesContent":["const urlPattern = /^[a-z][*+.a-z-]+:\\/\\//i;\nconst invalidIpv6Pattern =\n /^([a-z][*+.a-z-]+:\\/\\/)([^[][^/?]*:[^/?]*:[^/?]*)(.*)/i;\n\nexport const NO_HOSTNAME: unique symbol = Symbol(\"NO_HOSTNAME\");\n\nexport const fromUrl = (urlLike: string): string | typeof NO_HOSTNAME => {\n /* istanbul ignore next */\n if (typeof URL !== \"function\") {\n throw new TypeError(\n \"Looks like the new URL() constructor is not globally available in your environment. Please make sure to use a polyfill.\",\n );\n }\n\n // Extra check for non-TypeScript users\n if (typeof urlLike !== \"string\") {\n return NO_HOSTNAME;\n }\n\n // URLs that start with // are protocol relative\n let url = urlLike.startsWith(\"//\")\n ? `http:${urlLike}`\n : // URLs that start with / do not have a hostname section\n urlLike.startsWith(\"/\")\n ? urlLike\n : urlPattern.test(urlLike)\n ? urlLike\n : `http://${urlLike}`;\n\n url = url.replace(invalidIpv6Pattern, \"$1[$2]$3\");\n\n try {\n return new URL(url).hostname;\n } catch {\n return NO_HOSTNAME;\n }\n};\n"]}
1
+ {"version":3,"file":"from-url.js","sourceRoot":"","sources":["../src/from-url.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAAG,wBAAwB,CAAC;AAC5C,MAAM,kBAAkB,GAAG,wDAAwD,CAAC;AAEpF,MAAM,CAAC,MAAM,WAAW,GAAkB,MAAM,CAAC,aAAa,CAAC,CAAC;AAEhE,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,OAAe,EAA+B,EAAE;IACtE,0BAA0B;IAC1B,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;QAC9B,MAAM,IAAI,SAAS,CACjB,yHAAyH,CAC1H,CAAC;IACJ,CAAC;IAED,uCAAuC;IACvC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,gDAAgD;IAChD,IAAI,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;QAChC,CAAC,CAAC,QAAQ,OAAO,EAAE;QACnB,CAAC,CAAC,wDAAwD;YACxD,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;gBACnD,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,UAAU,OAAO,EAAE,CAAC;IAE1B,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;IAElD,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,WAAW,CAAC;IACrB,CAAC;AACH,CAAC,CAAC","sourcesContent":["const urlPattern = /^[a-z][*+.a-z-]+:\\/\\//i;\nconst invalidIpv6Pattern = /^([a-z][*+.a-z-]+:\\/\\/)([^[][^/?]*:[^/?]*:[^/?]*)(.*)/i;\n\nexport const NO_HOSTNAME: unique symbol = Symbol(\"NO_HOSTNAME\");\n\nexport const fromUrl = (urlLike: string): string | typeof NO_HOSTNAME => {\n /* istanbul ignore next */\n if (typeof URL !== \"function\") {\n throw new TypeError(\n \"Looks like the new URL() constructor is not globally available in your environment. Please make sure to use a polyfill.\",\n );\n }\n\n // Extra check for non-TypeScript users\n if (typeof urlLike !== \"string\") {\n return NO_HOSTNAME;\n }\n\n // URLs that start with // are protocol relative\n let url = urlLike.startsWith(\"//\")\n ? `http:${urlLike}`\n : // URLs that start with / do not have a hostname section\n urlLike.startsWith(\"/\") || urlPattern.test(urlLike)\n ? urlLike\n : `http://${urlLike}`;\n\n url = url.replace(invalidIpv6Pattern, \"$1[$2]$3\");\n\n try {\n return new URL(url).hostname;\n } catch {\n return NO_HOSTNAME;\n }\n};\n"]}
@@ -4,8 +4,8 @@ export declare const RESERVED_TOP_LEVEL_DOMAINS: string[];
4
4
  export type Label = string;
5
5
  export declare enum ParseResultType {
6
6
  /**
7
- * This parse result is returned in case the given hostname does not adhere to
8
- * [RFC 1034](https://tools.ietf.org/html/rfc1034).
7
+ * This parse result is returned in case the given hostname does not adhere to [RFC
8
+ * 1034](https://tools.ietf.org/html/rfc1034).
9
9
  */
10
10
  Invalid = "INVALID",
11
11
  /** This parse result is returned if the given hostname was an IPv4 or IPv6. */
@@ -14,27 +14,22 @@ export declare enum ParseResultType {
14
14
  * This parse result is returned when the given hostname
15
15
  *
16
16
  * - Is the root domain (the empty string `""`)
17
- * - Belongs to the top-level domain `localhost`, `local`, `example`, `invalid`
18
- * or `test`
17
+ * - Belongs to the top-level domain `localhost`, `local`, `example`, `invalid` or `test`
19
18
  */
20
19
  Reserved = "RESERVED",
21
20
  /**
22
- * This parse result is returned when the given hostname is valid and does not
23
- * belong to a reserved top-level domain, but is not listed in the public
24
- * suffix list.
21
+ * This parse result is returned when the given hostname is valid and does not belong to a
22
+ * reserved top-level domain, but is not listed in the public suffix list.
25
23
  */
26
24
  NotListed = "NOT_LISTED",
27
25
  /**
28
- * This parse result is returned when the given hostname belongs to a
29
- * top-level domain that is listed in the public suffix list.
26
+ * This parse result is returned when the given hostname belongs to a top-level domain that is
27
+ * listed in the public suffix list.
30
28
  */
31
29
  Listed = "LISTED"
32
30
  }
33
31
  type ParseResultCommon<Type extends ParseResultType> = {
34
- /**
35
- * The type of the parse result. Use switch or if to distinguish between
36
- * different results.
37
- */
32
+ /** The type of the parse result. Use switch or if to distinguish between different results. */
38
33
  type: Type;
39
34
  /** The original hostname that was passed to parseDomain(). */
40
35
  hostname: Type extends ParseResultType.Invalid ? string | typeof NO_HOSTNAME : string;
@@ -44,10 +39,7 @@ export type ParseResultInvalid = ParseResultCommon<ParseResultType.Invalid> & {
44
39
  errors: Array<ValidationError>;
45
40
  };
46
41
  type ParseResultCommonValidDomain = {
47
- /**
48
- * An array of labels that were separated by a dot character in the given
49
- * hostname.
50
- */
42
+ /** An array of labels that were separated by a dot character in the given hostname. */
51
43
  labels: Array<Label>;
52
44
  };
53
45
  export type ParseResultIp = ParseResultCommon<ParseResultType.Ip> & Pick<SanitizationResultValidIp, "ipVersion">;
@@ -55,24 +47,20 @@ export type ParseResultReserved = ParseResultCommon<ParseResultType.Reserved> &
55
47
  export type ParseResultNotListed = ParseResultCommon<ParseResultType.NotListed> & ParseResultCommonValidDomain;
56
48
  type ParseResultListedDomains = {
57
49
  /**
58
- * An array of labels that belong to the subdomain. Can be empty if there was
59
- * no subdomain in the given hostname.
50
+ * An array of labels that belong to the subdomain. Can be empty if there was no subdomain in the
51
+ * given hostname.
60
52
  */
61
53
  subDomains: Array<Label>;
62
54
  /**
63
- * The first label that belongs to the user-controlled section of the
64
- * hostname. Can be undefined if just a top-level domain was passed to
65
- * parseDomain().
55
+ * The first label that belongs to the user-controlled section of the hostname. Can be undefined
56
+ * if just a top-level domain was passed to parseDomain().
66
57
  */
67
58
  domain: Label | undefined;
68
59
  /** An array of labels that are controlled by the domain registrar. */
69
60
  topLevelDomains: Array<Label>;
70
61
  };
71
62
  export type ParseResultListed = ParseResultCommon<ParseResultType.Listed> & ParseResultCommonValidDomain & ParseResultListedDomains & {
72
- /**
73
- * The parse result according to ICANN only without private top-level
74
- * domains.
75
- */
63
+ /** The parse result according to ICANN only without private top-level domains. */
76
64
  icann: ParseResultListedDomains;
77
65
  };
78
66
  export type ParseResult = ParseResultInvalid | ParseResultIp | ParseResultReserved | ParseResultNotListed | ParseResultListed;
@@ -1 +1 @@
1
- {"version":3,"file":"parse-domain.d.ts","sourceRoot":"","sources":["../src/parse-domain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAGL,UAAU,EACV,KAAK,yBAAyB,EAC9B,KAAK,eAAe,EACrB,MAAM,eAAe,CAAC;AAMvB,eAAO,MAAM,0BAA0B,UAMtC,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC;AAE3B,oBAAY,eAAe;IACzB;;;OAGG;IACH,OAAO,YAAY;IACnB,+EAA+E;IAC/E,EAAE,OAAO;IACT;;;;;;OAMG;IACH,QAAQ,aAAa;IACrB;;;;OAIG;IACH,SAAS,eAAe;IACxB;;;OAGG;IACH,MAAM,WAAW;CAClB;AAMD,KAAK,iBAAiB,CAAC,IAAI,SAAS,eAAe,IAAI;IACrD;;;OAGG;IACH,IAAI,EAAE,IAAI,CAAC;IACX,8DAA8D;IAC9D,QAAQ,EAAE,IAAI,SAAS,eAAe,CAAC,OAAO,GAC1C,MAAM,GAAG,OAAO,WAAW,GAC3B,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG;IAC5E,qCAAqC;IACrC,MAAM,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;CAChC,CAAC;AAEF,KAAK,4BAA4B,GAAG;IAClC;;;OAGG;IACH,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,iBAAiB,CAAC,eAAe,CAAC,EAAE,CAAC,GAC/D,IAAI,CAAC,yBAAyB,EAAE,WAAW,CAAC,CAAC;AAE/C,MAAM,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,eAAe,CAAC,QAAQ,CAAC,GAC3E,4BAA4B,CAAC;AAE/B,MAAM,MAAM,oBAAoB,GAC9B,iBAAiB,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,4BAA4B,CAAC;AAE9E,KAAK,wBAAwB,GAAG;IAC9B;;;OAGG;IACH,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACzB;;;;OAIG;IACH,MAAM,EAAE,KAAK,GAAG,SAAS,CAAC;IAC1B,sEAAsE;IACtE,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,eAAe,CAAC,MAAM,CAAC,GACvE,4BAA4B,GAC5B,wBAAwB,GAAG;IACzB;;;OAGG;IACH,KAAK,EAAE,wBAAwB,CAAC;CACjC,CAAC;AAEJ,MAAM,MAAM,WAAW,GACnB,kBAAkB,GAClB,aAAa,GACb,mBAAmB,GACnB,oBAAoB,GACpB,iBAAiB,CAAC;AAuBtB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,qEAAqE;IACrE,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,CAAC;AAEF,6EAA6E;AAC7E,eAAO,MAAM,WAAW,GACtB,UAAU,MAAM,GAAG,OAAO,WAAW,EACrC,UAAU,kBAAkB,KAC3B,WA8DF,CAAC"}
1
+ {"version":3,"file":"parse-domain.d.ts","sourceRoot":"","sources":["../src/parse-domain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAGL,UAAU,EACV,KAAK,yBAAyB,EAC9B,KAAK,eAAe,EACrB,MAAM,eAAe,CAAC;AAMvB,eAAO,MAAM,0BAA0B,UAAuD,CAAC;AAE/F,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC;AAE3B,oBAAY,eAAe;IACzB;;;OAGG;IACH,OAAO,YAAY;IACnB,+EAA+E;IAC/E,EAAE,OAAO;IACT;;;;;OAKG;IACH,QAAQ,aAAa;IACrB;;;OAGG;IACH,SAAS,eAAe;IACxB;;;OAGG;IACH,MAAM,WAAW;CAClB;AAMD,KAAK,iBAAiB,CAAC,IAAI,SAAS,eAAe,IAAI;IACrD,+FAA+F;IAC/F,IAAI,EAAE,IAAI,CAAC;IACX,8DAA8D;IAC9D,QAAQ,EAAE,IAAI,SAAS,eAAe,CAAC,OAAO,GAAG,MAAM,GAAG,OAAO,WAAW,GAAG,MAAM,CAAC;CACvF,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG;IAC5E,qCAAqC;IACrC,MAAM,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;CAChC,CAAC;AAEF,KAAK,4BAA4B,GAAG;IAClC,uFAAuF;IACvF,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,iBAAiB,CAAC,eAAe,CAAC,EAAE,CAAC,GAC/D,IAAI,CAAC,yBAAyB,EAAE,WAAW,CAAC,CAAC;AAE/C,MAAM,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,eAAe,CAAC,QAAQ,CAAC,GAC3E,4BAA4B,CAAC;AAE/B,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,CAAC,eAAe,CAAC,SAAS,CAAC,GAC7E,4BAA4B,CAAC;AAE/B,KAAK,wBAAwB,GAAG;IAC9B;;;OAGG;IACH,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACzB;;;OAGG;IACH,MAAM,EAAE,KAAK,GAAG,SAAS,CAAC;IAC1B,sEAAsE;IACtE,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,eAAe,CAAC,MAAM,CAAC,GACvE,4BAA4B,GAC5B,wBAAwB,GAAG;IACzB,kFAAkF;IAClF,KAAK,EAAE,wBAAwB,CAAC;CACjC,CAAC;AAEJ,MAAM,MAAM,WAAW,GACnB,kBAAkB,GAClB,aAAa,GACb,mBAAmB,GACnB,oBAAoB,GACpB,iBAAiB,CAAC;AAiBtB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,qEAAqE;IACrE,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,CAAC;AAEF,6EAA6E;AAC7E,eAAO,MAAM,WAAW,GACtB,UAAU,MAAM,GAAG,OAAO,WAAW,EACrC,UAAU,kBAAkB,KAC3B,WA8DF,CAAC"}
@@ -3,18 +3,12 @@ import { SanitizationResultType, sanitize, Validation, } from "./sanitize.js";
3
3
  import { icannTrie, privateTrie } from "./serialized-tries.js";
4
4
  import { lookUpTldsInTrie } from "./trie/look-up.js";
5
5
  import { parseTrie } from "./trie/parse-trie.js";
6
- export const RESERVED_TOP_LEVEL_DOMAINS = [
7
- "localhost",
8
- "local",
9
- "example",
10
- "invalid",
11
- "test",
12
- ];
6
+ export const RESERVED_TOP_LEVEL_DOMAINS = ["localhost", "local", "example", "invalid", "test"];
13
7
  export var ParseResultType;
14
8
  (function (ParseResultType) {
15
9
  /**
16
- * This parse result is returned in case the given hostname does not adhere to
17
- * [RFC 1034](https://tools.ietf.org/html/rfc1034).
10
+ * This parse result is returned in case the given hostname does not adhere to [RFC
11
+ * 1034](https://tools.ietf.org/html/rfc1034).
18
12
  */
19
13
  ParseResultType["Invalid"] = "INVALID";
20
14
  /** This parse result is returned if the given hostname was an IPv4 or IPv6. */
@@ -23,19 +17,17 @@ export var ParseResultType;
23
17
  * This parse result is returned when the given hostname
24
18
  *
25
19
  * - Is the root domain (the empty string `""`)
26
- * - Belongs to the top-level domain `localhost`, `local`, `example`, `invalid`
27
- * or `test`
20
+ * - Belongs to the top-level domain `localhost`, `local`, `example`, `invalid` or `test`
28
21
  */
29
22
  ParseResultType["Reserved"] = "RESERVED";
30
23
  /**
31
- * This parse result is returned when the given hostname is valid and does not
32
- * belong to a reserved top-level domain, but is not listed in the public
33
- * suffix list.
24
+ * This parse result is returned when the given hostname is valid and does not belong to a
25
+ * reserved top-level domain, but is not listed in the public suffix list.
34
26
  */
35
27
  ParseResultType["NotListed"] = "NOT_LISTED";
36
28
  /**
37
- * This parse result is returned when the given hostname belongs to a
38
- * top-level domain that is listed in the public suffix list.
29
+ * This parse result is returned when the given hostname belongs to a top-level domain that is
30
+ * listed in the public suffix list.
39
31
  */
40
32
  ParseResultType["Listed"] = "LISTED";
41
33
  })(ParseResultType || (ParseResultType = {}));
@@ -1 +1 @@
1
- {"version":3,"file":"parse-domain.js","sourceRoot":"","sources":["../src/parse-domain.ts"],"names":[],"mappings":"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","sourcesContent":["import { NO_HOSTNAME } from \"./from-url.js\";\nimport {\n SanitizationResultType,\n sanitize,\n Validation,\n type SanitizationResultValidIp,\n type ValidationError,\n} from \"./sanitize.js\";\nimport { icannTrie, privateTrie } from \"./serialized-tries.js\";\nimport { lookUpTldsInTrie } from \"./trie/look-up.js\";\nimport type { TrieRootNode } from \"./trie/nodes.js\";\nimport { parseTrie } from \"./trie/parse-trie.js\";\n\nexport const RESERVED_TOP_LEVEL_DOMAINS = [\n \"localhost\",\n \"local\",\n \"example\",\n \"invalid\",\n \"test\",\n];\n\nexport type Label = string;\n\nexport enum ParseResultType {\n /**\n * This parse result is returned in case the given hostname does not adhere to\n * [RFC 1034](https://tools.ietf.org/html/rfc1034).\n */\n Invalid = \"INVALID\",\n /** This parse result is returned if the given hostname was an IPv4 or IPv6. */\n Ip = \"IP\",\n /**\n * This parse result is returned when the given hostname\n *\n * - Is the root domain (the empty string `\"\"`)\n * - Belongs to the top-level domain `localhost`, `local`, `example`, `invalid`\n * or `test`\n */\n Reserved = \"RESERVED\",\n /**\n * This parse result is returned when the given hostname is valid and does not\n * belong to a reserved top-level domain, but is not listed in the public\n * suffix list.\n */\n NotListed = \"NOT_LISTED\",\n /**\n * This parse result is returned when the given hostname belongs to a\n * top-level domain that is listed in the public suffix list.\n */\n Listed = \"LISTED\",\n}\n\n// The following parse result types are organized in this complicated way\n// way because every property should only be described by a single JSDoc comment.\n// If we copy the types (hence duplicating the shared properties),\n// JSDoc comments would show up duplicated in the final return type as well.\ntype ParseResultCommon<Type extends ParseResultType> = {\n /**\n * The type of the parse result. Use switch or if to distinguish between\n * different results.\n */\n type: Type;\n /** The original hostname that was passed to parseDomain(). */\n hostname: Type extends ParseResultType.Invalid\n ? string | typeof NO_HOSTNAME\n : string;\n};\n\nexport type ParseResultInvalid = ParseResultCommon<ParseResultType.Invalid> & {\n /** An array of validation errors. */\n errors: Array<ValidationError>;\n};\n\ntype ParseResultCommonValidDomain = {\n /**\n * An array of labels that were separated by a dot character in the given\n * hostname.\n */\n labels: Array<Label>;\n};\n\nexport type ParseResultIp = ParseResultCommon<ParseResultType.Ip> &\n Pick<SanitizationResultValidIp, \"ipVersion\">;\n\nexport type ParseResultReserved = ParseResultCommon<ParseResultType.Reserved> &\n ParseResultCommonValidDomain;\n\nexport type ParseResultNotListed =\n ParseResultCommon<ParseResultType.NotListed> & ParseResultCommonValidDomain;\n\ntype ParseResultListedDomains = {\n /**\n * An array of labels that belong to the subdomain. Can be empty if there was\n * no subdomain in the given hostname.\n */\n subDomains: Array<Label>;\n /**\n * The first label that belongs to the user-controlled section of the\n * hostname. Can be undefined if just a top-level domain was passed to\n * parseDomain().\n */\n domain: Label | undefined;\n /** An array of labels that are controlled by the domain registrar. */\n topLevelDomains: Array<Label>;\n};\n\nexport type ParseResultListed = ParseResultCommon<ParseResultType.Listed> &\n ParseResultCommonValidDomain &\n ParseResultListedDomains & {\n /**\n * The parse result according to ICANN only without private top-level\n * domains.\n */\n icann: ParseResultListedDomains;\n };\n\nexport type ParseResult =\n | ParseResultInvalid\n | ParseResultIp\n | ParseResultReserved\n | ParseResultNotListed\n | ParseResultListed;\n\nconst getAtIndex = <Item>(\n array: Array<Item>,\n index: number,\n): Item | undefined => {\n return index >= 0 && index < array.length ? array[index] : undefined;\n};\n\nconst splitLabelsIntoDomains = (\n labels: Array<Label>,\n index: number,\n): ParseResultListedDomains => {\n return {\n subDomains: labels.slice(0, Math.max(0, index)),\n domain: getAtIndex(labels, index),\n topLevelDomains: labels.slice(index + 1),\n };\n};\n\nlet parsedIcannTrie: TrieRootNode | undefined;\nlet parsedPrivateTrie: TrieRootNode | undefined;\n\nexport type ParseDomainOptions = {\n /** If no validation is specified, Validation.Strict will be used. */\n validation?: Validation;\n};\n\n/** Splits the given hostname in topLevelDomains, a domain and subDomains. */\nexport const parseDomain = (\n hostname: string | typeof NO_HOSTNAME,\n options?: ParseDomainOptions,\n): ParseResult => {\n const sanitizationResult = sanitize(hostname, options);\n\n if (sanitizationResult.type === SanitizationResultType.Error) {\n return {\n type: ParseResultType.Invalid,\n hostname,\n errors: sanitizationResult.errors,\n };\n }\n\n if (sanitizationResult.type === SanitizationResultType.ValidIp) {\n return {\n type: ParseResultType.Ip,\n hostname: sanitizationResult.ip,\n ipVersion: sanitizationResult.ipVersion,\n };\n }\n\n const { labels, domain } = sanitizationResult;\n\n // We do not want to break compatibility with older engines unnecessarily.\n // eslint-disable-next-line unicorn/prefer-at\n const lastLabel = labels[labels.length - 1];\n if (\n hostname === \"\" ||\n (lastLabel !== undefined && RESERVED_TOP_LEVEL_DOMAINS.includes(lastLabel))\n ) {\n return {\n type: ParseResultType.Reserved,\n hostname: domain,\n labels,\n };\n }\n\n // Parse the serialized trie lazily\n parsedIcannTrie = parsedIcannTrie ?? parseTrie(icannTrie);\n parsedPrivateTrie = parsedPrivateTrie ?? parseTrie(privateTrie);\n\n const icannTlds = lookUpTldsInTrie(labels, parsedIcannTrie);\n const privateTlds = lookUpTldsInTrie(labels, parsedPrivateTrie);\n\n if (icannTlds.length === 0 && privateTlds.length === 0) {\n return {\n type: ParseResultType.NotListed,\n hostname: domain,\n labels,\n };\n }\n\n const indexOfPublicSuffixDomain =\n labels.length - Math.max(privateTlds.length, icannTlds.length) - 1;\n\n const indexOfIcannDomain = labels.length - icannTlds.length - 1;\n\n return {\n type: ParseResultType.Listed,\n hostname: domain,\n labels,\n icann: splitLabelsIntoDomains(labels, indexOfIcannDomain),\n ...splitLabelsIntoDomains(labels, indexOfPublicSuffixDomain),\n };\n};\n"]}
1
+ {"version":3,"file":"parse-domain.js","sourceRoot":"","sources":["../src/parse-domain.ts"],"names":[],"mappings":"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","sourcesContent":["import { NO_HOSTNAME } from \"./from-url.js\";\nimport {\n SanitizationResultType,\n sanitize,\n Validation,\n type SanitizationResultValidIp,\n type ValidationError,\n} from \"./sanitize.js\";\nimport { icannTrie, privateTrie } from \"./serialized-tries.js\";\nimport { lookUpTldsInTrie } from \"./trie/look-up.js\";\nimport type { TrieRootNode } from \"./trie/nodes.js\";\nimport { parseTrie } from \"./trie/parse-trie.js\";\n\nexport const RESERVED_TOP_LEVEL_DOMAINS = [\"localhost\", \"local\", \"example\", \"invalid\", \"test\"];\n\nexport type Label = string;\n\nexport enum ParseResultType {\n /**\n * This parse result is returned in case the given hostname does not adhere to [RFC\n * 1034](https://tools.ietf.org/html/rfc1034).\n */\n Invalid = \"INVALID\",\n /** This parse result is returned if the given hostname was an IPv4 or IPv6. */\n Ip = \"IP\",\n /**\n * This parse result is returned when the given hostname\n *\n * - Is the root domain (the empty string `\"\"`)\n * - Belongs to the top-level domain `localhost`, `local`, `example`, `invalid` or `test`\n */\n Reserved = \"RESERVED\",\n /**\n * This parse result is returned when the given hostname is valid and does not belong to a\n * reserved top-level domain, but is not listed in the public suffix list.\n */\n NotListed = \"NOT_LISTED\",\n /**\n * This parse result is returned when the given hostname belongs to a top-level domain that is\n * listed in the public suffix list.\n */\n Listed = \"LISTED\",\n}\n\n// The following parse result types are organized in this complicated way\n// way because every property should only be described by a single JSDoc comment.\n// If we copy the types (hence duplicating the shared properties),\n// JSDoc comments would show up duplicated in the final return type as well.\ntype ParseResultCommon<Type extends ParseResultType> = {\n /** The type of the parse result. Use switch or if to distinguish between different results. */\n type: Type;\n /** The original hostname that was passed to parseDomain(). */\n hostname: Type extends ParseResultType.Invalid ? string | typeof NO_HOSTNAME : string;\n};\n\nexport type ParseResultInvalid = ParseResultCommon<ParseResultType.Invalid> & {\n /** An array of validation errors. */\n errors: Array<ValidationError>;\n};\n\ntype ParseResultCommonValidDomain = {\n /** An array of labels that were separated by a dot character in the given hostname. */\n labels: Array<Label>;\n};\n\nexport type ParseResultIp = ParseResultCommon<ParseResultType.Ip> &\n Pick<SanitizationResultValidIp, \"ipVersion\">;\n\nexport type ParseResultReserved = ParseResultCommon<ParseResultType.Reserved> &\n ParseResultCommonValidDomain;\n\nexport type ParseResultNotListed = ParseResultCommon<ParseResultType.NotListed> &\n ParseResultCommonValidDomain;\n\ntype ParseResultListedDomains = {\n /**\n * An array of labels that belong to the subdomain. Can be empty if there was no subdomain in the\n * given hostname.\n */\n subDomains: Array<Label>;\n /**\n * The first label that belongs to the user-controlled section of the hostname. Can be undefined\n * if just a top-level domain was passed to parseDomain().\n */\n domain: Label | undefined;\n /** An array of labels that are controlled by the domain registrar. */\n topLevelDomains: Array<Label>;\n};\n\nexport type ParseResultListed = ParseResultCommon<ParseResultType.Listed> &\n ParseResultCommonValidDomain &\n ParseResultListedDomains & {\n /** The parse result according to ICANN only without private top-level domains. */\n icann: ParseResultListedDomains;\n };\n\nexport type ParseResult =\n | ParseResultInvalid\n | ParseResultIp\n | ParseResultReserved\n | ParseResultNotListed\n | ParseResultListed;\n\nconst getAtIndex = <Item>(array: Array<Item>, index: number): Item | undefined => {\n return index >= 0 && index < array.length ? array[index] : undefined;\n};\n\nconst splitLabelsIntoDomains = (labels: Array<Label>, index: number): ParseResultListedDomains => {\n return {\n subDomains: labels.slice(0, Math.max(0, index)),\n domain: getAtIndex(labels, index),\n topLevelDomains: labels.slice(index + 1),\n };\n};\n\nlet parsedIcannTrie: TrieRootNode | undefined;\nlet parsedPrivateTrie: TrieRootNode | undefined;\n\nexport type ParseDomainOptions = {\n /** If no validation is specified, Validation.Strict will be used. */\n validation?: Validation;\n};\n\n/** Splits the given hostname in topLevelDomains, a domain and subDomains. */\nexport const parseDomain = (\n hostname: string | typeof NO_HOSTNAME,\n options?: ParseDomainOptions,\n): ParseResult => {\n const sanitizationResult = sanitize(hostname, options);\n\n if (sanitizationResult.type === SanitizationResultType.Error) {\n return {\n type: ParseResultType.Invalid,\n hostname,\n errors: sanitizationResult.errors,\n };\n }\n\n if (sanitizationResult.type === SanitizationResultType.ValidIp) {\n return {\n type: ParseResultType.Ip,\n hostname: sanitizationResult.ip,\n ipVersion: sanitizationResult.ipVersion,\n };\n }\n\n const { labels, domain } = sanitizationResult;\n\n // We do not want to break compatibility with older engines unnecessarily.\n // eslint-disable-next-line unicorn/prefer-at\n const lastLabel = labels[labels.length - 1];\n if (\n hostname === \"\" ||\n (lastLabel !== undefined && RESERVED_TOP_LEVEL_DOMAINS.includes(lastLabel))\n ) {\n return {\n type: ParseResultType.Reserved,\n hostname: domain,\n labels,\n };\n }\n\n // Parse the serialized trie lazily\n parsedIcannTrie = parsedIcannTrie ?? parseTrie(icannTrie);\n parsedPrivateTrie = parsedPrivateTrie ?? parseTrie(privateTrie);\n\n const icannTlds = lookUpTldsInTrie(labels, parsedIcannTrie);\n const privateTlds = lookUpTldsInTrie(labels, parsedPrivateTrie);\n\n if (icannTlds.length === 0 && privateTlds.length === 0) {\n return {\n type: ParseResultType.NotListed,\n hostname: domain,\n labels,\n };\n }\n\n const indexOfPublicSuffixDomain =\n labels.length - Math.max(privateTlds.length, icannTlds.length) - 1;\n\n const indexOfIcannDomain = labels.length - icannTlds.length - 1;\n\n return {\n type: ParseResultType.Listed,\n hostname: domain,\n labels,\n icann: splitLabelsIntoDomains(labels, indexOfIcannDomain),\n ...splitLabelsIntoDomains(labels, indexOfPublicSuffixDomain),\n };\n};\n"]}
@@ -1,5 +1,6 @@
1
+ import type { TrieRootNode } from "../trie/nodes.js";
1
2
  export declare const buildTries: (psl: string) => {
2
- icannTrie: import("../trie/nodes.js").TrieRootNode;
3
- privateTrie: import("../trie/nodes.js").TrieRootNode;
3
+ icannTrie: TrieRootNode;
4
+ privateTrie: TrieRootNode;
4
5
  };
5
6
  //# sourceMappingURL=build-tries.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"build-tries.d.ts","sourceRoot":"","sources":["../../src/psl/build-tries.ts"],"names":[],"mappings":"AAyDA,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM;;;CASrC,CAAC"}
1
+ {"version":3,"file":"build-tries.d.ts","sourceRoot":"","sources":["../../src/psl/build-tries.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA4CrD,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,KAAG;IAAE,SAAS,EAAE,YAAY,CAAC;IAAC,WAAW,EAAE,YAAY,CAAA;CAS5F,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { PUBLIC_SUFFIX_MARKER_ICANN_END, PUBLIC_SUFFIX_MARKER_ICANN_START, PUBLIC_SUFFIX_MARKER_PRIVATE_END, PUBLIC_SUFFIX_MARKER_PRIVATE_START, } from "../config.js";
2
2
  import { toASCII } from "../punycode.js";
3
3
  import { createTrieFromList } from "../trie/create-trie.js";
4
- const matchNewLine = /\r?\n/u;
4
+ const matchNewline = /\r?\n/u;
5
5
  const matchComment = /^\s*\/\//u;
6
6
  const matchWhitespace = /^\s*$/u;
7
7
  const extractByMarkers = (listContent, startMarker, endMarker) => {
@@ -19,11 +19,11 @@ const containsRule = (line) => matchComment.test(line) === false && matchWhitesp
19
19
  const parsePsl = (listContent) => {
20
20
  return {
21
21
  icann: extractByMarkers(listContent, PUBLIC_SUFFIX_MARKER_ICANN_START, PUBLIC_SUFFIX_MARKER_ICANN_END)
22
- .split(matchNewLine)
22
+ .split(matchNewline)
23
23
  .filter((line) => containsRule(line))
24
24
  .map((line) => toASCII(line)),
25
25
  private: extractByMarkers(listContent, PUBLIC_SUFFIX_MARKER_PRIVATE_START, PUBLIC_SUFFIX_MARKER_PRIVATE_END)
26
- .split(matchNewLine)
26
+ .split(matchNewline)
27
27
  .filter((line) => containsRule(line))
28
28
  .map((line) => toASCII(line)),
29
29
  };
@@ -1 +1 @@
1
- {"version":3,"file":"build-tries.js","sourceRoot":"","sources":["../../src/psl/build-tries.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,gCAAgC,EAChC,gCAAgC,EAChC,kCAAkC,GACnC,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,MAAM,YAAY,GAAG,QAAQ,CAAC;AAC9B,MAAM,YAAY,GAAG,WAAW,CAAC;AACjC,MAAM,eAAe,GAAG,QAAQ,CAAC;AAEjC,MAAM,gBAAgB,GAAG,CACvB,WAAmB,EACnB,WAAmB,EACnB,SAAiB,EACjB,EAAE;IACF,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE3C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,wBAAwB,WAAW,wBAAwB,CAC5D,CAAC;IACJ,CAAC;IACD,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,wBAAwB,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,EAAE,CACpC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC;AAE5E,MAAM,QAAQ,GAAG,CAAC,WAAmB,EAAE,EAAE;IACvC,OAAO;QACL,KAAK,EAAE,gBAAgB,CACrB,WAAW,EACX,gCAAgC,EAChC,8BAA8B,CAC/B;aACE,KAAK,CAAC,YAAY,CAAC;aACnB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;aACpC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,EAAE,gBAAgB,CACvB,WAAW,EACX,kCAAkC,EAClC,gCAAgC,CACjC;aACE,KAAK,CAAC,YAAY,CAAC;aACnB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;aACpC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KAChC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,EAAE;IACxC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAE1D,OAAO;QACL,SAAS;QACT,WAAW;KACZ,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {\n PUBLIC_SUFFIX_MARKER_ICANN_END,\n PUBLIC_SUFFIX_MARKER_ICANN_START,\n PUBLIC_SUFFIX_MARKER_PRIVATE_END,\n PUBLIC_SUFFIX_MARKER_PRIVATE_START,\n} from \"../config.js\";\nimport { toASCII } from \"../punycode.js\";\nimport { createTrieFromList } from \"../trie/create-trie.js\";\n\nconst matchNewLine = /\\r?\\n/u;\nconst matchComment = /^\\s*\\/\\//u;\nconst matchWhitespace = /^\\s*$/u;\n\nconst extractByMarkers = (\n listContent: string,\n startMarker: string,\n endMarker: string,\n) => {\n const start = listContent.indexOf(startMarker);\n const end = listContent.indexOf(endMarker);\n\n if (start === -1) {\n throw new Error(\n `Missing start marker ${startMarker} in public suffix list`,\n );\n }\n if (end === -1) {\n throw new Error(`Missing end marker ${endMarker} in public suffix list`);\n }\n\n return listContent.slice(start, end);\n};\n\nconst containsRule = (line: string) =>\n matchComment.test(line) === false && matchWhitespace.test(line) === false;\n\nconst parsePsl = (listContent: string) => {\n return {\n icann: extractByMarkers(\n listContent,\n PUBLIC_SUFFIX_MARKER_ICANN_START,\n PUBLIC_SUFFIX_MARKER_ICANN_END,\n )\n .split(matchNewLine)\n .filter((line) => containsRule(line))\n .map((line) => toASCII(line)),\n private: extractByMarkers(\n listContent,\n PUBLIC_SUFFIX_MARKER_PRIVATE_START,\n PUBLIC_SUFFIX_MARKER_PRIVATE_END,\n )\n .split(matchNewLine)\n .filter((line) => containsRule(line))\n .map((line) => toASCII(line)),\n };\n};\n\nexport const buildTries = (psl: string) => {\n const parsedPsl = parsePsl(psl);\n const icannTrie = createTrieFromList(parsedPsl.icann);\n const privateTrie = createTrieFromList(parsedPsl.private);\n\n return {\n icannTrie,\n privateTrie,\n };\n};\n"]}
1
+ {"version":3,"file":"build-tries.js","sourceRoot":"","sources":["../../src/psl/build-tries.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,gCAAgC,EAChC,gCAAgC,EAChC,kCAAkC,GACnC,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,MAAM,YAAY,GAAG,QAAQ,CAAC;AAC9B,MAAM,YAAY,GAAG,WAAW,CAAC;AACjC,MAAM,eAAe,GAAG,QAAQ,CAAC;AAEjC,MAAM,gBAAgB,GAAG,CAAC,WAAmB,EAAE,WAAmB,EAAE,SAAiB,EAAE,EAAE;IACvF,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE3C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,WAAW,wBAAwB,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,wBAAwB,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,EAAE,CACpC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC;AAE5E,MAAM,QAAQ,GAAG,CAAC,WAAmB,EAAE,EAAE;IACvC,OAAO;QACL,KAAK,EAAE,gBAAgB,CACrB,WAAW,EACX,gCAAgC,EAChC,8BAA8B,CAC/B;aACE,KAAK,CAAC,YAAY,CAAC;aACnB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;aACpC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,EAAE,gBAAgB,CACvB,WAAW,EACX,kCAAkC,EAClC,gCAAgC,CACjC;aACE,KAAK,CAAC,YAAY,CAAC;aACnB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;aACpC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KAChC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAW,EAA0D,EAAE;IAChG,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAE1D,OAAO;QACL,SAAS;QACT,WAAW;KACZ,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {\n PUBLIC_SUFFIX_MARKER_ICANN_END,\n PUBLIC_SUFFIX_MARKER_ICANN_START,\n PUBLIC_SUFFIX_MARKER_PRIVATE_END,\n PUBLIC_SUFFIX_MARKER_PRIVATE_START,\n} from \"../config.js\";\nimport { toASCII } from \"../punycode.js\";\nimport { createTrieFromList } from \"../trie/create-trie.js\";\nimport type { TrieRootNode } from \"../trie/nodes.js\";\n\nconst matchNewline = /\\r?\\n/u;\nconst matchComment = /^\\s*\\/\\//u;\nconst matchWhitespace = /^\\s*$/u;\n\nconst extractByMarkers = (listContent: string, startMarker: string, endMarker: string) => {\n const start = listContent.indexOf(startMarker);\n const end = listContent.indexOf(endMarker);\n\n if (start === -1) {\n throw new Error(`Missing start marker ${startMarker} in public suffix list`);\n }\n if (end === -1) {\n throw new Error(`Missing end marker ${endMarker} in public suffix list`);\n }\n\n return listContent.slice(start, end);\n};\n\nconst containsRule = (line: string) =>\n matchComment.test(line) === false && matchWhitespace.test(line) === false;\n\nconst parsePsl = (listContent: string) => {\n return {\n icann: extractByMarkers(\n listContent,\n PUBLIC_SUFFIX_MARKER_ICANN_START,\n PUBLIC_SUFFIX_MARKER_ICANN_END,\n )\n .split(matchNewline)\n .filter((line) => containsRule(line))\n .map((line) => toASCII(line)),\n private: extractByMarkers(\n listContent,\n PUBLIC_SUFFIX_MARKER_PRIVATE_START,\n PUBLIC_SUFFIX_MARKER_PRIVATE_END,\n )\n .split(matchNewline)\n .filter((line) => containsRule(line))\n .map((line) => toASCII(line)),\n };\n};\n\nexport const buildTries = (psl: string): { icannTrie: TrieRootNode; privateTrie: TrieRootNode } => {\n const parsedPsl = parsePsl(psl);\n const icannTrie = createTrieFromList(parsedPsl.icann);\n const privateTrie = createTrieFromList(parsedPsl.private);\n\n return {\n icannTrie,\n privateTrie,\n };\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-psl.d.ts","sourceRoot":"","sources":["../../src/psl/fetch-psl.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ,uBAWpB,CAAC"}
1
+ {"version":3,"file":"fetch-psl.d.ts","sourceRoot":"","sources":["../../src/psl/fetch-psl.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,QAAQ,QAAa,OAAO,CAAC,MAAM,CAW/C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-psl.js","sourceRoot":"","sources":["../../src/psl/fetch-psl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,6BAA6B,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEhF,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;IACjC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEzC,eAAe;IACf,EAAE,CACA,UAAU,CAAC,MAAM,IAAI,6BAA6B,EAClD,6CAA6C,CAC9C,CAAC;IAEF,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC","sourcesContent":["import { ok } from \"node:assert\";\nimport { FETCH_PSL_EXPECTED_MIN_LENGTH, PUBLIC_SUFFIX_URL } from \"../config.js\";\n\nexport const fetchPsl = async () => {\n const response = await fetch(PUBLIC_SUFFIX_URL);\n const pslContent = await response.text();\n\n // Sanity check\n ok(\n pslContent.length >= FETCH_PSL_EXPECTED_MIN_LENGTH,\n \"Public suffix list is shorter than expected\",\n );\n\n return pslContent;\n};\n"]}
1
+ {"version":3,"file":"fetch-psl.js","sourceRoot":"","sources":["../../src/psl/fetch-psl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEjC,OAAO,EAAE,6BAA6B,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEhF,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAqB,EAAE;IAClD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEzC,eAAe;IACf,EAAE,CACA,UAAU,CAAC,MAAM,IAAI,6BAA6B,EAClD,6CAA6C,CAC9C,CAAC;IAEF,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC","sourcesContent":["import { ok } from \"node:assert\";\n\nimport { FETCH_PSL_EXPECTED_MIN_LENGTH, PUBLIC_SUFFIX_URL } from \"../config.js\";\n\nexport const fetchPsl = async (): Promise<string> => {\n const response = await fetch(PUBLIC_SUFFIX_URL);\n const pslContent = await response.text();\n\n // Sanity check\n ok(\n pslContent.length >= FETCH_PSL_EXPECTED_MIN_LENGTH,\n \"Public suffix list is shorter than expected\",\n );\n\n return pslContent;\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"punycode.d.ts","sourceRoot":"","sources":["../src/punycode.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,GAAI,UAAU,MAAM,WAEvC,CAAC"}
1
+ {"version":3,"file":"punycode.d.ts","sourceRoot":"","sources":["../src/punycode.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,GAAI,UAAU,MAAM,KAAG,MAE1C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"punycode.js","sourceRoot":"","sources":["../src/punycode.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,QAAgB,EAAE,EAAE;IAC1C,OAAO,IAAI,GAAG,CAAC,UAAU,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;AAChD,CAAC,CAAC","sourcesContent":["export const toASCII = (hostname: string) => {\n return new URL(`http://${hostname}`).hostname;\n};\n"]}
1
+ {"version":3,"file":"punycode.js","sourceRoot":"","sources":["../src/punycode.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,QAAgB,EAAU,EAAE;IAClD,OAAO,IAAI,GAAG,CAAC,UAAU,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;AAChD,CAAC,CAAC","sourcesContent":["export const toASCII = (hostname: string): string => {\n return new URL(`http://${hostname}`).hostname;\n};\n"]}
@@ -3,16 +3,14 @@ import { NO_HOSTNAME } from "./from-url.js";
3
3
  import type { Label } from "./parse-domain.js";
4
4
  export declare enum Validation {
5
5
  /**
6
- * Allows any octets as labels but still restricts the length of labels and
7
- * the overall domain.
6
+ * Allows any octets as labels but still restricts the length of labels and the overall domain.
8
7
  *
9
8
  * @see https://www.rfc-editor.org/rfc/rfc2181#section-11
10
9
  */
11
10
  Lax = "LAX",
12
11
  /**
13
- * Only allows ASCII letters, digits and hyphens (aka LDH), forbids hyphens at
14
- * the beginning or end of a label and requires top-level domain names not to
15
- * be all-numeric.
12
+ * Only allows ASCII letters, digits and hyphens (aka LDH), forbids hyphens at the beginning or
13
+ * end of a label and requires top-level domain names not to be all-numeric.
16
14
  *
17
15
  * This is the default if no validation is configured.
18
16
  *
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAgB/C,oBAAY,UAAU;IACpB;;;;;OAKG;IACH,GAAG,QAAQ;IAEX;;;;;;;;OAQG;IACH,MAAM,WAAW;CAClB;AAED,oBAAY,mBAAmB;IAC7B,UAAU,gBAAgB;IAC1B,eAAe,sBAAsB;IACrC,cAAc,qBAAqB;IACnC,cAAc,qBAAqB;IACnC,qBAAqB,4BAA4B;IACjD,gBAAgB,uBAAuB;CACxC;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,oBAAY,sBAAsB;IAChC,OAAO,aAAa;IACpB,WAAW,iBAAiB;IAC5B,KAAK,UAAU;CAChB;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,sBAAsB,CAAC,OAAO,CAAC;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;CAC7D,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,sBAAsB,CAAC,WAAW,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,sBAAsB,CAAC,KAAK,CAAC;IACnC,MAAM,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B,yBAAyB,GACzB,6BAA6B,GAC7B,uBAAuB,CAAC;AA0D5B,eAAO,MAAM,QAAQ,GACnB,OAAO,MAAM,GAAG,OAAO,WAAW,EAClC,UAAS;IAAE,UAAU,CAAC,EAAE,UAAU,CAAA;CAAO,KACxC,kBA6DF,CAAC"}
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAgB/C,oBAAY,UAAU;IACpB;;;;OAIG;IACH,GAAG,QAAQ;IAEX;;;;;;;OAOG;IACH,MAAM,WAAW;CAClB;AAED,oBAAY,mBAAmB;IAC7B,UAAU,gBAAgB;IAC1B,eAAe,sBAAsB;IACrC,cAAc,qBAAqB;IACnC,cAAc,qBAAqB;IACnC,qBAAqB,4BAA4B;IACjD,gBAAgB,uBAAuB;CACxC;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,oBAAY,sBAAsB;IAChC,OAAO,aAAa;IACpB,WAAW,iBAAiB;IAC5B,KAAK,UAAU;CAChB;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,sBAAsB,CAAC,OAAO,CAAC;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;CAC7D,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,sBAAsB,CAAC,WAAW,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,sBAAsB,CAAC,KAAK,CAAC;IACnC,MAAM,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B,yBAAyB,GACzB,6BAA6B,GAC7B,uBAAuB,CAAC;AA0D5B,eAAO,MAAM,QAAQ,GACnB,OAAO,MAAM,GAAG,OAAO,WAAW,EAClC,UAAS;IAAE,UAAU,CAAC,EAAE,UAAU,CAAA;CAAO,KACxC,kBA4DF,CAAC"}
package/dist/sanitize.js CHANGED
@@ -15,16 +15,14 @@ const textEncoder = new TextEncoder();
15
15
  export var Validation;
16
16
  (function (Validation) {
17
17
  /**
18
- * Allows any octets as labels but still restricts the length of labels and
19
- * the overall domain.
18
+ * Allows any octets as labels but still restricts the length of labels and the overall domain.
20
19
  *
21
20
  * @see https://www.rfc-editor.org/rfc/rfc2181#section-11
22
21
  */
23
22
  Validation["Lax"] = "LAX";
24
23
  /**
25
- * Only allows ASCII letters, digits and hyphens (aka LDH), forbids hyphens at
26
- * the beginning or end of a label and requires top-level domain names not to
27
- * be all-numeric.
24
+ * Only allows ASCII letters, digits and hyphens (aka LDH), forbids hyphens at the beginning or
25
+ * end of a label and requires top-level domain names not to be all-numeric.
28
26
  *
29
27
  * This is the default if no validation is configured.
30
28
  *
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"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","sourcesContent":["import { ipVersion } from \"is-ip\";\nimport { NO_HOSTNAME } from \"./from-url.js\";\nimport type { Label } from \"./parse-domain.js\";\n\n// See https://en.wikipedia.org/wiki/Domain_name\n// See https://tools.ietf.org/html/rfc1034\nconst LABEL_SEPARATOR = \".\";\nconst LABEL_LENGTH_MIN = 1;\nconst LABEL_LENGTH_MAX = 63;\n/**\n * 255 octets - 2 octets if you remove the last dot\n *\n * @see https://devblogs.microsoft.com/oldnewthing/20120412-00/?p=7873\n */\nconst DOMAIN_LENGTH_MAX = 253;\n\nconst textEncoder = new TextEncoder();\n\nexport enum Validation {\n /**\n * Allows any octets as labels but still restricts the length of labels and\n * the overall domain.\n *\n * @see https://www.rfc-editor.org/rfc/rfc2181#section-11\n */\n Lax = \"LAX\",\n\n /**\n * Only allows ASCII letters, digits and hyphens (aka LDH), forbids hyphens at\n * the beginning or end of a label and requires top-level domain names not to\n * be all-numeric.\n *\n * This is the default if no validation is configured.\n *\n * @see https://datatracker.ietf.org/doc/html/rfc3696#section-2\n */\n Strict = \"STRICT\",\n}\n\nexport enum ValidationErrorType {\n NoHostname = \"NO_HOSTNAME\",\n DomainMaxLength = \"DOMAIN_MAX_LENGTH\",\n LabelMinLength = \"LABEL_MIN_LENGTH\",\n LabelMaxLength = \"LABEL_MAX_LENGTH\",\n LabelInvalidCharacter = \"LABEL_INVALID_CHARACTER\",\n LastLabelInvalid = \"LAST_LABEL_INVALID\",\n}\n\nexport type ValidationError = {\n type: ValidationErrorType;\n message: string;\n column: number;\n};\n\nexport enum SanitizationResultType {\n ValidIp = \"VALID_IP\",\n ValidDomain = \"VALID_DOMAIN\",\n Error = \"ERROR\",\n}\n\nexport type SanitizationResultValidIp = {\n type: SanitizationResultType.ValidIp;\n ip: string;\n ipVersion: Exclude<ReturnType<typeof ipVersion>, undefined>;\n};\n\nexport type SanitizationResultValidDomain = {\n type: SanitizationResultType.ValidDomain;\n domain: string;\n labels: Array<Label>;\n};\n\nexport type SanitizationResultError = {\n type: SanitizationResultType.Error;\n errors: Array<ValidationError>;\n};\n\nexport type SanitizationResult =\n | SanitizationResultValidIp\n | SanitizationResultValidDomain\n | SanitizationResultError;\n\nconst createNoHostnameError = (input: unknown) => {\n return {\n type: ValidationErrorType.NoHostname,\n message: `The given input ${String(input)} does not look like a hostname.`,\n column: 1,\n };\n};\n\nconst createDomainMaxLengthError = (domain: string, length: number) => {\n return {\n type: ValidationErrorType.DomainMaxLength,\n message: `Domain \"${domain}\" is too long. Domain is ${length} octets long but should not be longer than ${DOMAIN_LENGTH_MAX}.`,\n column: length,\n };\n};\n\nconst createLabelMinLengthError = (label: string, column: number) => {\n const length = label.length;\n\n return {\n type: ValidationErrorType.LabelMinLength,\n message: `Label \"${label}\" is too short. Label is ${length} octets long but should be at least ${LABEL_LENGTH_MIN}.`,\n column,\n };\n};\n\nconst createLabelMaxLengthError = (label: string, column: number) => {\n const length = label.length;\n\n return {\n type: ValidationErrorType.LabelMaxLength,\n message: `Label \"${label}\" is too long. Label is ${length} octets long but should not be longer than ${LABEL_LENGTH_MAX}.`,\n column,\n };\n};\n\nconst createLabelInvalidCharacterError = (\n label: string,\n invalidCharacter: string,\n column: number,\n) => {\n return {\n type: ValidationErrorType.LabelInvalidCharacter,\n message: `Label \"${label}\" contains invalid character \"${invalidCharacter}\" at column ${column}.`,\n column,\n };\n};\n\nconst createLastLabelInvalidError = (label: string, column: number) => {\n return {\n type: ValidationErrorType.LabelInvalidCharacter,\n message: `Last label \"${label}\" must not be all-numeric.`,\n column,\n };\n};\n\nexport const sanitize = (\n input: string | typeof NO_HOSTNAME,\n options: { validation?: Validation } = {},\n): SanitizationResult => {\n // Extra check for non-TypeScript users\n if (typeof input !== \"string\") {\n return {\n type: SanitizationResultType.Error,\n errors: [createNoHostnameError(input)],\n };\n }\n\n if (input === \"\") {\n return {\n type: SanitizationResultType.ValidDomain,\n domain: input,\n labels: [],\n };\n }\n\n // IPv6 addresses are surrounded by square brackets in URLs\n // See https://tools.ietf.org/html/rfc3986#section-3.2.2\n const inputTrimmedAsIp = input.replaceAll(/^\\[|]$/g, \"\");\n const ipVersionOfInput = ipVersion(inputTrimmedAsIp);\n\n if (ipVersionOfInput !== undefined) {\n return {\n type: SanitizationResultType.ValidIp,\n ip: inputTrimmedAsIp,\n ipVersion: ipVersionOfInput,\n };\n }\n\n // We do not want to break compatibility with older engines unnecessarily.\n // eslint-disable-next-line unicorn/prefer-at\n const lastChar = input[input.length - 1]!;\n const canonicalInput =\n lastChar === LABEL_SEPARATOR ? input.slice(0, -1) : input;\n const octets = new TextEncoder().encode(canonicalInput);\n\n if (octets.length > DOMAIN_LENGTH_MAX) {\n return {\n type: SanitizationResultType.Error,\n errors: [createDomainMaxLengthError(input, octets.length)],\n };\n }\n\n const labels = canonicalInput.split(LABEL_SEPARATOR);\n\n const { validation = Validation.Strict } = options;\n const labelValidationErrors = validateLabels[validation](labels);\n\n if (labelValidationErrors.length > 0) {\n return {\n type: SanitizationResultType.Error,\n errors: labelValidationErrors,\n };\n }\n\n return {\n type: SanitizationResultType.ValidDomain,\n domain: input,\n labels,\n };\n};\n\nconst validateLabels = {\n [Validation.Lax]: (labels: Array<string>) => {\n const labelValidationErrors = [];\n let column = 1;\n\n for (const label of labels) {\n const octets = textEncoder.encode(label);\n\n if (octets.length < LABEL_LENGTH_MIN) {\n labelValidationErrors.push(createLabelMinLengthError(label, column));\n } else if (octets.length > LABEL_LENGTH_MAX) {\n labelValidationErrors.push(createLabelMaxLengthError(label, column));\n }\n column += label.length + LABEL_SEPARATOR.length;\n }\n\n return labelValidationErrors;\n },\n [Validation.Strict]: (labels: Array<string>) => {\n const labelValidationErrors = [];\n let column = 1;\n let lastLabel: string | undefined;\n\n for (const label of labels) {\n // According to https://tools.ietf.org/html/rfc6761 labels should\n // only contain ASCII letters, digits and hyphens (LDH).\n const invalidCharacter = /[^\\da-z-]/i.exec(label);\n\n if (invalidCharacter) {\n labelValidationErrors.push(\n createLabelInvalidCharacterError(\n label,\n invalidCharacter[0],\n invalidCharacter.index + 1,\n ),\n );\n }\n if (label.startsWith(\"-\")) {\n labelValidationErrors.push(\n createLabelInvalidCharacterError(label, \"-\", column),\n );\n } else if (label.endsWith(\"-\")) {\n labelValidationErrors.push(\n createLabelInvalidCharacterError(\n label,\n \"-\",\n column + label.length - 1,\n ),\n );\n }\n if (\n // We can use .length here to check for the octet size because\n // label can only contain ASCII LDH characters at this point.\n label.length < LABEL_LENGTH_MIN\n ) {\n labelValidationErrors.push(createLabelMinLengthError(label, column));\n } else if (label.length > LABEL_LENGTH_MAX) {\n labelValidationErrors.push(createLabelMaxLengthError(label, column));\n }\n\n column += label.length + LABEL_SEPARATOR.length;\n lastLabel = label;\n }\n\n if (lastLabel !== undefined && /[a-z-]/iu.test(lastLabel) === false) {\n labelValidationErrors.push(\n createLastLabelInvalidError(\n lastLabel,\n column - lastLabel.length - LABEL_SEPARATOR.length,\n ),\n );\n }\n\n return labelValidationErrors;\n },\n};\n"]}
1
+ {"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"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","sourcesContent":["import { ipVersion } from \"is-ip\";\n\nimport { NO_HOSTNAME } from \"./from-url.js\";\nimport type { Label } from \"./parse-domain.js\";\n\n// See https://en.wikipedia.org/wiki/Domain_name\n// See https://tools.ietf.org/html/rfc1034\nconst LABEL_SEPARATOR = \".\";\nconst LABEL_LENGTH_MIN = 1;\nconst LABEL_LENGTH_MAX = 63;\n/**\n * 255 octets - 2 octets if you remove the last dot\n *\n * @see https://devblogs.microsoft.com/oldnewthing/20120412-00/?p=7873\n */\nconst DOMAIN_LENGTH_MAX = 253;\n\nconst textEncoder = new TextEncoder();\n\nexport enum Validation {\n /**\n * Allows any octets as labels but still restricts the length of labels and the overall domain.\n *\n * @see https://www.rfc-editor.org/rfc/rfc2181#section-11\n */\n Lax = \"LAX\",\n\n /**\n * Only allows ASCII letters, digits and hyphens (aka LDH), forbids hyphens at the beginning or\n * end of a label and requires top-level domain names not to be all-numeric.\n *\n * This is the default if no validation is configured.\n *\n * @see https://datatracker.ietf.org/doc/html/rfc3696#section-2\n */\n Strict = \"STRICT\",\n}\n\nexport enum ValidationErrorType {\n NoHostname = \"NO_HOSTNAME\",\n DomainMaxLength = \"DOMAIN_MAX_LENGTH\",\n LabelMinLength = \"LABEL_MIN_LENGTH\",\n LabelMaxLength = \"LABEL_MAX_LENGTH\",\n LabelInvalidCharacter = \"LABEL_INVALID_CHARACTER\",\n LastLabelInvalid = \"LAST_LABEL_INVALID\",\n}\n\nexport type ValidationError = {\n type: ValidationErrorType;\n message: string;\n column: number;\n};\n\nexport enum SanitizationResultType {\n ValidIp = \"VALID_IP\",\n ValidDomain = \"VALID_DOMAIN\",\n Error = \"ERROR\",\n}\n\nexport type SanitizationResultValidIp = {\n type: SanitizationResultType.ValidIp;\n ip: string;\n ipVersion: Exclude<ReturnType<typeof ipVersion>, undefined>;\n};\n\nexport type SanitizationResultValidDomain = {\n type: SanitizationResultType.ValidDomain;\n domain: string;\n labels: Array<Label>;\n};\n\nexport type SanitizationResultError = {\n type: SanitizationResultType.Error;\n errors: Array<ValidationError>;\n};\n\nexport type SanitizationResult =\n | SanitizationResultValidIp\n | SanitizationResultValidDomain\n | SanitizationResultError;\n\nconst createNoHostnameError = (input: unknown) => {\n return {\n type: ValidationErrorType.NoHostname,\n message: `The given input ${String(input)} does not look like a hostname.`,\n column: 1,\n };\n};\n\nconst createDomainMaxLengthError = (domain: string, length: number) => {\n return {\n type: ValidationErrorType.DomainMaxLength,\n message: `Domain \"${domain}\" is too long. Domain is ${length} octets long but should not be longer than ${DOMAIN_LENGTH_MAX}.`,\n column: length,\n };\n};\n\nconst createLabelMinLengthError = (label: string, column: number) => {\n const length = label.length;\n\n return {\n type: ValidationErrorType.LabelMinLength,\n message: `Label \"${label}\" is too short. Label is ${length} octets long but should be at least ${LABEL_LENGTH_MIN}.`,\n column,\n };\n};\n\nconst createLabelMaxLengthError = (label: string, column: number) => {\n const length = label.length;\n\n return {\n type: ValidationErrorType.LabelMaxLength,\n message: `Label \"${label}\" is too long. Label is ${length} octets long but should not be longer than ${LABEL_LENGTH_MAX}.`,\n column,\n };\n};\n\nconst createLabelInvalidCharacterError = (\n label: string,\n invalidCharacter: string,\n column: number,\n) => {\n return {\n type: ValidationErrorType.LabelInvalidCharacter,\n message: `Label \"${label}\" contains invalid character \"${invalidCharacter}\" at column ${column}.`,\n column,\n };\n};\n\nconst createLastLabelInvalidError = (label: string, column: number) => {\n return {\n type: ValidationErrorType.LabelInvalidCharacter,\n message: `Last label \"${label}\" must not be all-numeric.`,\n column,\n };\n};\n\nexport const sanitize = (\n input: string | typeof NO_HOSTNAME,\n options: { validation?: Validation } = {},\n): SanitizationResult => {\n // Extra check for non-TypeScript users\n if (typeof input !== \"string\") {\n return {\n type: SanitizationResultType.Error,\n errors: [createNoHostnameError(input)],\n };\n }\n\n if (input === \"\") {\n return {\n type: SanitizationResultType.ValidDomain,\n domain: input,\n labels: [],\n };\n }\n\n // IPv6 addresses are surrounded by square brackets in URLs\n // See https://tools.ietf.org/html/rfc3986#section-3.2.2\n const inputTrimmedAsIp = input.replaceAll(/^\\[|]$/g, \"\");\n const ipVersionOfInput = ipVersion(inputTrimmedAsIp);\n\n if (ipVersionOfInput !== undefined) {\n return {\n type: SanitizationResultType.ValidIp,\n ip: inputTrimmedAsIp,\n ipVersion: ipVersionOfInput,\n };\n }\n\n // We do not want to break compatibility with older engines unnecessarily.\n // eslint-disable-next-line unicorn/prefer-at\n const lastChar = input[input.length - 1]!;\n const canonicalInput = lastChar === LABEL_SEPARATOR ? input.slice(0, -1) : input;\n const octets = new TextEncoder().encode(canonicalInput);\n\n if (octets.length > DOMAIN_LENGTH_MAX) {\n return {\n type: SanitizationResultType.Error,\n errors: [createDomainMaxLengthError(input, octets.length)],\n };\n }\n\n const labels = canonicalInput.split(LABEL_SEPARATOR);\n\n const { validation = Validation.Strict } = options;\n const labelValidationErrors = validateLabels[validation](labels);\n\n if (labelValidationErrors.length > 0) {\n return {\n type: SanitizationResultType.Error,\n errors: labelValidationErrors,\n };\n }\n\n return {\n type: SanitizationResultType.ValidDomain,\n domain: input,\n labels,\n };\n};\n\nconst validateLabels = {\n [Validation.Lax]: (labels: Array<string>) => {\n const labelValidationErrors = [];\n let column = 1;\n\n for (const label of labels) {\n const octets = textEncoder.encode(label);\n\n if (octets.length < LABEL_LENGTH_MIN) {\n labelValidationErrors.push(createLabelMinLengthError(label, column));\n } else if (octets.length > LABEL_LENGTH_MAX) {\n labelValidationErrors.push(createLabelMaxLengthError(label, column));\n }\n column += label.length + LABEL_SEPARATOR.length;\n }\n\n return labelValidationErrors;\n },\n [Validation.Strict]: (labels: Array<string>) => {\n const labelValidationErrors = [];\n let column = 1;\n let lastLabel: string | undefined;\n\n for (const label of labels) {\n // According to https://tools.ietf.org/html/rfc6761 labels should\n // only contain ASCII letters, digits and hyphens (LDH).\n const invalidCharacter = /[^\\da-z-]/i.exec(label);\n\n if (invalidCharacter) {\n labelValidationErrors.push(\n createLabelInvalidCharacterError(label, invalidCharacter[0], invalidCharacter.index + 1),\n );\n }\n if (label.startsWith(\"-\")) {\n labelValidationErrors.push(createLabelInvalidCharacterError(label, \"-\", column));\n } else if (label.endsWith(\"-\")) {\n labelValidationErrors.push(\n createLabelInvalidCharacterError(label, \"-\", column + label.length - 1),\n );\n }\n if (\n // We can use .length here to check for the octet size because\n // label can only contain ASCII LDH characters at this point.\n label.length < LABEL_LENGTH_MIN\n ) {\n labelValidationErrors.push(createLabelMinLengthError(label, column));\n } else if (label.length > LABEL_LENGTH_MAX) {\n labelValidationErrors.push(createLabelMaxLengthError(label, column));\n }\n\n column += label.length + LABEL_SEPARATOR.length;\n lastLabel = label;\n }\n\n if (lastLabel !== undefined && /[a-z-]/iu.test(lastLabel) === false) {\n labelValidationErrors.push(\n createLastLabelInvalidError(lastLabel, column - lastLabel.length - LABEL_SEPARATOR.length),\n );\n }\n\n return labelValidationErrors;\n },\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"update-psl-fixture.js","sourceRoot":"","sources":["../../src/scripts/update-psl-fixture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CACnC,MAAM,CAAC,IAAI,CAAC,OAAO,EACnB,IAAI,EACJ,OAAO,EACP,UAAU,EACV,wBAAwB,CACzB,CAAC;AAEF,MAAM,GAAG,GAAG,MAAM,QAAQ,EAAE,CAAC;AAE7B,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC","sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fetchPsl } from \"../psl/fetch-psl.js\";\n\nconst pathToPslFixture = path.resolve(\n import.meta.dirname,\n \"..\",\n \"tests\",\n \"fixtures\",\n \"public-suffix-list.txt\",\n);\n\nconst psl = await fetchPsl();\n\nawait fs.promises.writeFile(pathToPslFixture, psl);\n"]}
1
+ {"version":3,"file":"update-psl-fixture.js","sourceRoot":"","sources":["../../src/scripts/update-psl-fixture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CACnC,MAAM,CAAC,IAAI,CAAC,OAAO,EACnB,IAAI,EACJ,OAAO,EACP,UAAU,EACV,wBAAwB,CACzB,CAAC;AAEF,MAAM,GAAG,GAAG,MAAM,QAAQ,EAAE,CAAC;AAE7B,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC","sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport { fetchPsl } from \"../psl/fetch-psl.js\";\n\nconst pathToPslFixture = path.resolve(\n import.meta.dirname,\n \"..\",\n \"tests\",\n \"fixtures\",\n \"public-suffix-list.txt\",\n);\n\nconst psl = await fetchPsl();\n\nawait fs.promises.writeFile(pathToPslFixture, psl);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"update-tries.js","sourceRoot":"","sources":["../../src/scripts/update-tries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,iBAAiB,GAAG,KAAK,EAAE,EAC/B,mBAAmB,EACnB,qBAAqB,GAC8B,EAAE,EAAE;IACvD,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACxD,MAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;IAEnE,MAAM,OAAO,CAAC,GAAG,CACf,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE;QAC9C,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAClC,MAAM,CAAC,IAAI,CAAC,OAAO,EACnB,eAAe,EACf,UAAU,CACX,CAAC;QACF,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CACpC,MAAM,CAAC,IAAI,CAAC,OAAO,EACnB,eAAe,EACf,YAAY,CACb,CAAC;QACF,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CACrC,MAAM,CAAC,IAAI,CAAC,OAAO,EACnB,eAAe,EACf,WAAW,CACZ,CAAC;QAEF,OAAO,CAAC,IAAI,CAAC,WAAW,eAAe,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,WAAW,iBAAiB,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,WAAW,kBAAkB,KAAK,CAAC,CAAC;QAEjD,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,EAAE,CAAC,QAAQ,CAAC,SAAS,CACnB,eAAe,EACf,kBAAkB,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,GAAG,CACzD;YACD,EAAE,CAAC,QAAQ,CAAC,SAAS,CACnB,iBAAiB,EACjB,kBAAkB,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,GAAG,CAC3D;YACD,EAAE,CAAC,QAAQ,CAAC,SAAS,CACnB,kBAAkB,EAClB,IAAI,CAAC,SAAS,CAAC;gBACb,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC,CACH;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,CAAC,IAAI,CAAC,oCAAoC,iBAAiB,KAAK,CAAC,CAAC;AAEzE,MAAM,iBAAiB,CAAC,MAAM,wBAAwB,EAAE,CAAC,CAAC","sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { PUBLIC_SUFFIX_URL } from \"../config.js\";\nimport type { Await } from \"../type-util.js\";\nimport { fetchBuildSerializeTries } from \"../update-tries.js\";\n\nconst writeTriesToFiles = async ({\n serializedIcannTrie,\n serializedPrivateTrie,\n}: Await<ReturnType<typeof fetchBuildSerializeTries>>) => {\n const indexOfScriptArg = process.argv.lastIndexOf(\"--\");\n const targetDirectories = process.argv.slice(indexOfScriptArg + 1);\n\n await Promise.all(\n targetDirectories.map(async (targetDirectory) => {\n const pathToIcannTrie = path.resolve(\n import.meta.dirname,\n targetDirectory,\n \"icann.js\",\n );\n const pathToPrivateTrie = path.resolve(\n import.meta.dirname,\n targetDirectory,\n \"private.js\",\n );\n const pathToTrieInfoFile = path.resolve(\n import.meta.dirname,\n targetDirectory,\n \"info.json\",\n );\n\n console.warn(`Writing ${pathToIcannTrie}...`);\n console.warn(`Writing ${pathToPrivateTrie}...`);\n console.warn(`Writing ${pathToTrieInfoFile}...`);\n\n await Promise.all([\n fs.promises.writeFile(\n pathToIcannTrie,\n `export default ${JSON.stringify(serializedIcannTrie)};`,\n ),\n fs.promises.writeFile(\n pathToPrivateTrie,\n `export default ${JSON.stringify(serializedPrivateTrie)};`,\n ),\n fs.promises.writeFile(\n pathToTrieInfoFile,\n JSON.stringify({\n updatedAt: new Date(),\n }),\n ),\n ]);\n }),\n );\n};\n\nconsole.warn(`Fetching public suffix list from ${PUBLIC_SUFFIX_URL}...`);\n\nawait writeTriesToFiles(await fetchBuildSerializeTries());\n"]}
1
+ {"version":3,"file":"update-tries.js","sourceRoot":"","sources":["../../src/scripts/update-tries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,iBAAiB,GAAG,KAAK,EAAE,EAC/B,mBAAmB,EACnB,qBAAqB,GAC8B,EAAE,EAAE;IACvD,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACxD,MAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;IAEnE,MAAM,OAAO,CAAC,GAAG,CACf,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE;QAC9C,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;QACvF,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;QAC3F,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,WAAW,CAAC,CAAC;QAE3F,OAAO,CAAC,IAAI,CAAC,WAAW,eAAe,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,WAAW,iBAAiB,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,WAAW,kBAAkB,KAAK,CAAC,CAAC;QAEjD,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,EAAE,CAAC,QAAQ,CAAC,SAAS,CACnB,eAAe,EACf,kBAAkB,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,GAAG,CACzD;YACD,EAAE,CAAC,QAAQ,CAAC,SAAS,CACnB,iBAAiB,EACjB,kBAAkB,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,GAAG,CAC3D;YACD,EAAE,CAAC,QAAQ,CAAC,SAAS,CACnB,kBAAkB,EAClB,IAAI,CAAC,SAAS,CAAC;gBACb,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC,CACH;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,CAAC,IAAI,CAAC,oCAAoC,iBAAiB,KAAK,CAAC,CAAC;AAEzE,MAAM,iBAAiB,CAAC,MAAM,wBAAwB,EAAE,CAAC,CAAC","sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport { PUBLIC_SUFFIX_URL } from \"../config.js\";\nimport type { Await } from \"../type-util.js\";\nimport { fetchBuildSerializeTries } from \"../update-tries.js\";\n\nconst writeTriesToFiles = async ({\n serializedIcannTrie,\n serializedPrivateTrie,\n}: Await<ReturnType<typeof fetchBuildSerializeTries>>) => {\n const indexOfScriptArg = process.argv.lastIndexOf(\"--\");\n const targetDirectories = process.argv.slice(indexOfScriptArg + 1);\n\n await Promise.all(\n targetDirectories.map(async (targetDirectory) => {\n const pathToIcannTrie = path.resolve(import.meta.dirname, targetDirectory, \"icann.js\");\n const pathToPrivateTrie = path.resolve(import.meta.dirname, targetDirectory, \"private.js\");\n const pathToTrieInfoFile = path.resolve(import.meta.dirname, targetDirectory, \"info.json\");\n\n console.warn(`Writing ${pathToIcannTrie}...`);\n console.warn(`Writing ${pathToPrivateTrie}...`);\n console.warn(`Writing ${pathToTrieInfoFile}...`);\n\n await Promise.all([\n fs.promises.writeFile(\n pathToIcannTrie,\n `export default ${JSON.stringify(serializedIcannTrie)};`,\n ),\n fs.promises.writeFile(\n pathToPrivateTrie,\n `export default ${JSON.stringify(serializedPrivateTrie)};`,\n ),\n fs.promises.writeFile(\n pathToTrieInfoFile,\n JSON.stringify({\n updatedAt: new Date(),\n }),\n ),\n ]);\n }),\n );\n};\n\nconsole.warn(`Fetching public suffix list from ${PUBLIC_SUFFIX_URL}...`);\n\nawait writeTriesToFiles(await fetchBuildSerializeTries());\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"smoke-test.d.ts","sourceRoot":"","sources":["../src/smoke-test.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,YAqDxB,CAAC"}
1
+ {"version":3,"file":"smoke-test.d.ts","sourceRoot":"","sources":["../src/smoke-test.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,YAAY,QAAO,IAqD/B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"smoke-test.js","sourceRoot":"","sources":["../src/smoke-test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAElE,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE;IAC/B,eAAe,CAAC,WAAW,CAAC,iBAAiB,CAAC,EAAE;QAC9C,QAAQ,EAAE,iBAAiB;QAC3B,IAAI,EAAE,eAAe,CAAC,MAAM;QAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC;QACjC,UAAU,EAAE,CAAC,KAAK,CAAC;QACnB,MAAM,EAAE,SAAS;QACjB,eAAe,EAAE,CAAC,KAAK,CAAC;QACxB,KAAK,EAAE;YACL,UAAU,EAAE,CAAC,KAAK,CAAC;YACnB,MAAM,EAAE,SAAS;YACjB,eAAe,EAAE,CAAC,KAAK,CAAC;SACzB;KACF,CAAC,CAAC;IACH,eAAe,CAAC,WAAW,CAAC,mBAAmB,CAAC,EAAE;QAChD,QAAQ,EAAE,mBAAmB;QAC7B,IAAI,EAAE,eAAe,CAAC,MAAM;QAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC;QACtC,UAAU,EAAE,CAAC,KAAK,CAAC;QACnB,MAAM,EAAE,SAAS;QACjB,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;QAC7B,KAAK,EAAE;YACL,UAAU,EAAE,CAAC,KAAK,CAAC;YACnB,MAAM,EAAE,SAAS;YACjB,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;SAC9B;KACF,CAAC,CAAC;IACH,eAAe,CAAC,WAAW,CAAC,4BAA4B,CAAC,EAAE;QACzD,QAAQ,EAAE,4BAA4B;QACtC,IAAI,EAAE,eAAe,CAAC,MAAM;QAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,CAAC;QAC/C,UAAU,EAAE,CAAC,KAAK,CAAC;QACnB,MAAM,EAAE,SAAS;QACjB,eAAe,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC;QACtC,KAAK,EAAE;YACL,UAAU,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC;YAC9B,MAAM,EAAE,YAAY;YACpB,eAAe,EAAE,CAAC,KAAK,CAAC;SACzB;KACF,CAAC,CAAC;IACH,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE;QACpD,QAAQ,EAAE,+BAA+B;QACzC,IAAI,EAAE,eAAe,CAAC,MAAM;QAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,CAAC;QAClD,UAAU,EAAE,CAAC,KAAK,CAAC;QACnB,MAAM,EAAE,aAAa;QACrB,eAAe,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC;QACrC,KAAK,EAAE;YACL,UAAU,EAAE,CAAC,KAAK,CAAC;YACnB,MAAM,EAAE,aAAa;YACrB,eAAe,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC;SACtC;KACF,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { deepStrictEqual } from \"node:assert\";\nimport { fromUrl, parseDomain, ParseResultType } from \"./main.js\";\n\nexport const runSmokeTest = () => {\n deepStrictEqual(parseDomain(\"www.example.com\"), {\n hostname: \"www.example.com\",\n type: ParseResultType.Listed,\n labels: [\"www\", \"example\", \"com\"],\n subDomains: [\"www\"],\n domain: \"example\",\n topLevelDomains: [\"com\"],\n icann: {\n subDomains: [\"www\"],\n domain: \"example\",\n topLevelDomains: [\"com\"],\n },\n });\n deepStrictEqual(parseDomain(\"www.example.co.uk\"), {\n hostname: \"www.example.co.uk\",\n type: ParseResultType.Listed,\n labels: [\"www\", \"example\", \"co\", \"uk\"],\n subDomains: [\"www\"],\n domain: \"example\",\n topLevelDomains: [\"co\", \"uk\"],\n icann: {\n subDomains: [\"www\"],\n domain: \"example\",\n topLevelDomains: [\"co\", \"uk\"],\n },\n });\n deepStrictEqual(parseDomain(\"www.example.cloudfront.net\"), {\n hostname: \"www.example.cloudfront.net\",\n type: ParseResultType.Listed,\n labels: [\"www\", \"example\", \"cloudfront\", \"net\"],\n subDomains: [\"www\"],\n domain: \"example\",\n topLevelDomains: [\"cloudfront\", \"net\"],\n icann: {\n subDomains: [\"www\", \"example\"],\n domain: \"cloudfront\",\n topLevelDomains: [\"net\"],\n },\n });\n deepStrictEqual(parseDomain(fromUrl(\"www.食狮.公司.cn\")), {\n hostname: \"www.xn--85x722f.xn--55qx5d.cn\",\n type: ParseResultType.Listed,\n labels: [\"www\", \"xn--85x722f\", \"xn--55qx5d\", \"cn\"],\n subDomains: [\"www\"],\n domain: \"xn--85x722f\",\n topLevelDomains: [\"xn--55qx5d\", \"cn\"],\n icann: {\n subDomains: [\"www\"],\n domain: \"xn--85x722f\",\n topLevelDomains: [\"xn--55qx5d\", \"cn\"],\n },\n });\n};\n"]}
1
+ {"version":3,"file":"smoke-test.js","sourceRoot":"","sources":["../src/smoke-test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAElE,MAAM,CAAC,MAAM,YAAY,GAAG,GAAS,EAAE;IACrC,eAAe,CAAC,WAAW,CAAC,iBAAiB,CAAC,EAAE;QAC9C,QAAQ,EAAE,iBAAiB;QAC3B,IAAI,EAAE,eAAe,CAAC,MAAM;QAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC;QACjC,UAAU,EAAE,CAAC,KAAK,CAAC;QACnB,MAAM,EAAE,SAAS;QACjB,eAAe,EAAE,CAAC,KAAK,CAAC;QACxB,KAAK,EAAE;YACL,UAAU,EAAE,CAAC,KAAK,CAAC;YACnB,MAAM,EAAE,SAAS;YACjB,eAAe,EAAE,CAAC,KAAK,CAAC;SACzB;KACF,CAAC,CAAC;IACH,eAAe,CAAC,WAAW,CAAC,mBAAmB,CAAC,EAAE;QAChD,QAAQ,EAAE,mBAAmB;QAC7B,IAAI,EAAE,eAAe,CAAC,MAAM;QAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC;QACtC,UAAU,EAAE,CAAC,KAAK,CAAC;QACnB,MAAM,EAAE,SAAS;QACjB,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;QAC7B,KAAK,EAAE;YACL,UAAU,EAAE,CAAC,KAAK,CAAC;YACnB,MAAM,EAAE,SAAS;YACjB,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;SAC9B;KACF,CAAC,CAAC;IACH,eAAe,CAAC,WAAW,CAAC,4BAA4B,CAAC,EAAE;QACzD,QAAQ,EAAE,4BAA4B;QACtC,IAAI,EAAE,eAAe,CAAC,MAAM;QAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,CAAC;QAC/C,UAAU,EAAE,CAAC,KAAK,CAAC;QACnB,MAAM,EAAE,SAAS;QACjB,eAAe,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC;QACtC,KAAK,EAAE;YACL,UAAU,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC;YAC9B,MAAM,EAAE,YAAY;YACpB,eAAe,EAAE,CAAC,KAAK,CAAC;SACzB;KACF,CAAC,CAAC;IACH,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE;QACpD,QAAQ,EAAE,+BAA+B;QACzC,IAAI,EAAE,eAAe,CAAC,MAAM;QAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,CAAC;QAClD,UAAU,EAAE,CAAC,KAAK,CAAC;QACnB,MAAM,EAAE,aAAa;QACrB,eAAe,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC;QACrC,KAAK,EAAE;YACL,UAAU,EAAE,CAAC,KAAK,CAAC;YACnB,MAAM,EAAE,aAAa;YACrB,eAAe,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC;SACtC;KACF,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { deepStrictEqual } from \"node:assert\";\n\nimport { fromUrl, parseDomain, ParseResultType } from \"./main.js\";\n\nexport const runSmokeTest = (): void => {\n deepStrictEqual(parseDomain(\"www.example.com\"), {\n hostname: \"www.example.com\",\n type: ParseResultType.Listed,\n labels: [\"www\", \"example\", \"com\"],\n subDomains: [\"www\"],\n domain: \"example\",\n topLevelDomains: [\"com\"],\n icann: {\n subDomains: [\"www\"],\n domain: \"example\",\n topLevelDomains: [\"com\"],\n },\n });\n deepStrictEqual(parseDomain(\"www.example.co.uk\"), {\n hostname: \"www.example.co.uk\",\n type: ParseResultType.Listed,\n labels: [\"www\", \"example\", \"co\", \"uk\"],\n subDomains: [\"www\"],\n domain: \"example\",\n topLevelDomains: [\"co\", \"uk\"],\n icann: {\n subDomains: [\"www\"],\n domain: \"example\",\n topLevelDomains: [\"co\", \"uk\"],\n },\n });\n deepStrictEqual(parseDomain(\"www.example.cloudfront.net\"), {\n hostname: \"www.example.cloudfront.net\",\n type: ParseResultType.Listed,\n labels: [\"www\", \"example\", \"cloudfront\", \"net\"],\n subDomains: [\"www\"],\n domain: \"example\",\n topLevelDomains: [\"cloudfront\", \"net\"],\n icann: {\n subDomains: [\"www\", \"example\"],\n domain: \"cloudfront\",\n topLevelDomains: [\"net\"],\n },\n });\n deepStrictEqual(parseDomain(fromUrl(\"www.食狮.公司.cn\")), {\n hostname: \"www.xn--85x722f.xn--55qx5d.cn\",\n type: ParseResultType.Listed,\n labels: [\"www\", \"xn--85x722f\", \"xn--55qx5d\", \"cn\"],\n subDomains: [\"www\"],\n domain: \"xn--85x722f\",\n topLevelDomains: [\"xn--55qx5d\", \"cn\"],\n icann: {\n subDomains: [\"www\"],\n domain: \"xn--85x722f\",\n topLevelDomains: [\"xn--55qx5d\", \"cn\"],\n },\n });\n};\n"]}
@@ -1,2 +1,3 @@
1
- export declare const createTrieFromList: (list: Array<string>) => import("./nodes.js").TrieRootNode;
1
+ import { type TrieRootNode } from "./nodes.js";
2
+ export declare const createTrieFromList: (list: Array<string>) => TrieRootNode;
2
3
  //# sourceMappingURL=create-trie.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-trie.d.ts","sourceRoot":"","sources":["../../src/trie/create-trie.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,kBAAkB,GAAI,MAAM,KAAK,CAAC,MAAM,CAAC,sCAcrD,CAAC"}
1
+ {"version":3,"file":"create-trie.d.ts","sourceRoot":"","sources":["../../src/trie/create-trie.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmD,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEhG,eAAO,MAAM,kBAAkB,GAAI,MAAM,KAAK,CAAC,MAAM,CAAC,KAAG,YAcxD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"create-trie.js","sourceRoot":"","sources":["../../src/trie/create-trie.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAiB,MAAM,YAAY,CAAC;AAE7E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAmB,EAAE,EAAE;IACxD,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,IAAI,GAAa,IAAI,CAAC;QAE1B,0EAA0E;QAC1E,oDAAoD;QACpD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9C,IAAI,GAAG,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC","sourcesContent":["import { createOrGetChild, createRootNode, type TrieNode } from \"./nodes.js\";\n\nexport const createTrieFromList = (list: Array<string>) => {\n const root = createRootNode();\n\n for (const rule of list) {\n let node: TrieNode = root;\n\n // We do not want to break compatibility with older engines unnecessarily.\n // eslint-disable-next-line unicorn/no-array-reverse\n for (const label of rule.split(\".\").reverse()) {\n node = createOrGetChild(node, label);\n }\n }\n\n return root;\n};\n"]}
1
+ {"version":3,"file":"create-trie.js","sourceRoot":"","sources":["../../src/trie/create-trie.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAoC,MAAM,YAAY,CAAC;AAEhG,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAmB,EAAgB,EAAE;IACtE,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,IAAI,GAAa,IAAI,CAAC;QAE1B,0EAA0E;QAC1E,oDAAoD;QACpD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9C,IAAI,GAAG,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC","sourcesContent":["import { createOrGetChild, createRootNode, type TrieNode, type TrieRootNode } from \"./nodes.js\";\n\nexport const createTrieFromList = (list: Array<string>): TrieRootNode => {\n const root = createRootNode();\n\n for (const rule of list) {\n let node: TrieNode = root;\n\n // We do not want to break compatibility with older engines unnecessarily.\n // eslint-disable-next-line unicorn/no-array-reverse\n for (const label of rule.split(\".\").reverse()) {\n node = createOrGetChild(node, label);\n }\n }\n\n return root;\n};\n"]}
@@ -1,4 +1,4 @@
1
1
  import type { Label } from "../parse-domain.js";
2
2
  import type { TrieNode } from "./nodes.js";
3
- export declare const lookUpTldsInTrie: (labels: Array<Label>, trie: TrieNode) => string[];
3
+ export declare const lookUpTldsInTrie: (labels: Array<Label>, trie: TrieNode) => Array<Label>;
4
4
  //# sourceMappingURL=look-up.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"look-up.d.ts","sourceRoot":"","sources":["../../src/trie/look-up.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,gBAAgB,GAAI,QAAQ,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,QAAQ,aAyBpE,CAAC"}
1
+ {"version":3,"file":"look-up.d.ts","sourceRoot":"","sources":["../../src/trie/look-up.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,gBAAgB,GAAI,QAAQ,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,QAAQ,KAAG,KAAK,CAAC,KAAK,CAyBlF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"look-up.js","sourceRoot":"","sources":["../../src/trie/look-up.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAG9C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAoB,EAAE,IAAc,EAAE,EAAE;IACvE,MAAM,aAAa,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IAClC,MAAM,IAAI,GAAiB,EAAE,CAAC;IAC9B,IAAI,IAAI,GAAG,IAAI,CAAC;IAEhB,OAAO,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,EAAG,CAAC;QACnC,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAE3C,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3C,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,GAAG,cAAc,CAAC,EAAE,CAAC;gBAC7D,MAAM;YACR,CAAC;YACD,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAa,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,KAAK,EAAE,CAAC;gBAChD,MAAM;YACR,CAAC;YACD,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAa,CAAC;QACvD,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC","sourcesContent":["import type { Label } from \"../parse-domain.js\";\nimport * as characters from \"./characters.js\";\nimport type { TrieNode } from \"./nodes.js\";\n\nexport const lookUpTldsInTrie = (labels: Array<Label>, trie: TrieNode) => {\n const labelsToCheck = [...labels];\n const tlds: Array<Label> = [];\n let node = trie;\n\n while (labelsToCheck.length > 0) {\n const label = labelsToCheck.pop()!;\n const labelLowerCase = label.toLowerCase();\n\n if (node.children.has(characters.WILDCARD)) {\n if (node.children.has(characters.EXCEPTION + labelLowerCase)) {\n break;\n }\n node = node.children.get(characters.WILDCARD) as TrieNode;\n } else {\n if (node.children.has(labelLowerCase) === false) {\n break;\n }\n node = node.children.get(labelLowerCase) as TrieNode;\n }\n\n tlds.unshift(label);\n }\n\n return tlds;\n};\n"]}
1
+ {"version":3,"file":"look-up.js","sourceRoot":"","sources":["../../src/trie/look-up.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAG9C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAoB,EAAE,IAAc,EAAgB,EAAE;IACrF,MAAM,aAAa,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IAClC,MAAM,IAAI,GAAiB,EAAE,CAAC;IAC9B,IAAI,IAAI,GAAG,IAAI,CAAC;IAEhB,OAAO,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,EAAG,CAAC;QACnC,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAE3C,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3C,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,GAAG,cAAc,CAAC,EAAE,CAAC;gBAC7D,MAAM;YACR,CAAC;YACD,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAa,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,KAAK,EAAE,CAAC;gBAChD,MAAM;YACR,CAAC;YACD,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAa,CAAC;QACvD,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC","sourcesContent":["import type { Label } from \"../parse-domain.js\";\nimport * as characters from \"./characters.js\";\nimport type { TrieNode } from \"./nodes.js\";\n\nexport const lookUpTldsInTrie = (labels: Array<Label>, trie: TrieNode): Array<Label> => {\n const labelsToCheck = [...labels];\n const tlds: Array<Label> = [];\n let node = trie;\n\n while (labelsToCheck.length > 0) {\n const label = labelsToCheck.pop()!;\n const labelLowerCase = label.toLowerCase();\n\n if (node.children.has(characters.WILDCARD)) {\n if (node.children.has(characters.EXCEPTION + labelLowerCase)) {\n break;\n }\n node = node.children.get(characters.WILDCARD) as TrieNode;\n } else {\n if (node.children.has(labelLowerCase) === false) {\n break;\n }\n node = node.children.get(labelLowerCase) as TrieNode;\n }\n\n tlds.unshift(label);\n }\n\n return tlds;\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/trie/nodes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,eAAiB,CAAC;AAC7C,eAAO,MAAM,eAAe,eAAkB,CAAC;AAE/C,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,OAAO,cAAc,CAAC;IAC5B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACtC,CAAC;AACF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,OAAO,eAAe,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACrC,MAAM,EAAE,QAAQ,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,aAAa,CAAC;AAEpD,eAAO,MAAM,cAAc,QAAO,YAKjC,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,QAAQ,QAAQ,EAAE,OAAO,MAAM,kBAc/D,CAAC"}
1
+ {"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/trie/nodes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,eAAiB,CAAC;AAC7C,eAAO,MAAM,eAAe,eAAkB,CAAC;AAE/C,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,OAAO,cAAc,CAAC;IAC5B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACtC,CAAC;AACF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,OAAO,eAAe,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACrC,MAAM,EAAE,QAAQ,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,aAAa,CAAC;AAEpD,eAAO,MAAM,cAAc,QAAO,YAKjC,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,QAAQ,QAAQ,EAAE,OAAO,MAAM,KAAG,aAclE,CAAC"}