@backblaze-labs/b2-sdk 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (701) hide show
  1. package/CHANGELOG.md +110 -5
  2. package/README.md +144 -33
  3. package/dist/_virtual/_b2-sdk-version-json.cjs +4 -0
  4. package/dist/_virtual/_b2-sdk-version-json.js +4 -0
  5. package/dist/auth/account-info.d.cts +32 -0
  6. package/dist/auth/account-info.d.cts.map +1 -1
  7. package/dist/auth/account-info.d.ts +32 -0
  8. package/dist/auth/account-info.d.ts.map +1 -1
  9. package/dist/auth/file.cjs +408 -207
  10. package/dist/auth/file.cjs.map +1 -1
  11. package/dist/auth/file.d.cts +77 -3
  12. package/dist/auth/file.d.cts.map +1 -1
  13. package/dist/auth/file.d.ts +77 -3
  14. package/dist/auth/file.d.ts.map +1 -1
  15. package/dist/auth/file.js +407 -207
  16. package/dist/auth/file.js.map +1 -1
  17. package/dist/auth/in-memory.cjs +212 -183
  18. package/dist/auth/in-memory.cjs.map +1 -1
  19. package/dist/auth/in-memory.d.cts +8 -0
  20. package/dist/auth/in-memory.d.cts.map +1 -1
  21. package/dist/auth/in-memory.d.ts +8 -0
  22. package/dist/auth/in-memory.d.ts.map +1 -1
  23. package/dist/auth/in-memory.js +211 -182
  24. package/dist/auth/in-memory.js.map +1 -1
  25. package/dist/auth/index.cjs +7 -9
  26. package/dist/auth/index.d.cts +3 -2
  27. package/dist/auth/index.d.cts.map +1 -1
  28. package/dist/auth/index.d.ts +3 -2
  29. package/dist/auth/index.d.ts.map +1 -1
  30. package/dist/auth/index.js +2 -8
  31. package/dist/auth/realms.cjs +80 -7
  32. package/dist/auth/realms.cjs.map +1 -1
  33. package/dist/auth/realms.d.cts +27 -4
  34. package/dist/auth/realms.d.cts.map +1 -1
  35. package/dist/auth/realms.d.ts +27 -4
  36. package/dist/auth/realms.d.ts.map +1 -1
  37. package/dist/auth/realms.js +80 -9
  38. package/dist/auth/realms.js.map +1 -1
  39. package/dist/auth/upload-url-pool.cjs +55 -51
  40. package/dist/auth/upload-url-pool.cjs.map +1 -1
  41. package/dist/auth/upload-url-pool.js +55 -51
  42. package/dist/auth/upload-url-pool.js.map +1 -1
  43. package/dist/bucket.cjs +785 -787
  44. package/dist/bucket.cjs.map +1 -1
  45. package/dist/bucket.d.cts +35 -47
  46. package/dist/bucket.d.cts.map +1 -1
  47. package/dist/bucket.d.ts +35 -47
  48. package/dist/bucket.d.ts.map +1 -1
  49. package/dist/bucket.js +780 -782
  50. package/dist/bucket.js.map +1 -1
  51. package/dist/client.cjs +246 -228
  52. package/dist/client.cjs.map +1 -1
  53. package/dist/client.d.cts +25 -17
  54. package/dist/client.d.cts.map +1 -1
  55. package/dist/client.d.ts +25 -17
  56. package/dist/client.d.ts.map +1 -1
  57. package/dist/client.js +243 -225
  58. package/dist/client.js.map +1 -1
  59. package/dist/copy/large.cjs +114 -71
  60. package/dist/copy/large.cjs.map +1 -1
  61. package/dist/copy/large.d.cts +6 -0
  62. package/dist/copy/large.d.cts.map +1 -1
  63. package/dist/copy/large.d.ts +6 -0
  64. package/dist/copy/large.d.ts.map +1 -1
  65. package/dist/copy/large.js +112 -69
  66. package/dist/copy/large.js.map +1 -1
  67. package/dist/download/checksum.cjs +89 -0
  68. package/dist/download/checksum.cjs.map +1 -0
  69. package/dist/download/checksum.d.cts +40 -0
  70. package/dist/download/checksum.d.cts.map +1 -0
  71. package/dist/download/checksum.d.ts +40 -0
  72. package/dist/download/checksum.d.ts.map +1 -0
  73. package/dist/download/checksum.js +87 -0
  74. package/dist/download/checksum.js.map +1 -0
  75. package/dist/download/parallel.cjs +214 -118
  76. package/dist/download/parallel.cjs.map +1 -1
  77. package/dist/download/parallel.d.cts +5 -1
  78. package/dist/download/parallel.d.cts.map +1 -1
  79. package/dist/download/parallel.d.ts +5 -1
  80. package/dist/download/parallel.d.ts.map +1 -1
  81. package/dist/download/parallel.js +212 -116
  82. package/dist/download/parallel.js.map +1 -1
  83. package/dist/download/single.cjs +188 -97
  84. package/dist/download/single.cjs.map +1 -1
  85. package/dist/download/single.d.cts +6 -1
  86. package/dist/download/single.d.cts.map +1 -1
  87. package/dist/download/single.d.ts +6 -1
  88. package/dist/download/single.d.ts.map +1 -1
  89. package/dist/download/single.js +186 -98
  90. package/dist/download/single.js.map +1 -1
  91. package/dist/errors/index.cjs +699 -243
  92. package/dist/errors/index.cjs.map +1 -1
  93. package/dist/errors/index.d.cts +285 -82
  94. package/dist/errors/index.d.cts.map +1 -1
  95. package/dist/errors/index.d.ts +285 -82
  96. package/dist/errors/index.d.ts.map +1 -1
  97. package/dist/errors/index.js +678 -261
  98. package/dist/errors/index.js.map +1 -1
  99. package/dist/http/retry.cjs +45 -28
  100. package/dist/http/retry.cjs.map +1 -1
  101. package/dist/http/retry.d.cts +15 -2
  102. package/dist/http/retry.d.cts.map +1 -1
  103. package/dist/http/retry.d.ts +15 -2
  104. package/dist/http/retry.d.ts.map +1 -1
  105. package/dist/http/retry.js +46 -31
  106. package/dist/http/retry.js.map +1 -1
  107. package/dist/http/transport.cjs +438 -140
  108. package/dist/http/transport.cjs.map +1 -1
  109. package/dist/http/transport.d.cts +21 -2
  110. package/dist/http/transport.d.cts.map +1 -1
  111. package/dist/http/transport.d.ts +21 -2
  112. package/dist/http/transport.d.ts.map +1 -1
  113. package/dist/http/transport.js +437 -140
  114. package/dist/http/transport.js.map +1 -1
  115. package/dist/http/url-guard.cjs +154 -89
  116. package/dist/http/url-guard.cjs.map +1 -1
  117. package/dist/http/url-guard.d.cts +25 -3
  118. package/dist/http/url-guard.d.cts.map +1 -1
  119. package/dist/http/url-guard.d.ts +25 -3
  120. package/dist/http/url-guard.d.ts.map +1 -1
  121. package/dist/http/url-guard.js +152 -90
  122. package/dist/http/url-guard.js.map +1 -1
  123. package/dist/http/user-agent.cjs +84 -44
  124. package/dist/http/user-agent.cjs.map +1 -1
  125. package/dist/http/user-agent.js +84 -46
  126. package/dist/http/user-agent.js.map +1 -1
  127. package/dist/index.cjs +101 -77
  128. package/dist/index.d.cts +27 -21
  129. package/dist/index.d.cts.map +1 -1
  130. package/dist/index.d.ts +27 -21
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +15 -71
  133. package/dist/internal/b2-naming.cjs +66 -0
  134. package/dist/internal/b2-naming.cjs.map +1 -0
  135. package/dist/internal/b2-naming.d.cts +43 -0
  136. package/dist/internal/b2-naming.d.cts.map +1 -0
  137. package/dist/internal/b2-naming.d.ts +43 -0
  138. package/dist/internal/b2-naming.d.ts.map +1 -0
  139. package/dist/internal/b2-naming.js +60 -0
  140. package/dist/internal/b2-naming.js.map +1 -0
  141. package/dist/internal/upload-retry-options.cjs +21 -0
  142. package/dist/internal/upload-retry-options.cjs.map +1 -0
  143. package/dist/internal/upload-retry-options.d.cts +12 -0
  144. package/dist/internal/upload-retry-options.d.cts.map +1 -0
  145. package/dist/internal/upload-retry-options.d.ts +12 -0
  146. package/dist/internal/upload-retry-options.d.ts.map +1 -0
  147. package/dist/internal/upload-retry-options.js +21 -0
  148. package/dist/internal/upload-retry-options.js.map +1 -0
  149. package/dist/internal/url-redaction.cjs +31 -0
  150. package/dist/internal/url-redaction.cjs.map +1 -0
  151. package/dist/internal/url-redaction.d.cts +17 -0
  152. package/dist/internal/url-redaction.d.cts.map +1 -0
  153. package/dist/internal/url-redaction.d.ts +17 -0
  154. package/dist/internal/url-redaction.d.ts.map +1 -0
  155. package/dist/internal/url-redaction.js +31 -0
  156. package/dist/internal/url-redaction.js.map +1 -0
  157. package/dist/notifications/index.cjs +4 -6
  158. package/dist/notifications/index.d.cts +1 -1
  159. package/dist/notifications/index.d.cts.map +1 -1
  160. package/dist/notifications/index.d.ts +1 -1
  161. package/dist/notifications/index.d.ts.map +1 -1
  162. package/dist/notifications/index.js +1 -6
  163. package/dist/notifications/webhook.cjs +195 -85
  164. package/dist/notifications/webhook.cjs.map +1 -1
  165. package/dist/notifications/webhook.d.cts.map +1 -1
  166. package/dist/notifications/webhook.d.ts.map +1 -1
  167. package/dist/notifications/webhook.js +195 -87
  168. package/dist/notifications/webhook.js.map +1 -1
  169. package/dist/object.cjs +253 -210
  170. package/dist/object.cjs.map +1 -1
  171. package/dist/object.d.cts +9 -55
  172. package/dist/object.d.cts.map +1 -1
  173. package/dist/object.d.ts +9 -55
  174. package/dist/object.d.ts.map +1 -1
  175. package/dist/object.js +249 -206
  176. package/dist/object.js.map +1 -1
  177. package/dist/raw/encoding.cjs +74 -35
  178. package/dist/raw/encoding.cjs.map +1 -1
  179. package/dist/raw/encoding.js +74 -38
  180. package/dist/raw/encoding.js.map +1 -1
  181. package/dist/raw/index.cjs +678 -587
  182. package/dist/raw/index.cjs.map +1 -1
  183. package/dist/raw/index.d.cts +121 -18
  184. package/dist/raw/index.d.cts.map +1 -1
  185. package/dist/raw/index.d.ts +121 -18
  186. package/dist/raw/index.d.ts.map +1 -1
  187. package/dist/raw/index.js +674 -589
  188. package/dist/raw/index.js.map +1 -1
  189. package/dist/s3/index.cjs +355 -18
  190. package/dist/s3/index.cjs.map +1 -1
  191. package/dist/s3/index.d.cts +233 -5
  192. package/dist/s3/index.d.cts.map +1 -1
  193. package/dist/s3/index.d.ts +233 -5
  194. package/dist/s3/index.d.ts.map +1 -1
  195. package/dist/s3/index.js +351 -22
  196. package/dist/s3/index.js.map +1 -1
  197. package/dist/s3/sigv4.cjs +149 -0
  198. package/dist/s3/sigv4.cjs.map +1 -0
  199. package/dist/s3/sigv4.d.cts +43 -0
  200. package/dist/s3/sigv4.d.cts.map +1 -0
  201. package/dist/s3/sigv4.d.ts +43 -0
  202. package/dist/s3/sigv4.d.ts.map +1 -0
  203. package/dist/s3/sigv4.js +148 -0
  204. package/dist/s3/sigv4.js.map +1 -0
  205. package/dist/s3/validation.cjs +69 -0
  206. package/dist/s3/validation.cjs.map +1 -0
  207. package/dist/s3/validation.d.cts +43 -0
  208. package/dist/s3/validation.d.cts.map +1 -0
  209. package/dist/s3/validation.d.ts +43 -0
  210. package/dist/s3/validation.d.ts.map +1 -0
  211. package/dist/s3/validation.js +66 -0
  212. package/dist/s3/validation.js.map +1 -0
  213. package/dist/simulator/capabilities.cjs +63 -48
  214. package/dist/simulator/capabilities.cjs.map +1 -1
  215. package/dist/simulator/capabilities.js +63 -49
  216. package/dist/simulator/capabilities.js.map +1 -1
  217. package/dist/simulator/index.cjs +2124 -1548
  218. package/dist/simulator/index.cjs.map +1 -1
  219. package/dist/simulator/index.d.cts +79 -11
  220. package/dist/simulator/index.d.cts.map +1 -1
  221. package/dist/simulator/index.d.ts +79 -11
  222. package/dist/simulator/index.d.ts.map +1 -1
  223. package/dist/simulator/index.js +2112 -1546
  224. package/dist/simulator/index.js.map +1 -1
  225. package/dist/simulator/validation.cjs +191 -153
  226. package/dist/simulator/validation.cjs.map +1 -1
  227. package/dist/simulator/validation.d.cts +3 -21
  228. package/dist/simulator/validation.d.cts.map +1 -1
  229. package/dist/simulator/validation.d.ts +3 -21
  230. package/dist/simulator/validation.d.ts.map +1 -1
  231. package/dist/simulator/validation.js +188 -162
  232. package/dist/simulator/validation.js.map +1 -1
  233. package/dist/streams/collect.cjs +74 -24
  234. package/dist/streams/collect.cjs.map +1 -1
  235. package/dist/streams/collect.d.cts +14 -1
  236. package/dist/streams/collect.d.cts.map +1 -1
  237. package/dist/streams/collect.d.ts +14 -1
  238. package/dist/streams/collect.d.ts.map +1 -1
  239. package/dist/streams/collect.js +74 -25
  240. package/dist/streams/collect.js.map +1 -1
  241. package/dist/streams/file-source.cjs +287 -0
  242. package/dist/streams/file-source.cjs.map +1 -0
  243. package/dist/streams/file-source.d.cts +96 -0
  244. package/dist/streams/file-source.d.cts.map +1 -0
  245. package/dist/streams/file-source.d.ts +96 -0
  246. package/dist/streams/file-source.d.ts.map +1 -0
  247. package/dist/streams/file-source.js +286 -0
  248. package/dist/streams/file-source.js.map +1 -0
  249. package/dist/streams/hash.cjs +207 -115
  250. package/dist/streams/hash.cjs.map +1 -1
  251. package/dist/streams/hash.d.cts +5 -4
  252. package/dist/streams/hash.d.cts.map +1 -1
  253. package/dist/streams/hash.d.ts +5 -4
  254. package/dist/streams/hash.d.ts.map +1 -1
  255. package/dist/streams/hash.js +208 -95
  256. package/dist/streams/hash.js.map +1 -1
  257. package/dist/streams/index.cjs +12 -12
  258. package/dist/streams/index.d.cts +3 -3
  259. package/dist/streams/index.d.cts.map +1 -1
  260. package/dist/streams/index.d.ts +3 -3
  261. package/dist/streams/index.d.ts.map +1 -1
  262. package/dist/streams/index.js +2 -10
  263. package/dist/streams/progress.cjs +60 -46
  264. package/dist/streams/progress.cjs.map +1 -1
  265. package/dist/streams/progress.js +60 -46
  266. package/dist/streams/progress.js.map +1 -1
  267. package/dist/streams/source.cjs +316 -146
  268. package/dist/streams/source.cjs.map +1 -1
  269. package/dist/streams/source.d.cts +56 -18
  270. package/dist/streams/source.d.cts.map +1 -1
  271. package/dist/streams/source.d.ts +56 -18
  272. package/dist/streams/source.d.ts.map +1 -1
  273. package/dist/streams/source.js +312 -149
  274. package/dist/streams/source.js.map +1 -1
  275. package/dist/sync/actions/index.cjs +236 -184
  276. package/dist/sync/actions/index.cjs.map +1 -1
  277. package/dist/sync/actions/index.d.cts +29 -21
  278. package/dist/sync/actions/index.d.cts.map +1 -1
  279. package/dist/sync/actions/index.d.ts +29 -21
  280. package/dist/sync/actions/index.d.ts.map +1 -1
  281. package/dist/sync/actions/index.js +236 -190
  282. package/dist/sync/actions/index.js.map +1 -1
  283. package/dist/sync/b2-sha1-reader.cjs +148 -0
  284. package/dist/sync/b2-sha1-reader.cjs.map +1 -0
  285. package/dist/sync/b2-sha1-reader.d.cts +58 -0
  286. package/dist/sync/b2-sha1-reader.d.cts.map +1 -0
  287. package/dist/sync/b2-sha1-reader.d.ts +58 -0
  288. package/dist/sync/b2-sha1-reader.d.ts.map +1 -0
  289. package/dist/sync/b2-sha1-reader.js +145 -0
  290. package/dist/sync/b2-sha1-reader.js.map +1 -0
  291. package/dist/sync/download-staging.cjs +265 -0
  292. package/dist/sync/download-staging.cjs.map +1 -0
  293. package/dist/sync/download-staging.d.cts +54 -0
  294. package/dist/sync/download-staging.d.cts.map +1 -0
  295. package/dist/sync/download-staging.d.ts +54 -0
  296. package/dist/sync/download-staging.d.ts.map +1 -0
  297. package/dist/sync/download-staging.js +259 -0
  298. package/dist/sync/download-staging.js.map +1 -0
  299. package/dist/sync/filesystem-errors.cjs +32 -0
  300. package/dist/sync/filesystem-errors.cjs.map +1 -0
  301. package/dist/sync/filesystem-errors.d.cts +8 -0
  302. package/dist/sync/filesystem-errors.d.cts.map +1 -0
  303. package/dist/sync/filesystem-errors.d.ts +8 -0
  304. package/dist/sync/filesystem-errors.d.ts.map +1 -0
  305. package/dist/sync/filesystem-errors.js +32 -0
  306. package/dist/sync/filesystem-errors.js.map +1 -0
  307. package/dist/sync/filters.cjs +217 -0
  308. package/dist/sync/filters.cjs.map +1 -0
  309. package/dist/sync/filters.d.cts +51 -0
  310. package/dist/sync/filters.d.cts.map +1 -0
  311. package/dist/sync/filters.d.ts +51 -0
  312. package/dist/sync/filters.d.ts.map +1 -0
  313. package/dist/sync/filters.js +213 -0
  314. package/dist/sync/filters.js.map +1 -0
  315. package/dist/sync/index.cjs +39 -22
  316. package/dist/sync/index.d.cts +14 -9
  317. package/dist/sync/index.d.cts.map +1 -1
  318. package/dist/sync/index.d.ts +14 -9
  319. package/dist/sync/index.d.ts.map +1 -1
  320. package/dist/sync/index.js +9 -20
  321. package/dist/sync/local-file-identity.cjs +61 -0
  322. package/dist/sync/local-file-identity.cjs.map +1 -0
  323. package/dist/sync/local-file-identity.d.cts +37 -0
  324. package/dist/sync/local-file-identity.d.cts.map +1 -0
  325. package/dist/sync/local-file-identity.d.ts +37 -0
  326. package/dist/sync/local-file-identity.d.ts.map +1 -0
  327. package/dist/sync/local-file-identity.js +60 -0
  328. package/dist/sync/local-file-identity.js.map +1 -0
  329. package/dist/sync/local-file-io.cjs +364 -0
  330. package/dist/sync/local-file-io.cjs.map +1 -0
  331. package/dist/sync/local-file-io.d.cts +75 -0
  332. package/dist/sync/local-file-io.d.cts.map +1 -0
  333. package/dist/sync/local-file-io.d.ts +75 -0
  334. package/dist/sync/local-file-io.d.ts.map +1 -0
  335. package/dist/sync/local-file-io.js +360 -0
  336. package/dist/sync/local-file-io.js.map +1 -0
  337. package/dist/sync/local-filesystem-root.cjs +27 -0
  338. package/dist/sync/local-filesystem-root.cjs.map +1 -0
  339. package/dist/sync/local-filesystem-root.d.cts +18 -0
  340. package/dist/sync/local-filesystem-root.d.cts.map +1 -0
  341. package/dist/sync/local-filesystem-root.d.ts +18 -0
  342. package/dist/sync/local-filesystem-root.d.ts.map +1 -0
  343. package/dist/sync/local-filesystem-root.js +26 -0
  344. package/dist/sync/local-filesystem-root.js.map +1 -0
  345. package/dist/sync/local-sha1.cjs +119 -0
  346. package/dist/sync/local-sha1.cjs.map +1 -0
  347. package/dist/sync/local-sha1.d.cts +39 -0
  348. package/dist/sync/local-sha1.d.cts.map +1 -0
  349. package/dist/sync/local-sha1.d.ts +39 -0
  350. package/dist/sync/local-sha1.d.ts.map +1 -0
  351. package/dist/sync/local-sha1.js +117 -0
  352. package/dist/sync/local-sha1.js.map +1 -0
  353. package/dist/sync/pairing.cjs +118 -29
  354. package/dist/sync/pairing.cjs.map +1 -1
  355. package/dist/sync/pairing.d.cts +7 -2
  356. package/dist/sync/pairing.d.cts.map +1 -1
  357. package/dist/sync/pairing.d.ts +7 -2
  358. package/dist/sync/pairing.d.ts.map +1 -1
  359. package/dist/sync/pairing.js +120 -31
  360. package/dist/sync/pairing.js.map +1 -1
  361. package/dist/sync/path-order.cjs +30 -0
  362. package/dist/sync/path-order.cjs.map +1 -0
  363. package/dist/sync/path-order.d.cts +28 -0
  364. package/dist/sync/path-order.d.cts.map +1 -0
  365. package/dist/sync/path-order.d.ts +28 -0
  366. package/dist/sync/path-order.d.ts.map +1 -0
  367. package/dist/sync/path-order.js +29 -0
  368. package/dist/sync/path-order.js.map +1 -0
  369. package/dist/sync/path-safety.cjs +111 -0
  370. package/dist/sync/path-safety.cjs.map +1 -0
  371. package/dist/sync/path-safety.d.cts +78 -0
  372. package/dist/sync/path-safety.d.cts.map +1 -0
  373. package/dist/sync/path-safety.d.ts +78 -0
  374. package/dist/sync/path-safety.d.ts.map +1 -0
  375. package/dist/sync/path-safety.js +105 -0
  376. package/dist/sync/path-safety.js.map +1 -0
  377. package/dist/sync/paths.d.cts +19 -0
  378. package/dist/sync/paths.d.cts.map +1 -0
  379. package/dist/sync/paths.d.ts +19 -0
  380. package/dist/sync/paths.d.ts.map +1 -0
  381. package/dist/sync/policies/compare.cjs +389 -11
  382. package/dist/sync/policies/compare.cjs.map +1 -1
  383. package/dist/sync/policies/compare.d.cts +100 -2
  384. package/dist/sync/policies/compare.d.cts.map +1 -1
  385. package/dist/sync/policies/compare.d.ts +100 -2
  386. package/dist/sync/policies/compare.d.ts.map +1 -1
  387. package/dist/sync/policies/compare.js +387 -13
  388. package/dist/sync/policies/compare.js.map +1 -1
  389. package/dist/sync/policies/index.cjs +76 -65
  390. package/dist/sync/policies/index.cjs.map +1 -1
  391. package/dist/sync/policies/index.d.cts +35 -6
  392. package/dist/sync/policies/index.d.cts.map +1 -1
  393. package/dist/sync/policies/index.d.ts +35 -6
  394. package/dist/sync/policies/index.d.ts.map +1 -1
  395. package/dist/sync/policies/index.js +76 -65
  396. package/dist/sync/policies/index.js.map +1 -1
  397. package/dist/sync/prefix.cjs +96 -0
  398. package/dist/sync/prefix.cjs.map +1 -0
  399. package/dist/sync/prefix.d.cts +55 -0
  400. package/dist/sync/prefix.d.cts.map +1 -0
  401. package/dist/sync/prefix.d.ts +55 -0
  402. package/dist/sync/prefix.d.ts.map +1 -0
  403. package/dist/sync/prefix.js +92 -0
  404. package/dist/sync/prefix.js.map +1 -0
  405. package/dist/sync/regexp-safety.cjs +192 -0
  406. package/dist/sync/regexp-safety.cjs.map +1 -0
  407. package/dist/sync/regexp-safety.d.cts +29 -0
  408. package/dist/sync/regexp-safety.d.cts.map +1 -0
  409. package/dist/sync/regexp-safety.d.ts +29 -0
  410. package/dist/sync/regexp-safety.d.ts.map +1 -0
  411. package/dist/sync/regexp-safety.js +190 -0
  412. package/dist/sync/regexp-safety.js.map +1 -0
  413. package/dist/sync/scan-events.cjs +33 -0
  414. package/dist/sync/scan-events.cjs.map +1 -0
  415. package/dist/sync/scan-events.d.cts +17 -0
  416. package/dist/sync/scan-events.d.cts.map +1 -0
  417. package/dist/sync/scan-events.d.ts +17 -0
  418. package/dist/sync/scan-events.d.ts.map +1 -0
  419. package/dist/sync/scan-events.js +32 -0
  420. package/dist/sync/scan-events.js.map +1 -0
  421. package/dist/sync/scan-limit.cjs +33 -0
  422. package/dist/sync/scan-limit.cjs.map +1 -0
  423. package/dist/sync/scan-limit.d.cts +21 -0
  424. package/dist/sync/scan-limit.d.cts.map +1 -0
  425. package/dist/sync/scan-limit.d.ts +21 -0
  426. package/dist/sync/scan-limit.d.ts.map +1 -0
  427. package/dist/sync/scan-limit.js +31 -0
  428. package/dist/sync/scan-limit.js.map +1 -0
  429. package/dist/sync/scanners/b2.cjs +239 -55
  430. package/dist/sync/scanners/b2.cjs.map +1 -1
  431. package/dist/sync/scanners/b2.d.cts +26 -7
  432. package/dist/sync/scanners/b2.d.cts.map +1 -1
  433. package/dist/sync/scanners/b2.d.ts +26 -7
  434. package/dist/sync/scanners/b2.d.ts.map +1 -1
  435. package/dist/sync/scanners/b2.js +239 -55
  436. package/dist/sync/scanners/b2.js.map +1 -1
  437. package/dist/sync/scanners/local.cjs +215 -56
  438. package/dist/sync/scanners/local.cjs.map +1 -1
  439. package/dist/sync/scanners/local.d.cts +22 -7
  440. package/dist/sync/scanners/local.d.cts.map +1 -1
  441. package/dist/sync/scanners/local.d.ts +22 -7
  442. package/dist/sync/scanners/local.d.ts.map +1 -1
  443. package/dist/sync/scanners/local.js +216 -57
  444. package/dist/sync/scanners/local.js.map +1 -1
  445. package/dist/sync/sha1-metadata.cjs +94 -0
  446. package/dist/sync/sha1-metadata.cjs.map +1 -0
  447. package/dist/sync/sha1-metadata.d.cts +82 -0
  448. package/dist/sync/sha1-metadata.d.cts.map +1 -0
  449. package/dist/sync/sha1-metadata.d.ts +82 -0
  450. package/dist/sync/sha1-metadata.d.ts.map +1 -0
  451. package/dist/sync/sha1-metadata.js +89 -0
  452. package/dist/sync/sha1-metadata.js.map +1 -0
  453. package/dist/sync/sha1-options.cjs +23 -0
  454. package/dist/sync/sha1-options.cjs.map +1 -0
  455. package/dist/sync/sha1-options.d.cts +14 -0
  456. package/dist/sync/sha1-options.d.cts.map +1 -0
  457. package/dist/sync/sha1-options.d.ts +14 -0
  458. package/dist/sync/sha1-options.d.ts.map +1 -0
  459. package/dist/sync/sha1-options.js +21 -0
  460. package/dist/sync/sha1-options.js.map +1 -0
  461. package/dist/sync/synchronizer.cjs +782 -197
  462. package/dist/sync/synchronizer.cjs.map +1 -1
  463. package/dist/sync/synchronizer.d.cts +47 -1
  464. package/dist/sync/synchronizer.d.cts.map +1 -1
  465. package/dist/sync/synchronizer.d.ts +47 -1
  466. package/dist/sync/synchronizer.d.ts.map +1 -1
  467. package/dist/sync/synchronizer.js +779 -173
  468. package/dist/sync/synchronizer.js.map +1 -1
  469. package/dist/sync/types.d.cts +208 -16
  470. package/dist/sync/types.d.cts.map +1 -1
  471. package/dist/sync/types.d.ts +208 -16
  472. package/dist/sync/types.d.ts.map +1 -1
  473. package/dist/types/auth.cjs +76 -56
  474. package/dist/types/auth.cjs.map +1 -1
  475. package/dist/types/auth.d.cts +67 -9
  476. package/dist/types/auth.d.cts.map +1 -1
  477. package/dist/types/auth.d.ts +67 -9
  478. package/dist/types/auth.d.ts.map +1 -1
  479. package/dist/types/auth.js +77 -57
  480. package/dist/types/auth.js.map +1 -1
  481. package/dist/types/bucket.cjs +74 -38
  482. package/dist/types/bucket.cjs.map +1 -1
  483. package/dist/types/bucket.js +75 -41
  484. package/dist/types/bucket.js.map +1 -1
  485. package/dist/types/encryption.cjs +364 -327
  486. package/dist/types/encryption.cjs.map +1 -1
  487. package/dist/types/encryption.d.cts +16 -0
  488. package/dist/types/encryption.d.cts.map +1 -1
  489. package/dist/types/encryption.d.ts +16 -0
  490. package/dist/types/encryption.d.ts.map +1 -1
  491. package/dist/types/encryption.js +364 -310
  492. package/dist/types/encryption.js.map +1 -1
  493. package/dist/types/errors.cjs +47 -0
  494. package/dist/types/errors.cjs.map +1 -0
  495. package/dist/types/errors.d.cts +13 -4
  496. package/dist/types/errors.d.cts.map +1 -1
  497. package/dist/types/errors.d.ts +13 -4
  498. package/dist/types/errors.d.ts.map +1 -1
  499. package/dist/types/errors.js +47 -0
  500. package/dist/types/errors.js.map +1 -0
  501. package/dist/types/file.cjs +36 -19
  502. package/dist/types/file.cjs.map +1 -1
  503. package/dist/types/file.d.cts +2 -2
  504. package/dist/types/file.d.cts.map +1 -1
  505. package/dist/types/file.d.ts +2 -2
  506. package/dist/types/file.d.ts.map +1 -1
  507. package/dist/types/file.js +37 -21
  508. package/dist/types/file.js.map +1 -1
  509. package/dist/types/ids.cjs +53 -9
  510. package/dist/types/ids.cjs.map +1 -1
  511. package/dist/types/ids.js +54 -15
  512. package/dist/types/ids.js.map +1 -1
  513. package/dist/types/index.d.cts +12 -11
  514. package/dist/types/index.d.cts.map +1 -1
  515. package/dist/types/index.d.ts +12 -11
  516. package/dist/types/index.d.ts.map +1 -1
  517. package/dist/types/key.d.cts +44 -8
  518. package/dist/types/key.d.cts.map +1 -1
  519. package/dist/types/key.d.ts +44 -8
  520. package/dist/types/key.d.ts.map +1 -1
  521. package/dist/types/lock.cjs +33 -13
  522. package/dist/types/lock.cjs.map +1 -1
  523. package/dist/types/lock.js +34 -15
  524. package/dist/types/lock.js.map +1 -1
  525. package/dist/types/notifications.cjs +44 -22
  526. package/dist/types/notifications.cjs.map +1 -1
  527. package/dist/types/notifications.js +45 -23
  528. package/dist/types/notifications.js.map +1 -1
  529. package/dist/types/upload.d.cts +39 -5
  530. package/dist/types/upload.d.cts.map +1 -1
  531. package/dist/types/upload.d.ts +39 -5
  532. package/dist/types/upload.d.ts.map +1 -1
  533. package/dist/upload/abort-scope.cjs +91 -0
  534. package/dist/upload/abort-scope.cjs.map +1 -0
  535. package/dist/upload/abort-scope.d.cts +48 -0
  536. package/dist/upload/abort-scope.d.cts.map +1 -0
  537. package/dist/upload/abort-scope.d.ts +48 -0
  538. package/dist/upload/abort-scope.d.ts.map +1 -0
  539. package/dist/upload/abort-scope.js +88 -0
  540. package/dist/upload/abort-scope.js.map +1 -0
  541. package/dist/upload/cancel.cjs +183 -8
  542. package/dist/upload/cancel.cjs.map +1 -1
  543. package/dist/upload/cancel.d.cts +110 -2
  544. package/dist/upload/cancel.d.cts.map +1 -1
  545. package/dist/upload/cancel.d.ts +110 -2
  546. package/dist/upload/cancel.d.ts.map +1 -1
  547. package/dist/upload/cancel.js +178 -9
  548. package/dist/upload/cancel.js.map +1 -1
  549. package/dist/upload/concurrency.cjs +79 -52
  550. package/dist/upload/concurrency.cjs.map +1 -1
  551. package/dist/upload/concurrency.js +79 -53
  552. package/dist/upload/concurrency.js.map +1 -1
  553. package/dist/upload/finish.cjs +59 -0
  554. package/dist/upload/finish.cjs.map +1 -0
  555. package/dist/upload/finish.d.cts +26 -0
  556. package/dist/upload/finish.d.cts.map +1 -0
  557. package/dist/upload/finish.d.ts +26 -0
  558. package/dist/upload/finish.d.ts.map +1 -0
  559. package/dist/upload/finish.js +59 -0
  560. package/dist/upload/finish.js.map +1 -0
  561. package/dist/upload/large.cjs +301 -218
  562. package/dist/upload/large.cjs.map +1 -1
  563. package/dist/upload/large.d.cts +76 -9
  564. package/dist/upload/large.d.cts.map +1 -1
  565. package/dist/upload/large.d.ts +76 -9
  566. package/dist/upload/large.d.ts.map +1 -1
  567. package/dist/upload/large.js +301 -218
  568. package/dist/upload/large.js.map +1 -1
  569. package/dist/upload/options.cjs +28 -0
  570. package/dist/upload/options.cjs.map +1 -0
  571. package/dist/upload/options.d.cts +104 -0
  572. package/dist/upload/options.d.cts.map +1 -0
  573. package/dist/upload/options.d.ts +104 -0
  574. package/dist/upload/options.d.ts.map +1 -0
  575. package/dist/upload/options.js +27 -0
  576. package/dist/upload/options.js.map +1 -0
  577. package/dist/upload/resume.cjs +333 -33
  578. package/dist/upload/resume.cjs.map +1 -1
  579. package/dist/upload/resume.d.cts +82 -12
  580. package/dist/upload/resume.d.cts.map +1 -1
  581. package/dist/upload/resume.d.ts +82 -12
  582. package/dist/upload/resume.d.ts.map +1 -1
  583. package/dist/upload/resume.js +330 -33
  584. package/dist/upload/resume.js.map +1 -1
  585. package/dist/upload/retry.cjs +186 -0
  586. package/dist/upload/retry.cjs.map +1 -0
  587. package/dist/upload/retry.d.cts +127 -0
  588. package/dist/upload/retry.d.cts.map +1 -0
  589. package/dist/upload/retry.d.ts +127 -0
  590. package/dist/upload/retry.d.ts.map +1 -0
  591. package/dist/upload/retry.js +182 -0
  592. package/dist/upload/retry.js.map +1 -0
  593. package/dist/upload/single.cjs +68 -44
  594. package/dist/upload/single.cjs.map +1 -1
  595. package/dist/upload/single.d.cts +2 -1
  596. package/dist/upload/single.d.cts.map +1 -1
  597. package/dist/upload/single.d.ts +2 -1
  598. package/dist/upload/single.d.ts.map +1 -1
  599. package/dist/upload/single.js +68 -44
  600. package/dist/upload/single.js.map +1 -1
  601. package/dist/upload/stream.cjs +317 -193
  602. package/dist/upload/stream.cjs.map +1 -1
  603. package/dist/upload/stream.d.cts +3 -1
  604. package/dist/upload/stream.d.cts.map +1 -1
  605. package/dist/upload/stream.d.ts +3 -1
  606. package/dist/upload/stream.d.ts.map +1 -1
  607. package/dist/upload/stream.js +316 -192
  608. package/dist/upload/stream.js.map +1 -1
  609. package/dist/util/best-effort.cjs +42 -8
  610. package/dist/util/best-effort.cjs.map +1 -1
  611. package/dist/util/best-effort.d.cts +2 -1
  612. package/dist/util/best-effort.d.cts.map +1 -1
  613. package/dist/util/best-effort.d.ts +2 -1
  614. package/dist/util/best-effort.d.ts.map +1 -1
  615. package/dist/util/best-effort.js +43 -9
  616. package/dist/util/best-effort.js.map +1 -1
  617. package/dist/util/bytes.cjs +23 -0
  618. package/dist/util/bytes.cjs.map +1 -0
  619. package/dist/util/bytes.d.cts +15 -0
  620. package/dist/util/bytes.d.cts.map +1 -0
  621. package/dist/util/bytes.d.ts +15 -0
  622. package/dist/util/bytes.d.ts.map +1 -0
  623. package/dist/util/bytes.js +23 -0
  624. package/dist/util/bytes.js.map +1 -0
  625. package/dist/util/crypto.cjs +68 -0
  626. package/dist/util/crypto.cjs.map +1 -0
  627. package/dist/util/crypto.d.cts +26 -0
  628. package/dist/util/crypto.d.cts.map +1 -0
  629. package/dist/util/crypto.d.ts +26 -0
  630. package/dist/util/crypto.d.ts.map +1 -0
  631. package/dist/util/crypto.js +66 -0
  632. package/dist/util/crypto.js.map +1 -0
  633. package/dist/util/defaults.cjs +25 -9
  634. package/dist/util/defaults.cjs.map +1 -1
  635. package/dist/util/defaults.js +26 -11
  636. package/dist/util/defaults.js.map +1 -1
  637. package/dist/util/error-reason.cjs +41 -0
  638. package/dist/util/error-reason.cjs.map +1 -0
  639. package/dist/util/error-reason.d.cts +9 -0
  640. package/dist/util/error-reason.d.cts.map +1 -0
  641. package/dist/util/error-reason.d.ts +9 -0
  642. package/dist/util/error-reason.d.ts.map +1 -0
  643. package/dist/util/error-reason.js +41 -0
  644. package/dist/util/error-reason.js.map +1 -0
  645. package/dist/util/http.cjs +23 -0
  646. package/dist/util/http.cjs.map +1 -0
  647. package/dist/util/http.d.cts +13 -0
  648. package/dist/util/http.d.cts.map +1 -0
  649. package/dist/util/http.d.ts +13 -0
  650. package/dist/util/http.d.ts.map +1 -0
  651. package/dist/util/http.js +23 -0
  652. package/dist/util/http.js.map +1 -0
  653. package/dist/util/normalize.cjs +66 -7
  654. package/dist/util/normalize.cjs.map +1 -1
  655. package/dist/util/normalize.js +67 -10
  656. package/dist/util/normalize.js.map +1 -1
  657. package/dist/util/paginator.cjs +63 -14
  658. package/dist/util/paginator.cjs.map +1 -1
  659. package/dist/util/paginator.js +64 -16
  660. package/dist/util/paginator.js.map +1 -1
  661. package/dist/util/plan-ranges.cjs +47 -22
  662. package/dist/util/plan-ranges.cjs.map +1 -1
  663. package/dist/util/plan-ranges.js +48 -24
  664. package/dist/util/plan-ranges.js.map +1 -1
  665. package/dist/util/sha1.cjs +27 -0
  666. package/dist/util/sha1.cjs.map +1 -0
  667. package/dist/util/sha1.d.cts +17 -0
  668. package/dist/util/sha1.d.cts.map +1 -0
  669. package/dist/util/sha1.d.ts +17 -0
  670. package/dist/util/sha1.d.ts.map +1 -0
  671. package/dist/util/sha1.js +26 -0
  672. package/dist/util/sha1.js.map +1 -0
  673. package/dist/util/text-codec.cjs +29 -5
  674. package/dist/util/text-codec.cjs.map +1 -1
  675. package/dist/util/text-codec.js +30 -7
  676. package/dist/util/text-codec.js.map +1 -1
  677. package/dist/util/to-error.cjs +18 -4
  678. package/dist/util/to-error.cjs.map +1 -1
  679. package/dist/util/to-error.js +19 -5
  680. package/dist/util/to-error.js.map +1 -1
  681. package/dist/version.cjs +17 -5
  682. package/dist/version.cjs.map +1 -1
  683. package/dist/version.d.cts +3 -3
  684. package/dist/version.d.ts +3 -3
  685. package/dist/version.js +19 -6
  686. package/dist/version.js.map +1 -1
  687. package/package.json +19 -16
  688. package/dist/auth/index.cjs.map +0 -1
  689. package/dist/auth/index.js.map +0 -1
  690. package/dist/index.cjs.map +0 -1
  691. package/dist/index.js.map +0 -1
  692. package/dist/notifications/index.cjs.map +0 -1
  693. package/dist/notifications/index.js.map +0 -1
  694. package/dist/package.json.cjs +0 -9
  695. package/dist/package.json.cjs.map +0 -1
  696. package/dist/package.json.js +0 -9
  697. package/dist/package.json.js.map +0 -1
  698. package/dist/streams/index.cjs.map +0 -1
  699. package/dist/streams/index.js.map +0 -1
  700. package/dist/sync/index.cjs.map +0 -1
  701. package/dist/sync/index.js.map +0 -1
