@fgv/ts-web-extras 5.1.0-1 → 5.1.0-11

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 (286) hide show
  1. package/.rush/temp/63a2c58f11944fdb592459d835a6483c79343b3f.tar.log +237 -0
  2. package/.rush/temp/chunked-rush-logs/ts-web-extras.build.chunks.jsonl +19 -39
  3. package/.rush/temp/operation/build/all.log +19 -39
  4. package/.rush/temp/operation/build/log-chunks.jsonl +19 -39
  5. package/.rush/temp/operation/build/state.json +1 -1
  6. package/.rush/temp/shrinkwrap-deps.json +690 -633
  7. package/config/typedoc.json +2 -1
  8. package/dist/packlets/file-tree/httpTreeAccessors.js +128 -41
  9. package/dist/packlets/file-tree/httpTreeAccessors.js.map +1 -1
  10. package/dist/test/unit/httpTreeAccessors.test.js +438 -74
  11. package/dist/test/unit/httpTreeAccessors.test.js.map +1 -1
  12. package/dist/ts-web-extras.d.ts +20 -0
  13. package/dist/tsdoc-metadata.json +1 -1
  14. package/docs/CryptoUtils/README.md +60 -0
  15. package/docs/CryptoUtils/classes/BrowserCryptoProvider.decrypt.md +27 -0
  16. package/docs/CryptoUtils/classes/BrowserCryptoProvider.deriveKey.md +26 -0
  17. package/docs/CryptoUtils/classes/BrowserCryptoProvider.encrypt.md +25 -0
  18. package/docs/CryptoUtils/classes/BrowserCryptoProvider.fromBase64.md +24 -0
  19. package/docs/CryptoUtils/classes/BrowserCryptoProvider.generateKey.md +17 -0
  20. package/docs/CryptoUtils/classes/BrowserCryptoProvider.generateRandomBytes.md +24 -0
  21. package/docs/CryptoUtils/classes/BrowserCryptoProvider.md +151 -0
  22. package/docs/CryptoUtils/classes/BrowserCryptoProvider.toBase64.md +24 -0
  23. package/docs/CryptoUtils/classes/BrowserHashProvider.hashParts.md +26 -0
  24. package/docs/CryptoUtils/classes/BrowserHashProvider.hashString.md +25 -0
  25. package/docs/CryptoUtils/classes/BrowserHashProvider.md +81 -0
  26. package/docs/CryptoUtils/functions/createBrowserCryptoProvider.md +12 -0
  27. package/docs/FileTreeHelpers/README.md +85 -0
  28. package/docs/FileTreeHelpers/functions/extractFileListMetadata.md +11 -0
  29. package/docs/FileTreeHelpers/functions/extractFileMetadata.md +11 -0
  30. package/docs/FileTreeHelpers/functions/fromDirectoryUpload.md +12 -0
  31. package/docs/FileTreeHelpers/functions/fromFileList.md +12 -0
  32. package/docs/FileTreeHelpers/functions/getOriginalFile.md +11 -0
  33. package/docs/FileTreeHelpers/variables/defaultFileApiTreeInitParams.md +9 -0
  34. package/docs/README.md +499 -53
  35. package/docs/classes/BrowserCryptoProvider.decrypt.md +27 -0
  36. package/docs/classes/BrowserCryptoProvider.deriveKey.md +26 -0
  37. package/docs/classes/BrowserCryptoProvider.encrypt.md +25 -0
  38. package/docs/classes/BrowserCryptoProvider.fromBase64.md +24 -0
  39. package/docs/classes/BrowserCryptoProvider.generateKey.md +17 -0
  40. package/docs/classes/BrowserCryptoProvider.generateRandomBytes.md +24 -0
  41. package/docs/classes/BrowserCryptoProvider.md +151 -0
  42. package/docs/classes/BrowserCryptoProvider.toBase64.md +24 -0
  43. package/docs/classes/BrowserHashProvider.hashParts.md +26 -0
  44. package/docs/classes/BrowserHashProvider.hashString.md +25 -0
  45. package/docs/classes/BrowserHashProvider.md +81 -0
  46. package/docs/classes/DirectoryHandleStore.getAll.md +17 -0
  47. package/docs/classes/DirectoryHandleStore.getAllLabels.md +17 -0
  48. package/docs/classes/DirectoryHandleStore.load.md +24 -0
  49. package/docs/classes/DirectoryHandleStore.md +65 -61
  50. package/docs/classes/DirectoryHandleStore.remove.md +24 -0
  51. package/docs/classes/DirectoryHandleStore.save.md +25 -0
  52. package/docs/classes/FileApiTreeAccessors.create.md +25 -0
  53. package/docs/classes/FileApiTreeAccessors.createFromHttp.md +24 -0
  54. package/docs/classes/FileApiTreeAccessors.createFromLocalStorage.md +25 -0
  55. package/docs/classes/FileApiTreeAccessors.createPersistent.md +26 -0
  56. package/docs/classes/FileApiTreeAccessors.createPersistentFromFile.md +27 -0
  57. package/docs/classes/FileApiTreeAccessors.extractFileMetadata.md +24 -0
  58. package/docs/classes/FileApiTreeAccessors.fromDirectoryUpload.md +25 -0
  59. package/docs/classes/FileApiTreeAccessors.fromFileList.md +25 -0
  60. package/docs/classes/FileApiTreeAccessors.getOriginalFile.md +27 -0
  61. package/docs/classes/FileApiTreeAccessors.md +87 -201
  62. package/docs/classes/FileSystemAccessTreeAccessors.deleteFile.md +22 -0
  63. package/docs/classes/FileSystemAccessTreeAccessors.fileIsMutable.md +22 -0
  64. package/docs/classes/FileSystemAccessTreeAccessors.fromDirectoryHandle.md +25 -0
  65. package/docs/classes/FileSystemAccessTreeAccessors.fromFileHandle.md +29 -0
  66. package/docs/classes/FileSystemAccessTreeAccessors.getDirtyPaths.md +15 -0
  67. package/docs/classes/FileSystemAccessTreeAccessors.isDirty.md +15 -0
  68. package/docs/classes/FileSystemAccessTreeAccessors.md +128 -410
  69. package/docs/classes/FileSystemAccessTreeAccessors.saveFileContents.md +23 -0
  70. package/docs/classes/FileSystemAccessTreeAccessors.syncToDisk.md +15 -0
  71. package/docs/classes/HttpTreeAccessors.deleteFile.md +22 -0
  72. package/docs/classes/HttpTreeAccessors.fileIsMutable.md +24 -0
  73. package/docs/classes/HttpTreeAccessors.fromHttp.md +24 -0
  74. package/docs/classes/HttpTreeAccessors.getDirtyPaths.md +17 -0
  75. package/docs/classes/HttpTreeAccessors.isDirty.md +17 -0
  76. package/docs/classes/HttpTreeAccessors.md +121 -368
  77. package/docs/classes/HttpTreeAccessors.saveFileContents.md +25 -0
  78. package/docs/classes/HttpTreeAccessors.syncToDisk.md +22 -0
  79. package/docs/classes/LocalStorageTreeAccessors.deleteFile.md +24 -0
  80. package/docs/classes/LocalStorageTreeAccessors.fileIsMutable.md +24 -0
  81. package/docs/classes/LocalStorageTreeAccessors.fromStorage.md +25 -0
  82. package/docs/classes/LocalStorageTreeAccessors.getDirtyPaths.md +17 -0
  83. package/docs/classes/LocalStorageTreeAccessors.isDirty.md +17 -0
  84. package/docs/classes/LocalStorageTreeAccessors.md +121 -371
  85. package/docs/classes/LocalStorageTreeAccessors.saveFileContents.md +25 -0
  86. package/docs/classes/LocalStorageTreeAccessors.syncToDisk.md +17 -0
  87. package/docs/functions/createBrowserCryptoProvider.md +12 -0
  88. package/docs/functions/exportAsJson.md +6 -17
  89. package/docs/functions/exportUsingFileSystemAPI.md +6 -21
  90. package/docs/functions/extractDirectoryPath.md +6 -16
  91. package/docs/functions/extractFileListMetadata.md +11 -0
  92. package/docs/functions/extractFileMetadata.md +11 -0
  93. package/docs/functions/fromDirectoryUpload.md +12 -0
  94. package/docs/functions/fromFileList.md +12 -0
  95. package/docs/functions/getOriginalFile.md +11 -0
  96. package/docs/functions/isDirectoryHandle.md +6 -18
  97. package/docs/functions/isFileHandle.md +6 -18
  98. package/docs/functions/isFilePath.md +6 -16
  99. package/docs/functions/parseContextFilter.md +6 -16
  100. package/docs/functions/parseQualifierDefaults.md +6 -16
  101. package/docs/functions/parseResourceTypes.md +6 -16
  102. package/docs/functions/parseUrlParameters.md +6 -10
  103. package/docs/functions/safeShowDirectoryPicker.md +6 -19
  104. package/docs/functions/safeShowOpenFilePicker.md +6 -19
  105. package/docs/functions/safeShowSaveFilePicker.md +6 -19
  106. package/docs/functions/supportsFileSystemAccess.md +6 -18
  107. package/docs/interfaces/FilePickerAcceptType.accept.md +9 -0
  108. package/docs/interfaces/FilePickerAcceptType.description.md +9 -0
  109. package/docs/interfaces/FilePickerAcceptType.md +54 -9
  110. package/docs/interfaces/FileSystemCreateWritableOptions.keepExistingData.md +9 -0
  111. package/docs/interfaces/FileSystemCreateWritableOptions.md +37 -8
  112. package/docs/interfaces/FileSystemDirectoryHandle._asyncIterator_.md +13 -0
  113. package/docs/interfaces/FileSystemDirectoryHandle.entries.md +13 -0
  114. package/docs/interfaces/FileSystemDirectoryHandle.getDirectoryHandle.md +21 -0
  115. package/docs/interfaces/FileSystemDirectoryHandle.getFileHandle.md +21 -0
  116. package/docs/interfaces/FileSystemDirectoryHandle.keys.md +13 -0
  117. package/docs/interfaces/FileSystemDirectoryHandle.kind.md +9 -0
  118. package/docs/interfaces/FileSystemDirectoryHandle.md +140 -103
  119. package/docs/interfaces/FileSystemDirectoryHandle.removeEntry.md +21 -0
  120. package/docs/interfaces/FileSystemDirectoryHandle.resolve.md +20 -0
  121. package/docs/interfaces/FileSystemDirectoryHandle.values.md +13 -0
  122. package/docs/interfaces/FileSystemFileHandle.createWritable.md +20 -0
  123. package/docs/interfaces/FileSystemFileHandle.getFile.md +13 -0
  124. package/docs/interfaces/FileSystemFileHandle.kind.md +9 -0
  125. package/docs/interfaces/FileSystemFileHandle.md +98 -58
  126. package/docs/interfaces/FileSystemGetDirectoryOptions.create.md +9 -0
  127. package/docs/interfaces/FileSystemGetDirectoryOptions.md +37 -8
  128. package/docs/interfaces/FileSystemGetFileOptions.create.md +9 -0
  129. package/docs/interfaces/FileSystemGetFileOptions.md +37 -8
  130. package/docs/interfaces/FileSystemHandle.isSameEntry.md +20 -0
  131. package/docs/interfaces/FileSystemHandle.kind.md +9 -0
  132. package/docs/interfaces/FileSystemHandle.md +88 -39
  133. package/docs/interfaces/FileSystemHandle.name.md +9 -0
  134. package/docs/interfaces/FileSystemHandle.queryPermission.md +20 -0
  135. package/docs/interfaces/FileSystemHandle.requestPermission.md +20 -0
  136. package/docs/interfaces/FileSystemHandlePermissionDescriptor.md +37 -8
  137. package/docs/interfaces/FileSystemHandlePermissionDescriptor.mode.md +9 -0
  138. package/docs/interfaces/FileSystemRemoveOptions.md +37 -8
  139. package/docs/interfaces/FileSystemRemoveOptions.recursive.md +9 -0
  140. package/docs/interfaces/FileSystemWritableFileStream.md +83 -68
  141. package/docs/interfaces/FileSystemWritableFileStream.seek.md +20 -0
  142. package/docs/interfaces/FileSystemWritableFileStream.truncate.md +20 -0
  143. package/docs/interfaces/FileSystemWritableFileStream.write.md +20 -0
  144. package/docs/interfaces/IDirectoryHandleTreeInitializer.dirHandles.md +9 -0
  145. package/docs/interfaces/IDirectoryHandleTreeInitializer.md +71 -10
  146. package/docs/interfaces/IDirectoryHandleTreeInitializer.nonRecursive.md +9 -0
  147. package/docs/interfaces/IDirectoryHandleTreeInitializer.prefix.md +9 -0
  148. package/docs/interfaces/IFileHandleTreeInitializer.fileHandles.md +9 -0
  149. package/docs/interfaces/IFileHandleTreeInitializer.md +54 -9
  150. package/docs/interfaces/IFileHandleTreeInitializer.prefix.md +9 -0
  151. package/docs/interfaces/IFileListTreeInitializer.fileList.md +9 -0
  152. package/docs/interfaces/IFileListTreeInitializer.md +37 -8
  153. package/docs/interfaces/IFileMetadata.lastModified.md +9 -0
  154. package/docs/interfaces/IFileMetadata.md +105 -12
  155. package/docs/interfaces/IFileMetadata.name.md +9 -0
  156. package/docs/interfaces/IFileMetadata.path.md +9 -0
  157. package/docs/interfaces/IFileMetadata.size.md +9 -0
  158. package/docs/interfaces/IFileMetadata.type.md +9 -0
  159. package/docs/interfaces/IFileSystemAccessTreeParams.autoSync.md +12 -0
  160. package/docs/interfaces/IFileSystemAccessTreeParams.filePath.md +13 -0
  161. package/docs/interfaces/IFileSystemAccessTreeParams.logger.md +11 -0
  162. package/docs/interfaces/IFileSystemAccessTreeParams.md +138 -20
  163. package/docs/interfaces/IFileSystemAccessTreeParams.requireWritePermission.md +13 -0
  164. package/docs/interfaces/IFsAccessApis.md +36 -31
  165. package/docs/interfaces/IFsAccessApis.showDirectoryPicker.md +20 -0
  166. package/docs/interfaces/IFsAccessApis.showOpenFilePicker.md +20 -0
  167. package/docs/interfaces/IFsAccessApis.showSaveFilePicker.md +20 -0
  168. package/docs/interfaces/IHttpTreeParams.autoSync.md +9 -0
  169. package/docs/interfaces/IHttpTreeParams.baseUrl.md +9 -0
  170. package/docs/interfaces/IHttpTreeParams.fetchImpl.md +9 -0
  171. package/docs/interfaces/IHttpTreeParams.logger.md +9 -0
  172. package/docs/interfaces/IHttpTreeParams.md +172 -22
  173. package/docs/interfaces/IHttpTreeParams.namespace.md +9 -0
  174. package/docs/interfaces/IHttpTreeParams.userId.md +9 -0
  175. package/docs/interfaces/ILocalStorageTreeParams.autoSync.md +12 -0
  176. package/docs/interfaces/ILocalStorageTreeParams.md +121 -20
  177. package/docs/interfaces/ILocalStorageTreeParams.pathToKeyMap.md +13 -0
  178. package/docs/interfaces/ILocalStorageTreeParams.storage.md +12 -0
  179. package/docs/interfaces/IUrlConfigOptions.config.md +11 -0
  180. package/docs/interfaces/IUrlConfigOptions.configStartDir.md +11 -0
  181. package/docs/interfaces/IUrlConfigOptions.contextFilter.md +11 -0
  182. package/docs/interfaces/IUrlConfigOptions.input.md +11 -0
  183. package/docs/interfaces/IUrlConfigOptions.inputStartDir.md +11 -0
  184. package/docs/interfaces/IUrlConfigOptions.interactive.md +11 -0
  185. package/docs/interfaces/IUrlConfigOptions.loadZip.md +11 -0
  186. package/docs/interfaces/IUrlConfigOptions.maxDistance.md +11 -0
  187. package/docs/interfaces/IUrlConfigOptions.md +241 -20
  188. package/docs/interfaces/IUrlConfigOptions.qualifierDefaults.md +11 -0
  189. package/docs/interfaces/IUrlConfigOptions.reduceQualifiers.md +11 -0
  190. package/docs/interfaces/IUrlConfigOptions.resourceTypes.md +11 -0
  191. package/docs/interfaces/IUrlConfigOptions.zipFile.md +11 -0
  192. package/docs/interfaces/IUrlConfigOptions.zipPath.md +11 -0
  193. package/docs/interfaces/ShowDirectoryPickerOptions.id.md +9 -0
  194. package/docs/interfaces/ShowDirectoryPickerOptions.md +71 -10
  195. package/docs/interfaces/ShowDirectoryPickerOptions.mode.md +9 -0
  196. package/docs/interfaces/ShowDirectoryPickerOptions.startIn.md +9 -0
  197. package/docs/interfaces/ShowOpenFilePickerOptions.excludeAcceptAllOption.md +9 -0
  198. package/docs/interfaces/ShowOpenFilePickerOptions.id.md +9 -0
  199. package/docs/interfaces/ShowOpenFilePickerOptions.md +105 -12
  200. package/docs/interfaces/ShowOpenFilePickerOptions.multiple.md +9 -0
  201. package/docs/interfaces/ShowOpenFilePickerOptions.startIn.md +9 -0
  202. package/docs/interfaces/ShowOpenFilePickerOptions.types.md +9 -0
  203. package/docs/interfaces/ShowSaveFilePickerOptions.excludeAcceptAllOption.md +9 -0
  204. package/docs/interfaces/ShowSaveFilePickerOptions.id.md +9 -0
  205. package/docs/interfaces/ShowSaveFilePickerOptions.md +105 -12
  206. package/docs/interfaces/ShowSaveFilePickerOptions.startIn.md +9 -0
  207. package/docs/interfaces/ShowSaveFilePickerOptions.suggestedName.md +9 -0
  208. package/docs/interfaces/ShowSaveFilePickerOptions.types.md +9 -0
  209. package/docs/type-aliases/TreeInitializer.md +7 -7
  210. package/docs/type-aliases/WellKnownDirectory.md +7 -7
  211. package/docs/type-aliases/WindowWithFsAccess.md +7 -7
  212. package/docs/variables/DEFAULT_DIRECTORY_HANDLE_DB.md +5 -7
  213. package/docs/variables/DEFAULT_DIRECTORY_HANDLE_STORE.md +5 -7
  214. package/docs/variables/defaultFileApiTreeInitParams.md +9 -0
  215. package/lib/packlets/file-tree/httpTreeAccessors.d.ts +20 -0
  216. package/lib/packlets/file-tree/httpTreeAccessors.d.ts.map +1 -1
  217. package/lib/packlets/file-tree/httpTreeAccessors.js +128 -41
  218. package/lib/packlets/file-tree/httpTreeAccessors.js.map +1 -1
  219. package/lib/test/unit/httpTreeAccessors.test.js +438 -74
  220. package/lib/test/unit/httpTreeAccessors.test.js.map +1 -1
  221. package/package.json +27 -26
  222. package/rush-logs/ts-web-extras.build.cache.log +3 -0
  223. package/rush-logs/ts-web-extras.build.log +19 -39
  224. package/src/packlets/file-tree/httpTreeAccessors.ts +142 -45
  225. package/src/test/unit/httpTreeAccessors.test.ts +556 -84
  226. package/temp/build/typescript/ts_8nwakTlr.json +1 -1
  227. package/temp/coverage/crypto-utils/browserCryptoProvider.ts.html +1 -1
  228. package/temp/coverage/crypto-utils/browserHashProvider.ts.html +1 -1
  229. package/temp/coverage/crypto-utils/index.html +1 -1
  230. package/temp/coverage/file-tree/directoryHandleStore.ts.html +1 -1
  231. package/temp/coverage/file-tree/fileApiTreeAccessors.ts.html +1 -1
  232. package/temp/coverage/file-tree/fileSystemAccessTreeAccessors.ts.html +1 -1
  233. package/temp/coverage/file-tree/httpTreeAccessors.ts.html +507 -216
  234. package/temp/coverage/file-tree/index.html +11 -11
  235. package/temp/coverage/file-tree/localStorageTreeAccessors.ts.html +1 -1
  236. package/temp/coverage/helpers/fileTreeHelpers.ts.html +1 -1
  237. package/temp/coverage/helpers/index.html +1 -1
  238. package/temp/coverage/index.html +11 -11
  239. package/temp/coverage/lcov-report/crypto-utils/browserCryptoProvider.ts.html +1 -1
  240. package/temp/coverage/lcov-report/crypto-utils/browserHashProvider.ts.html +1 -1
  241. package/temp/coverage/lcov-report/crypto-utils/index.html +1 -1
  242. package/temp/coverage/lcov-report/file-tree/directoryHandleStore.ts.html +1 -1
  243. package/temp/coverage/lcov-report/file-tree/fileApiTreeAccessors.ts.html +1 -1
  244. package/temp/coverage/lcov-report/file-tree/fileSystemAccessTreeAccessors.ts.html +1 -1
  245. package/temp/coverage/lcov-report/file-tree/httpTreeAccessors.ts.html +507 -216
  246. package/temp/coverage/lcov-report/file-tree/index.html +11 -11
  247. package/temp/coverage/lcov-report/file-tree/localStorageTreeAccessors.ts.html +1 -1
  248. package/temp/coverage/lcov-report/helpers/fileTreeHelpers.ts.html +1 -1
  249. package/temp/coverage/lcov-report/helpers/index.html +1 -1
  250. package/temp/coverage/lcov-report/index.html +11 -11
  251. package/temp/coverage/lcov-report/url-utils/index.html +1 -1
  252. package/temp/coverage/lcov-report/url-utils/urlParams.ts.html +1 -1
  253. package/temp/coverage/lcov.info +520 -387
  254. package/temp/coverage/url-utils/index.html +1 -1
  255. package/temp/coverage/url-utils/urlParams.ts.html +1 -1
  256. package/temp/test/jest/haste-map-7492f1b44480e0cdd1f220078fb3afd8-c8dd6c3430605adeb2f1cadf4f75e791-8c9336785555d572065b28c111982ba4 +0 -0
  257. package/temp/test/jest/perf-cache-7492f1b44480e0cdd1f220078fb3afd8-da39a3ee5e6b4b0d3255bfef95601890 +1 -0
  258. package/temp/ts-web-extras.api.json +2 -2
  259. package/.rush/temp/chunked-rush-logs/ts-web-extras.test.chunks.jsonl +0 -70
  260. package/.rush/temp/operation/build/error.log +0 -18
  261. package/.rush/temp/operation/test/all.log +0 -70
  262. package/.rush/temp/operation/test/error.log +0 -16
  263. package/.rush/temp/operation/test/log-chunks.jsonl +0 -70
  264. package/.rush/temp/operation/test/state.json +0 -3
  265. package/docs/@fgv/namespaces/CryptoUtils/README.md +0 -18
  266. package/docs/@fgv/namespaces/CryptoUtils/classes/BrowserCryptoProvider.md +0 -203
  267. package/docs/@fgv/namespaces/CryptoUtils/classes/BrowserHashProvider.md +0 -63
  268. package/docs/@fgv/namespaces/CryptoUtils/functions/createBrowserCryptoProvider.md +0 -18
  269. package/docs/@fgv/namespaces/FileTreeHelpers/README.md +0 -19
  270. package/docs/@fgv/namespaces/FileTreeHelpers/functions/extractFileListMetadata.md +0 -23
  271. package/docs/@fgv/namespaces/FileTreeHelpers/functions/extractFileMetadata.md +0 -23
  272. package/docs/@fgv/namespaces/FileTreeHelpers/functions/fromDirectoryUpload.md +0 -33
  273. package/docs/@fgv/namespaces/FileTreeHelpers/functions/fromFileList.md +0 -33
  274. package/docs/@fgv/namespaces/FileTreeHelpers/functions/getOriginalFile.md +0 -25
  275. package/docs/@fgv/namespaces/FileTreeHelpers/variables/defaultFileApiTreeInitParams.md +0 -11
  276. package/rush-logs/ts-web-extras.build.error.log +0 -18
  277. package/rush-logs/ts-web-extras.test.cache.log +0 -1
  278. package/rush-logs/ts-web-extras.test.error.log +0 -16
  279. package/rush-logs/ts-web-extras.test.log +0 -70
  280. package/temp/coverage/crypto/browserHashProvider.ts.html +0 -304
  281. package/temp/coverage/crypto/index.html +0 -116
  282. package/temp/coverage/lcov-report/crypto/browserHashProvider.ts.html +0 -304
  283. package/temp/coverage/lcov-report/crypto/index.html +0 -116
  284. package/temp/test/jest/haste-map-b931e4e63102f86c5bd4949f7dced44f-9d713eb41149188b4e5c0ae3d86d0a57-2ad8e16b24e391b8cdbe50b55c137169 +0 -0
  285. package/temp/test/jest/perf-cache-b931e4e63102f86c5bd4949f7dced44f-da39a3ee5e6b4b0d3255bfef95601890 +0 -1
  286. /package/temp/test/jest/{jest-transform-cache-b931e4e63102f86c5bd4949f7dced44f-79ef2876fae7ca75eedb2aa53dc48338/b5/package_b5f57afc9ec2c011239b1608ee5bdfa5 → jest-transform-cache-7492f1b44480e0cdd1f220078fb3afd8-79ef2876fae7ca75eedb2aa53dc48338/7c/package_7c16afc8299e635d80273763175c7a50} +0 -0
