@indielayer/ui
Version:
Indielayer UI Components with Tailwind CSS build for Vue 3
94 lines (78 loc) • 2.21 kB
text/typescript
import { unref, isRef } from 'vue'
export const isObject = (val: unknown): val is object => val !== null && typeof val === 'object'
export const isArray = (val: unknown): val is [] => Array.isArray(val)
// eslint-disable-next-line @typescript-eslint/ban-types
export const isFunction = (val: unknown): val is Function => typeof val === 'function'
/**
* Deeply unref a value, recursing into objects and arrays.
*
* @param {Mixed} val - The value to deeply unref.
* @return {Mixed}
*/
export const deepUnref = (val: any) => {
const checkedVal = isRef(val) ? unref(val) : val
if (!isObject(checkedVal)) {
return checkedVal
}
if (isArray(checkedVal)) {
return unrefArray(checkedVal)
}
return unrefObject(checkedVal)
}
/**
* Unref a value, recursing into it if it's an object.
*
* @param {Mixed} val - The value to unref.
* @return {Mixed}
*/
export const smartUnref = (val: any) => {
// Non-ref object? Go deeper!
if (val !== null && !isRef(val) && typeof val === 'object') {
return deepUnref(val)
}
return unref(val)
}
/**
* Unref an array, recursively.
*
* @param {Array} arr - The array to unref.
* @return {Array}
*/
export const unrefArray: any = (arr: []) => arr.map(smartUnref)
/**
* Unref an object, recursively.
*
* @param {Object} obj - The object to unref.
* @return {Object}
*/
export const unrefObject = (obj: any) => {
const unreffed: any = {}
// Object? un-ref it!
Object.keys(obj).forEach((key) => {
unreffed[key] = smartUnref(obj[key])
})
return unreffed
}
/**
* Merge two objects, deeply.
* @param {Object} source - The source object.
* @param {Object} target - The target object.
* @return {Object}
*/
export const mergeRightDeep = (source: any = {}, target: any = {}) => {
const sourceKeys = Object.keys(source)
const targetKeys = Object.keys(target)
const merged = { ...source }
targetKeys.forEach((key) => {
if (sourceKeys.includes(key)) {
if (isObject(source[key]) && isObject(target[key])) {
merged[key] = mergeRightDeep(source[key], target[key])
} else {
merged[key] = target[key]
}
} else {
merged[key] = target[key]
}
})
return merged
}