@react-native-windows/codegen 0.75.0 → 0.76.0-preview.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 (41) hide show
  1. package/CHANGELOG.md +76 -10
  2. package/lib-commonjs/Cli.js +12 -1
  3. package/lib-commonjs/Cli.js.map +1 -1
  4. package/lib-commonjs/generators/AliasGen.js +1 -2
  5. package/lib-commonjs/generators/AliasGen.js.map +1 -1
  6. package/lib-commonjs/generators/AliasManaging.d.ts +3 -3
  7. package/lib-commonjs/generators/AliasManaging.js.map +1 -1
  8. package/lib-commonjs/generators/GenerateComponentWindows.d.ts +13 -0
  9. package/lib-commonjs/generators/GenerateComponentWindows.js +336 -0
  10. package/lib-commonjs/generators/GenerateComponentWindows.js.map +1 -0
  11. package/lib-commonjs/generators/GenerateNM2.js +2 -2
  12. package/lib-commonjs/generators/GenerateNM2.js.map +1 -1
  13. package/lib-commonjs/generators/GenerateTypeScript.js +1 -1
  14. package/lib-commonjs/generators/GenerateTypeScript.js.map +1 -1
  15. package/lib-commonjs/generators/ObjectTypes.d.ts +2 -2
  16. package/lib-commonjs/generators/ObjectTypes.js +3 -1
  17. package/lib-commonjs/generators/ObjectTypes.js.map +1 -1
  18. package/lib-commonjs/generators/ParamTypes.d.ts +2 -1
  19. package/lib-commonjs/generators/ParamTypes.js +46 -2
  20. package/lib-commonjs/generators/ParamTypes.js.map +1 -1
  21. package/lib-commonjs/generators/PropObjectTypes.d.ts +18 -0
  22. package/lib-commonjs/generators/PropObjectTypes.js +217 -0
  23. package/lib-commonjs/generators/PropObjectTypes.js.map +1 -0
  24. package/lib-commonjs/generators/ValidateMethods.d.ts +6 -1
  25. package/lib-commonjs/generators/ValidateMethods.js +30 -2
  26. package/lib-commonjs/generators/ValidateMethods.js.map +1 -1
  27. package/lib-commonjs/index.d.ts +3 -1
  28. package/lib-commonjs/index.js +16 -13
  29. package/lib-commonjs/index.js.map +1 -1
  30. package/package.json +8 -8
  31. package/src/Cli.ts +12 -1
  32. package/src/generators/AliasGen.ts +1 -1
  33. package/src/generators/AliasManaging.ts +12 -12
  34. package/src/generators/GenerateComponentWindows.ts +392 -0
  35. package/src/generators/GenerateNM2.ts +2 -2
  36. package/src/generators/GenerateTypeScript.ts +3 -2
  37. package/src/generators/ObjectTypes.ts +5 -2
  38. package/src/generators/ParamTypes.ts +90 -3
  39. package/src/generators/PropObjectTypes.ts +233 -0
  40. package/src/generators/ValidateMethods.ts +86 -5
  41. package/src/index.ts +25 -2
@@ -10,10 +10,13 @@ import type {
10
10
  NamedShape,
11
11
  NativeModuleArrayTypeAnnotation,
12
12
  NativeModuleBaseTypeAnnotation,
13
+ NativeModuleEventEmitterBaseTypeAnnotation,
14
+ NativeModuleEventEmitterTypeAnnotation,
13
15
  NativeModuleEnumDeclaration,
14
16
  NativeModuleFunctionTypeAnnotation,
15
17
  NativeModuleParamTypeAnnotation,
16
18
  NativeModuleUnionTypeAnnotation,
19
+ UnsafeAnyTypeAnnotation,
17
20
  Nullable,
18
21
  } from '@react-native/codegen/lib/CodegenSchema';
