@peter.naydenov/cuts 2.1.3 → 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 (38) hide show
  1. package/Changelog.md +28 -0
  2. package/README.md +1 -1
  3. package/coverage/lcov-report/index.html +29 -29
  4. package/coverage/lcov-report/src/findInstructions.js.html +27 -27
  5. package/coverage/lcov-report/src/index.html +25 -25
  6. package/coverage/lcov-report/src/main.js.html +129 -51
  7. package/coverage/lcov-report/src/methods/hide.js.html +127 -67
  8. package/coverage/lcov-report/src/methods/index.html +38 -38
  9. package/coverage/lcov-report/src/methods/jump.js.html +27 -12
  10. package/coverage/lcov-report/src/methods/jumpBack.js.html +10 -10
  11. package/coverage/lcov-report/src/methods/jumpsReset.js.html +3 -3
  12. package/coverage/lcov-report/src/methods/listShortcuts.js.html +5 -5
  13. package/coverage/lcov-report/src/methods/setScenes.js.html +16 -16
  14. package/coverage/lcov-report/src/methods/show.js.html +154 -76
  15. package/coverage/lcov-report/src/setInstruction.js.html +23 -11
  16. package/coverage/lcov.info +362 -314
  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 +46 -39
  23. package/src/methods/jump.js +7 -2
  24. package/src/methods/jumpBack.js +2 -2
  25. package/src/methods/jumpsReset.js +1 -1
  26. package/src/methods/setScenes.js +1 -1
  27. package/src/methods/show.js +23 -6
  28. package/src/setInstruction.js +5 -1
  29. package/test/02-cuts.test.js +339 -1
  30. package/types/main.d.ts +42 -6
  31. package/types/main.d.ts.map +1 -1
  32. package/types/methods/hide.d.ts +1 -1
  33. package/types/methods/hide.d.ts.map +1 -1
  34. package/types/methods/jump.d.ts.map +1 -1
  35. package/types/methods/setScenes.d.ts +2 -2
  36. package/types/methods/show.d.ts.map +1 -1
  37. package/types/setInstruction.d.ts.map +1 -1
  38. package/vitest.config.js +1 -1
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">98.38% </span>
26
+ <span class="strong">97.14% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>61/62</span>
28
+ <span class='fraction'>68/70</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">93.33% </span>
33
+ <span class="strong">95.23% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>28/30</span>
35
+ <span class='fraction'>40/42</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">87.5% </span>
40
+ <span class="strong">77.77% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>7/8</span>
42
+ <span class='fraction'>7/9</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.41% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>57/57</span>
49
+ <span class='fraction'>62/63</span>
50
50
  </div>
51
51
 
52
52
 
@@ -190,7 +190,33 @@
190
190
  <a name='L125'></a><a href='#L125'>125</a>
191
191
  <a name='L126'></a><a href='#L126'>126</a>
192
192
  <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
194
220
  <span class="cline-any cline-neutral">&nbsp;</span>
195
221
  <span class="cline-any cline-neutral">&nbsp;</span>
196
222
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -207,62 +233,79 @@
207
233
  <span class="cline-any cline-neutral">&nbsp;</span>
208
234
  <span class="cline-any cline-neutral">&nbsp;</span>
209
235
  <span class="cline-any cline-neutral">&nbsp;</span>
210
- <span class="cline-any cline-yes">22x</span>
211
- <span class="cline-any cline-yes">22x</span>
212
- <span class="cline-any cline-yes">22x</span>
213
- <span class="cline-any cline-yes">22x</span>
214
- <span class="cline-any cline-yes">22x</span>
236
+ <span class="cline-any cline-yes">61x</span>
237
+ <span class="cline-any cline-yes">61x</span>
238
+ <span class="cline-any cline-yes">61x</span>
239
+ <span class="cline-any cline-yes">61x</span>
240
+ <span class="cline-any cline-yes">61x</span>
215
241
  <span class="cline-any cline-neutral">&nbsp;</span>
216
242
  <span class="cline-any cline-neutral">&nbsp;</span>
