import camelCase from './camelCase'; /** * DOM-based Routing * * Based on {@link http://goo.gl/EUTi53|Markup-based Unobtrusive Comprehensive DOM-ready Execution} by Paul Irish * * The routing fires all common scripts, followed by the page specific scripts. * Add additional events for more control over timing e.g. a finalize event */ class Router { /** * Create a new Router * @param {Object} routes */ constructor(routes) { this.routes = routes; } /** * Fire Router events * @param {string} route DOM-based route derived from body classes (``) * @param {string} [event] Events on the route. By default, `init` and `finalize` events are called. * @param {string} [arg] Any custom argument to be passed to the event. */ fire(route, event = 'init', arg) { const fire = route !== '' && this.routes[route] && typeof this.routes[route][event] === 'function'; if (fire) { this.routes[route][event](arg); } } /** * Automatically load and fire Router events * * Events are fired in the following order: * * common init * * page-specific init * * page-specific finalize * * common finalize */ loadEvents() { // Fire common init JS this.fire('common'); // Fire page-specific init JS, and then finalize JS document.body.className .toLowerCase() .replace(/-/g, '_') .split(/\s+/) .map(camelCase) .forEach((className) => { this.fire(className); this.fire(className, 'finalize'); }); // Fire common finalize JS this.fire('common', 'finalize'); } } export default Router