@beechcms/api 0.6.0-preview.2 → 0.6.0-preview.3

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 (375) hide show
  1. package/README.md +4 -4
  2. package/assets/dashboard/assets/chart-Cws4Yj6K.js +39 -0
  3. package/assets/dashboard/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  4. package/assets/dashboard/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  5. package/assets/dashboard/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  6. package/assets/dashboard/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  7. package/assets/dashboard/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  8. package/assets/dashboard/assets/index-BjPpppHe.css +1 -0
  9. package/assets/dashboard/assets/index-CrW-zhkA.js +642 -0
  10. package/assets/dashboard/assets/lora-cyrillic-ext-wght-normal-YcVxMP-u.woff2 +0 -0
  11. package/assets/dashboard/assets/lora-cyrillic-wght-normal-UWPuZLjM.woff2 +0 -0
  12. package/assets/dashboard/assets/lora-latin-ext-wght-normal-C2Wlntb9.woff2 +0 -0
  13. package/assets/dashboard/assets/lora-latin-wght-normal-BiLcIKcI.woff2 +0 -0
  14. package/assets/dashboard/assets/lora-math-wght-normal-sOy7rEfW.woff2 +0 -0
  15. package/assets/dashboard/assets/lora-symbols-wght-normal-DQ5VrUkH.woff2 +0 -0
  16. package/assets/dashboard/assets/lora-vietnamese-wght-normal-CfJ7gtf3.woff2 +0 -0
  17. package/assets/dashboard/assets/pie-chart-recharts-CAxoDQp2.js +1 -0
  18. package/assets/dashboard/assets/timeseries-chart-recharts-CixDW-LM.js +1 -0
  19. package/assets/dashboard/index.html +2 -2
  20. package/dist/auth/__fixtures__/in-memory-hash-provider.d.ts +5 -0
  21. package/dist/auth/__fixtures__/static-token-service.d.ts +6 -0
  22. package/dist/auth/bcrypt-hash-provider.d.ts +8 -0
  23. package/dist/auth/constants.d.ts +10 -0
  24. package/dist/auth/jose-token-service.d.ts +14 -0
  25. package/dist/auth/login.d.ts +32 -0
  26. package/dist/auth/refresh.d.ts +1 -0
  27. package/dist/factory.d.ts +39 -0
  28. package/dist/features/automations/action-executors/create-entry.executor.d.ts +7 -0
  29. package/dist/features/automations/action-executors/edit-field.executor.d.ts +7 -0
  30. package/dist/features/automations/action-executors/index.d.ts +13 -0
  31. package/dist/features/automations/action-executors/send-mail.executor.d.ts +7 -0
  32. package/dist/features/automations/action-executors/set-variable.executor.d.ts +15 -0
  33. package/dist/features/automations/action-executors/webhook.executor.d.ts +7 -0
  34. package/dist/features/automations/automation-runner.d.ts +13 -0
  35. package/dist/features/automations/automation-runner.utils.d.ts +3 -0
  36. package/dist/features/automations/automations.handler.d.ts +7 -0
  37. package/dist/features/automations/automations.schema.d.ts +191 -0
  38. package/dist/features/automations/context-resolver.d.ts +8 -0
  39. package/dist/features/automations/cron-runner.d.ts +9 -0
  40. package/dist/features/automations/cron-runner.utils.d.ts +1 -0
  41. package/dist/features/automations/filter-translation.d.ts +9 -0
  42. package/dist/features/automations/index.d.ts +7 -0
  43. package/dist/features/automations/template-grammar.d.ts +73 -0
  44. package/dist/features/automations/var-access-resolver.d.ts +6 -0
  45. package/dist/features/automations/when-evaluator.d.ts +3 -0
  46. package/dist/features/automations/when-pushdown.d.ts +2 -0
  47. package/dist/features/backrefs/backrefs.handler.d.ts +3 -0
  48. package/dist/features/backrefs/d1-backref.repository.d.ts +17 -0
  49. package/dist/features/backrefs/index.d.ts +1 -0
  50. package/dist/features/content/constants.d.ts +12 -0
  51. package/dist/features/content/handlers/bulk.handler.d.ts +3 -0
  52. package/dist/features/content/handlers/create.d.ts +3 -0
  53. package/dist/features/content/handlers/delete.d.ts +3 -0
  54. package/dist/features/content/handlers/facets.d.ts +3 -0
  55. package/dist/features/content/handlers/get.d.ts +4 -0
  56. package/dist/features/content/handlers/helpers.d.ts +12 -0
  57. package/dist/features/content/handlers/list.d.ts +3 -0
  58. package/dist/features/content/handlers/update.d.ts +3 -0
  59. package/dist/features/content/index.d.ts +4 -0
  60. package/dist/features/dashboard-layout/dashboard-layout.handler.d.ts +7 -0
  61. package/dist/features/dashboard-layout/index.d.ts +1 -0
  62. package/dist/features/draft/draft.handler.d.ts +4 -0
  63. package/dist/features/draft/draft.middleware.d.ts +9 -0
  64. package/dist/features/draft/index.d.ts +1 -0
  65. package/{src/features/email/email.provider.ts → dist/features/email/email.provider.d.ts} +19 -24
  66. package/dist/features/email/email.service.d.ts +13 -0
  67. package/dist/features/email/email.types.d.ts +94 -0
  68. package/{src/features/email/index.ts → dist/features/email/index.d.ts} +3 -16
  69. package/dist/features/email/providers/resend.d.ts +36 -0
  70. package/dist/features/email/providers/smtp.d.ts +11 -0
  71. package/dist/features/email/templates/automation-mail.d.ts +8 -0
  72. package/dist/features/email/templates/password-changed.d.ts +15 -0
  73. package/dist/features/email/templates/password-reset.d.ts +18 -0
  74. package/dist/features/email/templates/shell.d.ts +58 -0
  75. package/dist/features/notifications/index.d.ts +1 -0
  76. package/dist/features/notifications/notifications.handler.d.ts +15 -0
  77. package/dist/features/password-reset/index.d.ts +6 -0
  78. package/dist/features/password-reset/request.d.ts +10 -0
  79. package/dist/features/password-reset/reset.d.ts +9 -0
  80. package/dist/features/rotate-field/index.d.ts +1 -0
  81. package/dist/features/rotate-field/rotate-field.handler.d.ts +7 -0
  82. package/dist/features/rotate-field/rotate-field.schema.d.ts +11 -0
  83. package/dist/features/schema/schema.handler.d.ts +7 -0
  84. package/dist/features/seeds/index.d.ts +1 -0
  85. package/dist/features/seeds/seeds.handler.d.ts +6 -0
  86. package/dist/features/settings/settings.handler.d.ts +7 -0
  87. package/dist/features/setup/index.d.ts +7 -0
  88. package/dist/features/stats/index.d.ts +1 -0
  89. package/dist/features/stats/stats.handler.d.ts +7 -0
  90. package/dist/features/webhooks/index.d.ts +3 -0
  91. package/dist/index.d.ts +6 -0
  92. package/dist/index.js +9666 -0
  93. package/dist/media-utils.d.ts +25 -0
  94. package/dist/middleware/auth-providers.middleware.d.ts +8 -0
  95. package/dist/middleware/observability.middleware.d.ts +20 -0
  96. package/dist/middleware/rate-limit.middleware.d.ts +9 -0
  97. package/dist/middleware/repository.middleware.d.ts +34 -0
  98. package/dist/middleware/seed-registry.middleware.d.ts +10 -0
  99. package/dist/middleware/storage.middleware.d.ts +7 -0
  100. package/dist/middleware.d.ts +11 -0
  101. package/dist/public/access-policy.d.ts +12 -0
  102. package/dist/public/api-key-middleware.d.ts +6 -0
  103. package/dist/public/cache-utils.d.ts +10 -0
  104. package/dist/public/entry-projection.d.ts +2 -0
  105. package/dist/public/idempotency.d.ts +9 -0
  106. package/dist/public/index.d.ts +11 -0
  107. package/dist/public/problem-details.d.ts +31 -0
  108. package/dist/public/public-add.d.ts +3 -0
  109. package/dist/public/public-edit.d.ts +5 -0
  110. package/dist/public/public-errors.d.ts +13 -0
  111. package/dist/public/public-read.d.ts +3 -0
  112. package/dist/public/public-routes.d.ts +3 -0
  113. package/dist/public/query-builder.d.ts +28 -0
  114. package/dist/public/rate-limit-middleware.d.ts +3 -0
  115. package/dist/public/read-list.d.ts +26 -0
  116. package/dist/public/read-single.d.ts +22 -0
  117. package/dist/public/response-builder.d.ts +22 -0
  118. package/dist/public/sanitize.d.ts +23 -0
  119. package/{src/public/slug-utils.ts → dist/public/slug-utils.d.ts} +3 -10
  120. package/dist/rate-limit/cloudflare-rate-limiter.d.ts +6 -0
  121. package/dist/rate-limit/in-memory-rate-limiter.d.ts +7 -0
  122. package/dist/rate-limit/no-op-rate-limiter.d.ts +4 -0
  123. package/dist/search-utils.d.ts +54 -0
  124. package/dist/search.d.ts +6 -0
  125. package/dist/shared/apply-policies.d.ts +10 -0
  126. package/dist/shared/automations.repository.d1.d.ts +12 -0
  127. package/dist/shared/background-notification-service.d.ts +18 -0
  128. package/dist/shared/base.repository.d1.d.ts +18 -0
  129. package/dist/shared/content-utils.d.ts +21 -0
  130. package/dist/shared/content.repository.d1.d.ts +68 -0
  131. package/dist/shared/d1-activity-log.repository.d.ts +13 -0
  132. package/dist/shared/d1-activity-logger.d.ts +20 -0
  133. package/dist/shared/d1-analytics.repository.d.ts +20 -0
  134. package/dist/shared/d1-content-scan.repository.d.ts +7 -0
  135. package/dist/shared/d1-notification.repository.d.ts +17 -0
  136. package/dist/shared/d1-password-reset-token.repository.d.ts +10 -0
  137. package/dist/shared/d1-search.repository.d.ts +14 -0
  138. package/dist/shared/d1-session.repository.d.ts +12 -0
  139. package/dist/shared/d1-setup-checklist.repository.d.ts +12 -0
  140. package/dist/shared/d1-user.repository.d.ts +18 -0
  141. package/dist/shared/d1-widget.repository.d.ts +31 -0
  142. package/dist/shared/dashboard-layout.repository.d1.d.ts +9 -0
  143. package/dist/shared/demo-data-sql.d.ts +1 -0
  144. package/dist/shared/demo-data.repository.d1.d.ts +6 -0
  145. package/dist/shared/execution-context-scheduler.d.ts +6 -0
  146. package/dist/shared/fixed-clock.d.ts +13 -0
  147. package/dist/shared/fts-sync.d.ts +1 -0
  148. package/dist/shared/idempotency.repository.d1.d.ts +16 -0
  149. package/dist/shared/in-memory-activity-logger.d.ts +11 -0
  150. package/dist/shared/in-memory-notification-service.d.ts +11 -0
  151. package/dist/shared/in-memory-seed.repository.d.ts +18 -0
  152. package/dist/shared/media.repository.d1.d.ts +35 -0
  153. package/dist/shared/qstash-notification-service.d.ts +18 -0
  154. package/dist/shared/query-utils.d.ts +36 -0
  155. package/dist/shared/request-utils.d.ts +13 -0
  156. package/dist/shared/schema-mutator.d1.d.ts +12 -0
  157. package/dist/shared/seed-layout.repository.d1.d.ts +9 -0
  158. package/dist/shared/seed-registry-cache.d.ts +12 -0
  159. package/dist/shared/seed.repository.d1.d.ts +13 -0
  160. package/dist/shared/sequential-id-generator.d.ts +13 -0
  161. package/dist/shared/site-settings.repository.d1.d.ts +7 -0
  162. package/dist/shared/storage/factory.d.ts +8 -0
  163. package/dist/shared/storage/s3-bucket.d.ts +43 -0
  164. package/dist/shared/storage-utils.d.ts +7 -0
  165. package/dist/shared/system-stats.repository.d1.d.ts +25 -0
  166. package/dist/types.d.ts +85 -0
  167. package/dist/upload.d.ts +16 -0
  168. package/dist/widget.d.ts +7 -0
  169. package/package.json +27 -18
  170. package/assets/dashboard/assets/chart-BrJFdsGZ.js +0 -39
  171. package/assets/dashboard/assets/index-CIaoMxuB.css +0 -1
  172. package/assets/dashboard/assets/index-wTKgygsg.js +0 -636
  173. package/assets/dashboard/assets/pie-chart-recharts-BEaE1FOE.js +0 -1
  174. package/assets/dashboard/assets/timeseries-chart-recharts-DmWM6imF.js +0 -1
  175. package/src/auth/__fixtures__/in-memory-hash-provider.ts +0 -17
  176. package/src/auth/__fixtures__/static-token-service.ts +0 -22
  177. package/src/auth/bcrypt-hash-provider.ts +0 -24
  178. package/src/auth/constants.ts +0 -14
  179. package/src/auth/generate-refresh-token.test.ts +0 -23
  180. package/src/auth/hash-provider.test.ts +0 -55
  181. package/src/auth/jose-token-service.ts +0 -62
  182. package/src/auth/jwt-claims-passthrough.test.ts +0 -87
  183. package/src/auth/login.test.ts +0 -100
  184. package/src/auth/login.ts +0 -78
  185. package/src/auth/refresh.ts +0 -11
  186. package/src/auth/token-service.test.ts +0 -90
  187. package/src/factory.ts +0 -370
  188. package/src/features/automations/__tests__/action-executors.test.ts +0 -255
  189. package/src/features/automations/__tests__/automation-runner.test.ts +0 -196
  190. package/src/features/automations/__tests__/automation-runner.utils.test.ts +0 -60
  191. package/src/features/automations/__tests__/automations.handler.test.ts +0 -264
  192. package/src/features/automations/__tests__/automations.repository.test.ts +0 -163
  193. package/src/features/automations/__tests__/automations.schema.test.ts +0 -224
  194. package/src/features/automations/__tests__/context-resolver.test.ts +0 -126
  195. package/src/features/automations/__tests__/cron-runner.test.ts +0 -267
  196. package/src/features/automations/__tests__/cron-runner.utils.test.ts +0 -144
  197. package/src/features/automations/__tests__/set-variable.executor.test.ts +0 -383
  198. package/src/features/automations/__tests__/template-grammar.test.ts +0 -308
  199. package/src/features/automations/__tests__/webhook.executor.test.ts +0 -142
  200. package/src/features/automations/__tests__/when-evaluator.test.ts +0 -274
  201. package/src/features/automations/__tests__/when-pushdown.test.ts +0 -281
  202. package/src/features/automations/action-executors/create-entry.executor.ts +0 -27
  203. package/src/features/automations/action-executors/edit-field.executor.ts +0 -26
  204. package/src/features/automations/action-executors/index.ts +0 -37
  205. package/src/features/automations/action-executors/send-mail.executor.ts +0 -53
  206. package/src/features/automations/action-executors/set-variable.executor.ts +0 -159
  207. package/src/features/automations/action-executors/webhook.executor.ts +0 -67
  208. package/src/features/automations/automation-runner.ts +0 -85
  209. package/src/features/automations/automation-runner.utils.ts +0 -47
  210. package/src/features/automations/automations.handler.ts +0 -197
  211. package/src/features/automations/automations.schema.ts +0 -177
  212. package/src/features/automations/context-resolver.ts +0 -152
  213. package/src/features/automations/cron-runner.ts +0 -140
  214. package/src/features/automations/cron-runner.utils.ts +0 -44
  215. package/src/features/automations/filter-translation.ts +0 -46
  216. package/src/features/automations/index.ts +0 -16
  217. package/src/features/automations/template-grammar.ts +0 -245
  218. package/src/features/automations/var-access-resolver.ts +0 -140
  219. package/src/features/automations/when-evaluator.ts +0 -87
  220. package/src/features/automations/when-pushdown.ts +0 -57
  221. package/src/features/backrefs/__tests__/backrefs.handler.test.ts +0 -359
  222. package/src/features/backrefs/backrefs.handler.ts +0 -168
  223. package/src/features/backrefs/d1-backref.repository.ts +0 -84
  224. package/src/features/backrefs/index.ts +0 -5
  225. package/src/features/content/constants.ts +0 -16
  226. package/src/features/content/handlers/bulk.handler.ts +0 -185
  227. package/src/features/content/handlers/create.ts +0 -129
  228. package/src/features/content/handlers/delete.ts +0 -62
  229. package/src/features/content/handlers/facets.ts +0 -49
  230. package/src/features/content/handlers/get.ts +0 -120
  231. package/src/features/content/handlers/helpers.test.ts +0 -180
  232. package/src/features/content/handlers/helpers.ts +0 -93
  233. package/src/features/content/handlers/list.ts +0 -174
  234. package/src/features/content/handlers/update.ts +0 -174
  235. package/src/features/content/index.ts +0 -26
  236. package/src/features/dashboard-layout/__tests__/dashboard-layout.handler.test.ts +0 -388
  237. package/src/features/dashboard-layout/dashboard-layout.handler.ts +0 -206
  238. package/src/features/dashboard-layout/index.ts +0 -5
  239. package/src/features/draft/draft.handler.ts +0 -195
  240. package/src/features/draft/draft.middleware.ts +0 -66
  241. package/src/features/draft/index.ts +0 -5
  242. package/src/features/email/email.service.ts +0 -98
  243. package/src/features/email/email.types.ts +0 -119
  244. package/src/features/email/providers/resend.ts +0 -67
  245. package/src/features/email/providers/smtp.ts +0 -55
  246. package/src/features/email/templates/automation-mail.ts +0 -19
  247. package/src/features/email/templates/password-changed.ts +0 -63
  248. package/src/features/email/templates/password-reset.ts +0 -68
  249. package/src/features/email/templates/shell.ts +0 -96
  250. package/src/features/notifications/index.ts +0 -5
  251. package/src/features/notifications/notifications.handler.ts +0 -105
  252. package/src/features/password-reset/index.ts +0 -19
  253. package/src/features/password-reset/request.ts +0 -92
  254. package/src/features/password-reset/reset.ts +0 -102
  255. package/src/features/rotate-field/index.ts +0 -5
  256. package/src/features/rotate-field/rotate-field.handler.ts +0 -132
  257. package/src/features/rotate-field/rotate-field.schema.ts +0 -17
  258. package/src/features/schema/schema.handler.ts +0 -131
  259. package/src/features/seeds/index.ts +0 -5
  260. package/src/features/seeds/seeds.handler.test.ts +0 -1199
  261. package/src/features/seeds/seeds.handler.ts +0 -558
  262. package/src/features/settings/__tests__/settings.handler.test.ts +0 -555
  263. package/src/features/settings/settings.handler.ts +0 -392
  264. package/src/features/setup/index.ts +0 -288
  265. package/src/features/stats/index.ts +0 -5
  266. package/src/features/stats/stats.handler.ts +0 -420
  267. package/src/features/webhooks/index.ts +0 -63
  268. package/src/index.ts +0 -65
  269. package/src/media-utils.ts +0 -82
  270. package/src/middleware/auth-providers.middleware.test.ts +0 -85
  271. package/src/middleware/auth-providers.middleware.ts +0 -45
  272. package/src/middleware/observability.middleware.test.ts +0 -93
  273. package/src/middleware/observability.middleware.ts +0 -70
  274. package/src/middleware/rate-limit.middleware.ts +0 -45
  275. package/src/middleware/repository.middleware.ts +0 -117
  276. package/src/middleware/seed-registry.middleware.test.ts +0 -97
  277. package/src/middleware/seed-registry.middleware.ts +0 -21
  278. package/src/middleware/storage.middleware.ts +0 -25
  279. package/src/middleware.ts +0 -45
  280. package/src/public/access-policy.ts +0 -27
  281. package/src/public/api-key-middleware.ts +0 -57
  282. package/src/public/cache-utils.ts +0 -38
  283. package/src/public/entry-projection.ts +0 -46
  284. package/src/public/idempotency.ts +0 -23
  285. package/src/public/index.ts +0 -16
  286. package/src/public/problem-details.ts +0 -124
  287. package/src/public/public-add.ts +0 -114
  288. package/src/public/public-edit.ts +0 -163
  289. package/src/public/public-errors.ts +0 -19
  290. package/src/public/public-read.ts +0 -63
  291. package/src/public/public-routes.ts +0 -88
  292. package/src/public/query-builder.test.ts +0 -224
  293. package/src/public/query-builder.ts +0 -156
  294. package/src/public/rate-limit-middleware.ts +0 -34
  295. package/src/public/read-list.ts +0 -54
  296. package/src/public/read-single.ts +0 -48
  297. package/src/public/response-builder.ts +0 -30
  298. package/src/public/sanitize.ts +0 -69
  299. package/src/rate-limit/cloudflare-rate-limiter.test.ts +0 -30
  300. package/src/rate-limit/cloudflare-rate-limiter.ts +0 -15
  301. package/src/rate-limit/in-memory-rate-limiter.test.ts +0 -37
  302. package/src/rate-limit/in-memory-rate-limiter.ts +0 -17
  303. package/src/rate-limit/no-op-rate-limiter.test.ts +0 -22
  304. package/src/rate-limit/no-op-rate-limiter.ts +0 -11
  305. package/src/search-utils.test.ts +0 -211
  306. package/src/search-utils.ts +0 -213
  307. package/src/search.ts +0 -65
  308. package/src/shared/apply-policies.test.ts +0 -81
  309. package/src/shared/apply-policies.ts +0 -67
  310. package/src/shared/automations.repository.d1.ts +0 -150
  311. package/src/shared/background-notification-service.test.ts +0 -62
  312. package/src/shared/background-notification-service.ts +0 -52
  313. package/src/shared/base.repository.d1.ts +0 -32
  314. package/src/shared/content-utils.test.ts +0 -165
  315. package/src/shared/content-utils.ts +0 -86
  316. package/src/shared/content.repository.d1.test.ts +0 -507
  317. package/src/shared/content.repository.d1.ts +0 -851
  318. package/src/shared/d1-activity-log.repository.test.ts +0 -140
  319. package/src/shared/d1-activity-log.repository.ts +0 -105
  320. package/src/shared/d1-activity-logger.test.ts +0 -86
  321. package/src/shared/d1-activity-logger.ts +0 -67
  322. package/src/shared/d1-analytics.repository.test.ts +0 -78
  323. package/src/shared/d1-analytics.repository.ts +0 -85
  324. package/src/shared/d1-content-scan.repository.test.ts +0 -80
  325. package/src/shared/d1-content-scan.repository.ts +0 -37
  326. package/src/shared/d1-notification.repository.test.ts +0 -128
  327. package/src/shared/d1-notification.repository.ts +0 -118
  328. package/src/shared/d1-password-reset-token.repository.test.ts +0 -81
  329. package/src/shared/d1-password-reset-token.repository.ts +0 -56
  330. package/src/shared/d1-search.repository.test.ts +0 -87
  331. package/src/shared/d1-search.repository.ts +0 -88
  332. package/src/shared/d1-session.repository.test.ts +0 -125
  333. package/src/shared/d1-session.repository.ts +0 -102
  334. package/src/shared/d1-setup-checklist.repository.ts +0 -36
  335. package/src/shared/d1-user.repository.test.ts +0 -151
  336. package/src/shared/d1-user.repository.ts +0 -119
  337. package/src/shared/d1-widget.repository.test.ts +0 -267
  338. package/src/shared/d1-widget.repository.ts +0 -385
  339. package/src/shared/dashboard-layout.repository.d1.test.ts +0 -135
  340. package/src/shared/dashboard-layout.repository.d1.ts +0 -58
  341. package/src/shared/demo-data-sql.ts +0 -216
  342. package/src/shared/demo-data.repository.d1.ts +0 -20
  343. package/src/shared/execution-context-scheduler.ts +0 -13
  344. package/src/shared/fixed-clock.ts +0 -25
  345. package/src/shared/fts-sync.ts +0 -8
  346. package/src/shared/idempotency.repository.d1.test.ts +0 -83
  347. package/src/shared/idempotency.repository.d1.ts +0 -60
  348. package/src/shared/in-memory-activity-logger.ts +0 -19
  349. package/src/shared/in-memory-notification-service.ts +0 -19
  350. package/src/shared/in-memory-seed.repository.ts +0 -58
  351. package/src/shared/media.repository.d1.test.ts +0 -107
  352. package/src/shared/media.repository.d1.ts +0 -68
  353. package/src/shared/qstash-notification-service.test.ts +0 -67
  354. package/src/shared/qstash-notification-service.ts +0 -55
  355. package/src/shared/query-utils.ts +0 -141
  356. package/src/shared/request-utils.ts +0 -26
  357. package/src/shared/schema-mutator.d1.test.ts +0 -142
  358. package/src/shared/schema-mutator.d1.ts +0 -64
  359. package/src/shared/seed-layout.repository.d1.test.ts +0 -114
  360. package/src/shared/seed-layout.repository.d1.ts +0 -62
  361. package/src/shared/seed-registry-cache.test.ts +0 -68
  362. package/src/shared/seed-registry-cache.ts +0 -49
  363. package/src/shared/seed.repository.d1.test.ts +0 -143
  364. package/src/shared/seed.repository.d1.ts +0 -98
  365. package/src/shared/sequential-id-generator.ts +0 -33
  366. package/src/shared/site-settings.repository.d1.ts +0 -53
  367. package/src/shared/storage/factory.ts +0 -41
  368. package/src/shared/storage/s3-bucket.ts +0 -195
  369. package/src/shared/storage-utils.ts +0 -40
  370. package/src/shared/system-stats.repository.d1.test.ts +0 -58
  371. package/src/shared/system-stats.repository.d1.ts +0 -48
  372. package/src/types.ts +0 -90
  373. package/src/upload.ts +0 -198
  374. package/src/widget.test.ts +0 -85
  375. package/src/widget.ts +0 -251
