Skip to content

adds an importExtension option #6

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Mar 25, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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:
Expand All @@ -27,7 +26,7 @@ jobs:
- run:
name: Install dependencies and generate
command: |
npm install
PUPPETEER_SKIP_DOWNLOAD=true npm install --unsafe-perm=true
- run:
name: Build library
command: |
Expand All @@ -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:
Expand Down
2 changes: 2 additions & 0 deletions bin/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ const params = program
.option('--name <value>', '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 <value>', 'Write core files to disk', true)
.option('--exportServices <value>', 'Write services to disk', true)
Expand All @@ -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,
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
5 changes: 5 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ export type Options = {
clientName?: string;
useOptions?: boolean;
splitParameters?: boolean;
importExtension?: boolean;
useUnionTypes?: boolean;
exportCore?: boolean;
exportServices?: boolean;
Expand All @@ -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
Expand All @@ -59,6 +61,7 @@ export const generate = async ({
clientName,
useOptions = false,
splitParameters = false,
importExtension = false,
useUnionTypes = false,
exportCore = true,
exportServices = true,
Expand Down Expand Up @@ -90,6 +93,7 @@ export const generate = async ({
httpClient,
useOptions,
splitParameters,
importExtension,
useUnionTypes,
exportCore,
exportServices,
Expand All @@ -115,6 +119,7 @@ export const generate = async ({
httpClient,
useOptions,
splitParameters,
importExtension,
useUnionTypes,
exportCore,
exportServices,
Expand Down
4 changes: 2 additions & 2 deletions src/templates/core/ApiError.hbs
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
8 changes: 4 additions & 4 deletions src/templates/core/BaseHttpRequest.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
12 changes: 6 additions & 6 deletions src/templates/core/HttpRequest.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -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'}}
Expand Down
2 changes: 1 addition & 1 deletion src/templates/core/OpenAPI.hbs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{{>header}}

import type { ApiRequestOptions } from './ApiRequestOptions';
import type { ApiRequestOptions } from './ApiRequestOptions{{#if @root.importExtension}}.js{{/if}}';

type Resolver<T> = (options: ApiRequestOptions) => Promise<T | undefined>;
type Headers = Record<string, string>;
Expand Down
2 changes: 1 addition & 1 deletion src/templates/core/angular/request.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down
12 changes: 6 additions & 6 deletions src/templates/core/axios/request.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -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}}

Expand Down
12 changes: 6 additions & 6 deletions src/templates/core/fetch/request.hbs
Original file line number Diff line number Diff line change
@@ -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}}

Expand Down
12 changes: 6 additions & 6 deletions src/templates/core/node/request.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -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}}

Expand Down
12 changes: 6 additions & 6 deletions src/templates/core/xhr/request.hbs
Original file line number Diff line number Diff line change
@@ -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}}

Expand Down
2 changes: 1 addition & 1 deletion src/templates/exportModel.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -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}}

Expand Down
12 changes: 6 additions & 6 deletions src/templates/exportService.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -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'}}
Expand Down
24 changes: 12 additions & 12 deletions src/templates/index.hbs
Original file line number Diff line number Diff line change
@@ -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}}
Expand All @@ -33,15 +33,15 @@ 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}}
{{#if @root.exportServices}}
{{#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}}
1 change: 1 addition & 0 deletions src/utils/writeClient.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ describe('writeClient', () => {
false,
false,
false,
false,
true,
true,
true,
Expand Down
Loading
Loading