@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.
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 +70 -68
  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 -1546
  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 -1550
  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 -1567
  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 @@
1
+ {"version":3,"file":"executorUtils.js","names":[],"sources":["../../../src/executor/executorUtils.ts"],"sourcesContent":["import type { LispItem, Lisp, StatementLabel } from '../parser';\nimport {\n hasOwnProperty,\n isLisp,\n LispType,\n LocalScope,\n Prop,\n SandboxExecutionQuotaExceededError,\n SandboxError,\n SandboxExecutionTreeError,\n Scope,\n GeneratorFunction,\n AsyncGeneratorFunction,\n SandboxCapabilityError,\n SandboxAccessError,\n NON_BLOCKING_THRESHOLD,\n sanitizeProp,\n Unknown,\n} from '../utils';\nimport { IAuditReport, IExecContext, IScope, optional, Ticks } from '../utils';\n\nexport type Done<T = any> = (err?: any, res?: T | typeof optional) => void;\n\nexport type ControlFlowAction = 'break' | 'continue';\n\nexport interface ControlFlowSignal {\n type: ControlFlowAction;\n label?: string;\n}\n\ninterface ControlFlowTarget {\n label?: string;\n acceptsBreak: boolean;\n acceptsContinue: boolean;\n acceptsUnlabeledBreak: boolean;\n acceptsUnlabeledContinue: boolean;\n}\n\nexport type ControlFlowTargets = readonly ControlFlowTarget[] | undefined;\n\nexport class ExecReturn<T> {\n constructor(\n public auditReport: IAuditReport | undefined,\n public result: T,\n public returned: boolean,\n public controlFlow?: ControlFlowSignal,\n ) {}\n\n get breakLoop() {\n return this.controlFlow?.type === 'break';\n }\n\n get continueLoop() {\n return this.controlFlow?.type === 'continue';\n }\n}\n\nexport interface IChange {\n type: string;\n}\n\nexport interface ICreate extends IChange {\n type: 'create';\n prop: number | string;\n}\n\nexport interface IReplace extends IChange {\n type: 'replace';\n}\n\nexport interface IDelete extends IChange {\n type: 'delete';\n prop: number | string;\n}\n\nexport interface IReverse extends IChange {\n type: 'reverse';\n}\n\nexport interface ISort extends IChange {\n type: 'sort';\n}\n\nexport interface IPush extends IChange {\n type: 'push';\n added: unknown[];\n}\n\nexport interface IPop extends IChange {\n type: 'pop';\n removed: unknown[];\n}\n\nexport interface IShift extends IChange {\n type: 'shift';\n removed: unknown[];\n}\n\nexport interface IUnShift extends IChange {\n type: 'unshift';\n added: unknown[];\n}\n\nexport interface ISplice extends IChange {\n type: 'splice';\n startIndex: number;\n deleteCount: number;\n added: unknown[];\n removed: unknown[];\n}\n\nexport interface ICopyWithin extends IChange {\n type: 'copyWithin';\n startIndex: number;\n endIndex: number;\n added: unknown[];\n removed: unknown[];\n}\n\nexport type Change =\n | ICreate\n | IReplace\n | IDelete\n | IReverse\n | ISort\n | IPush\n | IPop\n | IUnShift\n | IShift\n | ISplice\n | ICopyWithin;\n\nconst emptyControlFlowTargets: readonly ControlFlowTarget[] = [];\n\nexport function normalizeStatementLabel(label: StatementLabel | undefined) {\n return label === undefined || label === LispType.None ? undefined : label;\n}\n\nexport function normalizeStatementLabels(label: LispItem | StatementLabel | undefined) {\n if (label === undefined || label === LispType.None) return [] as string[];\n if (Array.isArray(label) && !isLisp(label)) {\n return label.filter((item): item is string => typeof item === 'string');\n }\n return [label as string];\n}\n\nexport function createLoopTarget(label?: string, acceptsUnlabeled = true): ControlFlowTarget {\n return {\n label,\n acceptsBreak: true,\n acceptsContinue: true,\n acceptsUnlabeledBreak: acceptsUnlabeled,\n acceptsUnlabeledContinue: acceptsUnlabeled,\n };\n}\n\nexport function createSwitchTarget(label?: string): ControlFlowTarget {\n return {\n label,\n acceptsBreak: true,\n acceptsContinue: false,\n acceptsUnlabeledBreak: true,\n acceptsUnlabeledContinue: false,\n };\n}\n\nexport function createLabeledStatementTarget(label?: string): ControlFlowTarget | undefined {\n if (!label) return undefined;\n return {\n label,\n acceptsBreak: true,\n acceptsContinue: false,\n acceptsUnlabeledBreak: false,\n acceptsUnlabeledContinue: false,\n };\n}\n\nexport function addControlFlowTarget(\n controlFlowTargets: ControlFlowTargets,\n target?: ControlFlowTarget,\n): ControlFlowTargets {\n if (!target) return controlFlowTargets;\n return [...(controlFlowTargets || emptyControlFlowTargets), target];\n}\n\nexport function addControlFlowTargets(\n controlFlowTargets: ControlFlowTargets,\n targets: ControlFlowTarget[],\n): ControlFlowTargets {\n return targets.reduce(\n (currentTargets, target) => addControlFlowTarget(currentTargets, target),\n controlFlowTargets,\n );\n}\n\nexport function matchesControlFlowTarget(signal: ControlFlowSignal, target: ControlFlowTarget) {\n if (signal.type === 'continue') {\n if (!target.acceptsContinue) return false;\n return signal.label ? target.label === signal.label : target.acceptsUnlabeledContinue;\n }\n if (!target.acceptsBreak) return false;\n return signal.label ? target.label === signal.label : target.acceptsUnlabeledBreak;\n}\n\nexport function findControlFlowTarget(\n controlFlowTargets: ControlFlowTargets,\n type: ControlFlowAction,\n label?: string,\n) {\n if (!controlFlowTargets) return undefined;\n for (let i = controlFlowTargets.length - 1; i >= 0; i--) {\n const target = controlFlowTargets[i];\n if (label) {\n if (target.label !== label) continue;\n if (type === 'continue' ? target.acceptsContinue : target.acceptsBreak) {\n return target;\n }\n return null;\n }\n if (type === 'continue' ? target.acceptsUnlabeledContinue : target.acceptsUnlabeledBreak) {\n return target;\n }\n }\n return undefined;\n}\n\nfunction generateArgs(argNames: string[], args: unknown[]) {\n const vars: Record<string, unknown> = {};\n argNames.forEach((arg, i) => {\n if (arg.startsWith('...')) {\n vars[arg.substring(3)] = args.slice(i);\n } else {\n vars[arg] = args[i];\n }\n });\n return vars;\n}\n\nexport function createFunction(\n argNames: string[],\n parsed: Lisp[],\n ticks: Ticks,\n context: IExecContext,\n scope?: Scope,\n name?: string,\n internal = false,\n) {\n if (context.ctx.options.forbidFunctionCreation) {\n throw new SandboxCapabilityError('Function creation is forbidden');\n }\n let func;\n if (name === undefined) {\n func = (...args: unknown[]) => {\n const vars = generateArgs(argNames, args);\n const res = executeTree(\n ticks,\n context,\n parsed,\n scope === undefined ? [] : [new Scope(scope, vars)],\n undefined,\n internal,\n );\n return res.result;\n };\n } else {\n func = function sandboxedObject(this: Unknown, ...args: unknown[]) {\n const vars = generateArgs(argNames, args);\n const res = executeTree(\n ticks,\n context,\n parsed,\n scope === undefined ? [] : [new Scope(scope, vars, this)],\n undefined,\n internal,\n );\n return res.result;\n };\n }\n context.registerSandboxFunction(func);\n context.ctx.sandboxedFunctions.add(func);\n return func;\n}\n\nexport function createFunctionAsync(\n argNames: string[],\n parsed: Lisp[],\n ticks: Ticks,\n context: IExecContext,\n scope?: Scope,\n name?: string,\n internal = false,\n) {\n if (context.ctx.options.forbidFunctionCreation) {\n throw new SandboxCapabilityError('Function creation is forbidden');\n }\n if (!context.ctx.prototypeWhitelist?.has(Promise.prototype)) {\n throw new SandboxCapabilityError('Async/await not permitted');\n }\n let func;\n if (name === undefined) {\n func = async (...args: unknown[]) => {\n const vars = generateArgs(argNames, args);\n const res = await executeTreeAsync(\n ticks,\n context,\n parsed,\n scope === undefined ? [] : [new Scope(scope, vars)],\n undefined,\n internal,\n );\n return res.result;\n };\n } else {\n func = async function sandboxedObject(this: Unknown, ...args: unknown[]) {\n const vars = generateArgs(argNames, args);\n const res = await executeTreeAsync(\n ticks,\n context,\n parsed,\n scope === undefined ? [] : [new Scope(scope, vars, this)],\n undefined,\n internal,\n );\n return res.result;\n };\n }\n context.registerSandboxFunction(func);\n context.ctx.sandboxedFunctions.add(func);\n return func;\n}\n\n// Sentinel class used to communicate yield values from the executor back to the generator.\nexport class YieldValue {\n constructor(\n public value: unknown,\n public delegate: boolean,\n ) {}\n}\n\n// Unique sentinel thrown by captureYieldFn in executeGenBody's default case when a new\n// synchronous yield is encountered. Propagates through the call stack back to the restart loop.\nconst syncYieldPauseSentinel = Symbol('syncYieldPause');\n\nfunction asIterableIterator(value: unknown): Iterator<unknown> & Iterable<unknown> {\n const iterator =\n (value as { [Symbol.iterator]?: () => Iterator<unknown> })?.[Symbol.iterator]?.() ??\n (value as Iterator<unknown>);\n\n if (!iterator || typeof iterator.next !== 'function') {\n throw new TypeError('yield* target is not iterable');\n }\n\n if (typeof (iterator as Iterator<unknown> & Iterable<unknown>)[Symbol.iterator] === 'function') {\n return iterator as Iterator<unknown> & Iterable<unknown>;\n }\n\n return {\n next: iterator.next.bind(iterator),\n throw: iterator.throw?.bind(iterator),\n return: iterator.return?.bind(iterator),\n [Symbol.iterator]() {\n return this;\n },\n };\n}\n\nfunction asAsyncIterableIterator(value: unknown): AsyncIterator<unknown> & AsyncIterable<unknown> {\n const asyncIterator = (value as { [Symbol.asyncIterator]?: () => AsyncIterator<unknown> })?.[\n Symbol.asyncIterator\n ]?.();\n\n if (asyncIterator) {\n return {\n next: asyncIterator.next.bind(asyncIterator),\n throw: asyncIterator.throw?.bind(asyncIterator),\n return: asyncIterator.return?.bind(asyncIterator),\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n }\n\n const iterator = asIterableIterator(value);\n return {\n async next(nextValue?: unknown) {\n return iterator.next(nextValue);\n },\n async throw(err?: unknown) {\n if (typeof iterator.throw === 'function') {\n return iterator.throw(err);\n }\n throw err;\n },\n async return(valueToReturn?: unknown) {\n if (typeof iterator.return === 'function') {\n return iterator.return(valueToReturn);\n }\n return { value: valueToReturn, done: true };\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n}\n\n// executeGenBody: a native generator that lazily executes a generator function body.\n// It handles compound control-flow nodes (statements, if, loop, try, yield) with yield*\n// recursion, and falls back to the existing execSync for all leaf expressions.\n// Only used by createGeneratorFunction — nothing else in the executor is changed.\nfunction* executeGenBody(\n ticks: Ticks,\n tree: Lisp | Lisp[],\n scope: Scope,\n context: IExecContext,\n statementLabels: ControlFlowTargets,\n internal: boolean,\n): Generator<unknown, ExecReturn<unknown> | unknown, unknown> {\n // ── Statement list ──────────────────────────────────────────────────────────\n if (!isLisp(tree as Lisp) && Array.isArray(tree)) {\n const stmts = tree as Lisp[];\n if (stmts.length === 0 || (stmts[0] as unknown) === LispType.None) {\n return new ExecReturn(context.ctx.auditReport, undefined, false);\n }\n for (const stmt of stmts) {\n const res = (yield* executeGenBody(\n ticks,\n stmt,\n scope,\n context,\n statementLabels,\n internal,\n )) as ExecReturn<unknown>;\n if (res instanceof ExecReturn && (res.returned || res.controlFlow)) return res;\n // Mirror _executeWithDoneSync: wrap the result of a return statement\n if (isLisp(stmt) && (stmt as Lisp)[0] === LispType.Return) {\n return new ExecReturn(context.ctx.auditReport, res.result, true);\n }\n }\n return new ExecReturn(context.ctx.auditReport, undefined, false);\n }\n\n const [op, a, b] = tree as Lisp;\n\n switch (op) {\n // ── yield expr ────────────────────────────────────────────────────────────\n case LispType.Yield: {\n const valResult = (yield* executeGenBody(\n ticks,\n a as Lisp,\n scope,\n context,\n statementLabels,\n internal,\n )) as ExecReturn<unknown>;\n const sanitized = sanitizeProp(valResult.result, context);\n const injected: unknown = yield sanitized; // ← real pause point\n return new ExecReturn(context.ctx.auditReport, injected, false);\n }\n\n // ── yield* expr ───────────────────────────────────────────────────────────\n case LispType.YieldDelegate: {\n const iterResult = (yield* executeGenBody(\n ticks,\n a as Lisp,\n scope,\n context,\n statementLabels,\n internal,\n )) as ExecReturn<unknown>;\n const delegatee = sanitizeProp(iterResult.result, context);\n const result: unknown = yield* asIterableIterator(delegatee);\n return new ExecReturn(context.ctx.auditReport, result, false);\n }\n\n // ── if / else ─────────────────────────────────────────────────────────────\n // LispType.If is NOT in unexecTypes — its `a` is the raw condition Lisp,\n // `b` is the raw IfCase node that evaluates to an If object with .t/.f.\n case LispType.If: {\n const condResult = (yield* executeGenBody(\n ticks,\n a as Lisp,\n scope,\n context,\n statementLabels,\n internal,\n )) as ExecReturn<unknown>;\n const ifCase = syncDone((d) =>\n execSync(ticks, b as Lisp, scope, context, d, statementLabels, internal, undefined),\n ).result as If;\n const branch = sanitizeProp(condResult.result, context) ? ifCase.t : ifCase.f;\n if (branch) {\n return (yield* executeGenBody(\n ticks,\n branch,\n scope,\n context,\n statementLabels,\n internal,\n )) as ExecReturn<unknown>;\n }\n return new ExecReturn(context.ctx.auditReport, undefined, false);\n }\n\n // ── loops (while / for / for-of / for-in / do-while) ─────────────────────\n // Mirror the sync path of the existing Loop handler (executor.ts ~1421-1475)\n // but replace `executeTree(b, ...)` with `yield*`.\n case LispType.Loop: {\n const [\n checkFirst,\n startInternal,\n getIterator,\n startStep,\n step,\n condition,\n beforeStep,\n isForAwait,\n label,\n ] = a as Lisp[];\n if ((isForAwait as unknown as LispType) === LispType.True) {\n throw new SyntaxError('for-await-of loops are only allowed inside async functions');\n }\n const loopStatementTargets = [\n ...normalizeStatementLabels(label).map((loopLabel) => createLoopTarget(loopLabel, false)),\n createLoopTarget(),\n ];\n const loopTargets = addControlFlowTargets(statementLabels, loopStatementTargets);\n const loopScope = new Scope(scope, {});\n const internalVars: Record<string, unknown> = { $$obj: undefined };\n const interalScope = new Scope(loopScope, internalVars);\n\n syncDone((d) =>\n execSync(ticks, startStep, loopScope, context, d, undefined, internal, undefined),\n );\n internalVars['$$obj'] = syncDone((d) =>\n execSync(ticks, getIterator, loopScope, context, d, undefined, internal, undefined),\n ).result;\n syncDone((d) =>\n execSync(ticks, startInternal, interalScope, context, d, undefined, internal, undefined),\n );\n\n let loop: unknown = true;\n if (checkFirst) {\n loop = syncDone((d) =>\n execSync(ticks, condition, interalScope, context, d, undefined, internal, undefined),\n ).result;\n }\n\n while (loop) {\n const iterScope = new Scope(interalScope, {});\n syncDone((d) =>\n execSync(ticks, beforeStep, iterScope, context, d, undefined, internal, undefined),\n );\n\n const res = (yield* executeGenBody(\n ticks,\n b as Lisp[],\n iterScope,\n context,\n loopTargets,\n internal,\n )) as ExecReturn<unknown>;\n\n if (res.returned) return res;\n if (res.controlFlow) {\n if (!loopStatementTargets.some((t) => matchesControlFlowTarget(res.controlFlow!, t))) {\n return res; // break/continue targeting an outer labeled loop\n }\n if (res.breakLoop) break;\n // continueLoop: fall through to step + condition check\n }\n syncDone((d) =>\n execSync(ticks, step, interalScope, context, d, undefined, internal, undefined),\n );\n loop = syncDone((d) =>\n execSync(ticks, condition, interalScope, context, d, undefined, internal, undefined),\n ).result;\n }\n return new ExecReturn(context.ctx.auditReport, undefined, false);\n }\n\n // ── try / catch / finally ─────────────────────────────────────────────────\n // Using real native try/catch/finally gives us correct gen.throw() and\n // gen.return() semantics for free (the native generator machinery handles them).\n case LispType.Try: {\n const [exception, catchBody, finallyBody] = b as [string, Lisp[], Lisp[]];\n let result!: ExecReturn<unknown>;\n let finalOverride: ExecReturn<unknown> | undefined;\n try {\n result = (yield* executeGenBody(\n ticks,\n a as Lisp[],\n scope,\n context,\n statementLabels,\n internal,\n )) as ExecReturn<unknown>;\n } catch (e) {\n if (exception && catchBody?.length > 0) {\n const catchScope = new Scope(scope, { [exception]: e });\n result = (yield* executeGenBody(\n ticks,\n catchBody,\n catchScope,\n context,\n statementLabels,\n internal,\n )) as ExecReturn<unknown>;\n } else {\n throw e;\n }\n } finally {\n if (finallyBody?.length > 0) {\n const fr = (yield* executeGenBody(\n ticks,\n finallyBody,\n scope,\n context,\n statementLabels,\n internal,\n )) as ExecReturn<unknown>;\n // finally control flow (return/break/continue) overrides everything\n if (fr.returned || fr.controlFlow) {\n finalOverride = fr;\n }\n }\n }\n if (finalOverride) return finalOverride;\n return result;\n }\n\n // ── labeled statement ─────────────────────────────────────────────────────\n case LispType.Labeled: {\n const target = createLabeledStatementTarget(normalizeStatementLabel(a as StatementLabel));\n const newTargets = addControlFlowTargets(statementLabels, target ? [target] : []);\n const res = (yield* executeGenBody(\n ticks,\n b as Lisp,\n scope,\n context,\n newTargets,\n internal,\n )) as ExecReturn<unknown>;\n if (res.controlFlow && target && matchesControlFlowTarget(res.controlFlow, target)) {\n return new ExecReturn(context.ctx.auditReport, res.result, false);\n }\n return res;\n }\n\n // ── everything else ───────────────────────────────────────────────────────\n // Arithmetic, property access, function calls, assignments, etc. are\n // delegated to execSync. However, a yield expression may be nested inside\n // a non-unexecType node (e.g. `const x = yield 1`). In that case the\n // existing sync yield handler throws syncYieldPauseSentinel. We restart\n // execSync from scratch on each such pause, skipping already-completed\n // yields by immediately calling their continuation with the stored result.\n default: {\n let completedYields = 0;\n const yieldResults: unknown[] = [];\n while (true) {\n let currentYieldIdx = 0;\n let capturedValue: unknown = undefined;\n let capturedDelegate = false;\n let yielded = false;\n const captureYieldFn = (yv: YieldValue, continueDone?: Done) => {\n if (currentYieldIdx < completedYields) {\n // This yield already happened in a prior iteration; fast-forward.\n continueDone!(undefined, yieldResults[currentYieldIdx]);\n currentYieldIdx++;\n return;\n }\n // New yield: capture the value and pause.\n capturedValue = yv.value;\n capturedDelegate = yv.delegate;\n yielded = true;\n currentYieldIdx++;\n throw syncYieldPauseSentinel;\n };\n try {\n const result = syncDone((d) =>\n execSync(\n ticks,\n tree as Lisp,\n scope,\n context,\n d,\n statementLabels,\n internal,\n captureYieldFn,\n ),\n ).result;\n if (result instanceof ExecReturn) return result;\n return new ExecReturn(context.ctx.auditReport, result, false);\n } catch (e) {\n if (!yielded || e !== syncYieldPauseSentinel) throw e;\n const resumedValue: unknown = capturedDelegate\n ? yield* asIterableIterator(capturedValue)\n : yield capturedValue;\n yieldResults.push(resumedValue);\n completedYields++;\n }\n }\n }\n }\n}\n\nexport function createGeneratorFunction(\n argNames: string[],\n parsed: Lisp[],\n ticks: Ticks,\n context: IExecContext,\n scope?: Scope,\n name?: string,\n internal = false,\n) {\n if (context.ctx.options.forbidFunctionCreation) {\n throw new SandboxCapabilityError('Function creation is forbidden');\n }\n const makeGen = (thisArg: Unknown, args: unknown[]) => {\n const vars = generateArgs(argNames, args);\n const genScope =\n scope === undefined ? new Scope(null, vars, thisArg) : new Scope(scope, vars, thisArg);\n\n const executionGen = executeGenBody(ticks, parsed, genScope, context, undefined, internal);\n let isDone = false;\n\n function drive(action: () => IteratorResult<unknown>): IteratorResult<unknown> {\n if (isDone) return { value: undefined, done: true };\n try {\n const r = action();\n if (r.done) {\n isDone = true;\n return {\n value: r.value instanceof ExecReturn ? r.value.result : r.value,\n done: true,\n };\n }\n return { value: r.value, done: false };\n } catch (e) {\n isDone = true;\n throw e;\n }\n }\n\n const iterator: Iterator<unknown> & Iterable<unknown> = {\n next(value?: unknown) {\n return drive(() => executionGen.next(value));\n },\n return(value?: unknown) {\n return drive(() => executionGen.return(value));\n },\n throw(err?: unknown) {\n return drive(() => executionGen.throw(err));\n },\n [Symbol.iterator]() {\n return this;\n },\n };\n return iterator;\n };\n const func = function sandboxedObject(this: Unknown, ...args: unknown[]) {\n return makeGen(this, args);\n };\n Object.setPrototypeOf(func, GeneratorFunction.prototype);\n context.registerSandboxFunction(func);\n context.ctx.sandboxedFunctions.add(func);\n return func;\n}\n\nexport function createAsyncGeneratorFunction(\n argNames: string[],\n parsed: Lisp[],\n ticks: Ticks,\n context: IExecContext,\n scope?: Scope,\n name?: string,\n internal = false,\n) {\n if (context.ctx.options.forbidFunctionCreation) {\n throw new SandboxCapabilityError('Function creation is forbidden');\n }\n if (!context.ctx.prototypeWhitelist?.has(Promise.prototype)) {\n throw new SandboxCapabilityError('Async/await not permitted');\n }\n const makeGen = (thisArg: Unknown, args: unknown[]) => {\n const vars = generateArgs(argNames, args);\n const genScope =\n scope === undefined ? [new Scope(null, vars, thisArg)] : [new Scope(scope, vars, thisArg)];\n return (async function* sandboxedAsyncGenerator(): AsyncGenerator<unknown, unknown, unknown> {\n const yieldQueue: Array<{ yieldValue: YieldValue; continueDone?: Done }> = [];\n let resolveYield: (() => void) | null = null;\n const yieldFn = (yv: YieldValue, continueDone?: Done) => {\n yieldQueue.push({ yieldValue: yv, continueDone });\n if (resolveYield) {\n resolveYield();\n resolveYield = null;\n }\n };\n const bodyPromise = executeTreeAsync(\n ticks,\n context,\n parsed,\n genScope,\n undefined,\n internal,\n yieldFn,\n );\n let bodyDone = false;\n let bodyResult: ExecReturn<unknown> | undefined;\n let bodyError: unknown;\n bodyPromise.then(\n (r) => {\n bodyDone = true;\n bodyResult = r;\n resolveYield?.();\n },\n (e) => {\n bodyDone = true;\n bodyError = e;\n resolveYield?.();\n },\n );\n while (true) {\n if (yieldQueue.length === 0 && !bodyDone) {\n await new Promise<void>((res) => {\n resolveYield = res;\n });\n }\n while (yieldQueue.length > 0) {\n const { yieldValue, continueDone } = yieldQueue.shift()!;\n try {\n const resumedValue = yieldValue.delegate\n ? yield* asAsyncIterableIterator(yieldValue.value)\n : yield yieldValue.value;\n continueDone?.(undefined, resumedValue);\n } catch (err) {\n continueDone?.(err);\n }\n }\n if (bodyDone) break;\n }\n if (bodyError !== undefined) throw bodyError;\n return bodyResult?.result;\n })();\n };\n const func = function sandboxedObject(this: Unknown, ...args: unknown[]) {\n return makeGen(this, args) as unknown as AsyncGenerator;\n };\n Object.setPrototypeOf(func, AsyncGeneratorFunction.prototype);\n context.registerSandboxFunction(func);\n context.ctx.sandboxedFunctions.add(func);\n return func;\n}\n\nexport function assignCheck(obj: Prop, context: IExecContext, op = 'assign') {\n if (obj.context === undefined) {\n throw new ReferenceError(`Cannot ${op} value to undefined.`);\n }\n if (obj.isConst) {\n throw new TypeError(`Assignment to constant variable.`);\n }\n if (obj.isGlobal) {\n throw new SandboxAccessError(\n `Cannot ${op} property '${obj.prop.toString()}' of a global object`,\n );\n }\n if (obj.context === null) {\n throw new TypeError('Cannot set properties of null');\n }\n if (\n typeof (obj.context as any)[obj.prop] === 'function' &&\n !hasOwnProperty(obj.context, obj.prop)\n ) {\n throw new SandboxAccessError(\n `Override prototype property '${obj.prop.toString()}' not allowed`,\n );\n }\n if (op === 'delete') {\n if (hasOwnProperty(obj.context, obj.prop)) {\n context.changeSubscriptions\n .get(obj.context)\n ?.forEach((cb) => cb({ type: 'delete', prop: obj.prop.toString() }));\n context.changeSubscriptionsGlobal\n .get(obj.context)\n ?.forEach((cb) => cb({ type: 'delete', prop: obj.prop.toString() }));\n }\n } else if (hasOwnProperty(obj.context, obj.prop)) {\n context.setSubscriptions\n .get(obj.context)\n ?.get(obj.prop.toString())\n ?.forEach((cb) =>\n cb({\n type: 'replace',\n }),\n );\n context.setSubscriptionsGlobal\n .get(obj.context)\n ?.get(obj.prop.toString())\n ?.forEach((cb) =>\n cb({\n type: 'replace',\n }),\n );\n } else {\n context.changeSubscriptions\n .get(obj.context)\n ?.forEach((cb) => cb({ type: 'create', prop: obj.prop.toString() }));\n context.changeSubscriptionsGlobal\n .get(obj.context)\n ?.forEach((cb) => cb({ type: 'create', prop: obj.prop.toString() }));\n }\n}\nexport const arrayChange = new Set([\n [].push,\n [].pop,\n [].shift,\n [].unshift,\n [].splice,\n [].reverse,\n [].sort,\n [].copyWithin,\n]);\n\nexport class KeyVal {\n constructor(\n public key: PropertyKey | SpreadObject,\n public val: unknown,\n ) {}\n}\n\nexport class SpreadObject {\n constructor(public item: { [key: string]: unknown }) {}\n}\n\nexport class SpreadArray {\n constructor(public item: unknown[]) {}\n}\n\nexport class ArrayHole {}\n\nexport class If {\n constructor(\n public t: Lisp,\n public f: Lisp,\n public label?: string,\n ) {}\n}\n\nexport const literalRegex = /(\\$\\$)*(\\$)?\\${(\\d+)}/g;\n\nexport { ops, addOps } from './opsRegistry';\nimport { ops, Execution } from './opsRegistry';\n\nexport const prorptyKeyTypes = ['string', 'number', 'symbol'];\n\nexport function isPropertyKey(val: unknown): val is PropertyKey {\n return prorptyKeyTypes.includes(typeof val);\n}\n\nexport function hasPossibleProperties(val: unknown): val is {} {\n return val !== null && val !== undefined;\n}\n\nimport './ops/index';\n\nexport function execMany(\n ticks: Ticks,\n exec: Execution,\n tree: Lisp[],\n done: Done,\n scope: Scope,\n context: IExecContext,\n statementLabels: ControlFlowTargets,\n internal: boolean,\n generatorYield: ((yv: YieldValue, done?: Done) => void) | undefined,\n) {\n if (exec === execSync) {\n _execManySync(ticks, tree, done, scope, context, statementLabels, internal, generatorYield);\n } else {\n _execManyAsync(\n ticks,\n tree,\n done,\n scope,\n context,\n statementLabels,\n internal,\n generatorYield,\n ).catch(done);\n }\n}\n\nfunction _execManySync(\n ticks: Ticks,\n tree: Lisp[],\n done: Done,\n scope: Scope,\n context: IExecContext,\n statementLabels: ControlFlowTargets,\n internal: boolean,\n generatorYield: ((yv: YieldValue, done?: Done) => void) | undefined,\n) {\n const ret: any[] = [];\n for (let i = 0; i < tree.length; i++) {\n let res = syncDone((d) =>\n execSync(ticks, tree[i], scope, context, d, statementLabels, internal, generatorYield),\n ).result;\n if (res instanceof ExecReturn && (res.returned || res.breakLoop || res.continueLoop)) {\n done(undefined, res);\n return;\n }\n if (isLisp(tree[i]) && tree[i][0] === LispType.Return) {\n done(undefined, new ExecReturn(context.ctx.auditReport, res, true));\n return;\n }\n ret.push(res);\n }\n done(undefined, ret);\n}\n\nasync function _execManyAsync(\n ticks: Ticks,\n tree: Lisp[],\n done: Done,\n scope: Scope,\n context: IExecContext,\n statementLabels: ControlFlowTargets,\n internal: boolean,\n generatorYield: ((yv: YieldValue, done?: Done) => void) | undefined,\n) {\n const ret: any[] = [];\n for (let i = 0; i < tree.length; i++) {\n let res;\n try {\n let ad: AsyncDoneRet;\n res =\n (ad = asyncDone((d) =>\n execAsync(ticks, tree[i], scope, context, d, statementLabels, internal, generatorYield),\n )).isInstant === true\n ? ad.instant\n : (await ad.p).result;\n } catch (e) {\n done(e);\n return;\n }\n if (res instanceof ExecReturn && (res.returned || res.breakLoop || res.continueLoop)) {\n done(undefined, res);\n return;\n }\n if (isLisp(tree[i]) && tree[i][0] === LispType.Return) {\n done(undefined, new ExecReturn(context.ctx.auditReport, res, true));\n return;\n }\n ret.push(res);\n }\n done(undefined, ret);\n}\n\nexport interface AsyncDoneRet {\n isInstant: boolean;\n instant: any;\n p: Promise<{ result: any }>;\n}\n\nexport function asyncDone(callback: (done: Done) => void): AsyncDoneRet {\n let isInstant = false;\n let instant: unknown;\n const p = new Promise<any>((resolve, reject) => {\n callback((...args: unknown[]) => {\n if (args.length === 1) reject(args[0]);\n else {\n isInstant = true;\n instant = args[1];\n resolve({ result: args[1] });\n }\n });\n });\n return {\n isInstant,\n instant,\n p,\n };\n}\n\nexport function syncDone(callback: (done: Done) => void): { result: any } {\n let result;\n let err: { error: unknown } | undefined;\n callback((...args: unknown[]) => {\n err = args.length === 1 ? { error: args[0] } : undefined;\n result = args[1];\n });\n if (err) throw err.error;\n return { result };\n}\n\nexport async function execAsync<T = any>(\n ticks: Ticks,\n tree: LispItem,\n scope: Scope,\n context: IExecContext,\n doneOriginal: Done<T>,\n statementLabels: ControlFlowTargets,\n internal: boolean,\n generatorYield: ((yv: YieldValue, done?: Done) => void) | undefined,\n): Promise<void> {\n let done: Done<T> = doneOriginal;\n const p = new Promise<void>((resolve) => {\n done = (...args: unknown[]) => {\n doneOriginal(...args);\n resolve();\n };\n });\n if (\n !_execNoneRecurse(\n ticks,\n tree,\n scope,\n context,\n done,\n true,\n statementLabels,\n internal,\n generatorYield,\n ) &&\n isLisp(tree)\n ) {\n let op = tree[0];\n let obj;\n try {\n let ad: AsyncDoneRet;\n obj =\n (ad = asyncDone((d) =>\n execAsync(ticks, tree[1], scope, context, d, statementLabels, internal, generatorYield),\n )).isInstant === true\n ? ad.instant\n : (await ad.p).result;\n } catch (e) {\n done(e);\n return;\n }\n let a = obj;\n try {\n a = obj instanceof Prop ? obj.get(context) : obj;\n } catch (e) {\n done(e);\n return;\n }\n if (op === LispType.PropOptional || op === LispType.CallOptional) {\n if (a === undefined || a === null) {\n done(undefined, optional);\n return;\n }\n op = op === LispType.PropOptional ? LispType.Prop : LispType.Call;\n }\n if (a === optional) {\n if (op === LispType.Prop || op === LispType.Call) {\n done(undefined, a);\n return;\n } else {\n a = undefined;\n }\n }\n // Short-circuit for nullish coalescing: if a is not null/undefined, return a without evaluating b\n if (op === LispType.NullishCoalescing && a !== undefined && a !== null) {\n done(undefined, a);\n return;\n }\n let bobj;\n try {\n let ad: AsyncDoneRet;\n bobj =\n (ad = asyncDone((d) =>\n execAsync(ticks, tree[2], scope, context, d, statementLabels, internal, generatorYield),\n )).isInstant === true\n ? ad.instant\n : (await ad.p).result;\n } catch (e) {\n done(e);\n return;\n }\n let b = bobj;\n try {\n b = bobj instanceof Prop ? bobj.get(context) : bobj;\n } catch (e) {\n done(e);\n return;\n }\n if (b === optional) {\n b = undefined;\n }\n performOp({\n op,\n exec: execAsync,\n done,\n ticks,\n a,\n b,\n obj,\n context,\n scope,\n bobj,\n statementLabels,\n internal,\n generatorYield,\n tree,\n });\n }\n await p;\n}\n\nexport function execSync<T = any>(\n ticks: Ticks,\n tree: LispItem,\n scope: Scope,\n context: IExecContext,\n done: Done<T>,\n statementLabels: ControlFlowTargets,\n internal: boolean,\n generatorYield: ((yv: YieldValue, done?: Done) => void) | undefined,\n) {\n if (\n !_execNoneRecurse(\n ticks,\n tree,\n scope,\n context,\n done,\n false,\n statementLabels,\n internal,\n generatorYield,\n ) &&\n isLisp(tree)\n ) {\n let op = tree[0];\n let obj = syncDone((d) =>\n execSync(ticks, tree[1], scope, context, d, statementLabels, internal, generatorYield),\n ).result;\n let a = obj instanceof Prop ? obj.get(context) : obj;\n if (op === LispType.PropOptional || op === LispType.CallOptional) {\n if (a === undefined || a === null) {\n done(undefined, optional);\n return;\n }\n op = op === LispType.PropOptional ? LispType.Prop : LispType.Call;\n }\n if (a === optional) {\n if (op === LispType.Prop || op === LispType.Call) {\n done(undefined, a);\n return;\n } else {\n a = undefined;\n }\n }\n // Short-circuit for nullish coalescing: if a is not null/undefined, return a without evaluating b\n if (op === LispType.NullishCoalescing && a !== undefined && a !== null) {\n done(undefined, a);\n return;\n }\n let bobj = syncDone((d) =>\n execSync(ticks, tree[2], scope, context, d, statementLabels, internal, generatorYield),\n ).result;\n let b = bobj instanceof Prop ? bobj.get(context) : bobj;\n if (b === optional) {\n b = undefined;\n }\n performOp({\n op,\n exec: execSync,\n done,\n ticks,\n a,\n b,\n obj,\n context,\n scope,\n bobj,\n statementLabels,\n internal,\n generatorYield,\n tree,\n });\n }\n}\n\ntype OpsCallbackParams<a, b, obj, bobj> = {\n op: LispType;\n exec: Execution;\n a: a;\n b: b;\n obj: obj;\n bobj: bobj;\n ticks: Ticks;\n tree: LispItem;\n scope: Scope;\n context: IExecContext;\n done: Done;\n statementLabels: ControlFlowTargets;\n internal: boolean;\n generatorYield: ((yv: YieldValue, done?: Done) => void) | undefined;\n};\n\nexport function checkHaltExpectedTicks(\n params: OpsCallbackParams<any, any, any, any>,\n expectTicks = 0n,\n): boolean {\n const sandbox = params.context.ctx.sandbox;\n const { ticks, scope, context } = params;\n if (sandbox.halted) {\n const sub = sandbox.subscribeResume(() => {\n sub.unsubscribe();\n performOp(params, false);\n });\n return true;\n } else if (ticks.tickLimit !== undefined && ticks.tickLimit <= ticks.ticks + expectTicks) {\n const error = new SandboxExecutionQuotaExceededError('Execution quota exceeded');\n if (context.ctx.options.haltOnSandboxError) {\n const sub = sandbox.subscribeResume(() => {\n sub.unsubscribe();\n performOp(params);\n });\n sandbox.haltExecution({\n type: 'error',\n error,\n ticks,\n scope,\n context,\n });\n } else {\n params.done(error);\n }\n return true;\n } else if (ticks.nextYield && ticks.ticks > ticks.nextYield) {\n const sub = sandbox.subscribeResume(() => {\n sub.unsubscribe();\n performOp(params, false);\n });\n ticks.nextYield += NON_BLOCKING_THRESHOLD;\n sandbox.haltExecution({ type: 'yield' });\n setTimeout(() => sandbox.resumeExecution());\n return true;\n }\n ticks.ticks += expectTicks;\n return false;\n}\n\nfunction performOp(params: OpsCallbackParams<any, any, any, any>, count = true) {\n const { done, op, ticks, context, scope } = params;\n if (count) {\n ticks.ticks++;\n }\n const sandbox = context.ctx.sandbox;\n\n try {\n if (checkHaltExpectedTicks(params)) {\n return;\n }\n const o = ops.get(op);\n if (o === undefined) {\n done(new SandboxExecutionTreeError('Unknown operator: ' + op));\n return;\n }\n o(params);\n } catch (err) {\n if (context.ctx.options.haltOnSandboxError && err instanceof SandboxError) {\n const sub = sandbox.subscribeResume(() => {\n sub.unsubscribe();\n done(err);\n });\n sandbox.haltExecution({\n type: 'error',\n error: err,\n ticks,\n scope,\n context,\n });\n } else {\n done(err);\n }\n }\n}\n\nconst unexecTypes = new Set([\n LispType.ArrowFunction,\n LispType.Function,\n LispType.InlineFunction,\n LispType.Loop,\n LispType.Try,\n LispType.Switch,\n LispType.IfCase,\n LispType.InlineIfCase,\n LispType.Labeled,\n LispType.Typeof,\n]);\n\nfunction _execNoneRecurse<T = any>(\n ticks: Ticks,\n tree: LispItem,\n scope: Scope,\n context: IExecContext,\n done: Done<T>,\n isAsync: boolean,\n statementLabels: ControlFlowTargets,\n internal: boolean,\n generatorYield: ((yv: YieldValue, done?: Done) => void) | undefined,\n): boolean {\n const exec = isAsync ? execAsync : execSync;\n if (tree instanceof Prop) {\n done(undefined, tree.get(context));\n } else if (tree === optional) {\n done();\n } else if (Array.isArray(tree) && !isLisp(tree)) {\n if (tree[0] === LispType.None) {\n done();\n } else {\n execMany(\n ticks,\n exec,\n tree as Lisp[],\n done,\n scope,\n context,\n statementLabels,\n internal,\n generatorYield,\n );\n }\n } else if (!isLisp(tree)) {\n done(undefined, tree);\n } else if (tree[0] === LispType.Block) {\n execMany(\n ticks,\n exec,\n tree[1] as Lisp[],\n done,\n new Scope(scope),\n context,\n statementLabels,\n internal,\n generatorYield,\n );\n } else if (tree[0] === LispType.InternalBlock) {\n execMany(\n ticks,\n exec,\n tree[1] as Lisp[],\n done,\n scope,\n context,\n statementLabels,\n true,\n generatorYield,\n );\n } else if (tree[0] === LispType.Await) {\n if (!isAsync) {\n done(new SyntaxError(\"Illegal use of 'await', must be inside async function\"));\n } else if (context.ctx.prototypeWhitelist?.has(Promise.prototype)) {\n execAsync(\n ticks,\n tree[1],\n scope,\n context,\n async (...args: unknown[]) => {\n if (args.length === 1) done(args[0]);\n else\n try {\n done(undefined, (await sanitizeProp(args[1], context)) as any);\n } catch (err) {\n done(err);\n }\n },\n statementLabels,\n internal,\n generatorYield,\n ).catch(done);\n } else {\n done(new SandboxCapabilityError('Async/await is not permitted'));\n }\n } else if (tree[0] === LispType.Yield || tree[0] === LispType.YieldDelegate) {\n const yieldFn = generatorYield;\n if (!yieldFn) {\n done(new SyntaxError(\"Illegal use of 'yield', must be inside a generator function\"));\n return true;\n }\n const isDelegate = tree[0] === LispType.YieldDelegate;\n if (isAsync) {\n execAsync(\n ticks,\n tree[1],\n scope,\n context,\n async (...args: unknown[]) => {\n if (args.length === 1) {\n done(args[0]);\n return;\n }\n try {\n const val = await sanitizeProp(args[1], context);\n yieldFn(new YieldValue(val, isDelegate), done);\n } catch (err) {\n done(err);\n }\n },\n statementLabels,\n internal,\n generatorYield,\n ).catch(done);\n } else {\n try {\n const val = syncDone((d) =>\n execSync(ticks, tree[1], scope, context, d, statementLabels, internal, generatorYield),\n ).result;\n const sanitized = sanitizeProp(val, context);\n // Pass `done` as second arg so the yieldFn can call it with the injected value.\n // For capture-mode yieldFns (executeGenBody default case), this enables the restart loop.\n // For plain yieldFns (eager mode), done? is ignored and done() is called below.\n yieldFn(new YieldValue(sanitized, isDelegate), done);\n // If yieldFn did not call done (it threw syncYieldPauseSentinel instead), we fall through\n // to the catch which re-throws the sentinel. Otherwise yieldFn called done itself.\n } catch (err) {\n if (err === syncYieldPauseSentinel) throw err; // propagate pause up to restart loop\n done(err);\n }\n }\n } else if (unexecTypes.has(tree[0])) {\n performOp({\n op: tree[0],\n exec,\n done,\n ticks,\n a: tree[1],\n b: tree[2],\n obj: tree,\n tree,\n context,\n scope,\n bobj: undefined,\n statementLabels,\n internal,\n generatorYield,\n });\n } else {\n return false;\n }\n return true;\n}\nexport function executeTree<T>(\n ticks: Ticks,\n context: IExecContext,\n executionTree: Lisp[],\n scopes: IScope[] = [],\n statementLabels: ControlFlowTargets,\n internal: boolean,\n generatorYield?: ((yv: YieldValue, done?: Done) => void) | undefined,\n): ExecReturn<T> {\n return syncDone((done) =>\n executeTreeWithDone(\n execSync,\n done,\n ticks,\n context,\n executionTree,\n scopes,\n statementLabels,\n internal,\n generatorYield,\n ),\n ).result;\n}\n\nexport async function executeTreeAsync<T>(\n ticks: Ticks,\n context: IExecContext,\n executionTree: Lisp[],\n scopes: IScope[] = [],\n statementLabels: ControlFlowTargets,\n internal: boolean,\n generatorYield?: ((yv: YieldValue, done?: Done) => void) | undefined,\n): Promise<ExecReturn<T>> {\n let ad: AsyncDoneRet;\n return (ad = asyncDone((done) =>\n executeTreeWithDone(\n execAsync,\n done,\n ticks,\n context,\n executionTree,\n scopes,\n statementLabels,\n internal,\n generatorYield,\n ),\n )).isInstant === true\n ? ad.instant\n : (await ad.p).result;\n}\n\nexport function executeTreeWithDone(\n exec: Execution,\n done: Done,\n ticks: Ticks,\n context: IExecContext,\n executionTree: Lisp[],\n scopes: IScope[] = [],\n statementLabels: ControlFlowTargets,\n internal: boolean,\n generatorYield?: ((yv: YieldValue, done?: Done) => void) | undefined,\n) {\n if (!executionTree) {\n done();\n return;\n }\n if (!(executionTree instanceof Array)) {\n throw new SyntaxError('Bad execution tree');\n }\n let scope = context.ctx.globalScope;\n let s;\n while ((s = scopes.shift())) {\n if (typeof s !== 'object') continue;\n if (s instanceof Scope) {\n scope = s;\n } else {\n scope = new Scope(scope, s, s instanceof LocalScope ? undefined : null);\n }\n }\n if (context.ctx.options.audit && !context.ctx.auditReport) {\n context.ctx.auditReport = {\n globalsAccess: new Set(),\n prototypeAccess: {},\n };\n }\n if (exec === execSync) {\n _executeWithDoneSync(\n done,\n ticks,\n context,\n executionTree,\n scope,\n statementLabels,\n internal,\n generatorYield,\n );\n } else {\n _executeWithDoneAsync(\n done,\n ticks,\n context,\n executionTree,\n scope,\n statementLabels,\n internal,\n generatorYield,\n ).catch(done);\n }\n}\n\nfunction _executeWithDoneSync(\n done: Done,\n ticks: Ticks,\n context: IExecContext,\n executionTree: Lisp[],\n scope: Scope,\n statementLabels: ControlFlowTargets,\n internal: boolean,\n generatorYield: ((yv: YieldValue, done?: Done) => void) | undefined,\n) {\n if (!(executionTree instanceof Array)) throw new SyntaxError('Bad execution tree');\n let i = 0;\n for (i = 0; i < executionTree.length; i++) {\n let res: unknown;\n let err: { error: unknown } | undefined;\n const current = executionTree[i];\n try {\n execSync(\n ticks,\n current,\n scope,\n context,\n (...args: unknown[]) => {\n if (args.length === 1) err = { error: args[0] };\n else res = args[1];\n },\n statementLabels,\n internal,\n generatorYield,\n );\n } catch (e) {\n err = { error: e };\n }\n if (err) {\n done(err.error);\n return;\n }\n if (res instanceof ExecReturn) {\n done(undefined, res);\n return;\n }\n if (isLisp(current) && current[0] === LispType.Return) {\n done(undefined, new ExecReturn(context.ctx.auditReport, res, true));\n return;\n }\n }\n done(undefined, new ExecReturn(context.ctx.auditReport, undefined, false));\n}\n\nasync function _executeWithDoneAsync(\n done: Done,\n ticks: Ticks,\n context: IExecContext,\n executionTree: Lisp[],\n scope: Scope,\n statementLabels: ControlFlowTargets,\n internal: boolean,\n generatorYield: ((yv: YieldValue, done?: Done) => void) | undefined,\n) {\n if (!(executionTree instanceof Array)) throw new SyntaxError('Bad execution tree');\n let i = 0;\n for (i = 0; i < executionTree.length; i++) {\n let res: unknown;\n let err: { error: unknown } | undefined;\n const current = executionTree[i];\n try {\n await execAsync(\n ticks,\n current,\n scope,\n context,\n (...args: unknown[]) => {\n if (args.length === 1) err = { error: args[0] };\n else res = args[1];\n },\n statementLabels,\n internal,\n generatorYield,\n );\n } catch (e) {\n err = { error: e };\n }\n if (err) {\n done(err.error);\n return;\n }\n if (res instanceof ExecReturn) {\n done(undefined, res);\n return;\n }\n if (isLisp(current) && current[0] === LispType.Return) {\n done(undefined, new ExecReturn(context.ctx.auditReport, res, true));\n return;\n }\n }\n done(undefined, new ExecReturn(context.ctx.auditReport, undefined, false));\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from './executorUtils';
@@ -0,0 +1,2 @@
1
+ import "./opsRegistry.js";
2
+ import "./executorUtils.js";
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,90 @@
1
+ import { LispType } from "../../utils/types.js";
2
+ import "../../utils/index.js";
3
+ import { addOps } from "../opsRegistry.js";
4
+ import { assignCheck, checkHaltExpectedTicks } from "../executorUtils.js";
5
+ //#region src/executor/ops/assignment.ts
6
+ addOps(LispType.Assign, (params) => {
7
+ const { done, b, obj, context, scope, bobj, internal } = params;
8
+ assignCheck(obj, context);
9
+ obj.isGlobal = bobj?.isGlobal || false;
10
+ if (obj.isVariable) {
11
+ const s = scope.getWhereValScope(obj.prop, obj.prop === "this", internal);
12
+ if (s === null) throw new ReferenceError(`Cannot assign to undeclared variable '${obj.prop.toString()}'`);
13
+ s.set(obj.prop, b, internal);
14
+ if (obj.isGlobal) s.globals[obj.prop.toString()] = true;
15
+ else delete s.globals[obj.prop.toString()];
16
+ done(void 0, b);
17
+ return;
18
+ }
19
+ if (obj.prop === "length" && Array.isArray(obj.context) && typeof b === "number") {
20
+ const delta = BigInt(Math.abs(b - obj.context.length));
21
+ if (delta > 0n && checkHaltExpectedTicks(params, delta)) return;
22
+ }
23
+ done(void 0, obj.context[obj.prop] = b);
24
+ });
25
+ addOps(LispType.AddEquals, (params) => {
26
+ const { done, b, obj, context } = params;
27
+ assignCheck(obj, context);
28
+ const result = obj.context[obj.prop] + b;
29
+ if (typeof result === "string" && checkHaltExpectedTicks(params, BigInt(result.length))) return;
30
+ done(void 0, obj.context[obj.prop] = result);
31
+ });
32
+ addOps(LispType.SubractEquals, ({ done, b, obj, context }) => {
33
+ assignCheck(obj, context);
34
+ done(void 0, obj.context[obj.prop] -= b);
35
+ });
36
+ addOps(LispType.DivideEquals, ({ done, b, obj, context }) => {
37
+ assignCheck(obj, context);
38
+ done(void 0, obj.context[obj.prop] /= b);
39
+ });
40
+ addOps(LispType.MultiplyEquals, ({ done, b, obj, context }) => {
41
+ assignCheck(obj, context);
42
+ done(void 0, obj.context[obj.prop] *= b);
43
+ });
44
+ addOps(LispType.PowerEquals, ({ done, b, obj, context }) => {
45
+ assignCheck(obj, context);
46
+ done(void 0, obj.context[obj.prop] **= b);
47
+ });
48
+ addOps(LispType.ModulusEquals, ({ done, b, obj, context }) => {
49
+ assignCheck(obj, context);
50
+ done(void 0, obj.context[obj.prop] %= b);
51
+ });
52
+ addOps(LispType.BitNegateEquals, ({ done, b, obj, context }) => {
53
+ assignCheck(obj, context);
54
+ done(void 0, obj.context[obj.prop] ^= b);
55
+ });
56
+ addOps(LispType.BitAndEquals, ({ done, b, obj, context }) => {
57
+ assignCheck(obj, context);
58
+ done(void 0, obj.context[obj.prop] &= b);
59
+ });
60
+ addOps(LispType.BitOrEquals, ({ done, b, obj, context }) => {
61
+ assignCheck(obj, context);
62
+ done(void 0, obj.context[obj.prop] |= b);
63
+ });
64
+ addOps(LispType.ShiftLeftEquals, ({ done, b, obj, context }) => {
65
+ assignCheck(obj, context);
66
+ done(void 0, obj.context[obj.prop] <<= b);
67
+ });
68
+ addOps(LispType.ShiftRightEquals, ({ done, b, obj, context }) => {
69
+ assignCheck(obj, context);
70
+ done(void 0, obj.context[obj.prop] >>= b);
71
+ });
72
+ addOps(LispType.UnsignedShiftRightEquals, ({ done, b, obj, context }) => {
73
+ assignCheck(obj, context);
74
+ done(void 0, obj.context[obj.prop] >>>= b);
75
+ });
76
+ addOps(LispType.AndEquals, ({ done, b, obj, context }) => {
77
+ assignCheck(obj, context);
78
+ done(void 0, obj.context[obj.prop] &&= b);
79
+ });
80
+ addOps(LispType.OrEquals, ({ done, b, obj, context }) => {
81
+ assignCheck(obj, context);
82
+ done(void 0, obj.context[obj.prop] ||= b);
83
+ });
84
+ addOps(LispType.NullishCoalescingEquals, ({ done, b, obj, context }) => {
85
+ assignCheck(obj, context);
86
+ done(void 0, obj.context[obj.prop] ??= b);
87
+ });
88
+ //#endregion
89
+
90
+ //# sourceMappingURL=assignment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assignment.js","names":[],"sources":["../../../../src/executor/ops/assignment.ts"],"sourcesContent":["import { addOps, assignCheck, checkHaltExpectedTicks } from '../executorUtils';\nimport { LispType, Prop } from '../../utils';\n\naddOps<unknown, unknown, Prop<any>, Prop<any>>(LispType.Assign, (params) => {\n const { done, b, obj, context, scope, bobj, internal } = params;\n assignCheck(obj, context);\n obj.isGlobal = bobj?.isGlobal || false;\n if (obj.isVariable) {\n const s = scope.getWhereValScope(obj.prop as string, obj.prop === 'this', internal);\n if (s === null) {\n throw new ReferenceError(`Cannot assign to undeclared variable '${obj.prop.toString()}'`);\n }\n s.set(obj.prop as string, b, internal);\n if (obj.isGlobal) {\n s.globals[obj.prop.toString()] = true;\n } else {\n delete s.globals[obj.prop.toString()];\n }\n done(undefined, b);\n return;\n }\n if (obj.prop === 'length' && Array.isArray(obj.context) && typeof b === 'number') {\n const delta = BigInt(Math.abs(b - obj.context.length));\n if (delta > 0n && checkHaltExpectedTicks(params, delta)) return;\n }\n done(undefined, (obj.context[obj.prop] = b));\n});\n\naddOps<unknown, unknown, Prop<any>>(LispType.AddEquals, (params) => {\n const { done, b, obj, context } = params;\n assignCheck(obj, context);\n const result = (obj.context[obj.prop] as any) + (b as any);\n if (typeof result === 'string' && checkHaltExpectedTicks(params, BigInt(result.length))) return;\n done(undefined, (obj.context[obj.prop] = result));\n});\n\naddOps<unknown, number, Prop<any>>(LispType.SubractEquals, ({ done, b, obj, context }) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] -= b));\n});\n\naddOps<unknown, number, Prop<any>>(LispType.DivideEquals, ({ done, b, obj, context }) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] /= b));\n});\n\naddOps<unknown, number, Prop<any>>(LispType.MultiplyEquals, ({ done, b, obj, context }) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] *= b));\n});\n\naddOps<unknown, number, Prop<any>>(LispType.PowerEquals, ({ done, b, obj, context }) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] **= b));\n});\n\naddOps<unknown, number, Prop<any>>(LispType.ModulusEquals, ({ done, b, obj, context }) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] %= b));\n});\n\naddOps<unknown, number, Prop<any>>(LispType.BitNegateEquals, ({ done, b, obj, context }) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] ^= b));\n});\n\naddOps<unknown, number, Prop<any>>(LispType.BitAndEquals, ({ done, b, obj, context }) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] &= b));\n});\n\naddOps<unknown, number, Prop<any>>(LispType.BitOrEquals, ({ done, b, obj, context }) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] |= b));\n});\n\naddOps<unknown, number, Prop<any>>(LispType.ShiftLeftEquals, ({ done, b, obj, context }) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] <<= b));\n});\n\naddOps<unknown, number, Prop<any>>(LispType.ShiftRightEquals, ({ done, b, obj, context }) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] >>= b));\n});\n\naddOps<unknown, number, Prop<any>>(\n LispType.UnsignedShiftRightEquals,\n ({ done, b, obj, context }) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] >>>= b));\n },\n);\n\naddOps<unknown, unknown, Prop<any>>(LispType.AndEquals, ({ done, b, obj, context }) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] &&= b));\n});\n\naddOps<unknown, unknown, Prop<any>>(LispType.OrEquals, ({ done, b, obj, context }) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] ||= b));\n});\n\naddOps<unknown, unknown, Prop<any>>(\n LispType.NullishCoalescingEquals,\n ({ done, b, obj, context }) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] ??= b));\n },\n);\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,162 @@
1
+ import { SandboxAccessError, SandboxCapabilityError } from "../../utils/errors.js";
2
+ import { LispType } from "../../utils/types.js";
3
+ import { checkTicksAndThrow, typedArrayProtos } from "../../utils/functionReplacements.js";
4
+ import { getReplacementReceiver } from "../../utils/Prop.js";
5
+ import { DelayedSynchronousResult, sanitizeProp } from "../../utils/Scope.js";
6
+ import "../../utils/index.js";
7
+ import { addOps } from "../opsRegistry.js";
8
+ import { SpreadArray, arrayChange, checkHaltExpectedTicks } from "../executorUtils.js";
9
+ //#region src/executor/ops/call.ts
10
+ addOps(LispType.Call, (params) => {
11
+ const { done, a, b, obj, context } = params;
12
+ if (context.ctx.options.forbidFunctionCalls) throw new SandboxCapabilityError("Function invocations are not allowed");
13
+ if (typeof a !== "function") throw new TypeError(`${typeof obj?.prop === "symbol" ? "Symbol" : obj?.prop} is not a function`);
14
+ const vals = new Array(b.length);
15
+ let valsLen = 0;
16
+ for (let i = 0; i < b.length; i++) {
17
+ const item = b[i];
18
+ if (item instanceof SpreadArray) {
19
+ const expanded = Array.isArray(item.item) ? item.item : [...item.item];
20
+ if (checkHaltExpectedTicks(params, BigInt(expanded.length))) return;
21
+ for (let j = 0; j < expanded.length; j++) vals[valsLen++] = sanitizeProp(expanded[j], context);
22
+ } else vals[valsLen++] = sanitizeProp(item, context);
23
+ }
24
+ vals.length = valsLen;
25
+ if (a === String) {
26
+ const result = String(vals[0]);
27
+ checkTicksAndThrow(context, BigInt(result.length));
28
+ done(void 0, result);
29
+ return;
30
+ }
31
+ if (typeof obj === "function") {
32
+ const evl = context.evals.get(obj);
33
+ const receiver = getReplacementReceiver(obj);
34
+ let ret = evl ? evl(obj, ...vals) : receiver === void 0 ? obj(...vals) : obj.call(receiver, ...vals);
35
+ ret = sanitizeProp(ret, context);
36
+ if (ret !== null && typeof ret === "object" && ret instanceof DelayedSynchronousResult) Promise.resolve(ret.result).then((res) => done(void 0, res), (err) => done(err));
37
+ else done(void 0, ret);
38
+ return;
39
+ }
40
+ const originalFn = obj.context[obj.prop];
41
+ if (originalFn === JSON.stringify && context.getSubscriptions.size) {
42
+ const cache = /* @__PURE__ */ new WeakSet();
43
+ let ticks = 0n;
44
+ const recurse = (x) => {
45
+ if (!x || !(typeof x === "object") || cache.has(x)) return;
46
+ cache.add(x);
47
+ const keys = Object.keys(x);
48
+ ticks += BigInt(keys.length);
49
+ for (const y of keys) {
50
+ context.getSubscriptions.forEach((cb) => cb(x, y));
51
+ recurse(x[y]);
52
+ }
53
+ };
54
+ recurse(vals[0]);
55
+ checkTicksAndThrow(context, ticks);
56
+ }
57
+ if (obj.context instanceof Array && arrayChange.has(originalFn) && (context.changeSubscriptions.get(obj.context) || context.changeSubscriptionsGlobal.get(obj.context))) {
58
+ let change = void 0;
59
+ let changed = false;
60
+ if (obj.prop === "push") {
61
+ change = {
62
+ type: "push",
63
+ added: vals
64
+ };
65
+ changed = !!vals.length;
66
+ } else if (obj.prop === "pop") {
67
+ change = {
68
+ type: "pop",
69
+ removed: obj.context.slice(-1)
70
+ };
71
+ changed = !!change.removed.length;
72
+ } else if (obj.prop === "shift") {
73
+ change = {
74
+ type: "shift",
75
+ removed: obj.context.slice(0, 1)
76
+ };
77
+ changed = !!change.removed.length;
78
+ } else if (obj.prop === "unshift") {
79
+ change = {
80
+ type: "unshift",
81
+ added: vals
82
+ };
83
+ changed = !!vals.length;
84
+ } else if (obj.prop === "splice") {
85
+ change = {
86
+ type: "splice",
87
+ startIndex: vals[0],
88
+ deleteCount: vals[1] === void 0 ? obj.context.length : vals[1],
89
+ added: vals.slice(2),
90
+ removed: obj.context.slice(vals[0], vals[1] === void 0 ? void 0 : vals[0] + vals[1])
91
+ };
92
+ changed = !!change.added.length || !!change.removed.length;
93
+ } else if (obj.prop === "reverse" || obj.prop === "sort") {
94
+ change = { type: obj.prop };
95
+ changed = !!obj.context.length;
96
+ } else if (obj.prop === "copyWithin") {
97
+ const len = vals[2] === void 0 ? obj.context.length - vals[1] : Math.min(obj.context.length, vals[2] - vals[1]);
98
+ change = {
99
+ type: "copyWithin",
100
+ startIndex: vals[0],
101
+ endIndex: vals[0] + len,
102
+ added: obj.context.slice(vals[1], vals[1] + len),
103
+ removed: obj.context.slice(vals[0], vals[0] + len)
104
+ };
105
+ changed = !!change.added.length || !!change.removed.length;
106
+ }
107
+ if (changed) {
108
+ const subs = context.changeSubscriptions.get(obj.context);
109
+ if (subs !== void 0) for (const cb of subs) cb(change);
110
+ const subsG = context.changeSubscriptionsGlobal.get(obj.context);
111
+ if (subsG !== void 0) for (const cb of subsG) cb(change);
112
+ }
113
+ }
114
+ obj.get(context);
115
+ const evl = context.evals.get(originalFn);
116
+ const receiver = getReplacementReceiver(originalFn);
117
+ const thisArg = obj.isVariable && receiver !== void 0 ? receiver : obj.context;
118
+ let ret = evl ? evl.call(thisArg, ...vals) : a.call(thisArg, ...vals);
119
+ ret = sanitizeProp(ret, context);
120
+ if (ret !== null && typeof ret === "object" && ret instanceof DelayedSynchronousResult) Promise.resolve(ret.result).then((res) => done(void 0, res), (err) => done(err));
121
+ else done(void 0, ret);
122
+ });
123
+ addOps(LispType.New, (params) => {
124
+ const { done, a, b, context } = params;
125
+ if (!context.ctx.globalsWhitelist.has(a) && !context.ctx.sandboxedFunctions.has(a)) throw new SandboxAccessError(`Object construction not allowed: ${a.constructor.name}`);
126
+ const vals = b.map((item) => sanitizeProp(item, context));
127
+ const replacement = context.evals.get(a);
128
+ if (replacement) {
129
+ done(void 0, new replacement(...vals));
130
+ return;
131
+ }
132
+ const expectedTicks = getNewTicks(a, vals);
133
+ if (expectedTicks > 0n && checkHaltExpectedTicks(params, expectedTicks)) return;
134
+ done(void 0, new a(...vals));
135
+ });
136
+ function getNewTicks(ctor, args) {
137
+ if (ctor === Array) {
138
+ const n = args[0];
139
+ if (typeof n === "number" && args.length === 1) return BigInt(n);
140
+ return BigInt(args.length);
141
+ }
142
+ if (typedArrayProtos.has(Object.getPrototypeOf(ctor.prototype))) {
143
+ const n = args[0];
144
+ if (typeof n === "number") return BigInt(n);
145
+ if (Array.isArray(n) || ArrayBuffer.isView(n)) return BigInt(n.length);
146
+ return 0n;
147
+ }
148
+ if (ctor === Map || ctor === Set) {
149
+ const iterable = args[0];
150
+ if (Array.isArray(iterable)) return BigInt(iterable.length);
151
+ return 0n;
152
+ }
153
+ if (ctor === String || ctor === RegExp) {
154
+ const s = args[0];
155
+ if (typeof s === "string") return BigInt(s.length);
156
+ return 0n;
157
+ }
158
+ return 0n;
159
+ }
160
+ //#endregion
161
+
162
+ //# sourceMappingURL=call.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call.js","names":[],"sources":["../../../../src/executor/ops/call.ts"],"sourcesContent":["import { addOps, arrayChange, Change, checkHaltExpectedTicks, SpreadArray } from '../executorUtils';\nimport {\n checkTicksAndThrow,\n typedArrayProtos as _typedArrayProtos,\n} from '../../utils/functionReplacements';\nimport type { Lisp } from '../../parser';\nimport {\n DelayedSynchronousResult,\n getReplacementReceiver,\n LispType,\n SandboxAccessError,\n SandboxCapabilityError,\n sanitizeProp,\n} from '../../utils';\n\naddOps<unknown, Lisp[], any>(LispType.Call, (params) => {\n const { done, a, b, obj, context } = params;\n if (context.ctx.options.forbidFunctionCalls)\n throw new SandboxCapabilityError('Function invocations are not allowed');\n if (typeof a !== 'function') {\n throw new TypeError(\n `${typeof obj?.prop === 'symbol' ? 'Symbol' : obj?.prop} is not a function`,\n );\n }\n const vals = new Array<unknown>(b.length);\n let valsLen = 0;\n for (let i = 0; i < b.length; i++) {\n const item = b[i];\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 (let j = 0; j < expanded.length; j++)\n vals[valsLen++] = sanitizeProp(expanded[j], context);\n } else {\n vals[valsLen++] = sanitizeProp(item, context);\n }\n }\n vals.length = valsLen;\n\n if (a === String) {\n const result = String(vals[0]);\n checkTicksAndThrow(context, BigInt(result.length));\n done(undefined, result);\n return;\n }\n\n if (typeof obj === 'function') {\n // Direct function call (not a method): obj is the function itself\n const evl = context.evals.get(obj);\n const receiver = getReplacementReceiver(obj);\n let ret = evl\n ? evl(obj, ...vals)\n : receiver === undefined\n ? obj(...vals)\n : obj.call(receiver, ...vals);\n ret = sanitizeProp(ret, context);\n if (ret !== null && typeof ret === 'object' && ret instanceof DelayedSynchronousResult) {\n Promise.resolve(ret.result).then(\n (res) => done(undefined, res),\n (err) => done(err),\n );\n } else {\n done(undefined, ret);\n }\n return;\n }\n\n // Method call: obj is a Prop. `a` is already the replacement (from Prop.get()).\n // The original function is still accessible via obj.context[obj.prop] for subscription checks.\n const originalFn: unknown = obj.context[obj.prop];\n\n if (originalFn === JSON.stringify && context.getSubscriptions.size) {\n const cache = new WeakSet<any>();\n let ticks = 0n;\n const recurse = (x: unknown) => {\n if (!x || !(typeof x === 'object') || cache.has(x)) return;\n cache.add(x);\n const keys = Object.keys(x) as (keyof typeof x)[];\n ticks += BigInt(keys.length);\n for (const y of keys) {\n context.getSubscriptions.forEach((cb) => cb(x, y));\n recurse(x[y]);\n }\n };\n recurse(vals[0]);\n checkTicksAndThrow(context, ticks);\n }\n\n if (\n obj.context instanceof Array &&\n arrayChange.has(originalFn as any) &&\n (context.changeSubscriptions.get(obj.context) ||\n context.changeSubscriptionsGlobal.get(obj.context))\n ) {\n let change: Change = undefined!;\n let changed = false;\n if (obj.prop === 'push') {\n change = { type: 'push', added: vals };\n changed = !!vals.length;\n } else if (obj.prop === 'pop') {\n change = { type: 'pop', removed: obj.context.slice(-1) };\n changed = !!change.removed.length;\n } else if (obj.prop === 'shift') {\n change = { type: 'shift', removed: obj.context.slice(0, 1) };\n changed = !!change.removed.length;\n } else if (obj.prop === 'unshift') {\n change = { type: 'unshift', added: vals };\n changed = !!vals.length;\n } else if (obj.prop === 'splice') {\n change = {\n type: 'splice',\n startIndex: vals[0] as number,\n deleteCount: vals[1] === undefined ? obj.context.length : vals[1],\n added: vals.slice(2),\n removed: obj.context.slice(\n vals[0],\n vals[1] === undefined ? undefined : (vals[0] as number) + (vals[1] as number),\n ),\n };\n changed = !!change.added.length || !!change.removed.length;\n } else if (obj.prop === 'reverse' || obj.prop === 'sort') {\n change = { type: obj.prop };\n changed = !!obj.context.length;\n } else if (obj.prop === 'copyWithin') {\n const len =\n vals[2] === undefined\n ? obj.context.length - (vals[1] as number)\n : Math.min(obj.context.length, (vals[2] as number) - (vals[1] as number));\n change = {\n type: 'copyWithin',\n startIndex: vals[0] as number,\n endIndex: (vals[0] as number) + len,\n added: obj.context.slice(vals[1] as number, (vals[1] as number) + len),\n removed: obj.context.slice(vals[0] as number, (vals[0] as number) + len),\n };\n changed = !!change.added.length || !!change.removed.length;\n }\n if (changed) {\n const subs = context.changeSubscriptions.get(obj.context);\n if (subs !== undefined) for (const cb of subs) cb(change);\n const subsG = context.changeSubscriptionsGlobal.get(obj.context);\n if (subsG !== undefined) for (const cb of subsG) cb(change);\n }\n }\n\n // Trigger get-subscriptions, then call via `a` (which may be a replacement from evals).\n // Sandboxed wrappers for globals (Function, eval, etc.) must be called without `this`;\n // tick-checking replacements must be called with `this`.\n obj.get(context);\n const evl = context.evals.get(originalFn as Function);\n const receiver = getReplacementReceiver(originalFn as Function);\n const thisArg = obj.isVariable && receiver !== undefined ? receiver : obj.context;\n let ret = evl ? evl.call(thisArg, ...vals) : (a as Function).call(thisArg, ...vals);\n ret = sanitizeProp(ret, context);\n if (ret !== null && typeof ret === 'object' && ret instanceof DelayedSynchronousResult) {\n Promise.resolve(ret.result).then(\n (res) => done(undefined, res),\n (err) => done(err),\n );\n } else {\n done(undefined, ret);\n }\n});\n\naddOps<new (...args: unknown[]) => void, unknown[]>(LispType.New, (params) => {\n const { done, a, b, context } = params;\n if (!context.ctx.globalsWhitelist.has(a) && !context.ctx.sandboxedFunctions.has(a)) {\n throw new SandboxAccessError(`Object construction not allowed: ${a.constructor.name}`);\n }\n const vals = b.map((item) => sanitizeProp(item, context));\n const replacement = context.evals.get(a);\n if (replacement) {\n const ret = new (replacement as new (...args: unknown[]) => unknown)(...vals);\n done(undefined, ret);\n return;\n }\n const expectedTicks = getNewTicks(a, vals);\n if (expectedTicks > 0n && checkHaltExpectedTicks(params, expectedTicks)) return;\n const ret = new a(...vals);\n done(undefined, ret);\n});\n\nfunction getNewTicks(ctor: Function, args: unknown[]): bigint {\n // new Array(n) or new TypedArray(n) — allocates n elements\n if (ctor === Array) {\n const n = args[0];\n if (typeof n === 'number' && args.length === 1) return BigInt(n);\n return BigInt(args.length);\n }\n if (_typedArrayProtos.has(Object.getPrototypeOf(ctor.prototype))) {\n const n = args[0];\n if (typeof n === 'number') return BigInt(n);\n if (Array.isArray(n) || ArrayBuffer.isView(n)) return BigInt((n as ArrayLike<unknown>).length);\n return 0n;\n }\n // new Map(iterable) or new Set(iterable) — O(n) of iterable length\n if (ctor === Map || ctor === Set) {\n const iterable = args[0];\n if (Array.isArray(iterable)) return BigInt(iterable.length);\n return 0n;\n }\n // new String(s) or new RegExp(pattern) — O(n) of string length\n if (ctor === String || ctor === RegExp) {\n const s = args[0];\n if (typeof s === 'string') return BigInt(s.length);\n return 0n;\n }\n return 0n;\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,38 @@
1
+ import { LispType } from "../../utils/types.js";
2
+ import "../../utils/index.js";
3
+ import { addOps } from "../opsRegistry.js";
4
+ import { checkHaltExpectedTicks } from "../executorUtils.js";
5
+ //#region src/executor/ops/comparison.ts
6
+ addOps(LispType.LargerThan, ({ done, a, b }) => done(void 0, a > b));
7
+ addOps(LispType.SmallerThan, ({ done, a, b }) => done(void 0, a < b));
8
+ addOps(LispType.LargerEqualThan, ({ done, a, b }) => done(void 0, a >= b));
9
+ addOps(LispType.SmallerEqualThan, ({ done, a, b }) => done(void 0, a <= b));
10
+ addOps(LispType.Equal, ({ done, a, b }) => done(void 0, a == b));
11
+ addOps(LispType.StrictEqual, ({ done, a, b }) => done(void 0, a === b));
12
+ addOps(LispType.NotEqual, ({ done, a, b }) => done(void 0, a != b));
13
+ addOps(LispType.StrictNotEqual, ({ done, a, b }) => done(void 0, a !== b));
14
+ addOps(LispType.And, ({ done, a, b }) => done(void 0, a && b));
15
+ addOps(LispType.Or, ({ done, a, b }) => done(void 0, a || b));
16
+ addOps(LispType.NullishCoalescing, ({ done, a, b }) => done(void 0, a ?? b));
17
+ addOps(LispType.BitAnd, ({ done, a, b }) => done(void 0, a & b));
18
+ addOps(LispType.BitOr, ({ done, a, b }) => done(void 0, a | b));
19
+ addOps(LispType.Plus, (params) => {
20
+ const { done, a, b } = params;
21
+ const result = a + b;
22
+ if (typeof result === "string" && checkHaltExpectedTicks(params, BigInt(result.length))) return;
23
+ done(void 0, result);
24
+ });
25
+ addOps(LispType.Minus, ({ done, a, b }) => done(void 0, a - b));
26
+ addOps(LispType.Divide, ({ done, a, b }) => done(void 0, a / b));
27
+ addOps(LispType.Power, ({ done, a, b }) => done(void 0, a ** b));
28
+ addOps(LispType.BitNegate, ({ done, a, b }) => done(void 0, a ^ b));
29
+ addOps(LispType.Multiply, ({ done, a, b }) => done(void 0, a * b));
30
+ addOps(LispType.Modulus, ({ done, a, b }) => done(void 0, a % b));
31
+ addOps(LispType.BitShiftLeft, ({ done, a, b }) => done(void 0, a << b));
32
+ addOps(LispType.BitShiftRight, ({ done, a, b }) => done(void 0, a >> b));
33
+ addOps(LispType.BitUnsignedShiftRight, ({ done, a, b }) => done(void 0, a >>> b));
34
+ addOps(LispType.Instanceof, ({ done, a, b }) => done(void 0, a instanceof b));
35
+ addOps(LispType.In, ({ done, a, b }) => done(void 0, a in b));
36
+ //#endregion
37
+
38
+ //# sourceMappingURL=comparison.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparison.js","names":[],"sources":["../../../../src/executor/ops/comparison.ts"],"sourcesContent":["import { addOps, checkHaltExpectedTicks } from '../executorUtils';\nimport { LispType } from '../../utils';\n\naddOps<number, number>(LispType.LargerThan, ({ done, a, b }) => done(undefined, a > b));\n\naddOps<number, number>(LispType.SmallerThan, ({ done, a, b }) => done(undefined, a < b));\n\naddOps<number, number>(LispType.LargerEqualThan, ({ done, a, b }) => done(undefined, a >= b));\n\naddOps<number, number>(LispType.SmallerEqualThan, ({ done, a, b }) => done(undefined, a <= b));\n\naddOps<number, number>(LispType.Equal, ({ done, a, b }) => done(undefined, a == b));\n\naddOps<number, number>(LispType.StrictEqual, ({ done, a, b }) => done(undefined, a === b));\n\naddOps<number, number>(LispType.NotEqual, ({ done, a, b }) => done(undefined, a != b));\n\naddOps<number, number>(LispType.StrictNotEqual, ({ done, a, b }) => done(undefined, a !== b));\n\naddOps<number, number>(LispType.And, ({ done, a, b }) => done(undefined, a && b));\n\naddOps<number, number>(LispType.Or, ({ done, a, b }) => done(undefined, a || b));\n\naddOps<number, number>(LispType.NullishCoalescing, ({ done, a, b }) => done(undefined, a ?? b));\n\naddOps<number, number>(LispType.BitAnd, ({ done, a, b }) => done(undefined, a & b));\n\naddOps<number, number>(LispType.BitOr, ({ done, a, b }) => done(undefined, a | b));\n\naddOps<number, number>(LispType.Plus, (params) => {\n const { done, a, b } = params;\n const result = (a as any) + (b as any);\n if (typeof result === 'string' && checkHaltExpectedTicks(params, BigInt(result.length))) return;\n done(undefined, result);\n});\n\naddOps<number, number>(LispType.Minus, ({ done, a, b }) => done(undefined, a - b));\n\naddOps<number, number>(LispType.Divide, ({ done, a, b }) => done(undefined, a / b));\n\naddOps<number, number>(LispType.Power, ({ done, a, b }) => done(undefined, a ** b));\n\naddOps<number, number>(LispType.BitNegate, ({ done, a, b }) => done(undefined, a ^ b));\n\naddOps<number, number>(LispType.Multiply, ({ done, a, b }) => done(undefined, a * b));\n\naddOps<number, number>(LispType.Modulus, ({ done, a, b }) => done(undefined, a % b));\n\naddOps<number, number>(LispType.BitShiftLeft, ({ done, a, b }) => done(undefined, a << b));\n\naddOps<number, number>(LispType.BitShiftRight, ({ done, a, b }) => done(undefined, a >> b));\n\naddOps<number, number>(LispType.BitUnsignedShiftRight, ({ done, a, b }) =>\n done(undefined, a >>> b),\n);\n\naddOps<unknown, { new (): unknown }>(LispType.Instanceof, ({ done, a, b }) =>\n done(undefined, a instanceof b),\n);\n\naddOps<string, {}>(LispType.In, ({ done, a, b }) => done(undefined, a in b));\n"],"mappings":";;;;;AAGA,OAAuB,SAAS,aAAa,EAAE,MAAM,GAAG,QAAQ,KAAK,KAAA,GAAW,IAAI,EAAE,CAAC;AAEvF,OAAuB,SAAS,cAAc,EAAE,MAAM,GAAG,QAAQ,KAAK,KAAA,GAAW,IAAI,EAAE,CAAC;AAExF,OAAuB,SAAS,kBAAkB,EAAE,MAAM,GAAG,QAAQ,KAAK,KAAA,GAAW,KAAK,EAAE,CAAC;AAE7F,OAAuB,SAAS,mBAAmB,EAAE,MAAM,GAAG,QAAQ,KAAK,KAAA,GAAW,KAAK,EAAE,CAAC;AAE9F,OAAuB,SAAS,QAAQ,EAAE,MAAM,GAAG,QAAQ,KAAK,KAAA,GAAW,KAAK,EAAE,CAAC;AAEnF,OAAuB,SAAS,cAAc,EAAE,MAAM,GAAG,QAAQ,KAAK,KAAA,GAAW,MAAM,EAAE,CAAC;AAE1F,OAAuB,SAAS,WAAW,EAAE,MAAM,GAAG,QAAQ,KAAK,KAAA,GAAW,KAAK,EAAE,CAAC;AAEtF,OAAuB,SAAS,iBAAiB,EAAE,MAAM,GAAG,QAAQ,KAAK,KAAA,GAAW,MAAM,EAAE,CAAC;AAE7F,OAAuB,SAAS,MAAM,EAAE,MAAM,GAAG,QAAQ,KAAK,KAAA,GAAW,KAAK,EAAE,CAAC;AAEjF,OAAuB,SAAS,KAAK,EAAE,MAAM,GAAG,QAAQ,KAAK,KAAA,GAAW,KAAK,EAAE,CAAC;AAEhF,OAAuB,SAAS,oBAAoB,EAAE,MAAM,GAAG,QAAQ,KAAK,KAAA,GAAW,KAAK,EAAE,CAAC;AAE/F,OAAuB,SAAS,SAAS,EAAE,MAAM,GAAG,QAAQ,KAAK,KAAA,GAAW,IAAI,EAAE,CAAC;AAEnF,OAAuB,SAAS,QAAQ,EAAE,MAAM,GAAG,QAAQ,KAAK,KAAA,GAAW,IAAI,EAAE,CAAC;AAElF,OAAuB,SAAS,OAAO,WAAW;CAChD,MAAM,EAAE,MAAM,GAAG,MAAM;CACvB,MAAM,SAAU,IAAa;AAC7B,KAAI,OAAO,WAAW,YAAY,uBAAuB,QAAQ,OAAO,OAAO,OAAO,CAAC,CAAE;AACzF,MAAK,KAAA,GAAW,OAAO;EACvB;AAEF,OAAuB,SAAS,QAAQ,EAAE,MAAM,GAAG,QAAQ,KAAK,KAAA,GAAW,IAAI,EAAE,CAAC;AAElF,OAAuB,SAAS,SAAS,EAAE,MAAM,GAAG,QAAQ,KAAK,KAAA,GAAW,IAAI,EAAE,CAAC;AAEnF,OAAuB,SAAS,QAAQ,EAAE,MAAM,GAAG,QAAQ,KAAK,KAAA,GAAW,KAAK,EAAE,CAAC;AAEnF,OAAuB,SAAS,YAAY,EAAE,MAAM,GAAG,QAAQ,KAAK,KAAA,GAAW,IAAI,EAAE,CAAC;AAEtF,OAAuB,SAAS,WAAW,EAAE,MAAM,GAAG,QAAQ,KAAK,KAAA,GAAW,IAAI,EAAE,CAAC;AAErF,OAAuB,SAAS,UAAU,EAAE,MAAM,GAAG,QAAQ,KAAK,KAAA,GAAW,IAAI,EAAE,CAAC;AAEpF,OAAuB,SAAS,eAAe,EAAE,MAAM,GAAG,QAAQ,KAAK,KAAA,GAAW,KAAK,EAAE,CAAC;AAE1F,OAAuB,SAAS,gBAAgB,EAAE,MAAM,GAAG,QAAQ,KAAK,KAAA,GAAW,KAAK,EAAE,CAAC;AAE3F,OAAuB,SAAS,wBAAwB,EAAE,MAAM,GAAG,QACjE,KAAK,KAAA,GAAW,MAAM,EAAE,CACzB;AAED,OAAqC,SAAS,aAAa,EAAE,MAAM,GAAG,QACpE,KAAK,KAAA,GAAW,aAAa,EAAE,CAChC;AAED,OAAmB,SAAS,KAAK,EAAE,MAAM,GAAG,QAAQ,KAAK,KAAA,GAAW,KAAK,EAAE,CAAC"}
@@ -0,0 +1 @@
1
+ export {};