@space-ai/contracts 0.1.0 → 0.1.2

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
@@ -1,55 +1,285 @@
1
1
  # @space-ai/contracts
2
2
 
3
- npm-пакет с типами и функциями HTTP-запросов к API. Axios не входит в бандл — передаётся при инициализации (`peerDependency`).
3
+ npm-пакет с TypeScript-типами и функциями HTTP-запросов к API.
4
4
 
5
- ## Структура
5
+ Axios устанавливается автоматически как зависимость пакета. Базовый URL API задаётся через `BASE_API_URL` на глобальном объекте: **`window`** (браузер) или **`global`** / `globalThis` (Node.js, тесты).
6
6
 
7
+ ## Содержание
8
+
9
+ - [Установка](#установка)
10
+ - [Быстрый старт](#быстрый-старт)
11
+ - [BASE_API_URL (window / global)](#base_api_url-window--global)
12
+ - [Способы инициализации](#способы-инициализации)
13
+ - [Использование API-функций](#использование-api-функций)
14
+ - [TypeScript](#typescript)
15
+ - [Локальная разработка пакета](#локальная-разработка-пакета)
16
+ - [Публикация в npm](#публикация-в-npm)
17
+
18
+ ---
19
+
20
+ ## Установка
21
+
22
+ ```bash
23
+ npm install @space-ai/contracts
7
24
  ```
8
- src/ — исходники (типы, api, core)
9
- dist/ — сборка для npm (генерируется, в git не коммитится)
25
+
26
+ Отдельно ставить `axios` не нужно.
27
+
28
+ ---
29
+
30
+ ## Быстрый старт
31
+
32
+ **1.** Задайте базовый URL API:
33
+
34
+ ```typescript
35
+ // браузер
36
+ window.BASE_API_URL = 'https://api.example.com';
37
+
38
+ // Node.js / тесты
39
+ global.BASE_API_URL = 'http://localhost:3000';
10
40
  ```
11
41
 
12
- ## Локальная разработка
42
+ **2.** Подключите автоинициализацию axios (один раз в точке входа):
13
43
 
14
- ```bash
15
- npm install
16
- npm run build
44
+ ```typescript
45
+ import '@space-ai/contracts/axios';
46
+ ```
47
+
48
+ **3.** Используйте функции запросов где угодно:
49
+
50
+ ```typescript
51
+ import { getUser } from '@space-ai/contracts';
52
+
53
+ const user = await getUser(1);
54
+ ```
55
+
56
+ Axios создаётся с `baseURL: BASE_API_URL`, сохраняется в `window.axios` / `global.axios` и используется всеми API-функциями.
57
+
58
+ ---
59
+
60
+ ## BASE_API_URL (window / global)
61
+
62
+ Пакет читает и пишет одни и те же поля на `globalThis` — в браузере это `window`, в Node.js — `global`.
63
+
64
+ | Свойство | Тип | Описание |
65
+ |----------|-----|----------|
66
+ | `BASE_API_URL` | `string` | Базовый URL API → `axios.create({ baseURL })` |
67
+ | `axios` | `AxiosInstance` | Экземпляр axios (создаётся пакетом) |
68
+
69
+ Примеры:
70
+
71
+ ```typescript
72
+ // браузер
73
+ window.BASE_API_URL = '/api';
74
+
75
+ // Node.js, Vitest, Jest
76
+ global.BASE_API_URL = 'http://localhost:3000';
77
+ ```
78
+
79
+ ---
80
+
81
+ ## Способы инициализации
82
+
83
+ ### Способ 1 — Vite / React (рекомендуется)
84
+
85
+ Импорты в ES-модулях **поднимаются (hoisting)** и выполняются раньше остального кода файла. Поэтому `window.BASE_API_URL` нужно задать **до** загрузки приложения.
86
+
87
+ **index.html** — задайте URL до бандла:
88
+
89
+ ```html
90
+ <!DOCTYPE html>
91
+ <html lang="ru">
92
+ <head>...</head>
93
+ <body>
94
+ <div id="root"></div>
95
+ <script>
96
+ window.BASE_API_URL = '/api';
97
+ </script>
98
+ <script type="module" src="/src/main.tsx"></script>
99
+ </body>
100
+ </html>
101
+ ```
102
+
103
+ **main.tsx**:
104
+
105
+ ```typescript
106
+ import '@space-ai/contracts/axios';
107
+ import { createRoot } from 'react-dom/client';
108
+ import App from './App';
109
+
110
+ createRoot(document.getElementById('root')!).render(<App />);
111
+ ```
112
+
113
+ #### Vite: URL из `.env`
114
+
115
+ В `.env`:
116
+
117
+ ```env
118
+ VITE_BASE_API_URL=https://api.example.com
119
+ ```
120
+
121
+ В **index.html** (Vite подставляет `%VITE_*%` при сборке):
122
+
123
+ ```html
124
+ <script>
125
+ window.BASE_API_URL = '%VITE_BASE_API_URL%';
126
+ </script>
127
+ ```
128
+
129
+ Или через **vite.config.ts** — плагин `transformIndexHtml`, если нужна подстановка иначе.
130
+
131
+ ---
132
+
133
+ ### Способ 2 — явный вызов `setupApiClient()`
134
+
135
+ Если `BASE_API_URL` задаётся в коде (например, из `import.meta.env`), вызовите setup **после** присвоения:
136
+
137
+ ```typescript
138
+ // main.tsx
139
+ window.BASE_API_URL = import.meta.env.VITE_BASE_API_URL;
140
+
141
+ import { setupApiClient } from '@space-ai/contracts';
142
+
143
+ setupApiClient();
144
+ ```
145
+
146
+ Side-effect импорт `@space-ai/contracts/axios` здесь **не обязателен** — достаточно `setupApiClient()`.
147
+
148
+ ---
149
+
150
+ ### Способ 3 — side-effect импорт + отложенная инициализация
151
+
152
+ Если используете только:
153
+
154
+ ```typescript
155
+ window.BASE_API_URL = import.meta.env.VITE_BASE_API_URL;
156
+ import '@space-ai/contracts/axios';
157
+ ```
158
+
159
+ из-за hoisting импорт выполнится **раньше** присвоения `BASE_API_URL`. Пакет это учитывает: при импорте `@space-ai/contracts/axios` включается **auto-init**, а axios создаётся при **первом HTTP-запросе**, когда `window.BASE_API_URL` уже задан.
160
+
161
+ ```typescript
162
+ // main.tsx — порядок строк в файле не важен для auto-init
163
+ import '@space-ai/contracts/axios';
164
+
165
+ window.BASE_API_URL = import.meta.env.VITE_BASE_API_URL;
166
+
167
+ // axios создастся при первом вызове getUser(), getProducts() и т.д.
17
168
  ```
18
169
 
19
- ## Использование
170
+ > Для interceptors и baseURL до первого запроса надёжнее **Способ 1** или **Способ 2**.
171
+
172
+ ---
173
+
174
+ ### Способ 4 — полностью ручная настройка
175
+
176
+ Свой экземпляр axios с interceptors, таймаутами и т.д.:
20
177
 
21
178
  ```typescript
22
179
  import axios from 'axios';
23
- import { initApiClient, getUser } from '@space-ai/contracts';
180
+ import { initApiClient } from '@space-ai/contracts';
181
+
182
+ const api = axios.create({
183
+ baseURL: window.BASE_API_URL ?? '/api',
184
+ timeout: 10_000,
185
+ });
186
+
187
+ api.interceptors.request.use((config) => {
188
+ // auth token, headers...
189
+ return config;
190
+ });
24
191
 
25
- const api = axios.create({ baseURL: '/api' });
26
192
  initApiClient(api);
193
+ ```
27
194
 
28
- const user = await getUser(1);
195
+ ---
196
+
197
+ ## Использование API-функций
198
+
199
+ ```typescript
200
+ import { getUser, createUser } from '@space-ai/contracts';
201
+
202
+ const user = await getUser(42);
203
+
204
+ const created = await createUser({
205
+ name: 'Alice',
206
+ email: 'alice@example.com',
207
+ });
208
+ ```
209
+
210
+ Запросы идут на `{BASE_API_URL}/users/42`, `{BASE_API_URL}/users` и т.д.
211
+
212
+ Прямой доступ к axios (после инициализации):
213
+
214
+ ```typescript
215
+ const client = globalThis.axios; // window.axios в браузере
216
+ await client.get('/health');
29
217
  ```
30
218
 
219
+ ---
220
+
221
+ ## TypeScript
222
+
223
+ Пакет расширяет глобальную область (`global` / `window`):
224
+
225
+ ```typescript
226
+ declare global {
227
+ var BASE_API_URL: string | undefined;
228
+ var axios: import('axios').AxiosInstance | undefined;
229
+ }
230
+ ```
231
+
232
+ Дополнительные декларации в проекте не нужны.
233
+
234
+ ---
235
+
236
+ ## Локальная разработка пакета
237
+
238
+ ```bash
239
+ git clone <repo>
240
+ cd contracts
241
+ npm install
242
+ npm run build
243
+ ```
244
+
245
+ Структура:
246
+
247
+ ```
248
+ src/
249
+ api/ — функции запросов к эндпоинтам
250
+ types/ — типы запросов/ответов
251
+ core/ — axios, init, setup
252
+ axios.ts — entry point @space-ai/contracts/axios
253
+ index.ts — публичное API @space-ai/contracts
254
+ dist/ — сборка для npm (не коммитится)
255
+ ```
256
+
257
+ ---
258
+
31
259
  ## Публикация в npm
32
260
 
33
- 1. Создайте организацию/scope на [npmjs.com](https://www.npmjs.com/) (например `@space-ai`).
34
- 2. Сгенерируйте **Automation token** (не publish token с 2FA-проблемами): npm → Access Tokens → Granular Access Token Read and write, scope ваш пакет/org.
35
- 3. В GitHub: **Settings Secrets and variables → Actions → New repository secret** → имя `NPM_TOKEN`, значение — токен.
36
- 4. Обновите в `package.json`: `name`, `repository.url` (пакет публикуется как **public** scoped).
37
- 5. Локально поднимите версию и запушьте тег:
261
+ 1. Организация `@space-ai` на [npmjs.com](https://www.npmjs.com/).
262
+ 2. Granular Access Token (Read and write, Bypass 2FA) GitHub Secret `NPM_TOKEN`.
263
+ 3. Поднять версию и запушить тег:
38
264
 
39
265
  ```bash
40
- npm version patch # или minor / major
266
+ npm version patch
41
267
  git push origin main --tags
42
268
  ```
43
269
 
44
- CI workflow `.github/workflows/publish.yml` соберёт пакет и выполнит `npm publish` при пуше тега `v*.*.*`.
270
+ CI (`.github/workflows/publish.yml`) выполнит `npm publish` при теге `v*.*.*`.
271
+
272
+ | Workflow | Назначение |
273
+ |----------|------------|
274
+ | `ci.yml` | сборка на PR и push в main |
275
+ | `publish.yml` | публикация по git-тегу |
45
276
 
46
- ## GitHub
277
+ ---
47
278
 
48
- | Что | Зачем |
49
- |-----|-------|
50
- | Secret `NPM_TOKEN` | авторизация `npm publish` в Actions |
51
- | Workflow `ci.yml` | проверка сборки на PR и push в main |
52
- | Workflow `publish.yml` | публикация по git-тегу |
53
- | (опционально) Branch protection | merge только после зелёного CI |
279
+ ## Частые проблемы
54
280
 
55
- Первый релиз: после настройки секрета выполните `npm version 0.1.0 && git push origin main --tags`.
281
+ | Симптом | Решение |
282
+ |---------|---------|
283
+ | `Axios не найден` | Задайте `BASE_API_URL` на `window` / `global`, импортируйте `@space-ai/contracts/axios` или вызовите `setupApiClient()` |
284
+ | Запросы без baseURL | `BASE_API_URL` не был задан до инициализации — используйте **Способ 1** или **Способ 2** |
285
+ | Двойной axios | Не вызывайте и `setupApiClient()`, и `initApiClient()` с разными инстансами без необходимости |
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=axios.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"axios.d.ts","sourceRoot":"","sources":["../src/axios.ts"],"names":[],"mappings":""}
package/dist/axios.js ADDED
@@ -0,0 +1,7 @@
1
+ import { enableAutoInit, setupApiClient } from './core/setup-api-client.js';
2
+ import { getBaseApiUrl } from './core/runtime.js';
3
+ enableAutoInit();
4
+ if (getBaseApiUrl()) {
5
+ setupApiClient();
6
+ }
7
+ //# sourceMappingURL=axios.js.map
@@ -0,0 +1 @@
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"}
@@ -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;AAI3C,wBAAgB,QAAQ,IAAI,aAAa,CAWxC;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,17 +1,28 @@
1
- let instance = null;
1
+ import { isAutoInitEnabled, setupApiClient } from './setup-api-client.js';
2
+ import { getBaseApiUrl, getRuntimeAxios } from './runtime.js';
3
+ import { getStoredAxios, resetStoredAxios, setStoredAxios, } from './state.js';
2
4
  export function getAxios() {
5
+ let instance = getStoredAxios();
3
6
  if (instance)
4
7
  return instance;
5
- if (typeof window !== 'undefined' && window.axios) {
6
- instance = window.axios;
7
- return instance;
8
+ if (isAutoInitEnabled() && getBaseApiUrl()) {
9
+ setupApiClient();
10
+ instance = getStoredAxios();
11
+ if (instance)
12
+ return instance;
13
+ }
14
+ const runtimeAxios = getRuntimeAxios();
15
+ if (runtimeAxios) {
16
+ setStoredAxios(runtimeAxios);
17
+ return runtimeAxios;
8
18
  }
9
- throw new Error('Axios не найден. Вызовите initApiClient(axios) или установите window.axios');
19
+ throw new Error('Axios не найден. Задайте global.BASE_API_URL / window.BASE_API_URL, ' +
20
+ 'импортируйте @space-ai/contracts/axios, вызовите setupApiClient() или initApiClient(axios)');
10
21
  }
11
22
  export function setAxios(axios) {
12
- instance = axios;
23
+ setStoredAxios(axios);
13
24
  }
14
25
  export function resetAxios() {
15
- instance = null;
26
+ resetStoredAxios();
16
27
  }
17
28
  //# sourceMappingURL=axios-instance.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"axios-instance.js","sourceRoot":"","sources":["../../src/core/axios-instance.ts"],"names":[],"mappings":"AAEA,IAAI,QAAQ,GAAyB,IAAI,CAAC;AAE1C,MAAM,UAAU,QAAQ;IACtB,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAClD,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;QACxB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,4EAA4E,CAC7E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAoB;IAC3C,QAAQ,GAAG,KAAK,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,QAAQ,GAAG,IAAI,CAAC;AAClB,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"}
@@ -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"}
@@ -0,0 +1,4 @@
1
+ export declare function enableAutoInit(): void;
2
+ export declare function isAutoInitEnabled(): boolean;
3
+ export declare function setupApiClient(): void;
4
+ //# sourceMappingURL=setup-api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-api-client.d.ts","sourceRoot":"","sources":["../../src/core/setup-api-client.ts"],"names":[],"mappings":"AAWA,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED,wBAAgB,cAAc,IAAI,IAAI,CA0BrC"}
@@ -0,0 +1,31 @@
1
+ import axios from 'axios';
2
+ import { getBaseApiUrl, getRuntime, getRuntimeAxios, setRuntimeAxios, } from './runtime.js';
3
+ import { setStoredAxios } from './state.js';
4
+ let autoInitEnabled = false;
5
+ export function enableAutoInit() {
6
+ autoInitEnabled = true;
7
+ }
8
+ export function isAutoInitEnabled() {
9
+ return autoInitEnabled;
10
+ }
11
+ export function setupApiClient() {
12
+ const runtime = getRuntime();
13
+ if (!runtime) {
14
+ setStoredAxios(axios.create());
15
+ return;
16
+ }
17
+ const baseURL = getBaseApiUrl();
18
+ if (!baseURL) {
19
+ console.warn('@space-ai/contracts: BASE_API_URL не задан (global / window) — axios создаётся без baseURL');
20
+ }
21
+ let instance = getRuntimeAxios();
22
+ if (!instance) {
23
+ instance = axios.create({ baseURL });
24
+ setRuntimeAxios(instance);
25
+ }
26
+ else if (baseURL) {
27
+ instance.defaults.baseURL = baseURL;
28
+ }
29
+ setStoredAxios(instance);
30
+ }
31
+ //# sourceMappingURL=setup-api-client.js.map
@@ -0,0 +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,EACL,aAAa,EACb,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;IAE7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAEhC,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,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QACrC,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"}
@@ -0,0 +1,5 @@
1
+ import type { AxiosInstance } from 'axios';
2
+ export declare function getStoredAxios(): AxiosInstance | null;
3
+ export declare function setStoredAxios(axios: AxiosInstance): void;
4
+ export declare function resetStoredAxios(): void;
5
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAI3C,wBAAgB,cAAc,IAAI,aAAa,GAAG,IAAI,CAErD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAEzD;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
@@ -0,0 +1,11 @@
1
+ let instance = null;
2
+ export function getStoredAxios() {
3
+ return instance;
4
+ }
5
+ export function setStoredAxios(axios) {
6
+ instance = axios;
7
+ }
8
+ export function resetStoredAxios() {
9
+ instance = null;
10
+ }
11
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"AAEA,IAAI,QAAQ,GAAyB,IAAI,CAAC;AAE1C,MAAM,UAAU,cAAc;IAC5B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAoB;IACjD,QAAQ,GAAG,KAAK,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,QAAQ,GAAG,IAAI,CAAC;AAClB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export { initApiClient } from './core/init.js';
2
+ export { setupApiClient, enableAutoInit } from './core/setup-api-client.js';
2
3
  export { getAxios, resetAxios } from './core/axios-instance.js';
3
4
  //# 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,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"}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export { initApiClient } from './core/init.js';
2
+ export { setupApiClient, enableAutoInit } from './core/setup-api-client.js';
2
3
  export { getAxios, resetAxios } from './core/axios-instance.js';
3
4
  //# 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,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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@space-ai/contracts",
3
- "version": "0.1.0",
4
- "description": "Типы и функции HTTP-запросов к API (axios peer dependency)",
3
+ "version": "0.1.2",
4
+ "description": "Типы и функции HTTP-запросов к API (axios устанавливается вместе с пакетом)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -9,8 +9,15 @@
9
9
  ".": {
10
10
  "types": "./dist/index.d.ts",
11
11
  "import": "./dist/index.js"
12
+ },
13
+ "./axios": {
14
+ "types": "./dist/axios.d.ts",
15
+ "import": "./dist/axios.js"
12
16
  }
13
17
  },
18
+ "sideEffects": [
19
+ "./dist/axios.js"
20
+ ],
14
21
  "files": [
15
22
  "dist"
16
23
  ],
@@ -19,11 +26,10 @@
19
26
  "prepublishOnly": "npm run build",
20
27
  "typecheck": "tsc --noEmit"
21
28
  },
22
- "peerDependencies": {
23
- "axios": "^1.0.0"
29
+ "dependencies": {
30
+ "axios": "^1.7.0"
24
31
  },
25
32
  "devDependencies": {
26
- "axios": "^1.7.0",
27
33
  "typescript": "^5.7.0"
28
34
  },
29
35
  "publishConfig": {