diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b5aa82b..55baf524 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,10 +53,6 @@ - @cosmjs/utils: Added `assertDefinedAndNotNull`. -### Removed - -- @cosmjs/utils: `assertDefined` removed in favour of `assertDefinedAndNotNull`. - ## 0.23.2 (2021-01-06) ### Security diff --git a/packages/cosmwasm-stargate/src/queries/wasm.spec.ts b/packages/cosmwasm-stargate/src/queries/wasm.spec.ts index 48363469..78b7897f 100644 --- a/packages/cosmwasm-stargate/src/queries/wasm.spec.ts +++ b/packages/cosmwasm-stargate/src/queries/wasm.spec.ts @@ -9,7 +9,7 @@ import { parseRawLog, SigningStargateClient, } from "@cosmjs/stargate"; -import { assert, assertDefinedAndNotNull } from "@cosmjs/utils"; +import { assert, assertDefined } from "@cosmjs/utils"; import Long from "long"; import { cosmwasm } from "../codec"; @@ -395,7 +395,7 @@ describe("WasmExtension", () => { expect(codeId).toBeGreaterThanOrEqual(1); expect(codeId).toBeLessThanOrEqual(200); - assertDefinedAndNotNull(result.data); + assertDefined(result.data); const msgData = fromOneElementArray(result.data); expect(msgData.msgType).toEqual("store-code"); expect(MsgStoreCodeResponse.decode(msgData.data!)).toEqual( @@ -415,7 +415,7 @@ describe("WasmExtension", () => { const amountAttr = logs.findAttribute(parsedLogs, "transfer", "amount"); expect(amountAttr.value).toEqual("1234ucosm,321ustake"); - assertDefinedAndNotNull(result.data); + assertDefined(result.data); const msgData = fromOneElementArray(result.data); expect(msgData.msgType).toEqual("instantiate"); expect(MsgInstantiateContractResponse.decode(msgData.data!)).toEqual( @@ -441,7 +441,7 @@ describe("WasmExtension", () => { value: beneficiaryAddress, }); - assertDefinedAndNotNull(result.data); + assertDefined(result.data); const msgData = fromOneElementArray(result.data); expect(msgData.msgType).toEqual("execute"); expect(MsgExecuteContractResponse.decode(msgData.data!)).toEqual( diff --git a/packages/stargate/src/queries/queryclient.ts b/packages/stargate/src/queries/queryclient.ts index f9d636cd..31cf9ef1 100644 --- a/packages/stargate/src/queries/queryclient.ts +++ b/packages/stargate/src/queries/queryclient.ts @@ -3,7 +3,7 @@ import { iavlSpec, ics23, tendermintSpec, verifyExistence, verifyNonExistence } import { toAscii, toHex } from "@cosmjs/encoding"; import { firstEvent } from "@cosmjs/stream"; import { Client as TendermintClient, Header, NewBlockHeaderEvent, ProofOp } from "@cosmjs/tendermint-rpc"; -import { arrayContentEquals, assert, assertDefinedAndNotNull, isNonNullObject, sleep } from "@cosmjs/utils"; +import { arrayContentEquals, assert, assertDefined, isNonNullObject, sleep } from "@cosmjs/utils"; import { Stream } from "xstream"; type QueryExtensionSetup

= (base: QueryClient) => P; @@ -233,7 +233,7 @@ export class QueryClient { // this must return the header for height+1 // throws an error if height is 0 or undefined private async getNextHeader(height?: number): Promise

{ - assertDefinedAndNotNull(height); + assertDefined(height); if (height === 0) { throw new Error("Query returned height 0, cannot prove it"); } diff --git a/packages/utils/src/assert.spec.ts b/packages/utils/src/assert.spec.ts index d22b5c16..669405a5 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 14f37517..65b7ca24 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 596d63db..372b3615 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 65f3dfdb..36ab18e0 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 596d63db..372b3615 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";