@cuxt/sandboxjs 0.1.0 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +198 -185
- package/{build → dist/cjs}/Sandbox.d.ts +15 -6
- package/dist/cjs/Sandbox.js +126 -0
- package/dist/{SandboxExec.d.ts → cjs/SandboxExec.d.ts} +8 -17
- package/dist/cjs/SandboxExec.js +227 -0
- package/{build/eval.d.ts → dist/cjs/eval/index.d.ts} +10 -2
- package/dist/cjs/eval/index.js +233 -0
- package/dist/cjs/executor/executorUtils.d.ts +161 -0
- package/dist/cjs/executor/executorUtils.js +930 -0
- package/dist/cjs/executor/index.d.ts +1 -0
- package/dist/cjs/executor/index.js +2 -0
- package/dist/cjs/executor/ops/assignment.d.ts +1 -0
- package/dist/cjs/executor/ops/assignment.js +88 -0
- package/dist/cjs/executor/ops/call.d.ts +1 -0
- package/dist/cjs/executor/ops/call.js +160 -0
- package/dist/cjs/executor/ops/comparison.d.ts +1 -0
- package/dist/cjs/executor/ops/comparison.js +36 -0
- package/dist/cjs/executor/ops/control.d.ts +1 -0
- package/dist/cjs/executor/ops/control.js +203 -0
- package/dist/cjs/executor/ops/functions.d.ts +1 -0
- package/dist/cjs/executor/ops/functions.js +55 -0
- package/dist/cjs/executor/ops/index.d.ts +0 -0
- package/dist/cjs/executor/ops/index.js +11 -0
- package/dist/cjs/executor/ops/literals.d.ts +1 -0
- package/dist/cjs/executor/ops/literals.js +45 -0
- package/dist/cjs/executor/ops/misc.d.ts +1 -0
- package/dist/cjs/executor/ops/misc.js +25 -0
- package/dist/cjs/executor/ops/object.d.ts +1 -0
- package/dist/cjs/executor/ops/object.js +51 -0
- package/dist/cjs/executor/ops/prop.d.ts +1 -0
- package/dist/cjs/executor/ops/prop.js +70 -0
- package/dist/cjs/executor/ops/unary.d.ts +1 -0
- package/dist/cjs/executor/ops/unary.js +48 -0
- package/dist/cjs/executor/ops/variables.d.ts +1 -0
- package/dist/cjs/executor/ops/variables.js +16 -0
- package/dist/cjs/executor/opsRegistry.d.ts +33 -0
- package/dist/cjs/executor/opsRegistry.js +8 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/parser/index.d.ts +3 -0
- package/dist/cjs/parser/index.js +1 -0
- package/dist/{parser.d.ts → cjs/parser/lisp.d.ts} +29 -42
- package/dist/cjs/parser/lispTypes/conditionals.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/conditionals.js +135 -0
- package/dist/cjs/parser/lispTypes/control.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/control.js +204 -0
- package/dist/cjs/parser/lispTypes/declarations.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/declarations.js +99 -0
- package/dist/cjs/parser/lispTypes/index.d.ts +3 -0
- package/dist/cjs/parser/lispTypes/index.js +17 -0
- package/dist/cjs/parser/lispTypes/operators.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/operators.js +252 -0
- package/dist/cjs/parser/lispTypes/shared.d.ts +38 -0
- package/dist/cjs/parser/lispTypes/structures.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/structures.js +188 -0
- package/dist/cjs/parser/lispTypes/values.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/values.js +89 -0
- package/dist/cjs/parser/parserUtils.d.ts +34 -0
- package/dist/cjs/parser/parserUtils.js +968 -0
- package/dist/cjs/utils/CodeString.d.ts +16 -0
- package/dist/cjs/utils/CodeString.js +64 -0
- package/dist/cjs/utils/ExecContext.d.ts +34 -0
- package/dist/cjs/utils/ExecContext.js +171 -0
- package/dist/cjs/utils/Prop.d.ts +16 -0
- package/dist/cjs/utils/Prop.js +81 -0
- package/dist/cjs/utils/Scope.d.ts +47 -0
- package/dist/cjs/utils/Scope.js +127 -0
- package/dist/cjs/utils/errors.d.ts +10 -0
- package/dist/cjs/utils/errors.js +12 -0
- package/dist/cjs/utils/functionReplacements.d.ts +11 -0
- package/dist/cjs/utils/functionReplacements.js +362 -0
- package/dist/cjs/utils/index.d.ts +7 -0
- package/dist/cjs/utils/index.js +7 -0
- package/dist/cjs/utils/types.d.ts +221 -0
- package/dist/cjs/utils/types.js +164 -0
- package/dist/cjs/utils/unraw.js +145 -0
- package/dist/{node → esm}/Sandbox.d.ts +15 -6
- package/dist/esm/Sandbox.js +115 -0
- package/dist/esm/Sandbox.js.map +1 -0
- package/{build → dist/esm}/SandboxExec.d.ts +8 -17
- package/dist/esm/SandboxExec.js +224 -0
- package/dist/esm/SandboxExec.js.map +1 -0
- package/dist/{eval.d.ts → esm/eval/index.d.ts} +10 -2
- package/dist/esm/eval/index.js +235 -0
- package/dist/esm/eval/index.js.map +1 -0
- package/dist/esm/executor/executorUtils.d.ts +161 -0
- package/dist/esm/executor/executorUtils.js +898 -0
- package/dist/esm/executor/executorUtils.js.map +1 -0
- package/dist/esm/executor/index.d.ts +1 -0
- package/dist/esm/executor/index.js +2 -0
- package/dist/esm/executor/ops/assignment.d.ts +1 -0
- package/dist/esm/executor/ops/assignment.js +90 -0
- package/dist/esm/executor/ops/assignment.js.map +1 -0
- package/dist/esm/executor/ops/call.d.ts +1 -0
- package/dist/esm/executor/ops/call.js +162 -0
- package/dist/esm/executor/ops/call.js.map +1 -0
- package/dist/esm/executor/ops/comparison.d.ts +1 -0
- package/dist/esm/executor/ops/comparison.js +38 -0
- package/dist/esm/executor/ops/comparison.js.map +1 -0
- package/dist/esm/executor/ops/control.d.ts +1 -0
- package/dist/esm/executor/ops/control.js +205 -0
- package/dist/esm/executor/ops/control.js.map +1 -0
- package/dist/esm/executor/ops/functions.d.ts +1 -0
- package/dist/esm/executor/ops/functions.js +57 -0
- package/dist/esm/executor/ops/functions.js.map +1 -0
- package/dist/esm/executor/ops/index.d.ts +0 -0
- package/dist/esm/executor/ops/index.js +11 -0
- package/dist/esm/executor/ops/literals.d.ts +1 -0
- package/dist/esm/executor/ops/literals.js +47 -0
- package/dist/esm/executor/ops/literals.js.map +1 -0
- package/dist/esm/executor/ops/misc.d.ts +1 -0
- package/dist/esm/executor/ops/misc.js +27 -0
- package/dist/esm/executor/ops/misc.js.map +1 -0
- package/dist/esm/executor/ops/object.d.ts +1 -0
- package/dist/esm/executor/ops/object.js +53 -0
- package/dist/esm/executor/ops/object.js.map +1 -0
- package/dist/esm/executor/ops/prop.d.ts +1 -0
- package/dist/esm/executor/ops/prop.js +72 -0
- package/dist/esm/executor/ops/prop.js.map +1 -0
- package/dist/esm/executor/ops/unary.d.ts +1 -0
- package/dist/esm/executor/ops/unary.js +50 -0
- package/dist/esm/executor/ops/unary.js.map +1 -0
- package/dist/esm/executor/ops/variables.d.ts +1 -0
- package/dist/esm/executor/ops/variables.js +18 -0
- package/dist/esm/executor/ops/variables.js.map +1 -0
- package/dist/esm/executor/opsRegistry.d.ts +33 -0
- package/dist/esm/executor/opsRegistry.js +9 -0
- package/dist/esm/executor/opsRegistry.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/parser/index.d.ts +3 -0
- package/dist/esm/parser/index.js +1 -0
- package/{build/parser.d.ts → dist/esm/parser/lisp.d.ts} +29 -42
- package/dist/esm/parser/lispTypes/conditionals.d.ts +2 -0
- package/dist/esm/parser/lispTypes/conditionals.js +137 -0
- package/dist/esm/parser/lispTypes/conditionals.js.map +1 -0
- package/dist/esm/parser/lispTypes/control.d.ts +2 -0
- package/dist/esm/parser/lispTypes/control.js +206 -0
- package/dist/esm/parser/lispTypes/control.js.map +1 -0
- package/dist/esm/parser/lispTypes/declarations.d.ts +2 -0
- package/dist/esm/parser/lispTypes/declarations.js +101 -0
- package/dist/esm/parser/lispTypes/declarations.js.map +1 -0
- package/dist/esm/parser/lispTypes/index.d.ts +3 -0
- package/dist/esm/parser/lispTypes/index.js +19 -0
- package/dist/esm/parser/lispTypes/index.js.map +1 -0
- package/dist/esm/parser/lispTypes/operators.d.ts +2 -0
- package/dist/esm/parser/lispTypes/operators.js +254 -0
- package/dist/esm/parser/lispTypes/operators.js.map +1 -0
- package/dist/esm/parser/lispTypes/shared.d.ts +38 -0
- package/dist/esm/parser/lispTypes/structures.d.ts +2 -0
- package/dist/esm/parser/lispTypes/structures.js +190 -0
- package/dist/esm/parser/lispTypes/structures.js.map +1 -0
- package/dist/esm/parser/lispTypes/values.d.ts +2 -0
- package/dist/esm/parser/lispTypes/values.js +91 -0
- package/dist/esm/parser/lispTypes/values.js.map +1 -0
- package/dist/esm/parser/parserUtils.d.ts +34 -0
- package/dist/esm/parser/parserUtils.js +959 -0
- package/dist/esm/parser/parserUtils.js.map +1 -0
- package/dist/esm/utils/CodeString.d.ts +16 -0
- package/dist/esm/utils/CodeString.js +66 -0
- package/dist/esm/utils/CodeString.js.map +1 -0
- package/dist/esm/utils/ExecContext.d.ts +34 -0
- package/dist/esm/utils/ExecContext.js +168 -0
- package/dist/esm/utils/ExecContext.js.map +1 -0
- package/dist/esm/utils/Prop.d.ts +16 -0
- package/dist/esm/utils/Prop.js +80 -0
- package/dist/esm/utils/Prop.js.map +1 -0
- package/dist/esm/utils/Scope.d.ts +47 -0
- package/dist/esm/utils/Scope.js +122 -0
- package/dist/esm/utils/Scope.js.map +1 -0
- package/dist/esm/utils/errors.d.ts +10 -0
- package/dist/esm/utils/errors.js +10 -0
- package/dist/esm/utils/errors.js.map +1 -0
- package/dist/esm/utils/functionReplacements.d.ts +11 -0
- package/dist/esm/utils/functionReplacements.js +361 -0
- package/dist/esm/utils/functionReplacements.js.map +1 -0
- package/dist/esm/utils/index.d.ts +7 -0
- package/dist/esm/utils/index.js +7 -0
- package/dist/esm/utils/types.d.ts +221 -0
- package/dist/esm/utils/types.js +160 -0
- package/dist/esm/utils/types.js.map +1 -0
- package/dist/esm/utils/unraw.js +147 -0
- package/dist/esm/utils/unraw.js.map +1 -0
- package/dist/umd/Sandbox.min.js +2 -0
- package/dist/umd/Sandbox.min.js.map +1 -0
- package/dist/umd/SandboxExec.min.js +2 -0
- package/dist/umd/SandboxExec.min.js.map +1 -0
- package/package.json +70 -68
- package/build/Sandbox.js +0 -62
- package/build/SandboxExec.js +0 -214
- package/build/eval.js +0 -205
- package/build/executor.d.ts +0 -124
- package/build/executor.js +0 -1546
- package/build/parser.js +0 -1527
- package/build/unraw.js +0 -168
- package/build/utils.d.ts +0 -264
- package/build/utils.js +0 -362
- package/dist/Sandbox.d.ts +0 -25
- package/dist/Sandbox.js +0 -270
- package/dist/Sandbox.js.map +0 -1
- package/dist/Sandbox.min.js +0 -2
- package/dist/Sandbox.min.js.map +0 -1
- package/dist/SandboxExec.js +0 -218
- package/dist/SandboxExec.js.map +0 -1
- package/dist/SandboxExec.min.js +0 -2
- package/dist/SandboxExec.min.js.map +0 -1
- package/dist/executor.d.ts +0 -124
- package/dist/executor.js +0 -1550
- package/dist/executor.js.map +0 -1
- package/dist/node/Sandbox.js +0 -277
- package/dist/node/SandboxExec.d.ts +0 -66
- package/dist/node/SandboxExec.js +0 -225
- package/dist/node/eval.d.ts +0 -27
- package/dist/node/executor.d.ts +0 -124
- package/dist/node/executor.js +0 -1567
- package/dist/node/parser.d.ts +0 -154
- package/dist/node/parser.js +0 -1704
- package/dist/node/utils.d.ts +0 -264
- package/dist/node/utils.js +0 -385
- package/dist/parser.js +0 -1690
- package/dist/parser.js.map +0 -1
- package/dist/unraw.d.ts +0 -11
- package/dist/utils.d.ts +0 -264
- package/dist/utils.js +0 -365
- package/dist/utils.js.map +0 -1
- /package/{build → dist/cjs/utils}/unraw.d.ts +0 -0
- /package/dist/{node → esm/utils}/unraw.d.ts +0 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { SandboxError } from "../../utils/errors.js";
|
|
2
|
+
import { LispType } from "../../utils/types.js";
|
|
3
|
+
import { Scope, sanitizeProp } from "../../utils/Scope.js";
|
|
4
|
+
import "../../utils/index.js";
|
|
5
|
+
import { addOps } from "../opsRegistry.js";
|
|
6
|
+
import { ExecReturn, If, addControlFlowTarget, addControlFlowTargets, asyncDone, createLabeledStatementTarget, createLoopTarget, createSwitchTarget, execAsync, execSync, executeTree, executeTreeAsync, executeTreeWithDone, matchesControlFlowTarget, normalizeStatementLabel, normalizeStatementLabels, syncDone } from "../executorUtils.js";
|
|
7
|
+
//#region src/executor/ops/control.ts
|
|
8
|
+
addOps(LispType.Loop, ({ exec, done, ticks, a, b, context, scope, statementLabels, internal, generatorYield }) => {
|
|
9
|
+
const [checkFirst, startInternal, getIterator, startStep, step, condition, beforeStep, isForAwait, label] = a;
|
|
10
|
+
const loopStatementTargets = [...normalizeStatementLabels(label).map((loopLabel) => createLoopTarget(loopLabel, false)), createLoopTarget()];
|
|
11
|
+
const loopTargets = addControlFlowTargets(statementLabels, loopStatementTargets);
|
|
12
|
+
if (isForAwait === LispType.True && exec !== execAsync) {
|
|
13
|
+
done(/* @__PURE__ */ new SyntaxError("for-await-of loops are only allowed inside async functions"));
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
let loop = true;
|
|
17
|
+
const loopScope = new Scope(scope, {});
|
|
18
|
+
const internalVars = { $$obj: void 0 };
|
|
19
|
+
const interalScope = new Scope(loopScope, internalVars);
|
|
20
|
+
if (exec === execAsync) (async () => {
|
|
21
|
+
let ad;
|
|
22
|
+
ad = asyncDone((d) => exec(ticks, startStep, loopScope, context, d, void 0, internal, generatorYield));
|
|
23
|
+
internalVars["$$obj"] = (ad = asyncDone((d) => exec(ticks, getIterator, loopScope, context, d, void 0, internal, generatorYield))).isInstant === true ? ad.instant : (await ad.p).result;
|
|
24
|
+
if (isForAwait === LispType.True) {
|
|
25
|
+
const obj = internalVars["$$obj"];
|
|
26
|
+
internalVars["$$obj"] = obj[Symbol.asyncIterator] ? obj[Symbol.asyncIterator]() : obj[Symbol.iterator] ? obj[Symbol.iterator]() : obj;
|
|
27
|
+
}
|
|
28
|
+
ad = asyncDone((d) => exec(ticks, startInternal, interalScope, context, d, void 0, internal, generatorYield));
|
|
29
|
+
if (isForAwait === LispType.True) internalVars["$$next"] = await internalVars["$$next"];
|
|
30
|
+
if (checkFirst) loop = (ad = asyncDone((d) => exec(ticks, condition, interalScope, context, d, void 0, internal, generatorYield))).isInstant === true ? ad.instant : (await ad.p).result;
|
|
31
|
+
while (loop) {
|
|
32
|
+
const iterScope = new Scope(interalScope, {});
|
|
33
|
+
ad = asyncDone((d) => exec(ticks, beforeStep, iterScope, context, d, void 0, internal, generatorYield));
|
|
34
|
+
ad.isInstant === true ? ad.instant : (await ad.p).result;
|
|
35
|
+
const res = await executeTreeAsync(ticks, context, b, [iterScope], loopTargets, internal, generatorYield);
|
|
36
|
+
if (res instanceof ExecReturn && res.returned) {
|
|
37
|
+
done(void 0, res);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (res instanceof ExecReturn && res.controlFlow) {
|
|
41
|
+
if (!loopStatementTargets.some((target) => matchesControlFlowTarget(res.controlFlow, target))) {
|
|
42
|
+
done(void 0, res);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (res.breakLoop) break;
|
|
46
|
+
}
|
|
47
|
+
ad = asyncDone((d) => exec(ticks, step, interalScope, context, d, void 0, internal, generatorYield));
|
|
48
|
+
if (isForAwait === LispType.True) internalVars["$$next"] = await internalVars["$$next"];
|
|
49
|
+
loop = (ad = asyncDone((d) => exec(ticks, condition, interalScope, context, d, void 0, internal, generatorYield))).isInstant === true ? ad.instant : (await ad.p).result;
|
|
50
|
+
}
|
|
51
|
+
done();
|
|
52
|
+
})().catch(done);
|
|
53
|
+
else {
|
|
54
|
+
syncDone((d) => exec(ticks, startStep, loopScope, context, d, void 0, internal, generatorYield));
|
|
55
|
+
internalVars["$$obj"] = syncDone((d) => exec(ticks, getIterator, loopScope, context, d, void 0, internal, generatorYield)).result;
|
|
56
|
+
syncDone((d) => exec(ticks, startInternal, interalScope, context, d, void 0, internal, generatorYield));
|
|
57
|
+
if (checkFirst) loop = syncDone((d) => exec(ticks, condition, interalScope, context, d, void 0, internal, generatorYield)).result;
|
|
58
|
+
while (loop) {
|
|
59
|
+
const iterScope = new Scope(interalScope, {});
|
|
60
|
+
syncDone((d) => exec(ticks, beforeStep, iterScope, context, d, void 0, internal, generatorYield));
|
|
61
|
+
const res = executeTree(ticks, context, b, [iterScope], loopTargets, internal, generatorYield);
|
|
62
|
+
if (res instanceof ExecReturn && res.returned) {
|
|
63
|
+
done(void 0, res);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (res instanceof ExecReturn && res.controlFlow) {
|
|
67
|
+
if (!loopStatementTargets.some((target) => matchesControlFlowTarget(res.controlFlow, target))) {
|
|
68
|
+
done(void 0, res);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (res.breakLoop) break;
|
|
72
|
+
}
|
|
73
|
+
syncDone((d) => exec(ticks, step, interalScope, context, d, void 0, internal, generatorYield));
|
|
74
|
+
loop = syncDone((d) => exec(ticks, condition, interalScope, context, d, void 0, internal, generatorYield)).result;
|
|
75
|
+
}
|
|
76
|
+
done();
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
addOps(LispType.If, ({ exec, done, ticks, a, b, context, scope, statementLabels, internal, generatorYield }) => {
|
|
80
|
+
exec(ticks, sanitizeProp(a, context) ? b.t : b.f, scope, context, done, statementLabels, internal, generatorYield);
|
|
81
|
+
});
|
|
82
|
+
addOps(LispType.InlineIf, ({ exec, done, ticks, a, b, context, scope, internal, generatorYield }) => {
|
|
83
|
+
exec(ticks, sanitizeProp(a, context) ? b.t : b.f, scope, context, done, void 0, internal, generatorYield);
|
|
84
|
+
});
|
|
85
|
+
addOps(LispType.InlineIfCase, ({ done, a, b }) => done(void 0, new If(a, b)));
|
|
86
|
+
addOps(LispType.IfCase, ({ done, a, b }) => done(void 0, new If(a, b)));
|
|
87
|
+
addOps(LispType.Labeled, ({ exec, done, ticks, a, b, context, scope, statementLabels, internal, generatorYield }) => {
|
|
88
|
+
const target = createLabeledStatementTarget(normalizeStatementLabel(a));
|
|
89
|
+
exec(ticks, b, scope, context, (...args) => {
|
|
90
|
+
if (args.length === 1) {
|
|
91
|
+
done(args[0]);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const res = args[1];
|
|
95
|
+
if (res instanceof ExecReturn && res.controlFlow && target) {
|
|
96
|
+
if (matchesControlFlowTarget(res.controlFlow, target)) {
|
|
97
|
+
done();
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
done(void 0, res);
|
|
102
|
+
}, addControlFlowTarget(statementLabels, target), internal, generatorYield);
|
|
103
|
+
});
|
|
104
|
+
addOps(LispType.Switch, ({ exec, done, ticks, a, b, context, scope, statementLabels, internal, generatorYield }) => {
|
|
105
|
+
const switchTarget = createSwitchTarget();
|
|
106
|
+
const switchTargets = addControlFlowTarget(statementLabels, switchTarget);
|
|
107
|
+
exec(ticks, a, scope, context, (...args) => {
|
|
108
|
+
if (args.length === 1) {
|
|
109
|
+
done(args[0]);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
let toTest = args[1];
|
|
113
|
+
toTest = sanitizeProp(toTest, context);
|
|
114
|
+
if (exec === execSync) {
|
|
115
|
+
let res;
|
|
116
|
+
let isTrue = false;
|
|
117
|
+
for (const caseItem of b) if (isTrue || (isTrue = !caseItem[1] || toTest === sanitizeProp(syncDone((d) => exec(ticks, caseItem[1], scope, context, d, void 0, internal, generatorYield)).result, context))) {
|
|
118
|
+
if (!caseItem[2]) continue;
|
|
119
|
+
res = executeTree(ticks, context, caseItem[2], [scope], switchTargets, internal, generatorYield);
|
|
120
|
+
if (res.controlFlow) {
|
|
121
|
+
if (!matchesControlFlowTarget(res.controlFlow, switchTarget)) {
|
|
122
|
+
done(void 0, res);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (res.breakLoop) break;
|
|
126
|
+
}
|
|
127
|
+
if (res.returned) {
|
|
128
|
+
done(void 0, res);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (!caseItem[1]) break;
|
|
132
|
+
}
|
|
133
|
+
done();
|
|
134
|
+
} else (async () => {
|
|
135
|
+
let res;
|
|
136
|
+
let isTrue = false;
|
|
137
|
+
for (const caseItem of b) {
|
|
138
|
+
let ad;
|
|
139
|
+
if (isTrue || (isTrue = !caseItem[1] || toTest === sanitizeProp((ad = asyncDone((d) => exec(ticks, caseItem[1], scope, context, d, void 0, internal, generatorYield))).isInstant === true ? ad.instant : (await ad.p).result, context))) {
|
|
140
|
+
if (!caseItem[2]) continue;
|
|
141
|
+
res = await executeTreeAsync(ticks, context, caseItem[2], [scope], switchTargets, internal, generatorYield);
|
|
142
|
+
if (res.controlFlow) {
|
|
143
|
+
if (!matchesControlFlowTarget(res.controlFlow, switchTarget)) {
|
|
144
|
+
done(void 0, res);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (res.breakLoop) break;
|
|
148
|
+
}
|
|
149
|
+
if (res.returned) {
|
|
150
|
+
done(void 0, res);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (!caseItem[1]) break;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
done();
|
|
157
|
+
})().catch(done);
|
|
158
|
+
}, void 0, internal, generatorYield);
|
|
159
|
+
});
|
|
160
|
+
addOps(LispType.Try, ({ exec, done, ticks, a, b, context, scope, statementLabels, internal, generatorYield }) => {
|
|
161
|
+
const [exception, catchBody, finallyBody] = b;
|
|
162
|
+
executeTreeWithDone(exec, (...tryArgs) => {
|
|
163
|
+
const tryHadError = tryArgs.length === 1;
|
|
164
|
+
const tryError = tryHadError ? tryArgs[0] : void 0;
|
|
165
|
+
const tryResult = !tryHadError && tryArgs.length > 1 ? tryArgs[1] : void 0;
|
|
166
|
+
const executeFinallyAndComplete = (hadError, errorOrResult) => {
|
|
167
|
+
if (finallyBody && finallyBody.length > 0) executeTreeWithDone(exec, (...finallyArgs) => {
|
|
168
|
+
const finallyHadError = finallyArgs.length === 1;
|
|
169
|
+
const finallyResult = !finallyHadError && finallyArgs.length > 1 ? finallyArgs[1] : void 0;
|
|
170
|
+
if (finallyHadError) {
|
|
171
|
+
done(finallyArgs[0]);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (finallyResult instanceof ExecReturn && (finallyResult.returned || finallyResult.breakLoop || finallyResult.continueLoop)) {
|
|
175
|
+
done(void 0, finallyResult);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
if (hadError) done(errorOrResult);
|
|
179
|
+
else if (errorOrResult instanceof ExecReturn) if (errorOrResult.returned || errorOrResult.breakLoop || errorOrResult.continueLoop) done(void 0, errorOrResult);
|
|
180
|
+
else done();
|
|
181
|
+
else done();
|
|
182
|
+
}, ticks, context, finallyBody, [new Scope(scope, {})], statementLabels, internal, generatorYield);
|
|
183
|
+
else if (hadError) done(errorOrResult);
|
|
184
|
+
else if (errorOrResult instanceof ExecReturn) if (errorOrResult.returned || errorOrResult.breakLoop || errorOrResult.continueLoop) done(void 0, errorOrResult);
|
|
185
|
+
else done();
|
|
186
|
+
else done();
|
|
187
|
+
};
|
|
188
|
+
if (tryHadError && tryError instanceof SandboxError) {
|
|
189
|
+
done(tryError);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (tryHadError && catchBody && catchBody.length > 0) {
|
|
193
|
+
const sc = {};
|
|
194
|
+
if (exception) sc[exception] = tryError;
|
|
195
|
+
executeTreeWithDone(exec, (...catchArgs) => {
|
|
196
|
+
const catchHadError = catchArgs.length === 1;
|
|
197
|
+
executeFinallyAndComplete(catchHadError, catchHadError ? catchArgs[0] : catchArgs.length > 1 ? catchArgs[1] : void 0);
|
|
198
|
+
}, ticks, context, catchBody, [new Scope(scope, sc)], statementLabels, internal, generatorYield);
|
|
199
|
+
} else executeFinallyAndComplete(tryHadError, tryHadError ? tryError : tryResult);
|
|
200
|
+
}, ticks, context, a, [new Scope(scope)], statementLabels, internal, generatorYield);
|
|
201
|
+
});
|
|
202
|
+
addOps(LispType.Expression, ({ done, a }) => done(void 0, a.pop()));
|
|
203
|
+
//#endregion
|
|
204
|
+
|
|
205
|
+
//# sourceMappingURL=control.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control.js","names":[],"sources":["../../../../src/executor/ops/control.ts"],"sourcesContent":["import {\n addOps,\n execAsync,\n execSync,\n asyncDone,\n executeTreeWithDone,\n normalizeStatementLabels,\n addControlFlowTargets,\n createLoopTarget,\n createSwitchTarget,\n createLabeledStatementTarget,\n matchesControlFlowTarget,\n If,\n ExecReturn,\n executeTreeAsync,\n syncDone,\n executeTree,\n normalizeStatementLabel,\n addControlFlowTarget,\n} from '../executorUtils';\nimport type { AsyncDoneRet } from '../executorUtils';\nimport type { Lisp, LispItem, StatementLabel, SwitchCase } from '../../parser';\nimport { LispType, Scope, SandboxError, sanitizeProp } from '../../utils';\n\naddOps<Lisp[], Lisp[]>(\n LispType.Loop,\n ({ exec, done, ticks, a, b, context, scope, statementLabels, internal, generatorYield }) => {\n const [\n checkFirst,\n startInternal,\n getIterator,\n startStep,\n step,\n condition,\n beforeStep,\n isForAwait,\n label,\n ] = a;\n const loopStatementTargets = [\n ...normalizeStatementLabels(label).map((loopLabel) => createLoopTarget(loopLabel, false)),\n createLoopTarget(),\n ];\n const loopTargets = addControlFlowTargets(statementLabels, loopStatementTargets);\n if ((isForAwait as unknown as LispType) === LispType.True && exec !== execAsync) {\n done(new SyntaxError('for-await-of loops are only allowed inside async functions'));\n return;\n }\n let loop = true;\n const loopScope = new Scope(scope, {});\n const internalVars: Record<string, unknown> = {\n $$obj: undefined,\n };\n const interalScope = new Scope(loopScope, internalVars);\n if (exec === execAsync) {\n (async () => {\n let ad: AsyncDoneRet;\n ad = asyncDone((d) =>\n exec(ticks, startStep, loopScope, context, d, undefined, internal, generatorYield),\n );\n internalVars['$$obj'] =\n (ad = asyncDone((d) =>\n exec(ticks, getIterator, loopScope, context, d, undefined, internal, generatorYield),\n )).isInstant === true\n ? ad.instant\n : (await ad.p).result;\n // for-await-of: override $$obj with the correct async iterator\n if ((isForAwait as unknown as LispType) === LispType.True) {\n const obj = internalVars['$$obj'] as any;\n internalVars['$$obj'] = obj[Symbol.asyncIterator]\n ? obj[Symbol.asyncIterator]()\n : obj[Symbol.iterator]\n ? obj[Symbol.iterator]()\n : obj;\n }\n ad = asyncDone((d) =>\n exec(ticks, startInternal, interalScope, context, d, undefined, internal, generatorYield),\n );\n // for-await-of: await the $$next promise after startInternal sets it\n if ((isForAwait as unknown as LispType) === LispType.True) {\n internalVars['$$next'] = await internalVars['$$next'];\n }\n if (checkFirst)\n loop =\n (ad = asyncDone((d) =>\n exec(ticks, condition, interalScope, context, d, undefined, internal, generatorYield),\n )).isInstant === true\n ? ad.instant\n : (await ad.p).result;\n while (loop) {\n const innerLoopVars = {};\n const iterScope = new Scope(interalScope, innerLoopVars);\n ad = asyncDone((d) =>\n exec(ticks, beforeStep, iterScope, context, d, undefined, internal, generatorYield),\n );\n ad.isInstant === true ? ad.instant : (await ad.p).result;\n const res = await executeTreeAsync(\n ticks,\n context,\n b,\n [iterScope],\n loopTargets,\n internal,\n generatorYield,\n );\n if (res instanceof ExecReturn && res.returned) {\n done(undefined, res);\n return;\n }\n if (res instanceof ExecReturn && res.controlFlow) {\n if (\n !loopStatementTargets.some((target) =>\n matchesControlFlowTarget(res.controlFlow!, target),\n )\n ) {\n done(undefined, res);\n return;\n }\n if (res.breakLoop) {\n break;\n }\n }\n ad = asyncDone((d) =>\n exec(ticks, step, interalScope, context, d, undefined, internal, generatorYield),\n );\n // for-await-of: await the $$next promise after step updates it\n if ((isForAwait as unknown as LispType) === LispType.True) {\n internalVars['$$next'] = await internalVars['$$next'];\n }\n loop =\n (ad = asyncDone((d) =>\n exec(ticks, condition, interalScope, context, d, undefined, internal, generatorYield),\n )).isInstant === true\n ? ad.instant\n : (await ad.p).result;\n }\n done();\n })().catch(done);\n } else {\n syncDone((d) =>\n exec(ticks, startStep, loopScope, context, d, undefined, internal, generatorYield),\n );\n internalVars['$$obj'] = syncDone((d) =>\n exec(ticks, getIterator, loopScope, context, d, undefined, internal, generatorYield),\n ).result;\n syncDone((d) =>\n exec(ticks, startInternal, interalScope, context, d, undefined, internal, generatorYield),\n );\n if (checkFirst)\n loop = syncDone((d) =>\n exec(ticks, condition, interalScope, context, d, undefined, internal, generatorYield),\n ).result;\n while (loop) {\n const innerLoopVars = {};\n const iterScope = new Scope(interalScope, innerLoopVars);\n syncDone((d) =>\n exec(ticks, beforeStep, iterScope, context, d, undefined, internal, generatorYield),\n );\n const res = executeTree(\n ticks,\n context,\n b,\n [iterScope],\n loopTargets,\n internal,\n generatorYield,\n );\n if (res instanceof ExecReturn && res.returned) {\n done(undefined, res);\n return;\n }\n if (res instanceof ExecReturn && res.controlFlow) {\n if (\n !loopStatementTargets.some((target) =>\n matchesControlFlowTarget(res.controlFlow!, target),\n )\n ) {\n done(undefined, res);\n return;\n }\n if (res.breakLoop) {\n break;\n }\n }\n syncDone((d) =>\n exec(ticks, step, interalScope, context, d, undefined, internal, generatorYield),\n );\n loop = syncDone((d) =>\n exec(ticks, condition, interalScope, context, d, undefined, internal, generatorYield),\n ).result;\n }\n done();\n }\n },\n);\n\naddOps<LispItem, If>(\n LispType.If,\n ({ exec, done, ticks, a, b, context, scope, statementLabels, internal, generatorYield }) => {\n exec(\n ticks,\n sanitizeProp(a, context) ? b.t : b.f,\n scope,\n context,\n done,\n statementLabels,\n internal,\n generatorYield,\n );\n },\n);\n\naddOps<LispItem, If>(\n LispType.InlineIf,\n ({ exec, done, ticks, a, b, context, scope, internal, generatorYield }) => {\n exec(\n ticks,\n sanitizeProp(a, context) ? b.t : b.f,\n scope,\n context,\n done,\n undefined,\n internal,\n generatorYield,\n );\n },\n);\n\naddOps<Lisp, Lisp>(LispType.InlineIfCase, ({ done, a, b }) => done(undefined, new If(a, b)));\n\naddOps<Lisp, Lisp>(LispType.IfCase, ({ done, a, b }) => done(undefined, new If(a, b)));\n\naddOps<StatementLabel, Lisp>(\n LispType.Labeled,\n ({ exec, done, ticks, a, b, context, scope, statementLabels, internal, generatorYield }) => {\n const target = createLabeledStatementTarget(normalizeStatementLabel(a));\n exec(\n ticks,\n b,\n scope,\n context,\n (...args: unknown[]) => {\n if (args.length === 1) {\n done(args[0]);\n return;\n }\n const res = args[1];\n if (res instanceof ExecReturn && res.controlFlow && target) {\n if (matchesControlFlowTarget(res.controlFlow, target)) {\n done();\n return;\n }\n }\n done(undefined, res as any);\n },\n addControlFlowTarget(statementLabels, target),\n internal,\n generatorYield,\n );\n },\n);\n\naddOps<LispItem, SwitchCase[]>(\n LispType.Switch,\n ({ exec, done, ticks, a, b, context, scope, statementLabels, internal, generatorYield }) => {\n const switchTarget = createSwitchTarget();\n const switchTargets = addControlFlowTarget(statementLabels, switchTarget);\n exec(\n ticks,\n a,\n scope,\n context,\n (...args: unknown[]) => {\n if (args.length === 1) {\n done(args[0]);\n return;\n }\n let toTest = args[1];\n toTest = sanitizeProp(toTest, context);\n if (exec === execSync) {\n let res: ExecReturn<unknown>;\n let isTrue = false;\n for (const caseItem of b) {\n if (\n isTrue ||\n (isTrue =\n !caseItem[1] ||\n toTest ===\n sanitizeProp(\n syncDone((d) =>\n exec(\n ticks,\n caseItem[1],\n scope,\n context,\n d,\n undefined,\n internal,\n generatorYield,\n ),\n ).result,\n context,\n ))\n ) {\n if (!caseItem[2]) continue;\n res = executeTree(\n ticks,\n context,\n caseItem[2],\n [scope],\n switchTargets,\n internal,\n generatorYield,\n );\n if (res.controlFlow) {\n if (!matchesControlFlowTarget(res.controlFlow, switchTarget)) {\n done(undefined, res);\n return;\n }\n if (res.breakLoop) break;\n }\n if (res.returned) {\n done(undefined, res);\n return;\n }\n if (!caseItem[1]) {\n // default case\n break;\n }\n }\n }\n done();\n } else {\n (async () => {\n let res: ExecReturn<unknown>;\n let isTrue = false;\n for (const caseItem of b) {\n let ad: AsyncDoneRet;\n if (\n isTrue ||\n (isTrue =\n !caseItem[1] ||\n toTest ===\n sanitizeProp(\n (ad = asyncDone((d) =>\n exec(\n ticks,\n caseItem[1],\n scope,\n context,\n d,\n undefined,\n internal,\n generatorYield,\n ),\n )).isInstant === true\n ? ad.instant\n : (await ad.p).result,\n context,\n ))\n ) {\n if (!caseItem[2]) continue;\n res = await executeTreeAsync(\n ticks,\n context,\n caseItem[2],\n [scope],\n switchTargets,\n internal,\n generatorYield,\n );\n if (res.controlFlow) {\n if (!matchesControlFlowTarget(res.controlFlow, switchTarget)) {\n done(undefined, res);\n return;\n }\n if (res.breakLoop) break;\n }\n if (res.returned) {\n done(undefined, res);\n return;\n }\n if (!caseItem[1]) {\n // default case\n break;\n }\n }\n }\n done();\n })().catch(done);\n }\n },\n undefined,\n internal,\n generatorYield,\n );\n },\n);\n\naddOps<Lisp[], [string, Lisp[], Lisp[]]>(\n LispType.Try,\n ({ exec, done, ticks, a, b, context, scope, statementLabels, internal, generatorYield }) => {\n const [exception, catchBody, finallyBody] = b;\n\n // Execute try block\n executeTreeWithDone(\n exec,\n (...tryArgs: unknown[]) => {\n const tryHadError = tryArgs.length === 1;\n const tryError = tryHadError ? tryArgs[0] : undefined;\n const tryResult = !tryHadError && tryArgs.length > 1 ? tryArgs[1] : undefined;\n\n // Handler to execute finally and complete\n const executeFinallyAndComplete = (hadError: boolean, errorOrResult: unknown) => {\n if (finallyBody && finallyBody.length > 0) {\n // Execute finally block\n executeTreeWithDone(\n exec,\n (...finallyArgs: unknown[]) => {\n const finallyHadError = finallyArgs.length === 1;\n const finallyResult =\n !finallyHadError && finallyArgs.length > 1 ? finallyArgs[1] : undefined;\n\n // If finally throws an error, it overrides everything\n if (finallyHadError) {\n done(finallyArgs[0]);\n return;\n }\n\n // If finally has a control flow statement (return/break/continue), it overrides everything\n if (\n finallyResult instanceof ExecReturn &&\n (finallyResult.returned || finallyResult.breakLoop || finallyResult.continueLoop)\n ) {\n done(undefined, finallyResult);\n return;\n }\n\n // Otherwise, return the original try/catch result/error\n if (hadError) {\n done(errorOrResult);\n } else if (errorOrResult instanceof ExecReturn) {\n // If try/catch returned or has some other control flow, pass that through\n if (\n errorOrResult.returned ||\n errorOrResult.breakLoop ||\n errorOrResult.continueLoop\n ) {\n done(undefined, errorOrResult);\n } else {\n // Normal completion - don't return a value\n done();\n }\n } else {\n // Try/catch completed normally, just signal completion with no return value\n done();\n }\n },\n ticks,\n context,\n finallyBody,\n [new Scope(scope, {})],\n statementLabels,\n internal,\n generatorYield,\n );\n } else {\n // No finally block, just return result/error\n if (hadError) {\n done(errorOrResult);\n } else if (errorOrResult instanceof ExecReturn) {\n // If try/catch returned or has some other control flow, pass that through\n if (errorOrResult.returned || errorOrResult.breakLoop || errorOrResult.continueLoop) {\n done(undefined, errorOrResult);\n } else {\n // Normal completion - don't return a value\n done();\n }\n } else {\n done();\n }\n }\n };\n\n // SandboxErrors bypass both catch and finally — propagate immediately.\n if (tryHadError && tryError instanceof SandboxError) {\n done(tryError);\n return;\n }\n\n // If try had an error and there's a catch block, execute catch.\n if (tryHadError && catchBody && catchBody.length > 0) {\n const sc: Record<string, unknown> = {};\n if (exception) sc[exception] = tryError;\n\n executeTreeWithDone(\n exec,\n (...catchArgs: unknown[]) => {\n const catchHadError = catchArgs.length === 1;\n const catchErrorOrResult = catchHadError\n ? catchArgs[0]\n : catchArgs.length > 1\n ? catchArgs[1]\n : undefined;\n\n // Execute finally with catch result\n executeFinallyAndComplete(catchHadError, catchErrorOrResult);\n },\n ticks,\n context,\n catchBody,\n [new Scope(scope, sc)],\n statementLabels,\n internal,\n generatorYield,\n );\n } else {\n // No catch or no error, execute finally with try result\n executeFinallyAndComplete(tryHadError, tryHadError ? tryError : tryResult);\n }\n },\n ticks,\n context,\n a,\n [new Scope(scope)],\n statementLabels,\n internal,\n generatorYield,\n );\n },\n);\n\naddOps<unknown[]>(LispType.Expression, ({ done, a }) => done(undefined, a.pop()));\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { SandboxCapabilityError } from "../../utils/errors.js";
|
|
2
|
+
import { CodeString } from "../../utils/CodeString.js";
|
|
3
|
+
import { LispType, VarType } from "../../utils/types.js";
|
|
4
|
+
import { Scope } from "../../utils/Scope.js";
|
|
5
|
+
import "../../utils/index.js";
|
|
6
|
+
import { addOps } from "../opsRegistry.js";
|
|
7
|
+
import { createAsyncGeneratorFunction, createFunction, createFunctionAsync, createGeneratorFunction } from "../executorUtils.js";
|
|
8
|
+
//#region src/executor/ops/functions.ts
|
|
9
|
+
addOps(LispType.ArrowFunction, ({ done, ticks, a, b, obj, context, scope, internal }) => {
|
|
10
|
+
if (typeof obj[2] === "string" || obj[2] instanceof CodeString) if (context.allowJit && context.evalContext) obj[2] = b = context.evalContext.lispifyFunction(new CodeString(obj[2]), context.constants);
|
|
11
|
+
else throw new SandboxCapabilityError("Unevaluated code detected, JIT not allowed");
|
|
12
|
+
const argNames = a.slice(1);
|
|
13
|
+
if (a[0]) done(void 0, createFunctionAsync(argNames, b, ticks, context, scope, void 0, internal));
|
|
14
|
+
else done(void 0, createFunction(argNames, b, ticks, context, scope, void 0, internal));
|
|
15
|
+
});
|
|
16
|
+
addOps(LispType.Function, ({ done, ticks, a, b, obj, context, scope, internal }) => {
|
|
17
|
+
if (typeof obj[2] === "string" || obj[2] instanceof CodeString) if (context.allowJit && context.evalContext) obj[2] = b = context.evalContext.lispifyFunction(new CodeString(obj[2]), context.constants, false, {
|
|
18
|
+
generatorDepth: a[1] === LispType.True ? 1 : 0,
|
|
19
|
+
asyncDepth: a[0] === LispType.True ? 1 : 0,
|
|
20
|
+
lispDepth: 0
|
|
21
|
+
});
|
|
22
|
+
else throw new SandboxCapabilityError("Unevaluated code detected, JIT not allowed");
|
|
23
|
+
const isAsync = a[0];
|
|
24
|
+
const isGenerator = a[1];
|
|
25
|
+
const name = a[2];
|
|
26
|
+
const argNames = a.slice(3);
|
|
27
|
+
let func;
|
|
28
|
+
if (isAsync === LispType.True && isGenerator === LispType.True) func = createAsyncGeneratorFunction(argNames, b, ticks, context, scope, name, internal);
|
|
29
|
+
else if (isGenerator === LispType.True) func = createGeneratorFunction(argNames, b, ticks, context, scope, name, internal);
|
|
30
|
+
else if (isAsync === LispType.True) func = createFunctionAsync(argNames, b, ticks, context, scope, name, internal);
|
|
31
|
+
else func = createFunction(argNames, b, ticks, context, scope, name, internal);
|
|
32
|
+
if (name) scope.declare(name, VarType.var, func, false, internal);
|
|
33
|
+
done(void 0, func);
|
|
34
|
+
});
|
|
35
|
+
addOps(LispType.InlineFunction, ({ done, ticks, a, b, obj, context, scope, internal }) => {
|
|
36
|
+
if (typeof obj[2] === "string" || obj[2] instanceof CodeString) if (context.allowJit && context.evalContext) obj[2] = b = context.evalContext.lispifyFunction(new CodeString(obj[2]), context.constants, false, {
|
|
37
|
+
generatorDepth: a[1] === LispType.True ? 1 : 0,
|
|
38
|
+
asyncDepth: a[0] === LispType.True ? 1 : 0,
|
|
39
|
+
lispDepth: 0
|
|
40
|
+
});
|
|
41
|
+
else throw new SandboxCapabilityError("Unevaluated code detected, JIT not allowed");
|
|
42
|
+
const isAsync = a[0];
|
|
43
|
+
const isGenerator = a[1];
|
|
44
|
+
const name = a[2];
|
|
45
|
+
const argNames = a.slice(3);
|
|
46
|
+
if (name) scope = new Scope(scope, {});
|
|
47
|
+
let func;
|
|
48
|
+
if (isAsync === LispType.True && isGenerator === LispType.True) func = createAsyncGeneratorFunction(argNames, b, ticks, context, scope, name, internal);
|
|
49
|
+
else if (isGenerator === LispType.True) func = createGeneratorFunction(argNames, b, ticks, context, scope, name, internal);
|
|
50
|
+
else if (isAsync === LispType.True) func = createFunctionAsync(argNames, b, ticks, context, scope, name, internal);
|
|
51
|
+
else func = createFunction(argNames, b, ticks, context, scope, name, internal);
|
|
52
|
+
if (name) scope.declare(name, VarType.let, func, false, internal);
|
|
53
|
+
done(void 0, func);
|
|
54
|
+
});
|
|
55
|
+
//#endregion
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=functions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"functions.js","names":[],"sources":["../../../../src/executor/ops/functions.ts"],"sourcesContent":["import {\n addOps,\n createAsyncGeneratorFunction,\n createFunction,\n createFunctionAsync,\n createGeneratorFunction,\n} from '../executorUtils';\nimport type { Lisp } from '../../parser';\nimport { LispType, SandboxCapabilityError, CodeString, Scope, VarType } from '../../utils';\n\naddOps<string[], Lisp[], Lisp>(\n LispType.ArrowFunction,\n ({ done, ticks, a, b, obj, context, scope, internal }) => {\n if (typeof obj[2] === 'string' || obj[2] instanceof CodeString) {\n if (context.allowJit && context.evalContext) {\n obj[2] = b = context.evalContext.lispifyFunction(new CodeString(obj[2]), context.constants);\n } else {\n throw new SandboxCapabilityError('Unevaluated code detected, JIT not allowed');\n }\n }\n const argNames = a.slice(1);\n if (a[0]) {\n done(undefined, createFunctionAsync(argNames, b, ticks, context, scope, undefined, internal));\n } else {\n done(undefined, createFunction(argNames, b, ticks, context, scope, undefined, internal));\n }\n },\n);\n\naddOps<(string | LispType)[], Lisp[], Lisp>(\n LispType.Function,\n ({ done, ticks, a, b, obj, context, scope, internal }) => {\n if (typeof obj[2] === 'string' || obj[2] instanceof CodeString) {\n if (context.allowJit && context.evalContext) {\n obj[2] = b = context.evalContext.lispifyFunction(\n new CodeString(obj[2]),\n context.constants,\n false,\n {\n generatorDepth: a[1] === LispType.True ? 1 : 0,\n asyncDepth: a[0] === LispType.True ? 1 : 0,\n lispDepth: 0,\n },\n );\n } else {\n throw new SandboxCapabilityError('Unevaluated code detected, JIT not allowed');\n }\n }\n const isAsync = a[0];\n const isGenerator = a[1];\n const name = a[2] as string;\n const argNames = a.slice(3) as string[];\n let func;\n if (isAsync === LispType.True && isGenerator === LispType.True) {\n func = createAsyncGeneratorFunction(argNames, b, ticks, context, scope, name, internal);\n } else if (isGenerator === LispType.True) {\n func = createGeneratorFunction(argNames, b, ticks, context, scope, name, internal);\n } else if (isAsync === LispType.True) {\n func = createFunctionAsync(argNames, b, ticks, context, scope, name, internal);\n } else {\n func = createFunction(argNames, b, ticks, context, scope, name, internal);\n }\n if (name) {\n scope.declare(name, VarType.var, func, false, internal);\n }\n done(undefined, func);\n },\n);\n\naddOps<(string | LispType)[], Lisp[], Lisp>(\n LispType.InlineFunction,\n ({ done, ticks, a, b, obj, context, scope, internal }) => {\n if (typeof obj[2] === 'string' || obj[2] instanceof CodeString) {\n if (context.allowJit && context.evalContext) {\n obj[2] = b = context.evalContext.lispifyFunction(\n new CodeString(obj[2]),\n context.constants,\n false,\n {\n generatorDepth: a[1] === LispType.True ? 1 : 0,\n asyncDepth: a[0] === LispType.True ? 1 : 0,\n lispDepth: 0,\n },\n );\n } else {\n throw new SandboxCapabilityError('Unevaluated code detected, JIT not allowed');\n }\n }\n const isAsync = a[0];\n const isGenerator = a[1];\n const name = a[2] as string;\n const argNames = a.slice(3) as string[];\n if (name) {\n scope = new Scope(scope, {});\n }\n let func;\n if (isAsync === LispType.True && isGenerator === LispType.True) {\n func = createAsyncGeneratorFunction(argNames, b, ticks, context, scope, name, internal);\n } else if (isGenerator === LispType.True) {\n func = createGeneratorFunction(argNames, b, ticks, context, scope, name, internal);\n } else if (isAsync === LispType.True) {\n func = createFunctionAsync(argNames, b, ticks, context, scope, name, internal);\n } else {\n func = createFunction(argNames, b, ticks, context, scope, name, internal);\n }\n if (name) {\n scope.declare(name, VarType.let, func, false, internal);\n }\n done(undefined, func);\n },\n);\n"],"mappings":"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"}
|
|
File without changes
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import "./prop.js";
|
|
2
|
+
import "./call.js";
|
|
3
|
+
import "./object.js";
|
|
4
|
+
import "./literals.js";
|
|
5
|
+
import "./unary.js";
|
|
6
|
+
import "./assignment.js";
|
|
7
|
+
import "./comparison.js";
|
|
8
|
+
import "./variables.js";
|
|
9
|
+
import "./misc.js";
|
|
10
|
+
import "./functions.js";
|
|
11
|
+
import "./control.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { SandboxCapabilityError } from "../../utils/errors.js";
|
|
2
|
+
import { LispType } from "../../utils/types.js";
|
|
3
|
+
import { sanitizeProp } from "../../utils/Scope.js";
|
|
4
|
+
import "../../utils/index.js";
|
|
5
|
+
import { addOps } from "../opsRegistry.js";
|
|
6
|
+
import { checkHaltExpectedTicks, literalRegex } from "../executorUtils.js";
|
|
7
|
+
//#region src/executor/ops/literals.ts
|
|
8
|
+
addOps(LispType.Number, ({ done, b }) => done(void 0, Number(b.replace(/_/g, ""))));
|
|
9
|
+
addOps(LispType.BigInt, ({ done, b }) => done(void 0, BigInt(b.replace(/_/g, ""))));
|
|
10
|
+
addOps(LispType.RegexIndex, ({ done, b, context }) => {
|
|
11
|
+
const reg = context.constants.regexes[parseInt(b)];
|
|
12
|
+
if (!context.ctx.globalsWhitelist.has(RegExp)) throw new SandboxCapabilityError("Regex not permitted");
|
|
13
|
+
else done(void 0, new ((context.evals.get(RegExp)) ?? RegExp)(reg.regex, reg.flags));
|
|
14
|
+
});
|
|
15
|
+
addOps(LispType.LiteralIndex, (params) => {
|
|
16
|
+
const { exec, done, ticks, b, context, scope, internal, generatorYield } = params;
|
|
17
|
+
const [, name, js] = context.constants.literals[parseInt(b)];
|
|
18
|
+
const found = [];
|
|
19
|
+
let f;
|
|
20
|
+
const resnums = [];
|
|
21
|
+
while (f = literalRegex.exec(name)) if (!f[2]) {
|
|
22
|
+
found.push(js[parseInt(f[3], 10)]);
|
|
23
|
+
resnums.push(f[3]);
|
|
24
|
+
}
|
|
25
|
+
exec(ticks, found, scope, context, (...args) => {
|
|
26
|
+
const reses = {};
|
|
27
|
+
if (args.length === 1) {
|
|
28
|
+
done(args[0]);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const processed = args[1];
|
|
32
|
+
for (const i of Object.keys(processed)) {
|
|
33
|
+
const num = resnums[i];
|
|
34
|
+
reses[num] = processed[i];
|
|
35
|
+
}
|
|
36
|
+
const result = name.replace(/(\\\\)*(\\)?\${(\d+)}/g, (match, $$, $, num) => {
|
|
37
|
+
if ($) return match;
|
|
38
|
+
const res = reses[num];
|
|
39
|
+
return ($$ ? $$ : "") + `${sanitizeProp(res, context)}`;
|
|
40
|
+
});
|
|
41
|
+
if (checkHaltExpectedTicks(params, BigInt(result.length))) return;
|
|
42
|
+
done(void 0, result);
|
|
43
|
+
}, void 0, internal, generatorYield);
|
|
44
|
+
});
|
|
45
|
+
//#endregion
|
|
46
|
+
|
|
47
|
+
//# sourceMappingURL=literals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"literals.js","names":[],"sources":["../../../../src/executor/ops/literals.ts"],"sourcesContent":["import { addOps, literalRegex, checkHaltExpectedTicks } from '../executorUtils';\nimport type { Lisp, IRegEx } from '../../parser';\nimport { LispType, SandboxCapabilityError, sanitizeProp } from '../../utils';\n\naddOps<unknown, string>(LispType.Number, ({ done, b }) =>\n done(undefined, Number(b.replace(/_/g, ''))),\n);\n\naddOps<unknown, string>(LispType.BigInt, ({ done, b }) =>\n done(undefined, BigInt(b.replace(/_/g, ''))),\n);\n\naddOps<unknown, string>(LispType.RegexIndex, ({ done, b, context }) => {\n const reg: IRegEx = context.constants.regexes[parseInt(b)];\n if (!context.ctx.globalsWhitelist.has(RegExp)) {\n throw new SandboxCapabilityError('Regex not permitted');\n } else {\n const RegExpCtor =\n (context.evals.get(RegExp) as\n | (new (pattern: string, flags?: string) => unknown)\n | undefined) ?? RegExp;\n done(undefined, new RegExpCtor(reg.regex, reg.flags));\n }\n});\n\naddOps<unknown, string>(LispType.LiteralIndex, (params) => {\n const { exec, done, ticks, b, context, scope, internal, generatorYield } = params;\n const item = context.constants.literals[parseInt(b)];\n const [, name, js] = item;\n const found: Lisp[] = [];\n let f: RegExpExecArray | null;\n const resnums: string[] = [];\n while ((f = literalRegex.exec(name))) {\n if (!f[2]) {\n found.push(js[parseInt(f[3], 10)]);\n resnums.push(f[3]);\n }\n }\n\n exec<unknown[]>(\n ticks,\n found,\n scope,\n context,\n (...args: unknown[]) => {\n const reses: Record<string, unknown> = {};\n if (args.length === 1) {\n done(args[0]);\n return;\n }\n const processed = args[1];\n for (const i of Object.keys(processed!) as (keyof typeof processed)[]) {\n const num = resnums[i];\n reses[num] = processed![i];\n }\n const result = name.replace(/(\\\\\\\\)*(\\\\)?\\${(\\d+)}/g, (match, $$, $, num) => {\n if ($) return match;\n const res = reses[num];\n return ($$ ? $$ : '') + `${sanitizeProp(res, context)}`;\n });\n if (checkHaltExpectedTicks(params, BigInt(result.length))) return;\n done(undefined, result);\n },\n undefined,\n internal,\n generatorYield,\n );\n});\n"],"mappings":";;;;;;;AAIA,OAAwB,SAAS,SAAS,EAAE,MAAM,QAChD,KAAK,KAAA,GAAW,OAAO,EAAE,QAAQ,MAAM,GAAG,CAAC,CAAC,CAC7C;AAED,OAAwB,SAAS,SAAS,EAAE,MAAM,QAChD,KAAK,KAAA,GAAW,OAAO,EAAE,QAAQ,MAAM,GAAG,CAAC,CAAC,CAC7C;AAED,OAAwB,SAAS,aAAa,EAAE,MAAM,GAAG,cAAc;CACrE,MAAM,MAAc,QAAQ,UAAU,QAAQ,SAAS,EAAE;AACzD,KAAI,CAAC,QAAQ,IAAI,iBAAiB,IAAI,OAAO,CAC3C,OAAM,IAAI,uBAAuB,sBAAsB;KAMvD,MAAK,KAAA,GAAW,MAHb,QAAQ,MAAM,IAAI,OAAO,KAER,QACW,IAAI,OAAO,IAAI,MAAM,CAAC;EAEvD;AAEF,OAAwB,SAAS,eAAe,WAAW;CACzD,MAAM,EAAE,MAAM,MAAM,OAAO,GAAG,SAAS,OAAO,UAAU,mBAAmB;CAE3E,MAAM,GAAG,MAAM,MADF,QAAQ,UAAU,SAAS,SAAS,EAAE;CAEnD,MAAM,QAAgB,EAAE;CACxB,IAAI;CACJ,MAAM,UAAoB,EAAE;AAC5B,QAAQ,IAAI,aAAa,KAAK,KAAK,CACjC,KAAI,CAAC,EAAE,IAAI;AACT,QAAM,KAAK,GAAG,SAAS,EAAE,IAAI,GAAG,EAAE;AAClC,UAAQ,KAAK,EAAE,GAAG;;AAItB,MACE,OACA,OACA,OACA,UACC,GAAG,SAAoB;EACtB,MAAM,QAAiC,EAAE;AACzC,MAAI,KAAK,WAAW,GAAG;AACrB,QAAK,KAAK,GAAG;AACb;;EAEF,MAAM,YAAY,KAAK;AACvB,OAAK,MAAM,KAAK,OAAO,KAAK,UAAW,EAAgC;GACrE,MAAM,MAAM,QAAQ;AACpB,SAAM,OAAO,UAAW;;EAE1B,MAAM,SAAS,KAAK,QAAQ,2BAA2B,OAAO,IAAI,GAAG,QAAQ;AAC3E,OAAI,EAAG,QAAO;GACd,MAAM,MAAM,MAAM;AAClB,WAAQ,KAAK,KAAK,MAAM,GAAG,aAAa,KAAK,QAAQ;IACrD;AACF,MAAI,uBAAuB,QAAQ,OAAO,OAAO,OAAO,CAAC,CAAE;AAC3D,OAAK,KAAA,GAAW,OAAO;IAEzB,KAAA,GACA,UACA,eACD;EACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { SandboxCapabilityError } from "../../utils/errors.js";
|
|
2
|
+
import { LispType, VarType } from "../../utils/types.js";
|
|
3
|
+
import "../../utils/index.js";
|
|
4
|
+
import { addOps } from "../opsRegistry.js";
|
|
5
|
+
import { ExecReturn, findControlFlowTarget, normalizeStatementLabel } from "../executorUtils.js";
|
|
6
|
+
//#region src/executor/ops/misc.ts
|
|
7
|
+
addOps(LispType.Internal, ({ done, a, b, scope, bobj, internal }) => {
|
|
8
|
+
if (!internal) throw new SandboxCapabilityError("Internal variables are not accessible");
|
|
9
|
+
done(void 0, scope.declare(a, VarType.internal, b, bobj?.isGlobal || false, internal));
|
|
10
|
+
});
|
|
11
|
+
addOps(LispType.LoopAction, ({ done, a, b, context, statementLabels }) => {
|
|
12
|
+
const label = normalizeStatementLabel(b);
|
|
13
|
+
const target = findControlFlowTarget(statementLabels, a, label);
|
|
14
|
+
if (target === null) throw new TypeError("Illegal continue statement");
|
|
15
|
+
if (!target) throw new TypeError(label ? `Undefined label '${label}'` : "Illegal " + a + " statement");
|
|
16
|
+
done(void 0, new ExecReturn(context.ctx.auditReport, void 0, false, {
|
|
17
|
+
type: a,
|
|
18
|
+
label
|
|
19
|
+
}));
|
|
20
|
+
});
|
|
21
|
+
addOps(LispType.Throw, ({ done, b }) => {
|
|
22
|
+
done(b);
|
|
23
|
+
});
|
|
24
|
+
addOps(LispType.None, ({ done }) => done());
|
|
25
|
+
//#endregion
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=misc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"misc.js","names":[],"sources":["../../../../src/executor/ops/misc.ts"],"sourcesContent":["import {\n addOps,\n findControlFlowTarget,\n ExecReturn,\n normalizeStatementLabel,\n} from '../executorUtils';\nimport type { ControlFlowAction } from '../executorUtils';\nimport type { LispItem, StatementLabel } from '../../parser';\nimport { LispType, Prop, VarType, SandboxCapabilityError } from '../../utils';\n\naddOps<string, unknown, unknown, Prop>(\n LispType.Internal,\n ({ done, a, b, scope, bobj, internal }) => {\n if (!internal) {\n throw new SandboxCapabilityError('Internal variables are not accessible');\n }\n done(undefined, scope.declare(a, VarType.internal, b, bobj?.isGlobal || false, internal));\n },\n);\n\naddOps<LispItem, StatementLabel>(\n LispType.LoopAction,\n ({ done, a, b, context, statementLabels }) => {\n const label = normalizeStatementLabel(b);\n const target = findControlFlowTarget(statementLabels, a as ControlFlowAction, label);\n if (target === null) {\n throw new TypeError('Illegal continue statement');\n }\n if (!target) {\n throw new TypeError(label ? `Undefined label '${label}'` : 'Illegal ' + a + ' statement');\n }\n done(\n undefined,\n new ExecReturn(context.ctx.auditReport, undefined, false, {\n type: a as ControlFlowAction,\n label,\n }),\n );\n },\n);\n\naddOps(LispType.Throw, ({ done, b }) => {\n done(b);\n});\n\naddOps(LispType.None, ({ done }) => done());\n"],"mappings":";;;;;;AAUA,OACE,SAAS,WACR,EAAE,MAAM,GAAG,GAAG,OAAO,MAAM,eAAe;AACzC,KAAI,CAAC,SACH,OAAM,IAAI,uBAAuB,wCAAwC;AAE3E,MAAK,KAAA,GAAW,MAAM,QAAQ,GAAG,QAAQ,UAAU,GAAG,MAAM,YAAY,OAAO,SAAS,CAAC;EAE5F;AAED,OACE,SAAS,aACR,EAAE,MAAM,GAAG,GAAG,SAAS,sBAAsB;CAC5C,MAAM,QAAQ,wBAAwB,EAAE;CACxC,MAAM,SAAS,sBAAsB,iBAAiB,GAAwB,MAAM;AACpF,KAAI,WAAW,KACb,OAAM,IAAI,UAAU,6BAA6B;AAEnD,KAAI,CAAC,OACH,OAAM,IAAI,UAAU,QAAQ,oBAAoB,MAAM,KAAK,aAAa,IAAI,aAAa;AAE3F,MACE,KAAA,GACA,IAAI,WAAW,QAAQ,IAAI,aAAa,KAAA,GAAW,OAAO;EACxD,MAAM;EACN;EACD,CAAC,CACH;EAEJ;AAED,OAAO,SAAS,QAAQ,EAAE,MAAM,QAAQ;AACtC,MAAK,EAAE;EACP;AAEF,OAAO,SAAS,OAAO,EAAE,WAAW,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { LispType } from "../../utils/types.js";
|
|
2
|
+
import { sanitizeProp } from "../../utils/Scope.js";
|
|
3
|
+
import "../../utils/index.js";
|
|
4
|
+
import { addOps } from "../opsRegistry.js";
|
|
5
|
+
import { ArrayHole, KeyVal, SpreadArray, SpreadObject, checkHaltExpectedTicks } from "../executorUtils.js";
|
|
6
|
+
//#region src/executor/ops/object.ts
|
|
7
|
+
addOps(LispType.CreateObject, (params) => {
|
|
8
|
+
const { done, b } = params;
|
|
9
|
+
let res = {};
|
|
10
|
+
for (const item of b) if (item.key instanceof SpreadObject) {
|
|
11
|
+
const keys = Object.keys(item.key.item);
|
|
12
|
+
if (checkHaltExpectedTicks(params, BigInt(keys.length))) return;
|
|
13
|
+
res = {
|
|
14
|
+
...res,
|
|
15
|
+
...item.key.item
|
|
16
|
+
};
|
|
17
|
+
} else res[item.key] = item.val;
|
|
18
|
+
done(void 0, res);
|
|
19
|
+
});
|
|
20
|
+
addOps(LispType.KeyVal, ({ done, a, b }) => done(void 0, new KeyVal(a, b)));
|
|
21
|
+
addOps(LispType.CreateArray, (params) => {
|
|
22
|
+
const { done, b, context } = params;
|
|
23
|
+
const items = [];
|
|
24
|
+
for (const item of b) if (item instanceof SpreadArray) {
|
|
25
|
+
const expanded = Array.isArray(item.item) ? item.item : [...item.item];
|
|
26
|
+
if (checkHaltExpectedTicks(params, BigInt(expanded.length))) return;
|
|
27
|
+
for (const v of expanded) items.push(sanitizeProp(v, context));
|
|
28
|
+
} else if (item instanceof ArrayHole) items.length++;
|
|
29
|
+
else items.push(sanitizeProp(item, context));
|
|
30
|
+
done(void 0, items);
|
|
31
|
+
});
|
|
32
|
+
addOps(LispType.Hole, ({ done }) => done(void 0, new ArrayHole()));
|
|
33
|
+
addOps(LispType.Group, ({ done, b }) => done(void 0, b));
|
|
34
|
+
addOps(LispType.GlobalSymbol, ({ done, b }) => {
|
|
35
|
+
switch (b) {
|
|
36
|
+
case "true": return done(void 0, true);
|
|
37
|
+
case "false": return done(void 0, false);
|
|
38
|
+
case "null": return done(void 0, null);
|
|
39
|
+
case "undefined": return done(void 0, void 0);
|
|
40
|
+
case "NaN": return done(void 0, NaN);
|
|
41
|
+
case "Infinity": return done(void 0, Infinity);
|
|
42
|
+
}
|
|
43
|
+
done(/* @__PURE__ */ new Error("Unknown symbol: " + b));
|
|
44
|
+
});
|
|
45
|
+
addOps(LispType.SpreadArray, ({ done, b }) => {
|
|
46
|
+
done(void 0, new SpreadArray(b));
|
|
47
|
+
});
|
|
48
|
+
addOps(LispType.SpreadObject, ({ done, b }) => {
|
|
49
|
+
done(void 0, new SpreadObject(b));
|
|
50
|
+
});
|
|
51
|
+
//#endregion
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object.js","names":[],"sources":["../../../../src/executor/ops/object.ts"],"sourcesContent":["import {\n addOps,\n checkHaltExpectedTicks,\n SpreadArray,\n SpreadObject,\n KeyVal,\n ArrayHole,\n} from '../executorUtils';\nimport type { Lisp, LispItem } from '../../parser';\nimport { LispType, sanitizeProp } from '../../utils';\n\naddOps<unknown, KeyVal[]>(LispType.CreateObject, (params) => {\n const { done, b } = params;\n let res = {} as any;\n for (const item of b) {\n if (item.key instanceof SpreadObject) {\n const keys = Object.keys(item.key.item);\n if (checkHaltExpectedTicks(params, BigInt(keys.length))) return;\n res = { ...res, ...item.key.item };\n } else {\n res[item.key] = item.val;\n }\n }\n done(undefined, res);\n});\n\naddOps<PropertyKey, LispItem>(LispType.KeyVal, ({ done, a, b }) =>\n done(undefined, new KeyVal(a, b)),\n);\n\naddOps<unknown, Lisp[]>(LispType.CreateArray, (params) => {\n const { done, b, context } = params;\n const items: unknown[] = [];\n for (const item of b) {\n if (item instanceof SpreadArray) {\n const expanded = Array.isArray(item.item) ? item.item : [...(item.item as Iterable<unknown>)];\n if (checkHaltExpectedTicks(params, BigInt(expanded.length))) return;\n for (const v of expanded) items.push(sanitizeProp(v, context));\n } else if (item instanceof ArrayHole) {\n items.length++;\n } else {\n items.push(sanitizeProp(item, context));\n }\n }\n done(undefined, items);\n});\n\naddOps(LispType.Hole, ({ done }) => done(undefined, new ArrayHole()));\n\naddOps<unknown, unknown>(LispType.Group, ({ done, b }) => done(undefined, b));\n\naddOps<unknown, string>(LispType.GlobalSymbol, ({ done, b }) => {\n switch (b) {\n case 'true':\n return done(undefined, true);\n case 'false':\n return done(undefined, false);\n case 'null':\n return done(undefined, null);\n case 'undefined':\n return done(undefined, undefined);\n case 'NaN':\n return done(undefined, NaN);\n case 'Infinity':\n return done(undefined, Infinity);\n }\n done(new Error('Unknown symbol: ' + b));\n});\n\naddOps<unknown, unknown[]>(LispType.SpreadArray, ({ done, b }) => {\n done(undefined, new SpreadArray(b));\n});\n\naddOps<unknown, Record<string, unknown>>(LispType.SpreadObject, ({ done, b }) => {\n done(undefined, new SpreadObject(b));\n});\n"],"mappings":";;;;;;AAWA,OAA0B,SAAS,eAAe,WAAW;CAC3D,MAAM,EAAE,MAAM,MAAM;CACpB,IAAI,MAAM,EAAE;AACZ,MAAK,MAAM,QAAQ,EACjB,KAAI,KAAK,eAAe,cAAc;EACpC,MAAM,OAAO,OAAO,KAAK,KAAK,IAAI,KAAK;AACvC,MAAI,uBAAuB,QAAQ,OAAO,KAAK,OAAO,CAAC,CAAE;AACzD,QAAM;GAAE,GAAG;GAAK,GAAG,KAAK,IAAI;GAAM;OAElC,KAAI,KAAK,OAAO,KAAK;AAGzB,MAAK,KAAA,GAAW,IAAI;EACpB;AAEF,OAA8B,SAAS,SAAS,EAAE,MAAM,GAAG,QACzD,KAAK,KAAA,GAAW,IAAI,OAAO,GAAG,EAAE,CAAC,CAClC;AAED,OAAwB,SAAS,cAAc,WAAW;CACxD,MAAM,EAAE,MAAM,GAAG,YAAY;CAC7B,MAAM,QAAmB,EAAE;AAC3B,MAAK,MAAM,QAAQ,EACjB,KAAI,gBAAgB,aAAa;EAC/B,MAAM,WAAW,MAAM,QAAQ,KAAK,KAAK,GAAG,KAAK,OAAO,CAAC,GAAI,KAAK,KAA2B;AAC7F,MAAI,uBAAuB,QAAQ,OAAO,SAAS,OAAO,CAAC,CAAE;AAC7D,OAAK,MAAM,KAAK,SAAU,OAAM,KAAK,aAAa,GAAG,QAAQ,CAAC;YACrD,gBAAgB,UACzB,OAAM;KAEN,OAAM,KAAK,aAAa,MAAM,QAAQ,CAAC;AAG3C,MAAK,KAAA,GAAW,MAAM;EACtB;AAEF,OAAO,SAAS,OAAO,EAAE,WAAW,KAAK,KAAA,GAAW,IAAI,WAAW,CAAC,CAAC;AAErE,OAAyB,SAAS,QAAQ,EAAE,MAAM,QAAQ,KAAK,KAAA,GAAW,EAAE,CAAC;AAE7E,OAAwB,SAAS,eAAe,EAAE,MAAM,QAAQ;AAC9D,SAAQ,GAAR;EACE,KAAK,OACH,QAAO,KAAK,KAAA,GAAW,KAAK;EAC9B,KAAK,QACH,QAAO,KAAK,KAAA,GAAW,MAAM;EAC/B,KAAK,OACH,QAAO,KAAK,KAAA,GAAW,KAAK;EAC9B,KAAK,YACH,QAAO,KAAK,KAAA,GAAW,KAAA,EAAU;EACnC,KAAK,MACH,QAAO,KAAK,KAAA,GAAW,IAAI;EAC7B,KAAK,WACH,QAAO,KAAK,KAAA,GAAW,SAAS;;AAEpC,sBAAK,IAAI,MAAM,qBAAqB,EAAE,CAAC;EACvC;AAEF,OAA2B,SAAS,cAAc,EAAE,MAAM,QAAQ;AAChE,MAAK,KAAA,GAAW,IAAI,YAAY,EAAE,CAAC;EACnC;AAEF,OAAyC,SAAS,eAAe,EAAE,MAAM,QAAQ;AAC/E,MAAK,KAAA,GAAW,IAAI,aAAa,EAAE,CAAC;EACpC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { SandboxAccessError } from "../../utils/errors.js";
|
|
2
|
+
import { LispType } from "../../utils/types.js";
|
|
3
|
+
import { Prop, hasOwnProperty, resolveSandboxProp } from "../../utils/Prop.js";
|
|
4
|
+
import "../../utils/index.js";
|
|
5
|
+
import { addOps } from "../opsRegistry.js";
|
|
6
|
+
import { hasPossibleProperties, isPropertyKey } from "../executorUtils.js";
|
|
7
|
+
//#region src/executor/ops/prop.ts
|
|
8
|
+
addOps(LispType.Prop, ({ done, a, b, obj, context, scope, internal }) => {
|
|
9
|
+
if (a === null) throw new TypeError(`Cannot read properties of null (reading '${b?.toString()}')`);
|
|
10
|
+
if (!isPropertyKey(b)) b = `${b}`;
|
|
11
|
+
if (a === void 0 && obj === void 0 && typeof b === "string") {
|
|
12
|
+
const prop = scope.get(b, internal);
|
|
13
|
+
if (prop.context === void 0) throw new ReferenceError(`${b} is not defined`);
|
|
14
|
+
if (prop.context === context.ctx.sandboxGlobal) {
|
|
15
|
+
if (context.ctx.options.audit) context.ctx.auditReport?.globalsAccess.add(b);
|
|
16
|
+
}
|
|
17
|
+
const val = prop.context[prop.prop];
|
|
18
|
+
done(void 0, resolveSandboxProp(val, context, prop) || prop);
|
|
19
|
+
return;
|
|
20
|
+
} else if (a === void 0) throw new TypeError(`Cannot read properties of undefined (reading '${b.toString()}')`);
|
|
21
|
+
if (!hasPossibleProperties(a)) {
|
|
22
|
+
done(void 0, new Prop(void 0, b));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const prototypeAccess = typeof a === "function" || !hasOwnProperty(a, b);
|
|
26
|
+
if (context.ctx.options.audit && prototypeAccess) {
|
|
27
|
+
let prot = Object.getPrototypeOf(a);
|
|
28
|
+
do
|
|
29
|
+
if (hasOwnProperty(prot, b)) {
|
|
30
|
+
if (context.ctx.auditReport && !context.ctx.auditReport.prototypeAccess[prot.constructor.name]) context.ctx.auditReport.prototypeAccess[prot.constructor.name] = /* @__PURE__ */ new Set();
|
|
31
|
+
context.ctx.auditReport?.prototypeAccess[prot.constructor.name].add(b);
|
|
32
|
+
}
|
|
33
|
+
while (prot = Object.getPrototypeOf(prot));
|
|
34
|
+
}
|
|
35
|
+
if (prototypeAccess) {
|
|
36
|
+
if (typeof a === "function") {
|
|
37
|
+
if (hasOwnProperty(a, b)) {
|
|
38
|
+
const whitelist = context.ctx.prototypeWhitelist.get(a.prototype);
|
|
39
|
+
if (!(whitelist && (!whitelist.size || whitelist.has(b))) && !context.ctx.sandboxedFunctions.has(a)) throw new SandboxAccessError(`Static method or property access not permitted: ${a.name}.${b.toString()}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
let prot = a;
|
|
43
|
+
while (prot = Object.getPrototypeOf(prot)) if (hasOwnProperty(prot, b) || b === "__proto__") {
|
|
44
|
+
const whitelist = context.ctx.prototypeWhitelist.get(prot);
|
|
45
|
+
if (whitelist && (!whitelist.size || whitelist.has(b)) || context.ctx.sandboxedFunctions.has(prot.constructor)) break;
|
|
46
|
+
if (b === "__proto__") throw new SandboxAccessError(`Access to prototype of global object is not permitted`);
|
|
47
|
+
throw new SandboxAccessError(`Method or property access not permitted: ${prot.constructor.name}.${b.toString()}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (typeof a === "function") {
|
|
51
|
+
if (b === "prototype" && !context.ctx.sandboxedFunctions.has(a)) throw new SandboxAccessError(`Access to prototype of global object is not permitted`);
|
|
52
|
+
if ([
|
|
53
|
+
"caller",
|
|
54
|
+
"callee",
|
|
55
|
+
"arguments"
|
|
56
|
+
].includes(b)) throw new SandboxAccessError(`Access to '${b}' property is not permitted`);
|
|
57
|
+
}
|
|
58
|
+
const val = a[b];
|
|
59
|
+
if (b === "__proto__" && !context.ctx.sandboxedFunctions.has(val?.constructor)) throw new SandboxAccessError(`Access to prototype of global object is not permitted`);
|
|
60
|
+
const p = resolveSandboxProp(val, context, new Prop(a, b, false, false));
|
|
61
|
+
if (p) {
|
|
62
|
+
done(void 0, p);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const isSandboxGlobal = a === context.ctx.sandboxGlobal;
|
|
66
|
+
const g = !isSandboxGlobal && obj instanceof Prop && obj.isGlobal || typeof a === "function" && !context.ctx.sandboxedFunctions.has(a) || context.ctx.globalsWhitelist.has(a) || isSandboxGlobal && typeof b === "string" && hasOwnProperty(context.ctx.globalScope.globals, b);
|
|
67
|
+
done(void 0, new Prop(a, b, false, g, false));
|
|
68
|
+
});
|
|
69
|
+
addOps(LispType.StringIndex, ({ done, b, context }) => done(void 0, context.constants.strings[parseInt(b)]));
|
|
70
|
+
//#endregion
|
|
71
|
+
|
|
72
|
+
//# sourceMappingURL=prop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prop.js","names":[],"sources":["../../../../src/executor/ops/prop.ts"],"sourcesContent":["import { addOps, hasPossibleProperties, isPropertyKey } from '../executorUtils';\nimport {\n LispType,\n Prop,\n SandboxAccessError,\n resolveSandboxProp,\n hasOwnProperty,\n} from '../../utils';\n\naddOps<unknown, PropertyKey>(LispType.Prop, ({ done, a, b, obj, context, scope, internal }) => {\n if (a === null) {\n throw new TypeError(`Cannot read properties of null (reading '${b?.toString()}')`);\n }\n\n if (!isPropertyKey(b)) {\n b = `${b}`;\n }\n\n if (a === undefined && obj === undefined && typeof b === 'string') {\n // is variable access\n const prop = scope.get(b, internal);\n if (prop.context === undefined) {\n throw new ReferenceError(`${b} is not defined`);\n }\n if (prop.context === context.ctx.sandboxGlobal) {\n if (context.ctx.options.audit) {\n context.ctx.auditReport?.globalsAccess.add(b);\n }\n }\n const val = (prop.context as any)[prop.prop];\n const p = resolveSandboxProp(val, context, prop) || prop;\n\n done(undefined, p);\n return;\n } else if (a === undefined) {\n throw new TypeError(`Cannot read properties of undefined (reading '${b.toString()}')`);\n }\n\n if (!hasPossibleProperties(a)) {\n done(undefined, new Prop(undefined, b));\n return;\n }\n\n const prototypeAccess = typeof a === 'function' || !hasOwnProperty(a, b);\n\n if (context.ctx.options.audit && prototypeAccess) {\n let prot: {} = Object.getPrototypeOf(a);\n do {\n if (hasOwnProperty(prot, b)) {\n if (\n context.ctx.auditReport &&\n !context.ctx.auditReport.prototypeAccess[prot.constructor.name]\n ) {\n context.ctx.auditReport.prototypeAccess[prot.constructor.name] = new Set();\n }\n context.ctx.auditReport?.prototypeAccess[prot.constructor.name].add(b);\n }\n } while ((prot = Object.getPrototypeOf(prot)));\n }\n\n if (prototypeAccess) {\n if (typeof a === 'function') {\n if (hasOwnProperty(a, b)) {\n const whitelist = context.ctx.prototypeWhitelist.get(a.prototype);\n if (\n !(whitelist && (!whitelist.size || whitelist.has(b))) &&\n !context.ctx.sandboxedFunctions.has(a)\n ) {\n throw new SandboxAccessError(\n `Static method or property access not permitted: ${a.name}.${b.toString()}`,\n );\n }\n }\n }\n\n let prot: {} = a;\n while ((prot = Object.getPrototypeOf(prot))) {\n if (hasOwnProperty(prot, b) || b === '__proto__') {\n const whitelist = context.ctx.prototypeWhitelist.get(prot);\n if (\n (whitelist && (!whitelist.size || whitelist.has(b))) ||\n context.ctx.sandboxedFunctions.has(prot.constructor)\n ) {\n break;\n }\n if (b === '__proto__') {\n throw new SandboxAccessError(`Access to prototype of global object is not permitted`);\n }\n throw new SandboxAccessError(\n `Method or property access not permitted: ${prot.constructor.name}.${b.toString()}`,\n );\n }\n }\n }\n\n if (typeof a === 'function') {\n if (b === 'prototype' && !context.ctx.sandboxedFunctions.has(a)) {\n throw new SandboxAccessError(`Access to prototype of global object is not permitted`);\n }\n if (['caller', 'callee', 'arguments'].includes(b as string)) {\n throw new SandboxAccessError(`Access to '${b as string}' property is not permitted`);\n }\n }\n const val = a[b as keyof typeof a] as unknown;\n\n if (b === '__proto__' && !context.ctx.sandboxedFunctions.has(val?.constructor as any)) {\n throw new SandboxAccessError(`Access to prototype of global object is not permitted`);\n }\n\n const p = resolveSandboxProp(val, context, new Prop(a, b, false, false));\n if (p) {\n done(undefined, p);\n return;\n }\n\n const isSandboxGlobal = a === context.ctx.sandboxGlobal;\n const g =\n (!isSandboxGlobal && obj instanceof Prop && obj.isGlobal) ||\n (typeof a === 'function' && !context.ctx.sandboxedFunctions.has(a)) ||\n context.ctx.globalsWhitelist.has(a) ||\n (isSandboxGlobal &&\n typeof b === 'string' &&\n hasOwnProperty(context.ctx.globalScope.globals, b));\n\n done(undefined, new Prop(a, b, false, g, false));\n});\n\naddOps<unknown, string>(LispType.StringIndex, ({ done, b, context }) =>\n done(undefined, context.constants.strings[parseInt(b)]),\n);\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|