diff --git a/Build/lib/run-against-source-file.ts b/Build/lib/run-against-source-file.ts index 6d5b78dc..9cb88f8f 100644 --- a/Build/lib/run-against-source-file.ts +++ b/Build/lib/run-against-source-file.ts @@ -5,7 +5,9 @@ import { processLine } from './process-line'; export default async function runAgainstSourceFile( filePath: string, callback: (domain: string, includeAllSubDomain: boolean) => void, - type?: 'ruleset' | 'domainset' + type?: 'ruleset' | 'domainset', + /** Secret keyword collection, only use for special purpose */ + keywordSet?: Set | null ) { for await (const line of readFileByLine(filePath)) { const l = processLine(line); @@ -22,10 +24,22 @@ export default async function runAgainstSourceFile( if (type === 'ruleset') { const [ruleType, domain] = l.split(',', 3); - if (ruleType === 'DOMAIN') { - callback(domain, false); - } else if (ruleType === 'DOMAIN-SUFFIX') { - callback(domain, true); + switch (ruleType) { + case 'DOMAIN': { + callback(domain, false); + break; + } + case 'DOMAIN-SUFFIX': { + callback(domain, true); + break; + } + case 'DOMAIN-KEYWORD': { + if (keywordSet) { + keywordSet.add(domain); + } + break; + } + // no default } // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- exhaus options } else if (type === 'domainset') { diff --git a/Build/validate-gfwlist.ts b/Build/validate-gfwlist.ts index 7d1892f1..b8c2017c 100644 --- a/Build/validate-gfwlist.ts +++ b/Build/validate-gfwlist.ts @@ -4,7 +4,7 @@ import { HostnameSmolTrie } from './lib/trie'; import yauzl from 'yauzl-promise'; import { fetchRemoteTextByLine } from './lib/fetch-text-by-line'; import path from 'node:path'; -import { OUTPUT_SURGE_DIR } from './constants/dir'; +import { OUTPUT_SURGE_DIR, SOURCE_DIR } from './constants/dir'; import { createRetrieKeywordFilter as createKeywordFilter } from 'foxts/retrie'; import { $$fetch } from './lib/fetch-retry'; import runAgainstSourceFile from './lib/run-against-source-file'; @@ -112,15 +112,16 @@ export async function parseGfwList() { const callback = (domain: string, includeAllSubdomain: boolean) => { gfwListTrie.whitelist(domain, includeAllSubdomain); + topDomainTrie.whitelist(domain, includeAllSubdomain); }; - await Promise.all([ - runAgainstSourceFile(path.join(OUTPUT_SURGE_DIR, 'non_ip/global.conf'), callback, 'ruleset'), - runAgainstSourceFile(path.join(OUTPUT_SURGE_DIR, 'non_ip/reject.conf'), callback, 'ruleset'), - runAgainstSourceFile(path.join(OUTPUT_SURGE_DIR, 'non_ip/telegram.conf'), callback, 'ruleset'), - runAgainstSourceFile(path.resolve(OUTPUT_SURGE_DIR, 'non_ip/stream.conf'), callback, 'ruleset'), - runAgainstSourceFile(path.resolve(OUTPUT_SURGE_DIR, 'non_ip/ai.conf'), callback, 'ruleset'), - runAgainstSourceFile(path.resolve(OUTPUT_SURGE_DIR, 'non_ip/microsoft.conf'), callback, 'ruleset'), + runAgainstSourceFile(path.join(SOURCE_DIR, 'non_ip/global.conf'), callback, 'ruleset', keywordSet), + runAgainstSourceFile(path.join(OUTPUT_SURGE_DIR, 'non_ip/domestic.conf'), callback, 'ruleset', keywordSet), + runAgainstSourceFile(path.join(SOURCE_DIR, 'non_ip/reject.conf'), callback, 'ruleset', keywordSet), + runAgainstSourceFile(path.join(SOURCE_DIR, 'non_ip/telegram.conf'), callback, 'ruleset', keywordSet), + runAgainstSourceFile(path.resolve(OUTPUT_SURGE_DIR, 'non_ip/stream.conf'), callback, 'ruleset', keywordSet), + runAgainstSourceFile(path.resolve(SOURCE_DIR, 'non_ip/ai.conf'), callback, 'ruleset', keywordSet), + runAgainstSourceFile(path.resolve(SOURCE_DIR, 'non_ip/microsoft.conf'), callback, 'ruleset', keywordSet), runAgainstSourceFile(path.resolve(OUTPUT_SURGE_DIR, 'domainset/reject.conf'), callback, 'domainset'), runAgainstSourceFile(path.resolve(OUTPUT_SURGE_DIR, 'domainset/reject_extra.conf'), callback, 'domainset'), runAgainstSourceFile(path.resolve(OUTPUT_SURGE_DIR, 'domainset/cdn.conf'), callback, 'domainset')