@@ -1,13 +1,111 @@
1
- import { CompareMode, SyncPath } from '../types.js';
1
+ import { LocalSha1Reader } from '../local-sha1.js';
2
+ import { SyncPair } from '../pairing.js';
3
+ import { B2SyncPath, CompareMode, SyncEvent, SyncPath } from '../types.js';
4
+ export { selectB2ComparableSha1 } from '../sha1-metadata.js';
5
+ /** Result from a B2 SHA-1 verification read. */
6
+ export interface B2Sha1ReadResult {
7
+ /** SHA-1 digest of the selected B2 bytes, or null when unavailable. */
8
+ readonly contentSha1: string | null;
9
+ /** Number of B2 bytes downloaded and hashed while verifying. */
10
+ readonly bytesRead: number;
11
+ }
12
+ /** Reads a B2 file and returns the SHA-1 digest of its actual bytes, or null when unavailable. */
13
+ export type B2Sha1Reader = (path: B2SyncPath, signal?: AbortSignal) => Promise<string | null | B2Sha1ReadResult>;
14
+ /** Options for preparing a file pair before comparison. */
15
+ export interface PreparePairForCompareOptions {
16
+ /** Signal used to abort local file hashing. */
17
+ readonly signal?: AbortSignal;
18
+ /** Optional idle/no-progress timeout for local SHA-1 reads. */
19
+ readonly sha1ReadTimeoutMillis?: number;
20
+ /** Optional local hashing override for tests or custom runtimes. */
21
+ readonly readLocalSha1?: LocalSha1Reader;
22
+ /** Optional B2 hashing override used to verify metadata matches before skipping. */
23
+ readonly readB2Sha1?: B2Sha1Reader;
24
+ }
25
+ /** Options for preparing multiple file pairs before comparison. */
26
+ export interface PreparePairsForCompareOptions extends PreparePairForCompareOptions {
27
+ /** Maximum number of file pairs to prepare concurrently. */
28
+ readonly concurrency?: number;
29
+ }
30
+ /** Result of preparing a file pair before policy comparison. */
31
+ export interface ComparePreparationResult {
32
+ /** The pair with compare-mode metadata populated where possible. */
33
+ readonly pair: SyncPair;
34
+ /** Events surfaced while preparing the pair, such as per-file hash errors or skips. */
35
+ readonly events: readonly SyncEvent[];
36
+ /** Errors surfaced while preparing the pair. These contribute to the final summary. */
37
+ readonly errors: readonly Error[];
38
+ /** Local file bytes read for hashing while preparing this pair. */
39
+ readonly bytesHashed: number;
40
+ /** B2 bytes read for untrusted metadata verification while preparing this pair. */
41
+ readonly bytesVerified: number;
42
+ /** Whether action generation should be skipped for this pair. */
43
+ readonly skipActionGeneration: boolean;
44
+ /** Whether preparation stopped because the abort signal fired. */
45
+ readonly aborted: boolean;
46
+ }
47
+ /** A prepared pair result with the original pair retained for event context. */
48
+ export interface PreparedComparePair {
49
+ /** Original pair from {@link zipFolders}. */
50
+ readonly originalPair: SyncPair;
51
+ /** Preparation result for the original pair. */
52
+ readonly prepared: ComparePreparationResult;
53
+ }
2
54
  /**
3
55
  * Determines whether two files should be considered different based on the compare mode.
56
+ * For `sha1`, callers that use the low-level policy helpers should first prepare the pair so
57
+ * local hashes and comparable B2 hashes are populated.
4
58
  *
5
59
  * @param source - The source file metadata.
6
60
  * @param dest - The destination file metadata.
7
- * @param compareMode - The comparison strategy: 'modtime', 'size', or 'none'.
61
+ * @param compareMode - The comparison strategy: 'modtime', 'size', 'sha1', or 'none'.
8
62
  * @param threshold - Tolerance for the comparison (bytes for size, milliseconds for modtime).
9
63
  *
10
64
  * @returns `true` if the files are considered different.
65
+ *
66
+ * @throws When `compareMode` is not one of the supported compare modes.
11
67
  */
