From c0f979ae05bf8e6b953c8048a5646290f424f2d8 Mon Sep 17 00:00:00 2001 From: SukkaW Date: Sun, 16 Jun 2024 01:44:54 +0800 Subject: [PATCH] Feat: internal Clash YAML merge --- ...c-direct-lan-ruleset-dns-mapping-module.ts | 59 ++++++++++++++---- Build/build-sgmodule-always-realip.ts | 45 ++++++++----- Source/non_ip/direct.ts | 12 +++- Source/non_ip/domestic.ts | 4 +- bun.lockb | Bin 112314 -> 112634 bytes package.json | 3 +- 6 files changed, 94 insertions(+), 29 deletions(-) diff --git a/Build/build-domestic-direct-lan-ruleset-dns-mapping-module.ts b/Build/build-domestic-direct-lan-ruleset-dns-mapping-module.ts index 408f8667..81d4661e 100644 --- a/Build/build-domestic-direct-lan-ruleset-dns-mapping-module.ts +++ b/Build/build-domestic-direct-lan-ruleset-dns-mapping-module.ts @@ -7,6 +7,7 @@ import { compareAndWriteFile, createRuleset } from './lib/create-file'; import { task } from './trace'; import { SHARED_DESCRIPTION } from './lib/constants'; import { createMemoizedPromise } from './lib/memo-promise'; +import * as yaml from 'yaml'; export const getDomesticAndDirectDomainsRulesetPromise = createMemoizedPromise(async () => { const domestics = await readFileIntoProcessedArray(path.resolve(import.meta.dir, '../Source/non_ip/domestic.conf')); @@ -29,6 +30,8 @@ export const getDomesticAndDirectDomainsRulesetPromise = createMemoizedPromise(a export const buildDomesticRuleset = task(import.meta.main, import.meta.path)(async (span) => { const res = await getDomesticAndDirectDomainsRulesetPromise(); + const dataset = [...Object.entries(DOMESTICS), ...Object.entries(DIRECTS), ...Object.entries(LANS)]; + return Promise.all([ createRuleset( span, @@ -79,20 +82,54 @@ export const buildDomesticRuleset = task(import.meta.main, import.meta.path)(asy `#!desc=Last Updated: ${new Date().toISOString()}`, '', '[Host]', - ...([...Object.entries(DOMESTICS), ...Object.entries(DIRECTS), ...Object.entries(LANS)]) - .flatMap(([, { domains, dns, ...rest }]) => [ - ...( - 'hosts' in rest - ? Object.entries(rest.hosts).flatMap(([dns, ips]: [dns: string, ips: string[]]) => `${dns} = ${ips.join(', ')}`) - : [] - ), - ...domains.flatMap((domain) => [ - `${domain} = server:${dns}`, - `*.${domain} = server:${dns}` - ]) + ...dataset.flatMap(([, { domains, dns, ...rest }]) => [ + ...( + 'hosts' in rest + ? Object.entries(rest.hosts).flatMap(([dns, ips]: [dns: string, ips: string[]]) => `${dns} = ${ips.join(', ')}`) + : [] + ), + ...domains.flatMap((domain) => [ + `${domain} = server:${dns}`, + `*.${domain} = server:${dns}` ]) + ]) ], path.resolve(import.meta.dir, '../Modules/sukka_local_dns_mapping.sgmodule') + ), + Bun.write( + path.resolve(import.meta.dir, '../Internal/clash_nameserver_policy.yaml'), + yaml.stringify( + { + dns: { + 'nameserver-policy': dataset.reduce>( + (acc, [, { domains, dns }]) => { + domains.forEach((domain) => { + acc[`+.${domain}`] = dns === 'system' + ? [ + 'system://', + 'system', + 'dhcp://system' + ] + : dns; + }); + + return acc; + }, + {} + ) + }, + hosts: dataset.reduce>( + (acc, [, { domains, dns, ...rest }]) => { + if ('hosts' in rest) { + Object.assign(acc, rest.hosts); + } + return acc; + }, + {} + ) + }, + { version: '1.1' } + ) ) ]); }); diff --git a/Build/build-sgmodule-always-realip.ts b/Build/build-sgmodule-always-realip.ts index b5f2f26e..f42f8aaa 100644 --- a/Build/build-sgmodule-always-realip.ts +++ b/Build/build-sgmodule-always-realip.ts @@ -2,10 +2,9 @@ import path from 'path'; import { task } from './trace'; import { compareAndWriteFile } from './lib/create-file'; import { DIRECTS, LANS } from '../Source/non_ip/direct'; +import * as yaml from 'yaml'; const HOSTNAMES = [ - // Intranet, Router Setup, and mant more - ...([Object.entries(DIRECTS), Object.entries(LANS)]).flatMap(data => data.flatMap(([, { domains }]) => domains.flatMap((domain) => [`*.${domain}`, domain]))), // Network Detection, Captive Portal 'msftncsi.com', 'msftconnecttest.com', @@ -41,18 +40,36 @@ const HOSTNAMES = [ '*.battlenet.com.cn', '*.blzstatic.cn', '*.battlenet.com' -] as const; +]; export const buildAlwaysRealIPModule = task(import.meta.main, import.meta.path)(async (span) => { - return compareAndWriteFile( - span, - [ - '#!name=[Sukka] Always Real IP Plus', - `#!desc=Last Updated: ${new Date().toISOString()}`, - '', - '[General]', - `always-real-ip = %APPEND% ${HOSTNAMES.join(', ')}` - ], - path.resolve(import.meta.dir, '../Modules/sukka_common_always_realip.sgmodule') - ); + // Intranet, Router Setup, and mant more + const dataset = ([Object.entries(DIRECTS), Object.entries(LANS)]); + const surge = dataset.flatMap(data => data.flatMap(([, { domains }]) => domains.flatMap((domain) => [`*.${domain}`, domain]))); + const clash = dataset.flatMap(data => data.flatMap(([, { domains }]) => domains.map((domain) => `+.${domain}`))); + + return Promise.all([ + compareAndWriteFile( + span, + [ + '#!name=[Sukka] Always Real IP Plus', + `#!desc=Last Updated: ${new Date().toISOString()}`, + '', + '[General]', + `always-real-ip = %APPEND% ${HOSTNAMES.concat(surge).join(', ')}` + ], + path.resolve(import.meta.dir, '../Modules/sukka_common_always_realip.sgmodule') + ), + Bun.write( + path.resolve(import.meta.dir, '../Internal/clash_fake_ip_filter.yaml'), + yaml.stringify( + { + dns: { + 'fake-ip-filter': HOSTNAMES.concat(clash) + } + }, + { version: '1.1' } + ) + ) + ]); }); diff --git a/Source/non_ip/direct.ts b/Source/non_ip/direct.ts index b27a0701..23884b2e 100644 --- a/Source/non_ip/direct.ts +++ b/Source/non_ip/direct.ts @@ -1,3 +1,11 @@ +export interface DNSMapping { + hosts?: { + [domain: string]: string[] + }, + dns: string, + domains: string[] +} + export const DIRECTS = { ROUTER: { dns: 'system', @@ -79,7 +87,7 @@ export const DIRECTS = { 'local.adguard.org' ] } -} as const; +} satisfies Record; export const LANS = { LAN: { @@ -111,4 +119,4 @@ export const LANS = { '254.169.in-addr.arpa' ] } -}; +} satisfies Record; diff --git a/Source/non_ip/domestic.ts b/Source/non_ip/domestic.ts index 26c4f5bf..de615fcb 100644 --- a/Source/non_ip/domestic.ts +++ b/Source/non_ip/domestic.ts @@ -1,3 +1,5 @@ +import type { DNSMapping } from './direct'; + export const DOMESTICS = { ALIBABA: { hosts: { @@ -307,4 +309,4 @@ export const DOMESTICS = { 'baomitu.com' ] } -} as const; +} satisfies Record; diff --git a/bun.lockb b/bun.lockb index e8e5683b2144c38449fe4b2ca1ca4205357b6c6e..8cf9d96750ded28c0f0f4f5da0abc0a07efd4391 100755 GIT binary patch delta 19713 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 RmugjQpvx!imd7%$|1UbFfjs~K delta 19527 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 diff --git a/package.json b/package.json index bea55657..d3bb8b87 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,8 @@ "table": "^6.8.2", "tar-stream": "^3.1.7", "tldts": "^6.1.26", - "tldts-experimental": "^6.1.26" + "tldts-experimental": "^6.1.26", + "yaml": "^2.4.5" }, "devDependencies": { "@eslint-sukka/node": "6.0.0-beta.3",