@streetjs/storage 1.0.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 (363) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +719 -0
  3. package/dist/access.d.ts +95 -0
  4. package/dist/access.d.ts.map +1 -0
  5. package/dist/access.js +114 -0
  6. package/dist/access.js.map +1 -0
  7. package/dist/cli/commands.d.ts +88 -0
  8. package/dist/cli/commands.d.ts.map +1 -0
  9. package/dist/cli/commands.js +369 -0
  10. package/dist/cli/commands.js.map +1 -0
  11. package/dist/cli/generators.d.ts +41 -0
  12. package/dist/cli/generators.d.ts.map +1 -0
  13. package/dist/cli/generators.js +119 -0
  14. package/dist/cli/generators.js.map +1 -0
  15. package/dist/directory.d.ts +88 -0
  16. package/dist/directory.d.ts.map +1 -0
  17. package/dist/directory.js +148 -0
  18. package/dist/directory.js.map +1 -0
  19. package/dist/driver.d.ts +83 -0
  20. package/dist/driver.d.ts.map +1 -0
  21. package/dist/driver.js +16 -0
  22. package/dist/driver.js.map +1 -0
  23. package/dist/drivers/azure.d.ts +239 -0
  24. package/dist/drivers/azure.d.ts.map +1 -0
  25. package/dist/drivers/azure.js +476 -0
  26. package/dist/drivers/azure.js.map +1 -0
  27. package/dist/drivers/backblaze.d.ts +105 -0
  28. package/dist/drivers/backblaze.d.ts.map +1 -0
  29. package/dist/drivers/backblaze.js +279 -0
  30. package/dist/drivers/backblaze.js.map +1 -0
  31. package/dist/drivers/gcs.d.ts +239 -0
  32. package/dist/drivers/gcs.d.ts.map +1 -0
  33. package/dist/drivers/gcs.js +454 -0
  34. package/dist/drivers/gcs.js.map +1 -0
  35. package/dist/drivers/local.d.ts +126 -0
  36. package/dist/drivers/local.d.ts.map +1 -0
  37. package/dist/drivers/local.js +321 -0
  38. package/dist/drivers/local.js.map +1 -0
  39. package/dist/drivers/memory.d.ts +104 -0
  40. package/dist/drivers/memory.d.ts.map +1 -0
  41. package/dist/drivers/memory.js +197 -0
  42. package/dist/drivers/memory.js.map +1 -0
  43. package/dist/drivers/minio.d.ts +90 -0
  44. package/dist/drivers/minio.d.ts.map +1 -0
  45. package/dist/drivers/minio.js +276 -0
  46. package/dist/drivers/minio.js.map +1 -0
  47. package/dist/drivers/r2.d.ts +100 -0
  48. package/dist/drivers/r2.d.ts.map +1 -0
  49. package/dist/drivers/r2.js +240 -0
  50. package/dist/drivers/r2.js.map +1 -0
  51. package/dist/drivers/s3-base.d.ts +270 -0
  52. package/dist/drivers/s3-base.d.ts.map +1 -0
  53. package/dist/drivers/s3-base.js +436 -0
  54. package/dist/drivers/s3-base.js.map +1 -0
  55. package/dist/drivers/s3.d.ts +111 -0
  56. package/dist/drivers/s3.d.ts.map +1 -0
  57. package/dist/drivers/s3.js +311 -0
  58. package/dist/drivers/s3.js.map +1 -0
  59. package/dist/drivers/supabase.d.ts +246 -0
  60. package/dist/drivers/supabase.d.ts.map +1 -0
  61. package/dist/drivers/supabase.js +502 -0
  62. package/dist/drivers/supabase.js.map +1 -0
  63. package/dist/errors.d.ts +115 -0
  64. package/dist/errors.d.ts.map +1 -0
  65. package/dist/errors.js +131 -0
  66. package/dist/errors.js.map +1 -0
  67. package/dist/examples/storage-demo.d.ts +53 -0
  68. package/dist/examples/storage-demo.d.ts.map +1 -0
  69. package/dist/examples/storage-demo.js +242 -0
  70. package/dist/examples/storage-demo.js.map +1 -0
  71. package/dist/facade.d.ts +192 -0
  72. package/dist/facade.d.ts.map +1 -0
  73. package/dist/facade.js +898 -0
  74. package/dist/facade.js.map +1 -0
  75. package/dist/image.d.ts +94 -0
  76. package/dist/image.d.ts.map +1 -0
  77. package/dist/image.js +224 -0
  78. package/dist/image.js.map +1 -0
  79. package/dist/index.d.ts +47 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +53 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/integrations/events.d.ts +108 -0
  84. package/dist/integrations/events.d.ts.map +1 -0
  85. package/dist/integrations/events.js +111 -0
  86. package/dist/integrations/events.js.map +1 -0
  87. package/dist/integrations/queue.d.ts +89 -0
  88. package/dist/integrations/queue.d.ts.map +1 -0
  89. package/dist/integrations/queue.js +91 -0
  90. package/dist/integrations/queue.js.map +1 -0
  91. package/dist/integrations/realtime.d.ts +95 -0
  92. package/dist/integrations/realtime.d.ts.map +1 -0
  93. package/dist/integrations/realtime.js +90 -0
  94. package/dist/integrations/realtime.js.map +1 -0
  95. package/dist/lifecycle.d.ts +137 -0
  96. package/dist/lifecycle.d.ts.map +1 -0
  97. package/dist/lifecycle.js +240 -0
  98. package/dist/lifecycle.js.map +1 -0
  99. package/dist/metadata.d.ts +109 -0
  100. package/dist/metadata.d.ts.map +1 -0
  101. package/dist/metadata.js +139 -0
  102. package/dist/metadata.js.map +1 -0
  103. package/dist/multipart.d.ts +108 -0
  104. package/dist/multipart.d.ts.map +1 -0
  105. package/dist/multipart.js +200 -0
  106. package/dist/multipart.js.map +1 -0
  107. package/dist/observability.d.ts +82 -0
  108. package/dist/observability.d.ts.map +1 -0
  109. package/dist/observability.js +175 -0
  110. package/dist/observability.js.map +1 -0
  111. package/dist/plugin.d.ts +82 -0
  112. package/dist/plugin.d.ts.map +1 -0
  113. package/dist/plugin.js +100 -0
  114. package/dist/plugin.js.map +1 -0
  115. package/dist/resumable.d.ts +118 -0
  116. package/dist/resumable.d.ts.map +1 -0
  117. package/dist/resumable.js +223 -0
  118. package/dist/resumable.js.map +1 -0
  119. package/dist/search.d.ts +57 -0
  120. package/dist/search.d.ts.map +1 -0
  121. package/dist/search.js +172 -0
  122. package/dist/search.js.map +1 -0
  123. package/dist/signed-url.d.ts +110 -0
  124. package/dist/signed-url.d.ts.map +1 -0
  125. package/dist/signed-url.js +237 -0
  126. package/dist/signed-url.js.map +1 -0
  127. package/dist/testing/index.d.ts +219 -0
  128. package/dist/testing/index.d.ts.map +1 -0
  129. package/dist/testing/index.js +393 -0
  130. package/dist/testing/index.js.map +1 -0
  131. package/dist/tests/access.test.d.ts +2 -0
  132. package/dist/tests/access.test.d.ts.map +1 -0
  133. package/dist/tests/access.test.js +270 -0
  134. package/dist/tests/access.test.js.map +1 -0
  135. package/dist/tests/azure-driver.test.d.ts +2 -0
  136. package/dist/tests/azure-driver.test.d.ts.map +1 -0
  137. package/dist/tests/azure-driver.test.js +183 -0
  138. package/dist/tests/azure-driver.test.js.map +1 -0
  139. package/dist/tests/backblaze-driver.test.d.ts +2 -0
  140. package/dist/tests/backblaze-driver.test.d.ts.map +1 -0
  141. package/dist/tests/backblaze-driver.test.js +185 -0
  142. package/dist/tests/backblaze-driver.test.js.map +1 -0
  143. package/dist/tests/bridge-degradation.test.d.ts +2 -0
  144. package/dist/tests/bridge-degradation.test.d.ts.map +1 -0
  145. package/dist/tests/bridge-degradation.test.js +138 -0
  146. package/dist/tests/bridge-degradation.test.js.map +1 -0
  147. package/dist/tests/cli.test.d.ts +2 -0
  148. package/dist/tests/cli.test.d.ts.map +1 -0
  149. package/dist/tests/cli.test.js +127 -0
  150. package/dist/tests/cli.test.js.map +1 -0
  151. package/dist/tests/contract.d.ts +131 -0
  152. package/dist/tests/contract.d.ts.map +1 -0
  153. package/dist/tests/contract.js +222 -0
  154. package/dist/tests/contract.js.map +1 -0
  155. package/dist/tests/contract.test.d.ts +2 -0
  156. package/dist/tests/contract.test.d.ts.map +1 -0
  157. package/dist/tests/contract.test.js +110 -0
  158. package/dist/tests/contract.test.js.map +1 -0
  159. package/dist/tests/directory.test.d.ts +2 -0
  160. package/dist/tests/directory.test.d.ts.map +1 -0
  161. package/dist/tests/directory.test.js +125 -0
  162. package/dist/tests/directory.test.js.map +1 -0
  163. package/dist/tests/errors.test.d.ts +2 -0
  164. package/dist/tests/errors.test.d.ts.map +1 -0
  165. package/dist/tests/errors.test.js +93 -0
  166. package/dist/tests/errors.test.js.map +1 -0
  167. package/dist/tests/events-bridge.test.d.ts +2 -0
  168. package/dist/tests/events-bridge.test.d.ts.map +1 -0
  169. package/dist/tests/events-bridge.test.js +228 -0
  170. package/dist/tests/events-bridge.test.js.map +1 -0
  171. package/dist/tests/example-smoke.test.d.ts +2 -0
  172. package/dist/tests/example-smoke.test.d.ts.map +1 -0
  173. package/dist/tests/example-smoke.test.js +34 -0
  174. package/dist/tests/example-smoke.test.js.map +1 -0
  175. package/dist/tests/gcs-driver.test.d.ts +2 -0
  176. package/dist/tests/gcs-driver.test.d.ts.map +1 -0
  177. package/dist/tests/gcs-driver.test.js +197 -0
  178. package/dist/tests/gcs-driver.test.js.map +1 -0
  179. package/dist/tests/image.test.d.ts +2 -0
  180. package/dist/tests/image.test.d.ts.map +1 -0
  181. package/dist/tests/image.test.js +102 -0
  182. package/dist/tests/image.test.js.map +1 -0
  183. package/dist/tests/lifecycle.test.d.ts +2 -0
  184. package/dist/tests/lifecycle.test.d.ts.map +1 -0
  185. package/dist/tests/lifecycle.test.js +171 -0
  186. package/dist/tests/lifecycle.test.js.map +1 -0
  187. package/dist/tests/local-driver.test.d.ts +2 -0
  188. package/dist/tests/local-driver.test.d.ts.map +1 -0
  189. package/dist/tests/local-driver.test.js +153 -0
  190. package/dist/tests/local-driver.test.js.map +1 -0
  191. package/dist/tests/local-streaming.test.d.ts +2 -0
  192. package/dist/tests/local-streaming.test.d.ts.map +1 -0
  193. package/dist/tests/local-streaming.test.js +121 -0
  194. package/dist/tests/local-streaming.test.js.map +1 -0
  195. package/dist/tests/memory-driver.test.d.ts +2 -0
  196. package/dist/tests/memory-driver.test.d.ts.map +1 -0
  197. package/dist/tests/memory-driver.test.js +180 -0
  198. package/dist/tests/memory-driver.test.js.map +1 -0
  199. package/dist/tests/memory-streaming.test.d.ts +2 -0
  200. package/dist/tests/memory-streaming.test.d.ts.map +1 -0
  201. package/dist/tests/memory-streaming.test.js +92 -0
  202. package/dist/tests/memory-streaming.test.js.map +1 -0
  203. package/dist/tests/minio-driver.test.d.ts +2 -0
  204. package/dist/tests/minio-driver.test.d.ts.map +1 -0
  205. package/dist/tests/minio-driver.test.js +146 -0
  206. package/dist/tests/minio-driver.test.js.map +1 -0
  207. package/dist/tests/non-s3-integration.test.d.ts +2 -0
  208. package/dist/tests/non-s3-integration.test.d.ts.map +1 -0
  209. package/dist/tests/non-s3-integration.test.js +201 -0
  210. package/dist/tests/non-s3-integration.test.js.map +1 -0
  211. package/dist/tests/observability.registration.test.d.ts +2 -0
  212. package/dist/tests/observability.registration.test.d.ts.map +1 -0
  213. package/dist/tests/observability.registration.test.js +103 -0
  214. package/dist/tests/observability.registration.test.js.map +1 -0
  215. package/dist/tests/observability.test.d.ts +2 -0
  216. package/dist/tests/observability.test.d.ts.map +1 -0
  217. package/dist/tests/observability.test.js +240 -0
  218. package/dist/tests/observability.test.js.map +1 -0
  219. package/dist/tests/plugin.test.d.ts +2 -0
  220. package/dist/tests/plugin.test.d.ts.map +1 -0
  221. package/dist/tests/plugin.test.js +112 -0
  222. package/dist/tests/plugin.test.js.map +1 -0
  223. package/dist/tests/prop-concurrent.test.d.ts +2 -0
  224. package/dist/tests/prop-concurrent.test.d.ts.map +1 -0
  225. package/dist/tests/prop-concurrent.test.js +59 -0
  226. package/dist/tests/prop-concurrent.test.js.map +1 -0
  227. package/dist/tests/prop-copy.test.d.ts +2 -0
  228. package/dist/tests/prop-copy.test.d.ts.map +1 -0
  229. package/dist/tests/prop-copy.test.js +63 -0
  230. package/dist/tests/prop-copy.test.js.map +1 -0
  231. package/dist/tests/prop-delete.test.d.ts +2 -0
  232. package/dist/tests/prop-delete.test.d.ts.map +1 -0
  233. package/dist/tests/prop-delete.test.js +35 -0
  234. package/dist/tests/prop-delete.test.js.map +1 -0
  235. package/dist/tests/prop-directory.test.d.ts +2 -0
  236. package/dist/tests/prop-directory.test.d.ts.map +1 -0
  237. package/dist/tests/prop-directory.test.js +118 -0
  238. package/dist/tests/prop-directory.test.js.map +1 -0
  239. package/dist/tests/prop-driver-conformance.test.d.ts +2 -0
  240. package/dist/tests/prop-driver-conformance.test.d.ts.map +1 -0
  241. package/dist/tests/prop-driver-conformance.test.js +110 -0
  242. package/dist/tests/prop-driver-conformance.test.js.map +1 -0
  243. package/dist/tests/prop-driver-equivalence.test.d.ts +2 -0
  244. package/dist/tests/prop-driver-equivalence.test.d.ts.map +1 -0
  245. package/dist/tests/prop-driver-equivalence.test.js +163 -0
  246. package/dist/tests/prop-driver-equivalence.test.js.map +1 -0
  247. package/dist/tests/prop-lifecycle.test.d.ts +2 -0
  248. package/dist/tests/prop-lifecycle.test.d.ts.map +1 -0
  249. package/dist/tests/prop-lifecycle.test.js +83 -0
  250. package/dist/tests/prop-lifecycle.test.js.map +1 -0
  251. package/dist/tests/prop-list.test.d.ts +2 -0
  252. package/dist/tests/prop-list.test.d.ts.map +1 -0
  253. package/dist/tests/prop-list.test.js +53 -0
  254. package/dist/tests/prop-list.test.js.map +1 -0
  255. package/dist/tests/prop-metadata.test.d.ts +2 -0
  256. package/dist/tests/prop-metadata.test.d.ts.map +1 -0
  257. package/dist/tests/prop-metadata.test.js +87 -0
  258. package/dist/tests/prop-metadata.test.js.map +1 -0
  259. package/dist/tests/prop-move.test.d.ts +2 -0
  260. package/dist/tests/prop-move.test.d.ts.map +1 -0
  261. package/dist/tests/prop-move.test.js +67 -0
  262. package/dist/tests/prop-move.test.js.map +1 -0
  263. package/dist/tests/prop-multipart-abort.test.d.ts +2 -0
  264. package/dist/tests/prop-multipart-abort.test.d.ts.map +1 -0
  265. package/dist/tests/prop-multipart-abort.test.js +48 -0
  266. package/dist/tests/prop-multipart-abort.test.js.map +1 -0
  267. package/dist/tests/prop-multipart.test.d.ts +2 -0
  268. package/dist/tests/prop-multipart.test.d.ts.map +1 -0
  269. package/dist/tests/prop-multipart.test.js +65 -0
  270. package/dist/tests/prop-multipart.test.js.map +1 -0
  271. package/dist/tests/prop-resumable.test.d.ts +2 -0
  272. package/dist/tests/prop-resumable.test.d.ts.map +1 -0
  273. package/dist/tests/prop-resumable.test.js +78 -0
  274. package/dist/tests/prop-resumable.test.js.map +1 -0
  275. package/dist/tests/prop-search.test.d.ts +2 -0
  276. package/dist/tests/prop-search.test.d.ts.map +1 -0
  277. package/dist/tests/prop-search.test.js +120 -0
  278. package/dist/tests/prop-search.test.js.map +1 -0
  279. package/dist/tests/prop-signed-url.test.d.ts +2 -0
  280. package/dist/tests/prop-signed-url.test.d.ts.map +1 -0
  281. package/dist/tests/prop-signed-url.test.js +74 -0
  282. package/dist/tests/prop-signed-url.test.js.map +1 -0
  283. package/dist/tests/prop-streaming.test.d.ts +2 -0
  284. package/dist/tests/prop-streaming.test.d.ts.map +1 -0
  285. package/dist/tests/prop-streaming.test.js +34 -0
  286. package/dist/tests/prop-streaming.test.js.map +1 -0
  287. package/dist/tests/prop-upload-download.test.d.ts +2 -0
  288. package/dist/tests/prop-upload-download.test.d.ts.map +1 -0
  289. package/dist/tests/prop-upload-download.test.js +30 -0
  290. package/dist/tests/prop-upload-download.test.js.map +1 -0
  291. package/dist/tests/prop-validation.test.d.ts +2 -0
  292. package/dist/tests/prop-validation.test.d.ts.map +1 -0
  293. package/dist/tests/prop-validation.test.js +50 -0
  294. package/dist/tests/prop-validation.test.js.map +1 -0
  295. package/dist/tests/prop-versioning.test.d.ts +2 -0
  296. package/dist/tests/prop-versioning.test.d.ts.map +1 -0
  297. package/dist/tests/prop-versioning.test.js +74 -0
  298. package/dist/tests/prop-versioning.test.js.map +1 -0
  299. package/dist/tests/queue-bridge.test.d.ts +2 -0
  300. package/dist/tests/queue-bridge.test.d.ts.map +1 -0
  301. package/dist/tests/queue-bridge.test.js +111 -0
  302. package/dist/tests/queue-bridge.test.js.map +1 -0
  303. package/dist/tests/r2-driver.test.d.ts +2 -0
  304. package/dist/tests/r2-driver.test.d.ts.map +1 -0
  305. package/dist/tests/r2-driver.test.js +143 -0
  306. package/dist/tests/r2-driver.test.js.map +1 -0
  307. package/dist/tests/realtime-bridge.test.d.ts +2 -0
  308. package/dist/tests/realtime-bridge.test.d.ts.map +1 -0
  309. package/dist/tests/realtime-bridge.test.js +106 -0
  310. package/dist/tests/realtime-bridge.test.js.map +1 -0
  311. package/dist/tests/resumable.test.d.ts +2 -0
  312. package/dist/tests/resumable.test.d.ts.map +1 -0
  313. package/dist/tests/resumable.test.js +104 -0
  314. package/dist/tests/resumable.test.js.map +1 -0
  315. package/dist/tests/s3-base.test.d.ts +2 -0
  316. package/dist/tests/s3-base.test.d.ts.map +1 -0
  317. package/dist/tests/s3-base.test.js +289 -0
  318. package/dist/tests/s3-base.test.js.map +1 -0
  319. package/dist/tests/s3-integration.test.d.ts +2 -0
  320. package/dist/tests/s3-integration.test.d.ts.map +1 -0
  321. package/dist/tests/s3-integration.test.js +270 -0
  322. package/dist/tests/s3-integration.test.js.map +1 -0
  323. package/dist/tests/s3.test.d.ts +2 -0
  324. package/dist/tests/s3.test.d.ts.map +1 -0
  325. package/dist/tests/s3.test.js +203 -0
  326. package/dist/tests/s3.test.js.map +1 -0
  327. package/dist/tests/scaffold.test.d.ts +2 -0
  328. package/dist/tests/scaffold.test.d.ts.map +1 -0
  329. package/dist/tests/scaffold.test.js +13 -0
  330. package/dist/tests/scaffold.test.js.map +1 -0
  331. package/dist/tests/search.test.d.ts +2 -0
  332. package/dist/tests/search.test.d.ts.map +1 -0
  333. package/dist/tests/search.test.js +106 -0
  334. package/dist/tests/search.test.js.map +1 -0
  335. package/dist/tests/supabase-driver.test.d.ts +2 -0
  336. package/dist/tests/supabase-driver.test.d.ts.map +1 -0
  337. package/dist/tests/supabase-driver.test.js +196 -0
  338. package/dist/tests/supabase-driver.test.js.map +1 -0
  339. package/dist/tests/testing-utilities.test.d.ts +2 -0
  340. package/dist/tests/testing-utilities.test.d.ts.map +1 -0
  341. package/dist/tests/testing-utilities.test.js +138 -0
  342. package/dist/tests/testing-utilities.test.js.map +1 -0
  343. package/dist/tests/validation.test.d.ts +2 -0
  344. package/dist/tests/validation.test.d.ts.map +1 -0
  345. package/dist/tests/validation.test.js +135 -0
  346. package/dist/tests/validation.test.js.map +1 -0
  347. package/dist/tests/versioning.test.d.ts +2 -0
  348. package/dist/tests/versioning.test.d.ts.map +1 -0
  349. package/dist/tests/versioning.test.js +128 -0
  350. package/dist/tests/versioning.test.js.map +1 -0
  351. package/dist/types.d.ts +232 -0
  352. package/dist/types.d.ts.map +1 -0
  353. package/dist/types.js +23 -0
  354. package/dist/types.js.map +1 -0
  355. package/dist/validation.d.ts +105 -0
  356. package/dist/validation.d.ts.map +1 -0
  357. package/dist/validation.js +225 -0
  358. package/dist/validation.js.map +1 -0
  359. package/dist/versioning.d.ts +100 -0
  360. package/dist/versioning.d.ts.map +1 -0
  361. package/dist/versioning.js +179 -0
  362. package/dist/versioning.js.map +1 -0
  363. package/package.json +137 -0
