Init.

Install Kubb Dependencies

>_ Terminal

yarn add -D @kubb/cli @kubb/core @kubb/plugin-oas @kubb/plugin-client @kubb/plugin-ts

Create Axios Client

Adjustment need to be made in this file.

>_ Terminal

echo "" > .\src\lib\axios-instance.ts

axios-instance.ts

import type { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'
import axios from 'axios'

import env from '@/utils/env'

/**
 * Subset of AxiosRequestConfig
 */
export type RequestConfig<TData = unknown> = {
	url?: string
	method: any
	params?: unknown
	data?: TData
	responseType?:
		| 'arraybuffer'
		| 'blob'
		| 'document'
		| 'json'
		| 'text'
		| 'stream'
	signal?: AbortSignal
	headers?: AxiosRequestConfig['headers']
}
/**
 * Subset of AxiosResponse
 */
export type ResponseConfig<TData = unknown> = {
	data: TData
	status: number
	statusText: string
	headers?: AxiosResponse['headers']
}

export type ResponseErrorConfig<TError = unknown> = AxiosError<TError>

export const axiosInstance = axios.create({
	baseURL: env.API_URL,
})

export const axiosClient = async <
	TData,
	TError = unknown,
	TVariables = unknown,
>(
	config: RequestConfig<TVariables>
): Promise<ResponseConfig<TData>> => {
	const accessToken = await getYourAccessToken()

	return axiosInstance
		.request<TVariables, ResponseConfig<TData>>({
			...config,
			headers: {
				Authorization: `Bearer ${accessToken}`,
			},
		})
		.catch((e: AxiosError<TError>) => {
			throw e
		})
}

export default axiosClient

Create Kubb Config

Note that you need to have the swagger file locally.

>_ Terminal

echo "" > kubb.config.ts

kubb.config.ts

import { rmSync, writeFileSync } from 'node:fs'

import { defineConfig } from '@kubb/core'
import { pluginClient } from '@kubb/plugin-client'
import { pluginOas } from '@kubb/plugin-oas'
import { pluginTs } from '@kubb/plugin-ts'
import axios from 'axios'

const downloadSwagger = async () => {
  const { data } = await axios.get('YOUR_SWAGGER_URL')
  rmSync('swagger.json', { force: true })
  writeFileSync('swagger.json', JSON.stringify(data))
}

const main = async () => {
  await downloadSwagger()

  const config = defineConfig({
    root: '.',
    input: {
      path: './swagger.json',
    },
    output: {
      path: './src/services',
      clean: true,
    },
    plugins: [
      pluginOas({
        validate: true,
      }),
      pluginTs(),
      pluginClient({
        client: 'axios',
        importPath: 'YOUR_GOOD_IMPORT_PATH',
      }),
    ],
  })

  return config
}

export default main

Create Kubb Command

Add a script into you package.json file.

package.json

"scripts": {
    ...
    "gen": "kubb generate && eslint --fix . && prettier --write .",
    "gen-nolint": "kubb kubb generate"
  },

Generate with Kubb

>_ Terminal

yarn run gen