emdash 0.36.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-CzL3H752.d.mts → adapters-DCEgOBXi.d.mts} +4 -2
- package/dist/{adapters-CzL3H752.d.mts.map → adapters-DCEgOBXi.d.mts.map} +1 -1
- package/dist/{allowed-origins-maylGaHv.mjs → allowed-origins-GFUVavRj.mjs} +2 -2
- package/dist/{allowed-origins-maylGaHv.mjs.map → allowed-origins-GFUVavRj.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -3
- package/dist/api/route-utils.mjs +25 -24
- 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-BvxJmnFY.mjs +10094 -0
- package/dist/api-BvxJmnFY.mjs.map +1 -0
- package/dist/{api-tokens-9YrrCoE6.mjs → api-tokens-xpGqMHrC.mjs} +2 -2
- package/dist/{api-tokens-9YrrCoE6.mjs.map → api-tokens-xpGqMHrC.mjs.map} +1 -1
- package/dist/{apply-B_VMpJ2P.mjs → apply-DLmM3R7f.mjs} +26 -22
- package/dist/apply-DLmM3R7f.mjs.map +1 -0
- package/dist/artifact-fetch-P2JXVwOq.mjs +972 -0
- package/dist/artifact-fetch-P2JXVwOq.mjs.map +1 -0
- package/dist/astro/image-endpoint.mjs +2 -2
- package/dist/astro/image-endpoint.mjs.map +1 -1
- package/dist/astro/index.d.mts +12 -12
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +138 -39
- 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 +223 -232
- 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.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +5 -5
- package/dist/astro/routes/api/admin/api-tokens/index.mjs.map +1 -1
- 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 +17 -17
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +17 -17
- package/dist/astro/routes/api/admin/bylines/index.mjs +17 -17
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +13 -13
- package/dist/astro/routes/api/admin/comments/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/comments/bulk.mjs +10 -10
- package/dist/astro/routes/api/admin/comments/counts.mjs +5 -5
- package/dist/astro/routes/api/admin/comments/index.mjs +10 -10
- 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 +14 -14
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +17 -17
- 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 +4 -4
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +4 -4
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +59 -56
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +59 -56
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +57 -54
- 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 +57 -54
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +58 -55
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +58 -55
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +57 -54
- 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 +57 -54
- 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 +58 -55
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +57 -54
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +58 -55
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +64 -57
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +18 -16
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +65 -58
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/verify.d.mts +8 -0
- package/dist/astro/routes/api/admin/plugins/registry/verify.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +96 -0
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -0
- package/dist/astro/routes/api/admin/plugins/updates.mjs +57 -54
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +57 -54
- 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 +57 -54
- 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 +14 -14
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +13 -13
- 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 +19 -5
- 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 +18 -10
- 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 +20 -18
- 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 +20 -18
- 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 +16 -15
- 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 +19 -5
- 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 +8 -8
- 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 +18 -18
- 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 +15 -14
- 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 +18 -18
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +29 -28
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
- package/dist/astro/routes/api/manifest.mjs +4 -4
- package/dist/astro/routes/api/manifest.mjs.map +1 -1
- package/dist/astro/routes/api/mcp.mjs +213 -74
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +11 -11
- package/dist/astro/routes/api/media/_id_/replace.d.mts +8 -0
- package/dist/astro/routes/api/media/_id_/replace.d.mts.map +1 -0
- package/dist/astro/routes/api/media/_id_/replace.mjs +91 -0
- package/dist/astro/routes/api/media/_id_/replace.mjs.map +1 -0
- package/dist/astro/routes/api/media/_id_/upload.mjs +6 -6
- package/dist/astro/routes/api/media/_id_/usage.mjs +19 -19
- package/dist/astro/routes/api/media/_id_.mjs +18 -18
- package/dist/astro/routes/api/media/file/_...key_.d.mts.map +1 -1
- package/dist/astro/routes/api/media/file/_...key_.mjs +3 -2
- package/dist/astro/routes/api/media/file/_...key_.mjs.map +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 +16 -14
- package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
- package/dist/astro/routes/api/media.d.mts.map +1 -1
- package/dist/astro/routes/api/media.mjs +53 -30
- package/dist/astro/routes/api/media.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +20 -13
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items.mjs +15 -11
- package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/reorder.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +15 -11
- package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/translations.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/translations.mjs +16 -12
- package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_.mjs +21 -14
- package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/index.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/index.mjs +15 -11
- package/dist/astro/routes/api/menus/index.mjs.map +1 -1
- 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 +184 -52
- 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 +20 -18
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/translations.mjs +15 -13
- package/dist/astro/routes/api/relations/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/relations/index.mjs +20 -18
- 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 +57 -54
- 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 +57 -54
- 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 +57 -54
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +57 -54
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +57 -54
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/reorder.mjs +57 -54
- 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 +57 -54
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +57 -54
- 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 +5 -5
- package/dist/astro/routes/api/settings/email.mjs.map +1 -1
- package/dist/astro/routes/api/settings.d.mts.map +1 -1
- package/dist/astro/routes/api/settings.mjs +21 -17
- package/dist/astro/routes/api/settings.mjs.map +1 -1
- 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 +35 -33
- 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 +35 -33
- 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.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +22 -17
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +23 -18
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +27 -19
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +22 -17
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_.mjs +28 -20
- package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +22 -17
- 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.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +10 -8
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +18 -14
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +16 -13
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.mjs +9 -7
- package/dist/astro/routes/api/widget-areas/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/index.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/index.mjs +16 -13
- package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
- package/dist/astro/routes/api/widget-components.mjs +2 -2
- package/dist/astro/routes/robots.txt.mjs +8 -8
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +13 -12
- package/dist/astro/routes/sitemap-_collection_.xml.mjs.map +1 -1
- package/dist/astro/routes/sitemap.xml.mjs +9 -9
- package/dist/astro/types.d.mts +50 -20
- 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-ByYs-Uxs.mjs → authorize-C2QHlWSS.mjs} +2 -2
- package/dist/{authorize-ByYs-Uxs.mjs.map → authorize-C2QHlWSS.mjs.map} +1 -1
- package/dist/{backup-ChyHfIoX.mjs → backup-oS8ft5Cm.mjs} +5 -5
- package/dist/{backup-ChyHfIoX.mjs.map → backup-oS8ft5Cm.mjs.map} +1 -1
- package/dist/{bundle-DZFhFurR.mjs → bundle-CL0JjIPx.mjs} +4 -4
- package/dist/{bundle-DZFhFurR.mjs.map → bundle-CL0JjIPx.mjs.map} +1 -1
- package/dist/{byline-Cpnwrje1.mjs → byline-Vdi85CsZ.mjs} +27 -14
- package/dist/byline-Vdi85CsZ.mjs.map +1 -0
- package/dist/{byline-fields-CAyA_Umd.mjs → byline-fields-DPVRFMz2.mjs} +2 -2
- package/dist/{byline-fields-CAyA_Umd.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-BSo9B9RX.mjs → bylines-BX8QhcTk.mjs} +7 -7
- package/dist/{bylines-BSo9B9RX.mjs.map → bylines-BX8QhcTk.mjs.map} +1 -1
- package/dist/{bylines-CHjvehVX.mjs → bylines-w-E1IEQd.mjs} +3 -3
- package/dist/{bylines-CHjvehVX.mjs.map → bylines-w-E1IEQd.mjs.map} +1 -1
- package/dist/{cache-5VirJ2Cn.mjs → cache--7HKu5Xm.mjs} +4 -4
- package/dist/{cache-5VirJ2Cn.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-D5pSY2S1.mjs → challenge-store-BIOak-tp.mjs} +5 -3
- package/dist/challenge-store-BIOak-tp.mjs.map +1 -0
- package/dist/chrome-tags-DzDQBCjX.mjs +24 -0
- package/dist/chrome-tags-DzDQBCjX.mjs.map +1 -0
- package/dist/{chunks-bNiX6_DR.mjs → chunks-VG_tyqnP.mjs} +2 -2
- package/dist/{chunks-bNiX6_DR.mjs.map → chunks-VG_tyqnP.mjs.map} +1 -1
- package/dist/cli/index.mjs +68 -40
- 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-m_oi2c0N.mjs → collection-deletion-BCwaWTDw.mjs} +4 -4
- package/dist/{collection-deletion-m_oi2c0N.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-CRuItEjt.mjs → comment-reaction-CDyvPQRj.mjs} +2 -2
- package/dist/{comment-reaction-CRuItEjt.mjs.map → comment-reaction-CDyvPQRj.mjs.map} +1 -1
- package/dist/{comment-DhvLEdhQ.mjs → comment-vxOzWbZN.mjs} +2 -2
- package/dist/{comment-DhvLEdhQ.mjs.map → comment-vxOzWbZN.mjs.map} +1 -1
- package/dist/{comments-CLj4bi8I.mjs → comments-VzmVLyaC.mjs} +2 -2
- package/dist/{comments-CLj4bi8I.mjs.map → comments-VzmVLyaC.mjs.map} +1 -1
- package/dist/{components-v4U4DT2y.mjs → components-CL6Wkdk-.mjs} +1 -1
- package/dist/{components-v4U4DT2y.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-DWbJrsAg.d.mts → config-CGAhyOjP.d.mts} +276 -76
- package/dist/config-CGAhyOjP.d.mts.map +1 -0
- package/dist/{config-DrfghTPe.d.mts → config-ChFzshGd.d.mts} +1 -1
- package/dist/{config-DrfghTPe.d.mts.map → config-ChFzshGd.d.mts.map} +1 -1
- package/dist/{content-CP-SeXNa.mjs → content-CNfMWuhY.mjs} +202 -46
- package/dist/content-CNfMWuhY.mjs.map +1 -0
- package/dist/{content-list-query-BhejKVqb.d.mts → content-list-query-B8d4UQp9.d.mts} +1 -1
- package/dist/{content-list-query-BhejKVqb.d.mts.map → content-list-query-B8d4UQp9.d.mts.map} +1 -1
- package/dist/{content-refresh-DLOfIhYc.mjs → content-refresh-GTMyi2Xy.mjs} +53 -26
- package/dist/content-refresh-GTMyi2Xy.mjs.map +1 -0
- package/dist/{content-repair-BCxzy0r4.mjs → content-repair-CIMt5C0U.mjs} +4 -4
- package/dist/{content-repair-BCxzy0r4.mjs.map → content-repair-CIMt5C0U.mjs.map} +1 -1
- package/dist/{context-BR5hRWiK.mjs → context-C9PB8vGd.mjs} +308 -33
- package/dist/context-C9PB8vGd.mjs.map +1 -0
- package/dist/{cron-CWfWrWKG.mjs → cron-DHAy9oyq.mjs} +1 -1
- package/dist/{cron-CWfWrWKG.mjs.map → cron-DHAy9oyq.mjs.map} +1 -1
- package/dist/{dashboard-CkIV2rnQ.mjs → dashboard-BNSvAN8A.mjs} +5 -5
- package/dist/{dashboard-CkIV2rnQ.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/index.mjs.map +1 -1
- 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/postgres.d.mts.map +1 -1
- package/dist/db/postgres.mjs +19 -3
- package/dist/db/postgres.mjs.map +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-YMEfcQUx.mjs → default-ByZ0JqZo.mjs} +1 -1
- package/dist/{default-YMEfcQUx.mjs.map → default-ByZ0JqZo.mjs.map} +1 -1
- package/dist/{deferred-tasks-DfqxH5Xf.d.mts → deferred-tasks-Cu4NSJpa.d.mts} +1 -1
- package/dist/{deferred-tasks-DfqxH5Xf.d.mts.map → deferred-tasks-Cu4NSJpa.d.mts.map} +1 -1
- package/dist/dev-typegen-DHT7lcMU.mjs +29 -0
- package/dist/dev-typegen-DHT7lcMU.mjs.map +1 -0
- package/dist/{device-flow-CojjSBwb.mjs → device-flow-Cf6bhCCT.mjs} +4 -4
- package/dist/{device-flow-CojjSBwb.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-BWeWiRYB.mjs → direct-executor-yAyUGSqB.mjs} +3 -3
- package/dist/{direct-executor-BWeWiRYB.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-CEJgR_LB.mjs → email-console-DNup1Fku.mjs} +1 -1
- package/dist/{email-console-CEJgR_LB.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-C7B46bcU.d.mts → entry-lock-CGAtrwAR.d.mts} +265 -76
- package/dist/entry-lock-CGAtrwAR.d.mts.map +1 -0
- package/dist/{redirects-CRIM55KH.mjs → entry-lock-DIYHAaSw.mjs} +112 -34
- 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-D9w94fjV.mjs → error-BDcFyoRt.mjs} +2 -2
- package/dist/{error-D9w94fjV.mjs.map → error-BDcFyoRt.mjs.map} +1 -1
- package/dist/{errors-n2j49uNf.mjs → errors-DvMdNrgf.mjs} +10 -1
- package/dist/errors-DvMdNrgf.mjs.map +1 -0
- package/dist/{escape-DN4Qmjsl.mjs → escape-B3asJC6W.mjs} +1 -1
- package/dist/{escape-DN4Qmjsl.mjs.map → escape-B3asJC6W.mjs.map} +1 -1
- package/dist/{field-defs-cache-Bh4q6oar.mjs → field-defs-cache-Cf5FHK0M.mjs} +5 -5
- package/dist/{field-defs-cache-Bh4q6oar.mjs.map → field-defs-cache-Cf5FHK0M.mjs.map} +1 -1
- package/dist/{fts-manager-BhOdW0bi.mjs → fts-manager-iddym8cd.mjs} +4 -4
- package/dist/{fts-manager-BhOdW0bi.mjs.map → fts-manager-iddym8cd.mjs.map} +1 -1
- package/dist/{hash-CTcngWvj.mjs → hash-BRweX6jz.mjs} +1 -1
- package/dist/{hash-CTcngWvj.mjs.map → hash-BRweX6jz.mjs.map} +1 -1
- package/dist/hook-result-BrshYHLx.d.mts +31 -0
- package/dist/hook-result-BrshYHLx.d.mts.map +1 -0
- package/dist/{hreflang-7pTHsLZJ.d.mts → hreflang-CQpu5bMy.d.mts} +2 -2
- package/dist/{hreflang-7pTHsLZJ.d.mts.map → hreflang-CQpu5bMy.d.mts.map} +1 -1
- package/dist/{hreflang-Huc6O5wa.mjs → hreflang-DshnweTC.mjs} +9 -8
- package/dist/{hreflang-Huc6O5wa.mjs.map → hreflang-DshnweTC.mjs.map} +1 -1
- package/dist/{identity-DXmb4aVp.mjs → identity-CjGKDq8J.mjs} +3 -3
- package/dist/{identity-DXmb4aVp.mjs.map → identity-CjGKDq8J.mjs.map} +1 -1
- package/dist/{import-C4_O3KXU.mjs → import-D96g2otw.mjs} +6 -6
- package/dist/{import-C4_O3KXU.mjs.map → import-D96g2otw.mjs.map} +1 -1
- package/dist/{index-6bRee8zb.d.mts → index-1ECYpfiF.d.mts} +3 -3
- package/dist/{index-6bRee8zb.d.mts.map → index-1ECYpfiF.d.mts.map} +1 -1
- package/dist/index.d.mts +22 -21
- package/dist/index.mjs +84 -81
- 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-Bo7fZAbg.mjs → load-DPtY9cZo.mjs} +2 -2
- package/dist/{load-Bo7fZAbg.mjs.map → load-DPtY9cZo.mjs.map} +1 -1
- package/dist/{loader-ZsjE4paL.mjs → loader-WJi6GFRn.mjs} +90 -17
- package/dist/loader-WJi6GFRn.mjs.map +1 -0
- package/dist/{manifest-builder-QXuqvVMP.mjs → manifest-builder-BfNlGQIA.mjs} +2 -2
- package/dist/{manifest-builder-QXuqvVMP.mjs.map → manifest-builder-BfNlGQIA.mjs.map} +1 -1
- package/dist/{manifest-schema-CUYPfCEH.mjs → manifest-schema-CILooI5J.mjs} +5 -5
- package/dist/manifest-schema-CILooI5J.mjs.map +1 -0
- package/dist/media/image-endpoint.d.mts +4 -2
- package/dist/media/image-endpoint.d.mts.map +1 -1
- package/dist/media/image-endpoint.mjs +6 -4
- package/dist/media/image-endpoint.mjs.map +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 +7 -7
- package/dist/{media-D6SeAfBl.mjs → media-BBm8Wg3f.mjs} +30 -2
- package/dist/media-BBm8Wg3f.mjs.map +1 -0
- package/dist/{media-BjwNuLEu.mjs → media-C1EIZKh1.mjs} +35 -5
- package/dist/media-C1EIZKh1.mjs.map +1 -0
- package/dist/{media-allowlist-D35v7bmL.mjs → media-allowlist-elXJgb_K.mjs} +2 -2
- package/dist/{media-allowlist-D35v7bmL.mjs.map → media-allowlist-elXJgb_K.mjs.map} +1 -1
- package/dist/{media-folders-D-0CmRZj.mjs → media-folders-DASfX_DH.mjs} +1 -1
- package/dist/{media-folders-D-0CmRZj.mjs.map → media-folders-DASfX_DH.mjs.map} +1 -1
- package/dist/{media-upload-C7bLXGcI.mjs → media-upload-C7_AQJ5v.mjs} +9 -9
- package/dist/{media-upload-C7bLXGcI.mjs.map → media-upload-C7_AQJ5v.mjs.map} +1 -1
- package/dist/{media-url-DH7giMx_.mjs → media-url-8dVl1loq.mjs} +19 -2
- package/dist/media-url-8dVl1loq.mjs.map +1 -0
- package/dist/{media-usage-BTRJvS6V.mjs → media-usage-C1EswMTq.mjs} +10 -10
- package/dist/{media-usage-BTRJvS6V.mjs.map → media-usage-C1EswMTq.mjs.map} +1 -1
- package/dist/{media-usage-activation-Dx0kPV6b.mjs → media-usage-activation-CrHNltlL.mjs} +3 -3
- package/dist/{media-usage-activation-Dx0kPV6b.mjs.map → media-usage-activation-CrHNltlL.mjs.map} +1 -1
- package/dist/{media-usage-work-C-fhM30c.mjs → media-usage-work-C5B1zT1c.mjs} +2 -2
- package/dist/{media-usage-work-C-fhM30c.mjs.map → media-usage-work-C5B1zT1c.mjs.map} +1 -1
- package/dist/{media-usage-work-DWb2XPMI.mjs → media-usage-work-IkQx_Yz6.mjs} +4 -4
- package/dist/{media-usage-work-DWb2XPMI.mjs.map → media-usage-work-IkQx_Yz6.mjs.map} +1 -1
- package/dist/{media-usage-write-fence-BwoJVRDC.mjs → media-usage-write-fence-B9anjOSg.mjs} +3 -3
- package/dist/{media-usage-write-fence-BwoJVRDC.mjs.map → media-usage-write-fence-B9anjOSg.mjs.map} +1 -1
- package/dist/{menus-CNg0QlDt.mjs → menus-D8mC4eaN.mjs} +406 -175
- package/dist/menus-D8mC4eaN.mjs.map +1 -0
- package/dist/{menus-CD7EFLwz.mjs → menus-UdwjHZJC.mjs} +12 -4
- package/dist/{menus-CD7EFLwz.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-DaUM_MB2.mjs → mode-Dm4BHhRH.mjs} +1 -1
- package/dist/{mode-DaUM_MB2.mjs.map → mode-Dm4BHhRH.mjs.map} +1 -1
- package/dist/{node-sqlite-compat-Udb4Y-rs.mjs → node-sqlite-compat-2sezm-Zd.mjs} +1 -1
- package/dist/{node-sqlite-compat-Udb4Y-rs.mjs.map → node-sqlite-compat-2sezm-Zd.mjs.map} +1 -1
- package/dist/{normalize-CSxdKBVa.mjs → normalize-4nkKGsuW.mjs} +15 -5
- package/dist/normalize-4nkKGsuW.mjs.map +1 -0
- package/dist/{oauth-authorization-Dpsb-fMJ.mjs → oauth-authorization-BxE_lURD.mjs} +4 -4
- package/dist/{oauth-authorization-Dpsb-fMJ.mjs.map → oauth-authorization-BxE_lURD.mjs.map} +1 -1
- package/dist/{oauth-clients-Bxnoe_67.mjs → oauth-clients-DJIdOdq0.mjs} +1 -1
- package/dist/{oauth-clients-Bxnoe_67.mjs.map → oauth-clients-DJIdOdq0.mjs.map} +1 -1
- package/dist/{oauth-state-store-0C4s0K6w.mjs → oauth-state-store-CsdxP57n.mjs} +1 -1
- package/dist/{oauth-state-store-0C4s0K6w.mjs.map → oauth-state-store-CsdxP57n.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-wlGYSeqX.mjs → oauth-user-lookup-HzzW-dkF.mjs} +1 -1
- package/dist/{oauth-user-lookup-wlGYSeqX.mjs.map → oauth-user-lookup-HzzW-dkF.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/{object-cache-71tPfV4A.mjs → object-cache-DVKnyOfy.mjs} +19 -3
- package/dist/object-cache-DVKnyOfy.mjs.map +1 -0
- package/dist/{options-BHPeIbBd.mjs → options-D1FBiAv1.mjs} +60 -5
- package/dist/options-D1FBiAv1.mjs.map +1 -0
- package/dist/{options-BhZIeFY1.d.mts → options-D8Y0VHc7.d.mts} +30 -11
- 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-BRJg1kz8.mjs → parse-WRg5C3NX.mjs} +2 -2
- package/dist/{parse-BRJg1kz8.mjs.map → parse-WRg5C3NX.mjs.map} +1 -1
- package/dist/{passkey-config-B3P0nHRR.mjs → passkey-config-qIdO-wF6.mjs} +1 -1
- package/dist/{passkey-config-B3P0nHRR.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-BR4ZhVJl.d.mts → placeholder-COrvARyD.d.mts} +1 -1
- package/dist/{placeholder-BR4ZhVJl.d.mts.map → placeholder-COrvARyD.d.mts.map} +1 -1
- package/dist/plugin-types.d.mts +8 -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-BVRganJQ.mjs → policy-XCfb-IE9.mjs} +2 -2
- package/dist/{policy-BVRganJQ.mjs.map → policy-XCfb-IE9.mjs.map} +1 -1
- package/dist/{portable-text-C8Tvp4_g.mjs → portable-text-BS3d5n-0.mjs} +1 -1
- package/dist/{portable-text-C8Tvp4_g.mjs.map → portable-text-BS3d5n-0.mjs.map} +1 -1
- package/dist/{preview-dn2dUyM0.mjs → preview-BxwsGgGp.mjs} +2 -2
- package/dist/{preview-dn2dUyM0.mjs.map → preview-BxwsGgGp.mjs.map} +1 -1
- package/dist/{protocol-CuBEsqgE.d.mts → protocol-CLn58-nw.d.mts} +2 -2
- package/dist/{protocol-CuBEsqgE.d.mts.map → protocol-CLn58-nw.d.mts.map} +1 -1
- package/dist/{public-url-DRz_AinV.mjs → public-url-FWWAvnre.mjs} +1 -1
- package/dist/{public-url-DRz_AinV.mjs.map → public-url-FWWAvnre.mjs.map} +1 -1
- package/dist/{query-D18vTdha.mjs → query-DygOte9M.mjs} +26 -17
- package/dist/query-DygOte9M.mjs.map +1 -0
- package/dist/{query-tZDEdtCN.mjs → query-gtXT03Wc.mjs} +5 -5
- package/dist/{query-tZDEdtCN.mjs.map → query-gtXT03Wc.mjs.map} +1 -1
- package/dist/{rate-limit-on7KPo-v.mjs → rate-limit-CQUPm0dh.mjs} +2 -2
- package/dist/{rate-limit-on7KPo-v.mjs.map → rate-limit-CQUPm0dh.mjs.map} +1 -1
- package/dist/{redirect-DrbEmU9a.mjs → redirect-D1cWafi6.mjs} +1 -1
- package/dist/{redirect-DrbEmU9a.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-BahWiu8Z.mjs → redirects-DN-ZE33W.mjs} +5 -5
- package/dist/{redirects-BahWiu8Z.mjs.map → redirects-DN-ZE33W.mjs.map} +1 -1
- package/dist/{registry-Cx-jEJOS.mjs → registry-DTqaqxed.mjs} +46 -12
- package/dist/registry-DTqaqxed.mjs.map +1 -0
- package/dist/{relation-A6wLF_DS.mjs → relation-DxgCHOBw.mjs} +2 -2
- package/dist/{relation-A6wLF_DS.mjs.map → relation-DxgCHOBw.mjs.map} +1 -1
- package/dist/{relations-Cj5hZ6Zg.mjs → relations-KKDSLUwS.mjs} +4 -4
- package/dist/{relations-Cj5hZ6Zg.mjs.map → relations-KKDSLUwS.mjs.map} +1 -1
- package/dist/{relations-BTPM2saV.mjs → relations-rOmbndUJ.mjs} +8 -8
- package/dist/relations-rOmbndUJ.mjs.map +1 -0
- 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-DRp5ENd_.mjs → request-meta-BgjUQLQ-.mjs} +2 -2
- package/dist/{request-meta-DRp5ENd_.mjs.map → request-meta-BgjUQLQ-.mjs.map} +1 -1
- package/dist/{resolve-DxUpTMmE.mjs → resolve-Cy0aWSRj.mjs} +37 -4
- package/dist/resolve-Cy0aWSRj.mjs.map +1 -0
- package/dist/{runner-zgqA_CqP.d.mts → runner-CfwysRM0.d.mts} +3 -2
- package/dist/runner-CfwysRM0.d.mts.map +1 -0
- package/dist/{runner-77GOZCnH.mjs → runner-nEzvnogG.mjs} +476 -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-BY-oVntF.mjs → schema-CRu38Pr5.mjs} +3 -3
- package/dist/{schema-BY-oVntF.mjs.map → schema-CRu38Pr5.mjs.map} +1 -1
- package/dist/{schema-Cw9kVK0I.mjs → schema-DifxndJx.mjs} +5 -5
- package/dist/{schema-Cw9kVK0I.mjs.map → schema-DifxndJx.mjs.map} +1 -1
- package/dist/{scopes-vMR1uIbt.mjs → scopes-D5A1OZbq.mjs} +3 -3
- package/dist/{scopes-vMR1uIbt.mjs.map → scopes-D5A1OZbq.mjs.map} +1 -1
- package/dist/{search-CfT3KxO5.mjs → search-DEPFSBFq.mjs} +4 -4
- package/dist/{search-CfT3KxO5.mjs.map → search-DEPFSBFq.mjs.map} +1 -1
- package/dist/{secrets-BH2Qow1-.mjs → secrets-CdfzLdoO.mjs} +3 -3
- package/dist/{secrets-BH2Qow1-.mjs.map → secrets-CdfzLdoO.mjs.map} +1 -1
- package/dist/{sections-DTfjyf1z.mjs → sections-3X52kmIR.mjs} +2 -2
- package/dist/{sections-DTfjyf1z.mjs.map → sections-3X52kmIR.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +28 -26
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.d.mts.map +1 -1
- package/dist/seo/index.mjs +20 -21
- package/dist/seo/index.mjs.map +1 -1
- package/dist/{seo-Cm-dtvgk.mjs → seo-Bw68KxRc.mjs} +3 -3
- package/dist/{seo-Cm-dtvgk.mjs.map → seo-Bw68KxRc.mjs.map} +1 -1
- package/dist/{seo-BSiTIXzd.mjs → seo-C4AmbsMU.mjs} +3 -2
- package/dist/seo-C4AmbsMU.mjs.map +1 -0
- package/dist/{service-DYsDHEKe.mjs → service-J_-Vgo7R.mjs} +3 -3
- package/dist/{service-DYsDHEKe.mjs.map → service-J_-Vgo7R.mjs.map} +1 -1
- package/dist/{session-user-CNAfvsdw.mjs → session-user-CbnMMwk6.mjs} +1 -1
- package/dist/{session-user-CNAfvsdw.mjs.map → session-user-CbnMMwk6.mjs.map} +1 -1
- package/dist/{settings-DjtkUo__.mjs → settings-AnEFYICn.mjs} +3 -3
- package/dist/{settings-DjtkUo__.mjs.map → settings-AnEFYICn.mjs.map} +1 -1
- package/dist/{settings-BgN-0DT-.mjs → settings-DcMjREe5.mjs} +21 -8
- package/dist/settings-DcMjREe5.mjs.map +1 -0
- package/dist/{setup-complete-CcpXaPU7.mjs → setup-complete-BClXXTvr.mjs} +2 -2
- package/dist/{setup-complete-CcpXaPU7.mjs.map → setup-complete-BClXXTvr.mjs.map} +1 -1
- package/dist/{setup-nonce-Reyw30jg.mjs → setup-nonce-BheRa4RG.mjs} +1 -1
- package/dist/{setup-nonce-Reyw30jg.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-Cs_V9n3V.mjs → site-url-Bqf-ea3N.mjs} +3 -3
- package/dist/{site-url-Cs_V9n3V.mjs.map → site-url-Bqf-ea3N.mjs.map} +1 -1
- package/dist/{snapshot-DSB8P7Lm.mjs → snapshot-C4CtXntb.mjs} +51 -35
- package/dist/snapshot-C4CtXntb.mjs.map +1 -0
- package/dist/{ssrf-DqebVE34.mjs → ssrf-gl4gFNhw.mjs} +151 -93
- package/dist/ssrf-gl4gFNhw.mjs.map +1 -0
- package/dist/{state-BJfU9Uzw.mjs → state-1F6IOhdQ.mjs} +1 -1
- package/dist/{state-BJfU9Uzw.mjs.map → state-1F6IOhdQ.mjs.map} +1 -1
- package/dist/{status-DDu8HIQl.mjs → status-Cenfk_r5.mjs} +1 -1
- package/dist/{status-DDu8HIQl.mjs.map → status-Cenfk_r5.mjs.map} +1 -1
- package/dist/storage/local.d.mts +2 -1
- package/dist/storage/local.d.mts.map +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/local.mjs.map +1 -1
- package/dist/storage/s3.d.mts +2 -1
- package/dist/storage/s3.d.mts.map +1 -1
- package/dist/storage/s3.mjs +3 -2
- package/dist/storage/s3.mjs.map +1 -1
- package/dist/{target-D0o26Azo.mjs → target-CRzeTs8G.mjs} +1 -1
- package/dist/{target-D0o26Azo.mjs.map → target-CRzeTs8G.mjs.map} +1 -1
- package/dist/{taxonomies-CPGxo-bn.mjs → taxonomies-BOdxuZpV.mjs} +23 -13
- package/dist/taxonomies-BOdxuZpV.mjs.map +1 -0
- package/dist/{taxonomies-kmyudNGP.mjs → taxonomies-NcFDq5Gg.mjs} +58 -23
- package/dist/taxonomies-NcFDq5Gg.mjs.map +1 -0
- package/dist/{taxonomy-8X09dLN5.mjs → taxonomy-DP1vny4K.mjs} +12 -4
- package/dist/{taxonomy-8X09dLN5.mjs.map → taxonomy-DP1vny4K.mjs.map} +1 -1
- package/dist/{tokens-gTS-IVUp.mjs → tokens-CDk8ox9p.mjs} +1 -1
- package/dist/{tokens-gTS-IVUp.mjs.map → tokens-CDk8ox9p.mjs.map} +1 -1
- package/dist/{transport-_6R1ub7t.d.mts → transport-BVn4tVb9.d.mts} +1 -1
- package/dist/{transport-_6R1ub7t.d.mts.map → transport-BVn4tVb9.d.mts.map} +1 -1
- package/dist/{transport-fX59xaJz.mjs → transport-DP0JI-8i.mjs} +1 -1
- package/dist/{transport-fX59xaJz.mjs.map → transport-DP0JI-8i.mjs.map} +1 -1
- package/dist/{trusted-proxy-fe6nEgR4.mjs → trusted-proxy-BTM6UxqD.mjs} +1 -1
- package/dist/{trusted-proxy-fe6nEgR4.mjs.map → trusted-proxy-BTM6UxqD.mjs.map} +1 -1
- package/dist/{types-D_DWe7k9.d.mts → types-2n848aVW.d.mts} +3 -2
- package/dist/types-2n848aVW.d.mts.map +1 -0
- package/dist/types-A2cN6a4a.mjs +3 -0
- package/dist/{types-75KIqzL9.mjs → types-BMXnRIrX.mjs} +4 -2
- package/dist/types-BMXnRIrX.mjs.map +1 -0
- package/dist/{types-Vg6f5i3s.d.mts → types-BouXpOsa.d.mts} +121 -4
- package/dist/types-BouXpOsa.d.mts.map +1 -0
- package/dist/{types-BXUmsINL.mjs → types-ByG2coLw.mjs} +1 -1
- package/dist/{types-BXUmsINL.mjs.map → types-ByG2coLw.mjs.map} +1 -1
- package/dist/types-CQPWhPxE.mjs.map +1 -1
- package/dist/{types-Blb-MRC3.d.mts → types-DEfNJ__A.d.mts} +1 -1
- package/dist/{types-Blb-MRC3.d.mts.map → types-DEfNJ__A.d.mts.map} +1 -1
- package/dist/{types-Br-ERaxh.d.mts → types-DKcKSbtB.d.mts} +23 -7
- package/dist/types-DKcKSbtB.d.mts.map +1 -0
- package/dist/{types-BzBd3PeX.d.mts → types-DRYs7uTL.d.mts} +1 -1
- package/dist/{types-BzBd3PeX.d.mts.map → types-DRYs7uTL.d.mts.map} +1 -1
- package/dist/{types-CLqvnd05.d.mts → types-DaEg7KX2.d.mts} +1 -1
- package/dist/{types-CLqvnd05.d.mts.map → types-DaEg7KX2.d.mts.map} +1 -1
- package/dist/{types-DJQxln7q.d.mts → types-LU8utpP_.d.mts} +14 -10
- package/dist/types-LU8utpP_.d.mts.map +1 -0
- package/dist/{types-D5VVLr7J.d.mts → types-VpYfPUxN.d.mts} +1 -1
- package/dist/{types-D5VVLr7J.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-DHxzBjbD.d.mts → types-tJWDK__M.d.mts} +14 -1
- package/dist/types-tJWDK__M.d.mts.map +1 -0
- package/dist/{upload-attempts-CNyGSepg.mjs → upload-attempts-C6S2y-lp.mjs} +1 -1
- package/dist/{upload-attempts-CNyGSepg.mjs.map → upload-attempts-C6S2y-lp.mjs.map} +1 -1
- package/dist/{url-pattern-K-KdXcSe.mjs → url-pattern-UYtxVTuj.mjs} +1 -1
- package/dist/{url-pattern-K-KdXcSe.mjs.map → url-pattern-UYtxVTuj.mjs.map} +1 -1
- package/dist/{user-CtYY0tp2.mjs → user-DIsIXogT.mjs} +2 -2
- package/dist/{user-CtYY0tp2.mjs.map → user-DIsIXogT.mjs.map} +1 -1
- package/dist/{utils-HztC73hq.mjs → utils-BicP5Qbg.mjs} +2 -2
- package/dist/{utils-HztC73hq.mjs.map → utils-BicP5Qbg.mjs.map} +1 -1
- package/dist/{validate-Dd-IUjnZ.mjs → validate-D8VPn4Hv.mjs} +8 -3
- package/dist/validate-D8VPn4Hv.mjs.map +1 -0
- package/dist/{validate-DlqdOZXB.d.mts → validate-Df6Dvwbw.d.mts} +12 -7
- package/dist/validate-Df6Dvwbw.d.mts.map +1 -0
- package/dist/{validation-D83n7Npi.mjs → validation-CzMJn9Ku.mjs} +13 -11
- package/dist/{validation-D83n7Npi.mjs.map → validation-CzMJn9Ku.mjs.map} +1 -1
- package/dist/version-CK67_SXX.mjs +7 -0
- package/dist/{version-ri-sCyAp.mjs.map → version-CK67_SXX.mjs.map} +1 -1
- package/dist/{widgets-CpmZd9Q-.mjs → widgets-RFVAxQl3.mjs} +18 -5
- package/dist/widgets-RFVAxQl3.mjs.map +1 -0
- package/dist/{wxr-taxonomies-BFd0y72_.d.mts → wxr-taxonomies-BX4yQL9s.d.mts} +1 -1
- package/dist/{wxr-taxonomies-BFd0y72_.d.mts.map → wxr-taxonomies-BX4yQL9s.d.mts.map} +1 -1
- package/dist/{wxr-taxonomies-Df4vxWcU.mjs → wxr-taxonomies-Csdp7yde.mjs} +4 -4
- package/dist/{wxr-taxonomies-Df4vxWcU.mjs.map → wxr-taxonomies-Csdp7yde.mjs.map} +1 -1
- package/dist/{zod-generator-DylzusHh.mjs → zod-generator-CNRGdnBY.mjs} +11 -7
- package/dist/zod-generator-CNRGdnBY.mjs.map +1 -0
- package/package.json +16 -11
- package/src/api/errors.ts +9 -0
- package/src/api/handlers/content.ts +115 -90
- package/src/api/handlers/entry-lock.ts +206 -0
- package/src/api/handlers/index.ts +1 -0
- package/src/api/handlers/manifest.ts +162 -12
- package/src/api/handlers/marketplace.ts +28 -20
- package/src/api/handlers/media.ts +30 -0
- package/src/api/handlers/menus.ts +9 -0
- package/src/api/handlers/registry.ts +406 -297
- 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 +25 -9
- package/src/api/openapi/document.ts +196 -11
- package/src/api/parse.ts +1 -1
- package/src/api/schemas/auth.ts +4 -4
- package/src/api/schemas/bylines.ts +3 -3
- package/src/api/schemas/comments.ts +1 -1
- package/src/api/schemas/common.ts +3 -2
- package/src/api/schemas/content.ts +86 -22
- package/src/api/schemas/entry-lock.ts +48 -0
- package/src/api/schemas/index.ts +1 -0
- package/src/api/schemas/media.ts +52 -0
- package/src/api/schemas/redirects.ts +6 -1
- package/src/api/schemas/schema.ts +14 -1
- package/src/api/schemas/setup.ts +1 -1
- package/src/api/schemas/taxonomies.ts +2 -2
- package/src/api/schemas/users.ts +1 -1
- package/src/api/types.ts +25 -10
- package/src/astro/dev-typegen.ts +35 -0
- package/src/astro/image-endpoint.ts +2 -2
- package/src/astro/integration/dev-typegen.ts +91 -0
- package/src/astro/integration/index.ts +18 -50
- package/src/astro/integration/routes.ts +10 -0
- package/src/astro/integration/runtime.ts +13 -5
- package/src/astro/integration/vite-config.ts +51 -2
- package/src/astro/middleware.ts +21 -0
- package/src/astro/routes/api/admin/api-tokens/index.ts +4 -1
- package/src/astro/routes/api/admin/oauth-clients/[id].ts +1 -1
- package/src/astro/routes/api/admin/oauth-clients/index.ts +1 -1
- package/src/astro/routes/api/admin/plugins/registry/[id]/update.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/artifact.ts +3 -7
- package/src/astro/routes/api/admin/plugins/registry/install.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/verify.ts +60 -0
- package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +18 -2
- package/src/astro/routes/api/content/[collection]/[id]/lock.ts +133 -0
- package/src/astro/routes/api/content/[collection]/[id]/publish.ts +12 -1
- package/src/astro/routes/api/content/[collection]/[id]/schedule.ts +20 -0
- package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +16 -2
- 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/api/manifest.ts +1 -1
- package/src/astro/routes/api/media/[id]/replace.ts +114 -0
- package/src/astro/routes/api/media/file/[...key].ts +4 -1
- package/src/astro/routes/api/media/upload-url.ts +8 -4
- package/src/astro/routes/api/media.ts +54 -8
- package/src/astro/routes/api/menus/[name]/items/[id].ts +7 -2
- package/src/astro/routes/api/menus/[name]/items.ts +4 -1
- package/src/astro/routes/api/menus/[name]/reorder.ts +4 -1
- package/src/astro/routes/api/menus/[name]/translations.ts +4 -1
- package/src/astro/routes/api/menus/[name].ts +7 -2
- package/src/astro/routes/api/menus/index.ts +4 -1
- package/src/astro/routes/api/settings/email.ts +1 -1
- package/src/astro/routes/api/settings.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name]/reorder.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name]/terms/[slug]/translations.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name]/terms/[slug].ts +7 -2
- package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name].ts +7 -2
- package/src/astro/routes/api/taxonomies/index.ts +4 -1
- package/src/astro/routes/api/widget-areas/[name]/reorder.ts +3 -1
- package/src/astro/routes/api/widget-areas/[name]/widgets/[id].ts +5 -2
- package/src/astro/routes/api/widget-areas/[name]/widgets.ts +3 -1
- package/src/astro/routes/api/widget-areas/[name].ts +3 -1
- package/src/astro/routes/api/widget-areas/index.ts +3 -1
- package/src/astro/routes/sitemap-[collection].xml.ts +4 -0
- package/src/astro/types.ts +36 -8
- package/src/auth/challenge-store.ts +3 -1
- package/src/aws-sdk.d.ts +1 -0
- package/src/cache/chrome-tags.ts +24 -0
- 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/EmDashImage.astro +2 -1
- package/src/components/EmDashMedia.astro +2 -1
- package/src/components/Gallery.astro +18 -4
- package/src/components/InlineEditor.astro +3 -1
- package/src/components/InlinePortableTextEditor.tsx +112 -12
- package/src/components/PortableText.astro +4 -0
- package/src/components/Table.astro +147 -62
- package/src/components/widgets/Archives.astro +2 -37
- package/src/config/errors.ts +13 -0
- package/src/content/converters/index.ts +2 -0
- package/src/content/converters/mark-safety.ts +1 -0
- package/src/content/converters/portable-text-identity.ts +139 -0
- package/src/content/converters/portable-text-to-prosemirror.ts +226 -69
- package/src/content/converters/prosemirror-to-portable-text.ts +128 -28
- package/src/content/converters/types.ts +11 -0
- package/src/database/dialect-helpers.ts +125 -0
- package/src/database/migrations/017_authorization_codes.ts +14 -4
- package/src/database/migrations/074_content_deleted_scheduled_index.ts +55 -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 +9 -1
- package/src/database/repositories/byline.ts +32 -16
- package/src/database/repositories/content.ts +284 -48
- package/src/database/repositories/entry-locks.ts +257 -0
- package/src/database/repositories/media-usage.ts +66 -37
- package/src/database/repositories/media.ts +60 -1
- package/src/database/repositories/options.ts +69 -5
- package/src/database/repositories/plugin-storage.ts +233 -9
- package/src/database/repositories/redirect.ts +17 -6
- package/src/database/repositories/taxonomy.ts +8 -0
- package/src/database/repositories/types.ts +11 -7
- package/src/database/types.ts +15 -1
- package/src/db/adapters.ts +8 -1
- package/src/db/postgres.ts +23 -0
- package/src/emdash-runtime.ts +196 -199
- package/src/fields/boolean.ts +1 -1
- package/src/fields/datetime.ts +1 -1
- package/src/fields/file.ts +1 -1
- package/src/fields/integer.ts +1 -1
- package/src/fields/json.ts +1 -1
- package/src/fields/multiselect.ts +1 -1
- package/src/fields/number.ts +1 -1
- package/src/fields/portable-text.ts +1 -1
- package/src/fields/richtext.ts +1 -1
- package/src/fields/select.ts +1 -1
- package/src/fields/slug.ts +1 -1
- package/src/fields/text.ts +1 -1
- package/src/fields/textarea.ts +1 -1
- package/src/fields/types.ts +2 -2
- package/src/i18n/resolve.ts +44 -4
- package/src/index.ts +39 -3
- package/src/loader.ts +96 -12
- package/src/mcp/server.ts +251 -29
- package/src/media/image-endpoint.ts +5 -2
- package/src/media/normalize.ts +15 -4
- package/src/media/responsive.ts +23 -0
- package/src/media/usage/cleanup.ts +9 -8
- package/src/media/usage/content-refresh.ts +2 -1
- package/src/menus/index.ts +33 -21
- package/src/object-cache/index.ts +44 -2
- package/src/page/seo-contributions.ts +78 -1
- package/src/page/seo-panel.ts +47 -0
- package/src/plugin-types.ts +27 -1
- package/src/plugins/conditional-storage.ts +30 -0
- package/src/plugins/context.ts +49 -17
- package/src/plugins/hooks.ts +10 -1
- package/src/plugins/index.ts +15 -0
- package/src/plugins/manager.ts +6 -2
- package/src/plugins/manifest-schema.ts +1 -1
- package/src/plugins/routes.ts +3 -1
- package/src/plugins/sandbox/hook-result.ts +52 -0
- package/src/plugins/sandbox/index.ts +10 -0
- 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 +120 -0
- package/src/query.ts +29 -3
- package/src/registry/artifact-checksum.ts +15 -0
- package/src/registry/artifact-verification.ts +85 -0
- package/src/registry/authoritative-records.ts +180 -0
- package/src/registry/config.ts +130 -27
- package/src/registry/record-labels.ts +28 -0
- package/src/registry/types.ts +5 -6
- package/src/schema/collection-slugs-cache.ts +157 -0
- package/src/schema/registry.ts +45 -3
- package/src/schema/types.ts +25 -6
- package/src/schema/zod-generator.ts +16 -13
- package/src/security/ssrf.ts +172 -143
- 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/settings/index.ts +16 -0
- package/src/storage/local.ts +1 -0
- package/src/storage/s3.ts +2 -0
- package/src/storage/types.ts +2 -0
- package/src/taxonomies/index.ts +40 -20
- package/src/taxonomies/term-counts.ts +22 -5
- package/src/widgets/archives.ts +67 -0
- package/src/widgets/index.ts +16 -0
- package/dist/api-B0w3uBiG.mjs +0 -2269
- package/dist/api-B0w3uBiG.mjs.map +0 -1
- package/dist/apply-B_VMpJ2P.mjs.map +0 -1
- package/dist/byline-Cpnwrje1.mjs.map +0 -1
- package/dist/challenge-store-D5pSY2S1.mjs.map +0 -1
- package/dist/content-CP-SeXNa.mjs.map +0 -1
- package/dist/content-refresh-DLOfIhYc.mjs.map +0 -1
- package/dist/context-BR5hRWiK.mjs.map +0 -1
- package/dist/dialect-helpers-BSbfaO3F.mjs.map +0 -1
- package/dist/errors-n2j49uNf.mjs.map +0 -1
- package/dist/index-DWbJrsAg.d.mts.map +0 -1
- package/dist/loader-ZsjE4paL.mjs.map +0 -1
- package/dist/manifest-schema-CUYPfCEH.mjs.map +0 -1
- package/dist/media-BjwNuLEu.mjs.map +0 -1
- package/dist/media-D6SeAfBl.mjs.map +0 -1
- package/dist/media-url-DH7giMx_.mjs.map +0 -1
- package/dist/menus-CNg0QlDt.mjs.map +0 -1
- package/dist/normalize-CSxdKBVa.mjs.map +0 -1
- package/dist/object-cache-71tPfV4A.mjs.map +0 -1
- package/dist/options-BHPeIbBd.mjs.map +0 -1
- package/dist/options-BhZIeFY1.d.mts.map +0 -1
- package/dist/query-D18vTdha.mjs.map +0 -1
- package/dist/redirect-CZkbozu9.mjs.map +0 -1
- package/dist/redirects-CRIM55KH.mjs.map +0 -1
- package/dist/registry-BiO5WwPq.mjs +0 -2716
- package/dist/registry-BiO5WwPq.mjs.map +0 -1
- package/dist/registry-Cx-jEJOS.mjs.map +0 -1
- package/dist/relations-BTPM2saV.mjs.map +0 -1
- package/dist/relations-C7B46bcU.d.mts.map +0 -1
- package/dist/resolve-DxUpTMmE.mjs.map +0 -1
- package/dist/runner-77GOZCnH.mjs.map +0 -1
- package/dist/runner-zgqA_CqP.d.mts.map +0 -1
- package/dist/seo-BSiTIXzd.mjs.map +0 -1
- package/dist/settings-BgN-0DT-.mjs.map +0 -1
- package/dist/snapshot-DSB8P7Lm.mjs.map +0 -1
- package/dist/ssrf-DqebVE34.mjs.map +0 -1
- package/dist/taxonomies-CPGxo-bn.mjs.map +0 -1
- package/dist/taxonomies-kmyudNGP.mjs.map +0 -1
- package/dist/types-75KIqzL9.mjs.map +0 -1
- package/dist/types-Br-ERaxh.d.mts.map +0 -1
- package/dist/types-D6OcIp2P.mjs +0 -3
- package/dist/types-DHxzBjbD.d.mts.map +0 -1
- package/dist/types-DJQxln7q.d.mts.map +0 -1
- package/dist/types-D_DWe7k9.d.mts.map +0 -1
- package/dist/types-Vg6f5i3s.d.mts.map +0 -1
- package/dist/validate-Dd-IUjnZ.mjs.map +0 -1
- package/dist/validate-DlqdOZXB.d.mts.map +0 -1
- package/dist/version-ri-sCyAp.mjs +0 -7
- package/dist/widgets-CpmZd9Q-.mjs.map +0 -1
- package/dist/zod-generator-DylzusHh.mjs.map +0 -1
- /package/dist/{api-tokens-B5NHLNUN.mjs → api-tokens-B_lfpmH3.mjs} +0 -0
- /package/dist/{ssrf-BPKzkm6O.mjs → ssrf-TQhaljuI.mjs} +0 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { type Kysely, sql } from "kysely";
|
|
2
|
+
|
|
3
|
+
import { columnExists, isPostgres } from "../dialect-helpers.js";
|
|
4
|
+
|
|
5
|
+
const TABLES = [
|
|
6
|
+
{ name: "options", keys: ["name"] },
|
|
7
|
+
{ name: "_plugin_storage", keys: ["plugin_id", "collection", "id"] },
|
|
8
|
+
] as const;
|
|
9
|
+
|
|
10
|
+
const DUPLICATE_COLUMN_REGEX =
|
|
11
|
+
/(?:duplicate column|column .* already exists|already exists.*column)/i;
|
|
12
|
+
|
|
13
|
+
export async function up(db: Kysely<unknown>): Promise<void> {
|
|
14
|
+
for (const table of TABLES) {
|
|
15
|
+
if (await columnExists(db, table.name, "revision")) continue;
|
|
16
|
+
try {
|
|
17
|
+
await db.schema
|
|
18
|
+
.alterTable(table.name)
|
|
19
|
+
.addColumn("revision", "text", (column) => column.notNull().defaultTo("0"))
|
|
20
|
+
.execute();
|
|
21
|
+
} catch (error) {
|
|
22
|
+
if (isDuplicateColumnError(error) && (await columnExists(db, table.name, "revision"))) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (isPostgres(db)) {
|
|
30
|
+
await sql`
|
|
31
|
+
CREATE OR REPLACE FUNCTION emdash_plugin_storage_assign_revision()
|
|
32
|
+
RETURNS trigger
|
|
33
|
+
LANGUAGE plpgsql
|
|
34
|
+
AS $$
|
|
35
|
+
BEGIN
|
|
36
|
+
IF TG_OP = 'INSERT' THEN
|
|
37
|
+
IF NEW.revision = '0' THEN
|
|
38
|
+
NEW.revision := gen_random_uuid()::text;
|
|
39
|
+
END IF;
|
|
40
|
+
ELSIF NEW.revision = '0' OR NEW.revision = OLD.revision THEN
|
|
41
|
+
NEW.revision := gen_random_uuid()::text;
|
|
42
|
+
END IF;
|
|
43
|
+
RETURN NEW;
|
|
44
|
+
END;
|
|
45
|
+
$$
|
|
46
|
+
`.execute(db);
|
|
47
|
+
for (const table of TABLES) {
|
|
48
|
+
await sql`
|
|
49
|
+
CREATE OR REPLACE TRIGGER ${sql.ref(`emdash_${table.name}_revision`)}
|
|
50
|
+
BEFORE INSERT OR UPDATE ON ${sql.ref(table.name)}
|
|
51
|
+
FOR EACH ROW EXECUTE FUNCTION emdash_plugin_storage_assign_revision()
|
|
52
|
+
`.execute(db);
|
|
53
|
+
}
|
|
54
|
+
} else {
|
|
55
|
+
for (const table of TABLES) {
|
|
56
|
+
const rowKey = sql.join(
|
|
57
|
+
table.keys.map((key) => sql`${sql.ref(key)} = ${sql.ref(`NEW.${key}`)}`),
|
|
58
|
+
sql` AND `,
|
|
59
|
+
);
|
|
60
|
+
await sql`
|
|
61
|
+
CREATE TRIGGER IF NOT EXISTS ${sql.ref(`emdash_${table.name}_revision_insert`)}
|
|
62
|
+
AFTER INSERT ON ${sql.ref(table.name)}
|
|
63
|
+
WHEN NEW.revision = '0'
|
|
64
|
+
BEGIN
|
|
65
|
+
UPDATE ${sql.ref(table.name)} SET revision = lower(hex(randomblob(16)))
|
|
66
|
+
WHERE ${rowKey} AND revision = NEW.revision;
|
|
67
|
+
END
|
|
68
|
+
`.execute(db);
|
|
69
|
+
await sql`
|
|
70
|
+
CREATE TRIGGER IF NOT EXISTS ${sql.ref(`emdash_${table.name}_revision_update`)}
|
|
71
|
+
AFTER UPDATE ON ${sql.ref(table.name)}
|
|
72
|
+
WHEN NEW.revision = '0' OR NEW.revision = OLD.revision
|
|
73
|
+
BEGIN
|
|
74
|
+
UPDATE ${sql.ref(table.name)} SET revision = lower(hex(randomblob(16)))
|
|
75
|
+
WHERE ${rowKey} AND revision = NEW.revision;
|
|
76
|
+
END
|
|
77
|
+
`.execute(db);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function isDuplicateColumnError(error: unknown): boolean {
|
|
83
|
+
if (!(error instanceof Error)) return false;
|
|
84
|
+
return DUPLICATE_COLUMN_REGEX.test(error.message) || isDuplicateColumnError(error.cause);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export async function down(_db: Kysely<unknown>): Promise<void> {
|
|
88
|
+
// Revisions must survive a host rollback while other writers still use them.
|
|
89
|
+
}
|
|
@@ -76,6 +76,10 @@ import * as m070 from "./070_collection_routable.js";
|
|
|
76
76
|
import * as m071 from "./071_restore_content_bylines_table.js";
|
|
77
77
|
import * as m072 from "./072_media_folders.js";
|
|
78
78
|
import * as m073 from "./073_media_focal_point.js";
|
|
79
|
+
import * as m074 from "./074_content_deleted_scheduled_index.js";
|
|
80
|
+
import * as m075 from "./075_entry_edit_locks.js";
|
|
81
|
+
import * as m076 from "./076_collection_nav_group.js";
|
|
82
|
+
import * as m077 from "./077_plugin_storage_revisions.js";
|
|
79
83
|
|
|
80
84
|
const MIGRATIONS: Readonly<Record<string, Migration>> = Object.freeze({
|
|
81
85
|
"001_initial": m001,
|
|
@@ -150,6 +154,10 @@ const MIGRATIONS: Readonly<Record<string, Migration>> = Object.freeze({
|
|
|
150
154
|
"071_restore_content_bylines_table": m071,
|
|
151
155
|
"072_media_folders": m072,
|
|
152
156
|
"073_media_focal_point": m073,
|
|
157
|
+
"074_content_deleted_scheduled_index": m074,
|
|
158
|
+
"075_entry_edit_locks": m075,
|
|
159
|
+
"076_collection_nav_group": m076,
|
|
160
|
+
"077_plugin_storage_revisions": m077,
|
|
153
161
|
});
|
|
154
162
|
|
|
155
163
|
/** Ordered names from the statically registered migration set. */
|
|
@@ -211,7 +219,7 @@ export interface MigrationOptions {
|
|
|
211
219
|
raceWaitMs?: number;
|
|
212
220
|
}
|
|
213
221
|
|
|
214
|
-
function createMigrator(db: Kysely<Database>, options?: MigrationOptions): Migrator {
|
|
222
|
+
export function createMigrator(db: Kysely<Database>, options?: MigrationOptions): Migrator {
|
|
215
223
|
return new Migrator({
|
|
216
224
|
db,
|
|
217
225
|
provider: new StaticMigrationProvider(),
|
|
@@ -30,9 +30,9 @@ type BylineRow = Selectable<BylineTable>;
|
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
32
|
* A byline row optionally augmented with the avatar's media columns, folded in
|
|
33
|
-
* by the `LEFT JOIN media` in the
|
|
34
|
-
* `
|
|
35
|
-
*
|
|
33
|
+
* by the `LEFT JOIN media` in the credit-hydration and single-row finder
|
|
34
|
+
* queries. `findMany` selects without the join, so the keys are optional and
|
|
35
|
+
* `rowToByline` defaults them to null.
|
|
36
36
|
*/
|
|
37
37
|
type BylineRowWithAvatar = BylineRow & {
|
|
38
38
|
avatar_storage_key?: string | null;
|
|
@@ -298,7 +298,7 @@ export class BylineRepository {
|
|
|
298
298
|
* same way `BylineRepository` doesn't resolve locale fallback for
|
|
299
299
|
* the base byline lookup.
|
|
300
300
|
*/
|
|
301
|
-
private async withCustomFields(rows:
|
|
301
|
+
private async withCustomFields(rows: BylineRowWithAvatar[]): Promise<BylineSummary[]> {
|
|
302
302
|
const summaries = rows.map(rowToByline);
|
|
303
303
|
// Always populate `customFields = {}` (PR plan AC #6) — even when
|
|
304
304
|
// no fields are registered, every BylineSummary carries the empty
|
|
@@ -311,7 +311,9 @@ export class BylineRepository {
|
|
|
311
311
|
return summaries;
|
|
312
312
|
}
|
|
313
313
|
|
|
314
|
-
private async withCustomFieldsOne(
|
|
314
|
+
private async withCustomFieldsOne(
|
|
315
|
+
row: BylineRowWithAvatar | undefined,
|
|
316
|
+
): Promise<BylineSummary | null> {
|
|
315
317
|
if (!row) return null;
|
|
316
318
|
const [result] = await this.withCustomFields([row]);
|
|
317
319
|
return result ?? null;
|
|
@@ -501,12 +503,26 @@ export class BylineRepository {
|
|
|
501
503
|
// Reads
|
|
502
504
|
// ============================================
|
|
503
505
|
|
|
506
|
+
/**
|
|
507
|
+
* Every byline column plus the avatar's media columns, folded in by the
|
|
508
|
+
* same `LEFT JOIN media` the credit-hydration queries use. Only the
|
|
509
|
+
* single-row finders select this; `findMany` stays a single-table scan.
|
|
510
|
+
*/
|
|
511
|
+
private selectBylineWithAvatar() {
|
|
512
|
+
return this.db
|
|
513
|
+
.selectFrom("_emdash_bylines as b")
|
|
514
|
+
.leftJoin("media as m", "m.id", "b.avatar_media_id")
|
|
515
|
+
.selectAll("b")
|
|
516
|
+
.select([
|
|
517
|
+
"m.storage_key as avatar_storage_key",
|
|
518
|
+
"m.alt as avatar_alt",
|
|
519
|
+
"m.blurhash as avatar_blurhash",
|
|
520
|
+
"m.dominant_color as avatar_dominant_color",
|
|
521
|
+
]);
|
|
522
|
+
}
|
|
523
|
+
|
|
504
524
|
async findById(id: string): Promise<BylineSummary | null> {
|
|
505
|
-
const row = await this.
|
|
506
|
-
.selectFrom("_emdash_bylines")
|
|
507
|
-
.selectAll()
|
|
508
|
-
.where("id", "=", id)
|
|
509
|
-
.executeTakeFirst();
|
|
525
|
+
const row = await this.selectBylineWithAvatar().where("b.id", "=", id).executeTakeFirst();
|
|
510
526
|
return this.withCustomFieldsOne(row);
|
|
511
527
|
}
|
|
512
528
|
|
|
@@ -516,9 +532,9 @@ export class BylineRepository {
|
|
|
516
532
|
* calls). Mirrors `TaxonomyRepository.findBySlug`.
|
|
517
533
|
*/
|
|
518
534
|
async findBySlug(slug: string, options?: { locale?: string }): Promise<BylineSummary | null> {
|
|
519
|
-
let query = this.
|
|
520
|
-
if (options?.locale !== undefined) query = query.where("locale", "=", options.locale);
|
|
521
|
-
const row = await query.orderBy("locale", "asc").executeTakeFirst();
|
|
535
|
+
let query = this.selectBylineWithAvatar().where("b.slug", "=", slug);
|
|
536
|
+
if (options?.locale !== undefined) query = query.where("b.locale", "=", options.locale);
|
|
537
|
+
const row = await query.orderBy("b.locale", "asc").executeTakeFirst();
|
|
522
538
|
return this.withCustomFieldsOne(row);
|
|
523
539
|
}
|
|
524
540
|
|
|
@@ -529,9 +545,9 @@ export class BylineRepository {
|
|
|
529
545
|
* the lowest-locale-code match.
|
|
530
546
|
*/
|
|
531
547
|
async findByUserId(userId: string, options?: { locale?: string }): Promise<BylineSummary | null> {
|
|
532
|
-
let query = this.
|
|
533
|
-
if (options?.locale !== undefined) query = query.where("locale", "=", options.locale);
|
|
534
|
-
const row = await query.orderBy("locale", "asc").executeTakeFirst();
|
|
548
|
+
let query = this.selectBylineWithAvatar().where("b.user_id", "=", userId);
|
|
549
|
+
if (options?.locale !== undefined) query = query.where("b.locale", "=", options.locale);
|
|
550
|
+
const row = await query.orderBy("b.locale", "asc").executeTakeFirst();
|
|
535
551
|
return this.withCustomFieldsOne(row);
|
|
536
552
|
}
|
|
537
553
|
|
|
@@ -42,6 +42,16 @@ const MAX_IN_FILTER_VALUES = SQL_BATCH_SIZE;
|
|
|
42
42
|
const MAX_FILTER_STRING_LENGTH = 2048;
|
|
43
43
|
|
|
44
44
|
type NormalizedFilterScalar = string | number;
|
|
45
|
+
export type ContentRevisionPrecondition = Pick<ContentItem, "version" | "updatedAt">;
|
|
46
|
+
|
|
47
|
+
function assertRevisionPrecondition(
|
|
48
|
+
item: ContentItem,
|
|
49
|
+
expected: ContentRevisionPrecondition | undefined,
|
|
50
|
+
): void {
|
|
51
|
+
if (expected && (item.version !== expected.version || item.updatedAt !== expected.updatedAt)) {
|
|
52
|
+
throw new ContentMutationConflictError();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
45
55
|
|
|
46
56
|
type ResolvedFieldFilter =
|
|
47
57
|
| { column: string; kind: "null" }
|
|
@@ -837,6 +847,15 @@ export class ContentRepository {
|
|
|
837
847
|
return mappedResult;
|
|
838
848
|
}
|
|
839
849
|
|
|
850
|
+
private normalizeScheduledAt(value: string | null): string | null {
|
|
851
|
+
if (value === null) return null;
|
|
852
|
+
const scheduledDate = new Date(value);
|
|
853
|
+
if (isNaN(scheduledDate.getTime())) {
|
|
854
|
+
throw new EmDashValidationError("Invalid scheduled date");
|
|
855
|
+
}
|
|
856
|
+
return scheduledDate.toISOString();
|
|
857
|
+
}
|
|
858
|
+
|
|
840
859
|
/**
|
|
841
860
|
* Update content
|
|
842
861
|
*/
|
|
@@ -861,7 +880,7 @@ export class ContentRepository {
|
|
|
861
880
|
}
|
|
862
881
|
|
|
863
882
|
if (input.scheduledAt !== undefined) {
|
|
864
|
-
updates.scheduled_at = input.scheduledAt;
|
|
883
|
+
updates.scheduled_at = this.normalizeScheduledAt(input.scheduledAt);
|
|
865
884
|
}
|
|
866
885
|
|
|
867
886
|
if (input.authorId !== undefined) {
|
|
@@ -954,7 +973,7 @@ export class ContentRepository {
|
|
|
954
973
|
collection: type,
|
|
955
974
|
entryId: id,
|
|
956
975
|
data: mergedData,
|
|
957
|
-
...(input.
|
|
976
|
+
...(input.revisionAuthorId ? { authorId: input.revisionAuthorId } : {}),
|
|
958
977
|
});
|
|
959
978
|
|
|
960
979
|
let staged: boolean;
|
|
@@ -1020,7 +1039,7 @@ export class ContentRepository {
|
|
|
1020
1039
|
liveMetadataChanged = true;
|
|
1021
1040
|
}
|
|
1022
1041
|
if (input.scheduledAt !== undefined) {
|
|
1023
|
-
assignments.push(sql`scheduled_at = ${input.scheduledAt}`);
|
|
1042
|
+
assignments.push(sql`scheduled_at = ${this.normalizeScheduledAt(input.scheduledAt)}`);
|
|
1024
1043
|
liveMetadataChanged = true;
|
|
1025
1044
|
}
|
|
1026
1045
|
if (input.authorId !== undefined) {
|
|
@@ -1055,6 +1074,162 @@ export class ContentRepository {
|
|
|
1055
1074
|
return changed;
|
|
1056
1075
|
}
|
|
1057
1076
|
|
|
1077
|
+
/**
|
|
1078
|
+
* Copy non-translatable field values to every other entry in the
|
|
1079
|
+
* translation group, trashed entries included.
|
|
1080
|
+
*
|
|
1081
|
+
* Only the fields present in `data` are copied. With `previous`, `data` is
|
|
1082
|
+
* the entry's complete new state and only the fields whose value differs
|
|
1083
|
+
* from `previous` are copied, an absent field as null. An entry that already
|
|
1084
|
+
* holds every copied value is left untouched, so its `updated_at` does not
|
|
1085
|
+
* move.
|
|
1086
|
+
*
|
|
1087
|
+
* On collections with revisions a changed entry also gets a new live
|
|
1088
|
+
* revision, because republishing and unpublishing read that revision rather
|
|
1089
|
+
* than the columns. A pending draft takes a value only where it still holds
|
|
1090
|
+
* the entry's previous value, so an unpublished edit to the field survives.
|
|
1091
|
+
*/
|
|
1092
|
+
async syncNonTranslatableFields(
|
|
1093
|
+
type: string,
|
|
1094
|
+
sourceId: string,
|
|
1095
|
+
translationGroup: string,
|
|
1096
|
+
data: Record<string, unknown>,
|
|
1097
|
+
options: { previous?: Record<string, unknown> } = {},
|
|
1098
|
+
): Promise<void> {
|
|
1099
|
+
const tableName = getTableName(type);
|
|
1100
|
+
const collectionRows = await this.db
|
|
1101
|
+
.selectFrom("_emdash_collections as collection")
|
|
1102
|
+
.leftJoin("_emdash_fields as field", (join) =>
|
|
1103
|
+
join.onRef("field.collection_id", "=", "collection.id").on("field.translatable", "=", 0),
|
|
1104
|
+
)
|
|
1105
|
+
.select(["collection.supports", "field.slug as fieldSlug"])
|
|
1106
|
+
.where("collection.slug", "=", type)
|
|
1107
|
+
.execute();
|
|
1108
|
+
|
|
1109
|
+
const { previous } = options;
|
|
1110
|
+
const values: Record<string, unknown> = {};
|
|
1111
|
+
for (const { fieldSlug } of collectionRows) {
|
|
1112
|
+
if (!fieldSlug) continue;
|
|
1113
|
+
if (previous) {
|
|
1114
|
+
if (!sameStoredValue(previous[fieldSlug], data[fieldSlug])) {
|
|
1115
|
+
values[fieldSlug] = data[fieldSlug] ?? null;
|
|
1116
|
+
}
|
|
1117
|
+
} else if (fieldSlug in data) {
|
|
1118
|
+
values[fieldSlug] = data[fieldSlug];
|
|
1119
|
+
}
|
|
1120
|
+
}
|
|
1121
|
+
if (Object.keys(values).length === 0) return;
|
|
1122
|
+
|
|
1123
|
+
const supportsRaw = collectionRows[0]?.supports;
|
|
1124
|
+
const supports: unknown = supportsRaw ? JSON.parse(supportsRaw) : [];
|
|
1125
|
+
const usesRevisions = Array.isArray(supports) && supports.includes("revisions");
|
|
1126
|
+
|
|
1127
|
+
const siblings = await sql<Record<string, unknown>>`
|
|
1128
|
+
SELECT * FROM ${sql.ref(tableName)}
|
|
1129
|
+
WHERE translation_group = ${translationGroup}
|
|
1130
|
+
AND id != ${sourceId}
|
|
1131
|
+
`.execute(this.db);
|
|
1132
|
+
|
|
1133
|
+
let changed = false;
|
|
1134
|
+
for (const row of siblings.rows) {
|
|
1135
|
+
if (await this.syncSiblingValues(type, this.mapRow(type, row), values, usesRevisions)) {
|
|
1136
|
+
changed = true;
|
|
1137
|
+
}
|
|
1138
|
+
}
|
|
1139
|
+
if (changed) invalidateCollectionCache(type);
|
|
1140
|
+
}
|
|
1141
|
+
|
|
1142
|
+
private async syncSiblingValues(
|
|
1143
|
+
type: string,
|
|
1144
|
+
initial: ContentItem,
|
|
1145
|
+
values: Record<string, unknown>,
|
|
1146
|
+
usesRevisions: boolean,
|
|
1147
|
+
): Promise<boolean> {
|
|
1148
|
+
const tableName = getTableName(type);
|
|
1149
|
+
const revisionRepo = new RevisionRepository(this.db);
|
|
1150
|
+
let sibling: ContentItem | null = initial;
|
|
1151
|
+
|
|
1152
|
+
for (let attempt = 0; sibling && attempt < MAX_DRAFT_STAGE_ATTEMPTS; attempt++) {
|
|
1153
|
+
const current: ContentItem = sibling;
|
|
1154
|
+
const changed: Record<string, unknown> = {};
|
|
1155
|
+
for (const [field, value] of Object.entries(values)) {
|
|
1156
|
+
if (!sameStoredValue(current.data[field], value)) changed[field] = value;
|
|
1157
|
+
}
|
|
1158
|
+
if (Object.keys(changed).length === 0) return false;
|
|
1159
|
+
|
|
1160
|
+
const assignments: ReturnType<typeof sql>[] = [];
|
|
1161
|
+
for (const [field, value] of Object.entries(changed)) {
|
|
1162
|
+
validateIdentifier(field, "content field name");
|
|
1163
|
+
assignments.push(sql`${sql.ref(field)} = ${serializeValue(value)}`);
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1166
|
+
const createdRevisionIds: string[] = [];
|
|
1167
|
+
const cleanUp = async () => {
|
|
1168
|
+
for (const revisionId of createdRevisionIds) {
|
|
1169
|
+
await this.deleteUnstagedRevision(revisionRepo, type, current.id, revisionId);
|
|
1170
|
+
}
|
|
1171
|
+
};
|
|
1172
|
+
|
|
1173
|
+
let synced: boolean;
|
|
1174
|
+
try {
|
|
1175
|
+
const live =
|
|
1176
|
+
usesRevisions && current.liveRevisionId
|
|
1177
|
+
? await revisionRepo.findById(current.liveRevisionId)
|
|
1178
|
+
: null;
|
|
1179
|
+
if (live) {
|
|
1180
|
+
const revision = await revisionRepo.create({
|
|
1181
|
+
collection: type,
|
|
1182
|
+
entryId: current.id,
|
|
1183
|
+
data: { ...live.data, ...changed },
|
|
1184
|
+
});
|
|
1185
|
+
createdRevisionIds.push(revision.id);
|
|
1186
|
+
assignments.push(sql`live_revision_id = ${revision.id}`);
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1189
|
+
const draft =
|
|
1190
|
+
usesRevisions && current.draftRevisionId
|
|
1191
|
+
? await revisionRepo.findById(current.draftRevisionId)
|
|
1192
|
+
: null;
|
|
1193
|
+
const carried: Record<string, unknown> = {};
|
|
1194
|
+
for (const [field, value] of Object.entries(changed)) {
|
|
1195
|
+
if (draft && sameStoredValue(draft.data[field], current.data[field])) {
|
|
1196
|
+
carried[field] = value;
|
|
1197
|
+
}
|
|
1198
|
+
}
|
|
1199
|
+
if (draft && Object.keys(carried).length > 0) {
|
|
1200
|
+
const revision = await revisionRepo.create({
|
|
1201
|
+
collection: type,
|
|
1202
|
+
entryId: current.id,
|
|
1203
|
+
data: { ...draft.data, ...carried },
|
|
1204
|
+
});
|
|
1205
|
+
createdRevisionIds.push(revision.id);
|
|
1206
|
+
assignments.push(sql`draft_revision_id = ${revision.id}`);
|
|
1207
|
+
}
|
|
1208
|
+
|
|
1209
|
+
assignments.push(sql`updated_at = ${new Date().toISOString()}`, sql`version = version + 1`);
|
|
1210
|
+
const result = await sql`
|
|
1211
|
+
UPDATE ${sql.ref(tableName)}
|
|
1212
|
+
SET ${sql.join(assignments, sql`, `)}
|
|
1213
|
+
WHERE id = ${current.id}
|
|
1214
|
+
AND version = ${current.version}
|
|
1215
|
+
AND ${nullableColumnMatch("live_revision_id", current.liveRevisionId)}
|
|
1216
|
+
AND ${nullableColumnMatch("draft_revision_id", current.draftRevisionId)}
|
|
1217
|
+
`.execute(this.db);
|
|
1218
|
+
synced = (result.numAffectedRows ?? 0n) > 0n;
|
|
1219
|
+
} catch (error) {
|
|
1220
|
+
await cleanUp();
|
|
1221
|
+
throw error;
|
|
1222
|
+
}
|
|
1223
|
+
|
|
1224
|
+
if (synced) return true;
|
|
1225
|
+
await cleanUp();
|
|
1226
|
+
sibling = await this.findByIdIncludingTrashed(type, current.id);
|
|
1227
|
+
}
|
|
1228
|
+
|
|
1229
|
+
if (!sibling) return false;
|
|
1230
|
+
throw new ContentMutationConflictError();
|
|
1231
|
+
}
|
|
1232
|
+
|
|
1058
1233
|
/**
|
|
1059
1234
|
* Delete content (soft delete - moves to trash)
|
|
1060
1235
|
*/
|
|
@@ -1129,7 +1304,7 @@ export class ContentRepository {
|
|
|
1129
1304
|
*/
|
|
1130
1305
|
async findTrashed(
|
|
1131
1306
|
type: string,
|
|
1132
|
-
options: Omit<FindManyOptions, "where"> = {},
|
|
1307
|
+
options: Omit<FindManyOptions, "where"> & { where?: { locale?: string } } = {},
|
|
1133
1308
|
): Promise<FindManyResult<ContentItem & { deletedAt: string }>> {
|
|
1134
1309
|
const tableName = getTableName(type);
|
|
1135
1310
|
const limit = Math.min(options.limit || 50, 100);
|
|
@@ -1146,6 +1321,10 @@ export class ContentRepository {
|
|
|
1146
1321
|
.selectAll()
|
|
1147
1322
|
.where("deleted_at" as never, "is not", null);
|
|
1148
1323
|
|
|
1324
|
+
if (options.where?.locale) {
|
|
1325
|
+
query = query.where("locale" as any, "=", options.where.locale);
|
|
1326
|
+
}
|
|
1327
|
+
|
|
1149
1328
|
// Handle cursor pagination — decodeCursor throws on invalid input.
|
|
1150
1329
|
if (options.cursor) {
|
|
1151
1330
|
const { orderValue, id: cursorId } = decodeCursor(options.cursor);
|
|
@@ -1202,14 +1381,19 @@ export class ContentRepository {
|
|
|
1202
1381
|
/**
|
|
1203
1382
|
* Count trashed content items
|
|
1204
1383
|
*/
|
|
1205
|
-
async countTrashed(type: string): Promise<number> {
|
|
1384
|
+
async countTrashed(type: string, options: { locale?: string } = {}): Promise<number> {
|
|
1206
1385
|
const tableName = getTableName(type);
|
|
1207
1386
|
|
|
1208
|
-
|
|
1387
|
+
let query = this.db
|
|
1209
1388
|
.selectFrom(tableName as keyof Database)
|
|
1210
1389
|
.select((eb) => eb.fn.count("id").as("count"))
|
|
1211
|
-
.where("deleted_at" as never, "is not", null)
|
|
1212
|
-
|
|
1390
|
+
.where("deleted_at" as never, "is not", null);
|
|
1391
|
+
|
|
1392
|
+
if (options.locale) {
|
|
1393
|
+
query = query.where("locale" as any, "=", options.locale);
|
|
1394
|
+
}
|
|
1395
|
+
|
|
1396
|
+
const result = await query.executeTakeFirst();
|
|
1213
1397
|
|
|
1214
1398
|
return Number(result?.count || 0);
|
|
1215
1399
|
}
|
|
@@ -1527,10 +1711,11 @@ export class ContentRepository {
|
|
|
1527
1711
|
// transition to 'scheduled' so they aren't visible before the time.
|
|
1528
1712
|
const newStatus = existing.status === "published" ? "published" : "scheduled";
|
|
1529
1713
|
|
|
1714
|
+
// The due query compares ISO strings, so every stored schedule uses the same UTC form.
|
|
1530
1715
|
await sql`
|
|
1531
1716
|
UPDATE ${sql.ref(tableName)}
|
|
1532
1717
|
SET status = ${newStatus},
|
|
1533
|
-
scheduled_at = ${
|
|
1718
|
+
scheduled_at = ${scheduledDate.toISOString()},
|
|
1534
1719
|
updated_at = ${now}
|
|
1535
1720
|
WHERE id = ${id}
|
|
1536
1721
|
AND deleted_at IS NULL
|
|
@@ -1636,6 +1821,19 @@ export class ContentRepository {
|
|
|
1636
1821
|
return result.rows.map((row) => this.mapRow(type, row));
|
|
1637
1822
|
}
|
|
1638
1823
|
|
|
1824
|
+
/** Whether any row of `translationGroup` exists, trashed rows included. */
|
|
1825
|
+
async hasTranslationsIncludingTrashed(type: string, translationGroup: string): Promise<boolean> {
|
|
1826
|
+
const tableName = getTableName(type);
|
|
1827
|
+
|
|
1828
|
+
const result = await sql<Record<string, unknown>>`
|
|
1829
|
+
SELECT id FROM ${sql.ref(tableName)}
|
|
1830
|
+
WHERE translation_group = ${translationGroup}
|
|
1831
|
+
LIMIT 1
|
|
1832
|
+
`.execute(this.db);
|
|
1833
|
+
|
|
1834
|
+
return result.rows.length > 0;
|
|
1835
|
+
}
|
|
1836
|
+
|
|
1639
1837
|
/**
|
|
1640
1838
|
* Batch variant of {@link findTranslations}: every (non-deleted) locale
|
|
1641
1839
|
* variant for any of `translationGroups`, in one `WHERE translation_group IN
|
|
@@ -1777,6 +1975,7 @@ export class ContentRepository {
|
|
|
1777
1975
|
expectedScheduledAt?: string,
|
|
1778
1976
|
promoteRevision = true,
|
|
1779
1977
|
requireSlug = true,
|
|
1978
|
+
expectedRevision?: ContentRevisionPrecondition,
|
|
1780
1979
|
): Promise<ContentItem> {
|
|
1781
1980
|
const tableName = getTableName(type);
|
|
1782
1981
|
const now = new Date().toISOString();
|
|
@@ -1785,6 +1984,7 @@ export class ContentRepository {
|
|
|
1785
1984
|
if (!existing) {
|
|
1786
1985
|
throw new EmDashValidationError("Content item not found");
|
|
1787
1986
|
}
|
|
1987
|
+
assertRevisionPrecondition(existing, expectedRevision);
|
|
1788
1988
|
if (
|
|
1789
1989
|
requireDue &&
|
|
1790
1990
|
expectedScheduledAt !== undefined &&
|
|
@@ -1829,6 +2029,7 @@ export class ContentRepository {
|
|
|
1829
2029
|
WHERE id = ${id}
|
|
1830
2030
|
AND deleted_at IS NULL
|
|
1831
2031
|
AND version = ${existing.version}
|
|
2032
|
+
AND updated_at = ${existing.updatedAt}
|
|
1832
2033
|
AND status = ${existing.status}
|
|
1833
2034
|
AND ${nullableColumnMatch("live_revision_id", existing.liveRevisionId)}
|
|
1834
2035
|
AND ${nullableColumnMatch("draft_revision_id", existing.draftRevisionId)}
|
|
@@ -1954,6 +2155,7 @@ export class ContentRepository {
|
|
|
1954
2155
|
WHERE id = ${id}
|
|
1955
2156
|
AND deleted_at IS NULL
|
|
1956
2157
|
AND version = ${existing.version}
|
|
2158
|
+
AND updated_at = ${existing.updatedAt}
|
|
1957
2159
|
AND status = ${existing.status}
|
|
1958
2160
|
AND ${nullableColumnMatch("live_revision_id", existing.liveRevisionId)}
|
|
1959
2161
|
AND ${nullableColumnMatch("draft_revision_id", existing.draftRevisionId)}
|
|
@@ -2028,10 +2230,14 @@ export class ContentRepository {
|
|
|
2028
2230
|
/**
|
|
2029
2231
|
* Unpublish content
|
|
2030
2232
|
*
|
|
2031
|
-
* Removes live pointer but preserves draft. If no
|
|
2032
|
-
* creates one from the live version so the content isn't lost.
|
|
2233
|
+
* Removes live pointer but preserves the draft and publication date. If no
|
|
2234
|
+
* draft exists, creates one from the live version so the content isn't lost.
|
|
2033
2235
|
*/
|
|
2034
|
-
async unpublish(
|
|
2236
|
+
async unpublish(
|
|
2237
|
+
type: string,
|
|
2238
|
+
id: string,
|
|
2239
|
+
expectedRevision?: ContentRevisionPrecondition,
|
|
2240
|
+
): Promise<ContentItem> {
|
|
2035
2241
|
const tableName = getTableName(type);
|
|
2036
2242
|
const now = new Date().toISOString();
|
|
2037
2243
|
|
|
@@ -2039,44 +2245,61 @@ export class ContentRepository {
|
|
|
2039
2245
|
if (!existing) {
|
|
2040
2246
|
throw new EmDashValidationError("Content item not found");
|
|
2041
2247
|
}
|
|
2248
|
+
assertRevisionPrecondition(existing, expectedRevision);
|
|
2249
|
+
if (existing.status === "draft" && !existing.liveRevisionId) return existing;
|
|
2042
2250
|
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
|
|
2047
|
-
if (
|
|
2048
|
-
const
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
`.execute(this.db);
|
|
2251
|
+
const revisionRepo = new RevisionRepository(this.db);
|
|
2252
|
+
let provisionalRevisionId: string | null = null;
|
|
2253
|
+
try {
|
|
2254
|
+
let draftRevisionId = existing.draftRevisionId;
|
|
2255
|
+
if (!draftRevisionId && existing.liveRevisionId) {
|
|
2256
|
+
const liveRevision = await revisionRepo.findById(existing.liveRevisionId);
|
|
2257
|
+
if (liveRevision) {
|
|
2258
|
+
const draft = await revisionRepo.create({
|
|
2259
|
+
collection: type,
|
|
2260
|
+
entryId: id,
|
|
2261
|
+
data: liveRevision.data,
|
|
2262
|
+
});
|
|
2263
|
+
draftRevisionId = draft.id;
|
|
2264
|
+
provisionalRevisionId = draft.id;
|
|
2265
|
+
}
|
|
2059
2266
|
}
|
|
2060
|
-
}
|
|
2061
2267
|
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2268
|
+
const result = await sql`
|
|
2269
|
+
UPDATE ${sql.ref(tableName)}
|
|
2270
|
+
SET live_revision_id = NULL,
|
|
2271
|
+
draft_revision_id = ${draftRevisionId},
|
|
2272
|
+
status = 'draft',
|
|
2273
|
+
updated_at = ${now},
|
|
2274
|
+
version = version + 1
|
|
2275
|
+
WHERE id = ${id}
|
|
2276
|
+
AND deleted_at IS NULL
|
|
2277
|
+
AND version = ${existing.version}
|
|
2278
|
+
AND updated_at = ${existing.updatedAt}
|
|
2279
|
+
AND status = ${existing.status}
|
|
2280
|
+
AND ${nullableColumnMatch("live_revision_id", existing.liveRevisionId)}
|
|
2281
|
+
AND ${nullableColumnMatch("draft_revision_id", existing.draftRevisionId)}
|
|
2282
|
+
AND ${nullableColumnMatch("scheduled_at", existing.scheduledAt)}
|
|
2283
|
+
`.execute(this.db);
|
|
2284
|
+
if ((result.numAffectedRows ?? 0n) === 0n) throw new ContentMutationConflictError();
|
|
2071
2285
|
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2286
|
+
invalidateCollectionCache(type);
|
|
2287
|
+
const updated = await this.findById(type, id);
|
|
2288
|
+
if (!updated) throw new Error("Content not found");
|
|
2289
|
+
return updated;
|
|
2290
|
+
} catch (error) {
|
|
2291
|
+
if (provisionalRevisionId) {
|
|
2292
|
+
try {
|
|
2293
|
+
await revisionRepo.deleteIfUnreferenced(type, id, provisionalRevisionId);
|
|
2294
|
+
} catch (cleanupError) {
|
|
2295
|
+
console.error(
|
|
2296
|
+
`[content] Failed to clean up provisional revision ${provisionalRevisionId}:`,
|
|
2297
|
+
cleanupError,
|
|
2298
|
+
);
|
|
2299
|
+
}
|
|
2300
|
+
}
|
|
2301
|
+
throw error;
|
|
2077
2302
|
}
|
|
2078
|
-
|
|
2079
|
-
return updated;
|
|
2080
2303
|
}
|
|
2081
2304
|
|
|
2082
2305
|
/**
|
|
@@ -2143,13 +2366,18 @@ export class ContentRepository {
|
|
|
2143
2366
|
* Clears draft_revision_id. The content table columns already hold the
|
|
2144
2367
|
* published version, so no data sync is needed.
|
|
2145
2368
|
*/
|
|
2146
|
-
async discardDraft(
|
|
2369
|
+
async discardDraft(
|
|
2370
|
+
type: string,
|
|
2371
|
+
id: string,
|
|
2372
|
+
expectedRevision?: ContentRevisionPrecondition,
|
|
2373
|
+
): Promise<ContentItem> {
|
|
2147
2374
|
const tableName = getTableName(type);
|
|
2148
2375
|
|
|
2149
2376
|
const existing = await this.findById(type, id);
|
|
2150
2377
|
if (!existing) {
|
|
2151
2378
|
throw new EmDashValidationError("Content item not found");
|
|
2152
2379
|
}
|
|
2380
|
+
assertRevisionPrecondition(existing, expectedRevision);
|
|
2153
2381
|
|
|
2154
2382
|
if (!existing.draftRevisionId) {
|
|
2155
2383
|
// No draft to discard
|
|
@@ -2159,12 +2387,20 @@ export class ContentRepository {
|
|
|
2159
2387
|
// Discarding a draft restores the state from before the draft was
|
|
2160
2388
|
// staged — nothing about the live entry changed in between, so
|
|
2161
2389
|
// updated_at stays at its pre-draft value (#2143).
|
|
2162
|
-
await sql`
|
|
2390
|
+
const result = await sql`
|
|
2163
2391
|
UPDATE ${sql.ref(tableName)}
|
|
2164
|
-
SET draft_revision_id = NULL
|
|
2392
|
+
SET draft_revision_id = NULL,
|
|
2393
|
+
version = version + 1
|
|
2165
2394
|
WHERE id = ${id}
|
|
2166
2395
|
AND deleted_at IS NULL
|
|
2396
|
+
AND version = ${existing.version}
|
|
2397
|
+
AND updated_at = ${existing.updatedAt}
|
|
2398
|
+
AND status = ${existing.status}
|
|
2399
|
+
AND ${nullableColumnMatch("live_revision_id", existing.liveRevisionId)}
|
|
2400
|
+
AND ${nullableColumnMatch("draft_revision_id", existing.draftRevisionId)}
|
|
2401
|
+
AND ${nullableColumnMatch("scheduled_at", existing.scheduledAt)}
|
|
2167
2402
|
`.execute(this.db);
|
|
2403
|
+
if ((result.numAffectedRows ?? 0n) === 0n) throw new ContentMutationConflictError();
|
|
2168
2404
|
|
|
2169
2405
|
const updated = await this.findById(type, id);
|
|
2170
2406
|
if (!updated) {
|