@zerooneit/expressive-tea
Version:
A REST API over Express and Typescript
285 lines (284 loc) • 6.67 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.isAsyncFunction = exports.prototypeOf = exports.descriptorOf = exports.nameOfSymbol = exports.nameOfClass = exports.nameOf = exports.ancestorsOf = exports.getInheritedClass = exports.isPromise = exports.isEmpty = exports.isClass = exports.isObject = exports.isDate = exports.isCollection = exports.isArrayOrArrayClass = exports.isArray = exports.isBoolean = exports.isNumber = exports.isString = exports.primitiveOf = exports.isPrimitiveOrPrimitiveClass = exports.getClassOrSymbol = exports.classOf = exports.getClass = exports.getConstructor = void 0;
/* istanbul ignore file */
/**
* Get the provide constructor.
* @param targetClass
* @ignore
*/
const getConstructor = (targetClass) => typeof targetClass === 'function' ? targetClass : targetClass.constructor;
exports.getConstructor = getConstructor;
/**
* Get the provide constructor if target is an instance.
* @param target
* @returns {*}
* @ignore
*/
function getClass(target) {
return target.prototype ? target : target.constructor;
}
exports.getClass = getClass;
/**
* Get the provide constructor if target is an instance.
* @param target
* @returns {*}
* @alias getClass
* @ignore
*/
function classOf(target) {
return getClass(target);
}
exports.classOf = classOf;
/**
*
* @param target
* @returns {symbol}
* @ignore
*/
function getClassOrSymbol(target) {
return typeof target === 'symbol' ? target : getClass(target);
}
exports.getClassOrSymbol = getClassOrSymbol;
/**
* Return true if the given obj is a primitive.
* @param target
* @returns {boolean}
* @ignore
*/
function isPrimitiveOrPrimitiveClass(target) {
return isString(target) || isNumber(target) || isBoolean(target);
}
exports.isPrimitiveOrPrimitiveClass = isPrimitiveOrPrimitiveClass;
/**
*
* @param target
* @returns {"string" | "number" | "boolean" | "any"}
* @ignore
*/
function primitiveOf(target) {
if (isString(target)) {
return 'string';
}
if (isNumber(target)) {
return 'number';
}
if (isBoolean(target)) {
return 'boolean';
}
return 'any';
}
exports.primitiveOf = primitiveOf;
/**
*
* @param target
* @returns {boolean}
* @ignore
*/
function isString(target) {
return checkType(target, 'string', String);
}
exports.isString = isString;
/**
*
* @param target
* @returns {boolean}
* @ignore
*/
function isNumber(target) {
return checkType(target, 'number', Number);
}
exports.isNumber = isNumber;
/**
*
* @param target
* @returns {boolean}
* @ignore
*/
function isBoolean(target) {
return checkType(target, 'boolean', Boolean);
}
exports.isBoolean = isBoolean;
function checkType(target, type, TypeClass) {
return typeof target === type || target instanceof TypeClass || target === TypeClass;
}
/**
*
* @param target
* @returns {Boolean}
* @ignore
*/
function isArray(target) {
return Array.isArray(target);
}
exports.isArray = isArray;
/**
* Return true if the clazz is an array.
* @param target
* @returns {boolean}
* @ignore
*/
function isArrayOrArrayClass(target) {
if (target === Array) {
return true;
}
return isArray(target);
}
exports.isArrayOrArrayClass = isArrayOrArrayClass;
/**
* Return true if the target.
* @param target
* @returns {boolean}
* @ignore
*/
function isCollection(target) {
return (isArrayOrArrayClass(target) ||
target === Map ||
target instanceof Map ||
target === Set ||
target instanceof Set ||
target === WeakMap ||
target instanceof WeakMap ||
target === WeakSet ||
target instanceof WeakSet);
}
exports.isCollection = isCollection;
/**
*
* @param target
* @returns {boolean}
* @ignore
*/
function isDate(target) {
return target === Date || target instanceof Date;
}
exports.isDate = isDate;
/**
*
* @param target
* @returns {boolean}
* @ignore
*/
function isObject(target) {
return target === Object;
}
exports.isObject = isObject;
/**
*
* @param target
* @returns {boolean}
* @ignore
*/
function isClass(target) {
return (!isPrimitiveOrPrimitiveClass(target) &&
!isObject(target) &&
!isDate(target) &&
target !== undefined &&
!isPromise(target));
}
exports.isClass = isClass;
/**
* Return true if the value is an empty string, null or undefined.
* @param value
* @returns {boolean}
* @ignore
*/
function isEmpty(value) {
return value === '' || value === null || value === undefined;
}
exports.isEmpty = isEmpty;
/**
*
* @param target
* @returns {boolean}
* @ignore
*/
function isPromise(target) {
return target === Promise || target instanceof Promise;
}
exports.isPromise = isPromise;
/**
*
* @param target
* @returns {any}
* @ignore
*/
function getInheritedClass(target) {
return Object.getPrototypeOf(target);
}
exports.getInheritedClass = getInheritedClass;
/**
*
* @param target
* @returns {Array}
* @ignore
*/
function ancestorsOf(target) {
const classes = [];
let currentTarget = getClass(target);
while (nameOf(currentTarget) !== '') {
classes.unshift(currentTarget);
currentTarget = getInheritedClass(currentTarget);
}
return classes;
}
exports.ancestorsOf = ancestorsOf;
/**
* Get object name
* @ignore
*/
function nameOf(obj) {
switch (typeof obj) {
default:
return '' + obj;
case 'symbol':
return (0, exports.nameOfSymbol)(obj);
case 'function':
return nameOfClass(obj);
}
}
exports.nameOf = nameOf;
/**
* Get the provide name.
* @param targetClass
* @ignore
*/
function nameOfClass(targetClass) {
return typeof targetClass === 'function' ? targetClass.name : targetClass.constructor.name;
}
exports.nameOfClass = nameOfClass;
/**
* Get symbol name.
* @param sym
* @ignore
*/
const nameOfSymbol = (sym) => sym
.toString()
.replace('Symbol(', '')
.replace(')', '');
exports.nameOfSymbol = nameOfSymbol;
/**
*
* @param target
* @param {string} propertyKey
* @returns {PropertyDescriptor}
* @ignore
*/
function descriptorOf(target, propertyKey) {
return Object.getOwnPropertyDescriptor((target && target.prototype) || target, propertyKey);
}
exports.descriptorOf = descriptorOf;
/**
*
* @param target
* @returns {any}
* @ignore
*/
function prototypeOf(target) {
return classOf(target) === target ? target.prototype : target;
}
exports.prototypeOf = prototypeOf;
function isAsyncFunction(fn) {
return fn.constructor.name === 'AsyncFunction' || fn.constructor.name.includes('__awaiter');
}
exports.isAsyncFunction = isAsyncFunction;
;