@next-core/cook 1.0.1

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 (78) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +3 -0
  3. package/dist/cjs/AnalysisContext.js +42 -0
  4. package/dist/cjs/AnalysisContext.js.map +1 -0
  5. package/dist/cjs/ExecutionContext.js +161 -0
  6. package/dist/cjs/ExecutionContext.js.map +1 -0
  7. package/dist/cjs/context-free.js +262 -0
  8. package/dist/cjs/context-free.js.map +1 -0
  9. package/dist/cjs/cook.js +1587 -0
  10. package/dist/cjs/cook.js.map +1 -0
  11. package/dist/cjs/hasOwnProperty.js +11 -0
  12. package/dist/cjs/hasOwnProperty.js.map +1 -0
  13. package/dist/cjs/index.js +58 -0
  14. package/dist/cjs/index.js.map +1 -0
  15. package/dist/cjs/interfaces.js +6 -0
  16. package/dist/cjs/interfaces.js.map +1 -0
  17. package/dist/cjs/lint.js +176 -0
  18. package/dist/cjs/lint.js.map +1 -0
  19. package/dist/cjs/parse.js +51 -0
  20. package/dist/cjs/parse.js.map +1 -0
  21. package/dist/cjs/precook.js +432 -0
  22. package/dist/cjs/precook.js.map +1 -0
  23. package/dist/cjs/precookFunction.js +25 -0
  24. package/dist/cjs/precookFunction.js.map +1 -0
  25. package/dist/cjs/preevaluate.js +35 -0
  26. package/dist/cjs/preevaluate.js.map +1 -0
  27. package/dist/cjs/sanitize.js +59 -0
  28. package/dist/cjs/sanitize.js.map +1 -0
  29. package/dist/cjs/traverse.js +168 -0
  30. package/dist/cjs/traverse.js.map +1 -0
  31. package/dist/esm/AnalysisContext.js +30 -0
  32. package/dist/esm/AnalysisContext.js.map +1 -0
  33. package/dist/esm/ExecutionContext.js +135 -0
  34. package/dist/esm/ExecutionContext.js.map +1 -0
  35. package/dist/esm/context-free.js +221 -0
  36. package/dist/esm/context-free.js.map +1 -0
  37. package/dist/esm/cook.js +1607 -0
  38. package/dist/esm/cook.js.map +1 -0
  39. package/dist/esm/hasOwnProperty.js +4 -0
  40. package/dist/esm/hasOwnProperty.js.map +1 -0
  41. package/dist/esm/index.js +5 -0
  42. package/dist/esm/index.js.map +1 -0
  43. package/dist/esm/interfaces.js +2 -0
  44. package/dist/esm/interfaces.js.map +1 -0
  45. package/dist/esm/lint.js +168 -0
  46. package/dist/esm/lint.js.map +1 -0
  47. package/dist/esm/parse.js +41 -0
  48. package/dist/esm/parse.js.map +1 -0
  49. package/dist/esm/precook.js +435 -0
  50. package/dist/esm/precook.js.map +1 -0
  51. package/dist/esm/precookFunction.js +20 -0
  52. package/dist/esm/precookFunction.js.map +1 -0
  53. package/dist/esm/preevaluate.js +23 -0
  54. package/dist/esm/preevaluate.js.map +1 -0
  55. package/dist/esm/sanitize.js +48 -0
  56. package/dist/esm/sanitize.js.map +1 -0
  57. package/dist/esm/traverse.js +157 -0
  58. package/dist/esm/traverse.js.map +1 -0
  59. package/dist/types/AnalysisContext.d.ts +17 -0
  60. package/dist/types/ExecutionContext.d.ts +79 -0
  61. package/dist/types/context-free.d.ts +19 -0
  62. package/dist/types/cook.d.ts +12 -0
  63. package/dist/types/cook.spec.d.ts +1 -0
  64. package/dist/types/hasOwnProperty.d.ts +1 -0
  65. package/dist/types/index.d.ts +4 -0
  66. package/dist/types/interfaces.d.ts +33 -0
  67. package/dist/types/lint.d.ts +13 -0
  68. package/dist/types/lint.spec.d.ts +1 -0
  69. package/dist/types/parse.d.ts +6 -0
  70. package/dist/types/precook.d.ts +14 -0
  71. package/dist/types/precook.spec.d.ts +1 -0
  72. package/dist/types/precookFunction.d.ts +10 -0
  73. package/dist/types/precookFunction.spec.d.ts +1 -0
  74. package/dist/types/preevaluate.d.ts +13 -0
  75. package/dist/types/preevaluate.spec.d.ts +1 -0
  76. package/dist/types/sanitize.d.ts +2 -0
  77. package/dist/types/traverse.d.ts +11 -0
  78. package/package.json +40 -0