@@ -25,28 +25,28 @@
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'>381/381</span>
28
+ <span class='fraction'>478/478</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">100% </span>
33
+ <span class="strong">98.42% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>97/97</span>
35
+ <span class='fraction'>125/127</span>
36
36
  </div>
37
37
 
38
38
 
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'>13/13</span>
42
+ <span class='fraction'>16/16</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'>381/381</span>
49
+ <span class='fraction'>478/478</span>
50
50
  </div>
51
51
 
52
52
 
@@ -444,7 +444,106 @@
444
444
  <a name='L379'></a><a href='#L379'>379</a>
445
445
  <a name='L380'></a><a href='#L380'>380</a>
446
446
  <a name='L381'></a><a href='#L381'>381</a>
447
- <a name='L382'></a><a href='#L382'>382</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
545
+ <span class="cline-any cline-yes">1x</span>
546
+ <span class="cline-any cline-yes">1x</span>
448
547
  <span class="cline-any cline-yes">1x</span>
449
548
  <span class="cline-any cline-yes">1x</span>
450
549
  <span class="cline-any cline-yes">1x</span>
@@ -488,12 +587,12 @@
488
587
  <span class="cline-any cline-yes">1x</span>
489
588
  <span class="cline-any cline-yes">1x</span>
490
589
  <span class="cline-any cline-yes">1x</span>
