@peter.naydenov/cuts 2.1.4 → 2.1.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 (36) hide show
  1. package/Changelog.md +16 -0
  2. package/README.md +1 -1
  3. package/coverage/lcov-report/index.html +21 -21
  4. package/coverage/lcov-report/src/findInstructions.js.html +14 -14
  5. package/coverage/lcov-report/src/index.html +5 -5
  6. package/coverage/lcov-report/src/main.js.html +95 -38
  7. package/coverage/lcov-report/src/methods/hide.js.html +35 -14
  8. package/coverage/lcov-report/src/methods/index.html +34 -34
  9. package/coverage/lcov-report/src/methods/jump.js.html +5 -5
  10. package/coverage/lcov-report/src/methods/jumpBack.js.html +7 -7
  11. package/coverage/lcov-report/src/methods/jumpsReset.js.html +3 -3
  12. package/coverage/lcov-report/src/methods/listShortcuts.js.html +2 -2
  13. package/coverage/lcov-report/src/methods/setScenes.js.html +15 -15
  14. package/coverage/lcov-report/src/methods/show.js.html +76 -55
  15. package/coverage/lcov-report/src/setInstruction.js.html +23 -11
  16. package/coverage/lcov.info +295 -268
  17. package/dist/cuts.cjs +1 -1
  18. package/dist/cuts.esm.mjs +1 -1
  19. package/dist/cuts.umd.js +1 -1
  20. package/package.json +2 -2
  21. package/src/main.js +28 -9
  22. package/src/methods/hide.js +10 -3
  23. package/src/methods/jump.js +1 -1
  24. package/src/methods/jumpBack.js +2 -2
  25. package/src/methods/jumpsReset.js +1 -1
  26. package/src/methods/show.js +11 -4
  27. package/src/setInstruction.js +5 -1
  28. package/test/02-cuts.test.js +69 -0
  29. package/types/main.d.ts +42 -6
  30. package/types/main.d.ts.map +1 -1
  31. package/types/methods/hide.d.ts +1 -1
  32. package/types/methods/hide.d.ts.map +1 -1
  33. package/types/methods/jump.d.ts.map +1 -1
  34. package/types/methods/setScenes.d.ts +2 -2
  35. package/types/methods/show.d.ts.map +1 -1
  36. package/types/setInstruction.d.ts.map +1 -1
package/Changelog.md CHANGED
@@ -2,6 +2,22 @@
2
2
 
3
3
 
4
4
 
5
+ ## 2.1.5 ( 2026-07-09 )
6
+ - [x] Types: `CutsConfig` is now an exported type in `types/main.d.ts` with `logLevel?: 0 | 1`. Previously only documented in README, not in the type declarations;
7
+ - [x] Types: `pluginNames` is now an exported union type (`'Key'|'Click'|'Form'|'Hover'|'Scroll'`) in `types/main.d.ts`, matching the values accepted by `loadPlugins`;
8
+ - [x] Types: new exported `CutsState` type in `types/main.d.ts` (`{ scene, parents, opened }`), used as the return type of `getState()`;
9
+ - [x] Types: `getState()` now returns `CutsState` instead of untyped `Object` — IntelliSense now autocompletes `{ scene, parents, opened }`;
10
+ - [x] Types: `hide()` return type corrected to `Promise<void>` instead of `Promise<any>`;
11
+ - [x] Fix: `jumpBack()` function body renamed from `jumpReset` to `jumpsReset` — implementation now matches the exported name;
12
+ - [x] Types: `jumpBack()` parameter default documented as `@param {number} [options.hops=1]` instead of the previous non-standard `{hops}=...` form;
13
+ - [x] Types: `hide()` `@param` annotation now clarifies the default (`1` = current scene only) and the `'*'` wildcard meaning;
14
+ - [x] Docs: README note on `logLevel` type updated from `logLevel: number` to `logLevel?: 0 | 1` to match the new typedef;
15
+ - [x] Fix: `beforeHide` now works correctly when it returns a Promise. Previously the return value was ignored entirely — async blocking logic (e.g. confirm dialogs) was silently broken, and the navigation proceeded before the Promise resolved. Both `show()` and `hide()` now detect Promise returns and await them before calling `unloadTask.done`. Errors in the Promise chain are caught and treated as `done(false)`;
16
+ - [x] Fix: scene functions (`show`/`hide`) that reject without being caught no longer produce unhandled promise rejections. `setInstruction` wraps the returned promise with `.catch(() => {})`. `jump()` and `jumpBack()` do the same on their `show()` call;
17
+ - [x] Tests: two new regression tests for async `beforeHide` — one verifying navigation is blocked when the Promise resolves to `false`, one verifying it proceeds when the Promise resolves to `true`;
18
+
19
+
20
+
5
21
  ## 2.1.4 ( 2026-07-09 )
