emdash 0.20.0 → 0.22.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/dist/{adapters-BzIHV3sw.d.mts → adapters-hUy8vOB-.d.mts} +1 -1
- package/dist/{adapters-BzIHV3sw.d.mts.map → adapters-hUy8vOB-.d.mts.map} +1 -1
- package/dist/after-B1IIdH3Y.mjs +29 -0
- package/dist/after-B1IIdH3Y.mjs.map +1 -0
- package/dist/{allowed-origins-B1u7Qnvg.mjs → allowed-origins-DjlhyfNN.mjs} +2 -2
- package/dist/{allowed-origins-B1u7Qnvg.mjs.map → allowed-origins-DjlhyfNN.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -3
- package/dist/api/route-utils.mjs +20 -18
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +4 -3
- package/dist/{api-DStv36ik.mjs → api-BDuM4bEy.mjs} +31 -25
- package/dist/api-BDuM4bEy.mjs.map +1 -0
- package/dist/{api-tokens-DPfhPu5V.mjs → api-tokens-ViYKeIp9.mjs} +13 -3
- package/dist/api-tokens-ViYKeIp9.mjs.map +1 -0
- package/dist/{apply-Dr7snAMT.mjs → apply-wDqQoxX4.mjs} +18 -18
- package/dist/{apply-Dr7snAMT.mjs.map → apply-wDqQoxX4.mjs.map} +1 -1
- package/dist/astro/image-endpoint.d.mts +8 -0
- package/dist/astro/image-endpoint.d.mts.map +1 -0
- package/dist/astro/image-endpoint.mjs +55 -0
- package/dist/astro/image-endpoint.mjs.map +1 -0
- package/dist/astro/index.d.mts +36 -11
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +160 -35
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +9 -9
- package/dist/astro/middleware/auth.d.mts.map +1 -1
- package/dist/astro/middleware/auth.mjs +12 -10
- package/dist/astro/middleware/auth.mjs.map +1 -1
- package/dist/astro/middleware/redirect.d.mts.map +1 -1
- package/dist/astro/middleware/redirect.mjs +14 -5
- package/dist/astro/middleware/redirect.mjs.map +1 -1
- package/dist/astro/middleware/request-context.mjs +5 -4
- package/dist/astro/middleware/request-context.mjs.map +1 -1
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +1 -1
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +157 -80
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +7 -6
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +7 -6
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +6 -6
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +6 -6
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +10 -9
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +10 -9
- package/dist/astro/routes/api/admin/byline-fields/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +10 -9
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +17 -14
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +17 -14
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/index.mjs +17 -14
- package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +15 -12
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_.mjs +8 -6
- package/dist/astro/routes/api/admin/comments/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/bulk.mjs +12 -9
- package/dist/astro/routes/api/admin/comments/bulk.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/counts.mjs +8 -6
- package/dist/astro/routes/api/admin/comments/counts.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/index.mjs +12 -9
- package/dist/astro/routes/api/admin/comments/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +6 -6
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +5 -5
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +5 -5
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +40 -37
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +40 -37
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +39 -36
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +39 -36
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +39 -36
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +39 -36
- package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +4 -4
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +39 -36
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +39 -36
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +39 -36
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +39 -36
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +40 -37
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +39 -36
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +40 -37
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +39 -36
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +39 -36
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +4 -4
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +39 -36
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +4 -4
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +3 -3
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +8 -7
- package/dist/astro/routes/api/admin/users/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +5 -5
- package/dist/astro/routes/api/admin/users/index.mjs +7 -6
- package/dist/astro/routes/api/admin/users/index.mjs.map +1 -1
- package/dist/astro/routes/api/auth/dev-bypass.mjs +6 -6
- package/dist/astro/routes/api/auth/invite/accept.mjs +3 -3
- package/dist/astro/routes/api/auth/invite/complete.mjs +12 -11
- package/dist/astro/routes/api/auth/invite/complete.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/index.mjs +9 -8
- package/dist/astro/routes/api/auth/invite/index.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/register-options.mjs +11 -10
- package/dist/astro/routes/api/auth/invite/register-options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/logout.mjs +4 -4
- package/dist/astro/routes/api/auth/magic-link/send.mjs +11 -10
- package/dist/astro/routes/api/auth/magic-link/send.mjs.map +1 -1
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +4 -4
- package/dist/astro/routes/api/auth/me.mjs +8 -7
- package/dist/astro/routes/api/auth/me.mjs.map +1 -1
- package/dist/astro/routes/api/auth/mode.mjs +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +4 -4
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +7 -6
- package/dist/astro/routes/api/auth/passkey/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/index.mjs +3 -3
- package/dist/astro/routes/api/auth/passkey/options.mjs +13 -12
- package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +11 -10
- package/dist/astro/routes/api/auth/passkey/register/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +12 -11
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/verify.mjs +12 -11
- package/dist/astro/routes/api/auth/passkey/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/complete.mjs +12 -11
- package/dist/astro/routes/api/auth/signup/complete.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/request.mjs +11 -10
- package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/verify.mjs +3 -3
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +16 -13
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs.map +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.d.mts +9 -0
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.d.mts.map +1 -0
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +179 -0
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs.map +1 -0
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +13 -11
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +8 -7
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +8 -7
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +17 -14
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +8 -7
- package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/authors.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/index.mjs +8 -7
- package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/trash.mjs +8 -7
- package/dist/astro/routes/api/content/_collection_/trash.mjs.map +1 -1
- package/dist/astro/routes/api/dashboard.mjs +10 -8
- package/dist/astro/routes/api/dashboard.mjs.map +1 -1
- package/dist/astro/routes/api/dev/emails.mjs +4 -4
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +12 -11
- package/dist/astro/routes/api/import/probe.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +5 -5
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +9 -9
- package/dist/astro/routes/api/import/wordpress/execute.mjs +16 -14
- package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/media.mjs +10 -9
- package/dist/astro/routes/api/import/wordpress/media.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +11 -10
- package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +10 -9
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +12 -11
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +18 -15
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
- package/dist/astro/routes/api/manifest.mjs +5 -5
- package/dist/astro/routes/api/mcp.mjs +213 -45
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +8 -7
- package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_.mjs +8 -7
- package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/media/file/_...key_.mjs +3 -3
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +4 -4
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +4 -4
- package/dist/astro/routes/api/media/providers/index.mjs +4 -4
- package/dist/astro/routes/api/media/upload-url.mjs +10 -9
- package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
- package/dist/astro/routes/api/media.mjs +13 -12
- package/dist/astro/routes/api/media.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +11 -8
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items.mjs +11 -8
- package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +11 -8
- package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/translations.mjs +11 -8
- package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_.mjs +11 -8
- package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/index.mjs +11 -8
- package/dist/astro/routes/api/menus/index.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/authorize.mjs +7 -7
- package/dist/astro/routes/api/oauth/device/code.mjs +10 -10
- package/dist/astro/routes/api/oauth/device/token.mjs +9 -9
- package/dist/astro/routes/api/oauth/register.mjs +4 -4
- package/dist/astro/routes/api/oauth/token/refresh.mjs +7 -7
- package/dist/astro/routes/api/oauth/token/revoke.mjs +7 -7
- package/dist/astro/routes/api/oauth/token.mjs +7 -7
- package/dist/astro/routes/api/openapi.json.mjs +5 -4
- package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +5 -5
- package/dist/astro/routes/api/redirects/404s/index.mjs +11 -10
- package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/summary.mjs +11 -10
- package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/_id_.mjs +12 -11
- package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/index.mjs +12 -11
- package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +4 -4
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +4 -4
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +39 -36
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +39 -36
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +39 -36
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +39 -36
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +39 -36
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +7 -7
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +39 -36
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +39 -36
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +11 -10
- package/dist/astro/routes/api/search/enable.mjs.map +1 -1
- package/dist/astro/routes/api/search/index.mjs +10 -9
- package/dist/astro/routes/api/search/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/rebuild.mjs +11 -10
- package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
- package/dist/astro/routes/api/search/stats.mjs +7 -7
- package/dist/astro/routes/api/search/suggest.mjs +10 -9
- package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
- package/dist/astro/routes/api/sections/_slug_.mjs +10 -9
- package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/sections/index.mjs +10 -9
- package/dist/astro/routes/api/sections/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/email.mjs +6 -6
- package/dist/astro/routes/api/settings.mjs +16 -13
- package/dist/astro/routes/api/settings.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin-verify.mjs +13 -12
- package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin.mjs +12 -11
- package/dist/astro/routes/api/setup/admin.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-bypass.d.mts.map +1 -1
- package/dist/astro/routes/api/setup/dev-bypass.mjs +29 -26
- package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-reset.mjs +4 -4
- package/dist/astro/routes/api/setup/index.mjs +29 -26
- package/dist/astro/routes/api/setup/index.mjs.map +1 -1
- package/dist/astro/routes/api/setup/status.mjs +5 -5
- package/dist/astro/routes/api/snapshot.d.mts.map +1 -1
- package/dist/astro/routes/api/snapshot.mjs +10 -8
- package/dist/astro/routes/api/snapshot.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +16 -13
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +16 -13
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +16 -13
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +16 -13
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +8 -7
- package/dist/astro/routes/api/themes/preview.mjs.map +1 -1
- package/dist/astro/routes/api/typegen.mjs +6 -6
- package/dist/astro/routes/api/well-known/auth.mjs +2 -2
- package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
- package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +8 -7
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +11 -10
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +11 -10
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.mjs +7 -7
- package/dist/astro/routes/api/widget-areas/index.mjs +11 -10
- package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
- package/dist/astro/routes/api/widget-components.mjs +4 -4
- package/dist/astro/routes/robots.txt.mjs +10 -8
- package/dist/astro/routes/robots.txt.mjs.map +1 -1
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +13 -11
- package/dist/astro/routes/sitemap-_collection_.xml.mjs.map +1 -1
- package/dist/astro/routes/sitemap.xml.mjs +11 -9
- package/dist/astro/routes/sitemap.xml.mjs.map +1 -1
- package/dist/astro/types.d.mts +16 -12
- package/dist/astro/types.d.mts.map +1 -1
- package/dist/auth/providers/github.d.mts +1 -1
- package/dist/auth/providers/google.d.mts +1 -1
- package/dist/{authorize-DsMSVSaY.mjs → authorize-C0EYoUeV.mjs} +2 -2
- package/dist/{authorize-DsMSVSaY.mjs.map → authorize-C0EYoUeV.mjs.map} +1 -1
- package/dist/{base64-CqR-7kqF.mjs → base64-CmWvODNW.mjs} +1 -1
- package/dist/{base64-CqR-7kqF.mjs.map → base64-CmWvODNW.mjs.map} +1 -1
- package/dist/{byline-DUx48sJp.mjs → byline-CC0WS4Gu.mjs} +40 -18
- package/dist/byline-CC0WS4Gu.mjs.map +1 -0
- package/dist/{byline-fields-8TMtkBnH.mjs → byline-fields-53i9Et0x.mjs} +3 -3
- package/dist/{byline-fields-8TMtkBnH.mjs.map → byline-fields-53i9Et0x.mjs.map} +1 -1
- package/dist/{byline-fields--WxSNS79.mjs → byline-fields-DNp0HNKc.mjs} +2 -2
- package/dist/{byline-fields--WxSNS79.mjs.map → byline-fields-DNp0HNKc.mjs.map} +1 -1
- package/dist/{byline-fields-DbibsvTl.d.mts → byline-fields-jy07PZJM.d.mts} +9 -4
- package/dist/byline-fields-jy07PZJM.d.mts.map +1 -0
- package/dist/{byline-registry-CWP7I71B.mjs → byline-registry-BOjqDOim.mjs} +3 -3
- package/dist/{byline-registry-CWP7I71B.mjs.map → byline-registry-BOjqDOim.mjs.map} +1 -1
- package/dist/{bylines-s8c2DXbH.mjs → bylines-CCO1CYnH.mjs} +8 -8
- package/dist/{bylines-s8c2DXbH.mjs.map → bylines-CCO1CYnH.mjs.map} +1 -1
- package/dist/{bylines-BdxWCnPL.mjs → bylines-DGekMGGm.mjs} +10 -4
- package/dist/{bylines-BdxWCnPL.mjs.map → bylines-DGekMGGm.mjs.map} +1 -1
- package/dist/{cache-B_HzASVT.mjs → cache-pXTpun6s.mjs} +3 -3
- package/dist/{cache-B_HzASVT.mjs.map → cache-pXTpun6s.mjs.map} +1 -1
- package/dist/{challenge-store-DXX3rfdI.mjs → challenge-store-C6E_kWTs.mjs} +1 -1
- package/dist/{challenge-store-DXX3rfdI.mjs.map → challenge-store-C6E_kWTs.mjs.map} +1 -1
- package/dist/{chunks-BerYVuve.mjs → chunks-SyjZaYwV.mjs} +2 -2
- package/dist/{chunks-BerYVuve.mjs.map → chunks-SyjZaYwV.mjs.map} +1 -1
- package/dist/cli/index.mjs +29 -27
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +1 -1
- package/dist/client/index.mjs +2 -1
- package/dist/client/index.mjs.map +1 -1
- package/dist/{comment-sqQxNpN3.mjs → comment-80UyJJUR.mjs} +11 -3
- package/dist/comment-80UyJJUR.mjs.map +1 -0
- package/dist/comment-reaction-B6AdcpXw.mjs +85 -0
- package/dist/comment-reaction-B6AdcpXw.mjs.map +1 -0
- package/dist/{comments-Vkivawyl.mjs → comments-CtPkT2tp.mjs} +3 -3
- package/dist/{comments-Vkivawyl.mjs.map → comments-CtPkT2tp.mjs.map} +1 -1
- package/dist/{components-CK0cuUoH.mjs → components-D6ZnrzbB.mjs} +1 -1
- package/dist/{components-CK0cuUoH.mjs.map → components-D6ZnrzbB.mjs.map} +1 -1
- package/dist/{content-BIlVx-RX.mjs → content-2PTDNnoh.mjs} +22 -7
- package/dist/content-2PTDNnoh.mjs.map +1 -0
- package/dist/{context-Y7BRkWes.mjs → context-f1__jpzF.mjs} +11 -11
- package/dist/{context-Y7BRkWes.mjs.map → context-f1__jpzF.mjs.map} +1 -1
- package/dist/{cron-BJ2ClIlj.mjs → cron-CQPxBjYs.mjs} +1 -1
- package/dist/{cron-BJ2ClIlj.mjs.map → cron-CQPxBjYs.mjs.map} +1 -1
- package/dist/{dashboard-2JgAMWxK.mjs → dashboard-BOESNcwE.mjs} +4 -4
- package/dist/{dashboard-2JgAMWxK.mjs.map → dashboard-BOESNcwE.mjs.map} +1 -1
- package/dist/database/instrumentation.d.mts +19 -0
- package/dist/database/instrumentation.d.mts.map +1 -1
- package/dist/database/instrumentation.mjs +8 -1
- package/dist/database/instrumentation.mjs.map +1 -1
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +1 -1
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/{db-errors-CtzxKBxe.mjs → db-errors-CrC5w3Jz.mjs} +1 -1
- package/dist/{db-errors-CtzxKBxe.mjs.map → db-errors-CrC5w3Jz.mjs.map} +1 -1
- package/dist/{default-IlBaTFxM.mjs → default-CpBEPn6a.mjs} +1 -1
- package/dist/{default-IlBaTFxM.mjs.map → default-CpBEPn6a.mjs.map} +1 -1
- package/dist/{device-flow-R23SIbQ2.mjs → device-flow-Bn-qiDrw.mjs} +5 -5
- package/dist/{device-flow-R23SIbQ2.mjs.map → device-flow-Bn-qiDrw.mjs.map} +1 -1
- package/dist/{email-console-DHT2Fbpj.mjs → email-console-B9VS6eN4.mjs} +1 -1
- package/dist/{email-console-DHT2Fbpj.mjs.map → email-console-B9VS6eN4.mjs.map} +1 -1
- package/dist/{error-RwM4dD35.mjs → error-BQ1pxs0L.mjs} +2 -2
- package/dist/{error-RwM4dD35.mjs.map → error-BQ1pxs0L.mjs.map} +1 -1
- package/dist/{escape-Ds07EEyu.mjs → escape-BtbJWyaW.mjs} +1 -1
- package/dist/{escape-Ds07EEyu.mjs.map → escape-BtbJWyaW.mjs.map} +1 -1
- package/dist/{fts-manager-1RgHmopc.mjs → fts-manager-DtiWqwNJ.mjs} +2 -2
- package/dist/{fts-manager-1RgHmopc.mjs.map → fts-manager-DtiWqwNJ.mjs.map} +1 -1
- package/dist/{hash-9w3pd3-m.mjs → hash-BowcuPwv.mjs} +1 -1
- package/dist/{hash-9w3pd3-m.mjs.map → hash-BowcuPwv.mjs.map} +1 -1
- package/dist/{import-Dh8bWmyq.mjs → import-DqSGOlmR.mjs} +4 -4
- package/dist/{import-Dh8bWmyq.mjs.map → import-DqSGOlmR.mjs.map} +1 -1
- package/dist/{index-B1keaX5Y.d.mts → index-C2dLNT6S.d.mts} +169 -14
- package/dist/index-C2dLNT6S.d.mts.map +1 -0
- package/dist/{index-DR56od45.d.mts → index-ZDEwR7qW.d.mts} +3 -3
- package/dist/{index-DR56od45.d.mts.map → index-ZDEwR7qW.d.mts.map} +1 -1
- package/dist/index.d.mts +18 -17
- package/dist/index.mjs +63 -59
- package/dist/init-lock-6b309ZrF.mjs +56 -0
- package/dist/init-lock-6b309ZrF.mjs.map +1 -0
- package/dist/{load-BBetCvLC.mjs → load-Dtoo7KcJ.mjs} +2 -2
- package/dist/{load-BBetCvLC.mjs.map → load-Dtoo7KcJ.mjs.map} +1 -1
- package/dist/{loader-ZN1ll-d-.mjs → loader-C8Z48Uof.mjs} +4 -4
- package/dist/{loader-ZN1ll-d-.mjs.map → loader-C8Z48Uof.mjs.map} +1 -1
- package/dist/{manifest-schema-BtwbL_vj.mjs → manifest-schema-DDSbwkAL.mjs} +1 -1
- package/dist/{manifest-schema-BtwbL_vj.mjs.map → manifest-schema-DDSbwkAL.mjs.map} +1 -1
- package/dist/media/image-endpoint.d.mts +74 -0
- package/dist/media/image-endpoint.d.mts.map +1 -0
- package/dist/media/image-endpoint.mjs +162 -0
- package/dist/media/image-endpoint.mjs.map +1 -0
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +2 -2
- package/dist/media/local-runtime.d.mts +11 -11
- package/dist/media/local-runtime.mjs +9 -7
- package/dist/media/local-runtime.mjs.map +1 -1
- package/dist/{media-JOf3pNkw.mjs → media-Bw0sA6rb.mjs} +2 -2
- package/dist/{media-JOf3pNkw.mjs.map → media-Bw0sA6rb.mjs.map} +1 -1
- package/dist/{media-allowlist-Dknq-OFY.mjs → media-allowlist-DunzrKFM.mjs} +2 -2
- package/dist/{media-allowlist-Dknq-OFY.mjs.map → media-allowlist-DunzrKFM.mjs.map} +1 -1
- package/dist/{media-url-VClf8glU.mjs → media-url-S22B6aPr.mjs} +1 -1
- package/dist/{media-url-VClf8glU.mjs.map → media-url-S22B6aPr.mjs.map} +1 -1
- package/dist/{menus-DX4_E01q.mjs → menus-CYs0WZoL.mjs} +20 -6
- package/dist/menus-CYs0WZoL.mjs.map +1 -0
- package/dist/{menus-DrQLusqj.mjs → menus-DOs1MQJg.mjs} +120 -20
- package/dist/menus-DOs1MQJg.mjs.map +1 -0
- package/dist/{mime-CCEzze7W.mjs → mime-DYpsOAny.mjs} +1 -1
- package/dist/{mime-CCEzze7W.mjs.map → mime-DYpsOAny.mjs.map} +1 -1
- package/dist/{mode-CO2vQHfq.mjs → mode-CFh8Dw8G.mjs} +1 -1
- package/dist/{mode-CO2vQHfq.mjs.map → mode-CFh8Dw8G.mjs.map} +1 -1
- package/dist/{normalize-CK5o04zr.mjs → normalize-Uam4_Vkr.mjs} +1 -1
- package/dist/{normalize-CK5o04zr.mjs.map → normalize-Uam4_Vkr.mjs.map} +1 -1
- package/dist/{oauth-authorization-Bw4NdF_S.mjs → oauth-authorization-BN-t83Uy.mjs} +5 -5
- package/dist/{oauth-authorization-Bw4NdF_S.mjs.map → oauth-authorization-BN-t83Uy.mjs.map} +1 -1
- package/dist/{oauth-clients-BGGFp57s.mjs → oauth-clients-R6I_V0qz.mjs} +1 -1
- package/dist/{oauth-clients-BGGFp57s.mjs.map → oauth-clients-R6I_V0qz.mjs.map} +1 -1
- package/dist/{oauth-state-store-97x0xtN2.mjs → oauth-state-store-Csoc6kkR.mjs} +1 -1
- package/dist/{oauth-state-store-97x0xtN2.mjs.map → oauth-state-store-Csoc6kkR.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-B_vnZHKO.mjs → oauth-user-lookup-d7VYjTpx.mjs} +1 -1
- package/dist/{oauth-user-lookup-B_vnZHKO.mjs.map → oauth-user-lookup-d7VYjTpx.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +15 -0
- package/dist/object-cache/memory.d.mts.map +1 -0
- package/dist/object-cache/memory.mjs +56 -0
- package/dist/object-cache/memory.mjs.map +1 -0
- package/dist/object-cache-SEb2IM4Z.mjs +373 -0
- package/dist/object-cache-SEb2IM4Z.mjs.map +1 -0
- package/dist/{options-DyYIYpPd.d.mts → options-DFFpvNJU.d.mts} +3 -3
- package/dist/{options-DyYIYpPd.d.mts.map → options-DFFpvNJU.d.mts.map} +1 -1
- package/dist/{options-BPCVnesz.mjs → options-DTTML-Tx.mjs} +1 -1
- package/dist/{options-BPCVnesz.mjs.map → options-DTTML-Tx.mjs.map} +1 -1
- package/dist/page/index.d.mts +2 -2
- package/dist/{parse-CrGndy1A.mjs → parse-qrHlnzTy.mjs} +2 -2
- package/dist/{parse-CrGndy1A.mjs.map → parse-qrHlnzTy.mjs.map} +1 -1
- package/dist/{passkey-config-C3QgnQnU.mjs → passkey-config-BJTbcnI5.mjs} +1 -1
- package/dist/{passkey-config-C3QgnQnU.mjs.map → passkey-config-BJTbcnI5.mjs.map} +1 -1
- package/dist/{patterns-p-RBdTbM.mjs → patterns-BKmjvM7K.mjs} +1 -1
- package/dist/{patterns-p-RBdTbM.mjs.map → patterns-BKmjvM7K.mjs.map} +1 -1
- package/dist/{placeholder-BZxr8W1j.mjs → placeholder-CIDCpyEY.mjs} +1 -1
- package/dist/{placeholder-BZxr8W1j.mjs.map → placeholder-CIDCpyEY.mjs.map} +1 -1
- package/dist/{placeholder-CVBv5z8k.d.mts → placeholder-CirPauNG.d.mts} +1 -1
- package/dist/{placeholder-CVBv5z8k.d.mts.map → placeholder-CirPauNG.d.mts.map} +1 -1
- package/dist/plugin-types.d.mts +1 -1
- package/dist/plugin-utils.d.mts +9 -9
- package/dist/plugins/adapt-sandbox-entry.d.mts +9 -9
- package/dist/plugins/adapt-sandbox-entry.mjs +4 -2
- package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
- package/dist/{transport-CmpLD7W3.mjs → portable-text-BIFhrU6T.mjs} +2 -135
- package/dist/portable-text-BIFhrU6T.mjs.map +1 -0
- package/dist/{preview-BfuRkVKW.mjs → preview-IDye9SPQ.mjs} +2 -2
- package/dist/{preview-BfuRkVKW.mjs.map → preview-IDye9SPQ.mjs.map} +1 -1
- package/dist/{public-url-BFVC2OTJ.mjs → public-url-8lFyQ8ZF.mjs} +1 -1
- package/dist/{public-url-BFVC2OTJ.mjs.map → public-url-8lFyQ8ZF.mjs.map} +1 -1
- package/dist/{query-CbUcI4Xk.mjs → query-B1RVFUNM.mjs} +159 -31
- package/dist/query-B1RVFUNM.mjs.map +1 -0
- package/dist/{rate-limit-C7hjdkS5.mjs → rate-limit-DfNAqIWW.mjs} +2 -2
- package/dist/{rate-limit-C7hjdkS5.mjs.map → rate-limit-DfNAqIWW.mjs.map} +1 -1
- package/dist/{redirect-B_q19j4v.mjs → redirect-B4wuX2A5.mjs} +1 -1
- package/dist/{redirect-B_q19j4v.mjs.map → redirect-B4wuX2A5.mjs.map} +1 -1
- package/dist/{redirect-CRWIt8Zj.mjs → redirect-Bifv_yHv.mjs} +3 -3
- package/dist/{redirect-CRWIt8Zj.mjs.map → redirect-Bifv_yHv.mjs.map} +1 -1
- package/dist/{redirects-DxVoR7PI.mjs → redirects-CT_vb3NV.mjs} +24 -18
- package/dist/redirects-CT_vb3NV.mjs.map +1 -0
- package/dist/{redirects-CCbCqCCd.mjs → redirects-DUvXgzCX.mjs} +14 -10
- package/dist/redirects-DUvXgzCX.mjs.map +1 -0
- package/dist/{registry-brYh-rAT.mjs → registry-CjK96fHD.mjs} +6 -6
- package/dist/{registry-brYh-rAT.mjs.map → registry-CjK96fHD.mjs.map} +1 -1
- package/dist/{request-cache-D32LpnmI.mjs → request-cache-KCNHp_RJ.mjs} +1 -1
- package/dist/{request-cache-D32LpnmI.mjs.map → request-cache-KCNHp_RJ.mjs.map} +1 -1
- package/dist/{request-meta-7ByVLxB-.mjs → request-meta-ei3ATilC.mjs} +2 -2
- package/dist/{request-meta-7ByVLxB-.mjs.map → request-meta-ei3ATilC.mjs.map} +1 -1
- package/dist/{resolve-BqYMVG0D.mjs → resolve-CpbBglV0.mjs} +1 -1
- package/dist/{resolve-BqYMVG0D.mjs.map → resolve-CpbBglV0.mjs.map} +1 -1
- package/dist/{runner--4wMWwKM.mjs → runner-DYYnW530.mjs} +201 -170
- package/dist/runner-DYYnW530.mjs.map +1 -0
- package/dist/{runner-DTdhuI9i.d.mts → runner-jdXtFEd3.d.mts} +2 -2
- package/dist/{runner-DTdhuI9i.d.mts.map → runner-jdXtFEd3.d.mts.map} +1 -1
- package/dist/runtime.d.mts +10 -10
- package/dist/runtime.mjs +3 -3
- package/dist/{schema-C1E70ug_.mjs → schema-5z2Jfnbm.mjs} +13 -8
- package/dist/schema-5z2Jfnbm.mjs.map +1 -0
- package/dist/{search-B3SGZw91.mjs → search-D9FkoM-k.mjs} +4 -4
- package/dist/{search-B3SGZw91.mjs.map → search-D9FkoM-k.mjs.map} +1 -1
- package/dist/{secrets-ChPTmy9x.mjs → secrets-BUE5UQys.mjs} +23 -13
- package/dist/secrets-BUE5UQys.mjs.map +1 -0
- package/dist/{sections-D_lVzwRZ.mjs → sections-DWYZo6HK.mjs} +3 -3
- package/dist/{sections-D_lVzwRZ.mjs.map → sections-DWYZo6HK.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +22 -20
- package/dist/seo/index.d.mts +1 -1
- package/dist/seo/index.mjs +1 -1
- package/dist/{seo-B5e6y9Wk.mjs → seo-Cu47j3mJ.mjs} +5 -2
- package/dist/seo-Cu47j3mJ.mjs.map +1 -0
- package/dist/{seo-D_LPkOtu.mjs → seo-DRnqnstF.mjs} +1 -1
- package/dist/{seo-D_LPkOtu.mjs.map → seo-DRnqnstF.mjs.map} +1 -1
- package/dist/{service-ChDcsTBs.mjs → service-DTmtqCnw.mjs} +3 -3
- package/dist/{service-ChDcsTBs.mjs.map → service-DTmtqCnw.mjs.map} +1 -1
- package/dist/session-user-DmtPMNa1.mjs +51 -0
- package/dist/session-user-DmtPMNa1.mjs.map +1 -0
- package/dist/{settings-Cv47v9u8.mjs → settings-DUrVDN0c.mjs} +3 -3
- package/dist/{settings-Cv47v9u8.mjs.map → settings-DUrVDN0c.mjs.map} +1 -1
- package/dist/settings-yaxu9mU-.mjs +245 -0
- package/dist/settings-yaxu9mU-.mjs.map +1 -0
- package/dist/{setup-complete-yvPE4OsP.mjs → setup-complete-BWFHzgvZ.mjs} +2 -2
- package/dist/{setup-complete-yvPE4OsP.mjs.map → setup-complete-BWFHzgvZ.mjs.map} +1 -1
- package/dist/{setup-nonce-C9aFzb94.mjs → setup-nonce-DFWG-J5c.mjs} +1 -1
- package/dist/{setup-nonce-C9aFzb94.mjs.map → setup-nonce-DFWG-J5c.mjs.map} +1 -1
- package/dist/single-flight-cache-B5p5cNOL.mjs +104 -0
- package/dist/single-flight-cache-B5p5cNOL.mjs.map +1 -0
- package/dist/{site-url-CnHlmAs9.mjs → site-url-BOTPgmeM.mjs} +2 -2
- package/dist/{site-url-CnHlmAs9.mjs.map → site-url-BOTPgmeM.mjs.map} +1 -1
- package/dist/{slugify-Cjh1ssOZ.mjs → slugify-Cce3dTdg.mjs} +1 -1
- package/dist/{slugify-Cjh1ssOZ.mjs.map → slugify-Cce3dTdg.mjs.map} +1 -1
- package/dist/{ssrf-BsVGIE0Z.mjs → ssrf-B0VeRLrp.mjs} +1 -1
- package/dist/{ssrf-BsVGIE0Z.mjs.map → ssrf-B0VeRLrp.mjs.map} +1 -1
- package/dist/status-CB2basWJ.mjs +30 -0
- package/dist/status-CB2basWJ.mjs.map +1 -0
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +2 -2
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +1 -1
- package/dist/{taxonomies-BdAmbOwx.mjs → taxonomies-Be9B1jEj.mjs} +156 -122
- package/dist/taxonomies-Be9B1jEj.mjs.map +1 -0
- package/dist/{taxonomies-BILwiyGk.mjs → taxonomies-CJmkEpdS.mjs} +7 -7
- package/dist/{taxonomies-BILwiyGk.mjs.map → taxonomies-CJmkEpdS.mjs.map} +1 -1
- package/dist/{taxonomy-CdllE4oq.mjs → taxonomy-B2HQuVf5.mjs} +19 -6
- package/dist/taxonomy-B2HQuVf5.mjs.map +1 -0
- package/dist/{tokens-Bx2afeT-.mjs → tokens-BvrJvIB6.mjs} +2 -2
- package/dist/{tokens-Bx2afeT-.mjs.map → tokens-BvrJvIB6.mjs.map} +1 -1
- package/dist/{transaction-x2tJQ-A1.mjs → transaction-qfqpPVpu.mjs} +1 -1
- package/dist/{transaction-x2tJQ-A1.mjs.map → transaction-qfqpPVpu.mjs.map} +1 -1
- package/dist/transport-B4rXnSTf.mjs +135 -0
- package/dist/transport-B4rXnSTf.mjs.map +1 -0
- package/dist/{transport-B7PPP2CC.d.mts → transport-k7YjfmEn.d.mts} +1 -1
- package/dist/{transport-B7PPP2CC.d.mts.map → transport-k7YjfmEn.d.mts.map} +1 -1
- package/dist/{trusted-proxy-B4AfnoAp.mjs → trusted-proxy-DY1_UqHr.mjs} +1 -1
- package/dist/{trusted-proxy-B4AfnoAp.mjs.map → trusted-proxy-DY1_UqHr.mjs.map} +1 -1
- package/dist/{types-CPAPl93j.d.mts → types-CIKX2HO5.d.mts} +2 -2
- package/dist/{types-CPAPl93j.d.mts.map → types-CIKX2HO5.d.mts.map} +1 -1
- package/dist/{types-D4kUqbHh.d.mts → types-CKNXt63n.d.mts} +1 -1
- package/dist/{types-D4kUqbHh.d.mts.map → types-CKNXt63n.d.mts.map} +1 -1
- package/dist/{types-DTniiNto.d.mts → types-CWGYDYqF.d.mts} +2 -2
- package/dist/{types-DTniiNto.d.mts.map → types-CWGYDYqF.d.mts.map} +1 -1
- package/dist/{types-BH8-30hc.d.mts → types-CgvhU-hF.d.mts} +1 -1
- package/dist/{types-BH8-30hc.d.mts.map → types-CgvhU-hF.d.mts.map} +1 -1
- package/dist/{types-BFgrqwSk.d.mts → types-CmivgZbp.d.mts} +1 -1
- package/dist/{types-BFgrqwSk.d.mts.map → types-CmivgZbp.d.mts.map} +1 -1
- package/dist/{types-BPzXTV9x.d.mts → types-Czg1S3gB.d.mts} +9 -1
- package/dist/{types-BPzXTV9x.d.mts.map → types-Czg1S3gB.d.mts.map} +1 -1
- package/dist/types-DCNNfeCv.d.mts +124 -0
- package/dist/types-DCNNfeCv.d.mts.map +1 -0
- package/dist/{types-BUUVn1zr.d.mts → types-DPCpkzvS.d.mts} +1 -1
- package/dist/{types-BUUVn1zr.d.mts.map → types-DPCpkzvS.d.mts.map} +1 -1
- package/dist/{types-S15DXXNi.d.mts → types-DXLVzV2w.d.mts} +1 -1
- package/dist/{types-S15DXXNi.d.mts.map → types-DXLVzV2w.d.mts.map} +1 -1
- package/dist/{types-BXSUSAjt.mjs → types-DXOIbece.mjs} +3 -3
- package/dist/{types-BXSUSAjt.mjs.map → types-DXOIbece.mjs.map} +1 -1
- package/dist/{types-DpFmlNyB.mjs → types-DYF2_Vf4.mjs} +1 -1
- package/dist/{types-DpFmlNyB.mjs.map → types-DYF2_Vf4.mjs.map} +1 -1
- package/dist/{types-DZk_y-MU.mjs → types-tM44hEcf.mjs} +1 -1
- package/dist/{types-DZk_y-MU.mjs.map → types-tM44hEcf.mjs.map} +1 -1
- package/dist/{user-C0um7wrg.mjs → user-Db-Rti_z.mjs} +3 -3
- package/dist/{user-C0um7wrg.mjs.map → user-Db-Rti_z.mjs.map} +1 -1
- package/dist/{utils-C4Ih4DML.mjs → utils-LbHcSRTj.mjs} +2 -2
- package/dist/{utils-C4Ih4DML.mjs.map → utils-LbHcSRTj.mjs.map} +1 -1
- package/dist/{validate-Bz4vqcX1.mjs → validate-Bwl64sxv.mjs} +3 -3
- package/dist/{validate-Bz4vqcX1.mjs.map → validate-Bwl64sxv.mjs.map} +1 -1
- package/dist/{validate-CNwkPWzz.d.mts → validate-CE2M0nvx.d.mts} +5 -5
- package/dist/{validate-CNwkPWzz.d.mts.map → validate-CE2M0nvx.d.mts.map} +1 -1
- package/dist/{validation-DgGTJm3u.mjs → validation-C_yOvFaO.mjs} +6 -6
- package/dist/{validation-DgGTJm3u.mjs.map → validation-C_yOvFaO.mjs.map} +1 -1
- package/dist/version-RnYXYjzD.mjs +7 -0
- package/dist/{version-D-5txk2m.mjs.map → version-RnYXYjzD.mjs.map} +1 -1
- package/dist/{widgets-DZfmAbE4.mjs → widgets-8GONuRHo.mjs} +4 -4
- package/dist/{widgets-DZfmAbE4.mjs.map → widgets-8GONuRHo.mjs.map} +1 -1
- package/dist/{zod-generator-Djo_VHCt.mjs → zod-generator-D481JjzD.mjs} +3 -3
- package/dist/{zod-generator-Djo_VHCt.mjs.map → zod-generator-D481JjzD.mjs.map} +1 -1
- package/package.json +18 -6
- package/src/api/handlers/api-tokens.ts +19 -0
- package/src/api/handlers/comment-reactions.ts +165 -0
- package/src/api/handlers/redirects.ts +24 -13
- package/src/api/handlers/schema.ts +8 -0
- package/src/api/schemas/comments.ts +10 -0
- package/src/api/schemas/redirects.ts +11 -4
- package/src/astro/image-endpoint.ts +84 -0
- package/src/astro/index.ts +6 -0
- package/src/astro/integration/index.ts +127 -30
- package/src/astro/integration/routes.ts +51 -9
- package/src/astro/integration/runtime.ts +65 -1
- package/src/astro/integration/virtual-modules.ts +32 -0
- package/src/astro/integration/vite-config.ts +16 -0
- package/src/astro/middleware/auth.ts +4 -3
- package/src/astro/middleware/redirect.ts +12 -0
- package/src/astro/middleware/stream-end-metrics.ts +11 -1
- package/src/astro/middleware.ts +41 -3
- package/src/astro/object-cache/adapters.ts +50 -0
- package/src/astro/prefetch.ts +77 -0
- package/src/astro/routes/api/comments/[collection]/[contentId]/reactions.ts +97 -0
- package/src/astro/routes/api/setup/dev-bypass.ts +5 -1
- package/src/astro/routes/api/snapshot.ts +3 -1
- package/src/astro/session-user.ts +57 -0
- package/src/astro/types.ts +1 -0
- package/src/bylines/field-defs-cache.ts +70 -20
- package/src/cli/commands/doctor.ts +1 -1
- package/src/comments/query.ts +78 -7
- package/src/comments/ranking.ts +58 -0
- package/src/components/Comments.astro +136 -1
- package/src/config/secrets.ts +28 -14
- package/src/database/instrumentation.ts +21 -1
- package/src/database/migrations/044_comment_reactions.ts +56 -0
- package/src/database/migrations/runner.ts +2 -0
- package/src/database/repositories/byline.ts +13 -0
- package/src/database/repositories/comment-reaction.ts +132 -0
- package/src/database/repositories/comment.ts +10 -0
- package/src/database/repositories/content.ts +25 -3
- package/src/database/repositories/menu.ts +13 -1
- package/src/database/repositories/seo.ts +3 -0
- package/src/database/repositories/taxonomy.ts +13 -1
- package/src/database/types.ts +9 -0
- package/src/emdash-runtime.ts +23 -9
- package/src/index.ts +22 -0
- package/src/mcp/server.ts +307 -20
- package/src/media/image-endpoint.ts +167 -0
- package/src/menus/index.ts +11 -4
- package/src/object-cache/codec.ts +73 -0
- package/src/object-cache/index.ts +495 -0
- package/src/object-cache/memory.ts +91 -0
- package/src/object-cache/types.ts +124 -0
- package/src/plugins/adapt-sandbox-entry.ts +11 -1
- package/src/query.ts +196 -17
- package/src/redirects/status.ts +27 -0
- package/src/schema/query.ts +11 -4
- package/src/settings/index.ts +30 -17
- package/src/taxonomies/index.ts +237 -165
- package/src/utils/{isolate-cache.ts → single-flight-cache.ts} +26 -21
- package/src/virtual-modules.d.ts +11 -0
- package/dist/api-DStv36ik.mjs.map +0 -1
- package/dist/api-tokens-DPfhPu5V.mjs.map +0 -1
- package/dist/byline-DUx48sJp.mjs.map +0 -1
- package/dist/byline-fields-DbibsvTl.d.mts.map +0 -1
- package/dist/comment-sqQxNpN3.mjs.map +0 -1
- package/dist/content-BIlVx-RX.mjs.map +0 -1
- package/dist/index-B1keaX5Y.d.mts.map +0 -1
- package/dist/menus-DX4_E01q.mjs.map +0 -1
- package/dist/menus-DrQLusqj.mjs.map +0 -1
- package/dist/query-CbUcI4Xk.mjs.map +0 -1
- package/dist/redirects-CCbCqCCd.mjs.map +0 -1
- package/dist/redirects-DxVoR7PI.mjs.map +0 -1
- package/dist/runner--4wMWwKM.mjs.map +0 -1
- package/dist/schema-C1E70ug_.mjs.map +0 -1
- package/dist/secrets-ChPTmy9x.mjs.map +0 -1
- package/dist/seo-B5e6y9Wk.mjs.map +0 -1
- package/dist/settings-DfxiWY_s.mjs +0 -411
- package/dist/settings-DfxiWY_s.mjs.map +0 -1
- package/dist/taxonomies-BdAmbOwx.mjs.map +0 -1
- package/dist/taxonomy-CdllE4oq.mjs.map +0 -1
- package/dist/transport-CmpLD7W3.mjs.map +0 -1
- package/dist/version-D-5txk2m.mjs +0 -7
- /package/dist/{api-tokens-Oq39ba-Z.mjs → api-tokens-BVH-H8Z9.mjs} +0 -0
- /package/dist/{ssrf-BvgVcfNQ.mjs → ssrf-Cz1e2QPn.mjs} +0 -0
- /package/dist/{types-CZI4E3qG.mjs → types-Bfr2Pj6z.mjs} +0 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Object cache types
|
|
3
|
+
*
|
|
4
|
+
* The object cache is an optional, distributed read-through cache that sits
|
|
5
|
+
* *beneath* the per-request cache (`requestCached`) and *above* the database.
|
|
6
|
+
* Query results (content entries, settings, menus, taxonomies) are stored in a
|
|
7
|
+
* fast key/value store (Cloudflare KV, or an in-isolate memory store for Node)
|
|
8
|
+
* so repeat reads across requests and isolates skip the database entirely.
|
|
9
|
+
*
|
|
10
|
+
* Backends only ever deal in strings — serialization (including `Date`
|
|
11
|
+
* preservation) is handled by the core read-through layer in `./codec.ts`, so
|
|
12
|
+
* every backend behaves identically.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* A pluggable object-cache backend.
|
|
17
|
+
*
|
|
18
|
+
* Implementations must be safe to call concurrently and should never throw on
|
|
19
|
+
* cache misses — `get` returns `null` for a miss. A backend that throws (e.g.
|
|
20
|
+
* a transient KV error) degrades gracefully: the read-through layer treats a
|
|
21
|
+
* thrown `get` as a miss and a thrown `set` as a no-op, so the database
|
|
22
|
+
* remains the source of truth.
|
|
23
|
+
*/
|
|
24
|
+
export interface ObjectCacheBackend {
|
|
25
|
+
/** Return the stored string for `key`, or `null` on a miss. */
|
|
26
|
+
get(key: string): Promise<string | null>;
|
|
27
|
+
/**
|
|
28
|
+
* Store `value` under `key`.
|
|
29
|
+
*
|
|
30
|
+
* @param ttlSeconds Optional time-to-live in seconds. Backends that don't
|
|
31
|
+
* support TTLs may ignore it, but distributed backends (KV) should honor
|
|
32
|
+
* it so orphaned, epoch-busted keys are eventually reclaimed.
|
|
33
|
+
*/
|
|
34
|
+
set(key: string, value: string, ttlSeconds?: number): Promise<void>;
|
|
35
|
+
/** Remove `key`. Idempotent — deleting a missing key is not an error. */
|
|
36
|
+
delete(key: string): Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Serializable descriptor for an object-cache backend.
|
|
41
|
+
*
|
|
42
|
+
* Mirrors {@link import("../storage/types.js").StorageDescriptor}: `entrypoint`
|
|
43
|
+
* is a module specifier resolved at build time that exports a
|
|
44
|
+
* {@link CreateObjectCacheBackendFn} named `createObjectCache`; `config` is the
|
|
45
|
+
* plain, serializable runtime config passed to it.
|
|
46
|
+
*/
|
|
47
|
+
export interface ObjectCacheDescriptor {
|
|
48
|
+
/** Module path exporting a `createObjectCache` function. */
|
|
49
|
+
entrypoint: string;
|
|
50
|
+
/** Serializable config passed to `createObjectCache` at runtime. */
|
|
51
|
+
config: ObjectCacheRuntimeConfig;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Runtime config shared by every backend, plus backend-specific keys.
|
|
56
|
+
*
|
|
57
|
+
* The read-through layer reads `defaultTtl`, `revalidate`, and `keyPrefix`;
|
|
58
|
+
* individual backends read their own keys (e.g. the KV backend reads
|
|
59
|
+
* `binding`).
|
|
60
|
+
*/
|
|
61
|
+
export interface ObjectCacheRuntimeConfig {
|
|
62
|
+
/**
|
|
63
|
+
* Default time-to-live for cached entries, in seconds.
|
|
64
|
+
*
|
|
65
|
+
* Invalidation works by epoch comparison, not key deletion: a stale value
|
|
66
|
+
* is detected on read (its stored epoch no longer matches) and overwritten
|
|
67
|
+
* in place under the same key. The TTL is just a backstop that reclaims
|
|
68
|
+
* keys that are never read again.
|
|
69
|
+
*
|
|
70
|
+
* @default 3600 (1 hour)
|
|
71
|
+
*/
|
|
72
|
+
defaultTtl?: number;
|
|
73
|
+
/**
|
|
74
|
+
* How long (milliseconds) an isolate may reuse a cached namespace epoch
|
|
75
|
+
* before re-reading it from the backend.
|
|
76
|
+
*
|
|
77
|
+
* After a write bumps a namespace's epoch, an isolate keeps serving the
|
|
78
|
+
* previous epoch's keys until its cached epoch expires after this window. It
|
|
79
|
+
* is only part of the cross-isolate staleness: a distributed backend adds its
|
|
80
|
+
* own propagation delay (KV's edge cache is eventually consistent, up to
|
|
81
|
+
* ~60s), so on KV the effective window is that propagation plus this value.
|
|
82
|
+
* Only anonymous visitors are affected — preview and edit requests bypass the
|
|
83
|
+
* cache.
|
|
84
|
+
*
|
|
85
|
+
* Set to `0` to re-read the epoch on every query (strongest freshness, more
|
|
86
|
+
* backend reads).
|
|
87
|
+
*
|
|
88
|
+
* @default 1000
|
|
89
|
+
*/
|
|
90
|
+
revalidate?: number;
|
|
91
|
+
/**
|
|
92
|
+
* Prefix applied to every cache key. Lets multiple EmDash sites share one
|
|
93
|
+
* KV namespace without colliding.
|
|
94
|
+
*
|
|
95
|
+
* @default "em"
|
|
96
|
+
*/
|
|
97
|
+
keyPrefix?: string;
|
|
98
|
+
/**
|
|
99
|
+
* Maximum time (milliseconds) to wait for a single backend read before
|
|
100
|
+
* treating it as a cache miss and falling back to the database.
|
|
101
|
+
*
|
|
102
|
+
* Guards against a backend operation that stalls without resolving or
|
|
103
|
+
* rejecting (e.g. a cold cross-region KV read, or one queued behind the
|
|
104
|
+
* Workers simultaneous-connection limit), which would otherwise hang the
|
|
105
|
+
* request. A timed-out read degrades to a miss; the database remains the
|
|
106
|
+
* source of truth.
|
|
107
|
+
*
|
|
108
|
+
* Set to `0` to disable the timeout (not recommended on Cloudflare).
|
|
109
|
+
*
|
|
110
|
+
* @default 2000
|
|
111
|
+
*/
|
|
112
|
+
timeout?: number;
|
|
113
|
+
/** Backend-specific keys (e.g. the KV binding name). */
|
|
114
|
+
[key: string]: unknown;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Factory signature exported as `createObjectCache` from a backend entrypoint.
|
|
119
|
+
*
|
|
120
|
+
* Each backend accesses its own resources directly: the KV backend imports
|
|
121
|
+
* bindings from `cloudflare:workers`; the memory backend uses an in-isolate
|
|
122
|
+
* map.
|
|
123
|
+
*/
|
|
124
|
+
export type CreateObjectCacheBackendFn = (config: ObjectCacheRuntimeConfig) => ObjectCacheBackend;
|
|
@@ -278,7 +278,11 @@ export function adaptSandboxEntry(
|
|
|
278
278
|
};
|
|
279
279
|
}
|
|
280
280
|
|
|
281
|
-
// Build admin config from descriptor
|
|
281
|
+
// Build admin config from descriptor.
|
|
282
|
+
// Portable Text blocks and field widgets are declarative (Block Kit), so they
|
|
283
|
+
// are forwarded for standard/sandboxed plugins just like pages and widgets —
|
|
284
|
+
// the admin editor consumes them from the manifest. Only the site-side render
|
|
285
|
+
// component (`componentsEntry`) stays native-only.
|
|
282
286
|
const admin: PluginAdminConfig = {};
|
|
283
287
|
if (descriptor.adminPages) {
|
|
284
288
|
admin.pages = descriptor.adminPages;
|
|
@@ -286,6 +290,12 @@ export function adaptSandboxEntry(
|
|
|
286
290
|
if (descriptor.adminWidgets) {
|
|
287
291
|
admin.widgets = descriptor.adminWidgets;
|
|
288
292
|
}
|
|
293
|
+
if (descriptor.portableTextBlocks) {
|
|
294
|
+
admin.portableTextBlocks = descriptor.portableTextBlocks;
|
|
295
|
+
}
|
|
296
|
+
if (descriptor.fieldWidgets) {
|
|
297
|
+
admin.fieldWidgets = descriptor.fieldWidgets;
|
|
298
|
+
}
|
|
289
299
|
|
|
290
300
|
return {
|
|
291
301
|
id: pluginId,
|
package/src/query.ts
CHANGED
|
@@ -27,6 +27,11 @@
|
|
|
27
27
|
import { encodeCursor } from "./database/repositories/types.js";
|
|
28
28
|
import { getFallbackChain, getI18nConfig, isI18nEnabled } from "./i18n/config.js";
|
|
29
29
|
import { CURSOR_RAW_VALUES, type WhereRange, type WhereValue } from "./loader.js";
|
|
30
|
+
import {
|
|
31
|
+
cachedQuery,
|
|
32
|
+
contentNamespaces,
|
|
33
|
+
invalidateSchemaObjectCache,
|
|
34
|
+
} from "./object-cache/index.js";
|
|
30
35
|
import { requestCached } from "./request-cache.js";
|
|
31
36
|
import { getRequestContext } from "./request-context.js";
|
|
32
37
|
import { isMissingTableError } from "./utils/db-errors.js";
|
|
@@ -327,13 +332,61 @@ export async function getEmDashCollection<T extends string, D = InferCollectionD
|
|
|
327
332
|
// pagination contract.
|
|
328
333
|
const bucketed = bucketFilter(filter);
|
|
329
334
|
const cached = await requestCached(collectionCacheKey(type, bucketed.fetchFilter), () =>
|
|
330
|
-
|
|
335
|
+
loadCollectionCached<T, D>(type, bucketed.fetchFilter),
|
|
331
336
|
);
|
|
332
337
|
return bucketed.requestedLimit === undefined
|
|
333
338
|
? cached
|
|
334
339
|
: sliceCollectionResult(cached, bucketed.requestedLimit, filter?.orderBy);
|
|
335
340
|
}
|
|
336
341
|
|
|
342
|
+
/** Shape of a cached collection snapshot (entries reduced to JSON-safe form). */
|
|
343
|
+
interface CachedCollectionValue {
|
|
344
|
+
entries: unknown[];
|
|
345
|
+
nextCursor?: string;
|
|
346
|
+
cacheHint: CacheHint;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Distributed (L2) read-through around {@link getEmDashCollectionUncached}.
|
|
351
|
+
*
|
|
352
|
+
* Caches a JSON-safe snapshot keyed by collection + filter + effective locale,
|
|
353
|
+
* folding the shared `bylines`/`taxonomies` epochs into the key so renaming an
|
|
354
|
+
* author or term invalidates affected lists. Errors are never cached.
|
|
355
|
+
*/
|
|
356
|
+
async function loadCollectionCached<T extends string, D = InferCollectionData<T>>(
|
|
357
|
+
type: T,
|
|
358
|
+
filter?: CollectionFilter,
|
|
359
|
+
): Promise<CollectionResult<D>> {
|
|
360
|
+
const snapshot = await cachedQuery<ContentSnapshot<CachedCollectionValue>>({
|
|
361
|
+
namespace: contentNamespaces(type),
|
|
362
|
+
key: `collection:${collectionCacheKey(type, filter)}|loc=${effectiveLocaleKey(filter)}`,
|
|
363
|
+
load: async () => {
|
|
364
|
+
const result = await getEmDashCollectionUncached<T, D>(type, filter);
|
|
365
|
+
if (result.error) {
|
|
366
|
+
return { ok: false, error: result.error, cacheHint: result.cacheHint };
|
|
367
|
+
}
|
|
368
|
+
return {
|
|
369
|
+
ok: true,
|
|
370
|
+
value: {
|
|
371
|
+
entries: result.entries.map(entrySnapshot),
|
|
372
|
+
nextCursor: result.nextCursor,
|
|
373
|
+
cacheHint: result.cacheHint,
|
|
374
|
+
},
|
|
375
|
+
};
|
|
376
|
+
},
|
|
377
|
+
cacheable: (snap) => snap.ok,
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
if (!snapshot.ok) {
|
|
381
|
+
return { entries: [], error: snapshot.error, cacheHint: snapshot.cacheHint };
|
|
382
|
+
}
|
|
383
|
+
return {
|
|
384
|
+
entries: snapshot.value.entries.map((entry) => reviveEntry<D>(entry)),
|
|
385
|
+
nextCursor: snapshot.value.nextCursor,
|
|
386
|
+
cacheHint: snapshot.value.cacheHint,
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
|
|
337
390
|
/**
|
|
338
391
|
* Threshold for limit bucketing. Page templates routinely render small
|
|
339
392
|
* "recent posts" widgets at limits 3-8; rounding those up to a single
|
|
@@ -498,6 +551,66 @@ function stableOrder(value: Record<string, unknown>): Record<string, unknown> {
|
|
|
498
551
|
return ordered;
|
|
499
552
|
}
|
|
500
553
|
|
|
554
|
+
// ── Object-cache (L2) serialization for content reads ───────────────────────
|
|
555
|
+
//
|
|
556
|
+
// Content entries can't be stored verbatim: each carries a non-serializable
|
|
557
|
+
// `edit` proxy (a function) and a non-enumerable `CURSOR_RAW_VALUES` symbol on
|
|
558
|
+
// `data` (raw date strings used to reproduce the loader's pagination cursor).
|
|
559
|
+
// We reduce each entry to a JSON-safe snapshot before caching — copying the
|
|
560
|
+
// cursor-raw values into an enumerable field and dropping `edit` — then rebuild
|
|
561
|
+
// the symbol and re-attach a no-op `edit` on the way out. The object cache's
|
|
562
|
+
// codec preserves `Date` instances, so timestamps survive the round-trip.
|
|
563
|
+
//
|
|
564
|
+
// L2 is only consulted for anonymous, non-preview, non-edit requests (see
|
|
565
|
+
// `shouldBypass` in object-cache), where `edit` is always the no-op variant —
|
|
566
|
+
// so dropping and recreating it is lossless.
|
|
567
|
+
|
|
568
|
+
/** Enumerable field carrying the {@link CURSOR_RAW_VALUES} payload in snapshots. */
|
|
569
|
+
const CURSOR_RAW_FIELD = "__emdashCursorRaw";
|
|
570
|
+
|
|
571
|
+
/** Result wrapper distinguishing a cached error from a cacheable success. */
|
|
572
|
+
type ContentSnapshot<S> =
|
|
573
|
+
| { ok: true; value: S }
|
|
574
|
+
| { ok: false; error?: Error; cacheHint: CacheHint };
|
|
575
|
+
|
|
576
|
+
function entrySnapshot<D>(entry: ContentEntry<D>): Record<string, unknown> {
|
|
577
|
+
const data = entryData(entry);
|
|
578
|
+
const rawCursor = Reflect.get(data, CURSOR_RAW_VALUES);
|
|
579
|
+
// Drop the `edit` function; copy enumerable data + the cursor-raw values.
|
|
580
|
+
const { edit: _edit, ...rest } = entry as ContentEntry<D> & { edit?: unknown };
|
|
581
|
+
return {
|
|
582
|
+
...rest,
|
|
583
|
+
data: { ...data, [CURSOR_RAW_FIELD]: rawCursor ?? {} },
|
|
584
|
+
};
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
function reviveEntry<D>(raw: unknown): ContentEntry<D> {
|
|
588
|
+
// eslint-disable-next-line typescript/no-unsafe-type-assertion -- snapshot shape produced by entrySnapshot
|
|
589
|
+
const entry = raw as Record<string, unknown>;
|
|
590
|
+
// eslint-disable-next-line typescript/no-unsafe-type-assertion -- snapshot `data` is always a record
|
|
591
|
+
const data: Record<string, unknown> = { ...(entry.data as Record<string, unknown>) };
|
|
592
|
+
// eslint-disable-next-line typescript/no-unsafe-type-assertion -- snapshot field written by entrySnapshot
|
|
593
|
+
const rawCursor = (data[CURSOR_RAW_FIELD] as Record<string, string> | undefined) ?? {};
|
|
594
|
+
delete data[CURSOR_RAW_FIELD];
|
|
595
|
+
Object.defineProperty(data, CURSOR_RAW_VALUES, {
|
|
596
|
+
value: rawCursor,
|
|
597
|
+
enumerable: false,
|
|
598
|
+
configurable: false,
|
|
599
|
+
writable: false,
|
|
600
|
+
});
|
|
601
|
+
// eslint-disable-next-line typescript/no-unsafe-type-assertion -- rebuilt to the ContentEntry shape with a no-op edit proxy
|
|
602
|
+
return { ...entry, data, edit: createNoop() } as ContentEntry<D>;
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
/** Resolve the effective locale used by content reads, for the L2 cache key. */
|
|
606
|
+
function effectiveLocaleKey(filter?: { locale?: string }): string {
|
|
607
|
+
const ctx = getRequestContext();
|
|
608
|
+
const i18nConfig = getI18nConfig();
|
|
609
|
+
return (
|
|
610
|
+
filter?.locale ?? ctx?.locale ?? (isI18nEnabled() ? i18nConfig!.defaultLocale : undefined) ?? ""
|
|
611
|
+
);
|
|
612
|
+
}
|
|
613
|
+
|
|
501
614
|
async function getEmDashCollectionUncached<T extends string, D = InferCollectionData<T>>(
|
|
502
615
|
type: T,
|
|
503
616
|
filter?: CollectionFilter,
|
|
@@ -620,6 +733,14 @@ export async function getEmDashEntry<T extends string, D = InferCollectionData<T
|
|
|
620
733
|
return isPublished || !!isScheduledAndReady;
|
|
621
734
|
}
|
|
622
735
|
|
|
736
|
+
/** True when an entry is scheduled to become visible at a future time. */
|
|
737
|
+
function isPendingScheduled(entry: ContentEntry<D>): boolean {
|
|
738
|
+
const data = entryData(entry);
|
|
739
|
+
if (dataStr(data, "status") !== "scheduled") return false;
|
|
740
|
+
const scheduledAt = dataDate(data, "scheduledAt");
|
|
741
|
+
return scheduledAt !== undefined && scheduledAt.getTime() > Date.now();
|
|
742
|
+
}
|
|
743
|
+
|
|
623
744
|
// Build the fallback chain: [requestedLocale, fallback1, ..., defaultLocale]
|
|
624
745
|
// When i18n is disabled or no locale requested, just use a single-element chain
|
|
625
746
|
const localeChain =
|
|
@@ -721,27 +842,80 @@ export async function getEmDashEntry<T extends string, D = InferCollectionData<T
|
|
|
721
842
|
return { entry: null, isPreview: serveDrafts, cacheHint: {} };
|
|
722
843
|
}
|
|
723
844
|
|
|
724
|
-
// Normal mode: try each locale in the fallback chain, only return published
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
845
|
+
// Normal mode: try each locale in the fallback chain, only return published
|
|
846
|
+
// content. The full resolution (fallback chain + visibility + byline/term
|
|
847
|
+
// hydration) is wrapped in the distributed L2 cache, keyed by the requested
|
|
848
|
+
// locale. Preview/edit requests took the `serveDrafts` branch above and
|
|
849
|
+
// never reach here; the object cache additionally bypasses them.
|
|
850
|
+
// A scheduled entry becomes visible on a future clock tick, not on a write,
|
|
851
|
+
// so an L2 snapshot taken before its time would keep it hidden past go-live
|
|
852
|
+
// (until the publish sweep bumps the epoch or the TTL lapses). Mark such a
|
|
853
|
+
// resolution time-sensitive and skip caching it.
|
|
854
|
+
let timeSensitive = false;
|
|
855
|
+
|
|
856
|
+
const resolveNormal = async (): Promise<EntryResult<D>> => {
|
|
857
|
+
for (let i = 0; i < localeChain.length; i++) {
|
|
858
|
+
const locale = localeChain[i];
|
|
859
|
+
const fallbackLocale = i > 0 ? locale : undefined;
|
|
728
860
|
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
861
|
+
const { entry, error, cacheHint } = await getLiveEntry(COLLECTION_NAME, { type, id, locale });
|
|
862
|
+
if (error) {
|
|
863
|
+
return { entry: null, error, isPreview: false, cacheHint: {} };
|
|
864
|
+
}
|
|
733
865
|
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
866
|
+
if (entry && isVisible(entry)) {
|
|
867
|
+
return successResult(wrapEntry(entry), {
|
|
868
|
+
isPreview: false,
|
|
869
|
+
fallbackLocale,
|
|
870
|
+
cacheHint: cacheHint ?? {},
|
|
871
|
+
});
|
|
872
|
+
}
|
|
873
|
+
if (entry && isPendingScheduled(entry)) {
|
|
874
|
+
timeSensitive = true;
|
|
875
|
+
}
|
|
876
|
+
// Entry not found or not visible in this locale — try next
|
|
740
877
|
}
|
|
741
|
-
|
|
878
|
+
return { entry: null, isPreview: false, cacheHint: {} };
|
|
879
|
+
};
|
|
880
|
+
|
|
881
|
+
const snapshot = await cachedQuery<ContentSnapshot<CachedEntryValue>>({
|
|
882
|
+
namespace: contentNamespaces(type),
|
|
883
|
+
key: `entry:${id}|loc=${requestedLocale ?? ""}`,
|
|
884
|
+
load: async () => {
|
|
885
|
+
const result = await resolveNormal();
|
|
886
|
+
if (result.error) {
|
|
887
|
+
return { ok: false, error: result.error, cacheHint: result.cacheHint };
|
|
888
|
+
}
|
|
889
|
+
return {
|
|
890
|
+
ok: true,
|
|
891
|
+
value: {
|
|
892
|
+
entry: result.entry ? entrySnapshot(result.entry) : null,
|
|
893
|
+
isPreview: result.isPreview,
|
|
894
|
+
fallbackLocale: result.fallbackLocale,
|
|
895
|
+
cacheHint: result.cacheHint,
|
|
896
|
+
},
|
|
897
|
+
};
|
|
898
|
+
},
|
|
899
|
+
cacheable: (snap) => snap.ok && !timeSensitive,
|
|
900
|
+
});
|
|
901
|
+
|
|
902
|
+
if (!snapshot.ok) {
|
|
903
|
+
return { entry: null, error: snapshot.error, isPreview: false, cacheHint: snapshot.cacheHint };
|
|
742
904
|
}
|
|
905
|
+
return {
|
|
906
|
+
entry: snapshot.value.entry ? reviveEntry<D>(snapshot.value.entry) : null,
|
|
907
|
+
isPreview: snapshot.value.isPreview,
|
|
908
|
+
fallbackLocale: snapshot.value.fallbackLocale,
|
|
909
|
+
cacheHint: snapshot.value.cacheHint,
|
|
910
|
+
};
|
|
911
|
+
}
|
|
743
912
|
|
|
744
|
-
|
|
913
|
+
/** Shape of a cached single-entry snapshot. */
|
|
914
|
+
interface CachedEntryValue {
|
|
915
|
+
entry: Record<string, unknown> | null;
|
|
916
|
+
isPreview: boolean;
|
|
917
|
+
fallbackLocale?: string;
|
|
918
|
+
cacheHint: CacheHint;
|
|
745
919
|
}
|
|
746
920
|
|
|
747
921
|
/**
|
|
@@ -972,9 +1146,14 @@ let cachedUrlPatterns: CachedPattern[] | null = null;
|
|
|
972
1146
|
/**
|
|
973
1147
|
* Invalidate the cached URL patterns used by resolveEmDashPath.
|
|
974
1148
|
* Call when collection URL patterns change (schema updates).
|
|
1149
|
+
*
|
|
1150
|
+
* Also busts the distributed schema cache (collection metadata such as
|
|
1151
|
+
* `commentsEnabled`, `supports`, fields read by `getCollectionInfo`), since
|
|
1152
|
+
* every schema-mutation path already routes through here.
|
|
975
1153
|
*/
|
|
976
1154
|
export function invalidateUrlPatternCache(): void {
|
|
977
1155
|
cachedUrlPatterns = null;
|
|
1156
|
+
invalidateSchemaObjectCache();
|
|
978
1157
|
}
|
|
979
1158
|
|
|
980
1159
|
/**
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redirect rule status codes.
|
|
3
|
+
*
|
|
4
|
+
* A redirect rule's `type` is either a *redirect* status (issues a `Location`
|
|
5
|
+
* header) or a *terminal* status (serves the status with no target). Terminal
|
|
6
|
+
* statuses let editors mark a URL as intentionally gone:
|
|
7
|
+
* - `410 Gone` — permanently and intentionally deleted (Google deindexes it
|
|
8
|
+
* faster than a 404).
|
|
9
|
+
* - `451 Unavailable For Legal Reasons`.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/** Statuses that issue an HTTP redirect (require a destination). */
|
|
13
|
+
export const REDIRECT_STATUSES = [301, 302, 307, 308] as const;
|
|
14
|
+
|
|
15
|
+
/** Terminal statuses that serve a status with no `Location` / no destination. */
|
|
16
|
+
export const TERMINAL_STATUSES = [410, 451] as const;
|
|
17
|
+
|
|
18
|
+
/** All values accepted as a redirect rule `type`. */
|
|
19
|
+
export const REDIRECT_RULE_STATUSES: readonly number[] = [
|
|
20
|
+
...REDIRECT_STATUSES,
|
|
21
|
+
...TERMINAL_STATUSES,
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
/** True for terminal statuses (410/451) — served directly, with no target. */
|
|
25
|
+
export function isTerminalStatus(type: number): boolean {
|
|
26
|
+
return (TERMINAL_STATUSES as readonly number[]).includes(type);
|
|
27
|
+
}
|
package/src/schema/query.ts
CHANGED
|
@@ -8,6 +8,7 @@ import type { Kysely } from "kysely";
|
|
|
8
8
|
|
|
9
9
|
import type { Database } from "../database/types.js";
|
|
10
10
|
import { getDb } from "../loader.js";
|
|
11
|
+
import { cachedQuery, CacheNamespace } from "../object-cache/index.js";
|
|
11
12
|
import { requestCached } from "../request-cache.js";
|
|
12
13
|
import { SchemaRegistry } from "./registry.js";
|
|
13
14
|
import type { Collection } from "./types.js";
|
|
@@ -26,10 +27,16 @@ import type { Collection } from "./types.js";
|
|
|
26
27
|
* ```
|
|
27
28
|
*/
|
|
28
29
|
export async function getCollectionInfo(slug: string): Promise<Collection | null> {
|
|
29
|
-
return requestCached(`collection-info:${slug}`,
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
return requestCached(`collection-info:${slug}`, () =>
|
|
31
|
+
cachedQuery({
|
|
32
|
+
namespace: CacheNamespace.SCHEMA,
|
|
33
|
+
key: `collection-info:${slug}`,
|
|
34
|
+
load: async () => {
|
|
35
|
+
const db = await getDb();
|
|
36
|
+
return getCollectionInfoWithDb(db, slug);
|
|
37
|
+
},
|
|
38
|
+
}),
|
|
39
|
+
);
|
|
33
40
|
}
|
|
34
41
|
|
|
35
42
|
/**
|
package/src/settings/index.ts
CHANGED
|
@@ -12,14 +12,18 @@ import { MediaRepository } from "../database/repositories/media.js";
|
|
|
12
12
|
import { OptionsRepository } from "../database/repositories/options.js";
|
|
13
13
|
import type { Database } from "../database/types.js";
|
|
14
14
|
import { getDb } from "../loader.js";
|
|
15
|
+
import { cachedQuery, invalidateObjectCache } from "../object-cache/index.js";
|
|
15
16
|
import { peekRequestCache, requestCached } from "../request-cache.js";
|
|
17
|
+
|
|
18
|
+
/** Object-cache namespace for site settings. */
|
|
19
|
+
const SETTINGS_CACHE_NAMESPACE = "settings";
|
|
16
20
|
import type { Storage } from "../storage/types.js";
|
|
17
21
|
import {
|
|
18
|
-
|
|
19
|
-
type
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
} from "../utils/
|
|
22
|
+
createSingleFlightCache,
|
|
23
|
+
type SingleFlightCache,
|
|
24
|
+
invalidateSingleFlightCache,
|
|
25
|
+
singleFlightCached,
|
|
26
|
+
} from "../utils/single-flight-cache.js";
|
|
23
27
|
import type { SiteSettings, SiteSettingKey, MediaReference, SeoSettings } from "./types.js";
|
|
24
28
|
|
|
25
29
|
/** Prefix for site settings in the options table */
|
|
@@ -34,7 +38,7 @@ const SETTINGS_PREFIX = "site:";
|
|
|
34
38
|
* once-per-isolate. Cross-isolate staleness is bounded by isolate lifetime
|
|
35
39
|
* (workerd typically recycles within minutes); acceptable for chrome.
|
|
36
40
|
*
|
|
37
|
-
* Backed by
|
|
41
|
+
* Backed by single-flight-cache.ts: concurrent cold reads coalesce onto one
|
|
38
42
|
* query via a reclaimable single-flight lock and the resolved *value* is
|
|
39
43
|
* cached — never a shared in-flight promise, so a cancelled request can't
|
|
40
44
|
* poison the isolate (see that file's header). Stored on globalThis with a
|
|
@@ -43,11 +47,11 @@ const SETTINGS_PREFIX = "site:";
|
|
|
43
47
|
*/
|
|
44
48
|
const SITE_SETTINGS_CACHE_KEY = Symbol.for("emdash:site-settings");
|
|
45
49
|
const g = globalThis as Record<symbol, unknown>;
|
|
46
|
-
const settingsCache:
|
|
50
|
+
const settingsCache: SingleFlightCache<Partial<SiteSettings>> =
|
|
47
51
|
// eslint-disable-next-line typescript/no-unsafe-type-assertion -- globalThis singleton pattern (see request-context.ts)
|
|
48
|
-
(g[SITE_SETTINGS_CACHE_KEY] as
|
|
52
|
+
(g[SITE_SETTINGS_CACHE_KEY] as SingleFlightCache<Partial<SiteSettings>> | undefined) ??
|
|
49
53
|
(() => {
|
|
50
|
-
const c =
|
|
54
|
+
const c = createSingleFlightCache<Partial<SiteSettings>>();
|
|
51
55
|
g[SITE_SETTINGS_CACHE_KEY] = c;
|
|
52
56
|
return c;
|
|
53
57
|
})();
|
|
@@ -60,7 +64,9 @@ const settingsCache: IsolateCache<Partial<SiteSettings>> =
|
|
|
60
64
|
* own cached copy until they expire — staleness bounded by isolate lifetime.
|
|
61
65
|
*/
|
|
62
66
|
export function invalidateSiteSettingsCache(): void {
|
|
63
|
-
|
|
67
|
+
invalidateSingleFlightCache(settingsCache);
|
|
68
|
+
// Cross-isolate invalidation for the optional distributed object cache.
|
|
69
|
+
invalidateObjectCache(SETTINGS_CACHE_NAMESPACE);
|
|
64
70
|
}
|
|
65
71
|
|
|
66
72
|
/**
|
|
@@ -208,16 +214,23 @@ export async function getSiteSettingWithDb<K extends SiteSettingKey>(
|
|
|
208
214
|
* ```
|
|
209
215
|
*/
|
|
210
216
|
export function getSiteSettings(): Promise<Partial<SiteSettings>> {
|
|
211
|
-
// requestCached dedupes within a single request;
|
|
217
|
+
// requestCached dedupes within a single request; singleFlightCached
|
|
212
218
|
// coalesces across requests and caches the resolved value for the
|
|
213
|
-
//
|
|
219
|
+
// global scope's lifetime without ever sharing an awaitable promise. The
|
|
220
|
+
// distributed object cache (cachedQuery) sits beneath both, backing cold
|
|
221
|
+
// isolates without a database round-trip.
|
|
214
222
|
return requestCached("siteSettings", () =>
|
|
215
|
-
|
|
223
|
+
singleFlightCached(
|
|
216
224
|
settingsCache,
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
225
|
+
() =>
|
|
226
|
+
cachedQuery({
|
|
227
|
+
namespace: SETTINGS_CACHE_NAMESPACE,
|
|
228
|
+
key: "all",
|
|
229
|
+
load: async () => {
|
|
230
|
+
const db = await getDb();
|
|
231
|
+
return getSiteSettingsWithDb(db);
|
|
232
|
+
},
|
|
233
|
+
}),
|
|
221
234
|
{ anchor: (promise) => after(() => promise), ownerTimeoutMs: 30_000 },
|
|
222
235
|
),
|
|
223
236
|
);
|