hh-contracts 0.0.85 → 0.0.86

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/AGENTS.md CHANGED
@@ -1,66 +1,71 @@
1
- # agents.md — Каркас для Codex/LLM-агентов
2
-
3
- ## 1. Введение
4
-
5
- Этот документ описывает агентов (AI-ассистентов), их роли, правила и форматы работы.
6
- Цель — стандартизировать использование Codex/LLM внутри проекта, сделать промптинг воспроизводимым и согласованным.
7
-
8
- ---
9
-
10
- ## 2. Таксономия агентов
11
-
12
- Определены следующие агенты:
13
-
14
- - **Contracts Agent** — ведёт Zod-схемы, DTO, enums в `hh-contracts`.
15
-
16
- ---
17
-
18
- ## 3. Общие принципы
19
-
20
- 1. **Single Source of Truth**: все типы и схемы берутся из `hh-contracts`.
21
- 2. **Чёткие форматы**: каждый агент возвращает только согласованный формат (TSX, SQL, JSON и т.д.).
22
- 3. **ASSUMPTIONS/GAPS**: если данных не хватает, агент явно указывает предположения и пробелы.
23
- 4. **Пошаговость**: сложные задачи делятся на дизайн реализация тесты.
24
- 5. **Безопасность**: никаких секретов, токены только через `process.env` и Zod-валидацию.
25
-
26
- ---
27
-
28
- ## 4. Описание агентов
29
-
30
- ### Contracts Agent
31
-
32
- **Назначение**: ведёт контракты (Zod v4 схемы/DTO).
33
- **Вход**: описание сущностей, версия `hh-contracts`.
34
- **Выход**: TypeScript-файл со схемами, без README.
35
- **Стиль**: TS 5.x strict, без `any`.
36
- **Ограничения**: не использовать class-validator.
37
- **Инструменты**: zod.
38
- **Few-shot**:
39
-
40
- ```
41
- Запрос: Добавь сущность Permission (id, name, action, subject, conditions?)
42
- Ответ: TypeScript-файл с Zod-схемой и типом.
43
- ```
44
-
45
- ---
46
-
47
- ## 5. Чек-лист качества (для каждого ответа)
48
-
49
- - [ ] Соответствует контрактам.
50
- - [ ] Нет магических значений.
51
- - [ ] Типизировано строго.
52
- - [ ] Есть тесты или примеры.
53
- - [ ] Код ≤ 400 строк.
54
-
55
- ---
56
-
57
- ## 6. Версионирование
58
-
59
- - Изменения фиксируются внизу файла (Changelog).
60
- - MAJOR — при смене форматов, MINOR — при добавлении агентов.
61
-
62
- ---
63
-
64
- ## Changelog
65
-
1
+ AGENTS.md — инструкции для Codex/LLM-агентов
2
+
3
+ ## 1. Контекст проекта
4
+
5
+ `hh-contracts` типизированное ядро контрактов для всей платформы управления отелями. Репозиторий публикуется как npm‑пакет и содержит только исходные типы/схемы (`*.ts`) и скомпилированный артефакт в `build/`. Любые изменения в доменных сервисах должны начинаться здесь.
6
+
7
+ ### Основные каталоги
8
+
9
+ - `common/` — общие константы, вспомогательные схемы и утилиты. Использовать их при любой возможности вместо дублирования.
10
+ - `*/contracts/` файловая зона для REST/gRPC/WebSocket контрактов конкретного домена (roles, permissions, tenants и т. д.).
11
+ - `*/index.ts` — публичные реэкспорты. Добавляя новый файл, обязательно обновляйте соответствующий `index.ts`.
12
+ - `build/` — артефакты TypeScript‑компиляции. **Не редактировать вручную.**
13
+
14
+ ## 2. Роли агентов
15
+
16
+ - **Contracts Agent** — отвечает за модели и схемы. Любая доработка (добавление сущности, изменение поля, экспорт типов) выполняется через него.
17
+ - Если создаётся новый тип агента, описать его в этом файле и зафиксировать правила в разделе 5.
18
+
19
+ ## 3. Правила разработки
20
+
21
+ 1. **Single Source of Truth**. Типы, перечисления, схемы валидируются и объявляются здесь. Копирование структур из других сервисов запрещено.
22
+ 2. **Zod v4.** Использовать только `zod@^4`. Схемы пишем декларативно, избегая `any`. Для произвольных словарей применять `z.record` с ограничениями.
23
+ 3. **Строгая типизация.** `tsconfig.json` находится в strict‑режиме. Новые файлы не должны снижать строгие настройки.
24
+ 4. **Именование:**
25
+ - Файлы схем — `*.schema.ts` или `*.contract.ts` в зависимости от назначения.
26
+ - Типы, полученные из схем, объявлять через `export type TSome = z.infer<typeof SomeSchema>;`.
27
+ - Enum‑образные наборы значений хранить в `common/constants`, экспортировать через `as const` и соответствующий `z.enum`.
28
+ 5. **Повторное использование:** сначала ищите подходящую схему в `common/models` и `common/constants`. При необходимости расширяйте через `.extend(...)` или `.merge(...)`.
29
+ 6. **Версионирование:** после любых изменений обновляйте `package.json` вручную только по согласованию. Как минимум фиксируйте запись в Changelog (см. раздел 6).
30
+ 7. **Документация контрактов:** не нужно составлять документацию контрактов.
31
+ 8. **Переводы:** схемы переводов для сущностей хранятся рядом со схемами сущностей. `translate/` — эндпоинт для переводов. умеет работать как с отдельными строками, так и с полными наборами переводов для сущности. в случшае добавления сущности с переводами нужно обновить TranslateObjectContract - `translate/contracts/translate-object.contract.ts`
32
+ 9. **Не оставляйте TODO** без описания задачи. Используйте формат `// TODO(#issue-id): описание`.
33
+
34
+ ## 4. Рабочий процесс для задач
35
+
36
+ 1. **Анализ**
37
+ - Изучите существующие схемы домена.
38
+ - Определите, какие общие константы/типажи можно переиспользовать.
39
+ 2. **Дизайн**
40
+ - При сложных задачах сначала предложите структуру (таблица полей, связи, вариативность).
41
+ - Согласуйте новые enum/константы и ключи переводов.
42
+ 3. **Реализация**
43
+ - Создайте/обновите схемы, типы, константы и индексы.
44
+ - Проверьте, что экспорты доступны из корня пакета (`index.ts`).
45
+ 4. **Проверка**
46
+ - Выполните `npm run build` перед коммитом.
47
+ - Убедитесь, что сгенерированный `build/` совпадает с ожиданиями (git diff должен показывать изменения только при добавлении новых файлов/типов).
48
+ 5. **Ответ**
49
+ - В финальном сообщении используйте структуру Summary + Testing.
50
+ - Каждое тестовое действие сопровождайте командой и результатом.
51
+
52
+ ## 5. Требования к коду
53
+
54
+ - Отсутствие магических строк: используйте константы.
55
+ - Для дат и меток времени используйте `TimestampSchema`.
56
+ - Обязательные поля явно помечать `z.string()` и т. п.; опциональные — через `.optional()` или `z.nullable()`.
57
+ - Для массивов всегда задавайте схему элементов (`z.array(SomeSchema)`).
58
+ - Если поле может принимать несколько форматов, используйте `z.union` с понятными вариантами.
59
+ - Обязательный минимум тестового покрытия — пример использования схемы в виде объектной литералы или демо‑валидации в комментарии.
60
+
61
+ ## 6. Чек-лист перед PR
62
+
63
+ - [ ] Все новые сущности экспортируются из соответствующего `index.ts`.
64
+ - [ ] Нет изменений в `build/` (если только намеренно не обновляли после `npm run build`).
65
+ - [ ] Запущен `npm run build` без ошибок.
66
+ - [ ] Changelog дополнен.
67
+
68
+ ## 7. Changelog
69
+
70
+ - 1.1 — актуализированы инструкции, добавлены требования к структуре ответов и чек-лист перед PR.
66
71
  - 1.0 — первоначальная версия каркаса.
package/README.md CHANGED
@@ -1 +1,12 @@
1
- # hh-contracts
1
+ ## Обзор системы
2
+
3
+ Система управления отелем состоит из 8 основных компонентов (не монорепо):
4
+
5
+ 1. **Контракты** - типизированные API контракты - ts package - zod
6
+ 2. **Общий API** - централизованный backend - nestjs CQRS DDD (mysaas.com/api)
7
+ 3. **Клиент на локальном сервере отеля** - клиент(подключется к api websocket или брокер собщений у устанавливается на локальный сервер в гостинице) позволяющий интегрироваться с сервером гостиничной программы отеля и получать из нее данные - go или nestjs или C#
8
+ 4. **Админка** - административная панель - react - chakra-ui (admin.mysaas.com)
9
+ 5. **Приложение персонала** - управление услугами, тарифами, администрирование отеля - react - chakra-ui (app.mysaas.com)
10
+ 6. **Сайт отеля и приложение сервисов для гостей** - сайты отелей (hotel1.mysaas.com, hotel2.mysaas.com  если у телей есть свой домены то приложение открывается по адресу - hotel1.com hotel2.com) и сервисы(просмотр и заказ услуг) (services.hotel1.mysaas.com, services.hotel2.mysaas.com  если у телей есть свой домены то приложение открывается по адресу - services.hotel1.com services.hotel2.com) - nextjs - chakra-ui сайты отелей
11
+ 7. **Лэндинг** - сайт самого сервиса - nextjs - chakra-ui
12
+ 8. **Digital Signage (экраны/плеер)** — отдельный PWA/SPA‑клиент для экранов (ресепшн, лобби, лифты, конференц‑залы и т. д.) с оффлайн‑кэшем и режимом киоска; управление контентом через **admin** и быстрые действия через **app**. Домены: player.mysaas.com, screens.hotel1.com.
@@ -14,4 +14,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./batch-translate.contract"), exports);
17
+ __exportStar(require("./translate-text.contract"), exports);
18
+ __exportStar(require("./translate-object.contract"), exports);
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.TranslateObjectContract = void 0;
37
+ const z = __importStar(require("zod"));
38
+ const common_1 = require("../../common");
39
+ const translate_api_1 = require("../translate.api");
40
+ const permissions_1 = require("../../permissions");
41
+ const roles_1 = require("../../roles");
42
+ const translate_schemas_1 = require("../translate.schemas");
43
+ const makeReqVariant = (entity, schema) => translate_schemas_1.BaseTranslateSchema.extend({ entity: z.literal(entity), object: schema });
44
+ const makeResVariant = (entity, schema) => z.object({
45
+ entity: z.literal(entity),
46
+ translations: z.partialRecord(common_1.LanguageKeysSchema, schema),
47
+ });
48
+ const TranslateObjectRequestVariants = [
49
+ makeReqVariant(common_1.ENTITIES.permissions, permissions_1.PermissionTranslationsSchema),
50
+ makeReqVariant(common_1.ENTITIES.roles, roles_1.RoleTranslationsSchema),
51
+ ];
52
+ const TranslateObjectResponseVariants = [
53
+ makeResVariant(common_1.ENTITIES.permissions, permissions_1.PermissionTranslationsSchema),
54
+ makeResVariant(common_1.ENTITIES.roles, roles_1.RoleTranslationsSchema),
55
+ ];
56
+ const TranslateObjectContractRequestSchema = z.discriminatedUnion('entity', TranslateObjectRequestVariants);
57
+ const TranslateObjectContractResponseSchema = z.discriminatedUnion('entity', TranslateObjectResponseVariants);
58
+ var TranslateObjectContract;
59
+ (function (TranslateObjectContract) {
60
+ TranslateObjectContract.getUrl = translate_api_1.TRANSLATE_API.object;
61
+ TranslateObjectContract.endpoint = translate_api_1.TRANSLATE_CONTROLLER.endpoints.object;
62
+ TranslateObjectContract.httpMethod = common_1.HTTP_METHODS.post;
63
+ TranslateObjectContract.RequestSchema = TranslateObjectContractRequestSchema;
64
+ TranslateObjectContract.ResponseSchema = TranslateObjectContractResponseSchema;
65
+ })(TranslateObjectContract || (exports.TranslateObjectContract = TranslateObjectContract = {}));
@@ -33,26 +33,22 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.BatchTranslateContract = void 0;
36
+ exports.TranslateTextContract = void 0;
37
37
  const z = __importStar(require("zod"));
