typescript-class-helpers
Version:
Usefull helper to have in your typescript project
215 lines • 9.67 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CLASS = exports.TchHelpers = exports.SYMBOL = exports.Models = void 0;
const lib_1 = require("tnp-core/lib");
const classname_1 = require("./classname");
const describe_class_1 = require("./describe-class");
const set_class_name_1 = require("./set-class-name");
var models_1 = require("./models");
Object.defineProperty(exports, "Models", { enumerable: true, get: function () { return models_1.Models; } });
var symbols_1 = require("./symbols");
Object.defineProperty(exports, "SYMBOL", { enumerable: true, get: function () { return symbols_1.SYMBOL; } });
class TchHelpers {
static getBy(className) {
return classname_1.CLASSNAME.getClassBy(className);
}
static getFromObject(o) {
if (lib_1._.isUndefined(o) || lib_1._.isNull(o)) {
return;
}
if (o.constructor) {
return o.constructor;
}
const p = Object.getPrototypeOf(o);
return p && p.constructor;
}
static getName(target, production = false) {
return classname_1.CLASSNAME.getClassName(target, production);
}
static getNameFromObject(o) {
const fnCLass = this.getFromObject(o);
return this.getName(fnCLass);
}
static getConfigs(target) {
return classname_1.CLASSNAME.getClassConfig(target);
}
static describeProperites(target) {
const d1 = (0, describe_class_1.describeFromClassStringify)(target);
const d2 = (0, describe_class_1.describeByDefaultModelsAndMapping)(target);
let uniq = {};
// @ts-ignore
d1.concat(d2).forEach(p => uniq[p] = p);
return Object.keys(uniq)
.filter(d => !!d)
.filter(d => typeof target.prototype[d] !== 'function');
}
}
exports.TchHelpers = TchHelpers;
const notAllowedAsMethodName = [
'length', 'name',
'arguments', 'caller',
'constructor', 'apply',
'bind', 'call',
'toString',
'__defineGetter__',
'__defineSetter__', 'hasOwnProperty',
'__lookupGetter__', '__lookupSetter__',
'isPrototypeOf', 'propertyIsEnumerable',
'valueOf', '__proto__', 'toLocaleString',
];
const getMethodsNames = (classOrClassInstance, allMethodsNames = []) => {
if (!classOrClassInstance) {
return allMethodsNames;
}
const isClassFunction = lib_1._.isFunction(classOrClassInstance);
const classFun = (isClassFunction ? classOrClassInstance : Object.getPrototypeOf(classOrClassInstance));
const objectToCheck = isClassFunction ? classOrClassInstance?.prototype : classOrClassInstance;
const prototypeObj = Object.getPrototypeOf(objectToCheck || {});
const properties = lib_1._.uniq([
...Object.getOwnPropertyNames(objectToCheck || {}),
...Object.getOwnPropertyNames(prototypeObj || {}),
...Object.keys(objectToCheck || {}),
...Object.keys(prototypeObj || {}),
])
.filter(f => !!f && !notAllowedAsMethodName.includes(f));
properties.filter((methodName) => typeof objectToCheck[methodName] === 'function').forEach(p => allMethodsNames.push(p));
if (!classFun || !classFun.constructor || classFun?.constructor?.name === 'Object') {
return allMethodsNames;
}
return getMethodsNames(Object.getPrototypeOf(classFun), allMethodsNames);
};
exports.CLASS = {
NAME: classname_1.CLASSNAME.CLASSNAME,
setName: set_class_name_1.setClassName,
getBy: TchHelpers.getBy,
/**
* @deprecated
*/
getSingleton(target) {
if (typeof target !== 'function') {
console.error(`[typescript-class-helpers][setSingletonObj] Type of target is not a function`);
return;
}
const config = TchHelpers.getConfigs(target)[0];
// console.log(`getSingleton for ${target.name}: `, config.singleton)
return config.singleton;
},
/**
* @deprecated
*/
setSingletonObj(target, singletonObject) {
// console.log('SET SINGLETON', singletonObject)
if (typeof target !== 'function') {
console.error(`[typescript-class-helpers][setSingletonObj] Type of target is not a function`);
return;
}
if (Array.isArray(singletonObject)) {
console.error(`[typescript-class-helpers][setSingletonObj] Singleton instance cant be an array`);
return;
}
if (typeof singletonObject !== 'object') {
console.error(`[typescript-class-helpers][setSingletonObj] Singleton instance cant must be a object`);
return;
}
const className = exports.CLASS.getName(target);
// console.log(`SINGLETON SET for TARGET ${className}`)
const config = TchHelpers.getConfigs(target)[0];
if (config.singleton) {
console.warn(`[typescript-class-helpers] You are trying to set singleton of "${className}" second time with different object.`);
}
config.singleton = singletonObject;
},
/**
* @deprecated
*/
getConfigs: TchHelpers.getConfigs,
/**
* @deprecated
*/
getConfig: (target) => {
return lib_1._.first(TchHelpers.getConfigs(target));
},
getMethodsNames(classOrClassInstance) {
return getMethodsNames(classOrClassInstance);
},
getFromObject: TchHelpers.getFromObject,
getName: TchHelpers.getName,
getNameFromObject: TchHelpers.getNameFromObject,
describeProperites: TchHelpers.describeProperites,
/**
* @deprecated
*/
OBJECT: (obj) => {
return {
get indexValue() {
return classname_1.CLASSNAME.getObjectIndexValue(obj);
},
get indexProperty() {
return classname_1.CLASSNAME.getObjectIndexPropertyValue(obj);
},
get isClassObject() {
if (!lib_1._.isObject(obj) || lib_1._.isArray(obj) || lib_1._.isRegExp(obj) ||
lib_1._.isBuffer(obj) || lib_1._.isArrayBuffer(obj)) {
return false;
}
if (lib_1._.isDate(obj)) {
return true;
}
const className = exports.CLASS.getNameFromObject(obj);
return lib_1._.isString(className) && className !== 'Object';
},
isEqual: (anotherObj, compareDeep = false) => {
if (!exports.CLASS.OBJECT(obj).isClassObject || !exports.CLASS.OBJECT(anotherObj).isClassObject) {
return false;
}
if (obj === anotherObj) {
// console.log(`EQ v1: , v2: - class1 ${CLASS.getNameFromObject(obj)}, class2 ${CLASS.getNameFromObject(anotherObj)}`, obj, anotherObj)
return true;
}
const v1 = classname_1.CLASSNAME.getObjectIndexValue(obj);
const v2 = classname_1.CLASSNAME.getObjectIndexValue(anotherObj);
const f1 = classname_1.CLASSNAME.getObjectClassFamily(obj);
const f2 = classname_1.CLASSNAME.getObjectClassFamily(anotherObj);
const isFamilyDiff = (!lib_1._.isString(f1) || !lib_1._.isString(f2) || (f1 !== f2));
// console.log(`DIFF FAMILY ${isFamilyDiff} v1: ${CLASSNAME.getObjectClassFamily(obj)}, v2: ${CLASSNAME.getObjectClassFamily(anotherObj)} - class1 ${CLASS.getNameFromObject(obj)}, class2 ${CLASS.getNameFromObject(anotherObj)}`)
if (isFamilyDiff) {
// console.log(`DIFF v1: ${v1}, v2: ${v2} - class1 ${CLASS.getNameFromObject(obj)}, class2 ${CLASS.getNameFromObject(anotherObj)}`)
return false;
}
if (!exports.CLASS.OBJECT(obj).isClassObject || !exports.CLASS.OBJECT(anotherObj).isClassObject) {
// console.log(`NOT CLASS v1: ${v1}, v2: ${v2} - class1 ${CLASS.getNameFromObject(obj)}, class2 ${CLASS.getNameFromObject(anotherObj)}`)
return false;
}
// console.log(`v1: ${v1} ,class ${CLASS.getNameFromObject(obj)} ,prop: ${CLASS.OBJECT(obj).indexProperty}`)
// console.log(`v2: ${v2} ,class ${CLASS.getNameFromObject(anotherObj)} ,prop: ${CLASS.OBJECT(anotherObj).indexProperty}`)
// console.log(`v1: ${v1}, v2: ${v2} - class1 ${CLASS.getNameFromObject(obj)}, class2 ${CLASS.getNameFromObject(anotherObj)}`)
// console.log('')
if ((lib_1._.isNumber(v1) && lib_1._.isNumber(v2)) || (lib_1._.isString(v1) && lib_1._.isString(v2))) {
const res = (v1 === v2);
// @ts-ignore
return res;
}
if (compareDeep) {
return lib_1._.isEqual(v1, v2);
}
return false;
}
};
}
};
__exportStar(require("enum-values"), exports);
//# sourceMappingURL=index.js.map