590
+ <span class="cline-any cline-yes">168x</span>
591
+ <span class="cline-any cline-yes">168x</span>
592
+ <span class="cline-any cline-yes">168x</span>
593
+ <span class="cline-any cline-yes">168x</span>
491
594
  <span class="cline-any cline-yes">1x</span>
492
595
  <span class="cline-any cline-yes">1x</span>
493
- <span class="cline-any cline-yes">141x</span>
494
- <span class="cline-any cline-yes">141x</span>
495
- <span class="cline-any cline-yes">141x</span>
496
- <span class="cline-any cline-yes">141x</span>
497
596
  <span class="cline-any cline-yes">1x</span>
498
597
  <span class="cline-any cline-yes">1x</span>
499
598
  <span class="cline-any cline-yes">1x</span>
@@ -526,14 +625,15 @@
526
625
  <span class="cline-any cline-yes">1x</span>
527
626
  <span class="cline-any cline-yes">1x</span>
528
627
  <span class="cline-any cline-yes">1x</span>
529
- <span class="cline-any cline-yes">44x</span>
530
- <span class="cline-any cline-yes">44x</span>
531
- <span class="cline-any cline-yes">44x</span>
532
- <span class="cline-any cline-yes">44x</span>
533
- <span class="cline-any cline-yes">44x</span>
534
- <span class="cline-any cline-yes">44x</span>
535
- <span class="cline-any cline-yes">44x</span>
536
- <span class="cline-any cline-yes">44x</span>
628
+ <span class="cline-any cline-yes">1x</span>
629
+ <span class="cline-any cline-yes">53x</span>
630
+ <span class="cline-any cline-yes">53x</span>
631
+ <span class="cline-any cline-yes">53x</span>
632
+ <span class="cline-any cline-yes">53x</span>
633
+ <span class="cline-any cline-yes">53x</span>
634
+ <span class="cline-any cline-yes">53x</span>
635
+ <span class="cline-any cline-yes">53x</span>
636
+ <span class="cline-any cline-yes">53x</span>
537
637
  <span class="cline-any cline-yes">1x</span>
