parse-domain 8.2.2 → 8.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +9 -68
  2. package/bin/update.js +7 -15
  3. package/{build → dist}/config.d.ts +1 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/{build → dist}/config.js +1 -1
  6. package/{build → dist}/config.js.map +1 -1
  7. package/{build → dist}/from-url.d.ts +1 -0
  8. package/dist/from-url.d.ts.map +1 -0
  9. package/{build → dist}/from-url.js +2 -2
  10. package/dist/from-url.js.map +1 -0
  11. package/dist/main.d.ts +6 -0
  12. package/dist/main.d.ts.map +1 -0
  13. package/dist/main.js +6 -0
  14. package/dist/main.js.map +1 -0
  15. package/{build → dist}/parse-domain.d.ts +30 -29
  16. package/dist/parse-domain.d.ts.map +1 -0
  17. package/{build → dist}/parse-domain.js +28 -16
  18. package/dist/parse-domain.js.map +1 -0
  19. package/{build → dist}/psl/build-tries.d.ts +1 -0
  20. package/dist/psl/build-tries.d.ts.map +1 -0
  21. package/{build → dist}/psl/build-tries.js +5 -5
  22. package/dist/psl/build-tries.js.map +1 -0
  23. package/{build → dist}/psl/fetch-psl.d.ts +1 -0
  24. package/dist/psl/fetch-psl.d.ts.map +1 -0
  25. package/dist/psl/fetch-psl.js +10 -0
  26. package/dist/psl/fetch-psl.js.map +1 -0
  27. package/{build → dist}/punycode.d.ts +1 -0
  28. package/dist/punycode.d.ts.map +1 -0
  29. package/{build → dist}/sanitize.d.ts +8 -7
  30. package/dist/sanitize.d.ts.map +1 -0
  31. package/{build → dist}/sanitize.js +12 -8
  32. package/dist/sanitize.js.map +1 -0
  33. package/dist/scripts/update-psl-fixture.d.ts +2 -0
  34. package/dist/scripts/update-psl-fixture.d.ts.map +1 -0
  35. package/dist/scripts/update-psl-fixture.js +7 -0
  36. package/dist/scripts/update-psl-fixture.js.map +1 -0
  37. package/dist/scripts/update-tries.d.ts +2 -0
  38. package/dist/scripts/update-tries.d.ts.map +1 -0
  39. package/dist/scripts/update-tries.js +26 -0
  40. package/dist/scripts/update-tries.js.map +1 -0
  41. package/dist/serialized-tries.d.ts +3 -0
  42. package/dist/serialized-tries.d.ts.map +1 -0
  43. package/dist/serialized-tries.js +3 -0
  44. package/dist/serialized-tries.js.map +1 -0
  45. package/{build → dist}/smoke-test.d.ts +1 -0
  46. package/dist/smoke-test.d.ts.map +1 -0
  47. package/{build → dist}/smoke-test.js +1 -1
  48. package/dist/smoke-test.js.map +1 -0
  49. package/{build → dist}/trie/characters.d.ts +1 -0
  50. package/dist/trie/characters.d.ts.map +1 -0
  51. package/{build → dist}/trie/create-trie.d.ts +1 -0
  52. package/dist/trie/create-trie.d.ts.map +1 -0
  53. package/{build → dist}/trie/create-trie.js +3 -1
  54. package/dist/trie/create-trie.js.map +1 -0
  55. package/dist/trie/look-up.d.ts +4 -0
  56. package/dist/trie/look-up.d.ts.map +1 -0
  57. package/{build → dist}/trie/look-up.js +2 -2
  58. package/dist/trie/look-up.js.map +1 -0
  59. package/{build → dist}/trie/nodes.d.ts +1 -0
  60. package/dist/trie/nodes.d.ts.map +1 -0
  61. package/{build → dist}/trie/parse-trie.d.ts +1 -0
  62. package/dist/trie/parse-trie.d.ts.map +1 -0
  63. package/{build → dist}/trie/parse-trie.js +1 -1
  64. package/dist/trie/parse-trie.js.map +1 -0
  65. package/dist/trie/serialize-trie.d.ts +3 -0
  66. package/dist/trie/serialize-trie.d.ts.map +1 -0
  67. package/{build → dist}/trie/serialize-trie.js +3 -3
  68. package/dist/trie/serialize-trie.js.map +1 -0
  69. package/{build → dist}/type-util.d.ts +1 -0
  70. package/dist/type-util.d.ts.map +1 -0
  71. package/dist/type-util.js +1 -0
  72. package/{build → dist}/update-tries.d.ts +1 -0
  73. package/dist/update-tries.d.ts.map +1 -0
  74. package/dist/update-tries.js +14 -0
  75. package/dist/update-tries.js.map +1 -0
  76. package/package.json +34 -36
  77. package/serialized-tries/icann.js +1 -1
  78. package/serialized-tries/info.json +1 -1
  79. package/serialized-tries/private.js +1 -1
  80. package/build/from-url.js.map +0 -1
  81. package/build/main.d.ts +0 -3
  82. package/build/main.js +0 -6
  83. package/build/main.js.map +0 -1
  84. package/build/parse-domain.js.map +0 -1
  85. package/build/psl/build-tries.js.map +0 -1
  86. package/build/psl/fetch-psl.js +0 -19
  87. package/build/psl/fetch-psl.js.map +0 -1
  88. package/build/sanitize.js.map +0 -1
  89. package/build/scripts/update-psl-fixture.d.ts +0 -1
  90. package/build/scripts/update-psl-fixture.js +0 -20
  91. package/build/scripts/update-psl-fixture.js.map +0 -1
  92. package/build/scripts/update-tries.d.ts +0 -1
  93. package/build/scripts/update-tries.js +0 -39
  94. package/build/scripts/update-tries.js.map +0 -1
  95. package/build/serialized-tries.d.ts +0 -3
  96. package/build/serialized-tries.js +0 -4
  97. package/build/serialized-tries.js.map +0 -1
  98. package/build/smoke-test.js.map +0 -1
  99. package/build/trie/create-trie.js.map +0 -1
  100. package/build/trie/look-up.d.ts +0 -3
  101. package/build/trie/look-up.js.map +0 -1
  102. package/build/trie/parse-trie.js.map +0 -1
  103. package/build/trie/serialize-trie.d.ts +0 -2
  104. package/build/trie/serialize-trie.js.map +0 -1
  105. package/build/type-util.js +0 -2
  106. package/build/update-tries.js +0 -23
  107. package/build/update-tries.js.map +0 -1
  108. /package/{build → dist}/punycode.js +0 -0
  109. /package/{build → dist}/punycode.js.map +0 -0
  110. /package/{build → dist}/trie/characters.js +0 -0
  111. /package/{build → dist}/trie/characters.js.map +0 -0
  112. /package/{build → dist}/trie/nodes.js +0 -0
  113. /package/{build → dist}/trie/nodes.js.map +0 -0
  114. /package/{build → dist}/type-util.js.map +0 -0
@@ -1,4 +1,5 @@
1
1
  import { ipVersion } from "is-ip";
2
+ import { NO_HOSTNAME } from "./from-url.js";
2
3
  // See https://en.wikipedia.org/wiki/Domain_name
3
4
  // See https://tools.ietf.org/html/rfc1034
4
5
  const LABEL_SEPARATOR = ".";
@@ -6,6 +7,7 @@ const LABEL_LENGTH_MIN = 1;
6
7
  const LABEL_LENGTH_MAX = 63;
7
8
  /**
8
9
  * 255 octets - 2 octets if you remove the last dot
10
+ *
9
11
  * @see https://devblogs.microsoft.com/oldnewthing/20120412-00/?p=7873
10
12
  */
11
13
  const DOMAIN_LENGTH_MAX = 253;
@@ -13,16 +15,16 @@ const textEncoder = new TextEncoder();
13
15
  export var Validation;
14
16
  (function (Validation) {
15
17
  /**
16
- * Allows any octets as labels
17
- * but still restricts the length of labels and the overall domain.
18
+ * Allows any octets as labels but still restricts the length of labels and
19
+ * the overall domain.
18
20
  *
19
21
  * @see https://www.rfc-editor.org/rfc/rfc2181#section-11
20
- **/
22
+ */
21
23
  Validation["Lax"] = "LAX";
22
24
  /**
23
- * Only allows ASCII letters, digits and hyphens (aka LDH),
24
- * forbids hyphens at the beginning or end of a label
25
- * and requires top-level domain names not to be all-numeric.
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.
26
28
  *
27
29
  * This is the default if no validation is configured.
28
30
  *
@@ -106,7 +108,7 @@ export const sanitize = (input, options = {}) => {
106
108
  }
107
109
  // IPv6 addresses are surrounded by square brackets in URLs
108
110
  // See https://tools.ietf.org/html/rfc3986#section-3.2.2
109
- const inputTrimmedAsIp = input.replace(/^\[|]$/g, "");
111
+ const inputTrimmedAsIp = input.replaceAll(/^\[|]$/g, "");
110
112
  const ipVersionOfInput = ipVersion(inputTrimmedAsIp);
111
113
  if (ipVersionOfInput !== undefined) {
112
114
  return {
@@ -115,7 +117,9 @@ export const sanitize = (input, options = {}) => {
115
117
  ipVersion: ipVersionOfInput,
116
118
  };
117
119
  }
118
- const lastChar = input.charAt(input.length - 1);
120
+ // We do not want to break compatibility with older engines unnecessarily.
121
+ // eslint-disable-next-line unicorn/prefer-at
122
+ const lastChar = input[input.length - 1];
119
123
  const canonicalInput = lastChar === LABEL_SEPARATOR ? input.slice(0, -1) : input;
120
124
  const octets = new TextEncoder().encode(canonicalInput);
121
125
  if (octets.length > DOMAIN_LENGTH_MAX) {
@@ -0,0 +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"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=update-psl-fixture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-psl-fixture.d.ts","sourceRoot":"","sources":["../../src/scripts/update-psl-fixture.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { fetchPsl } from "../psl/fetch-psl.js";
4
+ const pathToPslFixture = path.resolve(import.meta.dirname, "..", "tests", "fixtures", "public-suffix-list.txt");
5
+ const psl = await fetchPsl();
6
+ await fs.promises.writeFile(pathToPslFixture, psl);
7
+ //# sourceMappingURL=update-psl-fixture.js.map
@@ -0,0 +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"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=update-tries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-tries.d.ts","sourceRoot":"","sources":["../../src/scripts/update-tries.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { PUBLIC_SUFFIX_URL } from "../config.js";
4
+ import { fetchBuildSerializeTries } from "../update-tries.js";
5
+ const writeTriesToFiles = async ({ serializedIcannTrie, serializedPrivateTrie, }) => {
6
+ const indexOfScriptArg = process.argv.lastIndexOf("--");
7
+ const targetDirectories = process.argv.slice(indexOfScriptArg + 1);
8
+ await Promise.all(targetDirectories.map(async (targetDirectory) => {
9
+ const pathToIcannTrie = path.resolve(import.meta.dirname, targetDirectory, "icann.js");
10
+ const pathToPrivateTrie = path.resolve(import.meta.dirname, targetDirectory, "private.js");
11
+ const pathToTrieInfoFile = path.resolve(import.meta.dirname, targetDirectory, "info.json");
12
+ console.warn(`Writing ${pathToIcannTrie}...`);
13
+ console.warn(`Writing ${pathToPrivateTrie}...`);
14
+ console.warn(`Writing ${pathToTrieInfoFile}...`);
15
+ await Promise.all([
16
+ fs.promises.writeFile(pathToIcannTrie, `export default ${JSON.stringify(serializedIcannTrie)};`),
17
+ fs.promises.writeFile(pathToPrivateTrie, `export default ${JSON.stringify(serializedPrivateTrie)};`),
18
+ fs.promises.writeFile(pathToTrieInfoFile, JSON.stringify({
19
+ updatedAt: new Date(),
20
+ })),
21
+ ]);
22
+ }));
23
+ };
24
+ console.warn(`Fetching public suffix list from ${PUBLIC_SUFFIX_URL}...`);
25
+ await writeTriesToFiles(await fetchBuildSerializeTries());
26
+ //# sourceMappingURL=update-tries.js.map
@@ -0,0 +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"]}
@@ -0,0 +1,3 @@
1
+ export { default as icannTrie } from "../serialized-tries/icann.js";
2
+ export { default as privateTrie } from "../serialized-tries/private.js";
3
+ //# sourceMappingURL=serialized-tries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialized-tries.d.ts","sourceRoot":"","sources":["../src/serialized-tries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,gCAAgC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { default as icannTrie } from "../serialized-tries/icann.js";
2
+ export { default as privateTrie } from "../serialized-tries/private.js";
3
+ //# sourceMappingURL=serialized-tries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialized-tries.js","sourceRoot":"","sources":["../src/serialized-tries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,gCAAgC,CAAC","sourcesContent":["export { default as icannTrie } from \"../serialized-tries/icann.js\";\nexport { default as privateTrie } from \"../serialized-tries/private.js\";\n"]}
@@ -1 +1,2 @@
1
1
  export declare const runSmokeTest: () => void;
2
+ //# sourceMappingURL=smoke-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smoke-test.d.ts","sourceRoot":"","sources":["../src/smoke-test.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,YAqDxB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { deepStrictEqual } from "assert";
1
+ import { deepStrictEqual } from "node:assert";
2
2
  import { fromUrl, parseDomain, ParseResultType } from "./main.js";
3
3
  export const runSmokeTest = () => {
4
4
  deepStrictEqual(parseDomain("www.example.com"), {
@@ -0,0 +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"]}
@@ -4,3 +4,4 @@ export declare const DOWN = ">";
4
4
  export declare const RESET = "|";
5
5
  export declare const WILDCARD = "*";
6
6
  export declare const EXCEPTION = "!";
7
+ //# sourceMappingURL=characters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"characters.d.ts","sourceRoot":"","sources":["../../src/trie/characters.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,EAAE,MAAM,CAAC;AACtB,eAAO,MAAM,IAAI,MAAM,CAAC;AACxB,eAAO,MAAM,IAAI,MAAM,CAAC;AACxB,eAAO,MAAM,KAAK,MAAM,CAAC;AACzB,eAAO,MAAM,QAAQ,MAAM,CAAC;AAC5B,eAAO,MAAM,SAAS,MAAM,CAAC"}
@@ -1 +1,2 @@
1
1
  export declare const createTrieFromList: (list: Array<string>) => import("./nodes.js").TrieRootNode;
2
+ //# sourceMappingURL=create-trie.d.ts.map
@@ -0,0 +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,8 +1,10 @@
1
- import { createRootNode, createOrGetChild } from "./nodes.js";
1
+ import { createOrGetChild, createRootNode } from "./nodes.js";
2
2
  export const createTrieFromList = (list) => {
3
3
  const root = createRootNode();
4
4
  for (const rule of list) {
5
5
  let node = root;
6
+ // We do not want to break compatibility with older engines unnecessarily.
7
+ // eslint-disable-next-line unicorn/no-array-reverse
6
8
  for (const label of rule.split(".").reverse()) {
7
9
  node = createOrGetChild(node, label);
8
10
  }
@@ -0,0 +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"]}
@@ -0,0 +1,4 @@
1
+ import type { Label } from "../parse-domain.js";
2
+ import type { TrieNode } from "./nodes.js";
3
+ export declare const lookUpTldsInTrie: (labels: Array<Label>, trie: TrieNode) => string[];
4
+ //# sourceMappingURL=look-up.d.ts.map
@@ -0,0 +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,9 +1,9 @@
1
1
  import * as characters from "./characters.js";
2
2
  export const lookUpTldsInTrie = (labels, trie) => {
3
- const labelsToCheck = labels.slice();
3
+ const labelsToCheck = [...labels];
4
4
  const tlds = [];
5
5
  let node = trie;
6
- while (labelsToCheck.length !== 0) {
6
+ while (labelsToCheck.length > 0) {
7
7
  const label = labelsToCheck.pop();
8
8
  const labelLowerCase = label.toLowerCase();
9
9
  if (node.children.has(characters.WILDCARD)) {
@@ -0,0 +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"]}
@@ -13,3 +13,4 @@ export type TrieChildNode = {
13
13
  export type TrieNode = TrieRootNode | TrieChildNode;
14
14
  export declare const createRootNode: () => TrieRootNode;
15
15
  export declare const createOrGetChild: (parent: TrieNode, label: string) => TrieChildNode;
16
+ //# sourceMappingURL=nodes.d.ts.map
@@ -0,0 +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 +1,2 @@
1
1
  export declare const parseTrie: (serializedTrie: string) => import("./nodes.js").TrieRootNode;
2
+ //# sourceMappingURL=parse-trie.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-trie.d.ts","sourceRoot":"","sources":["../../src/trie/parse-trie.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,SAAS,GAAI,gBAAgB,MAAM,sCAkD/C,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import * as characters from "./characters.js";
2
- import { createRootNode, createOrGetChild, NODE_TYPE_ROOT, } from "./nodes.js";
2
+ import { createOrGetChild, createRootNode, NODE_TYPE_ROOT, } from "./nodes.js";
3
3
  export const parseTrie = (serializedTrie) => {
4
4
  const rootNode = createRootNode();
5
5
  let domain = "";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-trie.js","sourceRoot":"","sources":["../../src/trie/parse-trie.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,cAAc,GAEf,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,cAAsB,EAAE,EAAE;IAClD,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,UAAU,GAAa,QAAQ,CAAC;IACpC,gEAAgE;IAChE,6EAA6E;IAC7E,IAAI,IAAI,GAAG,QAAoB,CAAC;IAEhC,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,IAAI,GAAG,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,GAAG,EAAE,CAAC;IACd,CAAC,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAEtC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;gBACrB,SAAS,EAAE,CAAC;gBACZ,SAAS;YACX,CAAC;YACD,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;gBACrB,SAAS,EAAE,CAAC;gBACZ,UAAU,GAAG,IAAI,CAAC;gBAClB,SAAS;YACX,CAAC;YACD,KAAK,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtB,SAAS,EAAE,CAAC;gBACZ,UAAU,GAAG,QAAQ,CAAC;gBACtB,SAAS;YACX,CAAC;YACD,KAAK,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;gBACnB,IAAI,UAAU,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;oBACvC,MAAM,IAAI,KAAK,CACb,wCAAwC,CAAC,qDAAqD,CAC/F,CAAC;gBACJ,CAAC;gBACD,SAAS,EAAE,CAAC;gBACZ,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;gBAC/B,SAAS;YACX,CAAC;QACH,CAAC;QACD,MAAM,IAAI,IAAI,CAAC;IACjB,CAAC;IAED,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QAClB,SAAS,EAAE,CAAC;IACd,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC","sourcesContent":["import * as characters from \"./characters.js\";\nimport {\n createOrGetChild,\n createRootNode,\n NODE_TYPE_ROOT,\n type TrieNode,\n} from \"./nodes.js\";\n\nexport const parseTrie = (serializedTrie: string) => {\n const rootNode = createRootNode();\n let domain = \"\";\n let parentNode: TrieNode = rootNode;\n // Type assertion necessary here due to a TypeScript unsoundness\n // https://github.com/microsoft/TypeScript/issues/9998#issuecomment-235963457\n let node = rootNode as TrieNode;\n\n const addDomain = () => {\n node = createOrGetChild(parentNode, domain);\n domain = \"\";\n };\n\n for (let i = 0; i < serializedTrie.length; i++) {\n const char = serializedTrie.charAt(i);\n\n switch (char) {\n case characters.SAME: {\n addDomain();\n continue;\n }\n case characters.DOWN: {\n addDomain();\n parentNode = node;\n continue;\n }\n case characters.RESET: {\n addDomain();\n parentNode = rootNode;\n continue;\n }\n case characters.UP: {\n if (parentNode.type === NODE_TYPE_ROOT) {\n throw new Error(\n `Error in serialized trie at position ${i}: Cannot go up, current parent node is already root`,\n );\n }\n addDomain();\n parentNode = parentNode.parent;\n continue;\n }\n }\n domain += char;\n }\n\n if (domain !== \"\") {\n addDomain();\n }\n\n return rootNode;\n};\n"]}
@@ -0,0 +1,3 @@
1
+ import type { TrieRootNode } from "./nodes.js";
2
+ export declare const serializeTrie: (root: TrieRootNode) => string;
3
+ //# sourceMappingURL=serialize-trie.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize-trie.d.ts","sourceRoot":"","sources":["../../src/trie/serialize-trie.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9D,eAAO,MAAM,aAAa,GAAI,MAAM,YAAY,KAAG,MA6ClD,CAAC"}
@@ -1,7 +1,7 @@
1
- import { DOWN, UP, SAME } from "./characters.js";
1
+ import { DOWN, SAME, UP } from "./characters.js";
2
2
  export const serializeTrie = (root) => {
3
3
  let serialized = "";
4
- const queue = Array.from(root.children.values());
4
+ const queue = [...root.children.values()];
5
5
  let current;
6
6
  while ((current = queue.shift()) !== undefined) {
7
7
  if (current === UP) {
@@ -16,7 +16,7 @@ export const serializeTrie = (root) => {
16
16
  continue;
17
17
  }
18
18
  serialized += DOWN;
19
- const newItems = Array.from(current.children.values());
19
+ const newItems = [...current.children.values()];
20
20
  if (queue.length > 0) {
21
21
  newItems.push(UP);
22
22
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize-trie.js","sourceRoot":"","sources":["../../src/trie/serialize-trie.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAGjD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAkB,EAAU,EAAE;IAkB1D,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,MAAM,KAAK,GAAqB,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5D,IAAI,OAA8B,CAAC;IAEnC,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,SAAS,EAAE,CAAC;QAC/C,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YACnB,UAAU,IAAI,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QACD,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC;QAC5B,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAChC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;gBACxC,UAAU,IAAI,IAAI,CAAC;YACrB,CAAC;YACD,SAAS;QACX,CAAC;QACD,UAAU,IAAI,IAAI,CAAC;QAEnB,MAAM,QAAQ,GAAqB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAElE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC","sourcesContent":["import { DOWN, SAME, UP } from \"./characters.js\";\nimport type { TrieChildNode, TrieRootNode } from \"./nodes.js\";\n\nexport const serializeTrie = (root: TrieRootNode): string => {\n /*\n\tA trie might look like this:\n\n\t root\n\t |\n\t +-------+-----+-----+-----------+\n\t | | | |\n\t com uk jp موقع\n\t | |\n\t +--+--+ +--+--+\n\t | | | |\n\t co gov 静岡 岐阜\n\n\tAnd the textual representation of the trie looks like this:\n\tcom|uk>co,gov|jp>静岡,岐阜|موقع\n\t*/\n type QueueItem = TrieChildNode | typeof UP;\n let serialized = \"\";\n const queue: Array<QueueItem> = [...root.children.values()];\n let current: QueueItem | undefined;\n\n while ((current = queue.shift()) !== undefined) {\n if (current === UP) {\n serialized += UP;\n continue;\n }\n serialized += current.label;\n if (current.children.size === 0) {\n if (queue.length > 0 && queue[0] !== UP) {\n serialized += SAME;\n }\n continue;\n }\n serialized += DOWN;\n\n const newItems: Array<QueueItem> = [...current.children.values()];\n\n if (queue.length > 0) {\n newItems.push(UP);\n }\n queue.unshift(...newItems);\n }\n\n return serialized;\n};\n"]}
@@ -1,3 +1,4 @@
1
1
  export type Await<T> = T extends {
2
2
  then: (onFulfilled?: (value: infer U) => unknown) => unknown;
3
3
  } ? U : T;
