@rzl-zone/utils-js 3.13.0-beta.2 → 3.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/README.md +4 -4
  2. package/dist/.references/index.d.cts +1 -1
  3. package/dist/.references/index.d.ts +1 -1
  4. package/dist/{assertIsArray-BqjMoan3.cjs → assertIsArray-BgdgVjDu.cjs} +3 -3
  5. package/dist/{assertIsArray-BqjMoan3.cjs.map → assertIsArray-BgdgVjDu.cjs.map} +1 -1
  6. package/dist/{assertIsArray-6BcSdNa-.js → assertIsArray-hZyYKvLb.js} +3 -3
  7. package/dist/{assertIsArray-6BcSdNa-.js.map → assertIsArray-hZyYKvLb.js.map} +1 -1
  8. package/dist/{assertIsBoolean-Bv6gL-xe.js → assertIsBoolean-9-huIcIR.js} +2 -2
  9. package/dist/{assertIsBoolean-Bv6gL-xe.js.map → assertIsBoolean-9-huIcIR.js.map} +1 -1
  10. package/dist/{assertIsBoolean-amRiJHnh.cjs → assertIsBoolean-JGpkg5ju.cjs} +2 -2
  11. package/dist/{assertIsBoolean-amRiJHnh.cjs.map → assertIsBoolean-JGpkg5ju.cjs.map} +1 -1
  12. package/dist/{assertIsString-1WiUjgqf.js → assertIsString-CcOpQqcv.js} +3 -3
  13. package/dist/{assertIsString-1WiUjgqf.js.map → assertIsString-CcOpQqcv.js.map} +1 -1
  14. package/dist/{assertIsString-C0b28AU1.cjs → assertIsString-UR6QjqyZ.cjs} +3 -3
  15. package/dist/{assertIsString-C0b28AU1.cjs.map → assertIsString-UR6QjqyZ.cjs.map} +1 -1
  16. package/dist/assertions/index.cjs +5 -5
  17. package/dist/assertions/index.d.cts +2 -2
  18. package/dist/assertions/index.d.ts +2 -2
  19. package/dist/assertions/index.js +5 -5
  20. package/dist/conversions/index.cjs +6 -6
  21. package/dist/conversions/index.d.cts +2 -2
  22. package/dist/conversions/index.d.ts +2 -2
  23. package/dist/conversions/index.js +6 -6
  24. package/dist/{conversions-lvvAYiZs.cjs → conversions-DLt2zlyu.cjs} +12 -12
  25. package/dist/{conversions-lvvAYiZs.cjs.map → conversions-DLt2zlyu.cjs.map} +1 -1
  26. package/dist/{conversions-BrI0GIOr.js → conversions-Du6GC5JA.js} +12 -12
  27. package/dist/{conversions-BrI0GIOr.js.map → conversions-Du6GC5JA.js.map} +1 -1
  28. package/dist/events/index.cjs +4 -4
  29. package/dist/events/index.d.cts +1 -1
  30. package/dist/events/index.d.ts +1 -1
  31. package/dist/events/index.js +4 -4
  32. package/dist/formatters/index.cjs +2 -2
  33. package/dist/formatters/index.d.cts +2 -2
  34. package/dist/formatters/index.d.ts +2 -2
  35. package/dist/formatters/index.js +2 -2
  36. package/dist/{formatters-DQr05EUA.cjs → formatters-C0t5CdX-.cjs} +10 -10
  37. package/dist/{formatters-DQr05EUA.cjs.map → formatters-C0t5CdX-.cjs.map} +1 -1
  38. package/dist/{formatters-zDzQvtb4.js → formatters-RomzqDp_.js} +10 -10
  39. package/dist/{formatters-zDzQvtb4.js.map → formatters-RomzqDp_.js.map} +1 -1
  40. package/dist/generators/index.cjs +5 -5
  41. package/dist/generators/index.d.cts +2 -2
  42. package/dist/generators/index.d.ts +2 -2
  43. package/dist/generators/index.js +5 -5
  44. package/dist/{index-GSUN6rjA.d.ts → index-50G4edI1.d.ts} +2 -2
  45. package/dist/{index-DxZlGbAH.d.ts → index-5DpyzfpU.d.ts} +1 -1
  46. package/dist/{index-BlTCrSyc.d.cts → index-B6Xg9Z8l.d.ts} +2 -2
  47. package/dist/{index-3jBnthag.d.cts → index-BFI4R7Pn.d.ts} +1 -1
  48. package/dist/{index-Ckao53JY.d.ts → index-BcKPWWfh.d.ts} +2 -2
  49. package/dist/{index-CEm8ZOvj.d.ts → index-CMcxcN7w.d.cts} +2 -2
  50. package/dist/{index-_dJhBl1h.d.ts → index-CPc-TTMc.d.cts} +1 -1
  51. package/dist/{index-DIeR8qa-.d.ts → index-D-5AsV9K.d.cts} +1 -1
  52. package/dist/{index-bMa-0Yr4.d.cts → index-DM_0q4CY.d.cts} +1 -1
  53. package/dist/{index-z_uCh5KW.d.cts → index-DoteSYTy.d.cts} +1 -1
  54. package/dist/{index-DHHrLc0B.d.ts → index-bGRsmkyA.d.ts} +1 -1
  55. package/dist/{index-DyVWeYP3.d.cts → index-hsSSKuvW.d.ts} +1 -1
  56. package/dist/{index-BXwimNPA.d.cts → index-s7h0w-8H.d.cts} +2 -2
  57. package/dist/{index-CLq5kZmQ.d.cts → index-tYmZ3X4Y.d.cts} +2 -2
  58. package/dist/{isBigInt-CIFRnsdx.cjs → isBigInt-C0gHDkh4.cjs} +2 -2
  59. package/dist/{isBigInt-CIFRnsdx.cjs.map → isBigInt-C0gHDkh4.cjs.map} +1 -1
  60. package/dist/{isBigInt-D-Pu9sxp.js → isBigInt-bbW78ITJ.js} +2 -2
  61. package/dist/{isBigInt-D-Pu9sxp.js.map → isBigInt-bbW78ITJ.js.map} +1 -1
  62. package/dist/{isEmptyObject-CZ9DLi7R.js → isEmptyObject-CZsFdN7x.js} +3 -3
  63. package/dist/{isEmptyObject-CZ9DLi7R.js.map → isEmptyObject-CZsFdN7x.js.map} +1 -1
  64. package/dist/{isEmptyObject-CEySmyHK.cjs → isEmptyObject-D-fETD_f.cjs} +3 -3
  65. package/dist/{isEmptyObject-CEySmyHK.cjs.map → isEmptyObject-D-fETD_f.cjs.map} +1 -1
  66. package/dist/{isEmptyString-DI64RQCy.cjs → isEmptyString-Dx6OM5PL.cjs} +3 -3
  67. package/dist/{isEmptyString-DI64RQCy.cjs.map → isEmptyString-Dx6OM5PL.cjs.map} +1 -1
  68. package/dist/{isEmptyString-DFDtBbNr.js → isEmptyString-pmcf-orv.js} +3 -3
  69. package/dist/{isEmptyString-DFDtBbNr.js.map → isEmptyString-pmcf-orv.js.map} +1 -1
  70. package/dist/{isEmptyValue-aGyeClwA.js → isEmptyValue-CkiXENcT.js} +5 -5
  71. package/dist/{isEmptyValue-aGyeClwA.js.map → isEmptyValue-CkiXENcT.js.map} +1 -1
  72. package/dist/{isEmptyValue-Cw6ovu7z.cjs → isEmptyValue-v6BsHBiu.cjs} +5 -5
  73. package/dist/{isEmptyValue-Cw6ovu7z.cjs.map → isEmptyValue-v6BsHBiu.cjs.map} +1 -1
  74. package/dist/{isEqual-UsvOwrlY.cjs → isEqual-CZxetLzm.cjs} +4 -4
  75. package/dist/{isEqual-UsvOwrlY.cjs.map → isEqual-CZxetLzm.cjs.map} +1 -1
  76. package/dist/{isEqual-Dtb2sXUv.js → isEqual-Dc8fNB2J.js} +4 -4
  77. package/dist/{isEqual-Dtb2sXUv.js.map → isEqual-Dc8fNB2J.js.map} +1 -1
  78. package/dist/{isFinite-uukWvxJh.cjs → isFinite-0z31xOa2.cjs} +3 -3
  79. package/dist/{isFinite-uukWvxJh.cjs.map → isFinite-0z31xOa2.cjs.map} +1 -1
  80. package/dist/{isFinite-Cz_IFXuV.js → isFinite-CI59vUHt.js} +3 -3
  81. package/dist/{isFinite-Cz_IFXuV.js.map → isFinite-CI59vUHt.js.map} +1 -1
  82. package/dist/{isInteger-DPYjliLZ.cjs → isInteger-DUhd-dyt.cjs} +2 -2
  83. package/dist/{isInteger-DPYjliLZ.cjs.map → isInteger-DUhd-dyt.cjs.map} +1 -1
  84. package/dist/{isInteger-DZ163OQg.js → isInteger-DeN5FIAr.js} +2 -2
  85. package/dist/{isInteger-DZ163OQg.js.map → isInteger-DeN5FIAr.js.map} +1 -1
  86. package/dist/{isPlainObject-CBABRyEX.d.cts → isPlainObject-CjoJH9yk.d.ts} +1 -1
  87. package/dist/{isPlainObject-Dr8gi89U.d.ts → isPlainObject-DvxdHoAf.d.cts} +1 -1
  88. package/dist/{isServer-BDShLyVJ.js → isServer-BM5GzRpI.js} +2 -2
  89. package/dist/{isServer-BDShLyVJ.js.map → isServer-BM5GzRpI.js.map} +1 -1
  90. package/dist/{isServer-BzDeYuGg.cjs → isServer-TOmhgOtP.cjs} +2 -2
  91. package/dist/{isServer-BzDeYuGg.cjs.map → isServer-TOmhgOtP.cjs.map} +1 -1
  92. package/dist/{isTypedArray-DuUUA4CL.js → isTypedArray-BPerK072.js} +3 -3
  93. package/dist/{isTypedArray-DuUUA4CL.js.map → isTypedArray-BPerK072.js.map} +1 -1
  94. package/dist/{isTypedArray-DaYAkyrt.cjs → isTypedArray-pAdBFUDl.cjs} +3 -3
  95. package/dist/{isTypedArray-DaYAkyrt.cjs.map → isTypedArray-pAdBFUDl.cjs.map} +1 -1
  96. package/dist/{isValidDomain-BxyToAlh.cjs → isValidDomain-BMcr9vTp.cjs} +6 -6
  97. package/dist/isValidDomain-BMcr9vTp.cjs.map +1 -0
  98. package/dist/{isValidDomain-CTw5vZFY.js → isValidDomain-CHKOn79-.js} +6 -6
  99. package/dist/isValidDomain-CHKOn79-.js.map +1 -0
  100. package/dist/{noop-DGg9vMSD.js → noop-BaNz9ls5.js} +2 -2
  101. package/dist/{noop-DGg9vMSD.js.map → noop-BaNz9ls5.js.map} +1 -1
  102. package/dist/{noop-7KrqC9DC.cjs → noop-D4g9yTAW.cjs} +2 -2
  103. package/dist/{noop-7KrqC9DC.cjs.map → noop-D4g9yTAW.cjs.map} +1 -1
  104. package/dist/{normalizeSpaces-C1eLwykD.js → normalizeSpaces-DupusmF5.js} +3 -3
  105. package/dist/{normalizeSpaces-C1eLwykD.js.map → normalizeSpaces-DupusmF5.js.map} +1 -1
  106. package/dist/{normalizeSpaces-B6ZQOZRX.cjs → normalizeSpaces-MWiYtSyS.cjs} +3 -3
  107. package/dist/{normalizeSpaces-B6ZQOZRX.cjs.map → normalizeSpaces-MWiYtSyS.cjs.map} +1 -1
  108. package/dist/operations/index.cjs +7 -7
  109. package/dist/operations/index.d.cts +1 -1
  110. package/dist/operations/index.d.ts +1 -1
  111. package/dist/operations/index.js +7 -7
  112. package/dist/parsers/index.cjs +2 -2
  113. package/dist/parsers/index.d.cts +1 -1
  114. package/dist/parsers/index.d.ts +1 -1
  115. package/dist/parsers/index.js +2 -2
  116. package/dist/{parsers-DEFpCYhw.cjs → parsers-Bd-YRt6j.cjs} +4 -4
  117. package/dist/{parsers-DEFpCYhw.cjs.map → parsers-Bd-YRt6j.cjs.map} +1 -1
  118. package/dist/{parsers-bQQ9mStV.js → parsers-Dl9fFra4.js} +4 -4
  119. package/dist/{parsers-bQQ9mStV.js.map → parsers-Dl9fFra4.js.map} +1 -1
  120. package/dist/{parsing-BngARhmu.js → parsing-BG73HUrI.js} +3 -3
  121. package/dist/{parsing-BngARhmu.js.map → parsing-BG73HUrI.js.map} +1 -1
  122. package/dist/{parsing-lI5EN4LY.cjs → parsing-CU_Mc7CF.cjs} +3 -3
  123. package/dist/{parsing-lI5EN4LY.cjs.map → parsing-CU_Mc7CF.cjs.map} +1 -1
  124. package/dist/predicates/index.cjs +14 -14
  125. package/dist/predicates/index.d.cts +3 -3
  126. package/dist/predicates/index.d.ts +3 -3
  127. package/dist/predicates/index.js +14 -14
  128. package/dist/{predicates-CMmP3fPJ.cjs → predicates-Bd4AnXr0.cjs} +11 -11
  129. package/dist/{predicates-CMmP3fPJ.cjs.map → predicates-Bd4AnXr0.cjs.map} +1 -1
  130. package/dist/{predicates-V87QD8hs.js → predicates-VJN-VDha.js} +11 -11
  131. package/dist/{predicates-V87QD8hs.js.map → predicates-VJN-VDha.js.map} +1 -1
  132. package/dist/promises/index.cjs +4 -4
  133. package/dist/promises/index.d.cts +1 -1
  134. package/dist/promises/index.d.ts +1 -1
  135. package/dist/promises/index.js +4 -4
  136. package/dist/{punyCode-DmTsB7q_.cjs → punyCode-5wmummgP.cjs} +4 -4
  137. package/dist/{punyCode-DmTsB7q_.cjs.map → punyCode-5wmummgP.cjs.map} +1 -1
  138. package/dist/{punyCode-BeFYDjj0.js → punyCode-C0ft9dER.js} +4 -4
  139. package/dist/{punyCode-BeFYDjj0.js.map → punyCode-C0ft9dER.js.map} +1 -1
  140. package/dist/{removeSpaces-C8mu_yp3.cjs → removeSpaces-CPj1ABLa.cjs} +3 -3
  141. package/dist/{removeSpaces-C8mu_yp3.cjs.map → removeSpaces-CPj1ABLa.cjs.map} +1 -1
  142. package/dist/{removeSpaces-B96axxP6.js → removeSpaces-DpiJ1H1P.js} +3 -3
  143. package/dist/{removeSpaces-B96axxP6.js.map → removeSpaces-DpiJ1H1P.js.map} +1 -1
  144. package/dist/rzl-utils.global.js +1 -1
  145. package/dist/{safeJsonParse-DyCsTXlU.js → safeJsonParse-BxOZgGy7.js} +6 -6
  146. package/dist/{safeJsonParse-DyCsTXlU.js.map → safeJsonParse-BxOZgGy7.js.map} +1 -1
  147. package/dist/{safeJsonParse-BXbtX_j7.cjs → safeJsonParse-v7ll9iFG.cjs} +6 -6
  148. package/dist/{safeJsonParse-BXbtX_j7.cjs.map → safeJsonParse-v7ll9iFG.cjs.map} +1 -1
  149. package/dist/{safeStableStringify-DRYQ56Dg.cjs → safeStableStringify-BiUOLBYo.cjs} +4 -4
  150. package/dist/{safeStableStringify-DRYQ56Dg.cjs.map → safeStableStringify-BiUOLBYo.cjs.map} +1 -1
  151. package/dist/{safeStableStringify-BrOcdX9n.js → safeStableStringify-C5Gc3ZED.js} +4 -4
  152. package/dist/{safeStableStringify-BrOcdX9n.js.map → safeStableStringify-C5Gc3ZED.js.map} +1 -1
  153. package/dist/strings/index.cjs +5 -5
  154. package/dist/strings/index.d.cts +2 -2
  155. package/dist/strings/index.d.ts +2 -2
  156. package/dist/strings/index.js +5 -5
  157. package/dist/tailwind/index.cjs +2 -2
  158. package/dist/tailwind/index.d.cts +2 -2
  159. package/dist/tailwind/index.d.ts +2 -2
  160. package/dist/tailwind/index.js +2 -2
  161. package/dist/{tailwind-BZ2_MeNX.js → tailwind-CxI2DXpR.js} +5 -5
  162. package/dist/{tailwind-BZ2_MeNX.js.map → tailwind-CxI2DXpR.js.map} +1 -1
  163. package/dist/{tailwind-C1YtxJ-K.cjs → tailwind-DhKiKZAc.cjs} +5 -5
  164. package/dist/{tailwind-C1YtxJ-K.cjs.map → tailwind-DhKiKZAc.cjs.map} +1 -1
  165. package/dist/{toStringArrayUnRecursive-tHp2a7KR.js → toStringArrayUnRecursive-BaZrCGaR.js} +6 -6
  166. package/dist/{toStringArrayUnRecursive-tHp2a7KR.js.map → toStringArrayUnRecursive-BaZrCGaR.js.map} +1 -1
  167. package/dist/{toStringArrayUnRecursive-D1mPM4wg.cjs → toStringArrayUnRecursive-BuRBWRcB.cjs} +6 -6
  168. package/dist/{toStringArrayUnRecursive-D1mPM4wg.cjs.map → toStringArrayUnRecursive-BuRBWRcB.cjs.map} +1 -1
  169. package/dist/urls/index.cjs +3 -3
  170. package/dist/urls/index.d.cts +1 -1
  171. package/dist/urls/index.d.ts +1 -1
  172. package/dist/urls/index.js +3 -3
  173. package/dist/{urls-DCyx8Wpk.cjs → urls-CyhKg1Cn.cjs} +11 -11
  174. package/dist/{urls-DCyx8Wpk.cjs.map → urls-CyhKg1Cn.cjs.map} +1 -1
  175. package/dist/{urls-CoxDAoki.js → urls-nr2hUK75.js} +11 -11
  176. package/dist/{urls-CoxDAoki.js.map → urls-nr2hUK75.js.map} +1 -1
  177. package/package.json +5 -5
  178. package/dist/isValidDomain-BxyToAlh.cjs.map +0 -1
  179. package/dist/isValidDomain-CTw5vZFY.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"safeJsonParse-BXbtX_j7.cjs","names":["isNonEmptyString","getPreciseType","safeStableStringify","hasOwnProp","noop","isBoolean","isArray","isFunction","getPreciseType","isNull","isUndefined","isString","isArray","isEmptyArray","isObject","isEmptyObject","isString","isNumber","isNull","isNaN","isNonEmptyString","isNumber","isString","isError"],"sources":["../src/conversions/json/parseCustomDate.ts","../src/conversions/json/_private/utils/validateJsonParsingOptions.ts","../src/conversions/json/cleanParsedData.ts","../src/conversions/numerics/extractDigits.ts","../src/conversions/json/_private/utils/fixSingleQuotesEscapeBackslash.ts","../src/conversions/json/safeJsonParse.ts"],"sourcesContent":["import { getPreciseType } from \"@/predicates/type/getPreciseType\";\nimport { isNonEmptyString } from \"@/predicates/is/isNonEmptyString\";\n\nimport { safeStableStringify } from \"../stringify/safeStableStringify\";\n\n/** --------------------------------------------------\n * * ***Utility: `parseCustomDate`.***\n * ---------------------------------------------\n * **Parses custom date formats like \"DD/MM/YYYY\" or \"MM/DD/YYYY\".**\n * @param {string} dateString - Date string to parse.\n * @param {string} format - Date format to match.\n * @returns {Date | null} Returns a `Date` object if valid, otherwise `null`.\n * @throws **{@link TypeError | `TypeError`}** if `dateString` **(first parameter)** and `format` **(second parameter)** is not a string or empty-string.\n * @example\n * // Valid: European format (DD/MM/YYYY)\n * const date1 = parseCustomDate(\"03/09/2025\", \"DD/MM/YYYY\");\n * console.log(date1); // ➔ Date { Wed Sep 03 2025 ... }\n *\n * // Valid: US format (MM/DD/YYYY)\n * const date2 = parseCustomDate(\"09/03/2025\", \"MM/DD/YYYY\");\n * console.log(date2); // ➔ Date { Wed Sep 03 2025 ... }\n *\n * // Invalid: wrong format\n * const date3 = parseCustomDate(\"2025-09-03\", \"DD/MM/YYYY\");\n * console.log(date3); // ➔ null\n *\n * // Invalid: non-date string\n * const date4 = parseCustomDate(\"hello\", \"DD/MM/YYYY\");\n * console.log(date4); // ➔ null\n *\n * // Throws: wrong parameter types or empty-string\n * parseCustomDate(123, \"DD/MM/YYYY\");\n * // ➔ TypeError: Parameter `dateString` and `format` must be of type `string`...\n */\nexport const parseCustomDate = (\n dateString: string,\n format: string\n): Date | null => {\n if (!isNonEmptyString(dateString) || !isNonEmptyString(format)) {\n throw new TypeError(\n `Parameter \\`dateString\\` and \\`format\\` must be of type \\`string\\` and not empty-string, but received: \"['dateString': \\`${getPreciseType(\n dateString\n )}\\` - (current value: \\`${safeStableStringify(dateString, {\n keepUndefined: true\n })}\\`), 'format': \\`${getPreciseType(\n format\n )}\\` - (current value: \\`${safeStableStringify(format, {\n keepUndefined: true\n })}\\`)]\".`\n );\n }\n\n const dateParts = dateString.split(/[-/]/).map(Number);\n if (dateParts.length !== 3 || dateParts.some(isNaN)) return null;\n\n let day: number | undefined,\n month: number | undefined,\n year: number | undefined;\n\n if (format === \"DD/MM/YYYY\") {\n [day, month, year] = dateParts;\n } else if (format === \"MM/DD/YYYY\") {\n [month, day, year] = dateParts;\n } else {\n return null;\n }\n\n if (month) month -= 1;\n const date = year && month && day ? new Date(year, month, day) : undefined;\n\n if (\n !date ||\n date.getFullYear() !== year ||\n date.getMonth() !== month ||\n date.getDate() !== day\n ) {\n return null;\n }\n\n return date;\n};\n","import type { Prettify } from \"@rzl-zone/ts-types-plus\";\n\nimport type { ParseParsedDataOptions } from \"../types/ParseParsedDataOptions\";\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { cleanParsedData } from \"../../cleanParsedData\";\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { parseCustomDate } from \"../../parseCustomDate\";\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { safeJsonParse } from \"../../safeJsonParse\";\n\nimport { isArray } from \"@/predicates/is/isArray\";\nimport { isBoolean } from \"@/predicates/is/isBoolean\";\nimport { isFunction } from \"@/predicates/is/isFunction\";\nimport { hasOwnProp } from \"@/predicates/has/hasOwnProp\";\nimport { getPreciseType } from \"@/predicates/type/getPreciseType\";\n\nimport { noop } from \"@/generators/utils/noop\";\nimport { assertIsPlainObject } from \"@/assertions/objects/assertIsPlainObject\";\n\ntype ValidatedParsedDataOptions = Prettify<Required<ParseParsedDataOptions>>;\n\n/** * ***Private Helper for Options Validation Function: {@link cleanParsedData | `cleanParsedData`}, {@link parseCustomDate | `parseCustomDate`} and {@link safeJsonParse | `safeJsonParse`}.***\n *\n * @internal\n */\nexport const validateJsonParsingOptions = (\n optionsValue: ParseParsedDataOptions = {}\n): ValidatedParsedDataOptions => {\n assertIsPlainObject(optionsValue, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`options\\`) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const convertBooleans = hasOwnProp(optionsValue, \"convertBooleans\")\n ? optionsValue.convertBooleans\n : false;\n const convertDates = hasOwnProp(optionsValue, \"convertDates\")\n ? optionsValue.convertDates\n : false;\n const convertNumbers = hasOwnProp(optionsValue, \"convertNumbers\")\n ? optionsValue.convertNumbers\n : false;\n const loggingOnFail = hasOwnProp(optionsValue, \"loggingOnFail\")\n ? optionsValue.loggingOnFail\n : false;\n const removeEmptyArrays = hasOwnProp(optionsValue, \"removeEmptyArrays\")\n ? optionsValue.removeEmptyArrays\n : false;\n const removeEmptyObjects = hasOwnProp(optionsValue, \"removeEmptyObjects\")\n ? optionsValue.removeEmptyObjects\n : false;\n const removeNulls = hasOwnProp(optionsValue, \"removeNulls\")\n ? optionsValue.removeNulls\n : false;\n const removeUndefined = hasOwnProp(optionsValue, \"removeUndefined\")\n ? optionsValue.removeUndefined\n : false;\n const strictMode = hasOwnProp(optionsValue, \"strictMode\")\n ? optionsValue.strictMode\n : false;\n const checkSymbols = hasOwnProp(optionsValue, \"checkSymbols\")\n ? optionsValue.checkSymbols\n : false;\n const convertNaN = hasOwnProp(optionsValue, \"convertNaN\")\n ? optionsValue.convertNaN\n : false;\n\n const customDateFormats = hasOwnProp(optionsValue, \"customDateFormats\")\n ? optionsValue.customDateFormats\n : [];\n const onError = hasOwnProp(optionsValue, \"onError\")\n ? optionsValue.onError\n : noop;\n\n if (\n !(\n isBoolean(convertBooleans) &&\n isBoolean(convertDates) &&\n isBoolean(convertNumbers) &&\n isBoolean(convertNaN) &&\n isBoolean(checkSymbols) &&\n isBoolean(loggingOnFail) &&\n isBoolean(removeEmptyArrays) &&\n isBoolean(removeEmptyObjects) &&\n isBoolean(removeNulls) &&\n isBoolean(removeUndefined) &&\n isBoolean(strictMode) &&\n isArray(customDateFormats) &&\n isFunction(onError)\n )\n ) {\n throw new TypeError(\n `Invalid \\`options\\` parameter (second argument): \\`convertBooleans\\`, \\`convertDates\\`, \\`convertNumbers\\`, \\`loggingOnFail\\`, \\`removeEmptyArrays\\`, \\`removeEmptyObjects\\`, \\`removeNulls\\`, \\`removeUndefined\\`, \\`strictMode\\` expected to be a \\`boolean\\` type, \\`customDateFormats\\` expected to be a \\`array\\` type and \\`onError\\` expected to be a \\`void function\\` type. But received: ['convertBooleans': \\`${getPreciseType(\n convertBooleans\n )}\\`, 'convertDates': \\`${getPreciseType(\n convertDates\n )}\\`, 'convertNumbers': \\`${getPreciseType(\n convertNumbers\n )}\\`, 'loggingOnFail': \\`${getPreciseType(\n loggingOnFail\n )}\\`, 'removeEmptyArrays': \\`${getPreciseType(\n removeEmptyArrays\n )}\\`, 'removeEmptyObjects': \\`${getPreciseType(\n removeEmptyObjects\n )}\\`, 'removeNulls': \\`${getPreciseType(\n removeNulls\n )}\\`, 'removeUndefined': \\`${getPreciseType(\n removeUndefined\n )}\\`, 'strictMode': \\`${getPreciseType(\n strictMode\n )}\\`, 'customDateFormats': \\`${getPreciseType(\n customDateFormats\n )}\\`, 'onError': \\`${getPreciseType(onError)}\\`].`\n );\n }\n\n return {\n convertBooleans,\n convertDates,\n convertNumbers,\n convertNaN,\n loggingOnFail,\n removeEmptyArrays,\n removeEmptyObjects,\n removeNulls,\n removeUndefined,\n strictMode,\n customDateFormats,\n onError,\n checkSymbols\n };\n};\n","import type { ParseParsedDataOptions } from \"./_private/types/ParseParsedDataOptions\";\n\nimport { isNull } from \"@/predicates/is/isNull\";\nimport { isArray } from \"@/predicates/is/isArray\";\nimport { isString } from \"@/predicates/is/isString\";\nimport { isObject } from \"@/predicates/is/isObject\";\nimport { isUndefined } from \"@/predicates/is/isUndefined\";\nimport { isEmptyArray } from \"@/predicates/is/isEmptyArray\";\nimport { isEmptyObject } from \"@/predicates/is/isEmptyObject\";\n\nimport { parseCustomDate } from \"./parseCustomDate\";\nimport { validateJsonParsingOptions } from \"./_private/utils/validateJsonParsingOptions\";\n\n/** --------------------------------------------------\n * * ***Utility: `cleanParsedData`.***\n * ---------------------------------------------\n * **Cleans parsed JSON data based on provided options.**\n * @template T - Expected output type.\n * @param {*} data - The parsed JSON data.\n * @param {ParseParsedDataOptions} [options] - The cleaning options.\n * @returns {T | null | undefined} The cleaned data.\n * - ***⚠️ Notice:*** _If data is JSON string, we recommend use ***`safeJsonParse` utility function*** for more safe._\n * - ***⚠️ Note:*** _If using **`convertDates`** **options**, result may contain Date objects, you may need type assertions in strict TypeScript settings._\n * @example\n * ```ts\n * // 1: Convert numbers and remove nulls\n * const result = cleanParsedData({ age: \"25\", name: null }, {\n * convertNumbers: true,\n * removeNulls: true\n * });\n * console.log(result); // ➔ { age: 25 }\n * // 2: Convert boolean strings\n * const result = cleanParsedData({ isActive: \"true\" }, {\n * convertBooleans: true\n * });\n * console.log(result); // ➔ { isActive: true }\n * ```\n */\nexport const cleanParsedData = <T = unknown>(\n data: T,\n options: ParseParsedDataOptions = {}\n): T | undefined | null => {\n const validOptions = validateJsonParsingOptions(options);\n\n if (isNull(data)) return validOptions.removeNulls ? undefined : null;\n if (isUndefined(data))\n return validOptions.removeUndefined ? undefined : undefined;\n\n if (isString(data)) {\n const trimmed = data.trim();\n\n if (validOptions.convertNaN && trimmed === \"NaN\") return NaN as T;\n\n if (validOptions.convertNumbers && !isNaN(Number(trimmed))) {\n return Number(trimmed) as T;\n }\n\n if (validOptions.convertBooleans) {\n if (trimmed === \"true\") return true as T;\n if (trimmed === \"false\") return false as T;\n }\n\n if (validOptions.convertDates) {\n if (/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/.test(trimmed)) {\n return new Date(trimmed) as T;\n }\n\n if (validOptions.customDateFormats?.length) {\n for (const format of validOptions.customDateFormats) {\n const date = parseCustomDate(trimmed, format);\n if (date) return date as T;\n }\n }\n }\n\n return validOptions.strictMode ? undefined : (trimmed as T);\n }\n\n if (isArray(data)) {\n const cleanedArray = data\n .map((item) => cleanParsedData(item, validOptions))\n .filter((item) => !isUndefined(item));\n\n return validOptions.removeEmptyArrays && isEmptyArray(cleanedArray)\n ? undefined\n : (cleanedArray as T);\n }\n\n if (isObject(data)) {\n const cleanedObject: Record<string, unknown> = {};\n\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n const cleanedValue = cleanParsedData(data[key], validOptions);\n if (!isUndefined(cleanedValue)) {\n cleanedObject[key] = cleanedValue;\n }\n }\n }\n\n return validOptions.removeEmptyObjects &&\n isEmptyObject(cleanedObject, { checkSymbols: validOptions.checkSymbols })\n ? undefined\n : (cleanedObject as T);\n }\n\n return validOptions.strictMode ? undefined : data;\n};\n","import { isNumber } from \"@/predicates/is/isNumber\";\nimport { isString } from \"@/predicates/is/isString\";\n\n/** ----------------------------------------------------------\n * * ***Utility: `extractDigits`.***\n * ---------------------------------------------\n * **Extracts digits from a string or number input.**\n * - **Behavior:**\n * - Converts the input to a string, trims whitespace, and removes any characters that are not digits (`0-9`).\n * - Returns the cleaned numeric value as a `number`.\n * - If the input is a `null`, `undefined`, results in no digits, or not a `string` (or empty-string) or `number`, it safely return `0`.\n * @param {*} [value]\n * **The value to process.**\n * - Accepts a string, number, `null`, or `undefined`.\n * @returns {number} The numeric value after extracting digits (returns `0` if input is invalid or contains no digits).\n * @example\n * extractDigits(12345); // ➔ 12345\n * extractDigits(\"9A8B7C6X1\"); // ➔ 98761\n * extractDigits(\"123abc456\"); // ➔ 123456\n * extractDigits(\"$1,234.56\"); // ➔ 123456\n * extractDigits(NaN); // ➔ 0\n * extractDigits(null); // ➔ 0\n * extractDigits(undefined); // ➔ 0\n * extractDigits(Infinity); // ➔ 0\n * extractDigits(-Infinity); // ➔ 0\n * extractDigits({}); // ➔ 0\n * extractDigits([]); // ➔ 0\n * extractDigits(\"\"); // ➔ 0\n * extractDigits(\" \"); // ➔ 0\n * extractDigits(\"abc\"); // ➔ 0\n * extractDigits(\" 00a \"); // ➔ 0\n */\nexport const extractDigits = (value: unknown): number => {\n if (!isString(value) && !isNumber(value)) return 0;\n\n const cleaned = String(value)\n .trim()\n .replace(/[^0-9]/g, \"\");\n\n return Number(cleaned) || 0;\n};\n","/* eslint-disable quotes */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { safeJsonParse } from \"../../safeJsonParse\";\n\n/** * ***Util Helper for {@link safeJsonParse | `safeJsonParse`}.***\n *\n * @internal\n */\nexport function fixSingleQuotesEscapeBackslash(input: string): string {\n const validEscapes = new Set([\"\\\\\", '\"', \"/\", \"b\", \"f\", \"n\", \"r\", \"t\", \"u\"]);\n\n let output = \"\";\n let inSingleQuote = false;\n let inDoubleQuote = false;\n let escapeNext = false;\n\n for (let i = 0; i < input.length; i++) {\n const c = input[i] || \"\";\n\n if (escapeNext) {\n if (inSingleQuote) {\n if (c === \"'\") {\n output += \"'\";\n } else if (validEscapes.has(c)) {\n if (c === \"\\\\\") {\n output += \"\\\\\\\\\";\n } else if (c === '\"') {\n output += '\\\\\"';\n } else {\n output += \"\\\\\" + c;\n }\n } else {\n output += \"\\\\\\\\\" + c;\n }\n } else if (inDoubleQuote) {\n if (c === '\"') {\n output += '\\\\\"';\n } else if (validEscapes.has(c)) {\n output += \"\\\\\" + c;\n } else {\n output += \"\\\\\\\\\" + c;\n }\n } else {\n output += \"\\\\\" + c;\n }\n escapeNext = false;\n continue;\n }\n\n if (c === \"\\\\\") {\n escapeNext = true;\n continue;\n }\n\n if (!inSingleQuote && !inDoubleQuote) {\n if (c === \"'\") {\n output += '\"';\n inSingleQuote = true;\n continue;\n }\n if (c === '\"') {\n output += '\"';\n inDoubleQuote = true;\n continue;\n }\n } else if (inSingleQuote) {\n if (c === \"'\") {\n output += '\"';\n inSingleQuote = false;\n continue;\n }\n } else if (inDoubleQuote) {\n if (c === '\"') {\n output += '\"';\n inDoubleQuote = false;\n continue;\n }\n }\n\n output += c;\n }\n\n return output;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { IsAny } from \"@rzl-zone/ts-types-plus\";\nimport type { ParseParsedDataOptions } from \"./_private/types/ParseParsedDataOptions\";\nimport type {\n SafeJsonParseResult,\n UnknownValue\n} from \"./_private/types/safeJsonParse\";\n\nimport { isNaN } from \"@/predicates/is/isNaN\";\nimport { isNull } from \"@/predicates/is/isNull\";\nimport { isError } from \"@/predicates/is/isError\";\nimport { isNumber } from \"@/predicates/is/isNumber\";\nimport { isString } from \"@/predicates/is/isString\";\nimport { isNonEmptyString } from \"@/predicates/is/isNonEmptyString\";\n\nimport { cleanParsedData } from \"./cleanParsedData\";\nimport { extractDigits } from \"../numerics/extractDigits\";\nimport { validateJsonParsingOptions } from \"./_private/utils/validateJsonParsingOptions\";\nimport { fixSingleQuotesEscapeBackslash } from \"./_private/utils/fixSingleQuotesEscapeBackslash\";\n\n/** --------------------------------------------------\n * * ***Utility: `safeJsonParse`.***\n * ---------------------------------------------\n * **Safely parses JSON while handling errors and applying transformations.**\n * - **Supports generics** to ensure accurate return type inference.\n * - Always provide both `<TData, TInput>` for best results.\n * - ℹ️ ***Scroll down for full generic behavior explanation.***\n * - Automatically parses valid JSON strings into `objects`, `arrays`, `numbers`, etc.\n * - Supports data transformation via options (e.g., convert strings to `numbers`, `booleans`, or `dates`).\n * - **Returns:**\n * 1. `null` ➔ if input is explicitly `null`.\n * 2. `undefined` ➔ if input is `undefined`, not a `string`, or if parsing fails.\n * 3. Parsed and cleaned result (`TData`) ➔ if input is a valid JSON string.\n * - ⚠️ **JSON.stringify note**:\n * - _If the input JSON string was created using `JSON.stringify()`, any properties with `undefined`\n * values would have been automatically removed or converted to `null` depending on the serializer, example:_\n * ```ts\n * JSON.stringify({ a: undefined, b: 1 }); // ➔ '{\"b\":1}'\n * JSON.parse('{\"a\": undefined, \"b\": 1}') // ❌ invalid JSON\n * ```\n * _Therefore, if you see `undefined` in raw input, it will likely throw unless pre-cleaned or replaced with `null`._\n *\n * ```ts\n * safeJsonParse('{\"name\": \"John\", \"score\": undefined}');\n * // result ➔ { name: \"John\", score: null } <- because `undefined` is not valid JSON, gets replaced to null.\n * ```\n * - ℹ️ **Additionally:**\n * - This function normalizes single quotes (`'`) to double quotes (`\"`) before parsing,\n * so JSON strings using single quotes will be converted to valid JSON format, example:\n * ```ts\n * safeJsonParse(\"{'name': 'John', 'age': 30}\");\n * // result ➔ { name: \"John\", age: 30 }\n *\n * safeJsonParse(\"{'string\\\\'s': 'abc', \\\"quote's\\\": 'It\\\\'s awesome!', 'aNumber\\\\'s': 123, 'keyWith\\\\'Backslash\\\\'s': 'value\\\\'s'}\");\n * // result ➔ { \"string's\": \"abc\", \"quote's\": \"It's awesome!\", \"aNumber's\": 123, \"keyWith'Backslash's\": \"value's\" }\n * ```\n * @template TData - The expected output type after parsing and cleaning.\n * @template TInput - The input value type, used for advanced type inference and return typing.\n * @param {TInput} [value] - The JSON string or value to parse.\n * @param {ParseParsedDataOptions} [options] - Options to clean, convert types, enable strict mode,\n * support custom date formats, enable logging, or handle errors via callback.\n * @returns {SafeJsonParseResult<TData, TInput>} Parsed and optionally cleaned result, or `null`/`undefined`.\n * @throws **{@link TypeError | `TypeError`}** if `options` is provided but not a valid object.\n * @example\n * 1. ***Basic parse with number & boolean conversion:***\n * ```ts\n * const result = safeJsonParse(30);\n * // result ➔ undefined\n * const result = safeJsonParse(30, {\n * convertNumbers: true\n * });\n * // result ➔ 30\n *\n * const result = safeJsonParse('{\"age\": \"30\", \"isActive\": \"true\"}', {\n * convertNumbers: true,\n * convertBooleans: true\n * });\n * // result ➔ { age: 30, isActive: true }\n * ```\n * 2. ***Handling `undefined` in input string (manually written, not JSON.stringify):***\n * ```ts\n * const result = safeJsonParse('{\"score\": undefined}');\n * // result ➔ { score: null } <- because `undefined` is not valid JSON, gets replaced\n * ```\n *\n * 3. ***Handling `NaN` in input string (manually written, not JSON.stringify):***\n * ```ts\n * const value = NaN; // <- value is NaN or \"NaN\";\n * const result = safeJsonParse(value);\n * // result ➔ undefined <- will return as undefined, because options `convertNaN` is false (default),\n * const result2 = safeJsonParse(value, { convertNaN: true });\n * // result2 ➔ NaN <- will return as undefined because options `convertNaN` is false,\n *\n * const result4 = safeJsonParse('{\"strNan\": \"NaN\", \"pureNan\": NaN}');\n * // NaN will convert to string (NaN ➔ \"NaN\") because options `convertNaN` is false (default),\n * // result4 ➔ { strNan: \"NaN\", pureNan: \"NaN\" }\n *\n * const result3 = safeJsonParse('{\"strNan\": \"NaN\", \"pureNan\": NaN}', {\n * convertNaN: true\n * });\n * // String \"NaN\" will convert to NaN (\"NaN\" ➔ NaN) because options `convertNaN` is true,\n * // result3 ➔ { strNan: NaN, pureNan: NaN }\n * ```\n *\n * 4. ***Strict mode (removes invalid values):***\n * ```ts\n * const result = safeJsonParse('{\"name\": \" \", \"score\": \"99abc\"}', {\n * convertNumbers: true,\n * strictMode: true\n * });\n * // result ➔ {}\n *\n * const result2 = safeJsonParse('{\"name\": \" \", \"score\": undefined}');\n * // result2 ➔ { name: \"\",score: null }\n * ```\n *\n * 5. ***Custom date format parsing:***\n * ```ts\n * const result = safeJsonParse('{\"birthday\": \"25/12/2000\"}', {\n * convertDates: true,\n * customDateFormats: [\"DD/MM/YYYY\"]\n * });\n * // result ➔ { birthday: new Date(\"2000-12-25T00:00:00.000Z\") }\n * ```\n *\n * 6. ***Invalid JSON with custom error handling:***\n * ```ts\n * safeJsonParse(\"{invalid}\", {\n * loggingOnFail: true,\n * onError: (err) => console.log(\"Custom handler:\", err.message)\n * });\n * // ➔ Logs parsing error and invokes handler\n * ```\n *\n * 7. ***Null or non-string input returns null/undefined (default options):***\n * ```ts\n * safeJsonParse(123); // ➔ undefined\n * safeJsonParse(null); // ➔ null\n * safeJsonParse(undefined); // ➔ undefined\n * ```\n *\n * 8. ***Generic usage: Provide both output and input type to ensure correct return typing:***\n * ```ts\n * type UserType = { name: string };\n *\n * const obj = JSON.stringify({\n * name: \"John\"\n * });\n *\n * const toParse = isAuth() ? obj : null;\n * const toParse2 = isAuth() ? obj : undefined;\n *\n * // * `Without Generic`:\n * const parsed = safeJsonParse(toParse);\n * //- runtime: { name: \"John\" } | undefined | null\n * //- type: Record<string, unknown> | undefined | null\n * const parsed2 = safeJsonParse(toParse);\n * //- runtime: { name: \"John\" } | undefined\n * //- type: Record<string, unknown> | undefined\n *\n * // * `With Generic`:\n * const parsed = safeJsonParse<UserType>(toParse);\n * //- runtime: { name: \"John\" } | undefined | null\n * //- type: undefined <- (⚠️ unexpected!)\n * const parsed2 = safeJsonParse<UserType>(toParse);\n * //- runtime: { name: \"John\" } | undefined\n * //- type: undefined <- (⚠️ unexpected!)\n * const parsed = safeJsonParse<UserType, typeof toParse>(toParse);\n * //- runtime: { name: \"John\" } | null | undefined\n * //- type: UserType | null | undefined\n * const parsed2 = safeJsonParse<UserType, typeof toParse>(toParse);\n * //- runtime: { name: \"John\" } | undefined\n * //- type: UserType | undefined\n * ```\n * @note\n * ⚠️ **Generic Behavior:**\n * - This function supports advanced generic inference for clean, type-safe return values.\n * - If only the first generic (`TData`) is provided and the second (`TInput`) is omitted,\n * then `TInput` defaults to `undefined`, resulting in a return type of `undefined`.\n * - To ensure correct return typing, **always pass both generics** when `value` is dynamic,\n * nullable, or unioned: `safeJsonParse<TData, typeof value>(value)`.\n * - This makes the returned type exactly match your expectation: `TData | null | undefined`.\n */\nexport function safeJsonParse<\n TData extends Record<string, any> = Record<string, unknown>,\n TInput extends UnknownValue = UnknownValue\n>(\n value: TInput,\n options?: ParseParsedDataOptions\n): IsAny<TInput> extends true ? TData | null | undefined : undefined;\nexport function safeJsonParse<\n TData extends Record<string, any> = Record<string, unknown>,\n TInput extends string | null | undefined | unknown = undefined\n>(\n value: TInput,\n options?: ParseParsedDataOptions\n): SafeJsonParseResult<TData, TInput>;\n//! implement main function\nexport function safeJsonParse<TData extends Record<string, unknown>>(\n value: unknown,\n options: ParseParsedDataOptions = {}\n) {\n if (isNull(value)) return null;\n const validOptions = validateJsonParsingOptions(options);\n\n if (\n validOptions.convertNaN &&\n (isNaN(value) || (isNonEmptyString(value) && value === \"NaN\"))\n ) {\n return NaN;\n }\n if (\n validOptions.convertNumbers &&\n !isNaN(Number(value)) &&\n isNumber(extractDigits(value))\n ) {\n return Number(value);\n }\n\n if (!isString(value)) return undefined;\n\n try {\n // First, normalize all single quotes to double quotes\n let normalized = fixSingleQuotesEscapeBackslash(value);\n\n if (validOptions.removeUndefined) {\n normalized = normalized\n .replace(/,\\s*\"[^\"]*\"\\s*:\\s*undefined(?=\\s*[},])/g, \"\")\n // ➔ remove , \"key\": undefined\n .replace(/\"[^\"]*\"\\s*:\\s*undefined\\s*(,)?/g, \"\");\n // ➔ remove \"key\": undefined\n } else {\n normalized = normalized.replace(/:\\s*undefined(?=\\s*[,}])/g, \":null\");\n // ➔ replace :undefined with :null\n }\n\n if (validOptions.convertNaN) {\n // eslint-disable-next-line quotes\n normalized = normalized.replace(/:\\s*NaN(?=\\s*[,}])/g, ':\"NaN\"');\n // ➔ convert :NaN to :\"NaN\"\n } else {\n normalized = normalized\n // eslint-disable-next-line quotes\n .replace(/:\\s*NaN(?=\\s*[,}])/g, ':\"NaN\"')\n // ➔ convert :NaN to :\"NaN\"\n .replace(/,\\s*\"[^\"]*\"\\s*:\\s*NaN(?=\\s*[},])/g, \"\")\n // ➔ remove , \"key\": NaN\n .replace(/\"[^\"]*\"\\s*:\\s*NaN\\s*(,)?/g, \"\");\n // ➔ remove \"key\": NaN\n }\n\n normalized = normalized.replace(/,(\\s*[}\\]])/g, \"$1\");\n // ➔ remove trailing comma before } or ]\n\n const parsed = JSON.parse(normalized);\n return cleanParsedData<TData>(parsed, validOptions);\n } catch (error) {\n if (validOptions.loggingOnFail) {\n console.error(\"Failed to parsing at `safeJsonParse`:\", error);\n }\n\n validOptions.onError(\n isError(error)\n ? new Error(error.message.replace(/^JSON\\.parse:/, \"Failed to parsing\"))\n : new Error(String(error))\n );\n\n return undefined;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"safeJsonParse-v7ll9iFG.cjs","names":["isNonEmptyString","getPreciseType","safeStableStringify","hasOwnProp","noop","isBoolean","isArray","isFunction","getPreciseType","isNull","isUndefined","isString","isArray","isEmptyArray","isObject","isEmptyObject","isString","isNumber","isNull","isNaN","isNonEmptyString","isNumber","isString","isError"],"sources":["../src/conversions/json/parseCustomDate.ts","../src/conversions/json/_private/utils/validateJsonParsingOptions.ts","../src/conversions/json/cleanParsedData.ts","../src/conversions/numerics/extractDigits.ts","../src/conversions/json/_private/utils/fixSingleQuotesEscapeBackslash.ts","../src/conversions/json/safeJsonParse.ts"],"sourcesContent":["import { getPreciseType } from \"@/predicates/type/getPreciseType\";\nimport { isNonEmptyString } from \"@/predicates/is/isNonEmptyString\";\n\nimport { safeStableStringify } from \"../stringify/safeStableStringify\";\n\n/** --------------------------------------------------\n * * ***Utility: `parseCustomDate`.***\n * ---------------------------------------------\n * **Parses custom date formats like \"DD/MM/YYYY\" or \"MM/DD/YYYY\".**\n * @param {string} dateString - Date string to parse.\n * @param {string} format - Date format to match.\n * @returns {Date | null} Returns a `Date` object if valid, otherwise `null`.\n * @throws **{@link TypeError | `TypeError`}** if `dateString` **(first parameter)** and `format` **(second parameter)** is not a string or empty-string.\n * @example\n * // Valid: European format (DD/MM/YYYY)\n * const date1 = parseCustomDate(\"03/09/2025\", \"DD/MM/YYYY\");\n * console.log(date1); // ➔ Date { Wed Sep 03 2025 ... }\n *\n * // Valid: US format (MM/DD/YYYY)\n * const date2 = parseCustomDate(\"09/03/2025\", \"MM/DD/YYYY\");\n * console.log(date2); // ➔ Date { Wed Sep 03 2025 ... }\n *\n * // Invalid: wrong format\n * const date3 = parseCustomDate(\"2025-09-03\", \"DD/MM/YYYY\");\n * console.log(date3); // ➔ null\n *\n * // Invalid: non-date string\n * const date4 = parseCustomDate(\"hello\", \"DD/MM/YYYY\");\n * console.log(date4); // ➔ null\n *\n * // Throws: wrong parameter types or empty-string\n * parseCustomDate(123, \"DD/MM/YYYY\");\n * // ➔ TypeError: Parameter `dateString` and `format` must be of type `string`...\n */\nexport const parseCustomDate = (\n dateString: string,\n format: string\n): Date | null => {\n if (!isNonEmptyString(dateString) || !isNonEmptyString(format)) {\n throw new TypeError(\n `Parameter \\`dateString\\` and \\`format\\` must be of type \\`string\\` and not empty-string, but received: \"['dateString': \\`${getPreciseType(\n dateString\n )}\\` - (current value: \\`${safeStableStringify(dateString, {\n keepUndefined: true\n })}\\`), 'format': \\`${getPreciseType(\n format\n )}\\` - (current value: \\`${safeStableStringify(format, {\n keepUndefined: true\n })}\\`)]\".`\n );\n }\n\n const dateParts = dateString.split(/[-/]/).map(Number);\n if (dateParts.length !== 3 || dateParts.some(isNaN)) return null;\n\n let day: number | undefined,\n month: number | undefined,\n year: number | undefined;\n\n if (format === \"DD/MM/YYYY\") {\n [day, month, year] = dateParts;\n } else if (format === \"MM/DD/YYYY\") {\n [month, day, year] = dateParts;\n } else {\n return null;\n }\n\n if (month) month -= 1;\n const date = year && month && day ? new Date(year, month, day) : undefined;\n\n if (\n !date ||\n date.getFullYear() !== year ||\n date.getMonth() !== month ||\n date.getDate() !== day\n ) {\n return null;\n }\n\n return date;\n};\n","import type { Prettify } from \"@rzl-zone/ts-types-plus\";\n\nimport type { ParseParsedDataOptions } from \"../types/ParseParsedDataOptions\";\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { cleanParsedData } from \"../../cleanParsedData\";\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { parseCustomDate } from \"../../parseCustomDate\";\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { safeJsonParse } from \"../../safeJsonParse\";\n\nimport { isArray } from \"@/predicates/is/isArray\";\nimport { isBoolean } from \"@/predicates/is/isBoolean\";\nimport { isFunction } from \"@/predicates/is/isFunction\";\nimport { hasOwnProp } from \"@/predicates/has/hasOwnProp\";\nimport { getPreciseType } from \"@/predicates/type/getPreciseType\";\n\nimport { noop } from \"@/generators/utils/noop\";\nimport { assertIsPlainObject } from \"@/assertions/objects/assertIsPlainObject\";\n\ntype ValidatedParsedDataOptions = Prettify<Required<ParseParsedDataOptions>>;\n\n/** * ***Private Helper for Options Validation Function: {@link cleanParsedData | `cleanParsedData`}, {@link parseCustomDate | `parseCustomDate`} and {@link safeJsonParse | `safeJsonParse`}.***\n *\n * @internal\n */\nexport const validateJsonParsingOptions = (\n optionsValue: ParseParsedDataOptions = {}\n): ValidatedParsedDataOptions => {\n assertIsPlainObject(optionsValue, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`options\\`) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const convertBooleans = hasOwnProp(optionsValue, \"convertBooleans\")\n ? optionsValue.convertBooleans\n : false;\n const convertDates = hasOwnProp(optionsValue, \"convertDates\")\n ? optionsValue.convertDates\n : false;\n const convertNumbers = hasOwnProp(optionsValue, \"convertNumbers\")\n ? optionsValue.convertNumbers\n : false;\n const loggingOnFail = hasOwnProp(optionsValue, \"loggingOnFail\")\n ? optionsValue.loggingOnFail\n : false;\n const removeEmptyArrays = hasOwnProp(optionsValue, \"removeEmptyArrays\")\n ? optionsValue.removeEmptyArrays\n : false;\n const removeEmptyObjects = hasOwnProp(optionsValue, \"removeEmptyObjects\")\n ? optionsValue.removeEmptyObjects\n : false;\n const removeNulls = hasOwnProp(optionsValue, \"removeNulls\")\n ? optionsValue.removeNulls\n : false;\n const removeUndefined = hasOwnProp(optionsValue, \"removeUndefined\")\n ? optionsValue.removeUndefined\n : false;\n const strictMode = hasOwnProp(optionsValue, \"strictMode\")\n ? optionsValue.strictMode\n : false;\n const checkSymbols = hasOwnProp(optionsValue, \"checkSymbols\")\n ? optionsValue.checkSymbols\n : false;\n const convertNaN = hasOwnProp(optionsValue, \"convertNaN\")\n ? optionsValue.convertNaN\n : false;\n\n const customDateFormats = hasOwnProp(optionsValue, \"customDateFormats\")\n ? optionsValue.customDateFormats\n : [];\n const onError = hasOwnProp(optionsValue, \"onError\")\n ? optionsValue.onError\n : noop;\n\n if (\n !(\n isBoolean(convertBooleans) &&\n isBoolean(convertDates) &&\n isBoolean(convertNumbers) &&\n isBoolean(convertNaN) &&\n isBoolean(checkSymbols) &&\n isBoolean(loggingOnFail) &&\n isBoolean(removeEmptyArrays) &&\n isBoolean(removeEmptyObjects) &&\n isBoolean(removeNulls) &&\n isBoolean(removeUndefined) &&\n isBoolean(strictMode) &&\n isArray(customDateFormats) &&\n isFunction(onError)\n )\n ) {\n throw new TypeError(\n `Invalid \\`options\\` parameter (second argument): \\`convertBooleans\\`, \\`convertDates\\`, \\`convertNumbers\\`, \\`loggingOnFail\\`, \\`removeEmptyArrays\\`, \\`removeEmptyObjects\\`, \\`removeNulls\\`, \\`removeUndefined\\`, \\`strictMode\\` expected to be a \\`boolean\\` type, \\`customDateFormats\\` expected to be a \\`array\\` type and \\`onError\\` expected to be a \\`void function\\` type. But received: ['convertBooleans': \\`${getPreciseType(\n convertBooleans\n )}\\`, 'convertDates': \\`${getPreciseType(\n convertDates\n )}\\`, 'convertNumbers': \\`${getPreciseType(\n convertNumbers\n )}\\`, 'loggingOnFail': \\`${getPreciseType(\n loggingOnFail\n )}\\`, 'removeEmptyArrays': \\`${getPreciseType(\n removeEmptyArrays\n )}\\`, 'removeEmptyObjects': \\`${getPreciseType(\n removeEmptyObjects\n )}\\`, 'removeNulls': \\`${getPreciseType(\n removeNulls\n )}\\`, 'removeUndefined': \\`${getPreciseType(\n removeUndefined\n )}\\`, 'strictMode': \\`${getPreciseType(\n strictMode\n )}\\`, 'customDateFormats': \\`${getPreciseType(\n customDateFormats\n )}\\`, 'onError': \\`${getPreciseType(onError)}\\`].`\n );\n }\n\n return {\n convertBooleans,\n convertDates,\n convertNumbers,\n convertNaN,\n loggingOnFail,\n removeEmptyArrays,\n removeEmptyObjects,\n removeNulls,\n removeUndefined,\n strictMode,\n customDateFormats,\n onError,\n checkSymbols\n };\n};\n","import type { ParseParsedDataOptions } from \"./_private/types/ParseParsedDataOptions\";\n\nimport { isNull } from \"@/predicates/is/isNull\";\nimport { isArray } from \"@/predicates/is/isArray\";\nimport { isString } from \"@/predicates/is/isString\";\nimport { isObject } from \"@/predicates/is/isObject\";\nimport { isUndefined } from \"@/predicates/is/isUndefined\";\nimport { isEmptyArray } from \"@/predicates/is/isEmptyArray\";\nimport { isEmptyObject } from \"@/predicates/is/isEmptyObject\";\n\nimport { parseCustomDate } from \"./parseCustomDate\";\nimport { validateJsonParsingOptions } from \"./_private/utils/validateJsonParsingOptions\";\n\n/** --------------------------------------------------\n * * ***Utility: `cleanParsedData`.***\n * ---------------------------------------------\n * **Cleans parsed JSON data based on provided options.**\n * @template T - Expected output type.\n * @param {*} data - The parsed JSON data.\n * @param {ParseParsedDataOptions} [options] - The cleaning options.\n * @returns {T | null | undefined} The cleaned data.\n * - ***⚠️ Notice:*** _If data is JSON string, we recommend use ***`safeJsonParse` utility function*** for more safe._\n * - ***⚠️ Note:*** _If using **`convertDates`** **options**, result may contain Date objects, you may need type assertions in strict TypeScript settings._\n * @example\n * ```ts\n * // 1: Convert numbers and remove nulls\n * const result = cleanParsedData({ age: \"25\", name: null }, {\n * convertNumbers: true,\n * removeNulls: true\n * });\n * console.log(result); // ➔ { age: 25 }\n * // 2: Convert boolean strings\n * const result = cleanParsedData({ isActive: \"true\" }, {\n * convertBooleans: true\n * });\n * console.log(result); // ➔ { isActive: true }\n * ```\n */\nexport const cleanParsedData = <T = unknown>(\n data: T,\n options: ParseParsedDataOptions = {}\n): T | undefined | null => {\n const validOptions = validateJsonParsingOptions(options);\n\n if (isNull(data)) return validOptions.removeNulls ? undefined : null;\n if (isUndefined(data))\n return validOptions.removeUndefined ? undefined : undefined;\n\n if (isString(data)) {\n const trimmed = data.trim();\n\n if (validOptions.convertNaN && trimmed === \"NaN\") return NaN as T;\n\n if (validOptions.convertNumbers && !isNaN(Number(trimmed))) {\n return Number(trimmed) as T;\n }\n\n if (validOptions.convertBooleans) {\n if (trimmed === \"true\") return true as T;\n if (trimmed === \"false\") return false as T;\n }\n\n if (validOptions.convertDates) {\n if (/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/.test(trimmed)) {\n return new Date(trimmed) as T;\n }\n\n if (validOptions.customDateFormats?.length) {\n for (const format of validOptions.customDateFormats) {\n const date = parseCustomDate(trimmed, format);\n if (date) return date as T;\n }\n }\n }\n\n return validOptions.strictMode ? undefined : (trimmed as T);\n }\n\n if (isArray(data)) {\n const cleanedArray = data\n .map((item) => cleanParsedData(item, validOptions))\n .filter((item) => !isUndefined(item));\n\n return validOptions.removeEmptyArrays && isEmptyArray(cleanedArray)\n ? undefined\n : (cleanedArray as T);\n }\n\n if (isObject(data)) {\n const cleanedObject: Record<string, unknown> = {};\n\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n const cleanedValue = cleanParsedData(data[key], validOptions);\n if (!isUndefined(cleanedValue)) {\n cleanedObject[key] = cleanedValue;\n }\n }\n }\n\n return validOptions.removeEmptyObjects &&\n isEmptyObject(cleanedObject, { checkSymbols: validOptions.checkSymbols })\n ? undefined\n : (cleanedObject as T);\n }\n\n return validOptions.strictMode ? undefined : data;\n};\n","import { isNumber } from \"@/predicates/is/isNumber\";\nimport { isString } from \"@/predicates/is/isString\";\n\n/** ----------------------------------------------------------\n * * ***Utility: `extractDigits`.***\n * ---------------------------------------------\n * **Extracts digits from a string or number input.**\n * - **Behavior:**\n * - Converts the input to a string, trims whitespace, and removes any characters that are not digits (`0-9`).\n * - Returns the cleaned numeric value as a `number`.\n * - If the input is a `null`, `undefined`, results in no digits, or not a `string` (or empty-string) or `number`, it safely return `0`.\n * @param {*} [value]\n * **The value to process.**\n * - Accepts a string, number, `null`, or `undefined`.\n * @returns {number} The numeric value after extracting digits (returns `0` if input is invalid or contains no digits).\n * @example\n * extractDigits(12345); // ➔ 12345\n * extractDigits(\"9A8B7C6X1\"); // ➔ 98761\n * extractDigits(\"123abc456\"); // ➔ 123456\n * extractDigits(\"$1,234.56\"); // ➔ 123456\n * extractDigits(NaN); // ➔ 0\n * extractDigits(null); // ➔ 0\n * extractDigits(undefined); // ➔ 0\n * extractDigits(Infinity); // ➔ 0\n * extractDigits(-Infinity); // ➔ 0\n * extractDigits({}); // ➔ 0\n * extractDigits([]); // ➔ 0\n * extractDigits(\"\"); // ➔ 0\n * extractDigits(\" \"); // ➔ 0\n * extractDigits(\"abc\"); // ➔ 0\n * extractDigits(\" 00a \"); // ➔ 0\n */\nexport const extractDigits = (value: unknown): number => {\n if (!isString(value) && !isNumber(value)) return 0;\n\n const cleaned = String(value)\n .trim()\n .replace(/[^0-9]/g, \"\");\n\n return Number(cleaned) || 0;\n};\n","/* eslint-disable quotes */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { safeJsonParse } from \"../../safeJsonParse\";\n\n/** * ***Util Helper for {@link safeJsonParse | `safeJsonParse`}.***\n *\n * @internal\n */\nexport function fixSingleQuotesEscapeBackslash(input: string): string {\n const validEscapes = new Set([\"\\\\\", '\"', \"/\", \"b\", \"f\", \"n\", \"r\", \"t\", \"u\"]);\n\n let output = \"\";\n let inSingleQuote = false;\n let inDoubleQuote = false;\n let escapeNext = false;\n\n for (let i = 0; i < input.length; i++) {\n const c = input[i] || \"\";\n\n if (escapeNext) {\n if (inSingleQuote) {\n if (c === \"'\") {\n output += \"'\";\n } else if (validEscapes.has(c)) {\n if (c === \"\\\\\") {\n output += \"\\\\\\\\\";\n } else if (c === '\"') {\n output += '\\\\\"';\n } else {\n output += \"\\\\\" + c;\n }\n } else {\n output += \"\\\\\\\\\" + c;\n }\n } else if (inDoubleQuote) {\n if (c === '\"') {\n output += '\\\\\"';\n } else if (validEscapes.has(c)) {\n output += \"\\\\\" + c;\n } else {\n output += \"\\\\\\\\\" + c;\n }\n } else {\n output += \"\\\\\" + c;\n }\n escapeNext = false;\n continue;\n }\n\n if (c === \"\\\\\") {\n escapeNext = true;\n continue;\n }\n\n if (!inSingleQuote && !inDoubleQuote) {\n if (c === \"'\") {\n output += '\"';\n inSingleQuote = true;\n continue;\n }\n if (c === '\"') {\n output += '\"';\n inDoubleQuote = true;\n continue;\n }\n } else if (inSingleQuote) {\n if (c === \"'\") {\n output += '\"';\n inSingleQuote = false;\n continue;\n }\n } else if (inDoubleQuote) {\n if (c === '\"') {\n output += '\"';\n inDoubleQuote = false;\n continue;\n }\n }\n\n output += c;\n }\n\n return output;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { IsAny } from \"@rzl-zone/ts-types-plus\";\nimport type { ParseParsedDataOptions } from \"./_private/types/ParseParsedDataOptions\";\nimport type {\n SafeJsonParseResult,\n UnknownValue\n} from \"./_private/types/safeJsonParse\";\n\nimport { isNaN } from \"@/predicates/is/isNaN\";\nimport { isNull } from \"@/predicates/is/isNull\";\nimport { isError } from \"@/predicates/is/isError\";\nimport { isNumber } from \"@/predicates/is/isNumber\";\nimport { isString } from \"@/predicates/is/isString\";\nimport { isNonEmptyString } from \"@/predicates/is/isNonEmptyString\";\n\nimport { cleanParsedData } from \"./cleanParsedData\";\nimport { extractDigits } from \"../numerics/extractDigits\";\nimport { validateJsonParsingOptions } from \"./_private/utils/validateJsonParsingOptions\";\nimport { fixSingleQuotesEscapeBackslash } from \"./_private/utils/fixSingleQuotesEscapeBackslash\";\n\n/** --------------------------------------------------\n * * ***Utility: `safeJsonParse`.***\n * ---------------------------------------------\n * **Safely parses JSON while handling errors and applying transformations.**\n * - **Supports generics** to ensure accurate return type inference.\n * - Always provide both `<TData, TInput>` for best results.\n * - ℹ️ ***Scroll down for full generic behavior explanation.***\n * - Automatically parses valid JSON strings into `objects`, `arrays`, `numbers`, etc.\n * - Supports data transformation via options (e.g., convert strings to `numbers`, `booleans`, or `dates`).\n * - **Returns:**\n * 1. `null` ➔ if input is explicitly `null`.\n * 2. `undefined` ➔ if input is `undefined`, not a `string`, or if parsing fails.\n * 3. Parsed and cleaned result (`TData`) ➔ if input is a valid JSON string.\n * - ⚠️ **JSON.stringify note**:\n * - _If the input JSON string was created using `JSON.stringify()`, any properties with `undefined`\n * values would have been automatically removed or converted to `null` depending on the serializer, example:_\n * ```ts\n * JSON.stringify({ a: undefined, b: 1 }); // ➔ '{\"b\":1}'\n * JSON.parse('{\"a\": undefined, \"b\": 1}') // ❌ invalid JSON\n * ```\n * _Therefore, if you see `undefined` in raw input, it will likely throw unless pre-cleaned or replaced with `null`._\n *\n * ```ts\n * safeJsonParse('{\"name\": \"John\", \"score\": undefined}');\n * // result ➔ { name: \"John\", score: null } <- because `undefined` is not valid JSON, gets replaced to null.\n * ```\n * - ℹ️ **Additionally:**\n * - This function normalizes single quotes (`'`) to double quotes (`\"`) before parsing,\n * so JSON strings using single quotes will be converted to valid JSON format, example:\n * ```ts\n * safeJsonParse(\"{'name': 'John', 'age': 30}\");\n * // result ➔ { name: \"John\", age: 30 }\n *\n * safeJsonParse(\"{'string\\\\'s': 'abc', \\\"quote's\\\": 'It\\\\'s awesome!', 'aNumber\\\\'s': 123, 'keyWith\\\\'Backslash\\\\'s': 'value\\\\'s'}\");\n * // result ➔ { \"string's\": \"abc\", \"quote's\": \"It's awesome!\", \"aNumber's\": 123, \"keyWith'Backslash's\": \"value's\" }\n * ```\n * @template TData - The expected output type after parsing and cleaning.\n * @template TInput - The input value type, used for advanced type inference and return typing.\n * @param {TInput} [value] - The JSON string or value to parse.\n * @param {ParseParsedDataOptions} [options] - Options to clean, convert types, enable strict mode,\n * support custom date formats, enable logging, or handle errors via callback.\n * @returns {SafeJsonParseResult<TData, TInput>} Parsed and optionally cleaned result, or `null`/`undefined`.\n * @throws **{@link TypeError | `TypeError`}** if `options` is provided but not a valid object.\n * @example\n * 1. ***Basic parse with number & boolean conversion:***\n * ```ts\n * const result = safeJsonParse(30);\n * // result ➔ undefined\n * const result = safeJsonParse(30, {\n * convertNumbers: true\n * });\n * // result ➔ 30\n *\n * const result = safeJsonParse('{\"age\": \"30\", \"isActive\": \"true\"}', {\n * convertNumbers: true,\n * convertBooleans: true\n * });\n * // result ➔ { age: 30, isActive: true }\n * ```\n * 2. ***Handling `undefined` in input string (manually written, not JSON.stringify):***\n * ```ts\n * const result = safeJsonParse('{\"score\": undefined}');\n * // result ➔ { score: null } <- because `undefined` is not valid JSON, gets replaced\n * ```\n *\n * 3. ***Handling `NaN` in input string (manually written, not JSON.stringify):***\n * ```ts\n * const value = NaN; // <- value is NaN or \"NaN\";\n * const result = safeJsonParse(value);\n * // result ➔ undefined <- will return as undefined, because options `convertNaN` is false (default),\n * const result2 = safeJsonParse(value, { convertNaN: true });\n * // result2 ➔ NaN <- will return as undefined because options `convertNaN` is false,\n *\n * const result4 = safeJsonParse('{\"strNan\": \"NaN\", \"pureNan\": NaN}');\n * // NaN will convert to string (NaN ➔ \"NaN\") because options `convertNaN` is false (default),\n * // result4 ➔ { strNan: \"NaN\", pureNan: \"NaN\" }\n *\n * const result3 = safeJsonParse('{\"strNan\": \"NaN\", \"pureNan\": NaN}', {\n * convertNaN: true\n * });\n * // String \"NaN\" will convert to NaN (\"NaN\" ➔ NaN) because options `convertNaN` is true,\n * // result3 ➔ { strNan: NaN, pureNan: NaN }\n * ```\n *\n * 4. ***Strict mode (removes invalid values):***\n * ```ts\n * const result = safeJsonParse('{\"name\": \" \", \"score\": \"99abc\"}', {\n * convertNumbers: true,\n * strictMode: true\n * });\n * // result ➔ {}\n *\n * const result2 = safeJsonParse('{\"name\": \" \", \"score\": undefined}');\n * // result2 ➔ { name: \"\",score: null }\n * ```\n *\n * 5. ***Custom date format parsing:***\n * ```ts\n * const result = safeJsonParse('{\"birthday\": \"25/12/2000\"}', {\n * convertDates: true,\n * customDateFormats: [\"DD/MM/YYYY\"]\n * });\n * // result ➔ { birthday: new Date(\"2000-12-25T00:00:00.000Z\") }\n * ```\n *\n * 6. ***Invalid JSON with custom error handling:***\n * ```ts\n * safeJsonParse(\"{invalid}\", {\n * loggingOnFail: true,\n * onError: (err) => console.log(\"Custom handler:\", err.message)\n * });\n * // ➔ Logs parsing error and invokes handler\n * ```\n *\n * 7. ***Null or non-string input returns null/undefined (default options):***\n * ```ts\n * safeJsonParse(123); // ➔ undefined\n * safeJsonParse(null); // ➔ null\n * safeJsonParse(undefined); // ➔ undefined\n * ```\n *\n * 8. ***Generic usage: Provide both output and input type to ensure correct return typing:***\n * ```ts\n * type UserType = { name: string };\n *\n * const obj = JSON.stringify({\n * name: \"John\"\n * });\n *\n * const toParse = isAuth() ? obj : null;\n * const toParse2 = isAuth() ? obj : undefined;\n *\n * // * `Without Generic`:\n * const parsed = safeJsonParse(toParse);\n * //- runtime: { name: \"John\" } | undefined | null\n * //- type: Record<string, unknown> | undefined | null\n * const parsed2 = safeJsonParse(toParse);\n * //- runtime: { name: \"John\" } | undefined\n * //- type: Record<string, unknown> | undefined\n *\n * // * `With Generic`:\n * const parsed = safeJsonParse<UserType>(toParse);\n * //- runtime: { name: \"John\" } | undefined | null\n * //- type: undefined <- (⚠️ unexpected!)\n * const parsed2 = safeJsonParse<UserType>(toParse);\n * //- runtime: { name: \"John\" } | undefined\n * //- type: undefined <- (⚠️ unexpected!)\n * const parsed = safeJsonParse<UserType, typeof toParse>(toParse);\n * //- runtime: { name: \"John\" } | null | undefined\n * //- type: UserType | null | undefined\n * const parsed2 = safeJsonParse<UserType, typeof toParse>(toParse);\n * //- runtime: { name: \"John\" } | undefined\n * //- type: UserType | undefined\n * ```\n * @note\n * ⚠️ **Generic Behavior:**\n * - This function supports advanced generic inference for clean, type-safe return values.\n * - If only the first generic (`TData`) is provided and the second (`TInput`) is omitted,\n * then `TInput` defaults to `undefined`, resulting in a return type of `undefined`.\n * - To ensure correct return typing, **always pass both generics** when `value` is dynamic,\n * nullable, or unioned: `safeJsonParse<TData, typeof value>(value)`.\n * - This makes the returned type exactly match your expectation: `TData | null | undefined`.\n */\nexport function safeJsonParse<\n TData extends Record<string, any> = Record<string, unknown>,\n TInput extends UnknownValue = UnknownValue\n>(\n value: TInput,\n options?: ParseParsedDataOptions\n): IsAny<TInput> extends true ? TData | null | undefined : undefined;\nexport function safeJsonParse<\n TData extends Record<string, any> = Record<string, unknown>,\n TInput extends string | null | undefined | unknown = undefined\n>(\n value: TInput,\n options?: ParseParsedDataOptions\n): SafeJsonParseResult<TData, TInput>;\n//! implement main function\nexport function safeJsonParse<TData extends Record<string, unknown>>(\n value: unknown,\n options: ParseParsedDataOptions = {}\n) {\n if (isNull(value)) return null;\n const validOptions = validateJsonParsingOptions(options);\n\n if (\n validOptions.convertNaN &&\n (isNaN(value) || (isNonEmptyString(value) && value === \"NaN\"))\n ) {\n return NaN;\n }\n if (\n validOptions.convertNumbers &&\n !isNaN(Number(value)) &&\n isNumber(extractDigits(value))\n ) {\n return Number(value);\n }\n\n if (!isString(value)) return undefined;\n\n try {\n // First, normalize all single quotes to double quotes\n let normalized = fixSingleQuotesEscapeBackslash(value);\n\n if (validOptions.removeUndefined) {\n normalized = normalized\n .replace(/,\\s*\"[^\"]*\"\\s*:\\s*undefined(?=\\s*[},])/g, \"\")\n // ➔ remove , \"key\": undefined\n .replace(/\"[^\"]*\"\\s*:\\s*undefined\\s*(,)?/g, \"\");\n // ➔ remove \"key\": undefined\n } else {\n normalized = normalized.replace(/:\\s*undefined(?=\\s*[,}])/g, \":null\");\n // ➔ replace :undefined with :null\n }\n\n if (validOptions.convertNaN) {\n // eslint-disable-next-line quotes\n normalized = normalized.replace(/:\\s*NaN(?=\\s*[,}])/g, ':\"NaN\"');\n // ➔ convert :NaN to :\"NaN\"\n } else {\n normalized = normalized\n // eslint-disable-next-line quotes\n .replace(/:\\s*NaN(?=\\s*[,}])/g, ':\"NaN\"')\n // ➔ convert :NaN to :\"NaN\"\n .replace(/,\\s*\"[^\"]*\"\\s*:\\s*NaN(?=\\s*[},])/g, \"\")\n // ➔ remove , \"key\": NaN\n .replace(/\"[^\"]*\"\\s*:\\s*NaN\\s*(,)?/g, \"\");\n // ➔ remove \"key\": NaN\n }\n\n normalized = normalized.replace(/,(\\s*[}\\]])/g, \"$1\");\n // ➔ remove trailing comma before } or ]\n\n const parsed = JSON.parse(normalized);\n return cleanParsedData<TData>(parsed, validOptions);\n } catch (error) {\n if (validOptions.loggingOnFail) {\n console.error(\"Failed to parsing at `safeJsonParse`:\", error);\n }\n\n validOptions.onError(\n isError(error)\n ? new Error(error.message.replace(/^JSON\\.parse:/, \"Failed to parsing\"))\n : new Error(String(error))\n );\n\n return undefined;\n }\n}\n"],"mappings":"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"}
