@merkur/plugin-component
Version:
Merkur component plugin.
61 lines (59 loc) • 1.97 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) {
var _widget$slot;
if (widget.$in.component.resolvedViews.has(viewFactory)) {
var _widget$$in$component;
return mapResolvedViews((_widget$$in$component = widget.$in.component.resolvedViews.get(viewFactory)) !== null && _widget$$in$component !== void 0 ? _widget$$in$component : [], callback);
}
const {
containerSelector
} = widget;
const {
View,
ErrorView,
slot = {}
} = await viewFactory(widget);
// Add additional slot information to slot views
const slots = Object.keys((_widget$slot = widget.slot) !== null && _widget$slot !== void 0 ? _widget$slot : {}).reduce((acc, cur) => {
var _widget$slot$cur, _widget$slot$cur2;
acc[cur] = {
...slot[cur],
isSlot: true,
containerSelector: (_widget$slot$cur = widget.slot[cur]) === null || _widget$slot$cur === void 0 ? void 0 : _widget$slot$cur.containerSelector,
container: (_widget$slot$cur2 = widget.slot[cur]) === null || _widget$slot$cur2 === void 0 ? void 0 : _widget$slot$cur2.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
}) => {
var _document;
callback({
View,
ErrorView,
isSlot,
containerSelector,
container: containerSelector && ((_document = document) === null || _document === void 0 ? void 0 : _document.querySelector(containerSelector)) || container || null
});
});
}
export { mapViews };