538
638
  <span class="cline-any cline-yes">1x</span>
539
639
  <span class="cline-any cline-yes">4x</span>
@@ -552,90 +652,145 @@
552
652
  <span class="cline-any cline-yes">1x</span>
553
653
  <span class="cline-any cline-yes">1x</span>
554
654
  <span class="cline-any cline-yes">1x</span>
555
- <span class="cline-any cline-yes">54x</span>
556
- <span class="cline-any cline-yes">54x</span>
557
- <span class="cline-any cline-yes">54x</span>
558
- <span class="cline-any cline-yes">54x</span>
655
+ <span class="cline-any cline-yes">63x</span>
656
+ <span class="cline-any cline-yes">63x</span>
657
+ <span class="cline-any cline-yes">63x</span>
658
+ <span class="cline-any cline-yes">63x</span>
559
659
  <span class="cline-any cline-yes">10x</span>
560
660
  <span class="cline-any cline-yes">10x</span>
561
- <span class="cline-any cline-yes">44x</span>
562
- <span class="cline-any cline-yes">44x</span>
661
+ <span class="cline-any cline-yes">53x</span>
662
+ <span class="cline-any cline-yes">53x</span>
563
663
  <span class="cline-any cline-yes">1x</span>
564
664
  <span class="cline-any cline-yes">1x</span>
565
665
  <span class="cline-any cline-yes">1x</span>
566
666
  <span class="cline-any cline-yes">1x</span>
567
667
  <span class="cline-any cline-yes">1x</span>
568
668
  <span class="cline-any cline-yes">1x</span>
569
- <span class="cline-any cline-yes">21x</span>
570
669
  <span class="cline-any cline-yes">1x</span>
571
670
  <span class="cline-any cline-yes">1x</span>
572
- <span class="cline-any cline-yes">20x</span>
573
- <span class="cline-any cline-yes">21x</span>
574
- <span class="cline-any cline-yes">4x</span>
575
- <span class="cline-any cline-yes">4x</span>
576
- <span class="cline-any cline-yes">4x</span>
577
671
  <span class="cline-any cline-yes">1x</span>
578
672
  <span class="cline-any cline-yes">1x</span>
579
- <span class="cline-any cline-yes">4x</span>
580
- <span class="cline-any cline-yes">4x</span>
581
- <span class="cline-any cline-yes">4x</span>
582
- <span class="cline-any cline-yes">4x</span>
583
- <span class="cline-any cline-yes">4x</span>
584
673
  <span class="cline-any cline-yes">1x</span>
585
674
  <span class="cline-any cline-yes">1x</span>
586
- <span class="cline-any cline-yes">4x</span>
587
- <span class="cline-any cline-yes">19x</span>
588
- <span class="cline-any cline-yes">21x</span>
589
- <span class="cline-any cline-yes">17x</span>
590
- <span class="cline-any cline-yes">17x</span>
675
+ <span class="cline-any cline-yes">31x</span>
591
676
  <span class="cline-any cline-yes">1x</span>
592
677
  <span class="cline-any cline-yes">1x</span>
593
- <span class="cline-any cline-yes">16x</span>
594
- <span class="cline-any cline-yes">16x</span>
595
- <span class="cline-any cline-yes">16x</span>
596
- <span class="cline-any cline-yes">16x</span>
597
- <span class="cline-any cline-yes">16x</span>
598
- <span class="cline-any cline-yes">17x</span>
599
678
  <span class="cline-any cline-yes">1x</span>
600
679
  <span class="cline-any cline-yes">1x</span>
601
- <span class="cline-any cline-yes">16x</span>
602
- <span class="cline-any cline-yes">16x</span>
603
- <span class="cline-any cline-yes">16x</span>
604
- <span class="cline-any cline-yes">16x</span>
605
- <span class="cline-any cline-yes">16x</span>
680
+ <span class="cline-any cline-yes">30x</span>
681
+ <span class="cline-any cline-yes">30x</span>
682
+ <span class="cline-any cline-yes">30x</span>
683
+ <span class="cline-any cline-yes">30x</span>
684
+ <span class="cline-any cline-yes">30x</span>
685
+ <span class="cline-any cline-yes">30x</span>
686
+ <span class="cline-any cline-yes">1x</span>
687
+ <span class="cline-any cline-yes">1x</span>
688
+ <span class="cline-any cline-yes">30x</span>
689
+ <span class="cline-any cline-yes">30x</span>
690
+ <span class="cline-any cline-yes">30x</span>
691
+ <span class="cline-any cline-yes">30x</span>
692
+ <span class="cline-any cline-yes">30x</span>
693
+ <span class="cline-any cline-yes">30x</span>
694
+ <span class="cline-any cline-yes">30x</span>
695
+ <span class="cline-any cline-yes">30x</span>
696
+ <span class="cline-any cline-yes">30x</span>
697
+ <span class="cline-any cline-yes">30x</span>
698
+ <span class="cline-any cline-yes">30x</span>
699
+ <span class="cline-any cline-yes">30x</span>
700
+ <span class="cline-any cline-yes">30x</span>
701
+ <span class="cline-any cline-yes">30x</span>
702
+ <span class="cline-any cline-yes">30x</span>
703
+ <span class="cline-any cline-yes">30x</span>
704
+ <span class="cline-any cline-yes">30x</span>
705
+ <span class="cline-any cline-yes">5x</span>
706
+ <span class="cline-any cline-yes">5x</span>
707
+ <span class="cline-any cline-yes">5x</span>
708
+ <span class="cline-any cline-yes">1x</span>
709
+ <span class="cline-any cline-yes">1x</span>
710
+ <span class="cline-any cline-yes">5x</span>
711
+ <span class="cline-any cline-yes">5x</span>
712
+ <span class="cline-any cline-yes">5x</span>
713
+ <span class="cline-any cline-yes">5x</span>
714
+ <span class="cline-any cline-yes">5x</span>
715
+ <span class="cline-any cline-yes">2x</span>
716
+ <span class="cline-any cline-yes">2x</span>
717
+ <span class="cline-any cline-yes">2x</span>
718
+ <span class="cline-any cline-yes">5x</span>
719
+ <span class="cline-any cline-yes">28x</span>
720
+ <span class="cline-any cline-yes">30x</span>
721
+ <span class="cline-any cline-yes">26x</span>
722
+ <span class="cline-any cline-yes">26x</span>
723
+ <span class="cline-any cline-yes">1x</span>
724
+ <span class="cline-any cline-yes">1x</span>
725
+ <span class="cline-any cline-yes">1x</span>
726
+ <span class="cline-any cline-yes">25x</span>
727
+ <span class="cline-any cline-yes">25x</span>
728
+ <span class="cline-any cline-yes">25x</span>
729
+ <span class="cline-any cline-yes">25x</span>
730
+ <span class="cline-any cline-yes">25x</span>
731
+ <span class="cline-any cline-yes">26x</span>
732
+ <span class="cline-any cline-yes">1x</span>
733
+ <span class="cline-any cline-yes">1x</span>
734
+ <span class="cline-any cline-yes">25x</span>
735
+ <span class="cline-any cline-yes">25x</span>
736
+ <span class="cline-any cline-yes">25x</span>
737
+ <span class="cline-any cline-yes">25x</span>
738
+ <span class="cline-any cline-yes">25x</span>
739
+ <span class="cline-any cline-yes">26x</span>
740
+ <span class="cline-any cline-yes">9x</span>
741
+ <span class="cline-any cline-yes">9x</span>
742
+ <span class="cline-any cline-yes">9x</span>
743
+ <span class="cline-any cline-yes">26x</span>
744
+ <span class="cline-any cline-yes">18x</span>
745
+ <span class="cline-any cline-yes">18x</span>
746
+ <span class="cline-any cline-yes">30x</span>
606
747
  <span class="cline-any cline-yes">17x</span>
