UNPKG

mihawk

Version:

A tiny & simple mock server tool, support json,js,cjs,ts(typescript).

81 lines (80 loc) 3.49 kB
'use strict'; 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); }