12
68
  export declare function filesAreDifferent(source: SyncPath, dest: SyncPath, compareMode: CompareMode, threshold?: number): boolean;
69
+ /**
70
+ * Throws when a runtime compare mode value is unsupported.
71
+ *
72
+ * @param compareMode - User-supplied compare mode.
73
+ *
74
+ * @throws When `compareMode` is not one of the supported values.
75
+ */
76
+ export declare function assertSupportedCompareMode(compareMode: unknown): asserts compareMode is CompareMode;
77
+ /**
78
+ * Prepares a pair for the selected compare mode.
79
+ *
80
+ * For `sha1`, this fills missing B2 hashes from comparable metadata and, when an explicit local
81
+ * reader is supplied, hashes the local side only when size cannot already prove a difference.
82
+ * Reader failures are converted into per-file sync events instead of aborting the whole run.
83
+ *
84
+ * @param pair - Source/destination pair from {@link zipFolders}.
85
+ * @param compareMode - The comparison strategy.
86
+ * @param options - Optional hashing dependencies and cancellation signal.
87
+ *
88
+ * @returns The prepared pair plus any preparation events.
89
+ */
90
+ export declare function preparePairForCompare(pair: SyncPair, compareMode: CompareMode, options?: PreparePairForCompareOptions): Promise<ComparePreparationResult>;
91
+ /**
92
+ * Prepares a list of pairs for the selected compare mode with bounded concurrency.
93
+ *
94
+ * @param pairs - Source/destination pairs from {@link zipFolders}.
95
+ * @param compareMode - The comparison strategy.
96
+ * @param options - Optional hashing dependencies, cancellation signal, and concurrency.
97
+ *
98
+ * @returns Prepared results in the same order as the input pairs.
99
+ */
100
+ export declare function preparePairsForCompare(pairs: readonly SyncPair[], compareMode: CompareMode, options?: PreparePairsForCompareOptions): Promise<PreparedComparePair[]>;
101
+ /**
102
+ * Creates a successful no-op compare preparation result for a pair.
103
+ *
104
+ * @param pair - Source/destination pair from {@link zipFolders}.
105
+ * @param bytesHashed - Local file bytes read while preparing the pair.
106
+ * @param bytesVerified - B2 bytes read while verifying untrusted SHA-1 metadata.
107
+ *
108
+ * @returns A ready preparation result that allows action generation.
109
+ */
110
+ export declare function readyComparePair(pair: SyncPair, bytesHashed?: number, bytesVerified?: number): ComparePreparationResult;
13
111
  //# sourceMappingURL=compare.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../../src/sync/policies/compare.js"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAExD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,QAAQ,EAChB,IAAI,EAAE,QAAQ,EACd,WAAW,EAAE,WAAW,EACxB,SAAS,SAAI,GACZ,OAAO,CAST"}
