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