@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,90 @@
1
+ /**
2
+ * @streetjs/storage — MinIO driver submodule (`@streetjs/storage/minio`).
3
+ *
4
+ * MinIO speaks the S3 API against a **self-hosted endpoint**, so this driver is a
5
+ * thin endpoint specialization of the shared S3-style base
6
+ * ({@link createS3StyleDriver}). It contributes nothing to the contract mapping —
7
+ * that lives entirely in `s3-base.ts` — and only differs in how the underlying
8
+ * {@link S3ClientLike} is obtained and in the stable driver name (`"minio"`).
9
+ *
10
+ * ## SDK isolation (Requirements 3.1, 3.3)
11
+ *
12
+ * This module imports **no provider SDK** at the top level. There are two ways to
13
+ * obtain a driver:
14
+ *
15
+ * 1. **Inject a structural client.** {@link createMinIODriver} accepts an
16
+ * already-built {@link S3ClientLike} and delegates straight to the base with
17
+ * `name: "minio"`. The `minio` SDK stays an optional peer concern of the
18
+ * consumer and is never touched by this package.
19
+ *
20
+ * 2. **Let the driver build its own client.** {@link connectMinIODriver} resolves
21
+ * the optional `minio` peer SDK with a **lazy dynamic `import()`** performed
22
+ * *inside the function* (never at module top level), constructs a MinIO client
23
+ * from the supplied endpoint/credentials, adapts it to {@link S3ClientLike},
24
+ * and hands it to the base. If the SDK is absent, it throws
25
+ * {@link StorageConfigError} rather than a raw module-resolution error.
26
+ *
27
+ * Because the driver lives behind the `./minio` subpath export
28
+ * (`dist/drivers/minio.js`) and is *not* re-exported from the package index, a
29
+ * consumer only loads this code — and any SDK it lazily resolves — when they
30
+ * import `@streetjs/storage/minio`. `package.json` lists `minio` as an optional
31
+ * peer dependency, never a runtime dependency, keeping `streetjs` the only
32
+ * runtime dependency.
33
+ *
34
+ * _Requirements: 2.1, 2.3, 3.3_
35
+ */
36
+ import type { StorageDriver } from "../driver.js";
37
+ import { type S3ClientLike, type S3StyleDriverOptions } from "./s3-base.js";
38
+ /**
39
+ * Options for {@link createMinIODriver}. Extends the shared
40
+ * {@link S3StyleDriverOptions} (clock, native capabilities) but pins the driver
41
+ * name to `"minio"` — the name is not caller-configurable for this
42
+ * specialization.
43
+ */
44
+ export type MinIODriverOptions = Omit<S3StyleDriverOptions, "name">;
45
+ /**
46
+ * Create a MinIO-backed {@link StorageDriver} over an **injected** structural
47
+ * {@link S3ClientLike}.
48
+ *
49
+ * This is the primary, SDK-free entry point: the caller supplies a client that
50
+ * already speaks the {@link S3ClientLike} shape (built from the `minio` SDK, an
51
+ * S3 SDK pointed at a MinIO endpoint, or a test double), and this function
52
+ * delegates to the shared base with `name: "minio"`. No provider SDK is imported.
53
+ *
54
+ * @throws {StorageConfigError} when no client is injected — use
55
+ * {@link connectMinIODriver} to build a client from endpoint options instead.
56
+ */
57
+ export declare function createMinIODriver(client: S3ClientLike, options?: MinIODriverOptions): StorageDriver;
58
+ /** Connection/endpoint options for building a MinIO client via {@link connectMinIODriver}. */
59
+ export interface MinIOConnectionOptions {
60
+ /** Bucket the driver operates within (required — MinIO is bucket-scoped). */
61
+ readonly bucket: string;
62
+ /** MinIO server hostname, e.g. `"127.0.0.1"` or `"minio.example.com"`. */
63
+ readonly endPoint: string;
64
+ /** TCP port of the MinIO server. Defaults to the SDK default when omitted. */
65
+ readonly port?: number;
66
+ /** Whether to use TLS. Defaults to `true`. */
67
+ readonly useSSL?: boolean;
68
+ /** Access key (username) for the MinIO server. */
69
+ readonly accessKey: string;
70
+ /** Secret key (password) for the MinIO server. */
71
+ readonly secretKey: string;
72
+ /** Optional region hint (MinIO tolerates any value; defaults to `"us-east-1"`). */
73
+ readonly region?: string;
74
+ /** Optional session token for temporary credentials. */
75
+ readonly sessionToken?: string;
76
+ }
77
+ /**
78
+ * Build a MinIO-backed {@link StorageDriver}, constructing the underlying client
79
+ * from `connection` options using the optional `minio` peer SDK.
80
+ *
81
+ * The SDK is resolved with a **lazy dynamic `import()`** performed inside this
82
+ * function, so the peer dependency is only touched when a caller actually asks
83
+ * the driver to build its own client. The resolved SDK client is adapted to the
84
+ * structural {@link S3ClientLike} and handed to {@link createMinIODriver}.
85
+ *
86
+ * @throws {StorageConfigError} when the `minio` SDK is not installed, or when the
87
+ * client cannot be constructed from the supplied options.
88
+ */
89
+ export declare function connectMinIODriver(connection: MinIOConnectionOptions, options?: MinIODriverOptions): Promise<StorageDriver>;
90
+ //# sourceMappingURL=minio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minio.d.ts","sourceRoot":"","sources":["../../src/drivers/minio.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAEL,KAAK,YAAY,EAOjB,KAAK,oBAAoB,EAC1B,MAAM,cAAc,CAAC;AAKtB;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;AAEpE;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,kBAAuB,GAC/B,aAAa,CAUf;AAED,8FAA8F;AAC9F,MAAM,WAAW,sBAAsB;IACrC,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,kDAAkD;IAClD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,kDAAkD;IAClD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,mFAAmF;IACnF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,wDAAwD;IACxD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,sBAAsB,EAClC,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,aAAa,CAAC,CAqBxB"}
@@ -0,0 +1,276 @@
1
+ /**
2
+ * @streetjs/storage — MinIO driver submodule (`@streetjs/storage/minio`).
3
+ *
4
+ * MinIO speaks the S3 API against a **self-hosted endpoint**, so this driver is a
5
+ * thin endpoint specialization of the shared S3-style base
6
+ * ({@link createS3StyleDriver}). It contributes nothing to the contract mapping —
7
+ * that lives entirely in `s3-base.ts` — and only differs in how the underlying
8
+ * {@link S3ClientLike} is obtained and in the stable driver name (`"minio"`).
9
+ *
10
+ * ## SDK isolation (Requirements 3.1, 3.3)
11
+ *
12
+ * This module imports **no provider SDK** at the top level. There are two ways to
13
+ * obtain a driver:
14
+ *
15
+ * 1. **Inject a structural client.** {@link createMinIODriver} accepts an
16
+ * already-built {@link S3ClientLike} and delegates straight to the base with
17
+ * `name: "minio"`. The `minio` SDK stays an optional peer concern of the
18
+ * consumer and is never touched by this package.
19
+ *
20
+ * 2. **Let the driver build its own client.** {@link connectMinIODriver} resolves
21
+ * the optional `minio` peer SDK with a **lazy dynamic `import()`** performed
22
+ * *inside the function* (never at module top level), constructs a MinIO client
23
+ * from the supplied endpoint/credentials, adapts it to {@link S3ClientLike},
24
+ * and hands it to the base. If the SDK is absent, it throws
25
+ * {@link StorageConfigError} rather than a raw module-resolution error.
26
+ *
27
+ * Because the driver lives behind the `./minio` subpath export
28
+ * (`dist/drivers/minio.js`) and is *not* re-exported from the package index, a
29
+ * consumer only loads this code — and any SDK it lazily resolves — when they
30
+ * import `@streetjs/storage/minio`. `package.json` lists `minio` as an optional
31
+ * peer dependency, never a runtime dependency, keeping `streetjs` the only
32
+ * runtime dependency.
33
+ *
34
+ * _Requirements: 2.1, 2.3, 3.3_
35
+ */
36
+ import { StorageConfigError } from "../errors.js";
37
+ import { createS3StyleDriver, } from "./s3-base.js";
38
+ /** The stable {@link StorageDriver.name} surfaced by every MinIO driver. */
39
+ const MINIO_DRIVER_NAME = "minio";
40
+ /**
41
+ * Create a MinIO-backed {@link StorageDriver} over an **injected** structural
42
+ * {@link S3ClientLike}.
43
+ *
44
+ * This is the primary, SDK-free entry point: the caller supplies a client that
45
+ * already speaks the {@link S3ClientLike} shape (built from the `minio` SDK, an
46
+ * S3 SDK pointed at a MinIO endpoint, or a test double), and this function
47
+ * delegates to the shared base with `name: "minio"`. No provider SDK is imported.
48
+ *
49
+ * @throws {StorageConfigError} when no client is injected — use
50
+ * {@link connectMinIODriver} to build a client from endpoint options instead.
51
+ */
52
+ export function createMinIODriver(client, options = {}) {
53
+ if (client === undefined || client === null) {
54
+ throw new StorageConfigError("createMinIODriver requires an injected S3-compatible client. " +
55
+ "Pass an S3ClientLike, or use connectMinIODriver(options) to build one " +
56
+ "from a MinIO endpoint using the optional 'minio' peer dependency.", { provider: MINIO_DRIVER_NAME });
57
+ }
58
+ return createS3StyleDriver(client, { ...options, name: MINIO_DRIVER_NAME });
59
+ }
60
+ /**
61
+ * Build a MinIO-backed {@link StorageDriver}, constructing the underlying client
62
+ * from `connection` options using the optional `minio` peer SDK.
63
+ *
64
+ * The SDK is resolved with a **lazy dynamic `import()`** performed inside this
65
+ * function, so the peer dependency is only touched when a caller actually asks
66
+ * the driver to build its own client. The resolved SDK client is adapted to the
67
+ * structural {@link S3ClientLike} and handed to {@link createMinIODriver}.
68
+ *
69
+ * @throws {StorageConfigError} when the `minio` SDK is not installed, or when the
70
+ * client cannot be constructed from the supplied options.
71
+ */
72
+ export async function connectMinIODriver(connection, options = {}) {
73
+ const sdk = await loadMinioSdk();
74
+ let sdkClient;
75
+ try {
76
+ sdkClient = new sdk.Client({
77
+ endPoint: connection.endPoint,
78
+ port: connection.port,
79
+ useSSL: connection.useSSL ?? true,
80
+ accessKey: connection.accessKey,
81
+ secretKey: connection.secretKey,
82
+ region: connection.region,
83
+ sessionToken: connection.sessionToken,
84
+ });
85
+ }
86
+ catch (cause) {
87
+ throw new StorageConfigError(`Failed to construct a MinIO client for endpoint "${connection.endPoint}".`, { provider: MINIO_DRIVER_NAME, cause });
88
+ }
89
+ const client = adaptMinioClient(sdkClient, connection.bucket);
90
+ return createMinIODriver(client, options);
91
+ }
92
+ // ── Lazy SDK loading ────────────────────────────────────────────────────────
93
+ /**
94
+ * Lazily resolve the optional `minio` peer SDK. The module specifier is held in
95
+ * a variable so the compiler does not statically resolve (and therefore require)
96
+ * the optional peer at build time; the resolution happens only at call time.
97
+ *
98
+ * @throws {StorageConfigError} when the SDK is not installed.
99
+ */
100
+ async function loadMinioSdk() {
101
+ const specifier = "minio";
102
+ try {
103
+ return (await import(specifier));
104
+ }
105
+ catch (cause) {
106
+ throw new StorageConfigError("The optional 'minio' peer dependency is not installed. Install it " +
107
+ "(`npm install minio`) to build a MinIO client from endpoint options, " +
108
+ "or inject your own S3ClientLike via createMinIODriver(client).", { provider: MINIO_DRIVER_NAME, cause });
109
+ }
110
+ }
111
+ // ── SDK → S3ClientLike adapter ────────────────────────────────────────────────
112
+ /** User-metadata prefix MinIO/S3 uses for caller-supplied metadata keys. */
113
+ const USER_META_PREFIX = "x-amz-meta-";
114
+ /** Content-Type header key recognized by the MinIO SDK `metaData` map. */
115
+ const CONTENT_TYPE_KEY = "Content-Type";
116
+ /**
117
+ * Adapt a MinIO SDK client into the structural {@link S3ClientLike} the base
118
+ * driver consumes, scoping every call to `bucket`. Multipart methods are left
119
+ * unimplemented so the facade simulates multipart over the primitives, keeping
120
+ * behavior identical across providers (Requirement 2.3).
121
+ */
122
+ function adaptMinioClient(sdk, bucket) {
123
+ return {
124
+ async putObject(input) {
125
+ const metaData = encodeMetaData(input.contentType, input.metadata);
126
+ const body = Buffer.from(input.body);
127
+ const result = await sdk.putObject(bucket, input.key, body, body.byteLength, metaData);
128
+ return { etag: result.etag };
129
+ },
130
+ async getObject(input) {
131
+ let stat;
132
+ try {
133
+ stat = await sdk.statObject(bucket, input.key);
134
+ }
135
+ catch (error) {
136
+ if (isNotFound(error)) {
137
+ return null;
138
+ }
139
+ throw error;
140
+ }
141
+ let stream;
142
+ try {
143
+ stream = await sdk.getObject(bucket, input.key);
144
+ }
145
+ catch (error) {
146
+ if (isNotFound(error)) {
147
+ return null;
148
+ }
149
+ throw error;
150
+ }
151
+ const body = await collectStream(stream);
152
+ const decoded = decodeMetaData(stat.metaData);
153
+ return {
154
+ body,
155
+ contentType: decoded.contentType,
156
+ etag: stat.etag,
157
+ size: stat.size,
158
+ lastModified: stat.lastModified?.getTime(),
159
+ metadata: decoded.userMetadata,
160
+ };
161
+ },
162
+ async deleteObject(input) {
163
+ try {
164
+ await sdk.removeObject(bucket, input.key);
165
+ }
166
+ catch (error) {
167
+ if (isNotFound(error)) {
168
+ return;
169
+ }
170
+ throw error;
171
+ }
172
+ },
173
+ async listObjects(input) {
174
+ const stream = sdk.listObjectsV2(bucket, input.prefix, input.delimiter !== true);
175
+ const items = [];
176
+ await new Promise((resolve, reject) => {
177
+ stream.on("data", (entry) => {
178
+ if (typeof entry.name === "string") {
179
+ items.push({
180
+ key: entry.name,
181
+ size: entry.size ?? 0,
182
+ updatedAt: entry.lastModified?.getTime() ?? 0,
183
+ });
184
+ }
185
+ });
186
+ stream.on("error", reject);
187
+ stream.on("end", resolve);
188
+ stream.on("close", resolve);
189
+ });
190
+ const sorted = items.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));
191
+ return typeof input.limit === "number" ? sorted.slice(0, input.limit) : sorted;
192
+ },
193
+ async headObject(input) {
194
+ try {
195
+ const stat = await sdk.statObject(bucket, input.key);
196
+ const decoded = decodeMetaData(stat.metaData);
197
+ return {
198
+ contentType: decoded.contentType,
199
+ etag: stat.etag,
200
+ size: stat.size,
201
+ lastModified: stat.lastModified?.getTime(),
202
+ metadata: decoded.userMetadata,
203
+ };
204
+ }
205
+ catch (error) {
206
+ if (isNotFound(error)) {
207
+ return null;
208
+ }
209
+ throw error;
210
+ }
211
+ },
212
+ async presignUrl(input) {
213
+ const expirySeconds = Math.max(1, Math.round(input.expiresInMs / 1000));
214
+ return sdk.presignedUrl(input.op, bucket, input.key, expirySeconds);
215
+ },
216
+ };
217
+ }
218
+ // ── metadata encode/decode helpers ─────────────────────────────────────────────
219
+ /** Encode content type + user metadata into the MinIO SDK `metaData` header map. */
220
+ function encodeMetaData(contentType, metadata) {
221
+ const map = {};
222
+ if (contentType !== undefined) {
223
+ map[CONTENT_TYPE_KEY] = contentType;
224
+ }
225
+ if (metadata !== undefined) {
226
+ for (const [key, value] of Object.entries(metadata)) {
227
+ map[`${USER_META_PREFIX}${key}`] = value;
228
+ }
229
+ }
230
+ return map;
231
+ }
232
+ /**
233
+ * Decode a MinIO SDK `metaData` map back into a content type and the caller's
234
+ * user-metadata map, stripping the `x-amz-meta-` prefix. MinIO lowercases header
235
+ * keys, so lookups are case-insensitive.
236
+ */
237
+ function decodeMetaData(metaData) {
238
+ const userMetadata = {};
239
+ let contentType;
240
+ if (metaData !== undefined) {
241
+ for (const [rawKey, value] of Object.entries(metaData)) {
242
+ const key = rawKey.toLowerCase();
243
+ if (key === CONTENT_TYPE_KEY.toLowerCase()) {
244
+ contentType = value;
245
+ }
246
+ else if (key.startsWith(USER_META_PREFIX)) {
247
+ userMetadata[key.slice(USER_META_PREFIX.length)] = value;
248
+ }
249
+ }
250
+ }
251
+ return { contentType, userMetadata };
252
+ }
253
+ /** Collect a Node {@link Readable} into a single {@link Uint8Array}. */
254
+ async function collectStream(stream) {
255
+ const chunks = [];
256
+ for await (const chunk of stream) {
257
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
258
+ }
259
+ return new Uint8Array(Buffer.concat(chunks));
260
+ }
261
+ /**
262
+ * Detect a MinIO/S3 "object does not exist" error so absence maps to `null`
263
+ * rather than a thrown error, keeping not-found semantics identical to the base.
264
+ */
265
+ function isNotFound(error) {
266
+ if (error === null || typeof error !== "object") {
267
+ return false;
268
+ }
269
+ const code = error.code;
270
+ const statusCode = error.statusCode;
271
+ return (code === "NoSuchKey" ||
272
+ code === "NotFound" ||
273
+ code === "NoSuchObject" ||
274
+ statusCode === 404);
275
+ }
276
+ //# sourceMappingURL=minio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minio.js","sourceRoot":"","sources":["../../src/drivers/minio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * @streetjs/storage — CloudflareR2Driver (submodule `@streetjs/storage/r2`).
3
+ *
4
+ * Cloudflare R2 speaks the S3 API, so this driver is a thin **endpoint/credential
5
+ * specialization** of the shared S3-style base ({@link createS3StyleDriver} in
6
+ * `s3-base.ts`). It differs from `s3.ts` only in how the underlying client is
7
+ * built — R2 uses an account-specific endpoint
8
+ * (`https://<accountId>.r2.cloudflarestorage.com`) with `region: "auto"` — never
9
+ * in how the {@link StorageDriver} contract is satisfied.
10
+ *
11
+ * ## Two ways to obtain a driver
12
+ *
13
+ * - {@link createCloudflareR2Driver} wraps an **already-constructed, injected**
14
+ * structural {@link S3ClientLike} and returns a driver synchronously. This is
15
+ * the SDK-free path: no provider SDK is touched, so it is fully testable with
16
+ * an in-memory fake and needs no `@aws-sdk/*` install.
17
+ * - {@link connectCloudflareR2Driver} **builds its own client** from R2
18
+ * connection config. It resolves the S3-compatible SDK through a **lazy
19
+ * dynamic `import()` performed inside the function** (never at module top
20
+ * level), so the optional peer dependency is only required when this path is
21
+ * actually used. If the SDK is not installed and no client was injected, it
22
+ * throws {@link StorageConfigError} (Requirement 1.5).
23
+ *
24
+ * ## SDK isolation (Requirements 2.1, 3.3)
25
+ *
26
+ * This module imports **no provider SDK at the top level** — only this package's
27
+ * own base/types/errors. The AWS S3 SDK (which R2 uses) is referenced solely via
28
+ * a dynamic `import()` with a non-literal specifier inside
29
+ * {@link connectCloudflareR2Driver}, so `tsc` never requires the SDK to be
30
+ * present and `streetjs` stays the only runtime dependency. This driver is a
31
+ * submodule-only export (`./r2` → `dist/drivers/r2.js`); it is intentionally not
32
+ * re-exported from the package's main `index.ts`.
33
+ *
34
+ * _Requirements: 2.1, 2.3, 3.3_
35
+ */
36
+ import type { Clock } from "streetjs";
37
+ import type { StorageDriver } from "../driver.js";
38
+ import { S3StyleDriver, type S3ClientLike, type S3NativeCapabilities } from "./s3-base.js";
39
+ /**
40
+ * Options for the R2 driver. Mirrors the S3-style base options but omits `name`
41
+ * — the R2 driver's name is fixed to `"r2"` so provider identity is stable.
42
+ */
43
+ export interface CloudflareR2DriverOptions {
44
+ /** Injected clock for deterministic timestamps in tests. Default `systemClock`. */
45
+ readonly clock?: Clock;
46
+ /**
47
+ * Native capability objects to delegate to. Any capability omitted here (and
48
+ * not derivable from the client) is left `undefined` so the facade simulates
49
+ * it over the primitives.
50
+ */
51
+ readonly capabilities?: S3NativeCapabilities;
52
+ }
53
+ /**
54
+ * Connection configuration for {@link connectCloudflareR2Driver}. These are the
55
+ * R2-specific coordinates used to build the endpoint and sign requests.
56
+ */
57
+ export interface CloudflareR2Config extends CloudflareR2DriverOptions {
58
+ /** Cloudflare account id — forms the R2 endpoint host. */
59
+ readonly accountId: string;
60
+ /** Target R2 bucket name. */
61
+ readonly bucket: string;
62
+ /** R2 access key id (S3-compatible credential). */
63
+ readonly accessKeyId: string;
64
+ /** R2 secret access key (S3-compatible credential). */
65
+ readonly secretAccessKey: string;
66
+ /**
67
+ * Override the derived endpoint. Defaults to
68
+ * `https://<accountId>.r2.cloudflarestorage.com`.
69
+ */
70
+ readonly endpoint?: string;
71
+ /** S3 SDK region. R2 ignores region but the SDK requires one; default `"auto"`. */
72
+ readonly region?: string;
73
+ }
74
+ /**
75
+ * The CloudflareR2 {@link StorageDriver}: the shared S3-style base pinned to the
76
+ * `"r2"` provider name. Construction is identical to the base — supply an
77
+ * {@link S3ClientLike} — the only difference is the fixed name.
78
+ */
79
+ export declare class CloudflareR2Driver extends S3StyleDriver {
80
+ constructor(client: S3ClientLike, options?: CloudflareR2DriverOptions);
81
+ }
82
+ /**
83
+ * Wrap an injected {@link S3ClientLike} as an R2 driver, delegating to
84
+ * {@link createS3StyleDriver} with the name `"r2"`. Synchronous and SDK-free:
85
+ * the caller supplies the client, so no provider SDK is resolved here.
86
+ */
87
+ export declare function createCloudflareR2Driver(client: S3ClientLike, options?: CloudflareR2DriverOptions): StorageDriver;
88
+ /**
89
+ * Build an R2 driver that owns its client, resolving the S3-compatible SDK
90
+ * lazily.
91
+ *
92
+ * The SDK is loaded through a dynamic `import()` with a non-literal specifier so
93
+ * it is never a static/top-level dependency: `tsc` does not require it to be
94
+ * installed, and it is only resolved when this function runs. When the SDK
95
+ * cannot be resolved, a {@link StorageConfigError} is thrown (Requirement 1.5) —
96
+ * callers that cannot install the SDK should use {@link createCloudflareR2Driver}
97
+ * with their own {@link S3ClientLike} instead.
98
+ */
99
+ export declare function connectCloudflareR2Driver(config: CloudflareR2Config): Promise<StorageDriver>;
100
+ //# sourceMappingURL=r2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"r2.d.ts","sourceRoot":"","sources":["../../src/drivers/r2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAEL,aAAa,EACb,KAAK,YAAY,EAKjB,KAAK,oBAAoB,EAG1B,MAAM,cAAc,CAAC;AAKtB;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC,mFAAmF;IACnF,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,oBAAoB,CAAC;CAC9C;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAmB,SAAQ,yBAAyB;IACnE,0DAA0D;IAC1D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,6BAA6B;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,uDAAuD;IACvD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,mFAAmF;IACnF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,aAAa;gBACvC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,yBAA8B;CAG1E;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,yBAA8B,GACtC,aAAa,CAEf;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,aAAa,CAAC,CAuCxB"}