@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.
Files changed (186) hide show
  1. package/README.md +21 -0
  2. package/lib/CodegenSchema.js +11 -0
  3. package/lib/CodegenSchema.js.flow +351 -0
  4. package/lib/SchemaValidator.js +54 -0
  5. package/lib/SchemaValidator.js.flow +67 -0
  6. package/lib/cli/combine/combine-js-to-schema-cli.js +50 -0
  7. package/lib/cli/combine/combine-js-to-schema-cli.js.flow +49 -0
  8. package/lib/cli/combine/combine-js-to-schema.js +110 -0
  9. package/lib/cli/combine/combine-js-to-schema.js.flow +48 -0
  10. package/lib/cli/combine/combine-utils.js +118 -0
  11. package/lib/cli/combine/combine-utils.js.flow +85 -0
  12. package/lib/cli/generators/generate-all.js +65 -0
  13. package/lib/cli/generators/generate-all.js.flow +66 -0
  14. package/lib/cli/parser/parser-cli.js +55 -0
  15. package/lib/cli/parser/parser-cli.js.flow +18 -0
  16. package/lib/cli/parser/parser.js +35 -0
  17. package/lib/cli/parser/parser.js.flow +37 -0
  18. package/lib/cli/parser/parser.sh +15 -0
  19. package/lib/generators/RNCodegen.js +207 -0
  20. package/lib/generators/RNCodegen.js.flow +284 -0
  21. package/lib/generators/Utils.js +31 -0
  22. package/lib/generators/Utils.js.flow +33 -0
  23. package/lib/generators/__test_fixtures__/fixtures.js +79 -0
  24. package/lib/generators/__test_fixtures__/fixtures.js.flow +82 -0
  25. package/lib/generators/components/ComponentsGeneratorUtils.js +217 -0
  26. package/lib/generators/components/ComponentsGeneratorUtils.js.flow +304 -0
  27. package/lib/generators/components/CppHelpers.js +188 -0
  28. package/lib/generators/components/CppHelpers.js.flow +228 -0
  29. package/lib/generators/components/GenerateComponentDescriptorH.js +75 -0
  30. package/lib/generators/components/GenerateComponentDescriptorH.js.flow +95 -0
  31. package/lib/generators/components/GenerateComponentHObjCpp.js +327 -0
  32. package/lib/generators/components/GenerateComponentHObjCpp.js.flow +418 -0
  33. package/lib/generators/components/GenerateEventEmitterCpp.js +199 -0
  34. package/lib/generators/components/GenerateEventEmitterCpp.js.flow +273 -0
  35. package/lib/generators/components/GenerateEventEmitterH.js +224 -0
  36. package/lib/generators/components/GenerateEventEmitterH.js.flow +315 -0
  37. package/lib/generators/components/GeneratePropsCpp.js +126 -0
  38. package/lib/generators/components/GeneratePropsCpp.js.flow +161 -0
  39. package/lib/generators/components/GeneratePropsH.js +606 -0
  40. package/lib/generators/components/GeneratePropsH.js.flow +778 -0
  41. package/lib/generators/components/GeneratePropsJavaDelegate.js +287 -0
  42. package/lib/generators/components/GeneratePropsJavaDelegate.js.flow +348 -0
  43. package/lib/generators/components/GeneratePropsJavaInterface.js +237 -0
  44. package/lib/generators/components/GeneratePropsJavaInterface.js.flow +288 -0
  45. package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js +157 -0
  46. package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js.flow +187 -0
  47. package/lib/generators/components/GeneratePropsJavaPojo/index.js +66 -0
  48. package/lib/generators/components/GeneratePropsJavaPojo/index.js.flow +80 -0
  49. package/lib/generators/components/GeneratePropsJavaPojo/serializePojo.js +273 -0
  50. package/lib/generators/components/GeneratePropsJavaPojo/serializePojo.js.flow +296 -0
  51. package/lib/generators/components/GenerateShadowNodeCpp.js +73 -0
  52. package/lib/generators/components/GenerateShadowNodeCpp.js.flow +95 -0
  53. package/lib/generators/components/GenerateShadowNodeH.js +91 -0
  54. package/lib/generators/components/GenerateShadowNodeH.js.flow +124 -0
  55. package/lib/generators/components/GenerateStateCpp.js +70 -0
  56. package/lib/generators/components/GenerateStateCpp.js.flow +92 -0
  57. package/lib/generators/components/GenerateStateH.js +93 -0
  58. package/lib/generators/components/GenerateStateH.js.flow +111 -0
  59. package/lib/generators/components/GenerateTests.js +165 -0
  60. package/lib/generators/components/GenerateTests.js.flow +219 -0
  61. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js +91 -0
  62. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js.flow +107 -0
  63. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js +89 -0
  64. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js.flow +105 -0
  65. package/lib/generators/components/GenerateViewConfigJs.js +410 -0
  66. package/lib/generators/components/GenerateViewConfigJs.js.flow +484 -0
  67. package/lib/generators/components/JavaHelpers.js +87 -0
  68. package/lib/generators/components/JavaHelpers.js.flow +119 -0
  69. package/lib/generators/components/__test_fixtures__/fixtures.js +1641 -0
  70. package/lib/generators/components/__test_fixtures__/fixtures.js.flow +1672 -0
  71. package/lib/generators/modules/GenerateModuleCpp.js +299 -0
  72. package/lib/generators/modules/GenerateModuleCpp.js.flow +278 -0
  73. package/lib/generators/modules/GenerateModuleH.js +373 -0
  74. package/lib/generators/modules/GenerateModuleH.js.flow +355 -0
  75. package/lib/generators/modules/GenerateModuleJavaSpec.js +571 -0
  76. package/lib/generators/modules/GenerateModuleJavaSpec.js.flow +553 -0
  77. package/lib/generators/modules/GenerateModuleJniCpp.js +505 -0
  78. package/lib/generators/modules/GenerateModuleJniCpp.js.flow +523 -0
  79. package/lib/generators/modules/GenerateModuleJniH.js +138 -0
  80. package/lib/generators/modules/GenerateModuleJniH.js.flow +148 -0
  81. package/lib/generators/modules/GenerateModuleObjCpp/StructCollector.js +262 -0
  82. package/lib/generators/modules/GenerateModuleObjCpp/StructCollector.js.flow +208 -0
  83. package/lib/generators/modules/GenerateModuleObjCpp/Utils.js +25 -0
  84. package/lib/generators/modules/GenerateModuleObjCpp/Utils.js.flow +32 -0
  85. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js +337 -0
  86. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js.flow +288 -0
  87. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js +330 -0
  88. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js.flow +279 -0
  89. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeStruct.js +25 -0
  90. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeStruct.js.flow +35 -0
  91. package/lib/generators/modules/GenerateModuleObjCpp/index.js +185 -0
  92. package/lib/generators/modules/GenerateModuleObjCpp/index.js.flow +219 -0
  93. package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js +529 -0
  94. package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js.flow +510 -0
  95. package/lib/generators/modules/GenerateModuleObjCpp/source/serializeModule.js +96 -0
  96. package/lib/generators/modules/GenerateModuleObjCpp/source/serializeModule.js.flow +121 -0
  97. package/lib/generators/modules/Utils.js +34 -0
  98. package/lib/generators/modules/Utils.js.flow +53 -0
  99. package/lib/generators/modules/__test_fixtures__/fixtures.js +1658 -0
  100. package/lib/generators/modules/__test_fixtures__/fixtures.js.flow +1669 -0
  101. package/lib/parsers/consistency/compareSnaps.js +84 -0
  102. package/lib/parsers/error-utils.js +284 -0
  103. package/lib/parsers/error-utils.js.flow +295 -0
  104. package/lib/parsers/errors.js +350 -0
  105. package/lib/parsers/errors.js.flow +439 -0
  106. package/lib/parsers/flow/components/__test_fixtures__/failures.js +583 -0
  107. package/lib/parsers/flow/components/__test_fixtures__/failures.js.flow +600 -0
  108. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js +1001 -0
  109. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js.flow +1016 -0
  110. package/lib/parsers/flow/components/commands.js +104 -0
  111. package/lib/parsers/flow/components/commands.js.flow +123 -0
  112. package/lib/parsers/flow/components/componentsUtils.js +446 -0
  113. package/lib/parsers/flow/components/componentsUtils.js.flow +496 -0
  114. package/lib/parsers/flow/components/events.js +233 -0
  115. package/lib/parsers/flow/components/events.js.flow +262 -0
  116. package/lib/parsers/flow/components/extends.js +52 -0
  117. package/lib/parsers/flow/components/extends.js.flow +66 -0
  118. package/lib/parsers/flow/components/index.js +267 -0
  119. package/lib/parsers/flow/components/index.js.flow +226 -0
  120. package/lib/parsers/flow/components/options.js +72 -0
  121. package/lib/parsers/flow/components/options.js.flow +87 -0
  122. package/lib/parsers/flow/components/props.js +47 -0
  123. package/lib/parsers/flow/components/props.js.flow +60 -0
  124. package/lib/parsers/flow/components/schema.js +106 -0
  125. package/lib/parsers/flow/components/schema.js.flow +62 -0
  126. package/lib/parsers/flow/index.js +80 -0
  127. package/lib/parsers/flow/index.js.flow +85 -0
  128. package/lib/parsers/flow/modules/__test_fixtures__/failures.js +215 -0
  129. package/lib/parsers/flow/modules/__test_fixtures__/failures.js.flow +223 -0
  130. package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js +724 -0
  131. package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js.flow +747 -0
  132. package/lib/parsers/flow/modules/index.js +528 -0
  133. package/lib/parsers/flow/modules/index.js.flow +420 -0
  134. package/lib/parsers/flow/parser.js +109 -0
  135. package/lib/parsers/flow/parser.js.flow +83 -0
  136. package/lib/parsers/flow/utils.js +108 -0
  137. package/lib/parsers/flow/utils.js.flow +123 -0
  138. package/lib/parsers/parser.js +11 -0
  139. package/lib/parsers/parser.js.flow +70 -0
  140. package/lib/parsers/parserMock.js +96 -0
  141. package/lib/parsers/parserMock.js.flow +68 -0
  142. package/lib/parsers/parsers-commons.js +448 -0
  143. package/lib/parsers/parsers-commons.js.flow +447 -0
  144. package/lib/parsers/parsers-primitives.js +387 -0
  145. package/lib/parsers/parsers-primitives.js.flow +383 -0
  146. package/lib/parsers/parsers-utils.js +18 -0
  147. package/lib/parsers/parsers-utils.js.flow +19 -0
  148. package/lib/parsers/schema/index.js +23 -0
  149. package/lib/parsers/schema/index.js.flow +26 -0
  150. package/lib/parsers/typescript/components/__test_fixtures__/failures.js +489 -0
  151. package/lib/parsers/typescript/components/__test_fixtures__/failures.js.flow +505 -0
  152. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js +1151 -0
  153. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js.flow +1168 -0
  154. package/lib/parsers/typescript/components/commands.js +132 -0
  155. package/lib/parsers/typescript/components/commands.js.flow +151 -0
  156. package/lib/parsers/typescript/components/componentsUtils.js +471 -0
  157. package/lib/parsers/typescript/components/componentsUtils.js.flow +521 -0
  158. package/lib/parsers/typescript/components/events.js +240 -0
  159. package/lib/parsers/typescript/components/events.js.flow +262 -0
  160. package/lib/parsers/typescript/components/extends.js +88 -0
  161. package/lib/parsers/typescript/components/extends.js.flow +103 -0
  162. package/lib/parsers/typescript/components/index.js +277 -0
  163. package/lib/parsers/typescript/components/index.js.flow +239 -0
  164. package/lib/parsers/typescript/components/options.js +72 -0
  165. package/lib/parsers/typescript/components/options.js.flow +87 -0
  166. package/lib/parsers/typescript/components/props.js +39 -0
  167. package/lib/parsers/typescript/components/props.js.flow +48 -0
  168. package/lib/parsers/typescript/components/schema.js +106 -0
  169. package/lib/parsers/typescript/components/schema.js.flow +62 -0
  170. package/lib/parsers/typescript/index.js +85 -0
  171. package/lib/parsers/typescript/index.js.flow +94 -0
  172. package/lib/parsers/typescript/modules/__test_fixtures__/failures.js +160 -0
  173. package/lib/parsers/typescript/modules/__test_fixtures__/failures.js.flow +167 -0
  174. package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js +701 -0
  175. package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js.flow +727 -0
  176. package/lib/parsers/typescript/modules/index.js +543 -0
  177. package/lib/parsers/typescript/modules/index.js.flow +435 -0
  178. package/lib/parsers/typescript/parseTopLevelType.js +203 -0
  179. package/lib/parsers/typescript/parseTopLevelType.js.flow +243 -0
  180. package/lib/parsers/typescript/parser.js +105 -0
  181. package/lib/parsers/typescript/parser.js.flow +87 -0
  182. package/lib/parsers/typescript/utils.js +101 -0
  183. package/lib/parsers/typescript/utils.js.flow +115 -0
  184. package/lib/parsers/utils.js +273 -0
  185. package/lib/parsers/utils.js.flow +266 -0
  186. 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
+ };