parse-domain 8.2.2 → 8.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -68
- package/dist/bin/update.d.ts +3 -0
- package/dist/bin/update.d.ts.map +1 -0
- package/dist/bin/update.js +18 -0
- package/dist/bin/update.js.map +1 -0
- package/{build → dist}/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -0
- package/{build → dist}/config.js +1 -1
- package/{build → dist}/config.js.map +1 -1
- package/{build → dist}/from-url.d.ts +1 -0
- package/dist/from-url.d.ts.map +1 -0
- package/{build → dist}/from-url.js +2 -2
- package/dist/from-url.js.map +1 -0
- package/dist/main.d.ts +6 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +6 -0
- package/dist/main.js.map +1 -0
- package/{build → dist}/parse-domain.d.ts +30 -29
- package/dist/parse-domain.d.ts.map +1 -0
- package/{build → dist}/parse-domain.js +28 -16
- package/dist/parse-domain.js.map +1 -0
- package/{build → dist}/psl/build-tries.d.ts +1 -0
- package/dist/psl/build-tries.d.ts.map +1 -0
- package/{build → dist}/psl/build-tries.js +5 -5
- package/dist/psl/build-tries.js.map +1 -0
- package/{build → dist}/psl/fetch-psl.d.ts +1 -0
- package/dist/psl/fetch-psl.d.ts.map +1 -0
- package/dist/psl/fetch-psl.js +10 -0
- package/dist/psl/fetch-psl.js.map +1 -0
- package/{build → dist}/punycode.d.ts +1 -0
- package/dist/punycode.d.ts.map +1 -0
- package/{build → dist}/sanitize.d.ts +8 -7
- package/dist/sanitize.d.ts.map +1 -0
- package/{build → dist}/sanitize.js +12 -8
- package/dist/sanitize.js.map +1 -0
- package/dist/scripts/update-psl-fixture.d.ts +2 -0
- package/dist/scripts/update-psl-fixture.d.ts.map +1 -0
- package/dist/scripts/update-psl-fixture.js +7 -0
- package/dist/scripts/update-psl-fixture.js.map +1 -0
- package/dist/scripts/update-tries.d.ts +2 -0
- package/dist/scripts/update-tries.d.ts.map +1 -0
- package/dist/scripts/update-tries.js +26 -0
- package/dist/scripts/update-tries.js.map +1 -0
- package/dist/serialized-tries.d.ts +3 -0
- package/dist/serialized-tries.d.ts.map +1 -0
- package/dist/serialized-tries.js +3 -0
- package/dist/serialized-tries.js.map +1 -0
- package/{build → dist}/smoke-test.d.ts +1 -0
- package/dist/smoke-test.d.ts.map +1 -0
- package/{build → dist}/smoke-test.js +1 -1
- package/dist/smoke-test.js.map +1 -0
- package/{build → dist}/trie/characters.d.ts +1 -0
- package/dist/trie/characters.d.ts.map +1 -0
- package/{build → dist}/trie/create-trie.d.ts +1 -0
- package/dist/trie/create-trie.d.ts.map +1 -0
- package/{build → dist}/trie/create-trie.js +3 -1
- package/dist/trie/create-trie.js.map +1 -0
- package/dist/trie/look-up.d.ts +4 -0
- package/dist/trie/look-up.d.ts.map +1 -0
- package/{build → dist}/trie/look-up.js +2 -2
- package/dist/trie/look-up.js.map +1 -0
- package/{build → dist}/trie/nodes.d.ts +1 -0
- package/dist/trie/nodes.d.ts.map +1 -0
- package/{build → dist}/trie/parse-trie.d.ts +1 -0
- package/dist/trie/parse-trie.d.ts.map +1 -0
- package/{build → dist}/trie/parse-trie.js +1 -1
- package/dist/trie/parse-trie.js.map +1 -0
- package/dist/trie/serialize-trie.d.ts +3 -0
- package/dist/trie/serialize-trie.d.ts.map +1 -0
- package/{build → dist}/trie/serialize-trie.js +3 -3
- package/dist/trie/serialize-trie.js.map +1 -0
- package/{build → dist}/type-util.d.ts +1 -0
- package/dist/type-util.d.ts.map +1 -0
- package/dist/type-util.js +1 -0
- package/{build → dist}/update-tries.d.ts +1 -0
- package/dist/update-tries.d.ts.map +1 -0
- package/dist/update-tries.js +14 -0
- package/dist/update-tries.js.map +1 -0
- package/package.json +51 -48
- package/serialized-tries/icann.js +1 -1
- package/serialized-tries/info.json +1 -1
- package/serialized-tries/private.js +1 -1
- package/bin/update.js +0 -22
- package/build/from-url.js.map +0 -1
- package/build/main.d.ts +0 -3
- package/build/main.js +0 -6
- package/build/main.js.map +0 -1
- package/build/parse-domain.js.map +0 -1
- package/build/psl/build-tries.js.map +0 -1
- package/build/psl/fetch-psl.js +0 -19
- package/build/psl/fetch-psl.js.map +0 -1
- package/build/sanitize.js.map +0 -1
- package/build/scripts/update-psl-fixture.d.ts +0 -1
- package/build/scripts/update-psl-fixture.js +0 -20
- package/build/scripts/update-psl-fixture.js.map +0 -1
- package/build/scripts/update-tries.d.ts +0 -1
- package/build/scripts/update-tries.js +0 -39
- package/build/scripts/update-tries.js.map +0 -1
- package/build/serialized-tries.d.ts +0 -3
- package/build/serialized-tries.js +0 -4
- package/build/serialized-tries.js.map +0 -1
- package/build/smoke-test.js.map +0 -1
- package/build/trie/create-trie.js.map +0 -1
- package/build/trie/look-up.d.ts +0 -3
- package/build/trie/look-up.js.map +0 -1
- package/build/trie/parse-trie.js.map +0 -1
- package/build/trie/serialize-trie.d.ts +0 -2
- package/build/trie/serialize-trie.js.map +0 -1
- package/build/type-util.js +0 -2
- package/build/update-tries.js +0 -23
- package/build/update-tries.js.map +0 -1
- /package/{build → dist}/punycode.js +0 -0
- /package/{build → dist}/punycode.js.map +0 -0
- /package/{build → dist}/trie/characters.js +0 -0
- /package/{build → dist}/trie/characters.js.map +0 -0
- /package/{build → dist}/trie/nodes.js +0 -0
- /package/{build → dist}/trie/nodes.js.map +0 -0
- /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
|
-
*
|
|
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
|
-
*
|
|
25
|
-
*
|
|
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.
|
|
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
|
-
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"]}
|
|
@@ -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"}
|
|
@@ -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"]}
|
|
@@ -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"}
|
|
@@ -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 {
|
|
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 @@
|
|
|
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
|
|
3
|
+
const labelsToCheck = [...labels];
|
|
4
4
|
const tlds = [];
|
|
5
5
|
let node = trie;
|
|
6
|
-
while (labelsToCheck.length
|
|
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"}
|
|
@@ -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 {
|
|
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 @@
|
|
|
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,
|
|
1
|
+
import { DOWN, SAME, UP } from "./characters.js";
|
|
2
2
|
export const serializeTrie = (root) => {
|
|
3
3
|
let serialized = "";
|
|
4
|
-
const queue =
|
|
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 =
|
|
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"]}
|
|
@@ -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
|
|
@@ -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.
|
|
3
|
+
"version": "8.3.1",
|
|
4
4
|
"description": "Splits a hostname into subdomains, domain and (effective) top-level domains",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"domain",
|
|
@@ -11,19 +11,44 @@
|
|
|
11
11
|
"sanitize",
|
|
12
12
|
"top-level"
|
|
13
13
|
],
|
|
14
|
+
"homepage": "https://github.com/peerigon/parse-domain#readme",
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/peerigon/parse-domain/issues"
|
|
17
|
+
},
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "https://github.com/peerigon/parse-domain.git"
|
|
21
|
+
},
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"author": "peerigon <developers@peerigon.com>",
|
|
24
|
+
"sideEffects": false,
|
|
14
25
|
"type": "module",
|
|
15
|
-
"
|
|
16
|
-
|
|
26
|
+
"exports": {
|
|
27
|
+
".": "./dist/main.js"
|
|
28
|
+
},
|
|
29
|
+
"main": "./dist/main.js",
|
|
30
|
+
"types": "./dist/main.d.ts",
|
|
31
|
+
"bin": {
|
|
32
|
+
"parse-domain-update": "./dist/bin/update.js"
|
|
33
|
+
},
|
|
34
|
+
"files": [
|
|
35
|
+
"dist",
|
|
36
|
+
"serialized-tries",
|
|
37
|
+
"CHANGELOG.md",
|
|
38
|
+
"README.md"
|
|
39
|
+
],
|
|
17
40
|
"scripts": {
|
|
18
41
|
"test": "run-p test:*",
|
|
19
42
|
"test:suite": "vitest run --coverage",
|
|
20
|
-
"test:lint": "eslint --max-warnings 0 --cache
|
|
43
|
+
"test:lint": "eslint --max-warnings 0 --cache .",
|
|
21
44
|
"test:format": "prettier --check .",
|
|
22
45
|
"test:types": "tsc --noEmit",
|
|
46
|
+
"test:jsr": "jsr publish --dry-run --allow-dirty",
|
|
47
|
+
"vitest": "vitest",
|
|
23
48
|
"build": "run-s build:*",
|
|
24
|
-
"build:cleanup": "rimraf
|
|
49
|
+
"build:cleanup": "rimraf dist",
|
|
25
50
|
"build:tsc": "tsc -p ./tsconfig.build.json",
|
|
26
|
-
"build:update": "./bin/update.js",
|
|
51
|
+
"build:update": "node ./dist/bin/update.js",
|
|
27
52
|
"prepare": "run-p prepare:*",
|
|
28
53
|
"prepare:husky": "husky",
|
|
29
54
|
"prepare:build": "npm run build",
|
|
@@ -32,57 +57,35 @@
|
|
|
32
57
|
"node": "node --no-warnings --loader ts-node/esm/transpile-only",
|
|
33
58
|
"release": "semantic-release"
|
|
34
59
|
},
|
|
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
|
-
"lint-staged": {
|
|
51
|
-
"*.{ts,tsx,js,cjs,mjs,jsx}": [
|
|
52
|
-
"eslint --cache --fix",
|
|
53
|
-
"prettier --write"
|
|
54
|
-
],
|
|
55
|
-
".github/workflows/*.{yml,yaml}": [
|
|
56
|
-
"pin-github-action --allow-empty",
|
|
57
|
-
"prettier --write"
|
|
58
|
-
],
|
|
59
|
-
"*.{json,css,md,yml,yaml}": "prettier --write"
|
|
60
|
-
},
|
|
61
60
|
"dependencies": {
|
|
62
61
|
"is-ip": "^5.0.1"
|
|
63
62
|
},
|
|
64
63
|
"devDependencies": {
|
|
65
|
-
"@
|
|
66
|
-
"@
|
|
67
|
-
"@
|
|
68
|
-
"@
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
"eslint
|
|
72
|
-
"husky": "^9.1.
|
|
73
|
-
"
|
|
74
|
-
"
|
|
75
|
-
"
|
|
76
|
-
"
|
|
77
|
-
"
|
|
64
|
+
"@djankies/vitest-mcp": "0.5.1",
|
|
65
|
+
"@eslint/mcp": "0.3.5",
|
|
66
|
+
"@peerigon/configs": "^15.4.0",
|
|
67
|
+
"@secretlint/secretlint-rule-preset-recommend": "^13.0.2",
|
|
68
|
+
"@types/node": "^25.8.0",
|
|
69
|
+
"@vitest/coverage-v8": "^4.1.7",
|
|
70
|
+
"eslint": "^9.39.2",
|
|
71
|
+
"husky": "^9.1.7",
|
|
72
|
+
"jsr": "^0.14.3",
|
|
73
|
+
"lint-staged": "^17.0.5",
|
|
74
|
+
"nock": "^14.0.10",
|
|
75
|
+
"npm-run-all2": "^9.0.1",
|
|
76
|
+
"pin-github-action": "^3.4.0",
|
|
77
|
+
"prettier": "^3.8.3",
|
|
78
78
|
"rimraf": "^6.0.1",
|
|
79
|
-
"
|
|
79
|
+
"secretlint": "^13.0.2",
|
|
80
|
+
"semantic-release": "^25.0.3",
|
|
81
|
+
"ts-lsp-mcp": "0.1.3",
|
|
80
82
|
"ts-node": "^10.9.2",
|
|
81
|
-
"typescript": "^5.
|
|
83
|
+
"typescript": "^5.9.3",
|
|
82
84
|
"updtr": "^4.1.0",
|
|
83
|
-
"vitest": "^
|
|
85
|
+
"vitest": "^4.1.7"
|
|
84
86
|
},
|
|
85
87
|
"publishConfig": {
|
|
88
|
+
"access": "public",
|
|
86
89
|
"provenance": true
|
|
87
90
|
}
|
|
88
91
|
}
|