@ls-stack/utils 3.65.0 → 3.67.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.
- package/dist/{arrayUtils.d.cts → arrayUtils.d.mts} +24 -23
- package/dist/arrayUtils.mjs +249 -0
- package/dist/assertions-qMxfVhSu.mjs +207 -0
- package/dist/{assertions.d.ts → assertions.d.mts} +4 -3
- package/dist/assertions.mjs +3 -0
- package/dist/asyncQueue.d.mts +497 -0
- package/dist/asyncQueue.mjs +757 -0
- package/dist/{awaitDebounce.d.cts → awaitDebounce.d.mts} +11 -6
- package/dist/awaitDebounce.mjs +54 -0
- package/dist/{cache.d.ts → cache.d.mts} +76 -68
- package/dist/cache.mjs +355 -0
- package/dist/castValues-DfICShCc.mjs +19 -0
- package/dist/{castValues.d.cts → castValues.d.mts} +3 -2
- package/dist/castValues.mjs +3 -0
- package/dist/{concurrentCalls.d.ts → concurrentCalls.d.mts} +74 -65
- package/dist/concurrentCalls.mjs +295 -0
- package/dist/consoleFmt.d.mts +55 -0
- package/dist/consoleFmt.mjs +63 -0
- package/dist/conversions-DTmwEMIu.mjs +12 -0
- package/dist/conversions.d.mts +4 -0
- package/dist/conversions.mjs +3 -0
- package/dist/createThrottleController.d.mts +18 -0
- package/dist/createThrottleController.mjs +40 -0
- package/dist/debounce.d.mts +47 -0
- package/dist/debounce.mjs +117 -0
- package/dist/dedent.d.mts +74 -0
- package/dist/dedent.mjs +80 -0
- package/dist/deepEqual-C7EZEixx.mjs +78 -0
- package/dist/{deepEqual.d.cts → deepEqual.d.mts} +3 -2
- package/dist/deepEqual.mjs +3 -0
- package/dist/{deepReplaceValues.d.cts → deepReplaceValues.d.mts} +4 -3
- package/dist/deepReplaceValues.mjs +61 -0
- package/dist/diffParser.d.mts +79 -0
- package/dist/diffParser.mjs +424 -0
- package/dist/enhancedMap.d.mts +21 -0
- package/dist/enhancedMap.mjs +69 -0
- package/dist/exhaustiveMatch.d.mts +10 -0
- package/dist/exhaustiveMatch.mjs +48 -0
- package/dist/{filterObjectOrArrayKeys.d.cts → filterObjectOrArrayKeys.d.mts} +15 -8
- package/dist/filterObjectOrArrayKeys.mjs +497 -0
- package/dist/{getAutoIncrementId.d.cts → getAutoIncrementId.d.mts} +9 -5
- package/dist/getAutoIncrementId.mjs +53 -0
- package/dist/{getCompositeKey.d.cts → getCompositeKey.d.mts} +3 -2
- package/dist/getCompositeKey.mjs +50 -0
- package/dist/{getValueStableKey.d.cts → getValueStableKey.d.mts} +5 -3
- package/dist/getValueStableKey.mjs +17 -0
- package/dist/{hash.d.cts → hash.d.mts} +3 -2
- package/dist/hash.mjs +28 -0
- package/dist/interpolate.d.mts +17 -0
- package/dist/interpolate.mjs +28 -0
- package/dist/{iteratorUtils.d.cts → iteratorUtils.d.mts} +5 -4
- package/dist/iteratorUtils.mjs +39 -0
- package/dist/keepPrevIfUnchanged.d.mts +12 -0
- package/dist/keepPrevIfUnchanged.mjs +9 -0
- package/dist/keyedMap.d.mts +76 -0
- package/dist/keyedMap.mjs +139 -0
- package/dist/keyedSet.d.mts +77 -0
- package/dist/keyedSet.mjs +129 -0
- package/dist/{levenshtein.d.cts → levenshtein.d.mts} +3 -2
- package/dist/levenshtein.mjs +121 -0
- package/dist/main.d.mts +4 -0
- package/dist/main.mjs +7 -0
- package/dist/matchPath.d.mts +50 -0
- package/dist/matchPath.mjs +81 -0
- package/dist/mathUtils-BDP1lM_z.mjs +81 -0
- package/dist/{mathUtils.d.cts → mathUtils.d.mts} +3 -2
- package/dist/mathUtils.mjs +3 -0
- package/dist/{mutationUtils.d.cts → mutationUtils.d.mts} +6 -5
- package/dist/mutationUtils.mjs +44 -0
- package/dist/{objUtils.d.ts → objUtils.d.mts} +8 -6
- package/dist/objUtils.mjs +115 -0
- package/dist/parallelAsyncCalls.d.mts +83 -0
- package/dist/parallelAsyncCalls.mjs +121 -0
- package/dist/partialEqual.d.mts +139 -0
- package/dist/partialEqual.mjs +1055 -0
- package/dist/promiseUtils.d.mts +9 -0
- package/dist/promiseUtils.mjs +17 -0
- package/dist/regexUtils.d.mts +18 -0
- package/dist/regexUtils.mjs +34 -0
- package/dist/{retryOnError.d.cts → retryOnError.d.mts} +38 -37
- package/dist/retryOnError.mjs +91 -0
- package/dist/{runShellCmd.d.ts → runShellCmd.d.mts} +24 -15
- package/dist/runShellCmd.mjs +151 -0
- package/dist/{safeJson.d.cts → safeJson.d.mts} +3 -2
- package/dist/safeJson.mjs +30 -0
- package/dist/{saferTyping.d.cts → saferTyping.d.mts} +4 -3
- package/dist/saferTyping.mjs +45 -0
- package/dist/serializeXML.d.mts +23 -0
- package/dist/serializeXML.mjs +74 -0
- package/dist/{shallowEqual.d.cts → shallowEqual.d.mts} +3 -2
- package/dist/shallowEqual.mjs +54 -0
- package/dist/sleep.d.mts +4 -0
- package/dist/sleep.mjs +7 -0
- package/dist/stringUtils-DjhWOiYn.mjs +113 -0
- package/dist/{stringUtils.d.cts → stringUtils.d.mts} +3 -2
- package/dist/stringUtils.mjs +3 -0
- package/dist/{testUtils.d.ts → testUtils.d.mts} +83 -52
- package/dist/testUtils.mjs +310 -0
- package/dist/{throttle.d.ts → throttle.d.mts} +18 -17
- package/dist/throttle.mjs +102 -0
- package/dist/time-sr2lhQRw.mjs +67 -0
- package/dist/{time.d.ts → time.d.mts} +8 -7
- package/dist/time.mjs +3 -0
- package/dist/{timers.d.cts → timers.d.mts} +22 -13
- package/dist/timers.mjs +220 -0
- package/dist/{tsResult.d.cts → tsResult.d.mts} +52 -48
- package/dist/tsResult.mjs +142 -0
- package/dist/typeGuards-B1mzA-Rz.mjs +128 -0
- package/dist/{typeGuards.d.cts → typeGuards.d.mts} +3 -2
- package/dist/typeGuards.mjs +3 -0
- package/dist/{typeUtils.d.ts → typeUtils.d.mts} +13 -34
- package/dist/typeUtils.mjs +1 -0
- package/dist/{typedStrings.d.cts → typedStrings.d.mts} +5 -4
- package/dist/typedStrings.mjs +131 -0
- package/dist/typingFnUtils-Bb8drgKF.mjs +101 -0
- package/dist/{typingFnUtils.d.cts → typingFnUtils.d.mts} +13 -22
- package/dist/typingFnUtils.mjs +3 -0
- package/dist/{typingTestUtils.d.cts → typingTestUtils.d.mts} +11 -15
- package/dist/typingTestUtils.mjs +80 -0
- package/dist/typingUtils.d.mts +20 -0
- package/dist/typingUtils.mjs +1 -0
- package/dist/yamlStringify.d.mts +17 -0
- package/dist/yamlStringify.mjs +189 -0
- package/package.json +65 -242
- package/dist/arrayUtils.cjs +0 -229
- package/dist/arrayUtils.d.ts +0 -171
- package/dist/arrayUtils.js +0 -42
- package/dist/assertions.cjs +0 -107
- package/dist/assertions.d.cts +0 -192
- package/dist/assertions.js +0 -25
- package/dist/asyncQueue.cjs +0 -672
- package/dist/asyncQueue.d.cts +0 -488
- package/dist/asyncQueue.d.ts +0 -488
- package/dist/asyncQueue.js +0 -631
- package/dist/awaitDebounce.cjs +0 -106
- package/dist/awaitDebounce.d.ts +0 -41
- package/dist/awaitDebounce.js +0 -28
- package/dist/cache.cjs +0 -367
- package/dist/cache.d.cts +0 -228
- package/dist/cache.js +0 -19
- package/dist/castValues.cjs +0 -50
- package/dist/castValues.d.ts +0 -4
- package/dist/castValues.js +0 -8
- package/dist/chunk-5DZT3Z5Z.js +0 -8
- package/dist/chunk-6FBIEPWU.js +0 -96
- package/dist/chunk-6FIBVC2P.js +0 -56
- package/dist/chunk-7CQPOM5I.js +0 -100
- package/dist/chunk-B6DNOZCP.js +0 -369
- package/dist/chunk-BM4PYVOX.js +0 -109
- package/dist/chunk-C2SVCIWE.js +0 -57
- package/dist/chunk-CCUPDGSZ.js +0 -132
- package/dist/chunk-DBOWTYR4.js +0 -49
- package/dist/chunk-DFXNVEH6.js +0 -14
- package/dist/chunk-DX2524CZ.js +0 -314
- package/dist/chunk-GMJTLFM6.js +0 -60
- package/dist/chunk-IATIXMCE.js +0 -20
- package/dist/chunk-II4R3VVX.js +0 -25
- package/dist/chunk-JF2MDHOJ.js +0 -40
- package/dist/chunk-JQFUKJU5.js +0 -71
- package/dist/chunk-MI4UE2PQ.js +0 -561
- package/dist/chunk-PUKVXYYL.js +0 -52
- package/dist/chunk-QQS7I7ZL.js +0 -16
- package/dist/chunk-VAAMRG4K.js +0 -20
- package/dist/chunk-WFQJUJTC.js +0 -182
- package/dist/chunk-ZXIKIA5B.js +0 -178
- package/dist/concurrentCalls.cjs +0 -406
- package/dist/concurrentCalls.d.cts +0 -116
- package/dist/concurrentCalls.js +0 -346
- package/dist/consoleFmt.cjs +0 -85
- package/dist/consoleFmt.d.cts +0 -54
- package/dist/consoleFmt.d.ts +0 -54
- package/dist/consoleFmt.js +0 -60
- package/dist/conversions.cjs +0 -44
- package/dist/conversions.d.cts +0 -3
- package/dist/conversions.d.ts +0 -3
- package/dist/conversions.js +0 -6
- package/dist/createThrottleController.cjs +0 -193
- package/dist/createThrottleController.d.cts +0 -13
- package/dist/createThrottleController.d.ts +0 -13
- package/dist/createThrottleController.js +0 -61
- package/dist/debounce.cjs +0 -157
- package/dist/debounce.d.cts +0 -46
- package/dist/debounce.d.ts +0 -46
- package/dist/debounce.js +0 -8
- package/dist/dedent.cjs +0 -104
- package/dist/dedent.d.cts +0 -73
- package/dist/dedent.d.ts +0 -73
- package/dist/dedent.js +0 -79
- package/dist/deepEqual.cjs +0 -96
- package/dist/deepEqual.d.ts +0 -21
- package/dist/deepEqual.js +0 -8
- package/dist/deepReplaceValues.cjs +0 -87
- package/dist/deepReplaceValues.d.ts +0 -27
- package/dist/deepReplaceValues.js +0 -7
- package/dist/enhancedMap.cjs +0 -131
- package/dist/enhancedMap.d.cts +0 -20
- package/dist/enhancedMap.d.ts +0 -20
- package/dist/enhancedMap.js +0 -10
- package/dist/exhaustiveMatch.cjs +0 -66
- package/dist/exhaustiveMatch.d.cts +0 -9
- package/dist/exhaustiveMatch.d.ts +0 -9
- package/dist/exhaustiveMatch.js +0 -40
- package/dist/filterObjectOrArrayKeys.cjs +0 -619
- package/dist/filterObjectOrArrayKeys.d.ts +0 -88
- package/dist/filterObjectOrArrayKeys.js +0 -9
- package/dist/getAutoIncrementId.cjs +0 -44
- package/dist/getAutoIncrementId.d.ts +0 -46
- package/dist/getAutoIncrementId.js +0 -18
- package/dist/getCompositeKey.cjs +0 -86
- package/dist/getCompositeKey.d.ts +0 -11
- package/dist/getCompositeKey.js +0 -8
- package/dist/getValueStableKey.cjs +0 -89
- package/dist/getValueStableKey.d.ts +0 -15
- package/dist/getValueStableKey.js +0 -11
- package/dist/hash.cjs +0 -57
- package/dist/hash.d.ts +0 -7
- package/dist/hash.js +0 -32
- package/dist/interpolate.cjs +0 -88
- package/dist/interpolate.d.cts +0 -11
- package/dist/interpolate.d.ts +0 -11
- package/dist/interpolate.js +0 -46
- package/dist/iteratorUtils.cjs +0 -73
- package/dist/iteratorUtils.d.ts +0 -10
- package/dist/iteratorUtils.js +0 -44
- package/dist/keepPrevIfUnchanged.cjs +0 -102
- package/dist/keepPrevIfUnchanged.d.cts +0 -7
- package/dist/keepPrevIfUnchanged.d.ts +0 -7
- package/dist/keepPrevIfUnchanged.js +0 -7
- package/dist/keyedMap.cjs +0 -224
- package/dist/keyedMap.d.cts +0 -75
- package/dist/keyedMap.d.ts +0 -75
- package/dist/keyedMap.js +0 -145
- package/dist/keyedSet.cjs +0 -205
- package/dist/keyedSet.d.cts +0 -76
- package/dist/keyedSet.d.ts +0 -76
- package/dist/keyedSet.js +0 -126
- package/dist/levenshtein.cjs +0 -180
- package/dist/levenshtein.d.ts +0 -5
- package/dist/levenshtein.js +0 -153
- package/dist/main.cjs +0 -32
- package/dist/main.d.cts +0 -3
- package/dist/main.d.ts +0 -3
- package/dist/main.js +0 -7
- package/dist/matchPath.cjs +0 -155
- package/dist/matchPath.d.cts +0 -53
- package/dist/matchPath.d.ts +0 -53
- package/dist/matchPath.js +0 -108
- package/dist/mathUtils.cjs +0 -81
- package/dist/mathUtils.d.ts +0 -54
- package/dist/mathUtils.js +0 -22
- package/dist/mutationUtils.cjs +0 -153
- package/dist/mutationUtils.d.ts +0 -15
- package/dist/mutationUtils.js +0 -55
- package/dist/objUtils.cjs +0 -242
- package/dist/objUtils.d.cts +0 -28
- package/dist/objUtils.js +0 -38
- package/dist/parallelAsyncCalls.cjs +0 -162
- package/dist/parallelAsyncCalls.d.cts +0 -82
- package/dist/parallelAsyncCalls.d.ts +0 -82
- package/dist/parallelAsyncCalls.js +0 -126
- package/dist/partialEqual.cjs +0 -1196
- package/dist/partialEqual.d.cts +0 -141
- package/dist/partialEqual.d.ts +0 -141
- package/dist/partialEqual.js +0 -1168
- package/dist/promiseUtils.cjs +0 -38
- package/dist/promiseUtils.d.cts +0 -8
- package/dist/promiseUtils.d.ts +0 -8
- package/dist/promiseUtils.js +0 -6
- package/dist/regexUtils.cjs +0 -60
- package/dist/regexUtils.d.cts +0 -17
- package/dist/regexUtils.d.ts +0 -17
- package/dist/regexUtils.js +0 -33
- package/dist/retryOnError.cjs +0 -130
- package/dist/retryOnError.d.ts +0 -83
- package/dist/retryOnError.js +0 -101
- package/dist/runShellCmd.cjs +0 -127
- package/dist/runShellCmd.d.cts +0 -90
- package/dist/runShellCmd.js +0 -98
- package/dist/safeJson.cjs +0 -45
- package/dist/safeJson.d.ts +0 -16
- package/dist/safeJson.js +0 -8
- package/dist/saferTyping.cjs +0 -52
- package/dist/saferTyping.d.ts +0 -47
- package/dist/saferTyping.js +0 -23
- package/dist/serializeXML.cjs +0 -154
- package/dist/serializeXML.d.cts +0 -22
- package/dist/serializeXML.d.ts +0 -22
- package/dist/serializeXML.js +0 -116
- package/dist/shallowEqual.cjs +0 -88
- package/dist/shallowEqual.d.ts +0 -4
- package/dist/shallowEqual.js +0 -63
- package/dist/sleep.cjs +0 -32
- package/dist/sleep.d.cts +0 -3
- package/dist/sleep.d.ts +0 -3
- package/dist/sleep.js +0 -6
- package/dist/stringUtils.cjs +0 -155
- package/dist/stringUtils.d.ts +0 -55
- package/dist/stringUtils.js +0 -50
- package/dist/testUtils.cjs +0 -1490
- package/dist/testUtils.d.cts +0 -133
- package/dist/testUtils.js +0 -359
- package/dist/throttle.cjs +0 -282
- package/dist/throttle.d.cts +0 -98
- package/dist/throttle.js +0 -38
- package/dist/time.cjs +0 -152
- package/dist/time.d.cts +0 -25
- package/dist/time.js +0 -38
- package/dist/timers.cjs +0 -194
- package/dist/timers.d.ts +0 -121
- package/dist/timers.js +0 -156
- package/dist/tsResult.cjs +0 -226
- package/dist/tsResult.d.ts +0 -114
- package/dist/tsResult.js +0 -180
- package/dist/typeGuards.cjs +0 -70
- package/dist/typeGuards.d.ts +0 -111
- package/dist/typeGuards.js +0 -18
- package/dist/typeUtils.cjs +0 -18
- package/dist/typeUtils.d.cts +0 -61
- package/dist/typeUtils.js +0 -0
- package/dist/typedStrings.cjs +0 -90
- package/dist/typedStrings.d.ts +0 -163
- package/dist/typedStrings.js +0 -57
- package/dist/typingFnUtils.cjs +0 -96
- package/dist/typingFnUtils.d.ts +0 -100
- package/dist/typingFnUtils.js +0 -30
- package/dist/typingTestUtils.cjs +0 -52
- package/dist/typingTestUtils.d.ts +0 -79
- package/dist/typingTestUtils.js +0 -27
- package/dist/typingUtils.cjs +0 -18
- package/dist/typingUtils.d.cts +0 -35
- package/dist/typingUtils.d.ts +0 -35
- package/dist/typingUtils.js +0 -0
- package/dist/yamlStringify.cjs +0 -423
- package/dist/yamlStringify.d.cts +0 -10
- package/dist/yamlStringify.d.ts +0 -10
- package/dist/yamlStringify.js +0 -9
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
//#region src/levenshtein.ts
|
|
2
|
+
const peq = new Uint32Array(65536);
|
|
3
|
+
const myers_32 = (a, b) => {
|
|
4
|
+
const n = a.length;
|
|
5
|
+
const m = b.length;
|
|
6
|
+
const lst = 1 << n - 1;
|
|
7
|
+
let pv = -1;
|
|
8
|
+
let mv = 0;
|
|
9
|
+
let sc = n;
|
|
10
|
+
let i = n;
|
|
11
|
+
while (i--) peq[a.charCodeAt(i)] |= 1 << i;
|
|
12
|
+
for (i = 0; i < m; i++) {
|
|
13
|
+
let eq = peq[b.charCodeAt(i)];
|
|
14
|
+
const xv = eq | mv;
|
|
15
|
+
eq |= (eq & pv) + pv ^ pv;
|
|
16
|
+
mv |= ~(eq | pv);
|
|
17
|
+
pv &= eq;
|
|
18
|
+
if (mv & lst) sc++;
|
|
19
|
+
if (pv & lst) sc--;
|
|
20
|
+
mv = mv << 1 | 1;
|
|
21
|
+
pv = pv << 1 | ~(xv | mv);
|
|
22
|
+
mv &= xv;
|
|
23
|
+
}
|
|
24
|
+
i = n;
|
|
25
|
+
while (i--) peq[a.charCodeAt(i)] = 0;
|
|
26
|
+
return sc;
|
|
27
|
+
};
|
|
28
|
+
const myers_x = (b, a) => {
|
|
29
|
+
const n = a.length;
|
|
30
|
+
const m = b.length;
|
|
31
|
+
const mhc = [];
|
|
32
|
+
const phc = [];
|
|
33
|
+
const hsize = Math.ceil(n / 32);
|
|
34
|
+
const vsize = Math.ceil(m / 32);
|
|
35
|
+
for (let i = 0; i < hsize; i++) {
|
|
36
|
+
phc[i] = -1;
|
|
37
|
+
mhc[i] = 0;
|
|
38
|
+
}
|
|
39
|
+
let j = 0;
|
|
40
|
+
for (; j < vsize - 1; j++) {
|
|
41
|
+
let mv$1 = 0;
|
|
42
|
+
let pv$1 = -1;
|
|
43
|
+
const start$1 = j * 32;
|
|
44
|
+
const vlen$1 = Math.min(32, m) + start$1;
|
|
45
|
+
for (let k = start$1; k < vlen$1; k++) peq[b.charCodeAt(k)] |= 1 << k;
|
|
46
|
+
for (let i = 0; i < n; i++) {
|
|
47
|
+
const eq = peq[a.charCodeAt(i)];
|
|
48
|
+
const pb = phc[i / 32 | 0] >>> i & 1;
|
|
49
|
+
const mb = mhc[i / 32 | 0] >>> i & 1;
|
|
50
|
+
const xv = eq | mv$1;
|
|
51
|
+
const xh = ((eq | mb) & pv$1) + pv$1 ^ pv$1 | eq | mb;
|
|
52
|
+
let ph = mv$1 | ~(xh | pv$1);
|
|
53
|
+
let mh = pv$1 & xh;
|
|
54
|
+
if (ph >>> 31 ^ pb) phc[i / 32 | 0] ^= 1 << i;
|
|
55
|
+
if (mh >>> 31 ^ mb) mhc[i / 32 | 0] ^= 1 << i;
|
|
56
|
+
ph = ph << 1 | pb;
|
|
57
|
+
mh = mh << 1 | mb;
|
|
58
|
+
pv$1 = mh | ~(xv | ph);
|
|
59
|
+
mv$1 = ph & xv;
|
|
60
|
+
}
|
|
61
|
+
for (let k = start$1; k < vlen$1; k++) peq[b.charCodeAt(k)] = 0;
|
|
62
|
+
}
|
|
63
|
+
let mv = 0;
|
|
64
|
+
let pv = -1;
|
|
65
|
+
const start = j * 32;
|
|
66
|
+
const vlen = Math.min(32, m - start) + start;
|
|
67
|
+
for (let k = start; k < vlen; k++) peq[b.charCodeAt(k)] |= 1 << k;
|
|
68
|
+
let score = m;
|
|
69
|
+
for (let i = 0; i < n; i++) {
|
|
70
|
+
const eq = peq[a.charCodeAt(i)];
|
|
71
|
+
const pb = phc[i / 32 | 0] >>> i & 1;
|
|
72
|
+
const mb = mhc[i / 32 | 0] >>> i & 1;
|
|
73
|
+
const xv = eq | mv;
|
|
74
|
+
const xh = ((eq | mb) & pv) + pv ^ pv | eq | mb;
|
|
75
|
+
let ph = mv | ~(xh | pv);
|
|
76
|
+
let mh = pv & xh;
|
|
77
|
+
score += ph >>> m - 1 & 1;
|
|
78
|
+
score -= mh >>> m - 1 & 1;
|
|
79
|
+
if (ph >>> 31 ^ pb) phc[i / 32 | 0] ^= 1 << i;
|
|
80
|
+
if (mh >>> 31 ^ mb) mhc[i / 32 | 0] ^= 1 << i;
|
|
81
|
+
ph = ph << 1 | pb;
|
|
82
|
+
mh = mh << 1 | mb;
|
|
83
|
+
pv = mh | ~(xv | ph);
|
|
84
|
+
mv = ph & xv;
|
|
85
|
+
}
|
|
86
|
+
for (let k = start; k < vlen; k++) peq[b.charCodeAt(k)] = 0;
|
|
87
|
+
return score;
|
|
88
|
+
};
|
|
89
|
+
function levenshteinDistance(a, b) {
|
|
90
|
+
if (a.length < b.length) {
|
|
91
|
+
const tmp = b;
|
|
92
|
+
b = a;
|
|
93
|
+
a = tmp;
|
|
94
|
+
}
|
|
95
|
+
if (b.length === 0) return a.length;
|
|
96
|
+
if (a.length <= 32) return myers_32(a, b);
|
|
97
|
+
return myers_x(a, b);
|
|
98
|
+
}
|
|
99
|
+
function getClosestString(str, arr, maxDistance = 2) {
|
|
100
|
+
let min_distance = Infinity;
|
|
101
|
+
let closestString;
|
|
102
|
+
for (let i = 0; i < arr.length; i++) {
|
|
103
|
+
const dist = levenshteinDistance(str, arr[i]);
|
|
104
|
+
if (dist < min_distance && dist <= maxDistance) {
|
|
105
|
+
min_distance = dist;
|
|
106
|
+
closestString = arr[i];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return closestString;
|
|
110
|
+
}
|
|
111
|
+
function getClosestStringsUpToDist(str, arr, maxDistance = 2) {
|
|
112
|
+
const distanceMap = /* @__PURE__ */ new Map();
|
|
113
|
+
for (const item of arr) {
|
|
114
|
+
const distance = levenshteinDistance(str, item);
|
|
115
|
+
if (distance <= maxDistance) distanceMap.set(item, distance);
|
|
116
|
+
}
|
|
117
|
+
return Array.from(distanceMap.entries()).sort((a, b) => a[1] - b[1]).map(([item]) => item);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
//#endregion
|
|
121
|
+
export { getClosestString, getClosestStringsUpToDist, levenshteinDistance };
|
package/dist/main.d.mts
ADDED
package/dist/main.mjs
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
//#region src/matchPath.d.ts
|
|
2
|
+
type _PathParam<Path extends string> = Path extends `${infer L}/${infer R}` ? _PathParam<L> | _PathParam<R> : Path extends `:${infer Param}` ? Param extends `${infer Optional}?` ? Optional : Param : never;
|
|
3
|
+
type PathParam<Path extends string> = Path extends '*' | '/*' ? '*' : Path extends `${infer Rest}/*` ? '*' | _PathParam<Rest> : _PathParam<Path>;
|
|
4
|
+
type ParamParseKey<Segment extends string> = [PathParam<Segment>] extends [never] ? string : PathParam<Segment>;
|
|
5
|
+
/** A PathPattern is used to match on some portion of a URL pathname. */
|
|
6
|
+
interface PathPattern<Path extends string = string> {
|
|
7
|
+
/**
|
|
8
|
+
* A string to match against a URL pathname. May contain `:id`-style segments
|
|
9
|
+
* to indicate placeholders for dynamic parameters. May also end with `/*` to
|
|
10
|
+
* indicate matching the rest of the URL pathname.
|
|
11
|
+
*/
|
|
12
|
+
path: Path;
|
|
13
|
+
/**
|
|
14
|
+
* Should be `true` if the static portions of the `path` should be matched in
|
|
15
|
+
* the same case.
|
|
16
|
+
*/
|
|
17
|
+
caseSensitive?: boolean;
|
|
18
|
+
/** Should be `true` if this pattern should match the entire URL pathname. */
|
|
19
|
+
end?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/** The parameters that were parsed from the URL path. */
|
|
22
|
+
type Params<Key extends string = string> = { readonly [key in Key]: string | undefined };
|
|
23
|
+
type PathMatchGlob = {
|
|
24
|
+
matchPath: <K extends ParamParseKey<Path>, Path extends string>(pattern: PathPattern<Path> | Path) => PathMatch<K> | null;
|
|
25
|
+
path: string;
|
|
26
|
+
};
|
|
27
|
+
/** A PathMatch contains info about how a PathPattern matched on a URL pathname. */
|
|
28
|
+
interface PathMatch<ParamKey extends string = string> {
|
|
29
|
+
/** The names and values of dynamic parameters in the URL. */
|
|
30
|
+
params: Params<ParamKey>;
|
|
31
|
+
/** The portion of the URL pathname that was matched. */
|
|
32
|
+
pathname: string;
|
|
33
|
+
/** The portion of the URL pathname that was matched before child routes. */
|
|
34
|
+
pathnameBase: string;
|
|
35
|
+
/** The pattern that was used to match. */
|
|
36
|
+
pattern: PathPattern;
|
|
37
|
+
glob: null | PathMatchGlob;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Performs pattern matching on a URL pathname and returns information about the
|
|
41
|
+
* match.
|
|
42
|
+
*
|
|
43
|
+
* @see https://reactrouter.com/utils/match-path
|
|
44
|
+
*/
|
|
45
|
+
declare function matchPath<ParamKey extends ParamParseKey<Path>, Path extends string>(pattern: PathPattern<Path> | Path, pathname: string): PathMatch<ParamKey> | null;
|
|
46
|
+
declare function matchPathWith(path: string | undefined | null): {
|
|
47
|
+
patterns: <R$1>(patterns: Record<string, (match: PathMatch) => R$1>) => R$1 | null;
|
|
48
|
+
};
|
|
49
|
+
//#endregion
|
|
50
|
+
export { ParamParseKey, Params, PathMatch, PathMatchGlob, PathParam, PathPattern, matchPath, matchPathWith };
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { fastCache } from "./cache.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/matchPath.ts
|
|
4
|
+
/**
|
|
5
|
+
* Performs pattern matching on a URL pathname and returns information about the
|
|
6
|
+
* match.
|
|
7
|
+
*
|
|
8
|
+
* @see https://reactrouter.com/utils/match-path
|
|
9
|
+
*/
|
|
10
|
+
function matchPath(pattern, pathname) {
|
|
11
|
+
if (typeof pattern === "string") pattern = {
|
|
12
|
+
path: pattern,
|
|
13
|
+
caseSensitive: false,
|
|
14
|
+
end: true
|
|
15
|
+
};
|
|
16
|
+
const normalizedPathname = pathname === "" ? "" : pathname.replace(/^\/*/, "/");
|
|
17
|
+
const [matcher, compiledParams] = compilePath(pattern.path, pattern.caseSensitive, pattern.end);
|
|
18
|
+
const match = normalizedPathname.match(matcher);
|
|
19
|
+
if (!match) return null;
|
|
20
|
+
const matchedPathname = match[0];
|
|
21
|
+
let pathnameBase = matchedPathname.replace(/(.)\/+$/, "$1");
|
|
22
|
+
const captureGroups = match.slice(1);
|
|
23
|
+
const params = compiledParams.reduce((memo, { paramName, isOptional }, index) => {
|
|
24
|
+
if (paramName === "*") {
|
|
25
|
+
const splatValue = captureGroups[index] || "";
|
|
26
|
+
pathnameBase = matchedPathname.slice(0, matchedPathname.length - splatValue.length).replace(/(.)\/+$/, "$1");
|
|
27
|
+
}
|
|
28
|
+
const value = captureGroups[index];
|
|
29
|
+
if (isOptional && !value) memo[paramName] = void 0;
|
|
30
|
+
else memo[paramName] = (value || "").replace(/%2F/g, "/");
|
|
31
|
+
return memo;
|
|
32
|
+
}, {});
|
|
33
|
+
const glob = params["*"];
|
|
34
|
+
const globPath = glob && `/${glob}`;
|
|
35
|
+
return {
|
|
36
|
+
params,
|
|
37
|
+
pathname: matchedPathname,
|
|
38
|
+
pathnameBase,
|
|
39
|
+
pattern,
|
|
40
|
+
glob: globPath ? {
|
|
41
|
+
matchPath: (subPattern) => matchPath(subPattern, globPath),
|
|
42
|
+
path: globPath
|
|
43
|
+
} : null
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function warning(condition, message) {
|
|
47
|
+
if (process.env.NODE_ENV === "development" && !condition) console.warn(message);
|
|
48
|
+
}
|
|
49
|
+
const cache = fastCache({ maxCacheSize: 5e3 });
|
|
50
|
+
function compilePath(path, caseSensitive = false, end = true) {
|
|
51
|
+
return cache.getOrInsert(`${path}-${caseSensitive ? "s" : "i"}${end ? "e" : ""}`, () => {
|
|
52
|
+
warning(path === "*" || !path.endsWith("*") || path.endsWith("/*"), `Route path "${path}" will be treated as if it were "${path.replace(/\*$/, "/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${path.replace(/\*$/, "/*")}".`);
|
|
53
|
+
const params = [];
|
|
54
|
+
let regexpSource = `^${path.replace(/\/*\*?$/, "").replace(/^\/*/, "/").replace(/[\\.*+^${}|()[\]]/g, "\\$&").replace(/\/:([\w-]+)(\?)?/g, (_, paramName, isOptional) => {
|
|
55
|
+
params.push({
|
|
56
|
+
paramName,
|
|
57
|
+
isOptional: isOptional != null
|
|
58
|
+
});
|
|
59
|
+
return isOptional ? "/?([^\\/]+)?" : "/([^\\/]+)";
|
|
60
|
+
})}`;
|
|
61
|
+
if (path.endsWith("*")) {
|
|
62
|
+
params.push({ paramName: "*" });
|
|
63
|
+
regexpSource += path === "*" || path === "/*" ? "(.*)$" : "(?:\\/(.+)|\\/*)$";
|
|
64
|
+
} else if (end) regexpSource += "\\/*$";
|
|
65
|
+
else if (path !== "" && path !== "/") regexpSource += "(?:(?=\\/|$))";
|
|
66
|
+
return [new RegExp(regexpSource, caseSensitive ? void 0 : "i"), params];
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
function matchPathWith(path) {
|
|
70
|
+
return { patterns: (patternsToMatch) => {
|
|
71
|
+
if (!path) return null;
|
|
72
|
+
for (const [key, pattern] of Object.entries(patternsToMatch)) {
|
|
73
|
+
const match = matchPath(key, path);
|
|
74
|
+
if (match) return pattern(match);
|
|
75
|
+
}
|
|
76
|
+
return null;
|
|
77
|
+
} };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
//#endregion
|
|
81
|
+
export { matchPath, matchPathWith };
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
//#region src/mathUtils.ts
|
|
2
|
+
function clampMax(value, max) {
|
|
3
|
+
return value > max ? max : value;
|
|
4
|
+
}
|
|
5
|
+
function clampMin(value, min) {
|
|
6
|
+
return value < min ? min : value;
|
|
7
|
+
}
|
|
8
|
+
function clampRange(num, v1, v2) {
|
|
9
|
+
if (v2 > v1) return clamp(num, v1, v2);
|
|
10
|
+
return clamp(num, v2, v1);
|
|
11
|
+
}
|
|
12
|
+
function clamp(num, min, max) {
|
|
13
|
+
return num > max ? max : num < min ? min : num;
|
|
14
|
+
}
|
|
15
|
+
function fixFloatingPointNumber(value) {
|
|
16
|
+
return Number(value.toPrecision(15));
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Rounds a number to the nearest multiple of the specified step value.
|
|
20
|
+
*
|
|
21
|
+
* @param value - The number to round
|
|
22
|
+
* @param step - The step size to round to
|
|
23
|
+
* @param offset - Optional offset to shift the rounding grid
|
|
24
|
+
* @returns The rounded value
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* roundToStep(23, 5) // 25 (nearest multiple of 5)
|
|
28
|
+
*/
|
|
29
|
+
function roundToStep(value, step, offset = 0) {
|
|
30
|
+
const inv = 1 / step;
|
|
31
|
+
const snapped = Math.round((value - offset) * inv) / inv + offset;
|
|
32
|
+
return Number(snapped.toFixed(12));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Floors a number down to the nearest multiple of the specified step value.
|
|
36
|
+
*
|
|
37
|
+
* @param value - The number to floor
|
|
38
|
+
* @param step - The step size to floor to
|
|
39
|
+
* @param offset - Optional offset to shift the flooring grid
|
|
40
|
+
* @returns The floored value
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* floorToStep(23, 5) // 20 (largest multiple of 5 ≤ 23)
|
|
44
|
+
*/
|
|
45
|
+
function floorToStep(value, step, offset = 0) {
|
|
46
|
+
const inv = 1 / step;
|
|
47
|
+
const snapped = Math.floor((value - offset) * inv) / inv + offset;
|
|
48
|
+
return Number(snapped.toFixed(12));
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Ceils a number up to the nearest multiple of the specified step value.
|
|
52
|
+
*
|
|
53
|
+
* @param value - The number to ceil
|
|
54
|
+
* @param step - The step size to ceil to
|
|
55
|
+
* @param offset - Optional offset to shift the ceiling grid
|
|
56
|
+
* @returns The ceiled value
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ceilToStep(23, 5) // 25 (smallest multiple of 5 ≥ 23)
|
|
60
|
+
*/
|
|
61
|
+
function ceilToStep(value, step, offset = 0) {
|
|
62
|
+
const inv = 1 / step;
|
|
63
|
+
const snapped = Math.ceil((value - offset) * inv) / inv + offset;
|
|
64
|
+
return Number(snapped.toFixed(12));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Rounds a number to the specified number of decimal places.
|
|
68
|
+
*
|
|
69
|
+
* @param num - The number to round
|
|
70
|
+
* @param precision - Number of decimal places
|
|
71
|
+
* @returns The rounded number
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* round(3.14159, 2) // 3.14
|
|
75
|
+
*/
|
|
76
|
+
function round(num, precision) {
|
|
77
|
+
return Math.round(num * 10 ** precision) / 10 ** precision;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
//#endregion
|
|
81
|
+
export { clampRange as a, round as c, clampMin as i, roundToStep as l, clamp as n, fixFloatingPointNumber as o, clampMax as r, floorToStep as s, ceilToStep as t };
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
//#region src/mathUtils.d.ts
|
|
1
2
|
declare function clampMax(value: number, max: number): number;
|
|
2
3
|
declare function clampMin(value: number, min: number): number;
|
|
3
4
|
declare function clampRange(num: number, v1: number, v2: number): number;
|
|
@@ -50,5 +51,5 @@ declare function ceilToStep(value: number, step: number, offset?: number): numbe
|
|
|
50
51
|
* round(3.14159, 2) // 3.14
|
|
51
52
|
*/
|
|
52
53
|
declare function round(num: number, precision: number): number;
|
|
53
|
-
|
|
54
|
-
export { ceilToStep, clamp, clampMax, clampMin, clampRange, fixFloatingPointNumber, floorToStep, round, roundToStep };
|
|
54
|
+
//#endregion
|
|
55
|
+
export { ceilToStep, clamp, clampMax, clampMin, clampRange, fixFloatingPointNumber, floorToStep, round, roundToStep };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { a as clampRange, c as round, i as clampMin, l as roundToStep, n as clamp, o as fixFloatingPointNumber, r as clampMax, s as floorToStep, t as ceilToStep } from "./mathUtils-BDP1lM_z.mjs";
|
|
2
|
+
|
|
3
|
+
export { ceilToStep, clamp, clampMax, clampMin, clampRange, fixFloatingPointNumber, floorToStep, round, roundToStep };
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
//#region src/mutationUtils.d.ts
|
|
1
2
|
/**
|
|
2
3
|
* Updates an object with a new set of values. undefined values are ignored in
|
|
3
4
|
* the updates object and deep equal values are not updated.
|
|
@@ -7,9 +8,9 @@
|
|
|
7
8
|
*/
|
|
8
9
|
declare function updateObject<T extends Record<string, unknown>>(object: T | undefined | null, updates: Partial<T>): void;
|
|
9
10
|
declare function getArrayMethodsFromProduce<T extends Record<string, unknown>>(produceFn: (cb: (newVal: T[]) => void | T[]) => T[] | void, getItemId: (item: T) => string): {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
add: (item: T) => void | T[];
|
|
12
|
+
remove: (id: string) => void | T[];
|
|
13
|
+
update: (id: string, updateItem: ((draftItem: T) => T | void) | Partial<T>) => void | T[];
|
|
13
14
|
};
|
|
14
|
-
|
|
15
|
-
export { getArrayMethodsFromProduce, updateObject };
|
|
15
|
+
//#endregion
|
|
16
|
+
export { getArrayMethodsFromProduce, updateObject };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { n as isFunction } from "./typeGuards-B1mzA-Rz.mjs";
|
|
2
|
+
import { keepPrevIfUnchanged } from "./keepPrevIfUnchanged.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/mutationUtils.ts
|
|
5
|
+
/**
|
|
6
|
+
* Updates an object with a new set of values. undefined values are ignored in
|
|
7
|
+
* the updates object and deep equal values are not updated.
|
|
8
|
+
*
|
|
9
|
+
* @param object - The object to update.
|
|
10
|
+
* @param updates - The new values to update the object with.
|
|
11
|
+
*/
|
|
12
|
+
function updateObject(object, updates) {
|
|
13
|
+
if (!object || typeof object !== "object") return;
|
|
14
|
+
for (const key of Object.keys(updates)) {
|
|
15
|
+
const value = updates[key];
|
|
16
|
+
if (value !== void 0) object[key] = keepPrevIfUnchanged({
|
|
17
|
+
prev: object[key],
|
|
18
|
+
newValue: value
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function getArrayMethodsFromProduce(produceFn, getItemId) {
|
|
23
|
+
return {
|
|
24
|
+
add: (item) => produceFn((draft) => {
|
|
25
|
+
draft.push(item);
|
|
26
|
+
}),
|
|
27
|
+
remove: (id) => produceFn((draft) => {
|
|
28
|
+
const index = draft.findIndex((item) => getItemId(item) === id);
|
|
29
|
+
if (index !== -1) draft.splice(index, 1);
|
|
30
|
+
}),
|
|
31
|
+
update: (id, updateItem) => produceFn((draft) => {
|
|
32
|
+
const index = draft.findIndex((item$1) => getItemId(item$1) === id);
|
|
33
|
+
const item = draft[index];
|
|
34
|
+
if (!item) throw new Error(`Item with id ${id} not found`);
|
|
35
|
+
if (isFunction(updateItem)) {
|
|
36
|
+
const updatedItem = updateItem(item);
|
|
37
|
+
if (updatedItem) draft[index] = updatedItem;
|
|
38
|
+
} else updateObject(item, updateItem);
|
|
39
|
+
})
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
//#endregion
|
|
44
|
+
export { getArrayMethodsFromProduce, updateObject };
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { SortByProps, SortByValueFn } from "./arrayUtils.mjs";
|
|
2
|
+
import { MakeUndefinedKeysOptional } from "./typeUtils.mjs";
|
|
3
|
+
import { AddPrefixToObjKeys, AddSuffixToObjKeys } from "./typingUtils.mjs";
|
|
4
|
+
import { Result } from "t-result";
|
|
5
|
+
|
|
6
|
+
//#region src/objUtils.d.ts
|
|
5
7
|
|
|
6
8
|
/**
|
|
7
9
|
* @deprecated Use typedObjectEntries from @ls-stack/utils/typingFnUtils instead
|
|
@@ -24,5 +26,5 @@ declare function getValueFromPath(obj: Record<string, unknown>, path: string): R
|
|
|
24
26
|
declare function getObjPropertyOrInsert<T extends Record<string, any>, K extends keyof T>(obj: T, prop: K, insertValue: () => Exclude<T[K], undefined>): Exclude<T[K], undefined>;
|
|
25
27
|
declare function addPrefixToObjKeys<T extends Record<string, unknown>, P extends string>(obj: T, prefix: P): AddPrefixToObjKeys<T, P>;
|
|
26
28
|
declare function addSuffixToObjKeys<T extends Record<string, unknown>, S extends string>(obj: T, suffix: S): AddSuffixToObjKeys<T, S>;
|
|
27
|
-
|
|
28
|
-
export { addPrefixToObjKeys, addSuffixToObjKeys, filterObjectKeys, getObjPropertyOrInsert, getValueFromPath, looseGetObjectProperty, mapArrToObj, mapArrayToObject, mapObjToObj, mapObjectToObject, objectTypedEntries, omit, pick, rejectObjUndefinedValues, sortObjectKeys };
|
|
29
|
+
//#endregion
|
|
30
|
+
export { addPrefixToObjKeys, addSuffixToObjKeys, filterObjectKeys, getObjPropertyOrInsert, getValueFromPath, looseGetObjectProperty, mapArrToObj, mapArrayToObject, mapObjToObj, mapObjectToObject, objectTypedEntries, omit, pick, rejectObjUndefinedValues, sortObjectKeys };
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { sortBy } from "./arrayUtils.mjs";
|
|
2
|
+
import { d as typedObjectEntries } from "./typingFnUtils-Bb8drgKF.mjs";
|
|
3
|
+
import { Result } from "t-result";
|
|
4
|
+
|
|
5
|
+
//#region src/objUtils.ts
|
|
6
|
+
/**
|
|
7
|
+
* @deprecated Use typedObjectEntries from @ls-stack/utils/typingFnUtils instead
|
|
8
|
+
* @param obj
|
|
9
|
+
*/
|
|
10
|
+
function objectTypedEntries(obj) {
|
|
11
|
+
return Object.entries(obj);
|
|
12
|
+
}
|
|
13
|
+
function pick(obj, keys) {
|
|
14
|
+
const result = {};
|
|
15
|
+
for (const key of keys) result[key] = obj[key];
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
function mapArrToObj(array, mapper) {
|
|
19
|
+
return Object.fromEntries(array.map(mapper));
|
|
20
|
+
}
|
|
21
|
+
/** @deprecated Use mapArrToObj instead */
|
|
22
|
+
const mapArrayToObject = mapArrToObj;
|
|
23
|
+
function mapObjToObj(obj, mapper) {
|
|
24
|
+
return Object.fromEntries(objectTypedEntries(obj).map(([key, value]) => mapper(key, value)));
|
|
25
|
+
}
|
|
26
|
+
/** @deprecated Use mapObjToObj instead */
|
|
27
|
+
const mapObjectToObject = mapObjToObj;
|
|
28
|
+
function omit(obj, keys) {
|
|
29
|
+
const result = {};
|
|
30
|
+
for (const key of Object.keys(obj)) if (!keys.includes(key)) result[key] = obj[key];
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
function looseGetObjectProperty(obj, key) {
|
|
34
|
+
return obj[key];
|
|
35
|
+
}
|
|
36
|
+
function rejectObjUndefinedValues(obj) {
|
|
37
|
+
const result = {};
|
|
38
|
+
for (const key in obj) if (obj[key] !== void 0) result[key] = obj[key];
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
function filterObjectKeys(obj, predicate) {
|
|
42
|
+
return Object.fromEntries(Object.entries(obj).filter(([key, value]) => predicate(key, value)));
|
|
43
|
+
}
|
|
44
|
+
function sortObjectKeys(obj, sortByFn, options) {
|
|
45
|
+
return Object.fromEntries(sortBy(typedObjectEntries(obj), sortByFn, options));
|
|
46
|
+
}
|
|
47
|
+
function getValueFromPath(obj, path) {
|
|
48
|
+
if (!path.trim()) return Result.err(/* @__PURE__ */ new Error("Path cannot be empty"));
|
|
49
|
+
const segments = parsePath(path);
|
|
50
|
+
let current = obj;
|
|
51
|
+
for (let i = 0; i < segments.length; i++) {
|
|
52
|
+
const segment = segments[i];
|
|
53
|
+
if (!segment) return Result.err(/* @__PURE__ */ new Error("Invalid empty segment in path"));
|
|
54
|
+
if (current == null) return Result.err(/* @__PURE__ */ new Error(`Cannot access property '${segment}' on null or undefined`));
|
|
55
|
+
if (isNumericString(segment)) {
|
|
56
|
+
if (!Array.isArray(current)) return Result.err(/* @__PURE__ */ new Error(`Cannot access array index '${segment}' on non-array value`));
|
|
57
|
+
const index = parseInt(segment, 10);
|
|
58
|
+
if (index < 0 || index >= current.length) return Result.err(/* @__PURE__ */ new Error(`Array index '${index}' out of bounds`));
|
|
59
|
+
current = current[index];
|
|
60
|
+
} else {
|
|
61
|
+
if (typeof current !== "object" || current === null) return Result.err(/* @__PURE__ */ new Error(`Cannot access property '${segment}' on non-object value`));
|
|
62
|
+
if (!(segment in current)) return Result.err(/* @__PURE__ */ new Error(`Property '${segment}' not found`));
|
|
63
|
+
current = current[segment];
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return Result.ok(current);
|
|
67
|
+
}
|
|
68
|
+
function parsePath(path) {
|
|
69
|
+
const segments = [];
|
|
70
|
+
let current = "";
|
|
71
|
+
let inBrackets = false;
|
|
72
|
+
for (let i = 0; i < path.length; i++) {
|
|
73
|
+
const char = path[i];
|
|
74
|
+
if (char === "[") {
|
|
75
|
+
if (current) {
|
|
76
|
+
segments.push(current);
|
|
77
|
+
current = "";
|
|
78
|
+
}
|
|
79
|
+
inBrackets = true;
|
|
80
|
+
} else if (char === "]") {
|
|
81
|
+
if (inBrackets && current) {
|
|
82
|
+
segments.push(current);
|
|
83
|
+
current = "";
|
|
84
|
+
}
|
|
85
|
+
inBrackets = false;
|
|
86
|
+
} else if (char === "." && !inBrackets) {
|
|
87
|
+
if (current) {
|
|
88
|
+
segments.push(current);
|
|
89
|
+
current = "";
|
|
90
|
+
}
|
|
91
|
+
} else current += char;
|
|
92
|
+
}
|
|
93
|
+
if (current) segments.push(current);
|
|
94
|
+
return segments;
|
|
95
|
+
}
|
|
96
|
+
function isNumericString(str) {
|
|
97
|
+
return /^\d+$/.test(str);
|
|
98
|
+
}
|
|
99
|
+
function getObjPropertyOrInsert(obj, prop, insertValue) {
|
|
100
|
+
if (obj[prop] === void 0) obj[prop] = insertValue();
|
|
101
|
+
return obj[prop];
|
|
102
|
+
}
|
|
103
|
+
function addPrefixToObjKeys(obj, prefix) {
|
|
104
|
+
const newObj = {};
|
|
105
|
+
for (const [key, value] of Object.entries(obj)) newObj[`${prefix}${key}`] = value;
|
|
106
|
+
return newObj;
|
|
107
|
+
}
|
|
108
|
+
function addSuffixToObjKeys(obj, suffix) {
|
|
109
|
+
const newObj = {};
|
|
110
|
+
for (const [key, value] of Object.entries(obj)) newObj[`${key}${suffix}`] = value;
|
|
111
|
+
return newObj;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
//#endregion
|
|
115
|
+
export { addPrefixToObjKeys, addSuffixToObjKeys, filterObjectKeys, getObjPropertyOrInsert, getValueFromPath, looseGetObjectProperty, mapArrToObj, mapArrayToObject, mapObjToObj, mapObjectToObject, objectTypedEntries, omit, pick, rejectObjUndefinedValues, sortObjectKeys };
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Result } from "t-result";
|
|
2
|
+
|
|
3
|
+
//#region src/parallelAsyncCalls.d.ts
|
|
4
|
+
type ValidMetadata = string | number | boolean | Record<string, unknown>;
|
|
5
|
+
type TupleRunAllSuccess<T> = T extends (() => Promise<Result<infer V>>) ? Succeeded<V, undefined> : T extends {
|
|
6
|
+
metadata: infer M;
|
|
7
|
+
fn: () => Promise<Result<infer V>>;
|
|
8
|
+
} ? Succeeded<V, M> : never;
|
|
9
|
+
type TupleRunAllFailed<T> = T extends (() => Promise<Result<any>>) ? {
|
|
10
|
+
metadata: undefined;
|
|
11
|
+
error: Error;
|
|
12
|
+
} : T extends {
|
|
13
|
+
metadata: infer M extends ValidMetadata;
|
|
14
|
+
} ? {
|
|
15
|
+
metadata: M;
|
|
16
|
+
error: Error;
|
|
17
|
+
} : never;
|
|
18
|
+
type TupleRunAllSettled<T> = T extends (() => Promise<Result<infer V>>) ? Succeeded<V, undefined> | Failed<undefined> : T extends {
|
|
19
|
+
metadata: infer M;
|
|
20
|
+
fn: () => Promise<Result<infer V>>;
|
|
21
|
+
} ? Succeeded<V, M> | Failed<M> : never;
|
|
22
|
+
type RunProps = {
|
|
23
|
+
delayStart?: (index: number) => number;
|
|
24
|
+
};
|
|
25
|
+
type Failed<M$1> = {
|
|
26
|
+
metadata: M$1;
|
|
27
|
+
error: Error;
|
|
28
|
+
};
|
|
29
|
+
type Succeeded<R, M$1> = {
|
|
30
|
+
value: R;
|
|
31
|
+
metadata: M$1;
|
|
32
|
+
};
|
|
33
|
+
declare class ParallelAsyncResultCalls<M$1 extends ValidMetadata | undefined = undefined, R = unknown> {
|
|
34
|
+
private pendingCalls;
|
|
35
|
+
alreadyRun: boolean;
|
|
36
|
+
constructor();
|
|
37
|
+
add(call: M$1 extends undefined ? () => Promise<Result<R>> : {
|
|
38
|
+
metadata: M$1;
|
|
39
|
+
fn: () => Promise<Result<R>>;
|
|
40
|
+
}): this;
|
|
41
|
+
/**
|
|
42
|
+
* Adds calls return tuples with inferred results
|
|
43
|
+
*
|
|
44
|
+
* @param calls
|
|
45
|
+
*/
|
|
46
|
+
addTuple<T extends (M$1 extends undefined ? () => Promise<Result<R>> : {
|
|
47
|
+
metadata: M$1;
|
|
48
|
+
fn: () => Promise<Result<R>>;
|
|
49
|
+
})[]>(...calls: T): {
|
|
50
|
+
runAllSettled: (props?: RunProps) => Promise<{
|
|
51
|
+
results: { [I in keyof T]: TupleRunAllSettled<T[I]> };
|
|
52
|
+
allFailed: boolean;
|
|
53
|
+
}>;
|
|
54
|
+
runAll: (props?: RunProps) => Promise<Result<{ [I in keyof T]: TupleRunAllSuccess<T[I]> }, TupleRunAllFailed<T[number]>>>;
|
|
55
|
+
};
|
|
56
|
+
runAllSettled({
|
|
57
|
+
delayStart
|
|
58
|
+
}?: RunProps): Promise<{
|
|
59
|
+
failed: Failed<M$1>[];
|
|
60
|
+
succeeded: Succeeded<R, M$1>[];
|
|
61
|
+
allFailed: boolean;
|
|
62
|
+
results: (Failed<M$1> | Succeeded<R, M$1>)[];
|
|
63
|
+
}>;
|
|
64
|
+
runAll({
|
|
65
|
+
delayStart
|
|
66
|
+
}?: {
|
|
67
|
+
delayStart?: (index: number) => number;
|
|
68
|
+
}): Promise<Result<Succeeded<R, M$1>[], {
|
|
69
|
+
metadata: M$1;
|
|
70
|
+
error: Error;
|
|
71
|
+
}>>;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Executes multiple asynchronous calls in parallel and collects the results in
|
|
75
|
+
* a easier to use format.
|
|
76
|
+
*
|
|
77
|
+
* @deprecated Use concurrentAsyncCalls instead.
|
|
78
|
+
* @template R - The type of the result value.
|
|
79
|
+
* @template M - The type of the call metadata.
|
|
80
|
+
*/
|
|
81
|
+
declare function parallelAsyncCalls<M$1 extends ValidMetadata | undefined = undefined, R = unknown>(): ParallelAsyncResultCalls<M$1, R>;
|
|
82
|
+
//#endregion
|
|
83
|
+
export { parallelAsyncCalls };
|