diff --git a/TODO.md b/TODO.md index 5a04b34..99bfcc8 100644 --- a/TODO.md +++ b/TODO.md @@ -3,17 +3,7 @@ # all * custom templates -# express.ts.routes - -* Add a dynamic BasePath als prefix to all Controller Endpoints -* Add a parameter for "internal" or "external" 400/500 error handling e.g. vi next(err) -* Status Code handling - currently 200, 204, 400 and 500 is created - we need a @Responses attribute to tag the controllers -* Error Object handling -* Maybe give access to req/res to the Controller e.g. via attributes or constructor? -* Support dependency injection for the constroller creation in the routes file - -# angular2.client +# angular.client * Support Status Codes * Error Object handling diff --git a/lib/actions/addgen.ts b/lib/actions/addgen.ts index f92c8cf..0baa98d 100644 --- a/lib/actions/addgen.ts +++ b/lib/actions/addgen.ts @@ -103,8 +103,7 @@ export class AddGenerator { protected isGeneratorTypeOK(): boolean { let arr: string[] = [ 'sequelize.ts.dal', - 'express.ts.routes', - 'angular2.client', + 'angular.client', 'unirest.ts.client', 'android.ormlite.dal', 'android.retrofit.client' diff --git a/lib/generator/android.retrofit.client/android.retrofit.client.generator.ts b/lib/generator/android.retrofit.client/android.retrofit.client.generator.ts index 67cf824..536f522 100644 --- a/lib/generator/android.retrofit.client/android.retrofit.client.generator.ts +++ b/lib/generator/android.retrofit.client/android.retrofit.client.generator.ts @@ -3,7 +3,6 @@ const fs = require('fs'); const process = require('process'); import { GeneratorConfigBasic } from '../../persistance/generatorconfig.basic'; -import { GeneratorConfigExpressTSRoutes } from '../../persistance/generatorconfig.express.ts.routes'; import { GeneratorConfigSequelizeTSDal } from '../../persistance/generatorconfig.sequelize.ts.dal'; import { GeneratorConfigAndroidRetrofitClient, AndroidRetrofitFilter } from '../../persistance/generatorconfig.android.retrofit.client'; @@ -24,7 +23,6 @@ import { AndroidRetrofitJavaMapping } from './android.retrofit.java.mapping'; export class AndroidRetrofitClientGenerator extends BaseGenerator { protected generatorConfig: GeneratorConfigAndroidRetrofitClient; - protected parentGeneratorConfig: GeneratorConfigExpressTSRoutes; protected metadataSymbolTable: MetadataSymbolTable; protected dbSymbolTable: DBSymbolTable; @@ -55,7 +53,6 @@ export class AndroidRetrofitClientGenerator extends BaseGenerator { type: type, active: true, targetDir: './unirest-ts-client', - parentServerGeneratorConfigName: 'express.ts.routes', cleanTargetDir: false, createProject: false, projectName: 'unirest-ts-client', @@ -68,8 +65,6 @@ export class AndroidRetrofitClientGenerator extends BaseGenerator { } protected async generateCode(): Promise { - this.parentGeneratorConfig = BaseGenerator.getGeneratorByNameFromString - (this.nicassaJson, this.generatorConfig.parentServerGeneratorConfigName); this.metadataSymbolTable = MetadataSymbolTableReader.readFromJsonString(this.nicassaJson); this.setLengthToMetaData(); diff --git a/lib/generator/angular.client/angular.client.generator.ts b/lib/generator/angular.client/angular.client.generator.ts new file mode 100644 index 0000000..c953405 --- /dev/null +++ b/lib/generator/angular.client/angular.client.generator.ts @@ -0,0 +1,172 @@ +import { GeneratorConfigBasic } from '../../persistance/generatorconfig.basic'; +import { GeneratorConfigAngularClient, AngularClientFilter } from '../../persistance/generatorconfig.angular.client'; + +import { ApiParser } from '../../swagger/apiparser.class'; +import { ApiDescription } from '../../swagger/entites/apidesciption.class'; +import { ControllerType } from '../../swagger/entites/controllertype.class'; +import { ComplexType } from '../../swagger/entites/complextype.class'; + + +import { FileManger } from '../filemanager'; +import { BaseGenerator } from '../basegenerator'; +import { RenderTemplate } from '../rendertemplate'; + +import { SymbolNameMapper } from '../symbolnamemapper'; + +export class AngularClientGenerator extends BaseGenerator { + protected generatorConfig: GeneratorConfigAngularClient; + + constructor(generatorConfigBasic: GeneratorConfigBasic, nicassaJson: string) { + super(generatorConfigBasic, nicassaJson); + this.generatorConfig = generatorConfigBasic; + if (this.generatorConfig !== undefined && this.generatorConfig !== null) { + if (this.generatorConfig.filter === undefined || this.generatorConfig.filter === null) { + let defaultCfg = this.getDefaultConfig(''); + this.generatorConfig.filter = defaultCfg.filter; + } + } + this.templateDir = __dirname + '/templates'; + } + + public getDefaultConfig(name: string): GeneratorConfigAngularClient { + let angularClientFilter: AngularClientFilter = { + exculdeEntity: [], + exculdeService: [], + onlyEntity: [], + onlyService: [] + } + + let type = "angular.client"; + + let result: GeneratorConfigAngularClient = { + name: name, + type: type, + active: true, + swaggerFile: './swagger.json', + customErrorHandler: false, + targetDir: './angular-client', + cleanTargetDir: false, + createProject: false, + projectName: 'angular-client', + ngModuleName: 'AngularClient', + filter: angularClientFilter + }; + + return result; + } + + protected async generateCode(): Promise { + let parser = new ApiParser(); + let api: ApiDescription = await parser.parseSwaggerFile(this.generatorConfig.swaggerFile); + + let createPackageJson: boolean = false; + let createIndex: boolean = false; + let createProject: boolean = this.generatorConfig.createProject; + let createConfiguration: boolean = false; + let createErrorReporter: boolean = false; + let customErrorHandler: boolean = false; + if (createProject) { + createPackageJson = !FileManger.fileExistInProjectDir(this, 'package.json'); + createIndex = !FileManger.fileExistInProjectDir(this, 'index.ts'); + createConfiguration = !FileManger.fileExistInProjectDir(this, 'configuration.ts'); + createErrorReporter = !FileManger.fileExistInProjectDir(this, 'errorreporter.ts'); + } + if (this.generatorConfig.customErrorHandler != null && this.generatorConfig.customErrorHandler !== undefined && + this.generatorConfig.customErrorHandler == true) { + customErrorHandler = true; + } + let projectName = this.generatorConfig.projectName; + if (projectName === undefined || projectName === null) { + projectName = 'undefined'; + } + projectName = SymbolNameMapper.titleCase(projectName); + projectName = SymbolNameMapper.headerCase(projectName); + projectName = SymbolNameMapper.lower(projectName); + let ngModuleName = this.generatorConfig.ngModuleName; + + let controllers = this.applyControllerFilter(this.generatorConfig.filter, api.controllers); + let complexTypes = this.applyReferenceTypeFilter(this.generatorConfig.filter, api.complexTypes); + + + let data = { + controllers: controllers, + complexTypes: complexTypes, + projectName: projectName, + ngModuleName: ngModuleName, + customErrorHandler: customErrorHandler + }; + + // idea from + // https://offering.solutions/blog/articles/2016/02/01/consuming-a-rest-api-with-angular-http-service-in-typescript/ + + await RenderTemplate.renderTemplate(true, this, 'entities.ts.ejs', data); + //await RenderTemplate.renderTemplate(true, this, 'services.ts.ejs', data); + //await RenderTemplate.renderTemplate(createPackageJson, this, 'package.json.ejs', data); + //await RenderTemplate.renderTemplate(createIndex, this, 'index.ts.ejs', data); + //await RenderTemplate.renderTemplate(createProject, this, 'generated.exports.ts.ejs', data); + //await RenderTemplate.renderTemplate(createConfiguration, this, 'configuration.ts.ejs', data); + //await RenderTemplate.renderTemplate(createErrorReporter, this, 'errorreporter.ts.ejs', data); + //await RenderTemplate.renderTemplate(true, this, 'ng.module.ts.ejs', data); + + return await true; + } + +// reference - if a custom mapping is implemented +/* + protected setTypeMapper(api: ApiDescription) { + for (let k = 0; k < api.complexTypes.length; k++) { + let type: ComplexType = api.complexTypes[k]; + for (let p = 0; p < type.properties.length; p++) { + let prop = type.properties[p]; + prop.getMappedType = (kind: string) => { + console.log('trace'); + return prop.type; + } + } + } + + for (let k = 0; k < api.controllers.length; k++) { + let controller: ControllerType = api.controllers[k]; + for (let r = 0; r < controller.routes.length; r++) { + let route = controller.routes[r]; + for (let p = 0; p < route.parameter.length; p++) { + let parameter = route.parameter[p]; + parameter.getMappedType = (kind: string) => { + console.log('trace'); + return parameter.type; + } + } + for (let m = 0; m < route.response.length; m++) { + let response = route.response[m]; + response.getMappedType = (kind: string) => { + console.log('trace'); + return response.type; + } + } + } + } + } + */ + + protected applyControllerFilter(filter: AngularClientFilter, controllers: ControllerType[]): ControllerType[] { + if (filter === undefined || filter === null) { + return controllers; + } + + if (controllers === undefined || controllers === null || controllers.length === 0) { + return controllers; + } + console.log('applyControllerFilter not implemented'); + return controllers; + } + + protected applyReferenceTypeFilter(filter: AngularClientFilter, referenceTypes: ComplexType[]): ComplexType[] { + if (referenceTypes === undefined || referenceTypes === null || referenceTypes.length === 0) { + return referenceTypes; + } + console.log('applyReferenceTypeFilter not implemented'); + return referenceTypes; + } + +} + diff --git a/lib/generator/angular2.client/angular2.client.generator.ts b/lib/generator/angular.client/angular.client.generator.ts.txt similarity index 88% rename from lib/generator/angular2.client/angular2.client.generator.ts rename to lib/generator/angular.client/angular.client.generator.ts.txt index 23865a5..6c72aa5 100644 --- a/lib/generator/angular2.client/angular2.client.generator.ts +++ b/lib/generator/angular.client/angular.client.generator.ts.txt @@ -2,18 +2,13 @@ const fs = require('fs'); const process = require('process'); import { GeneratorConfigBasic } from '../../persistance/generatorconfig.basic'; -import { GeneratorConfigExpressTSRoutes } from '../../persistance/generatorconfig.express.ts.routes'; import { GeneratorConfigSequelizeTSDal } from '../../persistance/generatorconfig.sequelize.ts.dal'; -import { GeneratorConfigAngular2Client, Angular2ClientFilter } from '../../persistance/generatorconfig.angular2.client'; +import { GeneratorConfigAngularClient, AngularClientFilter } from '../../persistance/generatorconfig.angular.client'; import { FileManger } from '../filemanager'; import { BaseGenerator } from '../basegenerator'; import { RenderTemplate } from '../rendertemplate'; -import { MetadataSymbolTable } from '../symboltable/metadata/metadatasymboltable'; -import { ControllerSymbol } from '../symboltable/metadata/controllersymbol'; -import { ReferenceTypeSymbol } from '../symboltable/metadata/referencetypesymbol'; -import { MetadataSymbolTableReader } from '../symboltable/metadata/metadatasymboltable.reader'; import { SymbolNameMapper } from '../symbolnamemapper'; import { DBSymbolTable } from '../symboltable/db/dbsymboltable'; @@ -21,15 +16,15 @@ import { DBSymbolTableReader } from '../symboltable/db/dbsymboltable.reader'; import { SequelizeTsDalTypeMapper } from '../sequelize.ts.dal/sequelize.ts.dal.typemapper.class'; import { SequelizeTypescriptMapping } from '../sequelize.ts.dal/sequelize.typescript.mapping'; -export class Angular2ClientGenerator extends BaseGenerator { - protected generatorConfig: GeneratorConfigAngular2Client; +export class AngularClientGenerator extends BaseGenerator { + protected generatorConfig: GeneratorConfigAngularClient; protected parentGeneratorConfig: GeneratorConfigExpressTSRoutes; protected metadataSymbolTable: MetadataSymbolTable; protected dbSymbolTable: DBSymbolTable; constructor(generatorConfigBasic: GeneratorConfigBasic, nicassaJson: string) { super(generatorConfigBasic, nicassaJson); - this.generatorConfig = generatorConfigBasic; + this.generatorConfig = generatorConfigBasic; if (this.generatorConfig !== undefined && this.generatorConfig !== null) { if (this.generatorConfig.filter === undefined || this.generatorConfig.filter === null) { let defaultCfg = this.getDefaultConfig(''); @@ -39,28 +34,28 @@ export class Angular2ClientGenerator extends BaseGenerator { this.templateDir = __dirname + '/templates'; } - public getDefaultConfig(name: string): GeneratorConfigAngular2Client { - let angular2ClientFilter: Angular2ClientFilter = { + public getDefaultConfig(name: string): GeneratorConfigAngularClient { + let angularClientFilter: AngularClientFilter = { exculdeEntity: [], exculdeService: [], onlyEntity: [], onlyService: [] } - let type = "angular2.client"; + let type = "angular.client"; - let result: GeneratorConfigAngular2Client = { + let result: GeneratorConfigAngularClient = { name: name, type: type, active: true, customErrorHandler: false, - targetDir: './angular2-client', + targetDir: './angular-client', parentServerGeneratorConfigName: 'express.ts.routes', cleanTargetDir: false, createProject: false, - projectName: 'angular2-client', - ngModuleName: 'Angular2Client', - filter: angular2ClientFilter + projectName: 'angular-client', + ngModuleName: 'AngularClient', + filter: angularClientFilter }; return result; @@ -126,7 +121,7 @@ export class Angular2ClientGenerator extends BaseGenerator { } - protected applyControllerFilter(filter: Angular2ClientFilter, controllers: ControllerSymbol[]): ControllerSymbol[] { + protected applyControllerFilter(filter: AngularClientFilter, controllers: ControllerSymbol[]): ControllerSymbol[] { if (filter === undefined || filter === null) { return controllers; } @@ -161,7 +156,7 @@ export class Angular2ClientGenerator extends BaseGenerator { return result; } - protected applyReferenceTypeFilter(filter: Angular2ClientFilter, referenceTypes: ReferenceTypeSymbol[]): ReferenceTypeSymbol[] { + protected applyReferenceTypeFilter(filter: AngularClientFilter, referenceTypes: ReferenceTypeSymbol[]): ReferenceTypeSymbol[] { if (referenceTypes === undefined || referenceTypes === null || referenceTypes.length === 0) { return referenceTypes; } diff --git a/lib/generator/angular2.client/templates/configuration.ts.ejs b/lib/generator/angular.client/templates/configuration.ts.ejs similarity index 100% rename from lib/generator/angular2.client/templates/configuration.ts.ejs rename to lib/generator/angular.client/templates/configuration.ts.ejs diff --git a/lib/generator/angular.client/templates/entities.ts.ejs b/lib/generator/angular.client/templates/entities.ts.ejs new file mode 100644 index 0000000..4ba2411 --- /dev/null +++ b/lib/generator/angular.client/templates/entities.ts.ejs @@ -0,0 +1,26 @@ +/* tslint:disable:max-line-length */ +//////////////////////////////////////////////////////////////////// +// +// GENERATED CLASS +// +// DO NOT EDIT +// +//////////////////////////////////////////////////////////////////// + + +<%complexTypes.forEach(function(type){ +%><%if(type.type !== type.name) { +%>// mapped from <%- type.name %> +<%}%>export interface <%- type.type%> {<% +type.properties.forEach(function(prop){%><% + if(prop.isMap) {%> + [key: string]<% + }else{%> + <%- prop.name%><%if(!prop.isRequired) { + %>?<%}%><%} + %>: <%- prop.getMappedType('TypeScript') + %><%if(prop.isArray) {%>[]<%}%>;<% +}); %> +}; + +<%}); %> diff --git a/lib/generator/angular2.client/templates/errorreporter.ts.ejs b/lib/generator/angular.client/templates/errorreporter.ts.ejs similarity index 100% rename from lib/generator/angular2.client/templates/errorreporter.ts.ejs rename to lib/generator/angular.client/templates/errorreporter.ts.ejs diff --git a/lib/generator/angular2.client/templates/generated.exports.ts.ejs b/lib/generator/angular.client/templates/generated.exports.ts.ejs similarity index 100% rename from lib/generator/angular2.client/templates/generated.exports.ts.ejs rename to lib/generator/angular.client/templates/generated.exports.ts.ejs diff --git a/lib/generator/angular2.client/templates/index.ts.ejs b/lib/generator/angular.client/templates/index.ts.ejs similarity index 100% rename from lib/generator/angular2.client/templates/index.ts.ejs rename to lib/generator/angular.client/templates/index.ts.ejs diff --git a/lib/generator/angular2.client/templates/ng.module.ts.ejs b/lib/generator/angular.client/templates/ng.module.ts.ejs similarity index 100% rename from lib/generator/angular2.client/templates/ng.module.ts.ejs rename to lib/generator/angular.client/templates/ng.module.ts.ejs diff --git a/lib/generator/angular2.client/templates/package.json.ejs b/lib/generator/angular.client/templates/package.json.ejs similarity index 100% rename from lib/generator/angular2.client/templates/package.json.ejs rename to lib/generator/angular.client/templates/package.json.ejs diff --git a/lib/generator/angular2.client/templates/services.ts.ejs b/lib/generator/angular.client/templates/services.ts.ejs similarity index 97% rename from lib/generator/angular2.client/templates/services.ts.ejs rename to lib/generator/angular.client/templates/services.ts.ejs index eac92cd..f8dc0cd 100644 --- a/lib/generator/angular2.client/templates/services.ts.ejs +++ b/lib/generator/angular.client/templates/services.ts.ejs @@ -17,8 +17,8 @@ import { ErrorReporter } from './errorreporter'; import {<% -referenceTypes.forEach(function(refType){%> - <%- refType.name%>,<%} +complexTypes.forEach(function(type){%> + <%- type.name%>,<%} );%> } from './entities'; <%controllers.forEach(function(ctrl){ diff --git a/lib/generator/angular2.client/templates/entities.ts.ejs b/lib/generator/angular2.client/templates/entities.ts.ejs deleted file mode 100644 index 58688c5..0000000 --- a/lib/generator/angular2.client/templates/entities.ts.ejs +++ /dev/null @@ -1,18 +0,0 @@ -/* tslint:disable:max-line-length */ -//////////////////////////////////////////////////////////////////// -// -// GENERATED CLASS -// -// DO NOT EDIT -// -//////////////////////////////////////////////////////////////////// - - -<%referenceTypes.forEach(function(refType){ -%>export interface <%- refType.name%> {<% -refType.properties.forEach(function(prop){%> - <%- prop.name%>: <%- prop.type.getMappedName('TypeScript')%>;<% -}); %> -}; - -<%}); %> diff --git a/lib/generator/codegeneratorfactory.class.ts b/lib/generator/codegeneratorfactory.class.ts index 2bcbc27..5cb20ea 100644 --- a/lib/generator/codegeneratorfactory.class.ts +++ b/lib/generator/codegeneratorfactory.class.ts @@ -1,35 +1,33 @@ import { GeneratorConfigBasic } from '../persistance/generatorconfig.basic'; import { BaseGenerator } from './basegenerator'; -import { ExpressTSRoutesGenerator } from './express.ts.routes/express.ts.routes.generator'; import { SequelizeTSDalGenerator } from './sequelize.ts.dal/sequelize.ts.dal.generator'; -import { Angular2ClientGenerator } from './angular2.client/angular2.client.generator'; -import { UnirestTSClientGenerator } from './unirest.ts.client/unirest.ts.client.generator'; +import { AngularClientGenerator } from './angular.client/angular.client.generator'; +// import { UnirestTSClientGenerator } from './unirest.ts.client/unirest.ts.client.generator'; import { AndroidORMLiteDalGenerator } from './android.ormlite.dal/android.ormlite.dal.generator'; -import { AndroidRetrofitClientGenerator } from './android.retrofit.client/android.retrofit.client.generator'; +// import { AndroidRetrofitClientGenerator } from './android.retrofit.client/android.retrofit.client.generator'; export class CodeGeneratorFactory { public static getCodeGenerator(type: string, generatorConfigBasic: GeneratorConfigBasic, nicassaJson: string): BaseGenerator { let result: BaseGenerator; switch (type) { - case 'express.ts.routes': - result = new ExpressTSRoutesGenerator(generatorConfigBasic, nicassaJson); - break; case 'sequelize.ts.dal': result = new SequelizeTSDalGenerator(generatorConfigBasic, nicassaJson); break; - case 'angular2.client': - result = new Angular2ClientGenerator(generatorConfigBasic, nicassaJson); + case 'angular.client': + result = new AngularClientGenerator(generatorConfigBasic, nicassaJson); break; case 'unirest.ts.client': - result = new UnirestTSClientGenerator(generatorConfigBasic, nicassaJson); - break; + // result = new UnirestTSClientGenerator(generatorConfigBasic, nicassaJson); + // break; + throw "unirest.ts.client currently disabled"; case 'android.ormlite.dal': result = new AndroidORMLiteDalGenerator(generatorConfigBasic, nicassaJson); break; case 'android.retrofit.client': - result = new AndroidRetrofitClientGenerator(generatorConfigBasic, nicassaJson); - break; + // result = new AndroidRetrofitClientGenerator(generatorConfigBasic, nicassaJson); + // break; + throw "android.retrofit.client currently disabled"; default: throw ('unsupported generator type: ' + type); } diff --git a/lib/generator/express.ts.routes/express.ts.routes.generator.ts b/lib/generator/express.ts.routes/express.ts.routes.generator.ts deleted file mode 100644 index ddef764..0000000 --- a/lib/generator/express.ts.routes/express.ts.routes.generator.ts +++ /dev/null @@ -1,223 +0,0 @@ -const fs = require('fs'); -const process = require('process'); - -import { GeneratorConfigBasic } from '../../persistance/generatorconfig.basic'; -import { GeneratorConfigExpressTSRoutes, ExpressTSRoutesFilter} from '../../persistance/generatorconfig.express.ts.routes'; -import { GeneratorConfigSequelizeTSDal } from '../../persistance/generatorconfig.sequelize.ts.dal'; - -import { BaseGenerator } from '../basegenerator'; -import { RenderTemplate } from '../rendertemplate'; - -import { MetadataSymbolTable } from '../symboltable/metadata/metadatasymboltable'; -import { ControllerSymbol } from '../symboltable/metadata/controllersymbol'; -import { ReferenceTypeSymbol } from '../symboltable/metadata/referencetypesymbol'; -import { MetadataSymbolTableReader } from '../symboltable/metadata/metadatasymboltable.reader'; - -import { DBSymbolTable } from '../symboltable/db/dbsymboltable'; -import { DBSymbolTableReader } from '../symboltable/db/dbsymboltable.reader'; -import { SequelizeTsDalTypeMapper } from '../sequelize.ts.dal/sequelize.ts.dal.typemapper.class'; -import { SequelizeTypescriptMapping } from '../sequelize.ts.dal/sequelize.typescript.mapping'; - -export class ExpressTSRoutesGenerator extends BaseGenerator { - protected generatorConfig: GeneratorConfigExpressTSRoutes; - protected metadataSymbolTable: MetadataSymbolTable; - protected dbSymbolTable: DBSymbolTable; - - constructor(generatorConfigBasic: GeneratorConfigBasic, nicassaJson: string) { - super(generatorConfigBasic, nicassaJson); - this.generatorConfig = generatorConfigBasic; - if (this.generatorConfig !== undefined && this.generatorConfig !== null) { - if (this.generatorConfig.filter === undefined || this.generatorConfig.filter === null) { - let defaultCfg = this.getDefaultConfig(''); - this.generatorConfig.filter = defaultCfg.filter; - } - } - this.templateDir = __dirname + '/templates'; - } - - public getDefaultConfig(name: string): GeneratorConfigExpressTSRoutes { - let expressTSRoutesFilter: ExpressTSRoutesFilter = { - exculdeEntity: [], - exculdeController: [], - onlyEntity: [], - onlyController: [] - } - - let type = "express.ts.routes"; - - let result: GeneratorConfigExpressTSRoutes = { - name: name, - type: type, - active: true, - targetDir: './src', - nicassaParserDBFile: null, - nicassaParserDBGeneratorName: null, - filter: expressTSRoutesFilter - }; - - return result; - } - - protected async generateCode(): Promise { - this.metadataSymbolTable = MetadataSymbolTableReader.readFromJsonString(this.nicassaJson); - this.setLengthToMetaData(); - - let controllers = this.applyControllerFilter(this.generatorConfig.filter, this.metadataSymbolTable.controllers); - let referenceTypes = this.applyReferenceTypeFilter(this.generatorConfig.filter, this.metadataSymbolTable.referenceTypes); - - let data = { - controllers: controllers, - referenceTypes: referenceTypes, - }; - - await RenderTemplate.renderTemplate(true, this, 'routes.ts.ejs', data); - - return await true; - } - - protected applyControllerFilter(filter: ExpressTSRoutesFilter, controllers: ControllerSymbol[]): ControllerSymbol[] { - if (filter === undefined || filter === null) { - return controllers; - } - - if (controllers === undefined || controllers === null || controllers.length === 0) { - return controllers; - } - - let exculdeController: string[] = filter.exculdeController; - let only: string[] = filter.onlyController; - - if (exculdeController === undefined || exculdeController === null) { - exculdeController = []; - } - if (only === undefined || only === null) { - only = []; - } - - let result: ControllerSymbol[] = []; - for (let k = 0; k < controllers.length; k++) { - let ctrl = controllers[k]; - // excluded - if (only.length == 0 && exculdeController.indexOf(ctrl.name) != -1) { - continue; - } - if (only.length > 0 && only.indexOf(ctrl.name) == -1) { - continue; - } - result.push(ctrl); - } - - return result; - } - - protected applyReferenceTypeFilter(filter: ExpressTSRoutesFilter, referenceTypes: ReferenceTypeSymbol[]): ReferenceTypeSymbol[] { - if (referenceTypes === undefined || referenceTypes === null || referenceTypes.length === 0) { - return referenceTypes; - } - - let exculdeEntity: string[] = filter.exculdeEntity; - let only: string[] = filter.onlyEntity; - - if (exculdeEntity === undefined || exculdeEntity === null) { - exculdeEntity = []; - } - if (only === undefined || only === null) { - only = []; - } - - let result: ReferenceTypeSymbol[] = []; - for (let k = 0; k < referenceTypes.length; k++) { - let entity = referenceTypes[k]; - // excluded - if (only.length == 0 && exculdeEntity.indexOf(entity.name) != -1) { - continue; - } - if (only.length > 0 && only.indexOf(entity.name) == -1) { - continue; - } - result.push(entity); - } - - return result; - } - - protected setLengthToMetaData() { - if (this.generatorConfig.nicassaParserDBFile === undefined || this.generatorConfig.nicassaParserDBFile === null) { - return; - } - - if (!fs.existsSync(this.generatorConfig.nicassaParserDBFile)) { - console.error('error: can\'t find nicassaParserDBFile: ' + this.generatorConfig.nicassaParserDBFile + '\''); - process.exit(-1); - } - - let json = null; - try { - json = fs.readFileSync(this.generatorConfig.nicassaParserDBFile); - } catch (err) { - console.error('error: can\'t read nicassaParserDBFile: ' + this.generatorConfig.nicassaParserDBFile + '\''); - process.exit(-1); - } - - if (this.generatorConfig.nicassaParserDBGeneratorName === undefined || this.generatorConfig.nicassaParserDBGeneratorName === null) { - console.error('error: can\'t find nicassaParserDBGeneratorName for the nicassaParserDBFile: ' + this.generatorConfig.nicassaParserDBFile + '\''); - process.exit(-1); - } - - // we need the config... - let gen: GeneratorConfigSequelizeTSDal = BaseGenerator.getGeneratorByName - (this.generatorConfig.nicassaParserDBFile, this.generatorConfig.nicassaParserDBGeneratorName); - - if (gen === undefined || gen === null) { - console.error('error: can\'t find generator with name ' + - this.generatorConfig.nicassaParserDBGeneratorName + ' for the nicassaParserDBFile: ' + this.generatorConfig.nicassaParserDBFile + '\''); - process.exit(-1); - } - - // .. to map with the settings - let dataTypeMapping = SequelizeTypescriptMapping.dataTypeMapping; - let typeMapper: SequelizeTsDalTypeMapper = new SequelizeTsDalTypeMapper(gen, dataTypeMapping); - - this.dbSymbolTable = DBSymbolTableReader.readFromJsonString(json, gen.filter, typeMapper); - this.updateMetaSymbolTableLengthFromDbSymbolTable(this.metadataSymbolTable, this.dbSymbolTable); - } - - protected updateMetaSymbolTableLengthFromDbSymbolTable(meta: MetadataSymbolTable, db: DBSymbolTable) { - if (db.entities === undefined || db.entities === null || db.entities.length === 0) { - return; - } - - if (meta.referenceTypes === undefined || meta.referenceTypes === null || meta.referenceTypes.length === 0) { - return; - } - - // create the map - let entityColumnMap: any = {}; - for (let i = 0; i < db.entities.length; i++) { - let entity = db.entities[i]; - entityColumnMap[entity.getMappedName('TypeScript')] = {}; - for (let k = 0; k < entity.columns.length; k++) { - let column = entity.columns[k]; - if (column.length === undefined || column.length === null || column.length < 0) { - continue; - } - entityColumnMap[entity.getMappedName('TypeScript')][column.getMappedName('TypeScript')] = column.length; - } - } - - for (let i = 0; i < meta.referenceTypes.length; i++) { - let ref = meta.referenceTypes[i]; - if (!entityColumnMap.hasOwnProperty(ref.name)) { - continue; - } - for (let k = 0; k < ref.properties.length; k++) { - let prop = ref.properties[k]; - if (!entityColumnMap[ref.name].hasOwnProperty(prop.name)) { - continue; - } - prop.length = entityColumnMap[ref.name][prop.name]; - } - } - } -} - diff --git a/lib/generator/express.ts.routes/templates/routes.ts.ejs b/lib/generator/express.ts.routes/templates/routes.ts.ejs deleted file mode 100644 index 4fefc6a..0000000 --- a/lib/generator/express.ts.routes/templates/routes.ts.ejs +++ /dev/null @@ -1,193 +0,0 @@ -/* tslint:disable:max-line-length */ -//////////////////////////////////////////////////////////////////// -// -// GENERATED CLASS -// -// DO NOT EDIT -// -//////////////////////////////////////////////////////////////////// - -import { Request, Response, NextFunction } from "express"; -<%controllers.forEach(function(ctrl){%> -import { <%- ctrl.name%> } from '<%- ctrl.getMappedLocation()%>';<% -}); %> - -const models: any = { -<%referenceTypes.forEach(function(refType){ -%> '<%- refType.name%>': {<%refType.properties.forEach(function(prop){%> - '<%- prop.name%>': { typeName: '<%- prop.type.name%>', required: <%- prop.required%>, length: <%- prop.length%> },<% -}); %> - }, -<% -}); %> -}; - -export function RegisterRoutes(app: any) { -<%controllers.forEach(function(ctrl){%><% - ctrl.methods.forEach(function(method){ -%> app.<%- method.method%>('/<%- ctrl.path%><%- method.getPath("Server")%>', (req: Request, res: Response, next: NextFunction) => { - const params = {<% - method.parameters.forEach(function(param){ -%> - '<%- param.name%>': { typeName: '<%- param.type.name%>', required: <%- param.required%> <%if(param.type.isArray) {%>arrayType: '<%- param.type.elementType.name%>' <%}%>},<% -}); %> - }; - const isScalarResult = <%- method.type.isPrimitive%>; - let validatedParams: any[] = []; - try { - validatedParams = getValidatedParams(params, req, '<%- method.bodyParamName%>'); - } catch (err) { - //res.status(err.status || 500); - //res.json(err); - next(err); - return; - } - - const controller = new <%- ctrl.name%>(); - promiseHandler(controller.<%- method.name%>.apply(controller, validatedParams), isScalarResult, res, next); - }); -<%}); %><%}); %> - function promiseHandler(promise: any, isScalarResult: boolean, response: Response, next: NextFunction) { - return promise - .then((data: any) => { - if(isScalarResult) { - if (data !== undefined || data !== null) { - response.send(data+''); - } else { - response.sendStatus(204); - response.end(); - } - } else { - if (data) { - response.json(data); - } else { - response.sendStatus(204); - response.end(); - } - } - }) - .catch((error: any) => { - // response.sendStatus(error.status || 500); - // response.json(error); - next(error); - }); - } - - function getRequestParams(request: Request, bodyParamName?: string) { - const merged: any = {}; - if (bodyParamName) { - merged[bodyParamName] = request.body; - } - - for (let attrname in request.params) { merged[attrname] = request.params[attrname]; } - for (let attrname in request.query) { merged[attrname] = request.query[attrname]; } - return merged; - } - - function getValidatedParams(params: any, request: Request, bodyParamName?: string): any[] { - const requestParams = getRequestParams(request, bodyParamName); - - return Object.keys(params).map(key => { - return validateParam(params[key], requestParams[key], key); - }); - } -} - -function validateParam(typeData: any, value: any, name?: string) { - if (value === undefined) { - if (typeData.required) { - throw new InvalidRequestException(name + ' is a required parameter.'); - } else { - return undefined; - } - } - - switch (typeData.typeName) { - case 'string': - return validateString(value, name, typeData.length); - case 'boolean': - return validateBool(value, name); - case 'number': - return validateNumber(value, name); - case 'array': - return validateArray(value, typeData.arrayType, name); - case 'datetime': - if (!typeData.required) { - return null; - } - return validateDate(value, name); - case 'buffer': - return value; - default: - return validateModel(value, typeData.typeName); - } -} - -function validateNumber(numberValue: string, name: string): number { - const parsedNumber = parseInt(numberValue, 10); - if (isNaN(parsedNumber)) { - throw new InvalidRequestException(name + 'should be a valid number.'); - } - - return parsedNumber; -} - -function validateString(stringValue: string, name: string, length: number) { - if (stringValue === undefined || stringValue === null) { - return stringValue; - } - let str = stringValue.toString(); - if (length >0 && str.length > length) { - throw new InvalidRequestException(name + 'maximum length of ' + length + ' exceeded.'); - } - return str; -} - -function validateDate(stringValue: string, name: string) { - if (stringValue !== undefined && stringValue !== null) { - if (stringValue.trim().length !== 0) { - let date = new Date(stringValue); - if (date instanceof Date && isFinite(date)) { - return date; - } - } - } - throw new InvalidRequestException(name + 'should be valid date value.'); -} - -function validateBool(boolValue: any, name: string): boolean { - if (boolValue === true || boolValue === false) { return boolValue; } - if (boolValue.toLowerCase() === 'true') { return true; } - if (boolValue.toLowerCase() === 'false') { return false; } - - throw new InvalidRequestException(name + 'should be valid boolean value.'); -} - -function validateModel(modelValue: any, typeName: string): any { - const modelDefinition = models[typeName]; - - Object.keys(modelDefinition).forEach((key: string) => { - const property = modelDefinition[key]; - modelValue[key] = validateParam(property, modelValue[key], key); - }); - - return modelValue; -} - -function validateArray(array: any[], arrayType: string, arrayName: string): any[] { - return array.map(element => validateParam({ - required: true, - typeName: arrayType, - }, element)); -} - -interface Exception extends Error { - status: number; -} - -class InvalidRequestException implements Exception { - public status = 400; - public name = 'Invalid Request'; - - constructor(public message: string) { } -} diff --git a/lib/generator/symboltable/metadata/arraytypesymbol.ts b/lib/generator/symboltable/metadata/arraytypesymbol.ts deleted file mode 100644 index c130804..0000000 --- a/lib/generator/symboltable/metadata/arraytypesymbol.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { TypeSymbol } from './typesymbol'; - -export interface ArrayTypeSymbol extends TypeSymbol { - elementType: TypeSymbol; -} diff --git a/lib/generator/symboltable/metadata/controllersymbol.ts b/lib/generator/symboltable/metadata/controllersymbol.ts deleted file mode 100644 index b26b788..0000000 --- a/lib/generator/symboltable/metadata/controllersymbol.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { MethodSymbol } from './methodsymbol'; - -export interface ControllerSymbol { - location: string; - methods: MethodSymbol[]; - name: string; - path: string; - jwtUserProperty: string; - getMappedLocation(): string; -} diff --git a/lib/generator/symboltable/metadata/injecttypesymbol.ts b/lib/generator/symboltable/metadata/injecttypesymbol.ts deleted file mode 100644 index b0a2a70..0000000 --- a/lib/generator/symboltable/metadata/injecttypesymbol.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { ParameterSymbol } from './parametersymbol'; - -export interface InjectTypeSymbol { - parameter: ParameterSymbol; - typeName: string; -} diff --git a/lib/generator/symboltable/metadata/metadatasymboltable.reader.ts b/lib/generator/symboltable/metadata/metadatasymboltable.reader.ts deleted file mode 100644 index 1fdaa80..0000000 --- a/lib/generator/symboltable/metadata/metadatasymboltable.reader.ts +++ /dev/null @@ -1,265 +0,0 @@ -import { Metadata, Type, InjectType, PrimitiveType, ArrayType, ReferenceType, Parameter, Property, NicassaParserTSExpressApi } from 'nicassa-parser-ts-express-api'; - -import { TopLevel } from '../../../persistance/toplevel'; - -import { MetadataSymbolTable } from './metadatasymboltable'; -import { ControllerSymbol } from './controllersymbol'; -import { MethodSymbol } from './methodsymbol'; -import { TypeSymbol } from './typesymbol'; -import { ParameterSymbol } from './parametersymbol'; -import { InjectTypeSymbol } from './injecttypesymbol'; -import { PropertySymbol } from './propertysymbol'; -import { ReferenceTypeSymbol } from './referencetypesymbol'; -import { PrimitiveTypeSymbol } from './primitivetypesymbol'; -import { ArrayTypeSymbol } from './arraytypesymbol'; - -export class MetadataSymbolTableReader { - public static readFromJsonString(json: string): MetadataSymbolTable { - let metadata: Metadata = MetadataSymbolTableReader.readSchema(json); - let result = MetadataSymbolTableReader.createSymbolTable(metadata); - return result; - } - - protected static readSchema(json: string): Metadata { - let toplevel: TopLevel = JSON.parse(json); - let nicassaParserTSExpressApi: NicassaParserTSExpressApi = toplevel.nicassaParserTSExpressApi; - if (nicassaParserTSExpressApi === undefined || nicassaParserTSExpressApi.metadata === undefined) { - return null; - } - - return nicassaParserTSExpressApi.metadata; - } - - protected static createSymbolTable(metadata: Metadata): MetadataSymbolTable { - let result: MetadataSymbolTable = { - controllers: [], - referenceTypes: [] - } - - if (metadata === undefined || metadata === null) { - return result; - } - - if (metadata.Controllers !== undefined) { - for (let i = 0; i < metadata.Controllers.length; i++) { - let ctrl = metadata.Controllers[i]; - let controllerSymbol: ControllerSymbol = { - location: ctrl.location, - methods: [], - name: ctrl.name, - path: ctrl.path, - jwtUserProperty: ctrl.jwtUserProperty, - getMappedLocation: (): string => { - if (controllerSymbol.location === undefined || controllerSymbol.location === null) { - return controllerSymbol.location - } - return controllerSymbol.location.replace(/\.[^/.]+$/, ""); - } - } - result.controllers.push(controllerSymbol); - - if (ctrl.methods === undefined || ctrl.methods === null) { - continue; - } - - for (let k = 0; k < ctrl.methods.length; k++) { - let method = ctrl.methods[k]; - let methodSymbol: MethodSymbol = { - description: method.description, - example: method.example, - method: method.method, - name: method.name, - parameters: [], - path: method.path, - type: null, - tags: method.tags, - bodyParamName: null, - getPath: (kind: string): string => { - if(kind === "Server") { - if (methodSymbol.path === undefined || methodSymbol.path === null) { - return methodSymbol.path - } - return methodSymbol.path.replace(/{/g, ':').replace(/}/g, ''); - } - if(kind === "Client") { - if (methodSymbol.path === undefined || methodSymbol.path === null) { - return methodSymbol.path - } - return methodSymbol.path.replace(/{/g, '\' + this\.urlEncode(').replace(/}/g, ') + \''); - } - return methodSymbol.path; - }, - needsBody: (): boolean => { - if (methodSymbol.method === 'post' || - methodSymbol.method === 'patch' || - methodSymbol.method === 'put') { - return true; - } - return false; - } - } - - const bodyParameter = method.parameters.find(parameter => parameter.in === 'body'); - methodSymbol.bodyParamName = bodyParameter ? bodyParameter.name : undefined; - - methodSymbol.type = MetadataSymbolTableReader.createTypeSymbol(method.type); - MetadataSymbolTableReader.createParameterSymbols(methodSymbol, method.parameters); - - controllerSymbol.methods.push(methodSymbol); - } - } - } - - if (metadata.ReferenceTypes !== undefined) { - for (let key in metadata.ReferenceTypes) { - let referenceType = metadata.ReferenceTypes[key]; - let referenceTypeSymbol = MetadataSymbolTableReader.createReferenceTypeSymbol(referenceType); - referenceTypeSymbol.properties = MetadataSymbolTableReader.createProperties(referenceType.properties); - result.referenceTypes.push(referenceTypeSymbol); - } - } - return result; - } - - protected static createProperties(properties: Property[]): PropertySymbol[] { - let result: PropertySymbol[] = []; - if (properties === undefined || properties === null || properties.length == 0) { - return result; - } - - for (let i = 0; i < properties.length; i++) { - let property = properties[i]; - - let propertySymbol: PropertySymbol = { - description: property.description, - name: property.name, - length: -1, - type: null, - required: property.required - } - propertySymbol.type = MetadataSymbolTableReader.createTypeSymbol(property.type); - result.push(propertySymbol); - } - - return result; - } - - protected static createParameterSymbols(methodSymbol: MethodSymbol, parameters: Parameter[]) { - if (parameters === undefined || parameters === null || parameters.length == 0) { - return; - } - - for (let k = 0; k < parameters.length; k++) { - let parameter = parameters[k]; - let parameterSymbol: ParameterSymbol = { - description: parameter.description, - in: parameter.in, - name: parameter.name, - required: parameter.required, - type: null, - injected: undefined - }; - - parameterSymbol.type = MetadataSymbolTableReader.createTypeSymbol(parameter.type); - parameterSymbol.injected = MetadataSymbolTableReader.createInjectedSymbol(parameterSymbol, parameter.injected); - methodSymbol.parameters.push(parameterSymbol); - } - } - - protected static createInjectedSymbol(parameterSymbol: ParameterSymbol, injectType: InjectType): InjectTypeSymbol { - if (injectType === null || injectType === undefined) { - return undefined; - } - - let result: InjectTypeSymbol = { - parameter: parameterSymbol, - typeName: injectType - }; - - return result; - } - - protected static createPrimitiveTypeSymbol(type: PrimitiveType): PrimitiveTypeSymbol { - let result: PrimitiveTypeSymbol = { - isPrimitive: true, - isArray: false, - isReferenceType: false, - getMappedName: (kind: string) => { - if (result.name === undefined || result.name === null) { - return result.name; - } - if (kind === "Java") { - if (result.name === 'string') { - return 'String'; - } - if (result.name === 'boolean') { - return 'Boolean'; - } - if (result.name === 'number') { - return 'Integer'; - } - if (result.name === 'datetime') { - return 'java.util.Date'; - } - if (result.name === 'buffer') { - return 'byte[]'; - } - } else { - if (result.name === 'datetime') { - return 'Date'; - } - if (result.name === 'buffer') { - return 'Buffer'; - } - } - return result.name; - }, - name: type - } - return result; - } - - protected static createArrayTypeSymbolSymbol(type: ArrayType): ArrayTypeSymbol { - let result: ArrayTypeSymbol = { - isPrimitive: false, - isArray: true, - isReferenceType: false, - getMappedName: (kind: string) => { - return "Array"; - }, - elementType: null - } - result.elementType = MetadataSymbolTableReader.createTypeSymbol(type.elementType); - return result; - } - - protected static createReferenceTypeSymbol(type: ReferenceType): ReferenceTypeSymbol { - let result: ReferenceTypeSymbol = { - isPrimitive: false, - isArray: false, - isReferenceType: true, - getMappedName: (kind: string) => { - return result.name; - }, - description: type.description, - name: type.name, - properties: [] - } - - result.properties = MetadataSymbolTableReader.createProperties(type.properties); - return result; - } - - protected static createTypeSymbol(type: Type): TypeSymbol { - if (typeof type === 'string' || type instanceof String) { - return MetadataSymbolTableReader.createPrimitiveTypeSymbol(type); - } - - const arrayType = type as ArrayType; - if (arrayType.elementType) { - return MetadataSymbolTableReader.createArrayTypeSymbolSymbol(type); - } - - return MetadataSymbolTableReader.createReferenceTypeSymbol((type as ReferenceType)); - } -} diff --git a/lib/generator/symboltable/metadata/metadatasymboltable.ts b/lib/generator/symboltable/metadata/metadatasymboltable.ts deleted file mode 100644 index deeadca..0000000 --- a/lib/generator/symboltable/metadata/metadatasymboltable.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { ControllerSymbol } from './controllersymbol'; -import { ReferenceTypeSymbol } from './referencetypesymbol'; - -export interface MetadataSymbolTable { - controllers: ControllerSymbol[]; - referenceTypes: ReferenceTypeSymbol[]; -} diff --git a/lib/generator/symboltable/metadata/methodsymbol.ts b/lib/generator/symboltable/metadata/methodsymbol.ts deleted file mode 100644 index f78f6cc..0000000 --- a/lib/generator/symboltable/metadata/methodsymbol.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { ParameterSymbol } from './parametersymbol'; -import { TypeSymbol } from './typesymbol'; - -export interface MethodSymbol { - description: string; - example: any; - method: string; - name: string; - parameters: ParameterSymbol[]; - path: string; - type: TypeSymbol; - tags: string[]; - bodyParamName?: string; - getPath(kind: string): string; - needsBody(): boolean; -} diff --git a/lib/generator/symboltable/metadata/parametersymbol.ts b/lib/generator/symboltable/metadata/parametersymbol.ts deleted file mode 100644 index d0ad08e..0000000 --- a/lib/generator/symboltable/metadata/parametersymbol.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { TypeSymbol } from './typesymbol'; -import { InjectTypeSymbol } from './injecttypesymbol'; - -export interface ParameterSymbol { - description: string; - in: string; - name: string; - required: boolean; - type: TypeSymbol; - injected?: InjectTypeSymbol; -} diff --git a/lib/generator/symboltable/metadata/primitivetypesymbol.ts b/lib/generator/symboltable/metadata/primitivetypesymbol.ts deleted file mode 100644 index ede8701..0000000 --- a/lib/generator/symboltable/metadata/primitivetypesymbol.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { TypeSymbol } from './typesymbol'; - -export interface PrimitiveTypeSymbol extends TypeSymbol { - name: string; -} diff --git a/lib/generator/symboltable/metadata/propertysymbol.ts b/lib/generator/symboltable/metadata/propertysymbol.ts deleted file mode 100644 index f8a4204..0000000 --- a/lib/generator/symboltable/metadata/propertysymbol.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PropertySymbol } from './propertysymbol'; -import { TypeSymbol } from './typesymbol'; - -export interface PropertySymbol { - description: string; - name: string; - length: number; - type: TypeSymbol; - required: boolean; -} diff --git a/lib/generator/symboltable/metadata/referencetypesymbol.ts b/lib/generator/symboltable/metadata/referencetypesymbol.ts deleted file mode 100644 index ba194cc..0000000 --- a/lib/generator/symboltable/metadata/referencetypesymbol.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { TypeSymbol } from './typesymbol'; -import { PropertySymbol } from './propertysymbol'; - -export interface ReferenceTypeSymbol extends TypeSymbol { - description: string; - name: string; - properties: PropertySymbol[]; -} diff --git a/lib/generator/symboltable/metadata/typesymbol.ts b/lib/generator/symboltable/metadata/typesymbol.ts deleted file mode 100644 index ada3e7d..0000000 --- a/lib/generator/symboltable/metadata/typesymbol.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface TypeSymbol { - isPrimitive: boolean; - isArray: boolean; - isReferenceType: boolean; - getMappedName(kind: string): string; -} diff --git a/lib/generator/unirest.ts.client/unirest.ts.client.generator.ts b/lib/generator/unirest.ts.client/unirest.ts.client.generator.ts index bf810b2..7bfc4b0 100644 --- a/lib/generator/unirest.ts.client/unirest.ts.client.generator.ts +++ b/lib/generator/unirest.ts.client/unirest.ts.client.generator.ts @@ -54,7 +54,6 @@ export class UnirestTSClientGenerator extends BaseGenerator { type: type, active: true, targetDir: './unirest-ts-client', - parentServerGeneratorConfigName: 'express.ts.routes', cleanTargetDir: false, createProject: false, projectName: 'unirest-ts-client', diff --git a/lib/persistance/generatorconfig.android.retrofit.client.ts b/lib/persistance/generatorconfig.android.retrofit.client.ts index dbdb9fa..e8a1ded 100644 --- a/lib/persistance/generatorconfig.android.retrofit.client.ts +++ b/lib/persistance/generatorconfig.android.retrofit.client.ts @@ -8,7 +8,6 @@ export interface AndroidRetrofitFilter { } export interface GeneratorConfigAndroidRetrofitClient extends GeneratorConfigBasic { - parentServerGeneratorConfigName: string; cleanTargetDir: boolean; createProject: boolean; projectName?: string; diff --git a/lib/persistance/generatorconfig.angular2.client.ts b/lib/persistance/generatorconfig.angular.client.ts similarity index 62% rename from lib/persistance/generatorconfig.angular2.client.ts rename to lib/persistance/generatorconfig.angular.client.ts index 671a4b0..f9edf3c 100644 --- a/lib/persistance/generatorconfig.angular2.client.ts +++ b/lib/persistance/generatorconfig.angular.client.ts @@ -1,18 +1,18 @@ import { GeneratorConfigBasic } from './generatorconfig.basic'; -export interface Angular2ClientFilter { +export interface AngularClientFilter { exculdeEntity?: string[]; exculdeService?: string[]; onlyEntity?: string[]; onlyService?: string[]; } -export interface GeneratorConfigAngular2Client extends GeneratorConfigBasic { +export interface GeneratorConfigAngularClient extends GeneratorConfigBasic { + swaggerFile: string; customErrorHandler: boolean; - parentServerGeneratorConfigName: string; cleanTargetDir: boolean; createProject: boolean; ngModuleName: string; projectName?: string; - filter?: Angular2ClientFilter; + filter?: AngularClientFilter; } diff --git a/lib/persistance/generatorconfig.express.ts.routes.ts b/lib/persistance/generatorconfig.express.ts.routes.ts deleted file mode 100644 index 8406691..0000000 --- a/lib/persistance/generatorconfig.express.ts.routes.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { GeneratorConfigBasic } from './generatorconfig.basic'; - -export interface ExpressTSRoutesFilter { - exculdeEntity?: string[]; - exculdeController?: string[]; - onlyEntity?: string[]; - onlyController?: string[]; -} - -export interface GeneratorConfigExpressTSRoutes extends GeneratorConfigBasic { - nicassaParserDBFile?: string; - nicassaParserDBGeneratorName?: string; - filter?: ExpressTSRoutesFilter; -} diff --git a/lib/persistance/generatorconfig.unirest.ts.client.ts b/lib/persistance/generatorconfig.unirest.ts.client.ts index d59b12f..83fa045 100644 --- a/lib/persistance/generatorconfig.unirest.ts.client.ts +++ b/lib/persistance/generatorconfig.unirest.ts.client.ts @@ -8,7 +8,6 @@ export interface UnirestTSClientFilter { } export interface GeneratorConfigUnirestTSClient extends GeneratorConfigBasic { - parentServerGeneratorConfigName: string; cleanTargetDir: boolean; createProject: boolean; ngModuleName: string; diff --git a/lib/swagger/apiparser.class.ts b/lib/swagger/apiparser.class.ts index 678f5c2..7dbffc1 100644 --- a/lib/swagger/apiparser.class.ts +++ b/lib/swagger/apiparser.class.ts @@ -184,7 +184,7 @@ export class ApiParser { // bug in tsoa regEx = new RegExp('\\[\]', 'gi'); while (true) { - uniqueName = entity.replace(regEx, replacement); + uniqueName = uniqueName.replace(regEx, replacement); // console.log("NewName", entity, uniqueName); if (entity === uniqueName) { break; @@ -214,8 +214,8 @@ export class ApiParser { if (this.definitionsDict.hasOwnProperty(entity)) { let definition = this.definitionsDict[entity]; let complexType: ComplexType = new ComplexType(); - complexType.name = this.definitionsDict[entity].complexNameUnique; // map - complexType.type = complexType.name; + complexType.name = entity; + complexType.type = this.definitionsDict[entity].complexNameUnique; // map for (let k = 0; k < definition.propertyTypes.length; k++) { let propertyType: PropertyType = definition.propertyTypes[k]; if (propertyType.isReference) { @@ -227,9 +227,10 @@ export class ApiParser { let ref = propertyType.$ref; let arr = ref.split('/'); let resolvedType = arr[arr.length - 1]; + + resolvedType = this.definitionsDict[resolvedType].complexNameUnique; // map this.definitionsDict[entity].propertyTypes[k].type = resolvedType; delete this.definitionsDict[entity].propertyTypes[k].$ref; // kill this - resolvedType = this.definitionsDict[resolvedType].complexNameUnique; // map } complexType.properties.push(propertyType); } @@ -317,4 +318,4 @@ export class ApiParser { return result; } -} \ No newline at end of file +} diff --git a/lib/swagger/entites/propertytype.class.ts b/lib/swagger/entites/propertytype.class.ts index aac6ca2..180f79e 100644 --- a/lib/swagger/entites/propertytype.class.ts +++ b/lib/swagger/entites/propertytype.class.ts @@ -1,3 +1,5 @@ +import { TypeMapping } from '../type.mapping'; + export type TypeNames = '' | 'int32' | 'int64' @@ -10,6 +12,8 @@ export type TypeNames = '' | 'base64' | 'complex'; +export type getMappedTypeHandler = (kind: string) => string; + export class PropertyType { get isComplexType(): boolean { return !this.isPrimitive; @@ -25,6 +29,16 @@ export class PropertyType { name: string = ''; enums: string[] = []; + getMappedType: getMappedTypeHandler = (kind: string) => { + let type = this.type.toLowerCase(); + if (TypeMapping.dataTypeMapping.hasOwnProperty(kind)) { + if (TypeMapping.dataTypeMapping[kind].hasOwnProperty(type)) { + return TypeMapping.dataTypeMapping[kind][type]; + } + } + return this.type; + } + // reference type - this needs to be resolved later $ref: string; @@ -168,6 +182,7 @@ export class PropertyType { break; case 'object': console.log(`notice: type '${entityName}' property '${name}' has object type - treating as string`); + result.type = 'string'; break; default: throw 'createFromType: unknown data type ' + data.type; @@ -175,4 +190,4 @@ export class PropertyType { // console.log(result); return result; } -} \ No newline at end of file +} diff --git a/lib/swagger/type.mapping.ts b/lib/swagger/type.mapping.ts new file mode 100644 index 0000000..69e05e2 --- /dev/null +++ b/lib/swagger/type.mapping.ts @@ -0,0 +1,17 @@ +export class TypeMapping { + public static dataTypeMapping: { [mappings: string]: { [dbtype: string]: string } } = { + // we might need other types for required attributes + // e.g. in java int <-> Integer + "TypeScript": { + int32: "number", + int64: "number", + string: "string", + float: "number", + double: "number", + date: "Date", + boolean: "boolean", + enum: "string", + base64: "Buffer" + } + } +} diff --git a/lib/tools/cmdlineparser.class.ts b/lib/tools/cmdlineparser.class.ts index a7f6818..9b12e53 100644 --- a/lib/tools/cmdlineparser.class.ts +++ b/lib/tools/cmdlineparser.class.ts @@ -22,7 +22,7 @@ export class CmdLineParser { abbr: 't', metavar: 'generator', required: true, - help: 'type of the generator (sequelize.ts.dal, express.ts.routes, angular2.client, unirest.ts.client, android.ormlite.dal, android.retrofit.client)' + help: 'type of the generator (sequelize.ts.dal, angular.client, unirest.ts.client, android.ormlite.dal, android.retrofit.client)' }) .option('name', { abbr: 'n', diff --git a/package.json b/package.json index c915871..96bbab8 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "tyoescript", "android", "angular2", + "angular4", "mdd", "object relational mapper", "json", diff --git a/test/complextypes/controller.ts b/test/complextypes/controller.ts index 5124128..d561a13 100644 --- a/test/complextypes/controller.ts +++ b/test/complextypes/controller.ts @@ -452,4 +452,4 @@ export interface CustomError extends Error { export interface Result { value: 'success' | 'failure'; -} \ No newline at end of file +}