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