Skip to content

Генерация схем валидации ​

createValidators принимает список файлов и настройки проекта:

ts
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. Экспортировать их не обязательно. Файлы без объявленных типов запроса и ответа пропускаются. Если объявлен только один из двух типов или не найдено ни одного контракта (включая пустой список файлов), вызов завершится ошибкой.

ts
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
input: Array<string>

Абсолютные пути входных файлов

ts
tsconfigPath: string

Путь к tsconfig.json на диске для разрешения импортов и path aliases. Относительный путь разрешается от process.cwd()

ts
requestDeclaration: string

Имя локальной декларации типа запроса, например TypeRequest

ts
responseDeclaration: string

Имя локальной декларации типа ответа, например TypeResponse

ts
readFile?: (filePath: string) => string | undefined

Чтение исходников по абсолютному пути. Возврат undefined означает чтение с диска

ts
getDegraded?: (names: Array<string>) => void

Получает отсортированные уникальные имена свойств или root-деклараций, деградировавших до any, без полных путей. Вызывается один раз за запуск при наличии деградаций

Результат ​

ts
result: Array<{
  filePath: string;
  schema: {
    request: TypeSchema;
    response: TypeSchema;
  };
}>

Схемы валидации найденных контрактов. filePath — абсолютный путь файла; schema.request и schema.response содержат сериализуемые схемы валидации запроса и ответа

ts
deps: Record<string, Array<string>>

Обратная карта зависимостей: импортируемый файл → затронутые entry-файлы. Все пути в ключах и значениях абсолютные

In-memory файлы ​

createValidators читает файлы с диска, из памяти или из обоих источников. Пример чтения контрактов из памяти:

ts
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 на лету генерирует схемы валидации) и сохранять на диск единым батчем.

MIT License