UNPKG

1.77 kBJavaScriptView Raw
1const stateStringParser = require('./state-string-parser')
2
3module.exports = function StateState() {
4 const states = {}
5
6 function getHierarchy(name) {
7 const names = stateStringParser(name)
8
9 return names.map(name => {
10 if (!states[name]) {
11 throw new Error(`State ${name} not found`)
12 }
13 return states[name]
14 })
15 }
16
17 function getParent(name) {
18 const parentName = getParentName(name)
19
20 return parentName && states[parentName]
21 }
22
23 function getParentName(name) {
24 const names = stateStringParser(name)
25
26 if (names.length > 1) {
27 const secondToLast = names.length - 2
28
29 return names[secondToLast]
30 } else {
31 return null
32 }
33 }
34
35 function guaranteeAllStatesExist(newStateName) {
36 const stateNames = stateStringParser(newStateName)
37 const statesThatDontExist = stateNames.filter(name => !states[name])
38
39 if (statesThatDontExist.length > 0) {
40 throw new Error(`State ${statesThatDontExist[statesThatDontExist.length - 1]} does not exist`)
41 }
42 }
43
44 function buildFullStateRoute(stateName) {
45 return getHierarchy(stateName).map(state => `/${state.route || ''}`)
46 .join('')
47 .replace(/\/{2,}/g, '/')
48 }
49
50 function applyDefaultChildStates(stateName) {
51 const state = states[stateName]
52
53 const defaultChildStateName = state && (
54 typeof state.defaultChild === 'function'
55 ? state.defaultChild()
56 : state.defaultChild
57 )
58
59 if (!defaultChildStateName) {
60 return stateName
61 }
62
63 const fullStateName = `${stateName}.${defaultChildStateName}`
64
65 return applyDefaultChildStates(fullStateName)
66 }
67
68
69 return {
70 add(name, state) {
71 states[name] = state
72 },
73 get(name) {
74 return name && states[name]
75 },
76 getHierarchy,
77 getParent,
78 getParentName,
79 guaranteeAllStatesExist,
80 buildFullStateRoute,
81 applyDefaultChildStates,
82 }
83}