UNPKG

nested-builder

Version:

Tersely construct complex test fixture objects with the builder pattern.

42 lines 2.45 kB
export interface GeneratedFieldTemplate<F> { generator: () => F; } export declare function isGenerated<F, T extends Template<F>>(fieldTemplate: FieldTemplate<F, T>): fieldTemplate is GeneratedFieldTemplate<F>; export interface DefaultFieldTemplate<F> { default: F; } export declare function isDefault<F, T extends Template<F>>(fieldTemplate: FieldTemplate<F, T>): fieldTemplate is DefaultFieldTemplate<F>; export interface NestedFieldTemplate<F, T extends Template<F>> { nested: BuilderClass<F, T>; } export declare function isNested<F, T extends Template<F>>(fieldTemplate: FieldTemplate<F, T>): fieldTemplate is NestedFieldTemplate<F, T>; export interface PluralFieldTemplate { plural: true; } export declare function isPlural<F, T extends Template<F>>(fieldTemplate: FieldTemplate<F, T>): fieldTemplate is PluralFieldTemplate; export declare type Element<A> = A extends (infer E)[] ? E : never; export declare type FieldTemplate<F, T extends Template<F>> = GeneratedFieldTemplate<F> | DefaultFieldTemplate<F> | NestedFieldTemplate<F, T> | PluralFieldTemplate | (PluralFieldTemplate & GeneratedFieldTemplate<F>) | (PluralFieldTemplate & DefaultFieldTemplate<F>) | (PluralFieldTemplate & NestedFieldTemplate<F, T>); export declare type Template<R> = { [P in keyof R]-?: FieldTemplate<R[P], Template<R[P]>>; }; declare type ScalarSetterFn<F, Self> = (value: F) => Self; declare type ScalarAdderFn<E, Self> = (value: E) => Self; declare type NestedSetterFn<F, T extends Template<F>, Self> = (block: (builder: Builder<F, T>) => any) => Self; declare type NestedAdderFn<E, T extends Template<E>, Self> = (block: (builder: Builder<E, T>) => any) => Self; declare type SingularSetterFn<F, T, Self> = T extends NestedFieldTemplate<infer SF, infer ST> ? NestedSetterFn<SF, ST, Self> : ScalarSetterFn<F, Self>; declare type PluralSetterFn<F, T, Self> = (T extends NestedFieldTemplate<infer SE, infer ST> ? { add: NestedAdderFn<SE, ST, Self>; } : { add: ScalarAdderFn<Element<F>, Self>; }) & ScalarSetterFn<F, Self>; declare type SetterFn<F, T, Self> = T extends PluralFieldTemplate ? PluralSetterFn<F, T, Self> : SingularSetterFn<F, T, Self>; export declare type Builder<R, T extends Template<R>> = { readonly [P in keyof R]-?: SetterFn<R[P], T[P], Builder<R, T>>; } & { build(): R; }; export declare type BuilderClass<R, T extends Template<R>> = { new (): Builder<R, T>; }; export {}; //# sourceMappingURL=types.d.ts.map