@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,44 @@
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 { z } from 'zod';
11
+ /**
12
+ * QuerySchema — standard query parameter schema for list/collection endpoints.
13
+ *
14
+ * All fields are optional with sensible defaults. Query params arrive as
15
+ * strings from the URL, so coercion is applied where needed.
16
+ *
17
+ * Usage with zodValidator:
18
+ * ```ts
19
+ * import { zodValidator, QuerySchema } from 'vono/server'
20
+ *
21
+ * router.get('/users',
22
+ * zodValidator('query', QuerySchema),
23
+ * async (c) => {
24
+ * const query = c.var.query as QueryDto
25
+ * const { page, limit, q, sortBy, sortOrder } = query
26
+ * }
27
+ * )
28
+ * ```
29
+ */
30
+ export declare const QuerySchema: z.ZodObject<{
31
+ page: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
32
+ limit: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
33
+ q: z.ZodOptional<z.ZodString>;
34
+ sortBy: z.ZodOptional<z.ZodString>;
35
+ sortOrder: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
36
+ desc: "desc";
37
+ asc: "asc";
38
+ }>>>;
39
+ category: z.ZodOptional<z.ZodString>;
40
+ fields: z.ZodPipe<z.ZodOptional<z.ZodString>, z.ZodTransform<string[] | undefined, string | undefined>>;
41
+ }, z.core.$strip>;
42
+ /** Inferred TypeScript type for QuerySchema */
43
+ export type QueryDto = z.infer<typeof QuerySchema>;
44
+ //# sourceMappingURL=query.dto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.dto.d.ts","sourceRoot":"","sources":["../../../src/server/dto/query.dto.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;iBA+DtB,CAAA;AAEF,+CAA+C;AAC/C,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA"}
@@ -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 { z } from 'zod';
11
+ /**
12
+ * QuerySchema — standard query parameter schema for list/collection endpoints.
13
+ *
14
+ * All fields are optional with sensible defaults. Query params arrive as
15
+ * strings from the URL, so coercion is applied where needed.
16
+ *
17
+ * Usage with zodValidator:
18
+ * ```ts
19
+ * import { zodValidator, QuerySchema } from 'vono/server'
20
+ *
21
+ * router.get('/users',
22
+ * zodValidator('query', QuerySchema),
23
+ * async (c) => {
24
+ * const query = c.var.query as QueryDto
25
+ * const { page, limit, q, sortBy, sortOrder } = query
26
+ * }
27
+ * )
28
+ * ```
29
+ */
30
+ export const QuerySchema = z.object({
31
+ /**
32
+ * Current page number (1-indexed).
33
+ * Coerced from string → number. Defaults to 1.
34
+ */
35
+ page: z.coerce
36
+ .number({ invalid_type_error: 'page must be a number' })
37
+ .int('page must be an integer')
38
+ .min(1, 'page must be at least 1')
39
+ .optional()
40
+ .default(1),
41
+ /**
42
+ * Number of items per page.
43
+ * Coerced from string → number. Defaults to 20. Max 100.
44
+ */
45
+ limit: z.coerce
46
+ .number({ invalid_type_error: 'limit must be a number' })
47
+ .int('limit must be an integer')
48
+ .min(1, 'limit must be at least 1')
49
+ .max(100, 'limit cannot exceed 100')
50
+ .optional()
51
+ .default(20),
52
+ /**
53
+ * Full-text search query string.
54
+ * Case-insensitive search applied by the service layer.
55
+ */
56
+ q: z.string().trim().optional(),
57
+ /**
58
+ * Column/field name to sort by.
59
+ * The service layer validates this against allowed columns.
60
+ */
61
+ sortBy: z.string().trim().optional(),
62
+ /**
63
+ * Sort direction.
64
+ */
65
+ sortOrder: z.enum(['asc', 'desc']).optional().default('asc'),
66
+ /**
67
+ * Category filter — single category slug or ID.
68
+ */
69
+ category: z.string().trim().optional(),
70
+ /**
71
+ * Comma-separated list of fields to include in the response.
72
+ * Enables sparse fieldsets (e.g. ?fields=id,email,name).
73
+ * The service/resource layer applies the projection.
74
+ */
75
+ fields: z
76
+ .string()
77
+ .trim()
78
+ .optional()
79
+ .transform((val) => val
80
+ ? val
81
+ .split(',')
82
+ .map((f) => f.trim())
83
+ .filter(Boolean)
84
+ : undefined),
85
+ });
86
+ //# sourceMappingURL=query.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.dto.js","sourceRoot":"","sources":["../../../src/server/dto/query.dto.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC;;;OAGG;IACH,IAAI,EAAE,CAAC,CAAC,MAAM;SACX,MAAM,CAAC,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,CAAC;SACvD,GAAG,CAAC,yBAAyB,CAAC;SAC9B,GAAG,CAAC,CAAC,EAAE,yBAAyB,CAAC;SACjC,QAAQ,EAAE;SACV,OAAO,CAAC,CAAC,CAAC;IAEb;;;OAGG;IACH,KAAK,EAAE,CAAC,CAAC,MAAM;SACZ,MAAM,CAAC,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,CAAC;SACxD,GAAG,CAAC,0BAA0B,CAAC;SAC/B,GAAG,CAAC,CAAC,EAAE,0BAA0B,CAAC;SAClC,GAAG,CAAC,GAAG,EAAE,yBAAyB,CAAC;SACnC,QAAQ,EAAE;SACV,OAAO,CAAC,EAAE,CAAC;IAEd;;;OAGG;IACH,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;IAE/B;;;OAGG;IACH,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;IAEpC;;OAEG;IACH,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAE5D;;OAEG;IACH,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;IAEtC;;;;OAIG;IACH,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,IAAI,EAAE;SACN,QAAQ,EAAE;SACV,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CACjB,GAAG;QACD,CAAC,CAAC,GAAG;aACA,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC;QACpB,CAAC,CAAC,SAAS,CACd;CACJ,CAAC,CAAA"}
@@ -0,0 +1,41 @@
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 EmailDefinition<T> {
11
+ subject: (data: T) => string;
12
+ html: (data: T) => string;
13
+ text?: (data: T) => string;
14
+ }
15
+ export interface RenderedEmail {
16
+ subject: string;
17
+ html: string;
18
+ text: string;
19
+ }
20
+ export interface EmailTemplate<T> {
21
+ render: (data: T) => RenderedEmail;
22
+ }
23
+ /**
24
+ * `defineEmail<T>({ subject, html, text })` — defines a typed email template.
25
+ *
26
+ * Returns an object with a `render(data)` method that produces the final
27
+ * `{ subject, html, text }` strings.
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * export const welcomeEmail = defineEmail<{ name: string; url: string }>({
32
+ * subject: (d) => `Welcome, ${d.name}!`,
33
+ * html: (d) => `<h1>Hi ${d.name}</h1><p><a href="${d.url}">Get started</a></p>`,
34
+ * text: (d) => `Hi ${d.name}. Get started: ${d.url}`,
35
+ * })
36
+ *
37
+ * const { subject, html, text } = welcomeEmail.render({ name: 'Alice', url: 'https://...' })
38
+ * ```
39
+ */
40
+ export declare function defineEmail<T>(definition: EmailDefinition<T>): EmailTemplate<T>;
41
+ //# sourceMappingURL=define-email.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-email.d.ts","sourceRoot":"","sources":["../../../src/server/email/define-email.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAA;IAC5B,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAA;IACzB,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,aAAa,CAAA;CACnC;AAID;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAU/E"}
@@ -0,0 +1,50 @@
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
+ // ─── defineEmail ─────────────────────────────────────────────────────────────
11
+ /**
12
+ * `defineEmail<T>({ subject, html, text })` — defines a typed email template.
13
+ *
14
+ * Returns an object with a `render(data)` method that produces the final
15
+ * `{ subject, html, text }` strings.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * export const welcomeEmail = defineEmail<{ name: string; url: string }>({
20
+ * subject: (d) => `Welcome, ${d.name}!`,
21
+ * html: (d) => `<h1>Hi ${d.name}</h1><p><a href="${d.url}">Get started</a></p>`,
22
+ * text: (d) => `Hi ${d.name}. Get started: ${d.url}`,
23
+ * })
24
+ *
25
+ * const { subject, html, text } = welcomeEmail.render({ name: 'Alice', url: 'https://...' })
26
+ * ```
27
+ */
28
+ export function defineEmail(definition) {
29
+ return {
30
+ render(data) {
31
+ return {
32
+ subject: definition.subject(data),
33
+ html: definition.html(data),
34
+ text: definition.text ? definition.text(data) : stripHtml(definition.html(data)),
35
+ };
36
+ },
37
+ };
38
+ }
39
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
40
+ /**
41
+ * Minimal HTML → plain text fallback when no `text` function is provided.
42
+ * Strips tags and collapses whitespace.
43
+ */
44
+ function stripHtml(html) {
45
+ return html
46
+ .replace(/<[^>]+>/g, ' ')
47
+ .replace(/\s+/g, ' ')
48
+ .trim();
49
+ }
50
+ //# sourceMappingURL=define-email.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-email.js","sourceRoot":"","sources":["../../../src/server/email/define-email.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoBH,gFAAgF;AAEhF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,WAAW,CAAI,UAA8B;IAC3D,OAAO;QACL,MAAM,CAAC,IAAO;YACZ,OAAO;gBACL,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;gBACjC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC3B,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACjF,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAED,gFAAgF;AAEhF;;;GAGG;AACH,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI;SACR,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAA;AACX,CAAC"}
@@ -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
+ import type { SendEmailOptions } from '../send-email.js';
11
+ /**
12
+ * Console driver — logs email to stdout instead of sending.
13
+ * Use in development / testing environments only.
14
+ */
15
+ export declare function send(options: SendEmailOptions): Promise<void>;
16
+ //# sourceMappingURL=console.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../../../src/server/email/drivers/console.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAExD;;;GAGG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAMnE"}
@@ -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 { Logger } from '../../../shared/utils/logger.js';
11
+ /**
12
+ * Console driver — logs email to stdout instead of sending.
13
+ * Use in development / testing environments only.
14
+ */
15
+ export async function send(options) {
16
+ Logger.info('[email:console] Email would be sent', {
17
+ to: options.to,
18
+ subject: options.subject,
19
+ text: options.text?.slice(0, 200),
20
+ });
21
+ }
22
+ //# sourceMappingURL=console.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console.js","sourceRoot":"","sources":["../../../../src/server/email/drivers/console.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAA;AAGxD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAyB;IAClD,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE;QACjD,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;KAClC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,19 @@
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 { SendEmailOptions } from '../send-email.js';
11
+ /**
12
+ * Postmark driver — sends email via the Postmark REST API.
13
+ * Requires `POSTMARK_API_KEY` in environment.
14
+ */
15
+ export declare function send(options: SendEmailOptions & {
16
+ apiKey: string;
17
+ from: string;
18
+ }): Promise<void>;
19
+ //# sourceMappingURL=postmark.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postmark.d.ts","sourceRoot":"","sources":["../../../../src/server/email/drivers/postmark.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAExD;;;GAGG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,gBAAgB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBtG"}
@@ -0,0 +1,39 @@
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
+ /**
12
+ * Postmark driver — sends email via the Postmark REST API.
13
+ * Requires `POSTMARK_API_KEY` in environment.
14
+ */
15
+ export async function send(options) {
16
+ const res = await fetch('https://api.postmarkapp.com/email', {
17
+ method: 'POST',
18
+ headers: {
19
+ 'X-Postmark-Server-Token': options.apiKey,
20
+ 'Content-Type': 'application/json',
21
+ Accept: 'application/json',
22
+ },
23
+ body: JSON.stringify({
24
+ From: options.from,
25
+ To: options.to,
26
+ Subject: options.subject,
27
+ HtmlBody: options.html,
28
+ TextBody: options.text,
29
+ MessageStream: 'outbound',
30
+ }),
31
+ });
32
+ if (!res.ok) {
33
+ const body = await res.text();
34
+ Logger.error('[email:postmark] Failed to send email', { status: res.status, body });
35
+ throw new Error(`Postmark API error: ${res.status} ${body}`);
36
+ }
37
+ Logger.info('[email:postmark] Email sent', { to: options.to, subject: options.subject });
38
+ }
39
+ //# sourceMappingURL=postmark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postmark.js","sourceRoot":"","sources":["../../../../src/server/email/drivers/postmark.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAA;AAGxD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAA4D;IACrF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,mCAAmC,EAAE;QAC3D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,yBAAyB,EAAE,OAAO,CAAC,MAAM;YACzC,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,kBAAkB;SAC3B;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,QAAQ,EAAE,OAAO,CAAC,IAAI;YACtB,QAAQ,EAAE,OAAO,CAAC,IAAI;YACtB,aAAa,EAAE,UAAU;SAC1B,CAAC;KACH,CAAC,CAAA;IAEF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QAC7B,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QACnF,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAA;IAC9D,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;AAC1F,CAAC"}
@@ -0,0 +1,19 @@
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 { SendEmailOptions } from '../send-email.js';
11
+ /**
12
+ * Resend driver — sends email via the Resend REST API.
13
+ * Requires `RESEND_API_KEY` in environment.
14
+ */
15
+ export declare function send(options: SendEmailOptions & {
16
+ apiKey: string;
17
+ from: string;
18
+ }): Promise<void>;
19
+ //# sourceMappingURL=resend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resend.d.ts","sourceRoot":"","sources":["../../../../src/server/email/drivers/resend.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAExD;;;GAGG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,gBAAgB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBtG"}
@@ -0,0 +1,37 @@
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
+ /**
12
+ * Resend driver — sends email via the Resend REST API.
13
+ * Requires `RESEND_API_KEY` in environment.
14
+ */
15
+ export async function send(options) {
16
+ const res = await fetch('https://api.resend.com/emails', {
17
+ method: 'POST',
18
+ headers: {
19
+ Authorization: `Bearer ${options.apiKey}`,
20
+ 'Content-Type': 'application/json',
21
+ },
22
+ body: JSON.stringify({
23
+ from: options.from,
24
+ to: [options.to],
25
+ subject: options.subject,
26
+ html: options.html,
27
+ text: options.text,
28
+ }),
29
+ });
30
+ if (!res.ok) {
31
+ const body = await res.text();
32
+ Logger.error('[email:resend] Failed to send email', { status: res.status, body });
33
+ throw new Error(`Resend API error: ${res.status} ${body}`);
34
+ }
35
+ Logger.info('[email:resend] Email sent', { to: options.to, subject: options.subject });
36
+ }
37
+ //# sourceMappingURL=resend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resend.js","sourceRoot":"","sources":["../../../../src/server/email/drivers/resend.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAA;AAGxD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAA4D;IACrF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,+BAA+B,EAAE;QACvD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,OAAO,CAAC,MAAM,EAAE;YACzC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;YAChB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC;KACH,CAAC,CAAA;IAEF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QAC7B,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QACjF,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAA;IAC5D,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;AACxF,CAAC"}
@@ -0,0 +1,26 @@
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 { SendEmailOptions } from '../send-email.js';
11
+ export interface SmtpOptions {
12
+ host: string;
13
+ port: number;
14
+ user: string;
15
+ pass: string;
16
+ from: string;
17
+ secure?: boolean;
18
+ }
19
+ /**
20
+ * SMTP driver — sends email via nodemailer (Node/Bun only).
21
+ * Not compatible with Cloudflare Workers.
22
+ *
23
+ * Dynamically imports nodemailer to avoid bundling it in CF Workers builds.
24
+ */
25
+ export declare function send(options: SendEmailOptions & SmtpOptions): Promise<void>;
26
+ //# sourceMappingURL=smtp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smtp.d.ts","sourceRoot":"","sources":["../../../../src/server/email/drivers/smtp.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAExD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED;;;;;GAKG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,gBAAgB,GAAG,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBjF"}
@@ -0,0 +1,37 @@
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
+ /**
12
+ * SMTP driver — sends email via nodemailer (Node/Bun only).
13
+ * Not compatible with Cloudflare Workers.
14
+ *
15
+ * Dynamically imports nodemailer to avoid bundling it in CF Workers builds.
16
+ */
17
+ export async function send(options) {
18
+ // Dynamic import — nodemailer is a Node.js-only dependency
19
+ const nodemailer = await import('nodemailer').catch(() => {
20
+ throw new Error('[email:smtp] nodemailer is not installed. Run: bun add nodemailer');
21
+ });
22
+ const transporter = nodemailer.createTransport({
23
+ host: options.host,
24
+ port: options.port,
25
+ secure: options.secure ?? options.port === 465,
26
+ auth: { user: options.user, pass: options.pass },
27
+ });
28
+ await transporter.sendMail({
29
+ from: options.from,
30
+ to: options.to,
31
+ subject: options.subject,
32
+ html: options.html,
33
+ text: options.text,
34
+ });
35
+ Logger.info('[email:smtp] Email sent', { to: options.to, subject: options.subject });
36
+ }
37
+ //# sourceMappingURL=smtp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smtp.js","sourceRoot":"","sources":["../../../../src/server/email/drivers/smtp.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAA;AAYxD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAuC;IAChE,2DAA2D;IAC3D,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QACvD,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAA;IACtF,CAAC,CAAC,CAAA;IAEF,MAAM,WAAW,GAAG,UAAU,CAAC,eAAe,CAAC;QAC7C,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,KAAK,GAAG;QAC9C,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;KACjD,CAAC,CAAA;IAEF,MAAM,WAAW,CAAC,QAAQ,CAAC;QACzB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAC,CAAA;IAEF,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;AACtF,CAAC"}
@@ -0,0 +1,42 @@
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
+ export interface SendEmailOptions {
13
+ to: string;
14
+ subject: string;
15
+ html: string;
16
+ text?: string;
17
+ /** When true, dispatches to queue instead of sending immediately */
18
+ queue?: boolean;
19
+ }
20
+ /**
21
+ * `sendEmail(c, options)` — sends an email via the configured driver.
22
+ *
23
+ * Driver selection (in priority order):
24
+ * 1. `RESEND_API_KEY` → Resend
25
+ * 2. `POSTMARK_API_KEY` → Postmark
26
+ * 3. `SMTP_HOST` → SMTP (nodemailer)
27
+ * 4. Fallback → Console (logs to stdout, dev-only)
28
+ *
29
+ * When `queue: true`, the email is dispatched to the queue instead of
30
+ * being sent immediately (requires queue to be configured).
31
+ *
32
+ * @example
33
+ * await sendEmail(c, {
34
+ * to: 'user@example.com',
35
+ * subject: 'Welcome!',
36
+ * html: '<h1>Hello</h1>',
37
+ * })
38
+ */
39
+ export declare function sendEmail(c: Context<{
40
+ Variables: AppVariables;
41
+ }>, options: SendEmailOptions): Promise<void>;
42
+ //# sourceMappingURL=send-email.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-email.d.ts","sourceRoot":"","sources":["../../../src/server/email/send-email.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAKxD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,oEAAoE;IACpE,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAID;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,SAAS,CAC7B,CAAC,EAAE,OAAO,CAAC;IAAE,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC,EACvC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CA2Cf"}
@@ -0,0 +1,69 @@
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
+ // ─── sendEmail ────────────────────────────────────────────────────────────────
12
+ /**
13
+ * `sendEmail(c, options)` — sends an email via the configured driver.
14
+ *
15
+ * Driver selection (in priority order):
16
+ * 1. `RESEND_API_KEY` → Resend
17
+ * 2. `POSTMARK_API_KEY` → Postmark
18
+ * 3. `SMTP_HOST` → SMTP (nodemailer)
19
+ * 4. Fallback → Console (logs to stdout, dev-only)
20
+ *
21
+ * When `queue: true`, the email is dispatched to the queue instead of
22
+ * being sent immediately (requires queue to be configured).
23
+ *
24
+ * @example
25
+ * await sendEmail(c, {
26
+ * to: 'user@example.com',
27
+ * subject: 'Welcome!',
28
+ * html: '<h1>Hello</h1>',
29
+ * })
30
+ */
31
+ export async function sendEmail(c, options) {
32
+ const config = c.var.config;
33
+ // Queue dispatch — fire-and-forget when queue is configured
34
+ if (options.queue) {
35
+ Logger.info('[email] Queued email dispatch', { to: options.to, subject: options.subject });
36
+ // Queue integration point — when a queue driver is wired, dispatch here.
37
+ // For now, fall through to synchronous send.
38
+ }
39
+ const from = config['EMAIL_FROM'] ?? 'noreply@example.com';
40
+ // Resend
41
+ if (config.RESEND_API_KEY) {
42
+ const { send } = await import('./drivers/resend.js');
43
+ return send({ ...options, apiKey: config.RESEND_API_KEY, from });
44
+ }
45
+ // Postmark
46
+ const postmarkKey = config['POSTMARK_API_KEY'];
47
+ if (postmarkKey) {
48
+ const { send } = await import('./drivers/postmark.js');
49
+ return send({ ...options, apiKey: postmarkKey, from });
50
+ }
51
+ // SMTP
52
+ const smtpHost = config['SMTP_HOST'];
53
+ if (smtpHost) {
54
+ const { send } = await import('./drivers/smtp.js');
55
+ return send({
56
+ ...options,
57
+ host: smtpHost,
58
+ port: Number(config['SMTP_PORT'] ?? 587),
59
+ user: config['SMTP_USER'] ?? '',
60
+ pass: config['SMTP_PASS'] ?? '',
61
+ from,
62
+ });
63
+ }
64
+ // Console fallback (development)
65
+ Logger.warn('[email] No email driver configured — using console driver');
66
+ const { send } = await import('./drivers/console.js');
67
+ return send(options);
68
+ }
69
+ //# sourceMappingURL=send-email.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-email.js","sourceRoot":"","sources":["../../../src/server/email/send-email.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAA;AAarD,iFAAiF;AAEjF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,CAAuC,EACvC,OAAyB;IAEzB,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAA;IAE3B,4DAA4D;IAC5D,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;QAC1F,yEAAyE;QACzE,6CAA6C;IAC/C,CAAC;IAED,MAAM,IAAI,GAAI,MAAiC,CAAC,YAAY,CAAC,IAAI,qBAAqB,CAAA;IAEtF,SAAS;IACT,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAA;QACpD,OAAO,IAAI,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAA;IAClE,CAAC;IAED,WAAW;IACX,MAAM,WAAW,GAAI,MAAiC,CAAC,kBAAkB,CAAC,CAAA;IAC1E,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAA;QACtD,OAAO,IAAI,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;IACxD,CAAC;IAED,OAAO;IACP,MAAM,QAAQ,GAAI,MAAiC,CAAC,WAAW,CAAC,CAAA;IAChE,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;QAClD,OAAO,IAAI,CAAC;YACV,GAAG,OAAO;YACV,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,MAAM,CAAE,MAAiC,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC;YACpE,IAAI,EAAG,MAAiC,CAAC,WAAW,CAAC,IAAI,EAAE;YAC3D,IAAI,EAAG,MAAiC,CAAC,WAAW,CAAC,IAAI,EAAE;YAC3D,IAAI;SACL,CAAC,CAAA;IACJ,CAAC;IAED,iCAAiC;IACjC,MAAM,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAA;IACxE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAA;IACrD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAA;AACtB,CAAC"}