UNPKG

@backland/schema

Version:

TypeScript schema declaration and validation library with static type inference

51 lines (50 loc) 2.78 kB
import { A, IsKnown, Merge, O } from '@backland/utils'; import type { GraphType } from './GraphType/GraphType'; import { ObjectType } from './ObjectType'; import { DescribeField, DescribeObjectDefinition, SealedField } from './fields/Infer'; import { ObjectDefinitionInput } from './fields/_parseFields'; export interface ExtendObjectDefinition<Input, Origin> { definition: InnerDef<Input>; def(): this['definition']; exclude<K extends keyof this['definition']>(keys: K | K[]): ExtendObjectDefinition<{ object: Omit<InnerDef<Input>, K>; }, Origin>; extendObjectDefinition<V extends ObjectDefinitionInput>(value: V | ((current: this['definition']) => V)): ExtendObjectDefinition<{ object: Merge<InnerDef<Input>, DescribeObjectDefinition<V>>; }, Origin>; graphType(name: string): GraphType<{ object: InnerDef<Input>; }>; objectType(name?: string): ObjectType<InnerDef<Input>>; only<K extends keyof this['definition']>(keys: K | K[]): ExtendObjectDefinition<{ object: O.Pick<InnerDef<Input>, K>; }, Origin>; optional(): ExtendObjectDefinition<{ object: MakeFieldOptional<InnerDef<Input>, keyof InnerDef<Input>>; }, Origin>; optional<Op extends keyof InnerDef<Input>>(keys: Op | Op[]): ExtendObjectDefinition<{ object: MakeFieldOptional<InnerDef<Input>, Op>; }, Origin>; required(): ExtendObjectDefinition<{ object: MakeFieldRequired<InnerDef<Input>, keyof InnerDef<Input>>; }, Origin>; required<Op extends keyof InnerDef<Input>>(keys: Op | Op[]): ExtendObjectDefinition<{ object: MakeFieldRequired<InnerDef<Input>, Op>; }, Origin>; } export declare function extendObjectDefinition<Input>(input: Input): ExtendObjectDefinition<Input, Input>; export type InnerDef<Input> = ([ Input ] extends [object] ? DescribeField<Input> extends infer R ? IsKnown<R> extends 1 ? _InnerDef<R> : DescribeObjectDefinition<Input> : never : never) extends infer R ? { [K in keyof R]: R[K]; } & {} : {}; export type _InnerDef<R> = 'type' extends keyof R ? 'def' extends keyof R ? R['type'] extends 'object' ? R['def'] extends object ? DescribeObjectDefinition<R['def']> : never : never : never : never; export type MakeFieldOptional<Object extends object, OptionalField extends A.Key> = OverrideField<Object, OptionalField, { optional: true; }>; export type MakeFieldRequired<Object extends object, OptionalField extends A.Key> = OverrideField<Object, OptionalField, { optional: false; }>; export type OverrideField<Object extends object, Field extends A.Key, Extend extends object> = { [K in keyof Object as K extends string ? K : never]: K extends Field ? SealedField<Omit<DescribeField<Object[K]>, keyof Extend> & Extend> : Object[K]; };