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
|
@@ -9,6 +9,7 @@ import { invalidateCollectionCache } from "../../object-cache/index.js";
|
|
|
9
9
|
import {
|
|
10
10
|
SchemaRegistry,
|
|
11
11
|
SchemaError,
|
|
12
|
+
invalidateSchemaCache,
|
|
12
13
|
type Collection,
|
|
13
14
|
type Field,
|
|
14
15
|
type CreateCollectionInput,
|
|
@@ -19,6 +20,11 @@ import {
|
|
|
19
20
|
} from "../../schema/index.js";
|
|
20
21
|
import type { ApiResult } from "../types.js";
|
|
21
22
|
|
|
23
|
+
function invalidateFieldCaches(collectionSlug: string): void {
|
|
24
|
+
invalidateCollectionCache(collectionSlug);
|
|
25
|
+
invalidateSchemaCache(collectionSlug);
|
|
26
|
+
}
|
|
27
|
+
|
|
22
28
|
export interface CollectionListResponse {
|
|
23
29
|
items: Collection[];
|
|
24
30
|
}
|
|
@@ -317,7 +323,7 @@ export async function handleSchemaFieldCreate(
|
|
|
317
323
|
const item = await registry.createField(collectionSlug, input);
|
|
318
324
|
|
|
319
325
|
// Content snapshots embed field values; a column change invalidates them.
|
|
320
|
-
|
|
326
|
+
invalidateFieldCaches(collectionSlug);
|
|
321
327
|
|
|
322
328
|
return {
|
|
323
329
|
success: true,
|
|
@@ -357,7 +363,7 @@ export async function handleSchemaFieldUpdate(
|
|
|
357
363
|
const registry = new SchemaRegistry(db);
|
|
358
364
|
const item = await registry.updateField(collectionSlug, fieldSlug, input);
|
|
359
365
|
|
|
360
|
-
|
|
366
|
+
invalidateFieldCaches(collectionSlug);
|
|
361
367
|
|
|
362
368
|
return {
|
|
363
369
|
success: true,
|
|
@@ -396,7 +402,7 @@ export async function handleSchemaFieldDelete(
|
|
|
396
402
|
const registry = new SchemaRegistry(db);
|
|
397
403
|
await registry.deleteField(collectionSlug, fieldSlug);
|
|
398
404
|
|
|
399
|
-
|
|
405
|
+
invalidateFieldCaches(collectionSlug);
|
|
400
406
|
|
|
401
407
|
return {
|
|
402
408
|
success: true,
|
package/src/api/handlers/seo.ts
CHANGED
|
@@ -88,7 +88,7 @@ function toW3CDate(value: string): string {
|
|
|
88
88
|
* Collect all published, indexable content across SEO-enabled collections
|
|
89
89
|
* for sitemap generation, grouped by collection.
|
|
90
90
|
*
|
|
91
|
-
* Only includes content from collections with `has_seo = 1`.
|
|
91
|
+
* Only includes content from routable collections with `has_seo = 1`.
|
|
92
92
|
* Excludes content with `seo_no_index = 1` in the `_emdash_seo` table.
|
|
93
93
|
*
|
|
94
94
|
* Returns raw data grouped per collection. The caller (route) is
|
|
@@ -105,7 +105,8 @@ export async function handleSitemapData(
|
|
|
105
105
|
let query = db
|
|
106
106
|
.selectFrom("_emdash_collections")
|
|
107
107
|
.select(["slug", "url_pattern"])
|
|
108
|
-
.where("has_seo", "=", 1)
|
|
108
|
+
.where("has_seo", "=", 1)
|
|
109
|
+
.where("routable", "=", 1);
|
|
109
110
|
|
|
110
111
|
if (collectionSlug) {
|
|
111
112
|
query = query.where("slug", "=", collectionSlug);
|
|
@@ -149,6 +150,8 @@ export async function handleSitemapData(
|
|
|
149
150
|
AND s.content_id = c.id
|
|
150
151
|
WHERE c.status = 'published'
|
|
151
152
|
AND c.deleted_at IS NULL
|
|
153
|
+
AND c.slug IS NOT NULL
|
|
154
|
+
AND TRIM(c.slug) <> ''
|
|
152
155
|
AND (s.seo_no_index IS NULL OR s.seo_no_index = 0)
|
|
153
156
|
ORDER BY c.updated_at DESC
|
|
154
157
|
LIMIT ${SITEMAP_MAX_ENTRIES}
|
|
@@ -7,17 +7,27 @@
|
|
|
7
7
|
* so assignments span every locale of a post.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import type
|
|
10
|
+
import { sql, type Kysely, type Selectable } from "kysely";
|
|
11
11
|
import { ulid } from "ulidx";
|
|
12
12
|
|
|
13
13
|
import { TaxonomyRepository, type SiblingPosition } from "../../database/repositories/taxonomy.js";
|
|
14
|
+
import { withTransaction } from "../../database/transaction.js";
|
|
14
15
|
import type { Database, TaxonomyDefTable } from "../../database/types.js";
|
|
15
|
-
import { resolveConfiguredLocale } from "../../i18n/config.js";
|
|
16
|
+
import { getI18nConfig, resolveConfiguredLocale } from "../../i18n/config.js";
|
|
16
17
|
import { invalidateTaxonomyDefsCache, invalidateTermCache } from "../../taxonomies/index.js";
|
|
17
18
|
import { fetchVisibleTermCounts } from "../../taxonomies/term-counts.js";
|
|
18
19
|
import type { ApiResult } from "../types.js";
|
|
19
20
|
|
|
20
21
|
const NAME_PATTERN = /^[a-z][a-z0-9_]*$/;
|
|
22
|
+
const MAX_GENERATED_TERM_SLUG_ATTEMPTS = 16;
|
|
23
|
+
|
|
24
|
+
function isTermSlugUniqueViolation(error: unknown): boolean {
|
|
25
|
+
const message = error instanceof Error ? error.message.toLowerCase() : "";
|
|
26
|
+
return (
|
|
27
|
+
(message.includes("unique constraint failed") || message.includes("duplicate key")) &&
|
|
28
|
+
message.includes("slug")
|
|
29
|
+
);
|
|
30
|
+
}
|
|
21
31
|
|
|
22
32
|
// ---------------------------------------------------------------------------
|
|
23
33
|
// Response types
|
|
@@ -38,6 +48,10 @@ export interface TaxonomyListResponse {
|
|
|
38
48
|
taxonomies: TaxonomyDef[];
|
|
39
49
|
}
|
|
40
50
|
|
|
51
|
+
export interface TaxonomyResponse {
|
|
52
|
+
taxonomy: TaxonomyDef;
|
|
53
|
+
}
|
|
54
|
+
|
|
41
55
|
export interface TermData {
|
|
42
56
|
id: string;
|
|
43
57
|
name: string;
|
|
@@ -101,7 +115,7 @@ export interface TaxonomyDefTranslationsResponse {
|
|
|
101
115
|
/**
|
|
102
116
|
* Build tree structure from flat terms
|
|
103
117
|
*/
|
|
104
|
-
function buildTree(flatTerms: TermWithCount[]): TermWithCount[] {
|
|
118
|
+
function buildTree(flatTerms: TermWithCount[], resolveByGroup = false): TermWithCount[] {
|
|
105
119
|
// `parentId` holds the parent's translation_group, so resolve links by group.
|
|
106
120
|
// Key by (locale, group): a child's parent lives in the same locale, and an
|
|
107
121
|
// unfiltered list mixes locales whose translated siblings share a group —
|
|
@@ -109,11 +123,14 @@ function buildTree(flatTerms: TermWithCount[]): TermWithCount[] {
|
|
|
109
123
|
const byLocaleGroup = new Map<string, TermWithCount>();
|
|
110
124
|
const roots: TermWithCount[] = [];
|
|
111
125
|
for (const term of flatTerms) {
|
|
112
|
-
|
|
126
|
+
const key = resolveByGroup
|
|
127
|
+
? (term.translationGroup ?? term.id)
|
|
128
|
+
: `${term.locale}::${term.translationGroup ?? term.id}`;
|
|
129
|
+
byLocaleGroup.set(key, term);
|
|
113
130
|
}
|
|
114
131
|
for (const term of flatTerms) {
|
|
115
132
|
const parent = term.parentId
|
|
116
|
-
? byLocaleGroup.get(`${term.locale}::${term.parentId}`)
|
|
133
|
+
? byLocaleGroup.get(resolveByGroup ? term.parentId : `${term.locale}::${term.parentId}`)
|
|
117
134
|
: undefined;
|
|
118
135
|
if (parent) {
|
|
119
136
|
parent.children.push(term);
|
|
@@ -124,28 +141,105 @@ function buildTree(flatTerms: TermWithCount[]): TermWithCount[] {
|
|
|
124
141
|
return roots;
|
|
125
142
|
}
|
|
126
143
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
144
|
+
type TaxonomyDefLookup =
|
|
145
|
+
| { success: true; def: Selectable<TaxonomyDefTable> }
|
|
146
|
+
| { success: false; error: { code: string; message: string } };
|
|
147
|
+
|
|
148
|
+
function taxonomyDefNotFound(name: string, locale?: string): TaxonomyDefLookup {
|
|
149
|
+
return {
|
|
150
|
+
success: false,
|
|
151
|
+
error: {
|
|
152
|
+
code: "NOT_FOUND",
|
|
153
|
+
message: `Taxonomy '${name}' not found${locale !== undefined ? ` in locale '${locale}'` : ""}`,
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/** Look up the exact definition addressed by a mutation. */
|
|
131
159
|
async function requireTaxonomyDef(
|
|
132
160
|
db: Kysely<Database>,
|
|
133
161
|
name: string,
|
|
134
162
|
locale?: string,
|
|
135
|
-
): Promise<
|
|
136
|
-
| { success: true; def: Selectable<TaxonomyDefTable> }
|
|
137
|
-
| { success: false; error: { code: string; message: string } }
|
|
138
|
-
> {
|
|
163
|
+
): Promise<TaxonomyDefLookup> {
|
|
139
164
|
let query = db.selectFrom("_emdash_taxonomy_defs").selectAll().where("name", "=", name);
|
|
140
165
|
if (locale !== undefined) query = query.where("locale", "=", locale);
|
|
141
|
-
const def = await query.orderBy("locale", "asc").executeTakeFirst();
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
166
|
+
const def = await query.orderBy("locale", "asc").orderBy("id", "asc").executeTakeFirst();
|
|
167
|
+
return def ? { success: true, def } : taxonomyDefNotFound(name, locale);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Prefer the requested locale, then the configured default. Incomplete
|
|
172
|
+
* translation groups fall back deterministically so their terms remain usable.
|
|
173
|
+
*/
|
|
174
|
+
async function requireTaxonomyDefWithFallback(
|
|
175
|
+
db: Kysely<Database>,
|
|
176
|
+
name: string,
|
|
177
|
+
locale?: string,
|
|
178
|
+
): Promise<TaxonomyDefLookup> {
|
|
179
|
+
const defs = await db
|
|
180
|
+
.selectFrom("_emdash_taxonomy_defs")
|
|
181
|
+
.selectAll()
|
|
182
|
+
.where("name", "=", name)
|
|
183
|
+
.orderBy("locale", "asc")
|
|
184
|
+
.orderBy("id", "asc")
|
|
185
|
+
.execute();
|
|
186
|
+
const defaultLocale = getI18nConfig()?.defaultLocale;
|
|
187
|
+
const def =
|
|
188
|
+
(locale ? defs.find((candidate) => candidate.locale === locale) : undefined) ??
|
|
189
|
+
(defaultLocale ? defs.find((candidate) => candidate.locale === defaultLocale) : undefined) ??
|
|
190
|
+
defs[0];
|
|
191
|
+
return def ? { success: true, def } : taxonomyDefNotFound(name, locale);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/** The subset of `slugs` that still has a row in `_emdash_collections`. */
|
|
195
|
+
async function findExistingCollections(
|
|
196
|
+
db: Kysely<Database>,
|
|
197
|
+
slugs: readonly string[],
|
|
198
|
+
): Promise<Set<string>> {
|
|
199
|
+
if (slugs.length === 0) return new Set();
|
|
200
|
+
const rows = await db
|
|
201
|
+
.selectFrom("_emdash_collections")
|
|
202
|
+
.select("slug")
|
|
203
|
+
.where("slug", "in", [...slugs])
|
|
204
|
+
.execute();
|
|
205
|
+
return new Set(rows.map((r) => r.slug));
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Reject a `collections` list naming collections that don't exist. Shared by
|
|
210
|
+
* create and update so both fail the same way instead of storing a reference
|
|
211
|
+
* that reads back filtered out.
|
|
212
|
+
*/
|
|
213
|
+
async function validateCollections(
|
|
214
|
+
db: Kysely<Database>,
|
|
215
|
+
collections: readonly string[],
|
|
216
|
+
): Promise<{ code: "VALIDATION_ERROR"; message: string } | null> {
|
|
217
|
+
const existing = await findExistingCollections(db, collections);
|
|
218
|
+
const invalid = collections.filter((slug) => !existing.has(slug));
|
|
219
|
+
if (invalid.length === 0) return null;
|
|
220
|
+
return {
|
|
221
|
+
code: "VALIDATION_ERROR",
|
|
222
|
+
message: `Unknown collection(s): ${invalid.join(", ")}`,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Shape one definition row for a response, dropping collection references whose
|
|
228
|
+
* collection is gone. Storage is untouched — re-creating the collection
|
|
229
|
+
* re-links automatically, same as `handleTaxonomyList`.
|
|
230
|
+
*/
|
|
231
|
+
async function toTaxonomyResponse(
|
|
232
|
+
db: Kysely<Database>,
|
|
233
|
+
row: Selectable<TaxonomyDefTable>,
|
|
234
|
+
): Promise<TaxonomyResponse> {
|
|
235
|
+
const def = rowToDef(row);
|
|
236
|
+
const realCollections = await findExistingCollections(db, def.collections);
|
|
237
|
+
return {
|
|
238
|
+
taxonomy: {
|
|
239
|
+
...def,
|
|
240
|
+
collections: def.collections.filter((slug) => realCollections.has(slug)),
|
|
241
|
+
},
|
|
242
|
+
};
|
|
149
243
|
}
|
|
150
244
|
|
|
151
245
|
/** Declared collections of a taxonomy def row (deduped, parsed from JSON). */
|
|
@@ -207,6 +301,31 @@ export async function handleTaxonomyList(
|
|
|
207
301
|
}
|
|
208
302
|
}
|
|
209
303
|
|
|
304
|
+
/**
|
|
305
|
+
* Get a single taxonomy definition by name.
|
|
306
|
+
*
|
|
307
|
+
* Definitions are per-locale, so `locale` picks which one; without it the
|
|
308
|
+
* lowest-locale match wins (same rule as `handleMenuGet`).
|
|
309
|
+
*/
|
|
310
|
+
export async function handleTaxonomyGet(
|
|
311
|
+
db: Kysely<Database>,
|
|
312
|
+
name: string,
|
|
313
|
+
options: { locale?: string } = {},
|
|
314
|
+
): Promise<ApiResult<TaxonomyResponse>> {
|
|
315
|
+
try {
|
|
316
|
+
const locale = options.locale ? resolveConfiguredLocale(options.locale) : undefined;
|
|
317
|
+
const lookup = await requireTaxonomyDefWithFallback(db, name, locale);
|
|
318
|
+
if (!lookup.success) return lookup;
|
|
319
|
+
|
|
320
|
+
return { success: true, data: await toTaxonomyResponse(db, lookup.def) };
|
|
321
|
+
} catch {
|
|
322
|
+
return {
|
|
323
|
+
success: false,
|
|
324
|
+
error: { code: "TAXONOMY_GET_ERROR", message: "Failed to get taxonomy" },
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
210
329
|
/**
|
|
211
330
|
* Create a new taxonomy definition
|
|
212
331
|
*/
|
|
@@ -221,9 +340,9 @@ export async function handleTaxonomyCreate(
|
|
|
221
340
|
locale?: string;
|
|
222
341
|
translationOf?: string;
|
|
223
342
|
},
|
|
224
|
-
): Promise<ApiResult<
|
|
343
|
+
): Promise<ApiResult<TaxonomyResponse>> {
|
|
225
344
|
try {
|
|
226
|
-
const locale = input.locale
|
|
345
|
+
const locale = resolveConfiguredLocale(input.locale ?? getI18nConfig()?.defaultLocale ?? "en");
|
|
227
346
|
if (!NAME_PATTERN.test(input.name)) {
|
|
228
347
|
return {
|
|
229
348
|
success: false,
|
|
@@ -236,23 +355,9 @@ export async function handleTaxonomyCreate(
|
|
|
236
355
|
}
|
|
237
356
|
|
|
238
357
|
const collections = [...new Set(input.collections ?? [])];
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
.select("slug")
|
|
243
|
-
.where("slug", "in", collections)
|
|
244
|
-
.execute();
|
|
245
|
-
const existingSlugs = new Set(existingCollections.map((c) => c.slug));
|
|
246
|
-
const invalid = collections.filter((c) => !existingSlugs.has(c));
|
|
247
|
-
if (invalid.length > 0) {
|
|
248
|
-
return {
|
|
249
|
-
success: false,
|
|
250
|
-
error: {
|
|
251
|
-
code: "VALIDATION_ERROR",
|
|
252
|
-
message: `Unknown collection(s): ${invalid.join(", ")}`,
|
|
253
|
-
},
|
|
254
|
-
};
|
|
255
|
-
}
|
|
358
|
+
const collectionError = await validateCollections(db, collections);
|
|
359
|
+
if (collectionError) {
|
|
360
|
+
return { success: false, error: collectionError };
|
|
256
361
|
}
|
|
257
362
|
|
|
258
363
|
let translationGroup: string | null = null;
|
|
@@ -273,22 +378,20 @@ export async function handleTaxonomyCreate(
|
|
|
273
378
|
|
|
274
379
|
// Duplicate guard scoped to locale (so the same name can exist in ES
|
|
275
380
|
// and EN).
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
};
|
|
291
|
-
}
|
|
381
|
+
const existing = await db
|
|
382
|
+
.selectFrom("_emdash_taxonomy_defs")
|
|
383
|
+
.select("id")
|
|
384
|
+
.where("name", "=", input.name)
|
|
385
|
+
.where("locale", "=", locale)
|
|
386
|
+
.executeTakeFirst();
|
|
387
|
+
if (existing) {
|
|
388
|
+
return {
|
|
389
|
+
success: false,
|
|
390
|
+
error: {
|
|
391
|
+
code: "CONFLICT",
|
|
392
|
+
message: `Taxonomy '${input.name}' already exists in locale '${locale}'`,
|
|
393
|
+
},
|
|
394
|
+
};
|
|
292
395
|
}
|
|
293
396
|
|
|
294
397
|
const id = ulid();
|
|
@@ -301,7 +404,7 @@ export async function handleTaxonomyCreate(
|
|
|
301
404
|
label_singular: input.labelSingular ?? null,
|
|
302
405
|
hierarchical: input.hierarchical ? 1 : 0,
|
|
303
406
|
collections: JSON.stringify(collections),
|
|
304
|
-
|
|
407
|
+
locale,
|
|
305
408
|
translation_group: translationGroup ?? id,
|
|
306
409
|
})
|
|
307
410
|
.execute();
|
|
@@ -330,6 +433,119 @@ export async function handleTaxonomyCreate(
|
|
|
330
433
|
}
|
|
331
434
|
}
|
|
332
435
|
|
|
436
|
+
/**
|
|
437
|
+
* Update a taxonomy definition.
|
|
438
|
+
*
|
|
439
|
+
* Writes the one row `(name, locale)` resolves to — every field here belongs to
|
|
440
|
+
* a single locale's definition, so translating a taxonomy and then editing the
|
|
441
|
+
* translation leaves the other locales alone. `name` and `locale` are immutable
|
|
442
|
+
* (renaming would strand the terms, which are keyed on `name`).
|
|
443
|
+
*/
|
|
444
|
+
export async function handleTaxonomyUpdate(
|
|
445
|
+
db: Kysely<Database>,
|
|
446
|
+
name: string,
|
|
447
|
+
input: {
|
|
448
|
+
label?: string;
|
|
449
|
+
labelSingular?: string | null;
|
|
450
|
+
hierarchical?: boolean;
|
|
451
|
+
collections?: string[];
|
|
452
|
+
locale?: string;
|
|
453
|
+
},
|
|
454
|
+
): Promise<ApiResult<TaxonomyResponse>> {
|
|
455
|
+
try {
|
|
456
|
+
const locale = input.locale ? resolveConfiguredLocale(input.locale) : undefined;
|
|
457
|
+
const lookup = await requireTaxonomyDef(db, name, locale);
|
|
458
|
+
if (!lookup.success) return lookup;
|
|
459
|
+
|
|
460
|
+
const collections = input.collections ? [...new Set(input.collections)] : undefined;
|
|
461
|
+
if (collections !== undefined) {
|
|
462
|
+
const collectionError = await validateCollections(db, collections);
|
|
463
|
+
if (collectionError) {
|
|
464
|
+
return { success: false, error: collectionError };
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
const updates: {
|
|
469
|
+
label?: string;
|
|
470
|
+
label_singular?: string | null;
|
|
471
|
+
hierarchical?: number;
|
|
472
|
+
collections?: string;
|
|
473
|
+
} = {};
|
|
474
|
+
if (input.label !== undefined) updates.label = input.label;
|
|
475
|
+
if (input.labelSingular !== undefined) updates.label_singular = input.labelSingular;
|
|
476
|
+
if (input.hierarchical !== undefined) updates.hierarchical = input.hierarchical ? 1 : 0;
|
|
477
|
+
if (collections !== undefined) updates.collections = JSON.stringify(collections);
|
|
478
|
+
|
|
479
|
+
if (Object.keys(updates).length > 0) {
|
|
480
|
+
await db
|
|
481
|
+
.updateTable("_emdash_taxonomy_defs")
|
|
482
|
+
.set(updates)
|
|
483
|
+
.where("id", "=", lookup.def.id)
|
|
484
|
+
.execute();
|
|
485
|
+
invalidateTaxonomyDefsCache();
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
const row = await db
|
|
489
|
+
.selectFrom("_emdash_taxonomy_defs")
|
|
490
|
+
.selectAll()
|
|
491
|
+
.where("id", "=", lookup.def.id)
|
|
492
|
+
.executeTakeFirstOrThrow();
|
|
493
|
+
|
|
494
|
+
return { success: true, data: await toTaxonomyResponse(db, row) };
|
|
495
|
+
} catch {
|
|
496
|
+
return {
|
|
497
|
+
success: false,
|
|
498
|
+
error: { code: "TAXONOMY_UPDATE_ERROR", message: "Failed to update taxonomy" },
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/**
|
|
504
|
+
* Delete a taxonomy: every locale's definition, every term under that name in
|
|
505
|
+
* every locale, and the term assignments those terms hold.
|
|
506
|
+
*
|
|
507
|
+
* There is no locale scope and no non-empty guard. Terms are keyed on `name`
|
|
508
|
+
* rather than on a definition row, so leaving one locale's definition behind
|
|
509
|
+
* would leave the taxonomy half-deleted — a definition with no terms, or terms
|
|
510
|
+
* no definition describes.
|
|
511
|
+
*/
|
|
512
|
+
export async function handleTaxonomyDelete(
|
|
513
|
+
db: Kysely<Database>,
|
|
514
|
+
name: string,
|
|
515
|
+
): Promise<ApiResult<{ deleted: true }>> {
|
|
516
|
+
try {
|
|
517
|
+
const lookup = await requireTaxonomyDef(db, name);
|
|
518
|
+
if (!lookup.success) return lookup;
|
|
519
|
+
|
|
520
|
+
await withTransaction(db, async (trx) => {
|
|
521
|
+
// `content_taxonomies.taxonomy_id` holds a term's translation_group, so
|
|
522
|
+
// the assignments have to go before the terms they are matched against.
|
|
523
|
+
await trx
|
|
524
|
+
.deleteFrom("content_taxonomies")
|
|
525
|
+
.where("taxonomy_id", "in", (eb) =>
|
|
526
|
+
eb
|
|
527
|
+
.selectFrom("taxonomies")
|
|
528
|
+
.select(sql<string>`coalesce(translation_group, id)`.as("group"))
|
|
529
|
+
.where("name", "=", name),
|
|
530
|
+
)
|
|
531
|
+
.execute();
|
|
532
|
+
await trx.deleteFrom("taxonomies").where("name", "=", name).execute();
|
|
533
|
+
await trx.deleteFrom("_emdash_taxonomy_defs").where("name", "=", name).execute();
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
// Covers the term caches too — see `invalidateTaxonomyDefsCache`.
|
|
537
|
+
invalidateTaxonomyDefsCache();
|
|
538
|
+
|
|
539
|
+
return { success: true, data: { deleted: true } };
|
|
540
|
+
} catch (error) {
|
|
541
|
+
console.error("[taxonomies] delete failed:", error);
|
|
542
|
+
return {
|
|
543
|
+
success: false,
|
|
544
|
+
error: { code: "TAXONOMY_DELETE_ERROR", message: "Failed to delete taxonomy" },
|
|
545
|
+
};
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
|
|
333
549
|
/**
|
|
334
550
|
* List every locale translation of a taxonomy def (by id or translation_group).
|
|
335
551
|
*/
|
|
@@ -389,17 +605,33 @@ export async function handleTaxonomyDefTranslations(
|
|
|
389
605
|
export async function handleTermList(
|
|
390
606
|
db: Kysely<Database>,
|
|
391
607
|
taxonomyName: string,
|
|
392
|
-
options: { locale?: string; includeCounts?: boolean } = {},
|
|
608
|
+
options: { locale?: string; includeCounts?: boolean; resolveFallback?: boolean } = {},
|
|
393
609
|
): Promise<ApiResult<TermListResponse>> {
|
|
394
610
|
try {
|
|
611
|
+
if (options.resolveFallback && !options.locale) {
|
|
612
|
+
return {
|
|
613
|
+
success: false,
|
|
614
|
+
error: {
|
|
615
|
+
code: "VALIDATION_ERROR",
|
|
616
|
+
message: "A locale is required when resolving taxonomy fallbacks",
|
|
617
|
+
},
|
|
618
|
+
};
|
|
619
|
+
}
|
|
395
620
|
// Definitions are per-locale but terms aren't bound to the def's locale —
|
|
396
|
-
//
|
|
397
|
-
const
|
|
621
|
+
// use the active definition for its collection scope.
|
|
622
|
+
const locale = options.locale ? resolveConfiguredLocale(options.locale) : undefined;
|
|
623
|
+
const lookup = await requireTaxonomyDefWithFallback(db, taxonomyName, locale);
|
|
398
624
|
if (!lookup.success) return lookup;
|
|
399
625
|
|
|
400
626
|
const repo = new TaxonomyRepository(db);
|
|
401
|
-
const
|
|
402
|
-
|
|
627
|
+
const terms =
|
|
628
|
+
options.resolveFallback && locale
|
|
629
|
+
? await repo.findByNameResolved(
|
|
630
|
+
taxonomyName,
|
|
631
|
+
locale,
|
|
632
|
+
getI18nConfig()?.defaultLocale ?? "en",
|
|
633
|
+
)
|
|
634
|
+
: await repo.findByName(taxonomyName, { locale });
|
|
403
635
|
|
|
404
636
|
// Counts match what visitors see on the public site: published (or
|
|
405
637
|
// scheduled-and-due) entries that aren't soft-deleted, scoped to the
|
|
@@ -408,7 +640,7 @@ export async function handleTermList(
|
|
|
408
640
|
// look up by group and map back to each term's id.
|
|
409
641
|
const includeCounts = options.includeCounts ?? true;
|
|
410
642
|
const countsByGroup = includeCounts
|
|
411
|
-
? await fetchVisibleTermCounts(db, taxonomyName, defCollections(lookup.def))
|
|
643
|
+
? await fetchVisibleTermCounts(db, taxonomyName, defCollections(lookup.def), locale)
|
|
412
644
|
: undefined;
|
|
413
645
|
|
|
414
646
|
const termData: TermWithCount[] = terms.map((term) => ({
|
|
@@ -425,7 +657,9 @@ export async function handleTermList(
|
|
|
425
657
|
}));
|
|
426
658
|
|
|
427
659
|
const isHierarchical = lookup.def.hierarchical === 1;
|
|
428
|
-
const result = isHierarchical
|
|
660
|
+
const result = isHierarchical
|
|
661
|
+
? buildTree(termData, options.resolveFallback && !!locale)
|
|
662
|
+
: termData;
|
|
429
663
|
return { success: true, data: { terms: result } };
|
|
430
664
|
} catch (error) {
|
|
431
665
|
console.error("[taxonomies] term list failed:", error);
|
|
@@ -631,7 +865,7 @@ export async function handleTermCreate(
|
|
|
631
865
|
db: Kysely<Database>,
|
|
632
866
|
taxonomyName: string,
|
|
633
867
|
input: {
|
|
634
|
-
slug
|
|
868
|
+
slug?: string;
|
|
635
869
|
label: string;
|
|
636
870
|
parentId?: string | null;
|
|
637
871
|
description?: string;
|
|
@@ -639,8 +873,9 @@ export async function handleTermCreate(
|
|
|
639
873
|
translationOf?: string;
|
|
640
874
|
},
|
|
641
875
|
): Promise<ApiResult<TermResponse>> {
|
|
876
|
+
let attemptedSlug = input.slug;
|
|
642
877
|
try {
|
|
643
|
-
const locale = input.locale
|
|
878
|
+
const locale = resolveConfiguredLocale(input.locale ?? getI18nConfig()?.defaultLocale ?? "en");
|
|
644
879
|
// Taxonomy definitions are per-locale, but terms can exist in any locale
|
|
645
880
|
// regardless of whether the def has been translated there. Look up the
|
|
646
881
|
// def across all locales — we only care that it *exists*.
|
|
@@ -654,15 +889,14 @@ export async function handleTermCreate(
|
|
|
654
889
|
input.parentId === "" || input.parentId === undefined ? undefined : input.parentId;
|
|
655
890
|
|
|
656
891
|
// Conflict check is scoped to locale (per-locale slugs are unique).
|
|
657
|
-
const existing =
|
|
892
|
+
const existing =
|
|
893
|
+
input.slug === undefined ? null : await repo.findBySlug(taxonomyName, input.slug, locale);
|
|
658
894
|
if (existing) {
|
|
659
895
|
return {
|
|
660
896
|
success: false,
|
|
661
897
|
error: {
|
|
662
898
|
code: "CONFLICT",
|
|
663
|
-
message: locale
|
|
664
|
-
? `Term '${input.slug}' already exists in '${taxonomyName}' (${locale})`
|
|
665
|
-
: `Term with slug '${input.slug}' already exists in taxonomy '${taxonomyName}'`,
|
|
899
|
+
message: `Term '${input.slug}' already exists in '${taxonomyName}' (${locale})`,
|
|
666
900
|
},
|
|
667
901
|
};
|
|
668
902
|
}
|
|
@@ -694,15 +928,33 @@ export async function handleTermCreate(
|
|
|
694
928
|
return { success: false, error: parentError };
|
|
695
929
|
}
|
|
696
930
|
|
|
697
|
-
const
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
931
|
+
const create = (slug: string) =>
|
|
932
|
+
repo.create({
|
|
933
|
+
name: taxonomyName,
|
|
934
|
+
slug,
|
|
935
|
+
label: input.label,
|
|
936
|
+
parentId: parentId ?? undefined,
|
|
937
|
+
data: input.description ? { description: input.description } : undefined,
|
|
938
|
+
locale,
|
|
939
|
+
translationOf: input.translationOf,
|
|
940
|
+
});
|
|
941
|
+
let term: Awaited<ReturnType<typeof create>> | undefined;
|
|
942
|
+
let lastSlugConflict: unknown;
|
|
943
|
+
if (input.slug !== undefined) {
|
|
944
|
+
term = await create(input.slug);
|
|
945
|
+
} else {
|
|
946
|
+
for (let attempt = 0; attempt < MAX_GENERATED_TERM_SLUG_ATTEMPTS; attempt++) {
|
|
947
|
+
attemptedSlug = await repo.generateUniqueSlug(taxonomyName, input.label, locale);
|
|
948
|
+
try {
|
|
949
|
+
term = await create(attemptedSlug);
|
|
950
|
+
break;
|
|
951
|
+
} catch (error) {
|
|
952
|
+
if (!isTermSlugUniqueViolation(error)) throw error;
|
|
953
|
+
lastSlugConflict = error;
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
}
|
|
957
|
+
if (!term) throw lastSlugConflict ?? new Error("Failed to create taxonomy term");
|
|
706
958
|
|
|
707
959
|
invalidateTermCache();
|
|
708
960
|
|
|
@@ -722,7 +974,16 @@ export async function handleTermCreate(
|
|
|
722
974
|
},
|
|
723
975
|
},
|
|
724
976
|
};
|
|
725
|
-
} catch {
|
|
977
|
+
} catch (error) {
|
|
978
|
+
if (isTermSlugUniqueViolation(error)) {
|
|
979
|
+
return {
|
|
980
|
+
success: false,
|
|
981
|
+
error: {
|
|
982
|
+
code: "CONFLICT",
|
|
983
|
+
message: `Term with slug '${attemptedSlug ?? "(generated)"}' already exists in taxonomy '${taxonomyName}'`,
|
|
984
|
+
},
|
|
985
|
+
};
|
|
986
|
+
}
|
|
726
987
|
return {
|
|
727
988
|
success: false,
|
|
728
989
|
error: { code: "TERM_CREATE_ERROR", message: "Failed to create term" },
|
|
@@ -756,12 +1017,14 @@ export async function handleTermGet(
|
|
|
756
1017
|
|
|
757
1018
|
// Count matches public visibility (published or scheduled-and-due, not
|
|
758
1019
|
// soft-deleted) scoped to the def's declared collections. The def lookup
|
|
759
|
-
//
|
|
760
|
-
|
|
1020
|
+
// falls back for incomplete translations; a term with no def at all still
|
|
1021
|
+
// resolves with count 0.
|
|
1022
|
+
const lookup = await requireTaxonomyDefWithFallback(db, taxonomyName, locale);
|
|
761
1023
|
const counts = await fetchVisibleTermCounts(
|
|
762
1024
|
db,
|
|
763
1025
|
taxonomyName,
|
|
764
1026
|
lookup.success ? defCollections(lookup.def) : [],
|
|
1027
|
+
locale ?? term.locale,
|
|
765
1028
|
);
|
|
766
1029
|
const count = counts.get(term.translationGroup ?? term.id) ?? 0;
|
|
767
1030
|
// Children share this term's translation_group as their parent_id; scope
|