217
- <span class="cline-any cline-yes">22x</span>
218
- <span class="cline-any cline-yes">1x</span>
243
+ <span class="cline-any cline-yes">61x</span>
244
+ <span class="cline-any cline-yes">5x</span>
245
+ <span class="cline-any cline-yes">5x</span>
246
+ <span class="cline-any cline-yes">5x</span>
219
247
  <span class="cline-any cline-neutral">&nbsp;</span>
220
248
  <span class="cline-any cline-neutral">&nbsp;</span>
221
- <span class="cline-any cline-yes">1x</span>
249
+ <span class="cline-any cline-yes">5x</span>
250
+ <span class="cline-any cline-yes">2x</span>
222
251
  <span class="cline-any cline-neutral">&nbsp;</span>
223
- <span class="cline-any cline-yes">21x</span>
224
252
  <span class="cline-any cline-neutral">&nbsp;</span>
253
+ <span class="cline-any cline-no">&nbsp;</span>
225
254
  <span class="cline-any cline-neutral">&nbsp;</span>
226
- <span class="cline-any cline-yes">22x</span>
227
- <span class="cline-any cline-yes">22x</span>
228
255
  <span class="cline-any cline-neutral">&nbsp;</span>
256
+ <span class="cline-any cline-yes">56x</span>
229
257
  <span class="cline-any cline-neutral">&nbsp;</span>
230
- <span class="cline-any cline-yes">1x</span>
231
- <span class="cline-any cline-yes">1x</span>
232
258
  <span class="cline-any cline-neutral">&nbsp;</span>
259
+ <span class="cline-any cline-yes">61x</span>
260
+ <span class="cline-any cline-yes">61x</span>
233
261
  <span class="cline-any cline-neutral">&nbsp;</span>
234
- <span class="cline-any cline-yes">21x</span>
235
- <span class="cline-any cline-yes">1x</span>
236
262
  <span class="cline-any cline-neutral">&nbsp;</span>
263
+ <span class="cline-any cline-yes">3x</span>
264
+ <span class="cline-any cline-yes">3x</span>
237
265
  <span class="cline-any cline-neutral">&nbsp;</span>
238
266
  <span class="cline-any cline-neutral">&nbsp;</span>
267
+ <span class="cline-any cline-yes">58x</span>
268
+ <span class="cline-any cline-yes">3x</span>
239
269
  <span class="cline-any cline-neutral">&nbsp;</span>
240
- <span class="cline-any cline-yes">1x</span>
241
- <span class="cline-any cline-yes">1x</span>
242
270
  <span class="cline-any cline-neutral">&nbsp;</span>
243
271
  <span class="cline-any cline-neutral">&nbsp;</span>
244
- <span class="cline-any cline-yes">20x</span>
245
272
  <span class="cline-any cline-neutral">&nbsp;</span>
246
- <span class="cline-any cline-yes">1x</span>
247
- <span class="cline-any cline-yes">1x</span>
248
- <span class="cline-any cline-yes">1x</span>
249
- <span class="cline-any cline-yes">1x</span>
250
- <span class="cline-any cline-yes">1x</span>
273
+ <span class="cline-any cline-yes">3x</span>
274
+ <span class="cline-any cline-yes">3x</span>
251
275
  <span class="cline-any cline-neutral">&nbsp;</span>
252
276
  <span class="cline-any cline-neutral">&nbsp;</span>
253
- <span class="cline-any cline-yes">19x</span>
277
+ <span class="cline-any cline-yes">55x</span>
278
+ <span class="cline-any cline-neutral">&nbsp;</span>
279
+ <span class="cline-any cline-yes">2x</span>
280
+ <span class="cline-any cline-yes">2x</span>
281
+ <span class="cline-any cline-neutral">&nbsp;</span>
282
+ <span class="cline-any cline-neutral">&nbsp;</span>
283
+ <span class="cline-any cline-yes">2x</span>
284
+ <span class="cline-any cline-yes">2x</span>
285
+ <span class="cline-any cline-yes">2x</span>
286
+ <span class="cline-any cline-yes">2x</span>
287
+ <span class="cline-any cline-neutral">&nbsp;</span>
288
+ <span class="cline-any cline-neutral">&nbsp;</span>
289
+ <span class="cline-any cline-yes">53x</span>
290
+ <span class="cline-any cline-neutral">&nbsp;</span>
291
+ <span class="cline-any cline-yes">53x</span>
292
+ <span class="cline-any cline-neutral">&nbsp;</span>
293
+ <span class="cline-any cline-yes">53x</span>
294
+ <span class="cline-any cline-yes">9x</span>
295
+ <span class="cline-any cline-yes">9x</span>
254
296
  <span class="cline-any cline-neutral">&nbsp;</span>
