Fix: validate global now supports DOMAIN-KEYWORD

This commit is contained in:
SukkaW 2025-04-30 21:13:22 +08:00
parent 07725d6c00
commit 9ebb1db9f7
2 changed files with 28 additions and 13 deletions

View File

@ -5,7 +5,9 @@ import { processLine } from './process-line';
export default async function runAgainstSourceFile( export default async function runAgainstSourceFile(
filePath: string, filePath: string,
callback: (domain: string, includeAllSubDomain: boolean) => void, callback: (domain: string, includeAllSubDomain: boolean) => void,
type?: 'ruleset' | 'domainset' type?: 'ruleset' | 'domainset',
/** Secret keyword collection, only use for special purpose */
keywordSet?: Set<string> | null
) { ) {
for await (const line of readFileByLine(filePath)) { for await (const line of readFileByLine(filePath)) {
const l = processLine(line); const l = processLine(line);
@ -22,10 +24,22 @@ export default async function runAgainstSourceFile(
if (type === 'ruleset') { if (type === 'ruleset') {
const [ruleType, domain] = l.split(',', 3); const [ruleType, domain] = l.split(',', 3);
if (ruleType === 'DOMAIN') { switch (ruleType) {
callback(domain, false); case 'DOMAIN': {
} else if (ruleType === 'DOMAIN-SUFFIX') { callback(domain, false);
callback(domain, true); 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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- exhaus options
} else if (type === 'domainset') { } else if (type === 'domainset') {

View File

@ -4,7 +4,7 @@ import { HostnameSmolTrie } from './lib/trie';
import yauzl from 'yauzl-promise'; import yauzl from 'yauzl-promise';
import { fetchRemoteTextByLine } from './lib/fetch-text-by-line'; import { fetchRemoteTextByLine } from './lib/fetch-text-by-line';
import path from 'node:path'; 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 { createRetrieKeywordFilter as createKeywordFilter } from 'foxts/retrie';
import { $$fetch } from './lib/fetch-retry'; import { $$fetch } from './lib/fetch-retry';
import runAgainstSourceFile from './lib/run-against-source-file'; import runAgainstSourceFile from './lib/run-against-source-file';
@ -112,15 +112,16 @@ export async function parseGfwList() {
const callback = (domain: string, includeAllSubdomain: boolean) => { const callback = (domain: string, includeAllSubdomain: boolean) => {
gfwListTrie.whitelist(domain, includeAllSubdomain); gfwListTrie.whitelist(domain, includeAllSubdomain);
topDomainTrie.whitelist(domain, includeAllSubdomain);
}; };
await Promise.all([ await Promise.all([
runAgainstSourceFile(path.join(OUTPUT_SURGE_DIR, 'non_ip/global.conf'), callback, 'ruleset'), runAgainstSourceFile(path.join(SOURCE_DIR, 'non_ip/global.conf'), callback, 'ruleset', keywordSet),
runAgainstSourceFile(path.join(OUTPUT_SURGE_DIR, 'non_ip/reject.conf'), callback, 'ruleset'), runAgainstSourceFile(path.join(OUTPUT_SURGE_DIR, 'non_ip/domestic.conf'), callback, 'ruleset', keywordSet),
runAgainstSourceFile(path.join(OUTPUT_SURGE_DIR, 'non_ip/telegram.conf'), callback, 'ruleset'), runAgainstSourceFile(path.join(SOURCE_DIR, 'non_ip/reject.conf'), callback, 'ruleset', keywordSet),
runAgainstSourceFile(path.resolve(OUTPUT_SURGE_DIR, 'non_ip/stream.conf'), callback, 'ruleset'), runAgainstSourceFile(path.join(SOURCE_DIR, 'non_ip/telegram.conf'), callback, 'ruleset', keywordSet),
runAgainstSourceFile(path.resolve(OUTPUT_SURGE_DIR, 'non_ip/ai.conf'), callback, 'ruleset'), runAgainstSourceFile(path.resolve(OUTPUT_SURGE_DIR, 'non_ip/stream.conf'), callback, 'ruleset', keywordSet),
runAgainstSourceFile(path.resolve(OUTPUT_SURGE_DIR, 'non_ip/microsoft.conf'), callback, 'ruleset'), 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.conf'), callback, 'domainset'),
runAgainstSourceFile(path.resolve(OUTPUT_SURGE_DIR, 'domainset/reject_extra.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') runAgainstSourceFile(path.resolve(OUTPUT_SURGE_DIR, 'domainset/cdn.conf'), callback, 'domainset')