@react-native/codegen 0.72.4 → 0.73.0-nightly-20230603-fd9e295be
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/README.md +2 -2
- package/lib/CodegenSchema.d.ts +15 -4
- package/lib/CodegenSchema.js.flow +33 -21
- package/lib/generators/components/CppHelpers.js +39 -2
- package/lib/generators/components/CppHelpers.js.flow +54 -5
- package/lib/generators/components/GenerateEventEmitterCpp.js +238 -55
- package/lib/generators/components/GenerateEventEmitterCpp.js.flow +233 -55
- package/lib/generators/components/GenerateEventEmitterH.js +77 -28
- package/lib/generators/components/GenerateEventEmitterH.js.flow +87 -32
- package/lib/generators/components/GeneratePropsH.js +1 -2
- package/lib/generators/components/GeneratePropsH.js.flow +1 -2
- package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js +0 -1
- package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js.flow +3 -5
- package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js +4 -0
- package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js.flow +4 -0
- package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js +2 -0
- package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js.flow +2 -0
- package/lib/generators/components/__test_fixtures__/fixtures.js +114 -1
- package/lib/generators/components/__test_fixtures__/fixtures.js.flow +114 -1
- package/lib/generators/modules/GenerateModuleCpp.js +3 -3
- package/lib/generators/modules/GenerateModuleCpp.js.flow +3 -3
- package/lib/generators/modules/GenerateModuleH.js +1 -1
- package/lib/generators/modules/GenerateModuleH.js.flow +1 -1
- package/lib/generators/modules/GenerateModuleJavaSpec.js +1 -2
- package/lib/generators/modules/GenerateModuleJavaSpec.js.flow +1 -2
- package/lib/parsers/error-utils.js +44 -0
- package/lib/parsers/error-utils.js.flow +59 -0
- package/lib/parsers/flow/components/__test_fixtures__/fixtures.js +51 -0
- package/lib/parsers/flow/components/__test_fixtures__/fixtures.js.flow +51 -0
- package/lib/parsers/flow/components/componentsUtils.js +6 -6
- package/lib/parsers/flow/components/componentsUtils.js.flow +10 -10
- package/lib/parsers/flow/components/events.js +157 -78
- package/lib/parsers/flow/components/events.js.flow +158 -77
- package/lib/parsers/flow/components/index.js +28 -105
- package/lib/parsers/flow/components/index.js.flow +21 -110
- package/lib/parsers/flow/modules/index.js +39 -49
- package/lib/parsers/flow/modules/index.js.flow +22 -31
- package/lib/parsers/flow/parser.d.ts +9 -2
- package/lib/parsers/flow/parser.js +167 -16
- package/lib/parsers/flow/parser.js.flow +209 -6
- package/lib/parsers/flow/utils.js +0 -63
- package/lib/parsers/flow/utils.js.flow +1 -77
- package/lib/parsers/parser.js.flow +141 -1
- package/lib/parsers/parserMock.js +165 -2
- package/lib/parsers/parserMock.js.flow +216 -2
- package/lib/parsers/parsers-commons.js +128 -9
- package/lib/parsers/parsers-commons.js.flow +182 -12
- package/lib/parsers/parsers-primitives.js +84 -35
- package/lib/parsers/parsers-primitives.js.flow +110 -35
- package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js +51 -0
- package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js.flow +51 -0
- package/lib/parsers/typescript/components/componentsUtils.js +31 -7
- package/lib/parsers/typescript/components/componentsUtils.js.flow +31 -14
- package/lib/parsers/typescript/components/events.js +142 -67
- package/lib/parsers/typescript/components/events.js.flow +149 -68
- package/lib/parsers/typescript/components/extends.js +2 -49
- package/lib/parsers/typescript/components/extends.js.flow +1 -55
- package/lib/parsers/typescript/components/index.js +29 -109
- package/lib/parsers/typescript/components/index.js.flow +21 -116
- package/lib/parsers/typescript/modules/index.js +41 -50
- package/lib/parsers/typescript/modules/index.js.flow +23 -31
- package/lib/parsers/typescript/parser.d.ts +9 -2
- package/lib/parsers/typescript/parser.js +193 -7
- package/lib/parsers/typescript/parser.js.flow +235 -6
- package/lib/parsers/utils.js.flow +6 -0
- package/package.json +26 -15
- package/lib/parsers/flow/components/extends.js +0 -52
- package/lib/parsers/flow/components/extends.js.flow +0 -66
- package/lib/parsers/flow/components/props.js +0 -47
- package/lib/parsers/flow/components/props.js.flow +0 -60
- package/lib/parsers/typescript/components/props.js +0 -39
- package/lib/parsers/typescript/components/props.js.flow +0 -48
- package/lib/parsers/typescript/utils.js +0 -90
- package/lib/parsers/typescript/utils.js.flow +0 -104
|
@@ -14,6 +14,17 @@ const _require = require('./componentsUtils'),
|
|
|
14
14
|
flattenProperties = _require.flattenProperties;
|
|
15
15
|
const _require2 = require('../parseTopLevelType'),
|
|
16
16
|
parseTopLevelType = _require2.parseTopLevelType;
|
|
17
|
+
const _require3 = require('../../error-utils'),
|
|
18
|
+
throwIfEventHasNoName = _require3.throwIfEventHasNoName,
|
|
19
|
+
throwIfBubblingTypeIsNull = _require3.throwIfBubblingTypeIsNull,
|
|
20
|
+
throwIfArgumentPropsAreNull = _require3.throwIfArgumentPropsAreNull;
|
|
21
|
+
const _require4 = require('../../parsers-commons'),
|
|
22
|
+
getEventArgument = _require4.getEventArgument;
|
|
23
|
+
const _require5 = require('../../parsers-primitives'),
|
|
24
|
+
emitBoolProp = _require5.emitBoolProp,
|
|
25
|
+
emitDoubleProp = _require5.emitDoubleProp,
|
|
26
|
+
emitFloatProp = _require5.emitFloatProp,
|
|
27
|
+
emitStringProp = _require5.emitStringProp;
|
|
17
28
|
function getPropertyType(
|
|
18
29
|
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
19
30
|
* LTI update could not be added via codemod */
|
|
@@ -22,6 +33,7 @@ function getPropertyType(
|
|
|
22
33
|
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
23
34
|
* LTI update could not be added via codemod */
|
|
24
35
|
annotation,
|
|
36
|
+
parser,
|
|
25
37
|
) {
|
|
26
38
|
const topLevelType = parseTopLevelType(annotation);
|
|
27
39
|
const typeAnnotation = topLevelType.type;
|
|
@@ -32,21 +44,9 @@ function getPropertyType(
|
|
|
32
44
|
: typeAnnotation.type;
|
|
33
45
|
switch (type) {
|
|
34
46
|
case 'TSBooleanKeyword':
|
|
35
|
-
return
|
|
36
|
-
name,
|
|
37
|
-
optional,
|
|
38
|
-
typeAnnotation: {
|
|
39
|
-
type: 'BooleanTypeAnnotation',
|
|
40
|
-
},
|
|
41
|
-
};
|
|
47
|
+
return emitBoolProp(name, optional);
|
|
42
48
|
case 'TSStringKeyword':
|
|
43
|
-
return
|
|
44
|
-
name,
|
|
45
|
-
optional,
|
|
46
|
-
typeAnnotation: {
|
|
47
|
-
type: 'StringTypeAnnotation',
|
|
48
|
-
},
|
|
49
|
-
};
|
|
49
|
+
return emitStringProp(name, optional);
|
|
50
50
|
case 'Int32':
|
|
51
51
|
return {
|
|
52
52
|
name,
|
|
@@ -56,45 +56,116 @@ function getPropertyType(
|
|
|
56
56
|
},
|
|
57
57
|
};
|
|
58
58
|
case 'Double':
|
|
59
|
+
return emitDoubleProp(name, optional);
|
|
60
|
+
case 'Float':
|
|
61
|
+
return emitFloatProp(name, optional);
|
|
62
|
+
case 'TSTypeLiteral':
|
|
59
63
|
return {
|
|
60
64
|
name,
|
|
61
65
|
optional,
|
|
62
66
|
typeAnnotation: {
|
|
63
|
-
type: '
|
|
67
|
+
type: 'ObjectTypeAnnotation',
|
|
68
|
+
properties: typeAnnotation.members.map(member =>
|
|
69
|
+
buildPropertiesForEvent(member, parser),
|
|
70
|
+
),
|
|
64
71
|
},
|
|
65
72
|
};
|
|
66
|
-
case '
|
|
73
|
+
case 'TSUnionType':
|
|
67
74
|
return {
|
|
68
75
|
name,
|
|
69
76
|
optional,
|
|
70
77
|
typeAnnotation: {
|
|
71
|
-
type: '
|
|
78
|
+
type: 'StringEnumTypeAnnotation',
|
|
79
|
+
options: typeAnnotation.types.map(option => option.literal.value),
|
|
72
80
|
},
|
|
73
81
|
};
|
|
74
|
-
case '
|
|
82
|
+
case 'UnsafeMixed':
|
|
75
83
|
return {
|
|
76
84
|
name,
|
|
77
85
|
optional,
|
|
78
86
|
typeAnnotation: {
|
|
79
|
-
type: '
|
|
80
|
-
properties: typeAnnotation.members.map(buildPropertiesForEvent),
|
|
87
|
+
type: 'MixedTypeAnnotation',
|
|
81
88
|
},
|
|
82
89
|
};
|
|
83
|
-
case '
|
|
90
|
+
case 'TSArrayType':
|
|
84
91
|
return {
|
|
85
92
|
name,
|
|
86
93
|
optional,
|
|
87
|
-
typeAnnotation:
|
|
88
|
-
type: 'StringEnumTypeAnnotation',
|
|
89
|
-
options: typeAnnotation.types.map(option => option.literal.value),
|
|
90
|
-
},
|
|
94
|
+
typeAnnotation: extractArrayElementType(typeAnnotation, name, parser),
|
|
91
95
|
};
|
|
92
96
|
default:
|
|
93
97
|
type;
|
|
94
98
|
throw new Error(`Unable to determine event type for "${name}": ${type}`);
|
|
95
99
|
}
|
|
96
100
|
}
|
|
101
|
+
function extractArrayElementType(typeAnnotation, name, parser) {
|
|
102
|
+
const type = extractTypeFromTypeAnnotation(typeAnnotation);
|
|
103
|
+
switch (type) {
|
|
104
|
+
case 'TSParenthesizedType':
|
|
105
|
+
return extractArrayElementType(
|
|
106
|
+
typeAnnotation.typeAnnotation,
|
|
107
|
+
name,
|
|
108
|
+
parser,
|
|
109
|
+
);
|
|
110
|
+
case 'TSBooleanKeyword':
|
|
111
|
+
return {
|
|
112
|
+
type: 'BooleanTypeAnnotation',
|
|
113
|
+
};
|
|
114
|
+
case 'TSStringKeyword':
|
|
115
|
+
return {
|
|
116
|
+
type: 'StringTypeAnnotation',
|
|
117
|
+
};
|
|
118
|
+
case 'Float':
|
|
119
|
+
return {
|
|
120
|
+
type: 'FloatTypeAnnotation',
|
|
121
|
+
};
|
|
122
|
+
case 'Int32':
|
|
123
|
+
return {
|
|
124
|
+
type: 'Int32TypeAnnotation',
|
|
125
|
+
};
|
|
126
|
+
case 'TSNumberKeyword':
|
|
127
|
+
case 'Double':
|
|
128
|
+
return {
|
|
129
|
+
type: 'DoubleTypeAnnotation',
|
|
130
|
+
};
|
|
131
|
+
case 'TSUnionType':
|
|
132
|
+
return {
|
|
133
|
+
type: 'StringEnumTypeAnnotation',
|
|
134
|
+
options: typeAnnotation.types.map(option => option.literal.value),
|
|
135
|
+
};
|
|
136
|
+
case 'TSTypeLiteral':
|
|
137
|
+
return {
|
|
138
|
+
type: 'ObjectTypeAnnotation',
|
|
139
|
+
properties: typeAnnotation.members.map(member =>
|
|
140
|
+
buildPropertiesForEvent(member, parser),
|
|
141
|
+
),
|
|
142
|
+
};
|
|
143
|
+
case 'TSArrayType':
|
|
144
|
+
return {
|
|
145
|
+
type: 'ArrayTypeAnnotation',
|
|
146
|
+
elementType: extractArrayElementType(
|
|
147
|
+
typeAnnotation.elementType,
|
|
148
|
+
name,
|
|
149
|
+
parser,
|
|
150
|
+
),
|
|
151
|
+
};
|
|
152
|
+
default:
|
|
153
|
+
throw new Error(
|
|
154
|
+
`Unrecognized ${type} for Array ${name} in events.\n${JSON.stringify(
|
|
155
|
+
typeAnnotation,
|
|
156
|
+
null,
|
|
157
|
+
2,
|
|
158
|
+
)}`,
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function extractTypeFromTypeAnnotation(typeAnnotation) {
|
|
163
|
+
return typeAnnotation.type === 'TSTypeReference'
|
|
164
|
+
? typeAnnotation.typeName.name
|
|
165
|
+
: typeAnnotation.type;
|
|
166
|
+
}
|
|
97
167
|
function findEventArgumentsAndType(
|
|
168
|
+
parser,
|
|
98
169
|
typeAnnotation,
|
|
99
170
|
types,
|
|
100
171
|
bubblingType,
|
|
@@ -114,12 +185,11 @@ function findEventArgumentsAndType(
|
|
|
114
185
|
bubblingType,
|
|
115
186
|
};
|
|
116
187
|
}
|
|
117
|
-
|
|
118
|
-
throw new Error("typeAnnotation of event doesn't have a name");
|
|
119
|
-
}
|
|
188
|
+
throwIfEventHasNoName(typeAnnotation, parser);
|
|
120
189
|
const name = typeAnnotation.typeName.name;
|
|
121
190
|
if (name === 'Readonly') {
|
|
122
191
|
return findEventArgumentsAndType(
|
|
192
|
+
parser,
|
|
123
193
|
typeAnnotation.typeParameters.params[0],
|
|
124
194
|
types,
|
|
125
195
|
bubblingType,
|
|
@@ -132,8 +202,8 @@ function findEventArgumentsAndType(
|
|
|
132
202
|
? typeAnnotation.typeParameters.params[1].literal.value
|
|
133
203
|
: null;
|
|
134
204
|
switch (typeAnnotation.typeParameters.params[0].type) {
|
|
135
|
-
case
|
|
136
|
-
case
|
|
205
|
+
case parser.nullLiteralTypeAnnotation:
|
|
206
|
+
case parser.undefinedLiteralTypeAnnotation:
|
|
137
207
|
return {
|
|
138
208
|
argumentProps: [],
|
|
139
209
|
bubblingType: eventType,
|
|
@@ -141,6 +211,7 @@ function findEventArgumentsAndType(
|
|
|
141
211
|
};
|
|
142
212
|
default:
|
|
143
213
|
return findEventArgumentsAndType(
|
|
214
|
+
parser,
|
|
144
215
|
typeAnnotation.typeParameters.params[0],
|
|
145
216
|
types,
|
|
146
217
|
eventType,
|
|
@@ -153,6 +224,7 @@ function findEventArgumentsAndType(
|
|
|
153
224
|
elementType = elementType.typeAnnotation;
|
|
154
225
|
}
|
|
155
226
|
return findEventArgumentsAndType(
|
|
227
|
+
parser,
|
|
156
228
|
elementType,
|
|
157
229
|
types,
|
|
158
230
|
bubblingType,
|
|
@@ -166,28 +238,21 @@ function findEventArgumentsAndType(
|
|
|
166
238
|
};
|
|
167
239
|
}
|
|
168
240
|
}
|
|
169
|
-
|
|
170
|
-
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
171
|
-
|
|
172
|
-
|
|
241
|
+
function buildPropertiesForEvent(
|
|
242
|
+
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
243
|
+
* LTI update could not be added via codemod */
|
|
244
|
+
property,
|
|
245
|
+
parser,
|
|
246
|
+
) {
|
|
173
247
|
const name = property.key.name;
|
|
174
|
-
const optional = property
|
|
248
|
+
const optional = parser.isOptionalProperty(property);
|
|
175
249
|
let typeAnnotation = property.typeAnnotation.typeAnnotation;
|
|
176
|
-
return getPropertyType(name, optional, typeAnnotation);
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
180
|
-
* LTI update could not be added via codemod */
|
|
181
|
-
function getEventArgument(argumentProps, name) {
|
|
182
|
-
return {
|
|
183
|
-
type: 'ObjectTypeAnnotation',
|
|
184
|
-
properties: argumentProps.map(buildPropertiesForEvent),
|
|
185
|
-
};
|
|
250
|
+
return getPropertyType(name, optional, typeAnnotation, parser);
|
|
186
251
|
}
|
|
187
252
|
|
|
188
253
|
// $FlowFixMe[unclear-type] TODO(T108222691): Use flow-types for @babel/parser
|
|
189
254
|
|
|
190
|
-
function buildEventSchema(types, property) {
|
|
255
|
+
function buildEventSchema(types, property, parser) {
|
|
191
256
|
// unpack WithDefault, (T) or T|U
|
|
192
257
|
const topLevelType = parseTopLevelType(
|
|
193
258
|
property.typeAnnotation.typeAnnotation,
|
|
@@ -197,6 +262,7 @@ function buildEventSchema(types, property) {
|
|
|
197
262
|
const typeAnnotation = topLevelType.type;
|
|
198
263
|
const optional = property.optional || topLevelType.optional;
|
|
199
264
|
const _findEventArgumentsAn = findEventArgumentsAndType(
|
|
265
|
+
parser,
|
|
200
266
|
typeAnnotation,
|
|
201
267
|
types,
|
|
202
268
|
),
|
|
@@ -204,36 +270,45 @@ function buildEventSchema(types, property) {
|
|
|
204
270
|
bubblingType = _findEventArgumentsAn.bubblingType,
|
|
205
271
|
paperTopLevelNameDeprecated =
|
|
206
272
|
_findEventArgumentsAn.paperTopLevelNameDeprecated;
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
return {
|
|
214
|
-
name,
|
|
215
|
-
optional,
|
|
216
|
-
bubblingType,
|
|
217
|
-
paperTopLevelNameDeprecated,
|
|
218
|
-
typeAnnotation: {
|
|
219
|
-
type: 'EventTypeAnnotation',
|
|
220
|
-
argument: getEventArgument(argumentProps, name),
|
|
221
|
-
},
|
|
222
|
-
};
|
|
223
|
-
}
|
|
273
|
+
const nonNullableArgumentProps = throwIfArgumentPropsAreNull(
|
|
274
|
+
argumentProps,
|
|
275
|
+
name,
|
|
276
|
+
);
|
|
277
|
+
const nonNullableBubblingType = throwIfBubblingTypeIsNull(bubblingType, name);
|
|
278
|
+
if (paperTopLevelNameDeprecated != null) {
|
|
224
279
|
return {
|
|
225
280
|
name,
|
|
226
281
|
optional,
|
|
227
|
-
bubblingType,
|
|
282
|
+
bubblingType: nonNullableBubblingType,
|
|
283
|
+
paperTopLevelNameDeprecated,
|
|
228
284
|
typeAnnotation: {
|
|
229
285
|
type: 'EventTypeAnnotation',
|
|
230
|
-
argument: getEventArgument(
|
|
286
|
+
argument: getEventArgument(
|
|
287
|
+
nonNullableArgumentProps,
|
|
288
|
+
buildPropertiesForEvent,
|
|
289
|
+
parser,
|
|
290
|
+
),
|
|
231
291
|
},
|
|
232
292
|
};
|
|
233
293
|
}
|
|
294
|
+
return {
|
|
295
|
+
name,
|
|
296
|
+
optional,
|
|
297
|
+
bubblingType: nonNullableBubblingType,
|
|
298
|
+
typeAnnotation: {
|
|
299
|
+
type: 'EventTypeAnnotation',
|
|
300
|
+
argument: getEventArgument(
|
|
301
|
+
nonNullableArgumentProps,
|
|
302
|
+
buildPropertiesForEvent,
|
|
303
|
+
parser,
|
|
304
|
+
),
|
|
305
|
+
},
|
|
306
|
+
};
|
|
234
307
|
}
|
|
235
|
-
function getEvents(eventTypeAST, types) {
|
|
236
|
-
return eventTypeAST
|
|
308
|
+
function getEvents(eventTypeAST, types, parser) {
|
|
309
|
+
return eventTypeAST
|
|
310
|
+
.map(property => buildEventSchema(types, property, parser))
|
|
311
|
+
.filter(Boolean);
|
|
237
312
|
}
|
|
238
313
|
module.exports = {
|
|
239
314
|
getEvents,
|
|
@@ -16,9 +16,21 @@ import type {
|
|
|
16
16
|
EventTypeAnnotation,
|
|
17
17
|
} from '../../../CodegenSchema.js';
|
|
18
18
|
import type {TypeDeclarationMap} from '../../utils';
|
|
19
|
+
import type {Parser} from '../../parser';
|
|
19
20
|
const {flattenProperties} = require('./componentsUtils');
|
|
20
21
|
const {parseTopLevelType} = require('../parseTopLevelType');
|
|
21
|
-
|
|
22
|
+
const {
|
|
23
|
+
throwIfEventHasNoName,
|
|
24
|
+
throwIfBubblingTypeIsNull,
|
|
25
|
+
throwIfArgumentPropsAreNull,
|
|
26
|
+
} = require('../../error-utils');
|
|
27
|
+
const {getEventArgument} = require('../../parsers-commons');
|
|
28
|
+
const {
|
|
29
|
+
emitBoolProp,
|
|
30
|
+
emitDoubleProp,
|
|
31
|
+
emitFloatProp,
|
|
32
|
+
emitStringProp,
|
|
33
|
+
} = require('../../parsers-primitives');
|
|
22
34
|
function getPropertyType(
|
|
23
35
|
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
24
36
|
* LTI update could not be added via codemod */
|
|
@@ -27,6 +39,7 @@ function getPropertyType(
|
|
|
27
39
|
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
28
40
|
* LTI update could not be added via codemod */
|
|
29
41
|
annotation,
|
|
42
|
+
parser: Parser,
|
|
30
43
|
): NamedShape<EventTypeAnnotation> {
|
|
31
44
|
const topLevelType = parseTopLevelType(annotation);
|
|
32
45
|
const typeAnnotation = topLevelType.type;
|
|
@@ -38,21 +51,9 @@ function getPropertyType(
|
|
|
38
51
|
|
|
39
52
|
switch (type) {
|
|
40
53
|
case 'TSBooleanKeyword':
|
|
41
|
-
return
|
|
42
|
-
name,
|
|
43
|
-
optional,
|
|
44
|
-
typeAnnotation: {
|
|
45
|
-
type: 'BooleanTypeAnnotation',
|
|
46
|
-
},
|
|
47
|
-
};
|
|
54
|
+
return emitBoolProp(name, optional);
|
|
48
55
|
case 'TSStringKeyword':
|
|
49
|
-
return
|
|
50
|
-
name,
|
|
51
|
-
optional,
|
|
52
|
-
typeAnnotation: {
|
|
53
|
-
type: 'StringTypeAnnotation',
|
|
54
|
-
},
|
|
55
|
-
};
|
|
56
|
+
return emitStringProp(name, optional);
|
|
56
57
|
case 'Int32':
|
|
57
58
|
return {
|
|
58
59
|
name,
|
|
@@ -62,39 +63,42 @@ function getPropertyType(
|
|
|
62
63
|
},
|
|
63
64
|
};
|
|
64
65
|
case 'Double':
|
|
66
|
+
return emitDoubleProp(name, optional);
|
|
67
|
+
case 'Float':
|
|
68
|
+
return emitFloatProp(name, optional);
|
|
69
|
+
case 'TSTypeLiteral':
|
|
65
70
|
return {
|
|
66
71
|
name,
|
|
67
72
|
optional,
|
|
68
73
|
typeAnnotation: {
|
|
69
|
-
type: '
|
|
74
|
+
type: 'ObjectTypeAnnotation',
|
|
75
|
+
properties: typeAnnotation.members.map(member =>
|
|
76
|
+
buildPropertiesForEvent(member, parser),
|
|
77
|
+
),
|
|
70
78
|
},
|
|
71
79
|
};
|
|
72
|
-
case '
|
|
80
|
+
case 'TSUnionType':
|
|
73
81
|
return {
|
|
74
82
|
name,
|
|
75
83
|
optional,
|
|
76
84
|
typeAnnotation: {
|
|
77
|
-
type: '
|
|
85
|
+
type: 'StringEnumTypeAnnotation',
|
|
86
|
+
options: typeAnnotation.types.map(option => option.literal.value),
|
|
78
87
|
},
|
|
79
88
|
};
|
|
80
|
-
case '
|
|
89
|
+
case 'UnsafeMixed':
|
|
81
90
|
return {
|
|
82
91
|
name,
|
|
83
92
|
optional,
|
|
84
93
|
typeAnnotation: {
|
|
85
|
-
type: '
|
|
86
|
-
properties: typeAnnotation.members.map(buildPropertiesForEvent),
|
|
94
|
+
type: 'MixedTypeAnnotation',
|
|
87
95
|
},
|
|
88
96
|
};
|
|
89
|
-
|
|
90
|
-
case 'TSUnionType':
|
|
97
|
+
case 'TSArrayType':
|
|
91
98
|
return {
|
|
92
99
|
name,
|
|
93
100
|
optional,
|
|
94
|
-
typeAnnotation:
|
|
95
|
-
type: 'StringEnumTypeAnnotation',
|
|
96
|
-
options: typeAnnotation.types.map(option => option.literal.value),
|
|
97
|
-
},
|
|
101
|
+
typeAnnotation: extractArrayElementType(typeAnnotation, name, parser),
|
|
98
102
|
};
|
|
99
103
|
default:
|
|
100
104
|
(type: empty);
|
|
@@ -102,7 +106,77 @@ function getPropertyType(
|
|
|
102
106
|
}
|
|
103
107
|
}
|
|
104
108
|
|
|
109
|
+
function extractArrayElementType(
|
|
110
|
+
typeAnnotation: $FlowFixMe,
|
|
111
|
+
name: string,
|
|
112
|
+
parser: Parser,
|
|
113
|
+
): EventTypeAnnotation {
|
|
114
|
+
const type = extractTypeFromTypeAnnotation(typeAnnotation);
|
|
115
|
+
|
|
116
|
+
switch (type) {
|
|
117
|
+
case 'TSParenthesizedType':
|
|
118
|
+
return extractArrayElementType(
|
|
119
|
+
typeAnnotation.typeAnnotation,
|
|
120
|
+
name,
|
|
121
|
+
parser,
|
|
122
|
+
);
|
|
123
|
+
case 'TSBooleanKeyword':
|
|
124
|
+
return {type: 'BooleanTypeAnnotation'};
|
|
125
|
+
case 'TSStringKeyword':
|
|
126
|
+
return {type: 'StringTypeAnnotation'};
|
|
127
|
+
case 'Float':
|
|
128
|
+
return {
|
|
129
|
+
type: 'FloatTypeAnnotation',
|
|
130
|
+
};
|
|
131
|
+
case 'Int32':
|
|
132
|
+
return {
|
|
133
|
+
type: 'Int32TypeAnnotation',
|
|
134
|
+
};
|
|
135
|
+
case 'TSNumberKeyword':
|
|
136
|
+
case 'Double':
|
|
137
|
+
return {
|
|
138
|
+
type: 'DoubleTypeAnnotation',
|
|
139
|
+
};
|
|
140
|
+
case 'TSUnionType':
|
|
141
|
+
return {
|
|
142
|
+
type: 'StringEnumTypeAnnotation',
|
|
143
|
+
options: typeAnnotation.types.map(option => option.literal.value),
|
|
144
|
+
};
|
|
145
|
+
case 'TSTypeLiteral':
|
|
146
|
+
return {
|
|
147
|
+
type: 'ObjectTypeAnnotation',
|
|
148
|
+
properties: typeAnnotation.members.map(member =>
|
|
149
|
+
buildPropertiesForEvent(member, parser),
|
|
150
|
+
),
|
|
151
|
+
};
|
|
152
|
+
case 'TSArrayType':
|
|
153
|
+
return {
|
|
154
|
+
type: 'ArrayTypeAnnotation',
|
|
155
|
+
elementType: extractArrayElementType(
|
|
156
|
+
typeAnnotation.elementType,
|
|
157
|
+
name,
|
|
158
|
+
parser,
|
|
159
|
+
),
|
|
160
|
+
};
|
|
161
|
+
default:
|
|
162
|
+
throw new Error(
|
|
163
|
+
`Unrecognized ${type} for Array ${name} in events.\n${JSON.stringify(
|
|
164
|
+
typeAnnotation,
|
|
165
|
+
null,
|
|
166
|
+
2,
|
|
167
|
+
)}`,
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function extractTypeFromTypeAnnotation(typeAnnotation: $FlowFixMe): string {
|
|
173
|
+
return typeAnnotation.type === 'TSTypeReference'
|
|
174
|
+
? typeAnnotation.typeName.name
|
|
175
|
+
: typeAnnotation.type;
|
|
176
|
+
}
|
|
177
|
+
|
|
105
178
|
function findEventArgumentsAndType(
|
|
179
|
+
parser: Parser,
|
|
106
180
|
typeAnnotation: $FlowFixMe,
|
|
107
181
|
types: TypeDeclarationMap,
|
|
108
182
|
bubblingType: void | 'direct' | 'bubble',
|
|
@@ -128,12 +202,11 @@ function findEventArgumentsAndType(
|
|
|
128
202
|
};
|
|
129
203
|
}
|
|
130
204
|
|
|
131
|
-
|
|
132
|
-
throw new Error("typeAnnotation of event doesn't have a name");
|
|
133
|
-
}
|
|
205
|
+
throwIfEventHasNoName(typeAnnotation, parser);
|
|
134
206
|
const name = typeAnnotation.typeName.name;
|
|
135
207
|
if (name === 'Readonly') {
|
|
136
208
|
return findEventArgumentsAndType(
|
|
209
|
+
parser,
|
|
137
210
|
typeAnnotation.typeParameters.params[0],
|
|
138
211
|
types,
|
|
139
212
|
bubblingType,
|
|
@@ -147,8 +220,8 @@ function findEventArgumentsAndType(
|
|
|
147
220
|
: null;
|
|
148
221
|
|
|
149
222
|
switch (typeAnnotation.typeParameters.params[0].type) {
|
|
150
|
-
case
|
|
151
|
-
case
|
|
223
|
+
case parser.nullLiteralTypeAnnotation:
|
|
224
|
+
case parser.undefinedLiteralTypeAnnotation:
|
|
152
225
|
return {
|
|
153
226
|
argumentProps: [],
|
|
154
227
|
bubblingType: eventType,
|
|
@@ -156,6 +229,7 @@ function findEventArgumentsAndType(
|
|
|
156
229
|
};
|
|
157
230
|
default:
|
|
158
231
|
return findEventArgumentsAndType(
|
|
232
|
+
parser,
|
|
159
233
|
typeAnnotation.typeParameters.params[0],
|
|
160
234
|
types,
|
|
161
235
|
eventType,
|
|
@@ -168,6 +242,7 @@ function findEventArgumentsAndType(
|
|
|
168
242
|
elementType = elementType.typeAnnotation;
|
|
169
243
|
}
|
|
170
244
|
return findEventArgumentsAndType(
|
|
245
|
+
parser,
|
|
171
246
|
elementType,
|
|
172
247
|
types,
|
|
173
248
|
bubblingType,
|
|
@@ -182,23 +257,17 @@ function findEventArgumentsAndType(
|
|
|
182
257
|
}
|
|
183
258
|
}
|
|
184
259
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
260
|
+
function buildPropertiesForEvent(
|
|
261
|
+
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
262
|
+
* LTI update could not be added via codemod */
|
|
263
|
+
property,
|
|
264
|
+
parser: Parser,
|
|
265
|
+
): NamedShape<EventTypeAnnotation> {
|
|
188
266
|
const name = property.key.name;
|
|
189
|
-
const optional = property
|
|
267
|
+
const optional = parser.isOptionalProperty(property);
|
|
190
268
|
let typeAnnotation = property.typeAnnotation.typeAnnotation;
|
|
191
269
|
|
|
192
|
-
return getPropertyType(name, optional, typeAnnotation);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
196
|
-
* LTI update could not be added via codemod */
|
|
197
|
-
function getEventArgument(argumentProps, name: $FlowFixMe) {
|
|
198
|
-
return {
|
|
199
|
-
type: 'ObjectTypeAnnotation',
|
|
200
|
-
properties: argumentProps.map(buildPropertiesForEvent),
|
|
201
|
-
};
|
|
270
|
+
return getPropertyType(name, optional, typeAnnotation, parser);
|
|
202
271
|
}
|
|
203
272
|
|
|
204
273
|
// $FlowFixMe[unclear-type] TODO(T108222691): Use flow-types for @babel/parser
|
|
@@ -207,7 +276,8 @@ type EventTypeAST = Object;
|
|
|
207
276
|
function buildEventSchema(
|
|
208
277
|
types: TypeDeclarationMap,
|
|
209
278
|
property: EventTypeAST,
|
|
210
|
-
|
|
279
|
+
parser: Parser,
|
|
280
|
+
): ?EventTypeShape {
|
|
211
281
|
// unpack WithDefault, (T) or T|U
|
|
212
282
|
const topLevelType = parseTopLevelType(
|
|
213
283
|
property.typeAnnotation.typeAnnotation,
|
|
@@ -218,43 +288,54 @@ function buildEventSchema(
|
|
|
218
288
|
const typeAnnotation = topLevelType.type;
|
|
219
289
|
const optional = property.optional || topLevelType.optional;
|
|
220
290
|
const {argumentProps, bubblingType, paperTopLevelNameDeprecated} =
|
|
221
|
-
findEventArgumentsAndType(typeAnnotation, types);
|
|
291
|
+
findEventArgumentsAndType(parser, typeAnnotation, types);
|
|
222
292
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
if (paperTopLevelNameDeprecated != null) {
|
|
229
|
-
return {
|
|
230
|
-
name,
|
|
231
|
-
optional,
|
|
232
|
-
bubblingType,
|
|
233
|
-
paperTopLevelNameDeprecated,
|
|
234
|
-
typeAnnotation: {
|
|
235
|
-
type: 'EventTypeAnnotation',
|
|
236
|
-
argument: getEventArgument(argumentProps, name),
|
|
237
|
-
},
|
|
238
|
-
};
|
|
239
|
-
}
|
|
293
|
+
const nonNullableArgumentProps = throwIfArgumentPropsAreNull(
|
|
294
|
+
argumentProps,
|
|
295
|
+
name,
|
|
296
|
+
);
|
|
297
|
+
const nonNullableBubblingType = throwIfBubblingTypeIsNull(bubblingType, name);
|
|
240
298
|
|
|
299
|
+
if (paperTopLevelNameDeprecated != null) {
|
|
241
300
|
return {
|
|
242
301
|
name,
|
|
243
302
|
optional,
|
|
244
|
-
bubblingType,
|
|
303
|
+
bubblingType: nonNullableBubblingType,
|
|
304
|
+
paperTopLevelNameDeprecated,
|
|
245
305
|
typeAnnotation: {
|
|
246
306
|
type: 'EventTypeAnnotation',
|
|
247
|
-
argument: getEventArgument(
|
|
307
|
+
argument: getEventArgument(
|
|
308
|
+
nonNullableArgumentProps,
|
|
309
|
+
buildPropertiesForEvent,
|
|
310
|
+
parser,
|
|
311
|
+
),
|
|
248
312
|
},
|
|
249
313
|
};
|
|
250
314
|
}
|
|
315
|
+
|
|
316
|
+
return {
|
|
317
|
+
name,
|
|
318
|
+
optional,
|
|
319
|
+
bubblingType: nonNullableBubblingType,
|
|
320
|
+
typeAnnotation: {
|
|
321
|
+
type: 'EventTypeAnnotation',
|
|
322
|
+
argument: getEventArgument(
|
|
323
|
+
nonNullableArgumentProps,
|
|
324
|
+
buildPropertiesForEvent,
|
|
325
|
+
parser,
|
|
326
|
+
),
|
|
327
|
+
},
|
|
328
|
+
};
|
|
251
329
|
}
|
|
252
330
|
|
|
253
331
|
function getEvents(
|
|
254
332
|
eventTypeAST: $ReadOnlyArray<EventTypeAST>,
|
|
255
333
|
types: TypeDeclarationMap,
|
|
334
|
+
parser: Parser,
|
|
256
335
|
): $ReadOnlyArray<EventTypeShape> {
|
|
257
|
-
return eventTypeAST
|
|
336
|
+
return eventTypeAST
|
|
337
|
+
.map(property => buildEventSchema(types, property, parser))
|
|
338
|
+
.filter(Boolean);
|
|
258
339
|
}
|
|
259
340
|
|
|
260
341
|
module.exports = {
|