Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
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
24 changes: 22 additions & 2 deletions src/utils/writeClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ export const writeClient = async (
httpClient: HttpClient,
useOptions: boolean,
splitParameters: boolean,
importExtension: boolean,
useUnionTypes: boolean,
exportCore: boolean,
exportServices: boolean,
Expand All @@ -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) {
Expand All @@ -78,6 +88,7 @@ export const writeClient = async (
useUnionTypes,
useOptions,
splitParameters,
importExtension,
indent,
postfixServices,
clientName
Expand All @@ -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)) {
Expand All @@ -108,6 +127,7 @@ export const writeClient = async (
templates,
outputPath,
useUnionTypes,
importExtension,
exportCore,
exportServices,
exportModels,
Expand Down
4 changes: 3 additions & 1 deletion src/utils/writeClientCore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ export const writeClientCore = async (
httpClient: HttpClient,
indent: Indent,
clientName?: string,
request?: string
request?: string,
importExtension?: boolean
): Promise<void> => {
const httpRequest = getHttpRequestName(httpClient);
const context = {
Expand All @@ -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));
Expand Down
2 changes: 1 addition & 1 deletion src/utils/writeClientIndex.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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');
});
Expand Down
Loading
Loading