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
|
@@ -172,28 +172,39 @@ export class RevisionRepository {
|
|
|
172
172
|
/**
|
|
173
173
|
* Delete old revisions, keeping the most recent N
|
|
174
174
|
*/
|
|
175
|
-
async pruneOldRevisions(
|
|
175
|
+
async pruneOldRevisions(
|
|
176
|
+
collection: string,
|
|
177
|
+
entryId: string,
|
|
178
|
+
keepCount: number,
|
|
179
|
+
throughRevisionId?: string,
|
|
180
|
+
): Promise<number> {
|
|
176
181
|
validateIdentifier(collection, "collection");
|
|
177
182
|
const tableName = `ec_${collection}`;
|
|
178
|
-
|
|
179
|
-
const keep = await this.db
|
|
183
|
+
let keepQuery = this.db
|
|
180
184
|
.selectFrom("revisions")
|
|
181
185
|
.select("id")
|
|
182
186
|
.where("collection", "=", collection)
|
|
183
187
|
.where("entry_id", "=", entryId)
|
|
184
188
|
.orderBy("created_at", "desc")
|
|
185
189
|
.orderBy("id", "desc") // ULID tiebreaker
|
|
186
|
-
.limit(keepCount)
|
|
187
|
-
|
|
190
|
+
.limit(keepCount);
|
|
191
|
+
|
|
192
|
+
if (throughRevisionId) {
|
|
193
|
+
keepQuery = keepQuery.where("id", "<=", throughRevisionId);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const keep = await keepQuery.execute();
|
|
188
197
|
|
|
189
198
|
const keepIds = keep.map((r) => r.id);
|
|
190
199
|
|
|
191
200
|
if (keepIds.length === 0) return 0;
|
|
201
|
+
const revisionBoundary = throughRevisionId ? sql`AND id <= ${throughRevisionId}` : sql``;
|
|
192
202
|
|
|
193
203
|
const result = await sql`
|
|
194
204
|
DELETE FROM revisions
|
|
195
205
|
WHERE collection = ${collection}
|
|
196
206
|
AND entry_id = ${entryId}
|
|
207
|
+
${revisionBoundary}
|
|
197
208
|
AND id NOT IN (${sql.join(keepIds.map((id) => sql`${id}`))})
|
|
198
209
|
AND NOT EXISTS (
|
|
199
210
|
SELECT 1 FROM ${sql.ref(tableName)} AS content
|
|
@@ -211,7 +222,7 @@ export class RevisionRepository {
|
|
|
211
222
|
queuedRevisionId: string,
|
|
212
223
|
keepCount: number,
|
|
213
224
|
): Promise<number> {
|
|
214
|
-
const pruned = await this.pruneOldRevisions(collection, entryId, keepCount);
|
|
225
|
+
const pruned = await this.pruneOldRevisions(collection, entryId, keepCount, queuedRevisionId);
|
|
215
226
|
await this.db
|
|
216
227
|
.deleteFrom("_emdash_revision_prune_queue")
|
|
217
228
|
.where("collection", "=", collection)
|
|
@@ -2,34 +2,11 @@ import { sql, type Kysely, type Selectable } from "kysely";
|
|
|
2
2
|
import { ulid } from "ulidx";
|
|
3
3
|
|
|
4
4
|
import { invalidateTaxonomyObjectCache } from "../../object-cache/index.js";
|
|
5
|
-
import {
|
|
5
|
+
import { slugify } from "../../utils/slugify.js";
|
|
6
6
|
import { withTransaction } from "../transaction.js";
|
|
7
7
|
import type { Database, TaxonomyTable } from "../types.js";
|
|
8
8
|
import { validateIdentifier } from "../validate.js";
|
|
9
9
|
|
|
10
|
-
/**
|
|
11
|
-
* Filter + sort columns denormalized from an entry's `ec_*` row onto its
|
|
12
|
-
* `content_taxonomies` pivot rows (migration 051). Stamped at insert time so a
|
|
13
|
-
* newly-tagged entry is immediately seekable by a taxonomy-filtered listing.
|
|
14
|
-
*/
|
|
15
|
-
interface PivotDenorm {
|
|
16
|
-
status: string | null;
|
|
17
|
-
scheduled_at: string | null;
|
|
18
|
-
deleted_at: string | null;
|
|
19
|
-
locale: string | null;
|
|
20
|
-
published_at: string | null;
|
|
21
|
-
created_at: string | null;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const EMPTY_DENORM: PivotDenorm = {
|
|
25
|
-
status: null,
|
|
26
|
-
scheduled_at: null,
|
|
27
|
-
deleted_at: null,
|
|
28
|
-
locale: null,
|
|
29
|
-
published_at: null,
|
|
30
|
-
created_at: null,
|
|
31
|
-
};
|
|
32
|
-
|
|
33
10
|
/** A member of one sibling group and the position it currently holds. */
|
|
34
11
|
export interface SiblingPosition {
|
|
35
12
|
group: string;
|
|
@@ -42,6 +19,7 @@ export interface SiblingPosition {
|
|
|
42
19
|
* statement inside D1's 100-parameter ceiling.
|
|
43
20
|
*/
|
|
44
21
|
const GROUPS_PER_UPDATE = 32;
|
|
22
|
+
const NUMERIC_SUFFIX_PATTERN = /^\d+$/;
|
|
45
23
|
|
|
46
24
|
/** Deal the listed groups back out over the slots they hold, in the order given. */
|
|
47
25
|
function permuteWithinSlots(
|
|
@@ -123,16 +101,45 @@ export interface FindOptions {
|
|
|
123
101
|
locale?: string;
|
|
124
102
|
}
|
|
125
103
|
|
|
104
|
+
export interface TaxonomyManualPageCursor {
|
|
105
|
+
sortOrder: number;
|
|
106
|
+
label: string;
|
|
107
|
+
id: string;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export interface TaxonomyPageOptions extends FindOptions {
|
|
111
|
+
cursor?: TaxonomyManualPageCursor;
|
|
112
|
+
limit?: number;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export interface TaxonomyPage {
|
|
116
|
+
items: Taxonomy[];
|
|
117
|
+
hasMore: boolean;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export interface TaxonomyAssignmentTranslation {
|
|
121
|
+
id: string;
|
|
122
|
+
slug: string;
|
|
123
|
+
locale: string;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export interface TaxonomyAssignmentResolution {
|
|
127
|
+
translationGroup: string;
|
|
128
|
+
term: Taxonomy | null;
|
|
129
|
+
availableLocales: string[];
|
|
130
|
+
translations: TaxonomyAssignmentTranslation[];
|
|
131
|
+
}
|
|
132
|
+
|
|
126
133
|
/**
|
|
127
134
|
* Taxonomy repository for categories, tags, and other classification.
|
|
128
135
|
*
|
|
129
136
|
* Terms are per-locale. Translations of the same term share a `translation_group`
|
|
130
|
-
* ULID. `content_taxonomies
|
|
131
|
-
* association spans every locale of a post.
|
|
137
|
+
* ULID. `content_taxonomies` stores translation_groups on both sides so a single
|
|
138
|
+
* association spans every locale of a post and term.
|
|
132
139
|
*
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
140
|
+
* Strict lookup methods use only the locale callers supply. The explicitly
|
|
141
|
+
* resolved methods accept both the preferred and default locales so their
|
|
142
|
+
* fallback policy stays visible at the call site.
|
|
136
143
|
*
|
|
137
144
|
* `sort_order` is per translation_group, not per row: every row sharing a
|
|
138
145
|
* translation_group carries the same value, so a term holds one position across
|
|
@@ -224,14 +231,36 @@ export class TaxonomyRepository {
|
|
|
224
231
|
return row ? this.rowToTaxonomy(row) : null;
|
|
225
232
|
}
|
|
226
233
|
|
|
234
|
+
/** Generate a locale-scoped term slug, adding a numeric suffix when needed. */
|
|
235
|
+
async generateUniqueSlug(name: string, text: string, locale?: string): Promise<string> {
|
|
236
|
+
const baseSlug = slugify(text);
|
|
237
|
+
let query = this.db
|
|
238
|
+
.selectFrom("taxonomies")
|
|
239
|
+
.select("slug")
|
|
240
|
+
.where("name", "=", name)
|
|
241
|
+
.where((eb) => eb.or([eb("slug", "=", baseSlug), eb("slug", "like", `${baseSlug}-%`)]));
|
|
242
|
+
if (locale !== undefined) query = query.where("locale", "=", locale);
|
|
243
|
+
const candidates = await query.execute();
|
|
244
|
+
if (!candidates.some((candidate) => candidate.slug === baseSlug)) return baseSlug;
|
|
245
|
+
|
|
246
|
+
let maxSuffix = 0;
|
|
247
|
+
const prefix = `${baseSlug}-`;
|
|
248
|
+
for (const candidate of candidates) {
|
|
249
|
+
if (!candidate.slug.startsWith(prefix)) continue;
|
|
250
|
+
const suffix = candidate.slug.slice(prefix.length);
|
|
251
|
+
if (!NUMERIC_SUFFIX_PATTERN.test(suffix)) continue;
|
|
252
|
+
maxSuffix = Math.max(maxSuffix, Number.parseInt(suffix, 10));
|
|
253
|
+
}
|
|
254
|
+
return `${baseSlug}-${maxSuffix + 1}`;
|
|
255
|
+
}
|
|
256
|
+
|
|
227
257
|
/**
|
|
228
258
|
* Get all terms for a taxonomy (e.g., all categories).
|
|
229
259
|
*
|
|
230
260
|
* `sort_order` carries the manual order set from the admin; it is 0 for
|
|
231
261
|
* terms nobody has reordered, so an untouched taxonomy still comes back
|
|
232
262
|
* alphabetically. `id asc` is a stable tiebreaker for terms that share both
|
|
233
|
-
*
|
|
234
|
-
* which breaks keyset pagination over `(label, id)`.
|
|
263
|
+
* values. Without it the SQL ordering is implementation-defined when they match.
|
|
235
264
|
*/
|
|
236
265
|
async findByName(name: string, options: FindOptions = {}): Promise<Taxonomy[]> {
|
|
237
266
|
let query = this.db
|
|
@@ -256,6 +285,71 @@ export class TaxonomyRepository {
|
|
|
256
285
|
return rows.map((row) => this.rowToTaxonomy(row));
|
|
257
286
|
}
|
|
258
287
|
|
|
288
|
+
async findByNameResolved(
|
|
289
|
+
name: string,
|
|
290
|
+
locale: string,
|
|
291
|
+
defaultLocale: string,
|
|
292
|
+
): Promise<Taxonomy[]> {
|
|
293
|
+
const locales = [...new Set([locale, defaultLocale])];
|
|
294
|
+
const rows = await this.db
|
|
295
|
+
.selectFrom("taxonomies")
|
|
296
|
+
.selectAll()
|
|
297
|
+
.where("name", "=", name)
|
|
298
|
+
.where("locale", "in", locales)
|
|
299
|
+
.orderBy("sort_order", "asc")
|
|
300
|
+
.orderBy("label", "asc")
|
|
301
|
+
.orderBy("id", "asc")
|
|
302
|
+
.execute();
|
|
303
|
+
|
|
304
|
+
const selected = new Map<string, Taxonomy>();
|
|
305
|
+
for (const row of rows) {
|
|
306
|
+
const term = this.rowToTaxonomy(row);
|
|
307
|
+
const group = term.translationGroup ?? term.id;
|
|
308
|
+
const current = selected.get(group);
|
|
309
|
+
if (!current || term.locale === locale) selected.set(group, term);
|
|
310
|
+
}
|
|
311
|
+
return [...selected.values()].toSorted(
|
|
312
|
+
(a, b) =>
|
|
313
|
+
a.sortOrder - b.sortOrder || a.label.localeCompare(b.label) || a.id.localeCompare(b.id),
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
async findPageByName(name: string, options: TaxonomyPageOptions = {}): Promise<TaxonomyPage> {
|
|
318
|
+
const limit = Math.max(1, Math.min(options.limit ?? 50, 100));
|
|
319
|
+
let query = this.db.selectFrom("taxonomies").selectAll().where("name", "=", name);
|
|
320
|
+
|
|
321
|
+
if (options.locale !== undefined) query = query.where("locale", "=", options.locale);
|
|
322
|
+
|
|
323
|
+
if (options.parentId !== undefined) {
|
|
324
|
+
query =
|
|
325
|
+
options.parentId === null
|
|
326
|
+
? query.where("parent_id", "is", null)
|
|
327
|
+
: query.where("parent_id", "=", options.parentId);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
if (options.cursor) {
|
|
331
|
+
const cursor = options.cursor;
|
|
332
|
+
query = query.where((eb) =>
|
|
333
|
+
eb.or([
|
|
334
|
+
eb("sort_order", ">", cursor.sortOrder),
|
|
335
|
+
eb.and([eb("sort_order", "=", cursor.sortOrder), eb("label", ">", cursor.label)]),
|
|
336
|
+
eb.and([
|
|
337
|
+
eb("sort_order", "=", cursor.sortOrder),
|
|
338
|
+
eb("label", "=", cursor.label),
|
|
339
|
+
eb("id", ">", cursor.id),
|
|
340
|
+
]),
|
|
341
|
+
]),
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
query = query.orderBy("sort_order", "asc").orderBy("label", "asc").orderBy("id", "asc");
|
|
345
|
+
|
|
346
|
+
const rows = await query.limit(limit + 1).execute();
|
|
347
|
+
return {
|
|
348
|
+
items: rows.slice(0, limit).map((row) => this.rowToTaxonomy(row)),
|
|
349
|
+
hasMore: rows.length > limit,
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
|
|
259
353
|
/**
|
|
260
354
|
* Children of a term. Accepts a term id OR a translation_group and resolves
|
|
261
355
|
* to the group, since `parent_id` stores the parent's translation_group.
|
|
@@ -464,30 +558,56 @@ export class TaxonomyRepository {
|
|
|
464
558
|
return (result.numDeletedRows ?? 0n) > 0n;
|
|
465
559
|
}
|
|
466
560
|
|
|
467
|
-
// --- Content-Taxonomy Junction (
|
|
561
|
+
// --- Content-Taxonomy Junction (both ids store translation_groups) ---
|
|
468
562
|
|
|
469
563
|
async attachToEntry(collection: string, entryId: string, taxonomyId: string): Promise<void> {
|
|
470
|
-
const
|
|
471
|
-
if (!
|
|
564
|
+
const taxonomyGroup = await this.resolveTranslationGroup(taxonomyId);
|
|
565
|
+
if (!taxonomyGroup) return;
|
|
566
|
+
await this.attachGroupsToEntry(collection, entryId, [taxonomyGroup]);
|
|
567
|
+
}
|
|
472
568
|
|
|
473
|
-
|
|
474
|
-
|
|
569
|
+
/**
|
|
570
|
+
* Attach already-resolved term translation groups in one insert and return
|
|
571
|
+
* the number of assignments that did not already exist.
|
|
572
|
+
*/
|
|
573
|
+
async attachGroupsToEntry(
|
|
574
|
+
collection: string,
|
|
575
|
+
entryId: string,
|
|
576
|
+
taxonomyGroups: string[],
|
|
577
|
+
): Promise<number> {
|
|
578
|
+
const uniqueGroups = [...new Set(taxonomyGroups)];
|
|
579
|
+
if (uniqueGroups.length === 0) return 0;
|
|
580
|
+
const entryGroup = await this.resolveEntryTranslationGroup(collection, entryId);
|
|
581
|
+
if (!entryGroup) return 0;
|
|
582
|
+
|
|
583
|
+
const result = await this.db
|
|
475
584
|
.insertInto("content_taxonomies")
|
|
476
|
-
.values(
|
|
585
|
+
.values(
|
|
586
|
+
uniqueGroups.map((taxonomy_id) => ({
|
|
587
|
+
collection,
|
|
588
|
+
entry_id: entryGroup,
|
|
589
|
+
taxonomy_id,
|
|
590
|
+
})),
|
|
591
|
+
)
|
|
477
592
|
.onConflict((oc) => oc.doNothing())
|
|
478
|
-
.
|
|
479
|
-
|
|
593
|
+
.executeTakeFirst();
|
|
594
|
+
const inserted = Number(result.numInsertedOrUpdatedRows ?? 0n);
|
|
595
|
+
if (inserted > 0) invalidateTaxonomyObjectCache();
|
|
596
|
+
return inserted;
|
|
480
597
|
}
|
|
481
598
|
|
|
482
599
|
async detachFromEntry(collection: string, entryId: string, taxonomyId: string): Promise<void> {
|
|
483
|
-
const
|
|
484
|
-
|
|
600
|
+
const [entryGroup, taxonomyGroup] = await Promise.all([
|
|
601
|
+
this.resolveEntryTranslationGroup(collection, entryId),
|
|
602
|
+
this.resolveTranslationGroup(taxonomyId),
|
|
603
|
+
]);
|
|
604
|
+
if (!entryGroup || !taxonomyGroup) return;
|
|
485
605
|
|
|
486
606
|
await this.db
|
|
487
607
|
.deleteFrom("content_taxonomies")
|
|
488
608
|
.where("collection", "=", collection)
|
|
489
|
-
.where("entry_id", "=",
|
|
490
|
-
.where("taxonomy_id", "=",
|
|
609
|
+
.where("entry_id", "=", entryGroup)
|
|
610
|
+
.where("taxonomy_id", "=", taxonomyGroup)
|
|
491
611
|
.execute();
|
|
492
612
|
invalidateTaxonomyObjectCache();
|
|
493
613
|
}
|
|
@@ -503,12 +623,15 @@ export class TaxonomyRepository {
|
|
|
503
623
|
taxonomyName?: string,
|
|
504
624
|
locale?: string,
|
|
505
625
|
): Promise<Taxonomy[]> {
|
|
626
|
+
const entryGroup = await this.resolveEntryTranslationGroup(collection, entryId);
|
|
627
|
+
if (!entryGroup) return [];
|
|
628
|
+
|
|
506
629
|
let query = this.db
|
|
507
630
|
.selectFrom("content_taxonomies")
|
|
508
631
|
.innerJoin("taxonomies", "taxonomies.translation_group", "content_taxonomies.taxonomy_id")
|
|
509
632
|
.selectAll("taxonomies")
|
|
510
633
|
.where("content_taxonomies.collection", "=", collection)
|
|
511
|
-
.where("content_taxonomies.entry_id", "=",
|
|
634
|
+
.where("content_taxonomies.entry_id", "=", entryGroup);
|
|
512
635
|
|
|
513
636
|
if (taxonomyName) query = query.where("taxonomies.name", "=", taxonomyName);
|
|
514
637
|
if (locale !== undefined) query = query.where("taxonomies.locale", "=", locale);
|
|
@@ -517,6 +640,53 @@ export class TaxonomyRepository {
|
|
|
517
640
|
return rows.map((row) => this.rowToTaxonomy(row));
|
|
518
641
|
}
|
|
519
642
|
|
|
643
|
+
async getTermAssignmentsForEntry(
|
|
644
|
+
collection: string,
|
|
645
|
+
entryId: string,
|
|
646
|
+
taxonomyName: string,
|
|
647
|
+
locale: string,
|
|
648
|
+
defaultLocale: string,
|
|
649
|
+
): Promise<TaxonomyAssignmentResolution[]> {
|
|
650
|
+
const entryGroup = await this.resolveEntryTranslationGroup(collection, entryId);
|
|
651
|
+
if (!entryGroup) return [];
|
|
652
|
+
|
|
653
|
+
const rows = await this.db
|
|
654
|
+
.selectFrom("content_taxonomies")
|
|
655
|
+
.innerJoin("taxonomies", "taxonomies.translation_group", "content_taxonomies.taxonomy_id")
|
|
656
|
+
.selectAll("taxonomies")
|
|
657
|
+
.select("content_taxonomies.taxonomy_id as assignment_group")
|
|
658
|
+
.where("content_taxonomies.collection", "=", collection)
|
|
659
|
+
.where("content_taxonomies.entry_id", "=", entryGroup)
|
|
660
|
+
.where("taxonomies.name", "=", taxonomyName)
|
|
661
|
+
.orderBy("content_taxonomies.taxonomy_id", "asc")
|
|
662
|
+
.orderBy("taxonomies.locale", "asc")
|
|
663
|
+
.execute();
|
|
664
|
+
|
|
665
|
+
const byGroup = new Map<string, Taxonomy[]>();
|
|
666
|
+
for (const row of rows) {
|
|
667
|
+
const variants = byGroup.get(row.assignment_group) ?? [];
|
|
668
|
+
variants.push(this.rowToTaxonomy(row));
|
|
669
|
+
byGroup.set(row.assignment_group, variants);
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
return Array.from(byGroup, ([translationGroup, variants]) => {
|
|
673
|
+
const term =
|
|
674
|
+
variants.find((variant) => variant.locale === locale) ??
|
|
675
|
+
variants.find((variant) => variant.locale === defaultLocale) ??
|
|
676
|
+
null;
|
|
677
|
+
return {
|
|
678
|
+
translationGroup,
|
|
679
|
+
term,
|
|
680
|
+
availableLocales: variants.map((variant) => variant.locale),
|
|
681
|
+
translations: variants.map((variant) => ({
|
|
682
|
+
id: variant.id,
|
|
683
|
+
slug: variant.slug,
|
|
684
|
+
locale: variant.locale,
|
|
685
|
+
})),
|
|
686
|
+
};
|
|
687
|
+
});
|
|
688
|
+
}
|
|
689
|
+
|
|
520
690
|
/**
|
|
521
691
|
* Replace all assignments of a given taxonomy for one content entry.
|
|
522
692
|
* Term ids OR translation_groups are accepted and normalised to groups.
|
|
@@ -527,6 +697,9 @@ export class TaxonomyRepository {
|
|
|
527
697
|
taxonomyName: string,
|
|
528
698
|
termIds: string[],
|
|
529
699
|
): Promise<void> {
|
|
700
|
+
const entryGroup = await this.resolveEntryTranslationGroup(collection, entryId);
|
|
701
|
+
if (!entryGroup) return;
|
|
702
|
+
|
|
530
703
|
const groups: string[] = [];
|
|
531
704
|
for (const id of termIds) {
|
|
532
705
|
const group = await this.resolveTranslationGroup(id);
|
|
@@ -540,7 +713,7 @@ export class TaxonomyRepository {
|
|
|
540
713
|
.select(["content_taxonomies.taxonomy_id as group"])
|
|
541
714
|
.distinct()
|
|
542
715
|
.where("content_taxonomies.collection", "=", collection)
|
|
543
|
-
.where("content_taxonomies.entry_id", "=",
|
|
716
|
+
.where("content_taxonomies.entry_id", "=", entryGroup)
|
|
544
717
|
.where("taxonomies.name", "=", taxonomyName)
|
|
545
718
|
.execute();
|
|
546
719
|
const currentGroups = new Set(current.map((r) => r.group));
|
|
@@ -550,22 +723,20 @@ export class TaxonomyRepository {
|
|
|
550
723
|
await this.db
|
|
551
724
|
.deleteFrom("content_taxonomies")
|
|
552
725
|
.where("collection", "=", collection)
|
|
553
|
-
.where("entry_id", "=",
|
|
726
|
+
.where("entry_id", "=", entryGroup)
|
|
554
727
|
.where("taxonomy_id", "in", toRemove)
|
|
555
728
|
.execute();
|
|
556
729
|
}
|
|
557
730
|
|
|
558
731
|
const toAdd = [...newGroups].filter((g) => !currentGroups.has(g));
|
|
559
732
|
if (toAdd.length > 0) {
|
|
560
|
-
const denorm = await this.fetchEntryDenorm(collection, entryId);
|
|
561
733
|
await this.db
|
|
562
734
|
.insertInto("content_taxonomies")
|
|
563
735
|
.values(
|
|
564
736
|
toAdd.map((taxonomy_id) => ({
|
|
565
737
|
collection,
|
|
566
|
-
entry_id:
|
|
738
|
+
entry_id: entryGroup,
|
|
567
739
|
taxonomy_id,
|
|
568
|
-
...denorm,
|
|
569
740
|
})),
|
|
570
741
|
)
|
|
571
742
|
.onConflict((oc) => oc.doNothing())
|
|
@@ -576,72 +747,32 @@ export class TaxonomyRepository {
|
|
|
576
747
|
}
|
|
577
748
|
|
|
578
749
|
async clearEntryTerms(collection: string, entryId: string): Promise<number> {
|
|
750
|
+
const entryGroup = await this.resolveEntryTranslationGroup(collection, entryId);
|
|
751
|
+
if (!entryGroup) return 0;
|
|
752
|
+
|
|
579
753
|
const result = await this.db
|
|
580
754
|
.deleteFrom("content_taxonomies")
|
|
581
755
|
.where("collection", "=", collection)
|
|
582
|
-
.where("entry_id", "=",
|
|
756
|
+
.where("entry_id", "=", entryGroup)
|
|
583
757
|
.executeTakeFirst();
|
|
584
758
|
const removed = Number(result.numDeletedRows ?? 0);
|
|
585
759
|
if (removed > 0) invalidateTaxonomyObjectCache();
|
|
586
760
|
return removed;
|
|
587
761
|
}
|
|
588
762
|
|
|
589
|
-
|
|
590
|
-
* Copy every term assignment from one content entry to another. Used when
|
|
591
|
-
* creating a translation of a post so the new translation inherits the
|
|
592
|
-
* source's term assignments. Safe to call when the source has no terms.
|
|
593
|
-
*/
|
|
594
|
-
async copyEntryTerms(
|
|
763
|
+
private async resolveEntryTranslationGroup(
|
|
595
764
|
collection: string,
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
): Promise<void> {
|
|
599
|
-
const rows = await this.db
|
|
600
|
-
.selectFrom("content_taxonomies")
|
|
601
|
-
.select(["taxonomy_id"])
|
|
602
|
-
.where("collection", "=", collection)
|
|
603
|
-
.where("entry_id", "=", sourceEntryId)
|
|
604
|
-
.execute();
|
|
605
|
-
if (rows.length === 0) return;
|
|
606
|
-
|
|
607
|
-
// Stamp the TARGET entry's current values — the copy inherits the source's
|
|
608
|
-
// term memberships but the target's own status/dates/locale.
|
|
609
|
-
const denorm = await this.fetchEntryDenorm(collection, targetEntryId);
|
|
610
|
-
await this.db
|
|
611
|
-
.insertInto("content_taxonomies")
|
|
612
|
-
.values(
|
|
613
|
-
rows.map((r) => ({
|
|
614
|
-
collection,
|
|
615
|
-
entry_id: targetEntryId,
|
|
616
|
-
taxonomy_id: r.taxonomy_id,
|
|
617
|
-
...denorm,
|
|
618
|
-
})),
|
|
619
|
-
)
|
|
620
|
-
.onConflict((oc) => oc.doNothing())
|
|
621
|
-
.execute();
|
|
622
|
-
invalidateTaxonomyObjectCache();
|
|
623
|
-
}
|
|
624
|
-
|
|
625
|
-
/**
|
|
626
|
-
* Read the denormalized filter + sort columns from an entry's `ec_*` row so
|
|
627
|
-
* they can be stamped onto new pivot rows (migration 051). A missing table or
|
|
628
|
-
* missing row yields all-nulls: the pivot columns are advisory, and the
|
|
629
|
-
* listing read path re-checks the authoritative `ec_*` row regardless.
|
|
630
|
-
*/
|
|
631
|
-
private async fetchEntryDenorm(collection: string, entryId: string): Promise<PivotDenorm> {
|
|
765
|
+
entryIdOrGroup: string,
|
|
766
|
+
): Promise<string | null> {
|
|
632
767
|
validateIdentifier(collection, "collection type");
|
|
633
768
|
const tableName = `ec_${collection}`;
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
} catch (error) {
|
|
642
|
-
if (isMissingTableError(error)) return EMPTY_DENORM;
|
|
643
|
-
throw error;
|
|
644
|
-
}
|
|
769
|
+
const result = await sql<{ translation_group: string }>`
|
|
770
|
+
SELECT translation_group
|
|
771
|
+
FROM ${sql.ref(tableName)}
|
|
772
|
+
WHERE id = ${entryIdOrGroup} OR translation_group = ${entryIdOrGroup}
|
|
773
|
+
LIMIT 1
|
|
774
|
+
`.execute(this.db);
|
|
775
|
+
return result.rows[0]?.translation_group ?? null;
|
|
645
776
|
}
|
|
646
777
|
|
|
647
778
|
/**
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ContentFieldFilters } from "../../content-list-query.js";
|
|
1
2
|
import type { CustomFieldValue } from "../../schema/types.js";
|
|
2
3
|
import { encodeBase64, decodeBase64 } from "../../utils/base64.js";
|
|
3
4
|
|
|
@@ -12,6 +13,8 @@ import { encodeBase64, decodeBase64 } from "../../utils/base64.js";
|
|
|
12
13
|
const MAX_CURSOR_LENGTH = 4096;
|
|
13
14
|
|
|
14
15
|
export interface CreateContentInput {
|
|
16
|
+
/** Explicit content ID for stable seed imports. Omit to generate a ULID. */
|
|
17
|
+
id?: string;
|
|
15
18
|
type: string;
|
|
16
19
|
slug?: string | null;
|
|
17
20
|
data: Record<string, unknown>;
|
|
@@ -145,6 +148,34 @@ export interface ContentDateFilter {
|
|
|
145
148
|
to?: string;
|
|
146
149
|
}
|
|
147
150
|
|
|
151
|
+
/**
|
|
152
|
+
* Byline filter for a content list.
|
|
153
|
+
*
|
|
154
|
+
* `mode: "any"` matches entries credited to at least one of `bylineIds`;
|
|
155
|
+
* `mode: "none"` matches entries with no credit at all.
|
|
156
|
+
*
|
|
157
|
+
* `bylineIds` are `translation_group` values — what
|
|
158
|
+
* `_emdash_content_bylines.byline_id` stores since migration 040 — so a filter
|
|
159
|
+
* matches a byline across every locale variant.
|
|
160
|
+
*
|
|
161
|
+
* By default only explicit credits count. `includeInferred` widens the filter
|
|
162
|
+
* to the byline the list actually renders, which for an entry with no credits
|
|
163
|
+
* is the one linked to its `author_id` (see `hydrateBylinesMany`).
|
|
164
|
+
*/
|
|
165
|
+
export interface ContentBylineFilter {
|
|
166
|
+
mode: "any" | "none";
|
|
167
|
+
/** Ignored when `mode` is `"none"`. An empty list matches nothing. */
|
|
168
|
+
bylineIds?: string[];
|
|
169
|
+
includeInferred?: boolean;
|
|
170
|
+
/**
|
|
171
|
+
* Locale a credit has to resolve at — the locale the list is scoped to.
|
|
172
|
+
* Applies to explicit credits as well as inferred ones, since a byline
|
|
173
|
+
* group credited to an entry renders only where it has a row at that
|
|
174
|
+
* locale. Defaults to each entry's own locale when the list spans locales.
|
|
175
|
+
*/
|
|
176
|
+
locale?: string;
|
|
177
|
+
}
|
|
178
|
+
|
|
148
179
|
export interface FindManyOptions {
|
|
149
180
|
where?: {
|
|
150
181
|
status?: string;
|
|
@@ -154,8 +185,9 @@ export interface FindManyOptions {
|
|
|
154
185
|
q?: string;
|
|
155
186
|
/**
|
|
156
187
|
* Columns the `q` substring filter is applied to (OR'd together).
|
|
157
|
-
* Resolved by the handler from the collection's display fields
|
|
158
|
-
*
|
|
188
|
+
* Resolved by the handler from the collection's display fields, slug,
|
|
189
|
+
* and any field marked searchable. Each name is validated as a SQL
|
|
190
|
+
* identifier.
|
|
159
191
|
*/
|
|
160
192
|
searchColumns?: string[];
|
|
161
193
|
/**
|
|
@@ -168,11 +200,21 @@ export interface FindManyOptions {
|
|
|
168
200
|
useFts?: boolean;
|
|
169
201
|
/** Inclusive date range over a whitelisted timestamp column. */
|
|
170
202
|
dateFilter?: ContentDateFilter;
|
|
203
|
+
/** Restrict to entries by their byline credits. */
|
|
204
|
+
bylineFilter?: ContentBylineFilter;
|
|
205
|
+
/** AND-combined filters over custom fields explicitly marked as indexed. */
|
|
206
|
+
fieldFilters?: ContentFieldFilters;
|
|
171
207
|
};
|
|
172
208
|
orderBy?: {
|
|
173
209
|
field: string;
|
|
174
210
|
direction: "asc" | "desc";
|
|
175
211
|
};
|
|
212
|
+
/**
|
|
213
|
+
* Extra field slugs allowed as `orderBy` beyond the system columns — the
|
|
214
|
+
* collection's configured titleField/dateField. Resolved by the
|
|
215
|
+
* handler server-side so `orderBy` stays a closed set per request.
|
|
216
|
+
*/
|
|
217
|
+
sortableExtras?: string[];
|
|
176
218
|
limit?: number;
|
|
177
219
|
cursor?: string; // Base64-encoded JSON: {orderValue: string, id: string}
|
|
178
220
|
}
|
|
@@ -278,6 +320,13 @@ export class EmDashValidationError extends Error {
|
|
|
278
320
|
}
|
|
279
321
|
}
|
|
280
322
|
|
|
323
|
+
export class ContentCollectionNotFoundError extends Error {
|
|
324
|
+
constructor(collection: string) {
|
|
325
|
+
super(`Collection '${collection}' not found`);
|
|
326
|
+
this.name = "ContentCollectionNotFoundError";
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
281
330
|
/**
|
|
282
331
|
* Thrown by `publish()` when called with `requireDue` for a row that is no
|
|
283
332
|
* longer due (its `scheduled_at` was cleared or pushed into the future between
|