@rzl-zone/utils-js 3.12.1-beta.0 → 3.12.1-beta.1
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.
- package/README.md +7 -7
- package/dist/.references/index.d.cts +1 -1
- package/dist/.references/index.d.ts +1 -1
- package/dist/{assertIsArray-BChqwPiP.cjs → assertIsArray-DJXkjHZs.cjs} +3 -3
- package/dist/{assertIsArray-BChqwPiP.cjs.map → assertIsArray-DJXkjHZs.cjs.map} +1 -1
- package/dist/{assertIsArray-BfAbIUfa.js → assertIsArray-bTA3XLjq.js} +3 -3
- package/dist/{assertIsArray-BfAbIUfa.js.map → assertIsArray-bTA3XLjq.js.map} +1 -1
- package/dist/{assertIsBoolean-DozdtbNi.cjs → assertIsBoolean-C8WEXVr2.cjs} +8 -8
- package/dist/assertIsBoolean-C8WEXVr2.cjs.map +1 -0
- package/dist/{assertIsBoolean-BlBct0Fc.js → assertIsBoolean-DR1SaXPD.js} +8 -8
- package/dist/assertIsBoolean-DR1SaXPD.js.map +1 -0
- package/dist/{assertIsString-Bvk7bUL7.cjs → assertIsString-BiHQSrB2.cjs} +3 -3
- package/dist/{assertIsString-Bvk7bUL7.cjs.map → assertIsString-BiHQSrB2.cjs.map} +1 -1
- package/dist/{assertIsString-DqV9NwbI.js → assertIsString-CEB07_83.js} +3 -3
- package/dist/{assertIsString-DqV9NwbI.js.map → assertIsString-CEB07_83.js.map} +1 -1
- package/dist/assertions/index.cjs +5 -5
- package/dist/assertions/index.d.cts +2 -2
- package/dist/assertions/index.d.ts +2 -2
- package/dist/assertions/index.js +5 -5
- package/dist/conversions/index.cjs +6 -6
- package/dist/conversions/index.d.cts +2 -2
- package/dist/conversions/index.d.ts +2 -2
- package/dist/conversions/index.js +6 -6
- package/dist/{conversions-EMJa3g-D.js → conversions-BNIh_tCH.js} +16 -18
- package/dist/conversions-BNIh_tCH.js.map +1 -0
- package/dist/{conversions-CBs8-REq.cjs → conversions-D_Kh0a_C.cjs} +16 -18
- package/dist/conversions-D_Kh0a_C.cjs.map +1 -0
- package/dist/events/index.cjs +4 -4
- package/dist/events/index.cjs.map +1 -1
- package/dist/events/index.d.cts +153 -151
- package/dist/events/index.d.ts +153 -151
- package/dist/events/index.js +4 -4
- package/dist/events/index.js.map +1 -1
- package/dist/{formatEnvPort-hHNvOim-.cjs → formatEnvPort-B3OLxQk9.cjs} +9 -9
- package/dist/formatEnvPort-B3OLxQk9.cjs.map +1 -0
- package/dist/{formatEnvPort-DpIXzPAZ.js → formatEnvPort-ByFVLjSV.js} +9 -9
- package/dist/formatEnvPort-ByFVLjSV.js.map +1 -0
- package/dist/formatters/index.cjs +2 -2
- package/dist/formatters/index.d.cts +2 -2
- package/dist/formatters/index.d.ts +2 -2
- package/dist/formatters/index.js +2 -2
- package/dist/{formatters-QcZO_Cpx.js → formatters--1m_vpE8.js} +17 -15
- package/dist/formatters--1m_vpE8.js.map +1 -0
- package/dist/{formatters-lAYgA11L.cjs → formatters-Cbij0XLU.cjs} +17 -15
- package/dist/formatters-Cbij0XLU.cjs.map +1 -0
- package/dist/generators/index.cjs +12 -8
- package/dist/generators/index.cjs.map +1 -1
- package/dist/generators/index.d.cts +2 -2
- package/dist/generators/index.d.ts +2 -2
- package/dist/generators/index.js +12 -8
- package/dist/generators/index.js.map +1 -1
- package/dist/index-59zbLcPr.d.ts +340 -0
- package/dist/index-B6tawc8L.d.cts +1716 -0
- package/dist/index-C267akkJ.d.ts +2158 -0
- package/dist/index-CeBC2Vvl.d.cts +2361 -0
- package/dist/index-CgRDTI6f.d.ts +822 -0
- package/dist/index-CoiUBVmr.d.ts +720 -0
- package/dist/index-D4fcasfZ.d.cts +720 -0
- package/dist/index-DDrSQKIc.d.ts +1716 -0
- package/dist/index-DsGxO31H.d.cts +765 -0
- package/dist/index-Hg1qJkjl.d.ts +765 -0
- package/dist/index-Qm3iFwd0.d.cts +2158 -0
- package/dist/index-UPp94Agr.d.ts +2361 -0
- package/dist/index-gBA_8SuF.d.cts +340 -0
- package/dist/index-jyDqzicx.d.cts +822 -0
- package/dist/{isBigInt-B1cijjqm.cjs → isBigInt-C4krUeAw.cjs} +2 -2
- package/dist/{isBigInt-B1cijjqm.cjs.map → isBigInt-C4krUeAw.cjs.map} +1 -1
- package/dist/{isBigInt-C0bN0Rhu.js → isBigInt-DKe0M6hp.js} +2 -2
- package/dist/{isBigInt-C0bN0Rhu.js.map → isBigInt-DKe0M6hp.js.map} +1 -1
- package/dist/{isEmptyObject-DeLVIJpl.js → isEmptyObject-DCipFwxJ.js} +3 -3
- package/dist/{isEmptyObject-DeLVIJpl.js.map → isEmptyObject-DCipFwxJ.js.map} +1 -1
- package/dist/{isEmptyObject-DI42NEo0.cjs → isEmptyObject-ZkSwRC_D.cjs} +3 -3
- package/dist/{isEmptyObject-DI42NEo0.cjs.map → isEmptyObject-ZkSwRC_D.cjs.map} +1 -1
- package/dist/{isEmptyString-BTUWYTbw.js → isEmptyString-BXzKAC2j.js} +3 -3
- package/dist/{isEmptyString-BTUWYTbw.js.map → isEmptyString-BXzKAC2j.js.map} +1 -1
- package/dist/{isEmptyString-CCK3bP74.cjs → isEmptyString-UiiUsSQj.cjs} +3 -3
- package/dist/{isEmptyString-CCK3bP74.cjs.map → isEmptyString-UiiUsSQj.cjs.map} +1 -1
- package/dist/{isEmptyValue-DMSMFTU8.cjs → isEmptyValue-BQzcjVaL.cjs} +5 -5
- package/dist/{isEmptyValue-DMSMFTU8.cjs.map → isEmptyValue-BQzcjVaL.cjs.map} +1 -1
- package/dist/{isEmptyValue-fjnfQnt5.js → isEmptyValue-jqOr7OHD.js} +5 -5
- package/dist/{isEmptyValue-fjnfQnt5.js.map → isEmptyValue-jqOr7OHD.js.map} +1 -1
- package/dist/{isEqual-DhyP8fB_.js → isEqual-BX49cF9m.js} +4 -4
- package/dist/{isEqual-DhyP8fB_.js.map → isEqual-BX49cF9m.js.map} +1 -1
- package/dist/{isEqual-B1fRgEuU.cjs → isEqual-BvumA3RA.cjs} +4 -4
- package/dist/{isEqual-B1fRgEuU.cjs.map → isEqual-BvumA3RA.cjs.map} +1 -1
- package/dist/{isFinite-BYMOo0os.js → isFinite-BCnaDpod.js} +3 -3
- package/dist/{isFinite-BYMOo0os.js.map → isFinite-BCnaDpod.js.map} +1 -1
- package/dist/{isFinite-sFkps2TY.cjs → isFinite-D24ZaE6c.cjs} +3 -3
- package/dist/{isFinite-sFkps2TY.cjs.map → isFinite-D24ZaE6c.cjs.map} +1 -1
- package/dist/{isInteger-FTCthMre.cjs → isInteger-Caeuz0rB.cjs} +2 -2
- package/dist/{isInteger-FTCthMre.cjs.map → isInteger-Caeuz0rB.cjs.map} +1 -1
- package/dist/{isInteger-DS9V7l_f.js → isInteger-naMbJsxJ.js} +2 -2
- package/dist/{isInteger-DS9V7l_f.js.map → isInteger-naMbJsxJ.js.map} +1 -1
- package/dist/isPlainObject-BF-2-phb.d.cts +339 -0
- package/dist/isPlainObject-DxNDL8XU.d.ts +339 -0
- package/dist/{isServer-q-QLFCqE.cjs → isServer-BJHVnixd.cjs} +2 -2
- package/dist/{isServer-q-QLFCqE.cjs.map → isServer-BJHVnixd.cjs.map} +1 -1
- package/dist/{isServer-D1TXfOs3.js → isServer-Da3o3XSs.js} +2 -2
- package/dist/{isServer-D1TXfOs3.js.map → isServer-Da3o3XSs.js.map} +1 -1
- package/dist/{isTypedArray-47R0wdrc.js → isTypedArray-DuNA8tK6.js} +3 -3
- package/dist/{isTypedArray-47R0wdrc.js.map → isTypedArray-DuNA8tK6.js.map} +1 -1
- package/dist/{isTypedArray-DiCoqffZ.cjs → isTypedArray-TJptiw2b.cjs} +3 -3
- package/dist/{isTypedArray-DiCoqffZ.cjs.map → isTypedArray-TJptiw2b.cjs.map} +1 -1
- package/dist/{isURL-CQiowFq2.js → isURL-C-kSk6KJ.js} +2 -2
- package/dist/{isURL-CQiowFq2.js.map → isURL-C-kSk6KJ.js.map} +1 -1
- package/dist/{isURL-WZypXsax.cjs → isURL-DeUPO_oR.cjs} +2 -2
- package/dist/{isURL-WZypXsax.cjs.map → isURL-DeUPO_oR.cjs.map} +1 -1
- package/dist/{isValidDomain-BSXshgkC.cjs → isValidDomain-BB9IGhJs.cjs} +65 -8
- package/dist/isValidDomain-BB9IGhJs.cjs.map +1 -0
- package/dist/{isValidDomain-DwA2EN79.js → isValidDomain-DoE98yhJ.js} +54 -9
- package/dist/isValidDomain-DoE98yhJ.js.map +1 -0
- package/dist/next/index.cjs +7 -7
- package/dist/next/index.cjs.map +1 -1
- package/dist/next/index.d.cts +185 -191
- package/dist/next/index.d.ts +185 -191
- package/dist/next/index.js +7 -7
- package/dist/next/index.js.map +1 -1
- package/dist/next/server/index.cjs +2 -2
- package/dist/next/server/index.d.cts +26 -26
- package/dist/next/server/index.d.ts +26 -26
- package/dist/next/server/index.js +2 -2
- package/dist/{noop-B2mTBhW-.cjs → noop-B13_ii35.cjs} +2 -2
- package/dist/{noop-B2mTBhW-.cjs.map → noop-B13_ii35.cjs.map} +1 -1
- package/dist/{noop-BzktGBVz.js → noop-ubqAIbHD.js} +2 -2
- package/dist/{noop-BzktGBVz.js.map → noop-ubqAIbHD.js.map} +1 -1
- package/dist/{normalizeSpaces-WS_iERJk.js → normalizeSpaces-Bg2IZW7W.js} +3 -3
- package/dist/{normalizeSpaces-WS_iERJk.js.map → normalizeSpaces-Bg2IZW7W.js.map} +1 -1
- package/dist/{normalizeSpaces-DQHR3Tlr.cjs → normalizeSpaces-ZXnR4Qzp.cjs} +3 -3
- package/dist/{normalizeSpaces-DQHR3Tlr.cjs.map → normalizeSpaces-ZXnR4Qzp.cjs.map} +1 -1
- package/dist/{normalizeString-2WLth_Gj.js → normalizeString-BDdkaXui.js} +3 -3
- package/dist/{normalizeString-2WLth_Gj.js.map → normalizeString-BDdkaXui.js.map} +1 -1
- package/dist/{normalizeString-D8euBcRD.cjs → normalizeString-BE6ELqEb.cjs} +3 -3
- package/dist/{normalizeString-D8euBcRD.cjs.map → normalizeString-BE6ELqEb.cjs.map} +1 -1
- package/dist/operations/index.cjs +10 -10
- package/dist/operations/index.cjs.map +1 -1
- package/dist/operations/index.d.cts +120 -120
- package/dist/operations/index.d.ts +120 -120
- package/dist/operations/index.js +10 -10
- package/dist/operations/index.js.map +1 -1
- package/dist/parsers/index.cjs +2 -2
- package/dist/parsers/index.d.cts +222 -222
- package/dist/parsers/index.d.ts +222 -222
- package/dist/parsers/index.js +2 -2
- package/dist/{parsers-Dpuq-V4u.js → parsers-BSBPgvsq.js} +4 -4
- package/dist/{parsers-Dpuq-V4u.js.map → parsers-BSBPgvsq.js.map} +1 -1
- package/dist/{parsers-DXtpsDyj.cjs → parsers-OqDeffqc.cjs} +4 -4
- package/dist/{parsers-DXtpsDyj.cjs.map → parsers-OqDeffqc.cjs.map} +1 -1
- package/dist/{parsing-B43x1sxn.js → parsing-Cao8b358.js} +3 -3
- package/dist/{parsing-B43x1sxn.js.map → parsing-Cao8b358.js.map} +1 -1
- package/dist/{parsing-lRoxn1Nz.cjs → parsing-DOGSCH6N.cjs} +3 -3
- package/dist/{parsing-lRoxn1Nz.cjs.map → parsing-DOGSCH6N.cjs.map} +1 -1
- package/dist/predicates/index.cjs +15 -15
- package/dist/predicates/index.d.cts +3 -3
- package/dist/predicates/index.d.ts +3 -3
- package/dist/predicates/index.js +15 -15
- package/dist/{predicates-gNepszvo.js → predicates-Bj6meyXV.js} +13 -14
- package/dist/{predicates-gNepszvo.js.map → predicates-Bj6meyXV.js.map} +1 -1
- package/dist/{predicates-DiaYA7Ps.cjs → predicates-D0ubqgqy.cjs} +13 -14
- package/dist/{predicates-DiaYA7Ps.cjs.map → predicates-D0ubqgqy.cjs.map} +1 -1
- package/dist/promises/index.cjs +4 -4
- package/dist/promises/index.d.cts +101 -101
- package/dist/promises/index.d.ts +101 -101
- package/dist/promises/index.js +4 -4
- package/dist/{punyCode-hmiFzLWT.js → punyCode-8SrbMWfM.js} +6 -6
- package/dist/punyCode-8SrbMWfM.js.map +1 -0
- package/dist/{punyCode-CTWXVVFo.cjs → punyCode-D-Qu6nj6.cjs} +6 -6
- package/dist/punyCode-D-Qu6nj6.cjs.map +1 -0
- package/dist/{removeSpaces-BE8lfh-4.js → removeSpaces-Bmc5DX4F.js} +3 -3
- package/dist/removeSpaces-Bmc5DX4F.js.map +1 -0
- package/dist/{removeSpaces-DRRxNWlb.cjs → removeSpaces-CWIvhZHg.cjs} +3 -3
- package/dist/removeSpaces-CWIvhZHg.cjs.map +1 -0
- package/dist/rzl-utils.global.js +21 -0
- package/dist/{safeJsonParse-CXruaP0p.js → safeJsonParse-BP38mwlj.js} +9 -9
- package/dist/safeJsonParse-BP38mwlj.js.map +1 -0
- package/dist/{safeJsonParse-BBnQElk8.cjs → safeJsonParse-Sms2CJf4.cjs} +9 -9
- package/dist/safeJsonParse-Sms2CJf4.cjs.map +1 -0
- package/dist/{safeStableStringify-Cc62pfRp.cjs → safeStableStringify-CJtP89qn.cjs} +4 -4
- package/dist/{safeStableStringify-Cc62pfRp.cjs.map → safeStableStringify-CJtP89qn.cjs.map} +1 -1
- package/dist/{safeStableStringify-BNh3D0K0.js → safeStableStringify-CXOZ9Ub8.js} +4 -4
- package/dist/{safeStableStringify-BNh3D0K0.js.map → safeStableStringify-CXOZ9Ub8.js.map} +1 -1
- package/dist/strings/index.cjs +12 -9
- package/dist/strings/index.cjs.map +1 -1
- package/dist/strings/index.d.cts +2 -2
- package/dist/strings/index.d.ts +2 -2
- package/dist/strings/index.js +12 -9
- package/dist/strings/index.js.map +1 -1
- package/dist/tailwind/index.cjs +2 -2
- package/dist/tailwind/index.d.cts +2 -2
- package/dist/tailwind/index.d.ts +2 -2
- package/dist/tailwind/index.js +2 -2
- package/dist/{tailwind-IJvOdkZp.js → tailwind-B2ssevxq.js} +5 -5
- package/dist/tailwind-B2ssevxq.js.map +1 -0
- package/dist/{tailwind-DJ4cmLUw.cjs → tailwind-CHIx9uxu.cjs} +5 -5
- package/dist/tailwind-CHIx9uxu.cjs.map +1 -0
- package/dist/{toStringArrayUnRecursive-xUaU8Ot9.cjs → toStringArrayUnRecursive-C4zYCja7.cjs} +6 -6
- package/dist/{toStringArrayUnRecursive-xUaU8Ot9.cjs.map → toStringArrayUnRecursive-C4zYCja7.cjs.map} +1 -1
- package/dist/{toStringArrayUnRecursive-CFs0jTEg.js → toStringArrayUnRecursive-DJGtPsFb.js} +6 -6
- package/dist/{toStringArrayUnRecursive-CFs0jTEg.js.map → toStringArrayUnRecursive-DJGtPsFb.js.map} +1 -1
- package/dist/urls/index.cjs +15 -14
- package/dist/urls/index.cjs.map +1 -1
- package/dist/urls/index.d.cts +656 -659
- package/dist/urls/index.d.ts +656 -659
- package/dist/urls/index.js +15 -14
- package/dist/urls/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/assertIsBoolean-BlBct0Fc.js.map +0 -1
- package/dist/assertIsBoolean-DozdtbNi.cjs.map +0 -1
- package/dist/conversions-CBs8-REq.cjs.map +0 -1
- package/dist/conversions-EMJa3g-D.js.map +0 -1
- package/dist/formatEnvPort-DpIXzPAZ.js.map +0 -1
- package/dist/formatEnvPort-hHNvOim-.cjs.map +0 -1
- package/dist/formatters-QcZO_Cpx.js.map +0 -1
- package/dist/formatters-lAYgA11L.cjs.map +0 -1
- package/dist/index-26W7ItWx.d.ts +0 -760
- package/dist/index-BPPQjAfs.d.cts +0 -2359
- package/dist/index-BXjlgBLz.d.cts +0 -2139
- package/dist/index-B_Wwo91H.d.ts +0 -2359
- package/dist/index-CpufydcI.d.cts +0 -704
- package/dist/index-Czc4O526.d.ts +0 -333
- package/dist/index-DPs1_p5G.d.cts +0 -760
- package/dist/index-DRpOyBSC.d.ts +0 -1703
- package/dist/index-DWWvtHUn.d.cts +0 -822
- package/dist/index-DnM0LD0n.d.cts +0 -333
- package/dist/index-GUZ9fK6T.d.ts +0 -2139
- package/dist/index-I4fAzwXV.d.ts +0 -704
- package/dist/index-JDrOl_19.d.ts +0 -822
- package/dist/index-b66P49Qe.d.cts +0 -1703
- package/dist/isPlainObject-DcFGh3_5.d.ts +0 -530
- package/dist/isPlainObject-doTI11Ib.d.cts +0 -530
- package/dist/isValidDomain-BSXshgkC.cjs.map +0 -1
- package/dist/isValidDomain-DwA2EN79.js.map +0 -1
- package/dist/punyCode-CTWXVVFo.cjs.map +0 -1
- package/dist/punyCode-hmiFzLWT.js.map +0 -1
- package/dist/removeSpaces-BE8lfh-4.js.map +0 -1
- package/dist/removeSpaces-DRRxNWlb.cjs.map +0 -1
- package/dist/safeJsonParse-BBnQElk8.cjs.map +0 -1
- package/dist/safeJsonParse-CXruaP0p.js.map +0 -1
- package/dist/tailwind-DJ4cmLUw.cjs.map +0 -1
- package/dist/tailwind-IJvOdkZp.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"punyCode-CTWXVVFo.cjs","names":["getPreciseType"],"sources":["../src/urls/utils/punyCode.ts"],"sourcesContent":["/** ---------------------------------------------------------\n * * ***Constants for `Punycode-UtilsJS` algorithm.***\n * ---------------------------------------------------------\n * These constants are used internally for encoding and decoding.\n *\n * Unicode domain names to ASCII (`Punycode-UtilsJS`) and vice versa.\n */\n\nimport { getPreciseType } from \"@/predicates/type/getPreciseType\";\nimport { assertIsString } from \"@/assertions/strings/assertIsString\";\n\n/** Constant `maxInt` for validate. */\nconst maxInt = 2147483647;\n\n/** Bootstring parameters for `Punycode-UtilsJS`. */\nconst base = 36,\n tMin = 1,\n tMax = 26,\n skew = 38,\n damp = 700;\n\n/** Initial bias and code point. */\nconst initialBias = 72,\n initialN = 128,\n delimiter = \"-\";\n\n/** Regular expressions used internally.\n * Matches `Punycode-UtilsJS` prefix.\n */\nconst regexPunycode = /^xn--/;\n/** Regular expressions used internally.\n * Matches non-ASCII chars.\n */\nconst regexNonASCII = /[^\\0-\\x7F]/;\n/** Regular expressions used internally.\n * Matches domain label separators.\n */\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g;\n\n/** Error messages used internally */\nconst errors: Record<string, string> = {\n overflow: \"Overflow: input needs wider integers to process\",\n \"not-basic\": \"Illegal input >= 0x80 (not a basic code point)\",\n \"invalid-input\": \"Invalid input\"\n};\n\n/** Aliases of `Math.floor`. */\nconst floor = Math.floor;\n/** Aliases of `String.fromCharCode`. */\nconst stringFromCharCode = String.fromCharCode;\n\n/** ---------------------------------------------------------\n * * ***Throws a RangeError with a predefined error message.***\n * ---------------------------------------------------------\n * @param type - Key of the error type to throw.\n */\nfunction error(type: keyof typeof errors): never {\n throw new RangeError(errors[type]);\n}\n\n/** ---------------------------------------------------------\n * * ***Maps an array using a callback function.***\n * ---------------------------------------------------------\n * @param array - Array to transform.\n * @param fn - Function to apply to each element.\n * @returns Transformed array.\n */\nfunction map<T, U>(array: T[], fn: (v: T) => U): U[] {\n const result: U[] = [];\n let length = array.length;\n while (length--) result[length] = fn(array[length]);\n return result;\n}\n\n/** ---------------------------------------------------------\n * * ***Maps a domain name using a callback on each label.***\n * ---------------------------------------------------------\n * Handles email-like domains (local@domain).\n * @param domain - Domain string to process.\n * @param fn - Function applied to each domain label.\n * @returns Transformed domain string.\n */\nfunction mapDomain(domain: string, fn: (v: string) => string): string {\n const parts = domain.split(\"@\");\n let result = \"\";\n if (parts.length > 1) {\n result = parts[0] + \"@\";\n domain = parts[1];\n }\n domain = domain.replace(regexSeparators, \"\\x2E\");\n const labels = domain.split(\".\");\n return result + map(labels, fn).join(\".\");\n}\n\n/** ---------------------------------------------------------\n * * ***Converts a UCS-2 encoded string to an array of Unicode code points.***\n * ---------------------------------------------------------\n * @param input - String to decode.\n * @returns Array of Unicode code points.\n */\nfunction ucs2decode(input: string): number[] {\n assertIsString(input, {\n message: ({ currentType, validType }) =>\n `Utils \\`punycodeUtilsJS.ucs2.decode\\`, parameter \\`input\\` must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const output: number[] = [];\n let counter = 0;\n const length = input.length;\n while (counter < length) {\n const value = input.charCodeAt(counter++);\n if (value >= 0xd800 && value <= 0xdbff && counter < length) {\n const extra = input.charCodeAt(counter++);\n if ((extra & 0xfc00) === 0xdc00)\n output.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000);\n else {\n output.push(value);\n counter--;\n }\n } else output.push(value);\n }\n return output;\n}\n\n/** ---------------------------------------------------------\n * * ***Encodes an array of Unicode code points to a string.***\n * ---------------------------------------------------------\n * @param points - Array of Unicode code points.\n * @returns Encoded string.\n */\nconst ucs2encode = (points: number[]): string => {\n if (\n !Array.isArray(points) ||\n !points.every((p) => typeof p === \"number\" && Number.isFinite(p))\n ) {\n throw new TypeError(\n `Utils \\`punycodeUtilsJS.ucs2.encode\\`, parameter \\`points\\` must be an array of numbers, but received: \\`${getPreciseType(\n points\n )}\\`.`\n );\n }\n\n return String.fromCodePoint(...points);\n};\n\n/** ---------------------------------------------------------\n * * ***Converts a basic code point to its digit value for `Punycode-UtilsJS`.***\n * ---------------------------------------------------------\n * @param codePoint - Unicode code point.\n * @returns Digit value.\n */\nfunction basicToDigit(codePoint: number): number {\n if (codePoint >= 0x30 && codePoint < 0x3a) return 26 + (codePoint - 0x30);\n if (codePoint >= 0x41 && codePoint < 0x5b) return codePoint - 0x41;\n if (codePoint >= 0x61 && codePoint < 0x7b) return codePoint - 0x61;\n return base;\n}\n\n/** ---------------------------------------------------------\n * * ***Converts a digit to a basic code point for `Punycode-UtilsJS`.***\n * ---------------------------------------------------------\n * @param digit - Numeric value.\n * @param flag - Bias flag (0 or 1).\n * @returns Code point.\n */\nfunction digitToBasic(digit: number, flag: number): number {\n return digit + 22 + 75 * (digit < 26 ? 1 : 0) - Number(flag !== 0) * 32;\n}\n\n/** ---------------------------------------------------------\n * * ***Bias adaptation function for `Punycode-UtilsJS` encoding/decoding.***\n * ---------------------------------------------------------\n * @param delta - Delta value.\n * @param numPoints - Number of code points.\n * @param firstTime - Indicates first adaptation.\n * @returns Adapted bias.\n */\nfunction adapt(delta: number, numPoints: number, firstTime: boolean): number {\n let k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n while (delta > ((base - tMin) * tMax) >> 1) {\n delta = floor(delta / (base - tMin));\n k += base;\n }\n return floor(k + ((base - tMin + 1) * delta) / (delta + skew));\n}\n\n/** ---------------------------------------------------------\n * * ***Decodes a `Punycode-UtilsJS` string to Unicode.***\n * ---------------------------------------------------------\n * @param input - `Punycode-UtilsJS` string.\n * @returns Decoded Unicode string.\n */\nfunction decode(input: string): string {\n assertIsString(input, {\n message: ({ currentType, validType }) =>\n `Utils \\`punycodeUtilsJS.decode\\`, parameter \\`input\\` must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const output: number[] = [];\n const inputLength = input.length;\n let i = 0,\n n = initialN,\n bias = initialBias;\n\n let basic = input.lastIndexOf(delimiter);\n if (basic < 0) basic = 0;\n\n for (let j = 0; j < basic; j++) {\n if (input.charCodeAt(j) >= 0x80) error(\"not-basic\");\n output.push(input.charCodeAt(j));\n }\n\n for (let index = basic > 0 ? basic + 1 : 0; index < inputLength; ) {\n const oldi = i;\n let w = 1;\n for (let k = base; ; k += base) {\n if (index >= inputLength) error(\"invalid-input\");\n const digit = basicToDigit(input.charCodeAt(index++));\n if (digit >= base) error(\"invalid-input\");\n if (digit > floor((maxInt - i) / w)) error(\"overflow\");\n i += digit * w;\n const t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n if (digit < t) break;\n const baseMinusT = base - t;\n if (w > floor(maxInt / baseMinusT)) error(\"overflow\");\n w *= baseMinusT;\n }\n const out = output.length + 1;\n bias = adapt(i - oldi, out, oldi === 0);\n if (floor(i / out) > maxInt - n) error(\"overflow\");\n n += floor(i / out);\n i %= out;\n output.splice(i++, 0, n);\n }\n return String.fromCodePoint(...output);\n}\n\n/** ---------------------------------------------------------\n * * ***Encodes a Unicode string to `Punycode-UtilsJS`.***\n * ---------------------------------------------------------\n * @param input - Unicode string.\n * @returns `Punycode-UtilsJS` string.\n */\nfunction encode(input: string): string {\n assertIsString(input, {\n message: ({ currentType, validType }) =>\n `Utils \\`punycodeUtilsJS.encode\\`, parameter \\`input\\` must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const output: string[] = [];\n const points = ucs2decode(input);\n const inputLength = points.length;\n let n = initialN,\n delta = 0,\n bias = initialBias;\n\n for (const cp of points) if (cp < 0x80) output.push(stringFromCharCode(cp));\n const basicLength = output.length;\n let handledCPCount = basicLength;\n if (basicLength) output.push(delimiter);\n\n while (handledCPCount < inputLength) {\n let m = maxInt;\n for (const cp of points) if (cp >= n && cp < m) m = cp;\n\n const handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne))\n error(\"overflow\");\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (const cp of points) {\n if (cp < n) delta++;\n if (cp === n) {\n let q = delta;\n for (let k = base; ; k += base) {\n const t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n if (q < t) break;\n output.push(\n stringFromCharCode(digitToBasic(t + ((q - t) % (base - t)), 0))\n );\n q = floor((q - t) / (base - t));\n }\n output.push(stringFromCharCode(digitToBasic(q, 0)));\n bias = adapt(\n delta,\n handledCPCountPlusOne,\n handledCPCount === basicLength\n );\n delta = 0;\n handledCPCount++;\n }\n }\n delta++;\n n++;\n }\n\n return output.join(\"\");\n}\n\n/** ---------------------------------------------------------\n * * ***Converts `Punycode-UtilsJS` to Unicode for domain names.***\n * ---------------------------------------------------------\n * @param input - Domain or label.\n * @returns Unicode string.\n */\nfunction toUnicode(input: string): string {\n assertIsString(input, {\n message: ({ currentType, validType }) =>\n `Utils \\`punycodeUtilsJS.toUnicode\\`, parameter \\`input\\` must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n return mapDomain(input, (str) =>\n regexPunycode.test(str) ? decode(str.slice(4).toLowerCase()) : str\n );\n}\n\n/** ---------------------------------------------------------\n * * ***Converts Unicode to ASCII (`Punycode-UtilsJS`) for domain names.***\n * ---------------------------------------------------------\n * @param input - Domain or label.\n * @returns ASCII string.\n */\nfunction toASCII(input: string): string {\n assertIsString(input, {\n message: ({ currentType, validType }) =>\n `Utils \\`punycodeUtilsJS.toASCII\\`, parameter \\`input\\` must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n return mapDomain(input, (str) =>\n regexNonASCII.test(str) ? \"xn--\" + encode(str) : str\n );\n}\n\ntype PunycodeUtilsJS = {\n /** ---------------------------------------------------------\n * * ***Version of the `Punycode-UtilsJS` implementation.***\n * ---------------------------------------------------------\n *\n * @example\n * console.log(punycodeUtilsJS.version); // \"1.0.0\"\n */\n version: string;\n /** ---------------------------------------------------------\n * * ***UCS-2 utility functions.***\n * ---------------------------------------------------------\n */\n ucs2: {\n /** ---------------------------------------------------------\n * * ***Decodes a UCS-2 encoded string to an array of Unicode code points.***\n * ---------------------------------------------------------\n *\n * @param input - The UCS-2 string to decode.\n * @returns Array of Unicode code points.\n * @example\n * punycodeUtilsJS.ucs2.decode(\"𐍈\");\n * // ➔ [66376]\n */\n decode: (input: string) => number[];\n /** ---------------------------------------------------------\n * * ***Encodes an array of Unicode code points to a UCS-2 string.***\n * ---------------------------------------------------------\n *\n * @param points - Array of Unicode code points.\n * @returns Encoded string.\n * @example\n * punycodeUtilsJS.ucs2.encode([66376]);\n * // ➔ \"𐍈\"\n */\n encode: (points: number[]) => string;\n };\n /** ---------------------------------------------------------\n * * ***Decodes a `Punycode-UtilsJS` string to a Unicode string.***\n * ---------------------------------------------------------\n *\n * @param input - The `Punycode-UtilsJS` string to decode.\n * @returns Decoded Unicode string.\n * @example\n * punycodeUtilsJS.decode(\"xn--fsq\");\n * // ➔ \"ü\"\n */\n decode: (input: string) => string;\n /** ---------------------------------------------------------\n * * ***Encodes a Unicode string to `Punycode-UtilsJS`.***\n * ---------------------------------------------------------\n *\n * @param input - Unicode string to encode.\n * @returns `Punycode-UtilsJS` string.\n * @example\n * punycodeUtilsJS.encode(\"ü\");\n * // ➔ \"xn--fsq\"\n */\n encode: (input: string) => string;\n /** ---------------------------------------------------------\n * * ***Converts a Unicode domain or label to ASCII (`Punycode-UtilsJS`).***\n * ---------------------------------------------------------\n *\n * @param input - Domain or label string.\n * @returns ASCII string suitable for DNS.\n * @example\n * punycodeUtilsJS.toASCII(\"пример.рф\");\n * // ➔ \"xn--e1afmkfd.xn--p1ai\"\n */\n toASCII: (input: string) => string;\n /** ---------------------------------------------------------\n * * ***Converts an ASCII (`Punycode-UtilsJS`) domain or label to Unicode.***\n * ---------------------------------------------------------\n *\n * @param input - ASCII string (with xn-- prefix if needed).\n * @returns Unicode string.\n * @example\n * punycodeUtilsJS.toUnicode(\"xn--e1afmkfd.xn--p1ai\");\n * // ➔ \"пример.рф\"\n */\n toUnicode: (input: string) => string;\n};\n\n/** ---------------------------------------------------------\n * * ***`Punycode-UtilsJS` object exposing all API functions and version.***\n * ---------------------------------------------------------\n * Provides encoding and decoding of Unicode domain names to ASCII (`Punycode-UtilsJS`)\n * and vice versa.\n *\n * - Useful for IDN (Internationalized Domain Names) support.\n */\nconst punycodeUtilsJS: PunycodeUtilsJS = {\n version: \"1.0.0\",\n ucs2: {\n decode: ucs2decode,\n encode: ucs2encode\n },\n decode: decode,\n encode: encode,\n toASCII: toASCII,\n toUnicode: toUnicode\n};\n\n/** Export individual functions */\nexport { punycodeUtilsJS };\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"punyCode-hmiFzLWT.js","names":[],"sources":["../src/urls/utils/punyCode.ts"],"sourcesContent":["/** ---------------------------------------------------------\n * * ***Constants for `Punycode-UtilsJS` algorithm.***\n * ---------------------------------------------------------\n * These constants are used internally for encoding and decoding.\n *\n * Unicode domain names to ASCII (`Punycode-UtilsJS`) and vice versa.\n */\n\nimport { getPreciseType } from \"@/predicates/type/getPreciseType\";\nimport { assertIsString } from \"@/assertions/strings/assertIsString\";\n\n/** Constant `maxInt` for validate. */\nconst maxInt = 2147483647;\n\n/** Bootstring parameters for `Punycode-UtilsJS`. */\nconst base = 36,\n tMin = 1,\n tMax = 26,\n skew = 38,\n damp = 700;\n\n/** Initial bias and code point. */\nconst initialBias = 72,\n initialN = 128,\n delimiter = \"-\";\n\n/** Regular expressions used internally.\n * Matches `Punycode-UtilsJS` prefix.\n */\nconst regexPunycode = /^xn--/;\n/** Regular expressions used internally.\n * Matches non-ASCII chars.\n */\nconst regexNonASCII = /[^\\0-\\x7F]/;\n/** Regular expressions used internally.\n * Matches domain label separators.\n */\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g;\n\n/** Error messages used internally */\nconst errors: Record<string, string> = {\n overflow: \"Overflow: input needs wider integers to process\",\n \"not-basic\": \"Illegal input >= 0x80 (not a basic code point)\",\n \"invalid-input\": \"Invalid input\"\n};\n\n/** Aliases of `Math.floor`. */\nconst floor = Math.floor;\n/** Aliases of `String.fromCharCode`. */\nconst stringFromCharCode = String.fromCharCode;\n\n/** ---------------------------------------------------------\n * * ***Throws a RangeError with a predefined error message.***\n * ---------------------------------------------------------\n * @param type - Key of the error type to throw.\n */\nfunction error(type: keyof typeof errors): never {\n throw new RangeError(errors[type]);\n}\n\n/** ---------------------------------------------------------\n * * ***Maps an array using a callback function.***\n * ---------------------------------------------------------\n * @param array - Array to transform.\n * @param fn - Function to apply to each element.\n * @returns Transformed array.\n */\nfunction map<T, U>(array: T[], fn: (v: T) => U): U[] {\n const result: U[] = [];\n let length = array.length;\n while (length--) result[length] = fn(array[length]);\n return result;\n}\n\n/** ---------------------------------------------------------\n * * ***Maps a domain name using a callback on each label.***\n * ---------------------------------------------------------\n * Handles email-like domains (local@domain).\n * @param domain - Domain string to process.\n * @param fn - Function applied to each domain label.\n * @returns Transformed domain string.\n */\nfunction mapDomain(domain: string, fn: (v: string) => string): string {\n const parts = domain.split(\"@\");\n let result = \"\";\n if (parts.length > 1) {\n result = parts[0] + \"@\";\n domain = parts[1];\n }\n domain = domain.replace(regexSeparators, \"\\x2E\");\n const labels = domain.split(\".\");\n return result + map(labels, fn).join(\".\");\n}\n\n/** ---------------------------------------------------------\n * * ***Converts a UCS-2 encoded string to an array of Unicode code points.***\n * ---------------------------------------------------------\n * @param input - String to decode.\n * @returns Array of Unicode code points.\n */\nfunction ucs2decode(input: string): number[] {\n assertIsString(input, {\n message: ({ currentType, validType }) =>\n `Utils \\`punycodeUtilsJS.ucs2.decode\\`, parameter \\`input\\` must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const output: number[] = [];\n let counter = 0;\n const length = input.length;\n while (counter < length) {\n const value = input.charCodeAt(counter++);\n if (value >= 0xd800 && value <= 0xdbff && counter < length) {\n const extra = input.charCodeAt(counter++);\n if ((extra & 0xfc00) === 0xdc00)\n output.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000);\n else {\n output.push(value);\n counter--;\n }\n } else output.push(value);\n }\n return output;\n}\n\n/** ---------------------------------------------------------\n * * ***Encodes an array of Unicode code points to a string.***\n * ---------------------------------------------------------\n * @param points - Array of Unicode code points.\n * @returns Encoded string.\n */\nconst ucs2encode = (points: number[]): string => {\n if (\n !Array.isArray(points) ||\n !points.every((p) => typeof p === \"number\" && Number.isFinite(p))\n ) {\n throw new TypeError(\n `Utils \\`punycodeUtilsJS.ucs2.encode\\`, parameter \\`points\\` must be an array of numbers, but received: \\`${getPreciseType(\n points\n )}\\`.`\n );\n }\n\n return String.fromCodePoint(...points);\n};\n\n/** ---------------------------------------------------------\n * * ***Converts a basic code point to its digit value for `Punycode-UtilsJS`.***\n * ---------------------------------------------------------\n * @param codePoint - Unicode code point.\n * @returns Digit value.\n */\nfunction basicToDigit(codePoint: number): number {\n if (codePoint >= 0x30 && codePoint < 0x3a) return 26 + (codePoint - 0x30);\n if (codePoint >= 0x41 && codePoint < 0x5b) return codePoint - 0x41;\n if (codePoint >= 0x61 && codePoint < 0x7b) return codePoint - 0x61;\n return base;\n}\n\n/** ---------------------------------------------------------\n * * ***Converts a digit to a basic code point for `Punycode-UtilsJS`.***\n * ---------------------------------------------------------\n * @param digit - Numeric value.\n * @param flag - Bias flag (0 or 1).\n * @returns Code point.\n */\nfunction digitToBasic(digit: number, flag: number): number {\n return digit + 22 + 75 * (digit < 26 ? 1 : 0) - Number(flag !== 0) * 32;\n}\n\n/** ---------------------------------------------------------\n * * ***Bias adaptation function for `Punycode-UtilsJS` encoding/decoding.***\n * ---------------------------------------------------------\n * @param delta - Delta value.\n * @param numPoints - Number of code points.\n * @param firstTime - Indicates first adaptation.\n * @returns Adapted bias.\n */\nfunction adapt(delta: number, numPoints: number, firstTime: boolean): number {\n let k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n while (delta > ((base - tMin) * tMax) >> 1) {\n delta = floor(delta / (base - tMin));\n k += base;\n }\n return floor(k + ((base - tMin + 1) * delta) / (delta + skew));\n}\n\n/** ---------------------------------------------------------\n * * ***Decodes a `Punycode-UtilsJS` string to Unicode.***\n * ---------------------------------------------------------\n * @param input - `Punycode-UtilsJS` string.\n * @returns Decoded Unicode string.\n */\nfunction decode(input: string): string {\n assertIsString(input, {\n message: ({ currentType, validType }) =>\n `Utils \\`punycodeUtilsJS.decode\\`, parameter \\`input\\` must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const output: number[] = [];\n const inputLength = input.length;\n let i = 0,\n n = initialN,\n bias = initialBias;\n\n let basic = input.lastIndexOf(delimiter);\n if (basic < 0) basic = 0;\n\n for (let j = 0; j < basic; j++) {\n if (input.charCodeAt(j) >= 0x80) error(\"not-basic\");\n output.push(input.charCodeAt(j));\n }\n\n for (let index = basic > 0 ? basic + 1 : 0; index < inputLength; ) {\n const oldi = i;\n let w = 1;\n for (let k = base; ; k += base) {\n if (index >= inputLength) error(\"invalid-input\");\n const digit = basicToDigit(input.charCodeAt(index++));\n if (digit >= base) error(\"invalid-input\");\n if (digit > floor((maxInt - i) / w)) error(\"overflow\");\n i += digit * w;\n const t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n if (digit < t) break;\n const baseMinusT = base - t;\n if (w > floor(maxInt / baseMinusT)) error(\"overflow\");\n w *= baseMinusT;\n }\n const out = output.length + 1;\n bias = adapt(i - oldi, out, oldi === 0);\n if (floor(i / out) > maxInt - n) error(\"overflow\");\n n += floor(i / out);\n i %= out;\n output.splice(i++, 0, n);\n }\n return String.fromCodePoint(...output);\n}\n\n/** ---------------------------------------------------------\n * * ***Encodes a Unicode string to `Punycode-UtilsJS`.***\n * ---------------------------------------------------------\n * @param input - Unicode string.\n * @returns `Punycode-UtilsJS` string.\n */\nfunction encode(input: string): string {\n assertIsString(input, {\n message: ({ currentType, validType }) =>\n `Utils \\`punycodeUtilsJS.encode\\`, parameter \\`input\\` must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const output: string[] = [];\n const points = ucs2decode(input);\n const inputLength = points.length;\n let n = initialN,\n delta = 0,\n bias = initialBias;\n\n for (const cp of points) if (cp < 0x80) output.push(stringFromCharCode(cp));\n const basicLength = output.length;\n let handledCPCount = basicLength;\n if (basicLength) output.push(delimiter);\n\n while (handledCPCount < inputLength) {\n let m = maxInt;\n for (const cp of points) if (cp >= n && cp < m) m = cp;\n\n const handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne))\n error(\"overflow\");\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (const cp of points) {\n if (cp < n) delta++;\n if (cp === n) {\n let q = delta;\n for (let k = base; ; k += base) {\n const t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n if (q < t) break;\n output.push(\n stringFromCharCode(digitToBasic(t + ((q - t) % (base - t)), 0))\n );\n q = floor((q - t) / (base - t));\n }\n output.push(stringFromCharCode(digitToBasic(q, 0)));\n bias = adapt(\n delta,\n handledCPCountPlusOne,\n handledCPCount === basicLength\n );\n delta = 0;\n handledCPCount++;\n }\n }\n delta++;\n n++;\n }\n\n return output.join(\"\");\n}\n\n/** ---------------------------------------------------------\n * * ***Converts `Punycode-UtilsJS` to Unicode for domain names.***\n * ---------------------------------------------------------\n * @param input - Domain or label.\n * @returns Unicode string.\n */\nfunction toUnicode(input: string): string {\n assertIsString(input, {\n message: ({ currentType, validType }) =>\n `Utils \\`punycodeUtilsJS.toUnicode\\`, parameter \\`input\\` must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n return mapDomain(input, (str) =>\n regexPunycode.test(str) ? decode(str.slice(4).toLowerCase()) : str\n );\n}\n\n/** ---------------------------------------------------------\n * * ***Converts Unicode to ASCII (`Punycode-UtilsJS`) for domain names.***\n * ---------------------------------------------------------\n * @param input - Domain or label.\n * @returns ASCII string.\n */\nfunction toASCII(input: string): string {\n assertIsString(input, {\n message: ({ currentType, validType }) =>\n `Utils \\`punycodeUtilsJS.toASCII\\`, parameter \\`input\\` must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n return mapDomain(input, (str) =>\n regexNonASCII.test(str) ? \"xn--\" + encode(str) : str\n );\n}\n\ntype PunycodeUtilsJS = {\n /** ---------------------------------------------------------\n * * ***Version of the `Punycode-UtilsJS` implementation.***\n * ---------------------------------------------------------\n *\n * @example\n * console.log(punycodeUtilsJS.version); // \"1.0.0\"\n */\n version: string;\n /** ---------------------------------------------------------\n * * ***UCS-2 utility functions.***\n * ---------------------------------------------------------\n */\n ucs2: {\n /** ---------------------------------------------------------\n * * ***Decodes a UCS-2 encoded string to an array of Unicode code points.***\n * ---------------------------------------------------------\n *\n * @param input - The UCS-2 string to decode.\n * @returns Array of Unicode code points.\n * @example\n * punycodeUtilsJS.ucs2.decode(\"𐍈\");\n * // ➔ [66376]\n */\n decode: (input: string) => number[];\n /** ---------------------------------------------------------\n * * ***Encodes an array of Unicode code points to a UCS-2 string.***\n * ---------------------------------------------------------\n *\n * @param points - Array of Unicode code points.\n * @returns Encoded string.\n * @example\n * punycodeUtilsJS.ucs2.encode([66376]);\n * // ➔ \"𐍈\"\n */\n encode: (points: number[]) => string;\n };\n /** ---------------------------------------------------------\n * * ***Decodes a `Punycode-UtilsJS` string to a Unicode string.***\n * ---------------------------------------------------------\n *\n * @param input - The `Punycode-UtilsJS` string to decode.\n * @returns Decoded Unicode string.\n * @example\n * punycodeUtilsJS.decode(\"xn--fsq\");\n * // ➔ \"ü\"\n */\n decode: (input: string) => string;\n /** ---------------------------------------------------------\n * * ***Encodes a Unicode string to `Punycode-UtilsJS`.***\n * ---------------------------------------------------------\n *\n * @param input - Unicode string to encode.\n * @returns `Punycode-UtilsJS` string.\n * @example\n * punycodeUtilsJS.encode(\"ü\");\n * // ➔ \"xn--fsq\"\n */\n encode: (input: string) => string;\n /** ---------------------------------------------------------\n * * ***Converts a Unicode domain or label to ASCII (`Punycode-UtilsJS`).***\n * ---------------------------------------------------------\n *\n * @param input - Domain or label string.\n * @returns ASCII string suitable for DNS.\n * @example\n * punycodeUtilsJS.toASCII(\"пример.рф\");\n * // ➔ \"xn--e1afmkfd.xn--p1ai\"\n */\n toASCII: (input: string) => string;\n /** ---------------------------------------------------------\n * * ***Converts an ASCII (`Punycode-UtilsJS`) domain or label to Unicode.***\n * ---------------------------------------------------------\n *\n * @param input - ASCII string (with xn-- prefix if needed).\n * @returns Unicode string.\n * @example\n * punycodeUtilsJS.toUnicode(\"xn--e1afmkfd.xn--p1ai\");\n * // ➔ \"пример.рф\"\n */\n toUnicode: (input: string) => string;\n};\n\n/** ---------------------------------------------------------\n * * ***`Punycode-UtilsJS` object exposing all API functions and version.***\n * ---------------------------------------------------------\n * Provides encoding and decoding of Unicode domain names to ASCII (`Punycode-UtilsJS`)\n * and vice versa.\n *\n * - Useful for IDN (Internationalized Domain Names) support.\n */\nconst punycodeUtilsJS: PunycodeUtilsJS = {\n version: \"1.0.0\",\n ucs2: {\n decode: ucs2decode,\n encode: ucs2encode\n },\n decode: decode,\n encode: encode,\n toASCII: toASCII,\n toUnicode: toUnicode\n};\n\n/** Export individual functions */\nexport { punycodeUtilsJS };\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"removeSpaces-BE8lfh-4.js","names":[],"sources":["../src/strings/sanitizations/removeSpaces.ts"],"sourcesContent":["import { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { isNonEmptyString } from \"@/predicates/is/isNonEmptyString\";\n\ntype RemoveSpacesOptions = {\n /** If `true`, only trims the string, defaultValue: `false`.\n *\n * @default false */\n trimOnly?: boolean;\n};\n\n/** ----------------------------------------------------------\n * * ***Utility: `removeSpaces`.***\n * ----------------------------------------------------------\n * **Removes all spaces from a string or trims only, based on the options provided.**\n * - **Behavior:**\n * - If `trimOnly` is `true`, the string is simply trimmed.\n * - Otherwise, removes **all spaces**, tabs, newlines, etc.\n * - If the input is `null` or `undefined`, returns an empty string `(\"\")`.\n * @param {string | null | undefined} value - The input string to be processed. If `null` or `undefined`, returns an empty string.\n * @param {RemoveSpacesOptions} [options] - The options object.\n * @param {RemoveSpacesOptions[\"trimOnly\"]} [options.trimOnly=false] - If `true`, only trims the string without removing spaces inside.\n * @returns {string} The processed string.\n * @example\n * removeSpaces(\" Hello World \");\n * // ➔ \"HelloWorld\"\n * removeSpaces(\" Hello World \", { trimOnly: true });\n * // ➔ \"Hello World\"\n * removeSpaces(null);\n * // ➔ \"\"\n */\nexport const removeSpaces = (\n value: string | null | undefined,\n options: RemoveSpacesOptions = {\n trimOnly: false\n }\n): string => {\n if (!isNonEmptyString(value)) return \"\";\n\n if (!isPlainObject(options)) {\n options = {};\n }\n\n const { trimOnly = false } = options;\n\n if (trimOnly) return value.trim();\n\n // Remove all spaces (including tabs, newlines, etc.)\n return value.replace(/\\s+/g, \"\");\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,MAAa,gBACX,OACA,UAA+B,EAC7B,UAAU,OACX,KACU;CACX,IAAI,CAAC,iBAAiB,MAAM,EAAE,OAAO;CAErC,IAAI,CAAC,cAAc,QAAQ,EACzB,UAAU,EAAE;CAGd,MAAM,EAAE,WAAW,UAAU;CAE7B,IAAI,UAAU,OAAO,MAAM,MAAM;CAGjC,OAAO,MAAM,QAAQ,QAAQ,GAAG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"removeSpaces-DRRxNWlb.cjs","names":["isNonEmptyString","isPlainObject"],"sources":["../src/strings/sanitizations/removeSpaces.ts"],"sourcesContent":["import { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { isNonEmptyString } from \"@/predicates/is/isNonEmptyString\";\n\ntype RemoveSpacesOptions = {\n /** If `true`, only trims the string, defaultValue: `false`.\n *\n * @default false */\n trimOnly?: boolean;\n};\n\n/** ----------------------------------------------------------\n * * ***Utility: `removeSpaces`.***\n * ----------------------------------------------------------\n * **Removes all spaces from a string or trims only, based on the options provided.**\n * - **Behavior:**\n * - If `trimOnly` is `true`, the string is simply trimmed.\n * - Otherwise, removes **all spaces**, tabs, newlines, etc.\n * - If the input is `null` or `undefined`, returns an empty string `(\"\")`.\n * @param {string | null | undefined} value - The input string to be processed. If `null` or `undefined`, returns an empty string.\n * @param {RemoveSpacesOptions} [options] - The options object.\n * @param {RemoveSpacesOptions[\"trimOnly\"]} [options.trimOnly=false] - If `true`, only trims the string without removing spaces inside.\n * @returns {string} The processed string.\n * @example\n * removeSpaces(\" Hello World \");\n * // ➔ \"HelloWorld\"\n * removeSpaces(\" Hello World \", { trimOnly: true });\n * // ➔ \"Hello World\"\n * removeSpaces(null);\n * // ➔ \"\"\n */\nexport const removeSpaces = (\n value: string | null | undefined,\n options: RemoveSpacesOptions = {\n trimOnly: false\n }\n): string => {\n if (!isNonEmptyString(value)) return \"\";\n\n if (!isPlainObject(options)) {\n options = {};\n }\n\n const { trimOnly = false } = options;\n\n if (trimOnly) return value.trim();\n\n // Remove all spaces (including tabs, newlines, etc.)\n return value.replace(/\\s+/g, \"\");\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,MAAa,gBACX,OACA,UAA+B,EAC7B,UAAU,OACX,KACU;CACX,IAAI,CAACA,yCAAiB,MAAM,EAAE,OAAO;CAErC,IAAI,CAACC,sCAAc,QAAQ,EACzB,UAAU,EAAE;CAGd,MAAM,EAAE,WAAW,UAAU;CAE7B,IAAI,UAAU,OAAO,MAAM,MAAM;CAGjC,OAAO,MAAM,QAAQ,QAAQ,GAAG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"safeJsonParse-BBnQElk8.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, month: number, year: number;\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 month -= 1;\n const date = new Date(year, month, day);\n\n if (\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`}.*** */\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`}.*** */\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,MAAa,mBACX,YACA,WACgB;CAChB,IAAI,CAACA,yCAAiB,WAAW,IAAI,CAACA,yCAAiB,OAAO,EAC5D,MAAM,IAAI,UACR,4HAA4HC,uCAC1H,WACD,CAAC,yBAAyBC,gDAAoB,YAAY,EACzD,eAAe,MAChB,CAAC,CAAC,mBAAmBD,uCACpB,OACD,CAAC,yBAAyBC,gDAAoB,QAAQ,EACrD,eAAe,MAChB,CAAC,CAAC,QACJ;CAGH,MAAM,YAAY,WAAW,MAAM,OAAO,CAAC,IAAI,OAAO;CACtD,IAAI,UAAU,WAAW,KAAK,UAAU,KAAK,MAAM,EAAE,OAAO;CAE5D,IAAI,KAAa,OAAe;CAEhC,IAAI,WAAW,cACb,CAAC,KAAK,OAAO,QAAQ;MAChB,IAAI,WAAW,cACpB,CAAC,OAAO,KAAK,QAAQ;MAErB,OAAO;CAGT,SAAS;CACT,MAAM,OAAO,IAAI,KAAK,MAAM,OAAO,IAAI;CAEvC,IACE,KAAK,aAAa,KAAK,QACvB,KAAK,UAAU,KAAK,SACpB,KAAK,SAAS,KAAK,KAEnB,OAAO;CAGT,OAAO;;;;;;ACrDT,MAAa,8BACX,eAAuC,EAAE,KACV;CAC/B,4CAAoB,cAAc,EAChC,UAAU,EAAE,aAAa,gBACvB,oDAAoD,UAAU,sBAAsB,YAAY,MACnG,CAAC;CAEF,MAAM,kBAAkBC,mCAAW,cAAc,kBAAkB,GAC/D,aAAa,kBACb;CACJ,MAAM,eAAeA,mCAAW,cAAc,eAAe,GACzD,aAAa,eACb;CACJ,MAAM,iBAAiBA,mCAAW,cAAc,iBAAiB,GAC7D,aAAa,iBACb;CACJ,MAAM,gBAAgBA,mCAAW,cAAc,gBAAgB,GAC3D,aAAa,gBACb;CACJ,MAAM,oBAAoBA,mCAAW,cAAc,oBAAoB,GACnE,aAAa,oBACb;CACJ,MAAM,qBAAqBA,mCAAW,cAAc,qBAAqB,GACrE,aAAa,qBACb;CACJ,MAAM,cAAcA,mCAAW,cAAc,cAAc,GACvD,aAAa,cACb;CACJ,MAAM,kBAAkBA,mCAAW,cAAc,kBAAkB,GAC/D,aAAa,kBACb;CACJ,MAAM,aAAaA,mCAAW,cAAc,aAAa,GACrD,aAAa,aACb;CACJ,MAAM,eAAeA,mCAAW,cAAc,eAAe,GACzD,aAAa,eACb;CACJ,MAAM,aAAaA,mCAAW,cAAc,aAAa,GACrD,aAAa,aACb;CAEJ,MAAM,oBAAoBA,mCAAW,cAAc,oBAAoB,GACnE,aAAa,oBACb,EAAE;CACN,MAAM,UAAUA,mCAAW,cAAc,UAAU,GAC/C,aAAa,UACbC;CAEJ,IACE,EACEC,kCAAU,gBAAgB,IAC1BA,kCAAU,aAAa,IACvBA,kCAAU,eAAe,IACzBA,kCAAU,WAAW,IACrBA,kCAAU,aAAa,IACvBA,kCAAU,cAAc,IACxBA,kCAAU,kBAAkB,IAC5BA,kCAAU,mBAAmB,IAC7BA,kCAAU,YAAY,IACtBA,kCAAU,gBAAgB,IAC1BA,kCAAU,WAAW,IACrBC,gCAAQ,kBAAkB,IAC1BC,mCAAW,QAAQ,GAGrB,MAAM,IAAI,UACR,4ZAA4ZC,uCAC1Z,gBACD,CAAC,wBAAwBA,uCACxB,aACD,CAAC,0BAA0BA,uCAC1B,eACD,CAAC,yBAAyBA,uCACzB,cACD,CAAC,6BAA6BA,uCAC7B,kBACD,CAAC,8BAA8BA,uCAC9B,mBACD,CAAC,uBAAuBA,uCACvB,YACD,CAAC,2BAA2BA,uCAC3B,gBACD,CAAC,sBAAsBA,uCACtB,WACD,CAAC,6BAA6BA,uCAC7B,kBACD,CAAC,mBAAmBA,uCAAe,QAAQ,CAAC,MAC9C;CAGH,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1FH,MAAa,mBACX,MACA,UAAkC,EAAE,KACX;CACzB,MAAM,eAAe,2BAA2B,QAAQ;CAExD,IAAIC,+BAAO,KAAK,EAAE,OAAO,aAAa,cAAc,SAAY;CAChE,IAAIC,oCAAY,KAAK,EACnB,OAAO,aAAa,kBAAkB,SAAY;CAEpD,IAAIC,iCAAS,KAAK,EAAE;EAClB,MAAM,UAAU,KAAK,MAAM;EAE3B,IAAI,aAAa,cAAc,YAAY,OAAO,OAAO;EAEzD,IAAI,aAAa,kBAAkB,CAAC,MAAM,OAAO,QAAQ,CAAC,EACxD,OAAO,OAAO,QAAQ;EAGxB,IAAI,aAAa,iBAAiB;GAChC,IAAI,YAAY,QAAQ,OAAO;GAC/B,IAAI,YAAY,SAAS,OAAO;;EAGlC,IAAI,aAAa,cAAc;GAC7B,IAAI,gDAAgD,KAAK,QAAQ,EAC/D,OAAO,IAAI,KAAK,QAAQ;GAG1B,IAAI,aAAa,mBAAmB,QAClC,KAAK,MAAM,UAAU,aAAa,mBAAmB;IACnD,MAAM,OAAO,gBAAgB,SAAS,OAAO;IAC7C,IAAI,MAAM,OAAO;;;EAKvB,OAAO,aAAa,aAAa,SAAa;;CAGhD,IAAIC,gCAAQ,KAAK,EAAE;EACjB,MAAM,eAAe,KAClB,KAAK,SAAS,gBAAgB,MAAM,aAAa,CAAC,CAClD,QAAQ,SAAS,CAACF,oCAAY,KAAK,CAAC;EAEvC,OAAO,aAAa,qBAAqBG,mCAAa,aAAa,GAC/D,SACC;;CAGP,IAAIC,iCAAS,KAAK,EAAE;EAClB,MAAM,gBAAyC,EAAE;EAEjD,KAAK,MAAM,OAAO,MAChB,IAAI,OAAO,UAAU,eAAe,KAAK,MAAM,IAAI,EAAE;GACnD,MAAM,eAAe,gBAAgB,KAAK,MAAM,aAAa;GAC7D,IAAI,CAACJ,oCAAY,aAAa,EAC5B,cAAc,OAAO;;EAK3B,OAAO,aAAa,sBAClBK,oCAAc,eAAe,EAAE,cAAc,aAAa,cAAc,CAAC,GACvE,SACC;;CAGP,OAAO,aAAa,aAAa,SAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1E/C,MAAa,iBAAiB,UAA2B;CACvD,IAAI,CAACC,iCAAS,MAAM,IAAI,CAACC,iCAAS,MAAM,EAAE,OAAO;CAEjD,MAAM,UAAU,OAAO,MAAM,CAC1B,MAAM,CACN,QAAQ,WAAW,GAAG;CAEzB,OAAO,OAAO,QAAQ,IAAI;;;;;;AClC5B,SAAgB,+BAA+B,OAAuB;CACpE,MAAM,eAAe,IAAI,IAAI;EAAC;EAAM;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAI,CAAC;CAE5E,IAAI,SAAS;CACb,IAAI,gBAAgB;CACpB,IAAI,gBAAgB;CACpB,IAAI,aAAa;CAEjB,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,MAAM,IAAI,MAAM,MAAM;EAEtB,IAAI,YAAY;GACd,IAAI,eACF,IAAI,MAAM,KACR,UAAU;QACL,IAAI,aAAa,IAAI,EAAE,EAC5B,IAAI,MAAM,MACR,UAAU;QACL,IAAI,MAAM,MACf,UAAU;QAEV,UAAU,OAAO;QAGnB,UAAU,SAAS;QAEhB,IAAI,eACT,IAAI,MAAM,MACR,UAAU;QACL,IAAI,aAAa,IAAI,EAAE,EAC5B,UAAU,OAAO;QAEjB,UAAU,SAAS;QAGrB,UAAU,OAAO;GAEnB,aAAa;GACb;;EAGF,IAAI,MAAM,MAAM;GACd,aAAa;GACb;;EAGF,IAAI,CAAC,iBAAiB,CAAC,eAAe;GACpC,IAAI,MAAM,KAAK;IACb,UAAU;IACV,gBAAgB;IAChB;;GAEF,IAAI,MAAM,MAAK;IACb,UAAU;IACV,gBAAgB;IAChB;;SAEG,IAAI,eACT;OAAI,MAAM,KAAK;IACb,UAAU;IACV,gBAAgB;IAChB;;SAEG,IAAI,eACT;OAAI,MAAM,MAAK;IACb,UAAU;IACV,gBAAgB;IAChB;;;EAIJ,UAAU;;CAGZ,OAAO;;;;;;ACuHT,SAAgB,cACd,OACA,UAAkC,EAAE,EACpC;CACA,IAAIC,+BAAO,MAAM,EAAE,OAAO;CAC1B,MAAM,eAAe,2BAA2B,QAAQ;CAExD,IACE,aAAa,eACZC,8BAAM,MAAM,IAAKC,yCAAiB,MAAM,IAAI,UAAU,QAEvD,OAAO;CAET,IACE,aAAa,kBACb,CAACD,8BAAM,OAAO,MAAM,CAAC,IACrBE,iCAAS,cAAc,MAAM,CAAC,EAE9B,OAAO,OAAO,MAAM;CAGtB,IAAI,CAACC,iCAAS,MAAM,EAAE,OAAO;CAE7B,IAAI;EAEF,IAAI,aAAa,+BAA+B,MAAM;EAEtD,IAAI,aAAa,iBACf,aAAa,WACV,QAAQ,2CAA2C,GAAG,CAEtD,QAAQ,mCAAmC,GAAG;OAGjD,aAAa,WAAW,QAAQ,6BAA6B,QAAQ;EAIvE,IAAI,aAAa,YAEf,aAAa,WAAW,QAAQ,uBAAuB,WAAS;OAGhE,aAAa,WAEV,QAAQ,uBAAuB,WAAS,CAExC,QAAQ,qCAAqC,GAAG,CAEhD,QAAQ,6BAA6B,GAAG;EAI7C,aAAa,WAAW,QAAQ,gBAAgB,KAAK;EAIrD,OAAO,gBADQ,KAAK,MAAM,WACU,EAAE,aAAa;UAC5C,OAAO;EACd,IAAI,aAAa,eACf,QAAQ,MAAM,yCAAyC,MAAM;EAG/D,aAAa,QACXC,gCAAQ,MAAM,GACV,IAAI,MAAM,MAAM,QAAQ,QAAQ,iBAAiB,oBAAoB,CAAC,GACtE,IAAI,MAAM,OAAO,MAAM,CAAC,CAC7B;EAED"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"safeJsonParse-CXruaP0p.js","names":["isNaN"],"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, month: number, year: number;\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 month -= 1;\n const date = new Date(year, month, day);\n\n if (\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`}.*** */\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`}.*** */\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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tailwind-DJ4cmLUw.cjs","names":["isNonEmptyString","isNumber","isObjectOrArray","isStringObject","isNumberObject","isBooleanObject","isArray","isPlainObject","isNumber","isNonEmptyString","isFunction","hasOwnProp","isNonEmptyArray","defaultConfig","isPlainObject","isPlainObject","isFunction","getPreciseType","isString","getPreciseType","isEmptyString","isNonEmptyArray"],"sources":["../src/tailwind/class-names/cx.ts","../src/tailwind/tw-merge/_private/validate-props.ts","../src/tailwind/tw-merge/v3/twMergeDefault.ts","../src/tailwind/tw-merge/v4/twMergeDefault.ts","../src/tailwind/class-names/customCn.ts","../src/tailwind/class-names/cn.ts","../src/tailwind/tw-macro/shouldForwardProp.ts"],"sourcesContent":["import { isArray } from \"@/predicates/is/isArray\";\nimport { isNumber } from \"@/predicates/is/isNumber\";\nimport { isStringObject } from \"@/predicates/is/isStringObject\";\nimport { isNumberObject } from \"@/predicates/is/isNumberObject\";\nimport { isBooleanObject } from \"@/predicates/is/isBooleanObject\";\nimport { isObjectOrArray } from \"@/predicates/is/isObjectOrArray\";\nimport { isNonEmptyString } from \"@/predicates/is/isNonEmptyString\";\n\n/** ----------------------------------------------------------\n * * ***Type-Utility: `ClassValue`.***\n * ----------------------------------------------------------\n * **Represents a single valid value that can be converted to a CSS class string.**\n * @description\n * - Supports the following types:\n * - `string` → literal class names (non-empty only)\n * - `number | bigint` → numeric class names\n * - `boolean` → only `true` is considered in objects/arrays\n * - `null | undefined` → ignored\n * - `ClassObject` → objects where **keys with truthy values** are included\n * - `ClassValues` → arrays recursively flattened\n * - Used internally by ***`cx` utility function*** to process mixed input values.\n * @example\n * ```ts\n * const val1: ClassValue = \"button\"; // ➔ string\n * const val2: ClassValue = 0; // ➔ number\n * const val3: ClassValue = [\"a\", { b: true }]; // ➔ array with object\n * const val4: ClassValue = { d: true, e: false }; // ➔ object\n * const val5: ClassValue = new String(\"foo\"); // ➔ boxed string\n * const val6: ClassValue = new Number(\"123\"); // ➔ boxed number\n * const val7: ClassValue = new Boolean(\"true\"); // ➔ boxed boolean\n * ```\n */\nexport type ClassValue =\n | ClassValues\n | ClassObject\n | string\n | number\n | bigint\n | null\n | boolean\n | undefined;\n\n/** ----------------------------------------------------------\n * * ***Type-Utility: `ClassObject`.***\n * ----------------------------------------------------------\n * **Represents an object whose keys with truthy values are included in the final class string.**\n * @example\n * ```ts\n * const obj: ClassObject = { \"text-red\": true, \"hidden\": false };\n * // ➔ \"text-red\" when processed by cx\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ClassObject = Record<string, any>;\n\n/** ----------------------------------------------------------\n * * ***Type-Utility: `ClassValues`.***\n * ----------------------------------------------------------\n * **Represents an array of {@link ClassValue | `ClassValue's`}, potentially nested.**\n * @example\n * ```ts\n * const arr: ClassValues = [\n * \"a\",\n * 1,\n * [\"b\", { c: true, d: false }],\n * { e: 2 }\n * ];\n * ```\n */\nexport type ClassValues = ClassValue[];\n\n/** ----------------------------------------------------------\n * * ***Utility: `toStringValue`.***\n * ----------------------------------------------------------\n * **Converts a `ClassValue` into a single space-separated string suitable for CSS class usage.**\n * @param {ClassValue} value The mixed value to process.\n * @returns {string} A string containing all valid class names.\n * @description\n * - Arrays are recursively flattened.\n * - Objects include only keys with truthy values.\n * - Skips `null`, `undefined`, and empty strings.\n * - Numbers, strings, and bigint are included as-is.\n * - Boolean `false` is ignored in objects/arrays.\n * - Boxed primitives (`new String()`, `new Number()`, `new Boolean()`) are supported.\n * - Preserves inherited object keys.\n * @example\n * ```ts\n * toStringValue(\"btn\"); // ➔ \"btn\"\n * toStringValue([\"a\", 0, \"b\"]); // ➔ \"a b\"\n * toStringValue({ a: true, b: false, c: 1 }); // ➔ \"a c\"\n * toStringValue([\"a\", [\"b\", { c: true, d: false }]]); // ➔ \"a b c\"\n * toStringValue(new String(\"foo\")); // ➔ \"foo\"\n * toStringValue(new Number(42)); // ➔ \"42\"\n * toStringValue(new Boolean(true)); // ➔ \"true\"\n * toStringValue(new Boolean(false));// ➔ \"\"\n * ```\n */\nfunction toStringValue(value: ClassValue): string {\n let str = \"\";\n\n if (isNonEmptyString(value) || isNumber(value)) {\n str += value;\n } else if (isObjectOrArray(value)) {\n if (\n isStringObject(value) ||\n isNumberObject(value) ||\n isBooleanObject(value)\n ) {\n const val = value.valueOf();\n if (val) str += val; // skip falsy\n } else if (isArray(value)) {\n for (const item of value) {\n if (!item) continue; // skip falsy\n const y = toStringValue(item);\n if (!y) continue;\n if (str) str += \" \";\n str += y;\n }\n } else {\n for (const key in value) {\n if (!value[key]) continue; // skip falsy\n if (str) str += \" \";\n str += key;\n }\n }\n }\n\n return str;\n}\n\n/** ----------------------------------------------------------\n * * ***Utility: `cx`.***\n * ----------------------------------------------------------\n * **Merge multiple class values into a single, space-separated string suitable for CSS usage.**\n * @description\n * - Supports **nested combinations** of arrays and objects, recursively.\n * - **Falsy values** are skipped:\n * - `false`, `null`, `undefined`, empty strings `\"\"` are ignored anywhere.\n * - Numbers `0` are ignored inside nested arrays/objects.\n * - **Boxed primitives** are correctly unwrapped to their primitive value.\n * - **Inherited object keys** are included in the final class string.\n * - Optimized for **CSS class merging** where conditional inclusion is common.\n * @param {ClassValues} values\n * A list of mixed class values, which can include:\n * - **Strings** → literal class names.\n * - **Numbers** → numeric class names.\n * - **BigInt** → numeric class names larger than JS safe integer limit.\n * - **Arrays** → recursively flattened, can contain nested arrays or objects.\n * - **Objects** → include keys whose values are truthy. Inherited keys are also included.\n * - **Boxed primitives** (`new String()`, `new Number()`, `new Boolean()`) → automatically unwrapped.\n * - **Falsy values** (`false`, `null`, `undefined`, `\"\"`, `0`) are ignored according to original behavior.\n * @returns {string}\n * A single space-separated string containing all valid class names.\n * @example\n * ```ts\n * // Basic string merge\n * cx(\"btn\", \"btn-primary\");\n * // ➔ \"btn btn-primary\"\n *\n * // Mixed arrays and objects\n * cx(\"a\", [\"b\", { c: true, d: false }], { e: 1, f: 0 }, null, 2);\n * // ➔ \"a b c e 2\"\n *\n * // Empty and falsy values are ignored\n * cx(\"\", null, undefined, false, 0);\n * // ➔ \"\"\n *\n * // Nested arrays with objects\n * cx([\"a\", [\"b\", { c: true, d: false }]]);\n * // ➔ \"a b c\"\n *\n * // Boxed primitives are unwrapped\n * cx(new String(\"foo\"), new Number(42), new Boolean(true), new Number(0), new Boolean(false));\n * // ➔ \"foo 42 true\"\n *\n * // Inherited keys from objects are included\n * const proto = { inherited: true };\n * const obj = Object.create(proto);\n * obj.own = true;\n * cx(obj);\n * // ➔ \"own inherited\"\n * ```\n */\nexport function cx(...values: ClassValues): string {\n let str = \"\";\n\n for (const value of values) {\n if (!value) continue; // skip falsy arguments\n const x = toStringValue(value);\n if (!x) continue;\n if (str) str += \" \";\n str += x;\n }\n\n return str;\n}\n","import type { Config as TwConfig } from \"tailwindcss\";\nimport type { ConfigExtension } from \"tailwind-merge-v4\";\n\nimport type { OptionsMergeTwClsV4 } from \"../v4/_private/types\";\n\nimport { hasOwnProp } from \"@/predicates/has/hasOwnProp\";\n\nimport { isNumber } from \"@/predicates/is/isNumber\";\nimport { isFunction } from \"@/predicates/is/isFunction\";\nimport { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { isNonEmptyArray } from \"@/predicates/is/isNonEmptyArray\";\nimport { isNonEmptyString } from \"@/predicates/is/isNonEmptyString\";\n\nexport type TailwindConfig = TwConfig;\n\ntype TwMergeConfigExt = ConfigExtension<string, string>;\n\ntype ValidatorTwMergeReturn = {\n config: TwConfig;\n override: TwMergeConfigExt[\"override\"];\n cacheSize: TwMergeConfigExt[\"cacheSize\"];\n prefix: TwMergeConfigExt[\"prefix\"];\n experimentalParseClassName?: TwMergeConfigExt[\"experimentalParseClassName\"];\n theme: NonNullable<NonNullable<TwMergeConfigExt[\"extend\"]>[\"theme\"]>;\n classGroups: NonNullable<\n NonNullable<TwMergeConfigExt[\"extend\"]>[\"classGroups\"]\n >;\n conflictingClassGroupModifiers: NonNullable<\n NonNullable<TwMergeConfigExt[\"extend\"]>[\"conflictingClassGroupModifiers\"]\n >;\n conflictingClassGroups: NonNullable<\n NonNullable<TwMergeConfigExt[\"extend\"]>[\"conflictingClassGroups\"]\n >;\n orderSensitiveModifiers: NonNullable<\n NonNullable<TwMergeConfigExt[\"extend\"]>[\"orderSensitiveModifiers\"]\n >;\n};\n\nexport const validatorPropsTwMerge = (\n options: OptionsMergeTwClsV4\n): ValidatorTwMergeReturn => {\n if (!isPlainObject(options)) options = {};\n let {\n config,\n prefix,\n extend,\n override,\n cacheSize,\n experimentalParseClassName\n } = options;\n\n if (!isPlainObject(config)) config = {};\n if (!isPlainObject(extend)) extend = {};\n if (!isPlainObject(override)) override = {};\n if (!isNumber(cacheSize)) cacheSize = undefined;\n if (!isNonEmptyString(prefix)) prefix = undefined;\n if (!isFunction(experimentalParseClassName))\n experimentalParseClassName = undefined;\n\n const theme = hasOwnProp(extend, \"theme\") ? extend.theme : {};\n const classGroups = hasOwnProp(extend, \"classGroups\")\n ? extend.classGroups\n : {};\n const conflictingClassGroupModifiers = hasOwnProp(\n extend,\n \"conflictingClassGroupModifiers\"\n )\n ? extend.conflictingClassGroupModifiers\n : {};\n\n const conflictingClassGroups = hasOwnProp(extend, \"conflictingClassGroups\")\n ? extend.conflictingClassGroups\n : {};\n const orderSensitiveModifiers =\n hasOwnProp(extend, \"orderSensitiveModifiers\") &&\n isNonEmptyArray(extend.orderSensitiveModifiers)\n ? extend.orderSensitiveModifiers\n : [];\n\n return {\n config,\n override,\n cacheSize,\n prefix,\n experimentalParseClassName,\n theme,\n classGroups,\n conflictingClassGroupModifiers,\n conflictingClassGroups,\n orderSensitiveModifiers\n };\n};\n","import type { OptionsMergeTwClsV3, TwMergeDefaultFnV3 } from \"./_private/types\";\n\nimport { extendTailwindMerge, getDefaultConfig } from \"tailwind-merge-v3\";\n\nimport { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { validatorPropsTwMerge } from \"../_private/validate-props\";\n\n// Get default Tailwind merge configuration\nconst defaultConfig = getDefaultConfig();\n\n/** -------------------------------------------------------------\n * * ***Customized Tailwind class merger Version 3 with extended rules.***\n * -------------------------------------------------------------\n * **Wraps ***`extendTailwindMerge` from tailwind-merge-v3*** with Tailwind’s default\n * config (_*`getDefaultConfig()` from tailwind-merge-v3*_) to create a **project-ready `twMerge`**.**\n * - 🔑 **When to use it?**\n * - Your project uses **Tailwind v3**.\n * - Extend **class groups** (e.g. add `text-shadow`).\n * - Respect your own **`tailwind.config.ts`** (colors, spacing, fontSize, etc).\n * - Override or fine-tune **merge behavior**.\n * - Create a **project-wide `cn` helper** that replaces raw `twMerge`.\n * @param {OptionsMergeTwClsV3} [options={}]\n * ***Merge options:***\n * - `config` – Your Tailwind config (from `tailwind.config.ts`).\n * - `prefix` - Utility prefix (e.g. `tw-` or `tw`).\n * - `extend` – Extra merge rules (classGroups, theme, etc).\n * - `override` – Fully replace rules.\n * - `cacheSize` – Parsed class cache size.\n * - `experimentalParseClassName` – Custom classname parser.\n * @returns {TwMergeDefaultFnV3}\n * Customized Tailwind class merge function version 3 (same signature as `twMerge`).\n * @example\n * #### Example 1: ***Default behavior (same as tailwind-merge).***\n * ```ts\n * import { twMergeDefaultV3 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const twMerge = twMergeDefaultV3();\n * twMerge(\"p-2 p-4\");\n * // ➔ \"p-4\"\n * ```\n * #### Example 2: ***Extend class groups.***\n * ```ts\n * import { twMergeDefaultV3 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const twMerge2 = twMergeDefaultV3({\n * extend: {\n * classGroups: {\n * shadow: [\"shadow-soft\", \"shadow-hard\"],\n * },\n * },\n * });\n * twMerge2(\"shadow-soft shadow-hard\");\n * // ➔ \"shadow-hard\"\n * ```\n * #### Example 3: ***Respect your Tailwind config.***\n * ```ts\n * import config from \"../tailwind.config\";\n * import { twMergeDefaultV3 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const twMerge3 = twMergeDefaultV3({ config });\n * twMerge3(\"text-base text-xxs\");\n * // ➔ \"text-xxs\" (resolved from config)\n * ```\n * #### Example 4: ***Project-wide helper (recommended).***\n * ```ts\n * import configTwCss from \"../tailwind.config\";\n * import { customCnV3, twMergeDefaultV3, type ClassValues } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const customTwMerge = twMergeDefaultV3({\n * config: configTwCss,\n * extend: {\n * classGroups: { shadow: [\"shadow-soft\", \"shadow-hard\"] },\n * },\n * });\n *\n * export const cnApp = (...classes: ClassValues) => {\n * return customCnV3(customTwMerge, ...classes);\n * };\n *\n * // ✅ Usage\n * cnApp(\"p-2 p-4\"); // ➔ \"p-4\"\n * cnApp(\"shadow-soft shadow-hard\"); // ➔ \"shadow-hard\"\n * cnApp(\"text-base text-xxs\"); // ➔ \"text-xxs\" (uses config)\n *\n * // ⚡ Difference with package-level `cn`\n * import { cnV3, cnV4 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * cnV3(\"text-base text-xxs\");\n * // or\n * cnV4(\"text-base text-xxs\");\n * // ➔ \"text-base\" (❌ doesn't know about your config)\n *\n * cnApp(\"text-base text-xxs\");\n * // ➔ \"text-xxs\" (✅ respects config)\n * ```\n */\nexport const twMergeDefaultV3 = (\n options: OptionsMergeTwClsV3 = {}\n): TwMergeDefaultFnV3 => {\n if (!isPlainObject(options)) options = {};\n const {\n cacheSize,\n classGroups,\n config,\n conflictingClassGroupModifiers,\n conflictingClassGroups,\n override,\n prefix,\n theme,\n experimentalParseClassName\n } = validatorPropsTwMerge(options);\n\n return extendTailwindMerge<string, string>({\n prefix: prefix ?? config.prefix,\n cacheSize: cacheSize || defaultConfig.cacheSize,\n experimentalParseClassName,\n override,\n extend: {\n conflictingClassGroupModifiers: {\n ...defaultConfig.conflictingClassGroupModifiers,\n ...conflictingClassGroupModifiers\n },\n theme: { ...defaultConfig.theme, ...theme },\n conflictingClassGroups: {\n ...defaultConfig.conflictingClassGroups,\n ...conflictingClassGroups\n },\n classGroups: {\n ...defaultConfig.classGroups,\n ...classGroups,\n\n \"text-shadow\": [\n \"\",\n \"-sm\",\n \"-md\",\n \"-lg\",\n \"-xl\",\n \"-xxl\",\n \"-none\",\n \"-default\"\n ].map((size) => `text-shadow${size}`),\n \"font-size\": Object.keys({\n ...(config.theme?.fontSize || {}),\n ...(config.theme?.extend?.fontSize || {})\n }).map((size) => `text-${size}`)\n }\n }\n });\n};\n","import type { OptionsMergeTwClsV4, TwMergeDefaultFnV4 } from \"./_private/types\";\n\nimport { extendTailwindMerge, getDefaultConfig } from \"tailwind-merge-v4\";\n\nimport { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { validatorPropsTwMerge } from \"../_private/validate-props\";\n\n// Get default Tailwind merge configuration\nconst defaultConfig = getDefaultConfig();\n\n/** -------------------------------------------------------------\n * * ***Customized Tailwind class merger Version 4 with extended rules.***\n * -------------------------------------------------------------\n * **Wraps ***`extendTailwindMerge` from tailwind-merge-v4*** with Tailwind’s default\n * config (_*`getDefaultConfig()` from tailwind-merge-v4*_) to create a **project-ready `twMerge`**.**\n * - 🔑 **When to use it?**\n * - Your project uses **Tailwind v4**.\n * - Extend **class groups** (e.g. add `text-shadow`).\n * - Respect your own **`tailwind.config.ts`** (colors, spacing, fontSize, etc).\n * - Override or fine-tune **merge behavior**.\n * - Create a **project-wide `cn` helper** that replaces raw `twMerge`.\n * @param {OptionsMergeTwClsV4} [options={}]\n * ***Merge options:***\n * - `config` – Your Tailwind config (from `tailwind.config.ts`).\n * - `prefix` - Utility prefix (e.g. `tw-` or `tw`).\n * - `extend` – Extra merge rules (classGroups, theme, etc).\n * - `override` – Fully replace rules.\n * - `cacheSize` – Parsed class cache size.\n * - `experimentalParseClassName` – Custom classname parser.\n * @returns {TwMergeDefaultFnV4}\n * Customized Tailwind class merge function version 4 (same signature as `twMerge`).\n * @example\n * #### Example 1: ***Default behavior (same as tailwind-merge).***\n * ```ts\n * import { twMergeDefaultV4 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const twMerge = twMergeDefaultV4();\n * twMerge(\"p-2 p-4\");\n * // ➔ \"p-4\"\n * ```\n * #### Example 2: ***Extend class groups.***\n * ```ts\n * import { twMergeDefaultV4 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const twMerge2 = twMergeDefaultV4({\n * extend: {\n * classGroups: {\n * shadow: [\"shadow-soft\", \"shadow-hard\"],\n * },\n * },\n * });\n * twMerge2(\"shadow-soft shadow-hard\");\n * // ➔ \"shadow-hard\"\n * ```\n * #### Example 3: ***Respect your Tailwind config.***\n * ```ts\n * import config from \"../tailwind.config\";\n * import { twMergeDefaultV4 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const twMerge3 = twMergeDefaultV4({ config });\n * twMerge3(\"text-base text-xxs\");\n * // ➔ \"text-xxs\" (resolved from config)\n * ```\n * #### Example 4: ***Project-wide helper (recommended).***\n * ```ts\n * import configTwCss from \"../tailwind.config\";\n * import { customCnV4, twMergeDefaultV4, type ClassValues } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const customTwMerge = twMergeDefaultV4({\n * config: configTwCss,\n * extend: {\n * classGroups: { shadow: [\"shadow-soft\", \"shadow-hard\"] },\n * },\n * });\n *\n * export const cnApp = (...classes: ClassValues) => {\n * return customCnV4(customTwMerge, ...classes);\n * };\n *\n * // ✅ Usage\n * cnApp(\"p-2 p-4\"); // ➔ \"p-4\"\n * cnApp(\"shadow-soft shadow-hard\"); // ➔ \"shadow-hard\"\n * cnApp(\"text-base text-xxs\"); // ➔ \"text-xxs\" (uses config)\n *\n * // ⚡ Difference with package-level `cn`\n * import { cnV3, cnV4 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * cnV3(\"text-base text-xxs\");\n * // or\n * cnV4(\"text-base text-xxs\");\n * // ➔ \"text-base\" (❌ doesn't know about your config)\n *\n * cnApp(\"text-base text-xxs\");\n * // ➔ \"text-xxs\" (✅ respects config)\n * ```\n */\nexport const twMergeDefaultV4 = (\n options: OptionsMergeTwClsV4 = {}\n): TwMergeDefaultFnV4 => {\n if (!isPlainObject(options)) options = {};\n const {\n cacheSize,\n classGroups,\n config,\n conflictingClassGroupModifiers,\n conflictingClassGroups,\n orderSensitiveModifiers,\n override,\n prefix,\n theme,\n experimentalParseClassName\n } = validatorPropsTwMerge(options);\n\n return extendTailwindMerge<string, string>({\n prefix: prefix || config.prefix,\n cacheSize: cacheSize || defaultConfig.cacheSize,\n experimentalParseClassName,\n override,\n extend: {\n conflictingClassGroupModifiers: {\n ...defaultConfig.conflictingClassGroupModifiers,\n ...conflictingClassGroupModifiers\n },\n theme: { ...defaultConfig.theme, ...theme },\n conflictingClassGroups: {\n ...defaultConfig.conflictingClassGroups,\n ...conflictingClassGroups\n },\n orderSensitiveModifiers: [\n ...defaultConfig.orderSensitiveModifiers,\n ...orderSensitiveModifiers\n ],\n classGroups: {\n ...defaultConfig.classGroups,\n ...classGroups,\n\n \"text-shadow\": [\n \"\",\n \"-sm\",\n \"-md\",\n \"-lg\",\n \"-xl\",\n \"-xxl\",\n \"-none\",\n \"-default\"\n ].map((size) => `text-shadow${size}`),\n \"font-size\": Object.keys({\n ...(config.theme?.fontSize || {}),\n ...(config.theme?.extend?.fontSize || {})\n }).map((size) => `text-${size}`)\n }\n }\n });\n};\n","import type { TwMergeDefaultFnV3 } from \"../tw-merge/v3/_private/types\";\nimport type { TwMergeDefaultFnV4 } from \"../tw-merge/v4/_private/types\";\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { twMergeDefaultV3 } from \"../tw-merge/v3/twMergeDefault\";\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { twMergeDefaultV4 } from \"../tw-merge/v4/twMergeDefault\";\n\nimport { isFunction } from \"@/predicates/is/isFunction\";\nimport { getPreciseType } from \"@/predicates/type/getPreciseType\";\nimport { cx, type ClassValues } from \"./cx\";\n\nexport type { ClassValues };\n\n/** -------------------------------------------------------------\n * * ***Factory utility for building a custom `cn` helper (Tailwind `v3`).***\n * -------------------------------------------------------------\n * **Wraps internally function to combines class-name values and applies the provided\n * Tailwind merge function (from {@link twMergeDefaultV3 | `twMergeDefaultV3`}).**\n * - 🔑 **When to use it?**\n * - Your project uses **Tailwind v3**.\n * - You extend Tailwind merge rules (`classGroups`, `tailwind.config`).\n * - You need multiple `cn*` variants across apps/packages.\n * @param {TwMergeDefaultFnV3} customTwMergeV3 - Merge function created via {@link twMergeDefaultV3 | `twMergeDefaultV3`}.\n * @param {ClassValues} classes - Class values (`string`, `array`, `object`, `etc`).\n * @returns {string} Merged Tailwind class string.\n * @example\n * ```ts\n * import tailwindConfig from \"../tailwind.config\";\n * import { twMergeDefaultV3, customCnV3, type ClassValues } from \"@rzl-zone/utils-js/tailwind\";\n *\n * // 1. Create a custom merge function\n * const myCustomTwMerge = twMergeDefaultV3({\n * config: tailwindConfig,\n * extend: {\n * classGroups: {\n * \"text-shadow\": [\"text-shadow\", \"text-shadow-sm\", \"text-shadow-md\"],\n * },\n * },\n * });\n *\n * // 2. Build your helper using `customCnV3`\n * export const cnApp = (...classes: ClassValues) => {\n * return customCnV3(myCustomTwMerge, ...classes);\n * };\n * // ✅ Usage\n * cnApp(\"p-2\", \"p-4\"); // ➔ \"p-4\"\n * cnApp(\"shadow-sm shadow-md\"); // ➔ \"shadow-md\"\n * cnApp(\"text-base text-xxs\"); // ➔ \"text-xxs\" (resolved from config)\n * ```\n */\nexport const customCnV3 = (\n customTwMergeV3: TwMergeDefaultFnV3,\n ...classes: ClassValues\n): string => {\n if (!isFunction(customTwMergeV3)) {\n throw new TypeError(\n `first Parameter (\\`customTwMergeV3\\`) must be of type \\`function\\`, but received: \\`${getPreciseType(\n customTwMergeV3\n )}\\`.`\n );\n }\n\n return customTwMergeV3(cx(...classes));\n};\n\n/** -------------------------------------------------------------\n * * ***Factory utility for building a custom `cn` helper (Tailwind `v4`).***\n * -------------------------------------------------------------\n * **Wraps internally function to combines class-name values and applies the provided\n * Tailwind merge function (from {@link twMergeDefaultV4 | `twMergeDefaultV4`}).**\n * - 🔑 **When to use it?**\n * - Your project uses **Tailwind v4**.\n * - You extend Tailwind merge rules (`classGroups`, `tailwind.config`).\n * - You need multiple `cn*` variants across apps/packages.\n * @param {TwMergeDefaultFnV4} customTwMergeV4 - Merge function created via {@link twMergeDefaultV4 | `twMergeDefaultV4`}.\n * @param {ClassValues} classes - Class values (`string`, `array`, `object`, `etc`).\n * @returns {string} Merged Tailwind class string.\n * @example\n * ```ts\n * import tailwindConfig from \"../tailwind.config\";\n * import { twMergeDefaultV4, customCnV4, type ClassValues } from \"@rzl-zone/utils-js/tailwind\";\n *\n * // 1. Create a custom merge function\n * const myCustomTwMerge = twMergeDefaultV4({\n * config: tailwindConfig,\n * extend: {\n * classGroups: {\n * \"text-shadow\": [\"text-shadow\", \"text-shadow-sm\", \"text-shadow-md\"],\n * },\n * },\n * });\n *\n * // 2. Build your helper using `customCnV4`\n * export const cnApp = (...classes: ClassValues) => {\n * return customCnV4(myCustomTwMerge, ...classes);\n * };\n *\n * // ✅ Usage\n * cnApp(\"p-2\", \"p-4\"); // ➔ \"p-4\"\n * cnApp(\"shadow-sm shadow-md\"); // ➔ \"shadow-md\"\n * cnApp(\"text-base text-xxs\"); // ➔ \"text-xxs\" (resolved from config)\n * ```\n */\nexport const customCnV4 = (\n customTwMergeV4: TwMergeDefaultFnV4,\n ...classes: ClassValues\n): string => {\n if (!isFunction(customTwMergeV4)) {\n throw new TypeError(\n `first Parameter (\\`customTwMergeV4\\`) must be of type \\`function\\`, but received: \\`${getPreciseType(\n customTwMergeV4\n )}\\`.`\n );\n }\n\n return customTwMergeV4(cx(...classes));\n};\n","import type { ClassValues } from \"./cx\";\n\nimport { cx } from \"./cx\";\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { customCnV3, customCnV4 } from \"./customCn\";\nimport { twMergeDefaultV3 } from \"../tw-merge/v3/twMergeDefault\";\nimport { twMergeDefaultV4 } from \"../tw-merge/v4/twMergeDefault\";\n\nconst defaultTwMergeV3 = twMergeDefaultV3();\nconst defaultTwMergeV4 = twMergeDefaultV4();\n\n/** -------------------------------------------------------------\n * * ***Default `cnV3` utility (Tailwind v3).***\n * -------------------------------------------------------------\n * **Combines class-name values and then deduplicates/resolves\n * conflicts using {@link twMergeDefaultV3 | `twMergeDefaultV3`}\n * with **Tailwind v3 default config only**.**\n * - ✅ **Use this when:**\n * - Your project uses **Tailwind v3**.\n * - You need a simple `cn` that works out of the box without a custom config.\n * - ⚡ **Need custom rules?**\n * - Create a project-wide helper using\n * {@link twMergeDefaultV3 | `twMergeDefaultV3`} +\n * {@link customCnV3 | `customCnV3`} (see Example 2).\n * @param {ClassValues} classes - Class values (`string`, `array`, `object`, `etc`).\n * @returns {string} Merged Tailwind class string.\n * @example\n * #### Example 1: ✅ Default usage (Tailwind v3).\n * ```ts\n * cnV3(\"p-2\", \"p-4\");\n * // ➔ \"p-4\"\n *\n * cnV3(\"text-red-500\", { \"text-blue-500\": true });\n * // ➔ \"text-blue-500\"\n *\n * cnV3([\"m-2\", [\"m-4\"]], \"m-8\");\n * // ➔ \"m-8\"\n * ```\n * #### Example 2: ⚡ Custom project-wide usage with Tailwind config.\n * ```ts\n * import tailwindConfig from \"../tailwind.config\";\n * import { twMergeDefaultV3, customCnV3, type ClassValues } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const cnApp = (...classes: ClassValues) => {\n * return customCnV3(\n * twMergeDefaultV3({\n * config: tailwindConfig,\n * extend: {\n * classGroups: {\n * \"text-shadow\": [\n * \"text-shadow\",\n * \"text-shadow-sm\",\n * \"text-shadow-md\",\n * ],\n * },\n * },\n * }),\n * // ...other options classes,\n * );\n * };\n *\n * cnApp(\"p-2 p-4\"); // ➔ \"p-4\"\n * cnApp(\"shadow-sm shadow-md\"); // ➔ \"shadow-md\"\n * cnApp(\"text-base text-xxs\"); // ➔ \"text-xxs\" (resolved from config)\n * ```\n */\nexport const cnV3 = (...classes: ClassValues): string => {\n return defaultTwMergeV3(cx(...classes));\n};\n\n/** -------------------------------------------------------------\n * * ***Default `cnV4` utility (Tailwind v4).***\n * -------------------------------------------------------------\n * **Combines class-name values and then deduplicates/resolves\n * conflicts using {@link twMergeDefaultV4 | `twMergeDefaultV4`}\n * with **Tailwind v4 default config only**.**\n * - ✅ **Use this when:**\n * - Your project uses **Tailwind v4**.\n * - You need a simple `cn` that works out of the box without a custom config.\n * - ⚡ **Need custom rules?**\n * - Create a project-wide helper using\n * {@link twMergeDefaultV4 | `twMergeDefaultV4`} +\n * {@link customCnV4 | `customCnV4`} (see Example 2).\n * @param {ClassValues} classes - Class values (`string`, `array`, `object`, `etc`).\n * @returns {string} Merged Tailwind class string.\n * @example\n * #### Example 1: ✅ Default usage (Tailwind v4).\n * ```ts\n * cnV4(\"p-2\", \"p-4\");\n * // ➔ \"p-4\"\n *\n * cnV4(\"text-red-500\", { \"text-blue-500\": true });\n * // ➔ \"text-blue-500\"\n *\n * cnV4([\"m-2\", [\"m-4\"]], \"m-8\");\n * // ➔ \"m-8\"\n * ```\n * #### Example 2: ⚡ Custom project-wide usage with Tailwind config.\n * ```ts\n * import tailwindConfig from \"../tailwind.config\";\n * import { twMergeDefaultV4, customCnV4, type ClassValues } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const cnApp = (...classes: ClassValues) => {\n * return customCnV4(\n * twMergeDefaultV4({\n * config: tailwindConfig,\n * extend: {\n * classGroups: {\n * \"text-shadow\": [\n * \"text-shadow\",\n * \"text-shadow-sm\",\n * \"text-shadow-md\",\n * ],\n * },\n * },\n * }),\n * // ...other options classes,\n * );\n * };\n *\n * cnApp(\"p-2 p-4\"); // ➔ \"p-4\"\n * cnApp(\"shadow-sm shadow-md\"); // ➔ \"shadow-md\"\n * cnApp(\"text-base text-xxs\"); // ➔ \"text-xxs\" (resolved from config)\n * ```\n */\nexport const cnV4 = (...classes: ClassValues): string => {\n return defaultTwMergeV4(cx(...classes));\n};\n","import type { Stringify } from \"@rzl-zone/ts-types-plus\";\n\nimport { isString } from \"@/predicates/is/isString\";\nimport { isEmptyString } from \"@/predicates/is/isEmptyString\";\nimport { getPreciseType } from \"@/predicates/type/getPreciseType\";\nimport { isNonEmptyArray } from \"@/predicates/is/isNonEmptyArray\";\nimport { assertIsArray } from \"@/assertions/objects/assertIsArray\";\n\n/** ----------------------------------------------------------\n * * ***Utility: `shouldForwardProp`.***\n * ----------------------------------------------------------\n * **Creates a helper for styled-components `shouldForwardProp`.**\n *\n * @description\n * 1. Returns a **predicate function** that determines whether a given prop\n * should be forwarded to the DOM.\n * 2. Useful for filtering out internal props (e.g., `$size`, `$active`)\n * so they don't become invalid HTML attributes.\n *\n * - **Behavior:**\n * - Accepts a strict tuple of **string keys** to exclude from forwarding.\n * - Every key is validated as a **non-empty string** at runtime.\n * - Throws a `TypeError` if:\n * - `props` is not an array, or\n * - any item is not a non-empty string.\n * - Automatically coerces the tested prop name to string for matching.\n *\n * @template CustomProps\n * The component props type to validate against.\n *\n * @param {readonly Stringify<keyof CustomProps>[]}\n * props\n * The list of prop names (keys of `CustomProps`) to exclude from forwarding.\n *\n * @returns {(propName: keyof CustomProps | ({} & string)) => boolean}\n * A function that receives a prop name and returns:\n * - `true` ➔ the prop **will** be forwarded to the DOM.\n * - `false` ➔ the prop **will not** be forwarded.\n *\n * @throws **{@link TypeError | `TypeError`}**\n * when:\n * - `props` is not an array, or\n * - any item is not a non-empty string.\n *\n * @example\n * // Basic usage\n * type Props = { $size: string; color: string; visible: boolean };\n * const filter = shouldForwardProp<Props>([\"$size\"]);\n *\n * filter(\"$size\"); // ➔ false (blocked).\n * filter(\"color\"); // ➔ true (forwarded).\n * filter(\"visible\"); // ➔ true (forwarded).\n *\n * @example\n * // With styled-components\n * type CustomProps = { $internal: boolean; public: string; another: boolean };\n *\n * styled.div.withConfig({\n * shouldForwardProp: shouldForwardProp<CustomProps>([\"$internal\"])\n * });\n */\nexport const shouldForwardProp = <CustomProps extends Record<string, unknown>>(\n props: readonly Stringify<keyof CustomProps>[]\n // props: Partial<UnionToTupleStrict<keyof CustomProps>>\n): ((propName: keyof CustomProps | ({} & string)) => boolean) => {\n assertIsArray(props, {\n message: ({ currentType, validType }) =>\n `First parameter (\\`props\\`) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const invalidItems: { index: number; reason: string }[] = [];\n\n props.forEach((p, idx) => {\n if (!isString(p)) {\n invalidItems.push({\n index: idx,\n reason: `Expected a non-empty string, but received ${getPreciseType(p, {\n formatCase: \"toPascalCaseSpace\"\n })}.`\n });\n } else if (isEmptyString(p)) {\n invalidItems.push({\n index: idx,\n reason: \"Expected a non-empty string, but received EmptyString.\"\n });\n }\n });\n\n if (isNonEmptyArray(invalidItems)) {\n const maxWidth = Math.max(\n ...invalidItems.map((item) => String(item.index).length)\n );\n\n const details = invalidItems\n .map(\n (item) =>\n `• [Index ${String(item.index).padStart(maxWidth, \"0\")}] ${item.reason}`\n )\n .join(\"\\n\");\n\n throw new TypeError(\n `First parameter (\\`props\\`) contains invalid entries:\\n${details}`\n );\n }\n\n return (propName): boolean => {\n return !props.map(String).includes(String(propName));\n };\n};\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tailwind-IJvOdkZp.js","names":["defaultConfig","getDefaultConfig","extendTailwindMerge"],"sources":["../src/tailwind/class-names/cx.ts","../src/tailwind/tw-merge/_private/validate-props.ts","../src/tailwind/tw-merge/v3/twMergeDefault.ts","../src/tailwind/tw-merge/v4/twMergeDefault.ts","../src/tailwind/class-names/customCn.ts","../src/tailwind/class-names/cn.ts","../src/tailwind/tw-macro/shouldForwardProp.ts"],"sourcesContent":["import { isArray } from \"@/predicates/is/isArray\";\nimport { isNumber } from \"@/predicates/is/isNumber\";\nimport { isStringObject } from \"@/predicates/is/isStringObject\";\nimport { isNumberObject } from \"@/predicates/is/isNumberObject\";\nimport { isBooleanObject } from \"@/predicates/is/isBooleanObject\";\nimport { isObjectOrArray } from \"@/predicates/is/isObjectOrArray\";\nimport { isNonEmptyString } from \"@/predicates/is/isNonEmptyString\";\n\n/** ----------------------------------------------------------\n * * ***Type-Utility: `ClassValue`.***\n * ----------------------------------------------------------\n * **Represents a single valid value that can be converted to a CSS class string.**\n * @description\n * - Supports the following types:\n * - `string` → literal class names (non-empty only)\n * - `number | bigint` → numeric class names\n * - `boolean` → only `true` is considered in objects/arrays\n * - `null | undefined` → ignored\n * - `ClassObject` → objects where **keys with truthy values** are included\n * - `ClassValues` → arrays recursively flattened\n * - Used internally by ***`cx` utility function*** to process mixed input values.\n * @example\n * ```ts\n * const val1: ClassValue = \"button\"; // ➔ string\n * const val2: ClassValue = 0; // ➔ number\n * const val3: ClassValue = [\"a\", { b: true }]; // ➔ array with object\n * const val4: ClassValue = { d: true, e: false }; // ➔ object\n * const val5: ClassValue = new String(\"foo\"); // ➔ boxed string\n * const val6: ClassValue = new Number(\"123\"); // ➔ boxed number\n * const val7: ClassValue = new Boolean(\"true\"); // ➔ boxed boolean\n * ```\n */\nexport type ClassValue =\n | ClassValues\n | ClassObject\n | string\n | number\n | bigint\n | null\n | boolean\n | undefined;\n\n/** ----------------------------------------------------------\n * * ***Type-Utility: `ClassObject`.***\n * ----------------------------------------------------------\n * **Represents an object whose keys with truthy values are included in the final class string.**\n * @example\n * ```ts\n * const obj: ClassObject = { \"text-red\": true, \"hidden\": false };\n * // ➔ \"text-red\" when processed by cx\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ClassObject = Record<string, any>;\n\n/** ----------------------------------------------------------\n * * ***Type-Utility: `ClassValues`.***\n * ----------------------------------------------------------\n * **Represents an array of {@link ClassValue | `ClassValue's`}, potentially nested.**\n * @example\n * ```ts\n * const arr: ClassValues = [\n * \"a\",\n * 1,\n * [\"b\", { c: true, d: false }],\n * { e: 2 }\n * ];\n * ```\n */\nexport type ClassValues = ClassValue[];\n\n/** ----------------------------------------------------------\n * * ***Utility: `toStringValue`.***\n * ----------------------------------------------------------\n * **Converts a `ClassValue` into a single space-separated string suitable for CSS class usage.**\n * @param {ClassValue} value The mixed value to process.\n * @returns {string} A string containing all valid class names.\n * @description\n * - Arrays are recursively flattened.\n * - Objects include only keys with truthy values.\n * - Skips `null`, `undefined`, and empty strings.\n * - Numbers, strings, and bigint are included as-is.\n * - Boolean `false` is ignored in objects/arrays.\n * - Boxed primitives (`new String()`, `new Number()`, `new Boolean()`) are supported.\n * - Preserves inherited object keys.\n * @example\n * ```ts\n * toStringValue(\"btn\"); // ➔ \"btn\"\n * toStringValue([\"a\", 0, \"b\"]); // ➔ \"a b\"\n * toStringValue({ a: true, b: false, c: 1 }); // ➔ \"a c\"\n * toStringValue([\"a\", [\"b\", { c: true, d: false }]]); // ➔ \"a b c\"\n * toStringValue(new String(\"foo\")); // ➔ \"foo\"\n * toStringValue(new Number(42)); // ➔ \"42\"\n * toStringValue(new Boolean(true)); // ➔ \"true\"\n * toStringValue(new Boolean(false));// ➔ \"\"\n * ```\n */\nfunction toStringValue(value: ClassValue): string {\n let str = \"\";\n\n if (isNonEmptyString(value) || isNumber(value)) {\n str += value;\n } else if (isObjectOrArray(value)) {\n if (\n isStringObject(value) ||\n isNumberObject(value) ||\n isBooleanObject(value)\n ) {\n const val = value.valueOf();\n if (val) str += val; // skip falsy\n } else if (isArray(value)) {\n for (const item of value) {\n if (!item) continue; // skip falsy\n const y = toStringValue(item);\n if (!y) continue;\n if (str) str += \" \";\n str += y;\n }\n } else {\n for (const key in value) {\n if (!value[key]) continue; // skip falsy\n if (str) str += \" \";\n str += key;\n }\n }\n }\n\n return str;\n}\n\n/** ----------------------------------------------------------\n * * ***Utility: `cx`.***\n * ----------------------------------------------------------\n * **Merge multiple class values into a single, space-separated string suitable for CSS usage.**\n * @description\n * - Supports **nested combinations** of arrays and objects, recursively.\n * - **Falsy values** are skipped:\n * - `false`, `null`, `undefined`, empty strings `\"\"` are ignored anywhere.\n * - Numbers `0` are ignored inside nested arrays/objects.\n * - **Boxed primitives** are correctly unwrapped to their primitive value.\n * - **Inherited object keys** are included in the final class string.\n * - Optimized for **CSS class merging** where conditional inclusion is common.\n * @param {ClassValues} values\n * A list of mixed class values, which can include:\n * - **Strings** → literal class names.\n * - **Numbers** → numeric class names.\n * - **BigInt** → numeric class names larger than JS safe integer limit.\n * - **Arrays** → recursively flattened, can contain nested arrays or objects.\n * - **Objects** → include keys whose values are truthy. Inherited keys are also included.\n * - **Boxed primitives** (`new String()`, `new Number()`, `new Boolean()`) → automatically unwrapped.\n * - **Falsy values** (`false`, `null`, `undefined`, `\"\"`, `0`) are ignored according to original behavior.\n * @returns {string}\n * A single space-separated string containing all valid class names.\n * @example\n * ```ts\n * // Basic string merge\n * cx(\"btn\", \"btn-primary\");\n * // ➔ \"btn btn-primary\"\n *\n * // Mixed arrays and objects\n * cx(\"a\", [\"b\", { c: true, d: false }], { e: 1, f: 0 }, null, 2);\n * // ➔ \"a b c e 2\"\n *\n * // Empty and falsy values are ignored\n * cx(\"\", null, undefined, false, 0);\n * // ➔ \"\"\n *\n * // Nested arrays with objects\n * cx([\"a\", [\"b\", { c: true, d: false }]]);\n * // ➔ \"a b c\"\n *\n * // Boxed primitives are unwrapped\n * cx(new String(\"foo\"), new Number(42), new Boolean(true), new Number(0), new Boolean(false));\n * // ➔ \"foo 42 true\"\n *\n * // Inherited keys from objects are included\n * const proto = { inherited: true };\n * const obj = Object.create(proto);\n * obj.own = true;\n * cx(obj);\n * // ➔ \"own inherited\"\n * ```\n */\nexport function cx(...values: ClassValues): string {\n let str = \"\";\n\n for (const value of values) {\n if (!value) continue; // skip falsy arguments\n const x = toStringValue(value);\n if (!x) continue;\n if (str) str += \" \";\n str += x;\n }\n\n return str;\n}\n","import type { Config as TwConfig } from \"tailwindcss\";\nimport type { ConfigExtension } from \"tailwind-merge-v4\";\n\nimport type { OptionsMergeTwClsV4 } from \"../v4/_private/types\";\n\nimport { hasOwnProp } from \"@/predicates/has/hasOwnProp\";\n\nimport { isNumber } from \"@/predicates/is/isNumber\";\nimport { isFunction } from \"@/predicates/is/isFunction\";\nimport { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { isNonEmptyArray } from \"@/predicates/is/isNonEmptyArray\";\nimport { isNonEmptyString } from \"@/predicates/is/isNonEmptyString\";\n\nexport type TailwindConfig = TwConfig;\n\ntype TwMergeConfigExt = ConfigExtension<string, string>;\n\ntype ValidatorTwMergeReturn = {\n config: TwConfig;\n override: TwMergeConfigExt[\"override\"];\n cacheSize: TwMergeConfigExt[\"cacheSize\"];\n prefix: TwMergeConfigExt[\"prefix\"];\n experimentalParseClassName?: TwMergeConfigExt[\"experimentalParseClassName\"];\n theme: NonNullable<NonNullable<TwMergeConfigExt[\"extend\"]>[\"theme\"]>;\n classGroups: NonNullable<\n NonNullable<TwMergeConfigExt[\"extend\"]>[\"classGroups\"]\n >;\n conflictingClassGroupModifiers: NonNullable<\n NonNullable<TwMergeConfigExt[\"extend\"]>[\"conflictingClassGroupModifiers\"]\n >;\n conflictingClassGroups: NonNullable<\n NonNullable<TwMergeConfigExt[\"extend\"]>[\"conflictingClassGroups\"]\n >;\n orderSensitiveModifiers: NonNullable<\n NonNullable<TwMergeConfigExt[\"extend\"]>[\"orderSensitiveModifiers\"]\n >;\n};\n\nexport const validatorPropsTwMerge = (\n options: OptionsMergeTwClsV4\n): ValidatorTwMergeReturn => {\n if (!isPlainObject(options)) options = {};\n let {\n config,\n prefix,\n extend,\n override,\n cacheSize,\n experimentalParseClassName\n } = options;\n\n if (!isPlainObject(config)) config = {};\n if (!isPlainObject(extend)) extend = {};\n if (!isPlainObject(override)) override = {};\n if (!isNumber(cacheSize)) cacheSize = undefined;\n if (!isNonEmptyString(prefix)) prefix = undefined;\n if (!isFunction(experimentalParseClassName))\n experimentalParseClassName = undefined;\n\n const theme = hasOwnProp(extend, \"theme\") ? extend.theme : {};\n const classGroups = hasOwnProp(extend, \"classGroups\")\n ? extend.classGroups\n : {};\n const conflictingClassGroupModifiers = hasOwnProp(\n extend,\n \"conflictingClassGroupModifiers\"\n )\n ? extend.conflictingClassGroupModifiers\n : {};\n\n const conflictingClassGroups = hasOwnProp(extend, \"conflictingClassGroups\")\n ? extend.conflictingClassGroups\n : {};\n const orderSensitiveModifiers =\n hasOwnProp(extend, \"orderSensitiveModifiers\") &&\n isNonEmptyArray(extend.orderSensitiveModifiers)\n ? extend.orderSensitiveModifiers\n : [];\n\n return {\n config,\n override,\n cacheSize,\n prefix,\n experimentalParseClassName,\n theme,\n classGroups,\n conflictingClassGroupModifiers,\n conflictingClassGroups,\n orderSensitiveModifiers\n };\n};\n","import type { OptionsMergeTwClsV3, TwMergeDefaultFnV3 } from \"./_private/types\";\n\nimport { extendTailwindMerge, getDefaultConfig } from \"tailwind-merge-v3\";\n\nimport { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { validatorPropsTwMerge } from \"../_private/validate-props\";\n\n// Get default Tailwind merge configuration\nconst defaultConfig = getDefaultConfig();\n\n/** -------------------------------------------------------------\n * * ***Customized Tailwind class merger Version 3 with extended rules.***\n * -------------------------------------------------------------\n * **Wraps ***`extendTailwindMerge` from tailwind-merge-v3*** with Tailwind’s default\n * config (_*`getDefaultConfig()` from tailwind-merge-v3*_) to create a **project-ready `twMerge`**.**\n * - 🔑 **When to use it?**\n * - Your project uses **Tailwind v3**.\n * - Extend **class groups** (e.g. add `text-shadow`).\n * - Respect your own **`tailwind.config.ts`** (colors, spacing, fontSize, etc).\n * - Override or fine-tune **merge behavior**.\n * - Create a **project-wide `cn` helper** that replaces raw `twMerge`.\n * @param {OptionsMergeTwClsV3} [options={}]\n * ***Merge options:***\n * - `config` – Your Tailwind config (from `tailwind.config.ts`).\n * - `prefix` - Utility prefix (e.g. `tw-` or `tw`).\n * - `extend` – Extra merge rules (classGroups, theme, etc).\n * - `override` – Fully replace rules.\n * - `cacheSize` – Parsed class cache size.\n * - `experimentalParseClassName` – Custom classname parser.\n * @returns {TwMergeDefaultFnV3}\n * Customized Tailwind class merge function version 3 (same signature as `twMerge`).\n * @example\n * #### Example 1: ***Default behavior (same as tailwind-merge).***\n * ```ts\n * import { twMergeDefaultV3 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const twMerge = twMergeDefaultV3();\n * twMerge(\"p-2 p-4\");\n * // ➔ \"p-4\"\n * ```\n * #### Example 2: ***Extend class groups.***\n * ```ts\n * import { twMergeDefaultV3 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const twMerge2 = twMergeDefaultV3({\n * extend: {\n * classGroups: {\n * shadow: [\"shadow-soft\", \"shadow-hard\"],\n * },\n * },\n * });\n * twMerge2(\"shadow-soft shadow-hard\");\n * // ➔ \"shadow-hard\"\n * ```\n * #### Example 3: ***Respect your Tailwind config.***\n * ```ts\n * import config from \"../tailwind.config\";\n * import { twMergeDefaultV3 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const twMerge3 = twMergeDefaultV3({ config });\n * twMerge3(\"text-base text-xxs\");\n * // ➔ \"text-xxs\" (resolved from config)\n * ```\n * #### Example 4: ***Project-wide helper (recommended).***\n * ```ts\n * import configTwCss from \"../tailwind.config\";\n * import { customCnV3, twMergeDefaultV3, type ClassValues } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const customTwMerge = twMergeDefaultV3({\n * config: configTwCss,\n * extend: {\n * classGroups: { shadow: [\"shadow-soft\", \"shadow-hard\"] },\n * },\n * });\n *\n * export const cnApp = (...classes: ClassValues) => {\n * return customCnV3(customTwMerge, ...classes);\n * };\n *\n * // ✅ Usage\n * cnApp(\"p-2 p-4\"); // ➔ \"p-4\"\n * cnApp(\"shadow-soft shadow-hard\"); // ➔ \"shadow-hard\"\n * cnApp(\"text-base text-xxs\"); // ➔ \"text-xxs\" (uses config)\n *\n * // ⚡ Difference with package-level `cn`\n * import { cnV3, cnV4 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * cnV3(\"text-base text-xxs\");\n * // or\n * cnV4(\"text-base text-xxs\");\n * // ➔ \"text-base\" (❌ doesn't know about your config)\n *\n * cnApp(\"text-base text-xxs\");\n * // ➔ \"text-xxs\" (✅ respects config)\n * ```\n */\nexport const twMergeDefaultV3 = (\n options: OptionsMergeTwClsV3 = {}\n): TwMergeDefaultFnV3 => {\n if (!isPlainObject(options)) options = {};\n const {\n cacheSize,\n classGroups,\n config,\n conflictingClassGroupModifiers,\n conflictingClassGroups,\n override,\n prefix,\n theme,\n experimentalParseClassName\n } = validatorPropsTwMerge(options);\n\n return extendTailwindMerge<string, string>({\n prefix: prefix ?? config.prefix,\n cacheSize: cacheSize || defaultConfig.cacheSize,\n experimentalParseClassName,\n override,\n extend: {\n conflictingClassGroupModifiers: {\n ...defaultConfig.conflictingClassGroupModifiers,\n ...conflictingClassGroupModifiers\n },\n theme: { ...defaultConfig.theme, ...theme },\n conflictingClassGroups: {\n ...defaultConfig.conflictingClassGroups,\n ...conflictingClassGroups\n },\n classGroups: {\n ...defaultConfig.classGroups,\n ...classGroups,\n\n \"text-shadow\": [\n \"\",\n \"-sm\",\n \"-md\",\n \"-lg\",\n \"-xl\",\n \"-xxl\",\n \"-none\",\n \"-default\"\n ].map((size) => `text-shadow${size}`),\n \"font-size\": Object.keys({\n ...(config.theme?.fontSize || {}),\n ...(config.theme?.extend?.fontSize || {})\n }).map((size) => `text-${size}`)\n }\n }\n });\n};\n","import type { OptionsMergeTwClsV4, TwMergeDefaultFnV4 } from \"./_private/types\";\n\nimport { extendTailwindMerge, getDefaultConfig } from \"tailwind-merge-v4\";\n\nimport { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { validatorPropsTwMerge } from \"../_private/validate-props\";\n\n// Get default Tailwind merge configuration\nconst defaultConfig = getDefaultConfig();\n\n/** -------------------------------------------------------------\n * * ***Customized Tailwind class merger Version 4 with extended rules.***\n * -------------------------------------------------------------\n * **Wraps ***`extendTailwindMerge` from tailwind-merge-v4*** with Tailwind’s default\n * config (_*`getDefaultConfig()` from tailwind-merge-v4*_) to create a **project-ready `twMerge`**.**\n * - 🔑 **When to use it?**\n * - Your project uses **Tailwind v4**.\n * - Extend **class groups** (e.g. add `text-shadow`).\n * - Respect your own **`tailwind.config.ts`** (colors, spacing, fontSize, etc).\n * - Override or fine-tune **merge behavior**.\n * - Create a **project-wide `cn` helper** that replaces raw `twMerge`.\n * @param {OptionsMergeTwClsV4} [options={}]\n * ***Merge options:***\n * - `config` – Your Tailwind config (from `tailwind.config.ts`).\n * - `prefix` - Utility prefix (e.g. `tw-` or `tw`).\n * - `extend` – Extra merge rules (classGroups, theme, etc).\n * - `override` – Fully replace rules.\n * - `cacheSize` – Parsed class cache size.\n * - `experimentalParseClassName` – Custom classname parser.\n * @returns {TwMergeDefaultFnV4}\n * Customized Tailwind class merge function version 4 (same signature as `twMerge`).\n * @example\n * #### Example 1: ***Default behavior (same as tailwind-merge).***\n * ```ts\n * import { twMergeDefaultV4 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const twMerge = twMergeDefaultV4();\n * twMerge(\"p-2 p-4\");\n * // ➔ \"p-4\"\n * ```\n * #### Example 2: ***Extend class groups.***\n * ```ts\n * import { twMergeDefaultV4 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const twMerge2 = twMergeDefaultV4({\n * extend: {\n * classGroups: {\n * shadow: [\"shadow-soft\", \"shadow-hard\"],\n * },\n * },\n * });\n * twMerge2(\"shadow-soft shadow-hard\");\n * // ➔ \"shadow-hard\"\n * ```\n * #### Example 3: ***Respect your Tailwind config.***\n * ```ts\n * import config from \"../tailwind.config\";\n * import { twMergeDefaultV4 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const twMerge3 = twMergeDefaultV4({ config });\n * twMerge3(\"text-base text-xxs\");\n * // ➔ \"text-xxs\" (resolved from config)\n * ```\n * #### Example 4: ***Project-wide helper (recommended).***\n * ```ts\n * import configTwCss from \"../tailwind.config\";\n * import { customCnV4, twMergeDefaultV4, type ClassValues } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const customTwMerge = twMergeDefaultV4({\n * config: configTwCss,\n * extend: {\n * classGroups: { shadow: [\"shadow-soft\", \"shadow-hard\"] },\n * },\n * });\n *\n * export const cnApp = (...classes: ClassValues) => {\n * return customCnV4(customTwMerge, ...classes);\n * };\n *\n * // ✅ Usage\n * cnApp(\"p-2 p-4\"); // ➔ \"p-4\"\n * cnApp(\"shadow-soft shadow-hard\"); // ➔ \"shadow-hard\"\n * cnApp(\"text-base text-xxs\"); // ➔ \"text-xxs\" (uses config)\n *\n * // ⚡ Difference with package-level `cn`\n * import { cnV3, cnV4 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * cnV3(\"text-base text-xxs\");\n * // or\n * cnV4(\"text-base text-xxs\");\n * // ➔ \"text-base\" (❌ doesn't know about your config)\n *\n * cnApp(\"text-base text-xxs\");\n * // ➔ \"text-xxs\" (✅ respects config)\n * ```\n */\nexport const twMergeDefaultV4 = (\n options: OptionsMergeTwClsV4 = {}\n): TwMergeDefaultFnV4 => {\n if (!isPlainObject(options)) options = {};\n const {\n cacheSize,\n classGroups,\n config,\n conflictingClassGroupModifiers,\n conflictingClassGroups,\n orderSensitiveModifiers,\n override,\n prefix,\n theme,\n experimentalParseClassName\n } = validatorPropsTwMerge(options);\n\n return extendTailwindMerge<string, string>({\n prefix: prefix || config.prefix,\n cacheSize: cacheSize || defaultConfig.cacheSize,\n experimentalParseClassName,\n override,\n extend: {\n conflictingClassGroupModifiers: {\n ...defaultConfig.conflictingClassGroupModifiers,\n ...conflictingClassGroupModifiers\n },\n theme: { ...defaultConfig.theme, ...theme },\n conflictingClassGroups: {\n ...defaultConfig.conflictingClassGroups,\n ...conflictingClassGroups\n },\n orderSensitiveModifiers: [\n ...defaultConfig.orderSensitiveModifiers,\n ...orderSensitiveModifiers\n ],\n classGroups: {\n ...defaultConfig.classGroups,\n ...classGroups,\n\n \"text-shadow\": [\n \"\",\n \"-sm\",\n \"-md\",\n \"-lg\",\n \"-xl\",\n \"-xxl\",\n \"-none\",\n \"-default\"\n ].map((size) => `text-shadow${size}`),\n \"font-size\": Object.keys({\n ...(config.theme?.fontSize || {}),\n ...(config.theme?.extend?.fontSize || {})\n }).map((size) => `text-${size}`)\n }\n }\n });\n};\n","import type { TwMergeDefaultFnV3 } from \"../tw-merge/v3/_private/types\";\nimport type { TwMergeDefaultFnV4 } from \"../tw-merge/v4/_private/types\";\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { twMergeDefaultV3 } from \"../tw-merge/v3/twMergeDefault\";\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { twMergeDefaultV4 } from \"../tw-merge/v4/twMergeDefault\";\n\nimport { isFunction } from \"@/predicates/is/isFunction\";\nimport { getPreciseType } from \"@/predicates/type/getPreciseType\";\nimport { cx, type ClassValues } from \"./cx\";\n\nexport type { ClassValues };\n\n/** -------------------------------------------------------------\n * * ***Factory utility for building a custom `cn` helper (Tailwind `v3`).***\n * -------------------------------------------------------------\n * **Wraps internally function to combines class-name values and applies the provided\n * Tailwind merge function (from {@link twMergeDefaultV3 | `twMergeDefaultV3`}).**\n * - 🔑 **When to use it?**\n * - Your project uses **Tailwind v3**.\n * - You extend Tailwind merge rules (`classGroups`, `tailwind.config`).\n * - You need multiple `cn*` variants across apps/packages.\n * @param {TwMergeDefaultFnV3} customTwMergeV3 - Merge function created via {@link twMergeDefaultV3 | `twMergeDefaultV3`}.\n * @param {ClassValues} classes - Class values (`string`, `array`, `object`, `etc`).\n * @returns {string} Merged Tailwind class string.\n * @example\n * ```ts\n * import tailwindConfig from \"../tailwind.config\";\n * import { twMergeDefaultV3, customCnV3, type ClassValues } from \"@rzl-zone/utils-js/tailwind\";\n *\n * // 1. Create a custom merge function\n * const myCustomTwMerge = twMergeDefaultV3({\n * config: tailwindConfig,\n * extend: {\n * classGroups: {\n * \"text-shadow\": [\"text-shadow\", \"text-shadow-sm\", \"text-shadow-md\"],\n * },\n * },\n * });\n *\n * // 2. Build your helper using `customCnV3`\n * export const cnApp = (...classes: ClassValues) => {\n * return customCnV3(myCustomTwMerge, ...classes);\n * };\n * // ✅ Usage\n * cnApp(\"p-2\", \"p-4\"); // ➔ \"p-4\"\n * cnApp(\"shadow-sm shadow-md\"); // ➔ \"shadow-md\"\n * cnApp(\"text-base text-xxs\"); // ➔ \"text-xxs\" (resolved from config)\n * ```\n */\nexport const customCnV3 = (\n customTwMergeV3: TwMergeDefaultFnV3,\n ...classes: ClassValues\n): string => {\n if (!isFunction(customTwMergeV3)) {\n throw new TypeError(\n `first Parameter (\\`customTwMergeV3\\`) must be of type \\`function\\`, but received: \\`${getPreciseType(\n customTwMergeV3\n )}\\`.`\n );\n }\n\n return customTwMergeV3(cx(...classes));\n};\n\n/** -------------------------------------------------------------\n * * ***Factory utility for building a custom `cn` helper (Tailwind `v4`).***\n * -------------------------------------------------------------\n * **Wraps internally function to combines class-name values and applies the provided\n * Tailwind merge function (from {@link twMergeDefaultV4 | `twMergeDefaultV4`}).**\n * - 🔑 **When to use it?**\n * - Your project uses **Tailwind v4**.\n * - You extend Tailwind merge rules (`classGroups`, `tailwind.config`).\n * - You need multiple `cn*` variants across apps/packages.\n * @param {TwMergeDefaultFnV4} customTwMergeV4 - Merge function created via {@link twMergeDefaultV4 | `twMergeDefaultV4`}.\n * @param {ClassValues} classes - Class values (`string`, `array`, `object`, `etc`).\n * @returns {string} Merged Tailwind class string.\n * @example\n * ```ts\n * import tailwindConfig from \"../tailwind.config\";\n * import { twMergeDefaultV4, customCnV4, type ClassValues } from \"@rzl-zone/utils-js/tailwind\";\n *\n * // 1. Create a custom merge function\n * const myCustomTwMerge = twMergeDefaultV4({\n * config: tailwindConfig,\n * extend: {\n * classGroups: {\n * \"text-shadow\": [\"text-shadow\", \"text-shadow-sm\", \"text-shadow-md\"],\n * },\n * },\n * });\n *\n * // 2. Build your helper using `customCnV4`\n * export const cnApp = (...classes: ClassValues) => {\n * return customCnV4(myCustomTwMerge, ...classes);\n * };\n *\n * // ✅ Usage\n * cnApp(\"p-2\", \"p-4\"); // ➔ \"p-4\"\n * cnApp(\"shadow-sm shadow-md\"); // ➔ \"shadow-md\"\n * cnApp(\"text-base text-xxs\"); // ➔ \"text-xxs\" (resolved from config)\n * ```\n */\nexport const customCnV4 = (\n customTwMergeV4: TwMergeDefaultFnV4,\n ...classes: ClassValues\n): string => {\n if (!isFunction(customTwMergeV4)) {\n throw new TypeError(\n `first Parameter (\\`customTwMergeV4\\`) must be of type \\`function\\`, but received: \\`${getPreciseType(\n customTwMergeV4\n )}\\`.`\n );\n }\n\n return customTwMergeV4(cx(...classes));\n};\n","import type { ClassValues } from \"./cx\";\n\nimport { cx } from \"./cx\";\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { customCnV3, customCnV4 } from \"./customCn\";\nimport { twMergeDefaultV3 } from \"../tw-merge/v3/twMergeDefault\";\nimport { twMergeDefaultV4 } from \"../tw-merge/v4/twMergeDefault\";\n\nconst defaultTwMergeV3 = twMergeDefaultV3();\nconst defaultTwMergeV4 = twMergeDefaultV4();\n\n/** -------------------------------------------------------------\n * * ***Default `cnV3` utility (Tailwind v3).***\n * -------------------------------------------------------------\n * **Combines class-name values and then deduplicates/resolves\n * conflicts using {@link twMergeDefaultV3 | `twMergeDefaultV3`}\n * with **Tailwind v3 default config only**.**\n * - ✅ **Use this when:**\n * - Your project uses **Tailwind v3**.\n * - You need a simple `cn` that works out of the box without a custom config.\n * - ⚡ **Need custom rules?**\n * - Create a project-wide helper using\n * {@link twMergeDefaultV3 | `twMergeDefaultV3`} +\n * {@link customCnV3 | `customCnV3`} (see Example 2).\n * @param {ClassValues} classes - Class values (`string`, `array`, `object`, `etc`).\n * @returns {string} Merged Tailwind class string.\n * @example\n * #### Example 1: ✅ Default usage (Tailwind v3).\n * ```ts\n * cnV3(\"p-2\", \"p-4\");\n * // ➔ \"p-4\"\n *\n * cnV3(\"text-red-500\", { \"text-blue-500\": true });\n * // ➔ \"text-blue-500\"\n *\n * cnV3([\"m-2\", [\"m-4\"]], \"m-8\");\n * // ➔ \"m-8\"\n * ```\n * #### Example 2: ⚡ Custom project-wide usage with Tailwind config.\n * ```ts\n * import tailwindConfig from \"../tailwind.config\";\n * import { twMergeDefaultV3, customCnV3, type ClassValues } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const cnApp = (...classes: ClassValues) => {\n * return customCnV3(\n * twMergeDefaultV3({\n * config: tailwindConfig,\n * extend: {\n * classGroups: {\n * \"text-shadow\": [\n * \"text-shadow\",\n * \"text-shadow-sm\",\n * \"text-shadow-md\",\n * ],\n * },\n * },\n * }),\n * // ...other options classes,\n * );\n * };\n *\n * cnApp(\"p-2 p-4\"); // ➔ \"p-4\"\n * cnApp(\"shadow-sm shadow-md\"); // ➔ \"shadow-md\"\n * cnApp(\"text-base text-xxs\"); // ➔ \"text-xxs\" (resolved from config)\n * ```\n */\nexport const cnV3 = (...classes: ClassValues): string => {\n return defaultTwMergeV3(cx(...classes));\n};\n\n/** -------------------------------------------------------------\n * * ***Default `cnV4` utility (Tailwind v4).***\n * -------------------------------------------------------------\n * **Combines class-name values and then deduplicates/resolves\n * conflicts using {@link twMergeDefaultV4 | `twMergeDefaultV4`}\n * with **Tailwind v4 default config only**.**\n * - ✅ **Use this when:**\n * - Your project uses **Tailwind v4**.\n * - You need a simple `cn` that works out of the box without a custom config.\n * - ⚡ **Need custom rules?**\n * - Create a project-wide helper using\n * {@link twMergeDefaultV4 | `twMergeDefaultV4`} +\n * {@link customCnV4 | `customCnV4`} (see Example 2).\n * @param {ClassValues} classes - Class values (`string`, `array`, `object`, `etc`).\n * @returns {string} Merged Tailwind class string.\n * @example\n * #### Example 1: ✅ Default usage (Tailwind v4).\n * ```ts\n * cnV4(\"p-2\", \"p-4\");\n * // ➔ \"p-4\"\n *\n * cnV4(\"text-red-500\", { \"text-blue-500\": true });\n * // ➔ \"text-blue-500\"\n *\n * cnV4([\"m-2\", [\"m-4\"]], \"m-8\");\n * // ➔ \"m-8\"\n * ```\n * #### Example 2: ⚡ Custom project-wide usage with Tailwind config.\n * ```ts\n * import tailwindConfig from \"../tailwind.config\";\n * import { twMergeDefaultV4, customCnV4, type ClassValues } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const cnApp = (...classes: ClassValues) => {\n * return customCnV4(\n * twMergeDefaultV4({\n * config: tailwindConfig,\n * extend: {\n * classGroups: {\n * \"text-shadow\": [\n * \"text-shadow\",\n * \"text-shadow-sm\",\n * \"text-shadow-md\",\n * ],\n * },\n * },\n * }),\n * // ...other options classes,\n * );\n * };\n *\n * cnApp(\"p-2 p-4\"); // ➔ \"p-4\"\n * cnApp(\"shadow-sm shadow-md\"); // ➔ \"shadow-md\"\n * cnApp(\"text-base text-xxs\"); // ➔ \"text-xxs\" (resolved from config)\n * ```\n */\nexport const cnV4 = (...classes: ClassValues): string => {\n return defaultTwMergeV4(cx(...classes));\n};\n","import type { Stringify } from \"@rzl-zone/ts-types-plus\";\n\nimport { isString } from \"@/predicates/is/isString\";\nimport { isEmptyString } from \"@/predicates/is/isEmptyString\";\nimport { getPreciseType } from \"@/predicates/type/getPreciseType\";\nimport { isNonEmptyArray } from \"@/predicates/is/isNonEmptyArray\";\nimport { assertIsArray } from \"@/assertions/objects/assertIsArray\";\n\n/** ----------------------------------------------------------\n * * ***Utility: `shouldForwardProp`.***\n * ----------------------------------------------------------\n * **Creates a helper for styled-components `shouldForwardProp`.**\n *\n * @description\n * 1. Returns a **predicate function** that determines whether a given prop\n * should be forwarded to the DOM.\n * 2. Useful for filtering out internal props (e.g., `$size`, `$active`)\n * so they don't become invalid HTML attributes.\n *\n * - **Behavior:**\n * - Accepts a strict tuple of **string keys** to exclude from forwarding.\n * - Every key is validated as a **non-empty string** at runtime.\n * - Throws a `TypeError` if:\n * - `props` is not an array, or\n * - any item is not a non-empty string.\n * - Automatically coerces the tested prop name to string for matching.\n *\n * @template CustomProps\n * The component props type to validate against.\n *\n * @param {readonly Stringify<keyof CustomProps>[]}\n * props\n * The list of prop names (keys of `CustomProps`) to exclude from forwarding.\n *\n * @returns {(propName: keyof CustomProps | ({} & string)) => boolean}\n * A function that receives a prop name and returns:\n * - `true` ➔ the prop **will** be forwarded to the DOM.\n * - `false` ➔ the prop **will not** be forwarded.\n *\n * @throws **{@link TypeError | `TypeError`}**\n * when:\n * - `props` is not an array, or\n * - any item is not a non-empty string.\n *\n * @example\n * // Basic usage\n * type Props = { $size: string; color: string; visible: boolean };\n * const filter = shouldForwardProp<Props>([\"$size\"]);\n *\n * filter(\"$size\"); // ➔ false (blocked).\n * filter(\"color\"); // ➔ true (forwarded).\n * filter(\"visible\"); // ➔ true (forwarded).\n *\n * @example\n * // With styled-components\n * type CustomProps = { $internal: boolean; public: string; another: boolean };\n *\n * styled.div.withConfig({\n * shouldForwardProp: shouldForwardProp<CustomProps>([\"$internal\"])\n * });\n */\nexport const shouldForwardProp = <CustomProps extends Record<string, unknown>>(\n props: readonly Stringify<keyof CustomProps>[]\n // props: Partial<UnionToTupleStrict<keyof CustomProps>>\n): ((propName: keyof CustomProps | ({} & string)) => boolean) => {\n assertIsArray(props, {\n message: ({ currentType, validType }) =>\n `First parameter (\\`props\\`) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const invalidItems: { index: number; reason: string }[] = [];\n\n props.forEach((p, idx) => {\n if (!isString(p)) {\n invalidItems.push({\n index: idx,\n reason: `Expected a non-empty string, but received ${getPreciseType(p, {\n formatCase: \"toPascalCaseSpace\"\n })}.`\n });\n } else if (isEmptyString(p)) {\n invalidItems.push({\n index: idx,\n reason: \"Expected a non-empty string, but received EmptyString.\"\n });\n }\n });\n\n if (isNonEmptyArray(invalidItems)) {\n const maxWidth = Math.max(\n ...invalidItems.map((item) => String(item.index).length)\n );\n\n const details = invalidItems\n .map(\n (item) =>\n `• [Index ${String(item.index).padStart(maxWidth, \"0\")}] ${item.reason}`\n )\n .join(\"\\n\");\n\n throw new TypeError(\n `First parameter (\\`props\\`) contains invalid entries:\\n${details}`\n );\n }\n\n return (propName): boolean => {\n return !props.map(String).includes(String(propName));\n };\n};\n"],"mappings":"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"}
|