@cuxt/sandboxjs 0.1.1 → 0.1.4

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.
Files changed (226) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +198 -185
  3. package/{build → dist/cjs}/Sandbox.d.ts +15 -6
  4. package/dist/cjs/Sandbox.js +126 -0
  5. package/dist/{SandboxExec.d.ts → cjs/SandboxExec.d.ts} +8 -17
  6. package/dist/cjs/SandboxExec.js +227 -0
  7. package/{build/eval.d.ts → dist/cjs/eval/index.d.ts} +10 -2
  8. package/dist/cjs/eval/index.js +233 -0
  9. package/dist/cjs/executor/executorUtils.d.ts +161 -0
  10. package/dist/cjs/executor/executorUtils.js +930 -0
  11. package/dist/cjs/executor/index.d.ts +1 -0
  12. package/dist/cjs/executor/index.js +2 -0
  13. package/dist/cjs/executor/ops/assignment.d.ts +1 -0
  14. package/dist/cjs/executor/ops/assignment.js +88 -0
  15. package/dist/cjs/executor/ops/call.d.ts +1 -0
  16. package/dist/cjs/executor/ops/call.js +160 -0
  17. package/dist/cjs/executor/ops/comparison.d.ts +1 -0
  18. package/dist/cjs/executor/ops/comparison.js +36 -0
  19. package/dist/cjs/executor/ops/control.d.ts +1 -0
  20. package/dist/cjs/executor/ops/control.js +203 -0
  21. package/dist/cjs/executor/ops/functions.d.ts +1 -0
  22. package/dist/cjs/executor/ops/functions.js +55 -0
  23. package/dist/cjs/executor/ops/index.d.ts +0 -0
  24. package/dist/cjs/executor/ops/index.js +11 -0
  25. package/dist/cjs/executor/ops/literals.d.ts +1 -0
  26. package/dist/cjs/executor/ops/literals.js +45 -0
  27. package/dist/cjs/executor/ops/misc.d.ts +1 -0
  28. package/dist/cjs/executor/ops/misc.js +25 -0
  29. package/dist/cjs/executor/ops/object.d.ts +1 -0
  30. package/dist/cjs/executor/ops/object.js +51 -0
  31. package/dist/cjs/executor/ops/prop.d.ts +1 -0
  32. package/dist/cjs/executor/ops/prop.js +70 -0
  33. package/dist/cjs/executor/ops/unary.d.ts +1 -0
  34. package/dist/cjs/executor/ops/unary.js +48 -0
  35. package/dist/cjs/executor/ops/variables.d.ts +1 -0
  36. package/dist/cjs/executor/ops/variables.js +16 -0
  37. package/dist/cjs/executor/opsRegistry.d.ts +33 -0
  38. package/dist/cjs/executor/opsRegistry.js +8 -0
  39. package/dist/cjs/package.json +3 -0
  40. package/dist/cjs/parser/index.d.ts +3 -0
  41. package/dist/cjs/parser/index.js +1 -0
  42. package/dist/{parser.d.ts → cjs/parser/lisp.d.ts} +29 -42
  43. package/dist/cjs/parser/lispTypes/conditionals.d.ts +2 -0
  44. package/dist/cjs/parser/lispTypes/conditionals.js +135 -0
  45. package/dist/cjs/parser/lispTypes/control.d.ts +2 -0
  46. package/dist/cjs/parser/lispTypes/control.js +204 -0
  47. package/dist/cjs/parser/lispTypes/declarations.d.ts +2 -0
  48. package/dist/cjs/parser/lispTypes/declarations.js +99 -0
  49. package/dist/cjs/parser/lispTypes/index.d.ts +3 -0
  50. package/dist/cjs/parser/lispTypes/index.js +17 -0
  51. package/dist/cjs/parser/lispTypes/operators.d.ts +2 -0
  52. package/dist/cjs/parser/lispTypes/operators.js +252 -0
  53. package/dist/cjs/parser/lispTypes/shared.d.ts +38 -0
  54. package/dist/cjs/parser/lispTypes/structures.d.ts +2 -0
  55. package/dist/cjs/parser/lispTypes/structures.js +188 -0
  56. package/dist/cjs/parser/lispTypes/values.d.ts +2 -0
  57. package/dist/cjs/parser/lispTypes/values.js +89 -0
  58. package/dist/cjs/parser/parserUtils.d.ts +34 -0
  59. package/dist/cjs/parser/parserUtils.js +968 -0
  60. package/dist/cjs/utils/CodeString.d.ts +16 -0
  61. package/dist/cjs/utils/CodeString.js +64 -0
  62. package/dist/cjs/utils/ExecContext.d.ts +34 -0
  63. package/dist/cjs/utils/ExecContext.js +171 -0
  64. package/dist/cjs/utils/Prop.d.ts +16 -0
  65. package/dist/cjs/utils/Prop.js +81 -0
  66. package/dist/cjs/utils/Scope.d.ts +47 -0
  67. package/dist/cjs/utils/Scope.js +127 -0
  68. package/dist/cjs/utils/errors.d.ts +10 -0
  69. package/dist/cjs/utils/errors.js +12 -0
  70. package/dist/cjs/utils/functionReplacements.d.ts +11 -0
  71. package/dist/cjs/utils/functionReplacements.js +362 -0
  72. package/dist/cjs/utils/index.d.ts +7 -0
  73. package/dist/cjs/utils/index.js +7 -0
  74. package/dist/cjs/utils/types.d.ts +221 -0
  75. package/dist/cjs/utils/types.js +164 -0
  76. package/dist/cjs/utils/unraw.js +145 -0
  77. package/dist/{node → esm}/Sandbox.d.ts +15 -6
  78. package/dist/esm/Sandbox.js +115 -0
  79. package/dist/esm/Sandbox.js.map +1 -0
  80. package/{build → dist/esm}/SandboxExec.d.ts +8 -17
  81. package/dist/esm/SandboxExec.js +224 -0
  82. package/dist/esm/SandboxExec.js.map +1 -0
  83. package/dist/{eval.d.ts → esm/eval/index.d.ts} +10 -2
  84. package/dist/esm/eval/index.js +235 -0
  85. package/dist/esm/eval/index.js.map +1 -0
  86. package/dist/esm/executor/executorUtils.d.ts +161 -0
  87. package/dist/esm/executor/executorUtils.js +898 -0
  88. package/dist/esm/executor/executorUtils.js.map +1 -0
  89. package/dist/esm/executor/index.d.ts +1 -0
  90. package/dist/esm/executor/index.js +2 -0
  91. package/dist/esm/executor/ops/assignment.d.ts +1 -0
  92. package/dist/esm/executor/ops/assignment.js +90 -0
  93. package/dist/esm/executor/ops/assignment.js.map +1 -0
  94. package/dist/esm/executor/ops/call.d.ts +1 -0
  95. package/dist/esm/executor/ops/call.js +162 -0
  96. package/dist/esm/executor/ops/call.js.map +1 -0
  97. package/dist/esm/executor/ops/comparison.d.ts +1 -0
  98. package/dist/esm/executor/ops/comparison.js +38 -0
  99. package/dist/esm/executor/ops/comparison.js.map +1 -0
  100. package/dist/esm/executor/ops/control.d.ts +1 -0
  101. package/dist/esm/executor/ops/control.js +205 -0
  102. package/dist/esm/executor/ops/control.js.map +1 -0
  103. package/dist/esm/executor/ops/functions.d.ts +1 -0
  104. package/dist/esm/executor/ops/functions.js +57 -0
  105. package/dist/esm/executor/ops/functions.js.map +1 -0
  106. package/dist/esm/executor/ops/index.d.ts +0 -0
  107. package/dist/esm/executor/ops/index.js +11 -0
  108. package/dist/esm/executor/ops/literals.d.ts +1 -0
  109. package/dist/esm/executor/ops/literals.js +47 -0
  110. package/dist/esm/executor/ops/literals.js.map +1 -0
  111. package/dist/esm/executor/ops/misc.d.ts +1 -0
  112. package/dist/esm/executor/ops/misc.js +27 -0
  113. package/dist/esm/executor/ops/misc.js.map +1 -0
  114. package/dist/esm/executor/ops/object.d.ts +1 -0
  115. package/dist/esm/executor/ops/object.js +53 -0
  116. package/dist/esm/executor/ops/object.js.map +1 -0
  117. package/dist/esm/executor/ops/prop.d.ts +1 -0
  118. package/dist/esm/executor/ops/prop.js +72 -0
  119. package/dist/esm/executor/ops/prop.js.map +1 -0
  120. package/dist/esm/executor/ops/unary.d.ts +1 -0
  121. package/dist/esm/executor/ops/unary.js +50 -0
  122. package/dist/esm/executor/ops/unary.js.map +1 -0
  123. package/dist/esm/executor/ops/variables.d.ts +1 -0
  124. package/dist/esm/executor/ops/variables.js +18 -0
  125. package/dist/esm/executor/ops/variables.js.map +1 -0
  126. package/dist/esm/executor/opsRegistry.d.ts +33 -0
  127. package/dist/esm/executor/opsRegistry.js +9 -0
  128. package/dist/esm/executor/opsRegistry.js.map +1 -0
  129. package/dist/esm/package.json +3 -0
  130. package/dist/esm/parser/index.d.ts +3 -0
  131. package/dist/esm/parser/index.js +1 -0
  132. package/{build/parser.d.ts → dist/esm/parser/lisp.d.ts} +29 -42
  133. package/dist/esm/parser/lispTypes/conditionals.d.ts +2 -0
  134. package/dist/esm/parser/lispTypes/conditionals.js +137 -0
  135. package/dist/esm/parser/lispTypes/conditionals.js.map +1 -0
  136. package/dist/esm/parser/lispTypes/control.d.ts +2 -0
  137. package/dist/esm/parser/lispTypes/control.js +206 -0
  138. package/dist/esm/parser/lispTypes/control.js.map +1 -0
  139. package/dist/esm/parser/lispTypes/declarations.d.ts +2 -0
  140. package/dist/esm/parser/lispTypes/declarations.js +101 -0
  141. package/dist/esm/parser/lispTypes/declarations.js.map +1 -0
  142. package/dist/esm/parser/lispTypes/index.d.ts +3 -0
  143. package/dist/esm/parser/lispTypes/index.js +19 -0
  144. package/dist/esm/parser/lispTypes/index.js.map +1 -0
  145. package/dist/esm/parser/lispTypes/operators.d.ts +2 -0
  146. package/dist/esm/parser/lispTypes/operators.js +254 -0
  147. package/dist/esm/parser/lispTypes/operators.js.map +1 -0
  148. package/dist/esm/parser/lispTypes/shared.d.ts +38 -0
  149. package/dist/esm/parser/lispTypes/structures.d.ts +2 -0
  150. package/dist/esm/parser/lispTypes/structures.js +190 -0
  151. package/dist/esm/parser/lispTypes/structures.js.map +1 -0
  152. package/dist/esm/parser/lispTypes/values.d.ts +2 -0
  153. package/dist/esm/parser/lispTypes/values.js +91 -0
  154. package/dist/esm/parser/lispTypes/values.js.map +1 -0
  155. package/dist/esm/parser/parserUtils.d.ts +34 -0
  156. package/dist/esm/parser/parserUtils.js +959 -0
  157. package/dist/esm/parser/parserUtils.js.map +1 -0
  158. package/dist/esm/utils/CodeString.d.ts +16 -0
  159. package/dist/esm/utils/CodeString.js +66 -0
  160. package/dist/esm/utils/CodeString.js.map +1 -0
  161. package/dist/esm/utils/ExecContext.d.ts +34 -0
  162. package/dist/esm/utils/ExecContext.js +168 -0
  163. package/dist/esm/utils/ExecContext.js.map +1 -0
  164. package/dist/esm/utils/Prop.d.ts +16 -0
  165. package/dist/esm/utils/Prop.js +80 -0
  166. package/dist/esm/utils/Prop.js.map +1 -0
  167. package/dist/esm/utils/Scope.d.ts +47 -0
  168. package/dist/esm/utils/Scope.js +122 -0
  169. package/dist/esm/utils/Scope.js.map +1 -0
  170. package/dist/esm/utils/errors.d.ts +10 -0
  171. package/dist/esm/utils/errors.js +10 -0
  172. package/dist/esm/utils/errors.js.map +1 -0
  173. package/dist/esm/utils/functionReplacements.d.ts +11 -0
  174. package/dist/esm/utils/functionReplacements.js +361 -0
  175. package/dist/esm/utils/functionReplacements.js.map +1 -0
  176. package/dist/esm/utils/index.d.ts +7 -0
  177. package/dist/esm/utils/index.js +7 -0
  178. package/dist/esm/utils/types.d.ts +221 -0
  179. package/dist/esm/utils/types.js +160 -0
  180. package/dist/esm/utils/types.js.map +1 -0
  181. package/dist/esm/utils/unraw.js +147 -0
  182. package/dist/esm/utils/unraw.js.map +1 -0
  183. package/dist/umd/Sandbox.min.js +2 -0
  184. package/dist/umd/Sandbox.min.js.map +1 -0
  185. package/dist/umd/SandboxExec.min.js +2 -0
  186. package/dist/umd/SandboxExec.min.js.map +1 -0
  187. package/package.json +17 -16
  188. package/build/Sandbox.js +0 -62
  189. package/build/SandboxExec.js +0 -214
  190. package/build/eval.js +0 -205
  191. package/build/executor.d.ts +0 -124
  192. package/build/executor.js +0 -1554
  193. package/build/parser.js +0 -1527
  194. package/build/unraw.js +0 -168
  195. package/build/utils.d.ts +0 -264
  196. package/build/utils.js +0 -362
  197. package/dist/Sandbox.d.ts +0 -25
  198. package/dist/Sandbox.js +0 -270
  199. package/dist/Sandbox.js.map +0 -1
  200. package/dist/Sandbox.min.js +0 -2
  201. package/dist/Sandbox.min.js.map +0 -1
  202. package/dist/SandboxExec.js +0 -218
  203. package/dist/SandboxExec.js.map +0 -1
  204. package/dist/SandboxExec.min.js +0 -2
  205. package/dist/SandboxExec.min.js.map +0 -1
  206. package/dist/executor.d.ts +0 -124
  207. package/dist/executor.js +0 -1558
  208. package/dist/executor.js.map +0 -1
  209. package/dist/node/Sandbox.js +0 -277
  210. package/dist/node/SandboxExec.d.ts +0 -66
  211. package/dist/node/SandboxExec.js +0 -225
  212. package/dist/node/eval.d.ts +0 -27
  213. package/dist/node/executor.d.ts +0 -124
  214. package/dist/node/executor.js +0 -1575
  215. package/dist/node/parser.d.ts +0 -154
  216. package/dist/node/parser.js +0 -1704
  217. package/dist/node/utils.d.ts +0 -264
  218. package/dist/node/utils.js +0 -385
  219. package/dist/parser.js +0 -1690
  220. package/dist/parser.js.map +0 -1
  221. package/dist/unraw.d.ts +0 -11
  222. package/dist/utils.d.ts +0 -264
  223. package/dist/utils.js +0 -365
  224. package/dist/utils.js.map +0 -1
  225. /package/{build → dist/cjs/utils}/unraw.d.ts +0 -0
  226. /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 {};