// Copied from https://github.com/rocicorp/replicache/blob/main/src/asserts.ts // under the auspice of Go Wisdom's "A little copying is better than a // little dependency." type Truthy = T extends null | undefined | false | '' | 0 ? never : T; export function assert( b: T, msg = 'Assertion failed', ): asserts b is Truthy { if (!b) { throw new Error(msg); } } export function assertString(v: unknown): asserts v is string { assertType(v, 'string'); } export function assertNumber(v: unknown): asserts v is number { assertType(v, 'number'); } export function assertBoolean(v: unknown): asserts v is boolean { assertType(v, 'boolean'); } function assertType(v: unknown, t: string) { if (typeof v !== t) { throwInvalidType(v, t); } } export function assertObject(v: unknown): asserts v is Record { if (v === null) { throwInvalidType(v, 'object'); } assertType(v, 'object'); } export function assertArray(v: unknown): asserts v is unknown[] { if (!Array.isArray(v)) { throwInvalidType(v, 'array'); } } export function invalidType(v: unknown, t: string): string { let s = 'Invalid type: '; if (v === null || v === undefined) { s += v; } else { s += `${typeof v} \`${v}\``; } return s + `, expected ${t}`; } export function throwInvalidType(v: unknown, t: string): never { throw new Error(invalidType(v, t)); } export function assertNotNull(v: T | null): asserts v is T { if (v === null) { throw new Error('Expected non-null value'); } } export function assertNotUndefined(v: T | undefined): asserts v is T { if (v === undefined) { throw new Error('Expected non undefined value'); } } export function assertInstanceof( v: unknown, t: new (...args: unknown[]) => T, ): asserts v is T { if (!(v instanceof t)) { throw new Error(`Expected instanceof ${t.name}`); } } export function assertUint8Array(v: unknown): asserts v is Uint8Array { assertInstanceof(v, Uint8Array); }