UNPKG

1.66 kBJavaScriptView Raw
1const stateStringParser = require('./state-string-parser')
2const extend = require('./extend.js')
3
4const combine = require('combine-arrays')
5const pathToRegexp = require('path-to-regexp-with-reversible-keys')
6
7module.exports = function StateComparison(stateState) {
8 const getPathParameters = pathParameters()
9
10 const parametersChanged = args => parametersThatMatterWereChanged(extend(args, { stateState, getPathParameters }))
11
12 return args => stateComparison(extend(args, { parametersChanged }))
13}
14
15function pathParameters() {
16 const parameters = {}
17
18 return path => {
19 if (!path) {
20 return []
21 }
22
23 if (!parameters[path]) {
24 parameters[path] = pathToRegexp(path).keys.map(function(key) {
25 return key.name
26 })
27 }
28
29 return parameters[path]
30 }
31}
32
33function parametersThatMatterWereChanged({ stateState, getPathParameters, stateName, fromParameters, toParameters }) {
34 const state = stateState.get(stateName)
35 const querystringParameters = state.querystringParameters || []
36 const parameters = getPathParameters(state.route).concat(querystringParameters)
37
38 return Array.isArray(parameters) && parameters.some(
39 key => fromParameters[key] !== toParameters[key]
40 )
41}
42
43function stateComparison({ parametersChanged, original, destination }) {
44 const states = combine({
45 start: stateStringParser(original.name),
46 end: stateStringParser(destination.name),
47 })
48
49 return states.map(({ start, end }) => ({
50 nameBefore: start,
51 nameAfter: end,
52 stateNameChanged: start !== end,
53 stateParametersChanged: start === end && parametersChanged({
54 stateName: start,
55 fromParameters: original.parameters,
56 toParameters: destination.parameters,
57 }),
58 }))
59}