@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.
Files changed (121) hide show
  1. package/dist/array/difference.mjs +2 -2
  2. package/dist/array/index.d.mts +2 -2
  3. package/dist/array/index.mjs +2 -2
  4. package/dist/array/intersection.mjs +2 -2
  5. package/dist/array/move.mjs +1 -1
  6. package/dist/array/slice.mjs +5 -5
  7. package/dist/array/sort.d.mts +5 -1
  8. package/dist/array/sort.mjs +4 -2
  9. package/dist/array/swap.mjs +1 -1
  10. package/dist/array/union.mjs +2 -2
  11. package/dist/beacon.d.mts +8 -1
  12. package/dist/beacon.mjs +52 -60
  13. package/dist/color/constants.d.mts +1 -1
  14. package/dist/color/constants.mjs +3 -5
  15. package/dist/color/instance.mjs +34 -41
  16. package/dist/color/misc/format.d.mts +3 -2
  17. package/dist/color/misc/format.mjs +4 -1
  18. package/dist/color/misc/is.d.mts +9 -1
  19. package/dist/color/misc/is.mjs +11 -1
  20. package/dist/color/misc/state.d.mts +6 -6
  21. package/dist/color/misc/state.mjs +11 -14
  22. package/dist/color/models.d.mts +23 -68
  23. package/dist/color/space/hex.mjs +1 -1
  24. package/dist/color/space/rgb.mjs +1 -1
  25. package/dist/function/index.d.mts +1 -2
  26. package/dist/function/index.mjs +1 -2
  27. package/dist/function/limit.d.mts +0 -6
  28. package/dist/function/limit.mjs +2 -2
  29. package/dist/function/once.d.mts +0 -3
  30. package/dist/function/once.mjs +17 -14
  31. package/dist/function/retry.d.mts +1 -24
  32. package/dist/function/retry.mjs +1 -1
  33. package/dist/herald.d.mts +2 -72
  34. package/dist/herald.mjs +2 -92
  35. package/dist/index.d.mts +3332 -3418
  36. package/dist/index.mjs +1850 -1870
  37. package/dist/internal/abort.d.mts +10 -0
  38. package/dist/internal/abort.mjs +14 -0
  39. package/dist/internal/array/chunk.mjs +2 -2
  40. package/dist/internal/array/find.mjs +2 -2
  41. package/dist/{array → internal/array}/get.d.mts +2 -2
  42. package/dist/{array → internal/array}/get.mjs +2 -2
  43. package/dist/{array → internal/array}/match.d.mts +2 -2
  44. package/dist/{array → internal/array}/match.mjs +15 -15
  45. package/dist/internal/array/sets.d.mts +4 -4
  46. package/dist/internal/array/sets.mjs +7 -7
  47. package/dist/internal/defaults.d.mts +5 -0
  48. package/dist/internal/defaults.mjs +9 -0
  49. package/dist/{function → internal/function}/assert.d.mts +2 -2
  50. package/dist/{function → internal/function}/assert.mjs +4 -4
  51. package/dist/{function → internal/function}/memoize.d.mts +2 -2
  52. package/dist/{function → internal/function}/memoize.mjs +22 -35
  53. package/dist/internal/function/timer.mjs +19 -15
  54. package/dist/{function → internal/function}/work.d.mts +2 -2
  55. package/dist/{function → internal/function}/work.mjs +15 -13
  56. package/dist/internal/herald.d.mts +71 -0
  57. package/dist/internal/herald.mjs +110 -0
  58. package/dist/internal/number.d.mts +1 -2
  59. package/dist/internal/number.mjs +8 -11
  60. package/dist/internal/{result.d.mts → result/misc.d.mts} +42 -3
  61. package/dist/internal/result/misc.mjs +51 -0
  62. package/dist/{result → internal/result}/models.d.mts +2 -2
  63. package/dist/{sized → internal/sized}/map.d.mts +1 -1
  64. package/dist/{sized → internal/sized}/map.mjs +2 -2
  65. package/dist/internal/{sized.d.mts → sized/misc.d.mts} +1 -1
  66. package/dist/internal/sized/misc.mjs +12 -0
  67. package/dist/{string → internal/string}/case.d.mts +1 -1
  68. package/dist/{string → internal/string}/case.mjs +22 -22
  69. package/dist/internal/{string.d.mts → string/misc.d.mts} +1 -1
  70. package/dist/internal/{string.mjs → string/misc.mjs} +5 -5
  71. package/dist/internal/subscription.d.mts +24 -8
  72. package/dist/internal/subscription.mjs +49 -36
  73. package/dist/internal/value/compare.mjs +1 -1
  74. package/dist/internal/value/equal.mjs +6 -6
  75. package/dist/internal/value/has.d.mts +1 -1
  76. package/dist/internal/value/misc.d.mts +1 -1
  77. package/dist/internal/value/misc.mjs +16 -16
  78. package/dist/internal/value/set.mjs +2 -2
  79. package/dist/is.mjs +2 -2
  80. package/dist/logger.mjs +15 -39
  81. package/dist/promise/constants.d.mts +17 -0
  82. package/dist/promise/constants.mjs +14 -0
  83. package/dist/promise/delay.mjs +7 -10
  84. package/dist/promise/helpers.d.mts +1 -1
  85. package/dist/promise/helpers.mjs +3 -3
  86. package/dist/promise/index.d.mts +1 -1
  87. package/dist/promise/index.mjs +14 -17
  88. package/dist/promise/misc.d.mts +3 -2
  89. package/dist/promise/misc.mjs +10 -8
  90. package/dist/promise/models.d.mts +5 -17
  91. package/dist/promise/models.mjs +4 -13
  92. package/dist/promise/timed.mjs +9 -10
  93. package/dist/query.mjs +16 -16
  94. package/dist/queue.mjs +104 -120
  95. package/dist/random.mjs +8 -8
  96. package/dist/result/index.d.mts +1 -4
  97. package/dist/result/index.mjs +2 -2
  98. package/dist/result/match.d.mts +1 -4
  99. package/dist/result/match.mjs +5 -5
  100. package/dist/result/misc.d.mts +3 -42
  101. package/dist/result/misc.mjs +4 -30
  102. package/dist/result/work/flow.d.mts +1 -4
  103. package/dist/result/work/flow.mjs +6 -6
  104. package/dist/result/work/pipe.d.mts +1 -4
  105. package/dist/result/work/pipe.mjs +5 -5
  106. package/dist/sized/set.mjs +1 -1
  107. package/dist/string/fuzzy.mjs +25 -20
  108. package/dist/string/index.d.mts +1 -1
  109. package/dist/string/index.mjs +8 -8
  110. package/dist/string/match.mjs +1 -1
  111. package/dist/string/normalize.mjs +16 -16
  112. package/dist/string/template.mjs +3 -3
  113. package/dist/subscription.d.mts +2 -0
  114. package/dist/subscription.mjs +2 -0
  115. package/dist/value/clone.mjs +10 -10
  116. package/dist/value/diff.mjs +1 -1
  117. package/dist/value/smush.mjs +3 -3
  118. package/package.json +35 -14
  119. package/dist/internal/result.mjs +0 -25
  120. package/dist/internal/sized.mjs +0 -12
  121. /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 >= MINIMUM_LENGTH_FOR_SET ? new Set(secondKeys) : void 0;
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, ERROR_PROPERTIES, options);
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, EXPRESSION_PROPERTIES, options);
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 ERROR_PROPERTIES = ["name", "message"];
173
- const EXPRESSION_PROPERTIES = ["source", "flags"];
174
- const MINIMUM_LENGTH_FOR_SET = 16;
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 "../../result/models.mjs";
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 "../../result/models.mjs";
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 "../../result/misc.mjs";
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(NESTED_MESSAGE_INPUT);
11
- if (typeof path !== "string" || path.trim().length === 0) return error(NESTED_MESSAGE_PATH);
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 (!EXPRESSION_NESTED.test(normalized)) return normalized;
28
- return normalized.replace(EXPRESSION_BRACKET, ".$1").replace(EXPRESSION_DOTS, "").split(".");
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(NESTED_MESSAGE_UNSAFE);
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(NESTED_MESSAGE_MISSING);
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(NESTED_MESSAGE_MISSING);
37
+ if (get) return error(MISC_NESTED_MESSAGE_MISSING);
38
38
  }
