@fgv/ts-web-extras 5.1.0-12 → 5.1.0-15

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 (55) hide show
  1. package/.rush/temp/{974a5914552305b0a27fb30966567a15d3e85094.tar.log → 5e6de9551f93314b20b1864c1c59a8451069d073.tar.log} +2 -2
  2. package/.rush/temp/chunked-rush-logs/ts-web-extras.build.chunks.jsonl +12 -12
  3. package/.rush/temp/operation/build/all.log +12 -12
  4. package/.rush/temp/operation/build/log-chunks.jsonl +12 -12
  5. package/.rush/temp/operation/build/state.json +1 -1
  6. package/dist/packlets/crypto-utils/browserCryptoProvider.js +22 -1
  7. package/dist/packlets/crypto-utils/browserCryptoProvider.js.map +1 -1
  8. package/dist/ts-web-extras.d.ts +6 -0
  9. package/docs/CryptoUtils/classes/BrowserCryptoProvider.md +13 -0
  10. package/docs/CryptoUtils/classes/BrowserCryptoProvider.sha256.md +24 -0
  11. package/docs/classes/BrowserCryptoProvider.md +13 -0
  12. package/docs/classes/BrowserCryptoProvider.sha256.md +24 -0
  13. package/etc/ts-web-extras.api.md +1 -0
  14. package/lib/packlets/crypto-utils/browserCryptoProvider.d.ts +6 -0
  15. package/lib/packlets/crypto-utils/browserCryptoProvider.d.ts.map +1 -1
  16. package/lib/packlets/crypto-utils/browserCryptoProvider.js +21 -0
  17. package/lib/packlets/crypto-utils/browserCryptoProvider.js.map +1 -1
  18. package/package.json +10 -10
  19. package/rush-logs/ts-web-extras.build.cache.log +1 -1
  20. package/rush-logs/ts-web-extras.build.log +12 -12
  21. package/src/packlets/crypto-utils/browserCryptoProvider.ts +22 -1
  22. package/temp/build/typescript/ts_8nwakTlr.json +1 -1
  23. package/temp/coverage/crypto-utils/browserCryptoProvider.ts.html +69 -6
  24. package/temp/coverage/crypto-utils/browserHashProvider.ts.html +1 -1
  25. package/temp/coverage/crypto-utils/index.html +7 -7
  26. package/temp/coverage/file-tree/directoryHandleStore.ts.html +1 -1
  27. package/temp/coverage/file-tree/fileApiTreeAccessors.ts.html +1 -1
  28. package/temp/coverage/file-tree/fileSystemAccessTreeAccessors.ts.html +1 -1
  29. package/temp/coverage/file-tree/httpTreeAccessors.ts.html +1 -1
  30. package/temp/coverage/file-tree/index.html +1 -1
  31. package/temp/coverage/file-tree/localStorageTreeAccessors.ts.html +1 -1
  32. package/temp/coverage/helpers/fileTreeHelpers.ts.html +1 -1
  33. package/temp/coverage/helpers/index.html +1 -1
  34. package/temp/coverage/index.html +7 -7
  35. package/temp/coverage/lcov-report/crypto-utils/browserCryptoProvider.ts.html +69 -6
  36. package/temp/coverage/lcov-report/crypto-utils/browserHashProvider.ts.html +1 -1
  37. package/temp/coverage/lcov-report/crypto-utils/index.html +7 -7
  38. package/temp/coverage/lcov-report/file-tree/directoryHandleStore.ts.html +1 -1
  39. package/temp/coverage/lcov-report/file-tree/fileApiTreeAccessors.ts.html +1 -1
  40. package/temp/coverage/lcov-report/file-tree/fileSystemAccessTreeAccessors.ts.html +1 -1
  41. package/temp/coverage/lcov-report/file-tree/httpTreeAccessors.ts.html +1 -1
  42. package/temp/coverage/lcov-report/file-tree/index.html +1 -1
  43. package/temp/coverage/lcov-report/file-tree/localStorageTreeAccessors.ts.html +1 -1
  44. package/temp/coverage/lcov-report/helpers/fileTreeHelpers.ts.html +1 -1
  45. package/temp/coverage/lcov-report/helpers/index.html +1 -1
  46. package/temp/coverage/lcov-report/index.html +7 -7
  47. package/temp/coverage/lcov-report/url-utils/index.html +1 -1
  48. package/temp/coverage/lcov-report/url-utils/urlParams.ts.html +1 -1
  49. package/temp/coverage/lcov.info +31 -8
  50. package/temp/coverage/url-utils/index.html +1 -1
  51. package/temp/coverage/url-utils/urlParams.ts.html +1 -1
  52. package/temp/test/jest/haste-map-7492f1b44480e0cdd1f220078fb3afd8-c8dd6c3430605adeb2f1cadf4f75e791-8c9336785555d572065b28c111982ba4 +0 -0
  53. package/temp/test/jest/perf-cache-7492f1b44480e0cdd1f220078fb3afd8-da39a3ee5e6b4b0d3255bfef95601890 +1 -1
  54. package/temp/ts-web-extras.api.json +62 -0
  55. package/temp/ts-web-extras.api.md +1 -0
