packages/shared/src/clone.ts (68 lines of code) (raw):
import { isFn, isPlainObj } from './checkers'
export const shallowClone = (values: any) => {
if (Array.isArray(values)) {
return values.slice(0)
} else if (isPlainObj(values)) {
if ('$$typeof' in values && '_owner' in values) {
return values
}
if (values['_isBigNumber']) {
return values
}
if (values['_isAMomentObject']) {
return values
}
if (values['_isJSONSchemaObject']) {
return values
}
if (isFn(values['toJS'])) {
return values
}
if (isFn(values['toJSON'])) {
return values
}
return {
...values,
}
} else if (typeof values === 'object') {
return new values.constructor(values)
}
return values
}
export const clone = (values: any) => {
if (Array.isArray(values)) {
const res = []
values.forEach((item) => {
res.push(clone(item))
})
return res
} else if (isPlainObj(values)) {
if ('$$typeof' in values && '_owner' in values) {
return values
}
if (values['_isBigNumber']) {
return values
}
if (values['_isAMomentObject']) {
return values
}
if (values['_isJSONSchemaObject']) {
return values
}
if (isFn(values['toJS'])) {
return values['toJS']()
}
if (isFn(values['toJSON'])) {
return values['toJSON']()
}
const res = {}
for (const key in values) {
if (Object.hasOwnProperty.call(values, key)) {
res[key] = clone(values[key])
}
}
return res
} else {
return values
}
}