607
- <span class="cline-any cline-yes">6x</span>
608
- <span class="cline-any cline-yes">6x</span>
609
748
  <span class="cline-any cline-yes">17x</span>
610
- <span class="cline-any cline-yes">12x</span>
611
- <span class="cline-any cline-yes">12x</span>
612
- <span class="cline-any cline-yes">12x</span>
613
- <span class="cline-any cline-yes">12x</span>
614
- <span class="cline-any cline-yes">12x</span>
615
- <span class="cline-any cline-yes">21x</span>
616
749
  <span class="cline-any cline-yes">2x</span>
617
750
  <span class="cline-any cline-yes">2x</span>
751
+ <span class="cline-any cline-yes">17x</span>
752
+ <span class="cline-any cline-yes">17x</span>
753
+ <span class="cline-any cline-yes">17x</span>
754
+ <span class="cline-any cline-yes">17x</span>
755
+ <span class="cline-any cline-yes">17x</span>
756
+ <span class="cline-any cline-yes">17x</span>
757
+ <span class="cline-any cline-yes">17x</span>
758
+ <span class="cline-any cline-yes">3x</span>
759
+ <span class="cline-any cline-yes">3x</span>
760
+ <span class="cline-any cline-yes">17x</span>
761
+ <span class="cline-any cline-yes">15x</span>
762
+ <span class="cline-any cline-yes">15x</span>
763
+ <span class="cline-any cline-yes">1x</span>
764
+ <span class="cline-any cline-yes">1x</span>
765
+ <span class="cline-any cline-yes">1x</span>
766
+ <span class="cline-any cline-yes">1x</span>
767
+ <span class="cline-any cline-yes">1x</span>
768
+ <span class="cline-any cline-yes">1x</span>
769
+ <span class="cline-any cline-yes">1x</span>
618
770
  <span class="cline-any cline-yes">12x</span>
771
+ <span class="cline-any cline-yes">2x</span>
772
+ <span class="cline-any cline-yes">2x</span>
619
773
  <span class="cline-any cline-yes">12x</span>
774
+ <span class="cline-any cline-yes">10x</span>
775
+ <span class="cline-any cline-yes">10x</span>
620
776
  <span class="cline-any cline-yes">12x</span>
621
- <span class="cline-any cline-yes">12x</span>
622
- <span class="cline-any cline-yes">12x</span>
623
- <span class="cline-any cline-yes">12x</span>
624
- <span class="cline-any cline-yes">21x</span>
625
- <span class="cline-any cline-yes">21x</span>
626
777
  <span class="cline-any cline-yes">1x</span>
627
778
  <span class="cline-any cline-yes">1x</span>
628
779
  <span class="cline-any cline-yes">1x</span>
629
780
  <span class="cline-any cline-yes">1x</span>
630
781
  <span class="cline-any cline-yes">1x</span>
631
782
  <span class="cline-any cline-yes">1x</span>
632
- <span class="cline-any cline-yes">8x</span>
633
- <span class="cline-any cline-yes">8x</span>
783
+ <span class="cline-any cline-yes">14x</span>
784
+ <span class="cline-any cline-yes">14x</span>
785
+ <span class="cline-any cline-yes">1x</span>
634
786
  <span class="cline-any cline-yes">1x</span>
635
787
  <span class="cline-any cline-yes">1x</span>
636
788
  <span class="cline-any cline-yes">1x</span>
637
789
  <span class="cline-any cline-yes">1x</span>
638
790
  <span class="cline-any cline-yes">1x</span>
791
+ <span class="cline-any cline-yes">9x</span>
792
+ <span class="cline-any cline-yes">9x</span>
793
+ <span class="cline-any cline-yes">1x</span>
639
794
  <span class="cline-any cline-yes">1x</span>
640
795
  <span class="cline-any cline-yes">7x</span>
641
796
  <span class="cline-any cline-yes">7x</span>
@@ -643,15 +798,11 @@
643
798
  <span class="cline-any cline-yes">1x</span>
644
799
  <span class="cline-any cline-yes">6x</span>
645
800
  <span class="cline-any cline-yes">6x</span>
646
- <span class="cline-any cline-yes">1x</span>
647
- <span class="cline-any cline-yes">1x</span>
648
- <span class="cline-any cline-yes">5x</span>
649
- <span class="cline-any cline-yes">5x</span>
801
+ <span class="cline-any cline-yes">6x</span>
802
+ <span class="cline-any cline-yes">6x</span>
803
+ <span class="cline-any cline-yes">7x</span>
650
804
  <span class="cline-any cline-yes">5x</span>
651
805
  <span class="cline-any cline-yes">5x</span>
652
- <span class="cline-any cline-yes">6x</span>
653
- <span class="cline-any cline-yes">4x</span>
654
- <span class="cline-any cline-yes">4x</span>
655
806
  <span class="cline-any cline-yes">1x</span>
656
807
  <span class="cline-any cline-yes">1x</span>
657
808
  <span class="cline-any cline-yes">1x</span>
@@ -664,15 +815,15 @@
664
815
  <span class="cline-any cline-yes">1x</span>
665
816
  <span class="cline-any cline-yes">1x</span>
666
817
  <span class="cline-any cline-yes">1x</span>
667
- <span class="cline-any cline-yes">24x</span>
668
- <span class="cline-any cline-yes">24x</span>
818
+ <span class="cline-any cline-yes">33x</span>
819
+ <span class="cline-any cline-yes">33x</span>
669
820
  <span class="cline-any cline-yes">1x</span>
670
821
  <span class="cline-any cline-yes">1x</span>
671
- <span class="cline-any cline-yes">23x</span>
672
- <span class="cline-any cline-yes">23x</span>
673
- <span class="cline-any cline-yes">24x</span>
674
- <span class="cline-any cline-yes">20x</span>
675
- <span class="cline-any cline-yes">20x</span>
822
+ <span class="cline-any cline-yes">32x</span>
823
+ <span class="cline-any cline-yes">32x</span>
824
+ <span class="cline-any cline-yes">33x</span>
825
+ <span class="cline-any cline-yes">29x</span>
826
+ <span class="cline-any cline-yes">29x</span>
676
827
  <span class="cline-any cline-yes">3x</span>
677
828
  <span class="cline-any cline-yes">3x</span>
678
829
  <span class="cline-any cline-yes">3x</span>
@@ -685,10 +836,10 @@
685
836
  <span class="cline-any cline-yes">1x</span>
686
837
  <span class="cline-any cline-yes">1x</span>
687
838
  <span class="cline-any cline-yes">1x</span>
688
- <span class="cline-any cline-yes">27x</span>
689
- <span class="cline-any cline-yes">27x</span>
690
- <span class="cline-any cline-yes">25x</span>
691
- <span class="cline-any cline-yes">25x</span>
839
+ <span class="cline-any cline-yes">36x</span>
840
+ <span class="cline-any cline-yes">36x</span>
841
+ <span class="cline-any cline-yes">34x</span>
842
+ <span class="cline-any cline-yes">34x</span>
692
843
  <span class="cline-any cline-yes">2x</span>
693
844
  <span class="cline-any cline-yes">2x</span>
694
845
  <span class="cline-any cline-yes">1x</span>
@@ -699,131 +850,174 @@
699
850
  <span class="cline-any cline-yes">1x</span>
700
851
  <span class="cline-any cline-yes">1x</span>
701
852
  <span class="cline-any cline-yes">1x</span>
