@react-native/codegen 0.72.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -0
- package/lib/CodegenSchema.js +11 -0
- package/lib/CodegenSchema.js.flow +351 -0
- package/lib/SchemaValidator.js +54 -0
- package/lib/SchemaValidator.js.flow +67 -0
- package/lib/cli/combine/combine-js-to-schema-cli.js +50 -0
- package/lib/cli/combine/combine-js-to-schema-cli.js.flow +49 -0
- package/lib/cli/combine/combine-js-to-schema.js +110 -0
- package/lib/cli/combine/combine-js-to-schema.js.flow +48 -0
- package/lib/cli/combine/combine-utils.js +118 -0
- package/lib/cli/combine/combine-utils.js.flow +85 -0
- package/lib/cli/generators/generate-all.js +65 -0
- package/lib/cli/generators/generate-all.js.flow +66 -0
- package/lib/cli/parser/parser-cli.js +55 -0
- package/lib/cli/parser/parser-cli.js.flow +18 -0
- package/lib/cli/parser/parser.js +35 -0
- package/lib/cli/parser/parser.js.flow +37 -0
- package/lib/cli/parser/parser.sh +15 -0
- package/lib/generators/RNCodegen.js +207 -0
- package/lib/generators/RNCodegen.js.flow +284 -0
- package/lib/generators/Utils.js +31 -0
- package/lib/generators/Utils.js.flow +33 -0
- package/lib/generators/__test_fixtures__/fixtures.js +79 -0
- package/lib/generators/__test_fixtures__/fixtures.js.flow +82 -0
- package/lib/generators/components/ComponentsGeneratorUtils.js +217 -0
- package/lib/generators/components/ComponentsGeneratorUtils.js.flow +304 -0
- package/lib/generators/components/CppHelpers.js +188 -0
- package/lib/generators/components/CppHelpers.js.flow +228 -0
- package/lib/generators/components/GenerateComponentDescriptorH.js +75 -0
- package/lib/generators/components/GenerateComponentDescriptorH.js.flow +95 -0
- package/lib/generators/components/GenerateComponentHObjCpp.js +327 -0
- package/lib/generators/components/GenerateComponentHObjCpp.js.flow +418 -0
- package/lib/generators/components/GenerateEventEmitterCpp.js +199 -0
- package/lib/generators/components/GenerateEventEmitterCpp.js.flow +273 -0
- package/lib/generators/components/GenerateEventEmitterH.js +224 -0
- package/lib/generators/components/GenerateEventEmitterH.js.flow +315 -0
- package/lib/generators/components/GeneratePropsCpp.js +126 -0
- package/lib/generators/components/GeneratePropsCpp.js.flow +161 -0
- package/lib/generators/components/GeneratePropsH.js +606 -0
- package/lib/generators/components/GeneratePropsH.js.flow +778 -0
- package/lib/generators/components/GeneratePropsJavaDelegate.js +287 -0
- package/lib/generators/components/GeneratePropsJavaDelegate.js.flow +348 -0
- package/lib/generators/components/GeneratePropsJavaInterface.js +237 -0
- package/lib/generators/components/GeneratePropsJavaInterface.js.flow +288 -0
- package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js +157 -0
- package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js.flow +187 -0
- package/lib/generators/components/GeneratePropsJavaPojo/index.js +66 -0
- package/lib/generators/components/GeneratePropsJavaPojo/index.js.flow +80 -0
- package/lib/generators/components/GeneratePropsJavaPojo/serializePojo.js +273 -0
- package/lib/generators/components/GeneratePropsJavaPojo/serializePojo.js.flow +296 -0
- package/lib/generators/components/GenerateShadowNodeCpp.js +73 -0
- package/lib/generators/components/GenerateShadowNodeCpp.js.flow +95 -0
- package/lib/generators/components/GenerateShadowNodeH.js +91 -0
- package/lib/generators/components/GenerateShadowNodeH.js.flow +124 -0
- package/lib/generators/components/GenerateStateCpp.js +70 -0
- package/lib/generators/components/GenerateStateCpp.js.flow +92 -0
- package/lib/generators/components/GenerateStateH.js +93 -0
- package/lib/generators/components/GenerateStateH.js.flow +111 -0
- package/lib/generators/components/GenerateTests.js +165 -0
- package/lib/generators/components/GenerateTests.js.flow +219 -0
- package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js +91 -0
- package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js.flow +107 -0
- package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js +89 -0
- package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js.flow +105 -0
- package/lib/generators/components/GenerateViewConfigJs.js +410 -0
- package/lib/generators/components/GenerateViewConfigJs.js.flow +484 -0
- package/lib/generators/components/JavaHelpers.js +87 -0
- package/lib/generators/components/JavaHelpers.js.flow +119 -0
- package/lib/generators/components/__test_fixtures__/fixtures.js +1641 -0
- package/lib/generators/components/__test_fixtures__/fixtures.js.flow +1672 -0
- package/lib/generators/modules/GenerateModuleCpp.js +299 -0
- package/lib/generators/modules/GenerateModuleCpp.js.flow +278 -0
- package/lib/generators/modules/GenerateModuleH.js +373 -0
- package/lib/generators/modules/GenerateModuleH.js.flow +355 -0
- package/lib/generators/modules/GenerateModuleJavaSpec.js +571 -0
- package/lib/generators/modules/GenerateModuleJavaSpec.js.flow +553 -0
- package/lib/generators/modules/GenerateModuleJniCpp.js +505 -0
- package/lib/generators/modules/GenerateModuleJniCpp.js.flow +523 -0
- package/lib/generators/modules/GenerateModuleJniH.js +138 -0
- package/lib/generators/modules/GenerateModuleJniH.js.flow +148 -0
- package/lib/generators/modules/GenerateModuleObjCpp/StructCollector.js +262 -0
- package/lib/generators/modules/GenerateModuleObjCpp/StructCollector.js.flow +208 -0
- package/lib/generators/modules/GenerateModuleObjCpp/Utils.js +25 -0
- package/lib/generators/modules/GenerateModuleObjCpp/Utils.js.flow +32 -0
- package/lib/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js +337 -0
- package/lib/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js.flow +288 -0
- package/lib/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js +330 -0
- package/lib/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js.flow +279 -0
- package/lib/generators/modules/GenerateModuleObjCpp/header/serializeStruct.js +25 -0
- package/lib/generators/modules/GenerateModuleObjCpp/header/serializeStruct.js.flow +35 -0
- package/lib/generators/modules/GenerateModuleObjCpp/index.js +185 -0
- package/lib/generators/modules/GenerateModuleObjCpp/index.js.flow +219 -0
- package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js +529 -0
- package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js.flow +510 -0
- package/lib/generators/modules/GenerateModuleObjCpp/source/serializeModule.js +96 -0
- package/lib/generators/modules/GenerateModuleObjCpp/source/serializeModule.js.flow +121 -0
- package/lib/generators/modules/Utils.js +34 -0
- package/lib/generators/modules/Utils.js.flow +53 -0
- package/lib/generators/modules/__test_fixtures__/fixtures.js +1658 -0
- package/lib/generators/modules/__test_fixtures__/fixtures.js.flow +1669 -0
- package/lib/parsers/consistency/compareSnaps.js +84 -0
- package/lib/parsers/error-utils.js +284 -0
- package/lib/parsers/error-utils.js.flow +295 -0
- package/lib/parsers/errors.js +350 -0
- package/lib/parsers/errors.js.flow +439 -0
- package/lib/parsers/flow/components/__test_fixtures__/failures.js +583 -0
- package/lib/parsers/flow/components/__test_fixtures__/failures.js.flow +600 -0
- package/lib/parsers/flow/components/__test_fixtures__/fixtures.js +1001 -0
- package/lib/parsers/flow/components/__test_fixtures__/fixtures.js.flow +1016 -0
- package/lib/parsers/flow/components/commands.js +104 -0
- package/lib/parsers/flow/components/commands.js.flow +123 -0
- package/lib/parsers/flow/components/componentsUtils.js +446 -0
- package/lib/parsers/flow/components/componentsUtils.js.flow +496 -0
- package/lib/parsers/flow/components/events.js +233 -0
- package/lib/parsers/flow/components/events.js.flow +262 -0
- package/lib/parsers/flow/components/extends.js +52 -0
- package/lib/parsers/flow/components/extends.js.flow +66 -0
- package/lib/parsers/flow/components/index.js +267 -0
- package/lib/parsers/flow/components/index.js.flow +226 -0
- package/lib/parsers/flow/components/options.js +72 -0
- package/lib/parsers/flow/components/options.js.flow +87 -0
- package/lib/parsers/flow/components/props.js +47 -0
- package/lib/parsers/flow/components/props.js.flow +60 -0
- package/lib/parsers/flow/components/schema.js +106 -0
- package/lib/parsers/flow/components/schema.js.flow +62 -0
- package/lib/parsers/flow/index.js +80 -0
- package/lib/parsers/flow/index.js.flow +85 -0
- package/lib/parsers/flow/modules/__test_fixtures__/failures.js +215 -0
- package/lib/parsers/flow/modules/__test_fixtures__/failures.js.flow +223 -0
- package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js +724 -0
- package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js.flow +747 -0
- package/lib/parsers/flow/modules/index.js +528 -0
- package/lib/parsers/flow/modules/index.js.flow +420 -0
- package/lib/parsers/flow/parser.js +109 -0
- package/lib/parsers/flow/parser.js.flow +83 -0
- package/lib/parsers/flow/utils.js +108 -0
- package/lib/parsers/flow/utils.js.flow +123 -0
- package/lib/parsers/parser.js +11 -0
- package/lib/parsers/parser.js.flow +70 -0
- package/lib/parsers/parserMock.js +96 -0
- package/lib/parsers/parserMock.js.flow +68 -0
- package/lib/parsers/parsers-commons.js +448 -0
- package/lib/parsers/parsers-commons.js.flow +447 -0
- package/lib/parsers/parsers-primitives.js +387 -0
- package/lib/parsers/parsers-primitives.js.flow +383 -0
- package/lib/parsers/parsers-utils.js +18 -0
- package/lib/parsers/parsers-utils.js.flow +19 -0
- package/lib/parsers/schema/index.js +23 -0
- package/lib/parsers/schema/index.js.flow +26 -0
- package/lib/parsers/typescript/components/__test_fixtures__/failures.js +489 -0
- package/lib/parsers/typescript/components/__test_fixtures__/failures.js.flow +505 -0
- package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js +1151 -0
- package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js.flow +1168 -0
- package/lib/parsers/typescript/components/commands.js +132 -0
- package/lib/parsers/typescript/components/commands.js.flow +151 -0
- package/lib/parsers/typescript/components/componentsUtils.js +471 -0
- package/lib/parsers/typescript/components/componentsUtils.js.flow +521 -0
- package/lib/parsers/typescript/components/events.js +240 -0
- package/lib/parsers/typescript/components/events.js.flow +262 -0
- package/lib/parsers/typescript/components/extends.js +88 -0
- package/lib/parsers/typescript/components/extends.js.flow +103 -0
- package/lib/parsers/typescript/components/index.js +277 -0
- package/lib/parsers/typescript/components/index.js.flow +239 -0
- package/lib/parsers/typescript/components/options.js +72 -0
- package/lib/parsers/typescript/components/options.js.flow +87 -0
- package/lib/parsers/typescript/components/props.js +39 -0
- package/lib/parsers/typescript/components/props.js.flow +48 -0
- package/lib/parsers/typescript/components/schema.js +106 -0
- package/lib/parsers/typescript/components/schema.js.flow +62 -0
- package/lib/parsers/typescript/index.js +85 -0
- package/lib/parsers/typescript/index.js.flow +94 -0
- package/lib/parsers/typescript/modules/__test_fixtures__/failures.js +160 -0
- package/lib/parsers/typescript/modules/__test_fixtures__/failures.js.flow +167 -0
- package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js +701 -0
- package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js.flow +727 -0
- package/lib/parsers/typescript/modules/index.js +543 -0
- package/lib/parsers/typescript/modules/index.js.flow +435 -0
- package/lib/parsers/typescript/parseTopLevelType.js +203 -0
- package/lib/parsers/typescript/parseTopLevelType.js.flow +243 -0
- package/lib/parsers/typescript/parser.js +105 -0
- package/lib/parsers/typescript/parser.js.flow +87 -0
- package/lib/parsers/typescript/utils.js +101 -0
- package/lib/parsers/typescript/utils.js.flow +115 -0
- package/lib/parsers/utils.js +273 -0
- package/lib/parsers/utils.js.flow +266 -0
- package/package.json +45 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
*
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
function getPropertyType(
|
|
14
|
+
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
15
|
+
* LTI update could not be added via codemod */
|
|
16
|
+
name,
|
|
17
|
+
optional,
|
|
18
|
+
typeAnnotation,
|
|
19
|
+
) {
|
|
20
|
+
const type =
|
|
21
|
+
typeAnnotation.type === 'GenericTypeAnnotation'
|
|
22
|
+
? typeAnnotation.id.name
|
|
23
|
+
: typeAnnotation.type;
|
|
24
|
+
switch (type) {
|
|
25
|
+
case 'BooleanTypeAnnotation':
|
|
26
|
+
return {
|
|
27
|
+
name,
|
|
28
|
+
optional,
|
|
29
|
+
typeAnnotation: {
|
|
30
|
+
type: 'BooleanTypeAnnotation',
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
case 'StringTypeAnnotation':
|
|
34
|
+
return {
|
|
35
|
+
name,
|
|
36
|
+
optional,
|
|
37
|
+
typeAnnotation: {
|
|
38
|
+
type: 'StringTypeAnnotation',
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
case 'Int32':
|
|
42
|
+
return {
|
|
43
|
+
name,
|
|
44
|
+
optional,
|
|
45
|
+
typeAnnotation: {
|
|
46
|
+
type: 'Int32TypeAnnotation',
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
case 'Double':
|
|
50
|
+
return {
|
|
51
|
+
name,
|
|
52
|
+
optional,
|
|
53
|
+
typeAnnotation: {
|
|
54
|
+
type: 'DoubleTypeAnnotation',
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
case 'Float':
|
|
58
|
+
return {
|
|
59
|
+
name,
|
|
60
|
+
optional,
|
|
61
|
+
typeAnnotation: {
|
|
62
|
+
type: 'FloatTypeAnnotation',
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
case '$ReadOnly':
|
|
66
|
+
return getPropertyType(
|
|
67
|
+
name,
|
|
68
|
+
optional,
|
|
69
|
+
typeAnnotation.typeParameters.params[0],
|
|
70
|
+
);
|
|
71
|
+
case 'ObjectTypeAnnotation':
|
|
72
|
+
return {
|
|
73
|
+
name,
|
|
74
|
+
optional,
|
|
75
|
+
typeAnnotation: {
|
|
76
|
+
type: 'ObjectTypeAnnotation',
|
|
77
|
+
properties: typeAnnotation.properties.map(buildPropertiesForEvent),
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
case 'UnionTypeAnnotation':
|
|
81
|
+
return {
|
|
82
|
+
name,
|
|
83
|
+
optional,
|
|
84
|
+
typeAnnotation: {
|
|
85
|
+
type: 'StringEnumTypeAnnotation',
|
|
86
|
+
options: typeAnnotation.types.map(option => option.value),
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
default:
|
|
90
|
+
type;
|
|
91
|
+
throw new Error(`Unable to determine event type for "${name}": ${type}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function findEventArgumentsAndType(
|
|
95
|
+
typeAnnotation,
|
|
96
|
+
types,
|
|
97
|
+
bubblingType,
|
|
98
|
+
paperName,
|
|
99
|
+
) {
|
|
100
|
+
if (!typeAnnotation.id) {
|
|
101
|
+
throw new Error("typeAnnotation of event doesn't have a name");
|
|
102
|
+
}
|
|
103
|
+
const name = typeAnnotation.id.name;
|
|
104
|
+
if (name === '$ReadOnly') {
|
|
105
|
+
return {
|
|
106
|
+
argumentProps: typeAnnotation.typeParameters.params[0].properties,
|
|
107
|
+
paperTopLevelNameDeprecated: paperName,
|
|
108
|
+
bubblingType,
|
|
109
|
+
};
|
|
110
|
+
} else if (name === 'BubblingEventHandler' || name === 'DirectEventHandler') {
|
|
111
|
+
const eventType = name === 'BubblingEventHandler' ? 'bubble' : 'direct';
|
|
112
|
+
const paperTopLevelNameDeprecated =
|
|
113
|
+
typeAnnotation.typeParameters.params.length > 1
|
|
114
|
+
? typeAnnotation.typeParameters.params[1].value
|
|
115
|
+
: null;
|
|
116
|
+
if (
|
|
117
|
+
typeAnnotation.typeParameters.params[0].type ===
|
|
118
|
+
'NullLiteralTypeAnnotation'
|
|
119
|
+
) {
|
|
120
|
+
return {
|
|
121
|
+
argumentProps: [],
|
|
122
|
+
bubblingType: eventType,
|
|
123
|
+
paperTopLevelNameDeprecated,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
return findEventArgumentsAndType(
|
|
127
|
+
typeAnnotation.typeParameters.params[0],
|
|
128
|
+
types,
|
|
129
|
+
eventType,
|
|
130
|
+
paperTopLevelNameDeprecated,
|
|
131
|
+
);
|
|
132
|
+
} else if (types[name]) {
|
|
133
|
+
return findEventArgumentsAndType(
|
|
134
|
+
types[name].right,
|
|
135
|
+
types,
|
|
136
|
+
bubblingType,
|
|
137
|
+
paperName,
|
|
138
|
+
);
|
|
139
|
+
} else {
|
|
140
|
+
return {
|
|
141
|
+
argumentProps: null,
|
|
142
|
+
bubblingType: null,
|
|
143
|
+
paperTopLevelNameDeprecated: null,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
149
|
+
* LTI update could not be added via codemod */
|
|
150
|
+
function buildPropertiesForEvent(property) {
|
|
151
|
+
const name = property.key.name;
|
|
152
|
+
const optional =
|
|
153
|
+
property.value.type === 'NullableTypeAnnotation' || property.optional;
|
|
154
|
+
let typeAnnotation =
|
|
155
|
+
property.value.type === 'NullableTypeAnnotation'
|
|
156
|
+
? property.value.typeAnnotation
|
|
157
|
+
: property.value;
|
|
158
|
+
return getPropertyType(name, optional, typeAnnotation);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
162
|
+
* LTI update could not be added via codemod */
|
|
163
|
+
function getEventArgument(argumentProps, name) {
|
|
164
|
+
return {
|
|
165
|
+
type: 'ObjectTypeAnnotation',
|
|
166
|
+
properties: argumentProps.map(buildPropertiesForEvent),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
function buildEventSchema(types, property) {
|
|
170
|
+
const name = property.key.name;
|
|
171
|
+
const optional =
|
|
172
|
+
property.optional || property.value.type === 'NullableTypeAnnotation';
|
|
173
|
+
let typeAnnotation =
|
|
174
|
+
property.value.type === 'NullableTypeAnnotation'
|
|
175
|
+
? property.value.typeAnnotation
|
|
176
|
+
: property.value;
|
|
177
|
+
if (
|
|
178
|
+
typeAnnotation.type !== 'GenericTypeAnnotation' ||
|
|
179
|
+
(typeAnnotation.id.name !== 'BubblingEventHandler' &&
|
|
180
|
+
typeAnnotation.id.name !== 'DirectEventHandler')
|
|
181
|
+
) {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
const _findEventArgumentsAn = findEventArgumentsAndType(
|
|
185
|
+
typeAnnotation,
|
|
186
|
+
types,
|
|
187
|
+
),
|
|
188
|
+
argumentProps = _findEventArgumentsAn.argumentProps,
|
|
189
|
+
bubblingType = _findEventArgumentsAn.bubblingType,
|
|
190
|
+
paperTopLevelNameDeprecated =
|
|
191
|
+
_findEventArgumentsAn.paperTopLevelNameDeprecated;
|
|
192
|
+
if (bubblingType && argumentProps) {
|
|
193
|
+
if (paperTopLevelNameDeprecated != null) {
|
|
194
|
+
return {
|
|
195
|
+
name,
|
|
196
|
+
optional,
|
|
197
|
+
bubblingType,
|
|
198
|
+
paperTopLevelNameDeprecated,
|
|
199
|
+
typeAnnotation: {
|
|
200
|
+
type: 'EventTypeAnnotation',
|
|
201
|
+
argument: getEventArgument(argumentProps, name),
|
|
202
|
+
},
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
name,
|
|
207
|
+
optional,
|
|
208
|
+
bubblingType,
|
|
209
|
+
typeAnnotation: {
|
|
210
|
+
type: 'EventTypeAnnotation',
|
|
211
|
+
argument: getEventArgument(argumentProps, name),
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
if (argumentProps === null) {
|
|
216
|
+
throw new Error(`Unable to determine event arguments for "${name}"`);
|
|
217
|
+
}
|
|
218
|
+
if (bubblingType === null) {
|
|
219
|
+
throw new Error(`Unable to determine event arguments for "${name}"`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// $FlowFixMe[unclear-type] there's no flowtype for ASTs
|
|
224
|
+
|
|
225
|
+
function getEvents(eventTypeAST, types) {
|
|
226
|
+
return eventTypeAST
|
|
227
|
+
.filter(property => property.type === 'ObjectTypeProperty')
|
|
228
|
+
.map(property => buildEventSchema(types, property))
|
|
229
|
+
.filter(Boolean);
|
|
230
|
+
}
|
|
231
|
+
module.exports = {
|
|
232
|
+
getEvents,
|
|
233
|
+
};
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
* @flow strict-local
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
import type {
|
|
14
|
+
EventTypeShape,
|
|
15
|
+
NamedShape,
|
|
16
|
+
EventTypeAnnotation,
|
|
17
|
+
} from '../../../CodegenSchema.js';
|
|
18
|
+
|
|
19
|
+
function getPropertyType(
|
|
20
|
+
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
21
|
+
* LTI update could not be added via codemod */
|
|
22
|
+
name,
|
|
23
|
+
optional: boolean,
|
|
24
|
+
typeAnnotation: $FlowFixMe,
|
|
25
|
+
): NamedShape<EventTypeAnnotation> {
|
|
26
|
+
const type =
|
|
27
|
+
typeAnnotation.type === 'GenericTypeAnnotation'
|
|
28
|
+
? typeAnnotation.id.name
|
|
29
|
+
: typeAnnotation.type;
|
|
30
|
+
|
|
31
|
+
switch (type) {
|
|
32
|
+
case 'BooleanTypeAnnotation':
|
|
33
|
+
return {
|
|
34
|
+
name,
|
|
35
|
+
optional,
|
|
36
|
+
typeAnnotation: {
|
|
37
|
+
type: 'BooleanTypeAnnotation',
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
case 'StringTypeAnnotation':
|
|
41
|
+
return {
|
|
42
|
+
name,
|
|
43
|
+
optional,
|
|
44
|
+
typeAnnotation: {
|
|
45
|
+
type: 'StringTypeAnnotation',
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
case 'Int32':
|
|
49
|
+
return {
|
|
50
|
+
name,
|
|
51
|
+
optional,
|
|
52
|
+
typeAnnotation: {
|
|
53
|
+
type: 'Int32TypeAnnotation',
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
case 'Double':
|
|
57
|
+
return {
|
|
58
|
+
name,
|
|
59
|
+
optional,
|
|
60
|
+
typeAnnotation: {
|
|
61
|
+
type: 'DoubleTypeAnnotation',
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
case 'Float':
|
|
65
|
+
return {
|
|
66
|
+
name,
|
|
67
|
+
optional,
|
|
68
|
+
typeAnnotation: {
|
|
69
|
+
type: 'FloatTypeAnnotation',
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
case '$ReadOnly':
|
|
73
|
+
return getPropertyType(
|
|
74
|
+
name,
|
|
75
|
+
optional,
|
|
76
|
+
typeAnnotation.typeParameters.params[0],
|
|
77
|
+
);
|
|
78
|
+
case 'ObjectTypeAnnotation':
|
|
79
|
+
return {
|
|
80
|
+
name,
|
|
81
|
+
optional,
|
|
82
|
+
typeAnnotation: {
|
|
83
|
+
type: 'ObjectTypeAnnotation',
|
|
84
|
+
properties: typeAnnotation.properties.map(buildPropertiesForEvent),
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
case 'UnionTypeAnnotation':
|
|
88
|
+
return {
|
|
89
|
+
name,
|
|
90
|
+
optional,
|
|
91
|
+
typeAnnotation: {
|
|
92
|
+
type: 'StringEnumTypeAnnotation',
|
|
93
|
+
options: typeAnnotation.types.map(option => option.value),
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
default:
|
|
97
|
+
(type: empty);
|
|
98
|
+
throw new Error(`Unable to determine event type for "${name}": ${type}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function findEventArgumentsAndType(
|
|
103
|
+
typeAnnotation: $FlowFixMe,
|
|
104
|
+
types: TypeMap,
|
|
105
|
+
bubblingType: void | 'direct' | 'bubble',
|
|
106
|
+
paperName: ?$FlowFixMe,
|
|
107
|
+
): {
|
|
108
|
+
argumentProps: $FlowFixMe,
|
|
109
|
+
bubblingType: ?('direct' | 'bubble'),
|
|
110
|
+
paperTopLevelNameDeprecated: ?$FlowFixMe,
|
|
111
|
+
} {
|
|
112
|
+
if (!typeAnnotation.id) {
|
|
113
|
+
throw new Error("typeAnnotation of event doesn't have a name");
|
|
114
|
+
}
|
|
115
|
+
const name = typeAnnotation.id.name;
|
|
116
|
+
if (name === '$ReadOnly') {
|
|
117
|
+
return {
|
|
118
|
+
argumentProps: typeAnnotation.typeParameters.params[0].properties,
|
|
119
|
+
paperTopLevelNameDeprecated: paperName,
|
|
120
|
+
bubblingType,
|
|
121
|
+
};
|
|
122
|
+
} else if (name === 'BubblingEventHandler' || name === 'DirectEventHandler') {
|
|
123
|
+
const eventType = name === 'BubblingEventHandler' ? 'bubble' : 'direct';
|
|
124
|
+
const paperTopLevelNameDeprecated =
|
|
125
|
+
typeAnnotation.typeParameters.params.length > 1
|
|
126
|
+
? typeAnnotation.typeParameters.params[1].value
|
|
127
|
+
: null;
|
|
128
|
+
if (
|
|
129
|
+
typeAnnotation.typeParameters.params[0].type ===
|
|
130
|
+
'NullLiteralTypeAnnotation'
|
|
131
|
+
) {
|
|
132
|
+
return {
|
|
133
|
+
argumentProps: [],
|
|
134
|
+
bubblingType: eventType,
|
|
135
|
+
paperTopLevelNameDeprecated,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
return findEventArgumentsAndType(
|
|
139
|
+
typeAnnotation.typeParameters.params[0],
|
|
140
|
+
types,
|
|
141
|
+
eventType,
|
|
142
|
+
paperTopLevelNameDeprecated,
|
|
143
|
+
);
|
|
144
|
+
} else if (types[name]) {
|
|
145
|
+
return findEventArgumentsAndType(
|
|
146
|
+
types[name].right,
|
|
147
|
+
types,
|
|
148
|
+
bubblingType,
|
|
149
|
+
paperName,
|
|
150
|
+
);
|
|
151
|
+
} else {
|
|
152
|
+
return {
|
|
153
|
+
argumentProps: null,
|
|
154
|
+
bubblingType: null,
|
|
155
|
+
paperTopLevelNameDeprecated: null,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
161
|
+
* LTI update could not be added via codemod */
|
|
162
|
+
function buildPropertiesForEvent(property): NamedShape<EventTypeAnnotation> {
|
|
163
|
+
const name = property.key.name;
|
|
164
|
+
const optional =
|
|
165
|
+
property.value.type === 'NullableTypeAnnotation' || property.optional;
|
|
166
|
+
let typeAnnotation =
|
|
167
|
+
property.value.type === 'NullableTypeAnnotation'
|
|
168
|
+
? property.value.typeAnnotation
|
|
169
|
+
: property.value;
|
|
170
|
+
|
|
171
|
+
return getPropertyType(name, optional, typeAnnotation);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
175
|
+
* LTI update could not be added via codemod */
|
|
176
|
+
function getEventArgument(argumentProps, name: $FlowFixMe) {
|
|
177
|
+
return {
|
|
178
|
+
type: 'ObjectTypeAnnotation',
|
|
179
|
+
properties: argumentProps.map(buildPropertiesForEvent),
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function buildEventSchema(
|
|
184
|
+
types: TypeMap,
|
|
185
|
+
property: EventTypeAST,
|
|
186
|
+
): ?EventTypeShape {
|
|
187
|
+
const name = property.key.name;
|
|
188
|
+
const optional =
|
|
189
|
+
property.optional || property.value.type === 'NullableTypeAnnotation';
|
|
190
|
+
|
|
191
|
+
let typeAnnotation =
|
|
192
|
+
property.value.type === 'NullableTypeAnnotation'
|
|
193
|
+
? property.value.typeAnnotation
|
|
194
|
+
: property.value;
|
|
195
|
+
|
|
196
|
+
if (
|
|
197
|
+
typeAnnotation.type !== 'GenericTypeAnnotation' ||
|
|
198
|
+
(typeAnnotation.id.name !== 'BubblingEventHandler' &&
|
|
199
|
+
typeAnnotation.id.name !== 'DirectEventHandler')
|
|
200
|
+
) {
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const {argumentProps, bubblingType, paperTopLevelNameDeprecated} =
|
|
205
|
+
findEventArgumentsAndType(typeAnnotation, types);
|
|
206
|
+
|
|
207
|
+
if (bubblingType && argumentProps) {
|
|
208
|
+
if (paperTopLevelNameDeprecated != null) {
|
|
209
|
+
return {
|
|
210
|
+
name,
|
|
211
|
+
optional,
|
|
212
|
+
bubblingType,
|
|
213
|
+
paperTopLevelNameDeprecated,
|
|
214
|
+
typeAnnotation: {
|
|
215
|
+
type: 'EventTypeAnnotation',
|
|
216
|
+
argument: getEventArgument(argumentProps, name),
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
return {
|
|
222
|
+
name,
|
|
223
|
+
optional,
|
|
224
|
+
bubblingType,
|
|
225
|
+
typeAnnotation: {
|
|
226
|
+
type: 'EventTypeAnnotation',
|
|
227
|
+
argument: getEventArgument(argumentProps, name),
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
if (argumentProps === null) {
|
|
233
|
+
throw new Error(`Unable to determine event arguments for "${name}"`);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (bubblingType === null) {
|
|
237
|
+
throw new Error(`Unable to determine event arguments for "${name}"`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// $FlowFixMe[unclear-type] there's no flowtype for ASTs
|
|
242
|
+
type EventTypeAST = Object;
|
|
243
|
+
|
|
244
|
+
type TypeMap = {
|
|
245
|
+
// $FlowFixMe[unclear-type] there's no flowtype for ASTs
|
|
246
|
+
[string]: Object,
|
|
247
|
+
...
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
function getEvents(
|
|
251
|
+
eventTypeAST: $ReadOnlyArray<EventTypeAST>,
|
|
252
|
+
types: TypeMap,
|
|
253
|
+
): $ReadOnlyArray<EventTypeShape> {
|
|
254
|
+
return eventTypeAST
|
|
255
|
+
.filter(property => property.type === 'ObjectTypeProperty')
|
|
256
|
+
.map(property => buildEventSchema(types, property))
|
|
257
|
+
.filter(Boolean);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
module.exports = {
|
|
261
|
+
getEvents,
|
|
262
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
*
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
function extendsForProp(prop, types) {
|
|
14
|
+
if (!prop.argument) {
|
|
15
|
+
console.log('null', prop);
|
|
16
|
+
}
|
|
17
|
+
const name = prop.argument.id.name;
|
|
18
|
+
if (types[name] != null) {
|
|
19
|
+
// This type is locally defined in the file
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
switch (name) {
|
|
23
|
+
case 'ViewProps':
|
|
24
|
+
return {
|
|
25
|
+
type: 'ReactNativeBuiltInType',
|
|
26
|
+
knownTypeName: 'ReactNativeCoreViewProps',
|
|
27
|
+
};
|
|
28
|
+
default: {
|
|
29
|
+
throw new Error(`Unable to handle prop spread: ${name}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function removeKnownExtends(typeDefinition, types) {
|
|
34
|
+
return typeDefinition.filter(
|
|
35
|
+
prop =>
|
|
36
|
+
prop.type !== 'ObjectTypeSpreadProperty' ||
|
|
37
|
+
extendsForProp(prop, types) === null,
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// $FlowFixMe[unclear-type] there's no flowtype for ASTs
|
|
42
|
+
|
|
43
|
+
function getExtendsProps(typeDefinition, types) {
|
|
44
|
+
return typeDefinition
|
|
45
|
+
.filter(prop => prop.type === 'ObjectTypeSpreadProperty')
|
|
46
|
+
.map(prop => extendsForProp(prop, types))
|
|
47
|
+
.filter(Boolean);
|
|
48
|
+
}
|
|
49
|
+
module.exports = {
|
|
50
|
+
getExtendsProps,
|
|
51
|
+
removeKnownExtends,
|
|
52
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
* @flow strict-local
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
import type {ExtendsPropsShape} from '../../../CodegenSchema.js';
|
|
14
|
+
import type {TypeDeclarationMap} from '../../utils';
|
|
15
|
+
|
|
16
|
+
function extendsForProp(prop: PropsAST, types: TypeDeclarationMap) {
|
|
17
|
+
if (!prop.argument) {
|
|
18
|
+
console.log('null', prop);
|
|
19
|
+
}
|
|
20
|
+
const name = prop.argument.id.name;
|
|
21
|
+
|
|
22
|
+
if (types[name] != null) {
|
|
23
|
+
// This type is locally defined in the file
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
switch (name) {
|
|
28
|
+
case 'ViewProps':
|
|
29
|
+
return {
|
|
30
|
+
type: 'ReactNativeBuiltInType',
|
|
31
|
+
knownTypeName: 'ReactNativeCoreViewProps',
|
|
32
|
+
};
|
|
33
|
+
default: {
|
|
34
|
+
throw new Error(`Unable to handle prop spread: ${name}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function removeKnownExtends(
|
|
40
|
+
typeDefinition: $ReadOnlyArray<PropsAST>,
|
|
41
|
+
types: TypeDeclarationMap,
|
|
42
|
+
): $ReadOnlyArray<PropsAST> {
|
|
43
|
+
return typeDefinition.filter(
|
|
44
|
+
prop =>
|
|
45
|
+
prop.type !== 'ObjectTypeSpreadProperty' ||
|
|
46
|
+
extendsForProp(prop, types) === null,
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// $FlowFixMe[unclear-type] there's no flowtype for ASTs
|
|
51
|
+
type PropsAST = Object;
|
|
52
|
+
|
|
53
|
+
function getExtendsProps(
|
|
54
|
+
typeDefinition: $ReadOnlyArray<PropsAST>,
|
|
55
|
+
types: TypeDeclarationMap,
|
|
56
|
+
): $ReadOnlyArray<ExtendsPropsShape> {
|
|
57
|
+
return typeDefinition
|
|
58
|
+
.filter(prop => prop.type === 'ObjectTypeSpreadProperty')
|
|
59
|
+
.map(prop => extendsForProp(prop, types))
|
|
60
|
+
.filter(Boolean);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
module.exports = {
|
|
64
|
+
getExtendsProps,
|
|
65
|
+
removeKnownExtends,
|
|
66
|
+
};
|