@ls-stack/utils 3.63.0 → 3.66.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/dist/{arrayUtils.d.cts → arrayUtils.d.mts} +24 -23
  2. package/dist/arrayUtils.mjs +249 -0
  3. package/dist/assertions-qMxfVhSu.mjs +207 -0
  4. package/dist/{assertions.d.ts → assertions.d.mts} +4 -3
  5. package/dist/assertions.mjs +3 -0
  6. package/dist/asyncQueue.d.mts +497 -0
  7. package/dist/asyncQueue.mjs +757 -0
  8. package/dist/{awaitDebounce.d.cts → awaitDebounce.d.mts} +11 -6
  9. package/dist/awaitDebounce.mjs +54 -0
  10. package/dist/{cache.d.ts → cache.d.mts} +76 -68
  11. package/dist/cache.mjs +355 -0
  12. package/dist/castValues-DfICShCc.mjs +19 -0
  13. package/dist/{castValues.d.cts → castValues.d.mts} +3 -2
  14. package/dist/castValues.mjs +3 -0
  15. package/dist/{concurrentCalls.d.ts → concurrentCalls.d.mts} +74 -65
  16. package/dist/concurrentCalls.mjs +295 -0
  17. package/dist/consoleFmt.d.mts +55 -0
  18. package/dist/consoleFmt.mjs +63 -0
  19. package/dist/conversions-DTmwEMIu.mjs +12 -0
  20. package/dist/conversions.d.mts +4 -0
  21. package/dist/conversions.mjs +3 -0
  22. package/dist/createThrottleController.d.mts +18 -0
  23. package/dist/createThrottleController.mjs +40 -0
  24. package/dist/debounce.d.mts +47 -0
  25. package/dist/debounce.mjs +117 -0
  26. package/dist/dedent.d.mts +74 -0
  27. package/dist/dedent.mjs +80 -0
  28. package/dist/deepEqual-C7EZEixx.mjs +78 -0
  29. package/dist/{deepEqual.d.cts → deepEqual.d.mts} +3 -2
  30. package/dist/deepEqual.mjs +3 -0
  31. package/dist/{deepReplaceValues.d.cts → deepReplaceValues.d.mts} +4 -3
  32. package/dist/deepReplaceValues.mjs +61 -0
  33. package/dist/diffParser.d.mts +63 -0
  34. package/dist/diffParser.mjs +410 -0
  35. package/dist/enhancedMap.d.mts +21 -0
  36. package/dist/enhancedMap.mjs +69 -0
  37. package/dist/exhaustiveMatch.d.mts +10 -0
  38. package/dist/exhaustiveMatch.mjs +48 -0
  39. package/dist/{filterObjectOrArrayKeys.d.cts → filterObjectOrArrayKeys.d.mts} +15 -8
  40. package/dist/filterObjectOrArrayKeys.mjs +497 -0
  41. package/dist/{getAutoIncrementId.d.cts → getAutoIncrementId.d.mts} +9 -5
  42. package/dist/getAutoIncrementId.mjs +53 -0
  43. package/dist/{getCompositeKey.d.cts → getCompositeKey.d.mts} +3 -2
  44. package/dist/getCompositeKey.mjs +50 -0
  45. package/dist/{getValueStableKey.d.cts → getValueStableKey.d.mts} +5 -3
  46. package/dist/getValueStableKey.mjs +17 -0
  47. package/dist/{hash.d.cts → hash.d.mts} +3 -2
  48. package/dist/hash.mjs +28 -0
  49. package/dist/interpolate.d.mts +17 -0
  50. package/dist/interpolate.mjs +28 -0
  51. package/dist/{iteratorUtils.d.cts → iteratorUtils.d.mts} +5 -4
  52. package/dist/iteratorUtils.mjs +39 -0
  53. package/dist/keepPrevIfUnchanged.d.mts +12 -0
  54. package/dist/keepPrevIfUnchanged.mjs +9 -0
  55. package/dist/keyedMap.d.mts +76 -0
  56. package/dist/keyedMap.mjs +139 -0
  57. package/dist/keyedSet.d.mts +77 -0
  58. package/dist/keyedSet.mjs +129 -0
  59. package/dist/{levenshtein.d.cts → levenshtein.d.mts} +3 -2
  60. package/dist/levenshtein.mjs +121 -0
  61. package/dist/main.d.mts +4 -0
  62. package/dist/main.mjs +7 -0
  63. package/dist/matchPath.d.mts +50 -0
  64. package/dist/matchPath.mjs +81 -0
  65. package/dist/mathUtils-BDP1lM_z.mjs +81 -0
  66. package/dist/{mathUtils.d.cts → mathUtils.d.mts} +3 -2
  67. package/dist/mathUtils.mjs +3 -0
  68. package/dist/{mutationUtils.d.cts → mutationUtils.d.mts} +6 -5
  69. package/dist/mutationUtils.mjs +44 -0
  70. package/dist/{objUtils.d.ts → objUtils.d.mts} +8 -6
  71. package/dist/objUtils.mjs +115 -0
  72. package/dist/parallelAsyncCalls.d.mts +83 -0
  73. package/dist/parallelAsyncCalls.mjs +121 -0
  74. package/dist/partialEqual.d.mts +139 -0
  75. package/dist/partialEqual.mjs +1055 -0
  76. package/dist/promiseUtils.d.mts +9 -0
  77. package/dist/promiseUtils.mjs +17 -0
  78. package/dist/regexUtils.d.mts +18 -0
  79. package/dist/regexUtils.mjs +34 -0
  80. package/dist/{retryOnError.d.cts → retryOnError.d.mts} +38 -37
  81. package/dist/retryOnError.mjs +91 -0
  82. package/dist/{runShellCmd.d.ts → runShellCmd.d.mts} +24 -15
  83. package/dist/runShellCmd.mjs +151 -0
  84. package/dist/{safeJson.d.cts → safeJson.d.mts} +3 -2
  85. package/dist/safeJson.mjs +30 -0
  86. package/dist/{saferTyping.d.cts → saferTyping.d.mts} +4 -3
  87. package/dist/saferTyping.mjs +45 -0
  88. package/dist/serializeXML.d.mts +23 -0
  89. package/dist/serializeXML.mjs +74 -0
  90. package/dist/{shallowEqual.d.cts → shallowEqual.d.mts} +3 -2
  91. package/dist/shallowEqual.mjs +54 -0
  92. package/dist/sleep.d.mts +4 -0
  93. package/dist/sleep.mjs +7 -0
  94. package/dist/stringUtils-DjhWOiYn.mjs +113 -0
  95. package/dist/{stringUtils.d.cts → stringUtils.d.mts} +3 -2
  96. package/dist/stringUtils.mjs +3 -0
  97. package/dist/{testUtils.d.ts → testUtils.d.mts} +83 -52
  98. package/dist/testUtils.mjs +310 -0
  99. package/dist/{throttle.d.ts → throttle.d.mts} +18 -17
  100. package/dist/throttle.mjs +102 -0
  101. package/dist/time-sr2lhQRw.mjs +67 -0
  102. package/dist/{time.d.ts → time.d.mts} +8 -7
  103. package/dist/time.mjs +3 -0
  104. package/dist/{timers.d.cts → timers.d.mts} +22 -13
  105. package/dist/timers.mjs +220 -0
  106. package/dist/{tsResult.d.cts → tsResult.d.mts} +52 -48
  107. package/dist/tsResult.mjs +142 -0
  108. package/dist/typeGuards-B1mzA-Rz.mjs +128 -0
  109. package/dist/{typeGuards.d.cts → typeGuards.d.mts} +3 -2
  110. package/dist/typeGuards.mjs +3 -0
  111. package/dist/{typeUtils.d.ts → typeUtils.d.mts} +13 -34
  112. package/dist/typeUtils.mjs +1 -0
  113. package/dist/{typedStrings.d.cts → typedStrings.d.mts} +5 -4
  114. package/dist/typedStrings.mjs +131 -0
  115. package/dist/typingFnUtils-Bb8drgKF.mjs +101 -0
  116. package/dist/{typingFnUtils.d.cts → typingFnUtils.d.mts} +13 -22
  117. package/dist/typingFnUtils.mjs +3 -0
  118. package/dist/{typingTestUtils.d.cts → typingTestUtils.d.mts} +11 -15
  119. package/dist/typingTestUtils.mjs +80 -0
  120. package/dist/typingUtils.d.mts +20 -0
  121. package/dist/typingUtils.mjs +1 -0
  122. package/dist/yamlStringify.d.mts +17 -0
  123. package/dist/yamlStringify.mjs +189 -0
  124. package/package.json +65 -234
  125. package/dist/arrayUtils.cjs +0 -229
  126. package/dist/arrayUtils.d.ts +0 -171
  127. package/dist/arrayUtils.js +0 -42
  128. package/dist/assertions.cjs +0 -107
  129. package/dist/assertions.d.cts +0 -192
  130. package/dist/assertions.js +0 -25
  131. package/dist/asyncQueue.cjs +0 -672
  132. package/dist/asyncQueue.d.cts +0 -488
  133. package/dist/asyncQueue.d.ts +0 -488
  134. package/dist/asyncQueue.js +0 -631
  135. package/dist/awaitDebounce.cjs +0 -106
  136. package/dist/awaitDebounce.d.ts +0 -41
  137. package/dist/awaitDebounce.js +0 -28
  138. package/dist/cache.cjs +0 -367
  139. package/dist/cache.d.cts +0 -228
  140. package/dist/cache.js +0 -19
  141. package/dist/castValues.cjs +0 -50
  142. package/dist/castValues.d.ts +0 -4
  143. package/dist/castValues.js +0 -8
  144. package/dist/chunk-5DZT3Z5Z.js +0 -8
  145. package/dist/chunk-6FBIEPWU.js +0 -96
  146. package/dist/chunk-6FIBVC2P.js +0 -56
  147. package/dist/chunk-7CQPOM5I.js +0 -100
  148. package/dist/chunk-B6DNOZCP.js +0 -369
  149. package/dist/chunk-BM4PYVOX.js +0 -109
  150. package/dist/chunk-C2SVCIWE.js +0 -57
  151. package/dist/chunk-CCUPDGSZ.js +0 -132
  152. package/dist/chunk-DBOWTYR4.js +0 -49
  153. package/dist/chunk-DFXNVEH6.js +0 -14
  154. package/dist/chunk-DX2524CZ.js +0 -314
  155. package/dist/chunk-GMJTLFM6.js +0 -60
  156. package/dist/chunk-IATIXMCE.js +0 -20
  157. package/dist/chunk-II4R3VVX.js +0 -25
  158. package/dist/chunk-JF2MDHOJ.js +0 -40
  159. package/dist/chunk-JQFUKJU5.js +0 -71
  160. package/dist/chunk-MI4UE2PQ.js +0 -561
  161. package/dist/chunk-PUKVXYYL.js +0 -52
  162. package/dist/chunk-QQS7I7ZL.js +0 -16
  163. package/dist/chunk-VAAMRG4K.js +0 -20
  164. package/dist/chunk-WFQJUJTC.js +0 -182
  165. package/dist/chunk-ZXIKIA5B.js +0 -178
  166. package/dist/concurrentCalls.cjs +0 -406
  167. package/dist/concurrentCalls.d.cts +0 -116
  168. package/dist/concurrentCalls.js +0 -346
  169. package/dist/consoleFmt.cjs +0 -85
  170. package/dist/consoleFmt.d.cts +0 -54
  171. package/dist/consoleFmt.d.ts +0 -54
  172. package/dist/consoleFmt.js +0 -60
  173. package/dist/conversions.cjs +0 -44
  174. package/dist/conversions.d.cts +0 -3
  175. package/dist/conversions.d.ts +0 -3
  176. package/dist/conversions.js +0 -6
  177. package/dist/createThrottleController.cjs +0 -193
  178. package/dist/createThrottleController.d.cts +0 -13
  179. package/dist/createThrottleController.d.ts +0 -13
  180. package/dist/createThrottleController.js +0 -61
  181. package/dist/debounce.cjs +0 -157
  182. package/dist/debounce.d.cts +0 -46
  183. package/dist/debounce.d.ts +0 -46
  184. package/dist/debounce.js +0 -8
  185. package/dist/dedent.cjs +0 -104
  186. package/dist/dedent.d.cts +0 -73
  187. package/dist/dedent.d.ts +0 -73
  188. package/dist/dedent.js +0 -79
  189. package/dist/deepEqual.cjs +0 -96
  190. package/dist/deepEqual.d.ts +0 -21
  191. package/dist/deepEqual.js +0 -8
  192. package/dist/deepReplaceValues.cjs +0 -87
  193. package/dist/deepReplaceValues.d.ts +0 -27
  194. package/dist/deepReplaceValues.js +0 -7
  195. package/dist/enhancedMap.cjs +0 -131
  196. package/dist/enhancedMap.d.cts +0 -20
  197. package/dist/enhancedMap.d.ts +0 -20
  198. package/dist/enhancedMap.js +0 -10
  199. package/dist/exhaustiveMatch.cjs +0 -66
  200. package/dist/exhaustiveMatch.d.cts +0 -9
  201. package/dist/exhaustiveMatch.d.ts +0 -9
  202. package/dist/exhaustiveMatch.js +0 -40
  203. package/dist/filterObjectOrArrayKeys.cjs +0 -619
  204. package/dist/filterObjectOrArrayKeys.d.ts +0 -88
  205. package/dist/filterObjectOrArrayKeys.js +0 -9
  206. package/dist/getAutoIncrementId.cjs +0 -44
  207. package/dist/getAutoIncrementId.d.ts +0 -46
  208. package/dist/getAutoIncrementId.js +0 -18
  209. package/dist/getCompositeKey.cjs +0 -86
  210. package/dist/getCompositeKey.d.ts +0 -11
  211. package/dist/getCompositeKey.js +0 -8
  212. package/dist/getValueStableKey.cjs +0 -89
  213. package/dist/getValueStableKey.d.ts +0 -15
  214. package/dist/getValueStableKey.js +0 -11
  215. package/dist/hash.cjs +0 -57
  216. package/dist/hash.d.ts +0 -7
  217. package/dist/hash.js +0 -32
  218. package/dist/interpolate.cjs +0 -88
  219. package/dist/interpolate.d.cts +0 -11
  220. package/dist/interpolate.d.ts +0 -11
  221. package/dist/interpolate.js +0 -46
  222. package/dist/iteratorUtils.cjs +0 -73
  223. package/dist/iteratorUtils.d.ts +0 -10
  224. package/dist/iteratorUtils.js +0 -44
  225. package/dist/keepPrevIfUnchanged.cjs +0 -102
  226. package/dist/keepPrevIfUnchanged.d.cts +0 -7
  227. package/dist/keepPrevIfUnchanged.d.ts +0 -7
  228. package/dist/keepPrevIfUnchanged.js +0 -7
  229. package/dist/levenshtein.cjs +0 -180
  230. package/dist/levenshtein.d.ts +0 -5
  231. package/dist/levenshtein.js +0 -153
  232. package/dist/main.cjs +0 -32
  233. package/dist/main.d.cts +0 -3
  234. package/dist/main.d.ts +0 -3
  235. package/dist/main.js +0 -7
  236. package/dist/matchPath.cjs +0 -155
  237. package/dist/matchPath.d.cts +0 -53
  238. package/dist/matchPath.d.ts +0 -53
  239. package/dist/matchPath.js +0 -108
  240. package/dist/mathUtils.cjs +0 -81
  241. package/dist/mathUtils.d.ts +0 -54
  242. package/dist/mathUtils.js +0 -22
  243. package/dist/mutationUtils.cjs +0 -153
  244. package/dist/mutationUtils.d.ts +0 -15
  245. package/dist/mutationUtils.js +0 -55
  246. package/dist/objUtils.cjs +0 -242
  247. package/dist/objUtils.d.cts +0 -28
  248. package/dist/objUtils.js +0 -38
  249. package/dist/parallelAsyncCalls.cjs +0 -162
  250. package/dist/parallelAsyncCalls.d.cts +0 -82
  251. package/dist/parallelAsyncCalls.d.ts +0 -82
  252. package/dist/parallelAsyncCalls.js +0 -126
  253. package/dist/partialEqual.cjs +0 -1196
  254. package/dist/partialEqual.d.cts +0 -141
  255. package/dist/partialEqual.d.ts +0 -141
  256. package/dist/partialEqual.js +0 -1168
  257. package/dist/promiseUtils.cjs +0 -38
  258. package/dist/promiseUtils.d.cts +0 -8
  259. package/dist/promiseUtils.d.ts +0 -8
  260. package/dist/promiseUtils.js +0 -6
  261. package/dist/regexUtils.cjs +0 -60
  262. package/dist/regexUtils.d.cts +0 -17
  263. package/dist/regexUtils.d.ts +0 -17
  264. package/dist/regexUtils.js +0 -33
  265. package/dist/retryOnError.cjs +0 -130
  266. package/dist/retryOnError.d.ts +0 -83
  267. package/dist/retryOnError.js +0 -101
  268. package/dist/runShellCmd.cjs +0 -127
  269. package/dist/runShellCmd.d.cts +0 -90
  270. package/dist/runShellCmd.js +0 -98
  271. package/dist/safeJson.cjs +0 -45
  272. package/dist/safeJson.d.ts +0 -16
  273. package/dist/safeJson.js +0 -8
  274. package/dist/saferTyping.cjs +0 -52
  275. package/dist/saferTyping.d.ts +0 -47
  276. package/dist/saferTyping.js +0 -23
  277. package/dist/serializeXML.cjs +0 -154
  278. package/dist/serializeXML.d.cts +0 -22
  279. package/dist/serializeXML.d.ts +0 -22
  280. package/dist/serializeXML.js +0 -116
  281. package/dist/shallowEqual.cjs +0 -88
  282. package/dist/shallowEqual.d.ts +0 -4
  283. package/dist/shallowEqual.js +0 -63
  284. package/dist/sleep.cjs +0 -32
  285. package/dist/sleep.d.cts +0 -3
  286. package/dist/sleep.d.ts +0 -3
  287. package/dist/sleep.js +0 -6
  288. package/dist/stringUtils.cjs +0 -155
  289. package/dist/stringUtils.d.ts +0 -55
  290. package/dist/stringUtils.js +0 -50
  291. package/dist/testUtils.cjs +0 -1490
  292. package/dist/testUtils.d.cts +0 -133
  293. package/dist/testUtils.js +0 -359
  294. package/dist/throttle.cjs +0 -282
  295. package/dist/throttle.d.cts +0 -98
  296. package/dist/throttle.js +0 -38
  297. package/dist/time.cjs +0 -152
  298. package/dist/time.d.cts +0 -25
  299. package/dist/time.js +0 -38
  300. package/dist/timers.cjs +0 -194
  301. package/dist/timers.d.ts +0 -121
  302. package/dist/timers.js +0 -156
  303. package/dist/tsResult.cjs +0 -226
  304. package/dist/tsResult.d.ts +0 -114
  305. package/dist/tsResult.js +0 -180
  306. package/dist/typeGuards.cjs +0 -70
  307. package/dist/typeGuards.d.ts +0 -111
  308. package/dist/typeGuards.js +0 -18
  309. package/dist/typeUtils.cjs +0 -18
  310. package/dist/typeUtils.d.cts +0 -61
  311. package/dist/typeUtils.js +0 -0
  312. package/dist/typedStrings.cjs +0 -90
  313. package/dist/typedStrings.d.ts +0 -163
  314. package/dist/typedStrings.js +0 -57
  315. package/dist/typingFnUtils.cjs +0 -96
  316. package/dist/typingFnUtils.d.ts +0 -100
  317. package/dist/typingFnUtils.js +0 -30
  318. package/dist/typingTestUtils.cjs +0 -52
  319. package/dist/typingTestUtils.d.ts +0 -79
  320. package/dist/typingTestUtils.js +0 -27
  321. package/dist/typingUtils.cjs +0 -18
  322. package/dist/typingUtils.d.cts +0 -35
  323. package/dist/typingUtils.d.ts +0 -35
  324. package/dist/typingUtils.js +0 -0
  325. package/dist/yamlStringify.cjs +0 -423
  326. package/dist/yamlStringify.d.cts +0 -10
  327. package/dist/yamlStringify.d.ts +0 -10
  328. package/dist/yamlStringify.js +0 -9
