Skip to content

Commit d1beea0

Browse files
authored
Generate types for event emitters (#1394)
1 parent 51cb606 commit d1beea0

File tree

4 files changed

+32
-5
lines changed

4 files changed

+32
-5
lines changed

packages/devextreme-angular-generator/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"author": "Developer Express Inc.",
33
"name": "devextreme-angular-generator",
4-
"version": "2.0.3",
4+
"version": "2.1.0",
55
"description": "Angular UI and visualization components based on DevExtreme widgets",
66
"repository": {
77
"type": "git",

packages/devextreme-angular-generator/spec/tests/metadata-generator.spec.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,15 @@ describe("metadata-generator", function() {
235235
onTestEvent: {
236236
IsEvent: true,
237237
},
238+
onTestTypedEvent: {
239+
IsEvent: true,
240+
TypeImports: [
241+
{
242+
"Name": "SomeEvent",
243+
"Path": "some/module"
244+
}
245+
]
246+
},
238247
simpleTypedProperty: {
239248
PrimitiveTypes: [
240249
"boolean"
@@ -337,6 +346,7 @@ describe("metadata-generator", function() {
337346
it("should generate proper typed events", function() {
338347
expect(metas.DxTypedWidget.events.map(p => p.type)).toEqual([
339348
'EventEmitter<any>',
349+
'EventEmitter<SomeEvent>',
340350
'EventEmitter<boolean>',
341351
'EventEmitter<string' + TYPES_SEPORATOR + 'number>',
342352
'EventEmitter<dxComplexType1>',
@@ -352,6 +362,10 @@ describe("metadata-generator", function() {
352362
importString: "DevExpress",
353363
path: "widgetPackageName/bundles/dx.all",
354364
},
365+
{
366+
importString: "{ SomeEvent }",
367+
path: "widgetPackageName/some/module",
368+
},
355369
{
356370
importString: "{ dxComplexType1, dxComplexType2 }",
357371
path: "widgetPackageName/ui/dx_complex_types",

packages/devextreme-angular-generator/src/metadata-generator.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,13 +175,14 @@ export default class DXComponentMetadataGenerator {
175175

176176
if (option.IsEvent) {
177177
let eventName = inflector.camelize(optionName.substr('on'.length), true);
178+
const eventType = option.TypeImports?.length ? option.TypeImports[0].Name : 'any';
178179

179180
events.push({
180181
docID: option.DocID,
181182
isDeprecated: option.IsDeprecated,
182183
emit: optionName,
183184
subscribe: eventName,
184-
type: 'EventEmitter<any>'
185+
type: `EventEmitter<${eventType}>`
185186
});
186187
} else {
187188
let typesDescription = this.getTypesDescription(option);
@@ -319,6 +320,12 @@ export default class DXComponentMetadataGenerator {
319320
return '';
320321
}
321322

323+
private getEventType(typesDescription: TypeDescription, option?: Option) {
324+
if (!(option?.IsEvent && option.TypeImports?.length)) {
325+
return this.getType(typesDescription);
326+
}
327+
return `((e: ${option.TypeImports[0].Name}) => void)`;
328+
}
322329
private getType(typesDescription: TypeDescription) {
323330
let primitiveTypes = typesDescription.primitiveTypes.slice(0);
324331
let result = 'any';
@@ -436,9 +443,14 @@ export default class DXComponentMetadataGenerator {
436443

437444
for (let optName in nestedOptions) {
438445
let nestedOption = nestedOptions[optName];
446+
439447
let typesDescription = this.getTypesDescription(nestedOption);
440448
let propertyType = this.getType(typesDescription);
441449

450+
if (nestedOption.IsEvent && nestedOption.IsEvent && nestedOption.TypeImports?.length) {
451+
propertyType = `((e: ${nestedOption.TypeImports[0].Name}) => void)`;
452+
}
453+
442454
let property: Property = {
443455
docID: nestedOption.DocID,
444456
isDeprecated: nestedOption.IsDeprecated,
@@ -514,9 +526,10 @@ export default class DXComponentMetadataGenerator {
514526
typesDescription.arrayTypes,
515527
property.typesDescription.arrayTypes);
516528

517-
existingProperty.type = this.getType(typesDescription);
529+
existingProperty.type = existingProperty.option?.IsEvent
530+
? this.getEventType(typesDescription, existingProperty.option)
531+
: this.getType(typesDescription);
518532
}
519-
520533
return properties;
521534
}, []);
522535

packages/devextreme-angular/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
"core-js": "^2.6.12",
3939
"del": "^2.2.2",
4040
"devextreme": "23.1-next",
41-
"devextreme-angular-generator": "^2.0.2",
41+
"devextreme-angular-generator": "^2.1.0",
4242
"devextreme-internal-tools": "^10.0.0-beta.6",
4343
"gulp": "^4.0.2",
4444
"gulp-header": "^1.8.12",

0 commit comments

Comments
 (0)