diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptClientCodegen.java index 5fd3214b5e2..159b2763ed6 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptClientCodegen.java @@ -107,6 +107,7 @@ public class TypeScriptClientCodegen extends DefaultCodegen implements CodegenCo typeMapping.put("date", "string"); typeMapping.put("DateTime", "Date"); typeMapping.put("binary", "any"); + // TODO: allow other types for file e.g. Blob typeMapping.put("File", "any"); typeMapping.put("ByteArray", "string"); typeMapping.put("UUID", "string"); @@ -677,7 +678,8 @@ public class TypeScriptClientCodegen extends DefaultCodegen implements CodegenCo inner = (Schema) p.getAdditionalProperties(); return "{ [key: string]: " + this.getTypeDeclaration(inner) + "; }"; } else if (ModelUtils.isFileSchema(p)) { - return "any"; + // TODO: Change type declaration + return "HttpFile"; } else if (ModelUtils.isBinarySchema(p)) { return "any"; } else { diff --git a/modules/openapi-generator/src/main/resources/typescript/api/api.mustache b/modules/openapi-generator/src/main/resources/typescript/api/api.mustache index 93cc09a5060..79d3353951d 100644 --- a/modules/openapi-generator/src/main/resources/typescript/api/api.mustache +++ b/modules/openapi-generator/src/main/resources/typescript/api/api.mustache @@ -1,6 +1,6 @@ // TODO: better import syntax? import { BaseAPIRequestFactory, RequiredError } from './baseapi'; -import { RequestContext, HttpMethod, ResponseContext} from '../http/http'; +import { RequestContext, HttpMethod, ResponseContext, HttpFile} from '../http/http'; import * as FormData from "form-data"; import {ObjectSerializer} from '../models/ObjectSerializer'; import {ApiException} from './exception'; @@ -68,7 +68,12 @@ export class {{classname}}RequestFactory extends BaseAPIRequestFactory { {{^isListContainer}} if ({{paramName}} !== undefined) { // TODO: replace .append with .set - localVarFormParams.append('{{baseName}}', {{paramName}} as any); + {{^isFile}} + localVarFormParams.append('{{baseName}}', {{paramName}} as any); + {{/isFile}} + {{#isFile}} + localVarFormParams.append('{{baseName}}', {{paramName}}.data, { "filename": {{paramName}}.name }); + {{/isFile}} } {{/isListContainer}} {{/formParams}} diff --git a/modules/openapi-generator/src/main/resources/typescript/generators/PromiseAPI.mustache b/modules/openapi-generator/src/main/resources/typescript/generators/PromiseAPI.mustache index 4922915ba5c..07e9a60ba7d 100644 --- a/modules/openapi-generator/src/main/resources/typescript/generators/PromiseAPI.mustache +++ b/modules/openapi-generator/src/main/resources/typescript/generators/PromiseAPI.mustache @@ -1,4 +1,4 @@ -import { ResponseContext } from './http/http'; +import { ResponseContext, HttpFile } from './http/http'; import * as models from './models/all'; import { Configuration} from './configuration' diff --git a/modules/openapi-generator/src/main/resources/typescript/http/http.mustache b/modules/openapi-generator/src/main/resources/typescript/http/http.mustache index e23d864203c..8e11238e3c7 100644 --- a/modules/openapi-generator/src/main/resources/typescript/http/http.mustache +++ b/modules/openapi-generator/src/main/resources/typescript/http/http.mustache @@ -15,6 +15,10 @@ export enum HttpMethod { TRACE = "TRACE", PATCH = "PATCH" } +export interface HttpFile { + data: Buffer; + name: string; +} export interface FormEntry { contentDisposition: string; diff --git a/samples/client/petstore/typescript/builds/default/PromiseAPI.ts b/samples/client/petstore/typescript/builds/default/PromiseAPI.ts index d6888f214b5..2b89bbc5fd7 100644 --- a/samples/client/petstore/typescript/builds/default/PromiseAPI.ts +++ b/samples/client/petstore/typescript/builds/default/PromiseAPI.ts @@ -1,4 +1,4 @@ -import { ResponseContext } from './http/http'; +import { ResponseContext, HttpFile } from './http/http'; import * as models from './models/all'; import { Configuration} from './configuration' @@ -152,7 +152,7 @@ export class PetApi { }); } - public uploadFile(petId: number, additionalMetadata?: string, file?: any, options?: any): Promise { + public uploadFile(petId: number, additionalMetadata?: string, file?: HttpFile, options?: any): Promise { const requestContext = this.requestFactory.uploadFile(petId, additionalMetadata, file, options); // build promise chain diff --git a/samples/client/petstore/typescript/builds/default/apis/PetApi.ts b/samples/client/petstore/typescript/builds/default/apis/PetApi.ts index f7a19f1ece0..b5a654bb50b 100644 --- a/samples/client/petstore/typescript/builds/default/apis/PetApi.ts +++ b/samples/client/petstore/typescript/builds/default/apis/PetApi.ts @@ -1,6 +1,6 @@ // TODO: better import syntax? import { BaseAPIRequestFactory, RequiredError } from './baseapi'; -import { RequestContext, HttpMethod, ResponseContext} from '../http/http'; +import { RequestContext, HttpMethod, ResponseContext, HttpFile} from '../http/http'; import * as FormData from "form-data"; import {ObjectSerializer} from '../models/ObjectSerializer'; import {ApiException} from './exception'; @@ -253,11 +253,11 @@ export class PetApiRequestFactory extends BaseAPIRequestFactory { if (name !== undefined) { // TODO: replace .append with .set - localVarFormParams.append('name', name as any); + localVarFormParams.append('name', name as any); } if (status !== undefined) { // TODO: replace .append with .set - localVarFormParams.append('status', status as any); + localVarFormParams.append('status', status as any); } requestContext.setBody(localVarFormParams); @@ -273,7 +273,7 @@ export class PetApiRequestFactory extends BaseAPIRequestFactory { return requestContext; } - public uploadFile(petId: number, additionalMetadata?: string, file?: any, options?: any): RequestContext { + public uploadFile(petId: number, additionalMetadata?: string, file?: HttpFile, options?: any): RequestContext { // verify required parameter 'petId' is not null or undefined if (petId === null || petId === undefined) { throw new RequiredError('Required parameter petId was null or undefined when calling uploadFile.'); @@ -297,11 +297,11 @@ export class PetApiRequestFactory extends BaseAPIRequestFactory { if (additionalMetadata !== undefined) { // TODO: replace .append with .set - localVarFormParams.append('additionalMetadata', additionalMetadata as any); + localVarFormParams.append('additionalMetadata', additionalMetadata as any); } if (file !== undefined) { // TODO: replace .append with .set - localVarFormParams.append('file', file as any); + localVarFormParams.append('file', file.data, { "filename": file.name }); } requestContext.setBody(localVarFormParams); diff --git a/samples/client/petstore/typescript/builds/default/apis/StoreApi.ts b/samples/client/petstore/typescript/builds/default/apis/StoreApi.ts index 67ca8296df6..9908e231924 100644 --- a/samples/client/petstore/typescript/builds/default/apis/StoreApi.ts +++ b/samples/client/petstore/typescript/builds/default/apis/StoreApi.ts @@ -1,6 +1,6 @@ // TODO: better import syntax? import { BaseAPIRequestFactory, RequiredError } from './baseapi'; -import { RequestContext, HttpMethod, ResponseContext} from '../http/http'; +import { RequestContext, HttpMethod, ResponseContext, HttpFile} from '../http/http'; import * as FormData from "form-data"; import {ObjectSerializer} from '../models/ObjectSerializer'; import {ApiException} from './exception'; diff --git a/samples/client/petstore/typescript/builds/default/apis/UserApi.ts b/samples/client/petstore/typescript/builds/default/apis/UserApi.ts index c5bdf836ef6..fb70caee35a 100644 --- a/samples/client/petstore/typescript/builds/default/apis/UserApi.ts +++ b/samples/client/petstore/typescript/builds/default/apis/UserApi.ts @@ -1,6 +1,6 @@ // TODO: better import syntax? import { BaseAPIRequestFactory, RequiredError } from './baseapi'; -import { RequestContext, HttpMethod, ResponseContext} from '../http/http'; +import { RequestContext, HttpMethod, ResponseContext, HttpFile} from '../http/http'; import * as FormData from "form-data"; import {ObjectSerializer} from '../models/ObjectSerializer'; import {ApiException} from './exception'; diff --git a/samples/client/petstore/typescript/builds/default/http/http.ts b/samples/client/petstore/typescript/builds/default/http/http.ts index e23d864203c..8e11238e3c7 100644 --- a/samples/client/petstore/typescript/builds/default/http/http.ts +++ b/samples/client/petstore/typescript/builds/default/http/http.ts @@ -15,6 +15,10 @@ export enum HttpMethod { TRACE = "TRACE", PATCH = "PATCH" } +export interface HttpFile { + data: Buffer; + name: string; +} export interface FormEntry { contentDisposition: string; diff --git a/samples/client/petstore/typescript/tests/default/package-lock.json b/samples/client/petstore/typescript/tests/default/package-lock.json index 8c91101d444..de0cb9aad91 100644 --- a/samples/client/petstore/typescript/tests/default/package-lock.json +++ b/samples/client/petstore/typescript/tests/default/package-lock.json @@ -1313,14 +1313,14 @@ } }, "mime-db": { - "version": "1.36.0", + "version": "1.37.0", "bundled": true }, "mime-types": { - "version": "2.1.20", + "version": "2.1.21", "bundled": true, "requires": { - "mime-db": "~1.36.0" + "mime-db": "~1.37.0" } }, "node-fetch": { @@ -1343,10 +1343,6 @@ "version": "2.1.2", "bundled": true }, - "typescript": { - "version": "2.9.2", - "bundled": true - }, "url-parse": { "version": "1.4.3", "bundled": true, diff --git a/samples/client/petstore/typescript/tests/default/test/api/PetApi.test.ts b/samples/client/petstore/typescript/tests/default/test/api/PetApi.test.ts index bdd6f52fb34..012dabaf4ef 100644 --- a/samples/client/petstore/typescript/tests/default/test/api/PetApi.test.ts +++ b/samples/client/petstore/typescript/tests/default/test/api/PetApi.test.ts @@ -1,5 +1,6 @@ -import {PetApi, Configuration, Pet, ApiException, Tag} from 'ts-petstore-client' +import {PetApi, Configuration, Pet, ApiException, Tag, HttpFile} from 'ts-petstore-client' import { expect, assert } from "chai"; +import * as fs from 'fs'; const configuration = new Configuration() const petApi = new PetApi(configuration) @@ -18,8 +19,6 @@ pet.category = undefined describe("PetApi", () =>{ it("addPet", (done) => { - - petApi.addPet(pet).then(() => { return petApi.getPetById(pet.id) }).then((createdPet) => { @@ -38,7 +37,7 @@ describe("PetApi", () =>{ }).then((pet: Pet) => { done("Pet with id " + pet.id + " was not deleted!"); }).catch((err: any) => { - if (err instanceof ApiException && err.code == 404) { + if (err.code && err.code == 404) { done(); } else { done(err) @@ -118,8 +117,14 @@ describe("PetApi", () =>{ }) })*/ -/* it("", (done) => { - file - petApi.uploadFile(pet.id, "", file) - })*/ + it("uploadFile", (done) => { + const image = fs.readFileSync(__dirname + "/pet.png") + petApi.uploadFile(pet.id, "Metadata", { name: "pet.png", data: image}).then((response: any) => { + expect(response.code).to.be.gte(200).and.lt(300); + expect(response.message).to.contain("pet.png"); + done(); + }).catch((err) => { + done(err); + }) + }) }) \ No newline at end of file diff --git a/samples/client/petstore/typescript/tests/default/test/api/pet.png b/samples/client/petstore/typescript/tests/default/test/api/pet.png new file mode 100644 index 00000000000..c9a9c49163d Binary files /dev/null and b/samples/client/petstore/typescript/tests/default/test/api/pet.png differ