userface
Version:
Universal Data-Driven UI Engine with live data, validation, and multi-platform support
154 lines (153 loc) • 6.25 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.renderAngular = exports.RenderAngular = void 0;
const errors_1 = require("./errors");
const engine_factory_1 = require("./engine-factory");
// Angular рендерер
class AngularRenderer {
createElement(type, props, children) {
// В реальной реализации здесь будет создание Angular элемента
return {
type,
props,
children
};
}
render(component, _container) {
// В реальной реализации здесь будет рендеринг Angular компонента
console.log('[AngularRenderer] Rendering component:', component);
}
unmount(container) {
// В реальной реализации здесь будет размонтирование Angular компонента
console.log('[AngularRenderer] Unmounting component from container:', container);
}
}
// Angular рендерер платформы
class RenderAngular {
constructor() {
Object.defineProperty(this, "id", {
enumerable: true,
configurable: true,
writable: true,
value: 'angular'
});
Object.defineProperty(this, "meta", {
enumerable: true,
configurable: true,
writable: true,
value: {
name: 'Angular Adapter',
version: '1.0.0',
platform: 'angular'
}
});
Object.defineProperty(this, "renderer", {
enumerable: true,
configurable: true,
writable: true,
value: new AngularRenderer()
});
// Компоненты, которые поддерживает этот адаптер
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) {
// Проверяем, является ли компонент Angular компонентом
return !!(component && (component.selector || component.templateUrl || component.template));
}
// Получение поддерживаемых компонентов
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;
}
// Адаптация пропсов для Angular
adaptProps(props) {
const adaptedProps = {};
// Маппинг универсальных типов в Angular пропсы
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.RenderAngular = RenderAngular;
exports.renderAngular = new RenderAngular();