@@ -0,0 +1,100 @@
1
+ /**
2
+ * @streetjs/storage — the versioning manager.
3
+ *
4
+ * Versioning retains the prior content of an object whenever a versioned key is
5
+ * overwritten, so historical Versions can be listed, restored, and deleted
6
+ * (Requirement 12). {@link VersioningManager} provides this capability in a
7
+ * **provider-agnostic** way:
8
+ *
9
+ * - When the backing {@link StorageDriver} implements the optional native
10
+ * `versioning` capability, the manager delegates each operation to the driver
11
+ * so a provider with first-class versioning (e.g. S3 bucket versioning) is
12
+ * used directly.
13
+ * - Otherwise the manager **simulates** versioning over the mandatory driver
14
+ * primitives (`put`/`get`/`stat`/`list`/`delete`). Each snapshot copies the
15
+ * current object's bytes and write-time metadata to a reserved key
16
+ * `${VERSION_KEY_PREFIX}<key>/<versionId>` (mirroring the design's
17
+ * `.versions/<key>/<versionId>` layout). Versions are enumerated by listing
18
+ * that reserved prefix and restored/deleted by reading/removing the reserved
19
+ * copy. No cap is imposed on the number of retained Versions (Requirement
20
+ * 12.1).
21
+ *
22
+ * Semantics (Requirement 12):
23
+ * - {@link VersioningManager.snapshot} captures the current content of `key` as
24
+ * a new Version and returns its id, or `null` when there is nothing to
25
+ * snapshot (the key does not yet exist). Crucially, when the snapshot itself
26
+ * fails for any reason — a storage constraint or system error — it returns
27
+ * `null` **without throwing** so the caller's overwrite still proceeds without
28
+ * a Version being created (Requirement 12.5).
29
+ * - {@link VersioningManager.listVersions} returns the {@link VersionInfo}
30
+ * descriptors of the retained Versions for `key` (Requirement 12.2).
31
+ * - {@link VersioningManager.restoreVersion} makes the content of the identified
32
+ * Version the current object content and returns the resulting metadata
33
+ * (Requirement 12.3).
34
+ * - {@link VersioningManager.deleteVersion} removes exactly the identified
35
+ * Version while retaining the rest (Requirement 12.4).
36
+ *
37
+ * The module depends only on the driver contract, the shared type surface, the
38
+ * error hierarchy, the metadata layer, and `node:crypto`, keeping the
39
+ * dependency direction acyclic.
40
+ *
41
+ * _Requirements: 12.1, 12.2, 12.3, 12.4, 12.5_
42
+ */
43
+ import type { StorageDriver } from "./driver.js";
44
+ import type { StorageObjectMetadata, VersionInfo } from "./types.js";
45
+ /**
46
+ * Provider-agnostic versioning manager built on the driver contract.
47
+ *
48
+ * A single instance is held by the facade and bound to one {@link StorageDriver}
49
+ * for its lifetime, so the native-vs-simulated decision (based on whether the
50
+ * driver exposes a `versioning` capability) is stable across every call.
51
+ */
52
+ export declare class VersioningManager {
53
+ /** The driver every operation is delegated to or simulated over. */
54
+ private readonly driver;
55
+ constructor(driver: StorageDriver);
56
+ /** The driver's native versioning capability, when present. */
57
+ private get native();
58
+ /**
59
+ * Capture the current content of `key` as a new Version and return its id, or
60
+ * `null` when there is nothing to snapshot (the key does not exist yet).
61
+ *
62
+ * This is invoked by the facade immediately before an overwriting `put` when
63
+ * versioning is enabled. Per Requirement 12.5, a failure of the versioning
64
+ * mechanism must never block the overwrite: any error raised while reading the
65
+ * current object or persisting the snapshot is swallowed and `null` is
66
+ * returned, so the caller proceeds to overwrite without a Version. The prior
67
+ * content retained on success is unlimited in count (Requirement 12.1).
68
+ */
69
+ snapshot(key: string): Promise<string | null>;
70
+ /**
71
+ * Return the {@link VersionInfo} descriptors of the retained Versions for
72
+ * `key` (Requirement 12.2). For the simulated path the reserved version prefix
73
+ * is listed and each version's `size`/`checksum`/`createdAt` is read from its
74
+ * stored metadata; entries are returned oldest-first by creation time. Only
75
+ * direct Versions of `key` are included — copies belonging to a deeper key
76
+ * that merely shares this key's prefix are excluded.
77
+ */
78
+ listVersions(key: string): Promise<VersionInfo[]>;
79
+ /**
80
+ * Make the content of the Version identified by `versionId` the current
81
+ * object content for `key` and return the resulting metadata (Requirement
82
+ * 12.3). For the simulated path the reserved copy is read and written back to
83
+ * `key` with its preserved write-time metadata. The overwrite is performed
84
+ * directly against the driver, so restoring does not itself trigger a new
85
+ * snapshot. Throws {@link NotFoundError} when the Version does not exist.
86
+ */
87
+ restoreVersion(key: string, versionId: string): Promise<StorageObjectMetadata>;
88
+ /**
89
+ * Remove exactly the Version identified by `versionId` for `key` while
90
+ * retaining the remaining Versions (Requirement 12.4). For the simulated path
91
+ * the reserved copy is deleted; deleting a missing Version is an idempotent
92
+ * no-op at the driver level.
93
+ */
94
+ deleteVersion(key: string, versionId: string): Promise<void>;
95
+ /** The reserved driver key a simulated Version is persisted under. */
96
+ private versionKey;
97
+ /** The reserved driver key prefix that all simulated Versions of `key` share. */
98
+ private versionPrefix;
99
+ }
100
+ //# sourceMappingURL=versioning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versioning.d.ts","sourceRoot":"","sources":["../src/versioning.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAwB,MAAM,aAAa,CAAC;AAGvE,OAAO,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAUrE;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAC5B,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,MAAM,EAAE,aAAa;IAIjC,+DAA+D;IAC/D,OAAO,KAAK,MAAM,GAEjB;IAED;;;;;;;;;;OAUG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAwBnD;;;;;;;OAOG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA6BvD;;;;;;;OAOG;IACG,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAgBpF;;;;;OAKG;IACG,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlE,sEAAsE;IACtE,OAAO,CAAC,UAAU;IAIlB,iFAAiF;IACjF,OAAO,CAAC,aAAa;CAGtB"}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * @streetjs/storage — the versioning manager.
3
+ *
4
+ * Versioning retains the prior content of an object whenever a versioned key is
5
+ * overwritten, so historical Versions can be listed, restored, and deleted
6
+ * (Requirement 12). {@link VersioningManager} provides this capability in a
7
+ * **provider-agnostic** way:
8
+ *
9
+ * - When the backing {@link StorageDriver} implements the optional native
10
+ * `versioning` capability, the manager delegates each operation to the driver
11
+ * so a provider with first-class versioning (e.g. S3 bucket versioning) is
12
+ * used directly.
13
+ * - Otherwise the manager **simulates** versioning over the mandatory driver
14
+ * primitives (`put`/`get`/`stat`/`list`/`delete`). Each snapshot copies the
15
+ * current object's bytes and write-time metadata to a reserved key
16
+ * `${VERSION_KEY_PREFIX}<key>/<versionId>` (mirroring the design's
17
+ * `.versions/<key>/<versionId>` layout). Versions are enumerated by listing
18
+ * that reserved prefix and restored/deleted by reading/removing the reserved
19
+ * copy. No cap is imposed on the number of retained Versions (Requirement
20
+ * 12.1).
21
+ *
22
+ * Semantics (Requirement 12):
23
+ * - {@link VersioningManager.snapshot} captures the current content of `key` as
24
+ * a new Version and returns its id, or `null` when there is nothing to
25
+ * snapshot (the key does not yet exist). Crucially, when the snapshot itself
26
+ * fails for any reason — a storage constraint or system error — it returns
27
+ * `null` **without throwing** so the caller's overwrite still proceeds without
28
+ * a Version being created (Requirement 12.5).
29
+ * - {@link VersioningManager.listVersions} returns the {@link VersionInfo}
30
+ * descriptors of the retained Versions for `key` (Requirement 12.2).
31
+ * - {@link VersioningManager.restoreVersion} makes the content of the identified
32
+ * Version the current object content and returns the resulting metadata
33
+ * (Requirement 12.3).
34
+ * - {@link VersioningManager.deleteVersion} removes exactly the identified
35
+ * Version while retaining the rest (Requirement 12.4).
36
+ *
37
+ * The module depends only on the driver contract, the shared type surface, the
38
+ * error hierarchy, the metadata layer, and `node:crypto`, keeping the
39
+ * dependency direction acyclic.
40
+ *
41
+ * _Requirements: 12.1, 12.2, 12.3, 12.4, 12.5_
42
+ */
43
+ import { randomUUID } from "node:crypto";
44
+ import { NotFoundError } from "./errors.js";
45
+ import { normalizeMetadata, toWriteMetadata } from "./metadata.js";
46
+ /**
47
+ * Reserved key prefix under which simulated Versions are persisted via the
48
+ * driver primitives. A Version of `<key>` lives at
49
+ * `${VERSION_KEY_PREFIX}<key>/<versionId>`. These reserved keys hold historical
50
+ * copies and are never surfaced through the object-operation API.
51
+ */
52
+ const VERSION_KEY_PREFIX = ".versions/";
53
+ /**
54
+ * Provider-agnostic versioning manager built on the driver contract.
55
+ *
56
+ * A single instance is held by the facade and bound to one {@link StorageDriver}
57
+ * for its lifetime, so the native-vs-simulated decision (based on whether the
58
+ * driver exposes a `versioning` capability) is stable across every call.
59
+ */
60
+ export class VersioningManager {
61
+ /** The driver every operation is delegated to or simulated over. */
62
+ driver;
63
+ constructor(driver) {
64
+ this.driver = driver;
65
+ }
66
+ /** The driver's native versioning capability, when present. */
67
+ get native() {
68
+ return this.driver.versioning;
69
+ }
70
+ /**
71
+ * Capture the current content of `key` as a new Version and return its id, or
72
+ * `null` when there is nothing to snapshot (the key does not exist yet).
73
+ *
74
+ * This is invoked by the facade immediately before an overwriting `put` when
75
+ * versioning is enabled. Per Requirement 12.5, a failure of the versioning
76
+ * mechanism must never block the overwrite: any error raised while reading the
77
+ * current object or persisting the snapshot is swallowed and `null` is
78
+ * returned, so the caller proceeds to overwrite without a Version. The prior
79
+ * content retained on success is unlimited in count (Requirement 12.1).
80
+ */
81
+ async snapshot(key) {
82
+ try {
83
+ if (this.native !== undefined) {
84
+ return await this.native.snapshot(key);
85
+ }
86
+ const current = await this.driver.get(key);
87
+ if (!current.found) {
88
+ // Nothing to snapshot: first write to this key creates no Version.
89
+ return null;
90
+ }
91
+ const versionId = randomUUID();
92
+ await this.driver.put(this.versionKey(key, versionId), current.bytes, toWriteMetadata(current.metadata));
93
+ return versionId;
94
+ }
95
+ catch {
96
+ // Requirement 12.5: a versioning failure allows the overwrite to proceed
97
+ // WITHOUT creating a Version. Never propagate the error to the write path.
98
+ return null;
99
+ }
100
+ }
101
+ /**
102
+ * Return the {@link VersionInfo} descriptors of the retained Versions for
103
+ * `key` (Requirement 12.2). For the simulated path the reserved version prefix
104
+ * is listed and each version's `size`/`checksum`/`createdAt` is read from its
105
+ * stored metadata; entries are returned oldest-first by creation time. Only
106
+ * direct Versions of `key` are included — copies belonging to a deeper key
107
+ * that merely shares this key's prefix are excluded.
108
+ */
109
+ async listVersions(key) {
110
+ if (this.native !== undefined) {
111
+ return this.native.list(key);
112
+ }
113
+ const prefix = this.versionPrefix(key);
114
+ const items = await this.driver.list(prefix);
115
+ const versions = [];
116
+ for (const item of items) {
117
+ const versionId = item.key.slice(prefix.length);
118
+ // Skip copies belonging to a deeper key (e.g. Versions of "a/b" when
119
+ // listing Versions of "a"); a direct Version id contains no delimiter.
120
+ if (versionId === "" || versionId.includes("/")) {
121
+ continue;
122
+ }
123
+ const metadata = await this.driver.stat(item.key);
124
+ if (metadata === null) {
125
+ continue;
126
+ }
127
+ versions.push({
128
+ versionId,
129
+ size: metadata.size,
130
+ createdAt: metadata.createdAt,
131
+ checksum: metadata.checksum,
132
+ });
133
+ }
134
+ versions.sort((a, b) => a.createdAt - b.createdAt);
135
+ return versions;
136
+ }
137
+ /**
138
+ * Make the content of the Version identified by `versionId` the current
139
+ * object content for `key` and return the resulting metadata (Requirement
140
+ * 12.3). For the simulated path the reserved copy is read and written back to
141
+ * `key` with its preserved write-time metadata. The overwrite is performed
142
+ * directly against the driver, so restoring does not itself trigger a new
143
+ * snapshot. Throws {@link NotFoundError} when the Version does not exist.
144
+ */
145
+ async restoreVersion(key, versionId) {
146
+ if (this.native !== undefined) {
147
+ return normalizeMetadata(await this.native.restore(key, versionId));
148
+ }
149
+ const versionKey = this.versionKey(key, versionId);
150
+ const result = await this.driver.get(versionKey);
151
+ if (!result.found) {
152
+ throw new NotFoundError(versionKey, `Version "${versionId}" for key "${key}" was not found.`);
153
+ }
154
+ const metadata = await this.driver.put(key, result.bytes, toWriteMetadata(result.metadata));
155
+ return normalizeMetadata(metadata);
156
+ }
157
+ /**
158
+ * Remove exactly the Version identified by `versionId` for `key` while
159
+ * retaining the remaining Versions (Requirement 12.4). For the simulated path
160
+ * the reserved copy is deleted; deleting a missing Version is an idempotent
161
+ * no-op at the driver level.
162
+ */
163
+ async deleteVersion(key, versionId) {
164
+ if (this.native !== undefined) {
165
+ await this.native.deleteVersion(key, versionId);
166
+ return;
167
+ }
168
+ await this.driver.delete(this.versionKey(key, versionId));
169
+ }
170
+ /** The reserved driver key a simulated Version is persisted under. */
171
+ versionKey(key, versionId) {
172
+ return `${this.versionPrefix(key)}${versionId}`;
173
+ }
174
+ /** The reserved driver key prefix that all simulated Versions of `key` share. */
175
+ versionPrefix(key) {
176
+ return `${VERSION_KEY_PREFIX}${key}/`;
177
+ }
178
+ }
179
+ //# sourceMappingURL=versioning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versioning.js","sourceRoot":"","sources":["../src/versioning.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,137 @@
1
+ {
2
+ "name": "@streetjs/storage",
3
+ "version": "1.0.0",
4
+ "description": "StreetJS unified storage framework: a strongly-typed, plugin-first, driver-based object storage layer with zero-dependency in-memory and filesystem drivers, streaming, validation, metadata, multipart, resumable uploads, signed URLs, versioning, lifecycle, access control, and optional cloud provider integrations (S3, R2, Supabase, GCS, Azure, MinIO, Backblaze) isolated behind optional submodules.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ },
13
+ "./s3": {
14
+ "import": "./dist/drivers/s3.js",
15
+ "types": "./dist/drivers/s3.d.ts"
16
+ },
17
+ "./r2": {
18
+ "import": "./dist/drivers/r2.js",
19
+ "types": "./dist/drivers/r2.d.ts"
20
+ },
21
+ "./supabase": {
22
+ "import": "./dist/drivers/supabase.js",
23
+ "types": "./dist/drivers/supabase.d.ts"
24
+ },
25
+ "./gcs": {
26
+ "import": "./dist/drivers/gcs.js",
27
+ "types": "./dist/drivers/gcs.d.ts"
28
+ },
29
+ "./azure": {
30
+ "import": "./dist/drivers/azure.js",
31
+ "types": "./dist/drivers/azure.d.ts"
32
+ },
33
+ "./minio": {
34
+ "import": "./dist/drivers/minio.js",
35
+ "types": "./dist/drivers/minio.d.ts"
36
+ },
37
+ "./backblaze": {
38
+ "import": "./dist/drivers/backblaze.js",
39
+ "types": "./dist/drivers/backblaze.d.ts"
40
+ },
41
+ "./testing": {
42
+ "import": "./dist/testing/index.js",
43
+ "types": "./dist/testing/index.d.ts"
44
+ }
45
+ },
46
+ "files": [
47
+ "dist/**/*.js",
48
+ "dist/**/*.js.map",
49
+ "dist/**/*.d.ts",
50
+ "dist/**/*.d.ts.map",
51
+ "README.md",
52
+ "CHANGELOG.md",
53
+ "LICENSE"
54
+ ],
55
+ "scripts": {
56
+ "build": "tsc",
57
+ "test": "node --test dist/tests/*.test.js",
58
+ "example": "node dist/examples/storage-demo.js",
59
+ "lint": "tsc --noEmit",
60
+ "clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\""
61
+ },
62
+ "keywords": [
63
+ "streetjs",
64
+ "street-framework",
65
+ "storage",
66
+ "object-storage",
67
+ "file-storage",
68
+ "s3",
69
+ "r2",
70
+ "supabase",
71
+ "gcs",
72
+ "azure",
73
+ "minio",
74
+ "backblaze",
75
+ "signed-url",
76
+ "multipart",
77
+ "streaming",
78
+ "typescript",
79
+ "esm"
80
+ ],
81
+ "author": "street contributors",
82
+ "license": "MIT",
83
+ "homepage": "https://hassanmubiru.github.io/StreetJS/",
84
+ "repository": {
85
+ "type": "git",
86
+ "url": "git+https://github.com/hassanmubiru/StreetJS.git"
87
+ },
88
+ "bugs": {
89
+ "url": "https://github.com/hassanmubiru/StreetJS/issues"
90
+ },
91
+ "dependencies": {
92
+ "streetjs": "^1.0.25"
93
+ },
94
+ "devDependencies": {
95
+ "@types/node": "^25.9.2",
96
+ "fast-check": "^4.8.0",
97
+ "typescript": "^6.0.3"
98
+ },
99
+ "peerDependencies": {
100
+ "typescript": ">=5.0.0",
101
+ "@aws-sdk/client-s3": ">=3.0.0",
102
+ "@aws-sdk/s3-request-presigner": ">=3.0.0",
103
+ "@supabase/supabase-js": ">=2.0.0",
104
+ "@google-cloud/storage": ">=7.0.0",
105
+ "@azure/storage-blob": ">=12.0.0",
106
+ "minio": ">=8.0.0"
107
+ },
108
+ "peerDependenciesMeta": {
109
+ "typescript": {
110
+ "optional": true
111
+ },
112
+ "@aws-sdk/client-s3": {
113
+ "optional": true
114
+ },
115
+ "@aws-sdk/s3-request-presigner": {
116
+ "optional": true
117
+ },
118
+ "@supabase/supabase-js": {
119
+ "optional": true
120
+ },
121
+ "@google-cloud/storage": {
122
+ "optional": true
123
+ },
124
+ "@azure/storage-blob": {
125
+ "optional": true
126
+ },
127
+ "minio": {
128
+ "optional": true
129
+ }
130
+ },
131
+ "engines": {
132
+ "node": ">=22.0.0"
133
+ },
134
+ "publishConfig": {
135
+ "access": "public"
136
+ }
137
+ }