订阅和规则组支持从文件导入,配置页与表单一批打磨
文件导入走两步:内容先经新端点 POST /api/provider-files 写进内核工作 目录的 providers/ 下(路径白名单校验,只认两个路径助手生成的形状), 成了再写 file 类型的声明——顺序反了内核重载会去读不存在的文件。 file 类型没有地址和自动更新(内核靠文件监视跟进),详情页照此展示, 编辑按钮禁用。ini 导入的取文件按钮换成同一个拖放模块。 订阅的更新间隔改成开关语义:内核只在 interval > 0 时才起定时拉取 (component/resource/fetcher.go:226-228),关掉开关就是不写这个键。 配置页加「更新所有订阅」,详情的「立刻更新」改叫「更新订阅」。 规则表从零开始写入时自动垫上内网直连——保留地址不直连的话第一条 代理规则一生效,访问局域网的流量就全进了代理;按钮改成「补全内网 直连」,只在有缺口时出现。 所有表单对话框点遮罩关闭;失败横幅右侧加关闭按钮。
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import { describe, expect, it } from 'bun:test'
|
||||
import {
|
||||
DEFAULT_INTERVAL,
|
||||
addFileSubscription,
|
||||
addSubscription,
|
||||
listSubscriptions,
|
||||
providerNames,
|
||||
@@ -40,6 +41,8 @@ describe('读出订阅列表', () => {
|
||||
expect(listSubscriptions(base())).toEqual([
|
||||
{
|
||||
name: 'subs',
|
||||
type: 'http',
|
||||
path: './providers/subs.yaml',
|
||||
url: URL,
|
||||
interval: 86400,
|
||||
healthCheck: { url: 'https://www.gstatic.com/generate_204', interval: 300 },
|
||||
@@ -92,6 +95,19 @@ describe('新增订阅', () => {
|
||||
(data['proxy-providers'] as ConfigObject).subs,
|
||||
)
|
||||
})
|
||||
|
||||
it('关掉自动更新时不写 interval 键', () => {
|
||||
const next = addSubscription({}, 'subs2', URL, null)
|
||||
const entry = (next['proxy-providers'] as ConfigObject).subs2 as ConfigObject
|
||||
expect('interval' in entry).toBe(false)
|
||||
})
|
||||
|
||||
it('从文件导入的订阅是 file 类型,没有地址和间隔', () => {
|
||||
const next = addFileSubscription({}, 'subs2')
|
||||
expect(next['proxy-providers']).toEqual({
|
||||
subs2: { type: 'file', path: './providers/subs2.yaml' },
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe('编辑订阅', () => {
|
||||
@@ -112,6 +128,12 @@ describe('编辑订阅', () => {
|
||||
const data = base()
|
||||
expect(updateSubscription(data, 'ghost', URL, 1)).toBe(data)
|
||||
})
|
||||
|
||||
it('关掉自动更新时把已有的 interval 键去掉', () => {
|
||||
const next = updateSubscription(base(), 'subs', URL, null)
|
||||
const entry = (next['proxy-providers'] as ConfigObject).subs as ConfigObject
|
||||
expect('interval' in entry).toBe(false)
|
||||
})
|
||||
})
|
||||
|
||||
describe('删除订阅', () => {
|
||||
|
||||
Reference in New Issue
Block a user