@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/cache.d.ts
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
2
|
+
/**
|
|
3
|
+
* The one SQLite file a site has, and the rules for opening it.
|
|
4
|
+
*
|
|
5
|
+
* Everything in it is derived (decision-9): the content index is a reading of
|
|
6
|
+
* `content/`, the followers and the inbox indexes are a reading of
|
|
7
|
+
* `content/_data/federation/`, and what is left — sessions, delivery outcomes,
|
|
8
|
+
* the relay handshake, the scheduler's watermark — is a cache a site may lose.
|
|
9
|
+
* So the file may be deleted at rest, and this module is where that promise is
|
|
10
|
+
* kept: it owns the file's name, the migration ledger both stores keep inside
|
|
11
|
+
* it, and what happens when the file that is there cannot be used.
|
|
12
|
+
*/
|
|
13
|
+
/** File name of the derived database inside a site's data directory. */
|
|
14
|
+
export declare const DATABASE_FILE = "geekity.db";
|
|
15
|
+
/**
|
|
16
|
+
* The suffixes SQLite hangs off the database in WAL mode.
|
|
17
|
+
*
|
|
18
|
+
* Deleting the database without them leaves a write-ahead log describing a
|
|
19
|
+
* file that is no longer there, which the next connection would either replay
|
|
20
|
+
* into a fresh database or refuse; all three go together or none do.
|
|
21
|
+
*/
|
|
22
|
+
export declare const DATABASE_SUFFIXES: readonly string[];
|
|
23
|
+
/** Where the database lives under `dataDir`. */
|
|
24
|
+
export declare function databaseFile(dataDir: string): string;
|
|
25
|
+
/** Every file the database is spread across, whether or not it is there. */
|
|
26
|
+
export declare function databaseFiles(dataDir: string): string[];
|
|
27
|
+
/**
|
|
28
|
+
* Throw the database away, log and all.
|
|
29
|
+
*
|
|
30
|
+
* Silent about files that are not there, because that is the ordinary case for
|
|
31
|
+
* `-wal` and `-shm` after a clean shutdown, and because a site is entitled to
|
|
32
|
+
* delete the database itself between two boots.
|
|
33
|
+
*
|
|
34
|
+
* Nothing may hold the file open across this. An open connection keeps the
|
|
35
|
+
* inode it was given, so it would go on reading and writing a database nobody
|
|
36
|
+
* can find while the next connection creates a different one under the same
|
|
37
|
+
* name.
|
|
38
|
+
*/
|
|
39
|
+
export declare function discardDatabase(dataDir: string): void;
|
|
40
|
+
/**
|
|
41
|
+
* A database this package cannot use and must not throw away on its own.
|
|
42
|
+
*
|
|
43
|
+
* Two things raise it. A ledger holding a version this package does not ship
|
|
44
|
+
* is a downgrade: the file was written by a later `@geekity/cms`, whose schema
|
|
45
|
+
* this one would misread. A file SQLite will not open at all is damaged. In
|
|
46
|
+
* both cases the way out is a decision only a person can make, and the message
|
|
47
|
+
* names it — which is what {@link discardDatabase} and `geekity rebuild` are.
|
|
48
|
+
*/
|
|
49
|
+
export declare class UnusableDatabaseError extends Error {
|
|
50
|
+
constructor(message: string);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* A database older than the migrations this package still ships, so there is
|
|
54
|
+
* no path forward from it.
|
|
55
|
+
*
|
|
56
|
+
* Unlike {@link UnusableDatabaseError} this one is recoverable without asking
|
|
57
|
+
* anybody, and {@link withRebuiltDatabase} recovers from it: nothing in the
|
|
58
|
+
* database is anything but a reading of the files, so a version of it too old
|
|
59
|
+
* to carry forward is thrown away and read again.
|
|
60
|
+
*/
|
|
61
|
+
export declare class OutdatedDatabaseError extends Error {
|
|
62
|
+
constructor(message: string);
|
|
63
|
+
}
|
|
64
|
+
/** One schema version. */
|
|
65
|
+
export interface Migration {
|
|
66
|
+
/** Its place in the order, and its entry in the ledger. */
|
|
67
|
+
version: number;
|
|
68
|
+
/** The schema change itself. */
|
|
69
|
+
sql: string;
|
|
70
|
+
/**
|
|
71
|
+
* A backfill, run in the same transaction once {@link Migration.sql} has.
|
|
72
|
+
*
|
|
73
|
+
* For a column derived from something already stored: SQL can add the column
|
|
74
|
+
* and JavaScript can then fill it with exactly what the writer will put
|
|
75
|
+
* there, rather than with a second, subtly different expression of the same
|
|
76
|
+
* rule.
|
|
77
|
+
*/
|
|
78
|
+
run?: (db: DatabaseSync) => void;
|
|
79
|
+
}
|
|
80
|
+
/** One set of migrations and the table recording which of them have run. */
|
|
81
|
+
export interface MigrationLedger {
|
|
82
|
+
/** The database file, so a refusal can name it. */
|
|
83
|
+
file: string;
|
|
84
|
+
/** The table the applied versions are recorded in. */
|
|
85
|
+
ledger: string;
|
|
86
|
+
/** Every version this package ships, in order. */
|
|
87
|
+
migrations: readonly Migration[];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Bring one ledger's schema up to date, or refuse to.
|
|
91
|
+
*
|
|
92
|
+
* There are two ledgers in the one file — `migrations` for the content index
|
|
93
|
+
* and `admin_migrations` for everything else — because the two stores were
|
|
94
|
+
* written apart and each ships its own versions. They share this loop, and so
|
|
95
|
+
* share what happens when the versions in the file are not the versions in the
|
|
96
|
+
* package:
|
|
97
|
+
*
|
|
98
|
+
* - **Ahead of us.** A version recorded that this package does not ship means
|
|
99
|
+
* a newer `@geekity/cms` wrote the file. Applying our own migrations over it
|
|
100
|
+
* would be reading somebody else's schema as if it were ours, so this
|
|
101
|
+
* refuses, names the file and says both ways out.
|
|
102
|
+
* - **Behind what we can carry.** A newest version below the oldest migration
|
|
103
|
+
* still shipped means the steps in between have been pruned from the package
|
|
104
|
+
* and there is no path from that schema to this one. That is
|
|
105
|
+
* {@link OutdatedDatabaseError}, and the caller is expected to throw the
|
|
106
|
+
* database away rather than to stop.
|
|
107
|
+
* - **Empty.** A new database, whatever the oldest shipped version is.
|
|
108
|
+
*
|
|
109
|
+
* Applying is idempotent, and each migration is its own transaction, so a
|
|
110
|
+
* failure part-way leaves the ledger describing exactly the schema on disk.
|
|
111
|
+
*/
|
|
112
|
+
export declare function applyMigrations(db: DatabaseSync, ledger: MigrationLedger): void;
|
|
113
|
+
/** What {@link openDatabase} needs: where the file is and which ledger to run. */
|
|
114
|
+
export interface OpenDatabaseOptions extends Omit<MigrationLedger, 'file'> {
|
|
115
|
+
/** Directory the database lives in. Created if it is missing. */
|
|
116
|
+
dataDir: string;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Open the database under `dataDir`, creating it if it is not there, and bring
|
|
120
|
+
* one ledger up to date.
|
|
121
|
+
*
|
|
122
|
+
* A database that will not open is turned into an {@link UnusableDatabaseError}
|
|
123
|
+
* naming the file, because SQLite's own message for it ("file is not a
|
|
124
|
+
* database") says nothing about which file or what to do about it, and this is
|
|
125
|
+
* the failure a site is most likely to meet at three in the morning.
|
|
126
|
+
* {@link OutdatedDatabaseError} passes through untouched: it is the one the
|
|
127
|
+
* caller is meant to recover from.
|
|
128
|
+
*/
|
|
129
|
+
export declare function openDatabase(options: OpenDatabaseOptions): DatabaseSync;
|
|
130
|
+
/**
|
|
131
|
+
* Open the cache, and if the only thing wrong with it is its age, throw it away
|
|
132
|
+
* and open it again.
|
|
133
|
+
*
|
|
134
|
+
* `open` has to be able to run twice, and has to have closed whatever it
|
|
135
|
+
* opened before it throws: the file cannot be deleted while a connection holds
|
|
136
|
+
* it. It is a callback rather than a database because a site's boot opens two
|
|
137
|
+
* connections against the one file, and both of them, or neither, must be over
|
|
138
|
+
* the database that survives.
|
|
139
|
+
*/
|
|
140
|
+
export declare function withRebuiltDatabase<T>(dataDir: string, open: () => T): T;
|
|
141
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;;;;GAUG;AAEH,wEAAwE;AACxE,eAAO,MAAM,aAAa,eAAe,CAAC;AAE1C;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAAyB,CAAC;AAEzE,gDAAgD;AAChD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAErD;AAED;;;;;;;;GAQG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED;;;;;;;;GAQG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED,0BAA0B;AAC1B,MAAM,WAAW,SAAS;IACxB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;;;OAOG;IACH,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,YAAY,KAAK,IAAI,CAAC;CAClC;AAED,4EAA4E;AAC5E,MAAM,WAAW,eAAe;IAC9B,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,UAAU,EAAE,SAAS,SAAS,EAAE,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAqD/E;AAED,kFAAkF;AAClF,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC;IACxE,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAuBvE;AAYD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAQxE"}
|
package/dist/cache.js
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { mkdirSync, rmSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
4
|
+
/**
|
|
5
|
+
* The one SQLite file a site has, and the rules for opening it.
|
|
6
|
+
*
|
|
7
|
+
* Everything in it is derived (decision-9): the content index is a reading of
|
|
8
|
+
* `content/`, the followers and the inbox indexes are a reading of
|
|
9
|
+
* `content/_data/federation/`, and what is left — sessions, delivery outcomes,
|
|
10
|
+
* the relay handshake, the scheduler's watermark — is a cache a site may lose.
|
|
11
|
+
* So the file may be deleted at rest, and this module is where that promise is
|
|
12
|
+
* kept: it owns the file's name, the migration ledger both stores keep inside
|
|
13
|
+
* it, and what happens when the file that is there cannot be used.
|
|
14
|
+
*/
|
|
15
|
+
/** File name of the derived database inside a site's data directory. */
|
|
16
|
+
export const DATABASE_FILE = 'geekity.db';
|
|
17
|
+
/**
|
|
18
|
+
* The suffixes SQLite hangs off the database in WAL mode.
|
|
19
|
+
*
|
|
20
|
+
* Deleting the database without them leaves a write-ahead log describing a
|
|
21
|
+
* file that is no longer there, which the next connection would either replay
|
|
22
|
+
* into a fresh database or refuse; all three go together or none do.
|
|
23
|
+
*/
|
|
24
|
+
export const DATABASE_SUFFIXES = ['', '-wal', '-shm'];
|
|
25
|
+
/** Where the database lives under `dataDir`. */
|
|
26
|
+
export function databaseFile(dataDir) {
|
|
27
|
+
return path.join(dataDir, DATABASE_FILE);
|
|
28
|
+
}
|
|
29
|
+
/** Every file the database is spread across, whether or not it is there. */
|
|
30
|
+
export function databaseFiles(dataDir) {
|
|
31
|
+
return DATABASE_SUFFIXES.map((suffix) => `${databaseFile(dataDir)}${suffix}`);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Throw the database away, log and all.
|
|
35
|
+
*
|
|
36
|
+
* Silent about files that are not there, because that is the ordinary case for
|
|
37
|
+
* `-wal` and `-shm` after a clean shutdown, and because a site is entitled to
|
|
38
|
+
* delete the database itself between two boots.
|
|
39
|
+
*
|
|
40
|
+
* Nothing may hold the file open across this. An open connection keeps the
|
|
41
|
+
* inode it was given, so it would go on reading and writing a database nobody
|
|
42
|
+
* can find while the next connection creates a different one under the same
|
|
43
|
+
* name.
|
|
44
|
+
*/
|
|
45
|
+
export function discardDatabase(dataDir) {
|
|
46
|
+
for (const file of databaseFiles(dataDir))
|
|
47
|
+
rmSync(file, { force: true });
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* A database this package cannot use and must not throw away on its own.
|
|
51
|
+
*
|
|
52
|
+
* Two things raise it. A ledger holding a version this package does not ship
|
|
53
|
+
* is a downgrade: the file was written by a later `@geekity/cms`, whose schema
|
|
54
|
+
* this one would misread. A file SQLite will not open at all is damaged. In
|
|
55
|
+
* both cases the way out is a decision only a person can make, and the message
|
|
56
|
+
* names it — which is what {@link discardDatabase} and `geekity rebuild` are.
|
|
57
|
+
*/
|
|
58
|
+
export class UnusableDatabaseError extends Error {
|
|
59
|
+
constructor(message) {
|
|
60
|
+
super(message);
|
|
61
|
+
this.name = 'UnusableDatabaseError';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* A database older than the migrations this package still ships, so there is
|
|
66
|
+
* no path forward from it.
|
|
67
|
+
*
|
|
68
|
+
* Unlike {@link UnusableDatabaseError} this one is recoverable without asking
|
|
69
|
+
* anybody, and {@link withRebuiltDatabase} recovers from it: nothing in the
|
|
70
|
+
* database is anything but a reading of the files, so a version of it too old
|
|
71
|
+
* to carry forward is thrown away and read again.
|
|
72
|
+
*/
|
|
73
|
+
export class OutdatedDatabaseError extends Error {
|
|
74
|
+
constructor(message) {
|
|
75
|
+
super(message);
|
|
76
|
+
this.name = 'OutdatedDatabaseError';
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Bring one ledger's schema up to date, or refuse to.
|
|
81
|
+
*
|
|
82
|
+
* There are two ledgers in the one file — `migrations` for the content index
|
|
83
|
+
* and `admin_migrations` for everything else — because the two stores were
|
|
84
|
+
* written apart and each ships its own versions. They share this loop, and so
|
|
85
|
+
* share what happens when the versions in the file are not the versions in the
|
|
86
|
+
* package:
|
|
87
|
+
*
|
|
88
|
+
* - **Ahead of us.** A version recorded that this package does not ship means
|
|
89
|
+
* a newer `@geekity/cms` wrote the file. Applying our own migrations over it
|
|
90
|
+
* would be reading somebody else's schema as if it were ours, so this
|
|
91
|
+
* refuses, names the file and says both ways out.
|
|
92
|
+
* - **Behind what we can carry.** A newest version below the oldest migration
|
|
93
|
+
* still shipped means the steps in between have been pruned from the package
|
|
94
|
+
* and there is no path from that schema to this one. That is
|
|
95
|
+
* {@link OutdatedDatabaseError}, and the caller is expected to throw the
|
|
96
|
+
* database away rather than to stop.
|
|
97
|
+
* - **Empty.** A new database, whatever the oldest shipped version is.
|
|
98
|
+
*
|
|
99
|
+
* Applying is idempotent, and each migration is its own transaction, so a
|
|
100
|
+
* failure part-way leaves the ledger describing exactly the schema on disk.
|
|
101
|
+
*/
|
|
102
|
+
export function applyMigrations(db, ledger) {
|
|
103
|
+
db.exec(`
|
|
104
|
+
CREATE TABLE IF NOT EXISTS ${ledger.ledger} (
|
|
105
|
+
version INTEGER PRIMARY KEY,
|
|
106
|
+
applied_at TEXT NOT NULL
|
|
107
|
+
)
|
|
108
|
+
`);
|
|
109
|
+
const applied = new Set(db
|
|
110
|
+
.prepare(`SELECT version FROM ${ledger.ledger}`)
|
|
111
|
+
.all()
|
|
112
|
+
.map((row) => Number(row['version'])));
|
|
113
|
+
const shipped = new Set(ledger.migrations.map((migration) => migration.version));
|
|
114
|
+
const latest = Math.max(...shipped);
|
|
115
|
+
const ahead = [...applied].filter((version) => version > latest).sort((a, b) => a - b);
|
|
116
|
+
if (ahead.length > 0) {
|
|
117
|
+
throw new UnusableDatabaseError(`${ledger.file} was written by a newer version of @geekity/cms: its ${ledger.ledger} ` +
|
|
118
|
+
`table records schema ${ahead.join(', ')}, which this version does not ship. Upgrade ` +
|
|
119
|
+
'@geekity/cms to the version that wrote it, or delete the database with `geekity ' +
|
|
120
|
+
'rebuild` — it holds nothing that is not read back from content/ and data/.');
|
|
121
|
+
}
|
|
122
|
+
const oldest = Math.min(...shipped);
|
|
123
|
+
const newest = applied.size === 0 ? undefined : Math.max(...applied);
|
|
124
|
+
if (newest !== undefined && newest < oldest - 1) {
|
|
125
|
+
throw new OutdatedDatabaseError(`${ledger.file} is at schema ${String(newest)}, and the oldest migration this version of ` +
|
|
126
|
+
`@geekity/cms ships is ${String(oldest)}, so there is no path forward from it.`);
|
|
127
|
+
}
|
|
128
|
+
const record = db.prepare(`INSERT INTO ${ledger.ledger} (version, applied_at) VALUES (?, ?)`);
|
|
129
|
+
for (const migration of ledger.migrations) {
|
|
130
|
+
if (applied.has(migration.version))
|
|
131
|
+
continue;
|
|
132
|
+
db.exec('BEGIN');
|
|
133
|
+
try {
|
|
134
|
+
db.exec(migration.sql);
|
|
135
|
+
migration.run?.(db);
|
|
136
|
+
record.run(migration.version, new Date().toISOString());
|
|
137
|
+
db.exec('COMMIT');
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
db.exec('ROLLBACK');
|
|
141
|
+
throw error;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Open the database under `dataDir`, creating it if it is not there, and bring
|
|
147
|
+
* one ledger up to date.
|
|
148
|
+
*
|
|
149
|
+
* A database that will not open is turned into an {@link UnusableDatabaseError}
|
|
150
|
+
* naming the file, because SQLite's own message for it ("file is not a
|
|
151
|
+
* database") says nothing about which file or what to do about it, and this is
|
|
152
|
+
* the failure a site is most likely to meet at three in the morning.
|
|
153
|
+
* {@link OutdatedDatabaseError} passes through untouched: it is the one the
|
|
154
|
+
* caller is meant to recover from.
|
|
155
|
+
*/
|
|
156
|
+
export function openDatabase(options) {
|
|
157
|
+
const file = databaseFile(options.dataDir);
|
|
158
|
+
mkdirSync(options.dataDir, { recursive: true });
|
|
159
|
+
let db;
|
|
160
|
+
try {
|
|
161
|
+
db = new DatabaseSync(file);
|
|
162
|
+
db.exec('PRAGMA journal_mode = WAL');
|
|
163
|
+
db.exec('PRAGMA foreign_keys = ON');
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
throw unusable(file, error);
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
applyMigrations(db, { file, ledger: options.ledger, migrations: options.migrations });
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
db.close();
|
|
173
|
+
if (error instanceof UnusableDatabaseError || error instanceof OutdatedDatabaseError)
|
|
174
|
+
throw error;
|
|
175
|
+
throw unusable(file, error);
|
|
176
|
+
}
|
|
177
|
+
return db;
|
|
178
|
+
}
|
|
179
|
+
/** A SQLite failure, said in terms of the file and the way out. */
|
|
180
|
+
function unusable(file, error) {
|
|
181
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
182
|
+
return new UnusableDatabaseError(`${file} could not be opened as a database (${detail}). It holds nothing that is not read ` +
|
|
183
|
+
'back from content/ and data/, so the fix is to delete it: run `geekity rebuild`, or ' +
|
|
184
|
+
'remove the file and its -wal and -shm siblings and start the site again.');
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Open the cache, and if the only thing wrong with it is its age, throw it away
|
|
188
|
+
* and open it again.
|
|
189
|
+
*
|
|
190
|
+
* `open` has to be able to run twice, and has to have closed whatever it
|
|
191
|
+
* opened before it throws: the file cannot be deleted while a connection holds
|
|
192
|
+
* it. It is a callback rather than a database because a site's boot opens two
|
|
193
|
+
* connections against the one file, and both of them, or neither, must be over
|
|
194
|
+
* the database that survives.
|
|
195
|
+
*/
|
|
196
|
+
export function withRebuiltDatabase(dataDir, open) {
|
|
197
|
+
try {
|
|
198
|
+
return open();
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
if (!(error instanceof OutdatedDatabaseError))
|
|
202
|
+
throw error;
|
|
203
|
+
discardDatabase(dataDir);
|
|
204
|
+
return open();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import type { GeekityConfig } from './config.ts';
|
|
3
|
-
export type Command = 'serve' | 'init' | 'sync' | 'user' | 'help' | 'version';
|
|
3
|
+
export type Command = 'serve' | 'init' | 'sync' | 'rebuild' | 'user' | 'import' | 'help' | 'version';
|
|
4
4
|
export interface ParsedArgs {
|
|
5
5
|
command: Command;
|
|
6
6
|
/** Path to the config file, relative to the working directory, if the user named one. */
|
|
@@ -11,9 +11,21 @@ export interface ParsedArgs {
|
|
|
11
11
|
* refused by the password rules rather than by the parser.
|
|
12
12
|
*/
|
|
13
13
|
password: string | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* The email address `user add` was given, if any. `undefined` is a user with
|
|
16
|
+
* no address, which is the ordinary case: an email is optional on a user and
|
|
17
|
+
* only buys password recovery and the notices TASK-55 sends.
|
|
18
|
+
*/
|
|
19
|
+
email: string | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* Every other option that was given: {@link VALUE_FLAGS} as the text after
|
|
22
|
+
* them, {@link SWITCH_FLAGS} as `true`. Empty for a command that takes none.
|
|
23
|
+
*/
|
|
24
|
+
flags: Readonly<Record<string, string | true>>;
|
|
14
25
|
/**
|
|
15
26
|
* Positional arguments after the command: the directory for `init`, the
|
|
16
|
-
* subcommand and its arguments for `user`. Flags are never in
|
|
27
|
+
* subcommand and its arguments for `user` and `import`. Flags are never in
|
|
28
|
+
* here.
|
|
17
29
|
*/
|
|
18
30
|
args: readonly string[];
|
|
19
31
|
}
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAmBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,MAAM,MAAM,OAAO,GACjB,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAyBjF,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,yFAAyF;IACzF,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B;;;;OAIG;IACH,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B;;;OAGG;IACH,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IAC/C;;;;OAIG;IACH,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CACzB;AAmED,kFAAkF;AAClF,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CAsH7D;AASD;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,aAAa,CAAC,CAyBxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAW3D;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAe7F;AAwhBD,gEAAgE;AAChE,KAAK,aAAa,GAAG,MAAM,CAAC,cAAc,GAAG;IAC3C,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;CACzC,CAAC;AAEF,0EAA0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,oEAAoE;IACpE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,4FAA4F;IAC5F,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC/B,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4CrF"}
|