@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,54 @@
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 { Context } from 'hono';
11
+ import type { AppVariables } from '../../types/index.js';
12
+ import type { StorageDriver, StorageConfig, UploadOptions, UploadResult } from './types.js';
13
+ /**
14
+ * StorageClient — wraps a StorageDriver with validation (size + MIME type).
15
+ */
16
+ declare class StorageClient {
17
+ private readonly driver;
18
+ private readonly config;
19
+ constructor(driver: StorageDriver, config: StorageConfig);
20
+ /**
21
+ * Upload a file with size and MIME type validation.
22
+ *
23
+ * @throws HTTPException 413 if file exceeds maxSize
24
+ * @throws HTTPException 415 if MIME type is not allowed
25
+ */
26
+ upload(file: File, options?: UploadOptions): Promise<UploadResult>;
27
+ /** Delete a file by key */
28
+ delete(key: string): Promise<void>;
29
+ /** Get the public URL for a stored file */
30
+ url(key: string): string;
31
+ }
32
+ /**
33
+ * `useStorage(c)` — returns a storage client for the configured driver.
34
+ *
35
+ * Driver selection is based on environment variables:
36
+ * - `R2_BUCKET_NAME` → R2
37
+ * - `S3_BUCKET` → S3
38
+ * - `CLOUDINARY_URL` → Cloudinary
39
+ * - `BUNNY_STORAGE_ZONE` → Bunny.net
40
+ * - Fallback → Local
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * const storage = useStorage(c)
45
+ * const file = await c.req.parseBody()['file'] as File
46
+ * const result = await storage.upload(file, { key: `avatars/${userId}.jpg` })
47
+ * return c.json({ url: result.url })
48
+ * ```
49
+ */
50
+ export declare function useStorage(c: Context<{
51
+ Variables: AppVariables;
52
+ }>, overrideConfig?: Partial<StorageConfig>): Promise<StorageClient>;
53
+ export {};
54
+ //# sourceMappingURL=use-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-storage.d.ts","sourceRoot":"","sources":["../../../src/server/storage/use-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAEnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAExD,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAS3F;;GAEG;AACH,cAAM,aAAa;IAEf,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,aAAa;IAGxC;;;;;OAKG;IACG,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IA+BxE,2BAA2B;IACrB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,2CAA2C;IAC3C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAGzB;AAID;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,UAAU,CAC9B,CAAC,EAAE,OAAO,CAAC;IAAE,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC,EACvC,cAAc,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GACtC,OAAO,CAAC,aAAa,CAAC,CAmExB"}
@@ -0,0 +1,150 @@
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 { HTTPException } from 'hono/http-exception';
11
+ import { Logger } from '../../shared/utils/logger.js';
12
+ import { LocalDriver } from './drivers/local.js';
13
+ // ─── Default limits ───────────────────────────────────────────────────────────
14
+ const DEFAULT_MAX_SIZE = 10 * 1024 * 1024; // 10 MB
15
+ // ─── StorageClient ────────────────────────────────────────────────────────────
16
+ /**
17
+ * StorageClient — wraps a StorageDriver with validation (size + MIME type).
18
+ */
19
+ class StorageClient {
20
+ driver;
21
+ config;
22
+ constructor(driver, config) {
23
+ this.driver = driver;
24
+ this.config = config;
25
+ }
26
+ /**
27
+ * Upload a file with size and MIME type validation.
28
+ *
29
+ * @throws HTTPException 413 if file exceeds maxSize
30
+ * @throws HTTPException 415 if MIME type is not allowed
31
+ */
32
+ async upload(file, options) {
33
+ const maxSize = this.config.maxSize ?? DEFAULT_MAX_SIZE;
34
+ if (file.size > maxSize) {
35
+ Logger.warn('[storage] File too large', { size: file.size, maxSize });
36
+ throw new HTTPException(413, {
37
+ message: `File too large. Maximum allowed size is ${Math.round(maxSize / 1024 / 1024)}MB`,
38
+ });
39
+ }
40
+ const allowedMimeTypes = this.config.allowedMimeTypes;
41
+ if (allowedMimeTypes && allowedMimeTypes.length > 0) {
42
+ const mimeType = file.type || 'application/octet-stream';
43
+ const allowed = allowedMimeTypes.some((pattern) => {
44
+ if (pattern.endsWith('/*')) {
45
+ return mimeType.startsWith(pattern.slice(0, -1));
46
+ }
47
+ return mimeType === pattern;
48
+ });
49
+ if (!allowed) {
50
+ Logger.warn('[storage] MIME type not allowed', { mimeType, allowedMimeTypes });
51
+ throw new HTTPException(415, {
52
+ message: `File type "${mimeType}" is not allowed`,
53
+ });
54
+ }
55
+ }
56
+ return this.driver.upload(file, options);
57
+ }
58
+ /** Delete a file by key */
59
+ async delete(key) {
60
+ return this.driver.delete(key);
61
+ }
62
+ /** Get the public URL for a stored file */
63
+ url(key) {
64
+ return this.driver.url(key);
65
+ }
66
+ }
67
+ // ─── useStorage ───────────────────────────────────────────────────────────────
68
+ /**
69
+ * `useStorage(c)` — returns a storage client for the configured driver.
70
+ *
71
+ * Driver selection is based on environment variables:
72
+ * - `R2_BUCKET_NAME` → R2
73
+ * - `S3_BUCKET` → S3
74
+ * - `CLOUDINARY_URL` → Cloudinary
75
+ * - `BUNNY_STORAGE_ZONE` → Bunny.net
76
+ * - Fallback → Local
77
+ *
78
+ * @example
79
+ * ```ts
80
+ * const storage = useStorage(c)
81
+ * const file = await c.req.parseBody()['file'] as File
82
+ * const result = await storage.upload(file, { key: `avatars/${userId}.jpg` })
83
+ * return c.json({ url: result.url })
84
+ * ```
85
+ */
86
+ export async function useStorage(c, overrideConfig) {
87
+ const config = c.var.config;
88
+ const storageConfig = {
89
+ driver: 'local',
90
+ maxSize: DEFAULT_MAX_SIZE,
91
+ ...overrideConfig,
92
+ };
93
+ let driver;
94
+ // R2
95
+ if (config['R2_BUCKET_NAME'] && config['CLOUDFLARE_ACCOUNT_ID']) {
96
+ storageConfig.driver = 'r2';
97
+ const { R2Driver } = await import('./drivers/r2.js');
98
+ driver = new R2Driver({
99
+ accountId: config['CLOUDFLARE_ACCOUNT_ID'],
100
+ accessKeyId: config['R2_ACCESS_KEY_ID'] ?? '',
101
+ secretAccessKey: config['R2_SECRET_ACCESS_KEY'] ?? '',
102
+ bucketName: config['R2_BUCKET_NAME'],
103
+ baseUrl: overrideConfig?.baseUrl ?? config['R2_PUBLIC_URL'] ?? '',
104
+ });
105
+ }
106
+ // S3
107
+ else if (config['S3_BUCKET']) {
108
+ storageConfig.driver = 's3';
109
+ const { S3Driver } = await import('./drivers/s3.js');
110
+ driver = new S3Driver({
111
+ bucket: config['S3_BUCKET'],
112
+ region: config['S3_REGION'] ?? 'us-east-1',
113
+ accessKeyId: config['S3_ACCESS_KEY'] ?? '',
114
+ secretAccessKey: config['S3_SECRET_KEY'] ?? '',
115
+ baseUrl: overrideConfig?.baseUrl,
116
+ });
117
+ }
118
+ // Cloudinary
119
+ else if (config['CLOUDINARY_URL']) {
120
+ storageConfig.driver = 'cloudinary';
121
+ // Parse CLOUDINARY_URL: cloudinary://api_key:api_secret@cloud_name
122
+ const url = new URL(config['CLOUDINARY_URL']);
123
+ const { CloudinaryDriver } = await import('./drivers/cloudinary.js');
124
+ driver = new CloudinaryDriver({
125
+ cloudName: url.hostname,
126
+ apiKey: url.username,
127
+ apiSecret: url.password,
128
+ });
129
+ }
130
+ // Bunny.net
131
+ else if (config['BUNNY_STORAGE_ZONE']) {
132
+ storageConfig.driver = 'bunny';
133
+ const { BunnyDriver } = await import('./drivers/bunny.js');
134
+ driver = new BunnyDriver({
135
+ storageZone: config['BUNNY_STORAGE_ZONE'],
136
+ accessKey: config['BUNNY_ACCESS_KEY'] ?? '',
137
+ cdnUrl: overrideConfig?.baseUrl ?? config['BUNNY_CDN_URL'] ?? '',
138
+ });
139
+ }
140
+ // Local fallback
141
+ else {
142
+ storageConfig.driver = 'local';
143
+ driver = new LocalDriver({
144
+ uploadDir: overrideConfig?.uploadDir,
145
+ baseUrl: overrideConfig?.baseUrl,
146
+ });
147
+ }
148
+ return new StorageClient(driver, storageConfig);
149
+ }
150
+ //# sourceMappingURL=use-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-storage.js","sourceRoot":"","sources":["../../../src/server/storage/use-storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
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 { Context } from 'hono';
11
+ import type { RouteRules } from './route-rules.js';
12
+ export interface StreamRenderResult {
13
+ vueStream: ReadableStream;
14
+ headTags: string;
15
+ bodyAttrs: string;
16
+ htmlAttrs: string;
17
+ piniaState: string;
18
+ }
19
+ /**
20
+ * Render a URL as a streaming SSR response.
21
+ *
22
+ * Sends the <head> section immediately, then streams Vue-rendered HTML
23
+ * in chunks, minimizing Time to First Byte (TTFB).
24
+ *
25
+ * Falls back to null for SPA routes (caller should use non-streaming path).
26
+ */
27
+ export declare function renderStream(url: string, routeRules: RouteRules, createApp: (opts: {
28
+ isServer: boolean;
29
+ url: string;
30
+ }) => {
31
+ app: unknown;
32
+ router: {
33
+ push: (url: string) => Promise<void>;
34
+ isReady: () => Promise<void>;
35
+ };
36
+ pinia: {
37
+ state: {
38
+ value: Record<string, unknown>;
39
+ };
40
+ };
41
+ head: unknown;
42
+ }): Promise<StreamRenderResult | null>;
43
+ /**
44
+ * Stream an SSR response using Hono's stream() helper.
45
+ *
46
+ * Writes the <head> immediately, then pipes Vue chunks, then closes.
47
+ */
48
+ export declare function streamResponse(c: Context, url: string, routeRules: RouteRules, templateHtml: string, createApp: Parameters<typeof renderStream>[2]): Promise<Response>;
49
+ //# sourceMappingURL=stream-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-renderer.d.ts","sourceRoot":"","sources":["../../src/server/stream-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAKlD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,cAAc,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,KAAK;IACvD,GAAG,EAAE,OAAO,CAAA;IACZ,MAAM,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAA;IAC9E,KAAK,EAAE;QAAE,KAAK,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,CAAA;KAAE,CAAA;IACpD,IAAI,EAAE,OAAO,CAAA;CACd,GACA,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAwBpC;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,CAAC,EAAE,OAAO,EACV,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,GAC5C,OAAO,CAAC,QAAQ,CAAC,CAmDnB"}
@@ -0,0 +1,89 @@
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 { resolveRouteRule } from './route-rules.js';
11
+ import { buildHtml, injectPiniaState, STATIC_500 } from './renderer.js';
12
+ import { Logger } from '../shared/utils/logger.js';
13
+ /**
14
+ * Render a URL as a streaming SSR response.
15
+ *
16
+ * Sends the <head> section immediately, then streams Vue-rendered HTML
17
+ * in chunks, minimizing Time to First Byte (TTFB).
18
+ *
19
+ * Falls back to null for SPA routes (caller should use non-streaming path).
20
+ */
21
+ export async function renderStream(url, routeRules, createApp) {
22
+ const rule = resolveRouteRule(url, routeRules);
23
+ // SPA routes don't stream
24
+ if (rule.mode === 'spa')
25
+ return null;
26
+ const { renderToWebStream } = await import('vue/server-renderer');
27
+ const { renderSSRHead } = await import('@unhead/ssr');
28
+ const { app, router, pinia, head } = createApp({ isServer: true, url });
29
+ await router.push(url);
30
+ await router.isReady();
31
+ const vueStream = renderToWebStream(app);
32
+ const headPayload = await renderSSRHead(head);
33
+ return {
34
+ vueStream,
35
+ headTags: headPayload.headTags,
36
+ bodyAttrs: headPayload.bodyAttrs ?? '',
37
+ htmlAttrs: headPayload.htmlAttrs ?? '',
38
+ piniaState: JSON.stringify(pinia.state.value),
39
+ };
40
+ }
41
+ /**
42
+ * Stream an SSR response using Hono's stream() helper.
43
+ *
44
+ * Writes the <head> immediately, then pipes Vue chunks, then closes.
45
+ */
46
+ export async function streamResponse(c, url, routeRules, templateHtml, createApp) {
47
+ const { stream } = await import('hono/streaming');
48
+ try {
49
+ const result = await renderStream(url, routeRules, createApp);
50
+ if (!result) {
51
+ // SPA fallback — non-streaming
52
+ const rule = resolveRouteRule(url, routeRules);
53
+ c.header('X-Robots-Tag', 'noindex, nofollow');
54
+ return c.html(buildHtml(templateHtml, {
55
+ html: '', head: '<title>App</title>',
56
+ bodyAttrs: '', htmlAttrs: '', piniaState: '', rule,
57
+ }));
58
+ }
59
+ const [beforeApp, afterApp] = templateHtml.split('<!--ssr-outlet-->');
60
+ let headSection = beforeApp.replace('<!--head-outlet-->', result.headTags);
61
+ if (result.htmlAttrs) {
62
+ headSection = headSection.replace('<html lang="en">', `<html lang="en" ${result.htmlAttrs}>`);
63
+ }
64
+ if (result.bodyAttrs) {
65
+ headSection = headSection.replace('<body>', `<body ${result.bodyAttrs}>`);
66
+ }
67
+ const piniaScript = result.piniaState && result.piniaState !== '{}'
68
+ ? injectPiniaState(result.piniaState)
69
+ : '';
70
+ const closing = afterApp.replace('<!--state-outlet-->', piniaScript);
71
+ return stream(c, async (s) => {
72
+ await s.write(headSection);
73
+ const reader = result.vueStream.getReader();
74
+ const decoder = new TextDecoder();
75
+ while (true) {
76
+ const { done, value } = await reader.read();
77
+ if (done)
78
+ break;
79
+ await s.write(typeof value === 'string' ? value : decoder.decode(value));
80
+ }
81
+ await s.write(closing);
82
+ });
83
+ }
84
+ catch (err) {
85
+ Logger.error('[vono] Stream render error', { url, error: String(err) });
86
+ return c.html(STATIC_500, 500);
87
+ }
88
+ }
89
+ //# sourceMappingURL=stream-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-renderer.js","sourceRoot":"","sources":["../../src/server/stream-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
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 { Hono } from 'hono';
11
+ /**
12
+ * Health check routes.
13
+ *
14
+ * Mounted at /health on the inner API router.
15
+ * Returns a simple { status: 'ok', timestamp } payload.
16
+ *
17
+ * Usage (auto-registered via autoRegisterRoutes):
18
+ * GET /api/v1/health → { status: 'ok', timestamp: '...' }
19
+ */
20
+ declare const healthRoutes: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
21
+ export default healthRoutes;
22
+ //# sourceMappingURL=health.routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.routes.d.ts","sourceRoot":"","sources":["../../../src/server/templates/health.routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B;;;;;;;;GAQG;AACH,QAAA,MAAM,YAAY,4EAAa,CAAA;AAS/B,eAAe,YAAY,CAAA"}
@@ -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 { Hono } from 'hono';
11
+ /**
12
+ * Health check routes.
13
+ *
14
+ * Mounted at /health on the inner API router.
15
+ * Returns a simple { status: 'ok', timestamp } payload.
16
+ *
17
+ * Usage (auto-registered via autoRegisterRoutes):
18
+ * GET /api/v1/health → { status: 'ok', timestamp: '...' }
19
+ */
20
+ const healthRoutes = new Hono();
21
+ healthRoutes.get('/', (c) => {
22
+ return c.json({
23
+ status: 'ok',
24
+ timestamp: new Date().toISOString(),
25
+ });
26
+ });
27
+ export default healthRoutes;
28
+ //# sourceMappingURL=health.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.routes.js","sourceRoot":"","sources":["../../../src/server/templates/health.routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B;;;;;;;;GAQG;AACH,MAAM,YAAY,GAAG,IAAI,IAAI,EAAE,CAAA;AAE/B,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE;IAC1B,OAAO,CAAC,CAAC,IAAI,CAAC;QACZ,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,eAAe,YAAY,CAAA"}
@@ -0,0 +1,36 @@
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 StorageUrlConfig {
11
+ /** Storage driver — determines URL resolution strategy */
12
+ driver?: 'local' | 'r2' | 's3' | 'cloudinary' | 'bunny';
13
+ /** Base URL for CDN drivers (e.g. https://cdn.example.com) */
14
+ baseUrl?: string;
15
+ }
16
+ /**
17
+ * `resolveStorageUrl(path, config?)` — converts a stored file path to a full
18
+ * public URL based on the configured storage driver.
19
+ *
20
+ * | Driver | Result |
21
+ * |------------|-----------------------------------------|
22
+ * | local | `/uploads/<path>` |
23
+ * | r2 | `<baseUrl>/<path>` |
24
+ * | s3 | `<baseUrl>/<path>` |
25
+ * | cloudinary | `<baseUrl>/<path>` |
26
+ * | bunny | `<baseUrl>/<path>` |
27
+ *
28
+ * @example
29
+ * resolveStorageUrl('avatars/user-123.jpg', { driver: 'r2', baseUrl: 'https://cdn.example.com' })
30
+ * // → 'https://cdn.example.com/avatars/user-123.jpg'
31
+ *
32
+ * resolveStorageUrl('avatars/user-123.jpg')
33
+ * // → '/uploads/avatars/user-123.jpg'
34
+ */
35
+ export declare function resolveStorageUrl(path: string, config?: StorageUrlConfig): string;
36
+ //# sourceMappingURL=storage-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-url.d.ts","sourceRoot":"","sources":["../../../src/server/utils/storage-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,gBAAgB;IAC/B,0DAA0D;IAC1D,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,YAAY,GAAG,OAAO,CAAA;IACvD,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAID;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,MAAM,CA0BjF"}
@@ -0,0 +1,53 @@
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
+ // ─── resolveStorageUrl ────────────────────────────────────────────────────────
11
+ /**
12
+ * `resolveStorageUrl(path, config?)` — converts a stored file path to a full
13
+ * public URL based on the configured storage driver.
14
+ *
15
+ * | Driver | Result |
16
+ * |------------|-----------------------------------------|
17
+ * | local | `/uploads/<path>` |
18
+ * | r2 | `<baseUrl>/<path>` |
19
+ * | s3 | `<baseUrl>/<path>` |
20
+ * | cloudinary | `<baseUrl>/<path>` |
21
+ * | bunny | `<baseUrl>/<path>` |
22
+ *
23
+ * @example
24
+ * resolveStorageUrl('avatars/user-123.jpg', { driver: 'r2', baseUrl: 'https://cdn.example.com' })
25
+ * // → 'https://cdn.example.com/avatars/user-123.jpg'
26
+ *
27
+ * resolveStorageUrl('avatars/user-123.jpg')
28
+ * // → '/uploads/avatars/user-123.jpg'
29
+ */
30
+ export function resolveStorageUrl(path, config) {
31
+ const driver = config?.driver ?? 'local';
32
+ const baseUrl = config?.baseUrl ?? '';
33
+ // Normalise path — strip leading slash to avoid double slashes
34
+ const normalised = path.startsWith('/') ? path.slice(1) : path;
35
+ switch (driver) {
36
+ case 'local':
37
+ return `/uploads/${normalised}`;
38
+ case 'r2':
39
+ case 's3':
40
+ case 'cloudinary':
41
+ case 'bunny': {
42
+ if (!baseUrl) {
43
+ // Fallback to local-style path when no baseUrl is configured
44
+ return `/uploads/${normalised}`;
45
+ }
46
+ const base = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;
47
+ return `${base}/${normalised}`;
48
+ }
49
+ default:
50
+ return `/uploads/${normalised}`;
51
+ }
52
+ }
53
+ //# sourceMappingURL=storage-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-url.js","sourceRoot":"","sources":["../../../src/server/utils/storage-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAWH,iFAAiF;AAEjF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,MAAyB;IACvE,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,OAAO,CAAA;IACxC,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,EAAE,CAAA;IAErC,+DAA+D;IAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAE9D,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO;YACV,OAAO,YAAY,UAAU,EAAE,CAAA;QAEjC,KAAK,IAAI,CAAC;QACV,KAAK,IAAI,CAAC;QACV,KAAK,YAAY,CAAC;QAClB,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,6DAA6D;gBAC7D,OAAO,YAAY,UAAU,EAAE,CAAA;YACjC,CAAC;YACD,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;YACnE,OAAO,GAAG,IAAI,IAAI,UAAU,EAAE,CAAA;QAChC,CAAC;QAED;YACE,OAAO,YAAY,UAAU,EAAE,CAAA;IACnC,CAAC;AACH,CAAC"}
@@ -0,0 +1,22 @@
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 { Hono } from 'hono';
11
+ /**
12
+ * Auto-discovers and mounts all routes.ts files from src/modules.
13
+ *
14
+ * Pass the result of import.meta.glob from your Vite project:
15
+ *
16
+ * const mods = import.meta.glob('/src/modules/' + '*' + '/' + '*.routes.ts', { eager: true })
17
+ * await autoRegisterRoutes(api, mods)
18
+ */
19
+ export declare function autoRegisterRoutes(app: Hono, modules: Record<string, {
20
+ default?: Hono;
21
+ }>): Promise<void>;
22
+ //# sourceMappingURL=autoRoutes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoRoutes.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/autoRoutes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAEhC;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,IAAI,EACT,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,OAAO,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC,GAC1C,OAAO,CAAC,IAAI,CAAC,CAUf"}
@@ -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
+ /**
11
+ * Auto-discovers and mounts all routes.ts files from src/modules.
12
+ *
13
+ * Pass the result of import.meta.glob from your Vite project:
14
+ *
15
+ * const mods = import.meta.glob('/src/modules/' + '*' + '/' + '*.routes.ts', { eager: true })
16
+ * await autoRegisterRoutes(api, mods)
17
+ */
18
+ export async function autoRegisterRoutes(app, modules) {
19
+ for (const [path, mod] of Object.entries(modules)) {
20
+ const match = path.match(/\/modules\/([^/]+)\//);
21
+ if (!match)
22
+ continue;
23
+ const prefix = `/${match[1]}`;
24
+ if (!mod.default)
25
+ continue;
26
+ app.route(prefix, mod.default);
27
+ }
28
+ }
29
+ //# sourceMappingURL=autoRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoRoutes.js","sourceRoot":"","sources":["../../../src/shared/utils/autoRoutes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAS,EACT,OAA2C;IAE3C,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAA;QAChD,IAAI,CAAC,KAAK;YAAE,SAAQ;QAEpB,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;QAC7B,IAAI,CAAC,GAAG,CAAC,OAAO;YAAE,SAAQ;QAE1B,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC;AACH,CAAC"}
@@ -0,0 +1,25 @@
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
+ /**
11
+ * Generate a UUID v4 string using the Web Crypto API.
12
+ * Works on all runtimes: Node.js, Bun, Deno, Cloudflare Workers.
13
+ *
14
+ * Property 14: returned value matches UUID v4 pattern
15
+ * xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
16
+ */
17
+ export declare function generateId(): string;
18
+ /**
19
+ * Generate a prefixed ID in the format `<prefix>_<uuid>`.
20
+ * e.g. prefixedId('usr') → 'usr_550e8400-e29b-41d4-a716-446655440000'
21
+ *
22
+ * Property 15: prefixedId(prefix).split('_')[0] === prefix
23
+ */
24
+ export declare function prefixedId(prefix: string): string;
25
+ //# sourceMappingURL=id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/id.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;GAMG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjD"}