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