From 70c56251992c6fda1da1b83582e00f706614726f Mon Sep 17 00:00:00 2001 From: SukkaW Date: Tue, 29 Apr 2025 21:54:41 +0800 Subject: [PATCH] Feat: legacy Clash Premium support --- Build/constants/dir.ts | 1 + Build/lib/create-file.ts | 2 +- Build/lib/misc.ts | 4 ++-- Build/lib/rules/ruleset.ts | 5 ++++- Build/lib/writing-strategy/clash.ts | 2 +- .../writing-strategy/legacy-clash-premium.ts | 18 ++++++++++++++++++ 6 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 Build/lib/writing-strategy/legacy-clash-premium.ts diff --git a/Build/constants/dir.ts b/Build/constants/dir.ts index 5064a79f..e4a9d570 100644 --- a/Build/constants/dir.ts +++ b/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'); diff --git a/Build/lib/create-file.ts b/Build/lib/create-file.ts index 54797bab..91e16324 100644 --- a/Build/lib/create-file.ts +++ b/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(`writing ${filePath}`, async () => { const linesALen = linesA.length; // The default highwater mark is normally 16384, diff --git a/Build/lib/misc.ts b/Build/lib/misc.ts index 83e7150f..b9977665 100644 --- a/Build/lib/misc.ts +++ b/Build/lib/misc.ts @@ -29,7 +29,7 @@ interface Write { ( destination: string, input: NodeJS.TypedArray | string, - ): Promise + ): Promise } 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 => { const p = mkdirp(dir); if (p) { await p; diff --git a/Build/lib/rules/ruleset.ts b/Build/lib/rules/ruleset.ts index 140ec591..0b12b4be 100644 --- a/Build/lib/rules/ruleset.ts +++ b/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) ]; } } diff --git a/Build/lib/writing-strategy/clash.ts b/Build/lib/writing-strategy/clash.ts index 1cedc076..babc1895 100644 --- a/Build/lib/writing-strategy/clash.ts +++ b/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'; diff --git a/Build/lib/writing-strategy/legacy-clash-premium.ts b/Build/lib/writing-strategy/legacy-clash-premium.ts new file mode 100644 index 00000000..ca246ace --- /dev/null +++ b/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; +}