@backland/schema
Version:
TypeScript schema declaration and validation library with static type inference
51 lines (50 loc) • 2.78 kB
TypeScript
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];
};