{
  "product": "Specification (reference)",
  "title": "Validation Library",
  "summary": "Declare a schema, validate unknown input, get typed data or precise errors.",
  "category": "libraries",
  "entries": [
    {
      "path": [
        "AI",
        "Schema",
        "Primitive types"
      ],
      "value": "string, number, boolean, date, bigint",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Schema",
        "Objects with per-key schemas"
      ],
      "value": "",
      "status": "yes",
      "note": "unknown keys stripped, passed or rejected"
    },
    {
      "path": [
        "AI",
        "Schema",
        "Arrays, tuples and records"
      ],
      "value": "",
      "status": "yes",
      "note": "with length constraints"
    },
    {
      "path": [
        "AI",
        "Schema",
        "Unions, discriminated unions and intersections"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Schema",
        "Optional, nullable and default values"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Schema",
        "Enums and literals"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Schema",
        "Recursive schemas"
      ],
      "value": "",
      "status": "yes",
      "note": "self-referential types"
    },
    {
      "path": [
        "AI",
        "Constraints",
        "String constraints"
      ],
      "value": "min, max, regex, email, url, uuid",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Constraints",
        "Numeric constraints"
      ],
      "value": "min, max, int, multipleOf",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Constraints",
        "Custom predicates with messages"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Constraints",
        "Cross-field refinement"
      ],
      "value": "",
      "status": "yes",
      "note": "e.g. password confirmation"
    },
    {
      "path": [
        "AI",
        "Parsing",
        "Parse returns typed data or throws"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Parsing",
        "Safe parse returns a result union"
      ],
      "value": "",
      "status": "yes",
      "note": "no exceptions in the happy path"
    },
    {
      "path": [
        "AI",
        "Parsing",
        "Coercion mode"
      ],
      "value": "\"1\" → 1",
      "status": "yes",
      "note": "explicit, never implicit"
    },
    {
      "path": [
        "AI",
        "Parsing",
        "Transform values during parse"
      ],
      "value": "",
      "status": "yes",
      "note": "and chain transforms"
    },
    {
      "path": [
        "AI",
        "Errors",
        "Every issue carries a path"
      ],
      "value": "user.addresses[1].zip",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Errors",
        "All issues collected, not just the first"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Errors",
        "Messages are customisable per rule"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Interop",
        "Infer a static type from a schema"
      ],
      "value": "",
      "status": "yes",
      "note": "in typed languages"
    },
    {
      "path": [
        "AI",
        "Interop",
        "Convert to and from JSON Schema"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    }
  ]
}