255
- <span class="cline-any cline-yes">19x</span>
256
- <span class="cline-any cline-yes">1x</span>
257
- <span class="cline-any cline-yes">1x</span>
258
- <span class="cline-any cline-yes">1x</span>
259
- <span class="cline-any cline-yes">1x</span>
260
- <span class="cline-any cline-yes">1x</span>
261
297
  <span class="cline-any cline-neutral">&nbsp;</span>
262
298
  <span class="cline-any cline-neutral">&nbsp;</span>
263
- <span class="cline-any cline-yes">18x</span>
264
299
  <span class="cline-any cline-neutral">&nbsp;</span>
265
- <span class="cline-any cline-yes">22x</span>
300
+ <span class="cline-any cline-yes">9x</span>
301
+ <span class="cline-any cline-yes">9x</span>
302
+ <span class="cline-any cline-yes">9x</span>
303
+ <span class="cline-any cline-yes">9x</span>
304
+ <span class="cline-any cline-neutral">&nbsp;</span>
305
+ <span class="cline-any cline-neutral">&nbsp;</span>
306
+ <span class="cline-any cline-yes">44x</span>
307
+ <span class="cline-any cline-neutral">&nbsp;</span>
308
+ <span class="cline-any cline-yes">61x</span>
266
309
  <span class="cline-any cline-yes">1x</span>
267
310
  <span class="cline-any cline-neutral">&nbsp;</span>
268
311
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -273,43 +316,52 @@
273
316
  <span class="cline-any cline-neutral">&nbsp;</span>
274
317
  <span class="cline-any cline-neutral">&nbsp;</span>
275
318
  <span class="cline-any cline-neutral">&nbsp;</span>
276
- <span class="cline-any cline-yes">27x</span>
277
- <span class="cline-any cline-yes">18x</span>
278
- <span class="cline-any cline-yes">18x</span>
319
+ <span class="cline-any cline-yes">66x</span>
320
+ <span class="cline-any cline-yes">47x</span>
321
+ <span class="cline-any cline-yes">47x</span>
279
322
  <span class="cline-any cline-neutral">&nbsp;</span>
280
323
  <span class="cline-any cline-neutral">&nbsp;</span>
281
- <span class="cline-any cline-yes">9x</span>
282
- <span class="cline-any cline-yes">9x</span>
283
324
  <span class="cline-any cline-neutral">&nbsp;</span>
284
- <span class="cline-any cline-yes">27x</span>
325
+ <span class="cline-any cline-neutral">&nbsp;</span>
326
+ <span class="cline-any cline-yes">19x</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-neutral">&nbsp;</span>
330
+ <span class="cline-any cline-yes">19x</span>
331
+ <span class="cline-any cline-neutral">&nbsp;</span>
332
+ <span class="cline-any cline-yes">66x</span>
333
+ <span class="cline-any cline-neutral">&nbsp;</span>
334
+ <span class="cline-any cline-neutral">&nbsp;</span>
285
335
  <span class="cline-any cline-neutral">&nbsp;</span>
286
336
  <span class="cline-any cline-neutral">&nbsp;</span>
287
- <span class="cline-any cline-yes">17x</span>
288
337
  <span class="cline-any cline-neutral">&nbsp;</span>
289
- <span class="cline-any cline-yes">17x</span>
290
- <span class="cline-any cline-yes">17x</span>
291
338
  <span class="cline-any cline-neutral">&nbsp;</span>
