index.js
1.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*!
* shallow-clone <https://github.com/jonschlinkert/shallow-clone>
*
* Copyright (c) 2015-present, Jon Schlinkert.
* Released under the MIT License.
*/
'use strict';
const valueOf = Symbol.prototype.valueOf;
const typeOf = require('kind-of');
function clone(val, deep) {
switch (typeOf(val)) {
case 'array':
return val.slice();
case 'object':
return Object.assign({}, val);
case 'date':
return new val.constructor(Number(val));
case 'map':
return new Map(val);
case 'set':
return new Set(val);
case 'buffer':
return cloneBuffer(val);
case 'symbol':
return cloneSymbol(val);
case 'arraybuffer':
return cloneArrayBuffer(val);
case 'float32array':
case 'float64array':
case 'int16array':
case 'int32array':
case 'int8array':
case 'uint16array':
case 'uint32array':
case 'uint8clampedarray':
case 'uint8array':
return cloneTypedArray(val);
case 'regexp':
return cloneRegExp(val);
case 'error':
return Object.create(val);
default: {
return val;
}
}
}
function cloneRegExp(val) {
const flags = val.flags !== void 0 ? val.flags : (/\w+$/.exec(val) || void 0);
const re = new val.constructor(val.source, flags);
re.lastIndex = val.lastIndex;
return re;
}
function cloneArrayBuffer(val) {
const res = new val.constructor(val.byteLength);
new Uint8Array(res).set(new Uint8Array(val));
return res;
}
function cloneTypedArray(val, deep) {
return new val.constructor(val.buffer, val.byteOffset, val.length);
}
function cloneBuffer(val) {
const len = val.length;
const buf = Buffer.allocUnsafe ? Buffer.allocUnsafe(len) : Buffer.from(len);
val.copy(buf);
return buf;
}
function cloneSymbol(val) {
return valueOf ? Object(valueOf.call(val)) : {};
}
/**
* Expose `clone`
*/
module.exports = clone;