@@ -0,0 +1,9 @@
1
+ //#region src/promiseUtils.d.ts
2
+ type Deferred<T> = {
3
+ resolve: (value: T | PromiseLike<T>) => void;
4
+ reject: (reason: unknown) => void;
5
+ promise: Promise<T>;
6
+ };
7
+ declare function defer<T = void>(): Deferred<T>;
8
+ //#endregion
9
+ export { defer };
@@ -0,0 +1,17 @@
1
+ //#region src/promiseUtils.ts
2
+ function defer() {
3
+ let resolve;
4
+ let reject;
5
+ const promise = new Promise((_resolve, _reject) => {
6
+ resolve = _resolve;
7
+ reject = _reject;
8
+ });
9
+ return {
10
+ resolve,
11
+ reject,
12
+ promise
13
+ };
14
+ }
15
+
16
+ //#endregion
17
+ export { defer };
@@ -0,0 +1,18 @@
1
+ //#region src/regexUtils.d.ts
2
+ declare function getRegexMatches(string: string, regex: RegExp): {
3
+ groups: (string | undefined)[];
4
+ fullMatch: string | undefined;
5
+ };
6
+ declare function getRegexMatchAll(str: string, regexp: RegExp): Generator<{
7
+ groups: (string | undefined)[];
8
+ fullMatch: string;
9
+ namedGroups: {
10
+ [key: string]: string;
11
+ } | undefined;
12
+ start: number;
13
+ end: number;
14
+ prevEnd: number;
15
+ }, void, unknown>;
16
+ declare function escapeRegExp(value: string): string;
17
+ //#endregion
18
+ export { escapeRegExp, getRegexMatchAll, getRegexMatches };
@@ -0,0 +1,34 @@
1
+ //#region src/regexUtils.ts
2
+ function getRegexMatches(string, regex) {
3
+ const [fullMatch, ...groups] = regex.exec(string) || [void 0];
4
+ return {
5
+ groups,
6
+ fullMatch
7
+ };
8
+ }
9
+ function* getRegexMatchAll(str, regexp) {
10
+ const flags = regexp.global ? regexp.flags : `${regexp.flags}g`;
11
+ const re = new RegExp(regexp, flags);
12
+ let match;
13
+ let lastIndex = 0;
14
+ while (match = re.exec(str)) {
15
+ const [fullMatch, ...groups] = match;
16
+ const prevLastIndex = lastIndex;
17
+ lastIndex = re.lastIndex;
18
+ yield {
19
+ groups,
20
+ fullMatch,
21
+ namedGroups: match.groups,
22
+ start: match.index,
23
+ end: lastIndex,
24
+ prevEnd: prevLastIndex
25
+ };
26
+ }
27
+ }
28
+ const SPECIAL_REGEX_CHARS = /[.*+?^${}()|[\]\\]/g;
29
+ function escapeRegExp(value) {
30
+ return value.replace(SPECIAL_REGEX_CHARS, "\\$&");
31
+ }
32
+
33
+ //#endregion
34
+ export { escapeRegExp, getRegexMatchAll, getRegexMatches };
@@ -1,26 +1,27 @@
1
- import { ResultValidErrors, Result } from 't-result';
1
+ import { Result, ResultValidErrors } from "t-result";
2
2
 
