@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,187 @@
|
|
|
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
|
+
ReservedPropTypeAnnotation,
|
|
15
|
+
NamedShape,
|
|
16
|
+
ObjectTypeAnnotation,
|
|
17
|
+
BooleanTypeAnnotation,
|
|
18
|
+
StringTypeAnnotation,
|
|
19
|
+
DoubleTypeAnnotation,
|
|
20
|
+
FloatTypeAnnotation,
|
|
21
|
+
Int32TypeAnnotation,
|
|
22
|
+
PropTypeAnnotation,
|
|
23
|
+
} from '../../../CodegenSchema';
|
|
24
|
+
|
|
25
|
+
const {capitalize} = require('../../Utils');
|
|
26
|
+
|
|
27
|
+
export type Pojo = {
|
|
28
|
+
name: string,
|
|
29
|
+
namespace: string,
|
|
30
|
+
properties: $ReadOnlyArray<PojoProperty>,
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export type PojoProperty = NamedShape<PojoTypeAnnotation>;
|
|
34
|
+
|
|
35
|
+
export type PojoTypeAliasAnnotation = {
|
|
36
|
+
type: 'PojoTypeAliasTypeAnnotation',
|
|
37
|
+
name: string,
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export type PojoTypeAnnotation =
|
|
41
|
+
| $ReadOnly<{
|
|
42
|
+
type: 'BooleanTypeAnnotation',
|
|
43
|
+
default: boolean | null,
|
|
44
|
+
}>
|
|
45
|
+
| $ReadOnly<{
|
|
46
|
+
type: 'StringTypeAnnotation',
|
|
47
|
+
default: string | null,
|
|
48
|
+
}>
|
|
49
|
+
| $ReadOnly<{
|
|
50
|
+
type: 'DoubleTypeAnnotation',
|
|
51
|
+
default: number,
|
|
52
|
+
}>
|
|
53
|
+
| $ReadOnly<{
|
|
54
|
+
type: 'FloatTypeAnnotation',
|
|
55
|
+
default: number | null,
|
|
56
|
+
}>
|
|
57
|
+
| $ReadOnly<{
|
|
58
|
+
type: 'Int32TypeAnnotation',
|
|
59
|
+
default: number,
|
|
60
|
+
}>
|
|
61
|
+
| $ReadOnly<{
|
|
62
|
+
type: 'StringEnumTypeAnnotation',
|
|
63
|
+
default: string,
|
|
64
|
+
options: $ReadOnlyArray<string>,
|
|
65
|
+
}>
|
|
66
|
+
| $ReadOnly<{
|
|
67
|
+
type: 'Int32EnumTypeAnnotation',
|
|
68
|
+
default: number,
|
|
69
|
+
options: $ReadOnlyArray<number>,
|
|
70
|
+
}>
|
|
71
|
+
| ReservedPropTypeAnnotation
|
|
72
|
+
| PojoTypeAliasAnnotation
|
|
73
|
+
| $ReadOnly<{
|
|
74
|
+
type: 'ArrayTypeAnnotation',
|
|
75
|
+
elementType:
|
|
76
|
+
| BooleanTypeAnnotation
|
|
77
|
+
| StringTypeAnnotation
|
|
78
|
+
| DoubleTypeAnnotation
|
|
79
|
+
| FloatTypeAnnotation
|
|
80
|
+
| Int32TypeAnnotation
|
|
81
|
+
| $ReadOnly<{
|
|
82
|
+
type: 'StringEnumTypeAnnotation',
|
|
83
|
+
default: string,
|
|
84
|
+
options: $ReadOnlyArray<string>,
|
|
85
|
+
}>
|
|
86
|
+
| PojoTypeAliasAnnotation
|
|
87
|
+
| ReservedPropTypeAnnotation
|
|
88
|
+
| $ReadOnly<{
|
|
89
|
+
type: 'ArrayTypeAnnotation',
|
|
90
|
+
elementType: PojoTypeAliasAnnotation,
|
|
91
|
+
}>,
|
|
92
|
+
}>;
|
|
93
|
+
|
|
94
|
+
class PojoCollector {
|
|
95
|
+
_pojos: Map<string, Pojo> = new Map();
|
|
96
|
+
process(
|
|
97
|
+
namespace: string,
|
|
98
|
+
pojoName: string,
|
|
99
|
+
typeAnnotation: PropTypeAnnotation,
|
|
100
|
+
): PojoTypeAnnotation {
|
|
101
|
+
switch (typeAnnotation.type) {
|
|
102
|
+
case 'ObjectTypeAnnotation': {
|
|
103
|
+
this._insertPojo(namespace, pojoName, typeAnnotation);
|
|
104
|
+
return {
|
|
105
|
+
type: 'PojoTypeAliasTypeAnnotation',
|
|
106
|
+
name: pojoName,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
case 'ArrayTypeAnnotation': {
|
|
110
|
+
const arrayTypeAnnotation = typeAnnotation;
|
|
111
|
+
// TODO: Flow assumes elementType can be any. Fix this.
|
|
112
|
+
const elementType: $PropertyType<
|
|
113
|
+
typeof arrayTypeAnnotation,
|
|
114
|
+
'elementType',
|
|
115
|
+
> = arrayTypeAnnotation.elementType;
|
|
116
|
+
|
|
117
|
+
const pojoElementType = (() => {
|
|
118
|
+
switch (elementType.type) {
|
|
119
|
+
case 'ObjectTypeAnnotation': {
|
|
120
|
+
this._insertPojo(namespace, `${pojoName}Element`, elementType);
|
|
121
|
+
return {
|
|
122
|
+
type: 'PojoTypeAliasTypeAnnotation',
|
|
123
|
+
name: `${pojoName}Element`,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
case 'ArrayTypeAnnotation': {
|
|
127
|
+
const {elementType: objectTypeAnnotation} = elementType;
|
|
128
|
+
this._insertPojo(
|
|
129
|
+
namespace,
|
|
130
|
+
`${pojoName}ElementElement`,
|
|
131
|
+
objectTypeAnnotation,
|
|
132
|
+
);
|
|
133
|
+
return {
|
|
134
|
+
type: 'ArrayTypeAnnotation',
|
|
135
|
+
elementType: {
|
|
136
|
+
type: 'PojoTypeAliasTypeAnnotation',
|
|
137
|
+
name: `${pojoName}ElementElement`,
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
default: {
|
|
142
|
+
return elementType;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
})();
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
type: 'ArrayTypeAnnotation',
|
|
149
|
+
elementType: pojoElementType,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
default:
|
|
153
|
+
return typeAnnotation;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
_insertPojo(
|
|
158
|
+
namespace: string,
|
|
159
|
+
pojoName: string,
|
|
160
|
+
objectTypeAnnotation: ObjectTypeAnnotation<PropTypeAnnotation>,
|
|
161
|
+
) {
|
|
162
|
+
const properties = objectTypeAnnotation.properties.map(property => {
|
|
163
|
+
const propertyPojoName = pojoName + capitalize(property.name);
|
|
164
|
+
|
|
165
|
+
return {
|
|
166
|
+
...property,
|
|
167
|
+
typeAnnotation: this.process(
|
|
168
|
+
namespace,
|
|
169
|
+
propertyPojoName,
|
|
170
|
+
property.typeAnnotation,
|
|
171
|
+
),
|
|
172
|
+
};
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
this._pojos.set(pojoName, {
|
|
176
|
+
name: pojoName,
|
|
177
|
+
namespace,
|
|
178
|
+
properties,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
getAllPojos(): $ReadOnlyArray<Pojo> {
|
|
183
|
+
return [...this._pojos.values()];
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
module.exports = PojoCollector;
|
|
@@ -0,0 +1,66 @@
|
|
|
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 PojoCollector = require('./PojoCollector');
|
|
14
|
+
const _require = require('../../Utils'),
|
|
15
|
+
capitalize = _require.capitalize;
|
|
16
|
+
const _require2 = require('./serializePojo'),
|
|
17
|
+
serializePojo = _require2.serializePojo;
|
|
18
|
+
module.exports = {
|
|
19
|
+
generate(libraryName, schema, packageName) {
|
|
20
|
+
const pojoCollector = new PojoCollector();
|
|
21
|
+
const basePackageName = 'com.facebook.react.viewmanagers';
|
|
22
|
+
Object.keys(schema.modules).forEach(hasteModuleName => {
|
|
23
|
+
const module = schema.modules[hasteModuleName];
|
|
24
|
+
if (module.type !== 'Component') {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const components = module.components;
|
|
28
|
+
// No components in this module
|
|
29
|
+
if (components == null) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
Object.keys(components)
|
|
33
|
+
.filter(componentName => {
|
|
34
|
+
const component = components[componentName];
|
|
35
|
+
return !(
|
|
36
|
+
component.excludedPlatforms &&
|
|
37
|
+
component.excludedPlatforms.includes('android')
|
|
38
|
+
);
|
|
39
|
+
})
|
|
40
|
+
.forEach(componentName => {
|
|
41
|
+
const component = components[componentName];
|
|
42
|
+
if (component == null) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const props = component.props;
|
|
46
|
+
pojoCollector.process(
|
|
47
|
+
capitalize(hasteModuleName),
|
|
48
|
+
`${capitalize(componentName)}Props`,
|
|
49
|
+
{
|
|
50
|
+
type: 'ObjectTypeAnnotation',
|
|
51
|
+
properties: props,
|
|
52
|
+
},
|
|
53
|
+
);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
const pojoDir = basePackageName.split('.').join('/');
|
|
57
|
+
return new Map(
|
|
58
|
+
pojoCollector.getAllPojos().map(pojo => {
|
|
59
|
+
return [
|
|
60
|
+
`java/${pojoDir}/${pojo.namespace}/${pojo.name}.java`,
|
|
61
|
+
serializePojo(pojo, basePackageName),
|
|
62
|
+
];
|
|
63
|
+
}),
|
|
64
|
+
);
|
|
65
|
+
},
|
|
66
|
+
};
|
|
@@ -0,0 +1,80 @@
|
|
|
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 {SchemaType} from '../../../CodegenSchema';
|
|
14
|
+
|
|
15
|
+
const PojoCollector = require('./PojoCollector');
|
|
16
|
+
const {capitalize} = require('../../Utils');
|
|
17
|
+
const {serializePojo} = require('./serializePojo');
|
|
18
|
+
|
|
19
|
+
type FilesOutput = Map<string, string>;
|
|
20
|
+
|
|
21
|
+
module.exports = {
|
|
22
|
+
generate(
|
|
23
|
+
libraryName: string,
|
|
24
|
+
schema: SchemaType,
|
|
25
|
+
packageName?: string,
|
|
26
|
+
): FilesOutput {
|
|
27
|
+
const pojoCollector = new PojoCollector();
|
|
28
|
+
const basePackageName = 'com.facebook.react.viewmanagers';
|
|
29
|
+
|
|
30
|
+
Object.keys(schema.modules).forEach(hasteModuleName => {
|
|
31
|
+
const module = schema.modules[hasteModuleName];
|
|
32
|
+
if (module.type !== 'Component') {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const {components} = module;
|
|
37
|
+
// No components in this module
|
|
38
|
+
if (components == null) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
Object.keys(components)
|
|
43
|
+
.filter(componentName => {
|
|
44
|
+
const component = components[componentName];
|
|
45
|
+
return !(
|
|
46
|
+
component.excludedPlatforms &&
|
|
47
|
+
component.excludedPlatforms.includes('android')
|
|
48
|
+
);
|
|
49
|
+
})
|
|
50
|
+
.forEach(componentName => {
|
|
51
|
+
const component = components[componentName];
|
|
52
|
+
if (component == null) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const {props} = component;
|
|
57
|
+
|
|
58
|
+
pojoCollector.process(
|
|
59
|
+
capitalize(hasteModuleName),
|
|
60
|
+
`${capitalize(componentName)}Props`,
|
|
61
|
+
{
|
|
62
|
+
type: 'ObjectTypeAnnotation',
|
|
63
|
+
properties: props,
|
|
64
|
+
},
|
|
65
|
+
);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
const pojoDir = basePackageName.split('.').join('/');
|
|
70
|
+
|
|
71
|
+
return new Map(
|
|
72
|
+
pojoCollector.getAllPojos().map(pojo => {
|
|
73
|
+
return [
|
|
74
|
+
`java/${pojoDir}/${pojo.namespace}/${pojo.name}.java`,
|
|
75
|
+
serializePojo(pojo, basePackageName),
|
|
76
|
+
];
|
|
77
|
+
}),
|
|
78
|
+
);
|
|
79
|
+
},
|
|
80
|
+
};
|
|
@@ -0,0 +1,273 @@
|
|
|
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('../../Utils'),
|
|
14
|
+
capitalize = _require.capitalize;
|
|
15
|
+
function toJavaType(typeAnnotation, addImport) {
|
|
16
|
+
const importNullable = () => addImport('androidx.annotation.Nullable');
|
|
17
|
+
const importReadableMap = () =>
|
|
18
|
+
addImport('com.facebook.react.bridge.ReadableMap');
|
|
19
|
+
const importArrayList = () => addImport('java.util.ArrayList');
|
|
20
|
+
switch (typeAnnotation.type) {
|
|
21
|
+
/**
|
|
22
|
+
* Primitives
|
|
23
|
+
*/
|
|
24
|
+
case 'BooleanTypeAnnotation': {
|
|
25
|
+
if (typeAnnotation.default === null) {
|
|
26
|
+
importNullable();
|
|
27
|
+
return '@Nullable Boolean';
|
|
28
|
+
} else {
|
|
29
|
+
return 'boolean';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
case 'StringTypeAnnotation': {
|
|
33
|
+
importNullable();
|
|
34
|
+
return '@Nullable String';
|
|
35
|
+
}
|
|
36
|
+
case 'DoubleTypeAnnotation': {
|
|
37
|
+
return 'double';
|
|
38
|
+
}
|
|
39
|
+
case 'FloatTypeAnnotation': {
|
|
40
|
+
if (typeAnnotation.default === null) {
|
|
41
|
+
importNullable();
|
|
42
|
+
return '@Nullable Float';
|
|
43
|
+
} else {
|
|
44
|
+
return 'float';
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
case 'Int32TypeAnnotation': {
|
|
48
|
+
return 'int';
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Enums
|
|
53
|
+
*/
|
|
54
|
+
// TODO: Make StringEnumTypeAnnotation type-safe?
|
|
55
|
+
case 'StringEnumTypeAnnotation':
|
|
56
|
+
importNullable();
|
|
57
|
+
return '@Nullable String';
|
|
58
|
+
// TODO: Make Int32EnumTypeAnnotation type-safe?
|
|
59
|
+
case 'Int32EnumTypeAnnotation':
|
|
60
|
+
importNullable();
|
|
61
|
+
return '@Nullable Integer';
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Reserved types
|
|
65
|
+
*/
|
|
66
|
+
case 'ReservedPropTypeAnnotation': {
|
|
67
|
+
switch (typeAnnotation.name) {
|
|
68
|
+
case 'ColorPrimitive':
|
|
69
|
+
importNullable();
|
|
70
|
+
return '@Nullable Integer';
|
|
71
|
+
|
|
72
|
+
// TODO: Make ImageSourcePrimitive type-safe
|
|
73
|
+
case 'ImageSourcePrimitive':
|
|
74
|
+
importNullable();
|
|
75
|
+
importReadableMap();
|
|
76
|
+
return '@Nullable ReadableMap';
|
|
77
|
+
|
|
78
|
+
// TODO: Make ImageRequestPrimitive type-safe
|
|
79
|
+
case 'ImageRequestPrimitive':
|
|
80
|
+
importNullable();
|
|
81
|
+
importReadableMap();
|
|
82
|
+
return '@Nullable ReadableMap';
|
|
83
|
+
|
|
84
|
+
// TODO: Make PointPrimitive type-safe
|
|
85
|
+
case 'PointPrimitive':
|
|
86
|
+
importNullable();
|
|
87
|
+
importReadableMap();
|
|
88
|
+
return '@Nullable ReadableMap';
|
|
89
|
+
|
|
90
|
+
// TODO: Make EdgeInsetsPrimitive type-safe
|
|
91
|
+
case 'EdgeInsetsPrimitive':
|
|
92
|
+
importNullable();
|
|
93
|
+
importReadableMap();
|
|
94
|
+
return '@Nullable ReadableMap';
|
|
95
|
+
default:
|
|
96
|
+
typeAnnotation.name;
|
|
97
|
+
throw new Error(
|
|
98
|
+
`Received unknown ReservedPropTypeAnnotation ${typeAnnotation.name}`,
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Other Pojo objects
|
|
105
|
+
*/
|
|
106
|
+
case 'PojoTypeAliasTypeAnnotation': {
|
|
107
|
+
return typeAnnotation.name;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Arrays
|
|
112
|
+
*/
|
|
113
|
+
case 'ArrayTypeAnnotation': {
|
|
114
|
+
const elementType = typeAnnotation.elementType;
|
|
115
|
+
const elementTypeString = (() => {
|
|
116
|
+
switch (elementType.type) {
|
|
117
|
+
/**
|
|
118
|
+
* Primitives
|
|
119
|
+
*/
|
|
120
|
+
case 'BooleanTypeAnnotation': {
|
|
121
|
+
return 'Boolean';
|
|
122
|
+
}
|
|
123
|
+
case 'StringTypeAnnotation': {
|
|
124
|
+
return 'String';
|
|
125
|
+
}
|
|
126
|
+
case 'DoubleTypeAnnotation': {
|
|
127
|
+
return 'Double';
|
|
128
|
+
}
|
|
129
|
+
case 'FloatTypeAnnotation': {
|
|
130
|
+
return 'Float';
|
|
131
|
+
}
|
|
132
|
+
case 'Int32TypeAnnotation': {
|
|
133
|
+
return 'Integer';
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Enums
|
|
138
|
+
*/
|
|
139
|
+
// TODO: Make StringEnums type-safe in Pojos
|
|
140
|
+
case 'StringEnumTypeAnnotation': {
|
|
141
|
+
return 'String';
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Other Pojo objects
|
|
146
|
+
*/
|
|
147
|
+
case 'PojoTypeAliasTypeAnnotation': {
|
|
148
|
+
return elementType.name;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Reserved types
|
|
153
|
+
*/
|
|
154
|
+
case 'ReservedPropTypeAnnotation': {
|
|
155
|
+
switch (elementType.name) {
|
|
156
|
+
case 'ColorPrimitive':
|
|
157
|
+
return 'Integer';
|
|
158
|
+
|
|
159
|
+
// TODO: Make ImageSourcePrimitive type-safe
|
|
160
|
+
case 'ImageSourcePrimitive':
|
|
161
|
+
importReadableMap();
|
|
162
|
+
return 'ReadableMap';
|
|
163
|
+
|
|
164
|
+
// TODO: Make ImageRequestPrimitive type-safe
|
|
165
|
+
case 'ImageRequestPrimitive':
|
|
166
|
+
importReadableMap();
|
|
167
|
+
return 'ReadableMap';
|
|
168
|
+
|
|
169
|
+
// TODO: Make PointPrimitive type-safe
|
|
170
|
+
case 'PointPrimitive':
|
|
171
|
+
importReadableMap();
|
|
172
|
+
return 'ReadableMap';
|
|
173
|
+
|
|
174
|
+
// TODO: Make EdgeInsetsPrimitive type-safe
|
|
175
|
+
case 'EdgeInsetsPrimitive':
|
|
176
|
+
importReadableMap();
|
|
177
|
+
return 'ReadableMap';
|
|
178
|
+
default:
|
|
179
|
+
elementType.name;
|
|
180
|
+
throw new Error(
|
|
181
|
+
`Received unknown ReservedPropTypeAnnotation ${elementType.name}`,
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Arrays
|
|
187
|
+
case 'ArrayTypeAnnotation': {
|
|
188
|
+
const pojoTypeAliasTypeAnnotation = elementType.elementType;
|
|
189
|
+
importArrayList();
|
|
190
|
+
return `ArrayList<${pojoTypeAliasTypeAnnotation.name}>`;
|
|
191
|
+
}
|
|
192
|
+
default: {
|
|
193
|
+
elementType.type;
|
|
194
|
+
throw new Error(
|
|
195
|
+
`Unrecognized PojoTypeAnnotation Array element type annotation '${typeAnnotation.type}'`,
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
})();
|
|
200
|
+
importArrayList();
|
|
201
|
+
return `ArrayList<${elementTypeString}>`;
|
|
202
|
+
}
|
|
203
|
+
default: {
|
|
204
|
+
typeAnnotation.type;
|
|
205
|
+
throw new Error(
|
|
206
|
+
`Unrecognized PojoTypeAnnotation '${typeAnnotation.type}'`,
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
function toJavaMemberName(property) {
|
|
212
|
+
return `m${capitalize(property.name)}`;
|
|
213
|
+
}
|
|
214
|
+
function toJavaMemberDeclaration(property, addImport) {
|
|
215
|
+
const type = toJavaType(property.typeAnnotation, addImport);
|
|
216
|
+
const memberName = toJavaMemberName(property);
|
|
217
|
+
return `private ${type} ${memberName};`;
|
|
218
|
+
}
|
|
219
|
+
function toJavaGetter(property, addImport) {
|
|
220
|
+
const type = toJavaType(property.typeAnnotation, addImport);
|
|
221
|
+
const getterName = `get${capitalize(property.name)}`;
|
|
222
|
+
const memberName = toJavaMemberName(property);
|
|
223
|
+
addImport('com.facebook.proguard.annotations.DoNotStrip');
|
|
224
|
+
return `@DoNotStrip
|
|
225
|
+
public ${type} ${getterName}() {
|
|
226
|
+
return ${memberName};
|
|
227
|
+
}`;
|
|
228
|
+
}
|
|
229
|
+
function serializePojo(pojo, basePackageName) {
|
|
230
|
+
const importSet = new Set();
|
|
231
|
+
const addImport = $import => {
|
|
232
|
+
importSet.add($import);
|
|
233
|
+
};
|
|
234
|
+
addImport('com.facebook.proguard.annotations.DoNotStrip');
|
|
235
|
+
const indent = ' '.repeat(2);
|
|
236
|
+
const members = pojo.properties
|
|
237
|
+
.map(property => toJavaMemberDeclaration(property, addImport))
|
|
238
|
+
.map(member => `${indent}${member}`)
|
|
239
|
+
.join('\n');
|
|
240
|
+
const getters = pojo.properties
|
|
241
|
+
.map(property => toJavaGetter(property, addImport))
|
|
242
|
+
.map(getter =>
|
|
243
|
+
getter
|
|
244
|
+
.split('\n')
|
|
245
|
+
.map(line => `${indent}${line}`)
|
|
246
|
+
.join('\n'),
|
|
247
|
+
)
|
|
248
|
+
.join('\n');
|
|
249
|
+
const imports = [...importSet]
|
|
250
|
+
.map($import => `import ${$import};`)
|
|
251
|
+
.sort()
|
|
252
|
+
.join('\n');
|
|
253
|
+
return `/**
|
|
254
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
255
|
+
*
|
|
256
|
+
* This source code is licensed under the MIT license found in the
|
|
257
|
+
* LICENSE file in the root directory of this source tree.
|
|
258
|
+
*
|
|
259
|
+
* ${'@'}generated by codegen project: GeneratePropsJavaPojo.js
|
|
260
|
+
*/
|
|
261
|
+
|
|
262
|
+
package ${basePackageName}.${pojo.namespace};
|
|
263
|
+
${imports === '' ? '' : `\n${imports}\n`}
|
|
264
|
+
@DoNotStrip
|
|
265
|
+
public class ${pojo.name} {
|
|
266
|
+
${members}
|
|
267
|
+
${getters}
|
|
268
|
+
}
|
|
269
|
+
`;
|
|
270
|
+
}
|
|
271
|
+
module.exports = {
|
|
272
|
+
serializePojo,
|
|
273
|
+
};
|