import { ContainerUtil, Prioritizeable } from '@celljs/core'; import { WidgetModel, WidgetFactory, Widget } from './widget-protocol'; let widgetFactories: WidgetFactory[]; export namespace WidgetUtil { export async function create(widgetModel: WidgetModel): Promise> { if (!widgetFactories) { widgetFactories = Prioritizeable.prioritizeAllSync(ContainerUtil.getAll>(WidgetFactory)).map(p => p.value); } for (const factory of widgetFactories) { if (await factory.support(widgetModel)) { const widget = await factory.create(widgetModel); return widget; } } throw new Error(`WidgetModel {id: ${widgetModel.id}, type: ${widgetModel.type}} there is no matching widget factory.`); } export async function render(widgetModel: WidgetModel): Promise { const widget = await WidgetUtil.create(widgetModel); return widget.render(); } }