@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.
- package/README.md +21 -0
- package/lib/CodegenSchema.js +11 -0
- package/lib/CodegenSchema.js.flow +351 -0
- package/lib/SchemaValidator.js +54 -0
- package/lib/SchemaValidator.js.flow +67 -0
- package/lib/cli/combine/combine-js-to-schema-cli.js +50 -0
- package/lib/cli/combine/combine-js-to-schema-cli.js.flow +49 -0
- package/lib/cli/combine/combine-js-to-schema.js +110 -0
- package/lib/cli/combine/combine-js-to-schema.js.flow +48 -0
- package/lib/cli/combine/combine-utils.js +118 -0
- package/lib/cli/combine/combine-utils.js.flow +85 -0
- package/lib/cli/generators/generate-all.js +65 -0
- package/lib/cli/generators/generate-all.js.flow +66 -0
- package/lib/cli/parser/parser-cli.js +55 -0
- package/lib/cli/parser/parser-cli.js.flow +18 -0
- package/lib/cli/parser/parser.js +35 -0
- package/lib/cli/parser/parser.js.flow +37 -0
- package/lib/cli/parser/parser.sh +15 -0
- package/lib/generators/RNCodegen.js +207 -0
- package/lib/generators/RNCodegen.js.flow +284 -0
- package/lib/generators/Utils.js +31 -0
- package/lib/generators/Utils.js.flow +33 -0
- package/lib/generators/__test_fixtures__/fixtures.js +79 -0
- package/lib/generators/__test_fixtures__/fixtures.js.flow +82 -0
- package/lib/generators/components/ComponentsGeneratorUtils.js +217 -0
- package/lib/generators/components/ComponentsGeneratorUtils.js.flow +304 -0
- package/lib/generators/components/CppHelpers.js +188 -0
- package/lib/generators/components/CppHelpers.js.flow +228 -0
- package/lib/generators/components/GenerateComponentDescriptorH.js +75 -0
- package/lib/generators/components/GenerateComponentDescriptorH.js.flow +95 -0
- package/lib/generators/components/GenerateComponentHObjCpp.js +327 -0
- package/lib/generators/components/GenerateComponentHObjCpp.js.flow +418 -0
- package/lib/generators/components/GenerateEventEmitterCpp.js +199 -0
- package/lib/generators/components/GenerateEventEmitterCpp.js.flow +273 -0
- package/lib/generators/components/GenerateEventEmitterH.js +224 -0
- package/lib/generators/components/GenerateEventEmitterH.js.flow +315 -0
- package/lib/generators/components/GeneratePropsCpp.js +126 -0
- package/lib/generators/components/GeneratePropsCpp.js.flow +161 -0
- package/lib/generators/components/GeneratePropsH.js +606 -0
- package/lib/generators/components/GeneratePropsH.js.flow +778 -0
- package/lib/generators/components/GeneratePropsJavaDelegate.js +287 -0
- package/lib/generators/components/GeneratePropsJavaDelegate.js.flow +348 -0
- package/lib/generators/components/GeneratePropsJavaInterface.js +237 -0
- package/lib/generators/components/GeneratePropsJavaInterface.js.flow +288 -0
- package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js +157 -0
- package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js.flow +187 -0
- package/lib/generators/components/GeneratePropsJavaPojo/index.js +66 -0
- package/lib/generators/components/GeneratePropsJavaPojo/index.js.flow +80 -0
- package/lib/generators/components/GeneratePropsJavaPojo/serializePojo.js +273 -0
- package/lib/generators/components/GeneratePropsJavaPojo/serializePojo.js.flow +296 -0
- package/lib/generators/components/GenerateShadowNodeCpp.js +73 -0
- package/lib/generators/components/GenerateShadowNodeCpp.js.flow +95 -0
- package/lib/generators/components/GenerateShadowNodeH.js +91 -0
- package/lib/generators/components/GenerateShadowNodeH.js.flow +124 -0
- package/lib/generators/components/GenerateStateCpp.js +70 -0
- package/lib/generators/components/GenerateStateCpp.js.flow +92 -0
- package/lib/generators/components/GenerateStateH.js +93 -0
- package/lib/generators/components/GenerateStateH.js.flow +111 -0
- package/lib/generators/components/GenerateTests.js +165 -0
- package/lib/generators/components/GenerateTests.js.flow +219 -0
- package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js +91 -0
- package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js.flow +107 -0
- package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js +89 -0
- package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js.flow +105 -0
- package/lib/generators/components/GenerateViewConfigJs.js +410 -0
- package/lib/generators/components/GenerateViewConfigJs.js.flow +484 -0
- package/lib/generators/components/JavaHelpers.js +87 -0
- package/lib/generators/components/JavaHelpers.js.flow +119 -0
- package/lib/generators/components/__test_fixtures__/fixtures.js +1641 -0
- package/lib/generators/components/__test_fixtures__/fixtures.js.flow +1672 -0
- package/lib/generators/modules/GenerateModuleCpp.js +299 -0
- package/lib/generators/modules/GenerateModuleCpp.js.flow +278 -0
- package/lib/generators/modules/GenerateModuleH.js +373 -0
- package/lib/generators/modules/GenerateModuleH.js.flow +355 -0
- package/lib/generators/modules/GenerateModuleJavaSpec.js +571 -0
- package/lib/generators/modules/GenerateModuleJavaSpec.js.flow +553 -0
- package/lib/generators/modules/GenerateModuleJniCpp.js +505 -0
- package/lib/generators/modules/GenerateModuleJniCpp.js.flow +523 -0
- package/lib/generators/modules/GenerateModuleJniH.js +138 -0
- package/lib/generators/modules/GenerateModuleJniH.js.flow +148 -0
- package/lib/generators/modules/GenerateModuleObjCpp/StructCollector.js +262 -0
- package/lib/generators/modules/GenerateModuleObjCpp/StructCollector.js.flow +208 -0
- package/lib/generators/modules/GenerateModuleObjCpp/Utils.js +25 -0
- package/lib/generators/modules/GenerateModuleObjCpp/Utils.js.flow +32 -0
- package/lib/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js +337 -0
- package/lib/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js.flow +288 -0
- package/lib/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js +330 -0
- package/lib/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js.flow +279 -0
- package/lib/generators/modules/GenerateModuleObjCpp/header/serializeStruct.js +25 -0
- package/lib/generators/modules/GenerateModuleObjCpp/header/serializeStruct.js.flow +35 -0
- package/lib/generators/modules/GenerateModuleObjCpp/index.js +185 -0
- package/lib/generators/modules/GenerateModuleObjCpp/index.js.flow +219 -0
- package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js +529 -0
- package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js.flow +510 -0
- package/lib/generators/modules/GenerateModuleObjCpp/source/serializeModule.js +96 -0
- package/lib/generators/modules/GenerateModuleObjCpp/source/serializeModule.js.flow +121 -0
- package/lib/generators/modules/Utils.js +34 -0
- package/lib/generators/modules/Utils.js.flow +53 -0
- package/lib/generators/modules/__test_fixtures__/fixtures.js +1658 -0
- package/lib/generators/modules/__test_fixtures__/fixtures.js.flow +1669 -0
- package/lib/parsers/consistency/compareSnaps.js +84 -0
- package/lib/parsers/error-utils.js +284 -0
- package/lib/parsers/error-utils.js.flow +295 -0
- package/lib/parsers/errors.js +350 -0
- package/lib/parsers/errors.js.flow +439 -0
- package/lib/parsers/flow/components/__test_fixtures__/failures.js +583 -0
- package/lib/parsers/flow/components/__test_fixtures__/failures.js.flow +600 -0
- package/lib/parsers/flow/components/__test_fixtures__/fixtures.js +1001 -0
- package/lib/parsers/flow/components/__test_fixtures__/fixtures.js.flow +1016 -0
- package/lib/parsers/flow/components/commands.js +104 -0
- package/lib/parsers/flow/components/commands.js.flow +123 -0
- package/lib/parsers/flow/components/componentsUtils.js +446 -0
- package/lib/parsers/flow/components/componentsUtils.js.flow +496 -0
- package/lib/parsers/flow/components/events.js +233 -0
- package/lib/parsers/flow/components/events.js.flow +262 -0
- package/lib/parsers/flow/components/extends.js +52 -0
- package/lib/parsers/flow/components/extends.js.flow +66 -0
- package/lib/parsers/flow/components/index.js +267 -0
- package/lib/parsers/flow/components/index.js.flow +226 -0
- package/lib/parsers/flow/components/options.js +72 -0
- package/lib/parsers/flow/components/options.js.flow +87 -0
- package/lib/parsers/flow/components/props.js +47 -0
- package/lib/parsers/flow/components/props.js.flow +60 -0
- package/lib/parsers/flow/components/schema.js +106 -0
- package/lib/parsers/flow/components/schema.js.flow +62 -0
- package/lib/parsers/flow/index.js +80 -0
- package/lib/parsers/flow/index.js.flow +85 -0
- package/lib/parsers/flow/modules/__test_fixtures__/failures.js +215 -0
- package/lib/parsers/flow/modules/__test_fixtures__/failures.js.flow +223 -0
- package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js +724 -0
- package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js.flow +747 -0
- package/lib/parsers/flow/modules/index.js +528 -0
- package/lib/parsers/flow/modules/index.js.flow +420 -0
- package/lib/parsers/flow/parser.js +109 -0
- package/lib/parsers/flow/parser.js.flow +83 -0
- package/lib/parsers/flow/utils.js +108 -0
- package/lib/parsers/flow/utils.js.flow +123 -0
- package/lib/parsers/parser.js +11 -0
- package/lib/parsers/parser.js.flow +70 -0
- package/lib/parsers/parserMock.js +96 -0
- package/lib/parsers/parserMock.js.flow +68 -0
- package/lib/parsers/parsers-commons.js +448 -0
- package/lib/parsers/parsers-commons.js.flow +447 -0
- package/lib/parsers/parsers-primitives.js +387 -0
- package/lib/parsers/parsers-primitives.js.flow +383 -0
- package/lib/parsers/parsers-utils.js +18 -0
- package/lib/parsers/parsers-utils.js.flow +19 -0
- package/lib/parsers/schema/index.js +23 -0
- package/lib/parsers/schema/index.js.flow +26 -0
- package/lib/parsers/typescript/components/__test_fixtures__/failures.js +489 -0
- package/lib/parsers/typescript/components/__test_fixtures__/failures.js.flow +505 -0
- package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js +1151 -0
- package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js.flow +1168 -0
- package/lib/parsers/typescript/components/commands.js +132 -0
- package/lib/parsers/typescript/components/commands.js.flow +151 -0
- package/lib/parsers/typescript/components/componentsUtils.js +471 -0
- package/lib/parsers/typescript/components/componentsUtils.js.flow +521 -0
- package/lib/parsers/typescript/components/events.js +240 -0
- package/lib/parsers/typescript/components/events.js.flow +262 -0
- package/lib/parsers/typescript/components/extends.js +88 -0
- package/lib/parsers/typescript/components/extends.js.flow +103 -0
- package/lib/parsers/typescript/components/index.js +277 -0
- package/lib/parsers/typescript/components/index.js.flow +239 -0
- package/lib/parsers/typescript/components/options.js +72 -0
- package/lib/parsers/typescript/components/options.js.flow +87 -0
- package/lib/parsers/typescript/components/props.js +39 -0
- package/lib/parsers/typescript/components/props.js.flow +48 -0
- package/lib/parsers/typescript/components/schema.js +106 -0
- package/lib/parsers/typescript/components/schema.js.flow +62 -0
- package/lib/parsers/typescript/index.js +85 -0
- package/lib/parsers/typescript/index.js.flow +94 -0
- package/lib/parsers/typescript/modules/__test_fixtures__/failures.js +160 -0
- package/lib/parsers/typescript/modules/__test_fixtures__/failures.js.flow +167 -0
- package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js +701 -0
- package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js.flow +727 -0
- package/lib/parsers/typescript/modules/index.js +543 -0
- package/lib/parsers/typescript/modules/index.js.flow +435 -0
- package/lib/parsers/typescript/parseTopLevelType.js +203 -0
- package/lib/parsers/typescript/parseTopLevelType.js.flow +243 -0
- package/lib/parsers/typescript/parser.js +105 -0
- package/lib/parsers/typescript/parser.js.flow +87 -0
- package/lib/parsers/typescript/utils.js +101 -0
- package/lib/parsers/typescript/utils.js.flow +115 -0
- package/lib/parsers/utils.js +273 -0
- package/lib/parsers/utils.js.flow +266 -0
- 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
|
+
};
|