parse-domain 4.1.0 → 7.0.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.
- package/README.md +131 -58
- package/bin/update.js +8 -11
- package/{build-cjs/src → build}/config.d.ts +0 -0
- package/{build-esm/src → build}/config.js +0 -0
- package/build/config.js.map +1 -0
- package/{build-cjs/src → build}/from-url.d.ts +0 -0
- package/{build-esm/src → build}/from-url.js +3 -1
- package/build/from-url.js.map +1 -0
- package/build/main.d.ts +3 -0
- package/build/main.js +6 -0
- package/build/main.js.map +1 -0
- package/{build-cjs/src → build}/parse-domain.d.ts +9 -3
- package/{build-esm/src → build}/parse-domain.js +6 -6
- package/build/parse-domain.js.map +1 -0
- package/build/psl/build-tries.d.ts +4 -0
- package/{build-esm/src → build}/psl/build-tries.js +5 -20
- package/build/psl/build-tries.js.map +1 -0
- package/{build-cjs/src → build}/psl/fetch-psl.d.ts +0 -0
- package/{build-esm/src → build}/psl/fetch-psl.js +1 -1
- package/build/psl/fetch-psl.js.map +1 -0
- package/build/punycode.d.ts +1 -0
- package/build/punycode.js +4 -0
- package/build/punycode.js.map +1 -0
- package/{build-cjs/src → build}/sanitize.d.ts +28 -6
- package/build/sanitize.js +193 -0
- package/build/sanitize.js.map +1 -0
- package/{build-cjs/src → build}/scripts/update-psl-fixture.d.ts +0 -0
- package/build/scripts/update-psl-fixture.js +20 -0
- package/build/scripts/update-psl-fixture.js.map +1 -0
- package/{build-cjs/src → build}/scripts/update-tries.d.ts +0 -0
- package/build/scripts/update-tries.js +39 -0
- package/build/scripts/update-tries.js.map +1 -0
- package/build/serialized-tries.d.ts +3 -0
- package/build/serialized-tries.js +4 -0
- package/build/serialized-tries.js.map +1 -0
- package/{build-cjs/src → build}/smoke-test.d.ts +0 -0
- package/{build-esm/src → build}/smoke-test.js +6 -8
- package/build/smoke-test.js.map +1 -0
- package/{build-cjs/src → build}/trie/characters.d.ts +0 -0
- package/{build-esm/src → build}/trie/characters.js +0 -0
- package/build/trie/characters.js.map +1 -0
- package/{build-cjs/src → build}/trie/create-trie.d.ts +1 -1
- package/{build-esm/src → build}/trie/create-trie.js +1 -1
- package/build/trie/create-trie.js.map +1 -0
- package/{build-cjs/src → build}/trie/look-up.d.ts +2 -2
- package/{build-esm/src → build}/trie/look-up.js +1 -1
- package/build/trie/look-up.js.map +1 -0
- package/{build-cjs/src → build}/trie/nodes.d.ts +0 -0
- package/{build-esm/src → build}/trie/nodes.js +0 -0
- package/build/trie/nodes.js.map +1 -0
- package/{build-cjs/src → build}/trie/parse-trie.d.ts +1 -1
- package/{build-esm/src → build}/trie/parse-trie.js +2 -2
- package/build/trie/parse-trie.js.map +1 -0
- package/{build-cjs/src → build}/trie/serialize-trie.d.ts +1 -1
- package/{build-esm/src → build}/trie/serialize-trie.js +1 -1
- package/build/trie/serialize-trie.js.map +1 -0
- package/{build-cjs/src → build}/type-util.d.ts +0 -0
- package/{build-esm/src → build}/type-util.js +0 -0
- package/{build-cjs/src → build}/type-util.js.map +1 -1
- package/{build-cjs/src → build}/update-tries.d.ts +0 -0
- package/{build-esm/src → build}/update-tries.js +3 -3
- package/build/update-tries.js.map +1 -0
- package/package.json +34 -43
- package/serialized-tries/icann.d.ts +3 -0
- package/serialized-tries/icann.js +1 -0
- package/serialized-tries/info.json +1 -0
- package/serialized-tries/private.d.ts +3 -0
- package/serialized-tries/private.js +1 -0
- package/build-cjs/serialized-tries/icann.json +0 -1
- package/build-cjs/serialized-tries/info.json +0 -1
- package/build-cjs/serialized-tries/private.json +0 -1
- package/build-cjs/src/config.js +0 -10
- package/build-cjs/src/config.js.map +0 -1
- package/build-cjs/src/from-url.js +0 -32
- package/build-cjs/src/from-url.js.map +0 -1
- package/build-cjs/src/main.d.ts +0 -3
- package/build-cjs/src/main.js +0 -14
- package/build-cjs/src/main.js.map +0 -1
- package/build-cjs/src/main.mjs +0 -11
- package/build-cjs/src/parse-domain.js +0 -97
- package/build-cjs/src/parse-domain.js.map +0 -1
- package/build-cjs/src/psl/build-tries.d.ts +0 -4
- package/build-cjs/src/psl/build-tries.js +0 -59
- package/build-cjs/src/psl/build-tries.js.map +0 -1
- package/build-cjs/src/psl/fetch-psl.js +0 -27
- package/build-cjs/src/psl/fetch-psl.js.map +0 -1
- package/build-cjs/src/sanitize.js +0 -132
- package/build-cjs/src/sanitize.js.map +0 -1
- package/build-cjs/src/scripts/update-psl-fixture.js +0 -29
- package/build-cjs/src/scripts/update-psl-fixture.js.map +0 -1
- package/build-cjs/src/scripts/update-tries.js +0 -48
- package/build-cjs/src/scripts/update-tries.js.map +0 -1
- package/build-cjs/src/serialized-tries.d.ts +0 -3
- package/build-cjs/src/serialized-tries.js +0 -11
- package/build-cjs/src/serialized-tries.js.map +0 -1
- package/build-cjs/src/smoke-test.js +0 -63
- package/build-cjs/src/smoke-test.js.map +0 -1
- package/build-cjs/src/trie/characters.js +0 -11
- package/build-cjs/src/trie/characters.js.map +0 -1
- package/build-cjs/src/trie/create-trie.js +0 -16
- package/build-cjs/src/trie/create-trie.js.map +0 -1
- package/build-cjs/src/trie/look-up.js +0 -48
- package/build-cjs/src/trie/look-up.js.map +0 -1
- package/build-cjs/src/trie/nodes.js +0 -27
- package/build-cjs/src/trie/nodes.js.map +0 -1
- package/build-cjs/src/trie/parse-trie.js +0 -70
- package/build-cjs/src/trie/parse-trie.js.map +0 -1
- package/build-cjs/src/trie/serialize-trie.js +0 -31
- package/build-cjs/src/trie/serialize-trie.js.map +0 -1
- package/build-cjs/src/type-util.js +0 -3
- package/build-cjs/src/update-tries.js +0 -27
- package/build-cjs/src/update-tries.js.map +0 -1
- package/build-esm/serialized-tries/icann.json +0 -1
- package/build-esm/serialized-tries/info.json +0 -1
- package/build-esm/serialized-tries/private.json +0 -1
- package/build-esm/src/config.d.ts +0 -6
- package/build-esm/src/config.js.map +0 -1
- package/build-esm/src/from-url.d.ts +0 -2
- package/build-esm/src/from-url.js.map +0 -1
- package/build-esm/src/main.d.ts +0 -3
- package/build-esm/src/main.js +0 -6
- package/build-esm/src/main.js.map +0 -1
- package/build-esm/src/parse-domain.d.ts +0 -79
- package/build-esm/src/parse-domain.js.map +0 -1
- package/build-esm/src/psl/build-tries.d.ts +0 -4
- package/build-esm/src/psl/build-tries.js.map +0 -1
- package/build-esm/src/psl/fetch-psl.d.ts +0 -1
- package/build-esm/src/psl/fetch-psl.js.map +0 -1
- package/build-esm/src/sanitize.d.ts +0 -36
- package/build-esm/src/sanitize.js +0 -125
- package/build-esm/src/sanitize.js.map +0 -1
- package/build-esm/src/serialized-tries.d.ts +0 -3
- package/build-esm/src/serialized-tries.js +0 -4
- package/build-esm/src/serialized-tries.js.map +0 -1
- package/build-esm/src/smoke-test.d.ts +0 -1
- package/build-esm/src/smoke-test.js.map +0 -1
- package/build-esm/src/trie/characters.d.ts +0 -6
- package/build-esm/src/trie/characters.js.map +0 -1
- package/build-esm/src/trie/create-trie.d.ts +0 -1
- package/build-esm/src/trie/create-trie.js.map +0 -1
- package/build-esm/src/trie/look-up.d.ts +0 -3
- package/build-esm/src/trie/look-up.js.map +0 -1
- package/build-esm/src/trie/nodes.d.ts +0 -15
- package/build-esm/src/trie/nodes.js.map +0 -1
- package/build-esm/src/trie/parse-trie.d.ts +0 -1
- package/build-esm/src/trie/parse-trie.js.map +0 -1
- package/build-esm/src/trie/serialize-trie.d.ts +0 -2
- package/build-esm/src/trie/serialize-trie.js.map +0 -1
- package/build-esm/src/type-util.d.ts +0 -3
- package/build-esm/src/type-util.js.map +0 -1
- package/build-esm/src/update-tries.d.ts +0 -4
- package/build-esm/src/update-tries.js.map +0 -1
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.buildTries = void 0;
|
|
4
|
-
const punycode_1 = require("punycode");
|
|
5
|
-
const config_1 = require("../config");
|
|
6
|
-
const create_trie_1 = require("../trie/create-trie");
|
|
7
|
-
const matchNewLine = /\r?\n/u;
|
|
8
|
-
const matchComment = /^\s*\/\//u;
|
|
9
|
-
const matchWhitespace = /^\s*$/u;
|
|
10
|
-
const extractByMarkers = (listContent, startMarker, endMarker) => {
|
|
11
|
-
const start = listContent.indexOf(startMarker);
|
|
12
|
-
const end = listContent.indexOf(endMarker);
|
|
13
|
-
if (start === -1) {
|
|
14
|
-
throw new Error(`Missing start marker ${startMarker} in public suffix list`);
|
|
15
|
-
}
|
|
16
|
-
if (end === -1) {
|
|
17
|
-
throw new Error(`Missing end marker ${endMarker} in public suffix list`);
|
|
18
|
-
}
|
|
19
|
-
return listContent.slice(start, end);
|
|
20
|
-
};
|
|
21
|
-
const containsRule = (line) => matchComment.test(line) === false && matchWhitespace.test(line) === false;
|
|
22
|
-
const normalizeRule = (rule) =>
|
|
23
|
-
/*
|
|
24
|
-
Users of parse-domain should only pass parsed hostnames (e.g. via new URL("...").hostname)
|
|
25
|
-
to parseDomain(). This frees us from the burden of URL parsing.
|
|
26
|
-
See also https://github.com/peerigon/parse-domain/issues/14
|
|
27
|
-
|
|
28
|
-
The problem is that new URL("...").hostname will also translate all non-ASCII characters
|
|
29
|
-
into punycode (e.g. 大分.jp becomes xn--kbrq7o.jp). This means for us that our serialized
|
|
30
|
-
trie needs to use punyencoded hostnames.
|
|
31
|
-
|
|
32
|
-
The downside of this is that punycode hostnames are bigger in terms of file size.
|
|
33
|
-
However, that's still better than including a punycode library into the runtime code of parse-domain.
|
|
34
|
-
Gzip is also very effective in removing duplicate characters.
|
|
35
|
-
*/
|
|
36
|
-
(0, punycode_1.toASCII)(rule).toLowerCase();
|
|
37
|
-
const parsePsl = (listContent) => {
|
|
38
|
-
return {
|
|
39
|
-
icann: extractByMarkers(listContent, config_1.PUBLIC_SUFFIX_MARKER_ICANN_START, config_1.PUBLIC_SUFFIX_MARKER_ICANN_END)
|
|
40
|
-
.split(matchNewLine)
|
|
41
|
-
.filter(containsRule)
|
|
42
|
-
.map(normalizeRule),
|
|
43
|
-
private: extractByMarkers(listContent, config_1.PUBLIC_SUFFIX_MARKER_PRIVATE_START, config_1.PUBLIC_SUFFIX_MARKER_PRIVATE_END)
|
|
44
|
-
.split(matchNewLine)
|
|
45
|
-
.filter(containsRule)
|
|
46
|
-
.map(normalizeRule),
|
|
47
|
-
};
|
|
48
|
-
};
|
|
49
|
-
const buildTries = (psl) => {
|
|
50
|
-
const parsedPsl = parsePsl(psl);
|
|
51
|
-
const icannTrie = (0, create_trie_1.createTrieFromList)(parsedPsl.icann);
|
|
52
|
-
const privateTrie = (0, create_trie_1.createTrieFromList)(parsedPsl.private);
|
|
53
|
-
return {
|
|
54
|
-
icannTrie,
|
|
55
|
-
privateTrie,
|
|
56
|
-
};
|
|
57
|
-
};
|
|
58
|
-
exports.buildTries = buildTries;
|
|
59
|
-
//# sourceMappingURL=build-tries.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"build-tries.js","sourceRoot":"","sources":["../../../src/psl/build-tries.ts"],"names":[],"mappings":";;;AAAA,uCAAmC;AACnC,sCAKmB;AACnB,qDAAyD;AAEzD,MAAM,YAAY,GAAG,QAAQ,CAAC;AAC9B,MAAM,YAAY,GAAG,WAAW,CAAC;AACjC,MAAM,eAAe,GAAG,QAAQ,CAAC;AAEjC,MAAM,gBAAgB,GAAG,CACvB,WAAmB,EACnB,WAAmB,EACnB,SAAiB,EACjB,EAAE;IACF,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE3C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;QAChB,MAAM,IAAI,KAAK,CACb,wBAAwB,WAAW,wBAAwB,CAC5D,CAAC;KACH;IACD,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE;QACd,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,wBAAwB,CAAC,CAAC;KAC1E;IAED,OAAO,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,EAAE,CACpC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC;AAE5E,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE;AACrC;;;;;;;;;;;;IAYC;AACD,IAAA,kBAAO,EAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;AAE9B,MAAM,QAAQ,GAAG,CAAC,WAAmB,EAAE,EAAE;IACvC,OAAO;QACL,KAAK,EAAE,gBAAgB,CACrB,WAAW,EACX,yCAAgC,EAChC,uCAA8B,CAC/B;aACE,KAAK,CAAC,YAAY,CAAC;aACnB,MAAM,CAAC,YAAY,CAAC;aACpB,GAAG,CAAC,aAAa,CAAC;QACrB,OAAO,EAAE,gBAAgB,CACvB,WAAW,EACX,2CAAkC,EAClC,yCAAgC,CACjC;aACE,KAAK,CAAC,YAAY,CAAC;aACnB,MAAM,CAAC,YAAY,CAAC;aACpB,GAAG,CAAC,aAAa,CAAC;KACtB,CAAC;AACJ,CAAC,CAAC;AAEK,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,EAAE;IACxC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,IAAA,gCAAkB,EAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,IAAA,gCAAkB,EAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAE1D,OAAO;QACL,SAAS;QACT,WAAW;KACZ,CAAC;AACJ,CAAC,CAAC;AATW,QAAA,UAAU,cASrB"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.fetchPsl = void 0;
|
|
16
|
-
const assert_1 = require("assert");
|
|
17
|
-
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
18
|
-
const config_1 = require("../config");
|
|
19
|
-
const fetchPsl = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
20
|
-
const response = yield (0, node_fetch_1.default)(config_1.PUBLIC_SUFFIX_URL);
|
|
21
|
-
const pslContent = yield response.text();
|
|
22
|
-
// Sanity check
|
|
23
|
-
(0, assert_1.ok)(pslContent.length >= config_1.FETCH_PSL_EXPECTED_MIN_LENGTH, "Public suffix list is shorter than expected");
|
|
24
|
-
return pslContent;
|
|
25
|
-
});
|
|
26
|
-
exports.fetchPsl = fetchPsl;
|
|
27
|
-
//# sourceMappingURL=fetch-psl.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-psl.js","sourceRoot":"","sources":["../../../src/psl/fetch-psl.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,mCAA4B;AAC5B,4DAA+B;AAC/B,sCAA6E;AAEtE,MAAM,QAAQ,GAAG,GAAS,EAAE;IACjC,MAAM,QAAQ,GAAG,MAAM,IAAA,oBAAK,EAAC,0BAAiB,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEzC,eAAe;IACf,IAAA,WAAE,EACA,UAAU,CAAC,MAAM,IAAI,sCAA6B,EAClD,6CAA6C,CAC9C,CAAC;IAEF,OAAO,UAAU,CAAC;AACpB,CAAC,CAAA,CAAC;AAXW,QAAA,QAAQ,YAWnB"}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.sanitize = exports.SanitizationResultType = exports.ValidationErrorType = void 0;
|
|
7
|
-
const is_ip_1 = __importDefault(require("is-ip"));
|
|
8
|
-
// See https://en.wikipedia.org/wiki/Domain_name
|
|
9
|
-
// See https://tools.ietf.org/html/rfc1034
|
|
10
|
-
const LABEL_SEPARATOR = ".";
|
|
11
|
-
const LABEL_ROOT = "";
|
|
12
|
-
const LABEL_LENGTH_MIN = 1;
|
|
13
|
-
const LABEL_LENGTH_MAX = 63;
|
|
14
|
-
const DOMAIN_LENGTH_MAX = 253;
|
|
15
|
-
var ValidationErrorType;
|
|
16
|
-
(function (ValidationErrorType) {
|
|
17
|
-
ValidationErrorType["NoHostname"] = "NO_HOSTNAME";
|
|
18
|
-
ValidationErrorType["DomainMaxLength"] = "DOMAIN_MAX_LENGTH";
|
|
19
|
-
ValidationErrorType["LabelMinLength"] = "LABEL_MIN_LENGTH";
|
|
20
|
-
ValidationErrorType["LabelMaxLength"] = "LABEL_MAX_LENGTH";
|
|
21
|
-
ValidationErrorType["LabelInvalidCharacter"] = "LABEL_INVALID_CHARACTER";
|
|
22
|
-
})(ValidationErrorType = exports.ValidationErrorType || (exports.ValidationErrorType = {}));
|
|
23
|
-
var SanitizationResultType;
|
|
24
|
-
(function (SanitizationResultType) {
|
|
25
|
-
SanitizationResultType["ValidIp"] = "VALID_IP";
|
|
26
|
-
SanitizationResultType["ValidDomain"] = "VALID_DOMAIN";
|
|
27
|
-
SanitizationResultType["Error"] = "ERROR";
|
|
28
|
-
})(SanitizationResultType = exports.SanitizationResultType || (exports.SanitizationResultType = {}));
|
|
29
|
-
const createNoHostnameError = (input) => {
|
|
30
|
-
return {
|
|
31
|
-
type: ValidationErrorType.NoHostname,
|
|
32
|
-
message: `The given input ${String(input)} does not look like a hostname.`,
|
|
33
|
-
column: 1,
|
|
34
|
-
};
|
|
35
|
-
};
|
|
36
|
-
const createDomainMaxLengthError = (domain) => {
|
|
37
|
-
const length = domain.length;
|
|
38
|
-
return {
|
|
39
|
-
type: ValidationErrorType.DomainMaxLength,
|
|
40
|
-
message: `Domain "${domain}" is too long. Domain is ${length} octets long but should not be longer than ${DOMAIN_LENGTH_MAX}.`,
|
|
41
|
-
column: length,
|
|
42
|
-
};
|
|
43
|
-
};
|
|
44
|
-
const createLabelMinLengthError = (label, column) => {
|
|
45
|
-
const length = label.length;
|
|
46
|
-
return {
|
|
47
|
-
type: ValidationErrorType.LabelMinLength,
|
|
48
|
-
message: `Label "${label}" is too short. Label is ${length} octets long but should be at least ${LABEL_LENGTH_MIN}.`,
|
|
49
|
-
column,
|
|
50
|
-
};
|
|
51
|
-
};
|
|
52
|
-
const createLabelMaxLengthError = (label, column) => {
|
|
53
|
-
const length = label.length;
|
|
54
|
-
return {
|
|
55
|
-
type: ValidationErrorType.LabelMaxLength,
|
|
56
|
-
message: `Label "${label}" is too long. Label is ${length} octets long but should not be longer than ${LABEL_LENGTH_MAX}.`,
|
|
57
|
-
column,
|
|
58
|
-
};
|
|
59
|
-
};
|
|
60
|
-
const createLabelInvalidCharacterError = (label, invalidCharacter, column) => {
|
|
61
|
-
return {
|
|
62
|
-
type: ValidationErrorType.LabelInvalidCharacter,
|
|
63
|
-
message: `Label "${label}" contains invalid character "${invalidCharacter}" at column ${column}.`,
|
|
64
|
-
column,
|
|
65
|
-
};
|
|
66
|
-
};
|
|
67
|
-
const sanitize = (input) => {
|
|
68
|
-
// Extra check for non-TypeScript users
|
|
69
|
-
if (typeof input !== "string") {
|
|
70
|
-
return {
|
|
71
|
-
type: SanitizationResultType.Error,
|
|
72
|
-
errors: [createNoHostnameError(input)],
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
const inputTrimmed = input.trim();
|
|
76
|
-
// IPv6 addresses are surrounded by square brackets in URLs
|
|
77
|
-
// See https://tools.ietf.org/html/rfc3986#section-3.2.2
|
|
78
|
-
const inputTrimmedAsIp = inputTrimmed.replace(/^\[|]$/g, "");
|
|
79
|
-
const ipVersion = is_ip_1.default.version(inputTrimmedAsIp);
|
|
80
|
-
if (ipVersion !== undefined) {
|
|
81
|
-
return {
|
|
82
|
-
type: SanitizationResultType.ValidIp,
|
|
83
|
-
ip: inputTrimmedAsIp,
|
|
84
|
-
ipVersion,
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
if (inputTrimmed.length > DOMAIN_LENGTH_MAX) {
|
|
88
|
-
return {
|
|
89
|
-
type: SanitizationResultType.Error,
|
|
90
|
-
errors: [createDomainMaxLengthError(inputTrimmed)],
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
const labels = inputTrimmed.split(LABEL_SEPARATOR);
|
|
94
|
-
const lastLabel = labels[labels.length - 1];
|
|
95
|
-
// If the last label is the special root label, ignore it
|
|
96
|
-
if (lastLabel === LABEL_ROOT) {
|
|
97
|
-
labels.pop();
|
|
98
|
-
}
|
|
99
|
-
const labelValidationErrors = [];
|
|
100
|
-
let column = 1;
|
|
101
|
-
for (const label of labels) {
|
|
102
|
-
// According to https://tools.ietf.org/html/rfc6761 labels should
|
|
103
|
-
// only contain ASCII letters, digits and hyphens (LDH).
|
|
104
|
-
const invalidCharacter = /[^\da-z-]/iu.exec(label);
|
|
105
|
-
if (invalidCharacter) {
|
|
106
|
-
labelValidationErrors.push(createLabelInvalidCharacterError(label, invalidCharacter[0], invalidCharacter.index + 1));
|
|
107
|
-
}
|
|
108
|
-
else if (
|
|
109
|
-
// We can use .length here to check for the octet size because
|
|
110
|
-
// label can only contain ASCII LDH characters at this point.
|
|
111
|
-
label.length < LABEL_LENGTH_MIN) {
|
|
112
|
-
labelValidationErrors.push(createLabelMinLengthError(label, column));
|
|
113
|
-
}
|
|
114
|
-
else if (label.length > LABEL_LENGTH_MAX) {
|
|
115
|
-
labelValidationErrors.push(createLabelMaxLengthError(label, column));
|
|
116
|
-
}
|
|
117
|
-
column += label.length + LABEL_SEPARATOR.length;
|
|
118
|
-
}
|
|
119
|
-
if (labelValidationErrors.length > 0) {
|
|
120
|
-
return {
|
|
121
|
-
type: SanitizationResultType.Error,
|
|
122
|
-
errors: labelValidationErrors,
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
return {
|
|
126
|
-
type: SanitizationResultType.ValidDomain,
|
|
127
|
-
domain: inputTrimmed,
|
|
128
|
-
labels,
|
|
129
|
-
};
|
|
130
|
-
};
|
|
131
|
-
exports.sanitize = sanitize;
|
|
132
|
-
//# sourceMappingURL=sanitize.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../src/sanitize.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.done = void 0;
|
|
16
|
-
const path_1 = require("path");
|
|
17
|
-
const fs_1 = __importDefault(require("fs"));
|
|
18
|
-
const util_1 = require("util");
|
|
19
|
-
const fetch_psl_1 = require("../psl/fetch-psl");
|
|
20
|
-
// TODO: Replace this with fs promises once we removed Node 8
|
|
21
|
-
const fs = {
|
|
22
|
-
writeFile: (0, util_1.promisify)(fs_1.default.writeFile),
|
|
23
|
-
};
|
|
24
|
-
exports.done = (() => __awaiter(void 0, void 0, void 0, function* () {
|
|
25
|
-
const pathToPslFixture = (0, path_1.resolve)(__dirname, "tests", "fixtures", "public-suffix-list.txt");
|
|
26
|
-
const psl = yield (0, fetch_psl_1.fetchPsl)();
|
|
27
|
-
yield fs.writeFile(pathToPslFixture, psl);
|
|
28
|
-
}))();
|
|
29
|
-
//# sourceMappingURL=update-psl-fixture.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"update-psl-fixture.js","sourceRoot":"","sources":["../../../src/scripts/update-psl-fixture.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,+BAA+B;AAC/B,4CAA4B;AAC5B,+BAAiC;AACjC,gDAA4C;AAE5C,6DAA6D;AAC7D,MAAM,EAAE,GAAG;IACT,SAAS,EAAE,IAAA,gBAAS,EAAC,YAAU,CAAC,SAAS,CAAC;CAC3C,CAAC;AAEW,QAAA,IAAI,GAAG,CAAC,GAAS,EAAE;IAC9B,MAAM,gBAAgB,GAAG,IAAA,cAAO,EAC9B,SAAS,EACT,OAAO,EACP,UAAU,EACV,wBAAwB,CACzB,CAAC;IAEF,MAAM,GAAG,GAAG,MAAM,IAAA,oBAAQ,GAAE,CAAC;IAE7B,MAAM,EAAE,CAAC,SAAS,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;AAC5C,CAAC,CAAA,CAAC,EAAE,CAAC"}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.done = void 0;
|
|
16
|
-
const path_1 = require("path");
|
|
17
|
-
const fs_1 = __importDefault(require("fs"));
|
|
18
|
-
const util_1 = require("util");
|
|
19
|
-
const update_tries_1 = require("../update-tries");
|
|
20
|
-
const config_1 = require("../config");
|
|
21
|
-
// TODO: Replace this with fs promises once we removed Node 8
|
|
22
|
-
const fs = {
|
|
23
|
-
writeFile: (0, util_1.promisify)(fs_1.default.writeFile),
|
|
24
|
-
};
|
|
25
|
-
const writeTriesToFiles = ({ serializedIcannTrie, serializedPrivateTrie, }) => __awaiter(void 0, void 0, void 0, function* () {
|
|
26
|
-
const indexOfScriptArg = process.argv.lastIndexOf("--");
|
|
27
|
-
const targetDirectories = process.argv.slice(indexOfScriptArg + 1);
|
|
28
|
-
yield Promise.all(targetDirectories.map((targetDirectory) => __awaiter(void 0, void 0, void 0, function* () {
|
|
29
|
-
const pathToIcannTrie = (0, path_1.resolve)(__dirname, targetDirectory, "icann.json");
|
|
30
|
-
const pathToPrivateTrie = (0, path_1.resolve)(__dirname, targetDirectory, "private.json");
|
|
31
|
-
const pathToTrieInfoFile = (0, path_1.resolve)(__dirname, targetDirectory, "info.json");
|
|
32
|
-
console.warn(`Writing ${pathToIcannTrie}...`);
|
|
33
|
-
console.warn(`Writing ${pathToPrivateTrie}...`);
|
|
34
|
-
console.warn(`Writing ${pathToTrieInfoFile}...`);
|
|
35
|
-
yield Promise.all([
|
|
36
|
-
fs.writeFile(pathToIcannTrie, JSON.stringify(serializedIcannTrie)),
|
|
37
|
-
fs.writeFile(pathToPrivateTrie, JSON.stringify(serializedPrivateTrie)),
|
|
38
|
-
fs.writeFile(pathToTrieInfoFile, JSON.stringify({
|
|
39
|
-
updatedAt: new Date(),
|
|
40
|
-
})),
|
|
41
|
-
]);
|
|
42
|
-
})));
|
|
43
|
-
});
|
|
44
|
-
exports.done = (() => __awaiter(void 0, void 0, void 0, function* () {
|
|
45
|
-
console.warn(`Fetching public suffix list from ${config_1.PUBLIC_SUFFIX_URL}...`);
|
|
46
|
-
yield writeTriesToFiles(yield (0, update_tries_1.fetchBuildSerializeTries)());
|
|
47
|
-
}))();
|
|
48
|
-
//# sourceMappingURL=update-tries.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"update-tries.js","sourceRoot":"","sources":["../../../src/scripts/update-tries.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,+BAA+B;AAC/B,4CAA4B;AAC5B,+BAAiC;AACjC,kDAA2D;AAC3D,sCAA8C;AAG9C,6DAA6D;AAC7D,MAAM,EAAE,GAAG;IACT,SAAS,EAAE,IAAA,gBAAS,EAAC,YAAU,CAAC,SAAS,CAAC;CAC3C,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAO,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,CAAO,eAAe,EAAE,EAAE;QAC9C,MAAM,eAAe,GAAG,IAAA,cAAO,EAAC,SAAS,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;QAC1E,MAAM,iBAAiB,GAAG,IAAA,cAAO,EAC/B,SAAS,EACT,eAAe,EACf,cAAc,CACf,CAAC;QACF,MAAM,kBAAkB,GAAG,IAAA,cAAO,EAChC,SAAS,EACT,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,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YAClE,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;YACtE,EAAE,CAAC,SAAS,CACV,kBAAkB,EAClB,IAAI,CAAC,SAAS,CAAC;gBACb,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC,CACH;SACF,CAAC,CAAC;IACL,CAAC,CAAA,CAAC,CACH,CAAC;AACJ,CAAC,CAAA,CAAC;AAEW,QAAA,IAAI,GAAG,CAAC,GAAS,EAAE;IAC9B,OAAO,CAAC,IAAI,CAAC,oCAAoC,0BAAiB,KAAK,CAAC,CAAC;IAEzE,MAAM,iBAAiB,CAAC,MAAM,IAAA,uCAAwB,GAAE,CAAC,CAAC;AAC5D,CAAC,CAAA,CAAC,EAAE,CAAC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.privateTrie = exports.icannTrie = void 0;
|
|
7
|
-
const icann_json_1 = __importDefault(require("../serialized-tries/icann.json"));
|
|
8
|
-
exports.icannTrie = icann_json_1.default;
|
|
9
|
-
const private_json_1 = __importDefault(require("../serialized-tries/private.json"));
|
|
10
|
-
exports.privateTrie = private_json_1.default;
|
|
11
|
-
//# sourceMappingURL=serialized-tries.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"serialized-tries.js","sourceRoot":"","sources":["../../src/serialized-tries.ts"],"names":[],"mappings":";;;;;;AAAA,gFAAuD;AAG9C,oBAHF,oBAAS,CAGE;AAFlB,oFAA2D;AAEvC,sBAFb,sBAAW,CAEa"}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.runSmokeTest = void 0;
|
|
4
|
-
const assert_1 = require("assert");
|
|
5
|
-
const main_1 = require("./main");
|
|
6
|
-
const runSmokeTest = () => {
|
|
7
|
-
(0, assert_1.deepStrictEqual)((0, main_1.parseDomain)("www.example.com"), {
|
|
8
|
-
hostname: "www.example.com",
|
|
9
|
-
type: "LISTED",
|
|
10
|
-
labels: ["www", "example", "com"],
|
|
11
|
-
subDomains: ["www"],
|
|
12
|
-
domain: "example",
|
|
13
|
-
topLevelDomains: ["com"],
|
|
14
|
-
icann: {
|
|
15
|
-
subDomains: ["www"],
|
|
16
|
-
domain: "example",
|
|
17
|
-
topLevelDomains: ["com"],
|
|
18
|
-
},
|
|
19
|
-
});
|
|
20
|
-
(0, assert_1.deepStrictEqual)((0, main_1.parseDomain)("www.example.co.uk"), {
|
|
21
|
-
hostname: "www.example.co.uk",
|
|
22
|
-
type: "LISTED",
|
|
23
|
-
labels: ["www", "example", "co", "uk"],
|
|
24
|
-
subDomains: ["www"],
|
|
25
|
-
domain: "example",
|
|
26
|
-
topLevelDomains: ["co", "uk"],
|
|
27
|
-
icann: {
|
|
28
|
-
subDomains: ["www"],
|
|
29
|
-
domain: "example",
|
|
30
|
-
topLevelDomains: ["co", "uk"],
|
|
31
|
-
},
|
|
32
|
-
});
|
|
33
|
-
(0, assert_1.deepStrictEqual)((0, main_1.parseDomain)("www.example.cloudfront.net"), {
|
|
34
|
-
hostname: "www.example.cloudfront.net",
|
|
35
|
-
type: "LISTED",
|
|
36
|
-
labels: ["www", "example", "cloudfront", "net"],
|
|
37
|
-
subDomains: ["www"],
|
|
38
|
-
domain: "example",
|
|
39
|
-
topLevelDomains: ["cloudfront", "net"],
|
|
40
|
-
icann: {
|
|
41
|
-
subDomains: ["www", "example"],
|
|
42
|
-
domain: "cloudfront",
|
|
43
|
-
topLevelDomains: ["net"],
|
|
44
|
-
},
|
|
45
|
-
});
|
|
46
|
-
// TODO: Use fromUrl once we dropped Node v8 support
|
|
47
|
-
// deepStrictEqual(parseDomain(fromUrl("www.食狮.公司.cn")), {
|
|
48
|
-
(0, assert_1.deepStrictEqual)((0, main_1.parseDomain)("www.xn--85x722f.xn--55qx5d.cn"), {
|
|
49
|
-
hostname: "www.xn--85x722f.xn--55qx5d.cn",
|
|
50
|
-
type: "LISTED",
|
|
51
|
-
labels: ["www", "xn--85x722f", "xn--55qx5d", "cn"],
|
|
52
|
-
subDomains: ["www"],
|
|
53
|
-
domain: "xn--85x722f",
|
|
54
|
-
topLevelDomains: ["xn--55qx5d", "cn"],
|
|
55
|
-
icann: {
|
|
56
|
-
subDomains: ["www"],
|
|
57
|
-
domain: "xn--85x722f",
|
|
58
|
-
topLevelDomains: ["xn--55qx5d", "cn"],
|
|
59
|
-
},
|
|
60
|
-
});
|
|
61
|
-
};
|
|
62
|
-
exports.runSmokeTest = runSmokeTest;
|
|
63
|
-
//# sourceMappingURL=smoke-test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"smoke-test.js","sourceRoot":"","sources":["../../src/smoke-test.ts"],"names":[],"mappings":";;;AAAA,mCAAyC;AACzC,iCAAqC;AAE9B,MAAM,YAAY,GAAG,GAAG,EAAE;IAC/B,IAAA,wBAAe,EAAC,IAAA,kBAAW,EAAC,iBAAiB,CAAC,EAAE;QAC9C,QAAQ,EAAE,iBAAiB;QAC3B,IAAI,EAAE,QAAQ;QACd,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,IAAA,wBAAe,EAAC,IAAA,kBAAW,EAAC,mBAAmB,CAAC,EAAE;QAChD,QAAQ,EAAE,mBAAmB;QAC7B,IAAI,EAAE,QAAQ;QACd,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,IAAA,wBAAe,EAAC,IAAA,kBAAW,EAAC,4BAA4B,CAAC,EAAE;QACzD,QAAQ,EAAE,4BAA4B;QACtC,IAAI,EAAE,QAAQ;QACd,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,oDAAoD;IACpD,0DAA0D;IAC1D,IAAA,wBAAe,EAAC,IAAA,kBAAW,EAAC,+BAA+B,CAAC,EAAE;QAC5D,QAAQ,EAAE,+BAA+B;QACzC,IAAI,EAAE,QAAQ;QACd,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;AAvDW,QAAA,YAAY,gBAuDvB"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.EXCEPTION = exports.WILDCARD = exports.RESET = exports.DOWN = exports.SAME = exports.UP = void 0;
|
|
4
|
-
// UP, SAME, DOWN, RESET should not be special regex characters in a character class.
|
|
5
|
-
exports.UP = "<"; // one level up
|
|
6
|
-
exports.SAME = ","; // same level
|
|
7
|
-
exports.DOWN = ">"; // one level down
|
|
8
|
-
exports.RESET = "|"; // reset level index and start new
|
|
9
|
-
exports.WILDCARD = "*"; // as defined by publicsuffix.org
|
|
10
|
-
exports.EXCEPTION = "!"; // as defined by publicsuffix.org
|
|
11
|
-
//# sourceMappingURL=characters.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"characters.js","sourceRoot":"","sources":["../../../src/trie/characters.ts"],"names":[],"mappings":";;;AAAA,qFAAqF;AACxE,QAAA,EAAE,GAAG,GAAG,CAAC,CAAC,eAAe;AACzB,QAAA,IAAI,GAAG,GAAG,CAAC,CAAC,aAAa;AACzB,QAAA,IAAI,GAAG,GAAG,CAAC,CAAC,iBAAiB;AAC7B,QAAA,KAAK,GAAG,GAAG,CAAC,CAAC,kCAAkC;AAC/C,QAAA,QAAQ,GAAG,GAAG,CAAC,CAAC,iCAAiC;AACjD,QAAA,SAAS,GAAG,GAAG,CAAC,CAAC,iCAAiC"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createTrieFromList = void 0;
|
|
4
|
-
const nodes_1 = require("./nodes");
|
|
5
|
-
const createTrieFromList = (list) => {
|
|
6
|
-
const root = (0, nodes_1.createRootNode)();
|
|
7
|
-
for (const rule of list) {
|
|
8
|
-
let node = root;
|
|
9
|
-
for (const label of rule.split(".").reverse()) {
|
|
10
|
-
node = (0, nodes_1.createOrGetChild)(node, label);
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
return root;
|
|
14
|
-
};
|
|
15
|
-
exports.createTrieFromList = createTrieFromList;
|
|
16
|
-
//# sourceMappingURL=create-trie.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-trie.js","sourceRoot":"","sources":["../../../src/trie/create-trie.ts"],"names":[],"mappings":";;;AAAA,mCAAqE;AAE9D,MAAM,kBAAkB,GAAG,CAAC,IAAmB,EAAE,EAAE;IACxD,MAAM,IAAI,GAAG,IAAA,sBAAc,GAAE,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;QACvB,IAAI,IAAI,GAAa,IAAI,CAAC;QAE1B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7C,IAAI,GAAG,IAAA,wBAAgB,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;SACtC;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAZW,QAAA,kBAAkB,sBAY7B"}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
-
}) : (function(o, m, k, k2) {
|
|
6
|
-
if (k2 === undefined) k2 = k;
|
|
7
|
-
o[k2] = m[k];
|
|
8
|
-
}));
|
|
9
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
-
}) : function(o, v) {
|
|
12
|
-
o["default"] = v;
|
|
13
|
-
});
|
|
14
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
-
if (mod && mod.__esModule) return mod;
|
|
16
|
-
var result = {};
|
|
17
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
-
__setModuleDefault(result, mod);
|
|
19
|
-
return result;
|
|
20
|
-
};
|
|
21
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
-
exports.lookUpTldsInTrie = void 0;
|
|
23
|
-
const characters = __importStar(require("./characters"));
|
|
24
|
-
const lookUpTldsInTrie = (labels, trie) => {
|
|
25
|
-
const labelsToCheck = labels.slice();
|
|
26
|
-
const tlds = [];
|
|
27
|
-
let node = trie;
|
|
28
|
-
while (labelsToCheck.length !== 0) {
|
|
29
|
-
const label = labelsToCheck.pop();
|
|
30
|
-
const labelLowerCase = label.toLowerCase();
|
|
31
|
-
if (node.children.has(characters.WILDCARD)) {
|
|
32
|
-
if (node.children.has(characters.EXCEPTION + labelLowerCase)) {
|
|
33
|
-
break;
|
|
34
|
-
}
|
|
35
|
-
node = node.children.get(characters.WILDCARD);
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
if (node.children.has(labelLowerCase) === false) {
|
|
39
|
-
break;
|
|
40
|
-
}
|
|
41
|
-
node = node.children.get(labelLowerCase);
|
|
42
|
-
}
|
|
43
|
-
tlds.unshift(label);
|
|
44
|
-
}
|
|
45
|
-
return tlds;
|
|
46
|
-
};
|
|
47
|
-
exports.lookUpTldsInTrie = lookUpTldsInTrie;
|
|
48
|
-
//# sourceMappingURL=look-up.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"look-up.js","sourceRoot":"","sources":["../../../src/trie/look-up.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,yDAA2C;AAIpC,MAAM,gBAAgB,GAAG,CAAC,MAAoB,EAAE,IAAc,EAAE,EAAE;IACvE,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IACrC,MAAM,IAAI,GAAiB,EAAE,CAAC;IAC9B,IAAI,IAAI,GAAG,IAAI,CAAC;IAEhB,OAAO,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;QACjC,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;YAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,GAAG,cAAc,CAAC,EAAE;gBAC5D,MAAM;aACP;YACD,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAa,CAAC;SAC3D;aAAM;YACL,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,KAAK,EAAE;gBAC/C,MAAM;aACP;YACD,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAa,CAAC;SACtD;QAED,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;KACrB;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAzBW,QAAA,gBAAgB,oBAyB3B"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createOrGetChild = exports.createRootNode = exports.NODE_TYPE_CHILD = exports.NODE_TYPE_ROOT = void 0;
|
|
4
|
-
exports.NODE_TYPE_ROOT = Symbol("ROOT");
|
|
5
|
-
exports.NODE_TYPE_CHILD = Symbol("CHILD");
|
|
6
|
-
const createRootNode = () => {
|
|
7
|
-
return {
|
|
8
|
-
type: exports.NODE_TYPE_ROOT,
|
|
9
|
-
children: new Map(),
|
|
10
|
-
};
|
|
11
|
-
};
|
|
12
|
-
exports.createRootNode = createRootNode;
|
|
13
|
-
const createOrGetChild = (parent, label) => {
|
|
14
|
-
let child = parent.children.get(label);
|
|
15
|
-
if (child === undefined) {
|
|
16
|
-
child = {
|
|
17
|
-
type: exports.NODE_TYPE_CHILD,
|
|
18
|
-
label,
|
|
19
|
-
children: new Map(),
|
|
20
|
-
parent,
|
|
21
|
-
};
|
|
22
|
-
parent.children.set(label, child);
|
|
23
|
-
}
|
|
24
|
-
return child;
|
|
25
|
-
};
|
|
26
|
-
exports.createOrGetChild = createOrGetChild;
|
|
27
|
-
//# sourceMappingURL=nodes.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../../src/trie/nodes.ts"],"names":[],"mappings":";;;AAAa,QAAA,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAChC,QAAA,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;AAexC,MAAM,cAAc,GAAG,GAAiB,EAAE;IAC/C,OAAO;QACL,IAAI,EAAE,sBAAc;QACpB,QAAQ,EAAE,IAAI,GAAG,EAAE;KACpB,CAAC;AACJ,CAAC,CAAC;AALW,QAAA,cAAc,kBAKzB;AAEK,MAAM,gBAAgB,GAAG,CAAC,MAAgB,EAAE,KAAa,EAAE,EAAE;IAClE,IAAI,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAEvC,IAAI,KAAK,KAAK,SAAS,EAAE;QACvB,KAAK,GAAG;YACN,IAAI,EAAE,uBAAe;YACrB,KAAK;YACL,QAAQ,EAAE,IAAI,GAAG,EAAE;YACnB,MAAM;SACP,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;KACnC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAdW,QAAA,gBAAgB,oBAc3B"}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
-
}) : (function(o, m, k, k2) {
|
|
6
|
-
if (k2 === undefined) k2 = k;
|
|
7
|
-
o[k2] = m[k];
|
|
8
|
-
}));
|
|
9
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
-
}) : function(o, v) {
|
|
12
|
-
o["default"] = v;
|
|
13
|
-
});
|
|
14
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
-
if (mod && mod.__esModule) return mod;
|
|
16
|
-
var result = {};
|
|
17
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
-
__setModuleDefault(result, mod);
|
|
19
|
-
return result;
|
|
20
|
-
};
|
|
21
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
-
exports.parseTrie = void 0;
|
|
23
|
-
const characters = __importStar(require("./characters"));
|
|
24
|
-
const nodes_1 = require("./nodes");
|
|
25
|
-
const parseTrie = (serializedTrie) => {
|
|
26
|
-
const rootNode = (0, nodes_1.createRootNode)();
|
|
27
|
-
let domain = "";
|
|
28
|
-
let parentNode = rootNode;
|
|
29
|
-
// Type assertion necessary here due to a TypeScript unsoundness
|
|
30
|
-
// https://github.com/microsoft/TypeScript/issues/9998#issuecomment-235963457
|
|
31
|
-
let node = rootNode;
|
|
32
|
-
const addDomain = () => {
|
|
33
|
-
node = (0, nodes_1.createOrGetChild)(parentNode, domain);
|
|
34
|
-
domain = "";
|
|
35
|
-
};
|
|
36
|
-
for (let i = 0; i < serializedTrie.length; i++) {
|
|
37
|
-
const char = serializedTrie.charAt(i);
|
|
38
|
-
switch (char) {
|
|
39
|
-
case characters.SAME: {
|
|
40
|
-
addDomain();
|
|
41
|
-
continue;
|
|
42
|
-
}
|
|
43
|
-
case characters.DOWN: {
|
|
44
|
-
addDomain();
|
|
45
|
-
parentNode = node;
|
|
46
|
-
continue;
|
|
47
|
-
}
|
|
48
|
-
case characters.RESET: {
|
|
49
|
-
addDomain();
|
|
50
|
-
parentNode = rootNode;
|
|
51
|
-
continue;
|
|
52
|
-
}
|
|
53
|
-
case characters.UP: {
|
|
54
|
-
if (parentNode.type === nodes_1.NODE_TYPE_ROOT) {
|
|
55
|
-
throw new Error(`Error in serialized trie at position ${i}: Cannot go up, current parent node is already root`);
|
|
56
|
-
}
|
|
57
|
-
addDomain();
|
|
58
|
-
parentNode = parentNode.parent;
|
|
59
|
-
continue;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
domain += char;
|
|
63
|
-
}
|
|
64
|
-
if (domain !== "") {
|
|
65
|
-
addDomain();
|
|
66
|
-
}
|
|
67
|
-
return rootNode;
|
|
68
|
-
};
|
|
69
|
-
exports.parseTrie = parseTrie;
|
|
70
|
-
//# sourceMappingURL=parse-trie.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parse-trie.js","sourceRoot":"","sources":["../../../src/trie/parse-trie.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,yDAA2C;AAC3C,mCAKiB;AAEV,MAAM,SAAS,GAAG,CAAC,cAAsB,EAAE,EAAE;IAClD,MAAM,QAAQ,GAAG,IAAA,sBAAc,GAAE,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,IAAA,wBAAgB,EAAC,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;QAC9C,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAEtC,QAAQ,IAAI,EAAE;YACZ,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC;gBACpB,SAAS,EAAE,CAAC;gBACZ,SAAS;aACV;YACD,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC;gBACpB,SAAS,EAAE,CAAC;gBACZ,UAAU,GAAG,IAAI,CAAC;gBAClB,SAAS;aACV;YACD,KAAK,UAAU,CAAC,KAAK,CAAC,CAAC;gBACrB,SAAS,EAAE,CAAC;gBACZ,UAAU,GAAG,QAAQ,CAAC;gBACtB,SAAS;aACV;YACD,KAAK,UAAU,CAAC,EAAE,CAAC,CAAC;gBAClB,IAAI,UAAU,CAAC,IAAI,KAAK,sBAAc,EAAE;oBACtC,MAAM,IAAI,KAAK,CACb,wCAAwC,CAAC,qDAAqD,CAC/F,CAAC;iBACH;gBACD,SAAS,EAAE,CAAC;gBACZ,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;gBAC/B,SAAS;aACV;SACF;QACD,MAAM,IAAI,IAAI,CAAC;KAChB;IAED,IAAI,MAAM,KAAK,EAAE,EAAE;QACjB,SAAS,EAAE,CAAC;KACb;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAlDW,QAAA,SAAS,aAkDpB"}
|