@ultimat3/schema
Advanced tools
+1
-1
| { | ||
| "name": "@ultimat3/schema", | ||
| "version": "1.0.0", | ||
| "version": "1.1.0", | ||
| "description": "Ultimate's validation seam: Standard Schema interface, the t namespace, JSON Schema output", | ||
@@ -5,0 +5,0 @@ "license": "MIT", |
| import type { SchemaNode } from './node'; | ||
| import { type InferInput, type InferOutput, type StandardIssue, type StandardResult, type StandardSchemaV1 } from './standard'; | ||
| export declare const VENDOR = "ultimate"; | ||
| export type Path = readonly PropertyKey[]; | ||
| export interface CheckOk<Out> { | ||
| readonly ok: true; | ||
| readonly value: Out; | ||
| } | ||
| export interface CheckErr { | ||
| readonly ok: false; | ||
| readonly issues: readonly StandardIssue[]; | ||
| } | ||
| export type CheckResult<Out> = CheckOk<Out> | CheckErr; | ||
| export type Check<Out> = (value: unknown, path: Path) => CheckResult<Out>; | ||
| export declare function pass<Out>(value: Out): CheckOk<Out>; | ||
| export declare function fail(path: Path, message: string): CheckErr; | ||
| export declare function failWith(issues: readonly StandardIssue[]): CheckErr; | ||
| /** `expected uuid, received "abc"` — the message an agent can act on without guessing. */ | ||
| export declare function expected(what: string, value: unknown): string; | ||
| export declare function describeValue(value: unknown): string; | ||
| export interface Schema<In = unknown, Out = In> extends StandardSchemaV1<In, Out> { | ||
| /** The introspectable IR. JSON Schema, OpenAPI, MCP and coercion all read this. */ | ||
| readonly node: SchemaNode; | ||
| parse(value: unknown, root?: string): Out; | ||
| safeParse(value: unknown): StandardResult<Out>; | ||
| optional(): Schema<In | undefined, Out | undefined>; | ||
| /** | ||
| * Distinct from `optional()`: absent and null are different facts. A nullable column holds a | ||
| * row that says "no cover image"; an optional field says the caller did not mention it. SQL | ||
| * has always drawn that line, so the schema has to as well or a round-trip loses it. | ||
| */ | ||
| nullable(): Schema<In | null, Out | null>; | ||
| default(value: Out): Schema<In | undefined, Out>; | ||
| describe(description: string): Schema<In, Out>; | ||
| } | ||
| /** The general constraint for "some schema". Methods are bivariant, so this is a real supertype. */ | ||
| export type AnySchema = Schema<unknown, unknown>; | ||
| export type Shape = Readonly<Record<string, AnySchema>>; | ||
| export type Simplify<T> = { | ||
| [K in keyof T]: T[K]; | ||
| } & {}; | ||
| type OptionalOutputKeys<S extends Shape> = { | ||
| [K in keyof S]: undefined extends InferOutput<S[K]> ? K : never; | ||
| }[keyof S]; | ||
| type OptionalInputKeys<S extends Shape> = { | ||
| [K in keyof S]: undefined extends InferInput<S[K]> ? K : never; | ||
| }[keyof S]; | ||
| export type ShapeOutput<S extends Shape> = Simplify<{ | ||
| [K in Exclude<keyof S, OptionalOutputKeys<S>>]: InferOutput<S[K]>; | ||
| } & { | ||
| [K in OptionalOutputKeys<S>]?: InferOutput<S[K]>; | ||
| }>; | ||
| export type ShapeInput<S extends Shape> = Simplify<{ | ||
| [K in Exclude<keyof S, OptionalInputKeys<S>>]: InferInput<S[K]>; | ||
| } & { | ||
| [K in OptionalInputKeys<S>]?: InferInput<S[K]>; | ||
| }>; | ||
| export declare function makeSchema<In, Out>(node: SchemaNode, check: Check<Out>): Schema<In, Out>; | ||
| /** Read the check back off a builtin schema so composites can reuse it. */ | ||
| export declare function checkOf<In, Out>(schema: Schema<In, Out>): Check<Out>; | ||
| export {}; | ||
| //# sourceMappingURL=builder.d.ts.map |
| {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["builder.ts"],"names":[],"mappings":"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"} |
| // Single responsibility: the `Schema` type every builtin validator returns, and the factory | ||
| // that turns a check function plus an IR node into a Standard-Schema-conforming object. | ||
| import { ValidationFailedError } from './errors'; | ||
| import { formatPath, } from './standard'; | ||
| export const VENDOR = 'ultimate'; | ||
| export function pass(value) { | ||
| return { ok: true, value }; | ||
| } | ||
| export function fail(path, message) { | ||
| return { ok: false, issues: [{ message, path: [...path] }] }; | ||
| } | ||
| export function failWith(issues) { | ||
| return { ok: false, issues }; | ||
| } | ||
| /** `expected uuid, received "abc"` — the message an agent can act on without guessing. */ | ||
| export function expected(what, value) { | ||
| return `expected ${what}, received ${describeValue(value)}`; | ||
| } | ||
| export function describeValue(value) { | ||
| if (value === undefined) | ||
| return 'undefined'; | ||
| if (value === null) | ||
| return 'null'; | ||
| if (typeof value === 'string') | ||
| return JSON.stringify(value); | ||
| if (typeof value === 'number' || typeof value === 'boolean') | ||
| return String(value); | ||
| if (Array.isArray(value)) | ||
| return `array(${value.length})`; | ||
| if (value instanceof Date) | ||
| return `Date(${value.toISOString()})`; | ||
| return typeof value; | ||
| } | ||
| function toIssues(result) { | ||
| return result.issues.map((issue) => ({ | ||
| path: formatPath(issue.path), | ||
| expected: issue.message, | ||
| received: '', | ||
| message: issue.message, | ||
| })); | ||
| } | ||
| export function makeSchema(node, check) { | ||
| const schema = { | ||
| '~standard': { | ||
| version: 1, | ||
| vendor: VENDOR, | ||
| validate: (value) => { | ||
| const result = check(value, []); | ||
| return result.ok ? { value: result.value } : { issues: result.issues }; | ||
| }, | ||
| }, | ||
| node, | ||
| parse(value, root = 'value') { | ||
| const result = check(value, []); | ||
| if (result.ok) | ||
| return result.value; | ||
| throw new ValidationFailedError(toIssues(result), root); | ||
| }, | ||
| safeParse(value) { | ||
| const result = check(value, []); | ||
| return result.ok ? { value: result.value } : { issues: result.issues }; | ||
| }, | ||
| optional() { | ||
| return makeSchema({ ...node, optional: true }, (value, path) => (value === undefined ? pass(undefined) : check(value, path))); | ||
| }, | ||
| nullable() { | ||
| return makeSchema({ ...node, nullable: true }, (value, path) => value === null ? pass(null) : check(value, path)); | ||
| }, | ||
| default(fallback) { | ||
| return makeSchema({ ...node, hasDefault: true, default: fallback }, (value, path) => (value === undefined ? pass(fallback) : check(value, path))); | ||
| }, | ||
| describe(description) { | ||
| return makeSchema({ ...node, description }, check); | ||
| }, | ||
| }; | ||
| return schema; | ||
| } | ||
| /** Read the check back off a builtin schema so composites can reuse it. */ | ||
| export function checkOf(schema) { | ||
| return (value, path) => { | ||
| const result = schema['~standard'].validate(value); | ||
| if (result instanceof Promise) { | ||
| return fail(path, 'expected a synchronous schema, received an async one'); | ||
| } | ||
| if (result.issues === undefined) | ||
| return pass(result.value); | ||
| return failWith(result.issues.map((issue) => ({ | ||
| message: issue.message, | ||
| path: [...path, ...(issue.path ?? [])], | ||
| }))); | ||
| }; | ||
| } | ||
| //# sourceMappingURL=builder.js.map |
| {"version":3,"file":"builder.js","sourceRoot":"","sources":["builder.ts"],"names":[],"mappings":"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"} |
| import type { SchemaNode } from './node'; | ||
| export type QuerySource = URLSearchParams | Readonly<Record<string, string | readonly string[] | undefined>>; | ||
| /** | ||
| * Coerce one raw value toward `node`. Never throws and never invents data: anything it cannot | ||
| * confidently convert is returned untouched so validation produces the real error message. | ||
| */ | ||
| export declare function coerceNode(node: SchemaNode, raw: unknown): unknown; | ||
| /** | ||
| * Coerce a query string / route params object against a schema, ready to `parse()`. | ||
| * Unknown keys are passed through — the schema decides what to keep. | ||
| */ | ||
| export declare function coerceQuery(schema: unknown, source: QuerySource): Record<string, unknown>; | ||
| /** Coerce an arbitrary record (route params, form data) against a schema. */ | ||
| export declare function coerceInput(schema: unknown, raw: Readonly<Record<string, unknown>>): Record<string, unknown>; | ||
| //# sourceMappingURL=coerce.d.ts.map |
| {"version":3,"file":"coerce.d.ts","sourceRoot":"","sources":["coerce.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAMzC,MAAM,MAAM,WAAW,GACnB,eAAe,GACf,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;AAErE;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CA2DlE;AAcD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAYzF;AAMD,6EAA6E;AAC7E,wBAAgB,WAAW,CACzB,MAAM,EAAE,OAAO,EACf,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACrC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAOzB"} |
-123
| // Single responsibility: HTTP-boundary coercion. Kept out of validation on purpose — only the | ||
| // HTTP layer has strings that "mean" numbers. Actions, jobs and MCP calls receive real JSON and | ||
| // must never get this leniency. | ||
| import { tryIntrospect } from './provider'; | ||
| const TRUE_VALUES = new Set(['1', 'true', 'yes', 'on']); | ||
| const FALSE_VALUES = new Set(['0', 'false', 'no', 'off', '']); | ||
| /** | ||
| * Coerce one raw value toward `node`. Never throws and never invents data: anything it cannot | ||
| * confidently convert is returned untouched so validation produces the real error message. | ||
| */ | ||
| export function coerceNode(node, raw) { | ||
| if (raw === undefined || raw === null) | ||
| return raw; | ||
| switch (node.kind) { | ||
| case 'number': { | ||
| if (typeof raw !== 'string') | ||
| return raw; | ||
| const value = Number(raw); | ||
| return raw.trim() !== '' && Number.isFinite(value) ? value : raw; | ||
| } | ||
| case 'boolean': { | ||
| if (typeof raw !== 'string') | ||
| return raw; | ||
| const lowered = raw.toLowerCase(); | ||
| if (TRUE_VALUES.has(lowered)) | ||
| return true; | ||
| if (FALSE_VALUES.has(lowered)) | ||
| return false; | ||
| return raw; | ||
| } | ||
| case 'date': { | ||
| if (typeof raw !== 'string') | ||
| return raw; | ||
| const parsed = new Date(raw); | ||
| return Number.isNaN(parsed.getTime()) ? raw : parsed; | ||
| } | ||
| case 'array': { | ||
| const items = Array.isArray(raw) ? raw : [raw]; | ||
| const itemNode = node.items; | ||
| return itemNode === undefined ? items : items.map((item) => coerceNode(itemNode, item)); | ||
| } | ||
| case 'record': { | ||
| if (typeof raw !== 'object' || node.valueNode === undefined) | ||
| return raw; | ||
| const out = {}; | ||
| for (const [key, value] of Object.entries(raw)) { | ||
| out[key] = coerceNode(node.valueNode, value); | ||
| } | ||
| return out; | ||
| } | ||
| case 'object': { | ||
| if (typeof raw !== 'object' || node.properties === undefined) | ||
| return raw; | ||
| const source = raw; | ||
| const out = { ...source }; | ||
| for (const [key, child] of Object.entries(node.properties)) { | ||
| if (key in source) | ||
| out[key] = coerceNode(child, source[key]); | ||
| } | ||
| return out; | ||
| } | ||
| case 'money': { | ||
| if (typeof raw !== 'object') | ||
| return raw; | ||
| const source = raw; | ||
| const minor = typeof source['minor'] === 'string' ? Number(source['minor']) : source['minor']; | ||
| return Number.isFinite(minor) ? { ...source, minor } : raw; | ||
| } | ||
| case 'union': { | ||
| // Only unambiguous single-kind unions (e.g. `number | undefined`) are safe to coerce. | ||
| const kinds = new Set((node.anyOf ?? []).map((member) => member.kind)); | ||
| if (kinds.size !== 1) | ||
| return raw; | ||
| const [member] = node.anyOf ?? []; | ||
| return member === undefined ? raw : coerceNode(member, raw); | ||
| } | ||
| default: | ||
| return raw; | ||
| } | ||
| } | ||
| function toRecord(source) { | ||
| if (!(source instanceof URLSearchParams)) { | ||
| return { ...source }; | ||
| } | ||
| const out = {}; | ||
| for (const key of new Set(source.keys())) { | ||
| const all = source.getAll(key); | ||
| out[key] = all.length > 1 ? all : all[0]; | ||
| } | ||
| return out; | ||
| } | ||
| /** | ||
| * Coerce a query string / route params object against a schema, ready to `parse()`. | ||
| * Unknown keys are passed through — the schema decides what to keep. | ||
| */ | ||
| export function coerceQuery(schema, source) { | ||
| const record = toRecord(source); | ||
| const node = tryIntrospect(schema); | ||
| if (node?.properties === undefined) | ||
| return record; | ||
| const out = { ...record }; | ||
| for (const [key, child] of Object.entries(node.properties)) { | ||
| if (!(key in record)) | ||
| continue; | ||
| const raw = record[key]; | ||
| out[key] = coerceNode(child, child.kind === 'array' ? (raw ?? []) : normaliseSingle(raw)); | ||
| } | ||
| return out; | ||
| } | ||
| function normaliseSingle(raw) { | ||
| return Array.isArray(raw) ? raw[raw.length - 1] : raw; | ||
| } | ||
| /** Coerce an arbitrary record (route params, form data) against a schema. */ | ||
| export function coerceInput(schema, raw) { | ||
| const node = tryIntrospect(schema); | ||
| if (node === undefined) | ||
| return { ...raw }; | ||
| const coerced = coerceNode(node, raw); | ||
| return typeof coerced === 'object' && coerced !== null | ||
| ? coerced | ||
| : { ...raw }; | ||
| } | ||
| //# sourceMappingURL=coerce.js.map |
| {"version":3,"file":"coerce.js","sourceRoot":"","sources":["coerce.ts"],"names":[],"mappings":"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"} |
| /** Same well-known symbol `@ultimat3/core` brands with. Keep in sync, never rename. */ | ||
| export declare const ULTIMATE_ERROR_BRAND: unique symbol; | ||
| export interface SchemaErrorCodeDeclaration { | ||
| readonly title: string; | ||
| readonly docs?: string | undefined; | ||
| } | ||
| /** | ||
| * Pass to `registerErrorCodes()` from a package that may import both tiers (the CLI does this | ||
| * at boot) so the terminal and the dev overlay render these codes identically. | ||
| */ | ||
| export declare const SCHEMA_ERROR_CODES: Readonly<Record<string, SchemaErrorCodeDeclaration>>; | ||
| export interface SchemaErrorInit { | ||
| readonly code: string; | ||
| readonly cause: string; | ||
| readonly fix: string; | ||
| readonly docs?: string | undefined; | ||
| readonly meta?: Readonly<Record<string, unknown>> | undefined; | ||
| } | ||
| export interface SchemaErrorJSON { | ||
| readonly code: string; | ||
| readonly title: string; | ||
| readonly cause: string; | ||
| readonly fix: string; | ||
| readonly docs: string; | ||
| readonly meta?: Readonly<Record<string, unknown>> | undefined; | ||
| } | ||
| export declare class SchemaError extends Error { | ||
| readonly [ULTIMATE_ERROR_BRAND] = true; | ||
| readonly name: string; | ||
| readonly code: string; | ||
| readonly title: string; | ||
| readonly cause: string; | ||
| readonly fix: string; | ||
| readonly docs: string; | ||
| readonly meta: Readonly<Record<string, unknown>> | undefined; | ||
| constructor(init: SchemaErrorInit); | ||
| /** The same 3-line rendering as `UltimateError.format()`. */ | ||
| format(): string; | ||
| toJSON(): SchemaErrorJSON; | ||
| } | ||
| export interface ValidationIssue { | ||
| /** Dotted path from the validated root, e.g. `input.items[0].price`. */ | ||
| readonly path: string; | ||
| readonly expected: string; | ||
| readonly received: string; | ||
| readonly message: string; | ||
| } | ||
| export declare class ValidationFailedError extends SchemaError { | ||
| static readonly code = "X_VALIDATION_FAILED"; | ||
| readonly name = "ValidationFailedError"; | ||
| readonly issues: readonly ValidationIssue[]; | ||
| constructor(issues: readonly ValidationIssue[], root?: string); | ||
| /** One line per issue — what the dev overlay and `x test --json` render. */ | ||
| formatIssues(): string; | ||
| } | ||
| export declare class SchemaUnsupportedError extends SchemaError { | ||
| static readonly code = "X_SCHEMA_UNSUPPORTED"; | ||
| readonly name = "SchemaUnsupportedError"; | ||
| constructor(init: Omit<SchemaErrorInit, 'code'>); | ||
| } | ||
| export declare function isSchemaError(value: unknown): value is SchemaError; | ||
| //# sourceMappingURL=errors.d.ts.map |
| {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["errors.ts"],"names":[],"mappings":"AAIA,uFAAuF;AACvF,eAAO,MAAM,oBAAoB,EAAE,OAAO,MAAqC,CAAC;AAEhF,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAIhF,CAAC;AAYL,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;CAC/D;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;CAC/D;AAED,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,QAAQ;IACvC,SAAkB,IAAI,EAAE,MAAM,CAAiB;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,SAAiB,KAAK,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAE7D,YAAY,IAAI,EAAE,eAAe,EAQhC;IAED,6DAA6D;IAC7D,MAAM,IAAI,MAAM,CAIf;IAED,MAAM,IAAI,eAAe,CASxB;CACF;AAED,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,qBAAsB,SAAQ,WAAW;IACpD,MAAM,CAAC,QAAQ,CAAC,IAAI,yBAAyB;IAC7C,SAAkB,IAAI,2BAA2B;IACjD,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IAE5C,YAAY,MAAM,EAAE,SAAS,eAAe,EAAE,EAAE,IAAI,SAAU,EAW7D;IAED,4EAA4E;IAC5E,YAAY,IAAI,MAAM,CAErB;CACF;AAED,qBAAa,sBAAuB,SAAQ,WAAW;IACrD,MAAM,CAAC,QAAQ,CAAC,IAAI,0BAA0B;IAC9C,SAAkB,IAAI,4BAA4B;IAClD,YAAY,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,EAE9C;CACF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAElE"} |
| // Single responsibility: this package's error codes. `@ultimat3/schema` is tier 0 and may not | ||
| // import `@ultimat3/core`, so `SchemaError` reproduces the `UltimateError` shape structurally | ||
| // and carries the same `Symbol.for('ultimate.error')` brand — `isUltimateError()` still matches. | ||
| /** Same well-known symbol `@ultimat3/core` brands with. Keep in sync, never rename. */ | ||
| export const ULTIMATE_ERROR_BRAND = Symbol.for('ultimate.error'); | ||
| /** | ||
| * Pass to `registerErrorCodes()` from a package that may import both tiers (the CLI does this | ||
| * at boot) so the terminal and the dev overlay render these codes identically. | ||
| */ | ||
| export const SCHEMA_ERROR_CODES = Object.freeze({ | ||
| X_VALIDATION_FAILED: { title: 'value did not match its schema' }, | ||
| X_SCHEMA_UNSUPPORTED: { title: 'the active schema provider cannot do this' }, | ||
| }); | ||
| const TITLES = Object.freeze({ | ||
| X_VALIDATION_FAILED: 'value did not match its schema', | ||
| X_SCHEMA_UNSUPPORTED: 'the active schema provider cannot do this', | ||
| }); | ||
| /** `X_SCHEMA_UNSUPPORTED` -> `schema unsupported`, same fallback as the core registry. */ | ||
| function humanize(code) { | ||
| return code.replace(/^X_/, '').toLowerCase().replaceAll('_', ' '); | ||
| } | ||
| export class SchemaError extends Error { | ||
| [ULTIMATE_ERROR_BRAND] = true; | ||
| name = 'SchemaError'; | ||
| code; | ||
| title; | ||
| fix; | ||
| docs; | ||
| meta; | ||
| constructor(init) { | ||
| const title = TITLES[init.code] ?? humanize(init.code); | ||
| super(`${init.code}: ${title}`, { cause: init.cause }); | ||
| this.code = init.code; | ||
| this.title = title; | ||
| this.fix = init.fix; | ||
| this.docs = init.docs ?? `https://ultimate.dev/errors/${init.code}`; | ||
| this.meta = init.meta; | ||
| } | ||
| /** The same 3-line rendering as `UltimateError.format()`. */ | ||
| format() { | ||
| return [`${this.code}: ${this.title}`, ` cause: ${this.cause}`, ` fix: ${this.fix}`].join('\n'); | ||
| } | ||
| toJSON() { | ||
| return { | ||
| code: this.code, | ||
| title: this.title, | ||
| cause: this.cause, | ||
| fix: this.fix, | ||
| docs: this.docs, | ||
| meta: this.meta, | ||
| }; | ||
| } | ||
| } | ||
| export class ValidationFailedError extends SchemaError { | ||
| static code = 'X_VALIDATION_FAILED'; | ||
| name = 'ValidationFailedError'; | ||
| issues; | ||
| constructor(issues, root = 'value') { | ||
| const cause = issues | ||
| .map((issue) => `${issue.path === '' ? root : issue.path}: ${issue.message}`) | ||
| .join('; '); | ||
| super({ | ||
| code: ValidationFailedError.code, | ||
| cause, | ||
| fix: `send ${root} with the field(s) named in cause corrected to the expected type`, | ||
| meta: { issues }, | ||
| }); | ||
| this.issues = issues; | ||
| } | ||
| /** One line per issue — what the dev overlay and `x test --json` render. */ | ||
| formatIssues() { | ||
| return this.issues.map((issue) => ` ${issue.path}: ${issue.message}`).join('\n'); | ||
| } | ||
| } | ||
| export class SchemaUnsupportedError extends SchemaError { | ||
| static code = 'X_SCHEMA_UNSUPPORTED'; | ||
| name = 'SchemaUnsupportedError'; | ||
| constructor(init) { | ||
| super({ ...init, code: SchemaUnsupportedError.code }); | ||
| } | ||
| } | ||
| export function isSchemaError(value) { | ||
| return typeof value === 'object' && value !== null && ULTIMATE_ERROR_BRAND in value; | ||
| } | ||
| //# sourceMappingURL=errors.js.map |
| {"version":3,"file":"errors.js","sourceRoot":"","sources":["errors.ts"],"names":[],"mappings":"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"} |
| export type { AnySchema, Check, CheckErr, CheckOk, CheckResult, Path, Schema, Shape, ShapeInput, ShapeOutput, Simplify, } from './builder'; | ||
| export { checkOf, describeValue, expected, fail, failWith, makeSchema, pass, VENDOR, } from './builder'; | ||
| export type { QuerySource } from './coerce'; | ||
| export { coerceInput, coerceNode, coerceQuery } from './coerce'; | ||
| export type { SchemaErrorCodeDeclaration, SchemaErrorInit, SchemaErrorJSON, ValidationIssue, } from './errors'; | ||
| export { isSchemaError, SCHEMA_ERROR_CODES, SchemaError, SchemaUnsupportedError, ULTIMATE_ERROR_BRAND, ValidationFailedError, } from './errors'; | ||
| export type { JsonSchema, JsonSchemaDialect, JsonSchemaType, ToJsonSchemaOptions, } from './json-schema'; | ||
| export { nodeToJsonSchema, toJsonSchema, toMcpInputSchema } from './json-schema'; | ||
| export type { SchemaFormat, SchemaKind, SchemaNode } from './node'; | ||
| export { isSchemaNode, nodeOf, requiredKeys } from './node'; | ||
| export type { SchemaProvider } from './provider'; | ||
| export { builtinProvider, configureSchemaProvider, introspect, resetSchemaProvider, schemaProvider, tryIntrospect, } from './provider'; | ||
| export type { InferInput, InferOutput, StandardFailureResult, StandardIssue, StandardPathSegment, StandardResult, StandardSchemaProps, StandardSchemaV1, StandardSuccessResult, StandardTypes, } from './standard'; | ||
| export { formatPath, isStandardSchema, parse, parseAsync, toValidationIssues, validate, validateAsync, } from './standard'; | ||
| export type { Infer } from './t'; | ||
| export { t } from './t'; | ||
| export type { MoneyValue, NumberSchema, ObjectSchema, StringSchema, TNamespace, } from './validators'; | ||
| export { arraySchema, builtinT, enumSchema, literalSchema, objectSchema, optionalSchema, recordSchema, unionSchema, } from './validators'; | ||
| //# sourceMappingURL=index.d.ts.map |
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,SAAS,EACT,KAAK,EACL,QAAQ,EACR,OAAO,EACP,WAAW,EACX,IAAI,EACJ,MAAM,EACN,KAAK,EACL,UAAU,EACV,WAAW,EACX,QAAQ,GACT,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,OAAO,EACP,aAAa,EACb,QAAQ,EACR,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,IAAI,EACJ,MAAM,GACP,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAChE,YAAY,EACV,0BAA0B,EAC1B,eAAe,EACf,eAAe,EACf,eAAe,GAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,mBAAmB,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjF,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAC5D,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,UAAU,EACV,mBAAmB,EACnB,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,UAAU,EACV,WAAW,EACX,qBAAqB,EACrB,aAAa,EACb,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,KAAK,EACL,UAAU,EACV,kBAAkB,EAClB,QAAQ,EACR,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,YAAY,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,UAAU,GACX,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,WAAW,EACX,QAAQ,EACR,UAAU,EACV,aAAa,EACb,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,WAAW,GACZ,MAAM,cAAc,CAAC"} |
-11
| // Single responsibility: the public API of @ultimat3/schema. Explicit named exports only. | ||
| export { checkOf, describeValue, expected, fail, failWith, makeSchema, pass, VENDOR, } from './builder'; | ||
| export { coerceInput, coerceNode, coerceQuery } from './coerce'; | ||
| export { isSchemaError, SCHEMA_ERROR_CODES, SchemaError, SchemaUnsupportedError, ULTIMATE_ERROR_BRAND, ValidationFailedError, } from './errors'; | ||
| export { nodeToJsonSchema, toJsonSchema, toMcpInputSchema } from './json-schema'; | ||
| export { isSchemaNode, nodeOf, requiredKeys } from './node'; | ||
| export { builtinProvider, configureSchemaProvider, introspect, resetSchemaProvider, schemaProvider, tryIntrospect, } from './provider'; | ||
| export { formatPath, isStandardSchema, parse, parseAsync, toValidationIssues, validate, validateAsync, } from './standard'; | ||
| export { t } from './t'; | ||
| export { arraySchema, builtinT, enumSchema, literalSchema, objectSchema, optionalSchema, recordSchema, unionSchema, } from './validators'; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAe1F,OAAO,EACL,OAAO,EACP,aAAa,EACb,QAAQ,EACR,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,IAAI,EACJ,MAAM,GACP,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAOhE,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAOlB,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjF,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAE5D,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,UAAU,EACV,mBAAmB,EACnB,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAC;AAapB,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,KAAK,EACL,UAAU,EACV,kBAAkB,EAClB,QAAQ,EACR,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,OAAO,EACL,WAAW,EACX,QAAQ,EACR,UAAU,EACV,aAAa,EACb,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,WAAW,GACZ,MAAM,cAAc,CAAC"} |
| import { type SchemaNode } from './node'; | ||
| export type JsonSchemaType = 'string' | 'number' | 'integer' | 'boolean' | 'object' | 'array'; | ||
| export interface JsonSchema { | ||
| readonly $schema?: string; | ||
| readonly type?: JsonSchemaType; | ||
| readonly format?: string; | ||
| readonly description?: string; | ||
| readonly default?: unknown; | ||
| readonly minLength?: number; | ||
| readonly maxLength?: number; | ||
| readonly pattern?: string; | ||
| readonly minimum?: number; | ||
| readonly maximum?: number; | ||
| readonly enum?: readonly (string | number)[]; | ||
| readonly const?: string | number | boolean | null; | ||
| readonly properties?: Readonly<Record<string, JsonSchema>>; | ||
| readonly required?: readonly string[]; | ||
| readonly additionalProperties?: boolean | JsonSchema; | ||
| readonly items?: JsonSchema; | ||
| readonly anyOf?: readonly JsonSchema[]; | ||
| readonly title?: string; | ||
| } | ||
| export type JsonSchemaDialect = '2020-12' | 'draft-07'; | ||
| export interface ToJsonSchemaOptions { | ||
| /** MCP clients are happiest with `draft-07`; OpenAPI 3.1 wants `2020-12` (the default). */ | ||
| readonly dialect?: JsonSchemaDialect | undefined; | ||
| /** Emit `$schema` at the root. Off for OpenAPI component schemas. */ | ||
| readonly includeDialect?: boolean | undefined; | ||
| readonly title?: string | undefined; | ||
| } | ||
| /** Convert any schema the active provider can introspect. */ | ||
| export declare function toJsonSchema(schema: unknown, options?: ToJsonSchemaOptions): JsonSchema; | ||
| /** The exact shape an MCP `tools/list` entry needs: draft-07, no `$schema`. */ | ||
| export declare function toMcpInputSchema(schema: unknown): JsonSchema; | ||
| /** Convert an already-introspected node — used by generators that walk the IR themselves. */ | ||
| export declare function nodeToJsonSchema(node: SchemaNode): JsonSchema; | ||
| //# sourceMappingURL=json-schema.d.ts.map |
| {"version":3,"file":"json-schema.d.ts","sourceRoot":"","sources":["json-schema.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGvD,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE9F,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAC7C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IAClD,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACrD,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,UAAU,CAAC;AAOvD,MAAM,WAAW,mBAAmB;IAClC,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACjD,qEAAqE;IACrE,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAsFD,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,UAAU,CAQvF;AAED,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,UAAU,CAE5D;AAED,6FAA6F;AAC7F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAE7D"} |
| // Single responsibility: SchemaNode -> JSON Schema. Load-bearing: OpenAPI request/response | ||
| // bodies and MCP tool `inputSchema` are both this function's output, so an agent's view of an | ||
| // action and an HTTP client's view can never drift. | ||
| import { requiredKeys } from './node'; | ||
| import { introspect } from './provider'; | ||
| const DIALECTS = Object.freeze({ | ||
| '2020-12': 'https://json-schema.org/draft/2020-12/schema', | ||
| 'draft-07': 'http://json-schema.org/draft-07/schema#', | ||
| }); | ||
| const FORMAT_MAP = Object.freeze({ | ||
| uuid: 'uuid', | ||
| email: 'email', | ||
| uri: 'uri', | ||
| 'date-time': 'date-time', | ||
| slug: 'slug', | ||
| timezone: 'iana-time-zone', | ||
| locale: 'bcp47-locale', | ||
| cursor: 'ultimate-cursor', | ||
| }); | ||
| function stringNode(node) { | ||
| return { | ||
| type: 'string', | ||
| ...(node.format === undefined ? {} : { format: FORMAT_MAP[node.format] ?? node.format }), | ||
| ...(node.minLength === undefined ? {} : { minLength: node.minLength }), | ||
| ...(node.maxLength === undefined ? {} : { maxLength: node.maxLength }), | ||
| ...(node.pattern === undefined ? {} : { pattern: node.pattern }), | ||
| }; | ||
| } | ||
| function convert(node) { | ||
| const annotate = (schema) => ({ | ||
| ...schema, | ||
| ...(node.description === undefined ? {} : { description: node.description }), | ||
| ...(node.hasDefault === true ? { default: node.default } : {}), | ||
| }); | ||
| switch (node.kind) { | ||
| case 'string': | ||
| return annotate(stringNode(node)); | ||
| case 'number': | ||
| return annotate({ | ||
| type: node.integer === true ? 'integer' : 'number', | ||
| ...(node.minimum === undefined ? {} : { minimum: node.minimum }), | ||
| ...(node.maximum === undefined ? {} : { maximum: node.maximum }), | ||
| }); | ||
| case 'boolean': | ||
| return annotate({ type: 'boolean' }); | ||
| case 'date': | ||
| return annotate({ type: 'string', format: 'date-time' }); | ||
| case 'enum': | ||
| return annotate({ type: 'string', enum: node.values ?? [] }); | ||
| case 'literal': | ||
| return annotate({ const: node.literal ?? null }); | ||
| case 'array': | ||
| return annotate({ | ||
| type: 'array', | ||
| items: node.items === undefined ? {} : convert(node.items), | ||
| }); | ||
| case 'union': | ||
| return annotate({ anyOf: (node.anyOf ?? []).map(convert) }); | ||
| case 'record': | ||
| return annotate({ | ||
| type: 'object', | ||
| additionalProperties: node.valueNode === undefined ? true : convert(node.valueNode), | ||
| }); | ||
| case 'money': | ||
| return annotate({ | ||
| type: 'object', | ||
| properties: { | ||
| minor: { type: 'integer', description: 'amount in minor units, never a float' }, | ||
| currency: { type: 'string', pattern: '^[A-Z]{3}$' }, | ||
| }, | ||
| required: ['minor', 'currency'], | ||
| additionalProperties: false, | ||
| }); | ||
| case 'object': { | ||
| const properties = {}; | ||
| for (const [key, child] of Object.entries(node.properties ?? {})) { | ||
| properties[key] = convert(child); | ||
| } | ||
| return annotate({ | ||
| type: 'object', | ||
| properties, | ||
| required: requiredKeys(node), | ||
| additionalProperties: false, | ||
| }); | ||
| } | ||
| default: | ||
| return annotate({}); | ||
| } | ||
| } | ||
| /** Convert any schema the active provider can introspect. */ | ||
| export function toJsonSchema(schema, options) { | ||
| const converted = convert(introspect(schema)); | ||
| const dialect = options?.dialect ?? '2020-12'; | ||
| return { | ||
| ...(options?.includeDialect === false ? {} : { $schema: DIALECTS[dialect] }), | ||
| ...(options?.title === undefined ? {} : { title: options.title }), | ||
| ...converted, | ||
| }; | ||
| } | ||
| /** The exact shape an MCP `tools/list` entry needs: draft-07, no `$schema`. */ | ||
| export function toMcpInputSchema(schema) { | ||
| return toJsonSchema(schema, { dialect: 'draft-07', includeDialect: false }); | ||
| } | ||
| /** Convert an already-introspected node — used by generators that walk the IR themselves. */ | ||
| export function nodeToJsonSchema(node) { | ||
| return convert(node); | ||
| } | ||
| //# sourceMappingURL=json-schema.js.map |
| {"version":3,"file":"json-schema.js","sourceRoot":"","sources":["json-schema.ts"],"names":[],"mappings":"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"} |
| export type SchemaKind = 'string' | 'number' | 'boolean' | 'date' | 'object' | 'array' | 'enum' | 'literal' | 'union' | 'record' | 'money' | 'unknown'; | ||
| /** JSON Schema `format`, plus the framework's own semantic formats. */ | ||
| export type SchemaFormat = 'uuid' | 'email' | 'uri' | 'date-time' | 'slug' | 'timezone' | 'locale' | 'cursor'; | ||
| export interface SchemaNode { | ||
| readonly kind: SchemaKind; | ||
| readonly optional?: boolean | undefined; | ||
| /** Separate from `optional`: JSON Schema and the DB both distinguish null from absent. */ | ||
| readonly nullable?: boolean | undefined; | ||
| readonly hasDefault?: boolean | undefined; | ||
| readonly default?: unknown; | ||
| readonly description?: string | undefined; | ||
| readonly format?: SchemaFormat | undefined; | ||
| readonly minLength?: number | undefined; | ||
| readonly maxLength?: number | undefined; | ||
| /** Source string of the RegExp, so the node stays JSON-serialisable. */ | ||
| readonly pattern?: string | undefined; | ||
| readonly minimum?: number | undefined; | ||
| readonly maximum?: number | undefined; | ||
| readonly integer?: boolean | undefined; | ||
| readonly properties?: Readonly<Record<string, SchemaNode>> | undefined; | ||
| readonly items?: SchemaNode | undefined; | ||
| readonly values?: readonly (string | number)[] | undefined; | ||
| readonly literal?: string | number | boolean | null | undefined; | ||
| readonly anyOf?: readonly SchemaNode[] | undefined; | ||
| readonly valueNode?: SchemaNode | undefined; | ||
| } | ||
| export declare function isSchemaNode(value: unknown): value is SchemaNode; | ||
| /** Duck-typed: any object carrying a `node` is introspectable, whatever built it. */ | ||
| export declare function nodeOf(value: unknown): SchemaNode | undefined; | ||
| /** Keys an object node requires — everything not optional and without a default. */ | ||
| export declare function requiredKeys(node: SchemaNode): readonly string[]; | ||
| //# sourceMappingURL=node.d.ts.map |
| {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["node.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAClB,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,MAAM,GACN,QAAQ,GACR,OAAO,GACP,MAAM,GACN,SAAS,GACT,OAAO,GACP,QAAQ,GACR,OAAO,GACP,SAAS,CAAC;AAEd,uEAAuE;AACvE,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,OAAO,GACP,KAAK,GACL,WAAW,GACX,MAAM,GACN,UAAU,GACV,QAAQ,GACR,QAAQ,CAAC;AAEb,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC,0FAA0F;IAC1F,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,wEAAwE;IACxE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,GAAG,SAAS,CAAC;IACvE,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC;IAC3D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAChE,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,SAAS,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CAC7C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAMhE;AAED,qFAAqF;AACrF,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAI7D;AAED,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,MAAM,EAAE,CAKhE"} |
-24
| // Single responsibility: the introspectable schema IR. Flat on purpose — OpenAPI generation, | ||
| // MCP tool schemas, HTTP query coercion and the admin form generator all read this one shape, | ||
| // so it must stay trivially walkable. | ||
| export function isSchemaNode(value) { | ||
| return (typeof value === 'object' && | ||
| value !== null && | ||
| typeof value.kind === 'string'); | ||
| } | ||
| /** Duck-typed: any object carrying a `node` is introspectable, whatever built it. */ | ||
| export function nodeOf(value) { | ||
| if (typeof value !== 'object' || value === null || !('node' in value)) | ||
| return undefined; | ||
| const node = value.node; | ||
| return isSchemaNode(node) ? node : undefined; | ||
| } | ||
| /** Keys an object node requires — everything not optional and without a default. */ | ||
| export function requiredKeys(node) { | ||
| if (node.properties === undefined) | ||
| return []; | ||
| return Object.entries(node.properties) | ||
| .filter(([, child]) => child.optional !== true && child.hasDefault !== true) | ||
| .map(([key]) => key); | ||
| } | ||
| //# sourceMappingURL=node.js.map |
| {"version":3,"file":"node.js","sourceRoot":"","sources":["node.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,8FAA8F;AAC9F,sCAAsC;AAmDtC,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAQ,KAA4B,CAAC,IAAI,KAAK,QAAQ,CACvD,CAAC;AACJ,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,MAAM,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACxF,MAAM,IAAI,GAAI,KAA2B,CAAC,IAAI,CAAC;IAC/C,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/C,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,YAAY,CAAC,IAAgB;IAC3C,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAC7C,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;SACnC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;SAC3E,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"} |
| import { type SchemaNode } from './node'; | ||
| import { type TNamespace } from './validators'; | ||
| export interface SchemaProvider { | ||
| /** Matches `~standard.vendor`, e.g. `ultimate`, `arktype`, `zod`. */ | ||
| readonly vendor: string; | ||
| readonly t: TNamespace; | ||
| /** | ||
| * Return the IR for one of this provider's schemas. Required for OpenAPI and MCP tool | ||
| * schemas; omit it only if the provider also supplies `toJsonSchema`. | ||
| */ | ||
| introspect?(schema: unknown): SchemaNode | undefined; | ||
| } | ||
| export declare const builtinProvider: SchemaProvider; | ||
| /** | ||
| * Swap the library behind `t`. | ||
| * | ||
| * ```ts | ||
| * import { z } from 'zod'; | ||
| * configureSchemaProvider({ vendor: 'zod', t: zodNamespace, introspect: zodToNode }); | ||
| * ``` | ||
| */ | ||
| export declare function configureSchemaProvider(provider: SchemaProvider): void; | ||
| export declare function schemaProvider(): SchemaProvider; | ||
| export declare function resetSchemaProvider(): void; | ||
| /** | ||
| * The IR for any schema, whoever built it. Throws `X_SCHEMA_UNSUPPORTED` rather than silently | ||
| * emitting an empty OpenAPI body. | ||
| */ | ||
| export declare function introspect(schema: unknown): SchemaNode; | ||
| /** Best-effort variant for callers that can degrade (HTTP query coercion). */ | ||
| export declare function tryIntrospect(schema: unknown): SchemaNode | undefined; | ||
| //# sourceMappingURL=provider.d.ts.map |
| {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["provider.ts"],"names":[],"mappings":"AAKA,OAAO,EAAU,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC;IACvB;;;OAGG;IACH,UAAU,CAAC,CAAC,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;CACtD;AAED,eAAO,MAAM,eAAe,EAAE,cAI5B,CAAC;AAIH;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAEtE;AAED,wBAAgB,cAAc,IAAI,cAAc,CAE/C;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,UAAU,CAUtD;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAErE"} |
| // Single responsibility: the swap point. One provider is active per process; everything that | ||
| // consumes schemas (OpenAPI, MCP, coercion, the admin form generator) goes through `introspect` | ||
| // so a third-party library can be plugged in without touching the rest of the framework. | ||
| import { SchemaUnsupportedError } from './errors'; | ||
| import { nodeOf } from './node'; | ||
| import { builtinT } from './validators'; | ||
| export const builtinProvider = Object.freeze({ | ||
| vendor: 'ultimate', | ||
| t: builtinT, | ||
| introspect: nodeOf, | ||
| }); | ||
| let active = builtinProvider; | ||
| /** | ||
| * Swap the library behind `t`. | ||
| * | ||
| * ```ts | ||
| * import { z } from 'zod'; | ||
| * configureSchemaProvider({ vendor: 'zod', t: zodNamespace, introspect: zodToNode }); | ||
| * ``` | ||
| */ | ||
| export function configureSchemaProvider(provider) { | ||
| active = provider; | ||
| } | ||
| export function schemaProvider() { | ||
| return active; | ||
| } | ||
| export function resetSchemaProvider() { | ||
| active = builtinProvider; | ||
| } | ||
| /** | ||
| * The IR for any schema, whoever built it. Throws `X_SCHEMA_UNSUPPORTED` rather than silently | ||
| * emitting an empty OpenAPI body. | ||
| */ | ||
| export function introspect(schema) { | ||
| const node = active.introspect?.(schema) ?? nodeOf(schema); | ||
| if (node === undefined) { | ||
| throw new SchemaUnsupportedError({ | ||
| cause: `provider "${active.vendor}" cannot describe this schema as a SchemaNode`, | ||
| fix: 'add introspect() to the object passed to configureSchemaProvider()', | ||
| meta: { vendor: active.vendor }, | ||
| }); | ||
| } | ||
| return node; | ||
| } | ||
| /** Best-effort variant for callers that can degrade (HTTP query coercion). */ | ||
| export function tryIntrospect(schema) { | ||
| return active.introspect?.(schema) ?? nodeOf(schema); | ||
| } | ||
| //# sourceMappingURL=provider.js.map |
| {"version":3,"file":"provider.js","sourceRoot":"","sources":["provider.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,gGAAgG;AAChG,yFAAyF;AAEzF,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,MAAM,EAAmB,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAmB,MAAM,cAAc,CAAC;AAazD,MAAM,CAAC,MAAM,eAAe,GAAmB,MAAM,CAAC,MAAM,CAAC;IAC3D,MAAM,EAAE,UAAU;IAClB,CAAC,EAAE,QAAQ;IACX,UAAU,EAAE,MAAM;CACnB,CAAC,CAAC;AAEH,IAAI,MAAM,GAAmB,eAAe,CAAC;AAE7C;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAwB;IAC9D,MAAM,GAAG,QAAQ,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,GAAG,eAAe,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAe;IACxC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3D,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,sBAAsB,CAAC;YAC/B,KAAK,EAAE,aAAa,MAAM,CAAC,MAAM,+CAA+C;YAChF,GAAG,EAAE,oEAAoE;YACzE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;SAChC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,aAAa,CAAC,MAAe;IAC3C,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;AACvD,CAAC"} |
| import { type ValidationIssue } from './errors'; | ||
| export interface StandardSchemaV1<Input = unknown, Output = Input> { | ||
| readonly '~standard': StandardSchemaProps<Input, Output>; | ||
| } | ||
| export interface StandardSchemaProps<Input, Output> { | ||
| readonly version: 1; | ||
| /** Library name, e.g. `ultimate`, `arktype`, `zod`. */ | ||
| readonly vendor: string; | ||
| readonly validate: (value: unknown) => StandardResult<Output> | Promise<StandardResult<Output>>; | ||
| readonly types?: StandardTypes<Input, Output> | undefined; | ||
| } | ||
| export interface StandardTypes<Input, Output> { | ||
| readonly input: Input; | ||
| readonly output: Output; | ||
| } | ||
| export interface StandardSuccessResult<Output> { | ||
| readonly value: Output; | ||
| readonly issues?: undefined; | ||
| } | ||
| export interface StandardFailureResult { | ||
| readonly issues: readonly StandardIssue[]; | ||
| } | ||
| export type StandardResult<Output> = StandardSuccessResult<Output> | StandardFailureResult; | ||
| export interface StandardPathSegment { | ||
| readonly key: PropertyKey; | ||
| } | ||
| export interface StandardIssue { | ||
| readonly message: string; | ||
| readonly path?: readonly (PropertyKey | StandardPathSegment)[] | undefined; | ||
| } | ||
| export type InferInput<S extends StandardSchemaV1> = NonNullable<S['~standard']['types']>['input']; | ||
| export type InferOutput<S extends StandardSchemaV1> = NonNullable<S['~standard']['types']>['output']; | ||
| /** `['items', 0, 'price']` -> `items[0].price` */ | ||
| export declare function formatPath(path: readonly (PropertyKey | StandardPathSegment)[] | undefined): string; | ||
| /** Normalise any conforming library's issues into Ultimate's path-annotated shape. */ | ||
| export declare function toValidationIssues(issues: readonly StandardIssue[]): readonly ValidationIssue[]; | ||
| /** Validate against ANY conforming schema. Never throws on invalid input. */ | ||
| export declare function validate<S extends StandardSchemaV1>(schema: S, value: unknown): StandardResult<InferOutput<S>>; | ||
| export declare function validateAsync<S extends StandardSchemaV1>(schema: S, value: unknown): Promise<StandardResult<InferOutput<S>>>; | ||
| /** Validate or throw `X_VALIDATION_FAILED` with a path-annotated issue list. */ | ||
| export declare function parse<S extends StandardSchemaV1>(schema: S, value: unknown, root?: string): InferOutput<S>; | ||
| export declare function parseAsync<S extends StandardSchemaV1>(schema: S, value: unknown, root?: string): Promise<InferOutput<S>>; | ||
| export declare function isStandardSchema(value: unknown): value is StandardSchemaV1; | ||
| //# sourceMappingURL=standard.d.ts.map |
| {"version":3,"file":"standard.d.ts","sourceRoot":"","sources":["standard.ts"],"names":[],"mappings":"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"} |
| // Single responsibility: the Standard Schema v1 interface plus library-agnostic helpers. | ||
| // This is the swap point: every Ultimate primitive accepts any conforming schema, so ArkType, | ||
| // Zod and Valibot are all first-class without a line of adapter code. | ||
| import { SchemaUnsupportedError, ValidationFailedError } from './errors'; | ||
| /** `['items', 0, 'price']` -> `items[0].price` */ | ||
| export function formatPath(path) { | ||
| if (path === undefined || path.length === 0) | ||
| return ''; | ||
| let out = ''; | ||
| for (const segment of path) { | ||
| const key = typeof segment === 'object' ? segment.key : segment; | ||
| if (typeof key === 'number') { | ||
| out += `[${key}]`; | ||
| } | ||
| else { | ||
| out += out === '' ? String(key) : `.${String(key)}`; | ||
| } | ||
| } | ||
| return out; | ||
| } | ||
| /** Normalise any conforming library's issues into Ultimate's path-annotated shape. */ | ||
| export function toValidationIssues(issues) { | ||
| return issues.map((issue) => ({ | ||
| path: formatPath(issue.path), | ||
| expected: issue.message, | ||
| received: '', | ||
| message: issue.message, | ||
| })); | ||
| } | ||
| function assertSync(result, vendor) { | ||
| if (result instanceof Promise) { | ||
| throw new SchemaUnsupportedError({ | ||
| cause: `${vendor} validated asynchronously in a synchronous call site`, | ||
| fix: 'call validateAsync()/parseAsync() instead of validate()/parse()', | ||
| meta: { vendor }, | ||
| }); | ||
| } | ||
| return result; | ||
| } | ||
| /** Validate against ANY conforming schema. Never throws on invalid input. */ | ||
| export function validate(schema, value) { | ||
| const props = schema['~standard']; | ||
| return assertSync(props.validate(value), props.vendor); | ||
| } | ||
| export async function validateAsync(schema, value) { | ||
| const result = await schema['~standard'].validate(value); | ||
| return result; | ||
| } | ||
| /** Validate or throw `X_VALIDATION_FAILED` with a path-annotated issue list. */ | ||
| export function parse(schema, value, root = 'value') { | ||
| const result = validate(schema, value); | ||
| if (result.issues === undefined) | ||
| return result.value; | ||
| throw new ValidationFailedError(toValidationIssues(result.issues), root); | ||
| } | ||
| export async function parseAsync(schema, value, root = 'value') { | ||
| const result = await validateAsync(schema, value); | ||
| if (result.issues === undefined) | ||
| return result.value; | ||
| throw new ValidationFailedError(toValidationIssues(result.issues), root); | ||
| } | ||
| export function isStandardSchema(value) { | ||
| if (typeof value !== 'object' || value === null || !('~standard' in value)) | ||
| return false; | ||
| const props = value['~standard']; | ||
| return (typeof props === 'object' && | ||
| props !== null && | ||
| props.version === 1 && | ||
| typeof props.validate === 'function'); | ||
| } | ||
| //# sourceMappingURL=standard.js.map |
| {"version":3,"file":"standard.js","sourceRoot":"","sources":["standard.ts"],"names":[],"mappings":"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"} |
| import type { InferOutput, StandardSchemaV1 } from './standard'; | ||
| import type { TNamespace } from './validators'; | ||
| export declare const t: TNamespace; | ||
| /** `type PublishInput = Infer<typeof publishInput>` */ | ||
| export type Infer<S extends StandardSchemaV1> = InferOutput<S>; | ||
| //# sourceMappingURL=t.d.ts.map |
| {"version":3,"file":"t.d.ts","sourceRoot":"","sources":["t.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAc,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,KAAK,EAKV,UAAU,EACX,MAAM,cAAc,CAAC;AAMtB,eAAO,MAAM,CAAC,EAAE,UA8Ef,CAAC;AAEF,uDAAuD;AACvD,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,gBAAgB,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC"} |
-79
| // Single responsibility: the blessed `t` namespace. One import, one way to declare a schema. | ||
| // Every member delegates to the active provider, so `configureSchemaProvider()` takes effect | ||
| // even for modules that captured `t` at import time. | ||
| import { schemaProvider } from './provider'; | ||
| function provider() { | ||
| return schemaProvider().t; | ||
| } | ||
| export const t = { | ||
| get string() { | ||
| return provider().string; | ||
| }, | ||
| get number() { | ||
| return provider().number; | ||
| }, | ||
| get boolean() { | ||
| return provider().boolean; | ||
| }, | ||
| get uuid() { | ||
| return provider().uuid; | ||
| }, | ||
| get email() { | ||
| return provider().email; | ||
| }, | ||
| get url() { | ||
| return provider().url; | ||
| }, | ||
| get date() { | ||
| return provider().date; | ||
| }, | ||
| get money() { | ||
| return provider().money; | ||
| }, | ||
| get timezone() { | ||
| return provider().timezone; | ||
| }, | ||
| get locale() { | ||
| return provider().locale; | ||
| }, | ||
| get slug() { | ||
| return provider().slug; | ||
| }, | ||
| get cursor() { | ||
| return provider().cursor; | ||
| }, | ||
| object(shape) { | ||
| return provider().object(shape); | ||
| }, | ||
| array(items) { | ||
| return provider().array(items); | ||
| }, | ||
| enum(values) { | ||
| return provider().enum(values); | ||
| }, | ||
| /** | ||
| * Variadic form of `enum`, and the blessed spelling: it spreads a `const` tuple of codes | ||
| * straight from the domain package (`t.enumerated(...PLAN_CODES)`) and avoids the reserved | ||
| * word at the call site. | ||
| */ | ||
| enumerated(...values) { | ||
| return provider().enum(values); | ||
| }, | ||
| literal(value) { | ||
| return provider().literal(value); | ||
| }, | ||
| union(...members) { | ||
| return provider().union(...members); | ||
| }, | ||
| record(values) { | ||
| return provider().record(values); | ||
| }, | ||
| /** `t.nullable(t.url)` — the column may hold null, which is not the same as being absent. */ | ||
| nullable(schema) { | ||
| return schema.nullable(); | ||
| }, | ||
| optional(schema) { | ||
| return provider().optional(schema); | ||
| }, | ||
| }; | ||
| //# sourceMappingURL=t.js.map |
| {"version":3,"file":"t.js","sourceRoot":"","sources":["t.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,6FAA6F;AAC7F,qDAAqD;AAGrD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAU5C,SAAS,QAAQ;IACf,OAAO,cAAc,EAAE,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,MAAM,CAAC,GAAe;IAC3B,IAAI,MAAM;QACR,OAAO,QAAQ,EAAE,CAAC,MAAM,CAAC;IAC3B,CAAC;IACD,IAAI,MAAM;QACR,OAAO,QAAQ,EAAE,CAAC,MAAM,CAAC;IAC3B,CAAC;IACD,IAAI,OAAO;QACT,OAAO,QAAQ,EAAE,CAAC,OAAO,CAAC;IAC5B,CAAC;IACD,IAAI,IAAI;QACN,OAAO,QAAQ,EAAE,CAAC,IAAI,CAAC;IACzB,CAAC;IACD,IAAI,KAAK;QACP,OAAO,QAAQ,EAAE,CAAC,KAAK,CAAC;IAC1B,CAAC;IACD,IAAI,GAAG;QACL,OAAO,QAAQ,EAAE,CAAC,GAAG,CAAC;IACxB,CAAC;IACD,IAAI,IAAI;QACN,OAAO,QAAQ,EAAE,CAAC,IAAI,CAAC;IACzB,CAAC;IACD,IAAI,KAAK;QACP,OAAO,QAAQ,EAAE,CAAC,KAAK,CAAC;IAC1B,CAAC;IACD,IAAI,QAAQ;QACV,OAAO,QAAQ,EAAE,CAAC,QAAQ,CAAC;IAC7B,CAAC;IACD,IAAI,MAAM;QACR,OAAO,QAAQ,EAAE,CAAC,MAAM,CAAC;IAC3B,CAAC;IACD,IAAI,IAAI;QACN,OAAO,QAAQ,EAAE,CAAC,IAAI,CAAC;IACzB,CAAC;IACD,IAAI,MAAM;QACR,OAAO,QAAQ,EAAE,CAAC,MAAM,CAAC;IAC3B,CAAC;IACD,MAAM,CAAkB,KAAQ;QAC9B,OAAO,QAAQ,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IACD,KAAK,CAAsB,KAAQ;QACjC,OAAO,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,CAAiD,MAAS;QAC5D,OAAO,QAAQ,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IACD;;;;OAIG;IACH,UAAU,CACR,GAAG,MAAS;QAEZ,OAAO,QAAQ,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,CAA4C,KAAQ;QACzD,OAAO,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IACD,KAAK,CACH,GAAG,OAAU;QAEb,OAAO,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,CACJ,MAAS;QAET,OAAO,QAAQ,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IACD,6FAA6F;IAC7F,QAAQ,CAAsB,MAAS;QACrC,OAAO,MAAM,CAAC,QAAQ,EAAyD,CAAC;IAClF,CAAC;IACD,QAAQ,CACN,MAAS;QAET,OAAO,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;CACF,CAAC"} |
| import { type AnySchema, type Schema, type Shape, type ShapeInput, type ShapeOutput } from './builder'; | ||
| import type { InferInput, InferOutput } from './standard'; | ||
| /** Structurally identical to `Money` in `@ultimat3/money`. Never a float. */ | ||
| export interface MoneyValue { | ||
| readonly minor: number; | ||
| readonly currency: string; | ||
| } | ||
| export interface StringSchema extends Schema<string, string> { | ||
| min(length: number): StringSchema; | ||
| max(length: number): StringSchema; | ||
| pattern(regex: RegExp): StringSchema; | ||
| } | ||
| export interface NumberSchema extends Schema<number, number> { | ||
| min(value: number): NumberSchema; | ||
| max(value: number): NumberSchema; | ||
| int(): NumberSchema; | ||
| } | ||
| export interface ObjectSchema<S extends Shape> extends Schema<ShapeInput<S>, ShapeOutput<S>> { | ||
| readonly shape: S; | ||
| extend<E extends Shape>(extra: E): ObjectSchema<Simplified<S & E>>; | ||
| pick<K extends keyof S & string>(...keys: readonly K[]): ObjectSchema<Pick<S, K>>; | ||
| omit<K extends keyof S & string>(...keys: readonly K[]): ObjectSchema<Omit<S, K>>; | ||
| } | ||
| type Simplified<S> = { | ||
| [K in keyof S]: S[K]; | ||
| } & {}; | ||
| export declare function objectSchema<S extends Shape>(shape: S): ObjectSchema<S>; | ||
| export declare function arraySchema<S extends AnySchema>(items: S): Schema<readonly InferInput<S>[], InferOutput<S>[]>; | ||
| export declare function enumSchema<const V extends readonly [string, ...string[]]>(values: V): Schema<V[number], V[number]>; | ||
| export declare function literalSchema<const V extends string | number | boolean>(value: V): Schema<V, V>; | ||
| export declare function unionSchema<S extends readonly [AnySchema, ...AnySchema[]]>(...members: S): Schema<InferInput<S[number]>, InferOutput<S[number]>>; | ||
| export declare function recordSchema<S extends AnySchema>(values: S): Schema<Readonly<Record<string, InferInput<S>>>, Record<string, InferOutput<S>>>; | ||
| export declare function nullableSchema<S extends AnySchema>(schema: S): Schema<InferInput<S> | null, InferOutput<S> | null>; | ||
| export declare function optionalSchema<S extends AnySchema>(schema: S): Schema<InferInput<S> | undefined, InferOutput<S> | undefined>; | ||
| /** The shape a schema provider must implement to back `t`. */ | ||
| export interface TNamespace { | ||
| readonly string: StringSchema; | ||
| readonly number: NumberSchema; | ||
| readonly boolean: Schema<boolean, boolean>; | ||
| readonly uuid: StringSchema; | ||
| readonly email: StringSchema; | ||
| readonly url: StringSchema; | ||
| readonly date: Schema<Date | string | number, Date>; | ||
| readonly money: Schema<MoneyValue, MoneyValue>; | ||
| readonly timezone: StringSchema; | ||
| readonly locale: StringSchema; | ||
| readonly slug: StringSchema; | ||
| readonly cursor: StringSchema; | ||
| object<S extends Shape>(shape: S): ObjectSchema<S>; | ||
| array<S extends AnySchema>(items: S): Schema<readonly InferInput<S>[], InferOutput<S>[]>; | ||
| enum<const V extends readonly [string, ...string[]]>(values: V): Schema<V[number], V[number]>; | ||
| /** Variadic `enum`; the blessed spelling at call sites. */ | ||
| enumerated<const V extends readonly [string, ...string[]]>(...values: V): Schema<V[number], V[number]>; | ||
| literal<const V extends string | number | boolean>(value: V): Schema<V, V>; | ||
| union<S extends readonly [AnySchema, ...AnySchema[]]>(...members: S): Schema<InferInput<S[number]>, InferOutput<S[number]>>; | ||
| record<S extends AnySchema>(values: S): Schema<Readonly<Record<string, InferInput<S>>>, Record<string, InferOutput<S>>>; | ||
| /** Null is a value the column holds; `optional` is the caller omitting the field. */ | ||
| nullable<S extends AnySchema>(schema: S): Schema<InferInput<S> | null, InferOutput<S> | null>; | ||
| optional<S extends AnySchema>(schema: S): Schema<InferInput<S> | undefined, InferOutput<S> | undefined>; | ||
| } | ||
| export declare const builtinT: TNamespace; | ||
| export {}; | ||
| //# sourceMappingURL=validators.d.ts.map |
| {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["validators.ts"],"names":[],"mappings":"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"} |
| // Single responsibility: the builtin, dependency-free validators behind `t`. Small on purpose — | ||
| // ArkType or Zod replace them wholesale via `configureSchemaProvider()`; the IR and the | ||
| // Standard Schema surface are what the rest of the framework actually depends on. | ||
| import { checkOf, expected, fail, failWith, makeSchema, pass, } from './builder'; | ||
| const EMAIL_RE = /^[^\s@]+@[^\s@.]+(\.[^\s@.]+)+$/; | ||
| const SLUG_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/; | ||
| const CURSOR_RE = /^[A-Za-z0-9_-]+$/; | ||
| const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; | ||
| const CURRENCY_RE = /^[A-Z]{3}$/; | ||
| function stringLike(node, what, test) { | ||
| const check = (value, path) => { | ||
| if (typeof value !== 'string') | ||
| return fail(path, expected(what, value)); | ||
| if (node.minLength !== undefined && value.length < node.minLength) { | ||
| return fail(path, expected(`${what} of at least ${node.minLength} chars`, value)); | ||
| } | ||
| if (node.maxLength !== undefined && value.length > node.maxLength) { | ||
| return fail(path, expected(`${what} of at most ${node.maxLength} chars`, value)); | ||
| } | ||
| if (node.pattern !== undefined && !new RegExp(node.pattern).test(value)) { | ||
| return fail(path, expected(`${what} matching ${node.pattern}`, value)); | ||
| } | ||
| if (test !== undefined && !test(value)) | ||
| return fail(path, expected(what, value)); | ||
| return pass(value); | ||
| }; | ||
| return check; | ||
| } | ||
| function makeStringSchema(node, what, test) { | ||
| const base = makeSchema(node, stringLike(node, what, test)); | ||
| return { | ||
| ...base, | ||
| min: (length) => makeStringSchema({ ...node, minLength: length }, what, test), | ||
| max: (length) => makeStringSchema({ ...node, maxLength: length }, what, test), | ||
| pattern: (regex) => makeStringSchema({ ...node, pattern: regex.source }, what, test), | ||
| }; | ||
| } | ||
| function makeNumberSchema(node) { | ||
| const check = (value, path) => { | ||
| if (typeof value !== 'number' || !Number.isFinite(value)) { | ||
| return fail(path, expected('a finite number', value)); | ||
| } | ||
| if (node.integer === true && !Number.isInteger(value)) { | ||
| return fail(path, expected('an integer', value)); | ||
| } | ||
| if (node.minimum !== undefined && value < node.minimum) { | ||
| return fail(path, expected(`a number >= ${node.minimum}`, value)); | ||
| } | ||
| if (node.maximum !== undefined && value > node.maximum) { | ||
| return fail(path, expected(`a number <= ${node.maximum}`, value)); | ||
| } | ||
| return pass(value); | ||
| }; | ||
| const base = makeSchema(node, check); | ||
| return { | ||
| ...base, | ||
| min: (value) => makeNumberSchema({ ...node, minimum: value }), | ||
| max: (value) => makeNumberSchema({ ...node, maximum: value }), | ||
| int: () => makeNumberSchema({ ...node, integer: true }), | ||
| }; | ||
| } | ||
| function isPlainObject(value) { | ||
| return typeof value === 'object' && value !== null && !Array.isArray(value); | ||
| } | ||
| export function objectSchema(shape) { | ||
| const properties = {}; | ||
| const checks = []; | ||
| for (const [key, member] of Object.entries(shape)) { | ||
| properties[key] = member.node; | ||
| checks.push([key, checkOf(member)]); | ||
| } | ||
| const node = { kind: 'object', properties }; | ||
| const check = (value, path) => { | ||
| if (!isPlainObject(value)) | ||
| return fail(path, expected('an object', value)); | ||
| const issues = []; | ||
| const out = {}; | ||
| for (const [key, memberCheck] of checks) { | ||
| const result = memberCheck(value[key], [...path, key]); | ||
| if (result.ok) { | ||
| // Unknown keys are dropped, never forwarded — no mass assignment through an action. | ||
| if (result.value !== undefined) | ||
| out[key] = result.value; | ||
| } | ||
| else { | ||
| issues.push(...result.issues); | ||
| } | ||
| } | ||
| if (issues.length > 0) | ||
| return failWith(issues); | ||
| return pass(out); | ||
| }; | ||
| const base = makeSchema(node, check); | ||
| return { | ||
| ...base, | ||
| shape, | ||
| extend: (extra) => objectSchema({ ...shape, ...extra }), | ||
| pick: (...keys) => { | ||
| const next = {}; | ||
| for (const key of keys) | ||
| next[key] = shape[key]; | ||
| return objectSchema(next); | ||
| }, | ||
| omit: (...keys) => { | ||
| const drop = new Set(keys); | ||
| const next = {}; | ||
| for (const [key, member] of Object.entries(shape)) { | ||
| if (!drop.has(key)) | ||
| next[key] = member; | ||
| } | ||
| return objectSchema(next); | ||
| }, | ||
| }; | ||
| } | ||
| export function arraySchema(items) { | ||
| const itemCheck = checkOf(items); | ||
| const node = { kind: 'array', items: items.node }; | ||
| return makeSchema(node, (value, path) => { | ||
| if (!Array.isArray(value)) | ||
| return fail(path, expected('an array', value)); | ||
| const issues = []; | ||
| const out = []; | ||
| for (const [index, item] of value.entries()) { | ||
| const result = itemCheck(item, [...path, index]); | ||
| if (result.ok) | ||
| out.push(result.value); | ||
| else | ||
| issues.push(...result.issues); | ||
| } | ||
| if (issues.length > 0) | ||
| return failWith(issues); | ||
| return pass(out); | ||
| }); | ||
| } | ||
| export function enumSchema(values) { | ||
| const node = { kind: 'enum', values: [...values] }; | ||
| return makeSchema(node, (value, path) => { | ||
| if (typeof value === 'string' && values.includes(value)) { | ||
| return pass(value); | ||
| } | ||
| return fail(path, expected(`one of ${values.join(' | ')}`, value)); | ||
| }); | ||
| } | ||
| export function literalSchema(value) { | ||
| const node = { kind: 'literal', literal: value }; | ||
| return makeSchema(node, (candidate, path) => candidate === value ? pass(value) : fail(path, expected(JSON.stringify(value), candidate))); | ||
| } | ||
| export function unionSchema(...members) { | ||
| const checks = members.map((member) => checkOf(member)); | ||
| const node = { kind: 'union', anyOf: members.map((member) => member.node) }; | ||
| return makeSchema(node, (value, path) => { | ||
| const reasons = []; | ||
| for (const memberCheck of checks) { | ||
| const result = memberCheck(value, path); | ||
| if (result.ok) | ||
| return pass(result.value); | ||
| reasons.push(result.issues.map((issue) => issue.message).join(', ')); | ||
| } | ||
| return fail(path, `no union member matched (${reasons.join(' | ')})`); | ||
| }); | ||
| } | ||
| export function recordSchema(values) { | ||
| const valueCheck = checkOf(values); | ||
| const node = { kind: 'record', valueNode: values.node }; | ||
| return makeSchema(node, (value, path) => { | ||
| if (!isPlainObject(value)) | ||
| return fail(path, expected('an object', value)); | ||
| const issues = []; | ||
| const out = {}; | ||
| for (const [key, entry] of Object.entries(value)) { | ||
| const result = valueCheck(entry, [...path, key]); | ||
| if (result.ok) | ||
| out[key] = result.value; | ||
| else | ||
| issues.push(...result.issues); | ||
| } | ||
| if (issues.length > 0) | ||
| return failWith(issues); | ||
| return pass(out); | ||
| }); | ||
| } | ||
| export function nullableSchema(schema) { | ||
| return schema.nullable(); | ||
| } | ||
| export function optionalSchema(schema) { | ||
| return schema.optional(); | ||
| } | ||
| function isTimeZone(value) { | ||
| try { | ||
| new Intl.DateTimeFormat('en', { timeZone: value }); | ||
| return true; | ||
| } | ||
| catch { | ||
| return false; | ||
| } | ||
| } | ||
| function isLocale(value) { | ||
| try { | ||
| return Intl.getCanonicalLocales(value).length === 1; | ||
| } | ||
| catch { | ||
| return false; | ||
| } | ||
| } | ||
| const dateSchema = makeSchema({ kind: 'date', format: 'date-time' }, (value, path) => { | ||
| if (value instanceof Date) { | ||
| return Number.isNaN(value.getTime()) | ||
| ? fail(path, expected('a valid Date', value)) | ||
| : pass(value); | ||
| } | ||
| if (typeof value === 'string' || typeof value === 'number') { | ||
| const parsed = new Date(value); | ||
| return Number.isNaN(parsed.getTime()) | ||
| ? fail(path, expected('an ISO-8601 date-time', value)) | ||
| : pass(parsed); | ||
| } | ||
| return fail(path, expected('an ISO-8601 date-time', value)); | ||
| }); | ||
| const moneySchema = makeSchema({ | ||
| kind: 'money', | ||
| description: 'integer minor units plus an ISO 4217 currency code', | ||
| properties: { | ||
| minor: { kind: 'number', integer: true }, | ||
| currency: { kind: 'string', pattern: CURRENCY_RE.source }, | ||
| }, | ||
| }, (value, path) => { | ||
| if (!isPlainObject(value)) | ||
| return fail(path, expected('a Money object', value)); | ||
| const minor = value['minor']; | ||
| const currency = value['currency']; | ||
| const issues = []; | ||
| if (typeof minor !== 'number' || !Number.isInteger(minor)) { | ||
| issues.push({ | ||
| message: expected('an integer number of minor units', minor), | ||
| path: [...path, 'minor'], | ||
| }); | ||
| } | ||
| if (typeof currency !== 'string' || !CURRENCY_RE.test(currency)) { | ||
| issues.push({ | ||
| message: expected('a 3-letter ISO 4217 code', currency), | ||
| path: [...path, 'currency'], | ||
| }); | ||
| } | ||
| if (issues.length > 0) | ||
| return failWith(issues); | ||
| return pass({ minor: minor, currency: currency }); | ||
| }); | ||
| export const builtinT = Object.freeze({ | ||
| string: makeStringSchema({ kind: 'string', minLength: 1 }, 'a non-empty string'), | ||
| number: makeNumberSchema({ kind: 'number' }), | ||
| boolean: makeSchema({ kind: 'boolean' }, (value, path) => typeof value === 'boolean' ? pass(value) : fail(path, expected('a boolean', value))), | ||
| uuid: makeStringSchema({ kind: 'string', format: 'uuid' }, 'a uuid', (value) => UUID_RE.test(value)), | ||
| email: makeStringSchema({ kind: 'string', format: 'email' }, 'an email address', (value) => EMAIL_RE.test(value)), | ||
| url: makeStringSchema({ kind: 'string', format: 'uri' }, 'an absolute URL', (value) => URL.canParse(value)), | ||
| date: dateSchema, | ||
| money: moneySchema, | ||
| timezone: makeStringSchema({ kind: 'string', format: 'timezone' }, 'an IANA time zone', isTimeZone), | ||
| locale: makeStringSchema({ kind: 'string', format: 'locale' }, 'a BCP-47 locale', isLocale), | ||
| slug: makeStringSchema({ kind: 'string', format: 'slug', pattern: SLUG_RE.source }, 'a slug'), | ||
| cursor: makeStringSchema({ kind: 'string', format: 'cursor', pattern: CURSOR_RE.source }, 'an opaque base64url cursor'), | ||
| object: objectSchema, | ||
| array: arraySchema, | ||
| enum: enumSchema, | ||
| enumerated: (...values) => enumSchema(values), | ||
| literal: literalSchema, | ||
| union: unionSchema, | ||
| record: recordSchema, | ||
| nullable: nullableSchema, | ||
| optional: optionalSchema, | ||
| }); | ||
| //# sourceMappingURL=validators.js.map |
| {"version":3,"file":"validators.js","sourceRoot":"","sources":["validators.ts"],"names":[],"mappings":"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"} |
57607
-65.28%13
-75.47%1349
-48.41%