UNPKG

abstract-state-router

Version:

The basics of a client-side state router ala the AngularJS ui-router, but without any DOM interactions

89 lines (69 loc) 2.04 kB
var stateStringParser = require('./state-string-parser') var parse = require('./state-string-parser') module.exports = function StateState() { var states = {} function getHierarchy(name) { var names = stateStringParser(name) return names.map(function(name) { if (!states[name]) { throw new Error('State ' + name + ' not found') } return states[name] }) } function getParent(name) { var parentName = getParentName(name) return parentName && states[parentName] } function getParentName(name) { var names = stateStringParser(name) if (names.length > 1) { var secondToLast = names.length - 2 return names[secondToLast] } else { return null } } function guaranteeAllStatesExist(newStateName) { var stateNames = parse(newStateName) var statesThatDontExist = stateNames.filter(function(name) { return !states[name] }) if (statesThatDontExist.length > 0) { throw new Error('State ' + statesThatDontExist[statesThatDontExist.length - 1] + ' does not exist') } } function buildFullStateRoute(stateName) { return getHierarchy(stateName).map(function(state) { return '/' + (state.route || '') }).join('').replace(/\/{2,}/g, '/') } function applyDefaultChildStates(stateName) { var state = states[stateName] function getDefaultChildStateName() { return state && (typeof state.defaultChild === 'function' ? state.defaultChild() : state.defaultChild) } var defaultChildStateName = getDefaultChildStateName() if (!defaultChildStateName) { return stateName } var fullStateName = stateName + '.' + defaultChildStateName return applyDefaultChildStates(fullStateName) } return { add: function(name, state) { states[name] = state }, get: function(name) { return name && states[name] }, getHierarchy: getHierarchy, getParent: getParent, getParentName: getParentName, guaranteeAllStatesExist: guaranteeAllStatesExist, buildFullStateRoute: buildFullStateRoute, applyDefaultChildStates: applyDefaultChildStates } }