@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,289 @@
1
+ // Unit tests for the shared S3-style driver base and the S3ClientLike contract
2
+ // (task 28.1). A fake in-memory S3ClientLike stands in for a provider SDK so the
3
+ // base can be exercised with no external service and no SDK dependency.
4
+ //
5
+ // Coverage:
6
+ // - mandatory primitives put/get/exists/delete/stat/list mapped onto the client
7
+ // - typed metadata round-trips (owner/tenant/accessLevel/custom/contentType),
8
+ // createdAt preserved on overwrite, computed size/checksum
9
+ // - consistent not-found reporting (get -> found:false, stat -> null,
10
+ // getStream -> NotFoundError)
11
+ // - streaming round-trip via putStream/getStream
12
+ // - native multipart delegation when the client exposes the method set; absent
13
+ // otherwise (facade would simulate)
14
+ // - versioning/lifecycle/signedUrl delegated only when injected via options
15
+ // - the shared driver contract-conformance suite passes against the base
16
+ //
17
+ // Requirements: 2.3, 3.1, 3.3
18
+ import test from "node:test";
19
+ import assert from "node:assert/strict";
20
+ import { S3StyleDriver, createS3StyleDriver, } from "../drivers/s3-base.js";
21
+ import { NotFoundError } from "../errors.js";
22
+ import { registerStorageDriverContractTests } from "./contract.js";
23
+ const FIXED_NOW = 1_700_000_000_000;
24
+ const fixedClock = () => FIXED_NOW;
25
+ function bytes(str) {
26
+ return new TextEncoder().encode(str);
27
+ }
28
+ /**
29
+ * A minimal in-memory S3ClientLike. `withMultipart` toggles whether the native
30
+ * multipart method set is present so we can assert conditional capability
31
+ * wiring.
32
+ */
33
+ function makeFakeClient({ withMultipart = false } = {}) {
34
+ const objects = new Map(); // key -> { body, contentType, metadata }
35
+ const uploads = new Map(); // uploadId -> { key, metadata, parts: Map<number, body> }
36
+ let uploadCounterSeed = 0;
37
+ const client = {
38
+ async putObject({ key, body, contentType, metadata }) {
39
+ objects.set(key, {
40
+ body: body.slice(),
41
+ contentType,
42
+ metadata: metadata ? { ...metadata } : undefined,
43
+ });
44
+ return { etag: `"${key}-etag"` };
45
+ },
46
+ async getObject({ key }) {
47
+ const obj = objects.get(key);
48
+ if (obj === undefined) {
49
+ return null;
50
+ }
51
+ return {
52
+ body: obj.body.slice(),
53
+ contentType: obj.contentType,
54
+ etag: `"${key}-etag"`,
55
+ size: obj.body.byteLength,
56
+ lastModified: FIXED_NOW,
57
+ metadata: obj.metadata,
58
+ };
59
+ },
60
+ async headObject({ key }) {
61
+ const obj = objects.get(key);
62
+ if (obj === undefined) {
63
+ return null;
64
+ }
65
+ return {
66
+ contentType: obj.contentType,
67
+ etag: `"${key}-etag"`,
68
+ size: obj.body.byteLength,
69
+ lastModified: FIXED_NOW,
70
+ metadata: obj.metadata,
71
+ };
72
+ },
73
+ async deleteObject({ key }) {
74
+ objects.delete(key);
75
+ },
76
+ async listObjects({ prefix }) {
77
+ return [...objects.entries()]
78
+ .filter(([key]) => key.startsWith(prefix))
79
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
80
+ .map(([key, obj]) => ({ key, size: obj.body.byteLength, updatedAt: FIXED_NOW }));
81
+ },
82
+ };
83
+ if (withMultipart) {
84
+ client.createMultipartUpload = async ({ key, contentType, metadata }) => {
85
+ const uploadId = `upload-${(uploadCounterSeed += 1)}`;
86
+ uploads.set(uploadId, { key, contentType, metadata, parts: new Map() });
87
+ return { uploadId };
88
+ };
89
+ client.uploadPart = async ({ uploadId, partNumber, body }) => {
90
+ uploads.get(uploadId).parts.set(partNumber, body.slice());
91
+ return { etag: `"${uploadId}-${partNumber}"` };
92
+ };
93
+ client.completeMultipartUpload = async ({ uploadId, parts }) => {
94
+ const session = uploads.get(uploadId);
95
+ const ordered = [...parts].sort((a, b) => a.partNumber - b.partNumber);
96
+ const buffers = ordered.map((p) => Buffer.from(session.parts.get(p.partNumber)));
97
+ const body = new Uint8Array(Buffer.concat(buffers));
98
+ objects.set(session.key, {
99
+ body,
100
+ contentType: session.contentType,
101
+ metadata: session.metadata,
102
+ });
103
+ uploads.delete(uploadId);
104
+ return { etag: `"${session.key}-etag"` };
105
+ };
106
+ client.abortMultipartUpload = async ({ uploadId }) => {
107
+ uploads.delete(uploadId);
108
+ };
109
+ }
110
+ return { client, objects, uploads };
111
+ }
112
+ function makeDriver(opts = {}) {
113
+ const { client } = makeFakeClient(opts);
114
+ return createS3StyleDriver(client, { clock: fixedClock, name: "s3", ...opts.driverOptions });
115
+ }
116
+ // ── primitives ────────────────────────────────────────────────────────────────
117
+ test("put returns typed metadata with computed size/checksum and defaults", async () => {
118
+ const driver = makeDriver();
119
+ const content = bytes("hello world");
120
+ const meta = await driver.put("greetings/hello.txt", content, {});
121
+ assert.equal(meta.key, "greetings/hello.txt");
122
+ assert.equal(meta.size, content.byteLength);
123
+ assert.match(meta.checksum, /^[0-9a-f]{64}$/);
124
+ assert.equal(meta.contentType, "application/octet-stream");
125
+ assert.equal(meta.accessLevel, "private");
126
+ assert.deepEqual(meta.custom, {});
127
+ assert.equal(meta.createdAt, FIXED_NOW);
128
+ assert.equal(meta.updatedAt, FIXED_NOW);
129
+ });
130
+ test("get round-trips bytes and typed metadata across the client boundary", async () => {
131
+ const driver = makeDriver();
132
+ const content = bytes("the quick brown fox");
133
+ await driver.put("docs/fox.txt", content, {
134
+ contentType: "text/plain",
135
+ owner: "user-1",
136
+ tenant: "tenant-a",
137
+ accessLevel: "public",
138
+ custom: { label: "invoice" },
139
+ });
140
+ const result = await driver.get("docs/fox.txt");
141
+ assert.equal(result.found, true);
142
+ assert.deepEqual(result.bytes, content);
143
+ assert.equal(result.metadata.contentType, "text/plain");
144
+ assert.equal(result.metadata.owner, "user-1");
145
+ assert.equal(result.metadata.tenant, "tenant-a");
146
+ assert.equal(result.metadata.accessLevel, "public");
147
+ assert.deepEqual(result.metadata.custom, { label: "invoice" });
148
+ });
149
+ test("get preserves arbitrary binary bytes without mutation", async () => {
150
+ const driver = makeDriver();
151
+ const content = new Uint8Array([0, 255, 1, 254, 127, 128]);
152
+ await driver.put("bin/data", content, {});
153
+ const result = await driver.get("bin/data");
154
+ assert.equal(result.found, true);
155
+ assert.deepEqual(result.bytes, content);
156
+ });
157
+ test("exists reflects presence via the client", async () => {
158
+ const driver = makeDriver();
159
+ await driver.put("present.txt", bytes("here"), {});
160
+ assert.equal(await driver.exists("present.txt"), true);
161
+ assert.equal(await driver.exists("absent.txt"), false);
162
+ });
163
+ test("delete removes visibility", async () => {
164
+ const driver = makeDriver();
165
+ await driver.put("temp/file.txt", bytes("bye"), {});
166
+ await driver.delete("temp/file.txt");
167
+ assert.equal(await driver.exists("temp/file.txt"), false);
168
+ const result = await driver.get("temp/file.txt");
169
+ assert.equal(result.found, false);
170
+ });
171
+ test("stat returns metadata without content and null for a missing key", async () => {
172
+ const driver = makeDriver();
173
+ await driver.put("stat/key.txt", bytes("stat me"), { contentType: "text/plain" });
174
+ const meta = await driver.stat("stat/key.txt");
175
+ assert.notEqual(meta, null);
176
+ assert.ok(meta);
177
+ assert.equal(meta.key, "stat/key.txt");
178
+ assert.equal(meta.contentType, "text/plain");
179
+ assert.equal(meta.bytes, undefined);
180
+ assert.equal(await driver.stat("no/such/key"), null);
181
+ });
182
+ test("list returns prefix-matching items with size and updatedAt", async () => {
183
+ const driver = makeDriver();
184
+ await driver.put("photos/b.png", bytes("bb"), {});
185
+ await driver.put("photos/a.png", bytes("a"), {});
186
+ await driver.put("docs/readme.md", bytes("doc"), {});
187
+ const items = await driver.list("photos/");
188
+ assert.deepEqual(items.map((item) => item.key), ["photos/a.png", "photos/b.png"]);
189
+ assert.equal(items[0].size, 1);
190
+ assert.equal(items[0].updatedAt, FIXED_NOW);
191
+ });
192
+ // ── createdAt preservation on overwrite ────────────────────────────────────────
193
+ test("overwrite preserves createdAt and advances updatedAt", async () => {
194
+ let now = 1000;
195
+ const { client } = makeFakeClient();
196
+ const driver = createS3StyleDriver(client, { clock: () => now });
197
+ const first = await driver.put("k", bytes("v1"), {});
198
+ assert.equal(first.createdAt, 1000);
199
+ now = 2000;
200
+ const second = await driver.put("k", bytes("v2-longer"), {});
201
+ assert.equal(second.createdAt, 1000, "createdAt must be preserved on overwrite");
202
+ assert.equal(second.updatedAt, 2000, "updatedAt must advance");
203
+ });
204
+ // ── not-found semantics ────────────────────────────────────────────────────────
205
+ test("get on a missing key reports found:false (not an error)", async () => {
206
+ const driver = makeDriver();
207
+ const result = await driver.get("missing");
208
+ assert.equal(result.found, false);
209
+ });
210
+ test("getStream on a missing key throws NotFoundError", async () => {
211
+ const driver = makeDriver();
212
+ await assert.rejects(() => driver.getStream("missing"), NotFoundError);
213
+ });
214
+ // ── streaming ──────────────────────────────────────────────────────────────────
215
+ test("putStream + getStream round-trips content", async () => {
216
+ const { Readable } = await import("node:stream");
217
+ const driver = makeDriver();
218
+ const content = bytes("streamed content across chunks");
219
+ await driver.putStream("stream/file.txt", Readable.from([Buffer.from(content.slice(0, 10)), Buffer.from(content.slice(10))]), { contentType: "text/plain" });
220
+ const stream = await driver.getStream("stream/file.txt");
221
+ const chunks = [];
222
+ for await (const chunk of stream) {
223
+ chunks.push(Buffer.from(chunk));
224
+ }
225
+ assert.deepEqual(new Uint8Array(Buffer.concat(chunks)), content);
226
+ });
227
+ // ── capability delegation ───────────────────────────────────────────────────────
228
+ test("multipart capability is undefined when the client lacks multipart methods", () => {
229
+ const { client } = makeFakeClient({ withMultipart: false });
230
+ const driver = createS3StyleDriver(client);
231
+ assert.equal(driver.multipart, undefined);
232
+ });
233
+ test("multipart capability is wired and assembles parts when the client supports it", async () => {
234
+ const { client } = makeFakeClient({ withMultipart: true });
235
+ const driver = createS3StyleDriver(client, { clock: fixedClock });
236
+ assert.notEqual(driver.multipart, undefined);
237
+ const mp = driver.multipart;
238
+ const uploadId = await mp.create("big/file.bin", { contentType: "text/plain" });
239
+ const p1 = await mp.uploadPart(uploadId, 1, bytes("part-one-"));
240
+ const p2 = await mp.uploadPart(uploadId, 2, bytes("part-two"));
241
+ const meta = await mp.complete(uploadId, [p1, p2]);
242
+ assert.equal(meta.key, "big/file.bin");
243
+ const result = await driver.get("big/file.bin");
244
+ assert.equal(result.found, true);
245
+ assert.deepEqual(result.bytes, bytes("part-one-part-two"));
246
+ });
247
+ test("multipart abort discards the upload without creating an object", async () => {
248
+ const { client } = makeFakeClient({ withMultipart: true });
249
+ const driver = createS3StyleDriver(client, { clock: fixedClock });
250
+ const mp = driver.multipart;
251
+ const uploadId = await mp.create("aborted/file.bin", {});
252
+ await mp.uploadPart(uploadId, 1, bytes("data"));
253
+ await mp.abort(uploadId);
254
+ assert.equal(await driver.exists("aborted/file.bin"), false);
255
+ });
256
+ test("versioning/lifecycle/signedUrl are undefined unless injected", () => {
257
+ const { client } = makeFakeClient();
258
+ const bare = createS3StyleDriver(client);
259
+ assert.equal(bare.versioning, undefined);
260
+ assert.equal(bare.lifecycle, undefined);
261
+ assert.equal(bare.signedUrl, undefined);
262
+ });
263
+ test("native versioning/lifecycle/signedUrl capabilities are delegated when injected", () => {
264
+ const { client } = makeFakeClient();
265
+ const versioning = { snapshot: async () => null, list: async () => [], restore: async () => ({}), deleteVersion: async () => { } };
266
+ const lifecycle = { apply: async () => [] };
267
+ const signedUrl = { sign: async () => "url", verify: () => ({ valid: true }) };
268
+ const driver = createS3StyleDriver(client, {
269
+ capabilities: { versioning, lifecycle, signedUrl },
270
+ });
271
+ assert.equal(driver.versioning, versioning);
272
+ assert.equal(driver.lifecycle, lifecycle);
273
+ assert.equal(driver.signedUrl, signedUrl);
274
+ });
275
+ test("driver name defaults to s3 and is configurable", () => {
276
+ const { client } = makeFakeClient();
277
+ assert.equal(createS3StyleDriver(client).name, "s3");
278
+ assert.equal(createS3StyleDriver(client, { name: "r2" }).name, "r2");
279
+ });
280
+ test("S3StyleDriver class is exported and constructible", async () => {
281
+ const { client } = makeFakeClient();
282
+ const driver = new S3StyleDriver(client, { clock: fixedClock, name: "minio" });
283
+ assert.equal(driver.name, "minio");
284
+ const meta = await driver.put("x", bytes("y"), {});
285
+ assert.equal(meta.key, "x");
286
+ });
287
+ // ── shared contract-conformance suite ───────────────────────────────────────────
288
+ registerStorageDriverContractTests("s3-base", () => createS3StyleDriver(makeFakeClient().client, { clock: fixedClock }), test);
289
+ //# sourceMappingURL=s3-base.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3-base.test.js","sourceRoot":"","sources":["../../src/tests/s3-base.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=s3-integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3-integration.test.d.ts","sourceRoot":"","sources":["../../src/tests/s3-integration.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,270 @@
1
+ // Integration tests for the S3-compatible cloud drivers (task 28.6): Amazon S3,
2
+ // Cloudflare R2, MinIO, and Backblaze B2. These are *live* provider tests that
3
+ // talk to a real bucket, so they follow the "honest external skipping" policy
4
+ // from Requirement 27 — they never fabricate provider success and never report a
5
+ // skipped provider as passed.
6
+ //
7
+ // Behavior matrix (Requirements 27.2–27.5):
8
+ //
9
+ // • Credentials ABSENT → the test is declared with node:test's
10
+ // test(name, { skip: reason }, ...) so the runner marks it SKIPPED (not
11
+ // passed) and never executes any provider code. This is the normal CI case
12
+ // here: with no credentials the file loads and every provider test skips
13
+ // cleanly, so `node --test dist/tests/*.test.js` stays green. (27.3)
14
+ //
15
+ // • Credentials PRESENT → the test runs against the provider: it constructs the
16
+ // driver from configuration and performs an upload/download/delete
17
+ // round-trip, asserting the downloaded bytes equal the uploaded bytes. (27.2)
18
+ //
19
+ // • Credentials PRESENT but the run cannot proceed for another reason (for
20
+ // example the optional provider SDK is not installed, or the client cannot
21
+ // be constructed) → the running test calls t.skip(reason), which reports it
22
+ // as skipped with a clear message rather than a failure: "passed with a
23
+ // clear skip message". (27.4)
24
+ //
25
+ // • Runner MISCONFIGURED → when a provider's credentials are only *partially*
26
+ // supplied (some required environment variables set, others missing) the
27
+ // configuration is inconsistent. That is a misconfigured runner, so the
28
+ // test FAILS and fails the build rather than silently skipping. (27.5)
29
+ //
30
+ // SDK isolation: this file imports no provider SDK and no driver module at import
31
+ // time. The driver factories (which themselves resolve any optional SDK lazily)
32
+ // are pulled in with a dynamic import() only when credentials are present, so the
33
+ // module always loads even though none of the @aws-sdk / minio peers are
34
+ // installed in this workspace.
35
+ //
36
+ // Requirements: 27.2, 27.3, 27.4, 27.5
37
+ import test from "node:test";
38
+ import assert from "node:assert/strict";
39
+ /**
40
+ * Read the first non-empty value among a list of candidate environment variable
41
+ * names. Returns `undefined` when none are set to a non-empty string.
42
+ */
43
+ function readEnv(names) {
44
+ for (const name of names) {
45
+ const value = process.env[name];
46
+ if (typeof value === "string" && value.trim() !== "") {
47
+ return value;
48
+ }
49
+ }
50
+ return undefined;
51
+ }
52
+ /**
53
+ * Descriptors for every S3-compatible provider under test. Each declares the
54
+ * required credential fields (with their accepted environment-variable names),
55
+ * any optional fields, and an async `connect(values)` that builds a driver from
56
+ * the resolved configuration by lazily importing its submodule.
57
+ */
58
+ const PROVIDERS = [
59
+ {
60
+ label: "S3",
61
+ required: {
62
+ bucket: ["STREETJS_S3_BUCKET"],
63
+ region: ["STREETJS_S3_REGION", "AWS_REGION", "AWS_DEFAULT_REGION"],
64
+ accessKeyId: ["STREETJS_S3_ACCESS_KEY_ID", "AWS_ACCESS_KEY_ID"],
65
+ secretAccessKey: ["STREETJS_S3_SECRET_ACCESS_KEY", "AWS_SECRET_ACCESS_KEY"],
66
+ },
67
+ optional: {
68
+ endpoint: ["STREETJS_S3_ENDPOINT"],
69
+ forcePathStyle: ["STREETJS_S3_FORCE_PATH_STYLE"],
70
+ },
71
+ async connect(v) {
72
+ const { createS3StorageDriverFromConfig } = await import("../drivers/s3.js");
73
+ return createS3StorageDriverFromConfig({
74
+ bucket: v.bucket,
75
+ region: v.region,
76
+ endpoint: v.endpoint,
77
+ // Path-style addressing is required by S3-compatible gateways such as
78
+ // MinIO (which do not support virtual-hosted-style bucket subdomains).
79
+ // Opt-in via STREETJS_S3_FORCE_PATH_STYLE; unset preserves SDK defaults
80
+ // (virtual-hosted-style) for real AWS S3.
81
+ forcePathStyle: v.forcePathStyle !== undefined ? v.forcePathStyle !== "false" : undefined,
82
+ credentials: {
83
+ accessKeyId: v.accessKeyId,
84
+ secretAccessKey: v.secretAccessKey,
85
+ },
86
+ });
87
+ },
88
+ },
89
+ {
90
+ label: "R2",
91
+ required: {
92
+ accountId: ["STREETJS_R2_ACCOUNT_ID", "R2_ACCOUNT_ID"],
93
+ bucket: ["STREETJS_R2_BUCKET", "R2_BUCKET"],
94
+ accessKeyId: ["STREETJS_R2_ACCESS_KEY_ID", "R2_ACCESS_KEY_ID"],
95
+ secretAccessKey: ["STREETJS_R2_SECRET_ACCESS_KEY", "R2_SECRET_ACCESS_KEY"],
96
+ },
97
+ optional: {
98
+ endpoint: ["STREETJS_R2_ENDPOINT", "R2_ENDPOINT"],
99
+ },
100
+ async connect(v) {
101
+ const { connectCloudflareR2Driver } = await import("../drivers/r2.js");
102
+ return connectCloudflareR2Driver({
103
+ accountId: v.accountId,
104
+ bucket: v.bucket,
105
+ accessKeyId: v.accessKeyId,
106
+ secretAccessKey: v.secretAccessKey,
107
+ endpoint: v.endpoint,
108
+ });
109
+ },
110
+ },
111
+ {
112
+ label: "MinIO",
113
+ required: {
114
+ endPoint: ["STREETJS_MINIO_ENDPOINT", "MINIO_ENDPOINT"],
115
+ bucket: ["STREETJS_MINIO_BUCKET", "MINIO_BUCKET"],
116
+ accessKey: ["STREETJS_MINIO_ACCESS_KEY", "MINIO_ACCESS_KEY", "MINIO_ROOT_USER"],
117
+ secretKey: ["STREETJS_MINIO_SECRET_KEY", "MINIO_SECRET_KEY", "MINIO_ROOT_PASSWORD"],
118
+ },
119
+ optional: {
120
+ port: ["STREETJS_MINIO_PORT", "MINIO_PORT"],
121
+ useSSL: ["STREETJS_MINIO_USE_SSL", "MINIO_USE_SSL"],
122
+ region: ["STREETJS_MINIO_REGION", "MINIO_REGION"],
123
+ },
124
+ async connect(v) {
125
+ const { connectMinIODriver } = await import("../drivers/minio.js");
126
+ return connectMinIODriver({
127
+ endPoint: v.endPoint,
128
+ bucket: v.bucket,
129
+ accessKey: v.accessKey,
130
+ secretKey: v.secretKey,
131
+ port: v.port !== undefined ? Number(v.port) : undefined,
132
+ useSSL: v.useSSL !== undefined ? v.useSSL !== "false" : undefined,
133
+ region: v.region,
134
+ });
135
+ },
136
+ },
137
+ {
138
+ label: "Backblaze",
139
+ required: {
140
+ endpoint: ["STREETJS_B2_ENDPOINT", "B2_ENDPOINT"],
141
+ bucket: ["STREETJS_B2_BUCKET", "B2_BUCKET"],
142
+ accessKeyId: ["STREETJS_B2_KEY_ID", "B2_KEY_ID", "B2_APPLICATION_KEY_ID"],
143
+ secretAccessKey: ["STREETJS_B2_APPLICATION_KEY", "B2_APPLICATION_KEY"],
144
+ },
145
+ optional: {
146
+ region: ["STREETJS_B2_REGION", "B2_REGION"],
147
+ },
148
+ async connect(v) {
149
+ const { createBackblazeB2Driver } = await import("../drivers/backblaze.js");
150
+ return createBackblazeB2Driver({
151
+ endpoint: v.endpoint,
152
+ bucket: v.bucket,
153
+ region: v.region,
154
+ credentials: {
155
+ accessKeyId: v.accessKeyId,
156
+ secretAccessKey: v.secretAccessKey,
157
+ },
158
+ });
159
+ },
160
+ },
161
+ ];
162
+ /**
163
+ * Resolve a provider's configuration from the environment and classify the
164
+ * result as one of:
165
+ * - "absent" → none of the required fields are set
166
+ * - "present" → every required field is set
167
+ * - "misconfigured" → some (but not all) required fields are set
168
+ *
169
+ * Returns the classification, the resolved values (including optional fields),
170
+ * and the human-readable list of accepted env-var names used in skip/fail
171
+ * messages.
172
+ */
173
+ function classifyProvider(provider) {
174
+ const values = {};
175
+ const requiredNames = [];
176
+ let resolvedCount = 0;
177
+ const total = Object.keys(provider.required).length;
178
+ for (const [field, names] of Object.entries(provider.required)) {
179
+ requiredNames.push(names[0]);
180
+ const value = readEnv(names);
181
+ if (value !== undefined) {
182
+ values[field] = value;
183
+ resolvedCount += 1;
184
+ }
185
+ }
186
+ for (const [field, names] of Object.entries(provider.optional ?? {})) {
187
+ const value = readEnv(names);
188
+ if (value !== undefined) {
189
+ values[field] = value;
190
+ }
191
+ }
192
+ let classification;
193
+ if (resolvedCount === 0) {
194
+ classification = "absent";
195
+ }
196
+ else if (resolvedCount === total) {
197
+ classification = "present";
198
+ }
199
+ else {
200
+ classification = "misconfigured";
201
+ }
202
+ return { classification, values, requiredNames, resolvedCount, total };
203
+ }
204
+ /**
205
+ * Upload/download/delete round-trip asserting byte fidelity. Cleans up the test
206
+ * object on a best-effort basis so live buckets are not left with test data.
207
+ */
208
+ async function runRoundTrip(driver) {
209
+ const key = `streetjs-integration/${Date.now()}-${Math.random().toString(16).slice(2)}.bin`;
210
+ const content = new TextEncoder().encode(`streetjs storage integration round-trip ${new Date().toISOString()}`);
211
+ try {
212
+ await driver.put(key, content, { contentType: "application/octet-stream" });
213
+ const exists = await driver.exists(key);
214
+ assert.equal(exists, true, "object must exist after put");
215
+ const got = await driver.get(key);
216
+ assert.equal(got.found, true, "object must be found after put");
217
+ assert.deepEqual(got.bytes, content, "downloaded bytes must equal uploaded bytes");
218
+ }
219
+ finally {
220
+ try {
221
+ await driver.delete(key);
222
+ }
223
+ catch {
224
+ // Best-effort cleanup; a delete failure must not mask the assertion result.
225
+ }
226
+ }
227
+ }
228
+ // ── Register one integration test per provider, honestly classified ────────────
229
+ for (const provider of PROVIDERS) {
230
+ const { classification, values, requiredNames } = classifyProvider(provider);
231
+ const testName = `[integration] ${provider.label}: upload/download preserves bytes`;
232
+ if (classification === "absent") {
233
+ // Requirement 27.3 — no credentials: skip with a clear message. Declared via
234
+ // the { skip } option so node:test marks it SKIPPED (never passed) and no
235
+ // provider code runs.
236
+ test(testName, {
237
+ skip: `No ${provider.label} credentials present in the environment ` +
238
+ `(set ${requiredNames.join(", ")} to run this integration test).`,
239
+ }, () => { });
240
+ continue;
241
+ }
242
+ if (classification === "misconfigured") {
243
+ // Requirement 27.5 — partial credentials are a misconfigured runner: FAIL so
244
+ // the build fails rather than silently skipping an inconsistent setup.
245
+ test(testName, () => {
246
+ assert.fail(`${provider.label} integration is misconfigured: some but not all required ` +
247
+ `credentials are set. Provide all of [${requiredNames.join(", ")}] to run, ` +
248
+ `or none to skip.`);
249
+ });
250
+ continue;
251
+ }
252
+ // Requirement 27.2 — credentials present: run against the provider.
253
+ test(testName, async (t) => {
254
+ let driver;
255
+ try {
256
+ driver = await provider.connect(values);
257
+ }
258
+ catch (error) {
259
+ // Requirement 27.4 — present but cannot run for another reason (e.g. the
260
+ // optional SDK is not installed, or the client cannot be constructed):
261
+ // report passed-with-skip via t.skip rather than failing the build.
262
+ const reason = error instanceof Error ? error.message : String(error);
263
+ t.skip(`${provider.label} credentials are present but the driver could not be ` +
264
+ `constructed, so the integration test cannot run: ${reason}`);
265
+ return;
266
+ }
267
+ await runRoundTrip(driver);
268
+ });
269
+ }
270
+ //# sourceMappingURL=s3-integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3-integration.test.js","sourceRoot":"","sources":["../../src/tests/s3-integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=s3.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3.test.d.ts","sourceRoot":"","sources":["../../src/tests/s3.test.ts"],"names":[],"mappings":""}