@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.
- 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 +63 -0
- package/dist/diffParser.mjs +410 -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 -234
- 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/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,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 {
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
48
|
-
|
|
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
|
-
|
|
68
|
-
|
|
68
|
+
/** Current retry count, (0 for first attempt) */
|
|
69
|
+
retry: number;
|
|
69
70
|
}) => Promise<Result<T, E>>, maxRetries: number, options?: {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
label: string | null;
|
|
4
|
+
out: string;
|
|
5
|
+
error: boolean;
|
|
6
|
+
stdout: string;
|
|
7
|
+
stderr: string;
|
|
7
8
|
};
|
|
8
9
|
type RunCmdOptions = {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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[], {
|
|
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[], {
|
|
63
|
-
|
|
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 {
|
|
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 };
|