702
- <span class="cline-any cline-yes">32x</span>
703
- <span class="cline-any cline-yes">32x</span>
704
- <span class="cline-any cline-yes">32x</span>
705
- <span class="cline-any cline-yes">32x</span>
853
+ <span class="cline-any cline-yes">61x</span>
854
+ <span class="cline-any cline-yes">61x</span>
855
+ <span class="cline-any cline-yes">61x</span>
856
+ <span class="cline-any cline-yes">61x</span>
857
+ <span class="cline-any cline-yes">1x</span>
858
+ <span class="cline-any cline-yes">1x</span>
859
+ <span class="cline-any cline-yes">61x</span>
860
+ <span class="cline-any cline-yes">61x</span>
861
+ <span class="cline-any cline-yes">61x</span>
862
+ <span class="cline-any cline-yes">61x</span>
863
+ <span class="cline-any cline-yes">61x</span>
864
+ <span class="cline-any cline-yes">8x</span>
865
+ <span class="cline-any cline-yes">8x</span>
866
+ <span class="cline-any cline-yes">8x</span>
867
+ <span class="cline-any cline-yes">53x</span>
868
+ <span class="cline-any cline-yes">61x</span>
869
+ <span class="cline-any cline-yes">19x</span>
870
+ <span class="cline-any cline-yes">19x</span>
871
+ <span class="cline-any cline-yes">19x</span>
872
+ <span class="cline-any cline-yes">19x</span>
873
+ <span class="cline-any cline-yes">19x</span>
874
+ <span class="cline-any cline-yes">19x</span>
875
+ <span class="cline-any cline-yes">34x</span>
876
+ <span class="cline-any cline-yes">34x</span>
877
+ <span class="cline-any cline-yes">61x</span>
878
+ <span class="cline-any cline-yes">1x</span>
879
+ <span class="cline-any cline-yes">1x</span>
880
+ <span class="cline-any cline-yes">33x</span>
881
+ <span class="cline-any cline-yes">33x</span>
706
882
  <span class="cline-any cline-yes">1x</span>
707
883
  <span class="cline-any cline-yes">1x</span>
708
- <span class="cline-any cline-yes">32x</span>
709
- <span class="cline-any cline-yes">32x</span>
710
- <span class="cline-any cline-yes">32x</span>
711
- <span class="cline-any cline-yes">32x</span>
712
- <span class="cline-any cline-yes">32x</span>
713
- <span class="cline-any cline-yes">4x</span>
714
- <span class="cline-any cline-yes">4x</span>
715
- <span class="cline-any cline-yes">4x</span>
716
- <span class="cline-any cline-yes">28x</span>
717
- <span class="cline-any cline-yes">32x</span>
718
- <span class="cline-any cline-yes">4x</span>
719
- <span class="cline-any cline-yes">4x</span>
720
- <span class="cline-any cline-yes">4x</span>
721
- <span class="cline-any cline-yes">24x</span>
722
- <span class="cline-any cline-yes">24x</span>
723
- <span class="cline-any cline-yes">32x</span>
724
884
  <span class="cline-any cline-yes">1x</span>
725
885
  <span class="cline-any cline-yes">1x</span>
726
- <span class="cline-any cline-yes">23x</span>
727
- <span class="cline-any cline-yes">23x</span>
728
886
  <span class="cline-any cline-yes">1x</span>
729
887
  <span class="cline-any cline-yes">1x</span>
888
+ <span class="cline-any cline-yes">47x</span>
889
+ <span class="cline-any cline-yes">47x</span>
890
+ <span class="cline-any cline-yes">61x</span>
891
+ <span class="cline-any cline-yes">61x</span>
892
+ <span class="cline-any cline-yes">39x</span>
893
+ <span class="cline-any cline-yes">39x</span>
894
+ <span class="cline-any cline-yes">22x</span>
895
+ <span class="cline-any cline-yes">22x</span>
896
+ <span class="cline-any cline-yes">22x</span>
897
+ <span class="cline-any cline-yes">22x</span>
898
+ <span class="cline-any cline-yes">22x</span>
899
+ <span class="cline-any cline-yes">61x</span>
900
+ <span class="cline-any cline-yes">61x</span>
901
+ <span class="cline-any cline-yes">61x</span>
902
+ <span class="cline-any cline-yes">61x</span>
903
+ <span class="cline-any cline-yes">61x</span>
904
+ <span class="cline-any cline-yes">61x</span>
905
+ <span class="cline-any cline-yes">61x</span>
906
+ <span class="cline-any cline-yes">8x</span>
907
+ <span class="cline-any cline-yes">8x</span>
908
+ <span class="cline-any cline-yes">14x</span>
909
+ <span class="cline-any cline-yes">14x</span>
910
+ <span class="cline-any cline-yes">14x</span>
911
+ <span class="cline-any cline-yes">14x</span>
912
+ <span class="cline-any cline-yes">61x</span>
913
+ <span class="cline-any cline-yes">61x</span>
914
+ <span class="cline-any cline-yes">61x</span>
915
+ <span class="cline-any cline-yes">61x</span>
916
+ <span class="cline-any cline-yes">14x</span>
917
+ <span class="cline-any cline-yes">1x</span>
918
+ <span class="cline-any cline-yes">1x</span>
919
+ <span class="cline-any cline-yes">14x</span>
920
+ <span class="cline-any cline-yes">1x</span>
730
921
  <span class="cline-any cline-yes">1x</span>
731
922
  <span class="cline-any cline-yes">1x</span>
732
923
  <span class="cline-any cline-yes">1x</span>
733
924
  <span class="cline-any cline-yes">1x</span>
734
925
  <span class="cline-any cline-yes">1x</span>
735
926
  <span class="cline-any cline-yes">1x</span>
736
- <span class="cline-any cline-yes">56x</span>
737
- <span class="cline-any cline-yes">56x</span>
738
- <span class="cline-any cline-yes">56x</span>
739
- <span class="cline-any cline-yes">56x</span>
740
- <span class="cline-any cline-yes">56x</span>
741
- <span class="cline-any cline-yes">56x</span>
742
- <span class="cline-any cline-yes">56x</span>
743
- <span class="cline-any cline-yes">56x</span>
744
- <span class="cline-any cline-yes">56x</span>
745
- <span class="cline-any cline-yes">56x</span>
746
- <span class="cline-any cline-yes">56x</span>
747
- <span class="cline-any cline-yes">56x</span>
927
+ <span class="cline-any cline-yes">1x</span>
928
+ <span class="cline-any cline-yes">65x</span>
929
+ <span class="cline-any cline-yes">65x</span>
930
+ <span class="cline-any cline-yes">65x</span>
931
+ <span class="cline-any cline-yes">65x</span>
932
+ <span class="cline-any cline-yes">65x</span>
933
+ <span class="cline-any cline-yes">65x</span>
934
+ <span class="cline-any cline-yes">65x</span>
935
+ <span class="cline-any cline-yes">65x</span>
936
+ <span class="cline-any cline-yes">65x</span>
937
+ <span class="cline-any cline-yes">65x</span>
938
+ <span class="cline-any cline-yes">65x</span>
939
+ <span class="cline-any cline-yes">65x</span>
748
940
  <span class="cline-any cline-yes">7x</span>
749
941
  <span class="cline-any cline-yes">7x</span>
750
- <span class="cline-any cline-yes">49x</span>
751
- <span class="cline-any cline-yes">49x</span>
752
- <span class="cline-any cline-yes">49x</span>
753
- <span class="cline-any cline-yes">55x</span>
754
- <span class="cline-any cline-yes">43x</span>
942
+ <span class="cline-any cline-yes">58x</span>
943
+ <span class="cline-any cline-yes">58x</span>
944
+ <span class="cline-any cline-yes">58x</span>
945
+ <span class="cline-any cline-yes">64x</span>
946
+ <span class="cline-any cline-yes">52x</span>
755
947
  <span class="cline-any cline-yes">2x</span>
756
948
  <span class="cline-any cline-yes">2x</span>
757
949
  <span class="cline-any cline-yes">1x</span>
758
950
  <span class="cline-any cline-yes">1x</span>
759
951
  <span class="cline-any cline-yes">1x</span>
760
- <span class="cline-any cline-yes">43x</span>
761
- <span class="cline-any cline-yes">41x</span>
762
- <span class="cline-any cline-yes">41x</span>
763
- <span class="cline-any cline-yes">41x</span>
764
- <span class="cline-any cline-yes">41x</span>
765
- <span class="cline-any cline-yes">41x</span>
952
+ <span class="cline-any cline-yes">52x</span>
953
+ <span class="cline-any cline-yes">50x</span>
954
+ <span class="cline-any cline-yes">50x</span>
955
+ <span class="cline-any cline-yes">50x</span>
956
+ <span class="cline-any cline-yes">50x</span>
957
+ <span class="cline-any cline-yes">50x</span>
766
958
  <span class="cline-any cline-yes">3x</span>
767
959
  <span class="cline-any cline-yes">3x</span>
768
- <span class="cline-any cline-yes">38x</span>
769
- <span class="cline-any cline-yes">41x</span>
770
- <span class="cline-any cline-yes">41x</span>
771
- <span class="cline-any cline-yes">41x</span>
772
- <span class="cline-any cline-yes">41x</span>
773
- <span class="cline-any cline-yes">41x</span>
774
- <span class="cline-any cline-yes">41x</span>
775
- <span class="cline-any cline-yes">41x</span>
776
- <span class="cline-any cline-yes">43x</span>
777
- <span class="cline-any cline-yes">45x</span>
778
- <span class="cline-any cline-yes">45x</span>
779
- <span class="cline-any cline-yes">45x</span>
780
- <span class="cline-any cline-yes">1x</span>
781
- <span class="cline-any cline-yes">1x</span>
782
- <span class="cline-any cline-yes">1x</span>
960
+ <span class="cline-any cline-yes">47x</span>
961
+ <span class="cline-any cline-yes">50x</span>
962
+ <span class="cline-any cline-yes">50x</span>
963
+ <span class="cline-any cline-yes">50x</span>
964
+ <span class="cline-any cline-yes">50x</span>
965
+ <span class="cline-any cline-yes">50x</span>
966
+ <span class="cline-any cline-yes">50x</span>
967
+ <span class="cline-any cline-yes">50x</span>
968
+ <span class="cline-any cline-yes">52x</span>
969
+ <span class="cline-any cline-yes">54x</span>
970
+ <span class="cline-any cline-yes">54x</span>
971
+ <span class="cline-any cline-yes">54x</span>
783
972
  <span class="cline-any cline-yes">1x</span>
