@space-ai/contracts 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,13 +2,13 @@
2
2
 
3
3
  npm-пакет с TypeScript-типами и функциями HTTP-запросов к API.
4
4
 
5
- Axios устанавливается автоматически как зависимость пакета. Базовый URL API задаётся через глобальную переменную `window.BASE_API_URL`.
5
+ Axios устанавливается автоматически как зависимость пакета. Базовый URL API задаётся через `BASE_API_URL` на глобальном объекте: **`window`** (браузер) или **`global`** / `globalThis` (Node.js, тесты).
6
6
 
7
7
  ## Содержание
8
8
 
9
9
  - [Установка](#установка)
10
10
  - [Быстрый старт](#быстрый-старт)
11
- - [window.BASE_API_URL](#windowbase_api_url)
11
+ - [BASE_API_URL (window / global)](#base_api_url-window--global)
12
12
  - [Способы инициализации](#способы-инициализации)
13
13
  - [Использование API-функций](#использование-api-функций)
14
14
  - [TypeScript](#typescript)
@@ -29,10 +29,14 @@ npm install @space-ai/contracts
29
29
 
30
30
  ## Быстрый старт
31
31
 
32
- **1.** Задайте базовый URL API на `window`:
32
+ **1.** Задайте базовый URL API:
33
33
 
34
34
  ```typescript
35
+ // браузер
35
36
  window.BASE_API_URL = 'https://api.example.com';
37
+
38
+ // Node.js / тесты
39
+ global.BASE_API_URL = 'http://localhost:3000';
36
40
  ```
37
41
 
38
42
  **2.** Подключите автоинициализацию axios (один раз в точке входа):
@@ -49,23 +53,101 @@ import { getUser } from '@space-ai/contracts';
49
53
  const user = await getUser(1);
50
54
  ```
51
55
 
52
- Axios создаётся с `baseURL: window.BASE_API_URL`, сохраняется в `window.axios` и используется всеми API-функциями.
56
+ Axios создаётся с `baseURL: BASE_API_URL`, сохраняется в `window.axios` / `global.axios` и используется всеми API-функциями.
53
57
 
54
58
  ---
55
59
 
56
- ## window.BASE_API_URL
60
+ ## BASE_API_URL (window / global)
61
+
62
+ Пакет читает и пишет одни и те же поля на `globalThis` — в браузере это `window`, в Node.js — `global`.
57
63
 
58
64
  | Свойство | Тип | Описание |
59
65
  |----------|-----|----------|
60
- | `window.BASE_API_URL` | `string` | Базовый URL API → передаётся в `axios.create({ baseURL })` |
61
- | `window.axios` | `AxiosInstance` | Экземпляр axios (создаётся пакетом, можно использовать напрямую) |
66
+ | `BASE_API_URL` | `string` | Базовый URL API → `axios.create({ baseURL })` |
67
+ | `API_PREFIX` | `string` | Опциональный префикс (`api` `{BASE_API_URL}/api`) |
68
+ | `axios` | `AxiosInstance` | Экземпляр axios (создаётся пакетом) |
69
+ | `CONTRACTS_AUTH` | `AuthProvider` | Провайдер токена (альтернатива `configureAuth`) |
70
+
71
+ Примеры:
72
+
73
+ ```typescript
74
+ // браузер
75
+ window.BASE_API_URL = '/api';
76
+
77
+ // Node.js, Vitest, Jest
78
+ global.BASE_API_URL = 'http://localhost:3000';
79
+ ```
80
+
81
+ ---
82
+
83
+ ## Инициализация axios и авторизация
84
+
85
+ Пакет создаёт axios как на фронтенде:
86
+
87
+ - `baseURL` из `BASE_API_URL` + опциональный `API_PREFIX`
88
+ - заголовки `Content-Type` / `Accept: application/json`
89
+ - **request interceptor** — подставляет `Authorization: Bearer <token>`
90
+ - **response interceptor** — проверка статуса и проброс ошибок
91
+
92
+ ### Провайдер токена
93
+
94
+ Keycloak, Zustand и прочее остаются в приложении. Пакет не знает про них — вы передаёте `AuthProvider`:
95
+
96
+ ```typescript
97
+ import { configureAuth, setupApiClient } from '@space-ai/contracts';
98
+ import { getAccessToken, updateToken } from '@/api/keycloak';
99
+ import { dispatchLogout, useAuth } from '@/stores/auth';
100
+
101
+ configureAuth({
102
+ getAccessToken: () => getAccessToken() ?? useAuth.getState().token ?? null,
103
+ updateToken: (minValiditySeconds = 30) => updateToken(minValiditySeconds),
104
+ onSessionExpired: () => dispatchLogout(),
105
+ });
106
+
107
+ window.BASE_API_URL = import.meta.env.VITE_API_URL;
108
+ window.API_PREFIX = 'api'; // опционально
62
109
 
63
- Примеры значений:
110
+ setupApiClient();
111
+ ```
112
+
113
+ Логика interceptor (как в `src/api/axios.ts` на фронте):
114
+
115
+ 1. `getAccessToken()` — если токена нет, запрос уходит без `Authorization`
116
+ 2. `updateToken(30)` — обновление перед запросом; при ошибке → `onSessionExpired()` и `Session expired`
117
+ 3. повторный `getAccessToken()` — свежий токен в заголовок
118
+
119
+ ### Альтернатива — `global.CONTRACTS_AUTH`
120
+
121
+ ```typescript
122
+ global.CONTRACTS_AUTH = {
123
+ getAccessToken: () => getAccessToken() ?? useAuth.getState().token ?? null,
124
+ updateToken,
125
+ onSessionExpired: dispatchLogout,
126
+ };
127
+ ```
128
+
129
+ ### Полный пример `main.tsx`
64
130
 
65
131
  ```typescript
66
- window.BASE_API_URL = 'https://api.example.com'; // prod
67
- window.BASE_API_URL = 'https://staging.example.com'; // staging
68
- window.BASE_API_URL = '/api'; // proxy через dev-сервер
132
+ import { configureAuth, setupApiClient } from '@space-ai/contracts';
133
+ import { getAccessToken, updateToken } from '@/api/keycloak';
134
+ import { dispatchLogout, useAuth } from '@/stores/auth';
135
+
136
+ configureAuth({
137
+ getAccessToken: () => getAccessToken() ?? useAuth.getState().token ?? null,
138
+ updateToken: (s = 30) => updateToken(s),
139
+ onSessionExpired: dispatchLogout,
140
+ });
141
+
142
+ window.BASE_API_URL = import.meta.env.VITE_API_URL;
143
+ window.API_PREFIX = 'api';
144
+
145
+ setupApiClient();
146
+
147
+ import { createRoot } from 'react-dom/client';
148
+ import App from './App';
149
+
150
+ createRoot(document.getElementById('root')!).render(<App />);
69
151
  ```
70
152
 
71
153
  ---
@@ -204,7 +286,7 @@ const created = await createUser({
204
286
  Прямой доступ к axios (после инициализации):
205
287
 
206
288
  ```typescript
207
- const client = window.axios;
289
+ const client = globalThis.axios; // window.axios в браузере
208
290
  await client.get('/health');
209
291
  ```
210
292
 
@@ -212,12 +294,12 @@ await client.get('/health');
212
294
 
213
295
  ## TypeScript
214
296
 
215
- Пакет расширяет `Window`:
297
+ Пакет расширяет глобальную область (`global` / `window`):
216
298
 
217
299
  ```typescript
218
- interface Window {
219
- BASE_API_URL?: string;
220
- axios?: import('axios').AxiosInstance;
300
+ declare global {
301
+ var BASE_API_URL: string | undefined;
302
+ var axios: import('axios').AxiosInstance | undefined;
221
303
  }
222
304
  ```
223
305
 
@@ -272,6 +354,6 @@ CI (`.github/workflows/publish.yml`) выполнит `npm publish` при те
272
354
 
273
355
  | Симптом | Решение |
274
356
  |---------|---------|
275
- | `Axios не найден` | Задайте `window.BASE_API_URL`, импортируйте `@space-ai/contracts/axios` или вызовите `setupApiClient()` |
357
+ | `Axios не найден` | Задайте `BASE_API_URL` на `window` / `global`, импортируйте `@space-ai/contracts/axios` или вызовите `setupApiClient()` |
276
358
  | Запросы без baseURL | `BASE_API_URL` не был задан до инициализации — используйте **Способ 1** или **Способ 2** |
277
359
  | Двойной axios | Не вызывайте и `setupApiClient()`, и `initApiClient()` с разными инстансами без необходимости |
package/dist/axios.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { enableAutoInit, setupApiClient } from './core/setup-api-client.js';
2
+ import { getBaseApiUrl } from './core/runtime.js';
2
3
  enableAutoInit();
3
- if (typeof window !== 'undefined' && window.BASE_API_URL) {
4
+ if (getBaseApiUrl()) {
4
5
  setupApiClient();
5
6
  }
6
7
  //# sourceMappingURL=axios.js.map
package/dist/axios.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"axios.js","sourceRoot":"","sources":["../src/axios.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5E,cAAc,EAAE,CAAC;AAEjB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;IACzD,cAAc,EAAE,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"axios.js","sourceRoot":"","sources":["../src/axios.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,cAAc,EAAE,CAAC;AAEjB,IAAI,aAAa,EAAE,EAAE,CAAC;IACpB,cAAc,EAAE,CAAC;AACnB,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface AuthProvider {
2
+ /** Текущий access token (Keycloak, store и т.д.) */
3
+ getAccessToken(): string | null | undefined;
4
+ /** Обновить токен, если истекает в течение minValiditySeconds */
5
+ updateToken?(minValiditySeconds?: number): Promise<void>;
6
+ /** Сессия невалидна — logout, редирект и т.д. */
7
+ onSessionExpired?(): void;
8
+ }
9
+ export declare function configureAuth(provider: AuthProvider): void;
10
+ export declare function getAuthProvider(): AuthProvider | undefined;
11
+ export declare function resetAuthProvider(): void;
12
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/core/auth.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,oDAAoD;IACpD,cAAc,IAAI,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5C,iEAAiE;IACjE,WAAW,CAAC,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,iDAAiD;IACjD,gBAAgB,CAAC,IAAI,IAAI,CAAC;CAC3B;AAID,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAE1D;AAED,wBAAgB,eAAe,IAAI,YAAY,GAAG,SAAS,CAE1D;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
@@ -0,0 +1,12 @@
1
+ import { getRuntime } from './runtime.js';
2
+ let authProvider = null;
3
+ export function configureAuth(provider) {
4
+ authProvider = provider;
5
+ }
6
+ export function getAuthProvider() {
7
+ return authProvider ?? getRuntime()?.CONTRACTS_AUTH;
8
+ }
9
+ export function resetAuthProvider() {
10
+ authProvider = null;
11
+ }
12
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/core/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAW1C,IAAI,YAAY,GAAwB,IAAI,CAAC;AAE7C,MAAM,UAAU,aAAa,CAAC,QAAsB;IAClD,YAAY,GAAG,QAAQ,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,IAAI,UAAU,EAAE,EAAE,cAAc,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"axios-instance.d.ts","sourceRoot":"","sources":["../../src/core/axios-instance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAQ3C,wBAAgB,QAAQ,IAAI,aAAa,CAmBxC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAEnD;AAED,wBAAgB,UAAU,IAAI,IAAI,CAEjC"}
1
+ {"version":3,"file":"axios-instance.d.ts","sourceRoot":"","sources":["../../src/core/axios-instance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAS3C,wBAAgB,QAAQ,IAAI,aAAa,CAoBxC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAEnD;AAED,wBAAgB,UAAU,IAAI,IAAI,CAEjC"}
@@ -1,21 +1,23 @@
1
1
  import { isAutoInitEnabled, setupApiClient } from './setup-api-client.js';
2
+ import { getBaseApiUrl, getRuntimeAxios } from './runtime.js';
2
3
  import { getStoredAxios, resetStoredAxios, setStoredAxios, } from './state.js';
3
4
  export function getAxios() {
4
5
  let instance = getStoredAxios();
5
6
  if (instance)
6
7
  return instance;
7
- if (isAutoInitEnabled() && typeof window !== 'undefined' && window.BASE_API_URL) {
8
+ if (isAutoInitEnabled() && getBaseApiUrl()) {
8
9
  setupApiClient();
9
10
  instance = getStoredAxios();
10
11
  if (instance)
11
12
  return instance;
12
13
  }
13
- if (typeof window !== 'undefined' && window.axios) {
14
- setStoredAxios(window.axios);
15
- return window.axios;
14
+ const runtimeAxios = getRuntimeAxios();
15
+ if (runtimeAxios) {
16
+ setStoredAxios(runtimeAxios);
17
+ return runtimeAxios;
16
18
  }
17
- throw new Error('Axios не найден. Задайте window.BASE_API_URL и импортируйте @space-ai/contracts/axios, ' +
18
- 'вызовите setupApiClient() или initApiClient(axios)');
19
+ throw new Error('Axios не найден. Задайте global.BASE_API_URL / window.BASE_API_URL, ' +
20
+ 'импортируйте @space-ai/contracts/axios, вызовите setupApiClient() или initApiClient(axios)');
19
21
  }
20
22
  export function setAxios(axios) {
21
23
  setStoredAxios(axios);
@@ -1 +1 @@
1
- {"version":3,"file":"axios-instance.js","sourceRoot":"","sources":["../../src/core/axios-instance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,QAAQ;IACtB,IAAI,QAAQ,GAAG,cAAc,EAAE,CAAC;IAChC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,IAAI,iBAAiB,EAAE,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QAChF,cAAc,EAAE,CAAC;QACjB,QAAQ,GAAG,cAAc,EAAE,CAAC;QAC5B,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;IAChC,CAAC;IAED,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAClD,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,yFAAyF;QACvF,oDAAoD,CACvD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAoB;IAC3C,cAAc,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,gBAAgB,EAAE,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"axios-instance.js","sourceRoot":"","sources":["../../src/core/axios-instance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,QAAQ;IACtB,IAAI,QAAQ,GAAG,cAAc,EAAE,CAAC;IAChC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,IAAI,iBAAiB,EAAE,IAAI,aAAa,EAAE,EAAE,CAAC;QAC3C,cAAc,EAAE,CAAC;QACjB,QAAQ,GAAG,cAAc,EAAE,CAAC;QAC5B,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;IAChC,CAAC;IAED,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,IAAI,YAAY,EAAE,CAAC;QACjB,cAAc,CAAC,YAAY,CAAC,CAAC;QAC7B,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,sEAAsE;QACpE,4FAA4F,CAC/F,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAoB;IAC3C,cAAc,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,gBAAgB,EAAE,CAAC;AACrB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type AxiosInstance } from 'axios';
2
+ export declare function resolveBaseURL(): string | undefined;
3
+ export declare function createConfiguredAxios(baseURL?: string): AxiosInstance;
4
+ //# sourceMappingURL=create-axios-instance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-axios-instance.d.ts","sourceRoot":"","sources":["../../src/core/create-axios-instance.ts"],"names":[],"mappings":"AAAA,OAAc,EACZ,KAAK,aAAa,EAEnB,MAAM,OAAO,CAAC;AAMf,wBAAgB,cAAc,IAAI,MAAM,GAAG,SAAS,CAUnD;AAED,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,CAWrE"}
@@ -0,0 +1,63 @@
1
+ import axios from 'axios';
2
+ import { getAuthProvider } from './auth.js';
3
+ import { getBaseApiUrl, getRuntime } from './runtime.js';
4
+ const INTERCEPTORS_ATTACHED = Symbol('contracts.interceptors');
5
+ export function resolveBaseURL() {
6
+ const base = getBaseApiUrl();
7
+ if (!base)
8
+ return undefined;
9
+ const prefix = getRuntime()?.API_PREFIX;
10
+ if (!prefix)
11
+ return base;
12
+ const normalizedBase = base.replace(/\/$/, '');
13
+ const normalizedPrefix = prefix.replace(/^\//, '').replace(/\/$/, '');
14
+ return `${normalizedBase}/${normalizedPrefix}`;
15
+ }
16
+ export function createConfiguredAxios(baseURL) {
17
+ const instance = axios.create({
18
+ baseURL: baseURL ?? resolveBaseURL(),
19
+ headers: {
20
+ 'Content-Type': 'application/json',
21
+ Accept: 'application/json',
22
+ },
23
+ });
24
+ attachInterceptors(instance);
25
+ return instance;
26
+ }
27
+ function attachInterceptors(instance) {
28
+ const marked = instance;
29
+ if (marked[INTERCEPTORS_ATTACHED])
30
+ return;
31
+ marked[INTERCEPTORS_ATTACHED] = true;
32
+ instance.interceptors.request.use(async (config) => {
33
+ const auth = getAuthProvider();
34
+ if (!auth)
35
+ return config;
36
+ const token = auth.getAccessToken();
37
+ if (!token)
38
+ return config;
39
+ if (auth.updateToken) {
40
+ try {
41
+ await auth.updateToken(30);
42
+ }
43
+ catch {
44
+ auth.onSessionExpired?.();
45
+ return Promise.reject(new Error('Session expired'));
46
+ }
47
+ }
48
+ const fresh = auth.getAccessToken();
49
+ const currentToken = fresh ?? token;
50
+ if (currentToken) {
51
+ config.headers.Authorization = `Bearer ${currentToken}`;
52
+ }
53
+ return config;
54
+ }, (error) => Promise.reject(error));
55
+ instance.interceptors.response.use((res) => {
56
+ if (res.status >= 200 && res.status < 300)
57
+ return res;
58
+ throw new Error(res.data);
59
+ }, (err) => {
60
+ throw new Error(err);
61
+ });
62
+ }
63
+ //# sourceMappingURL=create-axios-instance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-axios-instance.js","sourceRoot":"","sources":["../../src/core/create-axios-instance.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/core/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAG3C,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,IAAI,CAYzD"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/core/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAI3C,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,IAAI,CAazD"}
package/dist/core/init.js CHANGED
@@ -1,13 +1,15 @@
1
1
  import { setAxios } from './axios-instance.js';
2
+ import { getRuntimeAxios } from './runtime.js';
2
3
  export function initApiClient(axios) {
3
4
  if (axios) {
4
5
  setAxios(axios);
5
6
  return;
6
7
  }
7
- if (typeof window !== 'undefined' && window.axios) {
8
- setAxios(window.axios);
8
+ const runtimeAxios = getRuntimeAxios();
9
+ if (runtimeAxios) {
10
+ setAxios(runtimeAxios);
9
11
  return;
10
12
  }
11
- throw new Error('Не передан axios и нет window.axios');
13
+ throw new Error('Не передан axios и нет global.axios / window.axios');
12
14
  }
13
15
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/core/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,MAAM,UAAU,aAAa,CAAC,KAAqB;IACjD,IAAI,KAAK,EAAE,CAAC;QACV,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAClD,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO;IACT,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;AACzD,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/core/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,UAAU,aAAa,CAAC,KAAqB;IACjD,IAAI,KAAK,EAAE,CAAC;QACV,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,IAAI,YAAY,EAAE,CAAC;QACjB,QAAQ,CAAC,YAAY,CAAC,CAAC;QACvB,OAAO;IACT,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { AxiosInstance } from 'axios';
2
+ /** Браузер (`window`) или Node.js (`global` / `globalThis`). */
3
+ export declare function getRuntime(): typeof globalThis | undefined;
4
+ export declare function getBaseApiUrl(): string | undefined;
5
+ export declare function getRuntimeAxios(): AxiosInstance | undefined;
6
+ export declare function setRuntimeAxios(instance: AxiosInstance): void;
7
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,gEAAgE;AAChE,wBAAgB,UAAU,IAAI,OAAO,UAAU,GAAG,SAAS,CAK1D;AAED,wBAAgB,aAAa,IAAI,MAAM,GAAG,SAAS,CAElD;AAED,wBAAgB,eAAe,IAAI,aAAa,GAAG,SAAS,CAE3D;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAK7D"}
@@ -0,0 +1,20 @@
1
+ /** Браузер (`window`) или Node.js (`global` / `globalThis`). */
2
+ export function getRuntime() {
3
+ if (typeof globalThis !== 'undefined') {
4
+ return globalThis;
5
+ }
6
+ return undefined;
7
+ }
8
+ export function getBaseApiUrl() {
9
+ return getRuntime()?.BASE_API_URL;
10
+ }
11
+ export function getRuntimeAxios() {
12
+ return getRuntime()?.axios;
13
+ }
14
+ export function setRuntimeAxios(instance) {
15
+ const runtime = getRuntime();
16
+ if (runtime) {
17
+ runtime.axios = instance;
18
+ }
19
+ }
20
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"AAEA,gEAAgE;AAChE,MAAM,UAAU,UAAU;IACxB,IAAI,OAAO,UAAU,KAAK,WAAW,EAAE,CAAC;QACtC,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,UAAU,EAAE,EAAE,YAAY,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,UAAU,EAAE,EAAE,KAAK,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAuB;IACrD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC;IAC3B,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"setup-api-client.d.ts","sourceRoot":"","sources":["../../src/core/setup-api-client.ts"],"names":[],"mappings":"AAKA,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED,wBAAgB,cAAc,IAAI,IAAI,CAqBrC"}
1
+ {"version":3,"file":"setup-api-client.d.ts","sourceRoot":"","sources":["../../src/core/setup-api-client.ts"],"names":[],"mappings":"AAaA,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED,wBAAgB,cAAc,IAAI,IAAI,CAyBrC"}
@@ -1,4 +1,5 @@
1
- import axios from 'axios';
1
+ import { createConfiguredAxios, resolveBaseURL, } from './create-axios-instance.js';
2
+ import { getRuntime, getRuntimeAxios, setRuntimeAxios, } from './runtime.js';
2
3
  import { setStoredAxios } from './state.js';
3
4
  let autoInitEnabled = false;
4
5
  export function enableAutoInit() {
@@ -8,20 +9,23 @@ export function isAutoInitEnabled() {
8
9
  return autoInitEnabled;
9
10
  }
10
11
  export function setupApiClient() {
11
- if (typeof window === 'undefined') {
12
- setStoredAxios(axios.create());
12
+ const runtime = getRuntime();
13
+ const baseURL = resolveBaseURL();
14
+ if (!runtime) {
15
+ setStoredAxios(createConfiguredAxios(baseURL));
13
16
  return;
14
17
  }
15
- const baseURL = window.BASE_API_URL;
16
18
  if (!baseURL) {
17
- console.warn('@space-ai/contracts: window.BASE_API_URL не задан — axios создаётся без baseURL');
19
+ console.warn('@space-ai/contracts: BASE_API_URL не задан (global / window) — axios создаётся без baseURL');
18
20
  }
19
- if (!window.axios) {
20
- window.axios = axios.create({ baseURL });
21
+ let instance = getRuntimeAxios();
22
+ if (!instance) {
23
+ instance = createConfiguredAxios(baseURL);
24
+ setRuntimeAxios(instance);
21
25
  }
22
26
  else if (baseURL) {
23
- window.axios.defaults.baseURL = baseURL;
27
+ instance.defaults.baseURL = baseURL;
24
28
  }
25
- setStoredAxios(window.axios);
29
+ setStoredAxios(instance);
26
30
  }
27
31
  //# sourceMappingURL=setup-api-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"setup-api-client.js","sourceRoot":"","sources":["../../src/core/setup-api-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,IAAI,eAAe,GAAG,KAAK,CAAC;AAE5B,MAAM,UAAU,cAAc;IAC5B,eAAe,GAAG,IAAI,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC;IAEpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,iFAAiF,CAClF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;SAAM,IAAI,OAAO,EAAE,CAAC;QACnB,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;IAC1C,CAAC;IAED,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"setup-api-client.js","sourceRoot":"","sources":["../../src/core/setup-api-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,cAAc,GACf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,UAAU,EACV,eAAe,EACf,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,IAAI,eAAe,GAAG,KAAK,CAAC;AAE5B,MAAM,UAAU,cAAc;IAC5B,eAAe,GAAG,IAAI,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IAEjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,cAAc,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,4FAA4F,CAC7F,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,GAAG,eAAe,EAAE,CAAC;IAEjC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC1C,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;SAAM,IAAI,OAAO,EAAE,CAAC;QACnB,QAAQ,CAAC,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;IACtC,CAAC;IAED,cAAc,CAAC,QAAQ,CAAC,CAAC;AAC3B,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  export { initApiClient } from './core/init.js';
2
2
  export { setupApiClient, enableAutoInit } from './core/setup-api-client.js';
3
3
  export { getAxios, resetAxios } from './core/axios-instance.js';
4
+ export { configureAuth, resetAuthProvider, type AuthProvider, } from './core/auth.js';
5
+ export { createConfiguredAxios, resolveBaseURL, } from './core/create-axios-instance.js';
4
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,KAAK,YAAY,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,qBAAqB,EACrB,cAAc,GACf,MAAM,iCAAiC,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,6 @@
1
1
  export { initApiClient } from './core/init.js';
2
2
  export { setupApiClient, enableAutoInit } from './core/setup-api-client.js';
3
3
  export { getAxios, resetAxios } from './core/axios-instance.js';
4
+ export { configureAuth, resetAuthProvider, } from './core/auth.js';
5
+ export { createConfiguredAxios, resolveBaseURL, } from './core/create-axios-instance.js';
4
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EACL,aAAa,EACb,iBAAiB,GAElB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,qBAAqB,EACrB,cAAc,GACf,MAAM,iCAAiC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@space-ai/contracts",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Типы и функции HTTP-запросов к API (axios устанавливается вместе с пакетом)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",