@fade_networker/vono 0.1.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 (319) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +47 -0
  3. package/dist/client/composables/navigateTo.d.ts +37 -0
  4. package/dist/client/composables/navigateTo.d.ts.map +1 -0
  5. package/dist/client/composables/navigateTo.js +56 -0
  6. package/dist/client/composables/navigateTo.js.map +1 -0
  7. package/dist/client/composables/useAsyncData.d.ts +35 -0
  8. package/dist/client/composables/useAsyncData.d.ts.map +1 -0
  9. package/dist/client/composables/useAsyncData.js +55 -0
  10. package/dist/client/composables/useAsyncData.js.map +1 -0
  11. package/dist/client/composables/useCookie.d.ts +33 -0
  12. package/dist/client/composables/useCookie.d.ts.map +1 -0
  13. package/dist/client/composables/useCookie.js +61 -0
  14. package/dist/client/composables/useCookie.js.map +1 -0
  15. package/dist/client/composables/useFormErrors.d.ts +34 -0
  16. package/dist/client/composables/useFormErrors.d.ts.map +1 -0
  17. package/dist/client/composables/useFormErrors.js +59 -0
  18. package/dist/client/composables/useFormErrors.js.map +1 -0
  19. package/dist/client/composables/useRouteRules.d.ts +26 -0
  20. package/dist/client/composables/useRouteRules.d.ts.map +1 -0
  21. package/dist/client/composables/useRouteRules.js +44 -0
  22. package/dist/client/composables/useRouteRules.js.map +1 -0
  23. package/dist/client/composables/useSeo.d.ts +35 -0
  24. package/dist/client/composables/useSeo.d.ts.map +1 -0
  25. package/dist/client/composables/useSeo.js +62 -0
  26. package/dist/client/composables/useSeo.js.map +1 -0
  27. package/dist/client/composables/useState.d.ts +35 -0
  28. package/dist/client/composables/useState.d.ts.map +1 -0
  29. package/dist/client/composables/useState.js +73 -0
  30. package/dist/client/composables/useState.js.map +1 -0
  31. package/dist/client/composables/useVonoFetch.d.ts +24 -0
  32. package/dist/client/composables/useVonoFetch.d.ts.map +1 -0
  33. package/dist/client/composables/useVonoFetch.js +49 -0
  34. package/dist/client/composables/useVonoFetch.js.map +1 -0
  35. package/dist/client/index.d.ts +19 -0
  36. package/dist/client/index.d.ts.map +1 -0
  37. package/dist/client/index.js +20 -0
  38. package/dist/client/index.js.map +1 -0
  39. package/dist/client/layouts/index.d.ts +12 -0
  40. package/dist/client/layouts/index.d.ts.map +1 -0
  41. package/dist/client/layouts/index.js +11 -0
  42. package/dist/client/layouts/index.js.map +1 -0
  43. package/dist/client/layouts/resolve-layout.d.ts +23 -0
  44. package/dist/client/layouts/resolve-layout.d.ts.map +1 -0
  45. package/dist/client/layouts/resolve-layout.js +31 -0
  46. package/dist/client/layouts/resolve-layout.js.map +1 -0
  47. package/dist/client/nuxt-ui/index.d.ts +11 -0
  48. package/dist/client/nuxt-ui/index.d.ts.map +1 -0
  49. package/dist/client/nuxt-ui/index.js +11 -0
  50. package/dist/client/nuxt-ui/index.js.map +1 -0
  51. package/dist/client/nuxt-ui/setup.d.ts +27 -0
  52. package/dist/client/nuxt-ui/setup.d.ts.map +1 -0
  53. package/dist/client/nuxt-ui/setup.js +40 -0
  54. package/dist/client/nuxt-ui/setup.js.map +1 -0
  55. package/dist/client/pinia-hydration.d.ts +35 -0
  56. package/dist/client/pinia-hydration.d.ts.map +1 -0
  57. package/dist/client/pinia-hydration.js +48 -0
  58. package/dist/client/pinia-hydration.js.map +1 -0
  59. package/dist/config/define-config.d.ts +25 -0
  60. package/dist/config/define-config.d.ts.map +1 -0
  61. package/dist/config/define-config.js +63 -0
  62. package/dist/config/define-config.js.map +1 -0
  63. package/dist/config/env-helpers.d.ts +30 -0
  64. package/dist/config/env-helpers.d.ts.map +1 -0
  65. package/dist/config/env-helpers.js +50 -0
  66. package/dist/config/env-helpers.js.map +1 -0
  67. package/dist/config/use-config.d.ts +31 -0
  68. package/dist/config/use-config.d.ts.map +1 -0
  69. package/dist/config/use-config.js +49 -0
  70. package/dist/config/use-config.js.map +1 -0
  71. package/dist/index.d.ts +16 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +15 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/module-system/define-module.d.ts +82 -0
  76. package/dist/module-system/define-module.d.ts.map +1 -0
  77. package/dist/module-system/define-module.js +37 -0
  78. package/dist/module-system/define-module.js.map +1 -0
  79. package/dist/module-system/index.d.ts +14 -0
  80. package/dist/module-system/index.d.ts.map +1 -0
  81. package/dist/module-system/index.js +13 -0
  82. package/dist/module-system/index.js.map +1 -0
  83. package/dist/module-system/module-registry.d.ts +37 -0
  84. package/dist/module-system/module-registry.d.ts.map +1 -0
  85. package/dist/module-system/module-registry.js +68 -0
  86. package/dist/module-system/module-registry.js.map +1 -0
  87. package/dist/module-system/vite-integration.d.ts +23 -0
  88. package/dist/module-system/vite-integration.d.ts.map +1 -0
  89. package/dist/module-system/vite-integration.js +67 -0
  90. package/dist/module-system/vite-integration.js.map +1 -0
  91. package/dist/server/app-template.d.ts +47 -0
  92. package/dist/server/app-template.d.ts.map +1 -0
  93. package/dist/server/app-template.js +224 -0
  94. package/dist/server/app-template.js.map +1 -0
  95. package/dist/server/auth/gates.d.ts +79 -0
  96. package/dist/server/auth/gates.d.ts.map +1 -0
  97. package/dist/server/auth/gates.js +125 -0
  98. package/dist/server/auth/gates.js.map +1 -0
  99. package/dist/server/auth/index.d.ts +12 -0
  100. package/dist/server/auth/index.d.ts.map +1 -0
  101. package/dist/server/auth/index.js +12 -0
  102. package/dist/server/auth/index.js.map +1 -0
  103. package/dist/server/dto/query.dto.d.ts +44 -0
  104. package/dist/server/dto/query.dto.d.ts.map +1 -0
  105. package/dist/server/dto/query.dto.js +86 -0
  106. package/dist/server/dto/query.dto.js.map +1 -0
  107. package/dist/server/email/define-email.d.ts +41 -0
  108. package/dist/server/email/define-email.d.ts.map +1 -0
  109. package/dist/server/email/define-email.js +50 -0
  110. package/dist/server/email/define-email.js.map +1 -0
  111. package/dist/server/email/drivers/console.d.ts +16 -0
  112. package/dist/server/email/drivers/console.d.ts.map +1 -0
  113. package/dist/server/email/drivers/console.js +22 -0
  114. package/dist/server/email/drivers/console.js.map +1 -0
  115. package/dist/server/email/drivers/postmark.d.ts +19 -0
  116. package/dist/server/email/drivers/postmark.d.ts.map +1 -0
  117. package/dist/server/email/drivers/postmark.js +39 -0
  118. package/dist/server/email/drivers/postmark.js.map +1 -0
  119. package/dist/server/email/drivers/resend.d.ts +19 -0
  120. package/dist/server/email/drivers/resend.d.ts.map +1 -0
  121. package/dist/server/email/drivers/resend.js +37 -0
  122. package/dist/server/email/drivers/resend.js.map +1 -0
  123. package/dist/server/email/drivers/smtp.d.ts +26 -0
  124. package/dist/server/email/drivers/smtp.d.ts.map +1 -0
  125. package/dist/server/email/drivers/smtp.js +37 -0
  126. package/dist/server/email/drivers/smtp.js.map +1 -0
  127. package/dist/server/email/send-email.d.ts +42 -0
  128. package/dist/server/email/send-email.d.ts.map +1 -0
  129. package/dist/server/email/send-email.js +69 -0
  130. package/dist/server/email/send-email.js.map +1 -0
  131. package/dist/server/env-validation/define-env.d.ts +45 -0
  132. package/dist/server/env-validation/define-env.d.ts.map +1 -0
  133. package/dist/server/env-validation/define-env.js +41 -0
  134. package/dist/server/env-validation/define-env.js.map +1 -0
  135. package/dist/server/env-validation/index.d.ts +13 -0
  136. package/dist/server/env-validation/index.d.ts.map +1 -0
  137. package/dist/server/env-validation/index.js +12 -0
  138. package/dist/server/env-validation/index.js.map +1 -0
  139. package/dist/server/env-validation/validate-at-startup.d.ts +29 -0
  140. package/dist/server/env-validation/validate-at-startup.d.ts.map +1 -0
  141. package/dist/server/env-validation/validate-at-startup.js +61 -0
  142. package/dist/server/env-validation/validate-at-startup.js.map +1 -0
  143. package/dist/server/i18n/composables/useI18n.d.ts +39 -0
  144. package/dist/server/i18n/composables/useI18n.d.ts.map +1 -0
  145. package/dist/server/i18n/composables/useI18n.js +93 -0
  146. package/dist/server/i18n/composables/useI18n.js.map +1 -0
  147. package/dist/server/i18n/detect-locale.d.ts +22 -0
  148. package/dist/server/i18n/detect-locale.d.ts.map +1 -0
  149. package/dist/server/i18n/detect-locale.js +42 -0
  150. package/dist/server/i18n/detect-locale.js.map +1 -0
  151. package/dist/server/i18n/index.d.ts +14 -0
  152. package/dist/server/i18n/index.d.ts.map +1 -0
  153. package/dist/server/i18n/index.js +13 -0
  154. package/dist/server/i18n/index.js.map +1 -0
  155. package/dist/server/i18n/translate.d.ts +38 -0
  156. package/dist/server/i18n/translate.d.ts.map +1 -0
  157. package/dist/server/i18n/translate.js +83 -0
  158. package/dist/server/i18n/translate.js.map +1 -0
  159. package/dist/server/index.d.ts +40 -0
  160. package/dist/server/index.d.ts.map +1 -0
  161. package/dist/server/index.js +36 -0
  162. package/dist/server/index.js.map +1 -0
  163. package/dist/server/jobs/define-job.d.ts +50 -0
  164. package/dist/server/jobs/define-job.d.ts.map +1 -0
  165. package/dist/server/jobs/define-job.js +32 -0
  166. package/dist/server/jobs/define-job.js.map +1 -0
  167. package/dist/server/jobs/index.d.ts +13 -0
  168. package/dist/server/jobs/index.d.ts.map +1 -0
  169. package/dist/server/jobs/index.js +12 -0
  170. package/dist/server/jobs/index.js.map +1 -0
  171. package/dist/server/jobs/runner.d.ts +37 -0
  172. package/dist/server/jobs/runner.d.ts.map +1 -0
  173. package/dist/server/jobs/runner.js +75 -0
  174. package/dist/server/jobs/runner.js.map +1 -0
  175. package/dist/server/middleware/configProvider.d.ts +26 -0
  176. package/dist/server/middleware/configProvider.d.ts.map +1 -0
  177. package/dist/server/middleware/configProvider.js +78 -0
  178. package/dist/server/middleware/configProvider.js.map +1 -0
  179. package/dist/server/middleware/dbProvider.d.ts +27 -0
  180. package/dist/server/middleware/dbProvider.d.ts.map +1 -0
  181. package/dist/server/middleware/dbProvider.js +66 -0
  182. package/dist/server/middleware/dbProvider.js.map +1 -0
  183. package/dist/server/middleware/rateLimiter.d.ts +74 -0
  184. package/dist/server/middleware/rateLimiter.d.ts.map +1 -0
  185. package/dist/server/middleware/rateLimiter.js +164 -0
  186. package/dist/server/middleware/rateLimiter.js.map +1 -0
  187. package/dist/server/middleware/validator.d.ts +57 -0
  188. package/dist/server/middleware/validator.d.ts.map +1 -0
  189. package/dist/server/middleware/validator.js +128 -0
  190. package/dist/server/middleware/validator.js.map +1 -0
  191. package/dist/server/openapi/append-tag.d.ts +21 -0
  192. package/dist/server/openapi/append-tag.d.ts.map +1 -0
  193. package/dist/server/openapi/append-tag.js +54 -0
  194. package/dist/server/openapi/append-tag.js.map +1 -0
  195. package/dist/server/openapi/index.d.ts +13 -0
  196. package/dist/server/openapi/index.d.ts.map +1 -0
  197. package/dist/server/openapi/index.js +12 -0
  198. package/dist/server/openapi/index.js.map +1 -0
  199. package/dist/server/openapi/spec-template.d.ts +45 -0
  200. package/dist/server/openapi/spec-template.d.ts.map +1 -0
  201. package/dist/server/openapi/spec-template.js +132 -0
  202. package/dist/server/openapi/spec-template.js.map +1 -0
  203. package/dist/server/renderer.d.ts +62 -0
  204. package/dist/server/renderer.d.ts.map +1 -0
  205. package/dist/server/renderer.js +115 -0
  206. package/dist/server/renderer.js.map +1 -0
  207. package/dist/server/resolvers/cache-driver.d.ts +22 -0
  208. package/dist/server/resolvers/cache-driver.d.ts.map +1 -0
  209. package/dist/server/resolvers/cache-driver.js +29 -0
  210. package/dist/server/resolvers/cache-driver.js.map +1 -0
  211. package/dist/server/resolvers/index.d.ts +17 -0
  212. package/dist/server/resolvers/index.d.ts.map +1 -0
  213. package/dist/server/resolvers/index.js +14 -0
  214. package/dist/server/resolvers/index.js.map +1 -0
  215. package/dist/server/resolvers/queue-driver.d.ts +25 -0
  216. package/dist/server/resolvers/queue-driver.d.ts.map +1 -0
  217. package/dist/server/resolvers/queue-driver.js +44 -0
  218. package/dist/server/resolvers/queue-driver.js.map +1 -0
  219. package/dist/server/resolvers/storage-driver.d.ts +24 -0
  220. package/dist/server/resolvers/storage-driver.d.ts.map +1 -0
  221. package/dist/server/resolvers/storage-driver.js +38 -0
  222. package/dist/server/resolvers/storage-driver.js.map +1 -0
  223. package/dist/server/resolvers/validate-compatibility.d.ts +22 -0
  224. package/dist/server/resolvers/validate-compatibility.d.ts.map +1 -0
  225. package/dist/server/resolvers/validate-compatibility.js +83 -0
  226. package/dist/server/resolvers/validate-compatibility.js.map +1 -0
  227. package/dist/server/resources/base-resource.d.ts +57 -0
  228. package/dist/server/resources/base-resource.d.ts.map +1 -0
  229. package/dist/server/resources/base-resource.js +74 -0
  230. package/dist/server/resources/base-resource.js.map +1 -0
  231. package/dist/server/route-rules.d.ts +45 -0
  232. package/dist/server/route-rules.d.ts.map +1 -0
  233. package/dist/server/route-rules.js +66 -0
  234. package/dist/server/route-rules.js.map +1 -0
  235. package/dist/server/seo.d.ts +58 -0
  236. package/dist/server/seo.d.ts.map +1 -0
  237. package/dist/server/seo.js +85 -0
  238. package/dist/server/seo.js.map +1 -0
  239. package/dist/server/storage/drivers/bunny.d.ts +33 -0
  240. package/dist/server/storage/drivers/bunny.d.ts.map +1 -0
  241. package/dist/server/storage/drivers/bunny.js +70 -0
  242. package/dist/server/storage/drivers/bunny.js.map +1 -0
  243. package/dist/server/storage/drivers/cloudinary.d.ts +30 -0
  244. package/dist/server/storage/drivers/cloudinary.d.ts.map +1 -0
  245. package/dist/server/storage/drivers/cloudinary.js +86 -0
  246. package/dist/server/storage/drivers/cloudinary.js.map +1 -0
  247. package/dist/server/storage/drivers/local.d.ts +28 -0
  248. package/dist/server/storage/drivers/local.d.ts.map +1 -0
  249. package/dist/server/storage/drivers/local.js +57 -0
  250. package/dist/server/storage/drivers/local.js.map +1 -0
  251. package/dist/server/storage/drivers/r2.d.ts +32 -0
  252. package/dist/server/storage/drivers/r2.d.ts.map +1 -0
  253. package/dist/server/storage/drivers/r2.js +70 -0
  254. package/dist/server/storage/drivers/r2.js.map +1 -0
  255. package/dist/server/storage/drivers/s3.d.ts +29 -0
  256. package/dist/server/storage/drivers/s3.d.ts.map +1 -0
  257. package/dist/server/storage/drivers/s3.js +68 -0
  258. package/dist/server/storage/drivers/s3.js.map +1 -0
  259. package/dist/server/storage/index.d.ts +17 -0
  260. package/dist/server/storage/index.d.ts.map +1 -0
  261. package/dist/server/storage/index.js +16 -0
  262. package/dist/server/storage/index.js.map +1 -0
  263. package/dist/server/storage/types.d.ts +70 -0
  264. package/dist/server/storage/types.d.ts.map +1 -0
  265. package/dist/server/storage/types.js +11 -0
  266. package/dist/server/storage/types.js.map +1 -0
  267. package/dist/server/storage/use-storage.d.ts +54 -0
  268. package/dist/server/storage/use-storage.d.ts.map +1 -0
  269. package/dist/server/storage/use-storage.js +150 -0
  270. package/dist/server/storage/use-storage.js.map +1 -0
  271. package/dist/server/stream-renderer.d.ts +49 -0
  272. package/dist/server/stream-renderer.d.ts.map +1 -0
  273. package/dist/server/stream-renderer.js +89 -0
  274. package/dist/server/stream-renderer.js.map +1 -0
  275. package/dist/server/templates/health.routes.d.ts +22 -0
  276. package/dist/server/templates/health.routes.d.ts.map +1 -0
  277. package/dist/server/templates/health.routes.js +28 -0
  278. package/dist/server/templates/health.routes.js.map +1 -0
  279. package/dist/server/utils/storage-url.d.ts +36 -0
  280. package/dist/server/utils/storage-url.d.ts.map +1 -0
  281. package/dist/server/utils/storage-url.js +53 -0
  282. package/dist/server/utils/storage-url.js.map +1 -0
  283. package/dist/shared/utils/autoRoutes.d.ts +22 -0
  284. package/dist/shared/utils/autoRoutes.d.ts.map +1 -0
  285. package/dist/shared/utils/autoRoutes.js +29 -0
  286. package/dist/shared/utils/autoRoutes.js.map +1 -0
  287. package/dist/shared/utils/id.d.ts +25 -0
  288. package/dist/shared/utils/id.d.ts.map +1 -0
  289. package/dist/shared/utils/id.js +29 -0
  290. package/dist/shared/utils/id.js.map +1 -0
  291. package/dist/shared/utils/logger.d.ts +33 -0
  292. package/dist/shared/utils/logger.d.ts.map +1 -0
  293. package/dist/shared/utils/logger.js +65 -0
  294. package/dist/shared/utils/logger.js.map +1 -0
  295. package/dist/shared/utils/mappers.d.ts +23 -0
  296. package/dist/shared/utils/mappers.d.ts.map +1 -0
  297. package/dist/shared/utils/mappers.js +37 -0
  298. package/dist/shared/utils/mappers.js.map +1 -0
  299. package/dist/shared/utils/pagination.d.ts +26 -0
  300. package/dist/shared/utils/pagination.d.ts.map +1 -0
  301. package/dist/shared/utils/pagination.js +28 -0
  302. package/dist/shared/utils/pagination.js.map +1 -0
  303. package/dist/shared/utils/response.d.ts +38 -0
  304. package/dist/shared/utils/response.d.ts.map +1 -0
  305. package/dist/shared/utils/response.js +46 -0
  306. package/dist/shared/utils/response.js.map +1 -0
  307. package/dist/shared/utils/softDeletes.d.ts +90 -0
  308. package/dist/shared/utils/softDeletes.d.ts.map +1 -0
  309. package/dist/shared/utils/softDeletes.js +72 -0
  310. package/dist/shared/utils/softDeletes.js.map +1 -0
  311. package/dist/types/index.d.ts +191 -0
  312. package/dist/types/index.d.ts.map +1 -0
  313. package/dist/types/index.js +12 -0
  314. package/dist/types/index.js.map +1 -0
  315. package/dist/vite/index.d.ts +30 -0
  316. package/dist/vite/index.d.ts.map +1 -0
  317. package/dist/vite/index.js +218 -0
  318. package/dist/vite/index.js.map +1 -0
  319. package/package.json +77 -0
