Skip to content

Commit 9a86aed

Browse files
committed
feat(rules): support enabling and disabling individual rule items
1 parent 1b73cda commit 9a86aed

File tree

5 files changed

+24
-4
lines changed

5 files changed

+24
-4
lines changed

frontend/src/constant/profile.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ export const RulesConfigDefaults = (
218218
{
219219
id: RuleType.InsertionPoint,
220220
type: RuleType.InsertionPoint,
221+
enable: true,
221222
payload: '',
222223
proxy: '',
223224
'no-resolve': false,
@@ -231,6 +232,7 @@ export const RulesConfigDefaults = (
231232
{
232233
id: sampleID(),
233234
type: RuleType.Logic,
235+
enable: true,
234236
payload: 'AND,((DST-PORT,443),(NETWORK,udp))',
235237
proxy: ids[3],
236238
'no-resolve': false,
@@ -244,6 +246,7 @@ export const RulesConfigDefaults = (
244246
{
245247
id: sampleID(),
246248
type: RuleType.RuleSet,
249+
enable: true,
247250
payload:
248251
'https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@meta/geo/geosite/category-ads-all.mrs',
249252
proxy: ids[3],
@@ -258,6 +261,7 @@ export const RulesConfigDefaults = (
258261
{
259262
id: sampleID(),
260263
type: RuleType.RuleSet,
264+
enable: true,
261265
payload:
262266
'https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@meta/geo/geoip/private.mrs',
263267
proxy: ids[2],
@@ -272,6 +276,7 @@ export const RulesConfigDefaults = (
272276
{
273277
id: sampleID(),
274278
type: RuleType.RuleSet,
279+
enable: true,
275280
payload: 'https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@meta/geo/geoip/cn.mrs',
276281
proxy: ids[2],
277282
'no-resolve': true,
@@ -285,6 +290,7 @@ export const RulesConfigDefaults = (
285290
{
286291
id: sampleID(),
287292
type: RuleType.RuleSet,
293+
enable: true,
288294
payload:
289295
'https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@meta/geo/geosite/private.mrs',
290296
proxy: ids[2],
@@ -299,6 +305,7 @@ export const RulesConfigDefaults = (
299305
{
300306
id: sampleID(),
301307
type: RuleType.RuleSet,
308+
enable: true,
302309
payload: 'https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@meta/geo/geosite/cn.mrs',
303310
proxy: ids[2],
304311
'no-resolve': false,
@@ -312,6 +319,7 @@ export const RulesConfigDefaults = (
312319
{
313320
id: sampleID(),
314321
type: RuleType.RuleSet,
322+
enable: true,
315323
payload:
316324
'https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@meta/geo/geosite/geolocation-!cn.mrs',
317325
proxy: ids[0],
@@ -326,6 +334,7 @@ export const RulesConfigDefaults = (
326334
{
327335
id: sampleID(),
328336
type: RuleType.Match,
337+
enable: true,
329338
payload: '',
330339
proxy: ids[4],
331340
'no-resolve': false,

frontend/src/stores/profiles.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ export type ProfileType = {
119119
}[]
120120
rulesConfig: {
121121
id: string
122+
enable: boolean
122123
type: RuleType
123124
payload: string
124125
proxy: string
@@ -158,6 +159,9 @@ export const useProfilesStore = defineStore('profiles', () => {
158159
profile.tunConfig['route-exclude-address'] = []
159160
}
160161
profile.rulesConfig.forEach((rule) => {
162+
if (typeof rule.enable === 'undefined') {
163+
rule.enable = true
164+
}
161165
if (!rule['ruleset-type']) {
162166
rule['ruleset-type'] = 'file'
163167
rule['ruleset-name'] = ''

frontend/src/utils/generator.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ const generateRuleProviders = async (
228228
}
229229

230230
rules
231-
.filter((rule) => rule.type === 'RULE-SET')
231+
.filter((rule) => rule.type === 'RULE-SET' && rule.enable)
232232
.forEach((rule) => {
233233
if (rule['ruleset-type'] === 'file') {
234234
appendLocalProvider(rule.payload)
@@ -328,8 +328,8 @@ export const generateConfig = async (originalProfile: ProfileType) => {
328328
)
329329

330330
config['rules'] = profile.rulesConfig
331-
.filter(({ type }) => {
332-
if (type === RuleType.InsertionPoint) {
331+
.filter(({ type, enable }) => {
332+
if (type === RuleType.InsertionPoint || !enable) {
333333
return false
334334
}
335335
return (

frontend/src/utils/restorer.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export const restoreProfile = (
3636
{
3737
id: RuleType.InsertionPoint,
3838
type: RuleType.InsertionPoint,
39+
enable: true,
3940
payload: '',
4041
proxy: '',
4142
'no-resolve': false,
@@ -145,6 +146,7 @@ export const restoreProfile = (
145146
profile.rulesConfig.push({
146147
id: index.toString(),
147148
type: type,
149+
enable: true,
148150
payload: provider.type == 'inline' ? stringify(provider.payload) : provider.url,
149151
proxy: _proxy,
150152
'no-resolve': !!noResolve,
@@ -165,6 +167,7 @@ export const restoreProfile = (
165167
profile.rulesConfig.push({
166168
id: index.toString(),
167169
type: type as RuleType,
170+
enable: true,
168171
payload: type === 'MATCH' ? '' : payload,
169172
proxy: _proxy,
170173
'no-resolve': !!noResolve,

frontend/src/views/ProfilesView/components/RulesConfig.vue

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ const showModal = ref(false)
2828
const fields = ref<ProfileType['rulesConfig'][number]>({
2929
id: sampleID(),
3030
type: RuleType.RuleSet,
31+
enable: true,
3132
payload: '',
3233
proxy: '',
3334
'no-resolve': false,
@@ -73,6 +74,7 @@ const handleAdd = () => {
7374
fields.value = {
7475
id: sampleID(),
7576
type: RuleType.RuleSet,
77+
enable: true,
7678
payload: '',
7779
proxy: '',
7880
'no-resolve': false,
@@ -92,6 +94,7 @@ const handleAddInsertionPoint = () => {
9294
rules.value.unshift({
9395
id: RuleType.InsertionPoint,
9496
type: RuleType.InsertionPoint,
97+
enable: true,
9598
payload: '',
9699
proxy: '',
97100
'no-resolve': false,
@@ -173,7 +176,8 @@ const showLost = () => message.warn('kernel.rules.notFound')
173176
</Button>
174177
</Divider>
175178
</div>
176-
<div v-else class="flex items-center py-2">
179+
<div v-else class="flex items-center py-2 gap-8">
180+
<Switch v-model="r.enable" size="small" border="square" />
177181
<div class="font-bold">
178182
<span v-if="hasLost(r)" @click="showLost" class="warn cursor-pointer"> [ ! ] </span>
179183
<span v-if="notSupport(r)" @click="showNotSupport" class="warn cursor-pointer">

0 commit comments

Comments
 (0)