@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,240 @@
|
|
|
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
|
+
const _require = require('./componentsUtils'),
|
|
14
|
+
flattenProperties = _require.flattenProperties;
|
|
15
|
+
const _require2 = require('../parseTopLevelType'),
|
|
16
|
+
parseTopLevelType = _require2.parseTopLevelType;
|
|
17
|
+
function getPropertyType(
|
|
18
|
+
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
19
|
+
* LTI update could not be added via codemod */
|
|
20
|
+
name,
|
|
21
|
+
optionalProperty,
|
|
22
|
+
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
23
|
+
* LTI update could not be added via codemod */
|
|
24
|
+
annotation,
|
|
25
|
+
) {
|
|
26
|
+
const topLevelType = parseTopLevelType(annotation);
|
|
27
|
+
const typeAnnotation = topLevelType.type;
|
|
28
|
+
const optional = optionalProperty || topLevelType.optional;
|
|
29
|
+
const type =
|
|
30
|
+
typeAnnotation.type === 'TSTypeReference'
|
|
31
|
+
? typeAnnotation.typeName.name
|
|
32
|
+
: typeAnnotation.type;
|
|
33
|
+
switch (type) {
|
|
34
|
+
case 'TSBooleanKeyword':
|
|
35
|
+
return {
|
|
36
|
+
name,
|
|
37
|
+
optional,
|
|
38
|
+
typeAnnotation: {
|
|
39
|
+
type: 'BooleanTypeAnnotation',
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
case 'TSStringKeyword':
|
|
43
|
+
return {
|
|
44
|
+
name,
|
|
45
|
+
optional,
|
|
46
|
+
typeAnnotation: {
|
|
47
|
+
type: 'StringTypeAnnotation',
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
case 'Int32':
|
|
51
|
+
return {
|
|
52
|
+
name,
|
|
53
|
+
optional,
|
|
54
|
+
typeAnnotation: {
|
|
55
|
+
type: 'Int32TypeAnnotation',
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
case 'Double':
|
|
59
|
+
return {
|
|
60
|
+
name,
|
|
61
|
+
optional,
|
|
62
|
+
typeAnnotation: {
|
|
63
|
+
type: 'DoubleTypeAnnotation',
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
case 'Float':
|
|
67
|
+
return {
|
|
68
|
+
name,
|
|
69
|
+
optional,
|
|
70
|
+
typeAnnotation: {
|
|
71
|
+
type: 'FloatTypeAnnotation',
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
case 'TSTypeLiteral':
|
|
75
|
+
return {
|
|
76
|
+
name,
|
|
77
|
+
optional,
|
|
78
|
+
typeAnnotation: {
|
|
79
|
+
type: 'ObjectTypeAnnotation',
|
|
80
|
+
properties: typeAnnotation.members.map(buildPropertiesForEvent),
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
case 'TSUnionType':
|
|
84
|
+
return {
|
|
85
|
+
name,
|
|
86
|
+
optional,
|
|
87
|
+
typeAnnotation: {
|
|
88
|
+
type: 'StringEnumTypeAnnotation',
|
|
89
|
+
options: typeAnnotation.types.map(option => option.literal.value),
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
default:
|
|
93
|
+
type;
|
|
94
|
+
throw new Error(`Unable to determine event type for "${name}": ${type}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function findEventArgumentsAndType(
|
|
98
|
+
typeAnnotation,
|
|
99
|
+
types,
|
|
100
|
+
bubblingType,
|
|
101
|
+
paperName,
|
|
102
|
+
) {
|
|
103
|
+
if (typeAnnotation.type === 'TSInterfaceDeclaration') {
|
|
104
|
+
return {
|
|
105
|
+
argumentProps: flattenProperties([typeAnnotation], types),
|
|
106
|
+
paperTopLevelNameDeprecated: paperName,
|
|
107
|
+
bubblingType,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
if (typeAnnotation.type === 'TSTypeLiteral') {
|
|
111
|
+
return {
|
|
112
|
+
argumentProps: typeAnnotation.members,
|
|
113
|
+
paperTopLevelNameDeprecated: paperName,
|
|
114
|
+
bubblingType,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
if (!typeAnnotation.typeName) {
|
|
118
|
+
throw new Error("typeAnnotation of event doesn't have a name");
|
|
119
|
+
}
|
|
120
|
+
const name = typeAnnotation.typeName.name;
|
|
121
|
+
if (name === 'Readonly') {
|
|
122
|
+
return findEventArgumentsAndType(
|
|
123
|
+
typeAnnotation.typeParameters.params[0],
|
|
124
|
+
types,
|
|
125
|
+
bubblingType,
|
|
126
|
+
paperName,
|
|
127
|
+
);
|
|
128
|
+
} else if (name === 'BubblingEventHandler' || name === 'DirectEventHandler') {
|
|
129
|
+
const eventType = name === 'BubblingEventHandler' ? 'bubble' : 'direct';
|
|
130
|
+
const paperTopLevelNameDeprecated =
|
|
131
|
+
typeAnnotation.typeParameters.params.length > 1
|
|
132
|
+
? typeAnnotation.typeParameters.params[1].literal.value
|
|
133
|
+
: null;
|
|
134
|
+
switch (typeAnnotation.typeParameters.params[0].type) {
|
|
135
|
+
case 'TSNullKeyword':
|
|
136
|
+
case 'TSUndefinedKeyword':
|
|
137
|
+
return {
|
|
138
|
+
argumentProps: [],
|
|
139
|
+
bubblingType: eventType,
|
|
140
|
+
paperTopLevelNameDeprecated,
|
|
141
|
+
};
|
|
142
|
+
default:
|
|
143
|
+
return findEventArgumentsAndType(
|
|
144
|
+
typeAnnotation.typeParameters.params[0],
|
|
145
|
+
types,
|
|
146
|
+
eventType,
|
|
147
|
+
paperTopLevelNameDeprecated,
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
} else if (types[name]) {
|
|
151
|
+
let elementType = types[name];
|
|
152
|
+
if (elementType.type === 'TSTypeAliasDeclaration') {
|
|
153
|
+
elementType = elementType.typeAnnotation;
|
|
154
|
+
}
|
|
155
|
+
return findEventArgumentsAndType(
|
|
156
|
+
elementType,
|
|
157
|
+
types,
|
|
158
|
+
bubblingType,
|
|
159
|
+
paperName,
|
|
160
|
+
);
|
|
161
|
+
} else {
|
|
162
|
+
return {
|
|
163
|
+
argumentProps: null,
|
|
164
|
+
bubblingType: null,
|
|
165
|
+
paperTopLevelNameDeprecated: null,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
171
|
+
* LTI update could not be added via codemod */
|
|
172
|
+
function buildPropertiesForEvent(property) {
|
|
173
|
+
const name = property.key.name;
|
|
174
|
+
const optional = property.optional || false;
|
|
175
|
+
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
|
+
};
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// $FlowFixMe[unclear-type] TODO(T108222691): Use flow-types for @babel/parser
|
|
189
|
+
|
|
190
|
+
function buildEventSchema(types, property) {
|
|
191
|
+
// unpack WithDefault, (T) or T|U
|
|
192
|
+
const topLevelType = parseTopLevelType(
|
|
193
|
+
property.typeAnnotation.typeAnnotation,
|
|
194
|
+
types,
|
|
195
|
+
);
|
|
196
|
+
const name = property.key.name;
|
|
197
|
+
const typeAnnotation = topLevelType.type;
|
|
198
|
+
const optional = property.optional || topLevelType.optional;
|
|
199
|
+
const _findEventArgumentsAn = findEventArgumentsAndType(
|
|
200
|
+
typeAnnotation,
|
|
201
|
+
types,
|
|
202
|
+
),
|
|
203
|
+
argumentProps = _findEventArgumentsAn.argumentProps,
|
|
204
|
+
bubblingType = _findEventArgumentsAn.bubblingType,
|
|
205
|
+
paperTopLevelNameDeprecated =
|
|
206
|
+
_findEventArgumentsAn.paperTopLevelNameDeprecated;
|
|
207
|
+
if (!argumentProps) {
|
|
208
|
+
throw new Error(`Unable to determine event arguments for "${name}"`);
|
|
209
|
+
} else if (!bubblingType) {
|
|
210
|
+
throw new Error(`Unable to determine event bubbling type for "${name}"`);
|
|
211
|
+
} else {
|
|
212
|
+
if (paperTopLevelNameDeprecated != null) {
|
|
213
|
+
return {
|
|
214
|
+
name,
|
|
215
|
+
optional,
|
|
216
|
+
bubblingType,
|
|
217
|
+
paperTopLevelNameDeprecated,
|
|
218
|
+
typeAnnotation: {
|
|
219
|
+
type: 'EventTypeAnnotation',
|
|
220
|
+
argument: getEventArgument(argumentProps, name),
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
name,
|
|
226
|
+
optional,
|
|
227
|
+
bubblingType,
|
|
228
|
+
typeAnnotation: {
|
|
229
|
+
type: 'EventTypeAnnotation',
|
|
230
|
+
argument: getEventArgument(argumentProps, name),
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
function getEvents(eventTypeAST, types) {
|
|
236
|
+
return eventTypeAST.map(property => buildEventSchema(types, property));
|
|
237
|
+
}
|
|
238
|
+
module.exports = {
|
|
239
|
+
getEvents,
|
|
240
|
+
};
|
|
@@ -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
|
+
import type {TypeDeclarationMap} from '../../utils';
|
|
19
|
+
const {flattenProperties} = require('./componentsUtils');
|
|
20
|
+
const {parseTopLevelType} = require('../parseTopLevelType');
|
|
21
|
+
|
|
22
|
+
function getPropertyType(
|
|
23
|
+
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
24
|
+
* LTI update could not be added via codemod */
|
|
25
|
+
name,
|
|
26
|
+
optionalProperty: boolean,
|
|
27
|
+
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
28
|
+
* LTI update could not be added via codemod */
|
|
29
|
+
annotation,
|
|
30
|
+
): NamedShape<EventTypeAnnotation> {
|
|
31
|
+
const topLevelType = parseTopLevelType(annotation);
|
|
32
|
+
const typeAnnotation = topLevelType.type;
|
|
33
|
+
const optional = optionalProperty || topLevelType.optional;
|
|
34
|
+
const type =
|
|
35
|
+
typeAnnotation.type === 'TSTypeReference'
|
|
36
|
+
? typeAnnotation.typeName.name
|
|
37
|
+
: typeAnnotation.type;
|
|
38
|
+
|
|
39
|
+
switch (type) {
|
|
40
|
+
case 'TSBooleanKeyword':
|
|
41
|
+
return {
|
|
42
|
+
name,
|
|
43
|
+
optional,
|
|
44
|
+
typeAnnotation: {
|
|
45
|
+
type: 'BooleanTypeAnnotation',
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
case 'TSStringKeyword':
|
|
49
|
+
return {
|
|
50
|
+
name,
|
|
51
|
+
optional,
|
|
52
|
+
typeAnnotation: {
|
|
53
|
+
type: 'StringTypeAnnotation',
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
case 'Int32':
|
|
57
|
+
return {
|
|
58
|
+
name,
|
|
59
|
+
optional,
|
|
60
|
+
typeAnnotation: {
|
|
61
|
+
type: 'Int32TypeAnnotation',
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
case 'Double':
|
|
65
|
+
return {
|
|
66
|
+
name,
|
|
67
|
+
optional,
|
|
68
|
+
typeAnnotation: {
|
|
69
|
+
type: 'DoubleTypeAnnotation',
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
case 'Float':
|
|
73
|
+
return {
|
|
74
|
+
name,
|
|
75
|
+
optional,
|
|
76
|
+
typeAnnotation: {
|
|
77
|
+
type: 'FloatTypeAnnotation',
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
case 'TSTypeLiteral':
|
|
81
|
+
return {
|
|
82
|
+
name,
|
|
83
|
+
optional,
|
|
84
|
+
typeAnnotation: {
|
|
85
|
+
type: 'ObjectTypeAnnotation',
|
|
86
|
+
properties: typeAnnotation.members.map(buildPropertiesForEvent),
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
case 'TSUnionType':
|
|
91
|
+
return {
|
|
92
|
+
name,
|
|
93
|
+
optional,
|
|
94
|
+
typeAnnotation: {
|
|
95
|
+
type: 'StringEnumTypeAnnotation',
|
|
96
|
+
options: typeAnnotation.types.map(option => option.literal.value),
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
default:
|
|
100
|
+
(type: empty);
|
|
101
|
+
throw new Error(`Unable to determine event type for "${name}": ${type}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function findEventArgumentsAndType(
|
|
106
|
+
typeAnnotation: $FlowFixMe,
|
|
107
|
+
types: TypeDeclarationMap,
|
|
108
|
+
bubblingType: void | 'direct' | 'bubble',
|
|
109
|
+
paperName: ?$FlowFixMe,
|
|
110
|
+
): {
|
|
111
|
+
argumentProps: ?$ReadOnlyArray<$FlowFixMe>,
|
|
112
|
+
paperTopLevelNameDeprecated: ?$FlowFixMe,
|
|
113
|
+
bubblingType: ?'direct' | 'bubble',
|
|
114
|
+
} {
|
|
115
|
+
if (typeAnnotation.type === 'TSInterfaceDeclaration') {
|
|
116
|
+
return {
|
|
117
|
+
argumentProps: flattenProperties([typeAnnotation], types),
|
|
118
|
+
paperTopLevelNameDeprecated: paperName,
|
|
119
|
+
bubblingType,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (typeAnnotation.type === 'TSTypeLiteral') {
|
|
124
|
+
return {
|
|
125
|
+
argumentProps: typeAnnotation.members,
|
|
126
|
+
paperTopLevelNameDeprecated: paperName,
|
|
127
|
+
bubblingType,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (!typeAnnotation.typeName) {
|
|
132
|
+
throw new Error("typeAnnotation of event doesn't have a name");
|
|
133
|
+
}
|
|
134
|
+
const name = typeAnnotation.typeName.name;
|
|
135
|
+
if (name === 'Readonly') {
|
|
136
|
+
return findEventArgumentsAndType(
|
|
137
|
+
typeAnnotation.typeParameters.params[0],
|
|
138
|
+
types,
|
|
139
|
+
bubblingType,
|
|
140
|
+
paperName,
|
|
141
|
+
);
|
|
142
|
+
} else if (name === 'BubblingEventHandler' || name === 'DirectEventHandler') {
|
|
143
|
+
const eventType = name === 'BubblingEventHandler' ? 'bubble' : 'direct';
|
|
144
|
+
const paperTopLevelNameDeprecated =
|
|
145
|
+
typeAnnotation.typeParameters.params.length > 1
|
|
146
|
+
? typeAnnotation.typeParameters.params[1].literal.value
|
|
147
|
+
: null;
|
|
148
|
+
|
|
149
|
+
switch (typeAnnotation.typeParameters.params[0].type) {
|
|
150
|
+
case 'TSNullKeyword':
|
|
151
|
+
case 'TSUndefinedKeyword':
|
|
152
|
+
return {
|
|
153
|
+
argumentProps: [],
|
|
154
|
+
bubblingType: eventType,
|
|
155
|
+
paperTopLevelNameDeprecated,
|
|
156
|
+
};
|
|
157
|
+
default:
|
|
158
|
+
return findEventArgumentsAndType(
|
|
159
|
+
typeAnnotation.typeParameters.params[0],
|
|
160
|
+
types,
|
|
161
|
+
eventType,
|
|
162
|
+
paperTopLevelNameDeprecated,
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
} else if (types[name]) {
|
|
166
|
+
let elementType = types[name];
|
|
167
|
+
if (elementType.type === 'TSTypeAliasDeclaration') {
|
|
168
|
+
elementType = elementType.typeAnnotation;
|
|
169
|
+
}
|
|
170
|
+
return findEventArgumentsAndType(
|
|
171
|
+
elementType,
|
|
172
|
+
types,
|
|
173
|
+
bubblingType,
|
|
174
|
+
paperName,
|
|
175
|
+
);
|
|
176
|
+
} else {
|
|
177
|
+
return {
|
|
178
|
+
argumentProps: null,
|
|
179
|
+
bubblingType: null,
|
|
180
|
+
paperTopLevelNameDeprecated: null,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
186
|
+
* LTI update could not be added via codemod */
|
|
187
|
+
function buildPropertiesForEvent(property): NamedShape<EventTypeAnnotation> {
|
|
188
|
+
const name = property.key.name;
|
|
189
|
+
const optional = property.optional || false;
|
|
190
|
+
let typeAnnotation = property.typeAnnotation.typeAnnotation;
|
|
191
|
+
|
|
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
|
+
};
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// $FlowFixMe[unclear-type] TODO(T108222691): Use flow-types for @babel/parser
|
|
205
|
+
type EventTypeAST = Object;
|
|
206
|
+
|
|
207
|
+
function buildEventSchema(
|
|
208
|
+
types: TypeDeclarationMap,
|
|
209
|
+
property: EventTypeAST,
|
|
210
|
+
): EventTypeShape {
|
|
211
|
+
// unpack WithDefault, (T) or T|U
|
|
212
|
+
const topLevelType = parseTopLevelType(
|
|
213
|
+
property.typeAnnotation.typeAnnotation,
|
|
214
|
+
types,
|
|
215
|
+
);
|
|
216
|
+
|
|
217
|
+
const name = property.key.name;
|
|
218
|
+
const typeAnnotation = topLevelType.type;
|
|
219
|
+
const optional = property.optional || topLevelType.optional;
|
|
220
|
+
const {argumentProps, bubblingType, paperTopLevelNameDeprecated} =
|
|
221
|
+
findEventArgumentsAndType(typeAnnotation, types);
|
|
222
|
+
|
|
223
|
+
if (!argumentProps) {
|
|
224
|
+
throw new Error(`Unable to determine event arguments for "${name}"`);
|
|
225
|
+
} else if (!bubblingType) {
|
|
226
|
+
throw new Error(`Unable to determine event bubbling type for "${name}"`);
|
|
227
|
+
} else {
|
|
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
|
+
}
|
|
240
|
+
|
|
241
|
+
return {
|
|
242
|
+
name,
|
|
243
|
+
optional,
|
|
244
|
+
bubblingType,
|
|
245
|
+
typeAnnotation: {
|
|
246
|
+
type: 'EventTypeAnnotation',
|
|
247
|
+
argument: getEventArgument(argumentProps, name),
|
|
248
|
+
},
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
function getEvents(
|
|
254
|
+
eventTypeAST: $ReadOnlyArray<EventTypeAST>,
|
|
255
|
+
types: TypeDeclarationMap,
|
|
256
|
+
): $ReadOnlyArray<EventTypeShape> {
|
|
257
|
+
return eventTypeAST.map(property => buildEventSchema(types, property));
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
module.exports = {
|
|
261
|
+
getEvents,
|
|
262
|
+
};
|
|
@@ -0,0 +1,88 @@
|
|
|
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
|
+
const _require = require('../parseTopLevelType'),
|
|
14
|
+
parseTopLevelType = _require.parseTopLevelType;
|
|
15
|
+
const _require2 = require('./componentsUtils.js'),
|
|
16
|
+
flattenProperties = _require2.flattenProperties;
|
|
17
|
+
function extendsForProp(prop, types) {
|
|
18
|
+
if (!prop.expression) {
|
|
19
|
+
console.log('null', prop);
|
|
20
|
+
}
|
|
21
|
+
const name = prop.expression.name;
|
|
22
|
+
if (types[name] != null) {
|
|
23
|
+
// This type is locally defined in the file
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
switch (name) {
|
|
27
|
+
case 'ViewProps':
|
|
28
|
+
return {
|
|
29
|
+
type: 'ReactNativeBuiltInType',
|
|
30
|
+
knownTypeName: 'ReactNativeCoreViewProps',
|
|
31
|
+
};
|
|
32
|
+
default: {
|
|
33
|
+
throw new Error(`Unable to handle prop spread: ${name}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function isEvent(typeAnnotation) {
|
|
38
|
+
if (typeAnnotation.type !== 'TSTypeReference') {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
const eventNames = new Set(['BubblingEventHandler', 'DirectEventHandler']);
|
|
42
|
+
return eventNames.has(typeAnnotation.typeName.name);
|
|
43
|
+
}
|
|
44
|
+
function isProp(name, typeAnnotation) {
|
|
45
|
+
if (typeAnnotation.type !== 'TSTypeReference') {
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
const isStyle =
|
|
49
|
+
name === 'style' &&
|
|
50
|
+
typeAnnotation.type === 'GenericTypeAnnotation' &&
|
|
51
|
+
typeAnnotation.typeName.name === 'ViewStyleProp';
|
|
52
|
+
return !isStyle;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// $FlowFixMe[unclear-type] TODO(T108222691): Use flow-types for @babel/parser
|
|
56
|
+
|
|
57
|
+
function categorizeProps(typeDefinition, types, extendsProps, props, events) {
|
|
58
|
+
const remaining = [];
|
|
59
|
+
for (const prop of typeDefinition) {
|
|
60
|
+
// find extends
|
|
61
|
+
if (prop.type === 'TSExpressionWithTypeArguments') {
|
|
62
|
+
const extend = extendsForProp(prop, types);
|
|
63
|
+
if (extend) {
|
|
64
|
+
extendsProps.push(extend);
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
remaining.push(prop);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// find events and props
|
|
72
|
+
for (const prop of flattenProperties(remaining, types)) {
|
|
73
|
+
if (prop.type === 'TSPropertySignature') {
|
|
74
|
+
const topLevelType = parseTopLevelType(
|
|
75
|
+
prop.typeAnnotation.typeAnnotation,
|
|
76
|
+
types,
|
|
77
|
+
);
|
|
78
|
+
if (isEvent(topLevelType.type)) {
|
|
79
|
+
events.push(prop);
|
|
80
|
+
} else if (isProp(prop.key.name, prop)) {
|
|
81
|
+
props.push(prop);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
module.exports = {
|
|
87
|
+
categorizeProps,
|
|
88
|
+
};
|
|
@@ -0,0 +1,103 @@
|
|
|
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
|
+
const {parseTopLevelType} = require('../parseTopLevelType');
|
|
16
|
+
const {flattenProperties} = require('./componentsUtils.js');
|
|
17
|
+
|
|
18
|
+
function extendsForProp(prop: PropsAST, types: TypeDeclarationMap) {
|
|
19
|
+
if (!prop.expression) {
|
|
20
|
+
console.log('null', prop);
|
|
21
|
+
}
|
|
22
|
+
const name = prop.expression.name;
|
|
23
|
+
|
|
24
|
+
if (types[name] != null) {
|
|
25
|
+
// This type is locally defined in the file
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
switch (name) {
|
|
30
|
+
case 'ViewProps':
|
|
31
|
+
return {
|
|
32
|
+
type: 'ReactNativeBuiltInType',
|
|
33
|
+
knownTypeName: 'ReactNativeCoreViewProps',
|
|
34
|
+
};
|
|
35
|
+
default: {
|
|
36
|
+
throw new Error(`Unable to handle prop spread: ${name}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function isEvent(typeAnnotation: $FlowFixMe): boolean {
|
|
42
|
+
if (typeAnnotation.type !== 'TSTypeReference') {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
const eventNames = new Set(['BubblingEventHandler', 'DirectEventHandler']);
|
|
46
|
+
return eventNames.has(typeAnnotation.typeName.name);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function isProp(name: string, typeAnnotation: $FlowFixMe): boolean {
|
|
50
|
+
if (typeAnnotation.type !== 'TSTypeReference') {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
const isStyle =
|
|
54
|
+
name === 'style' &&
|
|
55
|
+
typeAnnotation.type === 'GenericTypeAnnotation' &&
|
|
56
|
+
typeAnnotation.typeName.name === 'ViewStyleProp';
|
|
57
|
+
return !isStyle;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// $FlowFixMe[unclear-type] TODO(T108222691): Use flow-types for @babel/parser
|
|
61
|
+
type PropsAST = Object;
|
|
62
|
+
|
|
63
|
+
function categorizeProps(
|
|
64
|
+
typeDefinition: $ReadOnlyArray<PropsAST>,
|
|
65
|
+
types: TypeDeclarationMap,
|
|
66
|
+
extendsProps: Array<ExtendsPropsShape>,
|
|
67
|
+
props: Array<PropsAST>,
|
|
68
|
+
events: Array<PropsAST>,
|
|
69
|
+
): void {
|
|
70
|
+
const remaining: Array<PropsAST> = [];
|
|
71
|
+
for (const prop of typeDefinition) {
|
|
72
|
+
// find extends
|
|
73
|
+
if (prop.type === 'TSExpressionWithTypeArguments') {
|
|
74
|
+
const extend = extendsForProp(prop, types);
|
|
75
|
+
if (extend) {
|
|
76
|
+
extendsProps.push(extend);
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
remaining.push(prop);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// find events and props
|
|
85
|
+
for (const prop of flattenProperties(remaining, types)) {
|
|
86
|
+
if (prop.type === 'TSPropertySignature') {
|
|
87
|
+
const topLevelType = parseTopLevelType(
|
|
88
|
+
prop.typeAnnotation.typeAnnotation,
|
|
89
|
+
types,
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
if (isEvent(topLevelType.type)) {
|
|
93
|
+
events.push(prop);
|
|
94
|
+
} else if (isProp(prop.key.name, prop)) {
|
|
95
|
+
props.push(prop);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
module.exports = {
|
|
102
|
+
categorizeProps,
|
|
103
|
+
};
|