···11-import type { Model } from './Model';
22-import type { Operation } from './Operation';
33-44-export interface Service extends Pick<Model, '$refs' | 'imports' | 'name'> {
55- operations: Operation[];
66-}
···4455import { sync } from 'cross-spawn';
6677-import type { Client } from './client/interfaces/Client';
87import { parse as parseV2 } from './openApi/v2';
98import { parse as parseV3 } from './openApi/v3';
99+import type { Client } from './types/client';
1010import type { Config, UserConfig } from './types/config';
1111import { getOpenApiSpec } from './utils/getOpenApiSpec';
1212import { registerHandlebarTemplates } from './utils/handlebars';
+1-1
src/openApi/v2/index.ts
···11-import type { Client } from '../../client/interfaces/Client';
11+import type { Client } from '../../types/client';
22import type { Config } from '../../types/config';
33import type { OpenApi } from './interfaces/OpenApi';
44import { getModels } from './parser/getModels';
+1-1
src/openApi/v2/interfaces/OpenApiItems.ts
···11-import type { WithEnumExtension } from '../../../client/interfaces/WithEnumExtension';
11+import type { WithEnumExtension } from '../../../types/client';
2233/**
44 * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#itemsObject
+1-1
src/openApi/v2/interfaces/OpenApiParameter.ts
···11-import type { WithEnumExtension } from '../../../client/interfaces/WithEnumExtension';
11+import type { WithEnumExtension } from '../../../types/client';
22import type { WithNullableExtension } from './Extensions/WithNullableExtension';
33import type { OpenApiItems } from './OpenApiItems';
44import type { OpenApiReference } from './OpenApiReference';
+1-1
src/openApi/v2/interfaces/OpenApiSchema.ts
···11-import type { WithEnumExtension } from '../../../client/interfaces/WithEnumExtension';
11+import type { WithEnumExtension } from '../../../types/client';
22import type { Dictionary } from '../../../utils/types';
33import type { WithNullableExtension } from './Extensions/WithNullableExtension';
44import type { OpenApiExternalDocs } from './OpenApiExternalDocs';
+1-1
src/openApi/v2/parser/getModel.ts
···11-import type { Model } from '../../../client/interfaces/Model';
11+import type { Model } from '../../../types/client';
22import { getEnums } from '../../../utils/getEnums';
33import { getPattern } from '../../../utils/getPattern';
44import { getType } from '../../../utils/type';
+1-2
src/openApi/v2/parser/getModelComposition.ts
···11-import type { Model } from '../../../client/interfaces/Model';
22-import type { ModelComposition } from '../../../client/interfaces/ModelComposition';
11+import type { Model, ModelComposition } from '../../../types/client';
32import type { OpenApi } from '../interfaces/OpenApi';
43import type { OpenApiSchema } from '../interfaces/OpenApiSchema';
54import type { getModel } from './getModel';
+1-1
src/openApi/v2/parser/getModelProperties.ts
···11-import type { Model } from '../../../client/interfaces/Model';
11+import type { Model } from '../../../types/client';
22import { escapeName } from '../../../utils/escapeName';
33import { getPattern } from '../../../utils/getPattern';
44import { getType } from '../../../utils/type';
···11-import type { Type } from '../../../client/interfaces/Type';
22-33-/**
44- * If our model has a template type, then we want to generalize that!
55- * In that case we should return "<T>" as our template type.
66- * @param modelClass The parsed model class type.
77- * @returns The model template type (<T> or empty).
88- */
99-export const getModelTemplate = (modelClass: Type): string => (modelClass.template ? '<T>' : '');
+1-1
src/openApi/v2/parser/getModels.ts
···11-import type { Model } from '../../../client/interfaces/Model';
11+import type { Model } from '../../../types/client';
22import { reservedWords } from '../../../utils/reservedWords';
33import { getType } from '../../../utils/type';
44import type { OpenApi } from '../interfaces/OpenApi';
+9-3
src/openApi/v2/parser/getOperation.ts
···11-import type { Operation } from '../../../client/interfaces/Operation';
22-import type { OperationParameters } from '../../../client/interfaces/OperationParameters';
11+import type { Operation, OperationParameter, OperationParameters } from '../../../types/client';
32import type { Config } from '../../../types/config';
43import { getOperationName } from '../../../utils/operation';
54import type { OpenApi } from '../interfaces/OpenApi';
···109import { getOperationResponses } from './getOperationResponses';
1110import { getOperationResults } from './getOperationResults';
1211import { getServiceName } from './getServiceName';
1313-import { sortByRequired } from './sortByRequired';
1212+1313+const sortByRequired = (a: OperationParameter, b: OperationParameter): number => {
1414+ const aNeedsValue = a.isRequired && a.default === undefined;
1515+ const bNeedsValue = b.isRequired && b.default === undefined;
1616+ if (aNeedsValue && !bNeedsValue) return -1;
1717+ if (bNeedsValue && !aNeedsValue) return 1;
1818+ return 0;
1919+};
14201521export const getOperation = (
1622 openApi: OpenApi,
+1-2
src/openApi/v2/parser/getOperationErrors.ts
···11-import type { OperationError } from '../../../client/interfaces/OperationError';
22-import type { OperationResponse } from '../../../client/interfaces/OperationResponse';
11+import type { OperationError, OperationResponse } from '../../../types/client';
3243/**
54 *
+1-1
src/openApi/v2/parser/getOperationParameter.ts
···11-import type { OperationParameter } from '../../../client/interfaces/OperationParameter';
11+import type { OperationParameter } from '../../../types/client';
22import { getEnums } from '../../../utils/getEnums';
33import { getPattern } from '../../../utils/getPattern';
44import { getType } from '../../../utils/type';
···11-import type { OperationParameter } from '../../../client/interfaces/OperationParameter';
11+import type { OperationParameter } from '../../../types/client';
22import type { OpenApiParameter } from '../interfaces/OpenApiParameter';
3344export const getOperationParameterDefault = (
+1-1
src/openApi/v2/parser/getOperationParameters.ts
···11-import type { OperationParameters } from '../../../client/interfaces/OperationParameters';
11+import type { OperationParameters } from '../../../types/client';
22import type { OpenApi } from '../interfaces/OpenApi';
33import type { OpenApiParameter } from '../interfaces/OpenApiParameter';
44import { getOperationParameter } from './getOperationParameter';
+1-1
src/openApi/v2/parser/getOperationResponse.ts
···11-import type { OperationResponse } from '../../../client/interfaces/OperationResponse';
11+import type { OperationResponse } from '../../../types/client';
22import { getPattern } from '../../../utils/getPattern';
33import { getType } from '../../../utils/type';
44import type { OpenApi } from '../interfaces/OpenApi';
···11-import type { OperationResponse } from '../../../client/interfaces/OperationResponse';
11+import type { OperationResponse } from '../../../types/client';
2233export const getOperationResponseHeader = (operationResponses: OperationResponse[]): string | null => {
44 const header = operationResponses.find(operationResponses => operationResponses.in === 'header');
+1-1
src/openApi/v2/parser/getOperationResponses.ts
···11-import type { OperationResponse } from '../../../client/interfaces/OperationResponse';
11+import type { OperationResponse } from '../../../types/client';
22import type { OpenApi } from '../interfaces/OpenApi';
33import type { OpenApiResponse } from '../interfaces/OpenApiResponse';
44import type { OpenApiResponses } from '../interfaces/OpenApiResponses';
+1-2
src/openApi/v2/parser/getOperationResults.ts
···11-import type { Model } from '../../../client/interfaces/Model';
22-import type { OperationResponse } from '../../../client/interfaces/OperationResponse';
11+import type { Model, OperationResponse } from '../../../types/client';
3243const areEqual = (a: Model, b: Model): boolean => {
54 const equal = a.type === b.type && a.base === b.base && a.template === b.template;
···11-import type { Model } from '../../../client/interfaces/Model';
11+import type { Model } from '../../../types/client';
22import type { OpenApi } from '../interfaces/OpenApi';
33import type { OpenApiSchema } from '../interfaces/OpenApiSchema';
44import type { getModel } from './getModel';
+1-1
src/openApi/v2/parser/getServices.ts
···11-import type { Service } from '../../../client/interfaces/Service';
11+import type { Service } from '../../../types/client';
22import type { Config } from '../../../types/config';
33import { unique } from '../../../utils/unique';
44import type { OpenApi } from '../interfaces/OpenApi';
···11-import type { Client } from '../../client/interfaces/Client';
11+import type { Client } from '../../types/client';
22import type { Config } from '../../types/config';
33import type { OpenApi } from './interfaces/OpenApi';
44import { getModels } from './parser/getModels';
+1-1
src/openApi/v3/interfaces/OpenApiSchema.ts
···11-import type { WithEnumExtension } from '../../../client/interfaces/WithEnumExtension';
11+import type { WithEnumExtension } from '../../../types/client';
22import type { Dictionary } from '../../../utils/types';
33import type { OpenApiDiscriminator } from './OpenApiDiscriminator';
44import type { OpenApiExternalDocs } from './OpenApiExternalDocs';
···11-import type { WithEnumExtension } from '../../../client/interfaces/WithEnumExtension';
11+import type { WithEnumExtension } from '../../../types/client';
2233/**
44 * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#serverVariableObject
+1-1
src/openApi/v3/parser/getModel.ts
···11-import type { Model } from '../../../client/interfaces/Model';
11+import type { Model } from '../../../types/client';
22import { getEnums } from '../../../utils/getEnums';
33import { getPattern } from '../../../utils/getPattern';
44import { getType } from '../../../utils/type';
+1-2
src/openApi/v3/parser/getModelComposition.ts
···11-import type { Model } from '../../../client/interfaces/Model';
22-import type { ModelComposition } from '../../../client/interfaces/ModelComposition';
11+import type { Model, ModelComposition } from '../../../types/client';
32import type { OpenApi } from '../interfaces/OpenApi';
43import type { OpenApiSchema } from '../interfaces/OpenApiSchema';
54import type { getModel } from './getModel';
+1-1
src/openApi/v3/parser/getModelDefault.ts
···11-import type { Model } from '../../../client/interfaces/Model';
11+import type { Model } from '../../../types/client';
22import type { OpenApiSchema } from '../interfaces/OpenApiSchema';
3344export const getModelDefault = (definition: OpenApiSchema, model?: Model): string | undefined => {
+1-1
src/openApi/v3/parser/getModelProperties.ts
···11-import type { Model } from '../../../client/interfaces/Model';
11+import type { Model } from '../../../types/client';
22import { findOneOfParentDiscriminator, mapPropertyValue } from '../../../utils/discriminator';
33import { escapeName } from '../../../utils/escapeName';
44import { getPattern } from '../../../utils/getPattern';
···11-import type { Type } from '../../../client/interfaces/Type';
22-33-/**
44- * If our model has a template type, then we want to generalize that!
55- * In that case we should return "<T>" as our template type.
66- * @param modelClass The parsed model class type.
77- * @returns The model template type (<T> or empty).
88- */
99-export const getModelTemplate = (modelClass: Type): string => (modelClass.template ? '<T>' : '');
+1-1
src/openApi/v3/parser/getModels.ts
···11-import type { Model } from '../../../client/interfaces/Model';
11+import type { Model } from '../../../types/client';
22import { reservedWords } from '../../../utils/reservedWords';
33import { getType } from '../../../utils/type';
44import type { OpenApi } from '../interfaces/OpenApi';
+1-2
src/openApi/v3/parser/getOperationErrors.ts
···11-import type { OperationError } from '../../../client/interfaces/OperationError';
22-import type { OperationResponse } from '../../../client/interfaces/OperationResponse';
11+import type { OperationError, OperationResponse } from '../../../types/client';
3243export const getOperationErrors = (operationResponses: OperationResponse[]): OperationError[] =>
54 operationResponses
+1-1
src/openApi/v3/parser/getOperationParameter.ts
···11-import type { OperationParameter } from '../../../client/interfaces/OperationParameter';
11+import type { OperationParameter } from '../../../types/client';
22import { getPattern } from '../../../utils/getPattern';
33import { getType } from '../../../utils/type';
44import type { OpenApi } from '../interfaces/OpenApi';
+1-1
src/openApi/v3/parser/getOperationParameters.ts
···11-import type { OperationParameters } from '../../../client/interfaces/OperationParameters';
11+import type { OperationParameters } from '../../../types/client';
22import type { OpenApi } from '../interfaces/OpenApi';
33import type { OpenApiParameter } from '../interfaces/OpenApiParameter';
44import { getOperationParameter } from './getOperationParameter';
+1-1
src/openApi/v3/parser/getOperationRequestBody.ts
···11-import type { OperationParameter } from '../../../client/interfaces/OperationParameter';
11+import type { OperationParameter } from '../../../types/client';
22import { getPattern } from '../../../utils/getPattern';
33import { getType } from '../../../utils/type';
44import type { OpenApi } from '../interfaces/OpenApi';
+1-1
src/openApi/v3/parser/getOperationResponse.ts
···11-import type { OperationResponse } from '../../../client/interfaces/OperationResponse';
11+import type { OperationResponse } from '../../../types/client';
22import { getPattern } from '../../../utils/getPattern';
33import { getType } from '../../../utils/type';
44import type { OpenApi } from '../interfaces/OpenApi';
···11-import type { OperationResponse } from '../../../client/interfaces/OperationResponse';
11+import type { OperationResponse } from '../../../types/client';
2233export const getOperationResponseHeader = (operationResponses: OperationResponse[]): string | null => {
44 const header = operationResponses.find(operationResponses => operationResponses.in === 'header');
+1-1
src/openApi/v3/parser/getOperationResponses.ts
···11-import type { OperationResponse } from '../../../client/interfaces/OperationResponse';
11+import type { OperationResponse } from '../../../types/client';
22import type { OpenApi } from '../interfaces/OpenApi';
33import type { OpenApiResponse } from '../interfaces/OpenApiResponse';
44import type { OpenApiResponses } from '../interfaces/OpenApiResponses';
+1-2
src/openApi/v3/parser/getOperationResults.ts
···11-import type { Model } from '../../../client/interfaces/Model';
22-import type { OperationResponse } from '../../../client/interfaces/OperationResponse';
11+import type { Model, OperationResponse } from '../../../types/client';
3243const areEqual = (a: Model, b: Model): boolean => {
54 const equal = a.type === b.type && a.base === b.base && a.template === b.template;
···11-import type { Model } from '../../../client/interfaces/Model';
11+import type { Model } from '../../../types/client';
22import type { OpenApi } from '../interfaces/OpenApi';
33import type { OpenApiSchema } from '../interfaces/OpenApiSchema';
44import type { getModel } from './getModel';
+1-2
src/openApi/v3/parser/getServices.ts
···11-import type { Operation } from '../../../client/interfaces/Operation';
22-import type { Service } from '../../../client/interfaces/Service';
11+import type { Operation, Service } from '../../../types/client';
32import type { Config } from '../../../types/config';
43import { unique } from '../../../utils/unique';
54import type { OpenApi } from '../interfaces/OpenApi';
+1-3
src/openApi/v3/parser/operation.ts
···11-import type { Operation } from '../../../client/interfaces/Operation';
22-import type { OperationParameter } from '../../../client/interfaces/OperationParameter';
33-import type { OperationParameters } from '../../../client/interfaces/OperationParameters';
11+import type { Operation, OperationParameter, OperationParameters } from '../../../types/client';
42import type { Config } from '../../../types/config';
53import { getOperationName } from '../../../utils/operation';
64import type { OpenApi } from '../interfaces/OpenApi';
···11import { describe, expect, it } from 'vitest';
2233-import type { Model } from '../../client/interfaces/Model';
44-import type { Service } from '../../client/interfaces/Service';
55-import { sortByName } from '../sortByName';
33+import type { Model, Service } from '../../types/client';
44+import { sort, sortByName } from '../sort';
55+66+describe('sort', () => {
77+ it('should return correct index', () => {
88+ expect(sort('a', 'b')).toEqual(-1);
99+ expect(sort('b', 'a')).toEqual(1);
1010+ expect(sort('a', 'a')).toEqual(0);
1111+ expect(sort('', '')).toEqual(0);
1212+ });
1313+});
614715describe('sortByName', () => {
816 it('should handle empty lists', () => {
+1-1
src/utils/discriminator.ts
···11-import type { Model } from '../client/interfaces/Model';
21import type { OpenApi } from '../openApi/v3/interfaces/OpenApi';
32import type { OpenApiDiscriminator } from '../openApi/v3/interfaces/OpenApiDiscriminator';
33+import type { Model } from '../types/client';
44import { stripNamespace } from './stripNamespace';
55import type { Dictionary } from './types';
66
+1-1
src/utils/enum.ts
···11-import type { Enum } from '../client/interfaces/Enum';
11+import type { Enum } from '../types/client';
22import { unescapeName } from './escapeName';
33import { unique } from './unique';
44
+1-2
src/utils/getEnums.ts
···11-import type { Enum } from '../client/interfaces/Enum';
22-import type { WithEnumExtension } from '../client/interfaces/WithEnumExtension';
11+import type { Enum, WithEnumExtension } from '../types/client';
32import { unique } from './unique';
4354export const getEnums = (definition: WithEnumExtension, values?: ReadonlyArray<string | number>): Enum[] => {
+1-1
src/utils/getHttpRequestName.ts
···11-import type { UserConfig } from '../node';
11+import type { UserConfig } from '../types/config';
2233/**
44 * Generate the HttpRequest filename based on the selected client
···11import { describe, expect, it } from 'vitest';
2233-import { getPattern } from './getPattern';
33+import { getPattern } from '../getPattern';
4455describe('getPattern', () => {
66 it('should produce correct result', () => {
+2-5
src/utils/handlebars.ts
···22import Handlebars from 'handlebars/runtime';
33import { EOL } from 'os';
4455-import type { Client } from '../client/interfaces/Client';
66-import type { Model } from '../client/interfaces/Model';
77-import type { OperationParameter } from '../client/interfaces/OperationParameter';
88-import type { Service } from '../client/interfaces/Service';
95import templateClient from '../templates/client.hbs';
106import angularGetHeaders from '../templates/core/angular/getHeaders.hbs';
117import angularGetRequestBody from '../templates/core/angular/getRequestBody.hbs';
···9086import partialTypeIntersection from '../templates/partials/typeIntersection.hbs';
9187import partialTypeReference from '../templates/partials/typeReference.hbs';
9288import partialTypeUnion from '../templates/partials/typeUnion.hbs';
8989+import type { Client, Model, OperationParameter, Service } from '../types/client';
9390import type { Config, UserConfig } from '../types/config';
9491import { enumKey, enumName, enumUnionType, enumValue } from './enum';
9592import { escapeName } from './escapeName';
9696-import { sortByName } from './sortByName';
9393+import { sortByName } from './sort';
9794import { unique } from './unique';
98959996const escapeComment = (value: string) =>
···2233import { describe, expect, it } from 'vitest';
4455-import { isSubDirectory } from './isSubdirectory';
55+import { isSubDirectory } from '../isSubdirectory';
6677describe('isSubDirectory', () => {
88 it('should return correct result', () => {
+1-1
src/utils/operation.ts
···11import camelCase from 'camelcase';
2233-import type { UserConfig } from '../node';
33+import type { UserConfig } from '../types/config';
44import sanitizeOperationName from './sanitizeOperationName';
5566/**
+1-1
src/utils/postProcessClient.ts
···11-import type { Client } from '../client/interfaces/Client';
11+import type { Client } from '../types/client';
22import { postProcessModel } from './postProcessModel';
33import { postProcessService } from './postProcessService';
44
+1-1
src/utils/postProcessModel.ts
···11-import type { Model } from '../client/interfaces/Model';
11+import type { Model } from '../types/client';
22import { postProcessModelEnum } from './postProcessModelEnum';
33import { postProcessModelEnums } from './postProcessModelEnums';
44import { postProcessModelImports } from './postProcessModelImports';
+1-1
src/utils/postProcessModelEnum.ts
···11-import type { Model } from '../client/interfaces/Model';
11+import type { Model } from '../types/client';
2233/**
44 * Set unique enum values for the model
+1-1
src/utils/postProcessModelEnums.ts
···11-import type { Model } from '../client/interfaces/Model';
11+import type { Model } from '../types/client';
2233/**
44 * Set unique enum values for the model
+1-1
src/utils/postProcessModelImports.ts
···11-import type { Model } from '../client/interfaces/Model';
11+import type { Model } from '../types/client';
22import { sort } from './sort';
33import { unique } from './unique';
44
+1-1
src/utils/postProcessService.ts
···11-import type { Service } from '../client/interfaces/Service';
11+import type { Service } from '../types/client';
22import { postProcessServiceImports } from './postProcessServiceImports';
33import { postProcessServiceOperations } from './postProcessServiceOperations';
44
+1-1
src/utils/postProcessServiceImports.ts
···11-import type { Service } from '../client/interfaces/Service';
11+import type { Service } from '../types/client';
22import { sort } from './sort';
33import { unique } from './unique';
44
+1-2
src/utils/postProcessServiceOperations.ts
···11-import type { Operation } from '../client/interfaces/Operation';
22-import type { Service } from '../client/interfaces/Service';
11+import type { Operation, Service } from '../types/client';
3243export const postProcessServiceOperations = (service: Service): Operation[] => {
54 const names = new Map<string, number>();
···11-import type { Type } from '../client/interfaces/Type';
11+import type { Type } from '../types/client';
22import sanitizeTypeName from './sanitizeTypeName';
33import { stripNamespace } from './stripNamespace';
44
···11import { describe, expect, it } from 'vitest';
2233-import { unique } from './unique';
33+import { unique } from '../unique';
4455describe('unique', () => {
66 it('should return correct index', () => {
+3-3
src/utils/write/class.ts
···11import { writeFileSync } from 'node:fs';
22import path from 'node:path';
3344-import type { Client } from '../../client/interfaces/Client';
55-import type { UserConfig } from '../../node';
44+import type { Client } from '../../types/client';
55+import type { UserConfig } from '../../types/config';
66import { getHttpRequestName } from '../getHttpRequestName';
77import type { Templates } from '../handlebars';
88-import { sortByName } from '../sortByName';
88+import { sortByName } from '../sort';
991010/**
1111 * Generate the OpenAPI client index file using the Handlebar template and write it to disk.
+1-1
src/utils/write/client.ts
···11import { mkdirSync, rmSync } from 'node:fs';
22import path from 'node:path';
3344-import type { Client } from '../../client/interfaces/Client';
44+import type { Client } from '../../types/client';
55import type { Config } from '../../types/config';
66import type { Templates } from '../handlebars';
77import { isSubDirectory } from '../isSubdirectory';
+2-2
src/utils/write/core.ts
···11import { copyFileSync, existsSync, writeFileSync } from 'node:fs';
22import path from 'node:path';
3344-import type { Client } from '../../client/interfaces/Client';
55-import type { UserConfig } from '../../node';
44+import type { Client } from '../../types/client';
55+import type { UserConfig } from '../../types/config';
66import { getHttpRequestName } from '../getHttpRequestName';
77import type { Templates } from '../handlebars';
88
+3-3
src/utils/write/index.ts
···11import { writeFileSync } from 'node:fs';
22import path from 'node:path';
3344-import type { Client } from '../../client/interfaces/Client';
55-import type { UserConfig } from '../../node';
44+import type { Client } from '../../types/client';
55+import type { UserConfig } from '../../types/config';
66import { Templates } from '../handlebars';
77-import { sortByName } from '../sortByName';
77+import { sortByName } from '../sort';
8899/**
1010 * Generate the OpenAPI client index file using the Handlebar template and write it to disk.
+2-2
src/utils/write/models.ts
···11import { writeFileSync } from 'node:fs';
22import path from 'node:path';
3344-import type { Client } from '../../client/interfaces/Client';
55-import type { UserConfig } from '../../node';
44+import type { Client } from '../../types/client';
55+import type { UserConfig } from '../../types/config';
66import type { Templates } from '../handlebars';
7788/**
+2-2
src/utils/write/schemas.ts
···11import { writeFileSync } from 'node:fs';
22import path from 'node:path';
3344-import type { Client } from '../../client/interfaces/Client';
55-import type { UserConfig } from '../../node';
44+import type { Client } from '../../types/client';
55+import type { UserConfig } from '../../types/config';
66import type { Templates } from '../handlebars';
7788/**
+1-1
src/utils/write/services.ts
···11import { writeFileSync } from 'node:fs';
22import path from 'node:path';
3344-import type { Client } from '../../client/interfaces/Client';
44+import type { Client } from '../../types/client';
55import type { Config } from '../../types/config';
66import type { Templates } from '../handlebars';
77