1
+ {"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../../src/sync/policies/compare.js"],"names":[],"mappings":"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"}
@@ -1,13 +1,111 @@
1
- import { CompareMode, SyncPath } from '../types.js';
1
+ import { LocalSha1Reader } from '../local-sha1.js';
2
+ import { SyncPair } from '../pairing.js';
3
+ import { B2SyncPath, CompareMode, SyncEvent, SyncPath } from '../types.js';
4
+ export { selectB2ComparableSha1 } from '../sha1-metadata.js';
5
+ /** Result from a B2 SHA-1 verification read. */
6
+ export interface B2Sha1ReadResult {
7
+ /** SHA-1 digest of the selected B2 bytes, or null when unavailable. */
8
+ readonly contentSha1: string | null;
9
+ /** Number of B2 bytes downloaded and hashed while verifying. */
10
+ readonly bytesRead: number;
11
+ }
12
+ /** Reads a B2 file and returns the SHA-1 digest of its actual bytes, or null when unavailable. */
13
+ export type B2Sha1Reader = (path: B2SyncPath, signal?: AbortSignal) => Promise<string | null | B2Sha1ReadResult>;
14
+ /** Options for preparing a file pair before comparison. */
15
+ export interface PreparePairForCompareOptions {
16
+ /** Signal used to abort local file hashing. */
17
+ readonly signal?: AbortSignal;
18
+ /** Optional idle/no-progress timeout for local SHA-1 reads. */
19
+ readonly sha1ReadTimeoutMillis?: number;
20
+ /** Optional local hashing override for tests or custom runtimes. */
21
+ readonly readLocalSha1?: LocalSha1Reader;
22
+ /** Optional B2 hashing override used to verify metadata matches before skipping. */
23
+ readonly readB2Sha1?: B2Sha1Reader;
24
+ }
25
+ /** Options for preparing multiple file pairs before comparison. */
26
+ export interface PreparePairsForCompareOptions extends PreparePairForCompareOptions {
27
+ /** Maximum number of file pairs to prepare concurrently. */
28
+ readonly concurrency?: number;
29
+ }
30
+ /** Result of preparing a file pair before policy comparison. */
31
+ export interface ComparePreparationResult {
32
+ /** The pair with compare-mode metadata populated where possible. */
33
+ readonly pair: SyncPair;
34
+ /** Events surfaced while preparing the pair, such as per-file hash errors or skips. */
35
+ readonly events: readonly SyncEvent[];
36
+ /** Errors surfaced while preparing the pair. These contribute to the final summary. */
37
+ readonly errors: readonly Error[];
38
+ /** Local file bytes read for hashing while preparing this pair. */
39
+ readonly bytesHashed: number;
40
+ /** B2 bytes read for untrusted metadata verification while preparing this pair. */
41
+ readonly bytesVerified: number;
42
+ /** Whether action generation should be skipped for this pair. */
43
+ readonly skipActionGeneration: boolean;
44
+ /** Whether preparation stopped because the abort signal fired. */
45
+ readonly aborted: boolean;
46
+ }
47
+ /** A prepared pair result with the original pair retained for event context. */
48
+ export interface PreparedComparePair {
49
+ /** Original pair from {@link zipFolders}. */
50
+ readonly originalPair: SyncPair;
51
+ /** Preparation result for the original pair. */
52
+ readonly prepared: ComparePreparationResult;
53
+ }
2
54
  /**
3
55
  * Determines whether two files should be considered different based on the compare mode.
56
+ * For `sha1`, callers that use the low-level policy helpers should first prepare the pair so
57
+ * local hashes and comparable B2 hashes are populated.
4
58
  *
5
59
  * @param source - The source file metadata.
6
60
  * @param dest - The destination file metadata.
7
- * @param compareMode - The comparison strategy: 'modtime', 'size', or 'none'.
61
+ * @param compareMode - The comparison strategy: 'modtime', 'size', 'sha1', or 'none'.
8
62
  * @param threshold - Tolerance for the comparison (bytes for size, milliseconds for modtime).
9
63
  *
10
64
  * @returns `true` if the files are considered different.
65
+ *
66
+ * @throws When `compareMode` is not one of the supported compare modes.
11
67
  */
