{"version":3,"file":"stringify-Ciz4xWm4.mjs","names":[],"sources":["../src/utils/stringify.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n                       ⚡ Storm Software - Stryke\n\n This code was released as part of the Stryke project. Stryke\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/stryke.\n\n Website:                  https://stormsoftware.com\n Repository:               https://github.com/storm-software/stryke\n Documentation:            https://docs.stormsoftware.com/projects/stryke\n Contact:                  https://stormsoftware.com/contact\n\n SPDX-License-Identifier:  Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { isNumber } from \"@stryke/type-checks/is-number\";\nimport { isUndefined } from \"@stryke/type-checks/is-undefined\";\n\nexport const invalidKeyChars = [\n  \"@\",\n  \"/\",\n  \"#\",\n  \"$\",\n  \" \",\n  \":\",\n  \";\",\n  \",\",\n  \".\",\n  \"!\",\n  \"?\",\n  \"&\",\n  \"=\",\n  \"+\",\n  \"-\",\n  \"*\",\n  \"%\",\n  \"^\",\n  \"~\",\n  \"|\",\n  \"\\\\\",\n  '\"',\n  \"'\",\n  \"`\",\n  \"{\",\n  \"}\",\n  \"[\",\n  \"]\",\n  \"(\",\n  \")\",\n  \"<\",\n  \">\"\n] as const;\n\n/**\n * Stringify a value to a JSON-like string.\n *\n * @param value - The value to stringify\n * @param spacing - The spacing to use for the stringification\n * @returns The stringified value\n */\nexport const stringify = (\n  value: unknown,\n  spacing: string | number = 2\n): string => {\n  const space = isNumber(spacing) ? \" \".repeat(spacing) : spacing;\n\n  switch (value) {\n    case null: {\n      return \"null\";\n    }\n    case undefined: {\n      return '\"undefined\"';\n    }\n    case true: {\n      return \"true\";\n    }\n    case false: {\n      return \"false\";\n    }\n    case Number.POSITIVE_INFINITY: {\n      return \"infinity\";\n    }\n    case Number.NEGATIVE_INFINITY: {\n      return \"-infinity\";\n    }\n  }\n\n  if (Array.isArray(value)) {\n    return `[${space}${value.map(v => stringify(v, space)).join(`,${space}`)}${space}]`;\n  }\n  if (value instanceof Uint8Array) {\n    return value.toString();\n  }\n\n  // eslint-disable-next-line ts/switch-exhaustiveness-check\n  switch (typeof value) {\n    case \"number\": {\n      return `${value}`;\n    }\n    case \"string\": {\n      return JSON.stringify(value);\n    }\n    case \"object\": {\n      const keys = Object.keys(value as object).filter(\n        key => !isUndefined((value as any)[key])\n      );\n\n      return `{${space}${keys\n        .map(\n          key => `\"${key}\": ${space}${stringify((value as any)[key], space)}`\n        )\n        .join(`,${space}`)}${space}}`;\n    }\n    default:\n      return \"null\";\n  }\n};\n"],"mappings":";;;;AAqBA,MAAa,kBAAkB;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;;;;;AASD,MAAa,aACX,OACA,UAA2B,MAChB;CACX,MAAM,QAAQ,SAAS,QAAQ,GAAG,IAAI,OAAO,QAAQ,GAAG;AAExD,SAAQ,OAAR;EACE,KAAK,KACH,QAAO;EAET,KAAK,OACH,QAAO;EAET,KAAK,KACH,QAAO;EAET,KAAK,MACH,QAAO;EAET,KAAK,OAAO,kBACV,QAAO;EAET,KAAK,OAAO,kBACV,QAAO;;AAIX,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,IAAI,QAAQ,MAAM,KAAI,MAAK,UAAU,GAAG,MAAM,CAAC,CAAC,KAAK,IAAI,QAAQ,GAAG,MAAM;AAEnF,KAAI,iBAAiB,WACnB,QAAO,MAAM,UAAU;AAIzB,SAAQ,OAAO,OAAf;EACE,KAAK,SACH,QAAO,GAAG;EAEZ,KAAK,SACH,QAAO,KAAK,UAAU,MAAM;EAE9B,KAAK,SAKH,QAAO,IAAI,QAJE,OAAO,KAAK,MAAgB,CAAC,QACxC,QAAO,CAAC,YAAa,MAAc,KAAK,CACzC,CAGE,KACC,QAAO,IAAI,IAAI,KAAK,QAAQ,UAAW,MAAc,MAAM,MAAM,GAClE,CACA,KAAK,IAAI,QAAQ,GAAG,MAAM;EAE/B,QACE,QAAO"}