UNPKG

aurelia-hot-module-reload

Version:

Tools designed to enable HMR for Aurelia's loaders.

57 lines (56 loc) 3.01 kB
import { ViewSlot } from 'aurelia-templating'; import { getAuElements } from './aurelia-hot-module-reload'; export function getViewSlots(view) { if (view.children && view.children.length) { return view.children.filter(function (viewSlot) { return viewSlot instanceof ViewSlot && viewSlot.children && viewSlot.children.length; }); } return []; } export function anyMatchingChildren(viewSlot, matchingTemplate) { return !!viewSlot.children.find(function (view) { return view.viewFactory && view.viewFactory.template === matchingTemplate; }); } export function traverseControllerForTemplates(auController, matchingTemplate) { var matchingViewControllers = []; var matchingScopeControllers = []; var view = (auController.view); var scope = (auController.scope); var slotsWithMatchingViews = []; if (view && view.viewFactory && view.viewFactory.template === matchingTemplate) { matchingViewControllers = [auController]; // [view.controller] // whole View and all of its children will be rendered } else if (scope && scope.controller && scope.viewFactory && scope.viewFactory.template === matchingTemplate) { matchingScopeControllers = [scope.controller]; } else { var viewViewSlots = view ? getViewSlots(view) : []; var scopeViewSlots = scope ? getViewSlots(scope) : []; slotsWithMatchingViews = Array.from(new Set(viewViewSlots.concat(scopeViewSlots))).filter(function (slot) { return anyMatchingChildren(slot, matchingTemplate); }); } return { matchingViewControllers: matchingViewControllers, matchingScopeControllers: matchingScopeControllers, slotsWithMatchingViews: slotsWithMatchingViews }; } export function getElementsToRerender(template) { // get visible elements to re-render: var auElements = getAuElements(); var controllers = auElements.filter(function (el) { /* NOTE: viewless components like blur-image do not have el.au.controller set */ return el.au && el.au.controller && (el.au.controller.view || el.au.controller.scope); }).map(function (el) { return el.au.controller; }); var viewControllers = new Set(); var scopeControllers = new Set(); var slots = new Set(); controllers .forEach(function (controller) { var _a = traverseControllerForTemplates(controller, template), matchingViewControllers = _a.matchingViewControllers, matchingScopeControllers = _a.matchingScopeControllers, slotsWithMatchingViews = _a.slotsWithMatchingViews; matchingViewControllers.forEach(function (controller) { return viewControllers.add(controller); }); matchingScopeControllers.forEach(function (controller) { return scopeControllers.add(controller); }); slotsWithMatchingViews.forEach(function (slot) { return slots.add(slot); }); }); var toRender = { viewControllers: viewControllers, scopeControllers: scopeControllers, slots: slots }; return toRender; }