emdash 0.29.0 → 0.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{adapters-DPAkL6QF.d.mts → adapters-C0ONzkUP.d.mts} +10 -1
- package/dist/adapters-C0ONzkUP.d.mts.map +1 -0
- package/dist/{allowed-origins-FXB-FplB.mjs → allowed-origins-CCEi9bPI.mjs} +2 -2
- package/dist/{allowed-origins-FXB-FplB.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 +19 -19
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +5 -4
- package/dist/{api-DVbHNApo.mjs → api-EibxGP-V.mjs} +260 -160
- package/dist/api-EibxGP-V.mjs.map +1 -0
- package/dist/api-tokens-Cvmixds7.mjs +3 -0
- package/dist/{api-tokens-UYBkl17d.mjs → api-tokens-uPt8UDpx.mjs} +2 -2
- package/dist/{api-tokens-UYBkl17d.mjs.map → api-tokens-uPt8UDpx.mjs.map} +1 -1
- package/dist/{apply-D23iUV4q.mjs → apply-fGHCAwWN.mjs} +42 -44
- package/dist/apply-fGHCAwWN.mjs.map +1 -0
- package/dist/astro/index.d.mts +12 -13
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +90 -11
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +10 -11
- 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.mjs +4 -4
- package/dist/astro/middleware/request-context.mjs.map +1 -1
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +47 -3
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +410 -123
- 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 +5 -5
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +10 -9
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +10 -9
- package/dist/astro/routes/api/admin/byline-fields/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +10 -9
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +16 -15
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +17 -22
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/index.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/bylines/index.mjs +20 -18
- package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +13 -12
- 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.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 +5 -5
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +4 -4
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +12 -10
- package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
- 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 +41 -40
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +41 -40
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +46 -40
- 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 +40 -39
- 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 +43 -40
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +46 -40
- 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 +40 -39
- 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 +46 -41
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +40 -39
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +40 -39
- 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 +44 -41
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +40 -39
- 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 +45 -42
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +41 -40
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +40 -39
- 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 +40 -39
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +4 -4
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +4 -4
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +9 -8
- package/dist/astro/routes/api/admin/users/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +5 -5
- package/dist/astro/routes/api/admin/users/index.mjs +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 +13 -12
- package/dist/astro/routes/api/auth/invite/complete.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/index.mjs +10 -9
- package/dist/astro/routes/api/auth/invite/index.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/register-options.mjs +12 -11
- 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 +12 -11
- 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 +15 -5
- 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 +13 -12
- package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +11 -10
- package/dist/astro/routes/api/auth/passkey/register/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +12 -11
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/verify.mjs +12 -11
- package/dist/astro/routes/api/auth/passkey/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/complete.mjs +13 -12
- package/dist/astro/routes/api/auth/signup/complete.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/request.mjs +12 -11
- 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.mjs +14 -13
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs.map +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +13 -12
- 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.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +20 -19
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +18 -17
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
- 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 +19 -18
- 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 +17 -16
- package/dist/astro/routes/api/import/probe.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +4 -4
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -12
- package/dist/astro/routes/api/import/wordpress/execute.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/execute.mjs +13 -13
- package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -11
- package/dist/astro/routes/api/import/wordpress/media.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/media.mjs +11 -10
- package/dist/astro/routes/api/import/wordpress/media.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +11 -10
- package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +11 -12
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +11 -10
- 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 +17 -16
- 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 -12
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +24 -23
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
- package/dist/astro/routes/api/manifest.mjs +7 -8
- 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 +149 -45
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +9 -8
- 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 +10 -9
- 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 +31 -11
- 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 +29 -16
- 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 +52 -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 +12 -11
- package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/summary.mjs +12 -11
- package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/_id_.mjs +13 -12
- package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/index.mjs +13 -12
- package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/index.mjs +16 -15
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/translations.mjs +11 -11
- package/dist/astro/routes/api/relations/index.mjs +16 -15
- package/dist/astro/routes/api/relations/index.mjs.map +1 -1
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +4 -4
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +5 -4
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +40 -39
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +40 -39
- 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 +40 -39
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +40 -39
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +40 -39
- 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 +40 -39
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +40 -39
- 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 +12 -11
- 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 +5 -5
- package/dist/astro/routes/api/settings.mjs +14 -13
- package/dist/astro/routes/api/settings.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin-verify.mjs +19 -15
- package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin.mjs +18 -14
- package/dist/astro/routes/api/setup/admin.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-bypass.mjs +26 -26
- package/dist/astro/routes/api/setup/dev-reset.mjs +3 -3
- package/dist/astro/routes/api/setup/index.mjs +28 -27
- 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 +8 -215
- package/dist/astro/routes/api/snapshot.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +15 -14
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +15 -14
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +15 -14
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +15 -14
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +6 -6
- package/dist/astro/routes/api/typegen.mjs +6 -6
- package/dist/astro/routes/api/well-known/auth.mjs +1 -1
- 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 +12 -11
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +12 -11
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.mjs +7 -7
- package/dist/astro/routes/api/widget-areas/index.mjs +12 -11
- 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 +7 -7
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +11 -11
- package/dist/astro/routes/sitemap.xml.mjs +8 -8
- package/dist/astro/types.d.mts +38 -17
- 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-BmCwQCib.mjs → authorize-6WPZa1xZ.mjs} +7 -4
- package/dist/authorize-6WPZa1xZ.mjs.map +1 -0
- package/dist/backup-Qr9PaGUo.mjs +241 -0
- package/dist/backup-Qr9PaGUo.mjs.map +1 -0
- package/dist/{base64-C74Msx8h.mjs → base64-B-PsqheR.mjs} +8 -4
- package/dist/base64-B-PsqheR.mjs.map +1 -0
- package/dist/{byline-BWb5H-65.mjs → byline-BTOxUlFF.mjs} +6 -6
- package/dist/{byline-BWb5H-65.mjs.map → byline-BTOxUlFF.mjs.map} +1 -1
- package/dist/{byline-fields-DO6bAYK8.mjs → byline-fields-CdU_LTF1.mjs} +1 -1
- package/dist/{byline-fields-DO6bAYK8.mjs.map → byline-fields-CdU_LTF1.mjs.map} +1 -1
- package/dist/{bylines-CHojDMpj.mjs → bylines-FyZu6TbJ.mjs} +7 -7
- package/dist/{bylines-CHojDMpj.mjs.map → bylines-FyZu6TbJ.mjs.map} +1 -1
- package/dist/{bylines-BGuKFaBy.mjs → bylines-oVN0iPwX.mjs} +12 -8
- package/dist/bylines-oVN0iPwX.mjs.map +1 -0
- package/dist/{cache-BeR7RfN8.mjs → cache-DDwy3JDW.mjs} +2 -2
- package/dist/{cache-BeR7RfN8.mjs.map → cache-DDwy3JDW.mjs.map} +1 -1
- package/dist/{challenge-store-B426wQ6O.mjs → challenge-store-BFzgFRog.mjs} +1 -1
- package/dist/{challenge-store-B426wQ6O.mjs.map → challenge-store-BFzgFRog.mjs.map} +1 -1
- package/dist/{chunks-BU5_nrAC.mjs → chunks-Bq-5DPrD.mjs} +2 -2
- package/dist/{chunks-BU5_nrAC.mjs.map → chunks-Bq-5DPrD.mjs.map} +1 -1
- package/dist/cli/index.mjs +139 -32
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +54 -3
- package/dist/client/index.d.mts.map +1 -1
- package/dist/client/index.mjs +16 -4
- package/dist/client/index.mjs.map +1 -1
- package/dist/{comment-SWh31kS0.mjs → comment-B9cUud8H.mjs} +2 -2
- package/dist/{comment-SWh31kS0.mjs.map → comment-B9cUud8H.mjs.map} +1 -1
- package/dist/{comment-reaction-DgcpziXI.mjs → comment-reaction-VUXO981F.mjs} +2 -2
- package/dist/{comment-reaction-DgcpziXI.mjs.map → comment-reaction-VUXO981F.mjs.map} +1 -1
- package/dist/{comments-kZYGppMS.mjs → comments-PXj1E9Si.mjs} +3 -3
- package/dist/{comments-kZYGppMS.mjs.map → comments-PXj1E9Si.mjs.map} +1 -1
- package/dist/{components-CliOkZAs.mjs → components-DZkL4Fx0.mjs} +1 -1
- package/dist/{components-CliOkZAs.mjs.map → components-DZkL4Fx0.mjs.map} +1 -1
- package/dist/{config-CVssduLe.mjs → config-B6b_BobR.mjs} +6 -2
- package/dist/config-B6b_BobR.mjs.map +1 -0
- package/dist/{content-BO61Sx4j.mjs → content-BC43pICM.mjs} +53 -19
- package/dist/content-BC43pICM.mjs.map +1 -0
- package/dist/{content-refresh-BkkApzeS.mjs → content-refresh-CPMSauD3.mjs} +96 -4
- package/dist/content-refresh-CPMSauD3.mjs.map +1 -0
- package/dist/{context-DtSFYFuS.mjs → context-DOurRIrb.mjs} +97 -74
- package/dist/context-DOurRIrb.mjs.map +1 -0
- package/dist/{cron-YFJ7uNVA.mjs → cron-BlKIMD_e.mjs} +1 -1
- package/dist/{cron-YFJ7uNVA.mjs.map → cron-BlKIMD_e.mjs.map} +1 -1
- package/dist/{dashboard-xo_gPs_D.mjs → dashboard-CBm4zhc3.mjs} +4 -4
- package/dist/{dashboard-xo_gPs_D.mjs.map → dashboard-CBm4zhc3.mjs.map} +1 -1
- package/dist/database/pg-migration-lock.d.mts.map +1 -1
- package/dist/database/pg-migration-lock.mjs +1 -4
- package/dist/database/pg-migration-lock.mjs.map +1 -1
- 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/sqlite.d.mts +1 -1
- package/dist/{db-errors-BKuXh_fi.mjs → db-errors-CcWLaRiR.mjs} +4 -2
- package/dist/db-errors-CcWLaRiR.mjs.map +1 -0
- package/dist/{default-DY5ovGUG.mjs → default-C4v9KP56.mjs} +1 -1
- package/dist/{default-DY5ovGUG.mjs.map → default-C4v9KP56.mjs.map} +1 -1
- package/dist/{device-flow-CPXQ_QfW.mjs → device-flow-BeA6lUS1.mjs} +5 -6
- package/dist/device-flow-BeA6lUS1.mjs.map +1 -0
- package/dist/{dialect-helpers-Cue7QQOR.mjs → dialect-helpers-BtOwo2us.mjs} +60 -14
- package/dist/dialect-helpers-BtOwo2us.mjs.map +1 -0
- package/dist/{email-console-CjkQc7oY.mjs → email-console-C-9Ng8DM.mjs} +1 -1
- package/dist/{email-console-CjkQc7oY.mjs.map → email-console-C-9Ng8DM.mjs.map} +1 -1
- package/dist/error-DJ98TRbQ.mjs +90 -0
- package/dist/error-DJ98TRbQ.mjs.map +1 -0
- package/dist/{error-CfJMLSkd.mjs → errors-DtEXIQQV.mjs} +15 -84
- package/dist/errors-DtEXIQQV.mjs.map +1 -0
- package/dist/{escape-r8_GbEU2.mjs → escape-CFedIB1C.mjs} +1 -1
- package/dist/{escape-r8_GbEU2.mjs.map → escape-CFedIB1C.mjs.map} +1 -1
- package/dist/{field-defs-cache-BVrNCgSj.mjs → field-defs-cache-KfNJ_qLQ.mjs} +2 -2
- package/dist/{field-defs-cache-BVrNCgSj.mjs.map → field-defs-cache-KfNJ_qLQ.mjs.map} +1 -1
- package/dist/{fts-manager-BD9s77qh.mjs → fts-manager-hyCU9OOp.mjs} +3 -3
- package/dist/{fts-manager-BD9s77qh.mjs.map → fts-manager-hyCU9OOp.mjs.map} +1 -1
- package/dist/{hreflang-CgIxhH4k.d.mts → hreflang-CIxH_LKz.d.mts} +2 -2
- package/dist/{hreflang-CgIxhH4k.d.mts.map → hreflang-CIxH_LKz.d.mts.map} +1 -1
- package/dist/{hreflang-pAWUiPd_.mjs → hreflang-CbYeCzl9.mjs} +7 -7
- package/dist/{hreflang-pAWUiPd_.mjs.map → hreflang-CbYeCzl9.mjs.map} +1 -1
- package/dist/{import-2jHtLzsO.mjs → import-oDYCgNYQ.mjs} +4 -4
- package/dist/{import-2jHtLzsO.mjs.map → import-oDYCgNYQ.mjs.map} +1 -1
- package/dist/{index-DxjWLKGT.d.mts → index-BEui-cRd.d.mts} +3 -3
- package/dist/{index-DxjWLKGT.d.mts.map → index-BEui-cRd.d.mts.map} +1 -1
- package/dist/{index-BXOCyLj0.d.mts → index-BcEH_FfS.d.mts} +812 -16
- package/dist/index-BcEH_FfS.d.mts.map +1 -0
- package/dist/index.d.mts +18 -19
- package/dist/index.mjs +61 -60
- package/dist/{load-DgoWMdRX.mjs → load-Dg5gtWma.mjs} +2 -2
- package/dist/{load-DgoWMdRX.mjs.map → load-Dg5gtWma.mjs.map} +1 -1
- package/dist/{loader-Rb8QlGZp.mjs → loader-D4rigvjR.mjs} +170 -6
- package/dist/loader-D4rigvjR.mjs.map +1 -0
- package/dist/{manifest-schema-DeGNma2O.mjs → manifest-schema-bCq54i7F.mjs} +16 -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 +29 -3
- package/dist/media/image-endpoint.mjs.map +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/local-runtime.d.mts +12 -13
- package/dist/media/local-runtime.d.mts.map +1 -1
- package/dist/media/local-runtime.mjs +6 -6
- package/dist/media-BJ6SRY3g.mjs +247 -0
- package/dist/media-BJ6SRY3g.mjs.map +1 -0
- package/dist/{media-allowlist-Dc05vKtt.mjs → media-allowlist-jUppPWFy.mjs} +1 -1
- package/dist/{media-allowlist-Dc05vKtt.mjs.map → media-allowlist-jUppPWFy.mjs.map} +1 -1
- package/dist/{media-D2ZFowpn.mjs → media-its1WLYv.mjs} +2 -2
- package/dist/{media-D2ZFowpn.mjs.map → media-its1WLYv.mjs.map} +1 -1
- package/dist/media-upload-DNu3QySc.mjs +145 -0
- package/dist/media-upload-DNu3QySc.mjs.map +1 -0
- package/dist/{media-url-DgIEYZr4.mjs → media-url-BCm5vBn6.mjs} +1 -1
- package/dist/{media-url-DgIEYZr4.mjs.map → media-url-BCm5vBn6.mjs.map} +1 -1
- package/dist/{media-usage-B__v9NMm.mjs → media-usage-DPQ3K4xB.mjs} +138 -5
- package/dist/{media-usage-B__v9NMm.mjs.map → media-usage-DPQ3K4xB.mjs.map} +1 -1
- package/dist/{menus-BpfevlJD.mjs → menus-BMGzWyWH.mjs} +15 -8
- package/dist/menus-BMGzWyWH.mjs.map +1 -0
- package/dist/{menus-BtvH7Z7t.mjs → menus-CPf_SW7u.mjs} +234 -13
- package/dist/menus-CPf_SW7u.mjs.map +1 -0
- package/dist/{mode-BVnhGZ2o.mjs → mode-fiXRMfeA.mjs} +1 -1
- package/dist/{mode-BVnhGZ2o.mjs.map → mode-fiXRMfeA.mjs.map} +1 -1
- package/dist/{oauth-authorization-BWqWTHBK.mjs → oauth-authorization-oqfbBuMH.mjs} +5 -6
- package/dist/oauth-authorization-oqfbBuMH.mjs.map +1 -0
- package/dist/{oauth-clients-43_XADoa.mjs → oauth-clients-BlrUHAsf.mjs} +1 -1
- package/dist/{oauth-clients-43_XADoa.mjs.map → oauth-clients-BlrUHAsf.mjs.map} +1 -1
- package/dist/{oauth-state-store-BRSUEkmx.mjs → oauth-state-store-DnvjRMy6.mjs} +2 -1
- package/dist/{oauth-state-store-BRSUEkmx.mjs.map → oauth-state-store-DnvjRMy6.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-Ctgemb0k.mjs → oauth-user-lookup-oUllxvAv.mjs} +1 -1
- package/dist/{oauth-user-lookup-Ctgemb0k.mjs.map → oauth-user-lookup-oUllxvAv.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/{options-COXGTtqd.d.mts → options-BqMkWfYa.d.mts} +6 -6
- package/dist/{options-COXGTtqd.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-GLksnn-B.mjs → parse-53zyxlpv.mjs} +4 -12
- package/dist/{parse-GLksnn-B.mjs.map → parse-53zyxlpv.mjs.map} +1 -1
- package/dist/{passkey-config-CjA1UbDj.mjs → passkey-config-C-SKpc0-.mjs} +1 -1
- package/dist/{passkey-config-CjA1UbDj.mjs.map → passkey-config-C-SKpc0-.mjs.map} +1 -1
- package/dist/{placeholder-DR-eeZr-.d.mts → placeholder-Dop47JMM.d.mts} +1 -1
- package/dist/{placeholder-DR-eeZr-.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 -17
- 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 -11
- 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-BAkgEKcv.mjs → portable-text-sDj92Kxv.mjs} +1 -1
- package/dist/{portable-text-BAkgEKcv.mjs.map → portable-text-sDj92Kxv.mjs.map} +1 -1
- package/dist/{preview-Rloa09Wp.mjs → preview-D4Jnbfx7.mjs} +2 -2
- package/dist/{preview-Rloa09Wp.mjs.map → preview-D4Jnbfx7.mjs.map} +1 -1
- package/dist/{public-url-C0cEvrRu.mjs → public-url-DSGTnJFw.mjs} +5 -3
- package/dist/public-url-DSGTnJFw.mjs.map +1 -0
- package/dist/{query-ZzvXyxWq.mjs → query-BbJQ-dGg.mjs} +15 -15
- package/dist/{query-ZzvXyxWq.mjs.map → query-BbJQ-dGg.mjs.map} +1 -1
- package/dist/{query-BxT95opY.mjs → query-DdFGHzQF.mjs} +3 -3
- package/dist/{query-BxT95opY.mjs.map → query-DdFGHzQF.mjs.map} +1 -1
- package/dist/{rate-limit-Cg4Rvc_-.mjs → rate-limit-D3IEiUi2.mjs} +2 -2
- package/dist/{rate-limit-Cg4Rvc_-.mjs.map → rate-limit-D3IEiUi2.mjs.map} +1 -1
- package/dist/{redirect-Ch3E98qZ.mjs → redirect-BoUac4NT.mjs} +10 -4
- package/dist/redirect-BoUac4NT.mjs.map +1 -0
- package/dist/{redirect-Ce_6Yb6z.mjs → redirect-Botom7X6.mjs} +1 -1
- package/dist/{redirect-Ce_6Yb6z.mjs.map → redirect-Botom7X6.mjs.map} +1 -1
- package/dist/{redirects-CXmVGRNZ.mjs → redirects-ChbpqKiS.mjs} +4 -4
- package/dist/{redirects-CXmVGRNZ.mjs.map → redirects-ChbpqKiS.mjs.map} +1 -1
- package/dist/{redirects-CeD7K7EX.mjs → redirects-D457qwt0.mjs} +10 -181
- package/dist/redirects-D457qwt0.mjs.map +1 -0
- package/dist/{registry-CyIXPi4E.mjs → registry-y21kjhfG.mjs} +97 -8
- package/dist/registry-y21kjhfG.mjs.map +1 -0
- package/dist/{relation-Ba68Tm4Z.mjs → relation-Du0r04E0.mjs} +3 -3
- package/dist/{relation-Ba68Tm4Z.mjs.map → relation-Du0r04E0.mjs.map} +1 -1
- package/dist/{relations-CbBpoOys.d.mts → relations-BKybBoOX.d.mts} +315 -9
- package/dist/relations-BKybBoOX.d.mts.map +1 -0
- package/dist/{relations-BmBmX4Eb.mjs → relations-CZMpBqEd.mjs} +3 -3
- package/dist/{relations-BmBmX4Eb.mjs.map → relations-CZMpBqEd.mjs.map} +1 -1
- package/dist/{relations-C8hVyEy0.mjs → relations-DtX1UMBH.mjs} +13 -7
- package/dist/relations-DtX1UMBH.mjs.map +1 -0
- package/dist/{request-meta-DCwktC5P.mjs → request-meta-DzXYYI-n.mjs} +2 -2
- package/dist/{request-meta-DCwktC5P.mjs.map → request-meta-DzXYYI-n.mjs.map} +1 -1
- package/dist/{resolve-Cd9dzclN.mjs → resolve-DFr4kq72.mjs} +2 -2
- package/dist/{resolve-Cd9dzclN.mjs.map → resolve-DFr4kq72.mjs.map} +1 -1
- package/dist/{runner-jt65bF7F.mjs → runner-BdeLEgad.mjs} +334 -200
- package/dist/runner-BdeLEgad.mjs.map +1 -0
- package/dist/{runner-CiNdIk3y.d.mts → runner-Dd8m8k9F.d.mts} +2 -2
- package/dist/{runner-CiNdIk3y.d.mts.map → runner-Dd8m8k9F.d.mts.map} +1 -1
- package/dist/runtime.d.mts +11 -12
- package/dist/runtime.d.mts.map +1 -1
- package/dist/runtime.mjs +4 -4
- package/dist/{schema-DwjufZ1S.mjs → schema-BH8P8vaC.mjs} +3 -3
- package/dist/{schema-DwjufZ1S.mjs.map → schema-BH8P8vaC.mjs.map} +1 -1
- package/dist/scopes-DTIkIaGA.mjs +27 -0
- package/dist/scopes-DTIkIaGA.mjs.map +1 -0
- package/dist/{search-Cl875CVE.mjs → search-D-Yhpmvs.mjs} +8 -7
- package/dist/search-D-Yhpmvs.mjs.map +1 -0
- package/dist/{secrets-CO_bEmII.mjs → secrets-CQ-69kF9.mjs} +25 -19
- package/dist/secrets-CQ-69kF9.mjs.map +1 -0
- package/dist/{sections-DTKzgoiS.mjs → sections-CzVBAKjw.mjs} +3 -3
- package/dist/{sections-DTKzgoiS.mjs.map → sections-CzVBAKjw.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +20 -20
- package/dist/seo/index.d.mts +14 -3
- package/dist/seo/index.d.mts.map +1 -1
- package/dist/seo/index.mjs +17 -17
- package/dist/seo/index.mjs.map +1 -1
- package/dist/{seo-BjrbXAd_.mjs → seo-C3GDfT0V.mjs} +1 -1
- package/dist/{seo-BjrbXAd_.mjs.map → seo-C3GDfT0V.mjs.map} +1 -1
- package/dist/{seo-BLm6SXzS.mjs → seo-kJzVAmmu.mjs} +2 -2
- package/dist/{seo-BLm6SXzS.mjs.map → seo-kJzVAmmu.mjs.map} +1 -1
- package/dist/{service-D6zDmKXy.mjs → service-CQnc276a.mjs} +3 -3
- package/dist/{service-D6zDmKXy.mjs.map → service-CQnc276a.mjs.map} +1 -1
- package/dist/{session-user-DoSs6YM8.mjs → session-user-DbHqKDKe.mjs} +1 -1
- package/dist/{session-user-DoSs6YM8.mjs.map → session-user-DbHqKDKe.mjs.map} +1 -1
- package/dist/{settings-BuQYvLfy.mjs → settings-C2PaBS49.mjs} +4 -4
- package/dist/{settings-BuQYvLfy.mjs.map → settings-C2PaBS49.mjs.map} +1 -1
- package/dist/{settings-CmS3TwXf.mjs → settings-Dtc0DU31.mjs} +3 -3
- package/dist/{settings-CmS3TwXf.mjs.map → settings-Dtc0DU31.mjs.map} +1 -1
- package/dist/{setup-complete-BPNgLHlU.mjs → setup-complete-CdIlqloh.mjs} +1 -1
- package/dist/{setup-complete-BPNgLHlU.mjs.map → setup-complete-CdIlqloh.mjs.map} +1 -1
- package/dist/{setup-nonce-DEPZX96T.mjs → setup-nonce-DqiIPr-J.mjs} +1 -1
- package/dist/{setup-nonce-DEPZX96T.mjs.map → setup-nonce-DqiIPr-J.mjs.map} +1 -1
- package/dist/{single-flight-cache-DEtW-OEG.mjs → single-flight-cache-C2exrGAi.mjs} +1 -1
- package/dist/{single-flight-cache-DEtW-OEG.mjs.map → single-flight-cache-C2exrGAi.mjs.map} +1 -1
- package/dist/{site-url-CcLy5D5s.mjs → site-url-NGJT6NTU.mjs} +1 -1
- package/dist/{site-url-CcLy5D5s.mjs.map → site-url-NGJT6NTU.mjs.map} +1 -1
- package/dist/snapshot-BdpUJKD-.mjs +216 -0
- package/dist/snapshot-BdpUJKD-.mjs.map +1 -0
- package/dist/{ssrf-TrKYJAy0.mjs → ssrf-CviKqWmq.mjs} +1 -1
- package/dist/{ssrf-TrKYJAy0.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-D3Gy1Zc6.mjs → status-COfycGIU.mjs} +1 -1
- package/dist/{status-D3Gy1Zc6.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-pUkuD6nj.mjs → taxonomies-HI9fnTdp.mjs} +8 -8
- package/dist/{taxonomies-pUkuD6nj.mjs.map → taxonomies-HI9fnTdp.mjs.map} +1 -1
- package/dist/{taxonomies-ClS4RKaZ.mjs → taxonomies-rMeBzOjX.mjs} +26 -17
- package/dist/taxonomies-rMeBzOjX.mjs.map +1 -0
- package/dist/{taxonomy-BkxbUMSw.mjs → taxonomy-0mCI25HN.mjs} +51 -13
- package/dist/taxonomy-0mCI25HN.mjs.map +1 -0
- package/dist/{tokens-BV6fgl5A.mjs → tokens-DVltpO2D.mjs} +2 -2
- package/dist/{tokens-BV6fgl5A.mjs.map → tokens-DVltpO2D.mjs.map} +1 -1
- package/dist/{transport-DTFhhPOg.mjs → transport-CKrlqSpD.mjs} +1 -1
- package/dist/{transport-DTFhhPOg.mjs.map → transport-CKrlqSpD.mjs.map} +1 -1
- package/dist/{transport-DmlmzD2U.d.mts → transport-Vd7VdqHv.d.mts} +1 -1
- package/dist/{transport-DmlmzD2U.d.mts.map → transport-Vd7VdqHv.d.mts.map} +1 -1
- package/dist/{trusted-proxy-CSgZVESw.mjs → trusted-proxy-CwjQj0YG.mjs} +1 -1
- package/dist/{trusted-proxy-CSgZVESw.mjs.map → trusted-proxy-CwjQj0YG.mjs.map} +1 -1
- package/dist/{types-B6-N9cBB.d.mts → types-B4vm81VH.d.mts} +1 -1
- package/dist/{types-B6-N9cBB.d.mts.map → types-B4vm81VH.d.mts.map} +1 -1
- package/dist/{types-Cm4Cz-8M.d.mts → types-B97jg3aW.d.mts} +6 -1
- package/dist/{types-Cm4Cz-8M.d.mts.map → types-B97jg3aW.d.mts.map} +1 -1
- package/dist/{types-BNZsPL9z.mjs → types-BD40g7zz.mjs} +1 -1
- package/dist/{types-BNZsPL9z.mjs.map → types-BD40g7zz.mjs.map} +1 -1
- package/dist/{types-QnlQIyPE.d.mts → types-BNfPHfay.d.mts} +1 -1
- package/dist/{types-QnlQIyPE.d.mts.map → types-BNfPHfay.d.mts.map} +1 -1
- package/dist/{types-DLIrNtv5.d.mts → types-BfYUPJdP.d.mts} +2 -2
- package/dist/{types-DLIrNtv5.d.mts.map → types-BfYUPJdP.d.mts.map} +1 -1
- package/dist/{types-CtDVagM4.d.mts → types-BvB7gDOD.d.mts} +38 -4
- package/dist/types-BvB7gDOD.d.mts.map +1 -0
- package/dist/{types-B_pmP7Yq.d.mts → types-C7U0HlEr.d.mts} +1 -1
- package/dist/{types-B_pmP7Yq.d.mts.map → types-C7U0HlEr.d.mts.map} +1 -1
- package/dist/{types-Ch8pFMEm.mjs → types-CrRUFdej.mjs} +3 -3
- package/dist/{types-Ch8pFMEm.mjs.map → types-CrRUFdej.mjs.map} +1 -1
- package/dist/{types-momGysZk.d.mts → types-DPKhI5ib.d.mts} +9 -1
- package/dist/types-DPKhI5ib.d.mts.map +1 -0
- package/dist/{types-BCVuUPrL.d.mts → types-Kmaxdarz.d.mts} +1 -1
- package/dist/{types-BCVuUPrL.d.mts.map → types-Kmaxdarz.d.mts.map} +1 -1
- package/dist/{types-qljd1hsL.d.mts → types-iVeZ5g6N.d.mts} +1 -1
- package/dist/{types-qljd1hsL.d.mts.map → types-iVeZ5g6N.d.mts.map} +1 -1
- package/dist/{user-DTxX_Fha.mjs → user-aTXqmXBz.mjs} +3 -3
- package/dist/{user-DTxX_Fha.mjs.map → user-aTXqmXBz.mjs.map} +1 -1
- package/dist/{utils-Cz8PVrl4.mjs → utils-BbUgmeZG.mjs} +1 -1
- package/dist/{utils-Cz8PVrl4.mjs.map → utils-BbUgmeZG.mjs.map} +1 -1
- package/dist/{validate-C3CpWlNt.mjs → validate-CDT1jl6_.mjs} +11 -6
- package/dist/validate-CDT1jl6_.mjs.map +1 -0
- package/dist/{validate-9jLuE301.d.mts → validate-DULfgpJP.d.mts} +5 -5
- package/dist/{validate-9jLuE301.d.mts.map → validate-DULfgpJP.d.mts.map} +1 -1
- package/dist/{validation-DM2K_NJC.mjs → validation-DlD0E35W.mjs} +10 -10
- package/dist/{validation-DM2K_NJC.mjs.map → validation-DlD0E35W.mjs.map} +1 -1
- package/dist/version-Ci6bw6YK.mjs +7 -0
- package/dist/{version-BlIJvNAZ.mjs.map → version-Ci6bw6YK.mjs.map} +1 -1
- package/dist/{widgets-B_X6_UXJ.mjs → widgets-5fipNkMT.mjs} +3 -3
- package/dist/{widgets-B_X6_UXJ.mjs.map → widgets-5fipNkMT.mjs.map} +1 -1
- package/dist/{wxr-taxonomies-tADW4KTa.d.mts → wxr-taxonomies-B4tMuN5T.d.mts} +1 -1
- package/dist/{wxr-taxonomies-tADW4KTa.d.mts.map → wxr-taxonomies-B4tMuN5T.d.mts.map} +1 -1
- package/dist/{wxr-taxonomies-oNJB2S81.mjs → wxr-taxonomies-BmUnBNgz.mjs} +4 -4
- package/dist/{wxr-taxonomies-oNJB2S81.mjs.map → wxr-taxonomies-BmUnBNgz.mjs.map} +1 -1
- package/dist/{zod-generator-CrfV79De.mjs → zod-generator-CwkHWz4f.mjs} +2 -2
- package/dist/{zod-generator-CrfV79De.mjs.map → zod-generator-CwkHWz4f.mjs.map} +1 -1
- package/package.json +8 -8
- package/src/api/authorize.ts +10 -1
- package/src/api/error.ts +5 -5
- package/src/api/errors.ts +14 -0
- package/src/api/handlers/backup.ts +312 -0
- package/src/api/handlers/bylines.ts +5 -4
- package/src/api/handlers/content.ts +61 -9
- package/src/api/handlers/device-flow.ts +2 -3
- package/src/api/handlers/index.ts +16 -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 +211 -2
- package/src/api/handlers/menus.ts +11 -6
- 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 +7 -2
- package/src/api/handlers/snapshot.ts +21 -3
- package/src/api/handlers/taxonomies.ts +22 -14
- package/src/api/openapi/document.ts +48 -6
- package/src/api/parse.ts +1 -15
- package/src/api/public-url.ts +4 -2
- package/src/api/schemas/bylines.ts +4 -4
- package/src/api/schemas/common.ts +13 -8
- package/src/api/schemas/media-usage.ts +72 -0
- package/src/api/schemas/media.ts +32 -1
- package/src/api/schemas/menus.ts +2 -1
- package/src/api/schemas/relations.ts +3 -1
- package/src/api/schemas/taxonomies.ts +4 -2
- package/src/astro/integration/index.ts +38 -0
- package/src/astro/integration/routes.ts +35 -0
- package/src/astro/integration/runtime.ts +6 -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.ts +86 -31
- 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/bylines/index.ts +5 -8
- 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 -4
- package/src/astro/routes/api/auth/oauth/[provider].ts +24 -6
- 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 +4 -6
- package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/parents.ts +2 -3
- 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 +43 -15
- package/src/astro/routes/api/plugins/[pluginId]/[...path].ts +17 -3
- 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 +48 -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/media.ts +127 -0
- package/src/client/index.ts +84 -2
- package/src/client/transport.ts +1 -1
- package/src/components/EmDashHead.astro +4 -8
- package/src/components/Gallery.astro +141 -26
- package/src/components/InlinePortableTextEditor.tsx +56 -35
- package/src/components/marks/Link.astro +5 -1
- package/src/config/secrets.ts +25 -19
- package/src/content/converters/gallery.ts +61 -0
- package/src/content/converters/portable-text-to-prosemirror.ts +19 -0
- package/src/content/converters/prosemirror-to-portable-text.ts +18 -0
- package/src/content/converters/types.ts +36 -0
- package/src/database/dialect-helpers.ts +80 -7
- 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 +6 -0
- package/src/database/pg-migration-lock.ts +1 -4
- package/src/database/repositories/audit.ts +2 -1
- package/src/database/repositories/content.ts +98 -16
- package/src/database/repositories/media-usage.ts +250 -1
- package/src/database/repositories/plugin-storage.ts +29 -32
- package/src/database/repositories/redirect.ts +14 -2
- package/src/database/repositories/taxonomy.ts +57 -8
- package/src/database/types.ts +23 -0
- package/src/db/adapters.ts +9 -0
- package/src/emdash-runtime.ts +365 -83
- package/src/i18n/config.ts +8 -0
- package/src/i18n/repair-locale-casing.ts +51 -0
- package/src/loader.ts +292 -1
- package/src/mcp/server.ts +222 -5
- 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 +7 -0
- package/src/plugins/define-plugin.ts +16 -0
- package/src/plugins/manifest-schema.ts +28 -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 +41 -0
- package/src/schema/registry.ts +141 -5
- package/src/search/query.ts +3 -2
- package/src/seed/apply.ts +37 -36
- package/src/seed/validate.ts +15 -4
- package/src/seo/index.ts +19 -4
- package/src/storage/types.ts +6 -0
- package/src/utils/base64.ts +7 -2
- package/src/utils/db-errors.ts +3 -1
- package/src/virtual-modules.d.ts +13 -0
- package/src/visual-editing/toolbar.ts +1 -1
- package/dist/adapters-DPAkL6QF.d.mts.map +0 -1
- package/dist/api-DVbHNApo.mjs.map +0 -1
- package/dist/api-tokens-Dk2GrJMY.mjs +0 -3
- package/dist/apply-D23iUV4q.mjs.map +0 -1
- package/dist/authorize-BmCwQCib.mjs.map +0 -1
- package/dist/base64-C74Msx8h.mjs.map +0 -1
- package/dist/bylines-BGuKFaBy.mjs.map +0 -1
- package/dist/config-CVssduLe.mjs.map +0 -1
- package/dist/content-BO61Sx4j.mjs.map +0 -1
- package/dist/content-refresh-BkkApzeS.mjs.map +0 -1
- package/dist/context-DtSFYFuS.mjs.map +0 -1
- package/dist/db-errors-BKuXh_fi.mjs.map +0 -1
- package/dist/device-flow-CPXQ_QfW.mjs.map +0 -1
- package/dist/dialect-helpers-Cue7QQOR.mjs.map +0 -1
- package/dist/error-CfJMLSkd.mjs.map +0 -1
- package/dist/index-BXOCyLj0.d.mts.map +0 -1
- package/dist/loader-Rb8QlGZp.mjs.map +0 -1
- package/dist/manifest-schema-DeGNma2O.mjs.map +0 -1
- package/dist/menus-BpfevlJD.mjs.map +0 -1
- package/dist/menus-BtvH7Z7t.mjs.map +0 -1
- package/dist/oauth-authorization-BWqWTHBK.mjs.map +0 -1
- package/dist/public-url-C0cEvrRu.mjs.map +0 -1
- package/dist/redirect-Ch3E98qZ.mjs.map +0 -1
- package/dist/redirects-CeD7K7EX.mjs.map +0 -1
- package/dist/registry-CyIXPi4E.mjs.map +0 -1
- package/dist/relations-C8hVyEy0.mjs.map +0 -1
- package/dist/relations-CbBpoOys.d.mts.map +0 -1
- package/dist/runner-jt65bF7F.mjs.map +0 -1
- package/dist/scheduled-publish-DlJHGcuL.d.mts +0 -11
- package/dist/scheduled-publish-DlJHGcuL.d.mts.map +0 -1
- package/dist/search-Cl875CVE.mjs.map +0 -1
- package/dist/secrets-CO_bEmII.mjs.map +0 -1
- package/dist/taxonomies-ClS4RKaZ.mjs.map +0 -1
- package/dist/taxonomy-BkxbUMSw.mjs.map +0 -1
- package/dist/types-CtDVagM4.d.mts.map +0 -1
- package/dist/types-momGysZk.d.mts.map +0 -1
- package/dist/validate-C3CpWlNt.mjs.map +0 -1
- package/dist/version-BlIJvNAZ.mjs +0 -7
- /package/dist/{ssrf-B5DOv5E5.mjs → ssrf-BB__xfNM.mjs} +0 -0
- /package/dist/{types-DeCZBZxn.mjs → types-CK0LxPUQ.mjs} +0 -0
package/src/api/errors.ts
CHANGED
|
@@ -70,6 +70,7 @@ export const ErrorCode = {
|
|
|
70
70
|
ORPHAN_REGISTER_ERROR: "ORPHAN_REGISTER_ERROR",
|
|
71
71
|
COLLECTION_EXISTS: "COLLECTION_EXISTS",
|
|
72
72
|
COLLECTION_NOT_FOUND: "COLLECTION_NOT_FOUND",
|
|
73
|
+
COLLECTION_SCHEMA_MISMATCH: "COLLECTION_SCHEMA_MISMATCH",
|
|
73
74
|
TABLE_NOT_FOUND: "TABLE_NOT_FOUND",
|
|
74
75
|
FIELD_EXISTS: "FIELD_EXISTS",
|
|
75
76
|
FIELD_TYPE_COLUMN_CHANGE: "FIELD_TYPE_COLUMN_CHANGE",
|
|
@@ -85,6 +86,7 @@ export const ErrorCode = {
|
|
|
85
86
|
MEDIA_CREATE_ERROR: "MEDIA_CREATE_ERROR",
|
|
86
87
|
MEDIA_UPDATE_ERROR: "MEDIA_UPDATE_ERROR",
|
|
87
88
|
MEDIA_DELETE_ERROR: "MEDIA_DELETE_ERROR",
|
|
89
|
+
MEDIA_USAGE_READ_ERROR: "MEDIA_USAGE_READ_ERROR",
|
|
88
90
|
MEDIA_USAGE_REPAIR_ERROR: "MEDIA_USAGE_REPAIR_ERROR",
|
|
89
91
|
NO_STORAGE: "NO_STORAGE",
|
|
90
92
|
NO_FILE: "NO_FILE",
|
|
@@ -189,6 +191,8 @@ export const ErrorCode = {
|
|
|
189
191
|
PLUGIN_ENABLE_ERROR: "PLUGIN_ENABLE_ERROR",
|
|
190
192
|
PLUGIN_DISABLE_ERROR: "PLUGIN_DISABLE_ERROR",
|
|
191
193
|
PLUGIN_ID_CONFLICT: "PLUGIN_ID_CONFLICT",
|
|
194
|
+
PLUGIN_SETTINGS_READ_ERROR: "PLUGIN_SETTINGS_READ_ERROR",
|
|
195
|
+
PLUGIN_SETTINGS_UPDATE_ERROR: "PLUGIN_SETTINGS_UPDATE_ERROR",
|
|
192
196
|
MARKETPLACE_NOT_CONFIGURED: "MARKETPLACE_NOT_CONFIGURED",
|
|
193
197
|
MARKETPLACE_UNAVAILABLE: "MARKETPLACE_UNAVAILABLE",
|
|
194
198
|
MARKETPLACE_ERROR: "MARKETPLACE_ERROR",
|
|
@@ -303,6 +307,15 @@ export const ErrorCode = {
|
|
|
303
307
|
EMAIL_SETTINGS_READ_ERROR: "EMAIL_SETTINGS_READ_ERROR",
|
|
304
308
|
EMAIL_TEST_ERROR: "EMAIL_TEST_ERROR",
|
|
305
309
|
|
|
310
|
+
// Backups
|
|
311
|
+
BACKUP_SETTINGS_READ_ERROR: "BACKUP_SETTINGS_READ_ERROR",
|
|
312
|
+
BACKUP_SETTINGS_ERROR: "BACKUP_SETTINGS_ERROR",
|
|
313
|
+
BACKUP_EXPORT_ERROR: "BACKUP_EXPORT_ERROR",
|
|
314
|
+
BACKUP_LIST_ERROR: "BACKUP_LIST_ERROR",
|
|
315
|
+
BACKUP_CREATE_ERROR: "BACKUP_CREATE_ERROR",
|
|
316
|
+
BACKUP_DELETE_ERROR: "BACKUP_DELETE_ERROR",
|
|
317
|
+
BACKUP_DOWNLOAD_ERROR: "BACKUP_DOWNLOAD_ERROR",
|
|
318
|
+
|
|
306
319
|
// Search
|
|
307
320
|
SEARCH_ERROR: "SEARCH_ERROR",
|
|
308
321
|
STATS_ERROR: "STATS_ERROR",
|
|
@@ -457,6 +470,7 @@ export function mapErrorStatus(code: string | undefined): number {
|
|
|
457
470
|
case ErrorCode.NO_DB:
|
|
458
471
|
case ErrorCode.STORAGE_NOT_CONFIGURED:
|
|
459
472
|
case ErrorCode.EMAIL_NOT_CONFIGURED:
|
|
473
|
+
case ErrorCode.COLLECTION_SCHEMA_MISMATCH:
|
|
460
474
|
return 500;
|
|
461
475
|
|
|
462
476
|
// 501 Not Implemented
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backup handlers — portable content backups, on demand and scheduled.
|
|
3
|
+
*
|
|
4
|
+
* A backup is the snapshot format (see `snapshot.ts`) wrapped in a small
|
|
5
|
+
* envelope: all content (including drafts, scheduled, and trashed entries),
|
|
6
|
+
* schema definitions, taxonomies, menus, widgets, revisions, media metadata,
|
|
7
|
+
* and site settings.
|
|
8
|
+
*
|
|
9
|
+
* Deliberately NOT included:
|
|
10
|
+
* - Users, sessions, credentials, API/OAuth tokens (auth data is neither
|
|
11
|
+
* portable nor safe in a user-downloadable file)
|
|
12
|
+
* - Secrets (`emdash:preview_secret`, plugin config, passkey challenges)
|
|
13
|
+
* - Media binaries (metadata only — the files live in the same bucket the
|
|
14
|
+
* scheduled archives are written to)
|
|
15
|
+
*
|
|
16
|
+
* For full point-in-time database recovery on Cloudflare, D1 Time Travel
|
|
17
|
+
* covers the last 30 days out of the box; these backups complement it with
|
|
18
|
+
* user-holdable, longer-lived archives.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import type { Kysely } from "kysely";
|
|
22
|
+
|
|
23
|
+
import { OptionsRepository } from "../../database/repositories/options.js";
|
|
24
|
+
import type { Database } from "../../database/types.js";
|
|
25
|
+
import type { Storage } from "../../storage/types.js";
|
|
26
|
+
import { VERSION } from "../../version.js";
|
|
27
|
+
import { ErrorCode } from "../errors.js";
|
|
28
|
+
import type { ApiResult } from "../types.js";
|
|
29
|
+
import { generateSnapshot } from "./snapshot.js";
|
|
30
|
+
|
|
31
|
+
// ── Constants ───────────────────────────────────────────────────
|
|
32
|
+
|
|
33
|
+
/** Storage key prefix for scheduled/manual archives. */
|
|
34
|
+
export const BACKUP_STORAGE_PREFIX = "backups/";
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Filename prefix within the backups/ folder. Included in the list() prefix
|
|
38
|
+
* so LocalStorage (which matches directory + filename prefix, not flat keys
|
|
39
|
+
* like S3/R2) finds the archives too.
|
|
40
|
+
*/
|
|
41
|
+
const BACKUP_FILE_PREFIX = "emdash-backup-";
|
|
42
|
+
|
|
43
|
+
/** Options key holding the scheduled-backup settings. */
|
|
44
|
+
export const BACKUP_SETTINGS_KEY = "emdash:backups";
|
|
45
|
+
|
|
46
|
+
/** Options key holding the ISO timestamp of the last scheduled run. */
|
|
47
|
+
const BACKUP_LAST_RUN_KEY = "emdash:backups_last_run";
|
|
48
|
+
|
|
49
|
+
/** Minimum interval between scheduled backups (23h — daily with cron jitter). */
|
|
50
|
+
const SCHEDULED_BACKUP_INTERVAL_MS = 23 * 60 * 60 * 1000;
|
|
51
|
+
|
|
52
|
+
/** Retention bounds for stored archives. */
|
|
53
|
+
export const BACKUP_RETENTION_MIN = 1;
|
|
54
|
+
export const BACKUP_RETENTION_MAX = 30;
|
|
55
|
+
const BACKUP_RETENTION_DEFAULT = 7;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Options-table key prefixes included in backups. Site settings plus the
|
|
59
|
+
* site-identity keys (`emdash:site_title`, `emdash:site_tagline`,
|
|
60
|
+
* `emdash:site_url`). Never widen this to a prefix that can match secrets
|
|
61
|
+
* (`emdash:preview_secret`, `plugin:`, `emdash:passkey_pending:`).
|
|
62
|
+
*/
|
|
63
|
+
const BACKUP_OPTION_PREFIXES = ["site:", "emdash:site_", "emdash:locale"];
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Archive filename shape. Strict allowlist — the download/delete routes
|
|
67
|
+
* interpolate this into a storage key, so it must never contain `/` or `..`.
|
|
68
|
+
* The random suffix makes names unguessable (defense in depth on top of the
|
|
69
|
+
* media route's backups/ deny) and avoids same-second collisions.
|
|
70
|
+
*/
|
|
71
|
+
const ARCHIVE_NAME_PATTERN =
|
|
72
|
+
/^emdash-backup-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-[0-9a-f]{8}\.json$/;
|
|
73
|
+
|
|
74
|
+
export function isValidArchiveName(name: string): boolean {
|
|
75
|
+
return ARCHIVE_NAME_PATTERN.test(name);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// ── Types ───────────────────────────────────────────────────────
|
|
79
|
+
|
|
80
|
+
export interface BackupSettings {
|
|
81
|
+
/** Whether daily scheduled backups to storage are enabled. */
|
|
82
|
+
enabled: boolean;
|
|
83
|
+
/** How many archives to keep in storage (oldest pruned first). */
|
|
84
|
+
retention: number;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export interface BackupArchive {
|
|
88
|
+
/** Filename within the backups/ prefix (no path separators). */
|
|
89
|
+
name: string;
|
|
90
|
+
/** Size in bytes. */
|
|
91
|
+
size: number;
|
|
92
|
+
/** Last-modified timestamp (ISO). */
|
|
93
|
+
lastModified: string;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const DEFAULT_SETTINGS: BackupSettings = {
|
|
97
|
+
enabled: false,
|
|
98
|
+
retention: BACKUP_RETENTION_DEFAULT,
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
function clampRetention(value: number): number {
|
|
102
|
+
if (!Number.isFinite(value)) return BACKUP_RETENTION_DEFAULT;
|
|
103
|
+
return Math.min(BACKUP_RETENTION_MAX, Math.max(BACKUP_RETENTION_MIN, Math.trunc(value)));
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// ── Export ──────────────────────────────────────────────────────
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Generate a full content backup as a JSON string.
|
|
110
|
+
*
|
|
111
|
+
* ponytail: the whole backup is materialized in memory. Fine for the sites
|
|
112
|
+
* EmDash targets today; truly huge databases should use `wrangler d1 export`
|
|
113
|
+
* (documented on the backups docs page). Upgrade path: stream table-by-table.
|
|
114
|
+
*/
|
|
115
|
+
export async function generateBackupJson(db: Kysely<Database>): Promise<string> {
|
|
116
|
+
const snapshot = await generateSnapshot(db, {
|
|
117
|
+
includeDrafts: true,
|
|
118
|
+
includeTrashed: true,
|
|
119
|
+
optionPrefixes: BACKUP_OPTION_PREFIXES,
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
return JSON.stringify({
|
|
123
|
+
format: "emdash-backup",
|
|
124
|
+
formatVersion: 1,
|
|
125
|
+
emdashVersion: VERSION,
|
|
126
|
+
generatedAt: snapshot.generatedAt,
|
|
127
|
+
schema: snapshot.schema,
|
|
128
|
+
tables: snapshot.tables,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Derive the archive filename for a given date (plus a random suffix). */
|
|
133
|
+
export function archiveNameForDate(date: Date): string {
|
|
134
|
+
// 2026-07-09T08:45:12.345Z → emdash-backup-2026-07-09T08-45-12-1a2b3c4d.json
|
|
135
|
+
const stamp = date.toISOString().slice(0, 19).replaceAll(":", "-");
|
|
136
|
+
const suffix = crypto.randomUUID().replaceAll("-", "").slice(0, 8);
|
|
137
|
+
return `emdash-backup-${stamp}-${suffix}.json`;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// ── Settings ────────────────────────────────────────────────────
|
|
141
|
+
|
|
142
|
+
export async function getBackupSettings(db: Kysely<Database>): Promise<BackupSettings> {
|
|
143
|
+
const options = new OptionsRepository(db);
|
|
144
|
+
const stored = await options.get<Partial<BackupSettings>>(BACKUP_SETTINGS_KEY);
|
|
145
|
+
if (!stored) return { ...DEFAULT_SETTINGS };
|
|
146
|
+
return {
|
|
147
|
+
enabled: stored.enabled === true,
|
|
148
|
+
retention: clampRetention(stored.retention ?? BACKUP_RETENTION_DEFAULT),
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export async function updateBackupSettings(
|
|
153
|
+
db: Kysely<Database>,
|
|
154
|
+
input: { enabled: boolean; retention: number },
|
|
155
|
+
): Promise<ApiResult<BackupSettings>> {
|
|
156
|
+
try {
|
|
157
|
+
const settings: BackupSettings = {
|
|
158
|
+
enabled: input.enabled,
|
|
159
|
+
retention: clampRetention(input.retention),
|
|
160
|
+
};
|
|
161
|
+
const options = new OptionsRepository(db);
|
|
162
|
+
await options.set(BACKUP_SETTINGS_KEY, settings);
|
|
163
|
+
return { success: true, data: settings };
|
|
164
|
+
} catch (error) {
|
|
165
|
+
console.error("[backup] Failed to update settings:", error);
|
|
166
|
+
return {
|
|
167
|
+
success: false,
|
|
168
|
+
error: { code: ErrorCode.BACKUP_SETTINGS_ERROR, message: "Failed to update backup settings" },
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// ── Archives in storage ─────────────────────────────────────────
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* List stored archives, newest first.
|
|
177
|
+
*
|
|
178
|
+
* ponytail: single unpaginated list. The retention cap (max 30) bounds the
|
|
179
|
+
* archive count, so one page always suffices.
|
|
180
|
+
*/
|
|
181
|
+
export async function listBackupArchives(storage: Storage): Promise<ApiResult<BackupArchive[]>> {
|
|
182
|
+
try {
|
|
183
|
+
const result = await storage.list({
|
|
184
|
+
prefix: `${BACKUP_STORAGE_PREFIX}${BACKUP_FILE_PREFIX}`,
|
|
185
|
+
limit: 100,
|
|
186
|
+
});
|
|
187
|
+
const archives = result.files
|
|
188
|
+
.map((file) => ({
|
|
189
|
+
name: file.key.slice(BACKUP_STORAGE_PREFIX.length),
|
|
190
|
+
size: file.size,
|
|
191
|
+
lastModified: file.lastModified.toISOString(),
|
|
192
|
+
}))
|
|
193
|
+
.filter((archive) => isValidArchiveName(archive.name))
|
|
194
|
+
.toSorted((a, b) => (a.name < b.name ? 1 : -1));
|
|
195
|
+
return { success: true, data: archives };
|
|
196
|
+
} catch (error) {
|
|
197
|
+
console.error("[backup] Failed to list archives:", error);
|
|
198
|
+
return {
|
|
199
|
+
success: false,
|
|
200
|
+
error: { code: ErrorCode.BACKUP_LIST_ERROR, message: "Failed to list backup archives" },
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Create a backup and store it as an archive, then prune old archives
|
|
207
|
+
* beyond `retention`.
|
|
208
|
+
*/
|
|
209
|
+
export async function runBackupToStorage(
|
|
210
|
+
db: Kysely<Database>,
|
|
211
|
+
storage: Storage,
|
|
212
|
+
retention: number,
|
|
213
|
+
): Promise<ApiResult<BackupArchive>> {
|
|
214
|
+
try {
|
|
215
|
+
const json = await generateBackupJson(db);
|
|
216
|
+
const name = archiveNameForDate(new Date());
|
|
217
|
+
const body = new TextEncoder().encode(json);
|
|
218
|
+
|
|
219
|
+
await storage.upload({
|
|
220
|
+
key: `${BACKUP_STORAGE_PREFIX}${name}`,
|
|
221
|
+
body,
|
|
222
|
+
contentType: "application/json",
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
await pruneArchives(storage, clampRetention(retention));
|
|
226
|
+
|
|
227
|
+
return {
|
|
228
|
+
success: true,
|
|
229
|
+
data: { name, size: body.byteLength, lastModified: new Date().toISOString() },
|
|
230
|
+
};
|
|
231
|
+
} catch (error) {
|
|
232
|
+
console.error("[backup] Failed to create archive:", error);
|
|
233
|
+
return {
|
|
234
|
+
success: false,
|
|
235
|
+
error: { code: ErrorCode.BACKUP_CREATE_ERROR, message: "Failed to create backup archive" },
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/** Delete archives beyond the newest `keep`. Failures are logged, not fatal. */
|
|
241
|
+
async function pruneArchives(storage: Storage, keep: number): Promise<void> {
|
|
242
|
+
const listed = await listBackupArchives(storage);
|
|
243
|
+
if (!listed.success) return;
|
|
244
|
+
|
|
245
|
+
for (const archive of listed.data.slice(keep)) {
|
|
246
|
+
try {
|
|
247
|
+
await storage.delete(`${BACKUP_STORAGE_PREFIX}${archive.name}`);
|
|
248
|
+
} catch (error) {
|
|
249
|
+
console.error(`[backup] Failed to prune archive ${archive.name}:`, error);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
export async function deleteBackupArchive(
|
|
255
|
+
storage: Storage,
|
|
256
|
+
name: string,
|
|
257
|
+
): Promise<ApiResult<{ deleted: true }>> {
|
|
258
|
+
if (!isValidArchiveName(name)) {
|
|
259
|
+
return {
|
|
260
|
+
success: false,
|
|
261
|
+
error: { code: ErrorCode.VALIDATION_ERROR, message: "Invalid archive name" },
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
try {
|
|
265
|
+
await storage.delete(`${BACKUP_STORAGE_PREFIX}${name}`);
|
|
266
|
+
return { success: true, data: { deleted: true } };
|
|
267
|
+
} catch (error) {
|
|
268
|
+
console.error(`[backup] Failed to delete archive ${name}:`, error);
|
|
269
|
+
return {
|
|
270
|
+
success: false,
|
|
271
|
+
error: { code: ErrorCode.BACKUP_DELETE_ERROR, message: "Failed to delete backup archive" },
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// ── Scheduled runs ──────────────────────────────────────────────
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Run a scheduled backup if enabled and due. Called from the maintenance
|
|
280
|
+
* tick alongside scheduled publishing and system cleanup — never from a
|
|
281
|
+
* request. Never throws.
|
|
282
|
+
*
|
|
283
|
+
* ponytail: last-run bookkeeping is a plain read-then-write, so two isolates
|
|
284
|
+
* ticking simultaneously could both back up. Worst case is a duplicate
|
|
285
|
+
* archive that retention prunes; not worth a lock.
|
|
286
|
+
*/
|
|
287
|
+
export async function maybeRunScheduledBackup(
|
|
288
|
+
db: Kysely<Database>,
|
|
289
|
+
storage: Storage | undefined,
|
|
290
|
+
): Promise<void> {
|
|
291
|
+
try {
|
|
292
|
+
if (!storage) return;
|
|
293
|
+
|
|
294
|
+
const settings = await getBackupSettings(db);
|
|
295
|
+
if (!settings.enabled) return;
|
|
296
|
+
|
|
297
|
+
const options = new OptionsRepository(db);
|
|
298
|
+
const lastRun = await options.get<string>(BACKUP_LAST_RUN_KEY);
|
|
299
|
+
if (lastRun) {
|
|
300
|
+
const elapsed = Date.now() - Date.parse(lastRun);
|
|
301
|
+
if (Number.isFinite(elapsed) && elapsed < SCHEDULED_BACKUP_INTERVAL_MS) return;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
const result = await runBackupToStorage(db, storage, settings.retention);
|
|
305
|
+
if (result.success) {
|
|
306
|
+
await options.set(BACKUP_LAST_RUN_KEY, new Date().toISOString());
|
|
307
|
+
console.log(`[backup] Scheduled backup stored: ${result.data.name}`);
|
|
308
|
+
}
|
|
309
|
+
} catch (error) {
|
|
310
|
+
console.error("[backup] Scheduled backup failed:", error);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
} from "../../database/repositories/byline.js";
|
|
8
8
|
import { EmDashValidationError, type BylineSummary } from "../../database/repositories/types.js";
|
|
9
9
|
import type { Database } from "../../database/types.js";
|
|
10
|
-
import { getI18nConfig } from "../../i18n/config.js";
|
|
10
|
+
import { getI18nConfig, resolveConfiguredLocale } from "../../i18n/config.js";
|
|
11
11
|
import type { ApiResult } from "../types.js";
|
|
12
12
|
|
|
13
13
|
// `undefined → null` so a missing field in the create payload matches the
|
|
@@ -138,7 +138,8 @@ export async function handleBylineCreate(
|
|
|
138
138
|
};
|
|
139
139
|
}
|
|
140
140
|
|
|
141
|
-
const
|
|
141
|
+
const locale = input.locale ? resolveConfiguredLocale(input.locale) : undefined;
|
|
142
|
+
const localeErr = rejectUnknownLocale(locale);
|
|
142
143
|
if (localeErr) return localeErr;
|
|
143
144
|
|
|
144
145
|
const repo = new BylineRepository(db);
|
|
@@ -160,7 +161,7 @@ export async function handleBylineCreate(
|
|
|
160
161
|
sourceGroup = source.translationGroup ?? source.id;
|
|
161
162
|
}
|
|
162
163
|
|
|
163
|
-
const effectiveLocale =
|
|
164
|
+
const effectiveLocale = locale ?? getI18nConfig()?.defaultLocale ?? "en";
|
|
164
165
|
|
|
165
166
|
// Translation-group guard: the row-per-locale model (PR #916)
|
|
166
167
|
// allows exactly one row per (translation_group, locale). Reject
|
|
@@ -216,7 +217,7 @@ export async function handleBylineCreate(
|
|
|
216
217
|
};
|
|
217
218
|
}
|
|
218
219
|
|
|
219
|
-
const byline = await repo.create(input);
|
|
220
|
+
const byline = await repo.create({ ...input, locale: effectiveLocale });
|
|
220
221
|
return { success: true, data: byline };
|
|
221
222
|
} catch (error) {
|
|
222
223
|
// Mirror handleBylineUpdate: surface customFields validation
|
|
@@ -30,11 +30,11 @@ import { UserRepository } from "../../database/repositories/user.js";
|
|
|
30
30
|
import { withTransaction } from "../../database/transaction.js";
|
|
31
31
|
import type { Database } from "../../database/types.js";
|
|
32
32
|
import { validateIdentifier } from "../../database/validate.js";
|
|
33
|
-
import { getI18nConfig, isI18nEnabled } from "../../i18n/config.js";
|
|
33
|
+
import { getI18nConfig, isI18nEnabled, resolveConfiguredLocale } from "../../i18n/config.js";
|
|
34
34
|
import { invalidateRedirectCache } from "../../redirects/cache.js";
|
|
35
35
|
import { FTSManager } from "../../search/fts-manager.js";
|
|
36
36
|
import { invalidateTermCache } from "../../taxonomies/index.js";
|
|
37
|
-
import { isMissingTableError } from "../../utils/db-errors.js";
|
|
37
|
+
import { isMissingColumnError, isMissingTableError } from "../../utils/db-errors.js";
|
|
38
38
|
import { encodeRev, validateRev } from "../rev.js";
|
|
39
39
|
import type { ApiResult, ContentListResponse, ContentResponse } from "../types.js";
|
|
40
40
|
import { validateMediaFields } from "./validate-media-fields.js";
|
|
@@ -269,7 +269,11 @@ async function resolveId(
|
|
|
269
269
|
identifier: string,
|
|
270
270
|
locale?: string,
|
|
271
271
|
): Promise<string | null> {
|
|
272
|
-
const item = await repo.findByIdOrSlug(
|
|
272
|
+
const item = await repo.findByIdOrSlug(
|
|
273
|
+
collection,
|
|
274
|
+
identifier,
|
|
275
|
+
locale ? resolveConfiguredLocale(locale) : undefined,
|
|
276
|
+
);
|
|
273
277
|
return item?.id ?? null;
|
|
274
278
|
}
|
|
275
279
|
|
|
@@ -283,7 +287,11 @@ async function resolveIdIncludingTrashed(
|
|
|
283
287
|
identifier: string,
|
|
284
288
|
locale?: string,
|
|
285
289
|
): Promise<string | null> {
|
|
286
|
-
const item = await repo.findByIdOrSlugIncludingTrashed(
|
|
290
|
+
const item = await repo.findByIdOrSlugIncludingTrashed(
|
|
291
|
+
collection,
|
|
292
|
+
identifier,
|
|
293
|
+
locale ? resolveConfiguredLocale(locale) : undefined,
|
|
294
|
+
);
|
|
287
295
|
return item?.id ?? null;
|
|
288
296
|
}
|
|
289
297
|
|
|
@@ -427,7 +435,7 @@ export async function handleContentList(
|
|
|
427
435
|
const repo = new ContentRepository(db);
|
|
428
436
|
const where: FindManyOptions["where"] = {};
|
|
429
437
|
if (params.status) where.status = params.status;
|
|
430
|
-
if (params.locale) where.locale = params.locale;
|
|
438
|
+
if (params.locale) where.locale = resolveConfiguredLocale(params.locale);
|
|
431
439
|
if (params.authorId) where.authorId = params.authorId;
|
|
432
440
|
|
|
433
441
|
// A date range requires a target column; ignore stray from/to without
|
|
@@ -485,6 +493,15 @@ export async function handleContentList(
|
|
|
485
493
|
},
|
|
486
494
|
};
|
|
487
495
|
}
|
|
496
|
+
if (isMissingColumnError(error, "deleted_at")) {
|
|
497
|
+
return {
|
|
498
|
+
success: false,
|
|
499
|
+
error: {
|
|
500
|
+
code: "COLLECTION_SCHEMA_MISMATCH",
|
|
501
|
+
message: `Collection '${collection}' backing table is missing the 'deleted_at' column`,
|
|
502
|
+
},
|
|
503
|
+
};
|
|
504
|
+
}
|
|
488
505
|
if (error instanceof EmDashValidationError) {
|
|
489
506
|
// e.g. invalid orderBy field
|
|
490
507
|
return {
|
|
@@ -570,7 +587,11 @@ export async function handleContentGet(
|
|
|
570
587
|
): Promise<ApiResult<ContentResponse>> {
|
|
571
588
|
try {
|
|
572
589
|
const repo = new ContentRepository(db);
|
|
573
|
-
const item = await repo.findByIdOrSlug(
|
|
590
|
+
const item = await repo.findByIdOrSlug(
|
|
591
|
+
collection,
|
|
592
|
+
id,
|
|
593
|
+
locale ? resolveConfiguredLocale(locale) : undefined,
|
|
594
|
+
);
|
|
574
595
|
|
|
575
596
|
if (!item) {
|
|
576
597
|
return {
|
|
@@ -615,7 +636,11 @@ export async function handleContentGetIncludingTrashed(
|
|
|
615
636
|
): Promise<ApiResult<ContentResponse>> {
|
|
616
637
|
try {
|
|
617
638
|
const repo = new ContentRepository(db);
|
|
618
|
-
const item = await repo.findByIdOrSlugIncludingTrashed(
|
|
639
|
+
const item = await repo.findByIdOrSlugIncludingTrashed(
|
|
640
|
+
collection,
|
|
641
|
+
id,
|
|
642
|
+
locale ? resolveConfiguredLocale(locale) : undefined,
|
|
643
|
+
);
|
|
619
644
|
|
|
620
645
|
if (!item) {
|
|
621
646
|
return {
|
|
@@ -697,7 +722,9 @@ export async function handleContentCreate(
|
|
|
697
722
|
// Default to the configured site locale rather than the repo's
|
|
698
723
|
// hard-coded "en" — otherwise non-English default-locale sites
|
|
699
724
|
// silently create entries in a locale the editor never chose.
|
|
700
|
-
const effectiveLocale = body.locale
|
|
725
|
+
const effectiveLocale = body.locale
|
|
726
|
+
? resolveConfiguredLocale(body.locale)
|
|
727
|
+
: getI18nConfig()?.defaultLocale;
|
|
701
728
|
|
|
702
729
|
let slug: string | null | undefined = body.slug;
|
|
703
730
|
if (!slug) {
|
|
@@ -1487,14 +1514,39 @@ export async function handleContentPublish(
|
|
|
1487
1514
|
};
|
|
1488
1515
|
}
|
|
1489
1516
|
if (error instanceof EmDashValidationError) {
|
|
1517
|
+
// The staged-slug pre-check tags its error so it maps to the same
|
|
1518
|
+
// 409 SLUG_CONFLICT as direct slug edits in create/update.
|
|
1519
|
+
const details: unknown = error.details;
|
|
1520
|
+
const isSlugConflict =
|
|
1521
|
+
typeof details === "object" &&
|
|
1522
|
+
details !== null &&
|
|
1523
|
+
"code" in details &&
|
|
1524
|
+
details.code === "SLUG_CONFLICT";
|
|
1490
1525
|
return {
|
|
1491
1526
|
success: false,
|
|
1492
1527
|
error: {
|
|
1493
|
-
code: "VALIDATION_ERROR",
|
|
1528
|
+
code: isSlugConflict ? "SLUG_CONFLICT" : "VALIDATION_ERROR",
|
|
1494
1529
|
message: error.message,
|
|
1495
1530
|
},
|
|
1496
1531
|
};
|
|
1497
1532
|
}
|
|
1533
|
+
// Backstop for the pre-check inside repo.publish(): a concurrent write
|
|
1534
|
+
// can still take the slug between the check and the UPDATE, in which
|
|
1535
|
+
// case the `(slug, locale)` unique constraint fires. Same fingerprint
|
|
1536
|
+
// mapping as create/update — never a raw SQLite error to the client.
|
|
1537
|
+
const message = error instanceof Error ? error.message.toLowerCase() : "";
|
|
1538
|
+
if (
|
|
1539
|
+
(message.includes("unique constraint failed") || message.includes("duplicate key")) &&
|
|
1540
|
+
message.includes("slug")
|
|
1541
|
+
) {
|
|
1542
|
+
return {
|
|
1543
|
+
success: false,
|
|
1544
|
+
error: {
|
|
1545
|
+
code: "SLUG_CONFLICT",
|
|
1546
|
+
message: `The staged slug is already used by another entry in collection '${collection}'`,
|
|
1547
|
+
},
|
|
1548
|
+
};
|
|
1549
|
+
}
|
|
1498
1550
|
console.error("Content publish error:", error);
|
|
1499
1551
|
return {
|
|
1500
1552
|
success: false,
|
|
@@ -17,8 +17,8 @@ import type { Kysely } from "kysely";
|
|
|
17
17
|
import {
|
|
18
18
|
generatePrefixedToken,
|
|
19
19
|
hashApiToken,
|
|
20
|
+
isValidScope,
|
|
20
21
|
TOKEN_PREFIXES,
|
|
21
|
-
VALID_SCOPES,
|
|
22
22
|
} from "../../auth/api-tokens.js";
|
|
23
23
|
import { withTransaction } from "../../database/transaction.js";
|
|
24
24
|
import type { Database } from "../../database/types.js";
|
|
@@ -112,8 +112,7 @@ function normalizeScopes(requested?: string[]): string[] {
|
|
|
112
112
|
if (!requested || requested.length === 0) {
|
|
113
113
|
return [...DEFAULT_SCOPES];
|
|
114
114
|
}
|
|
115
|
-
|
|
116
|
-
return requested.filter((s) => validSet.has(s));
|
|
115
|
+
return requested.filter(isValidScope);
|
|
117
116
|
}
|
|
118
117
|
|
|
119
118
|
// ---------------------------------------------------------------------------
|
|
@@ -62,9 +62,19 @@ export {
|
|
|
62
62
|
} from "./media.js";
|
|
63
63
|
|
|
64
64
|
export {
|
|
65
|
+
aggregateMediaUsageCoverageStatus,
|
|
66
|
+
handleMediaUsageDetails,
|
|
67
|
+
handleMediaUsageSummaries,
|
|
65
68
|
handleMediaUsageRepair,
|
|
66
69
|
toMediaUsageRepairResponse,
|
|
70
|
+
type MediaUsageCoverage,
|
|
71
|
+
type MediaUsageCoverageStatus,
|
|
72
|
+
type MediaUsageDetailsResponse,
|
|
73
|
+
type MediaUsageEntryDetail,
|
|
74
|
+
type MediaUsageOccurrenceDetail,
|
|
67
75
|
type MediaUsageRepairResponse,
|
|
76
|
+
type MediaUsageSourceDetail,
|
|
77
|
+
type MediaUsageSummary,
|
|
68
78
|
} from "./media-usage.js";
|
|
69
79
|
|
|
70
80
|
// Schema handlers
|
|
@@ -109,6 +119,12 @@ export {
|
|
|
109
119
|
type PluginListResponse,
|
|
110
120
|
type PluginResponse,
|
|
111
121
|
} from "./plugins.js";
|
|
122
|
+
export {
|
|
123
|
+
handlePluginSettingsGet,
|
|
124
|
+
handlePluginSettingsUpdate,
|
|
125
|
+
getPluginSettingsSchema,
|
|
126
|
+
type PluginSettingsResponse,
|
|
127
|
+
} from "./plugin-settings.js";
|
|
112
128
|
|
|
113
129
|
// Menu handlers
|
|
114
130
|
export {
|
|
@@ -328,6 +328,7 @@ export async function handleMarketplaceInstall(
|
|
|
328
328
|
* Skip the SANDBOX_NOT_AVAILABLE gate so the install can proceed.
|
|
329
329
|
*/
|
|
330
330
|
sandboxBypassed?: boolean;
|
|
331
|
+
confirmMcpTools?: boolean;
|
|
331
332
|
},
|
|
332
333
|
): Promise<ApiResult<MarketplaceInstallResult>> {
|
|
333
334
|
const client = getClient(marketplaceUrl, opts?.siteOrigin);
|
|
@@ -448,6 +449,21 @@ export async function handleMarketplaceInstall(
|
|
|
448
449
|
const bundleIdentityError = validateBundleIdentity(bundle, pluginId, version);
|
|
449
450
|
if (bundleIdentityError) return bundleIdentityError;
|
|
450
451
|
|
|
452
|
+
if ((bundle.manifest.mcp?.tools.length ?? 0) > 0 && !opts?.confirmMcpTools) {
|
|
453
|
+
return {
|
|
454
|
+
success: false,
|
|
455
|
+
error: {
|
|
456
|
+
code: "MCP_TOOL_CONSENT_REQUIRED",
|
|
457
|
+
message: "Plugin MCP tools require explicit consent",
|
|
458
|
+
details: {
|
|
459
|
+
mcpTools: bundle.manifest.mcp?.tools.map(
|
|
460
|
+
({ inputSchema: _, outputSchema: __, ...tool }) => tool,
|
|
461
|
+
),
|
|
462
|
+
},
|
|
463
|
+
},
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
|
|
451
467
|
// Store bundle in site-local R2
|
|
452
468
|
await storeBundleInR2(storage, pluginId, version, bundle);
|
|
453
469
|
|
|
@@ -534,6 +550,7 @@ export async function handleMarketplaceUpdate(
|
|
|
534
550
|
version?: string;
|
|
535
551
|
confirmCapabilityChanges?: boolean;
|
|
536
552
|
confirmRouteVisibilityChanges?: boolean;
|
|
553
|
+
confirmMcpTools?: boolean;
|
|
537
554
|
/**
|
|
538
555
|
* When true, sandbox: false bypass mode is active. The sandbox runner
|
|
539
556
|
* is the noop runner (isAvailable() === false) but the runtime will
|
|
@@ -664,6 +681,25 @@ export async function handleMarketplaceUpdate(
|
|
|
664
681
|
};
|
|
665
682
|
}
|
|
666
683
|
|
|
684
|
+
const oldMcpTools = [...(oldBundle?.manifest.mcp?.tools ?? [])].toSorted((a, b) =>
|
|
685
|
+
a.name.localeCompare(b.name),
|
|
686
|
+
);
|
|
687
|
+
const newMcpTools = [...(bundle.manifest.mcp?.tools ?? [])].toSorted((a, b) =>
|
|
688
|
+
a.name.localeCompare(b.name),
|
|
689
|
+
);
|
|
690
|
+
if (JSON.stringify(oldMcpTools) !== JSON.stringify(newMcpTools) && !opts?.confirmMcpTools) {
|
|
691
|
+
return {
|
|
692
|
+
success: false,
|
|
693
|
+
error: {
|
|
694
|
+
code: "MCP_TOOL_CONSENT_REQUIRED",
|
|
695
|
+
message: "Plugin update changes its MCP tools",
|
|
696
|
+
details: {
|
|
697
|
+
mcpTools: newMcpTools.map(({ inputSchema: _, outputSchema: __, ...tool }) => tool),
|
|
698
|
+
},
|
|
699
|
+
},
|
|
700
|
+
};
|
|
701
|
+
}
|
|
702
|
+
|
|
667
703
|
// Store new bundle
|
|
668
704
|
await storeBundleInR2(storage, pluginId, newVersion, bundle);
|
|
669
705
|
|
|
@@ -673,6 +709,8 @@ export async function handleMarketplaceUpdate(
|
|
|
673
709
|
marketplaceVersion: newVersion,
|
|
674
710
|
displayName: pluginDetail.name,
|
|
675
711
|
description: pluginDetail.description ?? undefined,
|
|
712
|
+
mcpToolsEnabled: false,
|
|
713
|
+
mcpToolsConsent: null,
|
|
676
714
|
});
|
|
677
715
|
|
|
678
716
|
// Clean up old bundle from R2 (best-effort)
|