Feat: internal Clash YAML merge

This commit is contained in:
SukkaW
2024-06-16 01:44:54 +08:00
parent 6ee6e436f9
commit c0f979ae05
6 changed files with 94 additions and 29 deletions

View File

@@ -7,6 +7,7 @@ import { compareAndWriteFile, createRuleset } from './lib/create-file';
import { task } from './trace'; import { task } from './trace';
import { SHARED_DESCRIPTION } from './lib/constants'; import { SHARED_DESCRIPTION } from './lib/constants';
import { createMemoizedPromise } from './lib/memo-promise'; import { createMemoizedPromise } from './lib/memo-promise';
import * as yaml from 'yaml';
export const getDomesticAndDirectDomainsRulesetPromise = createMemoizedPromise(async () => { export const getDomesticAndDirectDomainsRulesetPromise = createMemoizedPromise(async () => {
const domestics = await readFileIntoProcessedArray(path.resolve(import.meta.dir, '../Source/non_ip/domestic.conf')); 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) => { export const buildDomesticRuleset = task(import.meta.main, import.meta.path)(async (span) => {
const res = await getDomesticAndDirectDomainsRulesetPromise(); const res = await getDomesticAndDirectDomainsRulesetPromise();
const dataset = [...Object.entries(DOMESTICS), ...Object.entries(DIRECTS), ...Object.entries(LANS)];
return Promise.all([ return Promise.all([
createRuleset( createRuleset(
span, span,
@@ -79,8 +82,7 @@ export const buildDomesticRuleset = task(import.meta.main, import.meta.path)(asy
`#!desc=Last Updated: ${new Date().toISOString()}`, `#!desc=Last Updated: ${new Date().toISOString()}`,
'', '',
'[Host]', '[Host]',
...([...Object.entries(DOMESTICS), ...Object.entries(DIRECTS), ...Object.entries(LANS)]) ...dataset.flatMap(([, { domains, dns, ...rest }]) => [
.flatMap(([, { domains, dns, ...rest }]) => [
...( ...(
'hosts' in rest 'hosts' in rest
? Object.entries(rest.hosts).flatMap(([dns, ips]: [dns: string, ips: string[]]) => `${dns} = ${ips.join(', ')}`) ? Object.entries(rest.hosts).flatMap(([dns, ips]: [dns: string, ips: string[]]) => `${dns} = ${ips.join(', ')}`)
@@ -93,6 +95,41 @@ export const buildDomesticRuleset = task(import.meta.main, import.meta.path)(asy
]) ])
], ],
path.resolve(import.meta.dir, '../Modules/sukka_local_dns_mapping.sgmodule') 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<Record<string, string | string[]>>(
(acc, [, { domains, dns }]) => {
domains.forEach((domain) => {
acc[`+.${domain}`] = dns === 'system'
? [
'system://',
'system',
'dhcp://system'
]
: dns;
});
return acc;
},
{}
)
},
hosts: dataset.reduce<Record<string, string>>(
(acc, [, { domains, dns, ...rest }]) => {
if ('hosts' in rest) {
Object.assign(acc, rest.hosts);
}
return acc;
},
{}
)
},
{ version: '1.1' }
)
) )
]); ]);
}); });

View File

@@ -2,10 +2,9 @@ import path from 'path';
import { task } from './trace'; import { task } from './trace';
import { compareAndWriteFile } from './lib/create-file'; import { compareAndWriteFile } from './lib/create-file';
import { DIRECTS, LANS } from '../Source/non_ip/direct'; import { DIRECTS, LANS } from '../Source/non_ip/direct';
import * as yaml from 'yaml';
const HOSTNAMES = [ 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 // Network Detection, Captive Portal
'msftncsi.com', 'msftncsi.com',
'msftconnecttest.com', 'msftconnecttest.com',
@@ -41,18 +40,36 @@ const HOSTNAMES = [
'*.battlenet.com.cn', '*.battlenet.com.cn',
'*.blzstatic.cn', '*.blzstatic.cn',
'*.battlenet.com' '*.battlenet.com'
] as const; ];
export const buildAlwaysRealIPModule = task(import.meta.main, import.meta.path)(async (span) => { export const buildAlwaysRealIPModule = task(import.meta.main, import.meta.path)(async (span) => {
return compareAndWriteFile( // 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, span,
[ [
'#!name=[Sukka] Always Real IP Plus', '#!name=[Sukka] Always Real IP Plus',
`#!desc=Last Updated: ${new Date().toISOString()}`, `#!desc=Last Updated: ${new Date().toISOString()}`,
'', '',
'[General]', '[General]',
`always-real-ip = %APPEND% ${HOSTNAMES.join(', ')}` `always-real-ip = %APPEND% ${HOSTNAMES.concat(surge).join(', ')}`
], ],
path.resolve(import.meta.dir, '../Modules/sukka_common_always_realip.sgmodule') 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' }
)
)
]);
}); });

View File

@@ -1,3 +1,11 @@
export interface DNSMapping {
hosts?: {
[domain: string]: string[]
},
dns: string,
domains: string[]
}
export const DIRECTS = { export const DIRECTS = {
ROUTER: { ROUTER: {
dns: 'system', dns: 'system',
@@ -79,7 +87,7 @@ export const DIRECTS = {
'local.adguard.org' 'local.adguard.org'
] ]
} }
} as const; } satisfies Record<string, DNSMapping>;
export const LANS = { export const LANS = {
LAN: { LAN: {
@@ -111,4 +119,4 @@ export const LANS = {
'254.169.in-addr.arpa' '254.169.in-addr.arpa'
] ]
} }
}; } satisfies Record<string, DNSMapping>;

View File

@@ -1,3 +1,5 @@
import type { DNSMapping } from './direct';
export const DOMESTICS = { export const DOMESTICS = {
ALIBABA: { ALIBABA: {
hosts: { hosts: {
@@ -307,4 +309,4 @@ export const DOMESTICS = {
'baomitu.com' 'baomitu.com'
] ]
} }
} as const; } satisfies Record<string, DNSMapping>;

BIN
bun.lockb

Binary file not shown.

View File

@@ -30,7 +30,8 @@
"table": "^6.8.2", "table": "^6.8.2",
"tar-stream": "^3.1.7", "tar-stream": "^3.1.7",
"tldts": "^6.1.26", "tldts": "^6.1.26",
"tldts-experimental": "^6.1.26" "tldts-experimental": "^6.1.26",
"yaml": "^2.4.5"
}, },
"devDependencies": { "devDependencies": {
"@eslint-sukka/node": "6.0.0-beta.3", "@eslint-sukka/node": "6.0.0-beta.3",