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