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 | ||
|  |   } | ||
|  | } |