@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,606 @@
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('./ComponentsGeneratorUtils.js'),
14
+ getNativeTypeFromAnnotation = _require.getNativeTypeFromAnnotation,
15
+ getLocalImports = _require.getLocalImports;
16
+ const _require2 = require('./CppHelpers.js'),
17
+ convertDefaultTypeToString = _require2.convertDefaultTypeToString,
18
+ getEnumMaskName = _require2.getEnumMaskName,
19
+ getEnumName = _require2.getEnumName,
20
+ toSafeCppString = _require2.toSafeCppString,
21
+ generateStructName = _require2.generateStructName,
22
+ toIntEnumValueName = _require2.toIntEnumValueName;
23
+ const FileTemplate = ({imports, componentClasses}) => `
24
+ /**
25
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
26
+ *
27
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
28
+ * once the code is regenerated.
29
+ *
30
+ * ${'@'}generated by codegen project: GeneratePropsH.js
31
+ */
32
+ #pragma once
33
+
34
+ ${imports}
35
+
36
+ namespace facebook {
37
+ namespace react {
38
+
39
+ ${componentClasses}
40
+
41
+ } // namespace react
42
+ } // namespace facebook
43
+ `;
44
+ const ClassTemplate = ({enums, structs, className, props, extendClasses}) =>
45
+ `
46
+ ${enums}
47
+ ${structs}
48
+ class JSI_EXPORT ${className} final${extendClasses} {
49
+ public:
50
+ ${className}() = default;
51
+ ${className}(const PropsParserContext& context, const ${className} &sourceProps, const RawProps &rawProps);
52
+
53
+ #pragma mark - Props
54
+
55
+ ${props}
56
+ };
57
+ `.trim();
58
+ const EnumTemplate = ({enumName, values, fromCases, toCases}) =>
59
+ `
60
+ enum class ${enumName} { ${values} };
61
+
62
+ static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, ${enumName} &result) {
63
+ auto string = (std::string)value;
64
+ ${fromCases}
65
+ abort();
66
+ }
67
+
68
+ static inline std::string toString(const ${enumName} &value) {
69
+ switch (value) {
70
+ ${toCases}
71
+ }
72
+ }
73
+ `.trim();
74
+ const IntEnumTemplate = ({enumName, values, fromCases, toCases}) =>
75
+ `
76
+ enum class ${enumName} { ${values} };
77
+
78
+ static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, ${enumName} &result) {
79
+ assert(value.hasType<int>());
80
+ auto integerValue = (int)value;
81
+ switch (integerValue) {${fromCases}
82
+ }
83
+ abort();
84
+ }
85
+
86
+ static inline std::string toString(const ${enumName} &value) {
87
+ switch (value) {
88
+ ${toCases}
89
+ }
90
+ }
91
+ `.trim();
92
+ const StructTemplate = ({structName, fields, fromCases}) =>
93
+ `struct ${structName} {
94
+ ${fields}
95
+ };
96
+
97
+ static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, ${structName} &result) {
98
+ auto map = (butter::map<std::string, RawValue>)value;
99
+
100
+ ${fromCases}
101
+ }
102
+
103
+ static inline std::string toString(const ${structName} &value) {
104
+ return "[Object ${structName}]";
105
+ }
106
+ `.trim();
107
+ const ArrayConversionFunctionTemplate = ({
108
+ structName,
109
+ }) => `static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, std::vector<${structName}> &result) {
110
+ auto items = (std::vector<RawValue>)value;
111
+ for (const auto &item : items) {
112
+ ${structName} newItem;
113
+ fromRawValue(context, item, newItem);
114
+ result.emplace_back(newItem);
115
+ }
116
+ }
117
+ `;
118
+ const DoubleArrayConversionFunctionTemplate = ({
119
+ structName,
120
+ }) => `static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, std::vector<std::vector<${structName}>> &result) {
121
+ auto items = (std::vector<std::vector<RawValue>>)value;
122
+ for (const std::vector<RawValue> &item : items) {
123
+ auto nestedArray = std::vector<${structName}>{};
124
+ for (const RawValue &nestedItem : item) {
125
+ ${structName} newItem;
126
+ fromRawValue(context, nestedItem, newItem);
127
+ nestedArray.emplace_back(newItem);
128
+ }
129
+ result.emplace_back(nestedArray);
130
+ }
131
+ }
132
+ `;
133
+ const ArrayEnumTemplate = ({enumName, enumMask, values, fromCases, toCases}) =>
134
+ `
135
+ using ${enumMask} = uint32_t;
136
+
137
+ enum class ${enumName}: ${enumMask} {
138
+ ${values}
139
+ };
140
+
141
+ constexpr bool operator&(
142
+ ${enumMask} const lhs,
143
+ enum ${enumName} const rhs) {
144
+ return lhs & static_cast<${enumMask}>(rhs);
145
+ }
146
+
147
+ constexpr ${enumMask} operator|(
148
+ ${enumMask} const lhs,
149
+ enum ${enumName} const rhs) {
150
+ return lhs | static_cast<${enumMask}>(rhs);
151
+ }
152
+
153
+ constexpr void operator|=(
154
+ ${enumMask} &lhs,
155
+ enum ${enumName} const rhs) {
156
+ lhs = lhs | static_cast<${enumMask}>(rhs);
157
+ }
158
+
159
+ static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, ${enumMask} &result) {
160
+ auto items = std::vector<std::string>{value};
161
+ for (const auto &item : items) {
162
+ ${fromCases}
163
+ abort();
164
+ }
165
+ }
166
+
167
+ static inline std::string toString(const ${enumMask} &value) {
168
+ auto result = std::string{};
169
+ auto separator = std::string{", "};
170
+
171
+ ${toCases}
172
+ if (!result.empty()) {
173
+ result.erase(result.length() - separator.length());
174
+ }
175
+ return result;
176
+ }
177
+ `.trim();
178
+ function getClassExtendString(component) {
179
+ if (component.extendsProps.length === 0) {
180
+ throw new Error('Invalid: component.extendsProps is empty');
181
+ }
182
+ const extendString =
183
+ ' : ' +
184
+ component.extendsProps
185
+ .map(extendProps => {
186
+ switch (extendProps.type) {
187
+ case 'ReactNativeBuiltInType':
188
+ switch (extendProps.knownTypeName) {
189
+ case 'ReactNativeCoreViewProps':
190
+ return 'public ViewProps';
191
+ default:
192
+ extendProps.knownTypeName;
193
+ throw new Error('Invalid knownTypeName');
194
+ }
195
+ default:
196
+ extendProps.type;
197
+ throw new Error('Invalid extended type');
198
+ }
199
+ })
200
+ .join(' ');
201
+ return extendString;
202
+ }
203
+ function convertValueToEnumOption(value) {
204
+ return toSafeCppString(value);
205
+ }
206
+ function generateArrayEnumString(componentName, name, options) {
207
+ const enumName = getEnumName(componentName, name);
208
+ const values = options
209
+ .map((option, index) => `${toSafeCppString(option)} = 1 << ${index}`)
210
+ .join(',\n ');
211
+ const fromCases = options
212
+ .map(
213
+ option => `if (item == "${option}") {
214
+ result |= ${enumName}::${toSafeCppString(option)};
215
+ continue;
216
+ }`,
217
+ )
218
+ .join('\n ');
219
+ const toCases = options
220
+ .map(
221
+ option => `if (value & ${enumName}::${toSafeCppString(option)}) {
222
+ result += "${option}" + separator;
223
+ }`,
224
+ )
225
+ .join('\n' + ' ');
226
+ return ArrayEnumTemplate({
227
+ enumName,
228
+ enumMask: getEnumMaskName(enumName),
229
+ values,
230
+ fromCases,
231
+ toCases,
232
+ });
233
+ }
234
+ function generateStringEnum(componentName, prop) {
235
+ const typeAnnotation = prop.typeAnnotation;
236
+ if (typeAnnotation.type === 'StringEnumTypeAnnotation') {
237
+ const values = typeAnnotation.options;
238
+ const enumName = getEnumName(componentName, prop.name);
239
+ const fromCases = values
240
+ .map(
241
+ value =>
242
+ `if (string == "${value}") { result = ${enumName}::${convertValueToEnumOption(
243
+ value,
244
+ )}; return; }`,
245
+ )
246
+ .join('\n' + ' ');
247
+ const toCases = values
248
+ .map(
249
+ value =>
250
+ `case ${enumName}::${convertValueToEnumOption(
251
+ value,
252
+ )}: return "${value}";`,
253
+ )
254
+ .join('\n' + ' ');
255
+ return EnumTemplate({
256
+ enumName,
257
+ values: values.map(toSafeCppString).join(', '),
258
+ fromCases: fromCases,
259
+ toCases: toCases,
260
+ });
261
+ }
262
+ return '';
263
+ }
264
+ function generateIntEnum(componentName, prop) {
265
+ const typeAnnotation = prop.typeAnnotation;
266
+ if (typeAnnotation.type === 'Int32EnumTypeAnnotation') {
267
+ const values = typeAnnotation.options;
268
+ const enumName = getEnumName(componentName, prop.name);
269
+ const fromCases = values
270
+ .map(
271
+ value => `
272
+ case ${value}:
273
+ result = ${enumName}::${toIntEnumValueName(prop.name, value)};
274
+ return;`,
275
+ )
276
+ .join('');
277
+ const toCases = values
278
+ .map(
279
+ value =>
280
+ `case ${enumName}::${toIntEnumValueName(
281
+ prop.name,
282
+ value,
283
+ )}: return "${value}";`,
284
+ )
285
+ .join('\n' + ' ');
286
+ const valueVariables = values
287
+ .map(val => `${toIntEnumValueName(prop.name, val)} = ${val}`)
288
+ .join(', ');
289
+ return IntEnumTemplate({
290
+ enumName,
291
+ values: valueVariables,
292
+ fromCases,
293
+ toCases,
294
+ });
295
+ }
296
+ return '';
297
+ }
298
+ function generateEnumString(componentName, component) {
299
+ return component.props
300
+ .map(prop => {
301
+ if (
302
+ prop.typeAnnotation.type === 'ArrayTypeAnnotation' &&
303
+ prop.typeAnnotation.elementType.type === 'StringEnumTypeAnnotation'
304
+ ) {
305
+ return generateArrayEnumString(
306
+ componentName,
307
+ prop.name,
308
+ prop.typeAnnotation.elementType.options,
309
+ );
310
+ }
311
+ if (prop.typeAnnotation.type === 'StringEnumTypeAnnotation') {
312
+ return generateStringEnum(componentName, prop);
313
+ }
314
+ if (prop.typeAnnotation.type === 'Int32EnumTypeAnnotation') {
315
+ return generateIntEnum(componentName, prop);
316
+ }
317
+ if (prop.typeAnnotation.type === 'ObjectTypeAnnotation') {
318
+ return prop.typeAnnotation.properties
319
+ .map(property => {
320
+ if (property.typeAnnotation.type === 'StringEnumTypeAnnotation') {
321
+ return generateStringEnum(componentName, property);
322
+ } else if (
323
+ property.typeAnnotation.type === 'Int32EnumTypeAnnotation'
324
+ ) {
325
+ return generateIntEnum(componentName, property);
326
+ }
327
+ return null;
328
+ })
329
+ .filter(Boolean)
330
+ .join('\n');
331
+ }
332
+ })
333
+ .filter(Boolean)
334
+ .join('\n');
335
+ }
336
+ function generatePropsString(componentName, props) {
337
+ return props
338
+ .map(prop => {
339
+ const nativeType = getNativeTypeFromAnnotation(componentName, prop, []);
340
+ const defaultValue = convertDefaultTypeToString(componentName, prop);
341
+ return `${nativeType} ${prop.name}{${defaultValue}};`;
342
+ })
343
+ .join('\n' + ' ');
344
+ }
345
+ function getExtendsImports(extendsProps) {
346
+ const imports = new Set();
347
+ imports.add('#include <react/renderer/core/PropsParserContext.h>');
348
+ imports.add('#include <jsi/jsi.h>');
349
+ extendsProps.forEach(extendProps => {
350
+ switch (extendProps.type) {
351
+ case 'ReactNativeBuiltInType':
352
+ switch (extendProps.knownTypeName) {
353
+ case 'ReactNativeCoreViewProps':
354
+ imports.add(
355
+ '#include <react/renderer/components/view/ViewProps.h>',
356
+ );
357
+ return;
358
+ default:
359
+ extendProps.knownTypeName;
360
+ throw new Error('Invalid knownTypeName');
361
+ }
362
+ default:
363
+ extendProps.type;
364
+ throw new Error('Invalid extended type');
365
+ }
366
+ });
367
+ return imports;
368
+ }
369
+ function generateStructsForComponent(componentName, component) {
370
+ const structs = generateStructs(componentName, component.props, []);
371
+ const structArray = Array.from(structs.values());
372
+ if (structArray.length < 1) {
373
+ return '';
374
+ }
375
+ return structArray.join('\n\n');
376
+ }
377
+ function generateStructs(componentName, properties, nameParts) {
378
+ const structs = new Map();
379
+ properties.forEach(prop => {
380
+ const typeAnnotation = prop.typeAnnotation;
381
+ if (typeAnnotation.type === 'ObjectTypeAnnotation') {
382
+ // Recursively visit all of the object properties.
383
+ // Note: this is depth first so that the nested structs are ordered first.
384
+ const elementProperties = typeAnnotation.properties;
385
+ const nestedStructs = generateStructs(
386
+ componentName,
387
+ elementProperties,
388
+ nameParts.concat([prop.name]),
389
+ );
390
+ nestedStructs.forEach(function (value, key) {
391
+ structs.set(key, value);
392
+ });
393
+ generateStruct(
394
+ structs,
395
+ componentName,
396
+ nameParts.concat([prop.name]),
397
+ typeAnnotation.properties,
398
+ );
399
+ }
400
+ if (
401
+ prop.typeAnnotation.type === 'ArrayTypeAnnotation' &&
402
+ prop.typeAnnotation.elementType.type === 'ObjectTypeAnnotation'
403
+ ) {
404
+ // Recursively visit all of the object properties.
405
+ // Note: this is depth first so that the nested structs are ordered first.
406
+ const elementProperties = prop.typeAnnotation.elementType.properties;
407
+ const nestedStructs = generateStructs(
408
+ componentName,
409
+ elementProperties,
410
+ nameParts.concat([prop.name]),
411
+ );
412
+ nestedStructs.forEach(function (value, key) {
413
+ structs.set(key, value);
414
+ });
415
+
416
+ // Generate this struct and its conversion function.
417
+ generateStruct(
418
+ structs,
419
+ componentName,
420
+ nameParts.concat([prop.name]),
421
+ elementProperties,
422
+ );
423
+
424
+ // Generate the conversion function for std:vector<Object>.
425
+ // Note: This needs to be at the end since it references the struct above.
426
+ structs.set(
427
+ `${[componentName, ...nameParts.concat([prop.name])].join(
428
+ '',
429
+ )}ArrayStruct`,
430
+ ArrayConversionFunctionTemplate({
431
+ structName: generateStructName(
432
+ componentName,
433
+ nameParts.concat([prop.name]),
434
+ ),
435
+ }),
436
+ );
437
+ }
438
+ if (
439
+ prop.typeAnnotation.type === 'ArrayTypeAnnotation' &&
440
+ prop.typeAnnotation.elementType.type === 'ArrayTypeAnnotation' &&
441
+ prop.typeAnnotation.elementType.elementType.type ===
442
+ 'ObjectTypeAnnotation'
443
+ ) {
444
+ // Recursively visit all of the object properties.
445
+ // Note: this is depth first so that the nested structs are ordered first.
446
+ const elementProperties =
447
+ prop.typeAnnotation.elementType.elementType.properties;
448
+ const nestedStructs = generateStructs(
449
+ componentName,
450
+ elementProperties,
451
+ nameParts.concat([prop.name]),
452
+ );
453
+ nestedStructs.forEach(function (value, key) {
454
+ structs.set(key, value);
455
+ });
456
+
457
+ // Generate this struct and its conversion function.
458
+ generateStruct(
459
+ structs,
460
+ componentName,
461
+ nameParts.concat([prop.name]),
462
+ elementProperties,
463
+ );
464
+
465
+ // Generate the conversion function for std:vector<Object>.
466
+ // Note: This needs to be at the end since it references the struct above.
467
+ structs.set(
468
+ `${[componentName, ...nameParts.concat([prop.name])].join(
469
+ '',
470
+ )}ArrayArrayStruct`,
471
+ DoubleArrayConversionFunctionTemplate({
472
+ structName: generateStructName(
473
+ componentName,
474
+ nameParts.concat([prop.name]),
475
+ ),
476
+ }),
477
+ );
478
+ }
479
+ });
480
+ return structs;
481
+ }
482
+ function generateStruct(structs, componentName, nameParts, properties) {
483
+ const structNameParts = nameParts;
484
+ const structName = generateStructName(componentName, structNameParts);
485
+ const fields = properties
486
+ .map(property => {
487
+ return `${getNativeTypeFromAnnotation(
488
+ componentName,
489
+ property,
490
+ structNameParts,
491
+ )} ${property.name};`;
492
+ })
493
+ .join('\n' + ' ');
494
+ properties.forEach(property => {
495
+ const name = property.name;
496
+ switch (property.typeAnnotation.type) {
497
+ case 'BooleanTypeAnnotation':
498
+ return;
499
+ case 'StringTypeAnnotation':
500
+ return;
501
+ case 'Int32TypeAnnotation':
502
+ return;
503
+ case 'DoubleTypeAnnotation':
504
+ return;
505
+ case 'FloatTypeAnnotation':
506
+ return;
507
+ case 'ReservedPropTypeAnnotation':
508
+ return;
509
+ case 'ArrayTypeAnnotation':
510
+ return;
511
+ case 'StringEnumTypeAnnotation':
512
+ return;
513
+ case 'Int32EnumTypeAnnotation':
514
+ return;
515
+ case 'DoubleTypeAnnotation':
516
+ return;
517
+ case 'ObjectTypeAnnotation':
518
+ const props = property.typeAnnotation.properties;
519
+ if (props == null) {
520
+ throw new Error(
521
+ `Properties are expected for ObjectTypeAnnotation (see ${name} in ${componentName})`,
522
+ );
523
+ }
524
+ generateStruct(structs, componentName, nameParts.concat([name]), props);
525
+ return;
526
+ default:
527
+ property.typeAnnotation.type;
528
+ throw new Error(
529
+ `Received invalid component property type ${property.typeAnnotation.type}`,
530
+ );
531
+ }
532
+ });
533
+ const fromCases = properties
534
+ .map(property => {
535
+ const variable = 'tmp_' + property.name;
536
+ return `auto ${variable} = map.find("${property.name}");
537
+ if (${variable} != map.end()) {
538
+ fromRawValue(context, ${variable}->second, result.${property.name});
539
+ }`;
540
+ })
541
+ .join('\n ');
542
+ structs.set(
543
+ structName,
544
+ StructTemplate({
545
+ structName,
546
+ fields,
547
+ fromCases,
548
+ }),
549
+ );
550
+ }
551
+ module.exports = {
552
+ generate(libraryName, schema, packageName, assumeNonnull = false) {
553
+ const fileName = 'Props.h';
554
+ const allImports = new Set();
555
+ const componentClasses = Object.keys(schema.modules)
556
+ .map(moduleName => {
557
+ const module = schema.modules[moduleName];
558
+ if (module.type !== 'Component') {
559
+ return;
560
+ }
561
+ const components = module.components;
562
+ // No components in this module
563
+ if (components == null) {
564
+ return null;
565
+ }
566
+ return Object.keys(components)
567
+ .map(componentName => {
568
+ const component = components[componentName];
569
+ const newName = `${componentName}Props`;
570
+ const structString = generateStructsForComponent(
571
+ componentName,
572
+ component,
573
+ );
574
+ const enumString = generateEnumString(componentName, component);
575
+ const propsString = generatePropsString(
576
+ componentName,
577
+ component.props,
578
+ );
579
+ const extendString = getClassExtendString(component);
580
+ const extendsImports = getExtendsImports(component.extendsProps);
581
+ const imports = getLocalImports(component.props);
582
+
583
+ // $FlowFixMe[method-unbinding] added when improving typing for this parameters
584
+ extendsImports.forEach(allImports.add, allImports);
585
+ // $FlowFixMe[method-unbinding] added when improving typing for this parameters
586
+ imports.forEach(allImports.add, allImports);
587
+ const replacedTemplate = ClassTemplate({
588
+ enums: enumString,
589
+ structs: structString,
590
+ className: newName,
591
+ extendClasses: extendString,
592
+ props: propsString,
593
+ });
594
+ return replacedTemplate;
595
+ })
596
+ .join('\n\n');
597
+ })
598
+ .filter(Boolean)
599
+ .join('\n\n');
600
+ const replacedTemplate = FileTemplate({
601
+ componentClasses,
602
+ imports: Array.from(allImports).sort().join('\n'),
603
+ });
604
+ return new Map([[fileName, replacedTemplate]]);
605
+ },
606
+ };