nested-builder
Version:
Tersely construct complex test fixture objects with the builder pattern.
42 lines • 2.45 kB
TypeScript
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