@@ -2,14 +2,14 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.13.0-beta.2`
5
+ * Version: `3.13.0`
6
6
  * Author: `Rizalvin Dwiky <rizalvindwiky@gmail.com>`
7
7
  * Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/utils-js`
8
8
  * ========================================================================
9
9
  */
10
10
  "use strict";
11
- const require_assertIsBoolean = require('./assertIsBoolean-amRiJHnh.cjs');
12
- const require_isBigInt = require('./isBigInt-CIFRnsdx.cjs');
11
+ const require_assertIsBoolean = require('./assertIsBoolean-JGpkg5ju.cjs');
12
+ const require_isBigInt = require('./isBigInt-C0gHDkh4.cjs');
13
13
  function isMap(value) {
14
14
  return Object.prototype.toString.call(value) === "[object Map]" || value instanceof Map;
15
15
  }
@@ -103,4 +103,4 @@ Object.defineProperty(exports, 'safeStableStringify', {
103
103
  return safeStableStringify;
104
104
  }
105
105
  });
106
- //# sourceMappingURL=safeStableStringify-DRYQ56Dg.cjs.map
106
+ //# sourceMappingURL=safeStableStringify-BiUOLBYo.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"safeStableStringify-DRYQ56Dg.cjs","names":["isPlainObject","isBoolean","isNaN","hasOwnProp","isBoolean","getPreciseType","isUndefined","isNull","isObjectOrArray","isFunction","isNumberObject","isNaN","isInfinityNumber","isStringObject","isBooleanObject","isSymbol","isBigInt","isSet","isArray","isNumber","isObject"],"sources":["../src/predicates/is/isMap.ts","../src/predicates/is/isDate.ts","../src/conversions/stringify/safeStableStringify.ts"],"sourcesContent":["/** --------------------------------------------------\n * * ***Type guard: `isMap`.***\n * ----------------------------------------------------------\n * **Checks whether the given value is a **[`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) object**.**\n * - **Behavior:**\n * - Ensures that the provided value is an instance of **[`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map)**.\n * - Useful in TypeScript for narrowing types when working with collections.\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is instance of **[`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map)**, else `false`.\n * @example\n * isMap(new Map());\n * // ➔ true\n * isMap(new WeakMap());\n * // ➔ false\n * isMap({});\n * // ➔ false\n */\nexport function isMap<K = unknown, V = unknown>(\n value: Map<K, V>\n): value is Map<K, V>;\nexport function isMap(value: unknown): value is Map<unknown, unknown>;\nexport function isMap(value: unknown): boolean {\n return (\n Object.prototype.toString.call(value) === \"[object Map]\" ||\n value instanceof Map\n );\n}\n","import { assertIsPlainObject } from \"@/assertions/objects/assertIsPlainObject\";\n\nimport { isNaN } from \"./isNaN\";\nimport { isPlainObject } from \"./isPlainObject\";\nimport { isBoolean } from \"./isBoolean\";\n\ntype isDateOptions = {\n /** * ***Skip the validity check (`!isNaN(date.getTime())`).***\n *\n * When `true`, the function only checks that the value is an\n * instance of `Date` without verifying that it represents a valid\n * date value, default: `false`.\n *\n * @default false\n */\n skipInvalidDate?: boolean;\n};\n\n/** ----------------------------------------------------------\n * * ***Type guard: `isDate`.***\n * ----------------------------------------------------------\n * **Determines whether the given `value` is a real, valid JavaScript\n * **[`Date`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)** object.**\n * - **Behavior:**\n * - Returns **true** only if:\n * - `value` is an instance of `Date`.\n * - and, unless `options.skipInvalidDate` is `true`,\n * the underlying time value is valid (`!isNaN(value.getTime())`).\n * - Returns **false** for:\n * - non-Date values (strings, numbers, etc.).\n * - `Date` instances that represent an invalid time value\n * (e.g. `new Date(\"bad\")`), unless skipping is enabled.\n * @param {*} value - The value to check.\n * @param {isDateOptions} [options] - Optional settings.\n * @returns {boolean} Return `true` if value is a valid Date object.\n * @example\n * isDate(new Date());\n * // ➜ true\n * isDate(new Date(\"invalid\"));\n * // ➜ false\n * isDate(\"2024-01-01\");\n * // ➜ false\n *\n * // Skipping validity check:\n * isDate(new Date(\"invalid\"), { skipInvalidDate: true });\n * // ➜ true\n */\nexport const isDate = (\n value: unknown,\n options: isDateOptions = {}\n): value is Date => {\n assertIsPlainObject(options, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`options\\`) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const skipInvalidDate =\n isPlainObject(options) && isBoolean(options.skipInvalidDate)\n ? options.skipInvalidDate\n : false;\n\n const instanceDate = value instanceof Date;\n\n if (skipInvalidDate) return instanceDate;\n return instanceDate && !isNaN(value.getTime());\n};\n","import { assertIsPlainObject } from \"@/assertions/objects/assertIsPlainObject\";\n\nimport { isSet } from \"@/predicates/is/isSet\";\nimport { isMap } from \"@/predicates/is/isMap\";\nimport { isNaN } from \"@/predicates/is/isNaN\";\nimport { isDate } from \"@/predicates/is/isDate\";\nimport { isNull } from \"@/predicates/is/isNull\";\nimport { isArray } from \"@/predicates/is/isArray\";\nimport { isSymbol } from \"@/predicates/is/isSymbol\";\nimport { isNumber } from \"@/predicates/is/isNumber\";\nimport { isObject } from \"@/predicates/is/isObject\";\nimport { isBigInt } from \"@/predicates/is/isBigInt\";\nimport { isBoolean } from \"@/predicates/is/isBoolean\";\nimport { isFunction } from \"@/predicates/is/isFunction\";\nimport { hasOwnProp } from \"@/predicates/has/hasOwnProp\";\nimport { isUndefined } from \"@/predicates/is/isUndefined\";\nimport { isNumberObject } from \"@/predicates/is/isNumberObject\";\nimport { isStringObject } from \"@/predicates/is/isStringObject\";\nimport { isBooleanObject } from \"@/predicates/is/isBooleanObject\";\nimport { isObjectOrArray } from \"@/predicates/is/isObjectOrArray\";\nimport { getPreciseType } from \"@/predicates/type/getPreciseType\";\nimport { isInfinityNumber } from \"@/predicates/is/isInfinityNumber\";\n\n/** -------------------------------------------------\n * * ***Type Options for **{@link safeStableStringify | `safeStableStringify`}**.***\n * -------------------------------------------------\n */\ntype SafeStableStringifyOptions = {\n /** -------------------------------------------------\n * * ***Whether to sort **object keys** alphabetically (recursively).***\n * -------------------------------------------------\n *\n * - `true` (default): object keys are sorted to ensure stable output.\n * - `false`: preserves original insertion order of keys.\n *\n * @default true\n */\n sortKeys?: boolean;\n /** -------------------------------------------------\n * * ***Whether to sort **primitive values inside arrays**.***\n * -------------------------------------------------\n *\n * - `true`: primitive values in arrays are sorted to ensure stable output.\n * - `false` (default): arrays retain their original order; objects and nested arrays are not reordered.\n *\n * @default false\n */\n sortArray?: boolean;\n /** -------------------------------------------------\n * * ***Whether to pretty-print JSON output with 2-space indentation.***\n * -------------------------------------------------\n *\n * - `true`: output is formatted with indentation and newlines.\n * - `false` (default): produces compact single-line JSON.\n *\n * @default false\n */\n pretty?: boolean;\n /** -------------------------------------------------\n * * ***Preserve `undefined` values instead of converting them to `null`.***\n * -------------------------------------------------\n * **Controls how the internal `deepProcess` step rewrites values\n * **before** the final `JSON.stringify` call.**\n * - **Default (`false`):**\n * * Every `undefined` value (object properties **and** array elements)\n * is replaced with `null` **before** serialization, because this happens\n * first, the key is **not removed** by `JSON.stringify`.\n * - **`true`** – Leaves `undefined` untouched so the final\n * `JSON.stringify` call behaves natively:\n * * Object properties with `undefined` are **removed**.\n * * Array elements that are `undefined` become `null`.\n * @default false\n * @example\n * // ✅ keepUndefined = true: behaves like native JSON.stringify\n * safeStableStringify({ a: undefined }, { keepUndefined: true });\n * // ➔ '{}' // key removed\n *\n * // ✅ Default (false): convert undefined to null, key kept\n * safeStableStringify({ a: undefined });\n * // ➔ '{\"a\":null}' // key present, value null\n *\n * // Arrays\n * safeStableStringify([undefined]);\n * // ➔ '[null]' // same, but via pre-replacement\n * safeStableStringify([undefined], { keepUndefined: true });\n * // ➔ '[null]' // element becomes null\n */\n keepUndefined?: boolean;\n};\n\n/** --------------------------------------------\n * * ***Utility: `safeStableStringify`.***\n * ---------------------------------------------\n * **Safely converts a JavaScript value into a stable, JSON-compatible string.**\n * - **This function is an enhanced version of `JSON.stringify` with additional guarantees:**\n * - ***Features:***\n * - Recursively sorts object keys **only if** `sortKeys` is `true` (default: `true`), to ensure stable\n * key order.\n * - If `sortKeys` is `false`, preserves the original insertion order of object keys.\n * - Optionally sorts array primitive values **only if** `sortArray` is `true` (default: `false`).\n * - Only primitive values in arrays are sorted.\n * - Objects and nested arrays keep their original position and are appended after sorted primitives.\n * - If `sortArray` is `false`, arrays retain their original order.\n * - Converts JavaScript special values for JSON safety:\n * - `undefined`, `NaN`, `Infinity`, `-Infinity` ➔ `null`.\n * - `BigInt` ➔ string (JSON does not support BigInt).\n * - Converts boxed primitives box into their primitive equivalents:\n * - `new Number(42)` ➔ `Number(42)` ➔ `42`.\n * - `new String(\"hi\")` ➔ `String(\"hi\")` ➔ `\"hi\"`.\n * - `new Boolean(true)` ➔ `Boolean(true)` ➔ `true`.\n * - Functions and Symbols are removed.\n * - Circular references are replaced with the string `\"[Circular]\"`.\n * - Serializes:\n * - `Date` ➔ ISO string (`date.toISOString()`).\n * - `Set` ➔ `{ set: [values...] }` (values are recursively processed).\n * - `Map` ➔ `{ map: [ [key, value], ... ] }` (values are recursively processed).\n * - Compared to `JSON.stringify`, this ensures **stable output**:\n * - Same object structure always produces the same string.\n * - Useful for deep equality checks, hashing, caching keys, or snapshot tests.\n * - Controls how `undefined` is handled **before** the final `JSON.stringify` call, by `keepUndefined`\n * options, default: `false`.\n * - **false**: All `undefined` values (object properties and array elements) are replaced\n * with `null`, so object keys remain.\n * - **true**: Leaves `undefined` values as-is, and handling by native `JSON.stringify` then:\n * 1. Removes object properties that are `undefined`.\n * 2. Converts `undefined` array elements to `null`.\n * - Use `true` when you need native removal of keys or to preserve sparse arrays\n * exactly as `JSON.stringify` would.\n * @param {*} value\n * ***Any JavaScript value to serialize, can be:***\n * - Primitives (`number`, `string`, `boolean`, `bigint`, `null`, `undefined`).\n * - Boxed primitives (`new Number()`, `new String()`, `new Boolean()`).\n * - Arrays, plain objects, nested structures.\n * - Date, Map, Set.\n * - Circular structures.\n * @param {SafeStableStringifyOptions} [options]\n * ***Configuration options for `safeStableStringify`:***\n * - `keepUndefined` (boolean) – Control how `undefined` is handled **before** the final `JSON.stringify`\n * call, default: `false`.\n * - `sortKeys` (boolean) – Whether to sort object keys alphabetically (recursively), default: `true`.\n * - `sortArray` (boolean) – Whether to sort primitive values inside arrays, default: `false`.\n * - `pretty` (boolean) – Whether to pretty-print JSON output with 2-space indentation, default: `false`.\n * @returns {string}\n * A stable JSON string representation of the input value.\n * @throws **{@link TypeError | `TypeError`}** if `sortKeys`, `sortArray`, or `pretty` are not strictly boolean.\n * @example\n * ```ts\n * // Basic object key sorting\n * safeStableStringify({ b: 2, a: 1 });\n * // ➔ '{\"a\":1,\"b\":2}'\n *\n * // Disable key sorting (preserve insertion order)\n * safeStableStringify({ b: 2, a: 1 }, {\n * sortKeys:false\n * });\n * // ➔ '{\"b\":2,\"a\":1}'\n *\n * // Sorting arrays with sortArray\n * safeStableStringify([3, 1, 2], {\n * sortArray:true\n * });\n * // ➔ '[1,2,3]'\n *\n * // keepUndefined = true (native removal of keys)\n * safeStableStringify({ a: undefined }, { keepUndefined: true });\n * // ➔ '{}' // key `a` is removed, like native JSON.stringify\n *\n * // Default keepUndefined = false (convert to null, keep key)\n * safeStableStringify({ a: undefined });\n * // ➔ '{\"a\":null}'\n *\n * // Nested object + sortArray=true\n * safeStableStringify({ z: [3, 1, 2], x: { d: 4, c: 3 } }, {\n * sortKeys:true,\n * sortArray:true\n * });\n * // ➔ '{\"x\":{\"c\":3,\"d\":4},\"z\":[1,2,3]}'\n *\n * // sortKeys=false and sortArray=true\n * safeStableStringify({ z: [3, 1, 2], x: { d: 4, c: 3 } }, {\n * sortKeys:false,\n * sortArray:true\n * });\n * // ➔ '{\"z\":[1,2,3],\"x\":{\"d\":4,\"c\":3}}'\n *\n * // Pretty print output\n * safeStableStringify([3, 1, 2], {\n * sortArray:true,\n * pretty:true\n * });\n * // ➔ `[\n * // 1,\n * // 2,\n * // 3\n * // ]`\n *\n * // Boxed primitives converted to primitive\n * safeStableStringify({ n: new Number(42), s: new String(\"hi\"), b: new Boolean(true) });\n * // ➔ '{\"n\":42,\"s\":\"hi\",\"b\":true}'\n *\n * // Handles Date, BigInt, Map and Set\n * safeStableStringify({\n * time: new Date(\"2025-01-01\"),\n * big: BigInt(9007199254740991),\n * data: new Map([[\"key\", new Set([1, 2])]])\n * });\n * // ➔ '{\"big\":\"9007199254740991\",\"data\":{\"map\":[[\"key\",{\"set\":[1,2]}]]},\"time\":\"2025-01-01T00:00:00.000Z\"}'\n *\n * // Functions and symbols are removed\n * safeStableStringify({ f: () => {}, s: Symbol(\"wow\") });\n * // ➔ '{}'\n *\n * // undefined, NaN, Infinity convert to null (keepUndefined = false or keepUndefined = true)\n * safeStableStringify([undefined, NaN, Infinity, -Infinity]);\n * // ➔ '[null,null,null,null]'\n *\n * // Circular reference\n * const obj = { name: \"A\" };\n * obj.self = obj;\n * safeStableStringify(obj);\n * // ➔ '{\"name\":\"A\",\"self\":\"[Circular]\"}'\n *\n * // Complex nested sortArray with objects\n * const arr = [9, 7, [4, 2, 3], { z: [5, 1, 6] }];\n * safeStableStringify(arr, { sortArray: true, sortKeys: true });\n * // ➔ '[7,9,[2,3,4],{\"z\":[1,5,6]}]'\n * ```\n */\nexport const safeStableStringify = (\n value: unknown,\n options: SafeStableStringifyOptions = {}\n): string => {\n assertIsPlainObject(options, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`options\\`) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const pretty = hasOwnProp(options, \"pretty\") ? options.pretty : false;\n const sortKeys = hasOwnProp(options, \"sortKeys\") ? options.sortKeys : true;\n const sortArray = hasOwnProp(options, \"sortArray\")\n ? options.sortArray\n : false;\n const keepUndefined = hasOwnProp(options, \"keepUndefined\")\n ? options.keepUndefined\n : false;\n\n if (\n !isBoolean(sortKeys) ||\n !isBoolean(sortArray) ||\n !isBoolean(pretty) ||\n !isBoolean(keepUndefined)\n ) {\n throw new TypeError(\n `Parameters \\`sortKeys\\`, \\`sortArray\\`, \\`keepUndefined\\` and \\`pretty\\` property of the \\`options\\` (second parameter) must be of type \\`boolean\\`, but received: \"['sortKeys': \\`${getPreciseType(\n sortKeys\n )}\\`, 'sortArray': \\`${getPreciseType(\n sortArray\n )}\\`, 'keepUndefined': \\`${getPreciseType(\n keepUndefined\n )}\\`, 'pretty': \\`${getPreciseType(pretty)}\\`]\".`\n );\n }\n\n if (isUndefined(value)) {\n return keepUndefined ? \"undefined\" : \"null\";\n }\n\n const seen = new WeakSet();\n\n const isPrimitive = (val: unknown): boolean =>\n isNull(val) || (!isObjectOrArray(val) && !isFunction(val));\n\n const deepProcess = (val: unknown): unknown => {\n if (isNumberObject(val)) {\n const valOf = val.valueOf();\n return isNaN(valOf) || isInfinityNumber(valOf) ? null : valOf;\n }\n if (isStringObject(val)) return val.valueOf();\n if (isBooleanObject(val)) return val.valueOf();\n if (isFunction(val) || isSymbol(val)) return undefined;\n if (isBigInt(val)) return val.toString();\n if (isNaN(val) || isInfinityNumber(val)) return null;\n if (isUndefined(val)) {\n return keepUndefined ? undefined : null;\n }\n\n if (isObjectOrArray(val)) {\n if (seen.has(val)) return \"[Circular]\";\n seen.add(val);\n\n if (isDate(val)) return val.toISOString();\n if (isMap(val)) {\n return {\n map: Array.from(val.entries()).map(([k, v]) => [k, deepProcess(v)])\n };\n }\n if (isSet(val)) return { set: Array.from(val.values()).map(deepProcess) };\n\n if (isArray(val)) {\n const processedArr = val.map(deepProcess);\n if (sortArray) {\n const primitives: unknown[] = [];\n const nonPrimitives: unknown[] = [];\n\n for (const item of processedArr) {\n if (isPrimitive(item)) primitives.push(item);\n else nonPrimitives.push(item);\n }\n primitives.sort((a, b) => {\n if (isNumber(a) && isNumber(b)) return a - b;\n return String(a).localeCompare(String(b));\n });\n return [...primitives, ...nonPrimitives];\n }\n return processedArr;\n }\n\n const keys = Object.keys(val);\n if (sortKeys) {\n keys.sort((a, b) => {\n const na = Number(a);\n const nb = Number(b);\n if (!isNaN(na) && !isNaN(nb)) return na - nb;\n return a.localeCompare(b);\n });\n }\n\n const result: Record<string, unknown> = {};\n\n if (isObject(val)) {\n for (const k of keys) {\n const v = deepProcess(val[k]);\n if (!isUndefined(v)) result[k] = v;\n }\n }\n\n return result;\n }\n\n return val;\n };\n\n try {\n return JSON.stringify(deepProcess(value), null, pretty ? 2 : 0);\n } catch (err) {\n console.warn(\"Error in safeStableStringify:\", err);\n return \"{}\";\n }\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"safeStableStringify-BiUOLBYo.cjs","names":["isPlainObject","isBoolean","isNaN","hasOwnProp","isBoolean","getPreciseType","isUndefined","isNull","isObjectOrArray","isFunction","isNumberObject","isNaN","isInfinityNumber","isStringObject","isBooleanObject","isSymbol","isBigInt","isSet","isArray","isNumber","isObject"],"sources":["../src/predicates/is/isMap.ts","../src/predicates/is/isDate.ts","../src/conversions/stringify/safeStableStringify.ts"],"sourcesContent":["/** --------------------------------------------------\n * * ***Type guard: `isMap`.***\n * ----------------------------------------------------------\n * **Checks whether the given value is a **[`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) object**.**\n * - **Behavior:**\n * - Ensures that the provided value is an instance of **[`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map)**.\n * - Useful in TypeScript for narrowing types when working with collections.\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is instance of **[`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map)**, else `false`.\n * @example\n * isMap(new Map());\n * // ➔ true\n * isMap(new WeakMap());\n * // ➔ false\n * isMap({});\n * // ➔ false\n */\nexport function isMap<K = unknown, V = unknown>(\n value: Map<K, V>\n): value is Map<K, V>;\nexport function isMap(value: unknown): value is Map<unknown, unknown>;\nexport function isMap(value: unknown): boolean {\n return (\n Object.prototype.toString.call(value) === \"[object Map]\" ||\n value instanceof Map\n );\n}\n","import { assertIsPlainObject } from \"@/assertions/objects/assertIsPlainObject\";\n\nimport { isNaN } from \"./isNaN\";\nimport { isPlainObject } from \"./isPlainObject\";\nimport { isBoolean } from \"./isBoolean\";\n\ntype isDateOptions = {\n /** * ***Skip the validity check (`!isNaN(date.getTime())`).***\n *\n * When `true`, the function only checks that the value is an\n * instance of `Date` without verifying that it represents a valid\n * date value, default: `false`.\n *\n * @default false\n */\n skipInvalidDate?: boolean;\n};\n\n/** ----------------------------------------------------------\n * * ***Type guard: `isDate`.***\n * ----------------------------------------------------------\n * **Determines whether the given `value` is a real, valid JavaScript\n * **[`Date`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)** object.**\n * - **Behavior:**\n * - Returns **true** only if:\n * - `value` is an instance of `Date`.\n * - and, unless `options.skipInvalidDate` is `true`,\n * the underlying time value is valid (`!isNaN(value.getTime())`).\n * - Returns **false** for:\n * - non-Date values (strings, numbers, etc.).\n * - `Date` instances that represent an invalid time value\n * (e.g. `new Date(\"bad\")`), unless skipping is enabled.\n * @param {*} value - The value to check.\n * @param {isDateOptions} [options] - Optional settings.\n * @returns {boolean} Return `true` if value is a valid Date object.\n * @example\n * isDate(new Date());\n * // ➜ true\n * isDate(new Date(\"invalid\"));\n * // ➜ false\n * isDate(\"2024-01-01\");\n * // ➜ false\n *\n * // Skipping validity check:\n * isDate(new Date(\"invalid\"), { skipInvalidDate: true });\n * // ➜ true\n */\nexport const isDate = (\n value: unknown,\n options: isDateOptions = {}\n): value is Date => {\n assertIsPlainObject(options, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`options\\`) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const skipInvalidDate =\n isPlainObject(options) && isBoolean(options.skipInvalidDate)\n ? options.skipInvalidDate\n : false;\n\n const instanceDate = value instanceof Date;\n\n if (skipInvalidDate) return instanceDate;\n return instanceDate && !isNaN(value.getTime());\n};\n","import { assertIsPlainObject } from \"@/assertions/objects/assertIsPlainObject\";\n\nimport { isSet } from \"@/predicates/is/isSet\";\nimport { isMap } from \"@/predicates/is/isMap\";\nimport { isNaN } from \"@/predicates/is/isNaN\";\nimport { isDate } from \"@/predicates/is/isDate\";\nimport { isNull } from \"@/predicates/is/isNull\";\nimport { isArray } from \"@/predicates/is/isArray\";\nimport { isSymbol } from \"@/predicates/is/isSymbol\";\nimport { isNumber } from \"@/predicates/is/isNumber\";\nimport { isObject } from \"@/predicates/is/isObject\";\nimport { isBigInt } from \"@/predicates/is/isBigInt\";\nimport { isBoolean } from \"@/predicates/is/isBoolean\";\nimport { isFunction } from \"@/predicates/is/isFunction\";\nimport { hasOwnProp } from \"@/predicates/has/hasOwnProp\";\nimport { isUndefined } from \"@/predicates/is/isUndefined\";\nimport { isNumberObject } from \"@/predicates/is/isNumberObject\";\nimport { isStringObject } from \"@/predicates/is/isStringObject\";\nimport { isBooleanObject } from \"@/predicates/is/isBooleanObject\";\nimport { isObjectOrArray } from \"@/predicates/is/isObjectOrArray\";\nimport { getPreciseType } from \"@/predicates/type/getPreciseType\";\nimport { isInfinityNumber } from \"@/predicates/is/isInfinityNumber\";\n\n/** -------------------------------------------------\n * * ***Type Options for **{@link safeStableStringify | `safeStableStringify`}**.***\n * -------------------------------------------------\n */\ntype SafeStableStringifyOptions = {\n /** -------------------------------------------------\n * * ***Whether to sort **object keys** alphabetically (recursively).***\n * -------------------------------------------------\n *\n * - `true` (default): object keys are sorted to ensure stable output.\n * - `false`: preserves original insertion order of keys.\n *\n * @default true\n */\n sortKeys?: boolean;\n /** -------------------------------------------------\n * * ***Whether to sort **primitive values inside arrays**.***\n * -------------------------------------------------\n *\n * - `true`: primitive values in arrays are sorted to ensure stable output.\n * - `false` (default): arrays retain their original order; objects and nested arrays are not reordered.\n *\n * @default false\n */\n sortArray?: boolean;\n /** -------------------------------------------------\n * * ***Whether to pretty-print JSON output with 2-space indentation.***\n * -------------------------------------------------\n *\n * - `true`: output is formatted with indentation and newlines.\n * - `false` (default): produces compact single-line JSON.\n *\n * @default false\n */\n pretty?: boolean;\n /** -------------------------------------------------\n * * ***Preserve `undefined` values instead of converting them to `null`.***\n * -------------------------------------------------\n * **Controls how the internal `deepProcess` step rewrites values\n * **before** the final `JSON.stringify` call.**\n * - **Default (`false`):**\n * * Every `undefined` value (object properties **and** array elements)\n * is replaced with `null` **before** serialization, because this happens\n * first, the key is **not removed** by `JSON.stringify`.\n * - **`true`** – Leaves `undefined` untouched so the final\n * `JSON.stringify` call behaves natively:\n * * Object properties with `undefined` are **removed**.\n * * Array elements that are `undefined` become `null`.\n * @default false\n * @example\n * // ✅ keepUndefined = true: behaves like native JSON.stringify\n * safeStableStringify({ a: undefined }, { keepUndefined: true });\n * // ➔ '{}' // key removed\n *\n * // ✅ Default (false): convert undefined to null, key kept\n * safeStableStringify({ a: undefined });\n * // ➔ '{\"a\":null}' // key present, value null\n *\n * // Arrays\n * safeStableStringify([undefined]);\n * // ➔ '[null]' // same, but via pre-replacement\n * safeStableStringify([undefined], { keepUndefined: true });\n * // ➔ '[null]' // element becomes null\n */\n keepUndefined?: boolean;\n};\n\n/** --------------------------------------------\n * * ***Utility: `safeStableStringify`.***\n * ---------------------------------------------\n * **Safely converts a JavaScript value into a stable, JSON-compatible string.**\n * - **This function is an enhanced version of `JSON.stringify` with additional guarantees:**\n * - ***Features:***\n * - Recursively sorts object keys **only if** `sortKeys` is `true` (default: `true`), to ensure stable\n * key order.\n * - If `sortKeys` is `false`, preserves the original insertion order of object keys.\n * - Optionally sorts array primitive values **only if** `sortArray` is `true` (default: `false`).\n * - Only primitive values in arrays are sorted.\n * - Objects and nested arrays keep their original position and are appended after sorted primitives.\n * - If `sortArray` is `false`, arrays retain their original order.\n * - Converts JavaScript special values for JSON safety:\n * - `undefined`, `NaN`, `Infinity`, `-Infinity` ➔ `null`.\n * - `BigInt` ➔ string (JSON does not support BigInt).\n * - Converts boxed primitives box into their primitive equivalents:\n * - `new Number(42)` ➔ `Number(42)` ➔ `42`.\n * - `new String(\"hi\")` ➔ `String(\"hi\")` ➔ `\"hi\"`.\n * - `new Boolean(true)` ➔ `Boolean(true)` ➔ `true`.\n * - Functions and Symbols are removed.\n * - Circular references are replaced with the string `\"[Circular]\"`.\n * - Serializes:\n * - `Date` ➔ ISO string (`date.toISOString()`).\n * - `Set` ➔ `{ set: [values...] }` (values are recursively processed).\n * - `Map` ➔ `{ map: [ [key, value], ... ] }` (values are recursively processed).\n * - Compared to `JSON.stringify`, this ensures **stable output**:\n * - Same object structure always produces the same string.\n * - Useful for deep equality checks, hashing, caching keys, or snapshot tests.\n * - Controls how `undefined` is handled **before** the final `JSON.stringify` call, by `keepUndefined`\n * options, default: `false`.\n * - **false**: All `undefined` values (object properties and array elements) are replaced\n * with `null`, so object keys remain.\n * - **true**: Leaves `undefined` values as-is, and handling by native `JSON.stringify` then:\n * 1. Removes object properties that are `undefined`.\n * 2. Converts `undefined` array elements to `null`.\n * - Use `true` when you need native removal of keys or to preserve sparse arrays\n * exactly as `JSON.stringify` would.\n * @param {*} value\n * ***Any JavaScript value to serialize, can be:***\n * - Primitives (`number`, `string`, `boolean`, `bigint`, `null`, `undefined`).\n * - Boxed primitives (`new Number()`, `new String()`, `new Boolean()`).\n * - Arrays, plain objects, nested structures.\n * - Date, Map, Set.\n * - Circular structures.\n * @param {SafeStableStringifyOptions} [options]\n * ***Configuration options for `safeStableStringify`:***\n * - `keepUndefined` (boolean) – Control how `undefined` is handled **before** the final `JSON.stringify`\n * call, default: `false`.\n * - `sortKeys` (boolean) – Whether to sort object keys alphabetically (recursively), default: `true`.\n * - `sortArray` (boolean) – Whether to sort primitive values inside arrays, default: `false`.\n * - `pretty` (boolean) – Whether to pretty-print JSON output with 2-space indentation, default: `false`.\n * @returns {string}\n * A stable JSON string representation of the input value.\n * @throws **{@link TypeError | `TypeError`}** if `sortKeys`, `sortArray`, or `pretty` are not strictly boolean.\n * @example\n * ```ts\n * // Basic object key sorting\n * safeStableStringify({ b: 2, a: 1 });\n * // ➔ '{\"a\":1,\"b\":2}'\n *\n * // Disable key sorting (preserve insertion order)\n * safeStableStringify({ b: 2, a: 1 }, {\n * sortKeys:false\n * });\n * // ➔ '{\"b\":2,\"a\":1}'\n *\n * // Sorting arrays with sortArray\n * safeStableStringify([3, 1, 2], {\n * sortArray:true\n * });\n * // ➔ '[1,2,3]'\n *\n * // keepUndefined = true (native removal of keys)\n * safeStableStringify({ a: undefined }, { keepUndefined: true });\n * // ➔ '{}' // key `a` is removed, like native JSON.stringify\n *\n * // Default keepUndefined = false (convert to null, keep key)\n * safeStableStringify({ a: undefined });\n * // ➔ '{\"a\":null}'\n *\n * // Nested object + sortArray=true\n * safeStableStringify({ z: [3, 1, 2], x: { d: 4, c: 3 } }, {\n * sortKeys:true,\n * sortArray:true\n * });\n * // ➔ '{\"x\":{\"c\":3,\"d\":4},\"z\":[1,2,3]}'\n *\n * // sortKeys=false and sortArray=true\n * safeStableStringify({ z: [3, 1, 2], x: { d: 4, c: 3 } }, {\n * sortKeys:false,\n * sortArray:true\n * });\n * // ➔ '{\"z\":[1,2,3],\"x\":{\"d\":4,\"c\":3}}'\n *\n * // Pretty print output\n * safeStableStringify([3, 1, 2], {\n * sortArray:true,\n * pretty:true\n * });\n * // ➔ `[\n * // 1,\n * // 2,\n * // 3\n * // ]`\n *\n * // Boxed primitives converted to primitive\n * safeStableStringify({ n: new Number(42), s: new String(\"hi\"), b: new Boolean(true) });\n * // ➔ '{\"n\":42,\"s\":\"hi\",\"b\":true}'\n *\n * // Handles Date, BigInt, Map and Set\n * safeStableStringify({\n * time: new Date(\"2025-01-01\"),\n * big: BigInt(9007199254740991),\n * data: new Map([[\"key\", new Set([1, 2])]])\n * });\n * // ➔ '{\"big\":\"9007199254740991\",\"data\":{\"map\":[[\"key\",{\"set\":[1,2]}]]},\"time\":\"2025-01-01T00:00:00.000Z\"}'\n *\n * // Functions and symbols are removed\n * safeStableStringify({ f: () => {}, s: Symbol(\"wow\") });\n * // ➔ '{}'\n *\n * // undefined, NaN, Infinity convert to null (keepUndefined = false or keepUndefined = true)\n * safeStableStringify([undefined, NaN, Infinity, -Infinity]);\n * // ➔ '[null,null,null,null]'\n *\n * // Circular reference\n * const obj = { name: \"A\" };\n * obj.self = obj;\n * safeStableStringify(obj);\n * // ➔ '{\"name\":\"A\",\"self\":\"[Circular]\"}'\n *\n * // Complex nested sortArray with objects\n * const arr = [9, 7, [4, 2, 3], { z: [5, 1, 6] }];\n * safeStableStringify(arr, { sortArray: true, sortKeys: true });\n * // ➔ '[7,9,[2,3,4],{\"z\":[1,5,6]}]'\n * ```\n */\nexport const safeStableStringify = (\n value: unknown,\n options: SafeStableStringifyOptions = {}\n): string => {\n assertIsPlainObject(options, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`options\\`) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const pretty = hasOwnProp(options, \"pretty\") ? options.pretty : false;\n const sortKeys = hasOwnProp(options, \"sortKeys\") ? options.sortKeys : true;\n const sortArray = hasOwnProp(options, \"sortArray\")\n ? options.sortArray\n : false;\n const keepUndefined = hasOwnProp(options, \"keepUndefined\")\n ? options.keepUndefined\n : false;\n\n if (\n !isBoolean(sortKeys) ||\n !isBoolean(sortArray) ||\n !isBoolean(pretty) ||\n !isBoolean(keepUndefined)\n ) {\n throw new TypeError(\n `Parameters \\`sortKeys\\`, \\`sortArray\\`, \\`keepUndefined\\` and \\`pretty\\` property of the \\`options\\` (second parameter) must be of type \\`boolean\\`, but received: \"['sortKeys': \\`${getPreciseType(\n sortKeys\n )}\\`, 'sortArray': \\`${getPreciseType(\n sortArray\n )}\\`, 'keepUndefined': \\`${getPreciseType(\n keepUndefined\n )}\\`, 'pretty': \\`${getPreciseType(pretty)}\\`]\".`\n );\n }\n\n if (isUndefined(value)) {\n return keepUndefined ? \"undefined\" : \"null\";\n }\n\n const seen = new WeakSet();\n\n const isPrimitive = (val: unknown): boolean =>\n isNull(val) || (!isObjectOrArray(val) && !isFunction(val));\n\n const deepProcess = (val: unknown): unknown => {\n if (isNumberObject(val)) {\n const valOf = val.valueOf();\n return isNaN(valOf) || isInfinityNumber(valOf) ? null : valOf;\n }\n if (isStringObject(val)) return val.valueOf();\n if (isBooleanObject(val)) return val.valueOf();\n if (isFunction(val) || isSymbol(val)) return undefined;\n if (isBigInt(val)) return val.toString();\n if (isNaN(val) || isInfinityNumber(val)) return null;\n if (isUndefined(val)) {\n return keepUndefined ? undefined : null;\n }\n\n if (isObjectOrArray(val)) {\n if (seen.has(val)) return \"[Circular]\";\n seen.add(val);\n\n if (isDate(val)) return val.toISOString();\n if (isMap(val)) {\n return {\n map: Array.from(val.entries()).map(([k, v]) => [k, deepProcess(v)])\n };\n }\n if (isSet(val)) return { set: Array.from(val.values()).map(deepProcess) };\n\n if (isArray(val)) {\n const processedArr = val.map(deepProcess);\n if (sortArray) {\n const primitives: unknown[] = [];\n const nonPrimitives: unknown[] = [];\n\n for (const item of processedArr) {\n if (isPrimitive(item)) primitives.push(item);\n else nonPrimitives.push(item);\n }\n primitives.sort((a, b) => {\n if (isNumber(a) && isNumber(b)) return a - b;\n return String(a).localeCompare(String(b));\n });\n return [...primitives, ...nonPrimitives];\n }\n return processedArr;\n }\n\n const keys = Object.keys(val);\n if (sortKeys) {\n keys.sort((a, b) => {\n const na = Number(a);\n const nb = Number(b);\n if (!isNaN(na) && !isNaN(nb)) return na - nb;\n return a.localeCompare(b);\n });\n }\n\n const result: Record<string, unknown> = {};\n\n if (isObject(val)) {\n for (const k of keys) {\n const v = deepProcess(val[k]);\n if (!isUndefined(v)) result[k] = v;\n }\n }\n\n return result;\n }\n\n return val;\n };\n\n try {\n return JSON.stringify(deepProcess(value), null, pretty ? 2 : 0);\n } catch (err) {\n console.warn(\"Error in safeStableStringify:\", err);\n return \"{}\";\n }\n};\n"],"mappings":"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"}
@@ -2,13 +2,13 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.13.0-beta.2`
5
+ * Version: `3.13.0`
6
6
  * Author: `Rizalvin Dwiky <rizalvindwiky@gmail.com>`
7
7
  * Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/utils-js`