@@ -1627,7 +1627,7 @@ export class FileSystemAccessTreeAccessors<TCT extends string = string>
1627
1627
  <div class='footer quiet pad2 space-top1 center small'>
1628
1628
  Code coverage generated by
1629
1629
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1630
- at 2026-04-09T23:29:22.042Z
1630
+ at 2026-04-12T23:05:23.921Z
1631
1631
  </div>
1632
1632
  <script src="../prettify.js"></script>
1633
1633
  <script>
@@ -1504,7 +1504,7 @@ export class HttpTreeAccessors&lt;TCT extends string = string&gt;
1504
1504
  <div class='footer quiet pad2 space-top1 center small'>
1505
1505
  Code coverage generated by
1506
1506
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1507
- at 2026-04-09T23:29:22.042Z
1507
+ at 2026-04-12T23:05:23.921Z
1508
1508
  </div>
1509
1509
  <script src="../prettify.js"></script>
1510
1510
  <script>
@@ -161,7 +161,7 @@
161
161
  <div class='footer quiet pad2 space-top1 center small'>
162
162
  Code coverage generated by
163
163
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
164
- at 2026-04-09T23:29:22.042Z
164
+ at 2026-04-12T23:05:23.921Z
165
165
  </div>
166
166
  <script src="../prettify.js"></script>
167
167
  <script>
@@ -1360,7 +1360,7 @@ export class LocalStorageTreeAccessors&lt;TCT extends string = string&gt;
1360
1360
  <div class='footer quiet pad2 space-top1 center small'>
1361
1361
  Code coverage generated by
1362
1362
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1363
- at 2026-04-09T23:29:22.042Z
1363
+ at 2026-04-12T23:05:23.921Z
1364
1364
  </div>
1365
1365
  <script src="../prettify.js"></script>
1366
1366
  <script>
