@vielzeug/toolkit 1.0.13 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/dist/array/{sortBy.cjs → arrange.cjs} +2 -2
  2. package/dist/array/arrange.cjs.map +1 -0
  3. package/dist/array/arrange.js +6 -0
  4. package/dist/array/arrange.js.map +1 -0
  5. package/dist/array/chunk.cjs.map +1 -1
  6. package/dist/array/chunk.js.map +1 -1
  7. package/dist/array/list.cjs +1 -1
  8. package/dist/array/list.cjs.map +1 -1
  9. package/dist/array/list.js +86 -53
  10. package/dist/array/list.js.map +1 -1
  11. package/dist/array/remoteList.cjs +2 -0
  12. package/dist/array/remoteList.cjs.map +1 -0
  13. package/dist/array/remoteList.js +123 -0
  14. package/dist/array/remoteList.js.map +1 -0
  15. package/dist/async/attempt.cjs.map +1 -0
  16. package/dist/async/attempt.js.map +1 -0
  17. package/dist/async/defer.cjs +2 -0
  18. package/dist/async/defer.cjs.map +1 -0
  19. package/dist/async/defer.js +10 -0
  20. package/dist/async/defer.js.map +1 -0
  21. package/dist/async/delay.cjs.map +1 -0
  22. package/dist/async/delay.js.map +1 -0
  23. package/dist/async/parallel.cjs +2 -0
  24. package/dist/async/parallel.cjs.map +1 -0
  25. package/dist/async/parallel.js +28 -0
  26. package/dist/async/parallel.js.map +1 -0
  27. package/dist/async/pool.cjs +2 -0
  28. package/dist/async/pool.cjs.map +1 -0
  29. package/dist/async/pool.js +22 -0
  30. package/dist/async/pool.js.map +1 -0
  31. package/dist/async/predict.cjs.map +1 -0
  32. package/dist/async/predict.js.map +1 -0
  33. package/dist/async/queue.cjs +2 -0
  34. package/dist/async/queue.cjs.map +1 -0
  35. package/dist/async/queue.js +57 -0
  36. package/dist/async/queue.js.map +1 -0
  37. package/dist/async/race.cjs +2 -0
  38. package/dist/async/race.cjs.map +1 -0
  39. package/dist/async/race.js +8 -0
  40. package/dist/async/race.js.map +1 -0
  41. package/dist/async/retry.cjs.map +1 -0
  42. package/dist/{function → async}/retry.js +4 -4
  43. package/dist/async/retry.js.map +1 -0
  44. package/dist/async/sleep.cjs +2 -0
  45. package/dist/async/sleep.cjs.map +1 -0
  46. package/dist/{function → async}/sleep.js +1 -1
  47. package/dist/async/sleep.js.map +1 -0
  48. package/dist/async/waitFor.cjs +2 -0
  49. package/dist/async/waitFor.cjs.map +1 -0
  50. package/dist/async/waitFor.js +37 -0
  51. package/dist/async/waitFor.js.map +1 -0
  52. package/dist/date/expires.cjs.map +1 -1
  53. package/dist/date/expires.js.map +1 -1
  54. package/dist/date/interval.cjs.map +1 -1
  55. package/dist/date/interval.js.map +1 -1
  56. package/dist/date/timeDiff.cjs.map +1 -1
  57. package/dist/date/timeDiff.js.map +1 -1
  58. package/dist/function/memo.cjs.map +1 -1
  59. package/dist/function/memo.js.map +1 -1
  60. package/dist/function/proxy.cjs.map +1 -1
  61. package/dist/function/proxy.js.map +1 -1
  62. package/dist/function/prune.cjs +2 -0
  63. package/dist/function/prune.cjs.map +1 -0
  64. package/dist/function/prune.js +30 -0
  65. package/dist/function/prune.js.map +1 -0
  66. package/dist/index.cjs +1 -1
  67. package/dist/index.d.ts +575 -51
  68. package/dist/index.js +242 -206
  69. package/dist/index.js.map +1 -1
  70. package/dist/logit/dist/logit.cjs +1 -1
  71. package/dist/logit/dist/logit.cjs.map +1 -1
  72. package/dist/logit/dist/logit.js +147 -64
  73. package/dist/logit/dist/logit.js.map +1 -1
  74. package/dist/math/abs.cjs +2 -0
  75. package/dist/math/abs.cjs.map +1 -0
  76. package/dist/math/abs.js +7 -0
  77. package/dist/math/abs.js.map +1 -0
  78. package/dist/math/add.cjs +2 -0
  79. package/dist/math/add.cjs.map +1 -0
  80. package/dist/math/add.js +9 -0
  81. package/dist/math/add.js.map +1 -0
  82. package/dist/math/allocate.cjs +2 -0
  83. package/dist/math/allocate.cjs.map +1 -0
  84. package/dist/math/allocate.js +29 -0
  85. package/dist/math/allocate.js.map +1 -0
  86. package/dist/math/distribute.cjs +2 -0
  87. package/dist/math/distribute.cjs.map +1 -0
  88. package/dist/math/distribute.js +18 -0
  89. package/dist/math/distribute.js.map +1 -0
  90. package/dist/math/divide.cjs +2 -0
  91. package/dist/math/divide.cjs.map +1 -0
  92. package/dist/math/divide.js +11 -0
  93. package/dist/math/divide.js.map +1 -0
  94. package/dist/math/multiply.cjs +2 -0
  95. package/dist/math/multiply.cjs.map +1 -0
  96. package/dist/math/multiply.js +9 -0
  97. package/dist/math/multiply.js.map +1 -0
  98. package/dist/math/subtract.cjs +2 -0
  99. package/dist/math/subtract.cjs.map +1 -0
  100. package/dist/math/subtract.js +9 -0
  101. package/dist/math/subtract.js.map +1 -0
  102. package/dist/money/currency.cjs +2 -0
  103. package/dist/money/currency.cjs.map +1 -0
  104. package/dist/money/currency.js +49 -0
  105. package/dist/money/currency.js.map +1 -0
  106. package/dist/money/exchange.cjs +2 -0
  107. package/dist/money/exchange.cjs.map +1 -0
  108. package/dist/money/exchange.js +13 -0
  109. package/dist/money/exchange.js.map +1 -0
  110. package/dist/object/cache.cjs +2 -0
  111. package/dist/object/cache.cjs.map +1 -0
  112. package/dist/object/cache.js +63 -0
  113. package/dist/object/cache.js.map +1 -0
  114. package/dist/object/merge.cjs.map +1 -1
  115. package/dist/object/merge.js.map +1 -1
  116. package/dist/object/parseJSON.cjs.map +1 -1
  117. package/dist/object/parseJSON.js.map +1 -1
  118. package/dist/object/path.cjs.map +1 -1
  119. package/dist/object/path.js.map +1 -1
  120. package/package.json +1 -1
  121. package/dist/array/sortBy.cjs.map +0 -1
  122. package/dist/array/sortBy.js +0 -6
  123. package/dist/array/sortBy.js.map +0 -1
  124. package/dist/function/attempt.cjs.map +0 -1
  125. package/dist/function/attempt.js.map +0 -1
  126. package/dist/function/delay.cjs.map +0 -1
  127. package/dist/function/delay.js.map +0 -1
  128. package/dist/function/predict.cjs.map +0 -1
  129. package/dist/function/predict.js.map +0 -1
  130. package/dist/function/retry.cjs.map +0 -1
  131. package/dist/function/retry.js.map +0 -1
  132. package/dist/function/sleep.cjs +0 -2
  133. package/dist/function/sleep.cjs.map +0 -1
  134. package/dist/function/sleep.js.map +0 -1
  135. /package/dist/{function → async}/attempt.cjs +0 -0
  136. /package/dist/{function → async}/attempt.js +0 -0
  137. /package/dist/{function → async}/delay.cjs +0 -0
  138. /package/dist/{function → async}/delay.js +0 -0
  139. /package/dist/{function → async}/predict.cjs +0 -0
  140. /package/dist/{function → async}/predict.js +0 -0
  141. /package/dist/{function → async}/retry.cjs +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"currency.cjs","sources":["../../src/money/currency.ts"],"sourcesContent":["import type { Money } from './types';\n\n/**\n * Options for currency formatting.\n */\nexport type CurrencyFormatOptions = {\n locale?: string; // BCP 47 language tag (e.g., 'en-US', 'de-DE')\n style?: 'symbol' | 'code' | 'name'; // Display style\n minimumFractionDigits?: number; // Minimum decimal places\n maximumFractionDigits?: number; // Maximum decimal places\n};\n\n/**\n * Formats a monetary amount as a currency string with proper locale and symbol.\n * Handles decimal places automatically based on currency.\n *\n * @example\n * ```ts\n * const money = { amount: 123456n, currency: 'USD' };\n *\n * currency(money); // '$1,234.56' (default en-US)\n * currency(money, { locale: 'de-DE' }); // '1.234,56 $'\n * currency(money, { style: 'code' }); // 'USD 1,234.56'\n * currency(money, { style: 'name' }); // '1,234.56 US dollars'\n * ```\n *\n * @param money - Money object to format\n * @param options - Formatting options\n * @returns Formatted currency string\n */\nexport function currency(money: Money, options: CurrencyFormatOptions = {}): string {\n const { locale = 'en-US', style = 'symbol', minimumFractionDigits, maximumFractionDigits } = options;\n\n // Get decimal places for currency (default to 2 for most currencies)\n const decimalPlaces = getCurrencyDecimals(money.currency);\n\n // Convert bigint amount to decimal (divide by 10^decimalPlaces)\n const divisor = 10 ** decimalPlaces;\n const amount = Number(money.amount) / divisor;\n\n // Determine Intl.NumberFormat style\n let currencyDisplay: 'symbol' | 'code' | 'name';\n switch (style) {\n case 'symbol':\n currencyDisplay = 'symbol';\n break;\n case 'code':\n currencyDisplay = 'code';\n break;\n case 'name':\n currencyDisplay = 'name';\n break;\n default:\n currencyDisplay = 'symbol';\n }\n\n const formatter = new Intl.NumberFormat(locale, {\n currency: money.currency,\n currencyDisplay,\n maximumFractionDigits: maximumFractionDigits ?? decimalPlaces,\n minimumFractionDigits: minimumFractionDigits ?? decimalPlaces,\n style: 'currency',\n });\n\n return formatter.format(amount);\n}\n\n/**\n * Gets the number of decimal places for a currency.\n * Most currencies use 2 decimal places, but some use 0 or 3.\n */\nfunction getCurrencyDecimals(currencyCode: string): number {\n const zeroDecimalCurrencies = [\n 'BIF',\n 'CLP',\n 'DJF',\n 'GNF',\n 'JPY',\n 'KMF',\n 'KRW',\n 'MGA',\n 'PYG',\n 'RWF',\n 'UGX',\n 'VND',\n 'VUV',\n 'XAF',\n 'XOF',\n 'XPF',\n ];\n const threeDecimalCurrencies = ['BHD', 'IQD', 'JOD', 'KWD', 'LYD', 'OMR', 'TND'];\n\n if (zeroDecimalCurrencies.includes(currencyCode.toUpperCase())) {\n return 0;\n }\n if (threeDecimalCurrencies.includes(currencyCode.toUpperCase())) {\n return 3;\n }\n return 2; // Default for most currencies\n}\n"],"names":["currency","money","options","locale","style","minimumFractionDigits","maximumFractionDigits","decimalPlaces","getCurrencyDecimals","divisor","amount","currencyDisplay","currencyCode","zeroDecimalCurrencies","threeDecimalCurrencies"],"mappings":"gFA8BO,SAASA,EAASC,EAAcC,EAAiC,GAAY,CAClF,KAAM,CAAE,OAAAC,EAAS,QAAS,MAAAC,EAAQ,SAAU,sBAAAC,EAAuB,sBAAAC,GAA0BJ,EAGvFK,EAAgBC,EAAoBP,EAAM,QAAQ,EAGlDQ,EAAU,IAAMF,EAChBG,EAAS,OAAOT,EAAM,MAAM,EAAIQ,EAGtC,IAAIE,EACJ,OAAQP,EAAA,CACN,IAAK,SACHO,EAAkB,SAClB,MACF,IAAK,OACHA,EAAkB,OAClB,MACF,IAAK,OACHA,EAAkB,OAClB,MACF,QACEA,EAAkB,QAAA,CAWtB,OARkB,IAAI,KAAK,aAAaR,EAAQ,CAC9C,SAAUF,EAAM,SAChB,gBAAAU,EACA,sBAAuBL,GAAyBC,EAChD,sBAAuBF,GAAyBE,EAChD,MAAO,UAAA,CACR,EAEgB,OAAOG,CAAM,CAChC,CAMA,SAASF,EAAoBI,EAA8B,CACzD,MAAMC,EAAwB,CAC5B,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KAAA,EAEIC,EAAyB,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EAE/E,OAAID,EAAsB,SAASD,EAAa,YAAA,CAAa,EACpD,EAELE,EAAuB,SAASF,EAAa,YAAA,CAAa,EACrD,EAEF,CACT"}
