emdash 0.33.0 → 0.34.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/{adapters-BMyNSSZi.d.mts → adapters-34EN2eXO.d.mts} +26 -2
- package/dist/adapters-34EN2eXO.d.mts.map +1 -0
- package/dist/{allowed-origins-CG1pACtS.mjs → allowed-origins-DW7sYyqg.mjs} +2 -2
- package/dist/{allowed-origins-CG1pACtS.mjs.map → allowed-origins-DW7sYyqg.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -3
- package/dist/api/route-utils.mjs +22 -21
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +6 -5
- package/dist/{api-D2hunekQ.mjs → api-DdAsirBe.mjs} +98 -407
- package/dist/api-DdAsirBe.mjs.map +1 -0
- package/dist/{api-tokens-CSND0i1z.mjs → api-tokens-CFXu8F_2.mjs} +2 -2
- package/dist/{api-tokens-CSND0i1z.mjs.map → api-tokens-CFXu8F_2.mjs.map} +1 -1
- package/dist/{apply-kwNEJW2l.mjs → apply-D5zfeD09.mjs} +131 -107
- package/dist/apply-D5zfeD09.mjs.map +1 -0
- package/dist/astro/index.d.mts +12 -12
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +93 -35
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +10 -10
- package/dist/astro/middleware/auth.mjs +8 -8
- package/dist/astro/middleware/media-usage-write-fence.d.mts +7 -0
- package/dist/astro/middleware/media-usage-write-fence.d.mts.map +1 -0
- package/dist/astro/middleware/media-usage-write-fence.mjs +35 -0
- package/dist/astro/middleware/media-usage-write-fence.mjs.map +1 -0
- package/dist/astro/middleware/redirect.d.mts.map +1 -1
- package/dist/astro/middleware/redirect.mjs +10 -7
- package/dist/astro/middleware/redirect.mjs.map +1 -1
- package/dist/astro/middleware/request-context.mjs +3 -3
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +12 -11
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +1677 -156
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +9 -8
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +9 -8
- 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 +12 -11
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +12 -11
- package/dist/astro/routes/api/admin/byline-fields/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +12 -11
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +17 -17
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +17 -17
- package/dist/astro/routes/api/admin/bylines/index.mjs +17 -17
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +14 -13
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/comments/bulk.mjs +12 -11
- package/dist/astro/routes/api/admin/comments/bulk.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/counts.mjs +6 -6
- package/dist/astro/routes/api/admin/comments/index.mjs +12 -11
- package/dist/astro/routes/api/admin/comments/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +5 -5
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +4 -4
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.d.mts +8 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +36 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.d.mts +8 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +36 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +15 -14
- package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/work/index.d.mts +8 -0
- package/dist/astro/routes/api/admin/media-usage/work/index.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +37 -0
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/work/retry.d.mts +8 -0
- package/dist/astro/routes/api/admin/media-usage/work/retry.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +37 -0
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs.map +1 -0
- 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 +51 -43
- 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 +51 -43
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +47 -42
- 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 +47 -42
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +50 -42
- 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 +50 -42
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +47 -42
- 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 +47 -42
- 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 +50 -42
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +47 -42
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +50 -42
- 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 +51 -43
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +47 -42
- 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 +51 -43
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +47 -42
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +47 -42
- 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 +47 -42
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +3 -3
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +3 -3
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +9 -8
- package/dist/astro/routes/api/admin/users/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +4 -4
- package/dist/astro/routes/api/admin/users/index.mjs +9 -8
- package/dist/astro/routes/api/admin/users/index.mjs.map +1 -1
- package/dist/astro/routes/api/auth/dev-bypass.mjs +7 -7
- package/dist/astro/routes/api/auth/invite/accept.mjs +3 -3
- package/dist/astro/routes/api/auth/invite/complete.mjs +13 -12
- package/dist/astro/routes/api/auth/invite/complete.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/index.mjs +10 -9
- package/dist/astro/routes/api/auth/invite/index.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/register-options.mjs +12 -11
- 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 +12 -11
- 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 +10 -9
- 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 +3 -3
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +9 -8
- 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 +14 -13
- package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +12 -11
- package/dist/astro/routes/api/auth/passkey/register/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +13 -12
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/verify.mjs +13 -12
- package/dist/astro/routes/api/auth/passkey/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/complete.mjs +13 -12
- package/dist/astro/routes/api/auth/signup/complete.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/request.mjs +12 -11
- 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.mjs +15 -14
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs.map +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +14 -13
- 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.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +13 -13
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +11 -10
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +18 -17
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +18 -17
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +11 -10
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +44 -31
- 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.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +11 -10
- 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 +11 -10
- package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/trash.mjs +10 -9
- package/dist/astro/routes/api/content/_collection_/trash.mjs.map +1 -1
- package/dist/astro/routes/api/dashboard.mjs +10 -8
- 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/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +18 -16
- 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 +11 -11
- package/dist/astro/routes/api/import/wordpress/execute.mjs +15 -15
- package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -10
- package/dist/astro/routes/api/import/wordpress/media.mjs +14 -12
- package/dist/astro/routes/api/import/wordpress/media.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +13 -12
- package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +14 -14
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +18 -16
- 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 +11 -11
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +28 -27
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
- package/dist/astro/routes/api/manifest.mjs +5 -5
- package/dist/astro/routes/api/mcp.d.mts.map +1 -1
- package/dist/astro/routes/api/mcp.mjs +174 -72
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +13 -11
- package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/upload.mjs +6 -6
- package/dist/astro/routes/api/media/_id_/usage.mjs +17 -16
- package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_.mjs +16 -15
- package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/media/file/_...key_.mjs +3 -3
- 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 +11 -10
- package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
- package/dist/astro/routes/api/media.mjs +18 -15
- package/dist/astro/routes/api/media.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +11 -11
- package/dist/astro/routes/api/menus/_name_/items.mjs +11 -11
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +11 -11
- package/dist/astro/routes/api/menus/_name_/translations.mjs +11 -11
- package/dist/astro/routes/api/menus/_name_.mjs +11 -11
- package/dist/astro/routes/api/menus/index.mjs +11 -11
- 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 +152 -6
- package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.d.mts.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +8 -7
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/index.mjs +12 -11
- package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/summary.mjs +12 -11
- package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/_id_.mjs +13 -12
- package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/index.mjs +13 -12
- package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/index.mjs +18 -17
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/translations.mjs +13 -12
- package/dist/astro/routes/api/relations/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/relations/index.mjs +18 -17
- 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 +47 -42
- 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 +47 -42
- 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 +47 -42
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.d.mts.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +47 -42
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +47 -42
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/reorder.mjs +47 -42
- package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +10 -9
- package/dist/astro/routes/api/schema/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +47 -42
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +47 -42
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +13 -13
- package/dist/astro/routes/api/search/index.mjs +12 -12
- package/dist/astro/routes/api/search/rebuild.mjs +13 -13
- package/dist/astro/routes/api/search/stats.mjs +8 -8
- package/dist/astro/routes/api/search/suggest.mjs +12 -12
- package/dist/astro/routes/api/sections/_slug_.mjs +12 -11
- package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/sections/index.mjs +12 -11
- package/dist/astro/routes/api/sections/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +6 -6
- package/dist/astro/routes/api/settings/backups/export.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/index.mjs +8 -8
- package/dist/astro/routes/api/settings/email.mjs +5 -5
- package/dist/astro/routes/api/settings.mjs +14 -13
- package/dist/astro/routes/api/settings.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin-verify.mjs +14 -13
- package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin.mjs +13 -12
- package/dist/astro/routes/api/setup/admin.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-bypass.mjs +30 -28
- package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-reset.mjs +3 -3
- package/dist/astro/routes/api/setup/index.mjs +32 -30
- 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 +8 -8
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +18 -16
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/translations.d.mts +8 -0
- package/dist/astro/routes/api/taxonomies/_name_/translations.d.mts.map +1 -0
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +46 -0
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs.map +1 -0
- package/dist/astro/routes/api/taxonomies/_name_.d.mts +19 -0
- package/dist/astro/routes/api/taxonomies/_name_.d.mts.map +1 -0
- package/dist/astro/routes/api/taxonomies/_name_.mjs +88 -0
- package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -0
- package/dist/astro/routes/api/taxonomies/index.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +6 -6
- package/dist/astro/routes/api/typegen.mjs +6 -6
- package/dist/astro/routes/api/well-known/auth.mjs +1 -1
- 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 +10 -9
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +12 -11
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +12 -11
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.mjs +7 -6
- package/dist/astro/routes/api/widget-areas/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/index.mjs +12 -11
- 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 +7 -6
- package/dist/astro/routes/robots.txt.mjs.map +1 -1
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +10 -10
- package/dist/astro/routes/sitemap.xml.mjs +8 -7
- package/dist/astro/routes/sitemap.xml.mjs.map +1 -1
- package/dist/astro/types.d.mts +35 -17
- package/dist/astro/types.d.mts.map +1 -1
- package/dist/auth/providers/github.d.mts +1 -1
- package/dist/auth/providers/google.d.mts +1 -1
- package/dist/{authorize-qRhWQnel.mjs → authorize-1iFJzPaZ.mjs} +2 -2
- package/dist/{authorize-qRhWQnel.mjs.map → authorize-1iFJzPaZ.mjs.map} +1 -1
- package/dist/{backup-CtA6LDNw.mjs → backup-LHjIAVNP.mjs} +4 -4
- package/dist/{backup-CtA6LDNw.mjs.map → backup-LHjIAVNP.mjs.map} +1 -1
- package/dist/{base64-B-PsqheR.mjs → base64-CvLhUKQv.mjs} +1 -1
- package/dist/{base64-B-PsqheR.mjs.map → base64-CvLhUKQv.mjs.map} +1 -1
- package/dist/bundle-CBEXrBnb.mjs +663 -0
- package/dist/bundle-CBEXrBnb.mjs.map +1 -0
- package/dist/{byline-fields-CNc0Yq5i.mjs → byline-fields-C5S8wygO.mjs} +2 -2
- package/dist/{byline-fields-CNc0Yq5i.mjs.map → byline-fields-C5S8wygO.mjs.map} +1 -1
- package/dist/{byline-Cp6csL84.mjs → byline-pEcoDps8.mjs} +5 -5
- package/dist/{byline-Cp6csL84.mjs.map → byline-pEcoDps8.mjs.map} +1 -1
- package/dist/{byline-registry-ZkPKqEwC.mjs → byline-registry-DDun8sxh.mjs} +2 -2
- package/dist/{byline-registry-ZkPKqEwC.mjs.map → byline-registry-DDun8sxh.mjs.map} +1 -1
- package/dist/{bylines-CEj5CdT4.mjs → bylines-BWemdX2k.mjs} +7 -7
- package/dist/{bylines-CEj5CdT4.mjs.map → bylines-BWemdX2k.mjs.map} +1 -1
- package/dist/{bylines-cf-C9lmF.mjs → bylines-DJfSfXCL.mjs} +5 -5
- package/dist/{bylines-cf-C9lmF.mjs.map → bylines-DJfSfXCL.mjs.map} +1 -1
- package/dist/{cache-C9FptTFR.mjs → cache-CBJaDy_E.mjs} +3 -3
- package/dist/{cache-C9FptTFR.mjs.map → cache-CBJaDy_E.mjs.map} +1 -1
- package/dist/{challenge-store-D9VNKELo.mjs → challenge-store-CZyFVaad.mjs} +1 -1
- package/dist/{challenge-store-D9VNKELo.mjs.map → challenge-store-CZyFVaad.mjs.map} +1 -1
- package/dist/{chunks-DbYzib_k.mjs → chunks-DfPax1I0.mjs} +2 -2
- package/dist/{chunks-DbYzib_k.mjs.map → chunks-DfPax1I0.mjs.map} +1 -1
- package/dist/cli/index.mjs +176 -698
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +74 -4
- package/dist/client/index.d.mts.map +1 -1
- package/dist/client/index.mjs +25 -2
- package/dist/client/index.mjs.map +1 -1
- package/dist/collection-deletion-C8BugSGz.mjs +779 -0
- package/dist/collection-deletion-C8BugSGz.mjs.map +1 -0
- package/dist/{comment-BIkJ6Fil.mjs → comment-Dxlep6cE.mjs} +2 -2
- package/dist/{comment-BIkJ6Fil.mjs.map → comment-Dxlep6cE.mjs.map} +1 -1
- package/dist/{comment-reaction-D-laEceb.mjs → comment-reaction-D6qfHKBc.mjs} +2 -2
- package/dist/{comment-reaction-D-laEceb.mjs.map → comment-reaction-D6qfHKBc.mjs.map} +1 -1
- package/dist/{comments-0_w6KChA.mjs → comments-CTOuhTSX.mjs} +3 -3
- package/dist/{comments-0_w6KChA.mjs.map → comments-CTOuhTSX.mjs.map} +1 -1
- package/dist/{components-BPxrRjpE.mjs → components-CQy3lh9x.mjs} +1 -1
- package/dist/{components-BPxrRjpE.mjs.map → components-CQy3lh9x.mjs.map} +1 -1
- package/dist/{config-DyF3OKg_.mjs → config-C3EBstHi.mjs} +18 -2
- package/dist/config-C3EBstHi.mjs.map +1 -0
- package/dist/{content-CJ94NEx5.mjs → content-BNfwh7xX.mjs} +509 -78
- package/dist/content-BNfwh7xX.mjs.map +1 -0
- package/dist/content-list-query-DhQ84eVV.d.mts +26 -0
- package/dist/content-list-query-DhQ84eVV.d.mts.map +1 -0
- package/dist/content-refresh-DNERP4-f.mjs +2560 -0
- package/dist/content-refresh-DNERP4-f.mjs.map +1 -0
- package/dist/{context-C_1nrqnW.mjs → context-DRgOvSnW.mjs} +25 -17
- package/dist/context-DRgOvSnW.mjs.map +1 -0
- package/dist/{cron-DRV-UC4K.mjs → cron-Y9aLtgrA.mjs} +1 -1
- package/dist/{cron-DRV-UC4K.mjs.map → cron-Y9aLtgrA.mjs.map} +1 -1
- package/dist/{dashboard-DINnNVVU.mjs → dashboard-CB8J89rJ.mjs} +44 -10
- package/dist/dashboard-CB8J89rJ.mjs.map +1 -0
- package/dist/db/index.d.mts +4 -4
- package/dist/db/index.mjs +2 -2
- package/dist/db/index.mjs.map +1 -1
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/{db-errors-CcWLaRiR.mjs → db-errors-Cl-sKYTm.mjs} +1 -1
- package/dist/{db-errors-CcWLaRiR.mjs.map → db-errors-Cl-sKYTm.mjs.map} +1 -1
- package/dist/{default-BD2FG0xV.mjs → default-DdDl3fxv.mjs} +1 -1
- package/dist/{default-BD2FG0xV.mjs.map → default-DdDl3fxv.mjs.map} +1 -1
- package/dist/{deferred-tasks-C-WRCcKo.d.mts → deferred-tasks-BMsa9F64.d.mts} +1 -1
- package/dist/{deferred-tasks-C-WRCcKo.d.mts.map → deferred-tasks-BMsa9F64.d.mts.map} +1 -1
- package/dist/{device-flow-CTqd8mud.mjs → device-flow-CaioYGK3.mjs} +4 -4
- package/dist/{device-flow-CTqd8mud.mjs.map → device-flow-CaioYGK3.mjs.map} +1 -1
- package/dist/dist-D_6CKR8z.mjs +810 -0
- package/dist/dist-D_6CKR8z.mjs.map +1 -0
- package/dist/{email-console-C6WdcWbL.mjs → email-console-BHNjIwiB.mjs} +1 -1
- package/dist/{email-console-C6WdcWbL.mjs.map → email-console-BHNjIwiB.mjs.map} +1 -1
- package/dist/{enrich-CFJJgxs_.mjs → enrich-_ySMEvEE.mjs} +2 -2
- package/dist/{enrich-CFJJgxs_.mjs.map → enrich-_ySMEvEE.mjs.map} +1 -1
- package/dist/{error-oh_9i6bR.mjs → error-DupyJZE2.mjs} +3 -3
- package/dist/{error-oh_9i6bR.mjs.map → error-DupyJZE2.mjs.map} +1 -1
- package/dist/{errors-BucQ8VYz.mjs → errors-CLUPm7aD.mjs} +14 -2
- package/dist/errors-CLUPm7aD.mjs.map +1 -0
- package/dist/{escape-CXps5F_v.mjs → escape-C_aLKP3H.mjs} +1 -1
- package/dist/{escape-CXps5F_v.mjs.map → escape-C_aLKP3H.mjs.map} +1 -1
- package/dist/{field-defs-cache-WD82dMQq.mjs → field-defs-cache-hg6QkjV9.mjs} +4 -4
- package/dist/{field-defs-cache-WD82dMQq.mjs.map → field-defs-cache-hg6QkjV9.mjs.map} +1 -1
- package/dist/{fts-manager-BITakW_R.mjs → fts-manager-CZ-5dVwJ.mjs} +76 -50
- package/dist/fts-manager-CZ-5dVwJ.mjs.map +1 -0
- package/dist/{hreflang-BaLCNcDx.d.mts → hreflang-D3Uehfv2.d.mts} +2 -2
- package/dist/{hreflang-BaLCNcDx.d.mts.map → hreflang-D3Uehfv2.d.mts.map} +1 -1
- package/dist/{hreflang-BdZuVBhL.mjs → hreflang-DNswoYsi.mjs} +7 -7
- package/dist/{hreflang-BdZuVBhL.mjs.map → hreflang-DNswoYsi.mjs.map} +1 -1
- package/dist/{import-C-9uqyT3.mjs → import-B41u8Rot.mjs} +5 -5
- package/dist/{import-C-9uqyT3.mjs.map → import-B41u8Rot.mjs.map} +1 -1
- package/dist/{index-M37iz29I.d.mts → index-C3Y-rsyN.d.mts} +226 -73
- package/dist/index-C3Y-rsyN.d.mts.map +1 -0
- package/dist/{index-MGw47uWq.d.mts → index-Cof4-Fab.d.mts} +5 -10
- package/dist/index-Cof4-Fab.d.mts.map +1 -0
- package/dist/index.d.mts +20 -19
- package/dist/index.mjs +73 -67
- package/dist/{init-lock-DJkX6Hto.mjs → init-lock-6b309ZrF.mjs} +1 -1
- package/dist/{init-lock-DJkX6Hto.mjs.map → init-lock-6b309ZrF.mjs.map} +1 -1
- package/dist/{load-DV1DZuUJ.mjs → load-DmvJrtxS.mjs} +2 -2
- package/dist/{load-DV1DZuUJ.mjs.map → load-DmvJrtxS.mjs.map} +1 -1
- package/dist/{loader-CGugY7Zl.mjs → loader-DLBqRiGP.mjs} +95 -53
- package/dist/loader-DLBqRiGP.mjs.map +1 -0
- package/dist/{manifest-schema-Da7kj23y.mjs → manifest-schema-BXbUAHod.mjs} +1 -1
- package/dist/{manifest-schema-Da7kj23y.mjs.map → manifest-schema-BXbUAHod.mjs.map} +1 -1
- package/dist/media/image-endpoint.mjs +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +3 -2
- package/dist/media/index.mjs.map +1 -1
- package/dist/media/local-runtime.d.mts +12 -12
- package/dist/media/local-runtime.mjs +6 -5
- package/dist/media/local-runtime.mjs.map +1 -1
- package/dist/{media-OhYL-7Io.mjs → media-BWWWb8kg.mjs} +92 -3
- package/dist/media-BWWWb8kg.mjs.map +1 -0
- package/dist/{media-BP7S-nHT.mjs → media-CzhAn2--.mjs} +2 -2
- package/dist/{media-BP7S-nHT.mjs.map → media-CzhAn2--.mjs.map} +1 -1
- package/dist/{media-allowlist-D-peH1H5.mjs → media-allowlist-BD6HhgXA.mjs} +14 -3
- package/dist/media-allowlist-BD6HhgXA.mjs.map +1 -0
- package/dist/{media-upload-DtrwU2B0.mjs → media-upload-9yas9zGH.mjs} +10 -8
- package/dist/{media-upload-DtrwU2B0.mjs.map → media-upload-9yas9zGH.mjs.map} +1 -1
- package/dist/{media-url-DYs_YLOx.mjs → media-url-BvoX88FA.mjs} +1 -1
- package/dist/{media-url-DYs_YLOx.mjs.map → media-url-BvoX88FA.mjs.map} +1 -1
- package/dist/{media-usage-BlxfTkN0.mjs → media-usage-De3qvwjc.mjs} +137 -60
- package/dist/media-usage-De3qvwjc.mjs.map +1 -0
- package/dist/media-usage-work-B9Bksh_b.mjs +152 -0
- package/dist/media-usage-work-B9Bksh_b.mjs.map +1 -0
- package/dist/media-usage-work-DrCbqBcl.mjs +424 -0
- package/dist/media-usage-work-DrCbqBcl.mjs.map +1 -0
- package/dist/media-usage-write-fence-aHEgN1zB.mjs +42 -0
- package/dist/media-usage-write-fence-aHEgN1zB.mjs.map +1 -0
- package/dist/{menus-Y54RDPIN.mjs → menus-CC-yn1F9.mjs} +351 -95
- package/dist/menus-CC-yn1F9.mjs.map +1 -0
- package/dist/{menus-BcQWxeXu.mjs → menus-fxvEDYE6.mjs} +3 -3
- package/dist/{menus-BcQWxeXu.mjs.map → menus-fxvEDYE6.mjs.map} +1 -1
- package/dist/{mode-BWyTBe3I.mjs → mode-Bpe-tNNy.mjs} +1 -1
- package/dist/{mode-BWyTBe3I.mjs.map → mode-Bpe-tNNy.mjs.map} +1 -1
- package/dist/{normalize-C-SHXmra.mjs → normalize-Bc-s_r-a.mjs} +1 -1
- package/dist/{normalize-C-SHXmra.mjs.map → normalize-Bc-s_r-a.mjs.map} +1 -1
- package/dist/{oauth-authorization-ClvktmrL.mjs → oauth-authorization-BXO1MKej.mjs} +4 -4
- package/dist/{oauth-authorization-ClvktmrL.mjs.map → oauth-authorization-BXO1MKej.mjs.map} +1 -1
- package/dist/{oauth-clients-8ao-U66l.mjs → oauth-clients-C_DNqtRu.mjs} +1 -1
- package/dist/{oauth-clients-8ao-U66l.mjs.map → oauth-clients-C_DNqtRu.mjs.map} +1 -1
- package/dist/{oauth-state-store-B1ofdTiQ.mjs → oauth-state-store-DwAxMtk4.mjs} +1 -1
- package/dist/{oauth-state-store-B1ofdTiQ.mjs.map → oauth-state-store-DwAxMtk4.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-CscEuIiR.mjs → oauth-user-lookup-BxfZizdk.mjs} +1 -1
- package/dist/{oauth-user-lookup-CscEuIiR.mjs.map → oauth-user-lookup-BxfZizdk.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/{options-CA4eVX6P.d.mts → options-DRe1pIBL.d.mts} +4 -3
- package/dist/options-DRe1pIBL.d.mts.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/{parse-CJKNuewM.mjs → parse-DFbuc-Fh.mjs} +2 -2
- package/dist/{parse-CJKNuewM.mjs.map → parse-DFbuc-Fh.mjs.map} +1 -1
- package/dist/{passkey-config-D-zrzMJI.mjs → passkey-config-_2GOwwK8.mjs} +1 -1
- package/dist/{passkey-config-D-zrzMJI.mjs.map → passkey-config-_2GOwwK8.mjs.map} +1 -1
- package/dist/{placeholder-DaeNS-VG.d.mts → placeholder-CzW7Lshs.d.mts} +1 -1
- package/dist/{placeholder-DaeNS-VG.d.mts.map → placeholder-CzW7Lshs.d.mts.map} +1 -1
- package/dist/plugin-types.d.mts +8 -1
- package/dist/plugin-types.d.mts.map +1 -1
- package/dist/plugin-utils.d.mts +10 -10
- package/dist/plugins/adapt-sandbox-entry.d.mts +10 -10
- package/dist/plugins/adapt-sandbox-entry.mjs +7 -4
- package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
- package/dist/{portable-text-B_kqBmXB.mjs → portable-text-DhKbDAGr.mjs} +1 -1
- package/dist/{portable-text-B_kqBmXB.mjs.map → portable-text-DhKbDAGr.mjs.map} +1 -1
- package/dist/{preview-BU6PaLpM.mjs → preview-PW-nOnq4.mjs} +2 -2
- package/dist/{preview-BU6PaLpM.mjs.map → preview-PW-nOnq4.mjs.map} +1 -1
- package/dist/{public-url-Ox9oOlgp.mjs → public-url-CWoFhQT8.mjs} +1 -1
- package/dist/{public-url-Ox9oOlgp.mjs.map → public-url-CWoFhQT8.mjs.map} +1 -1
- package/dist/{query-C5w7PsRQ.mjs → query-BgjfiLUQ.mjs} +31 -49
- package/dist/query-BgjfiLUQ.mjs.map +1 -0
- package/dist/{query-rC9HKv1N.mjs → query-vgZNwIhh.mjs} +3 -3
- package/dist/{query-rC9HKv1N.mjs.map → query-vgZNwIhh.mjs.map} +1 -1
- package/dist/{rate-limit-kug6q99V.mjs → rate-limit-L5anykgo.mjs} +2 -2
- package/dist/{rate-limit-kug6q99V.mjs.map → rate-limit-L5anykgo.mjs.map} +1 -1
- package/dist/{redirect-DIJxXKOG.mjs → redirect-COsS6SWJ.mjs} +2 -2
- package/dist/{redirect-DIJxXKOG.mjs.map → redirect-COsS6SWJ.mjs.map} +1 -1
- package/dist/{redirect-Egf2R9yP.mjs → redirect-KBNE3UEs.mjs} +1 -1
- package/dist/{redirect-Egf2R9yP.mjs.map → redirect-KBNE3UEs.mjs.map} +1 -1
- package/dist/{redirects-Bzm812bY.mjs → redirects-CufRQt0Q.mjs} +4 -4
- package/dist/{redirects-Bzm812bY.mjs.map → redirects-CufRQt0Q.mjs.map} +1 -1
- package/dist/{redirects-G8wAhWAf.mjs → redirects-cV9g7V-0.mjs} +133 -14
- package/dist/redirects-cV9g7V-0.mjs.map +1 -0
- package/dist/registry-C581V4TP.mjs +1275 -0
- package/dist/registry-C581V4TP.mjs.map +1 -0
- package/dist/{relation-Cbe3Sd3m.mjs → relation-DtmAQH7s.mjs} +3 -3
- package/dist/{relation-Cbe3Sd3m.mjs.map → relation-DtmAQH7s.mjs.map} +1 -1
- package/dist/{relations-Bw_E1TXo.mjs → relations-BBApI4e2.mjs} +3 -3
- package/dist/{relations-Bw_E1TXo.mjs.map → relations-BBApI4e2.mjs.map} +1 -1
- package/dist/{relations-qHwpUe66.mjs → relations-DICSyfsh.mjs} +6 -6
- package/dist/{relations-qHwpUe66.mjs.map → relations-DICSyfsh.mjs.map} +1 -1
- package/dist/{relations-G2ta7GIl.d.mts → relations-DItI3MN9.d.mts} +369 -35
- package/dist/relations-DItI3MN9.d.mts.map +1 -0
- package/dist/request-context.d.mts +1 -1
- package/dist/{request-meta-Df-jFbAd.mjs → request-meta-DgZJh3zG.mjs} +2 -2
- package/dist/{request-meta-Df-jFbAd.mjs.map → request-meta-DgZJh3zG.mjs.map} +1 -1
- package/dist/{resolve-DZzG4HqM.mjs → resolve-DOhVEvty.mjs} +2 -2
- package/dist/{resolve-DZzG4HqM.mjs.map → resolve-DOhVEvty.mjs.map} +1 -1
- package/dist/{runner-BFTrkYhu.mjs → runner-BiDvq5dv.mjs} +1157 -254
- package/dist/runner-BiDvq5dv.mjs.map +1 -0
- package/dist/{runner-BaADli8l.d.mts → runner-CgQbELYC.d.mts} +2 -2
- package/dist/{runner-BaADli8l.d.mts.map → runner-CgQbELYC.d.mts.map} +1 -1
- package/dist/runtime.d.mts +11 -11
- package/dist/runtime.mjs +4 -3
- package/dist/runtime.mjs.map +1 -1
- package/dist/{schema-CiQXr6_F.mjs → schema-BFyTg38T.mjs} +3 -3
- package/dist/{schema-CiQXr6_F.mjs.map → schema-BFyTg38T.mjs.map} +1 -1
- package/dist/schema-CeQSNwB3.mjs +390 -0
- package/dist/schema-CeQSNwB3.mjs.map +1 -0
- package/dist/{scopes-CNJVT5i5.mjs → scopes-BVeuhGBE.mjs} +3 -3
- package/dist/{scopes-CNJVT5i5.mjs.map → scopes-BVeuhGBE.mjs.map} +1 -1
- package/dist/{search-FZhx5dDU.mjs → search-BpuPKZb0.mjs} +25 -15
- package/dist/search-BpuPKZb0.mjs.map +1 -0
- package/dist/{secrets-DLd8RXee.mjs → secrets-dtYs2hDo.mjs} +3 -3
- package/dist/{secrets-DLd8RXee.mjs.map → secrets-dtYs2hDo.mjs.map} +1 -1
- package/dist/{sections-BrIrMUCn.mjs → sections-COctk6hf.mjs} +3 -3
- package/dist/{sections-BrIrMUCn.mjs.map → sections-COctk6hf.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +24 -22
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.mjs +16 -15
- package/dist/seo/index.mjs.map +1 -1
- package/dist/{seo-CobNfOvb.mjs → seo-AFpVvTqr.mjs} +5 -3
- package/dist/seo-AFpVvTqr.mjs.map +1 -0
- package/dist/{seo-DTHRntNC.mjs → seo-CvDxfvFb.mjs} +2 -2
- package/dist/{seo-DTHRntNC.mjs.map → seo-CvDxfvFb.mjs.map} +1 -1
- package/dist/{service-B-pYGPgR.mjs → service-xMiMSTsR.mjs} +3 -3
- package/dist/{service-B-pYGPgR.mjs.map → service-xMiMSTsR.mjs.map} +1 -1
- package/dist/{session-user-BvM9-zNl.mjs → session-user-BzVemLkw.mjs} +1 -1
- package/dist/{session-user-BvM9-zNl.mjs.map → session-user-BzVemLkw.mjs.map} +1 -1
- package/dist/{settings-kJhGiQ4z.mjs → settings-B372MV0p.mjs} +4 -4
- package/dist/{settings-kJhGiQ4z.mjs.map → settings-B372MV0p.mjs.map} +1 -1
- package/dist/{settings-DPHau-WH.mjs → settings-BE9aqn_9.mjs} +3 -3
- package/dist/{settings-DPHau-WH.mjs.map → settings-BE9aqn_9.mjs.map} +1 -1
- package/dist/{setup-complete-u50Qm8rY.mjs → setup-complete-DF7TAfD5.mjs} +1 -1
- package/dist/{setup-complete-u50Qm8rY.mjs.map → setup-complete-DF7TAfD5.mjs.map} +1 -1
- package/dist/{setup-nonce-DCjiiOD2.mjs → setup-nonce-Do-U_cg9.mjs} +1 -1
- package/dist/{setup-nonce-DCjiiOD2.mjs.map → setup-nonce-Do-U_cg9.mjs.map} +1 -1
- package/dist/{single-flight-cache-DW3w11Pu.mjs → single-flight-cache-B0eLKS6K.mjs} +2 -2
- package/dist/{single-flight-cache-DW3w11Pu.mjs.map → single-flight-cache-B0eLKS6K.mjs.map} +1 -1
- package/dist/{site-url-I-lJ5kma.mjs → site-url-Bowsi9T-.mjs} +2 -2
- package/dist/{site-url-I-lJ5kma.mjs.map → site-url-Bowsi9T-.mjs.map} +1 -1
- package/dist/slugify-B994zkXC.mjs +17 -0
- package/dist/slugify-B994zkXC.mjs.map +1 -0
- package/dist/{snapshot-I_fjLDaD.mjs → snapshot-B5h6aPMh.mjs} +1 -1
- package/dist/{snapshot-I_fjLDaD.mjs.map → snapshot-B5h6aPMh.mjs.map} +1 -1
- package/dist/{ssrf-CTa6v21i.mjs → ssrf-Cpvg_n3A.mjs} +1 -1
- package/dist/{ssrf-CTa6v21i.mjs.map → ssrf-Cpvg_n3A.mjs.map} +1 -1
- package/dist/{state-CQvoefYP.mjs → state-DYwPue40.mjs} +1 -1
- package/dist/{state-CQvoefYP.mjs.map → state-DYwPue40.mjs.map} +1 -1
- package/dist/{status-CIsmlC1E.mjs → status-CWVYpbD8.mjs} +1 -1
- package/dist/{status-CIsmlC1E.mjs.map → status-CWVYpbD8.mjs.map} +1 -1
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +1 -1
- package/dist/{taxonomies-CLN1N92E.mjs → taxonomies-B0o9ExNV.mjs} +75 -64
- package/dist/taxonomies-B0o9ExNV.mjs.map +1 -0
- package/dist/{taxonomies-CKuaZER5.mjs → taxonomies-Dk3MAklL.mjs} +280 -56
- package/dist/taxonomies-Dk3MAklL.mjs.map +1 -0
- package/dist/{taxonomy-pOrB2kZe.mjs → taxonomy-CPeM8d2o.mjs} +131 -78
- package/dist/taxonomy-CPeM8d2o.mjs.map +1 -0
- package/dist/{tokens-DagaJGK8.mjs → tokens-C39klX8R.mjs} +2 -2
- package/dist/{tokens-DagaJGK8.mjs.map → tokens-C39klX8R.mjs.map} +1 -1
- package/dist/{transport-DVsa5YYo.mjs → transport--CfOflrp.mjs} +1 -1
- package/dist/{transport-DVsa5YYo.mjs.map → transport--CfOflrp.mjs.map} +1 -1
- package/dist/{transport-CAwTaTp_.d.mts → transport-B_rfeU-a.d.mts} +1 -1
- package/dist/{transport-CAwTaTp_.d.mts.map → transport-B_rfeU-a.d.mts.map} +1 -1
- package/dist/{trusted-proxy-D20_7fyX.mjs → trusted-proxy-CEVekpby.mjs} +1 -1
- package/dist/{trusted-proxy-D20_7fyX.mjs.map → trusted-proxy-CEVekpby.mjs.map} +1 -1
- package/dist/{types-NBI3rF-_.mjs → types-75KIqzL9.mjs} +18 -2
- package/dist/types-75KIqzL9.mjs.map +1 -0
- package/dist/{types-CbUcuxxc.d.mts → types-BPuloofb.d.mts} +1 -1
- package/dist/{types-CbUcuxxc.d.mts.map → types-BPuloofb.d.mts.map} +1 -1
- package/dist/{types-BjxTKxrZ.mjs → types-BW1syrlw.mjs} +1 -1
- package/dist/{types-BjxTKxrZ.mjs.map → types-BW1syrlw.mjs.map} +1 -1
- package/dist/{types-BnFP1M3J.d.mts → types-C3_AbkDP.d.mts} +32 -10
- package/dist/types-C3_AbkDP.d.mts.map +1 -0
- package/dist/{types-Dc4ntQjQ.d.mts → types-CAGdePf3.d.mts} +124 -1
- package/dist/types-CAGdePf3.d.mts.map +1 -0
- package/dist/{types-DLG4IFEQ.d.mts → types-CFUfyt1s.d.mts} +1 -1
- package/dist/{types-DLG4IFEQ.d.mts.map → types-CFUfyt1s.d.mts.map} +1 -1
- package/dist/{types-LoagAGzH.d.mts → types-CPx2lIGo.d.mts} +1 -1
- package/dist/{types-LoagAGzH.d.mts.map → types-CPx2lIGo.d.mts.map} +1 -1
- package/dist/{types-Cd8iuS1J.mjs → types-CQPWhPxE.mjs} +9 -12
- package/dist/types-CQPWhPxE.mjs.map +1 -0
- package/dist/{types-Cz8hNch2.d.mts → types-Cs-TFLNf.d.mts} +25 -5
- package/dist/types-Cs-TFLNf.d.mts.map +1 -0
- package/dist/types-CtzytVXn.mjs.map +1 -1
- package/dist/{types-BGWPMiBO.d.mts → types-D4_1Ga4L.d.mts} +44 -5
- package/dist/types-D4_1Ga4L.d.mts.map +1 -0
- package/dist/{types-C8oz_ayJ.d.mts → types-DefV3OiO.d.mts} +1 -1
- package/dist/{types-C8oz_ayJ.d.mts.map → types-DefV3OiO.d.mts.map} +1 -1
- package/dist/{types-BK6U01Ro.d.mts → types-X0MThr7x.d.mts} +1 -1
- package/dist/{types-BK6U01Ro.d.mts.map → types-X0MThr7x.d.mts.map} +1 -1
- package/dist/{upload-attempts-D8QAFLUJ.mjs → upload-attempts-hlne3iA1.mjs} +1 -1
- package/dist/{upload-attempts-D8QAFLUJ.mjs.map → upload-attempts-hlne3iA1.mjs.map} +1 -1
- package/dist/url-pattern-BHS0V5Ng.mjs +33 -0
- package/dist/url-pattern-BHS0V5Ng.mjs.map +1 -0
- package/dist/{user-DBrq4UVq.mjs → user-sHgJ62SP.mjs} +3 -3
- package/dist/{user-DBrq4UVq.mjs.map → user-sHgJ62SP.mjs.map} +1 -1
- package/dist/{utils-hLzi_2Fn.mjs → utils-D4vD_Y98.mjs} +3 -3
- package/dist/{utils-hLzi_2Fn.mjs.map → utils-D4vD_Y98.mjs.map} +1 -1
- package/dist/{validate-mKo3RxBM.mjs → validate-BkqIG_Uj.mjs} +24 -5
- package/dist/validate-BkqIG_Uj.mjs.map +1 -0
- package/dist/{validate-C3oSmA7F.d.mts → validate-DeGtBN84.d.mts} +15 -7
- package/dist/validate-DeGtBN84.d.mts.map +1 -0
- package/dist/{validation-BgpucsvF.mjs → validation-CiJb_X5o.mjs} +11 -10
- package/dist/{validation-BgpucsvF.mjs.map → validation-CiJb_X5o.mjs.map} +1 -1
- package/dist/version-x0NjTScG.mjs +7 -0
- package/dist/{version-C4PnpmoV.mjs.map → version-x0NjTScG.mjs.map} +1 -1
- package/dist/{widgets-CJJtkiKh.mjs → widgets-Cwzvww0W.mjs} +3 -3
- package/dist/{widgets-CJJtkiKh.mjs.map → widgets-Cwzvww0W.mjs.map} +1 -1
- package/dist/{wxr-taxonomies-Bkpp_2tK.d.mts → wxr-taxonomies-CmC0ZsDr.d.mts} +1 -1
- package/dist/{wxr-taxonomies-Bkpp_2tK.d.mts.map → wxr-taxonomies-CmC0ZsDr.d.mts.map} +1 -1
- package/dist/{wxr-taxonomies-9PPSy8X6.mjs → wxr-taxonomies-QZjWxjyk.mjs} +13 -32
- package/dist/{wxr-taxonomies-9PPSy8X6.mjs.map → wxr-taxonomies-QZjWxjyk.mjs.map} +1 -1
- package/dist/{zod-generator-CG64Hnbh.mjs → zod-generator-D11MhxG4.mjs} +52 -5
- package/dist/zod-generator-D11MhxG4.mjs.map +1 -0
- package/package.json +16 -8
- package/src/api/errors.ts +12 -0
- package/src/api/handlers/content.ts +127 -29
- package/src/api/handlers/dashboard.ts +12 -2
- package/src/api/handlers/index.ts +16 -0
- package/src/api/handlers/manifest.ts +2 -0
- package/src/api/handlers/media-allowlist.ts +13 -2
- package/src/api/handlers/media-usage-work.ts +188 -0
- package/src/api/handlers/media-usage.ts +5 -3
- package/src/api/handlers/schema.ts +9 -3
- package/src/api/handlers/seo.ts +5 -2
- package/src/api/handlers/taxonomies.ts +345 -82
- package/src/api/media-usage-write-fence.ts +64 -0
- package/src/api/openapi/document.ts +199 -0
- package/src/api/schemas/common.ts +3 -1
- package/src/api/schemas/content.ts +122 -1
- package/src/api/schemas/media-usage.ts +133 -0
- package/src/api/schemas/schema.ts +78 -3
- package/src/api/schemas/taxonomies.ts +40 -8
- package/src/api/types.ts +1 -0
- package/src/astro/integration/index.ts +55 -42
- package/src/astro/integration/routes.ts +34 -4
- package/src/astro/integration/runtime.ts +15 -0
- package/src/astro/integration/virtual-modules.ts +25 -1
- package/src/astro/integration/vite-config.ts +16 -1
- package/src/astro/middleware/media-usage-write-fence.ts +30 -0
- package/src/astro/middleware/redirect.ts +12 -2
- package/src/astro/middleware.ts +75 -8
- package/src/astro/routes/api/admin/media-usage/collection-deletions/index.ts +22 -0
- package/src/astro/routes/api/admin/media-usage/collection-deletions/retry.ts +22 -0
- package/src/astro/routes/api/admin/media-usage/work/index.ts +26 -0
- package/src/astro/routes/api/admin/media-usage/work/retry.ts +26 -0
- package/src/astro/routes/api/admin/plugins/[id]/disable.ts +4 -0
- package/src/astro/routes/api/admin/plugins/[id]/enable.ts +4 -0
- package/src/astro/routes/api/admin/plugins/[id]/uninstall.ts +4 -0
- package/src/astro/routes/api/admin/plugins/[id]/update.ts +4 -0
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/install.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/[id]/uninstall.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/[id]/update.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/install.ts +4 -0
- package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +67 -31
- package/src/astro/routes/api/import/wordpress/execute.ts +3 -10
- package/src/astro/routes/api/mcp.ts +1 -0
- package/src/astro/routes/api/plugins/[pluginId]/[...path].ts +7 -1
- package/src/astro/routes/api/schema/collections/[slug]/index.ts +1 -7
- package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +1 -0
- package/src/astro/routes/api/taxonomies/[name]/translations.ts +48 -0
- package/src/astro/routes/api/taxonomies/[name].ts +102 -0
- package/src/astro/types.ts +25 -4
- package/src/cleanup.ts +6 -12
- package/src/cli/commands/doctor.ts +193 -6
- package/src/cli/commands/export-seed.ts +4 -1
- package/src/client/index.ts +119 -0
- package/src/components/Block.astro +12 -0
- package/src/components/InlinePortableTextEditor.tsx +89 -1
- package/src/content/converters/mark-safety.ts +120 -0
- package/src/content/converters/portable-text-to-prosemirror.ts +25 -16
- package/src/content/converters/prosemirror-to-portable-text.ts +12 -2
- package/src/content-list-query.ts +29 -0
- package/src/database/migrations/060_collection_admin_config.ts +16 -0
- package/src/database/migrations/061_media_usage_cleanup.ts +77 -0
- package/src/database/migrations/062_media_usage_cleanup_fence.ts +295 -0
- package/src/database/migrations/063_media_usage_incremental_work.ts +397 -0
- package/src/database/migrations/064_fts_plain_text.ts +253 -0
- package/src/database/migrations/065_media_usage_collection_deletion.ts +85 -0
- package/src/database/migrations/066_media_usage_reconciliation.ts +115 -0
- package/src/database/migrations/067_indexed_content_fields.ts +39 -0
- package/src/database/migrations/068_content_taxonomy_entry_groups.ts +61 -0
- package/src/database/migrations/069_collection_title_date_fields.ts +45 -0
- package/src/database/migrations/070_collection_routable.ts +18 -0
- package/src/database/migrations/runner.ts +22 -0
- package/src/database/repositories/content.ts +861 -96
- package/src/database/repositories/media-usage-work.ts +848 -0
- package/src/database/repositories/media-usage.ts +1502 -138
- package/src/database/repositories/revision.ts +17 -6
- package/src/database/repositories/taxonomy.ts +234 -103
- package/src/database/repositories/types.ts +51 -2
- package/src/database/types.ts +134 -16
- package/src/db/adapters.ts +28 -0
- package/src/db/index.ts +3 -0
- package/src/emdash-runtime.ts +227 -20
- package/src/fields/file.ts +7 -4
- package/src/fields/image.ts +8 -1
- package/src/fields/types.ts +18 -5
- package/src/i18n/config.ts +32 -0
- package/src/i18n/repair-locale-casing.ts +0 -14
- package/src/i18n/taxonomy-locale-diagnostic.ts +47 -0
- package/src/import/wxr-taxonomies.ts +7 -47
- package/src/index.ts +25 -2
- package/src/loader.ts +119 -65
- package/src/mcp/server.ts +242 -34
- package/src/media/usage/activation.ts +626 -0
- package/src/media/usage/capture-triggers.ts +543 -0
- package/src/media/usage/cleanup.ts +305 -0
- package/src/media/usage/collection-deletion-processor.ts +356 -0
- package/src/media/usage/collection-deletion.ts +836 -0
- package/src/media/usage/content-fields.ts +40 -3
- package/src/media/usage/content-refresh.ts +356 -47
- package/src/media/usage/content-repair.ts +180 -61
- package/src/media/usage/content-snapshots.ts +85 -105
- package/src/media/usage/projection-fingerprint.ts +129 -0
- package/src/media/usage/reconciliation-processor.ts +372 -0
- package/src/media/usage/reconciliation.ts +1117 -0
- package/src/media/usage/source-key.ts +4 -0
- package/src/media/usage/types.ts +2 -0
- package/src/media/usage/work-processor.ts +248 -0
- package/src/menus/index.ts +246 -141
- package/src/plugin-types.ts +8 -0
- package/src/plugins/adapt-sandbox-entry.ts +24 -5
- package/src/plugins/context.ts +24 -7
- package/src/plugins/index.ts +9 -0
- package/src/plugins/routes.ts +43 -1
- package/src/plugins/sandbox/index.ts +10 -1
- package/src/plugins/sandbox/types.ts +78 -1
- package/src/plugins/scheduler/node.ts +13 -1
- package/src/plugins/scheduler/types.ts +2 -0
- package/src/plugins/types.ts +39 -2
- package/src/query.ts +29 -37
- package/src/scheduler-health.ts +46 -0
- package/src/schema/registry.ts +777 -255
- package/src/schema/types.ts +50 -8
- package/src/schema/url-pattern.ts +33 -0
- package/src/schema/zod-generator.ts +77 -5
- package/src/search/fts-manager.ts +117 -76
- package/src/search/query.ts +32 -11
- package/src/search/types.ts +2 -0
- package/src/seed/apply.ts +68 -15
- package/src/seed/types.ts +11 -3
- package/src/seed/validate.ts +52 -2
- package/src/taxonomies/index.ts +77 -75
- package/src/taxonomies/term-counts.ts +21 -8
- package/src/utils/slugify.ts +1 -29
- package/src/virtual-modules.d.ts +16 -0
- package/dist/adapters-BMyNSSZi.d.mts.map +0 -1
- package/dist/api-D2hunekQ.mjs.map +0 -1
- package/dist/apply-kwNEJW2l.mjs.map +0 -1
- package/dist/config-DyF3OKg_.mjs.map +0 -1
- package/dist/content-CJ94NEx5.mjs.map +0 -1
- package/dist/content-refresh-Xw7aKmou.mjs +0 -1629
- package/dist/content-refresh-Xw7aKmou.mjs.map +0 -1
- package/dist/context-C_1nrqnW.mjs.map +0 -1
- package/dist/dashboard-DINnNVVU.mjs.map +0 -1
- package/dist/errors-BucQ8VYz.mjs.map +0 -1
- package/dist/fts-manager-BITakW_R.mjs.map +0 -1
- package/dist/index-M37iz29I.d.mts.map +0 -1
- package/dist/index-MGw47uWq.d.mts.map +0 -1
- package/dist/loader-CGugY7Zl.mjs.map +0 -1
- package/dist/media-OhYL-7Io.mjs.map +0 -1
- package/dist/media-allowlist-D-peH1H5.mjs.map +0 -1
- package/dist/media-usage-BlxfTkN0.mjs.map +0 -1
- package/dist/menus-Y54RDPIN.mjs.map +0 -1
- package/dist/options-CA4eVX6P.d.mts.map +0 -1
- package/dist/query-C5w7PsRQ.mjs.map +0 -1
- package/dist/redirects-G8wAhWAf.mjs.map +0 -1
- package/dist/registry-Dbodb4Uo.mjs +0 -840
- package/dist/registry-Dbodb4Uo.mjs.map +0 -1
- package/dist/relations-G2ta7GIl.d.mts.map +0 -1
- package/dist/runner-BFTrkYhu.mjs.map +0 -1
- package/dist/search-FZhx5dDU.mjs.map +0 -1
- package/dist/seo-CobNfOvb.mjs.map +0 -1
- package/dist/slugify-C_tqlU4G.mjs +0 -30
- package/dist/slugify-C_tqlU4G.mjs.map +0 -1
- package/dist/taxonomies-CKuaZER5.mjs.map +0 -1
- package/dist/taxonomies-CLN1N92E.mjs.map +0 -1
- package/dist/taxonomy-pOrB2kZe.mjs.map +0 -1
- package/dist/types-BGWPMiBO.d.mts.map +0 -1
- package/dist/types-BnFP1M3J.d.mts.map +0 -1
- package/dist/types-Cd8iuS1J.mjs.map +0 -1
- package/dist/types-Cz8hNch2.d.mts.map +0 -1
- package/dist/types-Dc4ntQjQ.d.mts.map +0 -1
- package/dist/types-NBI3rF-_.mjs.map +0 -1
- package/dist/validate-C3oSmA7F.d.mts.map +0 -1
- package/dist/validate-mKo3RxBM.mjs.map +0 -1
- package/dist/version-C4PnpmoV.mjs +0 -7
- package/dist/zod-generator-CG64Hnbh.mjs.map +0 -1
- /package/dist/{api-tokens-Dai9dND0.mjs → api-tokens-CyTsLszZ.mjs} +0 -0
- /package/dist/{ssrf-Cj568Dgs.mjs → ssrf-DpXgKsna.mjs} +0 -0
- /package/dist/{types-DKuWPYV5.mjs → types-CP1CflWf.mjs} +0 -0
|
@@ -5,22 +5,25 @@
|
|
|
5
5
|
import type { Kysely } from "kysely";
|
|
6
6
|
import { sql } from "kysely";
|
|
7
7
|
|
|
8
|
+
import type { ContentFieldFilters } from "../../content-list-query.js";
|
|
8
9
|
import { isSqlite } from "../../database/dialect-helpers.js";
|
|
9
10
|
import { BylineRepository } from "../../database/repositories/byline.js";
|
|
10
11
|
import type { ContentBylineInput } from "../../database/repositories/byline.js";
|
|
11
12
|
import { CommentRepository } from "../../database/repositories/comment.js";
|
|
12
|
-
import { ContentRepository } from "../../database/repositories/content.js";
|
|
13
|
+
import { ContentRepository, isSystemOrderField } from "../../database/repositories/content.js";
|
|
13
14
|
import { RedirectRepository } from "../../database/repositories/redirect.js";
|
|
14
15
|
import { RevisionRepository } from "../../database/repositories/revision.js";
|
|
15
16
|
import { SeoRepository } from "../../database/repositories/seo.js";
|
|
16
17
|
import { TaxonomyRepository } from "../../database/repositories/taxonomy.js";
|
|
17
18
|
import {
|
|
19
|
+
ContentCollectionNotFoundError,
|
|
18
20
|
ContentMutationConflictError,
|
|
19
21
|
EmDashValidationError,
|
|
20
22
|
ScheduledNotDueError,
|
|
21
23
|
InvalidCursorError,
|
|
22
24
|
type BylineSummary,
|
|
23
25
|
type ContentBylineCredit,
|
|
26
|
+
type ContentBylineFilter,
|
|
24
27
|
type ContentDateField,
|
|
25
28
|
type ContentItem,
|
|
26
29
|
type ContentSeo,
|
|
@@ -87,6 +90,28 @@ async function collectionHasSeo(db: Kysely<Database>, collection: string): Promi
|
|
|
87
90
|
return row?.has_seo === 1;
|
|
88
91
|
}
|
|
89
92
|
|
|
93
|
+
async function getCollectionPublishConfig(
|
|
94
|
+
db: Kysely<Database>,
|
|
95
|
+
collection: string,
|
|
96
|
+
): Promise<{ supportsRevisions: boolean; routable: boolean }> {
|
|
97
|
+
const row = await db
|
|
98
|
+
.selectFrom("_emdash_collections")
|
|
99
|
+
.select(["supports", "routable"])
|
|
100
|
+
.where("slug", "=", collection)
|
|
101
|
+
.executeTakeFirst();
|
|
102
|
+
const supports: unknown = row?.supports ? JSON.parse(row.supports) : [];
|
|
103
|
+
return {
|
|
104
|
+
supportsRevisions: Array.isArray(supports) && supports.includes("revisions"),
|
|
105
|
+
routable: row?.routable !== 0,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function requireRoutablePublishSlug(routable: boolean, slug: string | null | undefined): void {
|
|
110
|
+
if (routable && !slug?.trim()) {
|
|
111
|
+
throw new EmDashValidationError("Cannot publish routable content without a slug");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
90
115
|
/**
|
|
91
116
|
* Hydrate SEO data on a single content item if the collection has SEO enabled.
|
|
92
117
|
*/
|
|
@@ -314,30 +339,39 @@ export interface TrashedContentItem {
|
|
|
314
339
|
|
|
315
340
|
/**
|
|
316
341
|
* Resolve the columns a content-list search should match against. Always
|
|
317
|
-
* includes `slug` (a standard column)
|
|
318
|
-
* fields when the collection actually defines them,
|
|
319
|
-
* item-title resolution (title -> name ->
|
|
320
|
-
*
|
|
342
|
+
* includes `slug` (a standard column), adds the configured `titleField` plus
|
|
343
|
+
* the `title`/`name` display fields when the collection actually defines them,
|
|
344
|
+
* mirroring the admin's item-title resolution (titleField -> title -> name ->
|
|
345
|
+
* slug), and includes every field explicitly marked searchable. Returning only
|
|
346
|
+
* schema-backed columns avoids "no such column" errors.
|
|
321
347
|
*/
|
|
322
348
|
async function resolveSearchColumns(db: Kysely<Database>, collection: string): Promise<string[]> {
|
|
323
|
-
const columns = ["slug"];
|
|
324
349
|
const row = await db
|
|
325
350
|
.selectFrom("_emdash_collections")
|
|
326
|
-
.select("id")
|
|
351
|
+
.select(["id", "title_field"])
|
|
327
352
|
.where("slug", "=", collection)
|
|
328
353
|
.executeTakeFirst();
|
|
329
|
-
if (!row) return
|
|
354
|
+
if (!row) return ["slug"];
|
|
330
355
|
|
|
331
356
|
const fields = await db
|
|
332
357
|
.selectFrom("_emdash_fields")
|
|
333
|
-
.select("slug")
|
|
358
|
+
.select(["slug", "searchable"])
|
|
334
359
|
.where("collection_id", "=", row.id)
|
|
360
|
+
.orderBy("sort_order", "asc")
|
|
335
361
|
.execute();
|
|
362
|
+
const columns = new Set(["slug"]);
|
|
336
363
|
const fieldSlugs = new Set(fields.map((f) => f.slug));
|
|
364
|
+
|
|
365
|
+
// A configured titleField takes precedence, then the conventional
|
|
366
|
+
// title/name fields. A null title_field falls through to those defaults.
|
|
367
|
+
if (row.title_field && fieldSlugs.has(row.title_field)) columns.add(row.title_field);
|
|
337
368
|
for (const candidate of ["title", "name"]) {
|
|
338
|
-
if (fieldSlugs.has(candidate)) columns.
|
|
369
|
+
if (fieldSlugs.has(candidate)) columns.add(candidate);
|
|
339
370
|
}
|
|
340
|
-
|
|
371
|
+
for (const field of fields) {
|
|
372
|
+
if (field.searchable === 1) columns.add(field.slug);
|
|
373
|
+
}
|
|
374
|
+
return [...columns];
|
|
341
375
|
}
|
|
342
376
|
|
|
343
377
|
/**
|
|
@@ -439,6 +473,27 @@ function normalizeDateBound(value: string | undefined, edge: "start" | "end"): s
|
|
|
439
473
|
return edge === "start" ? `${value}T00:00:00.000Z` : `${value}T23:59:59.999Z`;
|
|
440
474
|
}
|
|
441
475
|
|
|
476
|
+
/**
|
|
477
|
+
* Build the repository's byline filter from the wire params.
|
|
478
|
+
*
|
|
479
|
+
* `locale` is the locale the list is scoped to, which is the locale an
|
|
480
|
+
* inferred credit has to resolve at — the admin list is always scoped to the
|
|
481
|
+
* locale picked in its switcher.
|
|
482
|
+
*/
|
|
483
|
+
function resolveBylineFilter(
|
|
484
|
+
params: { bylines?: string[]; bylinesNone?: boolean; includeInferredBylines?: boolean },
|
|
485
|
+
locale: string | undefined,
|
|
486
|
+
): ContentBylineFilter | undefined {
|
|
487
|
+
const includeInferred = params.includeInferredBylines === true;
|
|
488
|
+
|
|
489
|
+
if (params.bylinesNone) return { mode: "none", includeInferred, locale };
|
|
490
|
+
|
|
491
|
+
const bylineIds = params.bylines ?? [];
|
|
492
|
+
if (bylineIds.length === 0) return undefined;
|
|
493
|
+
|
|
494
|
+
return { mode: "any", bylineIds, includeInferred, locale };
|
|
495
|
+
}
|
|
496
|
+
|
|
442
497
|
/**
|
|
443
498
|
* Create content list handler
|
|
444
499
|
*/
|
|
@@ -457,14 +512,25 @@ export async function handleContentList(
|
|
|
457
512
|
dateField?: ContentDateField;
|
|
458
513
|
dateFrom?: string;
|
|
459
514
|
dateTo?: string;
|
|
515
|
+
bylines?: string[];
|
|
516
|
+
bylinesNone?: boolean;
|
|
517
|
+
includeInferredBylines?: boolean;
|
|
518
|
+
fieldFilters?: ContentFieldFilters;
|
|
460
519
|
},
|
|
461
520
|
): Promise<ApiResult<ContentListResponse>> {
|
|
462
521
|
try {
|
|
463
522
|
const repo = new ContentRepository(db);
|
|
464
523
|
const where: FindManyOptions["where"] = {};
|
|
465
524
|
if (params.status) where.status = params.status;
|
|
466
|
-
|
|
525
|
+
const locale = params.locale ? resolveConfiguredLocale(params.locale) : undefined;
|
|
526
|
+
if (locale) where.locale = locale;
|
|
467
527
|
if (params.authorId) where.authorId = params.authorId;
|
|
528
|
+
if (params.fieldFilters && Object.keys(params.fieldFilters).length > 0) {
|
|
529
|
+
where.fieldFilters = params.fieldFilters;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
const bylineFilter = resolveBylineFilter(params, locale);
|
|
533
|
+
if (bylineFilter) where.bylineFilter = bylineFilter;
|
|
468
534
|
|
|
469
535
|
// A date range requires a target column; ignore stray from/to without
|
|
470
536
|
// a field so a half-specified filter doesn't silently drop all rows.
|
|
@@ -483,6 +549,21 @@ export async function handleContentList(
|
|
|
483
549
|
where.useFts = await canUseFtsForListFilter(db, collection, where.searchColumns);
|
|
484
550
|
}
|
|
485
551
|
|
|
552
|
+
// Sorting by a non-system field (a collection's titleField/dateField)
|
|
553
|
+
// needs the collection's *actual* sort fields resolved server-side,
|
|
554
|
+
// so the orderBy set stays closed. Only query when it's not a system field.
|
|
555
|
+
let sortableExtras: string[] | undefined;
|
|
556
|
+
if (params.orderBy && !isSystemOrderField(params.orderBy)) {
|
|
557
|
+
const coll = await db
|
|
558
|
+
.selectFrom("_emdash_collections")
|
|
559
|
+
.select(["title_field", "date_field"])
|
|
560
|
+
.where("slug", "=", collection)
|
|
561
|
+
.executeTakeFirst();
|
|
562
|
+
sortableExtras = [coll?.title_field, coll?.date_field].filter(
|
|
563
|
+
(slug): slug is string => !!slug,
|
|
564
|
+
);
|
|
565
|
+
}
|
|
566
|
+
|
|
486
567
|
const result = await repo.findMany(collection, {
|
|
487
568
|
cursor: params.cursor,
|
|
488
569
|
limit: params.limit || 50,
|
|
@@ -490,6 +571,7 @@ export async function handleContentList(
|
|
|
490
571
|
orderBy: params.orderBy
|
|
491
572
|
? { field: params.orderBy, direction: params.order || "desc" }
|
|
492
573
|
: undefined,
|
|
574
|
+
sortableExtras,
|
|
493
575
|
});
|
|
494
576
|
|
|
495
577
|
// Hydrate SEO data if the collection has SEO enabled
|
|
@@ -512,7 +594,7 @@ export async function handleContentList(
|
|
|
512
594
|
error: { code: "INVALID_CURSOR", message: error.message },
|
|
513
595
|
};
|
|
514
596
|
}
|
|
515
|
-
if (isMissingTableError(error)) {
|
|
597
|
+
if (error instanceof ContentCollectionNotFoundError || isMissingTableError(error)) {
|
|
516
598
|
return {
|
|
517
599
|
success: false,
|
|
518
600
|
error: {
|
|
@@ -713,7 +795,7 @@ export async function handleContentCreate(
|
|
|
713
795
|
collection: string,
|
|
714
796
|
body: {
|
|
715
797
|
data: Record<string, unknown>;
|
|
716
|
-
slug?: string;
|
|
798
|
+
slug?: string | null;
|
|
717
799
|
status?: string;
|
|
718
800
|
authorId?: string;
|
|
719
801
|
bylines?: ContentBylineInput[];
|
|
@@ -761,6 +843,10 @@ export async function handleContentCreate(
|
|
|
761
843
|
slug = await repo.generateUniqueSlug(collection, slugSource, effectiveLocale);
|
|
762
844
|
}
|
|
763
845
|
}
|
|
846
|
+
if (body.status === "published") {
|
|
847
|
+
const publishConfig = await getCollectionPublishConfig(trx, collection);
|
|
848
|
+
requireRoutablePublishSlug(publishConfig.routable, slug);
|
|
849
|
+
}
|
|
764
850
|
|
|
765
851
|
const created = await repo.create({
|
|
766
852
|
type: collection,
|
|
@@ -784,22 +870,12 @@ export async function handleContentCreate(
|
|
|
784
870
|
created.primaryBylineId = credits[0]?.byline.translationGroup ?? null;
|
|
785
871
|
}
|
|
786
872
|
|
|
787
|
-
//
|
|
788
|
-
//
|
|
789
|
-
// pivots store translation_groups (taxonomies post-mig 036,
|
|
790
|
-
// bylines post-mig 040), so a copied row applies across every
|
|
791
|
-
// locale of the credited identity — and the locale-strict
|
|
792
|
-
// hydration below renders the variant that matches the entry's
|
|
793
|
-
// locale (or nothing if no variant exists yet at this locale,
|
|
794
|
-
// which is the documented Phase 4 behaviour).
|
|
795
|
-
//
|
|
873
|
+
// Taxonomy assignments already belong to the content translation
|
|
874
|
+
// group. Byline credits remain per content row and need copying.
|
|
796
875
|
// Explicit `body.bylines` wins — `copyContentBylines` no-ops
|
|
797
876
|
// when the target already has credits, but the cleaner guard
|
|
798
877
|
// is to skip the call entirely.
|
|
799
878
|
if (body.translationOf) {
|
|
800
|
-
const taxRepo = new TaxonomyRepository(trx);
|
|
801
|
-
await taxRepo.copyEntryTerms(collection, body.translationOf, created.id);
|
|
802
|
-
|
|
803
879
|
if (body.bylines === undefined) {
|
|
804
880
|
await bylineRepo.copyContentBylines(collection, body.translationOf, created.id);
|
|
805
881
|
// `copyContentBylines` writes the source's primary
|
|
@@ -905,7 +981,7 @@ export async function handleContentUpdate(
|
|
|
905
981
|
id: string,
|
|
906
982
|
body: {
|
|
907
983
|
data?: Record<string, unknown>;
|
|
908
|
-
slug?: string;
|
|
984
|
+
slug?: string | null;
|
|
909
985
|
status?: string;
|
|
910
986
|
authorId?: string | null;
|
|
911
987
|
bylines?: ContentBylineInput[];
|
|
@@ -949,7 +1025,9 @@ export async function handleContentUpdate(
|
|
|
949
1025
|
|
|
950
1026
|
// Read existing item once for both _rev check and old slug capture
|
|
951
1027
|
const existing =
|
|
952
|
-
body._rev || body.slug
|
|
1028
|
+
body._rev || body.slug !== undefined || body.status === "published"
|
|
1029
|
+
? await trxRepo.findById(collection, resolvedId)
|
|
1030
|
+
: null;
|
|
953
1031
|
|
|
954
1032
|
// Validate _rev if provided (optimistic concurrency)
|
|
955
1033
|
if (body._rev) {
|
|
@@ -973,6 +1051,18 @@ export async function handleContentUpdate(
|
|
|
973
1051
|
oldSlug = existing.slug;
|
|
974
1052
|
}
|
|
975
1053
|
|
|
1054
|
+
const resultingStatus = body.status ?? existing?.status;
|
|
1055
|
+
if (resultingStatus === "published") {
|
|
1056
|
+
if (!existing) {
|
|
1057
|
+
throw Object.assign(new Error(`Content item not found: ${id}`), {
|
|
1058
|
+
apiError: { code: "NOT_FOUND" as const },
|
|
1059
|
+
});
|
|
1060
|
+
}
|
|
1061
|
+
const publishConfig = await getCollectionPublishConfig(trx, collection);
|
|
1062
|
+
const intendedSlug = body.slug !== undefined ? body.slug : existing.slug;
|
|
1063
|
+
requireRoutablePublishSlug(publishConfig.routable, intendedSlug);
|
|
1064
|
+
}
|
|
1065
|
+
|
|
976
1066
|
const updated = await trxRepo.update(collection, resolvedId, {
|
|
977
1067
|
data: body.data,
|
|
978
1068
|
slug: body.slug,
|
|
@@ -1400,7 +1490,12 @@ export async function handleContentSchedule(
|
|
|
1400
1490
|
try {
|
|
1401
1491
|
const item = await withTransaction(db, async (trx) => {
|
|
1402
1492
|
const repo = new ContentRepository(trx);
|
|
1403
|
-
const
|
|
1493
|
+
const existing = await repo.findByIdOrSlug(collection, id);
|
|
1494
|
+
const resolvedId = existing?.id ?? id;
|
|
1495
|
+
if (existing) {
|
|
1496
|
+
const publishConfig = await getCollectionPublishConfig(trx, collection);
|
|
1497
|
+
requireRoutablePublishSlug(publishConfig.routable, existing.slug);
|
|
1498
|
+
}
|
|
1404
1499
|
return repo.schedule(collection, resolvedId, scheduledAt);
|
|
1405
1500
|
});
|
|
1406
1501
|
|
|
@@ -1495,6 +1590,7 @@ export async function handleContentPublish(
|
|
|
1495
1590
|
const item = await withTransaction(db, async (trx) => {
|
|
1496
1591
|
const repo = new ContentRepository(trx);
|
|
1497
1592
|
const resolvedId = (await resolveId(repo, collection, id)) ?? id;
|
|
1593
|
+
const publishConfig = await getCollectionPublishConfig(trx, collection);
|
|
1498
1594
|
|
|
1499
1595
|
// Capture the pre-publish state. For revision-supporting collections a
|
|
1500
1596
|
// slug edit is staged as `_slug` in the draft revision and only lands
|
|
@@ -1509,6 +1605,8 @@ export async function handleContentPublish(
|
|
|
1509
1605
|
options.publishedAt,
|
|
1510
1606
|
options.requireScheduledDue,
|
|
1511
1607
|
options.expectedScheduledAt,
|
|
1608
|
+
publishConfig.supportsRevisions,
|
|
1609
|
+
publishConfig.routable,
|
|
1512
1610
|
);
|
|
1513
1611
|
|
|
1514
1612
|
// Leave a 301 behind when publishing changed the slug of an entry that
|
|
@@ -13,6 +13,7 @@ import { MediaRepository } from "../../database/repositories/media.js";
|
|
|
13
13
|
import { UserRepository } from "../../database/repositories/user.js";
|
|
14
14
|
import type { Database } from "../../database/types.js";
|
|
15
15
|
import { validateIdentifier } from "../../database/validate.js";
|
|
16
|
+
import { getSchedulerHealth, type SchedulerHealth } from "../../scheduler-health.js";
|
|
16
17
|
import type { ApiResult } from "../types.js";
|
|
17
18
|
|
|
18
19
|
export interface CollectionStats {
|
|
@@ -22,6 +23,7 @@ export interface CollectionStats {
|
|
|
22
23
|
published: number;
|
|
23
24
|
draft: number;
|
|
24
25
|
scheduled: number;
|
|
26
|
+
overdueScheduled: number;
|
|
25
27
|
}
|
|
26
28
|
|
|
27
29
|
export interface RecentItem {
|
|
@@ -40,6 +42,7 @@ export interface DashboardStats {
|
|
|
40
42
|
mediaCount: number;
|
|
41
43
|
userCount: number;
|
|
42
44
|
recentItems: RecentItem[];
|
|
45
|
+
schedulerHealth: SchedulerHealth;
|
|
43
46
|
}
|
|
44
47
|
|
|
45
48
|
/**
|
|
@@ -50,6 +53,7 @@ export interface DashboardStats {
|
|
|
50
53
|
*/
|
|
51
54
|
export async function handleDashboardStats(
|
|
52
55
|
db: Kysely<Database>,
|
|
56
|
+
now = new Date(),
|
|
53
57
|
): Promise<ApiResult<DashboardStats>> {
|
|
54
58
|
try {
|
|
55
59
|
// Discover collections from the system table
|
|
@@ -63,7 +67,7 @@ export async function handleDashboardStats(
|
|
|
63
67
|
const contentRepo = new ContentRepository(db);
|
|
64
68
|
const collectionStats: CollectionStats[] = await Promise.all(
|
|
65
69
|
collections.map(async (col) => {
|
|
66
|
-
const stats = await contentRepo.getStats(col.slug);
|
|
70
|
+
const stats = await contentRepo.getStats(col.slug, now);
|
|
67
71
|
return {
|
|
68
72
|
slug: col.slug,
|
|
69
73
|
label: col.label,
|
|
@@ -71,6 +75,7 @@ export async function handleDashboardStats(
|
|
|
71
75
|
published: stats.published,
|
|
72
76
|
draft: stats.draft,
|
|
73
77
|
scheduled: stats.scheduled,
|
|
78
|
+
overdueScheduled: stats.overdueScheduled,
|
|
74
79
|
};
|
|
75
80
|
}),
|
|
76
81
|
);
|
|
@@ -78,7 +83,11 @@ export async function handleDashboardStats(
|
|
|
78
83
|
// Media and user counts
|
|
79
84
|
const mediaRepo = new MediaRepository(db);
|
|
80
85
|
const userRepo = new UserRepository(db);
|
|
81
|
-
const [mediaCount, userCount] = await Promise.all([
|
|
86
|
+
const [mediaCount, userCount, schedulerHealth] = await Promise.all([
|
|
87
|
+
mediaRepo.count(),
|
|
88
|
+
userRepo.count(),
|
|
89
|
+
getSchedulerHealth(db, now),
|
|
90
|
+
]);
|
|
82
91
|
|
|
83
92
|
// Recent items across all collections (last 10 updated, any status)
|
|
84
93
|
const recentItems = await fetchRecentItems(db, collections);
|
|
@@ -90,6 +99,7 @@ export async function handleDashboardStats(
|
|
|
90
99
|
mediaCount,
|
|
91
100
|
userCount,
|
|
92
101
|
recentItems,
|
|
102
|
+
schedulerHealth,
|
|
93
103
|
},
|
|
94
104
|
};
|
|
95
105
|
} catch (error) {
|
|
@@ -77,6 +77,16 @@ export {
|
|
|
77
77
|
type MediaUsageSummary,
|
|
78
78
|
} from "./media-usage.js";
|
|
79
79
|
|
|
80
|
+
export {
|
|
81
|
+
handleMediaUsageWorkList,
|
|
82
|
+
handleMediaUsageWorkRetry,
|
|
83
|
+
type MediaUsageWorkItem,
|
|
84
|
+
type MediaUsageWorkListQuery,
|
|
85
|
+
type MediaUsageWorkListResponse,
|
|
86
|
+
type MediaUsageWorkRetryRequest,
|
|
87
|
+
type MediaUsageWorkRetryResponse,
|
|
88
|
+
} from "./media-usage-work.js";
|
|
89
|
+
|
|
80
90
|
// Schema handlers
|
|
81
91
|
export {
|
|
82
92
|
handleSchemaCollectionList,
|
|
@@ -162,6 +172,10 @@ export { handleSettingsGet, handleSettingsUpdate } from "./settings.js";
|
|
|
162
172
|
// Taxonomy handlers
|
|
163
173
|
export {
|
|
164
174
|
handleTaxonomyList,
|
|
175
|
+
handleTaxonomyGet,
|
|
176
|
+
handleTaxonomyUpdate,
|
|
177
|
+
handleTaxonomyDelete,
|
|
178
|
+
handleTaxonomyDefTranslations,
|
|
165
179
|
handleTermList,
|
|
166
180
|
handleTermCreate,
|
|
167
181
|
handleTermGet,
|
|
@@ -169,6 +183,8 @@ export {
|
|
|
169
183
|
handleTermDelete,
|
|
170
184
|
type TaxonomyDef,
|
|
171
185
|
type TaxonomyListResponse,
|
|
186
|
+
type TaxonomyResponse,
|
|
187
|
+
type TaxonomyDefTranslationsResponse,
|
|
172
188
|
type TermData,
|
|
173
189
|
type TermWithCount,
|
|
174
190
|
type TermListResponse,
|
|
@@ -19,6 +19,7 @@ interface CollectionDefinition {
|
|
|
19
19
|
label: string;
|
|
20
20
|
labelSingular?: string;
|
|
21
21
|
supports?: string[];
|
|
22
|
+
routable?: boolean;
|
|
22
23
|
};
|
|
23
24
|
}
|
|
24
25
|
type CollectionMap = Record<string, CollectionDefinition>;
|
|
@@ -46,6 +47,7 @@ export async function generateManifest(
|
|
|
46
47
|
label: definition.admin.label,
|
|
47
48
|
labelSingular: definition.admin.labelSingular || definition.admin.label,
|
|
48
49
|
supports: definition.admin.supports || [],
|
|
50
|
+
routable: definition.admin.routable ?? true,
|
|
49
51
|
fields,
|
|
50
52
|
};
|
|
51
53
|
}
|
|
@@ -6,10 +6,21 @@ import { parseAllowedMimeTypes } from "../../media/mime.js";
|
|
|
6
6
|
/**
|
|
7
7
|
* MIME types allowed for upload by default (when no field-specific list
|
|
8
8
|
* overrides this). Entries ending with "/" are prefix-matched (e.g.
|
|
9
|
-
* "
|
|
9
|
+
* "video/" matches "video/mp4", "video/webm", etc.).
|
|
10
|
+
*
|
|
11
|
+
* Image types are enumerated explicitly rather than using a bare "image/"
|
|
12
|
+
* prefix so that "image/svg+xml" is excluded by default: there is no
|
|
13
|
+
* upload-time content validation for SVG, so an unvalidated bare-prefix
|
|
14
|
+
* allowlist would let a Contributor+ upload an SVG with an embedded
|
|
15
|
+
* `<script>`. Fields that genuinely need SVG uploads can still opt in via
|
|
16
|
+
* their own `allowedMimeTypes` (see `resolveFieldAllowlist` below), which is
|
|
17
|
+
* unaffected by this default.
|
|
10
18
|
*/
|
|
11
19
|
export const GLOBAL_UPLOAD_ALLOWLIST: readonly string[] = [
|
|
12
|
-
"image/",
|
|
20
|
+
"image/png",
|
|
21
|
+
"image/jpeg",
|
|
22
|
+
"image/gif",
|
|
23
|
+
"image/webp",
|
|
13
24
|
"video/",
|
|
14
25
|
"audio/",
|
|
15
26
|
"application/pdf",
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import type { Kysely } from "kysely";
|
|
2
|
+
|
|
3
|
+
import { MediaUsageWorkRepository } from "../../database/repositories/media-usage-work.js";
|
|
4
|
+
import { InvalidCursorError } from "../../database/repositories/types.js";
|
|
5
|
+
import type { Database } from "../../database/types.js";
|
|
6
|
+
import { MediaUsageCollectionDeletionRepository } from "../../media/usage/collection-deletion.js";
|
|
7
|
+
import { ErrorCode } from "../errors.js";
|
|
8
|
+
import type {
|
|
9
|
+
MediaUsageWorkListQuery,
|
|
10
|
+
MediaUsageWorkListResponse,
|
|
11
|
+
MediaUsageWorkRetryRequest,
|
|
12
|
+
MediaUsageWorkRetryResponse,
|
|
13
|
+
MediaUsageCollectionDeletionListQuery,
|
|
14
|
+
MediaUsageCollectionDeletionListResponse,
|
|
15
|
+
MediaUsageCollectionDeletionRetryRequest,
|
|
16
|
+
MediaUsageCollectionDeletionRetryResponse,
|
|
17
|
+
} from "../schemas/media-usage.js";
|
|
18
|
+
import type { ApiResult } from "../types.js";
|
|
19
|
+
|
|
20
|
+
export type {
|
|
21
|
+
MediaUsageWorkItem,
|
|
22
|
+
MediaUsageWorkListQuery,
|
|
23
|
+
MediaUsageWorkListResponse,
|
|
24
|
+
MediaUsageWorkRetryRequest,
|
|
25
|
+
MediaUsageWorkRetryResponse,
|
|
26
|
+
} from "../schemas/media-usage.js";
|
|
27
|
+
|
|
28
|
+
export async function handleMediaUsageWorkList(
|
|
29
|
+
db: Kysely<Database>,
|
|
30
|
+
query: MediaUsageWorkListQuery,
|
|
31
|
+
): Promise<ApiResult<MediaUsageWorkListResponse>> {
|
|
32
|
+
try {
|
|
33
|
+
const page = await new MediaUsageWorkRepository(db).findOperatorPage({
|
|
34
|
+
collectionSlug: query.collection,
|
|
35
|
+
state: query.state,
|
|
36
|
+
cursor: query.cursor,
|
|
37
|
+
limit: query.limit,
|
|
38
|
+
});
|
|
39
|
+
if (!page) {
|
|
40
|
+
return {
|
|
41
|
+
success: false,
|
|
42
|
+
error: {
|
|
43
|
+
code: ErrorCode.COLLECTION_NOT_FOUND,
|
|
44
|
+
message: "Collection not found",
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return { success: true, data: page };
|
|
49
|
+
} catch (error) {
|
|
50
|
+
if (error instanceof InvalidCursorError) {
|
|
51
|
+
return {
|
|
52
|
+
success: false,
|
|
53
|
+
error: {
|
|
54
|
+
code: ErrorCode.INVALID_CURSOR,
|
|
55
|
+
message: "Invalid media usage work cursor",
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
console.error("[media-usage-work] list failed:", error);
|
|
60
|
+
return {
|
|
61
|
+
success: false,
|
|
62
|
+
error: {
|
|
63
|
+
code: ErrorCode.MEDIA_USAGE_WORK_LIST_ERROR,
|
|
64
|
+
message: "Failed to list media usage work",
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export async function handleMediaUsageCollectionDeletionList(
|
|
71
|
+
db: Kysely<Database>,
|
|
72
|
+
query: MediaUsageCollectionDeletionListQuery,
|
|
73
|
+
): Promise<ApiResult<MediaUsageCollectionDeletionListResponse>> {
|
|
74
|
+
try {
|
|
75
|
+
return {
|
|
76
|
+
success: true,
|
|
77
|
+
data: await new MediaUsageCollectionDeletionRepository(db).findOperatorPage(query),
|
|
78
|
+
};
|
|
79
|
+
} catch (error) {
|
|
80
|
+
if (error instanceof InvalidCursorError) {
|
|
81
|
+
return {
|
|
82
|
+
success: false,
|
|
83
|
+
error: { code: ErrorCode.INVALID_CURSOR, message: "Invalid cursor" },
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
console.error("[media-usage:collection-deletion] list failed:", error);
|
|
87
|
+
return {
|
|
88
|
+
success: false,
|
|
89
|
+
error: {
|
|
90
|
+
code: ErrorCode.MEDIA_USAGE_COLLECTION_DELETION_LIST_ERROR,
|
|
91
|
+
message: "Failed to list collection deletions",
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export async function handleMediaUsageCollectionDeletionRetry(
|
|
98
|
+
db: Kysely<Database>,
|
|
99
|
+
input: MediaUsageCollectionDeletionRetryRequest,
|
|
100
|
+
): Promise<ApiResult<MediaUsageCollectionDeletionRetryResponse>> {
|
|
101
|
+
try {
|
|
102
|
+
const result = await new MediaUsageCollectionDeletionRepository(db).retryOperatorDeletion(
|
|
103
|
+
input,
|
|
104
|
+
);
|
|
105
|
+
if (result.outcome === "pending") {
|
|
106
|
+
return { success: true, data: { changed: result.changed, item: result.item } };
|
|
107
|
+
}
|
|
108
|
+
if (result.outcome === "lease_active") {
|
|
109
|
+
return {
|
|
110
|
+
success: false,
|
|
111
|
+
error: {
|
|
112
|
+
code: ErrorCode.WORK_LEASE_ACTIVE,
|
|
113
|
+
message: "Collection deletion is currently leased",
|
|
114
|
+
details: { leaseExpiresAt: result.leaseExpiresAt },
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
success: false,
|
|
120
|
+
error: {
|
|
121
|
+
code: result.outcome === "not_found" ? ErrorCode.NOT_FOUND : ErrorCode.WORK_CHANGED,
|
|
122
|
+
message:
|
|
123
|
+
result.outcome === "not_found"
|
|
124
|
+
? "Collection deletion not found"
|
|
125
|
+
: "Collection deletion changed",
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
} catch (error) {
|
|
129
|
+
console.error("[media-usage:collection-deletion] retry failed:", error);
|
|
130
|
+
return {
|
|
131
|
+
success: false,
|
|
132
|
+
error: {
|
|
133
|
+
code: ErrorCode.MEDIA_USAGE_COLLECTION_DELETION_RETRY_ERROR,
|
|
134
|
+
message: "Failed to retry collection deletion",
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export async function handleMediaUsageWorkRetry(
|
|
141
|
+
db: Kysely<Database>,
|
|
142
|
+
input: MediaUsageWorkRetryRequest,
|
|
143
|
+
): Promise<ApiResult<MediaUsageWorkRetryResponse>> {
|
|
144
|
+
try {
|
|
145
|
+
const result = await new MediaUsageWorkRepository(db).retryOperatorWork(input);
|
|
146
|
+
switch (result.outcome) {
|
|
147
|
+
case "pending":
|
|
148
|
+
return {
|
|
149
|
+
success: true,
|
|
150
|
+
data: { changed: result.changed, item: result.work },
|
|
151
|
+
};
|
|
152
|
+
case "lease_active":
|
|
153
|
+
return {
|
|
154
|
+
success: false,
|
|
155
|
+
error: {
|
|
156
|
+
code: ErrorCode.WORK_LEASE_ACTIVE,
|
|
157
|
+
message: "Media usage work is currently leased",
|
|
158
|
+
details: { leaseExpiresAt: result.leaseExpiresAt },
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
case "collection_not_found":
|
|
162
|
+
return {
|
|
163
|
+
success: false,
|
|
164
|
+
error: {
|
|
165
|
+
code: ErrorCode.COLLECTION_NOT_FOUND,
|
|
166
|
+
message: "Collection not found",
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
case "conflict":
|
|
170
|
+
return {
|
|
171
|
+
success: false,
|
|
172
|
+
error: {
|
|
173
|
+
code: ErrorCode.WORK_CHANGED,
|
|
174
|
+
message: "Media usage work changed; retry the request",
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
} catch (error) {
|
|
179
|
+
console.error("[media-usage-work] retry failed:", error);
|
|
180
|
+
return {
|
|
181
|
+
success: false,
|
|
182
|
+
error: {
|
|
183
|
+
code: ErrorCode.MEDIA_USAGE_WORK_RETRY_ERROR,
|
|
184
|
+
message: "Failed to retry media usage work",
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
}
|
|
@@ -74,9 +74,10 @@ export async function handleMediaUsageSummaries(
|
|
|
74
74
|
try {
|
|
75
75
|
const repository = new MediaUsageRepository(db);
|
|
76
76
|
const coverage = await loadMediaUsageCoverage(repository);
|
|
77
|
-
const counts =
|
|
78
|
-
|
|
79
|
-
|
|
77
|
+
const counts =
|
|
78
|
+
options.includeCount && coverage.status === "complete"
|
|
79
|
+
? await repository.findActiveEntryCountsByMediaIds(mediaIds)
|
|
80
|
+
: null;
|
|
80
81
|
const summaries: Record<string, MediaUsageSummary> = {};
|
|
81
82
|
|
|
82
83
|
for (const mediaId of new Set(mediaIds)) {
|
|
@@ -212,6 +213,7 @@ function normalizeMediaUsageCoverageStatus(
|
|
|
212
213
|
): MediaUsageCoverageStatus {
|
|
213
214
|
if (scope.status === null) return "never";
|
|
214
215
|
if (scope.status === "complete") {
|
|
216
|
+
if (scope.reconciliationRequired) return "stale";
|
|
215
217
|
return scope.schemaVersion === CONTENT_SOURCE_SCHEMA_VERSION ? "complete" : "stale";
|
|
216
218
|
}
|
|
217
219
|
if (
|