qcobjects
Version:
QCObjects is an Open-source framework that empowers full-stack developers to make micro-services and micro-frontends into an N-Tier architecture.
122 lines (115 loc) • 6.24 kB
text/typescript
import { IQCObjectsElement, TComponentURIParams } from "types";
import { Class } from "./Class";
import { ClassFactory } from "./ClassFactory";
import { Component } from "./Component";
import { CONFIG } from "./CONFIG";
import { _DOMCreateElement } from "./DOMCreateElement";
import { __getType__ } from "./getType";
import { logger } from "./Logger";
import { New } from "./New";
import { Package } from "./Package";
import { isBrowser } from "./platform";
import { _tag_filter_ } from "./tag_filter";
/**
* Returns a standarized uri for a component
* @example
* templateURI = ComponentURI({'COMPONENTS_BASE_PATH':'','COMPONENT_NAME':'','TPLEXTENSION':'','TPL_SOURCE':''})
* @author: Jean Machuca <correojean@gmail.com>
* @param params an object with the params to build the uri path
*/
export const ComponentURI = ({ TPL_SOURCE, COMPONENTS_BASE_PATH, COMPONENT_NAME, TPLEXTENSION }:TComponentURIParams):string => {
const templateURI = (TPL_SOURCE === "default") ? (`${COMPONENTS_BASE_PATH}${COMPONENT_NAME}.${TPLEXTENSION}`) : ("");
return templateURI;
};
export const _buildComponentFromElement_ = (element: Element, __parent__: any):Component => {
const __shadowed_not_set = (element.getAttribute("shadowed") === null);
const __tplsource_attr_not_set = (element.getAttribute("template-source") === null);
const shadowed = (element.getAttribute("shadowed") === "true");
const __cached_not_set = (element.getAttribute("cached") === null);
const cached = (element.getAttribute("cached") === "true");
let tplextension = (typeof CONFIG.get("tplextension") !== "undefined") ? (CONFIG.get("tplextension")) : ("html");
tplextension = (element.getAttribute("tplextension") !== null) ? (element.getAttribute("tplextension")) : (tplextension);
let _componentName = element.getAttribute("name");
const _componentClassName = (element.getAttribute("componentClass") !== null) ? (element.getAttribute("componentClass")) : ("Component");
const __componentClassName = (CONFIG.get("preserveComponentBodyTag")) ? (
(_componentName !== null) ? ("com.qcobjects.components." + _componentName + ".ComponentBody") : ("com.qcobjects.components.ComponentBody")
) : (_componentClassName);
_componentName = (_componentName !== null) ? (_componentName) : (
(ClassFactory(__componentClassName as string) &&
typeof (ClassFactory(__componentClassName as string) as unknown as typeof Component).name !== "undefined"
) ? (
(ClassFactory(__componentClassName as string) as unknown as Component).name
) : ("")
);
const __classDefinition = ClassFactory(__componentClassName as string) as Component;
const __tplsource_prop_set = !!((__componentClassName !== "Component" && ((typeof __classDefinition !== "undefined" && typeof __classDefinition.tplsource === "string") && __classDefinition.tplsource !== "")));
const tplsource = (__tplsource_attr_not_set && __tplsource_prop_set) ? (__classDefinition.tplsource) : ((__tplsource_attr_not_set) ? ("default") : (element.getAttribute("template-source")));
logger.debug(`template source for ${_componentName} is ${tplsource} `);
logger.debug(`type for ${_componentName} is ${__getType__(__classDefinition)} `);
const componentURI: string = ComponentURI({
"COMPONENTS_BASE_PATH": CONFIG.get("componentsBasePath"),
"COMPONENT_NAME": _componentName ,
"TPLEXTENSION": tplextension,
"TPL_SOURCE": tplsource as string
});
if (CONFIG.get("preserveComponentBodyTag")) {
Package((_componentName !== "") ? ("com.qcobjects.components." + _componentName + "") : ("com.qcobjects.components"), [
Class("ComponentBody", Component, {
name: _componentName,
tplsource,
tplextension,
reload: true
})
]);
}
const __create_component_instance_ = function ():Component {
const __shadowed = (__shadowed_not_set) ? ((__classDefinition && __classDefinition.shadowed) || Component.shadowed) : (shadowed);
const __definition = {
__parent__,
name: _componentName,
cached: (__cached_not_set) ? (Component.cached) : (cached),
shadowed: __shadowed,
tplextension,
body: (CONFIG.get("preserveComponentBodyTag")) ? (_DOMCreateElement("componentBody")) : (element),
templateURI: componentURI,
tplsource
};
if (typeof _componentName === "undefined" || _componentName === "" || _componentName === null) {
/* this allows to use the original property defined
in the component definition if it is not present in the tag */
delete (__definition as any).name;
}
if (componentURI === "") {
/* this allows to use the original property defined
in the component definition if it is not present in the tag */
delete (__definition as any).templateURI;
}
const newComponent = New(__classDefinition, __definition) as Component;
if (CONFIG.get("preserveComponentBodyTag")) {
if (typeof newComponent !== "undefined") {
element.append(newComponent.body as string | Node);
}
}
return newComponent;
};
const newComponent = __create_component_instance_();
return newComponent;
};
export const _buildComponentsFromElements_ = (elements: HTMLElement[], __parent__: Component | null):Component[] => {
let componentsBuiltWith:Component[] = [];
if (isBrowser) {
componentsBuiltWith = elements.map(
function (element: any) {
return _buildComponentFromElement_(element, __parent__);
}
);
} else {
logger.debug("[_buildComponentsFromElements_] not implemented for Non-Browser environments");
}
return componentsBuiltWith;
};
export const buildComponents = (element:HTMLElement):Component[] => {
const tagFilter = _tag_filter_;
const elements = (element as unknown as IQCObjectsElement).subelements(tagFilter) as HTMLElement[];
return _buildComponentsFromElements_(elements, null);
};