3
+ //#region src/retryOnError.d.ts
3
4
  /** Configuration options for retryOnError function. */
4
5
  type RetryOptions = {
5
- /** Delay between retries in milliseconds or function returning delay */
6
- delayBetweenRetriesMs?: number | ((retry: number) => number);
7
- /**
8
- * Function to determine if retry should happen, receives error and duration
9
- * of last attempt
10
- */
11
- retryCondition?: (error: Error, lastAttempt: {
12
- duration: number;
13
- retry: number;
14
- }) => boolean;
15
- /** Optional ID for debug logging */
16
- debugId?: string;
17
- /** Disable retries */
18
- disableRetries?: boolean;
19
- /** Function to call when retry happens */
20
- onRetry?: (error: Error, lastAttempt: {
21
- duration: number;
22
- retry: number;
23
- }) => void;
6
+ /** Delay between retries in milliseconds or function returning delay */
7
+ delayBetweenRetriesMs?: number | ((retry: number) => number);
8
+ /**
9
+ * Function to determine if retry should happen, receives error and duration
10
+ * of last attempt
11
+ */
12
+ retryCondition?: (error: Error, lastAttempt: {
13
+ duration: number;
14
+ retry: number;
15
+ }) => boolean;
16
+ /** Optional ID for debug logging */
17
+ debugId?: string;
18
+ /** Disable retries */
19
+ disableRetries?: boolean;
20
+ /** Function to call when retry happens */
21
+ onRetry?: (error: Error, lastAttempt: {
22
+ duration: number;
23
+ retry: number;
24
+ }) => void;
24
25
  };
