@equinor/fusion-framework-module-navigation 7.0.4 → 7.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/esm/NavigateEvent.js +24 -0
  3. package/dist/esm/NavigateEvent.js.map +1 -0
  4. package/dist/esm/NavigatedEvent.js +20 -0
  5. package/dist/esm/NavigatedEvent.js.map +1 -0
  6. package/dist/esm/NavigationConfigurator.js +13 -1
  7. package/dist/esm/NavigationConfigurator.js.map +1 -1
  8. package/dist/esm/NavigationProvider.js +8 -2
  9. package/dist/esm/NavigationProvider.js.map +1 -1
  10. package/dist/esm/enable-navigation.js +1 -0
  11. package/dist/esm/enable-navigation.js.map +1 -1
  12. package/dist/esm/index.js +2 -1
  13. package/dist/esm/index.js.map +1 -1
  14. package/dist/esm/lib/BaseHistory.js +9 -0
  15. package/dist/esm/lib/BaseHistory.js.map +1 -1
  16. package/dist/esm/lib/BrowserHistory.js +1 -0
  17. package/dist/esm/lib/BrowserHistory.js.map +1 -1
  18. package/dist/esm/lib/BrowserHistoryHashStack.js +1 -0
  19. package/dist/esm/lib/BrowserHistoryHashStack.js.map +1 -1
  20. package/dist/esm/lib/BrowserHistoryStack.js +15 -0
  21. package/dist/esm/lib/BrowserHistoryStack.js.map +1 -1
  22. package/dist/esm/lib/MemoryHistory.js +4 -1
  23. package/dist/esm/lib/MemoryHistory.js.map +1 -1
  24. package/dist/esm/lib/{MemoryStack.js → MemoryHistoryStack.js} +12 -1
  25. package/dist/esm/lib/MemoryHistoryStack.js.map +1 -0
  26. package/dist/esm/lib/ProxyHistory.js +1 -0
  27. package/dist/esm/lib/ProxyHistory.js.map +1 -1
  28. package/dist/esm/lib/create-history.js +1 -0
  29. package/dist/esm/lib/create-history.js.map +1 -1
  30. package/dist/esm/lib/index.js +1 -1
  31. package/dist/esm/lib/index.js.map +1 -1
  32. package/dist/esm/lib/state/{history.actions.js → actions.js} +1 -1
  33. package/dist/esm/lib/state/actions.js.map +1 -0
  34. package/dist/esm/lib/state/check-blockers.js +36 -0
  35. package/dist/esm/lib/state/check-blockers.js.map +1 -0
  36. package/dist/esm/lib/state/create-flow.js +27 -0
  37. package/dist/esm/lib/state/create-flow.js.map +1 -0
  38. package/dist/esm/lib/state/{history.reducer.js → create-history-reducer.js} +5 -2
  39. package/dist/esm/lib/state/create-history-reducer.js.map +1 -0
  40. package/dist/esm/lib/state/create-store.js +26 -0
  41. package/dist/esm/lib/state/create-store.js.map +1 -0
  42. package/dist/esm/lib/state/flow-creators.js +7 -0
  43. package/dist/esm/lib/state/flow-creators.js.map +1 -0
  44. package/dist/esm/lib/state/go.js +12 -0
  45. package/dist/esm/lib/state/go.js.map +1 -0
  46. package/dist/esm/lib/state/history.state.js +1 -39
  47. package/dist/esm/lib/state/history.state.js.map +1 -1
  48. package/dist/esm/lib/state/index.js +3 -3
  49. package/dist/esm/lib/state/index.js.map +1 -1
  50. package/dist/esm/lib/state/navigate.js +43 -0
  51. package/dist/esm/lib/state/navigate.js.map +1 -0
  52. package/dist/esm/lib/state/pop.js +14 -0
  53. package/dist/esm/lib/state/pop.js.map +1 -0
  54. package/dist/esm/lib/state/validate-current-location.js +26 -0
  55. package/dist/esm/lib/state/validate-current-location.js.map +1 -0
  56. package/dist/esm/lib/utils/index.js +2 -2
  57. package/dist/esm/lib/utils/index.js.map +1 -1
  58. package/dist/esm/lib/utils/resolve-browser-location.js +1 -52
  59. package/dist/esm/lib/utils/resolve-browser-location.js.map +1 -1
  60. package/dist/esm/lib/utils/resolve-hash-location.js +20 -0
  61. package/dist/esm/lib/utils/resolve-hash-location.js.map +1 -0
  62. package/dist/esm/lib/utils/resolve-window-location.js +18 -0
  63. package/dist/esm/lib/utils/resolve-window-location.js.map +1 -0
  64. package/dist/esm/version.js +1 -1
  65. package/dist/tsconfig.tsbuildinfo +1 -1
  66. package/dist/types/NavigateEvent.d.ts +36 -0
  67. package/dist/types/NavigatedEvent.d.ts +28 -0
  68. package/dist/types/NavigationConfigurator.d.ts +3 -0
  69. package/dist/types/NavigationProvider.d.ts +3 -0
  70. package/dist/types/index.d.ts +2 -1
  71. package/dist/types/lib/BaseHistory.d.ts +8 -0
  72. package/dist/types/lib/BrowserHistoryHashStack.d.ts +1 -0
  73. package/dist/types/lib/BrowserHistoryStack.d.ts +14 -0
  74. package/dist/types/lib/MemoryHistory.d.ts +3 -0
  75. package/dist/types/lib/{MemoryStack.d.ts → MemoryHistoryStack.d.ts} +6 -0
  76. package/dist/types/lib/ProxyHistory.d.ts +1 -1
  77. package/dist/types/lib/index.d.ts +1 -1
  78. package/dist/types/lib/state/check-blockers.d.ts +3 -0
  79. package/dist/types/lib/state/create-flow.d.ts +10 -0
  80. package/dist/types/lib/state/{history.reducer.d.ts → create-history-reducer.d.ts} +32 -32
  81. package/dist/types/lib/state/create-store.d.ts +17 -0
  82. package/dist/types/lib/state/flow-creators.d.ts +7 -0
  83. package/dist/types/lib/state/go.d.ts +3 -0
  84. package/dist/types/lib/state/history.state.d.ts +2 -23
  85. package/dist/types/lib/state/index.d.ts +4 -3
  86. package/dist/types/lib/state/navigate.d.ts +9 -0
  87. package/dist/types/lib/state/pop.d.ts +3 -0
  88. package/dist/types/lib/state/validate-current-location.d.ts +3 -0
  89. package/dist/types/lib/types.d.ts +1 -1
  90. package/dist/types/lib/utils/index.d.ts +2 -2
  91. package/dist/types/lib/utils/resolve-browser-location.d.ts +1 -42
  92. package/dist/types/lib/utils/resolve-hash-location.d.ts +10 -0
  93. package/dist/types/lib/utils/resolve-window-location.d.ts +10 -0
  94. package/dist/types/version.d.ts +1 -1
  95. package/package.json +8 -8
  96. package/src/NavigateEvent.ts +47 -0
  97. package/src/NavigatedEvent.ts +35 -0
  98. package/src/NavigationConfigurator.ts +13 -3
  99. package/src/NavigationProvider.interface.ts +1 -1
  100. package/src/NavigationProvider.ts +8 -2
  101. package/src/enable-navigation.ts +1 -0
  102. package/src/index.ts +2 -6
  103. package/src/lib/BaseHistory.ts +9 -0
  104. package/src/lib/BrowserHistory.ts +1 -0
  105. package/src/lib/BrowserHistoryHashStack.ts +1 -0
  106. package/src/lib/BrowserHistoryStack.ts +15 -0
  107. package/src/lib/MemoryHistory.ts +4 -1
  108. package/src/lib/{MemoryStack.ts → MemoryHistoryStack.ts} +11 -0
  109. package/src/lib/ProxyHistory.ts +2 -1
  110. package/src/lib/create-history.ts +1 -0
  111. package/src/lib/index.ts +1 -1
  112. package/src/lib/state/check-blockers.ts +52 -0
  113. package/src/lib/state/create-flow.ts +36 -0
  114. package/src/lib/state/{history.reducer.ts → create-history-reducer.ts} +4 -1
  115. package/src/lib/state/create-store.ts +39 -0
  116. package/src/lib/state/flow-creators.ts +7 -0
  117. package/src/lib/state/go.ts +20 -0
  118. package/src/lib/state/history.state.ts +2 -56
  119. package/src/lib/state/index.ts +4 -3
  120. package/src/lib/state/navigate.ts +58 -0
  121. package/src/lib/state/pop.ts +24 -0
  122. package/src/lib/state/validate-current-location.ts +33 -0
  123. package/src/lib/types.ts +1 -1
  124. package/src/lib/utils/index.ts +2 -2
  125. package/src/lib/utils/resolve-browser-location.ts +1 -60
  126. package/src/lib/utils/resolve-hash-location.ts +26 -0
  127. package/src/lib/utils/resolve-window-location.ts +24 -0
  128. package/src/version.ts +1 -1
  129. package/dist/esm/events.js +0 -40
  130. package/dist/esm/events.js.map +0 -1
  131. package/dist/esm/lib/MemoryStack.js.map +0 -1
  132. package/dist/esm/lib/state/history.actions.js.map +0 -1
  133. package/dist/esm/lib/state/history.flows.js +0 -207
  134. package/dist/esm/lib/state/history.flows.js.map +0 -1
  135. package/dist/esm/lib/state/history.reducer.js.map +0 -1
  136. package/dist/types/events.d.ts +0 -65
  137. package/dist/types/lib/state/history.flows.d.ts +0 -97
  138. package/src/events.ts +0 -82
  139. package/src/lib/state/history.flows.ts +0 -274
  140. /package/dist/types/lib/state/{history.actions.d.ts → actions.d.ts} +0 -0
  141. /package/src/lib/state/{history.actions.ts → actions.ts} +0 -0
