@peter.naydenov/cuts 2.1.3 → 2.1.4

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/Changelog.md CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
 
4
4
 
5
+ ## 2.1.4 ( 2026-07-09 )
6
+ - [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
+ - [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;
8
+ - [x] Docs: `afterShow`'s typedef claimed it could return `false` to cancel the show - it never could (the return value was always ignored) and the README never documented that behavior either. The typedef now describes the actual fire-and-forget contract;
9
+ - [x] Fix: `hide()` never checked `beforeHide`, so it always bypassed the "prevent navigation away" guard that `show()` already respected - calling `hide()` directly could skip it entirely even when it returned `false`;
10
+ - [x] Fix: `jump()` pushed onto the jump stack unconditionally, even when the underlying navigation was blocked (eg. by `beforeHide`) or failed - leaving a phantom entry that desynced `jumpBack()` from what actually happened;
11
+ - [x] Fix: `show()` passed `state.currentParents` into `findInstructions` by reference; since `findInstructions` is a lazy generator, mutating that same array mid-iteration (as the wildcard-overlay climb in `getStep` now does) corrupted its still-pending computation and silently dropped a `hide` step, leaking the scene an overlay was covering as permanently visible after navigating elsewhere;
12
+ - [x] Fix: showing a wildcard-overlay scene with no underlying scene (`currentScene` was `null`) recorded a literal `null` placeholder in `currentParents`, which crashed any later navigation away from it;
13
+ - [x] Fix: re-showing a wildcard-overlay scene while it was already current pushed it onto its own ancestor chain, so a later `hide()` reported the overlay as still current even though it had actually just been hidden;
14
+
15
+
16
+
5
17
  ## 2.1.3 ( 2026-07-09 )
6
18
  - [x] Fix: `getState()` returned a live reference to `state.currentParents` instead of a copy; a caller mutating the returned array corrupted cuts' own internal state;
7
19
  - [x] Fix: `hide()` on a wildcard-overlay scene left `currentScene`/`currentParents` pointing at the (now-hidden) overlay instead of climbing back to the scene it was shown on top of, so that scene's shortcuts context never reactivated;
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">85.71% </span>
26
+ <span class="strong">97.53% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>198/231</span>
28
+ <span class='fraction'>237/243</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">80% </span>
33
+ <span class="strong">94.25% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>60/75</span>
35
+ <span class='fraction'>82/87</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">75.51% </span>
40
+ <span class="strong">87.75% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>37/49</span>
42
+ <span class='fraction'>43/49</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">88.38% </span>
47
+ <span class="strong">100% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>175/198</span>
49
+ <span class='fraction'>207/207</span>
50
50
  </div>
51
51
 
52
52
 
@@ -80,32 +80,32 @@
80
80
  </thead>
81
81
  <tbody><tr>
82
82
  <td class="file high" data-value="src"><a href="src/index.html">src</a></td>
83
- <td data-value="93.33" class="pic high">
84
- <div class="chart"><div class="cover-fill" style="width: 93%"></div><div class="cover-empty" style="width: 7%"></div></div>
83
+ <td data-value="95.32" class="pic high">
84
+ <div class="chart"><div class="cover-fill" style="width: 95%"></div><div class="cover-empty" style="width: 5%"></div></div>
85
85
  </td>
86
- <td data-value="93.33" class="pct high">93.33%</td>
87
- <td data-value="105" class="abs high">98/105</td>
88
- <td data-value="95.23" class="pct high">95.23%</td>
89
- <td data-value="21" class="abs high">20/21</td>
90
- <td data-value="72" class="pct medium">72%</td>
91
- <td data-value="25" class="abs medium">18/25</td>
86
+ <td data-value="95.32" class="pct high">95.32%</td>
87
+ <td data-value="107" class="abs high">102/107</td>
88
+ <td data-value="92" class="pct high">92%</td>
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>
92
92
  <td data-value="100" class="pct high">100%</td>
93
- <td data-value="83" class="abs high">83/83</td>
93
+ <td data-value="84" class="abs high">84/84</td>
94
94
  </tr>
95
95
 
96
96
  <tr>
97
- <td class="file medium" data-value="src/methods"><a href="src/methods/index.html">src/methods</a></td>
98
- <td data-value="79.36" class="pic medium">
99
- <div class="chart"><div class="cover-fill" style="width: 79%"></div><div class="cover-empty" style="width: 21%"></div></div>
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>
100
100
  </td>
101
- <td data-value="79.36" class="pct medium">79.36%</td>
102
- <td data-value="126" class="abs medium">100/126</td>
103
- <td data-value="74.07" class="pct medium">74.07%</td>
104
- <td data-value="54" class="abs medium">40/54</td>
105
- <td data-value="79.16" class="pct medium">79.16%</td>
106
- <td data-value="24" class="abs medium">19/24</td>
107
- <td data-value="80" class="pct high">80%</td>
108
- <td data-value="115" class="abs high">92/115</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>
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-04-09T15:47:31.753Z
119
+ at 2026-07-09T05:05:03.811Z
120
120
  </div>
121
121
  <script src="prettify.js"></script>
122
122
  <script>
@@ -23,9 +23,9 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">98.3% </span>
26
+ <span class="strong">100% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>58/59</span>
28
+ <span class='fraction'>59/59</span>
29
29
  </div>
30
30
 
31
31
 
@@ -37,9 +37,9 @@
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">88.88% </span>
40
+ <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>8/9</span>
42
+ <span class='fraction'>9/9</span>
43
43
  </div>
44
44
 
45
45
 
@@ -165,38 +165,38 @@
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">25x</span>
168
+ <span class="cline-any cline-yes">48x</span>
169
169
  <span class="cline-any cline-neutral">&nbsp;</span>
170
- <span class="cline-any cline-yes">25x</span>
171
- <span class="cline-any cline-yes">7x</span>
172
- <span class="cline-any cline-yes">7x</span>
173
- <span class="cline-any cline-yes">7x</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>
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">18x</span>
177
- <span class="cline-any cline-yes">11x</span>
178
- <span class="cline-any cline-yes">11x</span>
179
- <span class="cline-any cline-yes">2x</span>
180
- <span class="cline-any cline-yes">4x</span>
181
- <span class="cline-any cline-yes">2x</span>
182
- <span class="cline-any cline-yes">2x</span>
183
- <span class="cline-any cline-yes">2x</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>
179
+ <span class="cline-any cline-yes">3x</span>
180
+ <span class="cline-any cline-yes">5x</span>
181
+ <span class="cline-any cline-yes">3x</span>
182
+ <span class="cline-any cline-yes">3x</span>
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">9x</span>
186
- <span class="cline-any cline-yes">9x</span>
187
- <span class="cline-any cline-yes">9x</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>
188
188
  <span class="cline-any cline-neutral">&nbsp;</span>
189
- <span class="cline-any cline-yes">11x</span>
190
- <span class="cline-any cline-yes">11x</span>
189
+ <span class="cline-any cline-yes">17x</span>
190
+ <span class="cline-any cline-yes">17x</span>
191
191
  <span class="cline-any cline-neutral">&nbsp;</span>
192
192
  <span class="cline-any cline-neutral">&nbsp;</span>
193
- <span class="cline-any cline-yes">7x</span>
194
- <span class="cline-any cline-yes">3x</span>
195
- <span class="cline-any cline-yes">3x</span>
193
+ <span class="cline-any cline-yes">8x</span>
194
+ <span class="cline-any cline-yes">4x</span>
195
+ <span class="cline-any cline-yes">4x</span>
196
196
  <span class="cline-any cline-yes">4x</span>
197
197
  <span class="cline-any cline-neutral">&nbsp;</span>
198
- <span class="cline-any cline-yes">3x</span>
199
- <span class="cline-any cline-yes">3x</span>
198
+ <span class="cline-any cline-yes">4x</span>
199
+ <span class="cline-any cline-yes">4x</span>
200
200
  <span class="cline-any cline-neutral">&nbsp;</span>
201
201
  <span class="cline-any cline-neutral">&nbsp;</span>
202
202
  <span class="cline-any cline-yes">4x</span>
@@ -257,7 +257,7 @@ function* findInstructions ( currentName, currentParents, targetName, targetPare
257
257
  let backToName, backIndex=null, isNoParent=true;
258
258
  &nbsp;
259
259
  if ( currentName === null ) { // When the scene manager is just started
260
- yield* targetParents.map ( <span class="fstat-no" title="function not covered" >name </span>=&gt; <span class="cstat-no" title="statement not covered" >[ name, 'show' ])</span>
260
+ yield* targetParents.map ( name =&gt; [ name, 'show' ])
261
261
  yield [ targetName, 'show' ]
262
262
  return
263
263
  }
@@ -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-04-09T15:47:31.753Z
340
+ at 2026-07-09T05:05:03.811Z
341
341
  </div>
342
342
  <script src="../prettify.js"></script>
343
343
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">93.33% </span>
26
+ <span class="strong">95.32% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>98/105</span>
28
+ <span class='fraction'>102/107</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">95.23% </span>
33
+ <span class="strong">92% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>20/21</span>
35
+ <span class='fraction'>23/25</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">72% </span>
40
+ <span class="strong">80% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>18/25</span>
42
+ <span class='fraction'>20/25</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">100% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>83/83</span>
49
+ <span class='fraction'>84/84</span>
50
50
  </div>
51
51
 
52
52
 
@@ -80,32 +80,32 @@
80
80
  </thead>
81
81
  <tbody><tr>
82
82
  <td class="file high" data-value="findInstructions.js"><a href="findInstructions.js.html">findInstructions.js</a></td>
83
- <td data-value="98.3" class="pic high">
84
- <div class="chart"><div class="cover-fill" style="width: 98%"></div><div class="cover-empty" style="width: 2%"></div></div>
83
+ <td data-value="100" class="pic high">
84
+ <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
85
85
  </td>
86
- <td data-value="98.3" class="pct high">98.3%</td>
87
- <td data-value="59" class="abs high">58/59</td>
86
+ <td data-value="100" class="pct high">100%</td>
87
+ <td data-value="59" class="abs high">59/59</td>
88
88
  <td data-value="100" class="pct high">100%</td>
89
89
  <td data-value="16" class="abs high">16/16</td>
90
- <td data-value="88.88" class="pct high">88.88%</td>
91
- <td data-value="9" class="abs high">8/9</td>
90
+ <td data-value="100" class="pct high">100%</td>
91
+ <td data-value="9" class="abs high">9/9</td>
92
92
  <td data-value="100" class="pct high">100%</td>
93
93
  <td data-value="47" class="abs high">47/47</td>
94
94
  </tr>
95
95
 
96
96
  <tr>
97
97
  <td class="file high" data-value="main.js"><a href="main.js.html">main.js</a></td>
98
- <td data-value="85" class="pic high">
99
- <div class="chart"><div class="cover-fill" style="width: 85%"></div><div class="cover-empty" style="width: 15%"></div></div>
98
+ <td data-value="88.09" class="pic high">
99
+ <div class="chart"><div class="cover-fill" style="width: 88%"></div><div class="cover-empty" style="width: 12%"></div></div>
100
100
  </td>
101
- <td data-value="85" class="pct high">85%</td>
102
- <td data-value="40" class="abs high">34/40</td>
103
- <td data-value="80" class="pct high">80%</td>
104
- <td data-value="5" class="abs high">4/5</td>
105
- <td data-value="53.84" class="pct medium">53.84%</td>
106
- <td data-value="13" class="abs medium">7/13</td>
101
+ <td data-value="88.09" class="pct high">88.09%</td>
102
+ <td data-value="42" class="abs high">37/42</td>
103
+ <td data-value="77.77" class="pct medium">77.77%</td>
104
+ <td data-value="9" class="abs medium">7/9</td>
105
+ <td data-value="61.53" class="pct medium">61.53%</td>
106
+ <td data-value="13" class="abs medium">8/13</td>
107
107
  <td data-value="100" class="pct high">100%</td>
108
- <td data-value="30" class="abs high">30/30</td>
108
+ <td data-value="31" class="abs high">31/31</td>
109
109
  </tr>
110
110
 
111
111
  <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-04-09T15:47:31.753Z
134
+ at 2026-07-09T05:05:03.811Z
135
135
  </div>
136
136
  <script src="../prettify.js"></script>
137
137
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">85% </span>
26
+ <span class="strong">88.09% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>34/40</span>
28
+ <span class='fraction'>37/42</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">80% </span>
33
+ <span class="strong">77.77% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>4/5</span>
35
+ <span class='fraction'>7/9</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">53.84% </span>
40
+ <span class="strong">61.53% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>7/13</span>
42
+ <span class='fraction'>8/13</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">100% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>30/30</span>
49
+ <span class='fraction'>31/31</span>
50
50
  </div>
51
51
 
52
52
 
@@ -238,7 +238,14 @@
238
238
  <a name='L173'></a><a href='#L173'>173</a>
239
239
  <a name='L174'></a><a href='#L174'>174</a>
240
240
  <a name='L175'></a><a href='#L175'>175</a>
241
- <a name='L176'></a><a href='#L176'>176</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
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>
242
249
  <span class="cline-any cline-neutral">&nbsp;</span>
243
250
  <span class="cline-any cline-neutral">&nbsp;</span>
244
251
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -278,28 +285,29 @@
278
285
  <span class="cline-any cline-neutral">&nbsp;</span>
279
286
  <span class="cline-any cline-neutral">&nbsp;</span>
280
287
  <span class="cline-any cline-neutral">&nbsp;</span>
281
- <span class="cline-any cline-yes">14x</span>
282
- <span class="cline-any cline-yes">14x</span>
283
- <span class="cline-any cline-yes">14x</span>
284
- <span class="cline-any cline-yes">4x</span>
285
- <span class="cline-any cline-yes">4x</span>
286
- <span class="cline-any cline-yes">4x</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>
291
+ <span class="cline-any cline-yes">6x</span>
292
+ <span class="cline-any cline-yes">6x</span>
293
+ <span class="cline-any cline-yes">3x</span>
287
294
  <span class="cline-any cline-neutral">&nbsp;</span>
288
295
  <span class="cline-any cline-neutral">&nbsp;</span>
289
- <span class="cline-any cline-yes">14x</span>
290
296
  <span class="cline-any cline-neutral">&nbsp;</span>
297
+ <span class="cline-any cline-yes">3x</span>
291
298
  <span class="cline-any cline-neutral">&nbsp;</span>
292
299
  <span class="cline-any cline-neutral">&nbsp;</span>
300
+ <span class="cline-any cline-yes">33x</span>
293
301
  <span class="cline-any cline-neutral">&nbsp;</span>
294
302
  <span class="cline-any cline-neutral">&nbsp;</span>
295
303
  <span class="cline-any cline-neutral">&nbsp;</span>
296
304
  <span class="cline-any cline-neutral">&nbsp;</span>
297
- <span class="cline-any cline-yes">14x</span>
298
- <span class="cline-any cline-yes">14x</span>
299
- <span class="cline-any cline-yes">14x</span>
300
305
  <span class="cline-any cline-neutral">&nbsp;</span>
301
306
  <span class="cline-any cline-neutral">&nbsp;</span>
302
307
  <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>
303
311
  <span class="cline-any cline-neutral">&nbsp;</span>
304
312
  <span class="cline-any cline-neutral">&nbsp;</span>
305
313
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -307,16 +315,16 @@
307
315
  <span class="cline-any cline-neutral">&nbsp;</span>
308
316
  <span class="cline-any cline-neutral">&nbsp;</span>
309
317
  <span class="cline-any cline-neutral">&nbsp;</span>
310
- <span class="cline-any cline-yes">14x</span>
311
- <span class="cline-any cline-yes">14x</span>
312
- <span class="cline-any cline-yes">14x</span>
313
- <span class="cline-any cline-yes">14x</span>
314
- <span class="cline-any cline-yes">14x</span>
315
- <span class="cline-any cline-yes">14x</span>
316
- <span class="cline-any cline-yes">14x</span>
317
318
  <span class="cline-any cline-neutral">&nbsp;</span>
318
319
  <span class="cline-any cline-neutral">&nbsp;</span>
319
320
  <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>
320
328
  <span class="cline-any cline-neutral">&nbsp;</span>
321
329
  <span class="cline-any cline-neutral">&nbsp;</span>
322
330
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -330,7 +338,10 @@
330
338
  <span class="cline-any cline-neutral">&nbsp;</span>
331
339
  <span class="cline-any cline-neutral">&nbsp;</span>
332
340
  <span class="cline-any cline-neutral">&nbsp;</span>
333
- <span class="cline-any cline-yes">14x</span>
341
+ <span class="cline-any cline-neutral">&nbsp;</span>
342
+ <span class="cline-any cline-neutral">&nbsp;</span>
343
+ <span class="cline-any cline-neutral">&nbsp;</span>
344
+ <span class="cline-any cline-yes">33x</span>
334
345
  <span class="cline-any cline-yes">2x</span>
335
346
  <span class="cline-any cline-yes">1x</span>
336
347
  <span class="cline-any cline-yes">2x</span>
@@ -342,55 +353,58 @@
342
353
  <span class="cline-any cline-neutral">&nbsp;</span>
343
354
  <span class="cline-any cline-neutral">&nbsp;</span>
344
355
  <span class="cline-any cline-neutral">&nbsp;</span>
345
- <span class="cline-any cline-yes">14x</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>
359
+ <span class="cline-any cline-neutral">&nbsp;</span>
346
360
  <span class="cline-any cline-neutral">&nbsp;</span>
347
361
  <span class="cline-any cline-neutral">&nbsp;</span>
348
362
  <span class="cline-any cline-neutral">&nbsp;</span>
363
+ <span class="cline-any cline-yes">33x</span>
349
364
  <span class="cline-any cline-neutral">&nbsp;</span>
350
365
  <span class="cline-any cline-neutral">&nbsp;</span>
351
366
  <span class="cline-any cline-neutral">&nbsp;</span>
352
- <span class="cline-any cline-yes">14x</span>
353
367
  <span class="cline-any cline-neutral">&nbsp;</span>
354
368
  <span class="cline-any cline-neutral">&nbsp;</span>
355
369
  <span class="cline-any cline-neutral">&nbsp;</span>
370
+ <span class="cline-any cline-yes">33x</span>
356
371
  <span class="cline-any cline-neutral">&nbsp;</span>
357
372
  <span class="cline-any cline-neutral">&nbsp;</span>
358
373
  <span class="cline-any cline-neutral">&nbsp;</span>
359
- <span class="cline-any cline-yes">14x</span>
360
374
  <span class="cline-any cline-neutral">&nbsp;</span>
361
375
  <span class="cline-any cline-neutral">&nbsp;</span>
362
376
  <span class="cline-any cline-neutral">&nbsp;</span>
377
+ <span class="cline-any cline-yes">33x</span>
363
378
  <span class="cline-any cline-neutral">&nbsp;</span>
364
379
  <span class="cline-any cline-neutral">&nbsp;</span>
365
380
  <span class="cline-any cline-neutral">&nbsp;</span>
366
- <span class="cline-any cline-yes">14x</span>
367
381
  <span class="cline-any cline-neutral">&nbsp;</span>
368
382
  <span class="cline-any cline-neutral">&nbsp;</span>
369
383
  <span class="cline-any cline-neutral">&nbsp;</span>
370
384
  <span class="cline-any cline-neutral">&nbsp;</span>
371
385
  <span class="cline-any cline-neutral">&nbsp;</span>
386
+ <span class="cline-any cline-yes">33x</span>
372
387
  <span class="cline-any cline-neutral">&nbsp;</span>
373
388
  <span class="cline-any cline-neutral">&nbsp;</span>
374
389
  <span class="cline-any cline-neutral">&nbsp;</span>
375
- <span class="cline-any cline-yes">14x</span>
376
390
  <span class="cline-any cline-neutral">&nbsp;</span>
377
391
  <span class="cline-any cline-neutral">&nbsp;</span>
378
392
  <span class="cline-any cline-neutral">&nbsp;</span>
379
393
  <span class="cline-any cline-neutral">&nbsp;</span>
394
+ <span class="cline-any cline-yes">33x</span>
380
395
  <span class="cline-any cline-neutral">&nbsp;</span>
381
396
  <span class="cline-any cline-neutral">&nbsp;</span>
382
397
  <span class="cline-any cline-neutral">&nbsp;</span>
383
- <span class="cline-any cline-yes">14x</span>
384
398
  <span class="cline-any cline-neutral">&nbsp;</span>
385
399
  <span class="cline-any cline-neutral">&nbsp;</span>
386
400
  <span class="cline-any cline-neutral">&nbsp;</span>
387
401
  <span class="cline-any cline-neutral">&nbsp;</span>
388
402
  <span class="cline-any cline-neutral">&nbsp;</span>
389
403
  <span class="cline-any cline-neutral">&nbsp;</span>
404
+ <span class="cline-any cline-yes">39x</span>
390
405
  <span class="cline-any cline-neutral">&nbsp;</span>
391
406
  <span class="cline-any cline-neutral">&nbsp;</span>
392
407
  <span class="cline-any cline-neutral">&nbsp;</span>
393
- <span class="cline-any cline-yes">18x</span>
394
408
  <span class="cline-any cline-neutral">&nbsp;</span>
395
409
  <span class="cline-any cline-neutral">&nbsp;</span>
396
410
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -404,8 +418,8 @@
404
418
  <span class="cline-any cline-neutral">&nbsp;</span>
405
419
  <span class="cline-any cline-neutral">&nbsp;</span>
406
420
  <span class="cline-any cline-neutral">&nbsp;</span>
407
- <span class="cline-any cline-yes">14x</span>
408
- <span class="cline-any cline-yes">14x</span>
421
+ <span class="cline-any cline-yes">33x</span>
422
+ <span class="cline-any cline-yes">33x</span>
409
423
  <span class="cline-any cline-neutral">&nbsp;</span>
410
424
  <span class="cline-any cline-neutral">&nbsp;</span>
411
425
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -451,14 +465,18 @@ import jumpBack from './methods/jumpBack.js'
451
465
  import jumpsReset from './methods/jumpsReset.js'
452
466
  &nbsp;
453
467
  &nbsp;
454
- function main ( cfg= {logLevel:0} ) {
468
+ function main ( cfg= {} ) {
455
469
  const
456
470
  shortcutMngr = shortcuts ({ errorEventName: '@app-error' })
457
- , logLevel = cfg.logLevel || 1
471
+ , logLevel = ( cfg.logLevel ?? 1 )
458
472
  , log = createLog ({ level:logLevel }, (arg) =&gt; {
459
- const { type } = arg;
460
- <span class="missing-if-branch" title="else path not taken" >E</span>if ( type === 'error' ) {
461
- shortcutMngr.emit ( '@app-error', arg )
473
+ const { type, logLevel:configuredLevel } = arg;
474
+ if ( configuredLevel === 0 ) return // Silent mode: no @app-error events
475
+ <span class="missing-if-branch" title="else path not taken" >E</span>if ( type === 'error' ) {
476
+ // Use the raw emitter (not shortcutMngr.emit) so '@app-error'
477
+ // handlers keep receiving the log entry as their sole argument -
478
+ // shortcutMngr.emit now prepends a { dependencies, type } context object.
479
+ shortcutMngr.getDependencies().emit ( '@app-error', arg )
462
480
  }
463
481
  })
464
482
  , state = {
@@ -567,7 +585,8 @@ function main ( cfg= {logLevel:0} ) {
567
585
  */
568
586
  API.getState = () =&gt; ({
569
587
  scene : state.currentScene
570
- , parents : state.currentParents
588
+ // Copy - never leak the live array, or callers mutating it corrupt internal state.
589
+ , parents : state.currentParents ? [ ...state.currentParents ] : <span class="branch-1 cbranch-no" title="branch not covered" >state.currentParents</span>
571
590
  , opened : state.opened
572
591
  })
573
592
  &nbsp;
@@ -579,7 +598,9 @@ function main ( cfg= {logLevel:0} ) {
579
598
  * @param {...*} args - Extra data to pass to the listeners
580
599
  * @returns void
581
600
  */
582
- API.emit = <span class="fstat-no" title="function not covered" >( </span>event, ...args ) =&gt; <span class="cstat-no" title="statement not covered" >shortcutMngr.emit ( event, ...args )</span>
601
+ // Use the raw emitter (not shortcutMngr.emit) so listeners keep receiving exactly the
602
+ // args passed here - shortcutMngr.emit prepends a { dependencies, type } context object.
603
+ API.emit = ( event, ...args ) =&gt; shortcutMngr.getDependencies().emit ( event, ...args )
583
604
  return API
584
605
  } // main func.
585
606
  &nbsp;
@@ -595,7 +616,7 @@ export default main
595
616
  <div class='footer quiet pad2 space-top1 center small'>
596
617
  Code coverage generated by
597
618
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
598
- at 2026-04-09T15:47:31.753Z
619
+ at 2026-07-09T05:05:03.811Z
599
620
  </div>
600
621
  <script src="../prettify.js"></script>
601
622
  <script>