Standard Schema (CZ článek)

Back to blog

Standardní rozhraní pro validační knihovny

3 min read
Table of Contents

A common interface for TypeScript validation libraries

Cíle a popis

Standard Schéma je společné rozhraní navržené pro implementaci v JavaScriptových a TypeScriptových validačních knihovnách. Jde o snahu normalizace způsobu implementace validačních knihoven, ať se devs nemusí učit 10 různých schémat a příručku pravidel k nim.

Specifikace Standard Schema má několik cílů:

  • Podpora runtime validace
  • Podpora statické inference typů
  • Minimalismus
  • Vyhnutí se konfliktům API (vše je zabaleno do jediné vlastnosti ~standard)
  • Bez negativního dopadu na DX (prefix ~standard minimalizuje rušení v autokompletaci)

Specifikace sestává z jediného TS interface StandardSchemaV1, které by měla implementovat každá knihovna schémat, jež chce být v souladu se standardem. Toto rozhraní je dostupné jako balíček na npm, ale doporučuje se ho zkopírovat do vlastního repozitáře (dohromady to má 70 řádků, z toho 30 jsou komentáře). Celý interface je k dispozici na Githubu nebo na oficiální webovce

Příklad

Vytvoření jednoduchého standardního validátoru (např. utils/helpers/schema-validator.ts) v jakékoliv aplikaci vypadá až příliš jednoduše:

import type {StandardSchemaV1} from '@standard-schema/spec';

export async function standardValidate<T extends StandardSchemaV1>(
  schema: T,
  input: StandardSchemaV1.InferInput<T>
): Promise<StandardSchemaV1.InferOutput<T>> {
  let result = schema['~standard'].validate(input);
  if (result instanceof Promise) result = await result;

  // if the `issues` field exists, the validation failed
  if (result.issues) {
    throw new Error(JSON.stringify(result.issues, null, 2));
  }

  return result.value;
}

A následně lze použít univerzálně:

import * as z from 'zod';
import * as v from 'valibot';
import {type} from 'arktype';

const zodResult = await standardValidate(z.string(), 'hello');
const valibotResult = await standardValidate(v.string(), 'hello');
const arktypeResult = await standardValidate(type('string'), 'hello');

Tvůrci a uživatelé

Vytvořeno v spolupráci mezi tvůrci nástrojů Zod, Valibot a ArkType.

V čase napsaní tohoto článku specifikaci implementují knihovny jako

  • Zod
  • Valibot
  • ArkType
  • TypeMap
  • FormGator

Tím pádem je možné používat při tvorbě schémat v rámci knihoven jako

  • tRPC
  • Tanstack Form
  • Qwik
  • OpenAuth
  • formwerk
  • upfetch
  • Hono Middleware
  • a další…

Odkazy