@next-core/cook 1.4.1-alpha.0 → 1.6.2

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.
@@ -1,3 +1,4 @@
1
+ import _objectSpread from "@babel/runtime/helpers/objectSpread2";
1
2
  import { hasOwnProperty } from "./hasOwnProperty";
2
3
  import { AnalysisContext, AnalysisEnvironment } from "./AnalysisContext";
3
4
  import { collectBoundNames, collectScopedDeclarations, containsExpression } from "./traverse";
@@ -9,11 +10,13 @@ import { collectBoundNames, collectScopedDeclarations, containsExpression } from
9
10
  * @param options - Analysis options.
10
11
  * @returns A set of global variables the root AST attempts to access.
11
12
  */
12
- export function precook(rootAst, {
13
- expressionOnly,
14
- visitors,
15
- hooks = {}
16
- } = {}) {
13
+ export function precook(rootAst) {
14
+ var {
15
+ expressionOnly,
16
+ visitors,
17
+ withParent,
18
+ hooks = {}
19
+ } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
17
20
  var attemptToVisitGlobals = new Set();
18
21
  var analysisContextStack = [];
19
22
  var rootEnv = new AnalysisEnvironment(null);
@@ -32,102 +35,107 @@ export function precook(rootAst, {
32
35
  }
33
36
  }
34
37
 
35
- function Evaluate(node) {
38
+ function EvaluateChildren(node, keys, parent) {
39
+ for (var key of keys) {
40
+ Evaluate(node[key], parent === null || parent === void 0 ? void 0 : parent.concat({
41
+ node,
42
+ key
43
+ }));
44
+ }
45
+ }
46
+
47
+ function Evaluate(node, parent) {
36
48
  if (Array.isArray(node)) {
37
- for (var n of node) {
38
- Evaluate(n);
39
- }
49
+ node.forEach((n, index) => {
50
+ Evaluate(n, parent ? parent.slice(0, -1).concat(_objectSpread(_objectSpread({}, parent[parent.length - 1]), {}, {
51
+ index
52
+ })) : parent);
53
+ });
40
54
  } else if (node) {
41
- var _hooks$beforeVisit;
55
+ var _hooks$beforeVisit, _hooks$beforeVisitUnk;
42
56
 
43
57
  // `node` maybe `null` in some cases.
44
- (_hooks$beforeVisit = hooks.beforeVisit) === null || _hooks$beforeVisit === void 0 ? void 0 : _hooks$beforeVisit.call(hooks, node);
58
+ (_hooks$beforeVisit = hooks.beforeVisit) === null || _hooks$beforeVisit === void 0 ? void 0 : _hooks$beforeVisit.call(hooks, node, parent);
45
59
  visitors && visit(node); // Expressions:
46
60
 
47
61
  switch (node.type) {
48
62
  case "Identifier":
49
63
  if (!ResolveBinding(node.name)) {
50
- attemptToVisitGlobals.add(node.name);
64
+ var _hooks$beforeVisitGlo;
51
65
 
52
- if (visitors && hasOwnProperty(visitors, "__GlobalVariable")) {
53
- visitors.__GlobalVariable(node);
54
- }
66
+ (_hooks$beforeVisitGlo = hooks.beforeVisitGlobal) === null || _hooks$beforeVisitGlo === void 0 ? void 0 : _hooks$beforeVisitGlo.call(hooks, node, parent);
67
+ attemptToVisitGlobals.add(node.name);
55
68
  }
56
69
 
57
70
  return;
58
71
 
59
72
  case "ArrayExpression":
60
73
  case "ArrayPattern":
61
- Evaluate(node.elements);
74
+ EvaluateChildren(node, ["elements"], parent);
62
75
  return;
63
76
 
64
77
  case "ArrowFunctionExpression":
65
78
  {
66
79
  var env = getRunningContext().LexicalEnvironment;
67
80
  var closure = OrdinaryFunctionCreate(node, env);
68
- CallFunction(closure);
81
+ CallFunction(closure, parent);
69
82
  return;
70
83
  }
71
84
 
72
85
  case "AssignmentPattern":
73
86
  case "BinaryExpression":
74
87
  case "LogicalExpression":
75
- Evaluate(node.left);
76
- Evaluate(node.right);
88
+ EvaluateChildren(node, ["left", "right"], parent);
77
89
  return;
78
90
 
79
91
  case "CallExpression":
80
92
  case "NewExpression":
81
- Evaluate(node.callee);
82
- Evaluate(node.arguments);
93
+ EvaluateChildren(node, ["callee", "arguments"], parent);
83
94
  return;
84
95
 
85
96
  case "ChainExpression":
86
- Evaluate(node.expression);
97
+ EvaluateChildren(node, ["expression"], parent);
87
98
  return;
88
99
 
89
100
  case "ConditionalExpression":
90
- Evaluate(node.test);
91
- Evaluate(node.consequent);
92
- Evaluate(node.alternate);
101
+ EvaluateChildren(node, ["test", "consequent", "alternate"], parent);
93
102
  return;
94
103
 
95
104
  case "MemberExpression":
96
- Evaluate(node.object);
105
+ EvaluateChildren(node, ["object"], parent);
97
106
 
98
107
  if (node.computed) {
99
- Evaluate(node.property);
108
+ EvaluateChildren(node, ["property"], parent);
100
109
  }
101
110
 
102
111
  return;
103
112
 
104
113
  case "ObjectExpression":
105
114
  case "ObjectPattern":
106
- Evaluate(node.properties);
115
+ EvaluateChildren(node, ["properties"], parent);
107
116
  return;
108
117
 
109
118
  case "Property":
110
119
  if (node.computed) {
111
- Evaluate(node.key);
120
+ EvaluateChildren(node, ["key"], parent);
112
121
  }
113
122
 
114
- Evaluate(node.value);
123
+ EvaluateChildren(node, ["value"], parent);
115
124
  return;
116
125
 
117
126
  case "RestElement":
118
127
  case "SpreadElement":
119
128
  case "UnaryExpression":
120
- Evaluate(node.argument);
129
+ EvaluateChildren(node, ["argument"], parent);
121
130
  return;
122
131
 
123
132
  case "SequenceExpression":
124
133
  case "TemplateLiteral":
125
- Evaluate(node.expressions);
134
+ EvaluateChildren(node, ["expressions"], parent);
126
135
  return;
127
136
 
128
137
  case "TaggedTemplateExpression":
129
- Evaluate(node.tag);
130
- Evaluate(node.quasi);
138
+ EvaluateChildren(node, ["tag", "quasi"], parent);
131
139
  return;
132
140
 
133
141
  case "Literal":
@@ -138,8 +146,7 @@ export function precook(rootAst, {
138
146
  // Statements and assignments:
139
147
  switch (node.type) {
140
148
  case "AssignmentExpression":
141
- Evaluate(node.right);
142
- Evaluate(node.left);
149
+ EvaluateChildren(node, ["right", "left"], parent);
143
150
  return;
144
151
 
145
152
  case "BlockStatement":
@@ -153,7 +160,7 @@ export function precook(rootAst, {
153
160
  var blockEnv = new AnalysisEnvironment(oldEnv);
154
161
  BlockDeclarationInstantiation(node.body, blockEnv);
155
162
  runningContext.LexicalEnvironment = blockEnv;
156
- Evaluate(node.body);
163
+ EvaluateChildren(node, ["body"], parent);
157
164
  runningContext.LexicalEnvironment = oldEnv;
158
165
  return;
159
166
  }
@@ -171,20 +178,18 @@ export function precook(rootAst, {
171
178
  var catchEnv = new AnalysisEnvironment(_oldEnv);
172
179
  BoundNamesInstantiation(node.param, catchEnv);
173
180
  _runningContext.LexicalEnvironment = catchEnv;
174
- Evaluate(node.param);
175
- Evaluate(node.body);
181
+ EvaluateChildren(node, ["param", "body"], parent);
176
182
  _runningContext.LexicalEnvironment = _oldEnv;
177
183
  return;
178
184
  }
179
185
 
180
186
  case "DoWhileStatement":
181
- Evaluate(node.body);
182
- Evaluate(node.test);
187
+ EvaluateChildren(node, ["body", "test"], parent);
183
188
  return;
184
189
 
185
190
  case "ExpressionStatement":
186
191
  case "TSAsExpression":
187
- Evaluate(node.expression);
192
+ EvaluateChildren(node, ["expression"], parent);
188
193
  return;
189
194
 
190
195
  case "ForInStatement":
@@ -203,7 +208,7 @@ export function precook(rootAst, {
203
208
  _runningContext2.LexicalEnvironment = newEnv;
204
209
  }
205
210
 
206
- Evaluate(node.right);
211
+ EvaluateChildren(node, ["right"], parent);
207
212
  _runningContext2.LexicalEnvironment = _oldEnv2; // ForIn/OfBodyEvaluation
208
213
 
209
214
  if (lexicalBinding) {
@@ -212,8 +217,7 @@ export function precook(rootAst, {
212
217
  _runningContext2.LexicalEnvironment = iterationEnv;
213
218
  }
214
219
 
215
- Evaluate(node.left);
216
- Evaluate(node.body);
220
+ EvaluateChildren(node, ["left", "body"], parent);
217
221
  _runningContext2.LexicalEnvironment = _oldEnv2;
218
222
  return;
219
223
  }
@@ -234,10 +238,7 @@ export function precook(rootAst, {
234
238
  _runningContext3.LexicalEnvironment = loopEnv;
235
239
  }
236
240
 
237
- Evaluate(node.init);
238
- Evaluate(node.test);
239
- Evaluate(node.body);
240
- Evaluate(node.update);
241
+ EvaluateChildren(node, ["init", "test", "body", "update"], parent);
241
242
  _runningContext3.LexicalEnvironment = _oldEnv3;
242
243
  return;
243
244
  }
@@ -250,7 +251,7 @@ export function precook(rootAst, {
250
251
 
251
252
  _env.CreateBinding(fn);
252
253
 
253
- CallFunction(fo);
254
+ CallFunction(fo, parent);
254
255
  return;
255
256
  }
256
257
 
@@ -258,30 +259,27 @@ export function precook(rootAst, {
258
259
  {
259
260
  var _closure = InstantiateOrdinaryFunctionExpression(node);
260
261
 
261
- CallFunction(_closure);
262
+ CallFunction(_closure, parent);
262
263
  return;
263
264
  }
264
265
 
265
266
  case "IfStatement":
266
- Evaluate(node.test);
267
- Evaluate(node.consequent);
268
- Evaluate(node.alternate);
267
+ EvaluateChildren(node, ["test", "consequent", "alternate"], parent);
269
268
  return;
270
269
 
271
270
  case "ReturnStatement":
272
271
  case "ThrowStatement":
273
272
  case "UpdateExpression":
274
- Evaluate(node.argument);
273
+ EvaluateChildren(node, ["argument"], parent);
275
274
  return;
276
275
 
277
276
  case "SwitchCase":
278
- Evaluate(node.test);
279
- Evaluate(node.consequent);
277
+ EvaluateChildren(node, ["test", "consequent"], parent);
280
278
  return;
281
279
 
282
280
  case "SwitchStatement":
283
281
  {
284
- Evaluate(node.discriminant);
282
+ EvaluateChildren(node, ["discriminant"], parent);
285
283
 
286
284
  var _runningContext4 = getRunningContext();
287
285
 
@@ -291,36 +289,32 @@ export function precook(rootAst, {
291
289
 
292
290
  BlockDeclarationInstantiation(node.cases, _blockEnv);
293
291
  _runningContext4.LexicalEnvironment = _blockEnv;
294
- Evaluate(node.cases);
292
+ EvaluateChildren(node, ["cases"], parent);
295
293
  _runningContext4.LexicalEnvironment = _oldEnv4;
296
294
  return;
297
295
  }
298
296
 
299
297
  case "TryStatement":
300
- Evaluate(node.block);
301
- Evaluate(node.handler);
302
- Evaluate(node.finalizer);
298
+ EvaluateChildren(node, ["block", "handler", "finalizer"], parent);
303
299
  return;
304
300
 
305
301
  case "VariableDeclaration":
306
- Evaluate(node.declarations);
302
+ EvaluateChildren(node, ["declarations"], parent);
307
303
  return;
308
304
 
309
305
  case "VariableDeclarator":
310
- Evaluate(node.id);
311
- Evaluate(node.init);
306
+ EvaluateChildren(node, ["id", "init"], parent);
312
307
  return;
313
308
 
314
309
  case "WhileStatement":
315
- Evaluate(node.test);
316
- Evaluate(node.body);
310
+ EvaluateChildren(node, ["test", "body"], parent);
317
311
  return;
318
312
  }
319
313
  }
320
314
 
321
- if (visitors && hasOwnProperty(visitors, "__UnknownNode")) {
322
- visitors.__UnknownNode(node);
323
- } else {
315
+ var silent = (_hooks$beforeVisitUnk = hooks.beforeVisitUnknown) === null || _hooks$beforeVisitUnk === void 0 ? void 0 : _hooks$beforeVisitUnk.call(hooks, node, parent);
316
+
317
+ if (!silent) {
324
318
  // eslint-disable-next-line no-console
325
319
  console.warn("Unsupported node type `".concat(node.type, "`"));
326
320
  }
@@ -350,10 +344,16 @@ export function precook(rootAst, {
350
344
  BoundNamesInstantiation(declarations, env);
351
345
  }
352
346
 
353
- function CallFunction(closure) {
347
+ function CallFunction(closure, parent) {
354
348
  PrepareOrdinaryCall(closure);
355
- FunctionDeclarationInstantiation(closure);
356
- Evaluate(closure.ECMAScriptCode);
349
+ FunctionDeclarationInstantiation(closure, parent);
350
+ Evaluate(closure.ECMAScriptCode, parent === null || parent === void 0 ? void 0 : parent.concat({
351
+ node: closure.Function,
352
+ key: "body"
353
+ }).concat(closure.Function.body.type === "BlockStatement" ? {
354
+ node: closure.Function.body,
355
+ key: "body"
356
+ } : []));
357
357
  analysisContextStack.pop();
358
358
  }
359
359
 
@@ -365,7 +365,7 @@ export function precook(rootAst, {
365
365
  analysisContextStack.push(calleeContext);
366
366
  }
367
367
 
368
- function FunctionDeclarationInstantiation(func) {
368
+ function FunctionDeclarationInstantiation(func, parent) {
369
369
  var calleeContext = getRunningContext();
370
370
  var code = func.ECMAScriptCode;
371
371
  var formals = func.FormalParameters;
@@ -377,7 +377,10 @@ export function precook(rootAst, {
377
377
  var varNames = collectBoundNames(varDeclarations);
378
378
  var env = calleeContext.LexicalEnvironment;
379
379
  BoundNamesInstantiation(formals, env);
380
- Evaluate(formals);
380
+ Evaluate(formals, parent === null || parent === void 0 ? void 0 : parent.concat({
381
+ node: func.Function,
382
+ key: "params"
383
+ }));
381
384
  var varEnv;
382
385
 
383
386
  if (!hasParameterExpressions) {
@@ -422,18 +425,16 @@ export function precook(rootAst, {
422
425
  return OrdinaryFunctionCreate(functionExpression, funcEnv);
423
426
  }
424
427
 
425
- function OrdinaryFunctionCreate({
426
- params,
427
- body
428
- }, scope) {
428
+ function OrdinaryFunctionCreate(func, scope) {
429
429
  return {
430
- FormalParameters: params,
431
- ECMAScriptCode: body.type === "BlockStatement" ? body.body : body,
430
+ Function: func,
431
+ FormalParameters: func.params,
432
+ ECMAScriptCode: func.body.type === "BlockStatement" ? func.body.body : func.body,
432
433
  Environment: scope
433
434
  };
434
435
  }
435
436
 
436
- Evaluate(rootAst);
437
+ Evaluate(rootAst, withParent ? [] : undefined);
437
438
  return attemptToVisitGlobals;
438
439
  }
439
440
  //# sourceMappingURL=precook.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/precook.ts"],"names":["hasOwnProperty","AnalysisContext","AnalysisEnvironment","collectBoundNames","collectScopedDeclarations","containsExpression","precook","rootAst","expressionOnly","visitors","hooks","attemptToVisitGlobals","Set","analysisContextStack","rootEnv","rootContext","VariableEnvironment","LexicalEnvironment","push","getRunningContext","length","visit","node","type","Evaluate","Array","isArray","n","beforeVisit","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 hooks?: PrecookHooks;\n}\n\nexport interface PrecookHooks {\n beforeVisit?(node: EstreeNode): void;\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, hooks = {} }: 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 hooks.beforeVisit?.(node);\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"}
1
+ {"version":3,"sources":["../../src/precook.ts"],"names":["hasOwnProperty","AnalysisContext","AnalysisEnvironment","collectBoundNames","collectScopedDeclarations","containsExpression","precook","rootAst","expressionOnly","visitors","withParent","hooks","attemptToVisitGlobals","Set","analysisContextStack","rootEnv","rootContext","VariableEnvironment","LexicalEnvironment","push","getRunningContext","length","visit","node","type","EvaluateChildren","keys","parent","key","Evaluate","concat","Array","isArray","forEach","n","index","slice","beforeVisit","ResolveBinding","name","beforeVisitGlobal","add","env","closure","OrdinaryFunctionCreate","CallFunction","computed","body","runningContext","oldEnv","blockEnv","BlockDeclarationInstantiation","catchEnv","BoundNamesInstantiation","param","lexicalBinding","left","kind","newEnv","iterationEnv","init","loopEnv","fn","fo","CreateBinding","InstantiateOrdinaryFunctionExpression","cases","silent","beforeVisitUnknown","console","warn","declarations","GetIdentifierReference","HasBinding","OuterEnv","code","var","topLevel","PrepareOrdinaryCall","FunctionDeclarationInstantiation","ECMAScriptCode","Function","pop","F","calleeContext","localEnv","Environment","func","formals","FormalParameters","hasParameterExpressions","varDeclarations","varNames","varEnv","lexEnv","lexDeclarations","functionExpression","scope","id","funcEnv","params","undefined"],"mappings":"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","sourcesContent":["import {\n ArrowFunctionExpression,\n Expression,\n FunctionDeclaration,\n FunctionExpression,\n Identifier,\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 /** @deprecated Use hooks instead. */\n visitors?: EstreeVisitors;\n hooks?: PrecookHooks;\n withParent?: boolean;\n}\n\nexport type EstreeParent = EstreeParentItem[];\n\nexport interface EstreeParentItem {\n node: EstreeNode;\n key: string;\n index?: number;\n}\n\nexport interface PrecookHooks {\n beforeVisit?(node: EstreeNode, parent?: EstreeParent): void;\n beforeVisitGlobal?(node: Identifier, parent?: EstreeParent): void;\n /** Return true if want to silent warnings for unknown nodes. */\n beforeVisitUnknown?(node: EstreeNode, parent?: EstreeParent): boolean | void;\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, withParent, hooks = {} }: 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 EvaluateChildren<T extends EstreeNode>(\n node: T,\n keys: (keyof T)[],\n parent?: EstreeParent\n ): void {\n for (const key of keys) {\n Evaluate(\n node[key] as unknown as EstreeNode | EstreeNode[],\n parent?.concat({ node, key } as EstreeParentItem)\n );\n }\n }\n\n function Evaluate(\n node: EstreeNode | EstreeNode[],\n parent?: EstreeParent\n ): void {\n if (Array.isArray(node)) {\n node.forEach((n, index) => {\n Evaluate(\n n,\n parent\n ? parent.slice(0, -1).concat({\n ...parent[parent.length - 1],\n index,\n })\n : parent\n );\n });\n } else if (node) {\n // `node` maybe `null` in some cases.\n hooks.beforeVisit?.(node, parent);\n visitors && visit(node);\n // Expressions:\n switch (node.type) {\n case \"Identifier\":\n if (!ResolveBinding(node.name)) {\n hooks.beforeVisitGlobal?.(node, parent);\n attemptToVisitGlobals.add(node.name);\n }\n return;\n case \"ArrayExpression\":\n case \"ArrayPattern\":\n EvaluateChildren(node, [\"elements\"], parent);\n return;\n case \"ArrowFunctionExpression\": {\n const env = getRunningContext().LexicalEnvironment;\n const closure = OrdinaryFunctionCreate(node, env);\n CallFunction(closure, parent);\n return;\n }\n case \"AssignmentPattern\":\n case \"BinaryExpression\":\n case \"LogicalExpression\":\n EvaluateChildren(node, [\"left\", \"right\"], parent);\n return;\n case \"CallExpression\":\n case \"NewExpression\":\n EvaluateChildren(node, [\"callee\", \"arguments\"], parent);\n return;\n case \"ChainExpression\":\n EvaluateChildren(node, [\"expression\"], parent);\n return;\n case \"ConditionalExpression\":\n EvaluateChildren(node, [\"test\", \"consequent\", \"alternate\"], parent);\n return;\n case \"MemberExpression\":\n EvaluateChildren(node, [\"object\"], parent);\n if (node.computed) {\n EvaluateChildren(node, [\"property\"], parent);\n }\n return;\n case \"ObjectExpression\":\n case \"ObjectPattern\":\n EvaluateChildren(node, [\"properties\"], parent);\n return;\n case \"Property\":\n if (node.computed) {\n EvaluateChildren(node, [\"key\"], parent);\n }\n EvaluateChildren(node, [\"value\"], parent);\n return;\n case \"RestElement\":\n case \"SpreadElement\":\n case \"UnaryExpression\":\n EvaluateChildren(node, [\"argument\"], parent);\n return;\n case \"SequenceExpression\":\n case \"TemplateLiteral\":\n EvaluateChildren(node, [\"expressions\"], parent);\n return;\n case \"TaggedTemplateExpression\":\n EvaluateChildren(node, [\"tag\", \"quasi\"], parent);\n return;\n case \"Literal\":\n return;\n }\n if (!expressionOnly) {\n // Statements and assignments:\n switch (node.type) {\n case \"AssignmentExpression\":\n EvaluateChildren(node, [\"right\", \"left\"], parent);\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 EvaluateChildren(node, [\"body\"], parent);\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 EvaluateChildren(node, [\"param\", \"body\"], parent);\n runningContext.LexicalEnvironment = oldEnv;\n return;\n }\n case \"DoWhileStatement\":\n EvaluateChildren(node, [\"body\", \"test\"], parent);\n return;\n case \"ExpressionStatement\":\n case \"TSAsExpression\":\n EvaluateChildren(node, [\"expression\"], parent);\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 EvaluateChildren(node, [\"right\"], parent);\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 EvaluateChildren(node, [\"left\", \"body\"], parent);\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 EvaluateChildren(node, [\"init\", \"test\", \"body\", \"update\"], parent);\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, parent);\n return;\n }\n case \"FunctionExpression\": {\n const closure = InstantiateOrdinaryFunctionExpression(node);\n CallFunction(closure, parent);\n return;\n }\n case \"IfStatement\":\n EvaluateChildren(node, [\"test\", \"consequent\", \"alternate\"], parent);\n return;\n case \"ReturnStatement\":\n case \"ThrowStatement\":\n case \"UpdateExpression\":\n EvaluateChildren(node, [\"argument\"], parent);\n return;\n case \"SwitchCase\":\n EvaluateChildren(node, [\"test\", \"consequent\"], parent);\n return;\n case \"SwitchStatement\": {\n EvaluateChildren(node, [\"discriminant\"], parent);\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 EvaluateChildren(node, [\"cases\"], parent);\n runningContext.LexicalEnvironment = oldEnv;\n return;\n }\n case \"TryStatement\":\n EvaluateChildren(node, [\"block\", \"handler\", \"finalizer\"], parent);\n return;\n case \"VariableDeclaration\":\n EvaluateChildren(node, [\"declarations\"], parent);\n return;\n case \"VariableDeclarator\":\n EvaluateChildren(node, [\"id\", \"init\"], parent);\n return;\n case \"WhileStatement\":\n EvaluateChildren(node, [\"test\", \"body\"], parent);\n return;\n }\n }\n const silent = hooks.beforeVisitUnknown?.(node, parent);\n if (!silent) {\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(\n closure: AnalysisFunctionObject,\n parent?: EstreeParent\n ): void {\n PrepareOrdinaryCall(closure);\n FunctionDeclarationInstantiation(closure, parent);\n Evaluate(\n closure.ECMAScriptCode,\n parent\n ?.concat({\n node: closure.Function,\n key: \"body\",\n })\n .concat(\n closure.Function.body.type === \"BlockStatement\"\n ? {\n node: closure.Function.body,\n key: \"body\",\n }\n : []\n )\n );\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 parent?: EstreeParent\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, parent?.concat({ node: func.Function, key: \"params\" }));\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 func: FunctionDeclaration | FunctionExpression | ArrowFunctionExpression,\n scope: AnalysisEnvironment\n ): AnalysisFunctionObject {\n return {\n Function: func,\n FormalParameters: func.params,\n ECMAScriptCode:\n func.body.type === \"BlockStatement\" ? func.body.body : func.body,\n Environment: scope,\n };\n }\n\n Evaluate(rootAst, withParent ? [] : undefined);\n\n return attemptToVisitGlobals;\n}\n"],"file":"precook.js"}
@@ -2,8 +2,9 @@ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProper
2
2
  var _excluded = ["typescript"];
3
3
  import { parseAsEstree } from "./parse";
4
4
  import { precook } from "./precook";
5
- export function precookFunction(source, _ref = {}) {
6
- var {
5
+ export function precookFunction(source) {
6
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
7
+ {
7
8
  typescript
8
9
  } = _ref,
9
10
  restOptions = _objectWithoutProperties(_ref, _excluded);
@@ -1 +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"}
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,EAGkB;AAAA,iFADkC,EAClC;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"}
@@ -1,4 +1,4 @@
1
- import { Expression, FunctionDeclaration, Statement } from "@babel/types";
1
+ import { ArrowFunctionExpression, Expression, FunctionDeclaration, FunctionExpression, Statement } from "@babel/types";
2
2
  export declare class AnalysisContext {
3
3
  VariableEnvironment: AnalysisEnvironment;
4
4
  LexicalEnvironment: AnalysisEnvironment;
@@ -11,6 +11,7 @@ export declare class AnalysisEnvironment {
11
11
  CreateBinding(name: string): void;
12
12
  }
13
13
  export interface AnalysisFunctionObject {
14
+ Function: FunctionDeclaration | FunctionExpression | ArrowFunctionExpression;
14
15
  FormalParameters: FunctionDeclaration["params"];
15
16
  ECMAScriptCode: Statement[] | Expression;
16
17
  Environment: AnalysisEnvironment;
@@ -1,5 +1,8 @@
1
1
  export * from "./cook";
2
2
  export * from "./lint";
3
+ export { parseForAnalysis } from "./parse";
4
+ export * from "./precook";
3
5
  export * from "./precookFunction";
4
6
  export * from "./preevaluate";
5
7
  export * from "./interfaces";
8
+ export { tokTypes } from "@babel/parser";
@@ -1,4 +1,5 @@
1
- import { SourceLocation } from "@babel/types";
1
+ import { ParseResult } from "@babel/parser";
2
+ import { File, SourceLocation } from "@babel/types";
2
3
  import { CookRules } from "./interfaces";
3
4
  export interface LintOptions {
4
5
  typescript?: boolean;
@@ -10,4 +11,4 @@ export interface LintError {
10
11
  loc: SourceLocation;
11
12
  }
12
13
  /** For next-core internal or devtools usage only. */
13
- export declare function lint(source: string, { typescript, rules }?: LintOptions): LintError[];
14
+ export declare function lint(source: string | ParseResult<File>, { typescript, rules }?: LintOptions): LintError[];
@@ -1,6 +1,13 @@
1
- import { Expression, FunctionDeclaration } from "@babel/types";
1
+ import { ParseResult } from "@babel/parser";
2
+ import { Expression, File, FunctionDeclaration } from "@babel/types";
2
3
  export declare function parseAsEstreeExpression(source: string): Expression;
3
4
  export interface ParseEstreeOptions {
4
5
  typescript?: boolean;
5
6
  }
6
7
  export declare function parseAsEstree(source: string, { typescript }?: ParseEstreeOptions): FunctionDeclaration;
8
+ export interface AnalysisOptions {
9
+ typescript?: boolean;
10
+ tokens?: boolean;
11
+ }
12
+ /** For next-core internal or devtools usage only. */
13
+ export declare function parseForAnalysis(source: string, { typescript, tokens }?: AnalysisOptions): ParseResult<File>;
@@ -1,12 +1,23 @@
1
- import { Expression, FunctionDeclaration } from "@babel/types";
1
+ import { Expression, FunctionDeclaration, Identifier } from "@babel/types";
2
2
  import { EstreeNode, EstreeVisitors } from "./interfaces";
3
3
  export interface PrecookOptions {
4
4
  expressionOnly?: boolean;
5
+ /** @deprecated Use hooks instead. */
5
6
  visitors?: EstreeVisitors;
6
7
  hooks?: PrecookHooks;
8
+ withParent?: boolean;
9
+ }
10
+ export declare type EstreeParent = EstreeParentItem[];
11
+ export interface EstreeParentItem {
12
+ node: EstreeNode;
13
+ key: string;
14
+ index?: number;
7
15
  }
8
16
  export interface PrecookHooks {
9
- beforeVisit?(node: EstreeNode): void;
17
+ beforeVisit?(node: EstreeNode, parent?: EstreeParent): void;
18
+ beforeVisitGlobal?(node: Identifier, parent?: EstreeParent): void;
19
+ /** Return true if want to silent warnings for unknown nodes. */
20
+ beforeVisitUnknown?(node: EstreeNode, parent?: EstreeParent): boolean | void;
10
21
  }
11
22
  /**
12
23
  * Analysis an AST of a storyboard function or an evaluation expression.
@@ -15,4 +26,4 @@ export interface PrecookHooks {
15
26
  * @param options - Analysis options.
16
27
  * @returns A set of global variables the root AST attempts to access.
17
28
  */
18
- export declare function precook(rootAst: Expression | FunctionDeclaration, { expressionOnly, visitors, hooks }?: PrecookOptions): Set<string>;
29
+ export declare function precook(rootAst: Expression | FunctionDeclaration, { expressionOnly, visitors, withParent, hooks }?: PrecookOptions): Set<string>;