You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
1.8 KiB
83 lines
1.8 KiB
/*! |
|
* 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;
|
|
|