@oscarpalmer/atoms 0.193.0 → 0.194.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 (204) hide show
  1. package/dist/array/difference.mjs +2 -2
  2. package/dist/array/intersection.mjs +2 -2
  3. package/dist/array/match.mjs +13 -13
  4. package/dist/array/slice.mjs +5 -5
  5. package/dist/array/sort.d.mts +5 -1
  6. package/dist/array/sort.mjs +4 -2
  7. package/dist/array/union.mjs +2 -2
  8. package/dist/beacon.d.mts +8 -1
  9. package/dist/beacon.mjs +52 -60
  10. package/dist/color/constants.d.mts +1 -1
  11. package/dist/color/constants.mjs +3 -5
  12. package/dist/color/instance.mjs +34 -41
  13. package/dist/color/misc/format.d.mts +3 -2
  14. package/dist/color/misc/format.mjs +4 -1
  15. package/dist/color/misc/is.d.mts +9 -1
  16. package/dist/color/misc/is.mjs +11 -1
  17. package/dist/color/misc/state.d.mts +6 -6
  18. package/dist/color/misc/state.mjs +11 -14
  19. package/dist/color/models.d.mts +23 -68
  20. package/dist/function/assert.mjs +2 -2
  21. package/dist/function/limit.d.mts +0 -6
  22. package/dist/function/limit.mjs +2 -2
  23. package/dist/function/memoize.mjs +19 -32
  24. package/dist/function/once.d.mts +0 -3
  25. package/dist/function/once.mjs +16 -13
  26. package/dist/function/retry.d.mts +1 -24
  27. package/dist/function/retry.mjs +1 -1
  28. package/dist/function/work.mjs +13 -11
  29. package/dist/herald.d.mts +30 -31
  30. package/dist/herald.mjs +74 -56
  31. package/dist/index.d.mts +100 -185
  32. package/dist/index.mjs +680 -702
  33. package/dist/internal/abort.d.mts +10 -0
  34. package/dist/internal/abort.mjs +14 -0
  35. package/dist/internal/array/chunk.mjs +2 -2
  36. package/dist/internal/array/find.mjs +2 -2
  37. package/dist/internal/array/sets.d.mts +4 -4
  38. package/dist/internal/array/sets.mjs +7 -7
  39. package/dist/internal/function/timer.mjs +19 -15
  40. package/dist/internal/number.mjs +7 -7
  41. package/dist/internal/result.mjs +3 -3
  42. package/dist/internal/sized.mjs +4 -4
  43. package/dist/internal/string.mjs +4 -4
  44. package/dist/internal/subscription.d.mts +24 -8
  45. package/dist/internal/subscription.mjs +49 -36
  46. package/dist/internal/value/equal.mjs +6 -6
  47. package/dist/internal/value/misc.mjs +14 -14
  48. package/dist/internal/value/set.mjs +2 -2
  49. package/dist/logger.mjs +15 -39
  50. package/dist/promise/constants.d.mts +17 -0
  51. package/dist/promise/constants.mjs +14 -0
  52. package/dist/promise/delay.mjs +7 -10
  53. package/dist/promise/helpers.mjs +1 -1
  54. package/dist/promise/index.mjs +14 -17
  55. package/dist/promise/misc.d.mts +2 -1
  56. package/dist/promise/misc.mjs +8 -7
  57. package/dist/promise/models.d.mts +4 -16
  58. package/dist/promise/models.mjs +4 -13
  59. package/dist/promise/timed.mjs +9 -10
  60. package/dist/query.mjs +15 -15
  61. package/dist/queue.mjs +103 -116
  62. package/dist/random.mjs +7 -7
  63. package/dist/result/index.d.mts +0 -3
  64. package/dist/result/index.mjs +1 -1
  65. package/dist/result/match.d.mts +0 -3
  66. package/dist/result/match.mjs +4 -4
  67. package/dist/result/misc.mjs +2 -2
  68. package/dist/result/work/flow.d.mts +0 -3
  69. package/dist/result/work/flow.mjs +5 -5
  70. package/dist/result/work/pipe.d.mts +0 -3
  71. package/dist/result/work/pipe.mjs +3 -3
  72. package/dist/string/case.mjs +20 -20
  73. package/dist/string/fuzzy.mjs +23 -18
  74. package/dist/string/index.mjs +7 -7
  75. package/dist/string/normalize.mjs +14 -14
  76. package/dist/string/template.mjs +2 -2
  77. package/dist/value/clone.mjs +10 -10
  78. package/dist/value/smush.mjs +2 -2
  79. package/package.json +13 -5
  80. package/src/array/difference.ts +0 -73
  81. package/src/array/exists.ts +0 -93
  82. package/src/array/filter.ts +0 -182
  83. package/src/array/find.ts +0 -183
  84. package/src/array/first.ts +0 -196
  85. package/src/array/flatten.ts +0 -20
  86. package/src/array/from.ts +0 -129
  87. package/src/array/get.ts +0 -131
  88. package/src/array/group-by.ts +0 -369
  89. package/src/array/index.ts +0 -26
  90. package/src/array/insert.ts +0 -52
  91. package/src/array/intersection.ts +0 -72
  92. package/src/array/last.ts +0 -194
  93. package/src/array/match.ts +0 -436
  94. package/src/array/move.ts +0 -315
  95. package/src/array/partition.ts +0 -91
  96. package/src/array/push.ts +0 -23
  97. package/src/array/reverse.ts +0 -33
  98. package/src/array/select.ts +0 -260
  99. package/src/array/single.ts +0 -93
  100. package/src/array/slice.ts +0 -335
  101. package/src/array/sort.ts +0 -607
  102. package/src/array/splice.ts +0 -106
  103. package/src/array/swap.ts +0 -322
  104. package/src/array/to-map.ts +0 -371
  105. package/src/array/to-record.ts +0 -351
  106. package/src/array/to-set.ts +0 -80
  107. package/src/array/toggle.ts +0 -79
  108. package/src/array/union.ts +0 -72
  109. package/src/array/unique.ts +0 -67
  110. package/src/array/update.ts +0 -75
  111. package/src/beacon.ts +0 -378
  112. package/src/color/constants.ts +0 -137
  113. package/src/color/index.ts +0 -83
  114. package/src/color/instance.ts +0 -162
  115. package/src/color/misc/alpha.ts +0 -56
  116. package/src/color/misc/format.ts +0 -29
  117. package/src/color/misc/get.ts +0 -210
  118. package/src/color/misc/is.ts +0 -221
  119. package/src/color/misc/state.ts +0 -243
  120. package/src/color/models.ts +0 -389
  121. package/src/color/space/hex.ts +0 -184
  122. package/src/color/space/hsl.ts +0 -174
  123. package/src/color/space/hwb.ts +0 -153
  124. package/src/color/space/rgb.ts +0 -240
  125. package/src/function/assert.ts +0 -174
  126. package/src/function/index.ts +0 -2
  127. package/src/function/limit.ts +0 -83
  128. package/src/function/memoize.ts +0 -202
  129. package/src/function/once.ts +0 -200
  130. package/src/function/retry.ts +0 -175
  131. package/src/function/work.ts +0 -1007
  132. package/src/herald.ts +0 -216
  133. package/src/index.ts +0 -68
  134. package/src/internal/array/callbacks.ts +0 -46
  135. package/src/internal/array/chunk.ts +0 -51
  136. package/src/internal/array/compact.ts +0 -56
  137. package/src/internal/array/find.ts +0 -200
  138. package/src/internal/array/group.ts +0 -42
  139. package/src/internal/array/index-of.ts +0 -182
  140. package/src/internal/array/insert.ts +0 -80
  141. package/src/internal/array/overlap.ts +0 -35
  142. package/src/internal/array/sets.ts +0 -74
  143. package/src/internal/array/shuffle.ts +0 -33
  144. package/src/internal/array/update.ts +0 -52
  145. package/src/internal/function/misc.ts +0 -8
  146. package/src/internal/function/timer.ts +0 -168
  147. package/src/internal/is.ts +0 -244
  148. package/src/internal/math/aggregate.ts +0 -164
  149. package/src/internal/math/misc.ts +0 -28
  150. package/src/internal/number.ts +0 -129
  151. package/src/internal/random.ts +0 -49
  152. package/src/internal/result.ts +0 -92
  153. package/src/internal/sized.ts +0 -25
  154. package/src/internal/string.ts +0 -128
  155. package/src/internal/subscription.ts +0 -264
  156. package/src/internal/value/compare.ts +0 -170
  157. package/src/internal/value/equal.ts +0 -465
  158. package/src/internal/value/get.ts +0 -57
  159. package/src/internal/value/handlers.ts +0 -95
  160. package/src/internal/value/has.ts +0 -118
  161. package/src/internal/value/misc.ts +0 -125
  162. package/src/internal/value/partial.ts +0 -46
  163. package/src/internal/value/set.ts +0 -132
  164. package/src/is.ts +0 -182
  165. package/src/logger.ts +0 -230
  166. package/src/math.ts +0 -281
  167. package/src/models.ts +0 -286
  168. package/src/number.ts +0 -1
  169. package/src/promise/delay.ts +0 -62
  170. package/src/promise/helpers.ts +0 -96
  171. package/src/promise/index.ts +0 -300
  172. package/src/promise/misc.ts +0 -96
  173. package/src/promise/models.ts +0 -195
  174. package/src/promise/timed.ts +0 -91
  175. package/src/query.ts +0 -147
  176. package/src/queue.ts +0 -814
  177. package/src/random.ts +0 -125
  178. package/src/result/index.ts +0 -105
  179. package/src/result/match.ts +0 -124
  180. package/src/result/misc.ts +0 -129
  181. package/src/result/models.ts +0 -83
  182. package/src/result/work/flow.ts +0 -488
  183. package/src/result/work/pipe.ts +0 -496
  184. package/src/sized/map.ts +0 -110
  185. package/src/sized/set.ts +0 -107
  186. package/src/string/case.ts +0 -236
  187. package/src/string/fuzzy.ts +0 -444
  188. package/src/string/index.ts +0 -199
  189. package/src/string/match.ts +0 -80
  190. package/src/string/normalize.ts +0 -205
  191. package/src/string/template.ts +0 -161
  192. package/src/value/clone.ts +0 -319
  193. package/src/value/collection.ts +0 -63
  194. package/src/value/diff.ts +0 -232
  195. package/src/value/freeze.ts +0 -322
  196. package/src/value/handle.ts +0 -3
  197. package/src/value/index.ts +0 -5
  198. package/src/value/merge.ts +0 -278
  199. package/src/value/omit.ts +0 -20
  200. package/src/value/pick.ts +0 -20
  201. package/src/value/shake.ts +0 -45
  202. package/src/value/smush.ts +0 -89
  203. package/src/value/transform.ts +0 -153
  204. package/src/value/unsmush.ts +0 -84
