@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.
- package/LICENSE +21 -21
- package/README.md +198 -185
- package/{build → dist/cjs}/Sandbox.d.ts +15 -6
- package/dist/cjs/Sandbox.js +126 -0
- package/dist/{SandboxExec.d.ts → cjs/SandboxExec.d.ts} +8 -17
- package/dist/cjs/SandboxExec.js +227 -0
- package/{build/eval.d.ts → dist/cjs/eval/index.d.ts} +10 -2
- package/dist/cjs/eval/index.js +233 -0
- package/dist/cjs/executor/executorUtils.d.ts +161 -0
- package/dist/cjs/executor/executorUtils.js +930 -0
- package/dist/cjs/executor/index.d.ts +1 -0
- package/dist/cjs/executor/index.js +2 -0
- package/dist/cjs/executor/ops/assignment.d.ts +1 -0
- package/dist/cjs/executor/ops/assignment.js +88 -0
- package/dist/cjs/executor/ops/call.d.ts +1 -0
- package/dist/cjs/executor/ops/call.js +160 -0
- package/dist/cjs/executor/ops/comparison.d.ts +1 -0
- package/dist/cjs/executor/ops/comparison.js +36 -0
- package/dist/cjs/executor/ops/control.d.ts +1 -0
- package/dist/cjs/executor/ops/control.js +203 -0
- package/dist/cjs/executor/ops/functions.d.ts +1 -0
- package/dist/cjs/executor/ops/functions.js +55 -0
- package/dist/cjs/executor/ops/index.d.ts +0 -0
- package/dist/cjs/executor/ops/index.js +11 -0
- package/dist/cjs/executor/ops/literals.d.ts +1 -0
- package/dist/cjs/executor/ops/literals.js +45 -0
- package/dist/cjs/executor/ops/misc.d.ts +1 -0
- package/dist/cjs/executor/ops/misc.js +25 -0
- package/dist/cjs/executor/ops/object.d.ts +1 -0
- package/dist/cjs/executor/ops/object.js +51 -0
- package/dist/cjs/executor/ops/prop.d.ts +1 -0
- package/dist/cjs/executor/ops/prop.js +70 -0
- package/dist/cjs/executor/ops/unary.d.ts +1 -0
- package/dist/cjs/executor/ops/unary.js +48 -0
- package/dist/cjs/executor/ops/variables.d.ts +1 -0
- package/dist/cjs/executor/ops/variables.js +16 -0
- package/dist/cjs/executor/opsRegistry.d.ts +33 -0
- package/dist/cjs/executor/opsRegistry.js +8 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/parser/index.d.ts +3 -0
- package/dist/cjs/parser/index.js +1 -0
- package/dist/{parser.d.ts → cjs/parser/lisp.d.ts} +29 -42
- package/dist/cjs/parser/lispTypes/conditionals.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/conditionals.js +135 -0
- package/dist/cjs/parser/lispTypes/control.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/control.js +204 -0
- package/dist/cjs/parser/lispTypes/declarations.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/declarations.js +99 -0
- package/dist/cjs/parser/lispTypes/index.d.ts +3 -0
- package/dist/cjs/parser/lispTypes/index.js +17 -0
- package/dist/cjs/parser/lispTypes/operators.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/operators.js +252 -0
- package/dist/cjs/parser/lispTypes/shared.d.ts +38 -0
- package/dist/cjs/parser/lispTypes/structures.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/structures.js +188 -0
- package/dist/cjs/parser/lispTypes/values.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/values.js +89 -0
- package/dist/cjs/parser/parserUtils.d.ts +34 -0
- package/dist/cjs/parser/parserUtils.js +968 -0
- package/dist/cjs/utils/CodeString.d.ts +16 -0
- package/dist/cjs/utils/CodeString.js +64 -0
- package/dist/cjs/utils/ExecContext.d.ts +34 -0
- package/dist/cjs/utils/ExecContext.js +171 -0
- package/dist/cjs/utils/Prop.d.ts +16 -0
- package/dist/cjs/utils/Prop.js +81 -0
- package/dist/cjs/utils/Scope.d.ts +47 -0
- package/dist/cjs/utils/Scope.js +127 -0
- package/dist/cjs/utils/errors.d.ts +10 -0
- package/dist/cjs/utils/errors.js +12 -0
- package/dist/cjs/utils/functionReplacements.d.ts +11 -0
- package/dist/cjs/utils/functionReplacements.js +362 -0
- package/dist/cjs/utils/index.d.ts +7 -0
- package/dist/cjs/utils/index.js +7 -0
- package/dist/cjs/utils/types.d.ts +221 -0
- package/dist/cjs/utils/types.js +164 -0
- package/dist/cjs/utils/unraw.js +145 -0
- package/dist/{node → esm}/Sandbox.d.ts +15 -6
- package/dist/esm/Sandbox.js +115 -0
- package/dist/esm/Sandbox.js.map +1 -0
- package/{build → dist/esm}/SandboxExec.d.ts +8 -17
- package/dist/esm/SandboxExec.js +224 -0
- package/dist/esm/SandboxExec.js.map +1 -0
- package/dist/{eval.d.ts → esm/eval/index.d.ts} +10 -2
- package/dist/esm/eval/index.js +235 -0
- package/dist/esm/eval/index.js.map +1 -0
- package/dist/esm/executor/executorUtils.d.ts +161 -0
- package/dist/esm/executor/executorUtils.js +898 -0
- package/dist/esm/executor/executorUtils.js.map +1 -0
- package/dist/esm/executor/index.d.ts +1 -0
- package/dist/esm/executor/index.js +2 -0
- package/dist/esm/executor/ops/assignment.d.ts +1 -0
- package/dist/esm/executor/ops/assignment.js +90 -0
- package/dist/esm/executor/ops/assignment.js.map +1 -0
- package/dist/esm/executor/ops/call.d.ts +1 -0
- package/dist/esm/executor/ops/call.js +162 -0
- package/dist/esm/executor/ops/call.js.map +1 -0
- package/dist/esm/executor/ops/comparison.d.ts +1 -0
- package/dist/esm/executor/ops/comparison.js +38 -0
- package/dist/esm/executor/ops/comparison.js.map +1 -0
- package/dist/esm/executor/ops/control.d.ts +1 -0
- package/dist/esm/executor/ops/control.js +205 -0
- package/dist/esm/executor/ops/control.js.map +1 -0
- package/dist/esm/executor/ops/functions.d.ts +1 -0
- package/dist/esm/executor/ops/functions.js +57 -0
- package/dist/esm/executor/ops/functions.js.map +1 -0
- package/dist/esm/executor/ops/index.d.ts +0 -0
- package/dist/esm/executor/ops/index.js +11 -0
- package/dist/esm/executor/ops/literals.d.ts +1 -0
- package/dist/esm/executor/ops/literals.js +47 -0
- package/dist/esm/executor/ops/literals.js.map +1 -0
- package/dist/esm/executor/ops/misc.d.ts +1 -0
- package/dist/esm/executor/ops/misc.js +27 -0
- package/dist/esm/executor/ops/misc.js.map +1 -0
- package/dist/esm/executor/ops/object.d.ts +1 -0
- package/dist/esm/executor/ops/object.js +53 -0
- package/dist/esm/executor/ops/object.js.map +1 -0
- package/dist/esm/executor/ops/prop.d.ts +1 -0
- package/dist/esm/executor/ops/prop.js +72 -0
- package/dist/esm/executor/ops/prop.js.map +1 -0
- package/dist/esm/executor/ops/unary.d.ts +1 -0
- package/dist/esm/executor/ops/unary.js +50 -0
- package/dist/esm/executor/ops/unary.js.map +1 -0
- package/dist/esm/executor/ops/variables.d.ts +1 -0
- package/dist/esm/executor/ops/variables.js +18 -0
- package/dist/esm/executor/ops/variables.js.map +1 -0
- package/dist/esm/executor/opsRegistry.d.ts +33 -0
- package/dist/esm/executor/opsRegistry.js +9 -0
- package/dist/esm/executor/opsRegistry.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/parser/index.d.ts +3 -0
- package/dist/esm/parser/index.js +1 -0
- package/{build/parser.d.ts → dist/esm/parser/lisp.d.ts} +29 -42
- package/dist/esm/parser/lispTypes/conditionals.d.ts +2 -0
- package/dist/esm/parser/lispTypes/conditionals.js +137 -0
- package/dist/esm/parser/lispTypes/conditionals.js.map +1 -0
- package/dist/esm/parser/lispTypes/control.d.ts +2 -0
- package/dist/esm/parser/lispTypes/control.js +206 -0
- package/dist/esm/parser/lispTypes/control.js.map +1 -0
- package/dist/esm/parser/lispTypes/declarations.d.ts +2 -0
- package/dist/esm/parser/lispTypes/declarations.js +101 -0
- package/dist/esm/parser/lispTypes/declarations.js.map +1 -0
- package/dist/esm/parser/lispTypes/index.d.ts +3 -0
- package/dist/esm/parser/lispTypes/index.js +19 -0
- package/dist/esm/parser/lispTypes/index.js.map +1 -0
- package/dist/esm/parser/lispTypes/operators.d.ts +2 -0
- package/dist/esm/parser/lispTypes/operators.js +254 -0
- package/dist/esm/parser/lispTypes/operators.js.map +1 -0
- package/dist/esm/parser/lispTypes/shared.d.ts +38 -0
- package/dist/esm/parser/lispTypes/structures.d.ts +2 -0
- package/dist/esm/parser/lispTypes/structures.js +190 -0
- package/dist/esm/parser/lispTypes/structures.js.map +1 -0
- package/dist/esm/parser/lispTypes/values.d.ts +2 -0
- package/dist/esm/parser/lispTypes/values.js +91 -0
- package/dist/esm/parser/lispTypes/values.js.map +1 -0
- package/dist/esm/parser/parserUtils.d.ts +34 -0
- package/dist/esm/parser/parserUtils.js +959 -0
- package/dist/esm/parser/parserUtils.js.map +1 -0
- package/dist/esm/utils/CodeString.d.ts +16 -0
- package/dist/esm/utils/CodeString.js +66 -0
- package/dist/esm/utils/CodeString.js.map +1 -0
- package/dist/esm/utils/ExecContext.d.ts +34 -0
- package/dist/esm/utils/ExecContext.js +168 -0
- package/dist/esm/utils/ExecContext.js.map +1 -0
- package/dist/esm/utils/Prop.d.ts +16 -0
- package/dist/esm/utils/Prop.js +80 -0
- package/dist/esm/utils/Prop.js.map +1 -0
- package/dist/esm/utils/Scope.d.ts +47 -0
- package/dist/esm/utils/Scope.js +122 -0
- package/dist/esm/utils/Scope.js.map +1 -0
- package/dist/esm/utils/errors.d.ts +10 -0
- package/dist/esm/utils/errors.js +10 -0
- package/dist/esm/utils/errors.js.map +1 -0
- package/dist/esm/utils/functionReplacements.d.ts +11 -0
- package/dist/esm/utils/functionReplacements.js +361 -0
- package/dist/esm/utils/functionReplacements.js.map +1 -0
- package/dist/esm/utils/index.d.ts +7 -0
- package/dist/esm/utils/index.js +7 -0
- package/dist/esm/utils/types.d.ts +221 -0
- package/dist/esm/utils/types.js +160 -0
- package/dist/esm/utils/types.js.map +1 -0
- package/dist/esm/utils/unraw.js +147 -0
- package/dist/esm/utils/unraw.js.map +1 -0
- package/dist/umd/Sandbox.min.js +2 -0
- package/dist/umd/Sandbox.min.js.map +1 -0
- package/dist/umd/SandboxExec.min.js +2 -0
- package/dist/umd/SandboxExec.min.js.map +1 -0
- package/package.json +17 -16
- package/build/Sandbox.js +0 -62
- package/build/SandboxExec.js +0 -214
- package/build/eval.js +0 -205
- package/build/executor.d.ts +0 -124
- package/build/executor.js +0 -1554
- package/build/parser.js +0 -1527
- package/build/unraw.js +0 -168
- package/build/utils.d.ts +0 -264
- package/build/utils.js +0 -362
- package/dist/Sandbox.d.ts +0 -25
- package/dist/Sandbox.js +0 -270
- package/dist/Sandbox.js.map +0 -1
- package/dist/Sandbox.min.js +0 -2
- package/dist/Sandbox.min.js.map +0 -1
- package/dist/SandboxExec.js +0 -218
- package/dist/SandboxExec.js.map +0 -1
- package/dist/SandboxExec.min.js +0 -2
- package/dist/SandboxExec.min.js.map +0 -1
- package/dist/executor.d.ts +0 -124
- package/dist/executor.js +0 -1558
- package/dist/executor.js.map +0 -1
- package/dist/node/Sandbox.js +0 -277
- package/dist/node/SandboxExec.d.ts +0 -66
- package/dist/node/SandboxExec.js +0 -225
- package/dist/node/eval.d.ts +0 -27
- package/dist/node/executor.d.ts +0 -124
- package/dist/node/executor.js +0 -1575
- package/dist/node/parser.d.ts +0 -154
- package/dist/node/parser.js +0 -1704
- package/dist/node/utils.d.ts +0 -264
- package/dist/node/utils.js +0 -385
- package/dist/parser.js +0 -1690
- package/dist/parser.js.map +0 -1
- package/dist/unraw.d.ts +0 -11
- package/dist/utils.d.ts +0 -264
- package/dist/utils.js +0 -365
- package/dist/utils.js.map +0 -1
- /package/{build → dist/cjs/utils}/unraw.d.ts +0 -0
- /package/dist/{node → esm/utils}/unraw.d.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parserUtils.js","names":[],"sources":["../../../src/parser/parserUtils.ts"],"sourcesContent":["import { unraw } from '../utils/unraw';\nimport { CodeString, isLisp, LispType, SandboxCapabilityError } from '../utils';\nimport { registerLispTypes } from './lispTypes';\nimport type {\n Expression,\n ExtractLispA,\n ExtractLispB,\n ExtractLispOp,\n IConstants,\n IExecutionTree,\n IRegEx,\n InternalCode,\n Labeled,\n Lisp,\n LispCallback,\n LispCallbackCtx,\n LispDepthCtx,\n LispFamily,\n LispItem,\n LispItemSingle,\n Literal,\n None,\n Return,\n} from './lisp';\n\ntype LispWithSource = Lisp & { source?: string };\n\nfunction createLisp<L extends Lisp>(obj: {\n op: ExtractLispOp<L>;\n a: ExtractLispA<L>;\n b: ExtractLispB<L>;\n}) {\n return [obj.op, obj.a, obj.b] as L;\n}\n\nconst NullLisp = createLisp<None>({ op: LispType.None, a: LispType.None, b: LispType.None });\n\nconst statementLabelRegex = /([a-zA-Z$_][\\w$]*)\\s*:/g;\n\nfunction extractStatementLabels(prefix = '') {\n return [...prefix.matchAll(statementLabelRegex)].map((match) => match[1]);\n}\n\nfunction wrapLabeledStatement<T extends Lisp>(labels: string[], statement: T): Lisp {\n return labels.reduceRight(\n (current, label) =>\n createLisp<Labeled>({\n op: LispType.Labeled,\n a: label,\n b: current,\n }),\n statement as Lisp,\n );\n}\n\nconst lispTypes: Map<string, LispCallback<string>> = new Map();\n\nexport class ParseError extends Error {\n constructor(\n message: string,\n public code: string,\n ) {\n super(message + ': ' + code.substring(0, 40));\n }\n}\n\nlet lastType: CodeString | string;\nlet lastPart: CodeString | string;\nlet lastLastPart: CodeString | string;\nlet lastLastLastPart: CodeString | string;\nlet lastLastLastLastPart: CodeString | string;\n\nconst inlineIfElse = /^:/;\nconst elseIf = /^else(?![\\w$])/;\nconst ifElse = /^if(?![\\w$])/;\nconst space = /^\\s/;\n\nexport const expectTypes = {\n splitter: {\n types: {\n power: /^(\\*\\*)(?!=)/,\n opHigh: /^(\\/|\\*(?!\\*)|%)(?!=)/,\n op: /^(\\+(?!(\\+))|-(?!(-)))(?!=)/,\n comparitor: /^(<=|>=|<(?!<)|>(?!>)|!==|!=(?!=)|===|==)/,\n bitwiseShift: /^(<<|>>(?!>)|>>>)(?!=)/,\n bitwiseAnd: /^(&(?!&))(?!=)/,\n bitwiseXor: /^(\\^)(?!=)/,\n bitwiseOr: /^(\\|(?!\\|))(?!=)/,\n boolOpAnd: /^(&&)(?!=)/,\n boolOpOr: /^(\\|\\|(?!=)|instanceof(?![\\w$])|in(?![\\w$]))/,\n nullishCoalescing: /^\\?\\?(?!=)/,\n },\n next: ['modifier', 'value', 'prop', 'incrementerBefore'],\n },\n inlineIf: {\n types: {\n inlineIf: /^\\?(?!\\.(?!\\d))/,\n },\n next: ['expEnd'],\n },\n assignment: {\n types: {\n assignModify: /^(-=|\\+=|\\/=|\\*\\*=|\\*=|%=|\\^=|&=|\\|=|>>>=|>>=|<<=|&&=|\\|\\|=|\\?\\?=)/,\n assign: /^(=)(?!=)/,\n },\n next: ['modifier', 'value', 'prop', 'incrementerBefore'],\n },\n incrementerBefore: {\n types: { incrementerBefore: /^(\\+\\+|--)/ },\n next: ['prop'],\n },\n expEdge: {\n types: {\n call: /^(\\?\\.)?[(]/,\n incrementerAfter: /^(\\+\\+|--)/,\n taggedTemplate: /^`(\\d+)`/,\n },\n next: ['splitter', 'assignment', 'expEdge', 'dot', 'inlineIf', 'expEnd'],\n },\n modifier: {\n types: {\n not: /^!/,\n inverse: /^~/,\n negative: /^-(?!-)/,\n positive: /^\\+(?!\\+)/,\n typeof: /^typeof(?![\\w$])/,\n delete: /^delete(?![\\w$])/,\n },\n next: ['modifier', 'value', 'prop', 'incrementerBefore'],\n },\n dot: {\n types: {\n arrayProp: /^(\\?\\.)?\\[/,\n dot: /^(\\?)?\\.(?=\\s*[a-zA-Z$_])/,\n },\n next: ['splitter', 'assignment', 'expEdge', 'dot', 'inlineIf', 'expEnd'],\n },\n prop: {\n types: {\n prop: /^[a-zA-Z$_][a-zA-Z\\d$_]*/,\n },\n next: ['splitter', 'assignment', 'expEdge', 'dot', 'inlineIf', 'expEnd'],\n },\n value: {\n types: {\n createObject: /^\\{/,\n createArray: /^\\[/,\n number:\n /^(0b[01]+(_[01]+)*|0o[0-7]+(_[0-7]+)*|0x[\\da-f]+(_[\\da-f]+)*|(\\d+(_\\d+)*(\\.\\d+(_\\d+)*)?|\\.\\d+(_\\d+)*))(e[+-]?\\d+(_\\d+)*)?(n)?(?!\\d)/i,\n string: /^\"(\\d+)\"/,\n literal: /^`(\\d+)`/,\n regex: /^\\/(\\d+)\\/r(?![\\w$])/,\n boolean: /^(true|false)(?![\\w$])/,\n null: /^null(?![\\w$])/,\n und: /^undefined(?![\\w$])/,\n arrowFunctionSingle: /^(async\\s+)?([a-zA-Z$_][a-zA-Z\\d$_]*)\\s*=>\\s*({)?/,\n arrowFunction: /^(async\\s*)?\\(\\s*([^)(]*?)\\s*\\)\\s*=>\\s*({)?/,\n inlineFunction: /^(async\\s+)?function(\\*\\s*|\\s*)([a-zA-Z$_][a-zA-Z\\d$_]*)?\\s*\\(\\s*/,\n yield: /^yield\\*(?![\\w$])\\s*|^yield(?![\\w$])\\s*/,\n group: /^\\(/,\n NaN: /^NaN(?![\\w$])/,\n Infinity: /^Infinity(?![\\w$])/,\n void: /^void(?![\\w$])\\s*/,\n await: /^await(?![\\w$])\\s*/,\n new: /^new(?![\\w$])\\s*/,\n },\n next: ['splitter', 'expEdge', 'dot', 'inlineIf', 'expEnd'],\n },\n initialize: {\n types: {\n initializeDestructure: /^(var|let|const|internal)\\s+([{[])/,\n initialize: /^(var|let|const|internal)\\s+([a-zA-Z$_][a-zA-Z\\d$_]*)\\s*(=)?/,\n return: /^return(?![\\w$])/,\n throw: /^throw(?![\\w$])\\s*/,\n },\n next: ['modifier', 'value', 'prop', 'incrementerBefore', 'expEnd'],\n },\n spreadObject: {\n types: {\n spreadObject: /^\\.\\.\\./,\n },\n next: ['value', 'prop'],\n },\n spreadArray: {\n types: {\n spreadArray: /^\\.\\.\\./,\n },\n next: ['value', 'prop'],\n },\n expEnd: { types: {}, next: [] },\n expFunction: {\n types: {\n function: /^(async\\s+)?function(\\*\\s*|\\s+)([a-zA-Z$_][a-zA-Z\\d$_]*)\\s*\\(\\s*/,\n },\n next: ['expEdge', 'expEnd'],\n },\n expSingle: {\n types: {\n for: /^((?:[a-zA-Z$_][\\w$]*\\s*:\\s*)*)\\s*for(\\s+await)?\\s*\\(/,\n do: /^((?:[a-zA-Z$_][\\w$]*\\s*:\\s*)*)\\s*do(?![\\w$])\\s*(\\{)?/,\n while: /^((?:[a-zA-Z$_][\\w$]*\\s*:\\s*)*)\\s*while\\s*\\(/,\n loopAction: /^(break|continue)(?![\\w$])\\s*([a-zA-Z$_][\\w$]*)?/,\n if: /^((?:[a-zA-Z$_][\\w$]*\\s*:\\s*)*)\\s*if\\s*\\(/,\n try: /^((?:[a-zA-Z$_][\\w$]*\\s*:\\s*)*)\\s*try\\s*{/,\n block: /^((?:[a-zA-Z$_][\\w$]*\\s*:\\s*)*)\\s*{/,\n switch: /^((?:[a-zA-Z$_][\\w$]*\\s*:\\s*)*)\\s*switch\\s*\\(/,\n },\n next: ['expEnd'],\n },\n} as Record<string, { types: Record<string, RegExp>; next: string[] }>;\n\nconst closings = {\n '(': ')',\n '[': ']',\n '{': '}',\n \"'\": \"'\",\n '\"': '\"',\n '`': '`',\n} as Record<string, string>;\n\nexport function testMultiple(str: string, tests: RegExp[]) {\n let found: RegExpExecArray | null = null;\n for (let i = 0; i < tests.length; i++) {\n const test = tests[i];\n found = test.exec(str);\n if (found) break;\n }\n return found;\n}\n\nconst emptyString = new CodeString('');\n\nconst okFirstChars = /^[+\\-~ !]/;\nconst aNumber = expectTypes.value.types.number;\nconst wordReg = /^((if|for|else|while|do|function)(?![\\w$])|[\\w$]+)/;\nconst semiColon = /^;/;\nconst insertedSemicolons: WeakMap<{ str: string }, Array<number>> = new WeakMap();\nconst quoteCache: WeakMap<{ str: string }, Map<number, number>> = new WeakMap();\nexport interface restDetails {\n oneliner?: boolean;\n words?: string[];\n lastWord?: string;\n lastAnyWord?: string;\n regRes?: RegExpExecArray;\n bodyContentAfterKeyword?: boolean;\n}\nexport function restOfExp(\n constants: IConstants,\n part: CodeString,\n tests?: RegExp[],\n quote?: string,\n firstOpening?: string,\n closingsTests?: RegExp[],\n details: restDetails = {},\n depth = 0,\n): CodeString {\n if (!part.length) {\n return part;\n }\n if (depth > constants.maxDepth) {\n throw new SandboxCapabilityError('Maximum expression depth exceeded');\n }\n details.words = details.words || [];\n let isStart = true;\n tests = tests || [];\n const hasSemiTest = tests.includes(semiColon);\n if (hasSemiTest) {\n tests = tests.filter((a) => a !== semiColon);\n }\n const insertedSemis = insertedSemicolons.get(part.ref) || [];\n const cache = quoteCache.get(part.ref) || new Map<number, number>();\n quoteCache.set(part.ref, cache);\n if (quote && cache.has(part.start - 1)) {\n return part.substring(0, cache.get(part.start - 1)! - part.start);\n }\n let escape = false;\n let done = false;\n let lastChar = '';\n let isOneLiner = false;\n let i;\n let lastInertedSemi = false;\n let seenKeyword = false;\n let skipNextWord = false;\n for (i = 0; i < part.length && !done; i++) {\n let char = part.char(i)!;\n if (quote === '\"' || quote === \"'\" || quote === '`') {\n if (quote === '`' && char === '$' && part.char(i + 1) === '{' && !escape) {\n const skip = restOfExp(\n constants,\n part.substring(i + 2),\n [],\n '{',\n undefined,\n undefined,\n {},\n depth + 1,\n );\n i += skip.length + 2;\n } else if (char === quote && !escape) {\n return part.substring(0, i);\n }\n escape = !escape && char === '\\\\';\n } else if (closings[char]) {\n if (!lastInertedSemi && insertedSemis[i + part.start]) {\n lastInertedSemi = true;\n if (hasSemiTest) {\n break;\n }\n i--;\n lastChar = ';';\n continue;\n }\n if (isOneLiner && char === '{') {\n isOneLiner = false;\n }\n if (char === firstOpening) {\n done = true;\n break;\n } else {\n const skip = restOfExp(\n constants,\n part.substring(i + 1),\n [],\n char,\n undefined,\n undefined,\n {},\n depth + 1,\n );\n cache.set(skip.start - 1, skip.end);\n i += skip.length + 1;\n isStart = false;\n if (closingsTests) {\n const sub = part.substring(i);\n let found: RegExpExecArray | null;\n if ((found = testMultiple(sub.toString(), closingsTests))) {\n details.regRes = found;\n done = true;\n }\n }\n }\n } else if (!quote) {\n let sub = part.substring(i).toString();\n let foundWord: RegExpExecArray | null;\n let foundNumber: RegExpExecArray | null;\n if (closingsTests) {\n let found: RegExpExecArray | null;\n if ((found = testMultiple(sub, closingsTests))) {\n details.regRes = found;\n i++;\n done = true;\n break;\n }\n }\n if ((foundNumber = aNumber.exec(sub))) {\n i += foundNumber[0].length - 1;\n sub = part.substring(i).toString();\n if (closingsTests) {\n let found: RegExpExecArray | null;\n if ((found = testMultiple(sub, closingsTests))) {\n details.regRes = found;\n i++;\n done = true;\n break;\n }\n }\n } else if (lastChar != char) {\n let found: [string] | RegExpExecArray | null = null;\n if (char === ';' || (insertedSemis[i + part.start] && !isStart && !lastInertedSemi)) {\n if (hasSemiTest) {\n found = [';'];\n } else if (insertedSemis[i + part.start]) {\n lastInertedSemi = true;\n i--;\n lastChar = ';';\n continue;\n }\n char = sub = ';';\n } else {\n lastInertedSemi = false;\n }\n if (!found) {\n found = testMultiple(sub, tests);\n }\n if (found) {\n done = true;\n }\n if (!done && (foundWord = wordReg.exec(sub))) {\n isOneLiner = true;\n if (foundWord[2]) {\n seenKeyword = true;\n skipNextWord = true;\n } else if (seenKeyword) {\n if (skipNextWord) {\n skipNextWord = false;\n } else {\n details.bodyContentAfterKeyword = true;\n }\n }\n if (foundWord[0].length > 1) {\n details.words.push(foundWord[1]);\n details.lastAnyWord = foundWord[1];\n if (foundWord[2]) {\n details.lastWord = foundWord[2];\n }\n }\n if (foundWord[0].length > 2) {\n i += foundWord[0].length - 2;\n }\n }\n }\n if (isStart) {\n if (okFirstChars.test(sub)) {\n done = false;\n } else {\n isStart = false;\n }\n }\n if (done) break;\n } else if (char === closings[quote]) {\n return part.substring(0, i);\n }\n lastChar = char;\n }\n if (quote) {\n throw new SyntaxError(\"Unclosed '\" + quote + \"'\");\n }\n if (details) {\n details.oneliner = isOneLiner;\n }\n return part.substring(0, i);\n}\nrestOfExp.next = ['splitter', 'expEnd', 'inlineIf'];\n\nconst startingExecpted = [\n 'initialize',\n 'expSingle',\n 'expFunction',\n 'value',\n 'modifier',\n 'prop',\n 'incrementerBefore',\n 'expEnd',\n];\n\nexport const setLispType = <T extends readonly string[]>(types: T, fn: LispCallback<T[number]>) => {\n types.forEach((type) => {\n lispTypes.set(type, fn);\n });\n};\n\nregisterLispTypes({\n NullLisp,\n ParseError,\n createLisp,\n emptyString,\n expectTypes,\n expandDestructure,\n expandFunctionParamDestructure,\n extractStatementLabels,\n findPatternEndIdx,\n getDestructurePatternSource,\n insertSemicolons,\n lispify,\n lispifyBlock,\n lispifyExpr,\n lispifyFunction,\n lispifyReturnExpr,\n restOfExp,\n semiColon,\n setLispType,\n splitByCommasDestructure,\n startingExecpted,\n wrapLabeledStatement,\n});\n\nfunction splitByCommasDestructure(s: string): string[] {\n const parts: string[] = [];\n let depth = 0;\n let cur = '';\n for (let i = 0; i < s.length; i++) {\n const c = s[i];\n if (c === '[' || c === '{' || c === '(') depth++;\n else if (c === ']' || c === '}' || c === ')') depth--;\n if (c === ',' && depth === 0) {\n parts.push(cur);\n cur = '';\n } else {\n cur += c;\n }\n }\n parts.push(cur);\n return parts;\n}\n\nfunction findFirstAtTopLevel(s: string, ch: string): number {\n let depth = 0;\n for (let i = 0; i < s.length; i++) {\n const c = s[i];\n if (c === '[' || c === '{' || c === '(') depth++;\n else if (c === ']' || c === '}' || c === ')') depth--;\n if (c === ch && depth === 0) return i;\n }\n return -1;\n}\n\nfunction findPatternEndIdx(s: string): number {\n let depth = 0;\n for (let i = 0; i < s.length; i++) {\n const c = s[i];\n if (c === '[' || c === '{') depth++;\n else if (c === ']' || c === '}') {\n depth--;\n if (depth === 0) return i + 1;\n }\n }\n return s.length;\n}\n\nconst validIdentifier = /^[a-zA-Z$_][a-zA-Z\\d$_]*$/;\nfunction assertIdentifier(name: string): string {\n if (!validIdentifier.test(name)) throw new SyntaxError(`Invalid destructuring target: '${name}'`);\n return name;\n}\n\nfunction expandDestructure(keyword: string, patternStr: string, rhsStr: string): string {\n const stmts: string[] = [];\n\n function genTemp(): string {\n return `$$_d${Math.random().toString(36).slice(2)}`;\n }\n\n function processPattern(pattern: string, src: string) {\n pattern = pattern.trim();\n if (pattern.startsWith('[')) {\n processArrayPattern(pattern.slice(1, -1), src);\n } else if (pattern.startsWith('{')) {\n processObjectPattern(pattern.slice(1, -1), src);\n }\n }\n\n function processArrayPattern(content: string, src: string) {\n const elements = splitByCommasDestructure(content);\n for (let i = 0; i < elements.length; i++) {\n const elem = elements[i].trim();\n if (!elem) continue;\n\n if (elem.startsWith('...')) {\n const rest = elem.slice(3).trim();\n if (rest.startsWith('[') || rest.startsWith('{')) {\n const t = genTemp();\n stmts.push(`internal ${t} = ${src}.slice(${i})`);\n processPattern(rest, t);\n } else {\n stmts.push(`${keyword} ${assertIdentifier(rest)} = ${src}.slice(${i})`);\n }\n break;\n }\n\n const eqIdx = findFirstAtTopLevel(elem, '=');\n const target = eqIdx !== -1 ? elem.slice(0, eqIdx).trim() : elem.trim();\n const defaultVal = eqIdx !== -1 ? elem.slice(eqIdx + 1).trim() : undefined;\n\n if (target.startsWith('[') || target.startsWith('{')) {\n const t = genTemp();\n stmts.push(\n defaultVal !== undefined\n ? `internal ${t} = ${src}[${i}] !== undefined ? ${src}[${i}] : (${defaultVal})`\n : `internal ${t} = ${src}[${i}]`,\n );\n processPattern(target, t);\n } else {\n stmts.push(\n defaultVal !== undefined\n ? `${keyword} ${assertIdentifier(target)} = ${src}[${i}] !== undefined ? ${src}[${i}] : (${defaultVal})`\n : `${keyword} ${assertIdentifier(target)} = ${src}[${i}]`,\n );\n }\n }\n }\n\n function processObjectPattern(content: string, src: string) {\n const props = splitByCommasDestructure(content);\n const usedKeys: string[] = [];\n\n for (const prop of props) {\n const p = prop.trim();\n if (!p) continue;\n\n if (p.startsWith('...')) {\n // Check that rest is the last element\n const restIdx = props.indexOf(prop);\n const hasMore = props.slice(restIdx + 1).some((pp) => pp.trim().length > 0);\n if (hasMore) {\n throw new SyntaxError('Rest element must be last element');\n }\n const rest = p.slice(3).trim();\n const exclTemp = genTemp();\n const keyTemp = genTemp();\n const resTemp = genTemp();\n const exclEntries = usedKeys.map((k) => `${assertIdentifier(k)}:1`).join(',');\n stmts.push(`internal ${exclTemp} = {${exclEntries}}`);\n stmts.push(`internal ${resTemp} = {}`);\n stmts.push(\n `for (internal ${keyTemp} in ${src}) { if (!(${keyTemp} in ${exclTemp})) { ${resTemp}[${keyTemp}] = ${src}[${keyTemp}] } }`,\n );\n if (rest.startsWith('[') || rest.startsWith('{')) {\n processPattern(rest, resTemp);\n } else {\n stmts.push(`${keyword} ${assertIdentifier(rest)} = ${resTemp}`);\n }\n break;\n }\n\n if (p.startsWith('[')) {\n // Computed property name: [expr]: target\n let closeBracket = -1;\n let depth = 1;\n for (let ci = 1; ci < p.length; ci++) {\n if (p[ci] === '[') depth++;\n else if (p[ci] === ']') {\n depth--;\n if (depth === 0) {\n closeBracket = ci;\n break;\n }\n }\n }\n if (closeBracket !== -1) {\n const computedExpr = p.slice(1, closeBracket);\n const after = p.slice(closeBracket + 1).trim();\n if (after.startsWith(':')) {\n const valueStr = after.slice(1).trim();\n const accessor = `${src}[${computedExpr}]`;\n const eqIdx = findFirstAtTopLevel(valueStr, '=');\n const tgt =\n eqIdx !== -1 && !valueStr.slice(0, eqIdx).trim().match(/^[[{]/)\n ? valueStr.slice(0, eqIdx).trim()\n : valueStr.trim();\n const defVal =\n eqIdx !== -1 && !valueStr.slice(0, eqIdx).trim().match(/^[[{]/)\n ? valueStr.slice(eqIdx + 1).trim()\n : undefined;\n if (tgt.startsWith('[') || tgt.startsWith('{')) {\n const t = genTemp();\n stmts.push(\n defVal !== undefined\n ? `internal ${t} = ${accessor} !== undefined ? ${accessor} : (${defVal})`\n : `internal ${t} = ${accessor}`,\n );\n processPattern(tgt, t);\n } else {\n stmts.push(\n defVal !== undefined\n ? `${keyword} ${assertIdentifier(tgt)} = ${accessor} !== undefined ? ${accessor} : (${defVal})`\n : `${keyword} ${assertIdentifier(tgt)} = ${accessor}`,\n );\n }\n }\n }\n continue;\n }\n\n const colonIdx = findFirstAtTopLevel(p, ':');\n if (colonIdx !== -1) {\n const key = assertIdentifier(p.slice(0, colonIdx).trim());\n const valueStr = p.slice(colonIdx + 1).trim();\n usedKeys.push(key);\n const accessor = `${src}.${key}`;\n const eqIdx = findFirstAtTopLevel(valueStr, '=');\n const beforeEq = eqIdx !== -1 ? valueStr.slice(0, eqIdx).trim() : valueStr.trim();\n const isNestedPattern = beforeEq.startsWith('[') || beforeEq.startsWith('{');\n const tgt = isNestedPattern ? valueStr.trim() : beforeEq;\n const defVal =\n !isNestedPattern && eqIdx !== -1 ? valueStr.slice(eqIdx + 1).trim() : undefined;\n\n if (tgt.startsWith('[') || tgt.startsWith('{')) {\n const patEnd = findPatternEndIdx(tgt);\n const finalPattern = tgt.slice(0, patEnd);\n const afterPat = tgt.slice(patEnd).trim();\n const nestedDef = afterPat.startsWith('=') ? afterPat.slice(1).trim() : undefined;\n const t = genTemp();\n stmts.push(\n nestedDef !== undefined\n ? `internal ${t} = ${accessor} !== undefined ? ${accessor} : (${nestedDef})`\n : `internal ${t} = ${accessor}`,\n );\n processPattern(finalPattern, t);\n } else {\n stmts.push(\n defVal !== undefined\n ? `${keyword} ${assertIdentifier(tgt)} = ${accessor} !== undefined ? ${accessor} : (${defVal})`\n : `${keyword} ${assertIdentifier(tgt)} = ${accessor}`,\n );\n }\n continue;\n }\n\n const eqIdx = findFirstAtTopLevel(p, '=');\n if (eqIdx !== -1) {\n const name = assertIdentifier(p.slice(0, eqIdx).trim());\n const defaultVal = p.slice(eqIdx + 1).trim();\n usedKeys.push(name);\n stmts.push(\n `${keyword} ${name} = ${src}.${name} !== undefined ? ${src}.${name} : (${defaultVal})`,\n );\n } else {\n assertIdentifier(p);\n usedKeys.push(p);\n stmts.push(`${keyword} ${p} = ${src}.${p}`);\n }\n }\n }\n\n const rootTemp = genTemp();\n stmts.unshift(`var ${rootTemp} = (${rhsStr})`);\n processPattern(patternStr, rootTemp);\n return stmts.join('; ');\n}\n\nfunction getDestructurePatternSource(tree: LispItem): string | null {\n if (!isLisp(tree)) return null;\n const source = (tree as LispWithSource).source?.trim();\n if (source && (source.startsWith('[') || source.startsWith('{'))) {\n return source;\n }\n if (tree[0] === LispType.Group) {\n return getDestructurePatternSource(tree[2]);\n }\n return null;\n}\n\nfunction expandFunctionParamDestructure(\n args: string[],\n funcBody: string,\n): { args: string[]; body: string } {\n const injected: string[] = [];\n const newArgs = args.map((arg, i) => {\n const a = arg.trim();\n if (a.startsWith('[') || a.startsWith('{')) {\n const tempName = `$$_p${i}`;\n // Check for a parameter default: {pattern} = defaultVal or [pattern] = defaultVal\n const patEnd = findPatternEndIdx(a);\n const patternOnly = a.slice(0, patEnd);\n const afterPat = a.slice(patEnd).trim();\n if (afterPat.startsWith('=')) {\n const defaultVal = afterPat.slice(1).trim();\n // Use temp var that applies the default, then destructure from it\n injected.push(\n expandDestructure(\n 'const',\n patternOnly,\n `${tempName} !== undefined ? ${tempName} : (${defaultVal})`,\n ),\n );\n } else {\n injected.push(expandDestructure('const', patternOnly, tempName));\n }\n return tempName;\n }\n // Handle simple default: a = defaultVal or ...rest (no default)\n const eqIdx = findFirstAtTopLevel(a, '=');\n if (eqIdx !== -1 && !a.startsWith('...')) {\n const paramName = a.slice(0, eqIdx).trim();\n const defaultVal = a.slice(eqIdx + 1).trim();\n injected.push(`if (${paramName} === undefined) ${paramName} = (${defaultVal})`);\n return paramName;\n }\n return a;\n });\n if (injected.length === 0) return { args: newArgs, body: funcBody };\n return { args: newArgs, body: injected.join('; ') + '; ' + funcBody };\n}\n\nfunction lispify(\n constants: IConstants,\n part: CodeString,\n expected?: readonly string[],\n lispTree?: Lisp,\n topLevel = false,\n depthCtx: LispDepthCtx = { generatorDepth: 0, asyncDepth: 0, lispDepth: 0 },\n): Lisp {\n if (depthCtx.lispDepth > constants.maxDepth) {\n throw new SandboxCapabilityError('Maximum expression depth exceeded');\n }\n const { generatorDepth, asyncDepth, lispDepth } = depthCtx;\n lispTree = lispTree || NullLisp;\n expected = expected || expectTypes.initialize.next;\n if (part === undefined) return lispTree;\n\n part = part.trimStart();\n const str = part.toString();\n if (!part.length && !expected.includes('expEnd')) {\n throw new SyntaxError('Unexpected end of expression');\n }\n if (!part.length) return lispTree;\n\n const ctx: LispCallbackCtx = {\n constants,\n type: '',\n part,\n res: [],\n expect: '',\n lispTree,\n generatorDepth,\n asyncDepth,\n lispDepth,\n };\n\n let res: any;\n for (const expect of expected) {\n if (expect === 'expEnd') {\n continue;\n }\n for (const type in expectTypes[expect].types) {\n if (type === 'expEnd') {\n continue;\n }\n if ((res = expectTypes[expect].types[type].exec(str))) {\n lastType = type;\n lastLastLastLastPart = lastLastLastPart;\n lastLastLastPart = lastLastPart;\n lastLastPart = lastPart;\n lastPart = part;\n ctx.type = type;\n ctx.part = part;\n ctx.res = res;\n ctx.expect = expect;\n try {\n lispTypes.get(type)?.(ctx as LispCallbackCtx & { type: string });\n } catch (e) {\n if (topLevel && e instanceof SyntaxError) {\n throw new ParseError(e.message, str);\n }\n throw e;\n }\n break;\n }\n }\n if (res) break;\n }\n\n if (!res && part.length) {\n if (topLevel) {\n throw new ParseError(`Unexpected token after ${lastType}: ${part.char(0)}`, str);\n }\n throw new SyntaxError(`Unexpected token after ${lastType}: ${part.char(0)}`);\n }\n return ctx.lispTree;\n}\n\nconst startingExpectedWithoutSingle = startingExecpted.filter((r) => r !== 'expSingle');\n\nfunction lispifyExpr(\n constants: IConstants,\n str: CodeString,\n expected?: readonly string[],\n depthCtx: LispDepthCtx = { generatorDepth: 0, asyncDepth: 0, lispDepth: 0 },\n): Lisp {\n if (depthCtx.lispDepth > constants.maxDepth) {\n throw new SandboxCapabilityError('Maximum expression depth exceeded');\n }\n if (!str.trimStart().length) return NullLisp;\n const subExpressions: CodeString[] = [];\n let sub: CodeString;\n let pos = 0;\n expected = expected || expectTypes.initialize.next;\n if (expected.includes('expSingle')) {\n if (testMultiple(str.toString(), Object.values(expectTypes.expSingle.types))) {\n return lispify(constants, str, ['expSingle'], undefined, true, depthCtx);\n }\n }\n if (expected === startingExecpted) expected = startingExpectedWithoutSingle;\n while ((sub = restOfExp(constants, str.substring(pos), [/^,/])).length) {\n subExpressions.push(sub.trimStart());\n pos += sub.length + 1;\n }\n if (subExpressions.length === 1) {\n return lispify(constants, str, expected, undefined, true, depthCtx);\n }\n if (expected.includes('initialize')) {\n const defined = expectTypes.initialize.types.initialize.exec(subExpressions[0].toString());\n if (defined) {\n return createLisp<InternalCode>({\n op: LispType.InternalBlock,\n a: subExpressions.map((str, i) =>\n lispify(\n constants,\n i ? new CodeString(defined![1] + ' ' + str) : str,\n ['initialize'],\n undefined,\n true,\n depthCtx,\n ),\n ),\n b: LispType.None,\n });\n } else if (expectTypes.initialize.types.return.exec(subExpressions[0].toString())) {\n return lispify(constants, str, expected, undefined, true, depthCtx);\n }\n }\n const exprs = subExpressions.map((str) =>\n lispify(constants, str, expected, undefined, true, depthCtx),\n );\n return createLisp<Expression>({ op: LispType.Expression, a: exprs, b: LispType.None });\n}\n\nexport function lispifyReturnExpr(constants: IConstants, str: CodeString) {\n return createLisp<Return>({\n op: LispType.Return,\n a: LispType.None,\n b: lispifyExpr(constants, str),\n });\n}\n\nexport function lispifyBlock(\n str: CodeString,\n constants: IConstants,\n expression = false,\n depthCtx: LispDepthCtx = { generatorDepth: 0, asyncDepth: 0, lispDepth: 0 },\n): Lisp[] {\n str = insertSemicolons(constants, str);\n if (!str.trim().length) return [];\n const parts: CodeString[] = [];\n let part: CodeString;\n let pos = 0;\n let start = 0;\n let details: restDetails = {};\n let skipped = false;\n let isInserted = false;\n while (\n (part = restOfExp(\n constants,\n str.substring(pos),\n [semiColon],\n undefined,\n undefined,\n undefined,\n details,\n )).length\n ) {\n isInserted = !!(str.char(pos + part.length) && str.char(pos + part.length) !== ';');\n pos += part.length + (isInserted ? 0 : 1);\n if (/^\\s*else(?![\\w$])/.test(str.substring(pos).toString())) {\n skipped = true;\n } else if (\n details['words']?.includes('do') &&\n /^\\s*while(?![\\w$])/.test(str.substring(pos).toString())\n ) {\n skipped = true;\n } else {\n skipped = false;\n parts.push(str.substring(start, pos - (isInserted ? 0 : 1)));\n start = pos;\n }\n details = {};\n if (expression) break;\n }\n if (skipped) {\n parts.push(str.substring(start, pos - (isInserted ? 0 : 1)));\n }\n return parts\n .map((str) => str.trimStart())\n .filter((str) => str.length)\n .map((str) => {\n return lispifyExpr(constants, str.trimStart(), startingExecpted, depthCtx);\n });\n}\n\nexport function lispifyFunction(\n str: CodeString,\n constants: IConstants,\n expression = false,\n depthCtx: LispDepthCtx = { generatorDepth: 0, asyncDepth: 0, lispDepth: 0 },\n): Lisp[] {\n if (!str.trim().length) return [];\n const tree = lispifyBlock(str, constants, expression, depthCtx);\n hoist(tree);\n return tree;\n}\n\nfunction hoist(item: LispItem, res: Lisp[] = []): boolean {\n if (isLisp(item)) {\n if (!isLisp<LispFamily>(item)) return false;\n const [op, a, b] = item;\n if (\n op === LispType.Labeled ||\n op === LispType.Try ||\n op === LispType.If ||\n op === LispType.Loop ||\n op === LispType.Switch\n ) {\n hoist(a, res);\n hoist(b, res);\n } else if (op === LispType.Var) {\n res.push(createLisp({ op: LispType.Var, a: a, b: LispType.None }));\n } else if (op === LispType.Function && a[2]) {\n res.push(item);\n return true;\n }\n } else if (Array.isArray(item)) {\n const rep: LispItemSingle[] = [];\n for (const it of item) {\n if (!hoist(it, res)) {\n rep.push(it);\n }\n }\n if (rep.length !== item.length) {\n item.length = 0;\n item.push(...res, ...rep);\n }\n }\n return false;\n}\n\nconst closingsNoInsertion = /^(\\})\\s*(catch|finally|else|while|instanceof)(?![\\w$])/;\n// \\w|)|] \\n \\w = 2 // \\} \\w|\\{ = 5\nconst colonsRegex = /^((([\\w$\\])\"'`]|\\+\\+|--)\\s*\\r?\\n\\s*([\\w$+\\-!~]))|(\\}\\s*[\\w$!~+\\-{(\"'`]))/;\n\n// if () \\w \\n; \\w == \\w \\n \\w | last === if a\n// if () { }; \\w == \\} ^else | last === if b\n// if () \\w \\n; else \\n \\w \\n; == \\w \\n \\w | last === else a\n// if () {} else {}; \\w == \\} \\w | last === else b\n// while () \\n \\w \\n; \\w == \\w \\n \\w | last === while a\n// while () { }; \\w == \\} \\w | last === while b\n// do \\w \\n; while (); \\w == \\w \\n while | last === do a\n// do { } while (); \\w == \\) \\w | last === while c\n// try {} catch () {}; \\w == \\} \\w | last === catch|finally b\n// \\w \\n; \\w == \\w \\n \\w | last === none a\n// cb() \\n \\w == \\) \\n \\w | last === none a\n// obj[a] \\n \\w == \\] \\n \\w | last === none a\n// {} {} == \\} \\{ | last === none b\n\nexport function insertSemicolons(constants: IConstants, str: CodeString): CodeString {\n let rest = str;\n let sub = emptyString;\n let details: restDetails = {};\n let pendingDoWhile = false;\n const inserted = insertedSemicolons.get(str.ref) || new Array(str.ref.str.length);\n while (\n (sub = restOfExp(constants, rest, [], undefined, undefined, [colonsRegex], details)).length\n ) {\n let valid = false;\n let part = sub;\n let edge = sub.length;\n if (details.regRes) {\n valid = true;\n const [, , a, , , b] = details.regRes;\n edge = details.regRes[3] === '++' || details.regRes[3] === '--' ? sub.length + 1 : sub.length;\n part = rest.substring(0, edge);\n if (b) {\n const res = closingsNoInsertion.exec(rest.substring(sub.length - 1).toString());\n if (res) {\n if (res[2] === 'while') {\n if (details.lastWord === 'do') {\n valid = false;\n pendingDoWhile = true;\n } else {\n valid = true;\n }\n } else {\n valid = false;\n }\n } else if (\n details.lastWord === 'function' &&\n details.regRes[5][0] === '}' &&\n details.regRes[5].slice(-1) === '('\n ) {\n valid = false;\n }\n } else if (a) {\n if (pendingDoWhile && details.lastWord === 'while') {\n valid = true;\n pendingDoWhile = false;\n } else if (\n details.lastWord === 'if' ||\n details.lastWord === 'while' ||\n details.lastWord === 'for' ||\n details.lastWord === 'else'\n ) {\n valid = !!details.bodyContentAfterKeyword;\n }\n }\n }\n if (valid) {\n inserted[part.end] = true;\n }\n rest = rest.substring(edge);\n details = {};\n }\n insertedSemicolons.set(str.ref, inserted);\n return str;\n}\n\nexport function checkRegex(str: string): IRegEx | null {\n let i = 1;\n let escape = false;\n let done = false;\n let cancel = false;\n while (i < str.length && !done && !cancel) {\n done = str[i] === '/' && !escape;\n escape = str[i] === '\\\\' && !escape;\n cancel = str[i] === '\\n';\n i++;\n }\n const after = str.substring(i);\n cancel = cancel || !done || /^\\s*\\d/.test(after);\n if (cancel) return null;\n const flags = /^[a-z]*/.exec(after);\n if (/^\\s+[\\w$]/.test(str.substring(i + flags![0].length))) {\n return null;\n }\n const regexPattern = str.substring(1, i - 1);\n const regexFlags = (flags && flags[0]) || '';\n try {\n new RegExp(regexPattern, regexFlags);\n } catch (e) {\n if (e instanceof SyntaxError) throw e;\n }\n return {\n regex: regexPattern,\n flags: regexFlags,\n length: i + ((flags && flags[0].length) || 0),\n };\n}\n\nconst notDivide = /(typeof|delete|instanceof|return|in|of|throw|new|void|do|if)$/;\nconst possibleDivide = /^([\\w$\\])]|\\+\\+|--)[\\s/]/;\nexport function extractConstants(\n constants: IConstants,\n str: string,\n currentEnclosure = '',\n depth = 0,\n): { str: string; length: number } {\n if (depth > constants.maxDepth) {\n throw new SandboxCapabilityError('Maximum expression depth exceeded');\n }\n let quote;\n let extract: (string | number)[] = [];\n let escape = false;\n let regexFound: IRegEx | null;\n let comment = '';\n let commentStart = -1;\n let currJs: string[] = [];\n let char = '';\n const strRes: (string | number)[] = [];\n const enclosures: string[] = [];\n let isPossibleDivide: RegExpExecArray | null = null;\n let i = 0;\n for (i = 0; i < str.length; i++) {\n char = str[i];\n if (comment) {\n if (char === comment) {\n if (comment === '*' && str[i + 1] === '/') {\n comment = '';\n i++;\n } else if (comment === '\\n') {\n comment = '';\n strRes.push('\\n');\n }\n }\n } else {\n if (escape) {\n escape = false;\n extract.push(char);\n continue;\n }\n\n if (quote) {\n if (quote === '`' && char === '$' && str[i + 1] === '{') {\n const skip = extractConstants(constants, str.substring(i + 2), '{', depth + 1);\n if (!skip.str.trim().length) {\n throw new SyntaxError('Unexpected end of expression');\n }\n currJs.push(skip.str);\n extract.push('${', currJs.length - 1, `}`);\n i += skip.length + 2;\n } else if (quote === char) {\n if (quote === '`') {\n const li = createLisp<Literal>({\n op: LispType.Literal,\n a: unraw(extract.join('')),\n b: [],\n });\n li.tempJsStrings = currJs;\n constants.literals.push(li);\n strRes.push(`\\``, constants.literals.length - 1, `\\``);\n } else {\n constants.strings.push(unraw(extract.join('')));\n strRes.push(`\"`, constants.strings.length - 1, `\"`);\n }\n quote = null;\n extract = [];\n } else {\n extract.push(char);\n }\n } else {\n if (char === \"'\" || char === '\"' || char === '`') {\n currJs = [];\n quote = char;\n } else if (closings[currentEnclosure] === char && !enclosures.length) {\n return { str: strRes.join(''), length: i };\n } else if (closings[char]) {\n enclosures.push(char);\n strRes.push(char);\n } else if (closings[enclosures[enclosures.length - 1]] === char) {\n enclosures.pop();\n strRes.push(char);\n } else if (char === '/' && (str[i + 1] === '*' || str[i + 1] === '/')) {\n comment = str[i + 1] === '*' ? '*' : '\\n';\n commentStart = i;\n } else if (\n char === '/' &&\n !isPossibleDivide &&\n (regexFound = checkRegex(str.substring(i)))\n ) {\n constants.regexes.push(regexFound);\n strRes.push(`/`, constants.regexes.length - 1, `/r`);\n i += regexFound.length - 1;\n } else {\n strRes.push(char);\n }\n\n if (!isPossibleDivide || !space.test(char)) {\n if ((isPossibleDivide = possibleDivide.exec(str.substring(i)))) {\n if (notDivide.test(str.substring(0, i + isPossibleDivide[1].length))) {\n isPossibleDivide = null;\n }\n }\n }\n }\n escape = !!(quote && char === '\\\\');\n }\n }\n\n if (quote) {\n throw new SyntaxError(`Unclosed '${quote}'`);\n }\n if (comment) {\n if (comment === '*') {\n throw new SyntaxError(`Unclosed comment '/*': ${str.substring(commentStart)}`);\n }\n }\n return { str: strRes.join(''), length: i };\n}\n\nexport default function parse(\n code: string,\n eager = false,\n expression = false,\n maxParserRecursionDepth = 256,\n): IExecutionTree {\n if (typeof code !== 'string') throw new ParseError(`Cannot parse ${code}`, String(code));\n let str = ' ' + code;\n const constants: IConstants = {\n strings: [],\n literals: [],\n regexes: [],\n eager,\n maxDepth: maxParserRecursionDepth,\n };\n str = extractConstants(constants, str).str;\n\n for (const l of constants.literals) {\n l[2] = l.tempJsStrings!.map((js: string) => lispifyExpr(constants, new CodeString(js)));\n delete l.tempJsStrings;\n }\n return { tree: lispifyFunction(new CodeString(str), constants, expression), constants };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare class CodeString {
|
|
2
|
+
start: number;
|
|
3
|
+
end: number;
|
|
4
|
+
ref: {
|
|
5
|
+
str: string;
|
|
6
|
+
};
|
|
7
|
+
constructor(str: string | CodeString);
|
|
8
|
+
substring(start: number, end?: number): CodeString;
|
|
9
|
+
get length(): number;
|
|
10
|
+
char(i: number): string | undefined;
|
|
11
|
+
toString(): string;
|
|
12
|
+
trimStart(): CodeString;
|
|
13
|
+
slice(start: number, end?: number): CodeString;
|
|
14
|
+
trim(): CodeString;
|
|
15
|
+
valueOf(): string;
|
|
16
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
//#region src/utils/CodeString.ts
|
|
2
|
+
var CodeString = class CodeString {
|
|
3
|
+
constructor(str) {
|
|
4
|
+
this.ref = { str: "" };
|
|
5
|
+
if (str instanceof CodeString) {
|
|
6
|
+
this.ref = str.ref;
|
|
7
|
+
this.start = str.start;
|
|
8
|
+
this.end = str.end;
|
|
9
|
+
} else {
|
|
10
|
+
this.ref.str = str;
|
|
11
|
+
this.start = 0;
|
|
12
|
+
this.end = str.length;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
substring(start, end) {
|
|
16
|
+
if (!this.length) return this;
|
|
17
|
+
start = this.start + start;
|
|
18
|
+
if (start < 0) start = 0;
|
|
19
|
+
if (start > this.end) start = this.end;
|
|
20
|
+
end = end === void 0 ? this.end : this.start + end;
|
|
21
|
+
if (end < 0) end = 0;
|
|
22
|
+
if (end > this.end) end = this.end;
|
|
23
|
+
const code = new CodeString(this);
|
|
24
|
+
code.start = start;
|
|
25
|
+
code.end = end;
|
|
26
|
+
return code;
|
|
27
|
+
}
|
|
28
|
+
get length() {
|
|
29
|
+
const len = this.end - this.start;
|
|
30
|
+
return len < 0 ? 0 : len;
|
|
31
|
+
}
|
|
32
|
+
char(i) {
|
|
33
|
+
if (this.start === this.end) return void 0;
|
|
34
|
+
return this.ref.str[this.start + i];
|
|
35
|
+
}
|
|
36
|
+
toString() {
|
|
37
|
+
return this.ref.str.substring(this.start, this.end);
|
|
38
|
+
}
|
|
39
|
+
trimStart() {
|
|
40
|
+
const found = /^\s+/.exec(this.toString());
|
|
41
|
+
const code = new CodeString(this);
|
|
42
|
+
if (found) code.start += found[0].length;
|
|
43
|
+
return code;
|
|
44
|
+
}
|
|
45
|
+
slice(start, end) {
|
|
46
|
+
if (start < 0) start = this.end - this.start + start;
|
|
47
|
+
if (start < 0) start = 0;
|
|
48
|
+
if (end === void 0) end = this.end - this.start;
|
|
49
|
+
if (end < 0) end = this.end - this.start + end;
|
|
50
|
+
if (end < 0) end = 0;
|
|
51
|
+
return this.substring(start, end);
|
|
52
|
+
}
|
|
53
|
+
trim() {
|
|
54
|
+
const code = this.trimStart();
|
|
55
|
+
const found = /\s+$/.exec(code.toString());
|
|
56
|
+
if (found) code.end -= found[0].length;
|
|
57
|
+
return code;
|
|
58
|
+
}
|
|
59
|
+
valueOf() {
|
|
60
|
+
return this.toString();
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
//#endregion
|
|
64
|
+
export { CodeString };
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=CodeString.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeString.js","names":[],"sources":["../../../src/utils/CodeString.ts"],"sourcesContent":["export class CodeString {\n start: number;\n end: number;\n ref: { str: string };\n constructor(str: string | CodeString) {\n this.ref = { str: '' };\n if (str instanceof CodeString) {\n this.ref = str.ref;\n this.start = str.start;\n this.end = str.end;\n } else {\n this.ref.str = str;\n this.start = 0;\n this.end = str.length;\n }\n }\n\n substring(start: number, end?: number): CodeString {\n if (!this.length) return this;\n start = this.start + start;\n if (start < 0) {\n start = 0;\n }\n if (start > this.end) {\n start = this.end;\n }\n end = end === undefined ? this.end : this.start + end;\n if (end < 0) {\n end = 0;\n }\n if (end > this.end) {\n end = this.end;\n }\n const code = new CodeString(this);\n code.start = start;\n code.end = end;\n return code;\n }\n\n get length() {\n const len = this.end - this.start;\n return len < 0 ? 0 : len;\n }\n\n char(i: number) {\n if (this.start === this.end) return undefined;\n return this.ref.str[this.start + i];\n }\n\n toString() {\n return this.ref.str.substring(this.start, this.end);\n }\n\n trimStart() {\n const found = /^\\s+/.exec(this.toString());\n const code = new CodeString(this);\n if (found) {\n code.start += found[0].length;\n }\n return code;\n }\n\n slice(start: number, end?: number) {\n if (start < 0) {\n start = this.end - this.start + start;\n }\n if (start < 0) {\n start = 0;\n }\n if (end === undefined) {\n end = this.end - this.start;\n }\n\n if (end < 0) {\n end = this.end - this.start + end;\n }\n if (end < 0) {\n end = 0;\n }\n return this.substring(start, end);\n }\n\n trim() {\n const code = this.trimStart();\n const found = /\\s+$/.exec(code.toString());\n if (found) {\n code.end -= found[0].length;\n }\n return code;\n }\n\n valueOf() {\n return this.toString();\n }\n}\n"],"mappings":";AAAA,IAAa,aAAb,MAAa,WAAW;CAItB,YAAY,KAA0B;AACpC,OAAK,MAAM,EAAE,KAAK,IAAI;AACtB,MAAI,eAAe,YAAY;AAC7B,QAAK,MAAM,IAAI;AACf,QAAK,QAAQ,IAAI;AACjB,QAAK,MAAM,IAAI;SACV;AACL,QAAK,IAAI,MAAM;AACf,QAAK,QAAQ;AACb,QAAK,MAAM,IAAI;;;CAInB,UAAU,OAAe,KAA0B;AACjD,MAAI,CAAC,KAAK,OAAQ,QAAO;AACzB,UAAQ,KAAK,QAAQ;AACrB,MAAI,QAAQ,EACV,SAAQ;AAEV,MAAI,QAAQ,KAAK,IACf,SAAQ,KAAK;AAEf,QAAM,QAAQ,KAAA,IAAY,KAAK,MAAM,KAAK,QAAQ;AAClD,MAAI,MAAM,EACR,OAAM;AAER,MAAI,MAAM,KAAK,IACb,OAAM,KAAK;EAEb,MAAM,OAAO,IAAI,WAAW,KAAK;AACjC,OAAK,QAAQ;AACb,OAAK,MAAM;AACX,SAAO;;CAGT,IAAI,SAAS;EACX,MAAM,MAAM,KAAK,MAAM,KAAK;AAC5B,SAAO,MAAM,IAAI,IAAI;;CAGvB,KAAK,GAAW;AACd,MAAI,KAAK,UAAU,KAAK,IAAK,QAAO,KAAA;AACpC,SAAO,KAAK,IAAI,IAAI,KAAK,QAAQ;;CAGnC,WAAW;AACT,SAAO,KAAK,IAAI,IAAI,UAAU,KAAK,OAAO,KAAK,IAAI;;CAGrD,YAAY;EACV,MAAM,QAAQ,OAAO,KAAK,KAAK,UAAU,CAAC;EAC1C,MAAM,OAAO,IAAI,WAAW,KAAK;AACjC,MAAI,MACF,MAAK,SAAS,MAAM,GAAG;AAEzB,SAAO;;CAGT,MAAM,OAAe,KAAc;AACjC,MAAI,QAAQ,EACV,SAAQ,KAAK,MAAM,KAAK,QAAQ;AAElC,MAAI,QAAQ,EACV,SAAQ;AAEV,MAAI,QAAQ,KAAA,EACV,OAAM,KAAK,MAAM,KAAK;AAGxB,MAAI,MAAM,EACR,OAAM,KAAK,MAAM,KAAK,QAAQ;AAEhC,MAAI,MAAM,EACR,OAAM;AAER,SAAO,KAAK,UAAU,OAAO,IAAI;;CAGnC,OAAO;EACL,MAAM,OAAO,KAAK,WAAW;EAC7B,MAAM,QAAQ,OAAO,KAAK,KAAK,UAAU,CAAC;AAC1C,MAAI,MACF,MAAK,OAAO,MAAM,GAAG;AAEvB,SAAO;;CAGT,UAAU;AACR,SAAO,KAAK,UAAU"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { IEvalContext } from '../eval';
|
|
2
|
+
import { Change } from '../executor';
|
|
3
|
+
import { IConstants, IExecutionTree, Lisp, LispItem } from '../parser';
|
|
4
|
+
import { default as SandboxExec } from '../SandboxExec';
|
|
5
|
+
import { IContext, IExecContext, IOptions, ISandboxGlobal, SandboxSymbolContext, SubscriptionSubject } from './types';
|
|
6
|
+
export declare class ExecContext implements IExecContext {
|
|
7
|
+
ctx: IContext;
|
|
8
|
+
constants: IConstants;
|
|
9
|
+
tree: Lisp[];
|
|
10
|
+
getSubscriptions: Set<(obj: SubscriptionSubject, name: string) => void>;
|
|
11
|
+
setSubscriptions: WeakMap<SubscriptionSubject, Map<string, Set<(modification: Change) => void>>>;
|
|
12
|
+
changeSubscriptions: WeakMap<SubscriptionSubject, Set<(modification: Change) => void>>;
|
|
13
|
+
setSubscriptionsGlobal: WeakMap<SubscriptionSubject, Map<string, Set<(modification: Change) => void>>>;
|
|
14
|
+
changeSubscriptionsGlobal: WeakMap<SubscriptionSubject, Set<(modification: Change) => void>>;
|
|
15
|
+
evals: Map<any, any>;
|
|
16
|
+
registerSandboxFunction: (fn: (...args: any[]) => any) => void;
|
|
17
|
+
allowJit: boolean;
|
|
18
|
+
evalContext?: IEvalContext | undefined;
|
|
19
|
+
constructor(ctx: IContext, constants: IConstants, tree: Lisp[], getSubscriptions: Set<(obj: SubscriptionSubject, name: string) => void>, setSubscriptions: WeakMap<SubscriptionSubject, Map<string, Set<(modification: Change) => void>>>, changeSubscriptions: WeakMap<SubscriptionSubject, Set<(modification: Change) => void>>, setSubscriptionsGlobal: WeakMap<SubscriptionSubject, Map<string, Set<(modification: Change) => void>>>, changeSubscriptionsGlobal: WeakMap<SubscriptionSubject, Set<(modification: Change) => void>>, evals: Map<any, any>, registerSandboxFunction: (fn: (...args: any[]) => any) => void, allowJit: boolean, evalContext?: IEvalContext | undefined);
|
|
20
|
+
}
|
|
21
|
+
export declare function getSandboxSymbolCtor(symbols: SandboxSymbolContext): Function;
|
|
22
|
+
interface SandboxGlobalConstructor {
|
|
23
|
+
new (): ISandboxGlobal;
|
|
24
|
+
}
|
|
25
|
+
export declare function sandboxedGlobal(globals: ISandboxGlobal): SandboxGlobalConstructor;
|
|
26
|
+
export declare function createContext(sandbox: SandboxExec, options: IOptions): IContext;
|
|
27
|
+
export declare function createExecContext(sandbox: {
|
|
28
|
+
readonly setSubscriptions: WeakMap<SubscriptionSubject, Map<string, Set<(modification: Change) => void>>>;
|
|
29
|
+
readonly changeSubscriptions: WeakMap<SubscriptionSubject, Set<(modification: Change) => void>>;
|
|
30
|
+
readonly sandboxFunctions: WeakMap<(...args: any[]) => any, IExecContext>;
|
|
31
|
+
readonly context: IContext;
|
|
32
|
+
}, executionTree: IExecutionTree, evalContext?: IEvalContext): IExecContext;
|
|
33
|
+
export declare function isLisp<Type extends Lisp = Lisp>(item: LispItem | LispItem): item is Type;
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { AsyncFunction, AsyncGeneratorFunction, GeneratorFunction, LispType, NON_BLOCKING_THRESHOLD } from "./types.js";
|
|
2
|
+
import { DEFAULT_FUNCTION_REPLACEMENTS } from "./functionReplacements.js";
|
|
3
|
+
import { hasOwnProperty } from "./Prop.js";
|
|
4
|
+
import { Scope } from "./Scope.js";
|
|
5
|
+
//#region src/utils/ExecContext.ts
|
|
6
|
+
var ExecContext = class {
|
|
7
|
+
constructor(ctx, constants, tree, getSubscriptions, setSubscriptions, changeSubscriptions, setSubscriptionsGlobal, changeSubscriptionsGlobal, evals, registerSandboxFunction, allowJit, evalContext) {
|
|
8
|
+
this.ctx = ctx;
|
|
9
|
+
this.constants = constants;
|
|
10
|
+
this.tree = tree;
|
|
11
|
+
this.getSubscriptions = getSubscriptions;
|
|
12
|
+
this.setSubscriptions = setSubscriptions;
|
|
13
|
+
this.changeSubscriptions = changeSubscriptions;
|
|
14
|
+
this.setSubscriptionsGlobal = setSubscriptionsGlobal;
|
|
15
|
+
this.changeSubscriptionsGlobal = changeSubscriptionsGlobal;
|
|
16
|
+
this.evals = evals;
|
|
17
|
+
this.registerSandboxFunction = registerSandboxFunction;
|
|
18
|
+
this.allowJit = allowJit;
|
|
19
|
+
this.evalContext = evalContext;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
function createSandboxSymbolContext(symbolWhitelist) {
|
|
23
|
+
return {
|
|
24
|
+
registry: /* @__PURE__ */ new Map(),
|
|
25
|
+
reverseRegistry: /* @__PURE__ */ new Map(),
|
|
26
|
+
whitelist: { ...symbolWhitelist }
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
var RESERVED_SYMBOL_PROPERTIES = new Set([
|
|
30
|
+
"length",
|
|
31
|
+
"name",
|
|
32
|
+
"prototype",
|
|
33
|
+
"for",
|
|
34
|
+
"keyFor"
|
|
35
|
+
]);
|
|
36
|
+
function copyWhitelistedSymbols(target, symbolWhitelist) {
|
|
37
|
+
for (const [key, value] of Object.entries(symbolWhitelist)) {
|
|
38
|
+
if (RESERVED_SYMBOL_PROPERTIES.has(key)) continue;
|
|
39
|
+
const descriptor = Object.getOwnPropertyDescriptor(Symbol, key);
|
|
40
|
+
if (descriptor) Object.defineProperty(target, key, descriptor);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function getSandboxSymbolCtor(symbols) {
|
|
44
|
+
if (symbols.ctor) return symbols.ctor;
|
|
45
|
+
function SandboxSymbol(description) {
|
|
46
|
+
if (new.target) throw new TypeError("Symbol is not a constructor");
|
|
47
|
+
return Symbol(description === void 0 ? void 0 : String(description));
|
|
48
|
+
}
|
|
49
|
+
copyWhitelistedSymbols(SandboxSymbol, symbols.whitelist);
|
|
50
|
+
Object.defineProperties(SandboxSymbol, {
|
|
51
|
+
prototype: {
|
|
52
|
+
value: Symbol.prototype,
|
|
53
|
+
enumerable: false,
|
|
54
|
+
configurable: false,
|
|
55
|
+
writable: false
|
|
56
|
+
},
|
|
57
|
+
for: {
|
|
58
|
+
value(key) {
|
|
59
|
+
const stringKey = String(key);
|
|
60
|
+
let symbol = symbols.registry.get(stringKey);
|
|
61
|
+
if (!symbol) {
|
|
62
|
+
symbol = Symbol(stringKey);
|
|
63
|
+
symbols.registry.set(stringKey, symbol);
|
|
64
|
+
symbols.reverseRegistry.set(symbol, stringKey);
|
|
65
|
+
}
|
|
66
|
+
return symbol;
|
|
67
|
+
},
|
|
68
|
+
enumerable: false,
|
|
69
|
+
configurable: true,
|
|
70
|
+
writable: true
|
|
71
|
+
},
|
|
72
|
+
keyFor: {
|
|
73
|
+
value(symbol) {
|
|
74
|
+
return typeof symbol === "symbol" ? symbols.reverseRegistry.get(symbol) : void 0;
|
|
75
|
+
},
|
|
76
|
+
enumerable: false,
|
|
77
|
+
configurable: true,
|
|
78
|
+
writable: true
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
symbols.ctor = SandboxSymbol;
|
|
82
|
+
return SandboxSymbol;
|
|
83
|
+
}
|
|
84
|
+
function SandboxGlobal() {}
|
|
85
|
+
function sandboxedGlobal(globals) {
|
|
86
|
+
SG.prototype = SandboxGlobal.prototype;
|
|
87
|
+
return SG;
|
|
88
|
+
function SG() {
|
|
89
|
+
for (const i in globals) this[i] = globals[i];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function createContext(sandbox, options) {
|
|
93
|
+
const sandboxSymbols = createSandboxSymbolContext(options.symbolWhitelist);
|
|
94
|
+
const sandboxGlobal = new (sandboxedGlobal(options.globals))();
|
|
95
|
+
const context = {
|
|
96
|
+
sandbox,
|
|
97
|
+
globalsWhitelist: new Set(Object.values(options.globals)),
|
|
98
|
+
prototypeWhitelist: new Map([...options.prototypeWhitelist].map((a) => [a[0].prototype, a[1]])),
|
|
99
|
+
sandboxSymbols,
|
|
100
|
+
options,
|
|
101
|
+
globalScope: new Scope(null, sandboxGlobal, sandboxGlobal),
|
|
102
|
+
sandboxGlobal,
|
|
103
|
+
ticks: {
|
|
104
|
+
ticks: 0n,
|
|
105
|
+
tickLimit: options.executionQuota,
|
|
106
|
+
nextYield: options.nonBlocking ? NON_BLOCKING_THRESHOLD : void 0
|
|
107
|
+
},
|
|
108
|
+
sandboxedFunctions: /* @__PURE__ */ new WeakSet()
|
|
109
|
+
};
|
|
110
|
+
context.prototypeWhitelist.set(Object.getPrototypeOf(sandboxGlobal), /* @__PURE__ */ new Set());
|
|
111
|
+
context.prototypeWhitelist.set(Object.getPrototypeOf([][Symbol.iterator]()), /* @__PURE__ */ new Set());
|
|
112
|
+
const genProto = Object.getPrototypeOf((function* () {})());
|
|
113
|
+
context.prototypeWhitelist.set(Object.getPrototypeOf(genProto), /* @__PURE__ */ new Set());
|
|
114
|
+
const asyncGenProto = Object.getPrototypeOf((async function* () {})());
|
|
115
|
+
context.prototypeWhitelist.set(Object.getPrototypeOf(asyncGenProto), /* @__PURE__ */ new Set());
|
|
116
|
+
if (typeof Response !== "undefined") context.prototypeWhitelist.set(Response.prototype, /* @__PURE__ */ new Set());
|
|
117
|
+
if (typeof Request !== "undefined") context.prototypeWhitelist.set(Request.prototype, /* @__PURE__ */ new Set());
|
|
118
|
+
if (typeof Headers !== "undefined") context.prototypeWhitelist.set(Headers.prototype, /* @__PURE__ */ new Set());
|
|
119
|
+
if (typeof FormData !== "undefined") context.prototypeWhitelist.set(FormData.prototype, /* @__PURE__ */ new Set());
|
|
120
|
+
if (typeof Blob !== "undefined") context.prototypeWhitelist.set(Blob.prototype, /* @__PURE__ */ new Set());
|
|
121
|
+
if (typeof URLSearchParams !== "undefined") context.prototypeWhitelist.set(URLSearchParams.prototype, /* @__PURE__ */ new Set());
|
|
122
|
+
if (typeof AbortController !== "undefined") context.prototypeWhitelist.set(AbortController.prototype, /* @__PURE__ */ new Set());
|
|
123
|
+
if (typeof ReadableStream !== "undefined") context.prototypeWhitelist.set(ReadableStream.prototype, /* @__PURE__ */ new Set());
|
|
124
|
+
if (typeof TransformStream !== "undefined") context.prototypeWhitelist.set(TransformStream.prototype, /* @__PURE__ */ new Set());
|
|
125
|
+
if (typeof WritableStream !== "undefined") context.prototypeWhitelist.set(WritableStream.prototype, /* @__PURE__ */ new Set());
|
|
126
|
+
if (typeof TextEncoder !== "undefined") context.prototypeWhitelist.set(TextEncoder.prototype, /* @__PURE__ */ new Set());
|
|
127
|
+
if (typeof TextDecoder !== "undefined") context.prototypeWhitelist.set(TextDecoder.prototype, /* @__PURE__ */ new Set());
|
|
128
|
+
return context;
|
|
129
|
+
}
|
|
130
|
+
function createExecContext(sandbox, executionTree, evalContext) {
|
|
131
|
+
const evals = /* @__PURE__ */ new Map();
|
|
132
|
+
const execContext = new ExecContext(sandbox.context, executionTree.constants, executionTree.tree, /* @__PURE__ */ new Set(), /* @__PURE__ */ new WeakMap(), /* @__PURE__ */ new WeakMap(), sandbox.setSubscriptions, sandbox.changeSubscriptions, evals, (fn) => sandbox.sandboxFunctions.set(fn, execContext), !!evalContext, evalContext);
|
|
133
|
+
if (evalContext) {
|
|
134
|
+
const func = evalContext.sandboxFunction(execContext);
|
|
135
|
+
const asyncFunc = evalContext.sandboxAsyncFunction(execContext);
|
|
136
|
+
const genFunc = evalContext.sandboxGeneratorFunction(execContext);
|
|
137
|
+
const asyncGenFunc = evalContext.sandboxAsyncGeneratorFunction(execContext);
|
|
138
|
+
const sandboxSymbol = evalContext.sandboxedSymbol(execContext);
|
|
139
|
+
evals.set(Function, func);
|
|
140
|
+
evals.set(AsyncFunction, asyncFunc);
|
|
141
|
+
evals.set(GeneratorFunction, genFunc);
|
|
142
|
+
evals.set(AsyncGeneratorFunction, asyncGenFunc);
|
|
143
|
+
evals.set(Symbol, sandboxSymbol);
|
|
144
|
+
evals.set(eval, evalContext.sandboxedEval(func, execContext));
|
|
145
|
+
evals.set(setTimeout, evalContext.sandboxedSetTimeout(func, execContext));
|
|
146
|
+
evals.set(setInterval, evalContext.sandboxedSetInterval(func, execContext));
|
|
147
|
+
evals.set(clearTimeout, evalContext.sandboxedClearTimeout(execContext));
|
|
148
|
+
evals.set(clearInterval, evalContext.sandboxedClearInterval(execContext));
|
|
149
|
+
for (const [original, factory] of DEFAULT_FUNCTION_REPLACEMENTS) evals.set(original, factory(execContext));
|
|
150
|
+
for (const [original, factory] of sandbox.context.options.functionReplacements) evals.set(original, factory(execContext, evals.get(original)));
|
|
151
|
+
const ptwl = sandbox.context.prototypeWhitelist;
|
|
152
|
+
for (const [key, value] of evals) {
|
|
153
|
+
if (!ptwl.has(key.prototype)) ptwl.set(key.prototype, /* @__PURE__ */ new Set());
|
|
154
|
+
if (!ptwl.has(value.prototype)) ptwl.set(value.prototype, ptwl.get(key.prototype) || /* @__PURE__ */ new Set());
|
|
155
|
+
if (sandbox.context.globalsWhitelist.has(key)) sandbox.context.globalsWhitelist.add(value);
|
|
156
|
+
if (hasOwnProperty(sandbox.context.sandboxGlobal, key.name)) sandbox.context.sandboxGlobal[key.name] = value;
|
|
157
|
+
}
|
|
158
|
+
if (sandbox.context.sandboxGlobal.globalThis) sandbox.context.sandboxGlobal.globalThis = sandbox.context.sandboxGlobal;
|
|
159
|
+
}
|
|
160
|
+
return execContext;
|
|
161
|
+
}
|
|
162
|
+
function isLisp(item) {
|
|
163
|
+
return Array.isArray(item) && typeof item[0] === "number" && item[0] !== LispType.None && item[0] !== LispType.True;
|
|
164
|
+
}
|
|
165
|
+
//#endregion
|
|
166
|
+
export { ExecContext, createContext, createExecContext, getSandboxSymbolCtor, isLisp, sandboxedGlobal };
|
|
167
|
+
|
|
168
|
+
//# sourceMappingURL=ExecContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExecContext.js","names":[],"sources":["../../../src/utils/ExecContext.ts"],"sourcesContent":["import type { IEvalContext } from '../eval';\nimport type { Change } from '../executor';\nimport { DEFAULT_FUNCTION_REPLACEMENTS } from './functionReplacements';\nimport type { IConstants, IExecutionTree, Lisp, LispItem } from '../parser';\nimport type SandboxExec from '../SandboxExec';\nimport {\n AsyncFunction,\n GeneratorFunction,\n AsyncGeneratorFunction,\n NON_BLOCKING_THRESHOLD,\n LispType,\n type IContext,\n type IExecContext,\n type IOptions,\n type ISymbolWhitelist,\n type ISandboxGlobal,\n type SandboxSymbolContext,\n type SubscriptionSubject,\n} from './types';\nimport { Scope } from './Scope';\nimport { hasOwnProperty } from './Prop';\n\nexport class ExecContext implements IExecContext {\n constructor(\n public ctx: IContext,\n public constants: IConstants,\n public tree: Lisp[],\n public getSubscriptions: Set<(obj: SubscriptionSubject, name: string) => void>,\n public setSubscriptions: WeakMap<\n SubscriptionSubject,\n Map<string, Set<(modification: Change) => void>>\n >,\n public changeSubscriptions: WeakMap<SubscriptionSubject, Set<(modification: Change) => void>>,\n public setSubscriptionsGlobal: WeakMap<\n SubscriptionSubject,\n Map<string, Set<(modification: Change) => void>>\n >,\n public changeSubscriptionsGlobal: WeakMap<\n SubscriptionSubject,\n Set<(modification: Change) => void>\n >,\n public evals: Map<any, any>,\n public registerSandboxFunction: (fn: (...args: any[]) => any) => void,\n public allowJit: boolean,\n public evalContext?: IEvalContext,\n ) {}\n}\n\nfunction createSandboxSymbolContext(symbolWhitelist: ISymbolWhitelist): SandboxSymbolContext {\n return {\n registry: new Map<string, symbol>(),\n reverseRegistry: new Map<symbol, string>(),\n whitelist: { ...symbolWhitelist },\n };\n}\n\nconst RESERVED_SYMBOL_PROPERTIES = new Set(['length', 'name', 'prototype', 'for', 'keyFor']);\n\nfunction copyWhitelistedSymbols(target: Function, symbolWhitelist: ISymbolWhitelist) {\n for (const [key, value] of Object.entries(symbolWhitelist)) {\n if (RESERVED_SYMBOL_PROPERTIES.has(key)) continue;\n const descriptor = Object.getOwnPropertyDescriptor(Symbol, key);\n if (descriptor) {\n Object.defineProperty(target, key, descriptor);\n }\n }\n}\n\nexport function getSandboxSymbolCtor(symbols: SandboxSymbolContext) {\n if (symbols.ctor) {\n return symbols.ctor;\n }\n\n function SandboxSymbol(this: unknown, description?: unknown) {\n if (new.target) {\n throw new TypeError('Symbol is not a constructor');\n }\n return Symbol(description === undefined ? undefined : String(description));\n }\n\n copyWhitelistedSymbols(SandboxSymbol, symbols.whitelist);\n Object.defineProperties(SandboxSymbol, {\n prototype: {\n value: Symbol.prototype,\n enumerable: false,\n configurable: false,\n writable: false,\n },\n for: {\n value(key: unknown) {\n const stringKey = String(key);\n let symbol = symbols.registry.get(stringKey);\n if (!symbol) {\n symbol = Symbol(stringKey);\n symbols.registry.set(stringKey, symbol);\n symbols.reverseRegistry.set(symbol, stringKey);\n }\n return symbol;\n },\n enumerable: false,\n configurable: true,\n writable: true,\n },\n keyFor: {\n value(symbol: unknown) {\n return typeof symbol === 'symbol' ? symbols.reverseRegistry.get(symbol) : undefined;\n },\n enumerable: false,\n configurable: true,\n writable: true,\n },\n });\n\n symbols.ctor = SandboxSymbol;\n return SandboxSymbol;\n}\n\nfunction SandboxGlobal() {}\ninterface SandboxGlobalConstructor {\n new (): ISandboxGlobal;\n}\nexport function sandboxedGlobal(globals: ISandboxGlobal): SandboxGlobalConstructor {\n SG.prototype = SandboxGlobal.prototype;\n return SG as unknown as SandboxGlobalConstructor;\n function SG(this: ISandboxGlobal) {\n for (const i in globals) {\n this[i] = globals[i];\n }\n }\n}\n\nexport function createContext(sandbox: SandboxExec, options: IOptions): IContext {\n const sandboxSymbols = createSandboxSymbolContext(options.symbolWhitelist);\n const SandboxGlobal = sandboxedGlobal(options.globals);\n const sandboxGlobal = new SandboxGlobal();\n const context: IContext = {\n sandbox: sandbox,\n globalsWhitelist: new Set(Object.values(options.globals)),\n prototypeWhitelist: new Map([...options.prototypeWhitelist].map((a) => [a[0].prototype, a[1]])),\n sandboxSymbols,\n options,\n globalScope: new Scope(null, sandboxGlobal, sandboxGlobal),\n sandboxGlobal,\n ticks: {\n ticks: 0n,\n tickLimit: options.executionQuota,\n nextYield: options.nonBlocking ? NON_BLOCKING_THRESHOLD : undefined,\n },\n sandboxedFunctions: new WeakSet<Function>(),\n };\n context.prototypeWhitelist.set(Object.getPrototypeOf(sandboxGlobal), new Set());\n context.prototypeWhitelist.set(Object.getPrototypeOf([][Symbol.iterator]()) as object, new Set());\n // Whitelist Generator and AsyncGenerator prototype chains\n const genProto = Object.getPrototypeOf((function* () {})());\n context.prototypeWhitelist.set(Object.getPrototypeOf(genProto), new Set());\n const asyncGenProto = Object.getPrototypeOf((async function* () {})());\n context.prototypeWhitelist.set(Object.getPrototypeOf(asyncGenProto), new Set());\n // Fetch API 构造函数本身(静态方法如 Response.json)也加白名单\n if (typeof Response !== 'undefined')\n context.prototypeWhitelist.set(Response.prototype, new Set());\n if (typeof Request !== 'undefined') context.prototypeWhitelist.set(Request.prototype, new Set());\n if (typeof Headers !== 'undefined') context.prototypeWhitelist.set(Headers.prototype, new Set());\n if (typeof FormData !== 'undefined')\n context.prototypeWhitelist.set(FormData.prototype, new Set());\n if (typeof Blob !== 'undefined') context.prototypeWhitelist.set(Blob.prototype, new Set());\n if (typeof URLSearchParams !== 'undefined')\n context.prototypeWhitelist.set(URLSearchParams.prototype, new Set());\n if (typeof AbortController !== 'undefined')\n context.prototypeWhitelist.set(AbortController.prototype, new Set());\n if (typeof ReadableStream !== 'undefined')\n context.prototypeWhitelist.set(ReadableStream.prototype, new Set());\n if (typeof TransformStream !== 'undefined')\n context.prototypeWhitelist.set(TransformStream.prototype, new Set());\n if (typeof WritableStream !== 'undefined')\n context.prototypeWhitelist.set(WritableStream.prototype, new Set());\n if (typeof TextEncoder !== 'undefined')\n context.prototypeWhitelist.set(TextEncoder.prototype, new Set());\n if (typeof TextDecoder !== 'undefined')\n context.prototypeWhitelist.set(TextDecoder.prototype, new Set());\n return context;\n}\n\nexport function createExecContext(\n sandbox: {\n readonly setSubscriptions: WeakMap<\n SubscriptionSubject,\n Map<string, Set<(modification: Change) => void>>\n >;\n readonly changeSubscriptions: WeakMap<SubscriptionSubject, Set<(modification: Change) => void>>;\n readonly sandboxFunctions: WeakMap<(...args: any[]) => any, IExecContext>;\n readonly context: IContext;\n },\n executionTree: IExecutionTree,\n evalContext?: IEvalContext,\n): IExecContext {\n const evals = new Map();\n const execContext: IExecContext = new ExecContext(\n sandbox.context,\n executionTree.constants,\n executionTree.tree,\n new Set<(obj: SubscriptionSubject, name: string) => void>(),\n new WeakMap<SubscriptionSubject, Map<string, Set<(modification: Change) => void>>>(),\n new WeakMap<SubscriptionSubject, Set<(modification: Change) => void>>(),\n sandbox.setSubscriptions,\n sandbox.changeSubscriptions,\n evals,\n (fn: any) => sandbox.sandboxFunctions.set(fn, execContext),\n !!evalContext,\n evalContext,\n );\n if (evalContext) {\n const func = evalContext.sandboxFunction(execContext);\n const asyncFunc = evalContext.sandboxAsyncFunction(execContext);\n const genFunc = evalContext.sandboxGeneratorFunction(execContext);\n const asyncGenFunc = evalContext.sandboxAsyncGeneratorFunction(execContext);\n const sandboxSymbol = evalContext.sandboxedSymbol(execContext);\n evals.set(Function, func);\n evals.set(AsyncFunction, asyncFunc);\n evals.set(GeneratorFunction, genFunc);\n evals.set(AsyncGeneratorFunction, asyncGenFunc);\n evals.set(Symbol, sandboxSymbol);\n evals.set(eval, evalContext.sandboxedEval(func, execContext));\n evals.set(setTimeout, evalContext.sandboxedSetTimeout(func, execContext));\n evals.set(setInterval, evalContext.sandboxedSetInterval(func, execContext));\n evals.set(clearTimeout, evalContext.sandboxedClearTimeout(execContext));\n evals.set(clearInterval, evalContext.sandboxedClearInterval(execContext));\n\n for (const [original, factory] of DEFAULT_FUNCTION_REPLACEMENTS) {\n evals.set(original, factory(execContext));\n }\n\n for (const [original, factory] of sandbox.context.options.functionReplacements) {\n evals.set(original, factory(execContext, evals.get(original)));\n }\n\n const ptwl = sandbox.context.prototypeWhitelist;\n\n for (const [key, value] of evals) {\n if (!ptwl.has(key.prototype)) {\n ptwl.set(key.prototype, new Set());\n }\n if (!ptwl.has(value.prototype)) {\n ptwl.set(value.prototype, ptwl.get(key.prototype) || new Set());\n }\n if (sandbox.context.globalsWhitelist.has(key)) {\n sandbox.context.globalsWhitelist.add(value);\n }\n if (hasOwnProperty(sandbox.context.sandboxGlobal, key.name)) {\n sandbox.context.sandboxGlobal[key.name] = value;\n }\n }\n if (sandbox.context.sandboxGlobal.globalThis) {\n sandbox.context.sandboxGlobal.globalThis = sandbox.context.sandboxGlobal;\n }\n }\n return execContext;\n}\n\nexport function isLisp<Type extends Lisp = Lisp>(item: LispItem | LispItem): item is Type {\n return (\n Array.isArray(item) &&\n typeof item[0] === 'number' &&\n item[0] !== LispType.None &&\n item[0] !== LispType.True\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { IExecContext } from './types';
|
|
2
|
+
export declare class Prop<T = unknown> {
|
|
3
|
+
context: T;
|
|
4
|
+
prop: PropertyKey;
|
|
5
|
+
isConst: boolean;
|
|
6
|
+
isGlobal: boolean;
|
|
7
|
+
isVariable: boolean;
|
|
8
|
+
isInternal: boolean;
|
|
9
|
+
constructor(context: T, prop: PropertyKey, isConst?: boolean, isGlobal?: boolean, isVariable?: boolean, isInternal?: boolean);
|
|
10
|
+
get<T = unknown>(context: IExecContext): T;
|
|
11
|
+
}
|
|
12
|
+
export declare function hasOwnProperty(obj: unknown, prop: PropertyKey): boolean;
|
|
13
|
+
export declare function getReplacementReceiver(fn: Function): object | undefined;
|
|
14
|
+
export declare function resolveSandboxProp(val: unknown, context: IExecContext, prop?: Prop): Prop<{
|
|
15
|
+
[x: string]: unknown;
|
|
16
|
+
}> | undefined;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { THIS_DEPENDENT_FUNCTION_REPLACEMENTS } from "./functionReplacements.js";
|
|
2
|
+
//#region src/utils/Prop.ts
|
|
3
|
+
var boundFunctionCache = /* @__PURE__ */ new WeakMap();
|
|
4
|
+
var replacementReceiver = /* @__PURE__ */ new WeakMap();
|
|
5
|
+
var Prop = class {
|
|
6
|
+
constructor(context, prop, isConst = false, isGlobal = false, isVariable = false, isInternal = false) {
|
|
7
|
+
this.context = context;
|
|
8
|
+
this.prop = prop;
|
|
9
|
+
this.isConst = isConst;
|
|
10
|
+
this.isGlobal = isGlobal;
|
|
11
|
+
this.isVariable = isVariable;
|
|
12
|
+
this.isInternal = isInternal;
|
|
13
|
+
}
|
|
14
|
+
get(context) {
|
|
15
|
+
const ctx = this.context;
|
|
16
|
+
if (ctx === void 0) throw new ReferenceError(`${this.prop.toString()} is not defined`);
|
|
17
|
+
if (ctx === null) throw new TypeError(`Cannot read properties of null, (reading '${this.prop.toString()}')`);
|
|
18
|
+
context.getSubscriptions.forEach((cb) => cb(ctx, this.prop.toString()));
|
|
19
|
+
const val = ctx[this.prop];
|
|
20
|
+
return getReplacementValue(val, context, ctx);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
function hasOwnProperty(obj, prop) {
|
|
24
|
+
return Object.prototype.hasOwnProperty.call(obj, prop);
|
|
25
|
+
}
|
|
26
|
+
function getReplacementReceiver(fn) {
|
|
27
|
+
return replacementReceiver.get(fn);
|
|
28
|
+
}
|
|
29
|
+
function resolveSandboxProp(val, context, prop) {
|
|
30
|
+
if (!val) return;
|
|
31
|
+
if (val instanceof Prop) {
|
|
32
|
+
if (!prop) prop = val;
|
|
33
|
+
val = val.get(context);
|
|
34
|
+
}
|
|
35
|
+
const p = prop?.prop || "prop";
|
|
36
|
+
if (val === globalThis) return new Prop({ [p]: context.ctx.sandboxGlobal }, p, prop?.isConst || false, false, prop?.isVariable || false);
|
|
37
|
+
if (prop && !prop.isVariable) return;
|
|
38
|
+
const replacement = getReplacementValue(val, context, prop?.context);
|
|
39
|
+
if (replacement !== val) return new Prop({ [p]: replacement }, p, prop?.isConst || false, prop?.isGlobal || false, prop?.isVariable || false);
|
|
40
|
+
}
|
|
41
|
+
function getReplacementValue(val, context, bindContext) {
|
|
42
|
+
if (typeof val !== "function") return val;
|
|
43
|
+
const replacement = context.evals.get(val);
|
|
44
|
+
if (replacement === void 0) return val;
|
|
45
|
+
if (!shouldBindReplacement(val, bindContext, context)) return replacement;
|
|
46
|
+
return bindReplacement(replacement, bindContext, val, context);
|
|
47
|
+
}
|
|
48
|
+
function shouldBindReplacement(original, bindContext, context) {
|
|
49
|
+
return THIS_DEPENDENT_FUNCTION_REPLACEMENTS.has(original) && bindContext !== null && (typeof bindContext === "object" || typeof bindContext === "function") && bindContext !== context.ctx.sandboxGlobal && !context.ctx.globalsWhitelist.has(bindContext);
|
|
50
|
+
}
|
|
51
|
+
function bindReplacement(replacement, bindContext, original, context) {
|
|
52
|
+
let cache = boundFunctionCache.get(replacement);
|
|
53
|
+
if (!cache) {
|
|
54
|
+
cache = /* @__PURE__ */ new WeakMap();
|
|
55
|
+
boundFunctionCache.set(replacement, cache);
|
|
56
|
+
}
|
|
57
|
+
let bound = cache.get(bindContext);
|
|
58
|
+
if (bound) return bound;
|
|
59
|
+
bound = function(...args) {
|
|
60
|
+
return replacement.apply(this, args);
|
|
61
|
+
};
|
|
62
|
+
redefineFunctionMetadata(bound, original);
|
|
63
|
+
context.ctx.sandboxedFunctions.add(bound);
|
|
64
|
+
replacementReceiver.set(bound, bindContext);
|
|
65
|
+
cache.set(bindContext, bound);
|
|
66
|
+
return bound;
|
|
67
|
+
}
|
|
68
|
+
function redefineFunctionMetadata(target, source, overrides = {}) {
|
|
69
|
+
for (const key of ["name", "length"]) {
|
|
70
|
+
const descriptor = Object.getOwnPropertyDescriptor(source, key);
|
|
71
|
+
if (descriptor?.configurable) Object.defineProperty(target, key, {
|
|
72
|
+
...descriptor,
|
|
73
|
+
value: overrides[key] ?? source[key]
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//#endregion
|
|
78
|
+
export { Prop, getReplacementReceiver, hasOwnProperty, resolveSandboxProp };
|
|
79
|
+
|
|
80
|
+
//# sourceMappingURL=Prop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Prop.js","names":[],"sources":["../../../src/utils/Prop.ts"],"sourcesContent":["import type { IExecContext } from './types';\nimport { THIS_DEPENDENT_FUNCTION_REPLACEMENTS } from './functionReplacements';\n\nconst boundFunctionCache = new WeakMap<Function, WeakMap<object, Function>>();\nconst replacementReceiver = new WeakMap<Function, object>();\n\nexport class Prop<T = unknown> {\n constructor(\n public context: T,\n public prop: PropertyKey,\n public isConst = false,\n public isGlobal = false,\n public isVariable = false,\n public isInternal = false,\n ) {}\n\n get<T = unknown>(context: IExecContext): T {\n const ctx = this.context;\n if (ctx === undefined) throw new ReferenceError(`${this.prop.toString()} is not defined`);\n if (ctx === null)\n throw new TypeError(`Cannot read properties of null, (reading '${this.prop.toString()}')`);\n context.getSubscriptions.forEach((cb) => cb(ctx, this.prop.toString()));\n const val = (ctx as any)[this.prop];\n return getReplacementValue(val, context, ctx) as T;\n }\n}\n\nexport function hasOwnProperty(obj: unknown, prop: PropertyKey): boolean {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nexport function getReplacementReceiver(fn: Function) {\n return replacementReceiver.get(fn);\n}\n\nexport function resolveSandboxProp(val: unknown, context: IExecContext, prop?: Prop) {\n if (!val) return;\n if (val instanceof Prop) {\n if (!prop) {\n prop = val;\n }\n val = val.get(context);\n }\n const p = prop?.prop || 'prop';\n if (val === globalThis) {\n return new Prop(\n {\n [p]: context.ctx.sandboxGlobal,\n },\n p,\n prop?.isConst || false,\n false,\n prop?.isVariable || false,\n );\n }\n if (prop && !prop.isVariable) {\n return;\n }\n const replacement = getReplacementValue(val, context, prop?.context);\n if (replacement !== val) {\n return new Prop(\n { [p]: replacement },\n p,\n prop?.isConst || false,\n prop?.isGlobal || false,\n prop?.isVariable || false,\n );\n }\n}\n\nfunction getReplacementValue(val: unknown, context: IExecContext, bindContext?: unknown) {\n if (typeof val !== 'function') {\n return val;\n }\n const replacement = context.evals.get(val as Function);\n if (replacement === undefined) {\n return val;\n }\n if (!shouldBindReplacement(val as Function, bindContext, context)) {\n return replacement;\n }\n return bindReplacement(replacement, bindContext as object, val as Function, context);\n}\n\nfunction shouldBindReplacement(original: Function, bindContext: unknown, context: IExecContext) {\n return (\n THIS_DEPENDENT_FUNCTION_REPLACEMENTS.has(original) &&\n bindContext !== null &&\n (typeof bindContext === 'object' || typeof bindContext === 'function') &&\n bindContext !== context.ctx.sandboxGlobal &&\n !context.ctx.globalsWhitelist.has(bindContext)\n );\n}\n\nfunction bindReplacement(\n replacement: Function,\n bindContext: object,\n original: Function,\n context: IExecContext,\n) {\n let cache = boundFunctionCache.get(replacement);\n if (!cache) {\n cache = new WeakMap<object, Function>();\n boundFunctionCache.set(replacement, cache);\n }\n\n let bound = cache.get(bindContext);\n if (bound) {\n return bound;\n }\n\n bound = function (this: unknown, ...args: unknown[]) {\n return replacement.apply(this, args);\n };\n\n redefineFunctionMetadata(bound, original);\n context.ctx.sandboxedFunctions.add(bound);\n replacementReceiver.set(bound, bindContext);\n cache.set(bindContext, bound);\n return bound;\n}\n\nfunction redefineFunctionMetadata(\n target: Function,\n source: Function,\n overrides: Partial<Record<'name' | 'length', string | number>> = {},\n) {\n for (const key of ['name', 'length'] as const) {\n const descriptor = Object.getOwnPropertyDescriptor(source, key);\n if (descriptor?.configurable) {\n Object.defineProperty(target, key, {\n ...descriptor,\n value: overrides[key] ?? source[key],\n });\n }\n }\n}\n"],"mappings":"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"}
|