@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
@@ -0,0 +1,217 @@
1
+ const require_regexp_safety = require("./regexp-safety.cjs");
2
+ const require_scan_events = require("./scan-events.cjs");
3
+ //#region src/sync/filters.ts
4
+ /**
5
+ * Tests whether a relative sync path is included by the configured include/exclude filters.
6
+ * Exclude filters win over include filters when both match the same path.
7
+ *
8
+ * @param relativePath - Folder-relative path using forward slashes.
9
+ * @param filters - Optional include and exclude filters.
10
+ *
11
+ * @returns True when the path should remain in the sync scan.
12
+ */
13
+ function pathPassesSyncFilters(relativePath, filters) {
14
+ require_regexp_safety.validateSyncFilters(filters);
15
+ const path = normalizePath(relativePath);
16
+ if (normalizedPathSkippedByRegExpInputLimit(path, filters)) return false;
17
+ const include = filters?.include ?? [];
18
+ const exclude = filters?.exclude ?? [];
19
+ if (include.length > 0) {
20
+ if (!include.some((pattern) => matchesPattern(path, pattern))) return false;
21
+ }
22
+ return !exclude.some((pattern) => matchesPattern(path, pattern));
23
+ }
24
+ /**
25
+ * Tests whether a directory may contain paths admitted by the configured filters.
26
+ *
27
+ * @param relativePath - Folder-relative directory path using forward slashes.
28
+ * @param filters - Optional include and exclude filters.
29
+ *
30
+ * @returns True when the scanner should descend into the directory.
31
+ */
32
+ function directoryMayContainSyncPaths(relativePath, filters) {
33
+ require_regexp_safety.validateSyncFilters(filters);
34
+ const path = normalizePath(relativePath);
35
+ if (path === "") return true;
36
+ if ((filters?.exclude ?? []).some((pattern) => stringPatternExcludesAllDescendants(path, pattern))) return false;
37
+ const include = filters?.include ?? [];
38
+ return include.length === 0 || include.some((pattern) => patternMayMatchDescendant(path, pattern));
39
+ }
40
+ /**
41
+ * Returns the safe literal prefix that B2 listing can use for include filters.
42
+ * Exclude filters are not considered because they cannot narrow a B2 prefix.
43
+ *
44
+ * @param filters - Optional include and exclude filters.
45
+ *
46
+ * @returns A folder-relative literal prefix, or an empty string when no safe narrowing exists.
47
+ */
48
+ function literalPrefixForSyncFilters(filters) {
49
+ require_regexp_safety.validateSyncFilters(filters);
50
+ const include = filters?.include ?? [];
51
+ let commonPrefix;
52
+ for (const pattern of include) {
53
+ if (patternIsRegExp(pattern)) return "";
54
+ const glob = normalizePath(pattern);
55
+ if (!glob.includes("/")) return "";
56
+ const prefix = literalPrefixForGlob(glob);
57
+ if (prefix === "") return "";
58
+ commonPrefix = commonPrefix === void 0 ? prefix : commonLiteralPrefix(commonPrefix, prefix);
59
+ }
60
+ return commonPrefix ?? "";
61
+ }
62
+ /**
63
+ * Filters an async iterable of sync paths while preserving the original item type.
64
+ *
65
+ * @typeParam T - Concrete sync path shape yielded by the source folder.
66
+ *
67
+ * @param paths - Async iterable of folder scan results.
68
+ * @param filters - Optional include and exclude filters.
69
+ *
70
+ * @returns A filtered async generator of sync paths.
71
+ */
72
+ async function* filterSyncPaths(paths, filters) {
73
+ for await (const path of paths) if (pathPassesSyncFilters(path.relativePath, filters)) yield path;
74
+ else if (pathSkippedByRegExpInputLimit(path.relativePath, filters)) require_scan_events.emitScannerSkip(filters, require_scan_events.regexpInputTooLongSkip(normalizePath(path.relativePath)));
75
+ }
76
+ /**
77
+ * Tests whether a path is skipped because RegExp filters are configured and the normalized path
78
+ * exceeds the SDK RegExp input guard.
79
+ *
80
+ * @param relativePath - Folder-relative path using forward slashes.
81
+ * @param filters - Optional include and exclude filters.
82
+ *
83
+ * @returns True when any RegExp filter is present and the path is too long to evaluate.
84
+ */
85
+ function pathSkippedByRegExpInputLimit(relativePath, filters) {
86
+ require_regexp_safety.validateSyncFilters(filters);
87
+ return normalizedPathSkippedByRegExpInputLimit(normalizePath(relativePath), filters);
88
+ }
89
+ function normalizedPathSkippedByRegExpInputLimit(normalizedPath, filters) {
90
+ if (!require_regexp_safety.pathExceedsSafeRegExpInput(normalizedPath) || !filtersContainRegExp(filters)) return false;
91
+ return true;
92
+ }
93
+ function matchesPattern(relativePath, pattern) {
94
+ if (patternIsRegExp(pattern)) return require_regexp_safety.regexpMatchesSyncPath(relativePath, pattern);
95
+ const glob = normalizePath(pattern);
96
+ if (glob === "") return relativePath === "";
97
+ const segments = splitPath(relativePath);
98
+ if (!glob.includes("/")) return segments.some((segment) => matchSegmentGlob(segment, glob));
99
+ return matchPathGlob(segments, splitPath(glob));
100
+ }
101
+ function stringPatternExcludesAllDescendants(relativePath, pattern) {
102
+ if (patternIsRegExp(pattern)) return false;
103
+ const glob = normalizePath(pattern);
104
+ if (glob === "") return false;
105
+ if (!glob.includes("/")) return matchesPattern(relativePath, pattern);
106
+ const globSegments = splitPath(glob);
107
+ return globSegments.at(-1) === "**" && matchPathGlob(splitPath(relativePath), globSegments);
108
+ }
109
+ function filtersContainRegExp(filters) {
110
+ return filters?.include?.some(patternIsRegExp) === true || filters?.exclude?.some(patternIsRegExp) === true;
111
+ }
112
+ function patternMayMatchDescendant(relativePath, pattern) {
113
+ if (patternIsRegExp(pattern)) return true;
114
+ const glob = normalizePath(pattern);
115
+ if (glob === "" || !glob.includes("/")) return true;
116
+ const pathSegments = splitPath(relativePath);
117
+ const globSegments = splitPath(glob);
118
+ const length = Math.min(pathSegments.length, globSegments.length);
119
+ for (let i = 0; i < length; i++) {
120
+ const globSegment = globSegments[i];
121
+ if (globSegment === "**" || globSegment === void 0 || hasGlobWildcard(globSegment)) return true;
122
+ if (globSegment !== pathSegments[i]) return false;
123
+ }
124
+ return true;
125
+ }
126
+ function matchPathGlob(pathSegments, globSegments) {
127
+ let reachable = new Array(pathSegments.length + 1).fill(false);
128
+ reachable[0] = true;
129
+ for (const globSegment of globSegments) {
130
+ const next = new Array(pathSegments.length + 1).fill(false);
131
+ if (globSegment === "**") {
132
+ let canReach = false;
133
+ for (let i = 0; i <= pathSegments.length; i++) {
134
+ canReach = canReach || reachable[i] === true;
135
+ next[i] = canReach;
136
+ }
137
+ } else for (let i = 0; i < pathSegments.length; i++) if (reachable[i] === true && matchSegmentGlob(pathSegments[i] ?? "", globSegment)) next[i + 1] = true;
138
+ reachable = next;
139
+ }
140
+ return reachable[pathSegments.length] === true;
141
+ }
142
+ function matchSegmentGlob(segment, glob) {
143
+ let segmentIndex = 0;
144
+ let globIndex = 0;
145
+ let starIndex = -1;
146
+ let starMatchIndex = 0;
147
+ while (segmentIndex < segment.length) {
148
+ const globChar = glob[globIndex];
149
+ if (globChar === "?" || globChar === segment[segmentIndex]) {
150
+ globIndex++;
151
+ segmentIndex++;
152
+ } else if (globChar === "*") {
153
+ while (glob[globIndex + 1] === "*") globIndex++;
154
+ starIndex = globIndex;
155
+ starMatchIndex = segmentIndex;
156
+ globIndex++;
157
+ } else if (starIndex !== -1) {
158
+ globIndex = starIndex + 1;
159
+ starMatchIndex++;
160
+ segmentIndex = starMatchIndex;
161
+ } else return false;
162
+ }
163
+ while (glob[globIndex] === "*") globIndex++;
164
+ return globIndex === glob.length;
165
+ }
166
+ function literalPrefixForGlob(glob) {
167
+ const segments = splitPath(glob);
168
+ const literalSegments = [];
169
+ let firstWildcardIndex = segments.length;
170
+ for (const [index, segment] of segments.entries()) {
171
+ if (segment === "**" || hasGlobWildcard(segment)) {
172
+ firstWildcardIndex = index;
173
+ break;
174
+ }
175
+ literalSegments.push(segment);
176
+ }
177
+ if (literalSegments.length === 0) return "";
178
+ const prefix = literalSegments.join("/");
179
+ const wildcardTail = segments.slice(firstWildcardIndex);
180
+ if (wildcardTail.length > 0 && wildcardTail.every((segment) => segment === "**")) return prefix;
181
+ return literalSegments.length < segments.length ? `${prefix}/` : prefix;
182
+ }
183
+ function commonLiteralPrefix(a, b) {
184
+ let end = 0;
185
+ const max = Math.min(a.length, b.length);
186
+ while (end < max && a[end] === b[end]) end++;
187
+ return trimTrailingHighSurrogate(a.slice(0, end));
188
+ }
189
+ function trimTrailingHighSurrogate(value) {
190
+ const lastCodeUnit = value.charCodeAt(value.length - 1);
191
+ return lastCodeUnit >= 55296 && lastCodeUnit <= 56319 ? value.slice(0, -1) : value;
192
+ }
193
+ function hasGlobWildcard(glob) {
194
+ return glob.includes("*") || glob.includes("?");
195
+ }
196
+ function patternIsRegExp(pattern) {
197
+ return typeof pattern !== "string";
198
+ }
199
+ function splitPath(path) {
200
+ if (path === "") return [];
201
+ return path.split("/").filter((segment) => segment !== "");
202
+ }
203
+ function normalizePath(path) {
204
+ let normalized = path.split("\\").join("/");
205
+ while (normalized.startsWith("./")) normalized = normalized.slice(2);
206
+ while (normalized.startsWith("/")) normalized = normalized.slice(1);
207
+ while (normalized.endsWith("/") && normalized.length > 1) normalized = normalized.slice(0, -1);
208
+ return normalized;
209
+ }
210
+ //#endregion
211
+ exports.directoryMayContainSyncPaths = directoryMayContainSyncPaths;
212
+ exports.filterSyncPaths = filterSyncPaths;
213
+ exports.literalPrefixForSyncFilters = literalPrefixForSyncFilters;
214
+ exports.pathPassesSyncFilters = pathPassesSyncFilters;
215
+ exports.pathSkippedByRegExpInputLimit = pathSkippedByRegExpInputLimit;
216
+
217
+ //# sourceMappingURL=filters.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.cjs","names":[],"sources":["../../src/sync/filters.ts"],"sourcesContent":["import {\n pathExceedsSafeRegExpInput,\n regexpMatchesSyncPath,\n validateSyncFilters,\n} from './regexp-safety.ts'\nimport { emitScannerSkip, regexpInputTooLongSkip } from './scan-events.ts'\nimport type { SyncFilterOptions, SyncFilterPattern, SyncPath, SyncScanOptions } from './types.ts'\n\n/**\n * Tests whether a relative sync path is included by the configured include/exclude filters.\n * Exclude filters win over include filters when both match the same path.\n *\n * @param relativePath - Folder-relative path using forward slashes.\n * @param filters - Optional include and exclude filters.\n *\n * @returns True when the path should remain in the sync scan.\n */\nexport function pathPassesSyncFilters(\n relativePath: string,\n filters: SyncFilterOptions | undefined,\n): boolean {\n validateSyncFilters(filters)\n const path = normalizePath(relativePath)\n\n if (normalizedPathSkippedByRegExpInputLimit(path, filters)) return false\n\n const include = filters?.include ?? []\n const exclude = filters?.exclude ?? []\n\n if (include.length > 0) {\n if (!include.some((pattern) => matchesPattern(path, pattern))) return false\n }\n\n return !exclude.some((pattern) => matchesPattern(path, pattern))\n}\n\n/**\n * Tests whether a directory may contain paths admitted by the configured filters.\n *\n * @param relativePath - Folder-relative directory path using forward slashes.\n * @param filters - Optional include and exclude filters.\n *\n * @returns True when the scanner should descend into the directory.\n */\nexport function directoryMayContainSyncPaths(\n relativePath: string,\n filters: SyncFilterOptions | undefined,\n): boolean {\n validateSyncFilters(filters)\n const path = normalizePath(relativePath)\n if (path === '') return true\n\n const exclude = filters?.exclude ?? []\n if (exclude.some((pattern) => stringPatternExcludesAllDescendants(path, pattern))) {\n return false\n }\n\n const include = filters?.include ?? []\n return include.length === 0 || include.some((pattern) => patternMayMatchDescendant(path, pattern))\n}\n\n/**\n * Returns the safe literal prefix that B2 listing can use for include filters.\n * Exclude filters are not considered because they cannot narrow a B2 prefix.\n *\n * @param filters - Optional include and exclude filters.\n *\n * @returns A folder-relative literal prefix, or an empty string when no safe narrowing exists.\n */\nexport function literalPrefixForSyncFilters(filters: SyncFilterOptions | undefined): string {\n validateSyncFilters(filters)\n const include = filters?.include ?? []\n let commonPrefix: string | undefined\n\n for (const pattern of include) {\n if (patternIsRegExp(pattern)) return ''\n\n const glob = normalizePath(pattern)\n if (!glob.includes('/')) return ''\n\n const prefix = literalPrefixForGlob(glob)\n if (prefix === '') return ''\n commonPrefix = commonPrefix === undefined ? prefix : commonLiteralPrefix(commonPrefix, prefix)\n }\n\n return commonPrefix ?? ''\n}\n\n/**\n * Filters an async iterable of sync paths while preserving the original item type.\n *\n * @typeParam T - Concrete sync path shape yielded by the source folder.\n *\n * @param paths - Async iterable of folder scan results.\n * @param filters - Optional include and exclude filters.\n *\n * @returns A filtered async generator of sync paths.\n */\nexport async function* filterSyncPaths<T extends SyncPath>(\n paths: AsyncIterable<T>,\n filters: SyncScanOptions | undefined,\n): AsyncGenerator<T> {\n for await (const path of paths) {\n if (pathPassesSyncFilters(path.relativePath, filters)) {\n yield path\n } else if (pathSkippedByRegExpInputLimit(path.relativePath, filters)) {\n emitScannerSkip(filters, regexpInputTooLongSkip(normalizePath(path.relativePath)))\n }\n }\n}\n\n/**\n * Tests whether a path is skipped because RegExp filters are configured and the normalized path\n * exceeds the SDK RegExp input guard.\n *\n * @param relativePath - Folder-relative path using forward slashes.\n * @param filters - Optional include and exclude filters.\n *\n * @returns True when any RegExp filter is present and the path is too long to evaluate.\n */\nexport function pathSkippedByRegExpInputLimit(\n relativePath: string,\n filters: SyncFilterOptions | undefined,\n): boolean {\n validateSyncFilters(filters)\n return normalizedPathSkippedByRegExpInputLimit(normalizePath(relativePath), filters)\n}\n\nfunction normalizedPathSkippedByRegExpInputLimit(\n normalizedPath: string,\n filters: SyncFilterOptions | undefined,\n): boolean {\n if (!pathExceedsSafeRegExpInput(normalizedPath) || !filtersContainRegExp(filters)) {\n return false\n }\n return true\n}\n\nfunction matchesPattern(relativePath: string, pattern: SyncFilterPattern): boolean {\n if (patternIsRegExp(pattern)) {\n return regexpMatchesSyncPath(relativePath, pattern)\n }\n\n const glob = normalizePath(pattern)\n if (glob === '') return relativePath === ''\n\n const segments = splitPath(relativePath)\n if (!glob.includes('/')) {\n return segments.some((segment) => matchSegmentGlob(segment, glob))\n }\n\n return matchPathGlob(segments, splitPath(glob))\n}\n\nfunction stringPatternExcludesAllDescendants(\n relativePath: string,\n pattern: SyncFilterPattern,\n): boolean {\n if (patternIsRegExp(pattern)) return false\n\n const glob = normalizePath(pattern)\n if (glob === '') return false\n if (!glob.includes('/')) return matchesPattern(relativePath, pattern)\n\n const globSegments = splitPath(glob)\n return globSegments.at(-1) === '**' && matchPathGlob(splitPath(relativePath), globSegments)\n}\n\nfunction filtersContainRegExp(filters: SyncFilterOptions | undefined): boolean {\n return (\n filters?.include?.some(patternIsRegExp) === true ||\n filters?.exclude?.some(patternIsRegExp) === true\n )\n}\n\nfunction patternMayMatchDescendant(relativePath: string, pattern: SyncFilterPattern): boolean {\n if (patternIsRegExp(pattern)) return true\n\n const glob = normalizePath(pattern)\n if (glob === '' || !glob.includes('/')) return true\n\n const pathSegments = splitPath(relativePath)\n const globSegments = splitPath(glob)\n const length = Math.min(pathSegments.length, globSegments.length)\n\n for (let i = 0; i < length; i++) {\n const globSegment = globSegments[i]\n if (globSegment === '**' || globSegment === undefined || hasGlobWildcard(globSegment)) {\n return true\n }\n if (globSegment !== pathSegments[i]) {\n return false\n }\n }\n\n return true\n}\n\nfunction matchPathGlob(pathSegments: readonly string[], globSegments: readonly string[]): boolean {\n let reachable = new Array<boolean>(pathSegments.length + 1).fill(false)\n reachable[0] = true\n\n for (const globSegment of globSegments) {\n const next = new Array<boolean>(pathSegments.length + 1).fill(false)\n\n if (globSegment === '**') {\n // A whole-segment `**` consumes zero or more complete path segments.\n let canReach = false\n for (let i = 0; i <= pathSegments.length; i++) {\n canReach = canReach || reachable[i] === true\n next[i] = canReach\n }\n } else {\n for (let i = 0; i < pathSegments.length; i++) {\n if (reachable[i] === true && matchSegmentGlob(pathSegments[i] ?? '', globSegment)) {\n next[i + 1] = true\n }\n }\n }\n\n reachable = next\n }\n\n return reachable[pathSegments.length] === true\n}\n\nfunction matchSegmentGlob(segment: string, glob: string): boolean {\n let segmentIndex = 0\n let globIndex = 0\n let starIndex = -1\n let starMatchIndex = 0\n\n while (segmentIndex < segment.length) {\n const globChar = glob[globIndex]\n if (globChar === '?' || globChar === segment[segmentIndex]) {\n globIndex++\n segmentIndex++\n } else if (globChar === '*') {\n // Repeated `*` in one segment is still one segment-local wildcard.\n while (glob[globIndex + 1] === '*') globIndex++\n starIndex = globIndex\n starMatchIndex = segmentIndex\n globIndex++\n } else if (starIndex !== -1) {\n globIndex = starIndex + 1\n starMatchIndex++\n segmentIndex = starMatchIndex\n } else {\n return false\n }\n }\n\n while (glob[globIndex] === '*') globIndex++\n return globIndex === glob.length\n}\n\nfunction literalPrefixForGlob(glob: string): string {\n const segments = splitPath(glob)\n const literalSegments: string[] = []\n let firstWildcardIndex = segments.length\n\n for (const [index, segment] of segments.entries()) {\n if (segment === '**' || hasGlobWildcard(segment)) {\n firstWildcardIndex = index\n break\n }\n literalSegments.push(segment)\n }\n\n if (literalSegments.length === 0) return ''\n const prefix = literalSegments.join('/')\n const wildcardTail = segments.slice(firstWildcardIndex)\n const tailMayMatchBarePrefix =\n wildcardTail.length > 0 && wildcardTail.every((segment) => segment === '**')\n if (tailMayMatchBarePrefix) return prefix\n return literalSegments.length < segments.length ? `${prefix}/` : prefix\n}\n\nfunction commonLiteralPrefix(a: string, b: string): string {\n let end = 0\n const max = Math.min(a.length, b.length)\n while (end < max && a[end] === b[end]) end++\n return trimTrailingHighSurrogate(a.slice(0, end))\n}\n\nfunction trimTrailingHighSurrogate(value: string): string {\n const lastCodeUnit = value.charCodeAt(value.length - 1)\n return lastCodeUnit >= 0xd800 && lastCodeUnit <= 0xdbff ? value.slice(0, -1) : value\n}\n\nfunction hasGlobWildcard(glob: string): boolean {\n return glob.includes('*') || glob.includes('?')\n}\n\nfunction patternIsRegExp(pattern: SyncFilterPattern): pattern is RegExp {\n return typeof pattern !== 'string'\n}\n\nfunction splitPath(path: string): string[] {\n if (path === '') return []\n return path.split('/').filter((segment) => segment !== '')\n}\n\nfunction normalizePath(path: string): string {\n let normalized = path.split('\\\\').join('/')\n while (normalized.startsWith('./')) normalized = normalized.slice(2)\n while (normalized.startsWith('/')) normalized = normalized.slice(1)\n while (normalized.endsWith('/') && normalized.length > 1) {\n normalized = normalized.slice(0, -1)\n }\n return normalized\n}\n"],"mappings":";;;;;;;;;;;;AAiBA,SAAgB,sBACd,cACA,SACS;CACT,sBAAA,oBAAoB,OAAO;CAC3B,MAAM,OAAO,cAAc,YAAY;CAEvC,IAAI,wCAAwC,MAAM,OAAO,GAAG,OAAO;CAEnE,MAAM,UAAU,SAAS,WAAW,CAAC;CACrC,MAAM,UAAU,SAAS,WAAW,CAAC;CAErC,IAAI,QAAQ,SAAS;MACf,CAAC,QAAQ,MAAM,YAAY,eAAe,MAAM,OAAO,CAAC,GAAG,OAAO;CAAA;CAGxE,OAAO,CAAC,QAAQ,MAAM,YAAY,eAAe,MAAM,OAAO,CAAC;AACjE;;;;;;;;;AAUA,SAAgB,6BACd,cACA,SACS;CACT,sBAAA,oBAAoB,OAAO;CAC3B,MAAM,OAAO,cAAc,YAAY;CACvC,IAAI,SAAS,IAAI,OAAO;CAGxB,KADgB,SAAS,WAAW,CAAC,EAAA,CACzB,MAAM,YAAY,oCAAoC,MAAM,OAAO,CAAC,GAC9E,OAAO;CAGT,MAAM,UAAU,SAAS,WAAW,CAAC;CACrC,OAAO,QAAQ,WAAW,KAAK,QAAQ,MAAM,YAAY,0BAA0B,MAAM,OAAO,CAAC;AACnG;;;;;;;;;AAUA,SAAgB,4BAA4B,SAAgD;CAC1F,sBAAA,oBAAoB,OAAO;CAC3B,MAAM,UAAU,SAAS,WAAW,CAAC;CACrC,IAAI;CAEJ,KAAK,MAAM,WAAW,SAAS;EAC7B,IAAI,gBAAgB,OAAO,GAAG,OAAO;EAErC,MAAM,OAAO,cAAc,OAAO;EAClC,IAAI,CAAC,KAAK,SAAS,GAAG,GAAG,OAAO;EAEhC,MAAM,SAAS,qBAAqB,IAAI;EACxC,IAAI,WAAW,IAAI,OAAO;EAC1B,eAAe,iBAAiB,KAAA,IAAY,SAAS,oBAAoB,cAAc,MAAM;CAC/F;CAEA,OAAO,gBAAgB;AACzB;;;;;;;;;;;AAYA,gBAAuB,gBACrB,OACA,SACmB;CACnB,WAAW,MAAM,QAAQ,OACvB,IAAI,sBAAsB,KAAK,cAAc,OAAO,GAClD,MAAM;MACD,IAAI,8BAA8B,KAAK,cAAc,OAAO,GACjE,oBAAA,gBAAgB,SAAS,oBAAA,uBAAuB,cAAc,KAAK,YAAY,CAAC,CAAC;AAGvF;;;;;;;;;;AAWA,SAAgB,8BACd,cACA,SACS;CACT,sBAAA,oBAAoB,OAAO;CAC3B,OAAO,wCAAwC,cAAc,YAAY,GAAG,OAAO;AACrF;AAEA,SAAS,wCACP,gBACA,SACS;CACT,IAAI,CAAC,sBAAA,2BAA2B,cAAc,KAAK,CAAC,qBAAqB,OAAO,GAC9E,OAAO;CAET,OAAO;AACT;AAEA,SAAS,eAAe,cAAsB,SAAqC;CACjF,IAAI,gBAAgB,OAAO,GACzB,OAAO,sBAAA,sBAAsB,cAAc,OAAO;CAGpD,MAAM,OAAO,cAAc,OAAO;CAClC,IAAI,SAAS,IAAI,OAAO,iBAAiB;CAEzC,MAAM,WAAW,UAAU,YAAY;CACvC,IAAI,CAAC,KAAK,SAAS,GAAG,GACpB,OAAO,SAAS,MAAM,YAAY,iBAAiB,SAAS,IAAI,CAAC;CAGnE,OAAO,cAAc,UAAU,UAAU,IAAI,CAAC;AAChD;AAEA,SAAS,oCACP,cACA,SACS;CACT,IAAI,gBAAgB,OAAO,GAAG,OAAO;CAErC,MAAM,OAAO,cAAc,OAAO;CAClC,IAAI,SAAS,IAAI,OAAO;CACxB,IAAI,CAAC,KAAK,SAAS,GAAG,GAAG,OAAO,eAAe,cAAc,OAAO;CAEpE,MAAM,eAAe,UAAU,IAAI;CACnC,OAAO,aAAa,GAAG,EAAE,MAAM,QAAQ,cAAc,UAAU,YAAY,GAAG,YAAY;AAC5F;AAEA,SAAS,qBAAqB,SAAiD;CAC7E,OACE,SAAS,SAAS,KAAK,eAAe,MAAM,QAC5C,SAAS,SAAS,KAAK,eAAe,MAAM;AAEhD;AAEA,SAAS,0BAA0B,cAAsB,SAAqC;CAC5F,IAAI,gBAAgB,OAAO,GAAG,OAAO;CAErC,MAAM,OAAO,cAAc,OAAO;CAClC,IAAI,SAAS,MAAM,CAAC,KAAK,SAAS,GAAG,GAAG,OAAO;CAE/C,MAAM,eAAe,UAAU,YAAY;CAC3C,MAAM,eAAe,UAAU,IAAI;CACnC,MAAM,SAAS,KAAK,IAAI,aAAa,QAAQ,aAAa,MAAM;CAEhE,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;EAC/B,MAAM,cAAc,aAAa;EACjC,IAAI,gBAAgB,QAAQ,gBAAgB,KAAA,KAAa,gBAAgB,WAAW,GAClF,OAAO;EAET,IAAI,gBAAgB,aAAa,IAC/B,OAAO;CAEX;CAEA,OAAO;AACT;AAEA,SAAS,cAAc,cAAiC,cAA0C;CAChG,IAAI,YAAY,IAAI,MAAe,aAAa,SAAS,CAAC,CAAC,CAAC,KAAK,KAAK;CACtE,UAAU,KAAK;CAEf,KAAK,MAAM,eAAe,cAAc;EACtC,MAAM,OAAO,IAAI,MAAe,aAAa,SAAS,CAAC,CAAC,CAAC,KAAK,KAAK;EAEnE,IAAI,gBAAgB,MAAM;GAExB,IAAI,WAAW;GACf,KAAK,IAAI,IAAI,GAAG,KAAK,aAAa,QAAQ,KAAK;IAC7C,WAAW,YAAY,UAAU,OAAO;IACxC,KAAK,KAAK;GACZ;EACF,OACE,KAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,KACvC,IAAI,UAAU,OAAO,QAAQ,iBAAiB,aAAa,MAAM,IAAI,WAAW,GAC9E,KAAK,IAAI,KAAK;EAKpB,YAAY;CACd;CAEA,OAAO,UAAU,aAAa,YAAY;AAC5C;AAEA,SAAS,iBAAiB,SAAiB,MAAuB;CAChE,IAAI,eAAe;CACnB,IAAI,YAAY;CAChB,IAAI,YAAY;CAChB,IAAI,iBAAiB;CAErB,OAAO,eAAe,QAAQ,QAAQ;EACpC,MAAM,WAAW,KAAK;EACtB,IAAI,aAAa,OAAO,aAAa,QAAQ,eAAe;GAC1D;GACA;EACF,OAAO,IAAI,aAAa,KAAK;GAE3B,OAAO,KAAK,YAAY,OAAO,KAAK;GACpC,YAAY;GACZ,iBAAiB;GACjB;EACF,OAAO,IAAI,cAAc,IAAI;GAC3B,YAAY,YAAY;GACxB;GACA,eAAe;EACjB,OACE,OAAO;CAEX;CAEA,OAAO,KAAK,eAAe,KAAK;CAChC,OAAO,cAAc,KAAK;AAC5B;AAEA,SAAS,qBAAqB,MAAsB;CAClD,MAAM,WAAW,UAAU,IAAI;CAC/B,MAAM,kBAA4B,CAAC;CACnC,IAAI,qBAAqB,SAAS;CAElC,KAAK,MAAM,CAAC,OAAO,YAAY,SAAS,QAAQ,GAAG;EACjD,IAAI,YAAY,QAAQ,gBAAgB,OAAO,GAAG;GAChD,qBAAqB;GACrB;EACF;EACA,gBAAgB,KAAK,OAAO;CAC9B;CAEA,IAAI,gBAAgB,WAAW,GAAG,OAAO;CACzC,MAAM,SAAS,gBAAgB,KAAK,GAAG;CACvC,MAAM,eAAe,SAAS,MAAM,kBAAkB;CAGtD,IADE,aAAa,SAAS,KAAK,aAAa,OAAO,YAAY,YAAY,IAAI,GACjD,OAAO;CACnC,OAAO,gBAAgB,SAAS,SAAS,SAAS,GAAG,OAAO,KAAK;AACnE;AAEA,SAAS,oBAAoB,GAAW,GAAmB;CACzD,IAAI,MAAM;CACV,MAAM,MAAM,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM;CACvC,OAAO,MAAM,OAAO,EAAE,SAAS,EAAE,MAAM;CACvC,OAAO,0BAA0B,EAAE,MAAM,GAAG,GAAG,CAAC;AAClD;AAEA,SAAS,0BAA0B,OAAuB;CACxD,MAAM,eAAe,MAAM,WAAW,MAAM,SAAS,CAAC;CACtD,OAAO,gBAAgB,SAAU,gBAAgB,QAAS,MAAM,MAAM,GAAG,EAAE,IAAI;AACjF;AAEA,SAAS,gBAAgB,MAAuB;CAC9C,OAAO,KAAK,SAAS,GAAG,KAAK,KAAK,SAAS,GAAG;AAChD;AAEA,SAAS,gBAAgB,SAA+C;CACtE,OAAO,OAAO,YAAY;AAC5B;AAEA,SAAS,UAAU,MAAwB;CACzC,IAAI,SAAS,IAAI,OAAO,CAAC;CACzB,OAAO,KAAK,MAAM,GAAG,CAAC,CAAC,QAAQ,YAAY,YAAY,EAAE;AAC3D;AAEA,SAAS,cAAc,MAAsB;CAC3C,IAAI,aAAa,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,GAAG;CAC1C,OAAO,WAAW,WAAW,IAAI,GAAG,aAAa,WAAW,MAAM,CAAC;CACnE,OAAO,WAAW,WAAW,GAAG,GAAG,aAAa,WAAW,MAAM,CAAC;CAClE,OAAO,WAAW,SAAS,GAAG,KAAK,WAAW,SAAS,GACrD,aAAa,WAAW,MAAM,GAAG,EAAE;CAErC,OAAO;AACT"}
@@ -0,0 +1,51 @@
1
+ import { SyncFilterOptions, SyncPath, SyncScanOptions } from './types.js';
2
+ /**
3
+ * Tests whether a relative sync path is included by the configured include/exclude filters.
4
+ * Exclude filters win over include filters when both match the same path.
5
+ *
6
+ * @param relativePath - Folder-relative path using forward slashes.
7
+ * @param filters - Optional include and exclude filters.
8
+ *
9
+ * @returns True when the path should remain in the sync scan.
10
+ */
11
+ export declare function pathPassesSyncFilters(relativePath: string, filters: SyncFilterOptions | undefined): boolean;
12
+ /**
13
+ * Tests whether a directory may contain paths admitted by the configured filters.
14
+ *
15
+ * @param relativePath - Folder-relative directory path using forward slashes.
16
+ * @param filters - Optional include and exclude filters.
17
+ *
18
+ * @returns True when the scanner should descend into the directory.
19
+ */
20
+ export declare function directoryMayContainSyncPaths(relativePath: string, filters: SyncFilterOptions | undefined): boolean;
21
+ /**
22
+ * Returns the safe literal prefix that B2 listing can use for include filters.
23
+ * Exclude filters are not considered because they cannot narrow a B2 prefix.
24
+ *
25
+ * @param filters - Optional include and exclude filters.
26
+ *
27
+ * @returns A folder-relative literal prefix, or an empty string when no safe narrowing exists.
28
+ */
29
+ export declare function literalPrefixForSyncFilters(filters: SyncFilterOptions | undefined): string;
30
+ /**
31
+ * Filters an async iterable of sync paths while preserving the original item type.
32
+ *
33
+ * @typeParam T - Concrete sync path shape yielded by the source folder.
34
+ *
35
+ * @param paths - Async iterable of folder scan results.
36
+ * @param filters - Optional include and exclude filters.
37
+ *
38
+ * @returns A filtered async generator of sync paths.
39
+ */
40
+ export declare function filterSyncPaths<T extends SyncPath>(paths: AsyncIterable<T>, filters: SyncScanOptions | undefined): AsyncGenerator<T>;
41
+ /**
42
+ * Tests whether a path is skipped because RegExp filters are configured and the normalized path
43
+ * exceeds the SDK RegExp input guard.
44
+ *
45
+ * @param relativePath - Folder-relative path using forward slashes.
46
+ * @param filters - Optional include and exclude filters.
47
+ *
48
+ * @returns True when any RegExp filter is present and the path is too long to evaluate.
49
+ */
50
+ export declare function pathSkippedByRegExpInputLimit(relativePath: string, filters: SyncFilterOptions | undefined): boolean;
51
+ //# sourceMappingURL=filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../src/sync/filters.js"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAqB,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjG;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,iBAAiB,GAAG,SAAS,GACrC,OAAO,CAcT;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,iBAAiB,GAAG,SAAS,GACrC,OAAO,CAYT;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,GAAG,MAAM,CAiB1F;AAED;;;;;;;;;GASG;AACH,wBAAuB,eAAe,CAAC,CAAC,SAAS,QAAQ,EACvD,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EACvB,OAAO,EAAE,eAAe,GAAG,SAAS,GACnC,cAAc,CAAC,CAAC,CAAC,CAQnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAC3C,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,iBAAiB,GAAG,SAAS,GACrC,OAAO,CAGT"}
@@ -0,0 +1,51 @@
1
+ import { SyncFilterOptions, SyncPath, SyncScanOptions } from './types.js';
2
+ /**
3
+ * Tests whether a relative sync path is included by the configured include/exclude filters.
4
+ * Exclude filters win over include filters when both match the same path.
5
+ *
6
+ * @param relativePath - Folder-relative path using forward slashes.
7
+ * @param filters - Optional include and exclude filters.
8
+ *
9
+ * @returns True when the path should remain in the sync scan.
10
+ */
11
+ export declare function pathPassesSyncFilters(relativePath: string, filters: SyncFilterOptions | undefined): boolean;
12
+ /**
13
+ * Tests whether a directory may contain paths admitted by the configured filters.
14
+ *
15
+ * @param relativePath - Folder-relative directory path using forward slashes.
16
+ * @param filters - Optional include and exclude filters.
17
+ *
18
+ * @returns True when the scanner should descend into the directory.
19
+ */
20
+ export declare function directoryMayContainSyncPaths(relativePath: string, filters: SyncFilterOptions | undefined): boolean;
21
+ /**
22
+ * Returns the safe literal prefix that B2 listing can use for include filters.
23
+ * Exclude filters are not considered because they cannot narrow a B2 prefix.
24
+ *
25
+ * @param filters - Optional include and exclude filters.
26
+ *
27
+ * @returns A folder-relative literal prefix, or an empty string when no safe narrowing exists.
28
+ */
29
+ export declare function literalPrefixForSyncFilters(filters: SyncFilterOptions | undefined): string;
30
+ /**
31
+ * Filters an async iterable of sync paths while preserving the original item type.
32
+ *
33
+ * @typeParam T - Concrete sync path shape yielded by the source folder.
34
+ *
35
+ * @param paths - Async iterable of folder scan results.
36
+ * @param filters - Optional include and exclude filters.
37
+ *
38
+ * @returns A filtered async generator of sync paths.
39
+ */
40
+ export declare function filterSyncPaths<T extends SyncPath>(paths: AsyncIterable<T>, filters: SyncScanOptions | undefined): AsyncGenerator<T>;
41
+ /**
42
+ * Tests whether a path is skipped because RegExp filters are configured and the normalized path
43
+ * exceeds the SDK RegExp input guard.
44
+ *
45
+ * @param relativePath - Folder-relative path using forward slashes.
46
+ * @param filters - Optional include and exclude filters.
47
+ *
48
+ * @returns True when any RegExp filter is present and the path is too long to evaluate.
49
+ */
50
+ export declare function pathSkippedByRegExpInputLimit(relativePath: string, filters: SyncFilterOptions | undefined): boolean;
51
+ //# sourceMappingURL=filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../src/sync/filters.js"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAqB,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjG;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,iBAAiB,GAAG,SAAS,GACrC,OAAO,CAcT;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,iBAAiB,GAAG,SAAS,GACrC,OAAO,CAYT;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,GAAG,MAAM,CAiB1F;AAED;;;;;;;;;GASG;AACH,wBAAuB,eAAe,CAAC,CAAC,SAAS,QAAQ,EACvD,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EACvB,OAAO,EAAE,eAAe,GAAG,SAAS,GACnC,cAAc,CAAC,CAAC,CAAC,CAQnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAC3C,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,iBAAiB,GAAG,SAAS,GACrC,OAAO,CAGT"}
@@ -0,0 +1,213 @@
1
+ import { pathExceedsSafeRegExpInput, regexpMatchesSyncPath, validateSyncFilters } from "./regexp-safety.js";
2
+ import { emitScannerSkip, regexpInputTooLongSkip } from "./scan-events.js";
3
+ //#region src/sync/filters.ts
4
+ /**
5
+ * Tests whether a relative sync path is included by the configured include/exclude filters.
6
+ * Exclude filters win over include filters when both match the same path.
7
+ *
8
+ * @param relativePath - Folder-relative path using forward slashes.
9
+ * @param filters - Optional include and exclude filters.
10
+ *
11
+ * @returns True when the path should remain in the sync scan.
12
+ */
13
+ function pathPassesSyncFilters(relativePath, filters) {
14
+ validateSyncFilters(filters);
15
+ const path = normalizePath(relativePath);
16
+ if (normalizedPathSkippedByRegExpInputLimit(path, filters)) return false;
17
+ const include = filters?.include ?? [];
18
+ const exclude = filters?.exclude ?? [];
19
+ if (include.length > 0) {
20
+ if (!include.some((pattern) => matchesPattern(path, pattern))) return false;
21
+ }
22
+ return !exclude.some((pattern) => matchesPattern(path, pattern));
23
+ }
24
+ /**
25
+ * Tests whether a directory may contain paths admitted by the configured filters.
26
+ *
27
+ * @param relativePath - Folder-relative directory path using forward slashes.
28
+ * @param filters - Optional include and exclude filters.
29
+ *
30
+ * @returns True when the scanner should descend into the directory.
31
+ */
32
+ function directoryMayContainSyncPaths(relativePath, filters) {
33
+ validateSyncFilters(filters);
34
+ const path = normalizePath(relativePath);
35
+ if (path === "") return true;
36
+ if ((filters?.exclude ?? []).some((pattern) => stringPatternExcludesAllDescendants(path, pattern))) return false;
37
+ const include = filters?.include ?? [];
38
+ return include.length === 0 || include.some((pattern) => patternMayMatchDescendant(path, pattern));
39
+ }
40
+ /**
41
+ * Returns the safe literal prefix that B2 listing can use for include filters.
42
+ * Exclude filters are not considered because they cannot narrow a B2 prefix.
43
+ *
44
+ * @param filters - Optional include and exclude filters.
45
+ *
46
+ * @returns A folder-relative literal prefix, or an empty string when no safe narrowing exists.
47
+ */
48
+ function literalPrefixForSyncFilters(filters) {
49
+ validateSyncFilters(filters);
50
+ const include = filters?.include ?? [];
51
+ let commonPrefix;
52
+ for (const pattern of include) {
53
+ if (patternIsRegExp(pattern)) return "";
54
+ const glob = normalizePath(pattern);
55
+ if (!glob.includes("/")) return "";
56
+ const prefix = literalPrefixForGlob(glob);
57
+ if (prefix === "") return "";
58
+ commonPrefix = commonPrefix === void 0 ? prefix : commonLiteralPrefix(commonPrefix, prefix);
59
+ }
60
+ return commonPrefix ?? "";
61
+ }
62
+ /**
63
+ * Filters an async iterable of sync paths while preserving the original item type.
64
+ *
65
+ * @typeParam T - Concrete sync path shape yielded by the source folder.
66
+ *
67
+ * @param paths - Async iterable of folder scan results.
68
+ * @param filters - Optional include and exclude filters.
69
+ *
70
+ * @returns A filtered async generator of sync paths.
71
+ */
72
+ async function* filterSyncPaths(paths, filters) {
73
+ for await (const path of paths) if (pathPassesSyncFilters(path.relativePath, filters)) yield path;
74
+ else if (pathSkippedByRegExpInputLimit(path.relativePath, filters)) emitScannerSkip(filters, regexpInputTooLongSkip(normalizePath(path.relativePath)));
75
+ }
76
+ /**
77
+ * Tests whether a path is skipped because RegExp filters are configured and the normalized path
78
+ * exceeds the SDK RegExp input guard.
79
+ *
80
+ * @param relativePath - Folder-relative path using forward slashes.
81
+ * @param filters - Optional include and exclude filters.
82
+ *
83
+ * @returns True when any RegExp filter is present and the path is too long to evaluate.
84
+ */
85
+ function pathSkippedByRegExpInputLimit(relativePath, filters) {
86
+ validateSyncFilters(filters);
87
+ return normalizedPathSkippedByRegExpInputLimit(normalizePath(relativePath), filters);
88
+ }
89
+ function normalizedPathSkippedByRegExpInputLimit(normalizedPath, filters) {
90
+ if (!pathExceedsSafeRegExpInput(normalizedPath) || !filtersContainRegExp(filters)) return false;
91
+ return true;
92
+ }
93
+ function matchesPattern(relativePath, pattern) {
94
+ if (patternIsRegExp(pattern)) return regexpMatchesSyncPath(relativePath, pattern);
95
+ const glob = normalizePath(pattern);
96
+ if (glob === "") return relativePath === "";
97
+ const segments = splitPath(relativePath);
98
+ if (!glob.includes("/")) return segments.some((segment) => matchSegmentGlob(segment, glob));
99
+ return matchPathGlob(segments, splitPath(glob));
100
+ }
101
+ function stringPatternExcludesAllDescendants(relativePath, pattern) {
102
+ if (patternIsRegExp(pattern)) return false;
103
+ const glob = normalizePath(pattern);
104
+ if (glob === "") return false;
105
+ if (!glob.includes("/")) return matchesPattern(relativePath, pattern);
106
+ const globSegments = splitPath(glob);
107
+ return globSegments.at(-1) === "**" && matchPathGlob(splitPath(relativePath), globSegments);
108
+ }
109
+ function filtersContainRegExp(filters) {
110
+ return filters?.include?.some(patternIsRegExp) === true || filters?.exclude?.some(patternIsRegExp) === true;
111
+ }
112
+ function patternMayMatchDescendant(relativePath, pattern) {
113
+ if (patternIsRegExp(pattern)) return true;
114
+ const glob = normalizePath(pattern);
115
+ if (glob === "" || !glob.includes("/")) return true;
116
+ const pathSegments = splitPath(relativePath);
117
+ const globSegments = splitPath(glob);
118
+ const length = Math.min(pathSegments.length, globSegments.length);
119
+ for (let i = 0; i < length; i++) {
120
+ const globSegment = globSegments[i];
121
+ if (globSegment === "**" || globSegment === void 0 || hasGlobWildcard(globSegment)) return true;
122
+ if (globSegment !== pathSegments[i]) return false;
123
+ }
124
+ return true;
125
+ }
126
+ function matchPathGlob(pathSegments, globSegments) {
127
+ let reachable = new Array(pathSegments.length + 1).fill(false);
128
+ reachable[0] = true;
129
+ for (const globSegment of globSegments) {
130
+ const next = new Array(pathSegments.length + 1).fill(false);
131
+ if (globSegment === "**") {
132
+ let canReach = false;
133
+ for (let i = 0; i <= pathSegments.length; i++) {
134
+ canReach = canReach || reachable[i] === true;
135
+ next[i] = canReach;
136
+ }
137
+ } else for (let i = 0; i < pathSegments.length; i++) if (reachable[i] === true && matchSegmentGlob(pathSegments[i] ?? "", globSegment)) next[i + 1] = true;
138
+ reachable = next;
139
+ }
140
+ return reachable[pathSegments.length] === true;
141
+ }
142
+ function matchSegmentGlob(segment, glob) {
143
+ let segmentIndex = 0;
144
+ let globIndex = 0;
145
+ let starIndex = -1;
146
+ let starMatchIndex = 0;
147
+ while (segmentIndex < segment.length) {
148
+ const globChar = glob[globIndex];
149
+ if (globChar === "?" || globChar === segment[segmentIndex]) {
150
+ globIndex++;
151
+ segmentIndex++;
152
+ } else if (globChar === "*") {
153
+ while (glob[globIndex + 1] === "*") globIndex++;
154
+ starIndex = globIndex;
155
+ starMatchIndex = segmentIndex;
156
+ globIndex++;
157
+ } else if (starIndex !== -1) {
158
+ globIndex = starIndex + 1;
159
+ starMatchIndex++;
160
+ segmentIndex = starMatchIndex;
161
+ } else return false;
162
+ }
163
+ while (glob[globIndex] === "*") globIndex++;
164
+ return globIndex === glob.length;
165
+ }
166
+ function literalPrefixForGlob(glob) {
167
+ const segments = splitPath(glob);
168
+ const literalSegments = [];
169
+ let firstWildcardIndex = segments.length;
170
+ for (const [index, segment] of segments.entries()) {
171
+ if (segment === "**" || hasGlobWildcard(segment)) {
172
+ firstWildcardIndex = index;
173
+ break;
174
+ }
175
+ literalSegments.push(segment);
176
+ }
177
+ if (literalSegments.length === 0) return "";
178
+ const prefix = literalSegments.join("/");
179
+ const wildcardTail = segments.slice(firstWildcardIndex);
180
+ if (wildcardTail.length > 0 && wildcardTail.every((segment) => segment === "**")) return prefix;
181
+ return literalSegments.length < segments.length ? `${prefix}/` : prefix;
182
+ }
183
+ function commonLiteralPrefix(a, b) {
184
+ let end = 0;
185
+ const max = Math.min(a.length, b.length);
186
+ while (end < max && a[end] === b[end]) end++;
187
+ return trimTrailingHighSurrogate(a.slice(0, end));
188
+ }
189
+ function trimTrailingHighSurrogate(value) {
190
+ const lastCodeUnit = value.charCodeAt(value.length - 1);
191
+ return lastCodeUnit >= 55296 && lastCodeUnit <= 56319 ? value.slice(0, -1) : value;
192
+ }
193
+ function hasGlobWildcard(glob) {
194
+ return glob.includes("*") || glob.includes("?");
195
+ }
196
+ function patternIsRegExp(pattern) {
197
+ return typeof pattern !== "string";
198
+ }
199
+ function splitPath(path) {
200
+ if (path === "") return [];
201
+ return path.split("/").filter((segment) => segment !== "");
202
+ }
203
+ function normalizePath(path) {
204
+ let normalized = path.split("\\").join("/");
205
+ while (normalized.startsWith("./")) normalized = normalized.slice(2);
206
+ while (normalized.startsWith("/")) normalized = normalized.slice(1);
207
+ while (normalized.endsWith("/") && normalized.length > 1) normalized = normalized.slice(0, -1);
208
+ return normalized;
209
+ }
210
+ //#endregion
211
+ export { directoryMayContainSyncPaths, filterSyncPaths, literalPrefixForSyncFilters, pathPassesSyncFilters, pathSkippedByRegExpInputLimit };
212
+
213
+ //# sourceMappingURL=filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.js","names":[],"sources":["../../src/sync/filters.ts"],"sourcesContent":["import {\n pathExceedsSafeRegExpInput,\n regexpMatchesSyncPath,\n validateSyncFilters,\n} from './regexp-safety.ts'\nimport { emitScannerSkip, regexpInputTooLongSkip } from './scan-events.ts'\nimport type { SyncFilterOptions, SyncFilterPattern, SyncPath, SyncScanOptions } from './types.ts'\n\n/**\n * Tests whether a relative sync path is included by the configured include/exclude filters.\n * Exclude filters win over include filters when both match the same path.\n *\n * @param relativePath - Folder-relative path using forward slashes.\n * @param filters - Optional include and exclude filters.\n *\n * @returns True when the path should remain in the sync scan.\n */\nexport function pathPassesSyncFilters(\n relativePath: string,\n filters: SyncFilterOptions | undefined,\n): boolean {\n validateSyncFilters(filters)\n const path = normalizePath(relativePath)\n\n if (normalizedPathSkippedByRegExpInputLimit(path, filters)) return false\n\n const include = filters?.include ?? []\n const exclude = filters?.exclude ?? []\n\n if (include.length > 0) {\n if (!include.some((pattern) => matchesPattern(path, pattern))) return false\n }\n\n return !exclude.some((pattern) => matchesPattern(path, pattern))\n}\n\n/**\n * Tests whether a directory may contain paths admitted by the configured filters.\n *\n * @param relativePath - Folder-relative directory path using forward slashes.\n * @param filters - Optional include and exclude filters.\n *\n * @returns True when the scanner should descend into the directory.\n */\nexport function directoryMayContainSyncPaths(\n relativePath: string,\n filters: SyncFilterOptions | undefined,\n): boolean {\n validateSyncFilters(filters)\n const path = normalizePath(relativePath)\n if (path === '') return true\n\n const exclude = filters?.exclude ?? []\n if (exclude.some((pattern) => stringPatternExcludesAllDescendants(path, pattern))) {\n return false\n }\n\n const include = filters?.include ?? []\n return include.length === 0 || include.some((pattern) => patternMayMatchDescendant(path, pattern))\n}\n\n/**\n * Returns the safe literal prefix that B2 listing can use for include filters.\n * Exclude filters are not considered because they cannot narrow a B2 prefix.\n *\n * @param filters - Optional include and exclude filters.\n *\n * @returns A folder-relative literal prefix, or an empty string when no safe narrowing exists.\n */\nexport function literalPrefixForSyncFilters(filters: SyncFilterOptions | undefined): string {\n validateSyncFilters(filters)\n const include = filters?.include ?? []\n let commonPrefix: string | undefined\n\n for (const pattern of include) {\n if (patternIsRegExp(pattern)) return ''\n\n const glob = normalizePath(pattern)\n if (!glob.includes('/')) return ''\n\n const prefix = literalPrefixForGlob(glob)\n if (prefix === '') return ''\n commonPrefix = commonPrefix === undefined ? prefix : commonLiteralPrefix(commonPrefix, prefix)\n }\n\n return commonPrefix ?? ''\n}\n\n/**\n * Filters an async iterable of sync paths while preserving the original item type.\n *\n * @typeParam T - Concrete sync path shape yielded by the source folder.\n *\n * @param paths - Async iterable of folder scan results.\n * @param filters - Optional include and exclude filters.\n *\n * @returns A filtered async generator of sync paths.\n */\nexport async function* filterSyncPaths<T extends SyncPath>(\n paths: AsyncIterable<T>,\n filters: SyncScanOptions | undefined,\n): AsyncGenerator<T> {\n for await (const path of paths) {\n if (pathPassesSyncFilters(path.relativePath, filters)) {\n yield path\n } else if (pathSkippedByRegExpInputLimit(path.relativePath, filters)) {\n emitScannerSkip(filters, regexpInputTooLongSkip(normalizePath(path.relativePath)))\n }\n }\n}\n\n/**\n * Tests whether a path is skipped because RegExp filters are configured and the normalized path\n * exceeds the SDK RegExp input guard.\n *\n * @param relativePath - Folder-relative path using forward slashes.\n * @param filters - Optional include and exclude filters.\n *\n * @returns True when any RegExp filter is present and the path is too long to evaluate.\n */\nexport function pathSkippedByRegExpInputLimit(\n relativePath: string,\n filters: SyncFilterOptions | undefined,\n): boolean {\n validateSyncFilters(filters)\n return normalizedPathSkippedByRegExpInputLimit(normalizePath(relativePath), filters)\n}\n\nfunction normalizedPathSkippedByRegExpInputLimit(\n normalizedPath: string,\n filters: SyncFilterOptions | undefined,\n): boolean {\n if (!pathExceedsSafeRegExpInput(normalizedPath) || !filtersContainRegExp(filters)) {\n return false\n }\n return true\n}\n\nfunction matchesPattern(relativePath: string, pattern: SyncFilterPattern): boolean {\n if (patternIsRegExp(pattern)) {\n return regexpMatchesSyncPath(relativePath, pattern)\n }\n\n const glob = normalizePath(pattern)\n if (glob === '') return relativePath === ''\n\n const segments = splitPath(relativePath)\n if (!glob.includes('/')) {\n return segments.some((segment) => matchSegmentGlob(segment, glob))\n }\n\n return matchPathGlob(segments, splitPath(glob))\n}\n\nfunction stringPatternExcludesAllDescendants(\n relativePath: string,\n pattern: SyncFilterPattern,\n): boolean {\n if (patternIsRegExp(pattern)) return false\n\n const glob = normalizePath(pattern)\n if (glob === '') return false\n if (!glob.includes('/')) return matchesPattern(relativePath, pattern)\n\n const globSegments = splitPath(glob)\n return globSegments.at(-1) === '**' && matchPathGlob(splitPath(relativePath), globSegments)\n}\n\nfunction filtersContainRegExp(filters: SyncFilterOptions | undefined): boolean {\n return (\n filters?.include?.some(patternIsRegExp) === true ||\n filters?.exclude?.some(patternIsRegExp) === true\n )\n}\n\nfunction patternMayMatchDescendant(relativePath: string, pattern: SyncFilterPattern): boolean {\n if (patternIsRegExp(pattern)) return true\n\n const glob = normalizePath(pattern)\n if (glob === '' || !glob.includes('/')) return true\n\n const pathSegments = splitPath(relativePath)\n const globSegments = splitPath(glob)\n const length = Math.min(pathSegments.length, globSegments.length)\n\n for (let i = 0; i < length; i++) {\n const globSegment = globSegments[i]\n if (globSegment === '**' || globSegment === undefined || hasGlobWildcard(globSegment)) {\n return true\n }\n if (globSegment !== pathSegments[i]) {\n return false\n }\n }\n\n return true\n}\n\nfunction matchPathGlob(pathSegments: readonly string[], globSegments: readonly string[]): boolean {\n let reachable = new Array<boolean>(pathSegments.length + 1).fill(false)\n reachable[0] = true\n\n for (const globSegment of globSegments) {\n const next = new Array<boolean>(pathSegments.length + 1).fill(false)\n\n if (globSegment === '**') {\n // A whole-segment `**` consumes zero or more complete path segments.\n let canReach = false\n for (let i = 0; i <= pathSegments.length; i++) {\n canReach = canReach || reachable[i] === true\n next[i] = canReach\n }\n } else {\n for (let i = 0; i < pathSegments.length; i++) {\n if (reachable[i] === true && matchSegmentGlob(pathSegments[i] ?? '', globSegment)) {\n next[i + 1] = true\n }\n }\n }\n\n reachable = next\n }\n\n return reachable[pathSegments.length] === true\n}\n\nfunction matchSegmentGlob(segment: string, glob: string): boolean {\n let segmentIndex = 0\n let globIndex = 0\n let starIndex = -1\n let starMatchIndex = 0\n\n while (segmentIndex < segment.length) {\n const globChar = glob[globIndex]\n if (globChar === '?' || globChar === segment[segmentIndex]) {\n globIndex++\n segmentIndex++\n } else if (globChar === '*') {\n // Repeated `*` in one segment is still one segment-local wildcard.\n while (glob[globIndex + 1] === '*') globIndex++\n starIndex = globIndex\n starMatchIndex = segmentIndex\n globIndex++\n } else if (starIndex !== -1) {\n globIndex = starIndex + 1\n starMatchIndex++\n segmentIndex = starMatchIndex\n } else {\n return false\n }\n }\n\n while (glob[globIndex] === '*') globIndex++\n return globIndex === glob.length\n}\n\nfunction literalPrefixForGlob(glob: string): string {\n const segments = splitPath(glob)\n const literalSegments: string[] = []\n let firstWildcardIndex = segments.length\n\n for (const [index, segment] of segments.entries()) {\n if (segment === '**' || hasGlobWildcard(segment)) {\n firstWildcardIndex = index\n break\n }\n literalSegments.push(segment)\n }\n\n if (literalSegments.length === 0) return ''\n const prefix = literalSegments.join('/')\n const wildcardTail = segments.slice(firstWildcardIndex)\n const tailMayMatchBarePrefix =\n wildcardTail.length > 0 && wildcardTail.every((segment) => segment === '**')\n if (tailMayMatchBarePrefix) return prefix\n return literalSegments.length < segments.length ? `${prefix}/` : prefix\n}\n\nfunction commonLiteralPrefix(a: string, b: string): string {\n let end = 0\n const max = Math.min(a.length, b.length)\n while (end < max && a[end] === b[end]) end++\n return trimTrailingHighSurrogate(a.slice(0, end))\n}\n\nfunction trimTrailingHighSurrogate(value: string): string {\n const lastCodeUnit = value.charCodeAt(value.length - 1)\n return lastCodeUnit >= 0xd800 && lastCodeUnit <= 0xdbff ? value.slice(0, -1) : value\n}\n\nfunction hasGlobWildcard(glob: string): boolean {\n return glob.includes('*') || glob.includes('?')\n}\n\nfunction patternIsRegExp(pattern: SyncFilterPattern): pattern is RegExp {\n return typeof pattern !== 'string'\n}\n\nfunction splitPath(path: string): string[] {\n if (path === '') return []\n return path.split('/').filter((segment) => segment !== '')\n}\n\nfunction normalizePath(path: string): string {\n let normalized = path.split('\\\\').join('/')\n while (normalized.startsWith('./')) normalized = normalized.slice(2)\n while (normalized.startsWith('/')) normalized = normalized.slice(1)\n while (normalized.endsWith('/') && normalized.length > 1) {\n normalized = normalized.slice(0, -1)\n }\n return normalized\n}\n"],"mappings":"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"}