8
8
  * ========================================================================
9
9
  */
10
- import { A as isPlainObject, C as isSymbol, D as isNaN, E as isNull, F as isBoolean, M as isArray, O as isNumberObject, P as isFunction, S as isUndefined, T as assertIsPlainObject, b as hasOwnProp, f as isSet, g as isStringObject, h as isBooleanObject, j as isObject, m as isInfinityNumber, r as getPreciseType, w as isNumber, x as isObjectOrArray } from "./assertIsBoolean-Bv6gL-xe.js";
11
- import { t as isBigInt } from "./isBigInt-D-Pu9sxp.js";
10
+ import { A as isPlainObject, C as isSymbol, D as isNaN, E as isNull, F as isBoolean, M as isArray, O as isNumberObject, P as isFunction, S as isUndefined, T as assertIsPlainObject, b as hasOwnProp, f as isSet, g as isStringObject, h as isBooleanObject, j as isObject, m as isInfinityNumber, r as getPreciseType, w as isNumber, x as isObjectOrArray } from "./assertIsBoolean-9-huIcIR.js";
11
+ import { t as isBigInt } from "./isBigInt-bbW78ITJ.js";
12
12
  function isMap(value) {
13
13
  return Object.prototype.toString.call(value) === "[object Map]" || value instanceof Map;
14
14
  }