@@ -0,0 +1,191 @@
1
+ import { z } from 'zod';
2
+ import type { WhenNode } from '@beechcms/core';
3
+ export declare const automationActionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
4
+ type: z.ZodLiteral<"set_variable">;
5
+ name: z.ZodString;
6
+ seed_slug: z.ZodOptional<z.ZodString>;
7
+ fixed_id: z.ZodOptional<z.ZodString>;
8
+ column: z.ZodOptional<z.ZodString>;
9
+ filters: z.ZodDefault<z.ZodArray<z.ZodObject<{
10
+ field: z.ZodString;
11
+ op: z.ZodEnum<{
12
+ eq: "eq";
13
+ gt: "gt";
14
+ lt: "lt";
15
+ contains: "contains";
16
+ neq: "neq";
17
+ isempty: "isempty";
18
+ isnotempty: "isnotempty";
19
+ }>;
20
+ value: z.ZodUnknown;
21
+ }, z.core.$strip>>>;
22
+ order_by: z.ZodOptional<z.ZodString>;
23
+ order: z.ZodOptional<z.ZodEnum<{
24
+ asc: "asc";
25
+ desc: "desc";
26
+ }>>;
27
+ load_type: z.ZodOptional<z.ZodEnum<{
28
+ fruit: "fruit";
29
+ branch: "branch";
30
+ }>>;
31
+ }, z.core.$strip>, z.ZodObject<{
32
+ type: z.ZodLiteral<"webhook">;
33
+ url: z.ZodString;
34
+ method: z.ZodOptional<z.ZodEnum<{
35
+ POST: "POST";
36
+ PUT: "PUT";
37
+ GET: "GET";
38
+ }>>;
39
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
40
+ body_template: z.ZodPreprocess<z.ZodString>;
41
+ }, z.core.$strip>, z.ZodObject<{
42
+ type: z.ZodLiteral<"send_mail">;
43
+ to: z.ZodString;
44
+ subject_template: z.ZodString;
45
+ body_template: z.ZodString;
46
+ }, z.core.$strip>, z.ZodObject<{
47
+ type: z.ZodLiteral<"edit_field">;
48
+ field: z.ZodString;
49
+ value: z.ZodUnknown;
50
+ }, z.core.$strip>, z.ZodObject<{
51
+ type: z.ZodLiteral<"create_entry">;
52
+ seed_slug: z.ZodString;
53
+ field_map: z.ZodRecord<z.ZodString, z.ZodString>;
54
+ }, z.core.$strip>], "type">;
55
+ export declare const createAutomationSchema: z.ZodObject<{
56
+ seed_slug: z.ZodString;
57
+ name: z.ZodString;
58
+ triggers: z.ZodArray<z.ZodObject<{
59
+ event: z.ZodEnum<{
60
+ create: "create";
61
+ update: "update";
62
+ delete: "delete";
63
+ cron: "cron";
64
+ }>;
65
+ cron: z.ZodOptional<z.ZodNullable<z.ZodString>>;
66
+ }, z.core.$strip>>;
67
+ trigger_conditions: z.ZodOptional<z.ZodNullable<z.ZodType<WhenNode, unknown, z.core.$ZodTypeInternals<WhenNode, unknown>>>>;
68
+ actions: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
69
+ type: z.ZodLiteral<"set_variable">;
70
+ name: z.ZodString;
71
+ seed_slug: z.ZodOptional<z.ZodString>;
72
+ fixed_id: z.ZodOptional<z.ZodString>;
73
+ column: z.ZodOptional<z.ZodString>;
74
+ filters: z.ZodDefault<z.ZodArray<z.ZodObject<{
75
+ field: z.ZodString;
76
+ op: z.ZodEnum<{
77
+ eq: "eq";
78
+ gt: "gt";
79
+ lt: "lt";
80
+ contains: "contains";
81
+ neq: "neq";
82
+ isempty: "isempty";
83
+ isnotempty: "isnotempty";
84
+ }>;
85
+ value: z.ZodUnknown;
86
+ }, z.core.$strip>>>;
87
+ order_by: z.ZodOptional<z.ZodString>;
88
+ order: z.ZodOptional<z.ZodEnum<{
89
+ asc: "asc";
90
+ desc: "desc";
91
+ }>>;
92
+ load_type: z.ZodOptional<z.ZodEnum<{
93
+ fruit: "fruit";
94
+ branch: "branch";
95
+ }>>;
96
+ }, z.core.$strip>, z.ZodObject<{
97
+ type: z.ZodLiteral<"webhook">;
98
+ url: z.ZodString;
99
+ method: z.ZodOptional<z.ZodEnum<{
100
+ POST: "POST";
101
+ PUT: "PUT";
102
+ GET: "GET";
103
+ }>>;
104
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
105
+ body_template: z.ZodPreprocess<z.ZodString>;
106
+ }, z.core.$strip>, z.ZodObject<{
107
+ type: z.ZodLiteral<"send_mail">;
108
+ to: z.ZodString;
109
+ subject_template: z.ZodString;
110
+ body_template: z.ZodString;
111
+ }, z.core.$strip>, z.ZodObject<{
112
+ type: z.ZodLiteral<"edit_field">;
113
+ field: z.ZodString;
114
+ value: z.ZodUnknown;
115
+ }, z.core.$strip>, z.ZodObject<{
116
+ type: z.ZodLiteral<"create_entry">;
117
+ seed_slug: z.ZodString;
118
+ field_map: z.ZodRecord<z.ZodString, z.ZodString>;
119
+ }, z.core.$strip>], "type">>;
120
+ }, z.core.$strip>;
121
+ export declare const updateAutomationSchema: z.ZodObject<{
122
+ seed_slug: z.ZodOptional<z.ZodString>;
123
+ name: z.ZodOptional<z.ZodString>;
124
+ triggers: z.ZodOptional<z.ZodArray<z.ZodObject<{
125
+ event: z.ZodEnum<{
126
+ create: "create";
127
+ update: "update";
128
+ delete: "delete";
129
+ cron: "cron";
130
+ }>;
131
+ cron: z.ZodOptional<z.ZodNullable<z.ZodString>>;
132
+ }, z.core.$strip>>>;
133
+ trigger_conditions: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodType<WhenNode, unknown, z.core.$ZodTypeInternals<WhenNode, unknown>>>>>;
134
+ actions: z.ZodOptional<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
135
+ type: z.ZodLiteral<"set_variable">;
136
+ name: z.ZodString;
137
+ seed_slug: z.ZodOptional<z.ZodString>;
138
+ fixed_id: z.ZodOptional<z.ZodString>;
139
+ column: z.ZodOptional<z.ZodString>;
140
+ filters: z.ZodDefault<z.ZodArray<z.ZodObject<{
141
+ field: z.ZodString;
142
+ op: z.ZodEnum<{
143
+ eq: "eq";
144
+ gt: "gt";
145
+ lt: "lt";
146
+ contains: "contains";
147
+ neq: "neq";
148
+ isempty: "isempty";
149
+ isnotempty: "isnotempty";
150
+ }>;
151
+ value: z.ZodUnknown;
152
+ }, z.core.$strip>>>;
153
+ order_by: z.ZodOptional<z.ZodString>;
154
+ order: z.ZodOptional<z.ZodEnum<{
155
+ asc: "asc";
156
+ desc: "desc";
157
+ }>>;
158
+ load_type: z.ZodOptional<z.ZodEnum<{
159
+ fruit: "fruit";
160
+ branch: "branch";
161
+ }>>;
162
+ }, z.core.$strip>, z.ZodObject<{
163
+ type: z.ZodLiteral<"webhook">;
164
+ url: z.ZodString;
165
+ method: z.ZodOptional<z.ZodEnum<{
166
+ POST: "POST";
167
+ PUT: "PUT";
168
+ GET: "GET";
169
+ }>>;
170
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
171
+ body_template: z.ZodPreprocess<z.ZodString>;
172
+ }, z.core.$strip>, z.ZodObject<{
173
+ type: z.ZodLiteral<"send_mail">;
174
+ to: z.ZodString;
175
+ subject_template: z.ZodString;
176
+ body_template: z.ZodString;
177
+ }, z.core.$strip>, z.ZodObject<{
178
+ type: z.ZodLiteral<"edit_field">;
179
+ field: z.ZodString;
180
+ value: z.ZodUnknown;
181
+ }, z.core.$strip>, z.ZodObject<{
182
+ type: z.ZodLiteral<"create_entry">;
183
+ seed_slug: z.ZodString;
184
+ field_map: z.ZodRecord<z.ZodString, z.ZodString>;
185
+ }, z.core.$strip>], "type">>>;
186
+ }, z.core.$strip>;
187
+ export declare const toggleAutomationSchema: z.ZodObject<{
188
+ enabled: z.ZodBoolean;
189
+ }, z.core.$strip>;
190
+ export type CreateAutomationBody = z.infer<typeof createAutomationSchema>;
191
+ export type UpdateAutomationBody = z.infer<typeof updateAutomationSchema>;
@@ -0,0 +1,8 @@
1
+ import type { Automation } from '@beechcms/core';
2
+ import type { ParsedKey } from './template-grammar';
3
+ export interface ResolvedContext {
4
+ lookup(key: ParsedKey, onMissing?: (field: string) => void): unknown;
5
+ triggerEntry: Record<string, unknown> | null;
6
+ }
7
+ export declare function resolveAutomationContext(_automation: Automation, triggerEntry: Record<string, unknown> | null, batchEntries: Array<Record<string, unknown>>): Promise<ResolvedContext>;
8
+ export declare function deriveEntryContext(base: ResolvedContext, entry: Record<string, unknown>): ResolvedContext;
@@ -0,0 +1,9 @@
1
+ import type { ContentRepository, IAutomationRepository, IIdGenerator, Seed } from '@beechcms/core';
2
+ export interface CronRunnerDeps {
3
+ automationRepository: IAutomationRepository;
4
+ contentRepository: ContentRepository;
5
+ getSeed: (slug: string) => Seed | null;
6
+ env: Record<string, string | undefined>;
7
+ idGenerator: IIdGenerator;
8
+ }
9
+ export declare function runCronAutomations(deps: CronRunnerDeps, scheduledTime: number): Promise<void>;
@@ -0,0 +1 @@
1
+ export declare function cronMatches(expression: string | null, scheduledTime: number): boolean;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Shared helper: converts a TriggerCondition into a FilterGroup accepted by
3
+ * ContentRepository.findMany. Used by cron-runner and context-resolver.
4
+ *
5
+ * TODO Sprint 8 (Task 12): when-pushdown.ts will call extractPushdownFilters
6
+ * to convert safe WhenNode predicates to FilterGroup[] for SQL pre-filtering.
7
+ */
8
+ import type { FilterGroup, Seed, TriggerCondition } from '@beechcms/core';
9
+ export declare function conditionToFilterGroup(c: TriggerCondition, seed: Seed): FilterGroup;
@@ -0,0 +1,7 @@
1
+ export { AutomationRunner } from './automation-runner';
2
+ export type { AutomationRunnerDeps } from './automation-runner';
3
+ export { runCronAutomations } from './cron-runner';
4
+ export type { CronRunnerDeps } from './cron-runner';
5
+ export { automationsApp } from './automations.handler';
6
+ export { createAutomationSchema, updateAutomationSchema, toggleAutomationSchema, automationActionSchema, } from './automations.schema';
7
+ export type { CreateAutomationBody, UpdateAutomationBody } from './automations.schema';
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Pure template-key parser for the automation template engine.
3
+ *
4
+ * Grammar (Sprint 6):
5
+ * simple: {{title}}, {{author.name}}
6
+ * scoped: {{<scope>:<selector>:<field>}}
7
+ *
8
+ * Grammar (Sprint 7):
9
+ * var_access: {{varname.firstone.campo}}, {{varname.count.(status=paid)}}
10
+ * {{varname.array[id1,id2].count}}
11
+ *
12
+ * Scopes: this | batch | <seedSlug> | <contextKey>
13
+ * Selectors: lastone | firstone | all | byid(<id>) | where(<alias>=<value>)
14
+ * Fields: branch alias, system column, or aggregate (count/sum/avg/min/max/pluck)
15
+ *
16
+ * Sugar:
17
+ * {{batch:count}} → batch:all:count
18
+ * {{<scope>:<field>}} → <scope>:lastone:<field> (default selector)
19
+ *
20
+ * TODO Sprint 8: extend ParsedKey to support WhenOperand refs once the
21
+ * recursive when-group evaluator (Tasks 10-16) is implemented.
22
+ */
23
+ export { AUTOMATION_RESERVED_WORDS } from '@beechcms/core';
24
+ export type VarStep = {
25
+ type: 'field';
26
+ name: string;
27
+ } | {
28
+ type: 'nav';
29
+ nav: 'firstone' | 'lastone';
30
+ } | {
31
+ type: 'agg';
32
+ op: 'count' | 'sum' | 'avg' | 'min' | 'max' | 'pluck';
33
+ field?: string;
34
+ } | {
35
+ type: 'array';
36
+ ids: string[];
37
+ };
38
+ export interface InlineCondition {
39
+ column: string;
40
+ op: '=' | '!=' | '<' | '>' | '<=' | '>=';
41
+ value: string;
42
+ }
43
+ export type AutomationContextSelector = {
44
+ kind: 'lastone';
45
+ } | {
46
+ kind: 'firstone';
47
+ } | {
48
+ kind: 'all';
49
+ } | {
50
+ kind: 'byid';
51
+ id: string;
52
+ } | {
53
+ kind: 'where';
54
+ alias: string;
55
+ value: string;
56
+ };
57
+ export type AggregateOp = 'count' | 'sum' | 'avg' | 'min' | 'max' | 'pluck';
58
+ export type ParsedKey = {
59
+ kind: 'simple';
60
+ path: string;
61
+ } | {
62
+ kind: 'scoped';
63
+ scope: string;
64
+ selector: AutomationContextSelector;
65
+ op: 'field' | AggregateOp;
66
+ field: string | null;
67
+ } | {
68
+ kind: 'var_access';
69
+ name: string;
70
+ steps: VarStep[];
71
+ conditions: InlineCondition[];
72
+ };
73
+ export declare function parseTemplateKey(raw: string): ParsedKey | null;
@@ -0,0 +1,6 @@
1
+ import type { ParsedKey } from './template-grammar';
2
+ type VarAccessParsed = Extract<ParsedKey, {
3
+ kind: 'var_access';
4
+ }>;
5
+ export declare function resolveVarAccess(parsed: VarAccessParsed, variables: Record<string, unknown>, onMissing?: (field: string) => void): unknown;
6
+ export {};
@@ -0,0 +1,3 @@
1
+ import type { WhenNode } from '@beechcms/core';
2
+ import type { ResolvedContext } from './context-resolver';
3
+ export declare function evaluateWhen(node: WhenNode | null, context: ResolvedContext): boolean;
@@ -0,0 +1,2 @@
1
+ import type { WhenNode, FilterGroup, Seed } from '@beechcms/core';
2
+ export declare function extractPushdownFilters(node: WhenNode | null, seed: Seed): FilterGroup[];
@@ -0,0 +1,3 @@
1
+ import { Hono } from 'hono';
2
+ import type { AppEnv } from '../../types';
3
+ export declare const backrefsApp: Hono<AppEnv, import("hono/types").BlankSchema, "/">;
@@ -0,0 +1,17 @@
1
+ import type { BackrefSource, Seed } from '@beechcms/core';
2
+ export interface BackrefItem {
3
+ id: string;
4
+ displayName: string | null;
5
+ status: string;
6
+ updated_at: number | null;
7
+ }
8
+ export interface QueryGroupResult {
9
+ items: BackrefItem[];
10
+ total: number;
11
+ }
12
+ export declare class D1BackrefRepository {
13
+ private readonly db;
14
+ constructor(db: D1Database);
15
+ entryExists(slug: string, id: string): Promise<boolean>;
16
+ queryGroup(source: BackrefSource, sourceSeed: Seed, targetId: string, limit: number, offset: number): Promise<QueryGroupResult>;
17
+ }
@@ -0,0 +1 @@
1
+ export { backrefsApp } from './backrefs.handler';
@@ -0,0 +1,12 @@
1
+ export declare const CONTENT_ERRORS: {
2
+ readonly INVALID_SLUG: "Invalid slug";
3
+ readonly INVALID_SLUG_OR_ID: "Invalid slug or id";
4
+ readonly INVALID_JSON_BODY: "Invalid JSON body";
5
+ readonly NOT_FOUND: "Not found";
6
+ readonly SEED_NOT_FOUND: "Seed not found";
7
+ readonly DATABASE_ERROR: "Database error";
8
+ readonly SLUG_CONFLICT: "Slug already exists for this schema";
9
+ readonly SENSITIVE_FIELD_EDIT: "Cannot edit sensitive fields";
10
+ readonly BULK_SIZE_EXCEEDED: "Cannot edit more than 500 entries at once";
11
+ readonly FIELD_NOT_BULK_EDITABLE: "Field cannot be bulk-edited";
12
+ };
@@ -0,0 +1,3 @@
1
+ import { Context } from 'hono';
2
+ import { AppEnv } from '../../../types';
3
+ export declare function bulkHandler(context: Context<AppEnv>): Promise<Response>;
@@ -0,0 +1,3 @@
1
+ import { Context } from 'hono';
2
+ import { AppEnv } from '../../../types';
3
+ export declare function createHandler(context: Context<AppEnv>): Promise<Response>;
@@ -0,0 +1,3 @@
1
+ import { Context } from 'hono';
2
+ import { AppEnv } from '../../../types';
3
+ export declare function deleteHandler(context: Context<AppEnv>): Promise<Response>;
@@ -0,0 +1,3 @@
1
+ import { Context } from 'hono';
2
+ import { AppEnv } from '../../../types';
3
+ export declare function facetsHandler(context: Context<AppEnv>): Promise<Response>;
@@ -0,0 +1,4 @@
1
+ import { Context } from 'hono';
2
+ import { AppEnv } from '../../../types';
3
+ export declare function getByIdHandler(context: Context<AppEnv>): Promise<Response>;
4
+ export declare function getBySlugHandler(context: Context<AppEnv>): Promise<Response>;
@@ -0,0 +1,12 @@
1
+ import { Context } from 'hono';
2
+ import { AppEnv } from '../../../types';
3
+ export declare function normalizeBody(raw: unknown): Record<string, unknown>;
4
+ export declare function contentValidationProblem(context: Context, details: Array<{
5
+ field: string;
6
+ expected: string;
7
+ received: string;
8
+ message: string;
9
+ }>): Response;
10
+ export declare function logContentActivity(context: Context<AppEnv>, action: 'create' | 'update' | 'delete', id: string, slug: string, title: string): void;
11
+ export declare function dispatchContentAutomation(context: Context<AppEnv>, seedSlug: string, event: 'create' | 'update' | 'delete', entry: Record<string, unknown>): void;
12
+ export declare function handleContentDatabaseError(context: Context<AppEnv>, error: unknown): Response;
@@ -0,0 +1,3 @@
1
+ import { Context } from 'hono';
2
+ import { AppEnv } from '../../../types';
3
+ export declare function listHandler(context: Context<AppEnv>): Promise<Response>;
@@ -0,0 +1,3 @@
1
+ import { Context } from 'hono';
2
+ import { AppEnv } from '../../../types';
3
+ export declare function updateHandler(context: Context<AppEnv>): Promise<Response>;
@@ -0,0 +1,4 @@
1
+ import { Hono } from 'hono';
2
+ import { AppEnv } from '../../types';
3
+ declare const content: Hono<AppEnv, import("hono/types").BlankSchema, "/">;
4
+ export default content;
@@ -0,0 +1,7 @@
1
+ import { Hono } from 'hono';
2
+ import type { Env, Variables } from '../../types';
3
+ declare const dashboardLayoutApp: Hono<{
4
+ Bindings: Env;
5
+ Variables: Variables;
6
+ }, import("hono/types").BlankSchema, "/">;
7
+ export { dashboardLayoutApp };
@@ -0,0 +1 @@
1
+ export { dashboardLayoutApp } from './dashboard-layout.handler';
@@ -0,0 +1,4 @@
1
+ import { Hono } from 'hono';
2
+ import { AppEnv } from '../../types';
3
+ declare const draftApp: Hono<AppEnv, import("hono/types").BlankSchema, "/">;
4
+ export { draftApp };
@@ -0,0 +1,9 @@
1
+ import type { AppEnv } from '../../types';
2
+ /**
3
+ * Middleware that guards draft-related endpoints.
4
+ * Responsibilities:
5
+ * 1. Validates that the targeted Seed schema exists.
6
+ * 2. Ensures the Seed configuration explicitly allows drafts.
7
+ * 3. Confirms that the main live content entry exists in the repository.
8
+ */
9
+ export declare const draftGuard: import("hono").MiddlewareHandler<AppEnv, string, {}, Response>;
@@ -0,0 +1 @@
1
+ export { draftApp } from './draft.handler';
@@ -1,9 +1,4 @@
1
- // SPDX-License-Identifier: BUSL-1.1
2
- // Copyright (c) 2024–2026 Flavio De Musso. All rights reserved.
3
- // See LICENSE in the repository root for license terms.
4
-
5
- import type { OutboundEmail } from './email.types'
6
-
1
+ import type { OutboundEmail } from './email.types';
7
2
  /**
8
3
  * EmailProvider — formal contract for email sending providers.
9
4
  *
@@ -21,22 +16,22 @@ import type { OutboundEmail } from './email.types'
21
16
  * ─────────────────────────────────────────────────────────────────────────────
22
17
  */
