@ribajs/core
Version:
Core module of Riba.js
228 lines • 17.9 kB
JavaScript
import "@ribajs/types";
import { renderElement } from "@ribajs/jsx";
import { Observer } from "../observer.js";
import { parseJsonString, camelCase } from "@ribajs/utils/src/type.js";
import { getRandomColor, consoleColoured } from "@ribajs/utils/src/color.js";
export class BasicComponent extends HTMLElement {
static tagName;
_debug = false;
_color;
templateLoaded = false;
observedAttributesToCheck = {};
observedAttributes = [];
constructor() {
super();
if (this._debug) {
this._color = getRandomColor();
}
}
remove() {
if (this && this.parentElement) {
this.parentElement.removeChild(this);
}
}
_log(mode, ...args) {
const namespace = this.constructor.name || this.tagName;
if (!this._color) {
this._color = getRandomColor();
}
consoleColoured({ namespace, color: this._color, mode }, ...args);
}
info(...args) {
return this._log("info", ...args);
}
debug(...args) {
if (!this._debug) {
return;
}
return this._log("debug", ...args);
}
error(...args) {
console.error(...args);
}
requiredAttributes() {
return [];
}
async init(observedAttributes) {
this.loadAttributes(observedAttributes);
this.getPassedObservedAttributes(observedAttributes);
return;
}
ready() {
return (this.allPassedObservedAttributesAreInitialized() &&
this.checkRequiredAttributes());
}
attributeIsPassed(observedAttribute) {
return this.hasAttribute(observedAttribute);
}
getPassedObservedAttributes(observedAttributes) {
const oa2c = this.observedAttributesToCheck;
for (const observedAttribute of observedAttributes) {
if (!oa2c[observedAttribute]) {
oa2c[observedAttribute] = { passed: false, initialized: false };
}
else {
if (!oa2c[observedAttribute].passed) {
oa2c[observedAttribute].passed =
this.attributeIsPassed(observedAttribute);
}
}
}
}
allPassedObservedAttributesAreInitialized() {
return Object.keys(this.observedAttributesToCheck).every((key) => !this.observedAttributesToCheck[key]?.passed ||
this.observedAttributesToCheck[key]?.initialized);
}
checkRequiredAttributes() {
return this.requiredAttributes().every((requiredAttribute) => {
requiredAttribute = camelCase(requiredAttribute);
if (this.scope.hasOwnProperty(requiredAttribute)) {
if (this.scope[requiredAttribute] === null ||
typeof this.scope[requiredAttribute] === "undefined") {
return false;
}
if (Array.isArray(this.scope[requiredAttribute])) {
return this.scope[requiredAttribute].length > 0;
}
else if (typeof this.scope[requiredAttribute] === "object") {
return Object.keys(this.scope[requiredAttribute]).length > 0;
}
else {
return true;
}
}
return false;
});
}
parseAttribute(attr) {
let value = attr;
if (typeof attr !== "string") {
return attr;
}
if (attr === "true") {
value = true;
}
else if (attr === "false") {
value = false;
}
else if (attr === "null") {
value = null;
}
else if (attr === "undefined") {
value = undefined;
}
else if (attr === "") {
value = undefined;
}
else if (!isNaN(Number(attr))) {
value = Number(attr);
if (value >= Number.MAX_SAFE_INTEGER) {
value = attr;
}
}
else {
const jsonString = parseJsonString(value);
value = jsonString ? jsonString : value;
}
return value;
}
eventHandler(self) {
return function (context, event, binding, el) {
if (!this || !this.call) {
const error = new Error(`[rv-${binding.type}="${binding.keypath}"] Event handler "${binding.keypath}" not found!"`);
console.error(binding, el);
throw error;
}
this.call(self, event, binding.view.models, el);
};
}
connectedCallback() {
}
disconnectedCallback() {
}
async attributeChangedCallback(attributeName, oldValue, newValue, namespace) {
if (this.observedAttributesToCheck &&
this.observedAttributesToCheck[attributeName]) {
this.observedAttributesToCheck[attributeName].initialized = true;
}
newValue = this.parseAttribute(newValue);
const parsedAttributeName = camelCase(attributeName);
if (this.scope && this.scope[parsedAttributeName]) {
oldValue = this.scope[parsedAttributeName];
}
this.scope[parsedAttributeName] = newValue;
this.parsedAttributeChangedCallback(parsedAttributeName, oldValue, newValue, namespace);
}
parsedAttributeChangedCallback(attributeName, oldValue, newValue, namespace) {
this.debug("parsedAttributeChangedCallback called", attributeName, oldValue, newValue, namespace);
}
adoptedCallback(oldDocument, newDocument) {
this.debug("adoptedCallback called", oldDocument, newDocument);
}
async loadTemplate() {
if (this.templateLoaded === true) {
return null;
}
if (!this.checkRequiredAttributes()) {
this.debug("Not all required attributes are set to load the template");
return null;
}
this.templateLoaded = true;
const template = await this.template();
try {
if (template) {
if (template instanceof HTMLElement) {
this.innerHTML = "";
this.appendChild(template);
}
else if (typeof template === "string") {
this.innerHTML = template;
}
else if (template.tag) {
this.innerHTML = renderElement(template);
}
}
return template;
}
catch (error) {
this.templateLoaded = false;
throw error;
}
}
async beforeTemplate() {
}
async afterTemplate(template) {
this.debug("afterTemplate", template);
}
async onReady() {
}
observe(keypath, callback) {
return new Observer(this.scope, keypath, callback);
}
observeAttribute(attributeName, callback) {
const parsedAttributeName = camelCase(attributeName);
return this.observe(parsedAttributeName, callback);
}
setBinderAttribute(attributeName, newValue, namespace = null) {
const parsedAttributeName = camelCase(attributeName);
const oldValue = this.scope[parsedAttributeName];
this.attributeChangedCallback(attributeName, oldValue, newValue, namespace);
}
getBinderAttribute(attributeName) {
const parsedAttributeName = camelCase(attributeName);
const value = this.scope[parsedAttributeName];
return value;
}
loadAttributes(observedAttributes) {
const attributes = this.attributes;
for (const i in attributes) {
const attribute = attributes[i];
const name = attribute.nodeName;
if (observedAttributes.indexOf(name) !== -1) {
const newValue = attribute.nodeValue;
this.attributeChangedCallback(name, undefined, newValue, null);
}
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWMtY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudC9iYXNpYy1jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxlQUFlLENBQUM7QUFRdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU1QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTdFLE1BQU0sT0FBZ0IsY0FBZSxTQUFRLFdBQVc7SUFDL0MsTUFBTSxDQUFDLE9BQU8sQ0FBUztJQUV2QixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ2YsTUFBTSxDQUFVO0lBRWIsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUt2Qix5QkFBeUIsR0FBOEIsRUFBRSxDQUFDO0lBRTFELGtCQUFrQixHQUFhLEVBQUUsQ0FBQztJQUk1QztRQUNFLEtBQUssRUFBRSxDQUFDO1FBRVIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxjQUFjLEVBQUUsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUtNLE1BQU07UUFDWCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFJUyxJQUFJLENBQUMsSUFBd0MsRUFBRSxHQUFHLElBQWU7UUFDekUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN4RCxJQUFJLENBQUMs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