@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.
- package/CHANGELOG.md +76 -10
- package/lib-commonjs/Cli.js +12 -1
- package/lib-commonjs/Cli.js.map +1 -1
- package/lib-commonjs/generators/AliasGen.js +1 -2
- package/lib-commonjs/generators/AliasGen.js.map +1 -1
- package/lib-commonjs/generators/AliasManaging.d.ts +3 -3
- package/lib-commonjs/generators/AliasManaging.js.map +1 -1
- package/lib-commonjs/generators/GenerateComponentWindows.d.ts +13 -0
- package/lib-commonjs/generators/GenerateComponentWindows.js +336 -0
- package/lib-commonjs/generators/GenerateComponentWindows.js.map +1 -0
- package/lib-commonjs/generators/GenerateNM2.js +2 -2
- package/lib-commonjs/generators/GenerateNM2.js.map +1 -1
- package/lib-commonjs/generators/GenerateTypeScript.js +1 -1
- package/lib-commonjs/generators/GenerateTypeScript.js.map +1 -1
- package/lib-commonjs/generators/ObjectTypes.d.ts +2 -2
- package/lib-commonjs/generators/ObjectTypes.js +3 -1
- package/lib-commonjs/generators/ObjectTypes.js.map +1 -1
- package/lib-commonjs/generators/ParamTypes.d.ts +2 -1
- package/lib-commonjs/generators/ParamTypes.js +46 -2
- package/lib-commonjs/generators/ParamTypes.js.map +1 -1
- package/lib-commonjs/generators/PropObjectTypes.d.ts +18 -0
- package/lib-commonjs/generators/PropObjectTypes.js +217 -0
- package/lib-commonjs/generators/PropObjectTypes.js.map +1 -0
- package/lib-commonjs/generators/ValidateMethods.d.ts +6 -1
- package/lib-commonjs/generators/ValidateMethods.js +30 -2
- package/lib-commonjs/generators/ValidateMethods.js.map +1 -1
- package/lib-commonjs/index.d.ts +3 -1
- package/lib-commonjs/index.js +16 -13
- package/lib-commonjs/index.js.map +1 -1
- package/package.json +8 -8
- package/src/Cli.ts +12 -1
- package/src/generators/AliasGen.ts +1 -1
- package/src/generators/AliasManaging.ts +12 -12
- package/src/generators/GenerateComponentWindows.ts +392 -0
- package/src/generators/GenerateNM2.ts +2 -2
- package/src/generators/GenerateTypeScript.ts +3 -2
- package/src/generators/ObjectTypes.ts +5 -2
- package/src/generators/ParamTypes.ts +90 -3
- package/src/generators/PropObjectTypes.ts +233 -0
- package/src/generators/ValidateMethods.ts +86 -5
- 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
|
-
|
|
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
|
-
):
|
|
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
|
-
|
|
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,
|