mihawk
Version:
A tiny & simple mock server tool, support json,js,cjs,ts(typescript).
81 lines (80 loc) • 3.49 kB
JavaScript
;
import Colors from 'color-cc';
export function delNillProps(obj) {
if (obj && typeof obj === 'object') {
Object.entries(obj).forEach(([k, v]) => {
if (v === null || v === undefined) {
delete obj[k];
}
});
}
}
export function deepFreeze(obj) {
if (obj) {
Object.freeze(obj);
Object.getOwnPropertyNames(obj).forEach(prop => {
const value = obj[prop];
if (value && typeof value === 'object' && !(value instanceof RegExp)) {
deepFreeze(value);
}
});
}
}
export function createReadonlyProxy(obj, logFlag) {
if (!obj) {
return obj;
}
function _createProxy(target) {
if (typeof target === 'object' && target !== null) {
if (Array.isArray?.(target) || target instanceof Array) {
return new Proxy(target, {
get: function (target, prop, receiver) {
if (typeof prop === 'symbol' || prop === 'length' || prop === 'constructor') {
return Reflect.get(target, prop, receiver);
}
return _createProxy(Reflect.get(target, prop, receiver));
},
set: function (target, prop, value, receiver) {
console.warn(logFlag, Colors.warn(`Modifying array property "${String(prop)}" is not allowed!`));
return false;
},
deleteProperty: function (target, prop) {
console.warn(logFlag, Colors.warn(`Deleting array property "${String(prop)}" is not allowed!`));
return false;
},
apply: function (target, thisArg, argList) {
const methodName = Reflect.get(this, 'key');
const forbiddenMethods = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'];
if (forbiddenMethods.includes(methodName)) {
console.warn(logFlag, Colors.warn(`Modifying the readonly array property is not allowed! Don't use method ${methodName}`));
return false;
}
return Reflect.apply(target, thisArg, argList);
},
});
}
else {
return new Proxy(target, {
get: function (target, prop, receiver) {
if (!(prop in target)) {
console.warn(logFlag, Colors.yellow(`Property "${prop}" doesn't exist on the object!`));
}
return _createProxy(Reflect.get(target, prop, receiver));
},
set: function (target, prop, value, receiver) {
console.warn(logFlag, Colors.warn(`Modifying the readonly property "${prop}" is not allowed!`));
return false;
},
deleteProperty: function (target, prop) {
console.warn(logFlag, Colors.warn(`Deleting the readonly property "${prop}" is not allowed!`));
return false;
},
});
}
}
else {
return target;
}
}
return _createProxy(obj);
}