Skip to content

Commit fb3500c

Browse files
committed
feat: rename in import
1 parent 0d53469 commit fb3500c

File tree

3 files changed

+80
-10
lines changed

3 files changed

+80
-10
lines changed

docs/docs/zh-CN/guide/task.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ return res.json();
7171

7272
注意:
7373
* 可以在规则的 重定向至、请求/响应头内容、响应体中使用此语法。
74-
* 如果响应类型配置为“文本”,则任何 `{$TASK.task1.*}` 均会获取到完整的响应文本。
74+
* 如果响应类型配置为“文本”,则任何 `{$TASK.task1.*}` 均会获取到完整的响应文本,但不可以直接使用 `{$TASK.task1}`
7575
* 当请求失败或尚未完成请求时,该语法会被替换为空字符串。
7676

7777
## 工具函数

src/pages/options/sections/import-and-export/import-drawer/index.tsx

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,11 @@ export default class ImportDrawer extends React.Component<
9090
}
9191
}
9292

93-
handleConfirm() {
93+
async handleConfirm() {
9494
// 确认导入
95-
const queue: any[] = [];
95+
const queue: Promise<void>[] = [];
9696
const tasks = new Set<string>();
97+
const rules: BasicRule[] = [];
9798
this.state.list.forEach((e: any) => {
9899
// 不导入
99100
if (e.importAction === 3) {
@@ -113,19 +114,56 @@ export default class ImportDrawer extends React.Component<
113114
e.enable = true;
114115
}
115116
getRuleUsedTasks(e).forEach(task => tasks.add(task));
116-
queue.push(Api.saveRule(e));
117+
rules.push(e);
117118
});
118119
// 处理 task 导入
120+
const taskKeyAlias = new Map<string, string>();
119121
if (tasks.size > 0) {
122+
const allTasks = await Api.getTasks();
123+
const taskKeys = allTasks.map(x => x.key);
120124
Array.from(tasks)
121125
.map(x => this.tasks?.[x])
122-
.forEach(t => queue.push(t ? Api.saveTask(t) : Promise.resolve()));
126+
.forEach(t => {
127+
if (!t) {
128+
return Promise.resolve();
129+
}
130+
while (taskKeys.includes(t.key)) {
131+
const newKey = `${t.key}${Math.random().toString(36).substring(1)}`;
132+
taskKeyAlias.set(t.key, newKey);
133+
t.key = newKey;
134+
taskKeys.push(newKey);
135+
}
136+
queue.push(Api.saveTask(t));
137+
});
123138
}
124-
Promise.all(queue).then(() => {
125-
// this.imports.status = 0;
126-
Toast.success(t('import_success'));
127-
this.props.onSuccess?.();
139+
140+
const replaceTaskKeys = (s: string) => {
141+
let res = s;
142+
taskKeyAlias.forEach((value, key) => {
143+
res = res.replaceAll(`{\$TASK.${key}.}`, `{\$TASK.${value}.}`);
144+
});
145+
return res;
146+
};
147+
148+
// 处理 rule 导入
149+
rules.forEach(e => {
150+
if (e.headers) {
151+
Object.keys(e.headers).forEach(key => {
152+
e.headers![key] = replaceTaskKeys(e.headers![key]);
153+
});
154+
}
155+
if (e.to) {
156+
e.to = replaceTaskKeys(e.to);
157+
}
158+
if (e.body?.value) {
159+
e.body.value = replaceTaskKeys(e.body.value);
160+
}
161+
queue.push(Api.saveRule(e));
128162
});
163+
await Promise.all(queue);
164+
// this.imports.status = 0;
165+
Toast.success(t('import_success'));
166+
this.props.onSuccess?.();
129167
this.setState({
130168
list: [],
131169
visible: false,

tests/e2e/task.spec.mjs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
import assert from 'node:assert';
22
import { setTimeout as sleep } from 'node:timers/promises';
33
import { getTask, runTask, saveRule, saveTask } from './scripts/api.mjs';
4-
import { getPageValue, runInBrowsers, runTest } from './scripts/browser.mjs';
4+
import {
5+
getHeader,
6+
getPageValue,
7+
runInBrowsers,
8+
runTest,
9+
} from './scripts/browser.mjs';
510
import { randStr, testServer } from './scripts/utils.mjs';
611

712
describe('Fetch task', () => {
@@ -64,4 +69,31 @@ describe('Fetch task', () => {
6469
}
6570
},
6671
));
72+
73+
describe('Use in headers', () =>
74+
runTest(
75+
['edge_v2', 'chrome_v3', 'firefox_v2', 'firefox_v3'],
76+
async browser => {
77+
const { remove } = await saveRule(browser.popup, {
78+
name: 'test modify request header',
79+
ruleType: 'modifySendHeader',
80+
condition: {
81+
urlPrefix: testServer,
82+
},
83+
isFunction: false,
84+
enable: true,
85+
action: {
86+
name: 'X-Test-Header',
87+
value: `X-{\$TASK.${key}.value}-Y`,
88+
},
89+
});
90+
91+
try {
92+
const header = await getHeader(browser.browser);
93+
assert.strictEqual(header.X_TEST_HEADER, `X-${value}-Y`);
94+
} finally {
95+
await remove();
96+
}
97+
},
98+
));
6799
});

0 commit comments

Comments
 (0)