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
|
@@ -8,8 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
import type { Kysely } from "kysely";
|
|
10
10
|
|
|
11
|
-
import {
|
|
12
|
-
import { validateJsonFieldName } from "../database/validate.js";
|
|
11
|
+
import { pluginDataExtractExpr, pluginDataOrderExpr } from "../database/dialect-helpers.js";
|
|
13
12
|
import type { WhereClause, WhereValue, RangeFilter, InFilter, StartsWithFilter } from "./types.js";
|
|
14
13
|
|
|
15
14
|
/**
|
|
@@ -50,6 +49,15 @@ export function isStartsWithFilter(value: WhereValue): value is StartsWithFilter
|
|
|
50
49
|
return "startsWith" in value && typeof value.startsWith === "string";
|
|
51
50
|
}
|
|
52
51
|
|
|
52
|
+
/**
|
|
53
|
+
* Escape LIKE pattern metacharacters so a startsWith prefix matches
|
|
54
|
+
* literally. Without this, `%` and `_` in the prefix act as wildcards
|
|
55
|
+
* (e.g. `{ startsWith: "50%" }` would match "50x off").
|
|
56
|
+
*/
|
|
57
|
+
export function escapeLikePattern(value: string): string {
|
|
58
|
+
return value.replaceAll("\\", "\\\\").replaceAll("%", "\\%").replaceAll("_", "\\_");
|
|
59
|
+
}
|
|
60
|
+
|
|
53
61
|
/**
|
|
54
62
|
* Get the set of indexed fields from index declarations
|
|
55
63
|
*/
|
|
@@ -108,15 +116,34 @@ export function validateOrderByClause(
|
|
|
108
116
|
}
|
|
109
117
|
|
|
110
118
|
/**
|
|
111
|
-
* SQL expression for extracting
|
|
119
|
+
* SQL expression for extracting a queryable field from the `_plugin_storage.data`
|
|
120
|
+
* column.
|
|
112
121
|
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
122
|
+
* Delegates to `pluginDataExtractExpr`, which validates the field name before
|
|
123
|
+
* interpolation and applies the dialect-correct extraction: a `::jsonb` cast on
|
|
124
|
+
* Postgres (the `data` column is `text`) plus an optional type-guarded
|
|
125
|
+
* `::numeric` cast so numeric comparisons don't fall back to lexical text
|
|
126
|
+
* ordering.
|
|
115
127
|
*/
|
|
116
128
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Kysely instance
|
|
117
|
-
export function jsonExtract(
|
|
118
|
-
|
|
119
|
-
|
|
129
|
+
export function jsonExtract(
|
|
130
|
+
db: Kysely<any>,
|
|
131
|
+
field: string,
|
|
132
|
+
options?: { numeric?: boolean },
|
|
133
|
+
): string {
|
|
134
|
+
return pluginDataExtractExpr(db, field, options);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* SQL expression for ordering by a `_plugin_storage.data` field.
|
|
139
|
+
*
|
|
140
|
+
* Delegates to `pluginDataOrderExpr`, which orders over the jsonb-native value
|
|
141
|
+
* on Postgres so numeric fields sort numerically (not lexically) while staying
|
|
142
|
+
* total across heterogeneous data. SQLite keeps `json_extract` (already numeric).
|
|
143
|
+
*/
|
|
144
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Kysely instance
|
|
145
|
+
export function jsonOrderExtract(db: Kysely<any>, field: string): string {
|
|
146
|
+
return pluginDataOrderExpr(db, field);
|
|
120
147
|
}
|
|
121
148
|
|
|
122
149
|
/**
|
|
@@ -128,33 +155,45 @@ export function buildCondition(
|
|
|
128
155
|
field: string,
|
|
129
156
|
value: WhereValue,
|
|
130
157
|
): { sql: string; params: unknown[] } {
|
|
131
|
-
|
|
158
|
+
// Numeric-vs-text is decided per condition from the JS type of the bound
|
|
159
|
+
// value. On Postgres a text extract compared to a bound number would sort
|
|
160
|
+
// lexically (`'9' >= '10'` is TRUE); a type-guarded `::numeric` cast on the
|
|
161
|
+
// extract fixes it. String/boolean operands keep text comparison. SQLite is
|
|
162
|
+
// unaffected — `json_extract` already returns a typed value.
|
|
163
|
+
const extractFor = (numeric: boolean): string => jsonExtract(db, field, { numeric });
|
|
132
164
|
|
|
133
165
|
if (value === null) {
|
|
134
|
-
return { sql: `${
|
|
166
|
+
return { sql: `${extractFor(false)} IS NULL`, params: [] };
|
|
135
167
|
}
|
|
136
168
|
|
|
137
|
-
if (typeof value === "
|
|
138
|
-
return { sql: `${
|
|
169
|
+
if (typeof value === "number") {
|
|
170
|
+
return { sql: `${extractFor(true)} = ?`, params: [value] };
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (typeof value === "string") {
|
|
174
|
+
return { sql: `${extractFor(false)} = ?`, params: [value] };
|
|
139
175
|
}
|
|
140
176
|
|
|
141
177
|
if (typeof value === "boolean") {
|
|
142
178
|
// JSON booleans are stored as true/false strings
|
|
143
|
-
return { sql: `${
|
|
179
|
+
return { sql: `${extractFor(false)} = ?`, params: [value] };
|
|
144
180
|
}
|
|
145
181
|
|
|
146
182
|
if (isInFilter(value)) {
|
|
183
|
+
const numeric = value.in.length > 0 && value.in.every((v) => typeof v === "number");
|
|
147
184
|
const placeholders = value.in.map(() => "?").join(", ");
|
|
148
185
|
return {
|
|
149
|
-
sql: `${
|
|
186
|
+
sql: `${extractFor(numeric)} IN (${placeholders})`,
|
|
150
187
|
params: value.in,
|
|
151
188
|
};
|
|
152
189
|
}
|
|
153
190
|
|
|
154
191
|
if (isStartsWithFilter(value)) {
|
|
192
|
+
// ESCAPE '\' works on both SQLite and PostgreSQL. startsWith is a string
|
|
193
|
+
// operation, so always compare as text.
|
|
155
194
|
return {
|
|
156
|
-
sql: `${
|
|
157
|
-
params: [`${value.startsWith}%`],
|
|
195
|
+
sql: `${extractFor(false)} LIKE ? ESCAPE '\\'`,
|
|
196
|
+
params: [`${escapeLikePattern(value.startsWith)}%`],
|
|
158
197
|
};
|
|
159
198
|
}
|
|
160
199
|
|
|
@@ -162,22 +201,17 @@ export function buildCondition(
|
|
|
162
201
|
const conditions: string[] = [];
|
|
163
202
|
const params: unknown[] = [];
|
|
164
203
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
if (value.
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
}
|
|
177
|
-
if (value.lte !== undefined) {
|
|
178
|
-
conditions.push(`${extract} <= ?`);
|
|
179
|
-
params.push(value.lte);
|
|
180
|
-
}
|
|
204
|
+
// Each bound is cast to numeric only when its own operand is a number, so
|
|
205
|
+
// a mixed range (e.g. a string lower bound) stays correct per side.
|
|
206
|
+
const pushBound = (op: string, bound: string | number): void => {
|
|
207
|
+
conditions.push(`${extractFor(typeof bound === "number")} ${op} ?`);
|
|
208
|
+
params.push(bound);
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
if (value.gt !== undefined) pushBound(">", value.gt);
|
|
212
|
+
if (value.gte !== undefined) pushBound(">=", value.gte);
|
|
213
|
+
if (value.lt !== undefined) pushBound("<", value.lt);
|
|
214
|
+
if (value.lte !== undefined) pushBound("<=", value.lte);
|
|
181
215
|
|
|
182
216
|
return {
|
|
183
217
|
sql: conditions.join(" AND "),
|
|
@@ -229,7 +263,7 @@ export function buildOrderByClause(
|
|
|
229
263
|
const clauses: string[] = [];
|
|
230
264
|
|
|
231
265
|
for (const [field, direction] of Object.entries(orderBy)) {
|
|
232
|
-
clauses.push(`${
|
|
266
|
+
clauses.push(`${jsonOrderExtract(db, field)} ${direction.toUpperCase()}`);
|
|
233
267
|
}
|
|
234
268
|
|
|
235
269
|
if (clauses.length === 0) {
|
package/src/plugins/types.ts
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
+
import type { Permission } from "@emdash-cms/auth";
|
|
12
13
|
import type { Element } from "@emdash-cms/blocks";
|
|
13
14
|
// The plugin capability vocabulary, the legacy-rename map, and the manifest
|
|
14
15
|
// shape are authored once in @emdash-cms/plugin-types and shared between core
|
|
@@ -28,7 +29,9 @@ import {
|
|
|
28
29
|
type DeclaredAccess,
|
|
29
30
|
type DeprecatedPluginCapability,
|
|
30
31
|
type ManifestHookEntry,
|
|
32
|
+
type ManifestMcpTool,
|
|
31
33
|
type ManifestRouteEntry,
|
|
34
|
+
type PluginMcpManifestConfig,
|
|
32
35
|
type PluginCapability,
|
|
33
36
|
type PluginStorageConfig,
|
|
34
37
|
type StorageCollectionConfig,
|
|
@@ -52,7 +55,9 @@ export {
|
|
|
52
55
|
type DeclaredAccess,
|
|
53
56
|
type DeprecatedPluginCapability,
|
|
54
57
|
type ManifestHookEntry,
|
|
58
|
+
type ManifestMcpTool,
|
|
55
59
|
type ManifestRouteEntry,
|
|
60
|
+
type PluginMcpManifestConfig,
|
|
56
61
|
type PluginCapability,
|
|
57
62
|
type PluginStorageConfig,
|
|
58
63
|
type StorageCollectionConfig,
|
|
@@ -213,6 +218,8 @@ export interface ContentItem {
|
|
|
213
218
|
createdAt: string;
|
|
214
219
|
updatedAt: string;
|
|
215
220
|
publishedAt: string | null;
|
|
221
|
+
/** Scheduled publication time, if set (e.g. scheduled items or scheduled draft changes). */
|
|
222
|
+
scheduledAt?: string | null;
|
|
216
223
|
}
|
|
217
224
|
|
|
218
225
|
export interface ContentListWhere {
|
|
@@ -417,6 +424,14 @@ export interface SiteInfo {
|
|
|
417
424
|
url: string;
|
|
418
425
|
/** Site locale (from settings, defaults to "en") */
|
|
419
426
|
locale: string;
|
|
427
|
+
/**
|
|
428
|
+
* Astro's `trailingSlash` routing policy, from the host's Astro config.
|
|
429
|
+
* Plugins that build absolute URLs (sitemap, canonical, hreflang) should
|
|
430
|
+
* honor this so the URLs they emit match what the site serves. `createSiteInfo`
|
|
431
|
+
* always populates it (defaulting to `"ignore"`, Astro's default); it is
|
|
432
|
+
* optional on the type so pre-existing `SiteInfo` construction stays valid.
|
|
433
|
+
*/
|
|
434
|
+
trailingSlash?: "always" | "never" | "ignore";
|
|
420
435
|
}
|
|
421
436
|
|
|
422
437
|
/**
|
|
@@ -1173,10 +1188,31 @@ export interface PluginRoute<TInput = unknown> {
|
|
|
1173
1188
|
* Public routes skip session/token auth and CSRF checks.
|
|
1174
1189
|
*/
|
|
1175
1190
|
public?: boolean;
|
|
1191
|
+
/** RBAC permission required to invoke the route. Legacy routes default to plugins:manage. */
|
|
1192
|
+
permission?: Permission;
|
|
1193
|
+
/**
|
|
1194
|
+
* `Cache-Control` header value for successful GET responses, e.g.
|
|
1195
|
+
* `"public, max-age=60, stale-while-revalidate=300"`. Only honored on
|
|
1196
|
+
* routes that are also `public: true` — authenticated responses always
|
|
1197
|
+
* keep the default `private, no-store`. Errors are never cached.
|
|
1198
|
+
*/
|
|
1199
|
+
cacheControl?: string;
|
|
1176
1200
|
/** Route handler */
|
|
1177
1201
|
handler: (ctx: RouteContext<TInput>) => Promise<unknown>;
|
|
1178
1202
|
}
|
|
1179
1203
|
|
|
1204
|
+
export interface PluginMcpToolDefinition {
|
|
1205
|
+
description: string;
|
|
1206
|
+
route: string;
|
|
1207
|
+
input: z.ZodType;
|
|
1208
|
+
output?: z.ZodType;
|
|
1209
|
+
destructive?: boolean;
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1212
|
+
export interface PluginMcpConfig {
|
|
1213
|
+
tools: Record<string, PluginMcpToolDefinition>;
|
|
1214
|
+
}
|
|
1215
|
+
|
|
1180
1216
|
// =============================================================================
|
|
1181
1217
|
// Plugin Definition
|
|
1182
1218
|
// =============================================================================
|
|
@@ -1358,6 +1394,9 @@ export interface PluginDefinition<TStorage extends PluginStorageConfig = PluginS
|
|
|
1358
1394
|
/** API routes */
|
|
1359
1395
|
routes?: Record<string, PluginRoute>;
|
|
1360
1396
|
|
|
1397
|
+
/** Routes explicitly exposed as agent-callable MCP tools. */
|
|
1398
|
+
mcp?: PluginMcpConfig;
|
|
1399
|
+
|
|
1361
1400
|
/** Admin UI configuration */
|
|
1362
1401
|
admin?: PluginAdminConfig;
|
|
1363
1402
|
}
|
|
@@ -1373,6 +1412,7 @@ export interface ResolvedPlugin<TStorage extends PluginStorageConfig = PluginSto
|
|
|
1373
1412
|
storage: TStorage;
|
|
1374
1413
|
hooks: ResolvedPluginHooks;
|
|
1375
1414
|
routes: Record<string, PluginRoute>;
|
|
1415
|
+
mcp?: PluginMcpConfig;
|
|
1376
1416
|
admin: PluginAdminConfig;
|
|
1377
1417
|
}
|
|
1378
1418
|
|
|
@@ -1453,6 +1493,7 @@ export interface PluginManifest {
|
|
|
1453
1493
|
hooks: Array<ManifestHookEntry | HookName>;
|
|
1454
1494
|
/** Route declarations — either plain name strings or structured objects */
|
|
1455
1495
|
routes: Array<ManifestRouteEntry | string>;
|
|
1496
|
+
mcp?: PluginMcpManifestConfig;
|
|
1456
1497
|
admin: PluginAdminConfig;
|
|
1457
1498
|
}
|
|
1458
1499
|
|
package/src/schema/registry.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type { Kysely } from "kysely";
|
|
2
|
-
import type { Selectable } from "kysely";
|
|
1
|
+
import type { ColumnDataType, CreateTableBuilder, Insertable, Kysely, Selectable } from "kysely";
|
|
3
2
|
import { sql } from "kysely";
|
|
4
3
|
import { ulid } from "ulidx";
|
|
5
4
|
|
|
@@ -39,6 +38,12 @@ const WORD_BOUNDARY_PATTERN = /\b\w/g;
|
|
|
39
38
|
|
|
40
39
|
/** Valid column types for runtime validation */
|
|
41
40
|
const COLUMN_TYPES: ReadonlySet<string> = new Set(["TEXT", "REAL", "INTEGER", "JSON"]);
|
|
41
|
+
const COLUMN_TYPE_TO_DATA_TYPE = {
|
|
42
|
+
TEXT: "text",
|
|
43
|
+
REAL: "real",
|
|
44
|
+
INTEGER: "integer",
|
|
45
|
+
JSON: "json",
|
|
46
|
+
} satisfies Record<ColumnType, ColumnDataType>;
|
|
42
47
|
|
|
43
48
|
/** Valid collection source prefixes/values */
|
|
44
49
|
const VALID_SOURCES: ReadonlySet<string> = new Set(["manual", "discovered", "seed"]);
|
|
@@ -64,6 +69,10 @@ const VALID_COLLECTION_SUPPORTS: ReadonlySet<string> = new Set<CollectionSupport
|
|
|
64
69
|
"seo",
|
|
65
70
|
]);
|
|
66
71
|
|
|
72
|
+
// Each _emdash_fields row uses 15 bound parameters. Six rows keep every
|
|
73
|
+
// multi-row INSERT below D1's 100-parameter statement limit.
|
|
74
|
+
const SEED_FIELD_INSERT_BATCH_SIZE = 6;
|
|
75
|
+
|
|
67
76
|
function isCollectionSupport(value: unknown): value is CollectionSupport {
|
|
68
77
|
return typeof value === "string" && VALID_COLLECTION_SUPPORTS.has(value);
|
|
69
78
|
}
|
|
@@ -264,6 +273,113 @@ export class SchemaRegistry {
|
|
|
264
273
|
return collection;
|
|
265
274
|
}
|
|
266
275
|
|
|
276
|
+
/**
|
|
277
|
+
* Create a seed-owned collection and all of its fields in bulk.
|
|
278
|
+
*
|
|
279
|
+
* Fresh seeds can define dozens of fields. Creating them through
|
|
280
|
+
* `createField` performs multiple reads, one ALTER TABLE, and one media
|
|
281
|
+
* usage invalidation per field, which can exhaust D1's per-request query
|
|
282
|
+
* budget. This path validates the full schema before mutating it, creates
|
|
283
|
+
* the complete content table in one statement, and inserts field metadata
|
|
284
|
+
* in parameter-safe batches.
|
|
285
|
+
*/
|
|
286
|
+
async createSeedCollection(
|
|
287
|
+
input: Omit<CreateCollectionInput, "source">,
|
|
288
|
+
fields: readonly CreateFieldInput[],
|
|
289
|
+
): Promise<void> {
|
|
290
|
+
this.validateSlug(input.slug, "collection");
|
|
291
|
+
if (RESERVED_COLLECTION_SLUGS.includes(input.slug)) {
|
|
292
|
+
throw new SchemaError(`Collection slug "${input.slug}" is reserved`, "RESERVED_SLUG");
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
const existing = await this.getCollection(input.slug);
|
|
296
|
+
if (existing) {
|
|
297
|
+
throw new SchemaError(`Collection "${input.slug}" already exists`, "COLLECTION_EXISTS");
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
const fieldSlugs = new Set<string>();
|
|
301
|
+
for (const field of fields) {
|
|
302
|
+
this.validateSlug(field.slug, "field");
|
|
303
|
+
if (RESERVED_FIELD_SLUGS.includes(field.slug)) {
|
|
304
|
+
throw new SchemaError(`Field slug "${field.slug}" is reserved`, "RESERVED_SLUG");
|
|
305
|
+
}
|
|
306
|
+
if (fieldSlugs.has(field.slug)) {
|
|
307
|
+
throw new SchemaError(
|
|
308
|
+
`Field "${field.slug}" already exists in collection "${input.slug}"`,
|
|
309
|
+
"FIELD_EXISTS",
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
fieldSlugs.add(field.slug);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
const collectionId = ulid();
|
|
316
|
+
const supports = input.supports ?? ["drafts", "revisions"];
|
|
317
|
+
const hasSeo = input.hasSeo ?? supports.includes("seo") ?? false;
|
|
318
|
+
let maxSortOrder = -1;
|
|
319
|
+
const fieldRows: Insertable<FieldTable>[] = fields.map((field) => {
|
|
320
|
+
const sortOrder = field.sortOrder ?? maxSortOrder + 1;
|
|
321
|
+
maxSortOrder = Math.max(maxSortOrder, sortOrder);
|
|
322
|
+
|
|
323
|
+
return {
|
|
324
|
+
id: ulid(),
|
|
325
|
+
collection_id: collectionId,
|
|
326
|
+
slug: field.slug,
|
|
327
|
+
label: field.label,
|
|
328
|
+
type: field.type,
|
|
329
|
+
column_type: FIELD_TYPE_TO_COLUMN[field.type],
|
|
330
|
+
required: field.required ? 1 : 0,
|
|
331
|
+
unique: field.unique ? 1 : 0,
|
|
332
|
+
default_value: field.defaultValue !== undefined ? JSON.stringify(field.defaultValue) : null,
|
|
333
|
+
validation: field.validation ? JSON.stringify(field.validation) : null,
|
|
334
|
+
widget: field.widget ?? null,
|
|
335
|
+
options: field.options ? JSON.stringify(field.options) : null,
|
|
336
|
+
sort_order: sortOrder,
|
|
337
|
+
searchable: field.searchable ? 1 : 0,
|
|
338
|
+
translatable: field.translatable === false ? 0 : 1,
|
|
339
|
+
};
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
let schemaMutated = false;
|
|
343
|
+
try {
|
|
344
|
+
await withTransaction(this.db, async (trx) => {
|
|
345
|
+
await trx
|
|
346
|
+
.insertInto("_emdash_collections")
|
|
347
|
+
.values({
|
|
348
|
+
id: collectionId,
|
|
349
|
+
slug: input.slug,
|
|
350
|
+
label: input.label,
|
|
351
|
+
label_singular: input.labelSingular ?? null,
|
|
352
|
+
description: input.description ?? null,
|
|
353
|
+
icon: input.icon ?? null,
|
|
354
|
+
supports: JSON.stringify(supports),
|
|
355
|
+
source: "seed",
|
|
356
|
+
has_seo: hasSeo ? 1 : 0,
|
|
357
|
+
comments_enabled: input.commentsEnabled ? 1 : 0,
|
|
358
|
+
url_pattern: input.urlPattern ?? null,
|
|
359
|
+
})
|
|
360
|
+
.execute();
|
|
361
|
+
schemaMutated = true;
|
|
362
|
+
|
|
363
|
+
await this.createContentTable(input.slug, trx, fields);
|
|
364
|
+
|
|
365
|
+
for (const fieldBatch of chunks(fieldRows, SEED_FIELD_INSERT_BATCH_SIZE)) {
|
|
366
|
+
await trx.insertInto("_emdash_fields").values(fieldBatch).execute();
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
await markContentMediaUsageCollectionStaleSafely(this.db, input.slug, "CONTENT_USAGE_STALE");
|
|
371
|
+
} catch (error) {
|
|
372
|
+
if (schemaMutated) {
|
|
373
|
+
await markContentMediaUsageCollectionStaleSafely(
|
|
374
|
+
this.db,
|
|
375
|
+
input.slug,
|
|
376
|
+
"CONTENT_USAGE_STALE",
|
|
377
|
+
);
|
|
378
|
+
}
|
|
379
|
+
throw error;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
267
383
|
/**
|
|
268
384
|
* Update a collection
|
|
269
385
|
*/
|
|
@@ -787,11 +903,15 @@ export class SchemaRegistry {
|
|
|
787
903
|
/**
|
|
788
904
|
* Create a content table for a collection
|
|
789
905
|
*/
|
|
790
|
-
private async createContentTable(
|
|
906
|
+
private async createContentTable(
|
|
907
|
+
slug: string,
|
|
908
|
+
db?: Kysely<Database>,
|
|
909
|
+
fields: readonly CreateFieldInput[] = [],
|
|
910
|
+
): Promise<void> {
|
|
791
911
|
const conn = db ?? this.db;
|
|
792
912
|
const tableName = this.getTableName(slug);
|
|
793
913
|
|
|
794
|
-
|
|
914
|
+
let table: CreateTableBuilder<string, string> = conn.schema
|
|
795
915
|
.createTable(tableName)
|
|
796
916
|
.addColumn("id", "text", (col) => col.primaryKey())
|
|
797
917
|
.addColumn("slug", "text")
|
|
@@ -807,7 +927,23 @@ export class SchemaRegistry {
|
|
|
807
927
|
.addColumn("live_revision_id", "text", (col) => col.references("revisions.id"))
|
|
808
928
|
.addColumn("draft_revision_id", "text", (col) => col.references("revisions.id"))
|
|
809
929
|
.addColumn("locale", "text", (col) => col.notNull().defaultTo("en"))
|
|
810
|
-
.addColumn("translation_group", "text")
|
|
930
|
+
.addColumn("translation_group", "text");
|
|
931
|
+
|
|
932
|
+
for (const field of fields) {
|
|
933
|
+
const columnName = this.getColumnName(field.slug);
|
|
934
|
+
const columnType = COLUMN_TYPE_TO_DATA_TYPE[FIELD_TYPE_TO_COLUMN[field.type]];
|
|
935
|
+
table = table.addColumn(columnName, columnType, (column) => {
|
|
936
|
+
if (!field.required) return column;
|
|
937
|
+
|
|
938
|
+
const defaultValue =
|
|
939
|
+
field.defaultValue !== undefined
|
|
940
|
+
? this.formatDefaultValue(field.defaultValue, field.type)
|
|
941
|
+
: this.getEmptyDefault(field.type);
|
|
942
|
+
return column.notNull().defaultTo(sql.raw(defaultValue));
|
|
943
|
+
});
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
await table
|
|
811
947
|
.addUniqueConstraint(`${tableName}_slug_locale_unique`, ["slug", "locale"])
|
|
812
948
|
.execute();
|
|
813
949
|
|
package/src/search/query.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { sql } from "kysely";
|
|
|
10
10
|
import { encodeCursor, decodeCursor, InvalidCursorError } from "../database/repositories/types.js";
|
|
11
11
|
import type { Database } from "../database/types.js";
|
|
12
12
|
import { validateIdentifier } from "../database/validate.js";
|
|
13
|
+
import { resolveConfiguredLocale } from "../i18n/config.js";
|
|
13
14
|
import { getDb } from "../loader.js";
|
|
14
15
|
import { FTSManager } from "./fts-manager.js";
|
|
15
16
|
import type {
|
|
@@ -250,7 +251,7 @@ async function searchSingleCollection(
|
|
|
250
251
|
const contentTable = ftsManager.getContentTableName(collection);
|
|
251
252
|
const limit = options.limit ?? 20;
|
|
252
253
|
const status = options.status ?? "published";
|
|
253
|
-
const locale = options.locale;
|
|
254
|
+
const locale = options.locale ? resolveConfiguredLocale(options.locale) : undefined;
|
|
254
255
|
|
|
255
256
|
// Check if FTS table exists
|
|
256
257
|
if (!(await ftsManager.ftsTableExists(collection))) {
|
|
@@ -397,7 +398,7 @@ export async function getSuggestions(
|
|
|
397
398
|
options: SuggestOptions = {},
|
|
398
399
|
): Promise<Suggestion[]> {
|
|
399
400
|
const limit = options.limit ?? 5;
|
|
400
|
-
const locale = options.locale;
|
|
401
|
+
const locale = options.locale ? resolveConfiguredLocale(options.locale) : undefined;
|
|
401
402
|
|
|
402
403
|
// Get searchable collections
|
|
403
404
|
let collections = options.collections;
|
package/src/seed/apply.ts
CHANGED
|
@@ -19,7 +19,7 @@ import { TaxonomyRepository } from "../database/repositories/taxonomy.js";
|
|
|
19
19
|
import { withTransaction } from "../database/transaction.js";
|
|
20
20
|
import type { Database } from "../database/types.js";
|
|
21
21
|
import type { MediaValue } from "../fields/types.js";
|
|
22
|
-
import { getI18nConfig } from "../i18n/config.js";
|
|
22
|
+
import { getI18nConfig, resolveConfiguredLocale } from "../i18n/config.js";
|
|
23
23
|
import { ssrfSafeFetch, validateExternalUrl } from "../import/ssrf.js";
|
|
24
24
|
import { markContentMediaUsageCollectionStaleSafely } from "../media/usage/content-refresh.js";
|
|
25
25
|
import { SchemaRegistry } from "../schema/registry.js";
|
|
@@ -224,36 +224,35 @@ export async function applySeed(
|
|
|
224
224
|
continue;
|
|
225
225
|
}
|
|
226
226
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
});
|
|
227
|
+
const fields = collection.fields.map((field) => ({
|
|
228
|
+
slug: field.slug,
|
|
229
|
+
label: field.label,
|
|
230
|
+
type: field.type,
|
|
231
|
+
required: field.required || false,
|
|
232
|
+
unique: field.unique || false,
|
|
233
|
+
searchable: field.searchable || false,
|
|
234
|
+
defaultValue: field.defaultValue,
|
|
235
|
+
validation: field.validation,
|
|
236
|
+
widget: field.widget,
|
|
237
|
+
options: field.options,
|
|
238
|
+
}));
|
|
239
|
+
|
|
240
|
+
// Create a fresh seed schema in bulk to stay within D1's query budget.
|
|
241
|
+
await registry.createSeedCollection(
|
|
242
|
+
{
|
|
243
|
+
slug: collection.slug,
|
|
244
|
+
label: collection.label,
|
|
245
|
+
labelSingular: collection.labelSingular,
|
|
246
|
+
description: collection.description,
|
|
247
|
+
icon: collection.icon,
|
|
248
|
+
supports: collection.supports || [],
|
|
249
|
+
urlPattern: collection.urlPattern,
|
|
250
|
+
commentsEnabled: collection.commentsEnabled,
|
|
251
|
+
},
|
|
252
|
+
fields,
|
|
253
|
+
);
|
|
239
254
|
result.collections.created++;
|
|
240
|
-
|
|
241
|
-
// Create fields
|
|
242
|
-
for (const field of collection.fields) {
|
|
243
|
-
await registry.createField(collection.slug, {
|
|
244
|
-
slug: field.slug,
|
|
245
|
-
label: field.label,
|
|
246
|
-
type: field.type,
|
|
247
|
-
required: field.required || false,
|
|
248
|
-
unique: field.unique || false,
|
|
249
|
-
searchable: field.searchable || false,
|
|
250
|
-
defaultValue: field.defaultValue,
|
|
251
|
-
validation: field.validation,
|
|
252
|
-
widget: field.widget,
|
|
253
|
-
options: field.options,
|
|
254
|
-
});
|
|
255
|
-
result.fields.created++;
|
|
256
|
-
}
|
|
255
|
+
result.fields.created += fields.length;
|
|
257
256
|
}
|
|
258
257
|
}
|
|
259
258
|
|
|
@@ -264,7 +263,7 @@ export async function applySeed(
|
|
|
264
263
|
const termSeedIdMap = new Map<string, string>();
|
|
265
264
|
|
|
266
265
|
for (const taxonomy of seed.taxonomies) {
|
|
267
|
-
const defLocale = taxonomy.locale ?? defaultLocale;
|
|
266
|
+
const defLocale = resolveConfiguredLocale(taxonomy.locale ?? defaultLocale);
|
|
268
267
|
|
|
269
268
|
// (name, locale) is the UNIQUE key after migration 036.
|
|
270
269
|
const existingDef = await db
|
|
@@ -341,7 +340,7 @@ export async function applySeed(
|
|
|
341
340
|
);
|
|
342
341
|
} else {
|
|
343
342
|
for (const term of taxonomy.terms) {
|
|
344
|
-
const termLocale = term.locale ?? defLocale;
|
|
343
|
+
const termLocale = resolveConfiguredLocale(term.locale ?? defLocale);
|
|
345
344
|
const existing = await termRepo.findBySlug(taxonomy.name, term.slug, termLocale);
|
|
346
345
|
if (existing) {
|
|
347
346
|
if (onConflict === "error") {
|
|
@@ -465,7 +464,7 @@ export async function applySeed(
|
|
|
465
464
|
// Resolve the entry's locale up front so a non-`en` single-locale
|
|
466
465
|
// export (which omits `locale`) is filed under the project default
|
|
467
466
|
// rather than `en` (#1421).
|
|
468
|
-
const entryLocale = entry.locale ?? defaultLocale;
|
|
467
|
+
const entryLocale = resolveConfiguredLocale(entry.locale ?? defaultLocale);
|
|
469
468
|
|
|
470
469
|
// Check if entry exists (by slug + locale for locale-aware lookup)
|
|
471
470
|
const existing = await contentRepo.findBySlug(collectionSlug, entry.slug, entryLocale);
|
|
@@ -622,7 +621,7 @@ export async function applySeed(
|
|
|
622
621
|
const itemSeedIdMap = new Map<string, { id: string; translationGroup: string }>();
|
|
623
622
|
|
|
624
623
|
for (const menu of seed.menus) {
|
|
625
|
-
const locale = menu.locale ?? defaultLocale;
|
|
624
|
+
const locale = resolveConfiguredLocale(menu.locale ?? defaultLocale);
|
|
626
625
|
let lookup = db
|
|
627
626
|
.selectFrom("_emdash_menus")
|
|
628
627
|
.selectAll()
|
|
@@ -868,6 +867,8 @@ async function applyHierarchicalTerms(
|
|
|
868
867
|
): Promise<void> {
|
|
869
868
|
// "locale::slug" -> id, so the same slug can resolve per locale.
|
|
870
869
|
const slugToId = new Map<string, string>();
|
|
870
|
+
const resolveTermLocale = (term: SeedTaxonomyTerm) =>
|
|
871
|
+
resolveConfiguredLocale(term.locale ?? defLocale);
|
|
871
872
|
|
|
872
873
|
// Multiple passes — handles deep nesting and translationOf forward refs.
|
|
873
874
|
let remaining = [...terms];
|
|
@@ -877,7 +878,7 @@ async function applyHierarchicalTerms(
|
|
|
877
878
|
const processedThisPass: string[] = [];
|
|
878
879
|
|
|
879
880
|
for (const term of remaining) {
|
|
880
|
-
const termLocale = term
|
|
881
|
+
const termLocale = resolveTermLocale(term);
|
|
881
882
|
const parentReady = !term.parent || slugToId.has(`${termLocale}::${term.parent}`);
|
|
882
883
|
const translationReady = !term.translationOf || termSeedIdMap.has(term.translationOf);
|
|
883
884
|
|
|
@@ -922,7 +923,7 @@ async function applyHierarchicalTerms(
|
|
|
922
923
|
}
|
|
923
924
|
|
|
924
925
|
remaining = remaining.filter(
|
|
925
|
-
(
|
|
926
|
+
(term) => !processedThisPass.includes(term.slug + "::" + resolveTermLocale(term)),
|
|
926
927
|
);
|
|
927
928
|
maxPasses--;
|
|
928
929
|
}
|
package/src/seed/validate.ts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Validates a seed file structure before applying it.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
import { getI18nConfig, resolveConfiguredLocale } from "../i18n/config.js";
|
|
7
8
|
import { FIELD_TYPES } from "../schema/types.js";
|
|
8
9
|
import type { SeedFile, SeedMenuItem, ValidationResult } from "./types.js";
|
|
9
10
|
|
|
@@ -49,6 +50,9 @@ export function validateSeed(data: unknown): ValidationResult {
|
|
|
49
50
|
}
|
|
50
51
|
|
|
51
52
|
const seed = data as Partial<SeedFile>;
|
|
53
|
+
const defaultLocale =
|
|
54
|
+
getI18nConfig()?.defaultLocale ??
|
|
55
|
+
(typeof seed.defaultLocale === "string" ? seed.defaultLocale : "en");
|
|
52
56
|
|
|
53
57
|
// Required fields
|
|
54
58
|
if (!seed.version) {
|
|
@@ -163,7 +167,8 @@ export function validateSeed(data: unknown): ValidationResult {
|
|
|
163
167
|
errors.push(`${prefix}: name is required`);
|
|
164
168
|
} else {
|
|
165
169
|
// Uniqueness is per (name, locale).
|
|
166
|
-
const
|
|
170
|
+
const locale = resolveConfiguredLocale(taxonomy.locale ?? defaultLocale);
|
|
171
|
+
const key = `${taxonomy.name}::${locale}`;
|
|
167
172
|
if (taxonomyNames.has(key)) {
|
|
168
173
|
errors.push(
|
|
169
174
|
taxonomy.locale
|
|
@@ -206,7 +211,10 @@ export function validateSeed(data: unknown): ValidationResult {
|
|
|
206
211
|
} else {
|
|
207
212
|
// Uniqueness is per (slug, locale) so the same slug can repeat
|
|
208
213
|
// across locale variants of the def.
|
|
209
|
-
const
|
|
214
|
+
const locale = resolveConfiguredLocale(
|
|
215
|
+
term.locale ?? taxonomy.locale ?? defaultLocale,
|
|
216
|
+
);
|
|
217
|
+
const key = `${term.slug}::${locale}`;
|
|
210
218
|
if (termSlugs.has(key)) {
|
|
211
219
|
errors.push(
|
|
212
220
|
`${termPrefix}.slug: duplicate term slug "${term.slug}" in taxonomy "${taxonomy.name}"`,
|
|
@@ -233,7 +241,9 @@ export function validateSeed(data: unknown): ValidationResult {
|
|
|
233
241
|
if (taxonomy.hierarchical && taxonomy.terms) {
|
|
234
242
|
for (let j = 0; j < taxonomy.terms.length; j++) {
|
|
235
243
|
const term = taxonomy.terms[j];
|
|
236
|
-
const termLocale =
|
|
244
|
+
const termLocale = resolveConfiguredLocale(
|
|
245
|
+
term.locale ?? taxonomy.locale ?? defaultLocale,
|
|
246
|
+
);
|
|
237
247
|
if (term.parent && !termSlugs.has(`${term.parent}::${termLocale}`)) {
|
|
238
248
|
errors.push(
|
|
239
249
|
`${prefix}.terms[${j}].parent: parent term "${term.parent}" not found in taxonomy`,
|
|
@@ -268,7 +278,8 @@ export function validateSeed(data: unknown): ValidationResult {
|
|
|
268
278
|
} else {
|
|
269
279
|
// Uniqueness is per (name, locale) — siblings of a translation
|
|
270
280
|
// group share name but differ in locale.
|
|
271
|
-
const
|
|
281
|
+
const locale = resolveConfiguredLocale(menu.locale ?? defaultLocale);
|
|
282
|
+
const key = `${menu.name}::${locale}`;
|
|
272
283
|
if (menuNames.has(key)) {
|
|
273
284
|
errors.push(
|
|
274
285
|
menu.locale
|