@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,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
+ * @flow strict
8
+ * @format
9
+ */
10
+
11
+ 'use strict';
12
+ import type {EventTypeShape} from '../../CodegenSchema';
13
+
14
+ const {generateEventStructName} = require('./CppHelpers.js');
15
+
16
+ import type {
17
+ ComponentShape,
18
+ NamedShape,
19
+ EventTypeAnnotation,
20
+ SchemaType,
21
+ } from '../../CodegenSchema';
22
+
23
+ // File path -> contents
24
+ type FilesOutput = Map<string, string>;
25
+
26
+ type ComponentCollection = $ReadOnly<{
27
+ [component: string]: ComponentShape,
28
+ ...
29
+ }>;
30
+
31
+ const FileTemplate = ({
32
+ events,
33
+ libraryName,
34
+ }: {
35
+ events: string,
36
+ libraryName: string,
37
+ }) => `
38
+ /**
39
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
40
+ *
41
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
42
+ * once the code is regenerated.
43
+ *
44
+ * ${'@'}generated by codegen project: GenerateEventEmitterCpp.js
45
+ */
46
+
47
+ #include <react/renderer/components/${libraryName}/EventEmitters.h>
48
+
49
+ namespace facebook {
50
+ namespace react {
51
+
52
+ ${events}
53
+
54
+ } // namespace react
55
+ } // namespace facebook
56
+ `;
57
+
58
+ const ComponentTemplate = ({
59
+ className,
60
+ eventName,
61
+ structName,
62
+ dispatchEventName,
63
+ implementation,
64
+ }: {
65
+ className: string,
66
+ eventName: string,
67
+ structName: string,
68
+ dispatchEventName: string,
69
+ implementation: string,
70
+ }) =>
71
+ `
72
+ void ${className}EventEmitter::${eventName}(${structName} event) const {
73
+ dispatchEvent("${dispatchEventName}", [event=std::move(event)](jsi::Runtime &runtime) {
74
+ ${implementation}
75
+ });
76
+ }
77
+ `.trim();
78
+
79
+ const BasicComponentTemplate = ({
80
+ className,
81
+ eventName,
82
+ dispatchEventName,
83
+ }: {
84
+ className: string,
85
+ eventName: string,
86
+ dispatchEventName: string,
87
+ }) =>
88
+ `
89
+ void ${className}EventEmitter::${eventName}() const {
90
+ dispatchEvent("${dispatchEventName}");
91
+ }
92
+ `.trim();
93
+
94
+ function generateSetter(
95
+ variableName: string,
96
+ propertyName: string,
97
+ propertyParts: $ReadOnlyArray<string>,
98
+ ) {
99
+ const trailingPeriod = propertyParts.length === 0 ? '' : '.';
100
+ const eventChain = `event.${propertyParts.join(
101
+ '.',
102
+ )}${trailingPeriod}${propertyName});`;
103
+
104
+ return `${variableName}.setProperty(runtime, "${propertyName}", ${eventChain}`;
105
+ }
106
+
107
+ function generateEnumSetter(
108
+ variableName: string,
109
+ propertyName: string,
110
+ propertyParts: $ReadOnlyArray<string>,
111
+ ) {
112
+ const trailingPeriod = propertyParts.length === 0 ? '' : '.';
113
+ const eventChain = `event.${propertyParts.join(
114
+ '.',
115
+ )}${trailingPeriod}${propertyName})`;
116
+
117
+ return `${variableName}.setProperty(runtime, "${propertyName}", toString(${eventChain});`;
118
+ }
119
+
120
+ function generateSetters(
121
+ parentPropertyName: string,
122
+ properties: $ReadOnlyArray<NamedShape<EventTypeAnnotation>>,
123
+ propertyParts: $ReadOnlyArray<string>,
124
+ ): string {
125
+ const propSetters = properties
126
+ .map(eventProperty => {
127
+ const {typeAnnotation} = eventProperty;
128
+ switch (typeAnnotation.type) {
129
+ case 'BooleanTypeAnnotation':
130
+ return generateSetter(
131
+ parentPropertyName,
132
+ eventProperty.name,
133
+ propertyParts,
134
+ );
135
+ case 'StringTypeAnnotation':
136
+ return generateSetter(
137
+ parentPropertyName,
138
+ eventProperty.name,
139
+ propertyParts,
140
+ );
141
+ case 'Int32TypeAnnotation':
142
+ return generateSetter(
143
+ parentPropertyName,
144
+ eventProperty.name,
145
+ propertyParts,
146
+ );
147
+ case 'DoubleTypeAnnotation':
148
+ return generateSetter(
149
+ parentPropertyName,
150
+ eventProperty.name,
151
+ propertyParts,
152
+ );
153
+ case 'FloatTypeAnnotation':
154
+ return generateSetter(
155
+ parentPropertyName,
156
+ eventProperty.name,
157
+ propertyParts,
158
+ );
159
+ case 'StringEnumTypeAnnotation':
160
+ return generateEnumSetter(
161
+ parentPropertyName,
162
+ eventProperty.name,
163
+ propertyParts,
164
+ );
165
+ case 'ObjectTypeAnnotation':
166
+ const propertyName = eventProperty.name;
167
+ return `
168
+ {
169
+ auto ${propertyName} = jsi::Object(runtime);
170
+ ${generateSetters(
171
+ propertyName,
172
+ typeAnnotation.properties,
173
+ propertyParts.concat([propertyName]),
174
+ )}
175
+
176
+ ${parentPropertyName}.setProperty(runtime, "${propertyName}", ${propertyName});
177
+ }
178
+ `.trim();
179
+ default:
180
+ (typeAnnotation.type: empty);
181
+ throw new Error('Received invalid event property type');
182
+ }
183
+ })
184
+ .join('\n');
185
+
186
+ return propSetters;
187
+ }
188
+
189
+ function generateEvent(componentName: string, event: EventTypeShape): string {
190
+ // This is a gross hack necessary because native code is sending
191
+ // events named things like topChange to JS which is then converted back to
192
+ // call the onChange prop. We should be consistent throughout the system.
193
+ // In order to migrate to this new system we have to support the current
194
+ // naming scheme. We should delete this once we are able to control this name
195
+ // throughout the system.
196
+ const dispatchEventName = `${event.name[2].toLowerCase()}${event.name.slice(
197
+ 3,
198
+ )}`;
199
+
200
+ if (event.typeAnnotation.argument) {
201
+ const implementation = `
202
+ auto payload = jsi::Object(runtime);
203
+ ${generateSetters('payload', event.typeAnnotation.argument.properties, [])}
204
+ return payload;
205
+ `.trim();
206
+
207
+ if (!event.name.startsWith('on')) {
208
+ throw new Error('Expected the event name to start with `on`');
209
+ }
210
+
211
+ return ComponentTemplate({
212
+ className: componentName,
213
+ eventName: event.name,
214
+ dispatchEventName,
215
+ structName: generateEventStructName([event.name]),
216
+ implementation,
217
+ });
218
+ }
219
+
220
+ return BasicComponentTemplate({
221
+ className: componentName,
222
+ eventName: event.name,
223
+ dispatchEventName,
224
+ });
225
+ }
226
+
227
+ module.exports = {
228
+ generate(
229
+ libraryName: string,
230
+ schema: SchemaType,
231
+ packageName?: string,
232
+ assumeNonnull: boolean = false,
233
+ ): FilesOutput {
234
+ const moduleComponents: ComponentCollection = Object.keys(schema.modules)
235
+ .map(moduleName => {
236
+ const module = schema.modules[moduleName];
237
+ if (module.type !== 'Component') {
238
+ return;
239
+ }
240
+
241
+ const {components} = module;
242
+ // No components in this module
243
+ if (components == null) {
244
+ return null;
245
+ }
246
+
247
+ return components;
248
+ })
249
+ .filter(Boolean)
250
+ .reduce((acc, components) => Object.assign(acc, components), {});
251
+
252
+ const fileName = 'EventEmitters.cpp';
253
+
254
+ const componentEmitters = Object.keys(moduleComponents)
255
+ .map(componentName => {
256
+ const component = moduleComponents[componentName];
257
+
258
+ return component.events
259
+ .map(event => {
260
+ return generateEvent(componentName, event);
261
+ })
262
+ .join('\n');
263
+ })
264
+ .join('\n');
265
+
266
+ const replacedTemplate = FileTemplate({
267
+ libraryName,
268
+ events: componentEmitters,
269
+ });
270
+
271
+ return new Map([[fileName, replacedTemplate]]);
272
+ },
273
+ };
@@ -0,0 +1,224 @@
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 nullthrows = require('nullthrows');
14
+ const _require = require('./CppHelpers'),
15
+ getCppTypeForAnnotation = _require.getCppTypeForAnnotation,
16
+ toSafeCppString = _require.toSafeCppString,
17
+ generateEventStructName = _require.generateEventStructName;
18
+ const _require2 = require('../Utils'),
19
+ indent = _require2.indent;
20
+ const FileTemplate = ({componentEmitters}) => `
21
+ /**
22
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
23
+ *
24
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
25
+ * once the code is regenerated.
26
+ *
27
+ * ${'@'}generated by codegen project: GenerateEventEmitterH.js
28
+ */
29
+ #pragma once
30
+
31
+ #include <react/renderer/components/view/ViewEventEmitter.h>
32
+ #include <jsi/jsi.h>
33
+
34
+ namespace facebook {
35
+ namespace react {
36
+
37
+ ${componentEmitters}
38
+
39
+ } // namespace react
40
+ } // namespace facebook
41
+ `;
42
+ const ComponentTemplate = ({className, structs, events}) =>
43
+ `
44
+ class JSI_EXPORT ${className}EventEmitter : public ViewEventEmitter {
45
+ public:
46
+ using ViewEventEmitter::ViewEventEmitter;
47
+
48
+ ${structs}
49
+
50
+ ${events}
51
+ };
52
+ `.trim();
53
+ const StructTemplate = ({structName, fields}) =>
54
+ `
55
+ struct ${structName} {
56
+ ${fields}
57
+ };
58
+ `.trim();
59
+ const EnumTemplate = ({enumName, values, toCases}) =>
60
+ `enum class ${enumName} {
61
+ ${values}
62
+ };
63
+
64
+ static char const *toString(const ${enumName} value) {
65
+ switch (value) {
66
+ ${toCases}
67
+ }
68
+ }
69
+ `.trim();
70
+ function getNativeTypeFromAnnotation(componentName, eventProperty, nameParts) {
71
+ const type = eventProperty.typeAnnotation.type;
72
+ switch (type) {
73
+ case 'BooleanTypeAnnotation':
74
+ case 'StringTypeAnnotation':
75
+ case 'Int32TypeAnnotation':
76
+ case 'DoubleTypeAnnotation':
77
+ case 'FloatTypeAnnotation':
78
+ return getCppTypeForAnnotation(type);
79
+ case 'StringEnumTypeAnnotation':
80
+ return generateEventStructName(nameParts.concat([eventProperty.name]));
81
+ case 'ObjectTypeAnnotation':
82
+ return generateEventStructName(nameParts.concat([eventProperty.name]));
83
+ default:
84
+ type;
85
+ throw new Error(`Received invalid event property type ${type}`);
86
+ }
87
+ }
88
+ function generateEnum(structs, options, nameParts) {
89
+ const structName = generateEventStructName(nameParts);
90
+ const fields = options
91
+ .map((option, index) => `${toSafeCppString(option)}`)
92
+ .join(',\n ');
93
+ const toCases = options
94
+ .map(
95
+ option =>
96
+ `case ${structName}::${toSafeCppString(option)}: return "${option}";`,
97
+ )
98
+ .join('\n' + ' ');
99
+ structs.set(
100
+ structName,
101
+ EnumTemplate({
102
+ enumName: structName,
103
+ values: fields,
104
+ toCases: toCases,
105
+ }),
106
+ );
107
+ }
108
+ function generateStruct(structs, componentName, nameParts, properties) {
109
+ const structNameParts = nameParts;
110
+ const structName = generateEventStructName(structNameParts);
111
+ const fields = properties
112
+ .map(property => {
113
+ return `${getNativeTypeFromAnnotation(
114
+ componentName,
115
+ property,
116
+ structNameParts,
117
+ )} ${property.name};`;
118
+ })
119
+ .join('\n' + ' ');
120
+ properties.forEach(property => {
121
+ const name = property.name,
122
+ typeAnnotation = property.typeAnnotation;
123
+ switch (typeAnnotation.type) {
124
+ case 'BooleanTypeAnnotation':
125
+ return;
126
+ case 'StringTypeAnnotation':
127
+ return;
128
+ case 'Int32TypeAnnotation':
129
+ return;
130
+ case 'DoubleTypeAnnotation':
131
+ return;
132
+ case 'FloatTypeAnnotation':
133
+ return;
134
+ case 'ObjectTypeAnnotation':
135
+ generateStruct(
136
+ structs,
137
+ componentName,
138
+ nameParts.concat([name]),
139
+ nullthrows(typeAnnotation.properties),
140
+ );
141
+ return;
142
+ case 'StringEnumTypeAnnotation':
143
+ generateEnum(structs, typeAnnotation.options, nameParts.concat([name]));
144
+ return;
145
+ default:
146
+ typeAnnotation.type;
147
+ throw new Error(
148
+ `Received invalid event property type ${typeAnnotation.type}`,
149
+ );
150
+ }
151
+ });
152
+ structs.set(
153
+ structName,
154
+ StructTemplate({
155
+ structName,
156
+ fields,
157
+ }),
158
+ );
159
+ }
160
+ function generateStructs(componentName, component) {
161
+ const structs = new Map();
162
+ component.events.forEach(event => {
163
+ if (event.typeAnnotation.argument) {
164
+ generateStruct(
165
+ structs,
166
+ componentName,
167
+ [event.name],
168
+ event.typeAnnotation.argument.properties,
169
+ );
170
+ }
171
+ });
172
+ return Array.from(structs.values()).join('\n\n');
173
+ }
174
+ function generateEvent(componentName, event) {
175
+ if (event.typeAnnotation.argument) {
176
+ const structName = generateEventStructName([event.name]);
177
+ return `void ${event.name}(${structName} value) const;`;
178
+ }
179
+ return `void ${event.name}() const;`;
180
+ }
181
+ function generateEvents(componentName, component) {
182
+ return component.events
183
+ .map(event => generateEvent(componentName, event))
184
+ .join('\n\n' + ' ');
185
+ }
186
+ module.exports = {
187
+ generate(libraryName, schema, packageName, assumeNonnull = false) {
188
+ const moduleComponents = Object.keys(schema.modules)
189
+ .map(moduleName => {
190
+ const module = schema.modules[moduleName];
191
+ if (module.type !== 'Component') {
192
+ return;
193
+ }
194
+ const components = module.components;
195
+ // No components in this module
196
+ if (components == null) {
197
+ return null;
198
+ }
199
+ return components;
200
+ })
201
+ .filter(Boolean)
202
+ .reduce((acc, components) => Object.assign(acc, components), {});
203
+ const moduleComponentsWithEvents = Object.keys(moduleComponents);
204
+ const fileName = 'EventEmitters.h';
205
+ const componentEmitters =
206
+ moduleComponentsWithEvents.length > 0
207
+ ? Object.keys(moduleComponents)
208
+ .map(componentName => {
209
+ const component = moduleComponents[componentName];
210
+ const replacedTemplate = ComponentTemplate({
211
+ className: componentName,
212
+ structs: indent(generateStructs(componentName, component), 2),
213
+ events: generateEvents(componentName, component),
214
+ });
215
+ return replacedTemplate;
216
+ })
217
+ .join('\n')
218
+ : '';
219
+ const replacedTemplate = FileTemplate({
220
+ componentEmitters,
221
+ });
222
+ return new Map([[fileName, replacedTemplate]]);
223
+ },
224
+ };