@@ -68,4 +68,4 @@ export const actions = {
68
68
  addBlocker: addBlockerAction,
69
69
  removeBlocker: removeBlockerAction,
70
70
  };
71
- //# sourceMappingURL=history.actions.js.map
71
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../../src/lib/state/actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAErF,OAAO,EAAE,EAAE,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC;AAGxC;;GAEG;AACH,MAAM,cAAc,GAAG,iBAAiB,CACtC,qBAAqB,EACrB,CAAC,EAAM,EAAE,OAAwB,EAAE,EAAE,CAAC,CAAC;IACrC,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE;IACxB,IAAI,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE;CAC5B,CAAC,EACF,CAAC,MAAwB,EAAE,EAAE,CAAC,CAAC;IAC7B,OAAO,EAAE,EAAE,MAAM,EAAE;CACpB,CAAC,EACF,CAAC,KAAY,EAAE,EAAE,CAAC,CAAC;IACjB,OAAO,EAAE,EAAE,KAAK,EAAE;CACnB,CAAC,CACH,CAAC;AAEF,MAAM,mBAAmB,GAAG,YAAY,CAAC,4BAA4B,EAAE,CAAC,MAAe,EAAE,EAAE,CAAC,CAAC;IAC3F,OAAO,EAAE,EAAE,MAAM,EAAE;CACpB,CAAC,CAAC,CAAC;AAEJ;;GAEG;AACH,MAAM,aAAa,GAAG,iBAAiB,CACrC,eAAe,EACf,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC;IAClB,OAAO,EAAE,EAAE,KAAK,EAAE;CACnB,CAAC,EACF,CAAC,MAAwB,EAAE,EAAE,CAAC,CAAC;IAC7B,OAAO,EAAE,EAAE,MAAM,EAAE;CACpB,CAAC,EACF,CAAC,KAAY,EAAE,EAAE,CAAC,CAAC;IACjB,OAAO,EAAE,EAAE,KAAK,EAAE;CACnB,CAAC,CACH,CAAC;AAEF;;GAEG;AACH,MAAM,cAAc,GAAG,iBAAiB,CACtC,gBAAgB,EAChB,CAAC,MAAyB,EAAE,EAAE,CAAC,CAAC;IAC9B,OAAO,EAAE,EAAE,MAAM,EAAE;CACpB,CAAC,EACF,CAAC,MAAwB,EAAE,EAAE,CAAC,CAAC;IAC7B,OAAO,EAAE,EAAE,MAAM,EAAE;CACpB,CAAC,EACF,CAAC,KAAY,EAAE,EAAE,CAAC,CAAC;IACjB,OAAO,EAAE,EAAE,KAAK,EAAE;CACnB,CAAC,CACH,CAAC;AAEF;;GAEG;AACH,MAAM,sBAAsB,GAAG,iBAAiB,CAC9C,iCAAiC,EACjC,GAAG,EAAE,CAAC,CAAC;IACL,OAAO,EAAE,EAAE;CACZ,CAAC,EACF,CAAC,MAAwB,EAAE,EAAE,CAAC,CAAC;IAC7B,OAAO,EAAE,EAAE,MAAM,EAAE;CACpB,CAAC,EACF,CAAC,KAAY,EAAE,EAAE,CAAC,CAAC;IACjB,OAAO,EAAE,EAAE,KAAK,EAAE;CACnB,CAAC,CACH,CAAC;AAEF;;GAEG;AACH,MAAM,gBAAgB,GAAG,YAAY,CAAC,uBAAuB,EAAE,CAAC,OAA0B,EAAE,EAAE,CAAC,CAAC;IAC9F,OAAO,EAAE,EAAE,OAAO,EAAE;CACrB,CAAC,CAAC,CAAC;AAEJ;;GAEG;AACH,MAAM,mBAAmB,GAAG,YAAY,CACtC,0BAA0B,EAC1B,CAAC,OAA0B,EAAE,EAAE,CAAC,CAAC;IAC/B,OAAO,EAAE,EAAE,OAAO,EAAE;CACrB,CAAC,CACH,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,QAAQ,EAAE,cAAc;IACxB,aAAa,EAAE,mBAAmB;IAClC,EAAE,EAAE,aAAa;IACjB,GAAG,EAAE,cAAc;IACnB,gBAAgB,EAAE,sBAAsB;IACxC,UAAU,EAAE,gBAAgB;IAC5B,aAAa,EAAE,mBAAmB;CACnC,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { Observable, of } from 'rxjs';
2
+ import { concatMap, map, withLatestFrom } from 'rxjs/operators';
3
+ import { actions } from './actions';
4
+ import { filterAction } from '@equinor/fusion-observable/operators';
5
+ import { Action } from '../types';
6
+ /** Flow creator that gates navigation actions through registered blockers. */
7
+ export const checkBlockers = (stack) => (action$, state$) =>
8
+ // Normalize each navigation-related action into a common shape before gating on blockers.
9
+ action$.pipe(filterAction(actions.navigate.type, actions.pop.type, actions.go.type, actions.validateLocation.type), map((action) => {
10
+ // Only `navigate` carries a replace flag; the rest are treated as POP transitions.
11
+ switch (action.type) {
12
+ case actions.navigate.type:
13
+ return { replace: action.payload.options.replace, action };
14
+ case actions.go.type:
15
+ case actions.pop.type:
16
+ case actions.validateLocation.type:
17
+ return { type: 'POP', action };
18
+ }
19
+ }), withLatestFrom(state$), concatMap(([{ action, replace }, state]) => {
20
+ // Allow actions through immediately when no blocker can veto the transition.
21
+ if (!state.blockers.length) {
22
+ return of(action);
23
+ }
24
+ return new Observable((subscriber) => {
25
+ const location = stack.current;
26
+ // Invoke all blockers and complete once every asynchronous decision settles.
27
+ const blockers = state.blockers.map((blocker) => Promise.resolve(blocker({
28
+ delta: 0,
29
+ action: replace ? Action.Replace : Action.Push,
30
+ location,
31
+ retry: () => subscriber.next(action),
32
+ })));
33
+ Promise.allSettled(blockers).then(() => subscriber.complete());
34
+ });
35
+ }));
36
+ //# sourceMappingURL=check-blockers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-blockers.js","sourceRoot":"","sources":["../../../../src/lib/state/check-blockers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,EAAE,OAAO,EAAgB,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,MAAM,EAAyC,MAAM,UAAU,CAAC;AAEzE,8EAA8E;AAC9E,MAAM,CAAC,MAAM,aAAa,GACxB,CAAC,KAAmB,EAAE,EAAE,CAAC,CAAC,OAA4B,EAAE,MAAiC,EAAE,EAAE;AAC3F,0FAA0F;AAC1F,OAAO,CAAC,IAAI,CACV,YAAY,CACV,OAAO,CAAC,QAAQ,CAAC,IAAI,EACrB,OAAO,CAAC,GAAG,CAAC,IAAI,EAChB,OAAO,CAAC,EAAE,CAAC,IAAI,EACf,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAC9B,EACD,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;IACb,mFAAmF;IACnF,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,OAAO,CAAC,QAAQ,CAAC,IAAI;YACxB,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAC7D,KAAK,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC;QACrB,KAAK,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB,KAAK,OAAO,CAAC,gBAAgB,CAAC,IAAI;YAChC,OAAO,EAAE,IAAI,EAAE,KAAe,EAAE,MAAM,EAAE,CAAC;IAC7C,CAAC;AACH,CAAC,CAAC,EACF,cAAc,CAAC,MAAM,CAAC,EACtB,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE;IACzC,6EAA6E;IAC7E,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,IAAI,UAAU,CAAU,CAAC,UAAU,EAAE,EAAE;QAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;QAC/B,6EAA6E;QAC7E,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAC9C,OAAO,CAAC,OAAO,CACb,OAAO,CAAC;YACN,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI;YAC9C,QAAQ;YACR,KAAK,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;SACrC,CAAC,CACH,CACF,CAAC;QACF,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CACH,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { merge } from 'rxjs';
2
+ import { checkBlockers } from './check-blockers';
3
+ /**
4
+ * Creates a combined history flow from multiple flow creators.
5
+ * @param flowCreators - Flow creators to combine.
6
+ * @param options - Optional blocker configuration.
7
+ * @returns A combined history flow creator.
8
+ */
9
+ export const createFlow = (flowCreators, options) => {
10
+ return (stack) => {
11
+ const preProcessActions = options?.skipBlockCheck
12
+ ? (action$) => action$
13
+ : checkBlockers(stack);
14
+ const flows = (action$, state$) => {
15
+ // Initialize each creator against the same stack before merging their action streams.
16
+ const initializedFlows = flowCreators
17
+ .map((initializer) => initializer(stack))
18
+ .map((flow) => flow(action$, state$));
19
+ return merge(...initializedFlows);
20
+ };
21
+ return (action$, state$) => {
22
+ // Gate actions before dispatching them to the parallel history flows.
23
+ return preProcessActions(action$, state$).pipe((source$) => flows(source$, state$));
24
+ };
25
+ };
26
+ };
27
+ //# sourceMappingURL=create-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-flow.js","sourceRoot":"","sources":["../../../../src/lib/state/create-flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAmB,MAAM,MAAM,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAIjD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,YAAkC,EAClC,OAAsC,EAClB,EAAE;IACtB,OAAO,CAAC,KAAmB,EAAe,EAAE;QAC1C,MAAM,iBAAiB,GAAG,OAAO,EAAE,cAAc;YAC/C,CAAC,CAAC,CAAC,OAA4B,EAAE,EAAE,CAAC,OAAO;YAC3C,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACzB,MAAM,KAAK,GAAgB,CACzB,OAA4B,EAC5B,MAAiC,EACjC,EAAE;YACF,sFAAsF;YACtF,MAAM,gBAAgB,GAAG,YAAY;iBAClC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;iBACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YACxC,OAAO,KAAK,CAAC,GAAG,gBAAgB,CAAC,CAAC;QACpC,CAAC,CAAC;QACF,OAAO,CAAC,OAA4B,EAAE,MAAiC,EAAE,EAAE;YACzE,sEAAsE;YACtE,OAAO,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QACtF,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC,CAAC"}
@@ -1,11 +1,12 @@
1
1
  import { createReducer } from '@equinor/fusion-observable';
