UNPKG

lore

Version:

Convention-driven framework for building React-Redux applications

64 lines (51 loc) 1.81 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = sortHooksByLoadOrder; var _topsort = require('topsort'); var _topsort2 = _interopRequireDefault(_topsort); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Convert the set of hooks in Object form to a format topsort can work with * * @param {Object} hooks Set of hooks to load * @returns {Array} Hooks converted to an array format recognizable by topsort */ function getDependencyGraph(hooks) { var dependencyGraph = []; Object.keys(hooks).forEach(function (hookName) { if (!hooks[hookName]) { return; } var dependencies = hooks[hookName].dependencies || []; if (dependencies.length === 0) { dependencyGraph.push([hookName]); } dependencies.forEach(function (dependency) { dependencyGraph.push([dependency, hookName]); }); }); return dependencyGraph; } /** * Examines all the hooks and reorder them so they execute in the proper sequence (so that * hooks that depend on other hooks are only loaded after those hooks are). * * @param {Object} hooks Set of hooks to load * @returns {Array} List of hooks, sorted by execution order */ function sortHooksByLoadOrder(hooks, log) { var dependencyGraph = getDependencyGraph(hooks); // log.debug('hook dependency graph: ', dependencyGraph); var sortedDependencies = (0, _topsort2.default)(dependencyGraph); // log.debug('loading sorted hooks: ', sortedDependencies); return sortedDependencies.map(function (hookName) { var hook = hooks[hookName]; if (!hook) { throw new Error('Expected to find hook named \'' + hookName + '\' but none was included'); } return hook; }); } module.exports = exports['default'];