typescript-class-helpers
Version:
Usefull helper to have in your typescript project
192 lines (191 loc) • 7.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CLASSNAME = void 0;
const lib_1 = require("tnp-core/lib");
const models_1 = require("./models");
const symbols_1 = require("./symbols");
const index_1 = require("./index");
const lib_2 = require("tnp-core/lib");
const storage_1 = require("./storage");
const set_class_name_1 = require("./set-class-name");
const registerd_db_1 = require("./registerd-db");
const errors_messages_1 = require("./errors-messages");
//#region @backend
const FormData = require("form-data");
//#endregion
function getClasses() {
const s = (0, storage_1.getStorage)();
return s[symbols_1.SYMBOL.CLASSES];
}
var CLASSNAME;
(function (CLASSNAME_1) {
function getClassConfig(target, configs = [], callerTarget) {
if (!lib_1._.isFunction(target)) {
throw `[typescript-class-helper][getClassConfig] Cannot get class config from: ${target}`;
}
let config;
const parentClass = Object.getPrototypeOf(target);
const isValidParent = lib_1._.isFunction(parentClass) && parentClass.name !== '';
if (registerd_db_1.registerd.classes.includes(target)) {
config =
registerd_db_1.registerd.configs[registerd_db_1.registerd.classes.findIndex(c => c === target)];
}
else {
config = new models_1.Models.ClassConfig();
config.classReference = target;
registerd_db_1.registerd.classes.push(target);
}
registerd_db_1.registerd.configs[registerd_db_1.registerd.classes.findIndex(c => c === target)] = config;
if (callerTarget) {
const callerTargetConfig = registerd_db_1.registerd.configs[registerd_db_1.registerd.classes.findIndex(c => c === callerTarget)];
if (!config.vChildren.includes(callerTargetConfig)) {
config.vChildren.push(callerTargetConfig);
}
callerTargetConfig.vParent = config;
}
configs.push(config);
return isValidParent
? getClassConfig(parentClass, configs, target)
: configs;
}
CLASSNAME_1.getClassConfig = getClassConfig;
/**
* PLEASE PROVIDE NAME AS TYPED STRING, NOT VARIABLE
* Decorator requred for production mode
* @param name Name of class
*/
function CLASSNAME(className, options) {
return function (target) {
// console.log(`CLASSNAME Inited ${className}`)
return (0, set_class_name_1.setClassName)(target, className, options);
};
}
CLASSNAME_1.CLASSNAME = CLASSNAME;
function getClassName(target, production = false) {
if (lib_1._.isNil(target)) {
// console.log(target);
// Helpers.warn(`[typescript-class-helpers][getClassName] target is nil`)
return void 0;
}
if (lib_1._.isString(target)) {
// console.log(target);
lib_2.Helpers.log(`[typescript-class-helpers][getClassName] target is string: '${target}', produciton: ${production}`);
return target;
}
if (!lib_1._.isFunction(target)) {
// console.log(target);
lib_2.Helpers.log(`[typescript-class-helpers][getClassName] target is not a class`);
return void 0;
}
if (target[symbols_1.SYMBOL.ClassNameStaticProperty]) {
return target[symbols_1.SYMBOL.ClassNameStaticProperty];
}
const configs = getClassConfig(target);
const config = lib_1._.first(configs);
const classNameInBrowser = config?.classNameInBrowser;
if (lib_2.Helpers.isBrowser && lib_1._.isString(classNameInBrowser)) {
return classNameInBrowser;
}
const className = config?.className;
if (typeof className === 'string') {
return className;
}
if (production) {
console.log('class without @CLASS.NAME deocrator', target);
throw new Error(errors_messages_1.ERROR_MSG_CLASS_WITHOUT_DECORATOR);
}
else {
// Helpers.log('check for ' + target.name)
// setTimeout(() => {
// // Helpers.log('check for ' + target.name + ' === ' + config.className)/
// // TODO this may work, but not yet in singleton/morphi
// if (!config.className) {
// if (target?.name && target.name !== 'Object') {
// ConfigHelpers.log(`[typescript-class-helpers] Please use @CLASS.NAME`
// + `('${(target?.name && !!target.name) ? target.name : '...'}') decorator for class ${target?.name}`)
// }
// }
// })
}
// special thing when cloning classes
if (target.name?.startsWith('class_')) {
return '';
}
return target.name;
}
CLASSNAME_1.getClassName = getClassName;
// @ts-ignore
function getObjectIndexPropertyValue(obj) {
const className = index_1.TchHelpers.getNameFromObject(obj);
// console.log('className',className)
let c = getClasses().find(c => c.className === className);
// console.log('c',c)
if (c) {
return c.uniqueKey;
}
}
CLASSNAME_1.getObjectIndexPropertyValue = getObjectIndexPropertyValue;
// @ts-ignore
function getClassFamilyByClassName(className) {
let c = getClasses().find(c => c.className === className);
// console.log('getClasses()', getClasses())
if (c) {
return c.classFamily;
}
}
CLASSNAME_1.getClassFamilyByClassName = getClassFamilyByClassName;
// @ts-ignore
function getObjectClassFamily(obj) {
const className = index_1.TchHelpers.getNameFromObject(obj);
// console.log('className',className)
let c = getClasses().find(c => c.className === className);
// console.log('c',c)
if (c) {
return c.classFamily;
}
}
CLASSNAME_1.getObjectClassFamily = getObjectClassFamily;
function getObjectIndexValue(obj) {
const className = index_1.TchHelpers.getNameFromObject(obj);
// console.log('className',className)
let c = getClasses().find(c => c.className === className);
// console.log('c',c)
if (c && lib_1._.isString(c.uniqueKey)) {
return obj[c.uniqueKey];
}
}
CLASSNAME_1.getObjectIndexValue = getObjectIndexValue;
function getClassBy(className) {
let res;
if (Array.isArray(className)) {
if (className.length !== 1) {
throw `Mapping error... please use proper class names:
{
propertyObject: 'MyClassName',
propertyWithArray: ['MyClassName']
}
`;
}
className = className[0];
}
if (typeof className === 'function') {
// TODO QUICK_FIX
res = className;
}
if (className === 'Date') {
res = Date;
}
if (className === 'FormData') {
res = FormData;
}
let c = getClasses().find(c => c.className === className);
if (c) {
res = c.target;
}
// console.log(`getClassBy "${className} return \n\n ${res} \n\n`)
// @ts-ignore
return res;
}
CLASSNAME_1.getClassBy = getClassBy;
})(CLASSNAME || (exports.CLASSNAME = CLASSNAME = {}));
//# sourceMappingURL=classname.js.map