Skip to content

Commit 208d03a

Browse files
authored
Merge pull request #1 from tomohisa/fix-form-data
FormData as [FromForm] RequestBody
2 parents 224e8b0 + 1575e8f commit 208d03a

File tree

12 files changed

+26931
-5029
lines changed

12 files changed

+26931
-5029
lines changed

package-lock.json

Lines changed: 21787 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/client/interfaces/Model.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@ export interface Model extends Schema {
1414
enum: Enum[];
1515
enums: Model[];
1616
properties: Model[];
17+
content?: string;
1718
}

src/client/interfaces/OperationParameters.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ export interface OperationParameters {
99
parametersCookie: OperationParameter[];
1010
parametersHeader: OperationParameter[];
1111
parametersBody: OperationParameter | null;
12+
parametersFormData?: OperationParameter | null;
1213
}

src/openApi/v3/interfaces/OpenApiSchema.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,5 @@ export interface OpenApiSchema extends OpenApiReference, WithEnumExtension {
4444
externalDocs?: OpenApiExternalDocs;
4545
example?: any;
4646
deprecated?: boolean;
47+
content?: string;
4748
}

src/openApi/v3/parser/getContent.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,30 @@ import type { OpenApiSchema } from '../interfaces/OpenApiSchema';
55

66
export function getContent(openApi: OpenApi, content: Dictionary<OpenApiMediaType>): OpenApiSchema | null {
77
/* prettier-ignore */
8+
let contentToReturn
89
return (
910
content['application/json-patch+json'] &&
10-
content['application/json-patch+json'].schema
11+
{ ...content['application/json-patch+json'].schema, content: 'application/json-patch+json' }
1112
) || (
1213
content['application/json'] &&
13-
content['application/json'].schema
14+
{ ...content['application/json'].schema, content: 'application/json' }
1415
) || (
1516
content['text/json'] &&
16-
content['text/json'].schema
17+
{ ...content['text/json'].schema, content: 'text/json' }
1718
) || (
1819
content['text/plain'] &&
19-
content['text/plain'].schema
20+
{ ...content['text/plain'].schema, content: 'text/plain' }
2021
) || (
2122
content['multipart/mixed'] &&
22-
content['multipart/mixed'].schema
23+
{ ...content['multipart/mixed'].schema, content: 'multipart/mixed' }
2324
) || (
2425
content['multipart/related'] &&
25-
content['multipart/related'].schema
26+
{ ...content['multipart/related'].schema, content: 'multipart/related' }
2627
) || (
2728
content['multipart/batch'] &&
28-
content['multipart/batch'].schema
29+
{ ...content['multipart/batch'].schema, content: 'multipart/batch' }
30+
) || (
31+
content['multipart/form-data'] &&
32+
{ ...content['multipart/form-data'].schema, content: 'multipart/form-data' }
2933
) || null;
3034
}

src/openApi/v3/parser/getModel.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export function getModel(openApi: OpenApi, definition: OpenApiSchema, isDefiniti
4242
enum: [],
4343
enums: [],
4444
properties: [],
45+
content: definition.content
4546
};
4647

4748
if (definition.$ref) {

src/openApi/v3/parser/getOperation.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,17 @@ export function getOperation(openApi: OpenApi, url: string, method: string, op:
6262
if (op.requestBody) {
6363
const requestBodyDef = getRef<OpenApiRequestBody>(openApi, op.requestBody);
6464
const requestBody = getOperationRequestBody(openApi, requestBodyDef);
65-
operation.imports.push(...requestBody.imports);
66-
operation.parameters.push(requestBody);
67-
operation.parameters = operation.parameters.sort(sortByRequired);
68-
operation.parametersBody = requestBody;
65+
if (requestBody.name == "formData") {
66+
operation.imports.push(...requestBody.imports);
67+
operation.parameters.push(requestBody);
68+
operation.parameters = operation.parameters.sort(sortByRequired);
69+
operation.parametersFormData = requestBody;
70+
} else {
71+
operation.imports.push(...requestBody.imports);
72+
operation.parameters.push(requestBody);
73+
operation.parameters = operation.parameters.sort(sortByRequired);
74+
operation.parametersBody = requestBody;
75+
}
6976
}
7077

7178
// Parse the operation responses.

src/openApi/v3/parser/getOperationRequestBody.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export function getOperationRequestBody(openApi: OpenApi, parameter: OpenApiRequ
3030
};
3131

3232
if (parameter.content) {
33-
const schema = getContent(openApi, parameter.content);
33+
var schema = getContent(openApi, parameter.content);
3434
if (schema) {
3535
if (schema?.$ref) {
3636
const model = getType(schema.$ref);
@@ -42,6 +42,9 @@ export function getOperationRequestBody(openApi: OpenApi, parameter: OpenApiRequ
4242
return requestBody;
4343
} else {
4444
const model = getModel(openApi, schema);
45+
if (model.content == "multipart/form-data") {
46+
requestBody.name = 'formData'
47+
}
4548
requestBody.export = model.export;
4649
requestBody.type = model.type;
4750
requestBody.base = model.base;

src/templates/exportService.hbs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ export class {{{name}}} {
7070
{{#if parametersBody}}
7171
body: {{{parametersBody.name}}},
7272
{{/if}}
73+
{{#if parametersFormData}}
74+
formData: {{{parametersFormData.name}}},
75+
{{/if}}
7376
{{#if responseHeader}}
7477
responseHeader: '{{{responseHeader}}}',
7578
{{/if}}

test/index.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,19 @@ async function generateV3() {
3131
request: './test/custom/request.ts',
3232
});
3333
}
34+
async function generateForm() {
35+
/* eslint-disable @typescript-eslint/no-var-requires */
36+
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;
37+
await OpenAPI.generate({
38+
input: "https://localhost:44350/swagger/v1/swagger.json",
39+
output: './test/generated/form/',
40+
useOptions: true
41+
});
42+
}
43+
3444

3545
async function generate() {
36-
await generateV2();
37-
await generateV3();
46+
await generateForm();
3847
}
3948

4049
generate();

0 commit comments

Comments
 (0)