@oscarpalmer/atoms 0.196.1 → 0.198.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/filter.mjs +1 -0
- package/dist/array/find.mjs +2 -1
- package/dist/array/first.mjs +2 -1
- package/dist/array/group-by.mjs +2 -1
- package/dist/array/last.mjs +2 -1
- package/dist/array/move.mjs +6 -2
- package/dist/array/sort.mjs +8 -3
- package/dist/array/swap.mjs +2 -1
- package/dist/array/to-map.mjs +2 -1
- package/dist/array/to-record.mjs +2 -1
- package/dist/index.d.mts +747 -705
- package/dist/index.mjs +225 -123
- package/dist/internal/array/callbacks.mjs +1 -0
- package/dist/internal/array/index-of.mjs +2 -1
- package/dist/internal/function/assert.mjs +12 -5
- package/dist/internal/math/aggregate.d.mts +2 -2
- package/dist/internal/sized/map.mjs +3 -2
- package/dist/internal/value/compare.d.mts +1 -1
- package/dist/internal/value/compare.mjs +12 -8
- package/dist/internal/value/handlers.d.mts +1 -1
- package/dist/internal/value/has.mjs +2 -1
- package/dist/promise/index.mjs +2 -1
- package/dist/queue.mjs +2 -1
- package/dist/sized/set.mjs +5 -6
- package/dist/string/fuzzy.mjs +2 -1
- package/dist/string/normalize.mjs +2 -1
- package/dist/string/template.mjs +2 -1
- package/dist/value/clone.d.mts +53 -11
- package/dist/value/clone.mjs +134 -77
- package/dist/value/collection.mjs +3 -1
- package/dist/value/freeze.mjs +6 -2
- package/dist/value/merge.mjs +4 -2
- package/dist/value/transform.mjs +2 -1
- package/package.json +4 -3
|
@@ -3,9 +3,10 @@ import { FIND_VALUE_INDEX, findValue } from "./find.mjs";
|
|
|
3
3
|
function indexOf(array, ...parameters) {
|
|
4
4
|
return findValue(FIND_VALUE_INDEX, array, parameters, false);
|
|
5
5
|
}
|
|
6
|
-
indexOf.last = lastIndexOf;
|
|
7
6
|
function lastIndexOf(array, ...parameters) {
|
|
8
7
|
return findValue(FIND_VALUE_INDEX, array, parameters, true);
|
|
9
8
|
}
|
|
9
|
+
indexOf.last = lastIndexOf;
|
|
10
|
+
Object.defineProperty(indexOf, "last", { value: lastIndexOf });
|
|
10
11
|
//#endregion
|
|
11
12
|
export { indexOf, lastIndexOf };
|
|
@@ -10,11 +10,6 @@ import { hasValueResult } from "../value/has.mjs";
|
|
|
10
10
|
function assert(condition, message, error) {
|
|
11
11
|
if (!condition()) throw new (error ?? Error)(message);
|
|
12
12
|
}
|
|
13
|
-
assert.condition = assertCondition;
|
|
14
|
-
assert.defined = assertDefined;
|
|
15
|
-
assert.instanceOf = assertInstanceOf;
|
|
16
|
-
assert.is = assertIs;
|
|
17
|
-
assert.property = assertProperty;
|
|
18
13
|
/**
|
|
19
14
|
* Creates an _Asserter_ that asserts a condition is true, throwing an error if it is not
|
|
20
15
|
*
|
|
@@ -92,5 +87,17 @@ function assertProperty(path, condition, message, error) {
|
|
|
92
87
|
};
|
|
93
88
|
}
|
|
94
89
|
const ASSERT_MESSAGE_VALUE_DEFINED = "Expected value to be defined";
|
|
90
|
+
assert.condition = assertCondition;
|
|
91
|
+
assert.defined = assertDefined;
|
|
92
|
+
assert.instanceOf = assertInstanceOf;
|
|
93
|
+
assert.is = assertIs;
|
|
94
|
+
assert.property = assertProperty;
|
|
95
|
+
Object.defineProperties(assert, {
|
|
96
|
+
condition: { value: assertCondition },
|
|
97
|
+
defined: { value: assertDefined },
|
|
98
|
+
instanceOf: { value: assertInstanceOf },
|
|
99
|
+
is: { value: assertIs },
|
|
100
|
+
property: { value: assertProperty }
|
|
101
|
+
});
|
|
95
102
|
//#endregion
|
|
96
103
|
export { assert, assertCondition, assertDefined, assertInstanceOf, assertIs, assertProperty };
|
|
@@ -49,7 +49,7 @@ declare function max<Item>(items: Item[], callback: (item: Item, index: number,
|
|
|
49
49
|
* @param first Return only the first item with the maximum value
|
|
50
50
|
* @returns Item with the maximum value, or `undefined` if no maximum can be found
|
|
51
51
|
*/
|
|
52
|
-
declare function max<Item extends PlainObject
|
|
52
|
+
declare function max<Item extends PlainObject>(items: Item[], key: keyof NumericalValues<Item>, first: true): Item | undefined;
|
|
53
53
|
/**
|
|
54
54
|
* Get the maximum value from a list of items
|
|
55
55
|
*
|
|
@@ -85,7 +85,7 @@ declare function max<Item>(items: Item[], callback: (item: Item, index: number,
|
|
|
85
85
|
* @param key Key to use for value
|
|
86
86
|
* @returns Items with the maximum value
|
|
87
87
|
*/
|
|
88
|
-
declare function max<Item extends PlainObject
|
|
88
|
+
declare function max<Item extends PlainObject>(items: Item[], key: keyof NumericalValues<Item>): Item[];
|
|
89
89
|
/**
|
|
90
90
|
* Get the maximum value from a list of numbers
|
|
91
91
|
*
|
|
@@ -33,11 +33,12 @@ var SizedMap = class extends Map {
|
|
|
33
33
|
* @inheritdoc
|
|
34
34
|
*/
|
|
35
35
|
get(key) {
|
|
36
|
+
let value;
|
|
36
37
|
if (super.has(key)) {
|
|
37
|
-
|
|
38
|
+
value = super.get(key);
|
|
38
39
|
this.#setValue(key, value, true);
|
|
39
|
-
return value;
|
|
40
40
|
}
|
|
41
|
+
return value;
|
|
41
42
|
}
|
|
42
43
|
/**
|
|
43
44
|
* @inheritdoc
|
|
@@ -10,12 +10,12 @@ type Comparator<Value = any> = (first: Value, second: Value) => number;
|
|
|
10
10
|
*/
|
|
11
11
|
declare function compare(first: unknown, second: unknown): number;
|
|
12
12
|
declare namespace compare {
|
|
13
|
+
var deregister: typeof deregisterComparator;
|
|
13
14
|
var handlers: {
|
|
14
15
|
deregister(constructor: Constructor): void;
|
|
15
16
|
handle(first: unknown, second: unknown, ...parameters: unknown[]): number;
|
|
16
17
|
register(constructor: Constructor, handler?: string | GenericCallback): void;
|
|
17
18
|
};
|
|
18
|
-
var deregister: typeof deregisterComparator;
|
|
19
19
|
var register: typeof registerComparator;
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
@@ -32,14 +32,6 @@ function compare(first, second) {
|
|
|
32
32
|
}
|
|
33
33
|
return 0;
|
|
34
34
|
}
|
|
35
|
-
compare.handlers = getCompareHandlers(compare, {
|
|
36
|
-
callback: (first, second, compareStrings) => {
|
|
37
|
-
if (compareStrings) return getString(first).localeCompare(getString(second));
|
|
38
|
-
},
|
|
39
|
-
method: COMPARE_NAME
|
|
40
|
-
});
|
|
41
|
-
compare.deregister = deregisterComparator;
|
|
42
|
-
compare.register = registerComparator;
|
|
43
35
|
function compareNumbers(first, second) {
|
|
44
36
|
if (Object.is(first, second)) return 0;
|
|
45
37
|
if (Number.isNaN(first)) return -1;
|
|
@@ -86,5 +78,17 @@ const comparators = {
|
|
|
86
78
|
number: compareNumbers,
|
|
87
79
|
symbol: compareSymbols
|
|
88
80
|
};
|
|
81
|
+
const compareHandlers = getCompareHandlers(compare, {
|
|
82
|
+
callback: (first, second, compareStrings) => compareStrings ? getString(first).localeCompare(getString(second)) : void 0,
|
|
83
|
+
method: COMPARE_NAME
|
|
84
|
+
});
|
|
85
|
+
compare.deregister = deregisterComparator;
|
|
86
|
+
compare.handlers = compareHandlers;
|
|
87
|
+
compare.register = registerComparator;
|
|
88
|
+
Object.defineProperties(compare, {
|
|
89
|
+
deregister: { value: deregisterComparator },
|
|
90
|
+
handlers: { value: compareHandlers },
|
|
91
|
+
register: { value: registerComparator }
|
|
92
|
+
});
|
|
89
93
|
//#endregion
|
|
90
94
|
export { compare, deregisterComparator, registerComparator };
|
|
@@ -11,7 +11,7 @@ declare function getCompareHandlers<Value>(owner: GenericCallback, options: Opti
|
|
|
11
11
|
};
|
|
12
12
|
declare function getSelfHandlers(owner: GenericCallback, options: Options): {
|
|
13
13
|
deregister(constructor: Constructor): void;
|
|
14
|
-
handle(value: unknown, ...parameters: unknown[]):
|
|
14
|
+
handle(value: unknown, ...parameters: unknown[]): unknown;
|
|
15
15
|
register(constructor: Constructor, handler?: string | GenericCallback): void;
|
|
16
16
|
};
|
|
17
17
|
//#endregion
|
|
@@ -3,9 +3,10 @@ import { getNestedValue } from "./misc.mjs";
|
|
|
3
3
|
function hasValue(data, path, ignoreCase) {
|
|
4
4
|
return getNestedValue(data, path, ignoreCase === true).ok;
|
|
5
5
|
}
|
|
6
|
-
hasValue.get = hasValueResult;
|
|
7
6
|
function hasValueResult(data, path, ignoreCase) {
|
|
8
7
|
return getNestedValue(data, path, ignoreCase === true);
|
|
9
8
|
}
|
|
9
|
+
hasValue.get = hasValueResult;
|
|
10
|
+
Object.defineProperty(hasValue, "get", { value: hasValueResult });
|
|
10
11
|
//#endregion
|
|
11
12
|
export { hasValue, hasValueResult };
|
package/dist/promise/index.mjs
CHANGED
|
@@ -66,9 +66,10 @@ async function promises(items, options) {
|
|
|
66
66
|
}));
|
|
67
67
|
});
|
|
68
68
|
}
|
|
69
|
-
promises.result = resultPromises;
|
|
70
69
|
async function resultPromises(items, signal) {
|
|
71
70
|
return promises(items, signal).then(getResultsFromPromises);
|
|
72
71
|
}
|
|
72
|
+
promises.result = resultPromises;
|
|
73
|
+
Object.defineProperty(promises, "result", { value: resultPromises });
|
|
73
74
|
//#endregion
|
|
74
75
|
export { attemptPromise, promises, resultPromises };
|
package/dist/queue.mjs
CHANGED
|
@@ -241,7 +241,6 @@ function keyedQueue(callback, options) {
|
|
|
241
241
|
function queue(callback, options) {
|
|
242
242
|
return createQueue(callback, options);
|
|
243
243
|
}
|
|
244
|
-
queue.keyed = keyedQueue;
|
|
245
244
|
function removeQueue(state, key, id) {
|
|
246
245
|
if (key == null) {
|
|
247
246
|
handleQueues(state, QUEUE_HANDLE_CLEAR);
|
|
@@ -317,5 +316,7 @@ const QUEUE_STATUS_ACTIVE = "active";
|
|
|
317
316
|
const QUEUE_STATUS_EMPTY = "empty";
|
|
318
317
|
const QUEUE_STATUS_FULL = "full";
|
|
319
318
|
const QUEUE_STATUS_PAUSED = "paused";
|
|
319
|
+
queue.keyed = keyedQueue;
|
|
320
|
+
Object.defineProperty(queue, "keyed", { value: keyedQueue });
|
|
320
321
|
//#endregion
|
|
321
322
|
export { QueueError, isKeyedQueue, isQueue, isQueueInstance, keyedQueue, queue };
|
package/dist/sized/set.mjs
CHANGED
|
@@ -45,13 +45,12 @@ var SizedSet = class extends Set {
|
|
|
45
45
|
* @returns Found value if it exists, otherwise `undefined`
|
|
46
46
|
*/
|
|
47
47
|
get(value, update) {
|
|
48
|
-
if (super.has(value))
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
return value;
|
|
48
|
+
if (!super.has(value)) return;
|
|
49
|
+
if (update ?? false) {
|
|
50
|
+
super.delete(value);
|
|
51
|
+
this.add(value);
|
|
54
52
|
}
|
|
53
|
+
return value;
|
|
55
54
|
}
|
|
56
55
|
};
|
|
57
56
|
//#endregion
|
package/dist/string/fuzzy.mjs
CHANGED
|
@@ -56,7 +56,6 @@ function fuzzy(items, configuration) {
|
|
|
56
56
|
});
|
|
57
57
|
return Object.freeze(instance);
|
|
58
58
|
}
|
|
59
|
-
fuzzy.match = fuzzyMatch;
|
|
60
59
|
/**
|
|
61
60
|
* Does the needle match the haystack in a fuzzy way?
|
|
62
61
|
*
|
|
@@ -163,5 +162,7 @@ const FUZZY_LENGTH_DIVISOR = 3;
|
|
|
163
162
|
const FUZZY_MESSAGE_ARRAY = "Fuzzy requires an array of items";
|
|
164
163
|
const FUZZY_MESSAGE_HANDLER = "Fuzzy requires a key or function to stringify items";
|
|
165
164
|
const FUZZY_PROXIMITY_THRESHOLD = 5;
|
|
165
|
+
fuzzy.match = fuzzyMatch;
|
|
166
|
+
Object.defineProperty(fuzzy, "match", { value: fuzzyMatch });
|
|
166
167
|
//#endregion
|
|
167
168
|
export { fuzzy, fuzzyMatch };
|
|
@@ -51,7 +51,6 @@ function initializeNormalizer(options) {
|
|
|
51
51
|
function normalize(value, options) {
|
|
52
52
|
return normalizeString(value, getNormalizeOptions(options));
|
|
53
53
|
}
|
|
54
|
-
normalize.initialize = initializeNormalizer;
|
|
55
54
|
function normalizeString(value, options) {
|
|
56
55
|
if (typeof value !== "string") return "";
|
|
57
56
|
let result = value;
|
|
@@ -103,5 +102,7 @@ const NORMALIZE_SPECIAL_REPLACEMENT = "";
|
|
|
103
102
|
const NORMALIZE_WHITESPACE_PATTERN = /\s+/g;
|
|
104
103
|
const NORMALIZE_WHITESPACE_REPLACEMENT = " ";
|
|
105
104
|
let deburrMemoizer;
|
|
105
|
+
normalize.initialize = initializeNormalizer;
|
|
106
|
+
Object.defineProperty(normalize, "initialize", { value: initializeNormalizer });
|
|
106
107
|
//#endregion
|
|
107
108
|
export { deburr, initializeNormalizer, normalize };
|
package/dist/string/template.mjs
CHANGED
|
@@ -45,7 +45,8 @@ function template(value, ...parameters) {
|
|
|
45
45
|
const { ignoreCase, pattern } = getTemplateOptions(parameters[1]);
|
|
46
46
|
return handleTemplate(value, pattern, ignoreCase, parameters[0]);
|
|
47
47
|
}
|
|
48
|
-
template.initialize = initializeTemplater;
|
|
49
48
|
const TEMPLATE_EXPRESSION_VARIABLE = /{{([\s\S]+?)}}/g;
|
|
49
|
+
template.initialize = initializeTemplater;
|
|
50
|
+
Object.defineProperty(template, "initialize", { value: initializeTemplater });
|
|
50
51
|
//#endregion
|
|
51
52
|
export { initializeTemplater, template };
|
package/dist/value/clone.d.mts
CHANGED
|
@@ -1,33 +1,66 @@
|
|
|
1
1
|
import { Constructor, GenericCallback } from "../models.mjs";
|
|
2
2
|
//#region src/value/clone.d.ts
|
|
3
|
+
type CloneOptions = {
|
|
4
|
+
/**
|
|
5
|
+
* Copy functions instead of returning `undefined`? _(defaults to `false`)_
|
|
6
|
+
*/
|
|
7
|
+
copyFunctions?: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Copy symbols instead of returning `Symbol(description)`? _(defaults to `false`)_
|
|
10
|
+
*/
|
|
11
|
+
copySymbols?: boolean;
|
|
12
|
+
};
|
|
3
13
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* @param value Value to clone
|
|
7
|
-
* @param flat Clone only the value itself, without cloning nested values
|
|
8
|
-
* @returns Cloned value
|
|
14
|
+
* A cloning function with predefined options
|
|
9
15
|
*/
|
|
10
|
-
|
|
16
|
+
type Cloner = {
|
|
17
|
+
/**
|
|
18
|
+
* Clone any kind of value
|
|
19
|
+
*
|
|
20
|
+
* @param value Value to clone
|
|
21
|
+
* @returns Cloned value
|
|
22
|
+
*/
|
|
23
|
+
<Value>(value: Value): Value;
|
|
24
|
+
/**
|
|
25
|
+
* Deregister a clone handler for a specific class
|
|
26
|
+
*
|
|
27
|
+
* _Available as `deregisterCloner` and `template.deregister`_
|
|
28
|
+
*
|
|
29
|
+
* @param constructor Class constructor
|
|
30
|
+
*/
|
|
31
|
+
deregister: typeof deregisterCloner;
|
|
32
|
+
/**
|
|
33
|
+
* Register a clone handler for a specific class
|
|
34
|
+
*
|
|
35
|
+
* _Available as `registerCloner` and `template.register`_
|
|
36
|
+
*
|
|
37
|
+
* @param constructor Class constructor
|
|
38
|
+
* @param handler Method name or clone function _(defaults to method name `clone`)_
|
|
39
|
+
*/
|
|
40
|
+
register: typeof registerCloner;
|
|
41
|
+
};
|
|
11
42
|
/**
|
|
12
43
|
* Clone any kind of value _(deeply, if needed)_
|
|
13
44
|
*
|
|
14
45
|
* @param value Value to clone
|
|
46
|
+
* @param options Clone options
|
|
15
47
|
* @returns Cloned value
|
|
16
48
|
*/
|
|
17
|
-
declare function clone<Value>(value: Value): Value;
|
|
49
|
+
declare function clone<Value>(value: Value, options?: CloneOptions): Value;
|
|
18
50
|
declare namespace clone {
|
|
51
|
+
var deregister: typeof deregisterCloner;
|
|
19
52
|
var handlers: {
|
|
20
53
|
deregister(constructor: Constructor): void;
|
|
21
|
-
handle(value: unknown, ...parameters: unknown[]):
|
|
54
|
+
handle(value: unknown, ...parameters: unknown[]): unknown;
|
|
22
55
|
register(constructor: Constructor, handler?: string | GenericCallback): void;
|
|
23
56
|
};
|
|
24
|
-
var
|
|
57
|
+
var initialize: typeof initializeCloner;
|
|
25
58
|
var register: typeof registerCloner;
|
|
26
59
|
}
|
|
27
60
|
/**
|
|
28
61
|
* Copy any kind of value
|
|
29
62
|
*
|
|
30
|
-
* -
|
|
63
|
+
* - Copies the value shallowly _(if possible)_, without copying or cloning nested values
|
|
31
64
|
* - To copy a value deeply, use `clone` instead
|
|
32
65
|
*
|
|
33
66
|
* @param value Value to copy
|
|
@@ -42,6 +75,15 @@ declare function copy<Value>(value: Value): Value;
|
|
|
42
75
|
* @param constructor Class constructor
|
|
43
76
|
*/
|
|
44
77
|
declare function deregisterCloner<Instance>(constructor: Constructor<Instance>): void;
|
|
78
|
+
/**
|
|
79
|
+
* Create a cloner with predefined options
|
|
80
|
+
*
|
|
81
|
+
* _Available as `initializeCloner` and `clone.initialize`_
|
|
82
|
+
*
|
|
83
|
+
* @param options Clone options
|
|
84
|
+
* @returns Cloner function
|
|
85
|
+
*/
|
|
86
|
+
declare function initializeCloner(options?: CloneOptions): Cloner;
|
|
45
87
|
/**
|
|
46
88
|
* Register a clone handler for a specific class
|
|
47
89
|
*
|
|
@@ -52,4 +94,4 @@ declare function deregisterCloner<Instance>(constructor: Constructor<Instance>):
|
|
|
52
94
|
*/
|
|
53
95
|
declare function registerCloner<Instance>(constructor: Constructor<Instance>, handler?: string | ((value: Instance) => Instance)): void;
|
|
54
96
|
//#endregion
|
|
55
|
-
export { clone, copy, deregisterCloner, registerCloner };
|
|
97
|
+
export { CloneOptions, Cloner, clone, copy, deregisterCloner, initializeCloner, registerCloner };
|
package/dist/value/clone.mjs
CHANGED
|
@@ -2,110 +2,104 @@ import { isArrayOrPlainObject, isTypedArray } from "../internal/is.mjs";
|
|
|
2
2
|
import { getSelfHandlers } from "../internal/value/handlers.mjs";
|
|
3
3
|
//#region src/value/clone.ts
|
|
4
4
|
const CLONE_NAME = "clone";
|
|
5
|
-
function clone(value,
|
|
6
|
-
return
|
|
5
|
+
function clone(value, options) {
|
|
6
|
+
return cloneAny(value, { copy: false }, 0, options);
|
|
7
7
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
8
|
+
function cloneAny(value, parameters, depth, options) {
|
|
9
|
+
switch (true) {
|
|
10
|
+
case value === null || CLONE_PRIMITIVES[typeof value]: return value;
|
|
11
|
+
case value instanceof Date: return new Date(value.getTime());
|
|
12
|
+
case typeof value === "function":
|
|
13
|
+
parameters.options ??= getCloneOptions(options);
|
|
14
|
+
return parameters.options.copyFunctions ? value : void 0;
|
|
15
|
+
case typeof value === "symbol":
|
|
16
|
+
parameters.options ??= getCloneOptions(options);
|
|
17
|
+
return parameters.options.copySymbols ? value : Symbol(value.description);
|
|
18
|
+
}
|
|
19
|
+
parameters.options ??= getCloneOptions(options);
|
|
20
|
+
parameters.references ??= /* @__PURE__ */ new WeakMap();
|
|
21
|
+
switch (true) {
|
|
22
|
+
case parameters.references.has(value): return parameters.references.get(value);
|
|
23
|
+
case value instanceof ArrayBuffer: return cloneArrayBuffer(value, parameters, depth);
|
|
24
|
+
case value instanceof DataView: return cloneDataView(value, parameters, depth);
|
|
25
|
+
case value instanceof RegExp: return cloneRegularExpression(value, parameters, depth);
|
|
26
|
+
case value instanceof Map: return cloneMap(value, parameters, depth);
|
|
27
|
+
case typeof Node !== "undefined" && value instanceof Node: return cloneNode(value, parameters, depth);
|
|
28
|
+
case value instanceof Set: return cloneSet(value, parameters, depth);
|
|
29
|
+
case isArrayOrPlainObject(value): return cloneObject(value, parameters, depth);
|
|
30
|
+
case isTypedArray(value): return cloneTypedArray(value, parameters, depth);
|
|
31
|
+
default: return parameters.copy ? value : clone.handlers.handle(value, parameters, depth);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function cloneArrayBuffer(value, parameters, depth) {
|
|
35
|
+
if (parameters.copy || depth >= CLONE_MAX_DEPTH) return value;
|
|
16
36
|
const cloned = new ArrayBuffer(value.byteLength);
|
|
17
37
|
new Uint8Array(cloned).set(new Uint8Array(value));
|
|
18
|
-
references
|
|
38
|
+
parameters.references.set(value, cloned);
|
|
19
39
|
return cloned;
|
|
20
40
|
}
|
|
21
|
-
function cloneDataView(value,
|
|
22
|
-
if (depth >= CLONE_MAX_DEPTH) return value;
|
|
23
|
-
const buffer = cloneArrayBuffer(value.buffer);
|
|
41
|
+
function cloneDataView(value, parameters, depth) {
|
|
42
|
+
if (parameters.copy || depth >= CLONE_MAX_DEPTH) return value;
|
|
43
|
+
const buffer = cloneArrayBuffer(value.buffer, parameters, depth);
|
|
24
44
|
const cloned = new DataView(buffer, value.byteOffset, value.byteLength);
|
|
25
|
-
references.set(value, cloned);
|
|
45
|
+
parameters.references.set(value, cloned);
|
|
26
46
|
return cloned;
|
|
27
47
|
}
|
|
28
|
-
function cloneMap(map,
|
|
48
|
+
function cloneMap(map, parameters, depth) {
|
|
29
49
|
if (depth >= CLONE_MAX_DEPTH) return map;
|
|
50
|
+
if (parameters.copy) return new Map(map);
|
|
30
51
|
const cloned = /* @__PURE__ */ new Map();
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
references.set(map, cloned);
|
|
52
|
+
for (const [key, value] of map.entries()) cloned.set(cloneAny(key, parameters, depth + 1), cloneAny(value, parameters, depth + 1));
|
|
53
|
+
parameters.references.set(map, cloned);
|
|
34
54
|
return cloned;
|
|
35
55
|
}
|
|
36
|
-
function cloneNode(node,
|
|
37
|
-
if (depth >= CLONE_MAX_DEPTH) return node;
|
|
56
|
+
function cloneNode(node, parameters, depth) {
|
|
57
|
+
if (parameters.copy || depth >= CLONE_MAX_DEPTH) return node;
|
|
38
58
|
const cloned = node.cloneNode(true);
|
|
39
|
-
references.set(node, cloned);
|
|
59
|
+
parameters.references.set(node, cloned);
|
|
40
60
|
return cloned;
|
|
41
61
|
}
|
|
42
|
-
function cloneObject(value,
|
|
43
|
-
if (
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
const
|
|
62
|
+
function cloneObject(value, parameters, depth) {
|
|
63
|
+
if (depth >= CLONE_MAX_DEPTH) return value;
|
|
64
|
+
const isArray = Array.isArray(value);
|
|
65
|
+
if (parameters.copy) return isArray ? value.slice() : { ...value };
|
|
66
|
+
const cloned = isArray ? [] : {};
|
|
67
|
+
const keys = isArray ? void 0 : Object.keys(value);
|
|
68
|
+
const { length } = keys ?? value;
|
|
47
69
|
for (let index = 0; index < length; index += 1) {
|
|
48
|
-
const key = keys[index];
|
|
49
|
-
cloned[key] =
|
|
70
|
+
const key = keys?.[index] ?? index;
|
|
71
|
+
cloned[key] = cloneAny(value[key], parameters, depth + 1);
|
|
50
72
|
}
|
|
51
|
-
references.set(value, cloned);
|
|
73
|
+
parameters.references.set(value, cloned);
|
|
52
74
|
return cloned;
|
|
53
75
|
}
|
|
54
|
-
function cloneRegularExpression(value,
|
|
55
|
-
if (depth >= CLONE_MAX_DEPTH) return value;
|
|
76
|
+
function cloneRegularExpression(value, parameters, depth) {
|
|
77
|
+
if (parameters.copy || depth >= CLONE_MAX_DEPTH) return value;
|
|
56
78
|
const cloned = new RegExp(value.source, value.flags);
|
|
57
79
|
cloned.lastIndex = value.lastIndex;
|
|
58
|
-
references.set(value, cloned);
|
|
80
|
+
parameters.references.set(value, cloned);
|
|
59
81
|
return cloned;
|
|
60
82
|
}
|
|
61
|
-
function cloneSet(set,
|
|
83
|
+
function cloneSet(set, parameters, depth) {
|
|
62
84
|
if (depth >= CLONE_MAX_DEPTH) return set;
|
|
85
|
+
if (parameters.copy) return new Set(set);
|
|
63
86
|
const cloned = /* @__PURE__ */ new Set();
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
for (let index = 0; index < length; index += 1) cloned.add(flat ? values[index] : cloneValue(values[index], depth + 1, references, false));
|
|
67
|
-
references.set(set, cloned);
|
|
87
|
+
for (const value of set.values()) cloned.add(cloneAny(value, parameters, depth + 1));
|
|
88
|
+
parameters.references.set(set, cloned);
|
|
68
89
|
return cloned;
|
|
69
90
|
}
|
|
70
|
-
function cloneTypedArray(value,
|
|
71
|
-
if (depth >= CLONE_MAX_DEPTH) return value;
|
|
91
|
+
function cloneTypedArray(value, parameters, depth) {
|
|
92
|
+
if (parameters.copy || depth >= CLONE_MAX_DEPTH) return value;
|
|
72
93
|
const cloned = new value.constructor(value);
|
|
73
|
-
references.set(value, cloned);
|
|
94
|
+
parameters.references.set(value, cloned);
|
|
74
95
|
return cloned;
|
|
75
96
|
}
|
|
76
|
-
function cloneValue(value, depth, references, flat) {
|
|
77
|
-
switch (true) {
|
|
78
|
-
case value == null:
|
|
79
|
-
case typeof value === "bigint":
|
|
80
|
-
case typeof value === "boolean":
|
|
81
|
-
case typeof value === "number":
|
|
82
|
-
case typeof value === "string": return value;
|
|
83
|
-
case typeof value === "function": return;
|
|
84
|
-
case typeof value === "symbol": return Symbol(value.description);
|
|
85
|
-
case references.has(value): return references.get(value);
|
|
86
|
-
case value instanceof ArrayBuffer: return cloneArrayBuffer(value, depth, references);
|
|
87
|
-
case value instanceof DataView: return cloneDataView(value, depth, references);
|
|
88
|
-
case value instanceof Date: return new Date(value.getTime());
|
|
89
|
-
case value instanceof RegExp: return cloneRegularExpression(value, depth, references);
|
|
90
|
-
case value instanceof Map: return cloneMap(value, depth, references, flat);
|
|
91
|
-
case typeof Node !== "undefined" && value instanceof Node: return cloneNode(value, depth, references);
|
|
92
|
-
case value instanceof Set: return cloneSet(value, depth, references, flat);
|
|
93
|
-
case isArrayOrPlainObject(value): return cloneObject(value, depth, references, flat);
|
|
94
|
-
case isTypedArray(value): return cloneTypedArray(value, depth, references);
|
|
95
|
-
default: return clone.handlers.handle(value, depth, references);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Copy any kind of value
|
|
100
|
-
*
|
|
101
|
-
* - Clones the value shallowly, without cloning nested values
|
|
102
|
-
* - To copy a value deeply, use `clone` instead
|
|
103
|
-
*
|
|
104
|
-
* @param value Value to copy
|
|
105
|
-
* @returns Copied value
|
|
106
|
-
*/
|
|
107
97
|
function copy(value) {
|
|
108
|
-
return
|
|
98
|
+
return cloneAny(value, {
|
|
99
|
+
copy: true,
|
|
100
|
+
options: CLONE_COPY_OPTIONS,
|
|
101
|
+
references: void 0
|
|
102
|
+
}, 0);
|
|
109
103
|
}
|
|
110
104
|
/**
|
|
111
105
|
* Deregister a clone handler for a specific class
|
|
@@ -117,6 +111,37 @@ function copy(value) {
|
|
|
117
111
|
function deregisterCloner(constructor) {
|
|
118
112
|
clone.handlers.deregister(constructor);
|
|
119
113
|
}
|
|
114
|
+
function getCloneOptions(input) {
|
|
115
|
+
if (typeof input !== "object" || input === null) return CLONE_DEFAULT_OPTIONS;
|
|
116
|
+
return {
|
|
117
|
+
copyFunctions: input.copyFunctions === true,
|
|
118
|
+
copySymbols: input.copySymbols === true
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Create a cloner with predefined options
|
|
123
|
+
*
|
|
124
|
+
* _Available as `initializeCloner` and `clone.initialize`_
|
|
125
|
+
*
|
|
126
|
+
* @param options Clone options
|
|
127
|
+
* @returns Cloner function
|
|
128
|
+
*/
|
|
129
|
+
function initializeCloner(options) {
|
|
130
|
+
const opts = getCloneOptions(options);
|
|
131
|
+
function cloner(value) {
|
|
132
|
+
return cloneAny(value, {
|
|
133
|
+
copy: false,
|
|
134
|
+
options: opts
|
|
135
|
+
}, 0);
|
|
136
|
+
}
|
|
137
|
+
cloner.deregister = deregisterCloner;
|
|
138
|
+
cloner.register = registerCloner;
|
|
139
|
+
Object.defineProperties(cloner, {
|
|
140
|
+
deregister: { value: deregisterCloner },
|
|
141
|
+
register: { value: registerCloner }
|
|
142
|
+
});
|
|
143
|
+
return cloner;
|
|
144
|
+
}
|
|
120
145
|
/**
|
|
121
146
|
* Register a clone handler for a specific class
|
|
122
147
|
*
|
|
@@ -128,17 +153,49 @@ function deregisterCloner(constructor) {
|
|
|
128
153
|
function registerCloner(constructor, handler) {
|
|
129
154
|
clone.handlers.register(constructor, handler);
|
|
130
155
|
}
|
|
131
|
-
function tryStructuredClone(value,
|
|
156
|
+
function tryStructuredClone(value, parameters, depth) {
|
|
132
157
|
if (depth >= CLONE_MAX_DEPTH) return value;
|
|
133
158
|
try {
|
|
134
159
|
const cloned = structuredClone(value);
|
|
135
|
-
references.set(value, cloned);
|
|
160
|
+
parameters.references.set(value, cloned);
|
|
136
161
|
return cloned;
|
|
137
162
|
} catch {
|
|
138
|
-
references.set(value, value);
|
|
163
|
+
parameters.references.set(value, value);
|
|
139
164
|
return value;
|
|
140
165
|
}
|
|
141
166
|
}
|
|
167
|
+
const CLONE_COPY_OPTIONS = {
|
|
168
|
+
copyFunctions: true,
|
|
169
|
+
copySymbols: true
|
|
170
|
+
};
|
|
171
|
+
const CLONE_DEFAULT_OPTIONS = {
|
|
172
|
+
copyFunctions: false,
|
|
173
|
+
copySymbols: false
|
|
174
|
+
};
|
|
142
175
|
const CLONE_MAX_DEPTH = 100;
|
|
176
|
+
const cloneHandlers = getSelfHandlers(clone, {
|
|
177
|
+
callback: tryStructuredClone,
|
|
178
|
+
method: CLONE_NAME
|
|
179
|
+
});
|
|
180
|
+
const CLONE_PRIMITIVES = {
|
|
181
|
+
bigint: true,
|
|
182
|
+
boolean: true,
|
|
183
|
+
function: false,
|
|
184
|
+
number: true,
|
|
185
|
+
object: false,
|
|
186
|
+
string: true,
|
|
187
|
+
symbol: false,
|
|
188
|
+
undefined: true
|
|
189
|
+
};
|
|
190
|
+
clone.deregister = deregisterCloner;
|
|
191
|
+
clone.handlers = cloneHandlers;
|
|
192
|
+
clone.initialize = initializeCloner;
|
|
193
|
+
clone.register = registerCloner;
|
|
194
|
+
Object.defineProperties(clone, {
|
|
195
|
+
deregister: { value: deregisterCloner },
|
|
196
|
+
handlers: { value: cloneHandlers },
|
|
197
|
+
initialize: { value: initializeCloner },
|
|
198
|
+
register: { value: registerCloner }
|
|
199
|
+
});
|
|
143
200
|
//#endregion
|
|
144
|
-
export { clone, copy, deregisterCloner, registerCloner };
|
|
201
|
+
export { clone, copy, deregisterCloner, initializeCloner, registerCloner };
|
|
@@ -4,7 +4,9 @@ function inMap(map, value, key) {
|
|
|
4
4
|
const getKey = key === true;
|
|
5
5
|
if (!(map instanceof Map)) return getKey ? void 0 : false;
|
|
6
6
|
if (!getKey) return inSet(new Set(map.values()), value);
|
|
7
|
-
|
|
7
|
+
let found;
|
|
8
|
+
for (const [key, item] of map) if (equal(item, value)) found = key;
|
|
9
|
+
return found;
|
|
8
10
|
}
|
|
9
11
|
/**
|
|
10
12
|
* Does the value exist in a _Set_?
|
package/dist/value/freeze.mjs
CHANGED
|
@@ -10,8 +10,6 @@ function flatFreeze(value) {
|
|
|
10
10
|
function freeze(value, flat) {
|
|
11
11
|
return freezeValue(value, /* @__PURE__ */ new WeakSet(), flat === true);
|
|
12
12
|
}
|
|
13
|
-
freeze.flat = flatFreeze;
|
|
14
|
-
freeze.is = isFrozen;
|
|
15
13
|
function freezeArray(array, references, flat) {
|
|
16
14
|
if (flat) return Object.freeze(array);
|
|
17
15
|
references.add(array);
|
|
@@ -76,5 +74,11 @@ function isFrozen(value) {
|
|
|
76
74
|
return typeof value === "object" && value !== null && Object.isFrozen(value);
|
|
77
75
|
}
|
|
78
76
|
const frozenValues = /* @__PURE__ */ new WeakSet();
|
|
77
|
+
freeze.flat = flatFreeze;
|
|
78
|
+
freeze.is = isFrozen;
|
|
79
|
+
Object.defineProperties(freeze, {
|
|
80
|
+
flat: { value: flatFreeze },
|
|
81
|
+
is: { value: isFrozen }
|
|
82
|
+
});
|
|
79
83
|
//#endregion
|
|
80
84
|
export { flatFreeze, freeze, isFrozen };
|