1 | const stateStringParser = require('./state-string-parser')
|
2 | const extend = require('./extend.js')
|
3 |
|
4 | const combine = require('combine-arrays')
|
5 | const pathToRegexp = require('path-to-regexp-with-reversible-keys')
|
6 |
|
7 | module.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 |
|
15 | function 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 |
|
33 | function 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 |
|
43 | function 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 | }
|