25
26
  /**
26
27
  * Retries a function on error with configurable retry logic.
@@ -44,8 +45,8 @@ type RetryOptions = {
44
45
  * error
45
46
  */
46
47
  declare function retryOnError<T>(fn: (ctx: {
47
- /** Current retry count, (0 for first attempt) */
48
- retry: number;
48
+ /** Current retry count, (0 for first attempt) */
49
+ retry: number;
49
50
  }) => Promise<T>, maxRetries: number, options?: RetryOptions, retry?: number, originalMaxRetries?: number): Promise<T>;
50
51
  /**
51
52
  * Retries a result function on error with configurable retry logic.
@@ -64,20 +65,20 @@ declare function retryOnError<T>(fn: (ctx: {
64
65
  * error
65
66
  */
66
67
  declare function retryResultOnError<T, E extends ResultValidErrors>(fn: (ctx: {
67
- /** Current retry count, (0 for first attempt) */
68
- retry: number;
68
+ /** Current retry count, (0 for first attempt) */
69
+ retry: number;
69
70
  }) => Promise<Result<T, E>>, maxRetries: number, options?: {
70
- delayBetweenRetriesMs?: number | ((retry: number) => number);
71
- retryCondition?: (error: E, lastAttempt: {
72
- duration: number;
73
- retry: number;
74
- }) => boolean;
75
- debugId?: string;
76
- disableRetries?: boolean;
77
- onRetry?: (error: E, lastAttempt: {
78
- duration: number;
79
- retry: number;
80
- }) => void;
71
+ delayBetweenRetriesMs?: number | ((retry: number) => number);
72
+ retryCondition?: (error: E, lastAttempt: {
73
+ duration: number;
74
+ retry: number;
75
+ }) => boolean;
76
+ debugId?: string;
77
+ disableRetries?: boolean;
78
+ onRetry?: (error: E, lastAttempt: {
79
+ duration: number;
80
+ retry: number;
81
+ }) => void;
81
82
  }, __retry?: number, __originalMaxRetries?: number): Promise<Result<T, E>>;
