/** * 验证「把入站固定到某条订阅线路」生成的配置内核真的接受。 * * 这个功能会往用户的配置里塞一个自动生成的策略组,光靠单元测试只能证明字符串拼对了, * 证明不了内核认。所以这里走一遍真实的写回路径,再交给 mihomo -t 校验。 * * 用法:bun run scripts/verify-pin.ts <源配置> <输出路径> <线路名> */ import { readFileSync, writeFileSync } from 'node:fs' import { openDocument } from '../vendor/config-editor/index.ts' import type { ConfigObject } from '../vendor/config-editor/index.ts' import { rewriteYaml } from '../server/config-store.ts' import { generatedGroupName, makeFilterGroup, pruneGeneratedGroups } from '../shared/filter-groups.ts' const [src, out, line] = process.argv.slice(2) if (!src || !out || !line) { console.error('用法:bun run scripts/verify-pin.ts <源配置> <输出路径> <线路名>') process.exit(1) } const source = readFileSync(src, 'utf8') const data = JSON.parse(JSON.stringify(openDocument(source).data)) as ConfigObject // 模拟界面上的两个动作:新增一路入站,把它固定到某条订阅线路 data.listeners = [{ name: '容器A', type: 'mixed', port: 17895 }] const group = makeFilterGroup(line, 'subs') if (!group) { console.error(`${line} 的名字里含反引号,无法生成筛选条件`) process.exit(1) } data['proxy-groups'] = [...(data['proxy-groups'] as ConfigObject[]), group] ;(data.listeners as ConfigObject[])[0]!.proxy = generatedGroupName(line) writeFileSync(out, rewriteYaml(source, pruneGeneratedGroups(data)), 'utf8') console.log('生成的组:') console.log(JSON.stringify(group, null, 2))