2
- import { actions } from './history.actions';
2
+ import { actions } from './actions';
3
3
  import { isSuccessAction } from '@equinor/fusion-observable/actions';
4
4
  /**
5
5
  * Finds the index of the current location in the history array.
6
6
  * Used to determine where to insert/replace entries for REPLACE actions.
7
7
  */
8
8
  const findIndex = (state) => {
9
+ // Locate the current entry by key rather than reference, since updates are cloned.
9
10
  return state.history.findIndex((update) => update.location.key === state.current.location.key);
10
11
  };
11
12
  /**
@@ -38,6 +39,7 @@ export const createHistoryReducer = (initial, options) => {
38
39
  // and removes any forward history when not at the end
39
40
  if (update.action === 'REPLACE') {
40
41
  const currentIndex = findIndex(state);
42
+ // Only trim when the current entry is actually present in history.
41
43
  if (currentIndex !== -1) {
42
44
  // Remove all entries from current position onwards
43
45
  state.history.splice(currentIndex, state.history.length - currentIndex);
@@ -53,6 +55,7 @@ export const createHistoryReducer = (initial, options) => {
53
55
  // Limit history size to prevent unbounded growth
54
56
  // This matcher always runs (returns true) to check history length after every action
55
57
  builder.addMatcher(() => true, (state) => {
58
+ // Trim only once history has actually grown past the configured cap.
56
59
  if (state.history.length > maxHistory) {
57
60
  // Keep only the most recent entries, removing oldest ones
58
61
  state.history = state.history.slice(-maxHistory);
@@ -60,4 +63,4 @@ export const createHistoryReducer = (initial, options) => {
60
63
  });
61
64
  });
62
65
  };
63
- //# sourceMappingURL=history.reducer.js.map
66
+ //# sourceMappingURL=create-history-reducer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-history-reducer.js","sourceRoot":"","sources":["../../../../src/lib/state/create-history-reducer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,EAAE,OAAO,EAAgB,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAErE;;;GAGG;AACH,MAAM,SAAS,GAAG,CAAC,KAAoB,EAAE,EAAE;IACzC,mFAAmF;IACnF,OAAO,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACjG,CAAC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,OAAiD,EACjD,OAAiC,EACjC,EAAE;IACF,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,GAAG,CAAC;IAE9C,MAAM,YAAY,GAChB,OAAO,YAAY,QAAQ;QACzB,CAAC,CAAC,OAAO,EAAE;QACX,CAAC,CAAE;YACC,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,CAAC,OAAO,CAAC;YAClB,QAAQ,EAAE,EAAE;SACY,CAAC;IAEjC,OAAO,aAAa,CAAyB,YAAY,EAAE,CAAC,OAAO,EAAE,EAAE;QACrE,0DAA0D;QAC1D,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC1D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;YAClC,gFAAgF;YAChF,sEAAsE;YACtE,sDAAsD;YACtD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;gBACtC,mEAAmE;gBACnE,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;oBACxB,mDAAmD;oBACnD,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;YACD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,+EAA+E;QAC/E,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACpD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;YAClC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,iDAAiD;QACjD,qFAAqF;QACrF,OAAO,CAAC,UAAU,CAChB,GAAG,EAAE,CAAC,IAAI,EACV,CAAC,KAAK,EAAE,EAAE;YACR,qEAAqE;YACrE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;gBACtC,0DAA0D;gBAC1D,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;YACnD,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { createState } from '@equinor/fusion-observable';
2
+ import { actions } from './actions';
3
+ import { flowCreators } from './flow-creators';
4
+ import { createFlow } from './create-flow';
5
+ /**
6
+ * Creates a history store with the specified stack and reducer.
7
+ * @param stack - The history stack implementation.
8
+ * @param reducer - The reducer that handles state transitions.
9
+ * @param options - Optional flow configuration.
10
+ * @returns A fully-initialized history state with flows attached.
11
+ */
12
+ export const createStore = (stack, reducer, options) => {
13
+ // Attach the stack onto the created state so flows can reach it without prop-drilling.
14
+ const state = Object.assign(createState(actions, reducer), { stack });
15
+ const flows = new Set(options?.flows ?? [flowCreators.navigate, flowCreators.go, flowCreators.pop]);
16
+ // Validation is opt-in since it re-checks the current location on every relevant action.
17
+ if (options?.validateCurrentLocation) {
18
+ flows.add(flowCreators.validateCurrentLocation);
19
+ }
20
+ const flow = createFlow([...flows], {
21
+ skipBlockCheck: options?.skipBlockCheck,
22
+ });
23
+ state.subject.addFlow(flow(stack));
24
+ return state;
25
+ };
26
+ //# sourceMappingURL=create-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-store.js","sourceRoot":"","sources":["../../../../src/lib/state/create-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAgC,MAAM,4BAA4B,CAAC;AACvF,OAAO,EAAE,OAAO,EAAgB,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAK3C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,KAAmB,EACnB,OAAwD,EACxD,OAIC,EACa,EAAE;IAChB,uFAAuF;IACvF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,CAAiB,CAAC;IACtF,MAAM,KAAK,GAAG,IAAI,GAAG,CACnB,OAAO,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,EAAE,YAAY,CAAC,GAAG,CAAC,CAC7E,CAAC;IACF,yFAAyF;IACzF,IAAI,OAAO,EAAE,uBAAuB,EAAE,CAAC;QACrC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE;QAClC,cAAc,EAAE,OAAO,EAAE,cAAc;KACxC,CAAC,CAAC;IACH,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { go } from './go';
2
+ import { navigate } from './navigate';
3
+ import { pop } from './pop';
4
+ import { validateCurrentLocation } from './validate-current-location';
5
+ /** Collection of flow creators for history state management. */
6
+ export const flowCreators = { navigate, go, pop, validateCurrentLocation };
7
+ //# sourceMappingURL=flow-creators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-creators.js","sourceRoot":"","sources":["../../../../src/lib/state/flow-creators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,gEAAgE;AAChE,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { map, withLatestFrom } from 'rxjs/operators';
2
+ import { actions } from './actions';
3
+ import { filterAction } from '@equinor/fusion-observable/operators';
4
+ import { Action } from '../types';
5
+ /** Flow creator for handling go back and forward actions. */
6
+ export const go = (stack) => (action$, state$) =>
7
+ // Move the stack by the requested delta and emit the resulting location.
8
+ action$.pipe(filterAction(actions.go.type), withLatestFrom(state$), map(([action, state]) => {
9
+ stack.go(action.payload.delta, state);
10
+ return actions.go.success({ delta: 0, action: Action.Pop, location: stack.current });
11
+ }));
12
+ //# sourceMappingURL=go.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go.js","sourceRoot":"","sources":["../../../../src/lib/state/go.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,OAAO,EAAgB,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAEpE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,6DAA6D;AAC7D,MAAM,CAAC,MAAM,EAAE,GACb,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAA4B,EAAE,MAAiC,EAAE,EAAE;AAC7E,yEAAyE;AACzE,OAAO,CAAC,IAAI,CACV,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,EAC7B,cAAc,CAAC,MAAM,CAAC,EACtB,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE;IACtB,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACtC,OAAO,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AACvF,CAAC,CAAC,CACH,CAAC"}
@@ -1,43 +1,5 @@
1
- import { createState, } from '@equinor/fusion-observable';
2
- import { actions } from './history.actions';
3
- import { flowCreators, createFlow } from './history.flows';
1
+ export {};
4
2
  /**
5
3
  * Default flows for history state management.
6
4
  */