23
18
  export interface EmailProvider {
24
- /**
25
- * Sends a single transactional email.
26
- *
27
- * @param email - The fully resolved message: sender, recipient,
28
- * subject, and HTML body. Use the builders in `templates/` to
29
- * construct this object correctly.
30
- *
31
- * @returns Promise that resolves when the provider has **accepted** the
32
- * message for delivery. Acceptance does not guarantee delivery
33
- * to the inbox — that depends on the recipient's server and the
34
- * provider's deliverability.
35
- *
36
- * @throws {Error} If the provider rejects the request (failed authentication,
37
- * network error, invalid payload). The caller
38
- * (`email.service.ts`) is responsible for catching and handling
39
- * this error appropriately.
40
- */
41
- send(email: OutboundEmail): Promise<void>
19
+ /**
20
+ * Sends a single transactional email.
21
+ *
22
+ * @param email - The fully resolved message: sender, recipient,
23
+ * subject, and HTML body. Use the builders in `templates/` to
24
+ * construct this object correctly.
25
+ *
26
+ * @returns Promise that resolves when the provider has **accepted** the
27
+ * message for delivery. Acceptance does not guarantee delivery
28
+ * to the inbox — that depends on the recipient's server and the
29
+ * provider's deliverability.
30
+ *
31
+ * @throws {Error} If the provider rejects the request (failed authentication,
32
+ * network error, invalid payload). The caller
33
+ * (`email.service.ts`) is responsible for catching and handling
34
+ * this error appropriately.
35
+ */
36
+ send(email: OutboundEmail): Promise<void>;
42
37
  }
