1 | import { toASCII } from "punycode";
|
2 | import { PUBLIC_SUFFIX_MARKER_ICANN_START, PUBLIC_SUFFIX_MARKER_ICANN_END, PUBLIC_SUFFIX_MARKER_PRIVATE_START, PUBLIC_SUFFIX_MARKER_PRIVATE_END, } from "../config";
|
3 | import { createTrieFromList } from "../trie/create-trie";
|
4 | const matchNewLine = /\r?\n/u;
|
5 | const matchComment = /^\s*\/\//u;
|
6 | const matchWhitespace = /^\s*$/u;
|
7 | const extractByMarkers = (listContent, startMarker, endMarker) => {
|
8 | const start = listContent.indexOf(startMarker);
|
9 | const end = listContent.indexOf(endMarker);
|
10 | if (start === -1) {
|
11 | throw new Error(`Missing start marker ${startMarker} in public suffix list`);
|
12 | }
|
13 | if (end === -1) {
|
14 | throw new Error(`Missing end marker ${endMarker} in public suffix list`);
|
15 | }
|
16 | return listContent.slice(start, end);
|
17 | };
|
18 | const containsRule = (line) => matchComment.test(line) === false && matchWhitespace.test(line) === false;
|
19 | const normalizeRule = (rule) =>
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 | toASCII(rule).toLowerCase();
|
34 | const parsePsl = (listContent) => {
|
35 | return {
|
36 | icann: extractByMarkers(listContent, PUBLIC_SUFFIX_MARKER_ICANN_START, PUBLIC_SUFFIX_MARKER_ICANN_END)
|
37 | .split(matchNewLine)
|
38 | .filter(containsRule)
|
39 | .map(normalizeRule),
|
40 | private: extractByMarkers(listContent, PUBLIC_SUFFIX_MARKER_PRIVATE_START, PUBLIC_SUFFIX_MARKER_PRIVATE_END)
|
41 | .split(matchNewLine)
|
42 | .filter(containsRule)
|
43 | .map(normalizeRule),
|
44 | };
|
45 | };
|
46 | export const buildTries = (psl) => {
|
47 | const parsedPsl = parsePsl(psl);
|
48 | const icannTrie = createTrieFromList(parsedPsl.icann);
|
49 | const privateTrie = createTrieFromList(parsedPsl.private);
|
50 | return {
|
51 | icannTrie,
|
52 | privateTrie,
|
53 | };
|
54 | };
|
55 |
|
\ | No newline at end of file |