@metamask/utils
Advanced tools
+3
-0
@@ -7,4 +7,6 @@ export * from './assert'; | ||
| export * from './collections'; | ||
| export * from './encryption-types'; | ||
| export * from './hex'; | ||
| export * from './json'; | ||
| export * from './keyring'; | ||
| export * from './logging'; | ||
@@ -15,2 +17,3 @@ export * from './misc'; | ||
| export * from './time'; | ||
| export * from './transaction-types'; | ||
| export * from './versions'; |
+3
-0
@@ -23,4 +23,6 @@ "use strict"; | ||
| __exportStar(require("./collections"), exports); | ||
| __exportStar(require("./encryption-types"), exports); | ||
| __exportStar(require("./hex"), exports); | ||
| __exportStar(require("./json"), exports); | ||
| __exportStar(require("./keyring"), exports); | ||
| __exportStar(require("./logging"), exports); | ||
@@ -31,3 +33,4 @@ __exportStar(require("./misc"), exports); | ||
| __exportStar(require("./time"), exports); | ||
| __exportStar(require("./transaction-types"), exports); | ||
| __exportStar(require("./versions"), exports); | ||
| //# sourceMappingURL=index.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,2CAAyB;AACzB,0CAAwB;AACxB,6CAA2B;AAC3B,6CAA2B;AAC3B,gDAA8B;AAC9B,wCAAsB;AACtB,yCAAuB;AACvB,4CAA0B;AAC1B,yCAAuB;AACvB,2CAAyB;AACzB,2CAAyB;AACzB,yCAAuB;AACvB,6CAA2B","sourcesContent":["export * from './assert';\nexport * from './base64';\nexport * from './bytes';\nexport * from './checksum';\nexport * from './coercers';\nexport * from './collections';\nexport * from './hex';\nexport * from './json';\nexport * from './logging';\nexport * from './misc';\nexport * from './number';\nexport * from './opaque';\nexport * from './time';\nexport * from './versions';\n"]} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,2CAAyB;AACzB,0CAAwB;AACxB,6CAA2B;AAC3B,6CAA2B;AAC3B,gDAA8B;AAC9B,qDAAmC;AACnC,wCAAsB;AACtB,yCAAuB;AACvB,4CAA0B;AAC1B,4CAA0B;AAC1B,yCAAuB;AACvB,2CAAyB;AACzB,2CAAyB;AACzB,yCAAuB;AACvB,sDAAoC;AACpC,6CAA2B","sourcesContent":["export * from './assert';\nexport * from './base64';\nexport * from './bytes';\nexport * from './checksum';\nexport * from './coercers';\nexport * from './collections';\nexport * from './encryption-types';\nexport * from './hex';\nexport * from './json';\nexport * from './keyring';\nexport * from './logging';\nexport * from './misc';\nexport * from './number';\nexport * from './opaque';\nexport * from './time';\nexport * from './transaction-types';\nexport * from './versions';\n"]} |
+25
-16
| import { Infer, Struct } from 'superstruct'; | ||
| import { AssertionErrorConstructor } from './assert'; | ||
| export declare const JsonStruct: Struct<Json, null>; | ||
| /** | ||
@@ -11,2 +10,15 @@ * Any JSON-compatible value. | ||
| /** | ||
| * A struct to check if the given value is a valid JSON-serializable value. | ||
| * | ||
| * Note that this struct is unsafe. For safe validation, use {@link JsonStruct}. | ||
| */ | ||
| export declare const UnsafeJsonStruct: Struct<Json>; | ||
| /** | ||
| * A struct to check if the given value is a valid JSON-serializable value. | ||
| * | ||
| * This struct sanitizes the value before validating it, so that it is safe to | ||
| * use with untrusted input. | ||
| */ | ||
| export declare const JsonStruct: Struct<Json, null>; | ||
| /** | ||
| * Check if the given value is a valid {@link Json} value, i.e., a value that is | ||
@@ -20,2 +32,9 @@ * serializable to JSON. | ||
| /** | ||
| * Get the size of a JSON value in bytes. This also validates the value. | ||
| * | ||
| * @param value - The JSON value to get the size of. | ||
| * @returns The size of the JSON value in bytes. | ||
| */ | ||
| export declare function getJsonSize(value: unknown): number; | ||
| /** | ||
| * The string '2.0'. | ||
@@ -61,3 +80,3 @@ */ | ||
| export declare type JsonRpcError = OptionalField<Infer<typeof JsonRpcErrorStruct>, 'data'>; | ||
| export declare const JsonRpcParamsStruct: Struct<Record<string, Json> | Json[] | undefined, null>; | ||
| export declare const JsonRpcParamsStruct: Struct<Json[] | Record<string, Json> | undefined, null>; | ||
| export declare type JsonRpcParams = Infer<typeof JsonRpcParamsStruct>; | ||
@@ -68,3 +87,3 @@ export declare const JsonRpcRequestStruct: Struct<{ | ||
| jsonrpc: "2.0"; | ||
| params?: Record<string, Json> | Json[] | undefined; | ||
| params?: Json[] | Record<string, Json> | undefined; | ||
| }, { | ||
@@ -74,3 +93,3 @@ id: Struct<string | number | null, null>; | ||
| method: Struct<string, null>; | ||
| params: Struct<Record<string, Json> | Json[] | undefined, null>; | ||
| params: Struct<Json[] | Record<string, Json> | undefined, null>; | ||
| }>; | ||
@@ -89,3 +108,3 @@ export declare type InferWithParams<Type extends Struct<any>, Params extends JsonRpcParams> = Omit<Infer<Type>, 'params'> & (keyof Params extends undefined ? { | ||
| jsonrpc: "2.0"; | ||
| params?: Record<string, Json> | Json[] | undefined; | ||
| params?: Json[] | Record<string, Json> | undefined; | ||
| }, Omit<{ | ||
@@ -95,3 +114,3 @@ id: Struct<string | number | null, null>; | ||
| method: Struct<string, null>; | ||
| params: Struct<Record<string, Json> | Json[] | undefined, null>; | ||
| params: Struct<Json[] | Record<string, Json> | undefined, null>; | ||
| }, "id">>; | ||
@@ -322,12 +341,2 @@ /** | ||
| export declare function getJsonRpcIdValidator(options?: JsonRpcValidatorOptions): (id: unknown) => id is string | number | null; | ||
| /** | ||
| * Checks whether a value is JSON serializable and counts the total number | ||
| * of bytes needed to store the serialized version of the value. | ||
| * | ||
| * @param jsObject - Potential JSON serializable object. | ||
| * @param skipSizingProcess - Skip JSON size calculation (default: false). | ||
| * @returns Tuple [isValid, plainTextSizeInBytes] containing a boolean that signals whether | ||
| * the value was serializable and a number of bytes that it will use when serialized to JSON. | ||
| */ | ||
| export declare function validateJsonAndGetSize(jsObject: unknown, skipSizingProcess?: boolean): [isValid: boolean, plainTextSizeInBytes: number]; | ||
| export {}; |
+83
-131
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.validateJsonAndGetSize = exports.getJsonRpcIdValidator = exports.assertIsJsonRpcError = exports.isJsonRpcError = exports.assertIsJsonRpcFailure = exports.isJsonRpcFailure = exports.assertIsJsonRpcSuccess = exports.isJsonRpcSuccess = exports.assertIsJsonRpcResponse = exports.isJsonRpcResponse = exports.assertIsPendingJsonRpcResponse = exports.isPendingJsonRpcResponse = exports.JsonRpcResponseStruct = exports.JsonRpcFailureStruct = exports.JsonRpcSuccessStruct = exports.PendingJsonRpcResponseStruct = exports.assertIsJsonRpcRequest = exports.isJsonRpcRequest = exports.assertIsJsonRpcNotification = exports.isJsonRpcNotification = exports.JsonRpcNotificationStruct = exports.JsonRpcRequestStruct = exports.JsonRpcParamsStruct = exports.JsonRpcErrorStruct = exports.JsonRpcIdStruct = exports.JsonRpcVersionStruct = exports.jsonrpc2 = exports.isValidJson = exports.JsonStruct = void 0; | ||
| exports.getJsonRpcIdValidator = exports.assertIsJsonRpcError = exports.isJsonRpcError = exports.assertIsJsonRpcFailure = exports.isJsonRpcFailure = exports.assertIsJsonRpcSuccess = exports.isJsonRpcSuccess = exports.assertIsJsonRpcResponse = exports.isJsonRpcResponse = exports.assertIsPendingJsonRpcResponse = exports.isPendingJsonRpcResponse = exports.JsonRpcResponseStruct = exports.JsonRpcFailureStruct = exports.JsonRpcSuccessStruct = exports.PendingJsonRpcResponseStruct = exports.assertIsJsonRpcRequest = exports.isJsonRpcRequest = exports.assertIsJsonRpcNotification = exports.isJsonRpcNotification = exports.JsonRpcNotificationStruct = exports.JsonRpcRequestStruct = exports.JsonRpcParamsStruct = exports.JsonRpcErrorStruct = exports.JsonRpcIdStruct = exports.JsonRpcVersionStruct = exports.jsonrpc2 = exports.getJsonSize = exports.isValidJson = exports.JsonStruct = exports.UnsafeJsonStruct = void 0; | ||
| const superstruct_1 = require("superstruct"); | ||
| const assert_1 = require("./assert"); | ||
| const misc_1 = require("./misc"); | ||
| exports.JsonStruct = (0, superstruct_1.define)('Json', (value) => { | ||
| const [isValid] = validateJsonAndGetSize(value, true); | ||
| if (!isValid) { | ||
| return 'Expected a valid JSON-serializable value'; | ||
| /** | ||
| * A struct to check if the given value is finite number. Superstruct's | ||
| * `number()` struct does not check if the value is finite. | ||
| * | ||
| * @returns A struct to check if the given value is finite number. | ||
| */ | ||
| const finiteNumber = () => (0, superstruct_1.define)('finite number', (value) => { | ||
| return (0, superstruct_1.is)(value, (0, superstruct_1.number)()) && Number.isFinite(value); | ||
| }); | ||
| /** | ||
| * A struct to check if the given value is a valid JSON-serializable value. | ||
| * | ||
| * Note that this struct is unsafe. For safe validation, use {@link JsonStruct}. | ||
| */ | ||
| // We cannot infer the type of the struct, because it is recursive. | ||
| exports.UnsafeJsonStruct = (0, superstruct_1.union)([ | ||
| (0, superstruct_1.literal)(null), | ||
| (0, superstruct_1.boolean)(), | ||
| finiteNumber(), | ||
| (0, superstruct_1.string)(), | ||
| (0, superstruct_1.array)((0, superstruct_1.lazy)(() => exports.UnsafeJsonStruct)), | ||
| (0, superstruct_1.record)((0, superstruct_1.string)(), (0, superstruct_1.lazy)(() => exports.UnsafeJsonStruct)), | ||
| ]); | ||
| /** | ||
| * A struct to check if the given value is a valid JSON-serializable value. | ||
| * | ||
| * This struct sanitizes the value before validating it, so that it is safe to | ||
| * use with untrusted input. | ||
| */ | ||
| exports.JsonStruct = (0, superstruct_1.define)('Json', (value, context) => { | ||
| /** | ||
| * Helper function that runs the given struct validator and returns the | ||
| * validation errors, if any. If the value is valid, it returns `true`. | ||
| * | ||
| * @param innerValue - The value to validate. | ||
| * @param struct - The struct to use for validation. | ||
| * @returns The validation errors, or `true` if the value is valid. | ||
| */ | ||
| function checkStruct(innerValue, struct) { | ||
| const iterator = struct.validator(innerValue, context); | ||
| const errors = [...iterator]; | ||
| if (errors.length > 0) { | ||
| return errors; | ||
| } | ||
| return true; | ||
| } | ||
| return true; | ||
| try { | ||
| // The plain value must be a valid JSON value, but it may be altered in the | ||
| // process of JSON serialization, so we need to validate it again after | ||
| // serialization. This has the added benefit that the returned error messages | ||
| // will be more helpful, as they will point to the exact location of the | ||
| // invalid value. | ||
| // | ||
| // This seems overcomplicated, but without checking the plain value first, | ||
| // there are some cases where the validation passes, even though the value is | ||
| // not valid JSON. For example, `undefined` is not valid JSON, but serializing | ||
| // it will remove it from the object, so the validation will pass. | ||
| const unsafeResult = checkStruct(value, exports.UnsafeJsonStruct); | ||
| if (unsafeResult !== true) { | ||
| return unsafeResult; | ||
| } | ||
| // JavaScript engines are highly optimized for this specific use case of | ||
| // JSON parsing and stringifying, so there should be no performance impact. | ||
| return checkStruct(JSON.parse(JSON.stringify(value)), exports.UnsafeJsonStruct); | ||
| } | ||
| catch (error) { | ||
| if (error instanceof RangeError) { | ||
| return 'Circular reference detected'; | ||
| } | ||
| return false; | ||
| } | ||
| }); | ||
@@ -26,2 +90,14 @@ /** | ||
| /** | ||
| * Get the size of a JSON value in bytes. This also validates the value. | ||
| * | ||
| * @param value - The JSON value to get the size of. | ||
| * @returns The size of the JSON value in bytes. | ||
| */ | ||
| function getJsonSize(value) { | ||
| (0, assert_1.assertStruct)(value, exports.JsonStruct, 'Invalid JSON value'); | ||
| const json = JSON.stringify(value); | ||
| return new TextEncoder().encode(json).byteLength; | ||
| } | ||
| exports.getJsonSize = getJsonSize; | ||
| /** | ||
| * The string '2.0'. | ||
@@ -277,126 +353,2 @@ */ | ||
| exports.getJsonRpcIdValidator = getJsonRpcIdValidator; | ||
| /** | ||
| * Checks whether a value is JSON serializable and counts the total number | ||
| * of bytes needed to store the serialized version of the value. | ||
| * | ||
| * @param jsObject - Potential JSON serializable object. | ||
| * @param skipSizingProcess - Skip JSON size calculation (default: false). | ||
| * @returns Tuple [isValid, plainTextSizeInBytes] containing a boolean that signals whether | ||
| * the value was serializable and a number of bytes that it will use when serialized to JSON. | ||
| */ | ||
| function validateJsonAndGetSize(jsObject, skipSizingProcess = false) { | ||
| const seenObjects = new Set(); | ||
| /** | ||
| * Checks whether a value is JSON serializable and counts the total number | ||
| * of bytes needed to store the serialized version of the value. | ||
| * | ||
| * This function assumes the encoding of the JSON is done in UTF-8. | ||
| * | ||
| * @param value - Potential JSON serializable value. | ||
| * @param skipSizing - Skip JSON size calculation (default: false). | ||
| * @returns Tuple [isValid, plainTextSizeInBytes] containing a boolean that signals whether | ||
| * the value was serializable and a number of bytes that it will use when serialized to JSON. | ||
| */ | ||
| function getJsonSerializableInfo(value, skipSizing) { | ||
| if (value === undefined) { | ||
| return [false, 0]; | ||
| } | ||
| else if (value === null) { | ||
| // Return already specified constant size for null (special object) | ||
| return [true, skipSizing ? 0 : misc_1.JsonSize.Null]; | ||
| } | ||
| // Check and calculate sizes for basic (and some special) types | ||
| const typeOfValue = typeof value; | ||
| try { | ||
| if (typeOfValue === 'function') { | ||
| return [false, 0]; | ||
| } | ||
| else if (typeOfValue === 'string' || value instanceof String) { | ||
| return [ | ||
| true, | ||
| skipSizing | ||
| ? 0 | ||
| : (0, misc_1.calculateStringSize)(value) + misc_1.JsonSize.Quote * 2, | ||
| ]; | ||
| } | ||
| else if (typeOfValue === 'boolean' || value instanceof Boolean) { | ||
| if (skipSizing) { | ||
| return [true, 0]; | ||
| } | ||
| // eslint-disable-next-line eqeqeq | ||
| return [true, value == true ? misc_1.JsonSize.True : misc_1.JsonSize.False]; | ||
| } | ||
| else if (typeOfValue === 'number' || value instanceof Number) { | ||
| if (skipSizing) { | ||
| return [true, 0]; | ||
| } | ||
| return [true, (0, misc_1.calculateNumberSize)(value)]; | ||
| } | ||
| else if (value instanceof Date) { | ||
| if (skipSizing) { | ||
| return [true, 0]; | ||
| } | ||
| return [ | ||
| true, | ||
| // Note: Invalid dates will serialize to null | ||
| isNaN(value.getDate()) | ||
| ? misc_1.JsonSize.Null | ||
| : misc_1.JsonSize.Date + misc_1.JsonSize.Quote * 2, | ||
| ]; | ||
| } | ||
| } | ||
| catch (_) { | ||
| return [false, 0]; | ||
| } | ||
| // If object is not plain and cannot be serialized properly, | ||
| // stop here and return false for serialization | ||
| if (!(0, misc_1.isPlainObject)(value) && !Array.isArray(value)) { | ||
| return [false, 0]; | ||
| } | ||
| // Circular object detection (handling) | ||
| // Check if the same object already exists | ||
| if (seenObjects.has(value)) { | ||
| return [false, 0]; | ||
| } | ||
| // Add new object to the seen objects set | ||
| // Only the plain objects should be added (Primitive types are skipped) | ||
| seenObjects.add(value); | ||
| // Continue object decomposition | ||
| try { | ||
| return [ | ||
| true, | ||
| Object.entries(value).reduce((sum, [key, nestedValue], idx, arr) => { | ||
| // Recursively process next nested object or primitive type | ||
| // eslint-disable-next-line prefer-const | ||
| let [valid, size] = getJsonSerializableInfo(nestedValue, skipSizing); | ||
| if (!valid) { | ||
| throw new Error('JSON validation did not pass. Validation process stopped.'); | ||
| } | ||
| // Circular object detection | ||
| // Once a child node is visited and processed remove it from the set. | ||
| // This will prevent false positives with the same adjacent objects. | ||
| seenObjects.delete(value); | ||
| if (skipSizing) { | ||
| return 0; | ||
| } | ||
| // Objects will have be serialized with "key": value, | ||
| // therefore we include the key in the calculation here | ||
| const keySize = Array.isArray(value) | ||
| ? 0 | ||
| : key.length + misc_1.JsonSize.Comma + misc_1.JsonSize.Colon * 2; | ||
| const separator = idx < arr.length - 1 ? misc_1.JsonSize.Comma : 0; | ||
| return sum + keySize + size + separator; | ||
| }, | ||
| // Starts at 2 because the serialized JSON string data (plain text) | ||
| // will minimally contain {}/[] | ||
| skipSizing ? 0 : misc_1.JsonSize.Wrapper * 2), | ||
| ]; | ||
| } | ||
| catch (_) { | ||
| return [false, 0]; | ||
| } | ||
| } | ||
| return getJsonSerializableInfo(jsObject, skipSizingProcess); | ||
| } | ||
| exports.validateJsonAndGetSize = validateJsonAndGetSize; | ||
| //# sourceMappingURL=json.js.map |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n array,\n define,\n Infer,\n integer,\n is,\n literal,\n nullable,\n number,\n object,\n omit,\n optional,\n record,\n string,\n Struct,\n union,\n unknown,\n} from 'superstruct';\n\nimport { AssertionErrorConstructor, assertStruct } from './assert';\nimport {\n calculateNumberSize,\n calculateStringSize,\n isPlainObject,\n JsonSize,\n} from './misc';\n\nexport const JsonStruct = define<Json>('Json', (value) => {\n const [isValid] = validateJsonAndGetSize(value, true);\n if (!isValid) {\n return 'Expected a valid JSON-serializable value';\n }\n return true;\n});\n\n/**\n * Any JSON-compatible value.\n */\nexport type Json =\n | null\n | boolean\n | number\n | string\n | Json[]\n | { [prop: string]: Json };\n\n/**\n * Check if the given value is a valid {@link Json} value, i.e., a value that is\n * serializable to JSON.\n *\n * @param value - The value to check.\n * @returns Whether the value is a valid {@link Json} value.\n */\nexport function isValidJson(value: unknown): value is Json {\n return is(value, JsonStruct);\n}\n\n/**\n * The string '2.0'.\n */\nexport const jsonrpc2 = '2.0' as const;\nexport const JsonRpcVersionStruct = literal(jsonrpc2);\n\n/**\n * A String specifying the version of the JSON-RPC protocol.\n * MUST be exactly \"2.0\".\n */\nexport type JsonRpcVersion2 = typeof jsonrpc2;\n\nexport const JsonRpcIdStruct = nullable(union([number(), string()]));\n\n/**\n * An identifier established by the Client that MUST contain a String, Number,\n * or NULL value if included. If it is not included it is assumed to be a\n * notification. The value SHOULD normally not be Null and Numbers SHOULD\n * NOT contain fractional parts.\n */\nexport type JsonRpcId = Infer<typeof JsonRpcIdStruct>;\n\nexport const JsonRpcErrorStruct = object({\n code: integer(),\n message: string(),\n data: optional(JsonStruct),\n stack: optional(string()),\n});\n\n/**\n * Mark a certain key of a type as optional.\n */\nexport type OptionalField<\n Type extends Record<string, unknown>,\n Key extends keyof Type,\n> = Omit<Type, Key> & Partial<Pick<Type, Key>>;\n\n/**\n * A JSON-RPC error object.\n *\n * Note that TypeScript infers `unknown | undefined` as `unknown`, meaning that\n * the `data` field is not optional. To make it optional, we use the\n * `OptionalField` helper, to explicitly make it optional.\n */\nexport type JsonRpcError = OptionalField<\n Infer<typeof JsonRpcErrorStruct>,\n 'data'\n>;\n\nexport const JsonRpcParamsStruct = optional(\n union([record(string(), JsonStruct), array(JsonStruct)]),\n);\nexport type JsonRpcParams = Infer<typeof JsonRpcParamsStruct>;\n\nexport const JsonRpcRequestStruct = object({\n id: JsonRpcIdStruct,\n jsonrpc: JsonRpcVersionStruct,\n method: string(),\n params: JsonRpcParamsStruct,\n});\n\nexport type InferWithParams<\n Type extends Struct<any>,\n Params extends JsonRpcParams,\n> = Omit<Infer<Type>, 'params'> &\n (keyof Params extends undefined\n ? {\n params?: Params;\n }\n : {\n params: Params;\n });\n\n/**\n * A JSON-RPC request object.\n */\nexport type JsonRpcRequest<Params extends JsonRpcParams = JsonRpcParams> =\n InferWithParams<typeof JsonRpcRequestStruct, Params>;\n\nexport const JsonRpcNotificationStruct = omit(JsonRpcRequestStruct, ['id']);\n\n/**\n * A JSON-RPC notification object.\n */\nexport type JsonRpcNotification<Params extends JsonRpcParams = JsonRpcParams> =\n InferWithParams<typeof JsonRpcNotificationStruct, Params>;\n\n/**\n * Check if the given value is a valid {@link JsonRpcNotification} object.\n *\n * @param value - The value to check.\n * @returns Whether the given value is a valid {@link JsonRpcNotification}\n * object.\n */\nexport function isJsonRpcNotification(\n value: unknown,\n): value is JsonRpcNotification {\n return is(value, JsonRpcNotificationStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link JsonRpcNotification} object.\n *\n * @param value - The value to check.\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}.\n * @throws If the given value is not a valid {@link JsonRpcNotification} object.\n */\nexport function assertIsJsonRpcNotification(\n value: unknown,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ErrorWrapper?: AssertionErrorConstructor,\n): asserts value is JsonRpcNotification {\n assertStruct(\n value,\n JsonRpcNotificationStruct,\n 'Invalid JSON-RPC notification',\n ErrorWrapper,\n );\n}\n\n/**\n * Check if the given value is a valid {@link JsonRpcRequest} object.\n *\n * @param value - The value to check.\n * @returns Whether the given value is a valid {@link JsonRpcRequest} object.\n */\nexport function isJsonRpcRequest(value: unknown): value is JsonRpcRequest {\n return is(value, JsonRpcRequestStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link JsonRpcRequest} object.\n *\n * @param value - The JSON-RPC request or notification to check.\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}.\n * @throws If the given value is not a valid {@link JsonRpcRequest} object.\n */\nexport function assertIsJsonRpcRequest(\n value: unknown,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ErrorWrapper?: AssertionErrorConstructor,\n): asserts value is JsonRpcRequest {\n assertStruct(\n value,\n JsonRpcRequestStruct,\n 'Invalid JSON-RPC request',\n ErrorWrapper,\n );\n}\n\nexport const PendingJsonRpcResponseStruct = object({\n id: JsonRpcIdStruct,\n jsonrpc: JsonRpcVersionStruct,\n result: optional(unknown()),\n error: optional(JsonRpcErrorStruct),\n});\n\n/**\n * A JSON-RPC response object that has not yet been resolved.\n */\nexport type PendingJsonRpcResponse<Result extends Json> = Omit<\n Infer<typeof PendingJsonRpcResponseStruct>,\n 'result'\n> & {\n result?: Result;\n};\n\nexport const JsonRpcSuccessStruct = object({\n id: JsonRpcIdStruct,\n jsonrpc: JsonRpcVersionStruct,\n result: JsonStruct,\n});\n\n/**\n * A successful JSON-RPC response object.\n */\nexport type JsonRpcSuccess<Result extends Json> = Omit<\n Infer<typeof JsonRpcSuccessStruct>,\n 'result'\n> & {\n result: Result;\n};\n\nexport const JsonRpcFailureStruct = object({\n id: JsonRpcIdStruct,\n jsonrpc: JsonRpcVersionStruct,\n error: JsonRpcErrorStruct as Struct<JsonRpcError>,\n});\n\n/**\n * A failed JSON-RPC response object.\n */\nexport type JsonRpcFailure = Infer<typeof JsonRpcFailureStruct>;\n\nexport const JsonRpcResponseStruct = union([\n JsonRpcSuccessStruct,\n JsonRpcFailureStruct,\n]);\n\n/**\n * A JSON-RPC response object. Must be checked to determine whether it's a\n * success or failure.\n *\n * @template Result - The type of the result.\n */\nexport type JsonRpcResponse<Result extends Json> =\n | JsonRpcSuccess<Result>\n | JsonRpcFailure;\n\n/**\n * Type guard to check whether specified JSON-RPC response is a\n * {@link PendingJsonRpcResponse}.\n *\n * @param response - The JSON-RPC response to check.\n * @returns Whether the specified JSON-RPC response is pending.\n */\nexport function isPendingJsonRpcResponse(\n response: unknown,\n): response is PendingJsonRpcResponse<Json> {\n return is(response, PendingJsonRpcResponseStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link PendingJsonRpcResponse} object.\n *\n * @param response - The JSON-RPC response to check.\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}.\n * @throws If the given value is not a valid {@link PendingJsonRpcResponse}\n * object.\n */\nexport function assertIsPendingJsonRpcResponse(\n response: unknown,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ErrorWrapper?: AssertionErrorConstructor,\n): asserts response is PendingJsonRpcResponse<Json> {\n assertStruct(\n response,\n PendingJsonRpcResponseStruct,\n 'Invalid pending JSON-RPC response',\n ErrorWrapper,\n );\n}\n\n/**\n * Type guard to check if a value is a {@link JsonRpcResponse}.\n *\n * @param response - The object to check.\n * @returns Whether the object is a JsonRpcResponse.\n */\nexport function isJsonRpcResponse(\n response: unknown,\n): response is JsonRpcResponse<Json> {\n return is(response, JsonRpcResponseStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link JsonRpcResponse} object.\n *\n * @param value - The value to check.\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}.\n * @throws If the given value is not a valid {@link JsonRpcResponse} object.\n */\nexport function assertIsJsonRpcResponse(\n value: unknown,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ErrorWrapper?: AssertionErrorConstructor,\n): asserts value is JsonRpcResponse<Json> {\n assertStruct(\n value,\n JsonRpcResponseStruct,\n 'Invalid JSON-RPC response',\n ErrorWrapper,\n );\n}\n\n/**\n * Check if the given value is a valid {@link JsonRpcSuccess} object.\n *\n * @param value - The value to check.\n * @returns Whether the given value is a valid {@link JsonRpcSuccess} object.\n */\nexport function isJsonRpcSuccess(\n value: unknown,\n): value is JsonRpcSuccess<Json> {\n return is(value, JsonRpcSuccessStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link JsonRpcSuccess} object.\n *\n * @param value - The value to check.\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}.\n * @throws If the given value is not a valid {@link JsonRpcSuccess} object.\n */\nexport function assertIsJsonRpcSuccess(\n value: unknown,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ErrorWrapper?: AssertionErrorConstructor,\n): asserts value is JsonRpcSuccess<Json> {\n assertStruct(\n value,\n JsonRpcSuccessStruct,\n 'Invalid JSON-RPC success response',\n ErrorWrapper,\n );\n}\n\n/**\n * Check if the given value is a valid {@link JsonRpcFailure} object.\n *\n * @param value - The value to check.\n * @returns Whether the given value is a valid {@link JsonRpcFailure} object.\n */\nexport function isJsonRpcFailure(value: unknown): value is JsonRpcFailure {\n return is(value, JsonRpcFailureStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link JsonRpcFailure} object.\n *\n * @param value - The value to check.\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}.\n * @throws If the given value is not a valid {@link JsonRpcFailure} object.\n */\nexport function assertIsJsonRpcFailure(\n value: unknown,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ErrorWrapper?: AssertionErrorConstructor,\n): asserts value is JsonRpcFailure {\n assertStruct(\n value,\n JsonRpcFailureStruct,\n 'Invalid JSON-RPC failure response',\n ErrorWrapper,\n );\n}\n\n/**\n * Check if the given value is a valid {@link JsonRpcError} object.\n *\n * @param value - The value to check.\n * @returns Whether the given value is a valid {@link JsonRpcError} object.\n */\nexport function isJsonRpcError(value: unknown): value is JsonRpcError {\n return is(value, JsonRpcErrorStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link JsonRpcError} object.\n *\n * @param value - The value to check.\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}.\n * @throws If the given value is not a valid {@link JsonRpcError} object.\n */\nexport function assertIsJsonRpcError(\n value: unknown,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ErrorWrapper?: AssertionErrorConstructor,\n): asserts value is JsonRpcError {\n assertStruct(\n value,\n JsonRpcErrorStruct,\n 'Invalid JSON-RPC error',\n ErrorWrapper,\n );\n}\n\ntype JsonRpcValidatorOptions = {\n permitEmptyString?: boolean;\n permitFractions?: boolean;\n permitNull?: boolean;\n};\n\n/**\n * Gets a function for validating JSON-RPC request / response `id` values.\n *\n * By manipulating the options of this factory, you can control the behavior\n * of the resulting validator for some edge cases. This is useful because e.g.\n * `null` should sometimes but not always be permitted.\n *\n * Note that the empty string (`''`) is always permitted by the JSON-RPC\n * specification, but that kind of sucks and you may want to forbid it in some\n * instances anyway.\n *\n * For more details, see the\n * [JSON-RPC Specification](https://www.jsonrpc.org/specification).\n *\n * @param options - An options object.\n * @param options.permitEmptyString - Whether the empty string (i.e. `''`)\n * should be treated as a valid ID. Default: `true`\n * @param options.permitFractions - Whether fractional numbers (e.g. `1.2`)\n * should be treated as valid IDs. Default: `false`\n * @param options.permitNull - Whether `null` should be treated as a valid ID.\n * Default: `true`\n * @returns The JSON-RPC ID validator function.\n */\nexport function getJsonRpcIdValidator(options?: JsonRpcValidatorOptions) {\n const { permitEmptyString, permitFractions, permitNull } = {\n permitEmptyString: true,\n permitFractions: false,\n permitNull: true,\n ...options,\n };\n\n /**\n * Type guard for {@link JsonRpcId}.\n *\n * @param id - The JSON-RPC ID value to check.\n * @returns Whether the given ID is valid per the options given to the\n * factory.\n */\n const isValidJsonRpcId = (id: unknown): id is JsonRpcId => {\n return Boolean(\n (typeof id === 'number' && (permitFractions || Number.isInteger(id))) ||\n (typeof id === 'string' && (permitEmptyString || id.length > 0)) ||\n (permitNull && id === null),\n );\n };\n\n return isValidJsonRpcId;\n}\n\n/**\n * Checks whether a value is JSON serializable and counts the total number\n * of bytes needed to store the serialized version of the value.\n *\n * @param jsObject - Potential JSON serializable object.\n * @param skipSizingProcess - Skip JSON size calculation (default: false).\n * @returns Tuple [isValid, plainTextSizeInBytes] containing a boolean that signals whether\n * the value was serializable and a number of bytes that it will use when serialized to JSON.\n */\nexport function validateJsonAndGetSize(\n jsObject: unknown,\n skipSizingProcess = false,\n): [isValid: boolean, plainTextSizeInBytes: number] {\n const seenObjects = new Set();\n /**\n * Checks whether a value is JSON serializable and counts the total number\n * of bytes needed to store the serialized version of the value.\n *\n * This function assumes the encoding of the JSON is done in UTF-8.\n *\n * @param value - Potential JSON serializable value.\n * @param skipSizing - Skip JSON size calculation (default: false).\n * @returns Tuple [isValid, plainTextSizeInBytes] containing a boolean that signals whether\n * the value was serializable and a number of bytes that it will use when serialized to JSON.\n */\n function getJsonSerializableInfo(\n value: unknown,\n skipSizing: boolean,\n ): [isValid: boolean, plainTextSizeInBytes: number] {\n if (value === undefined) {\n return [false, 0];\n } else if (value === null) {\n // Return already specified constant size for null (special object)\n return [true, skipSizing ? 0 : JsonSize.Null];\n }\n\n // Check and calculate sizes for basic (and some special) types\n const typeOfValue = typeof value;\n try {\n if (typeOfValue === 'function') {\n return [false, 0];\n } else if (typeOfValue === 'string' || value instanceof String) {\n return [\n true,\n skipSizing\n ? 0\n : calculateStringSize(value as string) + JsonSize.Quote * 2,\n ];\n } else if (typeOfValue === 'boolean' || value instanceof Boolean) {\n if (skipSizing) {\n return [true, 0];\n }\n // eslint-disable-next-line eqeqeq\n return [true, value == true ? JsonSize.True : JsonSize.False];\n } else if (typeOfValue === 'number' || value instanceof Number) {\n if (skipSizing) {\n return [true, 0];\n }\n return [true, calculateNumberSize(value as number)];\n } else if (value instanceof Date) {\n if (skipSizing) {\n return [true, 0];\n }\n return [\n true,\n // Note: Invalid dates will serialize to null\n isNaN(value.getDate())\n ? JsonSize.Null\n : JsonSize.Date + JsonSize.Quote * 2,\n ];\n }\n } catch (_) {\n return [false, 0];\n }\n\n // If object is not plain and cannot be serialized properly,\n // stop here and return false for serialization\n if (!isPlainObject(value) && !Array.isArray(value)) {\n return [false, 0];\n }\n\n // Circular object detection (handling)\n // Check if the same object already exists\n if (seenObjects.has(value)) {\n return [false, 0];\n }\n // Add new object to the seen objects set\n // Only the plain objects should be added (Primitive types are skipped)\n seenObjects.add(value);\n\n // Continue object decomposition\n try {\n return [\n true,\n Object.entries(value).reduce(\n (sum, [key, nestedValue], idx, arr) => {\n // Recursively process next nested object or primitive type\n // eslint-disable-next-line prefer-const\n let [valid, size] = getJsonSerializableInfo(\n nestedValue,\n skipSizing,\n );\n if (!valid) {\n throw new Error(\n 'JSON validation did not pass. Validation process stopped.',\n );\n }\n\n // Circular object detection\n // Once a child node is visited and processed remove it from the set.\n // This will prevent false positives with the same adjacent objects.\n seenObjects.delete(value);\n\n if (skipSizing) {\n return 0;\n }\n\n // Objects will have be serialized with \"key\": value,\n // therefore we include the key in the calculation here\n const keySize = Array.isArray(value)\n ? 0\n : key.length + JsonSize.Comma + JsonSize.Colon * 2;\n\n const separator = idx < arr.length - 1 ? JsonSize.Comma : 0;\n\n return sum + keySize + size + separator;\n },\n // Starts at 2 because the serialized JSON string data (plain text)\n // will minimally contain {}/[]\n skipSizing ? 0 : JsonSize.Wrapper * 2,\n ),\n ];\n } catch (_) {\n return [false, 0];\n }\n }\n\n return getJsonSerializableInfo(jsObject, skipSizingProcess);\n}\n"]} | ||
| {"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n array,\n boolean,\n define,\n Infer,\n integer,\n is,\n lazy,\n literal,\n nullable,\n number,\n object,\n omit,\n optional,\n record,\n string,\n Struct,\n union,\n unknown,\n} from 'superstruct';\n\nimport { AssertionErrorConstructor, assertStruct } from './assert';\n\n/**\n * Any JSON-compatible value.\n */\nexport type Json =\n | null\n | boolean\n | number\n | string\n | Json[]\n | { [prop: string]: Json };\n\n/**\n * A struct to check if the given value is finite number. Superstruct's\n * `number()` struct does not check if the value is finite.\n *\n * @returns A struct to check if the given value is finite number.\n */\nconst finiteNumber = () =>\n define<number>('finite number', (value) => {\n return is(value, number()) && Number.isFinite(value);\n });\n\n/**\n * A struct to check if the given value is a valid JSON-serializable value.\n *\n * Note that this struct is unsafe. For safe validation, use {@link JsonStruct}.\n */\n// We cannot infer the type of the struct, because it is recursive.\nexport const UnsafeJsonStruct: Struct<Json> = union([\n literal(null),\n boolean(),\n finiteNumber(),\n string(),\n array(lazy(() => UnsafeJsonStruct)),\n record(\n string(),\n lazy(() => UnsafeJsonStruct),\n ),\n]);\n\n/**\n * A struct to check if the given value is a valid JSON-serializable value.\n *\n * This struct sanitizes the value before validating it, so that it is safe to\n * use with untrusted input.\n */\nexport const JsonStruct = define<Json>('Json', (value, context) => {\n /**\n * Helper function that runs the given struct validator and returns the\n * validation errors, if any. If the value is valid, it returns `true`.\n *\n * @param innerValue - The value to validate.\n * @param struct - The struct to use for validation.\n * @returns The validation errors, or `true` if the value is valid.\n */\n function checkStruct<Type>(innerValue: unknown, struct: Struct<Type>) {\n const iterator = struct.validator(innerValue, context);\n const errors = [...iterator];\n\n if (errors.length > 0) {\n return errors;\n }\n\n return true;\n }\n\n try {\n // The plain value must be a valid JSON value, but it may be altered in the\n // process of JSON serialization, so we need to validate it again after\n // serialization. This has the added benefit that the returned error messages\n // will be more helpful, as they will point to the exact location of the\n // invalid value.\n //\n // This seems overcomplicated, but without checking the plain value first,\n // there are some cases where the validation passes, even though the value is\n // not valid JSON. For example, `undefined` is not valid JSON, but serializing\n // it will remove it from the object, so the validation will pass.\n const unsafeResult = checkStruct(value, UnsafeJsonStruct);\n if (unsafeResult !== true) {\n return unsafeResult;\n }\n\n // JavaScript engines are highly optimized for this specific use case of\n // JSON parsing and stringifying, so there should be no performance impact.\n return checkStruct(JSON.parse(JSON.stringify(value)), UnsafeJsonStruct);\n } catch (error) {\n if (error instanceof RangeError) {\n return 'Circular reference detected';\n }\n\n return false;\n }\n});\n\n/**\n * Check if the given value is a valid {@link Json} value, i.e., a value that is\n * serializable to JSON.\n *\n * @param value - The value to check.\n * @returns Whether the value is a valid {@link Json} value.\n */\nexport function isValidJson(value: unknown): value is Json {\n return is(value, JsonStruct);\n}\n\n/**\n * Get the size of a JSON value in bytes. This also validates the value.\n *\n * @param value - The JSON value to get the size of.\n * @returns The size of the JSON value in bytes.\n */\nexport function getJsonSize(value: unknown): number {\n assertStruct(value, JsonStruct, 'Invalid JSON value');\n\n const json = JSON.stringify(value);\n return new TextEncoder().encode(json).byteLength;\n}\n\n/**\n * The string '2.0'.\n */\nexport const jsonrpc2 = '2.0' as const;\nexport const JsonRpcVersionStruct = literal(jsonrpc2);\n\n/**\n * A String specifying the version of the JSON-RPC protocol.\n * MUST be exactly \"2.0\".\n */\nexport type JsonRpcVersion2 = typeof jsonrpc2;\n\nexport const JsonRpcIdStruct = nullable(union([number(), string()]));\n\n/**\n * An identifier established by the Client that MUST contain a String, Number,\n * or NULL value if included. If it is not included it is assumed to be a\n * notification. The value SHOULD normally not be Null and Numbers SHOULD\n * NOT contain fractional parts.\n */\nexport type JsonRpcId = Infer<typeof JsonRpcIdStruct>;\n\nexport const JsonRpcErrorStruct = object({\n code: integer(),\n message: string(),\n data: optional(JsonStruct),\n stack: optional(string()),\n});\n\n/**\n * Mark a certain key of a type as optional.\n */\nexport type OptionalField<\n Type extends Record<string, unknown>,\n Key extends keyof Type,\n> = Omit<Type, Key> & Partial<Pick<Type, Key>>;\n\n/**\n * A JSON-RPC error object.\n *\n * Note that TypeScript infers `unknown | undefined` as `unknown`, meaning that\n * the `data` field is not optional. To make it optional, we use the\n * `OptionalField` helper, to explicitly make it optional.\n */\nexport type JsonRpcError = OptionalField<\n Infer<typeof JsonRpcErrorStruct>,\n 'data'\n>;\n\nexport const JsonRpcParamsStruct = optional(\n union([record(string(), JsonStruct), array(JsonStruct)]),\n);\nexport type JsonRpcParams = Infer<typeof JsonRpcParamsStruct>;\n\nexport const JsonRpcRequestStruct = object({\n id: JsonRpcIdStruct,\n jsonrpc: JsonRpcVersionStruct,\n method: string(),\n params: JsonRpcParamsStruct,\n});\n\nexport type InferWithParams<\n Type extends Struct<any>,\n Params extends JsonRpcParams,\n> = Omit<Infer<Type>, 'params'> &\n (keyof Params extends undefined\n ? {\n params?: Params;\n }\n : {\n params: Params;\n });\n\n/**\n * A JSON-RPC request object.\n */\nexport type JsonRpcRequest<Params extends JsonRpcParams = JsonRpcParams> =\n InferWithParams<typeof JsonRpcRequestStruct, Params>;\n\nexport const JsonRpcNotificationStruct = omit(JsonRpcRequestStruct, ['id']);\n\n/**\n * A JSON-RPC notification object.\n */\nexport type JsonRpcNotification<Params extends JsonRpcParams = JsonRpcParams> =\n InferWithParams<typeof JsonRpcNotificationStruct, Params>;\n\n/**\n * Check if the given value is a valid {@link JsonRpcNotification} object.\n *\n * @param value - The value to check.\n * @returns Whether the given value is a valid {@link JsonRpcNotification}\n * object.\n */\nexport function isJsonRpcNotification(\n value: unknown,\n): value is JsonRpcNotification {\n return is(value, JsonRpcNotificationStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link JsonRpcNotification} object.\n *\n * @param value - The value to check.\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}.\n * @throws If the given value is not a valid {@link JsonRpcNotification} object.\n */\nexport function assertIsJsonRpcNotification(\n value: unknown,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ErrorWrapper?: AssertionErrorConstructor,\n): asserts value is JsonRpcNotification {\n assertStruct(\n value,\n JsonRpcNotificationStruct,\n 'Invalid JSON-RPC notification',\n ErrorWrapper,\n );\n}\n\n/**\n * Check if the given value is a valid {@link JsonRpcRequest} object.\n *\n * @param value - The value to check.\n * @returns Whether the given value is a valid {@link JsonRpcRequest} object.\n */\nexport function isJsonRpcRequest(value: unknown): value is JsonRpcRequest {\n return is(value, JsonRpcRequestStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link JsonRpcRequest} object.\n *\n * @param value - The JSON-RPC request or notification to check.\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}.\n * @throws If the given value is not a valid {@link JsonRpcRequest} object.\n */\nexport function assertIsJsonRpcRequest(\n value: unknown,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ErrorWrapper?: AssertionErrorConstructor,\n): asserts value is JsonRpcRequest {\n assertStruct(\n value,\n JsonRpcRequestStruct,\n 'Invalid JSON-RPC request',\n ErrorWrapper,\n );\n}\n\nexport const PendingJsonRpcResponseStruct = object({\n id: JsonRpcIdStruct,\n jsonrpc: JsonRpcVersionStruct,\n result: optional(unknown()),\n error: optional(JsonRpcErrorStruct),\n});\n\n/**\n * A JSON-RPC response object that has not yet been resolved.\n */\nexport type PendingJsonRpcResponse<Result extends Json> = Omit<\n Infer<typeof PendingJsonRpcResponseStruct>,\n 'result'\n> & {\n result?: Result;\n};\n\nexport const JsonRpcSuccessStruct = object({\n id: JsonRpcIdStruct,\n jsonrpc: JsonRpcVersionStruct,\n result: JsonStruct,\n});\n\n/**\n * A successful JSON-RPC response object.\n */\nexport type JsonRpcSuccess<Result extends Json> = Omit<\n Infer<typeof JsonRpcSuccessStruct>,\n 'result'\n> & {\n result: Result;\n};\n\nexport const JsonRpcFailureStruct = object({\n id: JsonRpcIdStruct,\n jsonrpc: JsonRpcVersionStruct,\n error: JsonRpcErrorStruct as Struct<JsonRpcError>,\n});\n\n/**\n * A failed JSON-RPC response object.\n */\nexport type JsonRpcFailure = Infer<typeof JsonRpcFailureStruct>;\n\nexport const JsonRpcResponseStruct = union([\n JsonRpcSuccessStruct,\n JsonRpcFailureStruct,\n]);\n\n/**\n * A JSON-RPC response object. Must be checked to determine whether it's a\n * success or failure.\n *\n * @template Result - The type of the result.\n */\nexport type JsonRpcResponse<Result extends Json> =\n | JsonRpcSuccess<Result>\n | JsonRpcFailure;\n\n/**\n * Type guard to check whether specified JSON-RPC response is a\n * {@link PendingJsonRpcResponse}.\n *\n * @param response - The JSON-RPC response to check.\n * @returns Whether the specified JSON-RPC response is pending.\n */\nexport function isPendingJsonRpcResponse(\n response: unknown,\n): response is PendingJsonRpcResponse<Json> {\n return is(response, PendingJsonRpcResponseStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link PendingJsonRpcResponse} object.\n *\n * @param response - The JSON-RPC response to check.\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}.\n * @throws If the given value is not a valid {@link PendingJsonRpcResponse}\n * object.\n */\nexport function assertIsPendingJsonRpcResponse(\n response: unknown,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ErrorWrapper?: AssertionErrorConstructor,\n): asserts response is PendingJsonRpcResponse<Json> {\n assertStruct(\n response,\n PendingJsonRpcResponseStruct,\n 'Invalid pending JSON-RPC response',\n ErrorWrapper,\n );\n}\n\n/**\n * Type guard to check if a value is a {@link JsonRpcResponse}.\n *\n * @param response - The object to check.\n * @returns Whether the object is a JsonRpcResponse.\n */\nexport function isJsonRpcResponse(\n response: unknown,\n): response is JsonRpcResponse<Json> {\n return is(response, JsonRpcResponseStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link JsonRpcResponse} object.\n *\n * @param value - The value to check.\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}.\n * @throws If the given value is not a valid {@link JsonRpcResponse} object.\n */\nexport function assertIsJsonRpcResponse(\n value: unknown,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ErrorWrapper?: AssertionErrorConstructor,\n): asserts value is JsonRpcResponse<Json> {\n assertStruct(\n value,\n JsonRpcResponseStruct,\n 'Invalid JSON-RPC response',\n ErrorWrapper,\n );\n}\n\n/**\n * Check if the given value is a valid {@link JsonRpcSuccess} object.\n *\n * @param value - The value to check.\n * @returns Whether the given value is a valid {@link JsonRpcSuccess} object.\n */\nexport function isJsonRpcSuccess(\n value: unknown,\n): value is JsonRpcSuccess<Json> {\n return is(value, JsonRpcSuccessStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link JsonRpcSuccess} object.\n *\n * @param value - The value to check.\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}.\n * @throws If the given value is not a valid {@link JsonRpcSuccess} object.\n */\nexport function assertIsJsonRpcSuccess(\n value: unknown,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ErrorWrapper?: AssertionErrorConstructor,\n): asserts value is JsonRpcSuccess<Json> {\n assertStruct(\n value,\n JsonRpcSuccessStruct,\n 'Invalid JSON-RPC success response',\n ErrorWrapper,\n );\n}\n\n/**\n * Check if the given value is a valid {@link JsonRpcFailure} object.\n *\n * @param value - The value to check.\n * @returns Whether the given value is a valid {@link JsonRpcFailure} object.\n */\nexport function isJsonRpcFailure(value: unknown): value is JsonRpcFailure {\n return is(value, JsonRpcFailureStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link JsonRpcFailure} object.\n *\n * @param value - The value to check.\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}.\n * @throws If the given value is not a valid {@link JsonRpcFailure} object.\n */\nexport function assertIsJsonRpcFailure(\n value: unknown,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ErrorWrapper?: AssertionErrorConstructor,\n): asserts value is JsonRpcFailure {\n assertStruct(\n value,\n JsonRpcFailureStruct,\n 'Invalid JSON-RPC failure response',\n ErrorWrapper,\n );\n}\n\n/**\n * Check if the given value is a valid {@link JsonRpcError} object.\n *\n * @param value - The value to check.\n * @returns Whether the given value is a valid {@link JsonRpcError} object.\n */\nexport function isJsonRpcError(value: unknown): value is JsonRpcError {\n return is(value, JsonRpcErrorStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link JsonRpcError} object.\n *\n * @param value - The value to check.\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}.\n * @throws If the given value is not a valid {@link JsonRpcError} object.\n */\nexport function assertIsJsonRpcError(\n value: unknown,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ErrorWrapper?: AssertionErrorConstructor,\n): asserts value is JsonRpcError {\n assertStruct(\n value,\n JsonRpcErrorStruct,\n 'Invalid JSON-RPC error',\n ErrorWrapper,\n );\n}\n\ntype JsonRpcValidatorOptions = {\n permitEmptyString?: boolean;\n permitFractions?: boolean;\n permitNull?: boolean;\n};\n\n/**\n * Gets a function for validating JSON-RPC request / response `id` values.\n *\n * By manipulating the options of this factory, you can control the behavior\n * of the resulting validator for some edge cases. This is useful because e.g.\n * `null` should sometimes but not always be permitted.\n *\n * Note that the empty string (`''`) is always permitted by the JSON-RPC\n * specification, but that kind of sucks and you may want to forbid it in some\n * instances anyway.\n *\n * For more details, see the\n * [JSON-RPC Specification](https://www.jsonrpc.org/specification).\n *\n * @param options - An options object.\n * @param options.permitEmptyString - Whether the empty string (i.e. `''`)\n * should be treated as a valid ID. Default: `true`\n * @param options.permitFractions - Whether fractional numbers (e.g. `1.2`)\n * should be treated as valid IDs. Default: `false`\n * @param options.permitNull - Whether `null` should be treated as a valid ID.\n * Default: `true`\n * @returns The JSON-RPC ID validator function.\n */\nexport function getJsonRpcIdValidator(options?: JsonRpcValidatorOptions) {\n const { permitEmptyString, permitFractions, permitNull } = {\n permitEmptyString: true,\n permitFractions: false,\n permitNull: true,\n ...options,\n };\n\n /**\n * Type guard for {@link JsonRpcId}.\n *\n * @param id - The JSON-RPC ID value to check.\n * @returns Whether the given ID is valid per the options given to the\n * factory.\n */\n const isValidJsonRpcId = (id: unknown): id is JsonRpcId => {\n return Boolean(\n (typeof id === 'number' && (permitFractions || Number.isInteger(id))) ||\n (typeof id === 'string' && (permitEmptyString || id.length > 0)) ||\n (permitNull && id === null),\n );\n };\n\n return isValidJsonRpcId;\n}\n"]} |
+1
-1
| { | ||
| "name": "@metamask/utils", | ||
| "version": "3.6.0", | ||
| "version": "4.0.0", | ||
| "description": "Various JavaScript/TypeScript utilities of wide relevance to the MetaMask codebase.", | ||
@@ -5,0 +5,0 @@ "repository": { |
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
240827
-2.18%3217
-1.02%4
100%