@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,330 @@
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 _slicedToArray(arr, i) {
14
+ return (
15
+ _arrayWithHoles(arr) ||
16
+ _iterableToArrayLimit(arr, i) ||
17
+ _unsupportedIterableToArray(arr, i) ||
18
+ _nonIterableRest()
19
+ );
20
+ }
21
+ function _nonIterableRest() {
22
+ throw new TypeError(
23
+ 'Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.',
24
+ );
25
+ }
26
+ function _unsupportedIterableToArray(o, minLen) {
27
+ if (!o) return;
28
+ if (typeof o === 'string') return _arrayLikeToArray(o, minLen);
29
+ var n = Object.prototype.toString.call(o).slice(8, -1);
30
+ if (n === 'Object' && o.constructor) n = o.constructor.name;
31
+ if (n === 'Map' || n === 'Set') return Array.from(o);
32
+ if (n === 'Arguments' || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))
33
+ return _arrayLikeToArray(o, minLen);
34
+ }
35
+ function _arrayLikeToArray(arr, len) {
36
+ if (len == null || len > arr.length) len = arr.length;
37
+ for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
38
+ return arr2;
39
+ }
40
+ function _iterableToArrayLimit(arr, i) {
41
+ var _i =
42
+ null == arr
43
+ ? null
44
+ : ('undefined' != typeof Symbol && arr[Symbol.iterator]) ||
45
+ arr['@@iterator'];
46
+ if (null != _i) {
47
+ var _s,
48
+ _e,
49
+ _x,
50
+ _r,
51
+ _arr = [],
52
+ _n = !0,
53
+ _d = !1;
54
+ try {
55
+ if (((_x = (_i = _i.call(arr)).next), 0 === i)) {
56
+ if (Object(_i) !== _i) return;
57
+ _n = !1;
58
+ } else
59
+ for (
60
+ ;
61
+ !(_n = (_s = _x.call(_i)).done) &&
62
+ (_arr.push(_s.value), _arr.length !== i);
63
+ _n = !0
64
+ );
65
+ } catch (err) {
66
+ (_d = !0), (_e = err);
67
+ } finally {
68
+ try {
69
+ if (!_n && null != _i.return && ((_r = _i.return()), Object(_r) !== _r))
70
+ return;
71
+ } finally {
72
+ if (_d) throw _e;
73
+ }
74
+ }
75
+ return _arr;
76
+ }
77
+ }
78
+ function _arrayWithHoles(arr) {
79
+ if (Array.isArray(arr)) return arr;
80
+ }
81
+ const _require = require('../Utils'),
82
+ getSafePropertyName = _require.getSafePropertyName,
83
+ getNamespacedStructName = _require.getNamespacedStructName;
84
+ const _require2 = require('../../../Utils'),
85
+ capitalize = _require2.capitalize;
86
+ const _require3 = require('../../../../parsers/parsers-commons'),
87
+ unwrapNullable = _require3.unwrapNullable;
88
+ const StructTemplate = ({
89
+ hasteModuleName,
90
+ structName,
91
+ structProperties,
92
+ }) => `namespace JS {
93
+ namespace ${hasteModuleName} {
94
+ struct ${structName} {
95
+ ${structProperties}
96
+
97
+ ${structName}(NSDictionary *const v) : _v(v) {}
98
+ private:
99
+ NSDictionary *_v;
100
+ };
101
+ }
102
+ }
103
+
104
+ @interface RCTCxxConvert (${hasteModuleName}_${structName})
105
+ + (RCTManagedPointer *)JS_${hasteModuleName}_${structName}:(id)json;
106
+ @end`;
107
+ const MethodTemplate = ({
108
+ returnType,
109
+ returnValue,
110
+ hasteModuleName,
111
+ structName,
112
+ propertyName,
113
+ safePropertyName,
114
+ }) => `inline ${returnType}JS::${hasteModuleName}::${structName}::${safePropertyName}() const
115
+ {
116
+ id const p = _v[@"${propertyName}"];
117
+ return ${returnValue};
118
+ }`;
119
+ function toObjCType(
120
+ hasteModuleName,
121
+ nullableTypeAnnotation,
122
+ isOptional = false,
123
+ ) {
124
+ const _unwrapNullable = unwrapNullable(nullableTypeAnnotation),
125
+ _unwrapNullable2 = _slicedToArray(_unwrapNullable, 2),
126
+ typeAnnotation = _unwrapNullable2[0],
127
+ nullable = _unwrapNullable2[1];
128
+ const isRequired = !nullable && !isOptional;
129
+ const wrapOptional = type => {
130
+ return isRequired ? type : `std::optional<${type}>`;
131
+ };
132
+ switch (typeAnnotation.type) {
133
+ case 'ReservedTypeAnnotation':
134
+ switch (typeAnnotation.name) {
135
+ case 'RootTag':
136
+ return wrapOptional('double');
137
+ default:
138
+ typeAnnotation.name;
139
+ throw new Error(`Unknown prop type, found: ${typeAnnotation.name}"`);
140
+ }
141
+ case 'StringTypeAnnotation':
142
+ return 'NSString *';
143
+ case 'NumberTypeAnnotation':
144
+ return wrapOptional('double');
145
+ case 'FloatTypeAnnotation':
146
+ return wrapOptional('double');
147
+ case 'Int32TypeAnnotation':
148
+ return wrapOptional('double');
149
+ case 'DoubleTypeAnnotation':
150
+ return wrapOptional('double');
151
+ case 'BooleanTypeAnnotation':
152
+ return wrapOptional('bool');
153
+ case 'EnumDeclaration':
154
+ switch (typeAnnotation.memberType) {
155
+ case 'NumberTypeAnnotation':
156
+ return wrapOptional('double');
157
+ case 'StringTypeAnnotation':
158
+ return 'NSString *';
159
+ default:
160
+ throw new Error(
161
+ `Couldn't convert enum into ObjC type: ${typeAnnotation.type}"`,
162
+ );
163
+ }
164
+ case 'GenericObjectTypeAnnotation':
165
+ return isRequired ? 'id<NSObject> ' : 'id<NSObject> _Nullable';
166
+ case 'ArrayTypeAnnotation':
167
+ if (typeAnnotation.elementType == null) {
168
+ return isRequired ? 'id<NSObject> ' : 'id<NSObject> _Nullable';
169
+ }
170
+ return wrapOptional(
171
+ `facebook::react::LazyVector<${toObjCType(
172
+ hasteModuleName,
173
+ typeAnnotation.elementType,
174
+ )}>`,
175
+ );
176
+ case 'TypeAliasTypeAnnotation':
177
+ const structName = capitalize(typeAnnotation.name);
178
+ const namespacedStructName = getNamespacedStructName(
179
+ hasteModuleName,
180
+ structName,
181
+ );
182
+ return wrapOptional(namespacedStructName);
183
+ default:
184
+ typeAnnotation.type;
185
+ throw new Error(
186
+ `Couldn't convert into ObjC type: ${typeAnnotation.type}"`,
187
+ );
188
+ }
189
+ }
190
+ function toObjCValue(
191
+ hasteModuleName,
192
+ nullableTypeAnnotation,
193
+ value,
194
+ depth,
195
+ isOptional = false,
196
+ ) {
197
+ const _unwrapNullable3 = unwrapNullable(nullableTypeAnnotation),
198
+ _unwrapNullable4 = _slicedToArray(_unwrapNullable3, 2),
199
+ typeAnnotation = _unwrapNullable4[0],
200
+ nullable = _unwrapNullable4[1];
201
+ const isRequired = !nullable && !isOptional;
202
+ const RCTBridgingTo = (type, arg) => {
203
+ const args = [value, arg].filter(Boolean).join(', ');
204
+ return isRequired
205
+ ? `RCTBridgingTo${type}(${args})`
206
+ : `RCTBridgingToOptional${type}(${args})`;
207
+ };
208
+ switch (typeAnnotation.type) {
209
+ case 'ReservedTypeAnnotation':
210
+ switch (typeAnnotation.name) {
211
+ case 'RootTag':
212
+ return RCTBridgingTo('Double');
213
+ default:
214
+ typeAnnotation.name;
215
+ throw new Error(
216
+ `Couldn't convert into ObjC type: ${typeAnnotation.type}"`,
217
+ );
218
+ }
219
+ case 'StringTypeAnnotation':
220
+ return RCTBridgingTo('String');
221
+ case 'NumberTypeAnnotation':
222
+ return RCTBridgingTo('Double');
223
+ case 'FloatTypeAnnotation':
224
+ return RCTBridgingTo('Double');
225
+ case 'Int32TypeAnnotation':
226
+ return RCTBridgingTo('Double');
227
+ case 'DoubleTypeAnnotation':
228
+ return RCTBridgingTo('Double');
229
+ case 'BooleanTypeAnnotation':
230
+ return RCTBridgingTo('Bool');
231
+ case 'EnumDeclaration':
232
+ switch (typeAnnotation.memberType) {
233
+ case 'NumberTypeAnnotation':
234
+ return RCTBridgingTo('Double');
235
+ case 'StringTypeAnnotation':
236
+ return RCTBridgingTo('String');
237
+ default:
238
+ throw new Error(
239
+ `Couldn't convert enum into ObjC value: ${typeAnnotation.type}"`,
240
+ );
241
+ }
242
+ case 'GenericObjectTypeAnnotation':
243
+ return value;
244
+ case 'ArrayTypeAnnotation':
245
+ const elementType = typeAnnotation.elementType;
246
+ if (elementType == null) {
247
+ return value;
248
+ }
249
+ const localVarName = `itemValue_${depth}`;
250
+ const elementObjCType = toObjCType(hasteModuleName, elementType);
251
+ const elementObjCValue = toObjCValue(
252
+ hasteModuleName,
253
+ elementType,
254
+ localVarName,
255
+ depth + 1,
256
+ );
257
+ return RCTBridgingTo(
258
+ 'Vec',
259
+ `^${elementObjCType}(id ${localVarName}) { return ${elementObjCValue}; }`,
260
+ );
261
+ case 'TypeAliasTypeAnnotation':
262
+ const structName = capitalize(typeAnnotation.name);
263
+ const namespacedStructName = getNamespacedStructName(
264
+ hasteModuleName,
265
+ structName,
266
+ );
267
+ return !isRequired
268
+ ? `(${value} == nil ? std::nullopt : std::make_optional(${namespacedStructName}(${value})))`
269
+ : `${namespacedStructName}(${value})`;
270
+ default:
271
+ typeAnnotation.type;
272
+ throw new Error(
273
+ `Couldn't convert into ObjC value: ${typeAnnotation.type}"`,
274
+ );
275
+ }
276
+ }
277
+ function serializeRegularStruct(hasteModuleName, struct) {
278
+ const declaration = StructTemplate({
279
+ hasteModuleName: hasteModuleName,
280
+ structName: struct.name,
281
+ structProperties: struct.properties
282
+ .map(property => {
283
+ const typeAnnotation = property.typeAnnotation,
284
+ optional = property.optional;
285
+ const safePropName = getSafePropertyName(property);
286
+ const returnType = toObjCType(
287
+ hasteModuleName,
288
+ typeAnnotation,
289
+ optional,
290
+ );
291
+ const padding = ' '.repeat(returnType.endsWith('*') ? 0 : 1);
292
+ return `${returnType}${padding}${safePropName}() const;`;
293
+ })
294
+ .join('\n '),
295
+ });
296
+
297
+ // $FlowFixMe[missing-type-arg]
298
+ const methods = struct.properties
299
+ .map(property => {
300
+ const typeAnnotation = property.typeAnnotation,
301
+ optional = property.optional,
302
+ propName = property.name;
303
+ const safePropertyName = getSafePropertyName(property);
304
+ const returnType = toObjCType(hasteModuleName, typeAnnotation, optional);
305
+ const returnValue = toObjCValue(
306
+ hasteModuleName,
307
+ typeAnnotation,
308
+ 'p',
309
+ 0,
310
+ optional,
311
+ );
312
+ const padding = ' '.repeat(returnType.endsWith('*') ? 0 : 1);
313
+ return MethodTemplate({
314
+ hasteModuleName,
315
+ structName: struct.name,
316
+ returnType: returnType + padding,
317
+ returnValue: returnValue,
318
+ propertyName: propName,
319
+ safePropertyName,
320
+ });
321
+ })
322
+ .join('\n');
323
+ return {
324
+ methods,
325
+ declaration,
326
+ };
327
+ }
328
+ module.exports = {
329
+ serializeRegularStruct,
330
+ };
@@ -0,0 +1,279 @@
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
+ const {getSafePropertyName, getNamespacedStructName} = require('../Utils');
14
+ const {capitalize} = require('../../../Utils');
15
+
16
+ import type {Nullable} from '../../../../CodegenSchema';
17
+ import type {StructTypeAnnotation, RegularStruct} from '../StructCollector';
18
+ import type {StructSerilizationOutput} from './serializeStruct';
19
+
20
+ const {unwrapNullable} = require('../../../../parsers/parsers-commons');
21
+
22
+ const StructTemplate = ({
23
+ hasteModuleName,
24
+ structName,
25
+ structProperties,
26
+ }: $ReadOnly<{
27
+ hasteModuleName: string,
28
+ structName: string,
29
+ structProperties: string,
30
+ }>) => `namespace JS {
31
+ namespace ${hasteModuleName} {
32
+ struct ${structName} {
33
+ ${structProperties}
34
+
35
+ ${structName}(NSDictionary *const v) : _v(v) {}
36
+ private:
37
+ NSDictionary *_v;
38
+ };
39
+ }
40
+ }
41
+
42
+ @interface RCTCxxConvert (${hasteModuleName}_${structName})
43
+ + (RCTManagedPointer *)JS_${hasteModuleName}_${structName}:(id)json;
44
+ @end`;
45
+
46
+ const MethodTemplate = ({
47
+ returnType,
48
+ returnValue,
49
+ hasteModuleName,
50
+ structName,
51
+ propertyName,
52
+ safePropertyName,
53
+ }: $ReadOnly<{
54
+ returnType: string,
55
+ returnValue: string,
56
+ hasteModuleName: string,
57
+ structName: string,
58
+ propertyName: string,
59
+ safePropertyName: string,
60
+ }>) => `inline ${returnType}JS::${hasteModuleName}::${structName}::${safePropertyName}() const
61
+ {
62
+ id const p = _v[@"${propertyName}"];
63
+ return ${returnValue};
64
+ }`;
65
+
66
+ function toObjCType(
67
+ hasteModuleName: string,
68
+ nullableTypeAnnotation: Nullable<StructTypeAnnotation>,
69
+ isOptional: boolean = false,
70
+ ): string {
71
+ const [typeAnnotation, nullable] = unwrapNullable(nullableTypeAnnotation);
72
+ const isRequired = !nullable && !isOptional;
73
+ const wrapOptional = (type: string) => {
74
+ return isRequired ? type : `std::optional<${type}>`;
75
+ };
76
+
77
+ switch (typeAnnotation.type) {
78
+ case 'ReservedTypeAnnotation':
79
+ switch (typeAnnotation.name) {
80
+ case 'RootTag':
81
+ return wrapOptional('double');
82
+ default:
83
+ (typeAnnotation.name: empty);
84
+ throw new Error(`Unknown prop type, found: ${typeAnnotation.name}"`);
85
+ }
86
+ case 'StringTypeAnnotation':
87
+ return 'NSString *';
88
+ case 'NumberTypeAnnotation':
89
+ return wrapOptional('double');
90
+ case 'FloatTypeAnnotation':
91
+ return wrapOptional('double');
92
+ case 'Int32TypeAnnotation':
93
+ return wrapOptional('double');
94
+ case 'DoubleTypeAnnotation':
95
+ return wrapOptional('double');
96
+ case 'BooleanTypeAnnotation':
97
+ return wrapOptional('bool');
98
+ case 'EnumDeclaration':
99
+ switch (typeAnnotation.memberType) {
100
+ case 'NumberTypeAnnotation':
101
+ return wrapOptional('double');
102
+ case 'StringTypeAnnotation':
103
+ return 'NSString *';
104
+ default:
105
+ throw new Error(
106
+ `Couldn't convert enum into ObjC type: ${typeAnnotation.type}"`,
107
+ );
108
+ }
109
+ case 'GenericObjectTypeAnnotation':
110
+ return isRequired ? 'id<NSObject> ' : 'id<NSObject> _Nullable';
111
+ case 'ArrayTypeAnnotation':
112
+ if (typeAnnotation.elementType == null) {
113
+ return isRequired ? 'id<NSObject> ' : 'id<NSObject> _Nullable';
114
+ }
115
+ return wrapOptional(
116
+ `facebook::react::LazyVector<${toObjCType(
117
+ hasteModuleName,
118
+ typeAnnotation.elementType,
119
+ )}>`,
120
+ );
121
+ case 'TypeAliasTypeAnnotation':
122
+ const structName = capitalize(typeAnnotation.name);
123
+ const namespacedStructName = getNamespacedStructName(
124
+ hasteModuleName,
125
+ structName,
126
+ );
127
+ return wrapOptional(namespacedStructName);
128
+ default:
129
+ (typeAnnotation.type: empty);
130
+ throw new Error(
131
+ `Couldn't convert into ObjC type: ${typeAnnotation.type}"`,
132
+ );
133
+ }
134
+ }
135
+
136
+ function toObjCValue(
137
+ hasteModuleName: string,
138
+ nullableTypeAnnotation: Nullable<StructTypeAnnotation>,
139
+ value: string,
140
+ depth: number,
141
+ isOptional: boolean = false,
142
+ ): string {
143
+ const [typeAnnotation, nullable] = unwrapNullable(nullableTypeAnnotation);
144
+ const isRequired = !nullable && !isOptional;
145
+ const RCTBridgingTo = (type: string, arg?: string) => {
146
+ const args = [value, arg].filter(Boolean).join(', ');
147
+ return isRequired
148
+ ? `RCTBridgingTo${type}(${args})`
149
+ : `RCTBridgingToOptional${type}(${args})`;
150
+ };
151
+
152
+ switch (typeAnnotation.type) {
153
+ case 'ReservedTypeAnnotation':
154
+ switch (typeAnnotation.name) {
155
+ case 'RootTag':
156
+ return RCTBridgingTo('Double');
157
+ default:
158
+ (typeAnnotation.name: empty);
159
+ throw new Error(
160
+ `Couldn't convert into ObjC type: ${typeAnnotation.type}"`,
161
+ );
162
+ }
163
+ case 'StringTypeAnnotation':
164
+ return RCTBridgingTo('String');
165
+ case 'NumberTypeAnnotation':
166
+ return RCTBridgingTo('Double');
167
+ case 'FloatTypeAnnotation':
168
+ return RCTBridgingTo('Double');
169
+ case 'Int32TypeAnnotation':
170
+ return RCTBridgingTo('Double');
171
+ case 'DoubleTypeAnnotation':
172
+ return RCTBridgingTo('Double');
173
+ case 'BooleanTypeAnnotation':
174
+ return RCTBridgingTo('Bool');
175
+ case 'EnumDeclaration':
176
+ switch (typeAnnotation.memberType) {
177
+ case 'NumberTypeAnnotation':
178
+ return RCTBridgingTo('Double');
179
+ case 'StringTypeAnnotation':
180
+ return RCTBridgingTo('String');
181
+ default:
182
+ throw new Error(
183
+ `Couldn't convert enum into ObjC value: ${typeAnnotation.type}"`,
184
+ );
185
+ }
186
+ case 'GenericObjectTypeAnnotation':
187
+ return value;
188
+ case 'ArrayTypeAnnotation':
189
+ const {elementType} = typeAnnotation;
190
+ if (elementType == null) {
191
+ return value;
192
+ }
193
+
194
+ const localVarName = `itemValue_${depth}`;
195
+ const elementObjCType = toObjCType(hasteModuleName, elementType);
196
+ const elementObjCValue = toObjCValue(
197
+ hasteModuleName,
198
+ elementType,
199
+ localVarName,
200
+ depth + 1,
201
+ );
202
+
203
+ return RCTBridgingTo(
204
+ 'Vec',
205
+ `^${elementObjCType}(id ${localVarName}) { return ${elementObjCValue}; }`,
206
+ );
207
+ case 'TypeAliasTypeAnnotation':
208
+ const structName = capitalize(typeAnnotation.name);
209
+ const namespacedStructName = getNamespacedStructName(
210
+ hasteModuleName,
211
+ structName,
212
+ );
213
+
214
+ return !isRequired
215
+ ? `(${value} == nil ? std::nullopt : std::make_optional(${namespacedStructName}(${value})))`
216
+ : `${namespacedStructName}(${value})`;
217
+ default:
218
+ (typeAnnotation.type: empty);
219
+ throw new Error(
220
+ `Couldn't convert into ObjC value: ${typeAnnotation.type}"`,
221
+ );
222
+ }
223
+ }
224
+
225
+ function serializeRegularStruct(
226
+ hasteModuleName: string,
227
+ struct: RegularStruct,
228
+ ): StructSerilizationOutput {
229
+ const declaration = StructTemplate({
230
+ hasteModuleName: hasteModuleName,
231
+ structName: struct.name,
232
+ structProperties: struct.properties
233
+ .map(property => {
234
+ const {typeAnnotation, optional} = property;
235
+ const safePropName = getSafePropertyName(property);
236
+ const returnType = toObjCType(
237
+ hasteModuleName,
238
+ typeAnnotation,
239
+ optional,
240
+ );
241
+
242
+ const padding = ' '.repeat(returnType.endsWith('*') ? 0 : 1);
243
+ return `${returnType}${padding}${safePropName}() const;`;
244
+ })
245
+ .join('\n '),
246
+ });
247
+
248
+ // $FlowFixMe[missing-type-arg]
249
+ const methods = struct.properties
250
+ .map<string>(property => {
251
+ const {typeAnnotation, optional, name: propName} = property;
252
+ const safePropertyName = getSafePropertyName(property);
253
+ const returnType = toObjCType(hasteModuleName, typeAnnotation, optional);
254
+ const returnValue = toObjCValue(
255
+ hasteModuleName,
256
+ typeAnnotation,
257
+ 'p',
258
+ 0,
259
+ optional,
260
+ );
261
+
262
+ const padding = ' '.repeat(returnType.endsWith('*') ? 0 : 1);
263
+ return MethodTemplate({
264
+ hasteModuleName,
265
+ structName: struct.name,
266
+ returnType: returnType + padding,
267
+ returnValue: returnValue,
268
+ propertyName: propName,
269
+ safePropertyName,
270
+ });
271
+ })
272
+ .join('\n');
273
+
274
+ return {methods, declaration};
275
+ }
276
+
277
+ module.exports = {
278
+ serializeRegularStruct,
279
+ };
@@ -0,0 +1,25 @@
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('./serializeConstantsStruct'),
14
+ serializeConstantsStruct = _require.serializeConstantsStruct;
15
+ const _require2 = require('./serializeRegularStruct'),
16
+ serializeRegularStruct = _require2.serializeRegularStruct;
17
+ function serializeStruct(hasteModuleName, struct) {
18
+ if (struct.context === 'REGULAR') {
19
+ return serializeRegularStruct(hasteModuleName, struct);
20
+ }
21
+ return serializeConstantsStruct(hasteModuleName, struct);
22
+ }
23
+ module.exports = {
24
+ serializeStruct,
25
+ };
@@ -0,0 +1,35 @@
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 {Struct} from '../StructCollector';
14
+
15
+ const {serializeConstantsStruct} = require('./serializeConstantsStruct');
16
+ const {serializeRegularStruct} = require('./serializeRegularStruct');
17
+
18
+ export type StructSerilizationOutput = $ReadOnly<{
19
+ methods: string,
20
+ declaration: string,
21
+ }>;
22
+
23
+ function serializeStruct(
24
+ hasteModuleName: string,
25
+ struct: Struct,
26
+ ): StructSerilizationOutput {
27
+ if (struct.context === 'REGULAR') {
28
+ return serializeRegularStruct(hasteModuleName, struct);
29
+ }
30
+ return serializeConstantsStruct(hasteModuleName, struct);
31
+ }
32
+
33
+ module.exports = {
34
+ serializeStruct,
35
+ };