82
-
83
- export { retryOnError, retryResultOnError };
83
+ //#endregion
84
+ export { retryOnError, retryResultOnError };
@@ -0,0 +1,91 @@
1
+ import { sleep } from "./sleep.mjs";
2
+ import { unknownToError } from "t-result";
3
+
4
+ //#region src/retryOnError.ts
5
+ /**
6
+ * Retries a function on error with configurable retry logic.
7
+ *
8
+ * @example
9
+ * await retryOnError(
10
+ * async (ctx) => {
11
+ * console.log(`Attempt ${ctx.retry + 1}`);
12
+ * return await fetchData();
13
+ * },
14
+ * 3,
15
+ * { delayBetweenRetriesMs: 1000 },
16
+ * );
17
+ *
18
+ * @param fn - Function to retry that receives context with retry count
19
+ * @param maxRetries - Maximum number of retries
20
+ * @param options - Configuration options
21
+ * @param retry - Internal use only
22
+ * @param originalMaxRetries - Internal use only
23
+ * @returns Promise resolving to the function result or rejecting with the final
24
+ * error
25
+ */
26
+ async function retryOnError(fn, maxRetries, options = {}, retry = 0, originalMaxRetries = maxRetries) {
27
+ const { delayBetweenRetriesMs, retryCondition, disableRetries, onRetry } = options;
28
+ if (options.debugId) {
29
+ if (retry > 0) console.info(`Retrying ${options.debugId} (retry ${retry}/${originalMaxRetries}) after error`);
30
+ }
31
+ const startTime = Date.now();
32
+ try {
33
+ return await fn({ retry });
34
+ } catch (error) {
35
+ if (maxRetries > 0 && !disableRetries) {
36
+ const errorDuration = Date.now() - startTime;
37
+ const normalizedError = unknownToError(error);
38
+ if (!(retryCondition ? retryCondition(normalizedError, {
39
+ duration: errorDuration,
40
+ retry
41
+ }) : true)) throw normalizedError;
42
+ if (onRetry) onRetry(normalizedError, {
43
+ duration: errorDuration,
44
+ retry
45
+ });
46
+ if (delayBetweenRetriesMs) await sleep(typeof delayBetweenRetriesMs === "function" ? delayBetweenRetriesMs(retry) : delayBetweenRetriesMs);
47
+ return retryOnError(fn, maxRetries - 1, options, retry + 1, originalMaxRetries);
48
+ } else throw error;
49
+ }
50
+ }
51
+ /**
52
+ * Retries a result function on error with configurable retry logic.
53
+ *
54
+ * @param fn - Function to retry that receives context with retry count
55
+ * @param maxRetries - Maximum number of retries
56
+ * @param options - Configuration options
57
+ * @param options.delayBetweenRetriesMs
58
+ * @param options.retryCondition
59
+ * @param options.debugId
60
+ * @param options.disableRetries
61
+ * @param options.onRetry
62
+ * @param __retry - Internal use only
63
+ * @param __originalMaxRetries - Internal use only
64
+ * @returns Promise resolving to the function result or rejecting with the final
65
+ * error
66
+ */
67
+ async function retryResultOnError(fn, maxRetries, options = {}, __retry = 0, __originalMaxRetries = maxRetries) {
68
+ const { delayBetweenRetriesMs, retryCondition, onRetry } = options;
69
+ if (options.debugId) {
70
+ if (__retry > 0) console.info(`Retrying ${options.debugId} (retry ${__retry}/${__originalMaxRetries}) after error`);
71
+ }
72
+ const startTime = Date.now();
73
+ const result = await fn({ retry: __retry });
74
+ if (result.ok) return result;
75
+ if (maxRetries > 0 && !options.disableRetries) {
76
+ const errorDuration = Date.now() - startTime;
77
+ if (!(retryCondition ? retryCondition(result.error, {
78
+ duration: errorDuration,
79
+ retry: __retry
80
+ }) : true)) return result;
81
+ if (onRetry) onRetry(result.error, {
82
+ duration: errorDuration,
83
+ retry: __retry
84
+ });
85
+ if (delayBetweenRetriesMs) await sleep(typeof delayBetweenRetriesMs === "function" ? delayBetweenRetriesMs(__retry) : delayBetweenRetriesMs);
86
+ return retryResultOnError(fn, maxRetries - 1, options, __retry + 1, __originalMaxRetries);
87
+ } else return result;
88
+ }
89
+
90
+ //#endregion
91
+ export { retryOnError, retryResultOnError };
@@ -1,16 +1,17 @@
1
+ //#region src/runShellCmd.d.ts
1
2
  type CmdResult = {
2
- label: string | null;
3
- out: string;
4
- error: boolean;
5
- stdout: string;
6
- stderr: string;
3
+ label: string | null;
4
+ out: string;
5
+ error: boolean;
6
+ stdout: string;
7
+ stderr: string;
7
8
  };
