Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@scalar/validation

Package Overview
Dependencies
Maintainers
8
Versions
7
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@scalar/validation

A lightweight, schema-first validation library for Scalar

Source
npmnpm
Version
0.3.2
Version published
Weekly downloads
314K
-27.14%
Maintainers
8
Weekly downloads
 
Created
Source

@scalar/validation

Small, schema-first helpers to check unknown data and coerce it into predictable shapes. Schemas are plain JavaScript objects (easy to serialize or log), and TypeScript can infer output types with Static.

Install

This package lives in the Scalar monorepo. In workspace consumers:

pnpm add @scalar/validation

Quick start

import { coerce, number, object, string, validate, type Static } from '@scalar/validation'

const userSchema = object({
  id: number(),
  name: string(),
})

type User = Static<typeof userSchema>

validate(userSchema, { id: 1, name: 'Ada' }) // true
validate(userSchema, { id: 1, name: 2 }) // false

// Best-effort shaping: invalid primitives fall back to defaults
coerce(userSchema, { id: 'x', name: 'Ada' }) // { id: 0, name: 'Ada' }

Concepts

validate(schema, value)

Returns true if value satisfies schema, otherwise false.

  • undefined schema — always fails.
  • number() — finite numbers only (NaN and Infinity fail).
  • object({ ... }) — value must be a plain object (see Objects and records). Each declared property is validated; extra properties are not rejected.
  • union([...]) — matches if any branch matches.

coerce(schema, value)

Returns a value typed as Static<typeof schema>. It is not strict validation: it normalizes toward the schema.

  • Valid primitives are returned as-is.
  • Invalid number0, invalid string'', invalid booleanfalse.
  • nullable() — result is always null.
  • notDefined() — result is always undefined.
  • literal(x) — result is always the schema’s literal x (the declared constant).
  • array / object / record — built recursively; wrong shapes become empty containers or defaulted fields.
  • union — picks a branch using a scoring heuristic (object shape and literal tags weigh more than “property exists”).
  • Optional third argument: internal WeakMap cache for cyclic graphs; you normally omit it.

Use validate when you need a yes/no. Use coerce when you want a stable default-filled structure (for example normalizing config or parsed JSON).

Schema builders

BuilderValidatesStatic type (idea)
number()Finite numbernumber
string()stringstring
boolean()booleanboolean
nullable()null onlynull
notDefined()undefined onlyundefined
any()Anythingany
literal(v)Strict equality to vtypeof v
array(item)Array; every item matches itemStatic<item>[]
record(key, value)Plain object; keys and values matchRecord<…, …>
object(props)Plain object; each key in propsObject of static fields
union([a, b, …])Matches any memberUnion of branches
optional(s)undefined or matches sStatic<s> | undefined; in object({ … }), property becomes key?: Static<s>
lazy(() => schema)Defers schema (recursion)Inferred from inner schema
evaluate(fn, schema)Runs fn(value) then validates schemaStatic<schema>
import { lazy, object, string, union, literal } from '@scalar/validation'

// Discriminated-style union
const message = union([
  object({ type: literal('text'), body: string() }),
  object({ type: literal('ping') }),
])

evaluate — parse then validate

import { evaluate, number, string } from '@scalar/validation'

const trimmed = evaluate((v) => (typeof v === 'string' ? v.trim() : v), string())

validate(trimmed, '  hi  ') // true (after trim)

Objects and records

Plain object means: not null, and prototype is Object.prototype or null. Arrays, Date, and most class instances do not count as objects for object() / record() validation.

object checks only the keys you list. Missing keys are read as undefined, so pair them with optional(...) when a field may be absent.

record during validation checks every key against the key schema and every value against the value schema. During coercion, entries keep their string keys as-is and only values are coerced.

TypeScript: Static and Schema

  • Static<S> — inferred TypeScript type for data that matches schema S (depth-limited to avoid infinite recursion on very deep types).
  • Schema — union of all schema shapes; use when you store or pass schemas around.

Development

pnpm --filter @scalar/validation test
pnpm --filter @scalar/validation types:check
pnpm --filter @scalar/validation build

License

MIT

Keywords

validation

FAQs

Package last updated on 29 Apr 2026

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts