@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,337 @@
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
+ builderInputProps,
92
+ }) => `namespace JS {
93
+ namespace ${hasteModuleName} {
94
+ struct ${structName} {
95
+
96
+ struct Builder {
97
+ struct Input {
98
+ ${builderInputProps}
99
+ };
100
+
101
+ /** Initialize with a set of values */
102
+ Builder(const Input i);
103
+ /** Initialize with an existing ${structName} */
104
+ Builder(${structName} i);
105
+ /** Builds the object. Generally used only by the infrastructure. */
106
+ NSDictionary *buildUnsafeRawValue() const { return _factory(); };
107
+ private:
108
+ NSDictionary *(^_factory)(void);
109
+ };
110
+
111
+ static ${structName} fromUnsafeRawValue(NSDictionary *const v) { return {v}; }
112
+ NSDictionary *unsafeRawValue() const { return _v; }
113
+ private:
114
+ ${structName}(NSDictionary *const v) : _v(v) {}
115
+ NSDictionary *_v;
116
+ };
117
+ }
118
+ }`;
119
+ const MethodTemplate = ({
120
+ hasteModuleName,
121
+ structName,
122
+ properties,
123
+ }) => `inline JS::${hasteModuleName}::${structName}::Builder::Builder(const Input i) : _factory(^{
124
+ NSMutableDictionary *d = [NSMutableDictionary new];
125
+ ${properties}
126
+ return d;
127
+ }) {}
128
+ inline JS::${hasteModuleName}::${structName}::Builder::Builder(${structName} i) : _factory(^{
129
+ return i.unsafeRawValue();
130
+ }) {}`;
131
+ function toObjCType(
132
+ hasteModuleName,
133
+ nullableTypeAnnotation,
134
+ isOptional = false,
135
+ ) {
136
+ const _unwrapNullable = unwrapNullable(nullableTypeAnnotation),
137
+ _unwrapNullable2 = _slicedToArray(_unwrapNullable, 2),
138
+ typeAnnotation = _unwrapNullable2[0],
139
+ nullable = _unwrapNullable2[1];
140
+ const isRequired = !nullable && !isOptional;
141
+ const wrapOptional = type => {
142
+ return isRequired ? type : `std::optional<${type}>`;
143
+ };
144
+ switch (typeAnnotation.type) {
145
+ case 'ReservedTypeAnnotation':
146
+ switch (typeAnnotation.name) {
147
+ case 'RootTag':
148
+ return wrapOptional('double');
149
+ default:
150
+ typeAnnotation.name;
151
+ throw new Error(`Unknown prop type, found: ${typeAnnotation.name}"`);
152
+ }
153
+ case 'StringTypeAnnotation':
154
+ return 'NSString *';
155
+ case 'NumberTypeAnnotation':
156
+ return wrapOptional('double');
157
+ case 'FloatTypeAnnotation':
158
+ return wrapOptional('double');
159
+ case 'Int32TypeAnnotation':
160
+ return wrapOptional('double');
161
+ case 'DoubleTypeAnnotation':
162
+ return wrapOptional('double');
163
+ case 'BooleanTypeAnnotation':
164
+ return wrapOptional('bool');
165
+ case 'EnumDeclaration':
166
+ switch (typeAnnotation.memberType) {
167
+ case 'NumberTypeAnnotation':
168
+ return wrapOptional('double');
169
+ case 'StringTypeAnnotation':
170
+ return 'NSString *';
171
+ default:
172
+ throw new Error(
173
+ `Couldn't convert enum into ObjC type: ${typeAnnotation.type}"`,
174
+ );
175
+ }
176
+ case 'GenericObjectTypeAnnotation':
177
+ return isRequired ? 'id<NSObject> ' : 'id<NSObject> _Nullable ';
178
+ case 'ArrayTypeAnnotation':
179
+ if (typeAnnotation.elementType == null) {
180
+ return isRequired ? 'id<NSObject> ' : 'id<NSObject> _Nullable ';
181
+ }
182
+ return wrapOptional(
183
+ `std::vector<${toObjCType(
184
+ hasteModuleName,
185
+ typeAnnotation.elementType,
186
+ )}>`,
187
+ );
188
+ case 'TypeAliasTypeAnnotation':
189
+ const structName = capitalize(typeAnnotation.name);
190
+ const namespacedStructName = getNamespacedStructName(
191
+ hasteModuleName,
192
+ structName,
193
+ );
194
+ return wrapOptional(`${namespacedStructName}::Builder`);
195
+ default:
196
+ typeAnnotation.type;
197
+ throw new Error(
198
+ `Couldn't convert into ObjC type: ${typeAnnotation.type}"`,
199
+ );
200
+ }
201
+ }
202
+ function toObjCValue(
203
+ hasteModuleName,
204
+ nullableTypeAnnotation,
205
+ value,
206
+ depth,
207
+ isOptional = false,
208
+ ) {
209
+ const _unwrapNullable3 = unwrapNullable(nullableTypeAnnotation),
210
+ _unwrapNullable4 = _slicedToArray(_unwrapNullable3, 2),
211
+ typeAnnotation = _unwrapNullable4[0],
212
+ nullable = _unwrapNullable4[1];
213
+ const isRequired = !nullable && !isOptional;
214
+ function wrapPrimitive(type) {
215
+ return !isRequired
216
+ ? `${value}.has_value() ? @((${type})${value}.value()) : nil`
217
+ : `@(${value})`;
218
+ }
219
+ switch (typeAnnotation.type) {
220
+ case 'ReservedTypeAnnotation':
221
+ switch (typeAnnotation.name) {
222
+ case 'RootTag':
223
+ return wrapPrimitive('double');
224
+ default:
225
+ typeAnnotation.name;
226
+ throw new Error(
227
+ `Couldn't convert into ObjC type: ${typeAnnotation.type}"`,
228
+ );
229
+ }
230
+ case 'StringTypeAnnotation':
231
+ return value;
232
+ case 'NumberTypeAnnotation':
233
+ return wrapPrimitive('double');
234
+ case 'FloatTypeAnnotation':
235
+ return wrapPrimitive('double');
236
+ case 'Int32TypeAnnotation':
237
+ return wrapPrimitive('double');
238
+ case 'DoubleTypeAnnotation':
239
+ return wrapPrimitive('double');
240
+ case 'BooleanTypeAnnotation':
241
+ return wrapPrimitive('BOOL');
242
+ case 'EnumDeclaration':
243
+ switch (typeAnnotation.memberType) {
244
+ case 'NumberTypeAnnotation':
245
+ return wrapPrimitive('double');
246
+ case 'StringTypeAnnotation':
247
+ return value;
248
+ default:
249
+ throw new Error(
250
+ `Couldn't convert enum into ObjC value: ${typeAnnotation.type}"`,
251
+ );
252
+ }
253
+ case 'GenericObjectTypeAnnotation':
254
+ return value;
255
+ case 'ArrayTypeAnnotation':
256
+ const elementType = typeAnnotation.elementType;
257
+ if (elementType == null) {
258
+ return value;
259
+ }
260
+ const localVarName = `el${'_'.repeat(depth + 1)}`;
261
+ const elementObjCType = toObjCType(hasteModuleName, elementType);
262
+ const elementObjCValue = toObjCValue(
263
+ hasteModuleName,
264
+ elementType,
265
+ localVarName,
266
+ depth + 1,
267
+ );
268
+ const RCTConvertVecToArray = transformer => {
269
+ return `RCTConvert${
270
+ !isRequired ? 'Optional' : ''
271
+ }VecToArray(${value}, ${transformer})`;
272
+ };
273
+ return RCTConvertVecToArray(
274
+ `^id(${elementObjCType} ${localVarName}) { return ${elementObjCValue}; }`,
275
+ );
276
+ case 'TypeAliasTypeAnnotation':
277
+ return !isRequired
278
+ ? `${value}.has_value() ? ${value}.value().buildUnsafeRawValue() : nil`
279
+ : `${value}.buildUnsafeRawValue()`;
280
+ default:
281
+ typeAnnotation.type;
282
+ throw new Error(
283
+ `Couldn't convert into ObjC value: ${typeAnnotation.type}"`,
284
+ );
285
+ }
286
+ }
287
+ function serializeConstantsStruct(hasteModuleName, struct) {
288
+ const declaration = StructTemplate({
289
+ hasteModuleName,
290
+ structName: struct.name,
291
+ builderInputProps: struct.properties
292
+ .map(property => {
293
+ const typeAnnotation = property.typeAnnotation,
294
+ optional = property.optional;
295
+ const safePropName = getSafePropertyName(property);
296
+ const objCType = toObjCType(hasteModuleName, typeAnnotation, optional);
297
+ if (!optional) {
298
+ return `RCTRequired<${objCType}> ${safePropName};`;
299
+ }
300
+ const space = ' '.repeat(objCType.endsWith('*') ? 0 : 1);
301
+ return `${objCType}${space}${safePropName};`;
302
+ })
303
+ .join('\n '),
304
+ });
305
+ const methods = MethodTemplate({
306
+ hasteModuleName,
307
+ structName: struct.name,
308
+ properties: struct.properties
309
+ .map(property => {
310
+ const typeAnnotation = property.typeAnnotation,
311
+ optional = property.optional,
312
+ propName = property.name;
313
+ const safePropName = getSafePropertyName(property);
314
+ const objCValue = toObjCValue(
315
+ hasteModuleName,
316
+ typeAnnotation,
317
+ safePropName,
318
+ 0,
319
+ optional,
320
+ );
321
+ let varDecl = `auto ${safePropName} = i.${safePropName}`;
322
+ if (!optional) {
323
+ varDecl += '.get()';
324
+ }
325
+ const assignment = `d[@"${propName}"] = ` + objCValue;
326
+ return ` ${varDecl};\n ${assignment};`;
327
+ })
328
+ .join('\n'),
329
+ });
330
+ return {
331
+ declaration,
332
+ methods,
333
+ };
334
+ }
335
+ module.exports = {
336
+ serializeConstantsStruct,
337
+ };
@@ -0,0 +1,288 @@
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, ConstantsStruct} 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
+ builderInputProps,
26
+ }: $ReadOnly<{
27
+ hasteModuleName: string,
28
+ structName: string,
29
+ builderInputProps: string,
30
+ }>) => `namespace JS {
31
+ namespace ${hasteModuleName} {
32
+ struct ${structName} {
33
+
34
+ struct Builder {
35
+ struct Input {
36
+ ${builderInputProps}
37
+ };
38
+
39
+ /** Initialize with a set of values */
40
+ Builder(const Input i);
41
+ /** Initialize with an existing ${structName} */
42
+ Builder(${structName} i);
43
+ /** Builds the object. Generally used only by the infrastructure. */
44
+ NSDictionary *buildUnsafeRawValue() const { return _factory(); };
45
+ private:
46
+ NSDictionary *(^_factory)(void);
47
+ };
48
+
49
+ static ${structName} fromUnsafeRawValue(NSDictionary *const v) { return {v}; }
50
+ NSDictionary *unsafeRawValue() const { return _v; }
51
+ private:
52
+ ${structName}(NSDictionary *const v) : _v(v) {}
53
+ NSDictionary *_v;
54
+ };
55
+ }
56
+ }`;
57
+
58
+ const MethodTemplate = ({
59
+ hasteModuleName,
60
+ structName,
61
+ properties,
62
+ }: $ReadOnly<{
63
+ hasteModuleName: string,
64
+ structName: string,
65
+ properties: string,
66
+ }>) => `inline JS::${hasteModuleName}::${structName}::Builder::Builder(const Input i) : _factory(^{
67
+ NSMutableDictionary *d = [NSMutableDictionary new];
68
+ ${properties}
69
+ return d;
70
+ }) {}
71
+ inline JS::${hasteModuleName}::${structName}::Builder::Builder(${structName} i) : _factory(^{
72
+ return i.unsafeRawValue();
73
+ }) {}`;
74
+
75
+ function toObjCType(
76
+ hasteModuleName: string,
77
+ nullableTypeAnnotation: Nullable<StructTypeAnnotation>,
78
+ isOptional: boolean = false,
79
+ ): string {
80
+ const [typeAnnotation, nullable] = unwrapNullable(nullableTypeAnnotation);
81
+ const isRequired = !nullable && !isOptional;
82
+ const wrapOptional = (type: string) => {
83
+ return isRequired ? type : `std::optional<${type}>`;
84
+ };
85
+
86
+ switch (typeAnnotation.type) {
87
+ case 'ReservedTypeAnnotation':
88
+ switch (typeAnnotation.name) {
89
+ case 'RootTag':
90
+ return wrapOptional('double');
91
+ default:
92
+ (typeAnnotation.name: empty);
93
+ throw new Error(`Unknown prop type, found: ${typeAnnotation.name}"`);
94
+ }
95
+ case 'StringTypeAnnotation':
96
+ return 'NSString *';
97
+ case 'NumberTypeAnnotation':
98
+ return wrapOptional('double');
99
+ case 'FloatTypeAnnotation':
100
+ return wrapOptional('double');
101
+ case 'Int32TypeAnnotation':
102
+ return wrapOptional('double');
103
+ case 'DoubleTypeAnnotation':
104
+ return wrapOptional('double');
105
+ case 'BooleanTypeAnnotation':
106
+ return wrapOptional('bool');
107
+ case 'EnumDeclaration':
108
+ switch (typeAnnotation.memberType) {
109
+ case 'NumberTypeAnnotation':
110
+ return wrapOptional('double');
111
+ case 'StringTypeAnnotation':
112
+ return 'NSString *';
113
+ default:
114
+ throw new Error(
115
+ `Couldn't convert enum into ObjC type: ${typeAnnotation.type}"`,
116
+ );
117
+ }
118
+ case 'GenericObjectTypeAnnotation':
119
+ return isRequired ? 'id<NSObject> ' : 'id<NSObject> _Nullable ';
120
+ case 'ArrayTypeAnnotation':
121
+ if (typeAnnotation.elementType == null) {
122
+ return isRequired ? 'id<NSObject> ' : 'id<NSObject> _Nullable ';
123
+ }
124
+
125
+ return wrapOptional(
126
+ `std::vector<${toObjCType(
127
+ hasteModuleName,
128
+ typeAnnotation.elementType,
129
+ )}>`,
130
+ );
131
+ case 'TypeAliasTypeAnnotation':
132
+ const structName = capitalize(typeAnnotation.name);
133
+ const namespacedStructName = getNamespacedStructName(
134
+ hasteModuleName,
135
+ structName,
136
+ );
137
+ return wrapOptional(`${namespacedStructName}::Builder`);
138
+ default:
139
+ (typeAnnotation.type: empty);
140
+ throw new Error(
141
+ `Couldn't convert into ObjC type: ${typeAnnotation.type}"`,
142
+ );
143
+ }
144
+ }
145
+
146
+ function toObjCValue(
147
+ hasteModuleName: string,
148
+ nullableTypeAnnotation: Nullable<StructTypeAnnotation>,
149
+ value: string,
150
+ depth: number,
151
+ isOptional: boolean = false,
152
+ ): string {
153
+ const [typeAnnotation, nullable] = unwrapNullable(nullableTypeAnnotation);
154
+ const isRequired = !nullable && !isOptional;
155
+
156
+ function wrapPrimitive(type: string) {
157
+ return !isRequired
158
+ ? `${value}.has_value() ? @((${type})${value}.value()) : nil`
159
+ : `@(${value})`;
160
+ }
161
+
162
+ switch (typeAnnotation.type) {
163
+ case 'ReservedTypeAnnotation':
164
+ switch (typeAnnotation.name) {
165
+ case 'RootTag':
166
+ return wrapPrimitive('double');
167
+ default:
168
+ (typeAnnotation.name: empty);
169
+ throw new Error(
170
+ `Couldn't convert into ObjC type: ${typeAnnotation.type}"`,
171
+ );
172
+ }
173
+ case 'StringTypeAnnotation':
174
+ return value;
175
+ case 'NumberTypeAnnotation':
176
+ return wrapPrimitive('double');
177
+ case 'FloatTypeAnnotation':
178
+ return wrapPrimitive('double');
179
+ case 'Int32TypeAnnotation':
180
+ return wrapPrimitive('double');
181
+ case 'DoubleTypeAnnotation':
182
+ return wrapPrimitive('double');
183
+ case 'BooleanTypeAnnotation':
184
+ return wrapPrimitive('BOOL');
185
+ case 'EnumDeclaration':
186
+ switch (typeAnnotation.memberType) {
187
+ case 'NumberTypeAnnotation':
188
+ return wrapPrimitive('double');
189
+ case 'StringTypeAnnotation':
190
+ return value;
191
+ default:
192
+ throw new Error(
193
+ `Couldn't convert enum into ObjC value: ${typeAnnotation.type}"`,
194
+ );
195
+ }
196
+ case 'GenericObjectTypeAnnotation':
197
+ return value;
198
+ case 'ArrayTypeAnnotation':
199
+ const {elementType} = typeAnnotation;
200
+ if (elementType == null) {
201
+ return value;
202
+ }
203
+
204
+ const localVarName = `el${'_'.repeat(depth + 1)}`;
205
+ const elementObjCType = toObjCType(hasteModuleName, elementType);
206
+ const elementObjCValue = toObjCValue(
207
+ hasteModuleName,
208
+ elementType,
209
+ localVarName,
210
+ depth + 1,
211
+ );
212
+
213
+ const RCTConvertVecToArray = (transformer: string) => {
214
+ return `RCTConvert${
215
+ !isRequired ? 'Optional' : ''
216
+ }VecToArray(${value}, ${transformer})`;
217
+ };
218
+
219
+ return RCTConvertVecToArray(
220
+ `^id(${elementObjCType} ${localVarName}) { return ${elementObjCValue}; }`,
221
+ );
222
+ case 'TypeAliasTypeAnnotation':
223
+ return !isRequired
224
+ ? `${value}.has_value() ? ${value}.value().buildUnsafeRawValue() : nil`
225
+ : `${value}.buildUnsafeRawValue()`;
226
+ default:
227
+ (typeAnnotation.type: empty);
228
+ throw new Error(
229
+ `Couldn't convert into ObjC value: ${typeAnnotation.type}"`,
230
+ );
231
+ }
232
+ }
233
+
234
+ function serializeConstantsStruct(
235
+ hasteModuleName: string,
236
+ struct: ConstantsStruct,
237
+ ): StructSerilizationOutput {
238
+ const declaration = StructTemplate({
239
+ hasteModuleName,
240
+ structName: struct.name,
241
+ builderInputProps: struct.properties
242
+ .map(property => {
243
+ const {typeAnnotation, optional} = property;
244
+ const safePropName = getSafePropertyName(property);
245
+ const objCType = toObjCType(hasteModuleName, typeAnnotation, optional);
246
+
247
+ if (!optional) {
248
+ return `RCTRequired<${objCType}> ${safePropName};`;
249
+ }
250
+
251
+ const space = ' '.repeat(objCType.endsWith('*') ? 0 : 1);
252
+ return `${objCType}${space}${safePropName};`;
253
+ })
254
+ .join('\n '),
255
+ });
256
+
257
+ const methods = MethodTemplate({
258
+ hasteModuleName,
259
+ structName: struct.name,
260
+ properties: struct.properties
261
+ .map(property => {
262
+ const {typeAnnotation, optional, name: propName} = property;
263
+ const safePropName = getSafePropertyName(property);
264
+ const objCValue = toObjCValue(
265
+ hasteModuleName,
266
+ typeAnnotation,
267
+ safePropName,
268
+ 0,
269
+ optional,
270
+ );
271
+
272
+ let varDecl = `auto ${safePropName} = i.${safePropName}`;
273
+ if (!optional) {
274
+ varDecl += '.get()';
275
+ }
276
+
277
+ const assignment = `d[@"${propName}"] = ` + objCValue;
278
+ return ` ${varDecl};\n ${assignment};`;
279
+ })
280
+ .join('\n'),
281
+ });
282
+
283
+ return {declaration, methods};
284
+ }
285
+
286
+ module.exports = {
287
+ serializeConstantsStruct,
288
+ };