@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,571 @@
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
+ createAliasResolver = _require.createAliasResolver,
83
+ getModules = _require.getModules;
84
+ const _require2 = require('../../parsers/parsers-commons'),
85
+ unwrapNullable = _require2.unwrapNullable;
86
+ function FileTemplate(config) {
87
+ const packageName = config.packageName,
88
+ className = config.className,
89
+ jsName = config.jsName,
90
+ methods = config.methods,
91
+ imports = config.imports;
92
+ return `
93
+ /**
94
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
95
+ *
96
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
97
+ * once the code is regenerated.
98
+ *
99
+ * ${'@'}generated by codegen project: GenerateModuleJavaSpec.js
100
+ *
101
+ * ${'@'}nolint
102
+ */
103
+
104
+ package ${packageName};
105
+
106
+ ${imports}
107
+
108
+ public abstract class ${className} extends ReactContextBaseJavaModule implements ReactModuleWithSpec, TurboModule {
109
+ public static final String NAME = "${jsName}";
110
+
111
+ public ${className}(ReactApplicationContext reactContext) {
112
+ super(reactContext);
113
+ }
114
+
115
+ @Override
116
+ public @Nonnull String getName() {
117
+ return NAME;
118
+ }
119
+
120
+ ${methods}
121
+ }
122
+ `;
123
+ }
124
+ function MethodTemplate(config) {
125
+ const abstract = config.abstract,
126
+ methodBody = config.methodBody,
127
+ methodJavaAnnotation = config.methodJavaAnnotation,
128
+ methodName = config.methodName,
129
+ translatedReturnType = config.translatedReturnType,
130
+ traversedArgs = config.traversedArgs;
131
+ const methodQualifier = abstract ? 'abstract ' : '';
132
+ const methodClosing = abstract
133
+ ? ';'
134
+ : methodBody != null && methodBody.length > 0
135
+ ? ` { ${methodBody} }`
136
+ : ' {}';
137
+ return ` ${methodJavaAnnotation}
138
+ public ${methodQualifier}${translatedReturnType} ${methodName}(${traversedArgs.join(
139
+ ', ',
140
+ )})${methodClosing}`;
141
+ }
142
+ function translateFunctionParamToJavaType(
143
+ param,
144
+ createErrorMessage,
145
+ resolveAlias,
146
+ imports,
147
+ ) {
148
+ const optional = param.optional,
149
+ nullableTypeAnnotation = param.typeAnnotation;
150
+ const _unwrapNullable = unwrapNullable(nullableTypeAnnotation),
151
+ _unwrapNullable2 = _slicedToArray(_unwrapNullable, 2),
152
+ typeAnnotation = _unwrapNullable2[0],
153
+ nullable = _unwrapNullable2[1];
154
+ const isRequired = !optional && !nullable;
155
+ function wrapNullable(javaType, nullableType) {
156
+ if (!isRequired) {
157
+ imports.add('javax.annotation.Nullable');
158
+ return `@Nullable ${
159
+ nullableType !== null && nullableType !== void 0
160
+ ? nullableType
161
+ : javaType
162
+ }`;
163
+ }
164
+ return javaType;
165
+ }
166
+
167
+ // FIXME: support class alias for args
168
+ let realTypeAnnotation = typeAnnotation;
169
+ if (realTypeAnnotation.type === 'TypeAliasTypeAnnotation') {
170
+ realTypeAnnotation = resolveAlias(realTypeAnnotation.name);
171
+ }
172
+ switch (realTypeAnnotation.type) {
173
+ case 'ReservedTypeAnnotation':
174
+ switch (realTypeAnnotation.name) {
175
+ case 'RootTag':
176
+ return wrapNullable('double', 'Double');
177
+ default:
178
+ realTypeAnnotation.name;
179
+ throw new Error(createErrorMessage(realTypeAnnotation.name));
180
+ }
181
+ case 'StringTypeAnnotation':
182
+ return wrapNullable('String');
183
+ case 'NumberTypeAnnotation':
184
+ return wrapNullable('double', 'Double');
185
+ case 'FloatTypeAnnotation':
186
+ return wrapNullable('double', 'Double');
187
+ case 'DoubleTypeAnnotation':
188
+ return wrapNullable('double', 'Double');
189
+ case 'Int32TypeAnnotation':
190
+ return wrapNullable('double', 'Double');
191
+ case 'BooleanTypeAnnotation':
192
+ return wrapNullable('boolean', 'Boolean');
193
+ case 'EnumDeclaration':
194
+ switch (realTypeAnnotation.memberType) {
195
+ case 'NumberTypeAnnotation':
196
+ return wrapNullable('double', 'Double');
197
+ case 'StringTypeAnnotation':
198
+ return wrapNullable('String');
199
+ default:
200
+ throw new Error(createErrorMessage(realTypeAnnotation.type));
201
+ }
202
+ case 'UnionTypeAnnotation':
203
+ switch (typeAnnotation.memberType) {
204
+ case 'NumberTypeAnnotation':
205
+ return wrapNullable('double', 'Double');
206
+ case 'ObjectTypeAnnotation':
207
+ imports.add('com.facebook.react.bridge.ReadableMap');
208
+ return wrapNullable('ReadableMap');
209
+ case 'StringTypeAnnotation':
210
+ return wrapNullable('String');
211
+ default:
212
+ throw new Error(
213
+ `Unsupported union member returning value, found: ${realTypeAnnotation.memberType}"`,
214
+ );
215
+ }
216
+ case 'ObjectTypeAnnotation':
217
+ imports.add('com.facebook.react.bridge.ReadableMap');
218
+ return wrapNullable('ReadableMap');
219
+ case 'GenericObjectTypeAnnotation':
220
+ // Treat this the same as ObjectTypeAnnotation for now.
221
+ imports.add('com.facebook.react.bridge.ReadableMap');
222
+ return wrapNullable('ReadableMap');
223
+ case 'ArrayTypeAnnotation':
224
+ imports.add('com.facebook.react.bridge.ReadableArray');
225
+ return wrapNullable('ReadableArray');
226
+ case 'FunctionTypeAnnotation':
227
+ imports.add('com.facebook.react.bridge.Callback');
228
+ return wrapNullable('Callback');
229
+ default:
230
+ realTypeAnnotation.type;
231
+ throw new Error(createErrorMessage(realTypeAnnotation.type));
232
+ }
233
+ }
234
+ function translateFunctionReturnTypeToJavaType(
235
+ nullableReturnTypeAnnotation,
236
+ createErrorMessage,
237
+ resolveAlias,
238
+ imports,
239
+ ) {
240
+ const _unwrapNullable3 = unwrapNullable(nullableReturnTypeAnnotation),
241
+ _unwrapNullable4 = _slicedToArray(_unwrapNullable3, 2),
242
+ returnTypeAnnotation = _unwrapNullable4[0],
243
+ nullable = _unwrapNullable4[1];
244
+ function wrapNullable(javaType, nullableType) {
245
+ if (nullable) {
246
+ imports.add('javax.annotation.Nullable');
247
+ return `@Nullable ${
248
+ nullableType !== null && nullableType !== void 0
249
+ ? nullableType
250
+ : javaType
251
+ }`;
252
+ }
253
+ return javaType;
254
+ }
255
+
256
+ // FIXME: support class alias for args
257
+ let realTypeAnnotation = returnTypeAnnotation;
258
+ if (realTypeAnnotation.type === 'TypeAliasTypeAnnotation') {
259
+ realTypeAnnotation = resolveAlias(realTypeAnnotation.name);
260
+ }
261
+ switch (realTypeAnnotation.type) {
262
+ case 'ReservedTypeAnnotation':
263
+ switch (realTypeAnnotation.name) {
264
+ case 'RootTag':
265
+ return wrapNullable('double', 'Double');
266
+ default:
267
+ realTypeAnnotation.name;
268
+ throw new Error(createErrorMessage(realTypeAnnotation.name));
269
+ }
270
+ case 'VoidTypeAnnotation':
271
+ return 'void';
272
+ case 'PromiseTypeAnnotation':
273
+ return 'void';
274
+ case 'StringTypeAnnotation':
275
+ return wrapNullable('String');
276
+ case 'NumberTypeAnnotation':
277
+ return wrapNullable('double', 'Double');
278
+ case 'FloatTypeAnnotation':
279
+ return wrapNullable('double', 'Double');
280
+ case 'DoubleTypeAnnotation':
281
+ return wrapNullable('double', 'Double');
282
+ case 'Int32TypeAnnotation':
283
+ return wrapNullable('double', 'Double');
284
+ case 'BooleanTypeAnnotation':
285
+ return wrapNullable('boolean', 'Boolean');
286
+ case 'EnumDeclaration':
287
+ switch (realTypeAnnotation.memberType) {
288
+ case 'NumberTypeAnnotation':
289
+ return wrapNullable('double', 'Double');
290
+ case 'StringTypeAnnotation':
291
+ return wrapNullable('String');
292
+ default:
293
+ throw new Error(createErrorMessage(realTypeAnnotation.type));
294
+ }
295
+ case 'UnionTypeAnnotation':
296
+ switch (realTypeAnnotation.memberType) {
297
+ case 'NumberTypeAnnotation':
298
+ return wrapNullable('double', 'Double');
299
+ case 'ObjectTypeAnnotation':
300
+ imports.add('com.facebook.react.bridge.WritableMap');
301
+ return wrapNullable('WritableMap');
302
+ case 'StringTypeAnnotation':
303
+ return wrapNullable('String');
304
+ default:
305
+ throw new Error(
306
+ `Unsupported union member returning value, found: ${realTypeAnnotation.memberType}"`,
307
+ );
308
+ }
309
+ case 'ObjectTypeAnnotation':
310
+ imports.add('com.facebook.react.bridge.WritableMap');
311
+ return wrapNullable('WritableMap');
312
+ case 'GenericObjectTypeAnnotation':
313
+ imports.add('com.facebook.react.bridge.WritableMap');
314
+ return wrapNullable('WritableMap');
315
+ case 'ArrayTypeAnnotation':
316
+ imports.add('com.facebook.react.bridge.WritableArray');
317
+ return wrapNullable('WritableArray');
318
+ default:
319
+ realTypeAnnotation.type;
320
+ throw new Error(createErrorMessage(realTypeAnnotation.type));
321
+ }
322
+ }
323
+ function getFalsyReturnStatementFromReturnType(
324
+ nullableReturnTypeAnnotation,
325
+ createErrorMessage,
326
+ resolveAlias,
327
+ ) {
328
+ const _unwrapNullable5 = unwrapNullable(nullableReturnTypeAnnotation),
329
+ _unwrapNullable6 = _slicedToArray(_unwrapNullable5, 2),
330
+ returnTypeAnnotation = _unwrapNullable6[0],
331
+ nullable = _unwrapNullable6[1];
332
+ let realTypeAnnotation = returnTypeAnnotation;
333
+ if (realTypeAnnotation.type === 'TypeAliasTypeAnnotation') {
334
+ realTypeAnnotation = resolveAlias(realTypeAnnotation.name);
335
+ }
336
+ switch (realTypeAnnotation.type) {
337
+ case 'ReservedTypeAnnotation':
338
+ switch (realTypeAnnotation.name) {
339
+ case 'RootTag':
340
+ return 'return 0.0;';
341
+ default:
342
+ realTypeAnnotation.name;
343
+ throw new Error(createErrorMessage(realTypeAnnotation.name));
344
+ }
345
+ case 'VoidTypeAnnotation':
346
+ return '';
347
+ case 'PromiseTypeAnnotation':
348
+ return '';
349
+ case 'NumberTypeAnnotation':
350
+ return nullable ? 'return null;' : 'return 0;';
351
+ case 'FloatTypeAnnotation':
352
+ return nullable ? 'return null;' : 'return 0.0;';
353
+ case 'DoubleTypeAnnotation':
354
+ return nullable ? 'return null;' : 'return 0.0;';
355
+ case 'Int32TypeAnnotation':
356
+ return nullable ? 'return null;' : 'return 0;';
357
+ case 'BooleanTypeAnnotation':
358
+ return nullable ? 'return null;' : 'return false;';
359
+ case 'EnumDeclaration':
360
+ switch (realTypeAnnotation.memberType) {
361
+ case 'NumberTypeAnnotation':
362
+ return nullable ? 'return null;' : 'return 0;';
363
+ case 'StringTypeAnnotation':
364
+ return nullable ? 'return null;' : 'return "";';
365
+ default:
366
+ throw new Error(createErrorMessage(realTypeAnnotation.type));
367
+ }
368
+ case 'UnionTypeAnnotation':
369
+ switch (realTypeAnnotation.memberType) {
370
+ case 'NumberTypeAnnotation':
371
+ return nullable ? 'return null;' : 'return 0;';
372
+ case 'ObjectTypeAnnotation':
373
+ return 'return null;';
374
+ case 'StringTypeAnnotation':
375
+ return nullable ? 'return null;' : 'return "";';
376
+ default:
377
+ throw new Error(
378
+ `Unsupported union member returning value, found: ${realTypeAnnotation.memberType}"`,
379
+ );
380
+ }
381
+ case 'StringTypeAnnotation':
382
+ return nullable ? 'return null;' : 'return "";';
383
+ case 'ObjectTypeAnnotation':
384
+ return 'return null;';
385
+ case 'GenericObjectTypeAnnotation':
386
+ return 'return null;';
387
+ case 'ArrayTypeAnnotation':
388
+ return 'return null;';
389
+ default:
390
+ realTypeAnnotation.type;
391
+ throw new Error(createErrorMessage(realTypeAnnotation.type));
392
+ }
393
+ }
394
+
395
+ // Build special-cased runtime check for getConstants().
396
+ function buildGetConstantsMethod(method, imports) {
397
+ const _unwrapNullable7 = unwrapNullable(method.typeAnnotation),
398
+ _unwrapNullable8 = _slicedToArray(_unwrapNullable7, 1),
399
+ methodTypeAnnotation = _unwrapNullable8[0];
400
+ if (
401
+ methodTypeAnnotation.returnTypeAnnotation.type === 'ObjectTypeAnnotation'
402
+ ) {
403
+ const requiredProps = [];
404
+ const optionalProps = [];
405
+ const rawProperties =
406
+ methodTypeAnnotation.returnTypeAnnotation.properties || [];
407
+ rawProperties.forEach(p => {
408
+ if (p.optional || p.typeAnnotation.type === 'NullableTypeAnnotation') {
409
+ optionalProps.push(p.name);
410
+ } else {
411
+ requiredProps.push(p.name);
412
+ }
413
+ });
414
+ if (requiredProps.length === 0 && optionalProps.length === 0) {
415
+ // Nothing to validate during runtime.
416
+ return '';
417
+ }
418
+ imports.add('com.facebook.react.common.build.ReactBuildConfig');
419
+ imports.add('java.util.Arrays');
420
+ imports.add('java.util.HashSet');
421
+ imports.add('java.util.Map');
422
+ imports.add('java.util.Set');
423
+ imports.add('javax.annotation.Nullable');
424
+ const requiredPropsFragment =
425
+ requiredProps.length > 0
426
+ ? `Arrays.asList(
427
+ ${requiredProps
428
+ .sort()
429
+ .map(p => `"${p}"`)
430
+ .join(',\n ')}
431
+ )`
432
+ : '';
433
+ const optionalPropsFragment =
434
+ optionalProps.length > 0
435
+ ? `Arrays.asList(
436
+ ${optionalProps
437
+ .sort()
438
+ .map(p => `"${p}"`)
439
+ .join(',\n ')}
440
+ )`
441
+ : '';
442
+ return ` protected abstract Map<String, Object> getTypedExportedConstants();
443
+
444
+ @Override
445
+ @DoNotStrip
446
+ public final @Nullable Map<String, Object> getConstants() {
447
+ Map<String, Object> constants = getTypedExportedConstants();
448
+ if (ReactBuildConfig.DEBUG || ReactBuildConfig.IS_INTERNAL_BUILD) {
449
+ Set<String> obligatoryFlowConstants = new HashSet<>(${requiredPropsFragment});
450
+ Set<String> optionalFlowConstants = new HashSet<>(${optionalPropsFragment});
451
+ Set<String> undeclaredConstants = new HashSet<>(constants.keySet());
452
+ undeclaredConstants.removeAll(obligatoryFlowConstants);
453
+ undeclaredConstants.removeAll(optionalFlowConstants);
454
+ if (!undeclaredConstants.isEmpty()) {
455
+ throw new IllegalStateException(String.format("Native Module Flow doesn't declare constants: %s", undeclaredConstants));
456
+ }
457
+ undeclaredConstants = obligatoryFlowConstants;
458
+ undeclaredConstants.removeAll(constants.keySet());
459
+ if (!undeclaredConstants.isEmpty()) {
460
+ throw new IllegalStateException(String.format("Native Module doesn't fill in constants: %s", undeclaredConstants));
461
+ }
462
+ }
463
+ return constants;
464
+ }`;
465
+ }
466
+ return '';
467
+ }
468
+ module.exports = {
469
+ generate(libraryName, schema, packageName, assumeNonnull = false) {
470
+ const files = new Map();
471
+ const nativeModules = getModules(schema);
472
+ const normalizedPackageName =
473
+ packageName == null ? 'com.facebook.fbreact.specs' : packageName;
474
+ const outputDir = `java/${normalizedPackageName.replace(/\./g, '/')}`;
475
+ Object.keys(nativeModules).forEach(hasteModuleName => {
476
+ const _nativeModules$hasteM = nativeModules[hasteModuleName],
477
+ aliases = _nativeModules$hasteM.aliases,
478
+ excludedPlatforms = _nativeModules$hasteM.excludedPlatforms,
479
+ moduleName = _nativeModules$hasteM.moduleName,
480
+ properties = _nativeModules$hasteM.spec.properties;
481
+ if (excludedPlatforms != null && excludedPlatforms.includes('android')) {
482
+ return;
483
+ }
484
+ const resolveAlias = createAliasResolver(aliases);
485
+ const className = `${hasteModuleName}Spec`;
486
+ const imports = new Set([
487
+ // Always required.
488
+ 'com.facebook.react.bridge.ReactApplicationContext',
489
+ 'com.facebook.react.bridge.ReactContextBaseJavaModule',
490
+ 'com.facebook.react.bridge.ReactMethod',
491
+ 'com.facebook.react.bridge.ReactModuleWithSpec',
492
+ 'com.facebook.react.turbomodule.core.interfaces.TurboModule',
493
+ 'com.facebook.proguard.annotations.DoNotStrip',
494
+ 'javax.annotation.Nonnull',
495
+ ]);
496
+ const methods = properties.map(method => {
497
+ if (method.name === 'getConstants') {
498
+ return buildGetConstantsMethod(method, imports);
499
+ }
500
+ const _unwrapNullable9 = unwrapNullable(method.typeAnnotation),
501
+ _unwrapNullable10 = _slicedToArray(_unwrapNullable9, 1),
502
+ methodTypeAnnotation = _unwrapNullable10[0];
503
+
504
+ // Handle return type
505
+ const translatedReturnType = translateFunctionReturnTypeToJavaType(
506
+ methodTypeAnnotation.returnTypeAnnotation,
507
+ typeName =>
508
+ `Unsupported return type for method ${method.name}. Found: ${typeName}`,
509
+ resolveAlias,
510
+ imports,
511
+ );
512
+ const returningPromise =
513
+ methodTypeAnnotation.returnTypeAnnotation.type ===
514
+ 'PromiseTypeAnnotation';
515
+ const isSyncMethod =
516
+ methodTypeAnnotation.returnTypeAnnotation.type !==
517
+ 'VoidTypeAnnotation' && !returningPromise;
518
+
519
+ // Handle method args
520
+ const traversedArgs = methodTypeAnnotation.params.map(param => {
521
+ const translatedParam = translateFunctionParamToJavaType(
522
+ param,
523
+ typeName =>
524
+ `Unsupported type for param "${param.name}" in ${method.name}. Found: ${typeName}`,
525
+ resolveAlias,
526
+ imports,
527
+ );
528
+ return `${translatedParam} ${param.name}`;
529
+ });
530
+ if (returningPromise) {
531
+ // Promise return type requires an extra arg at the end.
532
+ imports.add('com.facebook.react.bridge.Promise');
533
+ traversedArgs.push('Promise promise');
534
+ }
535
+ const methodJavaAnnotation = `@ReactMethod${
536
+ isSyncMethod ? '(isBlockingSynchronousMethod = true)' : ''
537
+ }\n @DoNotStrip`;
538
+ const methodBody = method.optional
539
+ ? getFalsyReturnStatementFromReturnType(
540
+ methodTypeAnnotation.returnTypeAnnotation,
541
+ typeName =>
542
+ `Cannot build falsy return statement for return type for method ${method.name}. Found: ${typeName}`,
543
+ resolveAlias,
544
+ )
545
+ : null;
546
+ return MethodTemplate({
547
+ abstract: !method.optional,
548
+ methodBody,
549
+ methodJavaAnnotation,
550
+ methodName: method.name,
551
+ translatedReturnType,
552
+ traversedArgs,
553
+ });
554
+ });
555
+ files.set(
556
+ `${outputDir}/${className}.java`,
557
+ FileTemplate({
558
+ packageName: normalizedPackageName,
559
+ className,
560
+ jsName: moduleName,
561
+ methods: methods.filter(Boolean).join('\n\n'),
562
+ imports: Array.from(imports)
563
+ .sort()
564
+ .map(p => `import ${p};`)
565
+ .join('\n'),
566
+ }),
567
+ );
568
+ });
569
+ return files;
570
+ },
571
+ };