Axios-інстанс
Згенеровані сервіси приймають axios-інстанс аргументом, а коли його не передано – беруть інстанс за замовчуванням:
export const getAgentService = (axiosInstance: AxiosInstance = axios) => { ... }Пакет самодостатній: жодних аліасів на боці застосунку не потрібно.
Свій інстанс
Для перехоплювачів, заголовків чи власного baseURL є два шляхи.
На місці виклику – коли інстанс потрібен лише тут:
import { getAgentService } from '@webitel/api-services/gen-wire';
getAgentService(myInstance).searchAgent(params);На весь застосунок – один раз у бутстрапі, до першого запиту:
// main.ts
import { setDefaultAxiosInstance } from '@webitel/api-services/api/axios';
import { instance } from './app/api/instance';
setDefaultAxiosInstance(instance);Явно переданий інстанс завжди має пріоритет над встановленим через сеттер.
Інстанс за замовчуванням
Якщо сеттер не викликали, пакет створить інстанс сам – через getDefaultInstance(): baseURL з VITE_API_URL, заголовок X-Webitel-Access, перехоплювачі оновлення токена та обробки 401, серіалізація масивів у qs як repeat.
Створення ліниве: воно відбувається на першому зверненні, а не на імпорті згенерованого модуля. Тому імпорт сервісів у node (тести, msw) не чіпає localStorage, а сеттер спрацьовує навіть після того, як згенеровані модулі вже імпортовані.
getDefaultAxiosInstance() повертає той самий інстанс, яким користуються згенеровані сервіси:
import { getDefaultAxiosInstance } from '@webitel/api-services/api/axios';
// той самий об'єкт, що й у згенерованих сервісів
export const instance = getDefaultAxiosInstance();Це не те саме, що getDefaultInstance() – фабрика, яка на кожен виклик робить новий axios.create(). Якщо застосунок бере інстанс звідти і нічого не встановлює сеттером, у застосунку буде два різні інстанси: свій і той, що ліниво створять згенеровані сервіси. Працюватиме, але instance.interceptors.use(…), доданий пізніше, до згенерованих викликів не дійде.
Міграція застосунку
Раніше згенеровані сервіси імпортували інстанс зі спеціального імені @aliasedDeps/api-services/axios, яке саме по собі не резолвилось – кожен застосунок мусив оголосити для нього аліас у vite.config.ts, інакше пакет не збирався. Тепер цього не потрібно:
- прибрати аліас
@aliasedDeps/api-services/axiosзvite.config.ts(а також зvitest.config.tsі моків, якщо він там є); - якщо застосунок будує власний інстанс – додати
setDefaultAxiosInstance(instance)у точці входу; - якщо інстанс був лише копією
getDefaultInstance()– достатньо віддаватиgetDefaultAxiosInstance(), сеттер не потрібен.
Тести
Мок можна поставити тим самим сеттером:
setDefaultAxiosInstance(mockInstance);Якщо ж тестове оточення вже підміняє сам пакет axios – наприклад vi.doMock('axios', …) – цього достатньо: підміна ловить axios.create() всередині generateInstance, яким би шляхом до нього не дійшли.