784
973
  <span class="cline-any cline-yes">1x</span>
785
974
  <span class="cline-any cline-yes">1x</span>
786
975
  <span class="cline-any cline-yes">1x</span>
787
976
  <span class="cline-any cline-yes">1x</span>
788
977
  <span class="cline-any cline-yes">1x</span>
789
- <span class="cline-any cline-yes">97x</span>
790
- <span class="cline-any cline-yes">97x</span>
791
- <span class="cline-any cline-yes">97x</span>
792
- <span class="cline-any cline-yes">97x</span>
793
- <span class="cline-any cline-yes">97x</span>
794
- <span class="cline-any cline-yes">97x</span>
795
- <span class="cline-any cline-yes">194x</span>
796
- <span class="cline-any cline-yes">102x</span>
797
- <span class="cline-any cline-yes">102x</span>
798
- <span class="cline-any cline-yes">194x</span>
799
- <span class="cline-any cline-yes">97x</span>
800
- <span class="cline-any cline-yes">97x</span>
801
978
  <span class="cline-any cline-yes">1x</span>
802
979
  <span class="cline-any cline-yes">1x</span>
803
980
  <span class="cline-any cline-yes">1x</span>
981
+ <span class="cline-any cline-yes">115x</span>
982
+ <span class="cline-any cline-yes">115x</span>
983
+ <span class="cline-any cline-yes">115x</span>
984
+ <span class="cline-any cline-yes">115x</span>
985
+ <span class="cline-any cline-yes">115x</span>
986
+ <span class="cline-any cline-yes">115x</span>
987
+ <span class="cline-any cline-yes">230x</span>
988
+ <span class="cline-any cline-yes">120x</span>
989
+ <span class="cline-any cline-yes">120x</span>
990
+ <span class="cline-any cline-yes">230x</span>
991
+ <span class="cline-any cline-yes">115x</span>
992
+ <span class="cline-any cline-yes">115x</span>
804
993
  <span class="cline-any cline-yes">1x</span>
805
- <span class="cline-any cline-yes">97x</span>
806
- <span class="cline-any cline-yes">97x</span>
807
- <span class="cline-any cline-yes">97x</span>
808
- <span class="cline-any cline-yes">97x</span>
809
- <span class="cline-any cline-yes">97x</span>
810
- <span class="cline-any cline-yes">97x</span>
994
+ <span class="cline-any cline-yes">115x</span>
995
+ <span class="cline-any cline-yes">115x</span>
996
+ <span class="cline-any cline-yes">115x</span>
997
+ <span class="cline-any cline-yes">115x</span>
998
+ <span class="cline-any cline-yes">115x</span>
999
+ <span class="cline-any cline-yes">115x</span>
1000
+ <span class="cline-any cline-yes">115x</span>
1001
+ <span class="cline-any cline-yes">115x</span>
811
1002
  <span class="cline-any cline-yes">3x</span>
812
1003
  <span class="cline-any cline-yes">3x</span>
813
1004
  <span class="cline-any cline-yes">3x</span>
814
- <span class="cline-any cline-yes">94x</span>
815
- <span class="cline-any cline-yes">97x</span>
1005
+ <span class="cline-any cline-yes">112x</span>
1006
+ <span class="cline-any cline-yes">115x</span>
1007
+ <span class="cline-any cline-yes">5x</span>
1008
+ <span class="cline-any cline-yes">5x</span>
816
1009
  <span class="cline-any cline-yes">5x</span>
817
1010
  <span class="cline-any cline-yes">5x</span>
818
1011
  <span class="cline-any cline-yes">5x</span>
819
- <span class="cline-any cline-yes">89x</span>
820
- <span class="cline-any cline-yes">89x</span>
821
- <span class="cline-any cline-yes">97x</span>
1012
+ <span class="cline-any cline-yes">5x</span>
1013
+ <span class="cline-any cline-yes">107x</span>
1014
+ <span class="cline-any cline-yes">107x</span>
1015
+ <span class="cline-any cline-yes">115x</span>
822
1016
  <span class="cline-any cline-yes">2x</span>
823
1017
  <span class="cline-any cline-yes">2x</span>
824
- <span class="cline-any cline-yes">87x</span>
825
- <span class="cline-any cline-yes">87x</span>
826
- <span class="cline-any cline-yes">87x</span>
1018
+ <span class="cline-any cline-yes">105x</span>
1019
+ <span class="cline-any cline-yes">105x</span>
1020
+ <span class="cline-any cline-yes">105x</span>
827
1021
  <span class="cline-any cline-yes">1x</span>
828
1022
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/*
829
1023
  * Copyright (c) 2026 Erik Fortune
@@ -905,6 +1099,9 @@ export class HttpTreeAccessors&lt;TCT extends string = string&gt;
905
1099
  private readonly _autoSync: boolean;
906
1100
  private readonly _userId: string | undefined;
907
1101
  private readonly _logger: Logging.LogReporter&lt;unknown&gt;;
1102
+ &nbsp;
1103
+ /** Guards against concurrent syncToDisk calls (thundering herd from autoSync). */
1104
+ private _syncPromise: Promise&lt;Result&lt;void&gt;&gt; | undefined;
908
1105
  &nbsp;
