diff --git a/.gitignore b/.gitignore index 2b7422568..33028cc75 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ test/e2e/generated samples/generated samples/swagger-codegen-cli-v2.jar samples/swagger-codegen-cli-v3.jar +temp \ No newline at end of file diff --git a/src/client/interfaces/Model.d.ts b/src/client/interfaces/Model.d.ts index 5f0318942..7eb96b7e1 100644 --- a/src/client/interfaces/Model.d.ts +++ b/src/client/interfaces/Model.d.ts @@ -8,6 +8,7 @@ export interface Model extends Schema { base: string; template: string | null; link: Model | null; + title: string | null; description: string | null; deprecated?: boolean; default?: string; diff --git a/src/openApi/v3/parser/getModel.ts b/src/openApi/v3/parser/getModel.ts index 9e9c60a98..2e361f635 100644 --- a/src/openApi/v3/parser/getModel.ts +++ b/src/openApi/v3/parser/getModel.ts @@ -22,6 +22,7 @@ export const getModel = ( base: 'any', template: null, link: null, + title: definition.title || null, description: definition.description || null, deprecated: definition.deprecated === true, isDefinition, @@ -62,12 +63,14 @@ export const getModel = ( if (definition.enum && definition.type !== 'boolean') { const enumerators = getEnum(definition.enum); const extendedEnumerators = extendEnum(enumerators, definition); + if (extendedEnumerators.length) { model.export = 'enum'; model.type = 'string'; model.base = 'string'; model.enum.push(...extendedEnumerators); model.default = getModelDefault(definition, model); + return model; } } diff --git a/src/openApi/v3/parser/getModelProperties.ts b/src/openApi/v3/parser/getModelProperties.ts index 6e25ca833..c27b9c36e 100644 --- a/src/openApi/v3/parser/getModelProperties.ts +++ b/src/openApi/v3/parser/getModelProperties.ts @@ -36,6 +36,7 @@ export const getModelProperties = ( | 'properties' > = { name: escapeName(propertyName), + title: property.title || null, description: property.description || null, deprecated: property.deprecated === true, isDefinition: false, diff --git a/src/templates/core/ApiQuery.hbs b/src/templates/core/ApiQuery.hbs new file mode 100644 index 000000000..5ddddc163 --- /dev/null +++ b/src/templates/core/ApiQuery.hbs @@ -0,0 +1,13 @@ +{{>header}} + +export type ApiQuery = { + readonly url: string; + readonly method: string; + readonly name: string; + readonly inputs: string[]; + readonly query?: { [key: string]: string } + readonly path?: { [key: string]: string } + params?: R; + readonly bodyJsonModel?: string; + readonly outputJsonModel?: string; +}; \ No newline at end of file diff --git a/src/templates/core/ApiResult.hbs b/src/templates/core/ApiResult.hbs index a768b8c5a..501c25708 100644 --- a/src/templates/core/ApiResult.hbs +++ b/src/templates/core/ApiResult.hbs @@ -6,4 +6,4 @@ export type ApiResult = { readonly status: number; readonly statusText: string; readonly body: any; -}; +}; \ No newline at end of file diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index d6bccbbeb..ff61fa6d3 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -1,5 +1,6 @@ {{>header}} +import type { ApiQuery } from '../core/ApiQuery' {{#equals @root.httpClient 'angular'}} {{#if @root.exportClient}} import { Injectable } from '@angular/core'; @@ -36,6 +37,29 @@ import { request as __request } from '../core/request'; providedIn: 'root', }) {{/equals}} + +{{#each operations}} +export type {{{name}}}Input = { + {{#if parametersQuery}} + query: { + {{#each parametersQuery}} + {{{name}}}{{>isRequired}}: {{>type}} + {{/each}} + }, + {{/if}} + {{#if parametersPath}} + path: { + {{#each parametersPath}} + {{{name}}}{{>isRequired}}: {{>type}} + {{/each}} + }, + {{/if}} + {{#if parametersBody}} + body: {{>type parametersBody}}, + {{/if}} +} +{{/each}} + export class {{{name}}}{{{@root.postfix}}} { {{#if @root.exportClient}} @@ -48,104 +72,34 @@ export class {{{name}}}{{{@root.postfix}}} { {{/if}} {{#each operations}} - /** - {{#if deprecated}} - * @deprecated - {{/if}} - {{#if summary}} - * {{{escapeComment summary}}} - {{/if}} - {{#if description}} - * {{{escapeComment description}}} - {{/if}} - {{#unless @root.useOptions}} - {{#if parameters}} - {{#each parameters}} - * @param {{{name}}} {{#if description}}{{{escapeComment description}}}{{/if}} - {{/each}} - {{/if}} - {{/unless}} - {{#each results}} - * @returns {{{type}}} {{#if description}}{{{escapeComment description}}}{{/if}} - {{/each}} - * @throws ApiError - */ - {{#if @root.exportClient}} - {{#equals @root.httpClient 'angular'}} - public {{{name}}}({{>parameters}}): Observable<{{>result}}> { - return this.httpRequest.request({ - {{else}} - public {{{name}}}({{>parameters}}): CancelablePromise<{{>result}}> { - return this.httpRequest.request({ - {{/equals}} - {{else}} - {{#equals @root.httpClient 'angular'}} - public {{{name}}}({{>parameters}}): Observable<{{>result}}> { - return __request(OpenAPI, this.http, { - {{else}} - public static {{{name}}}({{>parameters}}): CancelablePromise<{{>result}}> { - return __request(OpenAPI, { - {{/equals}} - {{/if}} - method: '{{{method}}}', - url: '{{{path}}}', - {{#if parametersPath}} - path: { - {{#each parametersPath}} - '{{{prop}}}': {{{name}}}, - {{/each}} - }, - {{/if}} - {{#if parametersCookie}} - cookies: { - {{#each parametersCookie}} - '{{{prop}}}': {{{name}}}, - {{/each}} - }, - {{/if}} - {{#if parametersHeader}} - headers: { - {{#each parametersHeader}} - '{{{prop}}}': {{{name}}}, - {{/each}} - }, - {{/if}} - {{#if parametersQuery}} - query: { - {{#each parametersQuery}} - '{{{prop}}}': {{{name}}}, - {{/each}} - }, - {{/if}} - {{#if parametersForm}} - formData: { - {{#each parametersForm}} - '{{{prop}}}': {{{name}}}, - {{/each}} - }, - {{/if}} - {{#if parametersBody}} - {{#equals parametersBody.in 'formData'}} - formData: {{{parametersBody.name}}}, - {{/equals}} - {{#equals parametersBody.in 'body'}} - body: {{{parametersBody.name}}}, - {{/equals}} - {{#if parametersBody.mediaType}} - mediaType: '{{{parametersBody.mediaType}}}', - {{/if}} - {{/if}} - {{#if responseHeader}} - responseHeader: '{{{responseHeader}}}', - {{/if}} - {{#if errors}} - errors: { - {{#each errors}} - {{{code}}}: `{{{escapeDescription description}}}`, - {{/each}} - }, - {{/if}} - }); + + static {{{name}}}Options: ApiQuery<{{>result}}, {{{name}}}Input> = { + url: '{{path}}', + method: '{{method}}', + name: '{{name}}', + inputs: [ + {{#each parameters}} + '{{{name}}}', + {{/each}} + ], + {{#if parametersQuery}} + query: { + {{#each parametersQuery}} + '{{{prop}}}': '{{{name}}}', + {{/each}} + }, + {{/if}} + {{#if parametersPath}} + path: { + {{#each parametersPath}} + '{{{prop}}}': '{{{name}}}', + {{/each}} + }, + {{/if}} + {{#if parametersBody}} + bodyJsonModel: '${{>type parametersBody}}', + {{/if}} + outputJsonModel: '${{>result}}', } {{/each}} diff --git a/src/templates/partials/exportInterface.hbs b/src/templates/partials/exportInterface.hbs index b61e26441..d0034765d 100644 --- a/src/templates/partials/exportInterface.hbs +++ b/src/templates/partials/exportInterface.hbs @@ -20,7 +20,7 @@ export type {{{name}}} = { {{/if}} */ {{/ifdef}} - {{>isReadOnly}}{{{name}}}{{>isRequired}}: {{>type parent=../name}}; + {{>isReadOnly}}{{{name}}}{{#if isReadOnly}}?{{else}}{{>isRequired}}{{/if}}: {{>type parent=../name}}; {{/each}} }; {{#if enums}} diff --git a/src/templates/partials/schemaArray.hbs b/src/templates/partials/schemaArray.hbs index 44871265b..a3f33d013 100644 --- a/src/templates/partials/schemaArray.hbs +++ b/src/templates/partials/schemaArray.hbs @@ -7,6 +7,9 @@ type: '{{{base}}}', }, {{/if}} +{{#if title}} + title: `{{{escapeDescription title}}}`, +{{/if}} {{#if isReadOnly}} isReadOnly: {{{isReadOnly}}}, {{/if}} diff --git a/src/templates/partials/schemaComposition.hbs b/src/templates/partials/schemaComposition.hbs index 050f6696d..06580cfb9 100644 --- a/src/templates/partials/schemaComposition.hbs +++ b/src/templates/partials/schemaComposition.hbs @@ -1,5 +1,8 @@ { type: '{{export}}', +{{#if title}} + title: `{{{escapeDescription title}}}`, +{{/if}} {{#if description}} description: `{{{escapeDescription description}}}`, {{/if}} diff --git a/src/templates/partials/schemaDictionary.hbs b/src/templates/partials/schemaDictionary.hbs index 1e755f7af..61d7857ca 100644 --- a/src/templates/partials/schemaDictionary.hbs +++ b/src/templates/partials/schemaDictionary.hbs @@ -7,6 +7,9 @@ type: '{{{base}}}', }, {{/if}} +{{#if title}} + title: `{{{escapeDescription title}}}`, +{{/if}} {{#if isReadOnly}} isReadOnly: {{{isReadOnly}}}, {{/if}} diff --git a/src/templates/partials/schemaEnum.hbs b/src/templates/partials/schemaEnum.hbs index eaba3fc5f..21df29b03 100644 --- a/src/templates/partials/schemaEnum.hbs +++ b/src/templates/partials/schemaEnum.hbs @@ -1,5 +1,8 @@ { type: 'Enum', +{{#if title}} + title: `{{{escapeDescription title}}}`, +{{/if}} {{#if isReadOnly}} isReadOnly: {{{isReadOnly}}}, {{/if}} @@ -9,4 +12,15 @@ {{#if isNullable}} isNullable: {{{isNullable}}}, {{/if}} +{{#if enum}} + enums: [ + {{#each enum}} + { + name: "{{{name}}}", + type: '{{{type}}}', + value: {{{value}}}, + }, + {{/each}} + ], +{{/if}} } diff --git a/src/templates/partials/schemaGeneric.hbs b/src/templates/partials/schemaGeneric.hbs index 23580a673..0aa380c1d 100644 --- a/src/templates/partials/schemaGeneric.hbs +++ b/src/templates/partials/schemaGeneric.hbs @@ -2,6 +2,9 @@ {{#if type}} type: '{{{type}}}', {{/if}} +{{#if title}} + title: `{{{escapeDescription title}}}`, +{{/if}} {{#if description}} description: `{{{escapeDescription description}}}`, {{/if}} diff --git a/src/templates/partials/schemaInterface.hbs b/src/templates/partials/schemaInterface.hbs index 3417c5fb9..ef52efe09 100644 --- a/src/templates/partials/schemaInterface.hbs +++ b/src/templates/partials/schemaInterface.hbs @@ -1,4 +1,7 @@ { +{{#if title}} + title: `{{{escapeDescription title}}}`, +{{/if}} {{#if description}} description: `{{{escapeDescription description}}}`, {{/if}} diff --git a/src/utils/registerHandlebarTemplates.ts b/src/utils/registerHandlebarTemplates.ts index bf77cbdc1..ec153735f 100644 --- a/src/utils/registerHandlebarTemplates.ts +++ b/src/utils/registerHandlebarTemplates.ts @@ -2,23 +2,26 @@ import Handlebars from 'handlebars/runtime'; import { HttpClient } from '../HttpClient'; import templateClient from '../templates/client.hbs'; +import templateCoreApiError from '../templates/core/ApiError.hbs'; +import templateCoreApiQuery from '../templates/core/ApiQuery.hbs'; +import templateCoreApiRequestOptions from '../templates/core/ApiRequestOptions.hbs'; +import templateCoreApiResult from '../templates/core/ApiResult.hbs'; +import templateCoreBaseHttpRequest from '../templates/core/BaseHttpRequest.hbs'; +import templateCancelablePromise from '../templates/core/CancelablePromise.hbs'; +import templateCoreHttpRequest from '../templates/core/HttpRequest.hbs'; +import templateCoreSettings from '../templates/core/OpenAPI.hbs'; import angularGetHeaders from '../templates/core/angular/getHeaders.hbs'; import angularGetRequestBody from '../templates/core/angular/getRequestBody.hbs'; import angularGetResponseBody from '../templates/core/angular/getResponseBody.hbs'; import angularGetResponseHeader from '../templates/core/angular/getResponseHeader.hbs'; import angularRequest from '../templates/core/angular/request.hbs'; import angularSendRequest from '../templates/core/angular/sendRequest.hbs'; -import templateCoreApiError from '../templates/core/ApiError.hbs'; -import templateCoreApiRequestOptions from '../templates/core/ApiRequestOptions.hbs'; -import templateCoreApiResult from '../templates/core/ApiResult.hbs'; import axiosGetHeaders from '../templates/core/axios/getHeaders.hbs'; import axiosGetRequestBody from '../templates/core/axios/getRequestBody.hbs'; import axiosGetResponseBody from '../templates/core/axios/getResponseBody.hbs'; import axiosGetResponseHeader from '../templates/core/axios/getResponseHeader.hbs'; import axiosRequest from '../templates/core/axios/request.hbs'; import axiosSendRequest from '../templates/core/axios/sendRequest.hbs'; -import templateCoreBaseHttpRequest from '../templates/core/BaseHttpRequest.hbs'; -import templateCancelablePromise from '../templates/core/CancelablePromise.hbs'; import fetchGetHeaders from '../templates/core/fetch/getHeaders.hbs'; import fetchGetRequestBody from '../templates/core/fetch/getRequestBody.hbs'; import fetchGetResponseBody from '../templates/core/fetch/getResponseBody.hbs'; @@ -37,14 +40,12 @@ import functionIsString from '../templates/core/functions/isString.hbs'; import functionIsStringWithValue from '../templates/core/functions/isStringWithValue.hbs'; import functionIsSuccess from '../templates/core/functions/isSuccess.hbs'; import functionResolve from '../templates/core/functions/resolve.hbs'; -import templateCoreHttpRequest from '../templates/core/HttpRequest.hbs'; import nodeGetHeaders from '../templates/core/node/getHeaders.hbs'; import nodeGetRequestBody from '../templates/core/node/getRequestBody.hbs'; import nodeGetResponseBody from '../templates/core/node/getResponseBody.hbs'; import nodeGetResponseHeader from '../templates/core/node/getResponseHeader.hbs'; import nodeRequest from '../templates/core/node/request.hbs'; import nodeSendRequest from '../templates/core/node/sendRequest.hbs'; -import templateCoreSettings from '../templates/core/OpenAPI.hbs'; import templateCoreRequest from '../templates/core/request.hbs'; import xhrGetHeaders from '../templates/core/xhr/getHeaders.hbs'; import xhrGetRequestBody from '../templates/core/xhr/getRequestBody.hbs'; @@ -98,6 +99,7 @@ export interface Templates { apiError: Handlebars.TemplateDelegate; apiRequestOptions: Handlebars.TemplateDelegate; apiResult: Handlebars.TemplateDelegate; + apiQuery: Handlebars.TemplateDelegate, cancelablePromise: Handlebars.TemplateDelegate; request: Handlebars.TemplateDelegate; baseHttpRequest: Handlebars.TemplateDelegate; @@ -130,6 +132,7 @@ export const registerHandlebarTemplates = (root: { apiError: Handlebars.template(templateCoreApiError), apiRequestOptions: Handlebars.template(templateCoreApiRequestOptions), apiResult: Handlebars.template(templateCoreApiResult), + apiQuery: Handlebars.template(templateCoreApiQuery), cancelablePromise: Handlebars.template(templateCancelablePromise), request: Handlebars.template(templateCoreRequest), baseHttpRequest: Handlebars.template(templateCoreBaseHttpRequest), diff --git a/src/utils/writeClientCore.ts b/src/utils/writeClientCore.ts index 6d35849d2..f3767e393 100644 --- a/src/utils/writeClientCore.ts +++ b/src/utils/writeClientCore.ts @@ -41,6 +41,7 @@ export const writeClientCore = async ( await writeFile(resolve(outputPath, 'ApiError.ts'), i(templates.core.apiError(context), indent)); await writeFile(resolve(outputPath, 'ApiRequestOptions.ts'), i(templates.core.apiRequestOptions(context), indent)); await writeFile(resolve(outputPath, 'ApiResult.ts'), i(templates.core.apiResult(context), indent)); + await writeFile(resolve(outputPath, 'ApiQuery.ts'), i(templates.core.apiQuery(context), indent)); await writeFile(resolve(outputPath, 'CancelablePromise.ts'), i(templates.core.cancelablePromise(context), indent)); await writeFile(resolve(outputPath, 'request.ts'), i(templates.core.request(context), indent)); diff --git a/src/utils/writeClientSchemas.ts b/src/utils/writeClientSchemas.ts index e1c885f64..79c5ea5d1 100644 --- a/src/utils/writeClientSchemas.ts +++ b/src/utils/writeClientSchemas.ts @@ -26,6 +26,11 @@ export const writeClientSchemas = async ( indent: Indent ): Promise => { for (const model of models) { + //console.log(model) + if (model.name === 'JaxMetaType') { + console.log(model) + } + const file = resolve(outputPath, `$${model.name}.ts`); const templateResult = templates.exports.schema({ ...model, diff --git a/src/utils/writeClientServices.ts b/src/utils/writeClientServices.ts index 2f95341d2..2f6afbdcf 100644 --- a/src/utils/writeClientServices.ts +++ b/src/utils/writeClientServices.ts @@ -33,6 +33,17 @@ export const writeClientServices = async ( clientName?: string ): Promise => { for (const service of services) { + if (service.name === 'Meta') { + console.log(service) + /* + service.operations.map(o => { + console.log(o.name) + console.log(o.parametersBody) + }) + */ + } + + const file = resolve(outputPath, `${service.name}${postfix}.ts`); const templateResult = templates.exports.service({ ...service,