@inglorious/web 6.4.2 → 6.5.0

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inglorious/web",
3
- "version": "6.4.2",
3
+ "version": "6.5.0",
4
4
  "description": "A new web framework that leverages the power of the Inglorious Store combined with the performance and simplicity of lit-html.",
5
5
  "author": "Matteo Antony Mistretta <antony.mistretta@gmail.com> (https://ingloriouscoderz.it)",
6
6
  "contributors": [
@@ -1,4 +1,4 @@
1
- import { clone, get, set } from "@inglorious/utils/objects"
1
+ import { clone, get, set } from "@inglorious/utils/object.js"
2
2
 
3
3
  /**
4
4
  * @typedef {import('../../types/form.js').FormEntity} FormEntity
@@ -1,4 +1,4 @@
1
- import { get } from "@inglorious/utils/objects"
1
+ import { get } from "@inglorious/utils/object.js"
2
2
 
3
3
  /**
4
4
  * Retrieves the validation error for a specific form field.
@@ -8,6 +8,8 @@ import { toCamelCase } from "@inglorious/utils/data-structures/string.js"
8
8
 
9
9
  const SKIP_FULL_MATCH_GROUP = 1 // .match() result at index 0 is the full string
10
10
  const REMOVE_COLON_PREFIX = 1
11
+ const FIRST_HISTORY_INDEX = 0 // The entry an app starts on, and the fallback for an entry that carries no index.
12
+ const PUSH_HISTORY_STEP = 1 // How far a push advances the index. A replacement leaves it where it is.
11
13
 
12
14
  export function createHandlers(routeConfig) {
13
15
  /**
@@ -25,6 +27,18 @@ export function createHandlers(routeConfig) {
25
27
  * @param {Api} api - The application API.
26
28
  */
27
29
  init(entity, payload, api) {
30
+ /* Stamp the entry the app starts on, so that reloading keeps the app in
31
+ its place in the session history instead of restarting the count.
32
+ `withTransitions` reads this index back to tell a push from a traversal
33
+ and in which direction, so it has to be set before anything navigates. */
34
+ if (window.history.state?.idx == null) {
35
+ window.history.replaceState(
36
+ { ...window.history.state, idx: FIRST_HISTORY_INDEX },
37
+ "",
38
+ )
39
+ }
40
+ entity.idx = window.history.state?.idx ?? FIRST_HISTORY_INDEX
41
+
28
42
  // Handle initial route
29
43
  const { pathname, search } = window.location
30
44
  const initialPath = pathname + search
@@ -107,6 +121,9 @@ export function createHandlers(routeConfig) {
107
121
  }
108
122
 
109
123
  updateRouter(entity, route)
124
+ // Adopt the index of the entry just traversed, so the next push counts
125
+ // from where the history actually is rather than from where it was.
126
+ entity.idx = window.history.state?.idx ?? FIRST_HISTORY_INDEX
110
127
 
111
128
  api.notify("routeChange", {
112
129
  route: entity.route,
@@ -184,6 +201,10 @@ export function createHandlers(routeConfig) {
184
201
  // Prepare history state
185
202
  const historyState = {
186
203
  ...state,
204
+ /* Written before the notification that triggers the render, so that
205
+ anything reading the history entry during that render sees the new
206
+ index. `withTransitions` depends on this ordering. */
207
+ idx: replace ? entity.idx : entity.idx + PUSH_HISTORY_STEP,
187
208
  route: entity.route,
188
209
  params: entity.params,
189
210
  query: entity.query,
@@ -193,6 +214,9 @@ export function createHandlers(routeConfig) {
193
214
  // Navigate
194
215
  const method = replace ? "replaceState" : "pushState"
195
216
  history[method](historyState, "", path)
217
+ // Advance the counter as well as stamping the entry, or the next push
218
+ // writes the same index and reads as a replacement.
219
+ entity.idx = historyState.idx
196
220
 
197
221
  api.notify("routeChange", historyState)
198
222
  },