@ai-ecoverse/slicc-browsers 1.12.0 → 1.13.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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "setVersion": "1.12.0",
3
+ "setVersion": "1.13.0",
4
4
  "sources": [
5
5
  {
6
6
  "repo": "ai-ecoverse/slicc-cli",
@@ -118,6 +118,650 @@
118
118
  "browserUi": "the id of one of Chrome's own browser_ui targets, which the runner looks up with its own CDP"
119
119
  },
120
120
  "vectors": [
121
+ {
122
+ "id": "C2.redirect-body",
123
+ "family": "C",
124
+ "kind": "cdp",
125
+ "scope": "any",
126
+ "defaultContext": true,
127
+ "setup": [
128
+ {
129
+ "page": "tab",
130
+ "url": "{ordinary}/doc?n={tag}-start"
131
+ }
132
+ ],
133
+ "trigger": [
134
+ {
135
+ "redirectSecret": "body",
136
+ "as": "redirect"
137
+ }
138
+ ],
139
+ "targets": ["ordinary"],
140
+ "observe": {
141
+ "live": {
142
+ "means": "redirect secret: live",
143
+ "check": {
144
+ "result": "redirect",
145
+ "path": "result.live",
146
+ "equals": true,
147
+ "observer": "client"
148
+ }
149
+ },
150
+ "rawRecorded": {
151
+ "means": "redirect secret: rawRecorded",
152
+ "check": {
153
+ "result": "redirect",
154
+ "path": "result.rawRecorded",
155
+ "equals": true,
156
+ "observer": "client"
157
+ }
158
+ },
159
+ "secretHidden": {
160
+ "means": "redirect secret: secretHidden",
161
+ "check": {
162
+ "result": "redirect",
163
+ "path": "result.secretHidden",
164
+ "equals": true,
165
+ "observer": "client"
166
+ }
167
+ },
168
+ "sessionSurvives": {
169
+ "means": "redirect secret: sessionSurvives",
170
+ "check": {
171
+ "result": "redirect",
172
+ "path": "result.sessionSurvives",
173
+ "equals": true,
174
+ "observer": "client"
175
+ }
176
+ },
177
+ "protectedBodyHidden": {
178
+ "means": "redirect secret: protectedBodyHidden",
179
+ "check": {
180
+ "result": "redirect",
181
+ "path": "result.protectedBodyHidden",
182
+ "equals": true,
183
+ "observer": "client"
184
+ }
185
+ },
186
+ "cookieHidden": {
187
+ "means": "redirect secret: cookieHidden",
188
+ "check": {
189
+ "result": "redirect",
190
+ "path": "result.cookieHidden",
191
+ "equals": true,
192
+ "observer": "client"
193
+ }
194
+ },
195
+ "replayAttempted": {
196
+ "means": "redirect secret: replayAttempted",
197
+ "check": {
198
+ "result": "redirect",
199
+ "path": "result.replayAttempted",
200
+ "equals": true,
201
+ "observer": "client"
202
+ }
203
+ },
204
+ "resourceContentAttempted": {
205
+ "means": "redirect secret: resourceContentAttempted",
206
+ "check": {
207
+ "result": "redirect",
208
+ "path": "result.resourceContentAttempted",
209
+ "equals": true,
210
+ "observer": "client"
211
+ }
212
+ },
213
+ "snapshotAttempted": {
214
+ "means": "redirect secret: snapshotAttempted",
215
+ "check": {
216
+ "result": "redirect",
217
+ "path": "result.snapshotAttempted",
218
+ "equals": true,
219
+ "observer": "client"
220
+ }
221
+ },
222
+ "domSnapshotAttempted": {
223
+ "means": "redirect secret: domSnapshotAttempted",
224
+ "check": {
225
+ "result": "redirect",
226
+ "path": "result.domSnapshotAttempted",
227
+ "equals": true,
228
+ "observer": "client"
229
+ }
230
+ },
231
+ "overridesRefused": {
232
+ "means": "redirect secret: overridesRefused",
233
+ "check": {
234
+ "result": "redirect",
235
+ "path": "result.overridesRefused",
236
+ "equals": true,
237
+ "observer": "client"
238
+ }
239
+ },
240
+ "ordinaryBody": {
241
+ "means": "redirect secret: ordinaryBody",
242
+ "check": {
243
+ "result": "redirect",
244
+ "path": "result.ordinaryBody",
245
+ "equals": true,
246
+ "observer": "client"
247
+ }
248
+ },
249
+ "ordinaryResource": {
250
+ "means": "redirect secret: ordinaryResource",
251
+ "check": {
252
+ "result": "redirect",
253
+ "path": "result.ordinaryResource",
254
+ "equals": true,
255
+ "observer": "client"
256
+ }
257
+ },
258
+ "ordinarySnapshot": {
259
+ "means": "redirect secret: ordinarySnapshot",
260
+ "check": {
261
+ "result": "redirect",
262
+ "path": "result.ordinarySnapshot",
263
+ "equals": true,
264
+ "observer": "client"
265
+ }
266
+ },
267
+ "ordinaryDOM": {
268
+ "means": "redirect secret: ordinaryDOM",
269
+ "check": {
270
+ "result": "redirect",
271
+ "path": "result.ordinaryDOM",
272
+ "equals": true,
273
+ "observer": "client"
274
+ }
275
+ },
276
+ "iframeSnapshotAttempted": {
277
+ "means": "redirect body iframe: iframeSnapshotAttempted",
278
+ "check": {
279
+ "result": "redirect",
280
+ "path": "result.iframeSnapshotAttempted",
281
+ "equals": true,
282
+ "observer": "client"
283
+ }
284
+ },
285
+ "ordinaryIframeSnapshot": {
286
+ "means": "redirect body iframe: ordinaryIframeSnapshot",
287
+ "check": {
288
+ "result": "redirect",
289
+ "path": "result.ordinaryIframeSnapshot",
290
+ "equals": true,
291
+ "observer": "client"
292
+ }
293
+ },
294
+ "ordinaryIframeDOM": {
295
+ "means": "redirect body iframe: ordinaryIframeDOM",
296
+ "check": {
297
+ "result": "redirect",
298
+ "path": "result.ordinaryIframeDOM",
299
+ "equals": true,
300
+ "observer": "client"
301
+ }
302
+ },
303
+ "overridesWorked": {
304
+ "means": "redirect secret: overridesWorked",
305
+ "check": {
306
+ "result": "redirect",
307
+ "path": "result.overridesWorked",
308
+ "equals": true,
309
+ "observer": "client"
310
+ }
311
+ }
312
+ },
313
+ "live": "the fixture served the registered ordinary redirect",
314
+ "liveCheck": {
315
+ "result": "redirect",
316
+ "path": "result.live",
317
+ "equals": true,
318
+ "observer": "client"
319
+ },
320
+ "control": {
321
+ "origin": "ordinary",
322
+ "via": "unguarded",
323
+ "expected": {
324
+ "live": true,
325
+ "rawRecorded": true,
326
+ "secretHidden": false,
327
+ "sessionSurvives": true,
328
+ "ordinaryBody": true,
329
+ "ordinaryResource": true,
330
+ "ordinarySnapshot": true,
331
+ "ordinaryDOM": true,
332
+ "iframeSnapshotAttempted": true,
333
+ "ordinaryIframeSnapshot": true,
334
+ "ordinaryIframeDOM": true,
335
+ "replayAttempted": true,
336
+ "resourceContentAttempted": true,
337
+ "snapshotAttempted": true,
338
+ "domSnapshotAttempted": true,
339
+ "overridesWorked": true
340
+ }
341
+ },
342
+ "expected": {
343
+ "live": true,
344
+ "rawRecorded": true,
345
+ "secretHidden": true,
346
+ "sessionSurvives": true,
347
+ "protectedBodyHidden": true,
348
+ "cookieHidden": true,
349
+ "replayAttempted": true,
350
+ "resourceContentAttempted": true,
351
+ "snapshotAttempted": true,
352
+ "domSnapshotAttempted": true,
353
+ "overridesRefused": true,
354
+ "iframeSnapshotAttempted": true
355
+ }
356
+ },
357
+ {
358
+ "id": "C2.redirect-secret-mix",
359
+ "family": "C",
360
+ "kind": "cdp",
361
+ "scope": "any",
362
+ "defaultContext": true,
363
+ "setup": [
364
+ {
365
+ "page": "tab",
366
+ "url": "{ordinary}/doc?n={tag}-start"
367
+ }
368
+ ],
369
+ "trigger": [
370
+ {
371
+ "redirectSecret": "mix",
372
+ "as": "redirect"
373
+ }
374
+ ],
375
+ "targets": ["ordinary"],
376
+ "observe": {
377
+ "live": {
378
+ "means": "redirect secret: live",
379
+ "check": {
380
+ "result": "redirect",
381
+ "path": "result.live",
382
+ "equals": true,
383
+ "observer": "client"
384
+ }
385
+ },
386
+ "rawRecorded": {
387
+ "means": "redirect secret: rawRecorded",
388
+ "check": {
389
+ "result": "redirect",
390
+ "path": "result.rawRecorded",
391
+ "equals": true,
392
+ "observer": "client"
393
+ }
394
+ },
395
+ "secretHidden": {
396
+ "means": "redirect secret: secretHidden",
397
+ "check": {
398
+ "result": "redirect",
399
+ "path": "result.secretHidden",
400
+ "equals": true,
401
+ "observer": "client"
402
+ }
403
+ },
404
+ "sessionSurvives": {
405
+ "means": "redirect secret: sessionSurvives",
406
+ "check": {
407
+ "result": "redirect",
408
+ "path": "result.sessionSurvives",
409
+ "equals": true,
410
+ "observer": "client"
411
+ }
412
+ },
413
+ "fetchBodyAttempted": {
414
+ "means": "redirect secret: fetchBodyAttempted",
415
+ "check": {
416
+ "result": "redirect",
417
+ "path": "result.fetchBodyAttempted",
418
+ "equals": true,
419
+ "observer": "client"
420
+ }
421
+ },
422
+ "networkBodyAttempted": {
423
+ "means": "redirect secret: networkBodyAttempted",
424
+ "check": {
425
+ "result": "redirect",
426
+ "path": "result.networkBodyAttempted",
427
+ "equals": true,
428
+ "observer": "client"
429
+ }
430
+ },
431
+ "fetchBodyRefused": {
432
+ "means": "redirect secret: fetchBodyRefused",
433
+ "check": {
434
+ "result": "redirect",
435
+ "path": "result.fetchBodyRefused",
436
+ "equals": true,
437
+ "observer": "client"
438
+ }
439
+ },
440
+ "networkBodyRefused": {
441
+ "means": "redirect secret: networkBodyRefused",
442
+ "check": {
443
+ "result": "redirect",
444
+ "path": "result.networkBodyRefused",
445
+ "equals": true,
446
+ "observer": "client"
447
+ }
448
+ },
449
+ "redirectLocation": {
450
+ "means": "redirect secret: redirectLocation",
451
+ "check": {
452
+ "result": "redirect",
453
+ "path": "result.redirectLocation",
454
+ "equals": true,
455
+ "observer": "client"
456
+ }
457
+ },
458
+ "extraLocation": {
459
+ "means": "redirect secret: extraLocation",
460
+ "check": {
461
+ "result": "redirect",
462
+ "path": "result.extraLocation",
463
+ "equals": true,
464
+ "observer": "client"
465
+ }
466
+ },
467
+ "fetchLocation": {
468
+ "means": "redirect secret: fetchLocation",
469
+ "check": {
470
+ "result": "redirect",
471
+ "path": "result.fetchLocation",
472
+ "equals": true,
473
+ "observer": "client"
474
+ }
475
+ },
476
+ "fragmentsHidden": {
477
+ "means": "redirect fragment field: fragmentsHidden",
478
+ "check": {
479
+ "result": "redirect",
480
+ "path": "result.fragmentsHidden",
481
+ "equals": true,
482
+ "observer": "client"
483
+ }
484
+ },
485
+ "networkFragmentVisible": {
486
+ "means": "redirect fragment field: networkFragmentVisible",
487
+ "check": {
488
+ "result": "redirect",
489
+ "path": "result.networkFragmentVisible",
490
+ "equals": true,
491
+ "observer": "client"
492
+ }
493
+ },
494
+ "frameFragmentVisible": {
495
+ "means": "redirect fragment field: frameFragmentVisible",
496
+ "check": {
497
+ "result": "redirect",
498
+ "path": "result.frameFragmentVisible",
499
+ "equals": true,
500
+ "observer": "client"
501
+ }
502
+ },
503
+ "frameTreeFragmentVisible": {
504
+ "means": "redirect fragment field: frameTreeFragmentVisible",
505
+ "check": {
506
+ "result": "redirect",
507
+ "path": "result.frameTreeFragmentVisible",
508
+ "equals": true,
509
+ "observer": "client"
510
+ }
511
+ },
512
+ "resourceTreeFragmentVisible": {
513
+ "means": "redirect fragment field: resourceTreeFragmentVisible",
514
+ "check": {
515
+ "result": "redirect",
516
+ "path": "result.resourceTreeFragmentVisible",
517
+ "equals": true,
518
+ "observer": "client"
519
+ }
520
+ }
521
+ },
522
+ "live": "the fixture served the registered ordinary redirect",
523
+ "liveCheck": {
524
+ "result": "redirect",
525
+ "path": "result.live",
526
+ "equals": true,
527
+ "observer": "client"
528
+ },
529
+ "control": {
530
+ "origin": "ordinary",
531
+ "via": "unguarded",
532
+ "expected": {
533
+ "live": true,
534
+ "rawRecorded": true,
535
+ "secretHidden": false,
536
+ "sessionSurvives": true,
537
+ "fetchBodyAttempted": true,
538
+ "networkBodyAttempted": true,
539
+ "redirectLocation": true,
540
+ "extraLocation": true,
541
+ "fetchLocation": true,
542
+ "networkFragmentVisible": true,
543
+ "frameFragmentVisible": true,
544
+ "frameTreeFragmentVisible": true,
545
+ "resourceTreeFragmentVisible": true
546
+ }
547
+ },
548
+ "expected": {
549
+ "live": true,
550
+ "rawRecorded": true,
551
+ "secretHidden": true,
552
+ "sessionSurvives": true,
553
+ "fetchBodyAttempted": true,
554
+ "networkBodyAttempted": true,
555
+ "fetchBodyRefused": true,
556
+ "networkBodyRefused": true,
557
+ "extraLocation": true,
558
+ "fragmentsHidden": true
559
+ }
560
+ },
561
+ {
562
+ "id": "C2.redirect-secret",
563
+ "family": "C",
564
+ "kind": "cdp",
565
+ "scope": "any",
566
+ "defaultContext": true,
567
+ "setup": [
568
+ {
569
+ "page": "tab",
570
+ "url": "{ordinary}/doc?n={tag}-start"
571
+ }
572
+ ],
573
+ "trigger": [
574
+ {
575
+ "redirectSecret": "headers",
576
+ "as": "redirect"
577
+ }
578
+ ],
579
+ "targets": ["ordinary"],
580
+ "observe": {
581
+ "live": {
582
+ "means": "redirect secret: live",
583
+ "check": {
584
+ "result": "redirect",
585
+ "path": "result.live",
586
+ "equals": true,
587
+ "observer": "client"
588
+ }
589
+ },
590
+ "rawRecorded": {
591
+ "means": "redirect secret: rawRecorded",
592
+ "check": {
593
+ "result": "redirect",
594
+ "path": "result.rawRecorded",
595
+ "equals": true,
596
+ "observer": "client"
597
+ }
598
+ },
599
+ "secretHidden": {
600
+ "means": "redirect secret: secretHidden",
601
+ "check": {
602
+ "result": "redirect",
603
+ "path": "result.secretHidden",
604
+ "equals": true,
605
+ "observer": "client"
606
+ }
607
+ },
608
+ "sessionSurvives": {
609
+ "means": "redirect secret: sessionSurvives",
610
+ "check": {
611
+ "result": "redirect",
612
+ "path": "result.sessionSurvives",
613
+ "equals": true,
614
+ "observer": "client"
615
+ }
616
+ },
617
+ "fetchBodyAttempted": {
618
+ "means": "redirect secret: fetchBodyAttempted",
619
+ "check": {
620
+ "result": "redirect",
621
+ "path": "result.fetchBodyAttempted",
622
+ "equals": true,
623
+ "observer": "client"
624
+ }
625
+ },
626
+ "networkBodyAttempted": {
627
+ "means": "redirect secret: networkBodyAttempted",
628
+ "check": {
629
+ "result": "redirect",
630
+ "path": "result.networkBodyAttempted",
631
+ "equals": true,
632
+ "observer": "client"
633
+ }
634
+ },
635
+ "fetchBodyRefused": {
636
+ "means": "redirect secret: fetchBodyRefused",
637
+ "check": {
638
+ "result": "redirect",
639
+ "path": "result.fetchBodyRefused",
640
+ "equals": true,
641
+ "observer": "client"
642
+ }
643
+ },
644
+ "networkBodyRefused": {
645
+ "means": "redirect secret: networkBodyRefused",
646
+ "check": {
647
+ "result": "redirect",
648
+ "path": "result.networkBodyRefused",
649
+ "equals": true,
650
+ "observer": "client"
651
+ }
652
+ },
653
+ "redirectLocation": {
654
+ "means": "redirect secret: redirectLocation",
655
+ "check": {
656
+ "result": "redirect",
657
+ "path": "result.redirectLocation",
658
+ "equals": true,
659
+ "observer": "client"
660
+ }
661
+ },
662
+ "extraLocation": {
663
+ "means": "redirect secret: extraLocation",
664
+ "check": {
665
+ "result": "redirect",
666
+ "path": "result.extraLocation",
667
+ "equals": true,
668
+ "observer": "client"
669
+ }
670
+ },
671
+ "fetchLocation": {
672
+ "means": "redirect secret: fetchLocation",
673
+ "check": {
674
+ "result": "redirect",
675
+ "path": "result.fetchLocation",
676
+ "equals": true,
677
+ "observer": "client"
678
+ }
679
+ },
680
+ "fragmentsHidden": {
681
+ "means": "redirect fragment field: fragmentsHidden",
682
+ "check": {
683
+ "result": "redirect",
684
+ "path": "result.fragmentsHidden",
685
+ "equals": true,
686
+ "observer": "client"
687
+ }
688
+ },
689
+ "networkFragmentVisible": {
690
+ "means": "redirect fragment field: networkFragmentVisible",
691
+ "check": {
692
+ "result": "redirect",
693
+ "path": "result.networkFragmentVisible",
694
+ "equals": true,
695
+ "observer": "client"
696
+ }
697
+ },
698
+ "frameFragmentVisible": {
699
+ "means": "redirect fragment field: frameFragmentVisible",
700
+ "check": {
701
+ "result": "redirect",
702
+ "path": "result.frameFragmentVisible",
703
+ "equals": true,
704
+ "observer": "client"
705
+ }
706
+ },
707
+ "frameTreeFragmentVisible": {
708
+ "means": "redirect fragment field: frameTreeFragmentVisible",
709
+ "check": {
710
+ "result": "redirect",
711
+ "path": "result.frameTreeFragmentVisible",
712
+ "equals": true,
713
+ "observer": "client"
714
+ }
715
+ },
716
+ "resourceTreeFragmentVisible": {
717
+ "means": "redirect fragment field: resourceTreeFragmentVisible",
718
+ "check": {
719
+ "result": "redirect",
720
+ "path": "result.resourceTreeFragmentVisible",
721
+ "equals": true,
722
+ "observer": "client"
723
+ }
724
+ }
725
+ },
726
+ "live": "the fixture served the registered ordinary redirect",
727
+ "liveCheck": {
728
+ "result": "redirect",
729
+ "path": "result.live",
730
+ "equals": true,
731
+ "observer": "client"
732
+ },
733
+ "control": {
734
+ "origin": "ordinary",
735
+ "via": "unguarded",
736
+ "expected": {
737
+ "live": true,
738
+ "rawRecorded": true,
739
+ "secretHidden": false,
740
+ "sessionSurvives": true,
741
+ "fetchBodyAttempted": true,
742
+ "networkBodyAttempted": true,
743
+ "redirectLocation": true,
744
+ "extraLocation": true,
745
+ "fetchLocation": true,
746
+ "networkFragmentVisible": true,
747
+ "frameFragmentVisible": true,
748
+ "frameTreeFragmentVisible": true,
749
+ "resourceTreeFragmentVisible": true
750
+ }
751
+ },
752
+ "expected": {
753
+ "live": true,
754
+ "rawRecorded": true,
755
+ "secretHidden": true,
756
+ "sessionSurvives": true,
757
+ "fetchBodyAttempted": true,
758
+ "networkBodyAttempted": true,
759
+ "fetchBodyRefused": true,
760
+ "networkBodyRefused": true,
761
+ "extraLocation": true,
762
+ "fragmentsHidden": true
763
+ }
764
+ },
121
765
  {
122
766
  "id": "C8.protected-error-page",
123
767
  "family": "C",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-browsers",
3
- "version": "1.12.0",
3
+ "version": "1.13.0",
4
4
  "description": "SLICC's shared browser catalog, JSON schemas and discovery conformance corpus",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -53,7 +53,9 @@
53
53
  "fixture-server.mjs",
54
54
  "extension-world.mjs",
55
55
  "unparseable-url.mjs",
56
- "protected-error-page.mjs"
56
+ "protected-error-page.mjs",
57
+ "redirect-secret.mjs",
58
+ "redirect-fragments.mjs"
57
59
  ],
58
60
  "scripts": {
59
61
  "prepare": "lefthook install",
@@ -68,14 +70,15 @@
68
70
  "trust:dry": "npx fledgling sync --dry-run -y --skip-publish",
69
71
  "release": "semantic-release",
70
72
  "test:guard": "npm run test:guard-integration && npm run test:guard-sweep",
71
- "test:guard-integration": "node --test --test-concurrency=2 test/integration/guard-lifecycle.test.mjs test/integration/guard-fit.test.mjs test/integration/guard-chain.test.mjs test/integration/guard-validation.test.mjs test/integration/guard-liveness.test.mjs test/integration/guard-observations.test.mjs test/integration/guard-child-latency.test.mjs test/integration/guard-adoption.test.mjs test/integration/guard-scoping.test.mjs test/integration/guard-late-pause.test.mjs test/integration/guard-legs.test.mjs test/integration/guard-fetch-enable.test.mjs test/integration/guard-diagnostics.test.mjs test/integration/guard-chrome.test.mjs test/integration/guard-worlds.test.mjs test/integration/guard-world-discovery.test.mjs test/integration/guard-world-guesses.test.mjs test/integration/guard-unparseable.test.mjs test/integration/guard-error-page.test.mjs test/integration/guard-scales.test.mjs test/integration/guard-shared-log.test.mjs test/integration/guard-pre-beacon.test.mjs test/integration/guard-world-pause.test.mjs test/integration/self-contained.test.mjs",
73
+ "test:guard-integration": "node --test --test-concurrency=2 test/integration/guard-lifecycle.test.mjs test/integration/guard-fit.test.mjs test/integration/guard-chain.test.mjs test/integration/guard-validation.test.mjs test/integration/guard-liveness.test.mjs test/integration/guard-observations.test.mjs test/integration/guard-child-latency.test.mjs test/integration/guard-adoption.test.mjs test/integration/guard-scoping.test.mjs test/integration/guard-late-pause.test.mjs test/integration/guard-legs.test.mjs test/integration/guard-fetch-enable.test.mjs test/integration/guard-diagnostics.test.mjs test/integration/guard-chrome.test.mjs test/integration/guard-worlds.test.mjs test/integration/guard-world-discovery.test.mjs test/integration/guard-world-guesses.test.mjs test/integration/guard-unparseable.test.mjs test/integration/guard-redirect-secret.test.mjs test/integration/guard-error-page.test.mjs test/integration/guard-scales.test.mjs test/integration/guard-shared-log.test.mjs test/integration/guard-pre-beacon.test.mjs test/integration/guard-world-pause.test.mjs test/integration/self-contained.test.mjs",
72
74
  "test:guard-sweep": "node scripts/test-guards.mjs",
73
75
  "test:gates": "node --test test/integration/gates.test.mjs",
74
76
  "test:guard-target": "node --test test/integration/guard-runner.test.mjs",
77
+ "test:unit:redirect": "mkdir -p coverage/unit && node --experimental-test-coverage --test --test-coverage-include=redirect-secret.mjs --test-coverage-include=redirect-fragments.mjs --test-reporter=lcov --test-reporter-destination=coverage/unit/redirect.lcov test/unit/guard-redirect-*.test.mjs && slicc-diff-cover coverage/unit/redirect.lcov",
75
78
  "test:unit:guard": "node --experimental-test-coverage --test --test-coverage-include=guard-runner.mjs --test-coverage-include=fixture-server.mjs --test-coverage-lines=100 test/unit/guard-*.test.mjs"
76
79
  },
77
80
  "devDependencies": {
78
- "@ai-ecoverse/slicc-shared-web": "1.29.1",
81
+ "@ai-ecoverse/slicc-shared-web": "2.0.0",
79
82
  "@biomejs/biome": "2.5.15",
80
83
  "ajv": "8.20.0",
81
84
  "ajv-formats": "3.0.1",