Skip to content

Commit cbe23f7

Browse files
Add object types for component options (#638)
* Add object types for component options * Refactor
1 parent a05f1fc commit cbe23f7

File tree

2 files changed

+77
-15
lines changed

2 files changed

+77
-15
lines changed

tools/spec/tests/metadata-generator.spec.js

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,9 @@ describe("metadata-generator", function() {
567567
Options: {
568568
property: {
569569
Options: {
570-
nestedProperty1: {}
570+
nestedProperty1: {
571+
PrimitiveTypes: [ 'number' ]
572+
}
571573
},
572574
PrimitiveTypes: [
573575
'string'
@@ -587,7 +589,9 @@ describe("metadata-generator", function() {
587589
Options: {
588590
property: {
589591
Options: {
590-
nestedProperty2: {}
592+
nestedProperty2: {
593+
PrimitiveTypes: [ 'string' ]
594+
}
591595
},
592596
PrimitiveTypes: [
593597
'boolean',
@@ -655,9 +659,11 @@ describe("metadata-generator", function() {
655659
it("should generate nested components with merged types of repetitive properties", function() {
656660
expect(metas.DxoExternalProperty.properties.map(p => p.type))
657661
.toEqual([
658-
'string' + TYPES_SEPORATOR +
662+
'string' + TYPES_SEPORATOR +
663+
'{ nestedProperty1?: number }' + TYPES_SEPORATOR +
659664
'boolean' + TYPES_SEPORATOR +
660-
'DevExpress.ui.dxComplexType',
665+
'DevExpress.ui.dxComplexType' + TYPES_SEPORATOR +
666+
'{ nestedProperty2?: string }',
661667
'string',
662668
'any',
663669
'any'
@@ -689,6 +695,29 @@ describe("metadata-generator", function() {
689695
ComplexTypes: [
690696
'ExternalPropertyType'
691697
]
698+
},
699+
collectionDeeps : {
700+
PrimitiveTypes: [
701+
"boolean"
702+
],
703+
ItemPrimitiveTypes: [
704+
"number"
705+
],
706+
Options: {
707+
value: {
708+
PrimitiveTypes: [
709+
"string"
710+
]
711+
}
712+
},
713+
IsCollection: true,
714+
SingularName: "collectionDeep"
715+
},
716+
deepWithPromise: {
717+
IsPromise: true,
718+
ItemPrimitiveTypes: [
719+
"boolean"
720+
]
692721
}
693722
},
694723
PrimitiveTypes: [
@@ -763,7 +792,7 @@ describe("metadata-generator", function() {
763792
});
764793

765794
it("should generate matadata", function() {
766-
expect(Object.keys(metas).length).toBe(9);
795+
expect(Object.keys(metas).length).toBe(10);
767796

768797
expect(metas.DxComplexWidget).not.toBe(undefined);
769798
expect(metas.DxoExternalPropertyType).not.toBe(undefined);
@@ -774,12 +803,17 @@ describe("metadata-generator", function() {
774803
expect(metas.DxiNestedItem).not.toBe(undefined);
775804
expect(metas.DxiCollectionItem).not.toBe(undefined);
776805
expect(metas.DxoCollectionItem).not.toBe(undefined);
806+
expect(metas.DxiCollectionDeep).not.toBe(undefined);
777807
});
778808

779809
it("should generate proper typed properties", function() {
780810
expect(metas.DxoProperty.properties.map(p => p.type)).toEqual([
781-
'string' + TYPES_SEPORATOR + 'DevExpress.ui.ComplexType',
782-
'Array<string' + TYPES_SEPORATOR + 'DevExpress.ui.ComplexType>'
811+
`string${TYPES_SEPORATOR}DevExpress.ui.ComplexType${TYPES_SEPORATOR}` +
812+
`{ deep?: boolean${TYPES_SEPORATOR}DevExpress.ui.ComplexType, ` +
813+
`collectionDeeps?: boolean${TYPES_SEPORATOR}Array<number${TYPES_SEPORATOR}{ value?: string }>, ` +
814+
`deepWithPromise?: Promise<boolean> & JQueryPromise<boolean> }`,
815+
816+
`Array<string${TYPES_SEPORATOR}DevExpress.ui.ComplexType${TYPES_SEPORATOR}{ deep?: string }>`
783817
]);
784818
});
785819

tools/src/metadata-generator.ts

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,18 @@ export default class DXComponentMetadataGenerator {
170170
}
171171

172172
private getTypesDescription(optionMetadata) {
173-
let primitiveTypes = optionMetadata.PrimitiveTypes || [];
173+
let typeParts = this.getTypeParts(optionMetadata, true);
174+
175+
return {
176+
primitiveTypes: typeParts.primitiveTypes,
177+
arrayTypes: typeParts.arrayTypes,
178+
isDevExpressRequired: this.detectComplexTypes(typeParts.primitiveTypes) || this.detectComplexTypes(typeParts.arrayTypes)
179+
};
180+
}
181+
182+
private getTypeParts(optionMetadata, canIgnoreObjectType) {
183+
let primitiveTypes = optionMetadata.PrimitiveTypes ? optionMetadata.PrimitiveTypes.slice(0) : [];
174184
let arrayTypes = [];
175-
let isDevExpressRequired = false;
176185

177186
if (optionMetadata.ItemPrimitiveTypes) {
178187
if (optionMetadata.IsPromise) {
@@ -183,13 +192,32 @@ export default class DXComponentMetadataGenerator {
183192
}
184193
}
185194

186-
isDevExpressRequired = this.detectComplexTypes(primitiveTypes) || this.detectComplexTypes(arrayTypes);
195+
// TODO: Get rid of right part of this condition in 18.1
196+
if (optionMetadata.Options && (!canIgnoreObjectType || (primitiveTypes.length || arrayTypes.length))) {
197+
let optionType = this.getObjectType(optionMetadata.Options);
187198

188-
return {
189-
primitiveTypes,
190-
arrayTypes,
191-
isDevExpressRequired
192-
};
199+
if (optionType.length) {
200+
(optionMetadata.IsCollection ? arrayTypes : primitiveTypes).push(optionType);
201+
}
202+
}
203+
204+
return({ primitiveTypes, arrayTypes });
205+
}
206+
207+
private getObjectType(optionMetadata) {
208+
let objectType = [];
209+
210+
for (let option in optionMetadata) {
211+
let typeParts = this.getTypeParts(optionMetadata[option], false);
212+
let type = this.getType(typeParts);
213+
214+
objectType.push(option + '?: ' + type);
215+
}
216+
217+
if (objectType.length) {
218+
return '{ ' + objectType.join(', ') + ' }';
219+
}
220+
return '';
193221
}
194222

195223
private getType(typesDescription) {

0 commit comments

Comments
 (0)