@@ -0,0 +1,435 @@
1
+ import { hasOwnProperty } from "./hasOwnProperty";
2
+ import { AnalysisContext, AnalysisEnvironment } from "./AnalysisContext";
3
+ import { collectBoundNames, collectScopedDeclarations, containsExpression } from "./traverse";
4
+
5
+ /**
6
+ * Analysis an AST of a storyboard function or an evaluation expression.
7
+ *
8
+ * @param rootAst - The root AST.
9
+ * @param options - Analysis options.
10
+ * @returns A set of global variables the root AST attempts to access.
11
+ */
12
+ export function precook(rootAst, {
13
+ expressionOnly,
14
+ visitors
15
+ } = {}) {
16
+ var attemptToVisitGlobals = new Set();
17
+ var analysisContextStack = [];
18
+ var rootEnv = new AnalysisEnvironment(null);
19
+ var rootContext = new AnalysisContext();
20
+ rootContext.VariableEnvironment = rootEnv;
21
+ rootContext.LexicalEnvironment = rootEnv;
22
+ analysisContextStack.push(rootContext);
23
+
24
+ function getRunningContext() {
25
+ return analysisContextStack[analysisContextStack.length - 1];
26
+ }
27
+
28
+ function visit(node) {
29
+ if (hasOwnProperty(visitors, node.type)) {
30
+ visitors[node.type](node);
31
+ }
32
+ }
33
+
34
+ function Evaluate(node) {
35
+ if (Array.isArray(node)) {
36
+ for (var n of node) {
37
+ Evaluate(n);
38
+ }
39
+ } else if (node) {
40
+ // `node` maybe `null` in some cases.
41
+ visitors && visit(node); // Expressions:
42
+
43
+ switch (node.type) {
44
+ case "Identifier":
45
+ if (!ResolveBinding(node.name)) {
46
+ attemptToVisitGlobals.add(node.name);
47
+
48
+ if (visitors && hasOwnProperty(visitors, "__GlobalVariable")) {
49
+ visitors.__GlobalVariable(node);
50
+ }
51
+ }
52
+
53
+ return;
54
+
55
+ case "ArrayExpression":
56
+ case "ArrayPattern":
57
+ Evaluate(node.elements);
58
+ return;
59
+
60
+ case "ArrowFunctionExpression":
61
+ {
62
+ var env = getRunningContext().LexicalEnvironment;
63
+ var closure = OrdinaryFunctionCreate(node, env);
64
+ CallFunction(closure);
65
+ return;
66
+ }
67
+
68
+ case "AssignmentPattern":
69
+ case "BinaryExpression":
70
+ case "LogicalExpression":
71
+ Evaluate(node.left);
72
+ Evaluate(node.right);
73
+ return;
74
+
75
+ case "CallExpression":
76
+ case "NewExpression":
77
+ Evaluate(node.callee);
78
+ Evaluate(node.arguments);
79
+ return;
80
+
81
+ case "ChainExpression":
82
+ Evaluate(node.expression);
83
+ return;
84
+
85
+ case "ConditionalExpression":
86
+ Evaluate(node.test);
87
+ Evaluate(node.consequent);
88
+ Evaluate(node.alternate);
89
+ return;
90
+
91
+ case "MemberExpression":
92
+ Evaluate(node.object);
93
+
94
+ if (node.computed) {
95
+ Evaluate(node.property);
96
+ }
97
+
98
+ return;
99
+
100
+ case "ObjectExpression":
101
+ case "ObjectPattern":
102
+ Evaluate(node.properties);
103
+ return;
104
+
105
+ case "Property":
106
+ if (node.computed) {
107
+ Evaluate(node.key);
108
+ }
109
+
110
+ Evaluate(node.value);
111
+ return;
112
+
113
+ case "RestElement":
114
+ case "SpreadElement":
115
+ case "UnaryExpression":
116
+ Evaluate(node.argument);
117
+ return;
118
+
119
+ case "SequenceExpression":
120
+ case "TemplateLiteral":
121
+ Evaluate(node.expressions);
122
+ return;
123
+
124
+ case "TaggedTemplateExpression":
125
+ Evaluate(node.tag);
126
+ Evaluate(node.quasi);
127
+ return;
128
+
129
+ case "Literal":
130
+ return;
131
+ }
132
+
133
+ if (!expressionOnly) {
134
+ // Statements and assignments:
135
+ switch (node.type) {
136
+ case "AssignmentExpression":
137
+ Evaluate(node.right);
138
+ Evaluate(node.left);
139
+ return;
140
+
141
+ case "BlockStatement":
142
+ {
143
+ if (!node.body.length) {
144
+ return;
145
+ }
146
+
147
+ var runningContext = getRunningContext();
148
+ var oldEnv = runningContext.LexicalEnvironment;
149
+ var blockEnv = new AnalysisEnvironment(oldEnv);
150
+ BlockDeclarationInstantiation(node.body, blockEnv);
151
+ runningContext.LexicalEnvironment = blockEnv;
152
+ Evaluate(node.body);
153
+ runningContext.LexicalEnvironment = oldEnv;
154
+ return;
155
+ }
156
+
157
+ case "BreakStatement":
158
+ case "ContinueStatement":
159
+ case "EmptyStatement":
160
+ return;
161
+
162
+ case "CatchClause":
163
+ {
164
+ var _runningContext = getRunningContext();
165
+
166
+ var _oldEnv = _runningContext.LexicalEnvironment;
167
+ var catchEnv = new AnalysisEnvironment(_oldEnv);
168
+ BoundNamesInstantiation(node.param, catchEnv);
169
+ _runningContext.LexicalEnvironment = catchEnv;
170
+ Evaluate(node.param);
171
+ Evaluate(node.body);
172
+ _runningContext.LexicalEnvironment = _oldEnv;
173
+ return;
174
+ }
175
+
176
+ case "DoWhileStatement":
177
+ Evaluate(node.body);
178
+ Evaluate(node.test);
179
+ return;
180
+
181
+ case "ExpressionStatement":
182
+ case "TSAsExpression":
183
+ Evaluate(node.expression);
184
+ return;
185
+
186
+ case "ForInStatement":
187
+ case "ForOfStatement":
188
+ {
189
+ // ForIn/OfHeadEvaluation
190
+ var lexicalBinding = node.left.type === "VariableDeclaration" && node.left.kind !== "var";
191
+
192
+ var _runningContext2 = getRunningContext();
193
+
194
+ var _oldEnv2 = _runningContext2.LexicalEnvironment;
195
+
196
+ if (lexicalBinding) {
197
+ var newEnv = new AnalysisEnvironment(_oldEnv2);
198
+ BoundNamesInstantiation(node.left, newEnv);
199
+ _runningContext2.LexicalEnvironment = newEnv;
200
+ }
201
+
202
+ Evaluate(node.right);
203
+ _runningContext2.LexicalEnvironment = _oldEnv2; // ForIn/OfBodyEvaluation
204
+
205
+ if (lexicalBinding) {
206
+ var iterationEnv = new AnalysisEnvironment(_oldEnv2);
207
+ BoundNamesInstantiation(node.left, iterationEnv);
208
+ _runningContext2.LexicalEnvironment = iterationEnv;
209
+ }
210
+
211
+ Evaluate(node.left);
212
+ Evaluate(node.body);
213
+ _runningContext2.LexicalEnvironment = _oldEnv2;
214
+ return;
215
+ }
216
+
217
+ case "ForStatement":
218
+ {
219
+ var _node$init;
220
+
221
+ var _lexicalBinding = ((_node$init = node.init) === null || _node$init === void 0 ? void 0 : _node$init.type) === "VariableDeclaration" && node.init.kind !== "var";
222
+
223
+ var _runningContext3 = getRunningContext();
224
+
225
+ var _oldEnv3 = _runningContext3.LexicalEnvironment;
226
+
227
+ if (_lexicalBinding) {
228
+ var loopEnv = new AnalysisEnvironment(_oldEnv3);
229
+ BoundNamesInstantiation(node.init, loopEnv);
230
+ _runningContext3.LexicalEnvironment = loopEnv;
231
+ }
232
+
233
+ Evaluate(node.init);
234
+ Evaluate(node.test);
235
+ Evaluate(node.body);
236
+ Evaluate(node.update);
237
+ _runningContext3.LexicalEnvironment = _oldEnv3;
238
+ return;
239
+ }
240
+
241
+ case "FunctionDeclaration":
242
+ {
243
+ var [fn] = collectBoundNames(node);
244
+ var _env = getRunningContext().LexicalEnvironment;
245
+ var fo = OrdinaryFunctionCreate(node, _env);
246
+
247
+ _env.CreateBinding(fn);
248
+
249
+ CallFunction(fo);
250
+ return;
251
+ }
252
+
253
+ case "FunctionExpression":
254
+ {
255
+ var _closure = InstantiateOrdinaryFunctionExpression(node);
256
+
257
+ CallFunction(_closure);
258
+ return;
259
+ }
260
+
261
+ case "IfStatement":
262
+ Evaluate(node.test);
263
+ Evaluate(node.consequent);
264
+ Evaluate(node.alternate);
265
+ return;
266
+
267
+ case "ReturnStatement":
268
+ case "ThrowStatement":
269
+ case "UpdateExpression":
270
+ Evaluate(node.argument);
271
+ return;
272
+
273
+ case "SwitchCase":
274
+ Evaluate(node.test);
275
+ Evaluate(node.consequent);
276
+ return;
277
+
278
+ case "SwitchStatement":
279
+ {
280
+ Evaluate(node.discriminant);
281
+
282
+ var _runningContext4 = getRunningContext();
283
+
284
+ var _oldEnv4 = _runningContext4.LexicalEnvironment;
285
+
286
+ var _blockEnv = new AnalysisEnvironment(_oldEnv4);
287
+
288
+ BlockDeclarationInstantiation(node.cases, _blockEnv);
289
+ _runningContext4.LexicalEnvironment = _blockEnv;
290
+ Evaluate(node.cases);
291
+ _runningContext4.LexicalEnvironment = _oldEnv4;
292
+ return;
293
+ }
294
+
295
+ case "TryStatement":
296
+ Evaluate(node.block);
297
+ Evaluate(node.handler);
298
+ Evaluate(node.finalizer);
299
+ return;
300
+
301
+ case "VariableDeclaration":
302
+ Evaluate(node.declarations);
303
+ return;
304
+
305
+ case "VariableDeclarator":
306
+ Evaluate(node.id);
307
+ Evaluate(node.init);
308
+ return;
309
+
310
+ case "WhileStatement":
311
+ Evaluate(node.test);
312
+ Evaluate(node.body);
313
+ return;
314
+ }
315
+ }
316
+
317
+ if (visitors && hasOwnProperty(visitors, "__UnknownNode")) {
318
+ visitors.__UnknownNode(node);
319
+ } else {
320
+ // eslint-disable-next-line no-console
321
+ console.warn("Unsupported node type `".concat(node.type, "`"));
322
+ }
323
+ }
324
+ }
325
+
326
+ function BoundNamesInstantiation(declarations, env) {
327
+ for (var name of collectBoundNames(declarations)) {
328
+ env.CreateBinding(name);
329
+ }
330
+ }
331
+
332
+ function ResolveBinding(name) {
333
+ var env = getRunningContext().LexicalEnvironment;
334
+ return GetIdentifierReference(env, name);
335
+ }
336
+
337
+ function GetIdentifierReference(env, name) {
338
+ return !!env && (env.HasBinding(name) || GetIdentifierReference(env.OuterEnv, name));
339
+ }
340
+
341
+ function BlockDeclarationInstantiation(code, env) {
342
+ var declarations = collectScopedDeclarations(code, {
343
+ var: false,
344
+ topLevel: false
345
+ });
346
+ BoundNamesInstantiation(declarations, env);
347
+ }
348
+
349
+ function CallFunction(closure) {
350
+ PrepareOrdinaryCall(closure);
351
+ FunctionDeclarationInstantiation(closure);
352
+ Evaluate(closure.ECMAScriptCode);
353
+ analysisContextStack.pop();
354
+ }
355
+
356
+ function PrepareOrdinaryCall(F) {
357
+ var calleeContext = new AnalysisContext();
358
+ var localEnv = new AnalysisEnvironment(F.Environment);
359
+ calleeContext.VariableEnvironment = localEnv;
360
+ calleeContext.LexicalEnvironment = localEnv;
361
+ analysisContextStack.push(calleeContext);
362
+ }
363
+
364
+ function FunctionDeclarationInstantiation(func) {
365
+ var calleeContext = getRunningContext();
366
+ var code = func.ECMAScriptCode;
367
+ var formals = func.FormalParameters;
368
+ var hasParameterExpressions = containsExpression(formals);
369
+ var varDeclarations = collectScopedDeclarations(code, {
370
+ var: true,
371
+ topLevel: true
372
+ });
373
+ var varNames = collectBoundNames(varDeclarations);
374
+ var env = calleeContext.LexicalEnvironment;
375
+ BoundNamesInstantiation(formals, env);
376
+ Evaluate(formals);
377
+ var varEnv;
378
+
379
+ if (!hasParameterExpressions) {
380
+ // NOTE: Only a single Environment Record is needed for the parameters
381
+ // and top-level vars.
382
+ for (var n of varNames) {
383
+ env.CreateBinding(n);
384
+ }
385
+
386
+ varEnv = env;
387
+ } else {
388
+ // NOTE: A separate Environment Record is needed to ensure that closures
389
+ // created by expressions in the formal parameter list do not have
390
+ // visibility of declarations in the function body.
391
+ varEnv = new AnalysisEnvironment(env);
392
+ calleeContext.VariableEnvironment = varEnv;
393
+
394
+ for (var _n of varNames) {
395
+ varEnv.CreateBinding(_n);
396
+ }
397
+ }
398
+
399
+ var lexEnv = varEnv;
400
+ calleeContext.LexicalEnvironment = lexEnv;
401
+ var lexDeclarations = collectScopedDeclarations(code, {
402
+ var: false,
403
+ topLevel: true
404
+ });
405
+ BoundNamesInstantiation(lexDeclarations, lexEnv);
406
+ }
407
+
408
+ function InstantiateOrdinaryFunctionExpression(functionExpression) {
409
+ var scope = getRunningContext().LexicalEnvironment;
410
+
411
+ if (!functionExpression.id) {
412
+ return OrdinaryFunctionCreate(functionExpression, scope);
413
+ }
414
+
415
+ var name = functionExpression.id.name;
416
+ var funcEnv = new AnalysisEnvironment(scope);
417
+ funcEnv.CreateBinding(name);
418
+ return OrdinaryFunctionCreate(functionExpression, funcEnv);
419
+ }
420
+
421
+ function OrdinaryFunctionCreate({
422
+ params,
423
+ body
424
+ }, scope) {
425
+ return {
426
+ FormalParameters: params,
427
+ ECMAScriptCode: body.type === "BlockStatement" ? body.body : body,
428
+ Environment: scope
429
+ };
430
+ }
431
+
432
+ Evaluate(rootAst);
433
+ return attemptToVisitGlobals;
434
+ }
435
+ //# sourceMappingURL=precook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/precook.ts"],"names":["hasOwnProperty","AnalysisContext","AnalysisEnvironment","collectBoundNames","collectScopedDeclarations","containsExpression","precook","rootAst","expressionOnly","visitors","attemptToVisitGlobals","Set","analysisContextStack","rootEnv","rootContext","VariableEnvironment","LexicalEnvironment","push","getRunningContext","length","visit","node","type","Evaluate","Array","isArray","n","ResolveBinding","name","add","__GlobalVariable","elements","env","closure","OrdinaryFunctionCreate","CallFunction","left","right","callee","arguments","expression","test","consequent","alternate","object","computed","property","properties","key","value","argument","expressions","tag","quasi","body","runningContext","oldEnv","blockEnv","BlockDeclarationInstantiation","catchEnv","BoundNamesInstantiation","param","lexicalBinding","kind","newEnv","iterationEnv","init","loopEnv","update","fn","fo","CreateBinding","InstantiateOrdinaryFunctionExpression","discriminant","cases","block","handler","finalizer","declarations","id","__UnknownNode","console","warn","GetIdentifierReference","HasBinding","OuterEnv","code","var","topLevel","PrepareOrdinaryCall","FunctionDeclarationInstantiation","ECMAScriptCode","pop","F","calleeContext","localEnv","Environment","func","formals","FormalParameters","hasParameterExpressions","varDeclarations","varNames","varEnv","lexEnv","lexDeclarations","functionExpression","scope","funcEnv","params"],"mappings":"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","sourcesContent":["import {\n ArrowFunctionExpression,\n Expression,\n FunctionDeclaration,\n FunctionExpression,\n Statement,\n SwitchCase,\n VariableDeclaration,\n} from \"@babel/types\";\nimport { hasOwnProperty } from \"./hasOwnProperty\";\nimport {\n AnalysisContext,\n AnalysisEnvironment,\n AnalysisFunctionObject,\n} from \"./AnalysisContext\";\nimport { EstreeNode, EstreeVisitors, NodeWithBoundNames } from \"./interfaces\";\nimport {\n collectBoundNames,\n collectScopedDeclarations,\n containsExpression,\n} from \"./traverse\";\n\nexport interface PrecookOptions {\n expressionOnly?: boolean;\n visitors?: EstreeVisitors;\n}\n\n/**\n * Analysis an AST of a storyboard function or an evaluation expression.\n *\n * @param rootAst - The root AST.\n * @param options - Analysis options.\n * @returns A set of global variables the root AST attempts to access.\n */\nexport function precook(\n rootAst: Expression | FunctionDeclaration,\n { expressionOnly, visitors }: PrecookOptions = {}\n): Set<string> {\n const attemptToVisitGlobals = new Set<string>();\n const analysisContextStack: AnalysisContext[] = [];\n const rootEnv = new AnalysisEnvironment(null);\n const rootContext = new AnalysisContext();\n rootContext.VariableEnvironment = rootEnv;\n rootContext.LexicalEnvironment = rootEnv;\n analysisContextStack.push(rootContext);\n\n function getRunningContext(): AnalysisContext {\n return analysisContextStack[analysisContextStack.length - 1];\n }\n\n function visit(node: EstreeNode): void {\n if (hasOwnProperty(visitors, node.type)) {\n visitors[node.type](node);\n }\n }\n\n function Evaluate(node: EstreeNode | EstreeNode[]): void {\n if (Array.isArray(node)) {\n for (const n of node) {\n Evaluate(n);\n }\n } else if (node) {\n // `node` maybe `null` in some cases.\n visitors && visit(node);\n // Expressions:\n switch (node.type) {\n case \"Identifier\":\n if (!ResolveBinding(node.name)) {\n attemptToVisitGlobals.add(node.name);\n if (visitors && hasOwnProperty(visitors, \"__GlobalVariable\")) {\n visitors.__GlobalVariable(node);\n }\n }\n return;\n case \"ArrayExpression\":\n case \"ArrayPattern\":\n Evaluate(node.elements);\n return;\n case \"ArrowFunctionExpression\": {\n const env = getRunningContext().LexicalEnvironment;\n const closure = OrdinaryFunctionCreate(node, env);\n CallFunction(closure);\n return;\n }\n case \"AssignmentPattern\":\n case \"BinaryExpression\":\n case \"LogicalExpression\":\n Evaluate(node.left);\n Evaluate(node.right);\n return;\n case \"CallExpression\":\n case \"NewExpression\":\n Evaluate(node.callee);\n Evaluate(node.arguments);\n return;\n case \"ChainExpression\":\n Evaluate(node.expression);\n return;\n case \"ConditionalExpression\":\n Evaluate(node.test);\n Evaluate(node.consequent);\n Evaluate(node.alternate);\n return;\n case \"MemberExpression\":\n Evaluate(node.object);\n if (node.computed) {\n Evaluate(node.property);\n }\n return;\n case \"ObjectExpression\":\n case \"ObjectPattern\":\n Evaluate(node.properties);\n return;\n case \"Property\":\n if (node.computed) {\n Evaluate(node.key);\n }\n Evaluate(node.value);\n return;\n case \"RestElement\":\n case \"SpreadElement\":\n case \"UnaryExpression\":\n Evaluate(node.argument);\n return;\n case \"SequenceExpression\":\n case \"TemplateLiteral\":\n Evaluate(node.expressions);\n return;\n case \"TaggedTemplateExpression\":\n Evaluate(node.tag);\n Evaluate(node.quasi);\n return;\n case \"Literal\":\n return;\n }\n if (!expressionOnly) {\n // Statements and assignments:\n switch (node.type) {\n case \"AssignmentExpression\":\n Evaluate(node.right);\n Evaluate(node.left);\n return;\n case \"BlockStatement\": {\n if (!node.body.length) {\n return;\n }\n const runningContext = getRunningContext();\n const oldEnv = runningContext.LexicalEnvironment;\n const blockEnv = new AnalysisEnvironment(oldEnv);\n BlockDeclarationInstantiation(node.body, blockEnv);\n runningContext.LexicalEnvironment = blockEnv;\n Evaluate(node.body);\n runningContext.LexicalEnvironment = oldEnv;\n return;\n }\n case \"BreakStatement\":\n case \"ContinueStatement\":\n case \"EmptyStatement\":\n return;\n case \"CatchClause\": {\n const runningContext = getRunningContext();\n const oldEnv = runningContext.LexicalEnvironment;\n const catchEnv = new AnalysisEnvironment(oldEnv);\n BoundNamesInstantiation(node.param, catchEnv);\n runningContext.LexicalEnvironment = catchEnv;\n Evaluate(node.param);\n Evaluate(node.body);\n runningContext.LexicalEnvironment = oldEnv;\n return;\n }\n case \"DoWhileStatement\":\n Evaluate(node.body);\n Evaluate(node.test);\n return;\n case \"ExpressionStatement\":\n case \"TSAsExpression\":\n Evaluate(node.expression);\n return;\n case \"ForInStatement\":\n case \"ForOfStatement\": {\n // ForIn/OfHeadEvaluation\n const lexicalBinding =\n node.left.type === \"VariableDeclaration\" &&\n node.left.kind !== \"var\";\n const runningContext = getRunningContext();\n const oldEnv = runningContext.LexicalEnvironment;\n if (lexicalBinding) {\n const newEnv = new AnalysisEnvironment(oldEnv);\n BoundNamesInstantiation(node.left, newEnv);\n runningContext.LexicalEnvironment = newEnv;\n }\n Evaluate(node.right);\n runningContext.LexicalEnvironment = oldEnv;\n\n // ForIn/OfBodyEvaluation\n if (lexicalBinding) {\n const iterationEnv = new AnalysisEnvironment(oldEnv);\n BoundNamesInstantiation(node.left, iterationEnv);\n runningContext.LexicalEnvironment = iterationEnv;\n }\n Evaluate(node.left);\n Evaluate(node.body);\n runningContext.LexicalEnvironment = oldEnv;\n return;\n }\n case \"ForStatement\": {\n const lexicalBinding =\n node.init?.type === \"VariableDeclaration\" &&\n node.init.kind !== \"var\";\n const runningContext = getRunningContext();\n const oldEnv = runningContext.LexicalEnvironment;\n if (lexicalBinding) {\n const loopEnv = new AnalysisEnvironment(oldEnv);\n BoundNamesInstantiation(\n node.init as VariableDeclaration,\n loopEnv\n );\n runningContext.LexicalEnvironment = loopEnv;\n }\n Evaluate(node.init);\n Evaluate(node.test);\n Evaluate(node.body);\n Evaluate(node.update);\n runningContext.LexicalEnvironment = oldEnv;\n return;\n }\n case \"FunctionDeclaration\": {\n const [fn] = collectBoundNames(node);\n const env = getRunningContext().LexicalEnvironment;\n const fo = OrdinaryFunctionCreate(node, env);\n env.CreateBinding(fn);\n CallFunction(fo);\n return;\n }\n case \"FunctionExpression\": {\n const closure = InstantiateOrdinaryFunctionExpression(node);\n CallFunction(closure);\n return;\n }\n case \"IfStatement\":\n Evaluate(node.test);\n Evaluate(node.consequent);\n Evaluate(node.alternate);\n return;\n case \"ReturnStatement\":\n case \"ThrowStatement\":\n case \"UpdateExpression\":\n Evaluate(node.argument);\n return;\n case \"SwitchCase\":\n Evaluate(node.test);\n Evaluate(node.consequent);\n return;\n case \"SwitchStatement\": {\n Evaluate(node.discriminant);\n const runningContext = getRunningContext();\n const oldEnv = runningContext.LexicalEnvironment;\n const blockEnv = new AnalysisEnvironment(oldEnv);\n BlockDeclarationInstantiation(node.cases, blockEnv);\n runningContext.LexicalEnvironment = blockEnv;\n Evaluate(node.cases);\n runningContext.LexicalEnvironment = oldEnv;\n return;\n }\n case \"TryStatement\":\n Evaluate(node.block);\n Evaluate(node.handler);\n Evaluate(node.finalizer);\n return;\n case \"VariableDeclaration\":\n Evaluate(node.declarations);\n return;\n case \"VariableDeclarator\":\n Evaluate(node.id);\n Evaluate(node.init);\n return;\n case \"WhileStatement\":\n Evaluate(node.test);\n Evaluate(node.body);\n return;\n }\n }\n if (visitors && hasOwnProperty(visitors, \"__UnknownNode\")) {\n visitors.__UnknownNode(node);\n } else {\n // eslint-disable-next-line no-console\n console.warn(`Unsupported node type \\`${node.type}\\``);\n }\n }\n }\n\n function BoundNamesInstantiation(\n declarations: NodeWithBoundNames | NodeWithBoundNames[],\n env: AnalysisEnvironment\n ): void {\n for (const name of collectBoundNames(declarations)) {\n env.CreateBinding(name);\n }\n }\n\n function ResolveBinding(name: string): boolean {\n const env = getRunningContext().LexicalEnvironment;\n return GetIdentifierReference(env, name);\n }\n\n function GetIdentifierReference(\n env: AnalysisEnvironment,\n name: string\n ): boolean {\n return (\n !!env &&\n (env.HasBinding(name) || GetIdentifierReference(env.OuterEnv, name))\n );\n }\n\n function BlockDeclarationInstantiation(\n code: Statement[] | SwitchCase[],\n env: AnalysisEnvironment\n ): void {\n const declarations = collectScopedDeclarations(code, {\n var: false,\n topLevel: false,\n });\n BoundNamesInstantiation(declarations, env);\n }\n\n function CallFunction(closure: AnalysisFunctionObject): void {\n PrepareOrdinaryCall(closure);\n FunctionDeclarationInstantiation(closure);\n Evaluate(closure.ECMAScriptCode);\n analysisContextStack.pop();\n }\n\n function PrepareOrdinaryCall(F: AnalysisFunctionObject): void {\n const calleeContext = new AnalysisContext();\n const localEnv = new AnalysisEnvironment(F.Environment);\n calleeContext.VariableEnvironment = localEnv;\n calleeContext.LexicalEnvironment = localEnv;\n analysisContextStack.push(calleeContext);\n }\n\n function FunctionDeclarationInstantiation(\n func: AnalysisFunctionObject\n ): void {\n const calleeContext = getRunningContext();\n const code = func.ECMAScriptCode;\n const formals = func.FormalParameters;\n const hasParameterExpressions = containsExpression(formals);\n const varDeclarations = collectScopedDeclarations(code, {\n var: true,\n topLevel: true,\n });\n const varNames = collectBoundNames(varDeclarations);\n\n const env = calleeContext.LexicalEnvironment;\n BoundNamesInstantiation(formals, env);\n\n Evaluate(formals);\n\n let varEnv: AnalysisEnvironment;\n if (!hasParameterExpressions) {\n // NOTE: Only a single Environment Record is needed for the parameters\n // and top-level vars.\n for (const n of varNames) {\n env.CreateBinding(n);\n }\n varEnv = env;\n } else {\n // NOTE: A separate Environment Record is needed to ensure that closures\n // created by expressions in the formal parameter list do not have\n // visibility of declarations in the function body.\n varEnv = new AnalysisEnvironment(env);\n calleeContext.VariableEnvironment = varEnv;\n for (const n of varNames) {\n varEnv.CreateBinding(n);\n }\n }\n const lexEnv = varEnv;\n calleeContext.LexicalEnvironment = lexEnv;\n\n const lexDeclarations = collectScopedDeclarations(code, {\n var: false,\n topLevel: true,\n });\n BoundNamesInstantiation(lexDeclarations, lexEnv);\n }\n\n function InstantiateOrdinaryFunctionExpression(\n functionExpression: FunctionExpression\n ): AnalysisFunctionObject {\n const scope = getRunningContext().LexicalEnvironment;\n if (!functionExpression.id) {\n return OrdinaryFunctionCreate(functionExpression, scope);\n }\n const name = functionExpression.id.name;\n const funcEnv = new AnalysisEnvironment(scope);\n funcEnv.CreateBinding(name);\n return OrdinaryFunctionCreate(functionExpression, funcEnv);\n }\n\n function OrdinaryFunctionCreate(\n {\n params,\n body,\n }: FunctionDeclaration | FunctionExpression | ArrowFunctionExpression,\n scope: AnalysisEnvironment\n ): AnalysisFunctionObject {\n return {\n FormalParameters: params,\n ECMAScriptCode: body.type === \"BlockStatement\" ? body.body : body,\n Environment: scope,\n };\n }\n\n Evaluate(rootAst);\n\n return attemptToVisitGlobals;\n}\n"],"file":"precook.js"}
@@ -0,0 +1,20 @@
1
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
2
+ var _excluded = ["typescript"];
3
+ import { parseAsEstree } from "./parse";
4
+ import { precook } from "./precook";
5
+ export function precookFunction(source, _ref = {}) {
6
+ var {
7
+ typescript
8
+ } = _ref,
9
+ restOptions = _objectWithoutProperties(_ref, _excluded);
10
+
11
+ var func = parseAsEstree(source, {
12
+ typescript
13
+ });
14
+ var attemptToVisitGlobals = precook(func, restOptions);
15
+ return {
16
+ function: func,
17
+ attemptToVisitGlobals
18
+ };
19
+ }
20
+ //# sourceMappingURL=precookFunction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/precookFunction.ts"],"names":["parseAsEstree","precook","precookFunction","source","typescript","restOptions","func","attemptToVisitGlobals","function"],"mappings":";;AACA,SAASA,aAAT,QAA8B,SAA9B;AACA,SAASC,OAAT,QAAwC,WAAxC;AAWA,OAAO,SAASC,eAAT,CACLC,MADK,EAEL,OAAyD,EAFpD,EAGkB;AAAA,MADvB;AAAEC,IAAAA;AAAF,GACuB;AAAA,MADNC,WACM;;AACvB,MAAMC,IAAI,GAAGN,aAAa,CAACG,MAAD,EAAS;AAAEC,IAAAA;AAAF,GAAT,CAA1B;AACA,MAAMG,qBAAqB,GAAGN,OAAO,CAACK,IAAD,EAAOD,WAAP,CAArC;AACA,SAAO;AACLG,IAAAA,QAAQ,EAAEF,IADL;AAELC,IAAAA;AAFK,GAAP;AAID","sourcesContent":["import { FunctionDeclaration } from \"@babel/types\";\nimport { parseAsEstree } from \"./parse\";\nimport { precook, PrecookOptions } from \"./precook\";\n\nexport interface PrecookFunctionOptions extends PrecookOptions {\n typescript?: boolean;\n}\n\nexport interface PrecookFunctionResult {\n function: FunctionDeclaration;\n attemptToVisitGlobals: Set<string>;\n}\n\nexport function precookFunction(\n source: string,\n { typescript, ...restOptions }: PrecookFunctionOptions = {}\n): PrecookFunctionResult {\n const func = parseAsEstree(source, { typescript });\n const attemptToVisitGlobals = precook(func, restOptions);\n return {\n function: func,\n attemptToVisitGlobals,\n };\n}\n"],"file":"precookFunction.js"}
@@ -0,0 +1,23 @@
1
+ import _objectSpread from "@babel/runtime/helpers/objectSpread2";
2
+ import { parseAsEstreeExpression } from "./parse";
3
+ import { precook } from "./precook";
4
+ // `raw` should always be asserted by `isEvaluable`.
5
+ export function preevaluate(raw, options) {
6
+ var source = raw.replace(/^\s*<%~?\s|\s%>\s*$/g, "");
7
+ var expression = parseAsEstreeExpression(source);
8
+ var attemptToVisitGlobals = precook(expression, _objectSpread(_objectSpread({}, options), {}, {
9
+ expressionOnly: true
10
+ }));
11
+ return {
12
+ expression,
13
+ attemptToVisitGlobals,
14
+ source
15
+ };
16
+ }
17
+ export function isEvaluable(raw) {
18
+ return /^\s*<%~?\s/.test(raw) && /\s%>\s*$/.test(raw);
19
+ }
20
+ export function shouldAllowRecursiveEvaluations(raw) {
21
+ return /^\s*<%~\s/.test(raw);
22
+ }
23
+ //# sourceMappingURL=preevaluate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/preevaluate.ts"],"names":["parseAsEstreeExpression","precook","preevaluate","raw","options","source","replace","expression","attemptToVisitGlobals","expressionOnly","isEvaluable","test","shouldAllowRecursiveEvaluations"],"mappings":";AACA,SAASA,uBAAT,QAAwC,SAAxC;AACA,SAASC,OAAT,QAAwB,WAAxB;AAaA;AACA,OAAO,SAASC,WAAT,CACLC,GADK,EAELC,OAFK,EAGc;AACnB,MAAMC,MAAM,GAAGF,GAAG,CAACG,OAAJ,CAAY,sBAAZ,EAAoC,EAApC,CAAf;AACA,MAAMC,UAAU,GAAGP,uBAAuB,CAACK,MAAD,CAA1C;AACA,MAAMG,qBAAqB,GAAGP,OAAO,CAACM,UAAD,kCAChCH,OADgC;AAEnCK,IAAAA,cAAc,EAAE;AAFmB,KAArC;AAIA,SAAO;AACLF,IAAAA,UADK;AAELC,IAAAA,qBAFK;AAGLH,IAAAA;AAHK,GAAP;AAKD;AAED,OAAO,SAASK,WAAT,CAAqBP,GAArB,EAA2C;AAChD,SAAO,aAAaQ,IAAb,CAAkBR,GAAlB,KAA0B,WAAWQ,IAAX,CAAgBR,GAAhB,CAAjC;AACD;AAED,OAAO,SAASS,+BAAT,CAAyCT,GAAzC,EAA+D;AACpE,SAAO,YAAYQ,IAAZ,CAAiBR,GAAjB,CAAP;AACD","sourcesContent":["import { Expression } from \"@babel/types\";\nimport { parseAsEstreeExpression } from \"./parse\";\nimport { precook } from \"./precook\";\nimport { EstreeVisitors } from \"./interfaces\";\n\nexport interface PreevaluateOptions {\n visitors?: EstreeVisitors;\n}\n\nexport interface PreevaluateResult {\n expression: Expression;\n attemptToVisitGlobals: Set<string>;\n source: string;\n}\n\n// `raw` should always be asserted by `isEvaluable`.\nexport function preevaluate(\n raw: string,\n options?: PreevaluateOptions\n): PreevaluateResult {\n const source = raw.replace(/^\\s*<%~?\\s|\\s%>\\s*$/g, \"\");\n const expression = parseAsEstreeExpression(source);\n const attemptToVisitGlobals = precook(expression, {\n ...options,\n expressionOnly: true,\n });\n return {\n expression,\n attemptToVisitGlobals,\n source,\n };\n}\n\nexport function isEvaluable(raw: string): boolean {\n return /^\\s*<%~?\\s/.test(raw) && /\\s%>\\s*$/.test(raw);\n}\n\nexport function shouldAllowRecursiveEvaluations(raw: string): boolean {\n return /^\\s*<%~\\s/.test(raw);\n}\n"],"file":"preevaluate.js"}
@@ -0,0 +1,48 @@
1
+ // Ref https://github.com/tc39/proposal-global
2
+ // In addition, the es6-shim had to switch from Function('return this')()
3
+ // due to CSP concerns, such that the current check to handle browsers,
4
+ // node, web workers, and frames is:
5
+ // istanbul ignore next
6
+ // eslint-disable-next-line @typescript-eslint/ban-types
7
+ function getGlobal() {
8
+ // the only reliable means to get the global object is
9
+ // `Function('return this')()`
10
+ // However, this causes CSP violations in Chrome apps.
11
+ if (typeof self !== "undefined") {
12
+ return self;
13
+ }
14
+
15
+ if (typeof window !== "undefined") {
16
+ return window;
17
+ }
18
+
19
+ if (typeof global !== "undefined") {
20
+ return global;
21
+ }
22
+
23
+ throw new Error("unable to locate global object");
24
+ }
25
+ /**
26
+ * There are chances to construct a `Function` from a string, etc.
27
+ * ```
28
+ * ((a,b)=>a[b])(()=>1, 'constructor')('console.log(`yo`)')()
29
+ * ```
30
+ */
31
+
32
+
33
+ var reservedObjects = new WeakSet([// `Function("...")` is considered *extremely vulnerable*.
34
+ Function, // `Object.assign()` is considered vulnerable.
35
+ Object, // `prototype` is considered vulnerable.
36
+ Function.prototype, Object.prototype, // Global `window` is considered vulnerable, too.
37
+ getGlobal()]);
38
+ export function sanitize(cooked) {
39
+ // eslint-disable-next-line @typescript-eslint/ban-types
40
+ if (reservedObjects.has(cooked)) {
41
+ throw new TypeError("Cannot access reserved objects such as `Function`.");
42
+ }
43
+ }
44
+ var allowedConstructors = new WeakSet([Array, Date, Map, Set, URLSearchParams, WeakMap, WeakSet]);
45
+ export function isAllowedConstructor(constructor) {
46
+ return allowedConstructors.has(constructor);
47
+ }
48
+ //# sourceMappingURL=sanitize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/sanitize.ts"],"names":["getGlobal","self","window","global","Error","reservedObjects","WeakSet","Function","Object","prototype","sanitize","cooked","has","TypeError","allowedConstructors","Array","Date","Map","Set","URLSearchParams","WeakMap","isAllowedConstructor","constructor"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,SAAT,GAA6B;AAC3B;AACA;AACA;AACA,MAAI,OAAOC,IAAP,KAAgB,WAApB,EAAiC;AAC/B,WAAOA,IAAP;AACD;;AACD,MAAI,OAAOC,MAAP,KAAkB,WAAtB,EAAmC;AACjC,WAAOA,MAAP;AACD;;AACD,MAAI,OAAOC,MAAP,KAAkB,WAAtB,EAAmC;AACjC,WAAOA,MAAP;AACD;;AACD,QAAM,IAAIC,KAAJ,CAAU,gCAAV,CAAN;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,IAAMC,eAAe,GAAG,IAAIC,OAAJ,CAAY,CAClC;AACAC,QAFkC,EAGlC;AACAC,MAJkC,EAKlC;AACAD,QAAQ,CAACE,SANyB,EAOlCD,MAAM,CAACC,SAP2B,EAQlC;AACAT,SAAS,EATyB,CAAZ,CAAxB;AAYA,OAAO,SAASU,QAAT,CAAkBC,MAAlB,EAAyC;AAC9C;AACA,MAAIN,eAAe,CAACO,GAAhB,CAAoBD,MAApB,CAAJ,EAA2C;AACzC,UAAM,IAAIE,SAAJ,CAAc,oDAAd,CAAN;AACD;AACF;AAED,IAAMC,mBAAmB,GAAG,IAAIR,OAAJ,CAAY,CACtCS,KADsC,EAEtCC,IAFsC,EAGtCC,GAHsC,EAItCC,GAJsC,EAKtCC,eALsC,EAMtCC,OANsC,EAOtCd,OAPsC,CAAZ,CAA5B;AAUA,OAAO,SAASe,oBAAT,CAA8BC,WAA9B,EAA6D;AAClE,SAAOR,mBAAmB,CAACF,GAApB,CAAwBU,WAAxB,CAAP;AACD","sourcesContent":["// Ref https://github.com/tc39/proposal-global\n// In addition, the es6-shim had to switch from Function('return this')()\n// due to CSP concerns, such that the current check to handle browsers,\n// node, web workers, and frames is:\n// istanbul ignore next\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction getGlobal(): object {\n // the only reliable means to get the global object is\n // `Function('return this')()`\n // However, this causes CSP violations in Chrome apps.\n if (typeof self !== \"undefined\") {\n return self;\n }\n if (typeof window !== \"undefined\") {\n return window;\n }\n if (typeof global !== \"undefined\") {\n return global;\n }\n throw new Error(\"unable to locate global object\");\n}\n\n/**\n * There are chances to construct a `Function` from a string, etc.\n * ```\n * ((a,b)=>a[b])(()=>1, 'constructor')('console.log(`yo`)')()\n * ```\n */\nconst reservedObjects = new WeakSet([\n // `Function(\"...\")` is considered *extremely vulnerable*.\n Function,\n // `Object.assign()` is considered vulnerable.\n Object,\n // `prototype` is considered vulnerable.\n Function.prototype,\n Object.prototype,\n // Global `window` is considered vulnerable, too.\n getGlobal(),\n]);\n\nexport function sanitize(cooked: unknown): void {\n // eslint-disable-next-line @typescript-eslint/ban-types\n if (reservedObjects.has(cooked as object)) {\n throw new TypeError(\"Cannot access reserved objects such as `Function`.\");\n }\n}\n\nconst allowedConstructors = new WeakSet([\n Array,\n Date,\n Map,\n Set,\n URLSearchParams,\n WeakMap,\n WeakSet,\n]);\n\nexport function isAllowedConstructor(constructor: unknown): boolean {\n return allowedConstructors.has(constructor as ArrayConstructor);\n}\n"],"file":"sanitize.js"}