@@ -391,7 +391,7 @@ export function extractFileMetadata(file: File): IFileMetadata {
391
391
  <div class='footer quiet pad2 space-top1 center small'>
392
392
  Code coverage generated by
393
393
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
394
- at 2026-04-09T23:29:22.042Z
394
+ at 2026-04-12T23:05:23.921Z
395
395
  </div>
396
396
  <script src="../prettify.js"></script>
397
397
  <script>
@@ -101,7 +101,7 @@
101
101
  <div class='footer quiet pad2 space-top1 center small'>
102
102
  Code coverage generated by
103
103
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
104
- at 2026-04-09T23:29:22.042Z
104
+ at 2026-04-12T23:05:23.921Z
105
105
  </div>
106
106
  <script src="../prettify.js"></script>
107
107
  <script>
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">100% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>2827/2827</span>
28
+ <span class='fraction'>2848/2848</span>
29
29
  </div>
30
30
 
31
31
 
@@ -39,14 +39,14 @@
39
39
  <div class='fl pad1y space-right2'>
40
40
  <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>94/94</span>
42
+ <span class='fraction'>95/95</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'>2827/2827</span>
49
+ <span class='fraction'>2848/2848</span>
50
50
  </div>
51
51
 
52
52
 
@@ -84,13 +84,13 @@
84
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
86
  <td data-value="100" class="pct high">100%</td>
87
- <td data-value="384" class="abs high">384/384</td>
87
+ <td data-value="405" class="abs high">405/405</td>
88
88
  <td data-value="100" class="pct high">100%</td>
89
89
  <td data-value="9" class="abs high">9/9</td>
90
90
  <td data-value="100" class="pct high">100%</td>
91
- <td data-value="12" class="abs high">12/12</td>
91
+ <td data-value="13" class="abs high">13/13</td>
92
92
  <td data-value="100" class="pct high">100%</td>
93
- <td data-value="384" class="abs high">384/384</td>
93
+ <td data-value="405" class="abs high">405/405</td>
94
94
  </tr>
95
95
 
96
96
  <tr>
@@ -146,7 +146,7 @@
146
146
  <div class='footer quiet pad2 space-top1 center small'>
147
147
  Code coverage generated by
148
148
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
149
- at 2026-04-09T23:29:22.042Z
149
+ at 2026-04-12T23:05:23.921Z
150
150
  </div>
151
151
  <script src="prettify.js"></script>
152
152
  <script>
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">100% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>311/311</span>
28
+ <span class='fraction'>332/332</span>
29
29
  </div>
30
30
 
31
31
 
@@ -39,14 +39,14 @@
39
39
  <div class='fl pad1y space-right2'>
40
40
  <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>10/10</span>
42
+ <span class='fraction'>11/11</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'>311/311</span>
49
+ <span class='fraction'>332/332</span>
50
50
  </div>
51
51
 
52
52
 
@@ -374,7 +374,49 @@
374
374
  <a name='L309'></a><a href='#L309'>309</a>
375
375
  <a name='L310'></a><a href='#L310'>310</a>
376
376
  <a name='L311'></a><a href='#L311'>311</a>
377
- <a name='L312'></a><a href='#L312'>312</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
399
+ <span class="cline-any cline-yes">1x</span>
400
+ <span class="cline-any cline-yes">1x</span>
401
+ <span class="cline-any cline-yes">1x</span>
402
+ <span class="cline-any cline-yes">1x</span>
403
+ <span class="cline-any cline-yes">1x</span>
404
+ <span class="cline-any cline-yes">1x</span>
405
+ <span class="cline-any cline-yes">1x</span>
406
+ <span class="cline-any cline-yes">1x</span>
407
+ <span class="cline-any cline-yes">1x</span>
408
+ <span class="cline-any cline-yes">1x</span>
409
+ <span class="cline-any cline-yes">1x</span>
410
+ <span class="cline-any cline-yes">1x</span>
411
+ <span class="cline-any cline-yes">1x</span>
412
+ <span class="cline-any cline-yes">1x</span>
413
+ <span class="cline-any cline-yes">1x</span>
414
+ <span class="cline-any cline-yes">1x</span>
415
+ <span class="cline-any cline-yes">1x</span>
416
+ <span class="cline-any cline-yes">1x</span>
417
+ <span class="cline-any cline-yes">1x</span>
418
+ <span class="cline-any cline-yes">1x</span>
419
+ <span class="cline-any cline-yes">1x</span>
378
420
  <span class="cline-any cline-yes">1x</span>
379
421
  <span class="cline-any cline-yes">1x</span>
380
422
  <span class="cline-any cline-yes">1x</span>
@@ -706,7 +748,7 @@
706
748
  // SOFTWARE.
707
749
  &nbsp;
708
750
  /* c8 ignore start - Browser-only implementation cannot be tested in Node.js environment */
709
- import { captureResult, Failure, Result, Success } from '@fgv/ts-utils';
751
+ import { captureResult, fail, Failure, Result, succeed, Success } from '@fgv/ts-utils';
710
752
  import { CryptoUtils } from '@fgv/ts-extras';
711
753
  &nbsp;
712
754
  type ICryptoProvider = CryptoUtils.ICryptoProvider;
@@ -931,6 +973,27 @@ export class BrowserCryptoProvider implements ICryptoProvider {
931
973
  return Failure.with(`Key derivation failed: ${message}`);
932
974
  }
933
975
  }
