@beechcms/api 0.6.0-preview.1 → 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 (373) hide show
  1. package/README.md +4 -4
  2. package/assets/dashboard/BeechLogo.svg +18 -18
  3. package/assets/dashboard/BeechLogoLIght.svg +48 -48
  4. package/assets/dashboard/assets/chart-Cws4Yj6K.js +39 -0
  5. package/assets/dashboard/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  6. package/assets/dashboard/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  7. package/assets/dashboard/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  8. package/assets/dashboard/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  9. package/assets/dashboard/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  10. package/assets/dashboard/assets/index-BjPpppHe.css +1 -0
  11. package/assets/dashboard/assets/index-CrW-zhkA.js +642 -0
  12. package/assets/dashboard/assets/lora-cyrillic-ext-wght-normal-YcVxMP-u.woff2 +0 -0
  13. package/assets/dashboard/assets/lora-cyrillic-wght-normal-UWPuZLjM.woff2 +0 -0
  14. package/assets/dashboard/assets/lora-latin-ext-wght-normal-C2Wlntb9.woff2 +0 -0
  15. package/assets/dashboard/assets/lora-latin-wght-normal-BiLcIKcI.woff2 +0 -0
  16. package/assets/dashboard/assets/lora-math-wght-normal-sOy7rEfW.woff2 +0 -0
  17. package/assets/dashboard/assets/lora-symbols-wght-normal-DQ5VrUkH.woff2 +0 -0
  18. package/assets/dashboard/assets/lora-vietnamese-wght-normal-CfJ7gtf3.woff2 +0 -0
  19. package/assets/dashboard/assets/pie-chart-recharts-CAxoDQp2.js +1 -0
  20. package/assets/dashboard/assets/timeseries-chart-recharts-CixDW-LM.js +1 -0
  21. package/assets/dashboard/beechLogoDark.svg +48 -48
  22. package/assets/dashboard/index.html +18 -18
  23. package/assets/dashboard/noResult.svg +42 -42
  24. package/assets/dashboard/sol.svg +3 -3
  25. package/assets/dashboard/undraw_enter_nwx3.svg +36 -36
  26. package/dist/auth/__fixtures__/in-memory-hash-provider.d.ts +5 -0
  27. package/dist/auth/__fixtures__/static-token-service.d.ts +6 -0
  28. package/dist/auth/bcrypt-hash-provider.d.ts +8 -0
  29. package/dist/auth/constants.d.ts +10 -0
  30. package/dist/auth/jose-token-service.d.ts +14 -0
  31. package/dist/auth/login.d.ts +32 -0
  32. package/dist/auth/refresh.d.ts +1 -0
  33. package/dist/factory.d.ts +39 -0
  34. package/dist/features/automations/action-executors/create-entry.executor.d.ts +7 -0
  35. package/dist/features/automations/action-executors/edit-field.executor.d.ts +7 -0
  36. package/dist/features/automations/action-executors/index.d.ts +13 -0
  37. package/dist/features/automations/action-executors/send-mail.executor.d.ts +7 -0
  38. package/dist/features/automations/action-executors/set-variable.executor.d.ts +15 -0
  39. package/dist/features/automations/action-executors/webhook.executor.d.ts +7 -0
  40. package/dist/features/automations/automation-runner.d.ts +13 -0
  41. package/dist/features/automations/automation-runner.utils.d.ts +3 -0
  42. package/dist/features/automations/automations.handler.d.ts +7 -0
  43. package/dist/features/automations/automations.schema.d.ts +191 -0
  44. package/dist/features/automations/context-resolver.d.ts +8 -0
  45. package/dist/features/automations/cron-runner.d.ts +9 -0
  46. package/dist/features/automations/cron-runner.utils.d.ts +1 -0
  47. package/dist/features/automations/filter-translation.d.ts +9 -0
  48. package/dist/features/automations/index.d.ts +7 -0
  49. package/dist/features/automations/template-grammar.d.ts +73 -0
  50. package/dist/features/automations/var-access-resolver.d.ts +6 -0
  51. package/dist/features/automations/when-evaluator.d.ts +3 -0
  52. package/dist/features/automations/when-pushdown.d.ts +2 -0
  53. package/dist/features/backrefs/backrefs.handler.d.ts +3 -0
  54. package/dist/features/backrefs/d1-backref.repository.d.ts +17 -0
  55. package/dist/features/backrefs/index.d.ts +1 -0
  56. package/dist/features/content/constants.d.ts +12 -0
  57. package/dist/features/content/handlers/bulk.handler.d.ts +3 -0
  58. package/dist/features/content/handlers/create.d.ts +3 -0
  59. package/dist/features/content/handlers/delete.d.ts +3 -0
  60. package/dist/features/content/handlers/facets.d.ts +3 -0
  61. package/dist/features/content/handlers/get.d.ts +4 -0
  62. package/dist/features/content/handlers/helpers.d.ts +12 -0
  63. package/dist/features/content/handlers/list.d.ts +3 -0
  64. package/dist/features/content/handlers/update.d.ts +3 -0
  65. package/dist/features/content/index.d.ts +4 -0
  66. package/dist/features/dashboard-layout/dashboard-layout.handler.d.ts +7 -0
  67. package/dist/features/dashboard-layout/index.d.ts +1 -0
  68. package/dist/features/draft/draft.handler.d.ts +4 -0
  69. package/dist/features/draft/draft.middleware.d.ts +9 -0
  70. package/dist/features/draft/index.d.ts +1 -0
  71. package/{src/features/email/email.provider.ts → dist/features/email/email.provider.d.ts} +37 -42
  72. package/dist/features/email/email.service.d.ts +13 -0
  73. package/dist/features/email/email.types.d.ts +94 -0
  74. package/{src/features/email/index.ts → dist/features/email/index.d.ts} +20 -33
  75. package/dist/features/email/providers/resend.d.ts +36 -0
  76. package/dist/features/email/providers/smtp.d.ts +11 -0
  77. package/dist/features/email/templates/automation-mail.d.ts +8 -0
  78. package/dist/features/email/templates/password-changed.d.ts +15 -0
  79. package/dist/features/email/templates/password-reset.d.ts +18 -0
  80. package/dist/features/email/templates/shell.d.ts +58 -0
  81. package/dist/features/notifications/index.d.ts +1 -0
  82. package/dist/features/notifications/notifications.handler.d.ts +15 -0
  83. package/dist/features/password-reset/index.d.ts +6 -0
  84. package/dist/features/password-reset/request.d.ts +10 -0
  85. package/dist/features/password-reset/reset.d.ts +9 -0
  86. package/dist/features/rotate-field/index.d.ts +1 -0
  87. package/dist/features/rotate-field/rotate-field.handler.d.ts +7 -0
  88. package/dist/features/rotate-field/rotate-field.schema.d.ts +11 -0
  89. package/dist/features/schema/schema.handler.d.ts +7 -0
  90. package/dist/features/seeds/index.d.ts +1 -0
  91. package/dist/features/seeds/seeds.handler.d.ts +6 -0
  92. package/dist/features/settings/settings.handler.d.ts +7 -0
  93. package/dist/features/setup/index.d.ts +7 -0
  94. package/dist/features/stats/index.d.ts +1 -0
  95. package/dist/features/stats/stats.handler.d.ts +7 -0
  96. package/dist/features/webhooks/index.d.ts +3 -0
  97. package/dist/index.d.ts +6 -0
  98. package/dist/index.js +9666 -0
  99. package/dist/media-utils.d.ts +25 -0
  100. package/dist/middleware/auth-providers.middleware.d.ts +8 -0
  101. package/dist/middleware/observability.middleware.d.ts +20 -0
  102. package/dist/middleware/rate-limit.middleware.d.ts +9 -0
  103. package/dist/middleware/repository.middleware.d.ts +34 -0
  104. package/dist/middleware/seed-registry.middleware.d.ts +10 -0
  105. package/dist/middleware/storage.middleware.d.ts +7 -0
  106. package/dist/middleware.d.ts +11 -0
  107. package/dist/public/access-policy.d.ts +12 -0
  108. package/dist/public/api-key-middleware.d.ts +6 -0
  109. package/dist/public/cache-utils.d.ts +10 -0
  110. package/dist/public/entry-projection.d.ts +2 -0
  111. package/dist/public/idempotency.d.ts +9 -0
  112. package/dist/public/index.d.ts +11 -0
  113. package/dist/public/problem-details.d.ts +31 -0
  114. package/dist/public/public-add.d.ts +3 -0
  115. package/dist/public/public-edit.d.ts +5 -0
  116. package/dist/public/public-errors.d.ts +13 -0
  117. package/dist/public/public-read.d.ts +3 -0
  118. package/dist/public/public-routes.d.ts +3 -0
  119. package/dist/public/query-builder.d.ts +28 -0
  120. package/dist/public/rate-limit-middleware.d.ts +3 -0
  121. package/dist/public/read-list.d.ts +26 -0
  122. package/dist/public/read-single.d.ts +22 -0
  123. package/dist/public/response-builder.d.ts +22 -0
  124. package/dist/public/sanitize.d.ts +23 -0
  125. package/dist/public/slug-utils.d.ts +11 -0
  126. package/dist/rate-limit/cloudflare-rate-limiter.d.ts +6 -0
  127. package/dist/rate-limit/in-memory-rate-limiter.d.ts +7 -0
  128. package/dist/rate-limit/no-op-rate-limiter.d.ts +4 -0
  129. package/dist/search-utils.d.ts +54 -0
  130. package/dist/search.d.ts +6 -0
  131. package/dist/shared/apply-policies.d.ts +10 -0
  132. package/dist/shared/automations.repository.d1.d.ts +12 -0
  133. package/dist/shared/background-notification-service.d.ts +18 -0
  134. package/dist/shared/base.repository.d1.d.ts +18 -0
  135. package/dist/shared/content-utils.d.ts +21 -0
  136. package/dist/shared/content.repository.d1.d.ts +68 -0
  137. package/dist/shared/d1-activity-log.repository.d.ts +13 -0
  138. package/dist/shared/d1-activity-logger.d.ts +20 -0
  139. package/dist/shared/d1-analytics.repository.d.ts +20 -0
  140. package/dist/shared/d1-content-scan.repository.d.ts +7 -0
  141. package/dist/shared/d1-notification.repository.d.ts +17 -0
  142. package/dist/shared/d1-password-reset-token.repository.d.ts +10 -0
  143. package/dist/shared/d1-search.repository.d.ts +14 -0
  144. package/dist/shared/d1-session.repository.d.ts +12 -0
  145. package/dist/shared/d1-setup-checklist.repository.d.ts +12 -0
  146. package/dist/shared/d1-user.repository.d.ts +18 -0
  147. package/dist/shared/d1-widget.repository.d.ts +31 -0
  148. package/dist/shared/dashboard-layout.repository.d1.d.ts +9 -0
  149. package/dist/shared/demo-data-sql.d.ts +1 -0
  150. package/dist/shared/demo-data.repository.d1.d.ts +6 -0
  151. package/dist/shared/execution-context-scheduler.d.ts +6 -0
  152. package/dist/shared/fixed-clock.d.ts +13 -0
  153. package/dist/shared/fts-sync.d.ts +1 -0
  154. package/dist/shared/idempotency.repository.d1.d.ts +16 -0
  155. package/dist/shared/in-memory-activity-logger.d.ts +11 -0
  156. package/dist/shared/in-memory-notification-service.d.ts +11 -0
  157. package/dist/shared/in-memory-seed.repository.d.ts +18 -0
  158. package/dist/shared/media.repository.d1.d.ts +35 -0
  159. package/dist/shared/qstash-notification-service.d.ts +18 -0
  160. package/dist/shared/query-utils.d.ts +36 -0
  161. package/dist/shared/request-utils.d.ts +13 -0
  162. package/dist/shared/schema-mutator.d1.d.ts +12 -0
  163. package/dist/shared/seed-layout.repository.d1.d.ts +9 -0
  164. package/dist/shared/seed-registry-cache.d.ts +12 -0
  165. package/dist/shared/seed.repository.d1.d.ts +13 -0
  166. package/dist/shared/sequential-id-generator.d.ts +13 -0
  167. package/dist/shared/site-settings.repository.d1.d.ts +7 -0
  168. package/dist/shared/storage/factory.d.ts +8 -0
  169. package/dist/shared/storage/s3-bucket.d.ts +43 -0
  170. package/dist/shared/storage-utils.d.ts +7 -0
  171. package/dist/shared/system-stats.repository.d1.d.ts +25 -0
  172. package/dist/types.d.ts +85 -0
  173. package/dist/upload.d.ts +16 -0
  174. package/dist/widget.d.ts +7 -0
  175. package/migrations/0000_v040_base.sql +265 -265
  176. package/migrations/0029_automations.sql +14 -14
  177. package/migrations/0030_test_seeds.sql +125 -125
  178. package/package.json +27 -18
  179. package/assets/dashboard/assets/index-BSjk0Sx9.js +0 -634
  180. package/assets/dashboard/assets/index-kRCYVN2B.css +0 -1
  181. package/src/auth/__fixtures__/in-memory-hash-provider.ts +0 -17
  182. package/src/auth/__fixtures__/static-token-service.ts +0 -22
  183. package/src/auth/bcrypt-hash-provider.ts +0 -24
  184. package/src/auth/constants.ts +0 -14
  185. package/src/auth/generate-refresh-token.test.ts +0 -23
  186. package/src/auth/hash-provider.test.ts +0 -55
  187. package/src/auth/jose-token-service.ts +0 -62
  188. package/src/auth/jwt-claims-passthrough.test.ts +0 -87
  189. package/src/auth/login.test.ts +0 -100
  190. package/src/auth/login.ts +0 -78
  191. package/src/auth/refresh.ts +0 -11
  192. package/src/auth/token-service.test.ts +0 -90
  193. package/src/factory.ts +0 -368
  194. package/src/features/automations/__tests__/action-executors.test.ts +0 -255
  195. package/src/features/automations/__tests__/automation-runner.test.ts +0 -196
  196. package/src/features/automations/__tests__/automation-runner.utils.test.ts +0 -60
  197. package/src/features/automations/__tests__/automations.handler.test.ts +0 -264
  198. package/src/features/automations/__tests__/automations.repository.test.ts +0 -163
  199. package/src/features/automations/__tests__/automations.schema.test.ts +0 -224
  200. package/src/features/automations/__tests__/context-resolver.test.ts +0 -126
  201. package/src/features/automations/__tests__/cron-runner.test.ts +0 -267
  202. package/src/features/automations/__tests__/cron-runner.utils.test.ts +0 -144
  203. package/src/features/automations/__tests__/set-variable.executor.test.ts +0 -383
  204. package/src/features/automations/__tests__/template-grammar.test.ts +0 -308
  205. package/src/features/automations/__tests__/webhook.executor.test.ts +0 -142
  206. package/src/features/automations/__tests__/when-evaluator.test.ts +0 -274
  207. package/src/features/automations/__tests__/when-pushdown.test.ts +0 -281
  208. package/src/features/automations/action-executors/create-entry.executor.ts +0 -27
  209. package/src/features/automations/action-executors/edit-field.executor.ts +0 -26
  210. package/src/features/automations/action-executors/index.ts +0 -37
  211. package/src/features/automations/action-executors/send-mail.executor.ts +0 -53
  212. package/src/features/automations/action-executors/set-variable.executor.ts +0 -159
  213. package/src/features/automations/action-executors/webhook.executor.ts +0 -67
  214. package/src/features/automations/automation-runner.ts +0 -85
  215. package/src/features/automations/automation-runner.utils.ts +0 -47
  216. package/src/features/automations/automations.handler.ts +0 -197
  217. package/src/features/automations/automations.schema.ts +0 -177
  218. package/src/features/automations/context-resolver.ts +0 -152
  219. package/src/features/automations/cron-runner.ts +0 -140
  220. package/src/features/automations/cron-runner.utils.ts +0 -44
  221. package/src/features/automations/filter-translation.ts +0 -46
  222. package/src/features/automations/index.ts +0 -16
  223. package/src/features/automations/template-grammar.ts +0 -245
  224. package/src/features/automations/var-access-resolver.ts +0 -140
  225. package/src/features/automations/when-evaluator.ts +0 -87
  226. package/src/features/automations/when-pushdown.ts +0 -57
  227. package/src/features/backrefs/__tests__/backrefs.handler.test.ts +0 -359
  228. package/src/features/backrefs/backrefs.handler.ts +0 -168
  229. package/src/features/backrefs/d1-backref.repository.ts +0 -84
  230. package/src/features/backrefs/index.ts +0 -5
  231. package/src/features/content/constants.ts +0 -16
  232. package/src/features/content/handlers/bulk.handler.ts +0 -185
  233. package/src/features/content/handlers/create.ts +0 -129
  234. package/src/features/content/handlers/delete.ts +0 -62
  235. package/src/features/content/handlers/facets.ts +0 -49
  236. package/src/features/content/handlers/get.ts +0 -120
  237. package/src/features/content/handlers/helpers.test.ts +0 -180
  238. package/src/features/content/handlers/helpers.ts +0 -93
  239. package/src/features/content/handlers/list.ts +0 -174
  240. package/src/features/content/handlers/update.ts +0 -174
  241. package/src/features/content/index.ts +0 -26
  242. package/src/features/draft/draft.handler.ts +0 -195
  243. package/src/features/draft/draft.middleware.ts +0 -66
  244. package/src/features/draft/index.ts +0 -5
  245. package/src/features/email/email.service.ts +0 -98
  246. package/src/features/email/email.types.ts +0 -119
  247. package/src/features/email/providers/resend.ts +0 -67
  248. package/src/features/email/providers/smtp.ts +0 -55
  249. package/src/features/email/templates/automation-mail.ts +0 -19
  250. package/src/features/email/templates/password-changed.ts +0 -63
  251. package/src/features/email/templates/password-reset.ts +0 -68
  252. package/src/features/email/templates/shell.ts +0 -96
  253. package/src/features/notifications/index.ts +0 -5
  254. package/src/features/notifications/notifications.handler.ts +0 -105
  255. package/src/features/password-reset/index.ts +0 -19
  256. package/src/features/password-reset/request.ts +0 -92
  257. package/src/features/password-reset/reset.ts +0 -102
  258. package/src/features/rotate-field/index.ts +0 -5
  259. package/src/features/rotate-field/rotate-field.handler.ts +0 -132
  260. package/src/features/rotate-field/rotate-field.schema.ts +0 -17
  261. package/src/features/schema/schema.handler.ts +0 -131
  262. package/src/features/seeds/index.ts +0 -5
  263. package/src/features/seeds/seeds.handler.test.ts +0 -632
  264. package/src/features/seeds/seeds.handler.ts +0 -693
  265. package/src/features/settings/__tests__/settings.handler.test.ts +0 -555
  266. package/src/features/settings/settings.handler.ts +0 -392
  267. package/src/features/setup/index.ts +0 -204
  268. package/src/features/stats/index.ts +0 -5
  269. package/src/features/stats/stats.handler.ts +0 -420
  270. package/src/features/webhooks/index.ts +0 -63
  271. package/src/index.ts +0 -65
  272. package/src/media-utils.ts +0 -82
  273. package/src/middleware/auth-providers.middleware.ts +0 -45
  274. package/src/middleware/observability.middleware.ts +0 -70
  275. package/src/middleware/rate-limit.middleware.ts +0 -45
  276. package/src/middleware/repository.middleware.ts +0 -114
  277. package/src/middleware/seed-registry.middleware.test.ts +0 -97
  278. package/src/middleware/seed-registry.middleware.ts +0 -21
  279. package/src/middleware/storage.middleware.ts +0 -25
  280. package/src/middleware.ts +0 -45
  281. package/src/public/access-policy.ts +0 -27
  282. package/src/public/api-key-middleware.ts +0 -57
  283. package/src/public/cache-utils.ts +0 -38
  284. package/src/public/entry-projection.ts +0 -46
  285. package/src/public/idempotency.ts +0 -23
  286. package/src/public/index.ts +0 -16
  287. package/src/public/problem-details.ts +0 -124
  288. package/src/public/public-add.ts +0 -114
  289. package/src/public/public-edit.ts +0 -163
  290. package/src/public/public-errors.ts +0 -19
  291. package/src/public/public-read.ts +0 -63
  292. package/src/public/public-routes.ts +0 -88
  293. package/src/public/query-builder.test.ts +0 -224
  294. package/src/public/query-builder.ts +0 -156
  295. package/src/public/rate-limit-middleware.ts +0 -34
  296. package/src/public/read-list.ts +0 -54
  297. package/src/public/read-single.ts +0 -48
  298. package/src/public/response-builder.ts +0 -30
  299. package/src/public/sanitize.ts +0 -69
  300. package/src/public/slug-utils.ts +0 -18
  301. package/src/rate-limit/cloudflare-rate-limiter.test.ts +0 -30
  302. package/src/rate-limit/cloudflare-rate-limiter.ts +0 -15
  303. package/src/rate-limit/in-memory-rate-limiter.test.ts +0 -37
  304. package/src/rate-limit/in-memory-rate-limiter.ts +0 -17
  305. package/src/rate-limit/no-op-rate-limiter.test.ts +0 -22
  306. package/src/rate-limit/no-op-rate-limiter.ts +0 -11
  307. package/src/search-utils.test.ts +0 -211
  308. package/src/search-utils.ts +0 -213
  309. package/src/search.ts +0 -65
  310. package/src/shared/apply-policies.test.ts +0 -81
  311. package/src/shared/apply-policies.ts +0 -67
  312. package/src/shared/automations.repository.d1.ts +0 -150
  313. package/src/shared/background-notification-service.test.ts +0 -62
  314. package/src/shared/background-notification-service.ts +0 -52
  315. package/src/shared/base.repository.d1.ts +0 -32
  316. package/src/shared/content-utils.test.ts +0 -165
  317. package/src/shared/content-utils.ts +0 -86
  318. package/src/shared/content.repository.d1.test.ts +0 -458
  319. package/src/shared/content.repository.d1.ts +0 -851
  320. package/src/shared/d1-activity-log.repository.test.ts +0 -140
  321. package/src/shared/d1-activity-log.repository.ts +0 -105
  322. package/src/shared/d1-activity-logger.test.ts +0 -86
  323. package/src/shared/d1-activity-logger.ts +0 -67
  324. package/src/shared/d1-analytics.repository.test.ts +0 -78
  325. package/src/shared/d1-analytics.repository.ts +0 -85
  326. package/src/shared/d1-content-scan.repository.test.ts +0 -80
  327. package/src/shared/d1-content-scan.repository.ts +0 -37
  328. package/src/shared/d1-notification.repository.test.ts +0 -128
  329. package/src/shared/d1-notification.repository.ts +0 -118
  330. package/src/shared/d1-password-reset-token.repository.test.ts +0 -81
  331. package/src/shared/d1-password-reset-token.repository.ts +0 -56
  332. package/src/shared/d1-search.repository.test.ts +0 -87
  333. package/src/shared/d1-search.repository.ts +0 -88
  334. package/src/shared/d1-session.repository.test.ts +0 -125
  335. package/src/shared/d1-session.repository.ts +0 -102
  336. package/src/shared/d1-setup-checklist.repository.ts +0 -36
  337. package/src/shared/d1-user.repository.test.ts +0 -151
  338. package/src/shared/d1-user.repository.ts +0 -119
  339. package/src/shared/d1-widget.repository.test.ts +0 -221
  340. package/src/shared/d1-widget.repository.ts +0 -341
  341. package/src/shared/demo-data-sql.ts +0 -54
  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 -51
  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.ts +0 -64
  358. package/src/shared/seed-layout.repository.d1.test.ts +0 -114
  359. package/src/shared/seed-layout.repository.d1.ts +0 -62
  360. package/src/shared/seed-registry-cache.test.ts +0 -68
  361. package/src/shared/seed-registry-cache.ts +0 -49
  362. package/src/shared/seed.repository.d1.test.ts +0 -143
  363. package/src/shared/seed.repository.d1.ts +0 -98
  364. package/src/shared/sequential-id-generator.ts +0 -33
  365. package/src/shared/site-settings.repository.d1.ts +0 -53
  366. package/src/shared/storage/factory.ts +0 -41
  367. package/src/shared/storage/s3-bucket.ts +0 -195
  368. package/src/shared/storage-utils.ts +0 -40
  369. package/src/shared/system-stats.repository.d1.test.ts +0 -58
  370. package/src/shared/system-stats.repository.d1.ts +0 -48
  371. package/src/types.ts +0 -87
  372. package/src/upload.ts +0 -198
  373. package/src/widget.ts +0 -212
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Media utils: estrazione chiavi R2 dal data di un'entry.
3
+ * Usato alla cancellazione entry per eliminare i file associati da R2.
4
+ *
5
+ * @see docs/media-engine.md
6
+ */
7
+ import type { Seed } from '@beechcms/core';
8
+ /**
9
+ * Estrae la chiave R2 da un URL di media.
10
+ * Es: "https://x.com/api/media/1739123456-avatar.png" → "1739123456-avatar.png"
11
+ *
12
+ * @param mediaUrl - URL completo o path (es. /api/media/123-foto.png)
13
+ * @returns Chiave R2 o null se l'URL non è valido
14
+ */
15
+ export declare function extractMediaKey(mediaUrl: string): string | null;
16
+ /**
17
+ * Estrae tutte le chiavi R2 dal data di un'entry.
18
+ * Cerca nei campi `file` (stringa URL) e `json` (array/oggetto con URL).
19
+ * Il data è in formato DB: chiavi = branch.id (es. art_03, prd_05).
20
+ *
21
+ * @param seed - Schema del tipo di contenuto
22
+ * @param entryData - Payload in formato DB (chiavi = branch ID)
23
+ * @returns Array di chiavi R2 uniche da eliminare
24
+ */
25
+ export declare function extractMediaKeysFromData(seed: Seed, entryData: Record<string, unknown>): string[];
@@ -0,0 +1,8 @@
1
+ import type { IHashProvider, ITokenService, IClock } from '@beechcms/core';
2
+ import type { AppEnv } from '../types';
3
+ export interface AuthProviderOverrides {
4
+ hashProvider?: IHashProvider;
5
+ tokenService?: ITokenService;
6
+ clock?: IClock;
7
+ }
8
+ export declare const authProvidersMiddleware: (overrides?: AuthProviderOverrides) => import("hono").MiddlewareHandler<AppEnv, string, {}, Response>;
@@ -0,0 +1,20 @@
1
+ import type { IActivityLogger, INotificationService, IClock, IIdGenerator } from '@beechcms/core';
2
+ import type { AppEnv } from '../types';
3
+ export interface ObservabilityOverrides {
4
+ activityLogger?: IActivityLogger;
5
+ notificationService?: INotificationService;
6
+ clock?: IClock;
7
+ idGenerator?: IIdGenerator;
8
+ }
9
+ /**
10
+ * Observability middleware.
11
+ *
12
+ * Injects the activity logger and the notification service into the Hono
13
+ * context. Both depend on `executionCtx.waitUntil` to fire-and-forget their
14
+ * persistence work in production. The notification service additionally
15
+ * depends on the notification repository — `repositoryMiddleware` MUST run
16
+ * before this middleware in the factory pipeline.
17
+ *
18
+ * Tests can pass their own implementations via `overrides` to bypass D1.
19
+ */
20
+ export declare const observabilityMiddleware: (overrides?: ObservabilityOverrides) => import("hono").MiddlewareHandler<AppEnv, string, {}, Response>;
@@ -0,0 +1,9 @@
1
+ import type { IRateLimiter } from '@beechcms/core';
2
+ import type { AppEnv } from '../types';
3
+ export type RateLimiterName = 'login' | 'tokenRefresh' | 'forgotPassword' | 'resetPassword' | 'publicApiRead' | 'publicApiWrite';
4
+ export interface IRateLimiterRegistry {
5
+ getLimiter(name: RateLimiterName): IRateLimiter;
6
+ }
7
+ export declare const rateLimiterMiddleware: (overrides?: {
8
+ registry?: IRateLimiterRegistry;
9
+ }) => import("hono").MiddlewareHandler<AppEnv, string, {}, Response>;
@@ -0,0 +1,34 @@
1
+ import type { ContentRepository, IdempotencyRepository, MediaRepository, SystemStatsRepository, IUserRepository, ISessionRepository, IPasswordResetTokenRepository, IActivityLogRepository, INotificationRepository, IWidgetRepository, ISearchRepository, IAnalyticsRepository, IContentScanRepository, IClock, IIdGenerator, IAutomationRunner, IAutomationRepository, IScheduler, ISiteSettingsRepository, IDemoDataRepository, ISeedLayoutRepository, ISeedRepository, ISchemaMutator, IDashboardLayoutRepository, BeechHooks } from '@beechcms/core';
2
+ import type { Env, Variables } from '../types';
3
+ interface RepositoryOverrides {
4
+ repository?: ContentRepository;
5
+ idempotencyRepository?: IdempotencyRepository;
6
+ mediaRepository?: MediaRepository;
7
+ systemStatsRepository?: SystemStatsRepository;
8
+ userRepository?: IUserRepository;
9
+ sessionRepository?: ISessionRepository;
10
+ passwordResetTokenRepository?: IPasswordResetTokenRepository;
11
+ activityLogRepository?: IActivityLogRepository;
12
+ notificationRepository?: INotificationRepository;
13
+ widgetRepository?: IWidgetRepository;
14
+ searchRepository?: ISearchRepository;
15
+ analyticsRepository?: IAnalyticsRepository;
16
+ contentScanRepository?: IContentScanRepository;
17
+ clock?: IClock;
18
+ idGenerator?: IIdGenerator;
19
+ automationRepository?: IAutomationRepository;
20
+ automationRunner?: IAutomationRunner;
21
+ scheduler?: IScheduler;
22
+ siteSettingsRepository?: ISiteSettingsRepository;
23
+ demoDataRepository?: IDemoDataRepository;
24
+ seedLayoutRepository?: ISeedLayoutRepository;
25
+ seedRepository?: ISeedRepository;
26
+ schemaMutator?: ISchemaMutator;
27
+ dashboardLayoutRepository?: IDashboardLayoutRepository;
28
+ hooks?: BeechHooks;
29
+ }
30
+ export declare const repositoryMiddleware: (overrides?: RepositoryOverrides) => import("hono").MiddlewareHandler<{
31
+ Bindings: Env;
32
+ Variables: Variables;
33
+ }, string, {}, Response>;
34
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { Env, Variables } from '../types';
2
+ /**
3
+ * Hydrates the seed registry from D1 and injects seedRegistry, getSeed, and backrefMap
4
+ * into the context. Must run AFTER repositoryMiddleware (needs seedRepository) and
5
+ * BEFORE any handler that reads the registry.
6
+ */
7
+ export declare const seedRegistryMiddleware: () => import("hono").MiddlewareHandler<{
8
+ Bindings: Env;
9
+ Variables: Variables;
10
+ }, string, {}, Response>;
@@ -0,0 +1,7 @@
1
+ import { BeechBucket } from '@beechcms/core';
2
+ import { AppEnv } from '../types';
3
+ interface StorageOverrides {
4
+ bucket?: BeechBucket;
5
+ }
6
+ export declare const storageMiddleware: (overrides?: StorageOverrides) => import("hono").MiddlewareHandler<AppEnv, string, {}, Response>;
7
+ export {};
@@ -0,0 +1,11 @@
1
+ import type { Context, Next } from 'hono';
2
+ import type { Env, Variables } from './types';
3
+ /**
4
+ * JWT authentication middleware. Reads the Bearer token from the Authorization
5
+ * header and delegates verification to the ITokenService injected in context.
6
+ * Returns 401 on any missing or invalid token; never exposes failure details.
7
+ */
8
+ export declare function authMiddleware(): (c: Context<{
9
+ Bindings: Env;
10
+ Variables: Variables;
11
+ }>, next: Next) => Promise<Response | void>;
@@ -0,0 +1,12 @@
1
+ import type { Seed } from '@beechcms/core';
2
+ export type PublicOperation = 'read' | 'add' | 'edit';
3
+ export declare function checkPublicOperation(seed: Seed, operation: PublicOperation): {
4
+ readonly ok: true;
5
+ readonly error?: undefined;
6
+ } | {
7
+ readonly ok: false;
8
+ readonly error: {
9
+ readonly error: "Forbidden";
10
+ readonly message: `Public ${string} is not allowed for content type '${string}'.`;
11
+ };
12
+ };
@@ -0,0 +1,6 @@
1
+ import type { Context, Next } from 'hono';
2
+ /**
3
+ * API key auth middleware for Public API routes.
4
+ * Uses X-API-Key header only.
5
+ */
6
+ export declare function apiKeyMiddleware(): (c: Context, next: Next) => Promise<Response | void>;
@@ -0,0 +1,10 @@
1
+ import type { Context } from 'hono';
2
+ type EdgeCache = {
3
+ cache: Cache;
4
+ executionCtx: {
5
+ waitUntil: (p: Promise<unknown>) => void;
6
+ };
7
+ } | null;
8
+ export declare function resolveEdgeCache(c: Context): EdgeCache;
9
+ export declare function withCachedResponse(edgeCache: EdgeCache, cacheKey: Request, response: Response): Response;
10
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { Seed } from '@beechcms/core';
2
+ export declare function toFlatPublicEntry(data: Record<string, unknown>, seed: Seed, fieldsParam?: string): Record<string, unknown>;
@@ -0,0 +1,9 @@
1
+ export declare function parseIdempotencyKey(rawValue: string | undefined): string | null;
2
+ type FingerprintInput = {
3
+ seedSlug: string;
4
+ statusValue: unknown;
5
+ slug: string | null;
6
+ data: Record<string, unknown>;
7
+ };
8
+ export declare function buildRequestFingerprint(input: FingerprintInput): Promise<string>;
9
+ export {};
@@ -0,0 +1,11 @@
1
+ export { apiKeyMiddleware } from './api-key-middleware';
2
+ export { publicRateLimitMiddleware } from './rate-limit-middleware';
3
+ export { publicRoutes } from './public-routes';
4
+ export { PUBLIC_ERRORS } from './public-errors';
5
+ export { sanitizePublicPayload } from './sanitize';
6
+ export { generateEntrySlug, slugify } from './slug-utils';
7
+ export { buildPublicListMeta, buildPublicSingleMeta } from './response-builder';
8
+ export { parseLatestCount, parsePublicPagination } from './query-builder';
9
+ export { publicReadHandler } from './public-read';
10
+ export { publicAddHandler } from './public-add';
11
+ export { publicEditHandler } from './public-edit';
@@ -0,0 +1,31 @@
1
+ import type { Context } from 'hono';
2
+ /**
3
+ * Returns a Problem+JSON response when the error is a SQLite FK violation,
4
+ * or null when the error is unrelated (let the caller handle it).
5
+ *
6
+ * @param c Hono context
7
+ * @param error The caught error
8
+ * @param method HTTP method of the current request (e.g. 'DELETE', 'POST')
9
+ */
10
+ export declare function fkProblemOrNull(c: Context, error: unknown, method: string): Response | null;
11
+ export interface PublicProblemDetailItem {
12
+ field: string;
13
+ expected: string;
14
+ received: string;
15
+ message: string;
16
+ }
17
+ type PublicProblemInput = {
18
+ type: string;
19
+ title: string;
20
+ status: 400 | 401 | 403 | 404 | 405 | 409 | 422 | 429 | 500 | 501;
21
+ detail: string;
22
+ errors?: PublicProblemDetailItem[];
23
+ };
24
+ export declare function internalErrorDetail(env: {
25
+ ENV?: string;
26
+ }, error: unknown): string;
27
+ /**
28
+ * Restituisce errori API in formato Problem Details (RFC 9457).
29
+ */
30
+ export declare function publicProblem(c: Context, input: PublicProblemInput): Response;
31
+ export {};
@@ -0,0 +1,3 @@
1
+ import type { Context } from 'hono';
2
+ import { AppEnv } from '../types';
3
+ export declare function publicAddHandler(context: Context<AppEnv>): Promise<Response>;
@@ -0,0 +1,5 @@
1
+ import type { Context } from 'hono';
2
+ import { AppEnv } from '../types';
3
+ type PublicCtx = Context<AppEnv>;
4
+ export declare function publicEditHandler(context: PublicCtx): Promise<Response>;
5
+ export {};
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Error constants for Public API responses.
3
+ */
4
+ export declare const PUBLIC_ERRORS: {
5
+ readonly API_KEY_UNAUTHORIZED: {
6
+ readonly error: "Unauthorized";
7
+ readonly message: "Missing or invalid API key. Provide a valid key via X-API-Key header.";
8
+ };
9
+ readonly API_KEY_FORBIDDEN: {
10
+ readonly error: "Forbidden";
11
+ readonly message: "Public API access is not configured for this instance.";
12
+ };
13
+ };
@@ -0,0 +1,3 @@
1
+ import type { Context } from 'hono';
2
+ import { AppEnv } from '../types';
3
+ export declare function publicReadHandler(context: Context<AppEnv>): Promise<Response>;
@@ -0,0 +1,3 @@
1
+ import { Hono } from 'hono';
2
+ import type { AppEnv } from '../types';
3
+ export declare const publicRoutes: Hono<AppEnv, import("hono/types").BlankSchema, "/">;
@@ -0,0 +1,28 @@
1
+ import type { Seed, FilterGroup } from '@beechcms/core';
2
+ export type PublicQueryInput = {
3
+ page?: string;
4
+ limit?: string;
5
+ latest?: string;
6
+ };
7
+ export type PublicFilterLogic = 'AND' | 'OR';
8
+ export type PublicFilterOperator = 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with' | 'is_empty' | 'is_not_empty' | 'in' | 'not_in' | 'has_tag' | 'has_any_tag' | 'has_all_tags';
9
+ export type PublicFilterCondition = {
10
+ field: string;
11
+ op: PublicFilterOperator;
12
+ value?: unknown;
13
+ };
14
+ export type ParsedPublicFilter = {
15
+ where: PublicFilterCondition[];
16
+ logic: PublicFilterLogic;
17
+ };
18
+ export declare function parsePublicFilter(raw: string | undefined): ParsedPublicFilter | null;
19
+ /**
20
+ * Trasforma il filtro pubblico in FilterGroup[] per il Repository.
21
+ * Zero SQL: la logica di generazione query risiede esclusivamente nel Repository/Engine core.
22
+ */
23
+ export declare function toEngineFilters(seed: Seed, parsedFilter: ParsedPublicFilter | null): FilterGroup[];
24
+ export declare function parsePublicPagination(input: PublicQueryInput): {
25
+ page: number;
26
+ limit: number;
27
+ };
28
+ export declare function parseLatestCount(latest: string | undefined): number;
@@ -0,0 +1,3 @@
1
+ import type { Context, Next } from 'hono';
2
+ import type { AppEnv } from '../types';
3
+ export declare function publicRateLimitMiddleware(): (c: Context<AppEnv>, next: Next) => Promise<Response | void>;
@@ -0,0 +1,26 @@
1
+ import type { Seed, ContentRepository } from '@beechcms/core';
2
+ type ReadListInput = {
3
+ seed: Seed;
4
+ seedSlug: string;
5
+ repository: ContentRepository;
6
+ query: Record<string, string | undefined>;
7
+ publishedOnly: boolean;
8
+ };
9
+ export declare function readListEntries(input: ReadListInput): Promise<{
10
+ data: Record<string, unknown>[];
11
+ meta: {
12
+ total: number;
13
+ returned: number;
14
+ seed: string;
15
+ };
16
+ } | {
17
+ data: Record<string, unknown>[];
18
+ meta: {
19
+ total: number;
20
+ page: number;
21
+ limit: number;
22
+ returned: number;
23
+ seed: string;
24
+ };
25
+ }>;
26
+ export {};
@@ -0,0 +1,22 @@
1
+ import type { Seed, ContentRepository } from '@beechcms/core';
2
+ type ReadSingleInput = {
3
+ seed: Seed;
4
+ seedSlug: string;
5
+ repository: ContentRepository;
6
+ id: string | null;
7
+ slug: string | null;
8
+ publishedOnly: boolean;
9
+ fieldsParam?: string;
10
+ };
11
+ export type ReadSingleResult = {
12
+ ok: true;
13
+ data: Record<string, unknown>;
14
+ meta: {
15
+ seed: string;
16
+ };
17
+ } | {
18
+ ok: false;
19
+ detail: string;
20
+ };
21
+ export declare function readSingleEntry(input: ReadSingleInput): Promise<ReadSingleResult>;
22
+ export {};
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Helper meta per risposta lista Public API.
3
+ */
4
+ export declare function buildPublicListMeta(input: {
5
+ total: number;
6
+ page: number;
7
+ limit: number;
8
+ returned: number;
9
+ seed: string;
10
+ }): {
11
+ total: number;
12
+ page: number;
13
+ limit: number;
14
+ returned: number;
15
+ seed: string;
16
+ };
17
+ /**
18
+ * Helper meta per risposta singolo elemento Public API.
19
+ */
20
+ export declare function buildPublicSingleMeta(seed: string): {
21
+ seed: string;
22
+ };
@@ -0,0 +1,23 @@
1
+ import type { Seed, ValidationDetail } from '@beechcms/core';
2
+ type PublicSanitizeSuccess = {
3
+ ok: true;
4
+ data: Record<string, unknown>;
5
+ };
6
+ type PublicSanitizeFailure = {
7
+ ok: false;
8
+ status: 400 | 422;
9
+ code: 'validation_failed' | 'dangerous_content';
10
+ message: string;
11
+ details?: ValidationDetail[];
12
+ };
13
+ export type PublicSanitizeResult = PublicSanitizeSuccess | PublicSanitizeFailure;
14
+ /**
15
+ * Public API Adapter: uses the core foundation and maps errors into the sprint format.
16
+ */
17
+ export declare function sanitizePublicPayload(seed: Seed, payload: Record<string, unknown>, options?: {
18
+ allowNull?: boolean;
19
+ operation?: 'create' | 'update';
20
+ requireAtLeastOneValidField?: boolean;
21
+ enforceRequiredFields?: boolean;
22
+ }): PublicSanitizeResult;
23
+ export {};
@@ -0,0 +1,11 @@
1
+ import { slugify, generateEntrySlug } from '@beechcms/core';
2
+ /**
3
+ * Converts a string into a URL-safe slug.
4
+ * Logic moved to @beechcms/core for consistency between Dashboard and API.
5
+ */
6
+ export { slugify };
7
+ /**
8
+ * Generates a slug from a title/name or a UUID-like fallback.
9
+ * Logic moved to @beechcms/core for consistency between Dashboard and API.
10
+ */
11
+ export { generateEntrySlug };
@@ -0,0 +1,6 @@
1
+ import type { IRateLimiter, RateLimitResult } from '@beechcms/core';
2
+ export declare class CloudflareRateLimiter implements IRateLimiter {
3
+ private readonly binding;
4
+ constructor(binding: RateLimit);
5
+ checkLimit(key: string): Promise<RateLimitResult>;
6
+ }
@@ -0,0 +1,7 @@
1
+ import type { IRateLimiter, RateLimitResult } from '@beechcms/core';
2
+ export declare class InMemoryRateLimiter implements IRateLimiter {
3
+ private readonly maxAllowedHits;
4
+ private readonly hitCounts;
5
+ constructor(maxAllowedHits: number);
6
+ checkLimit(key: string): Promise<RateLimitResult>;
7
+ }
@@ -0,0 +1,4 @@
1
+ import type { IRateLimiter, RateLimitResult } from '@beechcms/core';
2
+ export declare class NoOpRateLimiter implements IRateLimiter {
3
+ checkLimit(_key: string): Promise<RateLimitResult>;
4
+ }
@@ -0,0 +1,54 @@
1
+ import type { Seed, SearchResultRow } from "@beechcms/core";
2
+ export interface FtsRow {
3
+ entry_id: string;
4
+ schema_slug: string;
5
+ slug: string | null;
6
+ status: string;
7
+ title: string | null;
8
+ excerpt: string;
9
+ rank: number;
10
+ }
11
+ export interface SearchResultItem {
12
+ id: string;
13
+ schema_slug: string;
14
+ slug: string | null;
15
+ status: string;
16
+ title: string;
17
+ excerpt: string;
18
+ data: Record<string, unknown>;
19
+ }
20
+ export interface SearchResponse {
21
+ items: SearchResultItem[];
22
+ nextCursor: string | null;
23
+ total: number;
24
+ }
25
+ export interface SearchQueryParams {
26
+ q: string;
27
+ schemaSlug: string | null;
28
+ status: string | null;
29
+ limit: number;
30
+ cursor: string | null;
31
+ }
32
+ export declare function encodeCursor(rank: number, entryId: string): string;
33
+ export declare function decodeCursor(cursor: string): {
34
+ rank: number;
35
+ entryId: string;
36
+ } | null;
37
+ /**
38
+ * Builds a UNION ALL query across all per-seed fts_{slug} tables (v0.4.0).
39
+ * Each SELECT joins fts_{slug} with content_{slug} to fetch title, slug, status.
40
+ * Seeds param: full registry — filtered internally by schemaSlug and FTS availability.
41
+ */
42
+ export declare function buildFtsQuery(params: SearchQueryParams, seeds: Seed[]): {
43
+ sql: string;
44
+ binds: unknown[];
45
+ countSql: string;
46
+ countBinds: unknown[];
47
+ };
48
+ export declare function mapFtsRow(row: FtsRow): SearchResultItem;
49
+ /**
50
+ * Maps a repository-shaped SearchResultRow (camelCase) to the wire-format
51
+ * SearchResultItem returned by the /api/search route. Keeps the HTML
52
+ * stripping behaviour previously inlined inside mapFtsRow.
53
+ */
54
+ export declare function mapSearchResultRow(row: SearchResultRow): SearchResultItem;
@@ -0,0 +1,6 @@
1
+ import { Hono } from "hono";
2
+ import type { Env, Variables } from "./types";
3
+ export declare const searchRouter: Hono<{
4
+ Bindings: Env;
5
+ Variables: Variables;
6
+ }, import("hono/types").BlankSchema, "/">;
@@ -0,0 +1,10 @@
1
+ import type { Seed } from '@beechcms/core';
2
+ declare class PrivacyPolicyError extends Error {
3
+ readonly status: 501;
4
+ constructor(message: string);
5
+ }
6
+ export { PrivacyPolicyError };
7
+ /** Applica la privacy policy ai campi del payload prima della scrittura su DB. */
8
+ export declare function applyPrivacy(data: Record<string, unknown>, seed: Seed): Promise<Record<string, unknown>>;
9
+ /** Applica la visibility policy ai campi del payload in uscita verso il client. */
10
+ export declare function applyVisibility(data: Record<string, unknown>, seed: Seed): Record<string, unknown>;
@@ -0,0 +1,12 @@
1
+ import type { IAutomationRepository, Automation, AutomationTriggerEvent, CreateAutomationInput, UpdateAutomationInput } from '@beechcms/core';
2
+ export declare class D1AutomationRepository implements IAutomationRepository {
3
+ private readonly db;
4
+ constructor(db: D1Database);
5
+ findActive(seedSlug: string, event: AutomationTriggerEvent): Promise<Automation[]>;
6
+ list(seedSlug: string): Promise<Automation[]>;
7
+ findById(id: string): Promise<Automation | null>;
8
+ create(input: CreateAutomationInput): Promise<string>;
9
+ update(id: string, input: UpdateAutomationInput): Promise<void>;
10
+ toggle(id: string, enabled: boolean): Promise<void>;
11
+ delete(id: string): Promise<void>;
12
+ }
@@ -0,0 +1,18 @@
1
+ import type { INotificationService, CreateNotificationInput, INotificationRepository } from '@beechcms/core';
2
+ type ScheduleBackgroundTask = (task: Promise<unknown>) => void;
3
+ /**
4
+ * Production implementation of {@link INotificationService}.
5
+ *
6
+ * Delegates persistence to the injected {@link INotificationRepository}.
7
+ * When `scheduleBackgroundTask` is provided (wired to
8
+ * `c.executionCtx.waitUntil`), the repository write runs after the response
9
+ * is flushed so the public-API request that triggered it is never delayed.
10
+ */
11
+ export declare class BackgroundNotificationService implements INotificationService {
12
+ private readonly notificationRepository;
13
+ private readonly scheduleBackgroundTask?;
14
+ constructor(notificationRepository: INotificationRepository, scheduleBackgroundTask?: ScheduleBackgroundTask | undefined);
15
+ notify(input: CreateNotificationInput): Promise<void> | void;
16
+ private runPersist;
17
+ }
18
+ export {};
@@ -0,0 +1,18 @@
1
+ import { RepositoryError } from '@beechcms/core';
2
+ /**
3
+ * Base class for D1-backed repositories.
4
+ * Handles the D1 instance and provides common database utilities and error mapping.
5
+ */
6
+ export declare abstract class BaseD1Repository {
7
+ protected readonly database: D1Database;
8
+ constructor(database: D1Database);
9
+ /**
10
+ * Utility method to extract a table name for a given seed.
11
+ */
12
+ protected getTableName(slug: string, isDraft?: boolean): string;
13
+ /**
14
+ * Helper to map generic D1 errors to Beech RepositoryErrors.
15
+ * This centralizes error handling for all D1 repositories.
16
+ */
17
+ protected mapError(error: any, context: string): RepositoryError;
18
+ }
@@ -0,0 +1,21 @@
1
+ import type { Seed } from '@beechcms/core';
2
+ import type { ContentEntry } from './query-utils';
3
+ /** Deserializza ogni branch colonna di un DB row in formato API alias. */
4
+ export declare function rowToApiData(seed: Seed, row: Record<string, unknown>): Record<string, unknown>;
5
+ /** Converte un row della tabella content_{slug} in ContentEntry per le risposte API. */
6
+ export declare function rowToEntry(seed: Seed, row: Record<string, unknown>, hasPendingDraft?: boolean): ContentEntry;
7
+ export interface InsertBindings {
8
+ cols: string[];
9
+ placeholders: string[];
10
+ bindings: (string | number | null)[];
11
+ }
12
+ /** Costruisce colonne, placeholders e bindings per INSERT INTO content_{slug}. */
13
+ export declare function buildInsertBindings(seed: Seed, payload: Record<string, unknown>): InsertBindings;
14
+ export interface UpdateBindings {
15
+ setClause: string;
16
+ bindings: (string | number | null)[];
17
+ }
18
+ /** Costruisce SET clause e bindings per UPDATE content_{slug}. */
19
+ export declare function buildUpdateBindings(seed: Seed, payload: Record<string, unknown>): UpdateBindings;
20
+ /** Controlla se esiste un draft pendente in content_{slug}_drafts. */
21
+ export declare function hasDraft(db: D1Database, seed: Seed, entryId: string): Promise<boolean>;