From f3631fa9715ebf2bdb67e6ef7cce5e270af0163e Mon Sep 17 00:00:00 2001 From: anymaniax Date: Sun, 29 Nov 2020 22:28:35 +0100 Subject: [PATCH] feat(client-axios): remove axios instance in argument --- .../src/api/mutator/custom-instance.ts | 4 +- .../src/auth.context.tsx | 30 ++++------ samples/react-app/orval.config.js | 5 +- samples/react-app/src/App.tsx | 26 ++++++--- samples/react-app/src/api/config.ts | 34 ----------- .../petstoreFromFileSpecWithTransformer.ts | 25 +++++--- .../src/api/mutator/custom-instance.ts | 9 +++ .../src/api/mutator/response-type.ts | 10 ---- samples/react-app/src/api/useApi.ts | 39 +------------ samples/react-app/src/auth.context.tsx | 58 +++++++++++++++++++ samples/react-app/src/index.tsx | 5 +- src/core/generators/angular.ts | 37 +++++------- src/core/generators/api.ts | 11 ++-- src/core/generators/axios.ts | 26 +++------ src/core/generators/client.ts | 12 ++-- src/core/generators/imports.ts | 2 +- src/core/generators/mutator.ts | 13 ++--- src/core/generators/react-query.ts | 33 +++-------- src/core/generators/verbsOptions.ts | 19 +++--- src/core/importers/openApi.ts | 2 +- src/core/resolvers/path.ts | 2 +- src/core/writers/splitTagsMode.ts | 2 +- src/core/writers/tagsMode.ts | 2 +- src/core/writers/targetTags.ts | 2 - 24 files changed, 187 insertions(+), 221 deletions(-) delete mode 100644 samples/react-app/src/api/config.ts create mode 100644 samples/react-app/src/api/mutator/custom-instance.ts delete mode 100644 samples/react-app/src/api/mutator/response-type.ts create mode 100644 samples/react-app/src/auth.context.tsx diff --git a/samples/react-app-with-react-query/src/api/mutator/custom-instance.ts b/samples/react-app-with-react-query/src/api/mutator/custom-instance.ts index e465e4244..702f4c325 100644 --- a/samples/react-app-with-react-query/src/api/mutator/custom-instance.ts +++ b/samples/react-app-with-react-query/src/api/mutator/custom-instance.ts @@ -1,10 +1,10 @@ import Axios, { AxiosRequestConfig } from 'axios'; -const instance = Axios.create({ baseURL: 'test' }); +export const AXIOS_INSTANCE = Axios.create({ baseURL: '' }); export const customInstance = (config: AxiosRequestConfig): Promise => { const source = Axios.CancelToken.source(); - const promise = instance({ ...config, cancelToken: source.token }).then( + const promise = AXIOS_INSTANCE({ ...config, cancelToken: source.token }).then( ({ data }) => data, ); diff --git a/samples/react-app-with-react-query/src/auth.context.tsx b/samples/react-app-with-react-query/src/auth.context.tsx index 38b955a0a..ee42d66c7 100644 --- a/samples/react-app-with-react-query/src/auth.context.tsx +++ b/samples/react-app-with-react-query/src/auth.context.tsx @@ -1,4 +1,3 @@ -import axios from 'axios'; import React, { createContext, ReactNode, @@ -6,6 +5,7 @@ import React, { useEffect, useState, } from 'react'; +import { AXIOS_INSTANCE } from './api/mutator/custom-instance'; type Dispatch = (Auth: string) => void; type AuthProviderProps = { children: ReactNode; initialState?: string | null }; @@ -18,26 +18,18 @@ const AuthProvider = ({ children, initialState = null }: AuthProviderProps) => { const [token, setToken] = useState(initialState); useEffect(() => { - const interceptorId = axios.interceptors.request.use( - (config) => { - return { - ...config, - baseURL: '', // use an env or your api url - headers: token - ? { - ...config.headers, - Authorization: `Bearer ${token}`, - } - : config.headers, - }; - }, - (error) => { - Promise.reject(error); - }, - ); + const interceptorId = AXIOS_INSTANCE.interceptors.request.use((config) => ({ + ...config, + headers: token + ? { + ...config.headers, + Authorization: `Bearer ${token}`, + } + : config.headers, + })); return () => { - axios.interceptors.request.eject(interceptorId); + AXIOS_INSTANCE.interceptors.request.eject(interceptorId); }; }, [token]); diff --git a/samples/react-app/orval.config.js b/samples/react-app/orval.config.js index 74889624b..73bfa6ac9 100644 --- a/samples/react-app/orval.config.js +++ b/samples/react-app/orval.config.js @@ -11,9 +11,12 @@ module.exports = { schemas: 'src/api/model', mock: true, override: { + mutator: { + path: 'src/api/mutator/custom-instance.ts', + name: 'customInstance', + }, operations: { listPets: { - mutator: 'src/api/mutator/response-type.ts', mock: { properties: () => { return { diff --git a/samples/react-app/src/App.tsx b/samples/react-app/src/App.tsx index 1e48281e1..2257f11ce 100644 --- a/samples/react-app/src/App.tsx +++ b/samples/react-app/src/App.tsx @@ -1,20 +1,32 @@ -import React from 'react'; -import { useQuery } from 'react-query'; +import React, { useEffect, useState } from 'react'; +import { Pets } from './api/model'; import { useApi } from './api/useApi'; import './App.css'; +import { useAuthDispatch } from './auth.context'; import logo from './logo.png'; function App() { - const { petstore } = useApi(); - const { data: pets } = useQuery('pets', () => petstore.listPets()); + const dispatch = useAuthDispatch(); + const { listPets } = useApi(); + const [pets, setPets] = useState([]); + + useEffect(() => { + dispatch('token'); + + setTimeout(() => { + listPets().then(setPets); + }, 1000); + }, []); return (
logo - {pets?.data.map((pet) => ( -

{pet.name}

- ))} + {!!pets.length ? ( + pets.map((pet) =>

{pet.name}

) + ) : ( +
...loading
+ )}
); diff --git a/samples/react-app/src/api/config.ts b/samples/react-app/src/api/config.ts deleted file mode 100644 index 7efb908ec..000000000 --- a/samples/react-app/src/api/config.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { AxiosRequestConfig, AxiosResponse } from 'axios'; -import { ApiMode } from './constants'; -import { getSwaggerPetstore } from './endpoints/petstoreFromFileSpecWithTransformer'; -import { getHTTPInstance } from './utilities'; - -export interface ApiParameters { - headers?: { [key: string]: string | undefined }; - baseUrl?: string; - interceptor?: { - request?: { - onFulfilled?: ( - value: AxiosRequestConfig, - ) => AxiosRequestConfig | Promise; - onRejected?: (error: any) => any; - }; - response?: { - onFulfilled?: ( - value: AxiosResponse, - ) => AxiosResponse | Promise; - onRejected?: (error: any) => any; - }; - }; - mode?: ApiMode; -} - -export const getApi = ({ - headers = {}, - interceptor, - baseUrl, -}: ApiParameters) => { - const instance = getHTTPInstance(baseUrl, headers, interceptor); - - return getSwaggerPetstore(instance); -}; diff --git a/samples/react-app/src/api/endpoints/petstoreFromFileSpecWithTransformer.ts b/samples/react-app/src/api/endpoints/petstoreFromFileSpecWithTransformer.ts index 4ec21ff02..8f94f35e4 100644 --- a/samples/react-app/src/api/endpoints/petstoreFromFileSpecWithTransformer.ts +++ b/samples/react-app/src/api/endpoints/petstoreFromFileSpecWithTransformer.ts @@ -4,20 +4,27 @@ * Swagger Petstore * OpenAPI spec version: 1.0.0 */ -import { AxiosInstance } from 'axios'; import { CreatePetsBody, ListPetsParams, Pet, Pets } from '../model'; -import listPetsMutator from './../../../src/api/mutator/response-type'; -export const getSwaggerPetstore = (axios: AxiosInstance) => ({ +import { customInstance } from '../mutator/custom-instance'; +export const getSwaggerPetstore = () => ({ listPets(params?: ListPetsParams, version: number = 1) { - return listPetsMutator( - { url: `/v${version}/pets`, method: 'get', params }, - axios, - ); + return customInstance({ + url: `/v${version}/pets`, + method: 'get', + params, + }); }, createPets(createPetsBody: CreatePetsBody, version: number = 1) { - return axios.post(`/v${version}/pets`, createPetsBody); + return customInstance({ + url: `/v${version}/pets`, + method: 'post', + data: createPetsBody, + }); }, showPetById(petId: string, version: number = 1) { - return axios.get(`/v${version}/pets/${petId}`); + return customInstance({ + url: `/v${version}/pets/${petId}`, + method: 'get', + }); }, }); diff --git a/samples/react-app/src/api/mutator/custom-instance.ts b/samples/react-app/src/api/mutator/custom-instance.ts new file mode 100644 index 000000000..a3e29298d --- /dev/null +++ b/samples/react-app/src/api/mutator/custom-instance.ts @@ -0,0 +1,9 @@ +import Axios, { AxiosRequestConfig } from 'axios'; + +export const AXIOS_INSTANCE = Axios.create({ baseURL: '' }); + +export const customInstance = (config: AxiosRequestConfig): Promise => { + return AXIOS_INSTANCE(config).then(({ data }) => data); +}; + +export default customInstance; diff --git a/samples/react-app/src/api/mutator/response-type.ts b/samples/react-app/src/api/mutator/response-type.ts deleted file mode 100644 index a490c8b8a..000000000 --- a/samples/react-app/src/api/mutator/response-type.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { AxiosInstance, AxiosRequestConfig } from 'axios'; - -export const getWithResponseType = ( - config: AxiosRequestConfig, - axios: AxiosInstance, -): Promise => { - return axios({ ...config, responseType: 'json' }).then(({ data }) => data); -}; - -export default getWithResponseType; diff --git a/samples/react-app/src/api/useApi.ts b/samples/react-app/src/api/useApi.ts index 2b22e5819..afad02292 100644 --- a/samples/react-app/src/api/useApi.ts +++ b/samples/react-app/src/api/useApi.ts @@ -1,38 +1,3 @@ -import { AxiosError } from 'axios'; -import { useMemo } from 'react'; -import { getApi } from './config'; -import { getAuthHeader } from './headers'; -import { createApiError } from './utilities'; +import { getSwaggerPetstore } from './endpoints/petstoreFromFileSpecWithTransformer'; -export const useApi = () => { - const token = 'xxxxxxxx'; // get your token - - const headers = useMemo( - () => ({ - ...getAuthHeader(token), - }), - [token], - ); - - const unauthorizedAndErrorInterceptor = useMemo( - () => ({ - response: { - onRejected(error: AxiosError): Promise | void { - //do your check - return Promise.reject(createApiError()); - }, - }, - }), - [], - ); - - return useMemo( - () => - getApi({ - headers, - interceptor: unauthorizedAndErrorInterceptor, - baseUrl: '', // use an env or your api url - }), - [headers, unauthorizedAndErrorInterceptor], - ); -}; +export const useApi = () => getSwaggerPetstore(); diff --git a/samples/react-app/src/auth.context.tsx b/samples/react-app/src/auth.context.tsx new file mode 100644 index 000000000..ee42d66c7 --- /dev/null +++ b/samples/react-app/src/auth.context.tsx @@ -0,0 +1,58 @@ +import React, { + createContext, + ReactNode, + useContext, + useEffect, + useState, +} from 'react'; +import { AXIOS_INSTANCE } from './api/mutator/custom-instance'; +type Dispatch = (Auth: string) => void; + +type AuthProviderProps = { children: ReactNode; initialState?: string | null }; + +const AuthContext = createContext(null); +const AuthDispatchContext = createContext(null); + +const AuthProvider = ({ children, initialState = null }: AuthProviderProps) => { + // it's a quick demo with useState but you can also have a more complexe state with a useReducer + const [token, setToken] = useState(initialState); + + useEffect(() => { + const interceptorId = AXIOS_INSTANCE.interceptors.request.use((config) => ({ + ...config, + headers: token + ? { + ...config.headers, + Authorization: `Bearer ${token}`, + } + : config.headers, + })); + + return () => { + AXIOS_INSTANCE.interceptors.request.eject(interceptorId); + }; + }, [token]); + + return ( + + + {children} + + + ); +}; + +const useAuth = (): string | null => { + return useContext(AuthContext); +}; + +const useAuthDispatch = (): Dispatch => { + const context = useContext(AuthDispatchContext); + + if (context === null) { + throw new Error('useAuthDispatch must be used within a AuthProvider'); + } + return context; +}; + +export { AuthProvider, useAuth, useAuthDispatch }; diff --git a/samples/react-app/src/index.tsx b/samples/react-app/src/index.tsx index eb203279b..cefd9ecf5 100644 --- a/samples/react-app/src/index.tsx +++ b/samples/react-app/src/index.tsx @@ -1,6 +1,7 @@ import React from 'react'; import ReactDOM from 'react-dom'; import App from './App'; +import { AuthProvider } from './auth.context'; import './index.css'; import * as serviceWorker from './serviceWorker'; @@ -10,7 +11,9 @@ if (process.env.NODE_ENV === 'development') { ReactDOM.render( - + + + , document.getElementById('root'), ); diff --git a/src/core/generators/angular.ts b/src/core/generators/angular.ts index d1e7e58c9..73e22c995 100644 --- a/src/core/generators/angular.ts +++ b/src/core/generators/angular.ts @@ -4,38 +4,27 @@ import { GeneratorVerbOptions, } from '../../types/generator'; import { pascal } from '../../utils/case'; -import { toObjectString } from '../../utils/string'; +import { sanitize, toObjectString } from '../../utils/string'; import { generateFormData } from './formData'; import { generateAxiosConfig, generateOptions } from './options'; -export const generateAngularImports = () => ({ - implementation: `import { HttpClient } from '@angular/common/http'; - import { Injectable } from '@angular/core'; - import { Observable } from 'rxjs';\n`, -}); +export const generateAngularImports = () => `import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs';\n`; export const generateAngularTitle = (title: string) => { - return { - implementation: `${pascal(title)}Service`, - }; + const sanTitle = sanitize(title); + return `${pascal(sanTitle)}Service`; }; -export const generateAngularHeader = (titles: { implementation: string }) => { - return { - implementation: ` - @Injectable() - export class ${titles.implementation} { - constructor( - private http: HttpClient, - ) {}`, - }; -}; +export const generateAngularHeader = (title: string) => ` +@Injectable() +export class ${title} { + constructor( + private http: HttpClient, + ) {}`; -export const generateAngularFooter = () => { - return { - implementation: '};\n', - }; -}; +export const generateAngularFooter = () => '};\n'; const generateImports = ({ response, diff --git a/src/core/generators/api.ts b/src/core/generators/api.ts index 82f34044a..a6c7139a2 100644 --- a/src/core/generators/api.ts +++ b/src/core/generators/api.ts @@ -1,5 +1,5 @@ import { OpenAPIObject, PathItemObject } from 'openapi3-ts'; -import { OutputClient, OverrideOutput } from '../../types'; +import { OutputOptions } from '../../types'; import { GeneratorApiResponse, GeneratorSchema } from '../../types/generator'; import { getRoute } from '../getters/route'; import { generateClient } from './client'; @@ -8,8 +8,7 @@ import { generateVerbsOptions } from './verbsOptions'; export const generateApi = ( workspace: string, specs: OpenAPIObject, - override?: OverrideOutput, - httpClient?: OutputClient, + options?: OutputOptions, ) => { return Object.entries(specs.paths).reduce( (acc, [pathRoute, verbs]: [string, PathItemObject]) => { @@ -18,7 +17,7 @@ export const generateApi = ( const verbsOptions = generateVerbsOptions({ workspace, verbs, - override, + options, route, components: specs.components, }); @@ -33,11 +32,11 @@ export const generateApi = ( [], ); - const client = generateClient(httpClient, verbsOptions, { + const client = generateClient(options?.client, verbsOptions, { route, pathRoute, specs, - override, + override: options?.override, }); return { diff --git a/src/core/generators/axios.ts b/src/core/generators/axios.ts index e852f8ab4..cfee01be3 100644 --- a/src/core/generators/axios.ts +++ b/src/core/generators/axios.ts @@ -8,11 +8,8 @@ import { sanitize, toObjectString } from '../../utils/string'; import { generateFormData } from './formData'; import { generateAxiosConfig, generateOptions } from './options'; -export const generateAxiosImports = (isMutator: boolean) => ({ - implementation: !isMutator - ? `import axios,{ AxiosPromise, AxiosInstance } from 'axios';\n` - : '', -}); +export const generateAxiosImports = (isMutator: boolean) => + !isMutator ? `import axios from 'axios';\n` : ''; const generateAxiosImplementation = ( { @@ -48,7 +45,7 @@ const generateAxiosImplementation = ( )}\n ) {${generateFormData(body)} return ${ mutator - ? `${mutator.name}<${response.definition}>(${axiosConfig}, axios)` + ? `${mutator.name}<${response.definition}>(${axiosConfig})` : `axios.${verb}<${response.definition}>(${options})` }; }, @@ -67,22 +64,13 @@ const generateImports = ({ export const generateAxiosTitle = (title: string) => { const sanTitle = sanitize(title); - return { - implementation: `get${pascal(sanTitle)}`, - }; + return `get${pascal(sanTitle)}`; }; -export const generateAxiosHeader = (titles: { implementation: string }) => { - return { - implementation: `export const ${titles.implementation} = (axios: AxiosInstance) => ({\n`, - }; -}; +export const generateAxiosHeader = (title: string) => + `export const ${title} = () => ({\n`; -export const generateAxiosFooter = () => { - return { - implementation: '});\n', - }; -}; +export const generateAxiosFooter = () => '});\n'; export const generateAxios = ( verbOptions: GeneratorVerbOptions, diff --git a/src/core/generators/client.ts b/src/core/generators/client.ts index 45ff340ab..453426949 100644 --- a/src/core/generators/client.ts +++ b/src/core/generators/client.ts @@ -62,7 +62,7 @@ export const generateClientImports = ({ override, }: OutputOptions = {}): GeneratorClientExtra => { return { - ...GENERATOR_CLIENT[client].imports(!!override?.mutator), + implementation: GENERATOR_CLIENT[client].imports(!!override?.mutator), implementationMSW: `import { rest } from 'msw' import faker from 'faker'\n`, }; @@ -75,7 +75,9 @@ export const generateClientHeader = ( ): GeneratorClientExtra => { const titles = generateClientTitle(outputClient, title, customTitleFunc); return { - ...GENERATOR_CLIENT[outputClient].header(titles), + implementation: GENERATOR_CLIENT[outputClient].header( + titles.implementation, + ), implementationMSW: `export const ${titles.implementationMSW} = () => [\n`, }; }; @@ -84,7 +86,7 @@ export const generateClientFooter = ( outputClient: OutputClient = DEFAULT_CLIENT, ): GeneratorClientExtra => { return { - ...GENERATOR_CLIENT[outputClient].footer(), + implementation: GENERATOR_CLIENT[outputClient].footer(), implementationMSW: `]\n`, }; }; @@ -97,12 +99,12 @@ export const generateClientTitle = ( if (customTitleFunc) { const customTitle = customTitleFunc(title); return { - ...GENERATOR_CLIENT[outputClient].title(customTitleFunc(title)), + implementation: GENERATOR_CLIENT[outputClient].title(customTitle), implementationMSW: `get${pascal(customTitle)}MSW`, }; } return { - ...GENERATOR_CLIENT[outputClient].title(title), + implementation: GENERATOR_CLIENT[outputClient].title(title), implementationMSW: `get${pascal(title)}MSW`, }; }; diff --git a/src/core/generators/imports.ts b/src/core/generators/imports.ts index df48bca2a..8e004c72f 100644 --- a/src/core/generators/imports.ts +++ b/src/core/generators/imports.ts @@ -34,7 +34,7 @@ export const generateMutatorImports = ( ? mutator.name : `{ ${mutator.name} }`; - return `import ${importDefault} from '${oneMore ? './.' : ''}${ + return `import ${importDefault} from '${oneMore ? '../' : ''}${ mutator.path }'`; }) diff --git a/src/core/generators/mutator.ts b/src/core/generators/mutator.ts index 87b95e765..7ddda54cd 100644 --- a/src/core/generators/mutator.ts +++ b/src/core/generators/mutator.ts @@ -4,31 +4,30 @@ import { getFileInfo } from '../../utils/file'; import { isString } from '../../utils/is'; import { resolvePath } from '../resolvers/path'; -const getImport = (workspace: string, mutator: Mutator) => { +const getImport = (output: string, mutator: Mutator) => { const { pathWithoutExtension } = getFileInfo( - resolvePath(workspace, isString(mutator) ? mutator : mutator.path), + resolvePath(output, isString(mutator) ? mutator : mutator.path), ); - return pathWithoutExtension; }; export const generateMutator = ({ - workspace, + output, body, mutator, name, }: { - workspace: string; + output?: string; body: GetterBody; mutator?: Mutator; name: string; }) => { - if (!mutator) { + if (!mutator || !output) { return; } const isDefault = isString(mutator) ? true : mutator.default || false; const importName = isString(mutator) ? `${name}Mutator` : mutator.name; - const path = getImport(workspace, mutator); + const path = getImport(output, mutator); return { name: importName, path, default: isDefault }; }; diff --git a/src/core/generators/react-query.ts b/src/core/generators/react-query.ts index f6af77f4f..494b7209d 100644 --- a/src/core/generators/react-query.ts +++ b/src/core/generators/react-query.ts @@ -6,13 +6,10 @@ import { toObjectString } from '../../utils/string'; import { generateFormData } from './formData'; import { generateAxiosConfig, generateOptions } from './options'; -export const generateReactQueryImports = (isMutator: boolean) => ({ - implementation: `${ - !isMutator - ? `import axios, { AxiosRequestConfig, AxiosResponse, AxiosError, AxiosPromise } from 'axios';\n` - : '' - }import { useQuery, useMutation, QueryConfig, MutationConfig } from 'react-query';\n`, -}); +export const generateReactQueryImports = (isMutator: boolean) => + `${ + !isMutator ? `import axios from 'axios';\n` : '' + }import { useQuery, useMutation, QueryConfig, MutationConfig } from 'react-query';\n`; const generateAxiosFunction = ( { @@ -122,25 +119,13 @@ const generateImports = ({ ...(queryParams ? [queryParams.schema.name] : []), ]; -export const generateReactQueryTitle = () => { - return { - implementation: ``, - }; -}; +export const generateReactQueryTitle = () => ''; -export const generateReactQueryHeader = () => { - return { - implementation: `type AsyncReturnType< - T extends (...args: any) => Promise - > = T extends (...args: any) => Promise ? R : any;\n\n`, - }; -}; +export const generateReactQueryHeader = () => `type AsyncReturnType< +T extends (...args: any) => Promise +> = T extends (...args: any) => Promise ? R : any;\n\n`; -export const generateReactQueryFooter = () => { - return { - implementation: '', - }; -}; +export const generateReactQueryFooter = () => ''; export const generateReactQuery = ( verbOptions: GeneratorVerbOptions, diff --git a/src/core/generators/verbsOptions.ts b/src/core/generators/verbsOptions.ts index e402c55da..41eb2bfb8 100644 --- a/src/core/generators/verbsOptions.ts +++ b/src/core/generators/verbsOptions.ts @@ -5,7 +5,7 @@ import { PathItemObject, ReferenceObject, } from 'openapi3-ts'; -import { OverrideOutput, Verbs } from '../../types'; +import { OutputOptions, Verbs } from '../../types'; import { GeneratorVerbOptions, GeneratorVerbsOptions, @@ -23,7 +23,7 @@ import { generateMutator } from './mutator'; const generateVerbOptions = ({ workspace, verb, - override, + options = {}, operation, route, verbParameters = [], @@ -31,7 +31,7 @@ const generateVerbOptions = ({ }: { workspace: string; verb: string; - override?: OverrideOutput; + options?: OutputOptions; operation: OperationObject; route: string; verbParameters?: Array; @@ -44,6 +44,7 @@ const generateVerbOptions = ({ parameters: operationParameters, tags = [], } = operation; + const { override, target } = options; const overrideOperation = override?.operations?.[operation.operationId!]; const definitionName = camel(operation.operationId!); @@ -68,7 +69,7 @@ const generateVerbOptions = ({ const props = getProps({ body, queryParams: queryParams?.schema, params }); const mutator = generateMutator({ - workspace, + output: target, body, mutator: overrideOperation?.mutator || override?.mutator, name: camel(operationId!), @@ -101,13 +102,13 @@ const generateVerbOptions = ({ export const generateVerbsOptions = ({ workspace, verbs, - override, + options, route, components, }: { workspace: string; verbs: PathItemObject; - override?: OverrideOutput; + options?: OutputOptions; route: string; components?: ComponentsObject; }): GeneratorVerbsOptions => @@ -122,17 +123,17 @@ export const generateVerbsOptions = ({ `Every path must have a operationId - No operationId set for ${verb} ${route}`, ); } - const options = generateVerbOptions({ + const verbOptions = generateVerbOptions({ workspace, verb, - override, + options, verbParameters: verbs.parameters, route, components, operation, }); - return [...acc, options]; + return [...acc, verbOptions]; }, [], ); diff --git a/src/core/importers/openApi.ts b/src/core/importers/openApi.ts index 8c813725e..031e87e59 100644 --- a/src/core/importers/openApi.ts +++ b/src/core/importers/openApi.ts @@ -76,7 +76,7 @@ export const importOpenApi = async ({ specs.components?.responses, ); - const api = generateApi(workspace, specs, output?.override, output?.client); + const api = generateApi(workspace, specs, output); const schemas = [...schemaDefinition, ...responseDefinition, ...api.schemas]; diff --git a/src/core/resolvers/path.ts b/src/core/resolvers/path.ts index f0863d9f2..d7efdefc4 100644 --- a/src/core/resolvers/path.ts +++ b/src/core/resolvers/path.ts @@ -21,7 +21,7 @@ export const resolvePath = (base: string, to: string) => { } if (toSegmentize.length - index === 1) { - return `./${acc}/${path}`; + return `${acc}/${path}`; } return `../${acc}/${path}`; diff --git a/src/core/writers/splitTagsMode.ts b/src/core/writers/splitTagsMode.ts index a579a9d4f..b2d564560 100644 --- a/src/core/writers/splitTagsMode.ts +++ b/src/core/writers/splitTagsMode.ts @@ -27,7 +27,7 @@ export const writeSplitTagsMode = ({ mkdirSync(dirname); } - const target = generateTargetForTags(operations, info, output); + const target = generateTargetForTags(operations, output); Object.entries(target).forEach(([tag, target]) => { const { diff --git a/src/core/writers/tagsMode.ts b/src/core/writers/tagsMode.ts index 67f2e27b1..acc37dae6 100644 --- a/src/core/writers/tagsMode.ts +++ b/src/core/writers/tagsMode.ts @@ -28,7 +28,7 @@ export const writeTagsMode = ({ mkdirSync(dirname); } - const target = generateTargetForTags(operations, info, output); + const target = generateTargetForTags(operations, output); Object.entries(target).forEach(([tag, target]) => { const { diff --git a/src/core/writers/targetTags.ts b/src/core/writers/targetTags.ts index fa2329f64..8bea153b0 100644 --- a/src/core/writers/targetTags.ts +++ b/src/core/writers/targetTags.ts @@ -1,4 +1,3 @@ -import { InfoObject } from 'openapi3-ts'; import { OutputOptions } from '../../types'; import { GeneratorOperation, @@ -62,7 +61,6 @@ const generateTargetTags = ( export const generateTargetForTags = ( operations: GeneratorOperations, - info: InfoObject, options?: OutputOptions, ) => Object.values(operations)