From 988d83eeab00d4248dc99bc7677bd46bb9ef19d6 Mon Sep 17 00:00:00 2001 From: Alejandro Rizzo Date: Tue, 25 Mar 2025 11:25:30 +0000 Subject: [PATCH 1/7] adds an importExtension option --- bin/index.js | 2 ++ package.json | 3 ++- src/index.ts | 5 +++++ src/templates/core/ApiError.hbs | 4 ++-- src/templates/core/BaseHttpRequest.hbs | 8 ++++---- src/templates/core/HttpRequest.hbs | 12 ++++++------ src/templates/core/OpenAPI.hbs | 2 +- src/templates/core/angular/request.hbs | 2 +- src/templates/core/axios/request.hbs | 12 ++++++------ src/templates/core/fetch/request.hbs | 12 ++++++------ src/templates/core/node/request.hbs | 12 ++++++------ src/templates/core/xhr/request.hbs | 12 ++++++------ src/templates/exportModel.hbs | 2 +- src/templates/exportService.hbs | 12 ++++++------ src/templates/index.hbs | 24 ++++++++++++------------ src/utils/writeClient.spec.ts | 1 + src/utils/writeClient.ts | 24 ++++++++++++++++++++++-- src/utils/writeClientCore.ts | 4 +++- src/utils/writeClientIndex.spec.ts | 2 +- src/utils/writeClientIndex.ts | 3 +++ src/utils/writeClientModels.spec.ts | 2 +- src/utils/writeClientModels.ts | 3 +++ src/utils/writeClientServices.spec.ts | 1 + src/utils/writeClientServices.ts | 2 ++ test/e2e/scripts/generateClient.ts | 2 ++ test/index.js | 1 + types/index.d.ts | 1 + 27 files changed, 107 insertions(+), 63 deletions(-) diff --git a/bin/index.js b/bin/index.js index f4562e863..c19dc648c 100755 --- a/bin/index.js +++ b/bin/index.js @@ -16,6 +16,7 @@ const params = program .option('--name ', 'Custom client class name') .option('--useOptions', 'Use options instead of arguments') .option('--splitParameters', 'User arguments for path parameters and options for query parameters') + .option('--importExtension', 'Add .js extension to import statements') .option('--useUnionTypes', 'Use union types instead of enums') .option('--exportCore ', 'Write core files to disk', true) .option('--exportServices ', 'Write services to disk', true) @@ -38,6 +39,7 @@ if (OpenAPI) { clientName: params.name, useOptions: params.useOptions, splitParameters: params.splitParameters, + importExtension: params.importExtension, useUnionTypes: params.useUnionTypes, exportCore: JSON.parse(params.exportCore) === true, exportServices: JSON.parse(params.exportServices) === true, diff --git a/package.json b/package.json index ab2a2b68e..af05c8a44 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,8 @@ "eslint:fix": "eslint . --fix", "prepare": "npm run clean && npm run release", "generate-spa-codacy": "npm run build && rimraf ./generated && node ./bin/index.js --input ./samples/spec/codacy-api.yaml --output ./generated --useUnionTypes --indent 2 --client fetch --splitParameters", - "generate-ide-codacy": "npm run build && rimraf ./generated && node ./bin/index.js --input ./samples/spec/codacy-api.yaml --output ./generated --useUnionTypes --indent 2 --client axios" + "generate-ide-codacy": "npm run build && rimraf ./generated && node ./bin/index.js --input ./samples/spec/codacy-api.yaml --output ./generated --useUnionTypes --indent 2 --client axios", + "generate-mcp-codacy": "npm run build && rimraf ./generated && node ./bin/index.js --input ./samples/spec/codacy-api.yaml --output ./generated --useUnionTypes --indent 2 --client fetch --importExtension" }, "dependencies": { "@apidevtools/json-schema-ref-parser": "^10.1.0", diff --git a/src/index.ts b/src/index.ts index 5fce9edc4..c34c4a982 100644 --- a/src/index.ts +++ b/src/index.ts @@ -19,6 +19,7 @@ export type Options = { clientName?: string; useOptions?: boolean; splitParameters?: boolean; + importExtension?: boolean; useUnionTypes?: boolean; exportCore?: boolean; exportServices?: boolean; @@ -41,6 +42,7 @@ export type Options = { * @param clientName Custom client class name * @param useOptions Use options or arguments functions * @param splitParameters User arguments for path parameters and options for query parameters + * @param importExtension Add .js extension to import statements * @param useUnionTypes Use union types instead of enums * @param exportCore Generate core client classes * @param exportServices Generate services @@ -59,6 +61,7 @@ export const generate = async ({ clientName, useOptions = false, splitParameters = false, + importExtension = false, useUnionTypes = false, exportCore = true, exportServices = true, @@ -90,6 +93,7 @@ export const generate = async ({ httpClient, useOptions, splitParameters, + importExtension, useUnionTypes, exportCore, exportServices, @@ -115,6 +119,7 @@ export const generate = async ({ httpClient, useOptions, splitParameters, + importExtension, useUnionTypes, exportCore, exportServices, diff --git a/src/templates/core/ApiError.hbs b/src/templates/core/ApiError.hbs index ab6849d18..9c773d77e 100644 --- a/src/templates/core/ApiError.hbs +++ b/src/templates/core/ApiError.hbs @@ -1,7 +1,7 @@ {{>header}} -import type { ApiRequestOptions } from './ApiRequestOptions'; -import type { ApiResult } from './ApiResult'; +import type { ApiRequestOptions } from './ApiRequestOptions{{#if @root.importExtension}}.js{{/if}}'; +import type { ApiResult } from './ApiResult{{#if @root.importExtension}}.js{{/if}}'; export class ApiError extends Error { public readonly url: string; diff --git a/src/templates/core/BaseHttpRequest.hbs b/src/templates/core/BaseHttpRequest.hbs index 43ff79cbb..ac2a6e79a 100644 --- a/src/templates/core/BaseHttpRequest.hbs +++ b/src/templates/core/BaseHttpRequest.hbs @@ -4,12 +4,12 @@ import type { HttpClient } from '@angular/common/http'; import type { Observable } from 'rxjs'; -import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiRequestOptions } from './ApiRequestOptions{{#if @root.importExtension}}.js{{/if}}'; import type { OpenAPIConfig } from './OpenAPI'; {{else}} -import type { ApiRequestOptions } from './ApiRequestOptions'; -import type { CancelablePromise } from './CancelablePromise'; -import type { OpenAPIConfig } from './OpenAPI'; +import type { ApiRequestOptions } from './ApiRequestOptions{{#if @root.importExtension}}.js{{/if}}'; +import type { CancelablePromise } from './CancelablePromise{{#if @root.importExtension}}.js{{/if}}'; +import type { OpenAPIConfig } from './OpenAPI{{#if @root.importExtension}}.js{{/if}}'; {{/equals}} export abstract class BaseHttpRequest { diff --git a/src/templates/core/HttpRequest.hbs b/src/templates/core/HttpRequest.hbs index e1620a3c0..f17008029 100644 --- a/src/templates/core/HttpRequest.hbs +++ b/src/templates/core/HttpRequest.hbs @@ -5,17 +5,17 @@ import { Inject, Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import type { Observable } from 'rxjs'; -import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiRequestOptions } from './ApiRequestOptions{{#if @root.importExtension}}.js{{/if}}'; import { BaseHttpRequest } from './BaseHttpRequest'; import type { OpenAPIConfig } from './OpenAPI'; import { OpenAPI } from './OpenAPI'; import { request as __request } from './request'; {{else}} -import type { ApiRequestOptions } from './ApiRequestOptions'; -import { BaseHttpRequest } from './BaseHttpRequest'; -import type { CancelablePromise } from './CancelablePromise'; -import type { OpenAPIConfig } from './OpenAPI'; -import { request as __request } from './request'; +import type { ApiRequestOptions } from './ApiRequestOptions{{#if @root.importExtension}}.js{{/if}}'; +import { BaseHttpRequest } from './BaseHttpRequest{{#if @root.importExtension}}.js{{/if}}'; +import type { CancelablePromise } from './CancelablePromise{{#if @root.importExtension}}.js{{/if}}'; +import type { OpenAPIConfig } from './OpenAPI{{#if @root.importExtension}}.js{{/if}}'; +import { request as __request } from './request{{#if @root.importExtension}}.js{{/if}}'; {{/equals}} {{#equals @root.httpClient 'angular'}} diff --git a/src/templates/core/OpenAPI.hbs b/src/templates/core/OpenAPI.hbs index 9078d2dd5..f44e807e9 100644 --- a/src/templates/core/OpenAPI.hbs +++ b/src/templates/core/OpenAPI.hbs @@ -1,6 +1,6 @@ {{>header}} -import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiRequestOptions } from './ApiRequestOptions{{#if @root.importExtension}}.js{{/if}}'; type Resolver = (options: ApiRequestOptions) => Promise; type Headers = Record; diff --git a/src/templates/core/angular/request.hbs b/src/templates/core/angular/request.hbs index 57c98516e..6b4bae688 100644 --- a/src/templates/core/angular/request.hbs +++ b/src/templates/core/angular/request.hbs @@ -7,7 +7,7 @@ import { catchError, map, switchMap } from 'rxjs/operators'; import type { Observable } from 'rxjs'; import { ApiError } from './ApiError'; -import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiRequestOptions } from './ApiRequestOptions{{#if @root.importExtension}}.js{{/if}}'; import type { ApiResult } from './ApiResult'; import type { OpenAPIConfig } from './OpenAPI'; diff --git a/src/templates/core/axios/request.hbs b/src/templates/core/axios/request.hbs index 6612f1614..6e6a0d382 100644 --- a/src/templates/core/axios/request.hbs +++ b/src/templates/core/axios/request.hbs @@ -4,12 +4,12 @@ import axios from 'axios'; import type { AxiosError, AxiosRequestConfig, AxiosResponse, AxiosInstance } from 'axios'; import FormData from 'form-data'; -import { ApiError } from './ApiError'; -import type { ApiRequestOptions } from './ApiRequestOptions'; -import type { ApiResult } from './ApiResult'; -import { CancelablePromise } from './CancelablePromise'; -import type { OnCancel } from './CancelablePromise'; -import type { OpenAPIConfig } from './OpenAPI'; +import { ApiError } from './ApiError{{#if @root.importExtension}}.js{{/if}}'; +import type { ApiRequestOptions } from './ApiRequestOptions{{#if @root.importExtension}}.js{{/if}}'; +import type { ApiResult } from './ApiResult{{#if @root.importExtension}}.js{{/if}}'; +import { CancelablePromise } from './CancelablePromise{{#if @root.importExtension}}.js{{/if}}'; +import type { OnCancel } from './CancelablePromise{{#if @root.importExtension}}.js{{/if}}'; +import type { OpenAPIConfig } from './OpenAPI{{#if @root.importExtension}}.js{{/if}}'; {{>functions/isDefined}} diff --git a/src/templates/core/fetch/request.hbs b/src/templates/core/fetch/request.hbs index b45780035..a11290336 100644 --- a/src/templates/core/fetch/request.hbs +++ b/src/templates/core/fetch/request.hbs @@ -1,11 +1,11 @@ {{>header}} -import { ApiError } from './ApiError'; -import type { ApiRequestOptions } from './ApiRequestOptions'; -import type { ApiResult } from './ApiResult'; -import { CancelablePromise } from './CancelablePromise'; -import type { OnCancel } from './CancelablePromise'; -import type { OpenAPIConfig } from './OpenAPI'; +import { ApiError } from './ApiError{{#if @root.importExtension}}.js{{/if}}'; +import type { ApiRequestOptions } from './ApiRequestOptions{{#if @root.importExtension}}.js{{/if}}'; +import type { ApiResult } from './ApiResult{{#if @root.importExtension}}.js{{/if}}'; +import { CancelablePromise } from './CancelablePromise{{#if @root.importExtension}}.js{{/if}}'; +import type { OnCancel } from './CancelablePromise{{#if @root.importExtension}}.js{{/if}}'; +import type { OpenAPIConfig } from './OpenAPI{{#if @root.importExtension}}.js{{/if}}'; {{>functions/isDefined}} diff --git a/src/templates/core/node/request.hbs b/src/templates/core/node/request.hbs index 8e6f6110e..67830946a 100644 --- a/src/templates/core/node/request.hbs +++ b/src/templates/core/node/request.hbs @@ -5,12 +5,12 @@ import fetch, { Headers } from 'node-fetch'; import type { RequestInit, Response } from 'node-fetch'; import type { AbortSignal } from 'node-fetch/externals'; -import { ApiError } from './ApiError'; -import type { ApiRequestOptions } from './ApiRequestOptions'; -import type { ApiResult } from './ApiResult'; -import { CancelablePromise } from './CancelablePromise'; -import type { OnCancel } from './CancelablePromise'; -import type { OpenAPIConfig } from './OpenAPI'; +import { ApiError } from './ApiError{{#if @root.importExtension}}.js{{/if}}'; +import type { ApiRequestOptions } from './ApiRequestOptions{{#if @root.importExtension}}.js{{/if}}'; +import type { ApiResult } from './ApiResult{{#if @root.importExtension}}.js{{/if}}'; +import { CancelablePromise } from './CancelablePromise{{#if @root.importExtension}}.js{{/if}}'; +import type { OnCancel } from './CancelablePromise{{#if @root.importExtension}}.js{{/if}}'; +import type { OpenAPIConfig } from './OpenAPI{{#if @root.importExtension}}.js{{/if}}'; {{>functions/isDefined}} diff --git a/src/templates/core/xhr/request.hbs b/src/templates/core/xhr/request.hbs index 47f92870b..47c9f0927 100644 --- a/src/templates/core/xhr/request.hbs +++ b/src/templates/core/xhr/request.hbs @@ -1,11 +1,11 @@ {{>header}} -import { ApiError } from './ApiError'; -import type { ApiRequestOptions } from './ApiRequestOptions'; -import type { ApiResult } from './ApiResult'; -import { CancelablePromise } from './CancelablePromise'; -import type { OnCancel } from './CancelablePromise'; -import type { OpenAPIConfig } from './OpenAPI'; +import { ApiError } from './ApiError{{#if @root.importExtension}}.js{{/if}}'; +import type { ApiRequestOptions } from './ApiRequestOptions{{#if @root.importExtension}}.js{{/if}}'; +import type { ApiResult } from './ApiResult{{#if @root.importExtension}}.js{{/if}}'; +import { CancelablePromise } from './CancelablePromise{{#if @root.importExtension}}.js{{/if}}'; +import type { OnCancel } from './CancelablePromise{{#if @root.importExtension}}.js{{/if}}'; +import type { OpenAPIConfig } from './OpenAPI{{#if @root.importExtension}}.js{{/if}}'; {{>functions/isDefined}} diff --git a/src/templates/exportModel.hbs b/src/templates/exportModel.hbs index 7ddb2c3e8..18108fdda 100644 --- a/src/templates/exportModel.hbs +++ b/src/templates/exportModel.hbs @@ -3,7 +3,7 @@ {{#if imports}} {{#each imports}} -import type { {{{this}}} } from './{{{this}}}'; +import type { {{{this}}} } from './{{{this}}}{{#if @root.importExtension}}.js{{/if}}'; {{/each}} {{/if}} diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index 0b8513d28..19797b92b 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -13,22 +13,22 @@ import type { Observable } from 'rxjs'; {{/equals}} {{#if imports}} {{#each imports}} -import type { {{{this}}} } from '../models/{{{this}}}'; +import type { {{{this}}} } from '../models/{{{this}}}{{#if @root.importExtension}}.js{{/if}}'; {{/each}} {{/if}} {{#notEquals @root.httpClient 'angular'}} -import type { CancelablePromise } from '../core/CancelablePromise'; +import type { CancelablePromise } from '../core/CancelablePromise{{#if @root.importExtension}}.js{{/if}}'; {{/notEquals}} {{#if @root.exportClient}} {{#equals @root.httpClient 'angular'}} -import { BaseHttpRequest } from '../core/BaseHttpRequest'; +import { BaseHttpRequest } from '../core/BaseHttpRequest{{#if @root.importExtension}}.js{{/if}}'; {{else}} -import type { BaseHttpRequest } from '../core/BaseHttpRequest'; +import type { BaseHttpRequest } from '../core/BaseHttpRequest{{#if @root.importExtension}}.js{{/if}}'; {{/equals}} {{else}} -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; +import { OpenAPI } from '../core/OpenAPI{{#if @root.importExtension}}.js{{/if}}'; +import { request as __request } from '../core/request{{#if @root.importExtension}}.js{{/if}}'; {{/if}} {{#equals @root.httpClient 'angular'}} diff --git a/src/templates/index.hbs b/src/templates/index.hbs index 476848dd7..65b511cd0 100644 --- a/src/templates/index.hbs +++ b/src/templates/index.hbs @@ -1,30 +1,30 @@ {{>header}} {{#if @root.exportClient}} -export { {{{clientName}}} } from './{{{clientName}}}'; +export { {{{clientName}}} } from './{{{clientName}}}{{#if @root.importExtension}}.js{{/if}}'; {{/if}} {{#if @root.exportCore}} -export { ApiError as OpenAPIError } from './core/ApiError'; +export { ApiError as OpenAPIError } from './core/ApiError{{#if @root.importExtension}}.js{{/if}}'; {{#if @root.exportClient}} -export { BaseHttpRequest } from './core/BaseHttpRequest'; +export { BaseHttpRequest } from './core/BaseHttpRequest{{#if @root.importExtension}}.js{{/if}}'; {{/if}} -export { CancelablePromise, CancelError } from './core/CancelablePromise'; -export { OpenAPI } from './core/OpenAPI'; -export type { OpenAPIConfig } from './core/OpenAPI'; +export { CancelablePromise, CancelError } from './core/CancelablePromise{{#if @root.importExtension}}.js{{/if}}'; +export { OpenAPI } from './core/OpenAPI{{#if @root.importExtension}}.js{{/if}}'; +export type { OpenAPIConfig } from './core/OpenAPI{{#if @root.importExtension}}.js{{/if}}'; {{/if}} {{#if @root.exportModels}} {{#if models}} {{#each models}} {{#if @root.useUnionTypes}} -export type { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from './models/{{{name}}}'; +export type { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from './models/{{{name}}}{{#if @root.importExtension}}.js{{/if}}'; {{else if enum}} -export { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from './models/{{{name}}}'; +export { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from './models/{{{name}}}{{#if @root.importExtension}}.js{{/if}}'; {{else if enums}} -export { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from './models/{{{name}}}'; +export { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from './models/{{{name}}}{{#if @root.importExtension}}.js{{/if}}'; {{else}} -export type { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from './models/{{{name}}}'; +export type { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from './models/{{{name}}}{{#if @root.importExtension}}.js{{/if}}'; {{/if}} {{/each}} {{/if}} @@ -33,7 +33,7 @@ export type { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfi {{#if models}} {{#each models}} -export { ${{{name}}} } from './schemas/${{{name}}}'; +export { ${{{name}}} } from './schemas/${{{name}}}{{#if @root.importExtension}}.js{{/if}}'; {{/each}} {{/if}} {{/if}} @@ -41,7 +41,7 @@ export { ${{{name}}} } from './schemas/${{{name}}}'; {{#if services}} {{#each services}} -export { {{{name}}}{{{@root.postfixServices}}} } from './services/{{{name}}}{{{@root.postfixServices}}}'; +export { {{{name}}}{{{@root.postfixServices}}} } from './services/{{{name}}}{{{@root.postfixServices}}}{{#if @root.importExtension}}.js{{/if}}'; {{/each}} {{/if}} {{/if}} diff --git a/src/utils/writeClient.spec.ts b/src/utils/writeClient.spec.ts index 2bfc3e284..50f363d5c 100644 --- a/src/utils/writeClient.spec.ts +++ b/src/utils/writeClient.spec.ts @@ -44,6 +44,7 @@ describe('writeClient', () => { false, false, false, + false, true, true, true, diff --git a/src/utils/writeClient.ts b/src/utils/writeClient.ts index 6d83a865a..e95dc8ddc 100644 --- a/src/utils/writeClient.ts +++ b/src/utils/writeClient.ts @@ -40,6 +40,7 @@ export const writeClient = async ( httpClient: HttpClient, useOptions: boolean, splitParameters: boolean, + importExtension: boolean, useUnionTypes: boolean, exportCore: boolean, exportServices: boolean, @@ -64,7 +65,16 @@ export const writeClient = async ( if (exportCore) { await rmdir(outputPathCore); await mkdir(outputPathCore); - await writeClientCore(client, templates, outputPathCore, httpClient, indent, clientName, request); + await writeClientCore( + client, + templates, + outputPathCore, + httpClient, + indent, + clientName, + request, + importExtension + ); } if (exportServices) { @@ -78,6 +88,7 @@ export const writeClient = async ( useUnionTypes, useOptions, splitParameters, + importExtension, indent, postfixServices, clientName @@ -93,7 +104,15 @@ export const writeClient = async ( if (exportModels) { await rmdir(outputPathModels); await mkdir(outputPathModels); - await writeClientModels(client.models, templates, outputPathModels, httpClient, useUnionTypes, indent); + await writeClientModels( + client.models, + templates, + outputPathModels, + httpClient, + useUnionTypes, + importExtension, + indent + ); } if (isDefined(clientName)) { @@ -108,6 +127,7 @@ export const writeClient = async ( templates, outputPath, useUnionTypes, + importExtension, exportCore, exportServices, exportModels, diff --git a/src/utils/writeClientCore.ts b/src/utils/writeClientCore.ts index 6d35849d2..9d017fd92 100644 --- a/src/utils/writeClientCore.ts +++ b/src/utils/writeClientCore.ts @@ -26,7 +26,8 @@ export const writeClientCore = async ( httpClient: HttpClient, indent: Indent, clientName?: string, - request?: string + request?: string, + importExtension?: boolean ): Promise => { const httpRequest = getHttpRequestName(httpClient); const context = { @@ -35,6 +36,7 @@ export const writeClientCore = async ( httpRequest, server: client.server, version: client.version, + importExtension, }; await writeFile(resolve(outputPath, 'OpenAPI.ts'), i(templates.core.settings(context), indent)); diff --git a/src/utils/writeClientIndex.spec.ts b/src/utils/writeClientIndex.spec.ts index a7d5b610a..06c0a5be4 100644 --- a/src/utils/writeClientIndex.spec.ts +++ b/src/utils/writeClientIndex.spec.ts @@ -36,7 +36,7 @@ describe('writeClientIndex', () => { }, }; - await writeClientIndex(client, templates, '/', true, true, true, true, true, 'Service', ''); + await writeClientIndex(client, templates, '/', true, false, true, true, true, true, 'Service', ''); expect(writeFile).toBeCalledWith(resolve('/', '/index.ts'), 'index'); }); diff --git a/src/utils/writeClientIndex.ts b/src/utils/writeClientIndex.ts index 5044294d5..f400de1ca 100644 --- a/src/utils/writeClientIndex.ts +++ b/src/utils/writeClientIndex.ts @@ -15,6 +15,7 @@ import { sortServicesByName } from './sortServicesByName'; * @param templates The loaded handlebar templates * @param outputPath Directory to write the generated files to * @param useUnionTypes Use union types instead of enums + * @param importExtension Add .js extension to import statements * @param exportCore Generate core * @param exportServices Generate services * @param exportModels Generate models @@ -28,6 +29,7 @@ export const writeClientIndex = async ( templates: Templates, outputPath: string, useUnionTypes: boolean, + importExtension: boolean, exportCore: boolean, exportServices: boolean, exportModels: boolean, @@ -42,6 +44,7 @@ export const writeClientIndex = async ( exportModels, exportSchemas, useUnionTypes, + importExtension, postfixServices, postfixModels, clientName, diff --git a/src/utils/writeClientModels.spec.ts b/src/utils/writeClientModels.spec.ts index ee0f2b4f6..61707dac9 100644 --- a/src/utils/writeClientModels.spec.ts +++ b/src/utils/writeClientModels.spec.ts @@ -52,7 +52,7 @@ describe('writeClientModels', () => { }, }; - await writeClientModels(models, templates, '/', HttpClient.FETCH, false, Indent.SPACE_4); + await writeClientModels(models, templates, '/', HttpClient.FETCH, false, false, Indent.SPACE_4); expect(writeFile).toBeCalledWith(resolve('/', '/User.ts'), `model${EOL}`); }); diff --git a/src/utils/writeClientModels.ts b/src/utils/writeClientModels.ts index 997569b9f..2f7c1fa39 100644 --- a/src/utils/writeClientModels.ts +++ b/src/utils/writeClientModels.ts @@ -15,6 +15,7 @@ import type { Templates } from './registerHandlebarTemplates'; * @param outputPath Directory to write the generated files to * @param httpClient The selected httpClient (fetch, xhr, node or axios) * @param useUnionTypes Use union types instead of enums + * @param importExtension Add .js to import statements * @param indent Indentation options (4, 2 or tab) */ export const writeClientModels = async ( @@ -23,6 +24,7 @@ export const writeClientModels = async ( outputPath: string, httpClient: HttpClient, useUnionTypes: boolean, + importExtension: boolean, indent: Indent ): Promise => { for (const model of models) { @@ -31,6 +33,7 @@ export const writeClientModels = async ( ...model, httpClient, useUnionTypes, + importExtension, }); await writeFile(file, i(f(templateResult), indent)); } diff --git a/src/utils/writeClientServices.spec.ts b/src/utils/writeClientServices.spec.ts index 99aa18282..f2e7dd81a 100644 --- a/src/utils/writeClientServices.spec.ts +++ b/src/utils/writeClientServices.spec.ts @@ -48,6 +48,7 @@ describe('writeClientServices', () => { false, false, false, + false, Indent.SPACE_4, 'Service' ); diff --git a/src/utils/writeClientServices.ts b/src/utils/writeClientServices.ts index 7ba98dcda..335089fa7 100644 --- a/src/utils/writeClientServices.ts +++ b/src/utils/writeClientServices.ts @@ -29,6 +29,7 @@ export const writeClientServices = async ( useUnionTypes: boolean, useOptions: boolean, splitParameters: boolean, + importExtension: boolean, indent: Indent, postfix: string, clientName?: string @@ -41,6 +42,7 @@ export const writeClientServices = async ( useUnionTypes, useOptions, splitParameters, + importExtension, postfix, exportClient: isDefined(clientName), }); diff --git a/test/e2e/scripts/generateClient.ts b/test/e2e/scripts/generateClient.ts index 75894b745..28626473f 100644 --- a/test/e2e/scripts/generateClient.ts +++ b/test/e2e/scripts/generateClient.ts @@ -6,6 +6,7 @@ export const generateClient = async ( client: 'fetch' | 'xhr' | 'node' | 'axios' | 'angular', useOptions: boolean = false, splitParameters: boolean = false, + importExtension: boolean = false, useUnionTypes: boolean = false, clientName?: string ) => { @@ -15,6 +16,7 @@ export const generateClient = async ( httpClient: client, useOptions, splitParameters, + importExtension, useUnionTypes, clientName, }); diff --git a/test/index.js b/test/index.js index 15f788e96..883ef130c 100644 --- a/test/index.js +++ b/test/index.js @@ -10,6 +10,7 @@ const generate = async (input, output) => { httpClient: OpenAPI.HttpClient.FETCH, useOptions: true, splitParameters: false, + importExtension: false, useUnionTypes: false, exportCore: true, exportSchemas: true, diff --git a/types/index.d.ts b/types/index.d.ts index f8e8fdc1f..bbfa71244 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -19,6 +19,7 @@ export type Options = { clientName?: string; useOptions?: boolean; splitParameters?: boolean; + importExtension?: boolean; useUnionTypes?: boolean; exportCore?: boolean; exportServices?: boolean; From bccca6cb7deddf3c98c8d92fda25f50c1e38cc43 Mon Sep 17 00:00:00 2001 From: Alejandro Rizzo Date: Tue, 25 Mar 2025 12:29:44 +0000 Subject: [PATCH 2/7] try to fix circleCI --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 4f71b8c84..ffacf8403 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,7 +1,7 @@ version: 2.1 orbs: - codacy: codacy/base@7.0.0 + codacy: codacy/base@10.8.0 references: release_filter: &release_filter From 5b949105a038f9e01335574c0cdfbf2593dd1e44 Mon Sep 17 00:00:00 2001 From: Alejandro Rizzo Date: Tue, 25 Mar 2025 13:52:23 +0000 Subject: [PATCH 3/7] try different node version --- .circleci/config.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ffacf8403..03ccc3b34 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -10,11 +10,10 @@ references: only: - master - jobs: build_package: docker: - - image: cimg/node:20.8 + - image: cimg/node:20.1.0 working_directory: ~/workdir steps: - attach_workspace: @@ -44,7 +43,7 @@ jobs: publish_packages: docker: - - image: cimg/node:20.8 + - image: cimg/node:20.1.0 working_directory: ~/workdir steps: - attach_workspace: From 5613182cd5f1525334ef3ec63775bd7a2abe5816 Mon Sep 17 00:00:00 2001 From: Alejandro Rizzo Date: Tue, 25 Mar 2025 14:06:20 +0000 Subject: [PATCH 4/7] try something else --- .circleci/config.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 03ccc3b34..a36876a72 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -23,10 +23,15 @@ jobs: command: | node -v npm -v + - run: + name: Clear npm cache + command: | + npm cache clean --force - run: name: Install dependencies and generate command: | - npm install + ls -la + npm install --no-progress - run: name: Build library command: | From af5112824f972abe0132f4f314f0110a4a41aa2e Mon Sep 17 00:00:00 2001 From: Alejandro Rizzo Date: Tue, 25 Mar 2025 14:10:29 +0000 Subject: [PATCH 5/7] try another one --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a36876a72..cca514a29 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -31,7 +31,7 @@ jobs: name: Install dependencies and generate command: | ls -la - npm install --no-progress + npm install --verbose - run: name: Build library command: | From 2ecdd490eb7f38a3a02162c9b1d816860fb7d1fd Mon Sep 17 00:00:00 2001 From: Alejandro Rizzo Date: Tue, 25 Mar 2025 14:16:38 +0000 Subject: [PATCH 6/7] try try try --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index cca514a29..d07508909 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -31,7 +31,7 @@ jobs: name: Install dependencies and generate command: | ls -la - npm install --verbose + PUPPETEER_SKIP_DOWNLOAD=true npm install --unsafe-perm=true --verbose - run: name: Build library command: | From 869e770bbc46b5159c42bb79b90e440f3e840d8f Mon Sep 17 00:00:00 2001 From: Alejandro Rizzo Date: Tue, 25 Mar 2025 14:26:06 +0000 Subject: [PATCH 7/7] clean up --- .circleci/config.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d07508909..97e74ef6e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -23,15 +23,10 @@ jobs: command: | node -v npm -v - - run: - name: Clear npm cache - command: | - npm cache clean --force - run: name: Install dependencies and generate command: | - ls -la - PUPPETEER_SKIP_DOWNLOAD=true npm install --unsafe-perm=true --verbose + PUPPETEER_SKIP_DOWNLOAD=true npm install --unsafe-perm=true - run: name: Build library command: |