@@ -0,0 +1,30 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ import type { StorageDriver, UploadOptions, UploadResult } from '../types.js';
11
+ export interface CloudinaryConfig {
12
+ cloudName: string;
13
+ apiKey: string;
14
+ apiSecret: string;
15
+ /** Upload preset (optional) */
16
+ uploadPreset?: string;
17
+ }
18
+ /**
19
+ * Cloudinary image CDN driver.
20
+ * Uses the Cloudinary Upload API (no SDK — pure fetch).
21
+ */
22
+ export declare class CloudinaryDriver implements StorageDriver {
23
+ private readonly config;
24
+ constructor(config: CloudinaryConfig);
25
+ upload(file: File, options?: UploadOptions): Promise<UploadResult>;
26
+ delete(key: string): Promise<void>;
27
+ url(key: string): string;
28
+ private _sign;
29
+ }
30
+ //# sourceMappingURL=cloudinary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudinary.d.ts","sourceRoot":"","sources":["../../../../src/server/storage/drivers/cloudinary.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE7E,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,+BAA+B;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAID;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,aAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,gBAAgB;IAE/C,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IA0ClE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BxC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;YAIV,KAAK;CAYpB"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ import { Logger } from '../../../shared/utils/logger.js';
11
+ // ─── CloudinaryDriver ─────────────────────────────────────────────────────────
12
+ /**
13
+ * Cloudinary image CDN driver.
14
+ * Uses the Cloudinary Upload API (no SDK — pure fetch).
15
+ */
16
+ export class CloudinaryDriver {
17
+ config;
18
+ constructor(config) {
19
+ this.config = config;
20
+ }
21
+ async upload(file, options) {
22
+ const url = `https://api.cloudinary.com/v1_1/${this.config.cloudName}/auto/upload`;
23
+ const formData = new FormData();
24
+ formData.append('file', file);
25
+ formData.append('api_key', this.config.apiKey);
26
+ if (options?.key) {
27
+ formData.append('public_id', options.key.replace(/\.[^.]+$/, ''));
28
+ }
29
+ if (this.config.uploadPreset) {
30
+ formData.append('upload_preset', this.config.uploadPreset);
31
+ }
32
+ // Generate signature for authenticated upload
33
+ const timestamp = Math.floor(Date.now() / 1000).toString();
34
+ formData.append('timestamp', timestamp);
35
+ const signature = await this._sign({ timestamp, public_id: options?.key });
36
+ formData.append('signature', signature);
37
+ const res = await fetch(url, { method: 'POST', body: formData });
38
+ if (!res.ok) {
39
+ const body = await res.text();
40
+ Logger.error('[storage:cloudinary] Upload failed', { status: res.status, body });
41
+ throw new Error(`Cloudinary upload error: ${res.status}`);
42
+ }
43
+ const data = await res.json();
44
+ Logger.info('[storage:cloudinary] File uploaded', { publicId: data.public_id });
45
+ return {
46
+ key: data.public_id,
47
+ url: data.secure_url,
48
+ size: data.bytes,
49
+ contentType: options?.contentType ?? `image/${data.format}`,
50
+ };
51
+ }
52
+ async delete(key) {
53
+ const timestamp = Math.floor(Date.now() / 1000).toString();
54
+ const signature = await this._sign({ public_id: key, timestamp });
55
+ const res = await fetch(`https://api.cloudinary.com/v1_1/${this.config.cloudName}/image/destroy`, {
56
+ method: 'POST',
57
+ headers: { 'Content-Type': 'application/json' },
58
+ body: JSON.stringify({
59
+ public_id: key,
60
+ api_key: this.config.apiKey,
61
+ timestamp,
62
+ signature,
63
+ }),
64
+ });
65
+ if (!res.ok) {
66
+ Logger.error('[storage:cloudinary] Delete failed', { key, status: res.status });
67
+ throw new Error(`Cloudinary delete error: ${res.status}`);
68
+ }
69
+ Logger.info('[storage:cloudinary] File deleted', { key });
70
+ }
71
+ url(key) {
72
+ return `https://res.cloudinary.com/${this.config.cloudName}/image/upload/${key}`;
73
+ }
74
+ async _sign(params) {
75
+ // Build sorted param string (exclude api_key, file, resource_type, cloud_name)
76
+ const sorted = Object.entries(params)
77
+ .filter(([, v]) => v !== undefined)
78
+ .sort(([a], [b]) => a.localeCompare(b))
79
+ .map(([k, v]) => `${k}=${v}`)
80
+ .join('&');
81
+ const toSign = `${sorted}${this.config.apiSecret}`;
82
+ const buffer = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(toSign));
83
+ return Array.from(new Uint8Array(buffer)).map((b) => b.toString(16).padStart(2, '0')).join('');
84
+ }
85
+ }
86
+ //# sourceMappingURL=cloudinary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudinary.js","sourceRoot":"","sources":["../../../../src/server/storage/drivers/cloudinary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ import type { StorageDriver, UploadOptions, UploadResult } from '../types.js';
11
+ /**
12
+ * Local storage driver — saves files to `./storage/uploads/`.
13
+ * Files are served at `/uploads/<key>`.
14
+ *
15
+ * For development and single-server deployments only.
16
+ */
17
+ export declare class LocalDriver implements StorageDriver {
18
+ private readonly uploadDir;
19
+ private readonly baseUrl;
20
+ constructor(options?: {
21
+ uploadDir?: string;
22
+ baseUrl?: string;
23
+ });
24
+ upload(file: File, options?: UploadOptions): Promise<UploadResult>;
25
+ delete(key: string): Promise<void>;
26
+ url(key: string): string;
27
+ }
28
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../../src/server/storage/drivers/local.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAI7E;;;;;GAKG;AACH,qBAAa,WAAY,YAAW,aAAa;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;gBAEpB,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAKxD,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAsBlE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAIzB"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ import { join } from 'node:path';
11
+ import { mkdirSync, writeFileSync, unlinkSync, existsSync } from 'node:fs';
12
+ import { generateId } from '../../../shared/utils/id.js';
13
+ import { Logger } from '../../../shared/utils/logger.js';
14
+ // ─── LocalDriver ─────────────────────────────────────────────────────────────
15
+ /**
16
+ * Local storage driver — saves files to `./storage/uploads/`.
17
+ * Files are served at `/uploads/<key>`.
18
+ *
19
+ * For development and single-server deployments only.
20
+ */
21
+ export class LocalDriver {
22
+ uploadDir;
23
+ baseUrl;
24
+ constructor(options) {
25
+ this.uploadDir = options?.uploadDir ?? join(process.cwd(), 'storage', 'uploads');
26
+ this.baseUrl = options?.baseUrl ?? '/uploads';
27
+ }
28
+ async upload(file, options) {
29
+ const ext = file.name.split('.').pop() ?? 'bin';
30
+ const key = options?.key ?? `${generateId()}.${ext}`;
31
+ const filePath = join(this.uploadDir, key);
32
+ // Ensure directory exists
33
+ const dir = filePath.substring(0, filePath.lastIndexOf('/'));
34
+ mkdirSync(dir, { recursive: true });
35
+ const buffer = await file.arrayBuffer();
36
+ writeFileSync(filePath, Buffer.from(buffer));
37
+ Logger.info('[storage:local] File uploaded', { key, size: file.size });
38
+ return {
39
+ key,
40
+ url: this.url(key),
41
+ size: file.size,
42
+ contentType: options?.contentType ?? file.type,
43
+ };
44
+ }
45
+ async delete(key) {
46
+ const filePath = join(this.uploadDir, key);
47
+ if (existsSync(filePath)) {
48
+ unlinkSync(filePath);
49
+ Logger.info('[storage:local] File deleted', { key });
50
+ }
51
+ }
52
+ url(key) {
53
+ const normalised = key.startsWith('/') ? key.slice(1) : key;
54
+ return `${this.baseUrl}/${normalised}`;
55
+ }
56
+ }
57
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../../../src/server/storage/drivers/local.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAA;AAGxD,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,OAAO,WAAW;IACL,SAAS,CAAQ;IACjB,OAAO,CAAQ;IAEhC,YAAY,OAAkD;QAC5D,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAA;QAChF,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,UAAU,CAAA;IAC/C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAU,EAAE,OAAuB;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,CAAA;QAC/C,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,GAAG,UAAU,EAAE,IAAI,GAAG,EAAE,CAAA;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;QAE1C,0BAA0B;QAC1B,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAA;QAC5D,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAEnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;QACvC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QAE5C,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QAEtE,OAAO;YACL,GAAG;YACH,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAClB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC,IAAI;SAC/C,CAAA;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;QAC1C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,UAAU,CAAC,QAAQ,CAAC,CAAA;YACpB,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;QACtD,CAAC;IACH,CAAC;IAED,GAAG,CAAC,GAAW;QACb,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;QAC3D,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,UAAU,EAAE,CAAA;IACxC,CAAC;CACF"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ import type { StorageDriver, UploadOptions, UploadResult } from '../types.js';
11
+ export interface R2Config {
12
+ accountId: string;
13
+ accessKeyId: string;
14
+ secretAccessKey: string;
15
+ bucketName: string;
16
+ /** Public CDN base URL (e.g. https://pub-xxx.r2.dev) */
17
+ baseUrl: string;
18
+ }
19
+ /**
20
+ * Cloudflare R2 storage driver — uses the S3-compatible API.
21
+ *
22
+ * Requires `@aws-sdk/client-s3` for the S3-compatible upload.
23
+ * R2 endpoint: `https://<accountId>.r2.cloudflarestorage.com`
24
+ */
25
+ export declare class R2Driver implements StorageDriver {
26
+ private readonly config;
27
+ constructor(config: R2Config);
28
+ upload(file: File, options?: UploadOptions): Promise<UploadResult>;
29
+ delete(key: string): Promise<void>;
30
+ url(key: string): string;
31
+ }
32
+ //# sourceMappingURL=r2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"r2.d.ts","sourceRoot":"","sources":["../../../../src/server/storage/drivers/r2.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE7E,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAA;CAChB;AAID;;;;;GAKG;AACH,qBAAa,QAAS,YAAW,aAAa;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,QAAQ;IAEvC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAkClE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBxC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAKzB"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ import { generateId } from '../../../shared/utils/id.js';
11
+ import { Logger } from '../../../shared/utils/logger.js';
12
+ // ─── R2Driver ────────────────────────────────────────────────────────────────
13
+ /**
14
+ * Cloudflare R2 storage driver — uses the S3-compatible API.
15
+ *
16
+ * Requires `@aws-sdk/client-s3` for the S3-compatible upload.
17
+ * R2 endpoint: `https://<accountId>.r2.cloudflarestorage.com`
18
+ */
19
+ export class R2Driver {
20
+ config;
21
+ constructor(config) {
22
+ this.config = config;
23
+ }
24
+ async upload(file, options) {
25
+ const { S3Client, PutObjectCommand } = await import('@aws-sdk/client-s3').catch(() => {
26
+ throw new Error('[storage:r2] @aws-sdk/client-s3 is not installed. Run: bun add @aws-sdk/client-s3');
27
+ });
28
+ const ext = file.name.split('.').pop() ?? 'bin';
29
+ const key = options?.key ?? `${generateId()}.${ext}`;
30
+ const contentType = options?.contentType ?? file.type;
31
+ const client = new S3Client({
32
+ region: 'auto',
33
+ endpoint: `https://${this.config.accountId}.r2.cloudflarestorage.com`,
34
+ credentials: {
35
+ accessKeyId: this.config.accessKeyId,
36
+ secretAccessKey: this.config.secretAccessKey,
37
+ },
38
+ });
39
+ const buffer = await file.arrayBuffer();
40
+ await client.send(new PutObjectCommand({
41
+ Bucket: this.config.bucketName,
42
+ Key: key,
43
+ Body: Buffer.from(buffer),
44
+ ContentType: contentType,
45
+ }));
46
+ Logger.info('[storage:r2] File uploaded', { key, size: file.size });
47
+ return { key, url: this.url(key), size: file.size, contentType };
48
+ }
49
+ async delete(key) {
50
+ const { S3Client, DeleteObjectCommand } = await import('@aws-sdk/client-s3').catch(() => {
51
+ throw new Error('[storage:r2] @aws-sdk/client-s3 is not installed.');
52
+ });
53
+ const client = new S3Client({
54
+ region: 'auto',
55
+ endpoint: `https://${this.config.accountId}.r2.cloudflarestorage.com`,
56
+ credentials: {
57
+ accessKeyId: this.config.accessKeyId,
58
+ secretAccessKey: this.config.secretAccessKey,
59
+ },
60
+ });
61
+ await client.send(new DeleteObjectCommand({ Bucket: this.config.bucketName, Key: key }));
62
+ Logger.info('[storage:r2] File deleted', { key });
63
+ }
64
+ url(key) {
65
+ const base = this.config.baseUrl.endsWith('/') ? this.config.baseUrl.slice(0, -1) : this.config.baseUrl;
66
+ const normalised = key.startsWith('/') ? key.slice(1) : key;
67
+ return `${base}/${normalised}`;
68
+ }
69
+ }
70
+ //# sourceMappingURL=r2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"r2.js","sourceRoot":"","sources":["../../../../src/server/storage/drivers/r2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ import type { StorageDriver, UploadOptions, UploadResult } from '../types.js';
11
+ export interface S3Config {
12
+ bucket: string;
13
+ region: string;
14
+ accessKeyId: string;
15
+ secretAccessKey: string;
16
+ /** Public base URL (e.g. https://my-bucket.s3.amazonaws.com) */
17
+ baseUrl?: string;
18
+ }
19
+ /**
20
+ * AWS S3 storage driver using `@aws-sdk/client-s3`.
21
+ */
22
+ export declare class S3Driver implements StorageDriver {
23
+ private readonly config;
24
+ constructor(config: S3Config);
25
+ upload(file: File, options?: UploadOptions): Promise<UploadResult>;
26
+ delete(key: string): Promise<void>;
27
+ url(key: string): string;
28
+ }
29
+ //# sourceMappingURL=s3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3.d.ts","sourceRoot":"","sources":["../../../../src/server/storage/drivers/s3.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE7E,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAID;;GAEG;AACH,qBAAa,QAAS,YAAW,aAAa;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,QAAQ;IAEvC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAiClE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAOzB"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ import { generateId } from '../../../shared/utils/id.js';
11
+ import { Logger } from '../../../shared/utils/logger.js';
12
+ // ─── S3Driver ────────────────────────────────────────────────────────────────
13
+ /**
14
+ * AWS S3 storage driver using `@aws-sdk/client-s3`.
15
+ */
16
+ export class S3Driver {
17
+ config;
18
+ constructor(config) {
19
+ this.config = config;
20
+ }
21
+ async upload(file, options) {
22
+ const { S3Client, PutObjectCommand } = await import('@aws-sdk/client-s3').catch(() => {
23
+ throw new Error('[storage:s3] @aws-sdk/client-s3 is not installed. Run: bun add @aws-sdk/client-s3');
24
+ });
25
+ const ext = file.name.split('.').pop() ?? 'bin';
26
+ const key = options?.key ?? `${generateId()}.${ext}`;
27
+ const contentType = options?.contentType ?? file.type;
28
+ const client = new S3Client({
29
+ region: this.config.region,
30
+ credentials: {
31
+ accessKeyId: this.config.accessKeyId,
32
+ secretAccessKey: this.config.secretAccessKey,
33
+ },
34
+ });
35
+ const buffer = await file.arrayBuffer();
36
+ await client.send(new PutObjectCommand({
37
+ Bucket: this.config.bucket,
38
+ Key: key,
39
+ Body: Buffer.from(buffer),
40
+ ContentType: contentType,
41
+ ACL: options?.public !== false ? 'public-read' : 'private',
42
+ }));
43
+ Logger.info('[storage:s3] File uploaded', { key, size: file.size });
44
+ return { key, url: this.url(key), size: file.size, contentType };
45
+ }
46
+ async delete(key) {
47
+ const { S3Client, DeleteObjectCommand } = await import('@aws-sdk/client-s3').catch(() => {
48
+ throw new Error('[storage:s3] @aws-sdk/client-s3 is not installed.');
49
+ });
50
+ const client = new S3Client({
51
+ region: this.config.region,
52
+ credentials: {
53
+ accessKeyId: this.config.accessKeyId,
54
+ secretAccessKey: this.config.secretAccessKey,
55
+ },
56
+ });
57
+ await client.send(new DeleteObjectCommand({ Bucket: this.config.bucket, Key: key }));
58
+ Logger.info('[storage:s3] File deleted', { key });
59
+ }
60
+ url(key) {
61
+ const base = this.config.baseUrl
62
+ ? (this.config.baseUrl.endsWith('/') ? this.config.baseUrl.slice(0, -1) : this.config.baseUrl)
63
+ : `https://${this.config.bucket}.s3.${this.config.region}.amazonaws.com`;
64
+ const normalised = key.startsWith('/') ? key.slice(1) : key;
65
+ return `${base}/${normalised}`;
66
+ }
67
+ }
68
+ //# sourceMappingURL=s3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3.js","sourceRoot":"","sources":["../../../../src/server/storage/drivers/s3.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ export { useStorage } from './use-storage.js';
11
+ export type { StorageDriver, StorageConfig, UploadOptions, UploadResult } from './types.js';
12
+ export { LocalDriver } from './drivers/local.js';
13
+ export { R2Driver } from './drivers/r2.js';
14
+ export { S3Driver } from './drivers/s3.js';
15
+ export { CloudinaryDriver } from './drivers/cloudinary.js';
16
+ export { BunnyDriver } from './drivers/bunny.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/storage/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC3F,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ export { useStorage } from './use-storage.js';
11
+ export { LocalDriver } from './drivers/local.js';
12
+ export { R2Driver } from './drivers/r2.js';
13
+ export { S3Driver } from './drivers/s3.js';
14
+ export { CloudinaryDriver } from './drivers/cloudinary.js';
15
+ export { BunnyDriver } from './drivers/bunny.js';
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/storage/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ export interface UploadOptions {
11
+ /** Target key / path in the storage bucket */
12
+ key?: string;
13
+ /** MIME type override */
14
+ contentType?: string;
15
+ /** Whether the file should be publicly accessible */
16
+ public?: boolean;
17
+ /** Additional metadata */
18
+ metadata?: Record<string, string>;
19
+ }
20
+ export interface UploadResult {
21
+ /** Storage key (path) of the uploaded file */
22
+ key: string;
23
+ /** Public URL of the uploaded file */
24
+ url: string;
25
+ /** File size in bytes */
26
+ size: number;
27
+ /** MIME type */
28
+ contentType: string;
29
+ }
30
+ /**
31
+ * StorageDriver — interface that all storage drivers must implement.
32
+ *
33
+ * @example
34
+ * ```ts
35
+ * const storage = useStorage(c)
36
+ * const result = await storage.upload(file, { key: 'avatars/user-123.jpg' })
37
+ * const url = storage.url('avatars/user-123.jpg')
38
+ * await storage.delete('avatars/user-123.jpg')
39
+ * ```
40
+ */
41
+ export interface StorageDriver {
42
+ /**
43
+ * Upload a file to storage.
44
+ * @param file - File object from multipart form data
45
+ * @param options - Optional upload configuration
46
+ */
47
+ upload(file: File, options?: UploadOptions): Promise<UploadResult>;
48
+ /**
49
+ * Delete a file from storage by key.
50
+ * @param key - Storage key / path
51
+ */
52
+ delete(key: string): Promise<void>;
53
+ /**
54
+ * Get the public URL for a stored file.
55
+ * @param key - Storage key / path
56
+ */
57
+ url(key: string): string;
58
+ }
59
+ export interface StorageConfig {
60
+ driver: 'local' | 'r2' | 's3' | 'cloudinary' | 'bunny';
61
+ /** Max file size in bytes (default: 10MB) */
62
+ maxSize?: number;
63
+ /** Allowed MIME types (default: all) */
64
+ allowedMimeTypes?: string[];
65
+ /** Base URL for CDN drivers */
66
+ baseUrl?: string;
67
+ /** Local upload directory (default: ./storage/uploads) */
68
+ uploadDir?: string;
69
+ }
70
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/server/storage/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qDAAqD;IACrD,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAA;IACX,sCAAsC;IACtC,GAAG,EAAE,MAAM,CAAA;IACX,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,gBAAgB;IAChB,WAAW,EAAE,MAAM,CAAA;CACpB;AAID;;;;;;;;;;GAUG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;IAElE;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAElC;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CACzB;AAID,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,YAAY,GAAG,OAAO,CAAA;IACtD,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/server/storage/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}