{"version":3,"sources":["../src/parse-json-with-bigints.ts","../src/rpc-message.ts","../src/stringify-json-with-bigints.ts"],"names":["unwrapBigIntValueObject","wrapBigIntValueObject"],"mappings":"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","file":"index.node.cjs","sourcesContent":["/**\n * This function is a replacement for `JSON.parse` that can handle large\n * unsafe integers by parsing them as BigInts. It transforms every\n * numerical value into a BigInt without loss of precision.\n */\nexport function parseJsonWithBigInts(json: string): unknown {\n    return JSON.parse(wrapIntegersInBigIntValueObject(json), (_, value) => {\n        return isBigIntValueObject(value) ? unwrapBigIntValueObject(value) : value;\n    });\n}\n\nfunction wrapIntegersInBigIntValueObject(json: string): string {\n    const out = [];\n    let inQuote = false;\n    for (let ii = 0; ii < json.length; ii++) {\n        let isEscaped = false;\n        if (json[ii] === '\\\\') {\n            out.push(json[ii++]);\n            isEscaped = !isEscaped;\n        }\n        if (json[ii] === '\"') {\n            out.push(json[ii]);\n            if (!isEscaped) {\n                inQuote = !inQuote;\n            }\n            continue;\n        }\n        if (!inQuote) {\n            const consumedNumber = consumeNumber(json, ii);\n            if (consumedNumber?.length) {\n                ii += consumedNumber.length - 1;\n                // Don't wrap numbers that contain a decimal point or a negative exponent.\n                if (consumedNumber.match(/\\.|[eE]-/)) {\n                    out.push(consumedNumber);\n                } else {\n                    out.push(wrapBigIntValueObject(consumedNumber));\n                }\n                continue;\n            }\n        }\n        out.push(json[ii]);\n    }\n\n    return out.join('');\n}\n\nfunction consumeNumber(json: string, ii: number): string | null {\n    /** @see https://stackoverflow.com/a/13340826/11440277 */\n    const JSON_NUMBER_REGEX = /^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/;\n\n    // Stop early if the first character isn't a digit or a minus sign.\n    if (!json[ii]?.match(/[-\\d]/)) {\n        return null;\n    }\n\n    // Otherwise, check if the next characters form a valid JSON number.\n    const numberMatch = json.slice(ii).match(JSON_NUMBER_REGEX);\n    return numberMatch ? numberMatch[0] : null;\n}\n\ntype BigIntValueObject = {\n    // `$` implies 'this is a value object'.\n    // `n` implies 'interpret the value as a bigint'.\n    $n: string;\n};\n\nfunction wrapBigIntValueObject(value: string): string {\n    return `{\"$n\":\"${value}\"}`;\n}\n\nfunction unwrapBigIntValueObject({ $n }: BigIntValueObject): bigint {\n    if ($n.match(/[eE]/)) {\n        const [units, exponent] = $n.split(/[eE]/);\n        return BigInt(units) * BigInt(10) ** BigInt(exponent);\n    }\n    return BigInt($n);\n}\n\nfunction isBigIntValueObject(value: unknown): value is BigIntValueObject {\n    return !!value && typeof value === 'object' && '$n' in value && typeof value.$n === 'string';\n}\n","import { RpcRequest } from './rpc-request';\n\nlet _nextMessageId = 0n;\nfunction getNextMessageId(): string {\n    const id = _nextMessageId;\n    _nextMessageId++;\n    return id.toString();\n}\n\n/**\n * Returns a spec-compliant JSON RPC 2.0 message, given a method name and some params.\n *\n * Generates a new `id` on each call by incrementing a `bigint` and casting it to a string.\n */\nexport function createRpcMessage<TParams>(request: RpcRequest<TParams>) {\n    return {\n        id: getNextMessageId(),\n        jsonrpc: '2.0',\n        method: request.methodName,\n        params: request.params,\n    };\n}\n","/**\n * Transforms a value into a JSON string, whilst rendering bigints as large unsafe integers.\n */\nexport function stringifyJsonWithBigInts(value: unknown, space?: number | string): string {\n    return unwrapBigIntValueObject(\n        JSON.stringify(value, (_, v) => (typeof v === 'bigint' ? wrapBigIntValueObject(v) : v), space),\n    );\n}\n\ntype BigIntValueObject = {\n    // `$` implies 'this is a value object'.\n    // `n` implies 'interpret the value as a bigint'.\n    $n: string;\n};\n\nfunction wrapBigIntValueObject(value: bigint): BigIntValueObject {\n    return { $n: `${value}` };\n}\n\nfunction unwrapBigIntValueObject(value: string): string {\n    return value.replace(/\\{\\s*\"\\$n\"\\s*:\\s*\"(-?\\d+)\"\\s*\\}/g, '$1');\n}\n"]}