emdash 0.28.1 → 0.30.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-hUy8vOB-.d.mts → adapters-C0ONzkUP.d.mts} +10 -1
- package/dist/adapters-C0ONzkUP.d.mts.map +1 -0
- package/dist/{allowed-origins-CRsJ6BPM.mjs → allowed-origins-CCEi9bPI.mjs} +2 -2
- package/dist/{allowed-origins-CRsJ6BPM.mjs.map → allowed-origins-CCEi9bPI.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -3
- package/dist/api/route-utils.d.mts.map +1 -1
- package/dist/api/route-utils.mjs +22 -21
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +5 -4
- package/dist/{api-DxFSorgk.mjs → api-b8WIiGU4.mjs} +306 -154
- package/dist/api-b8WIiGU4.mjs.map +1 -0
- package/dist/api-tokens-Cvmixds7.mjs +3 -0
- package/dist/{api-tokens-DvqeZmVq.mjs → api-tokens-uPt8UDpx.mjs} +2 -2
- package/dist/{api-tokens-DvqeZmVq.mjs.map → api-tokens-uPt8UDpx.mjs.map} +1 -1
- package/dist/{apply-CDJqIjPU.mjs → apply-CmIJK9j8.mjs} +35 -38
- package/dist/apply-CmIJK9j8.mjs.map +1 -0
- package/dist/astro/index.d.mts +12 -12
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +97 -13
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +10 -10
- package/dist/astro/middleware/auth.d.mts.map +1 -1
- package/dist/astro/middleware/auth.mjs +56 -107
- package/dist/astro/middleware/auth.mjs.map +1 -1
- package/dist/astro/middleware/redirect.mjs +7 -7
- package/dist/astro/middleware/request-context.d.mts +3 -0
- package/dist/astro/middleware/request-context.d.mts.map +1 -1
- package/dist/astro/middleware/request-context.mjs +258 -31
- package/dist/astro/middleware/request-context.mjs.map +1 -1
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +47 -3
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +379 -117
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/PluginRegistry.d.mts +5 -1
- package/dist/astro/routes/PluginRegistry.d.mts.map +1 -1
- package/dist/astro/routes/PluginRegistry.mjs +2 -1
- package/dist/astro/routes/PluginRegistry.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +9 -8
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +9 -8
- 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 +7 -7
- package/dist/astro/routes/api/admin/api-tokens/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +6 -6
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +11 -10
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +11 -10
- package/dist/astro/routes/api/admin/byline-fields/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +11 -10
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +18 -17
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +19 -24
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/index.mjs +18 -17
- package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_/status.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +14 -13
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/comments/bulk.mjs +11 -10
- package/dist/astro/routes/api/admin/comments/bulk.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/counts.mjs +6 -6
- package/dist/astro/routes/api/admin/comments/index.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/comments/index.mjs +11 -10
- 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/media-usage/repair.d.mts +8 -0
- package/dist/astro/routes/api/admin/media-usage/repair.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +30 -0
- package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -0
- 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 +44 -41
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +44 -41
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +49 -41
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.d.mts +8 -0
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +39 -0
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs.map +1 -0
- package/dist/astro/routes/api/admin/plugins/_id_/settings.d.mts +9 -0
- package/dist/astro/routes/api/admin/plugins/_id_/settings.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +78 -0
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -0
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +43 -40
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +46 -41
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +49 -41
- 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 +43 -40
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +49 -42
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +43 -40
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +43 -40
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +47 -42
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +43 -40
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +48 -43
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +44 -41
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +43 -40
- 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 +43 -40
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +5 -5
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +4 -4
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +10 -9
- package/dist/astro/routes/api/admin/users/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +6 -6
- package/dist/astro/routes/api/admin/users/index.mjs +9 -8
- package/dist/astro/routes/api/admin/users/index.mjs.map +1 -1
- package/dist/astro/routes/api/auth/dev-bypass.mjs +7 -7
- package/dist/astro/routes/api/auth/invite/accept.mjs +4 -4
- package/dist/astro/routes/api/auth/invite/complete.mjs +14 -13
- package/dist/astro/routes/api/auth/invite/complete.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/index.mjs +11 -10
- package/dist/astro/routes/api/auth/invite/index.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/register-options.mjs +13 -12
- 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 +13 -12
- package/dist/astro/routes/api/auth/magic-link/send.mjs.map +1 -1
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +5 -5
- package/dist/astro/routes/api/auth/me.mjs +9 -8
- package/dist/astro/routes/api/auth/me.mjs.map +1 -1
- package/dist/astro/routes/api/auth/mode.d.mts.map +1 -1
- package/dist/astro/routes/api/auth/mode.mjs +6 -3
- package/dist/astro/routes/api/auth/mode.mjs.map +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +16 -6
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs.map +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_.d.mts.map +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +11 -5
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +8 -7
- 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 +14 -13
- package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +12 -11
- package/dist/astro/routes/api/auth/passkey/register/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +13 -12
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/verify.mjs +13 -12
- package/dist/astro/routes/api/auth/passkey/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/complete.mjs +14 -13
- package/dist/astro/routes/api/auth/signup/complete.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/request.mjs +13 -12
- package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/verify.mjs +4 -4
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.d.mts.map +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +70 -14
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs.map +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +14 -13
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +5 -4
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +6 -5
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +14 -13
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +10 -8
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts +9 -0
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts.map +1 -0
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +72 -0
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -0
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.d.mts +8 -0
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.d.mts.map +1 -0
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +51 -0
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -0
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +5 -4
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +10 -8
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +20 -19
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +5 -4
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +11 -9
- package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/authors.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/authors.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/index.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/index.mjs +12 -10
- package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/trash.mjs +10 -9
- package/dist/astro/routes/api/content/_collection_/trash.mjs.map +1 -1
- package/dist/astro/routes/api/dashboard.mjs +8 -8
- 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 +19 -18
- 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 +11 -11
- package/dist/astro/routes/api/import/wordpress/execute.mjs +16 -16
- package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -10
- package/dist/astro/routes/api/import/wordpress/media.mjs +12 -11
- package/dist/astro/routes/api/import/wordpress/media.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +12 -11
- package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +11 -16
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +12 -11
- 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 +19 -18
- 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 +11 -11
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +29 -28
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
- package/dist/astro/routes/api/manifest.mjs +8 -9
- package/dist/astro/routes/api/manifest.mjs.map +1 -1
- package/dist/astro/routes/api/mcp.d.mts.map +1 -1
- package/dist/astro/routes/api/mcp.mjs +165 -52
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +10 -9
- package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/usage.d.mts +8 -0
- package/dist/astro/routes/api/media/_id_/usage.d.mts.map +1 -0
- package/dist/astro/routes/api/media/_id_/usage.mjs +37 -0
- package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -0
- package/dist/astro/routes/api/media/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/media/_id_.mjs +26 -10
- package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/media/file/_...key_.mjs +4 -3
- package/dist/astro/routes/api/media/file/_...key_.mjs.map +1 -1
- 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 +11 -10
- package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
- package/dist/astro/routes/api/media.d.mts.map +1 -1
- package/dist/astro/routes/api/media.mjs +34 -14
- package/dist/astro/routes/api/media.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +10 -9
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items.mjs +10 -9
- package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +10 -9
- package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/translations.mjs +10 -9
- package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_.mjs +10 -9
- package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/index.mjs +10 -9
- package/dist/astro/routes/api/menus/index.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/authorize.d.mts.map +1 -1
- package/dist/astro/routes/api/oauth/authorize.mjs +7 -8
- package/dist/astro/routes/api/oauth/authorize.mjs.map +1 -1
- 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 +71 -24
- package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.d.mts.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +20 -32
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/index.mjs +13 -12
- package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/summary.mjs +13 -12
- package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/_id_.mjs +14 -13
- package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/index.mjs +14 -13
- package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/index.d.mts +10 -0
- package/dist/astro/routes/api/relations/_id_/index.d.mts.map +1 -0
- package/dist/astro/routes/api/relations/_id_/index.mjs +70 -0
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -0
- package/dist/astro/routes/api/relations/_id_/translations.d.mts +8 -0
- package/dist/astro/routes/api/relations/_id_/translations.d.mts.map +1 -0
- package/dist/astro/routes/api/relations/_id_/translations.mjs +34 -0
- package/dist/astro/routes/api/relations/_id_/translations.mjs.map +1 -0
- package/dist/astro/routes/api/relations/index.d.mts +9 -0
- package/dist/astro/routes/api/relations/index.d.mts.map +1 -0
- package/dist/astro/routes/api/relations/index.mjs +54 -0
- package/dist/astro/routes/api/relations/index.mjs.map +1 -0
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +4 -4
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +5 -4
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.d.mts.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +43 -40
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.d.mts.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +43 -40
- 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 +43 -40
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +43 -40
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +43 -40
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +9 -9
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +43 -40
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +43 -40
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +13 -12
- package/dist/astro/routes/api/search/enable.mjs.map +1 -1
- package/dist/astro/routes/api/search/index.mjs +14 -12
- package/dist/astro/routes/api/search/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/rebuild.mjs +13 -12
- package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
- package/dist/astro/routes/api/search/stats.mjs +8 -8
- package/dist/astro/routes/api/search/suggest.mjs +12 -11
- package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
- package/dist/astro/routes/api/sections/_slug_.mjs +12 -11
- package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/sections/index.mjs +12 -11
- package/dist/astro/routes/api/sections/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/archives/_name_.d.mts +9 -0
- package/dist/astro/routes/api/settings/backups/archives/_name_.d.mts.map +1 -0
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +48 -0
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs.map +1 -0
- package/dist/astro/routes/api/settings/backups/archives/index.d.mts +8 -0
- package/dist/astro/routes/api/settings/backups/archives/index.d.mts.map +1 -0
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +23 -0
- package/dist/astro/routes/api/settings/backups/archives/index.mjs.map +1 -0
- package/dist/astro/routes/api/settings/backups/export.d.mts +8 -0
- package/dist/astro/routes/api/settings/backups/export.d.mts.map +1 -0
- package/dist/astro/routes/api/settings/backups/export.mjs +35 -0
- package/dist/astro/routes/api/settings/backups/export.mjs.map +1 -0
- package/dist/astro/routes/api/settings/backups/index.d.mts +9 -0
- package/dist/astro/routes/api/settings/backups/index.d.mts.map +1 -0
- package/dist/astro/routes/api/settings/backups/index.mjs +52 -0
- package/dist/astro/routes/api/settings/backups/index.mjs.map +1 -0
- package/dist/astro/routes/api/settings/email.mjs +6 -6
- package/dist/astro/routes/api/settings.mjs +16 -15
- package/dist/astro/routes/api/settings.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin-verify.mjs +20 -16
- package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin.mjs +19 -15
- package/dist/astro/routes/api/setup/admin.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-bypass.mjs +29 -29
- package/dist/astro/routes/api/setup/dev-reset.mjs +4 -4
- package/dist/astro/routes/api/setup/index.mjs +31 -30
- 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.mjs +9 -216
- package/dist/astro/routes/api/snapshot.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +16 -15
- 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 -15
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +7 -7
- 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.d.mts.map +1 -1
- package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +4 -3
- package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs.map +1 -1
- package/dist/astro/routes/api/well-known/oauth-protected-resource.d.mts.map +1 -1
- package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +4 -3
- package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +9 -8
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +13 -12
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +13 -12
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.mjs +8 -8
- package/dist/astro/routes/api/widget-areas/index.mjs +13 -12
- 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 +9 -9
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +12 -12
- package/dist/astro/routes/sitemap.xml.mjs +10 -10
- package/dist/astro/types.d.mts +40 -16
- 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-Dz88F_Fw.mjs → authorize-WxsiePzy.mjs} +7 -4
- package/dist/authorize-WxsiePzy.mjs.map +1 -0
- package/dist/backup-S8kFWtwD.mjs +241 -0
- package/dist/backup-S8kFWtwD.mjs.map +1 -0
- package/dist/{base64-CmWvODNW.mjs → base64-B-PsqheR.mjs} +8 -4
- package/dist/base64-B-PsqheR.mjs.map +1 -0
- package/dist/{byline-Bm8ZgUP9.mjs → byline-XEjchwzZ.mjs} +8 -8
- package/dist/{byline-Bm8ZgUP9.mjs.map → byline-XEjchwzZ.mjs.map} +1 -1
- package/dist/{byline-fields-CIx_GuN4.mjs → byline-fields-CdU_LTF1.mjs} +2 -2
- package/dist/{byline-fields-CIx_GuN4.mjs.map → byline-fields-CdU_LTF1.mjs.map} +1 -1
- package/dist/{byline-registry-BOjqDOim.mjs → byline-registry-BCuOp4UF.mjs} +3 -3
- package/dist/{byline-registry-BOjqDOim.mjs.map → byline-registry-BCuOp4UF.mjs.map} +1 -1
- package/dist/{bylines-6tm9mgQb.mjs → bylines-BJbT4gKS.mjs} +4 -4
- package/dist/{bylines-6tm9mgQb.mjs.map → bylines-BJbT4gKS.mjs.map} +1 -1
- package/dist/{bylines-CAZxGSrm.mjs → bylines-czseViYo.mjs} +8 -8
- package/dist/{bylines-CAZxGSrm.mjs.map → bylines-czseViYo.mjs.map} +1 -1
- package/dist/{cache-CEBAZjir.mjs → cache-CGCd6AVM.mjs} +3 -3
- package/dist/{cache-CEBAZjir.mjs.map → cache-CGCd6AVM.mjs.map} +1 -1
- package/dist/{challenge-store-anhwVER0.mjs → challenge-store-BFzgFRog.mjs} +1 -1
- package/dist/{challenge-store-anhwVER0.mjs.map → challenge-store-BFzgFRog.mjs.map} +1 -1
- package/dist/{chunks-B2isWQhr.mjs → chunks-BxXyunY-.mjs} +2 -2
- package/dist/{chunks-B2isWQhr.mjs.map → chunks-BxXyunY-.mjs.map} +1 -1
- package/dist/cli/index.mjs +142 -35
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +86 -3
- package/dist/client/index.d.mts.map +1 -1
- package/dist/client/index.mjs +20 -4
- package/dist/client/index.mjs.map +1 -1
- package/dist/{comment-CzeatwBV.mjs → comment-DPT0WKyd.mjs} +2 -2
- package/dist/{comment-CzeatwBV.mjs.map → comment-DPT0WKyd.mjs.map} +1 -1
- package/dist/{comment-reaction-Cj9QJY7I.mjs → comment-reaction-C65MldIB.mjs} +2 -2
- package/dist/{comment-reaction-Cj9QJY7I.mjs.map → comment-reaction-C65MldIB.mjs.map} +1 -1
- package/dist/{comments-BLE-jv5k.mjs → comments-Bz6sCbgD.mjs} +3 -3
- package/dist/{comments-BLE-jv5k.mjs.map → comments-Bz6sCbgD.mjs.map} +1 -1
- package/dist/{components-B_sATNUc.mjs → components-DZkL4Fx0.mjs} +1 -1
- package/dist/{components-B_sATNUc.mjs.map → components-DZkL4Fx0.mjs.map} +1 -1
- package/dist/{content-DhgEth4k.mjs → content-Ci04z2z-.mjs} +227 -34
- package/dist/content-Ci04z2z-.mjs.map +1 -0
- package/dist/{content-refresh-Br4gMzh8.mjs → content-refresh-D4khvC0R.mjs} +100 -8
- package/dist/content-refresh-D4khvC0R.mjs.map +1 -0
- package/dist/{context-BRIpHARC.mjs → context-B6hc7zJL.mjs} +156 -76
- package/dist/context-B6hc7zJL.mjs.map +1 -0
- package/dist/{cron-v4FTEFR_.mjs → cron-BlKIMD_e.mjs} +1 -1
- package/dist/{cron-v4FTEFR_.mjs.map → cron-BlKIMD_e.mjs.map} +1 -1
- package/dist/{dashboard-EvEKF5en.mjs → dashboard-C5NkXFbi.mjs} +6 -5
- package/dist/dashboard-C5NkXFbi.mjs.map +1 -0
- package/dist/database/pg-migration-lock.d.mts +21 -0
- package/dist/database/pg-migration-lock.d.mts.map +1 -0
- package/dist/database/pg-migration-lock.mjs +45 -0
- package/dist/database/pg-migration-lock.mjs.map +1 -0
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +2 -2
- package/dist/db/index.mjs.map +1 -1
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/postgres.d.mts.map +1 -1
- package/dist/db/postgres.mjs +2 -8
- package/dist/db/postgres.mjs.map +1 -1
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/{db-errors-CK46D-ly.mjs → db-errors-CcWLaRiR.mjs} +4 -2
- package/dist/db-errors-CcWLaRiR.mjs.map +1 -0
- package/dist/{default-CM_D83Mg.mjs → default-C4v9KP56.mjs} +1 -1
- package/dist/{default-CM_D83Mg.mjs.map → default-C4v9KP56.mjs.map} +1 -1
- package/dist/{device-flow-CfGP18Uw.mjs → device-flow-BeA6lUS1.mjs} +6 -7
- package/dist/device-flow-BeA6lUS1.mjs.map +1 -0
- package/dist/dialect-helpers-HxEQGl_1.mjs +175 -0
- package/dist/dialect-helpers-HxEQGl_1.mjs.map +1 -0
- package/dist/{email-console-CIf4Lfvv.mjs → email-console-C-9Ng8DM.mjs} +1 -1
- package/dist/{email-console-CIf4Lfvv.mjs.map → email-console-C-9Ng8DM.mjs.map} +1 -1
- package/dist/{enrich-BQ0mxJRs.mjs → enrich-CFJJgxs_.mjs} +2 -2
- package/dist/{enrich-BQ0mxJRs.mjs.map → enrich-CFJJgxs_.mjs.map} +1 -1
- package/dist/error-CEGF6UZb.mjs +90 -0
- package/dist/error-CEGF6UZb.mjs.map +1 -0
- package/dist/{error-CkAseSqZ.mjs → errors-DtEXIQQV.mjs} +24 -84
- package/dist/errors-DtEXIQQV.mjs.map +1 -0
- package/dist/{escape-DqD0aCKu.mjs → escape-CFedIB1C.mjs} +1 -1
- package/dist/{escape-DqD0aCKu.mjs.map → escape-CFedIB1C.mjs.map} +1 -1
- package/dist/{field-defs-cache-WUI88LX5.mjs → field-defs-cache-DvmlgP-D.mjs} +5 -5
- package/dist/{field-defs-cache-WUI88LX5.mjs.map → field-defs-cache-DvmlgP-D.mjs.map} +1 -1
- package/dist/{fts-manager-BbFaF_V8.mjs → fts-manager-DzqIBrrW.mjs} +27 -3
- package/dist/{fts-manager-BbFaF_V8.mjs.map → fts-manager-DzqIBrrW.mjs.map} +1 -1
- package/dist/{hash-DrvzIXcz.mjs → hash-DFFrkivP.mjs} +1 -1
- package/dist/{hash-DrvzIXcz.mjs.map → hash-DFFrkivP.mjs.map} +1 -1
- package/dist/hreflang-CIxH_LKz.d.mts +48 -0
- package/dist/hreflang-CIxH_LKz.d.mts.map +1 -0
- package/dist/hreflang-db2Tpb2o.mjs +102 -0
- package/dist/hreflang-db2Tpb2o.mjs.map +1 -0
- package/dist/{import-fYLf14Co.mjs → import-Dmkm8S1W.mjs} +6 -6
- package/dist/{import-fYLf14Co.mjs.map → import-Dmkm8S1W.mjs.map} +1 -1
- package/dist/{index-Bm-Gy8Mh.d.mts → index-BEui-cRd.d.mts} +3 -3
- package/dist/{index-Bm-Gy8Mh.d.mts.map → index-BEui-cRd.d.mts.map} +1 -1
- package/dist/{index-B9sIxwe4.d.mts → index-wYnC6u4o.d.mts} +881 -22
- package/dist/index-wYnC6u4o.d.mts.map +1 -0
- package/dist/index.d.mts +19 -19
- package/dist/index.mjs +69 -64
- package/dist/{init-lock-6b309ZrF.mjs → init-lock-DJkX6Hto.mjs} +1 -1
- package/dist/{init-lock-6b309ZrF.mjs.map → init-lock-DJkX6Hto.mjs.map} +1 -1
- package/dist/{load-Djn3HWQS.mjs → load-Cx27ki1l.mjs} +2 -2
- package/dist/{load-Djn3HWQS.mjs.map → load-Cx27ki1l.mjs.map} +1 -1
- package/dist/{loader-CB6YHeul.mjs → loader-Be3ouI5L.mjs} +170 -21
- package/dist/loader-Be3ouI5L.mjs.map +1 -0
- package/dist/{manifest-schema-BHlgZM1W.mjs → manifest-schema-bCq54i7F.mjs} +18 -2
- package/dist/manifest-schema-bCq54i7F.mjs.map +1 -0
- package/dist/media/image-endpoint.d.mts +30 -2
- package/dist/media/image-endpoint.d.mts.map +1 -1
- package/dist/media/image-endpoint.mjs +30 -4
- package/dist/media/image-endpoint.mjs.map +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +2 -2
- package/dist/media/local-runtime.d.mts +12 -12
- package/dist/media/local-runtime.mjs +8 -8
- package/dist/{media-BrXIaMFN.mjs → media-BjhhENaJ.mjs} +2 -2
- package/dist/media-BjhhENaJ.mjs.map +1 -0
- package/dist/{media-allowlist-CRHEeJ_i.mjs → media-allowlist-jUppPWFy.mjs} +2 -2
- package/dist/{media-allowlist-CRHEeJ_i.mjs.map → media-allowlist-jUppPWFy.mjs.map} +1 -1
- package/dist/media-kIV1IxFf.mjs +243 -0
- package/dist/media-kIV1IxFf.mjs.map +1 -0
- package/dist/media-upload-D2wk3EIt.mjs +145 -0
- package/dist/media-upload-D2wk3EIt.mjs.map +1 -0
- package/dist/{media-url-CKi5XSw4.mjs → media-url-BCm5vBn6.mjs} +1 -1
- package/dist/{media-url-CKi5XSw4.mjs.map → media-url-BCm5vBn6.mjs.map} +1 -1
- package/dist/media-usage-CljdO1mc.mjs +554 -0
- package/dist/media-usage-CljdO1mc.mjs.map +1 -0
- package/dist/{menus-b2T4clbO.mjs → menus-BcyElFtI.mjs} +177 -15
- package/dist/menus-BcyElFtI.mjs.map +1 -0
- package/dist/{menus-Cfivc2Ad.mjs → menus-CZyG6rvx.mjs} +3 -3
- package/dist/{menus-Cfivc2Ad.mjs.map → menus-CZyG6rvx.mjs.map} +1 -1
- package/dist/{mime-CCEzze7W.mjs → mime-DfIVjNkr.mjs} +1 -1
- package/dist/{mime-CCEzze7W.mjs.map → mime-DfIVjNkr.mjs.map} +1 -1
- package/dist/{mode-BM9QgEmt.mjs → mode-fiXRMfeA.mjs} +1 -1
- package/dist/{mode-BM9QgEmt.mjs.map → mode-fiXRMfeA.mjs.map} +1 -1
- package/dist/{normalize-CeglrBT9.mjs → normalize-C-SHXmra.mjs} +1 -1
- package/dist/{normalize-CeglrBT9.mjs.map → normalize-C-SHXmra.mjs.map} +1 -1
- package/dist/{oauth-authorization-CXWkIGT4.mjs → oauth-authorization-oqfbBuMH.mjs} +6 -7
- package/dist/oauth-authorization-oqfbBuMH.mjs.map +1 -0
- package/dist/{oauth-clients-BmTI5rsl.mjs → oauth-clients-BlrUHAsf.mjs} +1 -1
- package/dist/{oauth-clients-BmTI5rsl.mjs.map → oauth-clients-BlrUHAsf.mjs.map} +1 -1
- package/dist/{oauth-state-store-YLFLcH5F.mjs → oauth-state-store-DnvjRMy6.mjs} +2 -1
- package/dist/{oauth-state-store-YLFLcH5F.mjs.map → oauth-state-store-DnvjRMy6.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-Bsc_GsX-.mjs → oauth-user-lookup-oUllxvAv.mjs} +1 -1
- package/dist/{oauth-user-lookup-Bsc_GsX-.mjs.map → oauth-user-lookup-oUllxvAv.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/{options-DTTML-Tx.mjs → options-BlmBHTvX.mjs} +1 -1
- package/dist/{options-DTTML-Tx.mjs.map → options-BlmBHTvX.mjs.map} +1 -1
- package/dist/{options-iMpRRxIe.d.mts → options-BqMkWfYa.d.mts} +6 -6
- package/dist/{options-iMpRRxIe.d.mts.map → options-BqMkWfYa.d.mts.map} +1 -1
- package/dist/page/index.d.mts +2 -2
- package/dist/page/index.d.mts.map +1 -1
- package/dist/page/index.mjs.map +1 -1
- package/dist/{parse-GmjecGct.mjs → parse-C_-6klII.mjs} +4 -12
- package/dist/{parse-GmjecGct.mjs.map → parse-C_-6klII.mjs.map} +1 -1
- package/dist/{passkey-config-De0ahnRg.mjs → passkey-config-C-SKpc0-.mjs} +1 -1
- package/dist/{passkey-config-De0ahnRg.mjs.map → passkey-config-C-SKpc0-.mjs.map} +1 -1
- package/dist/{patterns-BKmjvM7K.mjs → patterns-CiyXeDgr.mjs} +1 -1
- package/dist/{patterns-BKmjvM7K.mjs.map → patterns-CiyXeDgr.mjs.map} +1 -1
- package/dist/{placeholder-BSKwzRe4.d.mts → placeholder-Dop47JMM.d.mts} +1 -1
- package/dist/{placeholder-BSKwzRe4.d.mts.map → placeholder-Dop47JMM.d.mts.map} +1 -1
- package/dist/plugin-types.d.mts +21 -2
- package/dist/plugin-types.d.mts.map +1 -1
- package/dist/plugin-utils.d.mts +18 -16
- package/dist/plugin-utils.d.mts.map +1 -1
- package/dist/plugin-utils.mjs +8 -6
- package/dist/plugin-utils.mjs.map +1 -1
- package/dist/plugins/adapt-sandbox-entry.d.mts +10 -10
- package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
- package/dist/plugins/adapt-sandbox-entry.mjs +15 -3
- package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
- package/dist/{portable-text-cCa0cGV6.mjs → portable-text-sDj92Kxv.mjs} +1 -1
- package/dist/{portable-text-cCa0cGV6.mjs.map → portable-text-sDj92Kxv.mjs.map} +1 -1
- package/dist/{preview-SSXNVPAC.mjs → preview-D4Jnbfx7.mjs} +2 -2
- package/dist/{preview-SSXNVPAC.mjs.map → preview-D4Jnbfx7.mjs.map} +1 -1
- package/dist/{public-url-Danv47cS.mjs → public-url-DSGTnJFw.mjs} +5 -3
- package/dist/public-url-DSGTnJFw.mjs.map +1 -0
- package/dist/{query-1Cp6U9oo.mjs → query-DR73ZNfm.mjs} +15 -15
- package/dist/query-DR73ZNfm.mjs.map +1 -0
- package/dist/{schema-CX9cfNkZ.mjs → query-Di7DOmPV.mjs} +5 -10
- package/dist/query-Di7DOmPV.mjs.map +1 -0
- package/dist/{rate-limit-C_Lf63Dd.mjs → rate-limit-CMj83JNW.mjs} +2 -2
- package/dist/{rate-limit-C_Lf63Dd.mjs.map → rate-limit-CMj83JNW.mjs.map} +1 -1
- package/dist/{redirect-CoW3G-0U.mjs → redirect-Botom7X6.mjs} +1 -1
- package/dist/{redirect-CoW3G-0U.mjs.map → redirect-Botom7X6.mjs.map} +1 -1
- package/dist/{redirect-IyfNirgS.mjs → redirect-CgLPYflR.mjs} +11 -5
- package/dist/redirect-CgLPYflR.mjs.map +1 -0
- package/dist/{redirects-Bs1g42Ri.mjs → redirects-B7t9bKsL.mjs} +6 -6
- package/dist/{redirects-Bs1g42Ri.mjs.map → redirects-B7t9bKsL.mjs.map} +1 -1
- package/dist/{redirects-DXEXBAII.mjs → redirects-BBq3n2Rj.mjs} +10 -143
- package/dist/redirects-BBq3n2Rj.mjs.map +1 -0
- package/dist/{registry-B57vp_X9.mjs → registry-FV15nLge.mjs} +99 -10
- package/dist/registry-FV15nLge.mjs.map +1 -0
- package/dist/relation-9M9j_UWo.mjs +334 -0
- package/dist/relation-9M9j_UWo.mjs.map +1 -0
- package/dist/{byline-fields-2Lp5Hbgf.mjs → relations-5_avdrN_.mjs} +60 -4
- package/dist/relations-5_avdrN_.mjs.map +1 -0
- package/dist/relations-BKvO39-9.mjs +397 -0
- package/dist/relations-BKvO39-9.mjs.map +1 -0
- package/dist/{byline-fields-CHE8UStY.d.mts → relations-Bh8jlFsU.d.mts} +486 -31
- package/dist/relations-Bh8jlFsU.d.mts.map +1 -0
- package/dist/{request-cache-KCNHp_RJ.mjs → request-cache-BSUptuJR.mjs} +1 -1
- package/dist/{request-cache-KCNHp_RJ.mjs.map → request-cache-BSUptuJR.mjs.map} +1 -1
- package/dist/{request-meta-DbvXaAvU.mjs → request-meta-DzXYYI-n.mjs} +2 -2
- package/dist/{request-meta-DbvXaAvU.mjs.map → request-meta-DzXYYI-n.mjs.map} +1 -1
- package/dist/{resolve-DR3wqMTy.mjs → resolve-Cd9dzclN.mjs} +1 -1
- package/dist/{resolve-DR3wqMTy.mjs.map → resolve-Cd9dzclN.mjs.map} +1 -1
- package/dist/{runner-DvFWoz8-.d.mts → runner-Dd8m8k9F.d.mts} +8 -2
- package/dist/runner-Dd8m8k9F.d.mts.map +1 -0
- package/dist/{runner-K8XK101B.mjs → runner-DfnZ5eUr.mjs} +355 -204
- package/dist/runner-DfnZ5eUr.mjs.map +1 -0
- package/dist/runtime.d.mts +11 -11
- package/dist/runtime.mjs +4 -4
- package/dist/schema-BXxlHeAf.mjs +9 -0
- package/dist/schema-BXxlHeAf.mjs.map +1 -0
- package/dist/scopes-Bl4IwHA-.mjs +27 -0
- package/dist/scopes-Bl4IwHA-.mjs.map +1 -0
- package/dist/{search-DZN2HZ-V.mjs → search-Bff-7jFt.mjs} +62 -12
- package/dist/search-Bff-7jFt.mjs.map +1 -0
- package/dist/{secrets-kp760LlD.mjs → secrets-CSwQIl4q.mjs} +4 -4
- package/dist/{secrets-kp760LlD.mjs.map → secrets-CSwQIl4q.mjs.map} +1 -1
- package/dist/{sections-CpF5SaGr.mjs → sections-CwW4s1al.mjs} +3 -3
- package/dist/{sections-CpF5SaGr.mjs.map → sections-CwW4s1al.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +23 -23
- package/dist/seo/index.d.mts +15 -2
- package/dist/seo/index.d.mts.map +1 -1
- package/dist/seo/index.mjs +22 -5
- package/dist/seo/index.mjs.map +1 -1
- package/dist/{seo-DXu2UQnC.mjs → seo-2cmFHZns.mjs} +2 -2
- package/dist/{seo-DXu2UQnC.mjs.map → seo-2cmFHZns.mjs.map} +1 -1
- package/dist/{seo-89-53DDs.mjs → seo-C3GDfT0V.mjs} +1 -1
- package/dist/{seo-89-53DDs.mjs.map → seo-C3GDfT0V.mjs.map} +1 -1
- package/dist/{service-DQmiBMzt.mjs → service-DkGTWGIi.mjs} +3 -3
- package/dist/{service-DQmiBMzt.mjs.map → service-DkGTWGIi.mjs.map} +1 -1
- package/dist/{session-user-Cascbax7.mjs → session-user-DbHqKDKe.mjs} +1 -1
- package/dist/{session-user-Cascbax7.mjs.map → session-user-DbHqKDKe.mjs.map} +1 -1
- package/dist/{settings-rZyHEcNT.mjs → settings-C4s8hFQm.mjs} +3 -3
- package/dist/{settings-rZyHEcNT.mjs.map → settings-C4s8hFQm.mjs.map} +1 -1
- package/dist/{settings-zhmdKyJQ.mjs → settings-CpA4lQFt.mjs} +6 -6
- package/dist/{settings-zhmdKyJQ.mjs.map → settings-CpA4lQFt.mjs.map} +1 -1
- package/dist/{setup-complete-Cb3LRyzy.mjs → setup-complete-CdIlqloh.mjs} +2 -2
- package/dist/{setup-complete-Cb3LRyzy.mjs.map → setup-complete-CdIlqloh.mjs.map} +1 -1
- package/dist/{setup-nonce-Z8x0tHf8.mjs → setup-nonce-DqiIPr-J.mjs} +1 -1
- package/dist/{setup-nonce-Z8x0tHf8.mjs.map → setup-nonce-DqiIPr-J.mjs.map} +1 -1
- package/dist/{single-flight-cache-BG3B_GhN.mjs → single-flight-cache-C2exrGAi.mjs} +2 -2
- package/dist/{single-flight-cache-BG3B_GhN.mjs.map → single-flight-cache-C2exrGAi.mjs.map} +1 -1
- package/dist/{site-url-BBfDTgZB.mjs → site-url-NGJT6NTU.mjs} +2 -2
- package/dist/{site-url-BBfDTgZB.mjs.map → site-url-NGJT6NTU.mjs.map} +1 -1
- package/dist/{slugify-Cce3dTdg.mjs → slugify-C_tqlU4G.mjs} +1 -1
- package/dist/{slugify-Cce3dTdg.mjs.map → slugify-C_tqlU4G.mjs.map} +1 -1
- package/dist/snapshot-BdpUJKD-.mjs +216 -0
- package/dist/snapshot-BdpUJKD-.mjs.map +1 -0
- package/dist/{ssrf-1g7usGBg.mjs → ssrf-CviKqWmq.mjs} +1 -1
- package/dist/{ssrf-1g7usGBg.mjs.map → ssrf-CviKqWmq.mjs.map} +1 -1
- package/dist/state-xxv6ZTMv.mjs +128 -0
- package/dist/state-xxv6ZTMv.mjs.map +1 -0
- package/dist/{status-CqJQX1QN.mjs → status-COfycGIU.mjs} +1 -1
- package/dist/{status-CqJQX1QN.mjs.map → status-COfycGIU.mjs.map} +1 -1
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +1 -1
- package/dist/{taxonomies-Bs13SN-F.mjs → taxonomies-Ce49uIzY.mjs} +13 -9
- package/dist/taxonomies-Ce49uIzY.mjs.map +1 -0
- package/dist/{taxonomies-kH9ABDUF.mjs → taxonomies-DjSKBZpq.mjs} +115 -36
- package/dist/taxonomies-DjSKBZpq.mjs.map +1 -0
- package/dist/{taxonomy-BxGxZZdu.mjs → taxonomy-DfVooU4W.mjs} +60 -13
- package/dist/taxonomy-DfVooU4W.mjs.map +1 -0
- package/dist/{tokens-BGT0TUUo.mjs → tokens-DVltpO2D.mjs} +2 -2
- package/dist/{tokens-BGT0TUUo.mjs.map → tokens-DVltpO2D.mjs.map} +1 -1
- package/dist/{transaction-qfqpPVpu.mjs → transaction-D0FOsb3X.mjs} +1 -1
- package/dist/{transaction-qfqpPVpu.mjs.map → transaction-D0FOsb3X.mjs.map} +1 -1
- package/dist/{transport-DPefPMcz.mjs → transport-CKrlqSpD.mjs} +1 -1
- package/dist/{transport-DPefPMcz.mjs.map → transport-CKrlqSpD.mjs.map} +1 -1
- package/dist/{transport-BMDWHSgZ.d.mts → transport-Vd7VdqHv.d.mts} +1 -1
- package/dist/{transport-BMDWHSgZ.d.mts.map → transport-Vd7VdqHv.d.mts.map} +1 -1
- package/dist/{trusted-proxy-VTPRiX2s.mjs → trusted-proxy-CwjQj0YG.mjs} +1 -1
- package/dist/{trusted-proxy-VTPRiX2s.mjs.map → trusted-proxy-CwjQj0YG.mjs.map} +1 -1
- package/dist/{types-CgvhU-hF.d.mts → types-B4vm81VH.d.mts} +1 -1
- package/dist/{types-CgvhU-hF.d.mts.map → types-B4vm81VH.d.mts.map} +1 -1
- package/dist/{types-ea9sAPck.d.mts → types-B97jg3aW.d.mts} +6 -1
- package/dist/{types-ea9sAPck.d.mts.map → types-B97jg3aW.d.mts.map} +1 -1
- package/dist/{types-Jo3UYd6b.mjs → types-BD40g7zz.mjs} +1 -1
- package/dist/{types-Jo3UYd6b.mjs.map → types-BD40g7zz.mjs.map} +1 -1
- package/dist/{types-DmHk7vAt.d.mts → types-BNfPHfay.d.mts} +1 -1
- package/dist/{types-DmHk7vAt.d.mts.map → types-BNfPHfay.d.mts.map} +1 -1
- package/dist/{types-BcLUUbbR.d.mts → types-BfYUPJdP.d.mts} +11 -3
- package/dist/{types-BcLUUbbR.d.mts.map → types-BfYUPJdP.d.mts.map} +1 -1
- package/dist/{types-CGbYowGQ.d.mts → types-BvB7gDOD.d.mts} +90 -4
- package/dist/types-BvB7gDOD.d.mts.map +1 -0
- package/dist/{types-vgEWF18A.d.mts → types-C7U0HlEr.d.mts} +1 -1
- package/dist/{types-vgEWF18A.d.mts.map → types-C7U0HlEr.d.mts.map} +1 -1
- package/dist/{types-CuW0zWDA.mjs → types-D1iJ3DpO.mjs} +3 -3
- package/dist/{types-CuW0zWDA.mjs.map → types-D1iJ3DpO.mjs.map} +1 -1
- package/dist/{types-_HFLRzTn.d.mts → types-DPKhI5ib.d.mts} +9 -1
- package/dist/types-DPKhI5ib.d.mts.map +1 -0
- package/dist/{types-g_aFIdW0.d.mts → types-Kmaxdarz.d.mts} +1 -1
- package/dist/{types-g_aFIdW0.d.mts.map → types-Kmaxdarz.d.mts.map} +1 -1
- package/dist/{types-ClUkdbWb.d.mts → types-iVeZ5g6N.d.mts} +1 -1
- package/dist/{types-ClUkdbWb.d.mts.map → types-iVeZ5g6N.d.mts.map} +1 -1
- package/dist/{types-tM44hEcf.mjs → types-o7xo7VgH.mjs} +1 -1
- package/dist/{types-tM44hEcf.mjs.map → types-o7xo7VgH.mjs.map} +1 -1
- package/dist/{user-BjAOvU3Z.mjs → user-Bh-L1qo6.mjs} +3 -3
- package/dist/{user-BjAOvU3Z.mjs.map → user-Bh-L1qo6.mjs.map} +1 -1
- package/dist/{utils-BJXElxdw.mjs → utils-BbUgmeZG.mjs} +3 -3
- package/dist/{utils-BJXElxdw.mjs.map → utils-BbUgmeZG.mjs.map} +1 -1
- package/dist/{validate-Z1b86_3B.d.mts → validate-DULfgpJP.d.mts} +5 -5
- package/dist/{validate-Z1b86_3B.d.mts.map → validate-DULfgpJP.d.mts.map} +1 -1
- package/dist/{validate-CWSnKVIJ.mjs → validate-V9nCwq_-.mjs} +3 -3
- package/dist/{validate-CWSnKVIJ.mjs.map → validate-V9nCwq_-.mjs.map} +1 -1
- package/dist/{validation-0l8-RYj4.mjs → validation-BsVUJfsP.mjs} +10 -10
- package/dist/{validation-0l8-RYj4.mjs.map → validation-BsVUJfsP.mjs.map} +1 -1
- package/dist/version-907opKac.mjs +7 -0
- package/dist/{version-qmeO1XZY.mjs.map → version-907opKac.mjs.map} +1 -1
- package/dist/{widgets-hWcIicX8.mjs → widgets-DGv1Z04V.mjs} +4 -4
- package/dist/{widgets-hWcIicX8.mjs.map → widgets-DGv1Z04V.mjs.map} +1 -1
- package/dist/{wxr-taxonomies-0_uxSrmf.d.mts → wxr-taxonomies-B4tMuN5T.d.mts} +1 -1
- package/dist/{wxr-taxonomies-0_uxSrmf.d.mts.map → wxr-taxonomies-B4tMuN5T.d.mts.map} +1 -1
- package/dist/{wxr-taxonomies-CNFcsNCr.mjs → wxr-taxonomies-Cs1N6O8z.mjs} +4 -4
- package/dist/{wxr-taxonomies-CNFcsNCr.mjs.map → wxr-taxonomies-Cs1N6O8z.mjs.map} +1 -1
- package/dist/{zod-generator-CacrR-i8.mjs → zod-generator-B5prQ5M4.mjs} +3 -3
- package/dist/{zod-generator-CacrR-i8.mjs.map → zod-generator-B5prQ5M4.mjs.map} +1 -1
- package/package.json +12 -8
- package/src/api/authorize.ts +10 -1
- package/src/api/error.ts +5 -5
- package/src/api/errors.ts +25 -0
- package/src/api/handlers/backup.ts +312 -0
- package/src/api/handlers/content.ts +147 -3
- package/src/api/handlers/dashboard.ts +2 -0
- package/src/api/handlers/device-flow.ts +2 -3
- package/src/api/handlers/index.ts +22 -0
- package/src/api/handlers/marketplace.ts +38 -0
- package/src/api/handlers/media-upload.ts +210 -0
- package/src/api/handlers/media-usage.ts +289 -0
- package/src/api/handlers/oauth-authorization.ts +2 -6
- package/src/api/handlers/plugin-settings.ts +218 -0
- package/src/api/handlers/plugins.ts +41 -0
- package/src/api/handlers/registry.ts +39 -0
- package/src/api/handlers/relations.ts +474 -0
- package/src/api/handlers/snapshot.ts +21 -3
- package/src/api/handlers/taxonomies.ts +26 -4
- package/src/api/handlers/validate-media-fields.ts +1 -1
- package/src/api/openapi/document.ts +72 -5
- package/src/api/parse.ts +2 -16
- package/src/api/public-url.ts +4 -2
- package/src/api/schemas/comments.ts +6 -0
- package/src/api/schemas/common.ts +6 -2
- package/src/api/schemas/content.ts +8 -0
- package/src/api/schemas/index.ts +2 -0
- package/src/api/schemas/media-usage.ts +120 -0
- package/src/api/schemas/media.ts +32 -1
- package/src/api/schemas/relations.ts +109 -0
- package/src/api/schemas/search.ts +1 -0
- package/src/astro/integration/index.ts +39 -0
- package/src/astro/integration/routes.ts +40 -0
- package/src/astro/integration/runtime.ts +30 -0
- package/src/astro/integration/virtual-modules.ts +41 -7
- package/src/astro/integration/vite-config.ts +17 -1
- package/src/astro/middleware/auth.ts +70 -78
- package/src/astro/middleware/csp.ts +5 -2
- package/src/astro/middleware/request-context.ts +162 -20
- package/src/astro/middleware.ts +108 -40
- package/src/astro/public-plugin-api-routes.ts +2 -1
- package/src/astro/routes/PluginRegistry.tsx +5 -2
- package/src/astro/routes/admin.astro +56 -16
- package/src/astro/routes/api/admin/api-tokens/index.ts +2 -2
- package/src/astro/routes/api/admin/bylines/[id]/translations.ts +2 -5
- package/src/astro/routes/api/admin/comments/[id]/status.ts +1 -2
- package/src/astro/routes/api/admin/comments/index.ts +1 -2
- package/src/astro/routes/api/admin/media-usage/repair.ts +24 -0
- package/src/astro/routes/api/admin/plugins/[id]/index.ts +6 -0
- package/src/astro/routes/api/admin/plugins/[id]/mcp.ts +42 -0
- package/src/astro/routes/api/admin/plugins/[id]/settings.ts +80 -0
- package/src/astro/routes/api/admin/plugins/[id]/update.ts +2 -0
- package/src/astro/routes/api/admin/plugins/index.ts +9 -0
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/install.ts +2 -0
- package/src/astro/routes/api/admin/plugins/registry/[id]/update.ts +2 -0
- package/src/astro/routes/api/admin/plugins/registry/install.ts +2 -0
- package/src/astro/routes/api/admin/plugins/updates.ts +2 -4
- package/src/astro/routes/api/auth/mode.ts +6 -14
- package/src/astro/routes/api/auth/oauth/[provider]/callback.ts +21 -5
- package/src/astro/routes/api/auth/oauth/[provider].ts +24 -7
- package/src/astro/routes/api/comments/[collection]/[contentId]/index.ts +13 -0
- package/src/astro/routes/api/content/[collection]/[id]/compare.ts +3 -4
- package/src/astro/routes/api/content/[collection]/[id]/duplicate.ts +2 -3
- package/src/astro/routes/api/content/[collection]/[id]/permanent.ts +2 -3
- package/src/astro/routes/api/content/[collection]/[id]/preview-url.ts +3 -4
- package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/children.ts +95 -0
- package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/parents.ts +47 -0
- package/src/astro/routes/api/content/[collection]/[id]/revisions.ts +3 -4
- package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +4 -6
- package/src/astro/routes/api/content/[collection]/[id]/translations.ts +3 -4
- package/src/astro/routes/api/content/[collection]/[id].ts +3 -4
- package/src/astro/routes/api/content/[collection]/authors.ts +2 -3
- package/src/astro/routes/api/content/[collection]/index.ts +6 -8
- package/src/astro/routes/api/content/[collection]/trash.ts +2 -3
- package/src/astro/routes/api/manifest.ts +2 -9
- package/src/astro/routes/api/mcp.ts +2 -1
- package/src/astro/routes/api/media/[id]/usage.ts +30 -0
- package/src/astro/routes/api/media/[id].ts +17 -6
- package/src/astro/routes/api/media/file/[...key].ts +8 -0
- package/src/astro/routes/api/media.ts +21 -2
- package/src/astro/routes/api/oauth/authorize.ts +2 -6
- package/src/astro/routes/api/plugins/[pluginId]/[...path].ts +17 -3
- package/src/astro/routes/api/relations/[id]/index.ts +84 -0
- package/src/astro/routes/api/relations/[id]/translations.ts +33 -0
- package/src/astro/routes/api/relations/index.ts +56 -0
- package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +1 -7
- package/src/astro/routes/api/schema/collections/[slug]/fields/index.ts +1 -2
- package/src/astro/routes/api/search/index.ts +2 -0
- package/src/astro/routes/api/settings/backups/archives/[name].ts +78 -0
- package/src/astro/routes/api/settings/backups/archives/index.ts +33 -0
- package/src/astro/routes/api/settings/backups/export.ts +43 -0
- package/src/astro/routes/api/settings/backups/index.ts +76 -0
- package/src/astro/routes/api/setup/admin-verify.ts +8 -4
- package/src/astro/routes/api/setup/admin.ts +11 -4
- package/src/astro/routes/api/well-known/oauth-authorization-server.ts +4 -1
- package/src/astro/routes/api/well-known/oauth-protected-resource.ts +5 -1
- package/src/astro/types.ts +50 -2
- package/src/auth/api-tokens.ts +1 -0
- package/src/auth/oauth-state-store.ts +3 -0
- package/src/auth/providers/github-admin.tsx +5 -6
- package/src/auth/providers/google-admin.tsx +5 -6
- package/src/auth/scopes.ts +3 -9
- package/src/cli/client-factory.ts +0 -1
- package/src/cli/commands/bundle-utils.ts +50 -1
- package/src/cli/commands/bundle.ts +9 -2
- package/src/cli/commands/export-seed.ts +1 -10
- package/src/cli/commands/media.ts +127 -0
- package/src/client/index.ts +123 -2
- package/src/client/transport.ts +1 -1
- package/src/comments/service.ts +1 -1
- package/src/comments/turnstile.ts +64 -0
- package/src/components/BlockquoteGroup.astro +34 -0
- package/src/components/CommentForm.astro +12 -5
- package/src/components/EmDashHead.astro +31 -9
- package/src/components/InlinePortableTextEditor.tsx +88 -33
- package/src/components/PortableText.astro +7 -1
- package/src/components/index.ts +2 -0
- package/src/components/marks/Link.astro +5 -1
- package/src/components/portable-text-blockquote-group.ts +68 -0
- package/src/content/converters/portable-text-to-prosemirror.ts +32 -1
- package/src/database/dialect-helpers.ts +111 -3
- package/src/database/migrations/039_fix_fts5_triggers.ts +1 -1
- package/src/database/migrations/051_content_taxonomies_denorm.ts +120 -0
- package/src/database/migrations/052_media_usage_read_index.ts +26 -0
- package/src/database/migrations/053_plugin_mcp_tools.ts +21 -0
- package/src/database/migrations/runner.ts +52 -6
- package/src/database/pg-migration-lock.ts +72 -0
- package/src/database/repositories/audit.ts +2 -1
- package/src/database/repositories/comment.ts +1 -1
- package/src/database/repositories/content.ts +270 -37
- package/src/database/repositories/media-usage.ts +250 -1
- package/src/database/repositories/media.ts +1 -1
- package/src/database/repositories/plugin-storage.ts +29 -32
- package/src/database/repositories/redirect.ts +14 -2
- package/src/database/repositories/relation.ts +130 -5
- package/src/database/repositories/taxonomy.ts +66 -8
- package/src/database/repositories/types.ts +8 -0
- package/src/database/types.ts +23 -0
- package/src/db/adapters.ts +9 -0
- package/src/db/postgres.ts +5 -2
- package/src/emdash-runtime.ts +382 -70
- package/src/index.ts +6 -2
- package/src/loader.ts +293 -32
- package/src/mcp/server.ts +251 -8
- package/src/media/image-endpoint.ts +38 -2
- package/src/page/metadata.ts +27 -0
- package/src/plugin-types.ts +19 -0
- package/src/plugin-utils.ts +8 -6
- package/src/plugins/adapt-sandbox-entry.ts +30 -1
- package/src/plugins/context.ts +92 -0
- package/src/plugins/define-plugin.ts +17 -0
- package/src/plugins/index.ts +4 -0
- package/src/plugins/manifest-schema.ts +30 -1
- package/src/plugins/routes.ts +27 -1
- package/src/plugins/sandbox/runner-options.ts +16 -0
- package/src/plugins/sandbox/types.ts +6 -1
- package/src/plugins/state.ts +17 -1
- package/src/plugins/storage-query.ts +67 -33
- package/src/plugins/types.ts +100 -0
- package/src/schema/byline-registry.ts +1 -1
- package/src/schema/registry.ts +141 -5
- package/src/search/fts-manager.ts +34 -0
- package/src/search/match.ts +50 -0
- package/src/search/query.ts +94 -9
- package/src/seed/apply.ts +28 -29
- package/src/seo/hreflang.ts +192 -0
- package/src/seo/index.ts +22 -4
- package/src/storage/types.ts +6 -0
- package/src/taxonomies/index.ts +62 -45
- package/src/taxonomies/term-counts.ts +117 -0
- package/src/utils/base64.ts +7 -2
- package/src/utils/db-errors.ts +3 -1
- package/src/virtual-modules.d.ts +14 -0
- package/src/visual-editing/editable.ts +41 -35
- package/src/visual-editing/toolbar-bootstrap.ts +120 -0
- package/src/visual-editing/toolbar.ts +47 -1
- package/dist/adapters-hUy8vOB-.d.mts.map +0 -1
- package/dist/api-DxFSorgk.mjs.map +0 -1
- package/dist/api-tokens-DsvvCtdh.mjs +0 -3
- package/dist/apply-CDJqIjPU.mjs.map +0 -1
- package/dist/authorize-Dz88F_Fw.mjs.map +0 -1
- package/dist/base64-CmWvODNW.mjs.map +0 -1
- package/dist/byline-fields-2Lp5Hbgf.mjs.map +0 -1
- package/dist/byline-fields-CHE8UStY.d.mts.map +0 -1
- package/dist/content-DhgEth4k.mjs.map +0 -1
- package/dist/content-refresh-Br4gMzh8.mjs.map +0 -1
- package/dist/context-BRIpHARC.mjs.map +0 -1
- package/dist/dashboard-EvEKF5en.mjs.map +0 -1
- package/dist/db-errors-CK46D-ly.mjs.map +0 -1
- package/dist/device-flow-CfGP18Uw.mjs.map +0 -1
- package/dist/dialect-helpers-DRI5pyY3.mjs +0 -110
- package/dist/dialect-helpers-DRI5pyY3.mjs.map +0 -1
- package/dist/error-CkAseSqZ.mjs.map +0 -1
- package/dist/index-B9sIxwe4.d.mts.map +0 -1
- package/dist/loader-CB6YHeul.mjs.map +0 -1
- package/dist/manifest-schema-BHlgZM1W.mjs.map +0 -1
- package/dist/media-BrXIaMFN.mjs.map +0 -1
- package/dist/menus-b2T4clbO.mjs.map +0 -1
- package/dist/oauth-authorization-CXWkIGT4.mjs.map +0 -1
- package/dist/public-url-Danv47cS.mjs.map +0 -1
- package/dist/query-1Cp6U9oo.mjs.map +0 -1
- package/dist/redirect-IyfNirgS.mjs.map +0 -1
- package/dist/redirects-DXEXBAII.mjs.map +0 -1
- package/dist/registry-B57vp_X9.mjs.map +0 -1
- package/dist/runner-DvFWoz8-.d.mts.map +0 -1
- package/dist/runner-K8XK101B.mjs.map +0 -1
- package/dist/scheduled-publish-Drffrf2a.d.mts +0 -11
- package/dist/scheduled-publish-Drffrf2a.d.mts.map +0 -1
- package/dist/schema-CX9cfNkZ.mjs.map +0 -1
- package/dist/search-DZN2HZ-V.mjs.map +0 -1
- package/dist/taxonomies-Bs13SN-F.mjs.map +0 -1
- package/dist/taxonomies-kH9ABDUF.mjs.map +0 -1
- package/dist/taxonomy-BxGxZZdu.mjs.map +0 -1
- package/dist/types-CGbYowGQ.d.mts.map +0 -1
- package/dist/types-_HFLRzTn.d.mts.map +0 -1
- package/dist/version-qmeO1XZY.mjs +0 -7
- /package/dist/{ssrf-CmuGgCq3.mjs → ssrf-BB__xfNM.mjs} +0 -0
- /package/dist/{types-DROWRxYV.mjs → types-CK0LxPUQ.mjs} +0 -0
|
@@ -8,37 +8,123 @@
|
|
|
8
8
|
* - Preview tokens: _preview query param with signed HMAC token
|
|
9
9
|
* - Edit mode: emdash-edit-mode cookie (for visual editing)
|
|
10
10
|
* - Toolbar injection: floating pill for authenticated editors
|
|
11
|
+
* - Client toolbar mode (`toolbar: "client"`): cache-identical HTML with a
|
|
12
|
+
* client-side bootstrap pill and an `_edit` query param for fresh editor
|
|
13
|
+
* renders (Discussion #1742)
|
|
11
14
|
*/
|
|
12
15
|
|
|
16
|
+
import type { APIContext } from "astro";
|
|
13
17
|
import { defineMiddleware } from "astro:middleware";
|
|
18
|
+
// @ts-ignore - virtual module
|
|
19
|
+
import virtualConfig from "virtual:emdash/config";
|
|
14
20
|
|
|
15
21
|
import { resolveSecretsCached } from "#config/secrets.js";
|
|
16
22
|
|
|
17
23
|
import { verifyPreviewToken, parseContentId } from "../../preview/tokens.js";
|
|
18
24
|
import { getRequestContext, runWithContext } from "../../request-context.js";
|
|
25
|
+
import { EDIT_PARAM, renderToolbarBootstrap } from "../../visual-editing/toolbar-bootstrap.js";
|
|
19
26
|
import { renderToolbar } from "../../visual-editing/toolbar.js";
|
|
20
27
|
|
|
28
|
+
type ToolbarMode = "server" | "client" | false;
|
|
29
|
+
|
|
30
|
+
const toolbarMode: ToolbarMode = virtualConfig?.toolbar ?? "server";
|
|
31
|
+
|
|
32
|
+
/** Astro's route-cache handle. EmDash requires Astro 6+, so it's always present. */
|
|
33
|
+
type RouteCache = APIContext["cache"];
|
|
34
|
+
|
|
21
35
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
36
|
+
* Opt the current request out of Astro's route cache (e.g. Workers Cache on
|
|
37
|
+
* Cloudflare). `Cache-Control` headers do NOT cover this: the adapter derives
|
|
38
|
+
* the shared-cache TTL from the route-cache options (on Cloudflare via
|
|
39
|
+
* `Cloudflare-CDN-Cache-Control`), so session-specific responses must
|
|
40
|
+
* explicitly disable it or they get stored in the shared cache and served to
|
|
41
|
+
* anonymous visitors without ever invoking the middleware again. With no cache
|
|
42
|
+
* provider configured this is a no-op (`NoopAstroCache`/`DisabledAstroCache`).
|
|
24
43
|
*/
|
|
25
|
-
|
|
44
|
+
function optOutOfRouteCache(cache: RouteCache): void {
|
|
45
|
+
cache.set(false);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Inject HTML before `</body>` if the response is an HTML page with a body
|
|
50
|
+
* end tag. Does not touch cache headers — callers decide whether the result
|
|
51
|
+
* is still shareable. `injected` tells the caller whether anything changed.
|
|
52
|
+
*/
|
|
53
|
+
async function injectBeforeBodyEnd(
|
|
54
|
+
response: Response,
|
|
55
|
+
htmlToInject: string,
|
|
56
|
+
): Promise<{ response: Response; injected: boolean }> {
|
|
26
57
|
const contentType = response.headers.get("content-type");
|
|
27
|
-
if (!contentType?.includes("text/html")) return response;
|
|
58
|
+
if (!contentType?.includes("text/html")) return { response, injected: false };
|
|
28
59
|
|
|
29
60
|
const html = await response.text();
|
|
30
|
-
if (!html.includes("</body>"))
|
|
61
|
+
if (!html.includes("</body>")) {
|
|
62
|
+
// Body already consumed — rebuild the response unchanged.
|
|
63
|
+
return { response: new Response(html, response), injected: false };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const injected = html.replace("</body>", `${htmlToInject}</body>`);
|
|
67
|
+
return {
|
|
68
|
+
response: new Response(injected, {
|
|
69
|
+
status: response.status,
|
|
70
|
+
headers: response.headers,
|
|
71
|
+
}),
|
|
72
|
+
injected: true,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Inject toolbar HTML into a response if it's an HTML page.
|
|
78
|
+
* Returns the original response if not HTML.
|
|
79
|
+
*/
|
|
80
|
+
async function injectToolbar(
|
|
81
|
+
response: Response,
|
|
82
|
+
toolbarHtml: string,
|
|
83
|
+
routeCache: RouteCache,
|
|
84
|
+
): Promise<Response> {
|
|
85
|
+
const result = await injectBeforeBodyEnd(response, toolbarHtml);
|
|
86
|
+
if (result.injected) {
|
|
87
|
+
// Toolbar-injected HTML is session-specific (its presence reveals an
|
|
88
|
+
// active editor session); it must never be stored in a shared CDN cache
|
|
89
|
+
// and served to anonymous visitors. Mirrors the preview branch's guard
|
|
90
|
+
// (#1398). `Cache-Control` covers browsers/downstream proxies; the
|
|
91
|
+
// route-cache opt-out covers the shared edge cache, which ignores
|
|
92
|
+
// `Cache-Control`.
|
|
93
|
+
result.response.headers.set("Cache-Control", "private, no-store");
|
|
94
|
+
optOutOfRouteCache(routeCache);
|
|
95
|
+
}
|
|
96
|
+
return result.response;
|
|
97
|
+
}
|
|
31
98
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
99
|
+
/**
|
|
100
|
+
* Inject the client-toolbar bootstrap script. Identical for every visitor, so
|
|
101
|
+
* cache headers and route-cache options are left untouched and the response
|
|
102
|
+
* stays fully shareable.
|
|
103
|
+
*/
|
|
104
|
+
async function injectBootstrap(response: Response): Promise<Response> {
|
|
105
|
+
const result = await injectBeforeBodyEnd(response, renderToolbarBootstrap());
|
|
106
|
+
return result.response;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Redirect an `_edit` URL to its canonical form (same URL without the param).
|
|
111
|
+
* Applied when the requester is not an authenticated editor, so a shared
|
|
112
|
+
* `?_edit` link degrades gracefully for everyone else (Discussion #1742).
|
|
113
|
+
*/
|
|
114
|
+
function redirectToCanonical(url: URL): Response {
|
|
115
|
+
const canonical = new URL(url);
|
|
116
|
+
canonical.searchParams.delete(EDIT_PARAM);
|
|
117
|
+
return new Response(null, {
|
|
118
|
+
status: 302,
|
|
119
|
+
headers: {
|
|
120
|
+
Location: canonical.pathname + canonical.search + canonical.hash,
|
|
121
|
+
// Header-following caches (Fastly, Varnish, browsers) must not store
|
|
122
|
+
// the redirect — a cached 302 would bounce editors back to the
|
|
123
|
+
// canonical URL. The route-cache opt-out at the call site covers the
|
|
124
|
+
// Workers Cache, which ignores Cache-Control.
|
|
125
|
+
"Cache-Control": "private, no-store",
|
|
126
|
+
},
|
|
36
127
|
});
|
|
37
|
-
// Toolbar-injected HTML is session-specific (its presence reveals an active
|
|
38
|
-
// editor session); it must never be stored in a shared CDN cache and served
|
|
39
|
-
// to anonymous visitors. Mirrors the preview branch's guard (#1398).
|
|
40
|
-
result.headers.set("Cache-Control", "private, no-store");
|
|
41
|
-
return result;
|
|
42
128
|
}
|
|
43
129
|
|
|
44
130
|
export const onRequest = defineMiddleware(async (context, next) => {
|
|
@@ -73,9 +159,30 @@ export const onRequest = defineMiddleware(async (context, next) => {
|
|
|
73
159
|
// Fast path: check for CMS signals before doing any work
|
|
74
160
|
const hasEditCookie = cookies.get("emdash-edit-mode")?.value === "true";
|
|
75
161
|
const hasPreviewToken = url.searchParams.has("_preview");
|
|
162
|
+
// `_edit` requests a fresh (never cached) editor render; only meaningful in
|
|
163
|
+
// client toolbar mode where public HTML is otherwise identical for everyone.
|
|
164
|
+
const hasEditParam = toolbarMode === "client" && url.searchParams.has(EDIT_PARAM);
|
|
165
|
+
|
|
166
|
+
if (hasEditParam) {
|
|
167
|
+
// `_edit` URLs are their own cache key. Never store them in the route
|
|
168
|
+
// cache — a cached anonymous redirect would bounce editors back to the
|
|
169
|
+
// canonical URL, and a cached editor render must never be shared.
|
|
170
|
+
optOutOfRouteCache(context.cache);
|
|
171
|
+
|
|
172
|
+
// A non-editor (anonymous, logged-out, or insufficient role) opening an
|
|
173
|
+
// `_edit` URL is sent to the canonical URL — shared `?_edit` links
|
|
174
|
+
// degrade gracefully and never prime a cache entry with page content.
|
|
175
|
+
if (!isEditor) {
|
|
176
|
+
return redirectToCanonical(url);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
76
179
|
|
|
77
|
-
// No CMS signals and not an editor → skip everything (zero overhead
|
|
180
|
+
// No CMS signals and not an editor → skip everything (zero overhead in
|
|
181
|
+
// server mode; client mode injects the identical-for-everyone bootstrap)
|
|
78
182
|
if (!hasEditCookie && !hasPreviewToken && !isEditor) {
|
|
183
|
+
if (toolbarMode === "client") {
|
|
184
|
+
return injectBootstrap(await next());
|
|
185
|
+
}
|
|
79
186
|
return next();
|
|
80
187
|
}
|
|
81
188
|
|
|
@@ -86,6 +193,8 @@ export const onRequest = defineMiddleware(async (context, next) => {
|
|
|
86
193
|
// eslint-disable-next-line typescript/no-unsafe-type-assertion -- Astro context includes currentLocale when i18n is configured
|
|
87
194
|
const locale = (context as { currentLocale?: string }).currentLocale;
|
|
88
195
|
|
|
196
|
+
const routeCache = context.cache;
|
|
197
|
+
|
|
89
198
|
// Verify preview token if present.
|
|
90
199
|
// The preview secret is resolved via `resolveSecretsCached`: env wins,
|
|
91
200
|
// otherwise a DB-stored value is read (or generated on first need).
|
|
@@ -122,32 +231,65 @@ export const onRequest = defineMiddleware(async (context, next) => {
|
|
|
122
231
|
|
|
123
232
|
// Preview responses must not be cached -- draft content could leak past token expiry.
|
|
124
233
|
// Clone the response before modifying headers — the original may be immutable.
|
|
234
|
+
// `Cache-Control` only governs browsers/downstream proxies; the shared
|
|
235
|
+
// edge cache follows the route-cache options, so opt out of those too —
|
|
236
|
+
// otherwise the draft response is stored in the shared cache and served
|
|
237
|
+
// on cache hits without token verification until TTL/purge. Opt out for
|
|
238
|
+
// any request carrying a `_preview` param (valid or not): those URLs are
|
|
239
|
+
// per-token, so cached copies are useless at best and drafts at worst.
|
|
240
|
+
if (hasPreviewToken) {
|
|
241
|
+
optOutOfRouteCache(routeCache);
|
|
242
|
+
}
|
|
125
243
|
if (preview) {
|
|
126
244
|
response = new Response(response.body, response);
|
|
127
245
|
response.headers.set("Cache-Control", "private, no-store");
|
|
128
246
|
}
|
|
129
247
|
|
|
130
|
-
// Inject toolbar for authenticated editors
|
|
131
|
-
|
|
248
|
+
// Inject toolbar for authenticated editors. Preview and edit-mode
|
|
249
|
+
// responses are session-specific (`private, no-store` + route-cache
|
|
250
|
+
// opt-out) in every toolbar mode, so the server toolbar is safe to
|
|
251
|
+
// inject here even in client mode.
|
|
252
|
+
if (isEditor && toolbarMode !== false) {
|
|
132
253
|
const toolbarHtml = renderToolbar({
|
|
133
254
|
editMode,
|
|
134
255
|
isPreview: !!preview,
|
|
135
256
|
});
|
|
136
|
-
return injectToolbar(response, toolbarHtml);
|
|
257
|
+
return injectToolbar(response, toolbarHtml, routeCache);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// Stale edit cookie without a session (client mode): still serve the
|
|
261
|
+
// shareable bootstrap variant.
|
|
262
|
+
if (toolbarMode === "client" && !isEditor && !preview) {
|
|
263
|
+
return injectBootstrap(response);
|
|
137
264
|
}
|
|
138
265
|
|
|
139
266
|
return response;
|
|
140
267
|
});
|
|
141
268
|
}
|
|
142
269
|
|
|
143
|
-
// Editor without
|
|
270
|
+
// Editor without preview/edit-mode signals.
|
|
144
271
|
if (isEditor) {
|
|
272
|
+
if (toolbarMode === false) {
|
|
273
|
+
return next();
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Client mode: without the `_edit` param the response must stay
|
|
277
|
+
// byte-identical to the anonymous variant (plus the same bootstrap
|
|
278
|
+
// script), so shared caches serve one entry for everyone. The bootstrap
|
|
279
|
+
// pill is the editor's entry point into the fresh `_edit` render.
|
|
280
|
+
if (toolbarMode === "client" && !hasEditParam) {
|
|
281
|
+
return injectBootstrap(await next());
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// Server mode, or an `_edit` request in client mode: inject the full
|
|
285
|
+
// toolbar (response becomes `private, no-store` and route-cache
|
|
286
|
+
// opted out).
|
|
145
287
|
const response = await next();
|
|
146
288
|
const toolbarHtml = renderToolbar({
|
|
147
289
|
editMode: false,
|
|
148
290
|
isPreview: false,
|
|
149
291
|
});
|
|
150
|
-
return injectToolbar(response, toolbarHtml);
|
|
292
|
+
return injectToolbar(response, toolbarHtml, routeCache);
|
|
151
293
|
}
|
|
152
294
|
|
|
153
295
|
return next();
|
package/src/astro/middleware.ts
CHANGED
|
@@ -47,7 +47,7 @@ import {
|
|
|
47
47
|
import { setI18nConfig } from "../i18n/config.js";
|
|
48
48
|
import type { Database, Storage } from "../index.js";
|
|
49
49
|
import { createPublicMediaUrlResolver } from "../media/url.js";
|
|
50
|
-
import type {
|
|
50
|
+
import type { SandboxRunnerFactory } from "../plugins/sandbox/types.js";
|
|
51
51
|
import type { ResolvedPlugin } from "../plugins/types.js";
|
|
52
52
|
import { invalidateUrlPatternCache } from "../query.js";
|
|
53
53
|
import {
|
|
@@ -67,6 +67,9 @@ import { createPublicPluginApiRouteHandler } from "./public-plugin-api-routes.js
|
|
|
67
67
|
import { resolveSessionUser } from "./session-user.js";
|
|
68
68
|
import type { EmDashHandlers } from "./types.js";
|
|
69
69
|
|
|
70
|
+
// Public type for withEmDashRuntime() consumers (queue/scheduled handlers).
|
|
71
|
+
export type { EmDashRuntime } from "../emdash-runtime.js";
|
|
72
|
+
|
|
70
73
|
/**
|
|
71
74
|
* Runtime init lock reclaim deadline. Must be strictly larger than the db
|
|
72
75
|
* init deadline: this lock wraps EmDashRuntime.create() → getDatabase() →
|
|
@@ -76,6 +79,17 @@ import type { EmDashHandlers } from "./types.js";
|
|
|
76
79
|
*/
|
|
77
80
|
const RUNTIME_INIT_DEADLINE_MS = DB_INIT_DEADLINE_MS + 15_000;
|
|
78
81
|
|
|
82
|
+
/**
|
|
83
|
+
* Throttle for the anonymous-path runtime-init failure log. While a site is
|
|
84
|
+
* stuck (e.g. a failing migration in its backoff window, #1744) every
|
|
85
|
+
* anonymous request lands in that catch; one line per interval per isolate
|
|
86
|
+
* keeps the failure visible without flooding logs on a busy site. Plain
|
|
87
|
+
* module state (not globalThis): a duplicated SSR chunk just means an extra
|
|
88
|
+
* log line, which is harmless.
|
|
89
|
+
*/
|
|
90
|
+
const RUNTIME_INIT_ERROR_LOG_INTERVAL_MS = 30_000;
|
|
91
|
+
let lastRuntimeInitErrorLogAt = 0;
|
|
92
|
+
|
|
79
93
|
/**
|
|
80
94
|
* Whether we've verified the database has been set up.
|
|
81
95
|
* On a fresh deployment the first request may hit a public page, bypassing
|
|
@@ -152,8 +166,7 @@ function getConfig(): EmDashConfig | null {
|
|
|
152
166
|
}
|
|
153
167
|
}
|
|
154
168
|
|
|
155
|
-
|
|
156
|
-
return virtualConfig as EmDashConfig;
|
|
169
|
+
return virtualConfig;
|
|
157
170
|
}
|
|
158
171
|
return null;
|
|
159
172
|
}
|
|
@@ -190,19 +203,7 @@ function buildDependencies(config: EmDashConfig): RuntimeDependencies {
|
|
|
190
203
|
sandboxEnabled: sandboxModule.sandboxEnabled as boolean,
|
|
191
204
|
sandboxBypassed: (sandboxModule.sandboxBypassed as boolean) ?? false,
|
|
192
205
|
sandboxedPluginEntries: (virtualSandboxedPlugins as SandboxedPluginEntry[]) || [],
|
|
193
|
-
createSandboxRunner: sandboxModule.createSandboxRunner as
|
|
194
|
-
| ((opts: {
|
|
195
|
-
db: Kysely<Database>;
|
|
196
|
-
mediaStorage?: {
|
|
197
|
-
upload(options: {
|
|
198
|
-
key: string;
|
|
199
|
-
body: Uint8Array;
|
|
200
|
-
contentType: string;
|
|
201
|
-
}): Promise<unknown>;
|
|
202
|
-
delete(key: string): Promise<unknown>;
|
|
203
|
-
};
|
|
204
|
-
}) => SandboxRunner)
|
|
205
|
-
| null,
|
|
206
|
+
createSandboxRunner: sandboxModule.createSandboxRunner as SandboxRunnerFactory | null,
|
|
206
207
|
mediaProviderEntries: (virtualMediaProviders as MediaProviderEntry[]) || [],
|
|
207
208
|
};
|
|
208
209
|
/* eslint-enable typescript-eslint/no-unsafe-type-assertion */
|
|
@@ -275,22 +276,81 @@ export async function runScheduledTasks(
|
|
|
275
276
|
): Promise<{ published: PublishedRef[] }> {
|
|
276
277
|
const config = getConfig();
|
|
277
278
|
if (!config) return { published: [] };
|
|
279
|
+
return runOutsideRequest(config, (runtime) => runtime.runScheduledTasks(options));
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Run a callback against the EmDash runtime outside any HTTP request — from a
|
|
284
|
+
* Cloudflare Queue consumer, a `scheduled()` handler, or any other
|
|
285
|
+
* platform-event handler that has no request and therefore no `locals.emdash`.
|
|
286
|
+
*
|
|
287
|
+
* Resolves the same cached runtime singleton request handlers use, so hooks,
|
|
288
|
+
* plugin state, and storage all behave exactly as they do during a request.
|
|
289
|
+
* A typical queue consumer finishes a job by calling back into a plugin route:
|
|
290
|
+
*
|
|
291
|
+
* ```ts
|
|
292
|
+
* import { withEmDashRuntime } from "emdash/middleware";
|
|
293
|
+
*
|
|
294
|
+
* async function queue(batch: MessageBatch) {
|
|
295
|
+
* await withEmDashRuntime(async (runtime) => {
|
|
296
|
+
* for (const message of batch.messages) {
|
|
297
|
+
* await runtime.handlePluginApiRoute(
|
|
298
|
+
* "my-plugin",
|
|
299
|
+
* "POST",
|
|
300
|
+
* "/finishJob",
|
|
301
|
+
* new Request("https://internal/", {
|
|
302
|
+
* method: "POST",
|
|
303
|
+
* body: JSON.stringify(message.body),
|
|
304
|
+
* }),
|
|
305
|
+
* );
|
|
306
|
+
* }
|
|
307
|
+
* });
|
|
308
|
+
* }
|
|
309
|
+
* ```
|
|
310
|
+
*
|
|
311
|
+
* Server-only and fully trusted: the callback gets the raw runtime with no
|
|
312
|
+
* auth or CSRF checks, same trust level as plugin cron. Never expose it to
|
|
313
|
+
* user input without validating that input yourself.
|
|
314
|
+
*
|
|
315
|
+
* Throws when EmDash is not configured (no `emdash()` Astro integration).
|
|
316
|
+
*/
|
|
317
|
+
export async function withEmDashRuntime<T>(
|
|
318
|
+
run: (runtime: EmDashRuntime) => T | Promise<T>,
|
|
319
|
+
): Promise<T> {
|
|
320
|
+
const config = getConfig();
|
|
321
|
+
if (!config) {
|
|
322
|
+
throw new Error(
|
|
323
|
+
"EmDash is not configured — withEmDashRuntime() requires the emdash() Astro integration.",
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
return runOutsideRequest(config, async (runtime) => run(runtime));
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Shared plumbing for request-free entry points (`runScheduledTasks`,
|
|
331
|
+
* `withEmDashRuntime`): resolve the runtime singleton, then run the callback
|
|
332
|
+
* under an event-scoped db connection when the adapter needs one.
|
|
333
|
+
*
|
|
334
|
+
* Connection-backed adapters (e.g. Postgres over Hyperdrive) cannot reuse
|
|
335
|
+
* the per-isolate singleton from a platform event: its socket belongs to the
|
|
336
|
+
* request that opened it, and workerd rejects cross-event I/O. Open an
|
|
337
|
+
* event-scoped connection and run the callback under it in ALS — the
|
|
338
|
+
* runtime's db getter, the cron executor, and plugin contexts all resolve
|
|
339
|
+
* the connection from ALS — then close it. Gated on the adapter being
|
|
340
|
+
* connection-backed (it exposes `close()`); stateless adapters (D1, Node
|
|
341
|
+
* SQLite) return null or a close-less scope and keep using the singleton.
|
|
342
|
+
*/
|
|
343
|
+
async function runOutsideRequest<T>(
|
|
344
|
+
config: EmDashConfig,
|
|
345
|
+
fn: (runtime: EmDashRuntime) => Promise<T>,
|
|
346
|
+
): Promise<T> {
|
|
278
347
|
const runtime = await getRuntime(config);
|
|
279
348
|
|
|
280
|
-
// Connection-backed adapters (e.g. Postgres over Hyperdrive) cannot reuse
|
|
281
|
-
// the per-isolate singleton from a Cron Trigger: its socket belongs to the
|
|
282
|
-
// request that opened it, and workerd rejects cross-event I/O. Open an
|
|
283
|
-
// event-scoped connection for the sweep and run the batch under it in ALS —
|
|
284
|
-
// the runtime's db getter, the cron executor, and plugin cron contexts all
|
|
285
|
-
// resolve the connection from ALS — then close it. Gated on the adapter
|
|
286
|
-
// being connection-backed (it exposes `close()`); stateless adapters (D1,
|
|
287
|
-
// Node SQLite) return null or a close-less scope and keep using the
|
|
288
|
-
// singleton, so their cron path is unchanged.
|
|
289
349
|
const scoped = createRequestScopedDb({
|
|
290
350
|
config: config.database?.config,
|
|
291
351
|
isAuthenticated: false,
|
|
292
|
-
//
|
|
293
|
-
// connection-backed adapter routes
|
|
352
|
+
// Event handlers publish, clean up, or run jobs — a write workload —
|
|
353
|
+
// so a connection-backed adapter routes them to the primary.
|
|
294
354
|
isWrite: true,
|
|
295
355
|
cookies: NOOP_COOKIE_JAR,
|
|
296
356
|
url: CRON_EVENT_URL,
|
|
@@ -298,7 +358,7 @@ export async function runScheduledTasks(
|
|
|
298
358
|
if (!scoped?.close) {
|
|
299
359
|
// Stateless adapter (or no per-request scoping): the singleton is safe
|
|
300
360
|
// outside a request. Any close-less scope created above is discarded.
|
|
301
|
-
return runtime
|
|
361
|
+
return fn(runtime);
|
|
302
362
|
}
|
|
303
363
|
|
|
304
364
|
const parent = getRequestContext();
|
|
@@ -306,19 +366,19 @@ export async function runScheduledTasks(
|
|
|
306
366
|
? { ...parent, db: scoped.db }
|
|
307
367
|
: { editMode: false, db: scoped.db, metrics: createRequestMetrics(performance.now()) };
|
|
308
368
|
try {
|
|
309
|
-
return await runWithContext(ctx, () => runtime
|
|
369
|
+
return await runWithContext(ctx, () => fn(runtime));
|
|
310
370
|
} finally {
|
|
311
|
-
// Guard both so a throw in teardown can't mask the
|
|
312
|
-
// close() and leak the connection. Mirrors closeSafely() in scoped-db.ts.
|
|
371
|
+
// Guard both so a throw in teardown can't mask the callback result or
|
|
372
|
+
// skip close() and leak the connection. Mirrors closeSafely() in scoped-db.ts.
|
|
313
373
|
try {
|
|
314
374
|
scoped.commit();
|
|
315
375
|
} catch (error) {
|
|
316
|
-
console.error("[
|
|
376
|
+
console.error("[emdash] event-scoped db commit failed:", error);
|
|
317
377
|
}
|
|
318
378
|
try {
|
|
319
379
|
scoped.close();
|
|
320
380
|
} catch (error) {
|
|
321
|
-
console.error("[
|
|
381
|
+
console.error("[emdash] event-scoped db close failed:", error);
|
|
322
382
|
}
|
|
323
383
|
}
|
|
324
384
|
}
|
|
@@ -524,11 +584,7 @@ export const onRequest = defineMiddleware(async (context, next) => {
|
|
|
524
584
|
try {
|
|
525
585
|
const { getDb } = await import("../loader.js");
|
|
526
586
|
const db = await getDb();
|
|
527
|
-
await db
|
|
528
|
-
.selectFrom("_emdash_migrations" as keyof Database)
|
|
529
|
-
.selectAll()
|
|
530
|
-
.limit(1)
|
|
531
|
-
.execute();
|
|
587
|
+
await db.selectFrom("_emdash_migrations").selectAll().limit(1).execute();
|
|
532
588
|
markSetupVerified();
|
|
533
589
|
} catch (error) {
|
|
534
590
|
// Only a genuinely-missing migrations table means a fresh,
|
|
@@ -571,8 +627,15 @@ export const onRequest = defineMiddleware(async (context, next) => {
|
|
|
571
627
|
// requests carry no session.
|
|
572
628
|
storage: runtime.storage,
|
|
573
629
|
} as EmDashHandlers;
|
|
574
|
-
} catch {
|
|
575
|
-
// Non-fatal — EmDashHead
|
|
630
|
+
} catch (error) {
|
|
631
|
+
// Non-fatal — EmDashHead falls back to base SEO contributions —
|
|
632
|
+
// but log it (throttled): a persistently failing init (e.g. a
|
|
633
|
+
// failing migration, #1744) is otherwise invisible on the
|
|
634
|
+
// anonymous path, silently degrading every public page.
|
|
635
|
+
if (Date.now() - lastRuntimeInitErrorLogAt >= RUNTIME_INIT_ERROR_LOG_INTERVAL_MS) {
|
|
636
|
+
lastRuntimeInitErrorLogAt = Date.now();
|
|
637
|
+
console.error("[emdash] runtime init failed (page renders without CMS data):", error);
|
|
638
|
+
}
|
|
576
639
|
}
|
|
577
640
|
timings.push({ name: "rt", dur: performance.now() - t0, desc: "Runtime init" });
|
|
578
641
|
// Append cold-only sub-phase timings so the breakdown is visible
|
|
@@ -721,6 +784,11 @@ export const onRequest = defineMiddleware(async (context, next) => {
|
|
|
721
784
|
handlePluginApiRoute: runtime.handlePluginApiRoute.bind(runtime),
|
|
722
785
|
handlePublicPluginApiRoute: createPublicPluginApiRouteHandler(runtime),
|
|
723
786
|
getPluginRouteMeta: runtime.getPluginRouteMeta.bind(runtime),
|
|
787
|
+
getPluginMcpTools: runtime.getPluginMcpTools.bind(runtime),
|
|
788
|
+
getEnabledPluginMcpTools: runtime.getEnabledPluginMcpTools.bind(runtime),
|
|
789
|
+
serializePluginMcpConsent: runtime.serializePluginMcpConsent.bind(runtime),
|
|
790
|
+
handlePluginMcpTool: runtime.handlePluginMcpTool.bind(runtime),
|
|
791
|
+
handlePluginMcpDenied: runtime.handlePluginMcpDenied.bind(runtime),
|
|
724
792
|
|
|
725
793
|
// Media provider methods
|
|
726
794
|
getMediaProvider: runtime.getMediaProvider.bind(runtime),
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { RouteMeta } from "../plugins/routes.js";
|
|
1
2
|
import type { HandlerResponse } from "./types.js";
|
|
2
3
|
|
|
3
4
|
export type PublicPluginApiRouteHandler = (
|
|
@@ -8,7 +9,7 @@ export type PublicPluginApiRouteHandler = (
|
|
|
8
9
|
) => Promise<HandlerResponse>;
|
|
9
10
|
|
|
10
11
|
interface PublicPluginApiRouteRuntime {
|
|
11
|
-
getPluginRouteMeta(pluginId: string, path: string):
|
|
12
|
+
getPluginRouteMeta(pluginId: string, path: string): RouteMeta | null;
|
|
12
13
|
handlePluginApiRoute(
|
|
13
14
|
pluginId: string,
|
|
14
15
|
method: string,
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* together with the admin app and available via React context.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import { AdminApp } from "@emdash-cms/admin";
|
|
9
|
+
import { AdminApp, type AdminBranding } from "@emdash-cms/admin";
|
|
10
10
|
import type { Messages } from "@lingui/core";
|
|
11
11
|
// @ts-ignore - virtual module generated by integration
|
|
12
12
|
import { pluginAdmins } from "virtual:emdash/admin-registry";
|
|
@@ -16,13 +16,16 @@ import { authProviders } from "virtual:emdash/auth-providers";
|
|
|
16
16
|
interface AdminWrapperProps {
|
|
17
17
|
locale: string;
|
|
18
18
|
messages: Messages;
|
|
19
|
+
/** Configured admin white-label branding (logo, site name), read server-side from `admin.astro`. */
|
|
20
|
+
adminBranding?: AdminBranding;
|
|
19
21
|
}
|
|
20
22
|
|
|
21
|
-
export default function AdminWrapper({ locale, messages }: AdminWrapperProps) {
|
|
23
|
+
export default function AdminWrapper({ locale, messages, adminBranding }: AdminWrapperProps) {
|
|
22
24
|
return (
|
|
23
25
|
<AdminApp
|
|
24
26
|
pluginAdmins={pluginAdmins}
|
|
25
27
|
authProviders={authProviders}
|
|
28
|
+
adminBranding={adminBranding}
|
|
26
29
|
locale={locale}
|
|
27
30
|
messages={messages}
|
|
28
31
|
/>
|
|
@@ -17,6 +17,7 @@ import { Font } from "astro:assets";
|
|
|
17
17
|
export const prerender = false;
|
|
18
18
|
|
|
19
19
|
import { resolveLocale, loadMessages, getLocaleDir } from "@emdash-cms/admin/locales";
|
|
20
|
+
import { getSiteSettingsWithDb } from "#settings/index.js";
|
|
20
21
|
|
|
21
22
|
const resolvedLocale = resolveLocale(Astro.request);
|
|
22
23
|
const resolvedDir = getLocaleDir(resolvedLocale);
|
|
@@ -33,17 +34,59 @@ const pageTitle = adminConfig?.siteName ? `${adminConfig.siteName} Admin` : "EmD
|
|
|
33
34
|
// via cookie/Accept-Language). API routes already send `private, no-store`
|
|
34
35
|
// (API_CACHE_HEADERS); this closes the same gap for the admin HTML.
|
|
35
36
|
Astro.response.headers.set("Cache-Control", "private, no-store");
|
|
37
|
+
|
|
38
|
+
// Favicon precedence: an explicit build-time `admin.favicon` is admin-specific
|
|
39
|
+
// and always wins — in that case the settings read is skipped entirely.
|
|
40
|
+
// Otherwise fall back to the Site Icon configured in Settings → General, so
|
|
41
|
+
// the admin shell is branded like the public site (WordPress-style Site Icon,
|
|
42
|
+
// which also brands wp-admin), and finally the bundled EmDash mark below.
|
|
43
|
+
const emdash = Astro.locals.emdash;
|
|
44
|
+
let siteFavicon: string | undefined;
|
|
45
|
+
let siteFaviconType: string | undefined;
|
|
46
|
+
if (!adminConfig?.favicon && emdash?.db) {
|
|
47
|
+
try {
|
|
48
|
+
const settings = await getSiteSettingsWithDb(emdash.db, emdash.storage ?? null);
|
|
49
|
+
siteFavicon = settings.favicon?.url ?? undefined;
|
|
50
|
+
siteFaviconType = settings.favicon?.contentType ?? undefined;
|
|
51
|
+
} catch {
|
|
52
|
+
// Settings unavailable (e.g. pre-setup) — fall back to the config/default.
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const favicon = adminConfig?.favicon ?? siteFavicon;
|
|
56
|
+
// The media-file URL has no extension, so browsers need the MIME type —
|
|
57
|
+
// Chromium ignores SVG favicons without type="image/svg+xml". Only set for
|
|
58
|
+
// Site Icons; build-time `admin.favicon` strings keep their current behavior.
|
|
59
|
+
const faviconType = adminConfig?.favicon ? undefined : siteFaviconType;
|
|
36
60
|
---
|
|
37
61
|
|
|
38
62
|
<!doctype html>
|
|
39
|
-
<html lang={resolvedLocale} dir={resolvedDir}>
|
|
63
|
+
<html lang={resolvedLocale} dir={resolvedDir} data-theme="classic">
|
|
40
64
|
<head>
|
|
41
65
|
<meta charset="UTF-8" />
|
|
42
66
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
67
|
+
<script is:inline>
|
|
68
|
+
(() => {
|
|
69
|
+
let preference = "system";
|
|
70
|
+
|
|
71
|
+
try {
|
|
72
|
+
const storedPreference = localStorage.getItem("emdash-theme");
|
|
73
|
+
if (storedPreference === "light" || storedPreference === "dark") {
|
|
74
|
+
preference = storedPreference;
|
|
75
|
+
}
|
|
76
|
+
} catch {
|
|
77
|
+
// Storage can be unavailable in privacy-restricted contexts. Use the system theme.
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
81
|
+
const mode =
|
|
82
|
+
preference === "dark" || (preference === "system" && prefersDark) ? "dark" : "light";
|
|
83
|
+
document.documentElement.setAttribute("data-mode", mode);
|
|
84
|
+
})();
|
|
85
|
+
</script>
|
|
43
86
|
<link rel="stylesheet" href={adminStylesUrl} />
|
|
44
87
|
<Font cssVariable="--font-emdash" />
|
|
45
|
-
{
|
|
46
|
-
<link rel="icon" href={
|
|
88
|
+
{favicon ? (
|
|
89
|
+
<link rel="icon" href={favicon} type={faviconType} />
|
|
47
90
|
) : (
|
|
48
91
|
<link
|
|
49
92
|
rel="icon"
|
|
@@ -61,8 +104,7 @@ Astro.response.headers.set("Cache-Control", "private, no-store");
|
|
|
61
104
|
align-items: center;
|
|
62
105
|
justify-content: center;
|
|
63
106
|
min-height: 100vh;
|
|
64
|
-
color-
|
|
65
|
-
background: light-dark(hsl(0 0% 100%), hsl(222.2 84% 4.9%));
|
|
107
|
+
background: var(--color-kumo-elevated);
|
|
66
108
|
}
|
|
67
109
|
#emdash-boot-loader .loader-inner {
|
|
68
110
|
text-align: center;
|
|
@@ -71,15 +113,8 @@ Astro.response.headers.set("Cache-Control", "private, no-store");
|
|
|
71
113
|
width: 24px;
|
|
72
114
|
height: 24px;
|
|
73
115
|
margin: 0 auto;
|
|
74
|
-
border: 2.5px solid
|
|
75
|
-
|
|
76
|
-
hsl(215.4 16.3% 46.9% / 0.3),
|
|
77
|
-
hsl(215 20.2% 65.1% / 0.3)
|
|
78
|
-
);
|
|
79
|
-
border-top-color: light-dark(
|
|
80
|
-
hsl(215.4 16.3% 46.9%),
|
|
81
|
-
hsl(215 20.2% 65.1%)
|
|
82
|
-
);
|
|
116
|
+
border: 2.5px solid var(--color-kumo-line);
|
|
117
|
+
border-top-color: var(--text-color-kumo-subtle);
|
|
83
118
|
border-radius: 50%;
|
|
84
119
|
animation: emdash-spin 0.8s linear infinite;
|
|
85
120
|
}
|
|
@@ -92,7 +127,7 @@ Astro.response.headers.set("Cache-Control", "private, no-store");
|
|
|
92
127
|
sans-serif
|
|
93
128
|
);
|
|
94
129
|
font-size: 0.875rem;
|
|
95
|
-
color:
|
|
130
|
+
color: var(--text-color-kumo-subtle);
|
|
96
131
|
}
|
|
97
132
|
@keyframes emdash-spin {
|
|
98
133
|
to {
|
|
@@ -105,7 +140,12 @@ Astro.response.headers.set("Cache-Control", "private, no-store");
|
|
|
105
140
|
<p>{adminConfig?.siteName ? `Loading ${adminConfig.siteName}...` : "Loading EmDash..."}</p>
|
|
106
141
|
</div>
|
|
107
142
|
</div>
|
|
108
|
-
<AdminWrapper
|
|
143
|
+
<AdminWrapper
|
|
144
|
+
client:only="react"
|
|
145
|
+
locale={resolvedLocale}
|
|
146
|
+
messages={messages}
|
|
147
|
+
adminBranding={{ logo: adminConfig?.logo, siteName: adminConfig?.siteName }}
|
|
148
|
+
/>
|
|
109
149
|
</div>
|
|
110
150
|
</body>
|
|
111
151
|
</html>
|
|
@@ -12,13 +12,13 @@ import { z } from "zod";
|
|
|
12
12
|
import { apiError, handleError, unwrapResult } from "#api/error.js";
|
|
13
13
|
import { handleApiTokenCreate, handleApiTokenList } from "#api/handlers/api-tokens.js";
|
|
14
14
|
import { isParseError, parseBody } from "#api/parse.js";
|
|
15
|
-
import {
|
|
15
|
+
import { isValidScope } from "#auth/api-tokens.js";
|
|
16
16
|
|
|
17
17
|
export const prerender = false;
|
|
18
18
|
|
|
19
19
|
const createTokenSchema = z.object({
|
|
20
20
|
name: z.string().min(1).max(100),
|
|
21
|
-
scopes: z.array(z.
|
|
21
|
+
scopes: z.array(z.string().refine(isValidScope)).min(1),
|
|
22
22
|
expiresAt: z.string().datetime().optional(),
|
|
23
23
|
});
|
|
24
24
|
|