339
+ <span class="cline-any cline-yes">43x</span>
340
+ <span class="cline-any cline-yes">43x</span>
292
341
  <span class="cline-any cline-neutral">&nbsp;</span>
293
- <span class="cline-any cline-yes">17x</span>
294
- <span class="cline-any cline-yes">27x</span>
295
- <span class="cline-any cline-yes">27x</span>
296
342
  <span class="cline-any cline-neutral">&nbsp;</span>
343
+ <span class="cline-any cline-yes">43x</span>
344
+ <span class="cline-any cline-yes">66x</span>
345
+ <span class="cline-any cline-yes">66x</span>
297
346
  <span class="cline-any cline-neutral">&nbsp;</span>
298
347
  <span class="cline-any cline-neutral">&nbsp;</span>
299
- <span class="cline-any cline-yes">17x</span>
300
348
  <span class="cline-any cline-neutral">&nbsp;</span>
301
- <span class="cline-any cline-yes">17x</span>
302
- <span class="cline-any cline-yes">17x</span>
303
- <span class="cline-any cline-yes">17x</span>
304
- <span class="cline-any cline-yes">17x</span>
305
- <span class="cline-any cline-yes">17x</span>
306
- <span class="cline-any cline-yes">17x</span>
307
- <span class="cline-any cline-yes">17x</span>
349
+ <span class="cline-any cline-yes">43x</span>
308
350
  <span class="cline-any cline-neutral">&nbsp;</span>
351
+ <span class="cline-any cline-yes">43x</span>
352
+ <span class="cline-any cline-yes">43x</span>
353
+ <span class="cline-any cline-yes">43x</span>
309
354
  <span class="cline-any cline-neutral">&nbsp;</span>
310
- <span class="cline-any cline-yes">22x</span>
311
355
  <span class="cline-any cline-neutral">&nbsp;</span>
312
- <span class="cline-any cline-yes">14x</span>
356
+ <span class="cline-any cline-yes">43x</span>
357
+ <span class="cline-any cline-yes">43x</span>
358
+ <span class="cline-any cline-yes">43x</span>
359
+ <span class="cline-any cline-yes">43x</span>
360
+ <span class="cline-any cline-neutral">&nbsp;</span>
361
+ <span class="cline-any cline-neutral">&nbsp;</span>
362
+ <span class="cline-any cline-yes">61x</span>
363
+ <span class="cline-any cline-neutral">&nbsp;</span>
364
+ <span class="cline-any cline-yes">35x</span>
313
365
  <span class="cline-any cline-neutral">&nbsp;</span>
314
366
  <span class="cline-any cline-neutral">&nbsp;</span>
