domain-rank 0.1.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/exports/domain-rank.csv +10021 -0
- package/exports/domain-rank.json +70142 -0
- package/exports/domain-rank.ndjson +10020 -0
- package/package.json +33 -0
- package/packages/domain-rank/exports/domain-rank.csv +10021 -0
- package/packages/domain-rank/exports/domain-rank.json +70142 -0
- package/packages/domain-rank/exports/domain-rank.ndjson +10020 -0
- package/readme.md +33 -0
- package/src/domain-api.ts +79 -0
- package/src/domain-exceptions.ts +24 -0
- package/src/domain-name-formatter.ts +136 -0
- package/src/duplicates.d.ts +3 -0
- package/src/duplicates.js +413 -0
- package/src/export.ts +98 -0
- package/src/favicons.js +213 -0
- package/src/import-domains-1m.js +170 -0
- package/src/merge-domain-lists.ts +109 -0
- package/src/parse-domain-info.ts +99 -0
- package/test/domain.test.js +13 -0
- package/test/search.test.js +360 -0
- package/tsconfig.json +19 -0
- package/vite.config.ts +18 -0
package/readme.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
### [Live Demo](https://domain-rank.vercel.app)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Domain Info From Any URL
|
|
5
|
+
|
|
6
|
+
* Domain Name: nytimes.com
|
|
7
|
+
* Source Name: New York Times (from cache for top 1000 or parsing)
|
|
8
|
+
* Influence Rank: 89 (from [Official Tranco List]( https://tranco-list.eu/))
|
|
9
|
+
* Favicon: URL (with Google Favicons API) or base64 string
|
|
10
|
+
|
|
11
|
+
### Domain Rank Options:
|
|
12
|
+
|
|
13
|
+
* [Official Tranco List]( https://tranco-list.eu/) aggregates multiple ranking providers (Cisco Umbrella, Majestic, Farsight, Chrome UX Report, [Cloudflare Domain Radar](https://radar.cloudflare.com/domains)) to generate manipulation-resistant popularity lists. The list is updated daily (UTC).
|
|
14
|
+
* [CommonCrawl](https://commoncrawl.org) is nonprofit for open source public dataset that crawls and downloads the entire internet 100TB urls and html. It shows how trustworthy and influential a domain is based on links pointing to that domain's pages across all 120+ million domains.
|
|
15
|
+
|
|
16
|
+
### Use Cases
|
|
17
|
+
|
|
18
|
+
* Bookmark Lists and Web App Launcher
|
|
19
|
+
* Autocomplete for search engine or URL bar, with typo-tolerance fuzzy
|
|
20
|
+
* LLM Chatbot for Web App Recommendations
|
|
21
|
+
|
|
22
|
+
### Exporter (CLI)
|
|
23
|
+
|
|
24
|
+
Build the exporter with Vite and produce JSON/CSV/NDJSON exports from the bundled data.
|
|
25
|
+
|
|
26
|
+
Run locally from the package root:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
pnpm run build:export
|
|
30
|
+
pnpm run export -- --formats=json,csv,ndjson --out=./exports
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The command writes `domain-rank.json`, `domain-rank.csv`, and `domain-rank.ndjson` into `./exports` by default.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
|
|
3
|
+
interface FaviconCache {
|
|
4
|
+
[domain: string]: string;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Get favicon for a URL or domain as base64 string using Google's favicon API
|
|
9
|
+
*/
|
|
10
|
+
export async function getFaviconForDomain(
|
|
11
|
+
urlOrDomain: string,
|
|
12
|
+
formatBase64: boolean = true
|
|
13
|
+
): Promise<string> {
|
|
14
|
+
// Extract domain from URL or use as-is
|
|
15
|
+
const domain = isURLValid(urlOrDomain)
|
|
16
|
+
? new URL(urlOrDomain.startsWith('http') ? urlOrDomain : 'https://' + urlOrDomain).hostname
|
|
17
|
+
: urlOrDomain;
|
|
18
|
+
|
|
19
|
+
// Check cache first - look for domain in domain-info.json
|
|
20
|
+
try {
|
|
21
|
+
const cachePath = './data/domain-info.json';
|
|
22
|
+
if (fs.existsSync(cachePath)) {
|
|
23
|
+
const cacheData = JSON.parse(fs.readFileSync(cachePath, 'utf8'));
|
|
24
|
+
if (cacheData[domain]) {
|
|
25
|
+
console.log(`Cache hit for domain: ${domain}`);
|
|
26
|
+
// Return cached favicon if available, or proceed with API call
|
|
27
|
+
// For now, we'll still make the API call but log the cache hit
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
} catch (error) {
|
|
31
|
+
console.warn(`Cache check failed for ${domain}:`, (error as Error).message);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const faviconURL = 'https://www.google.com/s2/favicons?domain=' + encodeURIComponent(domain);
|
|
35
|
+
const cacheFavicon: FaviconCache = JSON.parse(fs.readFileSync('./data/favicons.json', 'utf8'));
|
|
36
|
+
|
|
37
|
+
return formatBase64
|
|
38
|
+
? cacheFavicon[domain] || Buffer.from(await (await fetch(faviconURL)).arrayBuffer()).toString('base64')
|
|
39
|
+
: faviconURL;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Extract TLD and hostname from domain in Regex. There's two or more part
|
|
44
|
+
* TLDs (https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains)
|
|
45
|
+
* so it is hard to tell if host.secondTLD.tld or host.tld is correct way
|
|
46
|
+
* to get root domain (e.g. abc.go.jp, abc.co.uk)
|
|
47
|
+
*/
|
|
48
|
+
export function convertURLToDomain(domain: string): string {
|
|
49
|
+
const tldRegExp = new RegExp(
|
|
50
|
+
"(?=[^^]).(fr|de|cz|at|com|wiki|co|edu|gov|info|mil|id|" +
|
|
51
|
+
"gv|tv|int|name|net|org|pro|ac|me|ltd|parliament)(.|$).*$"
|
|
52
|
+
);
|
|
53
|
+
const match =
|
|
54
|
+
domain.match(tldRegExp) ||
|
|
55
|
+
domain.match(/(?=[^^])\.[^a-z]{1,2}\.[^\.]{2,4}$/) ||
|
|
56
|
+
domain.match(/\.[^\.]{2,}$/);
|
|
57
|
+
const tld = match && match.index;
|
|
58
|
+
let domainWithoutSuffix = domain.substring(0, tld);
|
|
59
|
+
|
|
60
|
+
// Get the main domain part, handling subdomains
|
|
61
|
+
if (domainWithoutSuffix.includes(".")) {
|
|
62
|
+
// Split by dots and get the last two parts for domains like en.wikipedia.org
|
|
63
|
+
const parts = domainWithoutSuffix.split(".");
|
|
64
|
+
if (parts.length >= 2) {
|
|
65
|
+
domainWithoutSuffix = parts.slice(-2).join(".");
|
|
66
|
+
} else {
|
|
67
|
+
domainWithoutSuffix = parts[parts.length - 1];
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return domainWithoutSuffix;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Checks if a string is a valid URL.
|
|
75
|
+
*/
|
|
76
|
+
export function isURLValid(url: string): boolean {
|
|
77
|
+
return /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/
|
|
78
|
+
.test(url);
|
|
79
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const domainExceptions: Record<string, string> = {
|
|
2
|
+
"pepsico.com": "PepsiCo",
|
|
3
|
+
"doc.gov": "U.S. Department of Commerce",
|
|
4
|
+
"wustl.edu": "Washington University in St. Louis",
|
|
5
|
+
"unwomen.org": "UN Women",
|
|
6
|
+
"gatech.edu": "Georgia Tech",
|
|
7
|
+
"instructure.com": "Instructure",
|
|
8
|
+
"usembassy.gov": "U.S. Embassy",
|
|
9
|
+
"digitaljournal.com": "Digital Journal",
|
|
10
|
+
"ico.org.uk": "Information Commissioner's Office",
|
|
11
|
+
"colorado.edu": "University of Colorado",
|
|
12
|
+
"anu.edu.au": "Australian National University",
|
|
13
|
+
"syr.edu": "Syracuse University",
|
|
14
|
+
"ucsb.edu": "UC Santa Barbara",
|
|
15
|
+
"imperial.ac.uk": "Imperial College London",
|
|
16
|
+
"grist.org": "Grist",
|
|
17
|
+
"iucn.org": "IUCN",
|
|
18
|
+
"corporatefinanceinstitute.com": "Corporate Finance Institute",
|
|
19
|
+
"aph.gov.au": "Australian Parliament House",
|
|
20
|
+
"reference.com": "Reference.com",
|
|
21
|
+
"timeshighereducation.com": "Times Higher Education",
|
|
22
|
+
"hopkinsmedicine.org": "Johns Hopkins Medicine",
|
|
23
|
+
"ustr.gov": "United States Trade Representative",
|
|
24
|
+
};
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { getDomainWithoutSuffix } from "tldts";
|
|
2
|
+
import { duplicates, removals, titles } from "./duplicates.js";
|
|
3
|
+
import { domainExceptions } from "./domain-exceptions.js";
|
|
4
|
+
|
|
5
|
+
export function shouldRemoveDomain(domain: string): boolean {
|
|
6
|
+
return removals.some((r) => r.main === domain);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function findMainDomain(domain: string): string | null {
|
|
10
|
+
for (const duplicate of duplicates) {
|
|
11
|
+
if (duplicate.alt && duplicate.alt.includes(domain)) {
|
|
12
|
+
return duplicate.main;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function getTitleOverride(domain: string): string | null {
|
|
19
|
+
return titles[domain] || domainExceptions[domain] || null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const STOP_WORDS = new Set([
|
|
23
|
+
"a", "an", "and", "are", "as", "at", "be", "by", "for", "from", "has",
|
|
24
|
+
"he", "in", "is", "it", "its", "of", "on", "that", "the", "to", "was",
|
|
25
|
+
"were", "will", "with",
|
|
26
|
+
]);
|
|
27
|
+
|
|
28
|
+
const DOMAIN_ENDINGS_RE = /\.(com|net|org|io|gov|edu|co\.uk)$/i;
|
|
29
|
+
const COMMON_WORDS_RE =
|
|
30
|
+
/(post|the|insider|news|times|daily|weekly|herald|tribune|journal|gazette|press|star|sun|mail|today|now|live|tv|radio|web|net|tech|blog|online|digital|media|corp|inc|ltd|llc)/gi;
|
|
31
|
+
|
|
32
|
+
export function formatDomainAsTitle(domain: string): string {
|
|
33
|
+
let source = getDomainWithoutSuffix(domain) ?? domain;
|
|
34
|
+
|
|
35
|
+
if (DOMAIN_ENDINGS_RE.test(source)) {
|
|
36
|
+
source = source.replace(DOMAIN_ENDINGS_RE, "");
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
source = source
|
|
40
|
+
.replace(/([a-z])([A-Z])/g, "$1 $2")
|
|
41
|
+
.replace(/([a-zA-Z])(\d)/g, "$1 $2")
|
|
42
|
+
.replace(/(\d)([a-zA-Z])/g, "$1 $2")
|
|
43
|
+
.replace(/([a-z])([A-Z][a-z])/g, "$1 $2")
|
|
44
|
+
.replace(new RegExp(`(${COMMON_WORDS_RE.source})([a-z])`, "gi"), "$1 $2")
|
|
45
|
+
.replace(new RegExp(`([a-z])(${COMMON_WORDS_RE.source})`, "gi"), "$1 $2")
|
|
46
|
+
.replace(/\s+/g, " ")
|
|
47
|
+
.replace(".com", "")
|
|
48
|
+
.replace(/home/gi, "")
|
|
49
|
+
.trim();
|
|
50
|
+
|
|
51
|
+
source = source
|
|
52
|
+
.split(" ")
|
|
53
|
+
.map((word) => {
|
|
54
|
+
const lower = word.toLowerCase();
|
|
55
|
+
return word.length <= 3 && !STOP_WORDS.has(lower)
|
|
56
|
+
? word.toUpperCase()
|
|
57
|
+
: word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
|
|
58
|
+
})
|
|
59
|
+
.join(" ");
|
|
60
|
+
|
|
61
|
+
if (source.replace(/\s/g, "").length < 5) {
|
|
62
|
+
source = source.toUpperCase();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return source;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function cleanSourceTitle(title: string): string | null {
|
|
69
|
+
if (!title) return null;
|
|
70
|
+
|
|
71
|
+
let cleaned = title.trim();
|
|
72
|
+
const TITLE_SPLITTERS_RE = /( [|\-\/:»] )|( - )|(\|)/;
|
|
73
|
+
|
|
74
|
+
if (TITLE_SPLITTERS_RE.test(cleaned)) {
|
|
75
|
+
const parts = cleaned.split(TITLE_SPLITTERS_RE);
|
|
76
|
+
const longest = parts.reduce(
|
|
77
|
+
(acc, part) => ((part?.length ?? 0) > (acc?.length ?? 0) ? part : acc),
|
|
78
|
+
""
|
|
79
|
+
);
|
|
80
|
+
if (longest.length > 10) cleaned = longest;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const SUFFIXES = [
|
|
84
|
+
" - Home", " | Home", " - Official Site", " | Official Site",
|
|
85
|
+
" - Official Website", " | Official Website", " - Official", " | Official",
|
|
86
|
+
" - Welcome", " | Welcome", " - Homepage", " | Homepage",
|
|
87
|
+
];
|
|
88
|
+
|
|
89
|
+
for (const suffix of SUFFIXES) {
|
|
90
|
+
if (cleaned.endsWith(suffix)) cleaned = cleaned.slice(0, -suffix.length);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (cleaned.length > 150) cleaned = cleaned.substring(0, 150);
|
|
94
|
+
|
|
95
|
+
cleaned = cleaned
|
|
96
|
+
.replace(/<\/?[^>]+(>|$)/g, "")
|
|
97
|
+
.replace(/\s+/g, " ")
|
|
98
|
+
.trim();
|
|
99
|
+
|
|
100
|
+
return cleaned.length > 0 ? cleaned : null;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export async function getSourceTitle(domain: string): Promise<string | null> {
|
|
104
|
+
try {
|
|
105
|
+
const controller = new AbortController();
|
|
106
|
+
const timeoutId = setTimeout(() => controller.abort(), 5000);
|
|
107
|
+
|
|
108
|
+
const response = await fetch(`https://${domain}`, {
|
|
109
|
+
headers: {
|
|
110
|
+
"User-Agent":
|
|
111
|
+
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
|
|
112
|
+
},
|
|
113
|
+
signal: controller.signal,
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
clearTimeout(timeoutId);
|
|
117
|
+
if (!response.ok) return null;
|
|
118
|
+
|
|
119
|
+
const html = await response.text();
|
|
120
|
+
|
|
121
|
+
const ogTitle = html.match(
|
|
122
|
+
/<meta[^>]*property=["']og:title["'][^>]*content=["']([^"']+)["'][^>]*>/i
|
|
123
|
+
);
|
|
124
|
+
if (ogTitle) return ogTitle[1].trim();
|
|
125
|
+
|
|
126
|
+
const title = html.match(/<title[^>]*>([^<]+)<\/title>/i);
|
|
127
|
+
if (title) return title[1].trim();
|
|
128
|
+
|
|
129
|
+
return null;
|
|
130
|
+
} catch (error) {
|
|
131
|
+
console.log(
|
|
132
|
+
`Could not get source title for ${domain}: ${(error as Error).message}`
|
|
133
|
+
);
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Domain name duplicate alternatives found in top domains
|
|
3
|
+
* Infrastructure tools are to be removed
|
|
4
|
+
* Alternative domains are to be listed under main.
|
|
5
|
+
*/
|
|
6
|
+
export const titles = {
|
|
7
|
+
"state.tx.us":"Texas State Government",
|
|
8
|
+
"ufl.edu": "University of Florida",
|
|
9
|
+
"admin.ch": " Swiss Government",
|
|
10
|
+
"tufts.edu": "Tufts University",
|
|
11
|
+
"usgs.gov": "U.S. Geological Survey",
|
|
12
|
+
"theglobeandmail.com": "The Globe and Mail",
|
|
13
|
+
"spiegel.de": "Spiegel German News",
|
|
14
|
+
"justice.gov": "US Department of Justice",
|
|
15
|
+
"gov.ru": "Russian Government",
|
|
16
|
+
"martinfowler.com": "Martin Fowler",
|
|
17
|
+
"optimizely.com": "Optimizely",
|
|
18
|
+
"loc.gov": "Library of Congress",
|
|
19
|
+
"uci.edu": "UC Irvine",
|
|
20
|
+
"ca.gov": "California Government",
|
|
21
|
+
"cam.ac.uk": "Cambridge University",
|
|
22
|
+
"baidu.com": "Baidu",
|
|
23
|
+
"tandfonline.com": "Taylor & Francis Journals",
|
|
24
|
+
"ohchr.org": "UN Human Rights Office",
|
|
25
|
+
"giphy.com": "Giphy",
|
|
26
|
+
"naver.com": "Naver (네이버)",
|
|
27
|
+
"upenn.edu": "University of Pennsylvania",
|
|
28
|
+
"ft.com": "Financial Times",
|
|
29
|
+
"berkeley.edu": "UC Berkeley",
|
|
30
|
+
"kickstarter.com": "Kickstarter",
|
|
31
|
+
"doi.org": "Digital Object Identifier",
|
|
32
|
+
"stackoverflow.com": "StackOverflow",
|
|
33
|
+
"businessinsider.com": "Business Insider",
|
|
34
|
+
"ietf.org": "Internet Engineering Task Force",
|
|
35
|
+
"qq.com":"QQ (腾讯网)",
|
|
36
|
+
"linktr.ee": "Link Tree",
|
|
37
|
+
"vk.com": "VKontakte",
|
|
38
|
+
"bit.ly": "Bitly",
|
|
39
|
+
"europa.eu": "European Union",
|
|
40
|
+
"newyorker.com": "New Yorker",
|
|
41
|
+
"ameblo.jp": "Ameba Japanese",
|
|
42
|
+
"gov.uk": "UK Government",
|
|
43
|
+
"gov.ru": "Russian Government",
|
|
44
|
+
"gov.ca": "Canadian Government",
|
|
45
|
+
"gov.au": "Australian Government",
|
|
46
|
+
"gov.nz": "New Zealand Government",
|
|
47
|
+
"gov.in": "Indian Government",
|
|
48
|
+
"gov.cn": "Chinese Government",
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
export const removals = [
|
|
53
|
+
{ main: "polyfill.io", remove: true },
|
|
54
|
+
{ main: "example.com", remove: true },
|
|
55
|
+
{ main: "example.net", remove: true },
|
|
56
|
+
{ main: "domain.com", remove: true },
|
|
57
|
+
{ main: "jsdelivr.net", remove: true },
|
|
58
|
+
{ main: "gmpg.org", remove: true },
|
|
59
|
+
{ main: "aka.ms", remove: true },
|
|
60
|
+
|
|
61
|
+
{ main: "addthis.com", remove: true },
|
|
62
|
+
{ main: "doubleclick.net", remove: true },
|
|
63
|
+
{ main: "netdna-ssl.com", remove: true },
|
|
64
|
+
]
|
|
65
|
+
export const duplicates = [
|
|
66
|
+
{
|
|
67
|
+
main: "godaddy.com",
|
|
68
|
+
alt: ["wsimg.com"],
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
main: "blogspot.com",
|
|
72
|
+
alt: ["blogger.com", "blogspot.ca", "blogspot.co.uk"],
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
main: "microsoft.com",
|
|
76
|
+
alt: ["windows.net"],
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
main: "huffingtonpost.com",
|
|
80
|
+
alt: ["huffpost.com"],
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
main: "sciencemag.org",
|
|
84
|
+
alt: ["science.org"],
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
main: "theguardian.com",
|
|
88
|
+
alt: ["guardian.co.uk"],
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
main: "bootstrap.com",
|
|
92
|
+
alt: ["bootstrapcdn.com"],
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
main: "telegram.me",
|
|
96
|
+
alt: ["telegram.org", "telegra.ph", "t.me"],
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
main: "netlify.com",
|
|
100
|
+
alt: ["netlify.app"],
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
main: "apple.com",
|
|
104
|
+
alt: ["apple.co"],
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
main: "pinterest.com",
|
|
108
|
+
alt: ["pinterest.co.uk", "pinimg.com"],
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
main: "bbc.co.uk",
|
|
112
|
+
alt: ["bbci.co.uk", "bbc.com"],
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
main: "yandex.ru",
|
|
116
|
+
alt: ["yandex.net"],
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
main: "pewresearch.org",
|
|
120
|
+
alt: ["pewsocialtrends.org"],
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
main: "jenkins.io",
|
|
124
|
+
alt: ["jenkins-ci.org"],
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
main: "wix.com",
|
|
128
|
+
alt: ["wixstatic.com", "wixsite.com"],
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
main: "wordpress.com",
|
|
132
|
+
alt: ["wp.me", "wordpress.org", "wp.com", "w.org", "gravatar.com", "wpengine.com"],
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
main: "amazon.com",
|
|
136
|
+
alt: [
|
|
137
|
+
"amazon.es",
|
|
138
|
+
"amazon.in",
|
|
139
|
+
"amazon.it",
|
|
140
|
+
"amazon.de",
|
|
141
|
+
"amazon.fr",
|
|
142
|
+
"alexa.com",
|
|
143
|
+
"amazon.cn",
|
|
144
|
+
"amazon.co.jp",
|
|
145
|
+
"amazon.com.au",
|
|
146
|
+
"amazon.com.br",
|
|
147
|
+
"amazon.com.cn",
|
|
148
|
+
"amazon.com.hk",
|
|
149
|
+
"amazon.com.mx",
|
|
150
|
+
"amazon.com.sg",
|
|
151
|
+
"amazon.com.tw",
|
|
152
|
+
"amazon.com.mx",
|
|
153
|
+
"cloudfront.net",
|
|
154
|
+
"amzn.to",
|
|
155
|
+
"a.co",
|
|
156
|
+
"amazon.fr",
|
|
157
|
+
"amazon.de",
|
|
158
|
+
"amazon.co.uk",
|
|
159
|
+
"amazonaws.com",
|
|
160
|
+
"media-amazon.com",
|
|
161
|
+
],
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
main: "mailchimp.com",
|
|
165
|
+
alt: ["mailchi.mp", "list-manage.com", "eepurl.com"],
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
main: "flickr.com",
|
|
169
|
+
alt: ["staticflickr.com"],
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
main: "facebook.com",
|
|
173
|
+
alt: ["fb.watch", "facebook.net", "fb.me", "fb.com", "fbcdn.net"],
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
main: "whatapp.com",
|
|
177
|
+
alt: ["wa.me"],
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
main: "thetimes.com",
|
|
181
|
+
alt: ["timesonline.co.uk", "thetimes.co.uk"],
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
main: "youtube.com",
|
|
185
|
+
alt: ["youtu.be", "youtube-nocookie.com", "ytimg.com"],
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
main: "imgbb.com",
|
|
189
|
+
alt: ["ibb.com", "ibb.co"],
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
main: "x.com",
|
|
193
|
+
alt: ["twitter.com", "t.co", "twimg.com"],
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
main: "npmjs.com",
|
|
197
|
+
alt: ["unpkg.com"],
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
main: "github.com",
|
|
201
|
+
alt: ["githubusercontent.com", "github.io", "git-scm.com"],
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
main: "google.com",
|
|
205
|
+
alt: [
|
|
206
|
+
"googleapis.com",
|
|
207
|
+
"g.page",
|
|
208
|
+
"business.site",
|
|
209
|
+
"google-analytics.com",
|
|
210
|
+
"goo.gl",
|
|
211
|
+
"withgoogle.com",
|
|
212
|
+
"ggpht.com",
|
|
213
|
+
"research.google",
|
|
214
|
+
"g.co",
|
|
215
|
+
"translate.goog",
|
|
216
|
+
"googleblog.com",
|
|
217
|
+
"blog.google",
|
|
218
|
+
"forms.gle",
|
|
219
|
+
"googletagmanager.com",
|
|
220
|
+
"googleadservices.com",
|
|
221
|
+
"googleusercontent.com",
|
|
222
|
+
"googlesyndication.com",
|
|
223
|
+
"gstatic.com",
|
|
224
|
+
"google.ad",
|
|
225
|
+
"google.ae",
|
|
226
|
+
"google.com.af",
|
|
227
|
+
"google.com.ag",
|
|
228
|
+
"google.al",
|
|
229
|
+
"google.am",
|
|
230
|
+
"google.co.ao",
|
|
231
|
+
"google.com.ar",
|
|
232
|
+
"google.as",
|
|
233
|
+
"google.at",
|
|
234
|
+
"google.com.au",
|
|
235
|
+
"google.az",
|
|
236
|
+
"google.ba",
|
|
237
|
+
"google.com.bd",
|
|
238
|
+
"google.be",
|
|
239
|
+
"google.bf",
|
|
240
|
+
"google.bg",
|
|
241
|
+
"google.com.bh",
|
|
242
|
+
"google.bi",
|
|
243
|
+
"google.bj",
|
|
244
|
+
"google.com.bn",
|
|
245
|
+
"google.com.bo",
|
|
246
|
+
"google.com.br",
|
|
247
|
+
"google.bs",
|
|
248
|
+
"google.bt",
|
|
249
|
+
"google.co.bw",
|
|
250
|
+
"google.by",
|
|
251
|
+
"google.com.bz",
|
|
252
|
+
"google.ca",
|
|
253
|
+
"google.cd",
|
|
254
|
+
"google.cf",
|
|
255
|
+
"google.cg",
|
|
256
|
+
"google.ch",
|
|
257
|
+
"google.ci",
|
|
258
|
+
"google.co.ck",
|
|
259
|
+
"google.cl",
|
|
260
|
+
"google.cm",
|
|
261
|
+
"google.cn",
|
|
262
|
+
"google.com.co",
|
|
263
|
+
"google.co.cr",
|
|
264
|
+
"google.com.cu",
|
|
265
|
+
"google.cv",
|
|
266
|
+
"google.com.cy",
|
|
267
|
+
"google.cz",
|
|
268
|
+
"google.de",
|
|
269
|
+
"google.dj",
|
|
270
|
+
"google.dk",
|
|
271
|
+
"google.dm",
|
|
272
|
+
"google.com.do",
|
|
273
|
+
"google.dz",
|
|
274
|
+
"google.com.ec",
|
|
275
|
+
"google.ee",
|
|
276
|
+
"google.com.eg",
|
|
277
|
+
"google.es",
|
|
278
|
+
"google.com.et",
|
|
279
|
+
"google.fi",
|
|
280
|
+
"google.com.fj",
|
|
281
|
+
"google.fm",
|
|
282
|
+
"google.fr",
|
|
283
|
+
"google.ga",
|
|
284
|
+
"google.ge",
|
|
285
|
+
"google.gg",
|
|
286
|
+
"google.com.gh",
|
|
287
|
+
"google.com.gi",
|
|
288
|
+
"google.gl",
|
|
289
|
+
"google.gm",
|
|
290
|
+
"google.gr",
|
|
291
|
+
"google.com.gt",
|
|
292
|
+
"google.gy",
|
|
293
|
+
"google.com.hk",
|
|
294
|
+
"google.hn",
|
|
295
|
+
"google.hr",
|
|
296
|
+
"google.ht",
|
|
297
|
+
"google.hu",
|
|
298
|
+
"google.co.id",
|
|
299
|
+
"google.ie",
|
|
300
|
+
"google.co.il",
|
|
301
|
+
"google.im",
|
|
302
|
+
"google.co.in",
|
|
303
|
+
"google.iq",
|
|
304
|
+
"google.is",
|
|
305
|
+
"google.it",
|
|
306
|
+
"google.je",
|
|
307
|
+
"google.com.jm",
|
|
308
|
+
"google.jo",
|
|
309
|
+
"google.co.jp",
|
|
310
|
+
"google.co.ke",
|
|
311
|
+
"google.com.kh",
|
|
312
|
+
"google.ki",
|
|
313
|
+
"google.kg",
|
|
314
|
+
"google.co.kr",
|
|
315
|
+
"google.com.kw",
|
|
316
|
+
"google.kz",
|
|
317
|
+
"google.la",
|
|
318
|
+
"google.com.lb",
|
|
319
|
+
"google.li",
|
|
320
|
+
"google.lk",
|
|
321
|
+
"google.co.ls",
|
|
322
|
+
"google.lt",
|
|
323
|
+
"google.lu",
|
|
324
|
+
"google.lv",
|
|
325
|
+
"google.com.ly",
|
|
326
|
+
"google.co.ma",
|
|
327
|
+
"google.md",
|
|
328
|
+
"google.me",
|
|
329
|
+
"google.mg",
|
|
330
|
+
"google.mk",
|
|
331
|
+
"google.ml",
|
|
332
|
+
"google.com.mm",
|
|
333
|
+
"google.mn",
|
|
334
|
+
"google.com.mt",
|
|
335
|
+
"google.mu",
|
|
336
|
+
"google.mv",
|
|
337
|
+
"google.mw",
|
|
338
|
+
"google.com.mx",
|
|
339
|
+
"google.com.my",
|
|
340
|
+
"google.co.mz",
|
|
341
|
+
"google.com.na",
|
|
342
|
+
"google.com.ng",
|
|
343
|
+
"google.com.ni",
|
|
344
|
+
"google.ne",
|
|
345
|
+
"google.nl",
|
|
346
|
+
"google.no",
|
|
347
|
+
"google.com.np",
|
|
348
|
+
"google.nr",
|
|
349
|
+
"google.nu",
|
|
350
|
+
"google.co.nz",
|
|
351
|
+
"google.com.om",
|
|
352
|
+
"google.com.pa",
|
|
353
|
+
"google.com.pe",
|
|
354
|
+
"google.com.pg",
|
|
355
|
+
"google.com.ph",
|
|
356
|
+
"google.com.pk",
|
|
357
|
+
"google.pl",
|
|
358
|
+
"google.pn",
|
|
359
|
+
"google.com.pr",
|
|
360
|
+
"google.ps",
|
|
361
|
+
"google.pt",
|
|
362
|
+
"google.com.py",
|
|
363
|
+
"google.com.qa",
|
|
364
|
+
"google.ro",
|
|
365
|
+
"google.ru",
|
|
366
|
+
"google.rw",
|
|
367
|
+
"google.com.sa",
|
|
368
|
+
"google.com.sb",
|
|
369
|
+
"google.sc",
|
|
370
|
+
"google.se",
|
|
371
|
+
"google.com.sg",
|
|
372
|
+
"google.sh",
|
|
373
|
+
"google.si",
|
|
374
|
+
"google.sk",
|
|
375
|
+
"google.com.sl",
|
|
376
|
+
"google.sn",
|
|
377
|
+
"google.so",
|
|
378
|
+
"google.sm",
|
|
379
|
+
"google.sr",
|
|
380
|
+
"google.st",
|
|
381
|
+
"google.com.sv",
|
|
382
|
+
"google.td",
|
|
383
|
+
"google.tg",
|
|
384
|
+
"google.co.th",
|
|
385
|
+
"google.com.tj",
|
|
386
|
+
"google.tl",
|
|
387
|
+
"google.tm",
|
|
388
|
+
"google.tn",
|
|
389
|
+
"google.to",
|
|
390
|
+
"google.com.tr",
|
|
391
|
+
"google.tt",
|
|
392
|
+
"googlesource.com",
|
|
393
|
+
"google.com.tw",
|
|
394
|
+
"google.co.tz",
|
|
395
|
+
"google.com.ua",
|
|
396
|
+
"google.co.ug",
|
|
397
|
+
"google.co.uk",
|
|
398
|
+
"google.com.uy",
|
|
399
|
+
"google.co.uz",
|
|
400
|
+
"google.com.vc",
|
|
401
|
+
"google.co.ve",
|
|
402
|
+
"google.co.vi",
|
|
403
|
+
"google.com.vn",
|
|
404
|
+
"google.vu",
|
|
405
|
+
"google.ws",
|
|
406
|
+
"google.rs",
|
|
407
|
+
"google.co.za",
|
|
408
|
+
"google.co.zm",
|
|
409
|
+
"google.co.zw",
|
|
410
|
+
"google.cat",
|
|
411
|
+
],
|
|
412
|
+
},
|
|
413
|
+
];
|