7
- export const defaultFlows = [flowCreators.navigate, flowCreators.go, flowCreators.pop];
8
- /**
9
- * Creates a history store with the specified stack and reducer.
10
- *
11
- * Combines the reactive state container with a {@link HistoryStack} and wires
12
- * up navigation flows for action processing.
13
- *
14
- * @param stack - The history stack implementation (browser, hash, or memory)
15
- * @param reducer - The reducer that handles state transitions
16
- * @param options - Optional configuration options
17
- * @param options.flows - Custom flow creators (defaults to {@link defaultFlows})
18
- * @param options.skipBlockCheck - Skip blocker checking in flows
19
- * @param options.validateCurrentLocation - Add location validation flow
20
- * @returns A fully-initialized {@link HistoryState} with flows attached
21
- */
22
- export const createStore = (stack, reducer, options) => {
23
- // Create base state with actions and reducer, then add stack property
24
- // The stack is stored alongside the flow state for use in flows
25
- const state = Object.assign(createState(actions, reducer), { stack });
26
- // Build set of flows to use (default flows or custom flows)
27
- // Use Set to ensure no duplicates if validateCurrentLocation is added
28
- const flows = new Set(options?.flows ?? defaultFlows);
29
- // Optionally add validation flow to check location consistency
30
- if (options?.validateCurrentLocation) {
31
- flows.add(flowCreators.validateCurrentLocation);
32
- }
33
- // Create combined flow from all flow creators
34
- // This merges all flows so they process actions in parallel
35
- const flow = createFlow([...flows], {
36
- skipBlockCheck: options?.skipBlockCheck,
37
- });
38
- // Initialize the flow with the stack and add it to the state subject
39
- // The flow processes actions and updates state through the reducer
40
- state.subject.addFlow(flow(stack));
41
- return state;
42
- };
43
5
  //# sourceMappingURL=history.state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"history.state.js","sourceRoot":"","sources":["../../../../src/lib/state/history.state.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,GAGZ,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,OAAO,EAAgB,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,UAAU,EAA2B,MAAM,iBAAiB,CAAC;AAUpF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;AAEvF;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,KAAmB,EACnB,OAAwD,EACxD,OAIC,EACa,EAAE;IAChB,sEAAsE;IACtE,gEAAgE;IAChE,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,CAAiB,CAAC;IAEtF,4DAA4D;IAC5D,sEAAsE;IACtE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAqB,OAAO,EAAE,KAAK,IAAI,YAAY,CAAC,CAAC;IAC1E,+DAA+D;IAC/D,IAAI,OAAO,EAAE,uBAAuB,EAAE,CAAC;QACrC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC;IAClD,CAAC;IAED,8CAA8C;IAC9C,4DAA4D;IAC5D,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE;QAClC,cAAc,EAAE,OAAO,EAAE,cAAc;KACxC,CAAC,CAAC;IAEH,qEAAqE;IACrE,mEAAmE;IACnE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAEnC,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
1
+ {"version":3,"file":"history.state.js","sourceRoot":"","sources":["../../../../src/lib/state/history.state.ts"],"names":[],"mappings":";AAWA;;GAEG"}
@@ -1,4 +1,4 @@
1
- export { createStore } from './history.state';
2
- export { createHistoryReducer } from './history.reducer';
3
- export { actions } from './history.actions';
1
+ export { createStore } from './create-store';
2
+ export { createHistoryReducer } from './create-history-reducer';
3
+ export { actions } from './actions';
4
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/state/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqB,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAgB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/state/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,OAAO,EAAgB,MAAM,WAAW,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { map } from 'rxjs/operators';
2
+ import { filterAction } from '@equinor/fusion-observable/operators';
3
+ import { actions } from './actions';
4
+ import { resolvePath } from '../utils';
5
+ import { Action } from '../types';
6
+ const compareLocation = (a, b) => {
7
+ return (a.hash === b.hash &&
8
+ a.search === b.search &&
9
+ a.pathname === b.pathname &&
10
+ JSON.stringify(a.state) === JSON.stringify(b.state));
11
+ };
12
+ /** Flow creator for handling navigate actions. */
13
+ export const navigate = (stack) => (action$) => {
14
+ const { navigate } = actions;
15
+ // Transform matching navigation actions into stack updates and success actions.
16
+ return action$.pipe(filterAction(navigate.type), map((action) => {
17
+ const { payload, meta } = action;
18
+ const path = resolvePath(payload.to);
19
+ const nextLocation = {
20
+ ...path,
21
+ key: meta.key,
22
+ state: payload.options.state,
23
+ unstable_mask: undefined,
24
+ };
25
+ // Abort duplicate navigations to prevent a feedback loop in history state.
26
+ if (compareLocation(nextLocation, stack.current)) {
27
+ return actions.abortNavigate('Location is the same as the current location');
28
+ }
29
+ // Apply replacement or append semantics selected by the navigation request.
30
+ if (payload.options.replace) {
31
+ stack.replace(nextLocation);
32
+ }
33
+ else {
34
+ stack.push(nextLocation);
35
+ }
36
+ return navigate.success({
37
+ delta: 0,
38
+ action: payload.options.replace ? Action.Replace : Action.Push,
39
+ location: nextLocation,
40
+ });
41
+ }));
42
+ };
43
+ //# sourceMappingURL=navigate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigate.js","sourceRoot":"","sources":["../../../../src/lib/state/navigate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAErC,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,OAAO,EAAgB,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAwD,MAAM,EAAE,MAAM,UAAU,CAAC;AAQxF,MAAM,eAAe,GAAG,CAAC,CAAW,EAAE,CAAW,EAAW,EAAE;IAC5D,OAAO,CACL,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;QACjB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QACrB,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ;QACzB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CACpD,CAAC;AACJ,CAAC,CAAC;AAEF,kDAAkD;AAClD,MAAM,CAAC,MAAM,QAAQ,GACnB,CAAC,KAAmB,EAAe,EAAE,CACrC,CAAC,OAA4B,EAAE,EAAE;IAC/B,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC7B,gFAAgF;IAChF,OAAO,OAAO,CAAC,IAAI,CACjB,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAC3B,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACb,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QACjC,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,YAAY,GAAG;YACnB,GAAG,IAAI;YACP,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK;YAC5B,aAAa,EAAE,SAAS;SACN,CAAC;QACrB,2EAA2E;QAC3E,IAAI,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACjD,OAAO,OAAO,CAAC,aAAa,CAAC,8CAA8C,CAAC,CAAC;QAC/E,CAAC;QACD,4EAA4E;QAC5E,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC5B,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,QAAQ,CAAC,OAAO,CAAC;YACtB,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI;YAC9D,QAAQ,EAAE,YAAY;SACvB,CAAC,CAAC;IACL,CAAC,CAAC,CACH,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { Observable } from 'rxjs';
2
+ import { concatMap } from 'rxjs/operators';
3
+ import { actions } from './actions';
4
+ import { filterAction } from '@equinor/fusion-observable/operators';
5
+ import { Action } from '../types';
6
+ /** Flow creator for handling POP actions from browser navigation. */
7
+ export const pop = (stack) => (action$) =>
8
+ // Translate a browser-driven POP into a success action carrying its location.
9
+ action$.pipe(filterAction(actions.pop.type), concatMap((action) => new Observable((subscriber) => {
10
+ const currentLocation = action.payload.update?.location ?? stack.current;
11
+ subscriber.next(actions.pop.success({ delta: 0, action: Action.Pop, location: currentLocation }));
12
+ subscriber.complete();
13
+ })));
14
+ //# sourceMappingURL=pop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pop.js","sourceRoot":"","sources":["../../../../src/lib/state/pop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,OAAO,EAAgB,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAEpE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,qEAAqE;AACrE,MAAM,CAAC,MAAM,GAAG,GAAuB,CAAC,KAAmB,EAAE,EAAE,CAAC,CAAC,OAA4B,EAAE,EAAE;AAC/F,8EAA8E;AAC9E,OAAO,CAAC,IAAI,CACV,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAC9B,SAAS,CACP,CAAC,MAAM,EAAE,EAAE,CACT,IAAI,UAAU,CAAU,CAAC,UAAU,EAAE,EAAE;IACrC,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC;IACzE,UAAU,CAAC,IAAI,CACb,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CACjF,CAAC;IACF,UAAU,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC,CAAC,CACL,CACF,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { map, withLatestFrom } from 'rxjs/operators';
2
+ import { actions } from './actions';
3
+ import { filterAction } from '@equinor/fusion-observable/operators';
4
+ import { Action } from '../types';
5
+ /** Flow creator that validates the current stack location against reducer state. */
6
+ export const validateCurrentLocation = (stack) => (action$, state$) =>
7
+ // Confirm the browser stack's current key still matches reducer state.
8
+ action$.pipe(filterAction(actions.validateLocation.type), withLatestFrom(state$), map(([, state]) => {
9
+ const currentLocation = stack.current;
10
+ // Find the reducer entry matching the stack key before comparing location state.
11
+ const record = state.history.find(({ location }) => location?.key === currentLocation?.key);
12
+ // Reject validation when the browser stack key is absent from reducer state.
13
+ if (!record) {
14
+ return actions.validateLocation.failure(new Error('Stack state not found'));
15
+ }
16
+ // Reject validation when the stack and reducer carry different location state.
17
+ if (record.location?.state !== currentLocation?.state) {
18
+ return actions.validateLocation.failure(new Error('Stack state mismatch'));
19
+ }
20
+ return actions.validateLocation.success({
21
+ delta: 0,
22
+ action: Action.Pop,
23
+ location: currentLocation,
24
+ });
25
+ }));
26
+ //# sourceMappingURL=validate-current-location.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-current-location.js","sourceRoot":"","sources":["../../../../src/lib/state/validate-current-location.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,OAAO,EAAgB,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,MAAM,EAAyC,MAAM,UAAU,CAAC;AAEzE,oFAAoF;AACpF,MAAM,CAAC,MAAM,uBAAuB,GAClC,CAAC,KAAmB,EAAE,EAAE,CAAC,CAAC,OAA4B,EAAE,MAAiC,EAAE,EAAE;AAC3F,uEAAuE;AACvE,OAAO,CAAC,IAAI,CACV,YAAY,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAC3C,cAAc,CAAC,MAAM,CAAC,EACtB,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE;IAChB,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC;IACtC,iFAAiF;IACjF,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,eAAe,EAAE,GAAG,CAAC,CAAC;IAC5F,6EAA6E;IAC7E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAC9E,CAAC;IACD,+EAA+E;IAC/E,IAAI,MAAM,CAAC,QAAQ,EAAE,KAAK,KAAK,eAAe,EAAE,KAAK,EAAE,CAAC;QACtD,OAAO,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC;QACtC,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,MAAM,CAAC,GAAG;QAClB,QAAQ,EAAE,eAAe;KAC1B,CAAC,CAAC;AACL,CAAC,CAAC,CACH,CAAC"}
@@ -1,6 +1,6 @@
1
1
  export { pathToString } from './path-to-string';
