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.
		
		
		
		
		
			
		
			
				
					192 lines
				
				5.5 KiB
			
		
		
			
		
	
	
					192 lines
				
				5.5 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict'
							 | 
						||
| 
								 | 
							
								module.exports = rfdc
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function copyBuffer (cur) {
							 | 
						||
| 
								 | 
							
								  if (cur instanceof Buffer) {
							 | 
						||
| 
								 | 
							
								    return Buffer.from(cur)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return new cur.constructor(cur.buffer.slice(), cur.byteOffset, cur.length)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function rfdc (opts) {
							 | 
						||
| 
								 | 
							
								  opts = opts || {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (opts.circles) return rfdcCircles(opts)
							 | 
						||
| 
								 | 
							
								  return opts.proto ? cloneProto : clone
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function cloneArray (a, fn) {
							 | 
						||
| 
								 | 
							
								    var keys = Object.keys(a)
							 | 
						||
| 
								 | 
							
								    var a2 = new Array(keys.length)
							 | 
						||
| 
								 | 
							
								    for (var i = 0; i < keys.length; i++) {
							 | 
						||
| 
								 | 
							
								      var k = keys[i]
							 | 
						||
| 
								 | 
							
								      var cur = a[k]
							 | 
						||
| 
								 | 
							
								      if (typeof cur !== 'object' || cur === null) {
							 | 
						||
| 
								 | 
							
								        a2[k] = cur
							 | 
						||
| 
								 | 
							
								      } else if (cur instanceof Date) {
							 | 
						||
| 
								 | 
							
								        a2[k] = new Date(cur)
							 | 
						||
| 
								 | 
							
								      } else if (ArrayBuffer.isView(cur)) {
							 | 
						||
| 
								 | 
							
								        a2[k] = copyBuffer(cur)
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        a2[k] = fn(cur)
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return a2
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function clone (o) {
							 | 
						||
| 
								 | 
							
								    if (typeof o !== 'object' || o === null) return o
							 | 
						||
| 
								 | 
							
								    if (o instanceof Date) return new Date(o)
							 | 
						||
| 
								 | 
							
								    if (Array.isArray(o)) return cloneArray(o, clone)
							 | 
						||
| 
								 | 
							
								    if (o instanceof Map) return new Map(cloneArray(Array.from(o), clone))
							 | 
						||
| 
								 | 
							
								    if (o instanceof Set) return new Set(cloneArray(Array.from(o), clone))
							 | 
						||
| 
								 | 
							
								    var o2 = {}
							 | 
						||
| 
								 | 
							
								    for (var k in o) {
							 | 
						||
| 
								 | 
							
								      if (Object.hasOwnProperty.call(o, k) === false) continue
							 | 
						||
| 
								 | 
							
								      var cur = o[k]
							 | 
						||
| 
								 | 
							
								      if (typeof cur !== 'object' || cur === null) {
							 | 
						||
| 
								 | 
							
								        o2[k] = cur
							 | 
						||
| 
								 | 
							
								      } else if (cur instanceof Date) {
							 | 
						||
| 
								 | 
							
								        o2[k] = new Date(cur)
							 | 
						||
| 
								 | 
							
								      } else if (cur instanceof Map) {
							 | 
						||
| 
								 | 
							
								        o2[k] = new Map(cloneArray(Array.from(cur), clone))
							 | 
						||
| 
								 | 
							
								      } else if (cur instanceof Set) {
							 | 
						||
| 
								 | 
							
								        o2[k] = new Set(cloneArray(Array.from(cur), clone))
							 | 
						||
| 
								 | 
							
								      } else if (ArrayBuffer.isView(cur)) {
							 | 
						||
| 
								 | 
							
								        o2[k] = copyBuffer(cur)
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        o2[k] = clone(cur)
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return o2
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function cloneProto (o) {
							 | 
						||
| 
								 | 
							
								    if (typeof o !== 'object' || o === null) return o
							 | 
						||
| 
								 | 
							
								    if (o instanceof Date) return new Date(o)
							 | 
						||
| 
								 | 
							
								    if (Array.isArray(o)) return cloneArray(o, cloneProto)
							 | 
						||
| 
								 | 
							
								    if (o instanceof Map) return new Map(cloneArray(Array.from(o), cloneProto))
							 | 
						||
| 
								 | 
							
								    if (o instanceof Set) return new Set(cloneArray(Array.from(o), cloneProto))
							 | 
						||
| 
								 | 
							
								    var o2 = {}
							 | 
						||
| 
								 | 
							
								    for (var k in o) {
							 | 
						||
| 
								 | 
							
								      var cur = o[k]
							 | 
						||
| 
								 | 
							
								      if (typeof cur !== 'object' || cur === null) {
							 | 
						||
| 
								 | 
							
								        o2[k] = cur
							 | 
						||
| 
								 | 
							
								      } else if (cur instanceof Date) {
							 | 
						||
| 
								 | 
							
								        o2[k] = new Date(cur)
							 | 
						||
| 
								 | 
							
								      } else if (cur instanceof Map) {
							 | 
						||
| 
								 | 
							
								        o2[k] = new Map(cloneArray(Array.from(cur), cloneProto))
							 | 
						||
| 
								 | 
							
								      } else if (cur instanceof Set) {
							 | 
						||
| 
								 | 
							
								        o2[k] = new Set(cloneArray(Array.from(cur), cloneProto))
							 | 
						||
| 
								 | 
							
								      } else if (ArrayBuffer.isView(cur)) {
							 | 
						||
| 
								 | 
							
								        o2[k] = copyBuffer(cur)
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        o2[k] = cloneProto(cur)
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return o2
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function rfdcCircles (opts) {
							 | 
						||
| 
								 | 
							
								  var refs = []
							 | 
						||
| 
								 | 
							
								  var refsNew = []
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return opts.proto ? cloneProto : clone
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function cloneArray (a, fn) {
							 | 
						||
| 
								 | 
							
								    var keys = Object.keys(a)
							 | 
						||
| 
								 | 
							
								    var a2 = new Array(keys.length)
							 | 
						||
| 
								 | 
							
								    for (var i = 0; i < keys.length; i++) {
							 | 
						||
| 
								 | 
							
								      var k = keys[i]
							 | 
						||
| 
								 | 
							
								      var cur = a[k]
							 | 
						||
| 
								 | 
							
								      if (typeof cur !== 'object' || cur === null) {
							 | 
						||
| 
								 | 
							
								        a2[k] = cur
							 | 
						||
| 
								 | 
							
								      } else if (cur instanceof Date) {
							 | 
						||
| 
								 | 
							
								        a2[k] = new Date(cur)
							 | 
						||
| 
								 | 
							
								      } else if (ArrayBuffer.isView(cur)) {
							 | 
						||
| 
								 | 
							
								        a2[k] = copyBuffer(cur)
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        var index = refs.indexOf(cur)
							 | 
						||
| 
								 | 
							
								        if (index !== -1) {
							 | 
						||
| 
								 | 
							
								          a2[k] = refsNew[index]
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								          a2[k] = fn(cur)
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return a2
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function clone (o) {
							 | 
						||
| 
								 | 
							
								    if (typeof o !== 'object' || o === null) return o
							 | 
						||
| 
								 | 
							
								    if (o instanceof Date) return new Date(o)
							 | 
						||
| 
								 | 
							
								    if (Array.isArray(o)) return cloneArray(o, clone)
							 | 
						||
| 
								 | 
							
								    if (o instanceof Map) return new Map(cloneArray(Array.from(o), clone))
							 | 
						||
| 
								 | 
							
								    if (o instanceof Set) return new Set(cloneArray(Array.from(o), clone))
							 | 
						||
| 
								 | 
							
								    var o2 = {}
							 | 
						||
| 
								 | 
							
								    refs.push(o)
							 | 
						||
| 
								 | 
							
								    refsNew.push(o2)
							 | 
						||
| 
								 | 
							
								    for (var k in o) {
							 | 
						||
| 
								 | 
							
								      if (Object.hasOwnProperty.call(o, k) === false) continue
							 | 
						||
| 
								 | 
							
								      var cur = o[k]
							 | 
						||
| 
								 | 
							
								      if (typeof cur !== 'object' || cur === null) {
							 | 
						||
| 
								 | 
							
								        o2[k] = cur
							 | 
						||
| 
								 | 
							
								      } else if (cur instanceof Date) {
							 | 
						||
| 
								 | 
							
								        o2[k] = new Date(cur)
							 | 
						||
| 
								 | 
							
								      } else if (cur instanceof Map) {
							 | 
						||
| 
								 | 
							
								        o2[k] = new Map(cloneArray(Array.from(cur), clone))
							 | 
						||
| 
								 | 
							
								      } else if (cur instanceof Set) {
							 | 
						||
| 
								 | 
							
								        o2[k] = new Set(cloneArray(Array.from(cur), clone))
							 | 
						||
| 
								 | 
							
								      } else if (ArrayBuffer.isView(cur)) {
							 | 
						||
| 
								 | 
							
								        o2[k] = copyBuffer(cur)
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        var i = refs.indexOf(cur)
							 | 
						||
| 
								 | 
							
								        if (i !== -1) {
							 | 
						||
| 
								 | 
							
								          o2[k] = refsNew[i]
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								          o2[k] = clone(cur)
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    refs.pop()
							 | 
						||
| 
								 | 
							
								    refsNew.pop()
							 | 
						||
| 
								 | 
							
								    return o2
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function cloneProto (o) {
							 | 
						||
| 
								 | 
							
								    if (typeof o !== 'object' || o === null) return o
							 | 
						||
| 
								 | 
							
								    if (o instanceof Date) return new Date(o)
							 | 
						||
| 
								 | 
							
								    if (Array.isArray(o)) return cloneArray(o, cloneProto)
							 | 
						||
| 
								 | 
							
								    if (o instanceof Map) return new Map(cloneArray(Array.from(o), cloneProto))
							 | 
						||
| 
								 | 
							
								    if (o instanceof Set) return new Set(cloneArray(Array.from(o), cloneProto))
							 | 
						||
| 
								 | 
							
								    var o2 = {}
							 | 
						||
| 
								 | 
							
								    refs.push(o)
							 | 
						||
| 
								 | 
							
								    refsNew.push(o2)
							 | 
						||
| 
								 | 
							
								    for (var k in o) {
							 | 
						||
| 
								 | 
							
								      var cur = o[k]
							 | 
						||
| 
								 | 
							
								      if (typeof cur !== 'object' || cur === null) {
							 | 
						||
| 
								 | 
							
								        o2[k] = cur
							 | 
						||
| 
								 | 
							
								      } else if (cur instanceof Date) {
							 | 
						||
| 
								 | 
							
								        o2[k] = new Date(cur)
							 | 
						||
| 
								 | 
							
								      } else if (cur instanceof Map) {
							 | 
						||
| 
								 | 
							
								        o2[k] = new Map(cloneArray(Array.from(cur), cloneProto))
							 | 
						||
| 
								 | 
							
								      } else if (cur instanceof Set) {
							 | 
						||
| 
								 | 
							
								        o2[k] = new Set(cloneArray(Array.from(cur), cloneProto))
							 | 
						||
| 
								 | 
							
								      } else if (ArrayBuffer.isView(cur)) {
							 | 
						||
| 
								 | 
							
								        o2[k] = copyBuffer(cur)
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        var i = refs.indexOf(cur)
							 | 
						||
| 
								 | 
							
								        if (i !== -1) {
							 | 
						||
| 
								 | 
							
								          o2[k] = refsNew[i]
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								          o2[k] = cloneProto(cur)
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    refs.pop()
							 | 
						||
| 
								 | 
							
								    refsNew.pop()
							 | 
						||
| 
								 | 
							
								    return o2
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |