浏览代码

Fix: validate global now supports DOMAIN-KEYWORD

SukkaW 11 月之前
父节点
当前提交
9ebb1db9f7
共有 2 个文件被更改,包括 28 次插入13 次删除
  1. 19 5
      Build/lib/run-against-source-file.ts
  2. 9 8
      Build/validate-gfwlist.ts

+ 19 - 5
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<string> | 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') {

+ 9 - 8
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')