From d1ed4b90a448678f6bd5b8019b2fda64910bcf19 Mon Sep 17 00:00:00 2001
From: Bodo Graumann <mail@bodograumann.de>
Date: Sat, 28 Dec 2019 20:35:12 +0100
Subject: [PATCH 1/4] Allow passing file parameters as File objects

This is by far the most common use case. A `File` object already
contains the name attribute. This commit allows that information to be
used directly.
When sending a `Blob`, in most browsers the `File` constructor can be
used to assign a file name. In all other browsers the alternative is
```typescript
Object.assign(data, { name: "foobar.txt" });
```
That is why we explicitely pass the name as third parameter to
`FormData.append`. This `Object.assign` method also works for `Buffer`
objects in node.

If one really does not want to touch the data object in the browser it
is possible to define another reference to the data with
```typescript
new Blob([data], { type: data.type })
```
or in node via
```typescript
Buffer.from(data)
```
---
 .../resources/typescript/api/api.mustache     |  2 +-
 .../resources/typescript/http/http.mustache   |  5 +-
 .../typescript/builds/default/apis/PetApi.ts  |  2 +-
 .../typescript/builds/default/http/http.ts    |  5 +-
 .../typescript/builds/jquery/apis/PetApi.ts   |  2 +-
 .../typescript/builds/jquery/http/http.ts     |  5 +-
 .../tests/default/package-lock.json           | 63 ++++++++++++-------
 .../tests/default/test/api/PetApi.test.ts     |  2 +-
 .../tests/jquery/test/api/PetApi.test.ts      |  2 +-
 9 files changed, 50 insertions(+), 38 deletions(-)

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 4ac32d6839d..a37bd64c2fb 100644
--- a/modules/openapi-generator/src/main/resources/typescript/api/api.mustache
+++ b/modules/openapi-generator/src/main/resources/typescript/api/api.mustache
@@ -92,7 +92,7 @@ export class {{classname}}RequestFactory extends BaseAPIRequestFactory {
              localVarFormParams.append('{{baseName}}', {{paramName}} as any);
              {{/isFile}}
              {{#isFile}}
-             localVarFormParams.append('{{baseName}}', {{paramName}}.data, {{paramName}}.name);
+             localVarFormParams.append('{{baseName}}', {{paramName}}, {{paramName}}.name);
              {{/isFile}}  
         }
         {{/isListContainer}}
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 9effd770471..c232df40b08 100644
--- a/modules/openapi-generator/src/main/resources/typescript/http/http.mustache
+++ b/modules/openapi-generator/src/main/resources/typescript/http/http.mustache
@@ -36,10 +36,7 @@ export enum HttpMethod {
 /**
  * Represents a http file which will be uploaded to a server.
  */
-export interface HttpFile {
-	data: {{{fileContentDataType}}};
-	name: string;
-}
+export type HttpFile = {{{fileContentDataType}}} & { readonly name: string };
 
 
 export class HttpException extends Error {
diff --git a/samples/client/petstore/typescript/builds/default/apis/PetApi.ts b/samples/client/petstore/typescript/builds/default/apis/PetApi.ts
index 7f9e16f207a..b8f628075ab 100644
--- a/samples/client/petstore/typescript/builds/default/apis/PetApi.ts
+++ b/samples/client/petstore/typescript/builds/default/apis/PetApi.ts
@@ -365,7 +365,7 @@ export class PetApiRequestFactory extends BaseAPIRequestFactory {
         }
         if (file !== undefined) {
         // TODO: replace .append with .set
-             localVarFormParams.append('file', file.data, file.name);
+             localVarFormParams.append('file', file, file.name);
         }
 		requestContext.setBody(localVarFormParams);
 
diff --git a/samples/client/petstore/typescript/builds/default/http/http.ts b/samples/client/petstore/typescript/builds/default/http/http.ts
index 415a86c7d19..fe0ff1a1c10 100644
--- a/samples/client/petstore/typescript/builds/default/http/http.ts
+++ b/samples/client/petstore/typescript/builds/default/http/http.ts
@@ -25,10 +25,7 @@ export enum HttpMethod {
 /**
  * Represents a http file which will be uploaded to a server.
  */
-export interface HttpFile {
-	data: Buffer;
-	name: string;
-}
+export type HttpFile = Buffer & { readonly name: string };
 
 
 export class HttpException extends Error {
diff --git a/samples/client/petstore/typescript/builds/jquery/apis/PetApi.ts b/samples/client/petstore/typescript/builds/jquery/apis/PetApi.ts
index 31693b0eb4c..4882a9d216d 100644
--- a/samples/client/petstore/typescript/builds/jquery/apis/PetApi.ts
+++ b/samples/client/petstore/typescript/builds/jquery/apis/PetApi.ts
@@ -364,7 +364,7 @@ export class PetApiRequestFactory extends BaseAPIRequestFactory {
         }
         if (file !== undefined) {
         // TODO: replace .append with .set
-             localVarFormParams.append('file', file.data, file.name);
+             localVarFormParams.append('file', file, file.name);
         }
 		requestContext.setBody(localVarFormParams);
 
diff --git a/samples/client/petstore/typescript/builds/jquery/http/http.ts b/samples/client/petstore/typescript/builds/jquery/http/http.ts
index 14c71de90df..1071360efbc 100644
--- a/samples/client/petstore/typescript/builds/jquery/http/http.ts
+++ b/samples/client/petstore/typescript/builds/jquery/http/http.ts
@@ -23,10 +23,7 @@ export enum HttpMethod {
 /**
  * Represents a http file which will be uploaded to a server.
  */
-export interface HttpFile {
-	data: Blob;
-	name: string;
-}
+export type HttpFile = Blob & { readonly name: string };
 
 
 export class HttpException extends Error {
diff --git a/samples/client/petstore/typescript/tests/default/package-lock.json b/samples/client/petstore/typescript/tests/default/package-lock.json
index d4543da2698..23c63616b5d 100644
--- a/samples/client/petstore/typescript/tests/default/package-lock.json
+++ b/samples/client/petstore/typescript/tests/default/package-lock.json
@@ -1226,45 +1226,54 @@
       "dependencies": {
         "@types/isomorphic-fetch": {
           "version": "0.0.34",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/@types/isomorphic-fetch/-/isomorphic-fetch-0.0.34.tgz",
+          "integrity": "sha1-PDSD5gbAQTeEOOlRRk8A5OYHBtY="
         },
         "@types/node": {
           "version": "12.12.7",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.7.tgz",
+          "integrity": "sha512-E6Zn0rffhgd130zbCbAr/JdXfXkoOUFAKNs/rF8qnafSJ8KYaA/j3oz7dcwal+lYjLA7xvdd5J4wdYpCTlP8+w=="
         },
         "asynckit": {
           "version": "0.4.0",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+          "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
         },
         "btoa": {
           "version": "1.2.1",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz",
+          "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g=="
         },
         "combined-stream": {
           "version": "1.0.8",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+          "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
           "requires": {
             "delayed-stream": "~1.0.0"
           }
         },
         "delayed-stream": {
           "version": "1.0.0",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+          "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
         },
         "encoding": {
           "version": "0.1.12",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
+          "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
           "requires": {
             "iconv-lite": "~0.4.13"
           }
         },
         "es6-promise": {
           "version": "4.2.5",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz",
+          "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg=="
         },
         "form-data": {
           "version": "2.5.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
+          "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
           "requires": {
             "asynckit": "^0.4.0",
             "combined-stream": "^1.0.6",
@@ -1273,18 +1282,21 @@
         },
         "iconv-lite": {
           "version": "0.4.24",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
           "requires": {
             "safer-buffer": ">= 2.1.2 < 3"
           }
         },
         "is-stream": {
           "version": "1.1.0",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+          "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
         },
         "isomorphic-fetch": {
           "version": "2.2.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
+          "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
           "requires": {
             "node-fetch": "^1.0.1",
             "whatwg-fetch": ">=0.10.0"
@@ -1292,18 +1304,21 @@
         },
         "mime-db": {
           "version": "1.40.0",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
+          "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
         },
         "mime-types": {
           "version": "2.1.24",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
+          "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
           "requires": {
             "mime-db": "1.40.0"
           }
         },
         "node-fetch": {
           "version": "1.7.3",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
+          "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
           "requires": {
             "encoding": "^0.1.11",
             "is-stream": "^1.0.1"
@@ -1311,23 +1326,28 @@
         },
         "querystringify": {
           "version": "2.1.0",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz",
+          "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg=="
         },
         "requires-port": {
           "version": "1.0.0",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+          "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
         },
         "safer-buffer": {
           "version": "2.1.2",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+          "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
         },
         "typescript": {
           "version": "2.9.2",
-          "bundled": true
+          "resolved": false,
+          "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w=="
         },
         "url-parse": {
           "version": "1.4.3",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz",
+          "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==",
           "requires": {
             "querystringify": "^2.0.0",
             "requires-port": "^1.0.0"
@@ -1335,7 +1355,8 @@
         },
         "whatwg-fetch": {
           "version": "3.0.0",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz",
+          "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q=="
         }
       }
     },
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 fe9df6c6770..61b4f4330ca 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
@@ -120,7 +120,7 @@ describe("PetApi", () =>{
 
     it("uploadFile", (done) => {
         const image = fs.readFileSync(__dirname + "/pet.png")
-        petApi.uploadFile(pet.id, "Metadata", { name: "pet.png", data: image}).then((response: any) => {
+        petApi.uploadFile(pet.id, "Metadata", Object.assign(image, { name: "pet.png" })).then((response: any) => {
             expect(response.code).to.be.gte(200).and.lt(300);
             expect(response.message).to.contain("pet.png");
             done();
diff --git a/samples/client/petstore/typescript/tests/jquery/test/api/PetApi.test.ts b/samples/client/petstore/typescript/tests/jquery/test/api/PetApi.test.ts
index 17b0b6f4d88..16a3d7c9efa 100644
--- a/samples/client/petstore/typescript/tests/jquery/test/api/PetApi.test.ts
+++ b/samples/client/petstore/typescript/tests/jquery/test/api/PetApi.test.ts
@@ -111,7 +111,7 @@ QUnit.test("updatePet", (assert: any) => {
 /** not easily possible?
 QUnit.test("uploadFile", (done) => {
     const image = fs.readFileSync(__dirname + "/pet.png")
-    petApi.uploadFile(pet.id, "Metadata", { name: "pet.png", data: image}).then((response: any) => {
+    petApi.uploadFile(pet.id, "Metadata", Object.assign(image, { name: "pet.png" })).then((response: any) => {
         expect(response.code).to.be.gte(200).and.lt(300);
         expect(response.message).to.contain("pet.png");
         done();
-- 
GitLab


From d766248b9eef8fc5a81f5fc061b3ddbd6c3f0eae Mon Sep 17 00:00:00 2001
From: Bodo Graumann <mail@bodograumann.de>
Date: Sat, 18 Jan 2020 18:25:31 +0100
Subject: [PATCH 2/4] Add test for jquery upload

---
 .../typescript/tests/jquery/package-lock.json | 183 ++++++++++++++----
 .../typescript/tests/jquery/package.json      |   1 +
 .../tests/jquery/test/api/PetApi.test.ts      |  29 +--
 .../typescript/tests/jquery/webpack.config.js |   4 +
 4 files changed, 161 insertions(+), 56 deletions(-)

diff --git a/samples/client/petstore/typescript/tests/jquery/package-lock.json b/samples/client/petstore/typescript/tests/jquery/package-lock.json
index f1ff014ed63..75916fc8781 100644
--- a/samples/client/petstore/typescript/tests/jquery/package-lock.json
+++ b/samples/client/petstore/typescript/tests/jquery/package-lock.json
@@ -1888,7 +1888,8 @@
         },
         "ansi-regex": {
           "version": "2.1.1",
-          "bundled": true
+          "bundled": true,
+          "optional": true
         },
         "aproba": {
           "version": "1.2.0",
@@ -1906,11 +1907,13 @@
         },
         "balanced-match": {
           "version": "1.0.0",
-          "bundled": true
+          "bundled": true,
+          "optional": true
         },
         "brace-expansion": {
           "version": "1.1.11",
           "bundled": true,
+          "optional": true,
           "requires": {
             "balanced-match": "^1.0.0",
             "concat-map": "0.0.1"
@@ -1923,15 +1926,18 @@
         },
         "code-point-at": {
           "version": "1.1.0",
-          "bundled": true
+          "bundled": true,
+          "optional": true
         },
         "concat-map": {
           "version": "0.0.1",
-          "bundled": true
+          "bundled": true,
+          "optional": true
         },
         "console-control-strings": {
           "version": "1.1.0",
-          "bundled": true
+          "bundled": true,
+          "optional": true
         },
         "core-util-is": {
           "version": "1.0.2",
@@ -2034,7 +2040,8 @@
         },
         "inherits": {
           "version": "2.0.3",
-          "bundled": true
+          "bundled": true,
+          "optional": true
         },
         "ini": {
           "version": "1.3.5",
@@ -2044,6 +2051,7 @@
         "is-fullwidth-code-point": {
           "version": "1.0.0",
           "bundled": true,
+          "optional": true,
           "requires": {
             "number-is-nan": "^1.0.0"
           }
@@ -2056,17 +2064,20 @@
         "minimatch": {
           "version": "3.0.4",
           "bundled": true,
+          "optional": true,
           "requires": {
             "brace-expansion": "^1.1.7"
           }
         },
         "minimist": {
           "version": "0.0.8",
-          "bundled": true
+          "bundled": true,
+          "optional": true
         },
         "minipass": {
           "version": "2.3.5",
           "bundled": true,
+          "optional": true,
           "requires": {
             "safe-buffer": "^5.1.2",
             "yallist": "^3.0.0"
@@ -2083,6 +2094,7 @@
         "mkdirp": {
           "version": "0.5.1",
           "bundled": true,
+          "optional": true,
           "requires": {
             "minimist": "0.0.8"
           }
@@ -2155,7 +2167,8 @@
         },
         "number-is-nan": {
           "version": "1.0.1",
-          "bundled": true
+          "bundled": true,
+          "optional": true
         },
         "object-assign": {
           "version": "4.1.1",
@@ -2165,6 +2178,7 @@
         "once": {
           "version": "1.4.0",
           "bundled": true,
+          "optional": true,
           "requires": {
             "wrappy": "1"
           }
@@ -2240,7 +2254,8 @@
         },
         "safe-buffer": {
           "version": "5.1.2",
-          "bundled": true
+          "bundled": true,
+          "optional": true
         },
         "safer-buffer": {
           "version": "2.1.2",
@@ -2270,6 +2285,7 @@
         "string-width": {
           "version": "1.0.2",
           "bundled": true,
+          "optional": true,
           "requires": {
             "code-point-at": "^1.0.0",
             "is-fullwidth-code-point": "^1.0.0",
@@ -2287,6 +2303,7 @@
         "strip-ansi": {
           "version": "3.0.1",
           "bundled": true,
+          "optional": true,
           "requires": {
             "ansi-regex": "^2.0.0"
           }
@@ -2325,11 +2342,13 @@
         },
         "wrappy": {
           "version": "1.0.2",
-          "bundled": true
+          "bundled": true,
+          "optional": true
         },
         "yallist": {
           "version": "3.0.3",
-          "bundled": true
+          "bundled": true,
+          "optional": true
         }
       }
     },
@@ -3761,6 +3780,52 @@
         "safe-buffer": "^5.1.0"
       }
     },
+    "raw-loader": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.0.tgz",
+      "integrity": "sha512-iINUOYvl1cGEmfoaLjnZXt4bKfT2LJnZZib5N/LLyAphC+Dd11vNP9CNVb38j+SAJpFI1uo8j9frmih53ASy7Q==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.2.3",
+        "schema-utils": "^2.5.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "6.12.0",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
+          "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "ajv-keywords": {
+          "version": "3.4.1",
+          "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz",
+          "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==",
+          "dev": true
+        },
+        "fast-deep-equal": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
+          "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==",
+          "dev": true
+        },
+        "schema-utils": {
+          "version": "2.6.4",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz",
+          "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.10.2",
+            "ajv-keywords": "^3.4.1"
+          }
+        }
+      }
+    },
     "readable-stream": {
       "version": "2.3.6",
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
@@ -4687,25 +4752,29 @@
       "dependencies": {
         "@types/form-data": {
           "version": "2.2.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz",
+          "integrity": "sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ==",
           "requires": {
             "@types/node": "*"
           }
         },
         "@types/jquery": {
           "version": "3.3.29",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.3.29.tgz",
+          "integrity": "sha512-FhJvBninYD36v3k6c+bVk1DSZwh7B5Dpb/Pyk3HKVsiohn0nhbefZZ+3JXbWQhFyt0MxSl2jRDdGQPHeOHFXrQ==",
           "requires": {
             "@types/sizzle": "*"
           }
         },
         "@types/node": {
           "version": "12.0.0",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.0.tgz",
+          "integrity": "sha512-Jrb/x3HT4PTJp6a4avhmJCDEVrPdqLfl3e8GGMbpkGGdwAV5UGlIs4vVEfsHHfylZVOKZWpOqmqFH8CbfOZ6kg=="
         },
         "@types/rx": {
           "version": "4.1.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/@types/rx/-/rx-4.1.1.tgz",
+          "integrity": "sha1-WY/JSla67ZdfGUV04PVy/Y5iekg=",
           "requires": {
             "@types/rx-core": "*",
             "@types/rx-core-binding": "*",
@@ -4723,18 +4792,21 @@
         },
         "@types/rx-core": {
           "version": "4.0.3",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/@types/rx-core/-/rx-core-4.0.3.tgz",
+          "integrity": "sha1-CzNUsSOM7b4rdPYybxOdvHpZHWA="
         },
         "@types/rx-core-binding": {
           "version": "4.0.4",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/@types/rx-core-binding/-/rx-core-binding-4.0.4.tgz",
+          "integrity": "sha512-5pkfxnC4w810LqBPUwP5bg7SFR/USwhMSaAeZQQbEHeBp57pjKXRlXmqpMrLJB4y1oglR/c2502853uN0I+DAQ==",
           "requires": {
             "@types/rx-core": "*"
           }
         },
         "@types/rx-lite": {
           "version": "4.0.6",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/@types/rx-lite/-/rx-lite-4.0.6.tgz",
+          "integrity": "sha512-oYiDrFIcor9zDm0VDUca1UbROiMYBxMLMaM6qzz4ADAfOmA9r1dYEcAFH+2fsPI5BCCjPvV9pWC3X3flbrvs7w==",
           "requires": {
             "@types/rx-core": "*",
             "@types/rx-core-binding": "*"
@@ -4742,97 +4814,113 @@
         },
         "@types/rx-lite-aggregates": {
           "version": "4.0.3",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/@types/rx-lite-aggregates/-/rx-lite-aggregates-4.0.3.tgz",
+          "integrity": "sha512-MAGDAHy8cRatm94FDduhJF+iNS5//jrZ/PIfm+QYw9OCeDgbymFHChM8YVIvN2zArwsRftKgE33QfRWvQk4DPg==",
           "requires": {
             "@types/rx-lite": "*"
           }
         },
         "@types/rx-lite-async": {
           "version": "4.0.2",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/@types/rx-lite-async/-/rx-lite-async-4.0.2.tgz",
+          "integrity": "sha512-vTEv5o8l6702ZwfAM5aOeVDfUwBSDOs+ARoGmWAKQ6LOInQ8J4/zjM7ov12fuTpktUKdMQjkeCp07Vd73mPkxw==",
           "requires": {
             "@types/rx-lite": "*"
           }
         },
         "@types/rx-lite-backpressure": {
           "version": "4.0.3",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/@types/rx-lite-backpressure/-/rx-lite-backpressure-4.0.3.tgz",
+          "integrity": "sha512-Y6aIeQCtNban5XSAF4B8dffhIKu6aAy/TXFlScHzSxh6ivfQBQw6UjxyEJxIOt3IT49YkS+siuayM2H/Q0cmgA==",
           "requires": {
             "@types/rx-lite": "*"
           }
         },
         "@types/rx-lite-coincidence": {
           "version": "4.0.3",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/@types/rx-lite-coincidence/-/rx-lite-coincidence-4.0.3.tgz",
+          "integrity": "sha512-1VNJqzE9gALUyMGypDXZZXzR0Tt7LC9DdAZQ3Ou/Q0MubNU35agVUNXKGHKpNTba+fr8GdIdkC26bRDqtCQBeQ==",
           "requires": {
             "@types/rx-lite": "*"
           }
         },
         "@types/rx-lite-experimental": {
           "version": "4.0.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/@types/rx-lite-experimental/-/rx-lite-experimental-4.0.1.tgz",
+          "integrity": "sha1-xTL1y98/LBXaFt7Ykw0bKYQCPL0=",
           "requires": {
             "@types/rx-lite": "*"
           }
         },
         "@types/rx-lite-joinpatterns": {
           "version": "4.0.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/@types/rx-lite-joinpatterns/-/rx-lite-joinpatterns-4.0.1.tgz",
+          "integrity": "sha1-9w/jcFGKhDLykVjMkv+1a05K/D4=",
           "requires": {
             "@types/rx-lite": "*"
           }
         },
         "@types/rx-lite-testing": {
           "version": "4.0.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/@types/rx-lite-testing/-/rx-lite-testing-4.0.1.tgz",
+          "integrity": "sha1-IbGdEfTf1v/vWp0WSOnIh5v+Iek=",
           "requires": {
             "@types/rx-lite-virtualtime": "*"
           }
         },
         "@types/rx-lite-time": {
           "version": "4.0.3",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/@types/rx-lite-time/-/rx-lite-time-4.0.3.tgz",
+          "integrity": "sha512-ukO5sPKDRwCGWRZRqPlaAU0SKVxmWwSjiOrLhoQDoWxZWg6vyB9XLEZViKOzIO6LnTIQBlk4UylYV0rnhJLxQw==",
           "requires": {
             "@types/rx-lite": "*"
           }
         },
         "@types/rx-lite-virtualtime": {
           "version": "4.0.3",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/@types/rx-lite-virtualtime/-/rx-lite-virtualtime-4.0.3.tgz",
+          "integrity": "sha512-3uC6sGmjpOKatZSVHI2xB1+dedgml669ZRvqxy+WqmGJDVusOdyxcKfyzjW0P3/GrCiN4nmRkLVMhPwHCc5QLg==",
           "requires": {
             "@types/rx-lite": "*"
           }
         },
         "@types/sizzle": {
           "version": "2.3.2",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz",
+          "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg=="
         },
         "asynckit": {
           "version": "0.4.0",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+          "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
         },
         "btoa": {
           "version": "1.2.1",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz",
+          "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g=="
         },
         "combined-stream": {
           "version": "1.0.8",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+          "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
           "requires": {
             "delayed-stream": "~1.0.0"
           }
         },
         "delayed-stream": {
           "version": "1.0.0",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+          "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
         },
         "es6-promise": {
           "version": "4.2.6",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz",
+          "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q=="
         },
         "form-data": {
           "version": "2.5.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
+          "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
           "requires": {
             "asynckit": "^0.4.0",
             "combined-stream": "^1.0.6",
@@ -4841,45 +4929,54 @@
         },
         "jquery": {
           "version": "3.4.1",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz",
+          "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw=="
         },
         "mime-db": {
           "version": "1.40.0",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
+          "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
         },
         "mime-types": {
           "version": "2.1.24",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
+          "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
           "requires": {
             "mime-db": "1.40.0"
           }
         },
         "querystringify": {
           "version": "2.1.1",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz",
+          "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA=="
         },
         "requires-port": {
           "version": "1.0.0",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+          "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
         },
         "rxjs": {
           "version": "6.5.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.1.tgz",
+          "integrity": "sha512-y0j31WJc83wPu31vS1VlAFW5JGrnGC+j+TtGAa1fRQphy48+fDYiDmX8tjGloToEsMkxnouOg/1IzXGKkJnZMg==",
           "requires": {
             "tslib": "^1.9.0"
           }
         },
         "tslib": {
           "version": "1.9.3",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+          "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="
         },
         "typescript": {
           "version": "2.9.2",
-          "bundled": true
+          "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz",
+          "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w=="
         },
         "url-parse": {
           "version": "1.4.7",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz",
+          "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==",
           "requires": {
             "querystringify": "^2.1.1",
             "requires-port": "^1.0.0"
diff --git a/samples/client/petstore/typescript/tests/jquery/package.json b/samples/client/petstore/typescript/tests/jquery/package.json
index f83edaf156d..37ac165cdd0 100644
--- a/samples/client/petstore/typescript/tests/jquery/package.json
+++ b/samples/client/petstore/typescript/tests/jquery/package.json
@@ -21,6 +21,7 @@
   },
   "devDependencies": {
     "@types/node": "^8.10.48",
+    "raw-loader": "^4.0.0",
     "ts-loader": "^4.3.1",
     "typescript": "^2.4.1"
   },
diff --git a/samples/client/petstore/typescript/tests/jquery/test/api/PetApi.test.ts b/samples/client/petstore/typescript/tests/jquery/test/api/PetApi.test.ts
index 16a3d7c9efa..b01b9500b5d 100644
--- a/samples/client/petstore/typescript/tests/jquery/test/api/PetApi.test.ts
+++ b/samples/client/petstore/typescript/tests/jquery/test/api/PetApi.test.ts
@@ -1,6 +1,9 @@
 declare var QUnit: any;
 
-import * as petstore from 'ts-petstore-client'
+import * as petstore from 'ts-petstore-client';
+
+// @ts-ignore
+import petImage from "./pet.png";
 
 const configuration = new petstore.Configuration()
 const petApi = new petstore.PromisePetApi(configuration)
@@ -38,7 +41,7 @@ QUnit.test("deletePet", (assert: any) => {
         // pet does not exist
         if (err.code && err.code == 404) {
             assert.ok(true, "404'd on getPet after deletion - all good.")
-            return;             
+            return;
         } else {
             throw err;
         }
@@ -108,14 +111,14 @@ QUnit.test("updatePet", (assert: any) => {
     })
 })*/
 
-/** not easily possible?
-QUnit.test("uploadFile", (done) => {
-    const image = fs.readFileSync(__dirname + "/pet.png")
-    petApi.uploadFile(pet.id, "Metadata", Object.assign(image, { name: "pet.png" })).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);
-    })
-})*/
+QUnit.test("uploadFile", (assert: any) => {
+    const petImageFile: File = new File([petImage], "pet.png")
+    return petApi.uploadFile(pet.id, "Metadata", petImageFile)
+    .then(
+        (response: any) => {
+            assert.ok(response.code >= 200);
+            assert.ok(response.code < 300);
+            assert.ok(response.message.includes("pet.png"));
+        }
+    )
+})
diff --git a/samples/client/petstore/typescript/tests/jquery/webpack.config.js b/samples/client/petstore/typescript/tests/jquery/webpack.config.js
index 8a612b675bd..bea87945ed5 100644
--- a/samples/client/petstore/typescript/tests/jquery/webpack.config.js
+++ b/samples/client/petstore/typescript/tests/jquery/webpack.config.js
@@ -5,6 +5,10 @@ module.exports = {
   mode: "development",
   module: {
     rules: [
+      {
+        test: /\.png$/,
+        use: 'raw-loader'
+      },
       {
         test: /\.tsx?$/,
         use: 'ts-loader',
-- 
GitLab


From bfb17e9e6aa59b2db7b0b71008274282298879b1 Mon Sep 17 00:00:00 2001
From: Bodo Graumann <mail@bodograumann.de>
Date: Mon, 27 Apr 2020 13:40:27 +0200
Subject: [PATCH 3/4] Use HttpFile object for node platform

---
 .../src/main/resources/typescript/api/api.mustache     |  9 ++++++++-
 .../src/main/resources/typescript/http/http.mustache   | 10 ++++++++++
 .../typescript/tests/default/test/api/PetApi.test.ts   |  2 +-
 3 files changed, 19 insertions(+), 2 deletions(-)

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 a37bd64c2fb..2b934d8fd44 100644
--- a/modules/openapi-generator/src/main/resources/typescript/api/api.mustache
+++ b/modules/openapi-generator/src/main/resources/typescript/api/api.mustache
@@ -92,8 +92,15 @@ export class {{classname}}RequestFactory extends BaseAPIRequestFactory {
              localVarFormParams.append('{{baseName}}', {{paramName}} as any);
              {{/isFile}}
              {{#isFile}}
+             {{#platforms}}
+             {{#node}}
+             localVarFormParams.append('{{baseName}}', {{paramName}}.data, {{paramName}}.name);
+             {{/node}}
+             {{^node}}
              localVarFormParams.append('{{baseName}}', {{paramName}}, {{paramName}}.name);
-             {{/isFile}}  
+             {{/node}}
+             {{/platforms}}
+             {{/isFile}}
         }
         {{/isListContainer}}
 		{{/formParams}}		
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 c232df40b08..42084d9235d 100644
--- a/modules/openapi-generator/src/main/resources/typescript/http/http.mustache
+++ b/modules/openapi-generator/src/main/resources/typescript/http/http.mustache
@@ -36,7 +36,17 @@ export enum HttpMethod {
 /**
  * Represents a http file which will be uploaded to a server.
  */
+{{#platforms}}
+{{#node}}
+export type HttpFile = {
+    data: {{{fileContentDataType}}},
+    name: string
+};
+{{/node}}
+{{^node}}
 export type HttpFile = {{{fileContentDataType}}} & { readonly name: string };
+{{/node}}
+{{/platforms}}
 
 
 export class HttpException extends Error {
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 61b4f4330ca..fe9df6c6770 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
@@ -120,7 +120,7 @@ describe("PetApi", () =>{
 
     it("uploadFile", (done) => {
         const image = fs.readFileSync(__dirname + "/pet.png")
-        petApi.uploadFile(pet.id, "Metadata", Object.assign(image, { name: "pet.png" })).then((response: any) => {
+        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();
-- 
GitLab


From 3a6c31c8002bf020b634702b8c2e716ee1bedd4f Mon Sep 17 00:00:00 2001
From: Bodo Graumann <mail@bodograumann.de>
Date: Tue, 28 Apr 2020 13:05:36 +0200
Subject: [PATCH 4/4] Regenerate samples

---
 .../client/petstore/typescript/builds/default/apis/PetApi.ts | 2 +-
 .../client/petstore/typescript/builds/default/http/http.ts   | 5 ++++-
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/samples/client/petstore/typescript/builds/default/apis/PetApi.ts b/samples/client/petstore/typescript/builds/default/apis/PetApi.ts
index b8f628075ab..7f9e16f207a 100644
--- a/samples/client/petstore/typescript/builds/default/apis/PetApi.ts
+++ b/samples/client/petstore/typescript/builds/default/apis/PetApi.ts
@@ -365,7 +365,7 @@ export class PetApiRequestFactory extends BaseAPIRequestFactory {
         }
         if (file !== undefined) {
         // TODO: replace .append with .set
-             localVarFormParams.append('file', file, file.name);
+             localVarFormParams.append('file', file.data, file.name);
         }
 		requestContext.setBody(localVarFormParams);
 
diff --git a/samples/client/petstore/typescript/builds/default/http/http.ts b/samples/client/petstore/typescript/builds/default/http/http.ts
index fe0ff1a1c10..78b3667e747 100644
--- a/samples/client/petstore/typescript/builds/default/http/http.ts
+++ b/samples/client/petstore/typescript/builds/default/http/http.ts
@@ -25,7 +25,10 @@ export enum HttpMethod {
 /**
  * Represents a http file which will be uploaded to a server.
  */
-export type HttpFile = Buffer & { readonly name: string };
+export type HttpFile = {
+    data: Buffer,
+    name: string
+};
 
 
 export class HttpException extends Error {
-- 
GitLab