6
22
  - [x] Fix: `hide()` with the default single step (or any `endSteps` short of the full chain) left `currentScene`/`currentParents` pointing at the just-hidden scene instead of climbing to its still-visible parent, so no scene's shortcuts context was active afterward. This affected every nested scene, not only wildcard overlays - the 2.1.3 fix was scoped too narrowly. `hide()` is rewritten to climb the recorded ancestor chain directly, which also removes the need for the wildcard-specific special-casing from 2.1.3;
7
23
  - [x] Fix: server-side-rendered (`options.ssr: true`) first loads never recorded the scene's `parents`, so navigating away from a deep SSR-loaded scene skipped hiding its ancestors entirely, leaving them stale;
package/README.md CHANGED
@@ -206,7 +206,7 @@ const script = cuts ();
206
206
  const script = cuts ({ logLevel: 0 });
207
207
  ```
208
208
 
209
- The option is also exposed in `types/main.d.ts` as `logLevel: number`.
209
+ The option is also exposed in `types/main.d.ts` as `logLevel?: 0 | 1`.
210
210
 
211
211
  ### Custom events via `emit`
212
212
 
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">97.53% </span>
26
+ <span class="strong">95.65% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>237/243</span>
28
+ <span class='fraction'>242/253</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">94.25% </span>
33
+ <span class="strong">92.7% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>82/87</span>
35
+ <span class='fraction'>89/96</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">87.75% </span>
40
+ <span class="strong">79.62% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>43/49</span>
42
+ <span class='fraction'>43/54</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">100% </span>
47
+ <span class="strong">98.6% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>207/207</span>
49
+ <span class='fraction'>212/215</span>
50
50
  </div>
51
51
 
52
52
 
@@ -87,25 +87,25 @@
87
87
  <td data-value="107" class="abs high">102/107</td>
88
88
  <td data-value="92" class="pct high">92%</td>
89
89
  <td data-value="25" class="abs high">23/25</td>
90
- <td data-value="80" class="pct high">80%</td>
91
- <td data-value="25" class="abs high">20/25</td>
90
+ <td data-value="76.92" class="pct medium">76.92%</td>
91
+ <td data-value="26" class="abs medium">20/26</td>
92
92
  <td data-value="100" class="pct high">100%</td>
93
93
  <td data-value="84" class="abs high">84/84</td>
94
94
  </tr>
95
95
 
96
96
  <tr>
97
97
  <td class="file high" data-value="src/methods"><a href="src/methods/index.html">src/methods</a></td>
98
- <td data-value="99.26" class="pic high">
99
- <div class="chart"><div class="cover-fill" style="width: 99%"></div><div class="cover-empty" style="width: 1%"></div></div>
98
+ <td data-value="95.89" class="pic high">
99
+ <div class="chart"><div class="cover-fill" style="width: 95%"></div><div class="cover-empty" style="width: 5%"></div></div>
100
100
  </td>
101
- <td data-value="99.26" class="pct high">99.26%</td>
102
- <td data-value="136" class="abs high">135/136</td>
103
- <td data-value="95.16" class="pct high">95.16%</td>
104
- <td data-value="62" class="abs high">59/62</td>
105
- <td data-value="95.83" class="pct high">95.83%</td>
106
- <td data-value="24" class="abs high">23/24</td>
107
- <td data-value="100" class="pct high">100%</td>
108
- <td data-value="123" class="abs high">123/123</td>
101
+ <td data-value="95.89" class="pct high">95.89%</td>
102
+ <td data-value="146" class="abs high">140/146</td>
103
+ <td data-value="92.95" class="pct high">92.95%</td>
104
+ <td data-value="71" class="abs high">66/71</td>
105
+ <td data-value="82.14" class="pct high">82.14%</td>
106
+ <td data-value="28" class="abs high">23/28</td>
107
+ <td data-value="97.7" class="pct high">97.7%</td>
108
+ <td data-value="131" class="abs high">128/131</td>
109
109
  </tr>
110
110
 
111
111
  </tbody>
@@ -116,7 +116,7 @@
116
116
  <div class='footer quiet pad2 space-top1 center small'>
117
117
  Code coverage generated by
118
118
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
- at 2026-07-09T05:05:03.811Z
119
+ at 2026-07-09T15:42:10.120Z
120
120
  </div>
121
121
  <script src="prettify.js"></script>
122
122
  <script>
@@ -165,29 +165,29 @@
165
165
  <span class="cline-any cline-neutral">&nbsp;</span>
166
166
  <span class="cline-any cline-neutral">&nbsp;</span>
167
167
  <span class="cline-any cline-neutral">&nbsp;</span>
168
- <span class="cline-any cline-yes">48x</span>
168
+ <span class="cline-any cline-yes">51x</span>
169
169
  <span class="cline-any cline-neutral">&nbsp;</span>
170
- <span class="cline-any cline-yes">48x</span>
171
- <span class="cline-any cline-yes">23x</span>
172
- <span class="cline-any cline-yes">23x</span>
173
- <span class="cline-any cline-yes">23x</span>
170
+ <span class="cline-any cline-yes">51x</span>
171
+ <span class="cline-any cline-yes">25x</span>
172
+ <span class="cline-any cline-yes">25x</span>
173
+ <span class="cline-any cline-yes">25x</span>
174
174
  <span class="cline-any cline-neutral">&nbsp;</span>
175
175
  <span class="cline-any cline-neutral">&nbsp;</span>
176
- <span class="cline-any cline-yes">25x</span>
177
- <span class="cline-any cline-yes">17x</span>
178
- <span class="cline-any cline-yes">17x</span>
176
+ <span class="cline-any cline-yes">26x</span>
177
+ <span class="cline-any cline-yes">18x</span>
178
+ <span class="cline-any cline-yes">18x</span>
179
179
  <span class="cline-any cline-yes">3x</span>
180
180
  <span class="cline-any cline-yes">5x</span>
181
181
  <span class="cline-any cline-yes">3x</span>
182
182
  <span class="cline-any cline-yes">3x</span>
183
183
  <span class="cline-any cline-yes">3x</span>
184
184
  <span class="cline-any cline-neutral">&nbsp;</span>
185
- <span class="cline-any cline-yes">14x</span>
186
- <span class="cline-any cline-yes">14x</span>
187
- <span class="cline-any cline-yes">14x</span>
185
+ <span class="cline-any cline-yes">15x</span>
186
+ <span class="cline-any cline-yes">15x</span>
187
+ <span class="cline-any cline-yes">15x</span>
188
188
  <span class="cline-any cline-neutral">&nbsp;</span>
189
- <span class="cline-any cline-yes">17x</span>
190
- <span class="cline-any cline-yes">17x</span>
189
+ <span class="cline-any cline-yes">18x</span>
190
+ <span class="cline-any cline-yes">18x</span>
191
191
  <span class="cline-any cline-neutral">&nbsp;</span>
192
192
  <span class="cline-any cline-neutral">&nbsp;</span>
193
193
  <span class="cline-any cline-yes">8x</span>
@@ -337,7 +337,7 @@ export default findInstructions
337
337
  <div class='footer quiet pad2 space-top1 center small'>
338
338
  Code coverage generated by
339
339
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
340
- at 2026-07-09T05:05:03.811Z
340
+ at 2026-07-09T15:42:10.120Z
341
341
  </div>
342
342
  <script src="../prettify.js"></script>
343
343
  <script>
@@ -37,9 +37,9 @@
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">80% </span>
40
+ <span class="strong">76.92% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>20/25</span>
42
+ <span class='fraction'>20/26</span>
43
43
  </div>
44
44
 
45
45
 
@@ -117,8 +117,8 @@
117
117
  <td data-value="6" class="abs high">6/6</td>
118
118
  <td data-value="100" class="pct high">100%</td>
119
119
  <td data-value="0" class="abs high">0/0</td>
120
- <td data-value="100" class="pct high">100%</td>
121
- <td data-value="3" class="abs high">3/3</td>
120
+ <td data-value="75" class="pct medium">75%</td>
121
+ <td data-value="4" class="abs medium">3/4</td>
122
122
  <td data-value="100" class="pct high">100%</td>
123
123
  <td data-value="6" class="abs high">6/6</td>
124
124
  </tr>
@@ -131,7 +131,7 @@
131
131
  <div class='footer quiet pad2 space-top1 center small'>
132
132
  Code coverage generated by
133
133
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
134
- at 2026-07-09T05:05:03.811Z
134
+ at 2026-07-09T15:42:10.120Z
135
135
  </div>
136
136
  <script src="../prettify.js"></script>
137
137
  <script>
@@ -245,7 +245,26 @@
245
245
  <a name='L180'></a><a href='#L180'>180</a>
246
246
  <a name='L181'></a><a href='#L181'>181</a>
247
247
  <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
249
268
  <span class="cline-any cline-neutral">&nbsp;</span>
250
269
  <span class="cline-any cline-neutral">&nbsp;</span>
251
270
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -285,9 +304,31 @@
285
304
  <span class="cline-any cline-neutral">&nbsp;</span>
286
305
  <span class="cline-any cline-neutral">&nbsp;</span>
287
306
  <span class="cline-any cline-neutral">&nbsp;</span>
288
- <span class="cline-any cline-yes">33x</span>
289
- <span class="cline-any cline-yes">33x</span>
290
- <span class="cline-any cline-yes">33x</span>
307
+ <span class="cline-any cline-neutral">&nbsp;</span>
308
+ <span class="cline-any cline-neutral">&nbsp;</span>
309
+ <span class="cline-any cline-neutral">&nbsp;</span>
310
+ <span class="cline-any cline-neutral">&nbsp;</span>
311
+ <span class="cline-any cline-neutral">&nbsp;</span>
312
+ <span class="cline-any cline-neutral">&nbsp;</span>
313
+ <span class="cline-any cline-neutral">&nbsp;</span>
314
+ <span class="cline-any cline-neutral">&nbsp;</span>
315
+ <span class="cline-any cline-neutral">&nbsp;</span>
316
+ <span class="cline-any cline-neutral">&nbsp;</span>
317
+ <span class="cline-any cline-neutral">&nbsp;</span>
318
+ <span class="cline-any cline-neutral">&nbsp;</span>
319
+ <span class="cline-any cline-neutral">&nbsp;</span>
320
+ <span class="cline-any cline-neutral">&nbsp;</span>
321
+ <span class="cline-any cline-neutral">&nbsp;</span>
322
+ <span class="cline-any cline-neutral">&nbsp;</span>
323
+ <span class="cline-any cline-neutral">&nbsp;</span>
324
+ <span class="cline-any cline-neutral">&nbsp;</span>
325
+ <span class="cline-any cline-neutral">&nbsp;</span>
326
+ <span class="cline-any cline-neutral">&nbsp;</span>
327
+ <span class="cline-any cline-neutral">&nbsp;</span>
328
+ <span class="cline-any cline-neutral">&nbsp;</span>
329
+ <span class="cline-any cline-yes">35x</span>
330
+ <span class="cline-any cline-yes">35x</span>
331
+ <span class="cline-any cline-yes">35x</span>
291
332
  <span class="cline-any cline-yes">6x</span>
292
333
  <span class="cline-any cline-yes">6x</span>
293
334
  <span class="cline-any cline-yes">3x</span>
@@ -297,7 +338,7 @@
297
338
  <span class="cline-any cline-yes">3x</span>
298
339
  <span class="cline-any cline-neutral">&nbsp;</span>
299
340
  <span class="cline-any cline-neutral">&nbsp;</span>
300
- <span class="cline-any cline-yes">33x</span>
341
+ <span class="cline-any cline-yes">35x</span>
301
342
  <span class="cline-any cline-neutral">&nbsp;</span>
302
343
  <span class="cline-any cline-neutral">&nbsp;</span>
303
344
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -305,9 +346,9 @@
305
346
  <span class="cline-any cline-neutral">&nbsp;</span>
306
347
  <span class="cline-any cline-neutral">&nbsp;</span>
307
348
  <span class="cline-any cline-neutral">&nbsp;</span>
308
- <span class="cline-any cline-yes">33x</span>
309
- <span class="cline-any cline-yes">33x</span>
310
- <span class="cline-any cline-yes">33x</span>
349
+ <span class="cline-any cline-yes">35x</span>
350
+ <span class="cline-any cline-yes">35x</span>
351
+ <span class="cline-any cline-yes">35x</span>
311
352
  <span class="cline-any cline-neutral">&nbsp;</span>
312
353
  <span class="cline-any cline-neutral">&nbsp;</span>
313
354
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -318,13 +359,13 @@
318
359
  <span class="cline-any cline-neutral">&nbsp;</span>
319
360
  <span class="cline-any cline-neutral">&nbsp;</span>
320
361
  <span class="cline-any cline-neutral">&nbsp;</span>
321
- <span class="cline-any cline-yes">33x</span>
322
- <span class="cline-any cline-yes">33x</span>
323
- <span class="cline-any cline-yes">33x</span>
324
- <span class="cline-any cline-yes">33x</span>
325
- <span class="cline-any cline-yes">33x</span>
326
- <span class="cline-any cline-yes">33x</span>
327
- <span class="cline-any cline-yes">33x</span>
362
+ <span class="cline-any cline-yes">35x</span>
363
+ <span class="cline-any cline-yes">35x</span>
364
+ <span class="cline-any cline-yes">35x</span>
365
+ <span class="cline-any cline-yes">35x</span>
366
+ <span class="cline-any cline-yes">35x</span>
367
+ <span class="cline-any cline-yes">35x</span>
368
+ <span class="cline-any cline-yes">35x</span>
328
369
  <span class="cline-any cline-neutral">&nbsp;</span>
329
370
  <span class="cline-any cline-neutral">&nbsp;</span>
330
371
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -341,7 +382,7 @@
341
382
  <span class="cline-any cline-neutral">&nbsp;</span>
342
383
  <span class="cline-any cline-neutral">&nbsp;</span>
343
384
  <span class="cline-any cline-neutral">&nbsp;</span>
344
- <span class="cline-any cline-yes">33x</span>
385
+ <span class="cline-any cline-yes">35x</span>
345
386
  <span class="cline-any cline-yes">2x</span>
346
387
  <span class="cline-any cline-yes">1x</span>
347
388
  <span class="cline-any cline-yes">2x</span>
@@ -353,55 +394,53 @@
353
394
  <span class="cline-any cline-neutral">&nbsp;</span>
354
395
  <span class="cline-any cline-neutral">&nbsp;</span>
355
396
  <span class="cline-any cline-neutral">&nbsp;</span>
356
- <span class="cline-any cline-yes">33x</span>
357
- <span class="cline-any cline-neutral">&nbsp;</span>
358
- <span class="cline-any cline-neutral">&nbsp;</span>
397
+ <span class="cline-any cline-yes">35x</span>
359
398
  <span class="cline-any cline-neutral">&nbsp;</span>
360
399
  <span class="cline-any cline-neutral">&nbsp;</span>
361
400
  <span class="cline-any cline-neutral">&nbsp;</span>
362
401
  <span class="cline-any cline-neutral">&nbsp;</span>
363
- <span class="cline-any cline-yes">33x</span>
364
402
  <span class="cline-any cline-neutral">&nbsp;</span>
365
403
  <span class="cline-any cline-neutral">&nbsp;</span>
404
+ <span class="cline-any cline-yes">35x</span>
366
405
  <span class="cline-any cline-neutral">&nbsp;</span>
367
406
  <span class="cline-any cline-neutral">&nbsp;</span>
368
407
  <span class="cline-any cline-neutral">&nbsp;</span>
369
408
  <span class="cline-any cline-neutral">&nbsp;</span>
370
- <span class="cline-any cline-yes">33x</span>
371
409
  <span class="cline-any cline-neutral">&nbsp;</span>
372
410
  <span class="cline-any cline-neutral">&nbsp;</span>
411
+ <span class="cline-any cline-yes">35x</span>
373
412
  <span class="cline-any cline-neutral">&nbsp;</span>
374
413
  <span class="cline-any cline-neutral">&nbsp;</span>
375
414
  <span class="cline-any cline-neutral">&nbsp;</span>
376
415
  <span class="cline-any cline-neutral">&nbsp;</span>
377
- <span class="cline-any cline-yes">33x</span>
378
416
  <span class="cline-any cline-neutral">&nbsp;</span>
379
417
  <span class="cline-any cline-neutral">&nbsp;</span>
418
+ <span class="cline-any cline-yes">35x</span>
380
419
  <span class="cline-any cline-neutral">&nbsp;</span>
381
420
  <span class="cline-any cline-neutral">&nbsp;</span>
382
421
  <span class="cline-any cline-neutral">&nbsp;</span>
383
422
  <span class="cline-any cline-neutral">&nbsp;</span>
384
423
  <span class="cline-any cline-neutral">&nbsp;</span>
385
424
  <span class="cline-any cline-neutral">&nbsp;</span>
386
- <span class="cline-any cline-yes">33x</span>
387
425
  <span class="cline-any cline-neutral">&nbsp;</span>
388
426
  <span class="cline-any cline-neutral">&nbsp;</span>
427
+ <span class="cline-any cline-yes">35x</span>
389
428
  <span class="cline-any cline-neutral">&nbsp;</span>
390
429
  <span class="cline-any cline-neutral">&nbsp;</span>
391
430
  <span class="cline-any cline-neutral">&nbsp;</span>
392
431
  <span class="cline-any cline-neutral">&nbsp;</span>
393
432
  <span class="cline-any cline-neutral">&nbsp;</span>
394
- <span class="cline-any cline-yes">33x</span>
395
433
  <span class="cline-any cline-neutral">&nbsp;</span>
396
434
  <span class="cline-any cline-neutral">&nbsp;</span>
435
+ <span class="cline-any cline-yes">35x</span>
397
436
  <span class="cline-any cline-neutral">&nbsp;</span>
398
437
  <span class="cline-any cline-neutral">&nbsp;</span>
399
438
  <span class="cline-any cline-neutral">&nbsp;</span>
400
439
  <span class="cline-any cline-neutral">&nbsp;</span>
401
440
  <span class="cline-any cline-neutral">&nbsp;</span>
402
441
  <span class="cline-any cline-neutral">&nbsp;</span>
442
+ <span class="cline-any cline-yes">41x</span>
403
443
  <span class="cline-any cline-neutral">&nbsp;</span>
404
- <span class="cline-any cline-yes">39x</span>
405
444
  <span class="cline-any cline-neutral">&nbsp;</span>
406
445
  <span class="cline-any cline-neutral">&nbsp;</span>
407
446
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -417,9 +456,8 @@
417
456
  <span class="cline-any cline-neutral">&nbsp;</span>
418
457
  <span class="cline-any cline-neutral">&nbsp;</span>
419
458
  <span class="cline-any cline-neutral">&nbsp;</span>
420
- <span class="cline-any cline-neutral">&nbsp;</span>
421
- <span class="cline-any cline-yes">33x</span>
422
- <span class="cline-any cline-yes">33x</span>
459
+ <span class="cline-any cline-yes">35x</span>
460
+ <span class="cline-any cline-yes">35x</span>
423
461
  <span class="cline-any cline-neutral">&nbsp;</span>
424
462
  <span class="cline-any cline-neutral">&nbsp;</span>
425
463
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -465,7 +503,29 @@ import jumpBack from './methods/jumpBack.js'
465
503
  import jumpsReset from './methods/jumpsReset.js'
466
504
  &nbsp;
467
505
  &nbsp;
468
- function main ( cfg= {} ) {
506
+ /**
507
+ * Cuts
508
+ * @param {CutsConfig} [cfg] - configuration object
509
+ */
510
+ &nbsp;
511
+ /**
512
+ * @typedef {Object} CutsConfig
513
+ * @property {0|1} [logLevel=1] - Logging level. `1` emits '@app-error' events; `0` silences them silently.
514
+ */
515
+ &nbsp;
516
+ /**
517
+ * @typedef {'Key'|'Click'|'Form'|'Hover'|'Scroll'} pluginNames
518
+ * @description List of available shortcut plugins.
519
+ */
520
+ &nbsp;
521
+ /**
522
+ * @typedef {Object} CutsState
523
+ * @property {string|null} scene - current scene name
524
+ * @property {Array.&lt;string&gt;|null} parents - current parent scene names
525
+ * @property {boolean} opened - whether the scene manager is opened
526
+ */
527
+ &nbsp;
528
+ function main ( cfg = {} ) {
469
529
  const
470
530
  shortcutMngr = shortcuts ({ errorEventName: '@app-error' })
471
531
  , logLevel = ( cfg.logLevel ?? 1 )
@@ -575,14 +635,11 @@ function main ( cfg= {} ) {
575
635
  */
576
636
  API.disablePlugin = <span class="fstat-no" title="function not covered" >( </span>pluginName ) =&gt; <span class="cstat-no" title="statement not covered" >shortcutMngr.disablePlugin ( pluginName )</span>
577
637
 
578
- /**
579
- * Get the current state of the application
580
- * @function getState
581
- * @returns {Object} with properties:
582
- * - scene: current scene name
583
- * - parents: current parent scene names
584
- * - opened: boolean indicating if the application is opened
585
- */
638
+ /**
639
+ * Get the current state of the application
640
+ * @function getState
641
+ * @returns {CutsState} current scene, parents, and opened flag
642
+ */
586
643
  API.getState = () =&gt; ({
587
644
  scene : state.currentScene
588
645
  // Copy - never leak the live array, or callers mutating it corrupt internal state.
@@ -616,7 +673,7 @@ export default main
616
673
  <div class='footer quiet pad2 space-top1 center small'>
617
674
  Code coverage generated by
618
675
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
619
- at 2026-07-09T05:05:03.811Z
676
+ at 2026-07-09T15:42:10.120Z
620
677
  </div>
621
678
  <script src="../prettify.js"></script>
622
679
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">100% </span>
26
+ <span class="strong">91.42% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>30/30</span>
28
+ <span class='fraction'>32/35</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">100% </span>
33
+ <span class="strong">84.61% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>9/9</span>
35
+ <span class='fraction'>11/13</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">100% </span>
40
+ <span class="strong">80% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>4/4</span>
42
+ <span class='fraction'>4/5</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">100% </span>
47
+ <span class="strong">93.93% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>29/29</span>
49
+ <span class='fraction'>31/33</span>
50
50
  </div>
51
51
 
52
52
 
@@ -129,7 +129,14 @@
129
129
  <a name='L64'></a><a href='#L64'>64</a>
130
130
  <a name='L65'></a><a href='#L65'>65</a>
131
131
  <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
133
140
  <span class="cline-any cline-neutral">&nbsp;</span>
134
141
  <span class="cline-any cline-neutral">&nbsp;</span>
135
142
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -140,7 +147,7 @@
140
147
  <span class="cline-any cline-neutral">&nbsp;</span>
141
148
  <span class="cline-any cline-neutral">&nbsp;</span>
142
149
  <span class="cline-any cline-neutral">&nbsp;</span>
143
- <span class="cline-any cline-yes">33x</span>
150
+ <span class="cline-any cline-yes">35x</span>
144
151
  <span class="cline-any cline-neutral">&nbsp;</span>
145
152
  <span class="cline-any cline-yes">7x</span>
146
153
  <span class="cline-any cline-yes">7x</span>
@@ -152,6 +159,13 @@
152
159
  <span class="cline-any cline-yes">7x</span>
153
160
  <span class="cline-any cline-yes">1x</span>
154
161
  <span class="cline-any cline-yes">1x</span>
162
+ <span class="cline-any cline-yes">1x</span>
163
+ <span class="cline-any cline-yes">1x</span>
164
+ <span class="cline-any cline-no">&nbsp;</span>
165
+ <span class="cline-any cline-neutral">&nbsp;</span>
166
+ <span class="cline-any cline-neutral">&nbsp;</span>
167
+ <span class="cline-any cline-no">&nbsp;</span>
168
+ <span class="cline-any cline-neutral">&nbsp;</span>
155
169
  <span class="cline-any cline-neutral">&nbsp;</span>
156
170
  <span class="cline-any cline-yes">6x</span>
157
171
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -203,8 +217,8 @@ function hide ( dependencies, state ) {
203
217
  /**
204
218
  * @function hide
205
219
  * @description Hide the current scene and returns to the parent one
206
- * @param {number|string} endSteps - number of steps to end or '*' to end all scenes to the root
207
- * @returns {Promise} - promise that resolves when the process 'end' is completed
220
+ * @param {number|string} [endSteps=1] - number of steps to end; omit or `1` for current scene only; `'*'` to end all scenes to root
221
+ * @returns {Promise&lt;void&gt;} - promise that resolves when the process 'end' is completed
208
222
  */
209
223
  return function hide ( endSteps=1 ) {
210
224
  const
@@ -217,7 +231,14 @@ return function hide ( endSteps=1 ) {
217
231
  &nbsp;
218
232
  if ( hasBeforeHide ) { // Execute 'beforeHide' function if exists - same guard 'show' honors when navigating away
219
233
  const closingFn = scenes[currentScene].beforeHide;
220
- closingFn ({ done:unloadTask.done, dependencies: shortcutMngr.getDependencies() })
234
+ try {
235
+ const result = closingFn ({ done:unloadTask.done, dependencies: shortcutMngr.getDependencies() });
236
+ <span class="missing-if-branch" title="if path not taken" >I</span>if ( result != null &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >typeof result.then === 'function' </span>) {
237
+ <span class="cstat-no" title="statement not covered" > result.then ( unloadTask.done ).catch ( <span class="fstat-no" title="function not covered" >()</span> =&gt; <span class="cstat-no" title="statement not covered" >unloadTask.done ( false ) </span>);</span>
238
+ }
239
+ } catch ( err ) {
240
+ <span class="cstat-no" title="statement not covered" > unloadTask.done ( false );</span>
241
+ }
221
242
  }
222
243
  else unloadTask.done ( true )
223
244
  &nbsp;
@@ -268,7 +289,7 @@ export default hide
268
289
  <div class='footer quiet pad2 space-top1 center small'>
269
290
  Code coverage generated by
270
291
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
271
- at 2026-07-09T05:05:03.811Z
292
+ at 2026-07-09T15:42:10.120Z
272
293
  </div>
273
294
  <script src="../../prettify.js"></script>
274
295
  <script>