@react-native/codegen 0.72.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/README.md +21 -0
  2. package/lib/CodegenSchema.js +11 -0
  3. package/lib/CodegenSchema.js.flow +351 -0
  4. package/lib/SchemaValidator.js +54 -0
  5. package/lib/SchemaValidator.js.flow +67 -0
  6. package/lib/cli/combine/combine-js-to-schema-cli.js +50 -0
  7. package/lib/cli/combine/combine-js-to-schema-cli.js.flow +49 -0
  8. package/lib/cli/combine/combine-js-to-schema.js +110 -0
  9. package/lib/cli/combine/combine-js-to-schema.js.flow +48 -0
  10. package/lib/cli/combine/combine-utils.js +118 -0
  11. package/lib/cli/combine/combine-utils.js.flow +85 -0
  12. package/lib/cli/generators/generate-all.js +65 -0
  13. package/lib/cli/generators/generate-all.js.flow +66 -0
  14. package/lib/cli/parser/parser-cli.js +55 -0
  15. package/lib/cli/parser/parser-cli.js.flow +18 -0
  16. package/lib/cli/parser/parser.js +35 -0
  17. package/lib/cli/parser/parser.js.flow +37 -0
  18. package/lib/cli/parser/parser.sh +15 -0
  19. package/lib/generators/RNCodegen.js +207 -0
  20. package/lib/generators/RNCodegen.js.flow +284 -0
  21. package/lib/generators/Utils.js +31 -0
  22. package/lib/generators/Utils.js.flow +33 -0
  23. package/lib/generators/__test_fixtures__/fixtures.js +79 -0
  24. package/lib/generators/__test_fixtures__/fixtures.js.flow +82 -0
  25. package/lib/generators/components/ComponentsGeneratorUtils.js +217 -0
  26. package/lib/generators/components/ComponentsGeneratorUtils.js.flow +304 -0
  27. package/lib/generators/components/CppHelpers.js +188 -0
  28. package/lib/generators/components/CppHelpers.js.flow +228 -0
  29. package/lib/generators/components/GenerateComponentDescriptorH.js +75 -0
  30. package/lib/generators/components/GenerateComponentDescriptorH.js.flow +95 -0
  31. package/lib/generators/components/GenerateComponentHObjCpp.js +327 -0
  32. package/lib/generators/components/GenerateComponentHObjCpp.js.flow +418 -0
  33. package/lib/generators/components/GenerateEventEmitterCpp.js +199 -0
  34. package/lib/generators/components/GenerateEventEmitterCpp.js.flow +273 -0
  35. package/lib/generators/components/GenerateEventEmitterH.js +224 -0
  36. package/lib/generators/components/GenerateEventEmitterH.js.flow +315 -0
  37. package/lib/generators/components/GeneratePropsCpp.js +126 -0
  38. package/lib/generators/components/GeneratePropsCpp.js.flow +161 -0
  39. package/lib/generators/components/GeneratePropsH.js +606 -0
  40. package/lib/generators/components/GeneratePropsH.js.flow +778 -0
  41. package/lib/generators/components/GeneratePropsJavaDelegate.js +287 -0
  42. package/lib/generators/components/GeneratePropsJavaDelegate.js.flow +348 -0
  43. package/lib/generators/components/GeneratePropsJavaInterface.js +237 -0
  44. package/lib/generators/components/GeneratePropsJavaInterface.js.flow +288 -0
  45. package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js +157 -0
  46. package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js.flow +187 -0
  47. package/lib/generators/components/GeneratePropsJavaPojo/index.js +66 -0
  48. package/lib/generators/components/GeneratePropsJavaPojo/index.js.flow +80 -0
  49. package/lib/generators/components/GeneratePropsJavaPojo/serializePojo.js +273 -0
  50. package/lib/generators/components/GeneratePropsJavaPojo/serializePojo.js.flow +296 -0
  51. package/lib/generators/components/GenerateShadowNodeCpp.js +73 -0
  52. package/lib/generators/components/GenerateShadowNodeCpp.js.flow +95 -0
  53. package/lib/generators/components/GenerateShadowNodeH.js +91 -0
  54. package/lib/generators/components/GenerateShadowNodeH.js.flow +124 -0
  55. package/lib/generators/components/GenerateStateCpp.js +70 -0
  56. package/lib/generators/components/GenerateStateCpp.js.flow +92 -0
  57. package/lib/generators/components/GenerateStateH.js +93 -0
  58. package/lib/generators/components/GenerateStateH.js.flow +111 -0
  59. package/lib/generators/components/GenerateTests.js +165 -0
  60. package/lib/generators/components/GenerateTests.js.flow +219 -0
  61. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js +91 -0
  62. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js.flow +107 -0
  63. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js +89 -0
  64. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js.flow +105 -0
  65. package/lib/generators/components/GenerateViewConfigJs.js +410 -0
  66. package/lib/generators/components/GenerateViewConfigJs.js.flow +484 -0
  67. package/lib/generators/components/JavaHelpers.js +87 -0
  68. package/lib/generators/components/JavaHelpers.js.flow +119 -0
  69. package/lib/generators/components/__test_fixtures__/fixtures.js +1641 -0
  70. package/lib/generators/components/__test_fixtures__/fixtures.js.flow +1672 -0
  71. package/lib/generators/modules/GenerateModuleCpp.js +299 -0
  72. package/lib/generators/modules/GenerateModuleCpp.js.flow +278 -0
  73. package/lib/generators/modules/GenerateModuleH.js +373 -0
  74. package/lib/generators/modules/GenerateModuleH.js.flow +355 -0
  75. package/lib/generators/modules/GenerateModuleJavaSpec.js +571 -0
  76. package/lib/generators/modules/GenerateModuleJavaSpec.js.flow +553 -0
  77. package/lib/generators/modules/GenerateModuleJniCpp.js +505 -0
  78. package/lib/generators/modules/GenerateModuleJniCpp.js.flow +523 -0
  79. package/lib/generators/modules/GenerateModuleJniH.js +138 -0
  80. package/lib/generators/modules/GenerateModuleJniH.js.flow +148 -0
  81. package/lib/generators/modules/GenerateModuleObjCpp/StructCollector.js +262 -0
  82. package/lib/generators/modules/GenerateModuleObjCpp/StructCollector.js.flow +208 -0
  83. package/lib/generators/modules/GenerateModuleObjCpp/Utils.js +25 -0
  84. package/lib/generators/modules/GenerateModuleObjCpp/Utils.js.flow +32 -0
  85. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js +337 -0
  86. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js.flow +288 -0
  87. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js +330 -0
  88. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js.flow +279 -0
  89. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeStruct.js +25 -0
  90. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeStruct.js.flow +35 -0
  91. package/lib/generators/modules/GenerateModuleObjCpp/index.js +185 -0
  92. package/lib/generators/modules/GenerateModuleObjCpp/index.js.flow +219 -0
  93. package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js +529 -0
  94. package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js.flow +510 -0
  95. package/lib/generators/modules/GenerateModuleObjCpp/source/serializeModule.js +96 -0
  96. package/lib/generators/modules/GenerateModuleObjCpp/source/serializeModule.js.flow +121 -0
  97. package/lib/generators/modules/Utils.js +34 -0
  98. package/lib/generators/modules/Utils.js.flow +53 -0
  99. package/lib/generators/modules/__test_fixtures__/fixtures.js +1658 -0
  100. package/lib/generators/modules/__test_fixtures__/fixtures.js.flow +1669 -0
  101. package/lib/parsers/consistency/compareSnaps.js +84 -0
  102. package/lib/parsers/error-utils.js +284 -0
  103. package/lib/parsers/error-utils.js.flow +295 -0
  104. package/lib/parsers/errors.js +350 -0
  105. package/lib/parsers/errors.js.flow +439 -0
  106. package/lib/parsers/flow/components/__test_fixtures__/failures.js +583 -0
  107. package/lib/parsers/flow/components/__test_fixtures__/failures.js.flow +600 -0
  108. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js +1001 -0
  109. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js.flow +1016 -0
  110. package/lib/parsers/flow/components/commands.js +104 -0
  111. package/lib/parsers/flow/components/commands.js.flow +123 -0
  112. package/lib/parsers/flow/components/componentsUtils.js +446 -0
  113. package/lib/parsers/flow/components/componentsUtils.js.flow +496 -0
  114. package/lib/parsers/flow/components/events.js +233 -0
  115. package/lib/parsers/flow/components/events.js.flow +262 -0
  116. package/lib/parsers/flow/components/extends.js +52 -0
  117. package/lib/parsers/flow/components/extends.js.flow +66 -0
  118. package/lib/parsers/flow/components/index.js +267 -0
  119. package/lib/parsers/flow/components/index.js.flow +226 -0
  120. package/lib/parsers/flow/components/options.js +72 -0
  121. package/lib/parsers/flow/components/options.js.flow +87 -0
  122. package/lib/parsers/flow/components/props.js +47 -0
  123. package/lib/parsers/flow/components/props.js.flow +60 -0
  124. package/lib/parsers/flow/components/schema.js +106 -0
  125. package/lib/parsers/flow/components/schema.js.flow +62 -0
  126. package/lib/parsers/flow/index.js +80 -0
  127. package/lib/parsers/flow/index.js.flow +85 -0
  128. package/lib/parsers/flow/modules/__test_fixtures__/failures.js +215 -0
  129. package/lib/parsers/flow/modules/__test_fixtures__/failures.js.flow +223 -0
  130. package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js +724 -0
  131. package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js.flow +747 -0
  132. package/lib/parsers/flow/modules/index.js +528 -0
  133. package/lib/parsers/flow/modules/index.js.flow +420 -0
  134. package/lib/parsers/flow/parser.js +109 -0
  135. package/lib/parsers/flow/parser.js.flow +83 -0
  136. package/lib/parsers/flow/utils.js +108 -0
  137. package/lib/parsers/flow/utils.js.flow +123 -0
  138. package/lib/parsers/parser.js +11 -0
  139. package/lib/parsers/parser.js.flow +70 -0
  140. package/lib/parsers/parserMock.js +96 -0
  141. package/lib/parsers/parserMock.js.flow +68 -0
  142. package/lib/parsers/parsers-commons.js +448 -0
  143. package/lib/parsers/parsers-commons.js.flow +447 -0
  144. package/lib/parsers/parsers-primitives.js +387 -0
  145. package/lib/parsers/parsers-primitives.js.flow +383 -0
  146. package/lib/parsers/parsers-utils.js +18 -0
  147. package/lib/parsers/parsers-utils.js.flow +19 -0
  148. package/lib/parsers/schema/index.js +23 -0
  149. package/lib/parsers/schema/index.js.flow +26 -0
  150. package/lib/parsers/typescript/components/__test_fixtures__/failures.js +489 -0
  151. package/lib/parsers/typescript/components/__test_fixtures__/failures.js.flow +505 -0
  152. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js +1151 -0
  153. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js.flow +1168 -0
  154. package/lib/parsers/typescript/components/commands.js +132 -0
  155. package/lib/parsers/typescript/components/commands.js.flow +151 -0
  156. package/lib/parsers/typescript/components/componentsUtils.js +471 -0
  157. package/lib/parsers/typescript/components/componentsUtils.js.flow +521 -0
  158. package/lib/parsers/typescript/components/events.js +240 -0
  159. package/lib/parsers/typescript/components/events.js.flow +262 -0
  160. package/lib/parsers/typescript/components/extends.js +88 -0
  161. package/lib/parsers/typescript/components/extends.js.flow +103 -0
  162. package/lib/parsers/typescript/components/index.js +277 -0
  163. package/lib/parsers/typescript/components/index.js.flow +239 -0
  164. package/lib/parsers/typescript/components/options.js +72 -0
  165. package/lib/parsers/typescript/components/options.js.flow +87 -0
  166. package/lib/parsers/typescript/components/props.js +39 -0
  167. package/lib/parsers/typescript/components/props.js.flow +48 -0
  168. package/lib/parsers/typescript/components/schema.js +106 -0
  169. package/lib/parsers/typescript/components/schema.js.flow +62 -0
  170. package/lib/parsers/typescript/index.js +85 -0
  171. package/lib/parsers/typescript/index.js.flow +94 -0
  172. package/lib/parsers/typescript/modules/__test_fixtures__/failures.js +160 -0
  173. package/lib/parsers/typescript/modules/__test_fixtures__/failures.js.flow +167 -0
  174. package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js +701 -0
  175. package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js.flow +727 -0
  176. package/lib/parsers/typescript/modules/index.js +543 -0
  177. package/lib/parsers/typescript/modules/index.js.flow +435 -0
  178. package/lib/parsers/typescript/parseTopLevelType.js +203 -0
  179. package/lib/parsers/typescript/parseTopLevelType.js.flow +243 -0
  180. package/lib/parsers/typescript/parser.js +105 -0
  181. package/lib/parsers/typescript/parser.js.flow +87 -0
  182. package/lib/parsers/typescript/utils.js +101 -0
  183. package/lib/parsers/typescript/utils.js.flow +115 -0
  184. package/lib/parsers/utils.js +273 -0
  185. package/lib/parsers/utils.js.flow +266 -0
  186. package/package.json +45 -0
@@ -0,0 +1,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
+ };