@oscarpalmer/atoms 0.193.1 → 0.195.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/array/difference.mjs +2 -2
- package/dist/array/index.d.mts +2 -2
- package/dist/array/index.mjs +2 -2
- package/dist/array/intersection.mjs +2 -2
- package/dist/array/move.mjs +1 -1
- package/dist/array/slice.mjs +5 -5
- package/dist/array/sort.d.mts +5 -1
- package/dist/array/sort.mjs +4 -2
- package/dist/array/swap.mjs +1 -1
- package/dist/array/union.mjs +2 -2
- package/dist/beacon.d.mts +8 -1
- package/dist/beacon.mjs +52 -60
- package/dist/color/constants.d.mts +1 -1
- package/dist/color/constants.mjs +3 -5
- package/dist/color/instance.mjs +34 -41
- package/dist/color/misc/format.d.mts +3 -2
- package/dist/color/misc/format.mjs +4 -1
- package/dist/color/misc/is.d.mts +9 -1
- package/dist/color/misc/is.mjs +11 -1
- package/dist/color/misc/state.d.mts +6 -6
- package/dist/color/misc/state.mjs +11 -14
- package/dist/color/models.d.mts +23 -68
- package/dist/color/space/hex.mjs +1 -1
- package/dist/color/space/rgb.mjs +1 -1
- package/dist/function/index.d.mts +1 -2
- package/dist/function/index.mjs +1 -2
- package/dist/function/limit.d.mts +0 -6
- package/dist/function/limit.mjs +2 -2
- package/dist/function/once.d.mts +0 -3
- package/dist/function/once.mjs +17 -14
- package/dist/function/retry.d.mts +1 -24
- package/dist/function/retry.mjs +1 -1
- package/dist/herald.d.mts +2 -72
- package/dist/herald.mjs +2 -92
- package/dist/index.d.mts +3332 -3418
- package/dist/index.mjs +1850 -1870
- package/dist/internal/abort.d.mts +10 -0
- package/dist/internal/abort.mjs +14 -0
- package/dist/internal/array/chunk.mjs +2 -2
- package/dist/internal/array/find.mjs +2 -2
- package/dist/{array → internal/array}/get.d.mts +2 -2
- package/dist/{array → internal/array}/get.mjs +2 -2
- package/dist/{array → internal/array}/match.d.mts +2 -2
- package/dist/{array → internal/array}/match.mjs +15 -15
- package/dist/internal/array/sets.d.mts +4 -4
- package/dist/internal/array/sets.mjs +7 -7
- package/dist/internal/defaults.d.mts +5 -0
- package/dist/internal/defaults.mjs +9 -0
- package/dist/{function → internal/function}/assert.d.mts +2 -2
- package/dist/{function → internal/function}/assert.mjs +4 -4
- package/dist/{function → internal/function}/memoize.d.mts +2 -2
- package/dist/{function → internal/function}/memoize.mjs +22 -35
- package/dist/internal/function/timer.mjs +19 -15
- package/dist/{function → internal/function}/work.d.mts +2 -2
- package/dist/{function → internal/function}/work.mjs +15 -13
- package/dist/internal/herald.d.mts +71 -0
- package/dist/internal/herald.mjs +110 -0
- package/dist/internal/number.d.mts +1 -2
- package/dist/internal/number.mjs +8 -11
- package/dist/internal/{result.d.mts → result/misc.d.mts} +42 -3
- package/dist/internal/result/misc.mjs +51 -0
- package/dist/{result → internal/result}/models.d.mts +2 -2
- package/dist/{sized → internal/sized}/map.d.mts +1 -1
- package/dist/{sized → internal/sized}/map.mjs +2 -2
- package/dist/internal/{sized.d.mts → sized/misc.d.mts} +1 -1
- package/dist/internal/sized/misc.mjs +12 -0
- package/dist/{string → internal/string}/case.d.mts +1 -1
- package/dist/{string → internal/string}/case.mjs +22 -22
- package/dist/internal/{string.d.mts → string/misc.d.mts} +1 -1
- package/dist/internal/{string.mjs → string/misc.mjs} +5 -5
- package/dist/internal/subscription.d.mts +24 -8
- package/dist/internal/subscription.mjs +49 -36
- package/dist/internal/value/compare.mjs +1 -1
- package/dist/internal/value/equal.mjs +6 -6
- package/dist/internal/value/has.d.mts +1 -1
- package/dist/internal/value/misc.d.mts +1 -1
- package/dist/internal/value/misc.mjs +16 -16
- package/dist/internal/value/set.mjs +2 -2
- package/dist/is.mjs +2 -2
- package/dist/logger.mjs +15 -39
- package/dist/promise/constants.d.mts +17 -0
- package/dist/promise/constants.mjs +14 -0
- package/dist/promise/delay.mjs +7 -10
- package/dist/promise/helpers.d.mts +1 -1
- package/dist/promise/helpers.mjs +3 -3
- package/dist/promise/index.d.mts +1 -1
- package/dist/promise/index.mjs +14 -17
- package/dist/promise/misc.d.mts +3 -2
- package/dist/promise/misc.mjs +10 -8
- package/dist/promise/models.d.mts +5 -17
- package/dist/promise/models.mjs +4 -13
- package/dist/promise/timed.mjs +9 -10
- package/dist/query.mjs +16 -16
- package/dist/queue.mjs +104 -120
- package/dist/random.mjs +8 -8
- package/dist/result/index.d.mts +1 -4
- package/dist/result/index.mjs +2 -2
- package/dist/result/match.d.mts +1 -4
- package/dist/result/match.mjs +5 -5
- package/dist/result/misc.d.mts +3 -42
- package/dist/result/misc.mjs +4 -30
- package/dist/result/work/flow.d.mts +1 -4
- package/dist/result/work/flow.mjs +6 -6
- package/dist/result/work/pipe.d.mts +1 -4
- package/dist/result/work/pipe.mjs +5 -5
- package/dist/sized/set.mjs +1 -1
- package/dist/string/fuzzy.mjs +25 -20
- package/dist/string/index.d.mts +1 -1
- package/dist/string/index.mjs +8 -8
- package/dist/string/match.mjs +1 -1
- package/dist/string/normalize.mjs +16 -16
- package/dist/string/template.mjs +3 -3
- package/dist/subscription.d.mts +2 -0
- package/dist/subscription.mjs +2 -0
- package/dist/value/clone.mjs +10 -10
- package/dist/value/diff.mjs +1 -1
- package/dist/value/smush.mjs +3 -3
- package/package.json +35 -14
- package/dist/internal/result.mjs +0 -25
- package/dist/internal/sized.mjs +0 -12
- /package/dist/{result → internal/result}/models.mjs +0 -0
|
@@ -60,7 +60,7 @@ function equalPlainObject(first, second, options) {
|
|
|
60
60
|
firstKeys = firstKeys.filter((key) => filterKey(key, options));
|
|
61
61
|
secondKeys = secondKeys.filter((key) => filterKey(key, options));
|
|
62
62
|
}
|
|
63
|
-
const secondSet = secondKeys.length >=
|
|
63
|
+
const secondSet = secondKeys.length >= EQUAL_MINIMUM_LENGTH_FOR_SET ? new Set(secondKeys) : void 0;
|
|
64
64
|
const { length } = firstKeys;
|
|
65
65
|
if (length !== secondKeys.length) return false;
|
|
66
66
|
for (let index = 0; index < length; index += 1) {
|
|
@@ -105,9 +105,9 @@ function equalValue(first, second, options) {
|
|
|
105
105
|
case first instanceof ArrayBuffer && second instanceof ArrayBuffer: return equalArrayBuffer(first, second, options);
|
|
106
106
|
case first instanceof Date && second instanceof Date: return Object.is(first.getTime(), second.getTime());
|
|
107
107
|
case first instanceof DataView && second instanceof DataView: return equalDataView(first, second, options);
|
|
108
|
-
case first instanceof Error && second instanceof Error: return equalProperties(first, second,
|
|
108
|
+
case first instanceof Error && second instanceof Error: return equalProperties(first, second, EQUAL_ERROR_PROPERTIES, options);
|
|
109
109
|
case first instanceof Map && second instanceof Map: return equalMap(first, second, options);
|
|
110
|
-
case first instanceof RegExp && second instanceof RegExp: return equalProperties(first, second,
|
|
110
|
+
case first instanceof RegExp && second instanceof RegExp: return equalProperties(first, second, EQUAL_EXPRESSION_PROPERTIES, options);
|
|
111
111
|
case first instanceof Set && second instanceof Set: return equalSet(first, second, options);
|
|
112
112
|
case Array.isArray(first) && Array.isArray(second): return equalArray(first, second, options);
|
|
113
113
|
case isPlainObject(first) && isPlainObject(second): return equalPlainObject(first, second, options);
|
|
@@ -169,8 +169,8 @@ function registerEqualizer(constructor, handler) {
|
|
|
169
169
|
}
|
|
170
170
|
const EQUAL_ARRAY_PEEK_PERCENTAGE = 10;
|
|
171
171
|
const EQUAL_ARRAY_THRESHOLD = 100;
|
|
172
|
-
const
|
|
173
|
-
const
|
|
174
|
-
const
|
|
172
|
+
const EQUAL_ERROR_PROPERTIES = ["name", "message"];
|
|
173
|
+
const EQUAL_EXPRESSION_PROPERTIES = ["source", "flags"];
|
|
174
|
+
const EQUAL_MINIMUM_LENGTH_FOR_SET = 16;
|
|
175
175
|
//#endregion
|
|
176
176
|
export { deregisterEqualizer, equal, initializeEqualizer, registerEqualizer };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { NestedKeys, NestedValue, PlainObject, ToString } from "../../models.mjs";
|
|
2
|
-
import { Result } from "
|
|
2
|
+
import { Result } from "../result/models.mjs";
|
|
3
3
|
//#region src/internal/value/has.d.ts
|
|
4
4
|
/**
|
|
5
5
|
* Check if a property is defined in an object
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Result } from "
|
|
1
|
+
import { Result } from "../result/models.mjs";
|
|
2
2
|
//#region src/internal/value/misc.d.ts
|
|
3
3
|
declare function findKey(needle: string, haystack: object): string;
|
|
4
4
|
declare function getNestedValue(data: object, path: string, ignoreCase: boolean): Result<unknown, string>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ignoreKey } from "../string.mjs";
|
|
2
|
-
import { error, ok } from "
|
|
1
|
+
import { ignoreKey } from "../string/misc.mjs";
|
|
2
|
+
import { error, ok } from "../result/misc.mjs";
|
|
3
3
|
//#region src/internal/value/misc.ts
|
|
4
4
|
function findKey(needle, haystack) {
|
|
5
5
|
const keys = Object.keys(haystack);
|
|
@@ -7,8 +7,8 @@ function findKey(needle, haystack) {
|
|
|
7
7
|
return index > -1 ? keys[index] : needle;
|
|
8
8
|
}
|
|
9
9
|
function getNestedValue(data, path, ignoreCase) {
|
|
10
|
-
if (typeof data !== "object" || data === null) return error(
|
|
11
|
-
if (typeof path !== "string" || path.trim().length === 0) return error(
|
|
10
|
+
if (typeof data !== "object" || data === null) return error(MISC_NESTED_MESSAGE_INPUT);
|
|
11
|
+
if (typeof path !== "string" || path.trim().length === 0) return error(MISC_NESTED_MESSAGE_PATH);
|
|
12
12
|
const shouldIgnoreCase = ignoreCase === true;
|
|
13
13
|
const paths = getPaths(path, shouldIgnoreCase);
|
|
14
14
|
if (typeof paths === "string") return handleValue(data, paths, null, true, shouldIgnoreCase);
|
|
@@ -24,24 +24,24 @@ function getNestedValue(data, path, ignoreCase) {
|
|
|
24
24
|
}
|
|
25
25
|
function getPaths(path, lowercase) {
|
|
26
26
|
const normalized = lowercase ? path.toLowerCase() : path;
|
|
27
|
-
if (!
|
|
28
|
-
return normalized.replace(
|
|
27
|
+
if (!MISC_EXPRESSION_NESTED.test(normalized)) return normalized;
|
|
28
|
+
return normalized.replace(MISC_EXPRESSION_BRACKET, ".$1").replace(MISC_EXPRESSION_DOTS, "").split(".");
|
|
29
29
|
}
|
|
30
30
|
function handleValue(data, path, value, get, ignoreCase) {
|
|
31
31
|
if (typeof data === "object" && data !== null) {
|
|
32
|
-
if (ignoreKey(path)) return error(
|
|
32
|
+
if (ignoreKey(path)) return error(MISC_NESTED_MESSAGE_UNSAFE);
|
|
33
33
|
const key = ignoreCase ? findKey(path, data) : path;
|
|
34
|
-
if (get) return key in data ? ok(data[key]) : error(
|
|
34
|
+
if (get) return key in data ? ok(data[key]) : error(MISC_NESTED_MESSAGE_MISSING);
|
|
35
35
|
data[key] = typeof value === "function" ? value(data[key]) : value;
|
|
36
36
|
}
|
|
37
|
-
if (get) return error(
|
|
37
|
+
if (get) return error(MISC_NESTED_MESSAGE_MISSING);
|
|
38
38
|
}
|
|
39
|
-
const
|
|
40
|
-
const
|
|
41
|
-
const
|
|
42
|
-
const
|
|
43
|
-
const
|
|
44
|
-
const
|
|
45
|
-
const
|
|
39
|
+
const MISC_EXPRESSION_BRACKET = /\[(\w+)\]/g;
|
|
40
|
+
const MISC_EXPRESSION_DOTS = /^\.|\.$/g;
|
|
41
|
+
const MISC_EXPRESSION_NESTED = /\.|\[\w+\]/;
|
|
42
|
+
const MISC_NESTED_MESSAGE_INPUT = "Expected data to be an object";
|
|
43
|
+
const MISC_NESTED_MESSAGE_MISSING = "Expected property to exist in object";
|
|
44
|
+
const MISC_NESTED_MESSAGE_PATH = "Expected path to be a string";
|
|
45
|
+
const MISC_NESTED_MESSAGE_UNSAFE = "Access to this property is not allowed";
|
|
46
46
|
//#endregion
|
|
47
47
|
export { findKey, getNestedValue, getPaths, handleValue };
|
|
@@ -20,7 +20,7 @@ function setValue(data, path, value, ignoreCase) {
|
|
|
20
20
|
let next = handleValue(target, currentPath, null, true, shouldIgnoreCase).value;
|
|
21
21
|
if (typeof next !== "object" || next === null) {
|
|
22
22
|
const nextPath = paths[index + 1];
|
|
23
|
-
if (
|
|
23
|
+
if (SET_EXPRESSION_INDEX.test(nextPath)) next = Array.from({ length: Number(nextPath) + 1 }, () => void 0);
|
|
24
24
|
else next = {};
|
|
25
25
|
target[currentPath] = next;
|
|
26
26
|
}
|
|
@@ -28,6 +28,6 @@ function setValue(data, path, value, ignoreCase) {
|
|
|
28
28
|
}
|
|
29
29
|
return data;
|
|
30
30
|
}
|
|
31
|
-
const
|
|
31
|
+
const SET_EXPRESSION_INDEX = /^\d+$/;
|
|
32
32
|
//#endregion
|
|
33
33
|
export { setValue };
|
package/dist/is.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isArrayOrPlainObject, isConstructor, isInstanceOf, isKey, isNonArrayOrPlainObject, isNonConstructor, isNonInstanceOf, isNonKey, isNonNumber, isNonPlainObject, isNonPrimitive, isNonTypedArray, isNumber, isPlainObject, isPrimitive, isTypedArray } from "./internal/is.mjs";
|
|
2
|
-
import { getArray } from "./array/get.mjs";
|
|
3
|
-
import { getString } from "./internal/string.mjs";
|
|
2
|
+
import { getArray } from "./internal/array/get.mjs";
|
|
3
|
+
import { getString } from "./internal/string/misc.mjs";
|
|
4
4
|
//#region src/is.ts
|
|
5
5
|
/**
|
|
6
6
|
* Is the value empty, or only containing `null` or `undefined` values?
|
package/dist/logger.mjs
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { noop } from "./internal/function/misc.mjs";
|
|
2
|
+
import { getString } from "./internal/string/misc.mjs";
|
|
2
3
|
//#region src/logger.ts
|
|
3
4
|
function isLogger(value) {
|
|
4
|
-
return isLoggerInstance(
|
|
5
|
+
return isLoggerInstance(LOGGER_NAME, value);
|
|
5
6
|
}
|
|
6
7
|
function isLoggerInstance(name, value) {
|
|
7
|
-
return typeof value === "object" && value !== null && value[
|
|
8
|
+
return typeof value === "object" && value !== null && value[LOGGER_PROPERTY] === name;
|
|
8
9
|
}
|
|
9
10
|
function isTimedLogger(value) {
|
|
10
|
-
return isLoggerInstance(
|
|
11
|
+
return isLoggerInstance(LOGGER_NAME_TIMED, value);
|
|
11
12
|
}
|
|
12
13
|
function timedLogger(label) {
|
|
13
14
|
function stop() {
|
|
@@ -26,35 +27,20 @@ function timedLogger(label) {
|
|
|
26
27
|
};
|
|
27
28
|
const instance = {};
|
|
28
29
|
Object.defineProperties(instance, {
|
|
29
|
-
[
|
|
30
|
-
enumerable: false,
|
|
31
|
-
value: NAME_TIMED
|
|
32
|
-
},
|
|
30
|
+
[LOGGER_PROPERTY]: { value: LOGGER_NAME_TIMED },
|
|
33
31
|
active: {
|
|
34
32
|
enumerable: true,
|
|
35
|
-
get()
|
|
36
|
-
return state.started && !state.stopped && enabled;
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
log: {
|
|
40
|
-
enumerable: true,
|
|
41
|
-
get() {
|
|
42
|
-
return this.active ? logger : noop;
|
|
43
|
-
}
|
|
33
|
+
get: () => state.started && !state.stopped && enabled
|
|
44
34
|
},
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
get() {
|
|
48
|
-
return instance.active ? stop() : noop;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
35
|
+
log: { get: () => instance.active ? logger : noop },
|
|
36
|
+
stop: { get: () => instance.active ? stop() : noop }
|
|
51
37
|
});
|
|
52
38
|
if (state.started) console.time(label);
|
|
53
39
|
return Object.freeze(instance);
|
|
54
40
|
}
|
|
55
|
-
const
|
|
56
|
-
const
|
|
57
|
-
const
|
|
41
|
+
const LOGGER_NAME = "Logger";
|
|
42
|
+
const LOGGER_NAME_TIMED = "TimedLogger";
|
|
43
|
+
const LOGGER_PROPERTY = "$logger";
|
|
58
44
|
const methods = [
|
|
59
45
|
"debug",
|
|
60
46
|
"dir",
|
|
@@ -73,25 +59,15 @@ const methods = [
|
|
|
73
59
|
const Logger = (() => {
|
|
74
60
|
const instance = {};
|
|
75
61
|
Object.defineProperties(instance, {
|
|
76
|
-
[
|
|
77
|
-
enumerable: false,
|
|
78
|
-
value: NAME_LOGGER
|
|
79
|
-
},
|
|
62
|
+
[LOGGER_PROPERTY]: { value: LOGGER_NAME },
|
|
80
63
|
enabled: {
|
|
81
64
|
enumerable: true,
|
|
82
|
-
get()
|
|
83
|
-
|
|
84
|
-
},
|
|
85
|
-
set(value) {
|
|
65
|
+
get: () => enabled,
|
|
66
|
+
set: (value) => {
|
|
86
67
|
enabled = typeof value === "boolean" ? value : enabled;
|
|
87
68
|
}
|
|
88
69
|
},
|
|
89
|
-
time: {
|
|
90
|
-
enumerable: true,
|
|
91
|
-
value(label) {
|
|
92
|
-
return timedLogger(label);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
70
|
+
time: { value: (label) => timedLogger(getString(label)) }
|
|
95
71
|
});
|
|
96
72
|
for (const method of methods) Object.defineProperty(instance, method, {
|
|
97
73
|
enumerable: true,
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { PromiseStrategy } from "./models.mjs";
|
|
2
|
+
//#region src/promise/constants.d.ts
|
|
3
|
+
declare const PROMISE_ABORT_EVENT = "abort";
|
|
4
|
+
declare const PROMISE_ABORT_OPTIONS: {
|
|
5
|
+
once: boolean;
|
|
6
|
+
};
|
|
7
|
+
declare const PROMISE_ERROR_NAME = "PromiseTimeoutError";
|
|
8
|
+
declare const PROMISE_MESSAGE_EXPECTATION_ATTEMPT = "Attempt expected a function or a promise";
|
|
9
|
+
declare const PROMISE_MESSAGE_EXPECTATION_RESULT = "toResult expected a Promise";
|
|
10
|
+
declare const PROMISE_MESSAGE_EXPECTATION_TIMED = "Timed function expected a Promise";
|
|
11
|
+
declare const PROMISE_MESSAGE_TIMEOUT = "Promise timed out";
|
|
12
|
+
declare const PROMISE_STRATEGY_ALL: Set<PromiseStrategy>;
|
|
13
|
+
declare const PROMISE_STRATEGY_DEFAULT: PromiseStrategy;
|
|
14
|
+
declare const PROMISE_TYPE_FULFILLED = "fulfilled";
|
|
15
|
+
declare const PROMISE_TYPE_REJECTED = "rejected";
|
|
16
|
+
//#endregion
|
|
17
|
+
export { PROMISE_ABORT_EVENT, PROMISE_ABORT_OPTIONS, PROMISE_ERROR_NAME, PROMISE_MESSAGE_EXPECTATION_ATTEMPT, PROMISE_MESSAGE_EXPECTATION_RESULT, PROMISE_MESSAGE_EXPECTATION_TIMED, PROMISE_MESSAGE_TIMEOUT, PROMISE_STRATEGY_ALL, PROMISE_STRATEGY_DEFAULT, PROMISE_TYPE_FULFILLED, PROMISE_TYPE_REJECTED };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//#region src/promise/constants.ts
|
|
2
|
+
const PROMISE_ABORT_EVENT = "abort";
|
|
3
|
+
const PROMISE_ABORT_OPTIONS = { once: true };
|
|
4
|
+
const PROMISE_ERROR_NAME = "PromiseTimeoutError";
|
|
5
|
+
const PROMISE_MESSAGE_EXPECTATION_ATTEMPT = "Attempt expected a function or a promise";
|
|
6
|
+
const PROMISE_MESSAGE_EXPECTATION_RESULT = "toResult expected a Promise";
|
|
7
|
+
const PROMISE_MESSAGE_EXPECTATION_TIMED = "Timed function expected a Promise";
|
|
8
|
+
const PROMISE_MESSAGE_TIMEOUT = "Promise timed out";
|
|
9
|
+
const PROMISE_STRATEGY_ALL = /* @__PURE__ */ new Set(["complete", "first"]);
|
|
10
|
+
const PROMISE_STRATEGY_DEFAULT = "complete";
|
|
11
|
+
const PROMISE_TYPE_FULFILLED = "fulfilled";
|
|
12
|
+
const PROMISE_TYPE_REJECTED = "rejected";
|
|
13
|
+
//#endregion
|
|
14
|
+
export { PROMISE_ABORT_EVENT, PROMISE_ABORT_OPTIONS, PROMISE_ERROR_NAME, PROMISE_MESSAGE_EXPECTATION_ATTEMPT, PROMISE_MESSAGE_EXPECTATION_RESULT, PROMISE_MESSAGE_EXPECTATION_TIMED, PROMISE_MESSAGE_TIMEOUT, PROMISE_STRATEGY_ALL, PROMISE_STRATEGY_DEFAULT, PROMISE_TYPE_FULFILLED, PROMISE_TYPE_REJECTED };
|
package/dist/promise/delay.mjs
CHANGED
|
@@ -1,25 +1,22 @@
|
|
|
1
|
+
import { createAborter } from "../internal/abort.mjs";
|
|
1
2
|
import { TIMER_WAIT, getTimer } from "../internal/function/timer.mjs";
|
|
2
|
-
import { PROMISE_ABORT_EVENT, PROMISE_ABORT_OPTIONS } from "./models.mjs";
|
|
3
3
|
import { getPromiseOptions } from "./helpers.mjs";
|
|
4
4
|
import { settlePromise } from "./misc.mjs";
|
|
5
5
|
//#region src/promise/delay.ts
|
|
6
6
|
function delay(options) {
|
|
7
7
|
const { signal, time } = getPromiseOptions(options);
|
|
8
|
-
if (signal?.aborted ?? false) return Promise.reject(signal
|
|
9
|
-
|
|
8
|
+
if (signal?.aborted ?? false) return Promise.reject(signal?.reason);
|
|
9
|
+
const aborter = createAborter(signal, () => {
|
|
10
10
|
timer.cancel();
|
|
11
|
-
rejector(signal
|
|
12
|
-
}
|
|
13
|
-
const timer = getTimer(TIMER_WAIT, () =>
|
|
14
|
-
settlePromise(abort, resolver, void 0, signal);
|
|
15
|
-
}, time);
|
|
16
|
-
signal?.addEventListener(PROMISE_ABORT_EVENT, abort, PROMISE_ABORT_OPTIONS);
|
|
11
|
+
rejector(signal?.reason);
|
|
12
|
+
});
|
|
13
|
+
const timer = getTimer(TIMER_WAIT, () => settlePromise(resolver, void 0, aborter), time);
|
|
17
14
|
let rejector;
|
|
18
15
|
let resolver;
|
|
19
16
|
return new Promise((resolve, reject) => {
|
|
20
17
|
rejector = reject;
|
|
21
18
|
resolver = resolve;
|
|
22
|
-
if (time === 0) settlePromise(
|
|
19
|
+
if (time === 0) settlePromise(resolver, void 0, aborter);
|
|
23
20
|
else timer();
|
|
24
21
|
});
|
|
25
22
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { RequiredKeys } from "../models.mjs";
|
|
2
|
-
import { Result } from "../result/models.mjs";
|
|
2
|
+
import { Result } from "../internal/result/models.mjs";
|
|
3
3
|
import { FulfilledPromise, PromiseOptions, PromiseStrategy, PromisesOptions, PromisesValue, RejectedPromise } from "./models.mjs";
|
|
4
4
|
//#region src/promise/helpers.d.ts
|
|
5
5
|
declare function getPromiseOptions(input: unknown): RequiredKeys<PromiseOptions, 'time'>;
|
package/dist/promise/helpers.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { error, ok } from "../result/misc.mjs";
|
|
2
|
-
import { getNumberOrDefault } from "../internal/
|
|
3
|
-
import { PROMISE_STRATEGY_ALL, PROMISE_STRATEGY_DEFAULT, PROMISE_TYPE_FULFILLED, PROMISE_TYPE_REJECTED } from "./
|
|
1
|
+
import { error, ok } from "../internal/result/misc.mjs";
|
|
2
|
+
import { getNumberOrDefault } from "../internal/defaults.mjs";
|
|
3
|
+
import { PROMISE_STRATEGY_ALL, PROMISE_STRATEGY_DEFAULT, PROMISE_TYPE_FULFILLED, PROMISE_TYPE_REJECTED } from "./constants.mjs";
|
|
4
4
|
//#region src/promise/helpers.ts
|
|
5
5
|
function getPromiseOptions(input) {
|
|
6
6
|
if (typeof input === "number") return { time: getNumberOrDefault(input, 0) };
|
package/dist/promise/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Result } from "../result/models.mjs";
|
|
1
|
+
import { Result } from "../internal/result/models.mjs";
|
|
2
2
|
import { PromiseOptions, PromisesItems, PromisesOptions, PromisesResult, PromisesUnwrapped, PromisesValue, PromisesValues } from "./models.mjs";
|
|
3
3
|
//#region src/promise/index.d.ts
|
|
4
4
|
/**
|
package/dist/promise/index.mjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createAborter } from "../internal/abort.mjs";
|
|
2
|
+
import { PROMISE_MESSAGE_EXPECTATION_ATTEMPT, PROMISE_STRATEGY_DEFAULT, PROMISE_TYPE_FULFILLED, PROMISE_TYPE_REJECTED } from "./constants.mjs";
|
|
2
3
|
import { getPromiseOptions, getPromisesOptions, getResultsFromPromises } from "./helpers.mjs";
|
|
3
4
|
import { handleResult, settlePromise } from "./misc.mjs";
|
|
4
5
|
import { getTimedPromise } from "./timed.mjs";
|
|
@@ -7,21 +8,20 @@ async function attemptPromise(value, options) {
|
|
|
7
8
|
const isFunction = typeof value === "function";
|
|
8
9
|
if (!isFunction && !(value instanceof Promise)) return Promise.reject(new TypeError(PROMISE_MESSAGE_EXPECTATION_ATTEMPT));
|
|
9
10
|
const { signal, time } = getPromiseOptions(options);
|
|
10
|
-
if (signal?.aborted ?? false) return Promise.reject(signal
|
|
11
|
-
|
|
12
|
-
rejector(signal
|
|
13
|
-
}
|
|
11
|
+
if (signal?.aborted ?? false) return Promise.reject(signal?.reason);
|
|
12
|
+
const aborter = createAborter(signal, () => {
|
|
13
|
+
rejector(signal?.reason);
|
|
14
|
+
});
|
|
14
15
|
async function handler(resolve, reject) {
|
|
15
16
|
try {
|
|
16
17
|
let result = isFunction ? value() : await value;
|
|
17
18
|
if (result instanceof Promise) result = await result;
|
|
18
|
-
settlePromise(
|
|
19
|
+
settlePromise(resolve, result, aborter);
|
|
19
20
|
} catch (error) {
|
|
20
|
-
settlePromise(
|
|
21
|
+
settlePromise(reject, error, aborter);
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
24
|
let rejector;
|
|
24
|
-
signal?.addEventListener(PROMISE_ABORT_EVENT, abort, PROMISE_ABORT_OPTIONS);
|
|
25
25
|
const promise = new Promise((resolve, reject) => {
|
|
26
26
|
rejector = reject;
|
|
27
27
|
handler(resolve, reject);
|
|
@@ -30,16 +30,15 @@ async function attemptPromise(value, options) {
|
|
|
30
30
|
}
|
|
31
31
|
async function promises(items, options) {
|
|
32
32
|
const { signal, strategy } = getPromisesOptions(options);
|
|
33
|
-
if (signal?.aborted ?? false) return Promise.reject(signal
|
|
33
|
+
if (signal?.aborted ?? false) return Promise.reject(signal?.reason);
|
|
34
34
|
if (!Array.isArray(items)) return Promise.resolve([]);
|
|
35
35
|
const actual = items.map((item) => typeof item === "function" ? item() : item).filter((item) => item instanceof Promise);
|
|
36
36
|
const { length } = actual;
|
|
37
37
|
if (length === 0) return Promise.resolve([]);
|
|
38
38
|
const complete = strategy === PROMISE_STRATEGY_DEFAULT;
|
|
39
|
-
|
|
40
|
-
handlers.reject(signal
|
|
41
|
-
}
|
|
42
|
-
signal?.addEventListener(PROMISE_ABORT_EVENT, abort, PROMISE_ABORT_OPTIONS);
|
|
39
|
+
const aborter = createAborter(signal, () => {
|
|
40
|
+
handlers.reject(signal?.reason);
|
|
41
|
+
});
|
|
43
42
|
const data = {
|
|
44
43
|
last: length - 1,
|
|
45
44
|
result: []
|
|
@@ -51,20 +50,18 @@ async function promises(items, options) {
|
|
|
51
50
|
resolve
|
|
52
51
|
};
|
|
53
52
|
for (let index = 0; index < length; index += 1) actual[index].then((value) => handleResult(PROMISE_TYPE_FULFILLED, {
|
|
54
|
-
|
|
53
|
+
aborter,
|
|
55
54
|
complete,
|
|
56
55
|
data,
|
|
57
56
|
handlers,
|
|
58
57
|
index,
|
|
59
|
-
signal,
|
|
60
58
|
value
|
|
61
59
|
})).catch((reason) => handleResult(PROMISE_TYPE_REJECTED, {
|
|
62
|
-
|
|
60
|
+
aborter,
|
|
63
61
|
complete,
|
|
64
62
|
data,
|
|
65
63
|
handlers,
|
|
66
64
|
index,
|
|
67
|
-
signal,
|
|
68
65
|
value: reason
|
|
69
66
|
}));
|
|
70
67
|
});
|
package/dist/promise/misc.d.mts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { Result } from "../result/models.mjs";
|
|
1
|
+
import { Result } from "../internal/result/models.mjs";
|
|
2
|
+
import { Aborter } from "../internal/abort.mjs";
|
|
2
3
|
import { CancelablePromise, PromiseParameters } from "./models.mjs";
|
|
3
4
|
import { toPromise } from "../result/misc.mjs";
|
|
4
5
|
import { isFulfilled, isRejected } from "./helpers.mjs";
|
|
@@ -11,7 +12,7 @@ import { isFulfilled, isRejected } from "./helpers.mjs";
|
|
|
11
12
|
*/
|
|
12
13
|
declare function cancelable<Value>(executor: (resolve: (value: Value) => void, reject: (reason: unknown) => void) => void): CancelablePromise<Value>;
|
|
13
14
|
declare function handleResult(status: string, parameters: PromiseParameters): void;
|
|
14
|
-
declare function settlePromise(
|
|
15
|
+
declare function settlePromise(settler: (value: any) => void, value: unknown, aborter?: Aborter): void;
|
|
15
16
|
/**
|
|
16
17
|
* Converts a _Promise_ to a promised result
|
|
17
18
|
*
|
package/dist/promise/misc.mjs
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { error, ok
|
|
2
|
-
import {
|
|
1
|
+
import { error, ok } from "../internal/result/misc.mjs";
|
|
2
|
+
import { PROMISE_MESSAGE_EXPECTATION_RESULT } from "./constants.mjs";
|
|
3
|
+
import { CancelablePromise } from "./models.mjs";
|
|
3
4
|
import { isFulfilled, isRejected } from "./helpers.mjs";
|
|
5
|
+
import { toPromise } from "../result/misc.mjs";
|
|
4
6
|
//#region src/promise/misc.ts
|
|
5
7
|
/**
|
|
6
8
|
* Create a cancelable _Promise_
|
|
@@ -12,10 +14,10 @@ function cancelable(executor) {
|
|
|
12
14
|
return new CancelablePromise(executor);
|
|
13
15
|
}
|
|
14
16
|
function handleResult(status, parameters) {
|
|
15
|
-
const {
|
|
16
|
-
if (signal
|
|
17
|
+
const { aborter, complete, data, handlers, index, value } = parameters;
|
|
18
|
+
if (aborter?.signal.aborted ?? false) return;
|
|
17
19
|
if (!complete && status === "rejected") {
|
|
18
|
-
settlePromise(
|
|
20
|
+
settlePromise(handlers.reject, value, aborter);
|
|
19
21
|
return;
|
|
20
22
|
}
|
|
21
23
|
data.result[index] = !complete ? value : status === "fulfilled" ? {
|
|
@@ -25,10 +27,10 @@ function handleResult(status, parameters) {
|
|
|
25
27
|
status,
|
|
26
28
|
reason: value
|
|
27
29
|
};
|
|
28
|
-
if (index === data.last) settlePromise(
|
|
30
|
+
if (index === data.last) settlePromise(handlers.resolve, data.result, aborter);
|
|
29
31
|
}
|
|
30
|
-
function settlePromise(
|
|
31
|
-
|
|
32
|
+
function settlePromise(settler, value, aborter) {
|
|
33
|
+
aborter?.cancel();
|
|
32
34
|
settler(value);
|
|
33
35
|
}
|
|
34
36
|
async function toResult(value) {
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { GenericCallback } from "../models.mjs";
|
|
2
|
-
import { Result } from "../result/models.mjs";
|
|
2
|
+
import { Result } from "../internal/result/models.mjs";
|
|
3
|
+
import { Aborter } from "../internal/abort.mjs";
|
|
4
|
+
import { PROMISE_TYPE_FULFILLED, PROMISE_TYPE_REJECTED } from "./constants.mjs";
|
|
3
5
|
//#region src/promise/models.d.ts
|
|
4
6
|
/**
|
|
5
7
|
* A _Promise_ that can be canceled
|
|
@@ -49,12 +51,11 @@ type PromiseOptions = {
|
|
|
49
51
|
time?: number;
|
|
50
52
|
};
|
|
51
53
|
type PromiseParameters = {
|
|
52
|
-
|
|
54
|
+
aborter?: Aborter;
|
|
53
55
|
complete: boolean;
|
|
54
56
|
data: PromiseData;
|
|
55
57
|
handlers: PromiseHandlers;
|
|
56
58
|
index: number;
|
|
57
|
-
signal?: AbortSignal;
|
|
58
59
|
value?: unknown;
|
|
59
60
|
};
|
|
60
61
|
/**
|
|
@@ -101,18 +102,5 @@ type RejectedPromise = {
|
|
|
101
102
|
*/
|
|
102
103
|
reason: unknown;
|
|
103
104
|
};
|
|
104
|
-
declare const PROMISE_ABORT_EVENT = "abort";
|
|
105
|
-
declare const PROMISE_ABORT_OPTIONS: {
|
|
106
|
-
once: boolean;
|
|
107
|
-
};
|
|
108
|
-
declare const PROMISE_ERROR_NAME = "PromiseTimeoutError";
|
|
109
|
-
declare const PROMISE_MESSAGE_EXPECTATION_ATTEMPT = "Attempt expected a function or a promise";
|
|
110
|
-
declare const PROMISE_MESSAGE_EXPECTATION_RESULT = "toResult expected a Promise";
|
|
111
|
-
declare const PROMISE_MESSAGE_EXPECTATION_TIMED = "Timed function expected a Promise";
|
|
112
|
-
declare const PROMISE_MESSAGE_TIMEOUT = "Promise timed out";
|
|
113
|
-
declare const PROMISE_STRATEGY_ALL: Set<PromiseStrategy>;
|
|
114
|
-
declare const PROMISE_STRATEGY_DEFAULT: PromiseStrategy;
|
|
115
|
-
declare const PROMISE_TYPE_FULFILLED = "fulfilled";
|
|
116
|
-
declare const PROMISE_TYPE_REJECTED = "rejected";
|
|
117
105
|
//#endregion
|
|
118
|
-
export { CancelablePromise, FulfilledPromise,
|
|
106
|
+
export { CancelablePromise, FulfilledPromise, PromiseData, PromiseHandlers, PromiseOptions, PromiseParameters, PromiseStrategy, PromiseTimeoutError, PromisesItems, PromisesOptions, PromisesResult, PromisesUnwrapped, PromisesValue, PromisesValues, RejectedPromise };
|
package/dist/promise/models.mjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { PROMISE_ERROR_NAME, PROMISE_MESSAGE_TIMEOUT } from "./constants.mjs";
|
|
1
2
|
//#region src/promise/models.ts
|
|
2
3
|
/**
|
|
3
4
|
* A _Promise_ that can be canceled
|
|
@@ -18,7 +19,8 @@ var CancelablePromise = class extends Promise {
|
|
|
18
19
|
* @param reason Optional reason for canceling the _Promise_
|
|
19
20
|
*/
|
|
20
21
|
cancel(reason) {
|
|
21
|
-
this.#rejector(reason);
|
|
22
|
+
this.#rejector?.(reason);
|
|
23
|
+
this.#rejector = void 0;
|
|
22
24
|
}
|
|
23
25
|
};
|
|
24
26
|
/**
|
|
@@ -30,16 +32,5 @@ var PromiseTimeoutError = class extends Error {
|
|
|
30
32
|
this.name = PROMISE_ERROR_NAME;
|
|
31
33
|
}
|
|
32
34
|
};
|
|
33
|
-
const PROMISE_ABORT_EVENT = "abort";
|
|
34
|
-
const PROMISE_ABORT_OPTIONS = { once: true };
|
|
35
|
-
const PROMISE_ERROR_NAME = "PromiseTimeoutError";
|
|
36
|
-
const PROMISE_MESSAGE_EXPECTATION_ATTEMPT = "Attempt expected a function or a promise";
|
|
37
|
-
const PROMISE_MESSAGE_EXPECTATION_RESULT = "toResult expected a Promise";
|
|
38
|
-
const PROMISE_MESSAGE_EXPECTATION_TIMED = "Timed function expected a Promise";
|
|
39
|
-
const PROMISE_MESSAGE_TIMEOUT = "Promise timed out";
|
|
40
|
-
const PROMISE_STRATEGY_ALL = /* @__PURE__ */ new Set(["complete", "first"]);
|
|
41
|
-
const PROMISE_STRATEGY_DEFAULT = "complete";
|
|
42
|
-
const PROMISE_TYPE_FULFILLED = "fulfilled";
|
|
43
|
-
const PROMISE_TYPE_REJECTED = "rejected";
|
|
44
35
|
//#endregion
|
|
45
|
-
export { CancelablePromise,
|
|
36
|
+
export { CancelablePromise, PromiseTimeoutError };
|
package/dist/promise/timed.mjs
CHANGED
|
@@ -1,32 +1,31 @@
|
|
|
1
|
+
import { createAborter } from "../internal/abort.mjs";
|
|
1
2
|
import { TIMER_WAIT, getTimer } from "../internal/function/timer.mjs";
|
|
2
|
-
import {
|
|
3
|
+
import { PROMISE_MESSAGE_EXPECTATION_TIMED } from "./constants.mjs";
|
|
4
|
+
import { PromiseTimeoutError } from "./models.mjs";
|
|
3
5
|
import { getPromiseOptions } from "./helpers.mjs";
|
|
4
6
|
import { settlePromise } from "./misc.mjs";
|
|
5
7
|
//#region src/promise/timed.ts
|
|
6
8
|
async function getTimedPromise(promise, time, signal) {
|
|
7
|
-
|
|
9
|
+
const aborter = createAborter(signal, () => {
|
|
8
10
|
timer.cancel();
|
|
9
|
-
rejector(signal
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
const timer = getTimer(TIMER_WAIT, () => {
|
|
13
|
-
settlePromise(abort, rejector, new PromiseTimeoutError(), signal);
|
|
14
|
-
}, time);
|
|
11
|
+
rejector(signal?.reason);
|
|
12
|
+
});
|
|
13
|
+
const timer = getTimer(TIMER_WAIT, () => settlePromise(rejector, new PromiseTimeoutError(), aborter), time);
|
|
15
14
|
let rejector;
|
|
16
15
|
return Promise.race([promise, new Promise((_, reject) => {
|
|
17
16
|
rejector = reject;
|
|
18
17
|
timer();
|
|
19
18
|
})]).then((value) => {
|
|
19
|
+
aborter?.cancel();
|
|
20
20
|
timer.cancel();
|
|
21
21
|
rejector(void 0);
|
|
22
|
-
signal?.removeEventListener(PROMISE_ABORT_EVENT, abort);
|
|
23
22
|
return value;
|
|
24
23
|
});
|
|
25
24
|
}
|
|
26
25
|
async function timed(promise, options) {
|
|
27
26
|
if (!(promise instanceof Promise)) return Promise.reject(new TypeError(PROMISE_MESSAGE_EXPECTATION_TIMED));
|
|
28
27
|
const { signal, time } = getPromiseOptions(options);
|
|
29
|
-
if (signal?.aborted ?? false) return Promise.reject(signal
|
|
28
|
+
if (signal?.aborted ?? false) return Promise.reject(signal?.reason);
|
|
30
29
|
return time > 0 ? getTimedPromise(promise, time, signal) : promise;
|
|
31
30
|
}
|
|
32
31
|
//#endregion
|