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