Генерация схем валидации
createValidators принимает список файлов и настройки проекта:
import path from 'node:path';
import { createValidators } from '@arfa-tools/generator/api-contract-check/builder';
const { result, deps } = createValidators(
[path.resolve('src/api/getUser.ts')],
{
tsconfigPath: 'tsconfig.json',
requestDeclaration: 'TypeRequest',
responseDeclaration: 'TypeResponse',
getDegraded: (names) => console.log(names),
}
);Input-файлы должны локально объявлять оба root-типа через type или interface. Экспортировать их не обязательно. Файлы без объявленных типов запроса и ответа пропускаются. Если объявлен только один из двух типов или не найдено ни одного контракта (включая пустой список файлов), вызов завершится ошибкой.
import type { TypeUser } from '../models/TypeUser';
type TypeRequest = { id: string; };
type TypeResponse = TypeUser;Типы могут ссылаться на именованные импорты, включая import type, re-export и export * из barrel-файлов. Поддерживаются path aliases из tsconfig.json.
Аргументы
Первый аргумент — input, второй — объект с остальными перечисленными полями.
ts | Абсолютные пути входных файлов |
ts | Путь к |
ts | Имя локальной декларации типа запроса, например |
ts | Имя локальной декларации типа ответа, например |
ts | Чтение исходников по абсолютному пути. Возврат |
ts | Получает отсортированные уникальные имена свойств или root-деклараций, деградировавших до |
Результат
ts | Схемы валидации найденных контрактов. |
ts | Обратная карта зависимостей: импортируемый файл → затронутые entry-файлы. Все пути в ключах и значениях абсолютные |
In-memory файлы
createValidators читает файлы с диска, из памяти или из обоих источников. Пример чтения контрактов из памяти:
const entryFilePath = '/virtual/api/getUser.ts';
const memory: Record<string, string> = {
[entryFilePath]: `
import type { TypeUser } from '../models/TypeUser';
type TypeRequest = { id: string };
type TypeResponse = TypeUser;
`,
'/virtual/models/TypeUser.ts': 'export type TypeUser = { name: string };',
};
const { result } = createValidators(
[entryFilePath],
{ ...options, readFile: (filePath) => memory[filePath] }
);Это позволяет делать многочисленные трансформации и операции над файлами (например, если типы запроса и ответа выводятся из OpenAPI, а api-contract-check на лету генерирует схемы валидации) и сохранять на диск единым батчем.