@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.
- package/README.md +4 -4
- package/assets/dashboard/assets/chart-Cws4Yj6K.js +39 -0
- package/assets/dashboard/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/assets/dashboard/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/assets/dashboard/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/assets/dashboard/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/assets/dashboard/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/assets/dashboard/assets/index-BjPpppHe.css +1 -0
- package/assets/dashboard/assets/index-CrW-zhkA.js +642 -0
- package/assets/dashboard/assets/lora-cyrillic-ext-wght-normal-YcVxMP-u.woff2 +0 -0
- package/assets/dashboard/assets/lora-cyrillic-wght-normal-UWPuZLjM.woff2 +0 -0
- package/assets/dashboard/assets/lora-latin-ext-wght-normal-C2Wlntb9.woff2 +0 -0
- package/assets/dashboard/assets/lora-latin-wght-normal-BiLcIKcI.woff2 +0 -0
- package/assets/dashboard/assets/lora-math-wght-normal-sOy7rEfW.woff2 +0 -0
- package/assets/dashboard/assets/lora-symbols-wght-normal-DQ5VrUkH.woff2 +0 -0
- package/assets/dashboard/assets/lora-vietnamese-wght-normal-CfJ7gtf3.woff2 +0 -0
- package/assets/dashboard/assets/pie-chart-recharts-CAxoDQp2.js +1 -0
- package/assets/dashboard/assets/timeseries-chart-recharts-CixDW-LM.js +1 -0
- package/assets/dashboard/index.html +2 -2
- package/dist/auth/__fixtures__/in-memory-hash-provider.d.ts +5 -0
- package/dist/auth/__fixtures__/static-token-service.d.ts +6 -0
- package/dist/auth/bcrypt-hash-provider.d.ts +8 -0
- package/dist/auth/constants.d.ts +10 -0
- package/dist/auth/jose-token-service.d.ts +14 -0
- package/dist/auth/login.d.ts +32 -0
- package/dist/auth/refresh.d.ts +1 -0
- package/dist/factory.d.ts +39 -0
- package/dist/features/automations/action-executors/create-entry.executor.d.ts +7 -0
- package/dist/features/automations/action-executors/edit-field.executor.d.ts +7 -0
- package/dist/features/automations/action-executors/index.d.ts +13 -0
- package/dist/features/automations/action-executors/send-mail.executor.d.ts +7 -0
- package/dist/features/automations/action-executors/set-variable.executor.d.ts +15 -0
- package/dist/features/automations/action-executors/webhook.executor.d.ts +7 -0
- package/dist/features/automations/automation-runner.d.ts +13 -0
- package/dist/features/automations/automation-runner.utils.d.ts +3 -0
- package/dist/features/automations/automations.handler.d.ts +7 -0
- package/dist/features/automations/automations.schema.d.ts +191 -0
- package/dist/features/automations/context-resolver.d.ts +8 -0
- package/dist/features/automations/cron-runner.d.ts +9 -0
- package/dist/features/automations/cron-runner.utils.d.ts +1 -0
- package/dist/features/automations/filter-translation.d.ts +9 -0
- package/dist/features/automations/index.d.ts +7 -0
- package/dist/features/automations/template-grammar.d.ts +73 -0
- package/dist/features/automations/var-access-resolver.d.ts +6 -0
- package/dist/features/automations/when-evaluator.d.ts +3 -0
- package/dist/features/automations/when-pushdown.d.ts +2 -0
- package/dist/features/backrefs/backrefs.handler.d.ts +3 -0
- package/dist/features/backrefs/d1-backref.repository.d.ts +17 -0
- package/dist/features/backrefs/index.d.ts +1 -0
- package/dist/features/content/constants.d.ts +12 -0
- package/dist/features/content/handlers/bulk.handler.d.ts +3 -0
- package/dist/features/content/handlers/create.d.ts +3 -0
- package/dist/features/content/handlers/delete.d.ts +3 -0
- package/dist/features/content/handlers/facets.d.ts +3 -0
- package/dist/features/content/handlers/get.d.ts +4 -0
- package/dist/features/content/handlers/helpers.d.ts +12 -0
- package/dist/features/content/handlers/list.d.ts +3 -0
- package/dist/features/content/handlers/update.d.ts +3 -0
- package/dist/features/content/index.d.ts +4 -0
- package/dist/features/dashboard-layout/dashboard-layout.handler.d.ts +7 -0
- package/dist/features/dashboard-layout/index.d.ts +1 -0
- package/dist/features/draft/draft.handler.d.ts +4 -0
- package/dist/features/draft/draft.middleware.d.ts +9 -0
- package/dist/features/draft/index.d.ts +1 -0
- package/{src/features/email/email.provider.ts → dist/features/email/email.provider.d.ts} +19 -24
- package/dist/features/email/email.service.d.ts +13 -0
- package/dist/features/email/email.types.d.ts +94 -0
- package/{src/features/email/index.ts → dist/features/email/index.d.ts} +3 -16
- package/dist/features/email/providers/resend.d.ts +36 -0
- package/dist/features/email/providers/smtp.d.ts +11 -0
- package/dist/features/email/templates/automation-mail.d.ts +8 -0
- package/dist/features/email/templates/password-changed.d.ts +15 -0
- package/dist/features/email/templates/password-reset.d.ts +18 -0
- package/dist/features/email/templates/shell.d.ts +58 -0
- package/dist/features/notifications/index.d.ts +1 -0
- package/dist/features/notifications/notifications.handler.d.ts +15 -0
- package/dist/features/password-reset/index.d.ts +6 -0
- package/dist/features/password-reset/request.d.ts +10 -0
- package/dist/features/password-reset/reset.d.ts +9 -0
- package/dist/features/rotate-field/index.d.ts +1 -0
- package/dist/features/rotate-field/rotate-field.handler.d.ts +7 -0
- package/dist/features/rotate-field/rotate-field.schema.d.ts +11 -0
- package/dist/features/schema/schema.handler.d.ts +7 -0
- package/dist/features/seeds/index.d.ts +1 -0
- package/dist/features/seeds/seeds.handler.d.ts +6 -0
- package/dist/features/settings/settings.handler.d.ts +7 -0
- package/dist/features/setup/index.d.ts +7 -0
- package/dist/features/stats/index.d.ts +1 -0
- package/dist/features/stats/stats.handler.d.ts +7 -0
- package/dist/features/webhooks/index.d.ts +3 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +9666 -0
- package/dist/media-utils.d.ts +25 -0
- package/dist/middleware/auth-providers.middleware.d.ts +8 -0
- package/dist/middleware/observability.middleware.d.ts +20 -0
- package/dist/middleware/rate-limit.middleware.d.ts +9 -0
- package/dist/middleware/repository.middleware.d.ts +34 -0
- package/dist/middleware/seed-registry.middleware.d.ts +10 -0
- package/dist/middleware/storage.middleware.d.ts +7 -0
- package/dist/middleware.d.ts +11 -0
- package/dist/public/access-policy.d.ts +12 -0
- package/dist/public/api-key-middleware.d.ts +6 -0
- package/dist/public/cache-utils.d.ts +10 -0
- package/dist/public/entry-projection.d.ts +2 -0
- package/dist/public/idempotency.d.ts +9 -0
- package/dist/public/index.d.ts +11 -0
- package/dist/public/problem-details.d.ts +31 -0
- package/dist/public/public-add.d.ts +3 -0
- package/dist/public/public-edit.d.ts +5 -0
- package/dist/public/public-errors.d.ts +13 -0
- package/dist/public/public-read.d.ts +3 -0
- package/dist/public/public-routes.d.ts +3 -0
- package/dist/public/query-builder.d.ts +28 -0
- package/dist/public/rate-limit-middleware.d.ts +3 -0
- package/dist/public/read-list.d.ts +26 -0
- package/dist/public/read-single.d.ts +22 -0
- package/dist/public/response-builder.d.ts +22 -0
- package/dist/public/sanitize.d.ts +23 -0
- package/{src/public/slug-utils.ts → dist/public/slug-utils.d.ts} +3 -10
- package/dist/rate-limit/cloudflare-rate-limiter.d.ts +6 -0
- package/dist/rate-limit/in-memory-rate-limiter.d.ts +7 -0
- package/dist/rate-limit/no-op-rate-limiter.d.ts +4 -0
- package/dist/search-utils.d.ts +54 -0
- package/dist/search.d.ts +6 -0
- package/dist/shared/apply-policies.d.ts +10 -0
- package/dist/shared/automations.repository.d1.d.ts +12 -0
- package/dist/shared/background-notification-service.d.ts +18 -0
- package/dist/shared/base.repository.d1.d.ts +18 -0
- package/dist/shared/content-utils.d.ts +21 -0
- package/dist/shared/content.repository.d1.d.ts +68 -0
- package/dist/shared/d1-activity-log.repository.d.ts +13 -0
- package/dist/shared/d1-activity-logger.d.ts +20 -0
- package/dist/shared/d1-analytics.repository.d.ts +20 -0
- package/dist/shared/d1-content-scan.repository.d.ts +7 -0
- package/dist/shared/d1-notification.repository.d.ts +17 -0
- package/dist/shared/d1-password-reset-token.repository.d.ts +10 -0
- package/dist/shared/d1-search.repository.d.ts +14 -0
- package/dist/shared/d1-session.repository.d.ts +12 -0
- package/dist/shared/d1-setup-checklist.repository.d.ts +12 -0
- package/dist/shared/d1-user.repository.d.ts +18 -0
- package/dist/shared/d1-widget.repository.d.ts +31 -0
- package/dist/shared/dashboard-layout.repository.d1.d.ts +9 -0
- package/dist/shared/demo-data-sql.d.ts +1 -0
- package/dist/shared/demo-data.repository.d1.d.ts +6 -0
- package/dist/shared/execution-context-scheduler.d.ts +6 -0
- package/dist/shared/fixed-clock.d.ts +13 -0
- package/dist/shared/fts-sync.d.ts +1 -0
- package/dist/shared/idempotency.repository.d1.d.ts +16 -0
- package/dist/shared/in-memory-activity-logger.d.ts +11 -0
- package/dist/shared/in-memory-notification-service.d.ts +11 -0
- package/dist/shared/in-memory-seed.repository.d.ts +18 -0
- package/dist/shared/media.repository.d1.d.ts +35 -0
- package/dist/shared/qstash-notification-service.d.ts +18 -0
- package/dist/shared/query-utils.d.ts +36 -0
- package/dist/shared/request-utils.d.ts +13 -0
- package/dist/shared/schema-mutator.d1.d.ts +12 -0
- package/dist/shared/seed-layout.repository.d1.d.ts +9 -0
- package/dist/shared/seed-registry-cache.d.ts +12 -0
- package/dist/shared/seed.repository.d1.d.ts +13 -0
- package/dist/shared/sequential-id-generator.d.ts +13 -0
- package/dist/shared/site-settings.repository.d1.d.ts +7 -0
- package/dist/shared/storage/factory.d.ts +8 -0
- package/dist/shared/storage/s3-bucket.d.ts +43 -0
- package/dist/shared/storage-utils.d.ts +7 -0
- package/dist/shared/system-stats.repository.d1.d.ts +25 -0
- package/dist/types.d.ts +85 -0
- package/dist/upload.d.ts +16 -0
- package/dist/widget.d.ts +7 -0
- package/package.json +27 -18
- package/assets/dashboard/assets/chart-BrJFdsGZ.js +0 -39
- package/assets/dashboard/assets/index-CIaoMxuB.css +0 -1
- package/assets/dashboard/assets/index-wTKgygsg.js +0 -636
- package/assets/dashboard/assets/pie-chart-recharts-BEaE1FOE.js +0 -1
- package/assets/dashboard/assets/timeseries-chart-recharts-DmWM6imF.js +0 -1
- package/src/auth/__fixtures__/in-memory-hash-provider.ts +0 -17
- package/src/auth/__fixtures__/static-token-service.ts +0 -22
- package/src/auth/bcrypt-hash-provider.ts +0 -24
- package/src/auth/constants.ts +0 -14
- package/src/auth/generate-refresh-token.test.ts +0 -23
- package/src/auth/hash-provider.test.ts +0 -55
- package/src/auth/jose-token-service.ts +0 -62
- package/src/auth/jwt-claims-passthrough.test.ts +0 -87
- package/src/auth/login.test.ts +0 -100
- package/src/auth/login.ts +0 -78
- package/src/auth/refresh.ts +0 -11
- package/src/auth/token-service.test.ts +0 -90
- package/src/factory.ts +0 -370
- package/src/features/automations/__tests__/action-executors.test.ts +0 -255
- package/src/features/automations/__tests__/automation-runner.test.ts +0 -196
- package/src/features/automations/__tests__/automation-runner.utils.test.ts +0 -60
- package/src/features/automations/__tests__/automations.handler.test.ts +0 -264
- package/src/features/automations/__tests__/automations.repository.test.ts +0 -163
- package/src/features/automations/__tests__/automations.schema.test.ts +0 -224
- package/src/features/automations/__tests__/context-resolver.test.ts +0 -126
- package/src/features/automations/__tests__/cron-runner.test.ts +0 -267
- package/src/features/automations/__tests__/cron-runner.utils.test.ts +0 -144
- package/src/features/automations/__tests__/set-variable.executor.test.ts +0 -383
- package/src/features/automations/__tests__/template-grammar.test.ts +0 -308
- package/src/features/automations/__tests__/webhook.executor.test.ts +0 -142
- package/src/features/automations/__tests__/when-evaluator.test.ts +0 -274
- package/src/features/automations/__tests__/when-pushdown.test.ts +0 -281
- package/src/features/automations/action-executors/create-entry.executor.ts +0 -27
- package/src/features/automations/action-executors/edit-field.executor.ts +0 -26
- package/src/features/automations/action-executors/index.ts +0 -37
- package/src/features/automations/action-executors/send-mail.executor.ts +0 -53
- package/src/features/automations/action-executors/set-variable.executor.ts +0 -159
- package/src/features/automations/action-executors/webhook.executor.ts +0 -67
- package/src/features/automations/automation-runner.ts +0 -85
- package/src/features/automations/automation-runner.utils.ts +0 -47
- package/src/features/automations/automations.handler.ts +0 -197
- package/src/features/automations/automations.schema.ts +0 -177
- package/src/features/automations/context-resolver.ts +0 -152
- package/src/features/automations/cron-runner.ts +0 -140
- package/src/features/automations/cron-runner.utils.ts +0 -44
- package/src/features/automations/filter-translation.ts +0 -46
- package/src/features/automations/index.ts +0 -16
- package/src/features/automations/template-grammar.ts +0 -245
- package/src/features/automations/var-access-resolver.ts +0 -140
- package/src/features/automations/when-evaluator.ts +0 -87
- package/src/features/automations/when-pushdown.ts +0 -57
- package/src/features/backrefs/__tests__/backrefs.handler.test.ts +0 -359
- package/src/features/backrefs/backrefs.handler.ts +0 -168
- package/src/features/backrefs/d1-backref.repository.ts +0 -84
- package/src/features/backrefs/index.ts +0 -5
- package/src/features/content/constants.ts +0 -16
- package/src/features/content/handlers/bulk.handler.ts +0 -185
- package/src/features/content/handlers/create.ts +0 -129
- package/src/features/content/handlers/delete.ts +0 -62
- package/src/features/content/handlers/facets.ts +0 -49
- package/src/features/content/handlers/get.ts +0 -120
- package/src/features/content/handlers/helpers.test.ts +0 -180
- package/src/features/content/handlers/helpers.ts +0 -93
- package/src/features/content/handlers/list.ts +0 -174
- package/src/features/content/handlers/update.ts +0 -174
- package/src/features/content/index.ts +0 -26
- package/src/features/dashboard-layout/__tests__/dashboard-layout.handler.test.ts +0 -388
- package/src/features/dashboard-layout/dashboard-layout.handler.ts +0 -206
- package/src/features/dashboard-layout/index.ts +0 -5
- package/src/features/draft/draft.handler.ts +0 -195
- package/src/features/draft/draft.middleware.ts +0 -66
- package/src/features/draft/index.ts +0 -5
- package/src/features/email/email.service.ts +0 -98
- package/src/features/email/email.types.ts +0 -119
- package/src/features/email/providers/resend.ts +0 -67
- package/src/features/email/providers/smtp.ts +0 -55
- package/src/features/email/templates/automation-mail.ts +0 -19
- package/src/features/email/templates/password-changed.ts +0 -63
- package/src/features/email/templates/password-reset.ts +0 -68
- package/src/features/email/templates/shell.ts +0 -96
- package/src/features/notifications/index.ts +0 -5
- package/src/features/notifications/notifications.handler.ts +0 -105
- package/src/features/password-reset/index.ts +0 -19
- package/src/features/password-reset/request.ts +0 -92
- package/src/features/password-reset/reset.ts +0 -102
- package/src/features/rotate-field/index.ts +0 -5
- package/src/features/rotate-field/rotate-field.handler.ts +0 -132
- package/src/features/rotate-field/rotate-field.schema.ts +0 -17
- package/src/features/schema/schema.handler.ts +0 -131
- package/src/features/seeds/index.ts +0 -5
- package/src/features/seeds/seeds.handler.test.ts +0 -1199
- package/src/features/seeds/seeds.handler.ts +0 -558
- package/src/features/settings/__tests__/settings.handler.test.ts +0 -555
- package/src/features/settings/settings.handler.ts +0 -392
- package/src/features/setup/index.ts +0 -288
- package/src/features/stats/index.ts +0 -5
- package/src/features/stats/stats.handler.ts +0 -420
- package/src/features/webhooks/index.ts +0 -63
- package/src/index.ts +0 -65
- package/src/media-utils.ts +0 -82
- package/src/middleware/auth-providers.middleware.test.ts +0 -85
- package/src/middleware/auth-providers.middleware.ts +0 -45
- package/src/middleware/observability.middleware.test.ts +0 -93
- package/src/middleware/observability.middleware.ts +0 -70
- package/src/middleware/rate-limit.middleware.ts +0 -45
- package/src/middleware/repository.middleware.ts +0 -117
- package/src/middleware/seed-registry.middleware.test.ts +0 -97
- package/src/middleware/seed-registry.middleware.ts +0 -21
- package/src/middleware/storage.middleware.ts +0 -25
- package/src/middleware.ts +0 -45
- package/src/public/access-policy.ts +0 -27
- package/src/public/api-key-middleware.ts +0 -57
- package/src/public/cache-utils.ts +0 -38
- package/src/public/entry-projection.ts +0 -46
- package/src/public/idempotency.ts +0 -23
- package/src/public/index.ts +0 -16
- package/src/public/problem-details.ts +0 -124
- package/src/public/public-add.ts +0 -114
- package/src/public/public-edit.ts +0 -163
- package/src/public/public-errors.ts +0 -19
- package/src/public/public-read.ts +0 -63
- package/src/public/public-routes.ts +0 -88
- package/src/public/query-builder.test.ts +0 -224
- package/src/public/query-builder.ts +0 -156
- package/src/public/rate-limit-middleware.ts +0 -34
- package/src/public/read-list.ts +0 -54
- package/src/public/read-single.ts +0 -48
- package/src/public/response-builder.ts +0 -30
- package/src/public/sanitize.ts +0 -69
- package/src/rate-limit/cloudflare-rate-limiter.test.ts +0 -30
- package/src/rate-limit/cloudflare-rate-limiter.ts +0 -15
- package/src/rate-limit/in-memory-rate-limiter.test.ts +0 -37
- package/src/rate-limit/in-memory-rate-limiter.ts +0 -17
- package/src/rate-limit/no-op-rate-limiter.test.ts +0 -22
- package/src/rate-limit/no-op-rate-limiter.ts +0 -11
- package/src/search-utils.test.ts +0 -211
- package/src/search-utils.ts +0 -213
- package/src/search.ts +0 -65
- package/src/shared/apply-policies.test.ts +0 -81
- package/src/shared/apply-policies.ts +0 -67
- package/src/shared/automations.repository.d1.ts +0 -150
- package/src/shared/background-notification-service.test.ts +0 -62
- package/src/shared/background-notification-service.ts +0 -52
- package/src/shared/base.repository.d1.ts +0 -32
- package/src/shared/content-utils.test.ts +0 -165
- package/src/shared/content-utils.ts +0 -86
- package/src/shared/content.repository.d1.test.ts +0 -507
- package/src/shared/content.repository.d1.ts +0 -851
- package/src/shared/d1-activity-log.repository.test.ts +0 -140
- package/src/shared/d1-activity-log.repository.ts +0 -105
- package/src/shared/d1-activity-logger.test.ts +0 -86
- package/src/shared/d1-activity-logger.ts +0 -67
- package/src/shared/d1-analytics.repository.test.ts +0 -78
- package/src/shared/d1-analytics.repository.ts +0 -85
- package/src/shared/d1-content-scan.repository.test.ts +0 -80
- package/src/shared/d1-content-scan.repository.ts +0 -37
- package/src/shared/d1-notification.repository.test.ts +0 -128
- package/src/shared/d1-notification.repository.ts +0 -118
- package/src/shared/d1-password-reset-token.repository.test.ts +0 -81
- package/src/shared/d1-password-reset-token.repository.ts +0 -56
- package/src/shared/d1-search.repository.test.ts +0 -87
- package/src/shared/d1-search.repository.ts +0 -88
- package/src/shared/d1-session.repository.test.ts +0 -125
- package/src/shared/d1-session.repository.ts +0 -102
- package/src/shared/d1-setup-checklist.repository.ts +0 -36
- package/src/shared/d1-user.repository.test.ts +0 -151
- package/src/shared/d1-user.repository.ts +0 -119
- package/src/shared/d1-widget.repository.test.ts +0 -267
- package/src/shared/d1-widget.repository.ts +0 -385
- package/src/shared/dashboard-layout.repository.d1.test.ts +0 -135
- package/src/shared/dashboard-layout.repository.d1.ts +0 -58
- package/src/shared/demo-data-sql.ts +0 -216
- package/src/shared/demo-data.repository.d1.ts +0 -20
- package/src/shared/execution-context-scheduler.ts +0 -13
- package/src/shared/fixed-clock.ts +0 -25
- package/src/shared/fts-sync.ts +0 -8
- package/src/shared/idempotency.repository.d1.test.ts +0 -83
- package/src/shared/idempotency.repository.d1.ts +0 -60
- package/src/shared/in-memory-activity-logger.ts +0 -19
- package/src/shared/in-memory-notification-service.ts +0 -19
- package/src/shared/in-memory-seed.repository.ts +0 -58
- package/src/shared/media.repository.d1.test.ts +0 -107
- package/src/shared/media.repository.d1.ts +0 -68
- package/src/shared/qstash-notification-service.test.ts +0 -67
- package/src/shared/qstash-notification-service.ts +0 -55
- package/src/shared/query-utils.ts +0 -141
- package/src/shared/request-utils.ts +0 -26
- package/src/shared/schema-mutator.d1.test.ts +0 -142
- package/src/shared/schema-mutator.d1.ts +0 -64
- package/src/shared/seed-layout.repository.d1.test.ts +0 -114
- package/src/shared/seed-layout.repository.d1.ts +0 -62
- package/src/shared/seed-registry-cache.test.ts +0 -68
- package/src/shared/seed-registry-cache.ts +0 -49
- package/src/shared/seed.repository.d1.test.ts +0 -143
- package/src/shared/seed.repository.d1.ts +0 -98
- package/src/shared/sequential-id-generator.ts +0 -33
- package/src/shared/site-settings.repository.d1.ts +0 -53
- package/src/shared/storage/factory.ts +0 -41
- package/src/shared/storage/s3-bucket.ts +0 -195
- package/src/shared/storage-utils.ts +0 -40
- package/src/shared/system-stats.repository.d1.test.ts +0 -58
- package/src/shared/system-stats.repository.d1.ts +0 -48
- package/src/types.ts +0 -90
- package/src/upload.ts +0 -198
- package/src/widget.test.ts +0 -85
- 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,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,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 @@
|
|
|
1
|
+
export { dashboardLayoutApp } from './dashboard-layout.handler';
|
|
@@ -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
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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 {
|
|
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';
|