@geekity/cms 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2217 -214
- package/admin/components/fields.njk +165 -0
- package/admin/layouts/base.njk +1 -1
- package/admin/layouts/settings-page.njk +26 -0
- package/admin/layouts/shell.njk +17 -3
- package/admin/pages/account/forgot.njk +47 -0
- package/admin/pages/account/login.njk +26 -0
- package/admin/pages/account/reset.njk +38 -0
- package/admin/pages/account/setup.njk +28 -0
- package/admin/pages/appearance/themes.njk +69 -0
- package/admin/pages/comments/all.njk +133 -0
- package/admin/{layouts/dashboard.njk → pages/dashboard/home.njk} +8 -15
- package/admin/{layouts/document-conflict.njk → pages/documents/conflict.njk} +1 -0
- package/admin/{layouts/document-editor.njk → pages/documents/editor.njk} +75 -59
- package/admin/{layouts/document-list.njk → pages/documents/list.njk} +19 -2
- package/admin/pages/documents/taxonomy.njk +95 -0
- package/admin/pages/federation/followers.njk +238 -0
- package/admin/pages/federation/settings.njk +77 -0
- package/admin/pages/media/library.njk +160 -0
- package/admin/pages/messages/all.njk +110 -0
- package/admin/pages/navigation/menus.njk +129 -0
- package/admin/{layouts → pages}/placeholder.njk +5 -1
- package/admin/pages/settings/discussion.njk +99 -0
- package/admin/pages/settings/email.njk +203 -0
- package/admin/pages/settings/general.njk +29 -0
- package/admin/pages/settings/permalinks.njk +50 -0
- package/admin/pages/settings/reading.njk +64 -0
- package/admin/pages/tools/content-index.njk +89 -0
- package/admin/pages/users/edit.njk +239 -0
- package/admin/pages/users/list.njk +51 -0
- package/admin/pages/users/new.njk +41 -0
- package/admin/static/admin.css +558 -3
- package/admin/static/copy.js +52 -0
- package/admin/static/editor.js +16 -16
- package/admin/static/slug.js +61 -0
- package/dist/access-log.d.ts +44 -0
- package/dist/access-log.d.ts.map +1 -0
- package/dist/access-log.js +71 -0
- package/dist/access-log.js.map +1 -0
- package/dist/admin/accounts.d.ts +413 -0
- package/dist/admin/accounts.d.ts.map +1 -0
- package/dist/admin/accounts.js +680 -0
- package/dist/admin/accounts.js.map +1 -0
- package/dist/admin/appearance.d.ts +80 -0
- package/dist/admin/appearance.d.ts.map +1 -0
- package/dist/admin/appearance.js +136 -0
- package/dist/admin/appearance.js.map +1 -0
- package/dist/admin/comments.d.ts +90 -0
- package/dist/admin/comments.d.ts.map +1 -0
- package/dist/admin/comments.js +244 -0
- package/dist/admin/comments.js.map +1 -0
- package/dist/admin/credentials.d.ts +26 -2
- package/dist/admin/credentials.d.ts.map +1 -1
- package/dist/admin/credentials.js +35 -2
- package/dist/admin/credentials.js.map +1 -1
- package/dist/admin/documents.d.ts +117 -10
- package/dist/admin/documents.d.ts.map +1 -1
- package/dist/admin/documents.js +328 -41
- package/dist/admin/documents.js.map +1 -1
- package/dist/admin/federation.d.ts +161 -50
- package/dist/admin/federation.d.ts.map +1 -1
- package/dist/admin/federation.js +235 -93
- package/dist/admin/federation.js.map +1 -1
- package/dist/admin/formatting.d.ts +20 -0
- package/dist/admin/formatting.d.ts.map +1 -0
- package/dist/admin/formatting.js +72 -0
- package/dist/admin/formatting.js.map +1 -0
- package/dist/admin/headers.d.ts +65 -0
- package/dist/admin/headers.d.ts.map +1 -0
- package/dist/admin/headers.js +104 -0
- package/dist/admin/headers.js.map +1 -0
- package/dist/admin/index.d.ts +38 -12
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +25 -7
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/media.d.ts +168 -0
- package/dist/admin/media.d.ts.map +1 -0
- package/dist/admin/media.js +295 -0
- package/dist/admin/media.js.map +1 -0
- package/dist/admin/menu.d.ts +79 -0
- package/dist/admin/menu.d.ts.map +1 -0
- package/dist/admin/menu.js +143 -0
- package/dist/admin/menu.js.map +1 -0
- package/dist/admin/messages.d.ts +80 -0
- package/dist/admin/messages.d.ts.map +1 -0
- package/dist/admin/messages.js +152 -0
- package/dist/admin/messages.js.map +1 -0
- package/dist/admin/navigation.d.ts +155 -0
- package/dist/admin/navigation.d.ts.map +1 -0
- package/dist/admin/navigation.js +292 -0
- package/dist/admin/navigation.js.map +1 -0
- package/dist/admin/preview.d.ts.map +1 -1
- package/dist/admin/preview.js +31 -7
- package/dist/admin/preview.js.map +1 -1
- package/dist/admin/recovery.d.ts +92 -0
- package/dist/admin/recovery.d.ts.map +1 -0
- package/dist/admin/recovery.js +229 -0
- package/dist/admin/recovery.js.map +1 -0
- package/dist/admin/routes.d.ts +0 -20
- package/dist/admin/routes.d.ts.map +1 -1
- package/dist/admin/routes.js +164 -105
- package/dist/admin/routes.js.map +1 -1
- package/dist/admin/session.d.ts +17 -3
- package/dist/admin/session.d.ts.map +1 -1
- package/dist/admin/session.js +19 -5
- package/dist/admin/session.js.map +1 -1
- package/dist/admin/settings-discussion.d.ts +37 -0
- package/dist/admin/settings-discussion.d.ts.map +1 -0
- package/dist/admin/settings-discussion.js +117 -0
- package/dist/admin/settings-discussion.js.map +1 -0
- package/dist/admin/settings-email.d.ts +54 -0
- package/dist/admin/settings-email.d.ts.map +1 -0
- package/dist/admin/settings-email.js +189 -0
- package/dist/admin/settings-email.js.map +1 -0
- package/dist/admin/settings-federation.d.ts +48 -0
- package/dist/admin/settings-federation.d.ts.map +1 -0
- package/dist/admin/settings-federation.js +123 -0
- package/dist/admin/settings-federation.js.map +1 -0
- package/dist/admin/settings-general.d.ts +12 -0
- package/dist/admin/settings-general.d.ts.map +1 -0
- package/dist/admin/settings-general.js +48 -0
- package/dist/admin/settings-general.js.map +1 -0
- package/dist/admin/settings-page.d.ts +119 -0
- package/dist/admin/settings-page.d.ts.map +1 -0
- package/dist/admin/settings-page.js +132 -0
- package/dist/admin/settings-page.js.map +1 -0
- package/dist/admin/settings-pages.d.ts +30 -0
- package/dist/admin/settings-pages.d.ts.map +1 -0
- package/dist/admin/settings-pages.js +43 -0
- package/dist/admin/settings-pages.js.map +1 -0
- package/dist/admin/settings-permalinks.d.ts +16 -0
- package/dist/admin/settings-permalinks.d.ts.map +1 -0
- package/dist/admin/settings-permalinks.js +32 -0
- package/dist/admin/settings-permalinks.js.map +1 -0
- package/dist/admin/settings-reading.d.ts +34 -0
- package/dist/admin/settings-reading.d.ts.map +1 -0
- package/dist/admin/settings-reading.js +49 -0
- package/dist/admin/settings-reading.js.map +1 -0
- package/dist/admin/settings.d.ts +339 -96
- package/dist/admin/settings.d.ts.map +1 -1
- package/dist/admin/settings.js +600 -308
- package/dist/admin/settings.js.map +1 -1
- package/dist/admin/store.d.ts +606 -152
- package/dist/admin/store.d.ts.map +1 -1
- package/dist/admin/store.js +863 -268
- package/dist/admin/store.js.map +1 -1
- package/dist/admin/taxonomy.d.ts +114 -0
- package/dist/admin/taxonomy.d.ts.map +1 -0
- package/dist/admin/taxonomy.js +289 -0
- package/dist/admin/taxonomy.js.map +1 -0
- package/dist/admin/templates.d.ts +46 -14
- package/dist/admin/templates.d.ts.map +1 -1
- package/dist/admin/templates.js +46 -14
- package/dist/admin/templates.js.map +1 -1
- package/dist/admin/throttle.d.ts +84 -0
- package/dist/admin/throttle.d.ts.map +1 -0
- package/dist/admin/throttle.js +143 -0
- package/dist/admin/throttle.js.map +1 -0
- package/dist/admin/tools.d.ts +111 -0
- package/dist/admin/tools.d.ts.map +1 -0
- package/dist/admin/tools.js +182 -0
- package/dist/admin/tools.js.map +1 -0
- package/dist/admin/uploads.d.ts +28 -2
- package/dist/admin/uploads.d.ts.map +1 -1
- package/dist/admin/uploads.js +43 -4
- package/dist/admin/uploads.js.map +1 -1
- package/dist/admin/users.d.ts +100 -13
- package/dist/admin/users.d.ts.map +1 -1
- package/dist/admin/users.js +412 -39
- package/dist/admin/users.js.map +1 -1
- package/dist/cache.d.ts +141 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +207 -0
- package/dist/cache.js.map +1 -0
- package/dist/cli.d.ts +14 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +429 -21
- package/dist/cli.js.map +1 -1
- package/dist/comments/akismet.d.ts +130 -0
- package/dist/comments/akismet.d.ts.map +1 -0
- package/dist/comments/akismet.js +274 -0
- package/dist/comments/akismet.js.map +1 -0
- package/dist/comments/conversation.d.ts +29 -0
- package/dist/comments/conversation.d.ts.map +1 -0
- package/dist/comments/conversation.js +60 -0
- package/dist/comments/conversation.js.map +1 -0
- package/dist/comments/form.d.ts +123 -0
- package/dist/comments/form.d.ts.map +1 -0
- package/dist/comments/form.js +79 -0
- package/dist/comments/form.js.map +1 -0
- package/dist/comments/index.d.ts +16 -0
- package/dist/comments/index.d.ts.map +1 -0
- package/dist/comments/index.js +10 -0
- package/dist/comments/index.js.map +1 -0
- package/dist/comments/markdown.d.ts +8 -0
- package/dist/comments/markdown.d.ts.map +1 -0
- package/dist/comments/markdown.js +85 -0
- package/dist/comments/markdown.js.map +1 -0
- package/dist/comments/moderate.d.ts +71 -0
- package/dist/comments/moderate.d.ts.map +1 -0
- package/dist/comments/moderate.js +88 -0
- package/dist/comments/moderate.js.map +1 -0
- package/dist/comments/policy.d.ts +57 -0
- package/dist/comments/policy.d.ts.map +1 -0
- package/dist/comments/policy.js +80 -0
- package/dist/comments/policy.js.map +1 -0
- package/dist/comments/records.d.ts +266 -0
- package/dist/comments/records.d.ts.map +1 -0
- package/dist/comments/records.js +487 -0
- package/dist/comments/records.js.map +1 -0
- package/dist/comments/routes.d.ts +60 -0
- package/dist/comments/routes.d.ts.map +1 -0
- package/dist/comments/routes.js +212 -0
- package/dist/comments/routes.js.map +1 -0
- package/dist/comments/submission.d.ts +297 -0
- package/dist/comments/submission.d.ts.map +1 -0
- package/dist/comments/submission.js +280 -0
- package/dist/comments/submission.js.map +1 -0
- package/dist/comments/viewer.d.ts +21 -0
- package/dist/comments/viewer.d.ts.map +1 -0
- package/dist/comments/viewer.js +45 -0
- package/dist/comments/viewer.js.map +1 -0
- package/dist/config.d.ts +225 -5
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +121 -6
- package/dist/config.js.map +1 -1
- package/dist/contact/delivery.d.ts +60 -0
- package/dist/contact/delivery.d.ts.map +1 -0
- package/dist/contact/delivery.js +87 -0
- package/dist/contact/delivery.js.map +1 -0
- package/dist/contact/form.d.ts +130 -0
- package/dist/contact/form.d.ts.map +1 -0
- package/dist/contact/form.js +163 -0
- package/dist/contact/form.js.map +1 -0
- package/dist/contact/index.d.ts +17 -0
- package/dist/contact/index.d.ts.map +1 -0
- package/dist/contact/index.js +13 -0
- package/dist/contact/index.js.map +1 -0
- package/dist/contact/records.d.ts +124 -0
- package/dist/contact/records.d.ts.map +1 -0
- package/dist/contact/records.js +218 -0
- package/dist/contact/records.js.map +1 -0
- package/dist/contact/routes.d.ts +17 -0
- package/dist/contact/routes.d.ts.map +1 -0
- package/dist/contact/routes.js +127 -0
- package/dist/contact/routes.js.map +1 -0
- package/dist/contact/submission.d.ts +103 -0
- package/dist/contact/submission.d.ts.map +1 -0
- package/dist/contact/submission.js +166 -0
- package/dist/contact/submission.js.map +1 -0
- package/dist/content/document.d.ts +7 -2
- package/dist/content/document.d.ts.map +1 -1
- package/dist/content/document.js +1 -0
- package/dist/content/document.js.map +1 -1
- package/dist/content/index.d.ts +7 -2
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +4 -1
- package/dist/content/index.js.map +1 -1
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +24 -2
- package/dist/content/markdown.js.map +1 -1
- package/dist/content/parser.d.ts.map +1 -1
- package/dist/content/parser.js +11 -4
- package/dist/content/parser.js.map +1 -1
- package/dist/content/save.d.ts +5 -0
- package/dist/content/save.d.ts.map +1 -1
- package/dist/content/save.js +44 -1
- package/dist/content/save.js.map +1 -1
- package/dist/content/schedule.d.ts +125 -0
- package/dist/content/schedule.d.ts.map +1 -0
- package/dist/content/schedule.js +207 -0
- package/dist/content/schedule.js.map +1 -0
- package/dist/content/search.d.ts +64 -0
- package/dist/content/search.d.ts.map +1 -0
- package/dist/content/search.js +136 -0
- package/dist/content/search.js.map +1 -0
- package/dist/content/store.d.ts +220 -7
- package/dist/content/store.d.ts.map +1 -1
- package/dist/content/store.js +392 -67
- package/dist/content/store.js.map +1 -1
- package/dist/content/sync.d.ts +7 -1
- package/dist/content/sync.d.ts.map +1 -1
- package/dist/content/sync.js +18 -10
- package/dist/content/sync.js.map +1 -1
- package/dist/content/time.d.ts +56 -0
- package/dist/content/time.d.ts.map +1 -0
- package/dist/content/time.js +141 -0
- package/dist/content/time.js.map +1 -0
- package/dist/content/writer.d.ts.map +1 -1
- package/dist/content/writer.js +3 -0
- package/dist/content/writer.js.map +1 -1
- package/dist/env.d.ts +70 -5
- package/dist/env.d.ts.map +1 -1
- package/dist/federation/actor.d.ts +95 -41
- package/dist/federation/actor.d.ts.map +1 -1
- package/dist/federation/actor.js +180 -53
- package/dist/federation/actor.js.map +1 -1
- package/dist/federation/article.d.ts +44 -17
- package/dist/federation/article.d.ts.map +1 -1
- package/dist/federation/article.js +98 -46
- package/dist/federation/article.js.map +1 -1
- package/dist/federation/delivery.d.ts +63 -15
- package/dist/federation/delivery.d.ts.map +1 -1
- package/dist/federation/delivery.js +154 -80
- package/dist/federation/delivery.js.map +1 -1
- package/dist/federation/federation.d.ts +22 -17
- package/dist/federation/federation.d.ts.map +1 -1
- package/dist/federation/federation.js +98 -77
- package/dist/federation/federation.js.map +1 -1
- package/dist/federation/followers.d.ts +3 -2
- package/dist/federation/followers.d.ts.map +1 -1
- package/dist/federation/followers.js +6 -5
- package/dist/federation/followers.js.map +1 -1
- package/dist/federation/import-wordpress.d.ts +128 -0
- package/dist/federation/import-wordpress.d.ts.map +1 -0
- package/dist/federation/import-wordpress.js +426 -0
- package/dist/federation/import-wordpress.js.map +1 -0
- package/dist/federation/inbox.d.ts +36 -13
- package/dist/federation/inbox.d.ts.map +1 -1
- package/dist/federation/inbox.js +120 -49
- package/dist/federation/inbox.js.map +1 -1
- package/dist/federation/index.d.ts +22 -10
- package/dist/federation/index.d.ts.map +1 -1
- package/dist/federation/index.js +13 -8
- package/dist/federation/index.js.map +1 -1
- package/dist/federation/keys.d.ts +98 -20
- package/dist/federation/keys.d.ts.map +1 -1
- package/dist/federation/keys.js +269 -39
- package/dist/federation/keys.js.map +1 -1
- package/dist/federation/mount.d.ts +46 -10
- package/dist/federation/mount.d.ts.map +1 -1
- package/dist/federation/mount.js +300 -28
- package/dist/federation/mount.js.map +1 -1
- package/dist/federation/paths.d.ts +23 -35
- package/dist/federation/paths.d.ts.map +1 -1
- package/dist/federation/paths.js +26 -39
- package/dist/federation/paths.js.map +1 -1
- package/dist/federation/records.d.ts +223 -0
- package/dist/federation/records.d.ts.map +1 -0
- package/dist/federation/records.js +506 -0
- package/dist/federation/records.js.map +1 -0
- package/dist/federation/relays.d.ts +114 -0
- package/dist/federation/relays.d.ts.map +1 -0
- package/dist/federation/relays.js +290 -0
- package/dist/federation/relays.js.map +1 -0
- package/dist/federation/replies.d.ts +80 -0
- package/dist/federation/replies.d.ts.map +1 -0
- package/dist/federation/replies.js +166 -0
- package/dist/federation/replies.js.map +1 -0
- package/dist/federation/wordpress.d.ts +131 -0
- package/dist/federation/wordpress.d.ts.map +1 -0
- package/dist/federation/wordpress.js +341 -0
- package/dist/federation/wordpress.js.map +1 -0
- package/dist/files/atomic.d.ts +103 -0
- package/dist/files/atomic.d.ts.map +1 -0
- package/dist/files/atomic.js +150 -0
- package/dist/files/atomic.js.map +1 -0
- package/dist/files/index.d.ts +3 -0
- package/dist/files/index.d.ts.map +1 -0
- package/dist/files/index.js +2 -0
- package/dist/files/index.js.map +1 -0
- package/dist/forms/protection.d.ts +85 -0
- package/dist/forms/protection.d.ts.map +1 -0
- package/dist/forms/protection.js +116 -0
- package/dist/forms/protection.js.map +1 -0
- package/dist/images/icons.d.ts +59 -0
- package/dist/images/icons.d.ts.map +1 -0
- package/dist/images/icons.js +131 -0
- package/dist/images/icons.js.map +1 -0
- package/dist/images/index.d.ts +7 -0
- package/dist/images/index.d.ts.map +1 -0
- package/dist/images/index.js +4 -0
- package/dist/images/index.js.map +1 -0
- package/dist/images/markup.d.ts +47 -0
- package/dist/images/markup.d.ts.map +1 -0
- package/dist/images/markup.js +175 -0
- package/dist/images/markup.js.map +1 -0
- package/dist/images/paths.d.ts +34 -0
- package/dist/images/paths.d.ts.map +1 -0
- package/dist/images/paths.js +41 -0
- package/dist/images/paths.js.map +1 -0
- package/dist/images/variants.d.ts +104 -0
- package/dist/images/variants.d.ts.map +1 -0
- package/dist/images/variants.js +320 -0
- package/dist/images/variants.js.map +1 -0
- package/dist/index.d.ts +123 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +344 -25
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +18 -0
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +34 -3
- package/dist/init.js.map +1 -1
- package/dist/mail/brevo.d.ts +35 -0
- package/dist/mail/brevo.d.ts.map +1 -0
- package/dist/mail/brevo.js +85 -0
- package/dist/mail/brevo.js.map +1 -0
- package/dist/mail/credentials.d.ts +62 -0
- package/dist/mail/credentials.d.ts.map +1 -0
- package/dist/mail/credentials.js +86 -0
- package/dist/mail/credentials.js.map +1 -0
- package/dist/mail/index.d.ts +15 -0
- package/dist/mail/index.d.ts.map +1 -0
- package/dist/mail/index.js +8 -0
- package/dist/mail/index.js.map +1 -0
- package/dist/mail/memory.d.ts +35 -0
- package/dist/mail/memory.d.ts.map +1 -0
- package/dist/mail/memory.js +29 -0
- package/dist/mail/memory.js.map +1 -0
- package/dist/mail/provider.d.ts +80 -0
- package/dist/mail/provider.d.ts.map +1 -0
- package/dist/mail/provider.js +23 -0
- package/dist/mail/provider.js.map +1 -0
- package/dist/mail/service.d.ts +156 -0
- package/dist/mail/service.d.ts.map +1 -0
- package/dist/mail/service.js +265 -0
- package/dist/mail/service.js.map +1 -0
- package/dist/mail/smtp.d.ts +39 -0
- package/dist/mail/smtp.d.ts.map +1 -0
- package/dist/mail/smtp.js +58 -0
- package/dist/mail/smtp.js.map +1 -0
- package/dist/mail/templates.d.ts +91 -0
- package/dist/mail/templates.d.ts.map +1 -0
- package/dist/mail/templates.js +69 -0
- package/dist/mail/templates.js.map +1 -0
- package/dist/notifications/comments.d.ts +66 -0
- package/dist/notifications/comments.d.ts.map +1 -0
- package/dist/notifications/comments.js +151 -0
- package/dist/notifications/comments.js.map +1 -0
- package/dist/notifications/digest.d.ts +135 -0
- package/dist/notifications/digest.d.ts.map +1 -0
- package/dist/notifications/digest.js +287 -0
- package/dist/notifications/digest.js.map +1 -0
- package/dist/notifications/index.d.ts +13 -0
- package/dist/notifications/index.d.ts.map +1 -0
- package/dist/notifications/index.js +8 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/notifications/links.d.ts +60 -0
- package/dist/notifications/links.d.ts.map +1 -0
- package/dist/notifications/links.js +63 -0
- package/dist/notifications/links.js.map +1 -0
- package/dist/notifications/optouts.d.ts +48 -0
- package/dist/notifications/optouts.d.ts.map +1 -0
- package/dist/notifications/optouts.js +93 -0
- package/dist/notifications/optouts.js.map +1 -0
- package/dist/notifications/preferences.d.ts +158 -0
- package/dist/notifications/preferences.d.ts.map +1 -0
- package/dist/notifications/preferences.js +195 -0
- package/dist/notifications/preferences.js.map +1 -0
- package/dist/notifications/routes.d.ts +28 -0
- package/dist/notifications/routes.d.ts.map +1 -0
- package/dist/notifications/routes.js +184 -0
- package/dist/notifications/routes.js.map +1 -0
- package/dist/notifications/tokens.d.ts +60 -0
- package/dist/notifications/tokens.d.ts.map +1 -0
- package/dist/notifications/tokens.js +125 -0
- package/dist/notifications/tokens.js.map +1 -0
- package/dist/notify.d.ts +84 -0
- package/dist/notify.d.ts.map +1 -0
- package/dist/notify.js +149 -0
- package/dist/notify.js.map +1 -0
- package/dist/web/archive.d.ts +49 -0
- package/dist/web/archive.d.ts.map +1 -0
- package/dist/web/archive.js +59 -0
- package/dist/web/archive.js.map +1 -0
- package/dist/web/assets.d.ts +6 -5
- package/dist/web/assets.d.ts.map +1 -1
- package/dist/web/assets.js +5 -7
- package/dist/web/assets.js.map +1 -1
- package/dist/web/authors.d.ts +143 -0
- package/dist/web/authors.d.ts.map +1 -0
- package/dist/web/authors.js +178 -0
- package/dist/web/authors.js.map +1 -0
- package/dist/web/comments.d.ts +60 -0
- package/dist/web/comments.d.ts.map +1 -0
- package/dist/web/comments.js +207 -0
- package/dist/web/comments.js.map +1 -0
- package/dist/web/context.d.ts +162 -28
- package/dist/web/context.d.ts.map +1 -1
- package/dist/web/context.js +123 -26
- package/dist/web/context.js.map +1 -1
- package/dist/web/conversation.d.ts +209 -0
- package/dist/web/conversation.d.ts.map +1 -0
- package/dist/web/conversation.js +557 -0
- package/dist/web/conversation.js.map +1 -0
- package/dist/web/documents.d.ts +36 -6
- package/dist/web/documents.d.ts.map +1 -1
- package/dist/web/documents.js +52 -10
- package/dist/web/documents.js.map +1 -1
- package/dist/web/feed-atom.d.ts +22 -0
- package/dist/web/feed-atom.d.ts.map +1 -0
- package/dist/web/feed-atom.js +83 -0
- package/dist/web/feed-atom.js.map +1 -0
- package/dist/web/feed-item.d.ts +145 -0
- package/dist/web/feed-item.d.ts.map +1 -0
- package/dist/web/feed-item.js +120 -0
- package/dist/web/feed-item.js.map +1 -0
- package/dist/web/feed-json.d.ts +79 -0
- package/dist/web/feed-json.d.ts.map +1 -0
- package/dist/web/feed-json.js +53 -0
- package/dist/web/feed-json.js.map +1 -0
- package/dist/web/feed-rss.d.ts +26 -0
- package/dist/web/feed-rss.d.ts.map +1 -0
- package/dist/web/feed-rss.js +203 -0
- package/dist/web/feed-rss.js.map +1 -0
- package/dist/web/feed-source.d.ts +244 -0
- package/dist/web/feed-source.d.ts.map +1 -0
- package/dist/web/feed-source.js +201 -0
- package/dist/web/feed-source.js.map +1 -0
- package/dist/web/feed-xml.d.ts +63 -0
- package/dist/web/feed-xml.d.ts.map +1 -0
- package/dist/web/feed-xml.js +116 -0
- package/dist/web/feed-xml.js.map +1 -0
- package/dist/web/feeds.d.ts +31 -96
- package/dist/web/feeds.d.ts.map +1 -1
- package/dist/web/feeds.js +94 -198
- package/dist/web/feeds.js.map +1 -1
- package/dist/web/health.d.ts +31 -0
- package/dist/web/health.d.ts.map +1 -0
- package/dist/web/health.js +44 -0
- package/dist/web/health.js.map +1 -0
- package/dist/web/index.d.ts +30 -10
- package/dist/web/index.d.ts.map +1 -1
- package/dist/web/index.js +18 -7
- package/dist/web/index.js.map +1 -1
- package/dist/web/navigation.d.ts +195 -0
- package/dist/web/navigation.d.ts.map +1 -0
- package/dist/web/navigation.js +300 -0
- package/dist/web/navigation.js.map +1 -0
- package/dist/web/negotiate.d.ts +31 -0
- package/dist/web/negotiate.d.ts.map +1 -1
- package/dist/web/negotiate.js +31 -11
- package/dist/web/negotiate.js.map +1 -1
- package/dist/web/recent.d.ts +43 -0
- package/dist/web/recent.d.ts.map +1 -0
- package/dist/web/recent.js +37 -0
- package/dist/web/recent.js.map +1 -0
- package/dist/web/render.d.ts +203 -9
- package/dist/web/render.d.ts.map +1 -1
- package/dist/web/render.js +341 -17
- package/dist/web/render.js.map +1 -1
- package/dist/web/routes.d.ts +25 -8
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +854 -93
- package/dist/web/routes.js.map +1 -1
- package/dist/web/sanitize.d.ts +19 -0
- package/dist/web/sanitize.d.ts.map +1 -0
- package/dist/web/sanitize.js +272 -0
- package/dist/web/sanitize.js.map +1 -0
- package/dist/web/search.d.ts +79 -0
- package/dist/web/search.d.ts.map +1 -0
- package/dist/web/search.js +94 -0
- package/dist/web/search.js.map +1 -0
- package/dist/web/sitemap.d.ts +120 -0
- package/dist/web/sitemap.d.ts.map +1 -0
- package/dist/web/sitemap.js +199 -0
- package/dist/web/sitemap.js.map +1 -0
- package/dist/web/taxonomy.d.ts +152 -0
- package/dist/web/taxonomy.d.ts.map +1 -0
- package/dist/web/taxonomy.js +237 -0
- package/dist/web/taxonomy.js.map +1 -0
- package/dist/web/templates.d.ts +54 -16
- package/dist/web/templates.d.ts.map +1 -1
- package/dist/web/templates.js +109 -28
- package/dist/web/templates.js.map +1 -1
- package/dist/web/themes.d.ts +226 -0
- package/dist/web/themes.d.ts.map +1 -0
- package/dist/web/themes.js +314 -0
- package/dist/web/themes.js.map +1 -0
- package/dist/webmention/discovery.d.ts +51 -0
- package/dist/webmention/discovery.d.ts.map +1 -0
- package/dist/webmention/discovery.js +176 -0
- package/dist/webmention/discovery.js.map +1 -0
- package/dist/webmention/html.d.ts +71 -0
- package/dist/webmention/html.d.ts.map +1 -0
- package/dist/webmention/html.js +285 -0
- package/dist/webmention/html.js.map +1 -0
- package/dist/webmention/index.d.ts +12 -0
- package/dist/webmention/index.d.ts.map +1 -0
- package/dist/webmention/index.js +8 -0
- package/dist/webmention/index.js.map +1 -0
- package/dist/webmention/links.d.ts +18 -0
- package/dist/webmention/links.d.ts.map +1 -0
- package/dist/webmention/links.js +64 -0
- package/dist/webmention/links.js.map +1 -0
- package/dist/webmention/microformats.d.ts +93 -0
- package/dist/webmention/microformats.d.ts.map +1 -0
- package/dist/webmention/microformats.js +376 -0
- package/dist/webmention/microformats.js.map +1 -0
- package/dist/webmention/receive.d.ts +141 -0
- package/dist/webmention/receive.d.ts.map +1 -0
- package/dist/webmention/receive.js +264 -0
- package/dist/webmention/receive.js.map +1 -0
- package/dist/webmention/routes.d.ts +37 -0
- package/dist/webmention/routes.d.ts.map +1 -0
- package/dist/webmention/routes.js +75 -0
- package/dist/webmention/routes.js.map +1 -0
- package/dist/webmention/service.d.ts +94 -0
- package/dist/webmention/service.d.ts.map +1 -0
- package/dist/webmention/service.js +207 -0
- package/dist/webmention/service.js.map +1 -0
- package/package.json +11 -6
- package/templates/site/content/_data/site.json +8 -0
- package/templates/site/content/pages/about.md +7 -0
- package/templates/site/content/posts/2026-01-01-hello-world.md +5 -3
- package/templates/site/geekity.config.ts +11 -1
- package/templates/site/tsconfig.json +1 -1
- package/themes/default/README.md +1216 -50
- package/themes/default/layouts/404.njk +2 -3
- package/themes/default/layouts/author.njk +36 -0
- package/themes/default/layouts/base.njk +161 -31
- package/themes/default/layouts/category.njk +27 -0
- package/themes/default/layouts/front-page.njk +56 -0
- package/themes/default/layouts/home.njk +17 -1
- package/themes/default/layouts/page.njk +57 -5
- package/themes/default/layouts/post.njk +78 -19
- package/themes/default/layouts/search.njk +57 -0
- package/themes/default/layouts/tag.njk +3 -6
- package/themes/default/mail/comment-digest.html.njk +37 -0
- package/themes/default/mail/comment-digest.subject.njk +3 -0
- package/themes/default/mail/comment-digest.txt.njk +40 -0
- package/themes/default/mail/comment-pending.html.njk +27 -0
- package/themes/default/mail/comment-pending.subject.njk +2 -0
- package/themes/default/mail/comment-pending.txt.njk +24 -0
- package/themes/default/mail/comment-reply.html.njk +21 -0
- package/themes/default/mail/comment-reply.subject.njk +2 -0
- package/themes/default/mail/comment-reply.txt.njk +22 -0
- package/themes/default/mail/contact-message.html.njk +24 -0
- package/themes/default/mail/contact-message.subject.njk +5 -0
- package/themes/default/mail/contact-message.txt.njk +20 -0
- package/themes/default/mail/password-changed.html.njk +18 -0
- package/themes/default/mail/password-changed.subject.njk +2 -0
- package/themes/default/mail/password-changed.txt.njk +17 -0
- package/themes/default/mail/password-reset.html.njk +22 -0
- package/themes/default/mail/password-reset.subject.njk +2 -0
- package/themes/default/mail/password-reset.txt.njk +18 -0
- package/themes/default/mail/test.html.njk +14 -0
- package/themes/default/mail/test.subject.njk +2 -0
- package/themes/default/mail/test.txt.njk +12 -0
- package/themes/default/partials/archive.njk +27 -0
- package/themes/default/partials/bio.njk +71 -0
- package/themes/default/partials/comment-form.njk +137 -0
- package/themes/default/partials/contact-form.njk +88 -0
- package/themes/default/partials/conversation.njk +139 -0
- package/themes/default/partials/feeds.njk +26 -0
- package/themes/default/partials/jsonld.njk +120 -0
- package/themes/default/partials/menu.njk +32 -0
- package/themes/default/partials/pagination.njk +12 -6
- package/themes/default/partials/post-list.njk +51 -18
- package/themes/default/partials/search-form.njk +22 -0
- package/themes/default/partials/tags.njk +26 -5
- package/themes/default/static/highlight.js +4 -0
- package/themes/default/static/style.css +1142 -194
- package/themes/default/theme.json +9 -0
- package/admin/layouts/federation.njk +0 -145
- package/admin/layouts/login.njk +0 -23
- package/admin/layouts/settings.njk +0 -116
- package/admin/layouts/setup.njk +0 -27
- package/admin/layouts/users.njk +0 -91
- /package/admin/{layouts/_flash.njk → components/flash.njk} +0 -0
package/dist/init.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';
|
|
2
|
-
import { cp, mkdir, readdir, rename, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { cp, mkdir, readdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { fileURLToPath } from 'node:url';
|
|
5
5
|
/**
|
|
@@ -36,8 +36,7 @@ export async function initSite(options) {
|
|
|
36
36
|
const directory = path.resolve(cwd, options.directory);
|
|
37
37
|
if (!(await isEmptyOrMissing(directory)))
|
|
38
38
|
throw new DirectoryNotEmptyError(directory);
|
|
39
|
-
await
|
|
40
|
-
await cp(SITE_TEMPLATE_DIR, directory, { recursive: true });
|
|
39
|
+
await copyTemplate('.', directory);
|
|
41
40
|
for (const [packed, real] of DOTFILES) {
|
|
42
41
|
await rename(path.join(directory, packed), path.join(directory, real));
|
|
43
42
|
}
|
|
@@ -49,6 +48,38 @@ export async function initSite(options) {
|
|
|
49
48
|
await writeFile(path.join(directory, 'pnpm-workspace.yaml'), pnpmSettings(), 'utf8');
|
|
50
49
|
return { directory, files: (await readdir(directory)).sort() };
|
|
51
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Fill a missing or empty content directory with the starter site: the same
|
|
53
|
+
* `content/` that `geekity init` writes, copied from the same template by the
|
|
54
|
+
* same routine. `geekity serve` calls it when `seedContent` is on, which is
|
|
55
|
+
* how the Docker image boots a new box with an empty content volume.
|
|
56
|
+
*
|
|
57
|
+
* A directory counts as empty only when it has no entries at all. Anything
|
|
58
|
+
* else, even a lone dotfile, is left exactly as it is, so a mounted site is
|
|
59
|
+
* never written over. Returns whether it seeded.
|
|
60
|
+
*/
|
|
61
|
+
export async function seedStarterContent(options) {
|
|
62
|
+
const { contentDir, baseUrl } = options;
|
|
63
|
+
if (!(await isEmptyOrMissing(contentDir)))
|
|
64
|
+
return false;
|
|
65
|
+
await copyTemplate('content', contentDir);
|
|
66
|
+
// The template's url is the localhost default. The settings screen shows
|
|
67
|
+
// this value, so it should be the address the site is actually served at.
|
|
68
|
+
const siteJson = path.join(contentDir, '_data', 'site.json');
|
|
69
|
+
const settings = JSON.parse(await readFile(siteJson, 'utf8'));
|
|
70
|
+
settings['url'] = baseUrl;
|
|
71
|
+
await writeFile(siteJson, `${JSON.stringify(settings, undefined, 2)}\n`, 'utf8');
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Copy part of the site template, `.` for the whole of it, into a directory,
|
|
76
|
+
* creating the directory first. The one copy routine both {@link initSite}
|
|
77
|
+
* and {@link seedStarterContent} go through.
|
|
78
|
+
*/
|
|
79
|
+
async function copyTemplate(part, destination) {
|
|
80
|
+
await mkdir(destination, { recursive: true });
|
|
81
|
+
await cp(path.join(SITE_TEMPLATE_DIR, part), destination, { recursive: true });
|
|
82
|
+
}
|
|
52
83
|
/**
|
|
53
84
|
* pnpm settings a new site starts with, as `pnpm-workspace.yaml`.
|
|
54
85
|
*
|
package/dist/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { MailProvider } from './provider.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Brevo's transactional API, as one {@link MailProvider}.
|
|
4
|
+
*
|
|
5
|
+
* The HTTP half of sending: one POST with a JSON body and an `api-key` header,
|
|
6
|
+
* no connection to keep open and no TLS negotiation to get wrong, which is why
|
|
7
|
+
* it is the provider a site on a host that blocks port 587 can still use.
|
|
8
|
+
*
|
|
9
|
+
* Nothing here reads a file or a setting. The key is handed in, because the
|
|
10
|
+
* service reads `data/mail.json` on every send and builds the provider from
|
|
11
|
+
* what it found — so a key pasted into the settings screen sends the next
|
|
12
|
+
* message without a restart.
|
|
13
|
+
*/
|
|
14
|
+
/** The endpoint Brevo documents for a transactional message. */
|
|
15
|
+
export declare const BREVO_ENDPOINT = "https://api.brevo.com/v3/smtp/email";
|
|
16
|
+
/**
|
|
17
|
+
* How long Brevo has to answer before the call is abandoned.
|
|
18
|
+
*
|
|
19
|
+
* Sending happens off the request that caused it, so this is not somebody
|
|
20
|
+
* waiting on a page — but an abandoned call is a failure the service can
|
|
21
|
+
* retry, and a hung one is a queue that never moves again.
|
|
22
|
+
*/
|
|
23
|
+
export declare const BREVO_TIMEOUT_MS = 15000;
|
|
24
|
+
/** What {@link createBrevoProvider} needs. */
|
|
25
|
+
export interface BrevoProviderOptions {
|
|
26
|
+
/** The account's API key, `xkeysib-…`. */
|
|
27
|
+
apiKey: string;
|
|
28
|
+
/** The HTTP client. Defaults to the global `fetch`; a test hands in its own. */
|
|
29
|
+
fetch?: typeof fetch | undefined;
|
|
30
|
+
/** How long Brevo has to answer. */
|
|
31
|
+
timeoutMs?: number | undefined;
|
|
32
|
+
}
|
|
33
|
+
/** A provider that hands each message to Brevo. */
|
|
34
|
+
export declare function createBrevoProvider(options: BrevoProviderOptions): MailProvider;
|
|
35
|
+
//# sourceMappingURL=brevo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brevo.d.ts","sourceRoot":"","sources":["../../src/mail/brevo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA6B,YAAY,EAAgB,MAAM,eAAe,CAAC;AAE3F;;;;;;;;;;;GAWG;AAEH,gEAAgE;AAChE,eAAO,MAAM,cAAc,wCAAwC,CAAC;AAEpE;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,QAAS,CAAC;AAEvC,8CAA8C;AAC9C,MAAM,WAAW,oBAAoB;IACnC,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,KAAK,CAAC,EAAE,OAAO,KAAK,GAAG,SAAS,CAAC;IACjC,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,mDAAmD;AACnD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,YAAY,CA6B/E"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brevo's transactional API, as one {@link MailProvider}.
|
|
3
|
+
*
|
|
4
|
+
* The HTTP half of sending: one POST with a JSON body and an `api-key` header,
|
|
5
|
+
* no connection to keep open and no TLS negotiation to get wrong, which is why
|
|
6
|
+
* it is the provider a site on a host that blocks port 587 can still use.
|
|
7
|
+
*
|
|
8
|
+
* Nothing here reads a file or a setting. The key is handed in, because the
|
|
9
|
+
* service reads `data/mail.json` on every send and builds the provider from
|
|
10
|
+
* what it found — so a key pasted into the settings screen sends the next
|
|
11
|
+
* message without a restart.
|
|
12
|
+
*/
|
|
13
|
+
/** The endpoint Brevo documents for a transactional message. */
|
|
14
|
+
export const BREVO_ENDPOINT = 'https://api.brevo.com/v3/smtp/email';
|
|
15
|
+
/**
|
|
16
|
+
* How long Brevo has to answer before the call is abandoned.
|
|
17
|
+
*
|
|
18
|
+
* Sending happens off the request that caused it, so this is not somebody
|
|
19
|
+
* waiting on a page — but an abandoned call is a failure the service can
|
|
20
|
+
* retry, and a hung one is a queue that never moves again.
|
|
21
|
+
*/
|
|
22
|
+
export const BREVO_TIMEOUT_MS = 15_000;
|
|
23
|
+
/** A provider that hands each message to Brevo. */
|
|
24
|
+
export function createBrevoProvider(options) {
|
|
25
|
+
const call = options.fetch ?? globalThis.fetch;
|
|
26
|
+
return {
|
|
27
|
+
name: 'brevo',
|
|
28
|
+
async deliver(message) {
|
|
29
|
+
const response = await call(BREVO_ENDPOINT, {
|
|
30
|
+
method: 'POST',
|
|
31
|
+
headers: {
|
|
32
|
+
'api-key': options.apiKey,
|
|
33
|
+
'content-type': 'application/json',
|
|
34
|
+
accept: 'application/json',
|
|
35
|
+
},
|
|
36
|
+
body: JSON.stringify(bodyFor(message)),
|
|
37
|
+
signal: AbortSignal.timeout(options.timeoutMs ?? BREVO_TIMEOUT_MS),
|
|
38
|
+
});
|
|
39
|
+
const said = await response.text();
|
|
40
|
+
if (!response.ok) {
|
|
41
|
+
// Brevo's own words, not a summary of them: `sender is missing` is
|
|
42
|
+
// what tells somebody which field of the settings screen to fix, and
|
|
43
|
+
// a status on its own never has.
|
|
44
|
+
throw new Error(`Brevo answered ${String(response.status)}: ${said.trim()}`);
|
|
45
|
+
}
|
|
46
|
+
return { messageId: messageIdOf(said) };
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/** The message as Brevo's `POST /v3/smtp/email` documents it. */
|
|
51
|
+
function bodyFor(message) {
|
|
52
|
+
return {
|
|
53
|
+
sender: recipient(message.from),
|
|
54
|
+
to: message.to.map(recipient),
|
|
55
|
+
...(message.replyTo === undefined ? {} : { replyTo: recipient(message.replyTo) }),
|
|
56
|
+
subject: message.subject,
|
|
57
|
+
textContent: message.text,
|
|
58
|
+
// Left out rather than sent empty: a message with an empty `htmlContent`
|
|
59
|
+
// is a multipart message whose HTML half is blank, which is worse in a
|
|
60
|
+
// reader than a message that never claimed to have one.
|
|
61
|
+
...(message.html === undefined || message.html === '' ? {} : { htmlContent: message.html }),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/** One address as Brevo spells it: `email`, and `name` only when there is one. */
|
|
65
|
+
function recipient(address) {
|
|
66
|
+
return {
|
|
67
|
+
email: address.address,
|
|
68
|
+
...(address.name === undefined || address.name === '' ? {} : { name: address.name }),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/** The `messageId` out of an accepted answer, or nothing when it carried none. */
|
|
72
|
+
function messageIdOf(body) {
|
|
73
|
+
let parsed;
|
|
74
|
+
try {
|
|
75
|
+
parsed = JSON.parse(body);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
if (typeof parsed !== 'object' || parsed === null)
|
|
81
|
+
return undefined;
|
|
82
|
+
const id = parsed['messageId'];
|
|
83
|
+
return typeof id === 'string' && id !== '' ? id : undefined;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=brevo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brevo.js","sourceRoot":"","sources":["../../src/mail/brevo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a site needs to prove it may send: `data/mail.json`.
|
|
3
|
+
*
|
|
4
|
+
* A credential, not a setting, so it lives where the Akismet key and the
|
|
5
|
+
* password hashes live — under `data/` at mode `0600` — and never in
|
|
6
|
+
* `content/_data/site.json`, which is public, in git and published with the
|
|
7
|
+
* site. Which provider is in use, who mail is from and where a reply goes are
|
|
8
|
+
* settings and are in `site.json`; the key and the SMTP password are here.
|
|
9
|
+
*
|
|
10
|
+
* Read on every send, like the Akismet key, so a credential pasted into the
|
|
11
|
+
* settings screen sends the next message and one removed stops sending at
|
|
12
|
+
* once, neither of them needing a restart.
|
|
13
|
+
*/
|
|
14
|
+
/** Where the credentials live, under `dataDir`. */
|
|
15
|
+
export declare const MAIL_CREDENTIALS_FILE = "mail.json";
|
|
16
|
+
/** Brevo's half: one API key. */
|
|
17
|
+
export interface BrevoCredential {
|
|
18
|
+
/** The account's API key, `xkeysib-…`. */
|
|
19
|
+
readonly apiKey: string;
|
|
20
|
+
}
|
|
21
|
+
/** SMTP's half: the whole connection, because all of it is a credential. */
|
|
22
|
+
export interface SmtpCredential {
|
|
23
|
+
/** The server's hostname. */
|
|
24
|
+
readonly host: string;
|
|
25
|
+
/** The port: 587 for submission with STARTTLS, 465 for implicit TLS. */
|
|
26
|
+
readonly port: number;
|
|
27
|
+
/** Whether the connection is TLS from the first byte, which is port 465. */
|
|
28
|
+
readonly secure: boolean;
|
|
29
|
+
/** The username. Empty for a server that wants no credentials. */
|
|
30
|
+
readonly user: string;
|
|
31
|
+
/** The password. */
|
|
32
|
+
readonly password: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The file's whole contents: at most one entry per provider.
|
|
36
|
+
*
|
|
37
|
+
* Both may be present at once, and that is deliberate — a site trying SMTP
|
|
38
|
+
* after Brevo should be able to switch the `mailProvider` setting back without
|
|
39
|
+
* having to paste a key in again.
|
|
40
|
+
*/
|
|
41
|
+
export interface MailCredentials {
|
|
42
|
+
/** Brevo's key, when the site has one. */
|
|
43
|
+
readonly brevo?: BrevoCredential | undefined;
|
|
44
|
+
/** The SMTP connection, when the site has one. */
|
|
45
|
+
readonly smtp?: SmtpCredential | undefined;
|
|
46
|
+
}
|
|
47
|
+
/** Where one site's credential file is. */
|
|
48
|
+
export declare function mailCredentialsPath(dataDir: string): string;
|
|
49
|
+
/**
|
|
50
|
+
* The stored credentials, or an empty object when the site has none.
|
|
51
|
+
*
|
|
52
|
+
* Read tolerantly and synchronously, like every other file this CMS treats as
|
|
53
|
+
* truth: a file that will not parse, or an entry missing the one field that
|
|
54
|
+
* makes it usable, is a site with no mail rather than a site that will not
|
|
55
|
+
* boot.
|
|
56
|
+
*/
|
|
57
|
+
export declare function readMailCredentials(dataDir: string): MailCredentials;
|
|
58
|
+
/** Write the credentials, private to the account the site runs as. */
|
|
59
|
+
export declare function writeMailCredentials(dataDir: string, credentials: MailCredentials): Promise<void>;
|
|
60
|
+
/** Forget them, which is how a site stops sending mail entirely. */
|
|
61
|
+
export declare function removeMailCredentials(dataDir: string): Promise<void>;
|
|
62
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/mail/credentials.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;GAYG;AAEH,mDAAmD;AACnD,eAAO,MAAM,qBAAqB,cAAc,CAAC;AAEjD,iCAAiC;AACjC,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,kEAAkE;IAClE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oBAAoB;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IAC7C,kDAAkD;IAClD,QAAQ,CAAC,IAAI,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;CAC5C;AAED,2CAA2C;AAC3C,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAkBpE;AAED,sEAAsE;AACtE,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,eAAe,GAC3B,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,oEAAoE;AACpE,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1E"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { rm } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { readFileIfPresentSync, writeFileAtomically } from '../files/atomic.js';
|
|
4
|
+
/**
|
|
5
|
+
* What a site needs to prove it may send: `data/mail.json`.
|
|
6
|
+
*
|
|
7
|
+
* A credential, not a setting, so it lives where the Akismet key and the
|
|
8
|
+
* password hashes live — under `data/` at mode `0600` — and never in
|
|
9
|
+
* `content/_data/site.json`, which is public, in git and published with the
|
|
10
|
+
* site. Which provider is in use, who mail is from and where a reply goes are
|
|
11
|
+
* settings and are in `site.json`; the key and the SMTP password are here.
|
|
12
|
+
*
|
|
13
|
+
* Read on every send, like the Akismet key, so a credential pasted into the
|
|
14
|
+
* settings screen sends the next message and one removed stops sending at
|
|
15
|
+
* once, neither of them needing a restart.
|
|
16
|
+
*/
|
|
17
|
+
/** Where the credentials live, under `dataDir`. */
|
|
18
|
+
export const MAIL_CREDENTIALS_FILE = 'mail.json';
|
|
19
|
+
/** Where one site's credential file is. */
|
|
20
|
+
export function mailCredentialsPath(dataDir) {
|
|
21
|
+
return path.join(dataDir, MAIL_CREDENTIALS_FILE);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The stored credentials, or an empty object when the site has none.
|
|
25
|
+
*
|
|
26
|
+
* Read tolerantly and synchronously, like every other file this CMS treats as
|
|
27
|
+
* truth: a file that will not parse, or an entry missing the one field that
|
|
28
|
+
* makes it usable, is a site with no mail rather than a site that will not
|
|
29
|
+
* boot.
|
|
30
|
+
*/
|
|
31
|
+
export function readMailCredentials(dataDir) {
|
|
32
|
+
const raw = readFileIfPresentSync(mailCredentialsPath(dataDir));
|
|
33
|
+
if (raw === undefined)
|
|
34
|
+
return {};
|
|
35
|
+
let parsed;
|
|
36
|
+
try {
|
|
37
|
+
parsed = JSON.parse(raw);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return {};
|
|
41
|
+
}
|
|
42
|
+
if (typeof parsed !== 'object' || parsed === null)
|
|
43
|
+
return {};
|
|
44
|
+
const file = parsed;
|
|
45
|
+
return {
|
|
46
|
+
...(brevoIn(file['brevo']) === undefined ? {} : { brevo: brevoIn(file['brevo']) }),
|
|
47
|
+
...(smtpIn(file['smtp']) === undefined ? {} : { smtp: smtpIn(file['smtp']) }),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/** Write the credentials, private to the account the site runs as. */
|
|
51
|
+
export async function writeMailCredentials(dataDir, credentials) {
|
|
52
|
+
await writeFileAtomically(mailCredentialsPath(dataDir), `${JSON.stringify(credentials, null, 2)}\n`, { mode: 0o600 });
|
|
53
|
+
}
|
|
54
|
+
/** Forget them, which is how a site stops sending mail entirely. */
|
|
55
|
+
export async function removeMailCredentials(dataDir) {
|
|
56
|
+
await rm(mailCredentialsPath(dataDir), { force: true });
|
|
57
|
+
}
|
|
58
|
+
/** One Brevo entry, or nothing when it carries no key. */
|
|
59
|
+
function brevoIn(value) {
|
|
60
|
+
if (typeof value !== 'object' || value === null)
|
|
61
|
+
return undefined;
|
|
62
|
+
const entry = value;
|
|
63
|
+
const apiKey = typeof entry['apiKey'] === 'string' ? entry['apiKey'].trim() : '';
|
|
64
|
+
return apiKey === '' ? undefined : { apiKey };
|
|
65
|
+
}
|
|
66
|
+
/** One SMTP entry, or nothing when it names no host to connect to. */
|
|
67
|
+
function smtpIn(value) {
|
|
68
|
+
if (typeof value !== 'object' || value === null)
|
|
69
|
+
return undefined;
|
|
70
|
+
const entry = value;
|
|
71
|
+
const host = typeof entry['host'] === 'string' ? entry['host'].trim() : '';
|
|
72
|
+
if (host === '')
|
|
73
|
+
return undefined;
|
|
74
|
+
const port = Number(entry['port']);
|
|
75
|
+
const secure = entry['secure'] === true;
|
|
76
|
+
return {
|
|
77
|
+
host,
|
|
78
|
+
// 465 when the connection is TLS from the first byte, 587 otherwise:
|
|
79
|
+
// the two submission ports, so a file that lost its port still connects.
|
|
80
|
+
port: Number.isInteger(port) && port > 0 && port < 65536 ? port : secure ? 465 : 587,
|
|
81
|
+
secure,
|
|
82
|
+
user: typeof entry['user'] === 'string' ? entry['user'] : '',
|
|
83
|
+
password: typeof entry['password'] === 'string' ? entry['password'] : '',
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/mail/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { BREVO_ENDPOINT, BREVO_TIMEOUT_MS, createBrevoProvider } from './brevo.ts';
|
|
2
|
+
export type { BrevoProviderOptions } from './brevo.ts';
|
|
3
|
+
export { MAIL_CREDENTIALS_FILE, mailCredentialsPath, readMailCredentials, removeMailCredentials, writeMailCredentials, } from './credentials.ts';
|
|
4
|
+
export type { BrevoCredential, MailCredentials, SmtpCredential } from './credentials.ts';
|
|
5
|
+
export { createMemoryMailProvider } from './memory.ts';
|
|
6
|
+
export type { MemoryMailProvider } from './memory.ts';
|
|
7
|
+
export { MAIL_PROVIDERS } from './provider.ts';
|
|
8
|
+
export type { MailAddress, MailDelivery, MailProvider, MailProviderName, OutgoingMail, } from './provider.ts';
|
|
9
|
+
export { createMailService, DEFAULT_MAIL_ATTEMPTS, defaultMailBackoffMs } from './service.ts';
|
|
10
|
+
export type { CreateMailServiceOptions, MailLogger, MailRecipient, MailResult, MailService, RawMail, TemplateMail, } from './service.ts';
|
|
11
|
+
export { createSmtpProvider, SMTP_TIMEOUT_MS } from './smtp.ts';
|
|
12
|
+
export type { SmtpProviderOptions } from './smtp.ts';
|
|
13
|
+
export { createMailTemplates, mailTemplateFiles } from './templates.ts';
|
|
14
|
+
export type { CreateMailTemplatesOptions, MailTemplateFiles, MailTemplates, RenderedMail, } from './templates.ts';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mail/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACnF,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACzF,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC9F,YAAY,EACV,wBAAwB,EACxB,UAAU,EACV,aAAa,EACb,UAAU,EACV,WAAW,EACX,OAAO,EACP,YAAY,GACb,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAChE,YAAY,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxE,YAAY,EACV,0BAA0B,EAC1B,iBAAiB,EACjB,aAAa,EACb,YAAY,GACb,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { BREVO_ENDPOINT, BREVO_TIMEOUT_MS, createBrevoProvider } from './brevo.js';
|
|
2
|
+
export { MAIL_CREDENTIALS_FILE, mailCredentialsPath, readMailCredentials, removeMailCredentials, writeMailCredentials, } from './credentials.js';
|
|
3
|
+
export { createMemoryMailProvider } from './memory.js';
|
|
4
|
+
export { MAIL_PROVIDERS } from './provider.js';
|
|
5
|
+
export { createMailService, DEFAULT_MAIL_ATTEMPTS, defaultMailBackoffMs } from './service.js';
|
|
6
|
+
export { createSmtpProvider, SMTP_TIMEOUT_MS } from './smtp.js';
|
|
7
|
+
export { createMailTemplates, mailTemplateFiles } from './templates.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mail/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEnF,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAQ/C,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAU9F,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEhE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { MailProvider, OutgoingMail } from './provider.ts';
|
|
2
|
+
/**
|
|
3
|
+
* A {@link MailProvider} that keeps every message instead of sending it.
|
|
4
|
+
*
|
|
5
|
+
* Exported from the package rather than hidden in a test directory, because
|
|
6
|
+
* every feature that emails needs one: a test of a password reset, a
|
|
7
|
+
* moderation notice or a contact form wants to read the message that would
|
|
8
|
+
* have gone out, and stubbing `fetch` or standing up an SMTP server to do that
|
|
9
|
+
* would be testing the provider all over again.
|
|
10
|
+
*
|
|
11
|
+
* Name it as `mailProvider` in the config and it wins outright over whatever
|
|
12
|
+
* `data/mail.json` and the settings say, exactly as a `commentChecker` does:
|
|
13
|
+
*
|
|
14
|
+
* ```ts
|
|
15
|
+
* const provider = createMemoryMailProvider();
|
|
16
|
+
* const cms = createCms({ mail: { provider } });
|
|
17
|
+
* // …
|
|
18
|
+
* assert.match(provider.sent[0].subject, /Reset your password/);
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
/** A provider that remembers, and can be told to fail. */
|
|
22
|
+
export interface MemoryMailProvider extends MailProvider {
|
|
23
|
+
/** Every message it was given, in the order they were sent. */
|
|
24
|
+
readonly sent: readonly OutgoingMail[];
|
|
25
|
+
/** Forget them all. */
|
|
26
|
+
clear(): void;
|
|
27
|
+
/**
|
|
28
|
+
* Refuse the next `count` messages, so a test can watch the service retry.
|
|
29
|
+
* A message refused is not a message sent: it never joins {@link sent}.
|
|
30
|
+
*/
|
|
31
|
+
failNext(count: number, error?: string): void;
|
|
32
|
+
}
|
|
33
|
+
/** Build one. */
|
|
34
|
+
export declare function createMemoryMailProvider(): MemoryMailProvider;
|
|
35
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/mail/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE9E;;;;;;;;;;;;;;;;;;GAkBG;AAEH,0DAA0D;AAC1D,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,+DAA+D;IAC/D,QAAQ,CAAC,IAAI,EAAE,SAAS,YAAY,EAAE,CAAC;IACvC,uBAAuB;IACvB,KAAK,IAAI,IAAI,CAAC;IACd;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/C;AAED,iBAAiB;AACjB,wBAAgB,wBAAwB,IAAI,kBAAkB,CA8B7D"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Build one. */
|
|
2
|
+
export function createMemoryMailProvider() {
|
|
3
|
+
const sent = [];
|
|
4
|
+
let failures = 0;
|
|
5
|
+
let failure = 'the memory mail provider was told to fail';
|
|
6
|
+
return {
|
|
7
|
+
name: 'memory',
|
|
8
|
+
sent,
|
|
9
|
+
clear() {
|
|
10
|
+
sent.length = 0;
|
|
11
|
+
},
|
|
12
|
+
failNext(count, error) {
|
|
13
|
+
failures = count;
|
|
14
|
+
if (error !== undefined)
|
|
15
|
+
failure = error;
|
|
16
|
+
},
|
|
17
|
+
deliver(message) {
|
|
18
|
+
if (failures > 0) {
|
|
19
|
+
failures -= 1;
|
|
20
|
+
return Promise.reject(new Error(failure));
|
|
21
|
+
}
|
|
22
|
+
sent.push(message);
|
|
23
|
+
// Ids that count from one, so a test can assert on the one it expects
|
|
24
|
+
// rather than on whatever a random generator produced.
|
|
25
|
+
return Promise.resolve({ messageId: `memory-${String(sent.length)}` });
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/mail/memory.ts"],"names":[],"mappings":"AAmCA,iBAAiB;AACjB,MAAM,UAAU,wBAAwB;IACtC,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,OAAO,GAAG,2CAA2C,CAAC;IAE1D,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,IAAI;QAEJ,KAAK;YACH,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAClB,CAAC;QAED,QAAQ,CAAC,KAAK,EAAE,KAAK;YACnB,QAAQ,GAAG,KAAK,CAAC;YACjB,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,GAAG,KAAK,CAAC;QAC3C,CAAC;QAED,OAAO,CAAC,OAAqB;YAC3B,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACjB,QAAQ,IAAI,CAAC,CAAC;gBACd,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5C,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnB,sEAAsE;YACtE,uDAAuD;YACvD,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,UAAU,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACzE,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The seam every way of sending email goes through.
|
|
3
|
+
*
|
|
4
|
+
* The CMS knows about mail services the way it knows about spam services
|
|
5
|
+
* (doc-6): one interface, and nothing else. Two implementations ship — Brevo's
|
|
6
|
+
* transactional API and plain SMTP through nodemailer — and a site may hand in
|
|
7
|
+
* its own, which is what {@link createMemoryMailProvider} is for in a test.
|
|
8
|
+
*
|
|
9
|
+
* A provider has exactly one job: hand this message to something that will
|
|
10
|
+
* carry it, and either say what it was given as an id or throw. It decides
|
|
11
|
+
* nothing about retries, queueing, templates or whether the site is configured
|
|
12
|
+
* to send at all; that is {@link MailService}'s, and keeping it there is what
|
|
13
|
+
* makes a second provider a file rather than a redesign.
|
|
14
|
+
*/
|
|
15
|
+
/** Which of the ways of sending a site has chosen. */
|
|
16
|
+
export type MailProviderName =
|
|
17
|
+
/** The site sends no mail. `send` is a logged no-op. */
|
|
18
|
+
'none'
|
|
19
|
+
/** Brevo's transactional HTTP API. */
|
|
20
|
+
| 'brevo'
|
|
21
|
+
/** Any SMTP server, through nodemailer. */
|
|
22
|
+
| 'smtp'
|
|
23
|
+
/** The in-memory provider a test observes. */
|
|
24
|
+
| 'memory';
|
|
25
|
+
/**
|
|
26
|
+
* The providers a site may choose on the settings screen, in the order the
|
|
27
|
+
* form offers them.
|
|
28
|
+
*
|
|
29
|
+
* `memory` is not among them: it is a test double a site names in its config,
|
|
30
|
+
* not something anybody should be able to switch a live site to from a form.
|
|
31
|
+
*/
|
|
32
|
+
export declare const MAIL_PROVIDERS: readonly MailProviderName[];
|
|
33
|
+
/** Somebody a message is from, to, or answered to. */
|
|
34
|
+
export interface MailAddress {
|
|
35
|
+
/** The address itself, `ada@example.com`. */
|
|
36
|
+
readonly address: string;
|
|
37
|
+
/** The display name, when there is one. */
|
|
38
|
+
readonly name?: string | undefined;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* One message, as a provider receives it: addresses settled, templates already
|
|
42
|
+
* rendered, nothing left to decide.
|
|
43
|
+
*/
|
|
44
|
+
export interface OutgoingMail {
|
|
45
|
+
/** Who it is from. */
|
|
46
|
+
readonly from: MailAddress;
|
|
47
|
+
/** Who it is to. At least one. */
|
|
48
|
+
readonly to: readonly MailAddress[];
|
|
49
|
+
/** Where a reply should go, when that is not the sender. */
|
|
50
|
+
readonly replyTo?: MailAddress | undefined;
|
|
51
|
+
/** The subject line. */
|
|
52
|
+
readonly subject: string;
|
|
53
|
+
/** The plain text body, which every message has. */
|
|
54
|
+
readonly text: string;
|
|
55
|
+
/** The HTML twin, when the template has one. */
|
|
56
|
+
readonly html?: string | undefined;
|
|
57
|
+
}
|
|
58
|
+
/** What a provider says about a message it accepted. */
|
|
59
|
+
export interface MailDelivery {
|
|
60
|
+
/**
|
|
61
|
+
* The id the provider gave it, when it gave one. It is what makes a message
|
|
62
|
+
* findable in the provider's own logs, which is the whole reason the service
|
|
63
|
+
* writes it down.
|
|
64
|
+
*/
|
|
65
|
+
readonly messageId?: string | undefined;
|
|
66
|
+
}
|
|
67
|
+
/** Something that carries a message. */
|
|
68
|
+
export interface MailProvider {
|
|
69
|
+
/** Which kind it is, for the log and for the settings screen. */
|
|
70
|
+
readonly name: MailProviderName;
|
|
71
|
+
/**
|
|
72
|
+
* Hand the message over.
|
|
73
|
+
*
|
|
74
|
+
* Throws when it was not accepted — a refusal, a timeout, a connection that
|
|
75
|
+
* would not open. The service catches it, logs it and decides whether to try
|
|
76
|
+
* again, so a provider never has to know how patient the site is.
|
|
77
|
+
*/
|
|
78
|
+
deliver(message: OutgoingMail): Promise<MailDelivery>;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/mail/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,sDAAsD;AACtD,MAAM,MAAM,gBAAgB;AAC1B,wDAAwD;AACtD,MAAM;AACR,sCAAsC;GACpC,OAAO;AACT,2CAA2C;GACzC,MAAM;AACR,8CAA8C;GAC5C,QAAQ,CAAC;AAEb;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,gBAAgB,EAA8B,CAAC;AAErF,sDAAsD;AACtD,MAAM,WAAW,WAAW;IAC1B,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,sBAAsB;IACtB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,kCAAkC;IAClC,QAAQ,CAAC,EAAE,EAAE,SAAS,WAAW,EAAE,CAAC;IACpC,4DAA4D;IAC5D,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC3C,wBAAwB;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,oDAAoD;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,wDAAwD;AACxD,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACzC;AAED,wCAAwC;AACxC,MAAM,WAAW,YAAY;IAC3B,iEAAiE;IACjE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC;;;;;;OAMG;IACH,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACvD"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The seam every way of sending email goes through.
|
|
3
|
+
*
|
|
4
|
+
* The CMS knows about mail services the way it knows about spam services
|
|
5
|
+
* (doc-6): one interface, and nothing else. Two implementations ship — Brevo's
|
|
6
|
+
* transactional API and plain SMTP through nodemailer — and a site may hand in
|
|
7
|
+
* its own, which is what {@link createMemoryMailProvider} is for in a test.
|
|
8
|
+
*
|
|
9
|
+
* A provider has exactly one job: hand this message to something that will
|
|
10
|
+
* carry it, and either say what it was given as an id or throw. It decides
|
|
11
|
+
* nothing about retries, queueing, templates or whether the site is configured
|
|
12
|
+
* to send at all; that is {@link MailService}'s, and keeping it there is what
|
|
13
|
+
* makes a second provider a file rather than a redesign.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* The providers a site may choose on the settings screen, in the order the
|
|
17
|
+
* form offers them.
|
|
18
|
+
*
|
|
19
|
+
* `memory` is not among them: it is a test double a site names in its config,
|
|
20
|
+
* not something anybody should be able to switch a live site to from a form.
|
|
21
|
+
*/
|
|
22
|
+
export const MAIL_PROVIDERS = ['none', 'brevo', 'smtp'];
|
|
23
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/mail/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAaH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAgC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC"}
|