@next-core/cook 1.5.0 → 1.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,43 +3,51 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
- # [1.5.0](https://github.com/easyops-cn/next-core/compare/@next-core/cook@1.4.0...@next-core/cook@1.5.0) (2021-11-26)
6
+ ## [1.6.3](https://github.com/easyops-cn/next-core/compare/@next-core/cook@1.6.2...@next-core/cook@1.6.3) (2021-12-23)
7
7
 
8
+ **Note:** Version bump only for package @next-core/cook
8
9
 
9
- ### Features
10
10
 
11
- * support hooks for before visit global or unknown nodes ([50d770c](https://github.com/easyops-cn/next-core/commit/50d770c45a8194c12c3764f53d75a1a9519b790e))
12
11
 
13
12
 
14
13
 
14
+ ## [1.6.2](https://github.com/easyops-cn/next-core/compare/@next-core/cook@1.6.1...@next-core/cook@1.6.2) (2021-12-17)
15
15
 
16
+ **Note:** Version bump only for package @next-core/cook
16
17
 
17
- # [1.4.0](https://github.com/easyops-cn/next-core/compare/@next-core/cook@1.3.9...@next-core/cook@1.4.0) (2021-11-25)
18
18
 
19
19
 
20
- ### Features
21
-
22
- * support parseForAnalysis ([681de0a](https://github.com/easyops-cn/next-core/commit/681de0aef914b4e30d428180cad54cc0f9882b59))
23
20
 
24
21
 
22
+ ## [1.6.1](https://github.com/easyops-cn/next-core/compare/@next-core/cook@1.6.0...@next-core/cook@1.6.1) (2021-12-03)
25
23
 
24
+ **Note:** Version bump only for package @next-core/cook
26
25
 
26
+ # [1.6.0](https://github.com/easyops-cn/next-core/compare/@next-core/cook@1.5.0...@next-core/cook@1.6.0) (2021-11-29)
27
27
 
28
- ## [1.3.9](https://github.com/easyops-cn/next-core/compare/@next-core/cook@1.3.8...@next-core/cook@1.3.9) (2021-11-23)
28
+ ### Features
29
29
 
30
- **Note:** Version bump only for package @next-core/cook
30
+ - support visit node with parent ([80f1ada](https://github.com/easyops-cn/next-core/commit/80f1ada97e1b720f787753fab4eedf618c08f36b))
31
31
 
32
+ # [1.5.0](https://github.com/easyops-cn/next-core/compare/@next-core/cook@1.4.0...@next-core/cook@1.5.0) (2021-11-26)
32
33
 
34
+ ### Features
33
35
 
36
+ - support hooks for before visit global or unknown nodes ([50d770c](https://github.com/easyops-cn/next-core/commit/50d770c45a8194c12c3764f53d75a1a9519b790e))
34
37
 
38
+ # [1.4.0](https://github.com/easyops-cn/next-core/compare/@next-core/cook@1.3.9...@next-core/cook@1.4.0) (2021-11-25)
35
39
 
36
- ## [1.3.8](https://github.com/easyops-cn/next-core/compare/@next-core/cook@1.3.7...@next-core/cook@1.3.8) (2021-11-18)
40
+ ### Features
37
41
 
38
- **Note:** Version bump only for package @next-core/cook
42
+ - support parseForAnalysis ([681de0a](https://github.com/easyops-cn/next-core/commit/681de0aef914b4e30d428180cad54cc0f9882b59))
39
43
 
44
+ ## [1.3.9](https://github.com/easyops-cn/next-core/compare/@next-core/cook@1.3.8...@next-core/cook@1.3.9) (2021-11-23)
40
45
 
46
+ **Note:** Version bump only for package @next-core/cook
41
47
 
48
+ ## [1.3.8](https://github.com/easyops-cn/next-core/compare/@next-core/cook@1.3.7...@next-core/cook@1.3.8) (2021-11-18)
42
49
 
50
+ **Note:** Version bump only for package @next-core/cook
43
51
 
44
52
  ## [1.3.7](https://github.com/easyops-cn/next-core/compare/@next-core/cook@1.3.6...@next-core/cook@1.3.7) (2021-11-11)
45
53
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/AnalysisContext.ts"],"names":["AnalysisContext","AnalysisEnvironment","constructor","outer","Set","OuterEnv","HasBinding","name","bindingSet","has","CreateBinding","add"],"mappings":";;;;;;;;;;;AAEA;AACO,MAAMA,eAAN,CAAsB;AAAA;AAAA;AAAA;AAAA;;AAAA,C,CAK7B;;;;;AACO,MAAMC,mBAAN,CAA0B;AAI/BC,EAAAA,WAAW,CAACC,KAAD,EAA6B;AAAA;AAAA,sDAFV,IAAIC,GAAJ,EAEU;AACtC,SAAKC,QAAL,GAAgBF,KAAhB;AACD;;AAEDG,EAAAA,UAAU,CAACC,IAAD,EAAwB;AAChC,WAAO,KAAKC,UAAL,CAAgBC,GAAhB,CAAoBF,IAApB,CAAP;AACD;;AAEDG,EAAAA,aAAa,CAACH,IAAD,EAAqB;AAChC,SAAKC,UAAL,CAAgBG,GAAhB,CAAoBJ,IAApB;AACD;;AAd8B","sourcesContent":["import { Expression, FunctionDeclaration, Statement } from \"@babel/types\";\n\n// https://tc39.es/ecma262/#sec-execution-contexts\nexport class AnalysisContext {\n VariableEnvironment: AnalysisEnvironment;\n LexicalEnvironment: AnalysisEnvironment;\n}\n\n// https://tc39.es/ecma262/#sec-environment-records\nexport class AnalysisEnvironment {\n readonly OuterEnv: AnalysisEnvironment;\n private readonly bindingSet = new Set<string>();\n\n constructor(outer: AnalysisEnvironment) {\n this.OuterEnv = outer;\n }\n\n HasBinding(name: string): boolean {\n return this.bindingSet.has(name);\n }\n\n CreateBinding(name: string): void {\n this.bindingSet.add(name);\n }\n}\n\nexport interface AnalysisFunctionObject {\n FormalParameters: FunctionDeclaration[\"params\"];\n ECMAScriptCode: Statement[] | Expression;\n Environment: AnalysisEnvironment;\n}\n"],"file":"AnalysisContext.js"}
1
+ {"version":3,"sources":["../../src/AnalysisContext.ts"],"names":["AnalysisContext","AnalysisEnvironment","constructor","outer","Set","OuterEnv","HasBinding","name","bindingSet","has","CreateBinding","add"],"mappings":";;;;;;;;;;;AAQA;AACO,MAAMA,eAAN,CAAsB;AAAA;AAAA;AAAA;AAAA;;AAAA,C,CAK7B;;;;;AACO,MAAMC,mBAAN,CAA0B;AAI/BC,EAAAA,WAAW,CAACC,KAAD,EAA6B;AAAA;AAAA,sDAFV,IAAIC,GAAJ,EAEU;AACtC,SAAKC,QAAL,GAAgBF,KAAhB;AACD;;AAEDG,EAAAA,UAAU,CAACC,IAAD,EAAwB;AAChC,WAAO,KAAKC,UAAL,CAAgBC,GAAhB,CAAoBF,IAApB,CAAP;AACD;;AAEDG,EAAAA,aAAa,CAACH,IAAD,EAAqB;AAChC,SAAKC,UAAL,CAAgBG,GAAhB,CAAoBJ,IAApB;AACD;;AAd8B","sourcesContent":["import {\n ArrowFunctionExpression,\n Expression,\n FunctionDeclaration,\n FunctionExpression,\n Statement,\n} from \"@babel/types\";\n\n// https://tc39.es/ecma262/#sec-execution-contexts\nexport class AnalysisContext {\n VariableEnvironment: AnalysisEnvironment;\n LexicalEnvironment: AnalysisEnvironment;\n}\n\n// https://tc39.es/ecma262/#sec-environment-records\nexport class AnalysisEnvironment {\n readonly OuterEnv: AnalysisEnvironment;\n private readonly bindingSet = new Set<string>();\n\n constructor(outer: AnalysisEnvironment) {\n this.OuterEnv = outer;\n }\n\n HasBinding(name: string): boolean {\n return this.bindingSet.has(name);\n }\n\n CreateBinding(name: string): void {\n this.bindingSet.add(name);\n }\n}\n\nexport interface AnalysisFunctionObject {\n Function: FunctionDeclaration | FunctionExpression | ArrowFunctionExpression;\n FormalParameters: FunctionDeclaration[\"params\"];\n ECMAScriptCode: Statement[] | Expression;\n Environment: AnalysisEnvironment;\n}\n"],"file":"AnalysisContext.js"}
@@ -21,6 +21,7 @@ var _traverse = require("./traverse");
21
21
  function precook(rootAst, {
22
22
  expressionOnly,
23
23
  visitors,
24
+ withParent,
24
25
  hooks = {}
25
26
  } = {}) {
26
27
  const attemptToVisitGlobals = new Set();
@@ -41,16 +42,27 @@ function precook(rootAst, {
41
42
  }
42
43
  }
43
44
 
44
- function Evaluate(node) {
45
+ function EvaluateChildren(node, keys, parent) {
46
+ for (const key of keys) {
47
+ Evaluate(node[key], parent === null || parent === void 0 ? void 0 : parent.concat({
48
+ node,
49
+ key
50
+ }));
51
+ }
52
+ }
53
+
54
+ function Evaluate(node, parent) {
45
55
  if (Array.isArray(node)) {
46
- for (const n of node) {
47
- Evaluate(n);
48
- }
56
+ node.forEach((n, index) => {
57
+ Evaluate(n, parent ? parent.slice(0, -1).concat({ ...parent[parent.length - 1],
58
+ index
59
+ }) : parent);
60
+ });
49
61
  } else if (node) {
50
62
  var _hooks$beforeVisit, _hooks$beforeVisitUnk;
51
63
 
52
64
  // `node` maybe `null` in some cases.
53
- (_hooks$beforeVisit = hooks.beforeVisit) === null || _hooks$beforeVisit === void 0 ? void 0 : _hooks$beforeVisit.call(hooks, node);
65
+ (_hooks$beforeVisit = hooks.beforeVisit) === null || _hooks$beforeVisit === void 0 ? void 0 : _hooks$beforeVisit.call(hooks, node, parent);
54
66
  visitors && visit(node); // Expressions:
55
67
 
56
68
  switch (node.type) {
@@ -58,7 +70,7 @@ function precook(rootAst, {
58
70
  if (!ResolveBinding(node.name)) {
59
71
  var _hooks$beforeVisitGlo;
60
72
 
61
- (_hooks$beforeVisitGlo = hooks.beforeVisitGlobal) === null || _hooks$beforeVisitGlo === void 0 ? void 0 : _hooks$beforeVisitGlo.call(hooks, node);
73
+ (_hooks$beforeVisitGlo = hooks.beforeVisitGlobal) === null || _hooks$beforeVisitGlo === void 0 ? void 0 : _hooks$beforeVisitGlo.call(hooks, node, parent);
62
74
  attemptToVisitGlobals.add(node.name);
63
75
  }
64
76
 
@@ -66,76 +78,71 @@ function precook(rootAst, {
66
78
 
67
79
  case "ArrayExpression":
68
80
  case "ArrayPattern":
69
- Evaluate(node.elements);
81
+ EvaluateChildren(node, ["elements"], parent);
70
82
  return;
71
83
 
72
84
  case "ArrowFunctionExpression":
73
85
  {
74
86
  const env = getRunningContext().LexicalEnvironment;
75
87
  const closure = OrdinaryFunctionCreate(node, env);
76
- CallFunction(closure);
88
+ CallFunction(closure, parent);
77
89
  return;
78
90
  }
79
91
 
80
92
  case "AssignmentPattern":
81
93
  case "BinaryExpression":
82
94
  case "LogicalExpression":
83
- Evaluate(node.left);
84
- Evaluate(node.right);
95
+ EvaluateChildren(node, ["left", "right"], parent);
85
96
  return;
86
97
 
87
98
  case "CallExpression":
88
99
  case "NewExpression":
89
- Evaluate(node.callee);
90
- Evaluate(node.arguments);
100
+ EvaluateChildren(node, ["callee", "arguments"], parent);
91
101
  return;
92
102
 
93
103
  case "ChainExpression":
94
- Evaluate(node.expression);
104
+ EvaluateChildren(node, ["expression"], parent);
95
105
  return;
96
106
 
97
107
  case "ConditionalExpression":
98
- Evaluate(node.test);
99
- Evaluate(node.consequent);
100
- Evaluate(node.alternate);
108
+ EvaluateChildren(node, ["test", "consequent", "alternate"], parent);
101
109
  return;
102
110
 
103
111
  case "MemberExpression":
104
- Evaluate(node.object);
112
+ EvaluateChildren(node, ["object"], parent);
105
113
 
106
114
  if (node.computed) {
107
- Evaluate(node.property);
115
+ EvaluateChildren(node, ["property"], parent);
108
116
  }
109
117
 
110
118
  return;
111
119
 
112
120
  case "ObjectExpression":
113
121
  case "ObjectPattern":
114
- Evaluate(node.properties);
122
+ EvaluateChildren(node, ["properties"], parent);
115
123
  return;
116
124
 
117
125
  case "Property":
118
126
  if (node.computed) {
119
- Evaluate(node.key);
127
+ EvaluateChildren(node, ["key"], parent);
120
128
  }
121
129
 
122
- Evaluate(node.value);
130
+ EvaluateChildren(node, ["value"], parent);
123
131
  return;
124
132
 
125
133
  case "RestElement":
126
134
  case "SpreadElement":
127
135
  case "UnaryExpression":
128
- Evaluate(node.argument);
136
+ EvaluateChildren(node, ["argument"], parent);
129
137
  return;
130
138
 
131
139
  case "SequenceExpression":
132
140
  case "TemplateLiteral":
133
- Evaluate(node.expressions);
141
+ EvaluateChildren(node, ["expressions"], parent);
134
142
  return;
135
143
 
136
144
  case "TaggedTemplateExpression":
137
- Evaluate(node.tag);
138
- Evaluate(node.quasi);
145
+ EvaluateChildren(node, ["tag", "quasi"], parent);
139
146
  return;
140
147
 
141
148
  case "Literal":
@@ -146,8 +153,7 @@ function precook(rootAst, {
146
153
  // Statements and assignments:
147
154
  switch (node.type) {
148
155
  case "AssignmentExpression":
149
- Evaluate(node.right);
150
- Evaluate(node.left);
156
+ EvaluateChildren(node, ["right", "left"], parent);
151
157
  return;
152
158
 
153
159
  case "BlockStatement":
@@ -161,7 +167,7 @@ function precook(rootAst, {
161
167
  const blockEnv = new _AnalysisContext.AnalysisEnvironment(oldEnv);
162
168
  BlockDeclarationInstantiation(node.body, blockEnv);
163
169
  runningContext.LexicalEnvironment = blockEnv;
164
- Evaluate(node.body);
170
+ EvaluateChildren(node, ["body"], parent);
165
171
  runningContext.LexicalEnvironment = oldEnv;
166
172
  return;
167
173
  }
@@ -178,20 +184,18 @@ function precook(rootAst, {
178
184
  const catchEnv = new _AnalysisContext.AnalysisEnvironment(oldEnv);
179
185
  BoundNamesInstantiation(node.param, catchEnv);
180
186
  runningContext.LexicalEnvironment = catchEnv;
181
- Evaluate(node.param);
182
- Evaluate(node.body);
187
+ EvaluateChildren(node, ["param", "body"], parent);
183
188
  runningContext.LexicalEnvironment = oldEnv;
184
189
  return;
185
190
  }
186
191
 
187
192
  case "DoWhileStatement":
188
- Evaluate(node.body);
189
- Evaluate(node.test);
193
+ EvaluateChildren(node, ["body", "test"], parent);
190
194
  return;
191
195
 
192
196
  case "ExpressionStatement":
193
197
  case "TSAsExpression":
194
- Evaluate(node.expression);
198
+ EvaluateChildren(node, ["expression"], parent);
195
199
  return;
196
200
 
197
201
  case "ForInStatement":
@@ -208,7 +212,7 @@ function precook(rootAst, {
208
212
  runningContext.LexicalEnvironment = newEnv;
209
213
  }
210
214
 
211
- Evaluate(node.right);
215
+ EvaluateChildren(node, ["right"], parent);
212
216
  runningContext.LexicalEnvironment = oldEnv; // ForIn/OfBodyEvaluation
213
217
 
214
218
  if (lexicalBinding) {
@@ -217,8 +221,7 @@ function precook(rootAst, {
217
221
  runningContext.LexicalEnvironment = iterationEnv;
218
222
  }
219
223
 
220
- Evaluate(node.left);
221
- Evaluate(node.body);
224
+ EvaluateChildren(node, ["left", "body"], parent);
222
225
  runningContext.LexicalEnvironment = oldEnv;
223
226
  return;
224
227
  }
@@ -237,10 +240,7 @@ function precook(rootAst, {
237
240
  runningContext.LexicalEnvironment = loopEnv;
238
241
  }
239
242
 
240
- Evaluate(node.init);
241
- Evaluate(node.test);
242
- Evaluate(node.body);
243
- Evaluate(node.update);
243
+ EvaluateChildren(node, ["init", "test", "body", "update"], parent);
244
244
  runningContext.LexicalEnvironment = oldEnv;
245
245
  return;
246
246
  }
@@ -251,70 +251,63 @@ function precook(rootAst, {
251
251
  const env = getRunningContext().LexicalEnvironment;
252
252
  const fo = OrdinaryFunctionCreate(node, env);
253
253
  env.CreateBinding(fn);
254
- CallFunction(fo);
254
+ CallFunction(fo, parent);
255
255
  return;
256
256
  }
257
257
 
258
258
  case "FunctionExpression":
259
259
  {
260
260
  const closure = InstantiateOrdinaryFunctionExpression(node);
261
- CallFunction(closure);
261
+ CallFunction(closure, parent);
262
262
  return;
263
263
  }
264
264
 
265
265
  case "IfStatement":
266
- Evaluate(node.test);
267
- Evaluate(node.consequent);
268
- Evaluate(node.alternate);
266
+ EvaluateChildren(node, ["test", "consequent", "alternate"], parent);
269
267
  return;
270
268
 
271
269
  case "ReturnStatement":
272
270
  case "ThrowStatement":
273
271
  case "UpdateExpression":
274
- Evaluate(node.argument);
272
+ EvaluateChildren(node, ["argument"], parent);
275
273
  return;
276
274
 
277
275
  case "SwitchCase":
278
- Evaluate(node.test);
279
- Evaluate(node.consequent);
276
+ EvaluateChildren(node, ["test", "consequent"], parent);
280
277
  return;
281
278
 
282
279
  case "SwitchStatement":
283
280
  {
284
- Evaluate(node.discriminant);
281
+ EvaluateChildren(node, ["discriminant"], parent);
285
282
  const runningContext = getRunningContext();
286
283
  const oldEnv = runningContext.LexicalEnvironment;
287
284
  const blockEnv = new _AnalysisContext.AnalysisEnvironment(oldEnv);
288
285
  BlockDeclarationInstantiation(node.cases, blockEnv);
289
286
  runningContext.LexicalEnvironment = blockEnv;
290
- Evaluate(node.cases);
287
+ EvaluateChildren(node, ["cases"], parent);
291
288
  runningContext.LexicalEnvironment = oldEnv;
292
289
  return;
293
290
  }
294
291
 
295
292
  case "TryStatement":
296
- Evaluate(node.block);
297
- Evaluate(node.handler);
298
- Evaluate(node.finalizer);
293
+ EvaluateChildren(node, ["block", "handler", "finalizer"], parent);
299
294
  return;
300
295
 
301
296
  case "VariableDeclaration":
302
- Evaluate(node.declarations);
297
+ EvaluateChildren(node, ["declarations"], parent);
303
298
  return;
304
299
 
305
300
  case "VariableDeclarator":
306
- Evaluate(node.id);
307
- Evaluate(node.init);
301
+ EvaluateChildren(node, ["id", "init"], parent);
308
302
  return;
309
303
 
310
304
  case "WhileStatement":
311
- Evaluate(node.test);
312
- Evaluate(node.body);
305
+ EvaluateChildren(node, ["test", "body"], parent);
313
306
  return;
314
307
  }
315
308
  }
316
309
 
317
- const silent = (_hooks$beforeVisitUnk = hooks.beforeVisitUnknown) === null || _hooks$beforeVisitUnk === void 0 ? void 0 : _hooks$beforeVisitUnk.call(hooks, node);
310
+ const silent = (_hooks$beforeVisitUnk = hooks.beforeVisitUnknown) === null || _hooks$beforeVisitUnk === void 0 ? void 0 : _hooks$beforeVisitUnk.call(hooks, node, parent);
318
311
 
319
312
  if (!silent) {
320
313
  // eslint-disable-next-line no-console
@@ -346,10 +339,16 @@ function precook(rootAst, {
346
339
  BoundNamesInstantiation(declarations, env);
347
340
  }
348
341
 
349
- function CallFunction(closure) {
342
+ function CallFunction(closure, parent) {
350
343
  PrepareOrdinaryCall(closure);
351
- FunctionDeclarationInstantiation(closure);
352
- Evaluate(closure.ECMAScriptCode);
344
+ FunctionDeclarationInstantiation(closure, parent);
345
+ Evaluate(closure.ECMAScriptCode, parent === null || parent === void 0 ? void 0 : parent.concat({
346
+ node: closure.Function,
347
+ key: "body"
348
+ }).concat(closure.Function.body.type === "BlockStatement" ? {
349
+ node: closure.Function.body,
350
+ key: "body"
351
+ } : []));
353
352
  analysisContextStack.pop();
354
353
  }
355
354
 
@@ -361,7 +360,7 @@ function precook(rootAst, {
361
360
  analysisContextStack.push(calleeContext);
362
361
  }
363
362
 
364
- function FunctionDeclarationInstantiation(func) {
363
+ function FunctionDeclarationInstantiation(func, parent) {
365
364
  const calleeContext = getRunningContext();
366
365
  const code = func.ECMAScriptCode;
367
366
  const formals = func.FormalParameters;
@@ -373,7 +372,10 @@ function precook(rootAst, {
373
372
  const varNames = (0, _traverse.collectBoundNames)(varDeclarations);
374
373
  const env = calleeContext.LexicalEnvironment;
375
374
  BoundNamesInstantiation(formals, env);
376
- Evaluate(formals);
375
+ Evaluate(formals, parent === null || parent === void 0 ? void 0 : parent.concat({
376
+ node: func.Function,
377
+ key: "params"
378
+ }));
377
379
  let varEnv;
378
380
 
379
381
  if (!hasParameterExpressions) {
@@ -418,18 +420,16 @@ function precook(rootAst, {
418
420
  return OrdinaryFunctionCreate(functionExpression, funcEnv);
419
421
  }
420
422
 
421
- function OrdinaryFunctionCreate({
422
- params,
423
- body
424
- }, scope) {
423
+ function OrdinaryFunctionCreate(func, scope) {
425
424
  return {
426
- FormalParameters: params,
427
- ECMAScriptCode: body.type === "BlockStatement" ? body.body : body,
425
+ Function: func,
426
+ FormalParameters: func.params,
427
+ ECMAScriptCode: func.body.type === "BlockStatement" ? func.body.body : func.body,
428
428
  Environment: scope
429
429
  };
430
430
  }
431
431
 
432
- Evaluate(rootAst);
432
+ Evaluate(rootAst, withParent ? [] : undefined);
433
433
  return attemptToVisitGlobals;
434
434
  }
435
435
  //# sourceMappingURL=precook.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/precook.ts"],"names":["precook","rootAst","expressionOnly","visitors","hooks","attemptToVisitGlobals","Set","analysisContextStack","rootEnv","AnalysisEnvironment","rootContext","AnalysisContext","VariableEnvironment","LexicalEnvironment","push","getRunningContext","length","visit","node","type","Evaluate","Array","isArray","n","beforeVisit","ResolveBinding","name","beforeVisitGlobal","add","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","silent","beforeVisitUnknown","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 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 visitors?: EstreeVisitors;\n hooks?: PrecookHooks;\n}\n\nexport interface PrecookHooks {\n beforeVisit?(node: EstreeNode): void;\n beforeVisitGlobal?(node: Identifier): void;\n /** Return true if want to silent warnings for unknown nodes. */\n beforeVisitUnknown?(node: EstreeNode): 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, 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 hooks.beforeVisitGlobal?.(node);\n attemptToVisitGlobals.add(node.name);\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 const silent = hooks.beforeVisitUnknown?.(node);\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(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":["precook","rootAst","expressionOnly","visitors","withParent","hooks","attemptToVisitGlobals","Set","analysisContextStack","rootEnv","AnalysisEnvironment","rootContext","AnalysisContext","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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/AnalysisContext.ts"],"names":["AnalysisContext","AnalysisEnvironment","constructor","outer","Set","OuterEnv","HasBinding","name","bindingSet","has","CreateBinding","add"],"mappings":";AAEA;AACA,OAAO,MAAMA,eAAN,CAAsB;AAAA;AAAA;;AAAA;AAAA;;AAAA,C,CAK7B;;AACA,OAAO,MAAMC,mBAAN,CAA0B;AAI/BC,EAAAA,WAAW,CAACC,KAAD,EAA6B;AAAA;;AAAA,wCAFV,IAAIC,GAAJ,EAEU;;AACtC,SAAKC,QAAL,GAAgBF,KAAhB;AACD;;AAEDG,EAAAA,UAAU,CAACC,IAAD,EAAwB;AAChC,WAAO,KAAKC,UAAL,CAAgBC,GAAhB,CAAoBF,IAApB,CAAP;AACD;;AAEDG,EAAAA,aAAa,CAACH,IAAD,EAAqB;AAChC,SAAKC,UAAL,CAAgBG,GAAhB,CAAoBJ,IAApB;AACD;;AAd8B","sourcesContent":["import { Expression, FunctionDeclaration, Statement } from \"@babel/types\";\n\n// https://tc39.es/ecma262/#sec-execution-contexts\nexport class AnalysisContext {\n VariableEnvironment: AnalysisEnvironment;\n LexicalEnvironment: AnalysisEnvironment;\n}\n\n// https://tc39.es/ecma262/#sec-environment-records\nexport class AnalysisEnvironment {\n readonly OuterEnv: AnalysisEnvironment;\n private readonly bindingSet = new Set<string>();\n\n constructor(outer: AnalysisEnvironment) {\n this.OuterEnv = outer;\n }\n\n HasBinding(name: string): boolean {\n return this.bindingSet.has(name);\n }\n\n CreateBinding(name: string): void {\n this.bindingSet.add(name);\n }\n}\n\nexport interface AnalysisFunctionObject {\n FormalParameters: FunctionDeclaration[\"params\"];\n ECMAScriptCode: Statement[] | Expression;\n Environment: AnalysisEnvironment;\n}\n"],"file":"AnalysisContext.js"}
1
+ {"version":3,"sources":["../../src/AnalysisContext.ts"],"names":["AnalysisContext","AnalysisEnvironment","constructor","outer","Set","OuterEnv","HasBinding","name","bindingSet","has","CreateBinding","add"],"mappings":";AAQA;AACA,OAAO,MAAMA,eAAN,CAAsB;AAAA;AAAA;;AAAA;AAAA;;AAAA,C,CAK7B;;AACA,OAAO,MAAMC,mBAAN,CAA0B;AAI/BC,EAAAA,WAAW,CAACC,KAAD,EAA6B;AAAA;;AAAA,wCAFV,IAAIC,GAAJ,EAEU;;AACtC,SAAKC,QAAL,GAAgBF,KAAhB;AACD;;AAEDG,EAAAA,UAAU,CAACC,IAAD,EAAwB;AAChC,WAAO,KAAKC,UAAL,CAAgBC,GAAhB,CAAoBF,IAApB,CAAP;AACD;;AAEDG,EAAAA,aAAa,CAACH,IAAD,EAAqB;AAChC,SAAKC,UAAL,CAAgBG,GAAhB,CAAoBJ,IAApB;AACD;;AAd8B","sourcesContent":["import {\n ArrowFunctionExpression,\n Expression,\n FunctionDeclaration,\n FunctionExpression,\n Statement,\n} from \"@babel/types\";\n\n// https://tc39.es/ecma262/#sec-execution-contexts\nexport class AnalysisContext {\n VariableEnvironment: AnalysisEnvironment;\n LexicalEnvironment: AnalysisEnvironment;\n}\n\n// https://tc39.es/ecma262/#sec-environment-records\nexport class AnalysisEnvironment {\n readonly OuterEnv: AnalysisEnvironment;\n private readonly bindingSet = new Set<string>();\n\n constructor(outer: AnalysisEnvironment) {\n this.OuterEnv = outer;\n }\n\n HasBinding(name: string): boolean {\n return this.bindingSet.has(name);\n }\n\n CreateBinding(name: string): void {\n this.bindingSet.add(name);\n }\n}\n\nexport interface AnalysisFunctionObject {\n Function: FunctionDeclaration | FunctionExpression | ArrowFunctionExpression;\n FormalParameters: FunctionDeclaration[\"params\"];\n ECMAScriptCode: Statement[] | Expression;\n Environment: AnalysisEnvironment;\n}\n"],"file":"AnalysisContext.js"}
@@ -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";
@@ -13,6 +14,7 @@ export function precook(rootAst) {
13
14
  var {
14
15
  expressionOnly,
15
16
  visitors,
17
+ withParent,
16
18
  hooks = {}
17
19
  } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
18
20
  var attemptToVisitGlobals = new Set();
@@ -33,16 +35,27 @@ export function precook(rootAst) {
33
35
  }
34
36
  }
35
37
 
36
- 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) {
37
48
  if (Array.isArray(node)) {
38
- for (var n of node) {
39
- Evaluate(n);
40
- }
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
+ });
41
54
  } else if (node) {
42
55
  var _hooks$beforeVisit, _hooks$beforeVisitUnk;
43
56
 
44
57
  // `node` maybe `null` in some cases.
45
- (_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);
46
59
  visitors && visit(node); // Expressions:
47
60
 
48
61
  switch (node.type) {
@@ -50,7 +63,7 @@ export function precook(rootAst) {
50
63
  if (!ResolveBinding(node.name)) {
51
64
  var _hooks$beforeVisitGlo;
52
65
 
53
- (_hooks$beforeVisitGlo = hooks.beforeVisitGlobal) === null || _hooks$beforeVisitGlo === void 0 ? void 0 : _hooks$beforeVisitGlo.call(hooks, node);
66
+ (_hooks$beforeVisitGlo = hooks.beforeVisitGlobal) === null || _hooks$beforeVisitGlo === void 0 ? void 0 : _hooks$beforeVisitGlo.call(hooks, node, parent);
54
67
  attemptToVisitGlobals.add(node.name);
55
68
  }
56
69
 
@@ -58,76 +71,71 @@ export function precook(rootAst) {
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,34 +289,30 @@ 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
- var silent = (_hooks$beforeVisitUnk = hooks.beforeVisitUnknown) === null || _hooks$beforeVisitUnk === void 0 ? void 0 : _hooks$beforeVisitUnk.call(hooks, node);
315
+ var silent = (_hooks$beforeVisitUnk = hooks.beforeVisitUnknown) === null || _hooks$beforeVisitUnk === void 0 ? void 0 : _hooks$beforeVisitUnk.call(hooks, node, parent);
322
316
 
323
317
  if (!silent) {
324
318
  // eslint-disable-next-line no-console
@@ -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,19 +425,16 @@ export function precook(rootAst) {
422
425
  return OrdinaryFunctionCreate(functionExpression, funcEnv);
423
426
  }
424
427
 
425
- function OrdinaryFunctionCreate(_ref, scope) {
426
- var {
427
- params,
428
- body
429
- } = _ref;
428
+ function OrdinaryFunctionCreate(func, scope) {
430
429
  return {
431
- FormalParameters: params,
432
- 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,
433
433
  Environment: scope
434
434
  };
435
435
  }
436
436
 
437
- Evaluate(rootAst);
437
+ Evaluate(rootAst, withParent ? [] : undefined);
438
438
  return attemptToVisitGlobals;
439
439
  }
440
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","beforeVisitGlobal","add","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","silent","beforeVisitUnknown","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 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 visitors?: EstreeVisitors;\n hooks?: PrecookHooks;\n}\n\nexport interface PrecookHooks {\n beforeVisit?(node: EstreeNode): void;\n beforeVisitGlobal?(node: Identifier): void;\n /** Return true if want to silent warnings for unknown nodes. */\n beforeVisitUnknown?(node: EstreeNode): 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, 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 hooks.beforeVisitGlobal?.(node);\n attemptToVisitGlobals.add(node.name);\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 const silent = hooks.beforeVisitUnknown?.(node);\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(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":";AAUA,SAASA,cAAT,QAA+B,kBAA/B;AACA,SACEC,eADF,EAEEC,mBAFF,QAIO,mBAJP;AAMA,SACEC,iBADF,EAEEC,yBAFF,EAGEC,kBAHF,QAIO,YAJP;;AA6BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,OAAT,CACLC,OADK,EAGQ;AAAA,MADb;AAAEC,IAAAA,cAAF;AAAkBC,IAAAA,QAAlB;AAA4BC,IAAAA,UAA5B;AAAwCC,IAAAA,KAAK,GAAG;AAAhD,GACa,uEAD0D,EAC1D;AACb,MAAMC,qBAAqB,GAAG,IAAIC,GAAJ,EAA9B;AACA,MAAMC,oBAAuC,GAAG,EAAhD;AACA,MAAMC,OAAO,GAAG,IAAIb,mBAAJ,CAAwB,IAAxB,CAAhB;AACA,MAAMc,WAAW,GAAG,IAAIf,eAAJ,EAApB;AACAe,EAAAA,WAAW,CAACC,mBAAZ,GAAkCF,OAAlC;AACAC,EAAAA,WAAW,CAACE,kBAAZ,GAAiCH,OAAjC;AACAD,EAAAA,oBAAoB,CAACK,IAArB,CAA0BH,WAA1B;;AAEA,WAASI,iBAAT,GAA8C;AAC5C,WAAON,oBAAoB,CAACA,oBAAoB,CAACO,MAArB,GAA8B,CAA/B,CAA3B;AACD;;AAED,WAASC,KAAT,CAAeC,IAAf,EAAuC;AACrC,QAAIvB,cAAc,CAACS,QAAD,EAAWc,IAAI,CAACC,IAAhB,CAAlB,EAAyC;AACvCf,MAAAA,QAAQ,CAACc,IAAI,CAACC,IAAN,CAAR,CAAoBD,IAApB;AACD;AACF;;AAED,WAASE,gBAAT,CACEF,IADF,EAEEG,IAFF,EAGEC,MAHF,EAIQ;AACN,SAAK,IAAMC,GAAX,IAAkBF,IAAlB,EAAwB;AACtBG,MAAAA,QAAQ,CACNN,IAAI,CAACK,GAAD,CADE,EAEND,MAFM,aAENA,MAFM,uBAENA,MAAM,CAAEG,MAAR,CAAe;AAAEP,QAAAA,IAAF;AAAQK,QAAAA;AAAR,OAAf,CAFM,CAAR;AAID;AACF;;AAED,WAASC,QAAT,CACEN,IADF,EAEEI,MAFF,EAGQ;AACN,QAAII,KAAK,CAACC,OAAN,CAAcT,IAAd,CAAJ,EAAyB;AACvBA,MAAAA,IAAI,CAACU,OAAL,CAAa,CAACC,CAAD,EAAIC,KAAJ,KAAc;AACzBN,QAAAA,QAAQ,CACNK,CADM,EAENP,MAAM,GACFA,MAAM,CAACS,KAAP,CAAa,CAAb,EAAgB,CAAC,CAAjB,EAAoBN,MAApB,iCACKH,MAAM,CAACA,MAAM,CAACN,MAAP,GAAgB,CAAjB,CADX;AAEEc,UAAAA;AAFF,WADE,GAKFR,MAPE,CAAR;AASD,OAVD;AAWD,KAZD,MAYO,IAAIJ,IAAJ,EAAU;AAAA;;AACf;AACA,4BAAAZ,KAAK,CAAC0B,WAAN,+EAAA1B,KAAK,EAAeY,IAAf,EAAqBI,MAArB,CAAL;AACAlB,MAAAA,QAAQ,IAAIa,KAAK,CAACC,IAAD,CAAjB,CAHe,CAIf;;AACA,cAAQA,IAAI,CAACC,IAAb;AACE,aAAK,YAAL;AACE,cAAI,CAACc,cAAc,CAACf,IAAI,CAACgB,IAAN,CAAnB,EAAgC;AAAA;;AAC9B,qCAAA5B,KAAK,CAAC6B,iBAAN,qFAAA7B,KAAK,EAAqBY,IAArB,EAA2BI,MAA3B,CAAL;AACAf,YAAAA,qBAAqB,CAAC6B,GAAtB,CAA0BlB,IAAI,CAACgB,IAA/B;AACD;;AACD;;AACF,aAAK,iBAAL;AACA,aAAK,cAAL;AACEd,UAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,UAAD,CAAP,EAAqBI,MAArB,CAAhB;AACA;;AACF,aAAK,yBAAL;AAAgC;AAC9B,gBAAMe,GAAG,GAAGtB,iBAAiB,GAAGF,kBAAhC;AACA,gBAAMyB,OAAO,GAAGC,sBAAsB,CAACrB,IAAD,EAAOmB,GAAP,CAAtC;AACAG,YAAAA,YAAY,CAACF,OAAD,EAAUhB,MAAV,CAAZ;AACA;AACD;;AACD,aAAK,mBAAL;AACA,aAAK,kBAAL;AACA,aAAK,mBAAL;AACEF,UAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,MAAD,EAAS,OAAT,CAAP,EAA0BI,MAA1B,CAAhB;AACA;;AACF,aAAK,gBAAL;AACA,aAAK,eAAL;AACEF,UAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,QAAD,EAAW,WAAX,CAAP,EAAgCI,MAAhC,CAAhB;AACA;;AACF,aAAK,iBAAL;AACEF,UAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,YAAD,CAAP,EAAuBI,MAAvB,CAAhB;AACA;;AACF,aAAK,uBAAL;AACEF,UAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,MAAD,EAAS,YAAT,EAAuB,WAAvB,CAAP,EAA4CI,MAA5C,CAAhB;AACA;;AACF,aAAK,kBAAL;AACEF,UAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,QAAD,CAAP,EAAmBI,MAAnB,CAAhB;;AACA,cAAIJ,IAAI,CAACuB,QAAT,EAAmB;AACjBrB,YAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,UAAD,CAAP,EAAqBI,MAArB,CAAhB;AACD;;AACD;;AACF,aAAK,kBAAL;AACA,aAAK,eAAL;AACEF,UAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,YAAD,CAAP,EAAuBI,MAAvB,CAAhB;AACA;;AACF,aAAK,UAAL;AACE,cAAIJ,IAAI,CAACuB,QAAT,EAAmB;AACjBrB,YAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,KAAD,CAAP,EAAgBI,MAAhB,CAAhB;AACD;;AACDF,UAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,OAAD,CAAP,EAAkBI,MAAlB,CAAhB;AACA;;AACF,aAAK,aAAL;AACA,aAAK,eAAL;AACA,aAAK,iBAAL;AACEF,UAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,UAAD,CAAP,EAAqBI,MAArB,CAAhB;AACA;;AACF,aAAK,oBAAL;AACA,aAAK,iBAAL;AACEF,UAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,aAAD,CAAP,EAAwBI,MAAxB,CAAhB;AACA;;AACF,aAAK,0BAAL;AACEF,UAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,KAAD,EAAQ,OAAR,CAAP,EAAyBI,MAAzB,CAAhB;AACA;;AACF,aAAK,SAAL;AACE;AA7DJ;;AA+DA,UAAI,CAACnB,cAAL,EAAqB;AACnB;AACA,gBAAQe,IAAI,CAACC,IAAb;AACE,eAAK,sBAAL;AACEC,YAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,OAAD,EAAU,MAAV,CAAP,EAA0BI,MAA1B,CAAhB;AACA;;AACF,eAAK,gBAAL;AAAuB;AACrB,kBAAI,CAACJ,IAAI,CAACwB,IAAL,CAAU1B,MAAf,EAAuB;AACrB;AACD;;AACD,kBAAM2B,cAAc,GAAG5B,iBAAiB,EAAxC;AACA,kBAAM6B,MAAM,GAAGD,cAAc,CAAC9B,kBAA9B;AACA,kBAAMgC,QAAQ,GAAG,IAAIhD,mBAAJ,CAAwB+C,MAAxB,CAAjB;AACAE,cAAAA,6BAA6B,CAAC5B,IAAI,CAACwB,IAAN,EAAYG,QAAZ,CAA7B;AACAF,cAAAA,cAAc,CAAC9B,kBAAf,GAAoCgC,QAApC;AACAzB,cAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,MAAD,CAAP,EAAiBI,MAAjB,CAAhB;AACAqB,cAAAA,cAAc,CAAC9B,kBAAf,GAAoC+B,MAApC;AACA;AACD;;AACD,eAAK,gBAAL;AACA,eAAK,mBAAL;AACA,eAAK,gBAAL;AACE;;AACF,eAAK,aAAL;AAAoB;AAClB,kBAAMD,eAAc,GAAG5B,iBAAiB,EAAxC;;AACA,kBAAM6B,OAAM,GAAGD,eAAc,CAAC9B,kBAA9B;AACA,kBAAMkC,QAAQ,GAAG,IAAIlD,mBAAJ,CAAwB+C,OAAxB,CAAjB;AACAI,cAAAA,uBAAuB,CAAC9B,IAAI,CAAC+B,KAAN,EAAaF,QAAb,CAAvB;AACAJ,cAAAA,eAAc,CAAC9B,kBAAf,GAAoCkC,QAApC;AACA3B,cAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,OAAD,EAAU,MAAV,CAAP,EAA0BI,MAA1B,CAAhB;AACAqB,cAAAA,eAAc,CAAC9B,kBAAf,GAAoC+B,OAApC;AACA;AACD;;AACD,eAAK,kBAAL;AACExB,YAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,MAAD,EAAS,MAAT,CAAP,EAAyBI,MAAzB,CAAhB;AACA;;AACF,eAAK,qBAAL;AACA,eAAK,gBAAL;AACEF,YAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,YAAD,CAAP,EAAuBI,MAAvB,CAAhB;AACA;;AACF,eAAK,gBAAL;AACA,eAAK,gBAAL;AAAuB;AACrB;AACA,kBAAM4B,cAAc,GAClBhC,IAAI,CAACiC,IAAL,CAAUhC,IAAV,KAAmB,qBAAnB,IACAD,IAAI,CAACiC,IAAL,CAAUC,IAAV,KAAmB,KAFrB;;AAGA,kBAAMT,gBAAc,GAAG5B,iBAAiB,EAAxC;;AACA,kBAAM6B,QAAM,GAAGD,gBAAc,CAAC9B,kBAA9B;;AACA,kBAAIqC,cAAJ,EAAoB;AAClB,oBAAMG,MAAM,GAAG,IAAIxD,mBAAJ,CAAwB+C,QAAxB,CAAf;AACAI,gBAAAA,uBAAuB,CAAC9B,IAAI,CAACiC,IAAN,EAAYE,MAAZ,CAAvB;AACAV,gBAAAA,gBAAc,CAAC9B,kBAAf,GAAoCwC,MAApC;AACD;;AACDjC,cAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,OAAD,CAAP,EAAkBI,MAAlB,CAAhB;AACAqB,cAAAA,gBAAc,CAAC9B,kBAAf,GAAoC+B,QAApC,CAbqB,CAerB;;AACA,kBAAIM,cAAJ,EAAoB;AAClB,oBAAMI,YAAY,GAAG,IAAIzD,mBAAJ,CAAwB+C,QAAxB,CAArB;AACAI,gBAAAA,uBAAuB,CAAC9B,IAAI,CAACiC,IAAN,EAAYG,YAAZ,CAAvB;AACAX,gBAAAA,gBAAc,CAAC9B,kBAAf,GAAoCyC,YAApC;AACD;;AACDlC,cAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,MAAD,EAAS,MAAT,CAAP,EAAyBI,MAAzB,CAAhB;AACAqB,cAAAA,gBAAc,CAAC9B,kBAAf,GAAoC+B,QAApC;AACA;AACD;;AACD,eAAK,cAAL;AAAqB;AAAA;;AACnB,kBAAMM,eAAc,GAClB,eAAAhC,IAAI,CAACqC,IAAL,0DAAWpC,IAAX,MAAoB,qBAApB,IACAD,IAAI,CAACqC,IAAL,CAAUH,IAAV,KAAmB,KAFrB;;AAGA,kBAAMT,gBAAc,GAAG5B,iBAAiB,EAAxC;;AACA,kBAAM6B,QAAM,GAAGD,gBAAc,CAAC9B,kBAA9B;;AACA,kBAAIqC,eAAJ,EAAoB;AAClB,oBAAMM,OAAO,GAAG,IAAI3D,mBAAJ,CAAwB+C,QAAxB,CAAhB;AACAI,gBAAAA,uBAAuB,CACrB9B,IAAI,CAACqC,IADgB,EAErBC,OAFqB,CAAvB;AAIAb,gBAAAA,gBAAc,CAAC9B,kBAAf,GAAoC2C,OAApC;AACD;;AACDpC,cAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,MAAD,EAAS,MAAT,EAAiB,MAAjB,EAAyB,QAAzB,CAAP,EAA2CI,MAA3C,CAAhB;AACAqB,cAAAA,gBAAc,CAAC9B,kBAAf,GAAoC+B,QAApC;AACA;AACD;;AACD,eAAK,qBAAL;AAA4B;AAC1B,kBAAM,CAACa,EAAD,IAAO3D,iBAAiB,CAACoB,IAAD,CAA9B;AACA,kBAAMmB,IAAG,GAAGtB,iBAAiB,GAAGF,kBAAhC;AACA,kBAAM6C,EAAE,GAAGnB,sBAAsB,CAACrB,IAAD,EAAOmB,IAAP,CAAjC;;AACAA,cAAAA,IAAG,CAACsB,aAAJ,CAAkBF,EAAlB;;AACAjB,cAAAA,YAAY,CAACkB,EAAD,EAAKpC,MAAL,CAAZ;AACA;AACD;;AACD,eAAK,oBAAL;AAA2B;AACzB,kBAAMgB,QAAO,GAAGsB,qCAAqC,CAAC1C,IAAD,CAArD;;AACAsB,cAAAA,YAAY,CAACF,QAAD,EAAUhB,MAAV,CAAZ;AACA;AACD;;AACD,eAAK,aAAL;AACEF,YAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,MAAD,EAAS,YAAT,EAAuB,WAAvB,CAAP,EAA4CI,MAA5C,CAAhB;AACA;;AACF,eAAK,iBAAL;AACA,eAAK,gBAAL;AACA,eAAK,kBAAL;AACEF,YAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,UAAD,CAAP,EAAqBI,MAArB,CAAhB;AACA;;AACF,eAAK,YAAL;AACEF,YAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,MAAD,EAAS,YAAT,CAAP,EAA+BI,MAA/B,CAAhB;AACA;;AACF,eAAK,iBAAL;AAAwB;AACtBF,cAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,cAAD,CAAP,EAAyBI,MAAzB,CAAhB;;AACA,kBAAMqB,gBAAc,GAAG5B,iBAAiB,EAAxC;;AACA,kBAAM6B,QAAM,GAAGD,gBAAc,CAAC9B,kBAA9B;;AACA,kBAAMgC,SAAQ,GAAG,IAAIhD,mBAAJ,CAAwB+C,QAAxB,CAAjB;;AACAE,cAAAA,6BAA6B,CAAC5B,IAAI,CAAC2C,KAAN,EAAahB,SAAb,CAA7B;AACAF,cAAAA,gBAAc,CAAC9B,kBAAf,GAAoCgC,SAApC;AACAzB,cAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,OAAD,CAAP,EAAkBI,MAAlB,CAAhB;AACAqB,cAAAA,gBAAc,CAAC9B,kBAAf,GAAoC+B,QAApC;AACA;AACD;;AACD,eAAK,cAAL;AACExB,YAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,OAAD,EAAU,SAAV,EAAqB,WAArB,CAAP,EAA0CI,MAA1C,CAAhB;AACA;;AACF,eAAK,qBAAL;AACEF,YAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,cAAD,CAAP,EAAyBI,MAAzB,CAAhB;AACA;;AACF,eAAK,oBAAL;AACEF,YAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,IAAD,EAAO,MAAP,CAAP,EAAuBI,MAAvB,CAAhB;AACA;;AACF,eAAK,gBAAL;AACEF,YAAAA,gBAAgB,CAACF,IAAD,EAAO,CAAC,MAAD,EAAS,MAAT,CAAP,EAAyBI,MAAzB,CAAhB;AACA;AAhIJ;AAkID;;AACD,UAAMwC,MAAM,4BAAGxD,KAAK,CAACyD,kBAAT,0DAAG,2BAAAzD,KAAK,EAAsBY,IAAtB,EAA4BI,MAA5B,CAApB;;AACA,UAAI,CAACwC,MAAL,EAAa;AACX;AACAE,QAAAA,OAAO,CAACC,IAAR,kCAAwC/C,IAAI,CAACC,IAA7C;AACD;AACF;AACF;;AAED,WAAS6B,uBAAT,CACEkB,YADF,EAEE7B,GAFF,EAGQ;AACN,SAAK,IAAMH,IAAX,IAAmBpC,iBAAiB,CAACoE,YAAD,CAApC,EAAoD;AAClD7B,MAAAA,GAAG,CAACsB,aAAJ,CAAkBzB,IAAlB;AACD;AACF;;AAED,WAASD,cAAT,CAAwBC,IAAxB,EAA+C;AAC7C,QAAMG,GAAG,GAAGtB,iBAAiB,GAAGF,kBAAhC;AACA,WAAOsD,sBAAsB,CAAC9B,GAAD,EAAMH,IAAN,CAA7B;AACD;;AAED,WAASiC,sBAAT,CACE9B,GADF,EAEEH,IAFF,EAGW;AACT,WACE,CAAC,CAACG,GAAF,KACCA,GAAG,CAAC+B,UAAJ,CAAelC,IAAf,KAAwBiC,sBAAsB,CAAC9B,GAAG,CAACgC,QAAL,EAAenC,IAAf,CAD/C,CADF;AAID;;AAED,WAASY,6BAAT,CACEwB,IADF,EAEEjC,GAFF,EAGQ;AACN,QAAM6B,YAAY,GAAGnE,yBAAyB,CAACuE,IAAD,EAAO;AACnDC,MAAAA,GAAG,EAAE,KAD8C;AAEnDC,MAAAA,QAAQ,EAAE;AAFyC,KAAP,CAA9C;AAIAxB,IAAAA,uBAAuB,CAACkB,YAAD,EAAe7B,GAAf,CAAvB;AACD;;AAED,WAASG,YAAT,CACEF,OADF,EAEEhB,MAFF,EAGQ;AACNmD,IAAAA,mBAAmB,CAACnC,OAAD,CAAnB;AACAoC,IAAAA,gCAAgC,CAACpC,OAAD,EAAUhB,MAAV,CAAhC;AACAE,IAAAA,QAAQ,CACNc,OAAO,CAACqC,cADF,EAENrD,MAFM,aAENA,MAFM,uBAENA,MAAM,CACFG,MADJ,CACW;AACPP,MAAAA,IAAI,EAAEoB,OAAO,CAACsC,QADP;AAEPrD,MAAAA,GAAG,EAAE;AAFE,KADX,EAKGE,MALH,CAMIa,OAAO,CAACsC,QAAR,CAAiBlC,IAAjB,CAAsBvB,IAAtB,KAA+B,gBAA/B,GACI;AACED,MAAAA,IAAI,EAAEoB,OAAO,CAACsC,QAAR,CAAiBlC,IADzB;AAEEnB,MAAAA,GAAG,EAAE;AAFP,KADJ,GAKI,EAXR,CAFM,CAAR;AAgBAd,IAAAA,oBAAoB,CAACoE,GAArB;AACD;;AAED,WAASJ,mBAAT,CAA6BK,CAA7B,EAA8D;AAC5D,QAAMC,aAAa,GAAG,IAAInF,eAAJ,EAAtB;AACA,QAAMoF,QAAQ,GAAG,IAAInF,mBAAJ,CAAwBiF,CAAC,CAACG,WAA1B,CAAjB;AACAF,IAAAA,aAAa,CAACnE,mBAAd,GAAoCoE,QAApC;AACAD,IAAAA,aAAa,CAAClE,kBAAd,GAAmCmE,QAAnC;AACAvE,IAAAA,oBAAoB,CAACK,IAArB,CAA0BiE,aAA1B;AACD;;AAED,WAASL,gCAAT,CACEQ,IADF,EAEE5D,MAFF,EAGQ;AACN,QAAMyD,aAAa,GAAGhE,iBAAiB,EAAvC;AACA,QAAMuD,IAAI,GAAGY,IAAI,CAACP,cAAlB;AACA,QAAMQ,OAAO,GAAGD,IAAI,CAACE,gBAArB;AACA,QAAMC,uBAAuB,GAAGrF,kBAAkB,CAACmF,OAAD,CAAlD;AACA,QAAMG,eAAe,GAAGvF,yBAAyB,CAACuE,IAAD,EAAO;AACtDC,MAAAA,GAAG,EAAE,IADiD;AAEtDC,MAAAA,QAAQ,EAAE;AAF4C,KAAP,CAAjD;AAIA,QAAMe,QAAQ,GAAGzF,iBAAiB,CAACwF,eAAD,CAAlC;AAEA,QAAMjD,GAAG,GAAG0C,aAAa,CAAClE,kBAA1B;AACAmC,IAAAA,uBAAuB,CAACmC,OAAD,EAAU9C,GAAV,CAAvB;AAEAb,IAAAA,QAAQ,CAAC2D,OAAD,EAAU7D,MAAV,aAAUA,MAAV,uBAAUA,MAAM,CAAEG,MAAR,CAAe;AAAEP,MAAAA,IAAI,EAAEgE,IAAI,CAACN,QAAb;AAAuBrD,MAAAA,GAAG,EAAE;AAA5B,KAAf,CAAV,CAAR;AAEA,QAAIiE,MAAJ;;AACA,QAAI,CAACH,uBAAL,EAA8B;AAC5B;AACA;AACA,WAAK,IAAMxD,CAAX,IAAgB0D,QAAhB,EAA0B;AACxBlD,QAAAA,GAAG,CAACsB,aAAJ,CAAkB9B,CAAlB;AACD;;AACD2D,MAAAA,MAAM,GAAGnD,GAAT;AACD,KAPD,MAOO;AACL;AACA;AACA;AACAmD,MAAAA,MAAM,GAAG,IAAI3F,mBAAJ,CAAwBwC,GAAxB,CAAT;AACA0C,MAAAA,aAAa,CAACnE,mBAAd,GAAoC4E,MAApC;;AACA,WAAK,IAAM3D,EAAX,IAAgB0D,QAAhB,EAA0B;AACxBC,QAAAA,MAAM,CAAC7B,aAAP,CAAqB9B,EAArB;AACD;AACF;;AACD,QAAM4D,MAAM,GAAGD,MAAf;AACAT,IAAAA,aAAa,CAAClE,kBAAd,GAAmC4E,MAAnC;AAEA,QAAMC,eAAe,GAAG3F,yBAAyB,CAACuE,IAAD,EAAO;AACtDC,MAAAA,GAAG,EAAE,KADiD;AAEtDC,MAAAA,QAAQ,EAAE;AAF4C,KAAP,CAAjD;AAIAxB,IAAAA,uBAAuB,CAAC0C,eAAD,EAAkBD,MAAlB,CAAvB;AACD;;AAED,WAAS7B,qCAAT,CACE+B,kBADF,EAE0B;AACxB,QAAMC,KAAK,GAAG7E,iBAAiB,GAAGF,kBAAlC;;AACA,QAAI,CAAC8E,kBAAkB,CAACE,EAAxB,EAA4B;AAC1B,aAAOtD,sBAAsB,CAACoD,kBAAD,EAAqBC,KAArB,CAA7B;AACD;;AACD,QAAM1D,IAAI,GAAGyD,kBAAkB,CAACE,EAAnB,CAAsB3D,IAAnC;AACA,QAAM4D,OAAO,GAAG,IAAIjG,mBAAJ,CAAwB+F,KAAxB,CAAhB;AACAE,IAAAA,OAAO,CAACnC,aAAR,CAAsBzB,IAAtB;AACA,WAAOK,sBAAsB,CAACoD,kBAAD,EAAqBG,OAArB,CAA7B;AACD;;AAED,WAASvD,sBAAT,CACE2C,IADF,EAEEU,KAFF,EAG0B;AACxB,WAAO;AACLhB,MAAAA,QAAQ,EAAEM,IADL;AAELE,MAAAA,gBAAgB,EAAEF,IAAI,CAACa,MAFlB;AAGLpB,MAAAA,cAAc,EACZO,IAAI,CAACxC,IAAL,CAAUvB,IAAV,KAAmB,gBAAnB,GAAsC+D,IAAI,CAACxC,IAAL,CAAUA,IAAhD,GAAuDwC,IAAI,CAACxC,IAJzD;AAKLuC,MAAAA,WAAW,EAAEW;AALR,KAAP;AAOD;;AAEDpE,EAAAA,QAAQ,CAACtB,OAAD,EAAUG,UAAU,GAAG,EAAH,GAAQ2F,SAA5B,CAAR;AAEA,SAAOzF,qBAAP;AACD","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"}
@@ -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;
@@ -2,14 +2,22 @@ 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;
10
- beforeVisitGlobal?(node: Identifier): void;
17
+ beforeVisit?(node: EstreeNode, parent?: EstreeParent): void;
18
+ beforeVisitGlobal?(node: Identifier, parent?: EstreeParent): void;
11
19
  /** Return true if want to silent warnings for unknown nodes. */
12
- beforeVisitUnknown?(node: EstreeNode): boolean | void;
20
+ beforeVisitUnknown?(node: EstreeNode, parent?: EstreeParent): boolean | void;
13
21
  }
14
22
  /**
15
23
  * Analysis an AST of a storyboard function or an evaluation expression.
@@ -18,4 +26,4 @@ export interface PrecookHooks {
18
26
  * @param options - Analysis options.
19
27
  * @returns A set of global variables the root AST attempts to access.
20
28
  */
21
- 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>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@next-core/cook",
3
- "version": "1.5.0",
3
+ "version": "1.6.3",
4
4
  "description": "Cook expressions and storyboard functions",
5
5
  "homepage": "https://github.com/easyops-cn/next-core/tree/master/packages/cook",
6
6
  "license": "GPL-3.0",
@@ -29,12 +29,12 @@
29
29
  },
30
30
  "sideEffects": false,
31
31
  "dependencies": {
32
- "@babel/parser": "^7.16.4",
33
- "@next-core/brick-types": "^2.50.0"
32
+ "@babel/parser": "^7.16.6",
33
+ "@next-core/brick-types": "^2.51.2"
34
34
  },
35
35
  "devDependencies": {
36
- "@next-core/supply": "^1.0.13",
36
+ "@next-core/supply": "^1.0.16",
37
37
  "lodash": "^4.17.21"
38
38
  },
39
- "gitHead": "3c33270fc173e7afc80576f51415132bc1ef577f"
39
+ "gitHead": "3ed2bc7e98a9c1e5ad0c699e6300ed409180d513"
40
40
  }