315
367
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -341,11 +393,18 @@ function show ( dependencies, state ) {
341
393
  , hasBeforeHide = currentScene &amp;&amp; (typeof scenes[currentScene].beforeHide === 'function')
342
394
  ;
343
395
  &nbsp;
344
- if ( hasBeforeHide ) { // Execute 'beforeUnload' function if exists
396
+ if ( hasBeforeHide ) { // Execute 'beforeHide' function if exists
345
397
  const closingFn = scenes[currentScene].beforeHide;
346
- // TODO: If async elements in beforeUnload, we will
347
- // need full unloadTask and function should return a promise
348
- closingFn ({ done:unloadTask.done, dependencies: shortcutMngr.getDependencies() })
398
+ try {
399
+ const result = closingFn ({ done:unloadTask.done, dependencies: shortcutMngr.getDependencies() });
400
+ // If beforeHide returns a Promise, resolve it and pass the result to unloadTask.done
401
+ // so async blocking logic works correctly (e.g. confirm dialog → done(false)).
402
+ if ( result != null &amp;&amp; typeof result.then === 'function' ) {
403
+ 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>);
404
+ }
405
+ } catch ( err ) {
406
+ <span class="cstat-no" title="statement not covered" > unloadTask.done ( false );</span>
407
+ }
349
408
  } // if currentScene
350
409
  else unloadTask.done ( true )
351
410
  &nbsp;
@@ -372,18 +431,28 @@ function show ( dependencies, state ) {
372
431
  // Executes only once when the scene manager is started
373
432
  state.opened = true
374
433
  state.currentScene = requestedScene
434
+ // The server-rendered scene's ancestors are assumed already rendered too -
435
+ // record them, or navigating away later won't know to hide them.
436
+ state.currentParents = scenes[requestedScene].parents ? [ ...scenes[requestedScene].parents ] : <span class="branch-1 cbranch-no" title="branch not covered" >[]</span>
375
437
  shortcutMngr.changeContext ( requestedScene )
376
438
  showTask.done ()
377
439
  return showTask.promise
378
440
  }
379
441
 
380
442
  const { show, parents=[] } = scenes[requestedScene];
381
-
443
+ &nbsp;
444
+ if ( !state.currentParents ) state.currentParents = []
445
+ &nbsp;
382
446
  if ( parents[0] === '*' ) {
383
447
  const overlayTask = setInstruction(show, ...args)()
384
448
  overlayTask.then ( () =&gt; showTask.done () )
385
- state.currentParents.push ( state.currentScene )
449
+ // Only remember a real underlying scene - pushing 'null' as a placeholder
450
+ // makes later navigation treat it as a scene name to hide, and crash.
451
+ // Re-showing the SAME overlay that's already current must not push it onto
452
+ // its own ancestor chain either, or hide() later climbs back onto itself.
453
+ if ( state.currentScene &amp;&amp; state.currentScene !== requestedScene ) state.currentParents.push ( state.currentScene )
386
454
  state.currentScene = requestedScene
455
+ shortcutMngr.changeContext ( requestedScene ) // Activate the overlay scene's own shortcuts
387
456
  return showTask.promise
388
457
  }
389
458
  &nbsp;
@@ -405,15 +474,22 @@ function show ( dependencies, state ) {
405
474
  state.currentScene = name
406
475
  }
407
476
  else {
408
- let el = scenes[name].parents.at ( -1 )
477
+ // Wildcard overlays aren't climbing their own declared parents ('*' isn't a
478
+ // real scene) - they climb back to whatever scene they were shown on top of.
479
+ let el = ( scenes[name].parents[0] === '*' )
480
+ ? state.currentParents.pop ()
481
+ : scenes[name].parents.at ( -1 )
482
+ ;
409
483
  state.currentScene = el
410
484
  }
411
485
  return scenes[name][action]
412
486
  } // getStep func.
413
487
  &nbsp;
414
- if ( !state.currentParents ) state.currentParents = []
415
- const
416
- g = findInstructions ( state.currentScene, state.currentParents, requestedScene, parents )
488
+ const
489
+ // Snapshot - findInstructions is a lazy generator, and getStep (in the loop below)
490
+ // mutates state.currentParents in place; without a copy, that mutation corrupts
491
+ // the generator's still-pending reads of the very array it was given.
492
+ g = findInstructions ( state.currentScene, [ ...state.currentParents ], requestedScene, parents )
417
493
  , instructions = []
418
494
  ;
419
495
  &nbsp;
@@ -428,9 +504,11 @@ function show ( dependencies, state ) {
428
504
  goingTask.onComplete ( () =&gt; {
429
505
  state.opened = true
430
506
  state.currentScene = requestedScene
431
- state.currentParents = scenes[requestedScene].parents || <span class="branch-1 cbranch-no" title="branch not covered" >null </span>
507
+ // Copy - never alias state.currentParents to a scene's own 'parents' array,
508
+ // or later mutations (eg. the wildcard-overlay push above) corrupt the scene definition.
509
+ state.currentParents = scenes[requestedScene].parents ? [...scenes[requestedScene].parents] : <span class="branch-1 cbranch-no" title="branch not covered" >null</span>
432
510
  shortcutMngr.changeContext ( requestedScene )
433
- <span class="missing-if-branch" title="if path not taken" >I</span>if ( typeof scenes[requestedScene].afterShow === 'function' ) <span class="cstat-no" title="statement not covered" >scenes[requestedScene].afterShow ({ dependencies: shortcutMngr.getDependencies(), done: <span class="fstat-no" title="function not covered" >()</span> =&gt; {} })</span>
511
+ if ( typeof scenes[requestedScene].afterShow === 'function' ) scenes[requestedScene].afterShow ({ dependencies: shortcutMngr.getDependencies(), done: <span class="fstat-no" title="function not covered" >()</span> =&gt; {} })
434
512
  showTask.done ()
435
513
  })
436
514
  }) // unloadTask onComplete