@@ -85,4 +85,4 @@ const safeStableStringify = (value, options = {}) => {
85
85
  }
86
86
  };
87
87
  export { isDate as n, isMap as r, safeStableStringify as t };
88
- //# sourceMappingURL=safeStableStringify-BrOcdX9n.js.map
88
+ //# sourceMappingURL=safeStableStringify-C5Gc3ZED.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"safeStableStringify-BrOcdX9n.js","names":[],"sources":["../src/predicates/is/isMap.ts","../src/predicates/is/isDate.ts","../src/conversions/stringify/safeStableStringify.ts"],"sourcesContent":["/** --------------------------------------------------\n * * ***Type guard: `isMap`.***\n * ----------------------------------------------------------\n * **Checks whether the given value is a **[`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) object**.**\n * - **Behavior:**\n * - Ensures that the provided value is an instance of **[`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map)**.\n * - Useful in TypeScript for narrowing types when working with collections.\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is instance of **[`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map)**, else `false`.\n * @example\n * isMap(new Map());\n * // ➔ true\n * isMap(new WeakMap());\n * // ➔ false\n * isMap({});\n * // ➔ false\n */\nexport function isMap<K = unknown, V = unknown>(\n value: Map<K, V>\n): value is Map<K, V>;\nexport function isMap(value: unknown): value is Map<unknown, unknown>;\nexport function isMap(value: unknown): boolean {\n return (\n Object.prototype.toString.call(value) === \"[object Map]\" ||\n value instanceof Map\n );\n}\n","import { assertIsPlainObject } from \"@/assertions/objects/assertIsPlainObject\";\n\nimport { isNaN } from \"./isNaN\";\nimport { isPlainObject } from \"./isPlainObject\";\nimport { isBoolean } from \"./isBoolean\";\n\ntype isDateOptions = {\n /** * ***Skip the validity check (`!isNaN(date.getTime())`).***\n *\n * When `true`, the function only checks that the value is an\n * instance of `Date` without verifying that it represents a valid\n * date value, default: `false`.\n *\n * @default false\n */\n skipInvalidDate?: boolean;\n};\n\n/** ----------------------------------------------------------\n * * ***Type guard: `isDate`.***\n * ----------------------------------------------------------\n * **Determines whether the given `value` is a real, valid JavaScript\n * **[`Date`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)** object.**\n * - **Behavior:**\n * - Returns **true** only if:\n * - `value` is an instance of `Date`.\n * - and, unless `options.skipInvalidDate` is `true`,\n * the underlying time value is valid (`!isNaN(value.getTime())`).\n * - Returns **false** for:\n * - non-Date values (strings, numbers, etc.).\n * - `Date` instances that represent an invalid time value\n * (e.g. `new Date(\"bad\")`), unless skipping is enabled.\n * @param {*} value - The value to check.\n * @param {isDateOptions} [options] - Optional settings.\n * @returns {boolean} Return `true` if value is a valid Date object.\n * @example\n * isDate(new Date());\n * // ➜ true\n * isDate(new Date(\"invalid\"));\n * // ➜ false\n * isDate(\"2024-01-01\");\n * // ➜ false\n *\n * // Skipping validity check:\n * isDate(new Date(\"invalid\"), { skipInvalidDate: true });\n * // ➜ true\n */\nexport const isDate = (\n value: unknown,\n options: isDateOptions = {}\n): value is Date => {\n assertIsPlainObject(options, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`options\\`) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const skipInvalidDate =\n isPlainObject(options) && isBoolean(options.skipInvalidDate)\n ? options.skipInvalidDate\n : false;\n\n const instanceDate = value instanceof Date;\n\n if (skipInvalidDate) return instanceDate;\n return instanceDate && !isNaN(value.getTime());\n};\n","import { assertIsPlainObject } from \"@/assertions/objects/assertIsPlainObject\";\n\nimport { isSet } from \"@/predicates/is/isSet\";\nimport { isMap } from \"@/predicates/is/isMap\";\nimport { isNaN } from \"@/predicates/is/isNaN\";\nimport { isDate } from \"@/predicates/is/isDate\";\nimport { isNull } from \"@/predicates/is/isNull\";\nimport { isArray } from \"@/predicates/is/isArray\";\nimport { isSymbol } from \"@/predicates/is/isSymbol\";\nimport { isNumber } from \"@/predicates/is/isNumber\";\nimport { isObject } from \"@/predicates/is/isObject\";\nimport { isBigInt } from \"@/predicates/is/isBigInt\";\nimport { isBoolean } from \"@/predicates/is/isBoolean\";\nimport { isFunction } from \"@/predicates/is/isFunction\";\nimport { hasOwnProp } from \"@/predicates/has/hasOwnProp\";\nimport { isUndefined } from \"@/predicates/is/isUndefined\";\nimport { isNumberObject } from \"@/predicates/is/isNumberObject\";\nimport { isStringObject } from \"@/predicates/is/isStringObject\";\nimport { isBooleanObject } from \"@/predicates/is/isBooleanObject\";\nimport { isObjectOrArray } from \"@/predicates/is/isObjectOrArray\";\nimport { getPreciseType } from \"@/predicates/type/getPreciseType\";\nimport { isInfinityNumber } from \"@/predicates/is/isInfinityNumber\";\n\n/** -------------------------------------------------\n * * ***Type Options for **{@link safeStableStringify | `safeStableStringify`}**.***\n * -------------------------------------------------\n */\ntype SafeStableStringifyOptions = {\n /** -------------------------------------------------\n * * ***Whether to sort **object keys** alphabetically (recursively).***\n * -------------------------------------------------\n *\n * - `true` (default): object keys are sorted to ensure stable output.\n * - `false`: preserves original insertion order of keys.\n *\n * @default true\n */\n sortKeys?: boolean;\n /** -------------------------------------------------\n * * ***Whether to sort **primitive values inside arrays**.***\n * -------------------------------------------------\n *\n * - `true`: primitive values in arrays are sorted to ensure stable output.\n * - `false` (default): arrays retain their original order; objects and nested arrays are not reordered.\n *\n * @default false\n */\n sortArray?: boolean;\n /** -------------------------------------------------\n * * ***Whether to pretty-print JSON output with 2-space indentation.***\n * -------------------------------------------------\n *\n * - `true`: output is formatted with indentation and newlines.\n * - `false` (default): produces compact single-line JSON.\n *\n * @default false\n */\n pretty?: boolean;\n /** -------------------------------------------------\n * * ***Preserve `undefined` values instead of converting them to `null`.***\n * -------------------------------------------------\n * **Controls how the internal `deepProcess` step rewrites values\n * **before** the final `JSON.stringify` call.**\n * - **Default (`false`):**\n * * Every `undefined` value (object properties **and** array elements)\n * is replaced with `null` **before** serialization, because this happens\n * first, the key is **not removed** by `JSON.stringify`.\n * - **`true`** – Leaves `undefined` untouched so the final\n * `JSON.stringify` call behaves natively:\n * * Object properties with `undefined` are **removed**.\n * * Array elements that are `undefined` become `null`.\n * @default false\n * @example\n * // ✅ keepUndefined = true: behaves like native JSON.stringify\n * safeStableStringify({ a: undefined }, { keepUndefined: true });\n * // ➔ '{}' // key removed\n *\n * // ✅ Default (false): convert undefined to null, key kept\n * safeStableStringify({ a: undefined });\n * // ➔ '{\"a\":null}' // key present, value null\n *\n * // Arrays\n * safeStableStringify([undefined]);\n * // ➔ '[null]' // same, but via pre-replacement\n * safeStableStringify([undefined], { keepUndefined: true });\n * // ➔ '[null]' // element becomes null\n */\n keepUndefined?: boolean;\n};\n\n/** --------------------------------------------\n * * ***Utility: `safeStableStringify`.***\n * ---------------------------------------------\n * **Safely converts a JavaScript value into a stable, JSON-compatible string.**\n * - **This function is an enhanced version of `JSON.stringify` with additional guarantees:**\n * - ***Features:***\n * - Recursively sorts object keys **only if** `sortKeys` is `true` (default: `true`), to ensure stable\n * key order.\n * - If `sortKeys` is `false`, preserves the original insertion order of object keys.\n * - Optionally sorts array primitive values **only if** `sortArray` is `true` (default: `false`).\n * - Only primitive values in arrays are sorted.\n * - Objects and nested arrays keep their original position and are appended after sorted primitives.\n * - If `sortArray` is `false`, arrays retain their original order.\n * - Converts JavaScript special values for JSON safety:\n * - `undefined`, `NaN`, `Infinity`, `-Infinity` ➔ `null`.\n * - `BigInt` ➔ string (JSON does not support BigInt).\n * - Converts boxed primitives box into their primitive equivalents:\n * - `new Number(42)` ➔ `Number(42)` ➔ `42`.\n * - `new String(\"hi\")` ➔ `String(\"hi\")` ➔ `\"hi\"`.\n * - `new Boolean(true)` ➔ `Boolean(true)` ➔ `true`.\n * - Functions and Symbols are removed.\n * - Circular references are replaced with the string `\"[Circular]\"`.\n * - Serializes:\n * - `Date` ➔ ISO string (`date.toISOString()`).\n * - `Set` ➔ `{ set: [values...] }` (values are recursively processed).\n * - `Map` ➔ `{ map: [ [key, value], ... ] }` (values are recursively processed).\n * - Compared to `JSON.stringify`, this ensures **stable output**:\n * - Same object structure always produces the same string.\n * - Useful for deep equality checks, hashing, caching keys, or snapshot tests.\n * - Controls how `undefined` is handled **before** the final `JSON.stringify` call, by `keepUndefined`\n * options, default: `false`.\n * - **false**: All `undefined` values (object properties and array elements) are replaced\n * with `null`, so object keys remain.\n * - **true**: Leaves `undefined` values as-is, and handling by native `JSON.stringify` then:\n * 1. Removes object properties that are `undefined`.\n * 2. Converts `undefined` array elements to `null`.\n * - Use `true` when you need native removal of keys or to preserve sparse arrays\n * exactly as `JSON.stringify` would.\n * @param {*} value\n * ***Any JavaScript value to serialize, can be:***\n * - Primitives (`number`, `string`, `boolean`, `bigint`, `null`, `undefined`).\n * - Boxed primitives (`new Number()`, `new String()`, `new Boolean()`).\n * - Arrays, plain objects, nested structures.\n * - Date, Map, Set.\n * - Circular structures.\n * @param {SafeStableStringifyOptions} [options]\n * ***Configuration options for `safeStableStringify`:***\n * - `keepUndefined` (boolean) – Control how `undefined` is handled **before** the final `JSON.stringify`\n * call, default: `false`.\n * - `sortKeys` (boolean) – Whether to sort object keys alphabetically (recursively), default: `true`.\n * - `sortArray` (boolean) – Whether to sort primitive values inside arrays, default: `false`.\n * - `pretty` (boolean) – Whether to pretty-print JSON output with 2-space indentation, default: `false`.\n * @returns {string}\n * A stable JSON string representation of the input value.\n * @throws **{@link TypeError | `TypeError`}** if `sortKeys`, `sortArray`, or `pretty` are not strictly boolean.\n * @example\n * ```ts\n * // Basic object key sorting\n * safeStableStringify({ b: 2, a: 1 });\n * // ➔ '{\"a\":1,\"b\":2}'\n *\n * // Disable key sorting (preserve insertion order)\n * safeStableStringify({ b: 2, a: 1 }, {\n * sortKeys:false\n * });\n * // ➔ '{\"b\":2,\"a\":1}'\n *\n * // Sorting arrays with sortArray\n * safeStableStringify([3, 1, 2], {\n * sortArray:true\n * });\n * // ➔ '[1,2,3]'\n *\n * // keepUndefined = true (native removal of keys)\n * safeStableStringify({ a: undefined }, { keepUndefined: true });\n * // ➔ '{}' // key `a` is removed, like native JSON.stringify\n *\n * // Default keepUndefined = false (convert to null, keep key)\n * safeStableStringify({ a: undefined });\n * // ➔ '{\"a\":null}'\n *\n * // Nested object + sortArray=true\n * safeStableStringify({ z: [3, 1, 2], x: { d: 4, c: 3 } }, {\n * sortKeys:true,\n * sortArray:true\n * });\n * // ➔ '{\"x\":{\"c\":3,\"d\":4},\"z\":[1,2,3]}'\n *\n * // sortKeys=false and sortArray=true\n * safeStableStringify({ z: [3, 1, 2], x: { d: 4, c: 3 } }, {\n * sortKeys:false,\n * sortArray:true\n * });\n * // ➔ '{\"z\":[1,2,3],\"x\":{\"d\":4,\"c\":3}}'\n *\n * // Pretty print output\n * safeStableStringify([3, 1, 2], {\n * sortArray:true,\n * pretty:true\n * });\n * // ➔ `[\n * // 1,\n * // 2,\n * // 3\n * // ]`\n *\n * // Boxed primitives converted to primitive\n * safeStableStringify({ n: new Number(42), s: new String(\"hi\"), b: new Boolean(true) });\n * // ➔ '{\"n\":42,\"s\":\"hi\",\"b\":true}'\n *\n * // Handles Date, BigInt, Map and Set\n * safeStableStringify({\n * time: new Date(\"2025-01-01\"),\n * big: BigInt(9007199254740991),\n * data: new Map([[\"key\", new Set([1, 2])]])\n * });\n * // ➔ '{\"big\":\"9007199254740991\",\"data\":{\"map\":[[\"key\",{\"set\":[1,2]}]]},\"time\":\"2025-01-01T00:00:00.000Z\"}'\n *\n * // Functions and symbols are removed\n * safeStableStringify({ f: () => {}, s: Symbol(\"wow\") });\n * // ➔ '{}'\n *\n * // undefined, NaN, Infinity convert to null (keepUndefined = false or keepUndefined = true)\n * safeStableStringify([undefined, NaN, Infinity, -Infinity]);\n * // ➔ '[null,null,null,null]'\n *\n * // Circular reference\n * const obj = { name: \"A\" };\n * obj.self = obj;\n * safeStableStringify(obj);\n * // ➔ '{\"name\":\"A\",\"self\":\"[Circular]\"}'\n *\n * // Complex nested sortArray with objects\n * const arr = [9, 7, [4, 2, 3], { z: [5, 1, 6] }];\n * safeStableStringify(arr, { sortArray: true, sortKeys: true });\n * // ➔ '[7,9,[2,3,4],{\"z\":[1,5,6]}]'\n * ```\n */\nexport const safeStableStringify = (\n value: unknown,\n options: SafeStableStringifyOptions = {}\n): string => {\n assertIsPlainObject(options, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`options\\`) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const pretty = hasOwnProp(options, \"pretty\") ? options.pretty : false;\n const sortKeys = hasOwnProp(options, \"sortKeys\") ? options.sortKeys : true;\n const sortArray = hasOwnProp(options, \"sortArray\")\n ? options.sortArray\n : false;\n const keepUndefined = hasOwnProp(options, \"keepUndefined\")\n ? options.keepUndefined\n : false;\n\n if (\n !isBoolean(sortKeys) ||\n !isBoolean(sortArray) ||\n !isBoolean(pretty) ||\n !isBoolean(keepUndefined)\n ) {\n throw new TypeError(\n `Parameters \\`sortKeys\\`, \\`sortArray\\`, \\`keepUndefined\\` and \\`pretty\\` property of the \\`options\\` (second parameter) must be of type \\`boolean\\`, but received: \"['sortKeys': \\`${getPreciseType(\n sortKeys\n )}\\`, 'sortArray': \\`${getPreciseType(\n sortArray\n )}\\`, 'keepUndefined': \\`${getPreciseType(\n keepUndefined\n )}\\`, 'pretty': \\`${getPreciseType(pretty)}\\`]\".`\n );\n }\n\n if (isUndefined(value)) {\n return keepUndefined ? \"undefined\" : \"null\";\n }\n\n const seen = new WeakSet();\n\n const isPrimitive = (val: unknown): boolean =>\n isNull(val) || (!isObjectOrArray(val) && !isFunction(val));\n\n const deepProcess = (val: unknown): unknown => {\n if (isNumberObject(val)) {\n const valOf = val.valueOf();\n return isNaN(valOf) || isInfinityNumber(valOf) ? null : valOf;\n }\n if (isStringObject(val)) return val.valueOf();\n if (isBooleanObject(val)) return val.valueOf();\n if (isFunction(val) || isSymbol(val)) return undefined;\n if (isBigInt(val)) return val.toString();\n if (isNaN(val) || isInfinityNumber(val)) return null;\n if (isUndefined(val)) {\n return keepUndefined ? undefined : null;\n }\n\n if (isObjectOrArray(val)) {\n if (seen.has(val)) return \"[Circular]\";\n seen.add(val);\n\n if (isDate(val)) return val.toISOString();\n if (isMap(val)) {\n return {\n map: Array.from(val.entries()).map(([k, v]) => [k, deepProcess(v)])\n };\n }\n if (isSet(val)) return { set: Array.from(val.values()).map(deepProcess) };\n\n if (isArray(val)) {\n const processedArr = val.map(deepProcess);\n if (sortArray) {\n const primitives: unknown[] = [];\n const nonPrimitives: unknown[] = [];\n\n for (const item of processedArr) {\n if (isPrimitive(item)) primitives.push(item);\n else nonPrimitives.push(item);\n }\n primitives.sort((a, b) => {\n if (isNumber(a) && isNumber(b)) return a - b;\n return String(a).localeCompare(String(b));\n });\n return [...primitives, ...nonPrimitives];\n }\n return processedArr;\n }\n\n const keys = Object.keys(val);\n if (sortKeys) {\n keys.sort((a, b) => {\n const na = Number(a);\n const nb = Number(b);\n if (!isNaN(na) && !isNaN(nb)) return na - nb;\n return a.localeCompare(b);\n });\n }\n\n const result: Record<string, unknown> = {};\n\n if (isObject(val)) {\n for (const k of keys) {\n const v = deepProcess(val[k]);\n if (!isUndefined(v)) result[k] = v;\n }\n }\n\n return result;\n }\n\n return val;\n };\n\n try {\n return JSON.stringify(deepProcess(value), null, pretty ? 2 : 0);\n } catch (err) {\n console.warn(\"Error in safeStableStringify:\", err);\n return \"{}\";\n }\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"safeStableStringify-C5Gc3ZED.js","names":[],"sources":["../src/predicates/is/isMap.ts","../src/predicates/is/isDate.ts","../src/conversions/stringify/safeStableStringify.ts"],"sourcesContent":["/** --------------------------------------------------\n * * ***Type guard: `isMap`.***\n * ----------------------------------------------------------\n * **Checks whether the given value is a **[`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) object**.**\n * - **Behavior:**\n * - Ensures that the provided value is an instance of **[`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map)**.\n * - Useful in TypeScript for narrowing types when working with collections.\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is instance of **[`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map)**, else `false`.\n * @example\n * isMap(new Map());\n * // ➔ true\n * isMap(new WeakMap());\n * // ➔ false\n * isMap({});\n * // ➔ false\n */\nexport function isMap<K = unknown, V = unknown>(\n value: Map<K, V>\n): value is Map<K, V>;\nexport function isMap(value: unknown): value is Map<unknown, unknown>;\nexport function isMap(value: unknown): boolean {\n return (\n Object.prototype.toString.call(value) === \"[object Map]\" ||\n value instanceof Map\n );\n}\n","import { assertIsPlainObject } from \"@/assertions/objects/assertIsPlainObject\";\n\nimport { isNaN } from \"./isNaN\";\nimport { isPlainObject } from \"./isPlainObject\";\nimport { isBoolean } from \"./isBoolean\";\n\ntype isDateOptions = {\n /** * ***Skip the validity check (`!isNaN(date.getTime())`).***\n *\n * When `true`, the function only checks that the value is an\n * instance of `Date` without verifying that it represents a valid\n * date value, default: `false`.\n *\n * @default false\n */\n skipInvalidDate?: boolean;\n};\n\n/** ----------------------------------------------------------\n * * ***Type guard: `isDate`.***\n * ----------------------------------------------------------\n * **Determines whether the given `value` is a real, valid JavaScript\n * **[`Date`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)** object.**\n * - **Behavior:**\n * - Returns **true** only if:\n * - `value` is an instance of `Date`.\n * - and, unless `options.skipInvalidDate` is `true`,\n * the underlying time value is valid (`!isNaN(value.getTime())`).\n * - Returns **false** for:\n * - non-Date values (strings, numbers, etc.).\n * - `Date` instances that represent an invalid time value\n * (e.g. `new Date(\"bad\")`), unless skipping is enabled.\n * @param {*} value - The value to check.\n * @param {isDateOptions} [options] - Optional settings.\n * @returns {boolean} Return `true` if value is a valid Date object.\n * @example\n * isDate(new Date());\n * // ➜ true\n * isDate(new Date(\"invalid\"));\n * // ➜ false\n * isDate(\"2024-01-01\");\n * // ➜ false\n *\n * // Skipping validity check:\n * isDate(new Date(\"invalid\"), { skipInvalidDate: true });\n * // ➜ true\n */\nexport const isDate = (\n value: unknown,\n options: isDateOptions = {}\n): value is Date => {\n assertIsPlainObject(options, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`options\\`) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const skipInvalidDate =\n isPlainObject(options) && isBoolean(options.skipInvalidDate)\n ? options.skipInvalidDate\n : false;\n\n const instanceDate = value instanceof Date;\n\n if (skipInvalidDate) return instanceDate;\n return instanceDate && !isNaN(value.getTime());\n};\n","import { assertIsPlainObject } from \"@/assertions/objects/assertIsPlainObject\";\n\nimport { isSet } from \"@/predicates/is/isSet\";\nimport { isMap } from \"@/predicates/is/isMap\";\nimport { isNaN } from \"@/predicates/is/isNaN\";\nimport { isDate } from \"@/predicates/is/isDate\";\nimport { isNull } from \"@/predicates/is/isNull\";\nimport { isArray } from \"@/predicates/is/isArray\";\nimport { isSymbol } from \"@/predicates/is/isSymbol\";\nimport { isNumber } from \"@/predicates/is/isNumber\";\nimport { isObject } from \"@/predicates/is/isObject\";\nimport { isBigInt } from \"@/predicates/is/isBigInt\";\nimport { isBoolean } from \"@/predicates/is/isBoolean\";\nimport { isFunction } from \"@/predicates/is/isFunction\";\nimport { hasOwnProp } from \"@/predicates/has/hasOwnProp\";\nimport { isUndefined } from \"@/predicates/is/isUndefined\";\nimport { isNumberObject } from \"@/predicates/is/isNumberObject\";\nimport { isStringObject } from \"@/predicates/is/isStringObject\";\nimport { isBooleanObject } from \"@/predicates/is/isBooleanObject\";\nimport { isObjectOrArray } from \"@/predicates/is/isObjectOrArray\";\nimport { getPreciseType } from \"@/predicates/type/getPreciseType\";\nimport { isInfinityNumber } from \"@/predicates/is/isInfinityNumber\";\n\n/** -------------------------------------------------\n * * ***Type Options for **{@link safeStableStringify | `safeStableStringify`}**.***\n * -------------------------------------------------\n */\ntype SafeStableStringifyOptions = {\n /** -------------------------------------------------\n * * ***Whether to sort **object keys** alphabetically (recursively).***\n * -------------------------------------------------\n *\n * - `true` (default): object keys are sorted to ensure stable output.\n * - `false`: preserves original insertion order of keys.\n *\n * @default true\n */\n sortKeys?: boolean;\n /** -------------------------------------------------\n * * ***Whether to sort **primitive values inside arrays**.***\n * -------------------------------------------------\n *\n * - `true`: primitive values in arrays are sorted to ensure stable output.\n * - `false` (default): arrays retain their original order; objects and nested arrays are not reordered.\n *\n * @default false\n */\n sortArray?: boolean;\n /** -------------------------------------------------\n * * ***Whether to pretty-print JSON output with 2-space indentation.***\n * -------------------------------------------------\n *\n * - `true`: output is formatted with indentation and newlines.\n * - `false` (default): produces compact single-line JSON.\n *\n * @default false\n */\n pretty?: boolean;\n /** -------------------------------------------------\n * * ***Preserve `undefined` values instead of converting them to `null`.***\n * -------------------------------------------------\n * **Controls how the internal `deepProcess` step rewrites values\n * **before** the final `JSON.stringify` call.**\n * - **Default (`false`):**\n * * Every `undefined` value (object properties **and** array elements)\n * is replaced with `null` **before** serialization, because this happens\n * first, the key is **not removed** by `JSON.stringify`.\n * - **`true`** – Leaves `undefined` untouched so the final\n * `JSON.stringify` call behaves natively:\n * * Object properties with `undefined` are **removed**.\n * * Array elements that are `undefined` become `null`.\n * @default false\n * @example\n * // ✅ keepUndefined = true: behaves like native JSON.stringify\n * safeStableStringify({ a: undefined }, { keepUndefined: true });\n * // ➔ '{}' // key removed\n *\n * // ✅ Default (false): convert undefined to null, key kept\n * safeStableStringify({ a: undefined });\n * // ➔ '{\"a\":null}' // key present, value null\n *\n * // Arrays\n * safeStableStringify([undefined]);\n * // ➔ '[null]' // same, but via pre-replacement\n * safeStableStringify([undefined], { keepUndefined: true });\n * // ➔ '[null]' // element becomes null\n */\n keepUndefined?: boolean;\n};\n\n/** --------------------------------------------\n * * ***Utility: `safeStableStringify`.***\n * ---------------------------------------------\n * **Safely converts a JavaScript value into a stable, JSON-compatible string.**\n * - **This function is an enhanced version of `JSON.stringify` with additional guarantees:**\n * - ***Features:***\n * - Recursively sorts object keys **only if** `sortKeys` is `true` (default: `true`), to ensure stable\n * key order.\n * - If `sortKeys` is `false`, preserves the original insertion order of object keys.\n * - Optionally sorts array primitive values **only if** `sortArray` is `true` (default: `false`).\n * - Only primitive values in arrays are sorted.\n * - Objects and nested arrays keep their original position and are appended after sorted primitives.\n * - If `sortArray` is `false`, arrays retain their original order.\n * - Converts JavaScript special values for JSON safety:\n * - `undefined`, `NaN`, `Infinity`, `-Infinity` ➔ `null`.\n * - `BigInt` ➔ string (JSON does not support BigInt).\n * - Converts boxed primitives box into their primitive equivalents:\n * - `new Number(42)` ➔ `Number(42)` ➔ `42`.\n * - `new String(\"hi\")` ➔ `String(\"hi\")` ➔ `\"hi\"`.\n * - `new Boolean(true)` ➔ `Boolean(true)` ➔ `true`.\n * - Functions and Symbols are removed.\n * - Circular references are replaced with the string `\"[Circular]\"`.\n * - Serializes:\n * - `Date` ➔ ISO string (`date.toISOString()`).\n * - `Set` ➔ `{ set: [values...] }` (values are recursively processed).\n * - `Map` ➔ `{ map: [ [key, value], ... ] }` (values are recursively processed).\n * - Compared to `JSON.stringify`, this ensures **stable output**:\n * - Same object structure always produces the same string.\n * - Useful for deep equality checks, hashing, caching keys, or snapshot tests.\n * - Controls how `undefined` is handled **before** the final `JSON.stringify` call, by `keepUndefined`\n * options, default: `false`.\n * - **false**: All `undefined` values (object properties and array elements) are replaced\n * with `null`, so object keys remain.\n * - **true**: Leaves `undefined` values as-is, and handling by native `JSON.stringify` then:\n * 1. Removes object properties that are `undefined`.\n * 2. Converts `undefined` array elements to `null`.\n * - Use `true` when you need native removal of keys or to preserve sparse arrays\n * exactly as `JSON.stringify` would.\n * @param {*} value\n * ***Any JavaScript value to serialize, can be:***\n * - Primitives (`number`, `string`, `boolean`, `bigint`, `null`, `undefined`).\n * - Boxed primitives (`new Number()`, `new String()`, `new Boolean()`).\n * - Arrays, plain objects, nested structures.\n * - Date, Map, Set.\n * - Circular structures.\n * @param {SafeStableStringifyOptions} [options]\n * ***Configuration options for `safeStableStringify`:***\n * - `keepUndefined` (boolean) – Control how `undefined` is handled **before** the final `JSON.stringify`\n * call, default: `false`.\n * - `sortKeys` (boolean) – Whether to sort object keys alphabetically (recursively), default: `true`.\n * - `sortArray` (boolean) – Whether to sort primitive values inside arrays, default: `false`.\n * - `pretty` (boolean) – Whether to pretty-print JSON output with 2-space indentation, default: `false`.\n * @returns {string}\n * A stable JSON string representation of the input value.\n * @throws **{@link TypeError | `TypeError`}** if `sortKeys`, `sortArray`, or `pretty` are not strictly boolean.\n * @example\n * ```ts\n * // Basic object key sorting\n * safeStableStringify({ b: 2, a: 1 });\n * // ➔ '{\"a\":1,\"b\":2}'\n *\n * // Disable key sorting (preserve insertion order)\n * safeStableStringify({ b: 2, a: 1 }, {\n * sortKeys:false\n * });\n * // ➔ '{\"b\":2,\"a\":1}'\n *\n * // Sorting arrays with sortArray\n * safeStableStringify([3, 1, 2], {\n * sortArray:true\n * });\n * // ➔ '[1,2,3]'\n *\n * // keepUndefined = true (native removal of keys)\n * safeStableStringify({ a: undefined }, { keepUndefined: true });\n * // ➔ '{}' // key `a` is removed, like native JSON.stringify\n *\n * // Default keepUndefined = false (convert to null, keep key)\n * safeStableStringify({ a: undefined });\n * // ➔ '{\"a\":null}'\n *\n * // Nested object + sortArray=true\n * safeStableStringify({ z: [3, 1, 2], x: { d: 4, c: 3 } }, {\n * sortKeys:true,\n * sortArray:true\n * });\n * // ➔ '{\"x\":{\"c\":3,\"d\":4},\"z\":[1,2,3]}'\n *\n * // sortKeys=false and sortArray=true\n * safeStableStringify({ z: [3, 1, 2], x: { d: 4, c: 3 } }, {\n * sortKeys:false,\n * sortArray:true\n * });\n * // ➔ '{\"z\":[1,2,3],\"x\":{\"d\":4,\"c\":3}}'\n *\n * // Pretty print output\n * safeStableStringify([3, 1, 2], {\n * sortArray:true,\n * pretty:true\n * });\n * // ➔ `[\n * // 1,\n * // 2,\n * // 3\n * // ]`\n *\n * // Boxed primitives converted to primitive\n * safeStableStringify({ n: new Number(42), s: new String(\"hi\"), b: new Boolean(true) });\n * // ➔ '{\"n\":42,\"s\":\"hi\",\"b\":true}'\n *\n * // Handles Date, BigInt, Map and Set\n * safeStableStringify({\n * time: new Date(\"2025-01-01\"),\n * big: BigInt(9007199254740991),\n * data: new Map([[\"key\", new Set([1, 2])]])\n * });\n * // ➔ '{\"big\":\"9007199254740991\",\"data\":{\"map\":[[\"key\",{\"set\":[1,2]}]]},\"time\":\"2025-01-01T00:00:00.000Z\"}'\n *\n * // Functions and symbols are removed\n * safeStableStringify({ f: () => {}, s: Symbol(\"wow\") });\n * // ➔ '{}'\n *\n * // undefined, NaN, Infinity convert to null (keepUndefined = false or keepUndefined = true)\n * safeStableStringify([undefined, NaN, Infinity, -Infinity]);\n * // ➔ '[null,null,null,null]'\n *\n * // Circular reference\n * const obj = { name: \"A\" };\n * obj.self = obj;\n * safeStableStringify(obj);\n * // ➔ '{\"name\":\"A\",\"self\":\"[Circular]\"}'\n *\n * // Complex nested sortArray with objects\n * const arr = [9, 7, [4, 2, 3], { z: [5, 1, 6] }];\n * safeStableStringify(arr, { sortArray: true, sortKeys: true });\n * // ➔ '[7,9,[2,3,4],{\"z\":[1,5,6]}]'\n * ```\n */\nexport const safeStableStringify = (\n value: unknown,\n options: SafeStableStringifyOptions = {}\n): string => {\n assertIsPlainObject(options, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`options\\`) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const pretty = hasOwnProp(options, \"pretty\") ? options.pretty : false;\n const sortKeys = hasOwnProp(options, \"sortKeys\") ? options.sortKeys : true;\n const sortArray = hasOwnProp(options, \"sortArray\")\n ? options.sortArray\n : false;\n const keepUndefined = hasOwnProp(options, \"keepUndefined\")\n ? options.keepUndefined\n : false;\n\n if (\n !isBoolean(sortKeys) ||\n !isBoolean(sortArray) ||\n !isBoolean(pretty) ||\n !isBoolean(keepUndefined)\n ) {\n throw new TypeError(\n `Parameters \\`sortKeys\\`, \\`sortArray\\`, \\`keepUndefined\\` and \\`pretty\\` property of the \\`options\\` (second parameter) must be of type \\`boolean\\`, but received: \"['sortKeys': \\`${getPreciseType(\n sortKeys\n )}\\`, 'sortArray': \\`${getPreciseType(\n sortArray\n )}\\`, 'keepUndefined': \\`${getPreciseType(\n keepUndefined\n )}\\`, 'pretty': \\`${getPreciseType(pretty)}\\`]\".`\n );\n }\n\n if (isUndefined(value)) {\n return keepUndefined ? \"undefined\" : \"null\";\n }\n\n const seen = new WeakSet();\n\n const isPrimitive = (val: unknown): boolean =>\n isNull(val) || (!isObjectOrArray(val) && !isFunction(val));\n\n const deepProcess = (val: unknown): unknown => {\n if (isNumberObject(val)) {\n const valOf = val.valueOf();\n return isNaN(valOf) || isInfinityNumber(valOf) ? null : valOf;\n }\n if (isStringObject(val)) return val.valueOf();\n if (isBooleanObject(val)) return val.valueOf();\n if (isFunction(val) || isSymbol(val)) return undefined;\n if (isBigInt(val)) return val.toString();\n if (isNaN(val) || isInfinityNumber(val)) return null;\n if (isUndefined(val)) {\n return keepUndefined ? undefined : null;\n }\n\n if (isObjectOrArray(val)) {\n if (seen.has(val)) return \"[Circular]\";\n seen.add(val);\n\n if (isDate(val)) return val.toISOString();\n if (isMap(val)) {\n return {\n map: Array.from(val.entries()).map(([k, v]) => [k, deepProcess(v)])\n };\n }\n if (isSet(val)) return { set: Array.from(val.values()).map(deepProcess) };\n\n if (isArray(val)) {\n const processedArr = val.map(deepProcess);\n if (sortArray) {\n const primitives: unknown[] = [];\n const nonPrimitives: unknown[] = [];\n\n for (const item of processedArr) {\n if (isPrimitive(item)) primitives.push(item);\n else nonPrimitives.push(item);\n }\n primitives.sort((a, b) => {\n if (isNumber(a) && isNumber(b)) return a - b;\n return String(a).localeCompare(String(b));\n });\n return [...primitives, ...nonPrimitives];\n }\n return processedArr;\n }\n\n const keys = Object.keys(val);\n if (sortKeys) {\n keys.sort((a, b) => {\n const na = Number(a);\n const nb = Number(b);\n if (!isNaN(na) && !isNaN(nb)) return na - nb;\n return a.localeCompare(b);\n });\n }\n\n const result: Record<string, unknown> = {};\n\n if (isObject(val)) {\n for (const k of keys) {\n const v = deepProcess(val[k]);\n if (!isUndefined(v)) result[k] = v;\n }\n }\n\n return result;\n }\n\n return val;\n };\n\n try {\n return JSON.stringify(deepProcess(value), null, pretty ? 2 : 0);\n } catch (err) {\n console.warn(\"Error in safeStableStringify:\", err);\n return \"{}\";\n }\n};\n"],"mappings":"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"}
@@ -2,17 +2,17 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.13.0-beta.2`
5
+ * Version: `3.13.0`
6
6
  * Author: `Rizalvin Dwiky <rizalvindwiky@gmail.com>`
7
7
  * Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/utils-js`
