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
package/src/emdash-runtime.ts
CHANGED
|
@@ -68,6 +68,7 @@ import type {
|
|
|
68
68
|
SandboxRunnerFactory,
|
|
69
69
|
} from "./plugins/sandbox/types.js";
|
|
70
70
|
import type {
|
|
71
|
+
ActorInfo,
|
|
71
72
|
ContentHookEvent,
|
|
72
73
|
ResolvedPlugin,
|
|
73
74
|
MediaItem,
|
|
@@ -84,6 +85,7 @@ import type {
|
|
|
84
85
|
UserInfo,
|
|
85
86
|
} from "./plugins/types.js";
|
|
86
87
|
import { recordSchedulerHeartbeatSafely } from "./scheduler-health.js";
|
|
88
|
+
import { primeRegisteredCollections } from "./schema/collection-slugs-cache.js";
|
|
87
89
|
import { isMissingTableError } from "./utils/db-errors.js";
|
|
88
90
|
import { hashString } from "./utils/hash.js";
|
|
89
91
|
import { createInitLock, type InitLock, initWithLock } from "./utils/init-lock.js";
|
|
@@ -225,14 +227,14 @@ import { isContentSaveRejection } from "./plugins/save-rejection.js";
|
|
|
225
227
|
import type { CronScheduler } from "./plugins/scheduler/types.js";
|
|
226
228
|
import { PluginStateRepository } from "./plugins/state.js";
|
|
227
229
|
import { syncDeclaredStorageIndexes } from "./plugins/storage-indexes.js";
|
|
228
|
-
import {
|
|
230
|
+
import { resolveManifestRegistryConfig } from "./registry/config.js";
|
|
229
231
|
import { requestCached } from "./request-cache.js";
|
|
230
232
|
import { getRequestContext } from "./request-context.js";
|
|
231
233
|
import { publishDueContent, type PublishedRef } from "./scheduled-publish.js";
|
|
232
234
|
import { FTSManager } from "./search/fts-manager.js";
|
|
233
235
|
import { invalidateSiteSettingsCache } from "./settings/index.js";
|
|
234
236
|
|
|
235
|
-
const DRAFT_ONLY_UPDATE_KEYS = new Set(["data", "slug", "locale", "skipRevision"]);
|
|
237
|
+
const DRAFT_ONLY_UPDATE_KEYS = new Set(["data", "slug", "locale", "skipRevision", "actor"]);
|
|
236
238
|
const MAX_DRAFT_STAGE_ATTEMPTS = 32;
|
|
237
239
|
|
|
238
240
|
/**
|
|
@@ -1320,17 +1322,18 @@ export class EmDashRuntime {
|
|
|
1320
1322
|
coldStartReads.push(
|
|
1321
1323
|
phase("rt.seedcheck", "Auto-seed gate", async () => {
|
|
1322
1324
|
try {
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1325
|
+
// Selecting the slugs instead of COUNT(*) costs the same
|
|
1326
|
+
// round trip and primes the registered-collections cache,
|
|
1327
|
+
// so the first render on this isolate skips its own lookup.
|
|
1328
|
+
const [collectionRows, setupOption] = await Promise.all([
|
|
1329
|
+
readDb.selectFrom("_emdash_collections").select("slug").execute(),
|
|
1328
1330
|
readDb
|
|
1329
1331
|
.selectFrom("options")
|
|
1330
1332
|
.select("value")
|
|
1331
1333
|
.where("name", "=", "emdash:setup_complete")
|
|
1332
1334
|
.executeTakeFirst(),
|
|
1333
1335
|
]);
|
|
1336
|
+
primeRegisteredCollections(collectionRows.map((row) => row.slug));
|
|
1334
1337
|
const setupDone = (() => {
|
|
1335
1338
|
try {
|
|
1336
1339
|
return !!setupOption && JSON.parse(setupOption.value) === true;
|
|
@@ -1338,7 +1341,7 @@ export class EmDashRuntime {
|
|
|
1338
1341
|
return false;
|
|
1339
1342
|
}
|
|
1340
1343
|
})();
|
|
1341
|
-
seedGate = { collectionCount:
|
|
1344
|
+
seedGate = { collectionCount: collectionRows.length, setupDone };
|
|
1342
1345
|
} catch (error) {
|
|
1343
1346
|
captureMissingManualSchema(error);
|
|
1344
1347
|
// Leave the "already set up" default so a read failure never
|
|
@@ -2055,10 +2058,14 @@ export class EmDashRuntime {
|
|
|
2055
2058
|
// Warn regardless of whether there are plugins to load, so operators
|
|
2056
2059
|
// see the issue even if no marketplace plugins are installed yet.
|
|
2057
2060
|
if (!sandboxRunner.isAvailable()) {
|
|
2061
|
+
const reason = sandboxRunner.unavailableReason?.();
|
|
2058
2062
|
console.warn(
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2063
|
+
reason
|
|
2064
|
+
? `EmDash: Plugin sandbox is configured but not available on this platform: ${reason}. ` +
|
|
2065
|
+
"Sandboxed plugins will not be loaded."
|
|
2066
|
+
: "EmDash: Plugin sandbox is configured but not available on this platform. " +
|
|
2067
|
+
"Sandboxed plugins will not be loaded. " +
|
|
2068
|
+
"If using @emdash-cms/sandbox-workerd/sandbox, ensure workerd is installed.",
|
|
2062
2069
|
);
|
|
2063
2070
|
return sandboxedPluginCache;
|
|
2064
2071
|
}
|
|
@@ -2599,11 +2606,14 @@ export class EmDashRuntime {
|
|
|
2599
2606
|
}
|
|
2600
2607
|
: undefined;
|
|
2601
2608
|
|
|
2602
|
-
|
|
2603
|
-
|
|
2604
|
-
|
|
2605
|
-
|
|
2606
|
-
|
|
2609
|
+
const { registry, error: registryConfigurationError } = resolveManifestRegistryConfig(
|
|
2610
|
+
this.config.experimental?.registry,
|
|
2611
|
+
);
|
|
2612
|
+
if (registryConfigurationError) {
|
|
2613
|
+
console.error(
|
|
2614
|
+
`EmDash registry configuration error in ${registryConfigurationError.field} (${registryConfigurationError.code})`,
|
|
2615
|
+
);
|
|
2616
|
+
}
|
|
2607
2617
|
|
|
2608
2618
|
return {
|
|
2609
2619
|
version: VERSION,
|
|
@@ -2621,6 +2631,7 @@ export class EmDashRuntime {
|
|
|
2621
2631
|
},
|
|
2622
2632
|
marketplace: !!this.config.marketplace,
|
|
2623
2633
|
registry,
|
|
2634
|
+
registryConfigurationError,
|
|
2624
2635
|
};
|
|
2625
2636
|
}
|
|
2626
2637
|
|
|
@@ -2792,13 +2803,22 @@ export class EmDashRuntime {
|
|
|
2792
2803
|
locale?: string;
|
|
2793
2804
|
translationOf?: string;
|
|
2794
2805
|
taxonomies?: Record<string, string[]>;
|
|
2806
|
+
actor?: ActorInfo;
|
|
2795
2807
|
},
|
|
2796
2808
|
) {
|
|
2809
|
+
const actor = body.actor ? { ...body.actor } : undefined;
|
|
2810
|
+
|
|
2797
2811
|
// Run beforeSave hooks (trusted plugins)
|
|
2798
2812
|
let processedData = body.data;
|
|
2799
2813
|
if (this.hooks.hasHooks("content:beforeSave")) {
|
|
2800
2814
|
try {
|
|
2801
|
-
const hookResult = await this.hooks.runContentBeforeSave(
|
|
2815
|
+
const hookResult = await this.hooks.runContentBeforeSave(
|
|
2816
|
+
body.data,
|
|
2817
|
+
collection,
|
|
2818
|
+
true,
|
|
2819
|
+
undefined,
|
|
2820
|
+
actor,
|
|
2821
|
+
);
|
|
2802
2822
|
processedData = hookResult.content;
|
|
2803
2823
|
} catch (error) {
|
|
2804
2824
|
return beforeSaveFailure(error);
|
|
@@ -2806,7 +2826,13 @@ export class EmDashRuntime {
|
|
|
2806
2826
|
}
|
|
2807
2827
|
|
|
2808
2828
|
// Run beforeSave hooks (sandboxed plugins)
|
|
2809
|
-
const sandboxResult = await this.runSandboxedBeforeSave(
|
|
2829
|
+
const sandboxResult = await this.runSandboxedBeforeSave(
|
|
2830
|
+
processedData,
|
|
2831
|
+
collection,
|
|
2832
|
+
true,
|
|
2833
|
+
undefined,
|
|
2834
|
+
actor,
|
|
2835
|
+
);
|
|
2810
2836
|
if (!sandboxResult.success) return sandboxResult;
|
|
2811
2837
|
processedData = sandboxResult.data;
|
|
2812
2838
|
|
|
@@ -2840,7 +2866,7 @@ export class EmDashRuntime {
|
|
|
2840
2866
|
|
|
2841
2867
|
// Run afterSave hooks (fire-and-forget)
|
|
2842
2868
|
if (result.success && result.data) {
|
|
2843
|
-
this.runAfterSaveHooks(contentItemToRecord(result.data.item), collection, true);
|
|
2869
|
+
this.runAfterSaveHooks(contentItemToRecord(result.data.item), collection, true, actor);
|
|
2844
2870
|
}
|
|
2845
2871
|
|
|
2846
2872
|
return result;
|
|
@@ -2868,8 +2894,15 @@ export class EmDashRuntime {
|
|
|
2868
2894
|
/** Replace the previous autosave revision after staging this save. */
|
|
2869
2895
|
skipRevision?: boolean;
|
|
2870
2896
|
_rev?: string;
|
|
2897
|
+
/**
|
|
2898
|
+
* Acting user for this save. Used for revision attribution and
|
|
2899
|
+
* passed to content hooks; never changes entry ownership.
|
|
2900
|
+
*/
|
|
2901
|
+
actor?: ActorInfo;
|
|
2871
2902
|
},
|
|
2872
2903
|
) {
|
|
2904
|
+
const actor = body.actor ? { ...body.actor } : undefined;
|
|
2905
|
+
|
|
2873
2906
|
// Resolve slug → ID if needed (before any lookups)
|
|
2874
2907
|
const repo = new ContentRepository(this.db);
|
|
2875
2908
|
const resolvedItem = await repo.findByIdOrSlug(collection, id, body.locale);
|
|
@@ -2893,7 +2926,7 @@ export class EmDashRuntime {
|
|
|
2893
2926
|
};
|
|
2894
2927
|
}
|
|
2895
2928
|
}
|
|
2896
|
-
const { _rev: _discardedRev, ...bodyWithoutRev } = body;
|
|
2929
|
+
const { _rev: _discardedRev, actor: _discardedActor, ...bodyWithoutRev } = body;
|
|
2897
2930
|
|
|
2898
2931
|
// Run beforeSave hooks if data is provided
|
|
2899
2932
|
let processedData = bodyWithoutRev.data;
|
|
@@ -2905,6 +2938,7 @@ export class EmDashRuntime {
|
|
|
2905
2938
|
collection,
|
|
2906
2939
|
false,
|
|
2907
2940
|
resolvedItem?.id,
|
|
2941
|
+
actor,
|
|
2908
2942
|
);
|
|
2909
2943
|
processedData = hookResult.content;
|
|
2910
2944
|
} catch (error) {
|
|
@@ -2918,6 +2952,7 @@ export class EmDashRuntime {
|
|
|
2918
2952
|
collection,
|
|
2919
2953
|
false,
|
|
2920
2954
|
resolvedItem?.id,
|
|
2955
|
+
actor,
|
|
2921
2956
|
);
|
|
2922
2957
|
if (!sandboxResult.success) return sandboxResult;
|
|
2923
2958
|
processedData = sandboxResult.data;
|
|
@@ -2969,7 +3004,7 @@ export class EmDashRuntime {
|
|
|
2969
3004
|
collection,
|
|
2970
3005
|
entryId: resolvedId,
|
|
2971
3006
|
data: mergedData,
|
|
2972
|
-
authorId:
|
|
3007
|
+
authorId: actor?.id,
|
|
2973
3008
|
});
|
|
2974
3009
|
|
|
2975
3010
|
let staged: boolean;
|
|
@@ -3070,31 +3105,14 @@ export class EmDashRuntime {
|
|
|
3070
3105
|
if (hydrated.success && hydrated.data) {
|
|
3071
3106
|
const contentIdsToRefresh = [resolvedId];
|
|
3072
3107
|
if (!usesDraftRevisions && processedData) {
|
|
3073
|
-
|
|
3074
|
-
|
|
3075
|
-
|
|
3076
|
-
|
|
3077
|
-
|
|
3078
|
-
|
|
3079
|
-
|
|
3080
|
-
|
|
3081
|
-
)),
|
|
3082
|
-
);
|
|
3083
|
-
} catch (error) {
|
|
3084
|
-
console.error(
|
|
3085
|
-
`[media-usage] Failed to discover synced i18n siblings for ${collection}/${resolvedId}:`,
|
|
3086
|
-
error,
|
|
3087
|
-
);
|
|
3088
|
-
try {
|
|
3089
|
-
await markContentMediaUsageCollectionStale(
|
|
3090
|
-
this.db,
|
|
3091
|
-
collection,
|
|
3092
|
-
"CONTENT_USAGE_REFRESH_ERROR",
|
|
3093
|
-
);
|
|
3094
|
-
} catch (staleError) {
|
|
3095
|
-
console.error(`[media-usage] Failed to mark ${collection} stale:`, staleError);
|
|
3096
|
-
}
|
|
3097
|
-
}
|
|
3108
|
+
contentIdsToRefresh.push(
|
|
3109
|
+
...(await this.findSyncedSiblingsForUsageRefresh(
|
|
3110
|
+
collection,
|
|
3111
|
+
resolvedId,
|
|
3112
|
+
hydrated.data.item.translationGroup,
|
|
3113
|
+
processedData,
|
|
3114
|
+
)),
|
|
3115
|
+
);
|
|
3098
3116
|
}
|
|
3099
3117
|
await this.refreshContentUsageAfterSuccessfulWrite(collection, contentIdsToRefresh);
|
|
3100
3118
|
} else if (draftStorageChanged) {
|
|
@@ -3107,7 +3125,7 @@ export class EmDashRuntime {
|
|
|
3107
3125
|
|
|
3108
3126
|
// Run afterSave hooks (fire-and-forget)
|
|
3109
3127
|
if (hydrated.success && hydrated.data) {
|
|
3110
|
-
this.runAfterSaveHooks(contentItemToRecord(hydrated.data.item), collection, false);
|
|
3128
|
+
this.runAfterSaveHooks(contentItemToRecord(hydrated.data.item), collection, false, actor);
|
|
3111
3129
|
}
|
|
3112
3130
|
|
|
3113
3131
|
if (hydrated.success) {
|
|
@@ -3224,7 +3242,17 @@ export class EmDashRuntime {
|
|
|
3224
3242
|
) {
|
|
3225
3243
|
const result = await handleContentPublish(this.db, collection, id, options);
|
|
3226
3244
|
if (result.success && result.data) {
|
|
3227
|
-
|
|
3245
|
+
const { item } = result.data;
|
|
3246
|
+
await this.refreshContentUsageAfterSuccessfulWrite(collection, [
|
|
3247
|
+
item.id,
|
|
3248
|
+
...(await this.findSyncedSiblingsForUsageRefresh(
|
|
3249
|
+
collection,
|
|
3250
|
+
item.id,
|
|
3251
|
+
item.translationGroup,
|
|
3252
|
+
item.data,
|
|
3253
|
+
{ absentAsCleared: true },
|
|
3254
|
+
)),
|
|
3255
|
+
]);
|
|
3228
3256
|
}
|
|
3229
3257
|
|
|
3230
3258
|
// Run afterPublish hooks (fire-and-forget)
|
|
@@ -3553,6 +3581,40 @@ export class EmDashRuntime {
|
|
|
3553
3581
|
}
|
|
3554
3582
|
}
|
|
3555
3583
|
|
|
3584
|
+
private async findSyncedSiblingsForUsageRefresh(
|
|
3585
|
+
collection: string,
|
|
3586
|
+
contentId: string,
|
|
3587
|
+
translationGroup: string | null | undefined,
|
|
3588
|
+
data: Record<string, unknown>,
|
|
3589
|
+
options: { absentAsCleared?: boolean } = {},
|
|
3590
|
+
): Promise<string[]> {
|
|
3591
|
+
try {
|
|
3592
|
+
return await findNonTranslatableSiblingContentIds(
|
|
3593
|
+
this.db,
|
|
3594
|
+
collection,
|
|
3595
|
+
contentId,
|
|
3596
|
+
translationGroup,
|
|
3597
|
+
data,
|
|
3598
|
+
options,
|
|
3599
|
+
);
|
|
3600
|
+
} catch (error) {
|
|
3601
|
+
console.error(
|
|
3602
|
+
`[media-usage] Failed to discover synced i18n siblings for ${collection}/${contentId}:`,
|
|
3603
|
+
error,
|
|
3604
|
+
);
|
|
3605
|
+
try {
|
|
3606
|
+
await markContentMediaUsageCollectionStale(
|
|
3607
|
+
this.db,
|
|
3608
|
+
collection,
|
|
3609
|
+
"CONTENT_USAGE_REFRESH_ERROR",
|
|
3610
|
+
);
|
|
3611
|
+
} catch (staleError) {
|
|
3612
|
+
console.error(`[media-usage] Failed to mark ${collection} stale:`, staleError);
|
|
3613
|
+
}
|
|
3614
|
+
return [];
|
|
3615
|
+
}
|
|
3616
|
+
}
|
|
3617
|
+
|
|
3556
3618
|
private async refreshContentUsageAfterSuccessfulWrite(
|
|
3557
3619
|
collection: string,
|
|
3558
3620
|
contentIds: readonly string[],
|
|
@@ -3978,6 +4040,7 @@ export class EmDashRuntime {
|
|
|
3978
4040
|
collection: string,
|
|
3979
4041
|
isNew: boolean,
|
|
3980
4042
|
contentId?: string,
|
|
4043
|
+
actor?: ActorInfo,
|
|
3981
4044
|
) {
|
|
3982
4045
|
let result = content;
|
|
3983
4046
|
|
|
@@ -3988,6 +4051,7 @@ export class EmDashRuntime {
|
|
|
3988
4051
|
try {
|
|
3989
4052
|
const event: ContentHookEvent = { content: result, collection, isNew };
|
|
3990
4053
|
if (contentId !== undefined) event.id = contentId;
|
|
4054
|
+
if (actor !== undefined) event.actor = { ...actor };
|
|
3991
4055
|
const hookResult = await plugin.invokeHook("content:beforeSave", event);
|
|
3992
4056
|
const inspection = inspectSandboxHookResult(hookResult);
|
|
3993
4057
|
if (inspection.kind === "error") {
|
|
@@ -4058,12 +4122,13 @@ export class EmDashRuntime {
|
|
|
4058
4122
|
content: Record<string, unknown>,
|
|
4059
4123
|
collection: string,
|
|
4060
4124
|
isNew: boolean,
|
|
4125
|
+
actor?: ActorInfo,
|
|
4061
4126
|
): void {
|
|
4062
4127
|
after(async () => {
|
|
4063
4128
|
// Trusted plugins
|
|
4064
4129
|
if (this.hooks.hasHooks("content:afterSave")) {
|
|
4065
4130
|
try {
|
|
4066
|
-
await this.hooks.runContentAfterSave(content, collection, isNew);
|
|
4131
|
+
await this.hooks.runContentAfterSave(content, collection, isNew, actor);
|
|
4067
4132
|
} catch (err) {
|
|
4068
4133
|
console.error("EmDash afterSave hook error:", err);
|
|
4069
4134
|
}
|
|
@@ -4078,7 +4143,9 @@ export class EmDashRuntime {
|
|
|
4078
4143
|
tasks.push(
|
|
4079
4144
|
(async () => {
|
|
4080
4145
|
try {
|
|
4081
|
-
|
|
4146
|
+
const event: ContentHookEvent = { content, collection, isNew };
|
|
4147
|
+
if (actor !== undefined) event.actor = { ...actor };
|
|
4148
|
+
await plugin.invokeHook("content:afterSave", event);
|
|
4082
4149
|
} catch (err) {
|
|
4083
4150
|
console.error(`EmDash: Sandboxed plugin ${id} afterSave error:`, err);
|
|
4084
4151
|
}
|
package/src/i18n/resolve.ts
CHANGED
|
@@ -37,9 +37,46 @@ export function resolveLocaleChain(explicit?: string): string[] {
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
const REPEATED_SLASHES = /\/{2,}/g;
|
|
40
|
+
const DATE_TOKEN = /\{(year|month|day|hour|minute|second)\}/g;
|
|
41
|
+
// SQLite-style datetime without timezone info ("2023-05-08 10:00:00").
|
|
42
|
+
// Stored values are UTC; without this, `new Date()` would parse them in the
|
|
43
|
+
// server's local zone and the same row could yield different URLs per host.
|
|
44
|
+
const OFFSETLESS_DATETIME = /^(\d{4}-\d{2}-\d{2})[ T](\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)$/;
|
|
45
|
+
const pad2 = (n: number) => String(n).padStart(2, "0");
|
|
46
|
+
|
|
47
|
+
function parseUtcDate(date: string | Date): Date {
|
|
48
|
+
if (date instanceof Date) return date;
|
|
49
|
+
const offsetless = OFFSETLESS_DATETIME.exec(date);
|
|
50
|
+
return new Date(offsetless ? `${offsetless[1]}T${offsetless[2]}Z` : date);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Substitute WordPress-style date tokens (`{year}`, `{month}`, `{day}`,
|
|
55
|
+
* `{hour}`, `{minute}`, `{second}`) from a publish date. Month/day/time parts
|
|
56
|
+
* are zero-padded, mirroring WordPress (`%monthnum%`, `%day%`, ...). Tokens are
|
|
57
|
+
* left untouched when no valid date is available, so callers without a date
|
|
58
|
+
* (or unpublished entries) never produce a half-resolved URL.
|
|
59
|
+
*/
|
|
60
|
+
function applyDateTokens(path: string, date: string | Date | null | undefined): string {
|
|
61
|
+
const d = date == null ? null : parseUtcDate(date);
|
|
62
|
+
if (!d || Number.isNaN(d.getTime())) return path;
|
|
63
|
+
const parts: Record<string, string> = {
|
|
64
|
+
year: String(d.getUTCFullYear()),
|
|
65
|
+
month: pad2(d.getUTCMonth() + 1),
|
|
66
|
+
day: pad2(d.getUTCDate()),
|
|
67
|
+
hour: pad2(d.getUTCHours()),
|
|
68
|
+
minute: pad2(d.getUTCMinutes()),
|
|
69
|
+
second: pad2(d.getUTCSeconds()),
|
|
70
|
+
};
|
|
71
|
+
return path.replace(DATE_TOKEN, (match, key: string) => parts[key] ?? match);
|
|
72
|
+
}
|
|
40
73
|
|
|
41
74
|
/**
|
|
42
|
-
* Interpolate a collection `url_pattern` with a row's slug and
|
|
75
|
+
* Interpolate a collection `url_pattern` with a row's slug, id and publish date.
|
|
76
|
+
*
|
|
77
|
+
* Supported tokens: `{slug}`, `{id}`, and the date tokens `{year}`,
|
|
78
|
+
* `{month}`, `{day}`, `{hour}`, `{minute}`, `{second}` (resolved from `date`,
|
|
79
|
+
* for WordPress-style permalinks like `/{year}/{month}/{day}/{slug}.html`).
|
|
43
80
|
*
|
|
44
81
|
* Falls back to `/{collection}/{slug}` when no pattern is configured.
|
|
45
82
|
* Does NOT apply any locale prefix — pass the result through
|
|
@@ -51,12 +88,15 @@ export function interpolateUrlPattern(options: {
|
|
|
51
88
|
collection: string;
|
|
52
89
|
slug: string;
|
|
53
90
|
id: string;
|
|
91
|
+
/** Publish date used for date tokens; tokens stay literal when absent. */
|
|
92
|
+
date?: string | Date | null;
|
|
54
93
|
}): string {
|
|
55
|
-
const { pattern, collection, slug, id } = options;
|
|
94
|
+
const { pattern, collection, slug, id, date } = options;
|
|
56
95
|
const basePattern = pattern ?? `/${encodeURIComponent(collection)}/{slug}`;
|
|
57
96
|
let path = basePattern
|
|
58
|
-
.
|
|
59
|
-
.
|
|
97
|
+
.replaceAll("{slug}", encodeURIComponent(slug))
|
|
98
|
+
.replaceAll("{id}", encodeURIComponent(id));
|
|
99
|
+
path = applyDateTokens(path, date);
|
|
60
100
|
path = path.replace(REPEATED_SLASHES, "/");
|
|
61
101
|
if (path.length > 1 && path.endsWith("/")) path = path.slice(0, -1);
|
|
62
102
|
if (!path.startsWith("/")) path = `/${path}`;
|
package/src/index.ts
CHANGED
|
@@ -13,6 +13,8 @@ export type {
|
|
|
13
13
|
UserTable,
|
|
14
14
|
MediaTable,
|
|
15
15
|
} from "./database/index.js";
|
|
16
|
+
export { EmDashConfigurationError } from "./config/errors.js";
|
|
17
|
+
export type { EmDashConfigurationErrorCode } from "./config/errors.js";
|
|
16
18
|
|
|
17
19
|
// Repositories
|
|
18
20
|
export {
|
|
@@ -124,6 +126,10 @@ export type {
|
|
|
124
126
|
PortableTextImageBlock,
|
|
125
127
|
PortableTextCodeBlock,
|
|
126
128
|
PortableTextHtmlBlock,
|
|
129
|
+
PortableTextTableAlignment,
|
|
130
|
+
PortableTextTableBlock,
|
|
131
|
+
PortableTextTableCell,
|
|
132
|
+
PortableTextTableRow,
|
|
127
133
|
PortableTextUnknownBlock,
|
|
128
134
|
ProseMirrorMark,
|
|
129
135
|
ProseMirrorNode,
|
|
@@ -255,6 +261,7 @@ export {
|
|
|
255
261
|
PluginManager,
|
|
256
262
|
createPluginManager,
|
|
257
263
|
PluginRouteError,
|
|
264
|
+
StorageSerializationError,
|
|
258
265
|
ContentSaveRejectedError,
|
|
259
266
|
isContentSaveRejection,
|
|
260
267
|
// Scheduler (Node timer heartbeat — used by virtual:emdash/scheduler)
|
|
@@ -282,6 +289,12 @@ export type {
|
|
|
282
289
|
PluginContext,
|
|
283
290
|
PluginStorageConfig,
|
|
284
291
|
StorageCollection,
|
|
292
|
+
NumericDelta,
|
|
293
|
+
UpdateIfArgs,
|
|
294
|
+
UpdateIfResult,
|
|
295
|
+
VersionedValue,
|
|
296
|
+
ConditionalWriteResult,
|
|
297
|
+
ConditionalDeleteResult,
|
|
285
298
|
KVAccess,
|
|
286
299
|
ContentAccess,
|
|
287
300
|
ContentCreateOptions,
|
|
@@ -297,6 +310,7 @@ export type {
|
|
|
297
310
|
HookName,
|
|
298
311
|
ResolvedHook,
|
|
299
312
|
ResolvedPluginHooks,
|
|
313
|
+
ActorInfo,
|
|
300
314
|
ContentHookEvent,
|
|
301
315
|
ContentDeleteEvent,
|
|
302
316
|
ContentPublishStateChangeEvent,
|
package/src/loader.ts
CHANGED
|
@@ -20,6 +20,7 @@ import { decodeCursor, encodeCursor } from "./database/repositories/types.js";
|
|
|
20
20
|
import { validateIdentifier } from "./database/validate.js";
|
|
21
21
|
import { getI18nConfig } from "./i18n/config.js";
|
|
22
22
|
import type { Database } from "./index.js";
|
|
23
|
+
import { primeSeoPanel } from "./page/seo-panel.js";
|
|
23
24
|
import { getRequestContext } from "./request-context.js";
|
|
24
25
|
import { isMissingColumnError, isMissingTableError } from "./utils/db-errors.js";
|
|
25
26
|
|
|
@@ -1547,16 +1548,25 @@ export function emdashLoader(): LiveLoader<EntryData, EntryFilter, CollectionFil
|
|
|
1547
1548
|
} = foldedHydrationSelects(db, type, "c");
|
|
1548
1549
|
const seoSelect = foldedSeoSelect(db, type, "c");
|
|
1549
1550
|
const booleanFieldsSelect = foldedBooleanFieldsSelect(db, type);
|
|
1551
|
+
// Keep collection-wide metadata in one result column for wide D1 collections.
|
|
1552
|
+
const jsonObject = isPostgres(db) ? sql`json_build_object` : sql`json_object`;
|
|
1553
|
+
const metadataSelect = sql`(
|
|
1554
|
+
SELECT ${jsonObject}(
|
|
1555
|
+
'bylinesExist', _emdash_bylines_exist,
|
|
1556
|
+
'booleanFields', _emdash_boolean_fields
|
|
1557
|
+
)
|
|
1558
|
+
FROM (SELECT ${bylinesExistSelect}, ${booleanFieldsSelect}) AS metadata
|
|
1559
|
+
) AS _emdash_entry_metadata`;
|
|
1550
1560
|
const result = locale
|
|
1551
1561
|
? await sql<Record<string, unknown>>`
|
|
1552
|
-
SELECT c.*, ${seoSelect}, ${termsSelect}, ${bylinesSelect}, ${
|
|
1562
|
+
SELECT c.*, ${seoSelect}, ${termsSelect}, ${bylinesSelect}, ${metadataSelect}
|
|
1553
1563
|
FROM ${sql.ref(tableName)} AS c
|
|
1554
1564
|
WHERE c.deleted_at IS NULL
|
|
1555
1565
|
AND ((c.slug = ${id} AND c.locale = ${locale}) OR c.id = ${id})
|
|
1556
1566
|
LIMIT 1
|
|
1557
1567
|
`.execute(db)
|
|
1558
1568
|
: await sql<Record<string, unknown>>`
|
|
1559
|
-
SELECT c.*, ${seoSelect}, ${termsSelect}, ${bylinesSelect}, ${
|
|
1569
|
+
SELECT c.*, ${seoSelect}, ${termsSelect}, ${bylinesSelect}, ${metadataSelect}
|
|
1560
1570
|
FROM ${sql.ref(tableName)} AS c
|
|
1561
1571
|
WHERE c.deleted_at IS NULL
|
|
1562
1572
|
AND (c.slug = ${id} OR c.id = ${id})
|
|
@@ -1568,6 +1578,15 @@ export function emdashLoader(): LiveLoader<EntryData, EntryFilter, CollectionFil
|
|
|
1568
1578
|
return undefined;
|
|
1569
1579
|
}
|
|
1570
1580
|
|
|
1581
|
+
const rawMetadata = row._emdash_entry_metadata;
|
|
1582
|
+
const metadata: unknown =
|
|
1583
|
+
typeof rawMetadata === "string" ? JSON.parse(rawMetadata) : rawMetadata;
|
|
1584
|
+
delete row._emdash_entry_metadata;
|
|
1585
|
+
if (isPlainObject(metadata)) {
|
|
1586
|
+
row._emdash_bylines_exist = metadata.bylinesExist;
|
|
1587
|
+
row[BOOLEAN_FIELDS_FOLDED_COLUMN] = metadata.booleanFields;
|
|
1588
|
+
}
|
|
1589
|
+
|
|
1571
1590
|
// Expand the folded SEO JSON column onto SEO_COLUMN_ALIASES so
|
|
1572
1591
|
// extractSeo() reads it transparently. Missing/null SEO is a
|
|
1573
1592
|
// no-op: extractSeo() returns null when the aliases are absent.
|
|
@@ -1624,7 +1643,12 @@ export function emdashLoader(): LiveLoader<EntryData, EntryFilter, CollectionFil
|
|
|
1624
1643
|
...mapRevisionData(parsed, parseFoldedBooleanFields(row)),
|
|
1625
1644
|
};
|
|
1626
1645
|
const revSeo = extractSeo(row);
|
|
1627
|
-
if (revSeo)
|
|
1646
|
+
if (revSeo) {
|
|
1647
|
+
revEntryData.seo = revSeo;
|
|
1648
|
+
// SEO comes from the content row, so the panel data is
|
|
1649
|
+
// valid for the entry regardless of the revision shown.
|
|
1650
|
+
primeSeoPanel(type, rowStr(row, "id"), revSeo);
|
|
1651
|
+
}
|
|
1628
1652
|
stashFolded(revEntryData, row);
|
|
1629
1653
|
return {
|
|
1630
1654
|
id: revId,
|
|
@@ -1641,7 +1665,14 @@ export function emdashLoader(): LiveLoader<EntryData, EntryFilter, CollectionFil
|
|
|
1641
1665
|
|
|
1642
1666
|
const entryData = mapRowToData(row, parseFoldedBooleanFields(row));
|
|
1643
1667
|
const entrySeo = extractSeo(row);
|
|
1644
|
-
if (entrySeo)
|
|
1668
|
+
if (entrySeo) {
|
|
1669
|
+
entryData.seo = entrySeo;
|
|
1670
|
+
// Prime the request cache so <EmDashHead> can apply the panel
|
|
1671
|
+
// values without its own _emdash_seo query. Keyed by the
|
|
1672
|
+
// content-row id — the same value templates pass as
|
|
1673
|
+
// page.content.id.
|
|
1674
|
+
primeSeoPanel(type, rowStr(row, "id"), entrySeo);
|
|
1675
|
+
}
|
|
1645
1676
|
stashFolded(entryData, row);
|
|
1646
1677
|
return {
|
|
1647
1678
|
id: entryId,
|
package/src/mcp/server.ts
CHANGED
|
@@ -166,6 +166,9 @@ const schemaUpdateCollectionToolSchema = z.object({
|
|
|
166
166
|
hasSeo: updateCollectionBody.shape.hasSeo.describe(
|
|
167
167
|
"Whether the collection supports SEO metadata",
|
|
168
168
|
),
|
|
169
|
+
group: updateCollectionBody.shape.group.describe(
|
|
170
|
+
"Admin sidebar folder shared with other collections of the same group; pass null to move the collection back inline",
|
|
171
|
+
),
|
|
169
172
|
commentsEnabled: updateCollectionBody.shape.commentsEnabled.describe(
|
|
170
173
|
"Whether comments are enabled for this collection",
|
|
171
174
|
),
|
|
@@ -178,6 +181,9 @@ const schemaUpdateCollectionToolSchema = z.object({
|
|
|
178
181
|
commentsAutoApproveUsers: updateCollectionBody.shape.commentsAutoApproveUsers.describe(
|
|
179
182
|
"Whether comments from authenticated users are automatically approved",
|
|
180
183
|
),
|
|
184
|
+
editLocking: updateCollectionBody.shape.editLocking.describe(
|
|
185
|
+
"Whether opening an entry takes an edit lock that refuses other editors' writes",
|
|
186
|
+
),
|
|
181
187
|
titleField: updateCollectionBody.shape.titleField.describe(
|
|
182
188
|
"Field slug to use as the Title column in admin lists; pass null to fall back to the default",
|
|
183
189
|
),
|
|
@@ -972,7 +978,8 @@ export function createMcpServer(
|
|
|
972
978
|
async (args, extra) => {
|
|
973
979
|
requireScope(extra, "content:write");
|
|
974
980
|
requireRole(extra, Role.CONTRIBUTOR);
|
|
975
|
-
const { emdash, userId } = getExtra(extra);
|
|
981
|
+
const { emdash, userId, userRole } = getExtra(extra);
|
|
982
|
+
const actor = { id: userId, role: userRole };
|
|
976
983
|
|
|
977
984
|
// Creating a translation requires edit permission on the source item
|
|
978
985
|
if (args.translationOf) {
|
|
@@ -990,7 +997,7 @@ export function createMcpServer(
|
|
|
990
997
|
|
|
991
998
|
// Publishing requires publish permission — create as draft then publish
|
|
992
999
|
if (args.status === "published") {
|
|
993
|
-
const user = { id: userId, role:
|
|
1000
|
+
const user = { id: userId, role: userRole };
|
|
994
1001
|
if (!hasPermission(user, "content:publish_own")) {
|
|
995
1002
|
throw new EmDashAuthError(
|
|
996
1003
|
"Insufficient permissions: publishing requires content:publish_own",
|
|
@@ -1005,6 +1012,7 @@ export function createMcpServer(
|
|
|
1005
1012
|
translationOf: args.translationOf,
|
|
1006
1013
|
bylines: args.bylines,
|
|
1007
1014
|
taxonomies: args.taxonomies,
|
|
1015
|
+
actor,
|
|
1008
1016
|
});
|
|
1009
1017
|
if (!result.success) return unwrap(result);
|
|
1010
1018
|
const itemId = extractContentId(result.data);
|
|
@@ -1023,6 +1031,7 @@ export function createMcpServer(
|
|
|
1023
1031
|
translationOf: args.translationOf,
|
|
1024
1032
|
bylines: args.bylines,
|
|
1025
1033
|
taxonomies: args.taxonomies,
|
|
1034
|
+
actor,
|
|
1026
1035
|
}),
|
|
1027
1036
|
);
|
|
1028
1037
|
},
|
|
@@ -1100,6 +1109,7 @@ export function createMcpServer(
|
|
|
1100
1109
|
requireScope(extra, "content:write");
|
|
1101
1110
|
requireRole(extra, Role.AUTHOR);
|
|
1102
1111
|
const { emdash, userId, userRole } = getExtra(extra);
|
|
1112
|
+
const actor = { id: userId, role: userRole };
|
|
1103
1113
|
|
|
1104
1114
|
// Fetch item to check ownership
|
|
1105
1115
|
const existing = await emdash.handleContentGet(args.collection, args.id, args.locale);
|
|
@@ -1143,7 +1153,7 @@ export function createMcpServer(
|
|
|
1143
1153
|
const updateResult = await emdash.handleContentUpdate(args.collection, resolvedId, {
|
|
1144
1154
|
data,
|
|
1145
1155
|
slug: args.slug,
|
|
1146
|
-
|
|
1156
|
+
actor,
|
|
1147
1157
|
locale: args.locale,
|
|
1148
1158
|
seo: args.seo,
|
|
1149
1159
|
bylines: args.bylines,
|
|
@@ -1173,7 +1183,7 @@ export function createMcpServer(
|
|
|
1173
1183
|
const updateResult = await emdash.handleContentUpdate(args.collection, resolvedId, {
|
|
1174
1184
|
data,
|
|
1175
1185
|
slug: args.slug,
|
|
1176
|
-
|
|
1186
|
+
actor,
|
|
1177
1187
|
locale: args.locale,
|
|
1178
1188
|
seo: args.seo,
|
|
1179
1189
|
bylines: args.bylines,
|
|
@@ -1193,7 +1203,7 @@ export function createMcpServer(
|
|
|
1193
1203
|
await emdash.handleContentUpdate(args.collection, resolvedId, {
|
|
1194
1204
|
data,
|
|
1195
1205
|
slug: args.slug,
|
|
1196
|
-
|
|
1206
|
+
actor,
|
|
1197
1207
|
locale: args.locale,
|
|
1198
1208
|
seo: args.seo,
|
|
1199
1209
|
bylines: args.bylines,
|
|
@@ -1877,6 +1887,12 @@ export function createMcpServer(
|
|
|
1877
1887
|
routable: createCollectionBody.shape.routable.describe(
|
|
1878
1888
|
"Require a slug before publishing (default: true)",
|
|
1879
1889
|
),
|
|
1890
|
+
editLocking: createCollectionBody.shape.editLocking.describe(
|
|
1891
|
+
"Take an edit lock when an entry is opened (default: true)",
|
|
1892
|
+
),
|
|
1893
|
+
group: createCollectionBody.shape.group.describe(
|
|
1894
|
+
"Admin sidebar folder shared with other collections of the same group",
|
|
1895
|
+
),
|
|
1880
1896
|
}),
|
|
1881
1897
|
},
|
|
1882
1898
|
async (args, extra) => {
|
|
@@ -1896,6 +1912,8 @@ export function createMcpServer(
|
|
|
1896
1912
|
// ['drafts', 'revisions'] when undefined; pass through verbatim.
|
|
1897
1913
|
supports: args.supports,
|
|
1898
1914
|
routable: args.routable,
|
|
1915
|
+
editLocking: args.editLocking,
|
|
1916
|
+
group: args.group,
|
|
1899
1917
|
});
|
|
1900
1918
|
ec.invalidateUrlPatternCache();
|
|
1901
1919
|
return jsonResult(collection);
|
package/src/media/responsive.ts
CHANGED
|
@@ -32,6 +32,29 @@ export function responsiveSizes(width: number | undefined): string {
|
|
|
32
32
|
return width ? `(min-width: ${width}px) ${width}px, 100vw` : "100vw";
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
+
/** Column count `Gallery.astro` uses when a gallery block does not set one. */
|
|
36
|
+
export const GALLERY_DEFAULT_COLUMNS = 3;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Build the `sizes` attribute for one cell of a Portable Text gallery.
|
|
40
|
+
*
|
|
41
|
+
* Mirrors the gallery's CSS: `columns` equal cells with a `1rem` gap, and two
|
|
42
|
+
* columns at `640px` and below. Each cell is estimated against the viewport, so
|
|
43
|
+
* a gallery inside a narrower content column still gets a larger slot than it
|
|
44
|
+
* renders at; pass `sizes` to `Gallery` when the container width is known.
|
|
45
|
+
*/
|
|
46
|
+
export function gallerySizes(columns: number | undefined): string {
|
|
47
|
+
const count =
|
|
48
|
+
typeof columns === "number" && Number.isInteger(columns) && columns > 0
|
|
49
|
+
? columns
|
|
50
|
+
: GALLERY_DEFAULT_COLUMNS;
|
|
51
|
+
return `(max-width: 640px) ${galleryCell(2)}, ${galleryCell(count)}`;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function galleryCell(columns: number): string {
|
|
55
|
+
return columns === 1 ? "100vw" : `calc((100vw - ${columns - 1}rem) / ${columns})`;
|
|
56
|
+
}
|
|
57
|
+
|
|
35
58
|
/**
|
|
36
59
|
* Make a same-origin media URL absolute so Astro's image service can optimize it.
|
|
37
60
|
*
|