8
9
  type RunCmdOptions = {
9
- mock?: CmdResult;
10
- silent?: boolean | 'timeOnly';
11
- cwd?: string;
12
- throwOnError?: boolean;
13
- noCiColorForce?: boolean;
10
+ mock?: CmdResult;
11
+ silent?: boolean | 'timeOnly';
12
+ cwd?: string;
13
+ throwOnError?: boolean;
14
+ noCiColorForce?: boolean;
14
15
  };
15
16
  /**
16
17
  * @deprecated This utility has been moved to @ls-stack/node-utils. Please
@@ -30,7 +31,13 @@ type RunCmdOptions = {
30
31
  * @param root0.cwd
31
32
  * @param root0.noCiColorForce
32
33
  */
33
- declare function runCmd(label: string | null, command: string | string[], { mock, silent, throwOnError, cwd, noCiColorForce, }?: RunCmdOptions): Promise<CmdResult>;
34
+ declare function runCmd(label: string | null, command: string | string[], {
35
+ mock,
36
+ silent,
37
+ throwOnError,
38
+ cwd,
39
+ noCiColorForce
40
+ }?: RunCmdOptions): Promise<CmdResult>;
34
41
  /**
35
42
  * @deprecated This utility has been moved to @ls-stack/node-utils. Please
36
43
  * update your imports:
@@ -59,8 +66,10 @@ declare function concurrentCmd(label: string, cmd: string | string[], onResult:
59
66
  * @param root0
60
67
  * @param root0.silent
61
68
  */
