@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,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
+ };