diff --git a/packages/stargate/src/stargateclient.ts b/packages/stargate/src/stargateclient.ts index 4b96bf19..ec23473c 100644 --- a/packages/stargate/src/stargateclient.ts +++ b/packages/stargate/src/stargateclient.ts @@ -3,7 +3,7 @@ import { Bech32, toAscii, toHex } from "@cosmjs/encoding"; import { Uint64 } from "@cosmjs/math"; import { BaseAccount, Coin, decodeAny } from "@cosmjs/proto-signing"; import { Client as TendermintClient } from "@cosmjs/tendermint-rpc"; -import { assert } from "@cosmjs/utils"; +import { assertDefined } from "@cosmjs/utils"; import Long from "long"; export interface GetSequenceResult { @@ -37,8 +37,8 @@ export class StargateClient { switch (typeUrl) { case "/cosmos.auth.BaseAccount": { const { account_number, sequence } = BaseAccount.decode(value); - assert(account_number !== undefined); - assert(sequence !== undefined); + assertDefined(account_number); + assertDefined(sequence); return { accountNumber: uint64FromProto(account_number).toNumber(), sequence: uint64FromProto(sequence).toNumber(), @@ -67,8 +67,8 @@ export class StargateClient { const responseData = await this.queryVerified("bank", bankKey); const { amount, denom } = Coin.decode(responseData); - assert(amount !== undefined); - assert(denom !== undefined); + assertDefined(amount); + assertDefined(denom); if (denom === "") { return null; diff --git a/packages/utils/src/assert.spec.ts b/packages/utils/src/assert.spec.ts new file mode 100644 index 00000000..4b6374cf --- /dev/null +++ b/packages/utils/src/assert.spec.ts @@ -0,0 +1,52 @@ +import { assertDefined } 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).toEqual(null); + } + }); + + 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"); + }); + }); +}); diff --git a/packages/utils/src/assert.ts b/packages/utils/src/assert.ts index 1c35d1c0..3c86b353 100644 --- a/packages/utils/src/assert.ts +++ b/packages/utils/src/assert.ts @@ -4,3 +4,9 @@ export function assert(condition: any, msg?: string): asserts condition { throw new Error(msg || "condition is not truthy"); } } + +export function assertDefined(value: T | undefined, msg?: string): asserts value is T { + if (value === undefined) { + throw new Error(msg || "value is undefined"); + } +} diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index ea096301..8d7c29d4 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1,3 +1,3 @@ -export { assert } from "./assert"; +export { assert, assertDefined } 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 2e9da4bf..385fadf1 100644 --- a/packages/utils/types/assert.d.ts +++ b/packages/utils/types/assert.d.ts @@ -1 +1,2 @@ export declare function assert(condition: any, msg?: string): asserts condition; +export declare function assertDefined(value: T | undefined, msg?: string): asserts value is T; diff --git a/packages/utils/types/index.d.ts b/packages/utils/types/index.d.ts index ea096301..8d7c29d4 100644 --- a/packages/utils/types/index.d.ts +++ b/packages/utils/types/index.d.ts @@ -1,3 +1,3 @@ -export { assert } from "./assert"; +export { assert, assertDefined } from "./assert"; export { sleep } from "./sleep"; export { isNonNullObject, isUint8Array } from "./typechecks";