@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,315 @@
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
+ const nullthrows = require('nullthrows');
14
+
15
+ const {
16
+ getCppTypeForAnnotation,
17
+ toSafeCppString,
18
+ generateEventStructName,
19
+ } = require('./CppHelpers');
20
+ const {indent} = require('../Utils');
21
+
22
+ import type {
23
+ ComponentShape,
24
+ EventTypeShape,
25
+ NamedShape,
26
+ EventTypeAnnotation,
27
+ SchemaType,
28
+ } from '../../CodegenSchema';
29
+
30
+ // File path -> contents
31
+ type FilesOutput = Map<string, string>;
32
+ type StructsMap = Map<string, string>;
33
+
34
+ type ComponentCollection = $ReadOnly<{
35
+ [component: string]: ComponentShape,
36
+ ...
37
+ }>;
38
+
39
+ const FileTemplate = ({componentEmitters}: {componentEmitters: string}) => `
40
+ /**
41
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
42
+ *
43
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
44
+ * once the code is regenerated.
45
+ *
46
+ * ${'@'}generated by codegen project: GenerateEventEmitterH.js
47
+ */
48
+ #pragma once
49
+
50
+ #include <react/renderer/components/view/ViewEventEmitter.h>
51
+ #include <jsi/jsi.h>
52
+
53
+ namespace facebook {
54
+ namespace react {
55
+
56
+ ${componentEmitters}
57
+
58
+ } // namespace react
59
+ } // namespace facebook
60
+ `;
61
+
62
+ const ComponentTemplate = ({
63
+ className,
64
+ structs,
65
+ events,
66
+ }: {
67
+ className: string,
68
+ structs: string,
69
+ events: string,
70
+ }) =>
71
+ `
72
+ class JSI_EXPORT ${className}EventEmitter : public ViewEventEmitter {
73
+ public:
74
+ using ViewEventEmitter::ViewEventEmitter;
75
+
76
+ ${structs}
77
+
78
+ ${events}
79
+ };
80
+ `.trim();
81
+
82
+ const StructTemplate = ({
83
+ structName,
84
+ fields,
85
+ }: {
86
+ structName: string,
87
+ fields: string,
88
+ }) =>
89
+ `
90
+ struct ${structName} {
91
+ ${fields}
92
+ };
93
+ `.trim();
94
+
95
+ const EnumTemplate = ({
96
+ enumName,
97
+ values,
98
+ toCases,
99
+ }: {
100
+ enumName: string,
101
+ values: string,
102
+ toCases: string,
103
+ }) =>
104
+ `enum class ${enumName} {
105
+ ${values}
106
+ };
107
+
108
+ static char const *toString(const ${enumName} value) {
109
+ switch (value) {
110
+ ${toCases}
111
+ }
112
+ }
113
+ `.trim();
114
+
115
+ function getNativeTypeFromAnnotation(
116
+ componentName: string,
117
+ eventProperty: NamedShape<EventTypeAnnotation>,
118
+ nameParts: $ReadOnlyArray<string>,
119
+ ): string {
120
+ const {type} = eventProperty.typeAnnotation;
121
+
122
+ switch (type) {
123
+ case 'BooleanTypeAnnotation':
124
+ case 'StringTypeAnnotation':
125
+ case 'Int32TypeAnnotation':
126
+ case 'DoubleTypeAnnotation':
127
+ case 'FloatTypeAnnotation':
128
+ return getCppTypeForAnnotation(type);
129
+ case 'StringEnumTypeAnnotation':
130
+ return generateEventStructName(nameParts.concat([eventProperty.name]));
131
+ case 'ObjectTypeAnnotation':
132
+ return generateEventStructName(nameParts.concat([eventProperty.name]));
133
+ default:
134
+ (type: empty);
135
+ throw new Error(`Received invalid event property type ${type}`);
136
+ }
137
+ }
138
+ function generateEnum(
139
+ structs: StructsMap,
140
+ options: $ReadOnlyArray<string>,
141
+ nameParts: Array<string>,
142
+ ) {
143
+ const structName = generateEventStructName(nameParts);
144
+ const fields = options
145
+ .map((option, index) => `${toSafeCppString(option)}`)
146
+ .join(',\n ');
147
+
148
+ const toCases = options
149
+ .map(
150
+ option =>
151
+ `case ${structName}::${toSafeCppString(option)}: return "${option}";`,
152
+ )
153
+ .join('\n' + ' ');
154
+
155
+ structs.set(
156
+ structName,
157
+ EnumTemplate({
158
+ enumName: structName,
159
+ values: fields,
160
+ toCases: toCases,
161
+ }),
162
+ );
163
+ }
164
+
165
+ function generateStruct(
166
+ structs: StructsMap,
167
+ componentName: string,
168
+ nameParts: $ReadOnlyArray<string>,
169
+ properties: $ReadOnlyArray<NamedShape<EventTypeAnnotation>>,
170
+ ): void {
171
+ const structNameParts = nameParts;
172
+ const structName = generateEventStructName(structNameParts);
173
+
174
+ const fields = properties
175
+ .map(property => {
176
+ return `${getNativeTypeFromAnnotation(
177
+ componentName,
178
+ property,
179
+ structNameParts,
180
+ )} ${property.name};`;
181
+ })
182
+ .join('\n' + ' ');
183
+
184
+ properties.forEach(property => {
185
+ const {name, typeAnnotation} = property;
186
+ switch (typeAnnotation.type) {
187
+ case 'BooleanTypeAnnotation':
188
+ return;
189
+ case 'StringTypeAnnotation':
190
+ return;
191
+ case 'Int32TypeAnnotation':
192
+ return;
193
+ case 'DoubleTypeAnnotation':
194
+ return;
195
+ case 'FloatTypeAnnotation':
196
+ return;
197
+ case 'ObjectTypeAnnotation':
198
+ generateStruct(
199
+ structs,
200
+ componentName,
201
+ nameParts.concat([name]),
202
+ nullthrows(typeAnnotation.properties),
203
+ );
204
+ return;
205
+ case 'StringEnumTypeAnnotation':
206
+ generateEnum(structs, typeAnnotation.options, nameParts.concat([name]));
207
+ return;
208
+ default:
209
+ (typeAnnotation.type: empty);
210
+ throw new Error(
211
+ `Received invalid event property type ${typeAnnotation.type}`,
212
+ );
213
+ }
214
+ });
215
+
216
+ structs.set(
217
+ structName,
218
+ StructTemplate({
219
+ structName,
220
+ fields,
221
+ }),
222
+ );
223
+ }
224
+
225
+ function generateStructs(
226
+ componentName: string,
227
+ component: ComponentShape,
228
+ ): string {
229
+ const structs: StructsMap = new Map();
230
+
231
+ component.events.forEach(event => {
232
+ if (event.typeAnnotation.argument) {
233
+ generateStruct(
234
+ structs,
235
+ componentName,
236
+ [event.name],
237
+ event.typeAnnotation.argument.properties,
238
+ );
239
+ }
240
+ });
241
+
242
+ return Array.from(structs.values()).join('\n\n');
243
+ }
244
+
245
+ function generateEvent(componentName: string, event: EventTypeShape): string {
246
+ if (event.typeAnnotation.argument) {
247
+ const structName = generateEventStructName([event.name]);
248
+
249
+ return `void ${event.name}(${structName} value) const;`;
250
+ }
251
+
252
+ return `void ${event.name}() const;`;
253
+ }
254
+ function generateEvents(
255
+ componentName: string,
256
+ component: ComponentShape,
257
+ ): string {
258
+ return component.events
259
+ .map(event => generateEvent(componentName, event))
260
+ .join('\n\n' + ' ');
261
+ }
262
+
263
+ module.exports = {
264
+ generate(
265
+ libraryName: string,
266
+ schema: SchemaType,
267
+ packageName?: string,
268
+ assumeNonnull: boolean = false,
269
+ ): FilesOutput {
270
+ const moduleComponents: ComponentCollection = Object.keys(schema.modules)
271
+ .map(moduleName => {
272
+ const module = schema.modules[moduleName];
273
+ if (module.type !== 'Component') {
274
+ return;
275
+ }
276
+
277
+ const {components} = module;
278
+ // No components in this module
279
+ if (components == null) {
280
+ return null;
281
+ }
282
+
283
+ return components;
284
+ })
285
+ .filter(Boolean)
286
+ .reduce((acc, components) => Object.assign(acc, components), {});
287
+
288
+ const moduleComponentsWithEvents = Object.keys(moduleComponents);
289
+
290
+ const fileName = 'EventEmitters.h';
291
+
292
+ const componentEmitters =
293
+ moduleComponentsWithEvents.length > 0
294
+ ? Object.keys(moduleComponents)
295
+ .map(componentName => {
296
+ const component = moduleComponents[componentName];
297
+
298
+ const replacedTemplate = ComponentTemplate({
299
+ className: componentName,
300
+ structs: indent(generateStructs(componentName, component), 2),
301
+ events: generateEvents(componentName, component),
302
+ });
303
+
304
+ return replacedTemplate;
305
+ })
306
+ .join('\n')
307
+ : '';
308
+
309
+ const replacedTemplate = FileTemplate({
310
+ componentEmitters,
311
+ });
312
+
313
+ return new Map([[fileName, replacedTemplate]]);
314
+ },
315
+ };
@@ -0,0 +1,126 @@
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('./CppHelpers'),
14
+ convertDefaultTypeToString = _require.convertDefaultTypeToString,
15
+ getImports = _require.getImports;
16
+
17
+ // File path -> contents
18
+
19
+ const FileTemplate = ({libraryName, imports, componentClasses}) => `
20
+ /**
21
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
22
+ *
23
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
24
+ * once the code is regenerated.
25
+ *
26
+ * ${'@'}generated by codegen project: GeneratePropsCpp.js
27
+ */
28
+
29
+ #include <react/renderer/components/${libraryName}/Props.h>
30
+ ${imports}
31
+
32
+ namespace facebook {
33
+ namespace react {
34
+
35
+ ${componentClasses}
36
+
37
+ } // namespace react
38
+ } // namespace facebook
39
+ `;
40
+ const ComponentTemplate = ({className, extendClasses, props}) =>
41
+ `
42
+ ${className}::${className}(
43
+ const PropsParserContext &context,
44
+ const ${className} &sourceProps,
45
+ const RawProps &rawProps):${extendClasses}
46
+
47
+ ${props}
48
+ {}
49
+ `.trim();
50
+ function generatePropsString(componentName, component) {
51
+ return component.props
52
+ .map(prop => {
53
+ const defaultValue = convertDefaultTypeToString(componentName, prop);
54
+ return `${prop.name}(convertRawProp(context, rawProps, "${prop.name}", sourceProps.${prop.name}, {${defaultValue}}))`;
55
+ })
56
+ .join(',\n' + ' ');
57
+ }
58
+ function getClassExtendString(component) {
59
+ const extendString =
60
+ ' ' +
61
+ component.extendsProps
62
+ .map(extendProps => {
63
+ switch (extendProps.type) {
64
+ case 'ReactNativeBuiltInType':
65
+ switch (extendProps.knownTypeName) {
66
+ case 'ReactNativeCoreViewProps':
67
+ return 'ViewProps(context, sourceProps, rawProps)';
68
+ default:
69
+ extendProps.knownTypeName;
70
+ throw new Error('Invalid knownTypeName');
71
+ }
72
+ default:
73
+ extendProps.type;
74
+ throw new Error('Invalid extended type');
75
+ }
76
+ })
77
+ .join(', ') +
78
+ `${component.props.length > 0 ? ',' : ''}`;
79
+ return extendString;
80
+ }
81
+ module.exports = {
82
+ generate(libraryName, schema, packageName, assumeNonnull = false) {
83
+ const fileName = 'Props.cpp';
84
+ const allImports = new Set([
85
+ '#include <react/renderer/core/propsConversions.h>',
86
+ '#include <react/renderer/core/PropsParserContext.h>',
87
+ ]);
88
+ const componentProps = Object.keys(schema.modules)
89
+ .map(moduleName => {
90
+ const module = schema.modules[moduleName];
91
+ if (module.type !== 'Component') {
92
+ return;
93
+ }
94
+ const components = module.components;
95
+ // No components in this module
96
+ if (components == null) {
97
+ return null;
98
+ }
99
+ return Object.keys(components)
100
+ .map(componentName => {
101
+ const component = components[componentName];
102
+ const newName = `${componentName}Props`;
103
+ const propsString = generatePropsString(componentName, component);
104
+ const extendString = getClassExtendString(component);
105
+ const imports = getImports(component.props);
106
+ // $FlowFixMe[method-unbinding] added when improving typing for this parameters
107
+ imports.forEach(allImports.add, allImports);
108
+ const replacedTemplate = ComponentTemplate({
109
+ className: newName,
110
+ extendClasses: extendString,
111
+ props: propsString,
112
+ });
113
+ return replacedTemplate;
114
+ })
115
+ .join('\n');
116
+ })
117
+ .filter(Boolean)
118
+ .join('\n');
119
+ const replacedTemplate = FileTemplate({
120
+ componentClasses: componentProps,
121
+ libraryName,
122
+ imports: Array.from(allImports).sort().join('\n').trim(),
123
+ });
124
+ return new Map([[fileName, replacedTemplate]]);
125
+ },
126
+ };
@@ -0,0 +1,161 @@
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
8
+ * @format
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ import type {ComponentShape, SchemaType} from '../../CodegenSchema';
14
+ const {convertDefaultTypeToString, getImports} = require('./CppHelpers');
15
+
16
+ // File path -> contents
17
+ type FilesOutput = Map<string, string>;
18
+
19
+ const FileTemplate = ({
20
+ libraryName,
21
+ imports,
22
+ componentClasses,
23
+ }: {
24
+ libraryName: string,
25
+ imports: string,
26
+ componentClasses: string,
27
+ }) => `
28
+ /**
29
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
30
+ *
31
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
32
+ * once the code is regenerated.
33
+ *
34
+ * ${'@'}generated by codegen project: GeneratePropsCpp.js
35
+ */
36
+
37
+ #include <react/renderer/components/${libraryName}/Props.h>
38
+ ${imports}
39
+
40
+ namespace facebook {
41
+ namespace react {
42
+
43
+ ${componentClasses}
44
+
45
+ } // namespace react
46
+ } // namespace facebook
47
+ `;
48
+
49
+ const ComponentTemplate = ({
50
+ className,
51
+ extendClasses,
52
+ props,
53
+ }: {
54
+ className: string,
55
+ extendClasses: string,
56
+ props: string,
57
+ }) =>
58
+ `
59
+ ${className}::${className}(
60
+ const PropsParserContext &context,
61
+ const ${className} &sourceProps,
62
+ const RawProps &rawProps):${extendClasses}
63
+
64
+ ${props}
65
+ {}
66
+ `.trim();
67
+
68
+ function generatePropsString(componentName: string, component: ComponentShape) {
69
+ return component.props
70
+ .map(prop => {
71
+ const defaultValue = convertDefaultTypeToString(componentName, prop);
72
+ return `${prop.name}(convertRawProp(context, rawProps, "${prop.name}", sourceProps.${prop.name}, {${defaultValue}}))`;
73
+ })
74
+ .join(',\n' + ' ');
75
+ }
76
+
77
+ function getClassExtendString(component: ComponentShape): string {
78
+ const extendString =
79
+ ' ' +
80
+ component.extendsProps
81
+ .map(extendProps => {
82
+ switch (extendProps.type) {
83
+ case 'ReactNativeBuiltInType':
84
+ switch (extendProps.knownTypeName) {
85
+ case 'ReactNativeCoreViewProps':
86
+ return 'ViewProps(context, sourceProps, rawProps)';
87
+ default:
88
+ (extendProps.knownTypeName: empty);
89
+ throw new Error('Invalid knownTypeName');
90
+ }
91
+ default:
92
+ (extendProps.type: empty);
93
+ throw new Error('Invalid extended type');
94
+ }
95
+ })
96
+ .join(', ') +
97
+ `${component.props.length > 0 ? ',' : ''}`;
98
+
99
+ return extendString;
100
+ }
101
+
102
+ module.exports = {
103
+ generate(
104
+ libraryName: string,
105
+ schema: SchemaType,
106
+ packageName?: string,
107
+ assumeNonnull: boolean = false,
108
+ ): FilesOutput {
109
+ const fileName = 'Props.cpp';
110
+ const allImports: Set<string> = new Set([
111
+ '#include <react/renderer/core/propsConversions.h>',
112
+ '#include <react/renderer/core/PropsParserContext.h>',
113
+ ]);
114
+
115
+ const componentProps = Object.keys(schema.modules)
116
+ .map(moduleName => {
117
+ const module = schema.modules[moduleName];
118
+ if (module.type !== 'Component') {
119
+ return;
120
+ }
121
+
122
+ const {components} = module;
123
+ // No components in this module
124
+ if (components == null) {
125
+ return null;
126
+ }
127
+
128
+ return Object.keys(components)
129
+ .map(componentName => {
130
+ const component = components[componentName];
131
+ const newName = `${componentName}Props`;
132
+
133
+ const propsString = generatePropsString(componentName, component);
134
+ const extendString = getClassExtendString(component);
135
+
136
+ const imports = getImports(component.props);
137
+ // $FlowFixMe[method-unbinding] added when improving typing for this parameters
138
+ imports.forEach(allImports.add, allImports);
139
+
140
+ const replacedTemplate = ComponentTemplate({
141
+ className: newName,
142
+ extendClasses: extendString,
143
+ props: propsString,
144
+ });
145
+
146
+ return replacedTemplate;
147
+ })
148
+ .join('\n');
149
+ })
150
+ .filter(Boolean)
151
+ .join('\n');
152
+
153
+ const replacedTemplate = FileTemplate({
154
+ componentClasses: componentProps,
155
+ libraryName,
156
+ imports: Array.from(allImports).sort().join('\n').trim(),
157
+ });
158
+
159
+ return new Map([[fileName, replacedTemplate]]);
160
+ },
161
+ };