@next-core/cook 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +3 -0
  3. package/dist/cjs/AnalysisContext.js +42 -0
  4. package/dist/cjs/AnalysisContext.js.map +1 -0
  5. package/dist/cjs/ExecutionContext.js +161 -0
  6. package/dist/cjs/ExecutionContext.js.map +1 -0
  7. package/dist/cjs/context-free.js +262 -0
  8. package/dist/cjs/context-free.js.map +1 -0
  9. package/dist/cjs/cook.js +1587 -0
  10. package/dist/cjs/cook.js.map +1 -0
  11. package/dist/cjs/hasOwnProperty.js +11 -0
  12. package/dist/cjs/hasOwnProperty.js.map +1 -0
  13. package/dist/cjs/index.js +58 -0
  14. package/dist/cjs/index.js.map +1 -0
  15. package/dist/cjs/interfaces.js +6 -0
  16. package/dist/cjs/interfaces.js.map +1 -0
  17. package/dist/cjs/lint.js +176 -0
  18. package/dist/cjs/lint.js.map +1 -0
  19. package/dist/cjs/parse.js +51 -0
  20. package/dist/cjs/parse.js.map +1 -0
  21. package/dist/cjs/precook.js +432 -0
  22. package/dist/cjs/precook.js.map +1 -0
  23. package/dist/cjs/precookFunction.js +25 -0
  24. package/dist/cjs/precookFunction.js.map +1 -0
  25. package/dist/cjs/preevaluate.js +35 -0
  26. package/dist/cjs/preevaluate.js.map +1 -0
  27. package/dist/cjs/sanitize.js +59 -0
  28. package/dist/cjs/sanitize.js.map +1 -0
  29. package/dist/cjs/traverse.js +168 -0
  30. package/dist/cjs/traverse.js.map +1 -0
  31. package/dist/esm/AnalysisContext.js +30 -0
  32. package/dist/esm/AnalysisContext.js.map +1 -0
  33. package/dist/esm/ExecutionContext.js +135 -0
  34. package/dist/esm/ExecutionContext.js.map +1 -0
  35. package/dist/esm/context-free.js +221 -0
  36. package/dist/esm/context-free.js.map +1 -0
  37. package/dist/esm/cook.js +1607 -0
  38. package/dist/esm/cook.js.map +1 -0
  39. package/dist/esm/hasOwnProperty.js +4 -0
  40. package/dist/esm/hasOwnProperty.js.map +1 -0
  41. package/dist/esm/index.js +5 -0
  42. package/dist/esm/index.js.map +1 -0
  43. package/dist/esm/interfaces.js +2 -0
  44. package/dist/esm/interfaces.js.map +1 -0
  45. package/dist/esm/lint.js +168 -0
  46. package/dist/esm/lint.js.map +1 -0
  47. package/dist/esm/parse.js +41 -0
  48. package/dist/esm/parse.js.map +1 -0
  49. package/dist/esm/precook.js +435 -0
  50. package/dist/esm/precook.js.map +1 -0
  51. package/dist/esm/precookFunction.js +20 -0
  52. package/dist/esm/precookFunction.js.map +1 -0
  53. package/dist/esm/preevaluate.js +23 -0
  54. package/dist/esm/preevaluate.js.map +1 -0
  55. package/dist/esm/sanitize.js +48 -0
  56. package/dist/esm/sanitize.js.map +1 -0
  57. package/dist/esm/traverse.js +157 -0
  58. package/dist/esm/traverse.js.map +1 -0
  59. package/dist/types/AnalysisContext.d.ts +17 -0
  60. package/dist/types/ExecutionContext.d.ts +79 -0
  61. package/dist/types/context-free.d.ts +19 -0
  62. package/dist/types/cook.d.ts +12 -0
  63. package/dist/types/cook.spec.d.ts +1 -0
  64. package/dist/types/hasOwnProperty.d.ts +1 -0
  65. package/dist/types/index.d.ts +4 -0
  66. package/dist/types/interfaces.d.ts +33 -0
  67. package/dist/types/lint.d.ts +13 -0
  68. package/dist/types/lint.spec.d.ts +1 -0
  69. package/dist/types/parse.d.ts +6 -0
  70. package/dist/types/precook.d.ts +14 -0
  71. package/dist/types/precook.spec.d.ts +1 -0
  72. package/dist/types/precookFunction.d.ts +10 -0
  73. package/dist/types/precookFunction.spec.d.ts +1 -0
  74. package/dist/types/preevaluate.d.ts +13 -0
  75. package/dist/types/preevaluate.spec.d.ts +1 -0
  76. package/dist/types/sanitize.d.ts +2 -0
  77. package/dist/types/traverse.d.ts +11 -0
  78. package/package.json +40 -0
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.collectBoundNames = collectBoundNames;
7
+ exports.containsExpression = containsExpression;
8
+ exports.collectScopedDeclarations = collectScopedDeclarations;
9
+
10
+ function collectBoundNames(root) {
11
+ const names = new Set();
12
+
13
+ const collect = node => {
14
+ if (Array.isArray(node)) {
15
+ for (const n of node) {
16
+ collect(n);
17
+ }
18
+ } else if (node) {
19
+ // `node` maybe `null` in some cases.
20
+ switch (node.type) {
21
+ case "Identifier":
22
+ names.add(node.name);
23
+ return;
24
+
25
+ case "VariableDeclaration":
26
+ return collect(node.declarations);
27
+
28
+ case "VariableDeclarator":
29
+ return collect(node.id);
30
+
31
+ case "ArrayPattern":
32
+ return collect(node.elements);
33
+
34
+ case "AssignmentPattern":
35
+ return collect(node.left);
36
+
37
+ case "ObjectPattern":
38
+ return collect(node.properties);
39
+
40
+ case "Property":
41
+ return collect(node.value);
42
+
43
+ case "RestElement":
44
+ return collect(node.argument);
45
+
46
+ case "FunctionDeclaration":
47
+ return collect(node.id);
48
+ }
49
+ }
50
+ };
51
+
52
+ collect(root);
53
+ return Array.from(names);
54
+ }
55
+
56
+ function containsExpression(root) {
57
+ const collect = node => {
58
+ if (Array.isArray(node)) {
59
+ return node.some(collect);
60
+ } else if (node) {
61
+ // `node` maybe `null` in some cases.
62
+ switch (node.type) {
63
+ case "ArrayPattern":
64
+ return collect(node.elements);
65
+
66
+ case "AssignmentPattern":
67
+ return true;
68
+
69
+ case "ObjectPattern":
70
+ return collect(node.properties);
71
+
72
+ case "Property":
73
+ return node.computed || collect(node.value);
74
+
75
+ case "RestElement":
76
+ return collect(node.argument);
77
+ }
78
+ }
79
+ };
80
+
81
+ return collect(root);
82
+ }
83
+
84
+ function collectScopedDeclarations(root, options) {
85
+ const declarations = [];
86
+ const nextOptions = {
87
+ var: options.var
88
+ };
89
+
90
+ const collect = (node, options) => {
91
+ if (Array.isArray(node)) {
92
+ for (const n of node) {
93
+ collect(n, options);
94
+ }
95
+ } else if (node) {
96
+ // `node` maybe `null` in some cases.
97
+ switch (node.type) {
98
+ case "FunctionDeclaration":
99
+ // At the top level of a function, or script, function declarations are
100
+ // treated like var declarations rather than like lexical declarations.
101
+ // See https://tc39.es/ecma262/#sec-static-semantics-toplevellexicallydeclarednames
102
+ if (Number(!options.var) ^ Number(options.topLevel)) {
103
+ declarations.push(node);
104
+ }
105
+
106
+ return;
107
+
108
+ case "VariableDeclaration":
109
+ if (Number(!options.var) ^ Number(node.kind === "var")) {
110
+ declarations.push(node);
111
+ }
112
+
113
+ return;
114
+
115
+ case "SwitchCase":
116
+ collect(node.consequent, nextOptions);
117
+ return;
118
+
119
+ case "CatchClause":
120
+ collect(node.body, nextOptions);
121
+ return;
122
+ }
123
+
124
+ if (options.var) {
125
+ switch (node.type) {
126
+ case "BlockStatement":
127
+ collect(node.body, nextOptions);
128
+ return;
129
+
130
+ case "IfStatement":
131
+ collect(node.consequent, nextOptions);
132
+ collect(node.alternate, nextOptions);
133
+ return;
134
+
135
+ case "DoWhileStatement":
136
+ case "WhileStatement":
137
+ collect(node.body, nextOptions);
138
+ return;
139
+
140
+ case "ForStatement":
141
+ collect(node.init, nextOptions);
142
+ collect(node.body, nextOptions);
143
+ return;
144
+
145
+ case "ForInStatement":
146
+ case "ForOfStatement":
147
+ collect(node.left, nextOptions);
148
+ collect(node.body, nextOptions);
149
+ return;
150
+
151
+ case "SwitchStatement":
152
+ collect(node.cases, nextOptions);
153
+ return;
154
+
155
+ case "TryStatement":
156
+ collect(node.block, nextOptions);
157
+ collect(node.handler, nextOptions);
158
+ collect(node.finalizer, nextOptions);
159
+ return;
160
+ }
161
+ }
162
+ }
163
+ };
164
+
165
+ collect(root, options);
166
+ return declarations;
167
+ }
168
+ //# sourceMappingURL=traverse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/traverse.ts"],"names":["collectBoundNames","root","names","Set","collect","node","Array","isArray","n","type","add","name","declarations","id","elements","left","properties","value","argument","from","containsExpression","some","computed","collectScopedDeclarations","options","nextOptions","var","Number","topLevel","push","kind","consequent","body","alternate","init","cases","block","handler","finalizer"],"mappings":"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","sourcesContent":["import { FunctionDeclaration, VariableDeclaration } from \"@babel/types\";\nimport { EstreeNode, NodeWithBoundNames } from \"./interfaces\";\n\ntype InternalCollect<T = void, O = unknown> = (\n node: EstreeNode | EstreeNode[],\n options?: O\n) => T;\ntype InternalCollectWithOptions<T = void, O = unknown> = (\n node: EstreeNode | EstreeNode[],\n options: O\n) => T;\n\nexport function collectBoundNames(\n root: NodeWithBoundNames | NodeWithBoundNames[]\n): string[] {\n const names = new Set<string>();\n const collect: InternalCollect = (node) => {\n if (Array.isArray(node)) {\n for (const n of node) {\n collect(n);\n }\n } else if (node) {\n // `node` maybe `null` in some cases.\n switch (node.type) {\n case \"Identifier\":\n names.add(node.name);\n return;\n case \"VariableDeclaration\":\n return collect(node.declarations);\n case \"VariableDeclarator\":\n return collect(node.id);\n case \"ArrayPattern\":\n return collect(node.elements);\n case \"AssignmentPattern\":\n return collect(node.left);\n case \"ObjectPattern\":\n return collect(node.properties);\n case \"Property\":\n return collect(node.value);\n case \"RestElement\":\n return collect(node.argument);\n case \"FunctionDeclaration\":\n return collect(node.id);\n }\n }\n };\n collect(root);\n return Array.from(names);\n}\n\nexport function containsExpression(root: EstreeNode | EstreeNode[]): boolean {\n const collect: InternalCollect<boolean> = (node) => {\n if (Array.isArray(node)) {\n return node.some(collect);\n } else if (node) {\n // `node` maybe `null` in some cases.\n switch (node.type) {\n case \"ArrayPattern\":\n return collect(node.elements);\n case \"AssignmentPattern\":\n return true;\n case \"ObjectPattern\":\n return collect(node.properties);\n case \"Property\":\n return node.computed || collect(node.value);\n case \"RestElement\":\n return collect(node.argument);\n }\n }\n };\n return collect(root);\n}\n\ninterface ScopedDeclarationOptions {\n var?: boolean;\n topLevel?: boolean;\n}\n\ntype ScopedDeclaration = VariableDeclaration | FunctionDeclaration;\n\nexport function collectScopedDeclarations(\n root: EstreeNode | EstreeNode[],\n options: ScopedDeclarationOptions\n): ScopedDeclaration[] {\n const declarations: ScopedDeclaration[] = [];\n const nextOptions = { var: options.var };\n const collect: InternalCollectWithOptions<void, ScopedDeclarationOptions> = (\n node,\n options\n ): void => {\n if (Array.isArray(node)) {\n for (const n of node) {\n collect(n, options);\n }\n } else if (node) {\n // `node` maybe `null` in some cases.\n switch (node.type) {\n case \"FunctionDeclaration\":\n // At the top level of a function, or script, function declarations are\n // treated like var declarations rather than like lexical declarations.\n // See https://tc39.es/ecma262/#sec-static-semantics-toplevellexicallydeclarednames\n if (Number(!options.var) ^ Number(options.topLevel)) {\n declarations.push(node);\n }\n return;\n case \"VariableDeclaration\":\n if (Number(!options.var) ^ Number(node.kind === \"var\")) {\n declarations.push(node);\n }\n return;\n case \"SwitchCase\":\n collect(node.consequent, nextOptions);\n return;\n case \"CatchClause\":\n collect(node.body, nextOptions);\n return;\n }\n if (options.var) {\n switch (node.type) {\n case \"BlockStatement\":\n collect(node.body, nextOptions);\n return;\n case \"IfStatement\":\n collect(node.consequent, nextOptions);\n collect(node.alternate, nextOptions);\n return;\n case \"DoWhileStatement\":\n case \"WhileStatement\":\n collect(node.body, nextOptions);\n return;\n case \"ForStatement\":\n collect(node.init, nextOptions);\n collect(node.body, nextOptions);\n return;\n case \"ForInStatement\":\n case \"ForOfStatement\":\n collect(node.left, nextOptions);\n collect(node.body, nextOptions);\n return;\n case \"SwitchStatement\":\n collect(node.cases, nextOptions);\n return;\n case \"TryStatement\":\n collect(node.block, nextOptions);\n collect(node.handler, nextOptions);\n collect(node.finalizer, nextOptions);\n return;\n }\n }\n }\n };\n collect(root, options);\n return declarations;\n}\n"],"file":"traverse.js"}
@@ -0,0 +1,30 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ // https://tc39.es/ecma262/#sec-execution-contexts
3
+ export class AnalysisContext {
4
+ constructor() {
5
+ _defineProperty(this, "VariableEnvironment", void 0);
6
+
7
+ _defineProperty(this, "LexicalEnvironment", void 0);
8
+ }
9
+
10
+ } // https://tc39.es/ecma262/#sec-environment-records
11
+
12
+ export class AnalysisEnvironment {
13
+ constructor(outer) {
14
+ _defineProperty(this, "OuterEnv", void 0);
15
+
16
+ _defineProperty(this, "bindingSet", new Set());
17
+
18
+ this.OuterEnv = outer;
19
+ }
20
+
21
+ HasBinding(name) {
22
+ return this.bindingSet.has(name);
23
+ }
24
+
25
+ CreateBinding(name) {
26
+ this.bindingSet.add(name);
27
+ }
28
+
29
+ }
30
+ //# sourceMappingURL=AnalysisContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/AnalysisContext.ts"],"names":["AnalysisContext","AnalysisEnvironment","constructor","outer","Set","OuterEnv","HasBinding","name","bindingSet","has","CreateBinding","add"],"mappings":";AAEA;AACA,OAAO,MAAMA,eAAN,CAAsB;AAAA;AAAA;;AAAA;AAAA;;AAAA,C,CAK7B;;AACA,OAAO,MAAMC,mBAAN,CAA0B;AAI/BC,EAAAA,WAAW,CAACC,KAAD,EAA6B;AAAA;;AAAA,wCAFV,IAAIC,GAAJ,EAEU;;AACtC,SAAKC,QAAL,GAAgBF,KAAhB;AACD;;AAEDG,EAAAA,UAAU,CAACC,IAAD,EAAwB;AAChC,WAAO,KAAKC,UAAL,CAAgBC,GAAhB,CAAoBF,IAApB,CAAP;AACD;;AAEDG,EAAAA,aAAa,CAACH,IAAD,EAAqB;AAChC,SAAKC,UAAL,CAAgBG,GAAhB,CAAoBJ,IAApB;AACD;;AAd8B","sourcesContent":["import { Expression, FunctionDeclaration, Statement } from \"@babel/types\";\n\n// https://tc39.es/ecma262/#sec-execution-contexts\nexport class AnalysisContext {\n VariableEnvironment: AnalysisEnvironment;\n LexicalEnvironment: AnalysisEnvironment;\n}\n\n// https://tc39.es/ecma262/#sec-environment-records\nexport class AnalysisEnvironment {\n readonly OuterEnv: AnalysisEnvironment;\n private readonly bindingSet = new Set<string>();\n\n constructor(outer: AnalysisEnvironment) {\n this.OuterEnv = outer;\n }\n\n HasBinding(name: string): boolean {\n return this.bindingSet.has(name);\n }\n\n CreateBinding(name: string): void {\n this.bindingSet.add(name);\n }\n}\n\nexport interface AnalysisFunctionObject {\n FormalParameters: FunctionDeclaration[\"params\"];\n ECMAScriptCode: Statement[] | Expression;\n Environment: AnalysisEnvironment;\n}\n"],"file":"AnalysisContext.js"}
@@ -0,0 +1,135 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ // https://tc39.es/ecma262/#sec-execution-contexts
3
+ export class ExecutionContext {
4
+ constructor() {
5
+ _defineProperty(this, "VariableEnvironment", void 0);
6
+
7
+ _defineProperty(this, "LexicalEnvironment", void 0);
8
+
9
+ _defineProperty(this, "Function", void 0);
10
+ }
11
+
12
+ }
13
+ // https://tc39.es/ecma262/#sec-environment-records
14
+ export class EnvironmentRecord {
15
+ constructor(outer) {
16
+ _defineProperty(this, "OuterEnv", void 0);
17
+
18
+ _defineProperty(this, "bindingMap", new Map());
19
+
20
+ this.OuterEnv = outer;
21
+ }
22
+
23
+ HasBinding(name) {
24
+ return this.bindingMap.has(name);
25
+ }
26
+
27
+ CreateMutableBinding(name, deletable) {
28
+ // Assert: binding does not exist.
29
+ this.bindingMap.set(name, {
30
+ mutable: true,
31
+ deletable
32
+ });
33
+ return NormalCompletion(undefined);
34
+ }
35
+ /**
36
+ * Create an immutable binding.
37
+ *
38
+ * @param name - The binding name.
39
+ * @param strict - For named function expressions, strict is false, otherwise it's true.
40
+ * @returns CompletionRecord.
41
+ */
42
+
43
+
44
+ CreateImmutableBinding(name, strict) {
45
+ // Assert: binding does not exist.
46
+ this.bindingMap.set(name, {
47
+ strict
48
+ });
49
+ return NormalCompletion(undefined);
50
+ }
51
+
52
+ InitializeBinding(name, value) {
53
+ var binding = this.bindingMap.get(name); // Assert: binding exists and uninitialized.
54
+
55
+ Object.assign(binding, {
56
+ initialized: true,
57
+ value
58
+ });
59
+ return NormalCompletion(undefined);
60
+ }
61
+ /**
62
+ * Update a mutable binding value, including function declarations.
63
+ *
64
+ * @param name - The binding name.
65
+ * @param value - The binding value.
66
+ * @param strict - For functions, strict is always false, otherwise it depends on strict-mode.
67
+ * @returns
68
+ */
69
+
70
+
71
+ SetMutableBinding(name, value, strict) {
72
+ var binding = this.bindingMap.get(name); // Assert: binding exists.
73
+
74
+ if (!binding.initialized) {
75
+ throw new ReferenceError("".concat(name, " is not initialized"));
76
+ } else if (binding.mutable) {
77
+ binding.value = value;
78
+ } else {
79
+ throw new TypeError("Assignment to constant variable");
80
+ }
81
+
82
+ return NormalCompletion(undefined);
83
+ }
84
+
85
+ GetBindingValue(name, strict) {
86
+ var binding = this.bindingMap.get(name); // Assert: binding exists.
87
+
88
+ if (!binding.initialized) {
89
+ throw new ReferenceError("".concat(name, " is not initialized"));
90
+ }
91
+
92
+ return binding.value;
93
+ }
94
+
95
+ }
96
+ export class DeclarativeEnvironment extends EnvironmentRecord {}
97
+ export class FunctionEnvironment extends EnvironmentRecord {}
98
+ export var FormalParameters = Symbol.for("FormalParameters");
99
+ export var ECMAScriptCode = Symbol.for("ECMAScriptCode");
100
+ export var Environment = Symbol.for("Environment");
101
+ export var IsConstructor = Symbol.for("IsConstructor");
102
+ // https://tc39.es/ecma262/#sec-reference-record-specification-type
103
+ export class ReferenceRecord {
104
+ /** Whether the reference is in strict mode. */
105
+ constructor(base, referenceName, strict) {
106
+ _defineProperty(this, "Base", void 0);
107
+
108
+ _defineProperty(this, "ReferenceName", void 0);
109
+
110
+ _defineProperty(this, "Strict", void 0);
111
+
112
+ this.Base = base;
113
+ this.ReferenceName = referenceName;
114
+ this.Strict = strict;
115
+ }
116
+
117
+ } // https://tc39.es/ecma262/#sec-completion-record-specification-type
118
+
119
+ export class CompletionRecord {
120
+ constructor(type, value) {
121
+ _defineProperty(this, "Type", void 0);
122
+
123
+ _defineProperty(this, "Value", void 0);
124
+
125
+ this.Type = type;
126
+ this.Value = value;
127
+ }
128
+
129
+ }
130
+ // https://tc39.es/ecma262/#sec-normalcompletion
131
+ export function NormalCompletion(value) {
132
+ return new CompletionRecord("normal", value);
133
+ }
134
+ export var Empty = Symbol("empty completion");
135
+ //# sourceMappingURL=ExecutionContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ExecutionContext.ts"],"names":["ExecutionContext","EnvironmentRecord","constructor","outer","Map","OuterEnv","HasBinding","name","bindingMap","has","CreateMutableBinding","deletable","set","mutable","NormalCompletion","undefined","CreateImmutableBinding","strict","InitializeBinding","value","binding","get","Object","assign","initialized","SetMutableBinding","ReferenceError","TypeError","GetBindingValue","DeclarativeEnvironment","FunctionEnvironment","FormalParameters","Symbol","for","ECMAScriptCode","Environment","IsConstructor","ReferenceRecord","base","referenceName","Base","ReferenceName","Strict","CompletionRecord","type","Type","Value","Empty"],"mappings":"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","sourcesContent":["import { Expression, FunctionDeclaration, Statement } from \"@babel/types\";\n\n// https://tc39.es/ecma262/#sec-execution-contexts\nexport class ExecutionContext {\n VariableEnvironment: EnvironmentRecord;\n LexicalEnvironment: EnvironmentRecord;\n Function: FunctionObject;\n}\n\nexport type EnvironmentRecordType = \"function\" | \"declarative\";\n\n// https://tc39.es/ecma262/#sec-environment-records\nexport class EnvironmentRecord {\n readonly OuterEnv: EnvironmentRecord;\n private readonly bindingMap = new Map<string, BindingState>();\n\n constructor(outer: EnvironmentRecord) {\n this.OuterEnv = outer;\n }\n\n HasBinding(name: string): boolean {\n return this.bindingMap.has(name);\n }\n\n CreateMutableBinding(name: string, deletable: boolean): CompletionRecord {\n // Assert: binding does not exist.\n this.bindingMap.set(name, {\n mutable: true,\n deletable,\n });\n return NormalCompletion(undefined);\n }\n\n /**\n * Create an immutable binding.\n *\n * @param name - The binding name.\n * @param strict - For named function expressions, strict is false, otherwise it's true.\n * @returns CompletionRecord.\n */\n CreateImmutableBinding(name: string, strict: boolean): CompletionRecord {\n // Assert: binding does not exist.\n this.bindingMap.set(name, {\n strict,\n });\n return NormalCompletion(undefined);\n }\n\n InitializeBinding(name: string, value: unknown): CompletionRecord {\n const binding = this.bindingMap.get(name);\n // Assert: binding exists and uninitialized.\n Object.assign<BindingState, Partial<BindingState>>(binding, {\n initialized: true,\n value,\n });\n return NormalCompletion(undefined);\n }\n\n /**\n * Update a mutable binding value, including function declarations.\n *\n * @param name - The binding name.\n * @param value - The binding value.\n * @param strict - For functions, strict is always false, otherwise it depends on strict-mode.\n * @returns\n */\n SetMutableBinding(\n name: string,\n value: unknown,\n strict: boolean\n ): CompletionRecord {\n const binding = this.bindingMap.get(name);\n // Assert: binding exists.\n if (!binding.initialized) {\n throw new ReferenceError(`${name} is not initialized`);\n } else if (binding.mutable) {\n binding.value = value;\n } else {\n throw new TypeError(`Assignment to constant variable`);\n }\n return NormalCompletion(undefined);\n }\n\n GetBindingValue(name: string, strict: boolean): unknown {\n const binding = this.bindingMap.get(name);\n // Assert: binding exists.\n if (!binding.initialized) {\n throw new ReferenceError(`${name} is not initialized`);\n }\n return binding.value;\n }\n}\n\nexport class DeclarativeEnvironment extends EnvironmentRecord {}\n\nexport class FunctionEnvironment extends EnvironmentRecord {}\n\nexport interface BindingState {\n initialized?: boolean;\n value?: unknown;\n mutable?: boolean;\n\n /** This is used for mutable bindings only. */\n deletable?: boolean;\n\n /**\n * This is used for immutable bindings only.\n * For named function expressions, `strict` is false,\n * otherwise it's true.\n */\n strict?: boolean;\n}\n\nexport const FormalParameters = Symbol.for(\"FormalParameters\");\nexport const ECMAScriptCode = Symbol.for(\"ECMAScriptCode\");\nexport const Environment = Symbol.for(\"Environment\");\nexport const IsConstructor = Symbol.for(\"IsConstructor\");\n\nexport interface FunctionObject {\n (...args: unknown[]): unknown;\n [FormalParameters]: FunctionDeclaration[\"params\"];\n [ECMAScriptCode]: Statement[] | Expression;\n [Environment]: EnvironmentRecord;\n [IsConstructor]: boolean;\n}\n\n// https://tc39.es/ecma262/#sec-reference-record-specification-type\nexport class ReferenceRecord {\n readonly Base?:\n | Record<PropertyKey, unknown>\n | EnvironmentRecord\n | \"unresolvable\";\n readonly ReferenceName?: PropertyKey;\n /** Whether the reference is in strict mode. */\n readonly Strict?: boolean;\n\n constructor(\n base: Record<PropertyKey, unknown> | EnvironmentRecord | \"unresolvable\",\n referenceName: PropertyKey,\n strict: boolean\n ) {\n this.Base = base;\n this.ReferenceName = referenceName;\n this.Strict = strict;\n }\n}\n\n// https://tc39.es/ecma262/#sec-completion-record-specification-type\nexport class CompletionRecord {\n readonly Type: CompletionRecordType;\n readonly Value: unknown;\n\n constructor(type: CompletionRecordType, value: unknown) {\n this.Type = type;\n this.Value = value;\n }\n}\n\nexport type CompletionRecordType =\n | \"normal\"\n | \"break\"\n | \"continue\"\n | \"return\"\n | \"throw\";\n\n// https://tc39.es/ecma262/#sec-normalcompletion\nexport function NormalCompletion(value: unknown): CompletionRecord {\n return new CompletionRecord(\"normal\", value);\n}\n\nexport const Empty = Symbol(\"empty completion\");\n\nexport interface OptionalChainRef {\n skipped?: boolean;\n}\n"],"file":"ExecutionContext.js"}
@@ -0,0 +1,221 @@
1
+ import { CompletionRecord, Empty, EnvironmentRecord, NormalCompletion, ReferenceRecord } from "./ExecutionContext";
2
+ import { collectBoundNames } from "./traverse"; // https://tc39.es/ecma262/#sec-ispropertyreference
3
+
4
+ export function IsPropertyReference(V) {
5
+ return V.Base !== "unresolvable" && !(V.Base instanceof EnvironmentRecord);
6
+ } // https://tc39.es/ecma262/#sec-initializereferencedbinding
7
+
8
+ export function InitializeReferencedBinding(V, W) {
9
+ var base = V.Base;
10
+ return base.InitializeBinding(V.ReferenceName, W);
11
+ } // https://tc39.es/ecma262/#sec-copydataproperties
12
+
13
+ export function CopyDataProperties(target, source, excludedItems) {
14
+ if (source === undefined || source === null) {
15
+ return target;
16
+ }
17
+
18
+ var keys = Object.getOwnPropertyNames(source).concat(Object.getOwnPropertySymbols(source));
19
+
20
+ for (var nextKey of keys) {
21
+ if (!excludedItems.has(nextKey)) {
22
+ var desc = Object.getOwnPropertyDescriptor(source, nextKey);
23
+
24
+ if (desc !== null && desc !== void 0 && desc.enumerable) {
25
+ target[nextKey] = source[nextKey];
26
+ }
27
+ }
28
+ }
29
+
30
+ return target;
31
+ } // https://tc39.es/ecma262/#sec-runtime-semantics-fordeclarationbindinginstantiation
32
+
33
+ export function ForDeclarationBindingInstantiation(forDeclaration, env) {
34
+ var isConst = forDeclaration.kind === "const";
35
+
36
+ for (var name of collectBoundNames(forDeclaration)) {
37
+ if (isConst) {
38
+ env.CreateImmutableBinding(name, true);
39
+ } else {
40
+ env.CreateMutableBinding(name, false);
41
+ }
42
+ }
43
+ } // https://tc39.es/ecma262/#sec-loopcontinues
44
+
45
+ export function LoopContinues(completion) {
46
+ return completion.Type === "normal" || completion.Type == "continue";
47
+ } // https://tc39.es/ecma262/#sec-updateempty
48
+
49
+ export function UpdateEmpty(completion, value) {
50
+ if (completion.Value !== Empty) {
51
+ return completion;
52
+ }
53
+
54
+ return new CompletionRecord(completion.Type, value);
55
+ } // https://tc39.es/ecma262/#sec-getvalue
56
+
57
+ export function GetValue(V) {
58
+ if (V instanceof CompletionRecord) {
59
+ // Assert: V.Type is normal.
60
+ V = V.Value;
61
+ }
62
+
63
+ if (!(V instanceof ReferenceRecord)) {
64
+ return V;
65
+ }
66
+
67
+ if (V.Base === "unresolvable") {
68
+ throw new ReferenceError("".concat(V.ReferenceName, " is not defined"));
69
+ }
70
+
71
+ if (V.Base instanceof EnvironmentRecord) {
72
+ var base = V.Base;
73
+ return base.GetBindingValue(V.ReferenceName, V.Strict);
74
+ }
75
+
76
+ return V.Base[V.ReferenceName];
77
+ } // https://tc39.es/ecma262/#sec-topropertykey
78
+
79
+ export function ToPropertyKey(arg) {
80
+ if (typeof arg === "symbol") {
81
+ return arg;
82
+ }
83
+
84
+ return String(arg);
85
+ } // https://tc39.es/ecma262/#sec-getv
86
+
87
+ export function GetV(V, P) {
88
+ return V[P];
89
+ } // https://tc39.es/ecma262/#sec-putvalue
90
+
91
+ export function PutValue(V, W) {
92
+ // Assert: V is a ReferenceRecord.
93
+ if (V.Base === "unresolvable") {
94
+ throw new ReferenceError("".concat(V.ReferenceName, " is not defined"));
95
+ }
96
+
97
+ if (V.Base instanceof EnvironmentRecord) {
98
+ return V.Base.SetMutableBinding(V.ReferenceName, W, V.Strict);
99
+ }
100
+
101
+ V.Base[V.ReferenceName] = W;
102
+ return NormalCompletion(undefined);
103
+ } // https://tc39.es/ecma262/#sec-createlistiteratorRecord
104
+
105
+ export function CreateListIteratorRecord(args) {
106
+ if (!isIterable(args)) {
107
+ throw new TypeError("".concat(typeof args, " is not iterable"));
108
+ }
109
+
110
+ return args[Symbol.iterator]();
111
+ } // https://tc39.es/ecma262/#sec-requireobjectcoercible
112
+
113
+ export function RequireObjectCoercible(arg) {
114
+ if (arg === null || arg === undefined) {
115
+ throw new TypeError("Cannot destructure properties of undefined or null");
116
+ }
117
+ } // https://tc39.es/ecma262/#sec-getidentifierreference
118
+
119
+ export function GetIdentifierReference(env, name, strict) {
120
+ if (!env) {
121
+ return new ReferenceRecord("unresolvable", name, strict);
122
+ }
123
+
124
+ if (env.HasBinding(name)) {
125
+ return new ReferenceRecord(env, name, strict);
126
+ }
127
+
128
+ return GetIdentifierReference(env.OuterEnv, name, strict);
129
+ } // https://tc39.es/ecma262/#sec-applystringornumericbinaryoperator
130
+
131
+ export function ApplyStringOrNumericBinaryOperator(leftValue, operator, rightValue) {
132
+ switch (operator) {
133
+ case "+":
134
+ return leftValue + rightValue;
135
+
136
+ case "-":
137
+ return leftValue - rightValue;
138
+
139
+ case "/":
140
+ return leftValue / rightValue;
141
+
142
+ case "%":
143
+ return leftValue % rightValue;
144
+
145
+ case "*":
146
+ return leftValue * rightValue;
147
+
148
+ case "**":
149
+ return leftValue ** rightValue;
150
+
151
+ case "==":
152
+ return leftValue == rightValue;
153
+
154
+ case "===":
155
+ return leftValue === rightValue;
156
+
157
+ case "!=":
158
+ return leftValue != rightValue;
159
+
160
+ case "!==":
161
+ return leftValue !== rightValue;
162
+
163
+ case ">":
164
+ return leftValue > rightValue;
165
+
166
+ case "<":
167
+ return leftValue < rightValue;
168
+
169
+ case ">=":
170
+ return leftValue >= rightValue;
171
+
172
+ case "<=":
173
+ return leftValue <= rightValue;
174
+ }
175
+
176
+ throw new SyntaxError("Unsupported binary operator `".concat(operator, "`"));
177
+ } // https://tc39.es/ecma262/#sec-assignment-operators
178
+
179
+ export function ApplyStringOrNumericAssignment(leftValue, operator, rightValue) {
180
+ switch (operator) {
181
+ case "+=":
182
+ case "-=":
183
+ case "*=":
184
+ case "/=":
185
+ case "%=":
186
+ case "**=":
187
+ return ApplyStringOrNumericBinaryOperator(leftValue, operator.substr(0, operator.length - 1), rightValue);
188
+ }
189
+
190
+ throw new SyntaxError("Unsupported assignment operator `".concat(operator, "`"));
191
+ } // https://tc39.es/ecma262/#sec-unary-operators
192
+
193
+ export function ApplyUnaryOperator(target, operator) {
194
+ switch (operator) {
195
+ case "!":
196
+ return !target;
197
+
198
+ case "+":
199
+ return +target;
200
+
201
+ case "-":
202
+ return -target;
203
+
204
+ case "void":
205
+ return undefined;
206
+ }
207
+
208
+ throw new SyntaxError("Unsupported unary operator `".concat(operator, "`"));
209
+ }
210
+ export function isIterable(cooked) {
211
+ if (Array.isArray(cooked)) {
212
+ return true;
213
+ }
214
+
215
+ if (cooked === null || cooked === undefined) {
216
+ return false;
217
+ }
218
+
219
+ return typeof cooked[Symbol.iterator] === "function";
220
+ }
221
+ //# sourceMappingURL=context-free.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/context-free.ts"],"names":["CompletionRecord","Empty","EnvironmentRecord","NormalCompletion","ReferenceRecord","collectBoundNames","IsPropertyReference","V","Base","InitializeReferencedBinding","W","base","InitializeBinding","ReferenceName","CopyDataProperties","target","source","excludedItems","undefined","keys","Object","getOwnPropertyNames","concat","getOwnPropertySymbols","nextKey","has","desc","getOwnPropertyDescriptor","enumerable","ForDeclarationBindingInstantiation","forDeclaration","env","isConst","kind","name","CreateImmutableBinding","CreateMutableBinding","LoopContinues","completion","Type","UpdateEmpty","value","Value","GetValue","ReferenceError","GetBindingValue","Strict","ToPropertyKey","arg","String","GetV","P","PutValue","SetMutableBinding","CreateListIteratorRecord","args","isIterable","TypeError","Symbol","iterator","RequireObjectCoercible","GetIdentifierReference","strict","HasBinding","OuterEnv","ApplyStringOrNumericBinaryOperator","leftValue","operator","rightValue","SyntaxError","ApplyStringOrNumericAssignment","substr","length","ApplyUnaryOperator","cooked","Array","isArray"],"mappings":"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","sourcesContent":["import {\n BinaryExpression,\n UnaryExpression,\n VariableDeclaration,\n} from \"@babel/types\";\nimport {\n CompletionRecord,\n Empty,\n EnvironmentRecord,\n NormalCompletion,\n ReferenceRecord,\n} from \"./ExecutionContext\";\nimport { collectBoundNames } from \"./traverse\";\n\n// https://tc39.es/ecma262/#sec-ispropertyreference\nexport function IsPropertyReference(V: ReferenceRecord): boolean {\n return V.Base !== \"unresolvable\" && !(V.Base instanceof EnvironmentRecord);\n}\n\n// https://tc39.es/ecma262/#sec-initializereferencedbinding\nexport function InitializeReferencedBinding(\n V: ReferenceRecord,\n W: unknown\n): CompletionRecord {\n const base = V.Base as EnvironmentRecord;\n return base.InitializeBinding(V.ReferenceName as string, W);\n}\n\n// https://tc39.es/ecma262/#sec-copydataproperties\nexport function CopyDataProperties(\n target: Record<PropertyKey, unknown>,\n source: unknown,\n excludedItems: Set<PropertyKey>\n): Record<PropertyKey, unknown> {\n if (source === undefined || source === null) {\n return target;\n }\n const keys = (Object.getOwnPropertyNames(source) as PropertyKey[]).concat(\n Object.getOwnPropertySymbols(source)\n );\n for (const nextKey of keys) {\n if (!excludedItems.has(nextKey)) {\n const desc = Object.getOwnPropertyDescriptor(source, nextKey);\n if (desc?.enumerable) {\n target[nextKey] = (source as Record<PropertyKey, unknown>)[nextKey];\n }\n }\n }\n return target;\n}\n\n// https://tc39.es/ecma262/#sec-runtime-semantics-fordeclarationbindinginstantiation\nexport function ForDeclarationBindingInstantiation(\n forDeclaration: VariableDeclaration,\n env: EnvironmentRecord\n): void {\n const isConst = forDeclaration.kind === \"const\";\n for (const name of collectBoundNames(forDeclaration)) {\n if (isConst) {\n env.CreateImmutableBinding(name, true);\n } else {\n env.CreateMutableBinding(name, false);\n }\n }\n}\n\n// https://tc39.es/ecma262/#sec-loopcontinues\nexport function LoopContinues(completion: CompletionRecord): boolean {\n return completion.Type === \"normal\" || completion.Type == \"continue\";\n}\n\n// https://tc39.es/ecma262/#sec-updateempty\nexport function UpdateEmpty(\n completion: CompletionRecord,\n value: unknown\n): CompletionRecord {\n if (completion.Value !== Empty) {\n return completion;\n }\n return new CompletionRecord(completion.Type, value);\n}\n\n// https://tc39.es/ecma262/#sec-getvalue\nexport function GetValue(V: unknown): unknown {\n if (V instanceof CompletionRecord) {\n // Assert: V.Type is normal.\n V = V.Value;\n }\n if (!(V instanceof ReferenceRecord)) {\n return V;\n }\n if (V.Base === \"unresolvable\") {\n throw new ReferenceError(`${V.ReferenceName as string} is not defined`);\n }\n if (V.Base instanceof EnvironmentRecord) {\n const base = V.Base as EnvironmentRecord;\n return base.GetBindingValue(V.ReferenceName as string, V.Strict);\n }\n return V.Base[V.ReferenceName];\n}\n\n// https://tc39.es/ecma262/#sec-topropertykey\nexport function ToPropertyKey(arg: unknown): string | symbol {\n if (typeof arg === \"symbol\") {\n return arg;\n }\n return String(arg);\n}\n\n// https://tc39.es/ecma262/#sec-getv\nexport function GetV(V: unknown, P: PropertyKey): unknown {\n return (V as Record<PropertyKey, unknown>)[P];\n}\n\n// https://tc39.es/ecma262/#sec-putvalue\nexport function PutValue(V: ReferenceRecord, W: unknown): CompletionRecord {\n // Assert: V is a ReferenceRecord.\n if (V.Base === \"unresolvable\") {\n throw new ReferenceError(`${V.ReferenceName as string} is not defined`);\n }\n if (V.Base instanceof EnvironmentRecord) {\n return V.Base.SetMutableBinding(V.ReferenceName as string, W, V.Strict);\n }\n V.Base[V.ReferenceName] = W;\n return NormalCompletion(undefined);\n}\n\n// https://tc39.es/ecma262/#sec-createlistiteratorRecord\nexport function CreateListIteratorRecord(\n args: Iterable<unknown>\n): Iterator<unknown> {\n if (!isIterable(args)) {\n throw new TypeError(`${typeof args} is not iterable`);\n }\n return args[Symbol.iterator]();\n}\n\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nexport function RequireObjectCoercible(arg: unknown): void {\n if (arg === null || arg === undefined) {\n throw new TypeError(\"Cannot destructure properties of undefined or null\");\n }\n}\n\n// https://tc39.es/ecma262/#sec-getidentifierreference\nexport function GetIdentifierReference(\n env: EnvironmentRecord,\n name: string,\n strict: boolean\n): ReferenceRecord {\n if (!env) {\n return new ReferenceRecord(\"unresolvable\", name, strict);\n }\n if (env.HasBinding(name)) {\n return new ReferenceRecord(env, name, strict);\n }\n return GetIdentifierReference(env.OuterEnv, name, strict);\n}\n\n// https://tc39.es/ecma262/#sec-applystringornumericbinaryoperator\nexport function ApplyStringOrNumericBinaryOperator(\n leftValue: number,\n operator: BinaryExpression[\"operator\"] | \"|>\",\n rightValue: number\n): unknown {\n switch (operator) {\n case \"+\":\n return leftValue + rightValue;\n case \"-\":\n return leftValue - rightValue;\n case \"/\":\n return leftValue / rightValue;\n case \"%\":\n return leftValue % rightValue;\n case \"*\":\n return leftValue * rightValue;\n case \"**\":\n return leftValue ** rightValue;\n case \"==\":\n return leftValue == rightValue;\n case \"===\":\n return leftValue === rightValue;\n case \"!=\":\n return leftValue != rightValue;\n case \"!==\":\n return leftValue !== rightValue;\n case \">\":\n return leftValue > rightValue;\n case \"<\":\n return leftValue < rightValue;\n case \">=\":\n return leftValue >= rightValue;\n case \"<=\":\n return leftValue <= rightValue;\n }\n throw new SyntaxError(`Unsupported binary operator \\`${operator}\\``);\n}\n\n// https://tc39.es/ecma262/#sec-assignment-operators\nexport function ApplyStringOrNumericAssignment(\n leftValue: string | number,\n operator: string,\n rightValue: string | number\n): unknown {\n switch (operator) {\n case \"+=\":\n case \"-=\":\n case \"*=\":\n case \"/=\":\n case \"%=\":\n case \"**=\":\n return ApplyStringOrNumericBinaryOperator(\n leftValue as number,\n operator.substr(0, operator.length - 1) as BinaryExpression[\"operator\"],\n rightValue as number\n );\n }\n\n throw new SyntaxError(`Unsupported assignment operator \\`${operator}\\``);\n}\n\n// https://tc39.es/ecma262/#sec-unary-operators\nexport function ApplyUnaryOperator(\n target: unknown,\n operator: UnaryExpression[\"operator\"]\n): unknown {\n switch (operator) {\n case \"!\":\n return !target;\n case \"+\":\n return +target;\n case \"-\":\n return -target;\n case \"void\":\n return undefined;\n }\n throw new SyntaxError(`Unsupported unary operator \\`${operator}\\``);\n}\n\nexport function isIterable(cooked: unknown): boolean {\n if (Array.isArray(cooked)) {\n return true;\n }\n if (cooked === null || cooked === undefined) {\n return false;\n }\n return typeof (cooked as Iterable<unknown>)[Symbol.iterator] === \"function\";\n}\n"],"file":"context-free.js"}