瀏覽代碼

Feat: legacy Clash Premium support

SukkaW 11 月之前
父節點
當前提交
70c5625199

+ 1 - 0
Build/constants/dir.ts

@@ -11,6 +11,7 @@ export const PUBLIC_DIR = process.env.PUBLIC_DIR || path.resolve(ROOT_DIR, 'publ
 
 export const OUTPUT_SURGE_DIR = path.join(PUBLIC_DIR, 'List');
 export const OUTPUT_CLASH_DIR = path.resolve(PUBLIC_DIR, 'Clash');
+export const OUTPUT_LEAGCY_CLASH_PREMIUM = path.resolve(PUBLIC_DIR, 'LegacyClashPremium');
 export const OUTPUT_SINGBOX_DIR = path.resolve(PUBLIC_DIR, 'sing-box');
 export const OUTPUT_MODULES_DIR = path.resolve(PUBLIC_DIR, 'Modules');
 export const OUTPUT_MODULES_RULES_DIR = path.resolve(OUTPUT_MODULES_DIR, 'Rules');

+ 1 - 1
Build/lib/create-file.ts

@@ -95,7 +95,7 @@ export async function compareAndWriteFile(span: Span, linesA: string[], filePath
     return;
   }
 
-  return span.traceChildAsync(`writing ${filePath}`, async () => {
+  return span.traceChildAsync<void>(`writing ${filePath}`, async () => {
     const linesALen = linesA.length;
 
     // The default highwater mark is normally 16384,

+ 2 - 2
Build/lib/misc.ts

@@ -29,7 +29,7 @@ interface Write {
   (
     destination: string,
     input: NodeJS.TypedArray | string,
-  ): Promise<unknown>
+  ): Promise<void>
 }
 
 export function mkdirp(dir: string) {
@@ -39,7 +39,7 @@ export function mkdirp(dir: string) {
   return fsp.mkdir(dir, { recursive: true });
 }
 
-export const writeFile: Write = async (destination: string, input, dir = dirname(destination)) => {
+export const writeFile: Write = async (destination: string, input, dir = dirname(destination)): Promise<void> => {
   const p = mkdirp(dir);
   if (p) {
     await p;

+ 4 - 1
Build/lib/rules/ruleset.ts

@@ -1,5 +1,6 @@
 import type { Span } from '../../trace';
 import { ClashClassicRuleSet } from '../writing-strategy/clash';
+import { LegacyClashPremiumRuleSet } from '../writing-strategy/legacy-clash-premium';
 import { SingboxSource } from '../writing-strategy/singbox';
 import { SurgeRuleSet } from '../writing-strategy/surge';
 import { FileOutput } from './base';
@@ -11,6 +12,7 @@ export class RulesetOutput extends FileOutput {
     this.strategies = [
       new SurgeRuleSet(type),
       new ClashClassicRuleSet(type),
+      new LegacyClashPremiumRuleSet(type),
       new SingboxSource(type)
     ];
   }
@@ -40,7 +42,8 @@ export class ClashOnlyRulesetOutput extends FileOutput {
     super(span, id);
 
     this.strategies = [
-      new ClashClassicRuleSet(type)
+      new ClashClassicRuleSet(type),
+      new LegacyClashPremiumRuleSet(type)
     ];
   }
 }

+ 1 - 1
Build/lib/writing-strategy/clash.ts

@@ -84,7 +84,7 @@ export class ClashIPSet extends BaseWriteStrategy {
 }
 
 export class ClashClassicRuleSet extends BaseWriteStrategy {
-  public readonly name = 'clash classic ruleset';
+  public readonly name: string = 'clash classic ruleset';
 
   readonly fileExtension = 'txt';
 

+ 18 - 0
Build/lib/writing-strategy/legacy-clash-premium.ts

@@ -0,0 +1,18 @@
+import { noop } from 'foxts/noop';
+import { OUTPUT_LEAGCY_CLASH_PREMIUM } from '../../constants/dir';
+import { ClashClassicRuleSet } from './clash';
+
+export class LegacyClashPremiumRuleSet extends ClashClassicRuleSet {
+  public override readonly name = 'legacy clash premium ruleset';
+
+  readonly fileExtension = 'txt';
+
+  protected result: string[] = ['DOMAIN,this_ruleset_is_made_by_sukkaw.ruleset.skk.moe'];
+
+  constructor(public readonly type: 'ip' | 'non_ip' /* | (string & {}) */, public readonly outputDir = OUTPUT_LEAGCY_CLASH_PREMIUM) {
+    super(type, outputDir);
+  }
+
+  override writeDomainWildcards = noop;
+  override writeIpAsns = noop;
+}