2
2
  export { pathToUrl } from './path-to-url';
3
3
  export { resolvePath } from './resolve-path';
4
- export { resolveWindowLocation } from './resolve-browser-location';
5
- export { resolveHashLocation } from './resolve-browser-location';
4
+ export { resolveWindowLocation } from './resolve-window-location';
5
+ export { resolveHashLocation } from './resolve-hash-location';
6
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -1,53 +1,2 @@
1
- import { resolvePath } from './resolve-path';
2
- const resolveState = (target) => {
3
- const { value, key = 'unknown' } = (target ?? window.history).state ??
4
- {};
5
- return { state: value, key };
6
- };
7
- /**
8
- * Resolves the current location from window.location.
9
- *
10
- * @param window - The window object to extract location from
11
- * @param target - Optional target object with state
12
- * @returns The current location with pathname, search, hash, state, and key
13
- *
14
- * @example
15
- * ```ts
16
- * // If window.location is 'https://example.com/users?id=1#section'
17
- * resolveWindowLocation(window)
18
- * // { pathname: '/users', search: '?id=1', hash: '#section', state: undefined, key: 'unknown' }
19
- *
20
- * resolveWindowLocation(window, { state: { userId: 123 } })
21
- * // { pathname: '/users', search: '?id=1', hash: '#section', state: { userId: 123 }, key: 'abc123' }
22
- * ```
23
- */
24
- export const resolveWindowLocation = (window, target) => {
25
- const { pathname, search, hash } = resolvePath(window.location);
26
- const { state, key } = resolveState(target);
27
- return { pathname, search, hash, state, key, unstable_mask: undefined };
28
- };
29
- /**
30
- * Resolves the current location from window.location.hash.
31
- *
32
- * @param window - The window object to extract location from
33
- * @param target - Optional target object with state
34
- * @returns The current location with pathname, search, hash, state, and key
35
- *
36
- * @example
37
- * ```ts
38
- * // If window.location.hash is '#/users?id=1#section'
39
- * resolveHashLocation(window)
40
- * // { pathname: '/users', search: '?id=1', hash: '#section', state: undefined, key: 'unknown' }
41
- *
42
- * // If window.location.hash is '#/dashboard'
43
- * resolveHashLocation(window)
44
- * // { pathname: '/dashboard', search: '', hash: '', state: undefined, key: 'unknown' }
45
- * ```
46
- */
47
- export const resolveHashLocation = (window, target) => {
48
- const location = resolveWindowLocation(window, target);
49
- const { pathname, search, hash } = resolvePath(location.hash?.replace('#', '') ?? '');
50
- const { state, key } = resolveState(target);
51
- return { pathname, search, hash, state, key, unstable_mask: undefined };
52
- };
1
+ export { resolveWindowLocation } from './resolve-window-location';
53
2
  //# sourceMappingURL=resolve-browser-location.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-browser-location.js","sourceRoot":"","sources":["../../../../src/lib/utils/resolve-browser-location.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,YAAY,GAAG,CAAC,MAA2B,EAAmC,EAAE;IACpF,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,SAAS,EAAE,GAC9B,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK;QAC/B,EAGC,CAAC;IACL,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC/B,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAAc,EAAE,MAA2B,EAAY,EAAE;IAC7F,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;AAC1E,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAc,EAAE,MAA2B,EAAY,EAAE;IAC3F,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvD,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IACtF,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;AAC1E,CAAC,CAAC"}
