mihawk
Version:
A tiny & simple mock server tool, support json,js,cjs,ts(typescript).
90 lines (89 loc) • 4.05 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createReadonlyProxy = exports.deepFreeze = exports.delNillProps = void 0;
const color_cc_1 = __importDefault(require("color-cc"));
function delNillProps(obj) {
if (obj && typeof obj === 'object') {
Object.entries(obj).forEach(([k, v]) => {
if (v === null || v === undefined) {
delete obj[k];
}
});
}
}
exports.delNillProps = delNillProps;
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);
}
});
}
}
exports.deepFreeze = deepFreeze;
function createReadonlyProxy(obj, logFlag) {
if (!obj) {
return obj;
}
function _createProxy(target) {
var _a;
if (typeof target === 'object' && target !== null) {
if (((_a = Array.isArray) === null || _a === void 0 ? void 0 : _a.call(Array, 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, color_cc_1.default.warn(`Modifying array property "${String(prop)}" is not allowed!`));
return false;
},
deleteProperty: function (target, prop) {
console.warn(logFlag, color_cc_1.default.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, color_cc_1.default.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, color_cc_1.default.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, color_cc_1.default.warn(`Modifying the readonly property "${prop}" is not allowed!`));
return false;
},
deleteProperty: function (target, prop) {
console.warn(logFlag, color_cc_1.default.warn(`Deleting the readonly property "${prop}" is not allowed!`));
return false;
},
});
}
}
else {
return target;
}
}
return _createProxy(obj);
}
exports.createReadonlyProxy = createReadonlyProxy;