Surge_by_SukkaW/Dist/validate-gfwlist.cjs
SukkaW d354c5e988
Some checks are pending
Build / Build (push) Waiting to run
Build / Diff output (push) Blocked by required conditions
Build / Deploy to Cloudflare Pages (push) Blocked by required conditions
Build / Deploy to GitHub and GitLab (push) Blocked by required conditions
Chore: maintainance
2025-02-07 17:52:36 +08:00

154 lines
6.6 KiB
JavaScript

'use strict';const fetchRetry=require('./chunks/fetch-retry.D06uBUaW.cjs'),fetchTextByLine=require('./chunks/fetch-text-by-line.YY5b5610.cjs'),normalizeDomain=require('./chunks/normalize-domain.Cfz4j8eP.cjs'),trie=require('./chunks/trie.Vu1FNyv-.cjs'),require$$3$1=require('csv-parse/sync'),require$$0=require('node:path'),require$$3=require('foxts/retrie');require('picocolors'),require('undici'),require('undici-cache-store-better-sqlite3'),require('node:util'),require('node:fs'),require('node:process'),require('node:readline'),require('node:stream/web'),require('foxts/guard'),require('tldts'),require('./chunks/loose-tldts-opt.DLUpGXpj.cjs'),require('foxts/is-probably-ip'),require('./chunks/misc.BpcQjda1.cjs'),require('node:fs/promises'),require('foxts/noop'),require('foxts/fast-string-array-join'),require('foxts/bitwise');var validateGfwlist$1 = {exports: {}};var hasRequiredValidateGfwlist;
function requireValidateGfwlist () {
if (hasRequiredValidateGfwlist) return validateGfwlist$1.exports;
hasRequiredValidateGfwlist = 1;
(function (module, exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "parseGfwList", {
enumerable: true,
get: function() {
return parseGfwList;
}
});
const _processline = /*@__PURE__*/ fetchTextByLine.r();
const _normalizedomain = /*@__PURE__*/ normalizeDomain.r();
const _trie = /*@__PURE__*/ trie.r();
const _sync = require$$3$1;
const _fetchtextbyline = /*@__PURE__*/ fetchTextByLine.a();
const _nodepath = /*#__PURE__*/ _interop_require_default(require$$0);
const _dir = /*@__PURE__*/ fetchRetry.a();
const _retrie = require$$3;
const _fetchretry = /*@__PURE__*/ fetchRetry.r();
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
async function parseGfwList() {
const whiteSet = new Set();
const trie = new _trie.HostnameSmolTrie();
const excludeGfwList = (0, _retrie.createRetrieKeywordFilter)([
'.*',
'*',
'=',
'[',
'/',
'?'
]);
const text = await (await (0, _fetchretry.$$fetch)('https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt')).text();
for (const l of atob(text).split('\n')){
const line = (0, _processline.processLine)(l);
if (!line) continue;
if (excludeGfwList(line)) {
continue;
}
if (line.startsWith('@@||')) {
whiteSet.add('.' + line.slice(4));
continue;
}
if (line.startsWith('@@|http://')) {
whiteSet.add(line.slice(10));
continue;
}
if (line.startsWith('@@|https://')) {
whiteSet.add(line.slice(11));
continue;
}
if (line.startsWith('||')) {
trie.add('.' + line.slice(2));
continue;
}
if (line.startsWith('|')) {
trie.add(line.slice(1));
continue;
}
if (line.startsWith('.')) {
trie.add(line);
continue;
}
const d = (0, _normalizedomain.fastNormalizeDomain)(line);
if (d) {
trie.add(d);
continue;
}
}
for (const l of (await (await (0, _fetchretry.$$fetch)('https://raw.githubusercontent.com/Loyalsoldier/cn-blocked-domain/release/domains.txt')).text()).split('\n')){
trie.add(l);
}
const res = await (await (0, _fetchretry.$$fetch)('https://litter.catbox.moe/sqmgyn.csv', {
headers: {
accept: '*/*',
'user-agent': 'curl/8.9.1'
}
})).text();
const topDomains = (0, _sync.parse)(res);
const keywordSet = new Set();
const runAgainstRuleset = async (ruleset)=>{
for await (const l of (0, _fetchtextbyline.readFileByLine)(ruleset)){
const line = (0, _processline.processLine)(l);
if (!line) continue;
const [type, domain] = line.split(',');
switch(type){
case 'DOMAIN-SUFFIX':
{
trie.whitelist('.' + domain);
break;
}
case 'DOMAIN':
{
trie.whitelist(domain);
break;
}
case 'DOMAIN-KEYWORD':
{
keywordSet.add(domain);
break;
}
}
}
};
const runAgainstDomainset = async (ruleset)=>{
for await (const l of (0, _fetchtextbyline.readFileByLine)(ruleset)){
const line = (0, _processline.processLine)(l);
if (!line) continue;
trie.whitelist(line);
}
};
await Promise.all([
runAgainstRuleset(_nodepath.default.join(_dir.OUTPUT_SURGE_DIR, 'non_ip/global.conf')),
runAgainstRuleset(_nodepath.default.join(_dir.OUTPUT_SURGE_DIR, 'non_ip/reject.conf')),
runAgainstRuleset(_nodepath.default.join(_dir.OUTPUT_SURGE_DIR, 'non_ip/telegram.conf')),
runAgainstRuleset(_nodepath.default.resolve(_dir.OUTPUT_SURGE_DIR, 'non_ip/stream.conf')),
runAgainstRuleset(_nodepath.default.resolve(_dir.OUTPUT_SURGE_DIR, 'non_ip/ai.conf')),
runAgainstRuleset(_nodepath.default.resolve(_dir.OUTPUT_SURGE_DIR, 'non_ip/microsoft.conf')),
runAgainstDomainset(_nodepath.default.resolve(_dir.OUTPUT_SURGE_DIR, 'domainset/reject.conf')),
runAgainstDomainset(_nodepath.default.resolve(_dir.OUTPUT_SURGE_DIR, 'domainset/cdn.conf'))
]);
whiteSet.forEach((domain)=>trie.whitelist(domain));
const kwfilter = (0, _retrie.createRetrieKeywordFilter)([
...keywordSet
]);
const missingTop10000Gfwed = new Set();
console.log(trie.has('.mojim.com'));
for await (const [domain] of topDomains){
if (trie.has(domain) && !kwfilter(domain)) {
missingTop10000Gfwed.add(domain);
}
}
console.log(JSON.stringify(Array.from(missingTop10000Gfwed), null, 2));
return [
whiteSet,
trie,
missingTop10000Gfwed
];
}
if (require.main === module) {
parseGfwList().catch(console.error);
}
} (validateGfwlist$1, validateGfwlist$1.exports));
return validateGfwlist$1.exports;
}var validateGfwlistExports = requireValidateGfwlist();
const validateGfwlist = /*@__PURE__*/fetchRetry.g(validateGfwlistExports);module.exports=validateGfwlist;