-
Notifications
You must be signed in to change notification settings - Fork 159
/
Copy pathinject_var.js
100 lines (89 loc) · 4.22 KB
/
inject_var.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
moduleObject.injectVars = (vars) => {
// 遍历 vars 对象,将其中的键值对转化为局部变量
for (let key in vars) {
let value = vars[key];
// 根据类型判断并转化值
if (value === undefined) {
value = 'undefined'; // undefined转为 'undefined'
} else if (value === null) {
value = 'null'; // null 转为 'null'
} else if (value === '') {
value = "''"; // 空字符串转为 "''"
} else if (typeof value === 'boolean') {
value = value ? 'true' : 'false'; // 布尔值转为 'true' 或 'false'
} else if (typeof value === 'object') {
if (Array.isArray(value)) {
value = JSON.stringify(value); // 数组转为 JSON 字符串
} else if (value instanceof Date) {
value = `new Date("${value.toISOString()}")`; // Date 对象转为日期字符串
} else if (value instanceof RegExp) {
value = value.toString(); // 正则表达式转为字符串表示
} else {
value = JSON.stringify(value); // 普通对象转为 JSON 字符串
}
}
// 构造赋值代码,并通过 eval 动态执行
let _code = `moduleObject.${key} = ${value}`;
console.log(_code); // 打印每个注入的变量代码
eval(_code); // 使用 eval 在当前作用域中定义变量
}
}
moduleObject.injectMethodVars = async function (method, args, vars) {
async function _inner() {
let input;
let MY_URL;
// 遍历 vars 对象,将其中的键值对转化为局部变量
for (let key in vars) {
let value = vars[key];
// 根据类型判断并转化值
if (value === undefined) {
value = 'undefined'; // undefined转为 'undefined'
} else if (value === null) {
value = 'null'; // null 转为 'null'
} else if (value === '') {
value = "''"; // 空字符串转为 "''"
} else if (typeof value === 'boolean') {
value = value ? 'true' : 'false'; // 布尔值转为 'true' 或 'false'
} else if (typeof value === 'object') {
if (Array.isArray(value)) {
value = JSON.stringify(value); // 数组转为 JSON 字符串
} else if (value instanceof Date) {
value = `new Date("${value.toISOString()}")`; // Date 对象转为日期字符串
} else if (value instanceof RegExp) {
value = value.toString(); // 正则表达式转为字符串表示
} else {
value = JSON.stringify(value); // 普通对象转为 JSON 字符串
}
}
// 构造赋值代码,并通过 eval 动态执行
let _code = `${key} = ${value}`;
console.log(_code); // 打印每个注入的变量代码
eval(_code); // 使用 eval 在当前作用域中定义变量
}
// 打印 inject 的变量值,确保它们在 eval 中被正确注入
console.log('=====inject vars=====');
console.log(input); // 现在 input 应该是定义好的
console.log(MY_URL); // MY_URL 应该被注入并可用
// 执行传入的 method
return await method(...args);
}
return await _inner();
};
const injectVars = {input: '你好', MY_URL: 'https://example.com'};
const functions = ['class_parse', '预处理', '推荐', '一级', '二级', '搜索', 'lazy'];
for (let func of functions) {
if (typeof moduleObject[func] === 'function') {
// 如果是箭头函数
if (moduleObject[func].toString().includes('=>')) {
const originalMethod = moduleObject[func];
// 包装箭头函数,将其改为闭包函数
moduleObject[func] = function (...args) {
const self = injectVars; // 动态注入 self
return (async (...innerArgs) => {
// 调用原始的箭头函数
return await originalMethod.apply(self, innerArgs);
})(...args);
};
}
}
}