foop
Version:
interfaces that describe their intentions.
113 lines (106 loc) • 8.85 kB
JavaScript
var isObjNotNull = require('../is/objNotNull')
var isRegExp = require('../is/regexp')
var isError = require('../is/error')
var isDate = require('../is/date')
var isArray = require('../is/array')
var newRegExp = require('../construct/regexp')
var ENV_DEBUG = require('../env/debug')
/* prettier-ignore */
/**
* @desc copy any primitive value, part of clone
* @version 5.0.0
* @since 3.0.0
* @name copy
* @see clone
* @memberOf Traverse
*
* {@link https://github.com/the-grid/finitedomain/blob/master/src/solver.js#L750 qfox-clone}
* {@link https://github.com/lodash/lodash/blob/master/.internal/cloneRegExp.js lodash-clone-regexp}
*
* @param {*} src value to copy
* @return {*} copied
*
* @example
*
* copy(/eh/gmi) //=> new RegExp('eh', 'gmi')
* copy(new Error('eh')) //=> new Error with copied stack + msg
* copy([1]) //=> [1]
* copy({}) //=> {}
*
*/
module.exports = function copy(src) {
if (isObjNotNull(src)) {
var dst
// if (isPrimitive(src)) {
// if (isNullOrUndefined(src)) {
// dst = src
// }
// @TODO @IMPORTANT @FIXME @!IMPORTANT - COVER THIS OR NOT?
// for string value number boolean objects...
// if (isString(src)) {
// dst = src + ''
// }
// else if (isNumber(src)) {
// dst = src + 0
// }
// else if (isBoolean(src)) {
// dst = !!src
// }
// else
// lists... <- needs to have dot-prop support on Map/Set
// if (isMap(src)) {
// dst = new Map()
// const obj = reduce(src)
// // src.clear()
// ObjectKeys(obj).forEach(key => dst.set(key, obj[key]))
// return dst
// }
// else if (isSet(src)) {
// dst = new Set()
// // could clone here too
// const obj = toarr(src)
// // src.clear()
// obj.forEach(value => dst.add(value))
// return dst
// }
// ------
if (isArray(src)) {
dst = []
}
// @TODO also would just be isPrimitive
// was new date(src.getTime())
// || isBoolean(src) || isNumber(src) || isString(src)
else if (isDate(src)) {
dst = new src.constructor(src.valueOf())
}
else if (isRegExp(src)) {
// dst = new RegExp(src)
dst = newRegExp(src.src, src.toString().match(/[^/]*$/)[0])
// dst = new RegExp(src.src, src.toString().match(/[^/]*$/)[0])
dst.lastIndex = src.lastIndex
}
// @TODO this should just be handled by the next condition...
// else if (isError(src)) {
// dst = new Error(src.message)
// dst.stack = src.stack
// }
else {
dst = Object.create(Object.getPrototypeOf(src))
}
// @TODO: copy descriptor
// eslint-disable-next-line
for (var prop in src) {
dst[prop] = src
// const desc = Object.getOwnPropertyDescriptor(src, prop)
// Object.defineProperty(dst, prop, desc)
}
return dst
}
else {
if (ENV_DEBUG) {
console.log('is not obj', src)
}
return src
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29weS5qcyIsInNvdXJjZXMiOlsiY29weS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBpc09iak5vdE51bGwgPSByZXF1aXJlKCcuLi9pcy9vYmpOb3ROdWxsJylcbmNvbnN0IGlzUmVnRXhwID0gcmVxdWlyZSgnLi4vaXMvcmVnZXhwJylcbmNvbnN0IGlzRXJyb3IgPSByZXF1aXJlKCcuLi9pcy9lcnJvcicpXG5jb25zdCBpc0RhdGUgPSByZXF1aXJlKCcuLi9pcy9kYXRlJylcbmNvbnN0IGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pcy9hcnJheScpXG5jb25zdCBuZXdSZWdFeHAgPSByZXF1aXJlKCcuLi9jb25zdHJ1Y3QvcmVnZXhwJylcbmNvbnN0IEVOVl9ERUJVRyA9IHJlcXVpcmUoJy4uL2Vudi9kZWJ1ZycpXG5cbi8qIHByZXR0aWVyLWlnbm9yZSAqL1xuLyoqXG4gKiBAZGVzYyBjb3B5IGFueSBwcmltaXRpdmUgdmFsdWUsIHBhcnQgb2YgY2xvbmVcbiAqIEB2ZXJzaW9uIDUuMC4wXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBuYW1lIGNvcHlcbiAqIEBzZWUgY2xvbmVcbiAqIEBtZW1iZXJPZiBUcmF2ZXJzZVxuICpcbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vdGhlLWdyaWQvZmluaXRlZG9tYWluL2Jsb2IvbWFzdGVyL3NyYy9zb2x2ZXIuanMjTDc1MCBxZm94LWNsb25lfVxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoL2Jsb2IvbWFzdGVyLy5pbnRlcm5hbC9jbG9uZVJlZ0V4cC5qcyBsb2Rhc2gtY2xvbmUtcmVnZXhwfVxuICpcbiAqIEBwYXJhbSAgeyp9IHNyYyB2YWx1ZSB0byBjb3B5XG4gKiBAcmV0dXJuIHsqfSBjb3BpZWRcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgIGNvcHkoL2VoL2dtaSkgLy89PiBuZXcgUmVnRXhwKCdlaCcsICdnbWknKVxuICogICAgY29weShuZXcgRXJyb3IoJ2VoJykpIC8vPT4gbmV3IEVycm9yIHdpdGggY29waWVkIHN0YWNrICsgbXNnXG4gKiAgICBjb3B5KFsxXSkgLy89PiBbMV1cbiAqICAgIGNvcHkoe30pIC8vPT4ge31cbiAqXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY29weShzcmMpIHtcbiAgaWYgKGlzT2JqTm90TnVsbChzcmMpKSB7XG4gICAgbGV0IGRzdFxuXG4gICAgLy8gaWYgKGlzUHJpbWl0aXZlKHNyYykpIHtcbiAgICAvLyBpZiAoaXNOdWxsT3JVbmRlZmluZWQoc3JjKSkge1xuICAgIC8vICAgZHN0ID0gc3JjXG4gICAgLy8gfVxuXG4gICAgLy8gQFRPRE8gQElNUE9SVEFOVCBARklYTUUgQCFJTVBPUlRBTlQgLSBDT1ZFUiBUSElTIE9SIE5PVD9cbiAgICAvLyBmb3Igc3RyaW5nIHZhbHVlIG51bWJlciBib29sZWFuIG9iamVjdHMuLi5cbiAgICAvLyBpZiAoaXNTdHJpbmcoc3JjKSkge1xuICAgIC8vICAgZHN0ID0gc3JjICsgJydcbiAgICAvLyB9XG4gICAgLy8gZWxzZSBpZiAoaXNOdW1iZXIoc3JjKSkge1xuICAgIC8vICAgZHN0ID0gc3JjICsgMFxuICAgIC8vIH1cbiAgICAvLyBlbHNlIGlmIChpc0Jvb2xlYW4oc3JjKSkge1xuICAgIC8vICAgZHN0ID0gISFzcmNcbiAgICAvLyB9XG4gICAgLy8gZWxzZVxuXG4gICAgLy8gbGlzdHMuLi4gPC0gbmVlZHMgdG8gaGF2ZSBkb3QtcHJvcCBzdXBwb3J0IG9uIE1hcC9TZXRcbiAgICAvLyBpZiAoaXNNYXAoc3JjKSkge1xuICAgIC8vICAgZHN0ID0gbmV3IE1hcCgpXG4gICAgLy8gICBjb25zdCBvYmogPSByZWR1Y2Uoc3JjKVxuICAgIC8vICAgLy8gc3JjLmNsZWFyKClcbiAgICAvLyAgIE9iamVjdEtleXMob2JqKS5mb3JFYWNoKGtleSA9PiBkc3Quc2V0KGtleSwgb2JqW2tleV0pKVxuICAgIC8vICAgcmV0dXJuIGRzdFxuICAgIC8vIH1cbiAgICAvLyBlbHNlIGlmIChpc1NldChzcmMpKSB7XG4gICAgLy8gICBkc3QgPSBuZXcgU2V0KClcbiAgICAvLyAgIC8vIGNvdWxkIGNsb25lIGhlcmUgdG9vXG4gICAgLy8gICBjb25zdCBvYmogPSB0b2FycihzcmMpXG4gICAgLy8gICAvLyBzcmMuY2xlYXIoKVxuICAgIC8vICAgb2JqLmZvckVhY2godmFsdWUgPT4gZHN0LmFkZCh2YWx1ZSkpXG4gICAgLy8gICByZXR1cm4gZHN0XG4gICAgLy8gfVxuXG4gICAgLy8gLS0tLS0tXG4gICAgaWYgKGlzQXJyYXkoc3JjKSkge1xuICAgICAgZHN0ID0gW11cbiAgICB9XG4gICAgLy8gQFRPRE8gYWxzbyB3b3VsZCBqdXN0IGJlIGlzUHJpbWl0aXZlXG4gICAgLy8gd2FzIG5ldyBkYXRlKHNyYy5nZXRUaW1lKCkpXG4gICAgLy8gfHwgaXNCb29sZWFuKHNyYykgfHwgaXNOdW1iZXIoc3JjKSB8fCBpc1N0cmluZyhzcmMpXG4gICAgZWxzZSBpZiAoaXNEYXRlKHNyYykpIHtcbiAgICAgIGRzdCA9IG5ldyBzcmMuY29uc3RydWN0b3Ioc3JjLnZhbHVlT2YoKSlcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNSZWdFeHAoc3JjKSkge1xuICAgICAgLy8gZHN0ID0gbmV3IFJlZ0V4cChzcmMpXG4gICAgICBkc3QgPSBuZXdSZWdFeHAoc3JjLnNyYywgc3JjLnRvU3RyaW5nKCkubWF0Y2goL1teL10qJC8pWzBdKVxuICAgICAgLy8gZHN0ID0gbmV3IFJlZ0V4cChzcmMuc3JjLCBzcmMudG9TdHJpbmcoKS5tYXRjaCgvW14vXSokLylbMF0pXG4gICAgICBkc3QubGFzdEluZGV4ID0gc3JjLmxhc3RJbmRleFxuICAgIH1cbiAgICAvLyBAVE9ETyB0aGlzIHNob3VsZCBqdXN0IGJlIGhhbmRsZWQgYnkgdGhlIG5leHQgY29uZGl0aW9uLi4uXG4gICAgLy8gZWxzZSBpZiAoaXNFcnJvcihzcmMpKSB7XG4gICAgLy8gICBkc3QgPSBuZXcgRXJyb3Ioc3JjLm1lc3NhZ2UpXG4gICAgLy8gICBkc3Quc3RhY2sgPSBzcmMuc3RhY2tcbiAgICAvLyB9XG4gICAgZWxzZSB7XG4gICAgICBkc3QgPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihzcmMpKVxuICAgIH1cblxuICAgIC8vIEBUT0RPOiBjb3B5IGRlc2NyaXB0b3JcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICBmb3IgKHZhciBwcm9wIGluIHNyYykge1xuICAgICAgZHN0W3Byb3BdID0gc3JjXG4gICAgICAvLyBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzcmMsIHByb3ApXG4gICAgICAvLyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZHN0LCBwcm9wLCBkZXNjKVxuICAgIH1cbiAgICByZXR1cm4gZHN0XG4gIH1cbiAgZWxzZSB7XG4gICAgaWYgKEVOVl9ERUJVRykge1xuICAgICAgY29uc29sZS5sb2coJ2lzIG5vdCBvYmonLCBzcmMpXG4gICAgfVxuICAgIHJldHVybiBzcmNcbiAgfVxufVxuIl0sIm5hbWVzIjpbImNvbnN0IiwibGV0Il0sIm1hcHBpbmdzIjoiQUFBQUEsR0FBSyxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUM7QUFDaERBLEdBQUssQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztBQUN4Q0EsR0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO0FBQ3RDQSxHQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7QUFDcENBLEdBQUssQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztBQUN0Q0EsR0FBSyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMscUJBQXFCLENBQUM7QUFDaERBLEdBQUssQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlCekMsTUFBTSxDQUFDLE9BQU8sR0FBRyxTQUFTLElBQUksQ0FBQyxHQUFHLEVBQUU7RUFDbEMsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUU7SUFDckJDLEdBQUcsQ0FBQyxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXNDUCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtNQUNoQixHQUFHLEdBQUcsRUFBRTtLQUNUOzs7O1NBSUksSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7TUFDcEIsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDekM7U0FDSSxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTs7TUFFdEIsR0FBRyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O01BRTNELEdBQUcsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLFNBQVM7S0FDOUI7Ozs7OztTQU1JO01BQ0gsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNoRDs7OztJQUlELEtBQUssSUFBSSxJQUFJLElBQUksR0FBRyxFQUFFO01BQ3BCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHOzs7S0FHaEI7SUFDRCxPQUFPLEdBQUc7R0FDWDtPQUNJO0lBQ0gsSUFBSSxTQUFTLEVBQUU7TUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUM7S0FDL0I7SUFDRCxPQUFPLEdBQUc7R0FDWDtDQUNGOyJ9