nowjs-core
Version:
NowCanDo Javascript Core [nowjs-core] is a library written by TypeScript code maintains under Apache 2.0 licence
103 lines (102 loc) • 3.27 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
require("reflect-metadata");
const formatMetadataKey = Symbol('format');
function deprecated(message = 'Function {name} is deprecated.') {
return (instance, name, descriptor) => {
const original = descriptor.value;
const localMessage = message.replace('{name}', name);
descriptor.value = (...args) => {
console.warn(localMessage);
return original.apply(instance, args);
};
return descriptor;
};
}
exports.deprecated = deprecated;
function deprecateInNextVersion(message = 'Function {name} is deprecate in next version.') {
return (instance, name, descriptor) => {
const original = descriptor.value;
const localMessage = message.replace('{name}', name);
descriptor.value = (...args) => {
console.warn(localMessage);
return original.apply(instance, args);
};
return descriptor;
};
}
exports.deprecateInNextVersion = deprecateInNextVersion;
function readonly(Target) {
const newConstructor = () => {
Target.apply(this);
Object.freeze(this);
};
newConstructor.prototype = Object.create(Target.prototype);
newConstructor.prototype.constructor = Target;
return newConstructor;
}
exports.readonly = readonly;
function timeout(milliseconds = 0) {
return (target, propertyKey, descriptor) => {
const originalMethod = descriptor.value;
descriptor.value = (...args) => {
setTimeout(() => {
originalMethod.apply(this, args);
}, milliseconds);
};
return descriptor;
};
}
exports.timeout = timeout;
function logProperty(target, key) {
let value = target[key];
const getter = () => {
console.log(`Get => ${key}`);
return value;
};
const setter = (newVal) => {
console.log(`Set: ${key} => ${newVal}`);
value = newVal;
};
if (delete target[key]) {
Object.defineProperty(target, key, {
get: getter,
set: setter,
enumerable: true,
configurable: true,
});
}
}
exports.logProperty = logProperty;
function sealed(constructor) {
Object.seal(constructor);
Object.seal(constructor.prototype);
}
exports.sealed = sealed;
function enumerable(value) {
return (target, propertyKey, descriptor) => {
descriptor.enumerable = value;
};
}
exports.enumerable = enumerable;
function configurable(value) {
return (target, propertyKey, descriptor) => {
descriptor.configurable = value;
};
}
exports.configurable = configurable;
function format(formatString) {
return Reflect.metadata(formatMetadataKey, formatString);
}
exports.format = format;
function getFormat(target, propertyKey) {
return Reflect.getMetadata(formatMetadataKey, target, propertyKey);
}
exports.getFormat = getFormat;
function override(instance, name, descriptor) {
const baseType = Object.getPrototypeOf(instance);
if (typeof baseType[name] !== 'function') {
throw new Error('Method ' + name + ' of ' + instance.constructor.name + ' does not override any base class method.');
}
}
exports.override = override;