2026-04-01 19:21:34 +03:00
|
|
|
|
# @gromlab/api-codegen
|
2025-10-26 22:30:58 +03:00
|
|
|
|
|
2026-06-30 07:59:52 +03:00
|
|
|
|
CLI утилита для генерации TypeScript REST-клиента из OpenAPI спецификации.
|
2025-10-26 22:30:58 +03:00
|
|
|
|
|
|
|
|
|
|
## Использование
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-06-30 07:59:52 +03:00
|
|
|
|
npx @gromlab/api-codegen -i <INPUT> -o <OUTPUT> [-n <NAME>] [--mode single|split|both]
|
2025-10-26 22:30:58 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**Аргументы:**
|
2026-06-30 07:59:52 +03:00
|
|
|
|
- `-i, --input <path>` - путь к OpenAPI файлу или URL
|
|
|
|
|
|
- `-o, --output <path>` - директория для сохранения файлов
|
|
|
|
|
|
- `-n, --name <name>` - имя монолитного файла без `.ts`
|
|
|
|
|
|
- `--mode <mode>` - режим генерации: `single`, `split`, `both` (по умолчанию `single`)
|
|
|
|
|
|
- `--single-file` - устаревший алиас для `--mode single`
|
2025-10-26 22:30:58 +03:00
|
|
|
|
|
2026-06-30 07:59:52 +03:00
|
|
|
|
## Примеры
|
2025-10-26 22:30:58 +03:00
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# Локальный файл
|
2026-04-01 19:21:34 +03:00
|
|
|
|
npx @gromlab/api-codegen -i ./openapi.json -o ./src/api
|
2025-10-26 22:30:58 +03:00
|
|
|
|
|
|
|
|
|
|
# URL на спецификацию
|
2026-04-01 19:21:34 +03:00
|
|
|
|
npx @gromlab/api-codegen -i https://httpbin.org/spec.json -o ./src/api
|
2025-10-26 22:30:58 +03:00
|
|
|
|
|
2026-06-30 07:59:52 +03:00
|
|
|
|
# Монолитный файл с кастомным именем
|
2026-04-01 19:21:34 +03:00
|
|
|
|
npx @gromlab/api-codegen -i ./openapi.json -o ./src/api -n MyApi
|
|
|
|
|
|
|
2026-06-30 07:59:52 +03:00
|
|
|
|
# Разложенный tree-shaking friendly клиент
|
|
|
|
|
|
npx @gromlab/api-codegen -i ./openapi.json -o ./src/api --mode split
|
|
|
|
|
|
|
|
|
|
|
|
# Монолит и разложенный клиент одновременно
|
|
|
|
|
|
npx @gromlab/api-codegen -i ./openapi.json -o ./src/api -n MyApi --mode both
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Структура вывода
|
|
|
|
|
|
|
|
|
|
|
|
По умолчанию генерируется legacy монолитный клиент для обратной совместимости:
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
generated/
|
|
|
|
|
|
└── MyApi.ts
|
2025-10-26 22:30:58 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-30 07:59:52 +03:00
|
|
|
|
В режиме `split` генерируется tree-shaking friendly структура:
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
generated/
|
|
|
|
|
|
├── create-api-client.ts
|
|
|
|
|
|
├── data-contracts.ts
|
|
|
|
|
|
├── http-client.ts
|
|
|
|
|
|
├── index.ts
|
|
|
|
|
|
└── operations/
|
|
|
|
|
|
├── index.ts
|
|
|
|
|
|
├── get-users.ts
|
|
|
|
|
|
└── create-user.ts
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Каждый endpoint лежит в отдельном файле внутри `operations/`.
|
|
|
|
|
|
|
|
|
|
|
|
В режиме `both` генерируются оба варианта рядом.
|
|
|
|
|
|
|
|
|
|
|
|
## Пример Использования
|
|
|
|
|
|
|
|
|
|
|
|
Для `single` режима:
|
2025-10-26 22:30:58 +03:00
|
|
|
|
|
|
|
|
|
|
```typescript
|
2026-06-30 07:59:52 +03:00
|
|
|
|
import { Api, HttpClient } from './generated/MyApi';
|
|
|
|
|
|
|
|
|
|
|
|
const http = new HttpClient({ baseUrl: 'https://api.example.com' });
|
|
|
|
|
|
const api = new Api(http);
|
2025-10-26 22:30:58 +03:00
|
|
|
|
|
2026-06-30 07:59:52 +03:00
|
|
|
|
const users = await api.users.getAll({});
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Для `split` режима:
|
|
|
|
|
|
|
|
|
|
|
|
```typescript
|
|
|
|
|
|
import { createApiClient, HttpClient } from './generated';
|
|
|
|
|
|
import { getAll } from './generated/operations/get-all';
|
|
|
|
|
|
import { create } from './generated/operations/create';
|
|
|
|
|
|
|
|
|
|
|
|
const http = new HttpClient({
|
|
|
|
|
|
baseUrl: 'https://api.example.com',
|
|
|
|
|
|
securityWorker: (securityData: { token: string } | null) => {
|
|
|
|
|
|
if (!securityData?.token) {
|
|
|
|
|
|
return undefined;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
headers: {
|
|
|
|
|
|
Authorization: `Bearer ${securityData.token}`,
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
},
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
const api = createApiClient(http, {
|
|
|
|
|
|
users: {
|
|
|
|
|
|
getAll,
|
|
|
|
|
|
create,
|
|
|
|
|
|
},
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
const users = await api.users.getAll({});
|
|
|
|
|
|
const createdUser = await api.users.create({ email, password });
|
|
|
|
|
|
```
|
2025-10-26 22:30:58 +03:00
|
|
|
|
|
2026-06-30 07:59:52 +03:00
|
|
|
|
Если нужен максимально точечный импорт, operation можно вызвать напрямую:
|
2025-10-26 22:30:58 +03:00
|
|
|
|
|
2026-06-30 07:59:52 +03:00
|
|
|
|
```typescript
|
|
|
|
|
|
import { HttpClient } from './generated/http-client';
|
|
|
|
|
|
import { getAll } from './generated/operations/get-all';
|
2025-10-26 22:30:58 +03:00
|
|
|
|
|
2026-06-30 07:59:52 +03:00
|
|
|
|
const http = new HttpClient();
|
|
|
|
|
|
const users = await getAll(http, {});
|
2025-10-26 22:30:58 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
2025-10-28 09:58:44 +03:00
|
|
|
|
## Разработка
|
|
|
|
|
|
|
|
|
|
|
|
### Сборка
|
2026-06-30 07:59:52 +03:00
|
|
|
|
|
2025-10-28 09:58:44 +03:00
|
|
|
|
```bash
|
|
|
|
|
|
bun run build
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Тестирование
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
bun test
|
2026-04-01 19:21:34 +03:00
|
|
|
|
bun run test:unit
|
|
|
|
|
|
bun run test:integration
|
2025-10-28 09:58:44 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-01 19:21:34 +03:00
|
|
|
|
Подробная документация по тестированию в [`tests/README.md`](tests/README.md).
|
2025-10-28 09:58:44 +03:00
|
|
|
|
|
2025-10-26 22:30:58 +03:00
|
|
|
|
## Лицензия
|
|
|
|
|
|
|
|
|
|
|
|
MIT
|