909
1106
  private constructor(files: FileTree.IInMemoryFile&lt;TCT&gt;[], params: IHttpTreeParams&lt;TCT&gt;) {
910
1107
  super(files, params);
@@ -944,65 +1141,116 @@ export class HttpTreeAccessors&lt;TCT extends string = string&gt;
944
1141
  &nbsp;
945
1142
  /**
946
1143
  * Synchronizes all dirty files to the HTTP backend.
1144
+ *
1145
+ * Uses a concurrency guard: if a sync is already in progress, callers
1146
+ * await the existing operation rather than starting a parallel one.
1147
+ * This prevents the thundering herd that occurs when autoSync fires
1148
+ * for every file written during a bulk operation (e.g. restore).
1149
+ *
947
1150
  * @returns A promise that resolves to a result indicating success or failure.
948
1151
  */
949
1152
  public async syncToDisk(): Promise&lt;Result&lt;void&gt;&gt; {
950
- if (this._dirtyFiles.size === 0 &amp;&amp; this._pendingDeletions.size === 0) {
951
- return succeed(undefined);
1153
+ if (this._syncPromise) {
1154
+ // Wait for the in-flight sync — it drains the queue in a loop,
1155
+ // so any items added before it finishes will be included.
1156
+ return this._syncPromise;
952
1157
  }
953
1158
  &nbsp;
954
- for (const path of this._pendingDeletions) {
955
- const query = new URLSearchParams();
956
- query.set('path', path);
957
- if (this._namespace) {
958
- query.set('namespace', this._namespace);
959
- }
1159
+ this._syncPromise = this._doSync().finally(() =&gt; {
1160
+ this._syncPromise = undefined;
1161
+ });
1162
+ return this._syncPromise;
1163
+ }
960
1164
  &nbsp;
961
- const deleteResult = await this._request&lt;{ deleted: boolean }&gt;(`/file?${query.toString()}`, {
962
- method: 'DELETE'
963
- });
964
- if (deleteResult.isFailure()) {
965
- return fail(`delete ${path}: ${deleteResult.message}`);
1165
+ private async _doSync(): Promise&lt;Result&lt;void&gt;&gt; {
1166
+ // Drain loop: keep processing as long as new items arrive.
1167
+ // This is critical for bulk operations (e.g. reset) where many
1168
+ // deleteFile/saveFileContents calls happen synchronously — only
1169
+ // the first may be in the set when we snapshot, but the rest
1170
+ // arrive during the async gaps and must be picked up before
1171
+ // we return.
1172
+ let didWork = false;
1173
+ while (this._dirtyFiles.size &gt; 0 || this._pendingDeletions.size &gt; 0) {
1174
+ didWork = true;
1175
+ // Snapshot and clear so that changes arriving during the async
1176
+ // requests land in the live sets for the next iteration.
1177
+ const deletions = new Set(this._pendingDeletions);
1178
+ const dirty = new Set(this._dirtyFiles);
1179
+ this._pendingDeletions.clear();
1180
+ this._dirtyFiles.clear();
1181
+ &nbsp;
1182
+ for (const path of deletions) {
1183
+ const query = new URLSearchParams();
1184
+ query.set('path', path);
1185
+ if (this._namespace) {
1186
+ query.set('namespace', this._namespace);
1187
+ }
1188
+ &nbsp;
1189
+ const deleteResult = await this._requestWithRetry&lt;{ deleted: boolean }&gt;(`/file?${query.toString()}`, {
1190
+ method: 'DELETE'
1191
+ });
1192
+ if (deleteResult.isFailure()) {
1193
+ this._restoreUnsynced(deletions, dirty);
1194
+ return fail(`delete ${path}: ${deleteResult.message}`);
1195
+ }
966
1196
  }
967
- }
968
1197
  &nbsp;
969
- for (const path of this._dirtyFiles) {
970
- const contentsResult = this.getFileContents(path);
971
- if (contentsResult.isFailure()) {
972
- return fail(`${path}: ${contentsResult.message}`);
1198
+ for (const path of dirty) {
1199
+ const contentsResult = this.getFileContents(path);
1200
+ if (contentsResult.isFailure()) {
1201
+ this._restoreUnsynced(deletions, dirty);
1202
+ return fail(`${path}: ${contentsResult.message}`);
1203
+ }
1204
+ &nbsp;
1205
+ const body: Record&lt;string, unknown&gt; = {
1206
+ path,
1207
+ contents: contentsResult.value
1208
+ };
1209
+ if (this._namespace) {
1210
+ body.namespace = this._namespace;
1211
+ }
1212
+ &nbsp;
1213
+ const saveResult = await this._requestWithRetry&lt;IHttpStorageFileResponse&gt;('/file', {
1214
+ method: 'PUT',
1215
+ body: JSON.stringify(body)
1216
+ });
1217
+ if (saveResult.isFailure()) {
1218
+ this._restoreUnsynced(deletions, dirty);
1219
+ return fail(`sync ${path}: ${saveResult.message}`);
1220
+ }
973
1221
  }
1222
+ }
974
1223
  &nbsp;
975
- const body: Record&lt;string, unknown&gt; = {
976
- path,
977
- contents: contentsResult.value
978
- };
1224
+ if (didWork) {
1225
+ const syncBody: Record&lt;string, unknown&gt; = {};
979
1226
  if (this._namespace) {
980
- body.namespace = this._namespace;
1227
+ syncBody.namespace = this._namespace;
981
1228
  }
982
1229
  &nbsp;
983
- const saveResult = await this._request&lt;IHttpStorageFileResponse&gt;('/file', {
984
- method: 'PUT',
985
- body: JSON.stringify(body)
1230
+ const syncResult = await this._requestWithRetry&lt;IHttpStorageSyncResponse&gt;('/sync', {
1231
+ method: 'POST',
1232
+ body: JSON.stringify(syncBody)
986
1233
  });
987
- if (saveResult.isFailure()) {
988
- return fail(`sync ${path}: ${saveResult.message}`);
1234
+ &nbsp;
1235
+ if (syncResult.isFailure()) {
1236
+ return fail(syncResult.message);
989
1237
  }
990
1238
  }
1239
+ return succeed(undefined);
1240
+ }
991
1241
  &nbsp;
992
- this._pendingDeletions.clear();
993
- this._dirtyFiles.clear();
994
- &nbsp;
995
- const syncBody: Record&lt;string, unknown&gt; = {};
996
- if (this._namespace) {
997
- syncBody.namespace = this._namespace;
1242
+ /**
1243
+ * Restores snapshotted items back into the live dirty sets so they
1244
+ * are retried on the next sync attempt. Items that were added to
1245
+ * the live sets while the sync was in flight are preserved.
1246
+ */
1247
+ private _restoreUnsynced(deletions: Set&lt;string&gt;, dirty: Set&lt;string&gt;): void {
1248
+ for (const path of deletions) {
1249
+ this._pendingDeletions.add(path);
1250
+ }
1251
+ for (const path of dirty) {
1252
+ this._dirtyFiles.add(path);
998
1253
  }
999
- &nbsp;
1000
- const syncResult = await this._request&lt;IHttpStorageSyncResponse&gt;('/sync', {
1001
- method: 'POST',
1002
- body: JSON.stringify(syncBody)
1003
- });
1004
- &nbsp;
1005
- return syncResult.isFailure() ? fail(syncResult.message) : succeed(undefined);
1006
1254
  }
1007
1255
  &nbsp;
1008
1256
  /**
@@ -1096,7 +1344,10 @@ export class HttpTreeAccessors&lt;TCT extends string = string&gt;
1096
1344
  }
1097
1345
  &nbsp;
1098
1346
  if (!response.ok) {
1099
- const message = await response.text().catch(() =&gt; `HTTP ${response.status}`);
1347
+ const body = await response.text().catch(() =&gt; '');
1348
+ const message = body
1349
+ ? `HTTP ${response.status}: ${body}`
1350
+ : `HTTP ${response.status} ${response.statusText}`;
1100
1351
  return fail(message);
1101
1352
  }
1102
1353
  &nbsp;
@@ -1106,6 +1357,44 @@ export class HttpTreeAccessors&lt;TCT extends string = string&gt;
1106
1357
  }
1107
1358
  return succeed(json as T);
1108
1359
  }
1360
+ &nbsp;
1361
+ /**
1362
+ * Wraps `_request` with retry logic for transient failures
1363
+ * (network errors, 503 service unavailable, etc.).
1364
+ */
1365
+ private async _requestWithRetry&lt;T&gt;(resourcePath: string, init?: RequestInit): Promise&lt;Result&lt;T&gt;&gt; {
1366
+ const maxAttempts = 3;
1367
+ for (let attempt = 1; attempt &lt;= maxAttempts; attempt++) {
1368
+ const result = await this._request&lt;T&gt;(resourcePath, init);
1369
+ if (result.isSuccess() || attempt === maxAttempts) {
1370
+ return result;
1371
+ }
1372
+ // Retry on transient-looking errors
1373
+ const msg = result.message;
1374
+ const lowerMsg = msg.toLowerCase();
1375
+ const isTransient =
1376
+ msg.includes('503') ||
1377
+ msg.includes('502') ||
1378
+ msg.includes('429') ||
1379
+ lowerMsg.includes('disconnect') ||
1380
+ lowerMsg.includes('econnreset') ||
1381
+ lowerMsg.includes('failed to fetch') ||
1382
+ lowerMsg.includes('network');
1383
+ if (!isTransient) {
1384
+ return result;
1385
+ }
1386
+ // Exponential backoff: 500ms, 1000ms
1387
+ const delayMs = 500 * Math.pow(2, attempt - 1);
1388
+ this._logger.detail(
1389
+ `Retrying ${
1390
+ init<span class="branch-0 cbranch-no" title="branch not covered" >?.m</span>ethod<span class="branch-0 cbranch-no" title="branch not covered" > ?? 'GET'</span>
1391
+ } ${resourcePath} after ${delayMs}ms (attempt ${attempt}/${maxAttempts})`
1392
+ );
1393
+ await new Promise((resolve) =&gt; setTimeout(resolve, delayMs));
1394
+ }
1395
+ /* c8 ignore next 1 - defensive coding: loop always returns */
1396
+ return fail('retry loop exited unexpectedly');
1397
+ }
1109
1398
  &nbsp;
1110
1399
  /**
1111
1400
  * Loads files from the HTTP backend for the specified directory path.
@@ -1179,8 +1468,7 @@ export class HttpTreeAccessors&lt;TCT extends string = string&gt;
1179
1468
  }
1180
1469
  &nbsp;
1181
1470
  const fetchImpl = normalizeFetch(params.fetchImpl);
1182
- /* c8 ignore next 3 - userId header in static _requestWithParams; covered by userId tests via fromHttp */
1183
- const userIdHeaders: RequestInit | undefined = params.userId
1471
+ const userIdHeaders: RequestInit | undefined = /* c8 ignore next */ params.userId
1184
1472
  ? { headers: { 'X-User-Id': params.userId } }
1185
1473
  : undefined;
1186
1474
  const response = await fetchImpl(
@@ -1194,7 +1482,10 @@ export class HttpTreeAccessors&lt;TCT extends string = string&gt;
1194
1482
  }
1195
1483
  &nbsp;
1196
1484
  if (!response.ok) {
1197
- const message = await response.text().catch(() =&gt; `HTTP ${response.status}`);
1485
+ const body = await response.text().catch(() =&gt; '');
1486
+ const message = body
1487
+ ? `HTTP ${response.status}: ${body}`
1488
+ : `HTTP ${response.status} ${response.statusText}`;
1198
1489
  return fail(message);
1199
1490
  }
1200
1491
  &nbsp;
@@ -1213,7 +1504,7 @@ export class HttpTreeAccessors&lt;TCT extends string = string&gt;
1213
1504
  <div class='footer quiet pad2 space-top1 center small'>
1214
1505
  Code coverage generated by
1215
1506
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1216
- at 2026-03-24T10:54:34.273Z
1507
+ at 2026-04-07T20:05:02.689Z
1217
1508
  </div>
1218
1509
  <script src="../prettify.js"></script>
1219
1510
  <script>