UNPKG

@teqfw/core

Version:

Core functionalities for plugin scanning, local configuration management, and command-line utilities for building modern web applications with the Tequila Framework.

176 lines (161 loc) 4.79 kB
/** * Utility functions to analyze data. * @namespace TeqFw_Core_Shared_Util_Probe */ // DEFINE WORKING VARS const NS = 'TeqFw_Core_Shared_Util_Probe'; /** * Deep clone of the original object. * @param {Object} orig * @returns {Object} * @memberOf TeqFw_Core_Shared_Util_Probe * @deprecated use TeqFw_Core_Shared_Util_Cast.castObject * TODO: remove it after 2024/06/01 (still used in the RA project) */ function deepClone(orig) { return JSON.parse(JSON.stringify(orig)); } /** * Compare two variables for equivalence. * * https://stackoverflow.com/a/45683145/4073821 * * @param {*} obj1 * @param {*} obj2 * @returns {boolean} * @memberOf TeqFw_Core_Shared_Util_Probe * @deprecated use TeqFw_Core_Shared_Util_Deep */ function deepEqual(obj1, obj2) { let res; if (obj1 === obj2) res = true; else if (isPrimitive(obj1) && isPrimitive(obj2)) res = (obj1 === obj2); else if ((obj1 === undefined) || (obj2 === undefined)) res = false; else if ((obj1 === null) || (obj2 === null)) res = false; else if (Object.keys(obj1).length !== Object.keys(obj2).length) res = false; else if (Array.isArray(obj1) && Array.isArray(obj2)) { res = true; for (let key in obj1) { if (!deepEqual(obj1[key], obj2[key])) { res = false; break; } } } else { res = true; // compare objects with same number of keys for (let key in obj1) { if (!(key in obj2)) { res = false; //other object doesn't have this prop break; } if (!deepEqual(obj1[key], obj2[key])) { res = false; break; } } } return res; } /** * Example from MDN. * @param {Object} obj * @returns {Object} * @memberOf TeqFw_Core_Shared_Util_Probe * @deprecated use TeqFw_Core_Shared_Util_Deep */ function deepFreeze(obj) { const propNames = Reflect.ownKeys(obj); for (const name of propNames) { const value = obj[name]; if ((value && typeof value === 'object') || typeof value === 'function') deepFreeze(value); } return Object.freeze(obj); } /** * Deep merge of the 2 objects. * Source: https://gist.github.com/ahtcx/0cd94e62691f539160b32ecda18af3d6#gistcomment-2930530 * * @param {Object} target * @param {Object} source * @returns {Object} * @memberOf TeqFw_Core_Shared_Util_Probe * @deprecated use TeqFw_Core_Shared_Util_Deep */ function deepMerge(target, source) { const isObject = (obj) => obj && typeof obj === 'object'; if (!isObject(target) || !isObject(source)) { return source; } Object.keys(source).forEach(key => { const targetValue = target[key]; const sourceValue = source[key]; if (Array.isArray(targetValue) && Array.isArray(sourceValue)) { target[key] = targetValue.concat(sourceValue); } else if (isObject(targetValue) && isObject(sourceValue)) { target[key] = deepMerge(Object.assign({}, targetValue), sourceValue); } else { target[key] = sourceValue; } }); return target; } /** * Return 'true' if `val` is empty. * @param {*} val * @returns {boolean} * @memberOf TeqFw_Core_Shared_Util_Probe */ function isEmpty(val) { return (val === undefined) || (val === null) || (val === ''); } /** * Return 'true' if `val` is Object (not array, function, null). * @param {*} val * @returns {boolean} * @memberOf TeqFw_Core_Shared_Util_Probe */ function isObject(val) { return ( (typeof val === 'object') && (!Array.isArray(val)) && (val !== null) ); } /** * Check if value is primitive. * @param {*} obj * @returns {boolean} * @memberOf TeqFw_Core_Shared_Util_Probe */ function isPrimitive(obj) { return (obj !== Object(obj)); } /** * Make object serializable (convert Proxy to clear Object). * @param {Object} obj * @returns {Object} * @memberOf TeqFw_Core_Shared_Util_Probe */ function serializable(obj) { return JSON.parse(JSON.stringify(obj)); } // finalize code components for this es6-module Object.defineProperty(deepClone, 'namespace', {value: NS}); Object.defineProperty(deepEqual, 'namespace', {value: NS}); Object.defineProperty(deepFreeze, 'namespace', {value: NS}); Object.defineProperty(deepMerge, 'namespace', {value: NS}); Object.defineProperty(isEmpty, 'namespace', {value: NS}); Object.defineProperty(isObject, 'namespace', {value: NS}); Object.defineProperty(isPrimitive, 'namespace', {value: NS}); Object.defineProperty(serializable, 'namespace', {value: NS}); export { deepClone, deepEqual, deepFreeze, deepMerge, isEmpty, isObject, isPrimitive, serializable, };