runtypes
Version:
Runtime validation for static types
100 lines (99 loc) • 4.11 kB
TypeScript
import type Runtype from "../Runtype.js";
import type Failcode from "./Failcode.js";
declare namespace Failure {
/**
* A detailed object enumerating where the validation failed exactly.
*/
type Details = globalThis.Record<PropertyKey, Failure>;
}
type Legend = {
/**
* The tag indicating failure.
*/
success: false;
/**
* An error code that roughly categorizes the problem.
*/
code: Failcode;
/**
* A string that summarizes the problem overall. Only for debugging.
*/
message: string;
/**
* The runtype that yielded this failure.
*/
expected: Runtype.Interfaces;
/**
* The value that caused this failure.
*/
received: unknown;
/**
* An object that describes which property was invalid precisely. Only available for complex runtypes (e.g. `Object`, `Array`, and the like; `Union` and `Intersect` also emit this enumerating a failure for each member).
*/
details: Failure.Details;
/**
* An object that describes the failure of the inner runtype. Only available for `Brand` and contextual failures (e.g. failures in `Record` keys, in boundaries of `Contract`/`AsyncContract`, etc.).
*/
detail: Failure;
/**
* A thrown value, which is typically an error message, if any. Only available for runtypes that involve user-provided validation functions (e.g. `Constraint` and `Parser`) or constraint-like failures like about the length of `Tuple`.
*/
thrown: unknown;
};
/**
* A failed validation result.
*/
type Failure = ((Pick<Legend, "success" | "message" | "code" | "expected" | "received"> & (Pick<Legend, "details"> | Pick<Legend, "detail"> | object)) & {
code: typeof Failcode.TYPE_INCORRECT;
} extends infer T ? {
[K in keyof T]: T[K];
} : never) | (Pick<Legend, "success" | "message" | "code" | "expected" | "received"> & {
code: typeof Failcode.VALUE_INCORRECT;
} extends infer T ? {
[K in keyof T]: T[K];
} : never) | (Pick<Legend, "success" | "message" | "code" | "expected" | "received"> & Pick<Legend, "detail"> & {
code: typeof Failcode.KEY_INCORRECT;
} extends infer T ? {
[K in keyof T]: T[K];
} : never) | (Pick<Legend, "success" | "message" | "code" | "expected" | "received" | "details"> & {
code: typeof Failcode.CONTENT_INCORRECT;
} extends infer T ? {
[K in keyof T]: T[K];
} : never) | (Pick<Legend, "success" | "message" | "code" | "expected" | "received" | "detail"> & {
code: typeof Failcode.ARGUMENTS_INCORRECT;
} extends infer T ? {
[K in keyof T]: T[K];
} : never) | (Pick<Legend, "success" | "message" | "code" | "expected" | "received" | "detail"> & {
code: typeof Failcode.RETURN_INCORRECT;
} extends infer T ? {
[K in keyof T]: T[K];
} : never) | (Pick<Legend, "success" | "message" | "code" | "expected" | "received" | "detail"> & {
code: typeof Failcode.RESOLVE_INCORRECT;
} extends infer T ? {
[K in keyof T]: T[K];
} : never) | (Pick<Legend, "success" | "message" | "code" | "expected" | "received" | "thrown"> & {
code: typeof Failcode.CONSTRAINT_FAILED;
} extends infer T ? {
[K in keyof T]: T[K];
} : never) | (Pick<Legend, "success" | "message" | "code" | "expected"> & {
code: typeof Failcode.PROPERTY_MISSING;
} extends infer T ? {
[K in keyof T]: T[K];
} : never) | (Pick<Legend, "success" | "message" | "code" | "expected" | "received"> & {
code: typeof Failcode.PROPERTY_PRESENT;
} extends infer T ? {
[K in keyof T]: T[K];
} : never) | (Pick<Legend, "success" | "message" | "code" | "expected" | "received"> & {
code: typeof Failcode.NOTHING_EXPECTED;
} extends infer T ? {
[K in keyof T]: T[K];
} : never) | (Pick<Legend, "success" | "message" | "code" | "expected" | "received" | "thrown"> & {
code: typeof Failcode.PARSING_FAILED;
} extends infer T ? {
[K in keyof T]: T[K];
} : never) | (Pick<Legend, "success" | "message" | "code" | "expected" | "received" | "thrown"> & {
code: typeof Failcode.INSTANCEOF_FAILED;
} extends infer T ? {
[K in keyof T]: T[K];
} : never);
export default Failure;