@@ -0,0 +1,49 @@
1
+ function D(e, c = {}) {
2
+ const { locale: t = "en-US", style: i = "symbol", minimumFractionDigits: s, maximumFractionDigits: a } = c, n = u(e.currency), m = 10 ** n, o = Number(e.amount) / m;
3
+ let r;
4
+ switch (i) {
5
+ case "symbol":
6
+ r = "symbol";
7
+ break;
8
+ case "code":
9
+ r = "code";
10
+ break;
11
+ case "name":
12
+ r = "name";
13
+ break;
14
+ default:
15
+ r = "symbol";
16
+ }
17
+ return new Intl.NumberFormat(t, {
18
+ currency: e.currency,
19
+ currencyDisplay: r,
20
+ maximumFractionDigits: a ?? n,
21
+ minimumFractionDigits: s ?? n,
22
+ style: "currency"
23
+ }).format(o);
24
+ }
25
+ function u(e) {
26
+ const c = [
27
+ "BIF",
28
+ "CLP",
29
+ "DJF",
30
+ "GNF",
31
+ "JPY",
32
+ "KMF",
33
+ "KRW",
34
+ "MGA",
35
+ "PYG",
36
+ "RWF",
37
+ "UGX",
38
+ "VND",
39
+ "VUV",
40
+ "XAF",
41
+ "XOF",
42
+ "XPF"
43
+ ], t = ["BHD", "IQD", "JOD", "KWD", "LYD", "OMR", "TND"];
44
+ return c.includes(e.toUpperCase()) ? 0 : t.includes(e.toUpperCase()) ? 3 : 2;
45
+ }
46
+ export {
47
+ D as currency
48
+ };
49
+ //# sourceMappingURL=currency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"currency.js","sources":["../../src/money/currency.ts"],"sourcesContent":["import type { Money } from './types';\n\n/**\n * Options for currency formatting.\n */\nexport type CurrencyFormatOptions = {\n locale?: string; // BCP 47 language tag (e.g., 'en-US', 'de-DE')\n style?: 'symbol' | 'code' | 'name'; // Display style\n minimumFractionDigits?: number; // Minimum decimal places\n maximumFractionDigits?: number; // Maximum decimal places\n};\n\n/**\n * Formats a monetary amount as a currency string with proper locale and symbol.\n * Handles decimal places automatically based on currency.\n *\n * @example\n * ```ts\n * const money = { amount: 123456n, currency: 'USD' };\n *\n * currency(money); // '$1,234.56' (default en-US)\n * currency(money, { locale: 'de-DE' }); // '1.234,56 $'\n * currency(money, { style: 'code' }); // 'USD 1,234.56'\n * currency(money, { style: 'name' }); // '1,234.56 US dollars'\n * ```\n *\n * @param money - Money object to format\n * @param options - Formatting options\n * @returns Formatted currency string\n */\nexport function currency(money: Money, options: CurrencyFormatOptions = {}): string {\n const { locale = 'en-US', style = 'symbol', minimumFractionDigits, maximumFractionDigits } = options;\n\n // Get decimal places for currency (default to 2 for most currencies)\n const decimalPlaces = getCurrencyDecimals(money.currency);\n\n // Convert bigint amount to decimal (divide by 10^decimalPlaces)\n const divisor = 10 ** decimalPlaces;\n const amount = Number(money.amount) / divisor;\n\n // Determine Intl.NumberFormat style\n let currencyDisplay: 'symbol' | 'code' | 'name';\n switch (style) {\n case 'symbol':\n currencyDisplay = 'symbol';\n break;\n case 'code':\n currencyDisplay = 'code';\n break;\n case 'name':\n currencyDisplay = 'name';\n break;\n default:\n currencyDisplay = 'symbol';\n }\n\n const formatter = new Intl.NumberFormat(locale, {\n currency: money.currency,\n currencyDisplay,\n maximumFractionDigits: maximumFractionDigits ?? decimalPlaces,\n minimumFractionDigits: minimumFractionDigits ?? decimalPlaces,\n style: 'currency',\n });\n\n return formatter.format(amount);\n}\n\n/**\n * Gets the number of decimal places for a currency.\n * Most currencies use 2 decimal places, but some use 0 or 3.\n */\nfunction getCurrencyDecimals(currencyCode: string): number {\n const zeroDecimalCurrencies = [\n 'BIF',\n 'CLP',\n 'DJF',\n 'GNF',\n 'JPY',\n 'KMF',\n 'KRW',\n 'MGA',\n 'PYG',\n 'RWF',\n 'UGX',\n 'VND',\n 'VUV',\n 'XAF',\n 'XOF',\n 'XPF',\n ];\n const threeDecimalCurrencies = ['BHD', 'IQD', 'JOD', 'KWD', 'LYD', 'OMR', 'TND'];\n\n if (zeroDecimalCurrencies.includes(currencyCode.toUpperCase())) {\n return 0;\n }\n if (threeDecimalCurrencies.includes(currencyCode.toUpperCase())) {\n return 3;\n }\n return 2; // Default for most currencies\n}\n"],"names":["currency","money","options","locale","style","minimumFractionDigits","maximumFractionDigits","decimalPlaces","getCurrencyDecimals","divisor","amount","currencyDisplay","currencyCode","zeroDecimalCurrencies","threeDecimalCurrencies"],"mappings":"AA8BO,SAASA,EAASC,GAAcC,IAAiC,IAAY;AAClF,QAAM,EAAE,QAAAC,IAAS,SAAS,OAAAC,IAAQ,UAAU,uBAAAC,GAAuB,uBAAAC,MAA0BJ,GAGvFK,IAAgBC,EAAoBP,EAAM,QAAQ,GAGlDQ,IAAU,MAAMF,GAChBG,IAAS,OAAOT,EAAM,MAAM,IAAIQ;AAGtC,MAAIE;AACJ,UAAQP,GAAA;AAAA,IACN,KAAK;AACH,MAAAO,IAAkB;AAClB;AAAA,IACF,KAAK;AACH,MAAAA,IAAkB;AAClB;AAAA,IACF,KAAK;AACH,MAAAA,IAAkB;AAClB;AAAA,IACF;AACE,MAAAA,IAAkB;AAAA,EAAA;AAWtB,SARkB,IAAI,KAAK,aAAaR,GAAQ;AAAA,IAC9C,UAAUF,EAAM;AAAA,IAChB,iBAAAU;AAAA,IACA,uBAAuBL,KAAyBC;AAAA,IAChD,uBAAuBF,KAAyBE;AAAA,IAChD,OAAO;AAAA,EAAA,CACR,EAEgB,OAAOG,CAAM;AAChC;AAMA,SAASF,EAAoBI,GAA8B;AACzD,QAAMC,IAAwB;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GAEIC,IAAyB,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAE/E,SAAID,EAAsB,SAASD,EAAa,YAAA,CAAa,IACpD,IAELE,EAAuB,SAASF,EAAa,YAAA,CAAa,IACrD,IAEF;AACT;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function r(e,t){if(e.currency!==t.from)throw new Error(`Currency mismatch: expected ${t.from}, got ${e.currency}`);const n=BigInt(Math.round(t.rate*1e6));return{amount:e.amount*n/1000000n,currency:t.to}}exports.exchange=r;
2
+ //# sourceMappingURL=exchange.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exchange.cjs","sources":["../../src/money/exchange.ts"],"sourcesContent":["import type { Money } from './types';\n\n/**\n * Exchange rate for currency conversion.\n */\nexport type ExchangeRate = {\n from: string; // Source currency code\n to: string; // Target currency code\n rate: number; // Exchange rate multiplier\n};\n\n/**\n * Converts money from one currency to another using the provided exchange rate.\n * Maintains precision by using bigint arithmetic.\n *\n * @example\n * ```ts\n * const usd = { amount: 100000n, currency: 'USD' }; // $1,000.00\n * const rate = { from: 'USD', to: 'EUR', rate: 0.85 };\n *\n * exchange(usd, rate);\n * // { amount: 85000n, currency: 'EUR' } // €850.00\n * ```\n *\n * @param money - Money to convert\n * @param rate - Exchange rate information\n * @returns Converted money in target currency\n * @throws {Error} If source currency doesn't match rate.from\n */\nexport function exchange(money: Money, rate: ExchangeRate): Money {\n if (money.currency !== rate.from) {\n throw new Error(`Currency mismatch: expected ${rate.from}, got ${money.currency}`);\n }\n\n // Convert rate to avoid floating point issues\n // Multiply by 1000000 for precision, then divide back\n const rateBigInt = BigInt(Math.round(rate.rate * 1000000));\n const convertedAmount = (money.amount * rateBigInt) / 1000000n;\n\n return {\n amount: convertedAmount,\n currency: rate.to,\n };\n}\n"],"names":["exchange","money","rate","rateBigInt"],"mappings":"gFA6BO,SAASA,EAASC,EAAcC,EAA2B,CAChE,GAAID,EAAM,WAAaC,EAAK,KAC1B,MAAM,IAAI,MAAM,+BAA+BA,EAAK,IAAI,SAASD,EAAM,QAAQ,EAAE,EAKnF,MAAME,EAAa,OAAO,KAAK,MAAMD,EAAK,KAAO,GAAO,CAAC,EAGzD,MAAO,CACL,OAHuBD,EAAM,OAASE,EAAc,SAIpD,SAAUD,EAAK,EAAA,CAEnB"}
@@ -0,0 +1,13 @@
1
+ function o(r, n) {
2
+ if (r.currency !== n.from)
3
+ throw new Error(`Currency mismatch: expected ${n.from}, got ${r.currency}`);
4
+ const t = BigInt(Math.round(n.rate * 1e6));
5
+ return {
6
+ amount: r.amount * t / 1000000n,
7
+ currency: n.to
8
+ };
9
+ }
10
+ export {
11
+ o as exchange
12
+ };
13
+ //# sourceMappingURL=exchange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exchange.js","sources":["../../src/money/exchange.ts"],"sourcesContent":["import type { Money } from './types';\n\n/**\n * Exchange rate for currency conversion.\n */\nexport type ExchangeRate = {\n from: string; // Source currency code\n to: string; // Target currency code\n rate: number; // Exchange rate multiplier\n};\n\n/**\n * Converts money from one currency to another using the provided exchange rate.\n * Maintains precision by using bigint arithmetic.\n *\n * @example\n * ```ts\n * const usd = { amount: 100000n, currency: 'USD' }; // $1,000.00\n * const rate = { from: 'USD', to: 'EUR', rate: 0.85 };\n *\n * exchange(usd, rate);\n * // { amount: 85000n, currency: 'EUR' } // €850.00\n * ```\n *\n * @param money - Money to convert\n * @param rate - Exchange rate information\n * @returns Converted money in target currency\n * @throws {Error} If source currency doesn't match rate.from\n */\nexport function exchange(money: Money, rate: ExchangeRate): Money {\n if (money.currency !== rate.from) {\n throw new Error(`Currency mismatch: expected ${rate.from}, got ${money.currency}`);\n }\n\n // Convert rate to avoid floating point issues\n // Multiply by 1000000 for precision, then divide back\n const rateBigInt = BigInt(Math.round(rate.rate * 1000000));\n const convertedAmount = (money.amount * rateBigInt) / 1000000n;\n\n return {\n amount: convertedAmount,\n currency: rate.to,\n };\n}\n"],"names":["exchange","money","rate","rateBigInt"],"mappings":"AA6BO,SAASA,EAASC,GAAcC,GAA2B;AAChE,MAAID,EAAM,aAAaC,EAAK;AAC1B,UAAM,IAAI,MAAM,+BAA+BA,EAAK,IAAI,SAASD,EAAM,QAAQ,EAAE;AAKnF,QAAME,IAAa,OAAO,KAAK,MAAMD,EAAK,OAAO,GAAO,CAAC;AAGzD,SAAO;AAAA,IACL,QAHuBD,EAAM,SAASE,IAAc;AAAA,IAIpD,UAAUD,EAAK;AAAA,EAAA;AAEnB;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function T(){const r=new Map,o=new Map,n=new Map,c=e=>JSON.stringify(e);function i(e){return r.get(c(e))}function u(e,t){r.set(c(e),t)}function l(e){const t=c(e);return a(t),n.delete(t),r.delete(t)}function f(){o.forEach(e=>{clearTimeout(e)}),r.clear(),o.clear(),n.clear()}function d(){return r.size}function g(e,t){const s=c(e);a(s),o.set(s,setTimeout(()=>{r.delete(s),o.delete(s),n.delete(s)},t))}function h(e,t){n.set(c(e),{lastUsedAt:Date.now(),...t})}function m(e){return n.get(c(e))}function M(e){return n.get(e)}function y(){return Array.from(n.keys())}function a(e){const t=o.get(e);t&&(clearTimeout(t),o.delete(e))}return{clear:f,delete:l,get:i,getMeta:m,getMetaByHash:M,hash:c,listMetaHashes:y,scheduleGc:g,set:u,setMeta:h,size:d}}exports.cache=T;
2
+ //# sourceMappingURL=cache.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.cjs","sources":["../../src/object/cache.ts"],"sourcesContent":["/**\n * Creates a generic key-value cache with automatic garbage collection and observer support.\n *\n * @example\n * ```ts\n * const myCache = cache<string>();\n * myCache.set(['user', 1], 'John Doe');\n * const value = myCache.get(['user', 1]); // 'John Doe'\n * myCache.scheduleGc(['user', 1], 5000); // Auto-delete after 5s\n * ```\n *\n * @template T - The type of values stored in the cache.\n *\n * @returns A cache instance with get, set, delete, clear, and GC methods.\n */\nexport function cache<T>() {\n const store = new Map<string, T>();\n const gcTimers = new Map<string, ReturnType<typeof setTimeout>>();\n const metadata = new Map<string, { lastUsedAt: number }>();\n\n const hash = (key: readonly unknown[]) => JSON.stringify(key);\n\n function get(key: readonly unknown[]): T | undefined {\n return store.get(hash(key));\n }\n\n function set(key: readonly unknown[], value: T): void {\n store.set(hash(key), value);\n }\n\n function del(key: readonly unknown[]): boolean {\n const h = hash(key);\n clearGc(h);\n metadata.delete(h);\n return store.delete(h);\n }\n\n function clear(): void {\n gcTimers.forEach((timer) => {\n clearTimeout(timer);\n });\n store.clear();\n gcTimers.clear();\n metadata.clear();\n }\n\n function size(): number {\n return store.size;\n }\n\n function scheduleGc(key: readonly unknown[], delayMs: number): void {\n const h = hash(key);\n clearGc(h);\n gcTimers.set(\n h,\n setTimeout(() => {\n store.delete(h);\n gcTimers.delete(h);\n metadata.delete(h);\n }, delayMs),\n );\n }\n\n function setMeta(key: readonly unknown[], meta: Record<string, unknown>): void {\n metadata.set(hash(key), { lastUsedAt: Date.now(), ...meta });\n }\n\n function getMeta(key: readonly unknown[]): Record<string, unknown> | undefined {\n return metadata.get(hash(key));\n }\n\n function getMetaByHash(keyHash: string): Record<string, unknown> | undefined {\n return metadata.get(keyHash);\n }\n\n function listMetaHashes(): string[] {\n return Array.from(metadata.keys());\n }\n\n function clearGc(keyHash: string): void {\n const timer = gcTimers.get(keyHash);\n if (timer) {\n clearTimeout(timer);\n gcTimers.delete(keyHash);\n }\n }\n\n return {\n clear,\n delete: del,\n get,\n getMeta,\n getMetaByHash,\n hash,\n listMetaHashes,\n scheduleGc,\n set,\n setMeta,\n size,\n };\n}\n"],"names":["cache","store","gcTimers","metadata","hash","key","get","set","value","del","h","clearGc","clear","timer","size","scheduleGc","delayMs","setMeta","meta","getMeta","getMetaByHash","keyHash","listMetaHashes"],"mappings":"gFAeO,SAASA,GAAW,CACzB,MAAMC,MAAY,IACZC,MAAe,IACfC,MAAe,IAEfC,EAAQC,GAA4B,KAAK,UAAUA,CAAG,EAE5D,SAASC,EAAID,EAAwC,CACnD,OAAOJ,EAAM,IAAIG,EAAKC,CAAG,CAAC,CAC5B,CAEA,SAASE,EAAIF,EAAyBG,EAAgB,CACpDP,EAAM,IAAIG,EAAKC,CAAG,EAAGG,CAAK,CAC5B,CAEA,SAASC,EAAIJ,EAAkC,CAC7C,MAAMK,EAAIN,EAAKC,CAAG,EAClB,OAAAM,EAAQD,CAAC,EACTP,EAAS,OAAOO,CAAC,EACVT,EAAM,OAAOS,CAAC,CACvB,CAEA,SAASE,GAAc,CACrBV,EAAS,QAASW,GAAU,CAC1B,aAAaA,CAAK,CACpB,CAAC,EACDZ,EAAM,MAAA,EACNC,EAAS,MAAA,EACTC,EAAS,MAAA,CACX,CAEA,SAASW,GAAe,CACtB,OAAOb,EAAM,IACf,CAEA,SAASc,EAAWV,EAAyBW,EAAuB,CAClE,MAAMN,EAAIN,EAAKC,CAAG,EAClBM,EAAQD,CAAC,EACTR,EAAS,IACPQ,EACA,WAAW,IAAM,CACfT,EAAM,OAAOS,CAAC,EACdR,EAAS,OAAOQ,CAAC,EACjBP,EAAS,OAAOO,CAAC,CACnB,EAAGM,CAAO,CAAA,CAEd,CAEA,SAASC,EAAQZ,EAAyBa,EAAqC,CAC7Ef,EAAS,IAAIC,EAAKC,CAAG,EAAG,CAAE,WAAY,KAAK,IAAA,EAAO,GAAGa,EAAM,CAC7D,CAEA,SAASC,EAAQd,EAA8D,CAC7E,OAAOF,EAAS,IAAIC,EAAKC,CAAG,CAAC,CAC/B,CAEA,SAASe,EAAcC,EAAsD,CAC3E,OAAOlB,EAAS,IAAIkB,CAAO,CAC7B,CAEA,SAASC,GAA2B,CAClC,OAAO,MAAM,KAAKnB,EAAS,KAAA,CAAM,CACnC,CAEA,SAASQ,EAAQU,EAAuB,CACtC,MAAMR,EAAQX,EAAS,IAAImB,CAAO,EAC9BR,IACF,aAAaA,CAAK,EAClBX,EAAS,OAAOmB,CAAO,EAE3B,CAEA,MAAO,CACL,MAAAT,EACA,OAAQH,EACR,IAAAH,EACA,QAAAa,EACA,cAAAC,EACA,KAAAhB,EACA,eAAAkB,EACA,WAAAP,EACA,IAAAR,EACA,QAAAU,EACA,KAAAH,CAAA,CAEJ"}
@@ -0,0 +1,63 @@
1
+ function w() {
2
+ const r = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Map(), c = (e) => JSON.stringify(e);
3
+ function i(e) {
4
+ return r.get(c(e));
5
+ }
6
+ function u(e, t) {
7
+ r.set(c(e), t);
8
+ }
9
+ function l(e) {
10
+ const t = c(e);
11
+ return a(t), n.delete(t), r.delete(t);
12
+ }
13
+ function f() {
14
+ o.forEach((e) => {
15
+ clearTimeout(e);
16
+ }), r.clear(), o.clear(), n.clear();
17
+ }
18
+ function d() {
19
+ return r.size;
20
+ }
21
+ function g(e, t) {
22
+ const s = c(e);
23
+ a(s), o.set(
24
+ s,
25
+ setTimeout(() => {
26
+ r.delete(s), o.delete(s), n.delete(s);
27
+ }, t)
28
+ );
29
+ }
30
+ function h(e, t) {
31
+ n.set(c(e), { lastUsedAt: Date.now(), ...t });
32
+ }
33
+ function m(e) {
34
+ return n.get(c(e));
35
+ }
36
+ function M(e) {
37
+ return n.get(e);
38
+ }
39
+ function p() {
40
+ return Array.from(n.keys());
41
+ }
42
+ function a(e) {
43
+ const t = o.get(e);
44
+ t && (clearTimeout(t), o.delete(e));
45
+ }
46
+ return {
47
+ clear: f,
48
+ delete: l,
49
+ get: i,
50
+ getMeta: m,
51
+ getMetaByHash: M,
52
+ hash: c,
53
+ listMetaHashes: p,
54
+ scheduleGc: g,
55
+ set: u,
56
+ setMeta: h,
57
+ size: d
58
+ };
59
+ }
60
+ export {
61
+ w as cache
62
+ };
63
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sources":["../../src/object/cache.ts"],"sourcesContent":["/**\n * Creates a generic key-value cache with automatic garbage collection and observer support.\n *\n * @example\n * ```ts\n * const myCache = cache<string>();\n * myCache.set(['user', 1], 'John Doe');\n * const value = myCache.get(['user', 1]); // 'John Doe'\n * myCache.scheduleGc(['user', 1], 5000); // Auto-delete after 5s\n * ```\n *\n * @template T - The type of values stored in the cache.\n *\n * @returns A cache instance with get, set, delete, clear, and GC methods.\n */\nexport function cache<T>() {\n const store = new Map<string, T>();\n const gcTimers = new Map<string, ReturnType<typeof setTimeout>>();\n const metadata = new Map<string, { lastUsedAt: number }>();\n\n const hash = (key: readonly unknown[]) => JSON.stringify(key);\n\n function get(key: readonly unknown[]): T | undefined {\n return store.get(hash(key));\n }\n\n function set(key: readonly unknown[], value: T): void {\n store.set(hash(key), value);\n }\n\n function del(key: readonly unknown[]): boolean {\n const h = hash(key);\n clearGc(h);\n metadata.delete(h);\n return store.delete(h);\n }\n\n function clear(): void {\n gcTimers.forEach((timer) => {\n clearTimeout(timer);\n });\n store.clear();\n gcTimers.clear();\n metadata.clear();\n }\n\n function size(): number {\n return store.size;\n }\n\n function scheduleGc(key: readonly unknown[], delayMs: number): void {\n const h = hash(key);\n clearGc(h);\n gcTimers.set(\n h,\n setTimeout(() => {\n store.delete(h);\n gcTimers.delete(h);\n metadata.delete(h);\n }, delayMs),\n );\n }\n\n function setMeta(key: readonly unknown[], meta: Record<string, unknown>): void {\n metadata.set(hash(key), { lastUsedAt: Date.now(), ...meta });\n }\n\n function getMeta(key: readonly unknown[]): Record<string, unknown> | undefined {\n return metadata.get(hash(key));\n }\n\n function getMetaByHash(keyHash: string): Record<string, unknown> | undefined {\n return metadata.get(keyHash);\n }\n\n function listMetaHashes(): string[] {\n return Array.from(metadata.keys());\n }\n\n function clearGc(keyHash: string): void {\n const timer = gcTimers.get(keyHash);\n if (timer) {\n clearTimeout(timer);\n gcTimers.delete(keyHash);\n }\n }\n\n return {\n clear,\n delete: del,\n get,\n getMeta,\n getMetaByHash,\n hash,\n listMetaHashes,\n scheduleGc,\n set,\n setMeta,\n size,\n };\n}\n"],"names":["cache","store","gcTimers","metadata","hash","key","get","set","value","del","h","clearGc","clear","timer","size","scheduleGc","delayMs","setMeta","meta","getMeta","getMetaByHash","keyHash","listMetaHashes"],"mappings":"AAeO,SAASA,IAAW;AACzB,QAAMC,wBAAY,IAAA,GACZC,wBAAe,IAAA,GACfC,wBAAe,IAAA,GAEfC,IAAO,CAACC,MAA4B,KAAK,UAAUA,CAAG;AAE5D,WAASC,EAAID,GAAwC;AACnD,WAAOJ,EAAM,IAAIG,EAAKC,CAAG,CAAC;AAAA,EAC5B;AAEA,WAASE,EAAIF,GAAyBG,GAAgB;AACpD,IAAAP,EAAM,IAAIG,EAAKC,CAAG,GAAGG,CAAK;AAAA,EAC5B;AAEA,WAASC,EAAIJ,GAAkC;AAC7C,UAAMK,IAAIN,EAAKC,CAAG;AAClB,WAAAM,EAAQD,CAAC,GACTP,EAAS,OAAOO,CAAC,GACVT,EAAM,OAAOS,CAAC;AAAA,EACvB;AAEA,WAASE,IAAc;AACrB,IAAAV,EAAS,QAAQ,CAACW,MAAU;AAC1B,mBAAaA,CAAK;AAAA,IACpB,CAAC,GACDZ,EAAM,MAAA,GACNC,EAAS,MAAA,GACTC,EAAS,MAAA;AAAA,EACX;AAEA,WAASW,IAAe;AACtB,WAAOb,EAAM;AAAA,EACf;AAEA,WAASc,EAAWV,GAAyBW,GAAuB;AAClE,UAAMN,IAAIN,EAAKC,CAAG;AAClB,IAAAM,EAAQD,CAAC,GACTR,EAAS;AAAA,MACPQ;AAAA,MACA,WAAW,MAAM;AACf,QAAAT,EAAM,OAAOS,CAAC,GACdR,EAAS,OAAOQ,CAAC,GACjBP,EAAS,OAAOO,CAAC;AAAA,MACnB,GAAGM,CAAO;AAAA,IAAA;AAAA,EAEd;AAEA,WAASC,EAAQZ,GAAyBa,GAAqC;AAC7E,IAAAf,EAAS,IAAIC,EAAKC,CAAG,GAAG,EAAE,YAAY,KAAK,IAAA,GAAO,GAAGa,GAAM;AAAA,EAC7D;AAEA,WAASC,EAAQd,GAA8D;AAC7E,WAAOF,EAAS,IAAIC,EAAKC,CAAG,CAAC;AAAA,EAC/B;AAEA,WAASe,EAAcC,GAAsD;AAC3E,WAAOlB,EAAS,IAAIkB,CAAO;AAAA,EAC7B;AAEA,WAASC,IAA2B;AAClC,WAAO,MAAM,KAAKnB,EAAS,KAAA,CAAM;AAAA,EACnC;AAEA,WAASQ,EAAQU,GAAuB;AACtC,UAAMR,IAAQX,EAAS,IAAImB,CAAO;AAClC,IAAIR,MACF,aAAaA,CAAK,GAClBX,EAAS,OAAOmB,CAAO;AAAA,EAE3B;AAEA,SAAO;AAAA,IACL,OAAAT;AAAA,IACA,QAAQH;AAAA,IACR,KAAAH;AAAA,IACA,SAAAa;AAAA,IACA,eAAAC;AAAA,IACA,MAAAhB;AAAA,IACA,gBAAAkB;AAAA,IACA,YAAAP;AAAA,IACA,KAAAR;AAAA,IACA,SAAAU;AAAA,IACA,MAAAH;AAAA,EAAA;AAEJ;"}
@@ -1 +1 @@
1
- {"version":3,"file":"merge.cjs","sources":["../../src/object/merge.ts"],"sourcesContent":["import { isArray } from '../typed/isArray';\nimport { isObject } from '../typed/isObject';\nimport type { Obj } from '../types';\n\ntype MergeStrategy =\n | 'deep'\n | 'shallow'\n | 'lastWins'\n | 'arrayConcat'\n | 'arrayReplace'\n // biome-ignore lint/suspicious/noExplicitAny: -\n | ((target: any, source: any) => any);\n\ntype DeepMerge<T, U> = T extends Obj\n ? U extends Obj\n ? {\n [K in keyof T | keyof U]: K extends keyof T\n ? K extends keyof U\n ? DeepMerge<T[K], U[K]>\n : T[K]\n : K extends keyof U\n ? U[K]\n : never;\n }\n : U\n : U;\n\ntype Merge<T extends Obj[]> = T extends [infer First, ...infer Rest]\n ? First extends Obj\n ? Rest extends Obj[]\n ? DeepMerge<First, Merge<Rest>>\n : First\n : Obj\n : Obj;\n\n/**\n * Merges multiple objects based on a specified merge strategy.\n *\n * @example\n * ```ts\n * const obj1 = { a: 1, b: { x: 10, y: \"hello\" }, c: [1] };\n * const obj2 = { b: { y: 20, z: true }, c: [2] };\n * const obj3 = { d: false, c: [3] };\n *\n * merge(\"deep\", obj1, obj2, obj3); // { a: 1, b: { x: 10, y: 20, z: true }, c: [1, 2, 3], d: false }\n * merge(\"shallow\", obj1, obj2, obj3); // { a: 1, b: { y: 20, z: true }, c: [3], d: false }\n * ```\n *\n * @param [strategy='deep'] - The merging strategy to use.\n * @param items - The objects to merge.\n * @returns A new merged object.\n */\nexport function merge<T extends Obj[]>(strategy: MergeStrategy = 'deep', ...items: [...T]): Merge<T> {\n if (items.length === 0) return {} as Merge<T>;\n\n if (strategy === 'shallow') {\n return Object.assign({}, ...items) as Merge<T>;\n }\n\n return items.reduce((acc, obj) => deepMerge(acc, obj, strategy) as unknown as Merge<T>, {} as Merge<T>);\n}\n\n/**\n * Deeply merges two objects based on the provided strategy.\n *\n * - Uses **direct property access** for performance.\n * - **Avoids redundant deep merging** where unnecessary.\n * - Optimized **array merging strategies**.\n *\n * @param target - The target object.\n * @param source - The source object.\n * @param strategy - The merge strategy.\n * @returns A new merged object.\n */\nfunction deepMerge<T extends Obj, U extends Obj>(target: T, source: U, strategy: MergeStrategy): DeepMerge<T, U> {\n if (!isObject(source)) return source as DeepMerge<T, U>;\n\n const result = { ...target } as DeepMerge<T, U>;\n\n for (const key in source) {\n if (!Object.hasOwn(source, key)) continue; // Prevent prototype pollution\n\n const sourceValue = source[key];\n const targetValue = result[key];\n\n // biome-ignore lint/suspicious/noExplicitAny: -\n (result as any)[key] =\n isArray(sourceValue) && isArray(targetValue)\n ? handleArrayMerge(targetValue, sourceValue, strategy)\n : isObject(sourceValue) && isObject(targetValue)\n ? deepMerge(targetValue, sourceValue, strategy)\n : applyMergeStrategy(targetValue, sourceValue, strategy);\n }\n\n return result;\n}\n\n/**\n * Optimized array merge based on strategy.\n *\n * - `\"arrayConcat\"` → Concatenates arrays.\n * - `\"arrayReplace\"` → Replaces the existing array.\n * - Default: **Unique merge** (Set-based optimization).\n */\nfunction handleArrayMerge<T, U>(targetArray: T[] | undefined, sourceArray: U[], strategy: MergeStrategy): (T | U)[] {\n if (!targetArray) return sourceArray;\n // biome-ignore lint/suspicious/noExplicitAny: -\n if (strategy === 'arrayConcat') return targetArray.concat(sourceArray as any);\n if (strategy === 'arrayReplace') return sourceArray;\n return Array.from(new Set([...targetArray, ...sourceArray])); // Unique merge\n}\n\n/**\n * Determines the appropriate value to assign based on the merge strategy.\n *\n * - `\"lastWins\"` → Overwrites with the latest value.\n * - Custom functions → Allows user-defined behavior.\n */\nfunction applyMergeStrategy<T, U>(target: T, source: U, strategy: MergeStrategy): T | U {\n if (typeof strategy === 'function') return strategy(target, source);\n return strategy === 'lastWins' || source !== undefined ? source : target;\n}\n"],"names":["merge","strategy","items","acc","obj","deepMerge","target","source","isObject","result","key","sourceValue","targetValue","isArray","handleArrayMerge","applyMergeStrategy","targetArray","sourceArray"],"mappings":"2JAoDO,SAASA,EAAuBC,EAA0B,UAAWC,EAAyB,CACnG,OAAIA,EAAM,SAAW,EAAU,CAAA,EAE3BD,IAAa,UACR,OAAO,OAAO,CAAA,EAAI,GAAGC,CAAK,EAG5BA,EAAM,OAAO,CAACC,EAAKC,IAAQC,EAAUF,EAAKC,EAAKH,CAAQ,EAA0B,EAAc,CACxG,CAcA,SAASI,EAAwCC,EAAWC,EAAWN,EAA0C,CAC/G,GAAI,CAACO,EAAAA,SAASD,CAAM,EAAG,OAAOA,EAE9B,MAAME,EAAS,CAAE,GAAGH,CAAA,EAEpB,UAAWI,KAAOH,EAAQ,CACxB,GAAI,CAAC,OAAO,OAAOA,EAAQG,CAAG,EAAG,SAEjC,MAAMC,EAAcJ,EAAOG,CAAG,EACxBE,EAAcH,EAAOC,CAAG,EAG7BD,EAAeC,CAAG,EACjBG,EAAAA,QAAQF,CAAW,GAAKE,EAAAA,QAAQD,CAAW,EACvCE,EAAiBF,EAAaD,EAAaV,CAAQ,EACnDO,EAAAA,SAASG,CAAW,GAAKH,EAAAA,SAASI,CAAW,EAC3CP,EAAUO,EAAaD,EAAaV,CAAQ,EAC5Cc,EAAmBH,EAAaD,EAAaV,CAAQ,CAC/D,CAEA,OAAOQ,CACT,CASA,SAASK,EAAuBE,EAA8BC,EAAkBhB,EAAoC,CAClH,OAAKe,EAEDf,IAAa,cAAsBe,EAAY,OAAOC,CAAkB,EACxEhB,IAAa,eAAuBgB,EACjC,MAAM,KAAK,IAAI,IAAI,CAAC,GAAGD,EAAa,GAAGC,CAAW,CAAC,CAAC,EAJlCA,CAK3B,CAQA,SAASF,EAAyBT,EAAWC,EAAWN,EAAgC,CACtF,OAAI,OAAOA,GAAa,WAAmBA,EAASK,EAAQC,CAAM,EAC3DN,IAAa,YAAcM,IAAW,OAAYA,EAASD,CACpE"}
1
+ {"version":3,"file":"merge.cjs","sources":["../../src/object/merge.ts"],"sourcesContent":["import { isArray } from '../typed/isArray';\nimport { isObject } from '../typed/isObject';\nimport type { Obj } from '../types';\n\n// #region MergeStrategy\ntype MergeStrategy =\n | 'deep'\n | 'shallow'\n | 'lastWins'\n | 'arrayConcat'\n | 'arrayReplace'\n // biome-ignore lint/suspicious/noExplicitAny: -\n | ((target: any, source: any) => any);\n// #endregion MergeStrategy\n\ntype DeepMerge<T, U> = T extends Obj\n ? U extends Obj\n ? {\n [K in keyof T | keyof U]: K extends keyof T\n ? K extends keyof U\n ? DeepMerge<T[K], U[K]>\n : T[K]\n : K extends keyof U\n ? U[K]\n : never;\n }\n : U\n : U;\n\ntype Merge<T extends Obj[]> = T extends [infer First, ...infer Rest]\n ? First extends Obj\n ? Rest extends Obj[]\n ? DeepMerge<First, Merge<Rest>>\n : First\n : Obj\n : Obj;\n\n/**\n * Merges multiple objects based on a specified merge strategy.\n *\n * @example\n * ```ts\n * const obj1 = { a: 1, b: { x: 10, y: \"hello\" }, c: [1] };\n * const obj2 = { b: { y: 20, z: true }, c: [2] };\n * const obj3 = { d: false, c: [3] };\n *\n * merge(\"deep\", obj1, obj2, obj3); // { a: 1, b: { x: 10, y: 20, z: true }, c: [1, 2, 3], d: false }\n * merge(\"shallow\", obj1, obj2, obj3); // { a: 1, b: { y: 20, z: true }, c: [3], d: false }\n * ```\n *\n * @param [strategy='deep'] - The merging strategy to use.\n * @param items - The objects to merge.\n * @returns A new merged object.\n */\nexport function merge<T extends Obj[]>(strategy: MergeStrategy = 'deep', ...items: [...T]): Merge<T> {\n if (items.length === 0) return {} as Merge<T>;\n\n if (strategy === 'shallow') {\n return Object.assign({}, ...items) as Merge<T>;\n }\n\n return items.reduce((acc, obj) => deepMerge(acc, obj, strategy) as unknown as Merge<T>, {} as Merge<T>);\n}\n\n/**\n * Deeply merges two objects based on the provided strategy.\n *\n * - Uses **direct property access** for performance.\n * - **Avoids redundant deep merging** where unnecessary.\n * - Optimized **array merging strategies**.\n *\n * @param target - The target object.\n * @param source - The source object.\n * @param strategy - The merge strategy.\n * @returns A new merged object.\n */\nfunction deepMerge<T extends Obj, U extends Obj>(target: T, source: U, strategy: MergeStrategy): DeepMerge<T, U> {\n if (!isObject(source)) return source as DeepMerge<T, U>;\n\n const result = { ...target } as DeepMerge<T, U>;\n\n for (const key in source) {\n if (!Object.hasOwn(source, key)) continue; // Prevent prototype pollution\n\n const sourceValue = source[key];\n const targetValue = result[key];\n\n // biome-ignore lint/suspicious/noExplicitAny: -\n (result as any)[key] =\n isArray(sourceValue) && isArray(targetValue)\n ? handleArrayMerge(targetValue, sourceValue, strategy)\n : isObject(sourceValue) && isObject(targetValue)\n ? deepMerge(targetValue, sourceValue, strategy)\n : applyMergeStrategy(targetValue, sourceValue, strategy);\n }\n\n return result;\n}\n\n/**\n * Optimized array merge based on strategy.\n *\n * - `\"arrayConcat\"` → Concatenates arrays.\n * - `\"arrayReplace\"` → Replaces the existing array.\n * - Default: **Unique merge** (Set-based optimization).\n */\nfunction handleArrayMerge<T, U>(targetArray: T[] | undefined, sourceArray: U[], strategy: MergeStrategy): (T | U)[] {\n if (!targetArray) return sourceArray;\n // biome-ignore lint/suspicious/noExplicitAny: -\n if (strategy === 'arrayConcat') return targetArray.concat(sourceArray as any);\n if (strategy === 'arrayReplace') return sourceArray;\n return Array.from(new Set([...targetArray, ...sourceArray])); // Unique merge\n}\n\n/**\n * Determines the appropriate value to assign based on the merge strategy.\n *\n * - `\"lastWins\"` → Overwrites with the latest value.\n * - Custom functions → Allows user-defined behavior.\n */\nfunction applyMergeStrategy<T, U>(target: T, source: U, strategy: MergeStrategy): T | U {\n if (typeof strategy === 'function') return strategy(target, source);\n return strategy === 'lastWins' || source !== undefined ? source : target;\n}\n"],"names":["merge","strategy","items","acc","obj","deepMerge","target","source","isObject","result","key","sourceValue","targetValue","isArray","handleArrayMerge","applyMergeStrategy","targetArray","sourceArray"],"mappings":"2JAsDO,SAASA,EAAuBC,EAA0B,UAAWC,EAAyB,CACnG,OAAIA,EAAM,SAAW,EAAU,CAAA,EAE3BD,IAAa,UACR,OAAO,OAAO,CAAA,EAAI,GAAGC,CAAK,EAG5BA,EAAM,OAAO,CAACC,EAAKC,IAAQC,EAAUF,EAAKC,EAAKH,CAAQ,EAA0B,EAAc,CACxG,CAcA,SAASI,EAAwCC,EAAWC,EAAWN,EAA0C,CAC/G,GAAI,CAACO,EAAAA,SAASD,CAAM,EAAG,OAAOA,EAE9B,MAAME,EAAS,CAAE,GAAGH,CAAA,EAEpB,UAAWI,KAAOH,EAAQ,CACxB,GAAI,CAAC,OAAO,OAAOA,EAAQG,CAAG,EAAG,SAEjC,MAAMC,EAAcJ,EAAOG,CAAG,EACxBE,EAAcH,EAAOC,CAAG,EAG7BD,EAAeC,CAAG,EACjBG,EAAAA,QAAQF,CAAW,GAAKE,EAAAA,QAAQD,CAAW,EACvCE,EAAiBF,EAAaD,EAAaV,CAAQ,EACnDO,EAAAA,SAASG,CAAW,GAAKH,EAAAA,SAASI,CAAW,EAC3CP,EAAUO,EAAaD,EAAaV,CAAQ,EAC5Cc,EAAmBH,EAAaD,EAAaV,CAAQ,CAC/D,CAEA,OAAOQ,CACT,CASA,SAASK,EAAuBE,EAA8BC,EAAkBhB,EAAoC,CAClH,OAAKe,EAEDf,IAAa,cAAsBe,EAAY,OAAOC,CAAkB,EACxEhB,IAAa,eAAuBgB,EACjC,MAAM,KAAK,IAAI,IAAI,CAAC,GAAGD,EAAa,GAAGC,CAAW,CAAC,CAAC,EAJlCA,CAK3B,CAQA,SAASF,EAAyBT,EAAWC,EAAWN,EAAgC,CACtF,OAAI,OAAOA,GAAa,WAAmBA,EAASK,EAAQC,CAAM,EAC3DN,IAAa,YAAcM,IAAW,OAAYA,EAASD,CACpE"}
@@ -1 +1 @@
1
- {"version":3,"file":"merge.js","sources":["../../src/object/merge.ts"],"sourcesContent":["import { isArray } from '../typed/isArray';\nimport { isObject } from '../typed/isObject';\nimport type { Obj } from '../types';\n\ntype MergeStrategy =\n | 'deep'\n | 'shallow'\n | 'lastWins'\n | 'arrayConcat'\n | 'arrayReplace'\n // biome-ignore lint/suspicious/noExplicitAny: -\n | ((target: any, source: any) => any);\n\ntype DeepMerge<T, U> = T extends Obj\n ? U extends Obj\n ? {\n [K in keyof T | keyof U]: K extends keyof T\n ? K extends keyof U\n ? DeepMerge<T[K], U[K]>\n : T[K]\n : K extends keyof U\n ? U[K]\n : never;\n }\n : U\n : U;\n\ntype Merge<T extends Obj[]> = T extends [infer First, ...infer Rest]\n ? First extends Obj\n ? Rest extends Obj[]\n ? DeepMerge<First, Merge<Rest>>\n : First\n : Obj\n : Obj;\n\n/**\n * Merges multiple objects based on a specified merge strategy.\n *\n * @example\n * ```ts\n * const obj1 = { a: 1, b: { x: 10, y: \"hello\" }, c: [1] };\n * const obj2 = { b: { y: 20, z: true }, c: [2] };\n * const obj3 = { d: false, c: [3] };\n *\n * merge(\"deep\", obj1, obj2, obj3); // { a: 1, b: { x: 10, y: 20, z: true }, c: [1, 2, 3], d: false }\n * merge(\"shallow\", obj1, obj2, obj3); // { a: 1, b: { y: 20, z: true }, c: [3], d: false }\n * ```\n *\n * @param [strategy='deep'] - The merging strategy to use.\n * @param items - The objects to merge.\n * @returns A new merged object.\n */\nexport function merge<T extends Obj[]>(strategy: MergeStrategy = 'deep', ...items: [...T]): Merge<T> {\n if (items.length === 0) return {} as Merge<T>;\n\n if (strategy === 'shallow') {\n return Object.assign({}, ...items) as Merge<T>;\n }\n\n return items.reduce((acc, obj) => deepMerge(acc, obj, strategy) as unknown as Merge<T>, {} as Merge<T>);\n}\n\n/**\n * Deeply merges two objects based on the provided strategy.\n *\n * - Uses **direct property access** for performance.\n * - **Avoids redundant deep merging** where unnecessary.\n * - Optimized **array merging strategies**.\n *\n * @param target - The target object.\n * @param source - The source object.\n * @param strategy - The merge strategy.\n * @returns A new merged object.\n */\nfunction deepMerge<T extends Obj, U extends Obj>(target: T, source: U, strategy: MergeStrategy): DeepMerge<T, U> {\n if (!isObject(source)) return source as DeepMerge<T, U>;\n\n const result = { ...target } as DeepMerge<T, U>;\n\n for (const key in source) {\n if (!Object.hasOwn(source, key)) continue; // Prevent prototype pollution\n\n const sourceValue = source[key];\n const targetValue = result[key];\n\n // biome-ignore lint/suspicious/noExplicitAny: -\n (result as any)[key] =\n isArray(sourceValue) && isArray(targetValue)\n ? handleArrayMerge(targetValue, sourceValue, strategy)\n : isObject(sourceValue) && isObject(targetValue)\n ? deepMerge(targetValue, sourceValue, strategy)\n : applyMergeStrategy(targetValue, sourceValue, strategy);\n }\n\n return result;\n}\n\n/**\n * Optimized array merge based on strategy.\n *\n * - `\"arrayConcat\"` → Concatenates arrays.\n * - `\"arrayReplace\"` → Replaces the existing array.\n * - Default: **Unique merge** (Set-based optimization).\n */\nfunction handleArrayMerge<T, U>(targetArray: T[] | undefined, sourceArray: U[], strategy: MergeStrategy): (T | U)[] {\n if (!targetArray) return sourceArray;\n // biome-ignore lint/suspicious/noExplicitAny: -\n if (strategy === 'arrayConcat') return targetArray.concat(sourceArray as any);\n if (strategy === 'arrayReplace') return sourceArray;\n return Array.from(new Set([...targetArray, ...sourceArray])); // Unique merge\n}\n\n/**\n * Determines the appropriate value to assign based on the merge strategy.\n *\n * - `\"lastWins\"` → Overwrites with the latest value.\n * - Custom functions → Allows user-defined behavior.\n */\nfunction applyMergeStrategy<T, U>(target: T, source: U, strategy: MergeStrategy): T | U {\n if (typeof strategy === 'function') return strategy(target, source);\n return strategy === 'lastWins' || source !== undefined ? source : target;\n}\n"],"names":["merge","strategy","items","acc","obj","deepMerge","target","source","isObject","result","key","sourceValue","targetValue","isArray","handleArrayMerge","applyMergeStrategy","targetArray","sourceArray"],"mappings":";;AAoDO,SAASA,EAAuBC,IAA0B,WAAWC,GAAyB;AACnG,SAAIA,EAAM,WAAW,IAAU,CAAA,IAE3BD,MAAa,YACR,OAAO,OAAO,CAAA,GAAI,GAAGC,CAAK,IAG5BA,EAAM,OAAO,CAACC,GAAKC,MAAQC,EAAUF,GAAKC,GAAKH,CAAQ,GAA0B,EAAc;AACxG;AAcA,SAASI,EAAwCC,GAAWC,GAAWN,GAA0C;AAC/G,MAAI,CAACO,EAASD,CAAM,EAAG,QAAOA;AAE9B,QAAME,IAAS,EAAE,GAAGH,EAAA;AAEpB,aAAWI,KAAOH,GAAQ;AACxB,QAAI,CAAC,OAAO,OAAOA,GAAQG,CAAG,EAAG;AAEjC,UAAMC,IAAcJ,EAAOG,CAAG,GACxBE,IAAcH,EAAOC,CAAG;AAG7B,IAAAD,EAAeC,CAAG,IACjBG,EAAQF,CAAW,KAAKE,EAAQD,CAAW,IACvCE,EAAiBF,GAAaD,GAAaV,CAAQ,IACnDO,EAASG,CAAW,KAAKH,EAASI,CAAW,IAC3CP,EAAUO,GAAaD,GAAaV,CAAQ,IAC5Cc,EAAmBH,GAAaD,GAAaV,CAAQ;AAAA,EAC/D;AAEA,SAAOQ;AACT;AASA,SAASK,EAAuBE,GAA8BC,GAAkBhB,GAAoC;AAClH,SAAKe,IAEDf,MAAa,gBAAsBe,EAAY,OAAOC,CAAkB,IACxEhB,MAAa,iBAAuBgB,IACjC,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAGD,GAAa,GAAGC,CAAW,CAAC,CAAC,IAJlCA;AAK3B;AAQA,SAASF,EAAyBT,GAAWC,GAAWN,GAAgC;AACtF,SAAI,OAAOA,KAAa,aAAmBA,EAASK,GAAQC,CAAM,IAC3DN,MAAa,cAAcM,MAAW,SAAYA,IAASD;AACpE;"}
1
+ {"version":3,"file":"merge.js","sources":["../../src/object/merge.ts"],"sourcesContent":["import { isArray } from '../typed/isArray';\nimport { isObject } from '../typed/isObject';\nimport type { Obj } from '../types';\n\n// #region MergeStrategy\ntype MergeStrategy =\n | 'deep'\n | 'shallow'\n | 'lastWins'\n | 'arrayConcat'\n | 'arrayReplace'\n // biome-ignore lint/suspicious/noExplicitAny: -\n | ((target: any, source: any) => any);\n// #endregion MergeStrategy\n\ntype DeepMerge<T, U> = T extends Obj\n ? U extends Obj\n ? {\n [K in keyof T | keyof U]: K extends keyof T\n ? K extends keyof U\n ? DeepMerge<T[K], U[K]>\n : T[K]\n : K extends keyof U\n ? U[K]\n : never;\n }\n : U\n : U;\n\ntype Merge<T extends Obj[]> = T extends [infer First, ...infer Rest]\n ? First extends Obj\n ? Rest extends Obj[]\n ? DeepMerge<First, Merge<Rest>>\n : First\n : Obj\n : Obj;\n\n/**\n * Merges multiple objects based on a specified merge strategy.\n *\n * @example\n * ```ts\n * const obj1 = { a: 1, b: { x: 10, y: \"hello\" }, c: [1] };\n * const obj2 = { b: { y: 20, z: true }, c: [2] };\n * const obj3 = { d: false, c: [3] };\n *\n * merge(\"deep\", obj1, obj2, obj3); // { a: 1, b: { x: 10, y: 20, z: true }, c: [1, 2, 3], d: false }\n * merge(\"shallow\", obj1, obj2, obj3); // { a: 1, b: { y: 20, z: true }, c: [3], d: false }\n * ```\n *\n * @param [strategy='deep'] - The merging strategy to use.\n * @param items - The objects to merge.\n * @returns A new merged object.\n */\nexport function merge<T extends Obj[]>(strategy: MergeStrategy = 'deep', ...items: [...T]): Merge<T> {\n if (items.length === 0) return {} as Merge<T>;\n\n if (strategy === 'shallow') {\n return Object.assign({}, ...items) as Merge<T>;\n }\n\n return items.reduce((acc, obj) => deepMerge(acc, obj, strategy) as unknown as Merge<T>, {} as Merge<T>);\n}\n\n/**\n * Deeply merges two objects based on the provided strategy.\n *\n * - Uses **direct property access** for performance.\n * - **Avoids redundant deep merging** where unnecessary.\n * - Optimized **array merging strategies**.\n *\n * @param target - The target object.\n * @param source - The source object.\n * @param strategy - The merge strategy.\n * @returns A new merged object.\n */\nfunction deepMerge<T extends Obj, U extends Obj>(target: T, source: U, strategy: MergeStrategy): DeepMerge<T, U> {\n if (!isObject(source)) return source as DeepMerge<T, U>;\n\n const result = { ...target } as DeepMerge<T, U>;\n\n for (const key in source) {\n if (!Object.hasOwn(source, key)) continue; // Prevent prototype pollution\n\n const sourceValue = source[key];\n const targetValue = result[key];\n\n // biome-ignore lint/suspicious/noExplicitAny: -\n (result as any)[key] =\n isArray(sourceValue) && isArray(targetValue)\n ? handleArrayMerge(targetValue, sourceValue, strategy)\n : isObject(sourceValue) && isObject(targetValue)\n ? deepMerge(targetValue, sourceValue, strategy)\n : applyMergeStrategy(targetValue, sourceValue, strategy);\n }\n\n return result;\n}\n\n/**\n * Optimized array merge based on strategy.\n *\n * - `\"arrayConcat\"` → Concatenates arrays.\n * - `\"arrayReplace\"` → Replaces the existing array.\n * - Default: **Unique merge** (Set-based optimization).\n */\nfunction handleArrayMerge<T, U>(targetArray: T[] | undefined, sourceArray: U[], strategy: MergeStrategy): (T | U)[] {\n if (!targetArray) return sourceArray;\n // biome-ignore lint/suspicious/noExplicitAny: -\n if (strategy === 'arrayConcat') return targetArray.concat(sourceArray as any);\n if (strategy === 'arrayReplace') return sourceArray;\n return Array.from(new Set([...targetArray, ...sourceArray])); // Unique merge\n}\n\n/**\n * Determines the appropriate value to assign based on the merge strategy.\n *\n * - `\"lastWins\"` → Overwrites with the latest value.\n * - Custom functions → Allows user-defined behavior.\n */\nfunction applyMergeStrategy<T, U>(target: T, source: U, strategy: MergeStrategy): T | U {\n if (typeof strategy === 'function') return strategy(target, source);\n return strategy === 'lastWins' || source !== undefined ? source : target;\n}\n"],"names":["merge","strategy","items","acc","obj","deepMerge","target","source","isObject","result","key","sourceValue","targetValue","isArray","handleArrayMerge","applyMergeStrategy","targetArray","sourceArray"],"mappings":";;AAsDO,SAASA,EAAuBC,IAA0B,WAAWC,GAAyB;AACnG,SAAIA,EAAM,WAAW,IAAU,CAAA,IAE3BD,MAAa,YACR,OAAO,OAAO,CAAA,GAAI,GAAGC,CAAK,IAG5BA,EAAM,OAAO,CAACC,GAAKC,MAAQC,EAAUF,GAAKC,GAAKH,CAAQ,GAA0B,EAAc;AACxG;AAcA,SAASI,EAAwCC,GAAWC,GAAWN,GAA0C;AAC/G,MAAI,CAACO,EAASD,CAAM,EAAG,QAAOA;AAE9B,QAAME,IAAS,EAAE,GAAGH,EAAA;AAEpB,aAAWI,KAAOH,GAAQ;AACxB,QAAI,CAAC,OAAO,OAAOA,GAAQG,CAAG,EAAG;AAEjC,UAAMC,IAAcJ,EAAOG,CAAG,GACxBE,IAAcH,EAAOC,CAAG;AAG7B,IAAAD,EAAeC,CAAG,IACjBG,EAAQF,CAAW,KAAKE,EAAQD,CAAW,IACvCE,EAAiBF,GAAaD,GAAaV,CAAQ,IACnDO,EAASG,CAAW,KAAKH,EAASI,CAAW,IAC3CP,EAAUO,GAAaD,GAAaV,CAAQ,IAC5Cc,EAAmBH,GAAaD,GAAaV,CAAQ;AAAA,EAC/D;AAEA,SAAOQ;AACT;AASA,SAASK,EAAuBE,GAA8BC,GAAkBhB,GAAoC;AAClH,SAAKe,IAEDf,MAAa,gBAAsBe,EAAY,OAAOC,CAAkB,IACxEhB,MAAa,iBAAuBgB,IACjC,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAGD,GAAa,GAAGC,CAAW,CAAC,CAAC,IAJlCA;AAK3B;AAQA,SAASF,EAAyBT,GAAWC,GAAWN,GAAgC;AACtF,SAAI,OAAOA,KAAa,aAAmBA,EAASK,GAAQC,CAAM,IAC3DN,MAAa,cAAcM,MAAW,SAAYA,IAASD;AACpE;"}
@@ -1 +1 @@
1
- {"version":3,"file":"parseJSON.cjs","sources":["../../src/object/parseJSON.ts"],"sourcesContent":["import { Logit } from '@vielzeug/logit';\nimport { isNil } from '../typed/isNil';\nimport { isString } from '../typed/isString';\n\ntype JSONValue = string | number | boolean | null | JSONValue[] | { [key: string]: JSONValue };\n\ninterface ParseJSONOptions<T> {\n defaultValue?: T;\n // biome-ignore lint/suspicious/noExplicitAny: -\n reviver?: (key: string, value: any) => any;\n // biome-ignore lint/suspicious/noExplicitAny: -\n validator?: (value: any) => boolean;\n silent?: boolean;\n}\n\n/**\n * Parses a JSON string and returns the resulting object.\n *\n * @example\n * ```ts\n * const json = '{\"a\":1,\"b\":2,\"c\":3}';\n * const result = parseJSON<Record<string, number>>(json, {\n * defaultValue: { a: 0, b: 0, c: 0 },\n * validator: (value) => Object.values(value).every(v => typeof v === 'number'),\n * errorHandler: (err) => console.warn('Parsing failed:', err.message),\n * silent: true\n * });\n * console.log(result); // { a: 1, b: 2, c: 3 }\n * ```\n *\n * @template T - The expected type of the parsed JSON.\n * @param json - The JSON string to parse. If not a string, it is returned as is.\n * @param options - Configuration options for parsing.\n *\n * @returns The parsed object if successful, otherwise the default value.\n */\nexport function parseJSON<T extends JSONValue>(json: unknown, options: ParseJSONOptions<T> = {}): T | undefined {\n const { defaultValue, reviver, validator, silent = false } = options;\n\n if (!isString(json)) return isNil(json) ? defaultValue : (json as T);\n\n try {\n const parsed = JSON.parse(json as string, reviver);\n\n if (validator && !validator(parsed)) {\n throw new TypeError('Parsed JSON does not match the expected structure');\n }\n\n return parsed ?? defaultValue;\n } catch (err) {\n if (!silent) {\n Logit.error('parseJSON() -> failed to parse object', err);\n }\n\n return defaultValue;\n }\n}\n"],"names":["parseJSON","json","options","defaultValue","reviver","validator","silent","isString","isNil","parsed","err","Logit"],"mappings":"8LAoCO,SAASA,EAA+BC,EAAeC,EAA+B,GAAmB,CAC9G,KAAM,CAAE,aAAAC,EAAc,QAAAC,EAAS,UAAAC,EAAW,OAAAC,EAAS,IAAUJ,EAE7D,GAAI,CAACK,EAAAA,SAASN,CAAI,SAAUO,EAAAA,MAAMP,CAAI,EAAIE,EAAgBF,EAE1D,GAAI,CACF,MAAMQ,EAAS,KAAK,MAAMR,EAAgBG,CAAO,EAEjD,GAAIC,GAAa,CAACA,EAAUI,CAAM,EAChC,MAAM,IAAI,UAAU,mDAAmD,EAGzE,OAAOA,GAAUN,CACnB,OAASO,EAAK,CACZ,OAAKJ,GACHK,QAAM,MAAM,wCAAyCD,CAAG,EAGnDP,CACT,CACF"}
1
+ {"version":3,"file":"parseJSON.cjs","sources":["../../src/object/parseJSON.ts"],"sourcesContent":["import { Logit } from '@vielzeug/logit';\nimport { isNil } from '../typed/isNil';\nimport { isString } from '../typed/isString';\n\ntype JSONValue = string | number | boolean | null | JSONValue[] | { [key: string]: JSONValue };\n\n// #region ParseJSONOptions\ntype ParseJSONOptions<T> = {\n defaultValue?: T;\n // biome-ignore lint/suspicious/noExplicitAny: -\n reviver?: (key: string, value: any) => any;\n // biome-ignore lint/suspicious/noExplicitAny: -\n validator?: (value: any) => boolean;\n silent?: boolean;\n};\n// #endregion ParseJSONOptions\n\n/**\n * Parses a JSON string and returns the resulting object.\n *\n * @example\n * ```ts\n * const json = '{\"a\":1,\"b\":2,\"c\":3}';\n * const result = parseJSON<Record<string, number>>(json, {\n * defaultValue: { a: 0, b: 0, c: 0 },\n * validator: (value) => Object.values(value).every(v => typeof v === 'number'),\n * errorHandler: (err) => console.warn('Parsing failed:', err.message),\n * silent: true\n * });\n * console.log(result); // { a: 1, b: 2, c: 3 }\n * ```\n *\n * @template T - The expected type of the parsed JSON.\n * @param json - The JSON string to parse. If not a string, it is returned as is.\n * @param options - Configuration options for parsing.\n *\n * @returns The parsed object if successful, otherwise the default value.\n */\nexport function parseJSON<T extends JSONValue>(json: unknown, options: ParseJSONOptions<T> = {}): T | undefined {\n const { defaultValue, reviver, validator, silent = false } = options;\n\n if (!isString(json)) return isNil(json) ? defaultValue : (json as T);\n\n try {\n const parsed = JSON.parse(json as string, reviver);\n\n if (validator && !validator(parsed)) {\n throw new TypeError('Parsed JSON does not match the expected structure');\n }\n\n return parsed ?? defaultValue;\n } catch (err) {\n if (!silent) {\n Logit.error('parseJSON() -> failed to parse object', err);\n }\n\n return defaultValue;\n }\n}\n"],"names":["parseJSON","json","options","defaultValue","reviver","validator","silent","isString","isNil","parsed","err","Logit"],"mappings":"8LAsCO,SAASA,EAA+BC,EAAeC,EAA+B,GAAmB,CAC9G,KAAM,CAAE,aAAAC,EAAc,QAAAC,EAAS,UAAAC,EAAW,OAAAC,EAAS,IAAUJ,EAE7D,GAAI,CAACK,EAAAA,SAASN,CAAI,SAAUO,EAAAA,MAAMP,CAAI,EAAIE,EAAgBF,EAE1D,GAAI,CACF,MAAMQ,EAAS,KAAK,MAAMR,EAAgBG,CAAO,EAEjD,GAAIC,GAAa,CAACA,EAAUI,CAAM,EAChC,MAAM,IAAI,UAAU,mDAAmD,EAGzE,OAAOA,GAAUN,CACnB,OAASO,EAAK,CACZ,OAAKJ,GACHK,QAAM,MAAM,wCAAyCD,CAAG,EAGnDP,CACT,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"parseJSON.js","sources":["../../src/object/parseJSON.ts"],"sourcesContent":["import { Logit } from '@vielzeug/logit';\nimport { isNil } from '../typed/isNil';\nimport { isString } from '../typed/isString';\n\ntype JSONValue = string | number | boolean | null | JSONValue[] | { [key: string]: JSONValue };\n\ninterface ParseJSONOptions<T> {\n defaultValue?: T;\n // biome-ignore lint/suspicious/noExplicitAny: -\n reviver?: (key: string, value: any) => any;\n // biome-ignore lint/suspicious/noExplicitAny: -\n validator?: (value: any) => boolean;\n silent?: boolean;\n}\n\n/**\n * Parses a JSON string and returns the resulting object.\n *\n * @example\n * ```ts\n * const json = '{\"a\":1,\"b\":2,\"c\":3}';\n * const result = parseJSON<Record<string, number>>(json, {\n * defaultValue: { a: 0, b: 0, c: 0 },\n * validator: (value) => Object.values(value).every(v => typeof v === 'number'),\n * errorHandler: (err) => console.warn('Parsing failed:', err.message),\n * silent: true\n * });\n * console.log(result); // { a: 1, b: 2, c: 3 }\n * ```\n *\n * @template T - The expected type of the parsed JSON.\n * @param json - The JSON string to parse. If not a string, it is returned as is.\n * @param options - Configuration options for parsing.\n *\n * @returns The parsed object if successful, otherwise the default value.\n */\nexport function parseJSON<T extends JSONValue>(json: unknown, options: ParseJSONOptions<T> = {}): T | undefined {\n const { defaultValue, reviver, validator, silent = false } = options;\n\n if (!isString(json)) return isNil(json) ? defaultValue : (json as T);\n\n try {\n const parsed = JSON.parse(json as string, reviver);\n\n if (validator && !validator(parsed)) {\n throw new TypeError('Parsed JSON does not match the expected structure');\n }\n\n return parsed ?? defaultValue;\n } catch (err) {\n if (!silent) {\n Logit.error('parseJSON() -> failed to parse object', err);\n }\n\n return defaultValue;\n }\n}\n"],"names":["parseJSON","json","options","defaultValue","reviver","validator","silent","isString","isNil","parsed","err","Logit"],"mappings":";;;AAoCO,SAASA,EAA+BC,GAAeC,IAA+B,IAAmB;AAC9G,QAAM,EAAE,cAAAC,GAAc,SAAAC,GAAS,WAAAC,GAAW,QAAAC,IAAS,OAAUJ;AAE7D,MAAI,CAACK,EAASN,CAAI,UAAUO,EAAMP,CAAI,IAAIE,IAAgBF;AAE1D,MAAI;AACF,UAAMQ,IAAS,KAAK,MAAMR,GAAgBG,CAAO;AAEjD,QAAIC,KAAa,CAACA,EAAUI,CAAM;AAChC,YAAM,IAAI,UAAU,mDAAmD;AAGzE,WAAOA,KAAUN;AAAA,EACnB,SAASO,GAAK;AACZ,WAAKJ,KACHK,EAAM,MAAM,yCAAyCD,CAAG,GAGnDP;AAAA,EACT;AACF;"}
1
+ {"version":3,"file":"parseJSON.js","sources":["../../src/object/parseJSON.ts"],"sourcesContent":["import { Logit } from '@vielzeug/logit';\nimport { isNil } from '../typed/isNil';\nimport { isString } from '../typed/isString';\n\ntype JSONValue = string | number | boolean | null | JSONValue[] | { [key: string]: JSONValue };\n\n// #region ParseJSONOptions\ntype ParseJSONOptions<T> = {\n defaultValue?: T;\n // biome-ignore lint/suspicious/noExplicitAny: -\n reviver?: (key: string, value: any) => any;\n // biome-ignore lint/suspicious/noExplicitAny: -\n validator?: (value: any) => boolean;\n silent?: boolean;\n};\n// #endregion ParseJSONOptions\n\n/**\n * Parses a JSON string and returns the resulting object.\n *\n * @example\n * ```ts\n * const json = '{\"a\":1,\"b\":2,\"c\":3}';\n * const result = parseJSON<Record<string, number>>(json, {\n * defaultValue: { a: 0, b: 0, c: 0 },\n * validator: (value) => Object.values(value).every(v => typeof v === 'number'),\n * errorHandler: (err) => console.warn('Parsing failed:', err.message),\n * silent: true\n * });\n * console.log(result); // { a: 1, b: 2, c: 3 }\n * ```\n *\n * @template T - The expected type of the parsed JSON.\n * @param json - The JSON string to parse. If not a string, it is returned as is.\n * @param options - Configuration options for parsing.\n *\n * @returns The parsed object if successful, otherwise the default value.\n */\nexport function parseJSON<T extends JSONValue>(json: unknown, options: ParseJSONOptions<T> = {}): T | undefined {\n const { defaultValue, reviver, validator, silent = false } = options;\n\n if (!isString(json)) return isNil(json) ? defaultValue : (json as T);\n\n try {\n const parsed = JSON.parse(json as string, reviver);\n\n if (validator && !validator(parsed)) {\n throw new TypeError('Parsed JSON does not match the expected structure');\n }\n\n return parsed ?? defaultValue;\n } catch (err) {\n if (!silent) {\n Logit.error('parseJSON() -> failed to parse object', err);\n }\n\n return defaultValue;\n }\n}\n"],"names":["parseJSON","json","options","defaultValue","reviver","validator","silent","isString","isNil","parsed","err","Logit"],"mappings":";;;AAsCO,SAASA,EAA+BC,GAAeC,IAA+B,IAAmB;AAC9G,QAAM,EAAE,cAAAC,GAAc,SAAAC,GAAS,WAAAC,GAAW,QAAAC,IAAS,OAAUJ;AAE7D,MAAI,CAACK,EAASN,CAAI,UAAUO,EAAMP,CAAI,IAAIE,IAAgBF;AAE1D,MAAI;AACF,UAAMQ,IAAS,KAAK,MAAMR,GAAgBG,CAAO;AAEjD,QAAIC,KAAa,CAACA,EAAUI,CAAM;AAChC,YAAM,IAAI,UAAU,mDAAmD;AAGzE,WAAOA,KAAUN;AAAA,EACnB,SAASO,GAAK;AACZ,WAAKJ,KACHK,EAAM,MAAM,yCAAyCD,CAAG,GAGnDP;AAAA,EACT;AACF;"}
@@ -1 +1 @@
1
- {"version":3,"file":"path.cjs","sources":["../../src/object/path.ts"],"sourcesContent":["import { assert } from '../function/assert';\nimport { isArray } from '../typed/isArray';\nimport { isNil } from '../typed/isNil';\nimport { IS_OBJECT_ERROR_MSG, isObject } from '../typed/isObject';\nimport type { Obj } from '../types';\n\ntype PathValue<T, P extends string> = P extends `${infer Key}.${infer Rest}`\n ? Key extends keyof T\n ? PathValue<T[Key], Rest>\n : undefined\n : P extends keyof T\n ? T[P]\n : undefined;\n\ntype PathOptions = {\n throwOnMissing?: boolean;\n allowArrayIndex?: boolean;\n};\n\n/**\n * Retrieves the value at a given path of the object. If the value is undefined, the default value is returned.\n *\n * @example\n * ```ts\n * const obj = { a: { b: { c: 3 } }, d: [1, 2, 3] };\n *\n * getValue(obj, 'a.b.c'); // 3\n * getValue(obj, 'a.b.d', 'default'); // 'default'\n * getValue(obj, 'd[1]', undefined, { allowArrayIndex: true }); // 2\n * getValue(obj, 'e.f.g', 'default', { throwOnMissing: true }); // throws Error\n * ```\n *\n * @template T - The type of the object to query.\n * @template P - The type of the path string.\n * @param item - The object to query.\n * @param path - The path of the property to get.\n * @param [defaultValue] - The value returned for undefined resolved values.\n * @param [options] - Additional options for value retrieval.\n *\n * @returns The resolved value.\n *\n * @throws If throwOnMissing is true and the path doesn't exist.\n */\nexport function path<T extends Obj, P extends string>(\n item: T,\n path: P,\n defaultValue?: unknown,\n options: PathOptions = {},\n): PathValue<T, P> | undefined {\n assert(isObject(item), IS_OBJECT_ERROR_MSG, { args: { item }, type: TypeError });\n\n const { throwOnMissing = false, allowArrayIndex = false } = options;\n\n const fragments = path.split(/[.[\\]]+/).filter(Boolean);\n // biome-ignore lint/suspicious/noExplicitAny: -\n let current: any = item;\n\n for (const fragment of fragments) {\n if (isNil(current) || typeof current !== 'object') {\n return handleError(`Cannot read property '${fragment}' of ${current}`, throwOnMissing, defaultValue);\n }\n\n current =\n allowArrayIndex && isArray(current) && /^\\d+$/.test(fragment) ? current[Number(fragment)] : current[fragment];\n\n if (current === undefined) {\n return handleError(`Property '${fragment}' does not exist`, throwOnMissing, defaultValue);\n }\n }\n\n return current as PathValue<T, P>;\n}\n\nfunction handleError<T extends Obj, P extends string>(\n message: string,\n throwOnMissing: boolean,\n defaultValue?: unknown,\n): PathValue<T, P> | undefined {\n if (throwOnMissing) throw new Error(message);\n return defaultValue as PathValue<T, P>;\n}\n"],"names":["path","item","defaultValue","options","assert","isObject","IS_OBJECT_ERROR_MSG","throwOnMissing","allowArrayIndex","fragments","current","fragment","isNil","handleError","isArray","message"],"mappings":"+NA2CO,SAASA,EACdC,EACAD,EACAE,EACAC,EAAuB,CAAA,EACM,CAC7BC,EAAAA,OAAOC,EAAAA,SAASJ,CAAI,EAAGK,sBAAqB,CAAE,KAAM,CAAE,KAAAL,CAAA,EAAQ,KAAM,UAAW,EAE/E,KAAM,CAAE,eAAAM,EAAiB,GAAO,gBAAAC,EAAkB,IAAUL,EAEtDM,EAAYT,EAAK,MAAM,SAAS,EAAE,OAAO,OAAO,EAEtD,IAAIU,EAAeT,EAEnB,UAAWU,KAAYF,EAAW,CAChC,GAAIG,EAAAA,MAAMF,CAAO,GAAK,OAAOA,GAAY,SACvC,OAAOG,EAAY,yBAAyBF,CAAQ,QAAQD,CAAO,GAAIH,EAAgBL,CAAY,EAMrG,GAHAQ,EACEF,GAAmBM,EAAAA,QAAQJ,CAAO,GAAK,QAAQ,KAAKC,CAAQ,EAAID,EAAQ,OAAOC,CAAQ,CAAC,EAAID,EAAQC,CAAQ,EAE1GD,IAAY,OACd,OAAOG,EAAY,aAAaF,CAAQ,mBAAoBJ,EAAgBL,CAAY,CAE5F,CAEA,OAAOQ,CACT,CAEA,SAASG,EACPE,EACAR,EACAL,EAC6B,CAC7B,GAAIK,EAAgB,MAAM,IAAI,MAAMQ,CAAO,EAC3C,OAAOb,CACT"}
1
+ {"version":3,"file":"path.cjs","sources":["../../src/object/path.ts"],"sourcesContent":["import { assert } from '../function/assert';\nimport { isArray } from '../typed/isArray';\nimport { isNil } from '../typed/isNil';\nimport { IS_OBJECT_ERROR_MSG, isObject } from '../typed/isObject';\nimport type { Obj } from '../types';\n\ntype PathValue<T, P extends string> = P extends `${infer Key}.${infer Rest}`\n ? Key extends keyof T\n ? PathValue<T[Key], Rest>\n : undefined\n : P extends keyof T\n ? T[P]\n : undefined;\n\n// #region PathOptions\ntype PathOptions = {\n throwOnMissing?: boolean;\n allowArrayIndex?: boolean;\n};\n// #endregion PathOptions\n\n/**\n * Retrieves the value at a given path of the object. If the value is undefined, the default value is returned.\n *\n * @example\n * ```ts\n * const obj = { a: { b: { c: 3 } }, d: [1, 2, 3] };\n *\n * getValue(obj, 'a.b.c'); // 3\n * getValue(obj, 'a.b.d', 'default'); // 'default'\n * getValue(obj, 'd[1]', undefined, { allowArrayIndex: true }); // 2\n * getValue(obj, 'e.f.g', 'default', { throwOnMissing: true }); // throws Error\n * ```\n *\n * @template T - The type of the object to query.\n * @template P - The type of the path string.\n * @param item - The object to query.\n * @param path - The path of the property to get.\n * @param [defaultValue] - The value returned for undefined resolved values.\n * @param [options] - Additional options for value retrieval.\n *\n * @returns The resolved value.\n *\n * @throws If throwOnMissing is true and the path doesn't exist.\n */\nexport function path<T extends Obj, P extends string>(\n item: T,\n path: P,\n defaultValue?: unknown,\n options: PathOptions = {},\n): PathValue<T, P> | undefined {\n assert(isObject(item), IS_OBJECT_ERROR_MSG, { args: { item }, type: TypeError });\n\n const { throwOnMissing = false, allowArrayIndex = false } = options;\n\n const fragments = path.split(/[.[\\]]+/).filter(Boolean);\n // biome-ignore lint/suspicious/noExplicitAny: -\n let current: any = item;\n\n for (const fragment of fragments) {\n if (isNil(current) || typeof current !== 'object') {\n return handleError(`Cannot read property '${fragment}' of ${current}`, throwOnMissing, defaultValue);\n }\n\n current =\n allowArrayIndex && isArray(current) && /^\\d+$/.test(fragment) ? current[Number(fragment)] : current[fragment];\n\n if (current === undefined) {\n return handleError(`Property '${fragment}' does not exist`, throwOnMissing, defaultValue);\n }\n }\n\n return current as PathValue<T, P>;\n}\n\nfunction handleError<T extends Obj, P extends string>(\n message: string,\n throwOnMissing: boolean,\n defaultValue?: unknown,\n): PathValue<T, P> | undefined {\n if (throwOnMissing) throw new Error(message);\n return defaultValue as PathValue<T, P>;\n}\n"],"names":["path","item","defaultValue","options","assert","isObject","IS_OBJECT_ERROR_MSG","throwOnMissing","allowArrayIndex","fragments","current","fragment","isNil","handleError","isArray","message"],"mappings":"+NA6CO,SAASA,EACdC,EACAD,EACAE,EACAC,EAAuB,CAAA,EACM,CAC7BC,EAAAA,OAAOC,EAAAA,SAASJ,CAAI,EAAGK,sBAAqB,CAAE,KAAM,CAAE,KAAAL,CAAA,EAAQ,KAAM,UAAW,EAE/E,KAAM,CAAE,eAAAM,EAAiB,GAAO,gBAAAC,EAAkB,IAAUL,EAEtDM,EAAYT,EAAK,MAAM,SAAS,EAAE,OAAO,OAAO,EAEtD,IAAIU,EAAeT,EAEnB,UAAWU,KAAYF,EAAW,CAChC,GAAIG,EAAAA,MAAMF,CAAO,GAAK,OAAOA,GAAY,SACvC,OAAOG,EAAY,yBAAyBF,CAAQ,QAAQD,CAAO,GAAIH,EAAgBL,CAAY,EAMrG,GAHAQ,EACEF,GAAmBM,EAAAA,QAAQJ,CAAO,GAAK,QAAQ,KAAKC,CAAQ,EAAID,EAAQ,OAAOC,CAAQ,CAAC,EAAID,EAAQC,CAAQ,EAE1GD,IAAY,OACd,OAAOG,EAAY,aAAaF,CAAQ,mBAAoBJ,EAAgBL,CAAY,CAE5F,CAEA,OAAOQ,CACT,CAEA,SAASG,EACPE,EACAR,EACAL,EAC6B,CAC7B,GAAIK,EAAgB,MAAM,IAAI,MAAMQ,CAAO,EAC3C,OAAOb,CACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"path.js","sources":["../../src/object/path.ts"],"sourcesContent":["import { assert } from '../function/assert';\nimport { isArray } from '../typed/isArray';\nimport { isNil } from '../typed/isNil';\nimport { IS_OBJECT_ERROR_MSG, isObject } from '../typed/isObject';\nimport type { Obj } from '../types';\n\ntype PathValue<T, P extends string> = P extends `${infer Key}.${infer Rest}`\n ? Key extends keyof T\n ? PathValue<T[Key], Rest>\n : undefined\n : P extends keyof T\n ? T[P]\n : undefined;\n\ntype PathOptions = {\n throwOnMissing?: boolean;\n allowArrayIndex?: boolean;\n};\n\n/**\n * Retrieves the value at a given path of the object. If the value is undefined, the default value is returned.\n *\n * @example\n * ```ts\n * const obj = { a: { b: { c: 3 } }, d: [1, 2, 3] };\n *\n * getValue(obj, 'a.b.c'); // 3\n * getValue(obj, 'a.b.d', 'default'); // 'default'\n * getValue(obj, 'd[1]', undefined, { allowArrayIndex: true }); // 2\n * getValue(obj, 'e.f.g', 'default', { throwOnMissing: true }); // throws Error\n * ```\n *\n * @template T - The type of the object to query.\n * @template P - The type of the path string.\n * @param item - The object to query.\n * @param path - The path of the property to get.\n * @param [defaultValue] - The value returned for undefined resolved values.\n * @param [options] - Additional options for value retrieval.\n *\n * @returns The resolved value.\n *\n * @throws If throwOnMissing is true and the path doesn't exist.\n */\nexport function path<T extends Obj, P extends string>(\n item: T,\n path: P,\n defaultValue?: unknown,\n options: PathOptions = {},\n): PathValue<T, P> | undefined {\n assert(isObject(item), IS_OBJECT_ERROR_MSG, { args: { item }, type: TypeError });\n\n const { throwOnMissing = false, allowArrayIndex = false } = options;\n\n const fragments = path.split(/[.[\\]]+/).filter(Boolean);\n // biome-ignore lint/suspicious/noExplicitAny: -\n let current: any = item;\n\n for (const fragment of fragments) {\n if (isNil(current) || typeof current !== 'object') {\n return handleError(`Cannot read property '${fragment}' of ${current}`, throwOnMissing, defaultValue);\n }\n\n current =\n allowArrayIndex && isArray(current) && /^\\d+$/.test(fragment) ? current[Number(fragment)] : current[fragment];\n\n if (current === undefined) {\n return handleError(`Property '${fragment}' does not exist`, throwOnMissing, defaultValue);\n }\n }\n\n return current as PathValue<T, P>;\n}\n\nfunction handleError<T extends Obj, P extends string>(\n message: string,\n throwOnMissing: boolean,\n defaultValue?: unknown,\n): PathValue<T, P> | undefined {\n if (throwOnMissing) throw new Error(message);\n return defaultValue as PathValue<T, P>;\n}\n"],"names":["path","item","defaultValue","options","assert","isObject","IS_OBJECT_ERROR_MSG","throwOnMissing","allowArrayIndex","fragments","current","fragment","isNil","handleError","isArray","message"],"mappings":";;;;AA2CO,SAASA,EACdC,GACAD,GACAE,GACAC,IAAuB,CAAA,GACM;AAC7B,EAAAC,EAAOC,EAASJ,CAAI,GAAGK,GAAqB,EAAE,MAAM,EAAE,MAAAL,EAAA,GAAQ,MAAM,WAAW;AAE/E,QAAM,EAAE,gBAAAM,IAAiB,IAAO,iBAAAC,IAAkB,OAAUL,GAEtDM,IAAYT,EAAK,MAAM,SAAS,EAAE,OAAO,OAAO;AAEtD,MAAIU,IAAeT;AAEnB,aAAWU,KAAYF,GAAW;AAChC,QAAIG,EAAMF,CAAO,KAAK,OAAOA,KAAY;AACvC,aAAOG,EAAY,yBAAyBF,CAAQ,QAAQD,CAAO,IAAIH,GAAgBL,CAAY;AAMrG,QAHAQ,IACEF,KAAmBM,EAAQJ,CAAO,KAAK,QAAQ,KAAKC,CAAQ,IAAID,EAAQ,OAAOC,CAAQ,CAAC,IAAID,EAAQC,CAAQ,GAE1GD,MAAY;AACd,aAAOG,EAAY,aAAaF,CAAQ,oBAAoBJ,GAAgBL,CAAY;AAAA,EAE5F;AAEA,SAAOQ;AACT;AAEA,SAASG,EACPE,GACAR,GACAL,GAC6B;AAC7B,MAAIK,EAAgB,OAAM,IAAI,MAAMQ,CAAO;AAC3C,SAAOb;AACT;"}
1
+ {"version":3,"file":"path.js","sources":["../../src/object/path.ts"],"sourcesContent":["import { assert } from '../function/assert';\nimport { isArray } from '../typed/isArray';\nimport { isNil } from '../typed/isNil';\nimport { IS_OBJECT_ERROR_MSG, isObject } from '../typed/isObject';\nimport type { Obj } from '../types';\n\ntype PathValue<T, P extends string> = P extends `${infer Key}.${infer Rest}`\n ? Key extends keyof T\n ? PathValue<T[Key], Rest>\n : undefined\n : P extends keyof T\n ? T[P]\n : undefined;\n\n// #region PathOptions\ntype PathOptions = {\n throwOnMissing?: boolean;\n allowArrayIndex?: boolean;\n};\n// #endregion PathOptions\n\n/**\n * Retrieves the value at a given path of the object. If the value is undefined, the default value is returned.\n *\n * @example\n * ```ts\n * const obj = { a: { b: { c: 3 } }, d: [1, 2, 3] };\n *\n * getValue(obj, 'a.b.c'); // 3\n * getValue(obj, 'a.b.d', 'default'); // 'default'\n * getValue(obj, 'd[1]', undefined, { allowArrayIndex: true }); // 2\n * getValue(obj, 'e.f.g', 'default', { throwOnMissing: true }); // throws Error\n * ```\n *\n * @template T - The type of the object to query.\n * @template P - The type of the path string.\n * @param item - The object to query.\n * @param path - The path of the property to get.\n * @param [defaultValue] - The value returned for undefined resolved values.\n * @param [options] - Additional options for value retrieval.\n *\n * @returns The resolved value.\n *\n * @throws If throwOnMissing is true and the path doesn't exist.\n */\nexport function path<T extends Obj, P extends string>(\n item: T,\n path: P,\n defaultValue?: unknown,\n options: PathOptions = {},\n): PathValue<T, P> | undefined {\n assert(isObject(item), IS_OBJECT_ERROR_MSG, { args: { item }, type: TypeError });\n\n const { throwOnMissing = false, allowArrayIndex = false } = options;\n\n const fragments = path.split(/[.[\\]]+/).filter(Boolean);\n // biome-ignore lint/suspicious/noExplicitAny: -\n let current: any = item;\n\n for (const fragment of fragments) {\n if (isNil(current) || typeof current !== 'object') {\n return handleError(`Cannot read property '${fragment}' of ${current}`, throwOnMissing, defaultValue);\n }\n\n current =\n allowArrayIndex && isArray(current) && /^\\d+$/.test(fragment) ? current[Number(fragment)] : current[fragment];\n\n if (current === undefined) {\n return handleError(`Property '${fragment}' does not exist`, throwOnMissing, defaultValue);\n }\n }\n\n return current as PathValue<T, P>;\n}\n\nfunction handleError<T extends Obj, P extends string>(\n message: string,\n throwOnMissing: boolean,\n defaultValue?: unknown,\n): PathValue<T, P> | undefined {\n if (throwOnMissing) throw new Error(message);\n return defaultValue as PathValue<T, P>;\n}\n"],"names":["path","item","defaultValue","options","assert","isObject","IS_OBJECT_ERROR_MSG","throwOnMissing","allowArrayIndex","fragments","current","fragment","isNil","handleError","isArray","message"],"mappings":";;;;AA6CO,SAASA,EACdC,GACAD,GACAE,GACAC,IAAuB,CAAA,GACM;AAC7B,EAAAC,EAAOC,EAASJ,CAAI,GAAGK,GAAqB,EAAE,MAAM,EAAE,MAAAL,EAAA,GAAQ,MAAM,WAAW;AAE/E,QAAM,EAAE,gBAAAM,IAAiB,IAAO,iBAAAC,IAAkB,OAAUL,GAEtDM,IAAYT,EAAK,MAAM,SAAS,EAAE,OAAO,OAAO;AAEtD,MAAIU,IAAeT;AAEnB,aAAWU,KAAYF,GAAW;AAChC,QAAIG,EAAMF,CAAO,KAAK,OAAOA,KAAY;AACvC,aAAOG,EAAY,yBAAyBF,CAAQ,QAAQD,CAAO,IAAIH,GAAgBL,CAAY;AAMrG,QAHAQ,IACEF,KAAmBM,EAAQJ,CAAO,KAAK,QAAQ,KAAKC,CAAQ,IAAID,EAAQ,OAAOC,CAAQ,CAAC,IAAID,EAAQC,CAAQ,GAE1GD,MAAY;AACd,aAAOG,EAAY,aAAaF,CAAQ,oBAAoBJ,GAAgBL,CAAY;AAAA,EAE5F;AAEA,SAAOQ;AACT;AAEA,SAASG,EACPE,GACAR,GACAL,GAC6B;AAC7B,MAAIK,EAAgB,OAAM,IAAI,MAAMQ,CAAO;AAC3C,SAAOb;AACT;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vielzeug/toolkit",
3
- "version": "1.0.13",
3
+ "version": "1.1.2",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"
@@ -1 +0,0 @@
1
- {"version":3,"file":"sortBy.cjs","sources":["../../src/array/sortBy.ts"],"sourcesContent":["import { compareBy } from '../function/compareBy';\n\n/**\n * Sorts an array of objects based on multiple selectors.\n *\n * @example\n * ```ts\n * const data = [\n * { name: 'Alice', age: 30 },\n * { name: 'Bob', age: 25 },\n * { name: 'Charlie', age: 35 },\n * { name: 'Alice', age: 25 },\n * { name: 'Bob', age: 30 },\n * { name: 'Charlie', age: 30 },\n * ].sortBy(data, { name: 'asc', age: 'desc' }); // [ { name: 'Alice', age: 30 }, { name: 'Alice', age: 25 }, { name: 'Bob', age: 30 }, { name: 'Bob', age: 25 }, { name: 'Charlie', age: 35 }, { name: 'Charlie', age: 30 } ]\n * ```\n *\n * @param array - The array to sort.\n * @param selectors - An object where keys are the properties to sort by and values are 'asc' or 'desc'.\n * @returns A new sorted array.\n */\nexport const sortBy = <T>(array: T[], selectors: Partial<Record<keyof T, 'asc' | 'desc'>>) => {\n return [...array].sort(compareBy(selectors));\n};\n"],"names":["sortBy","array","selectors","compareBy"],"mappings":"6HAqBaA,EAAS,CAAIC,EAAYC,IAC7B,CAAC,GAAGD,CAAK,EAAE,KAAKE,EAAAA,UAAUD,CAAS,CAAC"}
@@ -1,6 +0,0 @@
1
- import { compareBy as t } from "../function/compareBy.js";
2
- const m = (r, o) => [...r].sort(t(o));
3
- export {
4
- m as sortBy
5
- };
6
- //# sourceMappingURL=sortBy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sortBy.js","sources":["../../src/array/sortBy.ts"],"sourcesContent":["import { compareBy } from '../function/compareBy';\n\n/**\n * Sorts an array of objects based on multiple selectors.\n *\n * @example\n * ```ts\n * const data = [\n * { name: 'Alice', age: 30 },\n * { name: 'Bob', age: 25 },\n * { name: 'Charlie', age: 35 },\n * { name: 'Alice', age: 25 },\n * { name: 'Bob', age: 30 },\n * { name: 'Charlie', age: 30 },\n * ].sortBy(data, { name: 'asc', age: 'desc' }); // [ { name: 'Alice', age: 30 }, { name: 'Alice', age: 25 }, { name: 'Bob', age: 30 }, { name: 'Bob', age: 25 }, { name: 'Charlie', age: 35 }, { name: 'Charlie', age: 30 } ]\n * ```\n *\n * @param array - The array to sort.\n * @param selectors - An object where keys are the properties to sort by and values are 'asc' or 'desc'.\n * @returns A new sorted array.\n */\nexport const sortBy = <T>(array: T[], selectors: Partial<Record<keyof T, 'asc' | 'desc'>>) => {\n return [...array].sort(compareBy(selectors));\n};\n"],"names":["sortBy","array","selectors","compareBy"],"mappings":";AAqBO,MAAMA,IAAS,CAAIC,GAAYC,MAC7B,CAAC,GAAGD,CAAK,EAAE,KAAKE,EAAUD,CAAS,CAAC;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"attempt.cjs","sources":["../../src/function/attempt.ts"],"sourcesContent":["import { Logit } from '@vielzeug/logit';\nimport type { Fn } from '../types';\nimport { predict } from './predict';\nimport { retry } from './retry';\n\ntype AttemptOptions = {\n identifier?: string;\n retries?: number;\n silent?: boolean;\n timeout?: number;\n};\n\n/**\n * Attempts to execute a function with advanced error handling and retry logic.\n *\n * @example\n * ```ts\n * const unreliableFunction = async () => {\n * if (Math.random() < 0.7) throw new Error ('Random failure');\n * return 'Success!';\n * };\n *\n * await attempt(\n * unreliableFunction,\n * { retries: 3, silent: false, timeout: 5000 }); // Success! (or undefined if all attempts failed)\n * ```\n *\n * @param fn - The function to be executed.\n * @param [options] - Configuration options for the attempt.\n * @param [options.identifier] - Custom identifier for logging purposes.\n * @param [options.retries=0] - Number of retry attempts if the function fails.\n * @param [options.silent=false] - If true, suppresses error logging.\n * @param [options.timeout=7000] - Timeout in milliseconds for function execution.\n *\n * @returns The result of the function or undefined if it failed.\n */\nexport async function attempt<T extends Fn, R = Awaited<ReturnType<T>>>(\n fn: T,\n { silent = false, retries = 0, timeout = 7000, identifier = fn.name || 'anonymous function' }: AttemptOptions = {},\n): Promise<R | undefined> {\n try {\n return await retry(() => predict<R>(() => fn(), { timeout }), { times: retries + 1 });\n } catch (err) {\n if (!silent) {\n Logit.error(`attempt(${identifier}) -> all attempts failed`, { cause: err });\n }\n return undefined;\n }\n}\n"],"names":["attempt","fn","silent","retries","timeout","identifier","retry","predict","err","Logit"],"mappings":"+KAoCA,eAAsBA,EACpBC,EACA,CAAE,OAAAC,EAAS,GAAO,QAAAC,EAAU,EAAG,QAAAC,EAAU,IAAM,WAAAC,EAAaJ,EAAG,MAAQ,oBAAA,EAAyC,CAAA,EACxF,CACxB,GAAI,CACF,OAAO,MAAMK,EAAAA,MAAM,IAAMC,EAAAA,QAAW,IAAMN,EAAA,EAAM,CAAE,QAAAG,CAAA,CAAS,EAAG,CAAE,MAAOD,EAAU,EAAG,CACtF,OAASK,EAAK,CACPN,GACHO,QAAM,MAAM,WAAWJ,CAAU,2BAA4B,CAAE,MAAOG,EAAK,EAE7E,MACF,CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"attempt.js","sources":["../../src/function/attempt.ts"],"sourcesContent":["import { Logit } from '@vielzeug/logit';\nimport type { Fn } from '../types';\nimport { predict } from './predict';\nimport { retry } from './retry';\n\ntype AttemptOptions = {\n identifier?: string;\n retries?: number;\n silent?: boolean;\n timeout?: number;\n};\n\n/**\n * Attempts to execute a function with advanced error handling and retry logic.\n *\n * @example\n * ```ts\n * const unreliableFunction = async () => {\n * if (Math.random() < 0.7) throw new Error ('Random failure');\n * return 'Success!';\n * };\n *\n * await attempt(\n * unreliableFunction,\n * { retries: 3, silent: false, timeout: 5000 }); // Success! (or undefined if all attempts failed)\n * ```\n *\n * @param fn - The function to be executed.\n * @param [options] - Configuration options for the attempt.\n * @param [options.identifier] - Custom identifier for logging purposes.\n * @param [options.retries=0] - Number of retry attempts if the function fails.\n * @param [options.silent=false] - If true, suppresses error logging.\n * @param [options.timeout=7000] - Timeout in milliseconds for function execution.\n *\n * @returns The result of the function or undefined if it failed.\n */\nexport async function attempt<T extends Fn, R = Awaited<ReturnType<T>>>(\n fn: T,\n { silent = false, retries = 0, timeout = 7000, identifier = fn.name || 'anonymous function' }: AttemptOptions = {},\n): Promise<R | undefined> {\n try {\n return await retry(() => predict<R>(() => fn(), { timeout }), { times: retries + 1 });\n } catch (err) {\n if (!silent) {\n Logit.error(`attempt(${identifier}) -> all attempts failed`, { cause: err });\n }\n return undefined;\n }\n}\n"],"names":["attempt","fn","silent","retries","timeout","identifier","retry","predict","err","Logit"],"mappings":";;;AAoCA,eAAsBA,EACpBC,GACA,EAAE,QAAAC,IAAS,IAAO,SAAAC,IAAU,GAAG,SAAAC,IAAU,KAAM,YAAAC,IAAaJ,EAAG,QAAQ,qBAAA,IAAyC,CAAA,GACxF;AACxB,MAAI;AACF,WAAO,MAAMK,EAAM,MAAMC,EAAW,MAAMN,EAAA,GAAM,EAAE,SAAAG,EAAA,CAAS,GAAG,EAAE,OAAOD,IAAU,GAAG;AAAA,EACtF,SAASK,GAAK;AACZ,IAAKN,KACHO,EAAM,MAAM,WAAWJ,CAAU,4BAA4B,EAAE,OAAOG,GAAK;AAE7E;AAAA,EACF;AACF;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"delay.cjs","sources":["../../src/function/delay.ts"],"sourcesContent":["import type { Fn } from '../types';\nimport { sleep } from './sleep';\n\n/**\n * Delays the execution of a function by a specified amount of time.\n *\n * @example\n * ```ts\n * const log = () => console.log('Hello, world!');\n *\n * delay(log, 1000); // logs 'Hello, world!' after 1 second\n * ```\n *\n * @param fn - The function to be delayed.\n * @param delay - The amount of time to delay the function execution, in milliseconds. Default is 700.\n *\n * @returns A Promise that resolves with the result of the function execution.\n */\nexport async function delay<T extends Fn>(fn: T, delay = 700) {\n await sleep(delay);\n\n return fn();\n}\n"],"names":["delay","fn","sleep"],"mappings":"+GAkBA,eAAsBA,EAAoBC,EAAOD,EAAQ,IAAK,CAC5D,aAAME,EAAAA,MAAMF,CAAK,EAEVC,EAAA,CACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"delay.js","sources":["../../src/function/delay.ts"],"sourcesContent":["import type { Fn } from '../types';\nimport { sleep } from './sleep';\n\n/**\n * Delays the execution of a function by a specified amount of time.\n *\n * @example\n * ```ts\n * const log = () => console.log('Hello, world!');\n *\n * delay(log, 1000); // logs 'Hello, world!' after 1 second\n * ```\n *\n * @param fn - The function to be delayed.\n * @param delay - The amount of time to delay the function execution, in milliseconds. Default is 700.\n *\n * @returns A Promise that resolves with the result of the function execution.\n */\nexport async function delay<T extends Fn>(fn: T, delay = 700) {\n await sleep(delay);\n\n return fn();\n}\n"],"names":["delay","fn","sleep"],"mappings":";AAkBA,eAAsBA,EAAoBC,GAAOD,IAAQ,KAAK;AAC5D,eAAME,EAAMF,CAAK,GAEVC,EAAA;AACT;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"predict.cjs","sources":["../../src/function/predict.ts"],"sourcesContent":["/**\n * Creates a Promise that can be aborted using an AbortController.\n *\n * @example\n * ```ts\n * const slowFn = () => new Promise(resolve => setTimeout(() => resolve('slow'), 10000));\n * const fastFn = () => new Promise(resolve => setTimeout(() => resolve('fast'), 5000));\n *\n * predict(slowFn); // rejects after 7 seconds\n * predict(fastFn); // resolves with 'fast' after 5 seconds\n * ```\n *\n * @param fn - The function to execute, which receives an AbortSignal.\n * @param options - The options for the abortable function.\n * @param [options.signal] - The AbortSignal to use for aborting the Promise.\n * @param [options.timeout=7000] - The timeout in milliseconds after which the Promise will be aborted.\n *\n * @returns - A Promise that resolves with the result of the callback or rejects if aborted.\n */\nexport function predict<T>(\n fn: (signal: AbortSignal) => Promise<T>,\n options: { signal?: AbortSignal; timeout?: number } = {},\n): Promise<T> {\n const { signal, timeout = 7000 } = options;\n const abortSignal = signal ? AbortSignal.any([AbortSignal.timeout(timeout), signal]) : AbortSignal.timeout(timeout);\n\n return Promise.race([\n fn(abortSignal),\n new Promise<never>((_, reject) => {\n abortSignal.addEventListener('abort', () => reject(new Error('Operation aborted')), { once: true });\n }),\n ]);\n}\n"],"names":["predict","fn","options","signal","timeout","abortSignal","_","reject"],"mappings":"gFAmBO,SAASA,EACdC,EACAC,EAAsD,GAC1C,CACZ,KAAM,CAAE,OAAAC,EAAQ,QAAAC,EAAU,GAAA,EAASF,EAC7BG,EAAcF,EAAS,YAAY,IAAI,CAAC,YAAY,QAAQC,CAAO,EAAGD,CAAM,CAAC,EAAI,YAAY,QAAQC,CAAO,EAElH,OAAO,QAAQ,KAAK,CAClBH,EAAGI,CAAW,EACd,IAAI,QAAe,CAACC,EAAGC,IAAW,CAChCF,EAAY,iBAAiB,QAAS,IAAME,EAAO,IAAI,MAAM,mBAAmB,CAAC,EAAG,CAAE,KAAM,EAAA,CAAM,CACpG,CAAC,CAAA,CACF,CACH"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"predict.js","sources":["../../src/function/predict.ts"],"sourcesContent":["/**\n * Creates a Promise that can be aborted using an AbortController.\n *\n * @example\n * ```ts\n * const slowFn = () => new Promise(resolve => setTimeout(() => resolve('slow'), 10000));\n * const fastFn = () => new Promise(resolve => setTimeout(() => resolve('fast'), 5000));\n *\n * predict(slowFn); // rejects after 7 seconds\n * predict(fastFn); // resolves with 'fast' after 5 seconds\n * ```\n *\n * @param fn - The function to execute, which receives an AbortSignal.\n * @param options - The options for the abortable function.\n * @param [options.signal] - The AbortSignal to use for aborting the Promise.\n * @param [options.timeout=7000] - The timeout in milliseconds after which the Promise will be aborted.\n *\n * @returns - A Promise that resolves with the result of the callback or rejects if aborted.\n */\nexport function predict<T>(\n fn: (signal: AbortSignal) => Promise<T>,\n options: { signal?: AbortSignal; timeout?: number } = {},\n): Promise<T> {\n const { signal, timeout = 7000 } = options;\n const abortSignal = signal ? AbortSignal.any([AbortSignal.timeout(timeout), signal]) : AbortSignal.timeout(timeout);\n\n return Promise.race([\n fn(abortSignal),\n new Promise<never>((_, reject) => {\n abortSignal.addEventListener('abort', () => reject(new Error('Operation aborted')), { once: true });\n }),\n ]);\n}\n"],"names":["predict","fn","options","signal","timeout","abortSignal","_","reject"],"mappings":"AAmBO,SAASA,EACdC,GACAC,IAAsD,IAC1C;AACZ,QAAM,EAAE,QAAAC,GAAQ,SAAAC,IAAU,IAAA,IAASF,GAC7BG,IAAcF,IAAS,YAAY,IAAI,CAAC,YAAY,QAAQC,CAAO,GAAGD,CAAM,CAAC,IAAI,YAAY,QAAQC,CAAO;AAElH,SAAO,QAAQ,KAAK;AAAA,IAClBH,EAAGI,CAAW;AAAA,IACd,IAAI,QAAe,CAACC,GAAGC,MAAW;AAChC,MAAAF,EAAY,iBAAiB,SAAS,MAAME,EAAO,IAAI,MAAM,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAA,CAAM;AAAA,IACpG,CAAC;AAAA,EAAA,CACF;AACH;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry.cjs","sources":["../../src/function/retry.ts"],"sourcesContent":["import { Logit } from '@vielzeug/logit';\nimport { sleep } from './sleep';\n\n/**\n * Retries an asynchronous function a specified number of times with delay and optional exponential backoff.\n *\n * @example\n * ```ts\n * retry(() => fetchData(), { times: 3, delay: 1000, backoff: 2, signal: abortSignal })\n * .then(result => console.log(result))\n * .catch(error => console.error(error));\n * ```\n *\n * @param fn - The asynchronous function to retry.\n * @param options - (optional) Options for retrying the function.\n * @param [options.times=3] - The number of retry attempts.\n * @param [options.delay=250] - The delay in milliseconds between retries.\n * @param [options.backoff=1] - Exponential backoff factor (default: 1 → no backoff).\n * @param [options.signal] - `AbortSignal` to allow canceling retries.\n *\n * @returns The result of the asynchronous function.\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n {\n times = 3,\n delay = 250,\n backoff = 1,\n signal,\n }: {\n times?: number;\n delay?: number;\n backoff?: number | ((attempt: number, delay: number) => number);\n signal?: AbortSignal;\n } = {},\n): Promise<T> {\n let currentDelay = delay;\n\n for (let attempt = 1; attempt <= times; attempt++) {\n if (signal?.aborted) {\n Logit.warn(`retry() -> Aborted after ${attempt - 1} attempts`);\n throw new Error('Retry aborted');\n }\n\n try {\n return await fn();\n } catch (err) {\n if (attempt === times) throw err;\n\n Logit.warn(`retry() -> ${err}, attempt ${attempt}/${times}, retrying in ${currentDelay}ms`);\n if (currentDelay > 0) await sleep(currentDelay);\n\n currentDelay = typeof backoff === 'function' ? backoff(attempt, currentDelay) : currentDelay * backoff;\n }\n }\n\n throw new Error('Retry failed unexpectedly');\n}\n"],"names":["retry","fn","times","delay","backoff","signal","currentDelay","attempt","Logit","err","sleep"],"mappings":"oJAsBA,eAAsBA,EACpBC,EACA,CACE,MAAAC,EAAQ,EACR,MAAAC,EAAQ,IACR,QAAAC,EAAU,EACV,OAAAC,CACF,EAKI,GACQ,CACZ,IAAIC,EAAeH,EAEnB,QAASI,EAAU,EAAGA,GAAWL,EAAOK,IAAW,CACjD,GAAIF,GAAQ,QACVG,MAAAA,EAAAA,MAAM,KAAK,4BAA4BD,EAAU,CAAC,WAAW,EACvD,IAAI,MAAM,eAAe,EAGjC,GAAI,CACF,OAAO,MAAMN,EAAA,CACf,OAASQ,EAAK,CACZ,GAAIF,IAAYL,EAAO,MAAMO,EAE7BD,EAAAA,MAAM,KAAK,cAAcC,CAAG,aAAaF,CAAO,IAAIL,CAAK,iBAAiBI,CAAY,IAAI,EACtFA,EAAe,GAAG,MAAMI,EAAAA,MAAMJ,CAAY,EAE9CA,EAAe,OAAOF,GAAY,WAAaA,EAAQG,EAASD,CAAY,EAAIA,EAAeF,CACjG,CACF,CAEA,MAAM,IAAI,MAAM,2BAA2B,CAC7C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry.js","sources":["../../src/function/retry.ts"],"sourcesContent":["import { Logit } from '@vielzeug/logit';\nimport { sleep } from './sleep';\n\n/**\n * Retries an asynchronous function a specified number of times with delay and optional exponential backoff.\n *\n * @example\n * ```ts\n * retry(() => fetchData(), { times: 3, delay: 1000, backoff: 2, signal: abortSignal })\n * .then(result => console.log(result))\n * .catch(error => console.error(error));\n * ```\n *\n * @param fn - The asynchronous function to retry.\n * @param options - (optional) Options for retrying the function.\n * @param [options.times=3] - The number of retry attempts.\n * @param [options.delay=250] - The delay in milliseconds between retries.\n * @param [options.backoff=1] - Exponential backoff factor (default: 1 → no backoff).\n * @param [options.signal] - `AbortSignal` to allow canceling retries.\n *\n * @returns The result of the asynchronous function.\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n {\n times = 3,\n delay = 250,\n backoff = 1,\n signal,\n }: {\n times?: number;\n delay?: number;\n backoff?: number | ((attempt: number, delay: number) => number);\n signal?: AbortSignal;\n } = {},\n): Promise<T> {\n let currentDelay = delay;\n\n for (let attempt = 1; attempt <= times; attempt++) {\n if (signal?.aborted) {\n Logit.warn(`retry() -> Aborted after ${attempt - 1} attempts`);\n throw new Error('Retry aborted');\n }\n\n try {\n return await fn();\n } catch (err) {\n if (attempt === times) throw err;\n\n Logit.warn(`retry() -> ${err}, attempt ${attempt}/${times}, retrying in ${currentDelay}ms`);\n if (currentDelay > 0) await sleep(currentDelay);\n\n currentDelay = typeof backoff === 'function' ? backoff(attempt, currentDelay) : currentDelay * backoff;\n }\n }\n\n throw new Error('Retry failed unexpectedly');\n}\n"],"names":["retry","fn","times","delay","backoff","signal","currentDelay","attempt","Logit","err","sleep"],"mappings":";;AAsBA,eAAsBA,EACpBC,GACA;AAAA,EACE,OAAAC,IAAQ;AAAA,EACR,OAAAC,IAAQ;AAAA,EACR,SAAAC,IAAU;AAAA,EACV,QAAAC;AACF,IAKI,IACQ;AACZ,MAAIC,IAAeH;AAEnB,WAASI,IAAU,GAAGA,KAAWL,GAAOK,KAAW;AACjD,QAAIF,GAAQ;AACVG,YAAAA,EAAM,KAAK,4BAA4BD,IAAU,CAAC,WAAW,GACvD,IAAI,MAAM,eAAe;AAGjC,QAAI;AACF,aAAO,MAAMN,EAAA;AAAA,IACf,SAASQ,GAAK;AACZ,UAAIF,MAAYL,EAAO,OAAMO;AAE7BD,MAAAA,EAAM,KAAK,cAAcC,CAAG,aAAaF,CAAO,IAAIL,CAAK,iBAAiBI,CAAY,IAAI,GACtFA,IAAe,KAAG,MAAMI,EAAMJ,CAAY,GAE9CA,IAAe,OAAOF,KAAY,aAAaA,EAAQG,GAASD,CAAY,IAAIA,IAAeF;AAAA,IACjG;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,2BAA2B;AAC7C;"}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("./assert.cjs");async function s(e){return n.assert(typeof e=="number"&&e>=0&&Number.isFinite(e),"Timeout must be a non-negative finite number",{args:{timeout:e},type:TypeError}),new Promise(r=>setTimeout(r,e))}exports.sleep=s;
2
- //# sourceMappingURL=sleep.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sleep.cjs","sources":["../../src/function/sleep.ts"],"sourcesContent":["import { assert } from './assert';\n\n/**\n * Creates a Promise that resolves after a specified amount of time.\n *\n * @example\n * ```ts\n * sleep(1000).then(() => console.log('Hello, world!')); // logs 'Hello, world!' after 1 second\n * ```\n *\n * @param timeout - The number of milliseconds to wait before resolving the Promise.\n *\n * @returns A Promise that resolves after the specified time.\n *\n * @throws {TypeError} If timeout is not a non-negative number.\n */\nexport async function sleep(timeout: number): Promise<void> {\n assert(\n typeof timeout === 'number' && timeout >= 0 && Number.isFinite(timeout),\n 'Timeout must be a non-negative finite number',\n { args: { timeout }, type: TypeError },\n );\n return new Promise((resolve) => setTimeout(resolve, timeout));\n}\n"],"names":["sleep","timeout","assert","resolve"],"mappings":"gHAgBA,eAAsBA,EAAMC,EAAgC,CAC1DC,OAAAA,EAAAA,OACE,OAAOD,GAAY,UAAYA,GAAW,GAAK,OAAO,SAASA,CAAO,EACtE,+CACA,CAAE,KAAM,CAAE,QAAAA,CAAA,EAAW,KAAM,SAAA,CAAU,EAEhC,IAAI,QAASE,GAAY,WAAWA,EAASF,CAAO,CAAC,CAC9D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"sleep.js","sources":["../../src/function/sleep.ts"],"sourcesContent":["import { assert } from './assert';\n\n/**\n * Creates a Promise that resolves after a specified amount of time.\n *\n * @example\n * ```ts\n * sleep(1000).then(() => console.log('Hello, world!')); // logs 'Hello, world!' after 1 second\n * ```\n *\n * @param timeout - The number of milliseconds to wait before resolving the Promise.\n *\n * @returns A Promise that resolves after the specified time.\n *\n * @throws {TypeError} If timeout is not a non-negative number.\n */\nexport async function sleep(timeout: number): Promise<void> {\n assert(\n typeof timeout === 'number' && timeout >= 0 && Number.isFinite(timeout),\n 'Timeout must be a non-negative finite number',\n { args: { timeout }, type: TypeError },\n );\n return new Promise((resolve) => setTimeout(resolve, timeout));\n}\n"],"names":["sleep","timeout","assert","resolve"],"mappings":";AAgBA,eAAsBA,EAAMC,GAAgC;AAC1D,SAAAC;AAAA,IACE,OAAOD,KAAY,YAAYA,KAAW,KAAK,OAAO,SAASA,CAAO;AAAA,IACtE;AAAA,IACA,EAAE,MAAM,EAAE,SAAAA,EAAA,GAAW,MAAM,UAAA;AAAA,EAAU,GAEhC,IAAI,QAAQ,CAACE,MAAY,WAAWA,GAASF,CAAO,CAAC;AAC9D;"}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes