From a2a16b55b40bf0a9aec4628b6e223293b734e1e0 Mon Sep 17 00:00:00 2001 From: dynst <148708712+dynst@users.noreply.github.com> Date: Tue, 12 Aug 2025 00:00:00 +0000 Subject: [PATCH 1/3] remove redundancy from JsonCompatibleDictionary --- packages/json-rpc/src/compatibility.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/json-rpc/src/compatibility.ts b/packages/json-rpc/src/compatibility.ts index 3ef1cbba2d..3fceb16c00 100644 --- a/packages/json-rpc/src/compatibility.ts +++ b/packages/json-rpc/src/compatibility.ts @@ -19,7 +19,7 @@ export interface JsonCompatibleArray extends ReadonlyArray * A string to json value dictionary. */ export interface JsonCompatibleDictionary { - readonly [key: string]: JsonCompatibleValue | readonly JsonCompatibleValue[]; + readonly [key: string]: JsonCompatibleValue; } export function isJsonCompatibleValue(value: unknown): value is JsonCompatibleValue { From 5bd8aaf789b5cf33f951b78bd67c3ee4e76d9eca Mon Sep 17 00:00:00 2001 From: dynst <148708712+dynst@users.noreply.github.com> Date: Tue, 12 Aug 2025 00:00:00 +0000 Subject: [PATCH 2/3] export json types from utils package --- .pnp.cjs | 1 + packages/json-rpc/package.json | 1 + packages/json-rpc/src/parse.ts | 3 ++- packages/json-rpc/src/types.ts | 2 +- packages/json-rpc/src/workers/dummyservice.worker.ts | 3 ++- packages/utils/src/index.ts | 2 ++ .../src/compatibility.spec.ts => utils/src/json.spec.ts} | 2 +- packages/{json-rpc/src/compatibility.ts => utils/src/json.ts} | 0 yarn.lock | 1 + 9 files changed, 11 insertions(+), 4 deletions(-) rename packages/{json-rpc/src/compatibility.spec.ts => utils/src/json.spec.ts} (99%) rename packages/{json-rpc/src/compatibility.ts => utils/src/json.ts} (100%) diff --git a/.pnp.cjs b/.pnp.cjs index 380e66cbe8..e423b00908 100644 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -3638,6 +3638,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@cosmjs/json-rpc", "workspace:packages/json-rpc"],\ ["@cosmjs/stream", "workspace:packages/stream"],\ + ["@cosmjs/utils", "workspace:packages/utils"],\ ["@istanbuljs/nyc-config-typescript", "virtual:4f1584ad4aba8733a24be7c8aebbffafef25607f2d00f4b314cf96717145c692763628a31c2b85d4686fbb091ff21ebffa3cc337399c042c19a32b9bdb786464#npm:1.0.1"],\ ["@types/jasmine", "npm:4.6.1"],\ ["@types/karma-firefox-launcher", "npm:2.1.0"],\ diff --git a/packages/json-rpc/package.json b/packages/json-rpc/package.json index 0cd43867fa..f95408ca20 100644 --- a/packages/json-rpc/package.json +++ b/packages/json-rpc/package.json @@ -39,6 +39,7 @@ }, "dependencies": { "@cosmjs/stream": "workspace:^", + "@cosmjs/utils": "workspace:^", "xstream": "^11.14.0" }, "devDependencies": { diff --git a/packages/json-rpc/src/parse.ts b/packages/json-rpc/src/parse.ts index ad30b1f90e..09fa081dca 100644 --- a/packages/json-rpc/src/parse.ts +++ b/packages/json-rpc/src/parse.ts @@ -4,7 +4,8 @@ import { isJsonCompatibleValue, JsonCompatibleDictionary, JsonCompatibleValue, -} from "./compatibility"; +} from "@cosmjs/utils"; + import { JsonRpcError, JsonRpcErrorResponse, diff --git a/packages/json-rpc/src/types.ts b/packages/json-rpc/src/types.ts index edcfcdcbef..6ca5d10875 100644 --- a/packages/json-rpc/src/types.ts +++ b/packages/json-rpc/src/types.ts @@ -1,4 +1,4 @@ -import { JsonCompatibleArray, JsonCompatibleDictionary, JsonCompatibleValue } from "./compatibility"; +import type { JsonCompatibleArray, JsonCompatibleDictionary, JsonCompatibleValue } from "@cosmjs/utils"; export type JsonRpcId = number | string; diff --git a/packages/json-rpc/src/workers/dummyservice.worker.ts b/packages/json-rpc/src/workers/dummyservice.worker.ts index 2c7bc9bca4..4928c24ccf 100644 --- a/packages/json-rpc/src/workers/dummyservice.worker.ts +++ b/packages/json-rpc/src/workers/dummyservice.worker.ts @@ -2,7 +2,8 @@ // for testing only -import { isJsonCompatibleDictionary } from "../compatibility"; +import { isJsonCompatibleDictionary } from "@cosmjs/utils"; + import { parseJsonRpcId, parseJsonRpcRequest } from "../parse"; import { jsonRpcCode, diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 624348188b..b91b33d398 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1,4 +1,6 @@ export { arrayContentEquals, arrayContentStartsWith } from "./arrays"; export { assert, assertDefined, assertDefinedAndNotNull } from "./assert"; +export type { JsonCompatibleArray, JsonCompatibleDictionary, JsonCompatibleValue } from "./json"; +export { isJsonCompatibleArray, isJsonCompatibleDictionary, isJsonCompatibleValue } from "./json"; export { sleep } from "./sleep"; export { isDefined, isNonNullObject, isUint8Array } from "./typechecks"; diff --git a/packages/json-rpc/src/compatibility.spec.ts b/packages/utils/src/json.spec.ts similarity index 99% rename from packages/json-rpc/src/compatibility.spec.ts rename to packages/utils/src/json.spec.ts index 485fc784c0..2b20743c28 100644 --- a/packages/json-rpc/src/compatibility.spec.ts +++ b/packages/utils/src/json.spec.ts @@ -1,4 +1,4 @@ -import { isJsonCompatibleArray, isJsonCompatibleDictionary, isJsonCompatibleValue } from "./compatibility"; +import { isJsonCompatibleArray, isJsonCompatibleDictionary, isJsonCompatibleValue } from "./json"; describe("json", () => { function sum(a: number, b: number): number { diff --git a/packages/json-rpc/src/compatibility.ts b/packages/utils/src/json.ts similarity index 100% rename from packages/json-rpc/src/compatibility.ts rename to packages/utils/src/json.ts diff --git a/yarn.lock b/yarn.lock index df7815887c..30189bbddf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -450,6 +450,7 @@ __metadata: resolution: "@cosmjs/json-rpc@workspace:packages/json-rpc" dependencies: "@cosmjs/stream": "workspace:^" + "@cosmjs/utils": "workspace:^" "@istanbuljs/nyc-config-typescript": "npm:^1.0.1" "@types/jasmine": "npm:^4" "@types/karma-firefox-launcher": "npm:^2" From 4e13f52b3553f63e47634d56ecde64ac70f3411a Mon Sep 17 00:00:00 2001 From: dynst <148708712+dynst@users.noreply.github.com> Date: Tue, 12 Aug 2025 00:00:00 +0000 Subject: [PATCH 3/3] rename json types --- packages/json-rpc/src/parse.ts | 26 ++-- packages/json-rpc/src/types.ts | 6 +- .../src/workers/dummyservice.worker.ts | 6 +- packages/utils/src/index.ts | 4 +- packages/utils/src/json.spec.ts | 118 +++++++++--------- packages/utils/src/json.ts | 30 ++--- 6 files changed, 89 insertions(+), 101 deletions(-) diff --git a/packages/json-rpc/src/parse.ts b/packages/json-rpc/src/parse.ts index 09fa081dca..35f60abe65 100644 --- a/packages/json-rpc/src/parse.ts +++ b/packages/json-rpc/src/parse.ts @@ -1,10 +1,4 @@ -import { - isJsonCompatibleArray, - isJsonCompatibleDictionary, - isJsonCompatibleValue, - JsonCompatibleDictionary, - JsonCompatibleValue, -} from "@cosmjs/utils"; +import { type JsonObject, type JsonValue, isJsonArray, isJsonObject, isJsonValue } from "@cosmjs/utils"; import { JsonRpcError, @@ -21,7 +15,7 @@ import { * Returns `null` when no valid ID was found. */ export function parseJsonRpcId(data: unknown): JsonRpcId | null { - if (!isJsonCompatibleDictionary(data)) { + if (!isJsonObject(data)) { throw new Error("Data must be JSON compatible dictionary"); } @@ -33,7 +27,7 @@ export function parseJsonRpcId(data: unknown): JsonRpcId | null { } export function parseJsonRpcRequest(data: unknown): JsonRpcRequest { - if (!isJsonCompatibleDictionary(data)) { + if (!isJsonObject(data)) { throw new Error("Data must be JSON compatible dictionary"); } @@ -54,7 +48,7 @@ export function parseJsonRpcRequest(data: unknown): JsonRpcRequest { throw new Error(`Invalid "method" field. Must be a string.`); } - if (!isJsonCompatibleArray(data.params) && !isJsonCompatibleDictionary(data.params)) { + if (!isJsonArray(data.params) && !isJsonObject(data.params)) { throw new Error("Invalid params field"); } @@ -66,7 +60,7 @@ export function parseJsonRpcRequest(data: unknown): JsonRpcRequest { }; } -function parseError(error: JsonCompatibleDictionary): JsonRpcError { +function parseError(error: JsonObject): JsonRpcError { if (typeof error.code !== "number") { throw new Error("Error property 'code' is not a number"); } @@ -75,11 +69,11 @@ function parseError(error: JsonCompatibleDictionary): JsonRpcError { throw new Error("Error property 'message' is not a string"); } - let maybeUndefinedData: JsonCompatibleValue | undefined; + let maybeUndefinedData: JsonValue | undefined; if (error.data === undefined) { maybeUndefinedData = undefined; - } else if (isJsonCompatibleValue(error.data)) { + } else if (isJsonValue(error.data)) { maybeUndefinedData = error.data; } else { throw new Error("Error property 'data' is defined but not a JSON compatible value."); @@ -94,7 +88,7 @@ function parseError(error: JsonCompatibleDictionary): JsonRpcError { /** Throws if data is not a JsonRpcErrorResponse */ export function parseJsonRpcErrorResponse(data: unknown): JsonRpcErrorResponse { - if (!isJsonCompatibleDictionary(data)) { + if (!isJsonObject(data)) { throw new Error("Data must be JSON compatible dictionary"); } @@ -107,7 +101,7 @@ export function parseJsonRpcErrorResponse(data: unknown): JsonRpcErrorResponse { throw new Error("Invalid id field"); } - if (typeof data.error === "undefined" || !isJsonCompatibleDictionary(data.error)) { + if (typeof data.error === "undefined" || !isJsonObject(data.error)) { throw new Error("Invalid error field"); } @@ -120,7 +114,7 @@ export function parseJsonRpcErrorResponse(data: unknown): JsonRpcErrorResponse { /** Throws if data is not a JsonRpcSuccessResponse */ export function parseJsonRpcSuccessResponse(data: unknown): JsonRpcSuccessResponse { - if (!isJsonCompatibleDictionary(data)) { + if (!isJsonObject(data)) { throw new Error("Data must be JSON compatible dictionary"); } diff --git a/packages/json-rpc/src/types.ts b/packages/json-rpc/src/types.ts index 6ca5d10875..b88f6724a9 100644 --- a/packages/json-rpc/src/types.ts +++ b/packages/json-rpc/src/types.ts @@ -1,4 +1,4 @@ -import type { JsonCompatibleArray, JsonCompatibleDictionary, JsonCompatibleValue } from "@cosmjs/utils"; +import type { JsonArray, JsonObject, JsonValue } from "@cosmjs/utils"; export type JsonRpcId = number | string; @@ -6,7 +6,7 @@ export interface JsonRpcRequest { readonly jsonrpc: "2.0"; readonly id: JsonRpcId; readonly method: string; - readonly params: JsonCompatibleArray | JsonCompatibleDictionary; + readonly params: JsonArray | JsonObject; } export interface JsonRpcSuccessResponse { @@ -18,7 +18,7 @@ export interface JsonRpcSuccessResponse { export interface JsonRpcError { readonly code: number; readonly message: string; - readonly data?: JsonCompatibleValue; + readonly data?: JsonValue; } /** diff --git a/packages/json-rpc/src/workers/dummyservice.worker.ts b/packages/json-rpc/src/workers/dummyservice.worker.ts index 4928c24ccf..8867036e35 100644 --- a/packages/json-rpc/src/workers/dummyservice.worker.ts +++ b/packages/json-rpc/src/workers/dummyservice.worker.ts @@ -2,7 +2,7 @@ // for testing only -import { isJsonCompatibleDictionary } from "@cosmjs/utils"; +import { isJsonObject } from "@cosmjs/utils"; import { parseJsonRpcId, parseJsonRpcRequest } from "../parse"; import { @@ -32,7 +32,7 @@ function handleRequest(event: MessageEvent): JsonRpcResponse { // This is just a text representation of the request. It can be lossy as it is not needed for further processing. let paramsString: string; - if (isJsonCompatibleDictionary(request.params)) { + if (isJsonObject(request.params)) { paramsString = JSON.stringify(request.params); } else { paramsString = request.params @@ -45,7 +45,7 @@ function handleRequest(event: MessageEvent): JsonRpcResponse { return `"${p}"`; } else { // Nested arrays or dictionaries. No need to traverse. - return isJsonCompatibleDictionary(p) ? "{ … }" : "[ … ]"; + return isJsonObject(p) ? "{ … }" : "[ … ]"; } }) .join(", "); diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index b91b33d398..c9dae93dc1 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1,6 +1,6 @@ export { arrayContentEquals, arrayContentStartsWith } from "./arrays"; export { assert, assertDefined, assertDefinedAndNotNull } from "./assert"; -export type { JsonCompatibleArray, JsonCompatibleDictionary, JsonCompatibleValue } from "./json"; -export { isJsonCompatibleArray, isJsonCompatibleDictionary, isJsonCompatibleValue } from "./json"; +export type { JsonArray, JsonObject, JsonValue } from "./json"; +export { isJsonArray, isJsonObject, isJsonValue } from "./json"; export { sleep } from "./sleep"; export { isDefined, isNonNullObject, isUint8Array } from "./typechecks"; diff --git a/packages/utils/src/json.spec.ts b/packages/utils/src/json.spec.ts index 2b20743c28..ee65e660de 100644 --- a/packages/utils/src/json.spec.ts +++ b/packages/utils/src/json.spec.ts @@ -1,125 +1,125 @@ -import { isJsonCompatibleArray, isJsonCompatibleDictionary, isJsonCompatibleValue } from "./json"; +import { isJsonArray, isJsonObject, isJsonValue } from "./json"; describe("json", () => { function sum(a: number, b: number): number { return a + b; } - describe("isJsonCompatibleValue", () => { + describe("isJsonValue", () => { it("returns true for primitive types", () => { - expect(isJsonCompatibleValue(null)).toEqual(true); - expect(isJsonCompatibleValue(0)).toEqual(true); - expect(isJsonCompatibleValue(1)).toEqual(true); - expect(isJsonCompatibleValue("abc")).toEqual(true); - expect(isJsonCompatibleValue(true)).toEqual(true); - expect(isJsonCompatibleValue(false)).toEqual(true); + expect(isJsonValue(null)).toEqual(true); + expect(isJsonValue(0)).toEqual(true); + expect(isJsonValue(1)).toEqual(true); + expect(isJsonValue("abc")).toEqual(true); + expect(isJsonValue(true)).toEqual(true); + expect(isJsonValue(false)).toEqual(true); }); it("returns true for arrays", () => { - expect(isJsonCompatibleValue([1, 2, 3])).toEqual(true); - expect(isJsonCompatibleValue([1, "2", true, null])).toEqual(true); - expect(isJsonCompatibleValue([1, "2", true, null, [1, "2", true, null]])).toEqual(true); - expect(isJsonCompatibleValue([{ a: 123 }])).toEqual(true); + expect(isJsonValue([1, 2, 3])).toEqual(true); + expect(isJsonValue([1, "2", true, null])).toEqual(true); + expect(isJsonValue([1, "2", true, null, [1, "2", true, null]])).toEqual(true); + expect(isJsonValue([{ a: 123 }])).toEqual(true); }); it("returns true for simple dicts", () => { - expect(isJsonCompatibleValue({ a: 123 })).toEqual(true); - expect(isJsonCompatibleValue({ a: "abc" })).toEqual(true); - expect(isJsonCompatibleValue({ a: true })).toEqual(true); - expect(isJsonCompatibleValue({ a: null })).toEqual(true); + expect(isJsonValue({ a: 123 })).toEqual(true); + expect(isJsonValue({ a: "abc" })).toEqual(true); + expect(isJsonValue({ a: true })).toEqual(true); + expect(isJsonValue({ a: null })).toEqual(true); }); it("returns true for dict with array", () => { - expect(isJsonCompatibleValue({ a: [1, 2, 3] })).toEqual(true); - expect(isJsonCompatibleValue({ a: [1, "2", true, null] })).toEqual(true); + expect(isJsonValue({ a: [1, 2, 3] })).toEqual(true); + expect(isJsonValue({ a: [1, "2", true, null] })).toEqual(true); }); it("returns true for nested dicts", () => { - expect(isJsonCompatibleValue({ a: { b: 123 } })).toEqual(true); + expect(isJsonValue({ a: { b: 123 } })).toEqual(true); }); it("returns false for functions", () => { - expect(isJsonCompatibleValue(sum)).toEqual(false); + expect(isJsonValue(sum)).toEqual(false); }); it("returns true for empty dicts", () => { - expect(isJsonCompatibleValue({})).toEqual(true); + expect(isJsonValue({})).toEqual(true); }); }); - describe("isJsonCompatibleArray", () => { + describe("isJsonArray", () => { it("returns false for primitive types", () => { - expect(isJsonCompatibleArray(null)).toEqual(false); - expect(isJsonCompatibleArray(undefined)).toEqual(false); - expect(isJsonCompatibleArray(0)).toEqual(false); - expect(isJsonCompatibleArray(1)).toEqual(false); - expect(isJsonCompatibleArray("abc")).toEqual(false); - expect(isJsonCompatibleArray(true)).toEqual(false); - expect(isJsonCompatibleArray(false)).toEqual(false); + expect(isJsonArray(null)).toEqual(false); + expect(isJsonArray(undefined)).toEqual(false); + expect(isJsonArray(0)).toEqual(false); + expect(isJsonArray(1)).toEqual(false); + expect(isJsonArray("abc")).toEqual(false); + expect(isJsonArray(true)).toEqual(false); + expect(isJsonArray(false)).toEqual(false); }); it("returns true for arrays", () => { - expect(isJsonCompatibleArray([1, 2, 3])).toEqual(true); - expect(isJsonCompatibleArray([1, "2", true, null])).toEqual(true); - expect(isJsonCompatibleArray([1, "2", true, null, [1, "2", true, null]])).toEqual(true); - expect(isJsonCompatibleArray([{ a: 123 }])).toEqual(true); + expect(isJsonArray([1, 2, 3])).toEqual(true); + expect(isJsonArray([1, "2", true, null])).toEqual(true); + expect(isJsonArray([1, "2", true, null, [1, "2", true, null]])).toEqual(true); + expect(isJsonArray([{ a: 123 }])).toEqual(true); }); it("returns false for dicts", () => { - expect(isJsonCompatibleArray({ a: 123 })).toEqual(false); - expect(isJsonCompatibleArray({ a: "abc" })).toEqual(false); - expect(isJsonCompatibleArray({ a: true })).toEqual(false); - expect(isJsonCompatibleArray({ a: null })).toEqual(false); + expect(isJsonArray({ a: 123 })).toEqual(false); + expect(isJsonArray({ a: "abc" })).toEqual(false); + expect(isJsonArray({ a: true })).toEqual(false); + expect(isJsonArray({ a: null })).toEqual(false); }); it("returns false for functions", () => { - expect(isJsonCompatibleArray(sum)).toEqual(false); + expect(isJsonArray(sum)).toEqual(false); }); }); - describe("isJsonCompatibleDictionary", () => { + describe("isJsonObject", () => { it("returns false for primitive types", () => { - expect(isJsonCompatibleDictionary(null)).toEqual(false); - expect(isJsonCompatibleDictionary(undefined)).toEqual(false); - expect(isJsonCompatibleDictionary(0)).toEqual(false); - expect(isJsonCompatibleDictionary(1)).toEqual(false); - expect(isJsonCompatibleDictionary("abc")).toEqual(false); - expect(isJsonCompatibleDictionary(true)).toEqual(false); - expect(isJsonCompatibleDictionary(false)).toEqual(false); + expect(isJsonObject(null)).toEqual(false); + expect(isJsonObject(undefined)).toEqual(false); + expect(isJsonObject(0)).toEqual(false); + expect(isJsonObject(1)).toEqual(false); + expect(isJsonObject("abc")).toEqual(false); + expect(isJsonObject(true)).toEqual(false); + expect(isJsonObject(false)).toEqual(false); }); it("returns false for other objects", () => { - expect(isJsonCompatibleDictionary(new Uint8Array([0x00]))).toEqual(false); - expect(isJsonCompatibleDictionary(/123/)).toEqual(false); - expect(isJsonCompatibleDictionary(new Date())).toEqual(false); + expect(isJsonObject(new Uint8Array([0x00]))).toEqual(false); + expect(isJsonObject(/123/)).toEqual(false); + expect(isJsonObject(new Date())).toEqual(false); }); it("returns false for arrays", () => { - expect(isJsonCompatibleDictionary([1, 2, 3])).toEqual(false); + expect(isJsonObject([1, 2, 3])).toEqual(false); }); it("returns false for functions", () => { - expect(isJsonCompatibleDictionary(sum)).toEqual(false); + expect(isJsonObject(sum)).toEqual(false); }); it("returns true for empty dicts", () => { - expect(isJsonCompatibleDictionary({})).toEqual(true); + expect(isJsonObject({})).toEqual(true); }); it("returns true for simple dicts", () => { - expect(isJsonCompatibleDictionary({ a: 123 })).toEqual(true); - expect(isJsonCompatibleDictionary({ a: "abc" })).toEqual(true); - expect(isJsonCompatibleDictionary({ a: true })).toEqual(true); - expect(isJsonCompatibleDictionary({ a: null })).toEqual(true); + expect(isJsonObject({ a: 123 })).toEqual(true); + expect(isJsonObject({ a: "abc" })).toEqual(true); + expect(isJsonObject({ a: true })).toEqual(true); + expect(isJsonObject({ a: null })).toEqual(true); }); it("returns true for dict with array", () => { - expect(isJsonCompatibleDictionary({ a: [1, 2, 3] })).toEqual(true); - expect(isJsonCompatibleDictionary({ a: [1, "2", true, null] })).toEqual(true); + expect(isJsonObject({ a: [1, 2, 3] })).toEqual(true); + expect(isJsonObject({ a: [1, "2", true, null] })).toEqual(true); }); it("returns true for nested dicts", () => { - expect(isJsonCompatibleDictionary({ a: { b: 123 } })).toEqual(true); + expect(isJsonObject({ a: { b: 123 } })).toEqual(true); }); }); }); diff --git a/packages/utils/src/json.ts b/packages/utils/src/json.ts index 3fceb16c00..38ea30b778 100644 --- a/packages/utils/src/json.ts +++ b/packages/utils/src/json.ts @@ -1,37 +1,31 @@ /** * A single JSON value. This is the missing return type of JSON.parse(). */ -export type JsonCompatibleValue = - | JsonCompatibleDictionary - | JsonCompatibleArray - | string - | number - | boolean - | null; +export type JsonValue = JsonObject | JsonArray | string | number | boolean | null; /** - * An array of JsonCompatibleValue + * An array of JsonValue */ // Use interface extension instead of type alias to make circular declaration possible. -export interface JsonCompatibleArray extends ReadonlyArray {} +export interface JsonArray extends ReadonlyArray {} /** * A string to json value dictionary. */ -export interface JsonCompatibleDictionary { - readonly [key: string]: JsonCompatibleValue; +export interface JsonObject { + readonly [key: string]: JsonValue; } -export function isJsonCompatibleValue(value: unknown): value is JsonCompatibleValue { +export function isJsonValue(value: unknown): value is JsonValue { if ( typeof value === "string" || typeof value === "number" || typeof value === "boolean" || value === null || // eslint-disable-next-line @typescript-eslint/no-use-before-define - isJsonCompatibleArray(value) || + isJsonArray(value) || // eslint-disable-next-line @typescript-eslint/no-use-before-define - isJsonCompatibleDictionary(value) + isJsonObject(value) ) { return true; } else { @@ -39,13 +33,13 @@ export function isJsonCompatibleValue(value: unknown): value is JsonCompatibleVa } } -export function isJsonCompatibleArray(value: unknown): value is JsonCompatibleArray { +export function isJsonArray(value: unknown): value is JsonArray { if (!Array.isArray(value)) { return false; } for (const item of value) { - if (!isJsonCompatibleValue(item)) { + if (!isJsonValue(item)) { return false; } } @@ -54,7 +48,7 @@ export function isJsonCompatibleArray(value: unknown): value is JsonCompatibleAr return true; } -export function isJsonCompatibleDictionary(value: unknown): value is JsonCompatibleDictionary { +export function isJsonObject(value: unknown): value is JsonObject { if (typeof value !== "object" || value === null) { // value must be a non-null object return false; @@ -67,5 +61,5 @@ export function isJsonCompatibleDictionary(value: unknown): value is JsonCompati return false; } - return Object.values(value).every(isJsonCompatibleValue); + return Object.values(value).every(isJsonValue); }