@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,299 @@
|
|
|
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
|
+
const HostFunctionTemplate = ({
|
|
87
|
+
hasteModuleName,
|
|
88
|
+
methodName,
|
|
89
|
+
returnTypeAnnotation,
|
|
90
|
+
args,
|
|
91
|
+
}) => {
|
|
92
|
+
const isNullable = returnTypeAnnotation.type === 'NullableTypeAnnotation';
|
|
93
|
+
const isVoid = returnTypeAnnotation.type === 'VoidTypeAnnotation';
|
|
94
|
+
const methodCallArgs = ['rt', ...args].join(', ');
|
|
95
|
+
const methodCall = `static_cast<${hasteModuleName}CxxSpecJSI *>(&turboModule)->${methodName}(${methodCallArgs})`;
|
|
96
|
+
return `static jsi::Value __hostFunction_${hasteModuleName}CxxSpecJSI_${methodName}(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {${
|
|
97
|
+
isVoid
|
|
98
|
+
? `\n ${methodCall};`
|
|
99
|
+
: isNullable
|
|
100
|
+
? `\n auto result = ${methodCall};`
|
|
101
|
+
: ''
|
|
102
|
+
}
|
|
103
|
+
return ${
|
|
104
|
+
isVoid
|
|
105
|
+
? 'jsi::Value::undefined()'
|
|
106
|
+
: isNullable
|
|
107
|
+
? 'result ? jsi::Value(std::move(*result)) : jsi::Value::null()'
|
|
108
|
+
: methodCall
|
|
109
|
+
};
|
|
110
|
+
}`;
|
|
111
|
+
};
|
|
112
|
+
const ModuleTemplate = ({
|
|
113
|
+
hasteModuleName,
|
|
114
|
+
hostFunctions,
|
|
115
|
+
moduleName,
|
|
116
|
+
methods,
|
|
117
|
+
}) => {
|
|
118
|
+
return `${hostFunctions.join('\n')}
|
|
119
|
+
|
|
120
|
+
${hasteModuleName}CxxSpecJSI::${hasteModuleName}CxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
|
121
|
+
: TurboModule("${moduleName}", jsInvoker) {
|
|
122
|
+
${methods
|
|
123
|
+
.map(({methodName, paramCount}) => {
|
|
124
|
+
return ` methodMap_["${methodName}"] = MethodMetadata {${paramCount}, __hostFunction_${hasteModuleName}CxxSpecJSI_${methodName}};`;
|
|
125
|
+
})
|
|
126
|
+
.join('\n')}
|
|
127
|
+
}`;
|
|
128
|
+
};
|
|
129
|
+
const FileTemplate = ({libraryName, modules}) => {
|
|
130
|
+
return `/**
|
|
131
|
+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
132
|
+
*
|
|
133
|
+
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
134
|
+
* once the code is regenerated.
|
|
135
|
+
*
|
|
136
|
+
* ${'@'}generated by codegen project: GenerateModuleH.js
|
|
137
|
+
*/
|
|
138
|
+
|
|
139
|
+
#include "${libraryName}JSI.h"
|
|
140
|
+
|
|
141
|
+
namespace facebook {
|
|
142
|
+
namespace react {
|
|
143
|
+
|
|
144
|
+
${modules}
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
} // namespace react
|
|
148
|
+
} // namespace facebook
|
|
149
|
+
`;
|
|
150
|
+
};
|
|
151
|
+
function serializeArg(arg, index, resolveAlias) {
|
|
152
|
+
const nullableTypeAnnotation = arg.typeAnnotation,
|
|
153
|
+
optional = arg.optional;
|
|
154
|
+
const _unwrapNullable = unwrapNullable(nullableTypeAnnotation),
|
|
155
|
+
_unwrapNullable2 = _slicedToArray(_unwrapNullable, 2),
|
|
156
|
+
typeAnnotation = _unwrapNullable2[0],
|
|
157
|
+
nullable = _unwrapNullable2[1];
|
|
158
|
+
const isRequired = !optional && !nullable;
|
|
159
|
+
let realTypeAnnotation = typeAnnotation;
|
|
160
|
+
if (realTypeAnnotation.type === 'TypeAliasTypeAnnotation') {
|
|
161
|
+
realTypeAnnotation = resolveAlias(realTypeAnnotation.name);
|
|
162
|
+
}
|
|
163
|
+
function wrap(callback) {
|
|
164
|
+
const val = `args[${index}]`;
|
|
165
|
+
const expression = callback(val);
|
|
166
|
+
if (isRequired) {
|
|
167
|
+
return expression;
|
|
168
|
+
} else {
|
|
169
|
+
let condition = `${val}.isNull() || ${val}.isUndefined()`;
|
|
170
|
+
if (optional) {
|
|
171
|
+
condition = `count < ${index} || ${condition}`;
|
|
172
|
+
}
|
|
173
|
+
return `${condition} ? std::nullopt : std::make_optional(${expression})`;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
switch (realTypeAnnotation.type) {
|
|
177
|
+
case 'ReservedTypeAnnotation':
|
|
178
|
+
switch (realTypeAnnotation.name) {
|
|
179
|
+
case 'RootTag':
|
|
180
|
+
return wrap(val => `${val}.getNumber()`);
|
|
181
|
+
default:
|
|
182
|
+
realTypeAnnotation.name;
|
|
183
|
+
throw new Error(
|
|
184
|
+
`Unknown prop type for "${arg.name}, found: ${realTypeAnnotation.name}"`,
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
case 'StringTypeAnnotation':
|
|
188
|
+
return wrap(val => `${val}.asString(rt)`);
|
|
189
|
+
case 'BooleanTypeAnnotation':
|
|
190
|
+
return wrap(val => `${val}.asBool()`);
|
|
191
|
+
case 'EnumDeclaration':
|
|
192
|
+
switch (realTypeAnnotation.memberType) {
|
|
193
|
+
case 'NumberTypeAnnotation':
|
|
194
|
+
return wrap(val => `${val}.asNumber()`);
|
|
195
|
+
case 'StringTypeAnnotation':
|
|
196
|
+
return wrap(val => `${val}.asString(rt)`);
|
|
197
|
+
default:
|
|
198
|
+
throw new Error(
|
|
199
|
+
`Unknown enum type for "${arg.name}, found: ${realTypeAnnotation.type}"`,
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
case 'NumberTypeAnnotation':
|
|
203
|
+
return wrap(val => `${val}.asNumber()`);
|
|
204
|
+
case 'FloatTypeAnnotation':
|
|
205
|
+
return wrap(val => `${val}.asNumber()`);
|
|
206
|
+
case 'DoubleTypeAnnotation':
|
|
207
|
+
return wrap(val => `${val}.asNumber()`);
|
|
208
|
+
case 'Int32TypeAnnotation':
|
|
209
|
+
return wrap(val => `${val}.asNumber()`);
|
|
210
|
+
case 'ArrayTypeAnnotation':
|
|
211
|
+
return wrap(val => `${val}.asObject(rt).asArray(rt)`);
|
|
212
|
+
case 'FunctionTypeAnnotation':
|
|
213
|
+
return wrap(val => `${val}.asObject(rt).asFunction(rt)`);
|
|
214
|
+
case 'GenericObjectTypeAnnotation':
|
|
215
|
+
return wrap(val => `${val}.asObject(rt)`);
|
|
216
|
+
case 'UnionTypeAnnotation':
|
|
217
|
+
switch (typeAnnotation.memberType) {
|
|
218
|
+
case 'NumberTypeAnnotation':
|
|
219
|
+
return wrap(val => `${val}.asNumber()`);
|
|
220
|
+
case 'ObjectTypeAnnotation':
|
|
221
|
+
return wrap(val => `${val}.asObject(rt)`);
|
|
222
|
+
case 'StringTypeAnnotation':
|
|
223
|
+
return wrap(val => `${val}.asString(rt)`);
|
|
224
|
+
default:
|
|
225
|
+
throw new Error(
|
|
226
|
+
`Unsupported union member type for param "${arg.name}, found: ${realTypeAnnotation.memberType}"`,
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
case 'ObjectTypeAnnotation':
|
|
230
|
+
return wrap(val => `${val}.asObject(rt)`);
|
|
231
|
+
case 'MixedTypeAnnotation':
|
|
232
|
+
return wrap(val => `jsi::Value(rt, ${val})`);
|
|
233
|
+
default:
|
|
234
|
+
realTypeAnnotation.type;
|
|
235
|
+
throw new Error(
|
|
236
|
+
`Unknown prop type for "${arg.name}, found: ${realTypeAnnotation.type}"`,
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
function serializePropertyIntoHostFunction(
|
|
241
|
+
hasteModuleName,
|
|
242
|
+
property,
|
|
243
|
+
resolveAlias,
|
|
244
|
+
) {
|
|
245
|
+
const _unwrapNullable3 = unwrapNullable(property.typeAnnotation),
|
|
246
|
+
_unwrapNullable4 = _slicedToArray(_unwrapNullable3, 1),
|
|
247
|
+
propertyTypeAnnotation = _unwrapNullable4[0];
|
|
248
|
+
return HostFunctionTemplate({
|
|
249
|
+
hasteModuleName,
|
|
250
|
+
methodName: property.name,
|
|
251
|
+
returnTypeAnnotation: propertyTypeAnnotation.returnTypeAnnotation,
|
|
252
|
+
args: propertyTypeAnnotation.params.map((p, i) =>
|
|
253
|
+
serializeArg(p, i, resolveAlias),
|
|
254
|
+
),
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
module.exports = {
|
|
258
|
+
generate(libraryName, schema, packageName, assumeNonnull = false) {
|
|
259
|
+
const nativeModules = getModules(schema);
|
|
260
|
+
const modules = Object.keys(nativeModules)
|
|
261
|
+
.map(hasteModuleName => {
|
|
262
|
+
const nativeModule = nativeModules[hasteModuleName];
|
|
263
|
+
const aliases = nativeModule.aliases,
|
|
264
|
+
properties = nativeModule.spec.properties,
|
|
265
|
+
moduleName = nativeModule.moduleName;
|
|
266
|
+
const resolveAlias = createAliasResolver(aliases);
|
|
267
|
+
const hostFunctions = properties.map(property =>
|
|
268
|
+
serializePropertyIntoHostFunction(
|
|
269
|
+
hasteModuleName,
|
|
270
|
+
property,
|
|
271
|
+
resolveAlias,
|
|
272
|
+
),
|
|
273
|
+
);
|
|
274
|
+
return ModuleTemplate({
|
|
275
|
+
hasteModuleName,
|
|
276
|
+
hostFunctions,
|
|
277
|
+
moduleName,
|
|
278
|
+
methods: properties.map(
|
|
279
|
+
({name: propertyName, typeAnnotation: nullableTypeAnnotation}) => {
|
|
280
|
+
const _unwrapNullable5 = unwrapNullable(nullableTypeAnnotation),
|
|
281
|
+
_unwrapNullable6 = _slicedToArray(_unwrapNullable5, 1),
|
|
282
|
+
params = _unwrapNullable6[0].params;
|
|
283
|
+
return {
|
|
284
|
+
methodName: propertyName,
|
|
285
|
+
paramCount: params.length,
|
|
286
|
+
};
|
|
287
|
+
},
|
|
288
|
+
),
|
|
289
|
+
});
|
|
290
|
+
})
|
|
291
|
+
.join('\n');
|
|
292
|
+
const fileName = `${libraryName}JSI-generated.cpp`;
|
|
293
|
+
const replacedTemplate = FileTemplate({
|
|
294
|
+
modules,
|
|
295
|
+
libraryName,
|
|
296
|
+
});
|
|
297
|
+
return new Map([[fileName, replacedTemplate]]);
|
|
298
|
+
},
|
|
299
|
+
};
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
* @flow strict
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
import type {
|
|
14
|
+
SchemaType,
|
|
15
|
+
Nullable,
|
|
16
|
+
NamedShape,
|
|
17
|
+
NativeModulePropertyShape,
|
|
18
|
+
NativeModuleFunctionTypeAnnotation,
|
|
19
|
+
NativeModuleParamTypeAnnotation,
|
|
20
|
+
NativeModuleTypeAnnotation,
|
|
21
|
+
} from '../../CodegenSchema';
|
|
22
|
+
|
|
23
|
+
import type {AliasResolver} from './Utils';
|
|
24
|
+
const {createAliasResolver, getModules} = require('./Utils');
|
|
25
|
+
const {unwrapNullable} = require('../../parsers/parsers-commons');
|
|
26
|
+
|
|
27
|
+
type FilesOutput = Map<string, string>;
|
|
28
|
+
|
|
29
|
+
const HostFunctionTemplate = ({
|
|
30
|
+
hasteModuleName,
|
|
31
|
+
methodName,
|
|
32
|
+
returnTypeAnnotation,
|
|
33
|
+
args,
|
|
34
|
+
}: $ReadOnly<{
|
|
35
|
+
hasteModuleName: string,
|
|
36
|
+
methodName: string,
|
|
37
|
+
returnTypeAnnotation: Nullable<NativeModuleTypeAnnotation>,
|
|
38
|
+
args: Array<string>,
|
|
39
|
+
}>) => {
|
|
40
|
+
const isNullable = returnTypeAnnotation.type === 'NullableTypeAnnotation';
|
|
41
|
+
const isVoid = returnTypeAnnotation.type === 'VoidTypeAnnotation';
|
|
42
|
+
const methodCallArgs = ['rt', ...args].join(', ');
|
|
43
|
+
const methodCall = `static_cast<${hasteModuleName}CxxSpecJSI *>(&turboModule)->${methodName}(${methodCallArgs})`;
|
|
44
|
+
|
|
45
|
+
return `static jsi::Value __hostFunction_${hasteModuleName}CxxSpecJSI_${methodName}(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {${
|
|
46
|
+
isVoid
|
|
47
|
+
? `\n ${methodCall};`
|
|
48
|
+
: isNullable
|
|
49
|
+
? `\n auto result = ${methodCall};`
|
|
50
|
+
: ''
|
|
51
|
+
}
|
|
52
|
+
return ${
|
|
53
|
+
isVoid
|
|
54
|
+
? 'jsi::Value::undefined()'
|
|
55
|
+
: isNullable
|
|
56
|
+
? 'result ? jsi::Value(std::move(*result)) : jsi::Value::null()'
|
|
57
|
+
: methodCall
|
|
58
|
+
};
|
|
59
|
+
}`;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const ModuleTemplate = ({
|
|
63
|
+
hasteModuleName,
|
|
64
|
+
hostFunctions,
|
|
65
|
+
moduleName,
|
|
66
|
+
methods,
|
|
67
|
+
}: $ReadOnly<{
|
|
68
|
+
hasteModuleName: string,
|
|
69
|
+
hostFunctions: $ReadOnlyArray<string>,
|
|
70
|
+
moduleName: string,
|
|
71
|
+
methods: $ReadOnlyArray<$ReadOnly<{methodName: string, paramCount: number}>>,
|
|
72
|
+
}>) => {
|
|
73
|
+
return `${hostFunctions.join('\n')}
|
|
74
|
+
|
|
75
|
+
${hasteModuleName}CxxSpecJSI::${hasteModuleName}CxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
|
76
|
+
: TurboModule("${moduleName}", jsInvoker) {
|
|
77
|
+
${methods
|
|
78
|
+
.map(({methodName, paramCount}) => {
|
|
79
|
+
return ` methodMap_["${methodName}"] = MethodMetadata {${paramCount}, __hostFunction_${hasteModuleName}CxxSpecJSI_${methodName}};`;
|
|
80
|
+
})
|
|
81
|
+
.join('\n')}
|
|
82
|
+
}`;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const FileTemplate = ({
|
|
86
|
+
libraryName,
|
|
87
|
+
modules,
|
|
88
|
+
}: $ReadOnly<{
|
|
89
|
+
libraryName: string,
|
|
90
|
+
modules: string,
|
|
91
|
+
}>) => {
|
|
92
|
+
return `/**
|
|
93
|
+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
94
|
+
*
|
|
95
|
+
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
96
|
+
* once the code is regenerated.
|
|
97
|
+
*
|
|
98
|
+
* ${'@'}generated by codegen project: GenerateModuleH.js
|
|
99
|
+
*/
|
|
100
|
+
|
|
101
|
+
#include "${libraryName}JSI.h"
|
|
102
|
+
|
|
103
|
+
namespace facebook {
|
|
104
|
+
namespace react {
|
|
105
|
+
|
|
106
|
+
${modules}
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
} // namespace react
|
|
110
|
+
} // namespace facebook
|
|
111
|
+
`;
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
type Param = NamedShape<Nullable<NativeModuleParamTypeAnnotation>>;
|
|
115
|
+
|
|
116
|
+
function serializeArg(
|
|
117
|
+
arg: Param,
|
|
118
|
+
index: number,
|
|
119
|
+
resolveAlias: AliasResolver,
|
|
120
|
+
): string {
|
|
121
|
+
const {typeAnnotation: nullableTypeAnnotation, optional} = arg;
|
|
122
|
+
const [typeAnnotation, nullable] =
|
|
123
|
+
unwrapNullable<NativeModuleParamTypeAnnotation>(nullableTypeAnnotation);
|
|
124
|
+
const isRequired = !optional && !nullable;
|
|
125
|
+
|
|
126
|
+
let realTypeAnnotation = typeAnnotation;
|
|
127
|
+
if (realTypeAnnotation.type === 'TypeAliasTypeAnnotation') {
|
|
128
|
+
realTypeAnnotation = resolveAlias(realTypeAnnotation.name);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function wrap(callback: (val: string) => string) {
|
|
132
|
+
const val = `args[${index}]`;
|
|
133
|
+
const expression = callback(val);
|
|
134
|
+
if (isRequired) {
|
|
135
|
+
return expression;
|
|
136
|
+
} else {
|
|
137
|
+
let condition = `${val}.isNull() || ${val}.isUndefined()`;
|
|
138
|
+
if (optional) {
|
|
139
|
+
condition = `count < ${index} || ${condition}`;
|
|
140
|
+
}
|
|
141
|
+
return `${condition} ? std::nullopt : std::make_optional(${expression})`;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
switch (realTypeAnnotation.type) {
|
|
146
|
+
case 'ReservedTypeAnnotation':
|
|
147
|
+
switch (realTypeAnnotation.name) {
|
|
148
|
+
case 'RootTag':
|
|
149
|
+
return wrap(val => `${val}.getNumber()`);
|
|
150
|
+
default:
|
|
151
|
+
(realTypeAnnotation.name: empty);
|
|
152
|
+
throw new Error(
|
|
153
|
+
`Unknown prop type for "${arg.name}, found: ${realTypeAnnotation.name}"`,
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
case 'StringTypeAnnotation':
|
|
157
|
+
return wrap(val => `${val}.asString(rt)`);
|
|
158
|
+
case 'BooleanTypeAnnotation':
|
|
159
|
+
return wrap(val => `${val}.asBool()`);
|
|
160
|
+
case 'EnumDeclaration':
|
|
161
|
+
switch (realTypeAnnotation.memberType) {
|
|
162
|
+
case 'NumberTypeAnnotation':
|
|
163
|
+
return wrap(val => `${val}.asNumber()`);
|
|
164
|
+
case 'StringTypeAnnotation':
|
|
165
|
+
return wrap(val => `${val}.asString(rt)`);
|
|
166
|
+
default:
|
|
167
|
+
throw new Error(
|
|
168
|
+
`Unknown enum type for "${arg.name}, found: ${realTypeAnnotation.type}"`,
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
case 'NumberTypeAnnotation':
|
|
172
|
+
return wrap(val => `${val}.asNumber()`);
|
|
173
|
+
case 'FloatTypeAnnotation':
|
|
174
|
+
return wrap(val => `${val}.asNumber()`);
|
|
175
|
+
case 'DoubleTypeAnnotation':
|
|
176
|
+
return wrap(val => `${val}.asNumber()`);
|
|
177
|
+
case 'Int32TypeAnnotation':
|
|
178
|
+
return wrap(val => `${val}.asNumber()`);
|
|
179
|
+
case 'ArrayTypeAnnotation':
|
|
180
|
+
return wrap(val => `${val}.asObject(rt).asArray(rt)`);
|
|
181
|
+
case 'FunctionTypeAnnotation':
|
|
182
|
+
return wrap(val => `${val}.asObject(rt).asFunction(rt)`);
|
|
183
|
+
case 'GenericObjectTypeAnnotation':
|
|
184
|
+
return wrap(val => `${val}.asObject(rt)`);
|
|
185
|
+
case 'UnionTypeAnnotation':
|
|
186
|
+
switch (typeAnnotation.memberType) {
|
|
187
|
+
case 'NumberTypeAnnotation':
|
|
188
|
+
return wrap(val => `${val}.asNumber()`);
|
|
189
|
+
case 'ObjectTypeAnnotation':
|
|
190
|
+
return wrap(val => `${val}.asObject(rt)`);
|
|
191
|
+
case 'StringTypeAnnotation':
|
|
192
|
+
return wrap(val => `${val}.asString(rt)`);
|
|
193
|
+
default:
|
|
194
|
+
throw new Error(
|
|
195
|
+
`Unsupported union member type for param "${arg.name}, found: ${realTypeAnnotation.memberType}"`,
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
case 'ObjectTypeAnnotation':
|
|
199
|
+
return wrap(val => `${val}.asObject(rt)`);
|
|
200
|
+
case 'MixedTypeAnnotation':
|
|
201
|
+
return wrap(val => `jsi::Value(rt, ${val})`);
|
|
202
|
+
default:
|
|
203
|
+
(realTypeAnnotation.type: empty);
|
|
204
|
+
throw new Error(
|
|
205
|
+
`Unknown prop type for "${arg.name}, found: ${realTypeAnnotation.type}"`,
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function serializePropertyIntoHostFunction(
|
|
211
|
+
hasteModuleName: string,
|
|
212
|
+
property: NativeModulePropertyShape,
|
|
213
|
+
resolveAlias: AliasResolver,
|
|
214
|
+
): string {
|
|
215
|
+
const [propertyTypeAnnotation] =
|
|
216
|
+
unwrapNullable<NativeModuleFunctionTypeAnnotation>(property.typeAnnotation);
|
|
217
|
+
|
|
218
|
+
return HostFunctionTemplate({
|
|
219
|
+
hasteModuleName,
|
|
220
|
+
methodName: property.name,
|
|
221
|
+
returnTypeAnnotation: propertyTypeAnnotation.returnTypeAnnotation,
|
|
222
|
+
args: propertyTypeAnnotation.params.map((p, i) =>
|
|
223
|
+
serializeArg(p, i, resolveAlias),
|
|
224
|
+
),
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
module.exports = {
|
|
229
|
+
generate(
|
|
230
|
+
libraryName: string,
|
|
231
|
+
schema: SchemaType,
|
|
232
|
+
packageName?: string,
|
|
233
|
+
assumeNonnull: boolean = false,
|
|
234
|
+
): FilesOutput {
|
|
235
|
+
const nativeModules = getModules(schema);
|
|
236
|
+
|
|
237
|
+
const modules = Object.keys(nativeModules)
|
|
238
|
+
.map((hasteModuleName: string) => {
|
|
239
|
+
const nativeModule = nativeModules[hasteModuleName];
|
|
240
|
+
const {
|
|
241
|
+
aliases,
|
|
242
|
+
spec: {properties},
|
|
243
|
+
moduleName,
|
|
244
|
+
} = nativeModule;
|
|
245
|
+
const resolveAlias = createAliasResolver(aliases);
|
|
246
|
+
const hostFunctions = properties.map(property =>
|
|
247
|
+
serializePropertyIntoHostFunction(
|
|
248
|
+
hasteModuleName,
|
|
249
|
+
property,
|
|
250
|
+
resolveAlias,
|
|
251
|
+
),
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
return ModuleTemplate({
|
|
255
|
+
hasteModuleName,
|
|
256
|
+
hostFunctions,
|
|
257
|
+
moduleName,
|
|
258
|
+
methods: properties.map(
|
|
259
|
+
({name: propertyName, typeAnnotation: nullableTypeAnnotation}) => {
|
|
260
|
+
const [{params}] = unwrapNullable(nullableTypeAnnotation);
|
|
261
|
+
return {
|
|
262
|
+
methodName: propertyName,
|
|
263
|
+
paramCount: params.length,
|
|
264
|
+
};
|
|
265
|
+
},
|
|
266
|
+
),
|
|
267
|
+
});
|
|
268
|
+
})
|
|
269
|
+
.join('\n');
|
|
270
|
+
|
|
271
|
+
const fileName = `${libraryName}JSI-generated.cpp`;
|
|
272
|
+
const replacedTemplate = FileTemplate({
|
|
273
|
+
modules,
|
|
274
|
+
libraryName,
|
|
275
|
+
});
|
|
276
|
+
return new Map([[fileName, replacedTemplate]]);
|
|
277
|
+
},
|
|
278
|
+
};
|