19
22
  import {
@@ -114,7 +117,7 @@ function translateArray(
114
117
  target: ParamTarget,
115
118
  options: CppCodegenOptions,
116
119
  ): string {
117
- if (param.elementType) {
120
+ if (param.elementType.type !== 'AnyTypeAnnotation') {
118
121
  switch (target) {
119
122
  case 'spec':
120
123
  case 'template':
@@ -141,8 +144,41 @@ function translateArray(
141
144
  }
142
145
  }
143
146
 
147
+ // Hopefully eventually NativeModuleEventEmitterTypeAnnotation will align better with NativeModuleParamTypeAnnotation
148
+ // and this method can be merged / replaced with translateArray
149
+ function translateEventEmitterArray(
150
+ param: {
151
+ readonly type: 'ArrayTypeAnnotation';
152
+ readonly elementType: NativeModuleEventEmitterBaseTypeAnnotation | {type: string};
153
+ },
154
+ aliases: AliasMap,
155
+ baseAliasName: string,
156
+ target: ParamTarget,
157
+ options: CppCodegenOptions,
158
+ ): string {
159
+ switch (target) {
160
+ case 'spec':
161
+ case 'template':
162
+ return `std::vector<${translateEventEmitterParam(
163
+ param.elementType as NativeModuleEventEmitterBaseTypeAnnotation,
164
+ aliases,
165
+ `${baseAliasName}_element`,
166
+ 'template',
167
+ options,
168
+ )}>`;
169
+ default:
170
+ return `std::vector<${translateEventEmitterParam(
171
+ param.elementType as NativeModuleEventEmitterBaseTypeAnnotation,
172
+ aliases,
173
+ `${baseAliasName}_element`,
174
+ 'template',
175
+ options,
176
+ )}> const &`;
177
+ }
178
+ }
179
+
144
180
  function translateParam(
145
- param: NativeModuleParamTypeAnnotation,
181
+ param: NativeModuleParamTypeAnnotation | UnsafeAnyTypeAnnotation,
146
182
  aliases: AliasMap,
147
183
  baseAliasName: string,
148
184
  target: ParamTarget,
@@ -188,13 +224,48 @@ function translateParam(
188
224
  case 'EnumDeclaration':
189
225
  case 'UnionTypeAnnotation':
190
226
  return translateUnionReturnType(param, target, options);
227
+ case 'AnyTypeAnnotation':
228
+ return decorateType('::React::JSValue', target);
229
+ default:
230
+ throw new Error(`Unhandled type in translateParam: ${paramType}`);
231
+ }
232
+ }
233
+
234
+ // Hopefully eventually NativeModuleEventEmitterTypeAnnotation will align better with NativeModuleParamTypeAnnotation
235
+ // and this method can be merged / replaced with translateParam
236
+ function translateEventEmitterParam(
237
+ param: NativeModuleEventEmitterTypeAnnotation,
238
+ aliases: AliasMap,
239
+ baseAliasName: string,
240
+ target: ParamTarget,
241
+ options: CppCodegenOptions,
242
+ ): string {
243
+ // avoid: Property 'type' does not exist on type 'never'
244
+ const paramType = param.type;
245
+ switch (param.type) {
246
+ case 'StringTypeAnnotation':
247
+ return options.cppStringType;
248
+ case 'NumberTypeAnnotation':
249
+ case 'FloatTypeAnnotation':
250
+ case 'DoubleTypeAnnotation':
251
+ return 'double';
252
+ case 'Int32TypeAnnotation':
253
+ return 'int';
254
+ case 'BooleanTypeAnnotation':
255
+ return 'bool';
256
+ case 'ArrayTypeAnnotation':
257
+ return translateEventEmitterArray(param, aliases, baseAliasName, target, options);
258
+ case 'TypeAliasTypeAnnotation':
259
+ return decorateType(getAliasCppName(param.name), target);
260
+ case 'VoidTypeAnnotation':
261
+ return 'void';
191
262
  default:
192
263
  throw new Error(`Unhandled type in translateParam: ${paramType}`);
193
264
  }
194
265
  }
195
266
 
196
267
  function translateNullableParamType(
197
- paramType: Nullable<NativeModuleParamTypeAnnotation>,
268
+ paramType: Nullable<NativeModuleParamTypeAnnotation> | UnsafeAnyTypeAnnotation,
198
269
  aliases: AliasMap,
199
270
  baseAliasName: string,
200
271
  nullableTarget: ParamTarget,
@@ -280,6 +351,22 @@ export function translateSpecArgs(
280
351
  });
281
352
  }
282
353
 
354
+ export function translateEventEmitterArgs(
355
+ params: NativeModuleEventEmitterTypeAnnotation,
356
+ aliases: AliasMap,
357
+ baseAliasName: string,
358
+ options: CppCodegenOptions,
359
+ ) {
360
+ const translatedParam = translateEventEmitterParam(
361
+ params,
362
+ aliases,
363
+ baseAliasName,
364
+ 'spec',
365
+ options,
366
+ );
367
+ return `${translatedParam}`;
368
+ }
369
+
283
370
  export function translateArgs(
284
371
  params: ReadonlyArray<NativeModuleParamShape>,
285
372
  aliases: AliasMap,
@@ -0,0 +1,233 @@
1
+ import type { PropTypeAnnotation, ObjectTypeAnnotation, EventTypeAnnotation, CommandParamTypeAnnotation } from '@react-native/codegen/lib/CodegenSchema';
2
+ import type { CppCodegenOptions } from './ObjectTypes';
3
+ import {
4
+ AliasMap,
5
+ getAnonymousAliasCppName,
6
+ } from './AliasManaging';
7
+
8
+
9
+ // eslint-disable-next-line complexity
10
+ export function translateComponentPropsFieldType(type: PropTypeAnnotation,
11
+ aliases: AliasMap<ObjectTypeAnnotation<PropTypeAnnotation>>,
12
+ baseAliasName: string,
13
+ options: CppCodegenOptions): { type: string, initializer: string, alreadySupportsOptionalOrHasDefault?: boolean } {
14
+ switch (type.type) {
15
+ case 'StringTypeAnnotation':
16
+ return { type: options.cppStringType, initializer: type.default ? `{${type.default}}` : '', alreadySupportsOptionalOrHasDefault: !!type.default };
17
+ case 'FloatTypeAnnotation':
18
+ return { type: 'float', initializer: type.default ? `{${type.default}}` : '{}', alreadySupportsOptionalOrHasDefault: !!type.default };
19
+ case 'DoubleTypeAnnotation':
20
+ return { type: 'double', initializer: type.default ? `{${type.default}}` : '{}', alreadySupportsOptionalOrHasDefault: !!type.default };
21
+ case 'Int32TypeAnnotation':
22
+ return { type: 'int32_t', initializer: type.default ? `{${type.default}}` : '{}', alreadySupportsOptionalOrHasDefault: !!type.default };
23
+ case 'BooleanTypeAnnotation':
24
+ return { type: 'bool', initializer: type.default ? `{${type.default}}` : '{}', alreadySupportsOptionalOrHasDefault: !!type.default };
25
+ case 'ArrayTypeAnnotation':
26
+
27
+ let arrayTemplateArg = '';
28
+ switch (type.elementType.type) {
29
+ case 'BooleanTypeAnnotation':
30
+ arrayTemplateArg = 'bool';
31
+ break;
32
+ case 'DoubleTypeAnnotation':
33
+ arrayTemplateArg = 'double';
34
+ break;
35
+ case 'FloatTypeAnnotation':
36
+ arrayTemplateArg = 'float';
37
+ break;
38
+ case 'Int32TypeAnnotation':
39
+ arrayTemplateArg = 'int32_t';
40
+ break;
41
+ case 'StringTypeAnnotation':
42
+ arrayTemplateArg = options.cppStringType;
43
+ break;
44
+ case 'ArrayTypeAnnotation':
45
+ const innerType = translateComponentPropsFieldType(type.elementType, aliases, baseAliasName, options);
46
+ arrayTemplateArg = `std::vector<${innerType.type}>`;
47
+ break;
48
+ case 'ObjectTypeAnnotation':
49
+ arrayTemplateArg = translateComponentPropsFieldType(type.elementType, aliases, baseAliasName, options).type;
50
+ break;
51
+ case 'ReservedPropTypeAnnotation':
52
+ switch (type.elementType.name) {
53
+ case 'ColorPrimitive':
54
+ arrayTemplateArg = 'winrt::Microsoft::ReactNative::Color';
55
+ break;
56
+ case 'DimensionPrimitive':
57
+ case 'EdgeInsetsPrimitive':
58
+ case 'ImageRequestPrimitive':
59
+ case 'ImageSourcePrimitive':
60
+ case 'PointPrimitive':
61
+ arrayTemplateArg = 'winrt::Microsoft::ReactNative::JSValue'; // TODO - better handling for these types than JSValue
62
+ break;
63
+ default:
64
+ throw new Error(`Unhandled ReservedPropTypeAnnotation type: ${type.elementType.name}`);
65
+ }
66
+ break;
67
+ case 'StringEnumTypeAnnotation':
68
+ arrayTemplateArg = options.cppStringType; // TODO - better enum type handling than just passing a string
69
+ break;
70
+ default:
71
+ throw new Error(`Unhandled type: ${type.type}`);
72
+ }
73
+
74
+ return { type: `std::vector<${arrayTemplateArg}>`, initializer: '' };
75
+ case 'ReservedPropTypeAnnotation':
76
+ switch (type.name) {
77
+ case 'ColorPrimitive':
78
+ return { type: 'winrt::Microsoft::ReactNative::Color', initializer: '{nullptr}', alreadySupportsOptionalOrHasDefault: true };
79
+ case 'DimensionPrimitive':
80
+ case 'EdgeInsetsPrimitive':
81
+ case 'ImageRequestPrimitive':
82
+ case 'ImageSourcePrimitive':
83
+ case 'PointPrimitive':
84
+ return { type: 'winrt::Microsoft::ReactNative::JSValue', initializer: '{nullptr}', alreadySupportsOptionalOrHasDefault: true }; // TODO - better handling for these types than JSValue
85
+ default:
86
+ throw new Error(`Unhandled ReservedPropTypeAnnotation type: ${type.name}`);
87
+ }
88
+ case 'ObjectTypeAnnotation': {
89
+ return { type: getAnonymousAliasCppName<ObjectTypeAnnotation<PropTypeAnnotation>>(aliases, baseAliasName, type), initializer: '' };
90
+ }
91
+ case 'MixedTypeAnnotation':
92
+ return { type: 'winrt::Microsoft::ReactNative::JSValue', initializer: '{nullptr}', alreadySupportsOptionalOrHasDefault: true };
93
+ case 'Int32EnumTypeAnnotation':
94
+ return { type: 'int32_t', initializer: '' }; // TODO - better enum type handling than just passing a string
95
+ case 'StringEnumTypeAnnotation':
96
+ return { type: options.cppStringType, initializer: '' }; // TODO - better enum type handling than just passing an int
97
+ default:
98
+ throw new Error(`Unhandled type: ${(type as any).type}`);
99
+ }
100
+ }
101
+
102
+ export function translateComponentEventType(type: EventTypeAnnotation,
103
+ aliases: AliasMap<ObjectTypeAnnotation<EventTypeAnnotation>>,
104
+ baseAliasName: string,
105
+ options: CppCodegenOptions): { type: string, initializer: string, alreadySupportsOptionalOrHasDefault?: boolean } {
106
+ switch (type.type) {
107
+ case 'StringTypeAnnotation':
108
+ return { type: options.cppStringType, initializer: '' };
109
+ case 'FloatTypeAnnotation':
110
+ return { type: 'float', initializer: '{}' };
111
+ case 'DoubleTypeAnnotation':
112
+ return { type: 'double', initializer: '{}' };
113
+ case 'Int32TypeAnnotation':
114
+ return { type: 'int32_t', initializer: '{}' };
115
+ case 'BooleanTypeAnnotation':
116
+ return { type: 'bool', initializer: '{}' };
117
+ case 'ArrayTypeAnnotation':
118
+ {
119
+ let arrayTemplateArg = '';
120
+ switch (type.elementType.type) {
121
+ case 'BooleanTypeAnnotation':
122
+ arrayTemplateArg = 'bool';
123
+ break;
124
+ case 'DoubleTypeAnnotation':
125
+ arrayTemplateArg = 'double';
126
+ break;
127
+ case 'FloatTypeAnnotation':
128
+ arrayTemplateArg = 'float';
129
+ break;
130
+ case 'Int32TypeAnnotation':
131
+ arrayTemplateArg = 'int32_t';
132
+ break;
133
+ case 'StringTypeAnnotation':
134
+ arrayTemplateArg = options.cppStringType;
135
+ break;
136
+ case 'ArrayTypeAnnotation':
137
+ const innerType = translateComponentEventType(type.elementType, aliases, baseAliasName, options);
138
+ arrayTemplateArg = `std::vector<${innerType.type}>`;
139
+ break;
140
+ case 'MixedTypeAnnotation':
141
+ arrayTemplateArg = 'winrt::Microsoft::ReactNative::JSValue';
142
+ break;
143
+ case 'ObjectTypeAnnotation':
144
+ arrayTemplateArg = translateComponentEventType(type.elementType, aliases, baseAliasName, options).type;
145
+ break;
146
+ case 'StringEnumTypeAnnotation':
147
+ arrayTemplateArg = options.cppStringType; // TODO - better enum type handling than just passing a string
148
+ break;
149
+ default:
150
+ throw new Error(`Unhandled type: ${type.type}`);
151
+ }
152
+
153
+ return { type: `std::vector<${arrayTemplateArg}>`, initializer: '{}' };
154
+ }
155
+ case 'ObjectTypeAnnotation': {
156
+ return { type: getAnonymousAliasCppName<ObjectTypeAnnotation<EventTypeAnnotation>>(aliases, baseAliasName, type), initializer: '' };
157
+ }
158
+ case 'MixedTypeAnnotation': {
159
+ return { type: 'winrt::Microsoft::ReactNative::JSValue', initializer: '{nullptr}', alreadySupportsOptionalOrHasDefault: true };
160
+ }
161
+ case 'StringEnumTypeAnnotation':
162
+ return { type: options.cppStringType, initializer: '' }; // TODO - better enum type handling than just passing a string
163
+ default:
164
+ throw new Error(`Unhandled type: ${(type as any).type}`);
165
+ }
166
+ }
167
+
168
+
169
+ export function translateCommandParamType(type: CommandParamTypeAnnotation,
170
+ aliases: AliasMap<ObjectTypeAnnotation<CommandParamTypeAnnotation>>,
171
+ baseAliasName: string,
172
+ options: CppCodegenOptions): { type: string, initializer: string, alreadySupportsOptionalOrHasDefault?: boolean } {
173
+ switch (type.type) {
174
+ case 'StringTypeAnnotation':
175
+ return { type: options.cppStringType, initializer: '' };
176
+ case 'FloatTypeAnnotation':
177
+ return { type: 'float', initializer: '{}' };
178
+ case 'DoubleTypeAnnotation':
179
+ return { type: 'double', initializer: '{}' };
180
+ case 'Int32TypeAnnotation':
181
+ return { type: 'int32_t', initializer: '{}' };
182
+ case 'BooleanTypeAnnotation':
183
+ return { type: 'bool', initializer: '{}' };
184
+ case 'ArrayTypeAnnotation':
185
+ {
186
+ let arrayTemplateArg = '';
187
+ switch (type.elementType.type) {
188
+ case 'BooleanTypeAnnotation':
189
+ arrayTemplateArg = 'bool';
190
+ break;
191
+ case 'DoubleTypeAnnotation':
192
+ arrayTemplateArg = 'double';
193
+ break;
194
+ case 'FloatTypeAnnotation':
195
+ arrayTemplateArg = 'float';
196
+ break;
197
+ case 'Int32TypeAnnotation':
198
+ arrayTemplateArg = 'int32_t';
199
+ break;
200
+ case 'StringTypeAnnotation':
201
+ arrayTemplateArg = options.cppStringType;
202
+ break;
203
+ case 'ArrayTypeAnnotation':
204
+ const innerType = translateCommandParamType(type.elementType, aliases, baseAliasName, options);
205
+ arrayTemplateArg = `std::vector<${innerType.type}>`;
206
+ break;
207
+ case 'ReservedPropTypeAnnotation':
208
+ arrayTemplateArg = 'winrt::Microsoft::ReactNative::JSValue';
209
+ break;
210
+ case 'ObjectTypeAnnotation':
211
+ arrayTemplateArg = 'winrt::Microsoft::ReactNative::JSValueObject'; // TODO - better typing
212
+ break;
213
+ case 'StringEnumTypeAnnotation':
214
+ arrayTemplateArg = options.cppStringType; // TODO - better enum type handling than just passing a string
215
+ break;
216
+ case 'GenericTypeAnnotation' as any: // TODO verify schema - Getting this type when running codegen on all the built in types
217
+ arrayTemplateArg = 'winrt::Microsoft::ReactNative::JSValue';
218
+ break;
219
+ default:
220
+ throw new Error(`Unhandled type: ${(type.elementType as any).type} - ${JSON.stringify(type.elementType, null, 2)}`);
221
+ }
222
+
223
+ return { type: `std::vector<${arrayTemplateArg}>`, initializer: '{}' };
224
+ }
225
+ case 'ReservedTypeAnnotation':
226
+ if ((type.name as any) !== 'RootTag') {
227
+ throw new Error(`Unhandled ReservedTypeAnnotation: ${type.name}`)
228
+ }
229
+ return { type: 'bool', initializer: '{-1}' };
230
+ default:
231
+ throw new Error(`Unhandled type: ${(type as any).type}`);
232
+ }
233
+ }
@@ -7,13 +7,14 @@
7
7
  'use strict';
8
8
 
9
9
  import type {
10
+ NativeModuleEventEmitterShape,
10
11
  NativeModuleFunctionTypeAnnotation,
11
12
  NativeModulePropertyShape,
12
13
  NativeModuleSchema,
13
14
  } from '@react-native/codegen/lib/CodegenSchema';
14
15
  import {AliasMap} from './AliasManaging';
15
16
  import type {CppCodegenOptions} from './ObjectTypes';
16
- import {translateArgs, translateSpecArgs} from './ParamTypes';
17
+ import {translateArgs, translateSpecArgs, translateEventEmitterArgs} from './ParamTypes';
17
18
  import {translateImplReturnType, translateSpecReturnType} from './ReturnTypes';
18
19
 
19
20
  function isMethodSync(funcType: NativeModuleFunctionTypeAnnotation) {
@@ -91,9 +92,9 @@ function renderProperties(
91
92
  aliases: AliasMap,
92
93
  tuple: boolean,
93
94
  options: CppCodegenOptions,
94
- ): string {
95
+ ): { code: string, numberOfProperties: number } {
95
96
  // TODO: generate code for constants
96
- return methods
97
+ const properties = methods
97
98
  .filter(prop => prop.name !== 'getConstants')
98
99
  .map((prop, index) => {
99
100
  // TODO: prop.optional === true
@@ -151,6 +152,66 @@ function renderProperties(
151
152
  options,
152
153
  )});`;
153
154
  }
155
+ });
156
+
157
+ return {code: properties.join('\n'), numberOfProperties: properties.length};
158
+ }
159
+
160
+ function getPossibleEventEmitterSignatures(
161
+ eventEmitter: NativeModuleEventEmitterShape,
162
+ aliases: AliasMap,
163
+ options: CppCodegenOptions): string[] {
164
+
165
+ const traversedArgs = translateEventEmitterArgs(
166
+ eventEmitter.typeAnnotation.typeAnnotation,
167
+ aliases,
168
+ eventEmitter.name,
169
+ options,
170
+ );
171
+ return [`REACT_EVENT(${eventEmitter.name}) std::function<void(${traversedArgs})> ${eventEmitter.name};`]
172
+ }
173
+
174
+ function translatePossibleEventSignatures(
175
+ eventEmitter: NativeModuleEventEmitterShape,
176
+ aliases: AliasMap,
177
+ options: CppCodegenOptions): string {
178
+ return getPossibleEventEmitterSignatures(
179
+ eventEmitter,
180
+ aliases,
181
+ options
182
+ )
183
+ .map(sig => `" ${sig}\\n"`)
184
+ .join('\n ');
185
+ }
186
+
187
+ function renderEventEmitters(
188
+ eventEmitters: ReadonlyArray<NativeModuleEventEmitterShape>,
189
+ indexOffset: number,
190
+ aliases: AliasMap,
191
+ tuple: boolean,
192
+ options: CppCodegenOptions,
193
+ ): string {
194
+ return eventEmitters
195
+ .map((eventEmitter, index) => {
196
+ const traversedArgs = translateEventEmitterArgs(
197
+ eventEmitter.typeAnnotation.typeAnnotation,
198
+ aliases,
199
+ eventEmitter.name,
200
+ options,
201
+ );
202
+
203
+ if (tuple) {
204
+ return ` EventEmitter<void(${traversedArgs})>{${index + indexOffset}, L"${eventEmitter.name}"},`;
205
+ } else {
206
+ return ` REACT_SHOW_EVENTEMITTER_SPEC_ERRORS(
207
+ ${index + indexOffset},
208
+ "${eventEmitter.name}",
209
+ ${translatePossibleEventSignatures(
210
+ eventEmitter,
211
+ aliases,
212
+ options,
213
+ )});`;
214
+ }
154
215
  })
155
216
  .join('\n');
156
217
  }
@@ -159,19 +220,39 @@ export function generateValidateMethods(
159
220
  nativeModule: NativeModuleSchema,
160
221
  aliases: AliasMap,
161
222
  options: CppCodegenOptions,
162
- ): [string, string] {
223
+ ): {
224
+ traversedProperties: string,
225
+ traversedEventEmitters: string,
226
+ traversedPropertyTuples: string,
227
+ traversedEventEmitterTuples: string,
228
+ } {
163
229
  const methods = nativeModule.spec.methods;
230
+ const eventEmitters = nativeModule.spec.eventEmitters;
164
231
  const traversedProperties = renderProperties(
165
232
  methods,
166
233
  aliases,
167
234
  false,
168
235
  options,
169
236
  );
237
+ const traversedEventEmitters = renderEventEmitters(
238
+ eventEmitters,
239
+ traversedProperties.numberOfProperties,
240
+ aliases,
241
+ false,
242
+ options,
243
+ );
170
244
  const traversedPropertyTuples = renderProperties(
171
245
  methods,
172
246
  aliases,
173
247
  true,
174
248
  options,
175
249
  );
176
- return [traversedPropertyTuples, traversedProperties];
250
+ const traversedEventEmitterTuples = renderEventEmitters(
251
+ eventEmitters,
252
+ traversedProperties.numberOfProperties,
253
+ aliases,
254
+ true,
255
+ options,
256
+ );
257
+ return {traversedPropertyTuples: traversedPropertyTuples.code, traversedEventEmitterTuples, traversedProperties: traversedProperties.code, traversedEventEmitters};
177
258
  }
package/src/index.ts CHANGED
@@ -10,6 +10,7 @@ import fs from '@react-native-windows/fs';
10
10
  import globby from 'globby';
11
11
  import type {CppStringTypes} from './generators/GenerateNM2';
12
12
  import {createNM2Generator} from './generators/GenerateNM2';
13
+ import {createComponentGenerator} from './generators/GenerateComponentWindows';
13
14
  import {
14
15
  generateTypeScript,
15
16
  setOptionalTurboModule,
@@ -49,6 +50,8 @@ export interface SharedOptions {
49
50
  modulesCxx: boolean;
50
51
  modulesTypeScriptTypes: boolean;
51
52
  modulesWindows: boolean;
53
+ componentsWindows: boolean,
54
+ internalComponents: boolean,
52
55
  namespace: string;
53
56
  outputDirectory: string;
54
57
  cppStringType: CppStringTypes;
@@ -214,6 +217,8 @@ export function generate(
214
217
  modulesCxx,
215
218
  modulesTypeScriptTypes,
216
219
  modulesWindows,
220
+ internalComponents,
221
+ componentsWindows,
217
222
  namespace,
218
223
  outputDirectory,
219
224
  cppStringType,
@@ -320,6 +325,10 @@ export function generate(
320
325
  )
321
326
  ) {
322
327
  const componentGenerators = [
328
+ ];
329
+
330
+ if (internalComponents) {
331
+ componentGenerators.push(
323
332
  generatorComponentDescriptorH,
324
333
  generatorEventEmitterCPP,
325
334
  generatorEventEmitterH,
@@ -328,8 +337,18 @@ export function generate(
328
337
  generatorShadowNodeCPP,
329
338
  generatorShadowNodeH,
330
339
  generatorStateCPP,
331
- generatorStateH,
332
- ];
340
+ generatorStateH
341
+ );
342
+ }
343
+
344
+ if (componentsWindows) {
345
+ const generateComponentWindows = createComponentGenerator({
346
+ namespace,
347
+ cppStringType,
348
+ });
349
+
350
+ componentGenerators.push(generateComponentWindows);
351
+ }
333
352
 
334
353
  componentGenerators.forEach(generator => {
335
354
  const generated: Map<string, string> = generator(
@@ -369,6 +388,8 @@ export function runCodeGen(options: CodeGenOptions): boolean {
369
388
  modulesCxx,
370
389
  modulesTypeScriptTypes,
371
390
  modulesWindows,
391
+ componentsWindows,
392
+ internalComponents,
372
393
  namespace,
373
394
  outputDirectory,
374
395
  cppStringType,
@@ -381,6 +402,8 @@ export function runCodeGen(options: CodeGenOptions): boolean {
381
402
  modulesCxx,
382
403
  modulesTypeScriptTypes,
383
404
  modulesWindows,
405
+ componentsWindows,
406
+ internalComponents,
384
407
  namespace,
385
408
  outputDirectory,
386
409
  cppStringType,