UNPKG

@ribajs/core

Version:

Core module of Riba.js

228 lines 17.9 kB
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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