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
|
@@ -0,0 +1,1520 @@
|
|
|
1
|
+
import { a as MAX_COLLECTION_LIST_COLUMNS, i as MAX_COLLECTION_GROUP_LENGTH } from "./types-B3RkqvDW.mjs";
|
|
2
|
+
import { t as SQL_BATCH_SIZE } from "./chunks-BmWyou79.mjs";
|
|
3
|
+
import { t as isValidFocalPointUpdate } from "./focal-point-Gr34o-4o.mjs";
|
|
4
|
+
import { t as SEARCH_TOKENIZERS } from "./types-CSHgU_-_.mjs";
|
|
5
|
+
import { C as slugPattern, S as roleLevel, g as cursorPaginationQuery, v as httpUrl, y as localeCode } from "./redirects-BCiTaIQ-.mjs";
|
|
6
|
+
import { t as compileUrlPattern } from "./url-pattern-3m3reMzr.mjs";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
|
|
9
|
+
//#region src/api/schemas/bylines.ts
|
|
10
|
+
/** Slug pattern: lowercase letters, digits, and hyphens; must start with a letter */
|
|
11
|
+
const bylineSlugPattern = /^[a-z][a-z0-9-]*$/;
|
|
12
|
+
const bylineSummarySchema = z.object({
|
|
13
|
+
id: z.string(),
|
|
14
|
+
slug: z.string(),
|
|
15
|
+
displayName: z.string(),
|
|
16
|
+
bio: z.string().nullable(),
|
|
17
|
+
avatarMediaId: z.string().nullable(),
|
|
18
|
+
avatarStorageKey: z.string().nullish(),
|
|
19
|
+
avatarAlt: z.string().nullish(),
|
|
20
|
+
avatarBlurhash: z.string().nullish(),
|
|
21
|
+
avatarDominantColor: z.string().nullish(),
|
|
22
|
+
websiteUrl: z.string().nullable(),
|
|
23
|
+
userId: z.string().nullable(),
|
|
24
|
+
isGuest: z.boolean(),
|
|
25
|
+
createdAt: z.string(),
|
|
26
|
+
updatedAt: z.string(),
|
|
27
|
+
locale: z.string(),
|
|
28
|
+
translationGroup: z.string().nullable(),
|
|
29
|
+
customFields: z.record(z.string(), z.union([
|
|
30
|
+
z.string(),
|
|
31
|
+
z.boolean(),
|
|
32
|
+
z.null()
|
|
33
|
+
])).optional()
|
|
34
|
+
}).meta({ id: "BylineSummary" });
|
|
35
|
+
const bylineCreditSchema = z.object({
|
|
36
|
+
byline: bylineSummarySchema,
|
|
37
|
+
sortOrder: z.number().int(),
|
|
38
|
+
roleLabel: z.string().nullable(),
|
|
39
|
+
source: z.enum(["explicit", "inferred"]).optional().meta({ description: "Whether this credit was explicitly assigned or inferred from authorId" })
|
|
40
|
+
}).meta({ id: "BylineCredit" });
|
|
41
|
+
const contentBylineInputSchema = z.object({
|
|
42
|
+
bylineId: z.string().min(1),
|
|
43
|
+
roleLabel: z.string().nullish()
|
|
44
|
+
}).meta({ id: "ContentBylineInput" });
|
|
45
|
+
const bylinesListQuery = cursorPaginationQuery.extend({
|
|
46
|
+
search: z.string().optional(),
|
|
47
|
+
isGuest: z.coerce.boolean().optional(),
|
|
48
|
+
userId: z.string().optional(),
|
|
49
|
+
locale: localeCode.optional()
|
|
50
|
+
}).meta({ id: "BylinesListQuery" });
|
|
51
|
+
const bylineCreateBody = z.object({
|
|
52
|
+
slug: z.string().min(1).regex(bylineSlugPattern, "Slug must contain only lowercase letters, digits, and hyphens"),
|
|
53
|
+
displayName: z.string().min(1),
|
|
54
|
+
bio: z.string().nullish(),
|
|
55
|
+
avatarMediaId: z.string().nullish(),
|
|
56
|
+
websiteUrl: httpUrl.nullish(),
|
|
57
|
+
userId: z.string().nullish(),
|
|
58
|
+
isGuest: z.boolean().optional(),
|
|
59
|
+
locale: localeCode.optional(),
|
|
60
|
+
translationOf: z.string().min(1).optional(),
|
|
61
|
+
customFields: z.record(z.string(), z.unknown()).optional()
|
|
62
|
+
}).meta({ id: "BylineCreateBody" });
|
|
63
|
+
const bylineTranslationCreateBody = z.object({
|
|
64
|
+
locale: localeCode,
|
|
65
|
+
slug: z.string().min(1).regex(bylineSlugPattern, "Slug must contain only lowercase letters, digits, and hyphens").optional(),
|
|
66
|
+
displayName: z.string().min(1).optional(),
|
|
67
|
+
bio: z.string().nullish(),
|
|
68
|
+
avatarMediaId: z.string().nullish(),
|
|
69
|
+
websiteUrl: httpUrl.nullish()
|
|
70
|
+
}).meta({ id: "BylineTranslationCreateBody" });
|
|
71
|
+
const bylineTranslationsResponseSchema = z.object({ items: z.array(bylineSummarySchema) }).meta({ id: "BylineTranslationsResponse" });
|
|
72
|
+
const bylineUpdateBody = z.object({
|
|
73
|
+
slug: z.string().min(1).regex(bylineSlugPattern, "Slug must contain only lowercase letters, digits, and hyphens").optional(),
|
|
74
|
+
displayName: z.string().min(1).optional(),
|
|
75
|
+
bio: z.string().nullish(),
|
|
76
|
+
avatarMediaId: z.string().nullish(),
|
|
77
|
+
websiteUrl: httpUrl.nullish(),
|
|
78
|
+
userId: z.string().nullish(),
|
|
79
|
+
isGuest: z.boolean().optional(),
|
|
80
|
+
customFields: z.record(z.string(), z.unknown()).optional()
|
|
81
|
+
}).meta({ id: "BylineUpdateBody" });
|
|
82
|
+
const bylineListResponseSchema = z.object({
|
|
83
|
+
items: z.array(bylineSummarySchema),
|
|
84
|
+
nextCursor: z.string().optional()
|
|
85
|
+
}).meta({ id: "BylineListResponse" });
|
|
86
|
+
|
|
87
|
+
//#endregion
|
|
88
|
+
//#region src/api/schemas/content.ts
|
|
89
|
+
const contentDateTime = z.iso.datetime({
|
|
90
|
+
offset: true,
|
|
91
|
+
message: "must be an ISO 8601 datetime"
|
|
92
|
+
}).or(z.iso.datetime({
|
|
93
|
+
offset: true,
|
|
94
|
+
precision: -1,
|
|
95
|
+
message: "must be an ISO 8601 datetime"
|
|
96
|
+
}));
|
|
97
|
+
/** SEO input — per-content meta fields */
|
|
98
|
+
const contentSeoInput = z.object({
|
|
99
|
+
title: z.string().max(200).nullish(),
|
|
100
|
+
description: z.string().max(500).nullish(),
|
|
101
|
+
image: z.string().nullish(),
|
|
102
|
+
canonical: httpUrl.nullish(),
|
|
103
|
+
noIndex: z.boolean().optional()
|
|
104
|
+
}).meta({ id: "ContentSeoInput" });
|
|
105
|
+
/** ISO 8601 date or datetime bound for the content-list date range filter. */
|
|
106
|
+
const contentDateBound = z.union([contentDateTime, z.iso.date({ message: "must be an ISO 8601 date" })]).optional();
|
|
107
|
+
/**
|
|
108
|
+
* Byline ids for the content-list filter: either the literal `none` or a
|
|
109
|
+
* comma-separated list, parsed into an array.
|
|
110
|
+
*
|
|
111
|
+
* The 25-id cap keeps the `IN (...)` clause clear of D1's bound-parameter
|
|
112
|
+
* ceiling once the rest of the list query's placeholders are counted
|
|
113
|
+
* (`SQL_BATCH_SIZE` is 50 for a query binding nothing else).
|
|
114
|
+
*/
|
|
115
|
+
const bylineFilterParam = z.string().trim().min(1).max(2e3).optional().transform((value) => value === void 0 ? void 0 : value === "none" ? "none" : [...new Set(value.split(",").map((id) => id.trim()))].filter((id) => id.length > 0)).refine((value) => value === void 0 || value === "none" || value.length <= 25, { message: "at most 25 bylines may be selected" }).refine((value) => value === void 0 || value === "none" || value.length > 0, { message: "must contain at least one byline id" });
|
|
116
|
+
/** Query-string boolean. Explicit values only — `z.coerce.boolean()` reads "false" as true. */
|
|
117
|
+
const booleanParam = z.enum([
|
|
118
|
+
"1",
|
|
119
|
+
"0",
|
|
120
|
+
"true",
|
|
121
|
+
"false"
|
|
122
|
+
]).optional().transform((value) => value === "1" || value === "true");
|
|
123
|
+
const contentFieldComparable = z.union([z.string().max(2048), z.number()]);
|
|
124
|
+
const contentFieldFilterScalar = z.union([
|
|
125
|
+
contentFieldComparable,
|
|
126
|
+
z.boolean(),
|
|
127
|
+
z.null()
|
|
128
|
+
]);
|
|
129
|
+
const contentFieldFilterValue = z.union([
|
|
130
|
+
contentFieldFilterScalar,
|
|
131
|
+
z.object({ in: z.array(z.union([contentFieldComparable, z.boolean()])).min(1).max(SQL_BATCH_SIZE) }).strict(),
|
|
132
|
+
z.object({
|
|
133
|
+
gt: contentFieldComparable.optional(),
|
|
134
|
+
gte: contentFieldComparable.optional(),
|
|
135
|
+
lt: contentFieldComparable.optional(),
|
|
136
|
+
lte: contentFieldComparable.optional()
|
|
137
|
+
}).strict().refine((value) => Object.values(value).some((bound) => bound !== void 0), { message: "Range filter must include at least one bound" })
|
|
138
|
+
]);
|
|
139
|
+
function contentFieldFilterOperandCount(value) {
|
|
140
|
+
if (value === null) return 0;
|
|
141
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return 1;
|
|
142
|
+
if ("in" in value && Array.isArray(value.in)) return value.in.length;
|
|
143
|
+
return Object.values(value).filter((bound) => bound !== void 0).length;
|
|
144
|
+
}
|
|
145
|
+
/** AND-combined filters over custom fields explicitly marked as indexed. */
|
|
146
|
+
const contentFieldFiltersSchema = z.record(z.string().max(128).regex(/^[a-z][a-z0-9_]*$/, "must be a safe field identifier"), contentFieldFilterValue).refine((filters) => Object.keys(filters).length <= 20, { message: "At most 20 indexed field filters are allowed" }).refine((filters) => Object.values(filters).reduce((total, value) => total + contentFieldFilterOperandCount(value), 0) <= SQL_BATCH_SIZE, { message: `Indexed field filters have a total operand budget of ${SQL_BATCH_SIZE}` });
|
|
147
|
+
const contentFieldFiltersQuery = z.string().max(8192).transform((value, ctx) => {
|
|
148
|
+
try {
|
|
149
|
+
return JSON.parse(value);
|
|
150
|
+
} catch {
|
|
151
|
+
ctx.addIssue({
|
|
152
|
+
code: "custom",
|
|
153
|
+
message: "must be valid JSON"
|
|
154
|
+
});
|
|
155
|
+
return z.NEVER;
|
|
156
|
+
}
|
|
157
|
+
}).pipe(contentFieldFiltersSchema);
|
|
158
|
+
const contentListQuery = cursorPaginationQuery.extend({
|
|
159
|
+
status: z.string().optional(),
|
|
160
|
+
orderBy: z.string().optional(),
|
|
161
|
+
order: z.enum(["asc", "desc"]).optional(),
|
|
162
|
+
locale: localeCode.optional(),
|
|
163
|
+
q: z.string().trim().min(1).max(200).optional(),
|
|
164
|
+
authorId: z.string().min(1).max(64).optional(),
|
|
165
|
+
dateField: z.enum([
|
|
166
|
+
"createdAt",
|
|
167
|
+
"updatedAt",
|
|
168
|
+
"publishedAt"
|
|
169
|
+
]).optional(),
|
|
170
|
+
dateFrom: contentDateBound,
|
|
171
|
+
dateTo: contentDateBound,
|
|
172
|
+
bylines: bylineFilterParam,
|
|
173
|
+
includeInferredBylines: booleanParam,
|
|
174
|
+
fieldFilters: contentFieldFiltersQuery.optional()
|
|
175
|
+
}).transform(({ bylines, ...rest }) => ({
|
|
176
|
+
...rest,
|
|
177
|
+
bylinesNone: bylines === "none",
|
|
178
|
+
bylines: bylines === "none" ? void 0 : bylines
|
|
179
|
+
})).meta({ id: "ContentListQuery" });
|
|
180
|
+
/** ISO 8601 datetime for `publishedAt` / `createdAt`. Routes gate writes behind `content:publish_any`. */
|
|
181
|
+
const contentDateOverride = contentDateTime.nullish();
|
|
182
|
+
const overrideLockFlag = z.boolean().optional().meta({ description: "Write even though another editor holds this entry's edit lock. Without it the write is refused with 409 ENTRY_LOCKED." });
|
|
183
|
+
const contentCreateBody = z.object({
|
|
184
|
+
data: z.record(z.string(), z.unknown()),
|
|
185
|
+
slug: z.string().nullish(),
|
|
186
|
+
status: z.enum(["draft"]).optional(),
|
|
187
|
+
bylines: z.array(contentBylineInputSchema).optional(),
|
|
188
|
+
locale: localeCode.optional(),
|
|
189
|
+
translationOf: z.string().optional(),
|
|
190
|
+
seo: contentSeoInput.optional(),
|
|
191
|
+
taxonomies: z.record(z.string(), z.array(z.string())).optional().meta({ description: "Taxonomy term assignments as { taxonomyName: [termSlug, ...] }, resolved in the entry's locale." }),
|
|
192
|
+
publishedAt: contentDateOverride,
|
|
193
|
+
createdAt: contentDateOverride
|
|
194
|
+
}).meta({ id: "ContentCreateBody" });
|
|
195
|
+
const contentUpdateBody = z.object({
|
|
196
|
+
data: z.record(z.string(), z.unknown()).optional(),
|
|
197
|
+
slug: z.string().nullish(),
|
|
198
|
+
status: z.enum(["draft"]).optional(),
|
|
199
|
+
authorId: z.string().nullish(),
|
|
200
|
+
bylines: z.array(contentBylineInputSchema).optional(),
|
|
201
|
+
_rev: z.string().optional().meta({ description: "Opaque revision token for optimistic concurrency" }),
|
|
202
|
+
skipRevision: z.boolean().optional(),
|
|
203
|
+
overrideLock: overrideLockFlag,
|
|
204
|
+
seo: contentSeoInput.optional(),
|
|
205
|
+
taxonomies: z.record(z.string(), z.array(z.string())).optional().meta({ description: "Replace taxonomy assignments as { taxonomyName: [termSlug, ...] }. Only named taxonomies are touched; pass an empty array to clear a taxonomy." }),
|
|
206
|
+
publishedAt: contentDateOverride
|
|
207
|
+
}).meta({ id: "ContentUpdateBody" });
|
|
208
|
+
const contentScheduleBody = z.object({
|
|
209
|
+
scheduledAt: contentDateTime.meta({
|
|
210
|
+
description: "ISO 8601 datetime with Z or an explicit offset for scheduled publishing",
|
|
211
|
+
examples: ["2025-06-15T09:00:00Z"]
|
|
212
|
+
}),
|
|
213
|
+
overrideLock: overrideLockFlag,
|
|
214
|
+
_rev: z.string().optional().meta({ description: "Opaque revision token for optimistic concurrency" })
|
|
215
|
+
}).meta({ id: "ContentScheduleBody" });
|
|
216
|
+
const contentRevisionConditionBody = z.object({
|
|
217
|
+
_rev: z.string().optional().meta({ description: "Opaque revision token for optimistic concurrency" }),
|
|
218
|
+
overrideLock: overrideLockFlag
|
|
219
|
+
}).meta({ id: "ContentRevisionConditionBody" });
|
|
220
|
+
const contentPublishBody = contentRevisionConditionBody.extend({ publishedAt: contentDateTime.optional().meta({ description: "Optional ISO 8601 datetime to backdate the publish (e.g. when migrating content). Requires content:publish_any permission. Without this, existing published_at is preserved on re-publish." }) }).meta({ id: "ContentPublishBody" });
|
|
221
|
+
const contentPreviewUrlBody = z.object({
|
|
222
|
+
expiresIn: z.union([z.string(), z.number()]).optional(),
|
|
223
|
+
pathPattern: z.string().optional()
|
|
224
|
+
}).meta({ id: "ContentPreviewUrlBody" });
|
|
225
|
+
const contentTermsBody = z.object({ termIds: z.array(z.string()) }).meta({ id: "ContentTermsBody" });
|
|
226
|
+
/** A single term variant returned as part of an entry's term assignments. */
|
|
227
|
+
const contentEntryTermSchema = z.object({
|
|
228
|
+
id: z.string(),
|
|
229
|
+
name: z.string().meta({ description: "Taxonomy name" }),
|
|
230
|
+
slug: z.string(),
|
|
231
|
+
label: z.string(),
|
|
232
|
+
parentId: z.string().nullable(),
|
|
233
|
+
locale: localeCode,
|
|
234
|
+
translationGroup: z.string().nullable()
|
|
235
|
+
}).meta({ id: "ContentEntryTerm" });
|
|
236
|
+
/** Term assignments response for the content terms endpoint. */
|
|
237
|
+
const contentTermsResponseSchema = z.object({
|
|
238
|
+
terms: z.array(contentEntryTermSchema),
|
|
239
|
+
unresolved: z.array(z.object({
|
|
240
|
+
translationGroup: z.string(),
|
|
241
|
+
availableLocales: z.array(localeCode),
|
|
242
|
+
translations: z.array(z.object({
|
|
243
|
+
id: z.string(),
|
|
244
|
+
slug: z.string(),
|
|
245
|
+
locale: localeCode
|
|
246
|
+
}))
|
|
247
|
+
})),
|
|
248
|
+
entryLocale: localeCode,
|
|
249
|
+
defaultLocale: localeCode,
|
|
250
|
+
implicitDefaultLocale: z.boolean()
|
|
251
|
+
}).meta({ id: "ContentTermsResponse" });
|
|
252
|
+
const contentTrashQuery = cursorPaginationQuery.extend({ locale: localeCode.optional().meta({ description: "Restrict the trash listing to entries in this locale" }) }).meta({ id: "ContentTrashQuery" });
|
|
253
|
+
/** SEO metadata on a content item */
|
|
254
|
+
const contentSeoSchema = z.object({
|
|
255
|
+
title: z.string().nullable(),
|
|
256
|
+
description: z.string().nullable(),
|
|
257
|
+
image: z.string().nullable(),
|
|
258
|
+
canonical: z.string().nullable(),
|
|
259
|
+
noIndex: z.boolean()
|
|
260
|
+
}).meta({ id: "ContentSeo" });
|
|
261
|
+
/** A single content item as returned by the API */
|
|
262
|
+
const contentItemSchema = z.object({
|
|
263
|
+
id: z.string(),
|
|
264
|
+
type: z.string().meta({ description: "Collection slug this item belongs to" }),
|
|
265
|
+
slug: z.string().nullable(),
|
|
266
|
+
status: z.string().meta({ description: "draft, published, or scheduled" }),
|
|
267
|
+
data: z.record(z.string(), z.unknown()).meta({ description: "User-defined field values" }),
|
|
268
|
+
authorId: z.string().nullable(),
|
|
269
|
+
primaryBylineId: z.string().nullable(),
|
|
270
|
+
byline: bylineSummarySchema.nullable().optional(),
|
|
271
|
+
bylines: z.array(bylineCreditSchema).optional(),
|
|
272
|
+
createdAt: z.string(),
|
|
273
|
+
updatedAt: z.string(),
|
|
274
|
+
publishedAt: z.string().nullable(),
|
|
275
|
+
scheduledAt: z.string().nullable(),
|
|
276
|
+
liveRevisionId: z.string().nullable(),
|
|
277
|
+
draftRevisionId: z.string().nullable(),
|
|
278
|
+
version: z.number().int(),
|
|
279
|
+
locale: z.string().nullable(),
|
|
280
|
+
translationGroup: z.string().nullable(),
|
|
281
|
+
seo: contentSeoSchema.optional()
|
|
282
|
+
}).meta({ id: "ContentItem" });
|
|
283
|
+
/** Response for single content item endpoints (get, create, update) */
|
|
284
|
+
const contentResponseSchema = z.object({
|
|
285
|
+
item: contentItemSchema,
|
|
286
|
+
_rev: z.string().optional().meta({ description: "Opaque revision token for optimistic concurrency" })
|
|
287
|
+
}).meta({ id: "ContentResponse" });
|
|
288
|
+
/** Response for restoring an item from trash */
|
|
289
|
+
const contentRestoreResponseSchema = z.object({
|
|
290
|
+
restored: z.literal(true),
|
|
291
|
+
item: contentItemSchema,
|
|
292
|
+
_rev: z.string().meta({ description: "Opaque revision token for optimistic concurrency" })
|
|
293
|
+
}).meta({ id: "ContentRestoreResponse" });
|
|
294
|
+
/** Response for content list endpoints */
|
|
295
|
+
const contentListResponseSchema = z.object({
|
|
296
|
+
items: z.array(contentItemSchema),
|
|
297
|
+
nextCursor: z.string().optional(),
|
|
298
|
+
total: z.number().int().nonnegative().optional()
|
|
299
|
+
}).meta({ id: "ContentListResponse" });
|
|
300
|
+
/** A distinct content author for the admin author filter */
|
|
301
|
+
const contentAuthorSchema = z.object({
|
|
302
|
+
id: z.string(),
|
|
303
|
+
name: z.string().nullable(),
|
|
304
|
+
email: z.string(),
|
|
305
|
+
avatarUrl: z.string().nullable()
|
|
306
|
+
}).meta({ id: "ContentAuthor" });
|
|
307
|
+
/** Response for the content authors endpoint */
|
|
308
|
+
const contentAuthorsResponseSchema = z.object({ items: z.array(contentAuthorSchema) }).meta({ id: "ContentAuthorsResponse" });
|
|
309
|
+
/** Trashed content item */
|
|
310
|
+
const trashedContentItemSchema = z.object({
|
|
311
|
+
id: z.string(),
|
|
312
|
+
type: z.string(),
|
|
313
|
+
slug: z.string().nullable(),
|
|
314
|
+
status: z.string(),
|
|
315
|
+
locale: z.string().nullable(),
|
|
316
|
+
translationGroup: z.string().nullable(),
|
|
317
|
+
data: z.record(z.string(), z.unknown()),
|
|
318
|
+
authorId: z.string().nullable(),
|
|
319
|
+
createdAt: z.string(),
|
|
320
|
+
updatedAt: z.string(),
|
|
321
|
+
publishedAt: z.string().nullable(),
|
|
322
|
+
deletedAt: z.string()
|
|
323
|
+
}).meta({ id: "TrashedContentItem" });
|
|
324
|
+
/** Response for trashed content list */
|
|
325
|
+
const trashedContentListResponseSchema = z.object({
|
|
326
|
+
items: z.array(trashedContentItemSchema),
|
|
327
|
+
nextCursor: z.string().optional()
|
|
328
|
+
}).meta({ id: "TrashedContentListResponse" });
|
|
329
|
+
/** Response for content compare (live vs draft) */
|
|
330
|
+
const contentCompareResponseSchema = z.object({
|
|
331
|
+
hasChanges: z.boolean(),
|
|
332
|
+
live: z.record(z.string(), z.unknown()).nullable(),
|
|
333
|
+
draft: z.record(z.string(), z.unknown()).nullable()
|
|
334
|
+
}).meta({ id: "ContentCompareResponse" });
|
|
335
|
+
/** Translation summary for a content item */
|
|
336
|
+
const contentTranslationSchema = z.object({
|
|
337
|
+
id: z.string(),
|
|
338
|
+
locale: z.string().nullable(),
|
|
339
|
+
slug: z.string().nullable(),
|
|
340
|
+
status: z.string(),
|
|
341
|
+
updatedAt: z.string()
|
|
342
|
+
});
|
|
343
|
+
/** Response for content translations endpoint */
|
|
344
|
+
const contentTranslationsResponseSchema = z.object({
|
|
345
|
+
translationGroup: z.string(),
|
|
346
|
+
translations: z.array(contentTranslationSchema)
|
|
347
|
+
}).meta({ id: "ContentTranslationsResponse" });
|
|
348
|
+
|
|
349
|
+
//#endregion
|
|
350
|
+
//#region src/api/schemas/media-usage.ts
|
|
351
|
+
const mediaUsageCoverageStatusSchema = z.enum([
|
|
352
|
+
"complete",
|
|
353
|
+
"never",
|
|
354
|
+
"running",
|
|
355
|
+
"partial",
|
|
356
|
+
"failed",
|
|
357
|
+
"stale",
|
|
358
|
+
"unknown"
|
|
359
|
+
]).meta({ id: "MediaUsageCoverageStatus" });
|
|
360
|
+
const mediaUsageCoverageSchema = z.object({
|
|
361
|
+
scope: z.literal("all_content_collections"),
|
|
362
|
+
status: mediaUsageCoverageStatusSchema
|
|
363
|
+
}).meta({ id: "MediaUsageCoverage" });
|
|
364
|
+
const mediaUsageProgressSchema = z.object({
|
|
365
|
+
status: z.enum([
|
|
366
|
+
"indexing",
|
|
367
|
+
"ready",
|
|
368
|
+
"needs_attention"
|
|
369
|
+
]),
|
|
370
|
+
readyCollections: z.number().int().min(0),
|
|
371
|
+
totalCollections: z.number().int().min(0)
|
|
372
|
+
}).meta({ id: "MediaUsageProgress" });
|
|
373
|
+
const mediaUsageSummarySchema = z.object({
|
|
374
|
+
count: z.number().int().min(0).nullable(),
|
|
375
|
+
coverage: mediaUsageCoverageSchema
|
|
376
|
+
}).meta({ id: "MediaUsageSummary" });
|
|
377
|
+
const mediaUsageDetailsQuery = z.object({
|
|
378
|
+
cursor: z.string().min(1).max(2048).optional().meta({ description: "Opaque content-entry-group cursor" }),
|
|
379
|
+
limit: z.coerce.number().int().min(1).max(100).optional().default(50).meta({ description: "Maximum number of content entry groups to return (1-100, default 50)" })
|
|
380
|
+
});
|
|
381
|
+
const mediaUsageOccurrenceDetailSchema = z.object({
|
|
382
|
+
fieldSlug: z.string(),
|
|
383
|
+
fieldPath: z.string(),
|
|
384
|
+
occurrenceIndex: z.number().int().min(0),
|
|
385
|
+
referenceType: z.enum([
|
|
386
|
+
"image_field",
|
|
387
|
+
"file_field",
|
|
388
|
+
"portable_text_image",
|
|
389
|
+
"unknown"
|
|
390
|
+
])
|
|
391
|
+
}).meta({ id: "MediaUsageOccurrenceDetail" });
|
|
392
|
+
const mediaUsageSourceDetailSchema = z.object({
|
|
393
|
+
variant: z.enum(["columns", "draft_overlay"]),
|
|
394
|
+
occurrences: z.array(mediaUsageOccurrenceDetailSchema)
|
|
395
|
+
}).meta({ id: "MediaUsageSourceDetail" });
|
|
396
|
+
const mediaUsageEntryDetailSchema = z.object({
|
|
397
|
+
collection: z.string(),
|
|
398
|
+
contentId: z.string(),
|
|
399
|
+
title: z.string().nullable(),
|
|
400
|
+
slug: z.string().nullable(),
|
|
401
|
+
locale: z.string().nullable(),
|
|
402
|
+
status: z.string().nullable(),
|
|
403
|
+
scheduledAt: z.string().nullable(),
|
|
404
|
+
deletedAt: z.string().nullable(),
|
|
405
|
+
sources: z.array(mediaUsageSourceDetailSchema)
|
|
406
|
+
}).meta({ id: "MediaUsageEntryDetail" });
|
|
407
|
+
const mediaUsageDetailsResponseSchema = z.object({
|
|
408
|
+
items: z.array(mediaUsageEntryDetailSchema),
|
|
409
|
+
nextCursor: z.string().optional(),
|
|
410
|
+
coverage: mediaUsageCoverageSchema
|
|
411
|
+
}).meta({ id: "MediaUsageDetailsResponse" });
|
|
412
|
+
const mediaUsageRepairStatusSchema = z.enum([
|
|
413
|
+
"complete",
|
|
414
|
+
"partial",
|
|
415
|
+
"failed",
|
|
416
|
+
"stale"
|
|
417
|
+
]).meta({ id: "MediaUsageRepairStatus" });
|
|
418
|
+
const mediaUsageRepairCollectionBody = z.object({
|
|
419
|
+
scope: z.literal("collection"),
|
|
420
|
+
collection: z.string().min(1).max(63).regex(slugPattern, "Invalid collection slug")
|
|
421
|
+
}).strict();
|
|
422
|
+
const mediaUsageRepairAllBody = z.object({ scope: z.literal("all") }).strict();
|
|
423
|
+
const mediaUsageRepairBody = z.discriminatedUnion("scope", [mediaUsageRepairCollectionBody, mediaUsageRepairAllBody]).meta({ id: "MediaUsageRepairBody" });
|
|
424
|
+
const mediaUsageRepairCollectionSummarySchema = z.object({
|
|
425
|
+
collection: z.string(),
|
|
426
|
+
status: mediaUsageRepairStatusSchema,
|
|
427
|
+
indexedSourceCount: z.number().int().min(0),
|
|
428
|
+
failedSourceCount: z.number().int().min(0),
|
|
429
|
+
skippedSourceCount: z.number().int().min(0),
|
|
430
|
+
deletedSourceCount: z.number().int().min(0),
|
|
431
|
+
lastErrorCode: z.string().nullable(),
|
|
432
|
+
startedAt: z.string(),
|
|
433
|
+
completedAt: z.string().nullable()
|
|
434
|
+
}).meta({ id: "MediaUsageRepairCollectionSummary" });
|
|
435
|
+
const mediaUsageRepairResponseSchema = z.object({
|
|
436
|
+
status: mediaUsageRepairStatusSchema,
|
|
437
|
+
indexedSourceCount: z.number().int().min(0),
|
|
438
|
+
failedSourceCount: z.number().int().min(0),
|
|
439
|
+
skippedSourceCount: z.number().int().min(0),
|
|
440
|
+
deletedSourceCount: z.number().int().min(0),
|
|
441
|
+
collections: z.array(mediaUsageRepairCollectionSummarySchema)
|
|
442
|
+
}).meta({ id: "MediaUsageRepairResponse" });
|
|
443
|
+
const mediaUsageWorkStateSchema = z.enum([
|
|
444
|
+
"pending",
|
|
445
|
+
"retry",
|
|
446
|
+
"leased",
|
|
447
|
+
"failed"
|
|
448
|
+
]).meta({ id: "MediaUsageWorkState" });
|
|
449
|
+
const mediaUsageWorkListQuery = z.object({
|
|
450
|
+
collection: z.string().min(1).max(63).regex(slugPattern, "Invalid collection slug"),
|
|
451
|
+
state: mediaUsageWorkStateSchema.optional(),
|
|
452
|
+
cursor: z.string().min(1).max(2048).optional().meta({ description: "Opaque work-page cursor" }),
|
|
453
|
+
limit: z.coerce.number().int().min(1).max(100).optional().default(50).meta({ description: "Maximum number of work items to return (1-100, default 50)" })
|
|
454
|
+
});
|
|
455
|
+
const mediaUsageWorkItemSchema = z.object({
|
|
456
|
+
collectionId: z.string(),
|
|
457
|
+
collectionSlug: z.string(),
|
|
458
|
+
contentId: z.string(),
|
|
459
|
+
state: mediaUsageWorkStateSchema,
|
|
460
|
+
attemptCount: z.number().int().min(0),
|
|
461
|
+
nextAttemptAt: z.string(),
|
|
462
|
+
leaseExpiresAt: z.string().nullable(),
|
|
463
|
+
lastAttemptedAt: z.string().nullable(),
|
|
464
|
+
lastErrorCode: z.string().nullable(),
|
|
465
|
+
updatedAt: z.string()
|
|
466
|
+
}).meta({ id: "MediaUsageWorkItem" });
|
|
467
|
+
const mediaUsageWorkListResponseSchema = z.object({
|
|
468
|
+
items: z.array(mediaUsageWorkItemSchema),
|
|
469
|
+
nextCursor: z.string().optional()
|
|
470
|
+
}).meta({ id: "MediaUsageWorkListResponse" });
|
|
471
|
+
const boundedOpaqueMediaUsageId = z.string().min(1).max(2048);
|
|
472
|
+
const mediaUsageWorkRetryBody = z.object({
|
|
473
|
+
collectionId: boundedOpaqueMediaUsageId.meta({ description: "Current immutable collection identity" }),
|
|
474
|
+
contentId: boundedOpaqueMediaUsageId.meta({ description: "Content entry identity, including a deleted entry" })
|
|
475
|
+
}).strict().meta({ id: "MediaUsageWorkRetryBody" });
|
|
476
|
+
const mediaUsageWorkRetryResponseSchema = z.object({
|
|
477
|
+
changed: z.boolean(),
|
|
478
|
+
item: mediaUsageWorkItemSchema
|
|
479
|
+
}).meta({ id: "MediaUsageWorkRetryResponse" });
|
|
480
|
+
const mediaUsageWorkRetryConflictSchema = z.object({
|
|
481
|
+
success: z.literal(false),
|
|
482
|
+
error: z.discriminatedUnion("code", [z.object({
|
|
483
|
+
code: z.literal("WORK_LEASE_ACTIVE"),
|
|
484
|
+
message: z.string(),
|
|
485
|
+
details: z.object({ leaseExpiresAt: z.string() })
|
|
486
|
+
}), z.object({
|
|
487
|
+
code: z.literal("WORK_CHANGED"),
|
|
488
|
+
message: z.string()
|
|
489
|
+
})])
|
|
490
|
+
});
|
|
491
|
+
const mediaUsageActivationStateSchema = z.enum([
|
|
492
|
+
"expanded",
|
|
493
|
+
"activating",
|
|
494
|
+
"active"
|
|
495
|
+
]).meta({ id: "MediaUsageActivationState" });
|
|
496
|
+
const mediaUsageActivationStatusSchema = z.object({
|
|
497
|
+
state: mediaUsageActivationStateSchema,
|
|
498
|
+
collectionCursor: z.string().nullable(),
|
|
499
|
+
attemptCount: z.number().int().min(0),
|
|
500
|
+
drainConfirmedAt: z.string().nullable(),
|
|
501
|
+
lastAttemptedAt: z.string().nullable(),
|
|
502
|
+
lastErrorCode: z.literal("MEDIA_USAGE_ACTIVATION_FAILED").nullable(),
|
|
503
|
+
leaseExpiresAt: z.string().nullable(),
|
|
504
|
+
activatedAt: z.string().nullable(),
|
|
505
|
+
updatedAt: z.string()
|
|
506
|
+
}).meta({ id: "MediaUsageActivationStatus" });
|
|
507
|
+
const mediaUsageActivationAdvanceBody = z.object({ writersDrained: z.literal(true) }).strict().meta({ id: "MediaUsageActivationAdvanceBody" });
|
|
508
|
+
const mediaUsageActivationAdvanceResponseSchema = z.object({
|
|
509
|
+
outcome: z.enum(["activating", "active"]),
|
|
510
|
+
processedCollections: z.number().int().min(0).max(1),
|
|
511
|
+
activation: mediaUsageActivationStatusSchema
|
|
512
|
+
}).meta({ id: "MediaUsageActivationAdvanceResponse" });
|
|
513
|
+
const mediaUsageProgressAdvanceResponseSchema = z.object({
|
|
514
|
+
activation: mediaUsageActivationStatusSchema,
|
|
515
|
+
progress: mediaUsageProgressSchema.nullable(),
|
|
516
|
+
nextRequestInMs: z.union([
|
|
517
|
+
z.literal(0),
|
|
518
|
+
z.literal(3e4),
|
|
519
|
+
z.null()
|
|
520
|
+
])
|
|
521
|
+
}).meta({ id: "MediaUsageProgressAdvanceResponse" });
|
|
522
|
+
const mediaUsageActivationConflictSchema = z.object({
|
|
523
|
+
success: z.literal(false),
|
|
524
|
+
error: z.discriminatedUnion("code", [
|
|
525
|
+
z.object({
|
|
526
|
+
code: z.literal("MEDIA_USAGE_ACTIVATION_BUSY"),
|
|
527
|
+
message: z.string(),
|
|
528
|
+
details: z.object({ leaseExpiresAt: z.string() })
|
|
529
|
+
}),
|
|
530
|
+
z.object({
|
|
531
|
+
code: z.literal("MEDIA_USAGE_ACTIVATION_CONFLICT"),
|
|
532
|
+
message: z.string()
|
|
533
|
+
}),
|
|
534
|
+
z.object({
|
|
535
|
+
code: z.literal("MEDIA_USAGE_ACTIVATION_VERSION_MISMATCH"),
|
|
536
|
+
message: z.string()
|
|
537
|
+
})
|
|
538
|
+
])
|
|
539
|
+
});
|
|
540
|
+
const mediaUsageCollectionDeletionStateSchema = z.enum([
|
|
541
|
+
"pending",
|
|
542
|
+
"retry",
|
|
543
|
+
"leased",
|
|
544
|
+
"failed"
|
|
545
|
+
]).meta({ id: "MediaUsageCollectionDeletionState" });
|
|
546
|
+
const mediaUsageCollectionDeletionPhaseSchema = z.enum([
|
|
547
|
+
"fence",
|
|
548
|
+
"registry",
|
|
549
|
+
"table",
|
|
550
|
+
"work",
|
|
551
|
+
"sources",
|
|
552
|
+
"status",
|
|
553
|
+
"finalize"
|
|
554
|
+
]).meta({ id: "MediaUsageCollectionDeletionPhase" });
|
|
555
|
+
const mediaUsageCollectionDeletionListQuery = z.object({
|
|
556
|
+
state: mediaUsageCollectionDeletionStateSchema.optional().default("failed"),
|
|
557
|
+
cursor: z.string().min(1).max(2048).optional(),
|
|
558
|
+
limit: z.coerce.number().int().min(1).max(100).optional().default(50)
|
|
559
|
+
}).meta({ id: "MediaUsageCollectionDeletionListQuery" });
|
|
560
|
+
const mediaUsageCollectionDeletionItemSchema = z.object({
|
|
561
|
+
collectionId: z.string(),
|
|
562
|
+
collectionSlug: z.string(),
|
|
563
|
+
state: mediaUsageCollectionDeletionStateSchema,
|
|
564
|
+
phase: mediaUsageCollectionDeletionPhaseSchema,
|
|
565
|
+
attemptCount: z.number().int().min(0),
|
|
566
|
+
nextAttemptAt: z.string(),
|
|
567
|
+
leaseExpiresAt: z.string().nullable(),
|
|
568
|
+
lastErrorCode: z.string().nullable(),
|
|
569
|
+
updatedAt: z.string()
|
|
570
|
+
}).meta({ id: "MediaUsageCollectionDeletionItem" });
|
|
571
|
+
const mediaUsageCollectionDeletionListResponseSchema = z.object({
|
|
572
|
+
items: z.array(mediaUsageCollectionDeletionItemSchema),
|
|
573
|
+
nextCursor: z.string().optional()
|
|
574
|
+
}).meta({ id: "MediaUsageCollectionDeletionListResponse" });
|
|
575
|
+
const mediaUsageCollectionDeletionRetryBody = z.object({ collectionId: boundedOpaqueMediaUsageId }).strict().meta({ id: "MediaUsageCollectionDeletionRetryBody" });
|
|
576
|
+
const mediaUsageCollectionDeletionRetryResponseSchema = z.object({
|
|
577
|
+
changed: z.boolean(),
|
|
578
|
+
item: mediaUsageCollectionDeletionItemSchema
|
|
579
|
+
}).meta({ id: "MediaUsageCollectionDeletionRetryResponse" });
|
|
580
|
+
|
|
581
|
+
//#endregion
|
|
582
|
+
//#region src/api/schemas/media.ts
|
|
583
|
+
/**
|
|
584
|
+
* Accepts a comma-separated string (from URL query params) or an array of
|
|
585
|
+
* strings (from JSON body or programmatic use) and normalises to string[].
|
|
586
|
+
*/
|
|
587
|
+
const mimeTypeFilter = z.union([z.string(), z.array(z.string())]).transform((v) => {
|
|
588
|
+
return (Array.isArray(v) ? v : v.split(",")).map((s) => s.trim()).filter((s) => s.length > 0);
|
|
589
|
+
}).optional();
|
|
590
|
+
const mediaListQuery = cursorPaginationQuery.extend({
|
|
591
|
+
page: z.coerce.number().int().min(1).max(Number.MAX_SAFE_INTEGER).optional(),
|
|
592
|
+
mimeType: mimeTypeFilter,
|
|
593
|
+
folderId: z.union([z.literal("unfiled"), z.string().min(1).max(64)]).optional().meta({ description: "Filter by a media folder ID. Use `unfiled` for the Main library; omit for all media." }),
|
|
594
|
+
q: z.string().trim().min(1).max(200).optional(),
|
|
595
|
+
includeUsage: z.literal("1").optional().meta({ description: "Include a coverage-aware usage summary on each media item" })
|
|
596
|
+
}).refine(({ cursor, page }) => cursor === void 0 || page === void 0, {
|
|
597
|
+
message: "cursor and page cannot be used together",
|
|
598
|
+
path: ["page"]
|
|
599
|
+
}).meta({ id: "MediaListQuery" });
|
|
600
|
+
const mediaGetQuery = z.object({ includeUsage: z.literal("1").optional().meta({ description: "Include a coverage-aware usage summary on the media item" }) }).meta({ id: "MediaGetQuery" });
|
|
601
|
+
const mediaUpdateBody = z.object({
|
|
602
|
+
alt: z.string().optional(),
|
|
603
|
+
caption: z.string().optional(),
|
|
604
|
+
width: z.number().int().positive().optional(),
|
|
605
|
+
height: z.number().int().positive().optional(),
|
|
606
|
+
folderId: z.union([z.literal("unfiled"), z.string().min(1).max(64)]).nullable().optional().transform((value) => value === "unfiled" ? null : value).meta({ description: "Assign a media folder ID, or use null or `unfiled` to return the item to the Main library." }),
|
|
607
|
+
focalX: z.number().min(0).max(1).nullable().optional(),
|
|
608
|
+
focalY: z.number().min(0).max(1).nullable().optional()
|
|
609
|
+
}).superRefine((value, context) => {
|
|
610
|
+
if (!isValidFocalPointUpdate(value)) context.addIssue({
|
|
611
|
+
code: "custom",
|
|
612
|
+
message: "focalX and focalY must both be numbers or both be null",
|
|
613
|
+
path: ["focalX"]
|
|
614
|
+
});
|
|
615
|
+
}).meta({ id: "MediaUpdateBody" });
|
|
616
|
+
const mediaFolderIdSchema = z.string().min(1).max(64);
|
|
617
|
+
const mediaFolderListQuery = cursorPaginationQuery.extend({ q: z.string().trim().min(1).max(200).optional() }).meta({ id: "MediaFolderListQuery" });
|
|
618
|
+
const mediaFolderNameSchema = z.string().refine((value) => {
|
|
619
|
+
const length = value.trim().length;
|
|
620
|
+
return length >= 1 && length <= 200;
|
|
621
|
+
}, { message: "Folder name must be between 1 and 200 characters" });
|
|
622
|
+
const mediaFolderBody = z.object({ name: mediaFolderNameSchema }).meta({ id: "MediaFolderBody" });
|
|
623
|
+
/** Default maximum allowed file upload size (50 MB). */
|
|
624
|
+
const DEFAULT_MAX_UPLOAD_SIZE = 50 * 1024 * 1024;
|
|
625
|
+
function formatFileSize(bytes) {
|
|
626
|
+
if (bytes < 1024) return `${bytes}B`;
|
|
627
|
+
if (bytes < 1024 * 1024) return `${Math.floor(bytes / 1024)}KB`;
|
|
628
|
+
return `${Math.floor(bytes / 1024 / 1024)}MB`;
|
|
629
|
+
}
|
|
630
|
+
const CONTENT_TYPE_RE = /^[a-z0-9][a-z0-9!#$&^_+\-.]*\/[a-z0-9!#$&^_+\-.]+(\s*;[^\r\n]*)?$/i;
|
|
631
|
+
function mediaUploadUrlBody(maxSize) {
|
|
632
|
+
if (!Number.isFinite(maxSize) || maxSize <= 0) throw new Error(`EmDash: maxUploadSize must be a positive finite number, got ${maxSize}`);
|
|
633
|
+
return z.object({
|
|
634
|
+
filename: z.string().min(1, "filename is required"),
|
|
635
|
+
contentType: z.string().min(1, "contentType is required").regex(CONTENT_TYPE_RE, "Invalid content type"),
|
|
636
|
+
size: z.number().int().nonnegative().max(maxSize, `File size must not exceed ${formatFileSize(maxSize)}`),
|
|
637
|
+
contentHash: z.string().optional(),
|
|
638
|
+
fieldId: z.string().optional(),
|
|
639
|
+
deduplicate: z.boolean().optional(),
|
|
640
|
+
ensureUniqueFilename: z.boolean().optional(),
|
|
641
|
+
folderId: mediaFolderIdSchema.nullable().optional()
|
|
642
|
+
}).meta({ id: "MediaUploadUrlBody" });
|
|
643
|
+
}
|
|
644
|
+
const mediaUploadDeduplicateForm = z.enum(["true", "false"]).default("true").transform((value) => value === "true");
|
|
645
|
+
const mediaUploadEnsureUniqueFilenameForm = z.enum(["true", "false"]).default("false").transform((value) => value === "true");
|
|
646
|
+
const mediaReplaceMetadataForm = z.object({
|
|
647
|
+
width: z.coerce.number().int().positive().max(Number.MAX_SAFE_INTEGER),
|
|
648
|
+
height: z.coerce.number().int().positive().max(Number.MAX_SAFE_INTEGER)
|
|
649
|
+
});
|
|
650
|
+
const binaryFileSchema = z.string().meta({ format: "binary" });
|
|
651
|
+
const mediaDirectUploadBody = z.object({
|
|
652
|
+
file: binaryFileSchema,
|
|
653
|
+
width: z.string().optional(),
|
|
654
|
+
height: z.string().optional(),
|
|
655
|
+
thumbnail: binaryFileSchema.optional(),
|
|
656
|
+
fieldId: z.string().optional(),
|
|
657
|
+
deduplicate: z.enum(["true", "false"]).optional(),
|
|
658
|
+
ensureUniqueFilename: z.enum(["true", "false"]).optional(),
|
|
659
|
+
folderId: z.union([mediaFolderIdSchema, z.literal("unfiled")]).optional()
|
|
660
|
+
}).meta({ id: "MediaDirectUploadBody" });
|
|
661
|
+
const mediaReplaceBody = z.object({
|
|
662
|
+
file: binaryFileSchema,
|
|
663
|
+
width: z.number().int().positive(),
|
|
664
|
+
height: z.number().int().positive()
|
|
665
|
+
}).meta({ id: "MediaReplaceBody" });
|
|
666
|
+
const mediaConfirmBody = z.object({
|
|
667
|
+
size: z.number().int().nonnegative().optional(),
|
|
668
|
+
width: z.number().int().positive().optional(),
|
|
669
|
+
height: z.number().int().positive().optional()
|
|
670
|
+
}).meta({ id: "MediaConfirmBody" });
|
|
671
|
+
const mediaProviderListQuery = cursorPaginationQuery.extend({
|
|
672
|
+
query: z.string().optional(),
|
|
673
|
+
mimeType: mimeTypeFilter
|
|
674
|
+
}).meta({ id: "MediaProviderListQuery" });
|
|
675
|
+
const mediaStatusSchema = z.enum([
|
|
676
|
+
"pending",
|
|
677
|
+
"ready",
|
|
678
|
+
"failed"
|
|
679
|
+
]);
|
|
680
|
+
const mediaItemSchema = z.object({
|
|
681
|
+
id: z.string(),
|
|
682
|
+
filename: z.string(),
|
|
683
|
+
mimeType: z.string(),
|
|
684
|
+
size: z.number().nullable(),
|
|
685
|
+
width: z.number().nullable(),
|
|
686
|
+
height: z.number().nullable(),
|
|
687
|
+
focalX: z.number().nullable(),
|
|
688
|
+
focalY: z.number().nullable(),
|
|
689
|
+
alt: z.string().nullable(),
|
|
690
|
+
caption: z.string().nullable(),
|
|
691
|
+
storageKey: z.string(),
|
|
692
|
+
status: mediaStatusSchema,
|
|
693
|
+
contentHash: z.string().nullable(),
|
|
694
|
+
blurhash: z.string().nullable(),
|
|
695
|
+
dominantColor: z.string().nullable(),
|
|
696
|
+
createdAt: z.string(),
|
|
697
|
+
authorId: z.string().nullable(),
|
|
698
|
+
folderId: z.string().nullable()
|
|
699
|
+
}).meta({ id: "MediaItem" });
|
|
700
|
+
const mediaFolderSchema = z.object({
|
|
701
|
+
id: z.string(),
|
|
702
|
+
name: z.string()
|
|
703
|
+
}).meta({ id: "MediaFolder" });
|
|
704
|
+
const mediaFolderResponseSchema = z.object({ item: mediaFolderSchema }).meta({ id: "MediaFolderResponse" });
|
|
705
|
+
const mediaFolderListResponseSchema = z.object({
|
|
706
|
+
items: z.array(mediaFolderSchema),
|
|
707
|
+
nextCursor: z.string().optional()
|
|
708
|
+
}).meta({ id: "MediaFolderListResponse" });
|
|
709
|
+
const mediaResponseSchema = z.object({ item: mediaItemSchema }).meta({ id: "MediaResponse" });
|
|
710
|
+
const mediaReadItemSchema = mediaItemSchema.extend({ usage: mediaUsageSummarySchema.optional() }).meta({ id: "MediaReadItem" });
|
|
711
|
+
const mediaReadResponseSchema = z.object({ item: mediaReadItemSchema }).meta({ id: "MediaReadResponse" });
|
|
712
|
+
const mediaListReadItemSchema = mediaReadItemSchema.extend({ url: z.string() }).meta({ id: "MediaListReadItem" });
|
|
713
|
+
const mediaListReadResponseSchema = z.object({
|
|
714
|
+
items: z.array(mediaListReadItemSchema),
|
|
715
|
+
nextCursor: z.string().optional(),
|
|
716
|
+
totalCount: z.number().int().nonnegative().optional()
|
|
717
|
+
}).meta({ id: "MediaListReadResponse" });
|
|
718
|
+
const mediaListResponseSchema = z.object({
|
|
719
|
+
items: z.array(mediaItemSchema),
|
|
720
|
+
nextCursor: z.string().optional(),
|
|
721
|
+
totalCount: z.number().int().nonnegative().optional()
|
|
722
|
+
}).meta({ id: "MediaListResponse" });
|
|
723
|
+
const mediaUploadUrlResponseSchema = z.object({
|
|
724
|
+
uploadUrl: z.string(),
|
|
725
|
+
method: z.literal("PUT"),
|
|
726
|
+
headers: z.record(z.string(), z.string()),
|
|
727
|
+
mediaId: z.string(),
|
|
728
|
+
storageKey: z.string(),
|
|
729
|
+
expiresAt: z.string()
|
|
730
|
+
}).meta({ id: "MediaUploadUrlResponse" });
|
|
731
|
+
const mediaExistingResponseSchema = z.object({
|
|
732
|
+
existing: z.literal(true),
|
|
733
|
+
mediaId: z.string(),
|
|
734
|
+
storageKey: z.string(),
|
|
735
|
+
url: z.string()
|
|
736
|
+
}).meta({ id: "MediaExistingResponse" });
|
|
737
|
+
const mediaConfirmResponseSchema = z.object({ item: mediaItemSchema.extend({ url: z.string() }) }).meta({ id: "MediaConfirmResponse" });
|
|
738
|
+
const mediaUploadResponseSchema = z.object({
|
|
739
|
+
item: mediaItemSchema.extend({ url: z.string() }),
|
|
740
|
+
deduplicated: z.literal(true).optional()
|
|
741
|
+
}).meta({ id: "MediaUploadResponse" });
|
|
742
|
+
const mediaReplaceResponseSchema = z.object({ item: mediaItemSchema.extend({ url: z.string() }) }).meta({ id: "MediaReplaceResponse" });
|
|
743
|
+
const mediaStreamUploadResponseSchema = z.object({
|
|
744
|
+
uploaded: z.literal(true),
|
|
745
|
+
size: z.number().int().nonnegative()
|
|
746
|
+
}).meta({ id: "MediaStreamUploadResponse" });
|
|
747
|
+
|
|
748
|
+
//#endregion
|
|
749
|
+
//#region src/api/schemas/schema.ts
|
|
750
|
+
const collectionSupportValues = z.enum([
|
|
751
|
+
"drafts",
|
|
752
|
+
"revisions",
|
|
753
|
+
"preview",
|
|
754
|
+
"scheduling",
|
|
755
|
+
"search",
|
|
756
|
+
"seo"
|
|
757
|
+
]);
|
|
758
|
+
const collectionSourcePattern = /^(template:.+|import:.+|manual|discovered|seed)$/;
|
|
759
|
+
const collectionListColumns = z.array(z.string().min(1).max(63).regex(slugPattern, "Invalid field slug format"));
|
|
760
|
+
const collectionAdminInputConfig = z.object({ listColumns: collectionListColumns.max(MAX_COLLECTION_LIST_COLUMNS, `At most ${MAX_COLLECTION_LIST_COLUMNS} list columns are allowed`).optional() });
|
|
761
|
+
const collectionAdminResponseConfig = z.object({ listColumns: collectionListColumns.optional() });
|
|
762
|
+
const fieldTypeValues = z.enum([
|
|
763
|
+
"string",
|
|
764
|
+
"text",
|
|
765
|
+
"url",
|
|
766
|
+
"number",
|
|
767
|
+
"integer",
|
|
768
|
+
"boolean",
|
|
769
|
+
"datetime",
|
|
770
|
+
"select",
|
|
771
|
+
"multiSelect",
|
|
772
|
+
"portableText",
|
|
773
|
+
"image",
|
|
774
|
+
"file",
|
|
775
|
+
"reference",
|
|
776
|
+
"json",
|
|
777
|
+
"slug",
|
|
778
|
+
"repeater"
|
|
779
|
+
]);
|
|
780
|
+
const repeaterSubFieldSchema = z.object({
|
|
781
|
+
slug: z.string().min(1).max(63).regex(slugPattern, "Invalid slug format"),
|
|
782
|
+
type: z.enum([
|
|
783
|
+
"string",
|
|
784
|
+
"text",
|
|
785
|
+
"url",
|
|
786
|
+
"number",
|
|
787
|
+
"integer",
|
|
788
|
+
"boolean",
|
|
789
|
+
"datetime",
|
|
790
|
+
"select",
|
|
791
|
+
"image"
|
|
792
|
+
]),
|
|
793
|
+
label: z.string().min(1),
|
|
794
|
+
required: z.boolean().optional(),
|
|
795
|
+
options: z.array(z.string()).optional()
|
|
796
|
+
});
|
|
797
|
+
const urlPatternValue = z.string().superRefine((pattern, ctx) => {
|
|
798
|
+
try {
|
|
799
|
+
compileUrlPattern(pattern);
|
|
800
|
+
} catch {
|
|
801
|
+
ctx.addIssue({
|
|
802
|
+
code: "custom",
|
|
803
|
+
message: "Invalid URL pattern"
|
|
804
|
+
});
|
|
805
|
+
}
|
|
806
|
+
});
|
|
807
|
+
const fieldValidation = z.object({
|
|
808
|
+
required: z.boolean().optional(),
|
|
809
|
+
min: z.number().optional(),
|
|
810
|
+
max: z.number().optional(),
|
|
811
|
+
minLength: z.number().int().min(0).optional(),
|
|
812
|
+
maxLength: z.number().int().min(0).optional(),
|
|
813
|
+
pattern: z.string().optional(),
|
|
814
|
+
options: z.array(z.string()).optional(),
|
|
815
|
+
subFields: z.array(repeaterSubFieldSchema).min(1).optional(),
|
|
816
|
+
minItems: z.number().int().min(0).optional(),
|
|
817
|
+
maxItems: z.number().int().min(1).optional(),
|
|
818
|
+
allowedMimeTypes: z.array(z.string().regex(/^[a-z0-9][a-z0-9!#$&^_+\-.]*\/[a-z0-9!#$&^_+\-.]*$/i, "Invalid MIME type")).min(1, "allowedMimeTypes must not be empty — omit the field to allow all types").max(64, "allowedMimeTypes may contain at most 64 entries").optional()
|
|
819
|
+
}).superRefine((validation, ctx) => {
|
|
820
|
+
for (const [minimum, maximum] of [
|
|
821
|
+
["min", "max"],
|
|
822
|
+
["minLength", "maxLength"],
|
|
823
|
+
["minItems", "maxItems"]
|
|
824
|
+
]) {
|
|
825
|
+
const minimumValue = validation[minimum];
|
|
826
|
+
const maximumValue = validation[maximum];
|
|
827
|
+
if (minimumValue !== void 0 && maximumValue !== void 0 && minimumValue > maximumValue) ctx.addIssue({
|
|
828
|
+
code: "custom",
|
|
829
|
+
path: [maximum],
|
|
830
|
+
message: `${maximum} must be greater than or equal to ${minimum}`
|
|
831
|
+
});
|
|
832
|
+
}
|
|
833
|
+
if (validation.pattern !== void 0) try {
|
|
834
|
+
RegExp(validation.pattern);
|
|
835
|
+
} catch {
|
|
836
|
+
ctx.addIssue({
|
|
837
|
+
code: "custom",
|
|
838
|
+
path: ["pattern"],
|
|
839
|
+
message: "Invalid validation pattern"
|
|
840
|
+
});
|
|
841
|
+
}
|
|
842
|
+
}).optional();
|
|
843
|
+
const fieldWidgetOptions = z.record(z.string(), z.unknown()).optional();
|
|
844
|
+
/** Admin sidebar folder label; an empty string clears it like `null`. */
|
|
845
|
+
const navGroupValue = z.string().trim().max(MAX_COLLECTION_GROUP_LENGTH);
|
|
846
|
+
const createCollectionBody = z.object({
|
|
847
|
+
slug: z.string().min(1).max(63).regex(slugPattern, "Invalid slug format"),
|
|
848
|
+
label: z.string().min(1),
|
|
849
|
+
labelSingular: z.string().optional(),
|
|
850
|
+
description: z.string().optional(),
|
|
851
|
+
icon: z.string().optional(),
|
|
852
|
+
admin: collectionAdminInputConfig.optional(),
|
|
853
|
+
supports: z.array(collectionSupportValues).optional(),
|
|
854
|
+
source: z.string().regex(collectionSourcePattern).optional(),
|
|
855
|
+
urlPattern: urlPatternValue.optional(),
|
|
856
|
+
routable: z.boolean().optional(),
|
|
857
|
+
hasSeo: z.boolean().optional(),
|
|
858
|
+
hidden: z.boolean().optional(),
|
|
859
|
+
sortOrder: z.number().int().nullish(),
|
|
860
|
+
editLocking: z.boolean().optional(),
|
|
861
|
+
group: navGroupValue.nullish()
|
|
862
|
+
}).meta({ id: "CreateCollectionBody" });
|
|
863
|
+
const updateCollectionBody = z.object({
|
|
864
|
+
label: z.string().min(1).optional(),
|
|
865
|
+
labelSingular: z.string().optional(),
|
|
866
|
+
description: z.string().optional(),
|
|
867
|
+
icon: z.string().optional(),
|
|
868
|
+
admin: collectionAdminInputConfig.optional(),
|
|
869
|
+
supports: z.array(collectionSupportValues).optional(),
|
|
870
|
+
urlPattern: urlPatternValue.nullish(),
|
|
871
|
+
routable: z.boolean().optional(),
|
|
872
|
+
hasSeo: z.boolean().optional(),
|
|
873
|
+
hidden: z.boolean().optional(),
|
|
874
|
+
sortOrder: z.number().int().nullish(),
|
|
875
|
+
group: navGroupValue.nullish(),
|
|
876
|
+
commentsEnabled: z.boolean().optional(),
|
|
877
|
+
commentsModeration: z.enum([
|
|
878
|
+
"all",
|
|
879
|
+
"first_time",
|
|
880
|
+
"none"
|
|
881
|
+
]).optional(),
|
|
882
|
+
commentsClosedAfterDays: z.number().int().min(0).optional(),
|
|
883
|
+
commentsAutoApproveUsers: z.boolean().optional(),
|
|
884
|
+
editLocking: z.boolean().optional(),
|
|
885
|
+
titleField: z.string().min(1).max(63).regex(slugPattern, "Invalid field slug format").nullish(),
|
|
886
|
+
dateField: z.string().min(1).max(63).regex(slugPattern, "Invalid field slug format").nullish()
|
|
887
|
+
}).meta({ id: "UpdateCollectionBody" });
|
|
888
|
+
const createFieldBody = z.object({
|
|
889
|
+
slug: z.string().min(1).max(63).regex(slugPattern, "Invalid slug format"),
|
|
890
|
+
label: z.string().min(1),
|
|
891
|
+
type: fieldTypeValues,
|
|
892
|
+
required: z.boolean().optional(),
|
|
893
|
+
unique: z.boolean().optional(),
|
|
894
|
+
defaultValue: z.unknown().optional(),
|
|
895
|
+
validation: fieldValidation.nullable(),
|
|
896
|
+
widget: z.string().optional(),
|
|
897
|
+
options: fieldWidgetOptions,
|
|
898
|
+
sortOrder: z.number().int().min(0).optional(),
|
|
899
|
+
searchable: z.boolean().optional(),
|
|
900
|
+
indexed: z.boolean().optional(),
|
|
901
|
+
translatable: z.boolean().optional()
|
|
902
|
+
}).meta({ id: "CreateFieldBody" });
|
|
903
|
+
const updateFieldBody = z.object({
|
|
904
|
+
label: z.string().min(1).optional(),
|
|
905
|
+
type: fieldTypeValues.optional(),
|
|
906
|
+
required: z.boolean().optional(),
|
|
907
|
+
unique: z.boolean().optional(),
|
|
908
|
+
defaultValue: z.unknown().optional(),
|
|
909
|
+
validation: fieldValidation.nullable(),
|
|
910
|
+
widget: z.string().optional(),
|
|
911
|
+
options: fieldWidgetOptions,
|
|
912
|
+
sortOrder: z.number().int().min(0).optional(),
|
|
913
|
+
searchable: z.boolean().optional(),
|
|
914
|
+
indexed: z.boolean().optional(),
|
|
915
|
+
translatable: z.boolean().optional()
|
|
916
|
+
}).meta({ id: "UpdateFieldBody" });
|
|
917
|
+
const fieldReorderBody = z.object({ fieldSlugs: z.array(z.string().min(1)) }).meta({ id: "FieldReorderBody" });
|
|
918
|
+
const collectionReorderBody = z.object({ slugs: z.array(z.string().min(1)) }).meta({ id: "CollectionReorderBody" });
|
|
919
|
+
const orphanRegisterBody = z.object({
|
|
920
|
+
label: z.string().optional(),
|
|
921
|
+
labelSingular: z.string().optional(),
|
|
922
|
+
description: z.string().optional()
|
|
923
|
+
}).meta({ id: "OrphanRegisterBody" });
|
|
924
|
+
const schemaExportQuery = z.object({ format: z.string().optional() });
|
|
925
|
+
const collectionGetQuery = z.object({ includeFields: z.string().transform((v) => v === "true").optional() });
|
|
926
|
+
const collectionSchema = z.object({
|
|
927
|
+
id: z.string(),
|
|
928
|
+
slug: z.string(),
|
|
929
|
+
label: z.string(),
|
|
930
|
+
labelSingular: z.string().nullable(),
|
|
931
|
+
description: z.string().nullable(),
|
|
932
|
+
icon: z.string().nullable(),
|
|
933
|
+
admin: collectionAdminResponseConfig.optional(),
|
|
934
|
+
supports: z.array(z.string()),
|
|
935
|
+
source: z.string().nullable(),
|
|
936
|
+
urlPattern: z.string().nullable(),
|
|
937
|
+
routable: z.boolean(),
|
|
938
|
+
hasSeo: z.boolean(),
|
|
939
|
+
hidden: z.boolean(),
|
|
940
|
+
sortOrder: z.number().int().nullable(),
|
|
941
|
+
editLocking: z.boolean(),
|
|
942
|
+
group: z.string().nullish(),
|
|
943
|
+
createdAt: z.string(),
|
|
944
|
+
updatedAt: z.string(),
|
|
945
|
+
titleField: z.string().nullish(),
|
|
946
|
+
dateField: z.string().nullish()
|
|
947
|
+
}).meta({ id: "Collection" });
|
|
948
|
+
const fieldSchema = z.object({
|
|
949
|
+
id: z.string(),
|
|
950
|
+
collectionId: z.string(),
|
|
951
|
+
slug: z.string(),
|
|
952
|
+
label: z.string(),
|
|
953
|
+
type: fieldTypeValues,
|
|
954
|
+
required: z.boolean(),
|
|
955
|
+
unique: z.boolean(),
|
|
956
|
+
defaultValue: z.unknown().nullable(),
|
|
957
|
+
validation: z.record(z.string(), z.unknown()).nullable(),
|
|
958
|
+
widget: z.string().nullable(),
|
|
959
|
+
options: z.record(z.string(), z.unknown()).nullable(),
|
|
960
|
+
sortOrder: z.number().int(),
|
|
961
|
+
searchable: z.boolean(),
|
|
962
|
+
indexed: z.boolean(),
|
|
963
|
+
translatable: z.boolean(),
|
|
964
|
+
createdAt: z.string(),
|
|
965
|
+
updatedAt: z.string()
|
|
966
|
+
}).meta({ id: "Field" });
|
|
967
|
+
const collectionResponseSchema = z.object({ item: collectionSchema }).meta({ id: "CollectionResponse" });
|
|
968
|
+
const collectionWithFieldsResponseSchema = z.object({ item: collectionSchema.extend({ fields: z.array(fieldSchema) }) }).meta({ id: "CollectionWithFieldsResponse" });
|
|
969
|
+
const collectionListResponseSchema = z.object({ items: z.array(collectionSchema) }).meta({ id: "CollectionListResponse" });
|
|
970
|
+
const fieldResponseSchema = z.object({ item: fieldSchema }).meta({ id: "FieldResponse" });
|
|
971
|
+
const fieldListResponseSchema = z.object({ items: z.array(fieldSchema) }).meta({ id: "FieldListResponse" });
|
|
972
|
+
const orphanedTableSchema = z.object({
|
|
973
|
+
slug: z.string(),
|
|
974
|
+
tableName: z.string(),
|
|
975
|
+
rowCount: z.number().int()
|
|
976
|
+
}).meta({ id: "OrphanedTable" });
|
|
977
|
+
const orphanedTableListResponseSchema = z.object({ items: z.array(orphanedTableSchema) }).meta({ id: "OrphanedTableListResponse" });
|
|
978
|
+
|
|
979
|
+
//#endregion
|
|
980
|
+
//#region src/utils/url.ts
|
|
981
|
+
/**
|
|
982
|
+
* URL scheme validation utilities
|
|
983
|
+
*
|
|
984
|
+
* Prevents XSS via dangerous URL schemes (javascript:, data:, vbscript:, etc.)
|
|
985
|
+
* by allowlisting known-safe schemes before rendering into href attributes.
|
|
986
|
+
*/
|
|
987
|
+
/**
|
|
988
|
+
* Matches URLs that are safe to render in href attributes.
|
|
989
|
+
*
|
|
990
|
+
* Allowed:
|
|
991
|
+
* - http:// and https://
|
|
992
|
+
* - mailto: and tel:
|
|
993
|
+
* - Relative paths (starting with /)
|
|
994
|
+
* - Fragment links (starting with #)
|
|
995
|
+
* - Protocol-relative URLs are NOT allowed (starting with //) as they can
|
|
996
|
+
* redirect to attacker-controlled hosts.
|
|
997
|
+
*/
|
|
998
|
+
const SAFE_URL_SCHEME_RE = /^(https?:|mailto:|tel:|\/(?!\/)|#)/i;
|
|
999
|
+
/**
|
|
1000
|
+
* Returns the URL unchanged if it uses a safe scheme, otherwise returns "#".
|
|
1001
|
+
*
|
|
1002
|
+
* Use this at the render layer as the primary defense against XSS via
|
|
1003
|
+
* dangerous URL schemes like `javascript:`, `data:`, or `vbscript:`.
|
|
1004
|
+
*
|
|
1005
|
+
* @example
|
|
1006
|
+
* ```ts
|
|
1007
|
+
* sanitizeHref("https://example.com") // "https://example.com"
|
|
1008
|
+
* sanitizeHref("/about") // "/about"
|
|
1009
|
+
* sanitizeHref("#section") // "#section"
|
|
1010
|
+
* sanitizeHref("mailto:a@b.com") // "mailto:a@b.com"
|
|
1011
|
+
* sanitizeHref("javascript:alert(1)") // "#"
|
|
1012
|
+
* sanitizeHref("data:text/html,<script>") // "#"
|
|
1013
|
+
* sanitizeHref("") // "#"
|
|
1014
|
+
* ```
|
|
1015
|
+
*/
|
|
1016
|
+
function sanitizeHref(url) {
|
|
1017
|
+
if (!url) return "#";
|
|
1018
|
+
return SAFE_URL_SCHEME_RE.test(url) ? url : "#";
|
|
1019
|
+
}
|
|
1020
|
+
/**
|
|
1021
|
+
* Returns true if the URL uses a safe scheme for rendering in href attributes.
|
|
1022
|
+
*/
|
|
1023
|
+
function isSafeHref(url) {
|
|
1024
|
+
return SAFE_URL_SCHEME_RE.test(url);
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
//#endregion
|
|
1028
|
+
//#region src/api/schemas/menus.ts
|
|
1029
|
+
/**
|
|
1030
|
+
* Allowed menu item types. `custom` uses `customUrl`; the others resolve a URL
|
|
1031
|
+
* from `referenceCollection` + `referenceId` (a translation_group id).
|
|
1032
|
+
*/
|
|
1033
|
+
const menuItemTypeEnum = z.enum([
|
|
1034
|
+
"custom",
|
|
1035
|
+
"page",
|
|
1036
|
+
"post",
|
|
1037
|
+
"taxonomy",
|
|
1038
|
+
"collection"
|
|
1039
|
+
]);
|
|
1040
|
+
const safeHref = z.string().trim().refine(isSafeHref, "URL must use http, https, mailto, tel, a relative path, or a fragment identifier");
|
|
1041
|
+
const createMenuBody = z.object({
|
|
1042
|
+
name: z.string().min(1),
|
|
1043
|
+
label: z.string().min(1),
|
|
1044
|
+
locale: localeCode.optional(),
|
|
1045
|
+
translationOf: z.string().min(1).optional()
|
|
1046
|
+
}).strict().meta({ id: "CreateMenuBody" });
|
|
1047
|
+
const updateMenuBody = z.object({ label: z.string().min(1).optional() }).strict().meta({ id: "UpdateMenuBody" });
|
|
1048
|
+
const createMenuItemBody = z.object({
|
|
1049
|
+
type: menuItemTypeEnum,
|
|
1050
|
+
label: z.string().min(1),
|
|
1051
|
+
referenceCollection: z.string().optional(),
|
|
1052
|
+
referenceId: z.string().optional(),
|
|
1053
|
+
customUrl: safeHref.optional(),
|
|
1054
|
+
target: z.string().optional(),
|
|
1055
|
+
titleAttr: z.string().optional(),
|
|
1056
|
+
cssClasses: z.string().optional(),
|
|
1057
|
+
parentId: z.string().optional(),
|
|
1058
|
+
sortOrder: z.number().int().min(0).optional()
|
|
1059
|
+
}).strict().meta({ id: "CreateMenuItemBody" });
|
|
1060
|
+
const updateMenuItemBody = z.object({
|
|
1061
|
+
label: z.string().min(1).optional(),
|
|
1062
|
+
customUrl: safeHref.optional(),
|
|
1063
|
+
target: z.string().optional(),
|
|
1064
|
+
titleAttr: z.string().optional(),
|
|
1065
|
+
cssClasses: z.string().optional(),
|
|
1066
|
+
parentId: z.string().nullish(),
|
|
1067
|
+
sortOrder: z.number().int().min(0).optional()
|
|
1068
|
+
}).strict().meta({ id: "UpdateMenuItemBody" });
|
|
1069
|
+
const reorderMenuItemsBody = z.object({ items: z.array(z.object({
|
|
1070
|
+
id: z.string().min(1),
|
|
1071
|
+
parentId: z.string().nullable(),
|
|
1072
|
+
sortOrder: z.number().int().min(0)
|
|
1073
|
+
})) }).meta({ id: "ReorderMenuItemsBody" });
|
|
1074
|
+
const menuSchema = z.object({
|
|
1075
|
+
id: z.string(),
|
|
1076
|
+
name: z.string(),
|
|
1077
|
+
label: z.string(),
|
|
1078
|
+
createdAt: z.string(),
|
|
1079
|
+
updatedAt: z.string(),
|
|
1080
|
+
locale: z.string(),
|
|
1081
|
+
translationGroup: z.string().nullable()
|
|
1082
|
+
}).meta({ id: "Menu" });
|
|
1083
|
+
const menuItemSchema = z.object({
|
|
1084
|
+
id: z.string(),
|
|
1085
|
+
menuId: z.string(),
|
|
1086
|
+
parentId: z.string().nullable(),
|
|
1087
|
+
sortOrder: z.number().int(),
|
|
1088
|
+
type: z.string(),
|
|
1089
|
+
referenceCollection: z.string().nullable(),
|
|
1090
|
+
referenceId: z.string().nullable(),
|
|
1091
|
+
customUrl: z.string().nullable(),
|
|
1092
|
+
label: z.string(),
|
|
1093
|
+
titleAttr: z.string().nullable(),
|
|
1094
|
+
target: z.string().nullable(),
|
|
1095
|
+
cssClasses: z.string().nullable(),
|
|
1096
|
+
createdAt: z.string(),
|
|
1097
|
+
locale: z.string(),
|
|
1098
|
+
translationGroup: z.string().nullable()
|
|
1099
|
+
}).meta({ id: "MenuItem" });
|
|
1100
|
+
const menuTranslationsSchema = z.object({
|
|
1101
|
+
translationGroup: z.string().nullable(),
|
|
1102
|
+
translations: z.array(z.object({
|
|
1103
|
+
id: z.string(),
|
|
1104
|
+
name: z.string(),
|
|
1105
|
+
label: z.string(),
|
|
1106
|
+
locale: z.string(),
|
|
1107
|
+
updatedAt: z.string()
|
|
1108
|
+
}))
|
|
1109
|
+
}).meta({ id: "MenuTranslations" });
|
|
1110
|
+
const menuListItemSchema = menuSchema.extend({ itemCount: z.number().int() }).meta({ id: "MenuListItem" });
|
|
1111
|
+
const menuWithItemsSchema = menuSchema.extend({ items: z.array(menuItemSchema) }).meta({ id: "MenuWithItems" });
|
|
1112
|
+
|
|
1113
|
+
//#endregion
|
|
1114
|
+
//#region src/api/schemas/taxonomies.ts
|
|
1115
|
+
const collectionSlug = z.string().min(1).max(63).regex(/^[a-z][a-z0-9_]*$/, "Invalid collection slug format");
|
|
1116
|
+
const createTaxonomyDefBody = z.object({
|
|
1117
|
+
name: z.string().min(1).max(63).regex(/^[a-z][a-z0-9_]*$/, "Name must be lowercase alphanumeric with underscores"),
|
|
1118
|
+
label: z.string().min(1).max(200),
|
|
1119
|
+
labelSingular: z.string().min(1).max(200).optional(),
|
|
1120
|
+
hierarchical: z.boolean().optional(),
|
|
1121
|
+
collections: z.array(collectionSlug).max(100).optional(),
|
|
1122
|
+
locale: localeCode.optional(),
|
|
1123
|
+
translationOf: z.string().min(1).optional()
|
|
1124
|
+
}).meta({ id: "CreateTaxonomyDefBody" });
|
|
1125
|
+
/**
|
|
1126
|
+
* `name` and `locale` are absent on purpose: both identify the definition row
|
|
1127
|
+
* being written, and `.strict()` turns an attempt to change either into a 400
|
|
1128
|
+
* rather than a silently ignored field.
|
|
1129
|
+
*/
|
|
1130
|
+
const updateTaxonomyDefBody = z.object({
|
|
1131
|
+
label: z.string().min(1).max(200).optional(),
|
|
1132
|
+
labelSingular: z.string().min(1).max(200).nullish(),
|
|
1133
|
+
hierarchical: z.boolean().optional(),
|
|
1134
|
+
collections: z.array(collectionSlug).max(100).optional()
|
|
1135
|
+
}).strict().meta({ id: "UpdateTaxonomyDefBody" });
|
|
1136
|
+
const createTermBody = z.object({
|
|
1137
|
+
slug: z.string().min(1).optional().meta({ description: "Term slug. Omit to derive a unique slug from the label." }),
|
|
1138
|
+
label: z.string().min(1),
|
|
1139
|
+
parentId: z.string().nullish(),
|
|
1140
|
+
description: z.string().optional(),
|
|
1141
|
+
locale: localeCode.optional(),
|
|
1142
|
+
translationOf: z.string().min(1).optional()
|
|
1143
|
+
}).meta({ id: "CreateTermBody" });
|
|
1144
|
+
const updateTermBody = z.object({
|
|
1145
|
+
slug: z.string().min(1).optional(),
|
|
1146
|
+
label: z.string().min(1).optional(),
|
|
1147
|
+
parentId: z.string().nullish(),
|
|
1148
|
+
description: z.string().optional()
|
|
1149
|
+
}).meta({ id: "UpdateTermBody" });
|
|
1150
|
+
const reorderTermsBody = z.object({
|
|
1151
|
+
parentId: z.string().min(1).nullish().meta({ description: "Parent term whose children are being ordered (translation_group or row id). Omit or null for the top level, which for a flat taxonomy is every term." }),
|
|
1152
|
+
ids: z.array(z.string().min(1)).max(100).meta({ description: "Terms to move, in the desired order — each a row id or translation_group. May be a subset of the group: the listed terms are permuted within the positions they already occupy and every other member keeps its place. An id outside the group is rejected with REORDER_MISMATCH." })
|
|
1153
|
+
}).strict().meta({ id: "ReorderTermsBody" });
|
|
1154
|
+
const termListQuery = z.object({
|
|
1155
|
+
locale: localeCode.optional(),
|
|
1156
|
+
includeCounts: z.enum(["true", "false"]).transform((v) => v === "true").optional().default(true).meta({ description: "Include each term's visible-usage count. Pass false to skip the aggregate; `count` is then absent from every term." }),
|
|
1157
|
+
resolveFallback: z.enum(["true", "false"]).transform((value) => value === "true").optional().default(false).meta({ description: "Resolve one term per translation group, preferring the requested locale and then the configured default locale." })
|
|
1158
|
+
}).meta({ id: "TermListQuery" });
|
|
1159
|
+
const taxonomyDefSchema = z.object({
|
|
1160
|
+
id: z.string(),
|
|
1161
|
+
name: z.string(),
|
|
1162
|
+
label: z.string(),
|
|
1163
|
+
labelSingular: z.string().optional(),
|
|
1164
|
+
hierarchical: z.boolean(),
|
|
1165
|
+
collections: z.array(z.string()),
|
|
1166
|
+
locale: z.string(),
|
|
1167
|
+
translationGroup: z.string().nullable()
|
|
1168
|
+
}).meta({ id: "TaxonomyDef" });
|
|
1169
|
+
const taxonomyDefTranslationsSchema = z.object({
|
|
1170
|
+
translationGroup: z.string().nullable(),
|
|
1171
|
+
translations: z.array(z.object({
|
|
1172
|
+
id: z.string(),
|
|
1173
|
+
name: z.string(),
|
|
1174
|
+
label: z.string(),
|
|
1175
|
+
locale: z.string()
|
|
1176
|
+
}))
|
|
1177
|
+
}).meta({ id: "TaxonomyDefTranslations" });
|
|
1178
|
+
const taxonomyListResponseSchema = z.object({ taxonomies: z.array(taxonomyDefSchema) }).meta({ id: "TaxonomyListResponse" });
|
|
1179
|
+
const taxonomyResponseSchema = z.object({ taxonomy: taxonomyDefSchema }).meta({ id: "TaxonomyResponse" });
|
|
1180
|
+
const termSchema = z.object({
|
|
1181
|
+
id: z.string(),
|
|
1182
|
+
name: z.string(),
|
|
1183
|
+
slug: z.string(),
|
|
1184
|
+
label: z.string(),
|
|
1185
|
+
parentId: z.string().nullable(),
|
|
1186
|
+
description: z.string().optional(),
|
|
1187
|
+
locale: z.string(),
|
|
1188
|
+
translationGroup: z.string().nullable()
|
|
1189
|
+
}).meta({ id: "Term" });
|
|
1190
|
+
const termTranslationsSchema = z.object({
|
|
1191
|
+
translationGroup: z.string().nullable(),
|
|
1192
|
+
translations: z.array(z.object({
|
|
1193
|
+
id: z.string(),
|
|
1194
|
+
slug: z.string(),
|
|
1195
|
+
label: z.string(),
|
|
1196
|
+
locale: z.string()
|
|
1197
|
+
}))
|
|
1198
|
+
}).meta({ id: "TermTranslations" });
|
|
1199
|
+
const termWithCountSchema = z.object({
|
|
1200
|
+
id: z.string(),
|
|
1201
|
+
name: z.string(),
|
|
1202
|
+
slug: z.string(),
|
|
1203
|
+
label: z.string(),
|
|
1204
|
+
parentId: z.string().nullable(),
|
|
1205
|
+
description: z.string().optional(),
|
|
1206
|
+
count: z.number().int().optional(),
|
|
1207
|
+
children: z.array(z.lazy(() => termWithCountSchema)),
|
|
1208
|
+
locale: z.string(),
|
|
1209
|
+
translationGroup: z.string().nullable()
|
|
1210
|
+
}).meta({ id: "TermWithCount" });
|
|
1211
|
+
const termListResponseSchema = z.object({ terms: z.array(termWithCountSchema) }).meta({ id: "TermListResponse" });
|
|
1212
|
+
const termResponseSchema = z.object({ term: termSchema }).meta({ id: "TermResponse" });
|
|
1213
|
+
const termReorderResponseSchema = z.object({ reordered: z.literal(true) }).meta({ id: "TermReorderResponse" });
|
|
1214
|
+
const termGetResponseSchema = z.object({ term: termSchema.extend({
|
|
1215
|
+
count: z.number().int(),
|
|
1216
|
+
children: z.array(z.object({
|
|
1217
|
+
id: z.string(),
|
|
1218
|
+
slug: z.string(),
|
|
1219
|
+
label: z.string()
|
|
1220
|
+
}))
|
|
1221
|
+
}) }).meta({ id: "TermGetResponse" });
|
|
1222
|
+
|
|
1223
|
+
//#endregion
|
|
1224
|
+
//#region src/api/schemas/sections.ts
|
|
1225
|
+
const sectionSource = z.enum([
|
|
1226
|
+
"theme",
|
|
1227
|
+
"user",
|
|
1228
|
+
"import"
|
|
1229
|
+
]);
|
|
1230
|
+
const sectionsListQuery = z.object({
|
|
1231
|
+
source: sectionSource.optional(),
|
|
1232
|
+
search: z.string().optional(),
|
|
1233
|
+
limit: z.coerce.number().int().min(1).max(100).optional().default(50),
|
|
1234
|
+
cursor: z.string().max(2048).optional()
|
|
1235
|
+
}).meta({ id: "SectionsListQuery" });
|
|
1236
|
+
const createSectionBody = z.object({
|
|
1237
|
+
slug: z.string().min(1),
|
|
1238
|
+
title: z.string().min(1),
|
|
1239
|
+
description: z.string().optional(),
|
|
1240
|
+
keywords: z.array(z.string()).optional(),
|
|
1241
|
+
content: z.array(z.record(z.string(), z.unknown())),
|
|
1242
|
+
previewMediaId: z.string().optional(),
|
|
1243
|
+
source: z.enum(["user", "import"]).optional(),
|
|
1244
|
+
themeId: z.string().optional()
|
|
1245
|
+
}).meta({ id: "CreateSectionBody" });
|
|
1246
|
+
const updateSectionBody = z.object({
|
|
1247
|
+
slug: z.string().min(1).optional(),
|
|
1248
|
+
title: z.string().min(1).optional(),
|
|
1249
|
+
description: z.string().optional(),
|
|
1250
|
+
keywords: z.array(z.string()).optional(),
|
|
1251
|
+
content: z.array(z.record(z.string(), z.unknown())).optional(),
|
|
1252
|
+
previewMediaId: z.string().nullish()
|
|
1253
|
+
}).meta({ id: "UpdateSectionBody" });
|
|
1254
|
+
const sectionSchema = z.object({
|
|
1255
|
+
id: z.string(),
|
|
1256
|
+
slug: z.string(),
|
|
1257
|
+
title: z.string(),
|
|
1258
|
+
description: z.string().nullable(),
|
|
1259
|
+
keywords: z.array(z.string()).nullable(),
|
|
1260
|
+
content: z.array(z.record(z.string(), z.unknown())),
|
|
1261
|
+
previewMediaId: z.string().nullable(),
|
|
1262
|
+
source: z.string(),
|
|
1263
|
+
themeId: z.string().nullable(),
|
|
1264
|
+
createdAt: z.string(),
|
|
1265
|
+
updatedAt: z.string()
|
|
1266
|
+
}).meta({ id: "Section" });
|
|
1267
|
+
const sectionListResponseSchema = z.object({
|
|
1268
|
+
items: z.array(sectionSchema),
|
|
1269
|
+
nextCursor: z.string().optional()
|
|
1270
|
+
}).meta({ id: "SectionListResponse" });
|
|
1271
|
+
|
|
1272
|
+
//#endregion
|
|
1273
|
+
//#region src/api/schemas/settings.ts
|
|
1274
|
+
const mediaReferenceInput = z.object({
|
|
1275
|
+
mediaId: z.string(),
|
|
1276
|
+
alt: z.string().optional()
|
|
1277
|
+
});
|
|
1278
|
+
const socialSettings = z.object({
|
|
1279
|
+
twitter: z.string().optional(),
|
|
1280
|
+
github: z.string().optional(),
|
|
1281
|
+
facebook: z.string().optional(),
|
|
1282
|
+
instagram: z.string().optional(),
|
|
1283
|
+
linkedin: z.string().optional(),
|
|
1284
|
+
youtube: z.string().optional()
|
|
1285
|
+
});
|
|
1286
|
+
const seoSettingsInput = z.object({
|
|
1287
|
+
titleSeparator: z.string().max(10).optional(),
|
|
1288
|
+
defaultOgImage: mediaReferenceInput.optional(),
|
|
1289
|
+
robotsTxt: z.string().max(5e3).optional(),
|
|
1290
|
+
googleVerification: z.string().max(100).optional(),
|
|
1291
|
+
bingVerification: z.string().max(100).optional()
|
|
1292
|
+
});
|
|
1293
|
+
const settingsUpdateBody = z.object({
|
|
1294
|
+
title: z.string().optional(),
|
|
1295
|
+
tagline: z.string().optional(),
|
|
1296
|
+
logo: mediaReferenceInput.optional(),
|
|
1297
|
+
favicon: mediaReferenceInput.optional(),
|
|
1298
|
+
url: z.union([httpUrl, z.literal("")]).optional(),
|
|
1299
|
+
postsPerPage: z.number().int().min(1).max(100).optional(),
|
|
1300
|
+
dateFormat: z.string().optional(),
|
|
1301
|
+
timezone: z.string().optional(),
|
|
1302
|
+
social: socialSettings.optional(),
|
|
1303
|
+
seo: seoSettingsInput.optional()
|
|
1304
|
+
}).meta({ id: "SettingsUpdateBody" });
|
|
1305
|
+
const mediaReferenceResponse = z.object({
|
|
1306
|
+
mediaId: z.string(),
|
|
1307
|
+
alt: z.string().optional(),
|
|
1308
|
+
url: z.string().optional(),
|
|
1309
|
+
contentType: z.string().optional(),
|
|
1310
|
+
width: z.number().int().optional(),
|
|
1311
|
+
height: z.number().int().optional()
|
|
1312
|
+
});
|
|
1313
|
+
const seoSettingsResponse = z.object({
|
|
1314
|
+
titleSeparator: z.string().max(10).optional(),
|
|
1315
|
+
defaultOgImage: mediaReferenceResponse.optional(),
|
|
1316
|
+
robotsTxt: z.string().max(5e3).optional(),
|
|
1317
|
+
googleVerification: z.string().max(100).optional(),
|
|
1318
|
+
bingVerification: z.string().max(100).optional()
|
|
1319
|
+
});
|
|
1320
|
+
const siteSettingsSchema = z.object({
|
|
1321
|
+
title: z.string().optional(),
|
|
1322
|
+
tagline: z.string().optional(),
|
|
1323
|
+
logo: mediaReferenceResponse.optional(),
|
|
1324
|
+
favicon: mediaReferenceResponse.optional(),
|
|
1325
|
+
url: z.string().optional(),
|
|
1326
|
+
postsPerPage: z.number().int().optional(),
|
|
1327
|
+
dateFormat: z.string().optional(),
|
|
1328
|
+
timezone: z.string().optional(),
|
|
1329
|
+
social: socialSettings.optional(),
|
|
1330
|
+
seo: seoSettingsResponse.optional()
|
|
1331
|
+
}).meta({ id: "SiteSettings" });
|
|
1332
|
+
|
|
1333
|
+
//#endregion
|
|
1334
|
+
//#region src/api/schemas/search.ts
|
|
1335
|
+
const searchQuery = z.object({
|
|
1336
|
+
q: z.string().min(1),
|
|
1337
|
+
collections: z.string().optional(),
|
|
1338
|
+
status: z.string().optional(),
|
|
1339
|
+
locale: localeCode.optional(),
|
|
1340
|
+
limit: z.coerce.number().int().min(1).max(100).optional(),
|
|
1341
|
+
cursor: z.string().optional(),
|
|
1342
|
+
scope: z.enum(["all", "title"]).optional().meta({ description: "Which indexed fields to match against. 'title' matches only the collection's title field; collections without an indexed title field return no results. Defaults to 'all'." })
|
|
1343
|
+
}).meta({ id: "SearchQuery" });
|
|
1344
|
+
const searchSuggestQuery = z.object({
|
|
1345
|
+
q: z.string().min(1),
|
|
1346
|
+
collections: z.string().optional(),
|
|
1347
|
+
locale: localeCode.optional(),
|
|
1348
|
+
limit: z.coerce.number().int().min(1).max(20).optional()
|
|
1349
|
+
}).meta({ id: "SearchSuggestQuery" });
|
|
1350
|
+
const searchRebuildBody = z.object({ collection: z.string().min(1) }).meta({ id: "SearchRebuildBody" });
|
|
1351
|
+
const searchEnableBody = z.object({
|
|
1352
|
+
collection: z.string().min(1),
|
|
1353
|
+
enabled: z.boolean(),
|
|
1354
|
+
weights: z.record(z.string(), z.number()).optional(),
|
|
1355
|
+
tokenize: z.enum(SEARCH_TOKENIZERS).optional()
|
|
1356
|
+
}).meta({ id: "SearchEnableBody" });
|
|
1357
|
+
const searchResultSchema = z.object({
|
|
1358
|
+
collection: z.string(),
|
|
1359
|
+
id: z.string(),
|
|
1360
|
+
slug: z.string().nullable(),
|
|
1361
|
+
locale: z.string(),
|
|
1362
|
+
title: z.string().optional(),
|
|
1363
|
+
snippet: z.string().optional(),
|
|
1364
|
+
score: z.number()
|
|
1365
|
+
}).meta({ id: "SearchResult" });
|
|
1366
|
+
const searchResponseSchema = z.object({
|
|
1367
|
+
items: z.array(searchResultSchema),
|
|
1368
|
+
nextCursor: z.string().optional()
|
|
1369
|
+
}).meta({ id: "SearchResponse" });
|
|
1370
|
+
|
|
1371
|
+
//#endregion
|
|
1372
|
+
//#region src/api/schemas/users.ts
|
|
1373
|
+
const usersListQuery = z.object({
|
|
1374
|
+
search: z.string().optional(),
|
|
1375
|
+
role: z.string().optional(),
|
|
1376
|
+
cursor: z.string().max(2048).optional(),
|
|
1377
|
+
limit: z.coerce.number().int().min(1).max(100).optional().default(50)
|
|
1378
|
+
}).meta({ id: "UsersListQuery" });
|
|
1379
|
+
const userUpdateBody = z.object({
|
|
1380
|
+
name: z.string().optional(),
|
|
1381
|
+
email: z.email().optional(),
|
|
1382
|
+
role: roleLevel.optional()
|
|
1383
|
+
}).meta({ id: "UserUpdateBody" });
|
|
1384
|
+
const allowedDomainCreateBody = z.object({
|
|
1385
|
+
domain: z.string().min(1),
|
|
1386
|
+
defaultRole: roleLevel
|
|
1387
|
+
}).meta({ id: "AllowedDomainCreateBody" });
|
|
1388
|
+
const allowedDomainUpdateBody = z.object({
|
|
1389
|
+
enabled: z.boolean().optional(),
|
|
1390
|
+
defaultRole: roleLevel.optional()
|
|
1391
|
+
}).meta({ id: "AllowedDomainUpdateBody" });
|
|
1392
|
+
const userSchema = z.object({
|
|
1393
|
+
id: z.string(),
|
|
1394
|
+
email: z.string(),
|
|
1395
|
+
name: z.string().nullable(),
|
|
1396
|
+
avatarUrl: z.string().nullable(),
|
|
1397
|
+
role: z.number().int(),
|
|
1398
|
+
emailVerified: z.boolean(),
|
|
1399
|
+
disabled: z.boolean(),
|
|
1400
|
+
createdAt: z.string(),
|
|
1401
|
+
updatedAt: z.string(),
|
|
1402
|
+
lastLogin: z.string().nullable(),
|
|
1403
|
+
credentialCount: z.number().int().optional(),
|
|
1404
|
+
oauthProviders: z.array(z.string()).optional()
|
|
1405
|
+
}).meta({ id: "User" });
|
|
1406
|
+
const userListResponseSchema = z.object({
|
|
1407
|
+
items: z.array(userSchema),
|
|
1408
|
+
nextCursor: z.string().optional()
|
|
1409
|
+
}).meta({ id: "UserListResponse" });
|
|
1410
|
+
const userDetailSchema = z.object({
|
|
1411
|
+
id: z.string(),
|
|
1412
|
+
email: z.string(),
|
|
1413
|
+
name: z.string().nullable(),
|
|
1414
|
+
avatarUrl: z.string().nullable(),
|
|
1415
|
+
role: z.number().int(),
|
|
1416
|
+
emailVerified: z.boolean(),
|
|
1417
|
+
disabled: z.boolean(),
|
|
1418
|
+
createdAt: z.string(),
|
|
1419
|
+
updatedAt: z.string(),
|
|
1420
|
+
lastLogin: z.string().nullable(),
|
|
1421
|
+
credentials: z.array(z.object({
|
|
1422
|
+
id: z.string(),
|
|
1423
|
+
name: z.string().nullable(),
|
|
1424
|
+
deviceType: z.string().nullable(),
|
|
1425
|
+
createdAt: z.string(),
|
|
1426
|
+
lastUsedAt: z.string()
|
|
1427
|
+
})),
|
|
1428
|
+
oauthAccounts: z.array(z.object({
|
|
1429
|
+
provider: z.string(),
|
|
1430
|
+
createdAt: z.string()
|
|
1431
|
+
}))
|
|
1432
|
+
}).meta({ id: "UserDetail" });
|
|
1433
|
+
|
|
1434
|
+
//#endregion
|
|
1435
|
+
//#region src/api/schemas/widgets.ts
|
|
1436
|
+
const widgetType = z.enum([
|
|
1437
|
+
"content",
|
|
1438
|
+
"menu",
|
|
1439
|
+
"component"
|
|
1440
|
+
]);
|
|
1441
|
+
const createWidgetAreaBody = z.object({
|
|
1442
|
+
name: z.string().min(1),
|
|
1443
|
+
label: z.string().min(1),
|
|
1444
|
+
description: z.string().optional()
|
|
1445
|
+
}).meta({ id: "CreateWidgetAreaBody" });
|
|
1446
|
+
const createWidgetBody = z.object({
|
|
1447
|
+
type: widgetType,
|
|
1448
|
+
title: z.string().optional(),
|
|
1449
|
+
content: z.array(z.record(z.string(), z.unknown())).optional(),
|
|
1450
|
+
menuName: z.string().optional(),
|
|
1451
|
+
componentId: z.string().optional(),
|
|
1452
|
+
componentProps: z.record(z.string(), z.unknown()).optional()
|
|
1453
|
+
}).meta({ id: "CreateWidgetBody" });
|
|
1454
|
+
const updateWidgetBody = z.object({
|
|
1455
|
+
type: widgetType.optional(),
|
|
1456
|
+
title: z.string().optional(),
|
|
1457
|
+
content: z.array(z.record(z.string(), z.unknown())).optional(),
|
|
1458
|
+
menuName: z.string().optional(),
|
|
1459
|
+
componentId: z.string().optional(),
|
|
1460
|
+
componentProps: z.record(z.string(), z.unknown()).optional()
|
|
1461
|
+
}).meta({ id: "UpdateWidgetBody" });
|
|
1462
|
+
const reorderWidgetsBody = z.object({ widgetIds: z.array(z.string().min(1)) }).meta({ id: "ReorderWidgetsBody" });
|
|
1463
|
+
const widgetAreaSchema = z.object({
|
|
1464
|
+
id: z.string(),
|
|
1465
|
+
name: z.string(),
|
|
1466
|
+
label: z.string(),
|
|
1467
|
+
description: z.string().nullable(),
|
|
1468
|
+
created_at: z.string(),
|
|
1469
|
+
updated_at: z.string()
|
|
1470
|
+
}).meta({ id: "WidgetArea" });
|
|
1471
|
+
const widgetSchema = z.object({
|
|
1472
|
+
id: z.string(),
|
|
1473
|
+
type: widgetType,
|
|
1474
|
+
title: z.string().optional(),
|
|
1475
|
+
content: z.array(z.record(z.string(), z.unknown())).optional(),
|
|
1476
|
+
menuName: z.string().optional(),
|
|
1477
|
+
componentId: z.string().optional(),
|
|
1478
|
+
componentProps: z.record(z.string(), z.unknown()).optional()
|
|
1479
|
+
}).meta({ id: "Widget" });
|
|
1480
|
+
const widgetAreaWithWidgetsSchema = widgetAreaSchema.extend({ widgets: z.array(widgetSchema) }).meta({ id: "WidgetAreaWithWidgets" });
|
|
1481
|
+
const widgetAreaWithWidgetsAndCountSchema = widgetAreaWithWidgetsSchema.extend({ widgetCount: z.number().int() }).meta({ id: "WidgetAreaWithWidgetsAndCount" });
|
|
1482
|
+
|
|
1483
|
+
//#endregion
|
|
1484
|
+
//#region src/api/schemas/entry-lock.ts
|
|
1485
|
+
const entryLockAcquireBody = z.object({
|
|
1486
|
+
takeover: z.boolean().optional().meta({ description: "Take the lock from whoever holds it. Their next heartbeat or save reports the new holder." }),
|
|
1487
|
+
token: z.string().min(1).max(128).optional().meta({ description: "Identifies the caller's editing session. Send the same value on DELETE so a release from one tab does not drop a lock another tab of the same account still relies on." })
|
|
1488
|
+
}).meta({ id: "EntryLockAcquireBody" });
|
|
1489
|
+
const entryLockHolderSchema = z.object({
|
|
1490
|
+
userId: z.string(),
|
|
1491
|
+
userName: z.string().nullable(),
|
|
1492
|
+
acquiredAt: z.string(),
|
|
1493
|
+
expiresAt: z.string()
|
|
1494
|
+
}).meta({ id: "EntryLockHolder" });
|
|
1495
|
+
const entryLockStatusSchema = z.object({
|
|
1496
|
+
enabled: z.boolean().meta({ description: "Whether the collection takes edit locks at all" }),
|
|
1497
|
+
holder: entryLockHolderSchema.nullable(),
|
|
1498
|
+
heldByCaller: z.boolean()
|
|
1499
|
+
}).meta({ id: "EntryLockStatus" });
|
|
1500
|
+
const entryLockReleaseResponseSchema = z.object({ released: z.boolean() }).meta({ id: "EntryLockReleaseResponse" });
|
|
1501
|
+
const entryLockConflictSchema = z.object({
|
|
1502
|
+
success: z.literal(false),
|
|
1503
|
+
error: z.object({
|
|
1504
|
+
code: z.literal("ENTRY_LOCKED"),
|
|
1505
|
+
message: z.string(),
|
|
1506
|
+
details: entryLockHolderSchema
|
|
1507
|
+
})
|
|
1508
|
+
});
|
|
1509
|
+
const entryMutationConflictSchema = z.object({
|
|
1510
|
+
success: z.literal(false),
|
|
1511
|
+
error: z.object({
|
|
1512
|
+
code: z.string().meta({ examples: ["CONFLICT", "ENTRY_LOCKED"] }),
|
|
1513
|
+
message: z.string(),
|
|
1514
|
+
details: entryLockHolderSchema.optional()
|
|
1515
|
+
})
|
|
1516
|
+
});
|
|
1517
|
+
|
|
1518
|
+
//#endregion
|
|
1519
|
+
export { createMenuItemBody as $, contentRevisionConditionBody as $n, mediaReplaceResponseSchema as $t, createSectionBody as A, mediaUsageRepairResponseSchema as An, DEFAULT_MAX_UPLOAD_SIZE as At, taxonomyListResponseSchema as B, mediaUsageWorkStateSchema as Bn, mediaFolderResponseSchema as Bt, searchQuery as C, mediaUsageDetailsResponseSchema as Cn, orphanRegisterBody as Ct, searchSuggestQuery as D, mediaUsageProgressSchema as Dn, updateCollectionBody as Dt, searchResultSchema as E, mediaUsageProgressAdvanceResponseSchema as En, schemaExportQuery as Et, createTaxonomyDefBody as F, mediaUsageWorkListQuery as Fn, mediaExistingResponseSchema as Ft, termReorderResponseSchema as G, contentFieldFiltersSchema as Gn, mediaListReadItemSchema as Gt, termGetResponseSchema as H, contentAuthorsResponseSchema as Hn, mediaGetQuery as Ht, createTermBody as I, mediaUsageWorkListResponseSchema as In, mediaFolderBody as It, termTranslationsSchema as J, contentListResponseSchema as Jn, mediaProviderListQuery as Jt, termResponseSchema as K, contentItemSchema as Kn, mediaListReadResponseSchema as Kt, reorderTermsBody as L, mediaUsageWorkRetryBody as Ln, mediaFolderIdSchema as Lt, sectionSchema as M, mediaUsageSourceDetailSchema as Mn, mediaConfirmBody as Mt, sectionsListQuery as N, mediaUsageSummarySchema as Nn, mediaConfirmResponseSchema as Nt, settingsUpdateBody as O, mediaUsageRepairBody as On, updateFieldBody as Ot, updateSectionBody as P, mediaUsageWorkItemSchema as Pn, mediaDirectUploadBody as Pt, createMenuBody as Q, contentRestoreResponseSchema as Qn, mediaReplaceMetadataForm as Qt, taxonomyDefSchema as R, mediaUsageWorkRetryConflictSchema as Rn, mediaFolderListQuery as Rt, searchEnableBody as S, mediaUsageDetailsQuery as Sn, fieldSchema as St, searchResponseSchema as T, mediaUsageOccurrenceDetailSchema as Tn, orphanedTableSchema as Tt, termListQuery as U, contentCompareResponseSchema as Un, mediaItemSchema as Ut, taxonomyResponseSchema as V, contentAuthorSchema as Vn, mediaFolderSchema as Vt, termListResponseSchema as W, contentCreateBody as Wn, mediaListQuery as Wt, updateTaxonomyDefBody as X, contentPublishBody as Xn, mediaReadResponseSchema as Xt, termWithCountSchema as Y, contentPreviewUrlBody as Yn, mediaReadItemSchema as Yt, updateTermBody as Z, contentResponseSchema as Zn, mediaReplaceBody as Zt, userDetailSchema as _, mediaUsageCollectionDeletionRetryBody as _n, bylineUpdateBody as _r, createCollectionBody as _t, entryLockStatusSchema as a, mediaUploadResponseSchema as an, contentTranslationSchema as ar, menuWithItemsSchema as at, userUpdateBody as b, mediaUsageCoverageSchema as bn, fieldReorderBody as bt, createWidgetBody as c, mediaUsageActivationAdvanceBody as cn, contentUpdateBody as cr, updateMenuItemBody as ct, widgetAreaSchema as d, mediaUsageActivationStateSchema as dn, bylineCreateBody as dr, collectionGetQuery as dt, mediaResponseSchema as en, contentScheduleBody as er, menuItemSchema as et, widgetAreaWithWidgetsAndCountSchema as f, mediaUsageActivationStatusSchema as fn, bylineCreditSchema as fr, collectionListResponseSchema as ft, allowedDomainUpdateBody as g, mediaUsageCollectionDeletionPhaseSchema as gn, bylineTranslationsResponseSchema as gr, collectionWithFieldsResponseSchema as gt, allowedDomainCreateBody as h, mediaUsageCollectionDeletionListResponseSchema as hn, bylineTranslationCreateBody as hr, collectionSchema as ht, entryLockReleaseResponseSchema as i, mediaUploadEnsureUniqueFilenameForm as in, contentTermsResponseSchema as ir, menuTranslationsSchema as it, sectionListResponseSchema as j, mediaUsageRepairStatusSchema as jn, formatFileSize as jt, siteSettingsSchema as k, mediaUsageRepairCollectionSummarySchema as kn, CONTENT_TYPE_RE as kt, reorderWidgetsBody as l, mediaUsageActivationAdvanceResponseSchema as ln, trashedContentItemSchema as lr, isSafeHref as lt, widgetSchema as m, mediaUsageCollectionDeletionListQuery as mn, bylineSummarySchema as mr, collectionResponseSchema as mt, entryLockConflictSchema as n, mediaUpdateBody as nn, contentSeoSchema as nr, menuListItemSchema as nt, entryMutationConflictSchema as o, mediaUploadUrlBody as on, contentTranslationsResponseSchema as or, reorderMenuItemsBody as ot, widgetAreaWithWidgetsSchema as p, mediaUsageCollectionDeletionItemSchema as pn, bylineListResponseSchema as pr, collectionReorderBody as pt, termSchema as q, contentListQuery as qn, mediaListResponseSchema as qt, entryLockHolderSchema as r, mediaUploadDeduplicateForm as rn, contentTermsBody as rr, menuSchema as rt, createWidgetAreaBody as s, mediaUploadUrlResponseSchema as sn, contentTrashQuery as sr, updateMenuBody as st, entryLockAcquireBody as t, mediaStreamUploadResponseSchema as tn, contentSeoInput as tr, menuItemTypeEnum as tt, updateWidgetBody as u, mediaUsageActivationConflictSchema as un, trashedContentListResponseSchema as ur, sanitizeHref as ut, userListResponseSchema as v, mediaUsageCollectionDeletionRetryResponseSchema as vn, bylinesListQuery as vr, createFieldBody as vt, searchRebuildBody as w, mediaUsageEntryDetailSchema as wn, orphanedTableListResponseSchema as wt, usersListQuery as x, mediaUsageCoverageStatusSchema as xn, fieldResponseSchema as xt, userSchema as y, mediaUsageCollectionDeletionStateSchema as yn, contentBylineInputSchema as yr, fieldListResponseSchema as yt, taxonomyDefTranslationsSchema as z, mediaUsageWorkRetryResponseSchema as zn, mediaFolderListResponseSchema as zt };
|
|
1520
|
+
//# sourceMappingURL=entry-lock-D3C99MXS.mjs.map
|