diff --git a/packages/devextreme-angular-generator/spec/tests/metadata-generator.spec.js b/packages/devextreme-angular-generator/spec/tests/metadata-generator.spec.js index 99986340b..c7ba7be24 100644 --- a/packages/devextreme-angular-generator/spec/tests/metadata-generator.spec.js +++ b/packages/devextreme-angular-generator/spec/tests/metadata-generator.spec.js @@ -210,7 +210,7 @@ describe("metadata-generator", function() { }); it("should generate proper optionsTypeParams", function() { - expect(metas.DxTestWidget.optionsTypeParams).toBe(["T1", "T2"]); + expect(metas.DxTestWidget.optionsTypeParams).toEqual(["T1", "T2"]); }); it("should detect editors", function() { @@ -294,7 +294,8 @@ describe("metadata-generator", function() { ] } }, - Module: 'typed_widget' + Module: 'typed_widget', + Reexports: ['OnClickEvent', 'OnChangeEvent', 'default'], }, dxWidgetWithPromise: { Options: { @@ -358,6 +359,12 @@ describe("metadata-generator", function() { } ]); }); + + it("should generate reexports", function(){ + expect(metas.DxTypedWidget.reexports).toEqual([ + 'OnClickEvent', 'OnChangeEvent', 'default' + ]) + }) }); describe("complex widgets", function() { diff --git a/packages/devextreme-angular-generator/src/facade-generator.ts b/packages/devextreme-angular-generator/src/facade-generator.ts index 4d50c859a..637600ae4 100644 --- a/packages/devextreme-angular-generator/src/facade-generator.ts +++ b/packages/devextreme-angular-generator/src/facade-generator.ts @@ -1,6 +1,7 @@ import fs = require('fs'); import path = require('path'); import logger from './logger'; +import inflector = require('inflector-js'); export default class FacadeGenerator { private _encoding = 'utf8'; @@ -10,13 +11,14 @@ export default class FacadeGenerator { let facadeConfig = config.facades[facadeFilePath], resultContent = ''; - resultContent += `export * from 'devextreme-angular/core'\n`; - resultContent += `export * from './ui/all'\n`; + resultContent += `export * from 'devextreme-angular/core';\n`; + resultContent += `export * from './ui/all';\n`; fs.readdirSync(facadeConfig.sourceDirectories[0]) .filter(fileName => fs.lstatSync(path.join(facadeConfig.sourceDirectories[0], fileName)).isFile()) .forEach(fileName => { const { name } = path.parse(path.join(facadeConfig.sourceDirectories[0], fileName)); - resultContent += `export * from 'devextreme-angular/ui/${name}'\n`; + const formattedName = formatName(name); + resultContent += `export { Dx${formattedName}Component, Dx${formattedName}Module } from 'devextreme-angular/ui/${name}';\n`; }); logger('Write result to ' + facadeFilePath); @@ -24,3 +26,11 @@ export default class FacadeGenerator { }); } } + + +function formatName(name: string): string { + if (!name.includes('-')) { + return inflector.camelize(name); + } + return name.split('-').map((n) => inflector.camelize(n)).join(''); +} diff --git a/packages/devextreme-angular-generator/src/metadata-generator.ts b/packages/devextreme-angular-generator/src/metadata-generator.ts index 7308d2ed8..6e9df1d15 100644 --- a/packages/devextreme-angular-generator/src/metadata-generator.ts +++ b/packages/devextreme-angular-generator/src/metadata-generator.ts @@ -66,6 +66,7 @@ interface WidgetComponent extends ComponentMeta, Container { isEditor: boolean; packageName: string; optionsTypeParams: string[]; + reexports: string[]; } interface Component extends ComponentMeta, Container { @@ -242,7 +243,8 @@ export default class DXComponentMetadataGenerator { packageName: config.wrapperPackageName, imports: buildImports(getValues(widget.Options), config.widgetPackageName), nestedComponents: widgetNestedComponents, - optionsTypeParams: widget.OptionsTypeParams + optionsTypeParams: widget.OptionsTypeParams, + reexports: widget.Reexports, }; logger('Write metadata to file ' + outputFilePath); @@ -327,12 +329,12 @@ export default class DXComponentMetadataGenerator { return result; } - private mergeArrayTypes(array1, array2) { + private mergeArrayTypes(array1: T[], array2: T[]): T[] { let newTypes = array2.filter(type => array1.indexOf(type) === -1); return [].concat(array1, newTypes); } - private getExternalObjectInfo(metadata: Metadata, typeName) { + private getExternalObjectInfo(metadata: Metadata, typeName: string) { let externalObject = metadata.ExtraObjects[typeName]; if (!externalObject) { @@ -492,7 +494,7 @@ export default class DXComponentMetadataGenerator { } else { existingComponent.properties = existingComponent.properties .concat(...component.properties) - .reduce((properties, property) => { + .reduce((properties: Property[], property) => { if (properties.filter(p => p.name === property.name).length === 0) { properties.push(property); } else { @@ -515,7 +517,7 @@ export default class DXComponentMetadataGenerator { existingComponent.events = existingComponent.events .concat(...component.events) - .reduce((events, event) => { + .reduce((events: Event[], event) => { if (events.filter(e => e.emit === event.emit).length === 0) { events.push(event); } @@ -535,7 +537,8 @@ export default class DXComponentMetadataGenerator { }, []); normalizedMetadata.forEach(component => { - component.collectionNestedComponents = component.collectionNestedComponents.reduce((result, nestedComponent) => { + component.collectionNestedComponents = component.collectionNestedComponents + .reduce((result: NestedComponent[], nestedComponent) => { if (result.filter(c => nestedComponent.className === c.className).length === 0) { result.push(nestedComponent); } diff --git a/packages/devextreme-angular-generator/src/metadata-model.ts b/packages/devextreme-angular-generator/src/metadata-model.ts index 459ad7bb4..4bd49014a 100644 --- a/packages/devextreme-angular-generator/src/metadata-model.ts +++ b/packages/devextreme-angular-generator/src/metadata-model.ts @@ -45,6 +45,7 @@ export interface Metadata { [optionName: string]: Option; }; OptionsTypeParams: string[]; + Reexports: string[]; } }; ExtraObjects: any[]; diff --git a/packages/devextreme-angular-generator/src/templates/component.tst b/packages/devextreme-angular-generator/src/templates/component.tst index 552d95836..fce165060 100644 --- a/packages/devextreme-angular-generator/src/templates/component.tst +++ b/packages/devextreme-angular-generator/src/templates/component.tst @@ -9,8 +9,17 @@ var implementedInterfaces = ['OnDestroy']; it.isEditor && implementedInterfaces.push('ControlValueAccessor'); collectionProperties.length && implementedInterfaces.push('OnChanges', 'DoCheck'); + +var reexports = it.reexports?.filter(n => n !== 'default'); +var reexportStr = reexports?.join(',\n '); #> +<#? reexports?.length #> +export { + <#= reexportStr #>, +} from '<#= it.module #>'; +<#?#> + import { BrowserTransferStateModule } from '@angular/platform-browser'; import { TransferState } from '@angular/platform-browser';