@ezez/utils 4.5.0 → 4.6.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/CHANGELOG.md +13 -1
- package/dist/cap.d.ts.map +1 -1
- package/dist/cap.js.map +1 -1
- package/dist/capitalize.d.ts.map +1 -1
- package/dist/capitalize.js.map +1 -1
- package/dist/compareArrays.d.ts +4 -4
- package/dist/compareArrays.d.ts.map +1 -1
- package/dist/compareArrays.js.map +1 -1
- package/dist/ensureError.d.ts.map +1 -1
- package/dist/ensureError.js +3 -1
- package/dist/ensureError.js.map +1 -1
- package/dist/ensurePrefix.d.ts.map +1 -1
- package/dist/ensurePrefix.js.map +1 -1
- package/dist/ensureSuffix.d.ts.map +1 -1
- package/dist/ensureSuffix.js.map +1 -1
- package/dist/escapeRegExp.d.ts.map +1 -1
- package/dist/escapeRegExp.js.map +1 -1
- package/dist/formatDate.d.ts.map +1 -1
- package/dist/formatDate.js.map +1 -1
- package/dist/getMultiple.d.ts.map +1 -1
- package/dist/getMultiple.js.map +1 -1
- package/dist/ignore.d.ts +3 -0
- package/dist/ignore.d.ts.map +1 -0
- package/dist/ignore.js +16 -0
- package/dist/ignore.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/isEmpty.d.ts.map +1 -1
- package/dist/isEmpty.js +4 -4
- package/dist/isEmpty.js.map +1 -1
- package/dist/isNumericString.d.ts.map +1 -1
- package/dist/isNumericString.js.map +1 -1
- package/dist/isPlainObject.d.ts.map +1 -1
- package/dist/isPlainObject.js.map +1 -1
- package/dist/match.d.ts.map +1 -1
- package/dist/match.js.map +1 -1
- package/dist/memoize.d.ts.map +1 -1
- package/dist/memoize.js.map +1 -1
- package/dist/mostFrequent.d.ts.map +1 -1
- package/dist/mostFrequent.js.map +1 -1
- package/dist/noop.d.ts.map +1 -1
- package/dist/noop.js.map +1 -1
- package/dist/occurrences.d.ts.map +1 -1
- package/dist/occurrences.js.map +1 -1
- package/dist/removeCommonProperties.d.ts.map +1 -1
- package/dist/removeCommonProperties.js.map +1 -1
- package/dist/replace.d.ts.map +1 -1
- package/dist/replace.js.map +1 -1
- package/dist/rethrow.d.ts +1 -1
- package/dist/rethrow.d.ts.map +1 -1
- package/dist/rethrow.js.map +1 -1
- package/dist/round.d.ts.map +1 -1
- package/dist/round.js.map +1 -1
- package/dist/safe.d.ts.map +1 -1
- package/dist/safe.js.map +1 -1
- package/dist/scale.d.ts.map +1 -1
- package/dist/scale.js.map +1 -1
- package/dist/seq.d.ts.map +1 -1
- package/dist/seq.js +5 -1
- package/dist/seq.js.map +1 -1
- package/dist/serialize.d.ts.map +1 -1
- package/dist/serialize.js +2 -2
- package/dist/serialize.js.map +1 -1
- package/dist/serializeToBuffer/serializeToBuffer.d.ts.map +1 -1
- package/dist/serializeToBuffer/serializeToBuffer.js.map +1 -1
- package/dist/serializeToBuffer/unserializeFromBuffer.d.ts.map +1 -1
- package/dist/serializeToBuffer/unserializeFromBuffer.js.map +1 -1
- package/dist/setImmutable.js.map +1 -1
- package/dist/sortBy.d.ts +1 -1
- package/dist/sortBy.d.ts.map +1 -1
- package/dist/sortBy.js.map +1 -1
- package/dist/sortByMultiple.d.ts +1 -1
- package/dist/sortByMultiple.d.ts.map +1 -1
- package/dist/sortByMultiple.js.map +1 -1
- package/dist/trim.d.ts.map +1 -1
- package/dist/trim.js +1 -1
- package/dist/trim.js.map +1 -1
- package/dist/trimEnd.d.ts.map +1 -1
- package/dist/trimEnd.js.map +1 -1
- package/dist/trimStart.d.ts.map +1 -1
- package/dist/trimStart.js.map +1 -1
- package/dist/unique.d.ts +1 -1
- package/dist/unique.d.ts.map +1 -1
- package/dist/unique.js.map +1 -1
- package/dist/utils/utils.js +1 -0
- package/dist/utils/utils.js.map +1 -1
- package/dist/wait.d.ts.map +1 -1
- package/dist/wait.js.map +1 -1
- package/dist/waitFor.d.ts.map +1 -1
- package/dist/waitFor.js.map +1 -1
- package/dist/waitSync.d.ts.map +1 -1
- package/dist/waitSync.js.map +1 -1
- package/docs/assets/hierarchy.js +1 -0
- package/docs/assets/icons.js +1 -1
- package/docs/assets/icons.svg +1 -1
- package/docs/assets/main.js +5 -5
- package/docs/assets/navigation.js +1 -1
- package/docs/assets/search.js +1 -1
- package/docs/assets/style.css +1405 -1288
- package/docs/documents/Changelog.html +370 -0
- package/docs/functions/index.cap.html +3 -3
- package/docs/functions/index.capitalize.html +7 -7
- package/docs/functions/index.coalesce.html +8 -8
- package/docs/functions/index.compareArrays.html +5 -5
- package/docs/functions/index.compareProps.html +5 -5
- package/docs/functions/index.deserialize.html +4 -4
- package/docs/functions/index.ensureArray.html +3 -3
- package/docs/functions/index.ensureDate.html +6 -6
- package/docs/functions/index.ensureError.html +6 -6
- package/docs/functions/index.ensurePrefix.html +5 -5
- package/docs/functions/index.ensureSuffix.html +5 -5
- package/docs/functions/index.ensureTimestamp.html +6 -6
- package/docs/functions/index.escapeRegExp.html +5 -5
- package/docs/functions/index.formatDate.html +5 -2
- package/docs/functions/index.get.html +8 -8
- package/docs/functions/index.getMultiple.html +6 -6
- package/docs/functions/index.ignore.html +8 -0
- package/docs/functions/index.insertSeparator.html +5 -5
- package/docs/functions/index.isEmpty.html +12 -13
- package/docs/functions/index.isNumericString.html +3 -3
- package/docs/functions/index.isPlainObject.html +8 -8
- package/docs/functions/index.last.html +7 -7
- package/docs/functions/index.later-1.html +3 -3
- package/docs/functions/index.mapAsync.html +5 -5
- package/docs/functions/index.mapValues.html +7 -7
- package/docs/functions/index.match.html +4 -4
- package/docs/functions/index.memoize.html +4 -4
- package/docs/functions/index.merge.html +6 -6
- package/docs/functions/index.mostFrequent.html +2 -2
- package/docs/functions/index.noop.html +2 -2
- package/docs/functions/index.occurrences.html +7 -6
- package/docs/functions/index.omit.html +7 -7
- package/docs/functions/index.pick.html +7 -7
- package/docs/functions/index.pull.html +2 -2
- package/docs/functions/index.race.html +5 -5
- package/docs/functions/index.remove.html +2 -2
- package/docs/functions/index.removeCommonProperties.html +5 -5
- package/docs/functions/index.replace.html +6 -6
- package/docs/functions/index.replaceDeep.html +3 -3
- package/docs/functions/index.rethrow.html +2 -2
- package/docs/functions/index.retry.html +4 -4
- package/docs/functions/index.round.html +4 -4
- package/docs/functions/index.safe.html +5 -5
- package/docs/functions/index.sample.html +4 -4
- package/docs/functions/index.samples.html +3 -3
- package/docs/functions/index.scale.html +2 -2
- package/docs/functions/index.seq.html +7 -7
- package/docs/functions/index.seqEarlyBreak.html +6 -6
- package/docs/functions/index.serialize.html +3 -3
- package/docs/functions/index.serializeToBuffer.html +7 -7
- package/docs/functions/index.set.html +8 -8
- package/docs/functions/index.setImmutable.html +7 -7
- package/docs/functions/index.shuffle.html +3 -3
- package/docs/functions/index.sortBy.html +3 -3
- package/docs/functions/index.sortByMultiple.html +5 -5
- package/docs/functions/index.sortProps.html +4 -4
- package/docs/functions/index.stripPrefix.html +3 -3
- package/docs/functions/index.stripSuffix.html +3 -3
- package/docs/functions/index.throttle.html +4 -4
- package/docs/functions/index.toggle.html +4 -4
- package/docs/functions/index.trim.html +4 -4
- package/docs/functions/index.trimEnd.html +4 -4
- package/docs/functions/index.trimStart.html +4 -4
- package/docs/functions/index.truthy.html +4 -4
- package/docs/functions/index.unique.html +4 -4
- package/docs/functions/index.unserializeFromBuffer.html +6 -6
- package/docs/functions/index.wait.html +3 -3
- package/docs/functions/index.waitFor.html +4 -4
- package/docs/functions/index.waitSync.html +3 -3
- package/docs/index.html +16 -16
- package/docs/interfaces/index.ComparePropsOptions.html +4 -4
- package/docs/interfaces/index.GetMultipleSource.html +3 -3
- package/docs/interfaces/index.GetSource.html +3 -3
- package/docs/interfaces/index.IsNumericStringOptions.html +5 -5
- package/docs/interfaces/index.OccurencesOptions.html +2 -2
- package/docs/interfaces/index.SetImmutableSource.html +3 -3
- package/docs/interfaces/index.SetSource.html +3 -3
- package/docs/interfaces/index.ThrottleOptions.html +3 -3
- package/docs/interfaces/index.ThrottledFunctionExtras.html +4 -4
- package/docs/modules/index.html +1 -93
- package/docs/modules.html +1 -3
- package/docs/types/index.CustomDeserializers.html +1 -1
- package/docs/types/index.CustomSerializers.html +1 -1
- package/docs/types/index.Later.html +4 -4
- package/docs/types/index.MapValuesFn.html +7 -7
- package/docs/types/index.MatchCallback.html +1 -1
- package/docs/types/index.MergeTwo.html +2 -2
- package/docs/types/index.SeqEarlyBreaker.html +4 -4
- package/docs/types/index.SeqFn.html +3 -3
- package/docs/types/index.SeqFunctions.html +3 -3
- package/docs/types/index.SetImmutablePath.html +2 -2
- package/docs/types/index.ThrottledFunction.html +1 -1
- package/docs/variables/index.mapValuesUNSET.html +2 -2
- package/docs/variables/index.mergeUNSET.html +3 -3
- package/esm/cap.d.ts.map +1 -1
- package/esm/cap.js.map +1 -1
- package/esm/capitalize.d.ts.map +1 -1
- package/esm/capitalize.js.map +1 -1
- package/esm/compareArrays.d.ts +4 -4
- package/esm/compareArrays.d.ts.map +1 -1
- package/esm/compareArrays.js.map +1 -1
- package/esm/ensureError.d.ts.map +1 -1
- package/esm/ensureError.js +3 -1
- package/esm/ensureError.js.map +1 -1
- package/esm/ensurePrefix.d.ts.map +1 -1
- package/esm/ensurePrefix.js.map +1 -1
- package/esm/ensureSuffix.d.ts.map +1 -1
- package/esm/ensureSuffix.js.map +1 -1
- package/esm/escapeRegExp.d.ts.map +1 -1
- package/esm/escapeRegExp.js.map +1 -1
- package/esm/formatDate.d.ts.map +1 -1
- package/esm/formatDate.js.map +1 -1
- package/esm/getMultiple.d.ts.map +1 -1
- package/esm/getMultiple.js.map +1 -1
- package/esm/ignore.d.ts +3 -0
- package/esm/ignore.d.ts.map +1 -0
- package/esm/ignore.js +13 -0
- package/esm/ignore.js.map +1 -0
- package/esm/index.d.ts +1 -0
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +1 -0
- package/esm/index.js.map +1 -1
- package/esm/isEmpty.d.ts.map +1 -1
- package/esm/isEmpty.js +4 -4
- package/esm/isEmpty.js.map +1 -1
- package/esm/isNumericString.d.ts.map +1 -1
- package/esm/isNumericString.js.map +1 -1
- package/esm/isPlainObject.d.ts.map +1 -1
- package/esm/isPlainObject.js.map +1 -1
- package/esm/match.d.ts.map +1 -1
- package/esm/match.js.map +1 -1
- package/esm/memoize.d.ts.map +1 -1
- package/esm/memoize.js.map +1 -1
- package/esm/mostFrequent.d.ts.map +1 -1
- package/esm/mostFrequent.js.map +1 -1
- package/esm/noop.d.ts.map +1 -1
- package/esm/noop.js.map +1 -1
- package/esm/occurrences.d.ts.map +1 -1
- package/esm/occurrences.js.map +1 -1
- package/esm/removeCommonProperties.d.ts.map +1 -1
- package/esm/removeCommonProperties.js.map +1 -1
- package/esm/replace.d.ts.map +1 -1
- package/esm/replace.js.map +1 -1
- package/esm/rethrow.d.ts +1 -1
- package/esm/rethrow.d.ts.map +1 -1
- package/esm/rethrow.js.map +1 -1
- package/esm/round.d.ts.map +1 -1
- package/esm/round.js.map +1 -1
- package/esm/safe.d.ts.map +1 -1
- package/esm/safe.js.map +1 -1
- package/esm/scale.d.ts.map +1 -1
- package/esm/scale.js.map +1 -1
- package/esm/seq.d.ts.map +1 -1
- package/esm/seq.js +5 -1
- package/esm/seq.js.map +1 -1
- package/esm/serialize.d.ts.map +1 -1
- package/esm/serialize.js +2 -2
- package/esm/serialize.js.map +1 -1
- package/esm/serializeToBuffer/serializeToBuffer.d.ts.map +1 -1
- package/esm/serializeToBuffer/serializeToBuffer.js.map +1 -1
- package/esm/serializeToBuffer/unserializeFromBuffer.d.ts.map +1 -1
- package/esm/serializeToBuffer/unserializeFromBuffer.js.map +1 -1
- package/esm/setImmutable.js.map +1 -1
- package/esm/sortBy.d.ts +1 -1
- package/esm/sortBy.d.ts.map +1 -1
- package/esm/sortBy.js.map +1 -1
- package/esm/sortByMultiple.d.ts +1 -1
- package/esm/sortByMultiple.d.ts.map +1 -1
- package/esm/sortByMultiple.js.map +1 -1
- package/esm/trim.d.ts.map +1 -1
- package/esm/trim.js +1 -1
- package/esm/trim.js.map +1 -1
- package/esm/trimEnd.d.ts.map +1 -1
- package/esm/trimEnd.js.map +1 -1
- package/esm/trimStart.d.ts.map +1 -1
- package/esm/trimStart.js.map +1 -1
- package/esm/unique.d.ts +1 -1
- package/esm/unique.d.ts.map +1 -1
- package/esm/unique.js.map +1 -1
- package/esm/utils/utils.js +1 -0
- package/esm/utils/utils.js.map +1 -1
- package/esm/wait.d.ts.map +1 -1
- package/esm/wait.js.map +1 -1
- package/esm/waitFor.d.ts.map +1 -1
- package/esm/waitFor.js.map +1 -1
- package/esm/waitSync.d.ts.map +1 -1
- package/esm/waitSync.js.map +1 -1
- package/package.json +31 -34
- package/src/cap.ts +1 -1
- package/src/capitalize.ts +3 -3
- package/src/compareArrays.ts +2 -3
- package/src/deserialize.spec.ts +2 -1
- package/src/ensureError.ts +6 -2
- package/src/ensurePrefix.ts +1 -1
- package/src/ensureSuffix.ts +1 -1
- package/src/escapeRegExp.ts +1 -1
- package/src/formatDate.ts +7 -2
- package/src/get.spec.ts +0 -1
- package/src/getMultiple.ts +0 -1
- package/src/ignore.spec.ts +80 -0
- package/src/ignore.ts +38 -0
- package/src/index.ts +1 -0
- package/src/isEmpty.ts +9 -15
- package/src/isNumericString.ts +1 -1
- package/src/isPlainObject.ts +1 -1
- package/src/later.spec.ts +1 -0
- package/src/mapAsync.ts +4 -4
- package/src/match.ts +1 -1
- package/src/memoize.spec.ts +1 -1
- package/src/memoize.ts +1 -1
- package/src/mostFrequent.spec.ts +2 -0
- package/src/mostFrequent.ts +0 -1
- package/src/noop.ts +1 -1
- package/src/occurrences.ts +1 -1
- package/src/remove.spec.ts +1 -1
- package/src/removeCommonProperties.spec.ts +2 -0
- package/src/removeCommonProperties.ts +1 -1
- package/src/replace.ts +1 -1
- package/src/replaceDeep.spec.ts +2 -0
- package/src/replaceDeepByFn.spec.ts +2 -0
- package/src/rethrow.ts +1 -1
- package/src/round.ts +1 -1
- package/src/safe.ts +2 -1
- package/src/scale.ts +1 -1
- package/src/seq.ts +7 -3
- package/src/serialize.spec.ts +2 -1
- package/src/serialize.ts +3 -3
- package/src/serializeToBuffer/serialization.spec.ts +2 -2
- package/src/serializeToBuffer/serializeToBuffer.ts +0 -1
- package/src/serializeToBuffer/unserializeFromBuffer.ts +0 -1
- package/src/setImmutable.ts +1 -1
- package/src/sortBy.ts +3 -1
- package/src/sortByMultiple.ts +5 -3
- package/src/toggle.spec.ts +2 -0
- package/src/trim.spec.ts +2 -0
- package/src/trim.ts +3 -2
- package/src/trimEnd.spec.ts +2 -0
- package/src/trimEnd.ts +1 -1
- package/src/trimStart.spec.ts +2 -0
- package/src/trimStart.ts +1 -1
- package/src/unique.ts +2 -2
- package/src/wait.ts +1 -1
- package/src/waitFor.spec.ts +9 -8
- package/src/waitFor.ts +1 -1
- package/src/waitSync.spec.ts +2 -0
- package/src/waitSync.ts +1 -1
- package/.prettierignore +0 -3
- package/.prettierrc.json +0 -1
- package/docs/documents/CHANGELOG.html +0 -357
- package/pnpm-lock.yaml +0 -6529
- package/typedoc.cjs +0 -3
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// eslint-disable-next-line @typescript-eslint/no-shadow
|
|
2
|
+
import must from "must";
|
|
3
|
+
|
|
4
|
+
// @ts-ignore
|
|
5
|
+
import createSpy from "../test/createSpy";
|
|
6
|
+
import { ignore } from "./ignore";
|
|
7
|
+
import { wait } from "./wait";
|
|
8
|
+
|
|
9
|
+
const syncCrashingFunction = createSpy(() => {
|
|
10
|
+
throw new Error("Sync function crashed");
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
const promiseTypedSyncCrashingFunction = createSpy((): Promise<void> => {
|
|
14
|
+
throw new Error("Promise typed sync function crashed");
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
const asyncCrashingFunction = createSpy(async () => {
|
|
18
|
+
throw new Error("Async function crashed");
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const asyncCrashingFunctionSlow = createSpy(async () => {
|
|
22
|
+
await wait(500);
|
|
23
|
+
throw new Error("Async function crashed");
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const get5 = createSpy(() => 5);
|
|
27
|
+
|
|
28
|
+
describe("ignore", () => {
|
|
29
|
+
beforeEach(() => {
|
|
30
|
+
syncCrashingFunction.__spy.reset();
|
|
31
|
+
promiseTypedSyncCrashingFunction.__spy.reset();
|
|
32
|
+
asyncCrashingFunction.__spy.reset();
|
|
33
|
+
asyncCrashingFunctionSlow.__spy.reset();
|
|
34
|
+
get5.__spy.reset();
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it("it should not crash on sync function crash", async () => {
|
|
38
|
+
ignore(syncCrashingFunction);
|
|
39
|
+
ignore(promiseTypedSyncCrashingFunction);
|
|
40
|
+
// ^ technically this is also a sync crash
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it("it should not crash on async function crash", async () => {
|
|
44
|
+
ignore(asyncCrashingFunction);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("it should not wait for async function", async () => {
|
|
48
|
+
const now = Date.now();
|
|
49
|
+
ignore(asyncCrashingFunctionSlow);
|
|
50
|
+
const after = Date.now();
|
|
51
|
+
if (after - now > 100) {
|
|
52
|
+
throw new Error("Took too long, it waited for the async function");
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it("should not return a value", async () => {
|
|
57
|
+
// eslint-disable-next-line @typescript-eslint/no-confusing-void-expression
|
|
58
|
+
const res = ignore(get5);
|
|
59
|
+
must(res).be.undefined();
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("actually calls the function", async () => {
|
|
63
|
+
must(syncCrashingFunction.__spy.calls.length).be.equal(0);
|
|
64
|
+
must(promiseTypedSyncCrashingFunction.__spy.calls.length).be.equal(0);
|
|
65
|
+
must(asyncCrashingFunction.__spy.calls.length).be.equal(0);
|
|
66
|
+
must(get5.__spy.calls.length).be.equal(0);
|
|
67
|
+
|
|
68
|
+
ignore(syncCrashingFunction);
|
|
69
|
+
must(syncCrashingFunction.__spy.calls.length).be.equal(1);
|
|
70
|
+
|
|
71
|
+
ignore(promiseTypedSyncCrashingFunction);
|
|
72
|
+
must(promiseTypedSyncCrashingFunction.__spy.calls.length).be.equal(1);
|
|
73
|
+
|
|
74
|
+
ignore(asyncCrashingFunction);
|
|
75
|
+
must(asyncCrashingFunction.__spy.calls.length).be.equal(1);
|
|
76
|
+
|
|
77
|
+
ignore(get5);
|
|
78
|
+
must(get5.__spy.calls.length).be.equal(1);
|
|
79
|
+
});
|
|
80
|
+
});
|
package/src/ignore.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A function that executes a callback and ignores it completely, if it throws an error, returns any value, rejects
|
|
3
|
+
* a promise - it will be all ignored. It will attach a catch handler to any returned promise to avoid unhandled
|
|
4
|
+
* rejections.
|
|
5
|
+
*
|
|
6
|
+
* Use it whenever you want to call a function, but you are not interested in its result or failure.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```javascript
|
|
10
|
+
* import { trackPageVisit } from "analytics-service";
|
|
11
|
+
*
|
|
12
|
+
* function onButtonClick() {
|
|
13
|
+
* ignore(() => trackPageVisit("button-click"));
|
|
14
|
+
* // ^ prevent uncaught errors or unhandled promise rejections from trackPageVisit
|
|
15
|
+
* }
|
|
16
|
+
* Promise.resolve(5).then(ignore(trackPageVisit)).then((value) => {
|
|
17
|
+
* console.log(value); // 5, won't ever crash due to errors in trackPageVisit
|
|
18
|
+
* });
|
|
19
|
+
* ```
|
|
20
|
+
* @param callback
|
|
21
|
+
*/
|
|
22
|
+
const ignore = (callback: () => unknown): undefined => {
|
|
23
|
+
try {
|
|
24
|
+
// eslint-disable-next-line callback-return
|
|
25
|
+
const p = callback();
|
|
26
|
+
if (p && typeof p === "object"
|
|
27
|
+
&& "then" in p && typeof p.then === "function"
|
|
28
|
+
&& "catch" in p && typeof p.catch === "function") {
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
|
30
|
+
p.catch(() => null);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch {}
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export {
|
|
37
|
+
ignore,
|
|
38
|
+
};
|
package/src/index.ts
CHANGED
|
@@ -17,6 +17,7 @@ export * from "./escapeRegExp.js";
|
|
|
17
17
|
export * from "./formatDate.js";
|
|
18
18
|
export * from "./get.js";
|
|
19
19
|
export * from "./getMultiple.js";
|
|
20
|
+
export * from "./ignore.js";
|
|
20
21
|
export * from "./insertSeparator.js";
|
|
21
22
|
export * from "./isEmpty.js";
|
|
22
23
|
export * from "./isNumericString.js";
|
package/src/isEmpty.ts
CHANGED
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
interface ObjectWithLength {
|
|
2
|
-
length: number;
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
interface ObjectWithSize {
|
|
6
|
-
size: number;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
1
|
/**
|
|
10
2
|
* Returns true if passed argument seems to be empty.
|
|
11
3
|
* Nil values are empty.
|
|
@@ -15,7 +7,7 @@ interface ObjectWithSize {
|
|
|
15
7
|
* Arrays and array-like objects are considered empty when length value is 0.
|
|
16
8
|
* Map, Set and -like objects are considered empty when size value is 0.
|
|
17
9
|
*
|
|
18
|
-
* @param
|
|
10
|
+
* @param obj - source value
|
|
19
11
|
* @example isEmpty({}) // true
|
|
20
12
|
* @example isEmpty(100) // throws
|
|
21
13
|
* @example isEmpty([]) // true
|
|
@@ -23,9 +15,11 @@ interface ObjectWithSize {
|
|
|
23
15
|
* @example isEmpty({ length: 5 }) // false
|
|
24
16
|
* @example isEmpty({ length: 0 }) // true
|
|
25
17
|
* @example isEmpty({ size: 0 }) // true
|
|
26
|
-
* @returns
|
|
18
|
+
* @returns is value considered empty
|
|
19
|
+
*
|
|
20
|
+
* @deprecated This function is not needed in a modern, type-safe code and is encouraging bad practices in general.
|
|
27
21
|
*/
|
|
28
|
-
const isEmpty = (obj: unknown) => {
|
|
22
|
+
const isEmpty = (obj: unknown): boolean => {
|
|
29
23
|
if (typeof obj === "string") {
|
|
30
24
|
return !obj.length;
|
|
31
25
|
}
|
|
@@ -38,11 +32,11 @@ const isEmpty = (obj: unknown) => {
|
|
|
38
32
|
if (Array.isArray(obj)) {
|
|
39
33
|
return !Object.keys(obj).length;
|
|
40
34
|
}
|
|
41
|
-
if ("length" in obj) {
|
|
42
|
-
return !(obj
|
|
35
|
+
if ("length" in obj && typeof obj.length === "number") {
|
|
36
|
+
return !(obj).length;
|
|
43
37
|
}
|
|
44
|
-
if ("size" in obj) {
|
|
45
|
-
return !(obj
|
|
38
|
+
if ("size" in obj && typeof obj.size === "number") {
|
|
39
|
+
return !(obj).size;
|
|
46
40
|
}
|
|
47
41
|
return !Object.keys(obj).length;
|
|
48
42
|
};
|
package/src/isNumericString.ts
CHANGED
|
@@ -17,7 +17,7 @@ const NOT_FOUND = -1;
|
|
|
17
17
|
* @param {boolean} [options.allowInfinity=false] - Allow Infinity and -Infinity (casing matters)
|
|
18
18
|
* @param {boolean} [options.allowNaN=false] - Allow NaN (casing matters)
|
|
19
19
|
*/
|
|
20
|
-
const isNumericString = (string: string, options: Options = {}) => { // eslint-disable-line max-statements, max-lines-per-function
|
|
20
|
+
const isNumericString = (string: string, options: Options = {}): boolean => { // eslint-disable-line max-statements, max-lines-per-function
|
|
21
21
|
if (typeof string !== "string") {
|
|
22
22
|
throw new TypeError("Expected a string");
|
|
23
23
|
}
|
package/src/isPlainObject.ts
CHANGED
package/src/later.spec.ts
CHANGED
package/src/mapAsync.ts
CHANGED
|
@@ -7,10 +7,10 @@ const DEFAULT_WAIT_TIME = 1;
|
|
|
7
7
|
* Non-blocking version of `Array.prototype.map`, it will pause the map loop every `pauseEvery`. Keep in mind that
|
|
8
8
|
* depending on your code workload the pause interval and duration may be exact or longer than specified. It's the same
|
|
9
9
|
* single thread JavaScript nature setTimeout have to follow.
|
|
10
|
-
* @param
|
|
11
|
-
* @param
|
|
12
|
-
* @param
|
|
13
|
-
* @param
|
|
10
|
+
* @param context - original array
|
|
11
|
+
* @param callback - map function
|
|
12
|
+
* @param pauseEvery - pause after this many ms
|
|
13
|
+
* @param pauseTime - how long to wait on pause
|
|
14
14
|
*/
|
|
15
15
|
const mapAsync = async <T, Y>(
|
|
16
16
|
context: readonly T[],
|
package/src/match.ts
CHANGED
|
@@ -5,7 +5,7 @@ type MatchCallback<T> = (value: T) => boolean;
|
|
|
5
5
|
* @param {Array} list - original array
|
|
6
6
|
* @param {function} fn - function matching elements
|
|
7
7
|
*/
|
|
8
|
-
const match = <T>(list: T[], fn: MatchCallback<T>) => {
|
|
8
|
+
const match = <T>(list: T[], fn: MatchCallback<T>): { matched: T[]; unmatched: T[] } => {
|
|
9
9
|
const matched: T[] = [];
|
|
10
10
|
const unmatched: T[] = [];
|
|
11
11
|
list.forEach(item => {
|
package/src/memoize.spec.ts
CHANGED
package/src/memoize.ts
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* @param fn - function to memoize
|
|
11
11
|
* @returns memoized function
|
|
12
12
|
*/
|
|
13
|
-
const memoize = <Args extends unknown[], Ret>(fn: (...args: Args) => Ret) => {
|
|
13
|
+
const memoize = <Args extends unknown[], Ret>(fn: (...args: Args) => Ret): (this: unknown, ...args: Args) => Ret => {
|
|
14
14
|
let lastArgs: Args | undefined, lastResult: Ret, lastThis: unknown;
|
|
15
15
|
|
|
16
16
|
return function memoized(this: unknown, ...args: Args): Ret {
|
package/src/mostFrequent.spec.ts
CHANGED
package/src/mostFrequent.ts
CHANGED
package/src/noop.ts
CHANGED
package/src/occurrences.ts
CHANGED
|
@@ -18,7 +18,7 @@ const NOT_FOUND = -1;
|
|
|
18
18
|
* @param {object} [options] - options
|
|
19
19
|
* @param {boolean} [options.overlap=false] - allow overlapping matches, ie "aa" in "aaa" will return 2 instead of 1
|
|
20
20
|
*/
|
|
21
|
-
const occurrences = (string: string, search: string, { overlap }: Options = {}) => {
|
|
21
|
+
const occurrences = (string: string, search: string, { overlap }: Options = {}): number => {
|
|
22
22
|
if (typeof string !== "string") {
|
|
23
23
|
throw new TypeError("Expected a string");
|
|
24
24
|
}
|
package/src/remove.spec.ts
CHANGED
|
@@ -22,7 +22,7 @@ type Obj = Record<string, unknown>;
|
|
|
22
22
|
* @example removeCommonProperties({ title: "Hello", author: "John"}, { title: "Hello 2", author: "John" }, { title: "Hello 3", author: "Matt" });
|
|
23
23
|
* // targets: { title: "Hello 2", author: "John" }, { title: "Hello 3", author: "Matt" }
|
|
24
24
|
*/
|
|
25
|
-
const removeCommonProperties = (source: Obj, target1: Obj, ...targetN: Obj[]) => {
|
|
25
|
+
const removeCommonProperties = (source: Obj, target1: Obj, ...targetN: Obj[]): void => {
|
|
26
26
|
const targets = [target1, ...targetN];
|
|
27
27
|
const keys = Object.keys(source);
|
|
28
28
|
for (const key of keys) {
|
package/src/replace.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { escapeRegExp } from "./escapeRegExp.js";
|
|
|
7
7
|
* @example replace("Hello, %name%!", { "%name%: "John" }) // "Hello, John!"
|
|
8
8
|
* @example replace("Hello, %name%! Nice to meet you %name%!", { "%name%": "Jane" }) // "Hello, Jane! Nice to meet you Jane!"
|
|
9
9
|
*/
|
|
10
|
-
const replace = (source: string, replaceMap: Record<string, string>) => {
|
|
10
|
+
const replace = (source: string, replaceMap: Record<string, string>): string => {
|
|
11
11
|
const keys = Object.keys(replaceMap);
|
|
12
12
|
if (keys.length === 0) {
|
|
13
13
|
return source;
|
package/src/replaceDeep.spec.ts
CHANGED
package/src/rethrow.ts
CHANGED
package/src/round.ts
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* @param value - value to round
|
|
11
11
|
* @param precision - precision to round to
|
|
12
12
|
*/
|
|
13
|
-
const round = (value: number, precision?: number) => {
|
|
13
|
+
const round = (value: number, precision?: number): number => {
|
|
14
14
|
// eslint-disable-next-line @typescript-eslint/no-magic-numbers
|
|
15
15
|
const multiplier = Math.pow(10, precision || 0);
|
|
16
16
|
return Math.round(value * multiplier) / multiplier;
|
package/src/safe.ts
CHANGED
|
@@ -10,11 +10,12 @@ function safe<T, Y>(fn: () => T, def: Y): T | Y;
|
|
|
10
10
|
* safe(() => JSON.parse(unknownString), null); // if unknownString is not a valid JSON, null will be returned
|
|
11
11
|
* safe(() => trySomethingComplicated(), defaultValue); // if trySomethingComplicated throws, defaultValue will be returned
|
|
12
12
|
*/
|
|
13
|
-
function safe<T, Y>(fn: () => T, def?: Y)
|
|
13
|
+
function safe<T, Y>(fn: () => T, def?: Y): T | (Y extends undefined ? undefined : Y) {
|
|
14
14
|
try {
|
|
15
15
|
return fn();
|
|
16
16
|
}
|
|
17
17
|
catch {
|
|
18
|
+
// @ts-ignore ts can't do conditional returns in runtime
|
|
18
19
|
return def;
|
|
19
20
|
}
|
|
20
21
|
}
|
package/src/scale.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* @param {number} toMax
|
|
10
10
|
* @param {number} number
|
|
11
11
|
*/
|
|
12
|
-
const scale = (fromMin: number, fromMax: number, toMin: number, toMax: number, number: number) => {
|
|
12
|
+
const scale = (fromMin: number, fromMax: number, toMin: number, toMax: number, number: number): number => {
|
|
13
13
|
return toMin + ((number - fromMin) / (fromMax - fromMin) * (toMax - toMin));
|
|
14
14
|
};
|
|
15
15
|
|
package/src/seq.ts
CHANGED
|
@@ -48,7 +48,11 @@ const run = <T>(list: Fn<T>[], earlyBreaker?: EarlyBreaker): Promise<T> => {
|
|
|
48
48
|
}
|
|
49
49
|
const fn = promises.shift();
|
|
50
50
|
if (typeof fn !== "function") {
|
|
51
|
-
const finalError = new Error("Every function had thrown."
|
|
51
|
+
const finalError = new Error("Every function had thrown.", {
|
|
52
|
+
cause: {
|
|
53
|
+
errors,
|
|
54
|
+
},
|
|
55
|
+
});
|
|
52
56
|
// @ts-expect-error More details on error object are wanted
|
|
53
57
|
finalError.details = { errors };
|
|
54
58
|
reject(finalError);
|
|
@@ -73,7 +77,7 @@ const run = <T>(list: Fn<T>[], earlyBreaker?: EarlyBreaker): Promise<T> => {
|
|
|
73
77
|
* arguments with array
|
|
74
78
|
* @returns {*} - whatever gets returned from given functions
|
|
75
79
|
*/
|
|
76
|
-
const seqEarlyBreak = <T>(earlyBreaker: EarlyBreaker | undefined, ...args: Functions<T>) => {
|
|
80
|
+
const seqEarlyBreak = <T>(earlyBreaker: EarlyBreaker | undefined, ...args: Functions<T>): Promise<T> => {
|
|
77
81
|
if (args.length === 1) {
|
|
78
82
|
return run(Array.isArray(args[0]) ? args[0] : [args[0]], earlyBreaker);
|
|
79
83
|
}
|
|
@@ -91,7 +95,7 @@ const seqEarlyBreak = <T>(earlyBreaker: EarlyBreaker | undefined, ...args: Funct
|
|
|
91
95
|
* arguments with array
|
|
92
96
|
* @returns {*} - whatever gets returned from given functions
|
|
93
97
|
*/
|
|
94
|
-
const seq = <T>(...fns: Functions<T>) => {
|
|
98
|
+
const seq = <T>(...fns: Functions<T>): Promise<T> => {
|
|
95
99
|
return seqEarlyBreak(undefined, ...fns);
|
|
96
100
|
};
|
|
97
101
|
|
package/src/serialize.spec.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import must from "must"; // eslint-disable-line @typescript-eslint/no-shadow
|
|
2
|
+
|
|
1
3
|
import type { CustomSerializers } from "./serialize";
|
|
2
4
|
|
|
3
5
|
import { serialize } from "./serialize";
|
|
@@ -9,7 +11,6 @@ interface Test {
|
|
|
9
11
|
class Person {
|
|
10
12
|
public name: string;
|
|
11
13
|
|
|
12
|
-
// eslint-disable-next-line @typescript-eslint/no-shadow
|
|
13
14
|
public constructor(name: string) {
|
|
14
15
|
this.name = name;
|
|
15
16
|
}
|
package/src/serialize.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { sortProps } from "./sortProps.js";
|
|
2
|
-
import { replaceDeepByFn } from "./replaceDeepByFn.js";
|
|
3
1
|
import { isPlainObject } from "./isPlainObject.js";
|
|
2
|
+
import { replaceDeepByFn } from "./replaceDeepByFn.js";
|
|
3
|
+
import { sortProps } from "./sortProps.js";
|
|
4
4
|
import { DataWrapper } from "./utils/utils.js";
|
|
5
5
|
|
|
6
6
|
type CustomSerializers = {
|
|
@@ -34,7 +34,7 @@ type Options = {
|
|
|
34
34
|
* @param customSerializers - an object with custom serializers
|
|
35
35
|
* @param options - options
|
|
36
36
|
*/
|
|
37
|
-
const serialize = (data: unknown, customSerializers?: CustomSerializers, options?: Options) => { // eslint-disable-line max-lines-per-function
|
|
37
|
+
const serialize = (data: unknown, customSerializers?: CustomSerializers, options?: Options): string => { // eslint-disable-line max-lines-per-function
|
|
38
38
|
const sourceData = Object.keys(customSerializers ?? {}).length
|
|
39
39
|
? replaceDeepByFn(
|
|
40
40
|
data,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import must from "must"; // eslint-disable-line @typescript-eslint/no-shadow
|
|
2
2
|
|
|
3
|
-
import { unserializeFromBuffer } from "./unserializeFromBuffer";
|
|
4
3
|
import { serializeToBuffer } from "./serializeToBuffer";
|
|
4
|
+
import { unserializeFromBuffer } from "./unserializeFromBuffer";
|
|
5
5
|
|
|
6
6
|
const serialize = serializeToBuffer.bind(null, Buffer, []);
|
|
7
7
|
const unserialize = unserializeFromBuffer.bind(null, Buffer, []);
|
|
@@ -41,7 +41,7 @@ describe("serialization", () => {
|
|
|
41
41
|
});
|
|
42
42
|
|
|
43
43
|
it("serializes JSON-looking string", async () => {
|
|
44
|
-
const data = [
|
|
44
|
+
const data = ["\"TEST\""];
|
|
45
45
|
must(unserialize(serialize(...data))).eql(data);
|
|
46
46
|
});
|
|
47
47
|
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { serialize } from "../serialize.js";
|
|
2
|
-
|
|
3
2
|
import { BINARY_MARK_BIN, BINARY_MARK_JSON, BINARY_MARK_STRING } from "./const.js";
|
|
4
3
|
|
|
5
4
|
type SerializeArgs = Parameters<typeof serialize> extends [any, ...infer Rest] ? Rest : never; // eslint-disable-line @typescript-eslint/no-explicit-any
|
package/src/setImmutable.ts
CHANGED
|
@@ -9,7 +9,7 @@ const isObject = (value: unknown) => (typeof value === "object" || typeof value
|
|
|
9
9
|
|
|
10
10
|
const clone = (value: unknown[] | Source) => {
|
|
11
11
|
if (Array.isArray(value)) {
|
|
12
|
-
return [...value
|
|
12
|
+
return [...value];
|
|
13
13
|
}
|
|
14
14
|
return { ...value };
|
|
15
15
|
};
|
package/src/sortBy.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-magic-numbers */
|
|
2
|
+
|
|
1
3
|
import { sortByMultiple } from "./sortByMultiple.js";
|
|
2
4
|
|
|
3
5
|
/**
|
|
@@ -10,7 +12,7 @@ import { sortByMultiple } from "./sortByMultiple.js";
|
|
|
10
12
|
*/
|
|
11
13
|
const sortBy = <T extends Record<string | number | symbol, any>>( // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
12
14
|
propertyName: keyof T, asc = true, defaultValue: unknown = null,
|
|
13
|
-
) => (a: T, b: T) => {
|
|
15
|
+
) => (a: T, b: T): -1 | 0 | 1 => {
|
|
14
16
|
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any
|
|
15
17
|
return sortByMultiple([propertyName], asc, { [propertyName]: defaultValue } as Partial<Record<keyof T, any>>)(a, b);
|
|
16
18
|
};
|
package/src/sortByMultiple.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-magic-numbers */
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* Returns a function that can be used as a callback to `.sort()` method. Returned function will sort array by given
|
|
3
5
|
* properties.
|
|
@@ -34,12 +36,12 @@ const sortByMultiple = <
|
|
|
34
36
|
ascending: boolean | Record<K[number], boolean> = true,
|
|
35
37
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
36
38
|
defaultValues?: Partial<Record<K[number], any>>, // Force defaultValues to use only keys from K
|
|
37
|
-
): ((a: T, b: T) =>
|
|
39
|
+
): ((a: T, b: T) => 1 | -1 | 0) => (a: T, b: T): 1 | -1 | 0 => {
|
|
38
40
|
for (const propertyName of propertyNames) {
|
|
39
41
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
40
42
|
const asc = typeof ascending === "boolean" ? ascending : (ascending[propertyName] ?? true);
|
|
41
|
-
const aBiggerValue = asc ? 1 : -1;
|
|
42
|
-
const bBiggerValue = asc ? -1 : 1;
|
|
43
|
+
const aBiggerValue = asc ? 1 : -1;
|
|
44
|
+
const bBiggerValue = asc ? -1 : 1;
|
|
43
45
|
|
|
44
46
|
const aValue = a[propertyName] ?? defaultValues?.[propertyName];
|
|
45
47
|
const bValue = b[propertyName] ?? defaultValues?.[propertyName];
|
package/src/toggle.spec.ts
CHANGED
package/src/trim.spec.ts
CHANGED
package/src/trim.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { trimStart } from "./trimStart.js";
|
|
2
1
|
import { trimEnd } from "./trimEnd.js";
|
|
2
|
+
import { trimStart } from "./trimStart.js";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Removes given characters from both sides of the string.
|
|
@@ -14,10 +14,11 @@ import { trimEnd } from "./trimEnd.js";
|
|
|
14
14
|
* trim("!aaa!!!", "!"); // "aaa"
|
|
15
15
|
* trim("!aaa!!!", "!!!"); // "!aaa"
|
|
16
16
|
*/
|
|
17
|
-
const trim = (source: string, characters: string) => {
|
|
17
|
+
const trim = (source: string, characters: string): string => {
|
|
18
18
|
return trimStart(trimEnd(source, characters), characters);
|
|
19
19
|
};
|
|
20
20
|
|
|
21
21
|
export {
|
|
22
22
|
trim,
|
|
23
23
|
};
|
|
24
|
+
|
package/src/trimEnd.spec.ts
CHANGED
package/src/trimEnd.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* trimEnd("abcxzyz", "yz"); // "abcxz"
|
|
10
10
|
* trimEnd("!aaa!!", "!"); // "!aaa"
|
|
11
11
|
*/
|
|
12
|
-
const trimEnd = (source: string, characters: string) => {
|
|
12
|
+
const trimEnd = (source: string, characters: string): string => {
|
|
13
13
|
let s = source;
|
|
14
14
|
while (s.endsWith(characters)) {
|
|
15
15
|
s = s.slice(0, -characters.length);
|
package/src/trimStart.spec.ts
CHANGED
package/src/trimStart.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* trimStart("abbcb", "ab"); // "bcb"
|
|
10
10
|
* trimStart("!!aaa!", "!"); // "aaa!"
|
|
11
11
|
*/
|
|
12
|
-
const trimStart = (source: string, characters: string) => {
|
|
12
|
+
const trimStart = (source: string, characters: string): string => {
|
|
13
13
|
let s = source;
|
|
14
14
|
while (s.startsWith(characters)) {
|
|
15
15
|
s = s.slice(characters.length);
|
package/src/unique.ts
CHANGED
package/src/wait.ts
CHANGED