UNPKG

userface

Version:

Universal Data-Driven UI Engine with live data, validation, and multi-platform support

154 lines (153 loc) 6.23 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.renderVanilla = exports.RenderVanilla = void 0; const errors_1 = require("./errors"); const engine_factory_1 = require("./engine-factory"); // Vanilla JS рендерер class VanillaRenderer { createElement(type, props, children) { // В реальной реализации здесь будет создание DOM элемента return { type, props, children }; } render(component, _container) { // В реальной реализации здесь будет рендеринг DOM элемента console.log('[VanillaRenderer] Rendering component:', component); } unmount(container) { // В реальной реализации здесь будет удаление DOM элемента console.log('[VanillaRenderer] Unmounting component from container:', container); } } // Vanilla JS рендерер платформы class RenderVanilla { constructor() { Object.defineProperty(this, "id", { enumerable: true, configurable: true, writable: true, value: 'vanilla' }); Object.defineProperty(this, "meta", { enumerable: true, configurable: true, writable: true, value: { name: 'Vanilla Adapter', version: '1.0.0', platform: 'vanilla' } }); Object.defineProperty(this, "renderer", { enumerable: true, configurable: true, writable: true, value: new VanillaRenderer() }); // Компоненты, которые поддерживает этот адаптер Object.defineProperty(this, "supportedComponents", { enumerable: true, configurable: true, writable: true, value: [] }); } // Рендеринг компонента render(spec) { const { component, ...props } = spec; // Получаем компонент из глобального реестра const Component = this.getComponentFromRegistry(component); if (!Component) { throw new errors_1.ComponentNotFoundError(component); } const adaptedProps = this.adaptProps(props); return this.renderer.createElement(Component, adaptedProps, []); } // Проверка совместимости компонента isCompatible(component) { // Проверяем, является ли компонент Vanilla JS компонентом return !!(component && (typeof component === 'function' || typeof component === 'object')); } // Получение поддерживаемых компонентов getSupportedComponents() { return this.supportedComponents; } // Валидация спецификации validateSpec(spec) { if (!spec.component || typeof spec.component !== 'string') { return false; } // Проверяем что компонент зарегистрирован в Engine const component = engine_factory_1.engine.getComponent(spec.component); if (!component) { return false; } // Проверяем обязательные пропсы из схемы const schema = engine_factory_1.engine.getComponentSchema(spec.component); if (schema) { const requiredProps = schema.props.filter(p => p.required); for (const prop of requiredProps) { if (spec[prop.name] === undefined) { return false; } } } return true; } // Адаптация пропсов для Vanilla JS adaptProps(props) { const adaptedProps = {}; // Маппинг универсальных типов в Vanilla JS пропсы if (props.text !== undefined) adaptedProps.text = props.text; if (props.number !== undefined) adaptedProps.number = props.number; if (props.boolean !== undefined) adaptedProps.boolean = props.boolean; if (props.array !== undefined) adaptedProps.array = props.array; if (props.object !== undefined) adaptedProps.object = props.object; if (props.function !== undefined) adaptedProps.function = props.function; if (props.element !== undefined) adaptedProps.element = props.element; if (props.color !== undefined) adaptedProps.color = props.color; if (props.dimension !== undefined) adaptedProps.dimension = props.dimension; if (props.resource !== undefined) adaptedProps.resource = props.resource; // Обработка метаданных if (props.meta) { if (props.meta.className) adaptedProps.className = props.meta.className; if (props.meta.style) adaptedProps.style = props.meta.style; if (props.meta.theme) adaptedProps.theme = props.meta.theme; } // Обработка событий if (props.events) { Object.keys(props.events).forEach(eventName => { adaptedProps[eventName] = props.events[eventName]; }); } // Копируем остальные пропсы Object.keys(props).forEach(key => { if (!['text', 'number', 'boolean', 'array', 'object', 'function', 'element', 'color', 'dimension', 'resource', 'meta', 'events'].includes(key)) { adaptedProps[key] = props[key]; } }); return adaptedProps; } // Получение компонента из реестра getComponentFromRegistry(componentName) { return engine_factory_1.engine.getComponent(componentName); } } exports.RenderVanilla = RenderVanilla; exports.renderVanilla = new RenderVanilla();