ast-types 0.10.2 → 0.11.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/def/babel-core.js CHANGED
@@ -187,7 +187,8 @@ module.exports = function (fork) {
187
187
  def("Property"),
188
188
  def("ObjectMethod"),
189
189
  def("ObjectProperty"),
190
- def("SpreadProperty")
190
+ def("SpreadProperty"),
191
+ def("SpreadElement")
191
192
  );
192
193
 
193
194
  // Split Property -> ObjectProperty and ObjectMethod
@@ -207,6 +208,9 @@ module.exports = function (fork) {
207
208
  .field("computed", Boolean, defaults["false"])
208
209
  .field("generator", Boolean, defaults["false"])
209
210
  .field("async", Boolean, defaults["false"])
211
+ .field("accessibility", // TypeScript
212
+ or(def("Literal"), null),
213
+ defaults["null"])
210
214
  .field("decorators",
211
215
  or([def("Decorator")], null),
212
216
  defaults["null"]);
@@ -216,6 +220,9 @@ module.exports = function (fork) {
216
220
  .build("key", "value")
217
221
  .field("key", or(def("Literal"), def("Identifier"), def("Expression")))
218
222
  .field("value", or(def("Expression"), def("Pattern")))
223
+ .field("accessibility", // TypeScript
224
+ or(def("Literal"), null),
225
+ defaults["null"])
219
226
  .field("computed", Boolean, defaults["false"]);
220
227
 
221
228
  var ClassBodyElement = or(
package/def/core.js CHANGED
@@ -131,7 +131,8 @@ module.exports = function (fork) {
131
131
  def("CatchClause")
132
132
  .bases("Node")
133
133
  .build("param", "guard", "body")
134
- .field("param", def("Pattern"))
134
+ // https://github.com/tc39/proposal-optional-catch-binding
135
+ .field("param", or(def("Pattern"), null), defaults["null"])
135
136
  .field("guard", or(def("Expression"), null), defaults["null"])
136
137
  .field("body", def("BlockStatement"));
137
138
 
@@ -237,7 +238,7 @@ module.exports = function (fork) {
237
238
  "==", "!=", "===", "!==",
238
239
  "<", "<=", ">", ">=",
239
240
  "<<", ">>", ">>>",
240
- "+", "-", "*", "/", "%",
241
+ "+", "-", "*", "/", "%", "**",
241
242
  "&", // TODO Missing from the Parser API.
242
243
  "|", "^", "in",
243
244
  "instanceof", "..");
@@ -329,7 +330,8 @@ module.exports = function (fork) {
329
330
  // But aren't Expressions and Patterns already Nodes? TODO Report this.
330
331
  .bases("Node", "Expression", "Pattern")
331
332
  .build("name")
332
- .field("name", String);
333
+ .field("name", String)
334
+ .field("optional", Boolean, defaults["false"]);
333
335
 
334
336
  def("Literal")
335
337
  // But aren't Expressions already Nodes? TODO Report this.
@@ -367,4 +369,4 @@ module.exports = function (fork) {
367
369
  // e.g. { /*dangling*/ }.
368
370
  .field("leading", Boolean, defaults["true"])
369
371
  .field("trailing", Boolean, defaults["false"]);
370
- };
372
+ };
package/def/es6.js CHANGED
@@ -16,7 +16,9 @@ module.exports = function (fork) {
16
16
  def("RestElement")
17
17
  .bases("Pattern")
18
18
  .build("argument")
19
- .field("argument", def("Pattern"));
19
+ .field("argument", def("Pattern"))
20
+ .field("typeAnnotation", // for Babylon. Flow parser puts it on the identifier
21
+ or(def("TypeAnnotation"), def("TSTypeAnnotation"), null), defaults["null"]);
20
22
 
21
23
  def("SpreadElementPattern")
22
24
  .bases("Pattern")
@@ -107,7 +109,7 @@ module.exports = function (fork) {
107
109
  .bases("Declaration")
108
110
  .build("kind", "key", "value", "static")
109
111
  .field("kind", or("constructor", "method", "get", "set"))
110
- .field("key", or(def("Literal"), def("Identifier"), def("Expression")))
112
+ .field("key", def("Expression"))
111
113
  .field("value", def("Function"))
112
114
  .field("computed", Boolean, defaults["false"])
113
115
  .field("static", Boolean, defaults["false"]);
@@ -179,13 +181,6 @@ module.exports = function (fork) {
179
181
  .build("id", "body", "superClass")
180
182
  .field("id", or(def("Identifier"), null), defaults["null"])
181
183
  .field("body", def("ClassBody"))
182
- .field("superClass", or(def("Expression"), null), defaults["null"])
183
- .field("implements", [def("ClassImplements")], defaults.emptyArray);
184
-
185
- def("ClassImplements")
186
- .bases("Node")
187
- .build("id")
188
- .field("id", def("Identifier"))
189
184
  .field("superClass", or(def("Expression"), null), defaults["null"]);
190
185
 
191
186
  // Specifier and ModuleSpecifier are abstract non-standard types
@@ -208,6 +203,38 @@ module.exports = function (fork) {
208
203
  .field("id", or(def("Identifier"), null), defaults["null"])
209
204
  .field("name", or(def("Identifier"), null), defaults["null"]);
210
205
 
206
+ // Like ModuleSpecifier, except type:"ImportSpecifier" and buildable.
207
+ // import {<id [as name]>} from ...;
208
+ def("ImportSpecifier")
209
+ .bases("ModuleSpecifier")
210
+ .build("id", "name");
211
+
212
+ // import <* as id> from ...;
213
+ def("ImportNamespaceSpecifier")
214
+ .bases("ModuleSpecifier")
215
+ .build("id");
216
+
217
+ // import <id> from ...;
218
+ def("ImportDefaultSpecifier")
219
+ .bases("ModuleSpecifier")
220
+ .build("id");
221
+
222
+ def("ImportDeclaration")
223
+ .bases("Declaration")
224
+ .build("specifiers", "source", "importKind")
225
+ .field("specifiers", [or(
226
+ def("ImportSpecifier"),
227
+ def("ImportNamespaceSpecifier"),
228
+ def("ImportDefaultSpecifier")
229
+ )], defaults.emptyArray)
230
+ .field("source", def("Literal"))
231
+ .field("importKind", or(
232
+ "value",
233
+ "type"
234
+ ), function() {
235
+ return "value";
236
+ });
237
+
211
238
  def("TaggedTemplateExpression")
212
239
  .bases("Expression")
213
240
  .build("tag", "quasi")
package/def/es7.js CHANGED
@@ -1,38 +1,42 @@
1
1
  module.exports = function (fork) {
2
- fork.use(require('./es6'));
2
+ fork.use(require('./es6'));
3
3
 
4
- var types = fork.use(require("../lib/types"));
5
- var def = types.Type.def;
6
- var or = types.Type.or;
7
- var builtin = types.builtInTypes;
8
- var defaults = fork.use(require("../lib/shared")).defaults;
4
+ var types = fork.use(require("../lib/types"));
5
+ var def = types.Type.def;
6
+ var or = types.Type.or;
7
+ var builtin = types.builtInTypes;
8
+ var defaults = fork.use(require("../lib/shared")).defaults;
9
9
 
10
- def("Function")
11
- .field("async", Boolean, defaults["false"]);
10
+ def("Function")
11
+ .field("async", Boolean, defaults["false"]);
12
12
 
13
- def("SpreadProperty")
14
- .bases("Node")
15
- .build("argument")
16
- .field("argument", def("Expression"));
13
+ def("SpreadProperty")
14
+ .bases("Node")
15
+ .build("argument")
16
+ .field("argument", def("Expression"));
17
17
 
18
- def("ObjectExpression")
19
- .field("properties", [or(def("Property"), def("SpreadProperty"))]);
18
+ def("ObjectExpression")
19
+ .field("properties", [or(
20
+ def("Property"),
21
+ def("SpreadProperty"),
22
+ def("SpreadElement")
23
+ )]);
20
24
 
21
- def("SpreadPropertyPattern")
22
- .bases("Pattern")
23
- .build("argument")
24
- .field("argument", def("Pattern"));
25
+ def("SpreadPropertyPattern")
26
+ .bases("Pattern")
27
+ .build("argument")
28
+ .field("argument", def("Pattern"));
25
29
 
26
- def("ObjectPattern")
27
- .field("properties", [or(
28
- def("Property"),
29
- def("PropertyPattern"),
30
- def("SpreadPropertyPattern")
31
- )]);
30
+ def("ObjectPattern")
31
+ .field("properties", [or(
32
+ def("Property"),
33
+ def("PropertyPattern"),
34
+ def("SpreadPropertyPattern")
35
+ )]);
32
36
 
33
- def("AwaitExpression")
34
- .bases("Expression")
35
- .build("argument", "all")
36
- .field("argument", or(def("Expression"), null))
37
- .field("all", Boolean, defaults["false"]);
38
- };
37
+ def("AwaitExpression")
38
+ .bases("Expression")
39
+ .build("argument", "all")
40
+ .field("argument", or(def("Expression"), null))
41
+ .field("all", Boolean, defaults["false"]);
42
+ };
package/def/esprima.js CHANGED
@@ -1,104 +1,72 @@
1
1
  module.exports = function (fork) {
2
- fork.use(require("./es7"));
2
+ fork.use(require("./es7"));
3
3
 
4
- var types = fork.use(require("../lib/types"));
5
- var defaults = fork.use(require("../lib/shared")).defaults;
6
- var def = types.Type.def;
7
- var or = types.Type.or;
4
+ var types = fork.use(require("../lib/types"));
5
+ var defaults = fork.use(require("../lib/shared")).defaults;
6
+ var def = types.Type.def;
7
+ var or = types.Type.or;
8
8
 
9
- def("VariableDeclaration")
10
- .field("declarations", [or(
11
- def("VariableDeclarator"),
12
- def("Identifier") // Esprima deviation.
13
- )]);
9
+ def("VariableDeclaration")
10
+ .field("declarations", [or(
11
+ def("VariableDeclarator"),
12
+ def("Identifier") // Esprima deviation.
13
+ )]);
14
14
 
15
- def("Property")
16
- .field("value", or(
17
- def("Expression"),
18
- def("Pattern") // Esprima deviation.
19
- ));
15
+ def("Property")
16
+ .field("value", or(
17
+ def("Expression"),
18
+ def("Pattern") // Esprima deviation.
19
+ ));
20
20
 
21
- def("ArrayPattern")
22
- .field("elements", [or(
23
- def("Pattern"),
24
- def("SpreadElement"),
25
- null
26
- )]);
21
+ def("ArrayPattern")
22
+ .field("elements", [or(
23
+ def("Pattern"),
24
+ def("SpreadElement"),
25
+ null
26
+ )]);
27
27
 
28
- def("ObjectPattern")
29
- .field("properties", [or(
30
- def("Property"),
31
- def("PropertyPattern"),
32
- def("SpreadPropertyPattern"),
33
- def("SpreadProperty") // Used by Esprima.
34
- )]);
28
+ def("ObjectPattern")
29
+ .field("properties", [or(
30
+ def("Property"),
31
+ def("PropertyPattern"),
32
+ def("SpreadPropertyPattern"),
33
+ def("SpreadProperty") // Used by Esprima.
34
+ )]);
35
35
 
36
- // Like ModuleSpecifier, except type:"ExportSpecifier" and buildable.
37
- // export {<id [as name]>} [from ...];
38
- def("ExportSpecifier")
39
- .bases("ModuleSpecifier")
40
- .build("id", "name");
36
+ // Like ModuleSpecifier, except type:"ExportSpecifier" and buildable.
37
+ // export {<id [as name]>} [from ...];
38
+ def("ExportSpecifier")
39
+ .bases("ModuleSpecifier")
40
+ .build("id", "name");
41
41
 
42
- // export <*> from ...;
43
- def("ExportBatchSpecifier")
44
- .bases("Specifier")
45
- .build();
42
+ // export <*> from ...;
43
+ def("ExportBatchSpecifier")
44
+ .bases("Specifier")
45
+ .build();
46
46
 
47
- // Like ModuleSpecifier, except type:"ImportSpecifier" and buildable.
48
- // import {<id [as name]>} from ...;
49
- def("ImportSpecifier")
50
- .bases("ModuleSpecifier")
51
- .build("id", "name");
47
+ def("ExportDeclaration")
48
+ .bases("Declaration")
49
+ .build("default", "declaration", "specifiers", "source")
50
+ .field("default", Boolean)
51
+ .field("declaration", or(
52
+ def("Declaration"),
53
+ def("Expression"), // Implies default.
54
+ null
55
+ ))
56
+ .field("specifiers", [or(
57
+ def("ExportSpecifier"),
58
+ def("ExportBatchSpecifier")
59
+ )], defaults.emptyArray)
60
+ .field("source", or(
61
+ def("Literal"),
62
+ null
63
+ ), defaults["null"]);
52
64
 
53
- // import <* as id> from ...;
54
- def("ImportNamespaceSpecifier")
55
- .bases("ModuleSpecifier")
56
- .build("id");
65
+ def("Block")
66
+ .bases("Comment")
67
+ .build("value", /*optional:*/ "leading", "trailing");
57
68
 
58
- // import <id> from ...;
59
- def("ImportDefaultSpecifier")
60
- .bases("ModuleSpecifier")
61
- .build("id");
62
-
63
- def("ExportDeclaration")
64
- .bases("Declaration")
65
- .build("default", "declaration", "specifiers", "source")
66
- .field("default", Boolean)
67
- .field("declaration", or(
68
- def("Declaration"),
69
- def("Expression"), // Implies default.
70
- null
71
- ))
72
- .field("specifiers", [or(
73
- def("ExportSpecifier"),
74
- def("ExportBatchSpecifier")
75
- )], defaults.emptyArray)
76
- .field("source", or(
77
- def("Literal"),
78
- null
79
- ), defaults["null"]);
80
-
81
- def("ImportDeclaration")
82
- .bases("Declaration")
83
- .build("specifiers", "source", "importKind")
84
- .field("specifiers", [or(
85
- def("ImportSpecifier"),
86
- def("ImportNamespaceSpecifier"),
87
- def("ImportDefaultSpecifier")
88
- )], defaults.emptyArray)
89
- .field("source", def("Literal"))
90
- .field("importKind", or(
91
- "value",
92
- "type"
93
- ), function() {
94
- return "value";
95
- });
96
-
97
- def("Block")
98
- .bases("Comment")
99
- .build("value", /*optional:*/ "leading", "trailing");
100
-
101
- def("Line")
102
- .bases("Comment")
103
- .build("value", /*optional:*/ "leading", "trailing");
104
- };
69
+ def("Line")
70
+ .bases("Comment")
71
+ .build("value", /*optional:*/ "leading", "trailing");
72
+ };
package/def/flow.js CHANGED
@@ -242,11 +242,34 @@ module.exports = function (fork) {
242
242
  .field("static", Boolean, defaults["false"])
243
243
  .field("variance", LegacyVariance, defaults["null"]);
244
244
 
245
+ ["ClassDeclaration",
246
+ "ClassExpression",
247
+ ].forEach(typeName => {
248
+ def(typeName)
249
+ .field("typeParameters",
250
+ or(def("TypeParameterDeclaration"), null),
251
+ defaults["null"])
252
+ .field("superTypeParameters",
253
+ or([def("GenericTypeAnnotation")], null),
254
+ defaults["null"]);
255
+ });
256
+
245
257
  def("ClassImplements")
258
+ .bases("Node")
259
+ .build("id")
260
+ .field("id", def("Identifier"))
261
+ .field("superClass", or(def("Expression"), null), defaults["null"])
246
262
  .field("typeParameters",
247
263
  or(def("TypeParameterInstantiation"), null),
248
264
  defaults["null"]);
249
265
 
266
+ ["ClassDeclaration",
267
+ "ClassExpression",
268
+ ].forEach(typeName => {
269
+ def(typeName)
270
+ .field("implements", [def("ClassImplements")], defaults.emptyArray);
271
+ });
272
+
250
273
  def("InterfaceDeclaration")
251
274
  .bases("Declaration")
252
275
  .build("id", "body", "extends")
@@ -0,0 +1,445 @@
1
+ module.exports = function (fork) {
2
+ // Since TypeScript is parsed by Babylon, include the core Babylon types
3
+ // but omit the Flow-related types.
4
+ fork.use(require("./babel-core"));
5
+
6
+ var types = fork.use(require("../lib/types"));
7
+ var n = types.namedTypes;
8
+ var def = types.Type.def;
9
+ var or = types.Type.or;
10
+ var defaults = fork.use(require("../lib/shared")).defaults;
11
+ var StringLiteral = new types.Type(function (value, deep) {
12
+ if (n.StringLiteral &&
13
+ n.StringLiteral.check(value, deep)) {
14
+ return true
15
+ }
16
+ if (n.Literal &&
17
+ n.Literal.check(value, deep) &&
18
+ typeof value.value === "string") {
19
+ return true;
20
+ }
21
+ return false;
22
+ }, "StringLiteral");
23
+
24
+ def("TSType")
25
+ .bases("Node");
26
+
27
+ var IdOrQualifiedName = or(
28
+ def("Identifier"),
29
+ def("TSQualifiedName")
30
+ );
31
+
32
+ def("TSTypeReference")
33
+ .bases("TSType")
34
+ .field("typeName", IdOrQualifiedName)
35
+ .field("typeParameters",
36
+ or(def("TSTypeParameterInstantiation"), null),
37
+ defaults["null"]);
38
+
39
+ // An abstract (non-buildable) base type that provide a commonly-needed
40
+ // optional .typeParameters field.
41
+ def("TSHasOptionalTypeParameters")
42
+ .field("typeParameters",
43
+ or(def("TSTypeParameterDeclaration"), null),
44
+ defaults["null"]);
45
+
46
+ // An abstract (non-buildable) base type that provide a commonly-needed
47
+ // optional .typeAnnotation field.
48
+ def("TSHasOptionalTypeAnnotation")
49
+ .field("typeAnnotation",
50
+ or(def("TSTypeAnnotation"), null),
51
+ defaults["null"]);
52
+
53
+ def("TSQualifiedName")
54
+ .bases("Node")
55
+ .build("left", "right")
56
+ .field("left", IdOrQualifiedName)
57
+ .field("right", IdOrQualifiedName);
58
+
59
+ def("TSAsExpression")
60
+ .bases("Expression")
61
+ .build("expression")
62
+ .field("expression", def("Expression"))
63
+ .field("typeAnnotation", def("TSType"))
64
+ .field("extra",
65
+ or({ parenthesized: Boolean }, null),
66
+ defaults["null"]);
67
+
68
+ def("TSNonNullExpression")
69
+ .bases("Expression")
70
+ .build("expression")
71
+ .field("expression", def("Expression"));
72
+
73
+ [ // Define all the simple keyword types.
74
+ "TSAnyKeyword",
75
+ "TSBooleanKeyword",
76
+ "TSNeverKeyword",
77
+ "TSNullKeyword",
78
+ "TSNumberKeyword",
79
+ "TSObjectKeyword",
80
+ "TSStringKeyword",
81
+ "TSSymbolKeyword",
82
+ "TSUndefinedKeyword",
83
+ "TSVoidKeyword",
84
+ "TSThisType",
85
+ ].forEach(keywordType => {
86
+ def(keywordType)
87
+ .bases("TSType")
88
+ .build();
89
+ });
90
+
91
+ def("TSArrayType")
92
+ .bases("TSType")
93
+ .build("elementType")
94
+ .field("elementType", def("TSType"))
95
+
96
+ def("TSLiteralType")
97
+ .bases("TSType")
98
+ .build("literal")
99
+ .field("literal",
100
+ or(def("NumericLiteral"),
101
+ def("StringLiteral"),
102
+ def("BooleanLiteral")));
103
+
104
+ ["TSUnionType",
105
+ "TSIntersectionType",
106
+ ].forEach(typeName => {
107
+ def(typeName)
108
+ .bases("TSType")
109
+ .build("types")
110
+ .field("types", [def("TSType")]);
111
+ });
112
+
113
+ def("TSConditionalType")
114
+ .bases("TSType")
115
+ .build("checkType", "extendsType", "trueType", "falseType")
116
+ .field("checkType", def("TSType"))
117
+ .field("extendsType", def("TSType"))
118
+ .field("trueType", def("TSType"))
119
+ .field("falseType", def("TSType"));
120
+
121
+ def("TSInferType")
122
+ .bases("TSType")
123
+ .build("typeParameter")
124
+ .field("typeParameter", def("TSType"));
125
+
126
+ def("TSParenthesizedType")
127
+ .bases("TSType")
128
+ .build("typeAnnotation")
129
+ .field("typeAnnotation", def("TSType"));
130
+
131
+ var ParametersType = [or(
132
+ def("Identifier"),
133
+ def("RestElement")
134
+ )];
135
+
136
+ ["TSFunctionType",
137
+ "TSConstructorType",
138
+ ].forEach(typeName => {
139
+ def(typeName)
140
+ .bases("TSType",
141
+ "TSHasOptionalTypeParameters",
142
+ "TSHasOptionalTypeAnnotation")
143
+ .build("parameters")
144
+ .field("parameters", ParametersType);
145
+ });
146
+
147
+ def("TSDeclareFunction")
148
+ .bases("Declaration", "TSHasOptionalTypeParameters")
149
+ .build("id", "params", "returnType")
150
+ .field("declare", Boolean, defaults["false"])
151
+ .field("async", Boolean, defaults["false"])
152
+ .field("generator", Boolean, defaults["false"])
153
+ .field("id", or(def("Identifier"), null), defaults["null"])
154
+ .field("params", [def("Pattern")])
155
+ // tSFunctionTypeAnnotationCommon
156
+ .field("returnType",
157
+ or(def("TSTypeAnnotation"),
158
+ def("Noop"), // Still used?
159
+ null),
160
+ defaults["null"]);
161
+
162
+ def("TSDeclareMethod")
163
+ .bases("Declaration", "TSHasOptionalTypeParameters")
164
+ .build("key", "params", "returnType")
165
+ .field("async", Boolean, defaults["false"])
166
+ .field("generator", Boolean, defaults["false"])
167
+ .field("params", [def("Pattern")])
168
+ // classMethodOrPropertyCommon
169
+ .field("abstract", Boolean, defaults["false"])
170
+ .field("accessibility",
171
+ or("public", "private", "protected", void 0),
172
+ defaults["undefined"])
173
+ .field("static", Boolean, defaults["false"])
174
+ .field("computed", Boolean, defaults["false"])
175
+ .field("optional", Boolean, defaults["false"])
176
+ .field("key", or(
177
+ def("Identifier"),
178
+ def("StringLiteral"),
179
+ def("NumericLiteral"),
180
+ // Only allowed if .computed is true.
181
+ def("Expression")
182
+ ))
183
+ // classMethodOrDeclareMethodCommon
184
+ .field("kind",
185
+ or("get", "set", "method", "constructor"),
186
+ function getDefault() { return "method"; })
187
+ .field("access", // Not "accessibility"?
188
+ or("public", "private", "protected", void 0),
189
+ defaults["undefined"])
190
+ .field("decorators",
191
+ or([def("Decorator")], null),
192
+ defaults["null"])
193
+ // tSFunctionTypeAnnotationCommon
194
+ .field("returnType",
195
+ or(def("TSTypeAnnotation"),
196
+ def("Noop"), // Still used?
197
+ null),
198
+ defaults["null"]);
199
+
200
+ def("TSMappedType")
201
+ .bases("TSType")
202
+ .build("typeParameter", "typeAnnotation")
203
+ .field("readonly", Boolean, defaults["false"])
204
+ .field("typeParameter", def("TSTypeParameter"))
205
+ .field("optional", Boolean, defaults["false"])
206
+ .field("typeAnnotation",
207
+ or(def("TSType"), null),
208
+ defaults["null"]);
209
+
210
+ def("TSTupleType")
211
+ .bases("TSType")
212
+ .build("elementTypes")
213
+ .field("elementTypes", [def("TSType")]);
214
+
215
+ def("TSIndexedAccessType")
216
+ .bases("TSType")
217
+ .build("objectType", "indexType")
218
+ .field("objectType", def("TSType"))
219
+ .field("indexType", def("TSType"))
220
+
221
+ def("TSTypeOperator")
222
+ .bases("TSType")
223
+ .build("operator")
224
+ .field("operator", String)
225
+ .field("typeAnnotation", def("TSType"));
226
+
227
+ def("TSTypeAnnotation")
228
+ .bases("Node")
229
+ .build("typeAnnotation")
230
+ .field("typeAnnotation",
231
+ or(def("TSType"),
232
+ def("TSTypeAnnotation")));
233
+
234
+ def("TSIndexSignature")
235
+ .bases("Declaration", "TSHasOptionalTypeAnnotation")
236
+ .build("parameters")
237
+ .field("parameters", [def("Identifier")]) // Length === 1
238
+ .field("readonly", Boolean, defaults["false"]);
239
+
240
+ def("TSPropertySignature")
241
+ .bases("Declaration", "TSHasOptionalTypeAnnotation")
242
+ .build("key")
243
+ .field("key", def("Expression"))
244
+ .field("computed", Boolean, defaults["false"])
245
+ .field("readonly", Boolean, defaults["false"])
246
+ .field("optional", Boolean, defaults["false"])
247
+ .field("initializer",
248
+ or(def("Expression"), null),
249
+ defaults["null"]);
250
+
251
+ def("TSMethodSignature")
252
+ .bases("Declaration",
253
+ "TSHasOptionalTypeParameters",
254
+ "TSHasOptionalTypeAnnotation")
255
+ .build("key")
256
+ .field("key", def("Expression"))
257
+ .field("computed", Boolean, defaults["false"])
258
+ .field("optional", Boolean, defaults["false"])
259
+ .field("parameters", ParametersType);
260
+
261
+ def("TSTypePredicate")
262
+ .bases("TSTypeAnnotation")
263
+ .build("parameterName", "typeAnnotation")
264
+ .field("parameterName",
265
+ or(def("Identifier"),
266
+ def("TSThisType")))
267
+ .field("typeAnnotation", def("TSTypeAnnotation"));
268
+
269
+ ["TSCallSignatureDeclaration",
270
+ "TSConstructSignatureDeclaration",
271
+ ].forEach(typeName => {
272
+ def(typeName)
273
+ .bases("Declaration",
274
+ "TSHasOptionalTypeParameters",
275
+ "TSHasOptionalTypeAnnotation")
276
+ .build("parameters")
277
+ .field("parameters", ParametersType);
278
+ });
279
+
280
+ def("TSEnumMember")
281
+ .bases("Node")
282
+ .build("id", "initializer")
283
+ .field("id", or(def("Identifier"), StringLiteral))
284
+ .field("initializer",
285
+ or(def("Expression"), null),
286
+ defaults["null"]);
287
+
288
+ def("TSTypeQuery")
289
+ .bases("TSType")
290
+ .build("exprName")
291
+ .field("exprName", def("Identifier"));
292
+
293
+ // Inferred from Babylon's tsParseTypeMember method.
294
+ var TSTypeMember = or(
295
+ def("TSCallSignatureDeclaration"),
296
+ def("TSConstructSignatureDeclaration"),
297
+ def("TSIndexSignature"),
298
+ def("TSMethodSignature"),
299
+ def("TSPropertySignature")
300
+ );
301
+
302
+ def("TSTypeLiteral")
303
+ .bases("TSType")
304
+ .build("members")
305
+ .field("members", [TSTypeMember]);
306
+
307
+ def("TSTypeParameter")
308
+ .bases("Identifier")
309
+ .field("name", String)
310
+ .field("constraint", or(def("TSType"), null), defaults["null"])
311
+ .field("default", or(def("TSType"), null), defaults["null"]);
312
+
313
+ def("TSTypeAssertion")
314
+ .bases("Expression")
315
+ .build("typeAnnotation", "expression")
316
+ .field("typeAnnotation", def("TSType"))
317
+ .field("expression", def("Expression"))
318
+ .field("extra",
319
+ or({ parenthesized: Boolean }, null),
320
+ defaults["null"]);
321
+
322
+ def("TSTypeParameterDeclaration")
323
+ .bases("Declaration")
324
+ .build("params")
325
+ .field("params", [def("TSTypeParameter")]);
326
+
327
+ def("TSTypeParameterInstantiation")
328
+ .bases("Node")
329
+ .build("params")
330
+ .field("params", [def("TSType")]);
331
+
332
+ def("TSEnumDeclaration")
333
+ .bases("Declaration")
334
+ .build("id", "members")
335
+ .field("id", def("Identifier"))
336
+ .field("const", Boolean, defaults["false"])
337
+ .field("declare", Boolean, defaults["false"])
338
+ .field("members", [def("TSEnumMember")])
339
+ .field("initializer",
340
+ or(def("Expression"), null),
341
+ defaults["null"]);
342
+
343
+ def("TSTypeAliasDeclaration")
344
+ .bases("Declaration", "TSHasOptionalTypeParameters")
345
+ .build("id")
346
+ .field("id", def("Identifier"))
347
+ .field("declare", Boolean, defaults["false"])
348
+ .field("typeAnnotation", def("TSType"));
349
+
350
+ def("TSModuleBlock")
351
+ .bases("Node")
352
+ .build("body")
353
+ .field("body", [def("Statement")]);
354
+
355
+ def("TSModuleDeclaration")
356
+ .bases("Declaration")
357
+ .build("id", "body")
358
+ .field("id", or(StringLiteral, IdOrQualifiedName))
359
+ .field("declare", Boolean, defaults["false"])
360
+ .field("global", Boolean, defaults["false"])
361
+ .field("body",
362
+ or(def("TSModuleBlock"),
363
+ def("TSModuleDeclaration"),
364
+ null),
365
+ defaults["null"]);
366
+
367
+ def("TSImportEqualsDeclaration")
368
+ .bases("Declaration")
369
+ .build("id", "moduleReference")
370
+ .field("id", def("Identifier"))
371
+ .field("isExport", Boolean, defaults["false"])
372
+ .field("moduleReference",
373
+ or(IdOrQualifiedName,
374
+ def("TSExternalModuleReference")));
375
+
376
+ def("TSExternalModuleReference")
377
+ .bases("Declaration")
378
+ .build("expression")
379
+ .field("expression", StringLiteral);
380
+
381
+ def("TSExportAssignment")
382
+ .bases("Statement")
383
+ .build("expression")
384
+ .field("expression", def("Expression"));
385
+
386
+ def("TSNamespaceExportDeclaration")
387
+ .bases("Declaration")
388
+ .build("id")
389
+ .field("id", def("Identifier"));
390
+
391
+ def("TSInterfaceBody")
392
+ .bases("Node")
393
+ .build("body")
394
+ .field("body", [TSTypeMember]);
395
+
396
+ def("TSExpressionWithTypeArguments")
397
+ .bases("TSType")
398
+ .build("expression", "typeParameters")
399
+ .field("expression", IdOrQualifiedName)
400
+ .field("typeParameters",
401
+ or(def("TSTypeParameterInstantiation"), null),
402
+ defaults["null"]);
403
+
404
+ def("TSInterfaceDeclaration")
405
+ .bases("Declaration", "TSHasOptionalTypeParameters")
406
+ .build("id", "body")
407
+ .field("id", IdOrQualifiedName)
408
+ .field("declare", Boolean, defaults["false"])
409
+ .field("extends",
410
+ or([def("TSExpressionWithTypeArguments")], null),
411
+ defaults["null"])
412
+ .field("body", def("TSInterfaceBody"));
413
+
414
+ ["ClassDeclaration",
415
+ "ClassExpression",
416
+ ].forEach(typeName => {
417
+ def(typeName)
418
+ .field("implements",
419
+ [def("TSExpressionWithTypeArguments")],
420
+ defaults.emptyArray);
421
+ });
422
+
423
+ def("TSParameterProperty")
424
+ .bases("Pattern")
425
+ .build("parameter")
426
+ .field("accessibility",
427
+ or("public", "private", "protected", void 0),
428
+ defaults["undefined"])
429
+ .field("readonly", Boolean, defaults["false"])
430
+ .field("parameter", or(def("Identifier"),
431
+ def("AssignmentPattern")));
432
+
433
+ // Defined already in es6 and babel-core.
434
+ def("ClassBody")
435
+ .field("body", [or(
436
+ def("MethodDefinition"),
437
+ def("VariableDeclarator"),
438
+ def("ClassPropertyDefinition"),
439
+ def("ClassProperty"),
440
+ def("ClassMethod"),
441
+ // Just need to add these types:
442
+ def("TSDeclareMethod"),
443
+ TSTypeMember
444
+ )]);
445
+ };
package/lib/types.js CHANGED
@@ -533,77 +533,115 @@ module.exports = function () {
533
533
  // Override Dp.buildable for this Def instance.
534
534
  Object.defineProperty(self, "buildable", {value: true});
535
535
 
536
- Object.defineProperty(builders, getBuilderName(self.typeName), {
537
- enumerable: true,
536
+ function addParam(built, param, arg, isArgAvailable) {
537
+ if (hasOwn.call(built, param))
538
+ return;
538
539
 
539
- value: function () {
540
- var args = arguments;
541
- var argc = args.length;
542
- var built = Object.create(nodePrototype);
540
+ var all = self.allFields;
541
+ if (!hasOwn.call(all, param)) {
542
+ throw new Error("" + param);
543
+ }
543
544
 
544
- if (!self.finalized) {
545
- throw new Error(
546
- "attempting to instantiate unfinalized type " +
547
- self.typeName
548
- );
549
- }
545
+ var field = all[param];
546
+ var type = field.type;
547
+ var value;
548
+
549
+ if (isArgAvailable) {
550
+ value = arg;
551
+ } else if (field.defaultFn) {
552
+ // Expose the partially-built object to the default
553
+ // function as its `this` object.
554
+ value = field.defaultFn.call(built);
555
+ } else {
556
+ var message = "no value or default function given for field " +
557
+ JSON.stringify(param) + " of " + self.typeName + "(" +
558
+ self.buildParams.map(function (name) {
559
+ return all[name];
560
+ }).join(", ") + ")";
561
+ throw new Error(message);
562
+ }
563
+
564
+ if (!type.check(value)) {
565
+ throw new Error(
566
+ shallowStringify(value) +
567
+ " does not match field " + field +
568
+ " of type " + self.typeName
569
+ );
570
+ }
550
571
 
551
- function add(param, i) {
552
- if (hasOwn.call(built, param))
553
- return;
554
-
555
- var all = self.allFields;
556
- if (!hasOwn.call(all, param)) {
557
- throw new Error("" + param);
558
- }
559
-
560
- var field = all[param];
561
- var type = field.type;
562
- var value;
563
-
564
- if (isNumber.check(i) && i < argc) {
565
- value = args[i];
566
- } else if (field.defaultFn) {
567
- // Expose the partially-built object to the default
568
- // function as its `this` object.
569
- value = field.defaultFn.call(built);
570
- } else {
571
- var message = "no value or default function given for field " +
572
- JSON.stringify(param) + " of " + self.typeName + "(" +
573
- self.buildParams.map(function (name) {
574
- return all[name];
575
- }).join(", ") + ")";
576
- throw new Error(message);
577
- }
578
-
579
- if (!type.check(value)) {
580
- throw new Error(
581
- shallowStringify(value) +
582
- " does not match field " + field +
583
- " of type " + self.typeName
584
- );
585
- }
586
-
587
- // TODO Could attach getters and setters here to enforce
588
- // dynamic type safety.
589
- built[param] = value;
572
+ built[param] = value;
573
+ }
574
+
575
+ // Calling the builder function will construct an instance of the Def,
576
+ // with positional arguments mapped to the fields original passed to .build.
577
+ // If not enough arguments are provided, the default value for the remaining fields
578
+ // will be used.
579
+ function builder() {
580
+ var args = arguments;
581
+ var argc = args.length;
582
+
583
+ if (!self.finalized) {
584
+ throw new Error(
585
+ "attempting to instantiate unfinalized type " +
586
+ self.typeName
587
+ );
588
+ }
589
+
590
+ var built = Object.create(nodePrototype);
591
+
592
+ self.buildParams.forEach(function (param, i) {
593
+ if (i < argc) {
594
+ addParam(built, param, args[i], true)
595
+ } else {
596
+ addParam(built, param, null, false);
590
597
  }
598
+ });
591
599
 
592
- self.buildParams.forEach(function (param, i) {
593
- add(param, i);
594
- });
600
+ Object.keys(self.allFields).forEach(function (param) {
601
+ // Use the default value.
602
+ addParam(built, param, null, false);
603
+ });
595
604
 
596
- Object.keys(self.allFields).forEach(function (param) {
597
- add(param); // Use the default value.
598
- });
605
+ // Make sure that the "type" field was filled automatically.
606
+ if (built.type !== self.typeName) {
607
+ throw new Error("");
608
+ }
599
609
 
600
- // Make sure that the "type" field was filled automatically.
601
- if (built.type !== self.typeName) {
602
- throw new Error("");
610
+ return built;
611
+ }
612
+
613
+ // Calling .from on the builder function will construct an instance of the Def,
614
+ // using field values from the passed object. For fields missing from the passed object,
615
+ // their default value will be used.
616
+ builder.from = function (obj) {
617
+ if (!self.finalized) {
618
+ throw new Error(
619
+ "attempting to instantiate unfinalized type " +
620
+ self.typeName
621
+ );
622
+ }
623
+
624
+ var built = Object.create(nodePrototype);
625
+
626
+ Object.keys(self.allFields).forEach(function (param) {
627
+ if (hasOwn.call(obj, param)) {
628
+ addParam(built, param, obj[param], true);
629
+ } else {
630
+ addParam(built, param, null, false);
603
631
  }
632
+ });
604
633
 
605
- return built;
634
+ // Make sure that the "type" field was filled automatically.
635
+ if (built.type !== self.typeName) {
636
+ throw new Error("");
606
637
  }
638
+
639
+ return built;
640
+ }
641
+
642
+ Object.defineProperty(builders, getBuilderName(self.typeName), {
643
+ enumerable: true,
644
+ value: builder
607
645
  });
608
646
 
609
647
  return self; // For chaining.
package/main.js CHANGED
@@ -12,5 +12,6 @@ module.exports = require('./fork')([
12
12
  require("./def/jsx"),
13
13
  require("./def/flow"),
14
14
  require("./def/esprima"),
15
- require("./def/babel")
15
+ require("./def/babel"),
16
+ require("./def/typescript")
16
17
  ]);
package/package.json CHANGED
@@ -18,7 +18,7 @@
18
18
  "transformation",
19
19
  "syntax"
20
20
  ],
21
- "version": "0.10.2",
21
+ "version": "0.11.3",
22
22
  "homepage": "http://github.com/benjamn/ast-types",
23
23
  "repository": {
24
24
  "type": "git",
@@ -27,15 +27,17 @@
27
27
  "license": "MIT",
28
28
  "main": "main.js",
29
29
  "scripts": {
30
- "test": "mocha --reporter spec --full-trace test/run.js"
30
+ "test": "test/run.sh"
31
31
  },
32
32
  "dependencies": {},
33
33
  "devDependencies": {
34
34
  "babel-types": "^6.26.0",
35
- "babylon": "^7.0.0-beta.31",
35
+ "babylon": "^7.0.0-beta.40",
36
36
  "espree": "^3.1.7",
37
37
  "esprima": "~4.0.0",
38
38
  "esprima-fb": "~14001.1.0-dev-harmony-fb",
39
+ "flow-parser": "^0.66.0",
40
+ "glob": "^7.1.2",
39
41
  "mocha": "^5.0.0",
40
42
  "reify": "^0.14.1"
41
43
  },