@solana/fast-stable-stringify
Version:
Deterministic stringification for when performance and bundle size matters
1 lines • 6.72 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.native.mjs","sourcesContent":["/**\n * This project is a fork of [nickyout/fast-stable-stringify](https://github.com/nickyout/fast-stable-stringify)\n *\n * The most popular repository providing this feature is [substack's json-stable-stringify](https://www.npmjs.com/package/json-stable-stringify). The intent of this library is to provide a faster alternative for when performance is more important than features. It assumes you provide basic javascript values without circular references, and returns a non-indented string.\n *\n * Just like substack's, it:\n *\n * - handles all variations of all basic javascript values (number, string, boolean, array, object, null, Date, BigInt)\n * - handles undefined _and_ function in the same way as `JSON.stringify`\n * - **does not support ie8 (and below) with complete certainty**.\n *\n * Unlike substack's, it:\n *\n * - does not implement the 'replacer' or 'space' arguments of the JSON.stringify method\n * - does not check for circular references\n *\n * @example\n * ```js\n * import stringify from '@solana/fast-stable-stringify';\n * stringify({ d: 0, c: 1, a: 2, b: 3, e: 4 }); // '{\"a\":2,\"b\":3,\"c\":1,\"d\":0,\"e\":4}'\n * ```\n *\n * @packageDocumentation\n */\nconst objToString = Object.prototype.toString;\nconst objKeys =\n Object.keys ||\n function (obj) {\n const keys = [];\n for (const name in obj) {\n keys.push(name);\n }\n return keys;\n };\n\nfunction stringify(val: unknown, isArrayProp: boolean) {\n let i, max, str, keys, key, propVal, toStr;\n if (val === true) {\n return 'true';\n }\n if (val === false) {\n return 'false';\n }\n switch (typeof val) {\n case 'object':\n if (val === null) {\n return null;\n } else if ('toJSON' in val && typeof val.toJSON === 'function') {\n return stringify(val.toJSON(), isArrayProp);\n } else {\n toStr = objToString.call(val);\n if (toStr === '[object Array]') {\n str = '[';\n max = (val as unknown[]).length - 1;\n for (i = 0; i < max; i++) {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n str += stringify((val as unknown[])[i], true) + ',';\n }\n if (max > -1) {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n str += stringify((val as unknown[])[i], true);\n }\n return str + ']';\n } else if (toStr === '[object Object]') {\n // only object is left\n keys = objKeys(val).sort();\n max = keys.length;\n str = '';\n i = 0;\n while (i < max) {\n key = keys[i];\n propVal = stringify((val as Record<typeof key, unknown>)[key], false);\n if (propVal !== undefined) {\n if (str) {\n str += ',';\n }\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n str += JSON.stringify(key) + ':' + propVal;\n }\n i++;\n }\n return '{' + str + '}';\n } else {\n return JSON.stringify(val);\n }\n }\n case 'function':\n case 'undefined':\n return isArrayProp ? null : undefined;\n case 'bigint':\n return `${val.toString()}n`;\n case 'string':\n return JSON.stringify(val);\n default:\n return isFinite(val as number) ? val : null;\n }\n}\n\nexport default function (\n val:\n | Function // eslint-disable-line @typescript-eslint/no-unsafe-function-type\n | undefined,\n): undefined;\nexport default function (val: unknown): string;\nexport default function (val: unknown): string | undefined {\n const returnVal = stringify(val, false);\n if (returnVal !== undefined) {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n return '' + returnVal;\n }\n}\n"]}