@@ -0,0 +1,13 @@
1
+ import type { PasswordResetEmailParams, PasswordChangedEmailParams, AutomationMailParams } from './email.types';
2
+ export interface EmailProviderEnv {
3
+ /** "smtp" | "resend"; default "resend" if absent */
4
+ provider?: string;
5
+ /** Resend API key, used when provider is "resend" */
6
+ apiKey?: string;
7
+ /** Mailpit base URL (e.g. http://localhost:8025), used when provider is "smtp" */
8
+ smtpBaseUrl?: string;
9
+ isDev?: boolean;
10
+ }
11
+ export declare function sendPasswordResetEmail(params: PasswordResetEmailParams): Promise<void>;
12
+ export declare function sendPasswordChangedEmail(params: PasswordChangedEmailParams): Promise<void>;
13
+ export declare function sendAutomationMail(params: AutomationMailParams): Promise<void>;
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Shared types for the Beech CMS email module.
3
+ *
4
+ * All types used across provider, service, and templates are defined here
5
+ * so that each layer remains decoupled from the others.
6
+ */
7
+ /**
8
+ * Supported languages for the email template system.
9
+ *
10
+ * To add a new language:
11
+ * 1. Add the ISO code here (e.g., `'fr'`).
12
+ * 2. Add the corresponding translation in the `COPY` object of every
13
+ * file in `templates/`. TypeScript will flag missing keys.
14
+ */
15
+ export declare const SUPPORTED_EMAIL_LOCALES: readonly ["en", "it"];
16
+ export type EmailLocale = (typeof SUPPORTED_EMAIL_LOCALES)[number];
17
+ /**
18
+ * Resolves an unverified locale string (e.g., from a request body)
19
+ * to a supported `EmailLocale` value. Any unknown value
20
+ * safely falls back to `'en'`.
21
+ *
22
+ * @param raw - Raw value from the client (can be anything).
23
+ * @returns A valid `EmailLocale`, always.
24
+ */
25
+ export declare function resolveEmailLocale(raw: unknown): EmailLocale;
26
+ /**
27
+ * The resolved email message that the provider receives and sends.
28
+ * It is constructed by the service by combining the call parameters
29
+ * with the template builder output.
30
+ */
31
+ export interface OutboundEmail {
32
+ /** Sender address in RFC 5321 format (e.g., "Beech CMS <noreply@beechcms.dev>"). */
33
+ from: string;
34
+ /** List of recipient addresses. Must contain at least one element. */
35
+ to: string[];
36
+ subject: string;
37
+ /** Complete HTML body. Must be a valid HTML document (see `templates/shell.ts`). */
38
+ html: string;
39
+ }
40
+ /**
41
+ * Shared parameters for every email sending function in `email.service.ts`.
42
+ * Specific functions extend this type with the additional fields
43
+ * required for their respective templates.
44
+ */
45
+ export interface BaseEmailParams {
46
+ /** Main recipient address. */
47
+ to: string;
48
+ /** Email body language. Use `resolveEmailLocale()` before passing it here. */
49
+ locale: EmailLocale;
50
+ /**
51
+ * Resend API key (or the active provider's key). Must be non-empty —
52
+ * the caller is responsible for validating it before invoking the service.
53
+ */
54
+ apiKey: string;
55
+ /**
56
+ * Sender address in RFC 5321 format.
57
+ * Default: "Beech CMS <onboarding@resend.dev>" (Resend test sender).
58
+ * In production, set a verified address via the
59
+ * `EMAIL_FROM` environment variable.
60
+ */
61
+ from?: string;
62
+ /**
63
+ * When `true`, provider errors are logged to the console.
64
+ * Set to `false` in production to avoid exposing internal details.
65
+ */
66
+ isDev?: boolean;
67
+ }
68
+ /** Parameters for the password reset email — adds the reset URL. */
69
+ export interface PasswordResetEmailParams extends BaseEmailParams {
70
+ /**
71
+ * Complete URL that the user clicks to set the new password.
72
+ * Contains the token in plain text as a query param `?token=<uuid>`.
73
+ * Constructed by the caller as `${APP_URL}/reset-password?token=${token}`.
74
+ */
75
+ resetUrl: string;
76
+ provider?: 'smtp' | 'resend';
77
+ smtpBaseUrl?: string;
78
+ }
79
+ /** Parameters for the "password changed" notification. No additional fields. */
80
+ export interface PasswordChangedEmailParams extends BaseEmailParams {
81
+ provider?: 'smtp' | 'resend';
82
+ smtpBaseUrl?: string;
83
+ }
84
+ export interface AutomationMailParams {
85
+ to: string;
86
+ subject: string;
87
+ /** Plain text or HTML — passed verbatim to provider. */
88
+ body: string;
89
+ apiKey?: string;
90
+ resendApiKey?: string;
91
+ from?: string;
92
+ provider?: 'smtp' | 'resend';
93
+ smtpBaseUrl?: string;
94
+ }
@@ -1,7 +1,3 @@
1
- // SPDX-License-Identifier: BUSL-1.1
2
- // Copyright (c) 2024–2026 Flavio De Musso. All rights reserved.
3
- // See LICENSE in the repository root for license terms.
4
-
5
1
  /**
6
2
  * Public API — modulo email di Beech CMS
7
3
  *
@@ -19,15 +15,6 @@
19
15
  * PasswordResetEmailParams — shape dei parametri per sendPasswordResetEmail
20
16
  * PasswordChangedEmailParams — shape dei parametri per sendPasswordChangedEmail
21
17
  */
22
-
23
- export { sendPasswordResetEmail, sendPasswordChangedEmail, sendAutomationMail } from './email.service'
24
- export {
25
- resolveEmailLocale,
26
- SUPPORTED_EMAIL_LOCALES,
27
- } from './email.types'
28
- export type {
29
- EmailLocale,
30
- PasswordResetEmailParams,
31
- PasswordChangedEmailParams,
32
- AutomationMailParams,
33
- } from './email.types'
18
+ export { sendPasswordResetEmail, sendPasswordChangedEmail, sendAutomationMail } from './email.service';
19
+ export { resolveEmailLocale, SUPPORTED_EMAIL_LOCALES, } from './email.types';
20
+ export type { EmailLocale, PasswordResetEmailParams, PasswordChangedEmailParams, AutomationMailParams, } from './email.types';