@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.
@@ -4,6 +4,7 @@ function getArrayCallback(value) {
4
4
  case "function": return value;
5
5
  case "number":
6
6
  case "string": return typeof value === "string" && value.includes(".") ? void 0 : (obj) => obj[value];
7
+ default: return;
7
8
  }
8
9
  }
9
10
  function getArrayCallbacks(bool, key, value) {
@@ -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, ItemKey extends keyof NumericalValues<Item>>(items: Item[], key: ItemKey, first: true): Item | undefined;
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, ItemKey extends keyof NumericalValues<Item>>(items: Item[], key: ItemKey): Item[];
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
- const value = super.get(key);
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[]): any;
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 };
@@ -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 };
@@ -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
- if (update ?? false) {
50
- super.delete(value);
51
- this.add(value);
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
@@ -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 };
@@ -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 };
@@ -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
- * Clone any kind of value _(shallowly)_
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
- declare function clone<Value>(value: Value, flat: true): Value;
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[]): any;
54
+ handle(value: unknown, ...parameters: unknown[]): unknown;
22
55
  register(constructor: Constructor, handler?: string | GenericCallback): void;
23
56
  };
24
- var deregister: typeof deregisterCloner;
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
- * - Clones the value shallowly, without cloning nested values
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 };
@@ -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, flat) {
6
- return flat === true ? copy(value) : cloneValue(value, 0, /* @__PURE__ */ new WeakMap(), false);
5
+ function clone(value, options) {
6
+ return cloneAny(value, { copy: false }, 0, options);
7
7
  }
8
- clone.handlers = getSelfHandlers(clone, {
9
- callback: tryStructuredClone,
10
- method: CLONE_NAME
11
- });
12
- clone.deregister = deregisterCloner;
13
- clone.register = registerCloner;
14
- function cloneArrayBuffer(value, depth, references) {
15
- if (typeof depth === "number" && depth >= CLONE_MAX_DEPTH) return value;
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?.set(value, cloned);
38
+ parameters.references.set(value, cloned);
19
39
  return cloned;
20
40
  }
21
- function cloneDataView(value, depth, references) {
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, depth, references, flat) {
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 entries = map.entries();
32
- for (const entry of entries) cloned.set(flat ? entry[0] : cloneValue(entry[0], depth + 1, references, false), flat ? entry[1] : cloneValue(entry[1], depth + 1, references, false));
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, depth, references) {
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, depth, references, flat) {
43
- if (flat || depth >= CLONE_MAX_DEPTH) return Array.isArray(value) ? value.slice() : { ...value };
44
- const cloned = Array.isArray(value) ? [] : {};
45
- const keys = [...Object.keys(value), ...Object.getOwnPropertySymbols(value)];
46
- const { length } = keys;
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] = cloneValue(value[key], depth + 1, references, false);
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, depth, references) {
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, depth, references, flat) {
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 values = [...set.values()];
65
- const { length } = values;
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, depth, references) {
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 cloneValue(value, 0, /* @__PURE__ */ new WeakMap(), true);
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, depth, references) {
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
- for (const [key, item] of map) if (equal(item, value)) return key;
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_?
@@ -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 };