From 964a9a96963d7ae44f2fff395e18a517903f326d Mon Sep 17 00:00:00 2001 From: Samuel Beliveau Date: Fri, 2 Dec 2016 10:24:32 -0500 Subject: [PATCH] Support for standalone enums in Typescript-Angular2 Improved typescript primitive detection for tagging type with models namespace --- .../AbstractTypeScriptClientCodegen.java | 6 ++++ .../TypeScriptAngular2ClientCodegen.java | 14 +++++--- .../typescript-angular2/model.mustache | 33 ++----------------- .../typescript-angular2/modelEnum.mustache | 12 +++++++ .../typescript-angular2/modelGeneric.mustache | 28 ++++++++++++++++ .../typescript-angular2/default/api/PetApi.ts | 2 +- .../default/api/StoreApi.ts | 2 +- .../default/api/UserApi.ts | 2 +- 8 files changed, 60 insertions(+), 39 deletions(-) create mode 100644 modules/swagger-codegen/src/main/resources/typescript-angular2/modelEnum.mustache create mode 100644 modules/swagger-codegen/src/main/resources/typescript-angular2/modelGeneric.mustache diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractTypeScriptClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractTypeScriptClientCodegen.java index 9322af82e95b..e1b05af4ebb1 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractTypeScriptClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractTypeScriptClientCodegen.java @@ -26,6 +26,7 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp protected String modelPropertyNaming= "camelCase"; protected Boolean supportsES6 = true; + protected HashSet languageGenericTypes; public AbstractTypeScriptClientCodegen() { super(); @@ -58,6 +59,11 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp "any", "Error" )); + + languageGenericTypes = new HashSet(Arrays.asList( + "Array" + )); + instantiationTypes.put("array", "Array"); typeMapping = new HashMap(); diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TypeScriptAngular2ClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TypeScriptAngular2ClientCodegen.java index aeb5d774add2..91ed4f35f86e 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TypeScriptAngular2ClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TypeScriptAngular2ClientCodegen.java @@ -132,7 +132,7 @@ public class TypeScriptAngular2ClientCodegen extends AbstractTypeScriptClientCod @Override public String getSwaggerType(Property p) { String swaggerType = super.getSwaggerType(p); - if(languageSpecificPrimitives.contains(swaggerType)) { + if(isLanguagePrimitive(swaggerType) || isLanguageGenericType(swaggerType)) { return swaggerType; } return addModelPrefix(swaggerType); @@ -146,15 +146,19 @@ public class TypeScriptAngular2ClientCodegen extends AbstractTypeScriptClientCod type = swaggerType; } - if (!startsWithLanguageSpecificPrimitiv(type)) { + if (!isLanguagePrimitive(type) && !isLanguageGenericType(type)) { type = "models." + swaggerType; } return type; } - private boolean startsWithLanguageSpecificPrimitiv(String type) { - for (String langPrimitive:languageSpecificPrimitives) { - if (type.startsWith(langPrimitive)) { + private boolean isLanguagePrimitive(String type) { + return languageSpecificPrimitives.contains(type); + } + + private boolean isLanguageGenericType(String type) { + for (String genericType: languageGenericTypes) { + if (type.startsWith(genericType + "<")) { return true; } } diff --git a/modules/swagger-codegen/src/main/resources/typescript-angular2/model.mustache b/modules/swagger-codegen/src/main/resources/typescript-angular2/model.mustache index d0e544c4e2fa..410810763d87 100644 --- a/modules/swagger-codegen/src/main/resources/typescript-angular2/model.mustache +++ b/modules/swagger-codegen/src/main/resources/typescript-angular2/model.mustache @@ -8,35 +8,6 @@ import * as models from './models'; * {{{description}}} */ {{/description}} -export interface {{classname}} {{#parent}}extends models.{{{parent}}} {{/parent}}{ -{{#additionalPropertiesType}} - [key: string]: {{{additionalPropertiesType}}}{{#hasVars}} | any{{/hasVars}}; - -{{/additionalPropertiesType}} -{{#vars}} -{{#description}} - /** - * {{{description}}} - */ -{{/description}} - {{name}}{{^required}}?{{/required}}: {{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{datatype}}}{{/isEnum}}; - -{{/vars}} -} -{{#hasEnums}} -export namespace {{classname}} { -{{#vars}} -{{#isEnum}} - export enum {{enumName}} { - {{#allowableValues}} - {{#enumVars}} - {{{name}}} = {{{value}}}{{^-last}},{{/-last}} - {{/enumVars}} - {{/allowableValues}} - } -{{/isEnum}} -{{/vars}} -} -{{/hasEnums}} +{{#isEnum}}{{>modelEnum}}{{/isEnum}}{{^isEnum}}{{>modelGeneric}}{{/isEnum}} {{/model}} -{{/models}} +{{/models}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/typescript-angular2/modelEnum.mustache b/modules/swagger-codegen/src/main/resources/typescript-angular2/modelEnum.mustache new file mode 100644 index 000000000000..478864841185 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/typescript-angular2/modelEnum.mustache @@ -0,0 +1,12 @@ +{{#description}} + /** + * {{{description}}} + */ +{{/description}} +export enum {{classname}} { +{{#allowableValues}} +{{#enumVars}} + {{{name}}} = {{{value}}}{{^-last}},{{/-last}} +{{/enumVars}} +{{/allowableValues}} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/typescript-angular2/modelGeneric.mustache b/modules/swagger-codegen/src/main/resources/typescript-angular2/modelGeneric.mustache new file mode 100644 index 000000000000..fbe96c21506c --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/typescript-angular2/modelGeneric.mustache @@ -0,0 +1,28 @@ +export interface {{classname}} {{#parent}}extends models.{{{parent}}} {{/parent}}{ +{{#additionalPropertiesType}} + [key: string]: {{{additionalPropertiesType}}}{{#hasVars}} | any{{/hasVars}}; + +{{/additionalPropertiesType}} +{{#vars}} + {{#description}} + /** + * {{{description}}} + */ + {{/description}} + {{name}}{{^required}}?{{/required}}: {{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{datatype}}}{{/isEnum}}; + +{{/vars}} +}{{#hasEnums}} +export namespace {{classname}} { +{{#vars}} + {{#isEnum}} + export enum {{enumName}} { + {{#allowableValues}} + {{#enumVars}} + {{{name}}} = {{{value}}}{{^-last}},{{/-last}} + {{/enumVars}} + {{/allowableValues}} + } + {{/isEnum}} +{{/vars}} +}{{/hasEnums}} \ No newline at end of file diff --git a/samples/client/petstore/typescript-angular2/default/api/PetApi.ts b/samples/client/petstore/typescript-angular2/default/api/PetApi.ts index b2feacfc4e1b..d6b62cbdd474 100644 --- a/samples/client/petstore/typescript-angular2/default/api/PetApi.ts +++ b/samples/client/petstore/typescript-angular2/default/api/PetApi.ts @@ -27,7 +27,7 @@ import { Configuration } from '../configurat @Injectable() export class PetApi { - protected basePath = 'http://petstore.swagger.io/v2'; + protected basePath = ''; public defaultHeaders: Headers = new Headers(); public configuration: Configuration = new Configuration(); diff --git a/samples/client/petstore/typescript-angular2/default/api/StoreApi.ts b/samples/client/petstore/typescript-angular2/default/api/StoreApi.ts index b3d6ea61e60a..4180f1bd5f7a 100644 --- a/samples/client/petstore/typescript-angular2/default/api/StoreApi.ts +++ b/samples/client/petstore/typescript-angular2/default/api/StoreApi.ts @@ -27,7 +27,7 @@ import { Configuration } from '../configurat @Injectable() export class StoreApi { - protected basePath = 'http://petstore.swagger.io/v2'; + protected basePath = ''; public defaultHeaders: Headers = new Headers(); public configuration: Configuration = new Configuration(); diff --git a/samples/client/petstore/typescript-angular2/default/api/UserApi.ts b/samples/client/petstore/typescript-angular2/default/api/UserApi.ts index 25f38a899a4c..b0ab2101ff9a 100644 --- a/samples/client/petstore/typescript-angular2/default/api/UserApi.ts +++ b/samples/client/petstore/typescript-angular2/default/api/UserApi.ts @@ -27,7 +27,7 @@ import { Configuration } from '../configurat @Injectable() export class UserApi { - protected basePath = 'http://petstore.swagger.io/v2'; + protected basePath = ''; public defaultHeaders: Headers = new Headers(); public configuration: Configuration = new Configuration();