@vielzeug/toolkit 1.0.13 → 1.0.14

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 (82) 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/date/expires.cjs.map +1 -1
  16. package/dist/date/expires.js.map +1 -1
  17. package/dist/date/interval.cjs.map +1 -1
  18. package/dist/date/interval.js.map +1 -1
  19. package/dist/date/timeDiff.cjs.map +1 -1
  20. package/dist/date/timeDiff.js.map +1 -1
  21. package/dist/function/memo.cjs.map +1 -1
  22. package/dist/function/memo.js.map +1 -1
  23. package/dist/function/parallel.cjs +2 -0
  24. package/dist/function/parallel.cjs.map +1 -0
  25. package/dist/function/parallel.js +28 -0
  26. package/dist/function/parallel.js.map +1 -0
  27. package/dist/function/proxy.cjs.map +1 -1
  28. package/dist/function/proxy.js.map +1 -1
  29. package/dist/function/prune.cjs +2 -0
  30. package/dist/function/prune.cjs.map +1 -0
  31. package/dist/function/prune.js +30 -0
  32. package/dist/function/prune.js.map +1 -0
  33. package/dist/index.cjs +1 -1
  34. package/dist/index.d.ts +400 -51
  35. package/dist/index.js +218 -194
  36. package/dist/index.js.map +1 -1
  37. package/dist/math/abs.cjs +2 -0
  38. package/dist/math/abs.cjs.map +1 -0
  39. package/dist/math/abs.js +7 -0
  40. package/dist/math/abs.js.map +1 -0
  41. package/dist/math/add.cjs +2 -0
  42. package/dist/math/add.cjs.map +1 -0
  43. package/dist/math/add.js +9 -0
  44. package/dist/math/add.js.map +1 -0
  45. package/dist/math/allocate.cjs +2 -0
  46. package/dist/math/allocate.cjs.map +1 -0
  47. package/dist/math/allocate.js +29 -0
  48. package/dist/math/allocate.js.map +1 -0
  49. package/dist/math/distribute.cjs +2 -0
  50. package/dist/math/distribute.cjs.map +1 -0
  51. package/dist/math/distribute.js +18 -0
  52. package/dist/math/distribute.js.map +1 -0
  53. package/dist/math/divide.cjs +2 -0
  54. package/dist/math/divide.cjs.map +1 -0
  55. package/dist/math/divide.js +11 -0
  56. package/dist/math/divide.js.map +1 -0
  57. package/dist/math/multiply.cjs +2 -0
  58. package/dist/math/multiply.cjs.map +1 -0
  59. package/dist/math/multiply.js +9 -0
  60. package/dist/math/multiply.js.map +1 -0
  61. package/dist/math/subtract.cjs +2 -0
  62. package/dist/math/subtract.cjs.map +1 -0
  63. package/dist/math/subtract.js +9 -0
  64. package/dist/math/subtract.js.map +1 -0
  65. package/dist/money/currency.cjs +2 -0
  66. package/dist/money/currency.cjs.map +1 -0
  67. package/dist/money/currency.js +49 -0
  68. package/dist/money/currency.js.map +1 -0
  69. package/dist/money/exchange.cjs +2 -0
  70. package/dist/money/exchange.cjs.map +1 -0
  71. package/dist/money/exchange.js +13 -0
  72. package/dist/money/exchange.js.map +1 -0
  73. package/dist/object/merge.cjs.map +1 -1
  74. package/dist/object/merge.js.map +1 -1
  75. package/dist/object/parseJSON.cjs.map +1 -1
  76. package/dist/object/parseJSON.js.map +1 -1
  77. package/dist/object/path.cjs.map +1 -1
  78. package/dist/object/path.js.map +1 -1
  79. package/package.json +1 -1
  80. package/dist/array/sortBy.cjs.map +0 -1
  81. package/dist/array/sortBy.js +0 -6
  82. package/dist/array/sortBy.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"interval.js","sources":["../../src/date/interval.ts"],"sourcesContent":["import { assert } from '../function/assert';\nimport { isDate } from '../typed/isDate';\n\ntype IntervalType = 'D' | 'W' | 'M' | 'MS' | 'ME' | 'Y' | 'YS' | 'YE';\ntype IntervalOptions = {\n interval?: IntervalType;\n steps?: number;\n latest?: boolean;\n};\n\n/**\n * Generates an array of dates between a start and end date, with a specified interval and step size.\n *\n * @example\n * ```ts\n * const options = { interval: 'D', steps: 1, latest: false };\n *\n * interval('2022-01-01', '2022-01-31', options); // Returns an array of dates for every day in January 2022\n * ```\n *\n * @param start - The start date (Date object or ISO string).\n * @param end - The end date (Date object or ISO string).\n * @param options - Options for an interval and steps.\n *\n * @returns An array of generated dates.\n */\nexport function interval(\n start: Date | string,\n end: Date | string,\n { interval = 'D', steps = 1, latest = false }: IntervalOptions = {},\n): Date[] {\n const startDate = new Date(start);\n const endDate = new Date(end);\n\n assert([isDate(startDate), isDate(endDate)], 'Invalid date format. Use a valid Date object or ISO string.', {\n args: { end, start },\n type: TypeError,\n });\n\n const dateArray: Date[] = [];\n let currentDate = new Date(incrementDate(startDate, interval, 0));\n\n while (currentDate <= endDate) {\n dateArray.push(currentDate);\n currentDate = new Date(incrementDate(currentDate, interval, steps));\n }\n\n if (latest && dateArray.length > 0 && dateArray[dateArray.length - 1] < endDate) {\n dateArray.push(endDate);\n }\n\n return dateArray;\n}\n\nfunction incrementDate(date: Date, interval: IntervalType, steps: number): Date {\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n\n switch (interval) {\n case 'D':\n return new Date(Date.UTC(year, month, day + steps));\n case 'W':\n return new Date(Date.UTC(year, month, day + 7 * steps));\n case 'M':\n return new Date(Date.UTC(year, month + steps, day));\n case 'MS':\n return new Date(Date.UTC(year, month + steps, 1));\n case 'ME':\n return new Date(Date.UTC(year, month + steps + 1, 0));\n case 'Y':\n return new Date(Date.UTC(year + steps, month, day));\n case 'YS':\n return new Date(Date.UTC(year + steps, 0, 1));\n case 'YE':\n return new Date(Date.UTC(year + steps, 11, 31));\n }\n}\n"],"names":["interval","start","end","steps","latest","startDate","endDate","assert","isDate","dateArray","currentDate","incrementDate","date","year","month","day"],"mappings":";;AA0BO,SAASA,EACdC,GACAC,GACA,EAAE,UAAAF,IAAW,KAAK,OAAAG,IAAQ,GAAG,QAAAC,IAAS,GAAA,IAA2B,CAAA,GACzD;AACR,QAAMC,IAAY,IAAI,KAAKJ,CAAK,GAC1BK,IAAU,IAAI,KAAKJ,CAAG;AAE5B,EAAAK,EAAO,CAACC,EAAOH,CAAS,GAAGG,EAAOF,CAAO,CAAC,GAAG,+DAA+D;AAAA,IAC1G,MAAM,EAAE,KAAAJ,GAAK,OAAAD,EAAA;AAAA,IACb,MAAM;AAAA,EAAA,CACP;AAED,QAAMQ,IAAoB,CAAA;AAC1B,MAAIC,IAAc,IAAI,KAAKC,EAAcN,GAAWL,GAAU,CAAC,CAAC;AAEhE,SAAOU,KAAeJ;AACpB,IAAAG,EAAU,KAAKC,CAAW,GAC1BA,IAAc,IAAI,KAAKC,EAAcD,GAAaV,GAAUG,CAAK,CAAC;AAGpE,SAAIC,KAAUK,EAAU,SAAS,KAAKA,EAAUA,EAAU,SAAS,CAAC,IAAIH,KACtEG,EAAU,KAAKH,CAAO,GAGjBG;AACT;AAEA,SAASE,EAAcC,GAAYZ,GAAwBG,GAAqB;AAC9E,QAAMU,IAAOD,EAAK,YAAA,GACZE,IAAQF,EAAK,SAAA,GACbG,IAAMH,EAAK,QAAA;AAEjB,UAAQZ,GAAAA;AAAAA,IACN,KAAK;AACH,aAAO,IAAI,KAAK,KAAK,IAAIa,GAAMC,GAAOC,IAAMZ,CAAK,CAAC;AAAA,IACpD,KAAK;AACH,aAAO,IAAI,KAAK,KAAK,IAAIU,GAAMC,GAAOC,IAAM,IAAIZ,CAAK,CAAC;AAAA,IACxD,KAAK;AACH,aAAO,IAAI,KAAK,KAAK,IAAIU,GAAMC,IAAQX,GAAOY,CAAG,CAAC;AAAA,IACpD,KAAK;AACH,aAAO,IAAI,KAAK,KAAK,IAAIF,GAAMC,IAAQX,GAAO,CAAC,CAAC;AAAA,IAClD,KAAK;AACH,aAAO,IAAI,KAAK,KAAK,IAAIU,GAAMC,IAAQX,IAAQ,GAAG,CAAC,CAAC;AAAA,IACtD,KAAK;AACH,aAAO,IAAI,KAAK,KAAK,IAAIU,IAAOV,GAAOW,GAAOC,CAAG,CAAC;AAAA,IACpD,KAAK;AACH,aAAO,IAAI,KAAK,KAAK,IAAIF,IAAOV,GAAO,GAAG,CAAC,CAAC;AAAA,IAC9C,KAAK;AACH,aAAO,IAAI,KAAK,KAAK,IAAIU,IAAOV,GAAO,IAAI,EAAE,CAAC;AAAA,EAAA;AAEpD;"}