976
+ &nbsp;
977
+ /**
978
+ * Computes a SHA-256 hash of the given data.
979
+ * @param data - UTF-8 string to hash
980
+ * @returns `Success` with hex-encoded hash string, or `Failure` with an error.
981
+ */
982
+ public async sha256(data: string): Promise&lt;Result&lt;string&gt;&gt; {
983
+ try {
984
+ const encoder = new TextEncoder();
985
+ const dataBuffer = encoder.encode(data);
986
+ const hashBuffer = await this._crypto.subtle.digest('SHA-256', dataBuffer);
987
+ const hashArray = new Uint8Array(hashBuffer);
988
+ const hashHex = Array.from(hashArray)
989
+ .map((b) =&gt; b.toString(16).padStart(2, '0'))
990
+ .join('');
991
+ return succeed(hashHex);
992
+ } catch (e) {
993
+ const message = e instanceof Error ? e.message : String(e);
994
+ return fail(`SHA-256 hash failed: ${message}`);
995
+ }
996
+ }
934
997
  &nbsp;
935
998
  // ============================================================================
936
999
  // Platform Utility Methods
@@ -1003,7 +1066,7 @@ export function createBrowserCryptoProvider(): Result&lt;BrowserCryptoProvider&g
1003
1066
  <div class='footer quiet pad2 space-top1 center small'>
1004
1067
  Code coverage generated by
1005
1068
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1006
- at 2026-04-09T23:29:21.959Z
1069
+ at 2026-04-12T23:05:23.872Z
1007
1070
  </div>
1008
1071
  <script src="../prettify.js"></script>
1009
1072
  <script>
@@ -289,7 +289,7 @@ export class BrowserHashProvider {
289
289
  <div class='footer quiet pad2 space-top1 center small'>
290
290
  Code coverage generated by
291
291
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
292
- at 2026-04-09T23:29:21.959Z
292
+ at 2026-04-12T23:05:23.872Z
293
293
  </div>
294
294
  <script src="../prettify.js"></script>
295
295
  <script>
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">100% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>384/384</span>
28
+ <span class='fraction'>405/405</span>
29
29
  </div>
30
30
 
31
31
 
@@ -39,14 +39,14 @@
39
39
  <div class='fl pad1y space-right2'>
40
40
  <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>12/12</span>
42
+ <span class='fraction'>13/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'>384/384</span>
49
+ <span class='fraction'>405/405</span>
50
50
  </div>
51
51
 
52
52
 
@@ -84,13 +84,13 @@
84
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
86
  <td data-value="100" class="pct high">100%</td>
87
- <td data-value="311" class="abs high">311/311</td>
87
+ <td data-value="332" class="abs high">332/332</td>
88
88
  <td data-value="100" class="pct high">100%</td>
89
89
  <td data-value="0" class="abs high">0/0</td>
90
90
  <td data-value="100" class="pct high">100%</td>
91
- <td data-value="10" class="abs high">10/10</td>
91
+ <td data-value="11" class="abs high">11/11</td>
92
92
  <td data-value="100" class="pct high">100%</td>
93
- <td data-value="311" class="abs high">311/311</td>
93
+ <td data-value="332" class="abs high">332/332</td>
94
94
  </tr>
95
95
 
96
96
  <tr>
@@ -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-09T23:29:21.959Z
119
+ at 2026-04-12T23:05:23.872Z
120
120
  </div>
121
121
  <script src="../prettify.js"></script>
122
122
  <script>
@@ -478,7 +478,7 @@ export class DirectoryHandleStore {
478
478
  <div class='footer quiet pad2 space-top1 center small'>
479
479
  Code coverage generated by
480
480
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
481
- at 2026-04-09T23:29:21.959Z
481
+ at 2026-04-12T23:05:23.872Z
482
482
  </div>
483
483
  <script src="../prettify.js"></script>
484
484
  <script>
@@ -1654,7 +1654,7 @@ export class FileApiTreeAccessors&lt;TCT extends string = string&gt; {
1654
1654
  <div class='footer quiet pad2 space-top1 center small'>
1655
1655
  Code coverage generated by
1656
1656
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1657
- at 2026-04-09T23:29:21.959Z
1657
+ at 2026-04-12T23:05:23.872Z
1658
1658
  </div>
1659
1659
  <script src="../prettify.js"></script>
1660
1660
  <script>
@@ -1627,7 +1627,7 @@ export class FileSystemAccessTreeAccessors&lt;TCT extends string = string&gt;
1627
1627
  <div class='footer quiet pad2 space-top1 center small'>
1628
1628
  Code coverage generated by
1629
1629
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1630
- at 2026-04-09T23:29:21.959Z
1630
+ at 2026-04-12T23:05:23.872Z
1631
1631
  </div>
1632
1632
  <script src="../prettify.js"></script>
1633
1633
  <script>
@@ -1504,7 +1504,7 @@ export class HttpTreeAccessors&lt;TCT extends string = string&gt;
1504
1504
  <div class='footer quiet pad2 space-top1 center small'>
1505
1505
  Code coverage generated by
1506
1506
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1507
- at 2026-04-09T23:29:21.959Z
1507
+ at 2026-04-12T23:05:23.872Z
1508
1508
  </div>
1509
1509
  <script src="../prettify.js"></script>
1510
1510
  <script>
@@ -161,7 +161,7 @@
161
161
  <div class='footer quiet pad2 space-top1 center small'>
162
162
  Code coverage generated by
163
163
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
164
- at 2026-04-09T23:29:21.959Z
164
+ at 2026-04-12T23:05:23.872Z
165
165
  </div>
166
166
  <script src="../prettify.js"></script>
167
167
  <script>
@@ -1360,7 +1360,7 @@ export class LocalStorageTreeAccessors&lt;TCT extends string = string&gt;
1360
1360
  <div class='footer quiet pad2 space-top1 center small'>
1361
1361
  Code coverage generated by
1362
1362
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1363
- at 2026-04-09T23:29:21.959Z
1363
+ at 2026-04-12T23:05:23.872Z
1364
1364
  </div>
1365
1365
  <script src="../prettify.js"></script>
1366
1366
  <script>
@@ -391,7 +391,7 @@ export function extractFileMetadata(file: File): IFileMetadata {
391
391
  <div class='footer quiet pad2 space-top1 center small'>
392
392
  Code coverage generated by
393
393
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
394
- at 2026-04-09T23:29:21.959Z
394
+ at 2026-04-12T23:05:23.872Z
395
395
  </div>
396
396
  <script src="../prettify.js"></script>
397
397
  <script>
@@ -101,7 +101,7 @@
101
101
  <div class='footer quiet pad2 space-top1 center small'>
102
102
  Code coverage generated by
103
103
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
104
- at 2026-04-09T23:29:21.959Z
104
+ at 2026-04-12T23:05:23.872Z
105
105
  </div>
106
106
  <script src="../prettify.js"></script>
107
107
  <script>
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">100% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>2827/2827</span>
28
+ <span class='fraction'>2848/2848</span>
29
29
  </div>
30
30
 
31
31
 
@@ -39,14 +39,14 @@
39
39
  <div class='fl pad1y space-right2'>
40
40
  <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>94/94</span>
42
+ <span class='fraction'>95/95</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'>2827/2827</span>
49
+ <span class='fraction'>2848/2848</span>
50
50
  </div>
51
51
 
52
52
 
@@ -84,13 +84,13 @@
84
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
86
  <td data-value="100" class="pct high">100%</td>
87
- <td data-value="384" class="abs high">384/384</td>
87
+ <td data-value="405" class="abs high">405/405</td>
88
88
  <td data-value="100" class="pct high">100%</td>
89
89
  <td data-value="9" class="abs high">9/9</td>
90
90
  <td data-value="100" class="pct high">100%</td>
91
- <td data-value="12" class="abs high">12/12</td>
91
+ <td data-value="13" class="abs high">13/13</td>
92
92
  <td data-value="100" class="pct high">100%</td>
93
- <td data-value="384" class="abs high">384/384</td>
93
+ <td data-value="405" class="abs high">405/405</td>
94
94
  </tr>
95
95
 
96
96
  <tr>
@@ -146,7 +146,7 @@
146
146
  <div class='footer quiet pad2 space-top1 center small'>
147
147
  Code coverage generated by
148
148
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
149
- at 2026-04-09T23:29:21.959Z
149
+ at 2026-04-12T23:05:23.872Z
150
150
  </div>
151
151
  <script src="prettify.js"></script>
152
152
  <script>
@@ -101,7 +101,7 @@
101
101
  <div class='footer quiet pad2 space-top1 center small'>
102
102
  Code coverage generated by
103
103
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
104
- at 2026-04-09T23:29:21.959Z
104
+ at 2026-04-12T23:05:23.872Z
105
105
  </div>
106
106
  <script src="../prettify.js"></script>
107
107
  <script>
@@ -805,7 +805,7 @@ export function isFilePath(path: string): boolean {
805
805
  <div class='footer quiet pad2 space-top1 center small'>
806
806
  Code coverage generated by
807
807
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
808
- at 2026-04-09T23:29:21.959Z
808
+ at 2026-04-12T23:05:23.872Z
809
809
  </div>
810
810
  <script src="../prettify.js"></script>
811
811
  <script>
@@ -6,18 +6,20 @@ FN:75,encrypt
6
6
  FN:134,decrypt
7
7
  FN:191,generateKey
8
8
  FN:207,deriveKey
9
- FN:257,generateRandomBytes
10
- FN:274,toBase64
11
- FN:288,fromBase64
12
- FN:308,createBrowserCryptoProvider
13
- FNF:10
14
- FNH:10
9
+ FN:253,sha256
10
+ FN:278,generateRandomBytes
11
+ FN:295,toBase64
12
+ FN:309,fromBase64
13
+ FN:329,createBrowserCryptoProvider
14
+ FNF:11
15
+ FNH:11
15
16
  FNDA:1,toArrayBuffer
16
17
  FNDA:1,BrowserCryptoProvider
17
18
  FNDA:1,encrypt
18
19
  FNDA:1,decrypt
19
20
  FNDA:1,generateKey
20
21
  FNDA:1,deriveKey
22
+ FNDA:1,sha256
21
23
  FNDA:1,generateRandomBytes
22
24
  FNDA:1,toBase64
23
25
  FNDA:1,fromBase64
@@ -333,8 +335,29 @@ DA:308,1
333
335
  DA:309,1
334
336
  DA:310,1
335
337
  DA:311,1
336
- LF:311
337
- LH:311
338
+ DA:312,1
339
+ DA:313,1
340
+ DA:314,1
341
+ DA:315,1
342
+ DA:316,1
343
+ DA:317,1
344
+ DA:318,1
345
+ DA:319,1
346
+ DA:320,1
347
+ DA:321,1
348
+ DA:322,1
349
+ DA:323,1
350
+ DA:324,1
351
+ DA:325,1
352
+ DA:326,1
353
+ DA:327,1
354
+ DA:328,1
355
+ DA:329,1
356
+ DA:330,1
357
+ DA:331,1
358
+ DA:332,1
359
+ LF:332
360
+ LH:332
338
361
  BRF:0
339
362
  BRH:0
340
363
  end_of_record
@@ -101,7 +101,7 @@
101
101
  <div class='footer quiet pad2 space-top1 center small'>
102
102
  Code coverage generated by
103
103
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
104
- at 2026-04-09T23:29:22.042Z
104
+ at 2026-04-12T23:05:23.921Z
105
105
  </div>
106
106
  <script src="../prettify.js"></script>
107
107
  <script>
@@ -805,7 +805,7 @@ export function isFilePath(path: string): boolean {
805
805
  <div class='footer quiet pad2 space-top1 center small'>
806
806
  Code coverage generated by
807
807
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
808
- at 2026-04-09T23:29:22.042Z
808
+ at 2026-04-12T23:05:23.921Z
809
809
  </div>
810
810
  <script src="../prettify.js"></script>
811
811
  <script>
@@ -1 +1 @@
1
- {"/home/runner/work/fgv/fgv/libraries/ts-web-extras/lib/test/unit/localStorageTreeAccessors.test.js":[1,1914],"/home/runner/work/fgv/fgv/libraries/ts-web-extras/lib/test/unit/fileApiTreeAccessors.test.js":[1,1996],"/home/runner/work/fgv/fgv/libraries/ts-web-extras/lib/test/unit/httpTreeAccessors.test.js":[1,2495],"/home/runner/work/fgv/fgv/libraries/ts-web-extras/lib/test/unit/fileSystemAccessTreeAccessors.test.js":[1,1358],"/home/runner/work/fgv/fgv/libraries/ts-web-extras/lib/test/unit/fileTreeHelpers.test.js":[1,1384],"/home/runner/work/fgv/fgv/libraries/ts-web-extras/lib/test/unit/fileApiTypes.test.js":[1,1051],"/home/runner/work/fgv/fgv/libraries/ts-web-extras/lib/test/unit/urlParams.test.js":[1,1275],"/home/runner/work/fgv/fgv/libraries/ts-web-extras/lib/test/unit/directoryHandleStore.test.js":[1,1395],"/home/runner/work/fgv/fgv/libraries/ts-web-extras/lib/test/unit/browserHashProvider.test.js":[1,1537]}
1
+ {"/home/runner/work/fgv/fgv/libraries/ts-web-extras/lib/test/unit/httpTreeAccessors.test.js":[1,2213],"/home/runner/work/fgv/fgv/libraries/ts-web-extras/lib/test/unit/localStorageTreeAccessors.test.js":[1,2198],"/home/runner/work/fgv/fgv/libraries/ts-web-extras/lib/test/unit/fileApiTreeAccessors.test.js":[1,2117],"/home/runner/work/fgv/fgv/libraries/ts-web-extras/lib/test/unit/fileTreeHelpers.test.js":[1,1257],"/home/runner/work/fgv/fgv/libraries/ts-web-extras/lib/test/unit/fileSystemAccessTreeAccessors.test.js":[1,1513],"/home/runner/work/fgv/fgv/libraries/ts-web-extras/lib/test/unit/fileApiTypes.test.js":[1,1582],"/home/runner/work/fgv/fgv/libraries/ts-web-extras/lib/test/unit/directoryHandleStore.test.js":[1,1141],"/home/runner/work/fgv/fgv/libraries/ts-web-extras/lib/test/unit/urlParams.test.js":[1,1429],"/home/runner/work/fgv/fgv/libraries/ts-web-extras/lib/test/unit/browserHashProvider.test.js":[1,1273]}
@@ -740,6 +740,68 @@
740
740
  "isAbstract": false,
741
741
  "name": "generateRandomBytes"
742
742
  },
743
+ {
744
+ "kind": "Method",
745
+ "canonicalReference": "@fgv/ts-web-extras!CryptoUtils.BrowserCryptoProvider#sha256:member(1)",
746
+ "docComment": "/**\n * Computes a SHA-256 hash of the given data.\n *\n * @param data - UTF-8 string to hash\n *\n * @returns `Success` with hex-encoded hash string, or `Failure` with an error.\n */\n",
747
+ "excerptTokens": [
748
+ {
749
+ "kind": "Content",
750
+ "text": "sha256(data: "
751
+ },
752
+ {
753
+ "kind": "Content",
754
+ "text": "string"
755
+ },
756
+ {
757
+ "kind": "Content",
758
+ "text": "): "
759
+ },
760
+ {
761
+ "kind": "Reference",
762
+ "text": "Promise",
763
+ "canonicalReference": "!Promise:interface"
764
+ },
765
+ {
766
+ "kind": "Content",
767
+ "text": "<"
768
+ },
769
+ {
770
+ "kind": "Reference",
771
+ "text": "Result",
772
+ "canonicalReference": "@fgv/ts-utils!Result:type"
773
+ },
774
+ {
775
+ "kind": "Content",
776
+ "text": "<string>>"
777
+ },
778
+ {
779
+ "kind": "Content",
780
+ "text": ";"
781
+ }
782
+ ],
783
+ "isStatic": false,
784
+ "returnTypeTokenRange": {
785
+ "startIndex": 3,
786
+ "endIndex": 7
787
+ },
788
+ "releaseTag": "Public",
789
+ "isProtected": false,
790
+ "overloadIndex": 1,
791
+ "parameters": [
792
+ {
793
+ "parameterName": "data",
794
+ "parameterTypeTokenRange": {
795
+ "startIndex": 1,
796
+ "endIndex": 2
797
+ },
798
+ "isOptional": false
799
+ }
800
+ ],
801
+ "isOptional": false,
802
+ "isAbstract": false,
803
+ "name": "sha256"
804
+ },
743
805
  {
744
806
  "kind": "Method",
745
807
  "canonicalReference": "@fgv/ts-web-extras!CryptoUtils.BrowserCryptoProvider#toBase64:member(1)",
@@ -23,6 +23,7 @@ class BrowserCryptoProvider implements ICryptoProvider {
23
23
  fromBase64(base64: string): Result<Uint8Array>;
24
24
  generateKey(): Promise<Result<Uint8Array>>;
25
25
  generateRandomBytes(length: number): Result<Uint8Array>;
26
+ sha256(data: string): Promise<Result<string>>;
26
27
  toBase64(data: Uint8Array): string;
27
28
  }
28
29