From f87bb12ebb3264097c81598e0bb1aec0fdc879a5 Mon Sep 17 00:00:00 2001 From: Martin Hardorf Date: Tue, 16 Jun 2015 10:44:05 +0200 Subject: [PATCH 1/7] Added support for TypeScript generation for AngularJS and Node.js --- .../TypeScriptAngularClientCodegen.java | 25 +++ .../TypeScriptNodeClientCodegen.java | 169 ++++++++++++++++++ .../services/io.swagger.codegen.CodegenConfig | 2 + .../TypeScript-Angular/api.d.mustache | 13 ++ .../resources/TypeScript-Angular/api.mustache | 68 +++++++ .../TypeScript-Angular/model.mustache | 30 ++++ .../resources/TypeScript-node/api.mustache | 73 ++++++++ .../resources/TypeScript-node/model.mustache | 24 +++ 8 files changed, 404 insertions(+) create mode 100644 modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TypeScriptAngularClientCodegen.java create mode 100644 modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TypeScriptNodeClientCodegen.java create mode 100644 modules/swagger-codegen/src/main/resources/TypeScript-Angular/api.d.mustache create mode 100644 modules/swagger-codegen/src/main/resources/TypeScript-Angular/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/TypeScript-Angular/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/TypeScript-node/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/TypeScript-node/model.mustache diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TypeScriptAngularClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TypeScriptAngularClientCodegen.java new file mode 100644 index 00000000000..a31e15878cf --- /dev/null +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TypeScriptAngularClientCodegen.java @@ -0,0 +1,25 @@ +package io.swagger.codegen.languages; + +import java.io.File; + +import io.swagger.codegen.SupportingFile; + +public class TypeScriptAngularClientCodegen extends TypeScriptNodeClientCodegen { + + @Override + public String getName() { + return "typescript-angular"; + } + + public TypeScriptAngularClientCodegen() { + super(); + outputFolder = "generated-code/typescript-angular"; + modelTemplateFiles.put("model.mustache", ".ts"); + apiTemplateFiles.put("api.mustache", ".ts"); + templateDir = "TypeScript-Angular"; + apiPackage = "api"; + modelPackage = "api"; + + supportingFiles.add(new SupportingFile("api.d.mustache", apiPackage + File.separator, "api.d.ts")); + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TypeScriptNodeClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TypeScriptNodeClientCodegen.java new file mode 100644 index 00000000000..19b8514f8e3 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TypeScriptNodeClientCodegen.java @@ -0,0 +1,169 @@ +package io.swagger.codegen.languages; + +import io.swagger.codegen.*; +import io.swagger.models.properties.*; + +import java.util.*; +import java.io.File; + +public class TypeScriptNodeClientCodegen extends DefaultCodegen implements CodegenConfig { + protected String invokerPackage = "io.swagger.client"; + protected String groupId = "io.swagger"; + protected String artifactId = "swagger-typescript-node-client"; + protected String artifactVersion = "1.0.0"; + protected String sourceFolder = "src/main/typescript"; + + @Override + public CodegenType getTag() { + return CodegenType.CLIENT; + } + + @Override + public String getName() { + return "typescript-node"; + } + + @Override + public String getHelp() { + return "Generates a TypeScript nodejs client library."; + } + + public TypeScriptNodeClientCodegen() { + super(); + outputFolder = "generated-code/typescript-node"; + modelTemplateFiles.put("model.mustache", ".ts"); + apiTemplateFiles.put("api.mustache", ".ts"); + templateDir = "TypeScript-node"; + apiPackage = "api"; + modelPackage = "model"; + + reservedWords = new HashSet(Arrays.asList("abstract", + "continue", "for", "new", "switch", "assert", "default", "if", + "package", "synchronized", "do", "goto", "private", + "this", "break", "double", "implements", "protected", "throw", + "byte", "else", "import", "public", "throws", "case", "enum", + "instanceof", "return", "transient", "catch", "extends", "int", + "short", "try", "char", "final", "interface", "static", "void", + "class", "finally", "const", "super", "while")); + + additionalProperties.put("invokerPackage", invokerPackage); + additionalProperties.put("groupId", groupId); + additionalProperties.put("artifactId", artifactId); + additionalProperties.put("artifactVersion", artifactVersion); + + languageSpecificPrimitives = new HashSet(Arrays.asList( + "String", + "boolean", + "Boolean", + "Double", + "Integer", + "Long", + "Float", + "Object")); + instantiationTypes.put("array", "Array"); + + typeMapping = new HashMap(); + typeMapping.put("Array", "Array"); + typeMapping.put("array", "Array"); + typeMapping.put("List", "Array"); + typeMapping.put("boolean", "boolean"); + typeMapping.put("string", "string"); + typeMapping.put("int", "number"); + typeMapping.put("float", "number"); + typeMapping.put("number", "number"); + typeMapping.put("long", "number"); + typeMapping.put("short", "number"); + typeMapping.put("char", "string"); + typeMapping.put("double", "number"); + typeMapping.put("object", "any"); + typeMapping.put("integer", "number"); + + } + + @Override + public String escapeReservedWord(String name) { + return "_" + name; + } + + @Override + public String apiFileFolder() { + return outputFolder + "/" + apiPackage().replace('.', File.separatorChar); + } + + public String modelFileFolder() { + return outputFolder + "/" + modelPackage().replace('.', File.separatorChar); + } + + @Override + public String toVarName(String name) { + // replace - with _ e.g. created-at => created_at + name = name.replaceAll("-", "_"); + + // if it's all uppper case, do nothing + if (name.matches("^[A-Z_]*$")) + return name; + + // camelize the variable name + // pet_id => PetId + name = camelize(name, true); + + // for reserved word or word starting with number, append _ + if (reservedWords.contains(name) || name.matches("^\\d.*")) + name = escapeReservedWord(name); + + return name; + } + + @Override + public String toParamName(String name) { + // should be the same as variable name + return toVarName(name); + } + + @Override + public String toModelName(String name) { + // model name cannot use reserved keyword, e.g. return + if (reservedWords.contains(name)) + throw new RuntimeException(name + + " (reserved word) cannot be used as a model name"); + + // camelize the model name + // phone_number => PhoneNumber + return camelize(name); + } + + @Override + public String toModelFilename(String name) { + // should be the same as the model name + return toModelName(name); + } + + @Override + public String getTypeDeclaration(Property p) { + if (p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + Property inner = ap.getItems(); + return getSwaggerType(p) + "<" + getTypeDeclaration(inner) + ">"; + } else if (p instanceof MapProperty) { + MapProperty mp = (MapProperty) p; + Property inner = mp.getAdditionalProperties(); + + return getSwaggerType(p) + ""; + } + return super.getTypeDeclaration(p); + } + + @Override + public String getSwaggerType(Property p) { + String swaggerType = super.getSwaggerType(p); + String type = null; + if (typeMapping.containsKey(swaggerType)) { + type = typeMapping.get(swaggerType); + if (languageSpecificPrimitives.contains(type)) + return type; + } else + type = swaggerType; + return type; + } +} diff --git a/modules/swagger-codegen/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig b/modules/swagger-codegen/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig index 8bbdbc8d140..2a037204976 100644 --- a/modules/swagger-codegen/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig +++ b/modules/swagger-codegen/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig @@ -21,4 +21,6 @@ io.swagger.codegen.languages.SwaggerGenerator io.swagger.codegen.languages.SwaggerYamlGenerator io.swagger.codegen.languages.SwiftGenerator io.swagger.codegen.languages.TizenClientCodegen +io.swagger.codegen.languages.TypeScriptAngularClientCodegen +io.swagger.codegen.languages.TypeScriptNodeClientCodegen io.swagger.codegen.languages.AkkaScalaClientCodegen diff --git a/modules/swagger-codegen/src/main/resources/TypeScript-Angular/api.d.mustache b/modules/swagger-codegen/src/main/resources/TypeScript-Angular/api.d.mustache new file mode 100644 index 00000000000..a8bf1c58267 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/TypeScript-Angular/api.d.mustache @@ -0,0 +1,13 @@ +{{#models}} +{{#model}} +/// +{{/model}} +{{/models}} + +{{#apiInfo}} +{{#apis}} +{{#operations}} +/// +{{/operations}} +{{/apis}} +{{/apiInfo}} diff --git a/modules/swagger-codegen/src/main/resources/TypeScript-Angular/api.mustache b/modules/swagger-codegen/src/main/resources/TypeScript-Angular/api.mustache new file mode 100644 index 00000000000..3b53e816891 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/TypeScript-Angular/api.mustache @@ -0,0 +1,68 @@ +/// + +/* tslint:disable:no-unused-variable member-ordering */ + +{{#operations}} +module {{package}} { + 'use strict'; + + {{#description}} + /** + * {{&description}} + */ + {{/description}} + export class {{classname}} { + private basePath = '{{basePath}}'; + + static $inject: string[] = ['$http']; + + constructor(private $http: ng.IHttpService, basePath?: string) { + if (basePath) { + this.basePath = basePath; + } + } + {{#operation}} + public {{nickname}} ({{#allParams}}{{paramName}}: {{{dataType}}}, {{/allParams}} extraHttpRequestParams?: any ) : ng.IHttpPromise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}{}{{/returnType}}> { + var path = this.basePath + '{{path}}'; + {{#pathParams}} + path = path.replace('{' + '{{paramName}}' + '}', String({{paramName}})); + {{/pathParams}} + var queryParameters: any = {}; + var headers: any = {}; + {{#requiredParamCount}} + // verify required params are set + if ({{/requiredParamCount}}{{#requiredParams}} !{{paramName}} {{#hasMore}}|| {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}) { + throw new Error('Missing required parameter: {{¶mName}}'); + } + {{/requiredParamCount}} + {{#queryParams}}if ({{paramName}} !== undefined) { + queryParameters['{{paramName}}'] = {{paramName}}; + }{{/queryParams}} + {{#headerParams}}headerParams['{{paramName}}'] = {{paramName}};{{/headerParams}} + var httpRequestParams: any = { + method: '{{httpMethod}}', + url: path, + json: true, + {{#bodyParam}}data: body, + {{/bodyParam}} + params: queryParameters, + headers: headers + }; + + if (extraHttpRequestParams) { + for (var k in extraHttpRequestParams){ + if (extraHttpRequestParams.hasOwnProperty(k)) { + httpRequestParams[k] = extraHttpRequestParams[k]; + } + } + } + + return this.$http(httpRequestParams); + } + {{/operation}} + } + + angular.module('{{package}}_{{classname}}', ['$http']) + .service('{{classname}}', {{classname}}); +} +{{/operations}} diff --git a/modules/swagger-codegen/src/main/resources/TypeScript-Angular/model.mustache b/modules/swagger-codegen/src/main/resources/TypeScript-Angular/model.mustache new file mode 100644 index 00000000000..bbda64b37da --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/TypeScript-Angular/model.mustache @@ -0,0 +1,30 @@ +/// + +module {{package}} { + 'use strict'; +{{#models}} +{{#model}} + {{#description}}/** + * {{{description}}} + */{{/description}} + export class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{ +{{#vars}} + {{#description}}/** + * {{{description}}} + */{{/description}} + {{name}}: {{#isEnum}}{{classname}}.{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{datatype}}}{{/isEnum}}; +{{/vars}} + } + +{{#hasEnums}} + export module {{classname}} { +{{#vars}} + {{#isEnum}}export enum {{datatypeWithEnum}} { {{#allowableValues}}{{#values}} + {{.}} = '{{.}}',{{/values}}{{/allowableValues}} + }{{/isEnum}} +{{/vars}} + } +{{/hasEnums}} +{{/model}} +{{/models}} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/TypeScript-node/api.mustache b/modules/swagger-codegen/src/main/resources/TypeScript-node/api.mustache new file mode 100644 index 00000000000..4b329799ad5 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/TypeScript-node/api.mustache @@ -0,0 +1,73 @@ +/* tslint:disable:no-unused-variable */ + +{{#operations}} +{{#description}} + /** + * {{&description}} + */ +{{/description}} +export class {{classname}} { + private basePath = '{{basePath}}'; + + constructor(private url: string, private username: string, private password: string, basePath?: string) { + if (basePath) { + this.basePath = basePath; + } + } + + {{#operation}} + public {{nickname}} ({{#allParams}}{{paramName}}: {{{dataType}}}{{#hasMore}}, {{/hasMore}}{{/allParams}} ) : Promise<{ response: http.ClientResponse; {{#returnType}}body: {{{returnType}}}; {{/returnType}} }> { + var path = this.url + this.basePath + '{{path}}'; + + {{#pathParams}} + path = path.replace('{' + '{{paramName}}' + '}', String({{paramName}})); + {{/pathParams}} + + var queryParameters: any = {}; + var headers: any = {}; + + {{#requiredParamCount}} + // verify required params are set + if ({{/requiredParamCount}}{{#requiredParams}} !{{paramName}} {{#hasMore}}|| {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}) { + throw new Error('Missing required parameter: {{¶mName}}'); + } + {{/requiredParamCount}} + + {{#queryParams}}if ({{paramName}} !== undefined) { + queryParameters['{{paramName}}'] = {{paramName}}; + } + {{/queryParams}} + + {{#headerParams}}headerParams['{{paramName}}'] = {{paramName}}; + {{/headerParams}} + + var deferred = promise.defer<{ response: http.ClientResponse; {{#returnType}}body: {{{returnType}}}; {{/returnType}} }>(); + + request({ + method: '{{httpMethod}}', + qs: queryParameters, + uri: path, + json: true, + {{#bodyParam}}body: body, + {{/bodyParam}} + auth: { + username: this.username, password: this.password + } + }, (error, response, body) => { + if (error) { + deferred.reject(error); + } else { + if (response.statusCode >= 200 && response.statusCode <= 299) { + deferred.resolve({ response: response, body: body }); + } else { + deferred.reject({ response: response, body: body }); + } + } + }); + + return deferred.promise; + } + + {{/operation}} +} +{{/operations}} diff --git a/modules/swagger-codegen/src/main/resources/TypeScript-node/model.mustache b/modules/swagger-codegen/src/main/resources/TypeScript-node/model.mustache new file mode 100644 index 00000000000..f187ac3e40f --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/TypeScript-node/model.mustache @@ -0,0 +1,24 @@ +{{#models}} +{{#model}} +{{#description}}/** +* {{{description}}} +*/{{/description}} +export class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{ + {{#vars}}{{#description}}/** + * {{{description}}} + */ + {{/description}} + {{name}}: {{#isEnum}}{{classname}}.{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{datatype}}}{{/isEnum}};{{/vars}} +} + +{{#hasEnums}} +export module {{classname}} { +{{#vars}} + {{#isEnum}}export enum {{datatypeWithEnum}} { {{#allowableValues}}{{#values}} + {{.}} = '{{.}}',{{/values}}{{/allowableValues}} + }{{/isEnum}} +{{/vars}} +} +{{/hasEnums}} +{{/model}} +{{/models}} From ba4b88ef86d512e8827e5cdd9c2ad433752e36b5 Mon Sep 17 00:00:00 2001 From: Martin Hardorf Date: Wed, 17 Jun 2015 12:22:15 +0200 Subject: [PATCH 2/7] Fixed TypeScript mustache --- .../TypeScript-Angular/model.mustache | 25 +++++++++++----- .../resources/TypeScript-node/model.mustache | 29 ++++++++++++------- 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/TypeScript-Angular/model.mustache b/modules/swagger-codegen/src/main/resources/TypeScript-Angular/model.mustache index bbda64b37da..b425d14d5e4 100644 --- a/modules/swagger-codegen/src/main/resources/TypeScript-Angular/model.mustache +++ b/modules/swagger-codegen/src/main/resources/TypeScript-Angular/model.mustache @@ -2,16 +2,22 @@ module {{package}} { 'use strict'; + {{#models}} {{#model}} - {{#description}}/** - * {{{description}}} - */{{/description}} +{{#description}} + /** + * {{{description}}} + */ +{{/description}} export class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{ {{#vars}} - {{#description}}/** - * {{{description}}} - */{{/description}} + +{{#description}} + /** + * {{{description}}} + */ +{{/description}} {{name}}: {{#isEnum}}{{classname}}.{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{datatype}}}{{/isEnum}}; {{/vars}} } @@ -19,9 +25,12 @@ module {{package}} { {{#hasEnums}} export module {{classname}} { {{#vars}} - {{#isEnum}}export enum {{datatypeWithEnum}} { {{#allowableValues}}{{#values}} +{{#isEnum}} + + export enum {{datatypeWithEnum}} { {{#allowableValues}}{{#values}} {{.}} = '{{.}}',{{/values}}{{/allowableValues}} - }{{/isEnum}} + } +{{/isEnum}} {{/vars}} } {{/hasEnums}} diff --git a/modules/swagger-codegen/src/main/resources/TypeScript-node/model.mustache b/modules/swagger-codegen/src/main/resources/TypeScript-node/model.mustache index f187ac3e40f..55c8997e1bc 100644 --- a/modules/swagger-codegen/src/main/resources/TypeScript-node/model.mustache +++ b/modules/swagger-codegen/src/main/resources/TypeScript-node/model.mustache @@ -1,22 +1,31 @@ {{#models}} {{#model}} -{{#description}}/** -* {{{description}}} -*/{{/description}} +{{#description}} +/** + * {{{description}}} + */ +{{/description}} export class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{ - {{#vars}}{{#description}}/** - * {{{description}}} - */ - {{/description}} - {{name}}: {{#isEnum}}{{classname}}.{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{datatype}}}{{/isEnum}};{{/vars}} +{{#vars}} + +{{#description}} + /** + * {{{description}}} + */ +{{/description}} + {{name}}: {{#isEnum}}{{classname}}.{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{datatype}}}{{/isEnum}}; +{{/vars}} } {{#hasEnums}} export module {{classname}} { {{#vars}} - {{#isEnum}}export enum {{datatypeWithEnum}} { {{#allowableValues}}{{#values}} +{{#isEnum}} + + export enum {{datatypeWithEnum}} { {{#allowableValues}}{{#values}} {{.}} = '{{.}}',{{/values}}{{/allowableValues}} - }{{/isEnum}} + } +{{/isEnum}} {{/vars}} } {{/hasEnums}} From 9e8631b75f4a1fae6bd20106841092257b21a99d Mon Sep 17 00:00:00 2001 From: Martin Hardorf Date: Wed, 17 Jun 2015 17:56:37 +0200 Subject: [PATCH 3/7] Added shell scripts for sample generation of TypeScript --- bin/all-petstore.sh | 2 + bin/typescript-angular-petstore.sh | 31 ++ bin/typescript-node-petstore.sh | 31 ++ .../typescript-angular/api/Category.ts | 13 + .../petstore/typescript-angular/api/Order.ts | 32 ++ .../petstore/typescript-angular/api/Pet.ts | 32 ++ .../petstore/typescript-angular/api/PetApi.ts | 262 +++++++++++++ .../typescript-angular/api/StoreApi.ts | 141 +++++++ .../petstore/typescript-angular/api/Tag.ts | 13 + .../petstore/typescript-angular/api/User.ts | 28 ++ .../typescript-angular/api/UserApi.ts | 262 +++++++++++++ .../petstore/typescript-angular/api/api.d.ts | 9 + .../petstore/typescript-node/api/PetApi.ts | 358 ++++++++++++++++++ .../petstore/typescript-node/api/StoreApi.ts | 182 +++++++++ .../petstore/typescript-node/api/UserApi.ts | 357 +++++++++++++++++ .../typescript-node/model/Category.ts | 7 + .../petstore/typescript-node/model/Order.ts | 26 ++ .../petstore/typescript-node/model/Pet.ts | 26 ++ .../petstore/typescript-node/model/Tag.ts | 7 + .../petstore/typescript-node/model/User.ts | 22 ++ 20 files changed, 1841 insertions(+) create mode 100755 bin/typescript-angular-petstore.sh create mode 100755 bin/typescript-node-petstore.sh create mode 100644 samples/client/petstore/typescript-angular/api/Category.ts create mode 100644 samples/client/petstore/typescript-angular/api/Order.ts create mode 100644 samples/client/petstore/typescript-angular/api/Pet.ts create mode 100644 samples/client/petstore/typescript-angular/api/PetApi.ts create mode 100644 samples/client/petstore/typescript-angular/api/StoreApi.ts create mode 100644 samples/client/petstore/typescript-angular/api/Tag.ts create mode 100644 samples/client/petstore/typescript-angular/api/User.ts create mode 100644 samples/client/petstore/typescript-angular/api/UserApi.ts create mode 100644 samples/client/petstore/typescript-angular/api/api.d.ts create mode 100644 samples/client/petstore/typescript-node/api/PetApi.ts create mode 100644 samples/client/petstore/typescript-node/api/StoreApi.ts create mode 100644 samples/client/petstore/typescript-node/api/UserApi.ts create mode 100644 samples/client/petstore/typescript-node/model/Category.ts create mode 100644 samples/client/petstore/typescript-node/model/Order.ts create mode 100644 samples/client/petstore/typescript-node/model/Pet.ts create mode 100644 samples/client/petstore/typescript-node/model/Tag.ts create mode 100644 samples/client/petstore/typescript-node/model/User.ts diff --git a/bin/all-petstore.sh b/bin/all-petstore.sh index 8937200c77f..2f72165f1e5 100755 --- a/bin/all-petstore.sh +++ b/bin/all-petstore.sh @@ -34,3 +34,5 @@ cd $APP_DIR ./bin/scala-petstore.sh ./bin/spring-mvc-petstore-server.sh ./bin/tizen-petstore.sh +./bin/typescript-angular-petstore.sh +./bin/typescript-node-petstore.sh diff --git a/bin/typescript-angular-petstore.sh b/bin/typescript-angular-petstore.sh new file mode 100755 index 00000000000..60c10790c90 --- /dev/null +++ b/bin/typescript-angular-petstore.sh @@ -0,0 +1,31 @@ +#!/bin/sh + +SCRIPT="$0" + +while [ -h "$SCRIPT" ] ; do + ls=`ls -ld "$SCRIPT"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + SCRIPT="$link" + else + SCRIPT=`dirname "$SCRIPT"`/"$link" + fi +done + +if [ ! -d "${APP_DIR}" ]; then + APP_DIR=`dirname "$SCRIPT"`/.. + APP_DIR=`cd "${APP_DIR}"; pwd` +fi + +executable="./modules/swagger-codegen-cli/target/swagger-codegen-cli.jar" + +if [ ! -f "$executable" ] +then + mvn clean package +fi + +# if you've executed sbt assembly previously it will use that instead. +export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" +ags="$@ generate -i modules/swagger-codegen/src/test/resources/2_0/petstore.json -l typescript-angular -o samples/client/petstore/typescript-angular" + +java $JAVA_OPTS -jar $executable $ags diff --git a/bin/typescript-node-petstore.sh b/bin/typescript-node-petstore.sh new file mode 100755 index 00000000000..53c5a6f8d82 --- /dev/null +++ b/bin/typescript-node-petstore.sh @@ -0,0 +1,31 @@ +#!/bin/sh + +SCRIPT="$0" + +while [ -h "$SCRIPT" ] ; do + ls=`ls -ld "$SCRIPT"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + SCRIPT="$link" + else + SCRIPT=`dirname "$SCRIPT"`/"$link" + fi +done + +if [ ! -d "${APP_DIR}" ]; then + APP_DIR=`dirname "$SCRIPT"`/.. + APP_DIR=`cd "${APP_DIR}"; pwd` +fi + +executable="./modules/swagger-codegen-cli/target/swagger-codegen-cli.jar" + +if [ ! -f "$executable" ] +then + mvn clean package +fi + +# if you've executed sbt assembly previously it will use that instead. +export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" +ags="$@ generate -i modules/swagger-codegen/src/test/resources/2_0/petstore.json -l typescript-node -o samples/client/petstore/typescript-node" + +java $JAVA_OPTS -jar $executable $ags diff --git a/samples/client/petstore/typescript-angular/api/Category.ts b/samples/client/petstore/typescript-angular/api/Category.ts new file mode 100644 index 00000000000..e4a3caa208e --- /dev/null +++ b/samples/client/petstore/typescript-angular/api/Category.ts @@ -0,0 +1,13 @@ +/// + +module api { + 'use strict'; + + export class Category { + + id: number; + + name: string; + } + +} \ No newline at end of file diff --git a/samples/client/petstore/typescript-angular/api/Order.ts b/samples/client/petstore/typescript-angular/api/Order.ts new file mode 100644 index 00000000000..3f37c608758 --- /dev/null +++ b/samples/client/petstore/typescript-angular/api/Order.ts @@ -0,0 +1,32 @@ +/// + +module api { + 'use strict'; + + export class Order { + + id: number; + + petId: number; + + quantity: number; + + shipDate: DateTime; + + /** + * Order Status + */ + status: Order.StatusEnum; + + complete: boolean; + } + + export module Order { + + export enum StatusEnum { + placed = 'placed', + approved = 'approved', + delivered = 'delivered', + } + } +} \ No newline at end of file diff --git a/samples/client/petstore/typescript-angular/api/Pet.ts b/samples/client/petstore/typescript-angular/api/Pet.ts new file mode 100644 index 00000000000..c34be9c3dbc --- /dev/null +++ b/samples/client/petstore/typescript-angular/api/Pet.ts @@ -0,0 +1,32 @@ +/// + +module api { + 'use strict'; + + export class Pet { + + id: number; + + category: Category; + + name: string; + + photoUrls: Array; + + tags: Array; + + /** + * pet status in the store + */ + status: Pet.StatusEnum; + } + + export module Pet { + + export enum StatusEnum { + available = 'available', + pending = 'pending', + sold = 'sold', + } + } +} \ No newline at end of file diff --git a/samples/client/petstore/typescript-angular/api/PetApi.ts b/samples/client/petstore/typescript-angular/api/PetApi.ts new file mode 100644 index 00000000000..2c5f2a25b6d --- /dev/null +++ b/samples/client/petstore/typescript-angular/api/PetApi.ts @@ -0,0 +1,262 @@ +/// + +/* tslint:disable:no-unused-variable member-ordering */ + +module api { + 'use strict'; + + + export class PetApi { + private basePath = 'http://petstore.swagger.io/v2'; + + static $inject: string[] = ['$http']; + + constructor(private $http: ng.IHttpService, basePath?: string) { + if (basePath) { + this.basePath = basePath; + } + } + + public updatePet (body: Pet, extraHttpRequestParams?: any ) : ng.IHttpPromise<{}> { + var path = this.basePath + '/pet'; + + var queryParameters: any = {}; + var headers: any = {}; + + + + var httpRequestParams: any = { + method: 'PUT', + url: path, + json: true, + data: body, + + params: queryParameters, + headers: headers + }; + + if (extraHttpRequestParams) { + for (var k in extraHttpRequestParams){ + if (extraHttpRequestParams.hasOwnProperty(k)) { + httpRequestParams[k] = extraHttpRequestParams[k]; + } + } + } + + return this.$http(httpRequestParams); + } + + public addPet (body: Pet, extraHttpRequestParams?: any ) : ng.IHttpPromise<{}> { + var path = this.basePath + '/pet'; + + var queryParameters: any = {}; + var headers: any = {}; + + + + var httpRequestParams: any = { + method: 'POST', + url: path, + json: true, + data: body, + + params: queryParameters, + headers: headers + }; + + if (extraHttpRequestParams) { + for (var k in extraHttpRequestParams){ + if (extraHttpRequestParams.hasOwnProperty(k)) { + httpRequestParams[k] = extraHttpRequestParams[k]; + } + } + } + + return this.$http(httpRequestParams); + } + + public findPetsByStatus (status: Array, extraHttpRequestParams?: any ) : ng.IHttpPromise> { + var path = this.basePath + '/pet/findByStatus'; + + var queryParameters: any = {}; + var headers: any = {}; + + if (status !== undefined) { + queryParameters['status'] = status; + } + + var httpRequestParams: any = { + method: 'GET', + url: path, + json: true, + + params: queryParameters, + headers: headers + }; + + if (extraHttpRequestParams) { + for (var k in extraHttpRequestParams){ + if (extraHttpRequestParams.hasOwnProperty(k)) { + httpRequestParams[k] = extraHttpRequestParams[k]; + } + } + } + + return this.$http(httpRequestParams); + } + + public findPetsByTags (tags: Array, extraHttpRequestParams?: any ) : ng.IHttpPromise> { + var path = this.basePath + '/pet/findByTags'; + + var queryParameters: any = {}; + var headers: any = {}; + + if (tags !== undefined) { + queryParameters['tags'] = tags; + } + + var httpRequestParams: any = { + method: 'GET', + url: path, + json: true, + + params: queryParameters, + headers: headers + }; + + if (extraHttpRequestParams) { + for (var k in extraHttpRequestParams){ + if (extraHttpRequestParams.hasOwnProperty(k)) { + httpRequestParams[k] = extraHttpRequestParams[k]; + } + } + } + + return this.$http(httpRequestParams); + } + + public getPetById (petId: number, extraHttpRequestParams?: any ) : ng.IHttpPromise { + var path = this.basePath + '/pet/{petId}'; + + path = path.replace('{' + 'petId' + '}', String(petId)); + + var queryParameters: any = {}; + var headers: any = {}; + + + + var httpRequestParams: any = { + method: 'GET', + url: path, + json: true, + + params: queryParameters, + headers: headers + }; + + if (extraHttpRequestParams) { + for (var k in extraHttpRequestParams){ + if (extraHttpRequestParams.hasOwnProperty(k)) { + httpRequestParams[k] = extraHttpRequestParams[k]; + } + } + } + + return this.$http(httpRequestParams); + } + + public updatePetWithForm (petId: string, name: string, status: string, extraHttpRequestParams?: any ) : ng.IHttpPromise<{}> { + var path = this.basePath + '/pet/{petId}'; + + path = path.replace('{' + 'petId' + '}', String(petId)); + + var queryParameters: any = {}; + var headers: any = {}; + + + + var httpRequestParams: any = { + method: 'POST', + url: path, + json: true, + + params: queryParameters, + headers: headers + }; + + if (extraHttpRequestParams) { + for (var k in extraHttpRequestParams){ + if (extraHttpRequestParams.hasOwnProperty(k)) { + httpRequestParams[k] = extraHttpRequestParams[k]; + } + } + } + + return this.$http(httpRequestParams); + } + + public deletePet (apiKey: string, petId: number, extraHttpRequestParams?: any ) : ng.IHttpPromise<{}> { + var path = this.basePath + '/pet/{petId}'; + + path = path.replace('{' + 'petId' + '}', String(petId)); + + var queryParameters: any = {}; + var headers: any = {}; + + + headerParams['apiKey'] = apiKey; + var httpRequestParams: any = { + method: 'DELETE', + url: path, + json: true, + + params: queryParameters, + headers: headers + }; + + if (extraHttpRequestParams) { + for (var k in extraHttpRequestParams){ + if (extraHttpRequestParams.hasOwnProperty(k)) { + httpRequestParams[k] = extraHttpRequestParams[k]; + } + } + } + + return this.$http(httpRequestParams); + } + + public uploadFile (petId: number, additionalMetadata: string, file: file, extraHttpRequestParams?: any ) : ng.IHttpPromise<{}> { + var path = this.basePath + '/pet/{petId}/uploadImage'; + + path = path.replace('{' + 'petId' + '}', String(petId)); + + var queryParameters: any = {}; + var headers: any = {}; + + + + var httpRequestParams: any = { + method: 'POST', + url: path, + json: true, + + params: queryParameters, + headers: headers + }; + + if (extraHttpRequestParams) { + for (var k in extraHttpRequestParams){ + if (extraHttpRequestParams.hasOwnProperty(k)) { + httpRequestParams[k] = extraHttpRequestParams[k]; + } + } + } + + return this.$http(httpRequestParams); + } + + } + + angular.module('api_PetApi', ['$http']) + .service('PetApi', PetApi); +} diff --git a/samples/client/petstore/typescript-angular/api/StoreApi.ts b/samples/client/petstore/typescript-angular/api/StoreApi.ts new file mode 100644 index 00000000000..e4c9e48e0e9 --- /dev/null +++ b/samples/client/petstore/typescript-angular/api/StoreApi.ts @@ -0,0 +1,141 @@ +/// + +/* tslint:disable:no-unused-variable member-ordering */ + +module api { + 'use strict'; + + + export class StoreApi { + private basePath = 'http://petstore.swagger.io/v2'; + + static $inject: string[] = ['$http']; + + constructor(private $http: ng.IHttpService, basePath?: string) { + if (basePath) { + this.basePath = basePath; + } + } + + public getInventory ( extraHttpRequestParams?: any ) : ng.IHttpPromise> { + var path = this.basePath + '/store/inventory'; + + var queryParameters: any = {}; + var headers: any = {}; + + + + var httpRequestParams: any = { + method: 'GET', + url: path, + json: true, + + params: queryParameters, + headers: headers + }; + + if (extraHttpRequestParams) { + for (var k in extraHttpRequestParams){ + if (extraHttpRequestParams.hasOwnProperty(k)) { + httpRequestParams[k] = extraHttpRequestParams[k]; + } + } + } + + return this.$http(httpRequestParams); + } + + public placeOrder (body: Order, extraHttpRequestParams?: any ) : ng.IHttpPromise { + var path = this.basePath + '/store/order'; + + var queryParameters: any = {}; + var headers: any = {}; + + + + var httpRequestParams: any = { + method: 'POST', + url: path, + json: true, + data: body, + + params: queryParameters, + headers: headers + }; + + if (extraHttpRequestParams) { + for (var k in extraHttpRequestParams){ + if (extraHttpRequestParams.hasOwnProperty(k)) { + httpRequestParams[k] = extraHttpRequestParams[k]; + } + } + } + + return this.$http(httpRequestParams); + } + + public getOrderById (orderId: string, extraHttpRequestParams?: any ) : ng.IHttpPromise { + var path = this.basePath + '/store/order/{orderId}'; + + path = path.replace('{' + 'orderId' + '}', String(orderId)); + + var queryParameters: any = {}; + var headers: any = {}; + + + + var httpRequestParams: any = { + method: 'GET', + url: path, + json: true, + + params: queryParameters, + headers: headers + }; + + if (extraHttpRequestParams) { + for (var k in extraHttpRequestParams){ + if (extraHttpRequestParams.hasOwnProperty(k)) { + httpRequestParams[k] = extraHttpRequestParams[k]; + } + } + } + + return this.$http(httpRequestParams); + } + + public deleteOrder (orderId: string, extraHttpRequestParams?: any ) : ng.IHttpPromise<{}> { + var path = this.basePath + '/store/order/{orderId}'; + + path = path.replace('{' + 'orderId' + '}', String(orderId)); + + var queryParameters: any = {}; + var headers: any = {}; + + + + var httpRequestParams: any = { + method: 'DELETE', + url: path, + json: true, + + params: queryParameters, + headers: headers + }; + + if (extraHttpRequestParams) { + for (var k in extraHttpRequestParams){ + if (extraHttpRequestParams.hasOwnProperty(k)) { + httpRequestParams[k] = extraHttpRequestParams[k]; + } + } + } + + return this.$http(httpRequestParams); + } + + } + + angular.module('api_StoreApi', ['$http']) + .service('StoreApi', StoreApi); +} diff --git a/samples/client/petstore/typescript-angular/api/Tag.ts b/samples/client/petstore/typescript-angular/api/Tag.ts new file mode 100644 index 00000000000..33f0ffaa1e2 --- /dev/null +++ b/samples/client/petstore/typescript-angular/api/Tag.ts @@ -0,0 +1,13 @@ +/// + +module api { + 'use strict'; + + export class Tag { + + id: number; + + name: string; + } + +} \ No newline at end of file diff --git a/samples/client/petstore/typescript-angular/api/User.ts b/samples/client/petstore/typescript-angular/api/User.ts new file mode 100644 index 00000000000..57385044943 --- /dev/null +++ b/samples/client/petstore/typescript-angular/api/User.ts @@ -0,0 +1,28 @@ +/// + +module api { + 'use strict'; + + export class User { + + id: number; + + username: string; + + firstName: string; + + lastName: string; + + email: string; + + password: string; + + phone: string; + + /** + * User Status + */ + userStatus: number; + } + +} \ No newline at end of file diff --git a/samples/client/petstore/typescript-angular/api/UserApi.ts b/samples/client/petstore/typescript-angular/api/UserApi.ts new file mode 100644 index 00000000000..dfbe9032dba --- /dev/null +++ b/samples/client/petstore/typescript-angular/api/UserApi.ts @@ -0,0 +1,262 @@ +/// + +/* tslint:disable:no-unused-variable member-ordering */ + +module api { + 'use strict'; + + + export class UserApi { + private basePath = 'http://petstore.swagger.io/v2'; + + static $inject: string[] = ['$http']; + + constructor(private $http: ng.IHttpService, basePath?: string) { + if (basePath) { + this.basePath = basePath; + } + } + + public createUser (body: User, extraHttpRequestParams?: any ) : ng.IHttpPromise<{}> { + var path = this.basePath + '/user'; + + var queryParameters: any = {}; + var headers: any = {}; + + + + var httpRequestParams: any = { + method: 'POST', + url: path, + json: true, + data: body, + + params: queryParameters, + headers: headers + }; + + if (extraHttpRequestParams) { + for (var k in extraHttpRequestParams){ + if (extraHttpRequestParams.hasOwnProperty(k)) { + httpRequestParams[k] = extraHttpRequestParams[k]; + } + } + } + + return this.$http(httpRequestParams); + } + + public createUsersWithArrayInput (body: Array, extraHttpRequestParams?: any ) : ng.IHttpPromise<{}> { + var path = this.basePath + '/user/createWithArray'; + + var queryParameters: any = {}; + var headers: any = {}; + + + + var httpRequestParams: any = { + method: 'POST', + url: path, + json: true, + data: body, + + params: queryParameters, + headers: headers + }; + + if (extraHttpRequestParams) { + for (var k in extraHttpRequestParams){ + if (extraHttpRequestParams.hasOwnProperty(k)) { + httpRequestParams[k] = extraHttpRequestParams[k]; + } + } + } + + return this.$http(httpRequestParams); + } + + public createUsersWithListInput (body: Array, extraHttpRequestParams?: any ) : ng.IHttpPromise<{}> { + var path = this.basePath + '/user/createWithList'; + + var queryParameters: any = {}; + var headers: any = {}; + + + + var httpRequestParams: any = { + method: 'POST', + url: path, + json: true, + data: body, + + params: queryParameters, + headers: headers + }; + + if (extraHttpRequestParams) { + for (var k in extraHttpRequestParams){ + if (extraHttpRequestParams.hasOwnProperty(k)) { + httpRequestParams[k] = extraHttpRequestParams[k]; + } + } + } + + return this.$http(httpRequestParams); + } + + public loginUser (username: string, password: string, extraHttpRequestParams?: any ) : ng.IHttpPromise { + var path = this.basePath + '/user/login'; + + var queryParameters: any = {}; + var headers: any = {}; + + if (username !== undefined) { + queryParameters['username'] = username; + }if (password !== undefined) { + queryParameters['password'] = password; + } + + var httpRequestParams: any = { + method: 'GET', + url: path, + json: true, + + params: queryParameters, + headers: headers + }; + + if (extraHttpRequestParams) { + for (var k in extraHttpRequestParams){ + if (extraHttpRequestParams.hasOwnProperty(k)) { + httpRequestParams[k] = extraHttpRequestParams[k]; + } + } + } + + return this.$http(httpRequestParams); + } + + public logoutUser ( extraHttpRequestParams?: any ) : ng.IHttpPromise<{}> { + var path = this.basePath + '/user/logout'; + + var queryParameters: any = {}; + var headers: any = {}; + + + + var httpRequestParams: any = { + method: 'GET', + url: path, + json: true, + + params: queryParameters, + headers: headers + }; + + if (extraHttpRequestParams) { + for (var k in extraHttpRequestParams){ + if (extraHttpRequestParams.hasOwnProperty(k)) { + httpRequestParams[k] = extraHttpRequestParams[k]; + } + } + } + + return this.$http(httpRequestParams); + } + + public getUserByName (username: string, extraHttpRequestParams?: any ) : ng.IHttpPromise { + var path = this.basePath + '/user/{username}'; + + path = path.replace('{' + 'username' + '}', String(username)); + + var queryParameters: any = {}; + var headers: any = {}; + + + + var httpRequestParams: any = { + method: 'GET', + url: path, + json: true, + + params: queryParameters, + headers: headers + }; + + if (extraHttpRequestParams) { + for (var k in extraHttpRequestParams){ + if (extraHttpRequestParams.hasOwnProperty(k)) { + httpRequestParams[k] = extraHttpRequestParams[k]; + } + } + } + + return this.$http(httpRequestParams); + } + + public updateUser (username: string, body: User, extraHttpRequestParams?: any ) : ng.IHttpPromise<{}> { + var path = this.basePath + '/user/{username}'; + + path = path.replace('{' + 'username' + '}', String(username)); + + var queryParameters: any = {}; + var headers: any = {}; + + + + var httpRequestParams: any = { + method: 'PUT', + url: path, + json: true, + data: body, + + params: queryParameters, + headers: headers + }; + + if (extraHttpRequestParams) { + for (var k in extraHttpRequestParams){ + if (extraHttpRequestParams.hasOwnProperty(k)) { + httpRequestParams[k] = extraHttpRequestParams[k]; + } + } + } + + return this.$http(httpRequestParams); + } + + public deleteUser (username: string, extraHttpRequestParams?: any ) : ng.IHttpPromise<{}> { + var path = this.basePath + '/user/{username}'; + + path = path.replace('{' + 'username' + '}', String(username)); + + var queryParameters: any = {}; + var headers: any = {}; + + + + var httpRequestParams: any = { + method: 'DELETE', + url: path, + json: true, + + params: queryParameters, + headers: headers + }; + + if (extraHttpRequestParams) { + for (var k in extraHttpRequestParams){ + if (extraHttpRequestParams.hasOwnProperty(k)) { + httpRequestParams[k] = extraHttpRequestParams[k]; + } + } + } + + return this.$http(httpRequestParams); + } + + } + + angular.module('api_UserApi', ['$http']) + .service('UserApi', UserApi); +} diff --git a/samples/client/petstore/typescript-angular/api/api.d.ts b/samples/client/petstore/typescript-angular/api/api.d.ts new file mode 100644 index 00000000000..19c60623dc9 --- /dev/null +++ b/samples/client/petstore/typescript-angular/api/api.d.ts @@ -0,0 +1,9 @@ +/// +/// +/// +/// +/// + +/// +/// +/// diff --git a/samples/client/petstore/typescript-node/api/PetApi.ts b/samples/client/petstore/typescript-node/api/PetApi.ts new file mode 100644 index 00000000000..c948f8036e6 --- /dev/null +++ b/samples/client/petstore/typescript-node/api/PetApi.ts @@ -0,0 +1,358 @@ +/* tslint:disable:no-unused-variable */ + +export class PetApi { + private basePath = 'http://petstore.swagger.io/v2'; + + constructor(private url: string, private username: string, private password: string, basePath?: string) { + if (basePath) { + this.basePath = basePath; + } + } + + + public updatePet (body: Pet ) : Promise<{ response: http.ClientResponse; }> { + var path = this.url + this.basePath + '/pet'; + + + + var queryParameters: any = {}; + var headers: any = {}; + + + + + + + + var deferred = promise.defer<{ response: http.ClientResponse; }>(); + + request({ + method: 'PUT', + qs: queryParameters, + uri: path, + json: true, + body: body, + + auth: { + username: this.username, password: this.password + } + }, (error, response, body) => { + if (error) { + deferred.reject(error); + } else { + if (response.statusCode >= 200 && response.statusCode <= 299) { + deferred.resolve({ response: response, body: body }); + } else { + deferred.reject({ response: response, body: body }); + } + } + }); + + return deferred.promise; + } + + + public addPet (body: Pet ) : Promise<{ response: http.ClientResponse; }> { + var path = this.url + this.basePath + '/pet'; + + + + var queryParameters: any = {}; + var headers: any = {}; + + + + + + + + var deferred = promise.defer<{ response: http.ClientResponse; }>(); + + request({ + method: 'POST', + qs: queryParameters, + uri: path, + json: true, + body: body, + + auth: { + username: this.username, password: this.password + } + }, (error, response, body) => { + if (error) { + deferred.reject(error); + } else { + if (response.statusCode >= 200 && response.statusCode <= 299) { + deferred.resolve({ response: response, body: body }); + } else { + deferred.reject({ response: response, body: body }); + } + } + }); + + return deferred.promise; + } + + + public findPetsByStatus (status: Array ) : Promise<{ response: http.ClientResponse; body: Array; }> { + var path = this.url + this.basePath + '/pet/findByStatus'; + + + + var queryParameters: any = {}; + var headers: any = {}; + + + + if (status !== undefined) { + queryParameters['status'] = status; + } + + + + + var deferred = promise.defer<{ response: http.ClientResponse; body: Array; }>(); + + request({ + method: 'GET', + qs: queryParameters, + uri: path, + json: true, + + auth: { + username: this.username, password: this.password + } + }, (error, response, body) => { + if (error) { + deferred.reject(error); + } else { + if (response.statusCode >= 200 && response.statusCode <= 299) { + deferred.resolve({ response: response, body: body }); + } else { + deferred.reject({ response: response, body: body }); + } + } + }); + + return deferred.promise; + } + + + public findPetsByTags (tags: Array ) : Promise<{ response: http.ClientResponse; body: Array; }> { + var path = this.url + this.basePath + '/pet/findByTags'; + + + + var queryParameters: any = {}; + var headers: any = {}; + + + + if (tags !== undefined) { + queryParameters['tags'] = tags; + } + + + + + var deferred = promise.defer<{ response: http.ClientResponse; body: Array; }>(); + + request({ + method: 'GET', + qs: queryParameters, + uri: path, + json: true, + + auth: { + username: this.username, password: this.password + } + }, (error, response, body) => { + if (error) { + deferred.reject(error); + } else { + if (response.statusCode >= 200 && response.statusCode <= 299) { + deferred.resolve({ response: response, body: body }); + } else { + deferred.reject({ response: response, body: body }); + } + } + }); + + return deferred.promise; + } + + + public getPetById (petId: number ) : Promise<{ response: http.ClientResponse; body: Pet; }> { + var path = this.url + this.basePath + '/pet/{petId}'; + + + path = path.replace('{' + 'petId' + '}', String(petId)); + + + var queryParameters: any = {}; + var headers: any = {}; + + + + + + + + var deferred = promise.defer<{ response: http.ClientResponse; body: Pet; }>(); + + request({ + method: 'GET', + qs: queryParameters, + uri: path, + json: true, + + auth: { + username: this.username, password: this.password + } + }, (error, response, body) => { + if (error) { + deferred.reject(error); + } else { + if (response.statusCode >= 200 && response.statusCode <= 299) { + deferred.resolve({ response: response, body: body }); + } else { + deferred.reject({ response: response, body: body }); + } + } + }); + + return deferred.promise; + } + + + public updatePetWithForm (petId: string, name: string, status: string ) : Promise<{ response: http.ClientResponse; }> { + var path = this.url + this.basePath + '/pet/{petId}'; + + + path = path.replace('{' + 'petId' + '}', String(petId)); + + + var queryParameters: any = {}; + var headers: any = {}; + + + + + + + + var deferred = promise.defer<{ response: http.ClientResponse; }>(); + + request({ + method: 'POST', + qs: queryParameters, + uri: path, + json: true, + + auth: { + username: this.username, password: this.password + } + }, (error, response, body) => { + if (error) { + deferred.reject(error); + } else { + if (response.statusCode >= 200 && response.statusCode <= 299) { + deferred.resolve({ response: response, body: body }); + } else { + deferred.reject({ response: response, body: body }); + } + } + }); + + return deferred.promise; + } + + + public deletePet (apiKey: string, petId: number ) : Promise<{ response: http.ClientResponse; }> { + var path = this.url + this.basePath + '/pet/{petId}'; + + + path = path.replace('{' + 'petId' + '}', String(petId)); + + + var queryParameters: any = {}; + var headers: any = {}; + + + + + + headerParams['apiKey'] = apiKey; + + + var deferred = promise.defer<{ response: http.ClientResponse; }>(); + + request({ + method: 'DELETE', + qs: queryParameters, + uri: path, + json: true, + + auth: { + username: this.username, password: this.password + } + }, (error, response, body) => { + if (error) { + deferred.reject(error); + } else { + if (response.statusCode >= 200 && response.statusCode <= 299) { + deferred.resolve({ response: response, body: body }); + } else { + deferred.reject({ response: response, body: body }); + } + } + }); + + return deferred.promise; + } + + + public uploadFile (petId: number, additionalMetadata: string, file: file ) : Promise<{ response: http.ClientResponse; }> { + var path = this.url + this.basePath + '/pet/{petId}/uploadImage'; + + + path = path.replace('{' + 'petId' + '}', String(petId)); + + + var queryParameters: any = {}; + var headers: any = {}; + + + + + + + + var deferred = promise.defer<{ response: http.ClientResponse; }>(); + + request({ + method: 'POST', + qs: queryParameters, + uri: path, + json: true, + + auth: { + username: this.username, password: this.password + } + }, (error, response, body) => { + if (error) { + deferred.reject(error); + } else { + if (response.statusCode >= 200 && response.statusCode <= 299) { + deferred.resolve({ response: response, body: body }); + } else { + deferred.reject({ response: response, body: body }); + } + } + }); + + return deferred.promise; + } + + +} diff --git a/samples/client/petstore/typescript-node/api/StoreApi.ts b/samples/client/petstore/typescript-node/api/StoreApi.ts new file mode 100644 index 00000000000..1c2c6623523 --- /dev/null +++ b/samples/client/petstore/typescript-node/api/StoreApi.ts @@ -0,0 +1,182 @@ +/* tslint:disable:no-unused-variable */ + +export class StoreApi { + private basePath = 'http://petstore.swagger.io/v2'; + + constructor(private url: string, private username: string, private password: string, basePath?: string) { + if (basePath) { + this.basePath = basePath; + } + } + + + public getInventory ( ) : Promise<{ response: http.ClientResponse; body: map; }> { + var path = this.url + this.basePath + '/store/inventory'; + + + + var queryParameters: any = {}; + var headers: any = {}; + + + + + + + + var deferred = promise.defer<{ response: http.ClientResponse; body: map; }>(); + + request({ + method: 'GET', + qs: queryParameters, + uri: path, + json: true, + + auth: { + username: this.username, password: this.password + } + }, (error, response, body) => { + if (error) { + deferred.reject(error); + } else { + if (response.statusCode >= 200 && response.statusCode <= 299) { + deferred.resolve({ response: response, body: body }); + } else { + deferred.reject({ response: response, body: body }); + } + } + }); + + return deferred.promise; + } + + + public placeOrder (body: Order ) : Promise<{ response: http.ClientResponse; body: Order; }> { + var path = this.url + this.basePath + '/store/order'; + + + + var queryParameters: any = {}; + var headers: any = {}; + + + + + + + + var deferred = promise.defer<{ response: http.ClientResponse; body: Order; }>(); + + request({ + method: 'POST', + qs: queryParameters, + uri: path, + json: true, + body: body, + + auth: { + username: this.username, password: this.password + } + }, (error, response, body) => { + if (error) { + deferred.reject(error); + } else { + if (response.statusCode >= 200 && response.statusCode <= 299) { + deferred.resolve({ response: response, body: body }); + } else { + deferred.reject({ response: response, body: body }); + } + } + }); + + return deferred.promise; + } + + + public getOrderById (orderId: string ) : Promise<{ response: http.ClientResponse; body: Order; }> { + var path = this.url + this.basePath + '/store/order/{orderId}'; + + + path = path.replace('{' + 'orderId' + '}', String(orderId)); + + + var queryParameters: any = {}; + var headers: any = {}; + + + + + + + + var deferred = promise.defer<{ response: http.ClientResponse; body: Order; }>(); + + request({ + method: 'GET', + qs: queryParameters, + uri: path, + json: true, + + auth: { + username: this.username, password: this.password + } + }, (error, response, body) => { + if (error) { + deferred.reject(error); + } else { + if (response.statusCode >= 200 && response.statusCode <= 299) { + deferred.resolve({ response: response, body: body }); + } else { + deferred.reject({ response: response, body: body }); + } + } + }); + + return deferred.promise; + } + + + public deleteOrder (orderId: string ) : Promise<{ response: http.ClientResponse; }> { + var path = this.url + this.basePath + '/store/order/{orderId}'; + + + path = path.replace('{' + 'orderId' + '}', String(orderId)); + + + var queryParameters: any = {}; + var headers: any = {}; + + + + + + + + var deferred = promise.defer<{ response: http.ClientResponse; }>(); + + request({ + method: 'DELETE', + qs: queryParameters, + uri: path, + json: true, + + auth: { + username: this.username, password: this.password + } + }, (error, response, body) => { + if (error) { + deferred.reject(error); + } else { + if (response.statusCode >= 200 && response.statusCode <= 299) { + deferred.resolve({ response: response, body: body }); + } else { + deferred.reject({ response: response, body: body }); + } + } + }); + + return deferred.promise; + } + + +} diff --git a/samples/client/petstore/typescript-node/api/UserApi.ts b/samples/client/petstore/typescript-node/api/UserApi.ts new file mode 100644 index 00000000000..fa4365f8edc --- /dev/null +++ b/samples/client/petstore/typescript-node/api/UserApi.ts @@ -0,0 +1,357 @@ +/* tslint:disable:no-unused-variable */ + +export class UserApi { + private basePath = 'http://petstore.swagger.io/v2'; + + constructor(private url: string, private username: string, private password: string, basePath?: string) { + if (basePath) { + this.basePath = basePath; + } + } + + + public createUser (body: User ) : Promise<{ response: http.ClientResponse; }> { + var path = this.url + this.basePath + '/user'; + + + + var queryParameters: any = {}; + var headers: any = {}; + + + + + + + + var deferred = promise.defer<{ response: http.ClientResponse; }>(); + + request({ + method: 'POST', + qs: queryParameters, + uri: path, + json: true, + body: body, + + auth: { + username: this.username, password: this.password + } + }, (error, response, body) => { + if (error) { + deferred.reject(error); + } else { + if (response.statusCode >= 200 && response.statusCode <= 299) { + deferred.resolve({ response: response, body: body }); + } else { + deferred.reject({ response: response, body: body }); + } + } + }); + + return deferred.promise; + } + + + public createUsersWithArrayInput (body: Array ) : Promise<{ response: http.ClientResponse; }> { + var path = this.url + this.basePath + '/user/createWithArray'; + + + + var queryParameters: any = {}; + var headers: any = {}; + + + + + + + + var deferred = promise.defer<{ response: http.ClientResponse; }>(); + + request({ + method: 'POST', + qs: queryParameters, + uri: path, + json: true, + body: body, + + auth: { + username: this.username, password: this.password + } + }, (error, response, body) => { + if (error) { + deferred.reject(error); + } else { + if (response.statusCode >= 200 && response.statusCode <= 299) { + deferred.resolve({ response: response, body: body }); + } else { + deferred.reject({ response: response, body: body }); + } + } + }); + + return deferred.promise; + } + + + public createUsersWithListInput (body: Array ) : Promise<{ response: http.ClientResponse; }> { + var path = this.url + this.basePath + '/user/createWithList'; + + + + var queryParameters: any = {}; + var headers: any = {}; + + + + + + + + var deferred = promise.defer<{ response: http.ClientResponse; }>(); + + request({ + method: 'POST', + qs: queryParameters, + uri: path, + json: true, + body: body, + + auth: { + username: this.username, password: this.password + } + }, (error, response, body) => { + if (error) { + deferred.reject(error); + } else { + if (response.statusCode >= 200 && response.statusCode <= 299) { + deferred.resolve({ response: response, body: body }); + } else { + deferred.reject({ response: response, body: body }); + } + } + }); + + return deferred.promise; + } + + + public loginUser (username: string, password: string ) : Promise<{ response: http.ClientResponse; body: string; }> { + var path = this.url + this.basePath + '/user/login'; + + + + var queryParameters: any = {}; + var headers: any = {}; + + + + if (username !== undefined) { + queryParameters['username'] = username; + } + if (password !== undefined) { + queryParameters['password'] = password; + } + + + + + var deferred = promise.defer<{ response: http.ClientResponse; body: string; }>(); + + request({ + method: 'GET', + qs: queryParameters, + uri: path, + json: true, + + auth: { + username: this.username, password: this.password + } + }, (error, response, body) => { + if (error) { + deferred.reject(error); + } else { + if (response.statusCode >= 200 && response.statusCode <= 299) { + deferred.resolve({ response: response, body: body }); + } else { + deferred.reject({ response: response, body: body }); + } + } + }); + + return deferred.promise; + } + + + public logoutUser ( ) : Promise<{ response: http.ClientResponse; }> { + var path = this.url + this.basePath + '/user/logout'; + + + + var queryParameters: any = {}; + var headers: any = {}; + + + + + + + + var deferred = promise.defer<{ response: http.ClientResponse; }>(); + + request({ + method: 'GET', + qs: queryParameters, + uri: path, + json: true, + + auth: { + username: this.username, password: this.password + } + }, (error, response, body) => { + if (error) { + deferred.reject(error); + } else { + if (response.statusCode >= 200 && response.statusCode <= 299) { + deferred.resolve({ response: response, body: body }); + } else { + deferred.reject({ response: response, body: body }); + } + } + }); + + return deferred.promise; + } + + + public getUserByName (username: string ) : Promise<{ response: http.ClientResponse; body: User; }> { + var path = this.url + this.basePath + '/user/{username}'; + + + path = path.replace('{' + 'username' + '}', String(username)); + + + var queryParameters: any = {}; + var headers: any = {}; + + + + + + + + var deferred = promise.defer<{ response: http.ClientResponse; body: User; }>(); + + request({ + method: 'GET', + qs: queryParameters, + uri: path, + json: true, + + auth: { + username: this.username, password: this.password + } + }, (error, response, body) => { + if (error) { + deferred.reject(error); + } else { + if (response.statusCode >= 200 && response.statusCode <= 299) { + deferred.resolve({ response: response, body: body }); + } else { + deferred.reject({ response: response, body: body }); + } + } + }); + + return deferred.promise; + } + + + public updateUser (username: string, body: User ) : Promise<{ response: http.ClientResponse; }> { + var path = this.url + this.basePath + '/user/{username}'; + + + path = path.replace('{' + 'username' + '}', String(username)); + + + var queryParameters: any = {}; + var headers: any = {}; + + + + + + + + var deferred = promise.defer<{ response: http.ClientResponse; }>(); + + request({ + method: 'PUT', + qs: queryParameters, + uri: path, + json: true, + body: body, + + auth: { + username: this.username, password: this.password + } + }, (error, response, body) => { + if (error) { + deferred.reject(error); + } else { + if (response.statusCode >= 200 && response.statusCode <= 299) { + deferred.resolve({ response: response, body: body }); + } else { + deferred.reject({ response: response, body: body }); + } + } + }); + + return deferred.promise; + } + + + public deleteUser (username: string ) : Promise<{ response: http.ClientResponse; }> { + var path = this.url + this.basePath + '/user/{username}'; + + + path = path.replace('{' + 'username' + '}', String(username)); + + + var queryParameters: any = {}; + var headers: any = {}; + + + + + + + + var deferred = promise.defer<{ response: http.ClientResponse; }>(); + + request({ + method: 'DELETE', + qs: queryParameters, + uri: path, + json: true, + + auth: { + username: this.username, password: this.password + } + }, (error, response, body) => { + if (error) { + deferred.reject(error); + } else { + if (response.statusCode >= 200 && response.statusCode <= 299) { + deferred.resolve({ response: response, body: body }); + } else { + deferred.reject({ response: response, body: body }); + } + } + }); + + return deferred.promise; + } + + +} diff --git a/samples/client/petstore/typescript-node/model/Category.ts b/samples/client/petstore/typescript-node/model/Category.ts new file mode 100644 index 00000000000..fc4b2874e93 --- /dev/null +++ b/samples/client/petstore/typescript-node/model/Category.ts @@ -0,0 +1,7 @@ +export class Category { + + id: number; + + name: string; +} + diff --git a/samples/client/petstore/typescript-node/model/Order.ts b/samples/client/petstore/typescript-node/model/Order.ts new file mode 100644 index 00000000000..b46ad4570a0 --- /dev/null +++ b/samples/client/petstore/typescript-node/model/Order.ts @@ -0,0 +1,26 @@ +export class Order { + + id: number; + + petId: number; + + quantity: number; + + shipDate: DateTime; + + /** + * Order Status + */ + status: Order.StatusEnum; + + complete: boolean; +} + +export module Order { + + export enum StatusEnum { + placed = 'placed', + approved = 'approved', + delivered = 'delivered', + } +} diff --git a/samples/client/petstore/typescript-node/model/Pet.ts b/samples/client/petstore/typescript-node/model/Pet.ts new file mode 100644 index 00000000000..4a3faa129ed --- /dev/null +++ b/samples/client/petstore/typescript-node/model/Pet.ts @@ -0,0 +1,26 @@ +export class Pet { + + id: number; + + category: Category; + + name: string; + + photoUrls: Array; + + tags: Array; + + /** + * pet status in the store + */ + status: Pet.StatusEnum; +} + +export module Pet { + + export enum StatusEnum { + available = 'available', + pending = 'pending', + sold = 'sold', + } +} diff --git a/samples/client/petstore/typescript-node/model/Tag.ts b/samples/client/petstore/typescript-node/model/Tag.ts new file mode 100644 index 00000000000..6ae0d4ef576 --- /dev/null +++ b/samples/client/petstore/typescript-node/model/Tag.ts @@ -0,0 +1,7 @@ +export class Tag { + + id: number; + + name: string; +} + diff --git a/samples/client/petstore/typescript-node/model/User.ts b/samples/client/petstore/typescript-node/model/User.ts new file mode 100644 index 00000000000..fee31563d13 --- /dev/null +++ b/samples/client/petstore/typescript-node/model/User.ts @@ -0,0 +1,22 @@ +export class User { + + id: number; + + username: string; + + firstName: string; + + lastName: string; + + email: string; + + password: string; + + phone: string; + + /** + * User Status + */ + userStatus: number; +} + From e7d4a438ddea8a9c5ba43c2526c4859a7622b013 Mon Sep 17 00:00:00 2001 From: Martin Hardorf Date: Wed, 17 Jun 2015 17:58:52 +0200 Subject: [PATCH 4/7] Added tests for TypeScript Angular and Node.js --- .../TypeScriptAngularModelTest.scala | 170 ++++++++++++++++++ .../TypeScriptNodeModelTest.scala | 170 ++++++++++++++++++ 2 files changed, 340 insertions(+) create mode 100644 modules/swagger-codegen/src/test/scala/typescriptangular/TypeScriptAngularModelTest.scala create mode 100644 modules/swagger-codegen/src/test/scala/typescriptnode/TypeScriptNodeModelTest.scala diff --git a/modules/swagger-codegen/src/test/scala/typescriptangular/TypeScriptAngularModelTest.scala b/modules/swagger-codegen/src/test/scala/typescriptangular/TypeScriptAngularModelTest.scala new file mode 100644 index 00000000000..5e28e3e8dc7 --- /dev/null +++ b/modules/swagger-codegen/src/test/scala/typescriptangular/TypeScriptAngularModelTest.scala @@ -0,0 +1,170 @@ +package typescriptangular + +import io.swagger.codegen.languages.TypeScriptAngularClientCodegen +import io.swagger.models._ +import io.swagger.models.properties._ +import org.junit.runner.RunWith +import org.scalatest.{FlatSpec, Matchers} +import org.scalatest.junit.JUnitRunner + +import scala.collection.JavaConverters._ + +@RunWith(classOf[JUnitRunner]) +class TypeScriptAngularModelTest extends FlatSpec with Matchers { + + it should "convert a simple TypeScript Angular model" in { + val model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("name", new StringProperty()) + .property("createdAt", new DateTimeProperty()) + .required("id") + .required("name") + + val codegen = new TypeScriptAngularClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be("sample") + cm.classname should be("Sample") + cm.description should be("a sample model") + cm.vars.size should be(3) + + val vars = cm.vars + vars.get(0).baseName should be("id") + vars.get(0).datatype should be("number") + vars.get(0).name should be("id") + vars.get(0).defaultValue should be("null") + vars.get(0).baseType should be("number") + vars.get(0).hasMore should equal(true) + vars.get(0).required should equal(true) + vars.get(0).isNotContainer should equal(true) + + vars.get(1).baseName should be("name") + vars.get(1).datatype should be("string") + vars.get(1).name should be("name") + vars.get(1).defaultValue should be("null") + vars.get(1).baseType should be("string") + vars.get(1).hasMore should equal(true) + vars.get(1).required should equal(true) + vars.get(1).isNotContainer should equal(true) + + vars.get(2).baseName should be("createdAt") + vars.get(2).complexType should be("DateTime") + vars.get(2).datatype should be("DateTime") + vars.get(2).name should be("createdAt") + vars.get(2).defaultValue should be("null") + vars.get(2).hasMore should equal(null) + vars.get(2).required should equal(null) + vars.get(2).isNotContainer should equal(true) + } + + it should "convert a model with list property" in { + val model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("urls", new ArrayProperty() + .items(new StringProperty())) + .required("id") + + val codegen = new TypeScriptAngularClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be("sample") + cm.classname should be("Sample") + cm.description should be("a sample model") + cm.vars.size should be(2) + + val vars = cm.vars + vars.get(0).baseName should be("id") + vars.get(0).datatype should be("number") + vars.get(0).name should be("id") + vars.get(0).defaultValue should be("null") + vars.get(0).baseType should be("number") + vars.get(0).hasMore should equal(true) + vars.get(0).required should equal(true) + vars.get(0).isNotContainer should equal(true) + + vars.get(1).baseName should be("urls") + vars.get(1).datatype should be("Array") + vars.get(1).name should be("urls") + vars.get(1).baseType should be("Array") + vars.get(1).hasMore should be(null) + vars.get(1).required should equal(null) + vars.get(1).isContainer should equal(true) + } + + it should "convert a model with complex property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new RefProperty("#/definitions/Children")) + + val codegen = new TypeScriptAngularClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be("sample") + cm.classname should be("Sample") + cm.description should be("a sample model") + cm.vars.size should be(1) + + val vars = cm.vars + vars.get(0).baseName should be("children") + vars.get(0).datatype should be("Children") + vars.get(0).name should be("children") + vars.get(0).baseType should be("Children") + vars.get(0).required should equal(null) + vars.get(0).isNotContainer should equal(true) + } + + it should "convert a model with complex list property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new ArrayProperty() + .items(new RefProperty("#/definitions/Children"))) + + val codegen = new TypeScriptAngularClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be("sample") + cm.classname should be("Sample") + cm.description should be("a sample model") + cm.vars.size should be(1) + + val vars = cm.vars + vars.get(0).baseName should be("children") + vars.get(0).complexType should be("Children") + vars.get(0).datatype should be("Array") + vars.get(0).name should be("children") + vars.get(0).baseType should be("Array") + vars.get(0).required should equal(null) + vars.get(0).isContainer should equal(true) + } + + it should "convert an array model" in { + val model = new ArrayModel() + .description("an array model") + .items(new RefProperty("#/definitions/Children")) + val codegen = new TypeScriptAngularClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be("sample") + cm.classname should be("Sample") + cm.description should be("an array model") + cm.vars.size should be(0) + } + + it should "convert an map model" in { + val model = new ModelImpl() + .description("an map model") + .additionalProperties(new RefProperty("#/definitions/Children")) + + val codegen = new TypeScriptAngularClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be("sample") + cm.classname should be("Sample") + cm.description should be("an map model") + cm.vars.size should be(0) + cm.imports.size should be(1) + (cm.imports.asScala.toSet & Set("Children")).size should be(1) + } +} diff --git a/modules/swagger-codegen/src/test/scala/typescriptnode/TypeScriptNodeModelTest.scala b/modules/swagger-codegen/src/test/scala/typescriptnode/TypeScriptNodeModelTest.scala new file mode 100644 index 00000000000..0b91d717bf6 --- /dev/null +++ b/modules/swagger-codegen/src/test/scala/typescriptnode/TypeScriptNodeModelTest.scala @@ -0,0 +1,170 @@ +package typescriptnode + +import io.swagger.codegen.languages.TypeScriptNodeClientCodegen +import io.swagger.models._ +import io.swagger.models.properties._ +import org.junit.runner.RunWith +import org.scalatest.{FlatSpec, Matchers} +import org.scalatest.junit.JUnitRunner + +import scala.collection.JavaConverters._ + +@RunWith(classOf[JUnitRunner]) +class TypeScriptNodeModelTest extends FlatSpec with Matchers { + + it should "convert a simple TypeScript Node model" in { + val model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("name", new StringProperty()) + .property("createdAt", new DateTimeProperty()) + .required("id") + .required("name") + + val codegen = new TypeScriptNodeClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be("sample") + cm.classname should be("Sample") + cm.description should be("a sample model") + cm.vars.size should be(3) + + val vars = cm.vars + vars.get(0).baseName should be("id") + vars.get(0).datatype should be("number") + vars.get(0).name should be("id") + vars.get(0).defaultValue should be("null") + vars.get(0).baseType should be("number") + vars.get(0).hasMore should equal(true) + vars.get(0).required should equal(true) + vars.get(0).isNotContainer should equal(true) + + vars.get(1).baseName should be("name") + vars.get(1).datatype should be("string") + vars.get(1).name should be("name") + vars.get(1).defaultValue should be("null") + vars.get(1).baseType should be("string") + vars.get(1).hasMore should equal(true) + vars.get(1).required should equal(true) + vars.get(1).isNotContainer should equal(true) + + vars.get(2).baseName should be("createdAt") + vars.get(2).complexType should be("DateTime") + vars.get(2).datatype should be("DateTime") + vars.get(2).name should be("createdAt") + vars.get(2).defaultValue should be("null") + vars.get(2).hasMore should equal(null) + vars.get(2).required should equal(null) + vars.get(2).isNotContainer should equal(true) + } + + it should "convert a model with list property" in { + val model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("urls", new ArrayProperty() + .items(new StringProperty())) + .required("id") + + val codegen = new TypeScriptNodeClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be("sample") + cm.classname should be("Sample") + cm.description should be("a sample model") + cm.vars.size should be(2) + + val vars = cm.vars + vars.get(0).baseName should be("id") + vars.get(0).datatype should be("number") + vars.get(0).name should be("id") + vars.get(0).defaultValue should be("null") + vars.get(0).baseType should be("number") + vars.get(0).hasMore should equal(true) + vars.get(0).required should equal(true) + vars.get(0).isNotContainer should equal(true) + + vars.get(1).baseName should be("urls") + vars.get(1).datatype should be("Array") + vars.get(1).name should be("urls") + vars.get(1).baseType should be("Array") + vars.get(1).hasMore should be(null) + vars.get(1).required should equal(null) + vars.get(1).isContainer should equal(true) + } + + it should "convert a model with complex property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new RefProperty("#/definitions/Children")) + + val codegen = new TypeScriptNodeClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be("sample") + cm.classname should be("Sample") + cm.description should be("a sample model") + cm.vars.size should be(1) + + val vars = cm.vars + vars.get(0).baseName should be("children") + vars.get(0).datatype should be("Children") + vars.get(0).name should be("children") + vars.get(0).baseType should be("Children") + vars.get(0).required should equal(null) + vars.get(0).isNotContainer should equal(true) + } + + it should "convert a model with complex list property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new ArrayProperty() + .items(new RefProperty("#/definitions/Children"))) + + val codegen = new TypeScriptNodeClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be("sample") + cm.classname should be("Sample") + cm.description should be("a sample model") + cm.vars.size should be(1) + + val vars = cm.vars + vars.get(0).baseName should be("children") + vars.get(0).complexType should be("Children") + vars.get(0).datatype should be("Array") + vars.get(0).name should be("children") + vars.get(0).baseType should be("Array") + vars.get(0).required should equal(null) + vars.get(0).isContainer should equal(true) + } + + it should "convert an array model" in { + val model = new ArrayModel() + .description("an array model") + .items(new RefProperty("#/definitions/Children")) + val codegen = new TypeScriptNodeClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be("sample") + cm.classname should be("Sample") + cm.description should be("an array model") + cm.vars.size should be(0) + } + + it should "convert an map model" in { + val model = new ModelImpl() + .description("an map model") + .additionalProperties(new RefProperty("#/definitions/Children")) + + val codegen = new TypeScriptNodeClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be("sample") + cm.classname should be("Sample") + cm.description should be("an map model") + cm.vars.size should be(0) + cm.imports.size should be(1) + (cm.imports.asScala.toSet & Set("Children")).size should be(1) + } +} From 449ba4f64470592e0c08035a877919a5f47f0a0b Mon Sep 17 00:00:00 2001 From: Martin Hardorf Date: Thu, 18 Jun 2015 12:42:04 +0200 Subject: [PATCH 5/7] Fixed required parameters for APIs in TypeScript --- .../resources/TypeScript-Angular/api.mustache | 10 +++++----- .../resources/TypeScript-node/api.mustache | 10 +++++----- .../petstore/typescript-angular/api/PetApi.ts | 20 +++++++++++++++++++ .../typescript-angular/api/StoreApi.ts | 10 ++++++++++ .../typescript-angular/api/UserApi.ts | 15 ++++++++++++++ .../petstore/typescript-node/api/PetApi.ts | 20 +++++++++++++++++++ .../petstore/typescript-node/api/StoreApi.ts | 10 ++++++++++ .../petstore/typescript-node/api/UserApi.ts | 15 ++++++++++++++ 8 files changed, 100 insertions(+), 10 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/TypeScript-Angular/api.mustache b/modules/swagger-codegen/src/main/resources/TypeScript-Angular/api.mustache index 3b53e816891..1095667b245 100644 --- a/modules/swagger-codegen/src/main/resources/TypeScript-Angular/api.mustache +++ b/modules/swagger-codegen/src/main/resources/TypeScript-Angular/api.mustache @@ -29,12 +29,12 @@ module {{package}} { {{/pathParams}} var queryParameters: any = {}; var headers: any = {}; - {{#requiredParamCount}} - // verify required params are set - if ({{/requiredParamCount}}{{#requiredParams}} !{{paramName}} {{#hasMore}}|| {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}) { - throw new Error('Missing required parameter: {{¶mName}}'); + {{#allParams}}{{#required}} + // verify required parameter '{{paramName}}' is set + if (!{{paramName}}) { + throw new Error('Missing required parameter {{paramName}} when calling {{nickname}}'); } - {{/requiredParamCount}} + {{/required}}{{/allParams}} {{#queryParams}}if ({{paramName}} !== undefined) { queryParameters['{{paramName}}'] = {{paramName}}; }{{/queryParams}} diff --git a/modules/swagger-codegen/src/main/resources/TypeScript-node/api.mustache b/modules/swagger-codegen/src/main/resources/TypeScript-node/api.mustache index 4b329799ad5..156ad63f72d 100644 --- a/modules/swagger-codegen/src/main/resources/TypeScript-node/api.mustache +++ b/modules/swagger-codegen/src/main/resources/TypeScript-node/api.mustache @@ -26,12 +26,12 @@ export class {{classname}} { var queryParameters: any = {}; var headers: any = {}; - {{#requiredParamCount}} - // verify required params are set - if ({{/requiredParamCount}}{{#requiredParams}} !{{paramName}} {{#hasMore}}|| {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}) { - throw new Error('Missing required parameter: {{¶mName}}'); + {{#allParams}}{{#required}} + // verify required parameter '{{paramName}}' is set + if (!{{paramName}}) { + throw new Error('Missing required parameter {{paramName}} when calling {{nickname}}'); } - {{/requiredParamCount}} + {{/required}}{{/allParams}} {{#queryParams}}if ({{paramName}} !== undefined) { queryParameters['{{paramName}}'] = {{paramName}}; diff --git a/samples/client/petstore/typescript-angular/api/PetApi.ts b/samples/client/petstore/typescript-angular/api/PetApi.ts index 2c5f2a25b6d..d294cfbebbc 100644 --- a/samples/client/petstore/typescript-angular/api/PetApi.ts +++ b/samples/client/petstore/typescript-angular/api/PetApi.ts @@ -143,6 +143,11 @@ module api { var queryParameters: any = {}; var headers: any = {}; + // verify required parameter 'petId' is set + if (!petId) { + throw new Error('Missing required parameter petId when calling getPetById'); + } + var httpRequestParams: any = { @@ -173,6 +178,11 @@ module api { var queryParameters: any = {}; var headers: any = {}; + // verify required parameter 'petId' is set + if (!petId) { + throw new Error('Missing required parameter petId when calling updatePetWithForm'); + } + var httpRequestParams: any = { @@ -203,6 +213,11 @@ module api { var queryParameters: any = {}; var headers: any = {}; + // verify required parameter 'petId' is set + if (!petId) { + throw new Error('Missing required parameter petId when calling deletePet'); + } + headerParams['apiKey'] = apiKey; var httpRequestParams: any = { @@ -233,6 +248,11 @@ module api { var queryParameters: any = {}; var headers: any = {}; + // verify required parameter 'petId' is set + if (!petId) { + throw new Error('Missing required parameter petId when calling uploadFile'); + } + var httpRequestParams: any = { diff --git a/samples/client/petstore/typescript-angular/api/StoreApi.ts b/samples/client/petstore/typescript-angular/api/StoreApi.ts index e4c9e48e0e9..e8c85b00c45 100644 --- a/samples/client/petstore/typescript-angular/api/StoreApi.ts +++ b/samples/client/petstore/typescript-angular/api/StoreApi.ts @@ -82,6 +82,11 @@ module api { var queryParameters: any = {}; var headers: any = {}; + // verify required parameter 'orderId' is set + if (!orderId) { + throw new Error('Missing required parameter orderId when calling getOrderById'); + } + var httpRequestParams: any = { @@ -112,6 +117,11 @@ module api { var queryParameters: any = {}; var headers: any = {}; + // verify required parameter 'orderId' is set + if (!orderId) { + throw new Error('Missing required parameter orderId when calling deleteOrder'); + } + var httpRequestParams: any = { diff --git a/samples/client/petstore/typescript-angular/api/UserApi.ts b/samples/client/petstore/typescript-angular/api/UserApi.ts index dfbe9032dba..40d82f73852 100644 --- a/samples/client/petstore/typescript-angular/api/UserApi.ts +++ b/samples/client/petstore/typescript-angular/api/UserApi.ts @@ -172,6 +172,11 @@ module api { var queryParameters: any = {}; var headers: any = {}; + // verify required parameter 'username' is set + if (!username) { + throw new Error('Missing required parameter username when calling getUserByName'); + } + var httpRequestParams: any = { @@ -202,6 +207,11 @@ module api { var queryParameters: any = {}; var headers: any = {}; + // verify required parameter 'username' is set + if (!username) { + throw new Error('Missing required parameter username when calling updateUser'); + } + var httpRequestParams: any = { @@ -233,6 +243,11 @@ module api { var queryParameters: any = {}; var headers: any = {}; + // verify required parameter 'username' is set + if (!username) { + throw new Error('Missing required parameter username when calling deleteUser'); + } + var httpRequestParams: any = { diff --git a/samples/client/petstore/typescript-node/api/PetApi.ts b/samples/client/petstore/typescript-node/api/PetApi.ts index c948f8036e6..02605f2c8a8 100644 --- a/samples/client/petstore/typescript-node/api/PetApi.ts +++ b/samples/client/petstore/typescript-node/api/PetApi.ts @@ -193,6 +193,11 @@ export class PetApi { var headers: any = {}; + // verify required parameter 'petId' is set + if (!petId) { + throw new Error('Missing required parameter petId when calling getPetById'); + } + @@ -236,6 +241,11 @@ export class PetApi { var headers: any = {}; + // verify required parameter 'petId' is set + if (!petId) { + throw new Error('Missing required parameter petId when calling updatePetWithForm'); + } + @@ -279,6 +289,11 @@ export class PetApi { var headers: any = {}; + // verify required parameter 'petId' is set + if (!petId) { + throw new Error('Missing required parameter petId when calling deletePet'); + } + @@ -323,6 +338,11 @@ export class PetApi { var headers: any = {}; + // verify required parameter 'petId' is set + if (!petId) { + throw new Error('Missing required parameter petId when calling uploadFile'); + } + diff --git a/samples/client/petstore/typescript-node/api/StoreApi.ts b/samples/client/petstore/typescript-node/api/StoreApi.ts index 1c2c6623523..71cfe106fca 100644 --- a/samples/client/petstore/typescript-node/api/StoreApi.ts +++ b/samples/client/petstore/typescript-node/api/StoreApi.ts @@ -104,6 +104,11 @@ export class StoreApi { var headers: any = {}; + // verify required parameter 'orderId' is set + if (!orderId) { + throw new Error('Missing required parameter orderId when calling getOrderById'); + } + @@ -147,6 +152,11 @@ export class StoreApi { var headers: any = {}; + // verify required parameter 'orderId' is set + if (!orderId) { + throw new Error('Missing required parameter orderId when calling deleteOrder'); + } + diff --git a/samples/client/petstore/typescript-node/api/UserApi.ts b/samples/client/petstore/typescript-node/api/UserApi.ts index fa4365f8edc..ca6fd41c593 100644 --- a/samples/client/petstore/typescript-node/api/UserApi.ts +++ b/samples/client/petstore/typescript-node/api/UserApi.ts @@ -235,6 +235,11 @@ export class UserApi { var headers: any = {}; + // verify required parameter 'username' is set + if (!username) { + throw new Error('Missing required parameter username when calling getUserByName'); + } + @@ -278,6 +283,11 @@ export class UserApi { var headers: any = {}; + // verify required parameter 'username' is set + if (!username) { + throw new Error('Missing required parameter username when calling updateUser'); + } + @@ -322,6 +332,11 @@ export class UserApi { var headers: any = {}; + // verify required parameter 'username' is set + if (!username) { + throw new Error('Missing required parameter username when calling deleteUser'); + } + From c45af23946779a88444dab5a9795a19a41accbe5 Mon Sep 17 00:00:00 2001 From: Martin Hardorf Date: Tue, 23 Jun 2015 12:05:43 +0200 Subject: [PATCH 6/7] Fixed headerParams and paramName --- .../src/main/resources/TypeScript-Angular/api.mustache | 8 ++++---- .../src/main/resources/TypeScript-node/api.mustache | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/TypeScript-Angular/api.mustache b/modules/swagger-codegen/src/main/resources/TypeScript-Angular/api.mustache index 1095667b245..1bc4a8a02a1 100644 --- a/modules/swagger-codegen/src/main/resources/TypeScript-Angular/api.mustache +++ b/modules/swagger-codegen/src/main/resources/TypeScript-Angular/api.mustache @@ -22,13 +22,13 @@ module {{package}} { } } {{#operation}} - public {{nickname}} ({{#allParams}}{{paramName}}: {{{dataType}}}, {{/allParams}} extraHttpRequestParams?: any ) : ng.IHttpPromise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}{}{{/returnType}}> { + public {{nickname}} ({{#allParams}}{{paramName}}: {{{dataType}}}{{#hasMore}}, {{/hasMore}} {{/allParams}} extraHttpRequestParams?: any ) : ng.IHttpPromise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}{}{{/returnType}}> { var path = this.basePath + '{{path}}'; {{#pathParams}} path = path.replace('{' + '{{paramName}}' + '}', String({{paramName}})); {{/pathParams}} var queryParameters: any = {}; - var headers: any = {}; + var headerParams: any = {}; {{#allParams}}{{#required}} // verify required parameter '{{paramName}}' is set if (!{{paramName}}) { @@ -43,10 +43,10 @@ module {{package}} { method: '{{httpMethod}}', url: path, json: true, - {{#bodyParam}}data: body, + {{#bodyParam}}data: {{paramName}}, {{/bodyParam}} params: queryParameters, - headers: headers + headers: headerParams }; if (extraHttpRequestParams) { diff --git a/modules/swagger-codegen/src/main/resources/TypeScript-node/api.mustache b/modules/swagger-codegen/src/main/resources/TypeScript-node/api.mustache index 156ad63f72d..eb569cdc928 100644 --- a/modules/swagger-codegen/src/main/resources/TypeScript-node/api.mustache +++ b/modules/swagger-codegen/src/main/resources/TypeScript-node/api.mustache @@ -24,7 +24,7 @@ export class {{classname}} { {{/pathParams}} var queryParameters: any = {}; - var headers: any = {}; + var headerParams: any = {}; {{#allParams}}{{#required}} // verify required parameter '{{paramName}}' is set @@ -48,7 +48,7 @@ export class {{classname}} { qs: queryParameters, uri: path, json: true, - {{#bodyParam}}body: body, + {{#bodyParam}}body: {{paramName}}, {{/bodyParam}} auth: { username: this.username, password: this.password From 2fce2e410937a89cb35ac910a15dd1422d601171 Mon Sep 17 00:00:00 2001 From: Martin Hardorf Date: Tue, 23 Jun 2015 15:37:07 +0200 Subject: [PATCH 7/7] Removed wrong hasMore from Angular TypeScript mustache --- .../src/main/resources/TypeScript-Angular/api.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/swagger-codegen/src/main/resources/TypeScript-Angular/api.mustache b/modules/swagger-codegen/src/main/resources/TypeScript-Angular/api.mustache index 1bc4a8a02a1..88f7f9ff15a 100644 --- a/modules/swagger-codegen/src/main/resources/TypeScript-Angular/api.mustache +++ b/modules/swagger-codegen/src/main/resources/TypeScript-Angular/api.mustache @@ -22,7 +22,7 @@ module {{package}} { } } {{#operation}} - public {{nickname}} ({{#allParams}}{{paramName}}: {{{dataType}}}{{#hasMore}}, {{/hasMore}} {{/allParams}} extraHttpRequestParams?: any ) : ng.IHttpPromise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}{}{{/returnType}}> { + public {{nickname}} ({{#allParams}}{{paramName}}: {{{dataType}}}, {{/allParams}} extraHttpRequestParams?: any ) : ng.IHttpPromise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}{}{{/returnType}}> { var path = this.basePath + '{{path}}'; {{#pathParams}} path = path.replace('{' + '{{paramName}}' + '}', String({{paramName}}));