1
+ {"version":3,"file":"resolve-browser-location.js","sourceRoot":"","sources":["../../../../src/lib/utils/resolve-browser-location.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { resolvePath } from './resolve-path';
2
+ import { resolveWindowLocation } from './resolve-window-location';
3
+ const resolveState = (target) => {
4
+ const { value, key = 'unknown' } = (target ?? window.history).state ??
5
+ {};
6
+ return { state: value, key };
7
+ };
8
+ /**
9
+ * Resolves the current location from window.location.hash.
10
+ * @param window - The window object to extract location from.
11
+ * @param target - Optional target object with state.
12
+ * @returns The current hash-based navigation location.
13
+ */
14
+ export const resolveHashLocation = (window, target) => {
15
+ const location = resolveWindowLocation(window, target);
16
+ const { pathname, search, hash } = resolvePath(location.hash?.replace('#', '') ?? '');
17
+ const { state, key } = resolveState(target);
18
+ return { pathname, search, hash, state, key, unstable_mask: undefined };
19
+ };
20
+ //# sourceMappingURL=resolve-hash-location.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-hash-location.js","sourceRoot":"","sources":["../../../../src/lib/utils/resolve-hash-location.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,MAAM,YAAY,GAAG,CAAC,MAA2B,EAAmC,EAAE;IACpF,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,SAAS,EAAE,GAC9B,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK;QAC/B,EAGC,CAAC;IACL,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC/B,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAc,EAAE,MAA2B,EAAY,EAAE;IAC3F,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvD,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IACtF,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;AAC1E,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { resolvePath } from './resolve-path';
2
+ const resolveState = (target) => {
3
+ const { value, key = 'unknown' } = (target ?? window.history).state ??
4
+ {};
5
+ return { state: value, key };
6
+ };
7
+ /**
8
+ * Resolves the current location from window.location.
9
+ * @param window - The window object to extract location from.
10
+ * @param target - Optional target object with state.
11
+ * @returns The current browser navigation location.
12
+ */
13
+ export const resolveWindowLocation = (window, target) => {
14
+ const { pathname, search, hash } = resolvePath(window.location);
15
+ const { state, key } = resolveState(target);
16
+ return { pathname, search, hash, state, key, unstable_mask: undefined };
17
+ };
18
+ //# sourceMappingURL=resolve-window-location.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-window-location.js","sourceRoot":"","sources":["../../../../src/lib/utils/resolve-window-location.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,YAAY,GAAG,CAAC,MAA2B,EAAmC,EAAE;IACpF,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,SAAS,EAAE,GAC9B,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK;QAC/B,EAGC,CAAC;IACL,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC/B,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAAc,EAAE,MAA2B,EAAY,EAAE;IAC7F,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;AAC1E,CAAC,CAAC"}
@@ -1,3 +1,3 @@
1
1
  // Generated by genversion.
2
- export const version = '7.0.4';
2
+ export const version = '7.0.5';
3
3
  //# sourceMappingURL=version.js.map