emdash 0.37.0 → 0.38.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/{activation-K0kGBWuJ.mjs → activation-DyNTe_Tl.mjs} +3 -3
- package/dist/{activation-K0kGBWuJ.mjs.map → activation-DyNTe_Tl.mjs.map} +1 -1
- package/dist/{adapters-BDQwg236.d.mts → adapters-DCEgOBXi.d.mts} +1 -1
- package/dist/{adapters-BDQwg236.d.mts.map → adapters-DCEgOBXi.d.mts.map} +1 -1
- package/dist/{allowed-origins-BGglilcs.mjs → allowed-origins-GFUVavRj.mjs} +2 -2
- package/dist/{allowed-origins-BGglilcs.mjs.map → allowed-origins-GFUVavRj.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -3
- package/dist/api/route-utils.mjs +23 -22
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +5 -5
- package/dist/{api-Dz6rgoa3.mjs → api-BvxJmnFY.mjs} +141 -87
- package/dist/api-BvxJmnFY.mjs.map +1 -0
- package/dist/{api-tokens-BSsQACNe.mjs → api-tokens-xpGqMHrC.mjs} +2 -2
- package/dist/{api-tokens-BSsQACNe.mjs.map → api-tokens-xpGqMHrC.mjs.map} +1 -1
- package/dist/{apply-B4SIOxR1.mjs → apply-DLmM3R7f.mjs} +25 -21
- package/dist/apply-DLmM3R7f.mjs.map +1 -0
- package/dist/{config-it29yDLA.mjs → artifact-fetch-P2JXVwOq.mjs} +8 -199
- package/dist/artifact-fetch-P2JXVwOq.mjs.map +1 -0
- package/dist/astro/index.d.mts +12 -12
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +37 -11
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +10 -10
- package/dist/astro/middleware/auth.mjs +6 -6
- package/dist/astro/middleware/media-usage-write-fence.mjs +3 -3
- package/dist/astro/middleware/redirect.mjs +7 -5
- package/dist/astro/middleware/redirect.mjs.map +1 -1
- package/dist/astro/middleware/request-context.mjs +3 -3
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +10 -10
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +154 -125
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +6 -6
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +6 -6
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +3 -3
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +4 -4
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +4 -4
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +9 -9
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +9 -9
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +9 -9
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +16 -16
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +16 -16
- package/dist/astro/routes/api/admin/bylines/index.mjs +16 -16
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +11 -11
- package/dist/astro/routes/api/admin/comments/_id_.mjs +3 -3
- package/dist/astro/routes/api/admin/comments/bulk.mjs +8 -8
- package/dist/astro/routes/api/admin/comments/counts.mjs +3 -3
- package/dist/astro/routes/api/admin/comments/index.mjs +8 -8
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +4 -4
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
- package/dist/astro/routes/api/admin/media-usage/activation.mjs +13 -13
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +15 -15
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +15 -15
- package/dist/astro/routes/api/admin/media-usage/progress.mjs +13 -13
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +16 -16
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +15 -15
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +15 -15
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +3 -3
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +3 -3
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +56 -53
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +56 -53
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +54 -51
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +4 -4
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +54 -51
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +55 -52
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +55 -52
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +54 -51
- package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +54 -51
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +55 -52
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +54 -51
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +55 -52
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +56 -53
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +5 -4
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +56 -53
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +55 -52
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +54 -51
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +54 -51
- 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 +2 -2
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +54 -51
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +1 -1
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +1 -1
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +6 -6
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +3 -3
- package/dist/astro/routes/api/admin/users/index.mjs +6 -6
- package/dist/astro/routes/api/auth/dev-bypass.mjs +3 -3
- package/dist/astro/routes/api/auth/invite/accept.mjs +1 -1
- package/dist/astro/routes/api/auth/invite/complete.mjs +11 -11
- package/dist/astro/routes/api/auth/invite/index.mjs +8 -8
- package/dist/astro/routes/api/auth/invite/register-options.mjs +10 -10
- package/dist/astro/routes/api/auth/logout.mjs +2 -2
- package/dist/astro/routes/api/auth/magic-link/send.mjs +10 -10
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +2 -2
- package/dist/astro/routes/api/auth/me.mjs +7 -7
- package/dist/astro/routes/api/auth/mode.mjs +2 -2
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +4 -4
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +6 -6
- package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
- package/dist/astro/routes/api/auth/passkey/options.mjs +12 -12
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +10 -10
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +11 -11
- package/dist/astro/routes/api/auth/passkey/verify.mjs +11 -11
- package/dist/astro/routes/api/auth/signup/complete.mjs +11 -11
- package/dist/astro/routes/api/auth/signup/request.mjs +10 -10
- package/dist/astro/routes/api/auth/signup/verify.mjs +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +12 -12
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +11 -11
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +13 -8
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/lock.d.mts +10 -0
- package/dist/astro/routes/api/content/_collection_/_id_/lock.d.mts.map +1 -0
- package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +66 -0
- package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs.map +1 -0
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +11 -11
- package/dist/astro/routes/api/content/_collection_/_id_/publish.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +14 -9
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +19 -17
- 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 +19 -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 +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +15 -8
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +15 -14
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +13 -8
- 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 +23 -11
- package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/index.mjs +14 -9
- package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/trash.mjs +7 -7
- package/dist/astro/routes/api/dashboard.mjs +6 -6
- package/dist/astro/routes/api/dev/emails.mjs +2 -2
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +16 -16
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +3 -3
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/execute.mjs +14 -13
- package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -10
- package/dist/astro/routes/api/import/wordpress/media.mjs +11 -11
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +10 -10
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +13 -13
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +16 -16
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +27 -26
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
- package/dist/astro/routes/api/manifest.mjs +4 -4
- package/dist/astro/routes/api/mcp.mjs +71 -55
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +10 -10
- package/dist/astro/routes/api/media/_id_/replace.mjs +8 -8
- package/dist/astro/routes/api/media/_id_/upload.mjs +5 -5
- package/dist/astro/routes/api/media/_id_/usage.mjs +18 -18
- package/dist/astro/routes/api/media/_id_.mjs +17 -17
- package/dist/astro/routes/api/media/file/_...key_.mjs +1 -1
- package/dist/astro/routes/api/media/folders/_id_.mjs +8 -8
- package/dist/astro/routes/api/media/folders/index.mjs +8 -8
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
- package/dist/astro/routes/api/media/providers/index.mjs +2 -2
- package/dist/astro/routes/api/media/upload-url.mjs +9 -9
- package/dist/astro/routes/api/media.mjs +21 -21
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +9 -9
- package/dist/astro/routes/api/menus/_name_/items.mjs +9 -9
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +9 -9
- package/dist/astro/routes/api/menus/_name_/translations.mjs +9 -9
- package/dist/astro/routes/api/menus/_name_.mjs +9 -9
- package/dist/astro/routes/api/menus/index.mjs +9 -9
- package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/authorize.mjs +5 -5
- package/dist/astro/routes/api/oauth/device/code.mjs +8 -8
- package/dist/astro/routes/api/oauth/device/token.mjs +7 -7
- package/dist/astro/routes/api/oauth/register.mjs +2 -2
- package/dist/astro/routes/api/oauth/token/refresh.mjs +5 -5
- package/dist/astro/routes/api/oauth/token/revoke.mjs +5 -5
- package/dist/astro/routes/api/oauth/token.mjs +5 -5
- package/dist/astro/routes/api/openapi.json.mjs +84 -18
- package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +4 -4
- 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 +19 -17
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/translations.mjs +14 -12
- package/dist/astro/routes/api/relations/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/relations/index.mjs +19 -17
- package/dist/astro/routes/api/relations/index.mjs.map +1 -1
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +2 -2
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +3 -3
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +54 -51
- 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 +54 -51
- 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 +54 -51
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +54 -51
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +54 -51
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/reorder.mjs +54 -51
- package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +13 -11
- package/dist/astro/routes/api/schema/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +54 -51
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +54 -51
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +12 -11
- package/dist/astro/routes/api/search/enable.mjs.map +1 -1
- package/dist/astro/routes/api/search/index.mjs +11 -10
- package/dist/astro/routes/api/search/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/rebuild.mjs +12 -11
- package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
- package/dist/astro/routes/api/search/stats.mjs +7 -6
- package/dist/astro/routes/api/search/stats.mjs.map +1 -1
- package/dist/astro/routes/api/search/suggest.mjs +11 -10
- package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
- package/dist/astro/routes/api/sections/_slug_.mjs +11 -10
- package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/sections/index.mjs +11 -10
- package/dist/astro/routes/api/sections/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -6
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +6 -5
- package/dist/astro/routes/api/settings/backups/archives/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/export.mjs +7 -6
- package/dist/astro/routes/api/settings/backups/export.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/index.mjs +8 -7
- package/dist/astro/routes/api/settings/backups/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/email.mjs +4 -4
- package/dist/astro/routes/api/settings.mjs +14 -14
- package/dist/astro/routes/api/setup/admin-verify.mjs +12 -12
- package/dist/astro/routes/api/setup/admin.mjs +11 -11
- package/dist/astro/routes/api/setup/dev-bypass.mjs +33 -31
- package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
- package/dist/astro/routes/api/setup/index.mjs +33 -31
- package/dist/astro/routes/api/setup/index.mjs.map +1 -1
- package/dist/astro/routes/api/setup/status.mjs +3 -3
- package/dist/astro/routes/api/snapshot.mjs +8 -7
- package/dist/astro/routes/api/snapshot.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +15 -14
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +5 -5
- package/dist/astro/routes/api/typegen.mjs +4 -4
- package/dist/astro/routes/api/well-known/auth.mjs +2 -2
- package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
- package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +8 -8
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +12 -12
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +12 -12
- package/dist/astro/routes/api/widget-areas/_name_.mjs +7 -7
- package/dist/astro/routes/api/widget-areas/index.mjs +12 -12
- package/dist/astro/routes/api/widget-components.mjs +2 -2
- package/dist/astro/routes/robots.txt.mjs +6 -6
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +11 -10
- package/dist/astro/routes/sitemap-_collection_.xml.mjs.map +1 -1
- package/dist/astro/routes/sitemap.xml.mjs +7 -7
- package/dist/astro/types.d.mts +32 -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-Bkf_UHhD.mjs → authorize-C2QHlWSS.mjs} +2 -2
- package/dist/{authorize-Bkf_UHhD.mjs.map → authorize-C2QHlWSS.mjs.map} +1 -1
- package/dist/{backup-rwVAl9NI.mjs → backup-oS8ft5Cm.mjs} +5 -5
- package/dist/{backup-rwVAl9NI.mjs.map → backup-oS8ft5Cm.mjs.map} +1 -1
- package/dist/{bundle-C8S2Zl6U.mjs → bundle-CL0JjIPx.mjs} +4 -4
- package/dist/{bundle-C8S2Zl6U.mjs.map → bundle-CL0JjIPx.mjs.map} +1 -1
- package/dist/{byline-DuhF7NWl.mjs → byline-Vdi85CsZ.mjs} +6 -6
- package/dist/{byline-DuhF7NWl.mjs.map → byline-Vdi85CsZ.mjs.map} +1 -1
- package/dist/{byline-fields-BovY4KYM.mjs → byline-fields-DPVRFMz2.mjs} +2 -2
- package/dist/{byline-fields-BovY4KYM.mjs.map → byline-fields-DPVRFMz2.mjs.map} +1 -1
- package/dist/{byline-registry-Bpu9-MVs.mjs → byline-registry-BxDGIO0I.mjs} +2 -2
- package/dist/{byline-registry-Bpu9-MVs.mjs.map → byline-registry-BxDGIO0I.mjs.map} +1 -1
- package/dist/{bylines-CJ5nd6Lw.mjs → bylines-BX8QhcTk.mjs} +7 -7
- package/dist/{bylines-CJ5nd6Lw.mjs.map → bylines-BX8QhcTk.mjs.map} +1 -1
- package/dist/{bylines-RwBAeOF1.mjs → bylines-w-E1IEQd.mjs} +3 -3
- package/dist/{bylines-RwBAeOF1.mjs.map → bylines-w-E1IEQd.mjs.map} +1 -1
- package/dist/{cache-BF5Kvn59.mjs → cache--7HKu5Xm.mjs} +4 -4
- package/dist/{cache-BF5Kvn59.mjs.map → cache--7HKu5Xm.mjs.map} +1 -1
- package/dist/{capture-triggers-CNW1q3HK.mjs → capture-triggers-CeAsC76Z.mjs} +2 -2
- package/dist/{capture-triggers-CNW1q3HK.mjs.map → capture-triggers-CeAsC76Z.mjs.map} +1 -1
- package/dist/{challenge-store-DQN_Yrck.mjs → challenge-store-BIOak-tp.mjs} +1 -1
- package/dist/{challenge-store-DQN_Yrck.mjs.map → challenge-store-BIOak-tp.mjs.map} +1 -1
- package/dist/{chrome-tags-D8fiZG94.mjs → chrome-tags-DzDQBCjX.mjs} +1 -1
- package/dist/{chrome-tags-D8fiZG94.mjs.map → chrome-tags-DzDQBCjX.mjs.map} +1 -1
- package/dist/{chunks-C4szrD8o.mjs → chunks-VG_tyqnP.mjs} +2 -2
- package/dist/{chunks-C4szrD8o.mjs.map → chunks-VG_tyqnP.mjs.map} +1 -1
- package/dist/cli/index.mjs +66 -38
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +17 -7
- package/dist/client/index.d.mts.map +1 -1
- package/dist/client/index.mjs +17 -12
- package/dist/client/index.mjs.map +1 -1
- package/dist/{collection-deletion-Bj07NHbj.mjs → collection-deletion-BCwaWTDw.mjs} +4 -4
- package/dist/{collection-deletion-Bj07NHbj.mjs.map → collection-deletion-BCwaWTDw.mjs.map} +1 -1
- package/dist/collection-slugs-cache-7lTmNzeA.mjs +85 -0
- package/dist/collection-slugs-cache-7lTmNzeA.mjs.map +1 -0
- package/dist/{comment-reaction-BhrvSHml.mjs → comment-reaction-CDyvPQRj.mjs} +2 -2
- package/dist/{comment-reaction-BhrvSHml.mjs.map → comment-reaction-CDyvPQRj.mjs.map} +1 -1
- package/dist/{comments-Ct4ensnf.mjs → comments-VzmVLyaC.mjs} +1 -1
- package/dist/{comments-Ct4ensnf.mjs.map → comments-VzmVLyaC.mjs.map} +1 -1
- package/dist/{components-DJbo1z0S.mjs → components-CL6Wkdk-.mjs} +1 -1
- package/dist/{components-DJbo1z0S.mjs.map → components-CL6Wkdk-.mjs.map} +1 -1
- package/dist/config--eWjQJE5.mjs +217 -0
- package/dist/config--eWjQJE5.mjs.map +1 -0
- package/dist/{index-BJNMCWmu.d.mts → config-CGAhyOjP.d.mts} +138 -47
- package/dist/config-CGAhyOjP.d.mts.map +1 -0
- package/dist/{config-B9eZ340f.d.mts → config-ChFzshGd.d.mts} +1 -1
- package/dist/{config-B9eZ340f.d.mts.map → config-ChFzshGd.d.mts.map} +1 -1
- package/dist/{content-DjvM0T92.mjs → content-CNfMWuhY.mjs} +121 -5
- package/dist/content-CNfMWuhY.mjs.map +1 -0
- package/dist/{content-list-query-Btqd4uV2.d.mts → content-list-query-B8d4UQp9.d.mts} +1 -1
- package/dist/{content-list-query-Btqd4uV2.d.mts.map → content-list-query-B8d4UQp9.d.mts.map} +1 -1
- package/dist/{content-refresh-Bwp-8yGy.mjs → content-refresh-GTMyi2Xy.mjs} +8 -8
- package/dist/{content-refresh-Bwp-8yGy.mjs.map → content-refresh-GTMyi2Xy.mjs.map} +1 -1
- package/dist/{content-repair-Czdp7jz5.mjs → content-repair-CIMt5C0U.mjs} +4 -4
- package/dist/{content-repair-Czdp7jz5.mjs.map → content-repair-CIMt5C0U.mjs.map} +1 -1
- package/dist/{context-CX6gxOLW.mjs → context-C9PB8vGd.mjs} +265 -25
- package/dist/context-C9PB8vGd.mjs.map +1 -0
- package/dist/{cron-C6o7VppJ.mjs → cron-DHAy9oyq.mjs} +1 -1
- package/dist/{cron-C6o7VppJ.mjs.map → cron-DHAy9oyq.mjs.map} +1 -1
- package/dist/{dashboard-C2kTeeRI.mjs → dashboard-BNSvAN8A.mjs} +4 -4
- package/dist/{dashboard-C2kTeeRI.mjs.map → dashboard-BNSvAN8A.mjs.map} +1 -1
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +2 -2
- package/dist/db/libsql-migrations.d.mts +1 -1
- package/dist/db/libsql-migrations.mjs +5 -5
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres-migrations.d.mts +1 -1
- package/dist/db/postgres-migrations.mjs +5 -5
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite-migrations.d.mts +1 -1
- package/dist/db/sqlite-migrations.mjs +5 -5
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/db/sqlite.mjs +1 -1
- package/dist/{default-Clra32mw.mjs → default-ByZ0JqZo.mjs} +1 -1
- package/dist/{default-Clra32mw.mjs.map → default-ByZ0JqZo.mjs.map} +1 -1
- package/dist/{deferred-tasks-CvDETTJO.d.mts → deferred-tasks-Cu4NSJpa.d.mts} +1 -1
- package/dist/{deferred-tasks-CvDETTJO.d.mts.map → deferred-tasks-Cu4NSJpa.d.mts.map} +1 -1
- package/dist/{dev-typegen-DzOPfsNj.mjs → dev-typegen-DHT7lcMU.mjs} +1 -1
- package/dist/{dev-typegen-DzOPfsNj.mjs.map → dev-typegen-DHT7lcMU.mjs.map} +1 -1
- package/dist/{device-flow-D2oCWvLJ.mjs → device-flow-Cf6bhCCT.mjs} +4 -4
- package/dist/{device-flow-D2oCWvLJ.mjs.map → device-flow-Cf6bhCCT.mjs.map} +1 -1
- package/dist/{dialect-helpers-BSbfaO3F.mjs → dialect-helpers-BcQvkHgn.mjs} +83 -2
- package/dist/dialect-helpers-BcQvkHgn.mjs.map +1 -0
- package/dist/{direct-executor-Bfa5_ToE.mjs → direct-executor-yAyUGSqB.mjs} +3 -3
- package/dist/{direct-executor-Bfa5_ToE.mjs.map → direct-executor-yAyUGSqB.mjs.map} +1 -1
- package/dist/{dist-89xCrGqi.mjs → dist-BAsh8dbf.mjs} +1 -1
- package/dist/{dist-89xCrGqi.mjs.map → dist-BAsh8dbf.mjs.map} +1 -1
- package/dist/{email-console-Dzb6uGYa.mjs → email-console-DNup1Fku.mjs} +1 -1
- package/dist/{email-console-Dzb6uGYa.mjs.map → email-console-DNup1Fku.mjs.map} +1 -1
- package/dist/{enrich-BX0IDp4z.mjs → enrich-t2Xvjdqa.mjs} +3 -3
- package/dist/{enrich-BX0IDp4z.mjs.map → enrich-t2Xvjdqa.mjs.map} +1 -1
- package/dist/entry-lock-BEr8gDkG.mjs +163 -0
- package/dist/entry-lock-BEr8gDkG.mjs.map +1 -0
- package/dist/{relations-DnRK4YIT.d.mts → entry-lock-CGAtrwAR.d.mts} +92 -37
- package/dist/entry-lock-CGAtrwAR.d.mts.map +1 -0
- package/dist/{redirects-BLNOWQTn.mjs → entry-lock-DIYHAaSw.mjs} +57 -14
- package/dist/entry-lock-DIYHAaSw.mjs.map +1 -0
- package/dist/entry-locks-BEcX7ET0.mjs +167 -0
- package/dist/entry-locks-BEcX7ET0.mjs.map +1 -0
- package/dist/{error-DFrQjppn.mjs → error-BDcFyoRt.mjs} +2 -2
- package/dist/{error-DFrQjppn.mjs.map → error-BDcFyoRt.mjs.map} +1 -1
- package/dist/{errors-DsVoDUjJ.mjs → errors-DvMdNrgf.mjs} +8 -1
- package/dist/errors-DvMdNrgf.mjs.map +1 -0
- package/dist/{escape-HmHTC1Is.mjs → escape-B3asJC6W.mjs} +1 -1
- package/dist/{escape-HmHTC1Is.mjs.map → escape-B3asJC6W.mjs.map} +1 -1
- package/dist/{field-defs-cache-BM4SIRqH.mjs → field-defs-cache-Cf5FHK0M.mjs} +5 -5
- package/dist/{field-defs-cache-BM4SIRqH.mjs.map → field-defs-cache-Cf5FHK0M.mjs.map} +1 -1
- package/dist/{fts-manager-Do1BlW2r.mjs → fts-manager-iddym8cd.mjs} +4 -4
- package/dist/{fts-manager-Do1BlW2r.mjs.map → fts-manager-iddym8cd.mjs.map} +1 -1
- package/dist/{hash-3JJPlHF2.mjs → hash-BRweX6jz.mjs} +1 -1
- package/dist/{hash-3JJPlHF2.mjs.map → hash-BRweX6jz.mjs.map} +1 -1
- package/dist/{hook-result-DCh2WUpe.d.mts → hook-result-BrshYHLx.d.mts} +1 -1
- package/dist/{hook-result-DCh2WUpe.d.mts.map → hook-result-BrshYHLx.d.mts.map} +1 -1
- package/dist/{hreflang-B6hbAuuO.d.mts → hreflang-CQpu5bMy.d.mts} +2 -2
- package/dist/{hreflang-B6hbAuuO.d.mts.map → hreflang-CQpu5bMy.d.mts.map} +1 -1
- package/dist/{hreflang-DQbPZliA.mjs → hreflang-DshnweTC.mjs} +9 -8
- package/dist/{hreflang-DQbPZliA.mjs.map → hreflang-DshnweTC.mjs.map} +1 -1
- package/dist/{identity-DksvEazf.mjs → identity-CjGKDq8J.mjs} +3 -3
- package/dist/{identity-DksvEazf.mjs.map → identity-CjGKDq8J.mjs.map} +1 -1
- package/dist/{import-CJpaBBBT.mjs → import-D96g2otw.mjs} +5 -5
- package/dist/{import-CJpaBBBT.mjs.map → import-D96g2otw.mjs.map} +1 -1
- package/dist/{index-Du8K7bWa.d.mts → index-1ECYpfiF.d.mts} +3 -3
- package/dist/{index-Du8K7bWa.d.mts.map → index-1ECYpfiF.d.mts.map} +1 -1
- package/dist/index.d.mts +22 -22
- package/dist/index.mjs +81 -78
- package/dist/{init-lock-DJkX6Hto.mjs → init-lock-CFNBe_iH.mjs} +1 -1
- package/dist/{init-lock-DJkX6Hto.mjs.map → init-lock-CFNBe_iH.mjs.map} +1 -1
- package/dist/{load-CawHjTOH.mjs → load-DPtY9cZo.mjs} +2 -2
- package/dist/{load-CawHjTOH.mjs.map → load-DPtY9cZo.mjs.map} +1 -1
- package/dist/{loader-Z8vl7zTq.mjs → loader-WJi6GFRn.mjs} +46 -8
- package/dist/loader-WJi6GFRn.mjs.map +1 -0
- package/dist/{manifest-builder-COtzuca2.mjs → manifest-builder-BfNlGQIA.mjs} +2 -2
- package/dist/{manifest-builder-COtzuca2.mjs.map → manifest-builder-BfNlGQIA.mjs.map} +1 -1
- package/dist/{manifest-schema-BNWwR8Vd.mjs → manifest-schema-CILooI5J.mjs} +1 -1
- package/dist/{manifest-schema-BNWwR8Vd.mjs.map → manifest-schema-CILooI5J.mjs.map} +1 -1
- package/dist/media/image-endpoint.mjs +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +3 -3
- package/dist/media/local-runtime.d.mts +12 -12
- package/dist/media/local-runtime.mjs +5 -5
- package/dist/{media-BHjus86Y.mjs → media-C1EIZKh1.mjs} +1 -1
- package/dist/{media-BHjus86Y.mjs.map → media-C1EIZKh1.mjs.map} +1 -1
- package/dist/{media-allowlist-CoTBWoDp.mjs → media-allowlist-elXJgb_K.mjs} +2 -2
- package/dist/{media-allowlist-CoTBWoDp.mjs.map → media-allowlist-elXJgb_K.mjs.map} +1 -1
- package/dist/{media-folders-BGkATs8n.mjs → media-folders-DASfX_DH.mjs} +1 -1
- package/dist/{media-folders-BGkATs8n.mjs.map → media-folders-DASfX_DH.mjs.map} +1 -1
- package/dist/{media-upload-BCidR-EY.mjs → media-upload-C7_AQJ5v.mjs} +8 -8
- package/dist/{media-upload-BCidR-EY.mjs.map → media-upload-C7_AQJ5v.mjs.map} +1 -1
- package/dist/{media-url-DHoPr0hq.mjs → media-url-8dVl1loq.mjs} +19 -2
- package/dist/media-url-8dVl1loq.mjs.map +1 -0
- package/dist/{media-usage-CdY5jhSR.mjs → media-usage-C1EswMTq.mjs} +9 -9
- package/dist/{media-usage-CdY5jhSR.mjs.map → media-usage-C1EswMTq.mjs.map} +1 -1
- package/dist/{media-usage-activation-BgeMtK5C.mjs → media-usage-activation-CrHNltlL.mjs} +3 -3
- package/dist/{media-usage-activation-BgeMtK5C.mjs.map → media-usage-activation-CrHNltlL.mjs.map} +1 -1
- package/dist/{media-usage-work-D6D9sMCA.mjs → media-usage-work-C5B1zT1c.mjs} +2 -2
- package/dist/{media-usage-work-D6D9sMCA.mjs.map → media-usage-work-C5B1zT1c.mjs.map} +1 -1
- package/dist/{media-usage-work-CnGCdHxx.mjs → media-usage-work-IkQx_Yz6.mjs} +4 -4
- package/dist/{media-usage-work-CnGCdHxx.mjs.map → media-usage-work-IkQx_Yz6.mjs.map} +1 -1
- package/dist/{media-usage-write-fence-hjeD4u7s.mjs → media-usage-write-fence-B9anjOSg.mjs} +3 -3
- package/dist/{media-usage-write-fence-hjeD4u7s.mjs.map → media-usage-write-fence-B9anjOSg.mjs.map} +1 -1
- package/dist/{menus-6qSwTNxG.mjs → menus-D8mC4eaN.mjs} +115 -136
- package/dist/menus-D8mC4eaN.mjs.map +1 -0
- package/dist/{menus-uvPLXMZf.mjs → menus-UdwjHZJC.mjs} +11 -3
- package/dist/{menus-uvPLXMZf.mjs.map → menus-UdwjHZJC.mjs.map} +1 -1
- package/dist/migrations/index.d.mts +1 -1
- package/dist/migrations/index.mjs +4 -4
- package/dist/{mime-CUIG6x84.mjs → mime-DYpsOAny.mjs} +1 -1
- package/dist/{mime-CUIG6x84.mjs.map → mime-DYpsOAny.mjs.map} +1 -1
- package/dist/{mode-DN_WneRx.mjs → mode-Dm4BHhRH.mjs} +1 -1
- package/dist/{mode-DN_WneRx.mjs.map → mode-Dm4BHhRH.mjs.map} +1 -1
- package/dist/{node-sqlite-compat-BuJXIeMz.mjs → node-sqlite-compat-2sezm-Zd.mjs} +1 -1
- package/dist/{node-sqlite-compat-BuJXIeMz.mjs.map → node-sqlite-compat-2sezm-Zd.mjs.map} +1 -1
- package/dist/{normalize-C2xNjTSG.mjs → normalize-4nkKGsuW.mjs} +1 -1
- package/dist/{normalize-C2xNjTSG.mjs.map → normalize-4nkKGsuW.mjs.map} +1 -1
- package/dist/{oauth-authorization-Dj6Kwc21.mjs → oauth-authorization-BxE_lURD.mjs} +4 -4
- package/dist/{oauth-authorization-Dj6Kwc21.mjs.map → oauth-authorization-BxE_lURD.mjs.map} +1 -1
- package/dist/{oauth-clients-FD7I0J8m.mjs → oauth-clients-DJIdOdq0.mjs} +1 -1
- package/dist/{oauth-clients-FD7I0J8m.mjs.map → oauth-clients-DJIdOdq0.mjs.map} +1 -1
- package/dist/{oauth-state-store-DkmDOmHs.mjs → oauth-state-store-CsdxP57n.mjs} +1 -1
- package/dist/{oauth-state-store-DkmDOmHs.mjs.map → oauth-state-store-CsdxP57n.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-CvIwGpYd.mjs → oauth-user-lookup-HzzW-dkF.mjs} +1 -1
- package/dist/{oauth-user-lookup-CvIwGpYd.mjs.map → oauth-user-lookup-HzzW-dkF.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/{options-BHPeIbBd.mjs → options-D1FBiAv1.mjs} +60 -5
- package/dist/options-D1FBiAv1.mjs.map +1 -0
- package/dist/{options-CYb4y7hM.d.mts → options-D8Y0VHc7.d.mts} +9 -3
- package/dist/options-D8Y0VHc7.d.mts.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/page/index.d.mts.map +1 -1
- package/dist/page/index.mjs +12 -0
- package/dist/page/index.mjs.map +1 -1
- package/dist/{parse-Ckpg-Qfp.mjs → parse-WRg5C3NX.mjs} +2 -2
- package/dist/{parse-Ckpg-Qfp.mjs.map → parse-WRg5C3NX.mjs.map} +1 -1
- package/dist/{passkey-config-O_lj3y0k.mjs → passkey-config-qIdO-wF6.mjs} +1 -1
- package/dist/{passkey-config-O_lj3y0k.mjs.map → passkey-config-qIdO-wF6.mjs.map} +1 -1
- package/dist/{patterns-D9iDO3j8.mjs → patterns-DC8CLptu.mjs} +1 -1
- package/dist/{patterns-D9iDO3j8.mjs.map → patterns-DC8CLptu.mjs.map} +1 -1
- package/dist/{placeholder-4X9BrRrp.d.mts → placeholder-COrvARyD.d.mts} +1 -1
- package/dist/{placeholder-4X9BrRrp.d.mts.map → placeholder-COrvARyD.d.mts.map} +1 -1
- package/dist/plugin-types.d.mts +3 -3
- package/dist/plugin-types.d.mts.map +1 -1
- package/dist/plugin-utils.d.mts +10 -10
- package/dist/plugins/adapt-sandbox-entry.d.mts +10 -10
- package/dist/plugins/adapt-sandbox-entry.mjs +2 -2
- package/dist/{policy-Dhtwntrt.mjs → policy-XCfb-IE9.mjs} +2 -2
- package/dist/{policy-Dhtwntrt.mjs.map → policy-XCfb-IE9.mjs.map} +1 -1
- package/dist/{portable-text-U85hOafW.mjs → portable-text-BS3d5n-0.mjs} +1 -1
- package/dist/{portable-text-U85hOafW.mjs.map → portable-text-BS3d5n-0.mjs.map} +1 -1
- package/dist/{preview-B_vJLvf8.mjs → preview-BxwsGgGp.mjs} +2 -2
- package/dist/{preview-B_vJLvf8.mjs.map → preview-BxwsGgGp.mjs.map} +1 -1
- package/dist/{protocol-JdD2YhY9.d.mts → protocol-CLn58-nw.d.mts} +2 -2
- package/dist/{protocol-JdD2YhY9.d.mts.map → protocol-CLn58-nw.d.mts.map} +1 -1
- package/dist/{public-url-CarhZJgf.mjs → public-url-FWWAvnre.mjs} +1 -1
- package/dist/{public-url-CarhZJgf.mjs.map → public-url-FWWAvnre.mjs.map} +1 -1
- package/dist/{query-BZKZcG5b.mjs → query-DygOte9M.mjs} +25 -16
- package/dist/query-DygOte9M.mjs.map +1 -0
- package/dist/{query-BndaFxxp.mjs → query-gtXT03Wc.mjs} +4 -4
- package/dist/{query-BndaFxxp.mjs.map → query-gtXT03Wc.mjs.map} +1 -1
- package/dist/{rate-limit-BZmATC6W.mjs → rate-limit-CQUPm0dh.mjs} +2 -2
- package/dist/{rate-limit-BZmATC6W.mjs.map → rate-limit-CQUPm0dh.mjs.map} +1 -1
- package/dist/{redirect-CzqnLxK-.mjs → redirect-D1cWafi6.mjs} +1 -1
- package/dist/{redirect-CzqnLxK-.mjs.map → redirect-D1cWafi6.mjs.map} +1 -1
- package/dist/{redirect-CZkbozu9.mjs → redirect-DId44BS1.mjs} +19 -6
- package/dist/redirect-DId44BS1.mjs.map +1 -0
- package/dist/{redirects-CqzNM0KM.mjs → redirects-DN-ZE33W.mjs} +5 -5
- package/dist/{redirects-CqzNM0KM.mjs.map → redirects-DN-ZE33W.mjs.map} +1 -1
- package/dist/{registry-AZAsRsor.mjs → registry-DTqaqxed.mjs} +26 -10
- package/dist/registry-DTqaqxed.mjs.map +1 -0
- package/dist/{relation-04DfKRTO.mjs → relation-DxgCHOBw.mjs} +2 -2
- package/dist/{relation-04DfKRTO.mjs.map → relation-DxgCHOBw.mjs.map} +1 -1
- package/dist/{relations-CcFwDJdJ.mjs → relations-KKDSLUwS.mjs} +4 -4
- package/dist/{relations-CcFwDJdJ.mjs.map → relations-KKDSLUwS.mjs.map} +1 -1
- package/dist/{relations-C4htk5sb.mjs → relations-rOmbndUJ.mjs} +3 -3
- package/dist/{relations-C4htk5sb.mjs.map → relations-rOmbndUJ.mjs.map} +1 -1
- package/dist/{request-cache-DH9zdCOD.mjs → request-cache-DAZZmesc.mjs} +1 -1
- package/dist/{request-cache-DH9zdCOD.mjs.map → request-cache-DAZZmesc.mjs.map} +1 -1
- package/dist/request-context.d.mts +1 -1
- package/dist/{request-meta-DYxLlnmz.mjs → request-meta-BgjUQLQ-.mjs} +2 -2
- package/dist/{request-meta-DYxLlnmz.mjs.map → request-meta-BgjUQLQ-.mjs.map} +1 -1
- package/dist/{resolve-prZ3mP7l.mjs → resolve-Cy0aWSRj.mjs} +37 -4
- package/dist/resolve-Cy0aWSRj.mjs.map +1 -0
- package/dist/{runner-YKfIMnaF.d.mts → runner-CfwysRM0.d.mts} +2 -2
- package/dist/{runner-YKfIMnaF.d.mts.map → runner-CfwysRM0.d.mts.map} +1 -1
- package/dist/{runner-BLIDKpmA.mjs → runner-nEzvnogG.mjs} +419 -295
- package/dist/runner-nEzvnogG.mjs.map +1 -0
- package/dist/runtime.d.mts +11 -11
- package/dist/runtime.mjs +3 -2
- package/dist/runtime.mjs.map +1 -1
- package/dist/{schema-CGnBeLiW.mjs → schema-CRu38Pr5.mjs} +3 -3
- package/dist/{schema-CGnBeLiW.mjs.map → schema-CRu38Pr5.mjs.map} +1 -1
- package/dist/{schema-DYr-Vd-L.mjs → schema-DifxndJx.mjs} +4 -4
- package/dist/{schema-DYr-Vd-L.mjs.map → schema-DifxndJx.mjs.map} +1 -1
- package/dist/{scopes-BhWvBavj.mjs → scopes-D5A1OZbq.mjs} +3 -3
- package/dist/{scopes-BhWvBavj.mjs.map → scopes-D5A1OZbq.mjs.map} +1 -1
- package/dist/{search-C-qDk4kx.mjs → search-DEPFSBFq.mjs} +4 -4
- package/dist/{search-C-qDk4kx.mjs.map → search-DEPFSBFq.mjs.map} +1 -1
- package/dist/{secrets-rEtHt-6z.mjs → secrets-CdfzLdoO.mjs} +3 -3
- package/dist/{secrets-rEtHt-6z.mjs.map → secrets-CdfzLdoO.mjs.map} +1 -1
- package/dist/{sections-B_nYvlwn.mjs → sections-3X52kmIR.mjs} +2 -2
- package/dist/{sections-B_nYvlwn.mjs.map → sections-3X52kmIR.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +26 -24
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.d.mts.map +1 -1
- package/dist/seo/index.mjs +18 -19
- package/dist/seo/index.mjs.map +1 -1
- package/dist/{seo-926NRIgt.mjs → seo-Bw68KxRc.mjs} +2 -2
- package/dist/{seo-926NRIgt.mjs.map → seo-Bw68KxRc.mjs.map} +1 -1
- package/dist/{seo-CVWkdv6x.mjs → seo-C4AmbsMU.mjs} +3 -2
- package/dist/seo-C4AmbsMU.mjs.map +1 -0
- package/dist/{service-CJl3ZAYs.mjs → service-J_-Vgo7R.mjs} +2 -2
- package/dist/{service-CJl3ZAYs.mjs.map → service-J_-Vgo7R.mjs.map} +1 -1
- package/dist/{session-user-BlMgqCHS.mjs → session-user-CbnMMwk6.mjs} +1 -1
- package/dist/{session-user-BlMgqCHS.mjs.map → session-user-CbnMMwk6.mjs.map} +1 -1
- package/dist/{settings-Cwm6o2jY.mjs → settings-AnEFYICn.mjs} +3 -3
- package/dist/{settings-Cwm6o2jY.mjs.map → settings-AnEFYICn.mjs.map} +1 -1
- package/dist/{settings--wobrkkC.mjs → settings-DcMjREe5.mjs} +6 -6
- package/dist/{settings--wobrkkC.mjs.map → settings-DcMjREe5.mjs.map} +1 -1
- package/dist/{setup-complete-DQbClIN2.mjs → setup-complete-BClXXTvr.mjs} +2 -2
- package/dist/{setup-complete-DQbClIN2.mjs.map → setup-complete-BClXXTvr.mjs.map} +1 -1
- package/dist/{setup-nonce-DZCFS2sn.mjs → setup-nonce-BheRa4RG.mjs} +1 -1
- package/dist/{setup-nonce-DZCFS2sn.mjs.map → setup-nonce-BheRa4RG.mjs.map} +1 -1
- package/dist/{single-flight-cache-BPuGPdcN.mjs → single-flight-cache-jaswDzmQ.mjs} +2 -2
- package/dist/{single-flight-cache-BPuGPdcN.mjs.map → single-flight-cache-jaswDzmQ.mjs.map} +1 -1
- package/dist/{site-url-BrxA_E9H.mjs → site-url-Bqf-ea3N.mjs} +3 -3
- package/dist/{site-url-BrxA_E9H.mjs.map → site-url-Bqf-ea3N.mjs.map} +1 -1
- package/dist/{snapshot--OCDTqdb.mjs → snapshot-C4CtXntb.mjs} +51 -35
- package/dist/snapshot-C4CtXntb.mjs.map +1 -0
- package/dist/{ssrf-5sIM5jzl.mjs → ssrf-gl4gFNhw.mjs} +148 -91
- package/dist/ssrf-gl4gFNhw.mjs.map +1 -0
- package/dist/{state-BpFVsJZB.mjs → state-1F6IOhdQ.mjs} +1 -1
- package/dist/{state-BpFVsJZB.mjs.map → state-1F6IOhdQ.mjs.map} +1 -1
- package/dist/{status-B777-dXz.mjs → status-Cenfk_r5.mjs} +1 -1
- package/dist/{status-B777-dXz.mjs.map → status-Cenfk_r5.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/{target-BmR0iTwz.mjs → target-CRzeTs8G.mjs} +1 -1
- package/dist/{target-BmR0iTwz.mjs.map → target-CRzeTs8G.mjs.map} +1 -1
- package/dist/{taxonomies-DkAkMupr.mjs → taxonomies-BOdxuZpV.mjs} +11 -4
- package/dist/taxonomies-BOdxuZpV.mjs.map +1 -0
- package/dist/{taxonomies-Wfy_Lg12.mjs → taxonomies-NcFDq5Gg.mjs} +23 -14
- package/dist/taxonomies-NcFDq5Gg.mjs.map +1 -0
- package/dist/{taxonomy-tJepplLL.mjs → taxonomy-DP1vny4K.mjs} +11 -3
- package/dist/{taxonomy-tJepplLL.mjs.map → taxonomy-DP1vny4K.mjs.map} +1 -1
- package/dist/{tokens-BCO1oruF.mjs → tokens-CDk8ox9p.mjs} +1 -1
- package/dist/{tokens-BCO1oruF.mjs.map → tokens-CDk8ox9p.mjs.map} +1 -1
- package/dist/{transport-xh6YKW2G.d.mts → transport-BVn4tVb9.d.mts} +1 -1
- package/dist/{transport-xh6YKW2G.d.mts.map → transport-BVn4tVb9.d.mts.map} +1 -1
- package/dist/{transport-Dr3qtwXC.mjs → transport-DP0JI-8i.mjs} +1 -1
- package/dist/{transport-Dr3qtwXC.mjs.map → transport-DP0JI-8i.mjs.map} +1 -1
- package/dist/{trusted-proxy-BR5F1Otp.mjs → trusted-proxy-BTM6UxqD.mjs} +1 -1
- package/dist/{trusted-proxy-BR5F1Otp.mjs.map → trusted-proxy-BTM6UxqD.mjs.map} +1 -1
- package/dist/{types-CXFkwEGC.d.mts → types-2n848aVW.d.mts} +1 -1
- package/dist/{types-CXFkwEGC.d.mts.map → types-2n848aVW.d.mts.map} +1 -1
- package/dist/{types-75KIqzL9.mjs → types-BMXnRIrX.mjs} +4 -2
- package/dist/types-BMXnRIrX.mjs.map +1 -0
- package/dist/{types-B6GrPic4.d.mts → types-BouXpOsa.d.mts} +115 -4
- package/dist/types-BouXpOsa.d.mts.map +1 -0
- package/dist/{types-3qNFPlci.mjs → types-ByG2coLw.mjs} +1 -1
- package/dist/{types-3qNFPlci.mjs.map → types-ByG2coLw.mjs.map} +1 -1
- package/dist/types-CQPWhPxE.mjs.map +1 -1
- package/dist/{types-CDtkNSFQ.d.mts → types-DEfNJ__A.d.mts} +1 -1
- package/dist/{types-CDtkNSFQ.d.mts.map → types-DEfNJ__A.d.mts.map} +1 -1
- package/dist/{types-xDMtUFnO.d.mts → types-DKcKSbtB.d.mts} +23 -7
- package/dist/types-DKcKSbtB.d.mts.map +1 -0
- package/dist/{types-C00oyCZp.d.mts → types-DRYs7uTL.d.mts} +1 -1
- package/dist/{types-C00oyCZp.d.mts.map → types-DRYs7uTL.d.mts.map} +1 -1
- package/dist/{types-DczELMop.d.mts → types-DaEg7KX2.d.mts} +1 -1
- package/dist/{types-DczELMop.d.mts.map → types-DaEg7KX2.d.mts.map} +1 -1
- package/dist/{types-BuHW4xDE.d.mts → types-LU8utpP_.d.mts} +6 -3
- package/dist/types-LU8utpP_.d.mts.map +1 -0
- package/dist/{types-CPeXo1wF.d.mts → types-VpYfPUxN.d.mts} +1 -1
- package/dist/{types-CPeXo1wF.d.mts.map → types-VpYfPUxN.d.mts.map} +1 -1
- package/dist/{types-DM3vioBY.mjs → types-c9GP7Dj5.mjs} +1 -1
- package/dist/{types-DM3vioBY.mjs.map → types-c9GP7Dj5.mjs.map} +1 -1
- package/dist/{types-FV23hEoW.d.mts → types-tJWDK__M.d.mts} +14 -1
- package/dist/types-tJWDK__M.d.mts.map +1 -0
- package/dist/{upload-attempts-BsqoQ1fn.mjs → upload-attempts-C6S2y-lp.mjs} +1 -1
- package/dist/{upload-attempts-BsqoQ1fn.mjs.map → upload-attempts-C6S2y-lp.mjs.map} +1 -1
- package/dist/{url-pattern-D4c2czpJ.mjs → url-pattern-UYtxVTuj.mjs} +1 -1
- package/dist/{url-pattern-D4c2czpJ.mjs.map → url-pattern-UYtxVTuj.mjs.map} +1 -1
- package/dist/{user-BTZ40aq6.mjs → user-DIsIXogT.mjs} +2 -2
- package/dist/{user-BTZ40aq6.mjs.map → user-DIsIXogT.mjs.map} +1 -1
- package/dist/{utils-BKvNjjhY.mjs → utils-BicP5Qbg.mjs} +2 -2
- package/dist/{utils-BKvNjjhY.mjs.map → utils-BicP5Qbg.mjs.map} +1 -1
- package/dist/{validate-DE_LRwo9.mjs → validate-D8VPn4Hv.mjs} +8 -3
- package/dist/validate-D8VPn4Hv.mjs.map +1 -0
- package/dist/{validate-DUP27OYD.d.mts → validate-Df6Dvwbw.d.mts} +12 -7
- package/dist/validate-Df6Dvwbw.d.mts.map +1 -0
- package/dist/{validation-BMImFJ11.mjs → validation-CzMJn9Ku.mjs} +13 -11
- package/dist/{validation-BMImFJ11.mjs.map → validation-CzMJn9Ku.mjs.map} +1 -1
- package/dist/version-CK67_SXX.mjs +7 -0
- package/dist/{version-Bii3suaO.mjs.map → version-CK67_SXX.mjs.map} +1 -1
- package/dist/{widgets-D3gJ10xU.mjs → widgets-RFVAxQl3.mjs} +5 -5
- package/dist/{widgets-D3gJ10xU.mjs.map → widgets-RFVAxQl3.mjs.map} +1 -1
- package/dist/{wxr-taxonomies-B2Og_6rU.d.mts → wxr-taxonomies-BX4yQL9s.d.mts} +1 -1
- package/dist/{wxr-taxonomies-B2Og_6rU.d.mts.map → wxr-taxonomies-BX4yQL9s.d.mts.map} +1 -1
- package/dist/{wxr-taxonomies-Cxngsjwo.mjs → wxr-taxonomies-Csdp7yde.mjs} +4 -4
- package/dist/{wxr-taxonomies-Cxngsjwo.mjs.map → wxr-taxonomies-Csdp7yde.mjs.map} +1 -1
- package/dist/{zod-generator-BuYSQJB7.mjs → zod-generator-CNRGdnBY.mjs} +3 -3
- package/dist/{zod-generator-BuYSQJB7.mjs.map → zod-generator-CNRGdnBY.mjs.map} +1 -1
- package/package.json +12 -10
- package/src/api/errors.ts +7 -0
- package/src/api/handlers/content.ts +66 -79
- package/src/api/handlers/entry-lock.ts +206 -0
- package/src/api/handlers/manifest.ts +1 -0
- package/src/api/handlers/marketplace.ts +28 -20
- package/src/api/handlers/menus.ts +9 -0
- package/src/api/handlers/registry.ts +13 -8
- package/src/api/handlers/revision.ts +2 -1
- package/src/api/handlers/seo.ts +10 -1
- package/src/api/handlers/snapshot.ts +84 -72
- package/src/api/handlers/taxonomies.ts +9 -0
- package/src/api/openapi/document.ts +111 -6
- package/src/api/schemas/content.ts +8 -0
- package/src/api/schemas/entry-lock.ts +48 -0
- package/src/api/schemas/index.ts +1 -0
- package/src/api/schemas/schema.ts +10 -1
- package/src/api/types.ts +2 -0
- package/src/astro/integration/index.ts +9 -6
- package/src/astro/integration/routes.ts +5 -0
- package/src/astro/integration/runtime.ts +13 -5
- package/src/astro/integration/vite-config.ts +30 -0
- package/src/astro/middleware.ts +16 -0
- package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +10 -0
- package/src/astro/routes/api/content/[collection]/[id]/lock.ts +133 -0
- package/src/astro/routes/api/content/[collection]/[id]/publish.ts +11 -1
- package/src/astro/routes/api/content/[collection]/[id]/schedule.ts +20 -0
- package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +10 -0
- package/src/astro/routes/api/content/[collection]/[id].ts +27 -2
- package/src/astro/routes/api/content/[collection]/index.ts +3 -0
- package/src/astro/routes/sitemap-[collection].xml.ts +4 -0
- package/src/astro/types.ts +13 -3
- package/src/cli/commands/content.ts +31 -5
- package/src/cli/commands/export-seed.ts +2 -0
- package/src/client/index.ts +34 -7
- package/src/components/EmDashBodyEnd.astro +4 -1
- package/src/components/EmDashBodyStart.astro +4 -1
- package/src/components/EmDashHead.astro +35 -16
- package/src/components/Gallery.astro +18 -4
- package/src/components/InlineEditor.astro +3 -1
- package/src/components/InlinePortableTextEditor.tsx +106 -11
- package/src/components/PortableText.astro +4 -0
- package/src/components/Table.astro +147 -62
- package/src/config/errors.ts +13 -0
- package/src/content/converters/portable-text-to-prosemirror.ts +26 -2
- package/src/content/converters/prosemirror-to-portable-text.ts +35 -6
- package/src/content/converters/types.ts +10 -0
- package/src/database/dialect-helpers.ts +125 -0
- package/src/database/migrations/075_entry_edit_locks.ts +44 -0
- package/src/database/migrations/076_collection_nav_group.ts +22 -0
- package/src/database/migrations/077_plugin_storage_revisions.ts +89 -0
- package/src/database/migrations/runner.ts +6 -0
- package/src/database/repositories/content.ts +170 -1
- package/src/database/repositories/entry-locks.ts +257 -0
- package/src/database/repositories/options.ts +69 -5
- package/src/database/repositories/plugin-storage.ts +159 -0
- package/src/database/repositories/redirect.ts +17 -6
- package/src/database/repositories/taxonomy.ts +8 -0
- package/src/database/repositories/types.ts +3 -0
- package/src/database/types.ts +15 -1
- package/src/emdash-runtime.ts +117 -50
- package/src/i18n/resolve.ts +44 -4
- package/src/index.ts +14 -0
- package/src/loader.ts +35 -4
- package/src/mcp/server.ts +23 -5
- package/src/media/responsive.ts +23 -0
- package/src/media/usage/content-refresh.ts +2 -1
- package/src/menus/index.ts +17 -21
- package/src/page/seo-contributions.ts +78 -1
- package/src/page/seo-panel.ts +47 -0
- package/src/plugin-types.ts +9 -0
- package/src/plugins/conditional-storage.ts +30 -0
- package/src/plugins/context.ts +49 -17
- package/src/plugins/hooks.ts +7 -1
- package/src/plugins/index.ts +9 -0
- package/src/plugins/manager.ts +5 -2
- package/src/plugins/sandbox/types.ts +16 -2
- package/src/plugins/storage-query.ts +45 -0
- package/src/plugins/storage-update.ts +96 -0
- package/src/plugins/types.ts +114 -0
- package/src/query.ts +29 -3
- package/src/registry/config.ts +130 -27
- package/src/registry/types.ts +5 -6
- package/src/schema/collection-slugs-cache.ts +157 -0
- package/src/schema/registry.ts +19 -0
- package/src/schema/types.ts +25 -6
- package/src/security/ssrf.ts +167 -141
- package/src/seed/apply.ts +4 -0
- package/src/seed/types.ts +7 -2
- package/src/seed/validate.ts +18 -1
- package/src/seo/hreflang.ts +1 -0
- package/src/seo/index.ts +5 -10
- package/src/seo/media-url.ts +26 -0
- package/src/taxonomies/term-counts.ts +22 -5
- package/dist/api-Dz6rgoa3.mjs.map +0 -1
- package/dist/apply-B4SIOxR1.mjs.map +0 -1
- package/dist/config-it29yDLA.mjs.map +0 -1
- package/dist/content-DjvM0T92.mjs.map +0 -1
- package/dist/context-CX6gxOLW.mjs.map +0 -1
- package/dist/dialect-helpers-BSbfaO3F.mjs.map +0 -1
- package/dist/errors-DsVoDUjJ.mjs.map +0 -1
- package/dist/index-BJNMCWmu.d.mts.map +0 -1
- package/dist/loader-Z8vl7zTq.mjs.map +0 -1
- package/dist/media-url-DHoPr0hq.mjs.map +0 -1
- package/dist/menus-6qSwTNxG.mjs.map +0 -1
- package/dist/options-BHPeIbBd.mjs.map +0 -1
- package/dist/options-CYb4y7hM.d.mts.map +0 -1
- package/dist/query-BZKZcG5b.mjs.map +0 -1
- package/dist/redirect-CZkbozu9.mjs.map +0 -1
- package/dist/redirects-BLNOWQTn.mjs.map +0 -1
- package/dist/registry-AZAsRsor.mjs.map +0 -1
- package/dist/relations-DnRK4YIT.d.mts.map +0 -1
- package/dist/resolve-prZ3mP7l.mjs.map +0 -1
- package/dist/runner-BLIDKpmA.mjs.map +0 -1
- package/dist/seo-CVWkdv6x.mjs.map +0 -1
- package/dist/snapshot--OCDTqdb.mjs.map +0 -1
- package/dist/ssrf-5sIM5jzl.mjs.map +0 -1
- package/dist/taxonomies-DkAkMupr.mjs.map +0 -1
- package/dist/taxonomies-Wfy_Lg12.mjs.map +0 -1
- package/dist/types-75KIqzL9.mjs.map +0 -1
- package/dist/types-B6GrPic4.d.mts.map +0 -1
- package/dist/types-BuHW4xDE.d.mts.map +0 -1
- package/dist/types-FV23hEoW.d.mts.map +0 -1
- package/dist/types-xDMtUFnO.d.mts.map +0 -1
- package/dist/validate-DE_LRwo9.mjs.map +0 -1
- package/dist/validate-DUP27OYD.d.mts.map +0 -1
- package/dist/version-Bii3suaO.mjs +0 -7
- /package/dist/{api-tokens-BfYts-sq.mjs → api-tokens-B_lfpmH3.mjs} +0 -0
- /package/dist/{ssrf-Dg3cIT-b.mjs → ssrf-TQhaljuI.mjs} +0 -0
- /package/dist/{types-DfuTR6dL.mjs → types-A2cN6a4a.mjs} +0 -0
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
isSystemOrderField,
|
|
16
16
|
type ContentRevisionPrecondition,
|
|
17
17
|
} from "../../database/repositories/content.js";
|
|
18
|
+
import { EntryLockRepository } from "../../database/repositories/entry-locks.js";
|
|
18
19
|
import { RedirectRepository } from "../../database/repositories/redirect.js";
|
|
19
20
|
import { RevisionRepository } from "../../database/repositories/revision.js";
|
|
20
21
|
import { SeoRepository } from "../../database/repositories/seo.js";
|
|
@@ -425,6 +426,8 @@ async function createSlugChangeRedirect(
|
|
|
425
426
|
oldSlug: string,
|
|
426
427
|
newSlug: string,
|
|
427
428
|
contentId: string,
|
|
429
|
+
oldPublishedAt: string | null,
|
|
430
|
+
newPublishedAt: string | null,
|
|
428
431
|
): Promise<void> {
|
|
429
432
|
// A URL pattern has no locale token, so every locale variant of an entry
|
|
430
433
|
// generates the same URL, and slugs are unique per (slug, locale) — a
|
|
@@ -448,6 +451,8 @@ async function createSlugChangeRedirect(
|
|
|
448
451
|
newSlug,
|
|
449
452
|
contentId,
|
|
450
453
|
collectionRow?.url_pattern ?? null,
|
|
454
|
+
oldPublishedAt,
|
|
455
|
+
newPublishedAt,
|
|
451
456
|
);
|
|
452
457
|
invalidateRedirectCache();
|
|
453
458
|
}
|
|
@@ -1095,17 +1100,27 @@ export async function handleContentUpdate(
|
|
|
1095
1100
|
updated.primaryBylineId = credits[0]?.byline.translationGroup ?? null;
|
|
1096
1101
|
}
|
|
1097
1102
|
|
|
1098
|
-
// Create auto-redirect when slug changes
|
|
1103
|
+
// Create auto-redirect when slug changes. Date tokens in the URL
|
|
1104
|
+
// pattern resolve from the publish date, so the old URL uses the
|
|
1105
|
+
// pre-update date (the URL that was actually live) and the new URL
|
|
1106
|
+
// the post-update one.
|
|
1099
1107
|
if (oldSlug && body.slug) {
|
|
1100
|
-
await createSlugChangeRedirect(
|
|
1108
|
+
await createSlugChangeRedirect(
|
|
1109
|
+
trx,
|
|
1110
|
+
collection,
|
|
1111
|
+
oldSlug,
|
|
1112
|
+
body.slug,
|
|
1113
|
+
resolvedId,
|
|
1114
|
+
existing?.publishedAt ?? null,
|
|
1115
|
+
updated.publishedAt ?? null,
|
|
1116
|
+
);
|
|
1101
1117
|
}
|
|
1102
1118
|
|
|
1103
1119
|
// Sync non-translatable fields to sibling locales in the same
|
|
1104
1120
|
// translation group. Only runs when i18n is enabled, data was updated,
|
|
1105
1121
|
// and the item belongs to a translation group with siblings.
|
|
1106
1122
|
if (isI18nEnabled() && body.data && updated.translationGroup) {
|
|
1107
|
-
await syncNonTranslatableFields(
|
|
1108
|
-
trx,
|
|
1123
|
+
await trxRepo.syncNonTranslatableFields(
|
|
1109
1124
|
collection,
|
|
1110
1125
|
updated.id,
|
|
1111
1126
|
updated.translationGroup,
|
|
@@ -1283,10 +1298,11 @@ export async function handleContentDelete(
|
|
|
1283
1298
|
const result = await withTransaction(db, async (trx) => {
|
|
1284
1299
|
const repo = new ContentRepository(trx);
|
|
1285
1300
|
const resolvedId = (await resolveId(repo, collection, id)) ?? id;
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
}
|
|
1301
|
+
const deleted = await repo.delete(collection, resolvedId);
|
|
1302
|
+
if (deleted) {
|
|
1303
|
+
await new EntryLockRepository(trx).releaseEntry(collection, resolvedId);
|
|
1304
|
+
}
|
|
1305
|
+
return { id: resolvedId, deleted };
|
|
1290
1306
|
});
|
|
1291
1307
|
|
|
1292
1308
|
if (!result.deleted) {
|
|
@@ -1372,6 +1388,7 @@ export async function handleContentPermanentDelete(
|
|
|
1372
1388
|
// Wrap content delete + SEO/comment cleanup in a transaction
|
|
1373
1389
|
const deleted = await withTransaction(db, async (trx) => {
|
|
1374
1390
|
const trxRepo = new ContentRepository(trx);
|
|
1391
|
+
const item = await trxRepo.findByIdIncludingTrashed(collection, resolvedId);
|
|
1375
1392
|
const wasDeleted = await trxRepo.permanentDelete(collection, resolvedId);
|
|
1376
1393
|
|
|
1377
1394
|
if (wasDeleted) {
|
|
@@ -1384,6 +1401,22 @@ export async function handleContentPermanentDelete(
|
|
|
1384
1401
|
// Clean up revisions for permanently deleted content
|
|
1385
1402
|
const revisionRepo = new RevisionRepository(trx);
|
|
1386
1403
|
await revisionRepo.deleteByEntry(collection, resolvedId);
|
|
1404
|
+
await new EntryLockRepository(trx).releaseEntry(collection, resolvedId);
|
|
1405
|
+
// Term assignments are keyed by translation_group, so they belong to the
|
|
1406
|
+
// group rather than to this row. They go only once no row of the group is
|
|
1407
|
+
// left, trashed ones included, since a trashed row can still be restored.
|
|
1408
|
+
if (item?.translationGroup) {
|
|
1409
|
+
const groupSurvives = await trxRepo.hasTranslationsIncludingTrashed(
|
|
1410
|
+
collection,
|
|
1411
|
+
item.translationGroup,
|
|
1412
|
+
);
|
|
1413
|
+
if (!groupSurvives) {
|
|
1414
|
+
await new TaxonomyRepository(trx).clearEntryGroupTerms(
|
|
1415
|
+
collection,
|
|
1416
|
+
item.translationGroup,
|
|
1417
|
+
);
|
|
1418
|
+
}
|
|
1419
|
+
}
|
|
1387
1420
|
}
|
|
1388
1421
|
|
|
1389
1422
|
return wasDeleted;
|
|
@@ -1593,7 +1626,7 @@ export async function handleContentUnschedule(
|
|
|
1593
1626
|
* Publish content immediately.
|
|
1594
1627
|
*
|
|
1595
1628
|
* Publication is one atomic content-row statement. On databases that support
|
|
1596
|
-
* transactions, the
|
|
1629
|
+
* transactions, the slug redirect and the locale sync stay grouped with it.
|
|
1597
1630
|
*/
|
|
1598
1631
|
export async function handleContentPublish(
|
|
1599
1632
|
db: Kysely<Database>,
|
|
@@ -1631,6 +1664,21 @@ export async function handleContentPublish(
|
|
|
1631
1664
|
expectedRevision,
|
|
1632
1665
|
);
|
|
1633
1666
|
|
|
1667
|
+
if (
|
|
1668
|
+
existing &&
|
|
1669
|
+
isI18nEnabled() &&
|
|
1670
|
+
publishConfig.supportsRevisions &&
|
|
1671
|
+
published.translationGroup
|
|
1672
|
+
) {
|
|
1673
|
+
await repo.syncNonTranslatableFields(
|
|
1674
|
+
collection,
|
|
1675
|
+
published.id,
|
|
1676
|
+
published.translationGroup,
|
|
1677
|
+
published.data,
|
|
1678
|
+
{ previous: existing.data },
|
|
1679
|
+
);
|
|
1680
|
+
}
|
|
1681
|
+
|
|
1634
1682
|
// Leave a 301 behind when publishing changed the slug of an entry that
|
|
1635
1683
|
// was already published — its old URL was live and may be indexed or
|
|
1636
1684
|
// linked. A first publish is excluded: a draft's URL was never public.
|
|
@@ -1640,7 +1688,15 @@ export async function handleContentPublish(
|
|
|
1640
1688
|
published.slug &&
|
|
1641
1689
|
existing.slug !== published.slug
|
|
1642
1690
|
) {
|
|
1643
|
-
await createSlugChangeRedirect(
|
|
1691
|
+
await createSlugChangeRedirect(
|
|
1692
|
+
trx,
|
|
1693
|
+
collection,
|
|
1694
|
+
existing.slug,
|
|
1695
|
+
published.slug,
|
|
1696
|
+
resolvedId,
|
|
1697
|
+
existing.publishedAt ?? null,
|
|
1698
|
+
published.publishedAt ?? null,
|
|
1699
|
+
);
|
|
1644
1700
|
}
|
|
1645
1701
|
|
|
1646
1702
|
return published;
|
|
@@ -1986,75 +2042,6 @@ export async function handleContentTranslations(
|
|
|
1986
2042
|
}
|
|
1987
2043
|
}
|
|
1988
2044
|
|
|
1989
|
-
// ---------------------------------------------------------------------------
|
|
1990
|
-
// Non-translatable field sync
|
|
1991
|
-
// ---------------------------------------------------------------------------
|
|
1992
|
-
|
|
1993
|
-
/**
|
|
1994
|
-
* Sync non-translatable fields to sibling locales.
|
|
1995
|
-
*
|
|
1996
|
-
* When a content item is updated and it belongs to a translation group,
|
|
1997
|
-
* any non-translatable fields in the update data are written to all other
|
|
1998
|
-
* rows in the same translation group within the same transaction.
|
|
1999
|
-
*
|
|
2000
|
-
* Non-translatable fields are **copied, not linked** — each row owns its
|
|
2001
|
-
* own data. This keeps queries simple and avoids cross-row joins.
|
|
2002
|
-
*/
|
|
2003
|
-
async function syncNonTranslatableFields(
|
|
2004
|
-
trx: Kysely<Database>,
|
|
2005
|
-
collectionSlug: string,
|
|
2006
|
-
updatedItemId: string,
|
|
2007
|
-
translationGroup: string,
|
|
2008
|
-
data: Record<string, unknown>,
|
|
2009
|
-
): Promise<void> {
|
|
2010
|
-
// Get the collection to find its fields
|
|
2011
|
-
const collection = await trx
|
|
2012
|
-
.selectFrom("_emdash_collections")
|
|
2013
|
-
.select("id")
|
|
2014
|
-
.where("slug", "=", collectionSlug)
|
|
2015
|
-
.executeTakeFirst();
|
|
2016
|
-
|
|
2017
|
-
if (!collection) return;
|
|
2018
|
-
|
|
2019
|
-
// Find non-translatable fields that are present in the update data
|
|
2020
|
-
const fields = await trx
|
|
2021
|
-
.selectFrom("_emdash_fields")
|
|
2022
|
-
.select("slug")
|
|
2023
|
-
.where("collection_id", "=", collection.id)
|
|
2024
|
-
.where("translatable", "=", 0)
|
|
2025
|
-
.execute();
|
|
2026
|
-
|
|
2027
|
-
const nonTranslatableSlugs = fields.map((f) => f.slug);
|
|
2028
|
-
if (nonTranslatableSlugs.length === 0) return;
|
|
2029
|
-
|
|
2030
|
-
// Filter to only the non-translatable fields present in this update
|
|
2031
|
-
const syncData: Record<string, unknown> = {};
|
|
2032
|
-
for (const slug of nonTranslatableSlugs) {
|
|
2033
|
-
if (slug in data) {
|
|
2034
|
-
syncData[slug] = data[slug];
|
|
2035
|
-
}
|
|
2036
|
-
}
|
|
2037
|
-
if (Object.keys(syncData).length === 0) return;
|
|
2038
|
-
|
|
2039
|
-
// Build the SET clause for sibling rows
|
|
2040
|
-
validateIdentifier(collectionSlug, "collection slug");
|
|
2041
|
-
const tableName = `ec_${collectionSlug}`;
|
|
2042
|
-
|
|
2043
|
-
// Update all sibling rows (same translation_group, different id)
|
|
2044
|
-
const setClauses = Object.entries(syncData).map(([key, value]) => {
|
|
2045
|
-
validateIdentifier(key, "field slug");
|
|
2046
|
-
const serialized = typeof value === "object" && value !== null ? JSON.stringify(value) : value;
|
|
2047
|
-
return sql`${sql.ref(key)} = ${serialized}`;
|
|
2048
|
-
});
|
|
2049
|
-
|
|
2050
|
-
await sql`
|
|
2051
|
-
UPDATE ${sql.ref(tableName)}
|
|
2052
|
-
SET ${sql.join(setClauses, sql`, `)}
|
|
2053
|
-
WHERE translation_group = ${translationGroup}
|
|
2054
|
-
AND id != ${updatedItemId}
|
|
2055
|
-
`.execute(trx);
|
|
2056
|
-
}
|
|
2057
|
-
|
|
2058
2045
|
/**
|
|
2059
2046
|
* Resolve a `{ taxonomyName: [slug, ...] }` map to term IDs and replace the
|
|
2060
2047
|
* entry's assignments for each named taxonomy.
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import type { Kysely } from "kysely";
|
|
2
|
+
import { ulid } from "ulidx";
|
|
3
|
+
|
|
4
|
+
import { EntryLockRepository, type EntryLock } from "../../database/repositories/entry-locks.js";
|
|
5
|
+
import type { Database } from "../../database/types.js";
|
|
6
|
+
import { ErrorCode } from "../errors.js";
|
|
7
|
+
import type { ApiResult } from "../types.js";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* How long an entry stays locked without a heartbeat or save. Long enough to
|
|
11
|
+
* survive a pause in typing, short enough that a closed tab frees the entry
|
|
12
|
+
* within a coffee break.
|
|
13
|
+
*/
|
|
14
|
+
export const ENTRY_LOCK_LEASE_MS = 7 * 60 * 1000;
|
|
15
|
+
|
|
16
|
+
const ENTRY_LOCK_LEASE_SECONDS = ENTRY_LOCK_LEASE_MS / 1000;
|
|
17
|
+
|
|
18
|
+
export interface EntryLockHolder {
|
|
19
|
+
userId: string;
|
|
20
|
+
userName: string | null;
|
|
21
|
+
acquiredAt: string;
|
|
22
|
+
expiresAt: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface EntryLockStatus {
|
|
26
|
+
/** Whether the collection takes edit locks at all. */
|
|
27
|
+
enabled: boolean;
|
|
28
|
+
/** The live lease, whoever holds it. */
|
|
29
|
+
holder: EntryLockHolder | null;
|
|
30
|
+
/** Whether `holder` is the caller. */
|
|
31
|
+
heldByCaller: boolean;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface EntryLockRefusal {
|
|
35
|
+
code: typeof ErrorCode.ENTRY_LOCKED;
|
|
36
|
+
message: string;
|
|
37
|
+
details: EntryLockHolder;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function toHolder(lock: EntryLock): EntryLockHolder {
|
|
41
|
+
return {
|
|
42
|
+
userId: lock.userId,
|
|
43
|
+
userName: lock.userName,
|
|
44
|
+
acquiredAt: lock.acquiredAt,
|
|
45
|
+
expiresAt: lock.expiresAt,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function holderLabel(holder: EntryLockHolder): string {
|
|
50
|
+
return holder.userName?.trim() ? holder.userName : "Another editor";
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async function isLockingEnabled(db: Kysely<Database>, collection: string): Promise<boolean | null> {
|
|
54
|
+
const row = await db
|
|
55
|
+
.selectFrom("_emdash_collections")
|
|
56
|
+
.select("edit_locking")
|
|
57
|
+
.where("slug", "=", collection)
|
|
58
|
+
.executeTakeFirst();
|
|
59
|
+
if (!row) return null;
|
|
60
|
+
return row.edit_locking !== 0;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function collectionNotFound(collection: string): ApiResult<never> {
|
|
64
|
+
return {
|
|
65
|
+
success: false,
|
|
66
|
+
error: {
|
|
67
|
+
code: ErrorCode.COLLECTION_NOT_FOUND,
|
|
68
|
+
message: `Collection '${collection}' not found`,
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Takes the entry's lock for `userId`, or reports who is holding it. A
|
|
75
|
+
* take-over is only granted when the caller asks for one.
|
|
76
|
+
*/
|
|
77
|
+
export async function handleEntryLockAcquire(
|
|
78
|
+
db: Kysely<Database>,
|
|
79
|
+
collection: string,
|
|
80
|
+
entryId: string,
|
|
81
|
+
userId: string,
|
|
82
|
+
options: { takeover?: boolean; token?: string } = {},
|
|
83
|
+
): Promise<ApiResult<EntryLockStatus>> {
|
|
84
|
+
try {
|
|
85
|
+
const enabled = await isLockingEnabled(db, collection);
|
|
86
|
+
if (enabled === null) return collectionNotFound(collection);
|
|
87
|
+
if (!enabled) {
|
|
88
|
+
return { success: true, data: { enabled: false, holder: null, heldByCaller: false } };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const claim = await new EntryLockRepository(db).acquire({
|
|
92
|
+
collection,
|
|
93
|
+
entryId,
|
|
94
|
+
userId,
|
|
95
|
+
token: options.token ?? ulid(),
|
|
96
|
+
leaseSeconds: ENTRY_LOCK_LEASE_SECONDS,
|
|
97
|
+
takeover: options.takeover,
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
return {
|
|
101
|
+
success: true,
|
|
102
|
+
data: {
|
|
103
|
+
enabled: true,
|
|
104
|
+
holder: toHolder(claim.lock),
|
|
105
|
+
heldByCaller: claim.outcome === "acquired",
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
} catch (error) {
|
|
109
|
+
console.error("[entry-lock] acquire failed:", error);
|
|
110
|
+
return {
|
|
111
|
+
success: false,
|
|
112
|
+
error: { code: ErrorCode.ENTRY_LOCK_ERROR, message: "Failed to acquire the entry lock" },
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export async function handleEntryLockRead(
|
|
118
|
+
db: Kysely<Database>,
|
|
119
|
+
collection: string,
|
|
120
|
+
entryId: string,
|
|
121
|
+
userId: string,
|
|
122
|
+
): Promise<ApiResult<EntryLockStatus>> {
|
|
123
|
+
try {
|
|
124
|
+
const enabled = await isLockingEnabled(db, collection);
|
|
125
|
+
if (enabled === null) return collectionNotFound(collection);
|
|
126
|
+
if (!enabled) {
|
|
127
|
+
return { success: true, data: { enabled: false, holder: null, heldByCaller: false } };
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const lock = await new EntryLockRepository(db).findLive(collection, entryId);
|
|
131
|
+
return {
|
|
132
|
+
success: true,
|
|
133
|
+
data: {
|
|
134
|
+
enabled: true,
|
|
135
|
+
holder: lock ? toHolder(lock) : null,
|
|
136
|
+
heldByCaller: lock?.userId === userId,
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
} catch (error) {
|
|
140
|
+
console.error("[entry-lock] read failed:", error);
|
|
141
|
+
return {
|
|
142
|
+
success: false,
|
|
143
|
+
error: { code: ErrorCode.ENTRY_LOCK_ERROR, message: "Failed to read the entry lock" },
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export async function handleEntryLockRelease(
|
|
149
|
+
db: Kysely<Database>,
|
|
150
|
+
collection: string,
|
|
151
|
+
entryId: string,
|
|
152
|
+
userId: string,
|
|
153
|
+
options: { token?: string } = {},
|
|
154
|
+
): Promise<ApiResult<{ released: boolean }>> {
|
|
155
|
+
try {
|
|
156
|
+
const released = await new EntryLockRepository(db).release({
|
|
157
|
+
collection,
|
|
158
|
+
entryId,
|
|
159
|
+
userId,
|
|
160
|
+
token: options.token,
|
|
161
|
+
});
|
|
162
|
+
return { success: true, data: { released } };
|
|
163
|
+
} catch (error) {
|
|
164
|
+
console.error("[entry-lock] release failed:", error);
|
|
165
|
+
return {
|
|
166
|
+
success: false,
|
|
167
|
+
error: { code: ErrorCode.ENTRY_LOCK_ERROR, message: "Failed to release the entry lock" },
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Decides whether a write may proceed, and keeps the caller's own lease alive
|
|
174
|
+
* while it does. Resolves to `null` when the write is allowed.
|
|
175
|
+
*
|
|
176
|
+
* A write never takes a lock it was not given, so a CLI or API caller writing
|
|
177
|
+
* an unlocked entry leaves it unlocked.
|
|
178
|
+
*/
|
|
179
|
+
export async function claimEntryLockForWrite(
|
|
180
|
+
db: Kysely<Database>,
|
|
181
|
+
collection: string,
|
|
182
|
+
entryId: string,
|
|
183
|
+
userId: string,
|
|
184
|
+
options: { override?: boolean } = {},
|
|
185
|
+
): Promise<EntryLockRefusal | null> {
|
|
186
|
+
if (options.override === true) return null;
|
|
187
|
+
|
|
188
|
+
const repo = new EntryLockRepository(db);
|
|
189
|
+
const heldByCaller = await repo.refreshHeld({
|
|
190
|
+
collection,
|
|
191
|
+
entryId,
|
|
192
|
+
userId,
|
|
193
|
+
leaseSeconds: ENTRY_LOCK_LEASE_SECONDS,
|
|
194
|
+
});
|
|
195
|
+
if (heldByCaller) return null;
|
|
196
|
+
|
|
197
|
+
const holder = await repo.findEnforceable(collection, entryId);
|
|
198
|
+
if (!holder) return null;
|
|
199
|
+
|
|
200
|
+
const details = toHolder(holder);
|
|
201
|
+
return {
|
|
202
|
+
code: ErrorCode.ENTRY_LOCKED,
|
|
203
|
+
message: `${holderLabel(details)} is holding this entry`,
|
|
204
|
+
details,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
@@ -170,6 +170,7 @@ export async function buildManifestCollections(
|
|
|
170
170
|
titleField: collection.titleField,
|
|
171
171
|
dateField: collection.dateField,
|
|
172
172
|
...(collection.hidden ? { hidden: true } : {}),
|
|
173
|
+
...(collection.group ? { group: collection.group } : {}),
|
|
173
174
|
listColumns: listColumns.length > 0 ? listColumns : undefined,
|
|
174
175
|
fields,
|
|
175
176
|
};
|
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
type MarketplaceVersionSummary,
|
|
23
23
|
type PluginBundle,
|
|
24
24
|
} from "../../plugins/marketplace.js";
|
|
25
|
+
import { withUnavailableReason } from "../../plugins/sandbox/types.js";
|
|
25
26
|
import type { SandboxRunner } from "../../plugins/sandbox/types.js";
|
|
26
27
|
import { PluginStateRepository } from "../../plugins/state.js";
|
|
27
28
|
import {
|
|
@@ -363,7 +364,10 @@ export async function handleMarketplaceInstall(
|
|
|
363
364
|
success: false,
|
|
364
365
|
error: {
|
|
365
366
|
code: "SANDBOX_NOT_AVAILABLE",
|
|
366
|
-
message:
|
|
367
|
+
message: withUnavailableReason(
|
|
368
|
+
"Sandbox runner is required for marketplace plugins",
|
|
369
|
+
sandboxRunner,
|
|
370
|
+
),
|
|
367
371
|
},
|
|
368
372
|
};
|
|
369
373
|
}
|
|
@@ -584,7 +588,10 @@ export async function handleMarketplaceUpdate(
|
|
|
584
588
|
if (!opts?.sandboxBypassed && (!sandboxRunner || !sandboxRunner.isAvailable())) {
|
|
585
589
|
return {
|
|
586
590
|
success: false,
|
|
587
|
-
error: {
|
|
591
|
+
error: {
|
|
592
|
+
code: "SANDBOX_NOT_AVAILABLE",
|
|
593
|
+
message: withUnavailableReason("Sandbox runner is required", sandboxRunner),
|
|
594
|
+
},
|
|
588
595
|
};
|
|
589
596
|
}
|
|
590
597
|
|
|
@@ -658,6 +665,21 @@ export async function handleMarketplaceUpdate(
|
|
|
658
665
|
const oldCaps = oldBundle?.manifest.capabilities ?? [];
|
|
659
666
|
const capabilityChanges = diffCapabilities(oldCaps, bundle.manifest.capabilities);
|
|
660
667
|
const hasEscalation = capabilityChanges.added.length > 0;
|
|
668
|
+
const routeVisibilityChanges = diffRouteVisibility(oldBundle?.manifest, bundle.manifest);
|
|
669
|
+
const hasNewPublicRoutes = routeVisibilityChanges.newlyPublic.length > 0;
|
|
670
|
+
const oldMcpTools = [...(oldBundle?.manifest.mcp?.tools ?? [])].toSorted((a, b) =>
|
|
671
|
+
a.name.localeCompare(b.name),
|
|
672
|
+
);
|
|
673
|
+
const newMcpTools = [...(bundle.manifest.mcp?.tools ?? [])].toSorted((a, b) =>
|
|
674
|
+
a.name.localeCompare(b.name),
|
|
675
|
+
);
|
|
676
|
+
const hasMcpChanges = JSON.stringify(oldMcpTools) !== JSON.stringify(newMcpTools);
|
|
677
|
+
const mcpTools = newMcpTools.map(({ inputSchema: _, outputSchema: __, ...tool }) => tool);
|
|
678
|
+
const consentDetails = {
|
|
679
|
+
capabilityChanges,
|
|
680
|
+
routeVisibilityChanges: hasNewPublicRoutes ? routeVisibilityChanges : undefined,
|
|
681
|
+
mcpTools: hasMcpChanges ? mcpTools : undefined,
|
|
682
|
+
};
|
|
661
683
|
|
|
662
684
|
// If capabilities escalated, require explicit confirmation
|
|
663
685
|
if (hasEscalation && !opts?.confirmCapabilityChanges) {
|
|
@@ -666,42 +688,31 @@ export async function handleMarketplaceUpdate(
|
|
|
666
688
|
error: {
|
|
667
689
|
code: "CAPABILITY_ESCALATION",
|
|
668
690
|
message: "Plugin update requires new capabilities",
|
|
669
|
-
details:
|
|
691
|
+
details: consentDetails,
|
|
670
692
|
},
|
|
671
693
|
};
|
|
672
694
|
}
|
|
673
695
|
|
|
674
696
|
// Diff route visibility — routes going from private to public are a
|
|
675
697
|
// security-sensitive change that exposes unauthenticated endpoints.
|
|
676
|
-
const routeVisibilityChanges = diffRouteVisibility(oldBundle?.manifest, bundle.manifest);
|
|
677
|
-
const hasNewPublicRoutes = routeVisibilityChanges.newlyPublic.length > 0;
|
|
678
|
-
|
|
679
698
|
if (hasNewPublicRoutes && !opts?.confirmRouteVisibilityChanges) {
|
|
680
699
|
return {
|
|
681
700
|
success: false,
|
|
682
701
|
error: {
|
|
683
702
|
code: "ROUTE_VISIBILITY_ESCALATION",
|
|
684
703
|
message: "Plugin update exposes new public (unauthenticated) routes",
|
|
685
|
-
details:
|
|
704
|
+
details: consentDetails,
|
|
686
705
|
},
|
|
687
706
|
};
|
|
688
707
|
}
|
|
689
708
|
|
|
690
|
-
|
|
691
|
-
a.name.localeCompare(b.name),
|
|
692
|
-
);
|
|
693
|
-
const newMcpTools = [...(bundle.manifest.mcp?.tools ?? [])].toSorted((a, b) =>
|
|
694
|
-
a.name.localeCompare(b.name),
|
|
695
|
-
);
|
|
696
|
-
if (JSON.stringify(oldMcpTools) !== JSON.stringify(newMcpTools) && !opts?.confirmMcpTools) {
|
|
709
|
+
if (hasMcpChanges && !opts?.confirmMcpTools) {
|
|
697
710
|
return {
|
|
698
711
|
success: false,
|
|
699
712
|
error: {
|
|
700
713
|
code: "MCP_TOOL_CONSENT_REQUIRED",
|
|
701
714
|
message: "Plugin update changes its MCP tools",
|
|
702
|
-
details:
|
|
703
|
-
mcpTools: newMcpTools.map(({ inputSchema: _, outputSchema: __, ...tool }) => tool),
|
|
704
|
-
},
|
|
715
|
+
details: consentDetails,
|
|
705
716
|
},
|
|
706
717
|
};
|
|
707
718
|
}
|
|
@@ -721,9 +732,6 @@ export async function handleMarketplaceUpdate(
|
|
|
721
732
|
|
|
722
733
|
await syncDeclaredStorageIndexes(db, [bundle.manifest]);
|
|
723
734
|
|
|
724
|
-
// Clean up old bundle from R2 (best-effort)
|
|
725
|
-
deleteBundleFromR2(storage, pluginId, oldVersion).catch(() => {});
|
|
726
|
-
|
|
727
735
|
return {
|
|
728
736
|
success: true,
|
|
729
737
|
data: {
|
|
@@ -173,6 +173,15 @@ export async function handleMenuCreate(
|
|
|
173
173
|
error: { code: "NOT_FOUND", message: "Source menu for translation not found" },
|
|
174
174
|
};
|
|
175
175
|
}
|
|
176
|
+
if (source.name !== input.name) {
|
|
177
|
+
return {
|
|
178
|
+
success: false,
|
|
179
|
+
error: {
|
|
180
|
+
code: "VALIDATION_ERROR",
|
|
181
|
+
message: `A translation of menu "${source.name}" must use the same name`,
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
}
|
|
176
185
|
}
|
|
177
186
|
|
|
178
187
|
// Duplicate guard: same (name, locale). Falls back to the configured
|
|
@@ -13,6 +13,7 @@ import { canonicalizeDeclaredAccess } from "@emdash-cms/plugin-types";
|
|
|
13
13
|
import type { CanonicalDeclaredAccess } from "@emdash-cms/plugin-types";
|
|
14
14
|
import { checkEnvCompatibility, findSkippedEnvConstraints } from "@emdash-cms/registry-client/env";
|
|
15
15
|
import type { HostEnv } from "@emdash-cms/registry-client/env";
|
|
16
|
+
import { isProvenFirstRelease } from "@emdash-cms/registry-client/listing-policy";
|
|
16
17
|
import { evaluateRegistryReleaseWithdrawal } from "@emdash-cms/registry-client/withdrawal";
|
|
17
18
|
import { NSID } from "@emdash-cms/registry-lexicons";
|
|
18
19
|
import {
|
|
@@ -22,6 +23,7 @@ import {
|
|
|
22
23
|
import type { Kysely } from "kysely";
|
|
23
24
|
|
|
24
25
|
import type { Database } from "../../database/types.js";
|
|
26
|
+
import { withUnavailableReason } from "../../plugins/sandbox/types.js";
|
|
25
27
|
import type { SandboxRunner } from "../../plugins/sandbox/types.js";
|
|
26
28
|
import { PluginStateRepository } from "../../plugins/state.js";
|
|
27
29
|
import {
|
|
@@ -468,7 +470,10 @@ export async function handleRegistryInstall(
|
|
|
468
470
|
success: false,
|
|
469
471
|
error: {
|
|
470
472
|
code: "SANDBOX_NOT_AVAILABLE",
|
|
471
|
-
message:
|
|
473
|
+
message: withUnavailableReason(
|
|
474
|
+
"Sandbox runner is required for registry plugins",
|
|
475
|
+
sandboxRunner,
|
|
476
|
+
),
|
|
472
477
|
},
|
|
473
478
|
};
|
|
474
479
|
}
|
|
@@ -728,7 +733,9 @@ export async function handleRegistryInstall(
|
|
|
728
733
|
const exclude = registryConfig.policy?.minimumReleaseAgeExclude?.map((e) =>
|
|
729
734
|
e.trim().toLowerCase(),
|
|
730
735
|
);
|
|
731
|
-
const exempt =
|
|
736
|
+
const exempt =
|
|
737
|
+
releaseExemptFromMinimumAge(exclude, publisherDid, slug) ||
|
|
738
|
+
isProvenFirstRelease(packageView);
|
|
732
739
|
if (!exempt) {
|
|
733
740
|
const indexedAt = Date.parse(releaseView.indexedAt);
|
|
734
741
|
if (!Number.isFinite(indexedAt)) {
|
|
@@ -1229,7 +1236,10 @@ export async function handleRegistryUpdate(
|
|
|
1229
1236
|
if (!sandboxRunner || !sandboxRunner.isAvailable()) {
|
|
1230
1237
|
return {
|
|
1231
1238
|
success: false,
|
|
1232
|
-
error: {
|
|
1239
|
+
error: {
|
|
1240
|
+
code: "SANDBOX_NOT_AVAILABLE",
|
|
1241
|
+
message: withUnavailableReason("Sandbox runner is required", sandboxRunner),
|
|
1242
|
+
},
|
|
1233
1243
|
};
|
|
1234
1244
|
}
|
|
1235
1245
|
try {
|
|
@@ -1567,11 +1577,6 @@ export async function handleRegistryUpdate(
|
|
|
1567
1577
|
|
|
1568
1578
|
await syncDeclaredStorageIndexes(db, [bundle.manifest]);
|
|
1569
1579
|
|
|
1570
|
-
// Best-effort cleanup of the old bundle. Failures here don't roll
|
|
1571
|
-
// back the upgrade (the new bundle is already stored and committed
|
|
1572
|
-
// in the state row); the orphan is just storage we'll pay for.
|
|
1573
|
-
deleteBundleFromR2(storage, pluginId, oldVersion, "registry").catch(() => {});
|
|
1574
|
-
|
|
1575
1580
|
return {
|
|
1576
1581
|
success: true,
|
|
1577
1582
|
data: {
|
|
@@ -9,6 +9,7 @@ import { ContentRepository } from "../../database/repositories/content.js";
|
|
|
9
9
|
import { RevisionRepository, type Revision } from "../../database/repositories/revision.js";
|
|
10
10
|
import { withTransaction } from "../../database/transaction.js";
|
|
11
11
|
import type { Database } from "../../database/types.js";
|
|
12
|
+
import { encodeRev } from "../rev.js";
|
|
12
13
|
import type { ApiResult, ContentResponse } from "../types.js";
|
|
13
14
|
|
|
14
15
|
export interface RevisionListResponse {
|
|
@@ -154,7 +155,7 @@ export async function handleRevisionRestore(
|
|
|
154
155
|
|
|
155
156
|
return {
|
|
156
157
|
success: true,
|
|
157
|
-
data: { item },
|
|
158
|
+
data: { item, _rev: encodeRev(item) },
|
|
158
159
|
};
|
|
159
160
|
} catch {
|
|
160
161
|
return {
|
package/src/api/handlers/seo.ts
CHANGED
|
@@ -18,6 +18,13 @@ export interface SitemapContentEntry {
|
|
|
18
18
|
slug: string | null;
|
|
19
19
|
/** ISO date of last modification */
|
|
20
20
|
updatedAt: string;
|
|
21
|
+
/**
|
|
22
|
+
* ISO publish date, or null when never published. Used to resolve
|
|
23
|
+
* date tokens (`{year}`/`{month}`/`{day}`) in the collection's
|
|
24
|
+
* `url_pattern` — the published date keeps permalinks stable across
|
|
25
|
+
* later edits (unlike `updatedAt`).
|
|
26
|
+
*/
|
|
27
|
+
publishedAt: string | null;
|
|
21
28
|
/**
|
|
22
29
|
* Locale of this row (e.g. `"en"`, `"fr"`). Always present — rows in
|
|
23
30
|
* pre-i18n databases are backfilled to the configured `defaultLocale`.
|
|
@@ -139,11 +146,12 @@ export async function handleSitemapData(
|
|
|
139
146
|
slug: string | null;
|
|
140
147
|
id: string;
|
|
141
148
|
updated_at: string;
|
|
149
|
+
published_at: string | null;
|
|
142
150
|
locale: string;
|
|
143
151
|
translation_group: string | null;
|
|
144
152
|
seo_image: string | null;
|
|
145
153
|
}>`
|
|
146
|
-
SELECT c.slug, c.id, c.updated_at, c.locale, c.translation_group, s.seo_image
|
|
154
|
+
SELECT c.slug, c.id, c.updated_at, c.published_at, c.locale, c.translation_group, s.seo_image
|
|
147
155
|
FROM ${sql.ref(tableName)} c
|
|
148
156
|
LEFT JOIN _emdash_seo s
|
|
149
157
|
ON s.collection = ${col.slug}
|
|
@@ -165,6 +173,7 @@ export async function handleSitemapData(
|
|
|
165
173
|
id: row.id,
|
|
166
174
|
slug: row.slug,
|
|
167
175
|
updatedAt: toW3CDate(row.updated_at),
|
|
176
|
+
publishedAt: row.published_at ?? null,
|
|
168
177
|
locale: row.locale,
|
|
169
178
|
translationGroup: row.translation_group,
|
|
170
179
|
image: row.seo_image ?? null,
|