bunshin-clone 1.5.6 → 1.6.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/README.md CHANGED
@@ -23,10 +23,10 @@ import { bunshinClone } from 'https://esm.unpkg.com/bunshin-clone@<x.x.x>';
23
23
  ## 📦 APIs
24
24
 
25
25
  ```ts
26
- bunshinClone<T>(source, options);
26
+ bunshinClone<T>(value, options);
27
27
  // => T
28
28
  //
29
- // source: T
29
+ // value: T
30
30
  // options (optional): BunshinCloneOptions
31
31
  ```
32
32
 
package/dist/index.cjs CHANGED
@@ -2,126 +2,125 @@
2
2
 
3
3
  // src/index.ts
4
4
  var EMPTY_OPTIONS = {};
5
- var { hasOwnProperty: HAS_OWN } = Object.prototype;
6
- function bunshinClone(source, options = EMPTY_OPTIONS, refs = /* @__PURE__ */ new WeakMap()) {
7
- return clone(source, resolveOptions(options), refs);
5
+ function bunshinClone(value, options = EMPTY_OPTIONS, refs = /* @__PURE__ */ new WeakMap()) {
6
+ return clone(value, resolveOptions(options), refs);
8
7
  }
9
- function clone(source, settings, refs) {
10
- if (!isObject(source)) {
11
- return source;
8
+ function clone(value, settings, refs) {
9
+ if (!isObject(value)) {
10
+ return value;
12
11
  }
13
- if (refs.has(source)) {
14
- return refs.get(source);
12
+ if (refs.has(value)) {
13
+ return refs.get(value);
15
14
  }
16
- if (settings.preserveDescriptors && isPlainObject(source)) {
17
- return cloneWithDescriptors(source, settings, refs);
15
+ if (settings.preserveDescriptors && isPlainObject(value)) {
16
+ return cloneWithDescriptors(value, settings, refs);
18
17
  }
19
- if (Array.isArray(source)) {
20
- const { length } = source;
18
+ if (Array.isArray(value)) {
19
+ const { length } = value;
21
20
  const result = new Array(length);
22
- refs.set(source, result);
21
+ refs.set(value, result);
23
22
  for (let i = 0; i < length; i++) {
24
- result[i] = clone(source[i], settings, refs);
23
+ result[i] = clone(value[i], settings, refs);
25
24
  }
26
25
  return result;
27
26
  }
28
- if (isPlainObject(source)) {
29
- const result = Object.create(Object.getPrototypeOf(source));
30
- refs.set(source, result);
31
- for (const key in source) {
32
- if (HAS_OWN.call(source, key) && !isUnsafeKey(key)) {
33
- result[key] = clone(source[key], settings, refs);
27
+ if (isPlainObject(value)) {
28
+ const result = Object.create(Object.getPrototypeOf(value));
29
+ refs.set(value, result);
30
+ for (const key of Reflect.ownKeys(value)) {
31
+ if (!isUnsafeKey(key) && Object.prototype.propertyIsEnumerable.call(value, key)) {
32
+ result[key] = clone(value[key], settings, refs);
34
33
  }
35
34
  }
36
35
  return result;
37
36
  }
38
- if (source instanceof Map) {
37
+ if (value instanceof Map) {
39
38
  const result = /* @__PURE__ */ new Map();
40
- refs.set(source, result);
41
- for (const [key, value] of source) {
42
- result.set(clone(key, settings, refs), clone(value, settings, refs));
39
+ refs.set(value, result);
40
+ for (const [key, v] of value) {
41
+ result.set(clone(key, settings, refs), clone(v, settings, refs));
43
42
  }
44
43
  return result;
45
44
  }
46
- if (source instanceof Set) {
45
+ if (value instanceof Set) {
47
46
  const result = /* @__PURE__ */ new Set();
48
- refs.set(source, result);
49
- for (const item of source) {
47
+ refs.set(value, result);
48
+ for (const item of value) {
50
49
  result.add(clone(item, settings, refs));
51
50
  }
52
51
  return result;
53
52
  }
54
- if (source instanceof Date) {
55
- const result = new Date(source.getTime());
56
- refs.set(source, result);
53
+ if (value instanceof Date) {
54
+ const result = new Date(value.getTime());
55
+ refs.set(value, result);
57
56
  return result;
58
57
  }
59
- if (source instanceof RegExp) {
60
- const result = new RegExp(source.source, source.flags);
61
- refs.set(source, result);
62
- result.lastIndex = source.lastIndex;
58
+ if (value instanceof RegExp) {
59
+ const result = new RegExp(value.source, value.flags);
60
+ refs.set(value, result);
61
+ result.lastIndex = value.lastIndex;
63
62
  return result;
64
63
  }
65
- if (source instanceof ArrayBuffer) {
66
- const result = source.slice(0);
67
- refs.set(source, result);
64
+ if (value instanceof ArrayBuffer) {
65
+ const result = value.slice(0);
66
+ refs.set(value, result);
68
67
  return result;
69
68
  }
70
- if (ArrayBuffer.isView(source)) {
71
- if (source instanceof DataView) {
72
- const { buffer: buffer2, byteOffset: byteOffset2, byteLength } = source;
69
+ if (ArrayBuffer.isView(value)) {
70
+ if (value instanceof DataView) {
71
+ const { buffer: buffer2, byteOffset: byteOffset2, byteLength } = value;
73
72
  const result2 = new DataView(
74
73
  cloneBuffer(buffer2, refs),
75
74
  byteOffset2,
76
75
  byteLength
77
76
  );
78
- refs.set(source, result2);
77
+ refs.set(value, result2);
79
78
  return result2;
80
79
  }
81
- const view = source;
80
+ const view = value;
82
81
  if (!settings.preserveBufferSharing) {
83
82
  const Ctor2 = view.constructor;
84
83
  const result2 = new Ctor2(view);
85
- refs.set(source, result2);
84
+ refs.set(value, result2);
86
85
  return result2;
87
86
  }
88
87
  const Ctor = view.constructor;
89
88
  const { buffer, byteOffset, length } = view;
90
89
  const result = new Ctor(cloneBuffer(buffer, refs), byteOffset, length);
91
- refs.set(source, result);
90
+ refs.set(value, result);
92
91
  return result;
93
92
  }
94
- if (source instanceof DOMException || source instanceof Error) {
95
- return cloneError(source, settings, refs);
93
+ if (value instanceof DOMException || value instanceof Error) {
94
+ return cloneError(value, settings, refs);
96
95
  }
97
- if (source instanceof Blob) {
98
- const result = source.slice(0, source.size, source.type);
99
- refs.set(source, result);
96
+ if (value instanceof Blob) {
97
+ const result = value.slice(0, value.size, value.type);
98
+ refs.set(value, result);
100
99
  return result;
101
100
  }
102
- if (typeof ImageData !== "undefined" && source instanceof ImageData) {
103
- const { data, width, height, colorSpace } = source;
101
+ if (typeof ImageData !== "undefined" && value instanceof ImageData) {
102
+ const { data, width, height, colorSpace } = value;
104
103
  const result = new ImageData(new Uint8ClampedArray(data), width, height, {
105
104
  colorSpace
106
105
  });
107
- refs.set(source, result);
106
+ refs.set(value, result);
108
107
  return result;
109
108
  }
110
- if (source instanceof URL) {
111
- const result = new URL(source.href);
112
- refs.set(source, result);
109
+ if (value instanceof URL) {
110
+ const result = new URL(value.href);
111
+ refs.set(value, result);
113
112
  return result;
114
113
  }
115
- if (source instanceof URLSearchParams) {
114
+ if (value instanceof URLSearchParams) {
116
115
  const result = new URLSearchParams();
117
- refs.set(source, result);
118
- for (const [key, value] of source) {
119
- result.append(key, value);
116
+ refs.set(value, result);
117
+ for (const [key, v] of value) {
118
+ result.append(key, v);
120
119
  }
121
120
  return result;
122
121
  }
123
- refs.set(source, source);
124
- return source;
122
+ refs.set(value, value);
123
+ return value;
125
124
  }
126
125
  function cloneBuffer(buffer, refs) {
127
126
  if (refs.has(buffer)) {
@@ -131,31 +130,31 @@ function cloneBuffer(buffer, refs) {
131
130
  refs.set(buffer, result);
132
131
  return result;
133
132
  }
134
- function cloneError(source, settings, refs) {
135
- const result = createErrorInstance(source, settings, refs);
136
- refs.set(source, result);
137
- if (source instanceof DOMException) {
133
+ function cloneError(error, settings, refs) {
134
+ const result = createErrorInstance(error, settings, refs);
135
+ refs.set(error, result);
136
+ if (error instanceof DOMException) {
138
137
  return result;
139
138
  }
140
- const { stack, cause } = source;
139
+ const { stack, cause } = error;
141
140
  if (stack) {
142
141
  try {
143
142
  result.stack = stack;
144
143
  } catch {
145
144
  }
146
145
  }
147
- if ("cause" in source && cause !== void 0) {
146
+ if ("cause" in error && cause !== void 0) {
148
147
  result.cause = clone(cause, settings, refs);
149
148
  }
150
- for (const key of Object.keys(source)) {
151
- Reflect.set(result, key, clone(Reflect.get(source, key), settings, refs));
149
+ for (const key of Object.keys(error)) {
150
+ Reflect.set(result, key, clone(Reflect.get(error, key), settings, refs));
152
151
  }
153
152
  return result;
154
153
  }
155
- function cloneWithDescriptors(source, settings, refs) {
156
- const result = Object.create(Object.getPrototypeOf(source));
157
- refs.set(source, result);
158
- const descs = Object.getOwnPropertyDescriptors(source);
154
+ function cloneWithDescriptors(object, settings, refs) {
155
+ const result = Object.create(Object.getPrototypeOf(object));
156
+ refs.set(object, result);
157
+ const descs = Object.getOwnPropertyDescriptors(object);
159
158
  forEachOwnKey(descs, (key) => {
160
159
  if (isUnsafeKey(key)) {
161
160
  return;
@@ -182,14 +181,14 @@ var ERROR_CTORS = {
182
181
  TypeError,
183
182
  URIError
184
183
  };
185
- function createErrorInstance(source, settings, refs) {
186
- const { message, name } = source;
187
- if (source instanceof DOMException) {
184
+ function createErrorInstance(error, settings, refs) {
185
+ const { message, name } = error;
186
+ if (error instanceof DOMException) {
188
187
  return new DOMException(message, name);
189
188
  }
190
- if (source instanceof AggregateError) {
189
+ if (error instanceof AggregateError) {
191
190
  return new AggregateError(
192
- source.errors.map((e) => clone(e, settings, refs)),
191
+ error.errors.map((e) => clone(e, settings, refs)),
193
192
  message
194
193
  );
195
194
  }
package/dist/index.d.cts CHANGED
@@ -5,7 +5,7 @@ interface BunshinCloneOptions {
5
5
  }
6
6
  type PlainObject = Record<PropertyKey, unknown>;
7
7
  type Refs = WeakMap<object, unknown>;
8
- declare function bunshinClone<T>(source: T, options?: Partial<BunshinCloneOptions>, refs?: Refs): T;
8
+ declare function bunshinClone<T>(value: T, options?: Partial<BunshinCloneOptions>, refs?: Refs): T;
9
9
  declare function forEachOwnKey(object: PlainObject, callback: (key: string | symbol) => void): void;
10
10
  declare function isObject(value: unknown): value is object;
11
11
  declare function isPlainObject(value: unknown): value is PlainObject;
package/dist/index.d.ts CHANGED
@@ -5,7 +5,7 @@ interface BunshinCloneOptions {
5
5
  }
6
6
  type PlainObject = Record<PropertyKey, unknown>;
7
7
  type Refs = WeakMap<object, unknown>;
8
- declare function bunshinClone<T>(source: T, options?: Partial<BunshinCloneOptions>, refs?: Refs): T;
8
+ declare function bunshinClone<T>(value: T, options?: Partial<BunshinCloneOptions>, refs?: Refs): T;
9
9
  declare function forEachOwnKey(object: PlainObject, callback: (key: string | symbol) => void): void;
10
10
  declare function isObject(value: unknown): value is object;
11
11
  declare function isPlainObject(value: unknown): value is PlainObject;
package/dist/index.js CHANGED
@@ -1,125 +1,124 @@
1
1
  // src/index.ts
2
2
  var EMPTY_OPTIONS = {};
3
- var { hasOwnProperty: HAS_OWN } = Object.prototype;
4
- function bunshinClone(source, options = EMPTY_OPTIONS, refs = /* @__PURE__ */ new WeakMap()) {
5
- return clone(source, resolveOptions(options), refs);
3
+ function bunshinClone(value, options = EMPTY_OPTIONS, refs = /* @__PURE__ */ new WeakMap()) {
4
+ return clone(value, resolveOptions(options), refs);
6
5
  }
7
- function clone(source, settings, refs) {
8
- if (!isObject(source)) {
9
- return source;
6
+ function clone(value, settings, refs) {
7
+ if (!isObject(value)) {
8
+ return value;
10
9
  }
11
- if (refs.has(source)) {
12
- return refs.get(source);
10
+ if (refs.has(value)) {
11
+ return refs.get(value);
13
12
  }
14
- if (settings.preserveDescriptors && isPlainObject(source)) {
15
- return cloneWithDescriptors(source, settings, refs);
13
+ if (settings.preserveDescriptors && isPlainObject(value)) {
14
+ return cloneWithDescriptors(value, settings, refs);
16
15
  }
17
- if (Array.isArray(source)) {
18
- const { length } = source;
16
+ if (Array.isArray(value)) {
17
+ const { length } = value;
19
18
  const result = new Array(length);
20
- refs.set(source, result);
19
+ refs.set(value, result);
21
20
  for (let i = 0; i < length; i++) {
22
- result[i] = clone(source[i], settings, refs);
21
+ result[i] = clone(value[i], settings, refs);
23
22
  }
24
23
  return result;
25
24
  }
26
- if (isPlainObject(source)) {
27
- const result = Object.create(Object.getPrototypeOf(source));
28
- refs.set(source, result);
29
- for (const key in source) {
30
- if (HAS_OWN.call(source, key) && !isUnsafeKey(key)) {
31
- result[key] = clone(source[key], settings, refs);
25
+ if (isPlainObject(value)) {
26
+ const result = Object.create(Object.getPrototypeOf(value));
27
+ refs.set(value, result);
28
+ for (const key of Reflect.ownKeys(value)) {
29
+ if (!isUnsafeKey(key) && Object.prototype.propertyIsEnumerable.call(value, key)) {
30
+ result[key] = clone(value[key], settings, refs);
32
31
  }
33
32
  }
34
33
  return result;
35
34
  }
36
- if (source instanceof Map) {
35
+ if (value instanceof Map) {
37
36
  const result = /* @__PURE__ */ new Map();
38
- refs.set(source, result);
39
- for (const [key, value] of source) {
40
- result.set(clone(key, settings, refs), clone(value, settings, refs));
37
+ refs.set(value, result);
38
+ for (const [key, v] of value) {
39
+ result.set(clone(key, settings, refs), clone(v, settings, refs));
41
40
  }
42
41
  return result;
43
42
  }
44
- if (source instanceof Set) {
43
+ if (value instanceof Set) {
45
44
  const result = /* @__PURE__ */ new Set();
46
- refs.set(source, result);
47
- for (const item of source) {
45
+ refs.set(value, result);
46
+ for (const item of value) {
48
47
  result.add(clone(item, settings, refs));
49
48
  }
50
49
  return result;
51
50
  }
52
- if (source instanceof Date) {
53
- const result = new Date(source.getTime());
54
- refs.set(source, result);
51
+ if (value instanceof Date) {
52
+ const result = new Date(value.getTime());
53
+ refs.set(value, result);
55
54
  return result;
56
55
  }
57
- if (source instanceof RegExp) {
58
- const result = new RegExp(source.source, source.flags);
59
- refs.set(source, result);
60
- result.lastIndex = source.lastIndex;
56
+ if (value instanceof RegExp) {
57
+ const result = new RegExp(value.source, value.flags);
58
+ refs.set(value, result);
59
+ result.lastIndex = value.lastIndex;
61
60
  return result;
62
61
  }
63
- if (source instanceof ArrayBuffer) {
64
- const result = source.slice(0);
65
- refs.set(source, result);
62
+ if (value instanceof ArrayBuffer) {
63
+ const result = value.slice(0);
64
+ refs.set(value, result);
66
65
  return result;
67
66
  }
68
- if (ArrayBuffer.isView(source)) {
69
- if (source instanceof DataView) {
70
- const { buffer: buffer2, byteOffset: byteOffset2, byteLength } = source;
67
+ if (ArrayBuffer.isView(value)) {
68
+ if (value instanceof DataView) {
69
+ const { buffer: buffer2, byteOffset: byteOffset2, byteLength } = value;
71
70
  const result2 = new DataView(
72
71
  cloneBuffer(buffer2, refs),
73
72
  byteOffset2,
74
73
  byteLength
75
74
  );
76
- refs.set(source, result2);
75
+ refs.set(value, result2);
77
76
  return result2;
78
77
  }
79
- const view = source;
78
+ const view = value;
80
79
  if (!settings.preserveBufferSharing) {
81
80
  const Ctor2 = view.constructor;
82
81
  const result2 = new Ctor2(view);
83
- refs.set(source, result2);
82
+ refs.set(value, result2);
84
83
  return result2;
85
84
  }
86
85
  const Ctor = view.constructor;
87
86
  const { buffer, byteOffset, length } = view;
88
87
  const result = new Ctor(cloneBuffer(buffer, refs), byteOffset, length);
89
- refs.set(source, result);
88
+ refs.set(value, result);
90
89
  return result;
91
90
  }
92
- if (source instanceof DOMException || source instanceof Error) {
93
- return cloneError(source, settings, refs);
91
+ if (value instanceof DOMException || value instanceof Error) {
92
+ return cloneError(value, settings, refs);
94
93
  }
95
- if (source instanceof Blob) {
96
- const result = source.slice(0, source.size, source.type);
97
- refs.set(source, result);
94
+ if (value instanceof Blob) {
95
+ const result = value.slice(0, value.size, value.type);
96
+ refs.set(value, result);
98
97
  return result;
99
98
  }
100
- if (typeof ImageData !== "undefined" && source instanceof ImageData) {
101
- const { data, width, height, colorSpace } = source;
99
+ if (typeof ImageData !== "undefined" && value instanceof ImageData) {
100
+ const { data, width, height, colorSpace } = value;
102
101
  const result = new ImageData(new Uint8ClampedArray(data), width, height, {
103
102
  colorSpace
104
103
  });
105
- refs.set(source, result);
104
+ refs.set(value, result);
106
105
  return result;
107
106
  }
108
- if (source instanceof URL) {
109
- const result = new URL(source.href);
110
- refs.set(source, result);
107
+ if (value instanceof URL) {
108
+ const result = new URL(value.href);
109
+ refs.set(value, result);
111
110
  return result;
112
111
  }
113
- if (source instanceof URLSearchParams) {
112
+ if (value instanceof URLSearchParams) {
114
113
  const result = new URLSearchParams();
115
- refs.set(source, result);
116
- for (const [key, value] of source) {
117
- result.append(key, value);
114
+ refs.set(value, result);
115
+ for (const [key, v] of value) {
116
+ result.append(key, v);
118
117
  }
119
118
  return result;
120
119
  }
121
- refs.set(source, source);
122
- return source;
120
+ refs.set(value, value);
121
+ return value;
123
122
  }
124
123
  function cloneBuffer(buffer, refs) {
125
124
  if (refs.has(buffer)) {
@@ -129,31 +128,31 @@ function cloneBuffer(buffer, refs) {
129
128
  refs.set(buffer, result);
130
129
  return result;
131
130
  }
132
- function cloneError(source, settings, refs) {
133
- const result = createErrorInstance(source, settings, refs);
134
- refs.set(source, result);
135
- if (source instanceof DOMException) {
131
+ function cloneError(error, settings, refs) {
132
+ const result = createErrorInstance(error, settings, refs);
133
+ refs.set(error, result);
134
+ if (error instanceof DOMException) {
136
135
  return result;
137
136
  }
138
- const { stack, cause } = source;
137
+ const { stack, cause } = error;
139
138
  if (stack) {
140
139
  try {
141
140
  result.stack = stack;
142
141
  } catch {
143
142
  }
144
143
  }
145
- if ("cause" in source && cause !== void 0) {
144
+ if ("cause" in error && cause !== void 0) {
146
145
  result.cause = clone(cause, settings, refs);
147
146
  }
148
- for (const key of Object.keys(source)) {
149
- Reflect.set(result, key, clone(Reflect.get(source, key), settings, refs));
147
+ for (const key of Object.keys(error)) {
148
+ Reflect.set(result, key, clone(Reflect.get(error, key), settings, refs));
150
149
  }
151
150
  return result;
152
151
  }
153
- function cloneWithDescriptors(source, settings, refs) {
154
- const result = Object.create(Object.getPrototypeOf(source));
155
- refs.set(source, result);
156
- const descs = Object.getOwnPropertyDescriptors(source);
152
+ function cloneWithDescriptors(object, settings, refs) {
153
+ const result = Object.create(Object.getPrototypeOf(object));
154
+ refs.set(object, result);
155
+ const descs = Object.getOwnPropertyDescriptors(object);
157
156
  forEachOwnKey(descs, (key) => {
158
157
  if (isUnsafeKey(key)) {
159
158
  return;
@@ -180,14 +179,14 @@ var ERROR_CTORS = {
180
179
  TypeError,
181
180
  URIError
182
181
  };
183
- function createErrorInstance(source, settings, refs) {
184
- const { message, name } = source;
185
- if (source instanceof DOMException) {
182
+ function createErrorInstance(error, settings, refs) {
183
+ const { message, name } = error;
184
+ if (error instanceof DOMException) {
186
185
  return new DOMException(message, name);
187
186
  }
188
- if (source instanceof AggregateError) {
187
+ if (error instanceof AggregateError) {
189
188
  return new AggregateError(
190
- source.errors.map((e) => clone(e, settings, refs)),
189
+ error.errors.map((e) => clone(e, settings, refs)),
191
190
  message
192
191
  );
193
192
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bunshin-clone",
3
- "version": "1.5.6",
3
+ "version": "1.6.0",
4
4
  "description": "High-performance deep clone utility with descriptor support",
5
5
  "keywords": [
6
6
  "array",