diff --git a/packages/utils/src/assert.spec.ts b/packages/utils/src/assert.spec.ts index d22b5c16cd..669405a597 100644 --- a/packages/utils/src/assert.spec.ts +++ b/packages/utils/src/assert.spec.ts @@ -1,6 +1,55 @@ -import { assertDefinedAndNotNull } from "./assert"; +import { assertDefined, assertDefinedAndNotNull } from "./assert"; describe("assert", () => { + describe("assertDefined", () => { + it("passes for simple values", () => { + { + const value: number | undefined = 123; + assertDefined(value); + expect(value).toEqual(123); + } + { + const value: string | undefined = "abc"; + assertDefined(value); + expect(value).toEqual("abc"); + } + }); + + it("passes for falsy values", () => { + { + const value: number | undefined = 0; + assertDefined(value); + expect(value).toEqual(0); + } + { + const value: string | undefined = ""; + assertDefined(value); + expect(value).toEqual(""); + } + { + const value: null | undefined = null; + assertDefined(value); + expect(value).toBeNull(); + } + }); + + it("throws for undefined values", () => { + { + const value: number | undefined = undefined; + expect(() => assertDefined(value)).toThrowError("value is undefined"); + } + { + let value: string | undefined; + expect(() => assertDefined(value)).toThrowError("value is undefined"); + } + }); + + it("throws with custom message", () => { + const value: number | undefined = undefined; + expect(() => assertDefined(value, "Bug in the data source")).toThrowError("Bug in the data source"); + }); + }); + describe("assertDefinedAndNotNull", () => { it("passes for simple values", () => { { diff --git a/packages/utils/src/assert.ts b/packages/utils/src/assert.ts index 14f37517ca..65b7ca2418 100644 --- a/packages/utils/src/assert.ts +++ b/packages/utils/src/assert.ts @@ -5,6 +5,12 @@ export function assert(condition: any, msg?: string): asserts condition { } } +export function assertDefined(value: T | undefined, msg?: string): asserts value is T { + if (value === undefined) { + throw new Error(msg ?? "value is undefined"); + } +} + export function assertDefinedAndNotNull(value: T | undefined | null, msg?: string): asserts value is T { if (value === undefined || value === null) { throw new Error(msg ?? "value is undefined or null"); diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 596d63db78..372b361537 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1,4 +1,4 @@ export { arrayContentEquals } from "./arrays"; -export { assert, assertDefinedAndNotNull } from "./assert"; +export { assert, assertDefined, assertDefinedAndNotNull } from "./assert"; export { sleep } from "./sleep"; export { isNonNullObject, isUint8Array } from "./typechecks"; diff --git a/packages/utils/types/assert.d.ts b/packages/utils/types/assert.d.ts index 65f3dfdb86..36ab18e071 100644 --- a/packages/utils/types/assert.d.ts +++ b/packages/utils/types/assert.d.ts @@ -1,4 +1,5 @@ export declare function assert(condition: any, msg?: string): asserts condition; +export declare function assertDefined(value: T | undefined, msg?: string): asserts value is T; export declare function assertDefinedAndNotNull( value: T | undefined | null, msg?: string, diff --git a/packages/utils/types/index.d.ts b/packages/utils/types/index.d.ts index 596d63db78..372b361537 100644 --- a/packages/utils/types/index.d.ts +++ b/packages/utils/types/index.d.ts @@ -1,4 +1,4 @@ export { arrayContentEquals } from "./arrays"; -export { assert, assertDefinedAndNotNull } from "./assert"; +export { assert, assertDefined, assertDefinedAndNotNull } from "./assert"; export { sleep } from "./sleep"; export { isNonNullObject, isUint8Array } from "./typechecks";