Skip to content

Свои правила и схемы ​

Встроенных правил не хватает? Своё правило — это обычная функция. Для сложных случаев можно написать и свою схему.

Своё правило через check ​

Самый простой способ — check. Оберните его в функцию, чтобы переиспользовать и передавать сообщение:

ts
import { check, pipe, number, string } from 'tinyval';

const even = (msg = 'Должно быть чётным') => check<number>((v) => v % 2 === 0, msg);
const noSpaces = (msg = 'Без пробелов') => check<string>((v) => !/\s/.test(v), msg);

pipe(number(), even());
pipe(string(), noSpaces());

Проверка получает вторым аргументом соседние поля (parent) и все данные (root):

ts
const after = (field: string, msg = 'Должно быть позже') =>
  check<Date>((v, { parent }) => v > (parent as any)[field], msg);

object({
  start: coerce.date(),
  end: pipe(coerce.date(), after('start')),
});

Асинхронное правило ​

ts
const unique = (table: string) =>
  checkAsync<string>(async (v) => !(await db.exists(table, v)), 'Уже занято');

const Signup = object({ email: pipe(string(), email(), unique('users')) });
await validateAsync(Signup, body);

Подробнее — checkAsync.

Своя схема ​

Схему создаёт createSchema из функции проверки. Функция возвращает значение (возможно, преобразованное) или результат fail(...). Пример схемы для bigint:

ts
import { createSchema, fail, isEmpty, type Message } from 'tinyval';

export const bigint = (msg?: Message) =>
  createSchema<bigint>((value, ctx, path) => {
    if (isEmpty(value)) return fail(ctx, path, 'required', msg);
    if (typeof value !== 'bigint') return fail(ctx, path, 'bigint', msg);
    return value;
  });
  • fail(ctx, path, code, msg?, params?) — записывает ошибку и возвращает специальный маркер.
  • isEmpty(value) — true для undefined, null и ''.
  • Для своего кода ошибки добавьте текст через setMessages: setMessages({ bigint: 'Должно быть bigint' }). Без этого используется сообщение invalid.

Своя схема работает везде: в object, array, pipe, optional, тип выводится через Infer, а ещё она поддерживает Standard Schema.

См. также ​

  • check
  • checkAsync
  • preprocess — когда нужно только подготовить значение
  • transform — когда нужно изменить результат