1
+ {"version":3,"file":"interval.js","sources":["../../src/date/interval.ts"],"sourcesContent":["import { assert } from '../function/assert';\nimport { isDate } from '../typed/isDate';\n\n// #region IntervalTypes\ntype IntervalType = 'D' | 'W' | 'M' | 'MS' | 'ME' | 'Y' | 'YS' | 'YE';\ntype IntervalOptions = {\n interval?: IntervalType;\n steps?: number;\n latest?: boolean;\n};\n// #endregion IntervalTypes\n\n/**\n * Generates an array of dates between a start and end date, with a specified interval and step size.\n *\n * @example\n * ```ts\n * const options = { interval: 'D', steps: 1, latest: false };\n *\n * interval('2022-01-01', '2022-01-31', options); // Returns an array of dates for every day in January 2022\n * ```\n *\n * @param start - The start date (Date object or ISO string).\n * @param end - The end date (Date object or ISO string).\n * @param options - Options for an interval and steps.\n *\n * @returns An array of generated dates.\n */\nexport function interval(\n start: Date | string,\n end: Date | string,\n { interval = 'D', steps = 1, latest = false }: IntervalOptions = {},\n): Date[] {\n const startDate = new Date(start);\n const endDate = new Date(end);\n\n assert([isDate(startDate), isDate(endDate)], 'Invalid date format. Use a valid Date object or ISO string.', {\n args: { end, start },\n type: TypeError,\n });\n\n const dateArray: Date[] = [];\n let currentDate = new Date(incrementDate(startDate, interval, 0));\n\n while (currentDate <= endDate) {\n dateArray.push(currentDate);\n currentDate = new Date(incrementDate(currentDate, interval, steps));\n }\n\n if (latest && dateArray.length > 0 && dateArray[dateArray.length - 1] < endDate) {\n dateArray.push(endDate);\n }\n\n return dateArray;\n}\n\nfunction incrementDate(date: Date, interval: IntervalType, steps: number): Date {\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n\n switch (interval) {\n case 'D':\n return new Date(Date.UTC(year, month, day + steps));\n case 'W':\n return new Date(Date.UTC(year, month, day + 7 * steps));\n case 'M':\n return new Date(Date.UTC(year, month + steps, day));\n case 'MS':\n return new Date(Date.UTC(year, month + steps, 1));\n case 'ME':\n return new Date(Date.UTC(year, month + steps + 1, 0));\n case 'Y':\n return new Date(Date.UTC(year + steps, month, day));\n case 'YS':\n return new Date(Date.UTC(year + steps, 0, 1));\n case 'YE':\n return new Date(Date.UTC(year + steps, 11, 31));\n }\n}\n"],"names":["interval","start","end","steps","latest","startDate","endDate","assert","isDate","dateArray","currentDate","incrementDate","date","year","month","day"],"mappings":";;AA4BO,SAASA,EACdC,GACAC,GACA,EAAE,UAAAF,IAAW,KAAK,OAAAG,IAAQ,GAAG,QAAAC,IAAS,GAAA,IAA2B,CAAA,GACzD;AACR,QAAMC,IAAY,IAAI,KAAKJ,CAAK,GAC1BK,IAAU,IAAI,KAAKJ,CAAG;AAE5B,EAAAK,EAAO,CAACC,EAAOH,CAAS,GAAGG,EAAOF,CAAO,CAAC,GAAG,+DAA+D;AAAA,IAC1G,MAAM,EAAE,KAAAJ,GAAK,OAAAD,EAAA;AAAA,IACb,MAAM;AAAA,EAAA,CACP;AAED,QAAMQ,IAAoB,CAAA;AAC1B,MAAIC,IAAc,IAAI,KAAKC,EAAcN,GAAWL,GAAU,CAAC,CAAC;AAEhE,SAAOU,KAAeJ;AACpB,IAAAG,EAAU,KAAKC,CAAW,GAC1BA,IAAc,IAAI,KAAKC,EAAcD,GAAaV,GAAUG,CAAK,CAAC;AAGpE,SAAIC,KAAUK,EAAU,SAAS,KAAKA,EAAUA,EAAU,SAAS,CAAC,IAAIH,KACtEG,EAAU,KAAKH,CAAO,GAGjBG;AACT;AAEA,SAASE,EAAcC,GAAYZ,GAAwBG,GAAqB;AAC9E,QAAMU,IAAOD,EAAK,YAAA,GACZE,IAAQF,EAAK,SAAA,GACbG,IAAMH,EAAK,QAAA;AAEjB,UAAQZ,GAAAA;AAAAA,IACN,KAAK;AACH,aAAO,IAAI,KAAK,KAAK,IAAIa,GAAMC,GAAOC,IAAMZ,CAAK,CAAC;AAAA,IACpD,KAAK;AACH,aAAO,IAAI,KAAK,KAAK,IAAIU,GAAMC,GAAOC,IAAM,IAAIZ,CAAK,CAAC;AAAA,IACxD,KAAK;AACH,aAAO,IAAI,KAAK,KAAK,IAAIU,GAAMC,IAAQX,GAAOY,CAAG,CAAC;AAAA,IACpD,KAAK;AACH,aAAO,IAAI,KAAK,KAAK,IAAIF,GAAMC,IAAQX,GAAO,CAAC,CAAC;AAAA,IAClD,KAAK;AACH,aAAO,IAAI,KAAK,KAAK,IAAIU,GAAMC,IAAQX,IAAQ,GAAG,CAAC,CAAC;AAAA,IACtD,KAAK;AACH,aAAO,IAAI,KAAK,KAAK,IAAIU,IAAOV,GAAOW,GAAOC,CAAG,CAAC;AAAA,IACpD,KAAK;AACH,aAAO,IAAI,KAAK,KAAK,IAAIF,IAAOV,GAAO,GAAG,CAAC,CAAC;AAAA,IAC9C,KAAK;AACH,aAAO,IAAI,KAAK,KAAK,IAAIU,IAAOV,GAAO,IAAI,EAAE,CAAC;AAAA,EAAA;AAEpD;"}
@@ -1 +1 @@
1
- {"version":3,"file":"timeDiff.cjs","sources":["../../src/date/timeDiff.ts"],"sourcesContent":["export type TimeUnit = 'YEAR' | 'MONTH' | 'WEEK' | 'DAY' | 'HOUR' | 'MINUTE' | 'SECOND' | 'INVALID_DATE';\nexport type TimeDirection = 'FUTURE' | 'PAST';\nexport type TimeResult = { unit: TimeUnit; value: number };\n\nlet defaultUnits: TimeUnit[] = ['YEAR', 'MONTH', 'WEEK', 'DAY', 'HOUR', 'MINUTE', 'SECOND'];\n\nconst MS_PER_SECOND = 1000;\nconst MS_PER_MINUTE = 60 * MS_PER_SECOND;\nconst MS_PER_HOUR = 60 * MS_PER_MINUTE;\nconst MS_PER_DAY = 24 * MS_PER_HOUR;\nconst MS_PER_WEEK = 7 * MS_PER_DAY;\nconst MS_PER_MONTH = 30 * MS_PER_DAY;\nconst MS_PER_YEAR = 365 * MS_PER_DAY;\n\nconst TIME_UNITS = [\n { ms: MS_PER_YEAR, unit: 'YEAR' as const },\n { ms: MS_PER_MONTH, unit: 'MONTH' as const },\n { ms: MS_PER_WEEK, unit: 'WEEK' as const },\n { ms: MS_PER_DAY, unit: 'DAY' as const },\n { ms: MS_PER_HOUR, unit: 'HOUR' as const },\n { ms: MS_PER_MINUTE, unit: 'MINUTE' as const },\n { ms: MS_PER_SECOND, unit: 'SECOND' as const },\n];\n\n/**\n * Calculates the remaining time until a target date.\n *\n * @example\n * ```ts\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 5)); // { value: 5, unit: 'DAY' }\n * timeDiff(new Date(Date.now() - 1000 * 60 * 60 * 24 * 3), 'past'); // { value: 3, unit: 'DAY' }\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 31)); // { value: 1, unit: 'MONTH' }\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 365)); // { value: 1, unit: 'YEAR' }\n * ```\n *\n * @param a - The target date (Date object or ISO string).\n * @param b - The target date (Date object or ISO string).\n * @param allowedUnits - (optional) array of units to filter the result. If provided, only these units will be considered.\n *\n * @returns An object containing the remaining time and its unit ('DAY', 'HOUR', or 'MINUTE').\n */\nexport function timeDiff(\n a: Date | string,\n b: Date | string = new Date(),\n allowedUnits: TimeUnit[] = defaultUnits,\n): TimeResult {\n const aDate = typeof a === 'string' ? Date.parse(a) : a.getTime();\n const bDate = typeof b === 'string' ? Date.parse(b) : b.getTime();\n\n if (Number.isNaN(aDate) || Number.isNaN(bDate)) {\n return { unit: 'INVALID_DATE', value: 0 };\n }\n\n const units = TIME_UNITS.filter((u) => allowedUnits.includes(u.unit));\n const diff = Math.abs(aDate - bDate);\n const smallestUnit = units[units.length - 1]?.unit ?? 'SECOND';\n\n if (diff <= 0) {\n return { unit: smallestUnit, value: 0 };\n }\n\n // Find the largest unit that fits\n const bestUnit = units.find((u) => diff >= u.ms);\n\n if (bestUnit) {\n return { unit: bestUnit.unit, value: Math.floor(diff / bestUnit.ms) };\n }\n\n return { unit: smallestUnit, value: 0 };\n}\n\ntimeDiff.defaultUnits = (units: TimeUnit[]) => {\n defaultUnits = units;\n};\n"],"names":["defaultUnits","MS_PER_SECOND","MS_PER_MINUTE","MS_PER_HOUR","MS_PER_DAY","MS_PER_WEEK","MS_PER_MONTH","MS_PER_YEAR","TIME_UNITS","timeDiff","a","b","allowedUnits","aDate","bDate","units","u","diff","smallestUnit","bestUnit"],"mappings":"gFAIA,IAAIA,EAA2B,CAAC,OAAQ,QAAS,OAAQ,MAAO,OAAQ,SAAU,QAAQ,EAE1F,MAAMC,EAAgB,IAChBC,EAAgB,GAAKD,EACrBE,EAAc,GAAKD,EACnBE,EAAa,GAAKD,EAClBE,EAAc,EAAID,EAClBE,EAAe,GAAKF,EACpBG,EAAc,IAAMH,EAEpBI,EAAa,CACjB,CAAE,GAAID,EAAa,KAAM,MAAA,EACzB,CAAE,GAAID,EAAc,KAAM,OAAA,EAC1B,CAAE,GAAID,EAAa,KAAM,MAAA,EACzB,CAAE,GAAID,EAAY,KAAM,KAAA,EACxB,CAAE,GAAID,EAAa,KAAM,MAAA,EACzB,CAAE,GAAID,EAAe,KAAM,QAAA,EAC3B,CAAE,GAAID,EAAe,KAAM,QAAA,CAC7B,EAmBO,SAASQ,EACdC,EACAC,MAAuB,KACvBC,EAA2BZ,EACf,CACZ,MAAMa,EAAQ,OAAOH,GAAM,SAAW,KAAK,MAAMA,CAAC,EAAIA,EAAE,QAAA,EAClDI,EAAQ,OAAOH,GAAM,SAAW,KAAK,MAAMA,CAAC,EAAIA,EAAE,QAAA,EAExD,GAAI,OAAO,MAAME,CAAK,GAAK,OAAO,MAAMC,CAAK,EAC3C,MAAO,CAAE,KAAM,eAAgB,MAAO,CAAA,EAGxC,MAAMC,EAAQP,EAAW,OAAQQ,GAAMJ,EAAa,SAASI,EAAE,IAAI,CAAC,EAC9DC,EAAO,KAAK,IAAIJ,EAAQC,CAAK,EAC7BI,EAAeH,EAAMA,EAAM,OAAS,CAAC,GAAG,MAAQ,SAEtD,GAAIE,GAAQ,EACV,MAAO,CAAE,KAAMC,EAAc,MAAO,CAAA,EAItC,MAAMC,EAAWJ,EAAM,KAAMC,GAAMC,GAAQD,EAAE,EAAE,EAE/C,OAAIG,EACK,CAAE,KAAMA,EAAS,KAAM,MAAO,KAAK,MAAMF,EAAOE,EAAS,EAAE,CAAA,EAG7D,CAAE,KAAMD,EAAc,MAAO,CAAA,CACtC,CAEAT,EAAS,aAAgBM,GAAsB,CAC7Cf,EAAee,CACjB"}
1
+ {"version":3,"file":"timeDiff.cjs","sources":["../../src/date/timeDiff.ts"],"sourcesContent":["// #region TimeDiffTypes\nexport type TimeUnit = 'YEAR' | 'MONTH' | 'WEEK' | 'DAY' | 'HOUR' | 'MINUTE' | 'SECOND' | 'INVALID_DATE';\nexport type TimeDirection = 'FUTURE' | 'PAST';\nexport type TimeResult = { unit: TimeUnit; value: number };\n// #endregion TimeDiffTypes\n\nlet defaultUnits: TimeUnit[] = ['YEAR', 'MONTH', 'WEEK', 'DAY', 'HOUR', 'MINUTE', 'SECOND'];\n\nconst MS_PER_SECOND = 1000;\nconst MS_PER_MINUTE = 60 * MS_PER_SECOND;\nconst MS_PER_HOUR = 60 * MS_PER_MINUTE;\nconst MS_PER_DAY = 24 * MS_PER_HOUR;\nconst MS_PER_WEEK = 7 * MS_PER_DAY;\nconst MS_PER_MONTH = 30 * MS_PER_DAY;\nconst MS_PER_YEAR = 365 * MS_PER_DAY;\n\nconst TIME_UNITS = [\n { ms: MS_PER_YEAR, unit: 'YEAR' as const },\n { ms: MS_PER_MONTH, unit: 'MONTH' as const },\n { ms: MS_PER_WEEK, unit: 'WEEK' as const },\n { ms: MS_PER_DAY, unit: 'DAY' as const },\n { ms: MS_PER_HOUR, unit: 'HOUR' as const },\n { ms: MS_PER_MINUTE, unit: 'MINUTE' as const },\n { ms: MS_PER_SECOND, unit: 'SECOND' as const },\n];\n\n/**\n * Calculates the remaining time until a target date.\n *\n * @example\n * ```ts\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 5)); // { value: 5, unit: 'DAY' }\n * timeDiff(new Date(Date.now() - 1000 * 60 * 60 * 24 * 3), 'past'); // { value: 3, unit: 'DAY' }\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 31)); // { value: 1, unit: 'MONTH' }\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 365)); // { value: 1, unit: 'YEAR' }\n * ```\n *\n * @param a - The target date (Date object or ISO string).\n * @param b - The target date (Date object or ISO string).\n * @param allowedUnits - (optional) array of units to filter the result. If provided, only these units will be considered.\n *\n * @returns An object containing the remaining time and its unit ('DAY', 'HOUR', or 'MINUTE').\n */\nexport function timeDiff(\n a: Date | string,\n b: Date | string = new Date(),\n allowedUnits: TimeUnit[] = defaultUnits,\n): TimeResult {\n const aDate = typeof a === 'string' ? Date.parse(a) : a.getTime();\n const bDate = typeof b === 'string' ? Date.parse(b) : b.getTime();\n\n if (Number.isNaN(aDate) || Number.isNaN(bDate)) {\n return { unit: 'INVALID_DATE', value: 0 };\n }\n\n const units = TIME_UNITS.filter((u) => allowedUnits.includes(u.unit));\n const diff = Math.abs(aDate - bDate);\n const smallestUnit = units[units.length - 1]?.unit ?? 'SECOND';\n\n if (diff <= 0) {\n return { unit: smallestUnit, value: 0 };\n }\n\n // Find the largest unit that fits\n const bestUnit = units.find((u) => diff >= u.ms);\n\n if (bestUnit) {\n return { unit: bestUnit.unit, value: Math.floor(diff / bestUnit.ms) };\n }\n\n return { unit: smallestUnit, value: 0 };\n}\n\ntimeDiff.defaultUnits = (units: TimeUnit[]) => {\n defaultUnits = units;\n};\n"],"names":["defaultUnits","MS_PER_SECOND","MS_PER_MINUTE","MS_PER_HOUR","MS_PER_DAY","MS_PER_WEEK","MS_PER_MONTH","MS_PER_YEAR","TIME_UNITS","timeDiff","a","b","allowedUnits","aDate","bDate","units","u","diff","smallestUnit","bestUnit"],"mappings":"gFAMA,IAAIA,EAA2B,CAAC,OAAQ,QAAS,OAAQ,MAAO,OAAQ,SAAU,QAAQ,EAE1F,MAAMC,EAAgB,IAChBC,EAAgB,GAAKD,EACrBE,EAAc,GAAKD,EACnBE,EAAa,GAAKD,EAClBE,EAAc,EAAID,EAClBE,EAAe,GAAKF,EACpBG,EAAc,IAAMH,EAEpBI,EAAa,CACjB,CAAE,GAAID,EAAa,KAAM,MAAA,EACzB,CAAE,GAAID,EAAc,KAAM,OAAA,EAC1B,CAAE,GAAID,EAAa,KAAM,MAAA,EACzB,CAAE,GAAID,EAAY,KAAM,KAAA,EACxB,CAAE,GAAID,EAAa,KAAM,MAAA,EACzB,CAAE,GAAID,EAAe,KAAM,QAAA,EAC3B,CAAE,GAAID,EAAe,KAAM,QAAA,CAC7B,EAmBO,SAASQ,EACdC,EACAC,MAAuB,KACvBC,EAA2BZ,EACf,CACZ,MAAMa,EAAQ,OAAOH,GAAM,SAAW,KAAK,MAAMA,CAAC,EAAIA,EAAE,QAAA,EAClDI,EAAQ,OAAOH,GAAM,SAAW,KAAK,MAAMA,CAAC,EAAIA,EAAE,QAAA,EAExD,GAAI,OAAO,MAAME,CAAK,GAAK,OAAO,MAAMC,CAAK,EAC3C,MAAO,CAAE,KAAM,eAAgB,MAAO,CAAA,EAGxC,MAAMC,EAAQP,EAAW,OAAQQ,GAAMJ,EAAa,SAASI,EAAE,IAAI,CAAC,EAC9DC,EAAO,KAAK,IAAIJ,EAAQC,CAAK,EAC7BI,EAAeH,EAAMA,EAAM,OAAS,CAAC,GAAG,MAAQ,SAEtD,GAAIE,GAAQ,EACV,MAAO,CAAE,KAAMC,EAAc,MAAO,CAAA,EAItC,MAAMC,EAAWJ,EAAM,KAAMC,GAAMC,GAAQD,EAAE,EAAE,EAE/C,OAAIG,EACK,CAAE,KAAMA,EAAS,KAAM,MAAO,KAAK,MAAMF,EAAOE,EAAS,EAAE,CAAA,EAG7D,CAAE,KAAMD,EAAc,MAAO,CAAA,CACtC,CAEAT,EAAS,aAAgBM,GAAsB,CAC7Cf,EAAee,CACjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"timeDiff.js","sources":["../../src/date/timeDiff.ts"],"sourcesContent":["export type TimeUnit = 'YEAR' | 'MONTH' | 'WEEK' | 'DAY' | 'HOUR' | 'MINUTE' | 'SECOND' | 'INVALID_DATE';\nexport type TimeDirection = 'FUTURE' | 'PAST';\nexport type TimeResult = { unit: TimeUnit; value: number };\n\nlet defaultUnits: TimeUnit[] = ['YEAR', 'MONTH', 'WEEK', 'DAY', 'HOUR', 'MINUTE', 'SECOND'];\n\nconst MS_PER_SECOND = 1000;\nconst MS_PER_MINUTE = 60 * MS_PER_SECOND;\nconst MS_PER_HOUR = 60 * MS_PER_MINUTE;\nconst MS_PER_DAY = 24 * MS_PER_HOUR;\nconst MS_PER_WEEK = 7 * MS_PER_DAY;\nconst MS_PER_MONTH = 30 * MS_PER_DAY;\nconst MS_PER_YEAR = 365 * MS_PER_DAY;\n\nconst TIME_UNITS = [\n { ms: MS_PER_YEAR, unit: 'YEAR' as const },\n { ms: MS_PER_MONTH, unit: 'MONTH' as const },\n { ms: MS_PER_WEEK, unit: 'WEEK' as const },\n { ms: MS_PER_DAY, unit: 'DAY' as const },\n { ms: MS_PER_HOUR, unit: 'HOUR' as const },\n { ms: MS_PER_MINUTE, unit: 'MINUTE' as const },\n { ms: MS_PER_SECOND, unit: 'SECOND' as const },\n];\n\n/**\n * Calculates the remaining time until a target date.\n *\n * @example\n * ```ts\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 5)); // { value: 5, unit: 'DAY' }\n * timeDiff(new Date(Date.now() - 1000 * 60 * 60 * 24 * 3), 'past'); // { value: 3, unit: 'DAY' }\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 31)); // { value: 1, unit: 'MONTH' }\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 365)); // { value: 1, unit: 'YEAR' }\n * ```\n *\n * @param a - The target date (Date object or ISO string).\n * @param b - The target date (Date object or ISO string).\n * @param allowedUnits - (optional) array of units to filter the result. If provided, only these units will be considered.\n *\n * @returns An object containing the remaining time and its unit ('DAY', 'HOUR', or 'MINUTE').\n */\nexport function timeDiff(\n a: Date | string,\n b: Date | string = new Date(),\n allowedUnits: TimeUnit[] = defaultUnits,\n): TimeResult {\n const aDate = typeof a === 'string' ? Date.parse(a) : a.getTime();\n const bDate = typeof b === 'string' ? Date.parse(b) : b.getTime();\n\n if (Number.isNaN(aDate) || Number.isNaN(bDate)) {\n return { unit: 'INVALID_DATE', value: 0 };\n }\n\n const units = TIME_UNITS.filter((u) => allowedUnits.includes(u.unit));\n const diff = Math.abs(aDate - bDate);\n const smallestUnit = units[units.length - 1]?.unit ?? 'SECOND';\n\n if (diff <= 0) {\n return { unit: smallestUnit, value: 0 };\n }\n\n // Find the largest unit that fits\n const bestUnit = units.find((u) => diff >= u.ms);\n\n if (bestUnit) {\n return { unit: bestUnit.unit, value: Math.floor(diff / bestUnit.ms) };\n }\n\n return { unit: smallestUnit, value: 0 };\n}\n\ntimeDiff.defaultUnits = (units: TimeUnit[]) => {\n defaultUnits = units;\n};\n"],"names":["defaultUnits","TIME_UNITS","timeDiff","a","b","allowedUnits","aDate","bDate","units","u","diff","smallestUnit","bestUnit"],"mappings":"AAIA,IAAIA,IAA2B,CAAC,QAAQ,SAAS,QAAQ,OAAO,QAAQ,UAAU,QAAQ;AAU1F,MAAMC,IAAa;AAAA,EACjB,EAAE,IAAI,SAAa,MAAM,OAAA;AAAA,EACzB,EAAE,IAAI,QAAc,MAAM,QAAA;AAAA,EAC1B,EAAE,IAAI,QAAa,MAAM,OAAA;AAAA,EACzB,EAAE,IAAI,OAAY,MAAM,MAAA;AAAA,EACxB,EAAE,IAAI,MAAa,MAAM,OAAA;AAAA,EACzB,EAAE,IAAI,KAAe,MAAM,SAAA;AAAA,EAC3B,EAAE,IAAI,KAAe,MAAM,SAAA;AAC7B;AAmBO,SAASC,EACdC,GACAC,wBAAuB,KAAA,GACvBC,IAA2BL,GACf;AACZ,QAAMM,IAAQ,OAAOH,KAAM,WAAW,KAAK,MAAMA,CAAC,IAAIA,EAAE,QAAA,GAClDI,IAAQ,OAAOH,KAAM,WAAW,KAAK,MAAMA,CAAC,IAAIA,EAAE,QAAA;AAExD,MAAI,OAAO,MAAME,CAAK,KAAK,OAAO,MAAMC,CAAK;AAC3C,WAAO,EAAE,MAAM,gBAAgB,OAAO,EAAA;AAGxC,QAAMC,IAAQP,EAAW,OAAO,CAACQ,MAAMJ,EAAa,SAASI,EAAE,IAAI,CAAC,GAC9DC,IAAO,KAAK,IAAIJ,IAAQC,CAAK,GAC7BI,IAAeH,EAAMA,EAAM,SAAS,CAAC,GAAG,QAAQ;AAEtD,MAAIE,KAAQ;AACV,WAAO,EAAE,MAAMC,GAAc,OAAO,EAAA;AAItC,QAAMC,IAAWJ,EAAM,KAAK,CAACC,MAAMC,KAAQD,EAAE,EAAE;AAE/C,SAAIG,IACK,EAAE,MAAMA,EAAS,MAAM,OAAO,KAAK,MAAMF,IAAOE,EAAS,EAAE,EAAA,IAG7D,EAAE,MAAMD,GAAc,OAAO,EAAA;AACtC;AAEAT,EAAS,eAAe,CAACM,MAAsB;AAC7C,EAAAR,IAAeQ;AACjB;"}
1
+ {"version":3,"file":"timeDiff.js","sources":["../../src/date/timeDiff.ts"],"sourcesContent":["// #region TimeDiffTypes\nexport type TimeUnit = 'YEAR' | 'MONTH' | 'WEEK' | 'DAY' | 'HOUR' | 'MINUTE' | 'SECOND' | 'INVALID_DATE';\nexport type TimeDirection = 'FUTURE' | 'PAST';\nexport type TimeResult = { unit: TimeUnit; value: number };\n// #endregion TimeDiffTypes\n\nlet defaultUnits: TimeUnit[] = ['YEAR', 'MONTH', 'WEEK', 'DAY', 'HOUR', 'MINUTE', 'SECOND'];\n\nconst MS_PER_SECOND = 1000;\nconst MS_PER_MINUTE = 60 * MS_PER_SECOND;\nconst MS_PER_HOUR = 60 * MS_PER_MINUTE;\nconst MS_PER_DAY = 24 * MS_PER_HOUR;\nconst MS_PER_WEEK = 7 * MS_PER_DAY;\nconst MS_PER_MONTH = 30 * MS_PER_DAY;\nconst MS_PER_YEAR = 365 * MS_PER_DAY;\n\nconst TIME_UNITS = [\n { ms: MS_PER_YEAR, unit: 'YEAR' as const },\n { ms: MS_PER_MONTH, unit: 'MONTH' as const },\n { ms: MS_PER_WEEK, unit: 'WEEK' as const },\n { ms: MS_PER_DAY, unit: 'DAY' as const },\n { ms: MS_PER_HOUR, unit: 'HOUR' as const },\n { ms: MS_PER_MINUTE, unit: 'MINUTE' as const },\n { ms: MS_PER_SECOND, unit: 'SECOND' as const },\n];\n\n/**\n * Calculates the remaining time until a target date.\n *\n * @example\n * ```ts\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 5)); // { value: 5, unit: 'DAY' }\n * timeDiff(new Date(Date.now() - 1000 * 60 * 60 * 24 * 3), 'past'); // { value: 3, unit: 'DAY' }\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 31)); // { value: 1, unit: 'MONTH' }\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 365)); // { value: 1, unit: 'YEAR' }\n * ```\n *\n * @param a - The target date (Date object or ISO string).\n * @param b - The target date (Date object or ISO string).\n * @param allowedUnits - (optional) array of units to filter the result. If provided, only these units will be considered.\n *\n * @returns An object containing the remaining time and its unit ('DAY', 'HOUR', or 'MINUTE').\n */\nexport function timeDiff(\n a: Date | string,\n b: Date | string = new Date(),\n allowedUnits: TimeUnit[] = defaultUnits,\n): TimeResult {\n const aDate = typeof a === 'string' ? Date.parse(a) : a.getTime();\n const bDate = typeof b === 'string' ? Date.parse(b) : b.getTime();\n\n if (Number.isNaN(aDate) || Number.isNaN(bDate)) {\n return { unit: 'INVALID_DATE', value: 0 };\n }\n\n const units = TIME_UNITS.filter((u) => allowedUnits.includes(u.unit));\n const diff = Math.abs(aDate - bDate);\n const smallestUnit = units[units.length - 1]?.unit ?? 'SECOND';\n\n if (diff <= 0) {\n return { unit: smallestUnit, value: 0 };\n }\n\n // Find the largest unit that fits\n const bestUnit = units.find((u) => diff >= u.ms);\n\n if (bestUnit) {\n return { unit: bestUnit.unit, value: Math.floor(diff / bestUnit.ms) };\n }\n\n return { unit: smallestUnit, value: 0 };\n}\n\ntimeDiff.defaultUnits = (units: TimeUnit[]) => {\n defaultUnits = units;\n};\n"],"names":["defaultUnits","TIME_UNITS","timeDiff","a","b","allowedUnits","aDate","bDate","units","u","diff","smallestUnit","bestUnit"],"mappings":"AAMA,IAAIA,IAA2B,CAAC,QAAQ,SAAS,QAAQ,OAAO,QAAQ,UAAU,QAAQ;AAU1F,MAAMC,IAAa;AAAA,EACjB,EAAE,IAAI,SAAa,MAAM,OAAA;AAAA,EACzB,EAAE,IAAI,QAAc,MAAM,QAAA;AAAA,EAC1B,EAAE,IAAI,QAAa,MAAM,OAAA;AAAA,EACzB,EAAE,IAAI,OAAY,MAAM,MAAA;AAAA,EACxB,EAAE,IAAI,MAAa,MAAM,OAAA;AAAA,EACzB,EAAE,IAAI,KAAe,MAAM,SAAA;AAAA,EAC3B,EAAE,IAAI,KAAe,MAAM,SAAA;AAC7B;AAmBO,SAASC,EACdC,GACAC,wBAAuB,KAAA,GACvBC,IAA2BL,GACf;AACZ,QAAMM,IAAQ,OAAOH,KAAM,WAAW,KAAK,MAAMA,CAAC,IAAIA,EAAE,QAAA,GAClDI,IAAQ,OAAOH,KAAM,WAAW,KAAK,MAAMA,CAAC,IAAIA,EAAE,QAAA;AAExD,MAAI,OAAO,MAAME,CAAK,KAAK,OAAO,MAAMC,CAAK;AAC3C,WAAO,EAAE,MAAM,gBAAgB,OAAO,EAAA;AAGxC,QAAMC,IAAQP,EAAW,OAAO,CAACQ,MAAMJ,EAAa,SAASI,EAAE,IAAI,CAAC,GAC9DC,IAAO,KAAK,IAAIJ,IAAQC,CAAK,GAC7BI,IAAeH,EAAMA,EAAM,SAAS,CAAC,GAAG,QAAQ;AAEtD,MAAIE,KAAQ;AACV,WAAO,EAAE,MAAMC,GAAc,OAAO,EAAA;AAItC,QAAMC,IAAWJ,EAAM,KAAK,CAACC,MAAMC,KAAQD,EAAE,EAAE;AAE/C,SAAIG,IACK,EAAE,MAAMA,EAAS,MAAM,OAAO,KAAK,MAAMF,IAAOE,EAAS,EAAE,EAAA,IAG7D,EAAE,MAAMD,GAAc,OAAO,EAAA;AACtC;AAEAT,EAAS,eAAe,CAACM,MAAsB;AAC7C,EAAAR,IAAeQ;AACjB;"}
@@ -1 +1 @@
1
- {"version":3,"file":"memo.cjs","sources":["../../src/function/memo.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: - */\nimport type { Fn } from '../types';\n\ntype MemoizeOptions<T extends Fn> = {\n ttl?: number; // Time-to-live in milliseconds\n maxSize?: number; // Maximum number of items in cache\n resolver?: (...args: Parameters<T>) => string; // Custom key generator\n};\n\ntype CacheEntry<T extends Fn> = {\n value: ReturnType<T>;\n timestamp: number;\n};\n\n/**\n * Creates a function that memorizes the result of the provided function.\n * Supports expiration (TTL) and limited cache size (LRU).\n *\n * @example\n * ```ts\n * const add = (x, y) => x + y;\n * const memoizedAdd = memo(add, { ttl: 5000, maxSize: 10 });\n *\n * memoizedAdd(1, 2); // 3 (caches the result)\n * memoizedAdd(1, 2); // 3 (from cache)\n * ```\n *\n * @param fn - The function to memorize.\n * @param options - Memoization options.\n * @param [options.ttl] - (optional) time-to-live (TTL) for cache expiration (in milliseconds).\n * @param [options.maxSize] - (optional) maximum cache size (LRU eviction).\n * @param [options.resolver] - (optional) custom function to resolve the cache key.\n *\n * @returns A new function that memorizes the input function.\n */\nexport function memo<T extends Fn>(\n fn: T,\n { ttl, maxSize, resolver }: MemoizeOptions<T> = {},\n): (...args: Parameters<T>) => ReturnType<T> {\n const cache = new Map<string, CacheEntry<T>>();\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: -\n const keyGen = (args: Parameters<T>): string => {\n if (resolver) return resolver(...args);\n if (args.length === 0) return '__empty__';\n if (args.length === 1) {\n const arg = args[0];\n const argType = typeof arg;\n if (argType === 'string' || argType === 'number' || argType === 'boolean') {\n return `${argType}:${arg}`;\n }\n if (arg === null) return 'null';\n if (arg === undefined) return 'undefined';\n }\n return JSON.stringify(args);\n };\n\n return (...args: Parameters<T>): ReturnType<T> => {\n const key = keyGen(args);\n const now = Date.now();\n const cached = cache.get(key);\n\n if (cached && (!ttl || now - cached.timestamp < ttl)) {\n cache.delete(key);\n cache.set(key, cached); // Move to end (most recently used)\n return cached.value;\n }\n\n const result = fn(...args);\n cache.set(key, { timestamp: now, value: result });\n\n if (maxSize && cache.size > maxSize) {\n cache.delete(cache.keys().next().value!); // Remove least recently used\n }\n\n return result;\n };\n}\n"],"names":["memo","fn","ttl","maxSize","resolver","cache","keyGen","args","arg","argType","key","now","cached","result"],"mappings":"gFAmCO,SAASA,EACdC,EACA,CAAE,IAAAC,EAAK,QAAAC,EAAS,SAAAC,CAAA,EAAgC,GACL,CAC3C,MAAMC,MAAY,IAGZC,EAAUC,GAAgC,CAC9C,GAAIH,EAAU,OAAOA,EAAS,GAAGG,CAAI,EACrC,GAAIA,EAAK,SAAW,EAAG,MAAO,YAC9B,GAAIA,EAAK,SAAW,EAAG,CACrB,MAAMC,EAAMD,EAAK,CAAC,EACZE,EAAU,OAAOD,EACvB,GAAIC,IAAY,UAAYA,IAAY,UAAYA,IAAY,UAC9D,MAAO,GAAGA,CAAO,IAAID,CAAG,GAE1B,GAAIA,IAAQ,KAAM,MAAO,OACzB,GAAIA,IAAQ,OAAW,MAAO,WAChC,CACA,OAAO,KAAK,UAAUD,CAAI,CAC5B,EAEA,MAAO,IAAIA,IAAuC,CAChD,MAAMG,EAAMJ,EAAOC,CAAI,EACjBI,EAAM,KAAK,IAAA,EACXC,EAASP,EAAM,IAAIK,CAAG,EAE5B,GAAIE,IAAW,CAACV,GAAOS,EAAMC,EAAO,UAAYV,GAC9C,OAAAG,EAAM,OAAOK,CAAG,EAChBL,EAAM,IAAIK,EAAKE,CAAM,EACdA,EAAO,MAGhB,MAAMC,EAASZ,EAAG,GAAGM,CAAI,EACzB,OAAAF,EAAM,IAAIK,EAAK,CAAE,UAAWC,EAAK,MAAOE,EAAQ,EAE5CV,GAAWE,EAAM,KAAOF,GAC1BE,EAAM,OAAOA,EAAM,KAAA,EAAO,KAAA,EAAO,KAAM,EAGlCQ,CACT,CACF"}
1
+ {"version":3,"file":"memo.cjs","sources":["../../src/function/memo.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: - */\nimport type { Fn } from '../types';\n\n// #region MemoizeOptions\ntype MemoizeOptions<T extends Fn> = {\n ttl?: number; // Time-to-live in milliseconds\n maxSize?: number; // Maximum number of items in cache\n resolver?: (...args: Parameters<T>) => string; // Custom key generator\n};\n// #endregion MemoizeOptions\n\ntype CacheEntry<T extends Fn> = {\n value: ReturnType<T>;\n timestamp: number;\n};\n\n/**\n * Creates a function that memorizes the result of the provided function.\n * Supports expiration (TTL) and limited cache size (LRU).\n *\n * @example\n * ```ts\n * const add = (x, y) => x + y;\n * const memoizedAdd = memo(add, { ttl: 5000, maxSize: 10 });\n *\n * memoizedAdd(1, 2); // 3 (caches the result)\n * memoizedAdd(1, 2); // 3 (from cache)\n * ```\n *\n * @param fn - The function to memorize.\n * @param options - Memoization options.\n * @param [options.ttl] - (optional) time-to-live (TTL) for cache expiration (in milliseconds).\n * @param [options.maxSize] - (optional) maximum cache size (LRU eviction).\n * @param [options.resolver] - (optional) custom function to resolve the cache key.\n *\n * @returns A new function that memorizes the input function.\n */\nexport function memo<T extends Fn>(\n fn: T,\n { ttl, maxSize, resolver }: MemoizeOptions<T> = {},\n): (...args: Parameters<T>) => ReturnType<T> {\n const cache = new Map<string, CacheEntry<T>>();\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: -\n const keyGen = (args: Parameters<T>): string => {\n if (resolver) return resolver(...args);\n if (args.length === 0) return '__empty__';\n if (args.length === 1) {\n const arg = args[0];\n const argType = typeof arg;\n if (argType === 'string' || argType === 'number' || argType === 'boolean') {\n return `${argType}:${arg}`;\n }\n if (arg === null) return 'null';\n if (arg === undefined) return 'undefined';\n }\n return JSON.stringify(args);\n };\n\n return (...args: Parameters<T>): ReturnType<T> => {\n const key = keyGen(args);\n const now = Date.now();\n const cached = cache.get(key);\n\n if (cached && (!ttl || now - cached.timestamp < ttl)) {\n cache.delete(key);\n cache.set(key, cached); // Move to end (most recently used)\n return cached.value;\n }\n\n const result = fn(...args);\n cache.set(key, { timestamp: now, value: result });\n\n if (maxSize && cache.size > maxSize) {\n cache.delete(cache.keys().next().value!); // Remove least recently used\n }\n\n return result;\n };\n}\n"],"names":["memo","fn","ttl","maxSize","resolver","cache","keyGen","args","arg","argType","key","now","cached","result"],"mappings":"gFAqCO,SAASA,EACdC,EACA,CAAE,IAAAC,EAAK,QAAAC,EAAS,SAAAC,CAAA,EAAgC,GACL,CAC3C,MAAMC,MAAY,IAGZC,EAAUC,GAAgC,CAC9C,GAAIH,EAAU,OAAOA,EAAS,GAAGG,CAAI,EACrC,GAAIA,EAAK,SAAW,EAAG,MAAO,YAC9B,GAAIA,EAAK,SAAW,EAAG,CACrB,MAAMC,EAAMD,EAAK,CAAC,EACZE,EAAU,OAAOD,EACvB,GAAIC,IAAY,UAAYA,IAAY,UAAYA,IAAY,UAC9D,MAAO,GAAGA,CAAO,IAAID,CAAG,GAE1B,GAAIA,IAAQ,KAAM,MAAO,OACzB,GAAIA,IAAQ,OAAW,MAAO,WAChC,CACA,OAAO,KAAK,UAAUD,CAAI,CAC5B,EAEA,MAAO,IAAIA,IAAuC,CAChD,MAAMG,EAAMJ,EAAOC,CAAI,EACjBI,EAAM,KAAK,IAAA,EACXC,EAASP,EAAM,IAAIK,CAAG,EAE5B,GAAIE,IAAW,CAACV,GAAOS,EAAMC,EAAO,UAAYV,GAC9C,OAAAG,EAAM,OAAOK,CAAG,EAChBL,EAAM,IAAIK,EAAKE,CAAM,EACdA,EAAO,MAGhB,MAAMC,EAASZ,EAAG,GAAGM,CAAI,EACzB,OAAAF,EAAM,IAAIK,EAAK,CAAE,UAAWC,EAAK,MAAOE,EAAQ,EAE5CV,GAAWE,EAAM,KAAOF,GAC1BE,EAAM,OAAOA,EAAM,KAAA,EAAO,KAAA,EAAO,KAAM,EAGlCQ,CACT,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"memo.js","sources":["../../src/function/memo.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: - */\nimport type { Fn } from '../types';\n\ntype MemoizeOptions<T extends Fn> = {\n ttl?: number; // Time-to-live in milliseconds\n maxSize?: number; // Maximum number of items in cache\n resolver?: (...args: Parameters<T>) => string; // Custom key generator\n};\n\ntype CacheEntry<T extends Fn> = {\n value: ReturnType<T>;\n timestamp: number;\n};\n\n/**\n * Creates a function that memorizes the result of the provided function.\n * Supports expiration (TTL) and limited cache size (LRU).\n *\n * @example\n * ```ts\n * const add = (x, y) => x + y;\n * const memoizedAdd = memo(add, { ttl: 5000, maxSize: 10 });\n *\n * memoizedAdd(1, 2); // 3 (caches the result)\n * memoizedAdd(1, 2); // 3 (from cache)\n * ```\n *\n * @param fn - The function to memorize.\n * @param options - Memoization options.\n * @param [options.ttl] - (optional) time-to-live (TTL) for cache expiration (in milliseconds).\n * @param [options.maxSize] - (optional) maximum cache size (LRU eviction).\n * @param [options.resolver] - (optional) custom function to resolve the cache key.\n *\n * @returns A new function that memorizes the input function.\n */\nexport function memo<T extends Fn>(\n fn: T,\n { ttl, maxSize, resolver }: MemoizeOptions<T> = {},\n): (...args: Parameters<T>) => ReturnType<T> {\n const cache = new Map<string, CacheEntry<T>>();\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: -\n const keyGen = (args: Parameters<T>): string => {\n if (resolver) return resolver(...args);\n if (args.length === 0) return '__empty__';\n if (args.length === 1) {\n const arg = args[0];\n const argType = typeof arg;\n if (argType === 'string' || argType === 'number' || argType === 'boolean') {\n return `${argType}:${arg}`;\n }\n if (arg === null) return 'null';\n if (arg === undefined) return 'undefined';\n }\n return JSON.stringify(args);\n };\n\n return (...args: Parameters<T>): ReturnType<T> => {\n const key = keyGen(args);\n const now = Date.now();\n const cached = cache.get(key);\n\n if (cached && (!ttl || now - cached.timestamp < ttl)) {\n cache.delete(key);\n cache.set(key, cached); // Move to end (most recently used)\n return cached.value;\n }\n\n const result = fn(...args);\n cache.set(key, { timestamp: now, value: result });\n\n if (maxSize && cache.size > maxSize) {\n cache.delete(cache.keys().next().value!); // Remove least recently used\n }\n\n return result;\n };\n}\n"],"names":["memo","fn","ttl","maxSize","resolver","cache","keyGen","args","arg","argType","key","now","cached","result"],"mappings":"AAmCO,SAASA,EACdC,GACA,EAAE,KAAAC,GAAK,SAAAC,GAAS,UAAAC,EAAA,IAAgC,IACL;AAC3C,QAAMC,wBAAY,IAAA,GAGZC,IAAS,CAACC,MAAgC;AAC9C,QAAIH,EAAU,QAAOA,EAAS,GAAGG,CAAI;AACrC,QAAIA,EAAK,WAAW,EAAG,QAAO;AAC9B,QAAIA,EAAK,WAAW,GAAG;AACrB,YAAMC,IAAMD,EAAK,CAAC,GACZE,IAAU,OAAOD;AACvB,UAAIC,MAAY,YAAYA,MAAY,YAAYA,MAAY;AAC9D,eAAO,GAAGA,CAAO,IAAID,CAAG;AAE1B,UAAIA,MAAQ,KAAM,QAAO;AACzB,UAAIA,MAAQ,OAAW,QAAO;AAAA,IAChC;AACA,WAAO,KAAK,UAAUD,CAAI;AAAA,EAC5B;AAEA,SAAO,IAAIA,MAAuC;AAChD,UAAMG,IAAMJ,EAAOC,CAAI,GACjBI,IAAM,KAAK,IAAA,GACXC,IAASP,EAAM,IAAIK,CAAG;AAE5B,QAAIE,MAAW,CAACV,KAAOS,IAAMC,EAAO,YAAYV;AAC9C,aAAAG,EAAM,OAAOK,CAAG,GAChBL,EAAM,IAAIK,GAAKE,CAAM,GACdA,EAAO;AAGhB,UAAMC,IAASZ,EAAG,GAAGM,CAAI;AACzB,WAAAF,EAAM,IAAIK,GAAK,EAAE,WAAWC,GAAK,OAAOE,GAAQ,GAE5CV,KAAWE,EAAM,OAAOF,KAC1BE,EAAM,OAAOA,EAAM,KAAA,EAAO,KAAA,EAAO,KAAM,GAGlCQ;AAAA,EACT;AACF;"}
1
+ {"version":3,"file":"memo.js","sources":["../../src/function/memo.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: - */\nimport type { Fn } from '../types';\n\n// #region MemoizeOptions\ntype MemoizeOptions<T extends Fn> = {\n ttl?: number; // Time-to-live in milliseconds\n maxSize?: number; // Maximum number of items in cache\n resolver?: (...args: Parameters<T>) => string; // Custom key generator\n};\n// #endregion MemoizeOptions\n\ntype CacheEntry<T extends Fn> = {\n value: ReturnType<T>;\n timestamp: number;\n};\n\n/**\n * Creates a function that memorizes the result of the provided function.\n * Supports expiration (TTL) and limited cache size (LRU).\n *\n * @example\n * ```ts\n * const add = (x, y) => x + y;\n * const memoizedAdd = memo(add, { ttl: 5000, maxSize: 10 });\n *\n * memoizedAdd(1, 2); // 3 (caches the result)\n * memoizedAdd(1, 2); // 3 (from cache)\n * ```\n *\n * @param fn - The function to memorize.\n * @param options - Memoization options.\n * @param [options.ttl] - (optional) time-to-live (TTL) for cache expiration (in milliseconds).\n * @param [options.maxSize] - (optional) maximum cache size (LRU eviction).\n * @param [options.resolver] - (optional) custom function to resolve the cache key.\n *\n * @returns A new function that memorizes the input function.\n */\nexport function memo<T extends Fn>(\n fn: T,\n { ttl, maxSize, resolver }: MemoizeOptions<T> = {},\n): (...args: Parameters<T>) => ReturnType<T> {\n const cache = new Map<string, CacheEntry<T>>();\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: -\n const keyGen = (args: Parameters<T>): string => {\n if (resolver) return resolver(...args);\n if (args.length === 0) return '__empty__';\n if (args.length === 1) {\n const arg = args[0];\n const argType = typeof arg;\n if (argType === 'string' || argType === 'number' || argType === 'boolean') {\n return `${argType}:${arg}`;\n }\n if (arg === null) return 'null';\n if (arg === undefined) return 'undefined';\n }\n return JSON.stringify(args);\n };\n\n return (...args: Parameters<T>): ReturnType<T> => {\n const key = keyGen(args);\n const now = Date.now();\n const cached = cache.get(key);\n\n if (cached && (!ttl || now - cached.timestamp < ttl)) {\n cache.delete(key);\n cache.set(key, cached); // Move to end (most recently used)\n return cached.value;\n }\n\n const result = fn(...args);\n cache.set(key, { timestamp: now, value: result });\n\n if (maxSize && cache.size > maxSize) {\n cache.delete(cache.keys().next().value!); // Remove least recently used\n }\n\n return result;\n };\n}\n"],"names":["memo","fn","ttl","maxSize","resolver","cache","keyGen","args","arg","argType","key","now","cached","result"],"mappings":"AAqCO,SAASA,EACdC,GACA,EAAE,KAAAC,GAAK,SAAAC,GAAS,UAAAC,EAAA,IAAgC,IACL;AAC3C,QAAMC,wBAAY,IAAA,GAGZC,IAAS,CAACC,MAAgC;AAC9C,QAAIH,EAAU,QAAOA,EAAS,GAAGG,CAAI;AACrC,QAAIA,EAAK,WAAW,EAAG,QAAO;AAC9B,QAAIA,EAAK,WAAW,GAAG;AACrB,YAAMC,IAAMD,EAAK,CAAC,GACZE,IAAU,OAAOD;AACvB,UAAIC,MAAY,YAAYA,MAAY,YAAYA,MAAY;AAC9D,eAAO,GAAGA,CAAO,IAAID,CAAG;AAE1B,UAAIA,MAAQ,KAAM,QAAO;AACzB,UAAIA,MAAQ,OAAW,QAAO;AAAA,IAChC;AACA,WAAO,KAAK,UAAUD,CAAI;AAAA,EAC5B;AAEA,SAAO,IAAIA,MAAuC;AAChD,UAAMG,IAAMJ,EAAOC,CAAI,GACjBI,IAAM,KAAK,IAAA,GACXC,IAASP,EAAM,IAAIK,CAAG;AAE5B,QAAIE,MAAW,CAACV,KAAOS,IAAMC,EAAO,YAAYV;AAC9C,aAAAG,EAAM,OAAOK,CAAG,GAChBL,EAAM,IAAIK,GAAKE,CAAM,GACdA,EAAO;AAGhB,UAAMC,IAASZ,EAAG,GAAGM,CAAI;AACzB,WAAAF,EAAM,IAAIK,GAAK,EAAE,WAAWC,GAAK,OAAOE,GAAQ,GAE5CV,KAAWE,EAAM,OAAOF,KAC1BE,EAAM,OAAOA,EAAM,KAAA,EAAO,KAAA,EAAO,KAAM,GAGlCQ;AAAA,EACT;AACF;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});async function f(n,r,a,l){if(n<1)throw new Error("Limit must be at least 1");if(l?.aborted)throw new DOMException("Aborted","AbortError");const s=new Array(r.length);let c=0,t=!1,o;const u=()=>l?.aborted?(t=!0,o=new DOMException("Aborted","AbortError"),!0):!1,w=async()=>{for(;c<r.length&&!t&&!u();){const e=c++;try{s[e]=await a(r[e],e,r)}catch(h){t=!0,o=h;break}}},i=[],b=Math.min(n,r.length);for(let e=0;e<b;e++)i.push(w());if(await Promise.all(i),t)throw o;return s}exports.parallel=f;
2
+ //# sourceMappingURL=parallel.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel.cjs","sources":["../../src/function/parallel.ts"],"sourcesContent":["/**\n * Processes an array with an async callback with controlled parallelism.\n * Similar to Promise.all, but limits how many items are processed concurrently.\n * Returns an ordered array of results.\n *\n * @example\n * ```ts\n * // Process 3 items at a time\n * const results = await parallel(3, [1, 2, 3, 4, 5], async (n) => {\n * await delay(100);\n * return n * 2;\n * });\n * // [2, 4, 6, 8, 10]\n *\n * // With abort signal\n * const controller = new AbortController();\n * const results = await parallel(2, items, async (item) => {\n * return processItem(item);\n * }, controller.signal);\n * ```\n *\n * @param limit - Maximum number of concurrent operations (must be >= 1)\n * @param array - Array of items to process\n * @param callback - Async function to process each item\n * @param signal - Optional AbortSignal to cancel processing\n * @returns Promise resolving to an ordered array of results\n * @throws {Error} If limit is less than 1\n * @throws {DOMException} If aborted via signal\n */\nexport async function parallel<T, R>(\n limit: number,\n array: T[],\n callback: (item: T, index: number, array: T[]) => Promise<R>,\n signal?: AbortSignal,\n): Promise<R[]> {\n if (limit < 1) {\n throw new Error('Limit must be at least 1');\n }\n\n if (signal?.aborted) {\n throw new DOMException('Aborted', 'AbortError');\n }\n\n const results: R[] = new Array(array.length);\n let currentIndex = 0;\n let hasError = false;\n let error: unknown;\n\n // Check for abort\n const checkAbort = () => {\n if (signal?.aborted) {\n hasError = true;\n error = new DOMException('Aborted', 'AbortError');\n return true;\n }\n return false;\n };\n\n // Worker function that processes items from the queue\n const worker = async (): Promise<void> => {\n while (currentIndex < array.length && !hasError) {\n if (checkAbort()) {\n break;\n }\n\n const index = currentIndex++;\n\n try {\n results[index] = await callback(array[index], index, array);\n } catch (err) {\n hasError = true;\n error = err;\n break;\n }\n }\n };\n\n // Create workers up to the limit\n const workers: Promise<void>[] = [];\n const workerCount = Math.min(limit, array.length);\n\n for (let i = 0; i < workerCount; i++) {\n workers.push(worker());\n }\n\n // Wait for all workers to complete\n await Promise.all(workers);\n\n // If there was an error, throw it\n if (hasError) {\n throw error;\n }\n\n return results;\n}\n"],"names":["parallel","limit","array","callback","signal","results","currentIndex","hasError","error","checkAbort","worker","index","err","workers","workerCount","i"],"mappings":"gFA6BA,eAAsBA,EACpBC,EACAC,EACAC,EACAC,EACc,CACd,GAAIH,EAAQ,EACV,MAAM,IAAI,MAAM,0BAA0B,EAG5C,GAAIG,GAAQ,QACV,MAAM,IAAI,aAAa,UAAW,YAAY,EAGhD,MAAMC,EAAe,IAAI,MAAMH,EAAM,MAAM,EAC3C,IAAII,EAAe,EACfC,EAAW,GACXC,EAGJ,MAAMC,EAAa,IACbL,GAAQ,SACVG,EAAW,GACXC,EAAQ,IAAI,aAAa,UAAW,YAAY,EACzC,IAEF,GAIHE,EAAS,SAA2B,CACxC,KAAOJ,EAAeJ,EAAM,QAAU,CAACK,GACjC,CAAAE,KAD2C,CAK/C,MAAME,EAAQL,IAEd,GAAI,CACFD,EAAQM,CAAK,EAAI,MAAMR,EAASD,EAAMS,CAAK,EAAGA,EAAOT,CAAK,CAC5D,OAASU,EAAK,CACZL,EAAW,GACXC,EAAQI,EACR,KACF,CACF,CACF,EAGMC,EAA2B,CAAA,EAC3BC,EAAc,KAAK,IAAIb,EAAOC,EAAM,MAAM,EAEhD,QAASa,EAAI,EAAGA,EAAID,EAAaC,IAC/BF,EAAQ,KAAKH,GAAQ,EAOvB,GAHA,MAAM,QAAQ,IAAIG,CAAO,EAGrBN,EACF,MAAMC,EAGR,OAAOH,CACT"}
@@ -0,0 +1,28 @@
1
+ async function f(n, t, w, s) {
2
+ if (n < 1)
3
+ throw new Error("Limit must be at least 1");
4
+ if (s?.aborted)
5
+ throw new DOMException("Aborted", "AbortError");
6
+ const c = new Array(t.length);
7
+ let l = 0, e = !1, o;
8
+ const a = () => s?.aborted ? (e = !0, o = new DOMException("Aborted", "AbortError"), !0) : !1, h = async () => {
9
+ for (; l < t.length && !e && !a(); ) {
10
+ const r = l++;
11
+ try {
12
+ c[r] = await w(t[r], r, t);
13
+ } catch (b) {
14
+ e = !0, o = b;
15
+ break;
16
+ }
17
+ }
18
+ }, i = [], u = Math.min(n, t.length);
19
+ for (let r = 0; r < u; r++)
20
+ i.push(h());
21
+ if (await Promise.all(i), e)
22
+ throw o;
23
+ return c;
24
+ }
25
+ export {
26
+ f as parallel
27
+ };
28
+ //# sourceMappingURL=parallel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel.js","sources":["../../src/function/parallel.ts"],"sourcesContent":["/**\n * Processes an array with an async callback with controlled parallelism.\n * Similar to Promise.all, but limits how many items are processed concurrently.\n * Returns an ordered array of results.\n *\n * @example\n * ```ts\n * // Process 3 items at a time\n * const results = await parallel(3, [1, 2, 3, 4, 5], async (n) => {\n * await delay(100);\n * return n * 2;\n * });\n * // [2, 4, 6, 8, 10]\n *\n * // With abort signal\n * const controller = new AbortController();\n * const results = await parallel(2, items, async (item) => {\n * return processItem(item);\n * }, controller.signal);\n * ```\n *\n * @param limit - Maximum number of concurrent operations (must be >= 1)\n * @param array - Array of items to process\n * @param callback - Async function to process each item\n * @param signal - Optional AbortSignal to cancel processing\n * @returns Promise resolving to an ordered array of results\n * @throws {Error} If limit is less than 1\n * @throws {DOMException} If aborted via signal\n */\nexport async function parallel<T, R>(\n limit: number,\n array: T[],\n callback: (item: T, index: number, array: T[]) => Promise<R>,\n signal?: AbortSignal,\n): Promise<R[]> {\n if (limit < 1) {\n throw new Error('Limit must be at least 1');\n }\n\n if (signal?.aborted) {\n throw new DOMException('Aborted', 'AbortError');\n }\n\n const results: R[] = new Array(array.length);\n let currentIndex = 0;\n let hasError = false;\n let error: unknown;\n\n // Check for abort\n const checkAbort = () => {\n if (signal?.aborted) {\n hasError = true;\n error = new DOMException('Aborted', 'AbortError');\n return true;\n }\n return false;\n };\n\n // Worker function that processes items from the queue\n const worker = async (): Promise<void> => {\n while (currentIndex < array.length && !hasError) {\n if (checkAbort()) {\n break;\n }\n\n const index = currentIndex++;\n\n try {\n results[index] = await callback(array[index], index, array);\n } catch (err) {\n hasError = true;\n error = err;\n break;\n }\n }\n };\n\n // Create workers up to the limit\n const workers: Promise<void>[] = [];\n const workerCount = Math.min(limit, array.length);\n\n for (let i = 0; i < workerCount; i++) {\n workers.push(worker());\n }\n\n // Wait for all workers to complete\n await Promise.all(workers);\n\n // If there was an error, throw it\n if (hasError) {\n throw error;\n }\n\n return results;\n}\n"],"names":["parallel","limit","array","callback","signal","results","currentIndex","hasError","error","checkAbort","worker","index","err","workers","workerCount","i"],"mappings":"AA6BA,eAAsBA,EACpBC,GACAC,GACAC,GACAC,GACc;AACd,MAAIH,IAAQ;AACV,UAAM,IAAI,MAAM,0BAA0B;AAG5C,MAAIG,GAAQ;AACV,UAAM,IAAI,aAAa,WAAW,YAAY;AAGhD,QAAMC,IAAe,IAAI,MAAMH,EAAM,MAAM;AAC3C,MAAII,IAAe,GACfC,IAAW,IACXC;AAGJ,QAAMC,IAAa,MACbL,GAAQ,WACVG,IAAW,IACXC,IAAQ,IAAI,aAAa,WAAW,YAAY,GACzC,MAEF,IAIHE,IAAS,YAA2B;AACxC,WAAOJ,IAAeJ,EAAM,UAAU,CAACK,KACjC,CAAAE,OAD2C;AAK/C,YAAME,IAAQL;AAEd,UAAI;AACF,QAAAD,EAAQM,CAAK,IAAI,MAAMR,EAASD,EAAMS,CAAK,GAAGA,GAAOT,CAAK;AAAA,MAC5D,SAASU,GAAK;AACZ,QAAAL,IAAW,IACXC,IAAQI;AACR;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAGMC,IAA2B,CAAA,GAC3BC,IAAc,KAAK,IAAIb,GAAOC,EAAM,MAAM;AAEhD,WAASa,IAAI,GAAGA,IAAID,GAAaC;AAC/B,IAAAF,EAAQ,KAAKH,GAAQ;AAOvB,MAHA,MAAM,QAAQ,IAAIG,CAAO,GAGrBN;AACF,UAAMC;AAGR,SAAOH;AACT;"}
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.cjs","sources":["../../src/function/proxy.ts"],"sourcesContent":["import { isObject } from '../typed/isObject';\nimport type { Obj } from '../types';\n\ntype ProxyOptions<T> = {\n set?: <K extends PropertyKey>(prop: K, curr: unknown, prev: unknown, target: T) => unknown;\n get?: <K extends PropertyKey>(prop: K, val: unknown, target: T) => unknown;\n deep?: boolean;\n watch?: (keyof T)[];\n};\n\n/**\n * Creates a new Proxy for the given object that invokes functions when properties are accessed or modified.\n\n * @example\n * ```ts\n * const obj = { a: 1, b: 2 };\n * const log = (prop, curr, prev, target) => console.log(`Property '${prop}' changed from ${prev} to ${curr}`);\n * const proxyObj = proxy(obj, { set: log });\n * proxyObj.a = 3; // logs 'Property 'a' changed from 1 to 3'\n * ```\n *\n * @param item - The object to observe.\n * @param options - Configuration options for the proxy.\n * @param [options.set] - A function to call when a property is set. It receives the property name, current value, previous value, and the target object.\n * @param [options.get] - A function to call when a property is accessed. It receives the property name, value, and the target object.\n * @param [options.deep] - If true, the proxy will also apply to nested objects.\n * @param [options.watch] - An array of property names to watch. If provided, only these properties will trigger the set and get functions.\n *\n * @returns A new Proxy for the given object.\n */\nexport function proxy<T extends Obj>(item: T, options: ProxyOptions<T>): T {\n const { set, get, deep = false, watch } = options;\n\n const handler: ProxyHandler<T> = {\n get(target, prop, receiver) {\n if (watch && !watch.includes(prop as keyof T)) {\n return Reflect.get(target, prop, receiver);\n }\n\n let value = Reflect.get(target, prop, receiver);\n\n if (get) {\n // biome-ignore lint/suspicious/noExplicitAny: -\n value = get(prop, value, target) as any;\n }\n\n if (deep && isObject(value)) {\n return proxy(value as T[keyof T], options);\n }\n\n return value;\n },\n set(target, prop, val, receiver) {\n if (watch && !watch.includes(prop as keyof T)) {\n return Reflect.set(target, prop, val, receiver);\n }\n\n const prev = target[prop as keyof T];\n const value = set ? set(prop, val, prev, target) : val;\n\n if (deep && isObject(value)) {\n return Reflect.set(target, prop, proxy(value as T[keyof T], options), receiver);\n }\n\n return Reflect.set(target, prop, value, receiver);\n },\n };\n\n return new Proxy(item, handler);\n}\n"],"names":["proxy","item","options","set","get","deep","watch","handler","target","prop","receiver","value","isObject","val","prev"],"mappings":"yHA8BO,SAASA,EAAqBC,EAASC,EAA6B,CACzE,KAAM,CAAE,IAAAC,EAAK,IAAAC,EAAK,KAAAC,EAAO,GAAO,MAAAC,GAAUJ,EAEpCK,EAA2B,CAC/B,IAAIC,EAAQC,EAAMC,EAAU,CAC1B,GAAIJ,GAAS,CAACA,EAAM,SAASG,CAAe,EAC1C,OAAO,QAAQ,IAAID,EAAQC,EAAMC,CAAQ,EAG3C,IAAIC,EAAQ,QAAQ,IAAIH,EAAQC,EAAMC,CAAQ,EAO9C,OALIN,IAEFO,EAAQP,EAAIK,EAAME,EAAOH,CAAM,GAG7BH,GAAQO,WAASD,CAAK,EACjBX,EAAMW,EAAqBT,CAAO,EAGpCS,CACT,EACA,IAAIH,EAAQC,EAAMI,EAAKH,EAAU,CAC/B,GAAIJ,GAAS,CAACA,EAAM,SAASG,CAAe,EAC1C,OAAO,QAAQ,IAAID,EAAQC,EAAMI,EAAKH,CAAQ,EAGhD,MAAMI,EAAON,EAAOC,CAAe,EAC7BE,EAAQR,EAAMA,EAAIM,EAAMI,EAAKC,EAAMN,CAAM,EAAIK,EAEnD,OAAIR,GAAQO,WAASD,CAAK,EACjB,QAAQ,IAAIH,EAAQC,EAAMT,EAAMW,EAAqBT,CAAO,EAAGQ,CAAQ,EAGzE,QAAQ,IAAIF,EAAQC,EAAME,EAAOD,CAAQ,CAClD,CAAA,EAGF,OAAO,IAAI,MAAMT,EAAMM,CAAO,CAChC"}
1
+ {"version":3,"file":"proxy.cjs","sources":["../../src/function/proxy.ts"],"sourcesContent":["import { isObject } from '../typed/isObject';\nimport type { Obj } from '../types';\n\n// #region ProxyOptions\ntype ProxyOptions<T> = {\n set?: <K extends PropertyKey>(prop: K, curr: unknown, prev: unknown, target: T) => unknown;\n get?: <K extends PropertyKey>(prop: K, val: unknown, target: T) => unknown;\n deep?: boolean;\n watch?: (keyof T)[];\n};\n// #endregion ProxyOptions\n\n/**\n * Creates a new Proxy for the given object that invokes functions when properties are accessed or modified.\n\n * @example\n * ```ts\n * const obj = { a: 1, b: 2 };\n * const log = (prop, curr, prev, target) => console.log(`Property '${prop}' changed from ${prev} to ${curr}`);\n * const proxyObj = proxy(obj, { set: log });\n * proxyObj.a = 3; // logs 'Property 'a' changed from 1 to 3'\n * ```\n *\n * @param item - The object to observe.\n * @param options - Configuration options for the proxy.\n * @param [options.set] - A function to call when a property is set. It receives the property name, current value, previous value, and the target object.\n * @param [options.get] - A function to call when a property is accessed. It receives the property name, value, and the target object.\n * @param [options.deep] - If true, the proxy will also apply to nested objects.\n * @param [options.watch] - An array of property names to watch. If provided, only these properties will trigger the set and get functions.\n *\n * @returns A new Proxy for the given object.\n */\nexport function proxy<T extends Obj>(item: T, options: ProxyOptions<T>): T {\n const { set, get, deep = false, watch } = options;\n\n const handler: ProxyHandler<T> = {\n get(target, prop, receiver) {\n if (watch && !watch.includes(prop as keyof T)) {\n return Reflect.get(target, prop, receiver);\n }\n\n let value = Reflect.get(target, prop, receiver);\n\n if (get) {\n // biome-ignore lint/suspicious/noExplicitAny: -\n value = get(prop, value, target) as any;\n }\n\n if (deep && isObject(value)) {\n return proxy(value as T[keyof T], options);\n }\n\n return value;\n },\n set(target, prop, val, receiver) {\n if (watch && !watch.includes(prop as keyof T)) {\n return Reflect.set(target, prop, val, receiver);\n }\n\n const prev = target[prop as keyof T];\n const value = set ? set(prop, val, prev, target) : val;\n\n if (deep && isObject(value)) {\n return Reflect.set(target, prop, proxy(value as T[keyof T], options), receiver);\n }\n\n return Reflect.set(target, prop, value, receiver);\n },\n };\n\n return new Proxy(item, handler);\n}\n"],"names":["proxy","item","options","set","get","deep","watch","handler","target","prop","receiver","value","isObject","val","prev"],"mappings":"yHAgCO,SAASA,EAAqBC,EAASC,EAA6B,CACzE,KAAM,CAAE,IAAAC,EAAK,IAAAC,EAAK,KAAAC,EAAO,GAAO,MAAAC,GAAUJ,EAEpCK,EAA2B,CAC/B,IAAIC,EAAQC,EAAMC,EAAU,CAC1B,GAAIJ,GAAS,CAACA,EAAM,SAASG,CAAe,EAC1C,OAAO,QAAQ,IAAID,EAAQC,EAAMC,CAAQ,EAG3C,IAAIC,EAAQ,QAAQ,IAAIH,EAAQC,EAAMC,CAAQ,EAO9C,OALIN,IAEFO,EAAQP,EAAIK,EAAME,EAAOH,CAAM,GAG7BH,GAAQO,WAASD,CAAK,EACjBX,EAAMW,EAAqBT,CAAO,EAGpCS,CACT,EACA,IAAIH,EAAQC,EAAMI,EAAKH,EAAU,CAC/B,GAAIJ,GAAS,CAACA,EAAM,SAASG,CAAe,EAC1C,OAAO,QAAQ,IAAID,EAAQC,EAAMI,EAAKH,CAAQ,EAGhD,MAAMI,EAAON,EAAOC,CAAe,EAC7BE,EAAQR,EAAMA,EAAIM,EAAMI,EAAKC,EAAMN,CAAM,EAAIK,EAEnD,OAAIR,GAAQO,WAASD,CAAK,EACjB,QAAQ,IAAIH,EAAQC,EAAMT,EAAMW,EAAqBT,CAAO,EAAGQ,CAAQ,EAGzE,QAAQ,IAAIF,EAAQC,EAAME,EAAOD,CAAQ,CAClD,CAAA,EAGF,OAAO,IAAI,MAAMT,EAAMM,CAAO,CAChC"}
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.js","sources":["../../src/function/proxy.ts"],"sourcesContent":["import { isObject } from '../typed/isObject';\nimport type { Obj } from '../types';\n\ntype ProxyOptions<T> = {\n set?: <K extends PropertyKey>(prop: K, curr: unknown, prev: unknown, target: T) => unknown;\n get?: <K extends PropertyKey>(prop: K, val: unknown, target: T) => unknown;\n deep?: boolean;\n watch?: (keyof T)[];\n};\n\n/**\n * Creates a new Proxy for the given object that invokes functions when properties are accessed or modified.\n\n * @example\n * ```ts\n * const obj = { a: 1, b: 2 };\n * const log = (prop, curr, prev, target) => console.log(`Property '${prop}' changed from ${prev} to ${curr}`);\n * const proxyObj = proxy(obj, { set: log });\n * proxyObj.a = 3; // logs 'Property 'a' changed from 1 to 3'\n * ```\n *\n * @param item - The object to observe.\n * @param options - Configuration options for the proxy.\n * @param [options.set] - A function to call when a property is set. It receives the property name, current value, previous value, and the target object.\n * @param [options.get] - A function to call when a property is accessed. It receives the property name, value, and the target object.\n * @param [options.deep] - If true, the proxy will also apply to nested objects.\n * @param [options.watch] - An array of property names to watch. If provided, only these properties will trigger the set and get functions.\n *\n * @returns A new Proxy for the given object.\n */\nexport function proxy<T extends Obj>(item: T, options: ProxyOptions<T>): T {\n const { set, get, deep = false, watch } = options;\n\n const handler: ProxyHandler<T> = {\n get(target, prop, receiver) {\n if (watch && !watch.includes(prop as keyof T)) {\n return Reflect.get(target, prop, receiver);\n }\n\n let value = Reflect.get(target, prop, receiver);\n\n if (get) {\n // biome-ignore lint/suspicious/noExplicitAny: -\n value = get(prop, value, target) as any;\n }\n\n if (deep && isObject(value)) {\n return proxy(value as T[keyof T], options);\n }\n\n return value;\n },\n set(target, prop, val, receiver) {\n if (watch && !watch.includes(prop as keyof T)) {\n return Reflect.set(target, prop, val, receiver);\n }\n\n const prev = target[prop as keyof T];\n const value = set ? set(prop, val, prev, target) : val;\n\n if (deep && isObject(value)) {\n return Reflect.set(target, prop, proxy(value as T[keyof T], options), receiver);\n }\n\n return Reflect.set(target, prop, value, receiver);\n },\n };\n\n return new Proxy(item, handler);\n}\n"],"names":["proxy","item","options","set","get","deep","watch","handler","target","prop","receiver","value","isObject","val","prev"],"mappings":";AA8BO,SAASA,EAAqBC,GAASC,GAA6B;AACzE,QAAM,EAAE,KAAAC,GAAK,KAAAC,GAAK,MAAAC,IAAO,IAAO,OAAAC,MAAUJ,GAEpCK,IAA2B;AAAA,IAC/B,IAAIC,GAAQC,GAAMC,GAAU;AAC1B,UAAIJ,KAAS,CAACA,EAAM,SAASG,CAAe;AAC1C,eAAO,QAAQ,IAAID,GAAQC,GAAMC,CAAQ;AAG3C,UAAIC,IAAQ,QAAQ,IAAIH,GAAQC,GAAMC,CAAQ;AAO9C,aALIN,MAEFO,IAAQP,EAAIK,GAAME,GAAOH,CAAM,IAG7BH,KAAQO,EAASD,CAAK,IACjBX,EAAMW,GAAqBT,CAAO,IAGpCS;AAAA,IACT;AAAA,IACA,IAAIH,GAAQC,GAAMI,GAAKH,GAAU;AAC/B,UAAIJ,KAAS,CAACA,EAAM,SAASG,CAAe;AAC1C,eAAO,QAAQ,IAAID,GAAQC,GAAMI,GAAKH,CAAQ;AAGhD,YAAMI,IAAON,EAAOC,CAAe,GAC7BE,IAAQR,IAAMA,EAAIM,GAAMI,GAAKC,GAAMN,CAAM,IAAIK;AAEnD,aAAIR,KAAQO,EAASD,CAAK,IACjB,QAAQ,IAAIH,GAAQC,GAAMT,EAAMW,GAAqBT,CAAO,GAAGQ,CAAQ,IAGzE,QAAQ,IAAIF,GAAQC,GAAME,GAAOD,CAAQ;AAAA,IAClD;AAAA,EAAA;AAGF,SAAO,IAAI,MAAMT,GAAMM,CAAO;AAChC;"}
1
+ {"version":3,"file":"proxy.js","sources":["../../src/function/proxy.ts"],"sourcesContent":["import { isObject } from '../typed/isObject';\nimport type { Obj } from '../types';\n\n// #region ProxyOptions\ntype ProxyOptions<T> = {\n set?: <K extends PropertyKey>(prop: K, curr: unknown, prev: unknown, target: T) => unknown;\n get?: <K extends PropertyKey>(prop: K, val: unknown, target: T) => unknown;\n deep?: boolean;\n watch?: (keyof T)[];\n};\n// #endregion ProxyOptions\n\n/**\n * Creates a new Proxy for the given object that invokes functions when properties are accessed or modified.\n\n * @example\n * ```ts\n * const obj = { a: 1, b: 2 };\n * const log = (prop, curr, prev, target) => console.log(`Property '${prop}' changed from ${prev} to ${curr}`);\n * const proxyObj = proxy(obj, { set: log });\n * proxyObj.a = 3; // logs 'Property 'a' changed from 1 to 3'\n * ```\n *\n * @param item - The object to observe.\n * @param options - Configuration options for the proxy.\n * @param [options.set] - A function to call when a property is set. It receives the property name, current value, previous value, and the target object.\n * @param [options.get] - A function to call when a property is accessed. It receives the property name, value, and the target object.\n * @param [options.deep] - If true, the proxy will also apply to nested objects.\n * @param [options.watch] - An array of property names to watch. If provided, only these properties will trigger the set and get functions.\n *\n * @returns A new Proxy for the given object.\n */\nexport function proxy<T extends Obj>(item: T, options: ProxyOptions<T>): T {\n const { set, get, deep = false, watch } = options;\n\n const handler: ProxyHandler<T> = {\n get(target, prop, receiver) {\n if (watch && !watch.includes(prop as keyof T)) {\n return Reflect.get(target, prop, receiver);\n }\n\n let value = Reflect.get(target, prop, receiver);\n\n if (get) {\n // biome-ignore lint/suspicious/noExplicitAny: -\n value = get(prop, value, target) as any;\n }\n\n if (deep && isObject(value)) {\n return proxy(value as T[keyof T], options);\n }\n\n return value;\n },\n set(target, prop, val, receiver) {\n if (watch && !watch.includes(prop as keyof T)) {\n return Reflect.set(target, prop, val, receiver);\n }\n\n const prev = target[prop as keyof T];\n const value = set ? set(prop, val, prev, target) : val;\n\n if (deep && isObject(value)) {\n return Reflect.set(target, prop, proxy(value as T[keyof T], options), receiver);\n }\n\n return Reflect.set(target, prop, value, receiver);\n },\n };\n\n return new Proxy(item, handler);\n}\n"],"names":["proxy","item","options","set","get","deep","watch","handler","target","prop","receiver","value","isObject","val","prev"],"mappings":";AAgCO,SAASA,EAAqBC,GAASC,GAA6B;AACzE,QAAM,EAAE,KAAAC,GAAK,KAAAC,GAAK,MAAAC,IAAO,IAAO,OAAAC,MAAUJ,GAEpCK,IAA2B;AAAA,IAC/B,IAAIC,GAAQC,GAAMC,GAAU;AAC1B,UAAIJ,KAAS,CAACA,EAAM,SAASG,CAAe;AAC1C,eAAO,QAAQ,IAAID,GAAQC,GAAMC,CAAQ;AAG3C,UAAIC,IAAQ,QAAQ,IAAIH,GAAQC,GAAMC,CAAQ;AAO9C,aALIN,MAEFO,IAAQP,EAAIK,GAAME,GAAOH,CAAM,IAG7BH,KAAQO,EAASD,CAAK,IACjBX,EAAMW,GAAqBT,CAAO,IAGpCS;AAAA,IACT;AAAA,IACA,IAAIH,GAAQC,GAAMI,GAAKH,GAAU;AAC/B,UAAIJ,KAAS,CAACA,EAAM,SAASG,CAAe;AAC1C,eAAO,QAAQ,IAAID,GAAQC,GAAMI,GAAKH,CAAQ;AAGhD,YAAMI,IAAON,EAAOC,CAAe,GAC7BE,IAAQR,IAAMA,EAAIM,GAAMI,GAAKC,GAAMN,CAAM,IAAIK;AAEnD,aAAIR,KAAQO,EAASD,CAAK,IACjB,QAAQ,IAAIH,GAAQC,GAAMT,EAAMW,GAAqBT,CAAO,GAAGQ,CAAQ,IAGzE,QAAQ,IAAIF,GAAQC,GAAME,GAAOD,CAAQ;AAAA,IAClD;AAAA,EAAA;AAGF,SAAO,IAAI,MAAMT,GAAMM,CAAO;AAChC;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("../typed/isArray.cjs"),s=require("../typed/isEmpty.cjs"),d=require("../typed/isNil.cjs"),f=require("../typed/isObject.cjs"),u=require("../typed/isString.cjs");function e(r){if(!d.isNil(r)){if(u.isString(r)){const i=r.trim();return i===""?void 0:i}if(c.isArray(r)){const i=r.map(t=>e(t)).filter(t=>!s.isEmpty(t));return i.length===0?void 0:i}if(f.isObject(r)){const i={};for(const[t,o]of Object.entries(r)){const n=e(o);s.isEmpty(n)||(i[t]=n)}return Object.keys(i).length===0?void 0:i}return r}}exports.prune=e;
2
+ //# sourceMappingURL=prune.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune.cjs","sources":["../../src/function/prune.ts"],"sourcesContent":["import { isArray } from '../typed/isArray';\nimport { isEmpty } from '../typed/isEmpty';\nimport { isNil } from '../typed/isNil';\nimport { isObject } from '../typed/isObject';\nimport { isString } from '../typed/isString';\n\n/**\n * Removes all nullable and empty values from strings, arrays, or objects.\n *\n * - For strings: Removes leading/trailing whitespace and returns undefined if empty\n * - For arrays: Recursively removes null, undefined, empty strings, and empty objects/arrays\n * - For objects: Recursively removes properties with null, undefined, empty strings, and empty objects/arrays\n *\n * @example\n * ```ts\n * prune(' hello '); // 'hello'\n * prune(' '); // undefined\n * prune([1, null, '', 2, undefined, 3]); // [1, 2, 3]\n * prune({ a: 1, b: null, c: '', d: 2 }); // { a: 1, d: 2 }\n * prune({ a: { b: null, c: '' }, d: 1 }); // { d: 1 }\n * ```\n *\n * @param value - The value to prune (can be string, array, object, or any other type)\n * @returns The pruned value, or undefined if the result would be empty\n */\nexport function prune<T>(value: T): T | undefined {\n // Handle null/undefined\n if (isNil(value)) {\n return undefined;\n }\n\n // Handle strings\n if (isString(value)) {\n const trimmed = value.trim();\n return (trimmed === '' ? undefined : trimmed) as T | undefined;\n }\n\n // Handle arrays\n if (isArray(value)) {\n const cleaned = value.map((item) => prune(item)).filter((item) => !isEmpty(item));\n\n return (cleaned.length === 0 ? undefined : cleaned) as T | undefined;\n }\n\n // Handle objects\n if (isObject(value)) {\n const cleaned: Record<string, unknown> = {};\n\n for (const [key, val] of Object.entries(value)) {\n const cleanedValue = prune(val);\n\n // Skip nil, empty strings, and empty arrays/objects\n if (!isEmpty(cleanedValue)) {\n cleaned[key] = cleanedValue;\n }\n }\n\n return (Object.keys(cleaned).length === 0 ? undefined : cleaned) as T | undefined;\n }\n\n // For other types (numbers, booleans, etc.), return as-is\n return value;\n}\n"],"names":["prune","value","isNil","isString","trimmed","isArray","cleaned","item","isEmpty","isObject","key","val","cleanedValue"],"mappings":"gQAyBO,SAASA,EAASC,EAAyB,CAEhD,GAAIC,CAAAA,EAAAA,MAAMD,CAAK,EAKf,IAAIE,EAAAA,SAASF,CAAK,EAAG,CACnB,MAAMG,EAAUH,EAAM,KAAA,EACtB,OAAQG,IAAY,GAAK,OAAYA,CACvC,CAGA,GAAIC,EAAAA,QAAQJ,CAAK,EAAG,CAClB,MAAMK,EAAUL,EAAM,IAAKM,GAASP,EAAMO,CAAI,CAAC,EAAE,OAAQA,GAAS,CAACC,EAAAA,QAAQD,CAAI,CAAC,EAEhF,OAAQD,EAAQ,SAAW,EAAI,OAAYA,CAC7C,CAGA,GAAIG,EAAAA,SAASR,CAAK,EAAG,CACnB,MAAMK,EAAmC,CAAA,EAEzC,SAAW,CAACI,EAAKC,CAAG,IAAK,OAAO,QAAQV,CAAK,EAAG,CAC9C,MAAMW,EAAeZ,EAAMW,CAAG,EAGzBH,EAAAA,QAAQI,CAAY,IACvBN,EAAQI,CAAG,EAAIE,EAEnB,CAEA,OAAQ,OAAO,KAAKN,CAAO,EAAE,SAAW,EAAI,OAAYA,CAC1D,CAGA,OAAOL,EACT"}
@@ -0,0 +1,30 @@
1
+ import { isArray as f } from "../typed/isArray.js";
2
+ import { isEmpty as n } from "../typed/isEmpty.js";
3
+ import { isNil as c } from "../typed/isNil.js";
4
+ import { isObject as s } from "../typed/isObject.js";
5
+ import { isString as p } from "../typed/isString.js";
6
+ function e(t) {
7
+ if (!c(t)) {
8
+ if (p(t)) {
9
+ const r = t.trim();
10
+ return r === "" ? void 0 : r;
11
+ }
12
+ if (f(t)) {
13
+ const r = t.map((i) => e(i)).filter((i) => !n(i));
14
+ return r.length === 0 ? void 0 : r;
15
+ }
16
+ if (s(t)) {
17
+ const r = {};
18
+ for (const [i, m] of Object.entries(t)) {
19
+ const o = e(m);
20
+ n(o) || (r[i] = o);
21
+ }
22
+ return Object.keys(r).length === 0 ? void 0 : r;
23
+ }
24
+ return t;
25
+ }
26
+ }
27
+ export {
28
+ e as prune
29
+ };
30
+ //# sourceMappingURL=prune.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune.js","sources":["../../src/function/prune.ts"],"sourcesContent":["import { isArray } from '../typed/isArray';\nimport { isEmpty } from '../typed/isEmpty';\nimport { isNil } from '../typed/isNil';\nimport { isObject } from '../typed/isObject';\nimport { isString } from '../typed/isString';\n\n/**\n * Removes all nullable and empty values from strings, arrays, or objects.\n *\n * - For strings: Removes leading/trailing whitespace and returns undefined if empty\n * - For arrays: Recursively removes null, undefined, empty strings, and empty objects/arrays\n * - For objects: Recursively removes properties with null, undefined, empty strings, and empty objects/arrays\n *\n * @example\n * ```ts\n * prune(' hello '); // 'hello'\n * prune(' '); // undefined\n * prune([1, null, '', 2, undefined, 3]); // [1, 2, 3]\n * prune({ a: 1, b: null, c: '', d: 2 }); // { a: 1, d: 2 }\n * prune({ a: { b: null, c: '' }, d: 1 }); // { d: 1 }\n * ```\n *\n * @param value - The value to prune (can be string, array, object, or any other type)\n * @returns The pruned value, or undefined if the result would be empty\n */\nexport function prune<T>(value: T): T | undefined {\n // Handle null/undefined\n if (isNil(value)) {\n return undefined;\n }\n\n // Handle strings\n if (isString(value)) {\n const trimmed = value.trim();\n return (trimmed === '' ? undefined : trimmed) as T | undefined;\n }\n\n // Handle arrays\n if (isArray(value)) {\n const cleaned = value.map((item) => prune(item)).filter((item) => !isEmpty(item));\n\n return (cleaned.length === 0 ? undefined : cleaned) as T | undefined;\n }\n\n // Handle objects\n if (isObject(value)) {\n const cleaned: Record<string, unknown> = {};\n\n for (const [key, val] of Object.entries(value)) {\n const cleanedValue = prune(val);\n\n // Skip nil, empty strings, and empty arrays/objects\n if (!isEmpty(cleanedValue)) {\n cleaned[key] = cleanedValue;\n }\n }\n\n return (Object.keys(cleaned).length === 0 ? undefined : cleaned) as T | undefined;\n }\n\n // For other types (numbers, booleans, etc.), return as-is\n return value;\n}\n"],"names":["prune","value","isNil","isString","trimmed","isArray","cleaned","item","isEmpty","isObject","key","val","cleanedValue"],"mappings":";;;;;AAyBO,SAASA,EAASC,GAAyB;AAEhD,MAAI,CAAAC,EAAMD,CAAK,GAKf;AAAA,QAAIE,EAASF,CAAK,GAAG;AACnB,YAAMG,IAAUH,EAAM,KAAA;AACtB,aAAQG,MAAY,KAAK,SAAYA;AAAA,IACvC;AAGA,QAAIC,EAAQJ,CAAK,GAAG;AAClB,YAAMK,IAAUL,EAAM,IAAI,CAACM,MAASP,EAAMO,CAAI,CAAC,EAAE,OAAO,CAACA,MAAS,CAACC,EAAQD,CAAI,CAAC;AAEhF,aAAQD,EAAQ,WAAW,IAAI,SAAYA;AAAA,IAC7C;AAGA,QAAIG,EAASR,CAAK,GAAG;AACnB,YAAMK,IAAmC,CAAA;AAEzC,iBAAW,CAACI,GAAKC,CAAG,KAAK,OAAO,QAAQV,CAAK,GAAG;AAC9C,cAAMW,IAAeZ,EAAMW,CAAG;AAG9B,QAAKH,EAAQI,CAAY,MACvBN,EAAQI,CAAG,IAAIE;AAAA,MAEnB;AAEA,aAAQ,OAAO,KAAKN,CAAO,EAAE,WAAW,IAAI,SAAYA;AAAA,IAC1D;AAGA,WAAOL;AAAA;AACT;"}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("./array/aggregate.cjs"),_=require("./array/alternate.cjs"),l=require("./array/chunk.cjs"),p=require("./array/compact.cjs"),S=require("./array/contains.cjs"),d=require("./array/every.cjs"),E=require("./array/filter.cjs"),f=require("./array/find.cjs"),I=require("./array/findIndex.cjs"),O=require("./array/findLast.cjs"),g=require("./array/flatten.cjs"),y=require("./array/group.cjs"),M=require("./array/list.cjs"),G=require("./array/map.cjs"),v=require("./array/pick.cjs"),N=require("./array/reduce.cjs"),b=require("./array/search.cjs"),h=require("./array/select.cjs"),k=require("./array/shift.cjs"),P=require("./array/some.cjs"),C=require("./array/sort.cjs"),x=require("./array/sortBy.cjs"),T=require("./array/substitute.cjs"),B=require("./array/uniq.cjs"),A=require("./date/expires.cjs"),D=require("./date/interval.cjs"),L=require("./date/timeDiff.cjs"),w=require("./function/assert.cjs"),U=require("./function/assertParams.cjs"),F=require("./function/attempt.cjs"),J=require("./function/compare.cjs"),W=require("./function/compareBy.cjs"),j=require("./function/compose.cjs"),Y=require("./function/curry.cjs"),Z=require("./function/debounce.cjs"),H=require("./function/delay.cjs"),Q=require("./function/fp.cjs"),V=require("./function/memo.cjs"),z=require("./function/once.cjs"),K=require("./function/pipe.cjs"),X=require("./function/predict.cjs"),$=require("./function/proxy.cjs"),ee=require("./function/retry.cjs"),re=require("./function/sleep.cjs"),ie=require("./function/throttle.cjs"),se=require("./function/worker.cjs"),te=require("./math/average.cjs"),ne=require("./math/boil.cjs"),oe=require("./math/clamp.cjs"),ce=require("./math/max.cjs"),ue=require("./math/median.cjs"),ae=require("./math/min.cjs"),qe=require("./math/range.cjs"),Re=require("./math/rate.cjs"),me=require("./math/round.cjs"),_e=require("./math/sum.cjs"),le=require("./object/clone.cjs"),pe=require("./object/diff.cjs"),Se=require("./object/entries.cjs"),de=require("./object/keys.cjs"),Ee=require("./object/merge.cjs"),fe=require("./object/parseJSON.cjs"),Ie=require("./object/path.cjs"),Oe=require("./object/seek.cjs"),ge=require("./object/values.cjs"),ye=require("./random/draw.cjs"),Me=require("./random/random.cjs"),Ge=require("./random/shuffle.cjs"),ve=require("./random/uuid.cjs"),Ne=require("./string/camelCase.cjs"),be=require("./string/kebabCase.cjs"),he=require("./string/pascalCase.cjs"),ke=require("./string/similarity.cjs"),Pe=require("./string/snakeCase.cjs"),Ce=require("./string/truncate.cjs"),xe=require("./typed/ge.cjs"),Te=require("./typed/gt.cjs"),Be=require("./typed/is.cjs"),e=require("./typed/isArray.cjs"),Ae=require("./typed/isBoolean.cjs"),r=require("./typed/isDate.cjs"),De=require("./typed/isDefined.cjs"),i=require("./typed/isEmpty.cjs"),s=require("./typed/isEqual.cjs"),Le=require("./typed/isEven.cjs"),t=require("./typed/isFunction.cjs"),we=require("./typed/isNegative.cjs"),n=require("./typed/isNil.cjs"),o=require("./typed/isNumber.cjs"),c=require("./typed/isObject.cjs"),Ue=require("./typed/isOdd.cjs"),Fe=require("./typed/isPositive.cjs"),u=require("./typed/isPrimitive.cjs"),a=require("./typed/isPromise.cjs"),Je=require("./typed/isRegex.cjs"),q=require("./typed/isString.cjs"),R=require("./typed/isWithin.cjs"),We=require("./typed/isZero.cjs"),je=require("./typed/le.cjs"),Ye=require("./typed/lt.cjs"),Ze=require("./typed/typeOf.cjs");exports.aggregate=m.aggregate;exports.alternate=_.alternate;exports.chunk=l.chunk;exports.compact=p.compact;exports.contains=S.contains;exports.every=d.every;exports.filter=E.filter;exports.find=f.find;exports.findIndex=I.findIndex;exports.findLast=O.findLast;exports.flatten=g.flatten;exports.group=y.group;exports.list=M.list;exports.map=G.map;exports.pick=v.pick;exports.reduce=N.reduce;exports.search=b.search;exports.select=h.select;exports.shift=k.shift;exports.some=P.some;exports.sort=C.sort;exports.sortBy=x.sortBy;exports.substitute=T.substitute;exports.uniq=B.uniq;exports.expires=A.expires;exports.interval=D.interval;exports.timeDiff=L.timeDiff;exports.assert=w.assert;exports.assertParams=U.assertParams;exports.attempt=F.attempt;exports.compare=J.compare;exports.compareBy=W.compareBy;exports.compose=j.compose;exports.curry=Y.curry;exports.debounce=Z.debounce;exports.delay=H.delay;exports.fp=Q.fp;exports.memo=V.memo;exports.once=z.once;exports.pipe=K.pipe;exports.predict=X.predict;exports.proxy=$.proxy;exports.retry=ee.retry;exports.sleep=re.sleep;exports.throttle=ie.throttle;exports.worker=se.worker;exports.average=te.average;exports.boil=ne.boil;exports.clamp=oe.clamp;exports.max=ce.max;exports.median=ue.median;exports.min=ae.min;exports.range=qe.range;exports.rate=Re.rate;exports.round=me.round;exports.sum=_e.sum;exports.clone=le.clone;exports.diff=pe.diff;exports.entries=Se.entries;exports.keys=de.keys;exports.merge=Ee.merge;exports.parseJSON=fe.parseJSON;exports.path=Ie.path;exports.seek=Oe.seek;exports.values=ge.values;exports.draw=ye.draw;exports.random=Me.random;exports.shuffle=Ge.shuffle;exports.uuid=ve.uuid;exports.camelCase=Ne.camelCase;exports.kebabCase=be.kebabCase;exports.pascalCase=he.pascalCase;exports.similarity=ke.similarity;exports.snakeCase=Pe.snakeCase;exports.truncate=Ce.truncate;exports.ge=xe.ge;exports.gt=Te.gt;exports.is=Be.is;exports.IS_ARRAY_ERROR_MSG=e.IS_ARRAY_ERROR_MSG;exports.isArray=e.isArray;exports.isBoolean=Ae.isBoolean;exports.IS_DATE_ERROR_MSG=r.IS_DATE_ERROR_MSG;exports.isDate=r.isDate;exports.isDefined=De.isDefined;exports.IS_EMPTY_ERROR_MSG=i.IS_EMPTY_ERROR_MSG;exports.isEmpty=i.isEmpty;exports.IS_EQUAL_ERROR_MSG=s.IS_EQUAL_ERROR_MSG;exports.isEqual=s.isEqual;exports.isEven=Le.isEven;exports.IS_FUNCTION_ERROR_MSG=t.IS_FUNCTION_ERROR_MSG;exports.isFunction=t.isFunction;exports.isNegative=we.isNegative;exports.IS_NIL_ERROR_MSG=n.IS_NIL_ERROR_MSG;exports.isNil=n.isNil;exports.IS_NUMBER_ERROR_MSG=o.IS_NUMBER_ERROR_MSG;exports.isNumber=o.isNumber;exports.IS_OBJECT_ERROR_MSG=c.IS_OBJECT_ERROR_MSG;exports.isObject=c.isObject;exports.isOdd=Ue.isOdd;exports.isPositive=Fe.isPositive;exports.IS_PRIMITIVE_ERROR_MSG=u.IS_PRIMITIVE_ERROR_MSG;exports.isPrimitive=u.isPrimitive;exports.IS_PROMISE_ERROR_MSG=a.IS_PROMISE_ERROR_MSG;exports.isPromise=a.isPromise;exports.isRegex=Je.isRegex;exports.IS_STRING_ERROR_MSG=q.IS_STRING_ERROR_MSG;exports.isString=q.isString;exports.IS_WITHIN_ERROR_MSG=R.IS_WITHIN_ERROR_MSG;exports.isWithin=R.isWithin;exports.isZero=We.isZero;exports.le=je.le;exports.lt=Ye.lt;exports.typeOf=Ze.typeOf;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const R=require("./array/aggregate.cjs"),m=require("./array/alternate.cjs"),p=require("./array/chunk.cjs"),_=require("./array/compact.cjs"),d=require("./array/contains.cjs"),S=require("./array/every.cjs"),E=require("./array/filter.cjs"),f=require("./array/find.cjs"),I=require("./array/findIndex.cjs"),g=require("./array/findLast.cjs"),O=require("./array/flatten.cjs"),y=require("./array/group.cjs"),M=require("./array/list.cjs"),b=require("./array/map.cjs"),v=require("./array/pick.cjs"),G=require("./array/reduce.cjs"),h=require("./array/remoteList.cjs"),N=require("./array/search.cjs"),k=require("./array/select.cjs"),P=require("./array/shift.cjs"),x=require("./array/some.cjs"),C=require("./array/sort.cjs"),T=require("./array/arrange.cjs"),A=require("./array/substitute.cjs"),D=require("./array/uniq.cjs"),B=require("./date/expires.cjs"),L=require("./date/interval.cjs"),w=require("./date/timeDiff.cjs"),U=require("./function/assert.cjs"),F=require("./function/assertParams.cjs"),J=require("./function/attempt.cjs"),W=require("./function/compare.cjs"),j=require("./function/compareBy.cjs"),Y=require("./function/compose.cjs"),Z=require("./function/curry.cjs"),H=require("./function/debounce.cjs"),Q=require("./function/delay.cjs"),V=require("./function/fp.cjs"),z=require("./function/memo.cjs"),K=require("./function/once.cjs"),X=require("./function/parallel.cjs"),$=require("./function/pipe.cjs"),ee=require("./function/predict.cjs"),re=require("./function/proxy.cjs"),ie=require("./function/prune.cjs"),se=require("./function/retry.cjs"),te=require("./function/sleep.cjs"),ne=require("./function/throttle.cjs"),oe=require("./function/worker.cjs"),ce=require("./math/abs.cjs"),ue=require("./math/add.cjs"),ae=require("./math/allocate.cjs"),qe=require("./math/average.cjs"),le=require("./math/boil.cjs"),Re=require("./math/clamp.cjs"),me=require("./math/distribute.cjs"),pe=require("./math/divide.cjs"),_e=require("./math/max.cjs"),de=require("./math/median.cjs"),Se=require("./math/min.cjs"),Ee=require("./math/multiply.cjs"),fe=require("./math/range.cjs"),Ie=require("./math/rate.cjs"),ge=require("./math/round.cjs"),Oe=require("./math/subtract.cjs"),ye=require("./math/sum.cjs"),Me=require("./money/currency.cjs"),be=require("./money/exchange.cjs"),ve=require("./object/clone.cjs"),Ge=require("./object/diff.cjs"),he=require("./object/entries.cjs"),Ne=require("./object/keys.cjs"),ke=require("./object/merge.cjs"),Pe=require("./object/parseJSON.cjs"),xe=require("./object/path.cjs"),Ce=require("./object/seek.cjs"),Te=require("./object/values.cjs"),Ae=require("./random/draw.cjs"),De=require("./random/random.cjs"),Be=require("./random/shuffle.cjs"),Le=require("./random/uuid.cjs"),we=require("./string/camelCase.cjs"),Ue=require("./string/kebabCase.cjs"),Fe=require("./string/pascalCase.cjs"),Je=require("./string/similarity.cjs"),We=require("./string/snakeCase.cjs"),je=require("./string/truncate.cjs"),Ye=require("./typed/ge.cjs"),Ze=require("./typed/gt.cjs"),He=require("./typed/is.cjs"),e=require("./typed/isArray.cjs"),Qe=require("./typed/isBoolean.cjs"),r=require("./typed/isDate.cjs"),Ve=require("./typed/isDefined.cjs"),i=require("./typed/isEmpty.cjs"),s=require("./typed/isEqual.cjs"),ze=require("./typed/isEven.cjs"),t=require("./typed/isFunction.cjs"),Ke=require("./typed/isNegative.cjs"),n=require("./typed/isNil.cjs"),o=require("./typed/isNumber.cjs"),c=require("./typed/isObject.cjs"),Xe=require("./typed/isOdd.cjs"),$e=require("./typed/isPositive.cjs"),u=require("./typed/isPrimitive.cjs"),a=require("./typed/isPromise.cjs"),er=require("./typed/isRegex.cjs"),q=require("./typed/isString.cjs"),l=require("./typed/isWithin.cjs"),rr=require("./typed/isZero.cjs"),ir=require("./typed/le.cjs"),sr=require("./typed/lt.cjs"),tr=require("./typed/typeOf.cjs");exports.aggregate=R.aggregate;exports.alternate=m.alternate;exports.chunk=p.chunk;exports.compact=_.compact;exports.contains=d.contains;exports.every=S.every;exports.filter=E.filter;exports.find=f.find;exports.findIndex=I.findIndex;exports.findLast=g.findLast;exports.flatten=O.flatten;exports.group=y.group;exports.list=M.list;exports.map=b.map;exports.pick=v.pick;exports.reduce=G.reduce;exports.remoteList=h.remoteList;exports.search=N.search;exports.select=k.select;exports.shift=P.shift;exports.some=x.some;exports.sort=C.sort;exports.arrange=T.arrange;exports.substitute=A.substitute;exports.uniq=D.uniq;exports.expires=B.expires;exports.interval=L.interval;exports.timeDiff=w.timeDiff;exports.assert=U.assert;exports.assertParams=F.assertParams;exports.attempt=J.attempt;exports.compare=W.compare;exports.compareBy=j.compareBy;exports.compose=Y.compose;exports.curry=Z.curry;exports.debounce=H.debounce;exports.delay=Q.delay;exports.fp=V.fp;exports.memo=z.memo;exports.once=K.once;exports.parallel=X.parallel;exports.pipe=$.pipe;exports.predict=ee.predict;exports.proxy=re.proxy;exports.prune=ie.prune;exports.retry=se.retry;exports.sleep=te.sleep;exports.throttle=ne.throttle;exports.worker=oe.worker;exports.abs=ce.abs;exports.add=ue.add;exports.allocate=ae.allocate;exports.average=qe.average;exports.boil=le.boil;exports.clamp=Re.clamp;exports.distribute=me.distribute;exports.divide=pe.divide;exports.max=_e.max;exports.median=de.median;exports.min=Se.min;exports.multiply=Ee.multiply;exports.range=fe.range;exports.rate=Ie.rate;exports.round=ge.round;exports.subtract=Oe.subtract;exports.sum=ye.sum;exports.currency=Me.currency;exports.exchange=be.exchange;exports.clone=ve.clone;exports.diff=Ge.diff;exports.entries=he.entries;exports.keys=Ne.keys;exports.merge=ke.merge;exports.parseJSON=Pe.parseJSON;exports.path=xe.path;exports.seek=Ce.seek;exports.values=Te.values;exports.draw=Ae.draw;exports.random=De.random;exports.shuffle=Be.shuffle;exports.uuid=Le.uuid;exports.camelCase=we.camelCase;exports.kebabCase=Ue.kebabCase;exports.pascalCase=Fe.pascalCase;exports.similarity=Je.similarity;exports.snakeCase=We.snakeCase;exports.truncate=je.truncate;exports.ge=Ye.ge;exports.gt=Ze.gt;exports.is=He.is;exports.IS_ARRAY_ERROR_MSG=e.IS_ARRAY_ERROR_MSG;exports.isArray=e.isArray;exports.isBoolean=Qe.isBoolean;exports.IS_DATE_ERROR_MSG=r.IS_DATE_ERROR_MSG;exports.isDate=r.isDate;exports.isDefined=Ve.isDefined;exports.IS_EMPTY_ERROR_MSG=i.IS_EMPTY_ERROR_MSG;exports.isEmpty=i.isEmpty;exports.IS_EQUAL_ERROR_MSG=s.IS_EQUAL_ERROR_MSG;exports.isEqual=s.isEqual;exports.isEven=ze.isEven;exports.IS_FUNCTION_ERROR_MSG=t.IS_FUNCTION_ERROR_MSG;exports.isFunction=t.isFunction;exports.isNegative=Ke.isNegative;exports.IS_NIL_ERROR_MSG=n.IS_NIL_ERROR_MSG;exports.isNil=n.isNil;exports.IS_NUMBER_ERROR_MSG=o.IS_NUMBER_ERROR_MSG;exports.isNumber=o.isNumber;exports.IS_OBJECT_ERROR_MSG=c.IS_OBJECT_ERROR_MSG;exports.isObject=c.isObject;exports.isOdd=Xe.isOdd;exports.isPositive=$e.isPositive;exports.IS_PRIMITIVE_ERROR_MSG=u.IS_PRIMITIVE_ERROR_MSG;exports.isPrimitive=u.isPrimitive;exports.IS_PROMISE_ERROR_MSG=a.IS_PROMISE_ERROR_MSG;exports.isPromise=a.isPromise;exports.isRegex=er.isRegex;exports.IS_STRING_ERROR_MSG=q.IS_STRING_ERROR_MSG;exports.isString=q.isString;exports.IS_WITHIN_ERROR_MSG=l.IS_WITHIN_ERROR_MSG;exports.isWithin=l.isWithin;exports.isZero=rr.isZero;exports.le=ir.le;exports.lt=sr.lt;exports.typeOf=tr.typeOf;
2
2
  //# sourceMappingURL=index.cjs.map