@@ -451,7 +529,7 @@ export default show
451
529
  <div class='footer quiet pad2 space-top1 center small'>
452
530
  Code coverage generated by
453
531
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
454
- at 2026-04-09T15:47:31.753Z
532
+ at 2026-07-09T15:42:10.120Z
455
533
  </div>
456
534
  <script src="../../prettify.js"></script>
457
535
  <script>
@@ -37,9 +37,9 @@
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">100% </span>
40
+ <span class="strong">75% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>3/3</span>
42
+ <span class='fraction'>3/4</span>
43
43
  </div>
44
44
 
45
45
 
@@ -87,22 +87,30 @@
87
87
  <a name='L22'></a><a href='#L22'>22</a>
88
88
  <a name='L23'></a><a href='#L23'>23</a>
89
89
  <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
95
+ <span class="cline-any cline-neutral">&nbsp;</span>
96
+ <span class="cline-any cline-neutral">&nbsp;</span>
97
+ <span class="cline-any cline-neutral">&nbsp;</span>
98
+ <span class="cline-any cline-neutral">&nbsp;</span>
91
99
  <span class="cline-any cline-neutral">&nbsp;</span>
92
100
  <span class="cline-any cline-neutral">&nbsp;</span>
93
101
  <span class="cline-any cline-neutral">&nbsp;</span>
94
102
  <span class="cline-any cline-neutral">&nbsp;</span>
95
103
  <span class="cline-any cline-neutral">&nbsp;</span>
104
+ <span class="cline-any cline-yes">35x</span>
105
+ <span class="cline-any cline-yes">84x</span>
106
+ <span class="cline-any cline-yes">84x</span>
107
+ <span class="cline-any cline-yes">84x</span>
108
+ <span class="cline-any cline-yes">84x</span>
96
109
  <span class="cline-any cline-neutral">&nbsp;</span>
97
110
  <span class="cline-any cline-neutral">&nbsp;</span>
98
111
  <span class="cline-any cline-neutral">&nbsp;</span>
99
112
  <span class="cline-any cline-neutral">&nbsp;</span>
100
- <span class="cline-any cline-yes">14x</span>
101
- <span class="cline-any cline-yes">28x</span>
102
- <span class="cline-any cline-yes">28x</span>
103
- <span class="cline-any cline-yes">28x</span>
104
- <span class="cline-any cline-yes">28x</span>
105
- <span class="cline-any cline-yes">28x</span>
113
+ <span class="cline-any cline-yes">84x</span>
106
114
  <span class="cline-any cline-neutral">&nbsp;</span>
107
115
  <span class="cline-any cline-neutral">&nbsp;</span>
108
116
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -126,7 +134,11 @@ return function setInstruction ( fn, ...args ) {
126
134
  return function applyInstruction () {
127
135
  const task = askForPromise ();
128
136
  fn ({ task, dependencies:deps() }, ...args )
129
- return task.promise
137
+ // Swallow unhandled rejections from scene functions — the promise resolves
138
+ // as normal (via task.done() inside the scene), but if the scene throws or
139
+ // returns a rejected promise without catching, this prevents an unhandled
140
+ // rejection at the process level.
141
+ return task.promise.catch ( <span class="fstat-no" title="function not covered" >()</span> =&gt; {} )
130
142
  } // applyInstruction func.
131
143
  }} // setInstruction func.
132
144
  &nbsp;
@@ -142,7 +154,7 @@ export default setInstruction
142
154
  <div class='footer quiet pad2 space-top1 center small'>
143
155
  Code coverage generated by
144
156
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
145
- at 2026-04-09T15:47:31.753Z
157
+ at 2026-07-09T15:42:10.120Z
146
158
  </div>
147
159
  <script src="../prettify.js"></script>
148
160
  <script>