@@ -1,319 +0,0 @@
1
- import {isArrayOrPlainObject, isTypedArray} from '../internal/is';
2
- import {getSelfHandlers} from '../internal/value/handlers';
3
- import type {ArrayOrPlainObject, Constructor, PlainObject, TypedArray} from '../models';
4
-
5
- // #region Special variables
6
-
7
- const CLONE_NAME = 'clone';
8
-
9
- // #endregion
10
-
11
- // #region Functions
12
-
13
- /**
14
- * Clone any kind of value _(shallowly)_
15
- *
16
- * @param value Value to clone
17
- * @param flat Clone only the value itself, without cloning nested values
18
- * @returns Cloned value
19
- */
20
- export function clone<Value>(value: Value, flat: true): Value;
21
-
22
- /**
23
- * Clone any kind of value _(deeply, if needed)_
24
- *
25
- * @param value Value to clone
26
- * @returns Cloned value
27
- */
28
- export function clone<Value>(value: Value): Value;
29
-
30
- export function clone(value: unknown, flat?: boolean): unknown {
31
- return flat === true ? copy(value) : cloneValue(value, 0, new WeakMap(), false);
32
- }
33
-
34
- clone.handlers = getSelfHandlers(clone, {
35
- callback: tryStructuredClone,
36
- method: CLONE_NAME,
37
- });
38
-
39
- clone.deregister = deregisterCloner;
40
- clone.register = registerCloner;
41
-
42
- function cloneArrayBuffer(
43
- value: ArrayBuffer,
44
- depth?: number,
45
- references?: WeakMap<WeakKey, unknown>,
46
- ): ArrayBuffer {
47
- if (typeof depth === 'number' && depth >= MAX_CLONE_DEPTH) {
48
- return value;
49
- }
50
-
51
- const cloned = new ArrayBuffer(value.byteLength);
52
-
53
- new Uint8Array(cloned).set(new Uint8Array(value));
54
-
55
- references?.set(value, cloned);
56
-
57
- return cloned;
58
- }
59
-
60
- function cloneDataView(
61
- value: DataView,
62
- depth: number,
63
- references: WeakMap<WeakKey, unknown>,
64
- ): DataView {
65
- if (depth >= MAX_CLONE_DEPTH) {
66
- return value;
67
- }
68
-
69
- const buffer = cloneArrayBuffer(value.buffer as ArrayBuffer);
70
-
71
- const cloned = new DataView(buffer, value.byteOffset, value.byteLength);
72
-
73
- references.set(value, cloned);
74
-
75
- return cloned;
76
- }
77
-
78
- function cloneMap(
79
- map: Map<unknown, unknown>,
80
- depth: number,
81
- references: WeakMap<WeakKey, unknown>,
82
- flat: boolean,
83
- ): Map<unknown, unknown> {
84
- if (depth >= MAX_CLONE_DEPTH) {
85
- return map;
86
- }
87
-
88
- const cloned = new Map<unknown, unknown>();
89
- const entries = map.entries();
90
-
91
- for (const entry of entries) {
92
- cloned.set(
93
- flat ? entry[0] : cloneValue(entry[0], depth + 1, references, false),
94
- flat ? entry[1] : cloneValue(entry[1], depth + 1, references, false),
95
- );
96
- }
97
-
98
- references.set(map, cloned);
99
-
100
- return cloned;
101
- }
102
-
103
- function cloneNode(node: Node, depth: number, references: WeakMap<WeakKey, unknown>): Node {
104
- if (depth >= MAX_CLONE_DEPTH) {
105
- return node;
106
- }
107
-
108
- const cloned = node.cloneNode(true);
109
-
110
- references.set(node, cloned);
111
-
112
- return cloned;
113
- }
114
-
115
- function cloneObject(
116
- value: ArrayOrPlainObject,
117
- depth: number,
118
- references: WeakMap<WeakKey, unknown>,
119
- flat: boolean,
120
- ): ArrayOrPlainObject {
121
- if (flat || depth >= MAX_CLONE_DEPTH) {
122
- return Array.isArray(value) ? value.slice() : {...value};
123
- }
124
-
125
- const cloned = (Array.isArray(value) ? [] : {}) as PlainObject;
126
- const keys = [...Object.keys(value), ...Object.getOwnPropertySymbols(value)];
127
- const {length} = keys;
128
-
129
- for (let index = 0; index < length; index += 1) {
130
- const key = keys[index];
131
-
132
- cloned[key] = cloneValue((value as PlainObject)[key], depth + 1, references, false);
133
- }
134
-
135
- references.set(value, cloned);
136
-
137
- return cloned;
138
- }
139
-
140
- function cloneRegularExpression(
141
- value: RegExp,
142
- depth: number,
143
- references: WeakMap<WeakKey, unknown>,
144
- ): RegExp {
145
- if (depth >= MAX_CLONE_DEPTH) {
146
- return value;
147
- }
148
-
149
- const cloned = new RegExp(value.source, value.flags);
150
-
151
- cloned.lastIndex = value.lastIndex;
152
-
153
- references.set(value, cloned);
154
-
155
- return cloned;
156
- }
157
-
158
- function cloneSet(
159
- set: Set<unknown>,
160
- depth: number,
161
- references: WeakMap<WeakKey, unknown>,
162
- flat: boolean,
163
- ): Set<unknown> {
164
- if (depth >= MAX_CLONE_DEPTH) {
165
- return set;
166
- }
167
-
168
- const cloned = new Set<unknown>();
169
- const values = [...set.values()];
170
- const {length} = values;
171
-
172
- for (let index = 0; index < length; index += 1) {
173
- cloned.add(flat ? values[index] : cloneValue(values[index], depth + 1, references, false));
174
- }
175
-
176
- references.set(set, cloned);
177
-
178
- return cloned;
179
- }
180
-
181
- function cloneTypedArray(
182
- value: TypedArray,
183
- depth: number,
184
- references: WeakMap<WeakKey, unknown>,
185
- ): TypedArray {
186
- if (depth >= MAX_CLONE_DEPTH) {
187
- return value;
188
- }
189
-
190
- const cloned = new (value.constructor as new (...args: unknown[]) => TypedArray)(value);
191
-
192
- references.set(value, cloned);
193
-
194
- return cloned as TypedArray;
195
- }
196
-
197
- function cloneValue(
198
- value: unknown,
199
- depth: number,
200
- references: WeakMap<WeakKey, unknown>,
201
- flat: boolean,
202
- ): unknown {
203
- switch (true) {
204
- case value == null:
205
- case typeof value === 'bigint':
206
- case typeof value === 'boolean':
207
- case typeof value === 'number':
208
- case typeof value === 'string':
209
- return value;
210
-
211
- case typeof value === 'function':
212
- return;
213
-
214
- case typeof value === 'symbol':
215
- return Symbol(value.description);
216
-
217
- case references.has(value as object):
218
- return references.get(value);
219
-
220
- case value instanceof ArrayBuffer:
221
- return cloneArrayBuffer(value, depth, references);
222
-
223
- case value instanceof DataView:
224
- return cloneDataView(value, depth, references);
225
-
226
- case value instanceof Date:
227
- return new Date(value.getTime());
228
-
229
- case value instanceof RegExp:
230
- return cloneRegularExpression(value, depth, references);
231
-
232
- case value instanceof Map:
233
- return cloneMap(value, depth, references, flat);
234
-
235
- case typeof Node !== 'undefined' && value instanceof Node:
236
- return cloneNode(value, depth, references);
237
-
238
- case value instanceof Set:
239
- return cloneSet(value, depth, references, flat);
240
-
241
- case isArrayOrPlainObject(value):
242
- return cloneObject(value, depth, references, flat);
243
-
244
- case isTypedArray(value):
245
- return cloneTypedArray(value, depth, references);
246
-
247
- default:
248
- return clone.handlers.handle(value, depth, references);
249
- }
250
- }
251
-
252
- /**
253
- * Copy any kind of value
254
- *
255
- * - Clones the value shallowly, without cloning nested values
256
- * - To copy a value deeply, use `clone` instead
257
- *
258
- * @param value Value to copy
259
- * @returns Copied value
260
- */
261
- export function copy<Value>(value: Value): Value {
262
- return cloneValue(value, 0, new WeakMap(), true) as Value;
263
- }
264
-
265
- /**
266
- * Deregister a clone handler for a specific class
267
- *
268
- * _Available as `deregisterCloner` and `template.deregister`_
269
- *
270
- * @param constructor Class constructor
271
- */
272
- export function deregisterCloner<Instance>(constructor: Constructor<Instance>): void {
273
- clone.handlers.deregister(constructor);
274
- }
275
-
276
- /**
277
- * Register a clone handler for a specific class
278
- *
279
- * _Available as `registerCloner` and `template.register`_
280
- *
281
- * @param constructor Class constructor
282
- * @param handler Method name or clone function _(defaults to method name `clone`)_
283
- */
284
- export function registerCloner<Instance>(
285
- constructor: Constructor<Instance>,
286
- handler?: string | ((value: Instance) => Instance),
287
- ): void {
288
- clone.handlers.register(constructor, handler);
289
- }
290
-
291
- function tryStructuredClone(
292
- value: object,
293
- depth: number,
294
- references: WeakMap<WeakKey, unknown>,
295
- ): unknown {
296
- if (depth >= MAX_CLONE_DEPTH) {
297
- return value;
298
- }
299
-
300
- try {
301
- const cloned = structuredClone(value);
302
-
303
- references.set(value, cloned);
304
-
305
- return cloned;
306
- } catch {
307
- references.set(value, value);
308
-
309
- return value;
310
- }
311
- }
312
-
313
- // #endregion
314
-
315
- // #region Variables
316
-
317
- const MAX_CLONE_DEPTH = 100;
318
-
319
- // #endregion
@@ -1,63 +0,0 @@
1
- import {equal} from '../internal/value/equal';
2
-
3
- /**
4
- * Does the value exist for a key in a _Map_?
5
- *
6
- * @param map _Map_ to check in
7
- * @param value Value to check for
8
- * @returns `true` if the value exists, otherwise `false`
9
- */
10
- export function inMap<Value>(map: Map<unknown, Value>, value: Value): boolean;
11
-
12
- /**
13
- * Does the value exist for a key in a _Map_?
14
- *
15
- * @param map _Map_ to check in
16
- * @param value Value to check for
17
- * @param key To return the key for the value
18
- * @returns The key for the value if it exists, otherwise `undefined`
19
- */
20
- export function inMap<Key, Value>(map: Map<Key, Value>, value: Value, key: true): Key;
21
-
22
- export function inMap<Key, Value>(map: Map<Key, Value>, value: Value, key?: unknown): unknown {
23
- const getKey = key === true;
24
-
25
- if (!(map instanceof Map)) {
26
- return getKey ? undefined : false;
27
- }
28
-
29
- if (!getKey) {
30
- return inSet(new Set(map.values()), value);
31
- }
32
-
33
- for (const [key, item] of map) {
34
- if (equal(item, value)) {
35
- return key;
36
- }
37
- }
38
- }
39
-
40
- /**
41
- * Does the value exist in a _Set_?
42
- *
43
- * @param set _Set_ to check in
44
- * @param value Value to check for
45
- * @returns `true` if the value exists, otherwise `false`
46
- */
47
- export function inSet<Value>(set: Set<Value>, value: Value): boolean {
48
- if (!(set instanceof Set)) {
49
- return false;
50
- }
51
-
52
- if (set.has(value)) {
53
- return true;
54
- }
55
-
56
- for (const item of set) {
57
- if (equal(item, value)) {
58
- return true;
59
- }
60
- }
61
-
62
- return false;
63
- }
package/src/value/diff.ts DELETED
@@ -1,232 +0,0 @@
1
- import {isArrayOrPlainObject} from '../internal/is';
2
- import {join} from '../internal/string';
3
- import {equal} from '../internal/value/equal';
4
-
5
- // #region Types
6
-
7
- /**
8
- * Options for value comparison
9
- */
10
- export type DiffOptions = {
11
- /**
12
- * Should `null` and `undefined` be considered equal and ignored in results?
13
- */
14
- relaxedNullish?: boolean;
15
- };
16
-
17
- /**
18
- * The result of a comparison beteen two values
19
- */
20
- export type DiffResult<First, Second = First> = {
21
- /**
22
- * The original values that were compared
23
- */
24
- original: DiffValue<First, Second>;
25
- /**
26
- * The type of difference between the two values
27
- */
28
- type: DiffType;
29
- /**
30
- * The differences between the two values
31
- *
32
- * - Keys are in dot notation
33
- * - Values are objects with `from` and `to` properties
34
- */
35
- values: Record<string, DiffValue>;
36
- };
37
-
38
- type DiffType = 'full' | 'none' | 'partial';
39
-
40
- /**
41
- * The difference between two values
42
- */
43
- export type DiffValue<First = unknown, Second = First> = {
44
- /**
45
- * The value from the first value
46
- */
47
- from: First;
48
- /**
49
- * The value from the second value
50
- */
51
- to: Second;
52
- };
53
-
54
- type KeyedDiffValue = {
55
- key: string;
56
- } & DiffValue;
57
-
58
- type Parameters = {
59
- changes: KeyedDiffValue[];
60
- key: PropertyKey;
61
- options: Required<DiffOptions>;
62
- values: {first: unknown; second: unknown};
63
- prefix?: string;
64
- };
65
-
66
- // #endregion
67
-
68
- // #region Functions
69
-
70
- /**
71
- * Find the differences between two values
72
- *
73
- * @param first First value
74
- * @param second Second value
75
- * @param options Comparison options
76
- * @returns Difference result
77
- */
78
- export function diff<First, Second = First>(
79
- first: First,
80
- second: Second,
81
- options?: DiffOptions,
82
- ): DiffResult<First, Second> {
83
- const relaxedNullish = typeof options === 'object' && options?.relaxedNullish === true;
84
-
85
- const diffResult: DiffResult<First, Second> = {
86
- original: {
87
- from: first,
88
- to: second,
89
- },
90
- type: DIFF_PARTIAL,
91
- values: {},
92
- };
93
-
94
- const same = (relaxedNullish && first == null && second == null) || Object.is(first, second);
95
-
96
- const firstIsArrayOrObject = isArrayOrPlainObject(first);
97
- const secondIsArrayOrObject = isArrayOrPlainObject(second);
98
-
99
- if (same || !(firstIsArrayOrObject || secondIsArrayOrObject)) {
100
- diffResult.type = same ? DIFF_NONE : DIFF_FULL;
101
-
102
- return diffResult;
103
- }
104
-
105
- if (firstIsArrayOrObject !== secondIsArrayOrObject) {
106
- diffResult.type = DIFF_FULL;
107
-
108
- return diffResult;
109
- }
110
-
111
- const diffs = getDiffs(first, second, {relaxedNullish});
112
-
113
- const {length} = diffs;
114
-
115
- if (length === 0) {
116
- diffResult.type = DIFF_NONE;
117
- }
118
-
119
- for (let index = 0; index < length; index += 1) {
120
- const differences = diffs[index];
121
-
122
- diffResult.values[differences.key] = {from: differences.from, to: differences.to};
123
- }
124
-
125
- return diffResult;
126
- }
127
-
128
- function getChanges(
129
- changes: KeyedDiffValue[],
130
- first: unknown,
131
- second: unknown,
132
- options: Required<DiffOptions>,
133
- prefix?: string,
134
- ): KeyedDiffValue[] {
135
- const checked = new Set<PropertyKey>();
136
-
137
- for (let outerIndex = 0; outerIndex < 2; outerIndex += 1) {
138
- const value = (outerIndex === 0 ? first : second) ?? {};
139
-
140
- const keys = [...Object.keys(value), ...Object.getOwnPropertySymbols(value)];
141
-
142
- const {length} = keys;
143
-
144
- for (let innerIndex = 0; innerIndex < length; innerIndex += 1) {
145
- const key = keys[innerIndex];
146
-
147
- if (checked.has(key)) {
148
- continue;
149
- }
150
-
151
- checked.add(key);
152
-
153
- setChanges({
154
- changes,
155
- key,
156
- options,
157
- prefix,
158
- values: {first, second},
159
- });
160
- }
161
- }
162
-
163
- return changes;
164
- }
165
-
166
- function getDiffs(
167
- first: unknown,
168
- second: unknown,
169
- options: Required<DiffOptions>,
170
- prefix?: string,
171
- ): KeyedDiffValue[] {
172
- const changes: KeyedDiffValue[] = [];
173
-
174
- if (Array.isArray(first) && Array.isArray(second)) {
175
- const maximumLength = Math.max(first.length, second.length);
176
- const minimumLength = Math.min(first.length, second.length);
177
-
178
- for (let index = minimumLength; index < maximumLength; index += 1) {
179
- const key = join([prefix, index], '.');
180
-
181
- changes.push({
182
- key,
183
- from: index >= first.length ? undefined : first[index],
184
- to: index >= first.length ? second[index] : undefined,
185
- });
186
- }
187
- }
188
-
189
- return getChanges(changes, first, second, options, prefix);
190
- }
191
-
192
- function setChanges(parameters: Parameters): void {
193
- const {changes, key, prefix, options, values} = parameters;
194
-
195
- const prefixed = join([prefix, key], '.');
196
-
197
- const from: unknown = values.first?.[key as never];
198
- const to: unknown = values.second?.[key as never];
199
-
200
- const nested = isArrayOrPlainObject(from) || isArrayOrPlainObject(to);
201
- const diffs = nested ? getDiffs(from, to, options, prefixed) : [];
202
-
203
- if (nested ? diffs.length === 0 : equal(from, to, options)) {
204
- return;
205
- }
206
-
207
- const change = {
208
- from,
209
- to,
210
- key: prefixed,
211
- };
212
-
213
- changes.push(change);
214
-
215
- const diffsLength = diffs.length;
216
-
217
- for (let diffIndex = 0; diffIndex < diffsLength; diffIndex += 1) {
218
- changes.push(diffs[diffIndex]);
219
- }
220
- }
221
-
222
- // #endregion
223
-
224
- // #region Variables
225
-
226
- const DIFF_FULL: DiffType = 'full';
227
-
228
- const DIFF_NONE: DiffType = 'none';
229
-
230
- const DIFF_PARTIAL: DiffType = 'partial';
231
-
232
- // #endregion