39
- const EXPRESSION_BRACKET = /\[(\w+)\]/g;
40
- const EXPRESSION_DOTS = /^\.|\.$/g;
41
- const EXPRESSION_NESTED = /\.|\[\w+\]/;
42
- const NESTED_MESSAGE_INPUT = "Expected data to be an object";
43
- const NESTED_MESSAGE_MISSING = "Expected property to exist in object";
44
- const NESTED_MESSAGE_PATH = "Expected path to be a string";
45
- const NESTED_MESSAGE_UNSAFE = "Access to this property is not allowed";
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 (EXPRESSION_INDEX.test(nextPath)) next = Array.from({ length: Number(nextPath) + 1 }, () => void 0);
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 EXPRESSION_INDEX = /^\d+$/;
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(NAME_LOGGER, value);
5
+ return isLoggerInstance(LOGGER_NAME, value);
5
6
  }
6
7
  function isLoggerInstance(name, value) {
7
- return typeof value === "object" && value !== null && value[KEY_LOGGER] === name;
8
+ return typeof value === "object" && value !== null && value[LOGGER_PROPERTY] === name;
8
9
  }
9
10
  function isTimedLogger(value) {
10
- return isLoggerInstance(NAME_TIMED, value);
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
- [KEY_LOGGER]: {
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
- stop: {
46
- enumerable: true,
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 KEY_LOGGER = "$logger";
56
- const NAME_LOGGER = "Logger";
57
- const NAME_TIMED = "TimedLogger";
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
- [KEY_LOGGER]: {
77
- enumerable: false,
78
- value: NAME_LOGGER
79
- },
62
+ [LOGGER_PROPERTY]: { value: LOGGER_NAME },
80
63
  enabled: {
81
64
  enumerable: true,
82
- get() {
83
- return enabled;
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 };
@@ -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.reason);
9
- function abort() {
8
+ if (signal?.aborted ?? false) return Promise.reject(signal?.reason);
9
+ const aborter = createAborter(signal, () => {
10
10
  timer.cancel();
11
- rejector(signal.reason);
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(abort, resolve, void 0, signal);
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'>;
@@ -1,6 +1,6 @@
1
- import { error, ok } from "../result/misc.mjs";
2
- import { getNumberOrDefault } from "../internal/number.mjs";
3
- import { PROMISE_STRATEGY_ALL, PROMISE_STRATEGY_DEFAULT, PROMISE_TYPE_FULFILLED, PROMISE_TYPE_REJECTED } from "./models.mjs";
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) };
@@ -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
  /**
@@ -1,4 +1,5 @@
1
- import { PROMISE_ABORT_EVENT, PROMISE_ABORT_OPTIONS, PROMISE_MESSAGE_EXPECTATION_ATTEMPT, PROMISE_STRATEGY_DEFAULT, PROMISE_TYPE_FULFILLED, PROMISE_TYPE_REJECTED } from "./models.mjs";
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.reason);
11
- function abort() {
12
- rejector(signal.reason);
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(abort, resolve, result, signal);
19
+ settlePromise(resolve, result, aborter);
19
20
  } catch (error) {
20
- settlePromise(abort, reject, error, signal);
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.reason);
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
- function abort() {
40
- handlers.reject(signal.reason);
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
- abort,
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
- abort,
60
+ aborter,
63
61
  complete,
64
62
  data,
65
63
  handlers,
66
64
  index,
67
- signal,
68
65
  value: reason
69
66
  }));
70
67
  });
@@ -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(aborter: () => void, settler: (value: any) => void, value: unknown, signal?: AbortSignal): void;
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
  *
@@ -1,6 +1,8 @@
1
- import { error, ok, toPromise } from "../result/misc.mjs";
2
- import { CancelablePromise, PROMISE_ABORT_EVENT, PROMISE_MESSAGE_EXPECTATION_RESULT } from "./models.mjs";
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 { abort, complete, data, handlers, index, signal, value } = parameters;
16
- if (signal?.aborted ?? false) return;
17
+ const { aborter, complete, data, handlers, index, value } = parameters;
18
+ if (aborter?.signal.aborted ?? false) return;
17
19
  if (!complete && status === "rejected") {
18
- settlePromise(abort, handlers.reject, value, signal);
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(abort, handlers.resolve, data.result, signal);
30
+ if (index === data.last) settlePromise(handlers.resolve, data.result, aborter);
29
31
  }
30
- function settlePromise(aborter, settler, value, signal) {
31
- signal?.removeEventListener(PROMISE_ABORT_EVENT, aborter);
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
- abort: () => void;
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, 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, PromiseData, PromiseHandlers, PromiseOptions, PromiseParameters, PromiseStrategy, PromiseTimeoutError, PromisesItems, PromisesOptions, PromisesResult, PromisesUnwrapped, PromisesValue, PromisesValues, RejectedPromise };
106
+ export { CancelablePromise, FulfilledPromise, PromiseData, PromiseHandlers, PromiseOptions, PromiseParameters, PromiseStrategy, PromiseTimeoutError, PromisesItems, PromisesOptions, PromisesResult, PromisesUnwrapped, PromisesValue, PromisesValues, RejectedPromise };
@@ -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, 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, PromiseTimeoutError };
36
+ export { CancelablePromise, PromiseTimeoutError };
@@ -1,32 +1,31 @@
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, PROMISE_MESSAGE_EXPECTATION_TIMED, PromiseTimeoutError } from "./models.mjs";
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
- function abort() {
9
+ const aborter = createAborter(signal, () => {
8
10
  timer.cancel();
9
- rejector(signal.reason);
10
- }
11
- signal?.addEventListener(PROMISE_ABORT_EVENT, abort, PROMISE_ABORT_OPTIONS);
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.reason);
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