@geekity/cms 0.30.0 → 0.31.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 +26 -4266
- package/admin/pages/settings/privacy.njk +1 -1
- package/dist/access-log.d.ts +2 -10
- package/dist/access-log.d.ts.map +1 -1
- package/dist/access-log.js +1 -1
- package/dist/access-log.js.map +1 -1
- package/dist/{web → admin}/admin-bar.d.ts +3 -2
- package/dist/admin/admin-bar.d.ts.map +1 -0
- package/dist/{web → admin}/admin-bar.js +20 -17
- package/dist/admin/admin-bar.js.map +1 -0
- package/dist/{indieauth → admin}/app-activity.d.ts +2 -2
- package/dist/admin/app-activity.d.ts.map +1 -0
- package/dist/{indieauth → admin}/app-activity.js +5 -5
- package/dist/admin/app-activity.js.map +1 -0
- package/dist/admin/appearance.d.ts +3 -3
- package/dist/admin/appearance.d.ts.map +1 -1
- package/dist/admin/appearance.js +12 -6
- package/dist/admin/appearance.js.map +1 -1
- package/dist/admin/assets.d.ts +1 -8
- package/dist/admin/assets.d.ts.map +1 -1
- package/dist/admin/assets.js +2 -9
- package/dist/admin/assets.js.map +1 -1
- package/dist/admin/comments.d.ts +2 -2
- package/dist/admin/comments.d.ts.map +1 -1
- package/dist/admin/comments.js +16 -17
- package/dist/admin/comments.js.map +1 -1
- package/dist/{indieauth → admin}/connected-apps.d.ts +2 -2
- package/dist/admin/connected-apps.d.ts.map +1 -0
- package/dist/{indieauth → admin}/connected-apps.js +18 -19
- package/dist/admin/connected-apps.js.map +1 -0
- package/dist/admin/credentials.js +1 -1
- package/dist/admin/credentials.js.map +1 -1
- package/dist/admin/dev-mode.d.ts +1 -1
- package/dist/admin/dev-mode.d.ts.map +1 -1
- package/dist/admin/documents.d.ts +16 -301
- package/dist/admin/documents.d.ts.map +1 -1
- package/dist/admin/documents.js +74 -1032
- package/dist/admin/documents.js.map +1 -1
- package/dist/admin/editor-actions.d.ts +3 -2
- package/dist/admin/editor-actions.d.ts.map +1 -1
- package/dist/admin/editor-actions.js +8 -8
- package/dist/admin/editor-actions.js.map +1 -1
- package/dist/admin/editor-fields.d.ts +45 -0
- package/dist/admin/editor-fields.d.ts.map +1 -0
- package/dist/admin/editor-fields.js +71 -0
- package/dist/admin/editor-fields.js.map +1 -0
- package/dist/admin/editor-layout.d.ts +2 -10
- package/dist/admin/editor-layout.d.ts.map +1 -1
- package/dist/admin/editor-layout.js +1 -1
- package/dist/admin/editor-layout.js.map +1 -1
- package/dist/admin/federation.d.ts +5 -5
- package/dist/admin/federation.d.ts.map +1 -1
- package/dist/admin/federation.js +16 -18
- package/dist/admin/federation.js.map +1 -1
- package/dist/admin/flash.d.ts +2 -2
- package/dist/admin/flash.d.ts.map +1 -1
- package/dist/admin/headers.d.ts +1 -1
- package/dist/admin/headers.d.ts.map +1 -1
- package/dist/admin/headers.js +1 -1
- package/dist/admin/headers.js.map +1 -1
- package/dist/admin/index.d.ts +38 -20
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +27 -13
- package/dist/admin/index.js.map +1 -1
- package/dist/{indieauth/consent.d.ts → admin/indieauth-consent.d.ts} +4 -4
- package/dist/admin/indieauth-consent.d.ts.map +1 -0
- package/dist/{indieauth/consent.js → admin/indieauth-consent.js} +17 -18
- package/dist/admin/indieauth-consent.js.map +1 -0
- package/dist/admin/legacy-migrations.d.ts +131 -0
- package/dist/admin/legacy-migrations.d.ts.map +1 -0
- package/dist/admin/legacy-migrations.js +235 -0
- package/dist/admin/legacy-migrations.js.map +1 -0
- package/dist/admin/media.d.ts +4 -108
- package/dist/admin/media.d.ts.map +1 -1
- package/dist/admin/media.js +19 -187
- package/dist/admin/media.js.map +1 -1
- package/dist/admin/menu.d.ts.map +1 -1
- package/dist/admin/menu.js +7 -7
- package/dist/admin/menu.js.map +1 -1
- package/dist/admin/messages.d.ts +1 -1
- package/dist/admin/messages.d.ts.map +1 -1
- package/dist/admin/messages.js +10 -12
- package/dist/admin/messages.js.map +1 -1
- package/dist/admin/navigation.d.ts +3 -3
- package/dist/admin/navigation.d.ts.map +1 -1
- package/dist/admin/navigation.js +9 -12
- package/dist/admin/navigation.js.map +1 -1
- package/dist/admin/personal-data.d.ts +1 -1
- package/dist/admin/personal-data.d.ts.map +1 -1
- package/dist/admin/personal-data.js +3 -6
- package/dist/admin/personal-data.js.map +1 -1
- package/dist/admin/plugins.d.ts +1 -1
- package/dist/admin/plugins.d.ts.map +1 -1
- package/dist/admin/plugins.js +11 -15
- package/dist/admin/plugins.js.map +1 -1
- package/dist/admin/preview.d.ts +2 -1
- package/dist/admin/preview.d.ts.map +1 -1
- package/dist/admin/preview.js +28 -32
- package/dist/admin/preview.js.map +1 -1
- package/dist/admin/recovery.d.ts +3 -3
- package/dist/admin/recovery.d.ts.map +1 -1
- package/dist/admin/recovery.js +10 -12
- package/dist/admin/recovery.js.map +1 -1
- package/dist/admin/routes.d.ts +1 -3
- package/dist/admin/routes.d.ts.map +1 -1
- package/dist/admin/routes.js +28 -26
- package/dist/admin/routes.js.map +1 -1
- package/dist/admin/settings-discussion.d.ts.map +1 -1
- package/dist/admin/settings-discussion.js +7 -4
- package/dist/admin/settings-discussion.js.map +1 -1
- package/dist/admin/settings-email.d.ts +1 -1
- package/dist/admin/settings-email.d.ts.map +1 -1
- package/dist/admin/settings-email.js +13 -10
- package/dist/admin/settings-email.js.map +1 -1
- package/dist/admin/settings-general.d.ts.map +1 -1
- package/dist/admin/settings-general.js +10 -7
- package/dist/admin/settings-general.js.map +1 -1
- package/dist/admin/settings-page.d.ts +3 -4
- package/dist/admin/settings-page.d.ts.map +1 -1
- package/dist/admin/settings-page.js +5 -6
- package/dist/admin/settings-page.js.map +1 -1
- package/dist/admin/settings-pages.d.ts +1 -1
- package/dist/admin/settings-pages.d.ts.map +1 -1
- package/dist/admin/settings-permalinks.js +1 -1
- package/dist/admin/settings-permalinks.js.map +1 -1
- package/dist/admin/settings-reading.d.ts +2 -2
- package/dist/admin/settings-reading.d.ts.map +1 -1
- package/dist/admin/settings-reading.js +4 -3
- package/dist/admin/settings-reading.js.map +1 -1
- package/dist/admin/settings.d.ts +0 -579
- package/dist/admin/settings.d.ts.map +1 -1
- package/dist/admin/settings.js +1 -1155
- package/dist/admin/settings.js.map +1 -1
- package/dist/admin/syndication-targets.d.ts +1 -1
- package/dist/admin/syndication-targets.d.ts.map +1 -1
- package/dist/admin/syndication-targets.js +11 -15
- package/dist/admin/syndication-targets.js.map +1 -1
- package/dist/admin/taxonomy.d.ts +2 -2
- package/dist/admin/taxonomy.d.ts.map +1 -1
- package/dist/admin/taxonomy.js +8 -11
- package/dist/admin/taxonomy.js.map +1 -1
- package/dist/admin/templates.js +1 -1
- package/dist/admin/templates.js.map +1 -1
- package/dist/admin/tools.d.ts +4 -4
- package/dist/admin/tools.d.ts.map +1 -1
- package/dist/admin/tools.js +3 -6
- package/dist/admin/tools.js.map +1 -1
- package/dist/admin/uploads.d.ts +1 -106
- package/dist/admin/uploads.d.ts.map +1 -1
- package/dist/admin/uploads.js +2 -191
- package/dist/admin/uploads.js.map +1 -1
- package/dist/admin/users.d.ts +20 -15
- package/dist/admin/users.d.ts.map +1 -1
- package/dist/admin/users.js +83 -80
- package/dist/admin/users.js.map +1 -1
- package/dist/avatars/avatars.d.ts +2 -2
- package/dist/avatars/avatars.d.ts.map +1 -1
- package/dist/avatars/avatars.js +6 -9
- package/dist/avatars/avatars.js.map +1 -1
- package/dist/avatars/index.d.ts +0 -1
- package/dist/avatars/index.d.ts.map +1 -1
- package/dist/avatars/index.js +0 -1
- package/dist/avatars/index.js.map +1 -1
- package/dist/cache.d.ts +4 -2
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +11 -5
- package/dist/cache.js.map +1 -1
- package/dist/cli.d.ts +2 -33
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +238 -267
- package/dist/cli.js.map +1 -1
- package/dist/cms/app.d.ts +11 -0
- package/dist/cms/app.d.ts.map +1 -0
- package/dist/cms/app.js +115 -0
- package/dist/cms/app.js.map +1 -0
- package/dist/cms/boot.d.ts +14 -0
- package/dist/cms/boot.d.ts.map +1 -0
- package/dist/cms/boot.js +107 -0
- package/dist/cms/boot.js.map +1 -0
- package/dist/cms/create.d.ts +248 -0
- package/dist/cms/create.d.ts.map +1 -0
- package/dist/cms/create.js +167 -0
- package/dist/cms/create.js.map +1 -0
- package/dist/cms/lifecycle.d.ts +11 -0
- package/dist/cms/lifecycle.d.ts.map +1 -0
- package/dist/cms/lifecycle.js +15 -0
- package/dist/cms/lifecycle.js.map +1 -0
- package/dist/{web/errors.d.ts → cms/server-error.d.ts} +2 -8
- package/dist/cms/server-error.d.ts.map +1 -0
- package/dist/{web/errors.js → cms/server-error.js} +4 -14
- package/dist/cms/server-error.js.map +1 -0
- package/dist/cms/services.d.ts +55 -0
- package/dist/cms/services.d.ts.map +1 -0
- package/dist/cms/services.js +353 -0
- package/dist/cms/services.js.map +1 -0
- package/dist/cms/site-records.d.ts +4 -0
- package/dist/cms/site-records.d.ts.map +1 -0
- package/dist/cms/site-records.js +15 -0
- package/dist/cms/site-records.js.map +1 -0
- package/dist/comments/akismet.d.ts +1 -1
- package/dist/comments/akismet.d.ts.map +1 -1
- package/dist/comments/akismet.js +1 -3
- package/dist/comments/akismet.js.map +1 -1
- package/dist/comments/conversation.d.ts +334 -0
- package/dist/comments/conversation.d.ts.map +1 -0
- package/dist/comments/conversation.js +51 -0
- package/dist/comments/conversation.js.map +1 -0
- package/dist/comments/form.d.ts +2 -2
- package/dist/comments/form.d.ts.map +1 -1
- package/dist/comments/form.js +2 -2
- package/dist/comments/form.js.map +1 -1
- package/dist/comments/index.d.ts +12 -6
- package/dist/comments/index.d.ts.map +1 -1
- package/dist/comments/index.js +7 -4
- package/dist/comments/index.js.map +1 -1
- package/dist/comments/intake.d.ts +147 -0
- package/dist/comments/intake.d.ts.map +1 -0
- package/dist/comments/intake.js +161 -0
- package/dist/comments/intake.js.map +1 -0
- package/dist/comments/markdown.d.ts.map +1 -1
- package/dist/comments/markdown.js +2 -9
- package/dist/comments/markdown.js.map +1 -1
- package/dist/comments/migrations.d.ts +45 -0
- package/dist/comments/migrations.d.ts.map +1 -0
- package/dist/comments/migrations.js +194 -0
- package/dist/comments/migrations.js.map +1 -0
- package/dist/comments/moderate.d.ts +2 -2
- package/dist/comments/moderate.d.ts.map +1 -1
- package/dist/comments/moderate.js +3 -13
- package/dist/comments/moderate.js.map +1 -1
- package/dist/comments/page-form.d.ts +52 -0
- package/dist/comments/page-form.d.ts.map +1 -0
- package/dist/comments/page-form.js +62 -0
- package/dist/comments/page-form.js.map +1 -0
- package/dist/comments/policy.d.ts +1 -9
- package/dist/comments/policy.d.ts.map +1 -1
- package/dist/comments/policy.js +3 -18
- package/dist/comments/policy.js.map +1 -1
- package/dist/comments/records.d.ts +17 -193
- package/dist/comments/records.d.ts.map +1 -1
- package/dist/comments/records.js +22 -391
- package/dist/comments/records.js.map +1 -1
- package/dist/comments/reply-notices.d.ts +5 -5
- package/dist/comments/reply-notices.d.ts.map +1 -1
- package/dist/comments/reply-notices.js +6 -6
- package/dist/comments/reply-notices.js.map +1 -1
- package/dist/comments/reply-post.d.ts +2 -2
- package/dist/comments/reply-post.d.ts.map +1 -1
- package/dist/comments/reply-post.js +7 -5
- package/dist/comments/reply-post.js.map +1 -1
- package/dist/comments/routes.d.ts +3 -3
- package/dist/comments/routes.d.ts.map +1 -1
- package/dist/comments/routes.js +19 -31
- package/dist/comments/routes.js.map +1 -1
- package/dist/comments/submission.d.ts +5 -100
- package/dist/comments/submission.d.ts.map +1 -1
- package/dist/comments/submission.js +5 -20
- package/dist/comments/submission.js.map +1 -1
- package/dist/comments/viewer.d.ts +1 -25
- package/dist/comments/viewer.d.ts.map +1 -1
- package/dist/comments/viewer.js +1 -44
- package/dist/comments/viewer.js.map +1 -1
- package/dist/config-loader.d.ts +35 -0
- package/dist/config-loader.d.ts.map +1 -0
- package/dist/config-loader.js +116 -0
- package/dist/config-loader.js.map +1 -0
- package/dist/config.d.ts +72 -50
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +132 -180
- package/dist/config.js.map +1 -1
- package/dist/contact/delivery.d.ts +1 -1
- package/dist/contact/delivery.d.ts.map +1 -1
- package/dist/contact/delivery.js +5 -13
- package/dist/contact/delivery.js.map +1 -1
- package/dist/contact/form.d.ts +2 -4
- package/dist/contact/form.d.ts.map +1 -1
- package/dist/contact/form.js +3 -4
- package/dist/contact/form.js.map +1 -1
- package/dist/contact/index.d.ts +2 -2
- package/dist/contact/index.d.ts.map +1 -1
- package/dist/contact/index.js +2 -2
- package/dist/contact/index.js.map +1 -1
- package/dist/contact/records.d.ts.map +1 -1
- package/dist/contact/records.js +8 -11
- package/dist/contact/records.js.map +1 -1
- package/dist/contact/submission.d.ts +2 -2
- package/dist/contact/submission.d.ts.map +1 -1
- package/dist/contact/submission.js +7 -16
- package/dist/contact/submission.js.map +1 -1
- package/dist/{images → content}/alt-text.d.ts +1 -1
- package/dist/content/alt-text.d.ts.map +1 -0
- package/dist/{images → content}/alt-text.js +3 -5
- package/dist/content/alt-text.js.map +1 -0
- package/dist/content/authors.d.ts +79 -0
- package/dist/content/authors.d.ts.map +1 -0
- package/dist/content/authors.js +106 -0
- package/dist/content/authors.js.map +1 -0
- package/dist/content/citation.d.ts +3 -0
- package/dist/content/citation.d.ts.map +1 -1
- package/dist/content/citation.js +3 -0
- package/dist/content/citation.js.map +1 -1
- package/dist/content/comments.d.ts +3 -0
- package/dist/content/comments.d.ts.map +1 -0
- package/dist/content/comments.js +3 -0
- package/dist/content/comments.js.map +1 -0
- package/dist/content/contact.d.ts +3 -0
- package/dist/content/contact.d.ts.map +1 -0
- package/dist/content/contact.js +3 -0
- package/dist/content/contact.js.map +1 -0
- package/dist/content/document-form.d.ts +195 -0
- package/dist/content/document-form.d.ts.map +1 -0
- package/dist/content/document-form.js +201 -0
- package/dist/content/document-form.js.map +1 -0
- package/dist/content/document-kind.d.ts +55 -0
- package/dist/content/document-kind.d.ts.map +1 -0
- package/dist/content/document-kind.js +30 -0
- package/dist/content/document-kind.js.map +1 -0
- package/dist/{admin/enclosure-field.d.ts → content/enclosure-form.d.ts} +14 -34
- package/dist/content/enclosure-form.d.ts.map +1 -0
- package/dist/{admin/enclosure-field.js → content/enclosure-form.js} +39 -76
- package/dist/content/enclosure-form.js.map +1 -0
- package/dist/content/enclosure.d.ts.map +1 -1
- package/dist/content/enclosure.js +3 -4
- package/dist/content/enclosure.js.map +1 -1
- package/dist/{admin/event-field.d.ts → content/event-form.d.ts} +6 -5
- package/dist/content/event-form.d.ts.map +1 -0
- package/dist/{admin/event-field.js → content/event-form.js} +45 -12
- package/dist/content/event-form.js.map +1 -0
- package/dist/content/excerpt.d.ts +25 -0
- package/dist/content/excerpt.d.ts.map +1 -0
- package/dist/content/excerpt.js +43 -0
- package/dist/content/excerpt.js.map +1 -0
- package/dist/content/form-error.d.ts +10 -0
- package/dist/content/form-error.d.ts.map +1 -0
- package/dist/content/form-error.js +2 -0
- package/dist/content/form-error.js.map +1 -0
- package/dist/{web → content}/guids.d.ts +12 -5
- package/dist/content/guids.d.ts.map +1 -0
- package/dist/{web → content}/guids.js +28 -5
- package/dist/content/guids.js.map +1 -0
- package/dist/content/image-tags.d.ts +25 -0
- package/dist/content/image-tags.d.ts.map +1 -0
- package/dist/content/image-tags.js +55 -0
- package/dist/content/image-tags.js.map +1 -0
- package/dist/content/index.d.ts +9 -4
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +5 -2
- package/dist/content/index.js.map +1 -1
- package/dist/content/language.d.ts +19 -0
- package/dist/content/language.d.ts.map +1 -0
- package/dist/content/language.js +19 -0
- package/dist/content/language.js.map +1 -0
- package/dist/content/license.d.ts.map +1 -0
- package/dist/content/license.js.map +1 -0
- package/dist/{web → content}/locale.d.ts +0 -6
- package/dist/content/locale.d.ts.map +1 -0
- package/dist/{web → content}/locale.js +1 -6
- package/dist/content/locale.js.map +1 -0
- package/dist/content/location-form.d.ts +17 -0
- package/dist/content/location-form.d.ts.map +1 -0
- package/dist/{admin/location-field.js → content/location-form.js} +2 -23
- package/dist/content/location-form.js.map +1 -0
- package/dist/content/location.d.ts.map +1 -1
- package/dist/content/location.js +1 -3
- package/dist/content/location.js.map +1 -1
- package/dist/content/markdown-links.d.ts +11 -0
- package/dist/content/markdown-links.d.ts.map +1 -0
- package/dist/content/markdown-links.js +223 -0
- package/dist/content/markdown-links.js.map +1 -0
- package/dist/content/markdown.d.ts +2 -1
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +1 -1
- package/dist/content/markdown.js.map +1 -1
- package/dist/content/migrated.js +1 -1
- package/dist/content/migrated.js.map +1 -1
- package/dist/content/parser.d.ts.map +1 -1
- package/dist/content/parser.js +1 -12
- package/dist/content/parser.js.map +1 -1
- package/dist/content/permalinks.d.ts +34 -0
- package/dist/content/permalinks.d.ts.map +1 -0
- package/dist/{web/documents.js → content/permalinks.js} +6 -56
- package/dist/content/permalinks.js.map +1 -0
- package/dist/content/photo-form.d.ts +28 -0
- package/dist/content/photo-form.d.ts.map +1 -0
- package/dist/{admin/photo-field.js → content/photo-form.js} +36 -36
- package/dist/content/photo-form.js.map +1 -0
- package/dist/content/photo.d.ts +1 -1
- package/dist/content/photo.d.ts.map +1 -1
- package/dist/content/photo.js +1 -1
- package/dist/content/photo.js.map +1 -1
- package/dist/content/post-fields.d.ts +40 -0
- package/dist/content/post-fields.d.ts.map +1 -0
- package/dist/content/post-fields.js +256 -0
- package/dist/content/post-fields.js.map +1 -0
- package/dist/{admin/read-field.d.ts → content/read-form.d.ts} +6 -4
- package/dist/content/read-form.d.ts.map +1 -0
- package/dist/content/read-form.js +99 -0
- package/dist/content/read-form.js.map +1 -0
- package/dist/content/read.d.ts.map +1 -1
- package/dist/content/read.js +7 -11
- package/dist/content/read.js.map +1 -1
- package/dist/content/redirects.d.ts +84 -0
- package/dist/content/redirects.d.ts.map +1 -0
- package/dist/content/redirects.js +234 -0
- package/dist/content/redirects.js.map +1 -0
- package/dist/content/sanitize.d.ts +13 -0
- package/dist/content/sanitize.d.ts.map +1 -0
- package/dist/{web → content}/sanitize.js +4 -71
- package/dist/content/sanitize.js.map +1 -0
- package/dist/content/save.d.ts +5 -8
- package/dist/content/save.d.ts.map +1 -1
- package/dist/content/save.js +5 -26
- package/dist/content/save.js.map +1 -1
- package/dist/content/schedule.d.ts +2 -2
- package/dist/content/schedule.d.ts.map +1 -1
- package/dist/content/schedule.js +1 -3
- package/dist/content/schedule.js.map +1 -1
- package/dist/content/served.d.ts +58 -0
- package/dist/content/served.d.ts.map +1 -0
- package/dist/content/served.js +65 -0
- package/dist/content/served.js.map +1 -0
- package/dist/content/site-links.d.ts +72 -0
- package/dist/content/site-links.d.ts.map +1 -0
- package/dist/content/site-links.js +191 -0
- package/dist/content/site-links.js.map +1 -0
- package/dist/content/sqlite/archive.d.ts +4 -0
- package/dist/content/sqlite/archive.d.ts.map +1 -0
- package/dist/content/sqlite/archive.js +96 -0
- package/dist/content/sqlite/archive.js.map +1 -0
- package/dist/content/sqlite/backlinks.d.ts +4 -0
- package/dist/content/sqlite/backlinks.d.ts.map +1 -0
- package/dist/content/sqlite/backlinks.js +46 -0
- package/dist/content/sqlite/backlinks.js.map +1 -0
- package/dist/content/sqlite/catalog.d.ts +4 -0
- package/dist/content/sqlite/catalog.d.ts.map +1 -0
- package/dist/content/sqlite/catalog.js +62 -0
- package/dist/content/sqlite/catalog.js.map +1 -0
- package/dist/content/sqlite/clauses.d.ts +57 -0
- package/dist/content/sqlite/clauses.d.ts.map +1 -0
- package/dist/content/sqlite/clauses.js +76 -0
- package/dist/content/sqlite/clauses.js.map +1 -0
- package/dist/content/sqlite/database.d.ts +26 -0
- package/dist/content/sqlite/database.d.ts.map +1 -0
- package/dist/content/sqlite/database.js +27 -0
- package/dist/content/sqlite/database.js.map +1 -0
- package/dist/content/sqlite/documents.d.ts +12 -0
- package/dist/content/sqlite/documents.d.ts.map +1 -0
- package/dist/content/sqlite/documents.js +40 -0
- package/dist/content/sqlite/documents.js.map +1 -0
- package/dist/content/sqlite/lookups.d.ts +6 -0
- package/dist/content/sqlite/lookups.d.ts.map +1 -0
- package/dist/content/sqlite/lookups.js +25 -0
- package/dist/content/sqlite/lookups.js.map +1 -0
- package/dist/content/sqlite/open.d.ts +8 -0
- package/dist/content/sqlite/open.d.ts.map +1 -0
- package/dist/content/sqlite/open.js +63 -0
- package/dist/content/sqlite/open.js.map +1 -0
- package/dist/content/sqlite/replies.d.ts +4 -0
- package/dist/content/sqlite/replies.d.ts.map +1 -0
- package/dist/content/sqlite/replies.js +21 -0
- package/dist/content/sqlite/replies.js.map +1 -0
- package/dist/content/sqlite/rows.d.ts +22 -0
- package/dist/content/sqlite/rows.d.ts.map +1 -0
- package/dist/content/sqlite/rows.js +93 -0
- package/dist/content/sqlite/rows.js.map +1 -0
- package/dist/content/sqlite/schedule.d.ts +4 -0
- package/dist/content/sqlite/schedule.d.ts.map +1 -0
- package/dist/content/sqlite/schedule.js +16 -0
- package/dist/content/sqlite/schedule.js.map +1 -0
- package/dist/content/sqlite/schema.d.ts +10 -0
- package/dist/content/sqlite/schema.d.ts.map +1 -0
- package/dist/content/sqlite/schema.js +209 -0
- package/dist/content/sqlite/schema.js.map +1 -0
- package/dist/content/sqlite/search.d.ts +4 -0
- package/dist/content/sqlite/search.d.ts.map +1 -0
- package/dist/content/sqlite/search.js +54 -0
- package/dist/content/sqlite/search.js.map +1 -0
- package/dist/content/sqlite/spellings.d.ts +6 -0
- package/dist/content/sqlite/spellings.d.ts.map +1 -0
- package/dist/content/sqlite/spellings.js +80 -0
- package/dist/content/sqlite/spellings.js.map +1 -0
- package/dist/content/sqlite/taxonomy.d.ts +4 -0
- package/dist/content/sqlite/taxonomy.d.ts.map +1 -0
- package/dist/content/sqlite/taxonomy.js +75 -0
- package/dist/content/sqlite/taxonomy.js.map +1 -0
- package/dist/content/sqlite/writes.d.ts +9 -0
- package/dist/content/sqlite/writes.d.ts.map +1 -0
- package/dist/content/sqlite/writes.js +164 -0
- package/dist/content/sqlite/writes.js.map +1 -0
- package/dist/content/store.d.ts +142 -137
- package/dist/content/store.d.ts.map +1 -1
- package/dist/content/store.js +0 -1050
- package/dist/content/store.js.map +1 -1
- package/dist/content/sync.d.ts +12 -4
- package/dist/content/sync.d.ts.map +1 -1
- package/dist/content/sync.js +24 -41
- package/dist/content/sync.js.map +1 -1
- package/dist/content/syndicate-to.d.ts +25 -0
- package/dist/content/syndicate-to.d.ts.map +1 -0
- package/dist/content/syndicate-to.js +8 -0
- package/dist/content/syndicate-to.js.map +1 -0
- package/dist/{web → content}/taxonomy.d.ts +1 -1
- package/dist/content/taxonomy.d.ts.map +1 -0
- package/dist/{web → content}/taxonomy.js +2 -2
- package/dist/content/taxonomy.js.map +1 -0
- package/dist/content/time.d.ts +2 -2
- package/dist/content/time.d.ts.map +1 -1
- package/dist/content/time.js +3 -3
- package/dist/content/time.js.map +1 -1
- package/dist/content/trash.d.ts +35 -0
- package/dist/content/trash.d.ts.map +1 -0
- package/dist/content/trash.js +83 -0
- package/dist/content/trash.js.map +1 -0
- package/dist/content/uploads.d.ts +24 -0
- package/dist/content/uploads.d.ts.map +1 -0
- package/dist/content/uploads.js +27 -0
- package/dist/content/uploads.js.map +1 -0
- package/dist/content/video.d.ts.map +1 -1
- package/dist/content/video.js +3 -5
- package/dist/content/video.js.map +1 -1
- package/dist/content/write.d.ts +84 -0
- package/dist/content/write.d.ts.map +1 -0
- package/dist/content/write.js +566 -0
- package/dist/content/write.js.map +1 -0
- package/dist/content/writer.d.ts.map +1 -1
- package/dist/content/writer.js +1 -2
- package/dist/content/writer.js.map +1 -1
- package/dist/dev-mode.d.ts +5 -3
- package/dist/dev-mode.d.ts.map +1 -1
- package/dist/dev-mode.js +3 -3
- package/dist/dev-mode.js.map +1 -1
- package/dist/drain.d.ts +2 -3
- package/dist/drain.d.ts.map +1 -1
- package/dist/drain.js +2 -1
- package/dist/drain.js.map +1 -1
- package/dist/exports.d.ts +26 -0
- package/dist/exports.d.ts.map +1 -0
- package/dist/exports.js +8 -0
- package/dist/exports.js.map +1 -0
- package/dist/federation/actor.d.ts +1 -1
- package/dist/federation/actor.d.ts.map +1 -1
- package/dist/federation/actor.js +6 -13
- package/dist/federation/actor.js.map +1 -1
- package/dist/federation/article.d.ts +4 -14
- package/dist/federation/article.d.ts.map +1 -1
- package/dist/federation/article.js +19 -32
- package/dist/federation/article.js.map +1 -1
- package/dist/federation/backfill.d.ts +4 -4
- package/dist/federation/backfill.d.ts.map +1 -1
- package/dist/federation/backfill.js +7 -10
- package/dist/federation/backfill.js.map +1 -1
- package/dist/federation/citations.d.ts.map +1 -1
- package/dist/federation/citations.js.map +1 -1
- package/dist/federation/cited-post.d.ts.map +1 -1
- package/dist/federation/cited-post.js +2 -4
- package/dist/federation/cited-post.js.map +1 -1
- package/dist/federation/delivery-plan.d.ts +85 -0
- package/dist/federation/delivery-plan.d.ts.map +1 -0
- package/dist/federation/delivery-plan.js +137 -0
- package/dist/federation/delivery-plan.js.map +1 -0
- package/dist/federation/delivery.d.ts +7 -32
- package/dist/federation/delivery.d.ts.map +1 -1
- package/dist/federation/delivery.js +64 -201
- package/dist/federation/delivery.js.map +1 -1
- package/dist/federation/federation.d.ts +5 -5
- package/dist/federation/federation.d.ts.map +1 -1
- package/dist/federation/federation.js +7 -6
- package/dist/federation/federation.js.map +1 -1
- package/dist/federation/followers.d.ts +1 -1
- package/dist/federation/followers.d.ts.map +1 -1
- package/dist/federation/inbox.d.ts +1 -1
- package/dist/federation/inbox.d.ts.map +1 -1
- package/dist/federation/inbox.js +5 -4
- package/dist/federation/inbox.js.map +1 -1
- package/dist/federation/index.d.ts +10 -8
- package/dist/federation/index.d.ts.map +1 -1
- package/dist/federation/index.js +7 -5
- package/dist/federation/index.js.map +1 -1
- package/dist/federation/keys.d.ts +8 -27
- package/dist/federation/keys.d.ts.map +1 -1
- package/dist/federation/keys.js +4 -47
- package/dist/federation/keys.js.map +1 -1
- package/dist/federation/mount.d.ts +2 -2
- package/dist/federation/mount.d.ts.map +1 -1
- package/dist/federation/mount.js +9 -7
- package/dist/federation/mount.js.map +1 -1
- package/dist/federation/paths.d.ts +1 -9
- package/dist/federation/paths.d.ts.map +1 -1
- package/dist/federation/paths.js +2 -12
- package/dist/federation/paths.js.map +1 -1
- package/dist/federation/profiles.d.ts +1 -1
- package/dist/federation/profiles.d.ts.map +1 -1
- package/dist/federation/profiles.js +5 -8
- package/dist/federation/profiles.js.map +1 -1
- package/dist/federation/quotes.d.ts +2 -2
- package/dist/federation/quotes.d.ts.map +1 -1
- package/dist/federation/quotes.js +4 -4
- package/dist/federation/quotes.js.map +1 -1
- package/dist/federation/records.d.ts +2 -2
- package/dist/federation/records.d.ts.map +1 -1
- package/dist/federation/records.js +12 -19
- package/dist/federation/records.js.map +1 -1
- package/dist/federation/relays.d.ts +2 -3
- package/dist/federation/relays.d.ts.map +1 -1
- package/dist/federation/relays.js +22 -30
- package/dist/federation/relays.js.map +1 -1
- package/dist/federation/site-loaders.js +1 -1
- package/dist/federation/site-loaders.js.map +1 -1
- package/dist/federation/webfinger.d.ts +23 -0
- package/dist/federation/webfinger.d.ts.map +1 -0
- package/dist/federation/webfinger.js +70 -0
- package/dist/federation/webfinger.js.map +1 -0
- package/dist/files/atomic.d.ts.map +1 -1
- package/dist/files/atomic.js +4 -9
- package/dist/files/atomic.js.map +1 -1
- package/dist/files/static-files.d.ts +21 -0
- package/dist/files/static-files.d.ts.map +1 -0
- package/dist/files/static-files.js +88 -0
- package/dist/files/static-files.js.map +1 -0
- package/dist/forms/checker.d.ts +93 -0
- package/dist/forms/checker.d.ts.map +1 -0
- package/dist/forms/checker.js +2 -0
- package/dist/forms/checker.js.map +1 -0
- package/dist/forms/protection.d.ts +3 -1
- package/dist/forms/protection.d.ts.map +1 -1
- package/dist/forms/protection.js +3 -1
- package/dist/forms/protection.js.map +1 -1
- package/dist/images/icons.js +2 -2
- package/dist/images/icons.js.map +1 -1
- package/dist/images/index.d.ts +2 -1
- package/dist/images/index.d.ts.map +1 -1
- package/dist/images/index.js +2 -1
- package/dist/images/index.js.map +1 -1
- package/dist/images/markup.d.ts +0 -20
- package/dist/images/markup.d.ts.map +1 -1
- package/dist/images/markup.js +5 -64
- package/dist/images/markup.js.map +1 -1
- package/dist/images/paths.d.ts +0 -10
- package/dist/images/paths.d.ts.map +1 -1
- package/dist/images/paths.js +3 -11
- package/dist/images/paths.js.map +1 -1
- package/dist/images/variants.d.ts +2 -2
- package/dist/images/variants.d.ts.map +1 -1
- package/dist/images/variants.js +4 -3
- package/dist/images/variants.js.map +1 -1
- package/dist/index.d.ts +3 -291
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -839
- package/dist/index.js.map +1 -1
- package/dist/indexnow.d.ts.map +1 -1
- package/dist/indexnow.js +21 -26
- package/dist/indexnow.js.map +1 -1
- package/dist/indieauth/client.d.ts +1 -1
- package/dist/indieauth/client.d.ts.map +1 -1
- package/dist/indieauth/client.js +1 -1
- package/dist/indieauth/client.js.map +1 -1
- package/dist/indieauth/grants.d.ts +1 -1
- package/dist/indieauth/grants.d.ts.map +1 -1
- package/dist/indieauth/identity.d.ts +2 -2
- package/dist/indieauth/identity.d.ts.map +1 -1
- package/dist/indieauth/identity.js +5 -7
- package/dist/indieauth/identity.js.map +1 -1
- package/dist/indieauth/redeem.d.ts +1 -1
- package/dist/indieauth/redeem.d.ts.map +1 -1
- package/dist/indieauth/redeem.js.map +1 -1
- package/dist/indieauth/request.d.ts +5 -1
- package/dist/indieauth/request.d.ts.map +1 -1
- package/dist/indieauth/request.js +6 -2
- package/dist/indieauth/request.js.map +1 -1
- package/dist/indieauth/tokens.d.ts +1 -1
- package/dist/indieauth/tokens.d.ts.map +1 -1
- package/dist/indieauth/tokens.js +2 -2
- package/dist/indieauth/tokens.js.map +1 -1
- package/dist/mail/index.d.ts +1 -5
- package/dist/mail/index.d.ts.map +1 -1
- package/dist/mail/index.js +0 -2
- package/dist/mail/index.js.map +1 -1
- package/dist/mail/provider.d.ts +7 -0
- package/dist/mail/provider.d.ts.map +1 -1
- package/dist/maintenance.d.ts +1 -1
- package/dist/maintenance.d.ts.map +1 -1
- package/dist/media/library.d.ts +99 -0
- package/dist/media/library.d.ts.map +1 -0
- package/dist/media/library.js +157 -0
- package/dist/media/library.js.map +1 -0
- package/dist/media/uploads.d.ts +106 -0
- package/dist/media/uploads.d.ts.map +1 -0
- package/dist/media/uploads.js +192 -0
- package/dist/media/uploads.js.map +1 -0
- package/dist/micropub/content.js +1 -1
- package/dist/micropub/content.js.map +1 -1
- package/dist/micropub/create.d.ts +7 -15
- package/dist/micropub/create.d.ts.map +1 -1
- package/dist/micropub/create.js +48 -184
- package/dist/micropub/create.js.map +1 -1
- package/dist/micropub/endpoint.d.ts +2 -2
- package/dist/micropub/endpoint.d.ts.map +1 -1
- package/dist/micropub/endpoint.js +29 -40
- package/dist/micropub/endpoint.js.map +1 -1
- package/dist/micropub/media.d.ts +1 -1
- package/dist/micropub/media.d.ts.map +1 -1
- package/dist/micropub/media.js +6 -6
- package/dist/micropub/media.js.map +1 -1
- package/dist/micropub/update.d.ts +6 -14
- package/dist/micropub/update.d.ts.map +1 -1
- package/dist/micropub/update.js +37 -90
- package/dist/micropub/update.js.map +1 -1
- package/dist/notifications/comments.d.ts +4 -4
- package/dist/notifications/comments.d.ts.map +1 -1
- package/dist/notifications/comments.js +6 -14
- package/dist/notifications/comments.js.map +1 -1
- package/dist/notifications/digest.d.ts +4 -4
- package/dist/notifications/digest.d.ts.map +1 -1
- package/dist/notifications/digest.js +6 -16
- package/dist/notifications/digest.js.map +1 -1
- package/dist/notifications/index.d.ts +6 -3
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +3 -2
- package/dist/notifications/index.js.map +1 -1
- package/dist/notifications/links.d.ts.map +1 -1
- package/dist/notifications/links.js +2 -2
- package/dist/notifications/links.js.map +1 -1
- package/dist/{mail/service.d.ts → notifications/mail-service.d.ts} +7 -13
- package/dist/notifications/mail-service.d.ts.map +1 -0
- package/dist/{mail/service.js → notifications/mail-service.js} +33 -54
- package/dist/notifications/mail-service.js.map +1 -0
- package/dist/{mail/templates.d.ts → notifications/mail-templates.d.ts} +4 -2
- package/dist/notifications/mail-templates.d.ts.map +1 -0
- package/dist/{mail/templates.js → notifications/mail-templates.js} +5 -3
- package/dist/notifications/mail-templates.js.map +1 -0
- package/dist/notifications/tokens.d.ts +2 -2
- package/dist/notifications/tokens.d.ts.map +1 -1
- package/dist/notifications/tokens.js +2 -2
- package/dist/notifications/tokens.js.map +1 -1
- package/dist/notify.d.ts.map +1 -1
- package/dist/notify.js +12 -24
- package/dist/notify.js.map +1 -1
- package/dist/plugin.d.ts +23 -3
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +21 -3
- package/dist/plugin.js.map +1 -1
- package/dist/plugins/enabled.d.ts.map +1 -1
- package/dist/plugins/enabled.js +2 -4
- package/dist/plugins/enabled.js.map +1 -1
- package/dist/plugins/fetch.d.ts +1 -1
- package/dist/plugins/fetch.d.ts.map +1 -1
- package/dist/plugins/fetch.js +1 -1
- package/dist/plugins/fetch.js.map +1 -1
- package/dist/plugins/folder.d.ts.map +1 -1
- package/dist/plugins/folder.js +1 -3
- package/dist/plugins/folder.js.map +1 -1
- package/dist/plugins/install.d.ts.map +1 -1
- package/dist/plugins/install.js +7 -3
- package/dist/plugins/install.js.map +1 -1
- package/dist/plugins/manage.d.ts +1 -1
- package/dist/plugins/manage.d.ts.map +1 -1
- package/dist/plugins/registry.d.ts.map +1 -1
- package/dist/plugins/registry.js +7 -9
- package/dist/plugins/registry.js.map +1 -1
- package/dist/plugins/settings.d.ts.map +1 -1
- package/dist/plugins/settings.js +2 -3
- package/dist/plugins/settings.js.map +1 -1
- package/dist/plugins/site.d.ts +1 -1
- package/dist/plugins/site.d.ts.map +1 -1
- package/dist/plugins/site.js +4 -4
- package/dist/plugins/site.js.map +1 -1
- package/dist/plugins/upgrade.d.ts.map +1 -1
- package/dist/plugins/upgrade.js +4 -3
- package/dist/plugins/upgrade.js.map +1 -1
- package/dist/privacy/erase.d.ts +1 -1
- package/dist/privacy/erase.d.ts.map +1 -1
- package/dist/privacy/retention.d.ts +2 -2
- package/dist/privacy/retention.d.ts.map +1 -1
- package/dist/privacy/retention.js +9 -11
- package/dist/privacy/retention.js.map +1 -1
- package/dist/site/admin-paths.d.ts +23 -0
- package/dist/site/admin-paths.d.ts.map +1 -0
- package/dist/site/admin-paths.js +25 -0
- package/dist/site/admin-paths.js.map +1 -0
- package/dist/site/admin-theme.d.ts.map +1 -0
- package/dist/site/admin-theme.js.map +1 -0
- package/dist/{web → site}/authors.d.ts +1 -72
- package/dist/site/authors.d.ts.map +1 -0
- package/dist/site/authors.js +107 -0
- package/dist/site/authors.js.map +1 -0
- package/dist/site/feed-settings.d.ts +28 -0
- package/dist/site/feed-settings.d.ts.map +1 -0
- package/dist/site/feed-settings.js +22 -0
- package/dist/site/feed-settings.js.map +1 -0
- package/dist/{web/indexnow.d.ts → site/indexnow-key.d.ts} +1 -1
- package/dist/site/indexnow-key.d.ts.map +1 -0
- package/dist/{web/indexnow.js → site/indexnow-key.js} +1 -1
- package/dist/site/indexnow-key.js.map +1 -0
- package/dist/{web → site}/navigation.d.ts +7 -1
- package/dist/site/navigation.d.ts.map +1 -0
- package/dist/{web → site}/navigation.js +18 -0
- package/dist/site/navigation.js.map +1 -0
- package/dist/{notifications/preferences.d.ts → site/notification-preferences.d.ts} +2 -2
- package/dist/site/notification-preferences.d.ts.map +1 -0
- package/dist/{notifications/preferences.js → site/notification-preferences.js} +1 -1
- package/dist/site/notification-preferences.js.map +1 -0
- package/dist/site/passwords.d.ts.map +1 -0
- package/dist/site/passwords.js.map +1 -0
- package/dist/{privacy/policy.d.ts → site/retention-policy.d.ts} +1 -1
- package/dist/site/retention-policy.d.ts.map +1 -0
- package/dist/{privacy/policy.js → site/retention-policy.js} +1 -1
- package/dist/site/retention-policy.js.map +1 -0
- package/dist/site/robots.d.ts +62 -0
- package/dist/site/robots.d.ts.map +1 -0
- package/dist/site/robots.js +130 -0
- package/dist/site/robots.js.map +1 -0
- package/dist/site/setting-rows.d.ts +46 -0
- package/dist/site/setting-rows.d.ts.map +1 -0
- package/dist/site/setting-rows.js +480 -0
- package/dist/site/setting-rows.js.map +1 -0
- package/dist/site/setting-values.d.ts +63 -0
- package/dist/site/setting-values.d.ts.map +1 -0
- package/dist/site/setting-values.js +170 -0
- package/dist/site/setting-values.js.map +1 -0
- package/dist/site/settings-form.d.ts +30 -0
- package/dist/site/settings-form.d.ts.map +1 -0
- package/dist/site/settings-form.js +58 -0
- package/dist/site/settings-form.js.map +1 -0
- package/dist/site/settings.d.ts +345 -0
- package/dist/site/settings.d.ts.map +1 -0
- package/dist/site/settings.js +107 -0
- package/dist/site/settings.js.map +1 -0
- package/dist/site/site-json.d.ts +69 -0
- package/dist/site/site-json.d.ts.map +1 -0
- package/dist/site/site-json.js +113 -0
- package/dist/site/site-json.js.map +1 -0
- package/dist/{admin/accounts.d.ts → site/users.d.ts} +25 -41
- package/dist/site/users.d.ts.map +1 -0
- package/dist/{admin/accounts.js → site/users.js} +49 -155
- package/dist/site/users.js.map +1 -0
- package/dist/store/admin-store.d.ts +72 -0
- package/dist/store/admin-store.d.ts.map +1 -0
- package/dist/store/admin-store.js +62 -0
- package/dist/store/admin-store.js.map +1 -0
- package/dist/store/comments.d.ts +253 -0
- package/dist/store/comments.d.ts.map +1 -0
- package/dist/store/comments.js +234 -0
- package/dist/store/comments.js.map +1 -0
- package/dist/store/conversation.d.ts +28 -0
- package/dist/store/conversation.d.ts.map +1 -0
- package/dist/store/conversation.js +16 -0
- package/dist/store/conversation.js.map +1 -0
- package/dist/store/deliveries.d.ts +92 -0
- package/dist/store/deliveries.d.ts.map +1 -0
- package/dist/store/deliveries.js +88 -0
- package/dist/store/deliveries.js.map +1 -0
- package/dist/store/followers.d.ts +91 -0
- package/dist/store/followers.d.ts.map +1 -0
- package/dist/store/followers.js +79 -0
- package/dist/store/followers.js.map +1 -0
- package/dist/{federation/replies.d.ts → store/inbox-replies.d.ts} +2 -2
- package/dist/store/inbox-replies.d.ts.map +1 -0
- package/dist/{federation/replies.js → store/inbox-replies.js} +2 -4
- package/dist/store/inbox-replies.js.map +1 -0
- package/dist/store/inbox.d.ts +132 -0
- package/dist/store/inbox.d.ts.map +1 -0
- package/dist/store/inbox.js +157 -0
- package/dist/store/inbox.js.map +1 -0
- package/dist/store/profiles.d.ts +49 -0
- package/dist/store/profiles.d.ts.map +1 -0
- package/dist/store/profiles.js +71 -0
- package/dist/store/profiles.js.map +1 -0
- package/dist/store/relays.d.ts +66 -0
- package/dist/store/relays.d.ts.map +1 -0
- package/dist/store/relays.js +69 -0
- package/dist/store/relays.js.map +1 -0
- package/dist/store/rows.d.ts +33 -0
- package/dist/store/rows.d.ts.map +1 -0
- package/dist/store/rows.js +44 -0
- package/dist/store/rows.js.map +1 -0
- package/dist/store/schema.d.ts +14 -0
- package/dist/store/schema.d.ts.map +1 -0
- package/dist/store/schema.js +588 -0
- package/dist/store/schema.js.map +1 -0
- package/dist/store/sessions.d.ts +90 -0
- package/dist/store/sessions.d.ts.map +1 -0
- package/dist/store/sessions.js +107 -0
- package/dist/store/sessions.js.map +1 -0
- package/dist/store/state.d.ts +18 -0
- package/dist/store/state.d.ts.map +1 -0
- package/dist/store/state.js +19 -0
- package/dist/store/state.js.map +1 -0
- package/dist/store/tokens.d.ts +75 -0
- package/dist/store/tokens.d.ts.map +1 -0
- package/dist/store/tokens.js +82 -0
- package/dist/store/tokens.js.map +1 -0
- package/dist/store/webmentions.d.ts +66 -0
- package/dist/store/webmentions.d.ts.map +1 -0
- package/dist/store/webmentions.js +84 -0
- package/dist/store/webmentions.js.map +1 -0
- package/dist/supervisor/primary.d.ts +1 -1
- package/dist/supervisor/primary.d.ts.map +1 -1
- package/dist/supervisor/primary.js +31 -11
- package/dist/supervisor/primary.js.map +1 -1
- package/dist/supervisor/worker.d.ts +6 -2
- package/dist/supervisor/worker.d.ts.map +1 -1
- package/dist/supervisor/worker.js +4 -4
- package/dist/supervisor/worker.js.map +1 -1
- package/dist/testing.d.ts +8 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +6 -0
- package/dist/testing.js.map +1 -0
- package/dist/{web → theme}/assets.d.ts +1 -32
- package/dist/theme/assets.d.ts.map +1 -0
- package/dist/{web → theme}/assets.js +2 -100
- package/dist/theme/assets.js.map +1 -0
- package/dist/theme/site-data.d.ts +187 -0
- package/dist/theme/site-data.d.ts.map +1 -0
- package/dist/theme/site-data.js +160 -0
- package/dist/theme/site-data.js.map +1 -0
- package/dist/{web → theme}/templates.d.ts +2 -0
- package/dist/theme/templates.d.ts.map +1 -0
- package/dist/{web → theme}/templates.js +9 -32
- package/dist/theme/templates.js.map +1 -0
- package/dist/{web → theme}/themes.d.ts +1 -0
- package/dist/theme/themes.d.ts.map +1 -0
- package/dist/{web → theme}/themes.js +6 -3
- package/dist/theme/themes.js.map +1 -0
- package/dist/util/client-id.d.ts.map +1 -0
- package/dist/util/client-id.js.map +1 -0
- package/dist/util/clock.d.ts +9 -0
- package/dist/util/clock.d.ts.map +1 -0
- package/dist/util/clock.js +2 -0
- package/dist/util/clock.js.map +1 -0
- package/dist/util/errors.d.ts +3 -0
- package/dist/util/errors.d.ts.map +1 -0
- package/dist/util/errors.js +5 -0
- package/dist/util/errors.js.map +1 -0
- package/dist/util/files.d.ts +5 -0
- package/dist/util/files.d.ts.map +1 -0
- package/dist/util/files.js +38 -0
- package/dist/util/files.js.map +1 -0
- package/dist/util/forms.d.ts +5 -0
- package/dist/util/forms.d.ts.map +1 -0
- package/dist/util/forms.js +17 -0
- package/dist/util/forms.js.map +1 -0
- package/dist/util/guards.d.ts +4 -0
- package/dist/util/guards.d.ts.map +1 -0
- package/dist/util/guards.js +12 -0
- package/dist/util/guards.js.map +1 -0
- package/dist/{webmention/html.d.ts → util/html-tree.d.ts} +2 -2
- package/dist/util/html-tree.d.ts.map +1 -0
- package/dist/{webmention/html.js → util/html-tree.js} +3 -64
- package/dist/util/html-tree.js.map +1 -0
- package/dist/util/html.d.ts +4 -0
- package/dist/util/html.d.ts.map +1 -0
- package/dist/util/html.js +34 -0
- package/dist/util/html.js.map +1 -0
- package/dist/util/public-address.d.ts.map +1 -0
- package/dist/util/public-address.js.map +1 -0
- package/dist/util/queue.d.ts +7 -0
- package/dist/util/queue.d.ts.map +1 -0
- package/dist/util/queue.js +23 -0
- package/dist/util/queue.js.map +1 -0
- package/dist/util/retry.d.ts +11 -0
- package/dist/util/retry.d.ts.map +1 -0
- package/dist/util/retry.js +14 -0
- package/dist/util/retry.js.map +1 -0
- package/dist/util/url.d.ts +11 -0
- package/dist/util/url.d.ts.map +1 -0
- package/dist/util/url.js +20 -0
- package/dist/util/url.js.map +1 -0
- package/dist/web/absolute-urls.js +1 -1
- package/dist/web/absolute-urls.js.map +1 -1
- package/dist/web/archive.js +2 -2
- package/dist/web/archive.js.map +1 -1
- package/dist/web/asset-routes.d.ts +48 -0
- package/dist/web/asset-routes.d.ts.map +1 -0
- package/dist/web/asset-routes.js +107 -0
- package/dist/web/asset-routes.js.map +1 -0
- package/dist/{avatars/routes.d.ts → web/avatar-routes.d.ts} +2 -2
- package/dist/web/avatar-routes.d.ts.map +1 -0
- package/dist/{avatars/routes.js → web/avatar-routes.js} +3 -3
- package/dist/web/avatar-routes.js.map +1 -0
- package/dist/web/comment-routes.d.ts +18 -0
- package/dist/web/comment-routes.d.ts.map +1 -0
- package/dist/web/comment-routes.js +177 -0
- package/dist/web/comment-routes.js.map +1 -0
- package/dist/web/compression.d.ts.map +1 -1
- package/dist/web/compression.js +1 -2
- package/dist/web/compression.js.map +1 -1
- package/dist/{contact/routes.d.ts → web/contact-routes.d.ts} +2 -2
- package/dist/web/contact-routes.d.ts.map +1 -0
- package/dist/{contact/routes.js → web/contact-routes.js} +14 -17
- package/dist/web/contact-routes.js.map +1 -0
- package/dist/web/context.d.ts +1 -187
- package/dist/web/context.d.ts.map +1 -1
- package/dist/web/context.js +5 -171
- package/dist/web/context.js.map +1 -1
- package/dist/web/conversation.d.ts +5 -356
- package/dist/web/conversation.d.ts.map +1 -1
- package/dist/web/conversation.js +165 -136
- package/dist/web/conversation.js.map +1 -1
- package/dist/web/document-page.d.ts +13 -0
- package/dist/web/document-page.d.ts.map +1 -0
- package/dist/web/document-page.js +136 -0
- package/dist/web/document-page.js.map +1 -0
- package/dist/web/document-site.d.ts +14 -0
- package/dist/web/document-site.d.ts.map +1 -0
- package/dist/web/document-site.js +28 -0
- package/dist/web/document-site.js.map +1 -0
- package/dist/web/embed.d.ts +13 -0
- package/dist/web/embed.d.ts.map +1 -0
- package/dist/web/embed.js +66 -0
- package/dist/web/embed.js.map +1 -0
- package/dist/{env.d.ts → web/env.d.ts} +27 -26
- package/dist/web/env.d.ts.map +1 -0
- package/dist/web/env.js.map +1 -0
- package/dist/web/federation-routes.d.ts +33 -0
- package/dist/web/federation-routes.d.ts.map +1 -0
- package/dist/web/federation-routes.js +280 -0
- package/dist/web/federation-routes.js.map +1 -0
- package/dist/web/feed-atom.d.ts.map +1 -1
- package/dist/web/feed-atom.js +4 -3
- package/dist/web/feed-atom.js.map +1 -1
- package/dist/web/feed-item.d.ts +4 -39
- package/dist/web/feed-item.d.ts.map +1 -1
- package/dist/web/feed-item.js +8 -72
- package/dist/web/feed-item.js.map +1 -1
- package/dist/web/feed-json.js +2 -2
- package/dist/web/feed-json.js.map +1 -1
- package/dist/web/feed-routes.d.ts +36 -0
- package/dist/web/feed-routes.d.ts.map +1 -0
- package/dist/web/feed-routes.js +124 -0
- package/dist/web/feed-routes.js.map +1 -0
- package/dist/web/feed-rss.d.ts.map +1 -1
- package/dist/web/feed-rss.js +9 -6
- package/dist/web/feed-rss.js.map +1 -1
- package/dist/web/feed-source.d.ts +11 -41
- package/dist/web/feed-source.d.ts.map +1 -1
- package/dist/web/feed-source.js +11 -48
- package/dist/web/feed-source.js.map +1 -1
- package/dist/web/feeds.d.ts +4 -2
- package/dist/web/feeds.d.ts.map +1 -1
- package/dist/web/feeds.js +8 -5
- package/dist/web/feeds.js.map +1 -1
- package/dist/web/health.d.ts +1 -1
- package/dist/web/health.d.ts.map +1 -1
- package/dist/web/index.d.ts +53 -29
- package/dist/web/index.d.ts.map +1 -1
- package/dist/web/index.js +37 -18
- package/dist/web/index.js.map +1 -1
- package/dist/{indieauth/activity-log.d.ts → web/indieauth-activity-log.d.ts} +3 -3
- package/dist/web/indieauth-activity-log.d.ts.map +1 -0
- package/dist/{indieauth/activity-log.js → web/indieauth-activity-log.js} +5 -6
- package/dist/web/indieauth-activity-log.js.map +1 -0
- package/dist/{indieauth/bearer.d.ts → web/indieauth-bearer.d.ts} +5 -5
- package/dist/web/indieauth-bearer.d.ts.map +1 -0
- package/dist/{indieauth/bearer.js → web/indieauth-bearer.js} +4 -4
- package/dist/web/indieauth-bearer.js.map +1 -0
- package/dist/{indieauth/discovery.d.ts → web/indieauth-discovery.d.ts} +2 -7
- package/dist/web/indieauth-discovery.d.ts.map +1 -0
- package/dist/{indieauth/discovery.js → web/indieauth-discovery.js} +6 -9
- package/dist/web/indieauth-discovery.js.map +1 -0
- package/dist/{indieauth/token.d.ts → web/indieauth-token.d.ts} +2 -2
- package/dist/web/indieauth-token.d.ts.map +1 -0
- package/dist/{indieauth/token.js → web/indieauth-token.js} +7 -7
- package/dist/web/indieauth-token.js.map +1 -0
- package/dist/web/listing-pages.d.ts +19 -0
- package/dist/web/listing-pages.d.ts.map +1 -0
- package/dist/web/listing-pages.js +148 -0
- package/dist/web/listing-pages.js.map +1 -0
- package/dist/web/listing-subject.d.ts +58 -0
- package/dist/web/listing-subject.d.ts.map +1 -0
- package/dist/web/listing-subject.js +89 -0
- package/dist/web/listing-subject.js.map +1 -0
- package/dist/web/llms.d.ts +16 -15
- package/dist/web/llms.d.ts.map +1 -1
- package/dist/web/llms.js +23 -35
- package/dist/web/llms.js.map +1 -1
- package/dist/web/maintenance.d.ts +1 -1
- package/dist/web/maintenance.d.ts.map +1 -1
- package/dist/web/maintenance.js +7 -13
- package/dist/web/maintenance.js.map +1 -1
- package/dist/web/manifest.d.ts +1 -1
- package/dist/web/manifest.d.ts.map +1 -1
- package/dist/web/manifest.js +2 -1
- package/dist/web/manifest.js.map +1 -1
- package/dist/web/markdown-page.d.ts +76 -0
- package/dist/web/markdown-page.d.ts.map +1 -0
- package/dist/web/markdown-page.js +79 -0
- package/dist/web/markdown-page.js.map +1 -0
- package/dist/web/markdown-representation.d.ts +15 -0
- package/dist/web/markdown-representation.d.ts.map +1 -0
- package/dist/web/markdown-representation.js +130 -0
- package/dist/web/markdown-representation.js.map +1 -0
- package/dist/web/negotiate.d.ts +5 -12
- package/dist/web/negotiate.d.ts.map +1 -1
- package/dist/web/negotiate.js +11 -18
- package/dist/web/negotiate.js.map +1 -1
- package/dist/{notifications/routes.d.ts → web/notification-routes.d.ts} +2 -2
- package/dist/web/notification-routes.d.ts.map +1 -0
- package/dist/{notifications/routes.js → web/notification-routes.js} +24 -29
- package/dist/web/notification-routes.js.map +1 -0
- package/dist/web/oembed.d.ts +2 -2
- package/dist/web/oembed.d.ts.map +1 -1
- package/dist/web/oembed.js +5 -4
- package/dist/web/oembed.js.map +1 -1
- package/dist/web/opensearch.d.ts.map +1 -1
- package/dist/web/opensearch.js +2 -1
- package/dist/web/opensearch.js.map +1 -1
- package/dist/web/page-sources.d.ts +15 -0
- package/dist/web/page-sources.d.ts.map +1 -0
- package/dist/web/page-sources.js +44 -0
- package/dist/web/page-sources.js.map +1 -0
- package/dist/web/pagination.d.ts +1 -0
- package/dist/web/pagination.d.ts.map +1 -1
- package/dist/web/pagination.js +4 -1
- package/dist/web/pagination.js.map +1 -1
- package/dist/web/paths.d.ts +52 -0
- package/dist/web/paths.d.ts.map +1 -0
- package/dist/web/paths.js +208 -0
- package/dist/web/paths.js.map +1 -0
- package/dist/web/pingback-routes.d.ts +5 -0
- package/dist/web/pingback-routes.d.ts.map +1 -0
- package/dist/web/pingback-routes.js +100 -0
- package/dist/web/pingback-routes.js.map +1 -0
- package/dist/{plugins/federation.d.ts → web/plugin-federation.d.ts} +3 -3
- package/dist/web/plugin-federation.d.ts.map +1 -0
- package/dist/{plugins/federation.js → web/plugin-federation.js} +5 -5
- package/dist/web/plugin-federation.js.map +1 -0
- package/dist/{plugins/mount.d.ts → web/plugin-routes.d.ts} +3 -3
- package/dist/web/plugin-routes.d.ts.map +1 -0
- package/dist/{plugins/mount.js → web/plugin-routes.js} +2 -2
- package/dist/web/plugin-routes.js.map +1 -0
- package/dist/web/redirects.d.ts +1 -84
- package/dist/web/redirects.d.ts.map +1 -1
- package/dist/web/redirects.js +0 -232
- package/dist/web/redirects.js.map +1 -1
- package/dist/web/render.d.ts +43 -7
- package/dist/web/render.d.ts.map +1 -1
- package/dist/web/render.js +96 -48
- package/dist/web/render.js.map +1 -1
- package/dist/web/request.d.ts +44 -0
- package/dist/web/request.d.ts.map +1 -0
- package/dist/web/request.js +82 -0
- package/dist/web/request.js.map +1 -0
- package/dist/web/robots.d.ts +1 -46
- package/dist/web/robots.d.ts.map +1 -1
- package/dist/web/robots.js +5 -131
- package/dist/web/robots.js.map +1 -1
- package/dist/web/routes.d.ts +5 -39
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +98 -1369
- package/dist/web/routes.js.map +1 -1
- package/dist/web/search.d.ts.map +1 -1
- package/dist/web/search.js +2 -9
- package/dist/web/search.js.map +1 -1
- package/dist/{admin → web}/session.d.ts +1 -5
- package/dist/web/session.d.ts.map +1 -0
- package/dist/{admin → web}/session.js +0 -4
- package/dist/web/session.js.map +1 -0
- package/dist/web/share-image.d.ts.map +1 -1
- package/dist/web/share-image.js +3 -2
- package/dist/web/share-image.js.map +1 -1
- package/dist/web/signed-in.d.ts +27 -0
- package/dist/web/signed-in.d.ts.map +1 -0
- package/dist/web/signed-in.js +45 -0
- package/dist/web/signed-in.js.map +1 -0
- package/dist/web/site-index.d.ts +13 -0
- package/dist/web/site-index.d.ts.map +1 -0
- package/dist/web/site-index.js +143 -0
- package/dist/web/site-index.js.map +1 -0
- package/dist/web/site-view.d.ts +45 -0
- package/dist/web/site-view.d.ts.map +1 -0
- package/dist/web/site-view.js +67 -0
- package/dist/web/site-view.js.map +1 -0
- package/dist/web/sitemap.d.ts.map +1 -1
- package/dist/web/sitemap.js +5 -7
- package/dist/web/sitemap.js.map +1 -1
- package/dist/{admin → web}/throttle.d.ts +3 -4
- package/dist/web/throttle.d.ts.map +1 -0
- package/dist/{admin → web}/throttle.js +1 -2
- package/dist/web/throttle.js.map +1 -0
- package/dist/web/webmention-routes.d.ts +11 -0
- package/dist/web/webmention-routes.d.ts.map +1 -0
- package/dist/web/webmention-routes.js +51 -0
- package/dist/web/webmention-routes.js.map +1 -0
- package/dist/web/well-known.d.ts +2 -2
- package/dist/web/well-known.d.ts.map +1 -1
- package/dist/web/well-known.js +5 -14
- package/dist/web/well-known.js.map +1 -1
- package/dist/webmention/cited-picture.d.ts +1 -2
- package/dist/webmention/cited-picture.d.ts.map +1 -1
- package/dist/webmention/cited-picture.js +4 -6
- package/dist/webmention/cited-picture.js.map +1 -1
- package/dist/webmention/discovery.d.ts +2 -13
- package/dist/webmention/discovery.d.ts.map +1 -1
- package/dist/webmention/discovery.js +18 -73
- package/dist/webmention/discovery.js.map +1 -1
- package/dist/webmention/endpoint.d.ts +27 -0
- package/dist/webmention/endpoint.d.ts.map +1 -0
- package/dist/webmention/endpoint.js +26 -0
- package/dist/webmention/endpoint.js.map +1 -0
- package/dist/webmention/fetch-public.d.ts +18 -1
- package/dist/webmention/fetch-public.d.ts.map +1 -1
- package/dist/webmention/fetch-public.js +57 -23
- package/dist/webmention/fetch-public.js.map +1 -1
- package/dist/webmention/index.d.ts +11 -9
- package/dist/webmention/index.d.ts.map +1 -1
- package/dist/webmention/index.js +7 -6
- package/dist/webmention/index.js.map +1 -1
- package/dist/webmention/links.d.ts +0 -55
- package/dist/webmention/links.d.ts.map +1 -1
- package/dist/webmention/links.js +2 -185
- package/dist/webmention/links.js.map +1 -1
- package/dist/webmention/microformats.d.ts +1 -1
- package/dist/webmention/microformats.d.ts.map +1 -1
- package/dist/webmention/microformats.js +1 -1
- package/dist/webmention/microformats.js.map +1 -1
- package/dist/webmention/pingback.d.ts +12 -4
- package/dist/webmention/pingback.d.ts.map +1 -1
- package/dist/webmention/pingback.js +4 -102
- package/dist/webmention/pingback.js.map +1 -1
- package/dist/webmention/receive.d.ts +7 -4
- package/dist/webmention/receive.d.ts.map +1 -1
- package/dist/webmention/receive.js +30 -38
- package/dist/webmention/receive.js.map +1 -1
- package/dist/webmention/reply-context/fediverse.d.ts +29 -0
- package/dist/webmention/reply-context/fediverse.d.ts.map +1 -0
- package/dist/webmention/reply-context/fediverse.js +59 -0
- package/dist/webmention/reply-context/fediverse.js.map +1 -0
- package/dist/webmention/reply-context/json-ld.d.ts +5 -0
- package/dist/webmention/reply-context/json-ld.d.ts.map +1 -0
- package/dist/webmention/reply-context/json-ld.js +78 -0
- package/dist/webmention/reply-context/json-ld.js.map +1 -0
- package/dist/webmention/reply-context/oembed.d.ts +21 -0
- package/dist/webmention/reply-context/oembed.d.ts.map +1 -0
- package/dist/webmention/reply-context/oembed.js +137 -0
- package/dist/webmention/reply-context/oembed.js.map +1 -0
- package/dist/webmention/reply-context/page.d.ts +30 -0
- package/dist/webmention/reply-context/page.d.ts.map +1 -0
- package/dist/webmention/reply-context/page.js +134 -0
- package/dist/webmention/reply-context/page.js.map +1 -0
- package/dist/webmention/reply-context/source.d.ts +29 -0
- package/dist/webmention/reply-context/source.d.ts.map +1 -0
- package/dist/webmention/reply-context/source.js +46 -0
- package/dist/webmention/reply-context/source.js.map +1 -0
- package/dist/webmention/reply-context.d.ts +5 -34
- package/dist/webmention/reply-context.d.ts.map +1 -1
- package/dist/webmention/reply-context.js +9 -432
- package/dist/webmention/reply-context.js.map +1 -1
- package/dist/webmention/reply-contexts.d.ts +3 -3
- package/dist/webmention/reply-contexts.d.ts.map +1 -1
- package/dist/webmention/reply-contexts.js +7 -10
- package/dist/webmention/reply-contexts.js.map +1 -1
- package/dist/webmention/routes.d.ts +1 -1
- package/dist/webmention/routes.d.ts.map +1 -1
- package/dist/webmention/routes.js +5 -8
- package/dist/webmention/routes.js.map +1 -1
- package/dist/webmention/service.d.ts +7 -7
- package/dist/webmention/service.d.ts.map +1 -1
- package/dist/webmention/service.js +49 -61
- package/dist/webmention/service.js.map +1 -1
- package/dist/webmention/syndication.d.ts +3 -26
- package/dist/webmention/syndication.d.ts.map +1 -1
- package/dist/webmention/syndication.js +6 -20
- package/dist/webmention/syndication.js.map +1 -1
- package/package.json +5 -1
- package/themes/default/README.md +36 -2339
- package/themes/default/layouts/base.njk +5 -4
- package/themes/default/layouts/front-page.njk +4 -3
- package/themes/default/layouts/page.njk +2 -0
- package/themes/default/partials/comment-form.njk +1 -1
- package/themes/default/partials/contact-form.njk +1 -2
- package/themes/default/partials/conversation.njk +1 -2
- package/themes/default/partials/markdown-footer.md.njk +24 -0
- package/themes/default/partials/markdown-header.md.njk +31 -0
- package/themes/default/src/style.css +6 -6
- package/dist/admin/accounts.d.ts.map +0 -1
- package/dist/admin/accounts.js.map +0 -1
- package/dist/admin/admin-theme.d.ts.map +0 -1
- package/dist/admin/admin-theme.js.map +0 -1
- package/dist/admin/enclosure-field.d.ts.map +0 -1
- package/dist/admin/enclosure-field.js.map +0 -1
- package/dist/admin/event-field.d.ts.map +0 -1
- package/dist/admin/event-field.js.map +0 -1
- package/dist/admin/location-field.d.ts +0 -27
- package/dist/admin/location-field.d.ts.map +0 -1
- package/dist/admin/location-field.js.map +0 -1
- package/dist/admin/passwords.d.ts.map +0 -1
- package/dist/admin/passwords.js.map +0 -1
- package/dist/admin/photo-field.d.ts +0 -38
- package/dist/admin/photo-field.d.ts.map +0 -1
- package/dist/admin/photo-field.js.map +0 -1
- package/dist/admin/read-field.d.ts.map +0 -1
- package/dist/admin/read-field.js +0 -61
- package/dist/admin/read-field.js.map +0 -1
- package/dist/admin/session.d.ts.map +0 -1
- package/dist/admin/session.js.map +0 -1
- package/dist/admin/store.d.ts +0 -1025
- package/dist/admin/store.d.ts.map +0 -1
- package/dist/admin/store.js +0 -1628
- package/dist/admin/store.js.map +0 -1
- package/dist/admin/throttle.d.ts.map +0 -1
- package/dist/admin/throttle.js.map +0 -1
- package/dist/avatars/routes.d.ts.map +0 -1
- package/dist/avatars/routes.js.map +0 -1
- package/dist/contact/routes.d.ts.map +0 -1
- package/dist/contact/routes.js.map +0 -1
- package/dist/env.d.ts.map +0 -1
- package/dist/env.js.map +0 -1
- package/dist/federation/replies.d.ts.map +0 -1
- package/dist/federation/replies.js.map +0 -1
- package/dist/images/alt-text.d.ts.map +0 -1
- package/dist/images/alt-text.js.map +0 -1
- package/dist/indieauth/activity-log.d.ts.map +0 -1
- package/dist/indieauth/activity-log.js.map +0 -1
- package/dist/indieauth/app-activity.d.ts.map +0 -1
- package/dist/indieauth/app-activity.js.map +0 -1
- package/dist/indieauth/bearer.d.ts.map +0 -1
- package/dist/indieauth/bearer.js.map +0 -1
- package/dist/indieauth/client-id.d.ts.map +0 -1
- package/dist/indieauth/client-id.js.map +0 -1
- package/dist/indieauth/connected-apps.d.ts.map +0 -1
- package/dist/indieauth/connected-apps.js.map +0 -1
- package/dist/indieauth/consent.d.ts.map +0 -1
- package/dist/indieauth/consent.js.map +0 -1
- package/dist/indieauth/discovery.d.ts.map +0 -1
- package/dist/indieauth/discovery.js.map +0 -1
- package/dist/indieauth/token.d.ts.map +0 -1
- package/dist/indieauth/token.js.map +0 -1
- package/dist/mail/service.d.ts.map +0 -1
- package/dist/mail/service.js.map +0 -1
- package/dist/mail/templates.d.ts.map +0 -1
- package/dist/mail/templates.js.map +0 -1
- package/dist/notifications/preferences.d.ts.map +0 -1
- package/dist/notifications/preferences.js.map +0 -1
- package/dist/notifications/routes.d.ts.map +0 -1
- package/dist/notifications/routes.js.map +0 -1
- package/dist/plugins/federation.d.ts.map +0 -1
- package/dist/plugins/federation.js.map +0 -1
- package/dist/plugins/mount.d.ts.map +0 -1
- package/dist/plugins/mount.js.map +0 -1
- package/dist/privacy/policy.d.ts.map +0 -1
- package/dist/privacy/policy.js.map +0 -1
- package/dist/web/admin-bar.d.ts.map +0 -1
- package/dist/web/admin-bar.js.map +0 -1
- package/dist/web/assets.d.ts.map +0 -1
- package/dist/web/assets.js.map +0 -1
- package/dist/web/authors.d.ts.map +0 -1
- package/dist/web/authors.js +0 -211
- package/dist/web/authors.js.map +0 -1
- package/dist/web/documents.d.ts +0 -81
- package/dist/web/documents.d.ts.map +0 -1
- package/dist/web/documents.js.map +0 -1
- package/dist/web/errors.d.ts.map +0 -1
- package/dist/web/errors.js.map +0 -1
- package/dist/web/guids.d.ts.map +0 -1
- package/dist/web/guids.js.map +0 -1
- package/dist/web/indexnow.d.ts.map +0 -1
- package/dist/web/indexnow.js.map +0 -1
- package/dist/web/license.d.ts.map +0 -1
- package/dist/web/license.js.map +0 -1
- package/dist/web/locale.d.ts.map +0 -1
- package/dist/web/locale.js.map +0 -1
- package/dist/web/navigation.d.ts.map +0 -1
- package/dist/web/navigation.js.map +0 -1
- package/dist/web/recent.d.ts +0 -43
- package/dist/web/recent.d.ts.map +0 -1
- package/dist/web/recent.js +0 -37
- package/dist/web/recent.js.map +0 -1
- package/dist/web/sanitize.d.ts +0 -29
- package/dist/web/sanitize.d.ts.map +0 -1
- package/dist/web/sanitize.js.map +0 -1
- package/dist/web/taxonomy.d.ts.map +0 -1
- package/dist/web/taxonomy.js.map +0 -1
- package/dist/web/templates.d.ts.map +0 -1
- package/dist/web/templates.js.map +0 -1
- package/dist/web/themes.d.ts.map +0 -1
- package/dist/web/themes.js.map +0 -1
- package/dist/webmention/html.d.ts.map +0 -1
- package/dist/webmention/html.js.map +0 -1
- package/dist/webmention/public-address.d.ts.map +0 -1
- package/dist/webmention/public-address.js.map +0 -1
- /package/dist/{web → content}/license.d.ts +0 -0
- /package/dist/{web → content}/license.js +0 -0
- /package/dist/{admin → site}/admin-theme.d.ts +0 -0
- /package/dist/{admin → site}/admin-theme.js +0 -0
- /package/dist/{admin → site}/passwords.d.ts +0 -0
- /package/dist/{admin → site}/passwords.js +0 -0
- /package/dist/{indieauth → util}/client-id.d.ts +0 -0
- /package/dist/{indieauth → util}/client-id.js +0 -0
- /package/dist/{webmention → util}/public-address.d.ts +0 -0
- /package/dist/{webmention → util}/public-address.js +0 -0
- /package/dist/{env.js → web/env.js} +0 -0
package/dist/content/store.js
CHANGED
|
@@ -1,18 +1,6 @@
|
|
|
1
|
-
import { databaseFile, openDatabase } from '../cache.js';
|
|
2
|
-
import { featuredPosts, PINNED_FRONT_MATTER_KEY } from './pinned.js';
|
|
3
|
-
import { searchExpression, searchText, SNIPPET_CLOSE, SNIPPET_OPEN } from './search.js';
|
|
4
|
-
import { tagKey, uniqueTags } from './tags.js';
|
|
5
|
-
import { VISIBILITIES, VISIBILITY_FRONT_MATTER_KEY } from './visibility.js';
|
|
6
|
-
import { repliesKey } from '../web/feed-source.js';
|
|
7
|
-
import { feedGuid, postObjectId } from '../web/guids.js';
|
|
8
|
-
import { absoluteUrl } from '../web/negotiate.js';
|
|
9
|
-
import { NO_REDIRECTS } from '../web/redirects.js';
|
|
10
|
-
import { linksInto, ownSiteLinks, siteLinkKey, spelling } from '../webmention/links.js';
|
|
11
1
|
export { DATABASE_FILE } from '../cache.js';
|
|
12
2
|
/** Directory name that marks a document as thrown away but not yet deleted. */
|
|
13
3
|
export const TRASH_DIRECTORY = '_trash';
|
|
14
|
-
/** The clock an index uses when it is not given one. */
|
|
15
|
-
export const systemClock = () => new Date();
|
|
16
4
|
/**
|
|
17
5
|
* Thrown when two live files claim the same permalink. Two documents at one URL is
|
|
18
6
|
* a content mistake the site owner has to fix, so the index refuses it rather
|
|
@@ -55,1042 +43,4 @@ export function dateSortKey(date) {
|
|
|
55
43
|
const parsed = new Date(date);
|
|
56
44
|
return Number.isNaN(parsed.getTime()) ? null : parsed.toISOString();
|
|
57
45
|
}
|
|
58
|
-
/**
|
|
59
|
-
* The clause every public query carries: a document is public only once its
|
|
60
|
-
* date has arrived.
|
|
61
|
-
*
|
|
62
|
-
* A document with no date — or one nobody can read — has nothing to wait for
|
|
63
|
-
* and is public straight away, which is what keeps an undated page out of the
|
|
64
|
-
* scheduling rule without a second predicate. The value compared against is a
|
|
65
|
-
* {@link dateSortKey} of the clock, so the comparison is between two UTC ISO
|
|
66
|
-
* strings and lexicographic order is chronological order.
|
|
67
|
-
*/
|
|
68
|
-
const DUE_CLAUSE = '(date_sort IS NULL OR date_sort <= ?)';
|
|
69
|
-
/** The reverse: a document whose date is still ahead of the clock. */
|
|
70
|
-
const SCHEDULED_CLAUSE = '(date_sort IS NOT NULL AND date_sort > ?)';
|
|
71
|
-
const VISIBILITY_SQL = `COALESCE(json_extract(extra, '$.${VISIBILITY_FRONT_MATTER_KEY}'), 'public')`;
|
|
72
|
-
const SERVED_CLAUSE = `(draft = 0 AND trashed = 0 AND ${DUE_CLAUSE} AND ${VISIBILITY_SQL} IN (${VISIBILITIES.map((visibility) => `'${visibility}'`).join(', ')}))`;
|
|
73
|
-
const LISTED_CLAUSE = `(${SERVED_CLAUSE} AND ${VISIBILITY_SQL} = 'public')`;
|
|
74
|
-
/**
|
|
75
|
-
* A document whose front matter carries a `pinned` key that is not `false`.
|
|
76
|
-
* Which moment it was pinned at, and whether it is readable at all, is
|
|
77
|
-
* `content/pinned.ts`'s to decide; this only keeps the rest of an archive from
|
|
78
|
-
* being hydrated to find out.
|
|
79
|
-
*/
|
|
80
|
-
const PINNED_CLAUSE = `COALESCE(json_extract(extra, '$.${PINNED_FRONT_MATTER_KEY}'), 0) NOT IN (0, '')`;
|
|
81
|
-
/**
|
|
82
|
-
* The clause that picks out a document some follower holds a copy of: one
|
|
83
|
-
* whose `activitypub` block records when it was announced.
|
|
84
|
-
*
|
|
85
|
-
* `published` rather than `id`, because after decision-13 a post's id is its
|
|
86
|
-
* permalink and is never written into the file: the announcement date is the
|
|
87
|
-
* only mark a delivery leaves, and it is the one thing that says a follower
|
|
88
|
-
* was ever told. The block is stored as JSON rather than shredded into
|
|
89
|
-
* columns, so the date is read back out of it here. An empty value is no
|
|
90
|
-
* value: the front matter is a file somebody may have typed, and
|
|
91
|
-
* `activitypub: {published: ""}` is what a half-finished hand edit looks like.
|
|
92
|
-
*/
|
|
93
|
-
const FEDERATED_CLAUSE = `COALESCE(json_extract(activitypub, '$.published'), '') <> ''`;
|
|
94
|
-
/**
|
|
95
|
-
* The public side of a search: the full-text match joined to the documents it
|
|
96
|
-
* indexes, held to exactly what every public listing is held to.
|
|
97
|
-
*
|
|
98
|
-
* The draft, trash and due clauses are applied to the documents table rather
|
|
99
|
-
* than indexed alongside the words, so a post that is drafted, trashed or
|
|
100
|
-
* pushed into the future drops out of the results the moment the listings drop
|
|
101
|
-
* it, with no second write to keep in step.
|
|
102
|
-
*/
|
|
103
|
-
const SEARCH_FROM = `
|
|
104
|
-
FROM documents_fts
|
|
105
|
-
JOIN documents ON documents.path = documents_fts.path
|
|
106
|
-
WHERE documents_fts MATCH ?
|
|
107
|
-
AND ${LISTED_CLAUSE}
|
|
108
|
-
`;
|
|
109
|
-
/**
|
|
110
|
-
* How much a match in each column of the index counts, in the order the table
|
|
111
|
-
* declares them: the path is not indexed, a title match counts for most, the
|
|
112
|
-
* description and the taxonomy for half as much, and the body for least.
|
|
113
|
-
*/
|
|
114
|
-
const SEARCH_WEIGHTS = '0.0, 10.0, 5.0, 5.0, 1.0';
|
|
115
|
-
/**
|
|
116
|
-
* Open (and if needed create) the index in `dataDir`, applying every migration
|
|
117
|
-
* the package ships. Applying them is idempotent, so reopening an up-to-date
|
|
118
|
-
* database does nothing.
|
|
119
|
-
*/
|
|
120
|
-
export function openContentStore(options) {
|
|
121
|
-
const clock = options.now ?? systemClock;
|
|
122
|
-
/** The clock as the index sorts dates, so the two compare as strings. */
|
|
123
|
-
function nowKey() {
|
|
124
|
-
return clock().toISOString();
|
|
125
|
-
}
|
|
126
|
-
const file = databaseFile(options.dataDir);
|
|
127
|
-
const db = openDatabase({ dataDir: options.dataDir, ledger: LEDGER, migrations: MIGRATIONS });
|
|
128
|
-
const statements = {
|
|
129
|
-
insert: db.prepare(`
|
|
130
|
-
INSERT INTO documents (
|
|
131
|
-
path, type, slug, permalink, title, date, date_sort, updated, draft, trashed,
|
|
132
|
-
description, author, in_reply_to, activitypub, extra, body, html, hash,
|
|
133
|
-
replies_key, reply_post_key, keys_base
|
|
134
|
-
) VALUES (
|
|
135
|
-
:path, :type, :slug, :permalink, :title, :date, :date_sort, :updated, :draft, :trashed,
|
|
136
|
-
:description, :author, :in_reply_to, :activitypub, :extra, :body, :html, :hash,
|
|
137
|
-
:replies_key, :reply_post_key, :keys_base
|
|
138
|
-
)
|
|
139
|
-
ON CONFLICT (path) DO UPDATE SET
|
|
140
|
-
type = excluded.type,
|
|
141
|
-
slug = excluded.slug,
|
|
142
|
-
permalink = excluded.permalink,
|
|
143
|
-
title = excluded.title,
|
|
144
|
-
date = excluded.date,
|
|
145
|
-
date_sort = excluded.date_sort,
|
|
146
|
-
updated = excluded.updated,
|
|
147
|
-
draft = excluded.draft,
|
|
148
|
-
trashed = excluded.trashed,
|
|
149
|
-
description = excluded.description,
|
|
150
|
-
author = excluded.author,
|
|
151
|
-
in_reply_to = excluded.in_reply_to,
|
|
152
|
-
activitypub = excluded.activitypub,
|
|
153
|
-
extra = excluded.extra,
|
|
154
|
-
body = excluded.body,
|
|
155
|
-
html = excluded.html,
|
|
156
|
-
hash = excluded.hash,
|
|
157
|
-
replies_key = excluded.replies_key,
|
|
158
|
-
reply_post_key = excluded.reply_post_key,
|
|
159
|
-
keys_base = excluded.keys_base
|
|
160
|
-
`),
|
|
161
|
-
rowsKeyedElsewhere: db.prepare('SELECT * FROM documents WHERE keys_base IS NOT ?'),
|
|
162
|
-
writeKeys: db.prepare(`
|
|
163
|
-
UPDATE documents
|
|
164
|
-
SET replies_key = :replies_key, reply_post_key = :reply_post_key, keys_base = :keys_base
|
|
165
|
-
WHERE path = :path
|
|
166
|
-
`),
|
|
167
|
-
byRepliesKey: db.prepare(`
|
|
168
|
-
SELECT * FROM documents
|
|
169
|
-
WHERE (replies_key = ?1 OR reply_post_key = ?1) AND ${SERVED_CLAUSE}
|
|
170
|
-
ORDER BY replies_key = ?1 DESC, date_sort DESC, path DESC
|
|
171
|
-
`),
|
|
172
|
-
deleteTags: db.prepare('DELETE FROM document_tags WHERE path = ?'),
|
|
173
|
-
insertTag: db.prepare('INSERT INTO document_tags (path, tag, key, position) VALUES (?, ?, ?, ?)'),
|
|
174
|
-
deleteCategories: db.prepare('DELETE FROM document_categories WHERE path = ?'),
|
|
175
|
-
insertCategory: db.prepare('INSERT INTO document_categories (path, category, position) VALUES (?, ?, ?)'),
|
|
176
|
-
pathForPermalink: db.prepare('SELECT path FROM documents WHERE permalink = ? AND trashed = 0'),
|
|
177
|
-
remove: db.prepare('DELETE FROM documents WHERE path = ?'),
|
|
178
|
-
byPath: db.prepare('SELECT * FROM documents WHERE path = ?'),
|
|
179
|
-
byPermalink: db.prepare('SELECT * FROM documents WHERE permalink = ? ORDER BY trashed, path DESC LIMIT 1'),
|
|
180
|
-
deleteLinks: db.prepare('DELETE FROM document_links WHERE path = ?'),
|
|
181
|
-
insertLink: db.prepare('INSERT INTO document_links (path, target, query) VALUES (?, ?, ?)'),
|
|
182
|
-
servedAt: db.prepare(`SELECT 1 FROM documents WHERE permalink = ? AND ${SERVED_CLAUSE} LIMIT 1`),
|
|
183
|
-
deleteRedirects: db.prepare('DELETE FROM document_redirects WHERE path = ?'),
|
|
184
|
-
insertRedirect: db.prepare('INSERT INTO document_redirects (path, url, position) VALUES (?, ?, ?)'),
|
|
185
|
-
redirectsFor: db.prepare('SELECT url FROM document_redirects WHERE path = ? ORDER BY position'),
|
|
186
|
-
byFormerPermalink: db.prepare(`
|
|
187
|
-
SELECT documents.* FROM documents
|
|
188
|
-
JOIN document_redirects ON document_redirects.path = documents.path
|
|
189
|
-
WHERE document_redirects.url = ?
|
|
190
|
-
AND ${SERVED_CLAUSE}
|
|
191
|
-
ORDER BY documents.updated DESC, documents.path DESC
|
|
192
|
-
LIMIT 1
|
|
193
|
-
`),
|
|
194
|
-
byStoredObjectId: db.prepare(`SELECT * FROM documents WHERE json_extract(activitypub, '$.id') = ? ORDER BY trashed LIMIT 1`),
|
|
195
|
-
bySlug: db.prepare(`SELECT * FROM documents WHERE slug = ? ORDER BY date_sort DESC, path DESC LIMIT 1`),
|
|
196
|
-
tagsFor: db.prepare('SELECT tag, key FROM document_tags WHERE path = ? ORDER BY position'),
|
|
197
|
-
keysFor: db.prepare('SELECT key FROM document_tags WHERE path = ?'),
|
|
198
|
-
spellings: db.prepare(tagSpellingsSql('')),
|
|
199
|
-
spellingsOfKeys: db.prepare(tagSpellingsSql('WHERE spelled.key IN (SELECT value FROM json_each(:keys))')),
|
|
200
|
-
spellingExcluding: db.prepare(tagSpellingsSql('WHERE spelled.key = :key AND spelled.path <> :excluding')),
|
|
201
|
-
dataVersion: db.prepare('PRAGMA data_version'),
|
|
202
|
-
categoriesFor: db.prepare('SELECT category FROM document_categories WHERE path = ? ORDER BY position'),
|
|
203
|
-
paths: db.prepare('SELECT path FROM documents ORDER BY path'),
|
|
204
|
-
counts: db.prepare(`
|
|
205
|
-
SELECT
|
|
206
|
-
COUNT(*) AS total,
|
|
207
|
-
COALESCE(SUM(type = 'post' AND ${LISTED_CLAUSE}), 0) AS posts,
|
|
208
|
-
COALESCE(SUM(type = 'page' AND ${LISTED_CLAUSE}), 0) AS pages,
|
|
209
|
-
COALESCE(SUM(draft = 1 AND trashed = 0), 0) AS drafts,
|
|
210
|
-
COALESCE(SUM(draft = 0 AND trashed = 0 AND ${SCHEDULED_CLAUSE}), 0) AS scheduled,
|
|
211
|
-
COALESCE(SUM(trashed = 1), 0) AS trashed
|
|
212
|
-
FROM documents
|
|
213
|
-
`),
|
|
214
|
-
tagCounts: db.prepare(`
|
|
215
|
-
SELECT document_tags.key AS key, MIN(document_tags.tag) AS tag, COUNT(*) AS count
|
|
216
|
-
FROM document_tags
|
|
217
|
-
JOIN documents ON documents.path = document_tags.path
|
|
218
|
-
WHERE ${LISTED_CLAUSE}
|
|
219
|
-
GROUP BY document_tags.key
|
|
220
|
-
`),
|
|
221
|
-
categoryCounts: db.prepare(`
|
|
222
|
-
SELECT document_categories.category AS category, COUNT(*) AS count
|
|
223
|
-
FROM document_categories
|
|
224
|
-
JOIN documents ON documents.path = document_categories.path
|
|
225
|
-
WHERE ${LISTED_CLAUSE}
|
|
226
|
-
GROUP BY document_categories.category
|
|
227
|
-
ORDER BY count DESC, category ASC
|
|
228
|
-
`),
|
|
229
|
-
tagUsage: db.prepare(termUsageSql(TERM_TABLES.tag)),
|
|
230
|
-
categoryUsage: db.prepare(termUsageSql(TERM_TABLES.category)),
|
|
231
|
-
nextDue: db.prepare(`
|
|
232
|
-
SELECT MIN(date_sort) AS due FROM documents
|
|
233
|
-
WHERE draft = 0 AND trashed = 0 AND ${SCHEDULED_CLAUSE}
|
|
234
|
-
`),
|
|
235
|
-
deleteText: db.prepare('DELETE FROM documents_fts WHERE path = ?'),
|
|
236
|
-
insertText: db.prepare('INSERT INTO documents_fts (path, title, description, terms, body) VALUES (?, ?, ?, ?, ?)'),
|
|
237
|
-
search: db.prepare(`
|
|
238
|
-
SELECT documents.*,
|
|
239
|
-
snippet(documents_fts, -1, '${SNIPPET_OPEN}', '${SNIPPET_CLOSE}', '…', 24) AS snippet
|
|
240
|
-
${SEARCH_FROM}
|
|
241
|
-
ORDER BY bm25(documents_fts, ${SEARCH_WEIGHTS}), documents.date_sort DESC, documents.path DESC
|
|
242
|
-
LIMIT ? OFFSET ?
|
|
243
|
-
`),
|
|
244
|
-
countSearch: db.prepare(`SELECT COUNT(*) AS count ${SEARCH_FROM}`),
|
|
245
|
-
dueSince: db.prepare(`
|
|
246
|
-
SELECT * FROM documents
|
|
247
|
-
WHERE draft = 0 AND trashed = 0
|
|
248
|
-
AND date_sort IS NOT NULL AND date_sort > ? AND date_sort <= ?
|
|
249
|
-
ORDER BY date_sort ASC, path ASC
|
|
250
|
-
`),
|
|
251
|
-
};
|
|
252
|
-
let open = true;
|
|
253
|
-
/**
|
|
254
|
-
* Work out again everything worked out against another base, or none: the
|
|
255
|
-
* `/replies/` keys and the links to the site's own pages.
|
|
256
|
-
*/
|
|
257
|
-
function refreshAgainstBase(baseUrl) {
|
|
258
|
-
db.exec('BEGIN');
|
|
259
|
-
try {
|
|
260
|
-
for (const row of statements.rowsKeyedElsewhere.all(baseUrl)) {
|
|
261
|
-
const document = toDocument(row, [], []);
|
|
262
|
-
statements.writeKeys.run({ path: document.path, ...repliesKeysOf(document, baseUrl) });
|
|
263
|
-
writeLinks(document, baseUrl);
|
|
264
|
-
}
|
|
265
|
-
db.exec('COMMIT');
|
|
266
|
-
}
|
|
267
|
-
catch (error) {
|
|
268
|
-
db.exec('ROLLBACK');
|
|
269
|
-
throw error;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
if (options.baseUrl !== undefined)
|
|
273
|
-
refreshAgainstBase(options.baseUrl);
|
|
274
|
-
let cachedSpellings;
|
|
275
|
-
const staleKeys = new Set();
|
|
276
|
-
const MOST_KEYS_REFRESHED = 500;
|
|
277
|
-
function siteSpellings() {
|
|
278
|
-
const now = nowKey();
|
|
279
|
-
const dataVersion = statements.dataVersion.get()?.['data_version'];
|
|
280
|
-
const current = cachedSpellings === undefined || outOfDate(cachedSpellings, dataVersion, now)
|
|
281
|
-
? undefined
|
|
282
|
-
: cachedSpellings.byKey;
|
|
283
|
-
if (current !== undefined && staleKeys.size === 0)
|
|
284
|
-
return current;
|
|
285
|
-
const refreshStaleOnly = current !== undefined && staleKeys.size <= MOST_KEYS_REFRESHED;
|
|
286
|
-
const byKey = refreshStaleOnly ? current : new Map();
|
|
287
|
-
const rows = refreshStaleOnly
|
|
288
|
-
? refreshStaleSpellings(byKey, now)
|
|
289
|
-
: statements.spellings.all(now);
|
|
290
|
-
for (const row of rows)
|
|
291
|
-
byKey.set(String(row['key']), String(row['tag']));
|
|
292
|
-
staleKeys.clear();
|
|
293
|
-
const nextScheduledAt = text(statements.nextDue.get(now)['due']);
|
|
294
|
-
cachedSpellings = { byKey, dataVersion, workedOutAt: now, nextScheduledAt };
|
|
295
|
-
return byKey;
|
|
296
|
-
}
|
|
297
|
-
function refreshStaleSpellings(byKey, now) {
|
|
298
|
-
for (const key of staleKeys)
|
|
299
|
-
byKey.delete(key);
|
|
300
|
-
return statements.spellingsOfKeys.all({ keys: JSON.stringify([...staleKeys]) }, now);
|
|
301
|
-
}
|
|
302
|
-
function markTagsStaleBeforeWrite(contentPath) {
|
|
303
|
-
for (const row of statements.keysFor.all(contentPath))
|
|
304
|
-
staleKeys.add(String(row['key']));
|
|
305
|
-
}
|
|
306
|
-
function tagsOf(contentPath) {
|
|
307
|
-
const spellings = siteSpellings();
|
|
308
|
-
return statements.tagsFor
|
|
309
|
-
.all(contentPath)
|
|
310
|
-
.map((row) => spellings.get(String(row['key'])) ?? String(row['tag']));
|
|
311
|
-
}
|
|
312
|
-
function categoriesOf(contentPath) {
|
|
313
|
-
return statements.categoriesFor.all(contentPath).map((row) => String(row['category']));
|
|
314
|
-
}
|
|
315
|
-
function hydrate(row) {
|
|
316
|
-
if (row === undefined)
|
|
317
|
-
return undefined;
|
|
318
|
-
return hydrateOne(row);
|
|
319
|
-
}
|
|
320
|
-
function hydrateOne(row) {
|
|
321
|
-
const contentPath = String(row['path']);
|
|
322
|
-
const redirectFrom = statements.redirectsFor
|
|
323
|
-
.all(contentPath)
|
|
324
|
-
.map((redirect) => String(redirect['url']));
|
|
325
|
-
return {
|
|
326
|
-
...toDocument(row, tagsOf(contentPath), categoriesOf(contentPath)),
|
|
327
|
-
...(redirectFrom.length === 0 ? {} : { redirectFrom }),
|
|
328
|
-
};
|
|
329
|
-
}
|
|
330
|
-
function hydrateAll(rows) {
|
|
331
|
-
return rows.map(hydrateOne);
|
|
332
|
-
}
|
|
333
|
-
function writeLinks(document, baseUrl) {
|
|
334
|
-
statements.deleteLinks.run(document.path);
|
|
335
|
-
if (baseUrl === undefined)
|
|
336
|
-
return;
|
|
337
|
-
const pageUrl = absoluteUrl(document.permalink, baseUrl);
|
|
338
|
-
for (const { path, query } of ownSiteLinks(document.html, pageUrl, baseUrl)) {
|
|
339
|
-
statements.insertLink.run(document.path, path, query);
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
/**
|
|
343
|
-
* The paths a link to `document` may name: its permalink, and each of its
|
|
344
|
-
* former ones that the site still answers with it rather than with a live
|
|
345
|
-
* document holding it now or another document claiming it.
|
|
346
|
-
*/
|
|
347
|
-
function linkKeysOf(document) {
|
|
348
|
-
const former = (document.redirectFrom ?? []).filter((url) => statements.byPermalink.get(url) === undefined &&
|
|
349
|
-
text(statements.byFormerPermalink.get(url, nowKey())?.['path']) === document.path);
|
|
350
|
-
return [...new Set([document.permalink, ...former].map(siteLinkKey))];
|
|
351
|
-
}
|
|
352
|
-
function writeOne(document) {
|
|
353
|
-
const contentPath = document.path;
|
|
354
|
-
markTagsStaleBeforeWrite(contentPath);
|
|
355
|
-
for (const tag of document.tags)
|
|
356
|
-
staleKeys.add(tagKey(tag));
|
|
357
|
-
try {
|
|
358
|
-
statements.insert.run({ ...toRow(document), ...repliesKeysOf(document, options.baseUrl) });
|
|
359
|
-
}
|
|
360
|
-
catch (error) {
|
|
361
|
-
throw translateWriteError(error, document, statements.pathForPermalink);
|
|
362
|
-
}
|
|
363
|
-
statements.deleteTags.run(contentPath);
|
|
364
|
-
uniqueTags(document.tags).forEach((tag, position) => {
|
|
365
|
-
statements.insertTag.run(contentPath, tag, tagKey(tag), position);
|
|
366
|
-
});
|
|
367
|
-
statements.deleteCategories.run(contentPath);
|
|
368
|
-
document.categories.forEach((category, position) => {
|
|
369
|
-
statements.insertCategory.run(contentPath, category, position);
|
|
370
|
-
});
|
|
371
|
-
statements.deleteRedirects.run(contentPath);
|
|
372
|
-
(document.redirectFrom ?? []).forEach((url, position) => {
|
|
373
|
-
statements.insertRedirect.run(contentPath, url, position);
|
|
374
|
-
});
|
|
375
|
-
writeLinks(document, options.baseUrl);
|
|
376
|
-
// The words it is found by. Replaced rather than updated, because an FTS5
|
|
377
|
-
// table has no key to conflict on: the path is only a column in it.
|
|
378
|
-
const words = searchText(document);
|
|
379
|
-
statements.deleteText.run(contentPath);
|
|
380
|
-
statements.insertText.run(contentPath, words.title, words.description, words.terms, words.body);
|
|
381
|
-
}
|
|
382
|
-
/**
|
|
383
|
-
* One taxonomy archive: the published, untrashed documents whose term list
|
|
384
|
-
* holds `term`, newest first. Tags and categories are the same query over two
|
|
385
|
-
* tables, so neither can drift from the other.
|
|
386
|
-
*/
|
|
387
|
-
function selectByTerm(terms, term, options) {
|
|
388
|
-
const where = [LISTED_CLAUSE, termFilter(terms)];
|
|
389
|
-
const params = [nowKey(), terms.match(term)];
|
|
390
|
-
if (options.type !== undefined) {
|
|
391
|
-
where.unshift('type = ?');
|
|
392
|
-
params.unshift(options.type);
|
|
393
|
-
}
|
|
394
|
-
return select(where, params, options);
|
|
395
|
-
}
|
|
396
|
-
/** {@link selectByTerm}'s total, for the pager and the archive's existence. */
|
|
397
|
-
function countByTerm(terms, term, options) {
|
|
398
|
-
const { table, matchColumn } = terms;
|
|
399
|
-
const where = [LISTED_CLAUSE, `${table}.${matchColumn} = ?`];
|
|
400
|
-
const params = [nowKey(), terms.match(term)];
|
|
401
|
-
if (options.type !== undefined) {
|
|
402
|
-
where.push('documents.type = ?');
|
|
403
|
-
params.push(options.type);
|
|
404
|
-
}
|
|
405
|
-
const row = db
|
|
406
|
-
.prepare(`SELECT COUNT(*) AS count FROM ${table}
|
|
407
|
-
JOIN documents ON documents.path = ${table}.path
|
|
408
|
-
WHERE ${where.join(' AND ')}`)
|
|
409
|
-
.get(...params);
|
|
410
|
-
return Number(row['count']);
|
|
411
|
-
}
|
|
412
|
-
/**
|
|
413
|
-
* The nearest published post on one side of a point in the archive.
|
|
414
|
-
*
|
|
415
|
-
* `direction` is which way to look — `<` for older, `>` for newer — and
|
|
416
|
-
* `order` is the sort that puts the nearest one first, so one query serves
|
|
417
|
-
* both ends of {@link ContentStore.neighbours}.
|
|
418
|
-
*/
|
|
419
|
-
function neighbour(direction, order, key, contentPath) {
|
|
420
|
-
const row = db
|
|
421
|
-
.prepare(`SELECT * FROM documents
|
|
422
|
-
WHERE type = 'post' AND ${LISTED_CLAUSE}
|
|
423
|
-
AND date_sort IS NOT NULL
|
|
424
|
-
AND (date_sort, path) ${direction} (?, ?)
|
|
425
|
-
ORDER BY date_sort ${order}, path ${order}
|
|
426
|
-
LIMIT 1`)
|
|
427
|
-
.get(...[nowKey(), key, contentPath]);
|
|
428
|
-
return hydrate(row);
|
|
429
|
-
}
|
|
430
|
-
function select(where, params, options) {
|
|
431
|
-
const clause = where.length === 0 ? '' : `WHERE ${where.join(' AND ')}`;
|
|
432
|
-
const rows = db
|
|
433
|
-
.prepare(`SELECT * FROM documents ${clause} ORDER BY date_sort DESC, path DESC ${limitClause(options)}`)
|
|
434
|
-
.all(...params, ...limitParams(options));
|
|
435
|
-
return hydrateAll(rows);
|
|
436
|
-
}
|
|
437
|
-
return {
|
|
438
|
-
file,
|
|
439
|
-
now() {
|
|
440
|
-
return clock();
|
|
441
|
-
},
|
|
442
|
-
upsert(document) {
|
|
443
|
-
writeOne(document);
|
|
444
|
-
},
|
|
445
|
-
upsertAll(documents) {
|
|
446
|
-
db.exec('BEGIN');
|
|
447
|
-
try {
|
|
448
|
-
for (const document of documents)
|
|
449
|
-
writeOne(document);
|
|
450
|
-
db.exec('COMMIT');
|
|
451
|
-
}
|
|
452
|
-
catch (error) {
|
|
453
|
-
db.exec('ROLLBACK');
|
|
454
|
-
throw error;
|
|
455
|
-
}
|
|
456
|
-
},
|
|
457
|
-
remove(contentPath) {
|
|
458
|
-
markTagsStaleBeforeWrite(contentPath);
|
|
459
|
-
// Nothing cascades into a virtual table, so the words go by hand.
|
|
460
|
-
statements.deleteText.run(contentPath);
|
|
461
|
-
return statements.remove.run(contentPath).changes > 0;
|
|
462
|
-
},
|
|
463
|
-
clear() {
|
|
464
|
-
cachedSpellings = undefined;
|
|
465
|
-
staleKeys.clear();
|
|
466
|
-
db.exec('BEGIN');
|
|
467
|
-
try {
|
|
468
|
-
// All four by name. The two term tables would go with the documents
|
|
469
|
-
// through their foreign keys, but a virtual table has none to cascade
|
|
470
|
-
// through — and a clear that depended on a pragma being on for half of
|
|
471
|
-
// what it empties would be a clear that half worked.
|
|
472
|
-
db.exec('DELETE FROM documents_fts');
|
|
473
|
-
db.exec('DELETE FROM document_tags');
|
|
474
|
-
db.exec('DELETE FROM document_categories');
|
|
475
|
-
db.exec('DELETE FROM document_redirects');
|
|
476
|
-
db.exec('DELETE FROM document_links');
|
|
477
|
-
db.exec('DELETE FROM documents');
|
|
478
|
-
db.exec('COMMIT');
|
|
479
|
-
}
|
|
480
|
-
catch (error) {
|
|
481
|
-
db.exec('ROLLBACK');
|
|
482
|
-
throw error;
|
|
483
|
-
}
|
|
484
|
-
},
|
|
485
|
-
getByPath(contentPath) {
|
|
486
|
-
return hydrate(statements.byPath.get(contentPath));
|
|
487
|
-
},
|
|
488
|
-
getByPermalink(permalink) {
|
|
489
|
-
return hydrate(statements.byPermalink.get(permalink));
|
|
490
|
-
},
|
|
491
|
-
getByStoredObjectId(objectId) {
|
|
492
|
-
if (objectId === '')
|
|
493
|
-
return undefined;
|
|
494
|
-
return hydrate(statements.byStoredObjectId.get(objectId));
|
|
495
|
-
},
|
|
496
|
-
getByFormerPermalink(permalink) {
|
|
497
|
-
return hydrate(statements.byFormerPermalink.get(permalink, nowKey()));
|
|
498
|
-
},
|
|
499
|
-
getBySlug(slug) {
|
|
500
|
-
return hydrate(statements.bySlug.get(slug));
|
|
501
|
-
},
|
|
502
|
-
listPosts(options = {}) {
|
|
503
|
-
return select(["type = 'post'", LISTED_CLAUSE], [nowKey()], options);
|
|
504
|
-
},
|
|
505
|
-
neighbours(document) {
|
|
506
|
-
// A page is nobody's neighbour, and neither is a document the archive
|
|
507
|
-
// does not order: without a date there is no place in the sequence to be
|
|
508
|
-
// either side of.
|
|
509
|
-
const key = dateSortKey(document.date);
|
|
510
|
-
if (document.type !== 'post' || key === null)
|
|
511
|
-
return {};
|
|
512
|
-
// The listings are ordered by `date_sort DESC, path DESC`, so "before"
|
|
513
|
-
// and "after" are that same pair compared as a row: two posts sharing an
|
|
514
|
-
// instant are separated by their paths exactly as the listing separates
|
|
515
|
-
// them, and the document itself is excluded by the comparison being
|
|
516
|
-
// strict.
|
|
517
|
-
const previous = neighbour('<', 'DESC', key, document.path);
|
|
518
|
-
const next = neighbour('>', 'ASC', key, document.path);
|
|
519
|
-
return {
|
|
520
|
-
...(previous === undefined ? {} : { previous }),
|
|
521
|
-
...(next === undefined ? {} : { next }),
|
|
522
|
-
};
|
|
523
|
-
},
|
|
524
|
-
nextDue() {
|
|
525
|
-
const row = statements.nextDue.get(nowKey());
|
|
526
|
-
return text(row['due']);
|
|
527
|
-
},
|
|
528
|
-
listDueSince(after) {
|
|
529
|
-
const rows = statements.dueSince.all(after, nowKey());
|
|
530
|
-
return hydrateAll(rows);
|
|
531
|
-
},
|
|
532
|
-
listByTag(tag, options = {}) {
|
|
533
|
-
return selectByTerm(TERM_TABLES.tag, tag, options);
|
|
534
|
-
},
|
|
535
|
-
listByCategory(category, options = {}) {
|
|
536
|
-
return selectByTerm(TERM_TABLES.category, category, options);
|
|
537
|
-
},
|
|
538
|
-
listByAuthor(names, options = {}) {
|
|
539
|
-
if (names.length === 0)
|
|
540
|
-
return [];
|
|
541
|
-
return select(["type = 'post'", LISTED_CLAUSE, authorClause(names)], [nowKey(), ...names], options);
|
|
542
|
-
},
|
|
543
|
-
listPinnedByAuthor(names) {
|
|
544
|
-
if (names.length === 0)
|
|
545
|
-
return [];
|
|
546
|
-
return featuredPosts(select(["type = 'post'", LISTED_CLAUSE, authorClause(names), PINNED_CLAUSE], [nowKey(), ...names], {}));
|
|
547
|
-
},
|
|
548
|
-
listAll(options = {}) {
|
|
549
|
-
const where = [];
|
|
550
|
-
const params = [];
|
|
551
|
-
if (options.type !== undefined) {
|
|
552
|
-
where.push('type = ?');
|
|
553
|
-
params.push(options.type);
|
|
554
|
-
}
|
|
555
|
-
if (options.draft !== undefined) {
|
|
556
|
-
where.push('draft = ?');
|
|
557
|
-
params.push(options.draft ? 1 : 0);
|
|
558
|
-
}
|
|
559
|
-
where.push('trashed = ?');
|
|
560
|
-
params.push(options.trashed === true ? 1 : 0);
|
|
561
|
-
if (options.scheduled !== undefined) {
|
|
562
|
-
where.push(options.scheduled ? SCHEDULED_CLAUSE : DUE_CLAUSE);
|
|
563
|
-
params.push(nowKey());
|
|
564
|
-
}
|
|
565
|
-
if (options.tag !== undefined) {
|
|
566
|
-
where.push(termFilter(TERM_TABLES.tag));
|
|
567
|
-
params.push(TERM_TABLES.tag.match(options.tag));
|
|
568
|
-
}
|
|
569
|
-
if (options.category !== undefined) {
|
|
570
|
-
where.push(termFilter(TERM_TABLES.category));
|
|
571
|
-
params.push(TERM_TABLES.category.match(options.category));
|
|
572
|
-
}
|
|
573
|
-
return select(where, params, options);
|
|
574
|
-
},
|
|
575
|
-
listFederated(options = {}) {
|
|
576
|
-
return select([`type = 'post'`, FEDERATED_CLAUSE], [], options);
|
|
577
|
-
},
|
|
578
|
-
listRepliesTo(targets) {
|
|
579
|
-
const wanted = [...new Set(targets)];
|
|
580
|
-
if (wanted.length === 0)
|
|
581
|
-
return [];
|
|
582
|
-
return select(["type = 'post'", SERVED_CLAUSE, `in_reply_to IN (${wanted.map(() => '?').join(', ')})`], [nowKey(), ...wanted], {});
|
|
583
|
-
},
|
|
584
|
-
listReplyPosts(options = {}) {
|
|
585
|
-
return select(["type = 'post'", SERVED_CLAUSE, 'in_reply_to IS NOT NULL'], [nowKey()], options);
|
|
586
|
-
},
|
|
587
|
-
listByRepliesKey(key) {
|
|
588
|
-
return hydrateAll(statements.byRepliesKey.all(key, nowKey()));
|
|
589
|
-
},
|
|
590
|
-
listBacklinks(document, site = {}) {
|
|
591
|
-
const now = nowKey();
|
|
592
|
-
const answeredAt = linkKeysOf(document);
|
|
593
|
-
if (site.home === true)
|
|
594
|
-
answeredAt.push('/');
|
|
595
|
-
const into = linksInto(site.redirects ?? NO_REDIRECTS, answeredAt, (sitePath) => [sitePath, `${sitePath}/`].some((url) => statements.servedAt.get(url, now) !== undefined ||
|
|
596
|
-
statements.byFormerPermalink.get(url, now) !== undefined));
|
|
597
|
-
return select([
|
|
598
|
-
LISTED_CLAUSE,
|
|
599
|
-
'path <> ?',
|
|
600
|
-
`path IN (
|
|
601
|
-
SELECT path FROM document_links
|
|
602
|
-
WHERE target IN (SELECT value FROM json_each(?))
|
|
603
|
-
AND (query = '' OR target || '?' || query NOT IN (SELECT value FROM json_each(?)))
|
|
604
|
-
UNION
|
|
605
|
-
SELECT path FROM document_links
|
|
606
|
-
WHERE target IN (SELECT value FROM json_each(?))
|
|
607
|
-
AND target || '?' || query IN (SELECT value FROM json_each(?))
|
|
608
|
-
)`,
|
|
609
|
-
], [
|
|
610
|
-
now,
|
|
611
|
-
document.path,
|
|
612
|
-
JSON.stringify(into.paths),
|
|
613
|
-
JSON.stringify(into.intercepted),
|
|
614
|
-
JSON.stringify(into.queries.map((link) => link.path)),
|
|
615
|
-
JSON.stringify(into.queries.map(spelling)),
|
|
616
|
-
], {});
|
|
617
|
-
},
|
|
618
|
-
listPaths() {
|
|
619
|
-
return statements.paths.all().map((row) => String(row['path']));
|
|
620
|
-
},
|
|
621
|
-
counts() {
|
|
622
|
-
const now = nowKey();
|
|
623
|
-
const row = statements.counts.get(now, now, now);
|
|
624
|
-
return {
|
|
625
|
-
total: Number(row['total']),
|
|
626
|
-
posts: Number(row['posts']),
|
|
627
|
-
pages: Number(row['pages']),
|
|
628
|
-
drafts: Number(row['drafts']),
|
|
629
|
-
scheduled: Number(row['scheduled']),
|
|
630
|
-
trashed: Number(row['trashed']),
|
|
631
|
-
};
|
|
632
|
-
},
|
|
633
|
-
countByTag(tag, options = {}) {
|
|
634
|
-
return countByTerm(TERM_TABLES.tag, tag, options);
|
|
635
|
-
},
|
|
636
|
-
countByCategory(category, options = {}) {
|
|
637
|
-
return countByTerm(TERM_TABLES.category, category, options);
|
|
638
|
-
},
|
|
639
|
-
countByAuthor(names) {
|
|
640
|
-
if (names.length === 0)
|
|
641
|
-
return 0;
|
|
642
|
-
const row = db
|
|
643
|
-
.prepare(`SELECT COUNT(*) AS count FROM documents
|
|
644
|
-
WHERE type = 'post' AND ${LISTED_CLAUSE} AND ${authorClause(names)}`)
|
|
645
|
-
.get(...[nowKey(), ...names]);
|
|
646
|
-
return Number(row['count']);
|
|
647
|
-
},
|
|
648
|
-
listTags() {
|
|
649
|
-
const spellings = siteSpellings();
|
|
650
|
-
return statements.tagCounts
|
|
651
|
-
.all(nowKey())
|
|
652
|
-
.map((row) => ({
|
|
653
|
-
tag: spellings.get(String(row['key'])) ?? String(row['tag']),
|
|
654
|
-
count: Number(row['count']),
|
|
655
|
-
}))
|
|
656
|
-
.sort((a, b) => b.count - a.count || compareByUtf16CodeUnit(a.tag, b.tag));
|
|
657
|
-
},
|
|
658
|
-
tagSpelling(tag, options = {}) {
|
|
659
|
-
if (options.excluding === undefined)
|
|
660
|
-
return siteSpellings().get(tagKey(tag));
|
|
661
|
-
const row = statements.spellingExcluding.get({ key: tagKey(tag), excluding: options.excluding }, nowKey());
|
|
662
|
-
return text(row?.['tag']);
|
|
663
|
-
},
|
|
664
|
-
listCategories() {
|
|
665
|
-
return statements.categoryCounts.all(nowKey()).map((row) => ({
|
|
666
|
-
category: String(row['category']),
|
|
667
|
-
count: Number(row['count']),
|
|
668
|
-
}));
|
|
669
|
-
},
|
|
670
|
-
listTermUsage(taxonomy) {
|
|
671
|
-
const query = taxonomy === 'tag' ? statements.tagUsage : statements.categoryUsage;
|
|
672
|
-
const spellings = taxonomy === 'tag' ? siteSpellings() : new Map();
|
|
673
|
-
return query
|
|
674
|
-
.all(nowKey())
|
|
675
|
-
.map((row) => ({
|
|
676
|
-
term: spellings.get(String(row['key'])) ?? String(row['term']),
|
|
677
|
-
published: Number(row['published']),
|
|
678
|
-
total: Number(row['total']),
|
|
679
|
-
}))
|
|
680
|
-
.sort((a, b) => compareByUtf16CodeUnit(a.term, b.term));
|
|
681
|
-
},
|
|
682
|
-
search(query, options = {}) {
|
|
683
|
-
const expression = searchExpression(query);
|
|
684
|
-
if (expression === undefined)
|
|
685
|
-
return [];
|
|
686
|
-
const rows = statements.search.all(expression, nowKey(), options.limit ?? -1, options.offset ?? 0);
|
|
687
|
-
return rows.map((row) => ({ document: hydrateOne(row), snippet: String(row['snippet']) }));
|
|
688
|
-
},
|
|
689
|
-
countSearch(query) {
|
|
690
|
-
const expression = searchExpression(query);
|
|
691
|
-
if (expression === undefined)
|
|
692
|
-
return 0;
|
|
693
|
-
const row = statements.countSearch.get(expression, nowKey());
|
|
694
|
-
return Number(row['count']);
|
|
695
|
-
},
|
|
696
|
-
setReadOnly(readOnly) {
|
|
697
|
-
db.exec(`PRAGMA query_only = ${readOnly ? 'ON' : 'OFF'}`);
|
|
698
|
-
},
|
|
699
|
-
close() {
|
|
700
|
-
if (!open)
|
|
701
|
-
return;
|
|
702
|
-
open = false;
|
|
703
|
-
db.close();
|
|
704
|
-
},
|
|
705
|
-
};
|
|
706
|
-
}
|
|
707
|
-
const TERM_TABLES = {
|
|
708
|
-
tag: { table: 'document_tags', matchColumn: 'key', column: 'tag', match: tagKey },
|
|
709
|
-
category: {
|
|
710
|
-
table: 'document_categories',
|
|
711
|
-
matchColumn: 'category',
|
|
712
|
-
column: 'category',
|
|
713
|
-
match: (category) => category,
|
|
714
|
-
},
|
|
715
|
-
};
|
|
716
|
-
function outOfDate(cache, dataVersion, now) {
|
|
717
|
-
return (anotherConnectionWrote(cache, dataVersion) ||
|
|
718
|
-
scheduledPostCameDue(cache, now) ||
|
|
719
|
-
clockWentBack(cache, now));
|
|
720
|
-
}
|
|
721
|
-
function anotherConnectionWrote(cache, dataVersion) {
|
|
722
|
-
return cache.dataVersion !== dataVersion;
|
|
723
|
-
}
|
|
724
|
-
function scheduledPostCameDue(cache, now) {
|
|
725
|
-
return cache.nextScheduledAt !== undefined && now >= cache.nextScheduledAt;
|
|
726
|
-
}
|
|
727
|
-
function clockWentBack(cache, now) {
|
|
728
|
-
return now < cache.workedOutAt;
|
|
729
|
-
}
|
|
730
|
-
function compareByUtf16CodeUnit(a, b) {
|
|
731
|
-
if (a === b)
|
|
732
|
-
return 0;
|
|
733
|
-
return a < b ? -1 : 1;
|
|
734
|
-
}
|
|
735
|
-
function termFilter({ table, matchColumn }) {
|
|
736
|
-
return `path IN (SELECT path FROM ${table} WHERE ${matchColumn} = ?)`;
|
|
737
|
-
}
|
|
738
|
-
function tagSpellingsSql(where) {
|
|
739
|
-
return `
|
|
740
|
-
SELECT key, tag FROM (
|
|
741
|
-
SELECT key, tag, ROW_NUMBER() OVER (
|
|
742
|
-
PARTITION BY key
|
|
743
|
-
ORDER BY SUM(listed) DESC,
|
|
744
|
-
MIN(CASE WHEN listed THEN date_sort END) ASC NULLS LAST,
|
|
745
|
-
COUNT(*) DESC,
|
|
746
|
-
MIN(date_sort) ASC NULLS LAST,
|
|
747
|
-
tag ASC
|
|
748
|
-
) AS rank
|
|
749
|
-
FROM (
|
|
750
|
-
SELECT spelled.key AS key, spelled.tag AS tag,
|
|
751
|
-
${LISTED_CLAUSE} AS listed, spelled_in.date_sort AS date_sort
|
|
752
|
-
FROM document_tags AS spelled
|
|
753
|
-
JOIN documents AS spelled_in ON spelled_in.path = spelled.path
|
|
754
|
-
${where}
|
|
755
|
-
)
|
|
756
|
-
GROUP BY key, tag
|
|
757
|
-
)
|
|
758
|
-
WHERE rank = 1
|
|
759
|
-
`;
|
|
760
|
-
}
|
|
761
|
-
function termUsageSql({ table, matchColumn, column }) {
|
|
762
|
-
return `
|
|
763
|
-
SELECT ${table}.${matchColumn} AS key, MIN(${table}.${column}) AS term,
|
|
764
|
-
COALESCE(SUM(${LISTED_CLAUSE}), 0) AS published,
|
|
765
|
-
COUNT(*) AS total
|
|
766
|
-
FROM ${table}
|
|
767
|
-
JOIN documents ON documents.path = ${table}.path
|
|
768
|
-
GROUP BY ${table}.${matchColumn}
|
|
769
|
-
`;
|
|
770
|
-
}
|
|
771
|
-
/**
|
|
772
|
-
* `author IN (?, ?, …)`, with one placeholder per name.
|
|
773
|
-
*
|
|
774
|
-
* Only the count of the names is interpolated; every name itself is a bound
|
|
775
|
-
* parameter, so a display name holding a quote is a string to match rather
|
|
776
|
-
* than anything SQLite reads as syntax.
|
|
777
|
-
*/
|
|
778
|
-
function authorClause(names) {
|
|
779
|
-
return `author IN (${names.map(() => '?').join(', ')})`;
|
|
780
|
-
}
|
|
781
|
-
function limitClause(options) {
|
|
782
|
-
if (options.limit === undefined && options.offset === undefined)
|
|
783
|
-
return '';
|
|
784
|
-
return 'LIMIT ? OFFSET ?';
|
|
785
|
-
}
|
|
786
|
-
function limitParams(options) {
|
|
787
|
-
if (options.limit === undefined && options.offset === undefined)
|
|
788
|
-
return [];
|
|
789
|
-
return [options.limit ?? -1, options.offset ?? 0];
|
|
790
|
-
}
|
|
791
|
-
/**
|
|
792
|
-
* The `/replies/` keys of a document (TASK-327): its feed guid's, and for a
|
|
793
|
-
* reply post its object id's, which is what it is named by in the thread it
|
|
794
|
-
* answers. The two differ only for a reply post with a stored `guid`. Both are
|
|
795
|
-
* worked out against `baseUrl`, which is recorded beside them so a change of
|
|
796
|
-
* site URL is noticed on the next open; with no base there are no keys.
|
|
797
|
-
*/
|
|
798
|
-
function repliesKeysOf(document, baseUrl) {
|
|
799
|
-
if (baseUrl === undefined)
|
|
800
|
-
return { replies_key: null, reply_post_key: null, keys_base: null };
|
|
801
|
-
const isReplyPost = document.type === 'post' && document.inReplyTo !== undefined;
|
|
802
|
-
return {
|
|
803
|
-
replies_key: repliesKey(feedGuid(document, baseUrl)),
|
|
804
|
-
reply_post_key: isReplyPost ? repliesKey(postObjectId(document, baseUrl)) : null,
|
|
805
|
-
keys_base: baseUrl,
|
|
806
|
-
};
|
|
807
|
-
}
|
|
808
|
-
/** A {@link Document} as the columns of the `documents` table. */
|
|
809
|
-
function toRow(document) {
|
|
810
|
-
return {
|
|
811
|
-
path: document.path,
|
|
812
|
-
type: document.type,
|
|
813
|
-
slug: document.slug,
|
|
814
|
-
permalink: document.permalink,
|
|
815
|
-
title: document.title,
|
|
816
|
-
date: document.date ?? null,
|
|
817
|
-
date_sort: dateSortKey(document.date),
|
|
818
|
-
updated: document.updated ?? null,
|
|
819
|
-
draft: document.draft ? 1 : 0,
|
|
820
|
-
trashed: isTrashedPath(document.path) ? 1 : 0,
|
|
821
|
-
description: document.description ?? null,
|
|
822
|
-
author: document.author ?? null,
|
|
823
|
-
in_reply_to: document.inReplyTo ?? null,
|
|
824
|
-
activitypub: document.activitypub === undefined ? null : JSON.stringify(document.activitypub),
|
|
825
|
-
extra: JSON.stringify(document.extra),
|
|
826
|
-
body: document.body,
|
|
827
|
-
html: document.html,
|
|
828
|
-
hash: document.hash,
|
|
829
|
-
};
|
|
830
|
-
}
|
|
831
|
-
/**
|
|
832
|
-
* A row back into a {@link Document}.
|
|
833
|
-
*
|
|
834
|
-
* Optional fields are left off entirely when the column is NULL, so a document
|
|
835
|
-
* that went through the index deep-equals the one that was parsed from the file.
|
|
836
|
-
*/
|
|
837
|
-
function toDocument(row, tags, categories) {
|
|
838
|
-
return {
|
|
839
|
-
type: String(row['type']),
|
|
840
|
-
path: String(row['path']),
|
|
841
|
-
slug: String(row['slug']),
|
|
842
|
-
permalink: String(row['permalink']),
|
|
843
|
-
title: String(row['title']),
|
|
844
|
-
...optional('date', text(row['date'])),
|
|
845
|
-
...optional('updated', text(row['updated'])),
|
|
846
|
-
tags,
|
|
847
|
-
categories,
|
|
848
|
-
draft: row['draft'] === 1,
|
|
849
|
-
...optional('description', text(row['description'])),
|
|
850
|
-
...optional('author', text(row['author'])),
|
|
851
|
-
...optional('inReplyTo', text(row['in_reply_to'])),
|
|
852
|
-
...optional('activitypub', json(row['activitypub'])),
|
|
853
|
-
extra: json(row['extra']) ?? {},
|
|
854
|
-
body: String(row['body']),
|
|
855
|
-
html: String(row['html']),
|
|
856
|
-
hash: String(row['hash']),
|
|
857
|
-
};
|
|
858
|
-
}
|
|
859
|
-
function text(value) {
|
|
860
|
-
return typeof value === 'string' ? value : undefined;
|
|
861
|
-
}
|
|
862
|
-
function json(value) {
|
|
863
|
-
if (typeof value !== 'string')
|
|
864
|
-
return undefined;
|
|
865
|
-
return JSON.parse(value);
|
|
866
|
-
}
|
|
867
|
-
function optional(key, value) {
|
|
868
|
-
return value === undefined ? {} : { [key]: value };
|
|
869
|
-
}
|
|
870
|
-
/**
|
|
871
|
-
* Turn SQLite's unique-constraint message into something a site owner can act
|
|
872
|
-
* on. Everything else is rethrown untouched.
|
|
873
|
-
*/
|
|
874
|
-
function translateWriteError(error, document, pathForPermalink) {
|
|
875
|
-
if (!isUniqueViolation(error, 'documents.permalink'))
|
|
876
|
-
return error;
|
|
877
|
-
const row = pathForPermalink.get(document.permalink);
|
|
878
|
-
return new DuplicatePermalinkError(document.permalink, document.path, text(row?.['path']));
|
|
879
|
-
}
|
|
880
|
-
function isUniqueViolation(error, column) {
|
|
881
|
-
if (!(error instanceof Error))
|
|
882
|
-
return false;
|
|
883
|
-
const code = error.code;
|
|
884
|
-
if (code !== 'ERR_SQLITE_ERROR')
|
|
885
|
-
return false;
|
|
886
|
-
return error.message.includes('UNIQUE constraint failed') && error.message.includes(column);
|
|
887
|
-
}
|
|
888
|
-
/** The table this store's applied versions are recorded in. */
|
|
889
|
-
const LEDGER = 'migrations';
|
|
890
|
-
/**
|
|
891
|
-
* Schema versions, applied in order. Never edit a migration that has shipped;
|
|
892
|
-
* append a new one, so a site that upgrades lands on the same schema as a site
|
|
893
|
-
* that starts fresh.
|
|
894
|
-
*/
|
|
895
|
-
const MIGRATIONS = [
|
|
896
|
-
{
|
|
897
|
-
version: 1,
|
|
898
|
-
sql: `
|
|
899
|
-
CREATE TABLE documents (
|
|
900
|
-
path TEXT PRIMARY KEY,
|
|
901
|
-
type TEXT NOT NULL,
|
|
902
|
-
slug TEXT NOT NULL,
|
|
903
|
-
permalink TEXT NOT NULL,
|
|
904
|
-
title TEXT NOT NULL,
|
|
905
|
-
date TEXT,
|
|
906
|
-
date_sort TEXT,
|
|
907
|
-
updated TEXT,
|
|
908
|
-
draft INTEGER NOT NULL,
|
|
909
|
-
trashed INTEGER NOT NULL,
|
|
910
|
-
description TEXT,
|
|
911
|
-
author TEXT,
|
|
912
|
-
activitypub TEXT,
|
|
913
|
-
extra TEXT NOT NULL,
|
|
914
|
-
body TEXT NOT NULL,
|
|
915
|
-
html TEXT NOT NULL,
|
|
916
|
-
hash TEXT NOT NULL
|
|
917
|
-
);
|
|
918
|
-
|
|
919
|
-
CREATE UNIQUE INDEX documents_permalink ON documents (permalink);
|
|
920
|
-
CREATE INDEX documents_slug ON documents (slug);
|
|
921
|
-
CREATE INDEX documents_listing ON documents (type, draft, trashed, date_sort DESC);
|
|
922
|
-
|
|
923
|
-
CREATE TABLE document_tags (
|
|
924
|
-
path TEXT NOT NULL REFERENCES documents (path) ON DELETE CASCADE,
|
|
925
|
-
tag TEXT NOT NULL,
|
|
926
|
-
position INTEGER NOT NULL,
|
|
927
|
-
PRIMARY KEY (path, tag)
|
|
928
|
-
);
|
|
929
|
-
|
|
930
|
-
CREATE INDEX document_tags_tag ON document_tags (tag);
|
|
931
|
-
`,
|
|
932
|
-
},
|
|
933
|
-
{
|
|
934
|
-
version: 2,
|
|
935
|
-
sql: `
|
|
936
|
-
CREATE TABLE document_categories (
|
|
937
|
-
path TEXT NOT NULL REFERENCES documents (path) ON DELETE CASCADE,
|
|
938
|
-
category TEXT NOT NULL,
|
|
939
|
-
position INTEGER NOT NULL,
|
|
940
|
-
PRIMARY KEY (path, category)
|
|
941
|
-
);
|
|
942
|
-
|
|
943
|
-
CREATE INDEX document_categories_category ON document_categories (category);
|
|
944
|
-
|
|
945
|
-
-- A file that already carried categories hashes the same as it did
|
|
946
|
-
-- before the key was modelled, so a sync would find every row up to date
|
|
947
|
-
-- and never learn what those files are filed under. Emptying the index
|
|
948
|
-
-- is what makes the next scan read them all again; the files are the
|
|
949
|
-
-- source of truth, so nothing is lost (decision-1).
|
|
950
|
-
DELETE FROM documents;
|
|
951
|
-
`,
|
|
952
|
-
},
|
|
953
|
-
{
|
|
954
|
-
version: 3,
|
|
955
|
-
sql: `
|
|
956
|
-
-- The renderer now puts \`tabindex="0"\` on every \`<pre>\` (TASK-86), so a
|
|
957
|
-
-- wide block of code can be scrolled from the keyboard. The HTML in this
|
|
958
|
-
-- table was rendered by the old one, and the hash covers the file rather
|
|
959
|
-
-- than what was made of it, so a scan would find every row up to date and
|
|
960
|
-
-- serve the old markup for as long as nobody edited the post. Emptying
|
|
961
|
-
-- the index is what makes the next scan render them all again; the files
|
|
962
|
-
-- are the source of truth, so nothing is lost (decision-1).
|
|
963
|
-
DELETE FROM documents;
|
|
964
|
-
`,
|
|
965
|
-
},
|
|
966
|
-
{
|
|
967
|
-
version: 4,
|
|
968
|
-
sql: `
|
|
969
|
-
-- The full-text index (TASK-22): one row per document, keyed by path,
|
|
970
|
-
-- holding the words it is found by. \`porter\` so "running" finds "run",
|
|
971
|
-
-- \`remove_diacritics\` so "cafe" finds "café".
|
|
972
|
-
CREATE VIRTUAL TABLE documents_fts USING fts5 (
|
|
973
|
-
path UNINDEXED,
|
|
974
|
-
title,
|
|
975
|
-
description,
|
|
976
|
-
terms,
|
|
977
|
-
body,
|
|
978
|
-
tokenize = 'porter unicode61 remove_diacritics 2'
|
|
979
|
-
);
|
|
980
|
-
|
|
981
|
-
-- The body is indexed as the text of its rendered HTML, which SQL cannot
|
|
982
|
-
-- work out from the row, and the hash covers the file rather than the
|
|
983
|
-
-- index, so a scan would find every row up to date and never fill the
|
|
984
|
-
-- table. Emptying the index is what makes the next scan index them all;
|
|
985
|
-
-- the files are the source of truth, so nothing is lost (decision-1).
|
|
986
|
-
DELETE FROM documents;
|
|
987
|
-
`,
|
|
988
|
-
},
|
|
989
|
-
{
|
|
990
|
-
version: 5,
|
|
991
|
-
sql: `
|
|
992
|
-
-- \`in-reply-to\` is modelled now (TASK-121). A file that already had one
|
|
993
|
-
-- kept it in \`extra\`, and may hash the same as it did, so a scan would
|
|
994
|
-
-- leave the row alone and never learn the post is a reply. Emptying the
|
|
995
|
-
-- index is what makes the next scan read them all again; the files are
|
|
996
|
-
-- the source of truth, so nothing is lost (decision-1).
|
|
997
|
-
ALTER TABLE documents ADD COLUMN in_reply_to TEXT;
|
|
998
|
-
DELETE FROM documents;
|
|
999
|
-
`,
|
|
1000
|
-
},
|
|
1001
|
-
{
|
|
1002
|
-
version: 6,
|
|
1003
|
-
sql: `
|
|
1004
|
-
-- The URLs a document used to live at, from its \`redirect_from\` (TASK-127),
|
|
1005
|
-
-- so an old URL is one indexed lookup. A file that already carried the
|
|
1006
|
-
-- key kept it in \`extra\` and hashes the same, so a scan would never
|
|
1007
|
-
-- index it; emptying the index makes the next scan read every file again,
|
|
1008
|
-
-- and the files are the source of truth, so nothing is lost (decision-1).
|
|
1009
|
-
CREATE TABLE document_redirects (
|
|
1010
|
-
path TEXT NOT NULL REFERENCES documents (path) ON DELETE CASCADE,
|
|
1011
|
-
url TEXT NOT NULL,
|
|
1012
|
-
position INTEGER NOT NULL,
|
|
1013
|
-
PRIMARY KEY (path, url)
|
|
1014
|
-
);
|
|
1015
|
-
|
|
1016
|
-
CREATE INDEX document_redirects_url ON document_redirects (url);
|
|
1017
|
-
DELETE FROM documents;
|
|
1018
|
-
`,
|
|
1019
|
-
},
|
|
1020
|
-
{
|
|
1021
|
-
version: 7,
|
|
1022
|
-
sql: `
|
|
1023
|
-
-- A trashed document gives its URL up to a live one (TASK-195), so the
|
|
1024
|
-
-- permalink is unique among untrashed rows only. The plain index stays
|
|
1025
|
-
-- for lookups, which ask about trashed rows too.
|
|
1026
|
-
DROP INDEX documents_permalink;
|
|
1027
|
-
CREATE UNIQUE INDEX documents_permalink_live ON documents (permalink) WHERE trashed = 0;
|
|
1028
|
-
CREATE INDEX documents_permalink ON documents (permalink);
|
|
1029
|
-
`,
|
|
1030
|
-
},
|
|
1031
|
-
{
|
|
1032
|
-
version: 8,
|
|
1033
|
-
sql: `
|
|
1034
|
-
-- Tags match without regard to case (TASK-308): each row carries its
|
|
1035
|
-
-- key, the tag in lower case, which JavaScript works out because
|
|
1036
|
-
-- SQLite's lower() folds ASCII only. A document carries a tag once
|
|
1037
|
-
-- whatever its casing. The rows already here have no key, and their
|
|
1038
|
-
-- files hash the same, so emptying the index is what makes the next
|
|
1039
|
-
-- scan write them again; the files are the source of truth (decision-1).
|
|
1040
|
-
DROP TABLE document_tags;
|
|
1041
|
-
CREATE TABLE document_tags (
|
|
1042
|
-
path TEXT NOT NULL REFERENCES documents (path) ON DELETE CASCADE,
|
|
1043
|
-
tag TEXT NOT NULL,
|
|
1044
|
-
key TEXT NOT NULL,
|
|
1045
|
-
position INTEGER NOT NULL,
|
|
1046
|
-
PRIMARY KEY (path, key)
|
|
1047
|
-
);
|
|
1048
|
-
CREATE INDEX document_tags_key ON document_tags (key);
|
|
1049
|
-
DELETE FROM documents;
|
|
1050
|
-
`,
|
|
1051
|
-
},
|
|
1052
|
-
{
|
|
1053
|
-
version: 9,
|
|
1054
|
-
sql: `
|
|
1055
|
-
-- A thread finds the reply posts answering it by their \`in-reply-to\`
|
|
1056
|
-
-- (TASK-300).
|
|
1057
|
-
CREATE INDEX documents_in_reply_to ON documents (in_reply_to);
|
|
1058
|
-
`,
|
|
1059
|
-
},
|
|
1060
|
-
{
|
|
1061
|
-
version: 10,
|
|
1062
|
-
sql: `
|
|
1063
|
-
-- What a \`/replies/\` key names (TASK-327), so resolving one is a lookup
|
|
1064
|
-
-- rather than a walk of the site. The keys hang off the base URL, which
|
|
1065
|
-
-- a migration does not know: the rows are filled when the store is
|
|
1066
|
-
-- opened with one, as they are whenever that base changes.
|
|
1067
|
-
ALTER TABLE documents ADD COLUMN replies_key TEXT;
|
|
1068
|
-
ALTER TABLE documents ADD COLUMN reply_post_key TEXT;
|
|
1069
|
-
ALTER TABLE documents ADD COLUMN keys_base TEXT;
|
|
1070
|
-
CREATE INDEX documents_replies_key ON documents (replies_key);
|
|
1071
|
-
CREATE INDEX documents_reply_post_key ON documents (reply_post_key);
|
|
1072
|
-
`,
|
|
1073
|
-
},
|
|
1074
|
-
{
|
|
1075
|
-
version: 11,
|
|
1076
|
-
sql: `
|
|
1077
|
-
-- The pages of the site each document links to (TASK-322), as the paths
|
|
1078
|
-
-- the links name rather than the documents they lead to, which are
|
|
1079
|
-
-- matched when a document's backlinks are read. A link keeps its query
|
|
1080
|
-
-- (TASK-330), sorted as a redirect source's is, because the site answers
|
|
1081
|
-
-- \`/?p=7\` with a redirect rather than with \`/\`. Like the \`/replies/\`
|
|
1082
|
-
-- keys they are read against the base URL, so forgetting every row's
|
|
1083
|
-
-- base is what makes the next open with one fill them from the stored
|
|
1084
|
-
-- HTML, with no scan of the files.
|
|
1085
|
-
CREATE TABLE document_links (
|
|
1086
|
-
path TEXT NOT NULL REFERENCES documents (path) ON DELETE CASCADE,
|
|
1087
|
-
target TEXT NOT NULL,
|
|
1088
|
-
query TEXT NOT NULL DEFAULT '',
|
|
1089
|
-
PRIMARY KEY (path, target, query)
|
|
1090
|
-
);
|
|
1091
|
-
CREATE INDEX document_links_target ON document_links (target);
|
|
1092
|
-
UPDATE documents SET keys_base = NULL;
|
|
1093
|
-
`,
|
|
1094
|
-
},
|
|
1095
|
-
];
|
|
1096
46
|
//# sourceMappingURL=store.js.map
|