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

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,11 +3,45 @@
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.4.1-alpha.0](https://github.com/easyops-cn/next-core/compare/@next-core/cook@1.4.0-alpha.0...@next-core/cook@1.4.1-alpha.0) (2021-11-03)
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)
7
+
8
+
9
+ ### Features
10
+
11
+ * support hooks for before visit global or unknown nodes ([50d770c](https://github.com/easyops-cn/next-core/commit/50d770c45a8194c12c3764f53d75a1a9519b790e))
12
+
13
+
14
+
15
+
16
+
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
+
19
+
20
+ ### Features
21
+
22
+ * support parseForAnalysis ([681de0a](https://github.com/easyops-cn/next-core/commit/681de0aef914b4e30d428180cad54cc0f9882b59))
23
+
24
+
25
+
26
+
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)
29
+
30
+ **Note:** Version bump only for package @next-core/cook
31
+
32
+
33
+
34
+
35
+
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)
7
37
 
8
38
  **Note:** Version bump only for package @next-core/cook
9
39
 
10
- # [1.4.0-alpha.0](https://github.com/easyops-cn/next-core/compare/@next-core/cook@1.3.6...@next-core/cook@1.4.0-alpha.0) (2021-11-03)
40
+
41
+
42
+
43
+
44
+ ## [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)
11
45
 
12
46
  **Note:** Version bump only for package @next-core/cook
13
47
 
package/dist/cjs/index.js CHANGED
@@ -3,11 +3,28 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ var _exportNames = {
7
+ parseForAnalysis: true,
8
+ tokTypes: true
9
+ };
10
+ Object.defineProperty(exports, "parseForAnalysis", {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _parse.parseForAnalysis;
14
+ }
15
+ });
16
+ Object.defineProperty(exports, "tokTypes", {
17
+ enumerable: true,
18
+ get: function () {
19
+ return _parser.tokTypes;
20
+ }
21
+ });
6
22
 
7
23
  var _cook = require("./cook");
8
24
 
9
25
  Object.keys(_cook).forEach(function (key) {
10
26
  if (key === "default" || key === "__esModule") return;
27
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
11
28
  if (key in exports && exports[key] === _cook[key]) return;
12
29
  Object.defineProperty(exports, key, {
13
30
  enumerable: true,
@@ -21,6 +38,7 @@ var _lint = require("./lint");
21
38
 
22
39
  Object.keys(_lint).forEach(function (key) {
23
40
  if (key === "default" || key === "__esModule") return;
41
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
24
42
  if (key in exports && exports[key] === _lint[key]) return;
25
43
  Object.defineProperty(exports, key, {
26
44
  enumerable: true,
@@ -30,10 +48,27 @@ Object.keys(_lint).forEach(function (key) {
30
48
  });
31
49
  });
32
50
 
51
+ var _parse = require("./parse");
52
+
53
+ var _precook = require("./precook");
54
+
55
+ Object.keys(_precook).forEach(function (key) {
56
+ if (key === "default" || key === "__esModule") return;
57
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
58
+ if (key in exports && exports[key] === _precook[key]) return;
59
+ Object.defineProperty(exports, key, {
60
+ enumerable: true,
61
+ get: function () {
62
+ return _precook[key];
63
+ }
64
+ });
65
+ });
66
+
33
67
  var _precookFunction = require("./precookFunction");
34
68
 
35
69
  Object.keys(_precookFunction).forEach(function (key) {
36
70
  if (key === "default" || key === "__esModule") return;
71
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
37
72
  if (key in exports && exports[key] === _precookFunction[key]) return;
38
73
  Object.defineProperty(exports, key, {
39
74
  enumerable: true,
@@ -47,6 +82,7 @@ var _preevaluate = require("./preevaluate");
47
82
 
48
83
  Object.keys(_preevaluate).forEach(function (key) {
49
84
  if (key === "default" || key === "__esModule") return;
85
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
50
86
  if (key in exports && exports[key] === _preevaluate[key]) return;
51
87
  Object.defineProperty(exports, key, {
52
88
  enumerable: true,
@@ -60,6 +96,7 @@ var _interfaces = require("./interfaces");
60
96
 
61
97
  Object.keys(_interfaces).forEach(function (key) {
62
98
  if (key === "default" || key === "__esModule") return;
99
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
63
100
  if (key in exports && exports[key] === _interfaces[key]) return;
64
101
  Object.defineProperty(exports, key, {
65
102
  enumerable: true,
@@ -68,4 +105,6 @@ Object.keys(_interfaces).forEach(function (key) {
68
105
  }
69
106
  });
70
107
  });
108
+
109
+ var _parser = require("@babel/parser");
71
110
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA","sourcesContent":["export * from \"./cook\";\nexport * from \"./lint\";\nexport * from \"./precookFunction\";\nexport * from \"./preevaluate\";\nexport * from \"./interfaces\";\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA","sourcesContent":["export * from \"./cook\";\nexport * from \"./lint\";\nexport { parseForAnalysis } from \"./parse\";\nexport * from \"./precook\";\nexport * from \"./precookFunction\";\nexport * from \"./preevaluate\";\nexport * from \"./interfaces\";\nexport { tokTypes } from \"@babel/parser\";\n"],"file":"index.js"}
package/dist/cjs/lint.js CHANGED
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.lint = lint;
7
7
 
8
- var _parser = require("@babel/parser");
8
+ var _parse = require("./parse");
9
9
 
10
10
  var _precook = require("./precook");
11
11
 
@@ -15,17 +15,11 @@ function lint(source, {
15
15
  rules
16
16
  } = {}) {
17
17
  const errors = [];
18
- let file;
19
-
20
- try {
21
- file = (0, _parser.parse)(source, {
22
- plugins: ["estree", typescript && "typescript"].filter(Boolean),
23
- strictMode: true,
24
- attachComment: false,
25
- // Allow export/import declarations to make linter handle errors.
26
- sourceType: "unambiguous"
27
- });
28
- } catch (e) {
18
+ const file = typeof source === "string" ? (0, _parse.parseForAnalysis)(source, {
19
+ typescript
20
+ }) : source;
21
+
22
+ if (!file) {
29
23
  // Return no errors if parse failed.
30
24
  return errors;
31
25
  }
@@ -81,93 +75,100 @@ function lint(source, {
81
75
  }
82
76
  });
83
77
  } else {
84
- const FunctionVisitor = node => {
85
- if (node.async || node.generator) {
86
- errors.push({
87
- type: "SyntaxError",
88
- message: `${node.async ? "Async" : "Generator"} function is not allowed`,
89
- loc: node.loc
90
- });
91
- }
92
- };
93
-
94
78
  (0, _precook.precook)(func, {
95
- visitors: {
96
- ArrowFunctionExpression: FunctionVisitor,
97
- FunctionDeclaration: FunctionVisitor,
98
- FunctionExpression: FunctionVisitor,
99
-
100
- Literal(node) {
101
- if (node.regex) {
102
- if (node.value === null) {
103
- errors.push({
104
- type: "SyntaxError",
105
- message: "Invalid regular expression",
106
- loc: node.loc
107
- });
108
- } else if (node.regex.flags.includes("u")) {
109
- errors.push({
110
- type: "SyntaxError",
111
- message: "Unsupported unicode flag in regular expression",
112
- loc: node.loc
113
- });
114
- }
115
- }
116
- },
117
-
118
- ObjectExpression(node) {
119
- for (const prop of node.properties) {
120
- if (prop.type === "Property") {
121
- if (prop.kind !== "init") {
79
+ hooks: {
80
+ beforeVisit(node) {
81
+ switch (node.type) {
82
+ case "ArrowFunctionExpression":
83
+ case "FunctionDeclaration":
84
+ case "FunctionExpression":
85
+ if (node.async || node.generator) {
122
86
  errors.push({
123
87
  type: "SyntaxError",
124
- message: "Unsupported object getter/setter property",
125
- loc: prop.loc
88
+ message: `${node.async ? "Async" : "Generator"} function is not allowed`,
89
+ loc: node.loc
126
90
  });
127
- } else if (!prop.computed && prop.key.type === "Identifier" && prop.key.name === "__proto__") {
91
+ }
92
+
93
+ break;
94
+
95
+ case "Literal":
96
+ if (node.regex) {
97
+ if (node.value === null) {
98
+ errors.push({
99
+ type: "SyntaxError",
100
+ message: "Invalid regular expression",
101
+ loc: node.loc
102
+ });
103
+ } else if (node.regex.flags.includes("u")) {
104
+ errors.push({
105
+ type: "SyntaxError",
106
+ message: "Unsupported unicode flag in regular expression",
107
+ loc: node.loc
108
+ });
109
+ }
110
+ }
111
+
112
+ break;
113
+
114
+ case "ObjectExpression":
115
+ for (const prop of node.properties) {
116
+ if (prop.type === "Property") {
117
+ if (prop.kind !== "init") {
118
+ errors.push({
119
+ type: "SyntaxError",
120
+ message: "Unsupported object getter/setter property",
121
+ loc: prop.loc
122
+ });
123
+ } else if (!prop.computed && prop.key.type === "Identifier" && prop.key.name === "__proto__") {
124
+ errors.push({
125
+ type: "TypeError",
126
+ message: "Setting '__proto__' property is not allowed",
127
+ loc: prop.key.loc
128
+ });
129
+ }
130
+ }
131
+ }
132
+
133
+ break;
134
+
135
+ case "VariableDeclaration":
136
+ if (node.kind === "var" && rules !== null && rules !== void 0 && rules.noVar) {
128
137
  errors.push({
129
- type: "TypeError",
130
- message: "Setting '__proto__' property is not allowed",
131
- loc: prop.key.loc
138
+ type: "SyntaxError",
139
+ message: "Var declaration is not recommended, use `let` or `const` instead",
140
+ loc: {
141
+ start: node.loc.start,
142
+ end: {
143
+ line: node.loc.end.line,
144
+ // Only decorate the "var".
145
+ column: node.loc.start.column + 3
146
+ }
147
+ }
132
148
  });
133
149
  }
134
- }
150
+
151
+ break;
135
152
  }
136
153
  },
137
154
 
138
- VariableDeclaration(node) {
139
- if (node.kind === "var" && rules !== null && rules !== void 0 && rules.noVar) {
155
+ beforeVisitGlobal(node) {
156
+ if (node.name === "arguments") {
140
157
  errors.push({
141
158
  type: "SyntaxError",
142
- message: "Var declaration is not recommended, use `let` or `const` instead",
143
- loc: {
144
- start: node.loc.start,
145
- end: {
146
- line: node.loc.end.line,
147
- // Only decorate the "var".
148
- column: node.loc.start.column + 3
149
- }
150
- }
159
+ message: "Use the rest parameters instead of 'arguments'",
160
+ loc: node.loc
151
161
  });
152
162
  }
153
163
  },
154
164
 
155
- __UnknownNode(node) {
165
+ beforeVisitUnknown(node) {
156
166
  errors.push({
157
167
  type: "SyntaxError",
158
168
  message: `Unsupported syntax: \`${node.type}\``,
159
169
  loc: node.loc
160
170
  });
161
- },
162
-
163
- __GlobalVariable(node) {
164
- if (node.name === "arguments") {
165
- errors.push({
166
- type: "SyntaxError",
167
- message: "Use the rest parameters instead of 'arguments'",
168
- loc: node.loc
169
- });
170
- }
171
+ return true;
171
172
  }
172
173
 
173
174
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lint.ts"],"names":["lint","source","typescript","rules","errors","file","plugins","filter","Boolean","strictMode","attachComment","sourceType","e","body","program","jsNodes","node","type","startsWith","test","push","message","loc","func","isFunctionDeclaration","unshift","start","line","column","end","FunctionVisitor","async","generator","visitors","ArrowFunctionExpression","FunctionDeclaration","FunctionExpression","Literal","regex","value","flags","includes","ObjectExpression","prop","properties","kind","computed","key","name","VariableDeclaration","noVar","__UnknownNode","__GlobalVariable"],"mappings":"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","sourcesContent":["import { parse, ParseResult, ParserPlugin } from \"@babel/parser\";\nimport {\n ArrowFunctionExpression,\n File,\n FunctionDeclaration,\n FunctionExpression,\n Identifier,\n SourceLocation,\n Statement,\n VariableDeclaration,\n} from \"@babel/types\";\nimport {\n EstreeLiteral,\n CookRules,\n EstreeObjectExpression,\n EstreeVisitorFn,\n EstreeNode,\n} from \"./interfaces\";\nimport { precook } from \"./precook\";\n\nexport interface LintOptions {\n typescript?: boolean;\n rules?: CookRules;\n}\n\nexport interface LintError {\n type: \"SyntaxError\" | \"TypeError\";\n message: string;\n loc: SourceLocation;\n}\n\n/** For next-core internal or devtools usage only. */\nexport function lint(\n source: string,\n { typescript, rules }: LintOptions = {}\n): LintError[] {\n const errors: LintError[] = [];\n let file: ParseResult<File>;\n try {\n file = parse(source, {\n plugins: [\"estree\", typescript && \"typescript\"].filter(\n Boolean\n ) as ParserPlugin[],\n strictMode: true,\n attachComment: false,\n // Allow export/import declarations to make linter handle errors.\n sourceType: \"unambiguous\",\n });\n } catch (e) {\n // Return no errors if parse failed.\n return errors;\n }\n const body = file.program.body;\n const jsNodes: Statement[] = typescript ? [] : body;\n if (typescript) {\n for (const node of body) {\n if (node.type.startsWith(\"TS\")) {\n if (/Enum|Import|Export/.test(node.type)) {\n errors.push({\n type: \"SyntaxError\",\n message: `Unsupported TypeScript syntax: \\`${node.type}\\``,\n loc: node.loc,\n });\n }\n } else {\n jsNodes.push(node);\n }\n }\n }\n let func: FunctionDeclaration;\n for (const node of jsNodes) {\n const isFunctionDeclaration = node.type === \"FunctionDeclaration\";\n if (isFunctionDeclaration && !func) {\n func = node;\n } else {\n errors.push({\n type: \"SyntaxError\",\n message: isFunctionDeclaration\n ? \"Expect a single function declaration\"\n : `\\`${node.type}\\` is not allowed in top level`,\n loc: node.loc,\n });\n }\n }\n if (!func) {\n errors.unshift({\n type: \"SyntaxError\",\n message: \"Function declaration not found\",\n loc: {\n start: { line: 1, column: 0 },\n end: { line: 1, column: 0 },\n },\n });\n } else {\n const FunctionVisitor: EstreeVisitorFn = (\n node: FunctionDeclaration | FunctionExpression | ArrowFunctionExpression\n ) => {\n if (node.async || node.generator) {\n errors.push({\n type: \"SyntaxError\",\n message: `${\n node.async ? \"Async\" : \"Generator\"\n } function is not allowed`,\n loc: node.loc,\n });\n }\n };\n precook(func, {\n visitors: {\n ArrowFunctionExpression: FunctionVisitor,\n FunctionDeclaration: FunctionVisitor,\n FunctionExpression: FunctionVisitor,\n Literal(node: EstreeLiteral) {\n if (node.regex) {\n if (node.value === null) {\n errors.push({\n type: \"SyntaxError\",\n message: \"Invalid regular expression\",\n loc: node.loc,\n });\n } else if (node.regex.flags.includes(\"u\")) {\n errors.push({\n type: \"SyntaxError\",\n message: \"Unsupported unicode flag in regular expression\",\n loc: node.loc,\n });\n }\n }\n },\n ObjectExpression(node: EstreeObjectExpression) {\n for (const prop of node.properties) {\n if (prop.type === \"Property\") {\n if (prop.kind !== \"init\") {\n errors.push({\n type: \"SyntaxError\",\n message: \"Unsupported object getter/setter property\",\n loc: prop.loc,\n });\n } else if (\n !prop.computed &&\n prop.key.type === \"Identifier\" &&\n prop.key.name === \"__proto__\"\n ) {\n errors.push({\n type: \"TypeError\",\n message: \"Setting '__proto__' property is not allowed\",\n loc: prop.key.loc,\n });\n }\n }\n }\n },\n VariableDeclaration(node: VariableDeclaration) {\n if (node.kind === \"var\" && rules?.noVar) {\n errors.push({\n type: \"SyntaxError\",\n message:\n \"Var declaration is not recommended, use `let` or `const` instead\",\n loc: {\n start: node.loc.start,\n end: {\n line: node.loc.end.line,\n // Only decorate the \"var\".\n column: node.loc.start.column + 3,\n },\n },\n });\n }\n },\n __UnknownNode(node: EstreeNode) {\n errors.push({\n type: \"SyntaxError\",\n message: `Unsupported syntax: \\`${node.type}\\``,\n loc: node.loc,\n });\n },\n __GlobalVariable(node: Identifier) {\n if (node.name === \"arguments\") {\n errors.push({\n type: \"SyntaxError\",\n message: \"Use the rest parameters instead of 'arguments'\",\n loc: node.loc,\n });\n }\n },\n },\n });\n }\n return errors;\n}\n"],"file":"lint.js"}
1
+ {"version":3,"sources":["../../src/lint.ts"],"names":["lint","source","typescript","rules","errors","file","body","program","jsNodes","node","type","startsWith","test","push","message","loc","func","isFunctionDeclaration","unshift","start","line","column","end","hooks","beforeVisit","async","generator","regex","value","flags","includes","prop","properties","kind","computed","key","name","noVar","beforeVisitGlobal","beforeVisitUnknown"],"mappings":"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","sourcesContent":["import { ParseResult } from \"@babel/parser\";\nimport {\n File,\n FunctionDeclaration,\n SourceLocation,\n Statement,\n} from \"@babel/types\";\nimport { CookRules } from \"./interfaces\";\nimport { parseForAnalysis } from \"./parse\";\nimport { precook } from \"./precook\";\n\nexport interface LintOptions {\n typescript?: boolean;\n rules?: CookRules;\n}\n\nexport interface LintError {\n type: \"SyntaxError\" | \"TypeError\";\n message: string;\n loc: SourceLocation;\n}\n\n/** For next-core internal or devtools usage only. */\nexport function lint(\n source: string | ParseResult<File>,\n { typescript, rules }: LintOptions = {}\n): LintError[] {\n const errors: LintError[] = [];\n const file =\n typeof source === \"string\"\n ? parseForAnalysis(source, { typescript })\n : source;\n if (!file) {\n // Return no errors if parse failed.\n return errors;\n }\n const body = file.program.body;\n const jsNodes: Statement[] = typescript ? [] : body;\n if (typescript) {\n for (const node of body) {\n if (node.type.startsWith(\"TS\")) {\n if (/Enum|Import|Export/.test(node.type)) {\n errors.push({\n type: \"SyntaxError\",\n message: `Unsupported TypeScript syntax: \\`${node.type}\\``,\n loc: node.loc,\n });\n }\n } else {\n jsNodes.push(node);\n }\n }\n }\n let func: FunctionDeclaration;\n for (const node of jsNodes) {\n const isFunctionDeclaration = node.type === \"FunctionDeclaration\";\n if (isFunctionDeclaration && !func) {\n func = node;\n } else {\n errors.push({\n type: \"SyntaxError\",\n message: isFunctionDeclaration\n ? \"Expect a single function declaration\"\n : `\\`${node.type}\\` is not allowed in top level`,\n loc: node.loc,\n });\n }\n }\n if (!func) {\n errors.unshift({\n type: \"SyntaxError\",\n message: \"Function declaration not found\",\n loc: {\n start: { line: 1, column: 0 },\n end: { line: 1, column: 0 },\n },\n });\n } else {\n precook(func, {\n hooks: {\n beforeVisit(node) {\n switch (node.type) {\n case \"ArrowFunctionExpression\":\n case \"FunctionDeclaration\":\n case \"FunctionExpression\":\n if (node.async || node.generator) {\n errors.push({\n type: \"SyntaxError\",\n message: `${\n node.async ? \"Async\" : \"Generator\"\n } function is not allowed`,\n loc: node.loc,\n });\n }\n break;\n case \"Literal\":\n if (node.regex) {\n if (node.value === null) {\n errors.push({\n type: \"SyntaxError\",\n message: \"Invalid regular expression\",\n loc: node.loc,\n });\n } else if (node.regex.flags.includes(\"u\")) {\n errors.push({\n type: \"SyntaxError\",\n message: \"Unsupported unicode flag in regular expression\",\n loc: node.loc,\n });\n }\n }\n break;\n case \"ObjectExpression\":\n for (const prop of node.properties) {\n if (prop.type === \"Property\") {\n if (prop.kind !== \"init\") {\n errors.push({\n type: \"SyntaxError\",\n message: \"Unsupported object getter/setter property\",\n loc: prop.loc,\n });\n } else if (\n !prop.computed &&\n prop.key.type === \"Identifier\" &&\n prop.key.name === \"__proto__\"\n ) {\n errors.push({\n type: \"TypeError\",\n message: \"Setting '__proto__' property is not allowed\",\n loc: prop.key.loc,\n });\n }\n }\n }\n break;\n case \"VariableDeclaration\":\n if (node.kind === \"var\" && rules?.noVar) {\n errors.push({\n type: \"SyntaxError\",\n message:\n \"Var declaration is not recommended, use `let` or `const` instead\",\n loc: {\n start: node.loc.start,\n end: {\n line: node.loc.end.line,\n // Only decorate the \"var\".\n column: node.loc.start.column + 3,\n },\n },\n });\n }\n break;\n }\n },\n beforeVisitGlobal(node) {\n if (node.name === \"arguments\") {\n errors.push({\n type: \"SyntaxError\",\n message: \"Use the rest parameters instead of 'arguments'\",\n loc: node.loc,\n });\n }\n },\n beforeVisitUnknown(node) {\n errors.push({\n type: \"SyntaxError\",\n message: `Unsupported syntax: \\`${node.type}\\``,\n loc: node.loc,\n });\n return true;\n },\n },\n });\n }\n return errors;\n}\n"],"file":"lint.js"}
package/dist/cjs/parse.js CHANGED
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.parseAsEstree = parseAsEstree;
7
7
  exports.parseAsEstreeExpression = parseAsEstreeExpression;
8
+ exports.parseForAnalysis = parseForAnalysis;
8
9
 
9
10
  var _parser = require("@babel/parser");
10
11
 
@@ -50,4 +51,24 @@ function parseAsEstree(source, {
50
51
 
51
52
  return jsNodes[0];
52
53
  }
54
+
55
+ /** For next-core internal or devtools usage only. */
56
+ function parseForAnalysis(source, {
57
+ typescript,
58
+ tokens
59
+ } = {}) {
60
+ try {
61
+ return (0, _parser.parse)(source, {
62
+ plugins: ["estree", typescript && "typescript"].filter(Boolean),
63
+ strictMode: true,
64
+ attachComment: false,
65
+ // Allow export/import declarations to make analyser handle errors.
66
+ sourceType: "unambiguous",
67
+ tokens
68
+ });
69
+ } catch (e) {
70
+ // Return no errors if parse failed.
71
+ return null;
72
+ }
73
+ }
53
74
  //# sourceMappingURL=parse.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/parse.ts"],"names":["parseAsEstreeExpression","source","plugins","proposal","attachComment","parseAsEstree","typescript","file","filter","Boolean","strictMode","body","program","jsNodes","node","type","startsWith","test","SyntaxError","push","length","map","join"],"mappings":";;;;;;;;AAAA;;AAGO,SAASA,uBAAT,CAAiCC,MAAjC,EAA6D;AAClE,SAAO,6BAAgBA,MAAhB,EAAwB;AAC7BC,IAAAA,OAAO,EAAE,CAAC,QAAD,EAAW,CAAC,kBAAD,EAAqB;AAAEC,MAAAA,QAAQ,EAAE;AAAZ,KAArB,CAAX,CADoB;AAE7BC,IAAAA,aAAa,EAAE;AAFc,GAAxB,CAAP;AAID;;AAMM,SAASC,aAAT,CACLJ,MADK,EAEL;AAAEK,EAAAA;AAAF,IAAqC,EAFhC,EAGgB;AACrB,QAAMC,IAAI,GAAG,mBAAMN,MAAN,EAAc;AACzBC,IAAAA,OAAO,EAAE,CAAC,QAAD,EAAWI,UAAU,IAAI,YAAzB,EAAuCE,MAAvC,CACPC,OADO,CADgB;AAIzBC,IAAAA,UAAU,EAAE,IAJa;AAKzBN,IAAAA,aAAa,EAAE;AALU,GAAd,CAAb;AAOA,QAAMO,IAAI,GAAGJ,IAAI,CAACK,OAAL,CAAaD,IAA1B;AACA,QAAME,OAAoB,GAAGP,UAAU,GAAG,EAAH,GAAQK,IAA/C;;AACA,MAAIL,UAAJ,EAAgB;AACd,SAAK,MAAMQ,IAAX,IAAmBH,IAAnB,EAAyB;AACvB,UAAIG,IAAI,CAACC,IAAL,CAAUC,UAAV,CAAqB,IAArB,CAAJ,EAAgC;AAC9B,YAAI,qBAAqBC,IAArB,CAA0BH,IAAI,CAACC,IAA/B,CAAJ,EAA0C;AACxC,gBAAM,IAAIG,WAAJ,CAAiB,kCAAiCJ,IAAI,CAACC,IAAK,EAA5D,CAAN;AACD;AACF,OAJD,MAIO;AACLF,QAAAA,OAAO,CAACM,IAAR,CAAaL,IAAb;AACD;AACF;AACF;;AACD,MAAID,OAAO,CAACO,MAAR,KAAmB,CAAvB,EAA0B;AACxB,UAAM,IAAIF,WAAJ,CAAgB,gCAAhB,CAAN;AACD;;AACD,MAAIL,OAAO,CAACO,MAAR,GAAiB,CAAjB,IAAsBP,OAAO,CAAC,CAAD,CAAP,CAAWE,IAAX,KAAoB,qBAA9C,EAAqE;AACnE,UAAM,IAAIG,WAAJ,CACH,oEAAmEL,OAAO,CACxEQ,GADiE,CAC5DP,IAAD,IAAW,IAAGA,IAAI,CAACC,IAAK,GADqC,EAEjEO,IAFiE,CAE5D,IAF4D,CAEtD,EAHV,CAAN;AAKD;;AACD,SAAOT,OAAO,CAAC,CAAD,CAAd;AACD","sourcesContent":["import { parse, parseExpression, ParserPlugin } from \"@babel/parser\";\nimport { Expression, FunctionDeclaration, Statement } from \"@babel/types\";\n\nexport function parseAsEstreeExpression(source: string): Expression {\n return parseExpression(source, {\n plugins: [\"estree\", [\"pipelineOperator\", { proposal: \"minimal\" }]],\n attachComment: false,\n });\n}\n\nexport interface ParseEstreeOptions {\n typescript?: boolean;\n}\n\nexport function parseAsEstree(\n source: string,\n { typescript }: ParseEstreeOptions = {}\n): FunctionDeclaration {\n const file = parse(source, {\n plugins: [\"estree\", typescript && \"typescript\"].filter(\n Boolean\n ) as ParserPlugin[],\n strictMode: true,\n attachComment: false,\n });\n const body = file.program.body;\n const jsNodes: Statement[] = typescript ? [] : body;\n if (typescript) {\n for (const node of body) {\n if (node.type.startsWith(\"TS\")) {\n if (/Enum|Import|Export/.test(node.type)) {\n throw new SyntaxError(`Unsupported TypeScript syntax: ${node.type}`);\n }\n } else {\n jsNodes.push(node);\n }\n }\n }\n if (jsNodes.length === 0) {\n throw new SyntaxError(\"Function declaration not found\");\n }\n if (jsNodes.length > 1 || jsNodes[0].type !== \"FunctionDeclaration\") {\n throw new SyntaxError(\n `Expect a single function declaration at top level, but received: ${jsNodes\n .map((node) => `\"${node.type}\"`)\n .join(\", \")}`\n );\n }\n return jsNodes[0] as FunctionDeclaration;\n}\n"],"file":"parse.js"}
1
+ {"version":3,"sources":["../../src/parse.ts"],"names":["parseAsEstreeExpression","source","plugins","proposal","attachComment","parseAsEstree","typescript","file","filter","Boolean","strictMode","body","program","jsNodes","node","type","startsWith","test","SyntaxError","push","length","map","join","parseForAnalysis","tokens","sourceType","e"],"mappings":";;;;;;;;;AAAA;;AAQO,SAASA,uBAAT,CAAiCC,MAAjC,EAA6D;AAClE,SAAO,6BAAgBA,MAAhB,EAAwB;AAC7BC,IAAAA,OAAO,EAAE,CAAC,QAAD,EAAW,CAAC,kBAAD,EAAqB;AAAEC,MAAAA,QAAQ,EAAE;AAAZ,KAArB,CAAX,CADoB;AAE7BC,IAAAA,aAAa,EAAE;AAFc,GAAxB,CAAP;AAID;;AAMM,SAASC,aAAT,CACLJ,MADK,EAEL;AAAEK,EAAAA;AAAF,IAAqC,EAFhC,EAGgB;AACrB,QAAMC,IAAI,GAAG,mBAAMN,MAAN,EAAc;AACzBC,IAAAA,OAAO,EAAE,CAAC,QAAD,EAAWI,UAAU,IAAI,YAAzB,EAAuCE,MAAvC,CACPC,OADO,CADgB;AAIzBC,IAAAA,UAAU,EAAE,IAJa;AAKzBN,IAAAA,aAAa,EAAE;AALU,GAAd,CAAb;AAOA,QAAMO,IAAI,GAAGJ,IAAI,CAACK,OAAL,CAAaD,IAA1B;AACA,QAAME,OAAoB,GAAGP,UAAU,GAAG,EAAH,GAAQK,IAA/C;;AACA,MAAIL,UAAJ,EAAgB;AACd,SAAK,MAAMQ,IAAX,IAAmBH,IAAnB,EAAyB;AACvB,UAAIG,IAAI,CAACC,IAAL,CAAUC,UAAV,CAAqB,IAArB,CAAJ,EAAgC;AAC9B,YAAI,qBAAqBC,IAArB,CAA0BH,IAAI,CAACC,IAA/B,CAAJ,EAA0C;AACxC,gBAAM,IAAIG,WAAJ,CAAiB,kCAAiCJ,IAAI,CAACC,IAAK,EAA5D,CAAN;AACD;AACF,OAJD,MAIO;AACLF,QAAAA,OAAO,CAACM,IAAR,CAAaL,IAAb;AACD;AACF;AACF;;AACD,MAAID,OAAO,CAACO,MAAR,KAAmB,CAAvB,EAA0B;AACxB,UAAM,IAAIF,WAAJ,CAAgB,gCAAhB,CAAN;AACD;;AACD,MAAIL,OAAO,CAACO,MAAR,GAAiB,CAAjB,IAAsBP,OAAO,CAAC,CAAD,CAAP,CAAWE,IAAX,KAAoB,qBAA9C,EAAqE;AACnE,UAAM,IAAIG,WAAJ,CACH,oEAAmEL,OAAO,CACxEQ,GADiE,CAC5DP,IAAD,IAAW,IAAGA,IAAI,CAACC,IAAK,GADqC,EAEjEO,IAFiE,CAE5D,IAF4D,CAEtD,EAHV,CAAN;AAKD;;AACD,SAAOT,OAAO,CAAC,CAAD,CAAd;AACD;;AAOD;AACO,SAASU,gBAAT,CACLtB,MADK,EAEL;AAAEK,EAAAA,UAAF;AAAckB,EAAAA;AAAd,IAA0C,EAFrC,EAGc;AACnB,MAAI;AACF,WAAO,mBAAMvB,MAAN,EAAc;AACnBC,MAAAA,OAAO,EAAE,CAAC,QAAD,EAAWI,UAAU,IAAI,YAAzB,EAAuCE,MAAvC,CACPC,OADO,CADU;AAInBC,MAAAA,UAAU,EAAE,IAJO;AAKnBN,MAAAA,aAAa,EAAE,KALI;AAMnB;AACAqB,MAAAA,UAAU,EAAE,aAPO;AAQnBD,MAAAA;AARmB,KAAd,CAAP;AAUD,GAXD,CAWE,OAAOE,CAAP,EAAU;AACV;AACA,WAAO,IAAP;AACD;AACF","sourcesContent":["import {\n parse,\n parseExpression,\n ParseResult,\n ParserPlugin,\n} from \"@babel/parser\";\nimport { Expression, File, FunctionDeclaration, Statement } from \"@babel/types\";\n\nexport function parseAsEstreeExpression(source: string): Expression {\n return parseExpression(source, {\n plugins: [\"estree\", [\"pipelineOperator\", { proposal: \"minimal\" }]],\n attachComment: false,\n });\n}\n\nexport interface ParseEstreeOptions {\n typescript?: boolean;\n}\n\nexport function parseAsEstree(\n source: string,\n { typescript }: ParseEstreeOptions = {}\n): FunctionDeclaration {\n const file = parse(source, {\n plugins: [\"estree\", typescript && \"typescript\"].filter(\n Boolean\n ) as ParserPlugin[],\n strictMode: true,\n attachComment: false,\n });\n const body = file.program.body;\n const jsNodes: Statement[] = typescript ? [] : body;\n if (typescript) {\n for (const node of body) {\n if (node.type.startsWith(\"TS\")) {\n if (/Enum|Import|Export/.test(node.type)) {\n throw new SyntaxError(`Unsupported TypeScript syntax: ${node.type}`);\n }\n } else {\n jsNodes.push(node);\n }\n }\n }\n if (jsNodes.length === 0) {\n throw new SyntaxError(\"Function declaration not found\");\n }\n if (jsNodes.length > 1 || jsNodes[0].type !== \"FunctionDeclaration\") {\n throw new SyntaxError(\n `Expect a single function declaration at top level, but received: ${jsNodes\n .map((node) => `\"${node.type}\"`)\n .join(\", \")}`\n );\n }\n return jsNodes[0] as FunctionDeclaration;\n}\n\nexport interface AnalysisOptions {\n typescript?: boolean;\n tokens?: boolean;\n}\n\n/** For next-core internal or devtools usage only. */\nexport function parseForAnalysis(\n source: string,\n { typescript, tokens }: AnalysisOptions = {}\n): ParseResult<File> {\n try {\n return parse(source, {\n plugins: [\"estree\", typescript && \"typescript\"].filter(\n Boolean\n ) as ParserPlugin[],\n strictMode: true,\n attachComment: false,\n // Allow export/import declarations to make analyser handle errors.\n sourceType: \"unambiguous\",\n tokens,\n });\n } catch (e) {\n // Return no errors if parse failed.\n return null;\n }\n}\n"],"file":"parse.js"}
@@ -47,7 +47,7 @@ function precook(rootAst, {
47
47
  Evaluate(n);
48
48
  }
49
49
  } else if (node) {
50
- var _hooks$beforeVisit;
50
+ var _hooks$beforeVisit, _hooks$beforeVisitUnk;
51
51
 
52
52
  // `node` maybe `null` in some cases.
53
53
  (_hooks$beforeVisit = hooks.beforeVisit) === null || _hooks$beforeVisit === void 0 ? void 0 : _hooks$beforeVisit.call(hooks, node);
@@ -56,11 +56,10 @@ function precook(rootAst, {
56
56
  switch (node.type) {
57
57
  case "Identifier":
58
58
  if (!ResolveBinding(node.name)) {
59
- attemptToVisitGlobals.add(node.name);
59
+ var _hooks$beforeVisitGlo;
60
60
 
61
- if (visitors && (0, _hasOwnProperty.hasOwnProperty)(visitors, "__GlobalVariable")) {
62
- visitors.__GlobalVariable(node);
63
- }
61
+ (_hooks$beforeVisitGlo = hooks.beforeVisitGlobal) === null || _hooks$beforeVisitGlo === void 0 ? void 0 : _hooks$beforeVisitGlo.call(hooks, node);
62
+ attemptToVisitGlobals.add(node.name);
64
63
  }
65
64
 
66
65
  return;
@@ -315,9 +314,9 @@ function precook(rootAst, {
315
314
  }
316
315
  }
317
316
 
318
- if (visitors && (0, _hasOwnProperty.hasOwnProperty)(visitors, "__UnknownNode")) {
319
- visitors.__UnknownNode(node);
320
- } else {
317
+ const silent = (_hooks$beforeVisitUnk = hooks.beforeVisitUnknown) === null || _hooks$beforeVisitUnk === void 0 ? void 0 : _hooks$beforeVisitUnk.call(hooks, node);
318
+
319
+ if (!silent) {
321
320
  // eslint-disable-next-line no-console
322
321
  console.warn(`Unsupported node type \`${node.type}\``);
323
322
  }
@@ -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","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":["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"}
package/dist/esm/cook.js CHANGED
@@ -4,13 +4,14 @@ import { sanitize, isAllowedConstructor } from "./sanitize";
4
4
  import { collectBoundNames, collectScopedDeclarations, containsExpression } from "./traverse";
5
5
 
6
6
  /** For next-core internal usage only. */
7
- export function cook(rootAst, codeSource, {
8
- rules,
9
- globalVariables = {},
10
- hooks = {}
11
- } = {}) {
7
+ export function cook(rootAst, codeSource) {
12
8
  var _hooks$beforeEvaluate3;
13
9
 
10
+ var {
11
+ rules,
12
+ globalVariables = {},
13
+ hooks = {}
14
+ } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
14
15
  var expressionOnly = rootAst.type !== "FunctionDeclaration";
15
16
  var rootEnv = new DeclarativeEnvironment(null);
16
17
  var rootContext = new ExecutionContext();