-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathlogger.mjs
72 lines (64 loc) · 1.56 KB
/
logger.mjs
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
import parser from "@babel/parser";
import babel from "@babel/core";
import traverse from "@babel/traverse";
import t from "@babel/types";
globalThis.leetcode_cheat = {
version: "0.0.1",
author: "lucifer",
email: "azl397985856@gmail.com",
公众号: "力扣加加",
unstable: {
draw(...args) {
const handler = {
get(target, prop, receiver) {
return target[prop];
},
set(target, prop, val, receiver) {
target[prop] = val;
if (target instanceof Array && prop !== "length") {
console.log(target);
}
return true; // accept the change
},
};
console.log(args);
return new Proxy(args, handler);
},
},
};
const code = `const nums = [1, 2, 3, 4];
function sum(nums, cur) {
if (cur === -1) return 0;
return nums[cur] + sum(nums, cur - 1);
}
const ans = sum(nums, nums.length - 1);
setTimeout(() => nums.push(5), 1000)
console.log(ans)`;
const ast = parser.parse(code, {
sourceType: "module",
});
traverse.default(ast, {
enter(path) {},
ArrayExpression: function (path) {
path.replaceWith(
t.callExpression(
t.memberExpression(
t.identifier("globalThis.leetcode_cheat.unstable"),
t.identifier("draw")
),
path.node.elements
)
);
},
});
babel.transformFromAst(
ast,
code,
{ parserOpts: { allowReturnOutsideFunction: true } },
function (err, result) {
if (err) return console.error("语法不正确", err);
const { code } = result;
console.log(code);
eval(code);
}
);