38
38
  const common_1 = require("../../common");
39
39
  const translate_api_1 = require("../translate.api");
40
- const BatchTranslateContractRequestSchema = z.object({
40
+ const translate_schemas_1 = require("../translate.schemas");
41
+ const TranslateTextContractRequestSchema = translate_schemas_1.BaseTranslateSchema.extend({
41
42
  text: z.string().min(1),
42
- fromLang: common_1.LanguageKeysSchema,
43
- toLangs: z.array(common_1.LanguageKeysSchema).min(1),
44
43
  });
45
- const TranslationsSchema = z
46
- .object(Object.fromEntries(common_1.LANGUAGE_KEYS.map(l => [l, z.string().min(1).nullable()])))
47
- .partial();
48
- const BatchTranslateContractResponseSchema = z.object({
49
- translations: TranslationsSchema,
44
+ const TranslateTextContractResponseSchema = z.object({
45
+ translations: z.partialRecord(common_1.LanguageKeysSchema, z.string().min(1).nullable()),
50
46
  });
51
- var BatchTranslateContract;
52
- (function (BatchTranslateContract) {
53
- BatchTranslateContract.getUrl = translate_api_1.TRANSLATE_API.batch;
54
- BatchTranslateContract.endpoint = translate_api_1.TRANSLATE_CONTROLLER.endpoints.batch;
55
- BatchTranslateContract.httpMethod = common_1.HTTP_METHODS.post;
56
- BatchTranslateContract.RequestSchema = BatchTranslateContractRequestSchema;
57
- BatchTranslateContract.ResponseSchema = BatchTranslateContractResponseSchema;
58
- })(BatchTranslateContract || (exports.BatchTranslateContract = BatchTranslateContract = {}));
47
+ var TranslateTextContract;
48
+ (function (TranslateTextContract) {
49
+ TranslateTextContract.getUrl = translate_api_1.TRANSLATE_API.batch;
50
+ TranslateTextContract.endpoint = translate_api_1.TRANSLATE_CONTROLLER.endpoints.batch;
51
+ TranslateTextContract.httpMethod = common_1.HTTP_METHODS.post;
52
+ TranslateTextContract.RequestSchema = TranslateTextContractRequestSchema;
53
+ TranslateTextContract.ResponseSchema = TranslateTextContractResponseSchema;
54
+ })(TranslateTextContract || (exports.TranslateTextContract = TranslateTextContract = {}));
@@ -5,7 +5,8 @@ const utils_1 = require("../common/utils");
5
5
  exports.TRANSLATE_CONTROLLER = {
6
6
  prefix: 'translate',
7
7
  endpoints: {
8
- batch: '',
8
+ batch: 'text',
9
+ object: 'object',
9
10
  },
10
11
  };
11
12
  exports.TRANSLATE_API = (0, utils_1.createApi)(exports.TRANSLATE_CONTROLLER);
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.BaseTranslateSchema = void 0;
37
+ const z = __importStar(require("zod"));
38
+ const common_1 = require("../common");
39
+ exports.BaseTranslateSchema = z.object({
40
+ fromLang: common_1.LanguageKeysSchema,
41
+ toLangs: z.array(common_1.LanguageKeysSchema).min(1),
42
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hh-contracts",
3
- "version": "0.0.85",
3
+ "version": "0.0.86",
4
4
  "description": "",
5
5
  "main": "./build/index.js",
6
6
  "scripts": {
@@ -1 +1,2 @@
1
- export * from './batch-translate.contract';
1
+ export * from './translate-text.contract';
2
+ export * from './translate-object.contract';
@@ -0,0 +1,52 @@
1
+ import * as z from 'zod';
2
+ import { HTTP_METHODS, LanguageKeysSchema, ENTITIES } from '../../common';
3
+ import { TRANSLATE_API, TRANSLATE_CONTROLLER } from '../translate.api';
4
+ import { PermissionTranslationsSchema } from '../../permissions';
5
+ import { RoleTranslationsSchema } from '../../roles';
6
+ import { BaseTranslateSchema } from '../translate.schemas';
7
+
8
+ const makeReqVariant = <E extends (typeof ENTITIES)[keyof typeof ENTITIES], S extends z.ZodTypeAny>(
9
+ entity: E,
10
+ schema: S,
11
+ ) => BaseTranslateSchema.extend({ entity: z.literal(entity), object: schema });
12
+
13
+ const makeResVariant = <E extends (typeof ENTITIES)[keyof typeof ENTITIES], S extends z.ZodTypeAny>(
14
+ entity: E,
15
+ schema: S,
16
+ ) =>
17
+ z.object({
18
+ entity: z.literal(entity),
19
+ translations: z.partialRecord(LanguageKeysSchema, schema),
20
+ });
21
+
22
+ const TranslateObjectRequestVariants = [
23
+ makeReqVariant(ENTITIES.permissions, PermissionTranslationsSchema),
24
+ makeReqVariant(ENTITIES.roles, RoleTranslationsSchema),
25
+ ] as const;
26
+
27
+ const TranslateObjectResponseVariants = [
28
+ makeResVariant(ENTITIES.permissions, PermissionTranslationsSchema),
29
+ makeResVariant(ENTITIES.roles, RoleTranslationsSchema),
30
+ ] as const;
31
+
32
+ const TranslateObjectContractRequestSchema = z.discriminatedUnion(
33
+ 'entity',
34
+ TranslateObjectRequestVariants,
35
+ );
36
+
37
+ const TranslateObjectContractResponseSchema = z.discriminatedUnion(
38
+ 'entity',
39
+ TranslateObjectResponseVariants,
40
+ );
41
+
42
+ export namespace TranslateObjectContract {
43
+ export const getUrl = TRANSLATE_API.object;
44
+ export const endpoint = TRANSLATE_CONTROLLER.endpoints.object;
45
+ export const httpMethod = HTTP_METHODS.post;
46
+
47
+ export const RequestSchema = TranslateObjectContractRequestSchema;
48
+ export type TRequest = z.infer<typeof RequestSchema>;
49
+
50
+ export const ResponseSchema = TranslateObjectContractResponseSchema;
51
+ export type TResponse = z.infer<typeof ResponseSchema>;
52
+ }
@@ -0,0 +1,24 @@
1
+ import * as z from 'zod';
2
+ import { HTTP_METHODS, LanguageKeysSchema } from '../../common';
3
+ import { TRANSLATE_API, TRANSLATE_CONTROLLER } from '../translate.api';
4
+ import { BaseTranslateSchema } from '../translate.schemas';
5
+
6
+ const TranslateTextContractRequestSchema = BaseTranslateSchema.extend({
7
+ text: z.string().min(1),
8
+ });
9
+
10
+ const TranslateTextContractResponseSchema = z.object({
11
+ translations: z.partialRecord(LanguageKeysSchema, z.string().min(1).nullable()),
12
+ });
13
+
14
+ export namespace TranslateTextContract {
15
+ export const getUrl = TRANSLATE_API.batch;
16
+ export const endpoint = TRANSLATE_CONTROLLER.endpoints.batch;
17
+ export const httpMethod = HTTP_METHODS.post;
18
+
19
+ export const RequestSchema = TranslateTextContractRequestSchema;
20
+ export type TRequest = z.infer<typeof RequestSchema>;
21
+
22
+ export const ResponseSchema = TranslateTextContractResponseSchema;
23
+ export type TResponse = z.infer<typeof ResponseSchema>;
24
+ }
@@ -3,7 +3,8 @@ import { createApi, TController } from '../common/utils';
3
3
  export const TRANSLATE_CONTROLLER = {
4
4
  prefix: 'translate',
5
5
  endpoints: {
6
- batch: '',
6
+ batch: 'text',
7
+ object: 'object',
7
8
  },
8
9
  } as const satisfies TController;
9
10
 
@@ -0,0 +1,7 @@
1
+ import * as z from 'zod';
2
+ import { LanguageKeysSchema } from '../common';
3
+
4
+ export const BaseTranslateSchema = z.object({
5
+ fromLang: LanguageKeysSchema,
6
+ toLangs: z.array(LanguageKeysSchema).min(1),
7
+ });
@@ -1,29 +0,0 @@
1
- import * as z from 'zod';
2
- import { HTTP_METHODS, LanguageKeysSchema, LANGUAGE_KEYS } from '../../common';
3
- import { TRANSLATE_API, TRANSLATE_CONTROLLER } from '../translate.api';
4
-
5
- const BatchTranslateContractRequestSchema = z.object({
6
- text: z.string().min(1),
7
- fromLang: LanguageKeysSchema,
8
- toLangs: z.array(LanguageKeysSchema).min(1),
9
- });
10
-
11
- const TranslationsSchema = z
12
- .object(Object.fromEntries(LANGUAGE_KEYS.map(l => [l, z.string().min(1).nullable()])))
13
- .partial();
14
-
15
- const BatchTranslateContractResponseSchema = z.object({
16
- translations: TranslationsSchema,
17
- });
18
-
19
- export namespace BatchTranslateContract {
20
- export const getUrl = TRANSLATE_API.batch;
21
- export const endpoint = TRANSLATE_CONTROLLER.endpoints.batch;
22
- export const httpMethod = HTTP_METHODS.post;
23
-
24
- export const RequestSchema = BatchTranslateContractRequestSchema;
25
- export type TRequest = z.infer<typeof RequestSchema>;
26
-
27
- export const ResponseSchema = BatchTranslateContractResponseSchema;
28
- export type TResponse = z.infer<typeof ResponseSchema>;
29
- }