4
+ //# sourceMappingURL=type-util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-util.d.ts","sourceRoot":"","sources":["../src/type-util.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS;IAC/B,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,OAAO,KAAK,OAAO,CAAC;CAC9D,GACG,CAAC,GACD,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=type-util.js.map
@@ -2,3 +2,4 @@ export declare const fetchBuildSerializeTries: () => Promise<{
2
2
  serializedIcannTrie: string;
3
3
  serializedPrivateTrie: string;
4
4
  }>;
5
+ //# sourceMappingURL=update-tries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-tries.d.ts","sourceRoot":"","sources":["../src/update-tries.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,wBAAwB;;;EAUpC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { buildTries } from "./psl/build-tries.js";
2
+ import { fetchPsl } from "./psl/fetch-psl.js";
3
+ import { serializeTrie } from "./trie/serialize-trie.js";
4
+ export const fetchBuildSerializeTries = async () => {
5
+ const psl = await fetchPsl();
6
+ const { icannTrie, privateTrie } = buildTries(psl);
7
+ const serializedIcannTrie = serializeTrie(icannTrie);
8
+ const serializedPrivateTrie = serializeTrie(privateTrie);
9
+ return {
10
+ serializedIcannTrie,
11
+ serializedPrivateTrie,
12
+ };
13
+ };
14
+ //# sourceMappingURL=update-tries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-tries.js","sourceRoot":"","sources":["../src/update-tries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,IAAI,EAAE;IACjD,MAAM,GAAG,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC7B,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,mBAAmB,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,qBAAqB,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAEzD,OAAO;QACL,mBAAmB;QACnB,qBAAqB;KACtB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { buildTries } from \"./psl/build-tries.js\";\nimport { fetchPsl } from \"./psl/fetch-psl.js\";\nimport { serializeTrie } from \"./trie/serialize-trie.js\";\n\nexport const fetchBuildSerializeTries = async () => {\n const psl = await fetchPsl();\n const { icannTrie, privateTrie } = buildTries(psl);\n const serializedIcannTrie = serializeTrie(icannTrie);\n const serializedPrivateTrie = serializeTrie(privateTrie);\n\n return {\n serializedIcannTrie,\n serializedPrivateTrie,\n };\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "parse-domain",
3
- "version": "8.2.2",
3
+ "version": "8.3.0",
4
4
  "description": "Splits a hostname into subdomains, domain and (effective) top-level domains",
