@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,311 @@
1
+ /**
2
+ * @streetjs/storage — {@link S3StorageDriver} (Amazon S3), submodule `./s3`.
3
+ *
4
+ * This module is the concrete Amazon S3 provider driver, exposed only through
5
+ * the optional subpath export `@streetjs/storage/s3` (Requirement 3.3). It is
6
+ * **not** re-exported from the package entry point `src/index.ts`, so importing
7
+ * the base package never pulls in this file or any AWS SDK.
8
+ *
9
+ * ## What this module adds over the base
10
+ *
11
+ * The entire {@link StorageDriver} contract mapping already lives in the shared
12
+ * {@link createS3StyleDriver} / {@link S3StyleDriver} base (task 28.1) built over
13
+ * the structural {@link S3ClientLike}. Amazon S3, Cloudflare R2, MinIO and the
14
+ * Backblaze B2 S3 API differ only in **how the client is built/configured**, not
15
+ * in how the contract is satisfied — so this module contributes only:
16
+ *
17
+ * 1. {@link createS3StorageDriver} — wrap an **injected** {@link S3ClientLike}
18
+ * (the preferred, SDK-free path) as a `name: "s3"` driver by delegating to the
19
+ * base. No AWS SDK is loaded on this path.
20
+ * 2. {@link createS3StorageDriverFromConfig} — construct an {@link S3ClientLike}
21
+ * from `bucket`/`region`/`endpoint`/`credentials` using a **lazy dynamic
22
+ * `import()`** of the AWS SDK performed *inside* the function. The SDK is
23
+ * therefore resolved only when this construction path actually runs, never at
24
+ * module load, keeping the AWS SDK an optional peer concern of the consumer
25
+ * (Requirement 3.1). If the SDK cannot be loaded and no client was injected, a
26
+ * descriptive {@link StorageConfigError} is thrown.
27
+ *
28
+ * ## SDK isolation (Requirements 2.1, 3.3)
29
+ *
30
+ * There is **no top-level `import` of any AWS SDK** in this file — only `streetjs`
31
+ * (for {@link Clock}), this package's own type surface, and the shared base. The
32
+ * `@aws-sdk/client-s3` / `@aws-sdk/s3-request-presigner` packages are declared as
33
+ * **optional peer dependencies** in `package.json`; they are pulled in only by
34
+ * the lazy `import()` inside {@link createS3StorageDriverFromConfig}. The dynamic
35
+ * specifier is held in a variable so the build never statically requires the SDK
36
+ * to be installed.
37
+ *
38
+ * _Requirements: 2.1, 2.3, 3.3_
39
+ */
40
+ import { StorageConfigError } from "../errors.js";
41
+ import { createS3StyleDriver, } from "./s3-base.js";
42
+ /** The stable driver name surfaced as {@link StorageDriver.name} for this driver. */
43
+ const DRIVER_NAME = "s3";
44
+ // ── Public factories ─────────────────────────────────────────────────────────
45
+ /**
46
+ * Wrap an **injected** {@link S3ClientLike} as an Amazon S3 {@link StorageDriver}
47
+ * (`name: "s3"`). This is the preferred path: no AWS SDK is required because the
48
+ * caller supplies the structural client, and the whole {@link StorageDriver}
49
+ * contract is satisfied by the shared base (Requirement 2.3).
50
+ *
51
+ * @throws {StorageConfigError} when `client` is missing or does not implement the
52
+ * mandatory {@link S3ClientLike} object operations. To build a client from
53
+ * credentials instead, use {@link createS3StorageDriverFromConfig}.
54
+ */
55
+ export function createS3StorageDriver(client, options = {}) {
56
+ if (!isS3ClientLike(client)) {
57
+ throw new StorageConfigError('createS3StorageDriver requires an injected S3ClientLike implementing ' +
58
+ 'putObject/getObject/deleteObject/listObjects. Pass a structural client, ' +
59
+ 'or use createS3StorageDriverFromConfig to construct one from credentials ' +
60
+ 'via the optional "@aws-sdk/client-s3" peer dependency.', { provider: DRIVER_NAME });
61
+ }
62
+ return createS3StyleDriver(client, {
63
+ name: DRIVER_NAME,
64
+ clock: options.clock,
65
+ capabilities: options.capabilities,
66
+ });
67
+ }
68
+ /**
69
+ * Construct an Amazon S3 {@link StorageDriver} from connection configuration.
70
+ *
71
+ * When `config.client` is supplied it is wrapped directly (no SDK is loaded).
72
+ * Otherwise this **lazily `import()`s** `@aws-sdk/client-s3` and builds a client
73
+ * over the SDK — the SDK is resolved only here, at construction time, never at
74
+ * module load. If the SDK cannot be loaded, a descriptive {@link StorageConfigError}
75
+ * is thrown so a missing optional peer dependency surfaces clearly rather than as
76
+ * an opaque module-resolution failure (Requirements 2.1, 3.3).
77
+ */
78
+ export async function createS3StorageDriverFromConfig(config) {
79
+ const client = config.client !== undefined && config.client !== null
80
+ ? config.client
81
+ : await buildS3ClientFromSdk(config);
82
+ return createS3StorageDriver(client, {
83
+ clock: config.clock,
84
+ capabilities: config.capabilities,
85
+ });
86
+ }
87
+ // ── Internal: structural client guard ──────────────────────────────────────────
88
+ /**
89
+ * Structural check that `value` implements the mandatory {@link S3ClientLike}
90
+ * object operations. Optional methods (`headObject`, multipart, `presignUrl`) are
91
+ * not required and are feature-detected by the base.
92
+ */
93
+ function isS3ClientLike(value) {
94
+ if (value === null || typeof value !== "object") {
95
+ return false;
96
+ }
97
+ const candidate = value;
98
+ return (typeof candidate.putObject === "function" &&
99
+ typeof candidate.getObject === "function" &&
100
+ typeof candidate.deleteObject === "function" &&
101
+ typeof candidate.listObjects === "function");
102
+ }
103
+ // ── Internal: lazy AWS SDK client construction ─────────────────────────────────
104
+ /**
105
+ * Build an {@link S3ClientLike} over the real AWS SDK, loaded lazily.
106
+ *
107
+ * The SDK module specifiers are held in variables so the TypeScript build never
108
+ * statically resolves (and therefore never requires) the optional peer
109
+ * dependencies. Any load failure is wrapped in a {@link StorageConfigError}.
110
+ */
111
+ async function buildS3ClientFromSdk(config) {
112
+ // Held in a variable so the compiler treats this as a dynamic (untyped) import
113
+ // and does not require "@aws-sdk/client-s3" to be installed to build.
114
+ const clientModuleId = "@aws-sdk/client-s3";
115
+ let sdk;
116
+ try {
117
+ sdk = (await import(clientModuleId));
118
+ }
119
+ catch (cause) {
120
+ throw new StorageConfigError('The AWS SDK ("@aws-sdk/client-s3") is required to construct an S3 client ' +
121
+ "from credentials but could not be loaded. Install it as an optional peer " +
122
+ "dependency, or inject a structural S3ClientLike via createS3StorageDriver.", { provider: DRIVER_NAME, cause });
123
+ }
124
+ const bucket = config.bucket;
125
+ const sdkClient = new sdk.S3Client({
126
+ region: config.region,
127
+ endpoint: config.endpoint,
128
+ forcePathStyle: config.forcePathStyle,
129
+ credentials: config.credentials,
130
+ });
131
+ const commands = sdk;
132
+ const send = (command) => sdkClient.send(command);
133
+ const command = (name, input) => new commands[name](input);
134
+ return {
135
+ async putObject({ key, body, contentType, metadata }) {
136
+ const out = await send(command("PutObjectCommand", {
137
+ Bucket: bucket,
138
+ Key: key,
139
+ Body: body,
140
+ ContentType: contentType,
141
+ Metadata: metadata,
142
+ }));
143
+ return { etag: out.ETag ?? "" };
144
+ },
145
+ async getObject({ key }) {
146
+ let out;
147
+ try {
148
+ out = await send(command("GetObjectCommand", { Bucket: bucket, Key: key }));
149
+ }
150
+ catch (error) {
151
+ if (isNotFound(error)) {
152
+ return null;
153
+ }
154
+ throw error;
155
+ }
156
+ return {
157
+ body: await collectBody(out.Body),
158
+ contentType: out.ContentType,
159
+ etag: out.ETag,
160
+ size: out.ContentLength,
161
+ lastModified: toEpochMs(out.LastModified),
162
+ metadata: out.Metadata,
163
+ };
164
+ },
165
+ async deleteObject({ key }) {
166
+ await send(command("DeleteObjectCommand", { Bucket: bucket, Key: key }));
167
+ },
168
+ async listObjects({ prefix, limit, cursor }) {
169
+ const out = await send(command("ListObjectsV2Command", {
170
+ Bucket: bucket,
171
+ Prefix: prefix,
172
+ MaxKeys: limit,
173
+ ContinuationToken: cursor,
174
+ }));
175
+ const contents = out.Contents ?? [];
176
+ const items = [];
177
+ for (const entry of contents) {
178
+ if (entry.Key === undefined) {
179
+ continue;
180
+ }
181
+ items.push({
182
+ key: entry.Key,
183
+ size: entry.Size ?? 0,
184
+ updatedAt: toEpochMs(entry.LastModified) ?? 0,
185
+ });
186
+ }
187
+ return items;
188
+ },
189
+ async headObject({ key }) {
190
+ let out;
191
+ try {
192
+ out = await send(command("HeadObjectCommand", { Bucket: bucket, Key: key }));
193
+ }
194
+ catch (error) {
195
+ if (isNotFound(error)) {
196
+ return null;
197
+ }
198
+ throw error;
199
+ }
200
+ return {
201
+ contentType: out.ContentType,
202
+ etag: out.ETag,
203
+ size: out.ContentLength,
204
+ lastModified: toEpochMs(out.LastModified),
205
+ metadata: out.Metadata,
206
+ };
207
+ },
208
+ async createMultipartUpload({ key, contentType, metadata }) {
209
+ const out = await send(command("CreateMultipartUploadCommand", {
210
+ Bucket: bucket,
211
+ Key: key,
212
+ ContentType: contentType,
213
+ Metadata: metadata,
214
+ }));
215
+ return { uploadId: out.UploadId ?? "" };
216
+ },
217
+ async uploadPart({ key, uploadId, partNumber, body }) {
218
+ const out = await send(command("UploadPartCommand", {
219
+ Bucket: bucket,
220
+ Key: key,
221
+ UploadId: uploadId,
222
+ PartNumber: partNumber,
223
+ Body: body,
224
+ }));
225
+ return { etag: out.ETag ?? "" };
226
+ },
227
+ async completeMultipartUpload({ key, uploadId, parts }) {
228
+ const out = await send(command("CompleteMultipartUploadCommand", {
229
+ Bucket: bucket,
230
+ Key: key,
231
+ UploadId: uploadId,
232
+ MultipartUpload: {
233
+ Parts: parts.map((part) => ({ PartNumber: part.partNumber, ETag: part.etag })),
234
+ },
235
+ }));
236
+ return { etag: out.ETag ?? "" };
237
+ },
238
+ async abortMultipartUpload({ key, uploadId }) {
239
+ await send(command("AbortMultipartUploadCommand", {
240
+ Bucket: bucket,
241
+ Key: key,
242
+ UploadId: uploadId,
243
+ }));
244
+ },
245
+ async presignUrl({ key, op, expiresInMs }) {
246
+ // Held in a variable for the same lazy, build-independent reason as above.
247
+ const presignModuleId = "@aws-sdk/s3-request-presigner";
248
+ let presigner;
249
+ try {
250
+ presigner = (await import(presignModuleId));
251
+ }
252
+ catch (cause) {
253
+ throw new StorageConfigError('The AWS SDK presigner ("@aws-sdk/s3-request-presigner") is required to ' +
254
+ "mint presigned URLs but could not be loaded. Install it as an optional " +
255
+ "peer dependency.", { provider: DRIVER_NAME, cause });
256
+ }
257
+ const commandName = op === "PUT"
258
+ ? "PutObjectCommand"
259
+ : op === "DELETE"
260
+ ? "DeleteObjectCommand"
261
+ : "GetObjectCommand";
262
+ return presigner.getSignedUrl(sdkClient, command(commandName, { Bucket: bucket, Key: key }), {
263
+ expiresIn: Math.max(1, Math.round(expiresInMs / 1000)),
264
+ });
265
+ },
266
+ };
267
+ }
268
+ /** Convert an SDK `Date` (or `undefined`) to epoch ms. */
269
+ function toEpochMs(date) {
270
+ return date instanceof Date ? date.getTime() : undefined;
271
+ }
272
+ /**
273
+ * Detect the SDK's "object does not exist" signals so a missing key maps to the
274
+ * base's `null` convention rather than a thrown error.
275
+ */
276
+ function isNotFound(error) {
277
+ if (error === null || typeof error !== "object") {
278
+ return false;
279
+ }
280
+ const err = error;
281
+ return (err.name === "NoSuchKey" ||
282
+ err.name === "NotFound" ||
283
+ err.Code === "NoSuchKey" ||
284
+ err.$metadata?.httpStatusCode === 404);
285
+ }
286
+ /**
287
+ * Collect an SDK response body into a `Uint8Array`. Prefers the SDK's
288
+ * `transformToByteArray()` helper and falls back to async iteration for stream
289
+ * bodies.
290
+ */
291
+ async function collectBody(body) {
292
+ if (body === null || body === undefined) {
293
+ return new Uint8Array(0);
294
+ }
295
+ const maybe = body;
296
+ if (typeof maybe.transformToByteArray === "function") {
297
+ return new Uint8Array(await maybe.transformToByteArray());
298
+ }
299
+ if (typeof maybe[Symbol.asyncIterator] === "function") {
300
+ const chunks = [];
301
+ for await (const chunk of body) {
302
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
303
+ }
304
+ return new Uint8Array(Buffer.concat(chunks));
305
+ }
306
+ if (body instanceof Uint8Array) {
307
+ return body.slice();
308
+ }
309
+ return new Uint8Array(0);
310
+ }
311
+ //# sourceMappingURL=s3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3.js","sourceRoot":"","sources":["../../src/drivers/s3.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,246 @@
1
+ /**
2
+ * @streetjs/storage — SupabaseStorageDriver (submodule `@streetjs/storage/supabase`).
3
+ *
4
+ * Supabase Storage is **not** an S3-wire-compatible provider — its SDK exposes a
5
+ * bucket-scoped file API (`storage.from(bucket).upload/download/remove/list/info`)
6
+ * rather than the `putObject`/`getObject` verbs the S3-style base is built on. So,
7
+ * unlike `s3.ts`/`r2.ts`/`minio.ts`/`backblaze.ts`, this driver does **not**
8
+ * extend the shared S3 base ({@link ../drivers/s3-base}); it maps the
9
+ * {@link StorageDriver} contract directly onto a purpose-built structural
10
+ * {@link SupabaseStorageClientLike} that mirrors just the Supabase Storage calls
11
+ * it needs.
12
+ *
13
+ * ## Two ways to obtain a driver
14
+ *
15
+ * - {@link createSupabaseStorageDriver} wraps an **already-constructed,
16
+ * injected** {@link SupabaseStorageClientLike} and returns a driver
17
+ * synchronously. This is the SDK-free path: no provider SDK is touched, so it
18
+ * is fully testable with an in-memory fake and needs no `@supabase/supabase-js`
19
+ * install.
20
+ * - {@link connectSupabaseStorageDriver} **builds its own client** from Supabase
21
+ * connection config. It resolves `@supabase/supabase-js` through a **lazy
22
+ * dynamic `import()` performed inside the function** (never at module top
23
+ * level), so the optional peer dependency is only required when this path is
24
+ * actually used. If the SDK is not installed and no client was injected, it
25
+ * throws {@link StorageConfigError} (provider `"supabase"`, Requirement 1.5).
26
+ *
27
+ * ## Capability delegation (Requirement 2.3)
28
+ *
29
+ * The driver implements only the **mandatory primitives** (`put`/`get`/`exists`/
30
+ * `delete`/`stat`/`list`/`putStream`/`getStream`), producing every
31
+ * {@link StorageObjectMetadata} through the shared metadata layer
32
+ * ({@link buildObjectMetadata}) so the field set is identical to Memory/Local/S3,
33
+ * and reporting a missing key consistently ({@link MaybeObject} `{ found: false }`
34
+ * for `get`, `null` for `stat`, {@link NotFoundError} for `getStream`). Advanced
35
+ * capabilities (`multipart`/`resumable`/`versioning`/`signedUrl`/`lifecycle`) are
36
+ * intentionally left `undefined` so the facade simulates them over the
37
+ * primitives, keeping behavior identical across providers.
38
+ *
39
+ * ## SDK isolation (Requirements 2.1, 3.3)
40
+ *
41
+ * This module imports **no provider SDK at the top level** — only Node built-ins,
42
+ * `streetjs` (for the injected {@link Clock}), and this package's own type
43
+ * surface. `@supabase/supabase-js` is referenced solely via a dynamic `import()`
44
+ * with a non-literal specifier inside {@link connectSupabaseStorageDriver}, so
45
+ * `tsc` never requires the SDK to be present and `streetjs` stays the only
46
+ * runtime dependency. This driver is a submodule-only export
47
+ * (`./supabase` → `dist/drivers/supabase.js`); it is intentionally not
48
+ * re-exported from the package's main `index.ts`.
49
+ *
50
+ * _Requirements: 2.1, 2.3, 3.3_
51
+ */
52
+ import { type Clock } from "streetjs";
53
+ import type { MaybeObject, NodeReadable, StorageDriver } from "../driver.js";
54
+ import type { ListOptions, StorageListItem, StorageObjectMetadata, WriteMetadata } from "../types.js";
55
+ /** Input to {@link SupabaseStorageClientLike.upload}. */
56
+ export interface SupabaseUploadInput {
57
+ /** The object path (key) within the bucket. */
58
+ readonly path: string;
59
+ /** The bytes to store. */
60
+ readonly body: Uint8Array;
61
+ /** Declared content type, mapped to Supabase's `contentType` upload option. */
62
+ readonly contentType?: string;
63
+ /** Custom metadata (string→string) to persist; used to round-trip the field set. */
64
+ readonly metadata?: Record<string, string>;
65
+ /** Whether to overwrite an existing object at `path` (Supabase `upsert`). */
66
+ readonly upsert?: boolean;
67
+ }
68
+ /** Result of {@link SupabaseStorageClientLike.upload}. */
69
+ export interface SupabaseUploadResult {
70
+ /** The object's entity tag, when the service returns one. */
71
+ readonly etag?: string;
72
+ }
73
+ /**
74
+ * Object attributes as surfaced by Supabase Storage (`info(path)` / `list`
75
+ * entries). Every field is optional and loosely typed because Supabase returns
76
+ * timestamps as ISO-8601 strings and nests size/mimetype/user metadata under a
77
+ * `metadata` map; the driver normalizes them. Caller-supplied user metadata lives
78
+ * under the nested {@link userMetadata} map (Supabase's custom "metadata").
79
+ */
80
+ export interface SupabaseObjectInfo {
81
+ /** Byte length. Supabase may return this as a number or numeric string. */
82
+ readonly size?: number | string;
83
+ /** Declared content type / mimetype. */
84
+ readonly contentType?: string;
85
+ /** Entity tag, when present. */
86
+ readonly etag?: string;
87
+ /** Creation time as an ISO-8601 string. */
88
+ readonly createdAt?: string;
89
+ /** Last-updated time as an ISO-8601 string. */
90
+ readonly updatedAt?: string;
91
+ /** Caller-supplied custom metadata (string→string). */
92
+ readonly userMetadata?: Record<string, string>;
93
+ }
94
+ /** A single object entry returned by {@link SupabaseStorageClientLike.list}. */
95
+ export interface SupabaseListEntry {
96
+ /** The object path (full key). */
97
+ readonly name: string;
98
+ /** Byte length of the object, when the listing includes it. */
99
+ readonly size?: number | string;
100
+ /** Last-updated time as an ISO-8601 string, when the listing includes it. */
101
+ readonly updatedAt?: string;
102
+ }
103
+ /** Options accepted by {@link SupabaseStorageClientLike.list}. */
104
+ export interface SupabaseListInput {
105
+ /** Only list objects whose path begins with this prefix. */
106
+ readonly prefix: string;
107
+ /** Best-effort maximum number of results the caller wants. */
108
+ readonly limit?: number;
109
+ }
110
+ /**
111
+ * The **minimal, bucket-scoped structural interface** this driver depends on.
112
+ *
113
+ * It describes just the Supabase Storage operations the driver needs — never any
114
+ * concrete `@supabase/supabase-js` type — so the SDK stays an optional peer
115
+ * concern of the consumer (Requirement 3.1). `download`/`info` return `null` for
116
+ * a missing object so not-found maps to the contract's consistent semantics
117
+ * rather than a thrown error.
118
+ */
119
+ export interface SupabaseStorageClientLike {
120
+ /** Store `body` under `path` with optional content type and custom metadata. */
121
+ upload(input: SupabaseUploadInput): Promise<SupabaseUploadResult>;
122
+ /** Download the object's bytes, or `null` when it does not exist. */
123
+ download(path: string): Promise<Uint8Array | null>;
124
+ /** Remove the object at `path` (a no-op when it is already absent). */
125
+ remove(path: string): Promise<void>;
126
+ /** Report whether an object exists at `path`. */
127
+ exists(path: string): Promise<boolean>;
128
+ /** Fetch the object's attributes, or `null` when it does not exist. */
129
+ info(path: string): Promise<SupabaseObjectInfo | null>;
130
+ /** List objects whose path begins with `input.prefix`. */
131
+ list(input: SupabaseListInput): Promise<readonly SupabaseListEntry[]>;
132
+ }
133
+ /**
134
+ * Options for the Supabase driver. The provider name is fixed to `"supabase"`
135
+ * and is not caller-configurable, so provider identity stays stable.
136
+ */
137
+ export interface SupabaseStorageDriverOptions {
138
+ /** Injected clock for deterministic timestamps in tests. Default `systemClock`. */
139
+ readonly clock?: Clock;
140
+ }
141
+ /**
142
+ * Maps the {@link StorageDriver} contract onto an injected
143
+ * {@link SupabaseStorageClientLike}.
144
+ *
145
+ * Object identity fields (`etag`/`checksum`/`size`) and timestamps are computed
146
+ * locally at write time — the checksum/etag are the sha-256 hex digest of the
147
+ * stored bytes, the size is the byte length, and timestamps come from the
148
+ * injected {@link Clock} — then encoded into the object's custom metadata so they
149
+ * round-trip on read. Advanced capabilities are left `undefined` for facade
150
+ * simulation.
151
+ */
152
+ export declare class SupabaseStorageDriver implements StorageDriver {
153
+ /** Stable driver name. */
154
+ readonly name = "supabase";
155
+ private readonly client;
156
+ private readonly clock;
157
+ constructor(client: SupabaseStorageClientLike, options?: SupabaseStorageDriverOptions);
158
+ /**
159
+ * Store `bytes` under `key`, computing size and sha-256 checksum locally and
160
+ * taking timestamps from the injected clock. When overwriting, the original
161
+ * `createdAt` is preserved (a preceding attribute read). The typed metadata is
162
+ * encoded into the object's custom-metadata map so it round-trips on read
163
+ * (Requirements 4.1, 10.1, 10.2).
164
+ */
165
+ put(key: string, bytes: Uint8Array, metadata: WriteMetadata): Promise<StorageObjectMetadata>;
166
+ /**
167
+ * Read the object at `key`, returning a discriminated {@link MaybeObject} so
168
+ * absence is reported rather than thrown (Requirements 4.2, 2.4). Metadata is
169
+ * rebuilt from the object's attributes and encoded custom metadata via the
170
+ * shared metadata layer.
171
+ */
172
+ get(key: string): Promise<MaybeObject>;
173
+ /** Report whether an object is stored under `key` (Requirement 4.3). */
174
+ exists(key: string): Promise<boolean>;
175
+ /** Delete the object at `key`; deleting a missing key is a no-op (Requirement 4.4). */
176
+ delete(key: string): Promise<void>;
177
+ /**
178
+ * Return the metadata for `key` without its content, or `null` when absent
179
+ * (Requirement 4.10).
180
+ */
181
+ stat(key: string): Promise<StorageObjectMetadata | null>;
182
+ /**
183
+ * List objects whose key begins with `prefix`, sorted by key for deterministic
184
+ * ordering (Requirement 4.9). Honors optional `cursor` (exclusive resume
185
+ * point) and `limit`.
186
+ */
187
+ list(prefix: string, options?: ListOptions): Promise<StorageListItem[]>;
188
+ /**
189
+ * Consume a Node {@link Readable} and persist the assembled bytes under `key`
190
+ * with the same computed metadata as {@link put} (Requirement 5.1). Chunks are
191
+ * drained through a `pipeline` (correct backpressure and error propagation),
192
+ * then handed to {@link put}.
193
+ */
194
+ putStream(key: string, stream: NodeReadable, metadata: WriteMetadata): Promise<StorageObjectMetadata>;
195
+ /**
196
+ * Return a Node {@link Readable} of the stored bytes at `key` (Requirement
197
+ * 5.2). Throws {@link NotFoundError} for a missing key (Requirement 5.5).
198
+ */
199
+ getStream(key: string): Promise<NodeReadable>;
200
+ /**
201
+ * Rebuild the typed {@link StorageObjectMetadata} field set from the object's
202
+ * attributes and the encoded custom-metadata map, applying the shared layer's
203
+ * canonical defaults. Provider-supplied values are used as best-effort
204
+ * fallbacks when the encoded fields are absent (e.g. an object written outside
205
+ * this driver): `etag`/`createdAt`/`updatedAt` back-fill the identity/timestamp
206
+ * fields, keeping the shape consistent across providers.
207
+ */
208
+ private decodeMeta;
209
+ }
210
+ /**
211
+ * Wrap an injected {@link SupabaseStorageClientLike} as a Supabase driver.
212
+ * Synchronous and SDK-free: the caller supplies the client, so no provider SDK
213
+ * is resolved here.
214
+ *
215
+ * @throws {StorageConfigError} when no client is injected — use
216
+ * {@link connectSupabaseStorageDriver} to build a client from connection
217
+ * options instead.
218
+ */
219
+ export declare function createSupabaseStorageDriver(client: SupabaseStorageClientLike, options?: SupabaseStorageDriverOptions): StorageDriver;
220
+ /**
221
+ * Connection configuration for {@link connectSupabaseStorageDriver}. `url` and
222
+ * `key` are forwarded to `createClient`; `bucket` scopes the resulting storage
223
+ * client.
224
+ */
225
+ export interface SupabaseStorageConfig extends SupabaseStorageDriverOptions {
226
+ /** The Supabase project URL (required). */
227
+ readonly url: string;
228
+ /** The Supabase API key — service-role or anon (required). */
229
+ readonly key: string;
230
+ /** The Supabase Storage bucket the driver operates within (required). */
231
+ readonly bucket: string;
232
+ }
233
+ /**
234
+ * Build a Supabase driver that owns its client, resolving `@supabase/supabase-js`
235
+ * lazily.
236
+ *
237
+ * The SDK is loaded through a dynamic `import()` with a non-literal specifier so
238
+ * it is never a static/top-level dependency: `tsc` does not require it to be
239
+ * installed, and it is only resolved when this function runs. When the SDK
240
+ * cannot be resolved, a {@link StorageConfigError} is thrown (Requirement 1.5) —
241
+ * callers that cannot install the SDK should use
242
+ * {@link createSupabaseStorageDriver} with their own
243
+ * {@link SupabaseStorageClientLike} instead.
244
+ */
245
+ export declare function connectSupabaseStorageDriver(config: SupabaseStorageConfig): Promise<StorageDriver>;
246
+ //# sourceMappingURL=supabase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/drivers/supabase.ts"],"names":[],"mappings":"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"}