62
- declare function runCmdUnwrap(label: string | null, command: string | string[], { silent, }?: {
63
- silent?: boolean | 'timeOnly';
69
+ declare function runCmdUnwrap(label: string | null, command: string | string[], {
70
+ silent
71
+ }?: {
72
+ silent?: boolean | 'timeOnly';
64
73
  }): Promise<string>;
65
74
  /**
66
75
  * @deprecated This utility has been moved to @ls-stack/node-utils. Please
@@ -86,5 +95,5 @@ declare function runCmdSilent(command: string | string[]): Promise<CmdResult>;
86
95
  * @param command
87
96
  */
88
97
  declare function runCmdSilentUnwrap(command: string | string[]): Promise<string>;
89
-
90
- export { concurrentCmd, runCmd, runCmdSilent, runCmdSilentUnwrap, runCmdUnwrap };
98
+ //#endregion
99
+ export { concurrentCmd, runCmd, runCmdSilent, runCmdSilentUnwrap, runCmdUnwrap };
@@ -0,0 +1,151 @@
1
+ import { spawn } from "child_process";
2
+
3
+ //#region src/runShellCmd.ts
4
+ /**
5
+ * @deprecated This utility has been moved to @ls-stack/node-utils. Please
6
+ * update your imports:
7
+ *
8
+ * // Old (deprecated)
9
+ * import { runCmd } from '@ls-stack/utils/runShellCmd';
10
+ *
11
+ * // New (preferred)
12
+ * import { runCmd } from '@ls-stack/node-utils/runShellCmd';
13
+ * @param label
14
+ * @param command
15
+ * @param root0
16
+ * @param root0.mock
17
+ * @param root0.silent
18
+ * @param root0.throwOnError
19
+ * @param root0.cwd
20
+ * @param root0.noCiColorForce
21
+ */
22
+ function runCmd(label, command, { mock, silent, throwOnError, cwd = process.cwd(), noCiColorForce } = {}) {
23
+ if (mock) return Promise.resolve(mock);
24
+ if (label && (!silent || silent === "timeOnly")) {
25
+ console.log(`----${label}----`);
26
+ console.time("✅");
27
+ }
28
+ return new Promise((resolve) => {
29
+ const [cmd = "", ...args] = Array.isArray(command) ? command.flatMap((item) => item.startsWith("$") ? item.replace("$", "").split(" ") : item) : command.split(" ");
30
+ const child = spawn(cmd, args, {
31
+ cwd,
32
+ env: noCiColorForce ? void 0 : {
33
+ ...process.env,
34
+ CLICOLOR_FORCE: "1"
35
+ }
36
+ });
37
+ let stdout = "";
38
+ let stderr = "";
39
+ let out = "";
40
+ child.stdout.on("data", (data) => {
41
+ stdout += String(data);
42
+ out += String(data);
43
+ if (!silent) console.log(String(data));
44
+ });
45
+ child.stderr.on("data", (data) => {
46
+ stderr += String(data);
47
+ out += String(data);
48
+ if (!silent) console.log(String(data));
49
+ });
50
+ child.on("close", (code) => {
51
+ const hasError = code !== 0;
52
+ if (!silent || silent === "timeOnly") {
53
+ if (!hasError) console.timeEnd("✅");
54
+ console.log("\n");
55
+ }
56
+ if (throwOnError && hasError) {
57
+ if (silent) {
58
+ if (label) console.log(`----${label}----`);
59
+ else console.trace();
60
+ console.error(stderr);
61
+ }
62
+ process.exit(1);
63
+ }
64
+ resolve({
65
+ label,
66
+ out,
67
+ stderr,
68
+ stdout,
69
+ error: hasError
70
+ });
71
+ });
72
+ });
73
+ }
74
+ /**
75
+ * @deprecated This utility has been moved to @ls-stack/node-utils. Please
76
+ * update your imports:
77
+ *
78
+ * // Old (deprecated)
79
+ * import { concurrentCmd } from '@ls-stack/utils/runShellCmd';
80
+ *
81
+ * // New (preferred)
82
+ * import { concurrentCmd } from '@ls-stack/node-utils/runShellCmd';
83
+ * @param label
84
+ * @param cmd
85
+ * @param onResult
86
+ */
87
+ async function concurrentCmd(label, cmd, onResult) {
88
+ const start = Date.now();
89
+ const result = await runCmd(label, cmd, { silent: true });
90
+ onResult(result);
91
+ const elapsedSeconds = (Date.now() - start) / 1e3;
92
+ console.log(`${result.error ? "🔴" : "✅"} ${result.label} (${elapsedSeconds.toFixed(1)}s)`);
93
+ return () => {
94
+ if (result.error) {
95
+ console.log(`❌ ${result.label} errors:`);
96
+ console.log(result.out);
97
+ console.log("\n");
98
+ }
99
+ };
100
+ }
101
+ /**
102
+ * @deprecated This utility has been moved to @ls-stack/node-utils. Please
103
+ * update your imports:
104
+ *
105
+ * // Old (deprecated)
106
+ * import { runCmdUnwrap } from '@ls-stack/utils/runShellCmd';
107
+ *
108
+ * // New (preferred)
109
+ * import { runCmdUnwrap } from '@ls-stack/node-utils/runShellCmd';
110
+ * @param label
111
+ * @param command
112
+ * @param root0
113
+ * @param root0.silent
114
+ */
115
+ async function runCmdUnwrap(label, command, { silent } = {}) {
116
+ return (await runCmd(label, command, {
117
+ silent,
118
+ throwOnError: true
119
+ })).stdout;
120
+ }
121
+ /**
122
+ * @deprecated This utility has been moved to @ls-stack/node-utils. Please
123
+ * update your imports:
124
+ *
125
+ * // Old (deprecated)
126
+ * import { runCmdSilent } from '@ls-stack/utils/runShellCmd';
127
+ *
128
+ * // New (preferred)
129
+ * import { runCmdSilent } from '@ls-stack/node-utils/runShellCmd';
130
+ * @param command
131
+ */
132
+ function runCmdSilent(command) {
133
+ return runCmd(null, command, { silent: true });
134
+ }
135
+ /**
136
+ * @deprecated This utility has been moved to @ls-stack/node-utils. Please
137
+ * update your imports:
138
+ *
139
+ * // Old (deprecated)
140
+ * import { runCmdSilentUnwrap } from '@ls-stack/utils/runShellCmd';
141
+ *
142
+ * // New (preferred)
143
+ * import { runCmdSilentUnwrap } from '@ls-stack/node-utils/runShellCmd';
144
+ * @param command
145
+ */
146
+ function runCmdSilentUnwrap(command) {
147
+ return runCmdUnwrap(null, command, { silent: true });
148
+ }
149
+
150
+ //#endregion
151
+ export { concurrentCmd, runCmd, runCmdSilent, runCmdSilentUnwrap, runCmdUnwrap };
@@ -1,3 +1,4 @@
1
+ //#region src/safeJson.d.ts
1
2
  /**
2
3
  * JSON.stringify can throw if the value is circular or contains functions, this
3
4
  * function catches those errors and returns undefined
@@ -12,5 +13,5 @@ declare function safeJsonStringify(value: unknown): string | undefined;
12
13
  * @param value
13
14
  */
14
15
  declare function safeJsonParse(value: string): unknown;
15
-
16
- export { safeJsonParse, safeJsonStringify };
16
+ //#endregion
17
+ export { safeJsonParse, safeJsonStringify };
@@ -0,0 +1,30 @@
1
+ //#region src/safeJson.ts
2
+ /**
3
+ * JSON.stringify can throw if the value is circular or contains functions, this
4
+ * function catches those errors and returns undefined
5
+ *
6
+ * @param value
7
+ */
8
+ function safeJsonStringify(value) {
9
+ try {
10
+ return JSON.stringify(value);
11
+ } catch (_) {
12
+ return;
13
+ }
14
+ }
15
+ /**
16
+ * JSON.parse can throw if the value is not valid JSON, this function catches
17
+ * those errors and returns undefined
18
+ *
19
+ * @param value
20
+ */
21
+ function safeJsonParse(value) {
22
+ try {
23
+ return JSON.parse(value);
24
+ } catch (_) {
25
+ return;
26
+ }
27
+ }
28
+
29
+ //#endregion
30
+ export { safeJsonParse, safeJsonStringify };
@@ -1,8 +1,10 @@
1
+ //#region src/saferTyping.d.ts
1
2
  /**
2
3
  * Use this only when you have 100% of certainty that this will not break the
3
4
  * types
4
5
  */
5
6
  type __LEGIT_ANY__ = any;
7
+ type __FIX_THIS_TYPING__ = any;
6
8
  type __LEGIT_ANY_FUNCTION__ = (...params: any) => __LEGIT_ANY__;
7
9
  /** An empty object type, equivalent to `{}` but with safer typing */
8
10
  type EmptyObject = Record<string, never>;
@@ -36,12 +38,11 @@ declare function __LEGIT_CAST__<T, V = unknown>(value: V): T;
36
38
  */
37
39
  declare function __REFINE_CAST__<T>(value: T): <R extends T>() => R;
38
40
  declare function __FIX_THIS_CASTING__<T>(value: unknown): T;
39
- type __FIX_THIS_TYPING__ = any;
40
41
  declare function __FIX_THIS_TYPING__(value: unknown): __LEGIT_ANY__;
41
42
  /**
42
43
  * Any type that is not a primitive (number, string, boolean, null, undefined,
43
44
  * symbol, bigint, ...) Equivalent to `object` type
44
45
  */
45
46
  type AnyNonPrimitiveValue = object;
46
-
47
- export { type AnyNonPrimitiveValue, type EmptyObject, __FIX_THIS_CASTING__, __FIX_THIS_TYPING__, __LEGIT_ANY_CAST__, type __LEGIT_ANY_FUNCTION__, type __LEGIT_ANY__, __LEGIT_CAST__, __REFINE_CAST__ };
47
+ //#endregion
48
+ export { AnyNonPrimitiveValue, EmptyObject, __FIX_THIS_CASTING__, __FIX_THIS_TYPING__, __LEGIT_ANY_CAST__, __LEGIT_ANY_FUNCTION__, __LEGIT_ANY__, __LEGIT_CAST__, __REFINE_CAST__ };
@@ -0,0 +1,45 @@
1
+ //#region src/saferTyping.ts
2
+ /**
3
+ * Cast a value to `any` type. Use this when you have legit usage of `any`
4
+ * casting.
5
+ *
6
+ * @template V (optional) - When used enforces that the casted value is
7
+ * assignable to the type V, use it for safer casts
8
+ * @param value
9
+ */
10
+ function __LEGIT_ANY_CAST__(value) {
11
+ return value;
12
+ }
13
+ /**
14
+ * Cast a value to a specific type T. Use this when you have legit usage of type
15
+ * assertion.
16
+ *
17
+ * @template T - The type to cast to
18
+ * @template V (optional) - When used enforces that the casted value is
19
+ * assignable to the type V, use it for safer casts
20
+ * @param value
21
+ */
22
+ function __LEGIT_CAST__(value) {
23
+ return value;
24
+ }
25
+ /**
26
+ * Refine a value to a specific type T. Use this when you have legit usage of
27
+ * type assertion.
28
+ *
29
+ * @template T - The type to cast to
30
+ * @template V (optional) - When used enforces that the casted value is
31
+ * assignable to the type V, use it for safer casts
32
+ * @param value
33
+ */
34
+ function __REFINE_CAST__(value) {
35
+ return () => value;
36
+ }
37
+ function __FIX_THIS_CASTING__(value) {
38
+ return value;
39
+ }
40
+ function __FIX_THIS_TYPING__(value) {
41
+ return value;
42
+ }
43
+
44
+ //#endregion
45
+ export { __FIX_THIS_CASTING__, __FIX_THIS_TYPING__, __LEGIT_ANY_CAST__, __LEGIT_CAST__, __REFINE_CAST__ };
@@ -0,0 +1,23 @@
1
+ //#region src/serializeXML.d.ts
2
+ type XMLNode = {
3
+ type?: 'node';
4
+ name: string;
5
+ attrs?: Record<string, string | number | boolean | null | undefined>;
6
+ children?: (XMLNode | null | undefined | false)[] | string;
7
+ escapeText?: boolean;
8
+ } | {
9
+ type: 'comment';
10
+ content: string;
11
+ escapeText?: boolean;
12
+ } | {
13
+ type: 'emptyLine';
14
+ };
15
+ type SerializeOptions = {
16
+ indent?: number | string;
17
+ escapeText?: boolean;
18
+ validateTagName?: boolean;
19
+ invalidNodes?: 'throw' | 'reject';
20
+ };
21
+ declare function serializeXML(node: XMLNode | (XMLNode | null | undefined | false)[], options?: SerializeOptions): string;
22
+ //#endregion
23
+ export { SerializeOptions, XMLNode, serializeXML };