@merkur/plugin-component
Version:
Merkur component plugin.
58 lines (55 loc) • 1.45 kB
JavaScript
/**
* Utility function to iterate thorugh views returned from
* view factory and call callback function with view arguments
* on each them.
*/
async function mapViews(widget, viewFactory, callback) {
if (widget.$in.component.resolvedViews.has(viewFactory)) {
return mapResolvedViews(widget.$in.component.resolvedViews.get(viewFactory) ?? [], callback);
}
const {
containerSelector
} = widget;
const {
View,
ErrorView,
slot = {}
} = await viewFactory(widget);
// Add additional slot information to slot views
const slots = Object.keys(widget.slot ?? {}).reduce((acc, cur) => {
acc[cur] = {
...slot[cur],
isSlot: true,
containerSelector: widget.slot[cur]?.containerSelector,
container: widget.slot[cur]?.container
};
return acc;
}, {});
const views = [{
View,
ErrorView,
containerSelector,
isSlot: false,
container: widget.container
}, ...Object.values(slots)];
widget.$in.component.resolvedViews.set(viewFactory, views);
return mapResolvedViews(views, callback);
}
function mapResolvedViews(views, callback) {
return views.map(({
View,
ErrorView,
containerSelector,
isSlot,
container
}) => {
callback({
View,
ErrorView,
isSlot,
containerSelector,
container: containerSelector && document?.querySelector(containerSelector) || container || null
});
});
}
export { mapViews };