Type: String
.
Valid values: path to the file which will contains the implementation.
module.exports = {petstore: {output: {target: 'src/petstore.ts',},},};
Type: String | Function
.
Valid values: axios
, axios-functions
, angular
, react-query
, svelte-query
, vue-query
.
Default Value: axios
.
module.exports = {petstore: {output: {client: 'react-query',},},};
if you want you can provide a function to extend or create you custom client generator and this function receive a GeneratorClients in argument and should return a ClientGeneratorsBuilder.
Type: String
.
Valid values: path to the folder where you want to generate all your models.
Default Value: same as the target.
module.exports = {petstore: {output: {schemas: './api/model',},},};
Type: String
.
Valid values: path to the folder which will contains all the generated files. This value will be use as a base for all the other path used in the orval config.
If you provide this option, an index.ts
file will be also created with all the available exports
module.exports = {petstore: {output: {workspace: 'src/'target: './petstore.ts',},},};
Type: String
.
Valid values: single
, split
, tags
, tags-split
.
Default Value: single
.
module.exports = {petstore: {output: {mode: 'tags-split',},},};
Use to have one file with everything
module.exports = {petstore: {output: {target: 'src/petstore.ts',},},};
my-app└── src└── api└── endpoints└── petstore.ts
Here a single file petstore will be created in src with your specification implementation.
Use to have definition, implementation, schemas, mock in differents files
module.exports = {petstore: {output: {target: 'src/petstore.ts',mode: 'split',},},};
my-app└── src├── petstore.definition.ts├── petstore.schemas.ts├── petstore.msw.ts└── petstore.ts
Here depending on the configuration, you will have multiple files named petstore with a prefix created in src.
For Angular:
petstore.ts is petstore.service.ts
Use this mode if you want one file by tag. Tag is a reference of the OpenApi specification tag. If you have a pets
tag for all your pet calls then Orval will generate a file pets.ts in the target folder
module.exports = {petstore: {output: {target: 'src/petstore.ts',mode: 'tags',},},};
my-app└── src├── pets.ts└── petstore.schemas.ts
For Angular:
petstore.ts is petstore.service.ts
If you don't use the schemas
property only one file will be created with all the models for every tag.
This mode is a combination of the tags and split mode. Orval will generate a folder for every tag in the target folder and split into multiple files in those folders.
module.exports = {petstore: {output: {target: 'src/petstore.ts',mode: 'tags-split',},},};
my-app└── src├── petstore.schemas.ts└── pets├── petstore.ts├── petstore.definition.ts├── petstore.msw.ts└── petstore.ts
Same as the tags mode if you don't use the schemas
property only one file will be created with all the models for every tag.
Type: String
or Function
.
Valid values: path or implementation of the function.
module.exports = {output: {override: {title: (title) => `${title}Api`,},},};
Type: Boolean | Function
.
Default Value: false
.
Will generate your mock using faker and msw
module.exports = {petstore: {output: {mock: true,},},};
If you want you can provide a function to extend or create you custom mock generator and check here the type
Type: Boolean | String[]
.
Default Value: false
.
Can be used to clean generated files. Provide an array of glob if you want to customize what is deleted.
Be carefull clean all output target and schemas folder.
Type: Boolean
.
Default Value: false
.
Can be used to prettier generated files. You need to have prettier in your dependencies.
Type: Object
.
Give you the possibility to override the output like your mock implementation or transform the API implementation like you want
Type: String
or Function
.
Valid values: path or implementation of the transformer function.
This function is executed for each call when you generate and take in argument a VerbOptions and shouled return a VerbOptions
module.exports = {petstore: {output: {override: {transformer: 'src/yourfunction.js',},},},};
Type: String
or Object
.
Valid values: path of the mutator function or object with a path and name.
If you provide an object you can also add a default property to use an export default function.
This function is executed for each call when this one is executed. It takes all the options passed to the verb as an argument and should return a promise with your custom implementation or preferred HTTP client.
Possible arguments:
// based on AxiosRequestConfiginterface RequestConfig {method: 'get' | 'put' | 'patch' | 'post' | 'delete';url: string;params?: any;data?: any;responseType?: string;}
Example:
module.exports = {petstore: {output: {override: {mutator: {path: './api/mutator/custom-instance.ts',name: 'customInstance',// default: true},},},},};
// custom-instance.tsimport Axios, { AxiosRequestConfig } from 'axios';export const AXIOS_INSTANCE = Axios.create({ baseURL: '' });export const customInstance = <T>(config: AxiosRequestConfig): Promise<T> => {const source = Axios.CancelToken.source();const promise = AXIOS_INSTANCE({ ...config, cancelToken: source.token }).then(({ data }) => data,);// @ts-ignorepromise.cancel = () => {source.cancel('Query was cancelled by React Query');};return promise;};
Example:
// custom-instance.tsimport Axios, { AxiosRequestConfig } from 'axios';import config from '@config';export const AXIOS_INSTANCE = Axios.create({ baseURL: '', ...config });export const customInstance = <T>(config: AxiosRequestConfig): Promise<T> => {const source = Axios.CancelToken.source();const promise = AXIOS_INSTANCE({ ...config, cancelToken: source.token }).then(({ data }) => data,);// @ts-ignorepromise.cancel = () => {source.cancel('Query was cancelled by React Query');};return promise;};
module.exports = {petstore: {output: {override: {mutator: {path: './api/mutator/custom-instance.ts',name: 'customInstance',alias: {'@config': path.resolve(_dirname, './src/config'),},},},},},};
react-query
, vue-query
and svelte-query
. You can also provide a hook like thisExample:
module.exports = {petstore: {output: {override: {mutator: {path: './api/mutator/use-custom-instance.ts',name: 'useCustomInstance',// default: true},},},},};
// use-custom-instance.tsimport Axios, { AxiosRequestConfig } from 'axios';import { useQueryClient } from 'react-query';export const AXIOS_INSTANCE = Axios.create({ baseURL: '' });export const useCustomInstance = <T>(): ((config: AxiosRequestConfig,) => Promise<T>) => {const token = useToken(); // Do what you wantreturn (config: AxiosRequestConfig) => {const source = Axios.CancelToken.source();const promise = AXIOS_INSTANCE({...config,headers: {Authorization: `Bearer ${token}`}cancelToken: source.token,}).then(({ data }) => data);// @ts-ignorepromise.cancel = () => {source.cancel('Query was cancelled by React Query');};return promise;};};export default useCustomInstance;
Type: Boolean | Function
.
Default Value: true
.
Use this property to disable the auto generation of the file header
You can provide a function to customize the way you want the generate the file header. You will receive the info object of the specification in argument and you should return an array of string.
module.exports = {petstore: {output: {override: {header: (info: InfoObject): String[] => [`Generated by orval 🍺`,`Do not edit manually.`,...(title ? [title] : []),...(description ? [description] : []),...(version ? [`OpenAPI spec version: ${version}`] : []),],},},},};
Type: Object
.
Give you the possibility to override the generated query
module.exports = {petstore: {output: {...override: {query: {useQuery: true,useInfinite: true,useInfiniteQueryParam: 'nextId',options: {staleTime: 10000,},},},},...},};
Type: Boolean
.
Use to generate a useQuery custom hook. If the query key isn't provided that's the default hook generated.
Type: Boolean
.
Use to generate a useInfiniteQuery custom hook.
Type: String
.
Use to automatically add to the request the query param provided by the useInfiniteQuery when you use getFetchMore
function.
Type: Object
.
Use to override the query config. Check available options here
Type: Object
.
Give you specific options for the angular client
module.exports = {petstore: {output: {...override: {angular: {provideInRoot: false,},},},...},};
Type: Boolean
.
Default Value: true
.
Use to remove the provide in root in the generated angular services
Type: Object
.
Give you the possibility to override the generated mock
Type: Object
or Function
.
You can use this to override the generated mock per property. Properties can take a function who take the specification in argument and should return un object or directly the object. Each key of this object can be a regex or directly the name of the property to override and the value can be a function which return the wanted value or directly the value. If you use a function this will be executed at runtime.
module.exports = {petstore: {output: {override: {mock: {properties: {'/tag|name/': 'jon',email: () => faker.internet.email(),},},},},},};
Type: Object
.
Give you the possibility to put a value for a format
. In your specification, if you put a format: email
to a property Orval will automatically generate a random email for you. See here the default available format.
module.exports = {petstore: {output: {override: {mock: {format: {email: () => faker.internet.email(),iban: () => faker.finance.iban(),},},},},},};
Type: Boolean
.
Give you the possibility to set every property required.
Type: String
.
Give you the possibility to set base url to your mock handlers.
Type: Object
.
Give you the possibility to override the models
module.exports = {petstore: {output: {override: {components: {schemas: {suffix: 'DTO',},responses: {suffix: 'Response',},parameters: {suffix: 'Params',},requestBodies: {suffix: 'Bodies',},},},},},};
Type: Object
.
Give you the possibility to override the generated mock by operationId.
Each key of the object should be an operationId and take as value an object.
The value object can take the same properties as the override property (mutator,query,transformer,mock).
The mock options have one more possibility the data property. Which can take a function or the value directly. The function will be executed at runtime.
module.exports = {petstore: {output: {override: {operations: {listPets: {transformer: 'src/yourfunction.js',mutator: 'src/response-type.js',mock: {properties: () => {return {id: () => faker.random.number({ min: 1, max: 99999 }),};},},},showPetById: {mock: {data: () => ({id: faker.random.number({ min: 1, max: 99 }),name: faker.name.firstName(),tag: faker.helpers.randomize([faker.random.word(), undefined]),}),},},},},},},};
Type: Object
.
Exactly the same as the override.operations
but this time you can do it by tags
Type: Function
.
// type signature(operation: OperationObject, route: string, verb: Verbs) => string;
Function to override the generate operation name.
Type: Object | Boolean
.
Use this property to provide a config to your http client or completly remove the request options property from the generated files.
Type: Boolean
or String
or Object
.
Valid values: path of the formData function or object with a path and name.
Use this property to disable the auto generation of form data if you use multipart
If you provide an object you can also add a default property to use an export default function.
Example:
module.exports = {petstore: {output: {override: {formData: {path: './api/mutator/custom-form-data-fn.ts',name: 'customFormDataFn',// default: true},},},},};
// type signatureexport const customFormDataFn = <Body>(body: Body): FormData => {// do your implementation to transform it to FormDatareturn FormData;};
Type: Boolean
or String
or Object
.
Valid values: path of the formUrlEncoded function or object with a path and name.
Use this property to disable the auto generation of form url encoded
If you provide an object you can also add a default property to use an export default function.
Example:
module.exports = {petstore: {output: {override: {formUrlEncoded: {path: './api/mutator/custom-form-url-encoded-fn.ts',name: 'customFormUrlEncodedFn',// default: true},},},},};
// type signatureexport const customFormUrlEncodedFn = <Body>(body: Body): URLSearchParams => {// do your implementation to transform it to FormDatareturn URLSearchParams;};