@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,410 @@
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 j = require('jscodeshift');
14
+
15
+ // File path -> contents
16
+
17
+ const FileTemplate = ({imports, componentConfig}) => `
18
+ /**
19
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
20
+ *
21
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
22
+ * once the code is regenerated.
23
+ *
24
+ * @flow
25
+ *
26
+ * ${'@'}generated by codegen project: GenerateViewConfigJs.js
27
+ */
28
+
29
+ 'use strict';
30
+
31
+ ${imports}
32
+
33
+ ${componentConfig}
34
+ `;
35
+
36
+ // We use this to add to a set. Need to make sure we aren't importing
37
+ // this multiple times.
38
+ const UIMANAGER_IMPORT = 'const {UIManager} = require("react-native")';
39
+ function getReactDiffProcessValue(typeAnnotation) {
40
+ switch (typeAnnotation.type) {
41
+ case 'BooleanTypeAnnotation':
42
+ case 'StringTypeAnnotation':
43
+ case 'Int32TypeAnnotation':
44
+ case 'DoubleTypeAnnotation':
45
+ case 'FloatTypeAnnotation':
46
+ case 'ObjectTypeAnnotation':
47
+ case 'StringEnumTypeAnnotation':
48
+ case 'Int32EnumTypeAnnotation':
49
+ return j.literal(true);
50
+ case 'ReservedPropTypeAnnotation':
51
+ switch (typeAnnotation.name) {
52
+ case 'ColorPrimitive':
53
+ return j.template
54
+ .expression`{ process: require('react-native/Libraries/StyleSheet/processColor') }`;
55
+ case 'ImageSourcePrimitive':
56
+ return j.template
57
+ .expression`{ process: require('react-native/Libraries/Image/resolveAssetSource') }`;
58
+ case 'ImageRequestPrimitive':
59
+ throw new Error('ImageRequest should not be used in props');
60
+ case 'PointPrimitive':
61
+ return j.template
62
+ .expression`{ diff: require('react-native/Libraries/Utilities/differ/pointsDiffer') }`;
63
+ case 'EdgeInsetsPrimitive':
64
+ return j.template
65
+ .expression`{ diff: require('react-native/Libraries/Utilities/differ/insetsDiffer') }`;
66
+ default:
67
+ typeAnnotation.name;
68
+ throw new Error(
69
+ `Received unknown native typeAnnotation: "${typeAnnotation.name}"`,
70
+ );
71
+ }
72
+ case 'ArrayTypeAnnotation':
73
+ if (typeAnnotation.elementType.type === 'ReservedPropTypeAnnotation') {
74
+ switch (typeAnnotation.elementType.name) {
75
+ case 'ColorPrimitive':
76
+ return j.template
77
+ .expression`{ process: require('react-native/Libraries/StyleSheet/processColorArray') }`;
78
+ case 'ImageSourcePrimitive':
79
+ return j.literal(true);
80
+ case 'PointPrimitive':
81
+ return j.literal(true);
82
+ default:
83
+ throw new Error(
84
+ `Received unknown array native typeAnnotation: "${typeAnnotation.elementType.name}"`,
85
+ );
86
+ }
87
+ }
88
+ return j.literal(true);
89
+ default:
90
+ typeAnnotation;
91
+ throw new Error(
92
+ `Received unknown typeAnnotation: "${typeAnnotation.type}"`,
93
+ );
94
+ }
95
+ }
96
+ const ComponentTemplate = ({
97
+ componentName,
98
+ paperComponentName,
99
+ paperComponentNameDeprecated,
100
+ }) => {
101
+ const nativeComponentName =
102
+ paperComponentName !== null && paperComponentName !== void 0
103
+ ? paperComponentName
104
+ : componentName;
105
+ return `
106
+ let nativeComponentName = '${nativeComponentName}';
107
+ ${
108
+ paperComponentNameDeprecated != null
109
+ ? DeprecatedComponentNameCheckTemplate({
110
+ componentName,
111
+ paperComponentNameDeprecated,
112
+ })
113
+ : ''
114
+ }
115
+
116
+ export const __INTERNAL_VIEW_CONFIG = VIEW_CONFIG;
117
+
118
+ export default NativeComponentRegistry.get(nativeComponentName, () => __INTERNAL_VIEW_CONFIG);
119
+ `.trim();
120
+ };
121
+
122
+ // Check whether the native component exists in the app binary.
123
+ // Old getViewManagerConfig() checks for the existance of the native Paper view manager. Not available in Bridgeless.
124
+ // New hasViewManagerConfig() queries Fabric’s native component registry directly.
125
+ const DeprecatedComponentNameCheckTemplate = ({
126
+ componentName,
127
+ paperComponentNameDeprecated,
128
+ }) =>
129
+ `
130
+ if (UIManager.hasViewManagerConfig('${componentName}')) {
131
+ nativeComponentName = '${componentName}';
132
+ } else if (UIManager.hasViewManagerConfig('${paperComponentNameDeprecated}')) {
133
+ nativeComponentName = '${paperComponentNameDeprecated}';
134
+ } else {
135
+ throw new Error('Failed to find native component for either "${componentName}" or "${paperComponentNameDeprecated}"');
136
+ }
137
+ `.trim();
138
+
139
+ // Replicates the behavior of RCTNormalizeInputEventName in RCTEventDispatcher.m
140
+ function normalizeInputEventName(name) {
141
+ if (name.startsWith('on')) {
142
+ return name.replace(/^on/, 'top');
143
+ } else if (!name.startsWith('top')) {
144
+ return `top${name[0].toUpperCase()}${name.slice(1)}`;
145
+ }
146
+ return name;
147
+ }
148
+
149
+ // Replicates the behavior of viewConfig in RCTComponentData.m
150
+ function getValidAttributesForEvents(events, imports) {
151
+ imports.add(
152
+ "const {ConditionallyIgnoredEventHandlers} = require('react-native/Libraries/NativeComponent/ViewConfigIgnore');",
153
+ );
154
+ const validAttributes = j.objectExpression(
155
+ events.map(eventType => {
156
+ return j.property('init', j.identifier(eventType.name), j.literal(true));
157
+ }),
158
+ );
159
+ return j.callExpression(j.identifier('ConditionallyIgnoredEventHandlers'), [
160
+ validAttributes,
161
+ ]);
162
+ }
163
+ function generateBubblingEventInfo(event, nameOveride) {
164
+ return j.property(
165
+ 'init',
166
+ j.identifier(nameOveride || normalizeInputEventName(event.name)),
167
+ j.objectExpression([
168
+ j.property(
169
+ 'init',
170
+ j.identifier('phasedRegistrationNames'),
171
+ j.objectExpression([
172
+ j.property(
173
+ 'init',
174
+ j.identifier('captured'),
175
+ j.literal(`${event.name}Capture`),
176
+ ),
177
+ j.property('init', j.identifier('bubbled'), j.literal(event.name)),
178
+ ]),
179
+ ),
180
+ ]),
181
+ );
182
+ }
183
+ function generateDirectEventInfo(event, nameOveride) {
184
+ return j.property(
185
+ 'init',
186
+ j.identifier(nameOveride || normalizeInputEventName(event.name)),
187
+ j.objectExpression([
188
+ j.property(
189
+ 'init',
190
+ j.identifier('registrationName'),
191
+ j.literal(event.name),
192
+ ),
193
+ ]),
194
+ );
195
+ }
196
+ function buildViewConfig(schema, componentName, component, imports) {
197
+ const componentProps = component.props;
198
+ const componentEvents = component.events;
199
+ component.extendsProps.forEach(extendProps => {
200
+ switch (extendProps.type) {
201
+ case 'ReactNativeBuiltInType':
202
+ switch (extendProps.knownTypeName) {
203
+ case 'ReactNativeCoreViewProps':
204
+ imports.add(
205
+ "const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry');",
206
+ );
207
+ return;
208
+ default:
209
+ extendProps.knownTypeName;
210
+ throw new Error('Invalid knownTypeName');
211
+ }
212
+ default:
213
+ extendProps.type;
214
+ throw new Error('Invalid extended type');
215
+ }
216
+ });
217
+ const validAttributes = j.objectExpression([
218
+ ...componentProps.map(schemaProp => {
219
+ return j.property(
220
+ 'init',
221
+ j.identifier(schemaProp.name),
222
+ getReactDiffProcessValue(schemaProp.typeAnnotation),
223
+ );
224
+ }),
225
+ ...(componentEvents.length > 0
226
+ ? [
227
+ j.spreadProperty(
228
+ getValidAttributesForEvents(componentEvents, imports),
229
+ ),
230
+ ]
231
+ : []),
232
+ ]);
233
+ const bubblingEventNames = component.events
234
+ .filter(event => event.bubblingType === 'bubble')
235
+ .reduce((bubblingEvents, event) => {
236
+ // We add in the deprecated paper name so that it is in the view config.
237
+ // This means either the old event name or the new event name can fire
238
+ // and be sent to the listener until the old top level name is removed.
239
+ if (event.paperTopLevelNameDeprecated) {
240
+ bubblingEvents.push(
241
+ generateBubblingEventInfo(event, event.paperTopLevelNameDeprecated),
242
+ );
243
+ } else {
244
+ bubblingEvents.push(generateBubblingEventInfo(event));
245
+ }
246
+ return bubblingEvents;
247
+ }, []);
248
+ const bubblingEvents =
249
+ bubblingEventNames.length > 0
250
+ ? j.property(
251
+ 'init',
252
+ j.identifier('bubblingEventTypes'),
253
+ j.objectExpression(bubblingEventNames),
254
+ )
255
+ : null;
256
+ const directEventNames = component.events
257
+ .filter(event => event.bubblingType === 'direct')
258
+ .reduce((directEvents, event) => {
259
+ // We add in the deprecated paper name so that it is in the view config.
260
+ // This means either the old event name or the new event name can fire
261
+ // and be sent to the listener until the old top level name is removed.
262
+ if (event.paperTopLevelNameDeprecated) {
263
+ directEvents.push(
264
+ generateDirectEventInfo(event, event.paperTopLevelNameDeprecated),
265
+ );
266
+ } else {
267
+ directEvents.push(generateDirectEventInfo(event));
268
+ }
269
+ return directEvents;
270
+ }, []);
271
+ const directEvents =
272
+ directEventNames.length > 0
273
+ ? j.property(
274
+ 'init',
275
+ j.identifier('directEventTypes'),
276
+ j.objectExpression(directEventNames),
277
+ )
278
+ : null;
279
+ const properties = [
280
+ j.property(
281
+ 'init',
282
+ j.identifier('uiViewClassName'),
283
+ j.literal(componentName),
284
+ ),
285
+ bubblingEvents,
286
+ directEvents,
287
+ j.property('init', j.identifier('validAttributes'), validAttributes),
288
+ ].filter(Boolean);
289
+ return j.objectExpression(properties);
290
+ }
291
+ function buildCommands(schema, componentName, component, imports) {
292
+ const commands = component.commands;
293
+ if (commands.length === 0) {
294
+ return null;
295
+ }
296
+ imports.add(
297
+ 'const {dispatchCommand} = require("react-native/Libraries/ReactNative/RendererProxy");',
298
+ );
299
+ const properties = commands.map(command => {
300
+ const commandName = command.name;
301
+ const params = command.typeAnnotation.params;
302
+ const commandNameLiteral = j.literal(commandName);
303
+ const commandNameIdentifier = j.identifier(commandName);
304
+ const arrayParams = j.arrayExpression(
305
+ params.map(param => {
306
+ return j.identifier(param.name);
307
+ }),
308
+ );
309
+ const expression = j.template
310
+ .expression`dispatchCommand(ref, ${commandNameLiteral}, ${arrayParams})`;
311
+ const functionParams = params.map(param => {
312
+ return j.identifier(param.name);
313
+ });
314
+ const property = j.property(
315
+ 'init',
316
+ commandNameIdentifier,
317
+ j.functionExpression(
318
+ null,
319
+ [j.identifier('ref'), ...functionParams],
320
+ j.blockStatement([j.expressionStatement(expression)]),
321
+ ),
322
+ );
323
+ property.method = true;
324
+ return property;
325
+ });
326
+ return j.exportNamedDeclaration(
327
+ j.variableDeclaration('const', [
328
+ j.variableDeclarator(
329
+ j.identifier('Commands'),
330
+ j.objectExpression(properties),
331
+ ),
332
+ ]),
333
+ );
334
+ }
335
+ module.exports = {
336
+ generate(libraryName, schema) {
337
+ try {
338
+ const fileName = `${libraryName}NativeViewConfig.js`;
339
+ const imports = new Set();
340
+ const moduleResults = Object.keys(schema.modules)
341
+ .map(moduleName => {
342
+ const module = schema.modules[moduleName];
343
+ if (module.type !== 'Component') {
344
+ return;
345
+ }
346
+ const components = module.components;
347
+ return Object.keys(components)
348
+ .map(componentName => {
349
+ var _component$paperCompo;
350
+ const component = components[componentName];
351
+ if (component.paperComponentNameDeprecated) {
352
+ imports.add(UIMANAGER_IMPORT);
353
+ }
354
+ const replacedTemplate = ComponentTemplate({
355
+ componentName,
356
+ paperComponentName: component.paperComponentName,
357
+ paperComponentNameDeprecated:
358
+ component.paperComponentNameDeprecated,
359
+ });
360
+ const replacedSourceRoot = j.withParser('flow')(replacedTemplate);
361
+ const paperComponentName =
362
+ (_component$paperCompo = component.paperComponentName) !==
363
+ null && _component$paperCompo !== void 0
364
+ ? _component$paperCompo
365
+ : componentName;
366
+ replacedSourceRoot
367
+ .find(j.Identifier, {
368
+ name: 'VIEW_CONFIG',
369
+ })
370
+ .replaceWith(
371
+ buildViewConfig(
372
+ schema,
373
+ paperComponentName,
374
+ component,
375
+ imports,
376
+ ),
377
+ );
378
+ const commands = buildCommands(
379
+ schema,
380
+ paperComponentName,
381
+ component,
382
+ imports,
383
+ );
384
+ if (commands) {
385
+ replacedSourceRoot
386
+ .find(j.ExportDefaultDeclaration)
387
+ .insertAfter(j(commands).toSource());
388
+ }
389
+ const replacedSource = replacedSourceRoot.toSource({
390
+ quote: 'single',
391
+ trailingComma: true,
392
+ });
393
+ return replacedSource;
394
+ })
395
+ .join('\n\n');
396
+ })
397
+ .filter(Boolean)
398
+ .join('\n\n');
399
+ const replacedTemplate = FileTemplate({
400
+ componentConfig: moduleResults,
401
+ imports: Array.from(imports).sort().join('\n'),
402
+ });
403
+ return new Map([[fileName, replacedTemplate]]);
404
+ } catch (error) {
405
+ console.error(`\nError parsing schema for ${libraryName}\n`);
406
+ console.error(JSON.stringify(schema));
407
+ throw error;
408
+ }
409
+ },
410
+ };