model-validator-ts
Version:
[](https://www.npmjs.com/package/model-validator-ts)
107 lines • 5.69 kB
TypeScript
import type { StandardSchemaV1 } from "./standard-schema.ts";
type TValidationDeps = object;
type ErrorBagFromInput<TInput> = ErrorBag<Exclude<keyof TInput, symbol | number>>;
type ErrorBagFromSchema<TSchema extends StandardSchemaV1> = ErrorBag<Exclude<keyof StandardSchemaV1.InferOutput<TSchema>, symbol | number>>;
export declare class ErrorBag<TKeys extends string> {
#private;
addGlobalError(message: string): this;
addError(key: TKeys, message: string): this;
get global(): string | undefined;
firstError(key: TKeys): string | undefined;
hasErrors(): boolean;
toObject(): {
global: string | undefined;
issues: Partial<Record<TKeys, string[]>>;
};
}
type ValidationOpts<TInput> = {
validationType?: "plain";
override?: Partial<TInput>;
};
type ContextRuleFunction<TInput, TDeps extends TValidationDeps = {}, TInputContext = {}, TReturn = {}> = (args: {
data: TInput;
deps: TDeps;
bag: ErrorBagFromInput<TInput>;
context: TInputContext;
}) => TReturn | Promise<TReturn> | void | Promise<void>;
type ContextRuleDefinition<TInput, TDeps extends TValidationDeps = {}, TInputContext = {}, TReturn = {}> = {
fn: ContextRuleFunction<TInput, TDeps, TInputContext, TReturn>;
description?: string;
id?: string;
};
export type CommandResult<TOutput, TInput, TContext> = {
success: true;
result: Exclude<TOutput, ErrorBag<any> | void>;
context: TContext;
} | {
success: false;
errors: ErrorBagFromInput<TInput>;
step: "validation" | "execution";
rule?: {
id?: string;
description?: string;
};
};
type ExtractContext<T> = T extends {
context: infer TContext;
} ? TContext : never;
type NonVoidReturnContext<TReturn> = TReturn extends void | Promise<void> ? never : ExtractContext<TReturn>;
type Prettify<T> = {
[K in keyof T]: T[K];
} & {};
type DepsStatus = "not-required" | "required" | "passed";
export declare class Command<TSchema extends StandardSchemaV1, TDeps extends TValidationDeps, TContext, TOutput, TDepsStatus extends DepsStatus> {
#private;
constructor(validatorBuilder: FluentValidatorBuilder<TSchema, TDeps, TContext, TDepsStatus>, execute: (params: {
data: StandardSchemaV1.InferOutput<TSchema>;
deps: TDeps;
context: TContext;
bag: ErrorBagFromSchema<TSchema>;
}) => Promise<TOutput> | TOutput);
provide(this: Command<TSchema, TDeps, TContext, TOutput, "required">, deps: TDeps): Command<TSchema, TDeps, TContext, TOutput, "passed">;
run: TDepsStatus extends "required" ? never : (input: unknown, opts?: ValidationOpts<StandardSchemaV1.InferInput<TSchema>>) => Promise<CommandResult<TOutput, StandardSchemaV1.InferInput<TSchema>, TContext>>;
runShape: TDepsStatus extends "required" ? never : (input: StandardSchemaV1.InferInput<TSchema>, opts?: ValidationOpts<StandardSchemaV1.InferInput<TSchema>>) => Promise<CommandResult<TOutput, StandardSchemaV1.InferInput<TSchema>, TContext>>;
}
type FluentValidatorBuilderState<TSchema extends StandardSchemaV1, TDeps extends TValidationDeps> = {
schema: TSchema | undefined;
deps: TDeps | undefined;
contextRules: Array<ContextRuleDefinition<any, any, any, any>>;
depsStatus: DepsStatus;
};
export declare class FluentValidatorBuilder<TSchema extends StandardSchemaV1 = any, TDeps extends TValidationDeps = {}, TContext = {}, TDpesStatus extends DepsStatus = "not-required"> {
#private;
constructor(state?: FluentValidatorBuilderState<TSchema, TDeps>);
input<T extends StandardSchemaV1>(schema: T): FluentValidatorBuilder<T, TDeps, TContext, TDpesStatus>;
$deps<T extends TValidationDeps>(): FluentValidatorBuilder<TSchema, T, TContext, "required">;
get ["~unsafeInternals"](): FluentValidatorBuilderState<TSchema, TDeps>;
validate: TDpesStatus extends "required" ? never : (input: unknown, opts?: ValidationOpts<StandardSchemaV1.InferInput<TSchema>>) => Promise<{
success: true;
value: StandardSchemaV1.InferOutput<TSchema>;
context: TContext;
} | {
success: false;
errors: ErrorBagFromSchema<TSchema>;
rule?: {
id?: string;
description?: string;
};
}>;
rule<TReturn>(rule: ContextRuleDefinition<StandardSchemaV1.InferOutput<TSchema>, TDeps, TContext, TReturn>): FluentValidatorBuilder<TSchema, TDeps, NonVoidReturnContext<TReturn> extends never ? TContext : Prettify<TContext & NonVoidReturnContext<TReturn>>, TDpesStatus>;
provide(this: FluentValidatorBuilder<TSchema, TDeps, TContext, "required">, deps: TDeps): FluentValidatorBuilder<TSchema, TDeps, TContext, "passed">;
command<TOutput>(args: {
execute: (params: {
data: StandardSchemaV1.InferOutput<TSchema>;
deps: TDeps;
context: TContext;
bag: ErrorBagFromSchema<TSchema>;
}) => Promise<TOutput> | TOutput;
}): Command<TSchema, TDeps, TContext, TOutput, TDpesStatus>;
}
export declare function buildValidator(): FluentValidatorBuilder<any, {}, {}, "not-required">;
export type InferCommandResult<TCommand extends Command<any, any, any, any, any>, TCondition extends "success" | "failure" | "all" = "all"> = TCommand extends Command<infer TSchema, any, infer TContext, infer TOutput, any> ? TCondition extends "success" ? CommandResult<TOutput, StandardSchemaV1.InferInput<TSchema>, TContext> & {
success: true;
} : TCondition extends "failure" ? CommandResult<TOutput, StandardSchemaV1.InferInput<TSchema>, TContext> & {
success: false;
} : CommandResult<TOutput, StandardSchemaV1.InferInput<TSchema>, TContext> : never;
export {};
//# sourceMappingURL=index.d.ts.map