5
5
  "keywords": [
6
6
  "domain",
@@ -11,17 +11,32 @@
11
11
  "sanitize",
12
12
  "top-level"
13
13
  ],
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "https://github.com/peerigon/parse-domain.git"
17
+ },
18
+ "license": "MIT",
19
+ "author": "peerigon <developers@peerigon.com>",
20
+ "sideEffects": false,
14
21
  "type": "module",
15
- "main": "./build/main.js",
16
- "types": "./build/main.d.ts",
22
+ "main": "./dist/main.js",
23
+ "types": "./dist/main.d.ts",
24
+ "bin": {
25
+ "parse-domain-update": "./bin/update.js"
26
+ },
27
+ "files": [
28
+ "bin",
29
+ "dist",
30
+ "serialized-tries"
31
+ ],
17
32
  "scripts": {
18
33
  "test": "run-p test:*",
19
34
  "test:suite": "vitest run --coverage",
20
- "test:lint": "eslint --max-warnings 0 --cache --ext js,ts --ignore-path .gitignore .",
35
+ "test:lint": "eslint --max-warnings 0 --cache .",
21
36
  "test:format": "prettier --check .",
22
37
  "test:types": "tsc --noEmit",
23
38
  "build": "run-s build:*",
24
- "build:cleanup": "rimraf build",
39
+ "build:cleanup": "rimraf dist",
25
40
  "build:tsc": "tsc -p ./tsconfig.build.json",
26
41
  "build:update": "./bin/update.js",
27
42
  "prepare": "run-p prepare:*",
@@ -32,21 +47,6 @@
32
47
  "node": "node --no-warnings --loader ts-node/esm/transpile-only",
33
48
  "release": "semantic-release"
34
49
  },
35
- "bin": {
36
- "parse-domain-update": "./bin/update.js"
37
- },
38
- "repository": {
39
- "type": "git",
40
- "url": "https://github.com/peerigon/parse-domain.git"
41
- },
42
- "author": "peerigon <developers@peerigon.com>",
43
- "license": "MIT",
44
- "files": [
45
- "bin",
46
- "build",
47
- "serialized-tries"
48
- ],
49
- "sideEffects": false,
50
50
  "lint-staged": {
51
51
  "*.{ts,tsx,js,cjs,mjs,jsx}": [
52
52
  "eslint --cache --fix",
@@ -62,27 +62,25 @@
62
62
  "is-ip": "^5.0.1"
63
63
  },
64
64
  "devDependencies": {
65
- "@semantic-release/changelog": "^6.0.3",
66
- "@semantic-release/git": "^10.0.1",
67
- "@types/node": "^20.14.12",
68
- "@vitest/coverage-v8": "^2.0.4",
69
- "eslint": "^8.57.0",
70
- "eslint-config-peerigon": "^39.1.0",
71
- "eslint-plugin-no-null": "^1.0.2",
72
- "husky": "^9.1.2",
73
- "lint-staged": "^15.2.7",
74
- "nock": "^14.0.0-beta.9",
65
+ "@peerigon/configs": "^11.0.2",
66
+ "@types/node": "^24.10.0",
67
+ "@vitest/coverage-v8": "^4.0.6",
68
+ "eslint": "9.38.0",
69
+ "husky": "^9.1.7",
70
+ "lint-staged": "^16.2.6",
71
+ "nock": "^14.0.10",
75
72
  "npm-run-all": "^4.1.5",
76
- "pin-github-action": "^1.9.1",
77
- "prettier": "^3.3.3",
78
- "rimraf": "^6.0.1",
79
- "semantic-release": "^24.0.0",
73
+ "pin-github-action": "^3.4.0",
74
+ "prettier": "^3.6.2",
75
+ "rimraf": "^6.1.0",
76
+ "semantic-release": "^25.0.1",
80
77
  "ts-node": "^10.9.2",
81
- "typescript": "^5.5.4",
78
+ "typescript": "^5.9.3",
82
79
  "updtr": "^4.1.0",
83
- "vitest": "^2.0.4"
80
+ "vitest": "^4.0.6"
84
81
  },
85
82
  "publishConfig": {
83
+ "access": "public",
86
84
  "provenance": true
87
85
  }
88
86
  }