@geekity/cms 0.3.0 → 0.4.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 +2091 -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/pages/documents/editor.njk +196 -0
- 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/media/library.njk +160 -0
- package/admin/pages/messages/all.njk +110 -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/federation.njk +75 -0
- package/admin/pages/settings/general.njk +29 -0
- package/admin/pages/settings/permalinks.njk +50 -0
- package/admin/pages/settings/reading.njk +72 -0
- package/admin/pages/users/edit.njk +239 -0
- package/admin/pages/users/list.njk +48 -0
- package/admin/pages/users/new.njk +41 -0
- package/admin/static/admin.css +498 -3
- package/admin/static/copy.js +52 -0
- package/admin/static/editor.js +16 -16
- package/admin/static/slug.js +61 -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 +127 -10
- package/dist/admin/documents.d.ts.map +1 -1
- package/dist/admin/documents.js +360 -41
- package/dist/admin/documents.js.map +1 -1
- package/dist/admin/federation.d.ts +151 -50
- package/dist/admin/federation.d.ts.map +1 -1
- package/dist/admin/federation.js +225 -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 +126 -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/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 +155 -105
- package/dist/admin/routes.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 +39 -0
- package/dist/admin/settings-federation.d.ts.map +1 -0
- package/dist/admin/settings-federation.js +103 -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 +102 -0
- package/dist/admin/settings-page.d.ts.map +1 -0
- package/dist/admin/settings-page.js +126 -0
- package/dist/admin/settings-page.js.map +1 -0
- package/dist/admin/settings-pages.d.ts +19 -0
- package/dist/admin/settings-pages.d.ts.map +1 -0
- package/dist/admin/settings-pages.js +33 -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 +33 -0
- package/dist/admin/settings-reading.d.ts.map +1 -0
- package/dist/admin/settings-reading.js +48 -0
- package/dist/admin/settings-reading.js.map +1 -0
- package/dist/admin/settings.d.ts +325 -96
- package/dist/admin/settings.d.ts.map +1 -1
- package/dist/admin/settings.js +650 -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 +44 -14
- package/dist/admin/templates.d.ts.map +1 -1
- package/dist/admin/templates.js +44 -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/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 +424 -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 +75 -0
- package/dist/comments/form.d.ts.map +1 -0
- package/dist/comments/form.js +64 -0
- package/dist/comments/form.js.map +1 -0
- package/dist/comments/index.d.ts +15 -0
- package/dist/comments/index.d.ts.map +1 -0
- package/dist/comments/index.js +9 -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 +58 -0
- package/dist/comments/routes.d.ts.map +1 -0
- package/dist/comments/routes.js +177 -0
- package/dist/comments/routes.js.map +1 -0
- package/dist/comments/submission.d.ts +263 -0
- package/dist/comments/submission.d.ts.map +1 -0
- package/dist/comments/submission.js +241 -0
- package/dist/comments/submission.js.map +1 -0
- package/dist/config.d.ts +190 -5
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +118 -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 +202 -7
- package/dist/content/store.d.ts.map +1 -1
- package/dist/content/store.js +374 -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 +58 -4
- 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 +42 -10
- package/dist/federation/mount.d.ts.map +1 -1
- package/dist/federation/mount.js +266 -26
- 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 +327 -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 +73 -0
- package/dist/web/navigation.d.ts.map +1 -0
- package/dist/web/navigation.js +110 -0
- package/dist/web/navigation.js.map +1 -0
- package/dist/web/negotiate.d.ts +9 -0
- package/dist/web/negotiate.d.ts.map +1 -1
- package/dist/web/negotiate.js +6 -1
- 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 +197 -9
- package/dist/web/render.d.ts.map +1 -1
- package/dist/web/render.js +334 -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 +845 -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 +205 -0
- package/dist/web/themes.d.ts.map +1 -0
- package/dist/web/themes.js +277 -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 +1 -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 +1096 -50
- package/themes/default/layouts/404.njk +2 -3
- package/themes/default/layouts/author.njk +37 -0
- package/themes/default/layouts/base.njk +172 -31
- package/themes/default/layouts/category.njk +27 -0
- package/themes/default/layouts/front-page.njk +57 -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 +77 -0
- package/themes/default/partials/comment-form.njk +109 -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/pagination.njk +12 -6
- package/themes/default/partials/post-list.njk +51 -18
- package/themes/default/partials/search-form.njk +17 -0
- package/themes/default/partials/tags.njk +26 -5
- package/themes/default/static/highlight.js +4 -0
- package/themes/default/static/style.css +1119 -194
- package/themes/default/theme.json +5 -0
- package/admin/layouts/document-editor.njk +0 -167
- 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
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
import { actorHandle, replyFrom, REPLY_ACTIVITY_TYPE } from '../federation/replies.js';
|
|
2
|
+
import { activityStreamsId, isPublicDocument } from './documents.js';
|
|
3
|
+
import { absoluteUrl } from './negotiate.js';
|
|
4
|
+
import { sanitizeCommentHtml } from './sanitize.js';
|
|
5
|
+
/**
|
|
6
|
+
* The reader over one site's two indexes.
|
|
7
|
+
*
|
|
8
|
+
* The methods are properties rather than prototype methods so that one of them
|
|
9
|
+
* can be handed out on its own — the renderer is given `conversation.thread`
|
|
10
|
+
* and nothing else — without anybody having to wrap it in a closure to keep
|
|
11
|
+
* `this`.
|
|
12
|
+
*/
|
|
13
|
+
export function createConversation(context) {
|
|
14
|
+
return {
|
|
15
|
+
thread: (document) => postConversation(context, document),
|
|
16
|
+
counts: (documents) => commentCounts(context, documents),
|
|
17
|
+
latest: (limit) => siteConversation(context, limit),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** A conversation with nothing in it, which is what most posts have. */
|
|
21
|
+
const NOTHING = {
|
|
22
|
+
replies: [],
|
|
23
|
+
likes: [],
|
|
24
|
+
boosts: [],
|
|
25
|
+
mentions: [],
|
|
26
|
+
counts: { replies: 0, likes: 0, boosts: 0, mentions: 0, total: 0 },
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* The conversation under one post: everything said about it, from every source
|
|
30
|
+
* the site has, threaded into one.
|
|
31
|
+
*
|
|
32
|
+
* A post that has never been delivered has no ActivityStreams id and so can
|
|
33
|
+
* have no fediverse replies — nothing out there has a name for it yet — but it
|
|
34
|
+
* can still have native comments, which hang off its permalink instead.
|
|
35
|
+
*/
|
|
36
|
+
function postConversation(context, document) {
|
|
37
|
+
const objectId = activityStreamsId(document, context.baseUrl);
|
|
38
|
+
// What a top-level answer names. The object id when the post has one, and
|
|
39
|
+
// the permalink otherwise: a post that has never been delivered can still
|
|
40
|
+
// have native comments, and they have to hang off something.
|
|
41
|
+
const root = objectId ?? document.permalink;
|
|
42
|
+
const activities = objectId === undefined ? [] : activitiesAround(context.admin, objectId);
|
|
43
|
+
const native = approvedComments(context.admin, document);
|
|
44
|
+
if (activities.length === 0 && native.length === 0)
|
|
45
|
+
return NOTHING;
|
|
46
|
+
const naming = authorNaming(context.admin);
|
|
47
|
+
const withdrawn = withdrawnBy(activities);
|
|
48
|
+
const written = [];
|
|
49
|
+
const likes = [];
|
|
50
|
+
const boosts = [];
|
|
51
|
+
const mentions = [];
|
|
52
|
+
const reacted = new Set();
|
|
53
|
+
for (const activity of activities) {
|
|
54
|
+
const kind = REACTIONS[activity.activityType];
|
|
55
|
+
if (kind !== undefined) {
|
|
56
|
+
// Only a reaction to the post itself: a like of one of the replies
|
|
57
|
+
// belongs to that reply's own conversation, wherever it is shown.
|
|
58
|
+
if (activity.objectId !== objectId)
|
|
59
|
+
continue;
|
|
60
|
+
// One like per actor, however many times it was delivered, and none at
|
|
61
|
+
// all once its actor has taken it back.
|
|
62
|
+
const key = `${kind}\0${activity.actorId}`;
|
|
63
|
+
if (reacted.has(key))
|
|
64
|
+
continue;
|
|
65
|
+
if (activity.activityId !== null && withdrawn.has(activity.activityId))
|
|
66
|
+
continue;
|
|
67
|
+
reacted.add(key);
|
|
68
|
+
const author = naming(activity.actorId);
|
|
69
|
+
(kind === 'like' ? likes : boosts).push({
|
|
70
|
+
id: activity.activityId ?? `${activity.actorId}#${kind}`,
|
|
71
|
+
source: 'activitypub',
|
|
72
|
+
kind,
|
|
73
|
+
author,
|
|
74
|
+
url: author.url,
|
|
75
|
+
content: '',
|
|
76
|
+
published: new Date(activity.receivedAt),
|
|
77
|
+
inReplyTo: null,
|
|
78
|
+
status: 'published',
|
|
79
|
+
replies: [],
|
|
80
|
+
});
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const reply = replyFrom(activity);
|
|
84
|
+
if (reply === undefined)
|
|
85
|
+
continue;
|
|
86
|
+
written.push(federatedInteraction(reply, naming(activity.actorId)));
|
|
87
|
+
}
|
|
88
|
+
for (const comment of native) {
|
|
89
|
+
// A repost joins the boosts, because a reader looking at the page is being
|
|
90
|
+
// told the same thing by both; a mention is its own group, because it is
|
|
91
|
+
// neither an answer nor a reaction.
|
|
92
|
+
const group = comment.kind === 'reply'
|
|
93
|
+
? written
|
|
94
|
+
: comment.kind === 'like'
|
|
95
|
+
? likes
|
|
96
|
+
: comment.kind === 'mention'
|
|
97
|
+
? mentions
|
|
98
|
+
: boosts;
|
|
99
|
+
group.push({ ...comment, replies: [] });
|
|
100
|
+
}
|
|
101
|
+
// Sorted before threading rather than after, because a thread is built by
|
|
102
|
+
// walking this list: two sources' entries would otherwise interleave in the
|
|
103
|
+
// order the code happened to read them rather than in the order they were
|
|
104
|
+
// written.
|
|
105
|
+
written.sort(byPublished);
|
|
106
|
+
const replies = threadOf(written, root, withdrawn);
|
|
107
|
+
sortThread(replies);
|
|
108
|
+
likes.sort(byPublished);
|
|
109
|
+
boosts.sort(byPublished);
|
|
110
|
+
mentions.sort(byPublished);
|
|
111
|
+
const counted = countReplies(replies);
|
|
112
|
+
return {
|
|
113
|
+
replies,
|
|
114
|
+
likes,
|
|
115
|
+
boosts,
|
|
116
|
+
mentions,
|
|
117
|
+
counts: {
|
|
118
|
+
replies: counted,
|
|
119
|
+
likes: likes.length,
|
|
120
|
+
boosts: boosts.length,
|
|
121
|
+
mentions: mentions.length,
|
|
122
|
+
total: counted + likes.length + boosts.length + mentions.length,
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* The whole site's latest answers, newest first, each with its post.
|
|
128
|
+
*
|
|
129
|
+
* Read per source and merged rather than threaded: a site-wide list is a list
|
|
130
|
+
* of what has just been said, and an answer to an answer is as much news as an
|
|
131
|
+
* answer to a post. Both sides are over-read for the same reason — one about a
|
|
132
|
+
* post that has since been unpublished is dropped after the index has already
|
|
133
|
+
* counted it — and the merged list is cut to size at the end.
|
|
134
|
+
*/
|
|
135
|
+
function siteConversation(context, limit) {
|
|
136
|
+
const naming = authorNaming(context.admin);
|
|
137
|
+
const posts = new PostsByObjectId(context);
|
|
138
|
+
const said = [];
|
|
139
|
+
for (let offset = 0; said.length < limit;) {
|
|
140
|
+
const page = context.admin.listReplies({ limit: limit * OVERSCAN, offset });
|
|
141
|
+
if (page.length === 0)
|
|
142
|
+
break;
|
|
143
|
+
offset += page.length;
|
|
144
|
+
for (const activity of page) {
|
|
145
|
+
const reply = replyFrom(activity);
|
|
146
|
+
if (reply === undefined)
|
|
147
|
+
continue;
|
|
148
|
+
const post = posts.get(reply.inReplyTo);
|
|
149
|
+
if (post === undefined)
|
|
150
|
+
continue;
|
|
151
|
+
said.push({ ...federatedInteraction(reply, naming(activity.actorId)), post });
|
|
152
|
+
if (said.length === limit)
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
for (const stored of context.admin.listComments({
|
|
157
|
+
status: 'approved',
|
|
158
|
+
limit: limit * OVERSCAN,
|
|
159
|
+
})) {
|
|
160
|
+
const post = context.store.getBySlug(stored.slug);
|
|
161
|
+
if (post === undefined || !isPublicDocument(post, context.store.now()))
|
|
162
|
+
continue;
|
|
163
|
+
said.push({ ...interactionOf(stored, post.permalink), post });
|
|
164
|
+
}
|
|
165
|
+
return newestFirst(said, limit);
|
|
166
|
+
}
|
|
167
|
+
/** How many answers each of these posts has, by permalink. */
|
|
168
|
+
function commentCounts(context, documents) {
|
|
169
|
+
const counts = new Map();
|
|
170
|
+
for (const document of documents) {
|
|
171
|
+
const objectId = activityStreamsId(document, context.baseUrl);
|
|
172
|
+
const federated = objectId === undefined ? 0 : context.admin.countRepliesTo(objectId);
|
|
173
|
+
counts.set(document.permalink, federated + context.admin.countCommentsFor(document.slug, 'approved'));
|
|
174
|
+
}
|
|
175
|
+
return counts;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* How many candidates a site-wide page reads for each one it keeps.
|
|
179
|
+
*
|
|
180
|
+
* Answers to a post that has since been unpublished are dropped after the
|
|
181
|
+
* index has already counted them, so the query has to over-read. Four is
|
|
182
|
+
* generous for a site whose posts mostly stay published and bounded for one
|
|
183
|
+
* whose posts do not.
|
|
184
|
+
*/
|
|
185
|
+
const OVERSCAN = 4;
|
|
186
|
+
/** One logged fediverse reply as the thread's own shape. */
|
|
187
|
+
function federatedInteraction(reply, author) {
|
|
188
|
+
return {
|
|
189
|
+
id: reply.id,
|
|
190
|
+
source: 'activitypub',
|
|
191
|
+
kind: 'reply',
|
|
192
|
+
author,
|
|
193
|
+
url: reply.url,
|
|
194
|
+
// Sanitised here, at the edge of the site, so the page and the feed
|
|
195
|
+
// republish the same checked markup rather than each checking for itself.
|
|
196
|
+
content: sanitizeCommentHtml(reply.html),
|
|
197
|
+
published: reply.published,
|
|
198
|
+
inReplyTo: reply.inReplyTo,
|
|
199
|
+
status: 'published',
|
|
200
|
+
replies: [],
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* The approved native comments on a post, as interactions, oldest first.
|
|
205
|
+
*
|
|
206
|
+
* Only approved ones. A comment waiting for a moderator and one filed as spam
|
|
207
|
+
* are both in the file and both in the index, and neither is anything a reader
|
|
208
|
+
* should be shown — which is the whole difference between this and what the
|
|
209
|
+
* moderation screen asks for.
|
|
210
|
+
*/
|
|
211
|
+
function approvedComments(admin, document) {
|
|
212
|
+
return admin
|
|
213
|
+
.listCommentsFor(document.slug)
|
|
214
|
+
.filter((comment) => comment.status === 'approved')
|
|
215
|
+
.map((comment) => interactionOf(comment, document.permalink));
|
|
216
|
+
}
|
|
217
|
+
/** One stored comment as the thread's own shape. */
|
|
218
|
+
function interactionOf(comment, permalink) {
|
|
219
|
+
return {
|
|
220
|
+
id: comment.id,
|
|
221
|
+
source: comment.source,
|
|
222
|
+
kind: comment.kind,
|
|
223
|
+
author: {
|
|
224
|
+
name: comment.author.name,
|
|
225
|
+
// A commenter has no fediverse identity: they gave a name, maybe a
|
|
226
|
+
// website, and nothing that names them anywhere else.
|
|
227
|
+
handle: null,
|
|
228
|
+
url: comment.author.url,
|
|
229
|
+
// Only a webmention has one: it came out of the source page's `h-card`,
|
|
230
|
+
// and a form asks nobody for a picture.
|
|
231
|
+
avatar: comment.author.avatar,
|
|
232
|
+
actorId: null,
|
|
233
|
+
},
|
|
234
|
+
// Where it can be read. A comment written here lives here, at its own
|
|
235
|
+
// anchor; a webmention lives on the page it was sent from, and its `url`
|
|
236
|
+
// says so. A theme that prints `url` for a fediverse reply prints a
|
|
237
|
+
// working link for either, and so does a feed.
|
|
238
|
+
url: comment.url ?? `${permalink}#${commentAnchor(comment.id)}`,
|
|
239
|
+
content: comment.content.html,
|
|
240
|
+
published: new Date(comment.submitted),
|
|
241
|
+
inReplyTo: comment.inReplyTo,
|
|
242
|
+
status: comment.status,
|
|
243
|
+
replies: [],
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* The `id` a comment is anchored at on the page.
|
|
248
|
+
*
|
|
249
|
+
* Prefixed rather than bare so a comment can never collide with a heading
|
|
250
|
+
* anchor the post's own Markdown produced.
|
|
251
|
+
*/
|
|
252
|
+
export function commentAnchor(id) {
|
|
253
|
+
return `comment-${id}`;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Everything said in a conversation, at every depth and in no order: the
|
|
257
|
+
* replies and the mentions.
|
|
258
|
+
*
|
|
259
|
+
* The likes and the boosts are left out because they say nothing. A feed item
|
|
260
|
+
* is somebody's words, and "@ada liked this" has none to carry — a reader
|
|
261
|
+
* polling a comments feed would get an entry with an empty body and no way to
|
|
262
|
+
* tell what it was for.
|
|
263
|
+
*/
|
|
264
|
+
export function spokenIn(conversation) {
|
|
265
|
+
const said = [...conversation.mentions];
|
|
266
|
+
const walk = (replies) => {
|
|
267
|
+
for (const reply of replies) {
|
|
268
|
+
said.push(reply);
|
|
269
|
+
walk(reply.replies);
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
walk(conversation.replies);
|
|
273
|
+
return said;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Interactions as a comments feed carries them: newest first, at most `limit`,
|
|
277
|
+
* and every link absolute.
|
|
278
|
+
*
|
|
279
|
+
* The one place an interaction becomes a feed item, so the post's feed and the
|
|
280
|
+
* site's cannot disagree about what a comment's `guid` or `link` is. The HTML
|
|
281
|
+
* is handed over as it stands and sanitised by the feed itself, at the last
|
|
282
|
+
* moment before it becomes bytes this site publishes.
|
|
283
|
+
*/
|
|
284
|
+
export function feedComments(said, options) {
|
|
285
|
+
return newestFirst([...said], options.limit).map((entry) => ({
|
|
286
|
+
id: entry.id,
|
|
287
|
+
url: absoluteUrl(entry.url ?? '/', options.baseUrl),
|
|
288
|
+
author: entry.author.name,
|
|
289
|
+
published: entry.published,
|
|
290
|
+
html: entry.content,
|
|
291
|
+
...(entry.post === undefined
|
|
292
|
+
? {}
|
|
293
|
+
: { post: { title: entry.post.title, permalink: entry.post.permalink } }),
|
|
294
|
+
}));
|
|
295
|
+
}
|
|
296
|
+
/** The newest `limit` of a mixed list, which is the order every feed shows. */
|
|
297
|
+
function newestFirst(said, limit) {
|
|
298
|
+
return said
|
|
299
|
+
.sort((left, right) => right.published.getTime() - left.published.getTime())
|
|
300
|
+
.slice(0, limit);
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* The public post an ActivityStreams object id names, memoised.
|
|
304
|
+
*
|
|
305
|
+
* Almost every id is the post's permalink (decision-13), so the permalink is
|
|
306
|
+
* looked up first and the answer is checked against the document's own id — a
|
|
307
|
+
* post that is no longer public has no id at all. Only when that fails is the
|
|
308
|
+
* whole index read, once, to find the post whose file names this id: a post
|
|
309
|
+
* migrated from WordPress keeps the `?p=813` its followers already hold, and
|
|
310
|
+
* no permalink spells that.
|
|
311
|
+
*/
|
|
312
|
+
class PostsByObjectId {
|
|
313
|
+
#context;
|
|
314
|
+
#found = new Map();
|
|
315
|
+
#all;
|
|
316
|
+
constructor(context) {
|
|
317
|
+
this.#context = context;
|
|
318
|
+
}
|
|
319
|
+
get(objectId) {
|
|
320
|
+
if (!this.#found.has(objectId))
|
|
321
|
+
this.#found.set(objectId, this.#resolve(objectId));
|
|
322
|
+
return this.#found.get(objectId);
|
|
323
|
+
}
|
|
324
|
+
#resolve(objectId) {
|
|
325
|
+
const permalink = permalinkOfObjectId(objectId, this.#context.baseUrl);
|
|
326
|
+
if (permalink !== undefined) {
|
|
327
|
+
const document = this.#context.store.getByPermalink(permalink);
|
|
328
|
+
if (document !== undefined &&
|
|
329
|
+
activityStreamsId(document, this.#context.baseUrl) === objectId) {
|
|
330
|
+
return document;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return this.#everything().get(objectId);
|
|
334
|
+
}
|
|
335
|
+
#everything() {
|
|
336
|
+
if (this.#all === undefined) {
|
|
337
|
+
this.#all = new Map();
|
|
338
|
+
for (const document of this.#context.store.listPosts()) {
|
|
339
|
+
const id = activityStreamsId(document, this.#context.baseUrl);
|
|
340
|
+
if (id !== undefined)
|
|
341
|
+
this.#all.set(id, document);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
return this.#all;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* The permalink an object id names, when it is one this site would have
|
|
349
|
+
* minted: the path, with the base URL's own directory taken off it.
|
|
350
|
+
*
|
|
351
|
+
* An id from another host belongs to no post here however it is spelled, and
|
|
352
|
+
* neither does one carrying a query string — a permalink has none, so an id
|
|
353
|
+
* like `?p=813` is a stored one and is found by the walk instead.
|
|
354
|
+
*/
|
|
355
|
+
function permalinkOfObjectId(objectId, baseUrl) {
|
|
356
|
+
let url;
|
|
357
|
+
let base;
|
|
358
|
+
try {
|
|
359
|
+
url = new URL(objectId);
|
|
360
|
+
base = new URL(baseUrl);
|
|
361
|
+
}
|
|
362
|
+
catch {
|
|
363
|
+
return undefined;
|
|
364
|
+
}
|
|
365
|
+
if (url.origin !== base.origin || url.search !== '')
|
|
366
|
+
return undefined;
|
|
367
|
+
const directory = base.pathname === '/' ? '' : base.pathname.replace(/\/$/, '');
|
|
368
|
+
if (directory !== '' && !url.pathname.startsWith(`${directory}/`))
|
|
369
|
+
return undefined;
|
|
370
|
+
const pathname = url.pathname.slice(directory.length);
|
|
371
|
+
try {
|
|
372
|
+
return decodeURIComponent(pathname);
|
|
373
|
+
}
|
|
374
|
+
catch {
|
|
375
|
+
return pathname;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* The replies as a thread: those answering the post at the top, each carrying
|
|
380
|
+
* the replies that answer it, oldest first at every level.
|
|
381
|
+
*
|
|
382
|
+
* Three things decide where a reply goes, and all three are what somebody
|
|
383
|
+
* reading the page would expect:
|
|
384
|
+
*
|
|
385
|
+
* - A reply whose target is gone — deleted by its author — is shown under
|
|
386
|
+
* whatever *that* was answering, rather than disappearing with it. The
|
|
387
|
+
* conversation stays readable and only the withdrawn note is missing.
|
|
388
|
+
* - A reply answering something that is no part of this conversation is left
|
|
389
|
+
* out. The log holds it because it named something this walk asked about — a
|
|
390
|
+
* note answering the like of a post is the shape of that — but the post is
|
|
391
|
+
* not what it is talking about.
|
|
392
|
+
* - A note the site was told about twice is one reply, because the map is
|
|
393
|
+
* keyed by the note's own id.
|
|
394
|
+
*/
|
|
395
|
+
function threadOf(written, objectId, withdrawn) {
|
|
396
|
+
const byId = new Map();
|
|
397
|
+
const targets = new Map();
|
|
398
|
+
for (const reply of written) {
|
|
399
|
+
targets.set(reply.id, reply.inReplyTo ?? objectId);
|
|
400
|
+
if (!withdrawn.has(reply.id))
|
|
401
|
+
byId.set(reply.id, reply);
|
|
402
|
+
}
|
|
403
|
+
const top = [];
|
|
404
|
+
for (const reply of byId.values()) {
|
|
405
|
+
const parent = surviving(reply, targets, byId, objectId);
|
|
406
|
+
if (parent === undefined)
|
|
407
|
+
continue;
|
|
408
|
+
(parent === null ? top : parent.replies).push(reply);
|
|
409
|
+
}
|
|
410
|
+
return top;
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* The reply a reply hangs under: `null` for the post itself, the nearest
|
|
414
|
+
* surviving ancestor for one whose own target was deleted, and `undefined` for
|
|
415
|
+
* a note that is answering something else entirely.
|
|
416
|
+
*
|
|
417
|
+
* The walk is bounded by the number of notes, so a log carrying a cycle — two
|
|
418
|
+
* notes each claiming to answer the other, which nothing stops a remote server
|
|
419
|
+
* from sending — ends rather than hangs.
|
|
420
|
+
*/
|
|
421
|
+
function surviving(reply, targets, byId, objectId) {
|
|
422
|
+
let target = targets.get(reply.id);
|
|
423
|
+
for (let step = 0; step <= targets.size; step += 1) {
|
|
424
|
+
if (target === undefined)
|
|
425
|
+
return undefined;
|
|
426
|
+
if (target === objectId)
|
|
427
|
+
return null;
|
|
428
|
+
const parent = byId.get(target);
|
|
429
|
+
if (parent !== undefined)
|
|
430
|
+
return parent === reply ? undefined : parent;
|
|
431
|
+
// The target is not a reply the site is showing: either a note its author
|
|
432
|
+
// deleted, whose own target this reply moves to, or nothing to do with the
|
|
433
|
+
// post at all.
|
|
434
|
+
target = targets.get(target);
|
|
435
|
+
}
|
|
436
|
+
return undefined;
|
|
437
|
+
}
|
|
438
|
+
/** Oldest first, which is the order a conversation reads in. */
|
|
439
|
+
function byPublished(left, right) {
|
|
440
|
+
return left.published.getTime() - right.published.getTime();
|
|
441
|
+
}
|
|
442
|
+
/** Put every level of a thread in time order, all the way down. */
|
|
443
|
+
function sortThread(replies) {
|
|
444
|
+
replies.sort(byPublished);
|
|
445
|
+
for (const reply of replies)
|
|
446
|
+
sortThread(reply.replies);
|
|
447
|
+
}
|
|
448
|
+
/** How many replies a thread holds, counting all the way down. */
|
|
449
|
+
function countReplies(replies) {
|
|
450
|
+
let total = 0;
|
|
451
|
+
for (const reply of replies)
|
|
452
|
+
total += 1 + countReplies(reply.replies);
|
|
453
|
+
return total;
|
|
454
|
+
}
|
|
455
|
+
/** The two reactions, as the activity types they arrive as. */
|
|
456
|
+
const REACTIONS = {
|
|
457
|
+
Like: 'like',
|
|
458
|
+
Announce: 'boost',
|
|
459
|
+
};
|
|
460
|
+
/**
|
|
461
|
+
* Every logged activity that has anything to do with a post, oldest first.
|
|
462
|
+
*
|
|
463
|
+
* The log is walked outwards rather than queried once: a reply names the post,
|
|
464
|
+
* a reply to that reply names the reply, and a `Delete` or an `Undo` names the
|
|
465
|
+
* activity it takes back. Each round asks about everything the last round
|
|
466
|
+
* turned up — the object an activity carried and the activity's own id — and
|
|
467
|
+
* stops when a round finds nothing new, which it must, because a row is
|
|
468
|
+
* collected once and there are finitely many.
|
|
469
|
+
*/
|
|
470
|
+
function activitiesAround(admin, objectId) {
|
|
471
|
+
const collected = new Map();
|
|
472
|
+
const asked = new Set([objectId]);
|
|
473
|
+
let frontier = [objectId];
|
|
474
|
+
while (frontier.length > 0) {
|
|
475
|
+
const next = [];
|
|
476
|
+
for (const activity of admin.listActivitiesAbout(frontier)) {
|
|
477
|
+
if (collected.has(activity.id))
|
|
478
|
+
continue;
|
|
479
|
+
collected.set(activity.id, activity);
|
|
480
|
+
for (const id of [activity.objectId, activity.activityId]) {
|
|
481
|
+
if (id === null || asked.has(id))
|
|
482
|
+
continue;
|
|
483
|
+
asked.add(id);
|
|
484
|
+
next.push(id);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
frontier = next;
|
|
488
|
+
}
|
|
489
|
+
// Row ids are the order things arrived in, and the rounds above return them
|
|
490
|
+
// out of that order.
|
|
491
|
+
return [...collected.values()].sort((left, right) => left.id - right.id);
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* The ids of everything an actor has taken back: the likes and boosts undone,
|
|
495
|
+
* and the notes deleted.
|
|
496
|
+
*
|
|
497
|
+
* Only by the actor that did it in the first place. Without that check any
|
|
498
|
+
* signed actor could delete somebody else's comment off this page, since the
|
|
499
|
+
* activity carrying the instruction is signed by its sender and says nothing
|
|
500
|
+
* about who the thing it names belonged to — which is the rule the inbox
|
|
501
|
+
* already applies to an `Undo(Follow)`.
|
|
502
|
+
*/
|
|
503
|
+
function withdrawnBy(activities) {
|
|
504
|
+
const owners = new Map();
|
|
505
|
+
for (const activity of activities) {
|
|
506
|
+
if (activity.activityId !== null)
|
|
507
|
+
owners.set(activity.activityId, activity.actorId);
|
|
508
|
+
if (activity.objectId !== null && activity.activityType === REPLY_ACTIVITY_TYPE) {
|
|
509
|
+
owners.set(activity.objectId, activity.actorId);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
const withdrawn = new Set();
|
|
513
|
+
for (const activity of activities) {
|
|
514
|
+
if (activity.activityType !== 'Undo' && activity.activityType !== 'Delete')
|
|
515
|
+
continue;
|
|
516
|
+
if (activity.objectId === null)
|
|
517
|
+
continue;
|
|
518
|
+
if (owners.get(activity.objectId) !== activity.actorId)
|
|
519
|
+
continue;
|
|
520
|
+
withdrawn.add(activity.objectId);
|
|
521
|
+
}
|
|
522
|
+
return withdrawn;
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* How an actor is named, memoised for the length of one conversation.
|
|
526
|
+
*
|
|
527
|
+
* A follower is named from the profile it published when it followed; everyone
|
|
528
|
+
* else is named by the handle their actor URL implies, which is a guess and
|
|
529
|
+
* deliberately so — naming them properly would mean dereferencing the actor,
|
|
530
|
+
* a network round trip per comment on the page.
|
|
531
|
+
*/
|
|
532
|
+
function authorNaming(admin) {
|
|
533
|
+
const known = new Map();
|
|
534
|
+
// Read once, on the first unknown actor, rather than per actor: the
|
|
535
|
+
// followers are one row per (user, actor) now (decision-14), so the same
|
|
536
|
+
// stranger may be on the list several times and any of those rows names them
|
|
537
|
+
// the same way — the columns read here are the actor's own name and picture.
|
|
538
|
+
let profiles;
|
|
539
|
+
return (actorId) => {
|
|
540
|
+
const held = known.get(actorId);
|
|
541
|
+
if (held !== undefined)
|
|
542
|
+
return held;
|
|
543
|
+
profiles ??= new Map(admin.listFollowers().map((entry) => [entry.actorId, entry]));
|
|
544
|
+
const follower = profiles.get(actorId);
|
|
545
|
+
const handle = follower?.handle ?? actorHandle(actorId) ?? null;
|
|
546
|
+
const author = {
|
|
547
|
+
name: follower?.name ?? handle ?? actorId,
|
|
548
|
+
handle,
|
|
549
|
+
url: follower?.url ?? actorId,
|
|
550
|
+
avatar: follower?.iconUrl ?? null,
|
|
551
|
+
actorId,
|
|
552
|
+
};
|
|
553
|
+
known.set(actorId, author);
|
|
554
|
+
return author;
|
|
555
|
+
};
|
|
556
|
+
}
|
|
557
|
+
//# sourceMappingURL=conversation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../src/web/conversation.ts"],"names":[],"mappings":"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"}
|
package/dist/web/documents.d.ts
CHANGED
|
@@ -3,11 +3,17 @@ import type { ContentStore } from '../content/store.ts';
|
|
|
3
3
|
/**
|
|
4
4
|
* Whether the public site may show a document.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* `_trash
|
|
8
|
-
* served, listed, or fed.
|
|
6
|
+
* Three things hide one: `draft: true` in the front matter, living under
|
|
7
|
+
* `_trash/`, and a date that has not arrived yet. All three stay indexed so
|
|
8
|
+
* the admin can find them; none is ever served, listed, or fed.
|
|
9
|
+
*
|
|
10
|
+
* This is the predicate the index answers in SQL, so anything that has to
|
|
11
|
+
* decide about a single document in hand — a permalink, a View link, the
|
|
12
|
+
* sitemap — asks it here rather than deriving the rule again. The clock
|
|
13
|
+
* defaults to the system one; a caller with a store should pass
|
|
14
|
+
* {@link ContentStore.now} so the answer matches the listings it came from.
|
|
9
15
|
*/
|
|
10
|
-
export declare function isPublicDocument(document: Document): boolean;
|
|
16
|
+
export declare function isPublicDocument(document: Document, now?: Date): boolean;
|
|
11
17
|
/**
|
|
12
18
|
* The document a public URL resolves to, or `undefined`.
|
|
13
19
|
*
|
|
@@ -16,13 +22,37 @@ export declare function isPublicDocument(document: Document): boolean;
|
|
|
16
22
|
* same document found the same way, so they cannot disagree about what exists.
|
|
17
23
|
*/
|
|
18
24
|
export declare function publicDocumentAt(store: ContentStore, permalink: string): Document | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* A post's ActivityStreams object id: its permalink, absolute on the site's
|
|
27
|
+
* base URL, or the id its file already names.
|
|
28
|
+
*
|
|
29
|
+
* decision-13. A permalink is by name permanent, and the fediverse id is the
|
|
30
|
+
* same promise made to a different audience, so one URL answers both: a
|
|
31
|
+
* browser gets the page and a peer gets the `Article`, by content negotiation.
|
|
32
|
+
* There is no second URL to mint and none to keep in step.
|
|
33
|
+
*
|
|
34
|
+
* A stored `activitypub.id` wins, for the life of the post. That is not a
|
|
35
|
+
* cache: it is what lets a post migrated from WordPress keep the
|
|
36
|
+
* `https://example.com/?p=813` id its followers, its replies and its RSS
|
|
37
|
+
* subscribers already hold (decision-14), so the CMS serves the object there
|
|
38
|
+
* too and names it in every `Update` and `Delete`. A hand-written
|
|
39
|
+
* `activitypub.id` that is not a URL is not an id, and the permalink is used
|
|
40
|
+
* instead.
|
|
41
|
+
*
|
|
42
|
+
* Unlike {@link activityStreamsId} this answers for any post, published or
|
|
43
|
+
* not: a draft that was announced before it was withdrawn still has the name
|
|
44
|
+
* its followers filed it under, and a `Delete` has to say it.
|
|
45
|
+
*/
|
|
46
|
+
export declare function postObjectId(document: Document, baseUrl: string): string;
|
|
19
47
|
/**
|
|
20
48
|
* The ActivityStreams id of a document, or `undefined` when it has none.
|
|
21
49
|
*
|
|
22
50
|
* Only a published post federates (doc-4), so only a published post has an id
|
|
23
51
|
* to advertise. This is what the theme's `<link rel="alternate">` points at,
|
|
24
|
-
*
|
|
25
|
-
*
|
|
52
|
+
* what every feed keys the post by (decision-12) and what the permalink
|
|
53
|
+
* answers an ActivityStreams request with: the page, the feed item and the
|
|
54
|
+
* object all agree about the post's name in the fediverse, because after
|
|
55
|
+
* decision-13 they are the same URL.
|
|
26
56
|
*/
|
|
27
57
|
export declare function activityStreamsId(document: Document, baseUrl: string): string | undefined;
|
|
28
58
|
//# sourceMappingURL=documents.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/web/documents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/web/documents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,GAAE,IAAiB,GAAG,OAAO,CAEpF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAI7F;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAUxE;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGzF"}
|