@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,83 @@
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
+ const INCOMPATIBLE = [
11
+ {
12
+ runtime: ['cloudflare-workers', 'cloudflare-pages'],
13
+ driver: 'bullmq',
14
+ driverType: 'queue',
15
+ reason: 'BullMQ requires Redis and Node.js APIs not available on Cloudflare Workers. ' +
16
+ 'Use cloudflare-queues instead.',
17
+ },
18
+ {
19
+ runtime: ['cloudflare-workers', 'cloudflare-pages'],
20
+ driver: 'sqs',
21
+ driverType: 'queue',
22
+ reason: 'AWS SQS SDK is not compatible with Cloudflare Workers. ' +
23
+ 'Use cloudflare-queues instead.',
24
+ },
25
+ {
26
+ runtime: ['cloudflare-workers', 'cloudflare-pages'],
27
+ driver: 's3',
28
+ driverType: 'storage',
29
+ reason: 'AWS S3 SDK requires Node.js APIs not available on Cloudflare Workers. ' +
30
+ 'Use R2 instead.',
31
+ },
32
+ {
33
+ runtime: ['cloudflare-workers', 'cloudflare-pages'],
34
+ driver: 'local',
35
+ driverType: 'storage',
36
+ reason: 'Local filesystem storage is not available on Cloudflare Workers. ' +
37
+ 'Use R2 instead.',
38
+ },
39
+ {
40
+ runtime: ['vercel', 'netlify', 'deno', 'fastly'],
41
+ driver: 'bullmq',
42
+ driverType: 'queue',
43
+ reason: 'BullMQ requires a persistent Redis connection which is not available on serverless runtimes. ' +
44
+ 'Use Upstash QStash instead.',
45
+ },
46
+ {
47
+ runtime: ['vercel', 'netlify', 'deno', 'fastly'],
48
+ driver: 'local',
49
+ driverType: 'storage',
50
+ reason: 'Local filesystem storage is ephemeral on serverless runtimes. ' +
51
+ 'Use S3 or another cloud storage driver.',
52
+ },
53
+ ];
54
+ // ─── validateDriverCompatibility ────────────────────────────────────
55
+ /**
56
+ * validateDriverCompatibility — throws a descriptive error for
57
+ * incompatible driver/runtime combinations.
58
+ *
59
+ * Call this at startup before accepting requests.
60
+ *
61
+ * @throws Error with a human-readable message listing all conflicts
62
+ */
63
+ export function validateDriverCompatibility(runtime, queueDriver, storageDriver, cacheDriver) {
64
+ const errors = [];
65
+ for (const rule of INCOMPATIBLE) {
66
+ if (!rule.runtime.includes(runtime))
67
+ continue;
68
+ const driverValue = rule.driverType === 'queue'
69
+ ? queueDriver
70
+ : rule.driverType === 'storage'
71
+ ? storageDriver
72
+ : cacheDriver;
73
+ if (driverValue === rule.driver) {
74
+ errors.push(` ❌ [${rule.driverType}] "${rule.driver}" is incompatible with runtime "${runtime}":\n` +
75
+ ` ${rule.reason}`);
76
+ }
77
+ }
78
+ if (errors.length > 0) {
79
+ throw new Error(`[vono] Driver compatibility errors detected:\n\n${errors.join('\n\n')}\n\n` +
80
+ `Fix these in your vono.config.ts before starting the server.`);
81
+ }
82
+ }
83
+ //# sourceMappingURL=validate-compatibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-compatibility.js","sourceRoot":"","sources":["../../../src/server/resolvers/validate-compatibility.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAeH,MAAM,YAAY,GAA0B;IAC1C;QACE,OAAO,EAAE,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;QACnD,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,OAAO;QACnB,MAAM,EACJ,8EAA8E;YAC9E,gCAAgC;KACnC;IACD;QACE,OAAO,EAAE,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;QACnD,MAAM,EAAE,KAAK;QACb,UAAU,EAAE,OAAO;QACnB,MAAM,EACJ,yDAAyD;YACzD,gCAAgC;KACnC;IACD;QACE,OAAO,EAAE,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;QACnD,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,SAAS;QACrB,MAAM,EACJ,wEAAwE;YACxE,iBAAiB;KACpB;IACD;QACE,OAAO,EAAE,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;QACnD,MAAM,EAAE,OAAO;QACf,UAAU,EAAE,SAAS;QACrB,MAAM,EACJ,mEAAmE;YACnE,iBAAiB;KACpB;IACD;QACE,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC;QAChD,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,OAAO;QACnB,MAAM,EACJ,+FAA+F;YAC/F,6BAA6B;KAChC;IACD;QACE,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC;QAChD,MAAM,EAAE,OAAO;QACf,UAAU,EAAE,SAAS;QACrB,MAAM,EACJ,gEAAgE;YAChE,yCAAyC;KAC5C;CACF,CAAA;AAED,uEAAuE;AAEvE;;;;;;;GAOG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAAe,EACf,WAAwB,EACxB,aAA4B,EAC5B,WAAwB;IAExB,MAAM,MAAM,GAAa,EAAE,CAAA;IAE3B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAQ;QAE7C,MAAM,WAAW,GACf,IAAI,CAAC,UAAU,KAAK,OAAO;YACzB,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS;gBAC7B,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,WAAW,CAAA;QAEnB,IAAI,WAAW,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CACT,QAAQ,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC,MAAM,mCAAmC,OAAO,MAAM;gBACtF,QAAQ,IAAI,CAAC,MAAM,EAAE,CACxB,CAAA;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,mDAAmD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1E,8DAA8D,CACjE,CAAA;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ import { type PaginationMeta } from '../../shared/utils/pagination.js';
11
+ export interface ResourceCollection<T = Record<string, unknown>> {
12
+ items: T[];
13
+ meta: PaginationMeta;
14
+ }
15
+ /**
16
+ * BaseResource — abstract base class for API resource transformers.
17
+ *
18
+ * Extend this class to define how a model is serialized for API responses.
19
+ * Override `transform(item)` to customize field mapping.
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * export class UserResource extends BaseResource {
24
+ * static transform(item: Record<string, unknown>) {
25
+ * return { id: item.id, email: item.email, name: item.username }
26
+ * }
27
+ * }
28
+ *
29
+ * return c.json(success('Users', UserResource.toCollection(users, total, page, limit)))
30
+ * ```
31
+ */
32
+ export declare abstract class BaseResource {
33
+ /**
34
+ * Override in subclasses to customize field mapping.
35
+ * By default returns the item with snake_case → camelCase conversion.
36
+ */
37
+ protected static transform(item: Record<string, unknown>): Record<string, unknown>;
38
+ /**
39
+ * `toResource(item, fields?)` — transforms a single item.
40
+ *
41
+ * @param item - Raw DB row or plain object
42
+ * @param fields - Optional allowlist of field names to include in the output
43
+ */
44
+ static toResource(item: Record<string, unknown>, fields?: string[]): Record<string, unknown>;
45
+ /**
46
+ * `toCollection(items, total, page, limit)` — transforms an array of items
47
+ * and wraps them with standard pagination metadata.
48
+ *
49
+ * @param items - Array of raw DB rows
50
+ * @param total - Total count across all pages
51
+ * @param page - Current page (1-indexed)
52
+ * @param limit - Items per page
53
+ * @param fields - Optional field allowlist applied to each item
54
+ */
55
+ static toCollection(items: Record<string, unknown>[], total: number, page: number, limit: number, fields?: string[]): ResourceCollection;
56
+ }
57
+ //# sourceMappingURL=base-resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-resource.d.ts","sourceRoot":"","sources":["../../../src/server/resources/base-resource.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAK3F,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC7D,KAAK,EAAE,CAAC,EAAE,CAAA;IACV,IAAI,EAAE,cAAc,CAAA;CACrB;AAID;;;;;;;;;;;;;;;;GAgBG;AACH,8BAAsB,YAAY;IAChC;;;OAGG;IACH,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIlF;;;;;OAKG;IACH,MAAM,CAAC,UAAU,CACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,CAAC,EAAE,MAAM,EAAE,GAChB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAgB1B;;;;;;;;;OASG;IACH,MAAM,CAAC,YAAY,CACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAChC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EAAE,GAChB,kBAAkB;CAMtB"}
@@ -0,0 +1,74 @@
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 { buildPaginationMeta } from '../../shared/utils/pagination.js';
11
+ import { toCamel } from '../../shared/utils/mappers.js';
12
+ // ─── BaseResource ─────────────────────────────────────────────────────────────
13
+ /**
14
+ * BaseResource — abstract base class for API resource transformers.
15
+ *
16
+ * Extend this class to define how a model is serialized for API responses.
17
+ * Override `transform(item)` to customize field mapping.
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * export class UserResource extends BaseResource {
22
+ * static transform(item: Record<string, unknown>) {
23
+ * return { id: item.id, email: item.email, name: item.username }
24
+ * }
25
+ * }
26
+ *
27
+ * return c.json(success('Users', UserResource.toCollection(users, total, page, limit)))
28
+ * ```
29
+ */
30
+ export class BaseResource {
31
+ /**
32
+ * Override in subclasses to customize field mapping.
33
+ * By default returns the item with snake_case → camelCase conversion.
34
+ */
35
+ static transform(item) {
36
+ return toCamel(item);
37
+ }
38
+ /**
39
+ * `toResource(item, fields?)` — transforms a single item.
40
+ *
41
+ * @param item - Raw DB row or plain object
42
+ * @param fields - Optional allowlist of field names to include in the output
43
+ */
44
+ static toResource(item, fields) {
45
+ const transformed = this.transform(item);
46
+ if (!fields || fields.length === 0) {
47
+ return transformed;
48
+ }
49
+ // Apply field selection — only include requested fields
50
+ return fields.reduce((acc, field) => {
51
+ if (Object.prototype.hasOwnProperty.call(transformed, field)) {
52
+ acc[field] = transformed[field];
53
+ }
54
+ return acc;
55
+ }, {});
56
+ }
57
+ /**
58
+ * `toCollection(items, total, page, limit)` — transforms an array of items
59
+ * and wraps them with standard pagination metadata.
60
+ *
61
+ * @param items - Array of raw DB rows
62
+ * @param total - Total count across all pages
63
+ * @param page - Current page (1-indexed)
64
+ * @param limit - Items per page
65
+ * @param fields - Optional field allowlist applied to each item
66
+ */
67
+ static toCollection(items, total, page, limit, fields) {
68
+ return {
69
+ items: items.map((item) => this.toResource(item, fields)),
70
+ meta: buildPaginationMeta(page, limit, total),
71
+ };
72
+ }
73
+ }
74
+ //# sourceMappingURL=base-resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-resource.js","sourceRoot":"","sources":["../../../src/server/resources/base-resource.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,mBAAmB,EAAuB,MAAM,kCAAkC,CAAA;AAC3F,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAA;AASvD,iFAAiF;AAEjF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAgB,YAAY;IAChC;;;OAGG;IACO,MAAM,CAAC,SAAS,CAAC,IAA6B;QACtD,OAAO,OAAO,CAAC,IAAI,CAA4B,CAAA;IACjD,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,UAAU,CACf,IAA6B,EAC7B,MAAiB;QAEjB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAExC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,WAAW,CAAA;QACpB,CAAC;QAED,wDAAwD;QACxD,OAAO,MAAM,CAAC,MAAM,CAA0B,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YAC3D,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;gBAC7D,GAAG,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;YACjC,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC,EAAE,EAAE,CAAC,CAAA;IACR,CAAC;IAED;;;;;;;;;OASG;IACH,MAAM,CAAC,YAAY,CACjB,KAAgC,EAChC,KAAa,EACb,IAAY,EACZ,KAAa,EACb,MAAiB;QAEjB,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACzD,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC;SAC9C,CAAA;IACH,CAAC;CACF"}
@@ -0,0 +1,45 @@
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 type RenderMode = 'ssr' | 'spa' | 'prerender';
11
+ export interface RouteRule {
12
+ /** How this route renders */
13
+ mode: RenderMode;
14
+ /** Cache-Control max-age in seconds. Only for SSR/prerender. */
15
+ cache?: number;
16
+ /** Stale-while-revalidate: serve stale while revalidating in background */
17
+ swr?: boolean;
18
+ }
19
+ export type RouteRules = Record<string, RouteRule>;
20
+ /** Default rule returned when no pattern matches — SSR by default */
21
+ export declare const defaultRule: RouteRule;
22
+ /**
23
+ * Match a URL path against a single pattern.
24
+ *
25
+ * Supports:
26
+ * - Exact match: '/about' matches '/about' only
27
+ * - Wildcard suffix: '/blog/**' matches '/blog', '/blog/post', '/blog/2024/foo'
28
+ */
29
+ export declare function matchPattern(pattern: string, path: string): boolean;
30
+ /**
31
+ * Resolve the route rule for a given URL path.
32
+ *
33
+ * Patterns are matched top-to-bottom — first match wins.
34
+ * Returns defaultRule if no pattern matches.
35
+ *
36
+ * Property 9: returns defaultRule for unmatched paths
37
+ * Property 10: first-match semantics
38
+ */
39
+ export declare function resolveRouteRule(path: string, routeRules: RouteRules): RouteRule;
40
+ /**
41
+ * Default route rules for a new Vono project.
42
+ * Public pages → SSR, app pages → SPA.
43
+ */
44
+ export declare const defaultRouteRules: RouteRules;
45
+ //# sourceMappingURL=route-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-rules.d.ts","sourceRoot":"","sources":["../../src/server/route-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,WAAW,CAAA;AAEpD,MAAM,WAAW,SAAS;IACxB,6BAA6B;IAC7B,IAAI,EAAE,UAAU,CAAA;IAChB,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2EAA2E;IAC3E,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;AAElD,qEAAqE;AACrE,eAAO,MAAM,WAAW,EAAE,SAA2B,CAAA;AAErD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAWnE;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,UAAU,GACrB,SAAS,CAKX;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAgB/B,CAAA"}
@@ -0,0 +1,66 @@
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
+ /** Default rule returned when no pattern matches — SSR by default */
11
+ export const defaultRule = { mode: 'ssr' };
12
+ /**
13
+ * Match a URL path against a single pattern.
14
+ *
15
+ * Supports:
16
+ * - Exact match: '/about' matches '/about' only
17
+ * - Wildcard suffix: '/blog/**' matches '/blog', '/blog/post', '/blog/2024/foo'
18
+ */
19
+ export function matchPattern(pattern, path) {
20
+ // Exact match
21
+ if (pattern === path)
22
+ return true;
23
+ // Wildcard: '/blog/**' matches '/blog/anything'
24
+ if (pattern.endsWith('/**')) {
25
+ const prefix = pattern.slice(0, -3); // strip '/**'
26
+ return path === prefix || path.startsWith(prefix + '/');
27
+ }
28
+ return false;
29
+ }
30
+ /**
31
+ * Resolve the route rule for a given URL path.
32
+ *
33
+ * Patterns are matched top-to-bottom — first match wins.
34
+ * Returns defaultRule if no pattern matches.
35
+ *
36
+ * Property 9: returns defaultRule for unmatched paths
37
+ * Property 10: first-match semantics
38
+ */
39
+ export function resolveRouteRule(path, routeRules) {
40
+ for (const [pattern, rule] of Object.entries(routeRules)) {
41
+ if (matchPattern(pattern, path))
42
+ return rule;
43
+ }
44
+ return defaultRule;
45
+ }
46
+ /**
47
+ * Default route rules for a new Vono project.
48
+ * Public pages → SSR, app pages → SPA.
49
+ */
50
+ export const defaultRouteRules = {
51
+ // Public pages: SSR for SEO
52
+ '/': { mode: 'ssr', cache: 3600 },
53
+ '/about': { mode: 'ssr', cache: 86400 },
54
+ '/pricing': { mode: 'ssr', cache: 3600 },
55
+ '/blog': { mode: 'ssr', cache: 600, swr: true },
56
+ '/blog/**': { mode: 'ssr', cache: 1800, swr: true },
57
+ '/contact': { mode: 'ssr', cache: 86400 },
58
+ '/terms': { mode: 'ssr', cache: 86400 },
59
+ '/privacy': { mode: 'ssr', cache: 86400 },
60
+ // App pages: SPA only (behind auth, no SEO needed)
61
+ '/dashboard/**': { mode: 'spa' },
62
+ '/admin/**': { mode: 'spa' },
63
+ '/settings/**': { mode: 'spa' },
64
+ '/onboarding/**': { mode: 'spa' },
65
+ };
66
+ //# sourceMappingURL=route-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-rules.js","sourceRoot":"","sources":["../../src/server/route-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAeH,qEAAqE;AACrE,MAAM,CAAC,MAAM,WAAW,GAAc,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AAErD;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,IAAY;IACxD,cAAc;IACd,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAEjC,gDAAgD;IAChD,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA,CAAC,cAAc;QAClD,OAAO,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,CAAA;IACzD,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,UAAsB;IAEtB,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACzD,IAAI,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;IAC9C,CAAC;IACD,OAAO,WAAW,CAAA;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAe;IAC3C,4BAA4B;IAC5B,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;IACjC,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;IACvC,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;IACxC,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE;IAC/C,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE;IACnD,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;IACzC,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;IACvC,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;IAEzC,mDAAmD;IACnD,eAAe,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;IAChC,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;IAC5B,cAAc,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;IAC/B,gBAAgB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;CAClC,CAAA"}
@@ -0,0 +1,58 @@
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
+ * Cache-Control header value for hashed static assets.
12
+ * Use on `/assets/*` routes in production.
13
+ */
14
+ export declare const IMMUTABLE_CACHE_HEADER = "public, max-age=31536000, immutable";
15
+ export interface RobotsConfig {
16
+ /** Base URL of the site, used to build the Sitemap reference */
17
+ siteUrl: string;
18
+ /** Additional paths to disallow beyond the defaults */
19
+ extraDisallow?: string[];
20
+ }
21
+ /**
22
+ * buildRobotsTxt — generates robots.txt content.
23
+ *
24
+ * Blocks: /dashboard, /admin, /settings, /api
25
+ * Includes a Sitemap reference pointing to <siteUrl>/sitemap.xml
26
+ *
27
+ * @example
28
+ * app.get('/robots.txt', (c) =>
29
+ * c.text(buildRobotsTxt({ siteUrl: 'https://example.com' }))
30
+ * )
31
+ */
32
+ export declare function buildRobotsTxt(config: RobotsConfig): string;
33
+ export interface SitemapPage {
34
+ /** Absolute URL of the page */
35
+ loc: string;
36
+ /** ISO 8601 date string, e.g. '2026-04-05' */
37
+ lastmod?: string;
38
+ /** 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never' */
39
+ changefreq?: string;
40
+ /** Priority between 0.0 and 1.0 */
41
+ priority?: number;
42
+ }
43
+ /**
44
+ * buildSitemapXml — generates a valid XML sitemap.
45
+ *
46
+ * @param baseUrl — base URL of the site (no trailing slash)
47
+ * @param pages — list of page descriptors; if empty, only the root is included
48
+ *
49
+ * @example
50
+ * app.get('/sitemap.xml', (c) =>
51
+ * c.text(buildSitemapXml('https://example.com', [
52
+ * { loc: '/about' },
53
+ * { loc: '/blog', changefreq: 'weekly', priority: 0.8 },
54
+ * ]), 200, { 'Content-Type': 'application/xml' })
55
+ * )
56
+ */
57
+ export declare function buildSitemapXml(baseUrl: string, pages: SitemapPage[]): string;
58
+ //# sourceMappingURL=seo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo.d.ts","sourceRoot":"","sources":["../../src/server/seo.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;GAGG;AACH,eAAO,MAAM,sBAAsB,wCAAwC,CAAA;AAI3E,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAA;IACf,uDAAuD;IACvD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CACzB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAY3D;AAID,MAAM,WAAW,WAAW;IAC1B,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAyB7E"}
@@ -0,0 +1,85 @@
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
+ // ─── Cache header constant ───────────────────────────────────────────
11
+ /**
12
+ * Cache-Control header value for hashed static assets.
13
+ * Use on `/assets/*` routes in production.
14
+ */
15
+ export const IMMUTABLE_CACHE_HEADER = 'public, max-age=31536000, immutable';
16
+ /**
17
+ * buildRobotsTxt — generates robots.txt content.
18
+ *
19
+ * Blocks: /dashboard, /admin, /settings, /api
20
+ * Includes a Sitemap reference pointing to <siteUrl>/sitemap.xml
21
+ *
22
+ * @example
23
+ * app.get('/robots.txt', (c) =>
24
+ * c.text(buildRobotsTxt({ siteUrl: 'https://example.com' }))
25
+ * )
26
+ */
27
+ export function buildRobotsTxt(config) {
28
+ const defaultDisallow = ['/dashboard', '/admin', '/settings', '/api'];
29
+ const allDisallow = [...defaultDisallow, ...(config.extraDisallow ?? [])];
30
+ const lines = [
31
+ 'User-agent: *',
32
+ ...allDisallow.map((path) => `Disallow: ${path}`),
33
+ '',
34
+ `Sitemap: ${config.siteUrl}/sitemap.xml`,
35
+ ];
36
+ return lines.join('\n');
37
+ }
38
+ /**
39
+ * buildSitemapXml — generates a valid XML sitemap.
40
+ *
41
+ * @param baseUrl — base URL of the site (no trailing slash)
42
+ * @param pages — list of page descriptors; if empty, only the root is included
43
+ *
44
+ * @example
45
+ * app.get('/sitemap.xml', (c) =>
46
+ * c.text(buildSitemapXml('https://example.com', [
47
+ * { loc: '/about' },
48
+ * { loc: '/blog', changefreq: 'weekly', priority: 0.8 },
49
+ * ]), 200, { 'Content-Type': 'application/xml' })
50
+ * )
51
+ */
52
+ export function buildSitemapXml(baseUrl, pages) {
53
+ const base = baseUrl.replace(/\/$/, '');
54
+ // Always include the root
55
+ const allPages = pages.length > 0 ? pages : [{ loc: '/' }];
56
+ const urlEntries = allPages
57
+ .map((page) => {
58
+ const loc = page.loc.startsWith('http') ? page.loc : `${base}${page.loc}`;
59
+ const parts = [` <loc>${escapeXml(loc)}</loc>`];
60
+ if (page.lastmod)
61
+ parts.push(` <lastmod>${page.lastmod}</lastmod>`);
62
+ if (page.changefreq)
63
+ parts.push(` <changefreq>${page.changefreq}</changefreq>`);
64
+ if (page.priority !== undefined)
65
+ parts.push(` <priority>${page.priority.toFixed(1)}</priority>`);
66
+ return ` <url>\n${parts.join('\n')}\n </url>`;
67
+ })
68
+ .join('\n');
69
+ return [
70
+ '<?xml version="1.0" encoding="UTF-8"?>',
71
+ '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',
72
+ urlEntries,
73
+ '</urlset>',
74
+ ].join('\n');
75
+ }
76
+ // ─── Helpers ─────────────────────────────────────────────────────────
77
+ function escapeXml(str) {
78
+ return str
79
+ .replace(/&/g, '&amp;')
80
+ .replace(/</g, '&lt;')
81
+ .replace(/>/g, '&gt;')
82
+ .replace(/"/g, '&quot;')
83
+ .replace(/'/g, '&apos;');
84
+ }
85
+ //# sourceMappingURL=seo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo.js","sourceRoot":"","sources":["../../src/server/seo.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,wEAAwE;AAExE;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,qCAAqC,CAAA;AAW3E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,MAAM,eAAe,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;IACrE,MAAM,WAAW,GAAG,CAAC,GAAG,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,CAAA;IAEzE,MAAM,KAAK,GAAG;QACZ,eAAe;QACf,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC;QACjD,EAAE;QACF,YAAY,MAAM,CAAC,OAAO,cAAc;KACzC,CAAA;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAeD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,KAAoB;IACnE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAEvC,0BAA0B;IAC1B,MAAM,QAAQ,GAAkB,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;IAEzE,MAAM,UAAU,GAAG,QAAQ;SACxB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACzE,MAAM,KAAK,GAAG,CAAC,YAAY,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAElD,IAAI,IAAI,CAAC,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,OAAO,YAAY,CAAC,CAAA;QACtE,IAAI,IAAI,CAAC,UAAU;YAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,UAAU,eAAe,CAAC,CAAA;QAClF,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAA;QAEnG,OAAO,YAAY,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAA;IACjD,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,OAAO;QACL,wCAAwC;QACxC,8DAA8D;QAC9D,UAAU;QACV,WAAW;KACZ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,wEAAwE;AAExE,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AAC5B,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ import type { StorageDriver, UploadOptions, UploadResult } from '../types.js';
11
+ export interface BunnyConfig {
12
+ storageZone: string;
13
+ accessKey: string;
14
+ /** CDN pull zone URL (e.g. https://myzone.b-cdn.net) */
15
+ cdnUrl: string;
16
+ /** Storage region (default: de) */
17
+ region?: string;
18
+ }
19
+ /**
20
+ * Bunny.net CDN storage driver.
21
+ * Uses the Bunny Storage REST API — no SDK, pure fetch.
22
+ *
23
+ * Docs: https://docs.bunny.net/reference/storage-api
24
+ */
25
+ export declare class BunnyDriver implements StorageDriver {
26
+ private readonly config;
27
+ private readonly storageEndpoint;
28
+ constructor(config: BunnyConfig);
29
+ upload(file: File, options?: UploadOptions): Promise<UploadResult>;
30
+ delete(key: string): Promise<void>;
31
+ url(key: string): string;
32
+ }
33
+ //# sourceMappingURL=bunny.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bunny.d.ts","sourceRoot":"","sources":["../../../../src/server/storage/drivers/bunny.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE7E,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAA;IACd,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAID;;;;;GAKG;AACH,qBAAa,WAAY,YAAW,aAAa;IAGnC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAQ;gBAEX,MAAM,EAAE,WAAW;IAQ1C,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IA4BlE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBxC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAKzB"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ import { generateId } from '../../../shared/utils/id.js';
11
+ import { Logger } from '../../../shared/utils/logger.js';
12
+ // ─── BunnyDriver ─────────────────────────────────────────────────────────────
13
+ /**
14
+ * Bunny.net CDN storage driver.
15
+ * Uses the Bunny Storage REST API — no SDK, pure fetch.
16
+ *
17
+ * Docs: https://docs.bunny.net/reference/storage-api
18
+ */
19
+ export class BunnyDriver {
20
+ config;
21
+ storageEndpoint;
22
+ constructor(config) {
23
+ this.config = config;
24
+ const region = config.region ?? 'de';
25
+ // Main region uses storage.bunnycdn.com; others use <region>.storage.bunnycdn.com
26
+ this.storageEndpoint = region === 'de'
27
+ ? 'https://storage.bunnycdn.com'
28
+ : `https://${region}.storage.bunnycdn.com`;
29
+ }
30
+ async upload(file, options) {
31
+ const ext = file.name.split('.').pop() ?? 'bin';
32
+ const key = options?.key ?? `${generateId()}.${ext}`;
33
+ const contentType = options?.contentType ?? file.type;
34
+ const uploadUrl = `${this.storageEndpoint}/${this.config.storageZone}/${key}`;
35
+ const buffer = await file.arrayBuffer();
36
+ const res = await fetch(uploadUrl, {
37
+ method: 'PUT',
38
+ headers: {
39
+ AccessKey: this.config.accessKey,
40
+ 'Content-Type': contentType,
41
+ },
42
+ body: buffer,
43
+ });
44
+ if (!res.ok) {
45
+ const body = await res.text();
46
+ Logger.error('[storage:bunny] Upload failed', { status: res.status, body });
47
+ throw new Error(`Bunny.net upload error: ${res.status}`);
48
+ }
49
+ Logger.info('[storage:bunny] File uploaded', { key, size: file.size });
50
+ return { key, url: this.url(key), size: file.size, contentType };
51
+ }
52
+ async delete(key) {
53
+ const deleteUrl = `${this.storageEndpoint}/${this.config.storageZone}/${key}`;
54
+ const res = await fetch(deleteUrl, {
55
+ method: 'DELETE',
56
+ headers: { AccessKey: this.config.accessKey },
57
+ });
58
+ if (!res.ok) {
59
+ Logger.error('[storage:bunny] Delete failed', { key, status: res.status });
60
+ throw new Error(`Bunny.net delete error: ${res.status}`);
61
+ }
62
+ Logger.info('[storage:bunny] File deleted', { key });
63
+ }
64
+ url(key) {
65
+ const base = this.config.cdnUrl.endsWith('/') ? this.config.cdnUrl.slice(0, -1) : this.config.cdnUrl;
66
+ const normalised = key.startsWith('/') ? key.slice(1) : key;
67
+ return `${base}/${normalised}`;
68
+ }
69
+ }
70
+ //# sourceMappingURL=bunny.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bunny.js","sourceRoot":"","sources":["../../../../src/server/storage/drivers/bunny.ts"],"names":[],"mappings":"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"}