12
68
  export declare function filesAreDifferent(source: SyncPath, dest: SyncPath, compareMode: CompareMode, threshold?: number): boolean;
69
+ /**
70
+ * Throws when a runtime compare mode value is unsupported.
71
+ *
72
+ * @param compareMode - User-supplied compare mode.
73
+ *
74
+ * @throws When `compareMode` is not one of the supported values.
75
+ */
76
+ export declare function assertSupportedCompareMode(compareMode: unknown): asserts compareMode is CompareMode;
77
+ /**
78
+ * Prepares a pair for the selected compare mode.
79
+ *
80
+ * For `sha1`, this fills missing B2 hashes from comparable metadata and, when an explicit local
81
+ * reader is supplied, hashes the local side only when size cannot already prove a difference.
82
+ * Reader failures are converted into per-file sync events instead of aborting the whole run.
83
+ *
84
+ * @param pair - Source/destination pair from {@link zipFolders}.
85
+ * @param compareMode - The comparison strategy.
86
+ * @param options - Optional hashing dependencies and cancellation signal.
87
+ *
88
+ * @returns The prepared pair plus any preparation events.
89
+ */
90
+ export declare function preparePairForCompare(pair: SyncPair, compareMode: CompareMode, options?: PreparePairForCompareOptions): Promise<ComparePreparationResult>;
91
+ /**
92
+ * Prepares a list of pairs for the selected compare mode with bounded concurrency.
93
+ *
94
+ * @param pairs - Source/destination pairs from {@link zipFolders}.
95
+ * @param compareMode - The comparison strategy.
96
+ * @param options - Optional hashing dependencies, cancellation signal, and concurrency.
97
+ *
98
+ * @returns Prepared results in the same order as the input pairs.
99
+ */
100
+ export declare function preparePairsForCompare(pairs: readonly SyncPair[], compareMode: CompareMode, options?: PreparePairsForCompareOptions): Promise<PreparedComparePair[]>;
101
+ /**
102
+ * Creates a successful no-op compare preparation result for a pair.
103
+ *
104
+ * @param pair - Source/destination pair from {@link zipFolders}.
105
+ * @param bytesHashed - Local file bytes read while preparing the pair.
106
+ * @param bytesVerified - B2 bytes read while verifying untrusted SHA-1 metadata.
107
+ *
108
+ * @returns A ready preparation result that allows action generation.
109
+ */
110
+ export declare function readyComparePair(pair: SyncPair, bytesHashed?: number, bytesVerified?: number): ComparePreparationResult;
13
111
  //# sourceMappingURL=compare.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../../src/sync/policies/compare.js"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAExD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,QAAQ,EAChB,IAAI,EAAE,QAAQ,EACd,WAAW,EAAE,WAAW,EACxB,SAAS,SAAI,GACZ,OAAO,CAST"}
