emdash 0.37.0 → 0.39.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/action-token-On1sot_c.mjs +26 -0
- package/dist/action-token-On1sot_c.mjs.map +1 -0
- package/dist/activation-CaMfdBt1.mjs +382 -0
- package/dist/activation-CaMfdBt1.mjs.map +1 -0
- package/dist/adapters-Cq10K4_c.d.mts +171 -0
- package/dist/adapters-Cq10K4_c.d.mts.map +1 -0
- package/dist/after-PcEvMY_6.mjs +96 -0
- package/dist/after-PcEvMY_6.mjs.map +1 -0
- package/dist/allowed-origins-1Sa-2wZK.mjs +116 -0
- package/dist/allowed-origins-1Sa-2wZK.mjs.map +1 -0
- package/dist/api/route-utils.d.mts +4 -3
- package/dist/api/route-utils.d.mts.map +1 -1
- package/dist/api/route-utils.mjs +45 -29
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +7 -6
- package/dist/api-DmjKxPCY.mjs +4831 -0
- package/dist/api-DmjKxPCY.mjs.map +1 -0
- package/dist/api-tokens-BIXItFKV.mjs +163 -0
- package/dist/api-tokens-BIXItFKV.mjs.map +1 -0
- package/dist/apply-drpfmqrR.mjs +1005 -0
- package/dist/apply-drpfmqrR.mjs.map +1 -0
- package/dist/artifact-fetch-COiMhVgk.mjs +813 -0
- package/dist/artifact-fetch-COiMhVgk.mjs.map +1 -0
- package/dist/astro/index.d.mts +14 -12
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +123 -13
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +12 -10
- package/dist/astro/middleware/auth.d.mts.map +1 -1
- package/dist/astro/middleware/auth.mjs +20 -11
- package/dist/astro/middleware/auth.mjs.map +1 -1
- package/dist/astro/middleware/media-usage-write-fence.mjs +5 -5
- package/dist/astro/middleware/redirect.mjs +11 -9
- package/dist/astro/middleware/redirect.mjs.map +1 -1
- package/dist/astro/middleware/request-context.d.mts +1 -1
- package/dist/astro/middleware/request-context.d.mts.map +1 -1
- package/dist/astro/middleware/request-context.mjs +154 -28
- package/dist/astro/middleware/request-context.mjs.map +1 -1
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +13 -10
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +122 -3041
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +10 -9
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +10 -9
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +6 -6
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +6 -6
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +13 -12
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +13 -12
- package/dist/astro/routes/api/admin/byline-fields/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +13 -12
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +22 -21
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +22 -21
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/index.mjs +22 -21
- package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_/status.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +21 -54
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_.mjs +8 -8
- package/dist/astro/routes/api/admin/comments/bulk.mjs +15 -14
- package/dist/astro/routes/api/admin/comments/bulk.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/counts.mjs +8 -8
- package/dist/astro/routes/api/admin/comments/index.mjs +15 -14
- package/dist/astro/routes/api/admin/comments/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +6 -6
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +5 -5
- package/dist/astro/routes/api/admin/media-usage/activation.mjs +17 -16
- package/dist/astro/routes/api/admin/media-usage/activation.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +19 -18
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +19 -18
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/progress.mjs +17 -17
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +21 -20
- package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +19 -18
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +19 -18
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs.map +1 -1
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +5 -5
- package/dist/astro/routes/api/admin/plugins/_id_/disable.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +9 -66
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +9 -69
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +66 -59
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +6 -6
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +65 -59
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +70 -61
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +87 -63
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +66 -59
- package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +4 -4
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +65 -59
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +85 -63
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +65 -59
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +70 -61
- 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 +90 -66
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +9 -7
- 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 +77 -63
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/verify.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +67 -61
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +66 -60
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.d.mts +8 -0
- package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.mjs +27 -0
- package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.mjs.map +1 -0
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +65 -59
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +4 -4
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +65 -59
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +4 -4
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +3 -3
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +11 -10
- package/dist/astro/routes/api/admin/users/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +5 -5
- package/dist/astro/routes/api/admin/users/index.mjs +10 -9
- package/dist/astro/routes/api/admin/users/index.mjs.map +1 -1
- package/dist/astro/routes/api/auth/dev-bypass.mjs +5 -5
- package/dist/astro/routes/api/auth/invite/accept.mjs +3 -3
- package/dist/astro/routes/api/auth/invite/complete.mjs +15 -14
- package/dist/astro/routes/api/auth/invite/complete.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/index.mjs +12 -11
- package/dist/astro/routes/api/auth/invite/index.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/register-options.mjs +14 -13
- package/dist/astro/routes/api/auth/invite/register-options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/logout.mjs +4 -4
- package/dist/astro/routes/api/auth/magic-link/send.mjs +14 -13
- package/dist/astro/routes/api/auth/magic-link/send.mjs.map +1 -1
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +4 -4
- package/dist/astro/routes/api/auth/me.mjs +11 -10
- package/dist/astro/routes/api/auth/me.mjs.map +1 -1
- package/dist/astro/routes/api/auth/mode.mjs +4 -4
- 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 +10 -9
- package/dist/astro/routes/api/auth/passkey/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/index.mjs +3 -3
- package/dist/astro/routes/api/auth/passkey/options.mjs +16 -15
- package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +14 -13
- package/dist/astro/routes/api/auth/passkey/register/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +15 -14
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/verify.mjs +15 -14
- package/dist/astro/routes/api/auth/passkey/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/complete.mjs +15 -14
- package/dist/astro/routes/api/auth/signup/complete.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/request.mjs +14 -13
- package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/verify.mjs +3 -3
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.d.mts.map +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +15 -211
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs.map +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +18 -17
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +4 -4
- 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 +17 -11
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +5 -5
- 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 +67 -0
- package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs.map +1 -0
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.d.mts +8 -0
- package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.d.mts.map +1 -0
- package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs +35 -0
- package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs.map +1 -0
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +16 -15
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/publish.d.mts +9 -2
- package/dist/astro/routes/api/content/_collection_/_id_/publish.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +28 -16
- 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 +27 -23
- 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 +27 -23
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +27 -12
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +23 -20
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +25 -12
- 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 +27 -14
- package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/authors.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/index.mjs +18 -12
- package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/trash.mjs +11 -10
- package/dist/astro/routes/api/content/_collection_/trash.mjs.map +1 -1
- package/dist/astro/routes/api/dashboard.mjs +14 -12
- package/dist/astro/routes/api/dashboard.mjs.map +1 -1
- package/dist/astro/routes/api/dev/emails.mjs +4 -4
- package/dist/astro/routes/api/health.d.mts +8 -0
- package/dist/astro/routes/api/health.d.mts.map +1 -0
- package/dist/astro/routes/api/health.mjs +21 -0
- package/dist/astro/routes/api/health.mjs.map +1 -0
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +25 -23
- package/dist/astro/routes/api/import/probe.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +5 -5
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +13 -11
- package/dist/astro/routes/api/import/wordpress/execute.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/execute.mjs +20 -19
- package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/media.d.mts +12 -10
- package/dist/astro/routes/api/import/wordpress/media.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/media.mjs +15 -14
- package/dist/astro/routes/api/import/wordpress/media.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +14 -13
- package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +13 -11
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +18 -17
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +25 -23
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +13 -11
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +36 -33
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
- package/dist/astro/routes/api/manifest.mjs +17 -9
- package/dist/astro/routes/api/manifest.mjs.map +1 -1
- package/dist/astro/routes/api/mcp.d.mts.map +1 -1
- package/dist/astro/routes/api/mcp.mjs +192 -110
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +15 -14
- package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/replace.mjs +12 -11
- package/dist/astro/routes/api/media/_id_/replace.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/upload.mjs +8 -8
- package/dist/astro/routes/api/media/_id_/usage.mjs +23 -22
- package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_.mjs +22 -21
- package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/media/asset/_id_/_filename_.d.mts +8 -0
- package/dist/astro/routes/api/media/asset/_id_/_filename_.d.mts.map +1 -0
- package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs +52 -0
- package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs.map +1 -0
- package/dist/astro/routes/api/media/file/_...key_.mjs +3 -3
- package/dist/astro/routes/api/media/folders/_id_.mjs +12 -11
- package/dist/astro/routes/api/media/folders/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/media/folders/index.mjs +12 -11
- package/dist/astro/routes/api/media/folders/index.mjs.map +1 -1
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +4 -4
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +4 -4
- package/dist/astro/routes/api/media/providers/index.mjs +4 -4
- package/dist/astro/routes/api/media/upload-url.mjs +14 -13
- package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
- package/dist/astro/routes/api/media.mjs +26 -25
- package/dist/astro/routes/api/media.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +15 -14
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items.mjs +15 -14
- package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +15 -14
- package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/translations.mjs +15 -14
- package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_.mjs +15 -14
- package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/index.mjs +15 -14
- 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 +7 -7
- package/dist/astro/routes/api/oauth/device/code.mjs +10 -10
- package/dist/astro/routes/api/oauth/device/token.mjs +9 -9
- package/dist/astro/routes/api/oauth/register.mjs +4 -4
- package/dist/astro/routes/api/oauth/token/refresh.mjs +7 -7
- package/dist/astro/routes/api/oauth/token/revoke.mjs +7 -7
- package/dist/astro/routes/api/oauth/token.mjs +7 -7
- package/dist/astro/routes/api/openapi.json.mjs +95 -24
- package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.d.mts +2 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.d.mts.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +22 -40
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/index.mjs +18 -14
- package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/summary.mjs +18 -14
- package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/redirects/_id_.mjs +20 -22
- package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/index.d.mts.map +1 -1
- package/dist/astro/routes/api/redirects/index.mjs +19 -19
- package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/index.mjs +27 -23
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/translations.mjs +21 -18
- package/dist/astro/routes/api/relations/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/relations/index.mjs +27 -23
- package/dist/astro/routes/api/relations/index.mjs.map +1 -1
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +4 -4
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +5 -5
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +65 -59
- 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 +65 -59
- 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 +65 -59
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +65 -59
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +65 -59
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/reorder.mjs +65 -59
- package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +16 -14
- package/dist/astro/routes/api/schema/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +65 -59
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +65 -59
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +16 -14
- package/dist/astro/routes/api/search/enable.mjs.map +1 -1
- package/dist/astro/routes/api/search/index.mjs +17 -14
- package/dist/astro/routes/api/search/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/rebuild.mjs +16 -14
- package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
- package/dist/astro/routes/api/search/stats.mjs +10 -9
- package/dist/astro/routes/api/search/stats.mjs.map +1 -1
- package/dist/astro/routes/api/search/suggest.mjs +15 -13
- package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
- package/dist/astro/routes/api/sections/_slug_.mjs +15 -13
- package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/sections/index.mjs +15 -13
- package/dist/astro/routes/api/sections/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +9 -8
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +8 -7
- package/dist/astro/routes/api/settings/backups/archives/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/export.mjs +9 -8
- package/dist/astro/routes/api/settings/backups/export.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/index.mjs +10 -9
- package/dist/astro/routes/api/settings/backups/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/email.mjs +6 -6
- package/dist/astro/routes/api/settings.mjs +22 -20
- package/dist/astro/routes/api/settings.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin-verify.mjs +16 -15
- package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin.mjs +15 -14
- package/dist/astro/routes/api/setup/admin.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-bypass.mjs +42 -38
- package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-reset.mjs +4 -4
- package/dist/astro/routes/api/setup/index.mjs +43 -38
- package/dist/astro/routes/api/setup/index.mjs.map +1 -1
- package/dist/astro/routes/api/setup/status.mjs +5 -5
- package/dist/astro/routes/api/snapshot.mjs +11 -10
- package/dist/astro/routes/api/snapshot.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +23 -21
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +23 -21
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +23 -21
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +23 -21
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +22 -20
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_.mjs +23 -21
- package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +23 -21
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +8 -8
- package/dist/astro/routes/api/typegen.mjs +6 -6
- package/dist/astro/routes/api/visual-editing/action-token.d.mts +8 -0
- package/dist/astro/routes/api/visual-editing/action-token.d.mts.map +1 -0
- package/dist/astro/routes/api/visual-editing/action-token.mjs +25 -0
- package/dist/astro/routes/api/visual-editing/action-token.mjs.map +1 -0
- package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.d.mts +8 -0
- package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.d.mts.map +1 -0
- package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs +37 -0
- package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs.map +1 -0
- package/dist/astro/routes/api/visual-editing/toolbar-labels.d.mts +8 -0
- package/dist/astro/routes/api/visual-editing/toolbar-labels.d.mts.map +1 -0
- package/dist/astro/routes/api/visual-editing/toolbar-labels.mjs +20 -0
- package/dist/astro/routes/api/visual-editing/toolbar-labels.mjs.map +1 -0
- package/dist/astro/routes/api/well-known/auth.mjs +2 -2
- package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
- package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +12 -11
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +16 -15
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +16 -15
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.mjs +10 -10
- package/dist/astro/routes/api/widget-areas/index.mjs +16 -15
- package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
- package/dist/astro/routes/api/widget-components.mjs +4 -4
- package/dist/astro/routes/robots.txt.mjs +13 -12
- package/dist/astro/routes/robots.txt.mjs.map +1 -1
- package/dist/astro/routes/sitemap-_collection_.xml.d.mts.map +1 -1
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +24 -19
- package/dist/astro/routes/sitemap-_collection_.xml.mjs.map +1 -1
- package/dist/astro/routes/sitemap.xml.mjs +14 -13
- package/dist/astro/routes/sitemap.xml.mjs.map +1 -1
- package/dist/astro/types.d.mts +79 -26
- 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/authoritative-records-DbqshfKD.mjs +5172 -0
- package/dist/authoritative-records-DbqshfKD.mjs.map +1 -0
- package/dist/authorize-BXpfMpp0.mjs +40 -0
- package/dist/authorize-BXpfMpp0.mjs.map +1 -0
- package/dist/backup-BsPQdwnS.mjs +246 -0
- package/dist/backup-BsPQdwnS.mjs.map +1 -0
- package/dist/base64-DvnNgP7e.mjs +63 -0
- package/dist/base64-DvnNgP7e.mjs.map +1 -0
- package/dist/byline-Doh-wt99.mjs +906 -0
- package/dist/byline-Doh-wt99.mjs.map +1 -0
- package/dist/byline-fields-CsrdvaLV.mjs +123 -0
- package/dist/byline-fields-CsrdvaLV.mjs.map +1 -0
- package/dist/byline-registry-D6lWzXk6.mjs +406 -0
- package/dist/byline-registry-D6lWzXk6.mjs.map +1 -0
- package/dist/bylines-Cop0hkoy.mjs +214 -0
- package/dist/bylines-Cop0hkoy.mjs.map +1 -0
- package/dist/bylines-kpBzHPr8.mjs +232 -0
- package/dist/bylines-kpBzHPr8.mjs.map +1 -0
- package/dist/cache-B0pOlXdM.mjs +108 -0
- package/dist/cache-B0pOlXdM.mjs.map +1 -0
- package/dist/capture-triggers-gxQxnxrJ.mjs +362 -0
- package/dist/capture-triggers-gxQxnxrJ.mjs.map +1 -0
- package/dist/challenge-store-CkRdSdd8.mjs +51 -0
- package/dist/challenge-store-CkRdSdd8.mjs.map +1 -0
- package/dist/checksum-Bsi2D9M1.mjs +162 -0
- package/dist/checksum-Bsi2D9M1.mjs.map +1 -0
- package/dist/chrome-tags-D7LGB91U.mjs +24 -0
- package/dist/chrome-tags-D7LGB91U.mjs.map +1 -0
- package/dist/chunks-BmWyou79.mjs +25 -0
- package/dist/chunks-BmWyou79.mjs.map +1 -0
- package/dist/cli/index.mjs +921 -106
- 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-C3Xixmkx.mjs +436 -0
- package/dist/collection-deletion-C3Xixmkx.mjs.map +1 -0
- package/dist/collection-slugs-cache-D9auiKmI.mjs +85 -0
- package/dist/collection-slugs-cache-D9auiKmI.mjs.map +1 -0
- package/dist/comment-DcT8qdPK.mjs +313 -0
- package/dist/comment-DcT8qdPK.mjs.map +1 -0
- package/dist/comment-reaction-DY5-y8Y5.mjs +85 -0
- package/dist/comment-reaction-DY5-y8Y5.mjs.map +1 -0
- package/dist/comments-B67VRNGw.mjs +204 -0
- package/dist/comments-B67VRNGw.mjs.map +1 -0
- package/dist/comments-BVzzt6x5.mjs +99 -0
- package/dist/comments-BVzzt6x5.mjs.map +1 -0
- package/dist/components-DIl9Qzh6.mjs +108 -0
- package/dist/components-DIl9Qzh6.mjs.map +1 -0
- package/dist/config-B2acLeC5.mjs +242 -0
- package/dist/config-B2acLeC5.mjs.map +1 -0
- package/dist/config-CGVeT8Hc.mjs +73 -0
- package/dist/config-CGVeT8Hc.mjs.map +1 -0
- package/dist/config-D3HhLON3.d.mts +39 -0
- package/dist/config-D3HhLON3.d.mts.map +1 -0
- package/dist/config-DS7e4EZ9.d.mts +6387 -0
- package/dist/config-DS7e4EZ9.d.mts.map +1 -0
- package/dist/content-DZ3B5qtA.mjs +2216 -0
- package/dist/content-DZ3B5qtA.mjs.map +1 -0
- package/dist/content-list-query-CbPdzsna.d.mts +26 -0
- package/dist/content-list-query-CbPdzsna.d.mts.map +1 -0
- package/dist/content-policy-CM4skrNi.mjs +46 -0
- package/dist/content-policy-CM4skrNi.mjs.map +1 -0
- package/dist/content-refresh-BHLHJgyt.mjs +3599 -0
- package/dist/content-refresh-BHLHJgyt.mjs.map +1 -0
- package/dist/content-repair-BVll5WNl.mjs +440 -0
- package/dist/content-repair-BVll5WNl.mjs.map +1 -0
- package/dist/context-B195kjqZ.mjs +1835 -0
- package/dist/context-B195kjqZ.mjs.map +1 -0
- package/dist/cron-BcR3RN4K.mjs +282 -0
- package/dist/cron-BcR3RN4K.mjs.map +1 -0
- package/dist/dashboard-CZD4G7k_.mjs +151 -0
- package/dist/dashboard-CZD4G7k_.mjs.map +1 -0
- package/dist/database/migration-lock.d.mts +37 -0
- package/dist/database/migration-lock.d.mts.map +1 -0
- package/dist/database/migration-lock.mjs +76 -0
- package/dist/database/migration-lock.mjs.map +1 -0
- package/dist/database/pg-migration-lock.d.mts +1 -1
- package/dist/database/pg-migration-lock.mjs +1 -1
- package/dist/database/pg-migration-lock.mjs.map +1 -1
- package/dist/datetime-normalization-PeiEdcRY.mjs +187 -0
- package/dist/datetime-normalization-PeiEdcRY.mjs.map +1 -0
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +4 -3
- package/dist/db/index.mjs.map +1 -1
- package/dist/db/libsql-migrations.d.mts +1 -1
- package/dist/db/libsql-migrations.mjs +7 -6
- package/dist/db/libsql-migrations.mjs.map +1 -1
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres-migrations.d.mts +1 -1
- package/dist/db/postgres-migrations.mjs +7 -6
- package/dist/db/postgres-migrations.mjs.map +1 -1
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite-migrations.d.mts +1 -1
- package/dist/db/sqlite-migrations.mjs +7 -6
- package/dist/db/sqlite-migrations.mjs.map +1 -1
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/db/sqlite.mjs +1 -1
- package/dist/db-errors-CBD5yMro.mjs +55 -0
- package/dist/db-errors-CBD5yMro.mjs.map +1 -0
- package/dist/default-BtlxWgh9.mjs +81 -0
- package/dist/default-BtlxWgh9.mjs.map +1 -0
- package/dist/deferred-tasks-Ba9fphlE.d.mts +9 -0
- package/dist/deferred-tasks-Ba9fphlE.d.mts.map +1 -0
- package/dist/dev-typegen-CZaPLl3V.mjs +29 -0
- package/dist/dev-typegen-CZaPLl3V.mjs.map +1 -0
- package/dist/device-flow-3E5l0fpH.mjs +466 -0
- package/dist/device-flow-3E5l0fpH.mjs.map +1 -0
- package/dist/dialect-helpers-CtYdsX4W.mjs +307 -0
- package/dist/dialect-helpers-CtYdsX4W.mjs.map +1 -0
- package/dist/direct-executor-ZI8E01Yt.mjs +104 -0
- package/dist/direct-executor-ZI8E01Yt.mjs.map +1 -0
- package/dist/dist-2hDLsLeq.mjs +810 -0
- package/dist/dist-2hDLsLeq.mjs.map +1 -0
- package/dist/email-console-gc-E3Eqj.mjs +50 -0
- package/dist/email-console-gc-E3Eqj.mjs.map +1 -0
- package/dist/emdash-runtime-DZGinqTL.mjs +4041 -0
- package/dist/emdash-runtime-DZGinqTL.mjs.map +1 -0
- package/dist/enrich-C2Mk0lwE.mjs +194 -0
- package/dist/enrich-C2Mk0lwE.mjs.map +1 -0
- package/dist/entry-lock-D3C99MXS.mjs +1520 -0
- package/dist/entry-lock-D3C99MXS.mjs.map +1 -0
- package/dist/entry-lock-D9rnj2Lu.mjs +163 -0
- package/dist/entry-lock-D9rnj2Lu.mjs.map +1 -0
- package/dist/entry-lock-DX7QkqEg.d.mts +3503 -0
- package/dist/entry-lock-DX7QkqEg.d.mts.map +1 -0
- package/dist/entry-locks-CO_KaoU5.mjs +167 -0
- package/dist/entry-locks-CO_KaoU5.mjs.map +1 -0
- package/dist/error-CCTCskie.mjs +90 -0
- package/dist/error-CCTCskie.mjs.map +1 -0
- package/dist/errors-W3PA8HqB.mjs +447 -0
- package/dist/errors-W3PA8HqB.mjs.map +1 -0
- package/dist/escape-DN4Qmjsl.mjs +9 -0
- package/dist/escape-DN4Qmjsl.mjs.map +1 -0
- package/dist/field-defs-cache-B337z8UJ.mjs +77 -0
- package/dist/field-defs-cache-B337z8UJ.mjs.map +1 -0
- package/dist/focal-point-Gr34o-4o.mjs +23 -0
- package/dist/focal-point-Gr34o-4o.mjs.map +1 -0
- package/dist/fts-manager-DMb0sbIQ.mjs +413 -0
- package/dist/fts-manager-DMb0sbIQ.mjs.map +1 -0
- package/dist/hash-CLVFzWvx.mjs +37 -0
- package/dist/hash-CLVFzWvx.mjs.map +1 -0
- package/dist/hook-result-KY1jq21o.d.mts +31 -0
- package/dist/hook-result-KY1jq21o.d.mts.map +1 -0
- package/dist/hreflang-BgS2FqhH.d.mts +50 -0
- package/dist/hreflang-BgS2FqhH.d.mts.map +1 -0
- package/dist/hreflang-CrJwqoeb.mjs +105 -0
- package/dist/hreflang-CrJwqoeb.mjs.map +1 -0
- package/dist/http-route-dispatch-DAKlanXb.mjs +339 -0
- package/dist/http-route-dispatch-DAKlanXb.mjs.map +1 -0
- package/dist/identity-DRGSHEEr.mjs +35 -0
- package/dist/identity-DRGSHEEr.mjs.map +1 -0
- package/dist/import-DFr5B_hC.mjs +2020 -0
- package/dist/import-DFr5B_hC.mjs.map +1 -0
- package/dist/index-CDwKDkTq.d.mts +623 -0
- package/dist/index-CDwKDkTq.d.mts.map +1 -0
- package/dist/index.d.mts +27 -22
- package/dist/index.mjs +101 -86
- package/dist/init-lock-4eRRB4Le.mjs +56 -0
- package/dist/init-lock-4eRRB4Le.mjs.map +1 -0
- package/dist/install-finalization-5Os-QZ-2.mjs +58 -0
- package/dist/install-finalization-5Os-QZ-2.mjs.map +1 -0
- package/dist/lifecycle-7e-Lt_kX.mjs +25 -0
- package/dist/lifecycle-7e-Lt_kX.mjs.map +1 -0
- package/dist/load-Cu5bvCZh.mjs +28 -0
- package/dist/load-Cu5bvCZh.mjs.map +1 -0
- package/dist/loader-t4TxaFiQ.mjs +1004 -0
- package/dist/loader-t4TxaFiQ.mjs.map +1 -0
- package/dist/manifest-builder-D31UoJCu.mjs +189 -0
- package/dist/manifest-builder-D31UoJCu.mjs.map +1 -0
- package/dist/manifest-schema-Bkh8SeHd.mjs +491 -0
- package/dist/manifest-schema-Bkh8SeHd.mjs.map +1 -0
- package/dist/media/image-endpoint.mjs +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +4 -4
- package/dist/media/local-runtime.d.mts +14 -12
- package/dist/media/local-runtime.d.mts.map +1 -1
- package/dist/media/local-runtime.mjs +12 -11
- package/dist/media/local-runtime.mjs.map +1 -1
- package/dist/media-TBlKCwo7.mjs +334 -0
- package/dist/media-TBlKCwo7.mjs.map +1 -0
- package/dist/media-allowlist-s60eAIf6.mjs +44 -0
- package/dist/media-allowlist-s60eAIf6.mjs.map +1 -0
- package/dist/media-folders-ClIRLUQv.mjs +210 -0
- package/dist/media-folders-ClIRLUQv.mjs.map +1 -0
- package/dist/media-url-DY_ijO3B.mjs +43 -0
- package/dist/media-url-DY_ijO3B.mjs.map +1 -0
- package/dist/media-usage-C4NolTpQ.mjs +1833 -0
- package/dist/media-usage-C4NolTpQ.mjs.map +1 -0
- package/dist/media-usage-activation-CAhmb14O.mjs +78 -0
- package/dist/media-usage-activation-CAhmb14O.mjs.map +1 -0
- package/dist/media-usage-work-Cu5DqewW.mjs +586 -0
- package/dist/media-usage-work-Cu5DqewW.mjs.map +1 -0
- package/dist/media-usage-work-DJr3rOEN.mjs +152 -0
- package/dist/media-usage-work-DJr3rOEN.mjs.map +1 -0
- package/dist/media-usage-write-fence-DW5oHT7q.mjs +42 -0
- package/dist/media-usage-write-fence-DW5oHT7q.mjs.map +1 -0
- package/dist/menus-DbgU9z5Q.mjs +3732 -0
- package/dist/menus-DbgU9z5Q.mjs.map +1 -0
- package/dist/menus-Wy8m5NcH.mjs +753 -0
- package/dist/menus-Wy8m5NcH.mjs.map +1 -0
- package/dist/migrations/index.d.mts +2 -2
- package/dist/migrations/index.d.mts.map +1 -1
- package/dist/migrations/index.mjs +6 -5
- package/dist/mime-CCYRC4r1.mjs +36 -0
- package/dist/mime-CCYRC4r1.mjs.map +1 -0
- package/dist/mode-CkmOhFqj.mjs +23 -0
- package/dist/mode-CkmOhFqj.mjs.map +1 -0
- package/dist/node-sqlite-compat-vpVaILnb.mjs +46 -0
- package/dist/node-sqlite-compat-vpVaILnb.mjs.map +1 -0
- package/dist/normalize-dChXQjwS.mjs +191 -0
- package/dist/normalize-dChXQjwS.mjs.map +1 -0
- package/dist/oauth-authorization-DZ-R-hmx.mjs +274 -0
- package/dist/oauth-authorization-DZ-R-hmx.mjs.map +1 -0
- package/dist/oauth-clients-BMPA8vjl.mjs +266 -0
- package/dist/oauth-clients-BMPA8vjl.mjs.map +1 -0
- package/dist/oauth-state-store-0gIdb48-.mjs +50 -0
- package/dist/oauth-state-store-0gIdb48-.mjs.map +1 -0
- package/dist/oauth-user-lookup-ChVW4UWu.mjs +26 -0
- package/dist/oauth-user-lookup-ChVW4UWu.mjs.map +1 -0
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/object-cache-DlSVbn5Y.mjs +534 -0
- package/dist/object-cache-DlSVbn5Y.mjs.map +1 -0
- package/dist/options-D5WcorD5.mjs +200 -0
- package/dist/options-D5WcorD5.mjs.map +1 -0
- package/dist/options-DAknChnw.d.mts +77 -0
- package/dist/options-DAknChnw.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 +13 -0
- package/dist/page/index.mjs.map +1 -1
- package/dist/parse-Cr379Av9.mjs +81 -0
- package/dist/parse-Cr379Av9.mjs.map +1 -0
- package/dist/parse-tj9XLNO_.d.mts +165 -0
- package/dist/parse-tj9XLNO_.d.mts.map +1 -0
- package/dist/passkey-config-BD-wMaCf.mjs +46 -0
- package/dist/passkey-config-BD-wMaCf.mjs.map +1 -0
- package/dist/patterns-Do3iqi7N.mjs +145 -0
- package/dist/patterns-Do3iqi7N.mjs.map +1 -0
- package/dist/placeholder-CubPFn_L.d.mts +306 -0
- package/dist/placeholder-CubPFn_L.d.mts.map +1 -0
- package/dist/plugin-test-runtime.d.mts +97 -0
- package/dist/plugin-test-runtime.d.mts.map +1 -0
- package/dist/plugin-test-runtime.mjs +105 -0
- package/dist/plugin-types.d.mts +53 -15
- package/dist/plugin-types.d.mts.map +1 -1
- package/dist/plugin-types.mjs +18 -1
- package/dist/plugin-types.mjs.map +1 -0
- package/dist/plugin-utils.d.mts +12 -10
- package/dist/plugin-utils.d.mts.map +1 -1
- package/dist/plugins/adapt-sandbox-entry.d.mts +12 -10
- package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
- package/dist/plugins/adapt-sandbox-entry.mjs +18 -13
- package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
- package/dist/plugins/host.d.mts +7 -0
- package/dist/plugins/host.mjs +45 -0
- package/dist/plugins/http-wire.d.mts +25 -0
- package/dist/plugins/http-wire.d.mts.map +1 -0
- package/dist/plugins/http-wire.mjs +148 -0
- package/dist/plugins/http-wire.mjs.map +1 -0
- package/dist/plugins/secret-redactor.d.mts +9 -0
- package/dist/plugins/secret-redactor.d.mts.map +1 -0
- package/dist/plugins/secret-redactor.mjs +51 -0
- package/dist/plugins/secret-redactor.mjs.map +1 -0
- package/dist/plugins-DHurtdXQ.mjs +277 -0
- package/dist/plugins-DHurtdXQ.mjs.map +1 -0
- package/dist/policy-lyZnjpwz.mjs +45 -0
- package/dist/policy-lyZnjpwz.mjs.map +1 -0
- package/dist/portable-text-oAwodbPS.mjs +286 -0
- package/dist/portable-text-oAwodbPS.mjs.map +1 -0
- package/dist/preview-Cup2bj8c.mjs +107 -0
- package/dist/preview-Cup2bj8c.mjs.map +1 -0
- package/dist/protocol-C1CNiKX4.d.mts +61 -0
- package/dist/protocol-C1CNiKX4.d.mts.map +1 -0
- package/dist/public-submission-Cs-pFMQK.mjs +245 -0
- package/dist/public-submission-Cs-pFMQK.mjs.map +1 -0
- package/dist/public-url-BWVHsfQv.mjs +101 -0
- package/dist/public-url-BWVHsfQv.mjs.map +1 -0
- package/dist/query-D-lxiOgn.mjs +890 -0
- package/dist/query-D-lxiOgn.mjs.map +1 -0
- package/dist/query-D7kHKOws.mjs +41 -0
- package/dist/query-D7kHKOws.mjs.map +1 -0
- package/dist/rate-limit-CqJn-w4h.mjs +120 -0
- package/dist/rate-limit-CqJn-w4h.mjs.map +1 -0
- package/dist/redirect-BrChFPIu.mjs +17 -0
- package/dist/redirect-BrChFPIu.mjs.map +1 -0
- package/dist/redirect-D2Yo-b6S.mjs +415 -0
- package/dist/redirect-D2Yo-b6S.mjs.map +1 -0
- package/dist/redirects-BCiTaIQ-.mjs +146 -0
- package/dist/redirects-BCiTaIQ-.mjs.map +1 -0
- package/dist/redirects-ByItliuu.mjs +644 -0
- package/dist/redirects-ByItliuu.mjs.map +1 -0
- package/dist/registry/testing.d.mts +14 -0
- package/dist/registry/testing.d.mts.map +1 -0
- package/dist/registry/testing.mjs +255 -0
- package/dist/registry/testing.mjs.map +1 -0
- package/dist/registry-CkuPoZs7.mjs +1222 -0
- package/dist/registry-CkuPoZs7.mjs.map +1 -0
- package/dist/relation-XTAtOpJO.mjs +334 -0
- package/dist/relation-XTAtOpJO.mjs.map +1 -0
- package/dist/relations-B4w-G5U9.mjs +309 -0
- package/dist/relations-B4w-G5U9.mjs.map +1 -0
- package/dist/relations-O63JWBRj.mjs +403 -0
- package/dist/relations-O63JWBRj.mjs.map +1 -0
- package/dist/request-cache-DaMhSQdx.mjs +104 -0
- package/dist/request-cache-DaMhSQdx.mjs.map +1 -0
- package/dist/request-context.d.mts +1 -1
- package/dist/request-meta-C8yl_sIs.mjs +141 -0
- package/dist/request-meta-C8yl_sIs.mjs.map +1 -0
- package/dist/resolve-BJIS8wKr.mjs +199 -0
- package/dist/resolve-BJIS8wKr.mjs.map +1 -0
- package/dist/route-wire-D66L2oaZ.mjs +197 -0
- package/dist/route-wire-D66L2oaZ.mjs.map +1 -0
- package/dist/routes-DYsTe-oR.mjs +321 -0
- package/dist/routes-DYsTe-oR.mjs.map +1 -0
- package/dist/runner-3gfxRsJG.d.mts +68 -0
- package/dist/runner-3gfxRsJG.d.mts.map +1 -0
- package/dist/runner-ClrleR8A.mjs +5502 -0
- package/dist/runner-ClrleR8A.mjs.map +1 -0
- package/dist/runtime.d.mts +13 -11
- package/dist/runtime.d.mts.map +1 -1
- package/dist/runtime.mjs +6 -5
- package/dist/runtime.mjs.map +1 -1
- package/dist/schema-CPhPM9Do.mjs +420 -0
- package/dist/schema-CPhPM9Do.mjs.map +1 -0
- package/dist/schema-DEERRrKS.mjs +9 -0
- package/dist/schema-DEERRrKS.mjs.map +1 -0
- package/dist/scopes-Bn8_rCSt.mjs +27 -0
- package/dist/scopes-Bn8_rCSt.mjs.map +1 -0
- package/dist/search-lami_Ota.mjs +448 -0
- package/dist/search-lami_Ota.mjs.map +1 -0
- package/dist/secrets-DNgVgz_e.mjs +341 -0
- package/dist/secrets-DNgVgz_e.mjs.map +1 -0
- package/dist/sections-BIpd4Cxf.mjs +346 -0
- package/dist/sections-BIpd4Cxf.mjs.map +1 -0
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +35 -31
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.d.mts.map +1 -1
- package/dist/seo/index.mjs +27 -26
- package/dist/seo/index.mjs.map +1 -1
- package/dist/seo-BtU70b7l.mjs +114 -0
- package/dist/seo-BtU70b7l.mjs.map +1 -0
- package/dist/seo-_4qmazxz.mjs +133 -0
- package/dist/seo-_4qmazxz.mjs.map +1 -0
- package/dist/service-Bpy5iTX0.mjs +150 -0
- package/dist/service-Bpy5iTX0.mjs.map +1 -0
- package/dist/session-user-BQeS2Mrb.mjs +51 -0
- package/dist/session-user-BQeS2Mrb.mjs.map +1 -0
- package/dist/settings-DmroR53o.mjs +420 -0
- package/dist/settings-DmroR53o.mjs.map +1 -0
- package/dist/settings-g2F2a3Ub.mjs +51 -0
- package/dist/settings-g2F2a3Ub.mjs.map +1 -0
- package/dist/setup-complete-BrZaXpVV.mjs +26 -0
- package/dist/setup-complete-BrZaXpVV.mjs.map +1 -0
- package/dist/setup-nonce-Cb9-884O.mjs +25 -0
- package/dist/setup-nonce-Cb9-884O.mjs.map +1 -0
- package/dist/single-flight-cache-B5O2qhO1.mjs +104 -0
- package/dist/single-flight-cache-B5O2qhO1.mjs.map +1 -0
- package/dist/site-url-DjhYCaep.mjs +16 -0
- package/dist/site-url-DjhYCaep.mjs.map +1 -0
- package/dist/slugify-T5GHH42D.mjs +17 -0
- package/dist/slugify-T5GHH42D.mjs.map +1 -0
- package/dist/snapshot-C32Xuv3o.mjs +233 -0
- package/dist/snapshot-C32Xuv3o.mjs.map +1 -0
- package/dist/ssrf-Co1GGFZz.mjs +406 -0
- package/dist/ssrf-Co1GGFZz.mjs.map +1 -0
- package/dist/state-C7gCoiHr.mjs +153 -0
- package/dist/state-C7gCoiHr.mjs.map +1 -0
- package/dist/status-DLoBmcDz.mjs +30 -0
- package/dist/status-DLoBmcDz.mjs.map +1 -0
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +1 -1
- package/dist/storage-query-CPctdMKX.d.mts +1519 -0
- package/dist/storage-query-CPctdMKX.d.mts.map +1 -0
- package/dist/target-CUKlGrXb.mjs +27 -0
- package/dist/target-CUKlGrXb.mjs.map +1 -0
- package/dist/taxonomies-BpqpXJUE.mjs +707 -0
- package/dist/taxonomies-BpqpXJUE.mjs.map +1 -0
- package/dist/taxonomies-ClCo4IGO.mjs +899 -0
- package/dist/taxonomies-ClCo4IGO.mjs.map +1 -0
- package/dist/taxonomy-Dj1vpw5E.mjs +508 -0
- package/dist/taxonomy-Dj1vpw5E.mjs.map +1 -0
- package/dist/tokens-Ns02GAma.mjs +171 -0
- package/dist/tokens-Ns02GAma.mjs.map +1 -0
- package/dist/transaction-BcJO4Tmc.mjs +29 -0
- package/dist/transaction-BcJO4Tmc.mjs.map +1 -0
- package/dist/transport-B8P1xsqk.mjs +136 -0
- package/dist/transport-B8P1xsqk.mjs.map +1 -0
- package/dist/transport-BLHZZcD_.d.mts +42 -0
- package/dist/transport-BLHZZcD_.d.mts.map +1 -0
- package/dist/trusted-proxy-Cg7SuD15.mjs +51 -0
- package/dist/trusted-proxy-Cg7SuD15.mjs.map +1 -0
- package/dist/turnstile-DWCSh_Qc.mjs +53 -0
- package/dist/turnstile-DWCSh_Qc.mjs.map +1 -0
- package/dist/types-B3RkqvDW.mjs +156 -0
- package/dist/types-B3RkqvDW.mjs.map +1 -0
- package/dist/types-BkUg2yHx.mjs +92 -0
- package/dist/types-BkUg2yHx.mjs.map +1 -0
- package/dist/types-BtuppOTV.mjs +16 -0
- package/dist/types-BtuppOTV.mjs.map +1 -0
- package/dist/types-CCR3ivXE.d.mts +363 -0
- package/dist/types-CCR3ivXE.d.mts.map +1 -0
- package/dist/types-CSHgU_-_.mjs +18 -0
- package/dist/types-CSHgU_-_.mjs.map +1 -0
- package/dist/types-CbwqGOXm.d.mts +766 -0
- package/dist/types-CbwqGOXm.d.mts.map +1 -0
- package/dist/types-D4RGIc2I.d.mts +198 -0
- package/dist/types-D4RGIc2I.d.mts.map +1 -0
- package/dist/types-DEHidMEk.d.mts +1637 -0
- package/dist/types-DEHidMEk.d.mts.map +1 -0
- package/dist/types-DQeU2SR7.d.mts +279 -0
- package/dist/types-DQeU2SR7.d.mts.map +1 -0
- package/dist/types-DxQWoQLA.d.mts +264 -0
- package/dist/types-DxQWoQLA.d.mts.map +1 -0
- package/dist/types-FBBnGZ2Y.d.mts +198 -0
- package/dist/types-FBBnGZ2Y.d.mts.map +1 -0
- package/dist/types-ZCnlropY.mjs +69 -0
- package/dist/types-ZCnlropY.mjs.map +1 -0
- package/dist/types-_Qtyawiy.d.mts +124 -0
- package/dist/types-_Qtyawiy.d.mts.map +1 -0
- package/dist/types-gC6FAoa_.d.mts +75 -0
- package/dist/types-gC6FAoa_.d.mts.map +1 -0
- package/dist/types-k--LneIF.mjs +22 -0
- package/dist/types-k--LneIF.mjs.map +1 -0
- package/dist/upload-attempts-2xdnoKGe.mjs +27 -0
- package/dist/upload-attempts-2xdnoKGe.mjs.map +1 -0
- package/dist/url-pattern-3m3reMzr.mjs +33 -0
- package/dist/url-pattern-3m3reMzr.mjs.map +1 -0
- package/dist/user-DroRntkx.mjs +171 -0
- package/dist/user-DroRntkx.mjs.map +1 -0
- package/dist/utils-CC2oNGV8.mjs +435 -0
- package/dist/utils-CC2oNGV8.mjs.map +1 -0
- package/dist/validate-BCP9HNDn.mjs +384 -0
- package/dist/validate-BCP9HNDn.mjs.map +1 -0
- package/dist/validate-CyQ7I3xF.d.mts +410 -0
- package/dist/validate-CyQ7I3xF.d.mts.map +1 -0
- package/dist/validate-DANX1-Qi.mjs +120 -0
- package/dist/validate-DANX1-Qi.mjs.map +1 -0
- package/dist/validation-DBy6WF94.mjs +216 -0
- package/dist/validation-DBy6WF94.mjs.map +1 -0
- package/dist/version-B57E4Uo7.mjs +7 -0
- package/dist/version-B57E4Uo7.mjs.map +1 -0
- package/dist/widgets-wQ7Xcgq8.mjs +126 -0
- package/dist/widgets-wQ7Xcgq8.mjs.map +1 -0
- package/dist/wxr-taxonomies-DIHfvEDt.mjs +406 -0
- package/dist/wxr-taxonomies-DIHfvEDt.mjs.map +1 -0
- package/dist/wxr-taxonomies-DU2ZSiGc.d.mts +34 -0
- package/dist/wxr-taxonomies-DU2ZSiGc.d.mts.map +1 -0
- package/dist/zod-generator-D_yHIWfs.mjs +329 -0
- package/dist/zod-generator-D_yHIWfs.mjs.map +1 -0
- package/package.json +39 -12
- package/src/api/errors.ts +23 -0
- package/src/api/handlers/backup.ts +11 -5
- package/src/api/handlers/content.ts +226 -85
- package/src/api/handlers/dashboard.ts +31 -1
- package/src/api/handlers/entry-lock.ts +206 -0
- package/src/api/handlers/index.ts +3 -0
- package/src/api/handlers/manifest.ts +5 -6
- package/src/api/handlers/marketplace.ts +126 -34
- package/src/api/handlers/media-upload.ts +31 -4
- package/src/api/handlers/menus.ts +9 -0
- package/src/api/handlers/plugin-settings.ts +35 -3
- package/src/api/handlers/redirects.ts +221 -138
- package/src/api/handlers/registry.ts +75 -29
- package/src/api/handlers/revision.ts +16 -27
- package/src/api/handlers/seo.ts +10 -1
- package/src/api/handlers/snapshot.ts +87 -72
- package/src/api/handlers/taxonomies.ts +79 -5
- package/src/api/handlers/validation.ts +120 -19
- package/src/api/openapi/document.ts +133 -11
- package/src/api/schemas/content.ts +32 -12
- package/src/api/schemas/entry-lock.ts +57 -0
- package/src/api/schemas/index.ts +1 -0
- package/src/api/schemas/schema.ts +10 -1
- package/src/api/schemas/search.ts +4 -0
- package/src/api/types.ts +4 -0
- package/src/astro/integration/index.ts +22 -6
- package/src/astro/integration/routes.ts +89 -0
- package/src/astro/integration/runtime.ts +40 -24
- package/src/astro/integration/virtual-modules.ts +4 -0
- package/src/astro/integration/vite-config.ts +31 -0
- package/src/astro/middleware/auth.ts +25 -4
- package/src/astro/middleware/request-context.ts +28 -10
- package/src/astro/middleware.ts +33 -1
- package/src/astro/prefetch.ts +2 -2
- package/src/astro/routes/api/admin/comments/[id]/status.ts +22 -58
- package/src/astro/routes/api/admin/plugins/[id]/disable.ts +2 -15
- package/src/astro/routes/api/admin/plugins/[id]/enable.ts +2 -25
- package/src/astro/routes/api/admin/plugins/[id]/uninstall.ts +1 -0
- package/src/astro/routes/api/admin/plugins/[id]/update.ts +23 -4
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/install.ts +12 -2
- package/src/astro/routes/api/admin/plugins/registry/[id]/uninstall.ts +1 -0
- package/src/astro/routes/api/admin/plugins/registry/[id]/update.ts +29 -10
- package/src/astro/routes/api/admin/plugins/registry/artifact.ts +8 -2
- package/src/astro/routes/api/admin/plugins/registry/install.ts +15 -4
- package/src/astro/routes/api/admin/plugins/registry/verify.ts +2 -1
- package/src/astro/routes/api/admin/plugins/updates.ts +6 -1
- package/src/astro/routes/api/admin/scheduled-policy-rejections/[collection]/[id].ts +34 -0
- package/src/astro/routes/api/comments/[collection]/[contentId]/index.ts +4 -259
- package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +10 -0
- package/src/astro/routes/api/content/[collection]/[id]/lock.ts +133 -0
- package/src/astro/routes/api/content/[collection]/[id]/plugin-extensions/[pluginId]/[kind]/[extensionId].ts +29 -0
- package/src/astro/routes/api/content/[collection]/[id]/publish.ts +21 -4
- package/src/astro/routes/api/content/[collection]/[id]/schedule.ts +30 -1
- package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +15 -1
- 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/health.ts +23 -0
- package/src/astro/routes/api/manifest.ts +14 -4
- package/src/astro/routes/api/mcp.ts +2 -1
- package/src/astro/routes/api/media/asset/[id]/[filename].ts +50 -0
- package/src/astro/routes/api/plugins/[pluginId]/[...path].ts +13 -81
- package/src/astro/routes/api/redirects/[id].ts +0 -3
- package/src/astro/routes/api/redirects/index.ts +0 -2
- package/src/astro/routes/api/search/index.ts +1 -0
- package/src/astro/routes/api/visual-editing/action-token.ts +36 -0
- package/src/astro/routes/api/visual-editing/content/[collection]/[id]/publish.ts +32 -0
- package/src/astro/routes/api/visual-editing/toolbar-labels.ts +16 -0
- package/src/astro/routes/sitemap-[collection].xml.ts +11 -4
- package/src/astro/types.ts +83 -12
- package/src/cli/commands/bundle-utils.ts +19 -19
- package/src/cli/commands/bundle.ts +9 -6
- package/src/cli/commands/content.ts +32 -6
- package/src/cli/commands/doctor.ts +25 -0
- package/src/cli/commands/export-seed.ts +195 -56
- package/src/cli/commands/migrate.ts +71 -23
- package/src/cli/commands/publish.ts +2 -2
- package/src/client/index.ts +34 -7
- package/src/comments/public-submission.ts +246 -0
- package/src/comments/service.ts +59 -12
- package/src/components/EmDashBodyEnd.astro +4 -1
- package/src/components/EmDashBodyStart.astro +4 -1
- package/src/components/EmDashHead.astro +36 -16
- package/src/components/Gallery.astro +18 -4
- package/src/components/InlineEditor.astro +3 -1
- package/src/components/InlinePortableTextEditor.tsx +106 -11
- package/src/components/PortableText.astro +4 -0
- package/src/components/Table.astro +147 -62
- package/src/components/widgets/Archives.astro +6 -5
- package/src/config/errors.ts +13 -0
- package/src/config/secrets.ts +25 -11
- package/src/content/converters/portable-text-to-prosemirror.ts +26 -2
- package/src/content/converters/prosemirror-to-portable-text.ts +35 -6
- package/src/content/converters/types.ts +10 -0
- package/src/content/known-fields.ts +44 -0
- package/src/database/connection.ts +5 -1
- package/src/database/content-datetime.ts +123 -0
- package/src/database/datetime-storage.ts +452 -0
- package/src/database/dialect-helpers.ts +161 -1
- package/src/database/migration-lock.ts +140 -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/078_menu_item_translation_groups.ts +15 -0
- package/src/database/migrations/079_datetime_normalization.ts +13 -0
- package/src/database/migrations/080_content_translation_locale_unique.ts +88 -0
- package/src/database/migrations/081_redirect_write_guards.ts +257 -0
- package/src/database/migrations/082_taxonomy_translation_locale_unique.ts +49 -0
- package/src/database/migrations/runner.ts +63 -15
- package/src/database/pg-migration-lock.ts +2 -2
- package/src/database/repositories/byline.ts +9 -0
- package/src/database/repositories/comment.ts +86 -0
- package/src/database/repositories/content.ts +560 -69
- package/src/database/repositories/entry-locks.ts +257 -0
- package/src/database/repositories/media.ts +35 -4
- package/src/database/repositories/menu.ts +1 -0
- package/src/database/repositories/options.ts +113 -7
- package/src/database/repositories/plugin-storage.ts +159 -0
- package/src/database/repositories/redirect.ts +262 -56
- package/src/database/repositories/revision.ts +116 -17
- package/src/database/repositories/taxonomy.ts +42 -0
- package/src/database/repositories/types.ts +5 -0
- package/src/database/types.ts +26 -1
- package/src/datetime-normalization.ts +311 -0
- package/src/db/node-sqlite-compat.ts +3 -2
- package/src/emdash-runtime.ts +1994 -424
- package/src/fields/image.ts +2 -0
- package/src/i18n/config.ts +6 -6
- package/src/i18n/resolve.ts +98 -15
- package/src/index.ts +101 -0
- package/src/loader.ts +49 -4
- package/src/mcp/server.ts +216 -68
- package/src/media/responsive.ts +23 -0
- package/src/media/usage/content-refresh.ts +2 -1
- package/src/media/usage/extractor.ts +50 -15
- package/src/media/usage/types.ts +1 -1
- package/src/menus/index.ts +64 -35
- package/src/migrations/direct-executor.ts +40 -2
- package/src/migrations/index.ts +1 -0
- package/src/migrations/protocol.ts +11 -1
- package/src/page/seo-contributions.ts +78 -1
- package/src/page/seo-panel.ts +47 -0
- package/src/plugin-test-runtime.ts +17 -0
- package/src/plugin-types.ts +128 -21
- package/src/plugins/adapt-sandbox-entry.ts +34 -27
- package/src/plugins/conditional-storage.ts +30 -0
- package/src/plugins/content-access.ts +170 -0
- package/src/plugins/content-policy.ts +74 -0
- package/src/plugins/context.ts +790 -166
- package/src/plugins/cron.ts +18 -10
- package/src/plugins/define-plugin.ts +55 -54
- package/src/plugins/editor-draft.ts +257 -0
- package/src/plugins/hooks.ts +136 -3
- package/src/plugins/host.ts +29 -0
- package/src/plugins/http-route-dispatch.ts +389 -0
- package/src/plugins/http-wire.ts +180 -0
- package/src/plugins/index.ts +97 -3
- package/src/plugins/install-finalization.ts +77 -0
- package/src/plugins/lifecycle.ts +47 -0
- package/src/plugins/manager.ts +5 -2
- package/src/plugins/manifest-schema.ts +314 -58
- package/src/plugins/media.ts +166 -0
- package/src/plugins/request-meta.ts +12 -2
- package/src/plugins/route-wire.ts +304 -0
- package/src/plugins/routes.ts +38 -5
- package/src/plugins/sandbox/index.ts +4 -0
- package/src/plugins/sandbox/proxy.ts +129 -0
- package/src/plugins/sandbox/types.ts +83 -7
- package/src/plugins/secret-redactor.ts +65 -0
- package/src/plugins/settings.ts +303 -0
- package/src/plugins/state.ts +26 -0
- package/src/plugins/storage-query.ts +45 -0
- package/src/plugins/storage-update.ts +96 -0
- package/src/plugins/types.ts +602 -15
- package/src/query.ts +84 -4
- package/src/registry/authoritative-records.ts +26 -0
- package/src/registry/config.ts +182 -31
- package/src/registry/testing.ts +100 -0
- package/src/registry/types.ts +12 -70
- package/src/scheduled-publish.ts +70 -3
- package/src/schema/collection-slugs-cache.ts +157 -0
- package/src/schema/index.ts +1 -0
- package/src/schema/registry.ts +64 -1
- package/src/schema/types.ts +32 -6
- package/src/schema/zod-generator.ts +5 -13
- package/src/search/fts-manager.ts +3 -3
- package/src/search/query.ts +32 -5
- package/src/search/types.ts +8 -0
- package/src/security/ssrf.ts +167 -141
- package/src/seed/apply.ts +41 -3
- package/src/seed/types.ts +13 -3
- package/src/seed/validate.ts +18 -1
- package/src/seo/hreflang.ts +10 -6
- package/src/seo/index.ts +5 -10
- package/src/seo/media-url.ts +26 -0
- package/src/settings/index.ts +53 -11
- package/src/taxonomies/term-counts.ts +22 -5
- package/src/visual-editing/action-token.ts +31 -0
- package/src/visual-editing/toolbar-bootstrap.ts +31 -6
- package/src/visual-editing/toolbar.ts +103 -12
- package/src/widgets/archives.ts +10 -9
- package/src/widgets/index.ts +11 -1
- package/dist/activation-K0kGBWuJ.mjs +0 -382
- package/dist/activation-K0kGBWuJ.mjs.map +0 -1
- package/dist/adapters-BDQwg236.d.mts +0 -171
- package/dist/adapters-BDQwg236.d.mts.map +0 -1
- package/dist/after-CBU2vkoO.mjs +0 -96
- package/dist/after-CBU2vkoO.mjs.map +0 -1
- package/dist/allowed-origins-BGglilcs.mjs +0 -116
- package/dist/allowed-origins-BGglilcs.mjs.map +0 -1
- package/dist/api-Dz6rgoa3.mjs +0 -10040
- package/dist/api-Dz6rgoa3.mjs.map +0 -1
- package/dist/api-tokens-BSsQACNe.mjs +0 -163
- package/dist/api-tokens-BSsQACNe.mjs.map +0 -1
- package/dist/apply-B4SIOxR1.mjs +0 -980
- package/dist/apply-B4SIOxR1.mjs.map +0 -1
- package/dist/authorize-Bkf_UHhD.mjs +0 -40
- package/dist/authorize-Bkf_UHhD.mjs.map +0 -1
- package/dist/backup-rwVAl9NI.mjs +0 -241
- package/dist/backup-rwVAl9NI.mjs.map +0 -1
- package/dist/base64-CvLhUKQv.mjs +0 -63
- package/dist/base64-CvLhUKQv.mjs.map +0 -1
- package/dist/bundle-C8S2Zl6U.mjs +0 -663
- package/dist/bundle-C8S2Zl6U.mjs.map +0 -1
- package/dist/byline-DuhF7NWl.mjs +0 -902
- package/dist/byline-DuhF7NWl.mjs.map +0 -1
- package/dist/byline-fields-BovY4KYM.mjs +0 -123
- package/dist/byline-fields-BovY4KYM.mjs.map +0 -1
- package/dist/byline-registry-Bpu9-MVs.mjs +0 -406
- package/dist/byline-registry-Bpu9-MVs.mjs.map +0 -1
- package/dist/bylines-CJ5nd6Lw.mjs +0 -232
- package/dist/bylines-CJ5nd6Lw.mjs.map +0 -1
- package/dist/bylines-RwBAeOF1.mjs +0 -214
- package/dist/bylines-RwBAeOF1.mjs.map +0 -1
- package/dist/cache-BF5Kvn59.mjs +0 -108
- package/dist/cache-BF5Kvn59.mjs.map +0 -1
- package/dist/capture-triggers-CNW1q3HK.mjs +0 -362
- package/dist/capture-triggers-CNW1q3HK.mjs.map +0 -1
- package/dist/challenge-store-DQN_Yrck.mjs +0 -51
- package/dist/challenge-store-DQN_Yrck.mjs.map +0 -1
- package/dist/chrome-tags-D8fiZG94.mjs +0 -24
- package/dist/chrome-tags-D8fiZG94.mjs.map +0 -1
- package/dist/chunks-C4szrD8o.mjs +0 -25
- package/dist/chunks-C4szrD8o.mjs.map +0 -1
- package/dist/collection-deletion-Bj07NHbj.mjs +0 -436
- package/dist/collection-deletion-Bj07NHbj.mjs.map +0 -1
- package/dist/comment-reaction-BhrvSHml.mjs +0 -85
- package/dist/comment-reaction-BhrvSHml.mjs.map +0 -1
- package/dist/comment-vxOzWbZN.mjs +0 -255
- package/dist/comment-vxOzWbZN.mjs.map +0 -1
- package/dist/comments-Ct4ensnf.mjs +0 -204
- package/dist/comments-Ct4ensnf.mjs.map +0 -1
- package/dist/components-DJbo1z0S.mjs +0 -108
- package/dist/components-DJbo1z0S.mjs.map +0 -1
- package/dist/config-B9eZ340f.d.mts +0 -34
- package/dist/config-B9eZ340f.d.mts.map +0 -1
- package/dist/config-C3EBstHi.mjs +0 -72
- package/dist/config-C3EBstHi.mjs.map +0 -1
- package/dist/config-it29yDLA.mjs +0 -1163
- package/dist/config-it29yDLA.mjs.map +0 -1
- package/dist/content-DjvM0T92.mjs +0 -1725
- package/dist/content-DjvM0T92.mjs.map +0 -1
- package/dist/content-list-query-Btqd4uV2.d.mts +0 -26
- package/dist/content-list-query-Btqd4uV2.d.mts.map +0 -1
- package/dist/content-refresh-Bwp-8yGy.mjs +0 -3588
- package/dist/content-refresh-Bwp-8yGy.mjs.map +0 -1
- package/dist/content-repair-Czdp7jz5.mjs +0 -440
- package/dist/content-repair-Czdp7jz5.mjs.map +0 -1
- package/dist/context-CX6gxOLW.mjs +0 -1068
- package/dist/context-CX6gxOLW.mjs.map +0 -1
- package/dist/cron-C6o7VppJ.mjs +0 -277
- package/dist/cron-C6o7VppJ.mjs.map +0 -1
- package/dist/dashboard-C2kTeeRI.mjs +0 -140
- package/dist/dashboard-C2kTeeRI.mjs.map +0 -1
- package/dist/db-errors-Cl-sKYTm.mjs +0 -55
- package/dist/db-errors-Cl-sKYTm.mjs.map +0 -1
- package/dist/default-Clra32mw.mjs +0 -81
- package/dist/default-Clra32mw.mjs.map +0 -1
- package/dist/deferred-tasks-CvDETTJO.d.mts +0 -9
- package/dist/deferred-tasks-CvDETTJO.d.mts.map +0 -1
- package/dist/dev-typegen-DzOPfsNj.mjs +0 -29
- package/dist/dev-typegen-DzOPfsNj.mjs.map +0 -1
- package/dist/device-flow-D2oCWvLJ.mjs +0 -466
- package/dist/device-flow-D2oCWvLJ.mjs.map +0 -1
- package/dist/dialect-helpers-BSbfaO3F.mjs +0 -202
- package/dist/dialect-helpers-BSbfaO3F.mjs.map +0 -1
- package/dist/direct-executor-Bfa5_ToE.mjs +0 -85
- package/dist/direct-executor-Bfa5_ToE.mjs.map +0 -1
- package/dist/dist-89xCrGqi.mjs +0 -810
- package/dist/dist-89xCrGqi.mjs.map +0 -1
- package/dist/email-console-Dzb6uGYa.mjs +0 -50
- package/dist/email-console-Dzb6uGYa.mjs.map +0 -1
- package/dist/enrich-BX0IDp4z.mjs +0 -194
- package/dist/enrich-BX0IDp4z.mjs.map +0 -1
- package/dist/error-DFrQjppn.mjs +0 -90
- package/dist/error-DFrQjppn.mjs.map +0 -1
- package/dist/errors-DsVoDUjJ.mjs +0 -427
- package/dist/errors-DsVoDUjJ.mjs.map +0 -1
- package/dist/escape-HmHTC1Is.mjs +0 -9
- package/dist/escape-HmHTC1Is.mjs.map +0 -1
- package/dist/field-defs-cache-BM4SIRqH.mjs +0 -77
- package/dist/field-defs-cache-BM4SIRqH.mjs.map +0 -1
- package/dist/focal-point-BeWFo6Xx.mjs +0 -23
- package/dist/focal-point-BeWFo6Xx.mjs.map +0 -1
- package/dist/fts-manager-Do1BlW2r.mjs +0 -413
- package/dist/fts-manager-Do1BlW2r.mjs.map +0 -1
- package/dist/hash-3JJPlHF2.mjs +0 -37
- package/dist/hash-3JJPlHF2.mjs.map +0 -1
- package/dist/hook-result-DCh2WUpe.d.mts +0 -31
- package/dist/hook-result-DCh2WUpe.d.mts.map +0 -1
- package/dist/hreflang-B6hbAuuO.d.mts +0 -48
- package/dist/hreflang-B6hbAuuO.d.mts.map +0 -1
- package/dist/hreflang-DQbPZliA.mjs +0 -102
- package/dist/hreflang-DQbPZliA.mjs.map +0 -1
- package/dist/identity-DksvEazf.mjs +0 -35
- package/dist/identity-DksvEazf.mjs.map +0 -1
- package/dist/import-CJpaBBBT.mjs +0 -2020
- package/dist/import-CJpaBBBT.mjs.map +0 -1
- package/dist/index-BJNMCWmu.d.mts +0 -6562
- package/dist/index-BJNMCWmu.d.mts.map +0 -1
- package/dist/index-Du8K7bWa.d.mts +0 -278
- package/dist/index-Du8K7bWa.d.mts.map +0 -1
- package/dist/init-lock-DJkX6Hto.mjs +0 -56
- package/dist/init-lock-DJkX6Hto.mjs.map +0 -1
- package/dist/load-CawHjTOH.mjs +0 -28
- package/dist/load-CawHjTOH.mjs.map +0 -1
- package/dist/loader-Z8vl7zTq.mjs +0 -966
- package/dist/loader-Z8vl7zTq.mjs.map +0 -1
- package/dist/manifest-builder-COtzuca2.mjs +0 -189
- package/dist/manifest-builder-COtzuca2.mjs.map +0 -1
- package/dist/manifest-schema-BNWwR8Vd.mjs +0 -301
- package/dist/manifest-schema-BNWwR8Vd.mjs.map +0 -1
- package/dist/media-BBm8Wg3f.mjs +0 -318
- package/dist/media-BBm8Wg3f.mjs.map +0 -1
- package/dist/media-BHjus86Y.mjs +0 -464
- package/dist/media-BHjus86Y.mjs.map +0 -1
- package/dist/media-allowlist-CoTBWoDp.mjs +0 -44
- package/dist/media-allowlist-CoTBWoDp.mjs.map +0 -1
- package/dist/media-folders-BGkATs8n.mjs +0 -210
- package/dist/media-folders-BGkATs8n.mjs.map +0 -1
- package/dist/media-upload-BCidR-EY.mjs +0 -147
- package/dist/media-upload-BCidR-EY.mjs.map +0 -1
- package/dist/media-url-DHoPr0hq.mjs +0 -26
- package/dist/media-url-DHoPr0hq.mjs.map +0 -1
- package/dist/media-usage-CdY5jhSR.mjs +0 -1833
- package/dist/media-usage-CdY5jhSR.mjs.map +0 -1
- package/dist/media-usage-activation-BgeMtK5C.mjs +0 -78
- package/dist/media-usage-activation-BgeMtK5C.mjs.map +0 -1
- package/dist/media-usage-work-CnGCdHxx.mjs +0 -152
- package/dist/media-usage-work-CnGCdHxx.mjs.map +0 -1
- package/dist/media-usage-work-D6D9sMCA.mjs +0 -586
- package/dist/media-usage-work-D6D9sMCA.mjs.map +0 -1
- package/dist/media-usage-write-fence-hjeD4u7s.mjs +0 -42
- package/dist/media-usage-write-fence-hjeD4u7s.mjs.map +0 -1
- package/dist/menus-6qSwTNxG.mjs +0 -4010
- package/dist/menus-6qSwTNxG.mjs.map +0 -1
- package/dist/menus-uvPLXMZf.mjs +0 -744
- package/dist/menus-uvPLXMZf.mjs.map +0 -1
- package/dist/mime-CUIG6x84.mjs +0 -36
- package/dist/mime-CUIG6x84.mjs.map +0 -1
- package/dist/mode-DN_WneRx.mjs +0 -23
- package/dist/mode-DN_WneRx.mjs.map +0 -1
- package/dist/node-sqlite-compat-BuJXIeMz.mjs +0 -46
- package/dist/node-sqlite-compat-BuJXIeMz.mjs.map +0 -1
- package/dist/normalize-C2xNjTSG.mjs +0 -191
- package/dist/normalize-C2xNjTSG.mjs.map +0 -1
- package/dist/oauth-authorization-Dj6Kwc21.mjs +0 -274
- package/dist/oauth-authorization-Dj6Kwc21.mjs.map +0 -1
- package/dist/oauth-clients-FD7I0J8m.mjs +0 -266
- package/dist/oauth-clients-FD7I0J8m.mjs.map +0 -1
- package/dist/oauth-state-store-DkmDOmHs.mjs +0 -50
- package/dist/oauth-state-store-DkmDOmHs.mjs.map +0 -1
- package/dist/oauth-user-lookup-CvIwGpYd.mjs +0 -26
- package/dist/oauth-user-lookup-CvIwGpYd.mjs.map +0 -1
- package/dist/object-cache-DVKnyOfy.mjs +0 -534
- package/dist/object-cache-DVKnyOfy.mjs.map +0 -1
- package/dist/options-BHPeIbBd.mjs +0 -117
- package/dist/options-BHPeIbBd.mjs.map +0 -1
- package/dist/options-CYb4y7hM.d.mts +0 -221
- package/dist/options-CYb4y7hM.d.mts.map +0 -1
- package/dist/parse-Ckpg-Qfp.mjs +0 -81
- package/dist/parse-Ckpg-Qfp.mjs.map +0 -1
- package/dist/passkey-config-O_lj3y0k.mjs +0 -46
- package/dist/passkey-config-O_lj3y0k.mjs.map +0 -1
- package/dist/patterns-D9iDO3j8.mjs +0 -145
- package/dist/patterns-D9iDO3j8.mjs.map +0 -1
- package/dist/placeholder-4X9BrRrp.d.mts +0 -306
- package/dist/placeholder-4X9BrRrp.d.mts.map +0 -1
- package/dist/policy-Dhtwntrt.mjs +0 -45
- package/dist/policy-Dhtwntrt.mjs.map +0 -1
- package/dist/portable-text-U85hOafW.mjs +0 -286
- package/dist/portable-text-U85hOafW.mjs.map +0 -1
- package/dist/preview-B_vJLvf8.mjs +0 -107
- package/dist/preview-B_vJLvf8.mjs.map +0 -1
- package/dist/protocol-JdD2YhY9.d.mts +0 -52
- package/dist/protocol-JdD2YhY9.d.mts.map +0 -1
- package/dist/public-url-CarhZJgf.mjs +0 -101
- package/dist/public-url-CarhZJgf.mjs.map +0 -1
- package/dist/query-BZKZcG5b.mjs +0 -881
- package/dist/query-BZKZcG5b.mjs.map +0 -1
- package/dist/query-BndaFxxp.mjs +0 -41
- package/dist/query-BndaFxxp.mjs.map +0 -1
- package/dist/rate-limit-BZmATC6W.mjs +0 -120
- package/dist/rate-limit-BZmATC6W.mjs.map +0 -1
- package/dist/redirect-CZkbozu9.mjs +0 -313
- package/dist/redirect-CZkbozu9.mjs.map +0 -1
- package/dist/redirect-CzqnLxK-.mjs +0 -17
- package/dist/redirect-CzqnLxK-.mjs.map +0 -1
- package/dist/redirects-BLNOWQTn.mjs +0 -1238
- package/dist/redirects-BLNOWQTn.mjs.map +0 -1
- package/dist/redirects-CqzNM0KM.mjs +0 -579
- package/dist/redirects-CqzNM0KM.mjs.map +0 -1
- package/dist/registry-AZAsRsor.mjs +0 -1179
- package/dist/registry-AZAsRsor.mjs.map +0 -1
- package/dist/relation-04DfKRTO.mjs +0 -334
- package/dist/relation-04DfKRTO.mjs.map +0 -1
- package/dist/relations-C4htk5sb.mjs +0 -309
- package/dist/relations-C4htk5sb.mjs.map +0 -1
- package/dist/relations-CcFwDJdJ.mjs +0 -403
- package/dist/relations-CcFwDJdJ.mjs.map +0 -1
- package/dist/relations-DnRK4YIT.d.mts +0 -3354
- package/dist/relations-DnRK4YIT.d.mts.map +0 -1
- package/dist/request-cache-DH9zdCOD.mjs +0 -104
- package/dist/request-cache-DH9zdCOD.mjs.map +0 -1
- package/dist/request-meta-DYxLlnmz.mjs +0 -140
- package/dist/request-meta-DYxLlnmz.mjs.map +0 -1
- package/dist/resolve-prZ3mP7l.mjs +0 -143
- package/dist/resolve-prZ3mP7l.mjs.map +0 -1
- package/dist/runner-BLIDKpmA.mjs +0 -4676
- package/dist/runner-BLIDKpmA.mjs.map +0 -1
- package/dist/runner-YKfIMnaF.d.mts +0 -67
- package/dist/runner-YKfIMnaF.d.mts.map +0 -1
- package/dist/schema-CGnBeLiW.mjs +0 -9
- package/dist/schema-CGnBeLiW.mjs.map +0 -1
- package/dist/schema-DYr-Vd-L.mjs +0 -420
- package/dist/schema-DYr-Vd-L.mjs.map +0 -1
- package/dist/scopes-BhWvBavj.mjs +0 -27
- package/dist/scopes-BhWvBavj.mjs.map +0 -1
- package/dist/search-C-qDk4kx.mjs +0 -439
- package/dist/search-C-qDk4kx.mjs.map +0 -1
- package/dist/secrets-rEtHt-6z.mjs +0 -330
- package/dist/secrets-rEtHt-6z.mjs.map +0 -1
- package/dist/sections-B_nYvlwn.mjs +0 -346
- package/dist/sections-B_nYvlwn.mjs.map +0 -1
- package/dist/seo-926NRIgt.mjs +0 -133
- package/dist/seo-926NRIgt.mjs.map +0 -1
- package/dist/seo-CVWkdv6x.mjs +0 -113
- package/dist/seo-CVWkdv6x.mjs.map +0 -1
- package/dist/service-CJl3ZAYs.mjs +0 -195
- package/dist/service-CJl3ZAYs.mjs.map +0 -1
- package/dist/session-user-BlMgqCHS.mjs +0 -51
- package/dist/session-user-BlMgqCHS.mjs.map +0 -1
- package/dist/settings--wobrkkC.mjs +0 -258
- package/dist/settings--wobrkkC.mjs.map +0 -1
- package/dist/settings-Cwm6o2jY.mjs +0 -51
- package/dist/settings-Cwm6o2jY.mjs.map +0 -1
- package/dist/setup-complete-DQbClIN2.mjs +0 -26
- package/dist/setup-complete-DQbClIN2.mjs.map +0 -1
- package/dist/setup-nonce-DZCFS2sn.mjs +0 -25
- package/dist/setup-nonce-DZCFS2sn.mjs.map +0 -1
- package/dist/single-flight-cache-BPuGPdcN.mjs +0 -104
- package/dist/single-flight-cache-BPuGPdcN.mjs.map +0 -1
- package/dist/site-url-BrxA_E9H.mjs +0 -16
- package/dist/site-url-BrxA_E9H.mjs.map +0 -1
- package/dist/slugify-B994zkXC.mjs +0 -17
- package/dist/slugify-B994zkXC.mjs.map +0 -1
- package/dist/snapshot--OCDTqdb.mjs +0 -216
- package/dist/snapshot--OCDTqdb.mjs.map +0 -1
- package/dist/ssrf-5sIM5jzl.mjs +0 -349
- package/dist/ssrf-5sIM5jzl.mjs.map +0 -1
- package/dist/state-BpFVsJZB.mjs +0 -136
- package/dist/state-BpFVsJZB.mjs.map +0 -1
- package/dist/status-B777-dXz.mjs +0 -30
- package/dist/status-B777-dXz.mjs.map +0 -1
- package/dist/target-BmR0iTwz.mjs +0 -27
- package/dist/target-BmR0iTwz.mjs.map +0 -1
- package/dist/taxonomies-DkAkMupr.mjs +0 -837
- package/dist/taxonomies-DkAkMupr.mjs.map +0 -1
- package/dist/taxonomies-Wfy_Lg12.mjs +0 -698
- package/dist/taxonomies-Wfy_Lg12.mjs.map +0 -1
- package/dist/taxonomy-tJepplLL.mjs +0 -484
- package/dist/taxonomy-tJepplLL.mjs.map +0 -1
- package/dist/tokens-BCO1oruF.mjs +0 -171
- package/dist/tokens-BCO1oruF.mjs.map +0 -1
- package/dist/transaction-0KOpOyMu.mjs +0 -29
- package/dist/transaction-0KOpOyMu.mjs.map +0 -1
- package/dist/transport-Dr3qtwXC.mjs +0 -136
- package/dist/transport-Dr3qtwXC.mjs.map +0 -1
- package/dist/transport-xh6YKW2G.d.mts +0 -42
- package/dist/transport-xh6YKW2G.d.mts.map +0 -1
- package/dist/trusted-proxy-BR5F1Otp.mjs +0 -51
- package/dist/trusted-proxy-BR5F1Otp.mjs.map +0 -1
- package/dist/types-3qNFPlci.mjs +0 -16
- package/dist/types-3qNFPlci.mjs.map +0 -1
- package/dist/types-75KIqzL9.mjs +0 -142
- package/dist/types-75KIqzL9.mjs.map +0 -1
- package/dist/types-B6GrPic4.d.mts +0 -1335
- package/dist/types-B6GrPic4.d.mts.map +0 -1
- package/dist/types-BuHW4xDE.d.mts +0 -259
- package/dist/types-BuHW4xDE.d.mts.map +0 -1
- package/dist/types-C00oyCZp.d.mts +0 -198
- package/dist/types-C00oyCZp.d.mts.map +0 -1
- package/dist/types-CDtkNSFQ.d.mts +0 -75
- package/dist/types-CDtkNSFQ.d.mts.map +0 -1
- package/dist/types-CPeXo1wF.d.mts +0 -124
- package/dist/types-CPeXo1wF.d.mts.map +0 -1
- package/dist/types-CQPWhPxE.mjs +0 -92
- package/dist/types-CQPWhPxE.mjs.map +0 -1
- package/dist/types-CXFkwEGC.d.mts +0 -198
- package/dist/types-CXFkwEGC.d.mts.map +0 -1
- package/dist/types-DM3vioBY.mjs +0 -18
- package/dist/types-DM3vioBY.mjs.map +0 -1
- package/dist/types-DczELMop.d.mts +0 -363
- package/dist/types-DczELMop.d.mts.map +0 -1
- package/dist/types-DfuTR6dL.mjs +0 -3
- package/dist/types-FV23hEoW.d.mts +0 -743
- package/dist/types-FV23hEoW.d.mts.map +0 -1
- package/dist/types-xDMtUFnO.d.mts +0 -257
- package/dist/types-xDMtUFnO.d.mts.map +0 -1
- package/dist/upload-attempts-BsqoQ1fn.mjs +0 -27
- package/dist/upload-attempts-BsqoQ1fn.mjs.map +0 -1
- package/dist/url-pattern-D4c2czpJ.mjs +0 -33
- package/dist/url-pattern-D4c2czpJ.mjs.map +0 -1
- package/dist/user-BTZ40aq6.mjs +0 -171
- package/dist/user-BTZ40aq6.mjs.map +0 -1
- package/dist/utils-BKvNjjhY.mjs +0 -435
- package/dist/utils-BKvNjjhY.mjs.map +0 -1
- package/dist/validate-BpwoDOgt.mjs +0 -120
- package/dist/validate-BpwoDOgt.mjs.map +0 -1
- package/dist/validate-DE_LRwo9.mjs +0 -379
- package/dist/validate-DE_LRwo9.mjs.map +0 -1
- package/dist/validate-DUP27OYD.d.mts +0 -400
- package/dist/validate-DUP27OYD.d.mts.map +0 -1
- package/dist/validation-BMImFJ11.mjs +0 -153
- package/dist/validation-BMImFJ11.mjs.map +0 -1
- package/dist/version-Bii3suaO.mjs +0 -7
- package/dist/version-Bii3suaO.mjs.map +0 -1
- package/dist/widgets-D3gJ10xU.mjs +0 -122
- package/dist/widgets-D3gJ10xU.mjs.map +0 -1
- package/dist/wxr-taxonomies-B2Og_6rU.d.mts +0 -34
- package/dist/wxr-taxonomies-B2Og_6rU.d.mts.map +0 -1
- package/dist/wxr-taxonomies-Cxngsjwo.mjs +0 -406
- package/dist/wxr-taxonomies-Cxngsjwo.mjs.map +0 -1
- package/dist/zod-generator-BuYSQJB7.mjs +0 -331
- package/dist/zod-generator-BuYSQJB7.mjs.map +0 -1
- /package/dist/{api-tokens-BfYts-sq.mjs → api-tokens-DS1VzN7_.mjs} +0 -0
- /package/dist/{ssrf-Dg3cIT-b.mjs → ssrf-BRpTDMV6.mjs} +0 -0
|
@@ -2,15 +2,20 @@ import { sql, type Kysely } from "kysely";
|
|
|
2
2
|
import { ulid } from "ulidx";
|
|
3
3
|
|
|
4
4
|
import type { ContentFieldFilterValue, ContentFieldFilters } from "../../content-list-query.js";
|
|
5
|
+
import { keepKnownFields, staleStoredKeys } from "../../content/known-fields.js";
|
|
6
|
+
import { normalizeExplicitDatetime } from "../../datetime-normalization.js";
|
|
5
7
|
import { invalidateCollectionCache } from "../../object-cache/index.js";
|
|
6
8
|
import { isIndexableFieldType, type FieldType } from "../../schema/types.js";
|
|
7
9
|
import { buildFtsPrefixMatch, buildSlugGlobPrefix } from "../../search/match.js";
|
|
8
10
|
import { chunks, SQL_BATCH_SIZE } from "../../utils/chunks.js";
|
|
9
11
|
import { isMissingTableError } from "../../utils/db-errors.js";
|
|
10
12
|
import { slugify } from "../../utils/slugify.js";
|
|
13
|
+
import { ContentDatetimeNormalizer } from "../content-datetime.js";
|
|
14
|
+
import { executeAtomicBatchIfSupported } from "../dialect-helpers.js";
|
|
15
|
+
import { withTransaction } from "../transaction.js";
|
|
11
16
|
import type { Database } from "../types.js";
|
|
12
17
|
import { validateIdentifier } from "../validate.js";
|
|
13
|
-
import { RevisionRepository } from "./revision.js";
|
|
18
|
+
import { createRevisionId, RevisionRepository } from "./revision.js";
|
|
14
19
|
import type {
|
|
15
20
|
CreateContentInput,
|
|
16
21
|
UpdateContentInput,
|
|
@@ -316,7 +321,11 @@ function escapeRegExp(s: string): string {
|
|
|
316
321
|
* Each field becomes a real column in the table.
|
|
317
322
|
*/
|
|
318
323
|
export class ContentRepository {
|
|
319
|
-
|
|
324
|
+
private readonly datetimes: ContentDatetimeNormalizer;
|
|
325
|
+
|
|
326
|
+
constructor(private db: Kysely<Database>) {
|
|
327
|
+
this.datetimes = new ContentDatetimeNormalizer(db);
|
|
328
|
+
}
|
|
320
329
|
|
|
321
330
|
/**
|
|
322
331
|
* Create a new content item
|
|
@@ -328,15 +337,23 @@ export class ContentRepository {
|
|
|
328
337
|
const {
|
|
329
338
|
type,
|
|
330
339
|
slug,
|
|
331
|
-
data,
|
|
340
|
+
data: inputData,
|
|
332
341
|
status = "draft",
|
|
333
342
|
authorId,
|
|
334
343
|
primaryBylineId,
|
|
335
344
|
locale,
|
|
336
345
|
translationOf,
|
|
346
|
+
inheritFields = [],
|
|
337
347
|
publishedAt,
|
|
338
348
|
createdAt,
|
|
339
349
|
} = input;
|
|
350
|
+
const data = await this.datetimes.normalizeData(type, inputData);
|
|
351
|
+
const normalizedCreatedAt = createdAt
|
|
352
|
+
? await this.datetimes.normalizeValue(type, createdAt)
|
|
353
|
+
: now;
|
|
354
|
+
const normalizedPublishedAt = publishedAt
|
|
355
|
+
? await this.datetimes.normalizeValue(type, publishedAt)
|
|
356
|
+
: null;
|
|
340
357
|
|
|
341
358
|
// Validate required fields
|
|
342
359
|
if (!type) {
|
|
@@ -345,16 +362,6 @@ export class ContentRepository {
|
|
|
345
362
|
|
|
346
363
|
const tableName = getTableName(type);
|
|
347
364
|
|
|
348
|
-
// Resolve translation_group: if translationOf is set, look up the source item's group
|
|
349
|
-
let translationGroup: string = id; // default: self-reference
|
|
350
|
-
if (translationOf) {
|
|
351
|
-
const source = await this.findById(type, translationOf);
|
|
352
|
-
if (!source) {
|
|
353
|
-
throw new EmDashValidationError("Translation source content not found");
|
|
354
|
-
}
|
|
355
|
-
translationGroup = source.translationGroup || source.id;
|
|
356
|
-
}
|
|
357
|
-
|
|
358
365
|
// Build column names and values
|
|
359
366
|
const columns: string[] = [
|
|
360
367
|
"id",
|
|
@@ -375,13 +382,21 @@ export class ContentRepository {
|
|
|
375
382
|
status,
|
|
376
383
|
authorId || null,
|
|
377
384
|
primaryBylineId ?? null,
|
|
378
|
-
|
|
385
|
+
normalizedCreatedAt,
|
|
379
386
|
now,
|
|
380
|
-
|
|
387
|
+
normalizedPublishedAt,
|
|
381
388
|
1,
|
|
382
389
|
locale || "en",
|
|
383
|
-
|
|
390
|
+
id,
|
|
384
391
|
];
|
|
392
|
+
const inherited = new Set(inheritFields);
|
|
393
|
+
for (const field of inherited) {
|
|
394
|
+
validateIdentifier(field, "inherited content field name");
|
|
395
|
+
if (!SYSTEM_COLUMNS.has(field) && !Object.hasOwn(data, field)) {
|
|
396
|
+
columns.push(field);
|
|
397
|
+
values.push(null);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
385
400
|
|
|
386
401
|
// Add data fields as columns (skip system columns to prevent injection via data)
|
|
387
402
|
if (data && typeof data === "object") {
|
|
@@ -396,18 +411,40 @@ export class ContentRepository {
|
|
|
396
411
|
|
|
397
412
|
// Build dynamic INSERT using raw SQL
|
|
398
413
|
const columnRefs = columns.map((c) => sql.ref(c));
|
|
399
|
-
const valuePlaceholders = values.map((
|
|
414
|
+
const valuePlaceholders = values.map((value, index) => {
|
|
415
|
+
const column = columns[index];
|
|
416
|
+
if (translationOf && column === "translation_group") {
|
|
417
|
+
return sql`COALESCE(${sql.ref("translation_source.translation_group")}, ${sql.ref("translation_source.id")})`;
|
|
418
|
+
}
|
|
419
|
+
if (translationOf && inherited.has(column)) {
|
|
420
|
+
return sql.ref(`translation_source.${column}`);
|
|
421
|
+
}
|
|
422
|
+
return value === null ? sql`NULL` : sql`${value}`;
|
|
423
|
+
});
|
|
400
424
|
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
425
|
+
if (translationOf) {
|
|
426
|
+
await sql`
|
|
427
|
+
INSERT INTO ${sql.ref(tableName)} (${sql.join(columnRefs, sql`, `)})
|
|
428
|
+
SELECT ${sql.join(valuePlaceholders, sql`, `)}
|
|
429
|
+
FROM ${sql.ref(tableName)} AS translation_source
|
|
430
|
+
WHERE translation_source.id = ${translationOf}
|
|
431
|
+
AND translation_source.deleted_at IS NULL
|
|
432
|
+
`.execute(this.db);
|
|
433
|
+
} else {
|
|
434
|
+
await sql`
|
|
435
|
+
INSERT INTO ${sql.ref(tableName)} (${sql.join(columnRefs, sql`, `)})
|
|
436
|
+
VALUES (${sql.join(valuePlaceholders, sql`, `)})
|
|
437
|
+
`.execute(this.db);
|
|
438
|
+
}
|
|
405
439
|
|
|
406
440
|
invalidateCollectionCache(type);
|
|
407
441
|
|
|
408
442
|
// Fetch and return the created item
|
|
409
443
|
const item = await this.findById(type, id);
|
|
410
444
|
if (!item) {
|
|
445
|
+
if (translationOf) {
|
|
446
|
+
throw new EmDashValidationError("Translation source content not found");
|
|
447
|
+
}
|
|
411
448
|
throw new Error("Failed to create content");
|
|
412
449
|
}
|
|
413
450
|
return item;
|
|
@@ -582,6 +619,17 @@ export class ContentRepository {
|
|
|
582
619
|
return this._findByIdOrSlug(type, identifier, true, locale);
|
|
583
620
|
}
|
|
584
621
|
|
|
622
|
+
async isTrashed(type: string, id: string): Promise<boolean> {
|
|
623
|
+
const tableName = getTableName(type);
|
|
624
|
+
const row = await this.db
|
|
625
|
+
.selectFrom(tableName as keyof Database)
|
|
626
|
+
.select("id" as never)
|
|
627
|
+
.where("id" as never, "=", id as never)
|
|
628
|
+
.where("deleted_at" as never, "is not", null)
|
|
629
|
+
.executeTakeFirst();
|
|
630
|
+
return row !== undefined;
|
|
631
|
+
}
|
|
632
|
+
|
|
585
633
|
private async _findByIdOrSlug(
|
|
586
634
|
type: string,
|
|
587
635
|
identifier: string,
|
|
@@ -847,15 +895,6 @@ export class ContentRepository {
|
|
|
847
895
|
return mappedResult;
|
|
848
896
|
}
|
|
849
897
|
|
|
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
|
-
|
|
859
898
|
/**
|
|
860
899
|
* Update content
|
|
861
900
|
*/
|
|
@@ -876,11 +915,17 @@ export class ContentRepository {
|
|
|
876
915
|
}
|
|
877
916
|
|
|
878
917
|
if (input.publishedAt !== undefined) {
|
|
879
|
-
updates.published_at =
|
|
918
|
+
updates.published_at =
|
|
919
|
+
input.publishedAt === null
|
|
920
|
+
? null
|
|
921
|
+
: await this.datetimes.normalizeValue(type, input.publishedAt);
|
|
880
922
|
}
|
|
881
923
|
|
|
882
924
|
if (input.scheduledAt !== undefined) {
|
|
883
|
-
updates.scheduled_at =
|
|
925
|
+
updates.scheduled_at =
|
|
926
|
+
input.scheduledAt === null
|
|
927
|
+
? null
|
|
928
|
+
: await this.datetimes.normalizeValue(type, input.scheduledAt);
|
|
884
929
|
}
|
|
885
930
|
|
|
886
931
|
if (input.authorId !== undefined) {
|
|
@@ -893,7 +938,8 @@ export class ContentRepository {
|
|
|
893
938
|
|
|
894
939
|
// Update data fields (skip system columns to prevent injection via data)
|
|
895
940
|
if (input.data !== undefined && typeof input.data === "object") {
|
|
896
|
-
|
|
941
|
+
const data = await this.datetimes.normalizeData(type, writableContentData(input.data));
|
|
942
|
+
for (const [key, value] of Object.entries(data)) {
|
|
897
943
|
updates[key] = serializeValue(value);
|
|
898
944
|
}
|
|
899
945
|
}
|
|
@@ -921,6 +967,179 @@ export class ContentRepository {
|
|
|
921
967
|
return updated;
|
|
922
968
|
}
|
|
923
969
|
|
|
970
|
+
async restoreRevision(
|
|
971
|
+
type: string,
|
|
972
|
+
id: string,
|
|
973
|
+
revisionData: Record<string, unknown>,
|
|
974
|
+
authorId: string,
|
|
975
|
+
): Promise<{ item: ContentItem; revisionId: string }> {
|
|
976
|
+
const tableName = getTableName(type);
|
|
977
|
+
const existing = await this.findById(type, id);
|
|
978
|
+
if (!existing) throw new EmDashValidationError("Content item not found");
|
|
979
|
+
|
|
980
|
+
const normalizedSnapshot = await this.datetimes.normalizeData(type, revisionData);
|
|
981
|
+
const { _slug, ...snapshotFields } = normalizedSnapshot;
|
|
982
|
+
const fieldData = writableContentData(snapshotFields);
|
|
983
|
+
const revisionId = createRevisionId();
|
|
984
|
+
const now = new Date().toISOString();
|
|
985
|
+
const assignments: ReturnType<typeof sql>[] = [];
|
|
986
|
+
|
|
987
|
+
if (typeof _slug === "string") assignments.push(sql`slug = ${_slug}`);
|
|
988
|
+
for (const [field, value] of Object.entries(fieldData)) {
|
|
989
|
+
validateIdentifier(field, "content field name");
|
|
990
|
+
assignments.push(sql`${sql.ref(field)} = ${serializeValue(value)}`);
|
|
991
|
+
}
|
|
992
|
+
// The audit row is inserted first, then its ID acts as a transaction-local
|
|
993
|
+
// marker so a losing concurrent restore can remove only its own audit.
|
|
994
|
+
assignments.push(
|
|
995
|
+
sql`draft_revision_id = ${revisionId}`,
|
|
996
|
+
sql`updated_at = ${now}`,
|
|
997
|
+
sql`version = version + 1`,
|
|
998
|
+
);
|
|
999
|
+
|
|
1000
|
+
const buildQueries = () => {
|
|
1001
|
+
const audit = sql`
|
|
1002
|
+
INSERT INTO revisions (id, collection, entry_id, data, author_id)
|
|
1003
|
+
VALUES (${revisionId}, ${type}, ${id}, ${JSON.stringify(normalizedSnapshot)}, ${authorId})
|
|
1004
|
+
RETURNING id
|
|
1005
|
+
`;
|
|
1006
|
+
const update = sql`
|
|
1007
|
+
UPDATE ${sql.ref(tableName)}
|
|
1008
|
+
SET ${sql.join(assignments, sql`, `)}
|
|
1009
|
+
WHERE id = ${id}
|
|
1010
|
+
AND deleted_at IS NULL
|
|
1011
|
+
AND version = ${existing.version}
|
|
1012
|
+
AND updated_at = ${existing.updatedAt}
|
|
1013
|
+
AND status = ${existing.status}
|
|
1014
|
+
AND ${nullableColumnMatch("live_revision_id", existing.liveRevisionId)}
|
|
1015
|
+
AND ${nullableColumnMatch("draft_revision_id", existing.draftRevisionId)}
|
|
1016
|
+
AND ${nullableColumnMatch("scheduled_at", existing.scheduledAt)}
|
|
1017
|
+
RETURNING id
|
|
1018
|
+
`;
|
|
1019
|
+
const removeUnappliedAudit = sql`
|
|
1020
|
+
DELETE FROM revisions
|
|
1021
|
+
WHERE id = ${revisionId}
|
|
1022
|
+
AND NOT EXISTS (
|
|
1023
|
+
SELECT 1 FROM ${sql.ref(tableName)}
|
|
1024
|
+
WHERE id = ${id}
|
|
1025
|
+
AND draft_revision_id = ${revisionId}
|
|
1026
|
+
AND version = ${existing.version + 1}
|
|
1027
|
+
)
|
|
1028
|
+
`;
|
|
1029
|
+
const releaseMarker = sql`
|
|
1030
|
+
UPDATE ${sql.ref(tableName)}
|
|
1031
|
+
SET draft_revision_id = ${existing.draftRevisionId}
|
|
1032
|
+
WHERE id = ${id}
|
|
1033
|
+
AND draft_revision_id = ${revisionId}
|
|
1034
|
+
AND version = ${existing.version + 1}
|
|
1035
|
+
RETURNING id
|
|
1036
|
+
`;
|
|
1037
|
+
return [audit, update, removeUnappliedAudit, releaseMarker] as const;
|
|
1038
|
+
};
|
|
1039
|
+
|
|
1040
|
+
const batched = await executeAtomicBatchIfSupported(this.db, buildQueries());
|
|
1041
|
+
if (batched) {
|
|
1042
|
+
if (
|
|
1043
|
+
batched[0]?.rows.length !== 1 ||
|
|
1044
|
+
batched[1]?.rows.length !== 1 ||
|
|
1045
|
+
batched[3]?.rows.length !== 1
|
|
1046
|
+
) {
|
|
1047
|
+
throw new ContentMutationConflictError();
|
|
1048
|
+
}
|
|
1049
|
+
} else {
|
|
1050
|
+
await withTransaction(this.db, async (trx) => {
|
|
1051
|
+
const [audit, update, removeUnappliedAudit, releaseMarker] = buildQueries();
|
|
1052
|
+
const auditResult = await audit.execute(trx);
|
|
1053
|
+
if (auditResult.rows.length !== 1) {
|
|
1054
|
+
throw new ContentMutationConflictError();
|
|
1055
|
+
}
|
|
1056
|
+
const updateResult = await update.execute(trx);
|
|
1057
|
+
await removeUnappliedAudit.execute(trx);
|
|
1058
|
+
const releaseResult = await releaseMarker.execute(trx);
|
|
1059
|
+
if (updateResult.rows.length !== 1 || releaseResult.rows.length !== 1) {
|
|
1060
|
+
throw new ContentMutationConflictError();
|
|
1061
|
+
}
|
|
1062
|
+
});
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1065
|
+
invalidateCollectionCache(type);
|
|
1066
|
+
const item = await this.findById(type, id);
|
|
1067
|
+
if (!item) throw new Error("Content not found");
|
|
1068
|
+
|
|
1069
|
+
await new RevisionRepository(this.db).queuePruning(type, id, revisionId);
|
|
1070
|
+
return { item, revisionId };
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
async restoreDraftRevision(
|
|
1074
|
+
type: string,
|
|
1075
|
+
id: string,
|
|
1076
|
+
revisionData: Record<string, unknown>,
|
|
1077
|
+
authorId: string,
|
|
1078
|
+
): Promise<string | null> {
|
|
1079
|
+
const tableName = getTableName(type);
|
|
1080
|
+
const existing = await this.findById(type, id);
|
|
1081
|
+
if (!existing) return null;
|
|
1082
|
+
|
|
1083
|
+
const normalizedSnapshot = await this.datetimes.normalizeData(type, revisionData);
|
|
1084
|
+
const revisionId = createRevisionId();
|
|
1085
|
+
const buildQueries = () => {
|
|
1086
|
+
const audit = sql`
|
|
1087
|
+
INSERT INTO revisions (id, collection, entry_id, data, author_id)
|
|
1088
|
+
VALUES (${revisionId}, ${type}, ${id}, ${JSON.stringify(normalizedSnapshot)}, ${authorId})
|
|
1089
|
+
RETURNING id
|
|
1090
|
+
`;
|
|
1091
|
+
const stage = sql`
|
|
1092
|
+
UPDATE ${sql.ref(tableName)}
|
|
1093
|
+
SET draft_revision_id = ${revisionId},
|
|
1094
|
+
version = version + 1
|
|
1095
|
+
WHERE id = ${id}
|
|
1096
|
+
AND deleted_at IS NULL
|
|
1097
|
+
AND version = ${existing.version}
|
|
1098
|
+
AND updated_at = ${existing.updatedAt}
|
|
1099
|
+
AND status = ${existing.status}
|
|
1100
|
+
AND ${nullableColumnMatch("live_revision_id", existing.liveRevisionId)}
|
|
1101
|
+
AND ${nullableColumnMatch("draft_revision_id", existing.draftRevisionId)}
|
|
1102
|
+
AND ${nullableColumnMatch("scheduled_at", existing.scheduledAt)}
|
|
1103
|
+
RETURNING id
|
|
1104
|
+
`;
|
|
1105
|
+
const removeUnstagedAudit = sql`
|
|
1106
|
+
DELETE FROM revisions
|
|
1107
|
+
WHERE id = ${revisionId}
|
|
1108
|
+
AND NOT EXISTS (
|
|
1109
|
+
SELECT 1 FROM ${sql.ref(tableName)}
|
|
1110
|
+
WHERE id = ${id}
|
|
1111
|
+
AND draft_revision_id = ${revisionId}
|
|
1112
|
+
AND version = ${existing.version + 1}
|
|
1113
|
+
)
|
|
1114
|
+
`;
|
|
1115
|
+
return [audit, stage, removeUnstagedAudit] as const;
|
|
1116
|
+
};
|
|
1117
|
+
|
|
1118
|
+
const batched = await executeAtomicBatchIfSupported(this.db, buildQueries());
|
|
1119
|
+
if (batched) {
|
|
1120
|
+
if (batched[0]?.rows.length !== 1 || batched[1]?.rows.length !== 1) {
|
|
1121
|
+
throw new ContentMutationConflictError();
|
|
1122
|
+
}
|
|
1123
|
+
} else {
|
|
1124
|
+
await withTransaction(this.db, async (trx) => {
|
|
1125
|
+
const [audit, stage, removeUnstagedAudit] = buildQueries();
|
|
1126
|
+
const auditResult = await audit.execute(trx);
|
|
1127
|
+
if (auditResult.rows.length !== 1) {
|
|
1128
|
+
throw new ContentMutationConflictError();
|
|
1129
|
+
}
|
|
1130
|
+
const stageResult = await stage.execute(trx);
|
|
1131
|
+
await removeUnstagedAudit.execute(trx);
|
|
1132
|
+
if (stageResult.rows.length !== 1) {
|
|
1133
|
+
throw new ContentMutationConflictError();
|
|
1134
|
+
}
|
|
1135
|
+
});
|
|
1136
|
+
}
|
|
1137
|
+
|
|
1138
|
+
invalidateCollectionCache(type);
|
|
1139
|
+
await new RevisionRepository(this.db).queuePruning(type, id, revisionId);
|
|
1140
|
+
return revisionId;
|
|
1141
|
+
}
|
|
1142
|
+
|
|
924
1143
|
/**
|
|
925
1144
|
* Update plugin-authored fields without letting content columns diverge
|
|
926
1145
|
* from the revision pointers that publication promotes.
|
|
@@ -930,7 +1149,9 @@ export class ContentRepository {
|
|
|
930
1149
|
id: string,
|
|
931
1150
|
input: UpdateContentInput,
|
|
932
1151
|
): Promise<ContentItem> {
|
|
933
|
-
const data = input.data
|
|
1152
|
+
const data = input.data
|
|
1153
|
+
? await this.datetimes.normalizeData(type, writableContentData(input.data))
|
|
1154
|
+
: {};
|
|
934
1155
|
const stagedSlug = typeof input.slug === "string" ? input.slug : undefined;
|
|
935
1156
|
const hasDraftUpdate = Object.keys(data).length > 0 || stagedSlug !== undefined;
|
|
936
1157
|
|
|
@@ -950,16 +1171,36 @@ export class ContentRepository {
|
|
|
950
1171
|
return this.update(type, id, { ...input, data });
|
|
951
1172
|
}
|
|
952
1173
|
|
|
953
|
-
const fieldSlugs = new Set(
|
|
954
|
-
|
|
1174
|
+
const fieldSlugs = new Set(
|
|
1175
|
+
collectionRows.map((row) => row.fieldSlug).filter((slug): slug is string => Boolean(slug)),
|
|
1176
|
+
);
|
|
1177
|
+
|
|
1178
|
+
const revisionRepo = new RevisionRepository(this.db);
|
|
1179
|
+
let existing = await this.findById(type, id);
|
|
1180
|
+
|
|
1181
|
+
// A key with no field is rejected unless the entry already stores it: deleting a field
|
|
1182
|
+
// leaves its value in the draft revision, which holds the whole `data`, so a caller that
|
|
1183
|
+
// reads an entry and writes it back would otherwise be refused for a key it never chose
|
|
1184
|
+
// to send. Those keys are dropped here and shed from the merge below.
|
|
1185
|
+
let incoming = data;
|
|
1186
|
+
if (existing) {
|
|
1187
|
+
let stored: Record<string, unknown> = existing.data ?? {};
|
|
1188
|
+
if (existing.draftRevisionId) {
|
|
1189
|
+
const draft = await revisionRepo.findById(existing.draftRevisionId);
|
|
1190
|
+
if (draft?.data) stored = draft.data;
|
|
1191
|
+
}
|
|
1192
|
+
const stale = staleStoredKeys(data, stored, fieldSlugs);
|
|
1193
|
+
if (stale.length > 0) {
|
|
1194
|
+
incoming = { ...data };
|
|
1195
|
+
for (const key of stale) delete incoming[key];
|
|
1196
|
+
}
|
|
1197
|
+
}
|
|
1198
|
+
for (const field of Object.keys(incoming)) {
|
|
955
1199
|
if (!fieldSlugs.has(field)) {
|
|
956
1200
|
throw new EmDashValidationError(`Unknown field '${field}' in collection '${type}'`);
|
|
957
1201
|
}
|
|
958
1202
|
}
|
|
959
1203
|
|
|
960
|
-
const revisionRepo = new RevisionRepository(this.db);
|
|
961
|
-
let existing = await this.findById(type, id);
|
|
962
|
-
|
|
963
1204
|
for (let attempt = 0; existing && attempt < MAX_DRAFT_STAGE_ATTEMPTS; attempt++) {
|
|
964
1205
|
let baseData = existing.data;
|
|
965
1206
|
if (existing.draftRevisionId) {
|
|
@@ -967,13 +1208,13 @@ export class ContentRepository {
|
|
|
967
1208
|
if (draft) baseData = draft.data;
|
|
968
1209
|
}
|
|
969
1210
|
|
|
970
|
-
const mergedData = { ...baseData, ...
|
|
1211
|
+
const mergedData = keepKnownFields({ ...baseData, ...incoming }, fieldSlugs);
|
|
971
1212
|
if (stagedSlug !== undefined) mergedData._slug = stagedSlug;
|
|
972
1213
|
const revision = await revisionRepo.create({
|
|
973
1214
|
collection: type,
|
|
974
1215
|
entryId: id,
|
|
975
1216
|
data: mergedData,
|
|
976
|
-
...(input.
|
|
1217
|
+
...(input.revisionAuthorId ? { authorId: input.revisionAuthorId } : {}),
|
|
977
1218
|
});
|
|
978
1219
|
|
|
979
1220
|
let staged: boolean;
|
|
@@ -1035,11 +1276,19 @@ export class ContentRepository {
|
|
|
1035
1276
|
liveMetadataChanged = true;
|
|
1036
1277
|
}
|
|
1037
1278
|
if (input.publishedAt !== undefined) {
|
|
1038
|
-
|
|
1279
|
+
const publishedAt =
|
|
1280
|
+
input.publishedAt === null
|
|
1281
|
+
? null
|
|
1282
|
+
: await this.datetimes.normalizeValue(type, input.publishedAt);
|
|
1283
|
+
assignments.push(sql`published_at = ${publishedAt}`);
|
|
1039
1284
|
liveMetadataChanged = true;
|
|
1040
1285
|
}
|
|
1041
1286
|
if (input.scheduledAt !== undefined) {
|
|
1042
|
-
|
|
1287
|
+
const scheduledAt =
|
|
1288
|
+
input.scheduledAt === null
|
|
1289
|
+
? null
|
|
1290
|
+
: await this.datetimes.normalizeValue(type, input.scheduledAt);
|
|
1291
|
+
assignments.push(sql`scheduled_at = ${scheduledAt}`);
|
|
1043
1292
|
liveMetadataChanged = true;
|
|
1044
1293
|
}
|
|
1045
1294
|
if (input.authorId !== undefined) {
|
|
@@ -1074,6 +1323,165 @@ export class ContentRepository {
|
|
|
1074
1323
|
return changed;
|
|
1075
1324
|
}
|
|
1076
1325
|
|
|
1326
|
+
/**
|
|
1327
|
+
* Copy non-translatable field values to every other entry in the
|
|
1328
|
+
* translation group, trashed entries included.
|
|
1329
|
+
*
|
|
1330
|
+
* Only the fields present in `data` are copied. With `previous`, `data` is
|
|
1331
|
+
* the entry's complete new state and only the fields whose value differs
|
|
1332
|
+
* from `previous` are copied, an absent field as null. An entry that already
|
|
1333
|
+
* holds every copied value is left untouched, so its `updated_at` does not
|
|
1334
|
+
* move.
|
|
1335
|
+
*
|
|
1336
|
+
* On collections with revisions a changed entry also gets a new live
|
|
1337
|
+
* revision, because republishing and unpublishing read that revision rather
|
|
1338
|
+
* than the columns. A pending draft takes a value only where it still holds
|
|
1339
|
+
* the entry's previous value, so an unpublished edit to the field survives.
|
|
1340
|
+
*/
|
|
1341
|
+
async syncNonTranslatableFields(
|
|
1342
|
+
type: string,
|
|
1343
|
+
sourceId: string,
|
|
1344
|
+
translationGroup: string,
|
|
1345
|
+
data: Record<string, unknown>,
|
|
1346
|
+
options: { previous?: Record<string, unknown> } = {},
|
|
1347
|
+
): Promise<void> {
|
|
1348
|
+
const tableName = getTableName(type);
|
|
1349
|
+
const collectionRows = await this.db
|
|
1350
|
+
.selectFrom("_emdash_collections as collection")
|
|
1351
|
+
.leftJoin("_emdash_fields as field", (join) =>
|
|
1352
|
+
join.onRef("field.collection_id", "=", "collection.id").on("field.translatable", "=", 0),
|
|
1353
|
+
)
|
|
1354
|
+
.select(["collection.supports", "field.slug as fieldSlug"])
|
|
1355
|
+
.where("collection.slug", "=", type)
|
|
1356
|
+
.execute();
|
|
1357
|
+
|
|
1358
|
+
const { previous } = options;
|
|
1359
|
+
const values: Record<string, unknown> = {};
|
|
1360
|
+
for (const { fieldSlug } of collectionRows) {
|
|
1361
|
+
if (!fieldSlug) continue;
|
|
1362
|
+
if (previous) {
|
|
1363
|
+
if (!sameStoredValue(previous[fieldSlug], data[fieldSlug])) {
|
|
1364
|
+
values[fieldSlug] = data[fieldSlug] ?? null;
|
|
1365
|
+
}
|
|
1366
|
+
} else if (fieldSlug in data) {
|
|
1367
|
+
values[fieldSlug] = data[fieldSlug];
|
|
1368
|
+
}
|
|
1369
|
+
}
|
|
1370
|
+
if (Object.keys(values).length === 0) return;
|
|
1371
|
+
const normalizedValues = await this.datetimes.normalizeData(type, values);
|
|
1372
|
+
|
|
1373
|
+
const supportsRaw = collectionRows[0]?.supports;
|
|
1374
|
+
const supports: unknown = supportsRaw ? JSON.parse(supportsRaw) : [];
|
|
1375
|
+
const usesRevisions = Array.isArray(supports) && supports.includes("revisions");
|
|
1376
|
+
|
|
1377
|
+
const siblings = await sql<Record<string, unknown>>`
|
|
1378
|
+
SELECT * FROM ${sql.ref(tableName)}
|
|
1379
|
+
WHERE translation_group = ${translationGroup}
|
|
1380
|
+
AND id != ${sourceId}
|
|
1381
|
+
`.execute(this.db);
|
|
1382
|
+
|
|
1383
|
+
let changed = false;
|
|
1384
|
+
for (const row of siblings.rows) {
|
|
1385
|
+
if (
|
|
1386
|
+
await this.syncSiblingValues(type, this.mapRow(type, row), normalizedValues, usesRevisions)
|
|
1387
|
+
) {
|
|
1388
|
+
changed = true;
|
|
1389
|
+
}
|
|
1390
|
+
}
|
|
1391
|
+
if (changed) invalidateCollectionCache(type);
|
|
1392
|
+
}
|
|
1393
|
+
|
|
1394
|
+
private async syncSiblingValues(
|
|
1395
|
+
type: string,
|
|
1396
|
+
initial: ContentItem,
|
|
1397
|
+
values: Record<string, unknown>,
|
|
1398
|
+
usesRevisions: boolean,
|
|
1399
|
+
): Promise<boolean> {
|
|
1400
|
+
const tableName = getTableName(type);
|
|
1401
|
+
const revisionRepo = new RevisionRepository(this.db);
|
|
1402
|
+
let sibling: ContentItem | null = initial;
|
|
1403
|
+
|
|
1404
|
+
for (let attempt = 0; sibling && attempt < MAX_DRAFT_STAGE_ATTEMPTS; attempt++) {
|
|
1405
|
+
const current: ContentItem = sibling;
|
|
1406
|
+
const changed: Record<string, unknown> = {};
|
|
1407
|
+
for (const [field, value] of Object.entries(values)) {
|
|
1408
|
+
if (!sameStoredValue(current.data[field], value)) changed[field] = value;
|
|
1409
|
+
}
|
|
1410
|
+
if (Object.keys(changed).length === 0) return false;
|
|
1411
|
+
|
|
1412
|
+
const assignments: ReturnType<typeof sql>[] = [];
|
|
1413
|
+
for (const [field, value] of Object.entries(changed)) {
|
|
1414
|
+
validateIdentifier(field, "content field name");
|
|
1415
|
+
assignments.push(sql`${sql.ref(field)} = ${serializeValue(value)}`);
|
|
1416
|
+
}
|
|
1417
|
+
|
|
1418
|
+
const createdRevisionIds: string[] = [];
|
|
1419
|
+
const cleanUp = async () => {
|
|
1420
|
+
for (const revisionId of createdRevisionIds) {
|
|
1421
|
+
await this.deleteUnstagedRevision(revisionRepo, type, current.id, revisionId);
|
|
1422
|
+
}
|
|
1423
|
+
};
|
|
1424
|
+
|
|
1425
|
+
let synced: boolean;
|
|
1426
|
+
try {
|
|
1427
|
+
const live =
|
|
1428
|
+
usesRevisions && current.liveRevisionId
|
|
1429
|
+
? await revisionRepo.findById(current.liveRevisionId)
|
|
1430
|
+
: null;
|
|
1431
|
+
if (live) {
|
|
1432
|
+
const revision = await revisionRepo.create({
|
|
1433
|
+
collection: type,
|
|
1434
|
+
entryId: current.id,
|
|
1435
|
+
data: { ...live.data, ...changed },
|
|
1436
|
+
});
|
|
1437
|
+
createdRevisionIds.push(revision.id);
|
|
1438
|
+
assignments.push(sql`live_revision_id = ${revision.id}`);
|
|
1439
|
+
}
|
|
1440
|
+
|
|
1441
|
+
const draft =
|
|
1442
|
+
usesRevisions && current.draftRevisionId
|
|
1443
|
+
? await revisionRepo.findById(current.draftRevisionId)
|
|
1444
|
+
: null;
|
|
1445
|
+
const carried: Record<string, unknown> = {};
|
|
1446
|
+
for (const [field, value] of Object.entries(changed)) {
|
|
1447
|
+
if (draft && sameStoredValue(draft.data[field], current.data[field])) {
|
|
1448
|
+
carried[field] = value;
|
|
1449
|
+
}
|
|
1450
|
+
}
|
|
1451
|
+
if (draft && Object.keys(carried).length > 0) {
|
|
1452
|
+
const revision = await revisionRepo.create({
|
|
1453
|
+
collection: type,
|
|
1454
|
+
entryId: current.id,
|
|
1455
|
+
data: { ...draft.data, ...carried },
|
|
1456
|
+
});
|
|
1457
|
+
createdRevisionIds.push(revision.id);
|
|
1458
|
+
assignments.push(sql`draft_revision_id = ${revision.id}`);
|
|
1459
|
+
}
|
|
1460
|
+
|
|
1461
|
+
assignments.push(sql`updated_at = ${new Date().toISOString()}`, sql`version = version + 1`);
|
|
1462
|
+
const result = await sql`
|
|
1463
|
+
UPDATE ${sql.ref(tableName)}
|
|
1464
|
+
SET ${sql.join(assignments, sql`, `)}
|
|
1465
|
+
WHERE id = ${current.id}
|
|
1466
|
+
AND version = ${current.version}
|
|
1467
|
+
AND ${nullableColumnMatch("live_revision_id", current.liveRevisionId)}
|
|
1468
|
+
AND ${nullableColumnMatch("draft_revision_id", current.draftRevisionId)}
|
|
1469
|
+
`.execute(this.db);
|
|
1470
|
+
synced = (result.numAffectedRows ?? 0n) > 0n;
|
|
1471
|
+
} catch (error) {
|
|
1472
|
+
await cleanUp();
|
|
1473
|
+
throw error;
|
|
1474
|
+
}
|
|
1475
|
+
|
|
1476
|
+
if (synced) return true;
|
|
1477
|
+
await cleanUp();
|
|
1478
|
+
sibling = await this.findByIdIncludingTrashed(type, current.id);
|
|
1479
|
+
}
|
|
1480
|
+
|
|
1481
|
+
if (!sibling) return false;
|
|
1482
|
+
throw new ContentMutationConflictError();
|
|
1483
|
+
}
|
|
1484
|
+
|
|
1077
1485
|
/**
|
|
1078
1486
|
* Delete content (soft delete - moves to trash)
|
|
1079
1487
|
*/
|
|
@@ -1097,20 +1505,39 @@ export class ContentRepository {
|
|
|
1097
1505
|
|
|
1098
1506
|
/**
|
|
1099
1507
|
* Restore content from trash
|
|
1508
|
+
*
|
|
1509
|
+
* The entry comes back as a draft with no schedule. The live version is not
|
|
1510
|
+
* copied into a draft revision: collections without revisions save to the
|
|
1511
|
+
* columns, and a draft revision would hide those saves.
|
|
1100
1512
|
*/
|
|
1101
|
-
async restore(
|
|
1513
|
+
async restore(
|
|
1514
|
+
type: string,
|
|
1515
|
+
id: string,
|
|
1516
|
+
expectedRevision?: ContentRevisionPrecondition,
|
|
1517
|
+
): Promise<ContentItem | null> {
|
|
1102
1518
|
const tableName = getTableName(type);
|
|
1519
|
+
const existing = await this.findByIdOrSlugIncludingTrashed(type, id);
|
|
1520
|
+
if (!existing) return null;
|
|
1521
|
+
assertRevisionPrecondition(existing, expectedRevision);
|
|
1522
|
+
const now = new Date().toISOString();
|
|
1103
1523
|
|
|
1104
1524
|
const result = await sql<Record<string, unknown>>`
|
|
1105
1525
|
UPDATE ${sql.ref(tableName)}
|
|
1106
|
-
SET deleted_at = NULL
|
|
1107
|
-
|
|
1526
|
+
SET deleted_at = NULL,
|
|
1527
|
+
live_revision_id = NULL,
|
|
1528
|
+
status = 'draft',
|
|
1529
|
+
scheduled_at = NULL,
|
|
1530
|
+
updated_at = ${now},
|
|
1531
|
+
version = ${existing.version + 1}
|
|
1532
|
+
WHERE id = ${existing.id}
|
|
1108
1533
|
AND deleted_at IS NOT NULL
|
|
1534
|
+
AND version = ${existing.version}
|
|
1535
|
+
AND updated_at = ${existing.updatedAt}
|
|
1109
1536
|
RETURNING *
|
|
1110
1537
|
`.execute(this.db);
|
|
1111
1538
|
|
|
1112
1539
|
const restored = result.rows[0];
|
|
1113
|
-
if (!restored)
|
|
1540
|
+
if (!restored) throw new ContentMutationConflictError("Content changed while restoring");
|
|
1114
1541
|
|
|
1115
1542
|
invalidateCollectionCache(type);
|
|
1116
1543
|
return this.mapRow(type, restored);
|
|
@@ -1532,16 +1959,19 @@ export class ContentRepository {
|
|
|
1532
1959
|
* Sets status to 'scheduled' and stores the scheduled publish time.
|
|
1533
1960
|
* The content will be auto-published when the scheduled time is reached.
|
|
1534
1961
|
*/
|
|
1535
|
-
async schedule(
|
|
1962
|
+
async schedule(
|
|
1963
|
+
type: string,
|
|
1964
|
+
id: string,
|
|
1965
|
+
scheduledAt: string,
|
|
1966
|
+
currentTime: Date = new Date(),
|
|
1967
|
+
expectedRevision?: ContentRevisionPrecondition,
|
|
1968
|
+
): Promise<ContentItem> {
|
|
1536
1969
|
const tableName = getTableName(type);
|
|
1537
|
-
const now =
|
|
1970
|
+
const now = currentTime.toISOString();
|
|
1538
1971
|
|
|
1539
|
-
|
|
1540
|
-
const scheduledDate = new Date(
|
|
1541
|
-
if (
|
|
1542
|
-
throw new EmDashValidationError("Invalid scheduled date");
|
|
1543
|
-
}
|
|
1544
|
-
if (scheduledDate <= new Date()) {
|
|
1972
|
+
const normalizedScheduledAt = await this.datetimes.normalizeValue(type, scheduledAt);
|
|
1973
|
+
const scheduledDate = new Date(normalizedScheduledAt);
|
|
1974
|
+
if (scheduledDate <= currentTime) {
|
|
1545
1975
|
throw new EmDashValidationError("Scheduled date must be in the future");
|
|
1546
1976
|
}
|
|
1547
1977
|
|
|
@@ -1549,21 +1979,28 @@ export class ContentRepository {
|
|
|
1549
1979
|
if (!existing) {
|
|
1550
1980
|
throw new EmDashValidationError("Content item not found");
|
|
1551
1981
|
}
|
|
1982
|
+
assertRevisionPrecondition(existing, expectedRevision);
|
|
1552
1983
|
|
|
1553
1984
|
// Published posts keep their status — the schedule applies to the
|
|
1554
1985
|
// pending draft, not the currently-live revision. Unpublished posts
|
|
1555
1986
|
// transition to 'scheduled' so they aren't visible before the time.
|
|
1556
1987
|
const newStatus = existing.status === "published" ? "published" : "scheduled";
|
|
1557
1988
|
|
|
1558
|
-
|
|
1559
|
-
await sql`
|
|
1989
|
+
const result = await sql`
|
|
1560
1990
|
UPDATE ${sql.ref(tableName)}
|
|
1561
1991
|
SET status = ${newStatus},
|
|
1562
|
-
scheduled_at = ${
|
|
1992
|
+
scheduled_at = ${normalizedScheduledAt},
|
|
1563
1993
|
updated_at = ${now}
|
|
1564
1994
|
WHERE id = ${id}
|
|
1565
1995
|
AND deleted_at IS NULL
|
|
1996
|
+
AND version = ${existing.version}
|
|
1997
|
+
AND updated_at = ${existing.updatedAt}
|
|
1998
|
+
AND status = ${existing.status}
|
|
1999
|
+
AND ${nullableColumnMatch("scheduled_at", existing.scheduledAt)}
|
|
1566
2000
|
`.execute(this.db);
|
|
2001
|
+
if ((result.numAffectedRows ?? 0n) === 0n) {
|
|
2002
|
+
throw new ContentMutationConflictError("Content changed while scheduling");
|
|
2003
|
+
}
|
|
1567
2004
|
|
|
1568
2005
|
invalidateCollectionCache(type);
|
|
1569
2006
|
|
|
@@ -1581,7 +2018,11 @@ export class ContentRepository {
|
|
|
1581
2018
|
* Clears the scheduled time. Published posts stay published;
|
|
1582
2019
|
* draft/scheduled posts revert to 'draft'.
|
|
1583
2020
|
*/
|
|
1584
|
-
async unschedule(
|
|
2021
|
+
async unschedule(
|
|
2022
|
+
type: string,
|
|
2023
|
+
id: string,
|
|
2024
|
+
expectedRevision?: ContentRevisionPrecondition,
|
|
2025
|
+
): Promise<ContentItem> {
|
|
1585
2026
|
const tableName = getTableName(type);
|
|
1586
2027
|
const now = new Date().toISOString();
|
|
1587
2028
|
|
|
@@ -1589,12 +2030,13 @@ export class ContentRepository {
|
|
|
1589
2030
|
if (!existing) {
|
|
1590
2031
|
throw new EmDashValidationError("Content item not found");
|
|
1591
2032
|
}
|
|
2033
|
+
assertRevisionPrecondition(existing, expectedRevision);
|
|
1592
2034
|
|
|
1593
2035
|
// Published posts keep their status — just clear the pending schedule.
|
|
1594
2036
|
// Draft/scheduled posts revert to 'draft'.
|
|
1595
2037
|
const newStatus = existing.status === "published" ? "published" : "draft";
|
|
1596
2038
|
|
|
1597
|
-
await sql`
|
|
2039
|
+
const result = await sql`
|
|
1598
2040
|
UPDATE ${sql.ref(tableName)}
|
|
1599
2041
|
SET status = ${newStatus},
|
|
1600
2042
|
scheduled_at = NULL,
|
|
@@ -1602,7 +2044,14 @@ export class ContentRepository {
|
|
|
1602
2044
|
WHERE id = ${id}
|
|
1603
2045
|
AND scheduled_at IS NOT NULL
|
|
1604
2046
|
AND deleted_at IS NULL
|
|
2047
|
+
AND version = ${existing.version}
|
|
2048
|
+
AND updated_at = ${existing.updatedAt}
|
|
2049
|
+
AND status = ${existing.status}
|
|
2050
|
+
AND ${nullableColumnMatch("scheduled_at", existing.scheduledAt)}
|
|
1605
2051
|
`.execute(this.db);
|
|
2052
|
+
if (existing.scheduledAt !== null && (result.numAffectedRows ?? 0n) === 0n) {
|
|
2053
|
+
throw new ContentMutationConflictError("Content changed while unscheduling");
|
|
2054
|
+
}
|
|
1606
2055
|
|
|
1607
2056
|
invalidateCollectionCache(type);
|
|
1608
2057
|
|
|
@@ -1626,9 +2075,14 @@ export class ContentRepository {
|
|
|
1626
2075
|
* fan out unbounded publish/webhook work in a single tick (and blow a Worker
|
|
1627
2076
|
* invocation's CPU/subrequest budget); the remainder drains on later ticks.
|
|
1628
2077
|
*/
|
|
1629
|
-
async findReadyToPublish(
|
|
2078
|
+
async findReadyToPublish(
|
|
2079
|
+
type: string,
|
|
2080
|
+
limit?: number,
|
|
2081
|
+
currentTime: Date = new Date(),
|
|
2082
|
+
after?: { scheduledAt: string; id: string },
|
|
2083
|
+
): Promise<ContentItem[]> {
|
|
1630
2084
|
const tableName = getTableName(type);
|
|
1631
|
-
const now =
|
|
2085
|
+
const now = currentTime.toISOString();
|
|
1632
2086
|
|
|
1633
2087
|
// Embed an empty fragment when unbounded so callers that want every due
|
|
1634
2088
|
// row (manual flows, tests) keep the original behaviour.
|
|
@@ -1636,13 +2090,17 @@ export class ContentRepository {
|
|
|
1636
2090
|
typeof limit === "number" && Number.isInteger(limit) && limit > 0
|
|
1637
2091
|
? sql`LIMIT ${limit}`
|
|
1638
2092
|
: sql``;
|
|
2093
|
+
const afterClause = after
|
|
2094
|
+
? sql`AND (scheduled_at > ${after.scheduledAt} OR (scheduled_at = ${after.scheduledAt} AND id > ${after.id}))`
|
|
2095
|
+
: sql``;
|
|
1639
2096
|
|
|
1640
2097
|
const result = await sql<Record<string, unknown>>`
|
|
1641
2098
|
SELECT * FROM ${sql.ref(tableName)}
|
|
1642
2099
|
WHERE scheduled_at IS NOT NULL
|
|
1643
2100
|
AND scheduled_at <= ${now}
|
|
1644
2101
|
AND deleted_at IS NULL
|
|
1645
|
-
|
|
2102
|
+
${afterClause}
|
|
2103
|
+
ORDER BY scheduled_at ASC, id ASC
|
|
1646
2104
|
${limitClause}
|
|
1647
2105
|
`.execute(this.db);
|
|
1648
2106
|
|
|
@@ -1665,6 +2123,19 @@ export class ContentRepository {
|
|
|
1665
2123
|
return result.rows.map((row) => this.mapRow(type, row));
|
|
1666
2124
|
}
|
|
1667
2125
|
|
|
2126
|
+
/** Whether any row of `translationGroup` exists, trashed rows included. */
|
|
2127
|
+
async hasTranslationsIncludingTrashed(type: string, translationGroup: string): Promise<boolean> {
|
|
2128
|
+
const tableName = getTableName(type);
|
|
2129
|
+
|
|
2130
|
+
const result = await sql<Record<string, unknown>>`
|
|
2131
|
+
SELECT id FROM ${sql.ref(tableName)}
|
|
2132
|
+
WHERE translation_group = ${translationGroup}
|
|
2133
|
+
LIMIT 1
|
|
2134
|
+
`.execute(this.db);
|
|
2135
|
+
|
|
2136
|
+
return result.rows.length > 0;
|
|
2137
|
+
}
|
|
2138
|
+
|
|
1668
2139
|
/**
|
|
1669
2140
|
* Batch variant of {@link findTranslations}: every (non-deleted) locale
|
|
1670
2141
|
* variant for any of `translationGroups`, in one `WHERE translation_group IN
|
|
@@ -1807,15 +2278,22 @@ export class ContentRepository {
|
|
|
1807
2278
|
promoteRevision = true,
|
|
1808
2279
|
requireSlug = true,
|
|
1809
2280
|
expectedRevision?: ContentRevisionPrecondition,
|
|
2281
|
+
currentTime: Date = new Date(),
|
|
1810
2282
|
): Promise<ContentItem> {
|
|
1811
2283
|
const tableName = getTableName(type);
|
|
1812
|
-
const now =
|
|
2284
|
+
const now = currentTime.toISOString();
|
|
1813
2285
|
|
|
1814
2286
|
const existing = await this.findById(type, id);
|
|
1815
2287
|
if (!existing) {
|
|
1816
2288
|
throw new EmDashValidationError("Content item not found");
|
|
1817
2289
|
}
|
|
1818
2290
|
assertRevisionPrecondition(existing, expectedRevision);
|
|
2291
|
+
const requestedPublishedAt = publishedAt
|
|
2292
|
+
? await this.datetimes.normalizeValue(type, publishedAt)
|
|
2293
|
+
: undefined;
|
|
2294
|
+
const currentPublishedAt = existing.publishedAt
|
|
2295
|
+
? await this.datetimes.normalizeValue(type, existing.publishedAt)
|
|
2296
|
+
: null;
|
|
1819
2297
|
if (
|
|
1820
2298
|
requireDue &&
|
|
1821
2299
|
expectedScheduledAt !== undefined &&
|
|
@@ -1842,7 +2320,7 @@ export class ContentRepository {
|
|
|
1842
2320
|
provisionalRevisionId = revision.id;
|
|
1843
2321
|
}
|
|
1844
2322
|
|
|
1845
|
-
const intendedPublishedAt =
|
|
2323
|
+
const intendedPublishedAt = requestedPublishedAt ?? currentPublishedAt ?? now;
|
|
1846
2324
|
const duePredicate = requireDue
|
|
1847
2325
|
? sql`AND scheduled_at IS NOT NULL AND scheduled_at <= ${now}`
|
|
1848
2326
|
: sql``;
|
|
@@ -1946,7 +2424,7 @@ export class ContentRepository {
|
|
|
1946
2424
|
if (requireSlug && !intendedSlug?.trim()) {
|
|
1947
2425
|
throw new EmDashValidationError("Cannot publish routable content without a slug");
|
|
1948
2426
|
}
|
|
1949
|
-
const intendedPublishedAt =
|
|
2427
|
+
const intendedPublishedAt = requestedPublishedAt ?? currentPublishedAt ?? now;
|
|
1950
2428
|
if (stagedSlug !== null && stagedSlug !== existing.slug && existing.locale !== null) {
|
|
1951
2429
|
const conflict = await this.findBySlugIncludingTrashed(type, stagedSlug, existing.locale);
|
|
1952
2430
|
if (conflict && conflict.id !== id) {
|
|
@@ -2061,8 +2539,9 @@ export class ContentRepository {
|
|
|
2061
2539
|
/**
|
|
2062
2540
|
* Unpublish content
|
|
2063
2541
|
*
|
|
2064
|
-
* Removes live pointer
|
|
2065
|
-
* draft exists, creates one from the live
|
|
2542
|
+
* Removes live pointer and cancels any pending schedule, but preserves the
|
|
2543
|
+
* draft and publication date. If no draft exists, creates one from the live
|
|
2544
|
+
* version so the content isn't lost.
|
|
2066
2545
|
*/
|
|
2067
2546
|
async unpublish(
|
|
2068
2547
|
type: string,
|
|
@@ -2077,7 +2556,9 @@ export class ContentRepository {
|
|
|
2077
2556
|
throw new EmDashValidationError("Content item not found");
|
|
2078
2557
|
}
|
|
2079
2558
|
assertRevisionPrecondition(existing, expectedRevision);
|
|
2080
|
-
if (existing.status === "draft" && !existing.liveRevisionId
|
|
2559
|
+
if (existing.status === "draft" && !existing.liveRevisionId && !existing.scheduledAt) {
|
|
2560
|
+
return existing;
|
|
2561
|
+
}
|
|
2081
2562
|
|
|
2082
2563
|
const revisionRepo = new RevisionRepository(this.db);
|
|
2083
2564
|
let provisionalRevisionId: string | null = null;
|
|
@@ -2101,6 +2582,7 @@ export class ContentRepository {
|
|
|
2101
2582
|
SET live_revision_id = NULL,
|
|
2102
2583
|
draft_revision_id = ${draftRevisionId},
|
|
2103
2584
|
status = 'draft',
|
|
2585
|
+
scheduled_at = NULL,
|
|
2104
2586
|
updated_at = ${now},
|
|
2105
2587
|
version = version + 1
|
|
2106
2588
|
WHERE id = ${id}
|
|
@@ -2322,6 +2804,15 @@ export class ContentRepository {
|
|
|
2322
2804
|
`Filter value for field "${field}" exceeds ${MAX_FILTER_STRING_LENGTH} characters`,
|
|
2323
2805
|
);
|
|
2324
2806
|
}
|
|
2807
|
+
if (type === "datetime") {
|
|
2808
|
+
try {
|
|
2809
|
+
return normalizeExplicitDatetime(value);
|
|
2810
|
+
} catch {
|
|
2811
|
+
throw new EmDashValidationError(
|
|
2812
|
+
`Filter for datetime field "${field}" must use an ISO 8601 datetime with Z or an explicit offset`,
|
|
2813
|
+
);
|
|
2814
|
+
}
|
|
2815
|
+
}
|
|
2325
2816
|
return value;
|
|
2326
2817
|
}
|
|
2327
2818
|
|