import {Nullable} from '../../types/common'; interface ErrorConstructor { new (...args: T): Error; } export function ensure(condition: boolean, ErrorToThrow: ErrorConstructor, ...errorArgs: T): asserts condition { if (!condition) { throw new ErrorToThrow(...errorArgs); } } export type NonFalsy = T extends null | undefined | 0 | '' ? never : T; export type NonNull = T extends null ? never : T; export function ensureNotFalsy(value: T, error: ErrorConstructor, ...errorArgs: E): asserts value is NonFalsy { return ensure(!!value, error, ...errorArgs); } export function ensureNotNull(value: Nullable, error: ErrorConstructor, ...errorArgs: E): asserts value is NonNull { return ensure(value !== null, error, ...errorArgs); } export function ensureNotEmpty(object: object, error: ErrorConstructor, ...errorArgs: T) { return ensure((Object.entries(object).length !== 0), error, ...errorArgs); }