1
+ {"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../../src/sync/policies/compare.js"],"names":[],"mappings":"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"}
@@ -1,14 +1,388 @@
1
+ import { mapConcurrent } from "../../upload/concurrency.js";
2
+ import { normalizeVerifiableSha1 } from "../../util/sha1.js";
3
+ import { toError } from "../../util/to-error.js";
4
+ import { formatHashError, isAbortError } from "../local-sha1.js";
5
+ import { selectB2ComparableSha1, syncSha1StateOf } from "../sha1-metadata.js";
6
+ //#region src/sync/policies/compare.ts
7
+ /**
8
+ * Determines whether two files should be considered different based on the compare mode.
9
+ * For `sha1`, callers that use the low-level policy helpers should first prepare the pair so
10
+ * local hashes and comparable B2 hashes are populated.
11
+ *
12
+ * @param source - The source file metadata.
13
+ * @param dest - The destination file metadata.
14
+ * @param compareMode - The comparison strategy: 'modtime', 'size', 'sha1', or 'none'.
15
+ * @param threshold - Tolerance for the comparison (bytes for size, milliseconds for modtime).
16
+ *
17
+ * @returns `true` if the files are considered different.
18
+ *
19
+ * @throws When `compareMode` is not one of the supported compare modes.
20
+ */
1
21
  function filesAreDifferent(source, dest, compareMode, threshold = 0) {
2
- switch (compareMode) {
3
- case "none":
4
- return false;
5
- case "size":
6
- return Math.abs(source.size - dest.size) > threshold;
7
- case "modtime":
8
- return Math.abs(source.modTimeMillis - dest.modTimeMillis) > threshold;
9
- }
10
- }
11
- export {
12
- filesAreDifferent
13
- };
14
- //# sourceMappingURL=compare.js.map
22
+ switch (compareMode) {
23
+ case "none": return false;
24
+ case "size": return Math.abs(source.size - dest.size) > threshold;
25
+ case "sha1": return sha1ValuesAreDifferent(source, dest);
26
+ case "modtime": return Math.abs(source.modTimeMillis - dest.modTimeMillis) > threshold;
27
+ default: throw new Error(`Unsupported compare mode: ${String(compareMode)}`);
28
+ }
29
+ }
30
+ /**
31
+ * Throws when a runtime compare mode value is unsupported.
32
+ *
33
+ * @param compareMode - User-supplied compare mode.
34
+ *
35
+ * @throws When `compareMode` is not one of the supported values.
36
+ */
37
+ function assertSupportedCompareMode(compareMode) {
38
+ switch (compareMode) {
39
+ case "none":
40
+ case "size":
41
+ case "sha1":
42
+ case "modtime": return;
43
+ default: throw new Error(`Unsupported compare mode: ${String(compareMode)}`);
44
+ }
45
+ }
46
+ function sha1ValuesAreDifferent(source, dest) {
47
+ if (source.size !== dest.size) return true;
48
+ const sourceSha1 = comparableSha1(source);
49
+ const destSha1 = comparableSha1(dest);
50
+ if (sourceSha1.kind === "untrusted" || destSha1.kind === "untrusted") return true;
51
+ if (sourceSha1.kind === "unavailable" || destSha1.kind === "unavailable") return true;
52
+ return sourceSha1.value !== destSha1.value;
53
+ }
54
+ /**
55
+ * Prepares a pair for the selected compare mode.
56
+ *
57
+ * For `sha1`, this fills missing B2 hashes from comparable metadata and, when an explicit local
58
+ * reader is supplied, hashes the local side only when size cannot already prove a difference.
59
+ * Reader failures are converted into per-file sync events instead of aborting the whole run.
60
+ *
61
+ * @param pair - Source/destination pair from {@link zipFolders}.
62
+ * @param compareMode - The comparison strategy.
63
+ * @param options - Optional hashing dependencies and cancellation signal.
64
+ *
65
+ * @returns The prepared pair plus any preparation events.
66
+ */
67
+ async function preparePairForCompare(pair, compareMode, options = {}) {
68
+ assertSupportedCompareMode(compareMode);
69
+ if (compareMode !== "sha1") return readyComparePair(pair);
70
+ const [source, dest] = pair;
71
+ if (source === null || dest === null) return readyComparePair(pair);
72
+ if (source.size !== dest.size) return readyComparePair(pair);
73
+ const metadataPair = [withB2ContentSha1(source), withB2ContentSha1(dest)];
74
+ if (hasUnavailableB2Sha1(metadataPair)) return skipped(metadataPair, unavailableSha1Event(metadataPair));
75
+ if (options.readB2Sha1 === void 0 && hasUntrustedSha1(metadataPair) && !hasVerifiableUntrustedSha1(metadataPair)) return readyComparePair(metadataPair);
76
+ const [metadataSource, metadataDest] = metadataPair;
77
+ if (metadataSource === null || metadataDest === null) return readyComparePair(metadataPair);
78
+ const sourceResult = await prepareLocalPathSha1(metadataSource, options);
79
+ if (sourceResult.aborted) return aborted(metadataPair);
80
+ if (sourceResult.event) return skipped(metadataPair, sourceResult.event, sourceResult.error, sourceResult.bytesHashed);
81
+ const destResult = await prepareLocalPathSha1(metadataDest, options);
82
+ if (destResult.aborted) return aborted([sourceResult.path, destResult.path]);
83
+ if (destResult.event) return skipped([sourceResult.path, destResult.path], destResult.event, destResult.error, sourceResult.bytesHashed);
84
+ const preparedPair = [sourceResult.path, destResult.path];
85
+ const sourceState = comparableSha1(sourceResult.path);
86
+ const destState = comparableSha1(destResult.path);
87
+ const bytesHashed = sourceResult.bytesHashed + destResult.bytesHashed;
88
+ if (sourceState.kind === "unavailable" || destState.kind === "unavailable") return skipped(preparedPair, unavailableSha1Event(preparedPair), void 0, bytesHashed);
89
+ const shouldVerifyB2Bytes = untrustedSha1CouldSuppressTransfer(sourceState, destState);
90
+ const readB2Sha1 = options.readB2Sha1;
91
+ if (shouldVerifyB2Bytes && hasB2Path(preparedPair) && readB2Sha1 !== void 0) return verifyB2Sha1Bytes(preparedPair, {
92
+ ...options,
93
+ readB2Sha1
94
+ }, bytesHashed);
95
+ return readyComparePair(preparedPair, bytesHashed);
96
+ }
97
+ /**
98
+ * Prepares a list of pairs for the selected compare mode with bounded concurrency.
99
+ *
100
+ * @param pairs - Source/destination pairs from {@link zipFolders}.
101
+ * @param compareMode - The comparison strategy.
102
+ * @param options - Optional hashing dependencies, cancellation signal, and concurrency.
103
+ *
104
+ * @returns Prepared results in the same order as the input pairs.
105
+ */
106
+ async function preparePairsForCompare(pairs, compareMode, options = {}) {
107
+ assertSupportedCompareMode(compareMode);
108
+ if (compareMode !== "sha1") return pairs.map((pair) => ({
109
+ originalPair: pair,
110
+ prepared: readyComparePair(pair)
111
+ }));
112
+ return mapConcurrent(pairs, normalizeConcurrency(options.concurrency), async (pair) => {
113
+ if (options.signal?.aborted) return {
114
+ originalPair: pair,
115
+ prepared: aborted(pair)
116
+ };
117
+ return {
118
+ originalPair: pair,
119
+ prepared: await preparePairForCompare(pair, compareMode, options)
120
+ };
121
+ });
122
+ }
123
+ async function prepareLocalPathSha1(path, options) {
124
+ if (!isLocalSyncPath(path)) return {
125
+ path,
126
+ bytesHashed: 0,
127
+ bytesVerified: 0,
128
+ aborted: false
129
+ };
130
+ if (options.signal?.aborted) return {
131
+ path,
132
+ bytesHashed: 0,
133
+ bytesVerified: 0,
134
+ aborted: true
135
+ };
136
+ try {
137
+ const state = syncSha1StateOf(path);
138
+ if (state.kind === "verified") return {
139
+ path: {
140
+ ...path,
141
+ contentSha1: state.value
142
+ },
143
+ bytesHashed: 0,
144
+ bytesVerified: 0,
145
+ aborted: false
146
+ };
147
+ if (state.kind === "unavailable") return {
148
+ path: {
149
+ ...path,
150
+ contentSha1: null
151
+ },
152
+ bytesHashed: 0,
153
+ bytesVerified: 0,
154
+ aborted: false
155
+ };
156
+ const readLocalSha1 = options.readLocalSha1;
157
+ if (readLocalSha1 === void 0) return {
158
+ path: {
159
+ ...path,
160
+ contentSha1: path.contentSha1 ?? null
161
+ },
162
+ bytesHashed: 0,
163
+ bytesVerified: 0,
164
+ aborted: false
165
+ };
166
+ const contentSha1 = await readLocalSha1(path, options.signal, { ...options.sha1ReadTimeoutMillis !== void 0 ? { timeoutMillis: options.sha1ReadTimeoutMillis } : {} });
167
+ return {
168
+ path: {
169
+ ...path,
170
+ contentSha1
171
+ },
172
+ bytesHashed: normalizeVerifiableSha1(contentSha1) === null ? 0 : path.size,
173
+ bytesVerified: 0,
174
+ aborted: false
175
+ };
176
+ } catch (err) {
177
+ if (options.signal?.aborted || isAbortError(err)) return {
178
+ path,
179
+ bytesHashed: 0,
180
+ bytesVerified: 0,
181
+ aborted: true
182
+ };
183
+ const error = toError(err);
184
+ return {
185
+ path,
186
+ bytesHashed: 0,
187
+ event: {
188
+ type: "error",
189
+ path: path.relativePath,
190
+ size: 0,
191
+ message: `failed to hash local file for sha1 comparison: ${formatHashError(error)}`
192
+ },
193
+ error,
194
+ bytesVerified: 0,
195
+ aborted: false
196
+ };
197
+ }
198
+ }
199
+ async function verifyB2Sha1Bytes(pair, options, bytesHashed) {
200
+ const [source, dest] = pair;
201
+ /* v8 ignore next -- callers only verify B2 bytes for paired compare results */
202
+ if (source === null || dest === null) return readyComparePair(pair, bytesHashed);
203
+ const sourceResult = await prepareUntrustedB2PathSha1(source, options);
204
+ const sourceBytesVerified = sourceResult.bytesVerified;
205
+ if (sourceResult.aborted) return aborted(pair);
206
+ if (sourceResult.event) return skipped([sourceResult.path, dest], sourceResult.event, sourceResult.error, bytesHashed, sourceBytesVerified);
207
+ const destResult = await prepareUntrustedB2PathSha1(dest, options);
208
+ const bytesVerified = sourceBytesVerified + destResult.bytesVerified;
209
+ /* v8 ignore next -- destination abort mirrors the covered source abort path */
210
+ if (destResult.aborted) return aborted([sourceResult.path, destResult.path]);
211
+ if (destResult.event) return skipped([sourceResult.path, destResult.path], destResult.event, destResult.error, bytesHashed, bytesVerified);
212
+ return readyComparePair([sourceResult.path, destResult.path], bytesHashed, bytesVerified);
213
+ }
214
+ async function prepareUntrustedB2PathSha1(path, options) {
215
+ if (!isB2SyncPath(path) || comparableSha1(path).kind !== "untrusted") return {
216
+ path,
217
+ bytesHashed: 0,
218
+ bytesVerified: 0,
219
+ aborted: false
220
+ };
221
+ return prepareB2PathSha1(path, options);
222
+ }
223
+ async function prepareB2PathSha1(path, options) {
224
+ /* v8 ignore next -- pre-aborted B2 reads are covered at pair level */
225
+ if (options.signal?.aborted) return {
226
+ path,
227
+ bytesHashed: 0,
228
+ bytesVerified: 0,
229
+ aborted: true
230
+ };
231
+ try {
232
+ const result = await options.readB2Sha1(path, options.signal);
233
+ const contentSha1 = typeof result === "object" && result !== null ? result.contentSha1 : result;
234
+ const bytesVerified = typeof result === "object" && result !== null ? Math.max(0, result.bytesRead) : 0;
235
+ const preparedPath = {
236
+ ...path,
237
+ contentSha1,
238
+ contentSha1State: syncSha1StateOf({ contentSha1 })
239
+ };
240
+ if (contentSha1 === null) return {
241
+ path: preparedPath,
242
+ bytesHashed: 0,
243
+ bytesVerified,
244
+ event: unavailableSha1PathEvent(path),
245
+ aborted: false
246
+ };
247
+ return {
248
+ path: preparedPath,
249
+ bytesHashed: 0,
250
+ bytesVerified,
251
+ aborted: false
252
+ };
253
+ } catch (err) {
254
+ if (options.signal?.aborted || isAbortError(err)) return {
255
+ path,
256
+ bytesHashed: 0,
257
+ bytesVerified: 0,
258
+ aborted: true
259
+ };
260
+ const error = toError(err);
261
+ return {
262
+ path,
263
+ bytesHashed: 0,
264
+ bytesVerified: 0,
265
+ event: {
266
+ type: "skip",
267
+ path: path.relativePath,
268
+ size: 0,
269
+ message: `sha1 comparison skipped because B2 verification failed: ${formatHashError(error)}`
270
+ },
271
+ aborted: false
272
+ };
273
+ }
274
+ }
275
+ function comparableSha1(path) {
276
+ const state = syncSha1StateOf(path);
277
+ if (state.kind === "verified") return {
278
+ kind: "verified",
279
+ value: state.value
280
+ };
281
+ if (state.kind === "untrusted") return {
282
+ kind: "untrusted",
283
+ value: state.value
284
+ };
285
+ return { kind: "unavailable" };
286
+ }
287
+ function untrustedSha1CouldSuppressTransfer(source, dest) {
288
+ if (source.kind === "untrusted" && dest.kind === "verified") return source.value === dest.value;
289
+ if (dest.kind === "untrusted" && source.kind === "verified") return dest.value === source.value;
290
+ if (source.kind === "untrusted" && dest.kind === "untrusted") return source.value !== null && source.value === dest.value;
291
+ return false;
292
+ }
293
+ function withB2ContentSha1(path) {
294
+ if (!isB2SyncPath(path) || path.contentSha1 !== void 0 || path.contentSha1State !== void 0) return path;
295
+ const contentSha1 = selectB2ComparableSha1(path.selectedVersion);
296
+ return {
297
+ ...path,
298
+ contentSha1,
299
+ contentSha1State: syncSha1StateOf({ contentSha1 })
300
+ };
301
+ }
302
+ function hasUnavailableB2Sha1(pair) {
303
+ const [source, dest] = pair;
304
+ return source !== null && isB2SyncPath(source) && comparableSha1(source).kind === "unavailable" || dest !== null && isB2SyncPath(dest) && comparableSha1(dest).kind === "unavailable";
305
+ }
306
+ function hasUntrustedSha1(pair) {
307
+ const [source, dest] = pair;
308
+ return source !== null && comparableSha1(source).kind === "untrusted" || dest !== null && comparableSha1(dest).kind === "untrusted";
309
+ }
310
+ function hasVerifiableUntrustedSha1(pair) {
311
+ const [source, dest] = pair;
312
+ return source !== null && verifiableUntrustedSha1(source) || dest !== null && verifiableUntrustedSha1(dest);
313
+ }
314
+ function verifiableUntrustedSha1(path) {
315
+ const state = comparableSha1(path);
316
+ return state.kind === "untrusted" && state.value !== null;
317
+ }
318
+ function hasB2Path(pair) {
319
+ const [source, dest] = pair;
320
+ return source !== null && isB2SyncPath(source) || dest !== null && isB2SyncPath(dest);
321
+ }
322
+ function isB2SyncPath(path) {
323
+ return "selectedVersion" in path;
324
+ }
325
+ function isLocalSyncPath(path) {
326
+ return "absolutePath" in path;
327
+ }
328
+ /**
329
+ * Creates a successful no-op compare preparation result for a pair.
330
+ *
331
+ * @param pair - Source/destination pair from {@link zipFolders}.
332
+ * @param bytesHashed - Local file bytes read while preparing the pair.
333
+ * @param bytesVerified - B2 bytes read while verifying untrusted SHA-1 metadata.
334
+ *
335
+ * @returns A ready preparation result that allows action generation.
336
+ */
337
+ function readyComparePair(pair, bytesHashed = 0, bytesVerified = 0) {
338
+ return {
339
+ pair,
340
+ events: [],
341
+ errors: [],
342
+ bytesHashed,
343
+ bytesVerified,
344
+ skipActionGeneration: false,
345
+ aborted: false
346
+ };
347
+ }
348
+ function skipped(pair, event, error, bytesHashed = 0, bytesVerified = 0) {
349
+ return {
350
+ pair,
351
+ events: [event],
352
+ errors: error !== void 0 ? [error] : [],
353
+ bytesHashed,
354
+ bytesVerified,
355
+ skipActionGeneration: true,
356
+ aborted: false
357
+ };
358
+ }
359
+ function aborted(pair) {
360
+ return {
361
+ pair,
362
+ events: [],
363
+ errors: [],
364
+ bytesHashed: 0,
365
+ bytesVerified: 0,
366
+ skipActionGeneration: true,
367
+ aborted: true
368
+ };
369
+ }
370
+ function unavailableSha1Event(pair) {
371
+ return unavailableSha1PathEvent({ relativePath: (pair[0] ?? pair[1])?.relativePath ?? "" });
372
+ }
373
+ function unavailableSha1PathEvent(path) {
374
+ return {
375
+ type: "skip",
376
+ path: path.relativePath,
377
+ size: 0,
378
+ message: "sha1 comparison skipped because a verifiable SHA-1 is unavailable"
379
+ };
380
+ }
381
+ function normalizeConcurrency(value) {
382
+ if (value === void 0 || !Number.isFinite(value) || value < 1) return 1;
383
+ return Math.max(1, Math.floor(value));
384
+ }
385
+ //#endregion
386
+ export { assertSupportedCompareMode, filesAreDifferent, preparePairForCompare, preparePairsForCompare, readyComparePair };
387
+
388
+ //# sourceMappingURL=compare.js.map