diff --git a/src/client/interfaces/OperationParameter.d.ts b/src/client/interfaces/OperationParameter.d.ts index 77c0da771..55ae9be97 100644 --- a/src/client/interfaces/OperationParameter.d.ts +++ b/src/client/interfaces/OperationParameter.d.ts @@ -4,4 +4,5 @@ export interface OperationParameter extends Model { in: 'path' | 'query' | 'header' | 'formData' | 'body' | 'cookie'; prop: string; mediaType: string | null; + resolvedName?: string; } diff --git a/src/templates/client.hbs b/src/templates/client.hbs index 601f27d8f..ae6d8f6f0 100644 --- a/src/templates/client.hbs +++ b/src/templates/client.hbs @@ -22,30 +22,30 @@ import { {{{name}}}{{{@root.postfix}}} } from './services/{{{name}}}{{{@root.pos {{#equals @root.httpClient 'angular'}} @NgModule({ - imports: [HttpClientModule], - providers: [ - { - provide: OpenAPI, - useValue: { - BASE: OpenAPI?.BASE ?? '{{{server}}}', - VERSION: OpenAPI?.VERSION ?? '{{{version}}}', - WITH_CREDENTIALS: OpenAPI?.WITH_CREDENTIALS ?? false, - CREDENTIALS: OpenAPI?.CREDENTIALS ?? 'include', - TOKEN: OpenAPI?.TOKEN, - USERNAME: OpenAPI?.USERNAME, - PASSWORD: OpenAPI?.PASSWORD, - HEADERS: OpenAPI?.HEADERS, - ENCODE_PATH: OpenAPI?.ENCODE_PATH, - } as OpenAPIConfig, - }, - { - provide: BaseHttpRequest, - useClass: AngularHttpRequest, - }, - {{#each services}} - {{{name}}}{{{@root.postfix}}}, - {{/each}} - ] +imports: [HttpClientModule], +providers: [ +{ +provide: OpenAPI, +useValue: { +BASE: OpenAPI?.BASE ?? '{{{server}}}', +VERSION: OpenAPI?.VERSION ?? '{{{version}}}', +WITH_CREDENTIALS: OpenAPI?.WITH_CREDENTIALS ?? false, +CREDENTIALS: OpenAPI?.CREDENTIALS ?? 'include', +TOKEN: OpenAPI?.TOKEN, +USERNAME: OpenAPI?.USERNAME, +PASSWORD: OpenAPI?.PASSWORD, +HEADERS: OpenAPI?.HEADERS, +ENCODE_PATH: OpenAPI?.ENCODE_PATH, +} as OpenAPIConfig, +}, +{ +provide: BaseHttpRequest, +useClass: AngularHttpRequest, +}, +{{#each services}} +{{{name}}}{{{@root.postfix}}}, +{{/each}} +] }) export class {{{clientName}}} {} {{else}} @@ -53,28 +53,28 @@ type HttpRequestConstructor = new (config: OpenAPIConfig) => BaseHttpRequest; export class {{{clientName}}} { - {{#each services}} - public readonly {{{camelCase name}}}: {{{name}}}{{{@root.postfix}}}; - {{/each}} +{{#each services}} +public readonly {{{camelCase name}}}: {{{name}}}{{{@root.postfix}}}; +{{/each}} - public readonly request: BaseHttpRequest; +public readonly request: BaseHttpRequest; - constructor(config?: Partial, HttpRequest: HttpRequestConstructor = {{{httpRequest}}}) { - this.request = new HttpRequest({ - BASE: config?.BASE ?? '{{{server}}}', - VERSION: config?.VERSION ?? '{{{version}}}', - WITH_CREDENTIALS: config?.WITH_CREDENTIALS ?? false, - CREDENTIALS: config?.CREDENTIALS ?? 'include', - TOKEN: config?.TOKEN, - USERNAME: config?.USERNAME, - PASSWORD: config?.PASSWORD, - HEADERS: config?.HEADERS, - ENCODE_PATH: config?.ENCODE_PATH, - }); +constructor(public config?: Partial, HttpRequest: HttpRequestConstructor = {{{httpRequest}}}) { + this.request = new HttpRequest({ + BASE: config?.BASE ?? '{{{server}}}', + VERSION: config?.VERSION ?? '{{{version}}}', + WITH_CREDENTIALS: config?.WITH_CREDENTIALS ?? false, + CREDENTIALS: config?.CREDENTIALS ?? 'include', + TOKEN: config?.TOKEN, + USERNAME: config?.USERNAME, + PASSWORD: config?.PASSWORD, + HEADERS: config?.HEADERS, + ENCODE_PATH: config?.ENCODE_PATH, + }); - {{#each services}} - this.{{{camelCase name}}} = new {{{name}}}{{{@root.postfix}}}(this.request); - {{/each}} + {{#each services}} + this.{{{camelCase name}}} = new {{{name}}}{{{@root.postfix}}}(this.request, this.config); + {{/each}} } -} -{{/equals}} + } + {{/equals}} \ No newline at end of file diff --git a/src/templates/core/OpenAPI.hbs b/src/templates/core/OpenAPI.hbs index 19e66fbf1..ac1ab158d 100644 --- a/src/templates/core/OpenAPI.hbs +++ b/src/templates/core/OpenAPI.hbs @@ -15,6 +15,8 @@ export type OpenAPIConfig = { PASSWORD?: string | Resolver; HEADERS?: Headers | Resolver; ENCODE_PATH?: (path: string) => string; + FETCH_IMPL?: any; + TENANT?: string; }; export const OpenAPI: OpenAPIConfig = { @@ -27,4 +29,6 @@ export const OpenAPI: OpenAPIConfig = { PASSWORD: undefined, HEADERS: undefined, ENCODE_PATH: undefined, + FETCH_IMPL: undefined, + TENANT: undefined, }; diff --git a/src/templates/core/fetch/sendRequest.hbs b/src/templates/core/fetch/sendRequest.hbs index 73f71f428..6111c5fda 100644 --- a/src/templates/core/fetch/sendRequest.hbs +++ b/src/templates/core/fetch/sendRequest.hbs @@ -1,26 +1,26 @@ export const sendRequest = async ( - config: OpenAPIConfig, - options: ApiRequestOptions, - url: string, - body: any, - formData: FormData | undefined, - headers: Headers, - onCancel: OnCancel +config: OpenAPIConfig, +options: ApiRequestOptions, +url: string, +body: any, +formData: FormData | undefined, +headers: Headers, +onCancel: OnCancel ): Promise => { const controller = new AbortController(); const request: RequestInit = { - headers, - body: body ?? formData, - method: options.method, - signal: controller.signal, + headers, + body: body ?? formData, + method: options.method, + signal: controller.signal, }; if (config.WITH_CREDENTIALS) { - request.credentials = config.CREDENTIALS; + request.credentials = config.CREDENTIALS; } onCancel(() => controller.abort()); - return await fetch(url, request); -}; + return await (config.FETCH_IMPL ?? fetch)(url, request); + }; \ No newline at end of file diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index d6bccbbeb..8113f0305 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -25,6 +25,7 @@ import type { CancelablePromise } from '../core/CancelablePromise'; import { BaseHttpRequest } from '../core/BaseHttpRequest'; {{else}} import type { BaseHttpRequest } from '../core/BaseHttpRequest'; +import type { OpenAPIConfig } from '../core/OpenAPI'; {{/equals}} {{else}} import { OpenAPI } from '../core/OpenAPI'; @@ -33,13 +34,13 @@ import { request as __request } from '../core/request'; {{#equals @root.httpClient 'angular'}} @Injectable({ - providedIn: 'root', +providedIn: 'root', }) {{/equals}} export class {{{name}}}{{{@root.postfix}}} { - {{#if @root.exportClient}} +{{#if @root.exportClient}} - constructor(public readonly httpRequest: BaseHttpRequest) {} +constructor(public readonly httpRequest: BaseHttpRequest, public config?: Partial) {} {{else}} {{#equals @root.httpClient 'angular'}} @@ -50,103 +51,103 @@ export class {{{name}}}{{{@root.postfix}}} { {{#each operations}} /** {{#if deprecated}} - * @deprecated + * @deprecated {{/if}} {{#if summary}} - * {{{escapeComment summary}}} + * {{{escapeComment summary}}} {{/if}} {{#if description}} - * {{{escapeComment description}}} + * {{{escapeComment description}}} {{/if}} {{#unless @root.useOptions}} {{#if parameters}} {{#each parameters}} - * @param {{{name}}} {{#if description}}{{{escapeComment description}}}{{/if}} + * @param {{{name}}} {{#if description}}{{{escapeComment description}}}{{/if}} {{/each}} {{/if}} {{/unless}} {{#each results}} - * @returns {{{type}}} {{#if description}}{{{escapeComment description}}}{{/if}} + * @returns {{{type}}} {{#if description}}{{{escapeComment description}}}{{/if}} {{/each}} - * @throws ApiError - */ + * @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}}}, + {{else}} + public {{{name}}}({{>parameters}}): CancelablePromise<{{>result}}> { + return this.httpRequest.request({ {{/equals}} - {{#if parametersBody.mediaType}} - mediaType: '{{{parametersBody.mediaType}}}', - {{/if}} - {{/if}} - {{#if responseHeader}} - responseHeader: '{{{responseHeader}}}', - {{/if}} - {{#if errors}} - errors: { - {{#each errors}} - {{{code}}}: `{{{escapeDescription description}}}`, - {{/each}} - }, - {{/if}} - }); - } + {{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}}}': {{{resolvedName}}}, + {{/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}} + }); + } - {{/each}} -} + {{/each}} + } \ No newline at end of file diff --git a/src/utils/writeClientServices.ts b/src/utils/writeClientServices.ts index 2f95341d2..f96eadfd9 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) { + for (const op of service.operations) { + for (const p of op.parametersPath) { + p.resolvedName = p.name; + if (p.name == 'tenant') { + p.resolvedName = p.name + ' ?? this.config?.TENANT' + p.isRequired = false + } + } + op.name = op.name.replace(service.name, ''); + } + const file = resolve(outputPath, `${service.name}${postfix}.ts`); const templateResult = templates.exports.service({ ...service,