@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
@@ -1,308 +0,0 @@
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 { describe, it, expect } from 'vitest'
6
- import { parseTemplateKey } from '../template-grammar'
7
- import type { ParsedKey, VarStep, InlineCondition } from '../template-grammar'
8
-
9
- describe('parseTemplateKey', () => {
10
- describe('simple keys', () => {
11
- it('returns simple for a plain field name', () => {
12
- expect(parseTemplateKey('title')).toEqual<ParsedKey>({ kind: 'simple', path: 'title' })
13
- })
14
-
15
- it('returns simple for a dot-path', () => {
16
- expect(parseTemplateKey('author.name')).toEqual<ParsedKey>({ kind: 'simple', path: 'author.name' })
17
- })
18
-
19
- it('returns simple for _count (legacy)', () => {
20
- expect(parseTemplateKey('_count')).toEqual<ParsedKey>({ kind: 'simple', path: '_count' })
21
- })
22
-
23
- it('returns null for empty string', () => {
24
- expect(parseTemplateKey('')).toBeNull()
25
- })
26
- })
27
-
28
- describe('two-token sugar: <scope>:<field>', () => {
29
- it('defaults to lastone selector for <seedSlug>:<field>', () => {
30
- expect(parseTemplateKey('customers:email')).toEqual<ParsedKey>({
31
- kind: 'scoped',
32
- scope: 'customers',
33
- selector: { kind: 'lastone' },
34
- op: 'field',
35
- field: 'email',
36
- })
37
- })
38
-
39
- it('defaults to lastone selector for this:<field>', () => {
40
- expect(parseTemplateKey('this:email')).toEqual<ParsedKey>({
41
- kind: 'scoped',
42
- scope: 'this',
43
- selector: { kind: 'lastone' },
44
- op: 'field',
45
- field: 'email',
46
- })
47
- })
48
-
49
- it('sugar: batch:count → batch:all:count', () => {
50
- expect(parseTemplateKey('batch:count')).toEqual<ParsedKey>({
51
- kind: 'scoped',
52
- scope: 'batch',
53
- selector: { kind: 'all' },
54
- op: 'count',
55
- field: null,
56
- })
57
- })
58
-
59
- it('sugar: customers:sum → customers:all:sum (aggregate sugar without subfield)', () => {
60
- const result = parseTemplateKey('customers:sum')
61
- expect(result).toMatchObject({ kind: 'scoped', scope: 'customers', selector: { kind: 'all' }, op: 'sum' })
62
- })
63
- })
64
-
65
- describe('three-token: <scope>:<selector>:<field>', () => {
66
- it('lastone selector', () => {
67
- expect(parseTemplateKey('customers:lastone:email')).toEqual<ParsedKey>({
68
- kind: 'scoped',
69
- scope: 'customers',
70
- selector: { kind: 'lastone' },
71
- op: 'field',
72
- field: 'email',
73
- })
74
- })
75
-
76
- it('firstone selector', () => {
77
- expect(parseTemplateKey('customers:firstone:name')).toEqual<ParsedKey>({
78
- kind: 'scoped',
79
- scope: 'customers',
80
- selector: { kind: 'firstone' },
81
- op: 'field',
82
- field: 'name',
83
- })
84
- })
85
-
86
- it('byid selector', () => {
87
- expect(parseTemplateKey('customers:byid(c_42):name')).toEqual<ParsedKey>({
88
- kind: 'scoped',
89
- scope: 'customers',
90
- selector: { kind: 'byid', id: 'c_42' },
91
- op: 'field',
92
- field: 'name',
93
- })
94
- })
95
-
96
- it('where selector', () => {
97
- expect(parseTemplateKey('orders:where(status=paid):total')).toEqual<ParsedKey>({
98
- kind: 'scoped',
99
- scope: 'orders',
100
- selector: { kind: 'where', alias: 'status', value: 'paid' },
101
- op: 'field',
102
- field: 'total',
103
- })
104
- })
105
-
106
- it('all:count aggregate', () => {
107
- expect(parseTemplateKey('orders:all:count')).toEqual<ParsedKey>({
108
- kind: 'scoped',
109
- scope: 'orders',
110
- selector: { kind: 'all' },
111
- op: 'count',
112
- field: null,
113
- })
114
- })
115
-
116
- it('all:sum:<subfield> aggregate', () => {
117
- expect(parseTemplateKey('orders:all:sum:total')).toEqual<ParsedKey>({
118
- kind: 'scoped',
119
- scope: 'orders',
120
- selector: { kind: 'all' },
121
- op: 'sum',
122
- field: 'total',
123
- })
124
- })
125
-
126
- it('all:avg aggregate', () => {
127
- expect(parseTemplateKey('orders:all:avg:amount')).toMatchObject({
128
- kind: 'scoped', scope: 'orders', op: 'avg', field: 'amount',
129
- })
130
- })
131
-
132
- it('all:min aggregate', () => {
133
- expect(parseTemplateKey('orders:all:min:price')).toMatchObject({
134
- kind: 'scoped', scope: 'orders', op: 'min', field: 'price',
135
- })
136
- })
137
-
138
- it('all:max aggregate', () => {
139
- expect(parseTemplateKey('orders:all:max:score')).toMatchObject({
140
- kind: 'scoped', scope: 'orders', op: 'max', field: 'score',
141
- })
142
- })
143
-
144
- it('all:pluck:<subfield> aggregate', () => {
145
- expect(parseTemplateKey('customers:all:pluck:email')).toEqual<ParsedKey>({
146
- kind: 'scoped',
147
- scope: 'customers',
148
- selector: { kind: 'all' },
149
- op: 'pluck',
150
- field: 'email',
151
- })
152
- })
153
-
154
- it('batch:all:count', () => {
155
- expect(parseTemplateKey('batch:all:count')).toEqual<ParsedKey>({
156
- kind: 'scoped',
157
- scope: 'batch',
158
- selector: { kind: 'all' },
159
- op: 'count',
160
- field: null,
161
- })
162
- })
163
-
164
- it('batch:all:pluck:email', () => {
165
- expect(parseTemplateKey('batch:all:pluck:email')).toMatchObject({
166
- kind: 'scoped', scope: 'batch', op: 'pluck', field: 'email',
167
- })
168
- })
169
- })
170
-
171
- describe('rejection rules', () => {
172
- it('returns null when aggregate used without all selector', () => {
173
- expect(parseTemplateKey('orders:lastone:sum')).toBeNull()
174
- })
175
-
176
- it('returns null when selector token is unrecognised', () => {
177
- expect(parseTemplateKey('orders:unknown:field')).toBeNull()
178
- })
179
-
180
- it('returns null when there are no field tokens after selector', () => {
181
- expect(parseTemplateKey('orders:lastone')).toEqual<ParsedKey>({
182
- kind: 'scoped',
183
- scope: 'orders',
184
- selector: { kind: 'lastone' },
185
- op: 'field',
186
- field: 'lastone',
187
- })
188
- })
189
-
190
- it('colons inside parens do not split tokens', () => {
191
- const result = parseTemplateKey('customers:byid(ns:id-123):name')
192
- expect(result).toMatchObject({
193
- kind: 'scoped',
194
- scope: 'customers',
195
- selector: { kind: 'byid', id: 'ns:id-123' },
196
- op: 'field',
197
- field: 'name',
198
- })
199
- })
200
- })
201
-
202
- describe('scoped with this scope', () => {
203
- it('this:lastone:field', () => {
204
- expect(parseTemplateKey('this:lastone:name')).toMatchObject({
205
- kind: 'scoped', scope: 'this', selector: { kind: 'lastone' }, op: 'field', field: 'name',
206
- })
207
- })
208
- })
209
- })
210
-
211
- // ── Sprint 07 var_access cases ─────────────────────────────────────────────────
212
-
213
- describe('parseTemplateKey — var_access (Sprint 07)', () => {
214
- it('1 — ordini.array[a,b].count → var_access with array + agg:count', () => {
215
- const result = parseTemplateKey('ordini.array[a,b].count')
216
- expect(result).toEqual<ParsedKey>({
217
- kind: 'var_access',
218
- name: 'ordini',
219
- steps: [
220
- { type: 'array', ids: ['a', 'b'] },
221
- { type: 'agg', op: 'count' },
222
- ],
223
- conditions: [],
224
- })
225
- })
226
-
227
- it('2 — ordini.count.(status=paid) → var_access with agg:count + condition', () => {
228
- const result = parseTemplateKey('ordini.count.(status=paid)')
229
- expect(result).toEqual<ParsedKey>({
230
- kind: 'var_access',
231
- name: 'ordini',
232
- steps: [{ type: 'agg', op: 'count' }],
233
- conditions: [{ column: 'status', op: '=', value: 'paid' }],
234
- })
235
- })
236
-
237
- it('3 — ordini.sum.total.(amount>100) → var_access with agg:sum:total + condition', () => {
238
- const result = parseTemplateKey('ordini.sum.total.(amount>100)')
239
- expect(result).toEqual<ParsedKey>({
240
- kind: 'var_access',
241
- name: 'ordini',
242
- steps: [{ type: 'agg', op: 'sum', field: 'total' }],
243
- conditions: [{ column: 'amount', op: '>', value: '100' }],
244
- })
245
- })
246
-
247
- it('4 — ordini.firstone.id.(status=paid) → nav + field + condition', () => {
248
- const result = parseTemplateKey('ordini.firstone.id.(status=paid)')
249
- expect(result).toEqual<ParsedKey>({
250
- kind: 'var_access',
251
- name: 'ordini',
252
- steps: [
253
- { type: 'nav', nav: 'firstone' },
254
- { type: 'field', name: 'id' },
255
- ],
256
- conditions: [{ column: 'status', op: '=', value: 'paid' }],
257
- })
258
- })
259
-
260
- it('5 — ordini.array[a,b].(status=paid).count → array + condition + agg', () => {
261
- const result = parseTemplateKey('ordini.array[a,b].(status=paid).count')
262
- expect(result).toMatchObject({
263
- kind: 'var_access',
264
- name: 'ordini',
265
- steps: [
266
- { type: 'array', ids: ['a', 'b'] },
267
- { type: 'agg', op: 'count' },
268
- ],
269
- conditions: [{ column: 'status', op: '=', value: 'paid' }],
270
- })
271
- })
272
-
273
- it('6 — cliente.email → falls through to simple (fast path)', () => {
274
- const result = parseTemplateKey('cliente.email')
275
- expect(result).toEqual<ParsedKey>({ kind: 'simple', path: 'cliente.email' })
276
- })
277
-
278
- it('handles multiple inline conditions (AND-chained)', () => {
279
- const result = parseTemplateKey('ordini.count.(status=paid).(amount>10)')
280
- expect(result).toMatchObject({
281
- kind: 'var_access',
282
- conditions: [
283
- { column: 'status', op: '=', value: 'paid' },
284
- { column: 'amount', op: '>', value: '10' },
285
- ],
286
- })
287
- })
288
-
289
- it('handles != operator', () => {
290
- const result = parseTemplateKey('ordini.count.(status!=draft)')
291
- expect(result).toMatchObject({
292
- kind: 'var_access',
293
- conditions: [{ column: 'status', op: '!=', value: 'draft' }],
294
- })
295
- })
296
-
297
- it('handles <= and >= operators', () => {
298
- const r1 = parseTemplateKey('ordini.count.(amount<=100)')
299
- const r2 = parseTemplateKey('ordini.count.(amount>=50)')
300
- expect(r1).toMatchObject({ conditions: [{ op: '<=' }] })
301
- expect(r2).toMatchObject({ conditions: [{ op: '>=' }] })
302
- })
303
-
304
- it('plain dot-path without special chars stays simple', () => {
305
- expect(parseTemplateKey('ordini.count')).toEqual({ kind: 'simple', path: 'ordini.count' })
306
- expect(parseTemplateKey('cliente.nome')).toEqual({ kind: 'simple', path: 'cliente.nome' })
307
- })
308
- })
@@ -1,142 +0,0 @@
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 { describe, it, expect, vi, beforeEach } from 'vitest'
6
- import { executeWebhook } from '../action-executors/webhook.executor'
7
- import type { ResolvedContext } from '../context-resolver'
8
-
9
- function makeContext(entry: Record<string, unknown> = {}, event = 'create'): ResolvedContext {
10
- return {
11
- triggerEntry: entry,
12
- lookup(parsed) {
13
- if (parsed.kind === 'simple') {
14
- const key = parsed.path.startsWith('this.') ? parsed.path.slice(5) : parsed.path
15
- if (key === 'trigger_event') return event
16
- return entry[key] ?? null
17
- }
18
- return null
19
- },
20
- }
21
- }
22
-
23
- const baseContext = makeContext({ id: 'entry-1', title: 'Hello' })
24
-
25
- const baseAction = {
26
- type: 'webhook' as const,
27
- url: 'https://example.com/hook',
28
- body_template: '{"static":true}',
29
- }
30
-
31
- function makeOkResponse(status = 200): Response {
32
- return { ok: true, status } as unknown as Response
33
- }
34
-
35
- function makeErrorResponse(status: number): Response {
36
- return { ok: false, status } as unknown as Response
37
- }
38
-
39
- beforeEach(() => {
40
- vi.restoreAllMocks()
41
- })
42
-
43
- describe('executeWebhook', () => {
44
- it('signs request when WEBHOOK_SECRET is set', async () => {
45
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(makeOkResponse())
46
-
47
- await executeWebhook(baseAction, baseContext, { WEBHOOK_SECRET: 'test-secret' })
48
-
49
- expect(fetchSpy).toHaveBeenCalledOnce()
50
- const [, init] = fetchSpy.mock.calls[0]
51
- const headers = init?.headers as Record<string, string>
52
- expect(headers['X-BeechCMS-Signature']).toMatch(/^sha256=[0-9a-f]{64}$/)
53
- })
54
-
55
- it('omits signature header and warns once when WEBHOOK_SECRET is absent', async () => {
56
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(makeOkResponse())
57
- const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {})
58
-
59
- await executeWebhook(baseAction, baseContext, {})
60
- await executeWebhook(baseAction, baseContext, {})
61
-
62
- const [, init] = fetchSpy.mock.calls[0]
63
- const headers = init?.headers as Record<string, string>
64
- expect(headers['X-BeechCMS-Signature']).toBeUndefined()
65
- expect(warnSpy).toHaveBeenCalledOnce()
66
- expect(warnSpy.mock.calls[0][0]).toContain('WEBHOOK_SECRET')
67
- })
68
-
69
- it('overwrites user-supplied X-BeechCMS-Signature header with computed value', async () => {
70
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(makeOkResponse())
71
-
72
- const action = {
73
- ...baseAction,
74
- headers: { 'X-BeechCMS-Signature': 'sha256=user-supplied-value' },
75
- }
76
-
77
- await executeWebhook(action, baseContext, { WEBHOOK_SECRET: 'test-secret' })
78
-
79
- const [, init] = fetchSpy.mock.calls[0]
80
- const headers = init?.headers as Record<string, string>
81
- expect(headers['X-BeechCMS-Signature']).toMatch(/^sha256=[0-9a-f]{64}$/)
82
- expect(headers['X-BeechCMS-Signature']).not.toBe('sha256=user-supplied-value')
83
- })
84
-
85
- it('throws with status code when endpoint responds with 500', async () => {
86
- vi.spyOn(globalThis, 'fetch').mockResolvedValue(makeErrorResponse(500))
87
-
88
- await expect(executeWebhook(baseAction, baseContext, {}))
89
- .rejects.toThrow('500')
90
- })
91
-
92
- it('interpolates body_template placeholders before sending', async () => {
93
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(makeOkResponse())
94
-
95
- const action = { ...baseAction, body_template: '{"event":"{{trigger_event}}","id":"{{id}}"}' }
96
- const ctx = makeContext({ id: 'abc-123' }, 'update')
97
-
98
- await executeWebhook(action, ctx, {})
99
-
100
- const [, init] = fetchSpy.mock.calls[0]
101
- const body = init?.body as string
102
- expect(body).toContain('abc-123')
103
- expect(body).toContain('update')
104
- })
105
-
106
- it('recalculates HMAC and matches X-BeechCMS-Signature header', async () => {
107
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(makeOkResponse())
108
- const secret = 'verify-secret'
109
-
110
- await executeWebhook(baseAction, baseContext, { WEBHOOK_SECRET: secret })
111
-
112
- const [, init] = fetchSpy.mock.calls[0]
113
- const headers = init?.headers as Record<string, string>
114
- const sentBody = init?.body as string
115
- const sentSig = headers['X-BeechCMS-Signature']
116
-
117
- const encoder = new TextEncoder()
118
- const key = await crypto.subtle.importKey(
119
- 'raw',
120
- encoder.encode(secret),
121
- { name: 'HMAC', hash: 'SHA-256' },
122
- false,
123
- ['sign'],
124
- )
125
- const sig = await crypto.subtle.sign('HMAC', key, encoder.encode(sentBody))
126
- const expected = 'sha256=' + Array.from(new Uint8Array(sig))
127
- .map((b) => b.toString(16).padStart(2, '0'))
128
- .join('')
129
-
130
- expect(sentSig).toBe(expected)
131
- })
132
-
133
- it('throws timeout error when fetch takes longer than 8 seconds', async () => {
134
- vi.spyOn(globalThis, 'fetch').mockImplementation(() => {
135
- const err = new DOMException('The operation was aborted.', 'TimeoutError')
136
- return Promise.reject(err)
137
- })
138
-
139
- await expect(executeWebhook(baseAction, baseContext, {}))
140
- .rejects.toThrow('timed out after 8000ms')
141
- })
142
- })