8
8
  * ========================================================================
9
9
  */
10
10
  "use strict";
11
11
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
12
- const require_assertIsBoolean = require('../assertIsBoolean-amRiJHnh.cjs');
13
- const require_isEmptyString = require('../isEmptyString-DI64RQCy.cjs');
14
- const require_normalizeSpaces = require('../normalizeSpaces-B6ZQOZRX.cjs');
15
- const require_removeSpaces = require('../removeSpaces-C8mu_yp3.cjs');
12
+ const require_assertIsBoolean = require('../assertIsBoolean-JGpkg5ju.cjs');
13
+ const require_isEmptyString = require('../isEmptyString-Dx6OM5PL.cjs');
14
+ const require_normalizeSpaces = require('../normalizeSpaces-MWiYtSyS.cjs');
15
+ const require_removeSpaces = require('../removeSpaces-CPj1ABLa.cjs');
16
16
  const capitalizeFirst = (string, options = {
17
17
  lowerCaseNextRest: true,
18
18
  trim: false
@@ -2,11 +2,11 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.13.0-beta.2`
5
+ * Version: `3.13.0`
6
6
  * Author: `Rizalvin Dwiky <rizalvindwiky@gmail.com>`
7
7
  * Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/utils-js`
8
8
  * ========================================================================
9
9
  */
10
10
 
11
- import { a as normalizeString, c as toPascalCaseSpace, d as toKebabCase, f as toDotCase, g as capitalizeFirst, h as capitalizeWords, i as removeSpaces, l as toPascalCase, m as slugify, n as getInitialsName, o as normalizeSpaces, p as toCamelCase, r as stripHtmlTags, s as toSnakeCase, t as replaceAt, u as toLowerCase } from "../index-DyVWeYP3.cjs";
11
+ import { a as normalizeString, c as toPascalCaseSpace, d as toKebabCase, f as toDotCase, g as capitalizeFirst, h as capitalizeWords, i as removeSpaces, l as toPascalCase, m as slugify, n as getInitialsName, o as normalizeSpaces, p as toCamelCase, r as stripHtmlTags, s as toSnakeCase, t as replaceAt, u as toLowerCase } from "../index-CPc-TTMc.cjs";
12
12
  export { capitalizeFirst, capitalizeWords, getInitialsName, normalizeSpaces, normalizeString, removeSpaces, replaceAt, slugify, stripHtmlTags, toCamelCase, toDotCase, toKebabCase, toLowerCase, toPascalCase, toPascalCaseSpace, toSnakeCase };
@@ -2,11 +2,11 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.13.0-beta.2`
5
+ * Version: `3.13.0`
6
6
  * Author: `Rizalvin Dwiky <rizalvindwiky@gmail.com>`
7
7
  * Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/utils-js`
8
8
  * ========================================================================
9
9
  */
10
10
 
11
- import { a as normalizeString, c as toPascalCaseSpace, d as toKebabCase, f as toDotCase, g as capitalizeFirst, h as capitalizeWords, i as removeSpaces, l as toPascalCase, m as slugify, n as getInitialsName, o as normalizeSpaces, p as toCamelCase, r as stripHtmlTags, s as toSnakeCase, t as replaceAt, u as toLowerCase } from "../index-_dJhBl1h.js";
11
+ import { a as normalizeString, c as toPascalCaseSpace, d as toKebabCase, f as toDotCase, g as capitalizeFirst, h as capitalizeWords, i as removeSpaces, l as toPascalCase, m as slugify, n as getInitialsName, o as normalizeSpaces, p as toCamelCase, r as stripHtmlTags, s as toSnakeCase, t as replaceAt, u as toLowerCase } from "../index-hsSSKuvW.js";
12
12
  export { capitalizeFirst, capitalizeWords, getInitialsName, normalizeSpaces, normalizeString, removeSpaces, replaceAt, slugify, stripHtmlTags, toCamelCase, toDotCase, toKebabCase, toLowerCase, toPascalCase, toPascalCaseSpace, toSnakeCase };
@@ -2,15 +2,15 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.13.0-beta.2`
5
+ * Version: `3.13.0`
6
6
  * Author: `Rizalvin Dwiky <rizalvindwiky@gmail.com>`
7
7
  * Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/utils-js`
8
8
  * ========================================================================
9
9
  */
10
- import { A as isPlainObject, a as toPascalCase, c as toKebabCase, d as slugify, i as toPascalCaseSpace, k as isString, l as toCamelCase, o as toLowerCase, r as getPreciseType, s as toSnakeCase, u as toDotCase, w as isNumber, y as isNonEmptyString } from "../assertIsBoolean-Bv6gL-xe.js";
11
- import { t as isEmptyString } from "../isEmptyString-DFDtBbNr.js";
12
- import { t as normalizeSpaces } from "../normalizeSpaces-C1eLwykD.js";
13
- import { n as normalizeString, t as removeSpaces } from "../removeSpaces-B96axxP6.js";
10
+ import { A as isPlainObject, a as toPascalCase, c as toKebabCase, d as slugify, i as toPascalCaseSpace, k as isString, l as toCamelCase, o as toLowerCase, r as getPreciseType, s as toSnakeCase, u as toDotCase, w as isNumber, y as isNonEmptyString } from "../assertIsBoolean-9-huIcIR.js";
11
+ import { t as isEmptyString } from "../isEmptyString-pmcf-orv.js";
12
+ import { t as normalizeSpaces } from "../normalizeSpaces-DupusmF5.js";
13
+ import { n as normalizeString, t as removeSpaces } from "../removeSpaces-DpiJ1H1P.js";
14
14
  const capitalizeFirst = (string, options = {
15
15
  lowerCaseNextRest: true,
16
16
  trim: false
@@ -2,14 +2,14 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.13.0-beta.2`
5
+ * Version: `3.13.0`
6
6
  * Author: `Rizalvin Dwiky <rizalvindwiky@gmail.com>`
7
7
  * Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/utils-js`
8
8
  * ========================================================================
9
9
  */
10
10
  "use strict";
11
11
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
12
- const require_tailwind = require('../tailwind-C1YtxJ-K.cjs');
12
+ const require_tailwind = require('../tailwind-DhKiKZAc.cjs');
13
13
  exports.cnV3 = require_tailwind.cnV3;
14
14
  exports.cnV4 = require_tailwind.cnV4;
15
15
  exports.cnVer3 = require_tailwind.cnVer3;
@@ -2,11 +2,11 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.13.0-beta.2`
5
+ * Version: `3.13.0`
6
6
  * Author: `Rizalvin Dwiky <rizalvindwiky@gmail.com>`
7
7
  * Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/utils-js`
8
8
  * ========================================================================
9
9
  */
10
10
 
11
- import { a as customCnV4, c as cnV3, d as cnVer4, f as ClassObject, h as cx, i as customCnV3, l as cnV4, m as ClassValues, n as twMergeDefaultV3, o as customCnVer3, p as ClassValue, r as shouldForwardProp, s as customCnVer4, t as twMergeDefaultV4, u as cnVer3 } from "../index-z_uCh5KW.cjs";
11
+ import { a as customCnV4, c as cnV3, d as cnVer4, f as ClassObject, h as cx, i as customCnV3, l as cnV4, m as ClassValues, n as twMergeDefaultV3, o as customCnVer3, p as ClassValue, r as shouldForwardProp, s as customCnVer4, t as twMergeDefaultV4, u as cnVer3 } from "../index-DoteSYTy.cjs";
12
12
  export { ClassObject, ClassValue, ClassValues, cnV3, cnV4, cnVer3, cnVer4, customCnV3, customCnV4, customCnVer3, customCnVer4, cx, shouldForwardProp, twMergeDefaultV3, twMergeDefaultV4 };
@@ -2,11 +2,11 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.13.0-beta.2`
5
+ * Version: `3.13.0`
6
6
  * Author: `Rizalvin Dwiky <rizalvindwiky@gmail.com>`
7
7
  * Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/utils-js`
8
8
  * ========================================================================
9
9
  */
10
10
 
11
- import { a as customCnV4, c as cnV3, d as cnVer4, f as ClassObject, h as cx, i as customCnV3, l as cnV4, m as ClassValues, n as twMergeDefaultV3, o as customCnVer3, p as ClassValue, r as shouldForwardProp, s as customCnVer4, t as twMergeDefaultV4, u as cnVer3 } from "../index-DHHrLc0B.js";
11
+ import { a as customCnV4, c as cnV3, d as cnVer4, f as ClassObject, h as cx, i as customCnV3, l as cnV4, m as ClassValues, n as twMergeDefaultV3, o as customCnVer3, p as ClassValue, r as shouldForwardProp, s as customCnVer4, t as twMergeDefaultV4, u as cnVer3 } from "../index-bGRsmkyA.js";
12
12
  export { ClassObject, ClassValue, ClassValues, cnV3, cnV4, cnVer3, cnVer4, customCnV3, customCnV4, customCnVer3, customCnVer4, cx, shouldForwardProp, twMergeDefaultV3, twMergeDefaultV4 };
@@ -2,10 +2,10 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.13.0-beta.2`
5
+ * Version: `3.13.0`
6
6
  * Author: `Rizalvin Dwiky <rizalvindwiky@gmail.com>`
7
7
  * Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/utils-js`
8
8
  * ========================================================================
9
9
  */
10
- import { a as cnVer4, c as customCnVer3, d as twMergeDefaultV3, f as cx, i as cnVer3, l as customCnVer4, n as cnV3, o as customCnV3, r as cnV4, s as customCnV4, t as shouldForwardProp, u as twMergeDefaultV4 } from "../tailwind-BZ2_MeNX.js";
10
+ import { a as cnVer4, c as customCnVer3, d as twMergeDefaultV3, f as cx, i as cnVer3, l as customCnVer4, n as cnV3, o as customCnV3, r as cnV4, s as customCnV4, t as shouldForwardProp, u as twMergeDefaultV4 } from "../tailwind-CxI2DXpR.js";
11
11
  export { cnV3, cnV4, cnVer3, cnVer4, customCnV3, customCnV4, customCnVer3, customCnVer4, cx, shouldForwardProp, twMergeDefaultV3, twMergeDefaultV4 };