emdash 0.36.0 → 0.37.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-CzL3H752.d.mts → adapters-BDQwg236.d.mts} +4 -2
- package/dist/{adapters-CzL3H752.d.mts.map → adapters-BDQwg236.d.mts.map} +1 -1
- package/dist/{allowed-origins-maylGaHv.mjs → allowed-origins-BGglilcs.mjs} +2 -2
- package/dist/{allowed-origins-maylGaHv.mjs.map → allowed-origins-BGglilcs.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -3
- package/dist/api/route-utils.mjs +17 -17
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +5 -5
- package/dist/api-Dz6rgoa3.mjs +10040 -0
- package/dist/api-Dz6rgoa3.mjs.map +1 -0
- package/dist/{api-tokens-9YrrCoE6.mjs → api-tokens-BSsQACNe.mjs} +2 -2
- package/dist/{api-tokens-9YrrCoE6.mjs.map → api-tokens-BSsQACNe.mjs.map} +1 -1
- package/dist/{apply-B_VMpJ2P.mjs → apply-B4SIOxR1.mjs} +18 -18
- package/dist/{apply-B_VMpJ2P.mjs.map → apply-B4SIOxR1.mjs.map} +1 -1
- package/dist/astro/image-endpoint.mjs +2 -2
- package/dist/astro/image-endpoint.mjs.map +1 -1
- package/dist/astro/index.d.mts +12 -12
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +110 -37
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +10 -10
- package/dist/astro/middleware/auth.mjs +6 -6
- package/dist/astro/middleware/media-usage-write-fence.mjs +2 -2
- package/dist/astro/middleware/redirect.mjs +3 -3
- package/dist/astro/middleware/request-context.mjs +2 -2
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +10 -10
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +157 -195
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +6 -6
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +6 -6
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +3 -3
- package/dist/astro/routes/api/admin/api-tokens/index.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +5 -5
- package/dist/astro/routes/api/admin/api-tokens/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +3 -3
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +8 -8
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +8 -8
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +8 -8
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +14 -14
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +14 -14
- package/dist/astro/routes/api/admin/bylines/index.mjs +14 -14
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +12 -12
- package/dist/astro/routes/api/admin/comments/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/comments/bulk.mjs +10 -10
- package/dist/astro/routes/api/admin/comments/counts.mjs +5 -5
- package/dist/astro/routes/api/admin/comments/index.mjs +10 -10
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +3 -3
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +2 -2
- package/dist/astro/routes/api/admin/media-usage/activation.mjs +10 -10
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +13 -13
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +13 -13
- package/dist/astro/routes/api/admin/media-usage/progress.mjs +11 -11
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +14 -14
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +13 -13
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +13 -13
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +4 -4
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +4 -4
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +49 -49
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +49 -49
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +47 -47
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +4 -4
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +47 -47
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +48 -48
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +48 -48
- package/dist/astro/routes/api/admin/plugins/index.mjs +47 -47
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +47 -47
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +48 -48
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +47 -47
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +48 -48
- 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 +54 -50
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +17 -16
- 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 +55 -51
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/verify.d.mts +8 -0
- package/dist/astro/routes/api/admin/plugins/registry/verify.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +93 -0
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -0
- package/dist/astro/routes/api/admin/plugins/updates.mjs +47 -47
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +47 -47
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +2 -2
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +47 -47
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +1 -1
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +1 -1
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +6 -6
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +2 -2
- package/dist/astro/routes/api/admin/users/index.mjs +6 -6
- package/dist/astro/routes/api/auth/dev-bypass.mjs +3 -3
- package/dist/astro/routes/api/auth/invite/accept.mjs +1 -1
- package/dist/astro/routes/api/auth/invite/complete.mjs +10 -10
- package/dist/astro/routes/api/auth/invite/index.mjs +7 -7
- package/dist/astro/routes/api/auth/invite/register-options.mjs +9 -9
- package/dist/astro/routes/api/auth/logout.mjs +2 -2
- package/dist/astro/routes/api/auth/magic-link/send.mjs +9 -9
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +2 -2
- package/dist/astro/routes/api/auth/me.mjs +7 -7
- package/dist/astro/routes/api/auth/mode.mjs +2 -2
- 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 +6 -6
- package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
- package/dist/astro/routes/api/auth/passkey/options.mjs +11 -11
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +9 -9
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +10 -10
- package/dist/astro/routes/api/auth/passkey/verify.mjs +10 -10
- package/dist/astro/routes/api/auth/signup/complete.mjs +10 -10
- package/dist/astro/routes/api/auth/signup/request.mjs +9 -9
- package/dist/astro/routes/api/auth/signup/verify.mjs +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +13 -13
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +12 -12
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +14 -5
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +10 -10
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +13 -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 +15 -15
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +15 -15
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +13 -13
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +14 -5
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/index.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/trash.mjs +7 -7
- package/dist/astro/routes/api/dashboard.mjs +7 -7
- package/dist/astro/routes/api/dev/emails.mjs +2 -2
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +15 -15
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +2 -2
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/execute.mjs +11 -11
- package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -10
- package/dist/astro/routes/api/import/wordpress/media.mjs +9 -9
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +9 -9
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +10 -10
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +15 -15
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +22 -22
- package/dist/astro/routes/api/manifest.mjs +3 -3
- package/dist/astro/routes/api/manifest.mjs.map +1 -1
- package/dist/astro/routes/api/mcp.mjs +188 -65
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +9 -9
- package/dist/astro/routes/api/media/_id_/replace.d.mts +8 -0
- package/dist/astro/routes/api/media/_id_/replace.d.mts.map +1 -0
- package/dist/astro/routes/api/media/_id_/replace.mjs +91 -0
- package/dist/astro/routes/api/media/_id_/replace.mjs.map +1 -0
- package/dist/astro/routes/api/media/_id_/upload.mjs +5 -5
- package/dist/astro/routes/api/media/_id_/usage.mjs +16 -16
- package/dist/astro/routes/api/media/_id_.mjs +15 -15
- package/dist/astro/routes/api/media/file/_...key_.d.mts.map +1 -1
- package/dist/astro/routes/api/media/file/_...key_.mjs +3 -2
- package/dist/astro/routes/api/media/file/_...key_.mjs.map +1 -1
- package/dist/astro/routes/api/media/folders/_id_.mjs +8 -8
- package/dist/astro/routes/api/media/folders/index.mjs +8 -8
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
- package/dist/astro/routes/api/media/providers/index.mjs +2 -2
- package/dist/astro/routes/api/media/upload-url.mjs +15 -13
- package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
- package/dist/astro/routes/api/media.d.mts.map +1 -1
- package/dist/astro/routes/api/media.mjs +47 -24
- package/dist/astro/routes/api/media.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +20 -13
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items.mjs +15 -11
- package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/reorder.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +15 -11
- package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/translations.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/translations.mjs +16 -12
- package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_.mjs +21 -14
- package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/index.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/index.mjs +15 -11
- package/dist/astro/routes/api/menus/index.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/authorize.mjs +5 -5
- package/dist/astro/routes/api/oauth/device/code.mjs +8 -8
- package/dist/astro/routes/api/oauth/device/token.mjs +7 -7
- package/dist/astro/routes/api/oauth/register.mjs +2 -2
- package/dist/astro/routes/api/oauth/token/refresh.mjs +5 -5
- package/dist/astro/routes/api/oauth/token/revoke.mjs +5 -5
- package/dist/astro/routes/api/oauth/token.mjs +5 -5
- package/dist/astro/routes/api/openapi.json.mjs +104 -38
- package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +4 -4
- package/dist/astro/routes/api/redirects/404s/index.mjs +8 -8
- package/dist/astro/routes/api/redirects/404s/summary.mjs +8 -8
- package/dist/astro/routes/api/redirects/_id_.mjs +9 -9
- package/dist/astro/routes/api/redirects/index.mjs +9 -9
- package/dist/astro/routes/api/relations/_id_/index.mjs +15 -15
- package/dist/astro/routes/api/relations/_id_/translations.mjs +10 -10
- package/dist/astro/routes/api/relations/index.mjs +15 -15
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +2 -2
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +3 -3
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +47 -47
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +47 -47
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +47 -47
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +47 -47
- package/dist/astro/routes/api/schema/collections/index.mjs +47 -47
- package/dist/astro/routes/api/schema/collections/reorder.mjs +47 -47
- package/dist/astro/routes/api/schema/index.mjs +8 -8
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +47 -47
- package/dist/astro/routes/api/schema/orphans/index.mjs +47 -47
- package/dist/astro/routes/api/search/enable.mjs +10 -10
- package/dist/astro/routes/api/search/index.mjs +9 -9
- package/dist/astro/routes/api/search/rebuild.mjs +10 -10
- package/dist/astro/routes/api/search/stats.mjs +5 -5
- package/dist/astro/routes/api/search/suggest.mjs +9 -9
- package/dist/astro/routes/api/sections/_slug_.mjs +9 -9
- package/dist/astro/routes/api/sections/index.mjs +9 -9
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +5 -5
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +4 -4
- package/dist/astro/routes/api/settings/backups/export.mjs +5 -5
- package/dist/astro/routes/api/settings/backups/index.mjs +6 -6
- package/dist/astro/routes/api/settings/email.mjs +4 -4
- package/dist/astro/routes/api/settings/email.mjs.map +1 -1
- package/dist/astro/routes/api/settings.d.mts.map +1 -1
- package/dist/astro/routes/api/settings.mjs +18 -14
- package/dist/astro/routes/api/settings.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin-verify.mjs +11 -11
- package/dist/astro/routes/api/setup/admin.mjs +10 -10
- package/dist/astro/routes/api/setup/dev-bypass.mjs +25 -25
- package/dist/astro/routes/api/setup/dev-reset.mjs +1 -1
- package/dist/astro/routes/api/setup/index.mjs +25 -25
- package/dist/astro/routes/api/setup/status.mjs +3 -3
- package/dist/astro/routes/api/snapshot.mjs +6 -6
- package/dist/astro/routes/api/taxonomies/_name_/reorder.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +19 -15
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +20 -16
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +24 -17
- 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 +19 -15
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +13 -13
- package/dist/astro/routes/api/taxonomies/_name_.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_.mjs +25 -18
- package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +19 -15
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +4 -4
- package/dist/astro/routes/api/typegen.mjs +4 -4
- 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.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +10 -8
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +16 -12
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +14 -11
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.mjs +7 -5
- package/dist/astro/routes/api/widget-areas/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/index.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/index.mjs +14 -11
- package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
- package/dist/astro/routes/api/widget-components.mjs +2 -2
- package/dist/astro/routes/robots.txt.mjs +5 -5
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +8 -8
- package/dist/astro/routes/sitemap.xml.mjs +6 -6
- package/dist/astro/types.d.mts +32 -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-ByYs-Uxs.mjs → authorize-Bkf_UHhD.mjs} +2 -2
- package/dist/{authorize-ByYs-Uxs.mjs.map → authorize-Bkf_UHhD.mjs.map} +1 -1
- package/dist/{backup-ChyHfIoX.mjs → backup-rwVAl9NI.mjs} +4 -4
- package/dist/{backup-ChyHfIoX.mjs.map → backup-rwVAl9NI.mjs.map} +1 -1
- package/dist/{bundle-DZFhFurR.mjs → bundle-C8S2Zl6U.mjs} +3 -3
- package/dist/{bundle-DZFhFurR.mjs.map → bundle-C8S2Zl6U.mjs.map} +1 -1
- package/dist/{byline-Cpnwrje1.mjs → byline-DuhF7NWl.mjs} +25 -12
- package/dist/byline-DuhF7NWl.mjs.map +1 -0
- package/dist/{byline-fields-CAyA_Umd.mjs → byline-fields-BovY4KYM.mjs} +1 -1
- package/dist/{byline-fields-CAyA_Umd.mjs.map → byline-fields-BovY4KYM.mjs.map} +1 -1
- package/dist/{bylines-BSo9B9RX.mjs → bylines-CJ5nd6Lw.mjs} +6 -6
- package/dist/{bylines-BSo9B9RX.mjs.map → bylines-CJ5nd6Lw.mjs.map} +1 -1
- package/dist/{bylines-CHjvehVX.mjs → bylines-RwBAeOF1.mjs} +3 -3
- package/dist/{bylines-CHjvehVX.mjs.map → bylines-RwBAeOF1.mjs.map} +1 -1
- package/dist/{cache-5VirJ2Cn.mjs → cache-BF5Kvn59.mjs} +2 -2
- package/dist/{cache-5VirJ2Cn.mjs.map → cache-BF5Kvn59.mjs.map} +1 -1
- package/dist/{challenge-store-D5pSY2S1.mjs → challenge-store-DQN_Yrck.mjs} +5 -3
- package/dist/challenge-store-DQN_Yrck.mjs.map +1 -0
- package/dist/chrome-tags-D8fiZG94.mjs +24 -0
- package/dist/chrome-tags-D8fiZG94.mjs.map +1 -0
- package/dist/{chunks-bNiX6_DR.mjs → chunks-C4szrD8o.mjs} +2 -2
- package/dist/{chunks-bNiX6_DR.mjs.map → chunks-C4szrD8o.mjs.map} +1 -1
- package/dist/cli/index.mjs +26 -26
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +2 -2
- package/dist/client/index.mjs +2 -2
- package/dist/{collection-deletion-m_oi2c0N.mjs → collection-deletion-Bj07NHbj.mjs} +2 -2
- package/dist/{collection-deletion-m_oi2c0N.mjs.map → collection-deletion-Bj07NHbj.mjs.map} +1 -1
- package/dist/{comment-reaction-CRuItEjt.mjs → comment-reaction-BhrvSHml.mjs} +2 -2
- package/dist/{comment-reaction-CRuItEjt.mjs.map → comment-reaction-BhrvSHml.mjs.map} +1 -1
- package/dist/{comment-DhvLEdhQ.mjs → comment-vxOzWbZN.mjs} +2 -2
- package/dist/{comment-DhvLEdhQ.mjs.map → comment-vxOzWbZN.mjs.map} +1 -1
- package/dist/{comments-CLj4bi8I.mjs → comments-Ct4ensnf.mjs} +2 -2
- package/dist/{comments-CLj4bi8I.mjs.map → comments-Ct4ensnf.mjs.map} +1 -1
- package/dist/{components-v4U4DT2y.mjs → components-DJbo1z0S.mjs} +1 -1
- package/dist/{components-v4U4DT2y.mjs.map → components-DJbo1z0S.mjs.map} +1 -1
- package/dist/{config-DrfghTPe.d.mts → config-B9eZ340f.d.mts} +1 -1
- package/dist/{config-DrfghTPe.d.mts.map → config-B9eZ340f.d.mts.map} +1 -1
- package/dist/config-it29yDLA.mjs +1163 -0
- package/dist/config-it29yDLA.mjs.map +1 -0
- package/dist/{content-CP-SeXNa.mjs → content-DjvM0T92.mjs} +84 -44
- package/dist/content-DjvM0T92.mjs.map +1 -0
- package/dist/{content-list-query-BhejKVqb.d.mts → content-list-query-Btqd4uV2.d.mts} +1 -1
- package/dist/{content-list-query-BhejKVqb.d.mts.map → content-list-query-Btqd4uV2.d.mts.map} +1 -1
- package/dist/{content-refresh-DLOfIhYc.mjs → content-refresh-Bwp-8yGy.mjs} +48 -21
- package/dist/content-refresh-Bwp-8yGy.mjs.map +1 -0
- package/dist/{content-repair-BCxzy0r4.mjs → content-repair-Czdp7jz5.mjs} +4 -4
- package/dist/{content-repair-BCxzy0r4.mjs.map → content-repair-Czdp7jz5.mjs.map} +1 -1
- package/dist/{context-BR5hRWiK.mjs → context-CX6gxOLW.mjs} +52 -17
- package/dist/context-CX6gxOLW.mjs.map +1 -0
- package/dist/{cron-CWfWrWKG.mjs → cron-C6o7VppJ.mjs} +1 -1
- package/dist/{cron-CWfWrWKG.mjs.map → cron-C6o7VppJ.mjs.map} +1 -1
- package/dist/{dashboard-CkIV2rnQ.mjs → dashboard-C2kTeeRI.mjs} +4 -4
- package/dist/{dashboard-CkIV2rnQ.mjs.map → dashboard-C2kTeeRI.mjs.map} +1 -1
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +1 -1
- package/dist/db/index.mjs.map +1 -1
- package/dist/db/libsql-migrations.d.mts +1 -1
- package/dist/db/libsql-migrations.mjs +4 -4
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres-migrations.d.mts +1 -1
- package/dist/db/postgres-migrations.mjs +4 -4
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/postgres.d.mts.map +1 -1
- package/dist/db/postgres.mjs +19 -3
- package/dist/db/postgres.mjs.map +1 -1
- package/dist/db/sqlite-migrations.d.mts +1 -1
- package/dist/db/sqlite-migrations.mjs +4 -4
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/db/sqlite.mjs +1 -1
- package/dist/{default-YMEfcQUx.mjs → default-Clra32mw.mjs} +1 -1
- package/dist/{default-YMEfcQUx.mjs.map → default-Clra32mw.mjs.map} +1 -1
- package/dist/{deferred-tasks-DfqxH5Xf.d.mts → deferred-tasks-CvDETTJO.d.mts} +1 -1
- package/dist/{deferred-tasks-DfqxH5Xf.d.mts.map → deferred-tasks-CvDETTJO.d.mts.map} +1 -1
- package/dist/dev-typegen-DzOPfsNj.mjs +29 -0
- package/dist/dev-typegen-DzOPfsNj.mjs.map +1 -0
- package/dist/{device-flow-CojjSBwb.mjs → device-flow-D2oCWvLJ.mjs} +4 -4
- package/dist/{device-flow-CojjSBwb.mjs.map → device-flow-D2oCWvLJ.mjs.map} +1 -1
- package/dist/{direct-executor-BWeWiRYB.mjs → direct-executor-Bfa5_ToE.mjs} +3 -3
- package/dist/{direct-executor-BWeWiRYB.mjs.map → direct-executor-Bfa5_ToE.mjs.map} +1 -1
- package/dist/{email-console-CEJgR_LB.mjs → email-console-Dzb6uGYa.mjs} +1 -1
- package/dist/{email-console-CEJgR_LB.mjs.map → email-console-Dzb6uGYa.mjs.map} +1 -1
- package/dist/{error-D9w94fjV.mjs → error-DFrQjppn.mjs} +2 -2
- package/dist/{error-D9w94fjV.mjs.map → error-DFrQjppn.mjs.map} +1 -1
- package/dist/{errors-n2j49uNf.mjs → errors-DsVoDUjJ.mjs} +3 -1
- package/dist/errors-DsVoDUjJ.mjs.map +1 -0
- package/dist/{escape-DN4Qmjsl.mjs → escape-HmHTC1Is.mjs} +1 -1
- package/dist/{escape-DN4Qmjsl.mjs.map → escape-HmHTC1Is.mjs.map} +1 -1
- package/dist/{field-defs-cache-Bh4q6oar.mjs → field-defs-cache-BM4SIRqH.mjs} +2 -2
- package/dist/{field-defs-cache-Bh4q6oar.mjs.map → field-defs-cache-BM4SIRqH.mjs.map} +1 -1
- package/dist/{fts-manager-BhOdW0bi.mjs → fts-manager-Do1BlW2r.mjs} +2 -2
- package/dist/{fts-manager-BhOdW0bi.mjs.map → fts-manager-Do1BlW2r.mjs.map} +1 -1
- package/dist/{hash-CTcngWvj.mjs → hash-3JJPlHF2.mjs} +1 -1
- package/dist/{hash-CTcngWvj.mjs.map → hash-3JJPlHF2.mjs.map} +1 -1
- package/dist/hook-result-DCh2WUpe.d.mts +31 -0
- package/dist/hook-result-DCh2WUpe.d.mts.map +1 -0
- package/dist/{hreflang-7pTHsLZJ.d.mts → hreflang-B6hbAuuO.d.mts} +2 -2
- package/dist/{hreflang-7pTHsLZJ.d.mts.map → hreflang-B6hbAuuO.d.mts.map} +1 -1
- package/dist/{hreflang-Huc6O5wa.mjs → hreflang-DQbPZliA.mjs} +6 -6
- package/dist/{hreflang-Huc6O5wa.mjs.map → hreflang-DQbPZliA.mjs.map} +1 -1
- package/dist/{identity-DXmb4aVp.mjs → identity-DksvEazf.mjs} +3 -3
- package/dist/{identity-DXmb4aVp.mjs.map → identity-DksvEazf.mjs.map} +1 -1
- package/dist/{import-C4_O3KXU.mjs → import-CJpaBBBT.mjs} +5 -5
- package/dist/{import-C4_O3KXU.mjs.map → import-CJpaBBBT.mjs.map} +1 -1
- package/dist/{index-DWbJrsAg.d.mts → index-BJNMCWmu.d.mts} +158 -49
- package/dist/index-BJNMCWmu.d.mts.map +1 -0
- package/dist/{index-6bRee8zb.d.mts → index-Du8K7bWa.d.mts} +3 -3
- package/dist/{index-6bRee8zb.d.mts.map → index-Du8K7bWa.d.mts.map} +1 -1
- package/dist/index.d.mts +22 -21
- package/dist/index.mjs +70 -70
- package/dist/{load-Bo7fZAbg.mjs → load-CawHjTOH.mjs} +2 -2
- package/dist/{load-Bo7fZAbg.mjs.map → load-CawHjTOH.mjs.map} +1 -1
- package/dist/{loader-ZsjE4paL.mjs → loader-Z8vl7zTq.mjs} +48 -13
- package/dist/loader-Z8vl7zTq.mjs.map +1 -0
- package/dist/{manifest-builder-QXuqvVMP.mjs → manifest-builder-COtzuca2.mjs} +2 -2
- package/dist/{manifest-builder-QXuqvVMP.mjs.map → manifest-builder-COtzuca2.mjs.map} +1 -1
- package/dist/{manifest-schema-CUYPfCEH.mjs → manifest-schema-BNWwR8Vd.mjs} +5 -5
- package/dist/manifest-schema-BNWwR8Vd.mjs.map +1 -0
- package/dist/media/image-endpoint.d.mts +4 -2
- package/dist/media/image-endpoint.d.mts.map +1 -1
- package/dist/media/image-endpoint.mjs +6 -4
- package/dist/media/image-endpoint.mjs.map +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +1 -1
- package/dist/media/local-runtime.d.mts +12 -12
- package/dist/media/local-runtime.mjs +4 -4
- package/dist/{media-D6SeAfBl.mjs → media-BBm8Wg3f.mjs} +30 -2
- package/dist/media-BBm8Wg3f.mjs.map +1 -0
- package/dist/{media-BjwNuLEu.mjs → media-BHjus86Y.mjs} +35 -5
- package/dist/media-BHjus86Y.mjs.map +1 -0
- package/dist/{media-allowlist-D35v7bmL.mjs → media-allowlist-CoTBWoDp.mjs} +1 -1
- package/dist/{media-allowlist-D35v7bmL.mjs.map → media-allowlist-CoTBWoDp.mjs.map} +1 -1
- package/dist/{media-folders-D-0CmRZj.mjs → media-folders-BGkATs8n.mjs} +1 -1
- package/dist/{media-folders-D-0CmRZj.mjs.map → media-folders-BGkATs8n.mjs.map} +1 -1
- package/dist/{media-upload-C7bLXGcI.mjs → media-upload-BCidR-EY.mjs} +6 -6
- package/dist/{media-upload-C7bLXGcI.mjs.map → media-upload-BCidR-EY.mjs.map} +1 -1
- package/dist/{media-url-DH7giMx_.mjs → media-url-DHoPr0hq.mjs} +1 -1
- package/dist/{media-url-DH7giMx_.mjs.map → media-url-DHoPr0hq.mjs.map} +1 -1
- package/dist/{media-usage-BTRJvS6V.mjs → media-usage-CdY5jhSR.mjs} +8 -8
- package/dist/{media-usage-BTRJvS6V.mjs.map → media-usage-CdY5jhSR.mjs.map} +1 -1
- package/dist/{media-usage-activation-Dx0kPV6b.mjs → media-usage-activation-BgeMtK5C.mjs} +2 -2
- package/dist/{media-usage-activation-Dx0kPV6b.mjs.map → media-usage-activation-BgeMtK5C.mjs.map} +1 -1
- package/dist/{media-usage-work-DWb2XPMI.mjs → media-usage-work-CnGCdHxx.mjs} +4 -4
- package/dist/{media-usage-work-DWb2XPMI.mjs.map → media-usage-work-CnGCdHxx.mjs.map} +1 -1
- package/dist/{media-usage-work-C-fhM30c.mjs → media-usage-work-D6D9sMCA.mjs} +1 -1
- package/dist/{media-usage-work-C-fhM30c.mjs.map → media-usage-work-D6D9sMCA.mjs.map} +1 -1
- package/dist/{media-usage-write-fence-BwoJVRDC.mjs → media-usage-write-fence-hjeD4u7s.mjs} +2 -2
- package/dist/{media-usage-write-fence-BwoJVRDC.mjs.map → media-usage-write-fence-hjeD4u7s.mjs.map} +1 -1
- package/dist/{menus-CNg0QlDt.mjs → menus-6qSwTNxG.mjs} +346 -94
- package/dist/menus-6qSwTNxG.mjs.map +1 -0
- package/dist/{menus-CD7EFLwz.mjs → menus-uvPLXMZf.mjs} +3 -3
- package/dist/{menus-CD7EFLwz.mjs.map → menus-uvPLXMZf.mjs.map} +1 -1
- package/dist/migrations/index.d.mts +1 -1
- package/dist/migrations/index.mjs +3 -3
- package/dist/{mode-DaUM_MB2.mjs → mode-DN_WneRx.mjs} +1 -1
- package/dist/{mode-DaUM_MB2.mjs.map → mode-DN_WneRx.mjs.map} +1 -1
- package/dist/{node-sqlite-compat-Udb4Y-rs.mjs → node-sqlite-compat-BuJXIeMz.mjs} +1 -1
- package/dist/{node-sqlite-compat-Udb4Y-rs.mjs.map → node-sqlite-compat-BuJXIeMz.mjs.map} +1 -1
- package/dist/{normalize-CSxdKBVa.mjs → normalize-C2xNjTSG.mjs} +15 -5
- package/dist/normalize-C2xNjTSG.mjs.map +1 -0
- package/dist/{oauth-authorization-Dpsb-fMJ.mjs → oauth-authorization-Dj6Kwc21.mjs} +4 -4
- package/dist/{oauth-authorization-Dpsb-fMJ.mjs.map → oauth-authorization-Dj6Kwc21.mjs.map} +1 -1
- package/dist/{oauth-clients-Bxnoe_67.mjs → oauth-clients-FD7I0J8m.mjs} +1 -1
- package/dist/{oauth-clients-Bxnoe_67.mjs.map → oauth-clients-FD7I0J8m.mjs.map} +1 -1
- package/dist/{oauth-state-store-0C4s0K6w.mjs → oauth-state-store-DkmDOmHs.mjs} +1 -1
- package/dist/{oauth-state-store-0C4s0K6w.mjs.map → oauth-state-store-DkmDOmHs.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-wlGYSeqX.mjs → oauth-user-lookup-CvIwGpYd.mjs} +1 -1
- package/dist/{oauth-user-lookup-wlGYSeqX.mjs.map → oauth-user-lookup-CvIwGpYd.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/{object-cache-71tPfV4A.mjs → object-cache-DVKnyOfy.mjs} +19 -3
- package/dist/object-cache-DVKnyOfy.mjs.map +1 -0
- package/dist/{options-BhZIeFY1.d.mts → options-CYb4y7hM.d.mts} +24 -11
- package/dist/options-CYb4y7hM.d.mts.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/{parse-BRJg1kz8.mjs → parse-Ckpg-Qfp.mjs} +2 -2
- package/dist/{parse-BRJg1kz8.mjs.map → parse-Ckpg-Qfp.mjs.map} +1 -1
- package/dist/{passkey-config-B3P0nHRR.mjs → passkey-config-O_lj3y0k.mjs} +1 -1
- package/dist/{passkey-config-B3P0nHRR.mjs.map → passkey-config-O_lj3y0k.mjs.map} +1 -1
- package/dist/{placeholder-BR4ZhVJl.d.mts → placeholder-4X9BrRrp.d.mts} +1 -1
- package/dist/{placeholder-BR4ZhVJl.d.mts.map → placeholder-4X9BrRrp.d.mts.map} +1 -1
- package/dist/plugin-types.d.mts +8 -3
- 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 +2 -2
- package/dist/{policy-BVRganJQ.mjs → policy-Dhtwntrt.mjs} +2 -2
- package/dist/{policy-BVRganJQ.mjs.map → policy-Dhtwntrt.mjs.map} +1 -1
- package/dist/{portable-text-C8Tvp4_g.mjs → portable-text-U85hOafW.mjs} +1 -1
- package/dist/{portable-text-C8Tvp4_g.mjs.map → portable-text-U85hOafW.mjs.map} +1 -1
- package/dist/{preview-dn2dUyM0.mjs → preview-B_vJLvf8.mjs} +2 -2
- package/dist/{preview-dn2dUyM0.mjs.map → preview-B_vJLvf8.mjs.map} +1 -1
- package/dist/{protocol-CuBEsqgE.d.mts → protocol-JdD2YhY9.d.mts} +2 -2
- package/dist/{protocol-CuBEsqgE.d.mts.map → protocol-JdD2YhY9.d.mts.map} +1 -1
- package/dist/{public-url-DRz_AinV.mjs → public-url-CarhZJgf.mjs} +1 -1
- package/dist/{public-url-DRz_AinV.mjs.map → public-url-CarhZJgf.mjs.map} +1 -1
- package/dist/{query-D18vTdha.mjs → query-BZKZcG5b.mjs} +14 -14
- package/dist/{query-D18vTdha.mjs.map → query-BZKZcG5b.mjs.map} +1 -1
- package/dist/{query-tZDEdtCN.mjs → query-BndaFxxp.mjs} +4 -4
- package/dist/{query-tZDEdtCN.mjs.map → query-BndaFxxp.mjs.map} +1 -1
- package/dist/{rate-limit-on7KPo-v.mjs → rate-limit-BZmATC6W.mjs} +2 -2
- package/dist/{rate-limit-on7KPo-v.mjs.map → rate-limit-BZmATC6W.mjs.map} +1 -1
- package/dist/{redirect-DrbEmU9a.mjs → redirect-CzqnLxK-.mjs} +1 -1
- package/dist/{redirect-DrbEmU9a.mjs.map → redirect-CzqnLxK-.mjs.map} +1 -1
- package/dist/{redirects-CRIM55KH.mjs → redirects-BLNOWQTn.mjs} +63 -28
- package/dist/redirects-BLNOWQTn.mjs.map +1 -0
- package/dist/{redirects-BahWiu8Z.mjs → redirects-CqzNM0KM.mjs} +2 -2
- package/dist/{redirects-BahWiu8Z.mjs.map → redirects-CqzNM0KM.mjs.map} +1 -1
- package/dist/{registry-Cx-jEJOS.mjs → registry-AZAsRsor.mjs} +27 -9
- package/dist/registry-AZAsRsor.mjs.map +1 -0
- package/dist/{relation-A6wLF_DS.mjs → relation-04DfKRTO.mjs} +2 -2
- package/dist/{relation-A6wLF_DS.mjs.map → relation-04DfKRTO.mjs.map} +1 -1
- package/dist/{relations-BTPM2saV.mjs → relations-C4htk5sb.mjs} +7 -7
- package/dist/relations-C4htk5sb.mjs.map +1 -0
- package/dist/{relations-Cj5hZ6Zg.mjs → relations-CcFwDJdJ.mjs} +4 -4
- package/dist/{relations-Cj5hZ6Zg.mjs.map → relations-CcFwDJdJ.mjs.map} +1 -1
- package/dist/{relations-C7B46bcU.d.mts → relations-DnRK4YIT.d.mts} +175 -41
- package/dist/relations-DnRK4YIT.d.mts.map +1 -0
- package/dist/request-context.d.mts +1 -1
- package/dist/{request-meta-DRp5ENd_.mjs → request-meta-DYxLlnmz.mjs} +2 -2
- package/dist/{request-meta-DRp5ENd_.mjs.map → request-meta-DYxLlnmz.mjs.map} +1 -1
- package/dist/{resolve-DxUpTMmE.mjs → resolve-prZ3mP7l.mjs} +1 -1
- package/dist/{resolve-DxUpTMmE.mjs.map → resolve-prZ3mP7l.mjs.map} +1 -1
- package/dist/{runner-77GOZCnH.mjs → runner-BLIDKpmA.mjs} +351 -294
- package/dist/runner-BLIDKpmA.mjs.map +1 -0
- package/dist/{runner-zgqA_CqP.d.mts → runner-YKfIMnaF.d.mts} +3 -2
- package/dist/runner-YKfIMnaF.d.mts.map +1 -0
- package/dist/runtime.d.mts +11 -11
- package/dist/runtime.mjs +1 -1
- package/dist/{schema-BY-oVntF.mjs → schema-CGnBeLiW.mjs} +3 -3
- package/dist/{schema-BY-oVntF.mjs.map → schema-CGnBeLiW.mjs.map} +1 -1
- package/dist/{schema-Cw9kVK0I.mjs → schema-DYr-Vd-L.mjs} +5 -5
- package/dist/{schema-Cw9kVK0I.mjs.map → schema-DYr-Vd-L.mjs.map} +1 -1
- package/dist/{scopes-vMR1uIbt.mjs → scopes-BhWvBavj.mjs} +3 -3
- package/dist/{scopes-vMR1uIbt.mjs.map → scopes-BhWvBavj.mjs.map} +1 -1
- package/dist/{search-CfT3KxO5.mjs → search-C-qDk4kx.mjs} +4 -4
- package/dist/{search-CfT3KxO5.mjs.map → search-C-qDk4kx.mjs.map} +1 -1
- package/dist/{secrets-BH2Qow1-.mjs → secrets-rEtHt-6z.mjs} +1 -1
- package/dist/{secrets-BH2Qow1-.mjs.map → secrets-rEtHt-6z.mjs.map} +1 -1
- package/dist/{sections-DTfjyf1z.mjs → sections-B_nYvlwn.mjs} +2 -2
- package/dist/{sections-DTfjyf1z.mjs.map → sections-B_nYvlwn.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +18 -18
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.mjs +13 -13
- package/dist/{seo-Cm-dtvgk.mjs → seo-926NRIgt.mjs} +3 -3
- package/dist/{seo-Cm-dtvgk.mjs.map → seo-926NRIgt.mjs.map} +1 -1
- package/dist/{seo-BSiTIXzd.mjs → seo-CVWkdv6x.mjs} +1 -1
- package/dist/{seo-BSiTIXzd.mjs.map → seo-CVWkdv6x.mjs.map} +1 -1
- package/dist/{service-DYsDHEKe.mjs → service-CJl3ZAYs.mjs} +3 -3
- package/dist/{service-DYsDHEKe.mjs.map → service-CJl3ZAYs.mjs.map} +1 -1
- package/dist/{session-user-CNAfvsdw.mjs → session-user-BlMgqCHS.mjs} +1 -1
- package/dist/{session-user-CNAfvsdw.mjs.map → session-user-BlMgqCHS.mjs.map} +1 -1
- package/dist/{settings-BgN-0DT-.mjs → settings--wobrkkC.mjs} +18 -5
- package/dist/settings--wobrkkC.mjs.map +1 -0
- package/dist/{settings-DjtkUo__.mjs → settings-Cwm6o2jY.mjs} +3 -3
- package/dist/{settings-DjtkUo__.mjs.map → settings-Cwm6o2jY.mjs.map} +1 -1
- package/dist/{setup-complete-CcpXaPU7.mjs → setup-complete-DQbClIN2.mjs} +1 -1
- package/dist/{setup-complete-CcpXaPU7.mjs.map → setup-complete-DQbClIN2.mjs.map} +1 -1
- package/dist/{setup-nonce-Reyw30jg.mjs → setup-nonce-DZCFS2sn.mjs} +1 -1
- package/dist/{setup-nonce-Reyw30jg.mjs.map → setup-nonce-DZCFS2sn.mjs.map} +1 -1
- package/dist/{site-url-Cs_V9n3V.mjs → site-url-BrxA_E9H.mjs} +2 -2
- package/dist/{site-url-Cs_V9n3V.mjs.map → site-url-BrxA_E9H.mjs.map} +1 -1
- package/dist/{snapshot-DSB8P7Lm.mjs → snapshot--OCDTqdb.mjs} +1 -1
- package/dist/{snapshot-DSB8P7Lm.mjs.map → snapshot--OCDTqdb.mjs.map} +1 -1
- package/dist/{ssrf-DqebVE34.mjs → ssrf-5sIM5jzl.mjs} +4 -3
- package/dist/{ssrf-DqebVE34.mjs.map → ssrf-5sIM5jzl.mjs.map} +1 -1
- package/dist/{state-BJfU9Uzw.mjs → state-BpFVsJZB.mjs} +1 -1
- package/dist/{state-BJfU9Uzw.mjs.map → state-BpFVsJZB.mjs.map} +1 -1
- package/dist/{status-DDu8HIQl.mjs → status-B777-dXz.mjs} +1 -1
- package/dist/{status-DDu8HIQl.mjs.map → status-B777-dXz.mjs.map} +1 -1
- package/dist/storage/local.d.mts +2 -1
- package/dist/storage/local.d.mts.map +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/local.mjs.map +1 -1
- package/dist/storage/s3.d.mts +2 -1
- package/dist/storage/s3.d.mts.map +1 -1
- package/dist/storage/s3.mjs +3 -2
- package/dist/storage/s3.mjs.map +1 -1
- package/dist/{target-D0o26Azo.mjs → target-BmR0iTwz.mjs} +1 -1
- package/dist/{target-D0o26Azo.mjs.map → target-BmR0iTwz.mjs.map} +1 -1
- package/dist/{taxonomies-CPGxo-bn.mjs → taxonomies-DkAkMupr.mjs} +16 -13
- package/dist/taxonomies-DkAkMupr.mjs.map +1 -0
- package/dist/{taxonomies-kmyudNGP.mjs → taxonomies-Wfy_Lg12.mjs} +42 -16
- package/dist/taxonomies-Wfy_Lg12.mjs.map +1 -0
- package/dist/{taxonomy-8X09dLN5.mjs → taxonomy-tJepplLL.mjs} +4 -4
- package/dist/{taxonomy-8X09dLN5.mjs.map → taxonomy-tJepplLL.mjs.map} +1 -1
- package/dist/{tokens-gTS-IVUp.mjs → tokens-BCO1oruF.mjs} +1 -1
- package/dist/{tokens-gTS-IVUp.mjs.map → tokens-BCO1oruF.mjs.map} +1 -1
- package/dist/{transport-fX59xaJz.mjs → transport-Dr3qtwXC.mjs} +1 -1
- package/dist/{transport-fX59xaJz.mjs.map → transport-Dr3qtwXC.mjs.map} +1 -1
- package/dist/{transport-_6R1ub7t.d.mts → transport-xh6YKW2G.d.mts} +1 -1
- package/dist/{transport-_6R1ub7t.d.mts.map → transport-xh6YKW2G.d.mts.map} +1 -1
- package/dist/{trusted-proxy-fe6nEgR4.mjs → trusted-proxy-BR5F1Otp.mjs} +1 -1
- package/dist/{trusted-proxy-fe6nEgR4.mjs.map → trusted-proxy-BR5F1Otp.mjs.map} +1 -1
- package/dist/{types-BXUmsINL.mjs → types-3qNFPlci.mjs} +1 -1
- package/dist/{types-BXUmsINL.mjs.map → types-3qNFPlci.mjs.map} +1 -1
- package/dist/{types-Vg6f5i3s.d.mts → types-B6GrPic4.d.mts} +9 -3
- package/dist/{types-Vg6f5i3s.d.mts.map → types-B6GrPic4.d.mts.map} +1 -1
- package/dist/{types-DJQxln7q.d.mts → types-BuHW4xDE.d.mts} +11 -10
- package/dist/types-BuHW4xDE.d.mts.map +1 -0
- package/dist/{types-BzBd3PeX.d.mts → types-C00oyCZp.d.mts} +1 -1
- package/dist/{types-BzBd3PeX.d.mts.map → types-C00oyCZp.d.mts.map} +1 -1
- package/dist/{types-Blb-MRC3.d.mts → types-CDtkNSFQ.d.mts} +1 -1
- package/dist/{types-Blb-MRC3.d.mts.map → types-CDtkNSFQ.d.mts.map} +1 -1
- package/dist/{types-D5VVLr7J.d.mts → types-CPeXo1wF.d.mts} +1 -1
- package/dist/{types-D5VVLr7J.d.mts.map → types-CPeXo1wF.d.mts.map} +1 -1
- package/dist/types-CQPWhPxE.mjs.map +1 -1
- package/dist/{types-D_DWe7k9.d.mts → types-CXFkwEGC.d.mts} +3 -2
- package/dist/types-CXFkwEGC.d.mts.map +1 -0
- package/dist/{types-CLqvnd05.d.mts → types-DczELMop.d.mts} +1 -1
- package/dist/{types-CLqvnd05.d.mts.map → types-DczELMop.d.mts.map} +1 -1
- package/dist/types-DfuTR6dL.mjs +3 -0
- package/dist/{types-DHxzBjbD.d.mts → types-FV23hEoW.d.mts} +1 -1
- package/dist/{types-DHxzBjbD.d.mts.map → types-FV23hEoW.d.mts.map} +1 -1
- package/dist/{types-Br-ERaxh.d.mts → types-xDMtUFnO.d.mts} +1 -1
- package/dist/{types-Br-ERaxh.d.mts.map → types-xDMtUFnO.d.mts.map} +1 -1
- package/dist/{upload-attempts-CNyGSepg.mjs → upload-attempts-BsqoQ1fn.mjs} +1 -1
- package/dist/{upload-attempts-CNyGSepg.mjs.map → upload-attempts-BsqoQ1fn.mjs.map} +1 -1
- package/dist/{url-pattern-K-KdXcSe.mjs → url-pattern-D4c2czpJ.mjs} +1 -1
- package/dist/{url-pattern-K-KdXcSe.mjs.map → url-pattern-D4c2czpJ.mjs.map} +1 -1
- package/dist/{user-CtYY0tp2.mjs → user-BTZ40aq6.mjs} +2 -2
- package/dist/{user-CtYY0tp2.mjs.map → user-BTZ40aq6.mjs.map} +1 -1
- package/dist/{utils-HztC73hq.mjs → utils-BKvNjjhY.mjs} +1 -1
- package/dist/{utils-HztC73hq.mjs.map → utils-BKvNjjhY.mjs.map} +1 -1
- package/dist/{validate-Dd-IUjnZ.mjs → validate-DE_LRwo9.mjs} +2 -2
- package/dist/{validate-Dd-IUjnZ.mjs.map → validate-DE_LRwo9.mjs.map} +1 -1
- package/dist/{validate-DlqdOZXB.d.mts → validate-DUP27OYD.d.mts} +5 -5
- package/dist/{validate-DlqdOZXB.d.mts.map → validate-DUP27OYD.d.mts.map} +1 -1
- package/dist/{validation-D83n7Npi.mjs → validation-BMImFJ11.mjs} +8 -8
- package/dist/{validation-D83n7Npi.mjs.map → validation-BMImFJ11.mjs.map} +1 -1
- package/dist/version-Bii3suaO.mjs +7 -0
- package/dist/{version-ri-sCyAp.mjs.map → version-Bii3suaO.mjs.map} +1 -1
- package/dist/{widgets-CpmZd9Q-.mjs → widgets-D3gJ10xU.mjs} +17 -4
- package/dist/widgets-D3gJ10xU.mjs.map +1 -0
- package/dist/{wxr-taxonomies-BFd0y72_.d.mts → wxr-taxonomies-B2Og_6rU.d.mts} +1 -1
- package/dist/{wxr-taxonomies-BFd0y72_.d.mts.map → wxr-taxonomies-B2Og_6rU.d.mts.map} +1 -1
- package/dist/{wxr-taxonomies-Df4vxWcU.mjs → wxr-taxonomies-Cxngsjwo.mjs} +4 -4
- package/dist/{wxr-taxonomies-Df4vxWcU.mjs.map → wxr-taxonomies-Cxngsjwo.mjs.map} +1 -1
- package/dist/{zod-generator-DylzusHh.mjs → zod-generator-BuYSQJB7.mjs} +11 -7
- package/dist/zod-generator-BuYSQJB7.mjs.map +1 -0
- package/package.json +12 -9
- package/src/api/errors.ts +2 -0
- package/src/api/handlers/content.ts +49 -11
- package/src/api/handlers/index.ts +1 -0
- package/src/api/handlers/manifest.ts +161 -12
- package/src/api/handlers/media.ts +30 -0
- package/src/api/handlers/registry.ts +393 -289
- package/src/api/handlers/taxonomies.ts +16 -9
- package/src/api/openapi/document.ts +85 -5
- package/src/api/parse.ts +1 -1
- package/src/api/schemas/auth.ts +4 -4
- package/src/api/schemas/bylines.ts +3 -3
- package/src/api/schemas/comments.ts +1 -1
- package/src/api/schemas/common.ts +3 -2
- package/src/api/schemas/content.ts +78 -22
- package/src/api/schemas/media.ts +52 -0
- package/src/api/schemas/redirects.ts +6 -1
- package/src/api/schemas/schema.ts +4 -0
- package/src/api/schemas/setup.ts +1 -1
- package/src/api/schemas/taxonomies.ts +2 -2
- package/src/api/schemas/users.ts +1 -1
- package/src/api/types.ts +23 -10
- package/src/astro/dev-typegen.ts +35 -0
- package/src/astro/image-endpoint.ts +2 -2
- package/src/astro/integration/dev-typegen.ts +91 -0
- package/src/astro/integration/index.ts +9 -44
- package/src/astro/integration/routes.ts +5 -0
- package/src/astro/integration/vite-config.ts +21 -2
- package/src/astro/middleware.ts +5 -0
- package/src/astro/routes/api/admin/api-tokens/index.ts +4 -1
- package/src/astro/routes/api/admin/oauth-clients/[id].ts +1 -1
- package/src/astro/routes/api/admin/oauth-clients/index.ts +1 -1
- package/src/astro/routes/api/admin/plugins/registry/[id]/update.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/artifact.ts +3 -7
- package/src/astro/routes/api/admin/plugins/registry/install.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/verify.ts +60 -0
- package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +8 -2
- package/src/astro/routes/api/content/[collection]/[id]/publish.ts +2 -1
- package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +6 -2
- package/src/astro/routes/api/manifest.ts +1 -1
- package/src/astro/routes/api/media/[id]/replace.ts +114 -0
- package/src/astro/routes/api/media/file/[...key].ts +4 -1
- package/src/astro/routes/api/media/upload-url.ts +8 -4
- package/src/astro/routes/api/media.ts +54 -8
- package/src/astro/routes/api/menus/[name]/items/[id].ts +7 -2
- package/src/astro/routes/api/menus/[name]/items.ts +4 -1
- package/src/astro/routes/api/menus/[name]/reorder.ts +4 -1
- package/src/astro/routes/api/menus/[name]/translations.ts +4 -1
- package/src/astro/routes/api/menus/[name].ts +7 -2
- package/src/astro/routes/api/menus/index.ts +4 -1
- package/src/astro/routes/api/settings/email.ts +1 -1
- package/src/astro/routes/api/settings.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name]/reorder.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name]/terms/[slug]/translations.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name]/terms/[slug].ts +7 -2
- package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name].ts +7 -2
- package/src/astro/routes/api/taxonomies/index.ts +4 -1
- package/src/astro/routes/api/widget-areas/[name]/reorder.ts +3 -1
- package/src/astro/routes/api/widget-areas/[name]/widgets/[id].ts +5 -2
- package/src/astro/routes/api/widget-areas/[name]/widgets.ts +3 -1
- package/src/astro/routes/api/widget-areas/[name].ts +3 -1
- package/src/astro/routes/api/widget-areas/index.ts +3 -1
- package/src/astro/types.ts +23 -5
- package/src/auth/challenge-store.ts +3 -1
- package/src/aws-sdk.d.ts +1 -0
- package/src/cache/chrome-tags.ts +24 -0
- package/src/components/EmDashImage.astro +2 -1
- package/src/components/EmDashMedia.astro +2 -1
- package/src/components/InlinePortableTextEditor.tsx +6 -1
- package/src/components/widgets/Archives.astro +2 -37
- package/src/content/converters/index.ts +2 -0
- package/src/content/converters/mark-safety.ts +1 -0
- package/src/content/converters/portable-text-identity.ts +139 -0
- package/src/content/converters/portable-text-to-prosemirror.ts +202 -69
- package/src/content/converters/prosemirror-to-portable-text.ts +96 -25
- package/src/content/converters/types.ts +1 -0
- package/src/database/migrations/017_authorization_codes.ts +14 -4
- package/src/database/migrations/074_content_deleted_scheduled_index.ts +55 -0
- package/src/database/migrations/runner.ts +3 -1
- package/src/database/repositories/byline.ts +32 -16
- package/src/database/repositories/content.ts +114 -47
- package/src/database/repositories/media-usage.ts +66 -37
- package/src/database/repositories/media.ts +60 -1
- package/src/database/repositories/plugin-storage.ts +74 -9
- package/src/database/repositories/types.ts +8 -7
- package/src/db/adapters.ts +8 -1
- package/src/db/postgres.ts +23 -0
- package/src/emdash-runtime.ts +80 -150
- package/src/fields/boolean.ts +1 -1
- package/src/fields/datetime.ts +1 -1
- package/src/fields/file.ts +1 -1
- package/src/fields/integer.ts +1 -1
- package/src/fields/json.ts +1 -1
- package/src/fields/multiselect.ts +1 -1
- package/src/fields/number.ts +1 -1
- package/src/fields/portable-text.ts +1 -1
- package/src/fields/richtext.ts +1 -1
- package/src/fields/select.ts +1 -1
- package/src/fields/slug.ts +1 -1
- package/src/fields/text.ts +1 -1
- package/src/fields/textarea.ts +1 -1
- package/src/fields/types.ts +2 -2
- package/src/index.ts +25 -3
- package/src/loader.ts +63 -10
- package/src/mcp/server.ts +228 -24
- package/src/media/image-endpoint.ts +5 -2
- package/src/media/normalize.ts +15 -4
- package/src/media/usage/cleanup.ts +9 -8
- package/src/menus/index.ts +16 -0
- package/src/object-cache/index.ts +44 -2
- package/src/plugin-types.ts +18 -1
- package/src/plugins/hooks.ts +4 -1
- package/src/plugins/index.ts +6 -0
- package/src/plugins/manager.ts +2 -1
- package/src/plugins/manifest-schema.ts +1 -1
- package/src/plugins/routes.ts +3 -1
- package/src/plugins/sandbox/hook-result.ts +52 -0
- package/src/plugins/sandbox/index.ts +10 -0
- package/src/plugins/types.ts +6 -0
- package/src/registry/artifact-checksum.ts +15 -0
- package/src/registry/artifact-verification.ts +85 -0
- package/src/registry/authoritative-records.ts +180 -0
- package/src/registry/record-labels.ts +28 -0
- package/src/schema/registry.ts +26 -3
- package/src/schema/zod-generator.ts +16 -13
- package/src/security/ssrf.ts +5 -2
- package/src/settings/index.ts +16 -0
- package/src/storage/local.ts +1 -0
- package/src/storage/s3.ts +2 -0
- package/src/storage/types.ts +2 -0
- package/src/taxonomies/index.ts +40 -20
- package/src/widgets/archives.ts +67 -0
- package/src/widgets/index.ts +16 -0
- package/dist/api-B0w3uBiG.mjs +0 -2269
- package/dist/api-B0w3uBiG.mjs.map +0 -1
- package/dist/byline-Cpnwrje1.mjs.map +0 -1
- package/dist/challenge-store-D5pSY2S1.mjs.map +0 -1
- package/dist/content-CP-SeXNa.mjs.map +0 -1
- package/dist/content-refresh-DLOfIhYc.mjs.map +0 -1
- package/dist/context-BR5hRWiK.mjs.map +0 -1
- package/dist/errors-n2j49uNf.mjs.map +0 -1
- package/dist/index-DWbJrsAg.d.mts.map +0 -1
- package/dist/loader-ZsjE4paL.mjs.map +0 -1
- package/dist/manifest-schema-CUYPfCEH.mjs.map +0 -1
- package/dist/media-BjwNuLEu.mjs.map +0 -1
- package/dist/media-D6SeAfBl.mjs.map +0 -1
- package/dist/menus-CNg0QlDt.mjs.map +0 -1
- package/dist/normalize-CSxdKBVa.mjs.map +0 -1
- package/dist/object-cache-71tPfV4A.mjs.map +0 -1
- package/dist/options-BhZIeFY1.d.mts.map +0 -1
- package/dist/redirects-CRIM55KH.mjs.map +0 -1
- package/dist/registry-BiO5WwPq.mjs +0 -2716
- package/dist/registry-BiO5WwPq.mjs.map +0 -1
- package/dist/registry-Cx-jEJOS.mjs.map +0 -1
- package/dist/relations-BTPM2saV.mjs.map +0 -1
- package/dist/relations-C7B46bcU.d.mts.map +0 -1
- package/dist/runner-77GOZCnH.mjs.map +0 -1
- package/dist/runner-zgqA_CqP.d.mts.map +0 -1
- package/dist/settings-BgN-0DT-.mjs.map +0 -1
- package/dist/taxonomies-CPGxo-bn.mjs.map +0 -1
- package/dist/taxonomies-kmyudNGP.mjs.map +0 -1
- package/dist/types-D6OcIp2P.mjs +0 -3
- package/dist/types-DJQxln7q.d.mts.map +0 -1
- package/dist/types-D_DWe7k9.d.mts.map +0 -1
- package/dist/version-ri-sCyAp.mjs +0 -7
- package/dist/widgets-CpmZd9Q-.mjs.map +0 -1
- package/dist/zod-generator-DylzusHh.mjs.map +0 -1
- /package/dist/{api-tokens-B5NHLNUN.mjs → api-tokens-BfYts-sq.mjs} +0 -0
- /package/dist/{ssrf-BPKzkm6O.mjs → ssrf-Dg3cIT-b.mjs} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"taxonomy-8X09dLN5.mjs","names":[],"sources":["../src/database/repositories/taxonomy.ts"],"sourcesContent":["import { sql, type Kysely, type Selectable } from \"kysely\";\nimport { ulid } from \"ulidx\";\n\nimport { invalidateTaxonomyObjectCache } from \"../../object-cache/index.js\";\nimport { slugify } from \"../../utils/slugify.js\";\nimport { withTransaction } from \"../transaction.js\";\nimport type { Database, TaxonomyTable } from \"../types.js\";\nimport { validateIdentifier } from \"../validate.js\";\n\n/** A member of one sibling group and the position it currently holds. */\nexport interface SiblingPosition {\n\tgroup: string;\n\tposition: number;\n}\n\n/**\n * Translation groups per reorder `UPDATE`. Each costs three bound parameters —\n * a CASE `WHEN`/`THEN` pair plus one slot in the `IN` list — which keeps a\n * statement inside D1's 100-parameter ceiling.\n */\nconst GROUPS_PER_UPDATE = 32;\nconst NUMERIC_SUFFIX_PATTERN = /^\\d+$/;\n\n/** Deal the listed groups back out over the slots they hold, in the order given. */\nfunction permuteWithinSlots(\n\tlisted: readonly string[],\n\toccupied: readonly number[],\n): Map<string, number> {\n\tconst slots = occupied.toSorted((a, b) => a - b);\n\tconst target = new Map<string, number>();\n\tlisted.forEach((group, index) => {\n\t\tconst position = slots[index];\n\t\tif (position !== undefined) target.set(group, position);\n\t});\n\treturn target;\n}\n\n/**\n * Renumber a whole sibling group 0..n-1, with the listed groups in the order\n * given and every other member left in the place it already held.\n *\n * Works off each member's index in the sequence rather than its stored value,\n * which is what lets it resolve positions that tie. The sort is stable, so\n * tied members keep the order `siblings` arrives in — deterministic, but a\n * listing that mixes locales breaks a tie on whichever locale's label sorts\n * first, not on the order any one caller rendered.\n */\nfunction renumberSiblings(\n\tlisted: readonly string[],\n\tsiblings: readonly SiblingPosition[],\n): Map<string, number> {\n\tconst sequence = siblings.toSorted((a, b) => a.position - b.position);\n\tconst wanted = new Set(listed);\n\tconst target = new Map<string, number>();\n\tlet next = 0;\n\tsequence.forEach(({ group }, index) => {\n\t\tconst replacement = wanted.has(group) ? listed[next++] : undefined;\n\t\ttarget.set(replacement ?? group, index);\n\t});\n\treturn target;\n}\n\nexport interface Taxonomy {\n\tid: string;\n\tname: string;\n\tslug: string;\n\tlabel: string;\n\tparentId: string | null;\n\tdata: Record<string, unknown> | null;\n\tlocale: string;\n\ttranslationGroup: string | null;\n\t/**\n\t * Position among siblings. Shared by every row of a `translation_group` —\n\t * a term sits in the same place in every locale it is translated into.\n\t */\n\tsortOrder: number;\n}\n\nexport interface CreateTaxonomyInput {\n\tname: string;\n\tslug: string;\n\tlabel: string;\n\tparentId?: string;\n\tdata?: Record<string, unknown>;\n\t/** Omit to let the DB default (current value: 'en') apply. Higher layers\n\t * resolve the locale from the request context / i18n config. */\n\tlocale?: string;\n\t/** When set, links the new term into the source term's translation_group. */\n\ttranslationOf?: string;\n}\n\nexport interface UpdateTaxonomyInput {\n\tslug?: string;\n\tlabel?: string;\n\tparentId?: string | null;\n\tdata?: Record<string, unknown>;\n}\n\nexport interface FindOptions {\n\tparentId?: string | null;\n\tlocale?: string;\n}\n\nexport interface TaxonomyManualPageCursor {\n\tsortOrder: number;\n\tlabel: string;\n\tid: string;\n}\n\nexport interface TaxonomyPageOptions extends FindOptions {\n\tcursor?: TaxonomyManualPageCursor;\n\tlimit?: number;\n}\n\nexport interface TaxonomyPage {\n\titems: Taxonomy[];\n\thasMore: boolean;\n}\n\nexport interface TaxonomyAssignmentTranslation {\n\tid: string;\n\tslug: string;\n\tlocale: string;\n}\n\nexport interface TaxonomyAssignmentResolution {\n\ttranslationGroup: string;\n\tterm: Taxonomy | null;\n\tavailableLocales: string[];\n\ttranslations: TaxonomyAssignmentTranslation[];\n}\n\n/**\n * Taxonomy repository for categories, tags, and other classification.\n *\n * Terms are per-locale. Translations of the same term share a `translation_group`\n * ULID. `content_taxonomies` stores translation_groups on both sides so a single\n * association spans every locale of a post and term.\n *\n * Strict lookup methods use only the locale callers supply. The explicitly\n * resolved methods accept both the preferred and default locales so their\n * fallback policy stays visible at the call site.\n *\n * `sort_order` is per translation_group, not per row: every row sharing a\n * translation_group carries the same value, so a term holds one position across\n * all its locales. Sibling groups are keyed on the raw `parent_id` column, which\n * is locale-agnostic for the same reason (it stores the parent's\n * translation_group). Writes must preserve both invariants.\n */\nexport class TaxonomyRepository {\n\tconstructor(private db: Kysely<Database>) {}\n\n\t/**\n\t * Create a new taxonomy term. When `translationOf` is set the new row joins\n\t * the source term's translation_group; otherwise a fresh group is minted\n\t * (matching the migration backfill pattern `translation_group = id`).\n\t */\n\tasync create(input: CreateTaxonomyInput): Promise<Taxonomy> {\n\t\tconst id = ulid();\n\n\t\t// Empty-string parentId is coerced to null defensively. Higher layers\n\t\t// also normalize this — see handleTermCreate / handleTermUpdate.\n\t\t// `parent_id` stores the parent's locale-agnostic translation_group (not a\n\t\t// row id), mirroring content_taxonomies.taxonomy_id, so a child stays\n\t\t// nested in every locale's tree. resolveTranslationGroup accepts either a\n\t\t// row id or an already-resolved group, so this is idempotent.\n\t\tconst parentInput =\n\t\t\tinput.parentId === undefined || input.parentId === \"\" ? null : input.parentId;\n\t\tconst parentId = parentInput ? await this.resolveParentRef(parentInput) : null;\n\n\t\tlet translationGroup = id;\n\t\tlet sortOrder: number | null = null;\n\t\tif (input.translationOf) {\n\t\t\tconst source = await this.findById(input.translationOf);\n\t\t\tif (source?.translationGroup) translationGroup = source.translationGroup;\n\t\t\t// A translation is the same term in another locale, so it takes the\n\t\t\t// group's position — but only while it stays in the group that position\n\t\t\t// belongs to. Landing under a different parent makes it a new member of\n\t\t\t// that sibling group, and the source's position means nothing there.\n\t\t\tif (source && source.parentId === parentId) sortOrder = source.sortOrder;\n\t\t}\n\t\tsortOrder ??= await this.nextSortOrder(input.name, parentId);\n\n\t\tawait this.db\n\t\t\t.insertInto(\"taxonomies\")\n\t\t\t.values({\n\t\t\t\tid,\n\t\t\t\tname: input.name,\n\t\t\t\tslug: input.slug,\n\t\t\t\tlabel: input.label,\n\t\t\t\tparent_id: parentId,\n\t\t\t\tdata: input.data ? JSON.stringify(input.data) : null,\n\t\t\t\tsort_order: sortOrder,\n\t\t\t\t// When omitted, the DB DEFAULT 'en' is used — keeps behaviour\n\t\t\t\t// consistent with ContentRepository and lets higher layers\n\t\t\t\t// supply an explicit locale from request context.\n\t\t\t\t...(input.locale !== undefined ? { locale: input.locale } : {}),\n\t\t\t\ttranslation_group: translationGroup,\n\t\t\t})\n\t\t\t.execute();\n\n\t\tinvalidateTaxonomyObjectCache();\n\n\t\tconst taxonomy = await this.findById(id);\n\t\tif (!taxonomy) throw new Error(\"Failed to create taxonomy\");\n\t\treturn taxonomy;\n\t}\n\n\tasync findById(id: string): Promise<Taxonomy | null> {\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"taxonomies\")\n\t\t\t.selectAll()\n\t\t\t.where(\"id\", \"=\", id)\n\t\t\t.executeTakeFirst();\n\t\treturn row ? this.rowToTaxonomy(row) : null;\n\t}\n\n\t/**\n\t * Find a term by (name, slug). When `locale` is provided, filter by it.\n\t * When omitted, returns the lowest-locale-code match (deterministic across\n\t * calls). Mirrors `ContentRepository.findBySlug`.\n\t */\n\tasync findBySlug(name: string, slug: string, locale?: string): Promise<Taxonomy | null> {\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"taxonomies\")\n\t\t\t.selectAll()\n\t\t\t.where(\"name\", \"=\", name)\n\t\t\t.where(\"slug\", \"=\", slug);\n\t\tif (locale !== undefined) query = query.where(\"locale\", \"=\", locale);\n\t\tconst row = await query.orderBy(\"locale\", \"asc\").executeTakeFirst();\n\t\treturn row ? this.rowToTaxonomy(row) : null;\n\t}\n\n\t/** Generate a locale-scoped term slug, adding a numeric suffix when needed. */\n\tasync generateUniqueSlug(name: string, text: string, locale?: string): Promise<string> {\n\t\tconst baseSlug = slugify(text);\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"taxonomies\")\n\t\t\t.select(\"slug\")\n\t\t\t.where(\"name\", \"=\", name)\n\t\t\t.where((eb) => eb.or([eb(\"slug\", \"=\", baseSlug), eb(\"slug\", \"like\", `${baseSlug}-%`)]));\n\t\tif (locale !== undefined) query = query.where(\"locale\", \"=\", locale);\n\t\tconst candidates = await query.execute();\n\t\tif (!candidates.some((candidate) => candidate.slug === baseSlug)) return baseSlug;\n\n\t\tlet maxSuffix = 0;\n\t\tconst prefix = `${baseSlug}-`;\n\t\tfor (const candidate of candidates) {\n\t\t\tif (!candidate.slug.startsWith(prefix)) continue;\n\t\t\tconst suffix = candidate.slug.slice(prefix.length);\n\t\t\tif (!NUMERIC_SUFFIX_PATTERN.test(suffix)) continue;\n\t\t\tmaxSuffix = Math.max(maxSuffix, Number.parseInt(suffix, 10));\n\t\t}\n\t\treturn `${baseSlug}-${maxSuffix + 1}`;\n\t}\n\n\t/**\n\t * Get all terms for a taxonomy (e.g., all categories).\n\t *\n\t * `sort_order` carries the manual order set from the admin; it is 0 for\n\t * terms nobody has reordered, so an untouched taxonomy still comes back\n\t * alphabetically. `id asc` is a stable tiebreaker for terms that share both\n\t * values. Without it the SQL ordering is implementation-defined when they match.\n\t */\n\tasync findByName(name: string, options: FindOptions = {}): Promise<Taxonomy[]> {\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"taxonomies\")\n\t\t\t.selectAll()\n\t\t\t.where(\"name\", \"=\", name)\n\t\t\t.orderBy(\"sort_order\", \"asc\")\n\t\t\t.orderBy(\"label\", \"asc\")\n\t\t\t.orderBy(\"id\", \"asc\");\n\n\t\tif (options.locale !== undefined) query = query.where(\"locale\", \"=\", options.locale);\n\n\t\tif (options.parentId !== undefined) {\n\t\t\tif (options.parentId === null) {\n\t\t\t\tquery = query.where(\"parent_id\", \"is\", null);\n\t\t\t} else {\n\t\t\t\tquery = query.where(\"parent_id\", \"=\", options.parentId);\n\t\t\t}\n\t\t}\n\n\t\tconst rows = await query.execute();\n\t\treturn rows.map((row) => this.rowToTaxonomy(row));\n\t}\n\n\tasync findByNameResolved(\n\t\tname: string,\n\t\tlocale: string,\n\t\tdefaultLocale: string,\n\t): Promise<Taxonomy[]> {\n\t\tconst locales = [...new Set([locale, defaultLocale])];\n\t\tconst rows = await this.db\n\t\t\t.selectFrom(\"taxonomies\")\n\t\t\t.selectAll()\n\t\t\t.where(\"name\", \"=\", name)\n\t\t\t.where(\"locale\", \"in\", locales)\n\t\t\t.orderBy(\"sort_order\", \"asc\")\n\t\t\t.orderBy(\"label\", \"asc\")\n\t\t\t.orderBy(\"id\", \"asc\")\n\t\t\t.execute();\n\n\t\tconst selected = new Map<string, Taxonomy>();\n\t\tfor (const row of rows) {\n\t\t\tconst term = this.rowToTaxonomy(row);\n\t\t\tconst group = term.translationGroup ?? term.id;\n\t\t\tconst current = selected.get(group);\n\t\t\tif (!current || term.locale === locale) selected.set(group, term);\n\t\t}\n\t\treturn [...selected.values()].toSorted(\n\t\t\t(a, b) =>\n\t\t\t\ta.sortOrder - b.sortOrder || a.label.localeCompare(b.label) || a.id.localeCompare(b.id),\n\t\t);\n\t}\n\n\tasync findPageByName(name: string, options: TaxonomyPageOptions = {}): Promise<TaxonomyPage> {\n\t\tconst limit = Math.max(1, Math.min(options.limit ?? 50, 100));\n\t\tlet query = this.db.selectFrom(\"taxonomies\").selectAll().where(\"name\", \"=\", name);\n\n\t\tif (options.locale !== undefined) query = query.where(\"locale\", \"=\", options.locale);\n\n\t\tif (options.parentId !== undefined) {\n\t\t\tquery =\n\t\t\t\toptions.parentId === null\n\t\t\t\t\t? query.where(\"parent_id\", \"is\", null)\n\t\t\t\t\t: query.where(\"parent_id\", \"=\", options.parentId);\n\t\t}\n\n\t\tif (options.cursor) {\n\t\t\tconst cursor = options.cursor;\n\t\t\tquery = query.where((eb) =>\n\t\t\t\teb.or([\n\t\t\t\t\teb(\"sort_order\", \">\", cursor.sortOrder),\n\t\t\t\t\teb.and([eb(\"sort_order\", \"=\", cursor.sortOrder), eb(\"label\", \">\", cursor.label)]),\n\t\t\t\t\teb.and([\n\t\t\t\t\t\teb(\"sort_order\", \"=\", cursor.sortOrder),\n\t\t\t\t\t\teb(\"label\", \"=\", cursor.label),\n\t\t\t\t\t\teb(\"id\", \">\", cursor.id),\n\t\t\t\t\t]),\n\t\t\t\t]),\n\t\t\t);\n\t\t}\n\t\tquery = query.orderBy(\"sort_order\", \"asc\").orderBy(\"label\", \"asc\").orderBy(\"id\", \"asc\");\n\n\t\tconst rows = await query.limit(limit + 1).execute();\n\t\treturn {\n\t\t\titems: rows.slice(0, limit).map((row) => this.rowToTaxonomy(row)),\n\t\t\thasMore: rows.length > limit,\n\t\t};\n\t}\n\n\t/**\n\t * Children of a term. Accepts a term id OR a translation_group and resolves\n\t * to the group, since `parent_id` stores the parent's translation_group.\n\t * Pass `locale` to scope to one locale's tree (children share the parent's\n\t * group across locales); omit it to find children in every locale (used to\n\t * block deletes that would orphan a sibling translation's subtree).\n\t */\n\tasync findChildren(parentIdOrGroup: string, locale?: string): Promise<Taxonomy[]> {\n\t\tconst group = await this.resolveTranslationGroup(parentIdOrGroup);\n\t\tif (!group) return [];\n\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"taxonomies\")\n\t\t\t.selectAll()\n\t\t\t.where(\"parent_id\", \"=\", group)\n\t\t\t.orderBy(\"sort_order\", \"asc\")\n\t\t\t.orderBy(\"label\", \"asc\")\n\t\t\t.orderBy(\"id\", \"asc\");\n\t\tif (locale !== undefined) query = query.where(\"locale\", \"=\", locale);\n\n\t\tconst rows = await query.execute();\n\t\treturn rows.map((row) => this.rowToTaxonomy(row));\n\t}\n\n\t/**\n\t * Every translation sibling of a term (including itself), identified by\n\t * their shared `translation_group`.\n\t */\n\tasync findTranslations(translationGroup: string): Promise<Taxonomy[]> {\n\t\tconst rows = await this.db\n\t\t\t.selectFrom(\"taxonomies\")\n\t\t\t.selectAll()\n\t\t\t.where(\"translation_group\", \"=\", translationGroup)\n\t\t\t.orderBy(\"locale\", \"asc\")\n\t\t\t.execute();\n\t\treturn rows.map((row) => this.rowToTaxonomy(row));\n\t}\n\n\tasync update(id: string, input: UpdateTaxonomyInput): Promise<Taxonomy | null> {\n\t\tconst existing = await this.findById(id);\n\t\tif (!existing) return null;\n\n\t\t// Per-row display fields. `parent_id` and `sort_order` are not here: both\n\t\t// belong to the translation_group and are written across it below.\n\t\tconst updates: Record<string, unknown> = {};\n\t\tif (input.slug !== undefined) updates.slug = input.slug;\n\t\tif (input.label !== undefined) updates.label = input.label;\n\t\tif (input.data !== undefined) updates.data = JSON.stringify(input.data);\n\n\t\tconst group: { parent_id?: string | null; sort_order?: number } = {};\n\t\tif (input.parentId !== undefined) {\n\t\t\t// Defense in depth: empty-string parentId means null (no parent).\n\t\t\t// Otherwise persist the parent's translation_group (locale-agnostic),\n\t\t\t// matching create() — see the note there.\n\t\t\tconst parentId =\n\t\t\t\tinput.parentId === \"\" || input.parentId === null\n\t\t\t\t\t? null\n\t\t\t\t\t: await this.resolveParentRef(input.parentId);\n\n\t\t\tif (parentId !== existing.parentId) {\n\t\t\t\tgroup.parent_id = parentId;\n\t\t\t\t// A position only means anything within one sibling group, so a term\n\t\t\t\t// that changes parent is appended to the group it lands in.\n\t\t\t\tgroup.sort_order = await this.nextSortOrder(existing.name, parentId);\n\t\t\t}\n\t\t}\n\n\t\tconst hasRowUpdates = Object.keys(updates).length > 0;\n\t\tconst hasGroupUpdates = Object.keys(group).length > 0;\n\t\tif (hasRowUpdates || hasGroupUpdates) {\n\t\t\tawait withTransaction(this.db, async (trx) => {\n\t\t\t\tif (hasRowUpdates) {\n\t\t\t\t\tawait trx.updateTable(\"taxonomies\").set(updates).where(\"id\", \"=\", id).execute();\n\t\t\t\t}\n\t\t\t\tif (hasGroupUpdates) {\n\t\t\t\t\tawait trx\n\t\t\t\t\t\t.updateTable(\"taxonomies\")\n\t\t\t\t\t\t.set(group)\n\t\t\t\t\t\t.where(\"translation_group\", \"=\", existing.translationGroup ?? existing.id)\n\t\t\t\t\t\t.execute();\n\t\t\t\t}\n\t\t\t});\n\t\t\tinvalidateTaxonomyObjectCache();\n\t\t}\n\n\t\treturn this.findById(id);\n\t}\n\n\t/**\n\t * Move `groups` (translation_groups, in the desired order) into the positions\n\t * those same groups already occupy, leaving every other member of the sibling\n\t * group where it is.\n\t *\n\t * `groups` may be a subset: a locale renders only the terms translated into\n\t * it, so an admin in `fr` often cannot name every member. A group left out\n\t * keeps its place, which is also what makes a stale list harmless.\n\t *\n\t * `siblings` is every member of the group with the position it holds, in a\n\t * listing's order — tied positions are resolved by that order, so pass it as\n\t * read. Groups already at their target are skipped, so one swap rewrites two\n\t * groups rather than the whole list.\n\t */\n\tasync reorder(groups: string[], siblings: readonly SiblingPosition[]): Promise<void> {\n\t\tconst current = new Map(siblings.map(({ group, position }) => [group, position]));\n\n\t\tconst listed: string[] = [];\n\t\tconst occupied: number[] = [];\n\t\tfor (const group of groups) {\n\t\t\tconst position = current.get(group);\n\t\t\tif (position === undefined) continue;\n\t\t\tlisted.push(group);\n\t\t\toccupied.push(position);\n\t\t}\n\t\tif (listed.length === 0) return;\n\n\t\t// Tied positions have no distinct order to permute into, so the requested\n\t\t// one would be dropped without a word. Renumbering is the only way to\n\t\t// honour it, and it repairs the tie on the way through.\n\t\tconst target =\n\t\t\tnew Set(occupied).size === occupied.length\n\t\t\t\t? permuteWithinSlots(listed, occupied)\n\t\t\t\t: renumberSiblings(listed, siblings);\n\n\t\tconst changed = [...target].filter(([group, position]) => current.get(group) !== position);\n\t\tif (changed.length === 0) return;\n\n\t\tawait this.applyPositions(changed);\n\n\t\tinvalidateTaxonomyObjectCache();\n\t}\n\n\t/**\n\t * Write one position per translation_group, GROUPS_PER_UPDATE at a time so\n\t * each statement stays inside D1's parameter ceiling.\n\t *\n\t * D1 has no transactions — `withTransaction` runs its callback bare there —\n\t * so a chunk is the unit that can't tear. A reorder spanning several chunks\n\t * can, and leaves ties, which the next reorder renumbers away.\n\t */\n\tprivate async applyPositions(positions: readonly (readonly [string, number])[]): Promise<void> {\n\t\tfor (let index = 0; index < positions.length; index += GROUPS_PER_UPDATE) {\n\t\t\tconst chunk = positions.slice(index, index + GROUPS_PER_UPDATE);\n\t\t\t// The CAST types the bound position. Postgres resolves a CASE whose THEN\n\t\t\t// arms are all untyped parameters to text, then refuses to assign text to\n\t\t\t// an integer column.\n\t\t\tconst arms = sql.join(\n\t\t\t\tchunk.map(([group, position]) => sql`WHEN ${group} THEN CAST(${position} AS INTEGER)`),\n\t\t\t\tsql` `,\n\t\t\t);\n\t\t\tconst keys = sql.join(chunk.map(([group]) => sql`${group}`));\n\t\t\tawait sql`\n\t\t\t\tUPDATE taxonomies\n\t\t\t\tSET sort_order = CASE translation_group ${arms} END\n\t\t\t\tWHERE translation_group IN (${keys})\n\t\t\t`.execute(this.db);\n\t\t}\n\t}\n\n\t/**\n\t * Position for a term joining a sibling group: one past the last member, or\n\t * 0 when the group is empty.\n\t *\n\t * Bounds are taken across every locale because a position belongs to the\n\t * translation_group, not to a row — a term translated into only one locale\n\t * still occupies its slot for all of them.\n\t */\n\tprivate async nextSortOrder(name: string, parentId: string | null): Promise<number> {\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"taxonomies\")\n\t\t\t.select((eb) => eb.fn.max(\"sort_order\").as(\"max\"))\n\t\t\t.where(\"name\", \"=\", name);\n\t\tquery =\n\t\t\tparentId === null\n\t\t\t\t? query.where(\"parent_id\", \"is\", null)\n\t\t\t\t: query.where(\"parent_id\", \"=\", parentId);\n\n\t\tconst bounds = await query.executeTakeFirst();\n\t\t// Null only when the group is empty.\n\t\tif (!bounds || bounds.max === null) return 0;\n\t\treturn bounds.max + 1;\n\t}\n\n\tasync delete(id: string): Promise<boolean> {\n\t\tconst term = await this.findById(id);\n\t\tif (!term) return false;\n\n\t\t// When deleting the last translation of a group the pivot rows that\n\t\t// reference that translation_group become orphaned — purge them.\n\t\tif (term.translationGroup) {\n\t\t\tconst siblings = await this.db\n\t\t\t\t.selectFrom(\"taxonomies\")\n\t\t\t\t.select(\"id\")\n\t\t\t\t.where(\"translation_group\", \"=\", term.translationGroup)\n\t\t\t\t.where(\"id\", \"!=\", id)\n\t\t\t\t.execute();\n\t\t\tif (siblings.length === 0) {\n\t\t\t\tawait this.db\n\t\t\t\t\t.deleteFrom(\"content_taxonomies\")\n\t\t\t\t\t.where(\"taxonomy_id\", \"=\", term.translationGroup)\n\t\t\t\t\t.execute();\n\t\t\t}\n\t\t}\n\n\t\tconst result = await this.db.deleteFrom(\"taxonomies\").where(\"id\", \"=\", id).executeTakeFirst();\n\t\tinvalidateTaxonomyObjectCache();\n\t\treturn (result.numDeletedRows ?? 0n) > 0n;\n\t}\n\n\t// --- Content-Taxonomy Junction (both ids store translation_groups) ---\n\n\tasync attachToEntry(collection: string, entryId: string, taxonomyId: string): Promise<void> {\n\t\tconst taxonomyGroup = await this.resolveTranslationGroup(taxonomyId);\n\t\tif (!taxonomyGroup) return;\n\t\tawait this.attachGroupsToEntry(collection, entryId, [taxonomyGroup]);\n\t}\n\n\t/**\n\t * Attach already-resolved term translation groups in one insert and return\n\t * the number of assignments that did not already exist.\n\t */\n\tasync attachGroupsToEntry(\n\t\tcollection: string,\n\t\tentryId: string,\n\t\ttaxonomyGroups: string[],\n\t): Promise<number> {\n\t\tconst uniqueGroups = [...new Set(taxonomyGroups)];\n\t\tif (uniqueGroups.length === 0) return 0;\n\t\tconst entryGroup = await this.resolveEntryTranslationGroup(collection, entryId);\n\t\tif (!entryGroup) return 0;\n\n\t\tconst result = await this.db\n\t\t\t.insertInto(\"content_taxonomies\")\n\t\t\t.values(\n\t\t\t\tuniqueGroups.map((taxonomy_id) => ({\n\t\t\t\t\tcollection,\n\t\t\t\t\tentry_id: entryGroup,\n\t\t\t\t\ttaxonomy_id,\n\t\t\t\t})),\n\t\t\t)\n\t\t\t.onConflict((oc) => oc.doNothing())\n\t\t\t.executeTakeFirst();\n\t\tconst inserted = Number(result.numInsertedOrUpdatedRows ?? 0n);\n\t\tif (inserted > 0) invalidateTaxonomyObjectCache();\n\t\treturn inserted;\n\t}\n\n\tasync detachFromEntry(collection: string, entryId: string, taxonomyId: string): Promise<void> {\n\t\tconst [entryGroup, taxonomyGroup] = await Promise.all([\n\t\t\tthis.resolveEntryTranslationGroup(collection, entryId),\n\t\t\tthis.resolveTranslationGroup(taxonomyId),\n\t\t]);\n\t\tif (!entryGroup || !taxonomyGroup) return;\n\n\t\tawait this.db\n\t\t\t.deleteFrom(\"content_taxonomies\")\n\t\t\t.where(\"collection\", \"=\", collection)\n\t\t\t.where(\"entry_id\", \"=\", entryGroup)\n\t\t\t.where(\"taxonomy_id\", \"=\", taxonomyGroup)\n\t\t\t.execute();\n\t\tinvalidateTaxonomyObjectCache();\n\t}\n\n\t/**\n\t * Taxonomy terms assigned to a content entry, resolved into a specific locale.\n\t * Terms whose translation_group lacks a row in the requested locale are\n\t * omitted — callers wanting fallback behaviour apply it themselves.\n\t */\n\tasync getTermsForEntry(\n\t\tcollection: string,\n\t\tentryId: string,\n\t\ttaxonomyName?: string,\n\t\tlocale?: string,\n\t): Promise<Taxonomy[]> {\n\t\tconst entryGroup = await this.resolveEntryTranslationGroup(collection, entryId);\n\t\tif (!entryGroup) return [];\n\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"content_taxonomies\")\n\t\t\t.innerJoin(\"taxonomies\", \"taxonomies.translation_group\", \"content_taxonomies.taxonomy_id\")\n\t\t\t.selectAll(\"taxonomies\")\n\t\t\t.where(\"content_taxonomies.collection\", \"=\", collection)\n\t\t\t.where(\"content_taxonomies.entry_id\", \"=\", entryGroup);\n\n\t\tif (taxonomyName) query = query.where(\"taxonomies.name\", \"=\", taxonomyName);\n\t\tif (locale !== undefined) query = query.where(\"taxonomies.locale\", \"=\", locale);\n\n\t\tconst rows = await query.orderBy(\"taxonomies.locale\", \"asc\").execute();\n\t\treturn rows.map((row) => this.rowToTaxonomy(row));\n\t}\n\n\tasync getTermAssignmentsForEntry(\n\t\tcollection: string,\n\t\tentryId: string,\n\t\ttaxonomyName: string,\n\t\tlocale: string,\n\t\tdefaultLocale: string,\n\t): Promise<TaxonomyAssignmentResolution[]> {\n\t\tconst entryGroup = await this.resolveEntryTranslationGroup(collection, entryId);\n\t\tif (!entryGroup) return [];\n\n\t\tconst rows = await this.db\n\t\t\t.selectFrom(\"content_taxonomies\")\n\t\t\t.innerJoin(\"taxonomies\", \"taxonomies.translation_group\", \"content_taxonomies.taxonomy_id\")\n\t\t\t.selectAll(\"taxonomies\")\n\t\t\t.select(\"content_taxonomies.taxonomy_id as assignment_group\")\n\t\t\t.where(\"content_taxonomies.collection\", \"=\", collection)\n\t\t\t.where(\"content_taxonomies.entry_id\", \"=\", entryGroup)\n\t\t\t.where(\"taxonomies.name\", \"=\", taxonomyName)\n\t\t\t.orderBy(\"content_taxonomies.taxonomy_id\", \"asc\")\n\t\t\t.orderBy(\"taxonomies.locale\", \"asc\")\n\t\t\t.execute();\n\n\t\tconst byGroup = new Map<string, Taxonomy[]>();\n\t\tfor (const row of rows) {\n\t\t\tconst variants = byGroup.get(row.assignment_group) ?? [];\n\t\t\tvariants.push(this.rowToTaxonomy(row));\n\t\t\tbyGroup.set(row.assignment_group, variants);\n\t\t}\n\n\t\treturn Array.from(byGroup, ([translationGroup, variants]) => {\n\t\t\tconst term =\n\t\t\t\tvariants.find((variant) => variant.locale === locale) ??\n\t\t\t\tvariants.find((variant) => variant.locale === defaultLocale) ??\n\t\t\t\tnull;\n\t\t\treturn {\n\t\t\t\ttranslationGroup,\n\t\t\t\tterm,\n\t\t\t\tavailableLocales: variants.map((variant) => variant.locale),\n\t\t\t\ttranslations: variants.map((variant) => ({\n\t\t\t\t\tid: variant.id,\n\t\t\t\t\tslug: variant.slug,\n\t\t\t\t\tlocale: variant.locale,\n\t\t\t\t})),\n\t\t\t};\n\t\t});\n\t}\n\n\t/**\n\t * Replace all assignments of a given taxonomy for one content entry.\n\t * Term ids OR translation_groups are accepted and normalised to groups.\n\t */\n\tasync setTermsForEntry(\n\t\tcollection: string,\n\t\tentryId: string,\n\t\ttaxonomyName: string,\n\t\ttermIds: string[],\n\t): Promise<void> {\n\t\tconst entryGroup = await this.resolveEntryTranslationGroup(collection, entryId);\n\t\tif (!entryGroup) return;\n\n\t\tconst groups: string[] = [];\n\t\tfor (const id of termIds) {\n\t\t\tconst group = await this.resolveTranslationGroup(id);\n\t\t\tif (group) groups.push(group);\n\t\t}\n\t\tconst newGroups = new Set(groups);\n\n\t\tconst current = await this.db\n\t\t\t.selectFrom(\"content_taxonomies\")\n\t\t\t.innerJoin(\"taxonomies\", \"taxonomies.translation_group\", \"content_taxonomies.taxonomy_id\")\n\t\t\t.select([\"content_taxonomies.taxonomy_id as group\"])\n\t\t\t.distinct()\n\t\t\t.where(\"content_taxonomies.collection\", \"=\", collection)\n\t\t\t.where(\"content_taxonomies.entry_id\", \"=\", entryGroup)\n\t\t\t.where(\"taxonomies.name\", \"=\", taxonomyName)\n\t\t\t.execute();\n\t\tconst currentGroups = new Set(current.map((r) => r.group));\n\n\t\tconst toRemove = [...currentGroups].filter((g) => !newGroups.has(g));\n\t\tif (toRemove.length > 0) {\n\t\t\tawait this.db\n\t\t\t\t.deleteFrom(\"content_taxonomies\")\n\t\t\t\t.where(\"collection\", \"=\", collection)\n\t\t\t\t.where(\"entry_id\", \"=\", entryGroup)\n\t\t\t\t.where(\"taxonomy_id\", \"in\", toRemove)\n\t\t\t\t.execute();\n\t\t}\n\n\t\tconst toAdd = [...newGroups].filter((g) => !currentGroups.has(g));\n\t\tif (toAdd.length > 0) {\n\t\t\tawait this.db\n\t\t\t\t.insertInto(\"content_taxonomies\")\n\t\t\t\t.values(\n\t\t\t\t\ttoAdd.map((taxonomy_id) => ({\n\t\t\t\t\t\tcollection,\n\t\t\t\t\t\tentry_id: entryGroup,\n\t\t\t\t\t\ttaxonomy_id,\n\t\t\t\t\t})),\n\t\t\t\t)\n\t\t\t\t.onConflict((oc) => oc.doNothing())\n\t\t\t\t.execute();\n\t\t}\n\n\t\tif (toRemove.length > 0 || toAdd.length > 0) invalidateTaxonomyObjectCache();\n\t}\n\n\tasync clearEntryTerms(collection: string, entryId: string): Promise<number> {\n\t\tconst entryGroup = await this.resolveEntryTranslationGroup(collection, entryId);\n\t\tif (!entryGroup) return 0;\n\n\t\tconst result = await this.db\n\t\t\t.deleteFrom(\"content_taxonomies\")\n\t\t\t.where(\"collection\", \"=\", collection)\n\t\t\t.where(\"entry_id\", \"=\", entryGroup)\n\t\t\t.executeTakeFirst();\n\t\tconst removed = Number(result.numDeletedRows ?? 0);\n\t\tif (removed > 0) invalidateTaxonomyObjectCache();\n\t\treturn removed;\n\t}\n\n\tprivate async resolveEntryTranslationGroup(\n\t\tcollection: string,\n\t\tentryIdOrGroup: string,\n\t): Promise<string | null> {\n\t\tvalidateIdentifier(collection, \"collection type\");\n\t\tconst tableName = `ec_${collection}`;\n\t\tconst result = await sql<{ translation_group: string }>`\n\t\t\tSELECT translation_group\n\t\t\tFROM ${sql.ref(tableName)}\n\t\t\tWHERE id = ${entryIdOrGroup} OR translation_group = ${entryIdOrGroup}\n\t\t\tLIMIT 1\n\t\t`.execute(this.db);\n\t\treturn result.rows[0]?.translation_group ?? null;\n\t}\n\n\t/**\n\t * Count content entries that use any translation of this term. Accepts\n\t * either a term id or a translation_group — we normalise to the group.\n\t *\n\t * Counts raw pivot rows regardless of the entry's status or deletion —\n\t * drafts and trashed entries are included. User-facing counts (admin term\n\t * list/get, public widget and term pages) use `fetchVisibleTermCounts`\n\t * from `taxonomies/term-counts.ts` instead, which counts only publicly\n\t * visible entries.\n\t */\n\tasync countEntriesWithTerm(termIdOrGroup: string): Promise<number> {\n\t\tconst group = await this.resolveTranslationGroup(termIdOrGroup);\n\t\tif (!group) return 0;\n\n\t\tconst result = await this.db\n\t\t\t.selectFrom(\"content_taxonomies\")\n\t\t\t.select((eb) => eb.fn.count(\"entry_id\").as(\"count\"))\n\t\t\t.where(\"taxonomy_id\", \"=\", group)\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result?.count ?? 0);\n\t}\n\n\t/**\n\t * Resolve a parent reference (a row id or a translation_group) to the value\n\t * persisted in `parent_id`: the parent's translation_group, which is\n\t * locale-agnostic so the child stays nested in every locale. A\n\t * translation_group normally equals its anchor row's id, which satisfies the\n\t * self-FK on `parent_id`. If that anchor row is missing (a translation whose\n\t * anchor was deleted), fall back to the id we were given so we never write a\n\t * dangling FK value.\n\t */\n\tprivate async resolveParentRef(idOrGroup: string): Promise<string> {\n\t\tconst group = await this.resolveTranslationGroup(idOrGroup);\n\t\tif (!group) return idOrGroup;\n\t\tconst anchor = await this.db\n\t\t\t.selectFrom(\"taxonomies\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"id\", \"=\", group)\n\t\t\t.executeTakeFirst();\n\t\treturn anchor ? group : idOrGroup;\n\t}\n\n\tprivate async resolveTranslationGroup(idOrGroup: string): Promise<string | null> {\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"taxonomies\")\n\t\t\t.select([\"translation_group\"])\n\t\t\t.where((eb) => eb.or([eb(\"id\", \"=\", idOrGroup), eb(\"translation_group\", \"=\", idOrGroup)]))\n\t\t\t.executeTakeFirst();\n\t\treturn row?.translation_group ?? null;\n\t}\n\n\t/**\n\t * Batch count entries for multiple taxonomy translation_groups.\n\t * Chunks the query at SQL_BATCH_SIZE to stay below D1's bind-parameter limit.\n\t * Returns a Map from translation_group to count.\n\t *\n\t * Pass translation_groups (not term ids) — `content_taxonomies.taxonomy_id`\n\t * stores the translation_group so a single assignment spans every locale.\n\t *\n\t * Like `countEntriesWithTerm`, this counts raw pivot rows regardless of\n\t * status/deletion; user-facing counts go through `fetchVisibleTermCounts`.\n\t */\n\tasync countEntriesForTerms(translationGroups: string[]): Promise<Map<string, number>> {\n\t\tif (translationGroups.length === 0) return new Map();\n\n\t\tconst { chunks, SQL_BATCH_SIZE } = await import(\"../../utils/chunks.js\");\n\n\t\tconst counts = new Map<string, number>();\n\t\tfor (const chunk of chunks(translationGroups, SQL_BATCH_SIZE)) {\n\t\t\tconst rows = await this.db\n\t\t\t\t.selectFrom(\"content_taxonomies\")\n\t\t\t\t.select([\"taxonomy_id\", (eb) => eb.fn.count(\"entry_id\").as(\"count\")])\n\t\t\t\t.where(\"taxonomy_id\", \"in\", chunk)\n\t\t\t\t.groupBy(\"taxonomy_id\")\n\t\t\t\t.execute();\n\n\t\t\tfor (const row of rows) {\n\t\t\t\tcounts.set(row.taxonomy_id, Number(row.count || 0));\n\t\t\t}\n\t\t}\n\t\treturn counts;\n\t}\n\n\tprivate rowToTaxonomy(row: Selectable<TaxonomyTable>): Taxonomy {\n\t\treturn {\n\t\t\tid: row.id,\n\t\t\tname: row.name,\n\t\t\tslug: row.slug,\n\t\t\tlabel: row.label,\n\t\t\tparentId: row.parent_id,\n\t\t\tdata: row.data ? JSON.parse(row.data) : null,\n\t\t\tlocale: row.locale,\n\t\t\ttranslationGroup: row.translation_group,\n\t\t\tsortOrder: row.sort_order,\n\t\t};\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"taxonomy-tJepplLL.mjs","names":[],"sources":["../src/database/repositories/taxonomy.ts"],"sourcesContent":["import { sql, type Kysely, type Selectable } from \"kysely\";\nimport { ulid } from \"ulidx\";\n\nimport { invalidateTaxonomyObjectCache } from \"../../object-cache/index.js\";\nimport { slugify } from \"../../utils/slugify.js\";\nimport { withTransaction } from \"../transaction.js\";\nimport type { Database, TaxonomyTable } from \"../types.js\";\nimport { validateIdentifier } from \"../validate.js\";\n\n/** A member of one sibling group and the position it currently holds. */\nexport interface SiblingPosition {\n\tgroup: string;\n\tposition: number;\n}\n\n/**\n * Translation groups per reorder `UPDATE`. Each costs three bound parameters —\n * a CASE `WHEN`/`THEN` pair plus one slot in the `IN` list — which keeps a\n * statement inside D1's 100-parameter ceiling.\n */\nconst GROUPS_PER_UPDATE = 32;\nconst NUMERIC_SUFFIX_PATTERN = /^\\d+$/;\n\n/** Deal the listed groups back out over the slots they hold, in the order given. */\nfunction permuteWithinSlots(\n\tlisted: readonly string[],\n\toccupied: readonly number[],\n): Map<string, number> {\n\tconst slots = occupied.toSorted((a, b) => a - b);\n\tconst target = new Map<string, number>();\n\tlisted.forEach((group, index) => {\n\t\tconst position = slots[index];\n\t\tif (position !== undefined) target.set(group, position);\n\t});\n\treturn target;\n}\n\n/**\n * Renumber a whole sibling group 0..n-1, with the listed groups in the order\n * given and every other member left in the place it already held.\n *\n * Works off each member's index in the sequence rather than its stored value,\n * which is what lets it resolve positions that tie. The sort is stable, so\n * tied members keep the order `siblings` arrives in — deterministic, but a\n * listing that mixes locales breaks a tie on whichever locale's label sorts\n * first, not on the order any one caller rendered.\n */\nfunction renumberSiblings(\n\tlisted: readonly string[],\n\tsiblings: readonly SiblingPosition[],\n): Map<string, number> {\n\tconst sequence = siblings.toSorted((a, b) => a.position - b.position);\n\tconst wanted = new Set(listed);\n\tconst target = new Map<string, number>();\n\tlet next = 0;\n\tsequence.forEach(({ group }, index) => {\n\t\tconst replacement = wanted.has(group) ? listed[next++] : undefined;\n\t\ttarget.set(replacement ?? group, index);\n\t});\n\treturn target;\n}\n\nexport interface Taxonomy {\n\tid: string;\n\tname: string;\n\tslug: string;\n\tlabel: string;\n\tparentId: string | null;\n\tdata: Record<string, unknown> | null;\n\tlocale: string;\n\ttranslationGroup: string | null;\n\t/**\n\t * Position among siblings. Shared by every row of a `translation_group` —\n\t * a term sits in the same place in every locale it is translated into.\n\t */\n\tsortOrder: number;\n}\n\nexport interface CreateTaxonomyInput {\n\tname: string;\n\tslug: string;\n\tlabel: string;\n\tparentId?: string;\n\tdata?: Record<string, unknown>;\n\t/** Omit to let the DB default (current value: 'en') apply. Higher layers\n\t * resolve the locale from the request context / i18n config. */\n\tlocale?: string;\n\t/** When set, links the new term into the source term's translation_group. */\n\ttranslationOf?: string;\n}\n\nexport interface UpdateTaxonomyInput {\n\tslug?: string;\n\tlabel?: string;\n\tparentId?: string | null;\n\tdata?: Record<string, unknown>;\n}\n\nexport interface FindOptions {\n\tparentId?: string | null;\n\tlocale?: string;\n}\n\nexport interface TaxonomyManualPageCursor {\n\tsortOrder: number;\n\tlabel: string;\n\tid: string;\n}\n\nexport interface TaxonomyPageOptions extends FindOptions {\n\tcursor?: TaxonomyManualPageCursor;\n\tlimit?: number;\n}\n\nexport interface TaxonomyPage {\n\titems: Taxonomy[];\n\thasMore: boolean;\n}\n\nexport interface TaxonomyAssignmentTranslation {\n\tid: string;\n\tslug: string;\n\tlocale: string;\n}\n\nexport interface TaxonomyAssignmentResolution {\n\ttranslationGroup: string;\n\tterm: Taxonomy | null;\n\tavailableLocales: string[];\n\ttranslations: TaxonomyAssignmentTranslation[];\n}\n\n/**\n * Taxonomy repository for categories, tags, and other classification.\n *\n * Terms are per-locale. Translations of the same term share a `translation_group`\n * ULID. `content_taxonomies` stores translation_groups on both sides so a single\n * association spans every locale of a post and term.\n *\n * Strict lookup methods use only the locale callers supply. The explicitly\n * resolved methods accept both the preferred and default locales so their\n * fallback policy stays visible at the call site.\n *\n * `sort_order` is per translation_group, not per row: every row sharing a\n * translation_group carries the same value, so a term holds one position across\n * all its locales. Sibling groups are keyed on the raw `parent_id` column, which\n * is locale-agnostic for the same reason (it stores the parent's\n * translation_group). Writes must preserve both invariants.\n */\nexport class TaxonomyRepository {\n\tconstructor(private db: Kysely<Database>) {}\n\n\t/**\n\t * Create a new taxonomy term. When `translationOf` is set the new row joins\n\t * the source term's translation_group; otherwise a fresh group is minted\n\t * (matching the migration backfill pattern `translation_group = id`).\n\t */\n\tasync create(input: CreateTaxonomyInput): Promise<Taxonomy> {\n\t\tconst id = ulid();\n\n\t\t// Empty-string parentId is coerced to null defensively. Higher layers\n\t\t// also normalize this — see handleTermCreate / handleTermUpdate.\n\t\t// `parent_id` stores the parent's locale-agnostic translation_group (not a\n\t\t// row id), mirroring content_taxonomies.taxonomy_id, so a child stays\n\t\t// nested in every locale's tree. resolveTranslationGroup accepts either a\n\t\t// row id or an already-resolved group, so this is idempotent.\n\t\tconst parentInput =\n\t\t\tinput.parentId === undefined || input.parentId === \"\" ? null : input.parentId;\n\t\tconst parentId = parentInput ? await this.resolveParentRef(parentInput) : null;\n\n\t\tlet translationGroup = id;\n\t\tlet sortOrder: number | null = null;\n\t\tif (input.translationOf) {\n\t\t\tconst source = await this.findById(input.translationOf);\n\t\t\tif (source?.translationGroup) translationGroup = source.translationGroup;\n\t\t\t// A translation is the same term in another locale, so it takes the\n\t\t\t// group's position — but only while it stays in the group that position\n\t\t\t// belongs to. Landing under a different parent makes it a new member of\n\t\t\t// that sibling group, and the source's position means nothing there.\n\t\t\tif (source && source.parentId === parentId) sortOrder = source.sortOrder;\n\t\t}\n\t\tsortOrder ??= await this.nextSortOrder(input.name, parentId);\n\n\t\tawait this.db\n\t\t\t.insertInto(\"taxonomies\")\n\t\t\t.values({\n\t\t\t\tid,\n\t\t\t\tname: input.name,\n\t\t\t\tslug: input.slug,\n\t\t\t\tlabel: input.label,\n\t\t\t\tparent_id: parentId,\n\t\t\t\tdata: input.data ? JSON.stringify(input.data) : null,\n\t\t\t\tsort_order: sortOrder,\n\t\t\t\t// When omitted, the DB DEFAULT 'en' is used — keeps behaviour\n\t\t\t\t// consistent with ContentRepository and lets higher layers\n\t\t\t\t// supply an explicit locale from request context.\n\t\t\t\t...(input.locale !== undefined ? { locale: input.locale } : {}),\n\t\t\t\ttranslation_group: translationGroup,\n\t\t\t})\n\t\t\t.execute();\n\n\t\tinvalidateTaxonomyObjectCache();\n\n\t\tconst taxonomy = await this.findById(id);\n\t\tif (!taxonomy) throw new Error(\"Failed to create taxonomy\");\n\t\treturn taxonomy;\n\t}\n\n\tasync findById(id: string): Promise<Taxonomy | null> {\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"taxonomies\")\n\t\t\t.selectAll()\n\t\t\t.where(\"id\", \"=\", id)\n\t\t\t.executeTakeFirst();\n\t\treturn row ? this.rowToTaxonomy(row) : null;\n\t}\n\n\t/**\n\t * Find a term by (name, slug). When `locale` is provided, filter by it.\n\t * When omitted, returns the lowest-locale-code match (deterministic across\n\t * calls). Mirrors `ContentRepository.findBySlug`.\n\t */\n\tasync findBySlug(name: string, slug: string, locale?: string): Promise<Taxonomy | null> {\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"taxonomies\")\n\t\t\t.selectAll()\n\t\t\t.where(\"name\", \"=\", name)\n\t\t\t.where(\"slug\", \"=\", slug);\n\t\tif (locale !== undefined) query = query.where(\"locale\", \"=\", locale);\n\t\tconst row = await query.orderBy(\"locale\", \"asc\").executeTakeFirst();\n\t\treturn row ? this.rowToTaxonomy(row) : null;\n\t}\n\n\t/** Generate a locale-scoped term slug, adding a numeric suffix when needed. */\n\tasync generateUniqueSlug(name: string, text: string, locale?: string): Promise<string> {\n\t\tconst baseSlug = slugify(text);\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"taxonomies\")\n\t\t\t.select(\"slug\")\n\t\t\t.where(\"name\", \"=\", name)\n\t\t\t.where((eb) => eb.or([eb(\"slug\", \"=\", baseSlug), eb(\"slug\", \"like\", `${baseSlug}-%`)]));\n\t\tif (locale !== undefined) query = query.where(\"locale\", \"=\", locale);\n\t\tconst candidates = await query.execute();\n\t\tif (!candidates.some((candidate) => candidate.slug === baseSlug)) return baseSlug;\n\n\t\tlet maxSuffix = 0;\n\t\tconst prefix = `${baseSlug}-`;\n\t\tfor (const candidate of candidates) {\n\t\t\tif (!candidate.slug.startsWith(prefix)) continue;\n\t\t\tconst suffix = candidate.slug.slice(prefix.length);\n\t\t\tif (!NUMERIC_SUFFIX_PATTERN.test(suffix)) continue;\n\t\t\tmaxSuffix = Math.max(maxSuffix, Number.parseInt(suffix, 10));\n\t\t}\n\t\treturn `${baseSlug}-${maxSuffix + 1}`;\n\t}\n\n\t/**\n\t * Get all terms for a taxonomy (e.g., all categories).\n\t *\n\t * `sort_order` carries the manual order set from the admin; it is 0 for\n\t * terms nobody has reordered, so an untouched taxonomy still comes back\n\t * alphabetically. `id asc` is a stable tiebreaker for terms that share both\n\t * values. Without it the SQL ordering is implementation-defined when they match.\n\t */\n\tasync findByName(name: string, options: FindOptions = {}): Promise<Taxonomy[]> {\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"taxonomies\")\n\t\t\t.selectAll()\n\t\t\t.where(\"name\", \"=\", name)\n\t\t\t.orderBy(\"sort_order\", \"asc\")\n\t\t\t.orderBy(\"label\", \"asc\")\n\t\t\t.orderBy(\"id\", \"asc\");\n\n\t\tif (options.locale !== undefined) query = query.where(\"locale\", \"=\", options.locale);\n\n\t\tif (options.parentId !== undefined) {\n\t\t\tif (options.parentId === null) {\n\t\t\t\tquery = query.where(\"parent_id\", \"is\", null);\n\t\t\t} else {\n\t\t\t\tquery = query.where(\"parent_id\", \"=\", options.parentId);\n\t\t\t}\n\t\t}\n\n\t\tconst rows = await query.execute();\n\t\treturn rows.map((row) => this.rowToTaxonomy(row));\n\t}\n\n\tasync findByNameResolved(\n\t\tname: string,\n\t\tlocale: string,\n\t\tdefaultLocale: string,\n\t): Promise<Taxonomy[]> {\n\t\tconst locales = [...new Set([locale, defaultLocale])];\n\t\tconst rows = await this.db\n\t\t\t.selectFrom(\"taxonomies\")\n\t\t\t.selectAll()\n\t\t\t.where(\"name\", \"=\", name)\n\t\t\t.where(\"locale\", \"in\", locales)\n\t\t\t.orderBy(\"sort_order\", \"asc\")\n\t\t\t.orderBy(\"label\", \"asc\")\n\t\t\t.orderBy(\"id\", \"asc\")\n\t\t\t.execute();\n\n\t\tconst selected = new Map<string, Taxonomy>();\n\t\tfor (const row of rows) {\n\t\t\tconst term = this.rowToTaxonomy(row);\n\t\t\tconst group = term.translationGroup ?? term.id;\n\t\t\tconst current = selected.get(group);\n\t\t\tif (!current || term.locale === locale) selected.set(group, term);\n\t\t}\n\t\treturn [...selected.values()].toSorted(\n\t\t\t(a, b) =>\n\t\t\t\ta.sortOrder - b.sortOrder || a.label.localeCompare(b.label) || a.id.localeCompare(b.id),\n\t\t);\n\t}\n\n\tasync findPageByName(name: string, options: TaxonomyPageOptions = {}): Promise<TaxonomyPage> {\n\t\tconst limit = Math.max(1, Math.min(options.limit ?? 50, 100));\n\t\tlet query = this.db.selectFrom(\"taxonomies\").selectAll().where(\"name\", \"=\", name);\n\n\t\tif (options.locale !== undefined) query = query.where(\"locale\", \"=\", options.locale);\n\n\t\tif (options.parentId !== undefined) {\n\t\t\tquery =\n\t\t\t\toptions.parentId === null\n\t\t\t\t\t? query.where(\"parent_id\", \"is\", null)\n\t\t\t\t\t: query.where(\"parent_id\", \"=\", options.parentId);\n\t\t}\n\n\t\tif (options.cursor) {\n\t\t\tconst cursor = options.cursor;\n\t\t\tquery = query.where((eb) =>\n\t\t\t\teb.or([\n\t\t\t\t\teb(\"sort_order\", \">\", cursor.sortOrder),\n\t\t\t\t\teb.and([eb(\"sort_order\", \"=\", cursor.sortOrder), eb(\"label\", \">\", cursor.label)]),\n\t\t\t\t\teb.and([\n\t\t\t\t\t\teb(\"sort_order\", \"=\", cursor.sortOrder),\n\t\t\t\t\t\teb(\"label\", \"=\", cursor.label),\n\t\t\t\t\t\teb(\"id\", \">\", cursor.id),\n\t\t\t\t\t]),\n\t\t\t\t]),\n\t\t\t);\n\t\t}\n\t\tquery = query.orderBy(\"sort_order\", \"asc\").orderBy(\"label\", \"asc\").orderBy(\"id\", \"asc\");\n\n\t\tconst rows = await query.limit(limit + 1).execute();\n\t\treturn {\n\t\t\titems: rows.slice(0, limit).map((row) => this.rowToTaxonomy(row)),\n\t\t\thasMore: rows.length > limit,\n\t\t};\n\t}\n\n\t/**\n\t * Children of a term. Accepts a term id OR a translation_group and resolves\n\t * to the group, since `parent_id` stores the parent's translation_group.\n\t * Pass `locale` to scope to one locale's tree (children share the parent's\n\t * group across locales); omit it to find children in every locale (used to\n\t * block deletes that would orphan a sibling translation's subtree).\n\t */\n\tasync findChildren(parentIdOrGroup: string, locale?: string): Promise<Taxonomy[]> {\n\t\tconst group = await this.resolveTranslationGroup(parentIdOrGroup);\n\t\tif (!group) return [];\n\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"taxonomies\")\n\t\t\t.selectAll()\n\t\t\t.where(\"parent_id\", \"=\", group)\n\t\t\t.orderBy(\"sort_order\", \"asc\")\n\t\t\t.orderBy(\"label\", \"asc\")\n\t\t\t.orderBy(\"id\", \"asc\");\n\t\tif (locale !== undefined) query = query.where(\"locale\", \"=\", locale);\n\n\t\tconst rows = await query.execute();\n\t\treturn rows.map((row) => this.rowToTaxonomy(row));\n\t}\n\n\t/**\n\t * Every translation sibling of a term (including itself), identified by\n\t * their shared `translation_group`.\n\t */\n\tasync findTranslations(translationGroup: string): Promise<Taxonomy[]> {\n\t\tconst rows = await this.db\n\t\t\t.selectFrom(\"taxonomies\")\n\t\t\t.selectAll()\n\t\t\t.where(\"translation_group\", \"=\", translationGroup)\n\t\t\t.orderBy(\"locale\", \"asc\")\n\t\t\t.execute();\n\t\treturn rows.map((row) => this.rowToTaxonomy(row));\n\t}\n\n\tasync update(id: string, input: UpdateTaxonomyInput): Promise<Taxonomy | null> {\n\t\tconst existing = await this.findById(id);\n\t\tif (!existing) return null;\n\n\t\t// Per-row display fields. `parent_id` and `sort_order` are not here: both\n\t\t// belong to the translation_group and are written across it below.\n\t\tconst updates: Record<string, unknown> = {};\n\t\tif (input.slug !== undefined) updates.slug = input.slug;\n\t\tif (input.label !== undefined) updates.label = input.label;\n\t\tif (input.data !== undefined) updates.data = JSON.stringify(input.data);\n\n\t\tconst group: { parent_id?: string | null; sort_order?: number } = {};\n\t\tif (input.parentId !== undefined) {\n\t\t\t// Defense in depth: empty-string parentId means null (no parent).\n\t\t\t// Otherwise persist the parent's translation_group (locale-agnostic),\n\t\t\t// matching create() — see the note there.\n\t\t\tconst parentId =\n\t\t\t\tinput.parentId === \"\" || input.parentId === null\n\t\t\t\t\t? null\n\t\t\t\t\t: await this.resolveParentRef(input.parentId);\n\n\t\t\tif (parentId !== existing.parentId) {\n\t\t\t\tgroup.parent_id = parentId;\n\t\t\t\t// A position only means anything within one sibling group, so a term\n\t\t\t\t// that changes parent is appended to the group it lands in.\n\t\t\t\tgroup.sort_order = await this.nextSortOrder(existing.name, parentId);\n\t\t\t}\n\t\t}\n\n\t\tconst hasRowUpdates = Object.keys(updates).length > 0;\n\t\tconst hasGroupUpdates = Object.keys(group).length > 0;\n\t\tif (hasRowUpdates || hasGroupUpdates) {\n\t\t\tawait withTransaction(this.db, async (trx) => {\n\t\t\t\tif (hasRowUpdates) {\n\t\t\t\t\tawait trx.updateTable(\"taxonomies\").set(updates).where(\"id\", \"=\", id).execute();\n\t\t\t\t}\n\t\t\t\tif (hasGroupUpdates) {\n\t\t\t\t\tawait trx\n\t\t\t\t\t\t.updateTable(\"taxonomies\")\n\t\t\t\t\t\t.set(group)\n\t\t\t\t\t\t.where(\"translation_group\", \"=\", existing.translationGroup ?? existing.id)\n\t\t\t\t\t\t.execute();\n\t\t\t\t}\n\t\t\t});\n\t\t\tinvalidateTaxonomyObjectCache();\n\t\t}\n\n\t\treturn this.findById(id);\n\t}\n\n\t/**\n\t * Move `groups` (translation_groups, in the desired order) into the positions\n\t * those same groups already occupy, leaving every other member of the sibling\n\t * group where it is.\n\t *\n\t * `groups` may be a subset: a locale renders only the terms translated into\n\t * it, so an admin in `fr` often cannot name every member. A group left out\n\t * keeps its place, which is also what makes a stale list harmless.\n\t *\n\t * `siblings` is every member of the group with the position it holds, in a\n\t * listing's order — tied positions are resolved by that order, so pass it as\n\t * read. Groups already at their target are skipped, so one swap rewrites two\n\t * groups rather than the whole list.\n\t */\n\tasync reorder(groups: string[], siblings: readonly SiblingPosition[]): Promise<void> {\n\t\tconst current = new Map(siblings.map(({ group, position }) => [group, position]));\n\n\t\tconst listed: string[] = [];\n\t\tconst occupied: number[] = [];\n\t\tfor (const group of groups) {\n\t\t\tconst position = current.get(group);\n\t\t\tif (position === undefined) continue;\n\t\t\tlisted.push(group);\n\t\t\toccupied.push(position);\n\t\t}\n\t\tif (listed.length === 0) return;\n\n\t\t// Tied positions have no distinct order to permute into, so the requested\n\t\t// one would be dropped without a word. Renumbering is the only way to\n\t\t// honour it, and it repairs the tie on the way through.\n\t\tconst target =\n\t\t\tnew Set(occupied).size === occupied.length\n\t\t\t\t? permuteWithinSlots(listed, occupied)\n\t\t\t\t: renumberSiblings(listed, siblings);\n\n\t\tconst changed = [...target].filter(([group, position]) => current.get(group) !== position);\n\t\tif (changed.length === 0) return;\n\n\t\tawait this.applyPositions(changed);\n\n\t\tinvalidateTaxonomyObjectCache();\n\t}\n\n\t/**\n\t * Write one position per translation_group, GROUPS_PER_UPDATE at a time so\n\t * each statement stays inside D1's parameter ceiling.\n\t *\n\t * D1 has no transactions — `withTransaction` runs its callback bare there —\n\t * so a chunk is the unit that can't tear. A reorder spanning several chunks\n\t * can, and leaves ties, which the next reorder renumbers away.\n\t */\n\tprivate async applyPositions(positions: readonly (readonly [string, number])[]): Promise<void> {\n\t\tfor (let index = 0; index < positions.length; index += GROUPS_PER_UPDATE) {\n\t\t\tconst chunk = positions.slice(index, index + GROUPS_PER_UPDATE);\n\t\t\t// The CAST types the bound position. Postgres resolves a CASE whose THEN\n\t\t\t// arms are all untyped parameters to text, then refuses to assign text to\n\t\t\t// an integer column.\n\t\t\tconst arms = sql.join(\n\t\t\t\tchunk.map(([group, position]) => sql`WHEN ${group} THEN CAST(${position} AS INTEGER)`),\n\t\t\t\tsql` `,\n\t\t\t);\n\t\t\tconst keys = sql.join(chunk.map(([group]) => sql`${group}`));\n\t\t\tawait sql`\n\t\t\t\tUPDATE taxonomies\n\t\t\t\tSET sort_order = CASE translation_group ${arms} END\n\t\t\t\tWHERE translation_group IN (${keys})\n\t\t\t`.execute(this.db);\n\t\t}\n\t}\n\n\t/**\n\t * Position for a term joining a sibling group: one past the last member, or\n\t * 0 when the group is empty.\n\t *\n\t * Bounds are taken across every locale because a position belongs to the\n\t * translation_group, not to a row — a term translated into only one locale\n\t * still occupies its slot for all of them.\n\t */\n\tprivate async nextSortOrder(name: string, parentId: string | null): Promise<number> {\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"taxonomies\")\n\t\t\t.select((eb) => eb.fn.max(\"sort_order\").as(\"max\"))\n\t\t\t.where(\"name\", \"=\", name);\n\t\tquery =\n\t\t\tparentId === null\n\t\t\t\t? query.where(\"parent_id\", \"is\", null)\n\t\t\t\t: query.where(\"parent_id\", \"=\", parentId);\n\n\t\tconst bounds = await query.executeTakeFirst();\n\t\t// Null only when the group is empty.\n\t\tif (!bounds || bounds.max === null) return 0;\n\t\treturn bounds.max + 1;\n\t}\n\n\tasync delete(id: string): Promise<boolean> {\n\t\tconst term = await this.findById(id);\n\t\tif (!term) return false;\n\n\t\t// When deleting the last translation of a group the pivot rows that\n\t\t// reference that translation_group become orphaned — purge them.\n\t\tif (term.translationGroup) {\n\t\t\tconst siblings = await this.db\n\t\t\t\t.selectFrom(\"taxonomies\")\n\t\t\t\t.select(\"id\")\n\t\t\t\t.where(\"translation_group\", \"=\", term.translationGroup)\n\t\t\t\t.where(\"id\", \"!=\", id)\n\t\t\t\t.execute();\n\t\t\tif (siblings.length === 0) {\n\t\t\t\tawait this.db\n\t\t\t\t\t.deleteFrom(\"content_taxonomies\")\n\t\t\t\t\t.where(\"taxonomy_id\", \"=\", term.translationGroup)\n\t\t\t\t\t.execute();\n\t\t\t}\n\t\t}\n\n\t\tconst result = await this.db.deleteFrom(\"taxonomies\").where(\"id\", \"=\", id).executeTakeFirst();\n\t\tinvalidateTaxonomyObjectCache();\n\t\treturn (result.numDeletedRows ?? 0n) > 0n;\n\t}\n\n\t// --- Content-Taxonomy Junction (both ids store translation_groups) ---\n\n\tasync attachToEntry(collection: string, entryId: string, taxonomyId: string): Promise<void> {\n\t\tconst taxonomyGroup = await this.resolveTranslationGroup(taxonomyId);\n\t\tif (!taxonomyGroup) return;\n\t\tawait this.attachGroupsToEntry(collection, entryId, [taxonomyGroup]);\n\t}\n\n\t/**\n\t * Attach already-resolved term translation groups in one insert and return\n\t * the number of assignments that did not already exist.\n\t */\n\tasync attachGroupsToEntry(\n\t\tcollection: string,\n\t\tentryId: string,\n\t\ttaxonomyGroups: string[],\n\t): Promise<number> {\n\t\tconst uniqueGroups = [...new Set(taxonomyGroups)];\n\t\tif (uniqueGroups.length === 0) return 0;\n\t\tconst entryGroup = await this.resolveEntryTranslationGroup(collection, entryId);\n\t\tif (!entryGroup) return 0;\n\n\t\tconst result = await this.db\n\t\t\t.insertInto(\"content_taxonomies\")\n\t\t\t.values(\n\t\t\t\tuniqueGroups.map((taxonomy_id) => ({\n\t\t\t\t\tcollection,\n\t\t\t\t\tentry_id: entryGroup,\n\t\t\t\t\ttaxonomy_id,\n\t\t\t\t})),\n\t\t\t)\n\t\t\t.onConflict((oc) => oc.doNothing())\n\t\t\t.executeTakeFirst();\n\t\tconst inserted = Number(result.numInsertedOrUpdatedRows ?? 0n);\n\t\tif (inserted > 0) invalidateTaxonomyObjectCache();\n\t\treturn inserted;\n\t}\n\n\tasync detachFromEntry(collection: string, entryId: string, taxonomyId: string): Promise<void> {\n\t\tconst [entryGroup, taxonomyGroup] = await Promise.all([\n\t\t\tthis.resolveEntryTranslationGroup(collection, entryId),\n\t\t\tthis.resolveTranslationGroup(taxonomyId),\n\t\t]);\n\t\tif (!entryGroup || !taxonomyGroup) return;\n\n\t\tawait this.db\n\t\t\t.deleteFrom(\"content_taxonomies\")\n\t\t\t.where(\"collection\", \"=\", collection)\n\t\t\t.where(\"entry_id\", \"=\", entryGroup)\n\t\t\t.where(\"taxonomy_id\", \"=\", taxonomyGroup)\n\t\t\t.execute();\n\t\tinvalidateTaxonomyObjectCache();\n\t}\n\n\t/**\n\t * Taxonomy terms assigned to a content entry, resolved into a specific locale.\n\t * Terms whose translation_group lacks a row in the requested locale are\n\t * omitted — callers wanting fallback behaviour apply it themselves.\n\t */\n\tasync getTermsForEntry(\n\t\tcollection: string,\n\t\tentryId: string,\n\t\ttaxonomyName?: string,\n\t\tlocale?: string,\n\t): Promise<Taxonomy[]> {\n\t\tconst entryGroup = await this.resolveEntryTranslationGroup(collection, entryId);\n\t\tif (!entryGroup) return [];\n\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"content_taxonomies\")\n\t\t\t.innerJoin(\"taxonomies\", \"taxonomies.translation_group\", \"content_taxonomies.taxonomy_id\")\n\t\t\t.selectAll(\"taxonomies\")\n\t\t\t.where(\"content_taxonomies.collection\", \"=\", collection)\n\t\t\t.where(\"content_taxonomies.entry_id\", \"=\", entryGroup);\n\n\t\tif (taxonomyName) query = query.where(\"taxonomies.name\", \"=\", taxonomyName);\n\t\tif (locale !== undefined) query = query.where(\"taxonomies.locale\", \"=\", locale);\n\n\t\tconst rows = await query.orderBy(\"taxonomies.locale\", \"asc\").execute();\n\t\treturn rows.map((row) => this.rowToTaxonomy(row));\n\t}\n\n\tasync getTermAssignmentsForEntry(\n\t\tcollection: string,\n\t\tentryId: string,\n\t\ttaxonomyName: string,\n\t\tlocale: string,\n\t\tdefaultLocale: string,\n\t): Promise<TaxonomyAssignmentResolution[]> {\n\t\tconst entryGroup = await this.resolveEntryTranslationGroup(collection, entryId);\n\t\tif (!entryGroup) return [];\n\n\t\tconst rows = await this.db\n\t\t\t.selectFrom(\"content_taxonomies\")\n\t\t\t.innerJoin(\"taxonomies\", \"taxonomies.translation_group\", \"content_taxonomies.taxonomy_id\")\n\t\t\t.selectAll(\"taxonomies\")\n\t\t\t.select(\"content_taxonomies.taxonomy_id as assignment_group\")\n\t\t\t.where(\"content_taxonomies.collection\", \"=\", collection)\n\t\t\t.where(\"content_taxonomies.entry_id\", \"=\", entryGroup)\n\t\t\t.where(\"taxonomies.name\", \"=\", taxonomyName)\n\t\t\t.orderBy(\"content_taxonomies.taxonomy_id\", \"asc\")\n\t\t\t.orderBy(\"taxonomies.locale\", \"asc\")\n\t\t\t.execute();\n\n\t\tconst byGroup = new Map<string, Taxonomy[]>();\n\t\tfor (const row of rows) {\n\t\t\tconst variants = byGroup.get(row.assignment_group) ?? [];\n\t\t\tvariants.push(this.rowToTaxonomy(row));\n\t\t\tbyGroup.set(row.assignment_group, variants);\n\t\t}\n\n\t\treturn Array.from(byGroup, ([translationGroup, variants]) => {\n\t\t\tconst term =\n\t\t\t\tvariants.find((variant) => variant.locale === locale) ??\n\t\t\t\tvariants.find((variant) => variant.locale === defaultLocale) ??\n\t\t\t\tnull;\n\t\t\treturn {\n\t\t\t\ttranslationGroup,\n\t\t\t\tterm,\n\t\t\t\tavailableLocales: variants.map((variant) => variant.locale),\n\t\t\t\ttranslations: variants.map((variant) => ({\n\t\t\t\t\tid: variant.id,\n\t\t\t\t\tslug: variant.slug,\n\t\t\t\t\tlocale: variant.locale,\n\t\t\t\t})),\n\t\t\t};\n\t\t});\n\t}\n\n\t/**\n\t * Replace all assignments of a given taxonomy for one content entry.\n\t * Term ids OR translation_groups are accepted and normalised to groups.\n\t */\n\tasync setTermsForEntry(\n\t\tcollection: string,\n\t\tentryId: string,\n\t\ttaxonomyName: string,\n\t\ttermIds: string[],\n\t): Promise<void> {\n\t\tconst entryGroup = await this.resolveEntryTranslationGroup(collection, entryId);\n\t\tif (!entryGroup) return;\n\n\t\tconst groups: string[] = [];\n\t\tfor (const id of termIds) {\n\t\t\tconst group = await this.resolveTranslationGroup(id);\n\t\t\tif (group) groups.push(group);\n\t\t}\n\t\tconst newGroups = new Set(groups);\n\n\t\tconst current = await this.db\n\t\t\t.selectFrom(\"content_taxonomies\")\n\t\t\t.innerJoin(\"taxonomies\", \"taxonomies.translation_group\", \"content_taxonomies.taxonomy_id\")\n\t\t\t.select([\"content_taxonomies.taxonomy_id as group\"])\n\t\t\t.distinct()\n\t\t\t.where(\"content_taxonomies.collection\", \"=\", collection)\n\t\t\t.where(\"content_taxonomies.entry_id\", \"=\", entryGroup)\n\t\t\t.where(\"taxonomies.name\", \"=\", taxonomyName)\n\t\t\t.execute();\n\t\tconst currentGroups = new Set(current.map((r) => r.group));\n\n\t\tconst toRemove = [...currentGroups].filter((g) => !newGroups.has(g));\n\t\tif (toRemove.length > 0) {\n\t\t\tawait this.db\n\t\t\t\t.deleteFrom(\"content_taxonomies\")\n\t\t\t\t.where(\"collection\", \"=\", collection)\n\t\t\t\t.where(\"entry_id\", \"=\", entryGroup)\n\t\t\t\t.where(\"taxonomy_id\", \"in\", toRemove)\n\t\t\t\t.execute();\n\t\t}\n\n\t\tconst toAdd = [...newGroups].filter((g) => !currentGroups.has(g));\n\t\tif (toAdd.length > 0) {\n\t\t\tawait this.db\n\t\t\t\t.insertInto(\"content_taxonomies\")\n\t\t\t\t.values(\n\t\t\t\t\ttoAdd.map((taxonomy_id) => ({\n\t\t\t\t\t\tcollection,\n\t\t\t\t\t\tentry_id: entryGroup,\n\t\t\t\t\t\ttaxonomy_id,\n\t\t\t\t\t})),\n\t\t\t\t)\n\t\t\t\t.onConflict((oc) => oc.doNothing())\n\t\t\t\t.execute();\n\t\t}\n\n\t\tif (toRemove.length > 0 || toAdd.length > 0) invalidateTaxonomyObjectCache();\n\t}\n\n\tasync clearEntryTerms(collection: string, entryId: string): Promise<number> {\n\t\tconst entryGroup = await this.resolveEntryTranslationGroup(collection, entryId);\n\t\tif (!entryGroup) return 0;\n\n\t\tconst result = await this.db\n\t\t\t.deleteFrom(\"content_taxonomies\")\n\t\t\t.where(\"collection\", \"=\", collection)\n\t\t\t.where(\"entry_id\", \"=\", entryGroup)\n\t\t\t.executeTakeFirst();\n\t\tconst removed = Number(result.numDeletedRows ?? 0);\n\t\tif (removed > 0) invalidateTaxonomyObjectCache();\n\t\treturn removed;\n\t}\n\n\tprivate async resolveEntryTranslationGroup(\n\t\tcollection: string,\n\t\tentryIdOrGroup: string,\n\t): Promise<string | null> {\n\t\tvalidateIdentifier(collection, \"collection type\");\n\t\tconst tableName = `ec_${collection}`;\n\t\tconst result = await sql<{ translation_group: string }>`\n\t\t\tSELECT translation_group\n\t\t\tFROM ${sql.ref(tableName)}\n\t\t\tWHERE id = ${entryIdOrGroup} OR translation_group = ${entryIdOrGroup}\n\t\t\tLIMIT 1\n\t\t`.execute(this.db);\n\t\treturn result.rows[0]?.translation_group ?? null;\n\t}\n\n\t/**\n\t * Count content entries that use any translation of this term. Accepts\n\t * either a term id or a translation_group — we normalise to the group.\n\t *\n\t * Counts raw pivot rows regardless of the entry's status or deletion —\n\t * drafts and trashed entries are included. User-facing counts (admin term\n\t * list/get, public widget and term pages) use `fetchVisibleTermCounts`\n\t * from `taxonomies/term-counts.ts` instead, which counts only publicly\n\t * visible entries.\n\t */\n\tasync countEntriesWithTerm(termIdOrGroup: string): Promise<number> {\n\t\tconst group = await this.resolveTranslationGroup(termIdOrGroup);\n\t\tif (!group) return 0;\n\n\t\tconst result = await this.db\n\t\t\t.selectFrom(\"content_taxonomies\")\n\t\t\t.select((eb) => eb.fn.count(\"entry_id\").as(\"count\"))\n\t\t\t.where(\"taxonomy_id\", \"=\", group)\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result?.count ?? 0);\n\t}\n\n\t/**\n\t * Resolve a parent reference (a row id or a translation_group) to the value\n\t * persisted in `parent_id`: the parent's translation_group, which is\n\t * locale-agnostic so the child stays nested in every locale. A\n\t * translation_group normally equals its anchor row's id, which satisfies the\n\t * self-FK on `parent_id`. If that anchor row is missing (a translation whose\n\t * anchor was deleted), fall back to the id we were given so we never write a\n\t * dangling FK value.\n\t */\n\tprivate async resolveParentRef(idOrGroup: string): Promise<string> {\n\t\tconst group = await this.resolveTranslationGroup(idOrGroup);\n\t\tif (!group) return idOrGroup;\n\t\tconst anchor = await this.db\n\t\t\t.selectFrom(\"taxonomies\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"id\", \"=\", group)\n\t\t\t.executeTakeFirst();\n\t\treturn anchor ? group : idOrGroup;\n\t}\n\n\tprivate async resolveTranslationGroup(idOrGroup: string): Promise<string | null> {\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"taxonomies\")\n\t\t\t.select([\"translation_group\"])\n\t\t\t.where((eb) => eb.or([eb(\"id\", \"=\", idOrGroup), eb(\"translation_group\", \"=\", idOrGroup)]))\n\t\t\t.executeTakeFirst();\n\t\treturn row?.translation_group ?? null;\n\t}\n\n\t/**\n\t * Batch count entries for multiple taxonomy translation_groups.\n\t * Chunks the query at SQL_BATCH_SIZE to stay below D1's bind-parameter limit.\n\t * Returns a Map from translation_group to count.\n\t *\n\t * Pass translation_groups (not term ids) — `content_taxonomies.taxonomy_id`\n\t * stores the translation_group so a single assignment spans every locale.\n\t *\n\t * Like `countEntriesWithTerm`, this counts raw pivot rows regardless of\n\t * status/deletion; user-facing counts go through `fetchVisibleTermCounts`.\n\t */\n\tasync countEntriesForTerms(translationGroups: string[]): Promise<Map<string, number>> {\n\t\tif (translationGroups.length === 0) return new Map();\n\n\t\tconst { chunks, SQL_BATCH_SIZE } = await import(\"../../utils/chunks.js\");\n\n\t\tconst counts = new Map<string, number>();\n\t\tfor (const chunk of chunks(translationGroups, SQL_BATCH_SIZE)) {\n\t\t\tconst rows = await this.db\n\t\t\t\t.selectFrom(\"content_taxonomies\")\n\t\t\t\t.select([\"taxonomy_id\", (eb) => eb.fn.count(\"entry_id\").as(\"count\")])\n\t\t\t\t.where(\"taxonomy_id\", \"in\", chunk)\n\t\t\t\t.groupBy(\"taxonomy_id\")\n\t\t\t\t.execute();\n\n\t\t\tfor (const row of rows) {\n\t\t\t\tcounts.set(row.taxonomy_id, Number(row.count || 0));\n\t\t\t}\n\t\t}\n\t\treturn counts;\n\t}\n\n\tprivate rowToTaxonomy(row: Selectable<TaxonomyTable>): Taxonomy {\n\t\treturn {\n\t\t\tid: row.id,\n\t\t\tname: row.name,\n\t\t\tslug: row.slug,\n\t\t\tlabel: row.label,\n\t\t\tparentId: row.parent_id,\n\t\t\tdata: row.data ? JSON.parse(row.data) : null,\n\t\t\tlocale: row.locale,\n\t\t\ttranslationGroup: row.translation_group,\n\t\t\tsortOrder: row.sort_order,\n\t\t};\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;AAoBA,MAAM,oBAAoB;AAC1B,MAAM,yBAAyB;;AAG/B,SAAS,mBACR,QACA,UACsB;CACtB,MAAM,QAAQ,SAAS,UAAU,GAAG,MAAM,IAAI,EAAE;CAChD,MAAM,yBAAS,IAAI,KAAqB;AACxC,QAAO,SAAS,OAAO,UAAU;EAChC,MAAM,WAAW,MAAM;AACvB,MAAI,aAAa,OAAW,QAAO,IAAI,OAAO,SAAS;GACtD;AACF,QAAO;;;;;;;;;;;;AAaR,SAAS,iBACR,QACA,UACsB;CACtB,MAAM,WAAW,SAAS,UAAU,GAAG,MAAM,EAAE,WAAW,EAAE,SAAS;CACrE,MAAM,SAAS,IAAI,IAAI,OAAO;CAC9B,MAAM,yBAAS,IAAI,KAAqB;CACxC,IAAI,OAAO;AACX,UAAS,SAAS,EAAE,SAAS,UAAU;EACtC,MAAM,cAAc,OAAO,IAAI,MAAM,GAAG,OAAO,UAAU;AACzD,SAAO,IAAI,eAAe,OAAO,MAAM;GACtC;AACF,QAAO;;;;;;;;;;;;;;;;;;;AA0FR,IAAa,qBAAb,MAAgC;CAC/B,YAAY,AAAQ,IAAsB;EAAtB;;;;;;;CAOpB,MAAM,OAAO,OAA+C;EAC3D,MAAM,KAAK,MAAM;EAQjB,MAAM,cACL,MAAM,aAAa,UAAa,MAAM,aAAa,KAAK,OAAO,MAAM;EACtE,MAAM,WAAW,cAAc,MAAM,KAAK,iBAAiB,YAAY,GAAG;EAE1E,IAAI,mBAAmB;EACvB,IAAI,YAA2B;AAC/B,MAAI,MAAM,eAAe;GACxB,MAAM,SAAS,MAAM,KAAK,SAAS,MAAM,cAAc;AACvD,OAAI,QAAQ,iBAAkB,oBAAmB,OAAO;AAKxD,OAAI,UAAU,OAAO,aAAa,SAAU,aAAY,OAAO;;AAEhE,gBAAc,MAAM,KAAK,cAAc,MAAM,MAAM,SAAS;AAE5D,QAAM,KAAK,GACT,WAAW,aAAa,CACxB,OAAO;GACP;GACA,MAAM,MAAM;GACZ,MAAM,MAAM;GACZ,OAAO,MAAM;GACb,WAAW;GACX,MAAM,MAAM,OAAO,KAAK,UAAU,MAAM,KAAK,GAAG;GAChD,YAAY;GAIZ,GAAI,MAAM,WAAW,SAAY,EAAE,QAAQ,MAAM,QAAQ,GAAG,EAAE;GAC9D,mBAAmB;GACnB,CAAC,CACD,SAAS;AAEX,iCAA+B;EAE/B,MAAM,WAAW,MAAM,KAAK,SAAS,GAAG;AACxC,MAAI,CAAC,SAAU,OAAM,IAAI,MAAM,4BAA4B;AAC3D,SAAO;;CAGR,MAAM,SAAS,IAAsC;EACpD,MAAM,MAAM,MAAM,KAAK,GACrB,WAAW,aAAa,CACxB,WAAW,CACX,MAAM,MAAM,KAAK,GAAG,CACpB,kBAAkB;AACpB,SAAO,MAAM,KAAK,cAAc,IAAI,GAAG;;;;;;;CAQxC,MAAM,WAAW,MAAc,MAAc,QAA2C;EACvF,IAAI,QAAQ,KAAK,GACf,WAAW,aAAa,CACxB,WAAW,CACX,MAAM,QAAQ,KAAK,KAAK,CACxB,MAAM,QAAQ,KAAK,KAAK;AAC1B,MAAI,WAAW,OAAW,SAAQ,MAAM,MAAM,UAAU,KAAK,OAAO;EACpE,MAAM,MAAM,MAAM,MAAM,QAAQ,UAAU,MAAM,CAAC,kBAAkB;AACnE,SAAO,MAAM,KAAK,cAAc,IAAI,GAAG;;;CAIxC,MAAM,mBAAmB,MAAc,MAAc,QAAkC;EACtF,MAAM,WAAW,QAAQ,KAAK;EAC9B,IAAI,QAAQ,KAAK,GACf,WAAW,aAAa,CACxB,OAAO,OAAO,CACd,MAAM,QAAQ,KAAK,KAAK,CACxB,OAAO,OAAO,GAAG,GAAG,CAAC,GAAG,QAAQ,KAAK,SAAS,EAAE,GAAG,QAAQ,QAAQ,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC;AACxF,MAAI,WAAW,OAAW,SAAQ,MAAM,MAAM,UAAU,KAAK,OAAO;EACpE,MAAM,aAAa,MAAM,MAAM,SAAS;AACxC,MAAI,CAAC,WAAW,MAAM,cAAc,UAAU,SAAS,SAAS,CAAE,QAAO;EAEzE,IAAI,YAAY;EAChB,MAAM,SAAS,GAAG,SAAS;AAC3B,OAAK,MAAM,aAAa,YAAY;AACnC,OAAI,CAAC,UAAU,KAAK,WAAW,OAAO,CAAE;GACxC,MAAM,SAAS,UAAU,KAAK,MAAM,OAAO,OAAO;AAClD,OAAI,CAAC,uBAAuB,KAAK,OAAO,CAAE;AAC1C,eAAY,KAAK,IAAI,WAAW,OAAO,SAAS,QAAQ,GAAG,CAAC;;AAE7D,SAAO,GAAG,SAAS,GAAG,YAAY;;;;;;;;;;CAWnC,MAAM,WAAW,MAAc,UAAuB,EAAE,EAAuB;EAC9E,IAAI,QAAQ,KAAK,GACf,WAAW,aAAa,CACxB,WAAW,CACX,MAAM,QAAQ,KAAK,KAAK,CACxB,QAAQ,cAAc,MAAM,CAC5B,QAAQ,SAAS,MAAM,CACvB,QAAQ,MAAM,MAAM;AAEtB,MAAI,QAAQ,WAAW,OAAW,SAAQ,MAAM,MAAM,UAAU,KAAK,QAAQ,OAAO;AAEpF,MAAI,QAAQ,aAAa,OACxB,KAAI,QAAQ,aAAa,KACxB,SAAQ,MAAM,MAAM,aAAa,MAAM,KAAK;MAE5C,SAAQ,MAAM,MAAM,aAAa,KAAK,QAAQ,SAAS;AAKzD,UADa,MAAM,MAAM,SAAS,EACtB,KAAK,QAAQ,KAAK,cAAc,IAAI,CAAC;;CAGlD,MAAM,mBACL,MACA,QACA,eACsB;EACtB,MAAM,UAAU,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,cAAc,CAAC,CAAC;EACrD,MAAM,OAAO,MAAM,KAAK,GACtB,WAAW,aAAa,CACxB,WAAW,CACX,MAAM,QAAQ,KAAK,KAAK,CACxB,MAAM,UAAU,MAAM,QAAQ,CAC9B,QAAQ,cAAc,MAAM,CAC5B,QAAQ,SAAS,MAAM,CACvB,QAAQ,MAAM,MAAM,CACpB,SAAS;EAEX,MAAM,2BAAW,IAAI,KAAuB;AAC5C,OAAK,MAAM,OAAO,MAAM;GACvB,MAAM,OAAO,KAAK,cAAc,IAAI;GACpC,MAAM,QAAQ,KAAK,oBAAoB,KAAK;AAE5C,OAAI,CADY,SAAS,IAAI,MAAM,IACnB,KAAK,WAAW,OAAQ,UAAS,IAAI,OAAO,KAAK;;AAElE,SAAO,CAAC,GAAG,SAAS,QAAQ,CAAC,CAAC,UAC5B,GAAG,MACH,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,EAAE,MAAM,IAAI,EAAE,GAAG,cAAc,EAAE,GAAG,CACxF;;CAGF,MAAM,eAAe,MAAc,UAA+B,EAAE,EAAyB;EAC5F,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,SAAS,IAAI,IAAI,CAAC;EAC7D,IAAI,QAAQ,KAAK,GAAG,WAAW,aAAa,CAAC,WAAW,CAAC,MAAM,QAAQ,KAAK,KAAK;AAEjF,MAAI,QAAQ,WAAW,OAAW,SAAQ,MAAM,MAAM,UAAU,KAAK,QAAQ,OAAO;AAEpF,MAAI,QAAQ,aAAa,OACxB,SACC,QAAQ,aAAa,OAClB,MAAM,MAAM,aAAa,MAAM,KAAK,GACpC,MAAM,MAAM,aAAa,KAAK,QAAQ,SAAS;AAGpD,MAAI,QAAQ,QAAQ;GACnB,MAAM,SAAS,QAAQ;AACvB,WAAQ,MAAM,OAAO,OACpB,GAAG,GAAG;IACL,GAAG,cAAc,KAAK,OAAO,UAAU;IACvC,GAAG,IAAI,CAAC,GAAG,cAAc,KAAK,OAAO,UAAU,EAAE,GAAG,SAAS,KAAK,OAAO,MAAM,CAAC,CAAC;IACjF,GAAG,IAAI;KACN,GAAG,cAAc,KAAK,OAAO,UAAU;KACvC,GAAG,SAAS,KAAK,OAAO,MAAM;KAC9B,GAAG,MAAM,KAAK,OAAO,GAAG;KACxB,CAAC;IACF,CAAC,CACF;;AAEF,UAAQ,MAAM,QAAQ,cAAc,MAAM,CAAC,QAAQ,SAAS,MAAM,CAAC,QAAQ,MAAM,MAAM;EAEvF,MAAM,OAAO,MAAM,MAAM,MAAM,QAAQ,EAAE,CAAC,SAAS;AACnD,SAAO;GACN,OAAO,KAAK,MAAM,GAAG,MAAM,CAAC,KAAK,QAAQ,KAAK,cAAc,IAAI,CAAC;GACjE,SAAS,KAAK,SAAS;GACvB;;;;;;;;;CAUF,MAAM,aAAa,iBAAyB,QAAsC;EACjF,MAAM,QAAQ,MAAM,KAAK,wBAAwB,gBAAgB;AACjE,MAAI,CAAC,MAAO,QAAO,EAAE;EAErB,IAAI,QAAQ,KAAK,GACf,WAAW,aAAa,CACxB,WAAW,CACX,MAAM,aAAa,KAAK,MAAM,CAC9B,QAAQ,cAAc,MAAM,CAC5B,QAAQ,SAAS,MAAM,CACvB,QAAQ,MAAM,MAAM;AACtB,MAAI,WAAW,OAAW,SAAQ,MAAM,MAAM,UAAU,KAAK,OAAO;AAGpE,UADa,MAAM,MAAM,SAAS,EACtB,KAAK,QAAQ,KAAK,cAAc,IAAI,CAAC;;;;;;CAOlD,MAAM,iBAAiB,kBAA+C;AAOrE,UANa,MAAM,KAAK,GACtB,WAAW,aAAa,CACxB,WAAW,CACX,MAAM,qBAAqB,KAAK,iBAAiB,CACjD,QAAQ,UAAU,MAAM,CACxB,SAAS,EACC,KAAK,QAAQ,KAAK,cAAc,IAAI,CAAC;;CAGlD,MAAM,OAAO,IAAY,OAAsD;EAC9E,MAAM,WAAW,MAAM,KAAK,SAAS,GAAG;AACxC,MAAI,CAAC,SAAU,QAAO;EAItB,MAAM,UAAmC,EAAE;AAC3C,MAAI,MAAM,SAAS,OAAW,SAAQ,OAAO,MAAM;AACnD,MAAI,MAAM,UAAU,OAAW,SAAQ,QAAQ,MAAM;AACrD,MAAI,MAAM,SAAS,OAAW,SAAQ,OAAO,KAAK,UAAU,MAAM,KAAK;EAEvE,MAAM,QAA4D,EAAE;AACpE,MAAI,MAAM,aAAa,QAAW;GAIjC,MAAM,WACL,MAAM,aAAa,MAAM,MAAM,aAAa,OACzC,OACA,MAAM,KAAK,iBAAiB,MAAM,SAAS;AAE/C,OAAI,aAAa,SAAS,UAAU;AACnC,UAAM,YAAY;AAGlB,UAAM,aAAa,MAAM,KAAK,cAAc,SAAS,MAAM,SAAS;;;EAItE,MAAM,gBAAgB,OAAO,KAAK,QAAQ,CAAC,SAAS;EACpD,MAAM,kBAAkB,OAAO,KAAK,MAAM,CAAC,SAAS;AACpD,MAAI,iBAAiB,iBAAiB;AACrC,SAAM,gBAAgB,KAAK,IAAI,OAAO,QAAQ;AAC7C,QAAI,cACH,OAAM,IAAI,YAAY,aAAa,CAAC,IAAI,QAAQ,CAAC,MAAM,MAAM,KAAK,GAAG,CAAC,SAAS;AAEhF,QAAI,gBACH,OAAM,IACJ,YAAY,aAAa,CACzB,IAAI,MAAM,CACV,MAAM,qBAAqB,KAAK,SAAS,oBAAoB,SAAS,GAAG,CACzE,SAAS;KAEX;AACF,kCAA+B;;AAGhC,SAAO,KAAK,SAAS,GAAG;;;;;;;;;;;;;;;;CAiBzB,MAAM,QAAQ,QAAkB,UAAqD;EACpF,MAAM,UAAU,IAAI,IAAI,SAAS,KAAK,EAAE,OAAO,eAAe,CAAC,OAAO,SAAS,CAAC,CAAC;EAEjF,MAAM,SAAmB,EAAE;EAC3B,MAAM,WAAqB,EAAE;AAC7B,OAAK,MAAM,SAAS,QAAQ;GAC3B,MAAM,WAAW,QAAQ,IAAI,MAAM;AACnC,OAAI,aAAa,OAAW;AAC5B,UAAO,KAAK,MAAM;AAClB,YAAS,KAAK,SAAS;;AAExB,MAAI,OAAO,WAAW,EAAG;EAUzB,MAAM,UAAU,CAAC,GAJhB,IAAI,IAAI,SAAS,CAAC,SAAS,SAAS,SACjC,mBAAmB,QAAQ,SAAS,GACpC,iBAAiB,QAAQ,SAAS,CAEX,CAAC,QAAQ,CAAC,OAAO,cAAc,QAAQ,IAAI,MAAM,KAAK,SAAS;AAC1F,MAAI,QAAQ,WAAW,EAAG;AAE1B,QAAM,KAAK,eAAe,QAAQ;AAElC,iCAA+B;;;;;;;;;;CAWhC,MAAc,eAAe,WAAkE;AAC9F,OAAK,IAAI,QAAQ,GAAG,QAAQ,UAAU,QAAQ,SAAS,mBAAmB;GACzE,MAAM,QAAQ,UAAU,MAAM,OAAO,QAAQ,kBAAkB;AAS/D,SAAM,GAAG;;8CALI,IAAI,KAChB,MAAM,KAAK,CAAC,OAAO,cAAc,GAAG,QAAQ,MAAM,aAAa,SAAS,cAAc,EACtF,GAAG,IACH,CAI+C;kCAHnC,IAAI,KAAK,MAAM,KAAK,CAAC,WAAW,GAAG,GAAG,QAAQ,CAAC,CAIxB;KAClC,QAAQ,KAAK,GAAG;;;;;;;;;;;CAYpB,MAAc,cAAc,MAAc,UAA0C;EACnF,IAAI,QAAQ,KAAK,GACf,WAAW,aAAa,CACxB,QAAQ,OAAO,GAAG,GAAG,IAAI,aAAa,CAAC,GAAG,MAAM,CAAC,CACjD,MAAM,QAAQ,KAAK,KAAK;AAC1B,UACC,aAAa,OACV,MAAM,MAAM,aAAa,MAAM,KAAK,GACpC,MAAM,MAAM,aAAa,KAAK,SAAS;EAE3C,MAAM,SAAS,MAAM,MAAM,kBAAkB;AAE7C,MAAI,CAAC,UAAU,OAAO,QAAQ,KAAM,QAAO;AAC3C,SAAO,OAAO,MAAM;;CAGrB,MAAM,OAAO,IAA8B;EAC1C,MAAM,OAAO,MAAM,KAAK,SAAS,GAAG;AACpC,MAAI,CAAC,KAAM,QAAO;AAIlB,MAAI,KAAK,kBAOR;QANiB,MAAM,KAAK,GAC1B,WAAW,aAAa,CACxB,OAAO,KAAK,CACZ,MAAM,qBAAqB,KAAK,KAAK,iBAAiB,CACtD,MAAM,MAAM,MAAM,GAAG,CACrB,SAAS,EACE,WAAW,EACvB,OAAM,KAAK,GACT,WAAW,qBAAqB,CAChC,MAAM,eAAe,KAAK,KAAK,iBAAiB,CAChD,SAAS;;EAIb,MAAM,SAAS,MAAM,KAAK,GAAG,WAAW,aAAa,CAAC,MAAM,MAAM,KAAK,GAAG,CAAC,kBAAkB;AAC7F,iCAA+B;AAC/B,UAAQ,OAAO,kBAAkB,MAAM;;CAKxC,MAAM,cAAc,YAAoB,SAAiB,YAAmC;EAC3F,MAAM,gBAAgB,MAAM,KAAK,wBAAwB,WAAW;AACpE,MAAI,CAAC,cAAe;AACpB,QAAM,KAAK,oBAAoB,YAAY,SAAS,CAAC,cAAc,CAAC;;;;;;CAOrE,MAAM,oBACL,YACA,SACA,gBACkB;EAClB,MAAM,eAAe,CAAC,GAAG,IAAI,IAAI,eAAe,CAAC;AACjD,MAAI,aAAa,WAAW,EAAG,QAAO;EACtC,MAAM,aAAa,MAAM,KAAK,6BAA6B,YAAY,QAAQ;AAC/E,MAAI,CAAC,WAAY,QAAO;EAExB,MAAM,SAAS,MAAM,KAAK,GACxB,WAAW,qBAAqB,CAChC,OACA,aAAa,KAAK,iBAAiB;GAClC;GACA,UAAU;GACV;GACA,EAAE,CACH,CACA,YAAY,OAAO,GAAG,WAAW,CAAC,CAClC,kBAAkB;EACpB,MAAM,WAAW,OAAO,OAAO,4BAA4B,GAAG;AAC9D,MAAI,WAAW,EAAG,gCAA+B;AACjD,SAAO;;CAGR,MAAM,gBAAgB,YAAoB,SAAiB,YAAmC;EAC7F,MAAM,CAAC,YAAY,iBAAiB,MAAM,QAAQ,IAAI,CACrD,KAAK,6BAA6B,YAAY,QAAQ,EACtD,KAAK,wBAAwB,WAAW,CACxC,CAAC;AACF,MAAI,CAAC,cAAc,CAAC,cAAe;AAEnC,QAAM,KAAK,GACT,WAAW,qBAAqB,CAChC,MAAM,cAAc,KAAK,WAAW,CACpC,MAAM,YAAY,KAAK,WAAW,CAClC,MAAM,eAAe,KAAK,cAAc,CACxC,SAAS;AACX,iCAA+B;;;;;;;CAQhC,MAAM,iBACL,YACA,SACA,cACA,QACsB;EACtB,MAAM,aAAa,MAAM,KAAK,6BAA6B,YAAY,QAAQ;AAC/E,MAAI,CAAC,WAAY,QAAO,EAAE;EAE1B,IAAI,QAAQ,KAAK,GACf,WAAW,qBAAqB,CAChC,UAAU,cAAc,gCAAgC,iCAAiC,CACzF,UAAU,aAAa,CACvB,MAAM,iCAAiC,KAAK,WAAW,CACvD,MAAM,+BAA+B,KAAK,WAAW;AAEvD,MAAI,aAAc,SAAQ,MAAM,MAAM,mBAAmB,KAAK,aAAa;AAC3E,MAAI,WAAW,OAAW,SAAQ,MAAM,MAAM,qBAAqB,KAAK,OAAO;AAG/E,UADa,MAAM,MAAM,QAAQ,qBAAqB,MAAM,CAAC,SAAS,EAC1D,KAAK,QAAQ,KAAK,cAAc,IAAI,CAAC;;CAGlD,MAAM,2BACL,YACA,SACA,cACA,QACA,eAC0C;EAC1C,MAAM,aAAa,MAAM,KAAK,6BAA6B,YAAY,QAAQ;AAC/E,MAAI,CAAC,WAAY,QAAO,EAAE;EAE1B,MAAM,OAAO,MAAM,KAAK,GACtB,WAAW,qBAAqB,CAChC,UAAU,cAAc,gCAAgC,iCAAiC,CACzF,UAAU,aAAa,CACvB,OAAO,qDAAqD,CAC5D,MAAM,iCAAiC,KAAK,WAAW,CACvD,MAAM,+BAA+B,KAAK,WAAW,CACrD,MAAM,mBAAmB,KAAK,aAAa,CAC3C,QAAQ,kCAAkC,MAAM,CAChD,QAAQ,qBAAqB,MAAM,CACnC,SAAS;EAEX,MAAM,0BAAU,IAAI,KAAyB;AAC7C,OAAK,MAAM,OAAO,MAAM;GACvB,MAAM,WAAW,QAAQ,IAAI,IAAI,iBAAiB,IAAI,EAAE;AACxD,YAAS,KAAK,KAAK,cAAc,IAAI,CAAC;AACtC,WAAQ,IAAI,IAAI,kBAAkB,SAAS;;AAG5C,SAAO,MAAM,KAAK,UAAU,CAAC,kBAAkB,cAAc;AAK5D,UAAO;IACN;IACA,MALA,SAAS,MAAM,YAAY,QAAQ,WAAW,OAAO,IACrD,SAAS,MAAM,YAAY,QAAQ,WAAW,cAAc,IAC5D;IAIA,kBAAkB,SAAS,KAAK,YAAY,QAAQ,OAAO;IAC3D,cAAc,SAAS,KAAK,aAAa;KACxC,IAAI,QAAQ;KACZ,MAAM,QAAQ;KACd,QAAQ,QAAQ;KAChB,EAAE;IACH;IACA;;;;;;CAOH,MAAM,iBACL,YACA,SACA,cACA,SACgB;EAChB,MAAM,aAAa,MAAM,KAAK,6BAA6B,YAAY,QAAQ;AAC/E,MAAI,CAAC,WAAY;EAEjB,MAAM,SAAmB,EAAE;AAC3B,OAAK,MAAM,MAAM,SAAS;GACzB,MAAM,QAAQ,MAAM,KAAK,wBAAwB,GAAG;AACpD,OAAI,MAAO,QAAO,KAAK,MAAM;;EAE9B,MAAM,YAAY,IAAI,IAAI,OAAO;EAEjC,MAAM,UAAU,MAAM,KAAK,GACzB,WAAW,qBAAqB,CAChC,UAAU,cAAc,gCAAgC,iCAAiC,CACzF,OAAO,CAAC,0CAA0C,CAAC,CACnD,UAAU,CACV,MAAM,iCAAiC,KAAK,WAAW,CACvD,MAAM,+BAA+B,KAAK,WAAW,CACrD,MAAM,mBAAmB,KAAK,aAAa,CAC3C,SAAS;EACX,MAAM,gBAAgB,IAAI,IAAI,QAAQ,KAAK,MAAM,EAAE,MAAM,CAAC;EAE1D,MAAM,WAAW,CAAC,GAAG,cAAc,CAAC,QAAQ,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;AACpE,MAAI,SAAS,SAAS,EACrB,OAAM,KAAK,GACT,WAAW,qBAAqB,CAChC,MAAM,cAAc,KAAK,WAAW,CACpC,MAAM,YAAY,KAAK,WAAW,CAClC,MAAM,eAAe,MAAM,SAAS,CACpC,SAAS;EAGZ,MAAM,QAAQ,CAAC,GAAG,UAAU,CAAC,QAAQ,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC;AACjE,MAAI,MAAM,SAAS,EAClB,OAAM,KAAK,GACT,WAAW,qBAAqB,CAChC,OACA,MAAM,KAAK,iBAAiB;GAC3B;GACA,UAAU;GACV;GACA,EAAE,CACH,CACA,YAAY,OAAO,GAAG,WAAW,CAAC,CAClC,SAAS;AAGZ,MAAI,SAAS,SAAS,KAAK,MAAM,SAAS,EAAG,gCAA+B;;CAG7E,MAAM,gBAAgB,YAAoB,SAAkC;EAC3E,MAAM,aAAa,MAAM,KAAK,6BAA6B,YAAY,QAAQ;AAC/E,MAAI,CAAC,WAAY,QAAO;EAExB,MAAM,SAAS,MAAM,KAAK,GACxB,WAAW,qBAAqB,CAChC,MAAM,cAAc,KAAK,WAAW,CACpC,MAAM,YAAY,KAAK,WAAW,CAClC,kBAAkB;EACpB,MAAM,UAAU,OAAO,OAAO,kBAAkB,EAAE;AAClD,MAAI,UAAU,EAAG,gCAA+B;AAChD,SAAO;;CAGR,MAAc,6BACb,YACA,gBACyB;AACzB,qBAAmB,YAAY,kBAAkB;EACjD,MAAM,YAAY,MAAM;AAOxB,UANe,MAAM,GAAkC;;UAE/C,IAAI,IAAI,UAAU,CAAC;gBACb,eAAe,0BAA0B,eAAe;;IAEpE,QAAQ,KAAK,GAAG,EACJ,KAAK,IAAI,qBAAqB;;;;;;;;;;;;CAa7C,MAAM,qBAAqB,eAAwC;EAClE,MAAM,QAAQ,MAAM,KAAK,wBAAwB,cAAc;AAC/D,MAAI,CAAC,MAAO,QAAO;EAEnB,MAAM,SAAS,MAAM,KAAK,GACxB,WAAW,qBAAqB,CAChC,QAAQ,OAAO,GAAG,GAAG,MAAM,WAAW,CAAC,GAAG,QAAQ,CAAC,CACnD,MAAM,eAAe,KAAK,MAAM,CAChC,kBAAkB;AACpB,SAAO,OAAO,QAAQ,SAAS,EAAE;;;;;;;;;;;CAYlC,MAAc,iBAAiB,WAAoC;EAClE,MAAM,QAAQ,MAAM,KAAK,wBAAwB,UAAU;AAC3D,MAAI,CAAC,MAAO,QAAO;AAMnB,SALe,MAAM,KAAK,GACxB,WAAW,aAAa,CACxB,OAAO,KAAK,CACZ,MAAM,MAAM,KAAK,MAAM,CACvB,kBAAkB,GACJ,QAAQ;;CAGzB,MAAc,wBAAwB,WAA2C;AAMhF,UALY,MAAM,KAAK,GACrB,WAAW,aAAa,CACxB,OAAO,CAAC,oBAAoB,CAAC,CAC7B,OAAO,OAAO,GAAG,GAAG,CAAC,GAAG,MAAM,KAAK,UAAU,EAAE,GAAG,qBAAqB,KAAK,UAAU,CAAC,CAAC,CAAC,CACzF,kBAAkB,GACR,qBAAqB;;;;;;;;;;;;;CAclC,MAAM,qBAAqB,mBAA2D;AACrF,MAAI,kBAAkB,WAAW,EAAG,wBAAO,IAAI,KAAK;EAEpD,MAAM,EAAE,QAAQ,mBAAmB,MAAM,OAAO;EAEhD,MAAM,yBAAS,IAAI,KAAqB;AACxC,OAAK,MAAM,SAAS,OAAO,mBAAmB,eAAe,EAAE;GAC9D,MAAM,OAAO,MAAM,KAAK,GACtB,WAAW,qBAAqB,CAChC,OAAO,CAAC,gBAAgB,OAAO,GAAG,GAAG,MAAM,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC,CACpE,MAAM,eAAe,MAAM,MAAM,CACjC,QAAQ,cAAc,CACtB,SAAS;AAEX,QAAK,MAAM,OAAO,KACjB,QAAO,IAAI,IAAI,aAAa,OAAO,IAAI,SAAS,EAAE,CAAC;;AAGrD,SAAO;;CAGR,AAAQ,cAAc,KAA0C;AAC/D,SAAO;GACN,IAAI,IAAI;GACR,MAAM,IAAI;GACV,MAAM,IAAI;GACV,OAAO,IAAI;GACX,UAAU,IAAI;GACd,MAAM,IAAI,OAAO,KAAK,MAAM,IAAI,KAAK,GAAG;GACxC,QAAQ,IAAI;GACZ,kBAAkB,IAAI;GACtB,WAAW,IAAI;GACf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens-gTS-IVUp.mjs","names":[],"sources":["../src/preview/tokens.ts"],"sourcesContent":["/**\n * Preview token generation and verification\n *\n * Tokens are compact, URL-safe, and HMAC-signed.\n * Format: base64url(JSON payload).base64url(HMAC signature)\n *\n * Payload: { cid: contentId, exp: expiryTimestamp, iat: issuedAt }\n */\n\nimport { encodeBase64url, decodeBase64url } from \"../utils/base64.js\";\n\n// Regex pattern for duration parsing\nconst DURATION_PATTERN = /^(\\d+)([smhdw])$/;\n\n/**\n * Preview token payload\n */\nexport interface PreviewTokenPayload {\n\t/** Content ID in format \"collection:id\" (e.g., \"posts:abc123\") */\n\tcid: string;\n\t/** Expiry timestamp (seconds since epoch) */\n\texp: number;\n\t/** Issued at timestamp (seconds since epoch) */\n\tiat: number;\n}\n\n/**\n * Options for generating a preview token\n */\nexport interface GeneratePreviewTokenOptions {\n\t/** Content ID in format \"collection:id\" */\n\tcontentId: string;\n\t/** How long the token is valid. Accepts \"1h\", \"30m\", \"1d\", or seconds as number. Default: \"1h\" */\n\texpiresIn?: string | number;\n\t/** Secret key for signing. Should be from environment variable. */\n\tsecret: string;\n}\n\n/**\n * Parse duration string to seconds\n * Supports: \"1h\", \"30m\", \"1d\", \"2w\", or raw seconds\n */\nfunction parseDuration(duration: string | number): number {\n\tif (typeof duration === \"number\") {\n\t\treturn duration;\n\t}\n\n\tconst match = duration.match(DURATION_PATTERN);\n\tif (!match) {\n\t\tthrow new Error(\n\t\t\t`Invalid duration format: \"${duration}\". Use \"1h\", \"30m\", \"1d\", \"2w\", or seconds.`,\n\t\t);\n\t}\n\n\tconst value = parseInt(match[1], 10);\n\tconst unit = match[2];\n\n\tswitch (unit) {\n\t\tcase \"s\":\n\t\t\treturn value;\n\t\tcase \"m\":\n\t\t\treturn value * 60;\n\t\tcase \"h\":\n\t\t\treturn value * 60 * 60;\n\t\tcase \"d\":\n\t\t\treturn value * 60 * 60 * 24;\n\t\tcase \"w\":\n\t\t\treturn value * 60 * 60 * 24 * 7;\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown duration unit: ${unit}`);\n\t}\n}\n\n/**\n * Create HMAC-SHA256 signature using Web Crypto API\n */\nasync function createSignature(data: string, secret: string): Promise<Uint8Array> {\n\tconst encoder = new TextEncoder();\n\tconst key = await crypto.subtle.importKey(\n\t\t\"raw\",\n\t\tencoder.encode(secret),\n\t\t{ name: \"HMAC\", hash: \"SHA-256\" },\n\t\tfalse,\n\t\t[\"sign\"],\n\t);\n\tconst signature = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(data));\n\treturn new Uint8Array(signature);\n}\n\n/**\n * Verify HMAC-SHA256 signature\n */\nasync function verifySignature(\n\tdata: string,\n\tsignature: Uint8Array,\n\tsecret: string,\n): Promise<boolean> {\n\tconst encoder = new TextEncoder();\n\tconst key = await crypto.subtle.importKey(\n\t\t\"raw\",\n\t\tencoder.encode(secret),\n\t\t{ name: \"HMAC\", hash: \"SHA-256\" },\n\t\tfalse,\n\t\t[\"verify\"],\n\t);\n\t// Create a new ArrayBuffer from the signature to satisfy BufferSource typing\n\t// (Uint8Array.buffer is ArrayBufferLike which includes SharedArrayBuffer)\n\tconst sigBuffer: ArrayBuffer = new ArrayBuffer(signature.byteLength);\n\tnew Uint8Array(sigBuffer).set(signature);\n\treturn crypto.subtle.verify(\"HMAC\", key, sigBuffer, encoder.encode(data));\n}\n\n/**\n * Generate a preview token for content\n *\n * @example\n * ```ts\n * const token = await generatePreviewToken({\n * contentId: \"posts:abc123\",\n * expiresIn: \"1h\",\n * secret: process.env.PREVIEW_SECRET!,\n * });\n * ```\n */\nexport async function generatePreviewToken(options: GeneratePreviewTokenOptions): Promise<string> {\n\tconst { contentId, expiresIn = \"1h\", secret } = options;\n\n\tif (!secret) {\n\t\tthrow new Error(\"Preview secret is required\");\n\t}\n\n\tif (!contentId || !contentId.includes(\":\")) {\n\t\tthrow new Error('Content ID must be in format \"collection:id\"');\n\t}\n\n\tconst now = Math.floor(Date.now() / 1000);\n\tconst duration = parseDuration(expiresIn);\n\n\tconst payload: PreviewTokenPayload = {\n\t\tcid: contentId,\n\t\texp: now + duration,\n\t\tiat: now,\n\t};\n\n\t// Encode payload\n\tconst payloadJson = JSON.stringify(payload);\n\tconst encodedPayload = encodeBase64url(new TextEncoder().encode(payloadJson));\n\n\t// Sign it\n\tconst signature = await createSignature(encodedPayload, secret);\n\tconst encodedSignature = encodeBase64url(signature);\n\n\treturn `${encodedPayload}.${encodedSignature}`;\n}\n\n/**\n * Result of verifying a preview token\n */\nexport type VerifyPreviewTokenResult =\n\t| { valid: true; payload: PreviewTokenPayload }\n\t| { valid: false; error: \"invalid\" | \"expired\" | \"malformed\" | \"none\" };\n\n/**\n * Options for verifyPreviewToken\n */\nexport type VerifyPreviewTokenOptions = {\n\t/** Secret key for verifying tokens */\n\tsecret: string;\n} & (\n\t| { /** URL to extract _preview token from */ url: URL }\n\t| {\n\t\t\t/** Preview token string (can be null) */ token: string | null | undefined;\n\t }\n);\n\n/**\n * Verify a preview token and return the payload\n *\n * @example\n * ```ts\n * // With URL (extracts _preview query param)\n * const result = await verifyPreviewToken({\n * url: Astro.url,\n * secret: import.meta.env.PREVIEW_SECRET,\n * });\n *\n * // With token directly\n * const result = await verifyPreviewToken({\n * token: someToken,\n * secret: import.meta.env.PREVIEW_SECRET,\n * });\n *\n * if (result.valid) {\n * console.log(result.payload.cid); // \"posts:abc123\"\n * }\n * ```\n */\nexport async function verifyPreviewToken(\n\toptions: VerifyPreviewTokenOptions,\n): Promise<VerifyPreviewTokenResult> {\n\tconst { secret } = options;\n\n\tif (!secret) {\n\t\tthrow new Error(\"Preview secret is required\");\n\t}\n\n\t// Extract token from URL or use provided token\n\tconst token = \"url\" in options ? options.url.searchParams.get(\"_preview\") : options.token;\n\n\t// Handle null/undefined token\n\tif (!token) {\n\t\treturn { valid: false, error: \"none\" };\n\t}\n\n\t// Split token into payload and signature\n\tconst parts = token.split(\".\");\n\tif (parts.length !== 2) {\n\t\treturn { valid: false, error: \"malformed\" };\n\t}\n\n\tconst [encodedPayload, encodedSignature] = parts;\n\n\t// Verify signature\n\tlet signature: Uint8Array;\n\ttry {\n\t\tsignature = decodeBase64url(encodedSignature);\n\t} catch {\n\t\treturn { valid: false, error: \"malformed\" };\n\t}\n\n\tconst isValid = await verifySignature(encodedPayload, signature, secret);\n\tif (!isValid) {\n\t\treturn { valid: false, error: \"invalid\" };\n\t}\n\n\t// Decode and parse payload\n\tlet payload: PreviewTokenPayload;\n\ttry {\n\t\tconst payloadBytes = decodeBase64url(encodedPayload);\n\t\tconst payloadJson = new TextDecoder().decode(payloadBytes);\n\t\tpayload = JSON.parse(payloadJson);\n\t} catch {\n\t\treturn { valid: false, error: \"malformed\" };\n\t}\n\n\t// Check required fields\n\tif (\n\t\ttypeof payload.cid !== \"string\" ||\n\t\ttypeof payload.exp !== \"number\" ||\n\t\ttypeof payload.iat !== \"number\"\n\t) {\n\t\treturn { valid: false, error: \"malformed\" };\n\t}\n\n\t// Check expiry\n\tconst now = Math.floor(Date.now() / 1000);\n\tif (payload.exp < now) {\n\t\treturn { valid: false, error: \"expired\" };\n\t}\n\n\treturn { valid: true, payload };\n}\n\n/**\n * Parse a content ID into collection and id\n */\nexport function parseContentId(contentId: string): {\n\tcollection: string;\n\tid: string;\n} {\n\tconst colonIndex = contentId.indexOf(\":\");\n\tif (colonIndex === -1) {\n\t\tthrow new Error('Content ID must be in format \"collection:id\"');\n\t}\n\treturn {\n\t\tcollection: contentId.slice(0, colonIndex),\n\t\tid: contentId.slice(colonIndex + 1),\n\t};\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tokens-BCO1oruF.mjs","names":[],"sources":["../src/preview/tokens.ts"],"sourcesContent":["/**\n * Preview token generation and verification\n *\n * Tokens are compact, URL-safe, and HMAC-signed.\n * Format: base64url(JSON payload).base64url(HMAC signature)\n *\n * Payload: { cid: contentId, exp: expiryTimestamp, iat: issuedAt }\n */\n\nimport { encodeBase64url, decodeBase64url } from \"../utils/base64.js\";\n\n// Regex pattern for duration parsing\nconst DURATION_PATTERN = /^(\\d+)([smhdw])$/;\n\n/**\n * Preview token payload\n */\nexport interface PreviewTokenPayload {\n\t/** Content ID in format \"collection:id\" (e.g., \"posts:abc123\") */\n\tcid: string;\n\t/** Expiry timestamp (seconds since epoch) */\n\texp: number;\n\t/** Issued at timestamp (seconds since epoch) */\n\tiat: number;\n}\n\n/**\n * Options for generating a preview token\n */\nexport interface GeneratePreviewTokenOptions {\n\t/** Content ID in format \"collection:id\" */\n\tcontentId: string;\n\t/** How long the token is valid. Accepts \"1h\", \"30m\", \"1d\", or seconds as number. Default: \"1h\" */\n\texpiresIn?: string | number;\n\t/** Secret key for signing. Should be from environment variable. */\n\tsecret: string;\n}\n\n/**\n * Parse duration string to seconds\n * Supports: \"1h\", \"30m\", \"1d\", \"2w\", or raw seconds\n */\nfunction parseDuration(duration: string | number): number {\n\tif (typeof duration === \"number\") {\n\t\treturn duration;\n\t}\n\n\tconst match = duration.match(DURATION_PATTERN);\n\tif (!match) {\n\t\tthrow new Error(\n\t\t\t`Invalid duration format: \"${duration}\". Use \"1h\", \"30m\", \"1d\", \"2w\", or seconds.`,\n\t\t);\n\t}\n\n\tconst value = parseInt(match[1], 10);\n\tconst unit = match[2];\n\n\tswitch (unit) {\n\t\tcase \"s\":\n\t\t\treturn value;\n\t\tcase \"m\":\n\t\t\treturn value * 60;\n\t\tcase \"h\":\n\t\t\treturn value * 60 * 60;\n\t\tcase \"d\":\n\t\t\treturn value * 60 * 60 * 24;\n\t\tcase \"w\":\n\t\t\treturn value * 60 * 60 * 24 * 7;\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown duration unit: ${unit}`);\n\t}\n}\n\n/**\n * Create HMAC-SHA256 signature using Web Crypto API\n */\nasync function createSignature(data: string, secret: string): Promise<Uint8Array> {\n\tconst encoder = new TextEncoder();\n\tconst key = await crypto.subtle.importKey(\n\t\t\"raw\",\n\t\tencoder.encode(secret),\n\t\t{ name: \"HMAC\", hash: \"SHA-256\" },\n\t\tfalse,\n\t\t[\"sign\"],\n\t);\n\tconst signature = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(data));\n\treturn new Uint8Array(signature);\n}\n\n/**\n * Verify HMAC-SHA256 signature\n */\nasync function verifySignature(\n\tdata: string,\n\tsignature: Uint8Array,\n\tsecret: string,\n): Promise<boolean> {\n\tconst encoder = new TextEncoder();\n\tconst key = await crypto.subtle.importKey(\n\t\t\"raw\",\n\t\tencoder.encode(secret),\n\t\t{ name: \"HMAC\", hash: \"SHA-256\" },\n\t\tfalse,\n\t\t[\"verify\"],\n\t);\n\t// Create a new ArrayBuffer from the signature to satisfy BufferSource typing\n\t// (Uint8Array.buffer is ArrayBufferLike which includes SharedArrayBuffer)\n\tconst sigBuffer: ArrayBuffer = new ArrayBuffer(signature.byteLength);\n\tnew Uint8Array(sigBuffer).set(signature);\n\treturn crypto.subtle.verify(\"HMAC\", key, sigBuffer, encoder.encode(data));\n}\n\n/**\n * Generate a preview token for content\n *\n * @example\n * ```ts\n * const token = await generatePreviewToken({\n * contentId: \"posts:abc123\",\n * expiresIn: \"1h\",\n * secret: process.env.PREVIEW_SECRET!,\n * });\n * ```\n */\nexport async function generatePreviewToken(options: GeneratePreviewTokenOptions): Promise<string> {\n\tconst { contentId, expiresIn = \"1h\", secret } = options;\n\n\tif (!secret) {\n\t\tthrow new Error(\"Preview secret is required\");\n\t}\n\n\tif (!contentId || !contentId.includes(\":\")) {\n\t\tthrow new Error('Content ID must be in format \"collection:id\"');\n\t}\n\n\tconst now = Math.floor(Date.now() / 1000);\n\tconst duration = parseDuration(expiresIn);\n\n\tconst payload: PreviewTokenPayload = {\n\t\tcid: contentId,\n\t\texp: now + duration,\n\t\tiat: now,\n\t};\n\n\t// Encode payload\n\tconst payloadJson = JSON.stringify(payload);\n\tconst encodedPayload = encodeBase64url(new TextEncoder().encode(payloadJson));\n\n\t// Sign it\n\tconst signature = await createSignature(encodedPayload, secret);\n\tconst encodedSignature = encodeBase64url(signature);\n\n\treturn `${encodedPayload}.${encodedSignature}`;\n}\n\n/**\n * Result of verifying a preview token\n */\nexport type VerifyPreviewTokenResult =\n\t| { valid: true; payload: PreviewTokenPayload }\n\t| { valid: false; error: \"invalid\" | \"expired\" | \"malformed\" | \"none\" };\n\n/**\n * Options for verifyPreviewToken\n */\nexport type VerifyPreviewTokenOptions = {\n\t/** Secret key for verifying tokens */\n\tsecret: string;\n} & (\n\t| { /** URL to extract _preview token from */ url: URL }\n\t| {\n\t\t\t/** Preview token string (can be null) */ token: string | null | undefined;\n\t }\n);\n\n/**\n * Verify a preview token and return the payload\n *\n * @example\n * ```ts\n * // With URL (extracts _preview query param)\n * const result = await verifyPreviewToken({\n * url: Astro.url,\n * secret: import.meta.env.PREVIEW_SECRET,\n * });\n *\n * // With token directly\n * const result = await verifyPreviewToken({\n * token: someToken,\n * secret: import.meta.env.PREVIEW_SECRET,\n * });\n *\n * if (result.valid) {\n * console.log(result.payload.cid); // \"posts:abc123\"\n * }\n * ```\n */\nexport async function verifyPreviewToken(\n\toptions: VerifyPreviewTokenOptions,\n): Promise<VerifyPreviewTokenResult> {\n\tconst { secret } = options;\n\n\tif (!secret) {\n\t\tthrow new Error(\"Preview secret is required\");\n\t}\n\n\t// Extract token from URL or use provided token\n\tconst token = \"url\" in options ? options.url.searchParams.get(\"_preview\") : options.token;\n\n\t// Handle null/undefined token\n\tif (!token) {\n\t\treturn { valid: false, error: \"none\" };\n\t}\n\n\t// Split token into payload and signature\n\tconst parts = token.split(\".\");\n\tif (parts.length !== 2) {\n\t\treturn { valid: false, error: \"malformed\" };\n\t}\n\n\tconst [encodedPayload, encodedSignature] = parts;\n\n\t// Verify signature\n\tlet signature: Uint8Array;\n\ttry {\n\t\tsignature = decodeBase64url(encodedSignature);\n\t} catch {\n\t\treturn { valid: false, error: \"malformed\" };\n\t}\n\n\tconst isValid = await verifySignature(encodedPayload, signature, secret);\n\tif (!isValid) {\n\t\treturn { valid: false, error: \"invalid\" };\n\t}\n\n\t// Decode and parse payload\n\tlet payload: PreviewTokenPayload;\n\ttry {\n\t\tconst payloadBytes = decodeBase64url(encodedPayload);\n\t\tconst payloadJson = new TextDecoder().decode(payloadBytes);\n\t\tpayload = JSON.parse(payloadJson);\n\t} catch {\n\t\treturn { valid: false, error: \"malformed\" };\n\t}\n\n\t// Check required fields\n\tif (\n\t\ttypeof payload.cid !== \"string\" ||\n\t\ttypeof payload.exp !== \"number\" ||\n\t\ttypeof payload.iat !== \"number\"\n\t) {\n\t\treturn { valid: false, error: \"malformed\" };\n\t}\n\n\t// Check expiry\n\tconst now = Math.floor(Date.now() / 1000);\n\tif (payload.exp < now) {\n\t\treturn { valid: false, error: \"expired\" };\n\t}\n\n\treturn { valid: true, payload };\n}\n\n/**\n * Parse a content ID into collection and id\n */\nexport function parseContentId(contentId: string): {\n\tcollection: string;\n\tid: string;\n} {\n\tconst colonIndex = contentId.indexOf(\":\");\n\tif (colonIndex === -1) {\n\t\tthrow new Error('Content ID must be in format \"collection:id\"');\n\t}\n\treturn {\n\t\tcollection: contentId.slice(0, colonIndex),\n\t\tid: contentId.slice(colonIndex + 1),\n\t};\n}\n"],"mappings":"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"}
|
|
@@ -133,4 +133,4 @@ function refreshInterceptor(options) {
|
|
|
133
133
|
|
|
134
134
|
//#endregion
|
|
135
135
|
export { tokenInterceptor as a, refreshInterceptor as i, csrfInterceptor as n, devBypassInterceptor as r, createTransport as t };
|
|
136
|
-
//# sourceMappingURL=transport-
|
|
136
|
+
//# sourceMappingURL=transport-Dr3qtwXC.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport-
|
|
1
|
+
{"version":3,"file":"transport-Dr3qtwXC.mjs","names":[],"sources":["../src/client/transport.ts"],"sourcesContent":["/**\n * Transport layer for the EmDash client.\n *\n * Implements a composable interceptor pipeline that modifies requests\n * and responses. The client calls `transport.fetch(request)` — everything\n * else (auth, CSRF, retry) is handled by interceptors.\n */\n\n// Regex patterns for transport utilities\nconst COOKIE_NAME_VALUE_PATTERN = /^([^;]+)/;\n\n/**\n * An interceptor can modify the request, call next(), inspect\n * the response, and optionally retry.\n */\nexport type Interceptor = (\n\trequest: Request,\n\tnext: (request: Request) => Promise<Response>,\n) => Promise<Response>;\n\nexport interface TransportOptions {\n\tinterceptors?: Interceptor[];\n}\n\nfunction baseFetch(request: Request): Promise<Response> {\n\treturn globalThis.fetch(request);\n}\n\n/**\n * Creates a fetch function that runs requests through an interceptor pipeline.\n */\nexport function createTransport(options: TransportOptions = {}): {\n\tfetch: (request: Request) => Promise<Response>;\n} {\n\tconst interceptors = options.interceptors ?? [];\n\n\t// Build the chain once — interceptors don't change after construction\n\tlet chain: (request: Request) => Promise<Response> = baseFetch;\n\tfor (let i = interceptors.length - 1; i >= 0; i--) {\n\t\tconst interceptor = interceptors[i];\n\t\tconst next = chain;\n\t\tchain = (req) => interceptor(req, next);\n\t}\n\n\treturn { fetch: chain };\n}\n\n// ---------------------------------------------------------------------------\n// Built-in interceptors\n// ---------------------------------------------------------------------------\n\n/**\n * Adds X-EmDash-Request: 1 and Origin headers to mutation requests\n * (POST, PUT, DELETE). The custom header satisfies EmDash's CSRF check;\n * the Origin header satisfies Astro's built-in origin verification which\n * rejects server-side POST requests that lack a matching Origin.\n */\nexport function csrfInterceptor(): Interceptor {\n\tconst MUTATION_METHODS = new Set([\"POST\", \"PUT\", \"DELETE\", \"PATCH\"]);\n\n\treturn (request, next) => {\n\t\tif (MUTATION_METHODS.has(request.method)) {\n\t\t\tconst headers = new Headers(request.headers);\n\t\t\theaders.set(\"X-EmDash-Request\", \"1\");\n\t\t\tif (!headers.has(\"Origin\")) {\n\t\t\t\tconst url = new URL(request.url);\n\t\t\t\theaders.set(\"Origin\", url.origin);\n\t\t\t}\n\t\t\treturn next(new Request(request, { headers }));\n\t\t}\n\t\treturn next(request);\n\t};\n}\n\n/**\n * Adds Authorization: Bearer header from a static token.\n */\nexport function tokenInterceptor(token: string): Interceptor {\n\treturn (request, next) => {\n\t\tconst headers = new Headers(request.headers);\n\t\theaders.set(\"Authorization\", `Bearer ${token}`);\n\t\treturn next(new Request(request, { headers }));\n\t};\n}\n\n/**\n * Dev bypass interceptor. Calls the dev-bypass endpoint on first request\n * to establish a session, then forwards the session cookie on subsequent\n * requests.\n */\nexport function devBypassInterceptor(baseUrl: string): Interceptor {\n\tlet sessionCookie: string | null = null;\n\tlet initializing: Promise<void> | null = null;\n\n\tasync function init(): Promise<void> {\n\t\tconst bypassUrl = new URL(\"/_emdash/api/auth/dev-bypass\", baseUrl);\n\t\tconst res = await globalThis.fetch(bypassUrl, { redirect: \"manual\" });\n\n\t\t// Extract session cookie from Set-Cookie header\n\t\tconst setCookie = res.headers.get(\"set-cookie\");\n\t\tif (setCookie) {\n\t\t\t// Extract just the cookie name=value part\n\t\t\tconst match = setCookie.match(COOKIE_NAME_VALUE_PATTERN);\n\t\t\tif (match) {\n\t\t\t\tsessionCookie = match[1]!;\n\t\t\t}\n\t\t}\n\n\t\t// Consume the response body\n\t\tif (res.body) {\n\t\t\tawait res.text().catch(() => {});\n\t\t}\n\t}\n\n\treturn async (request, next) => {\n\t\t// Ensure we've initialized (only once, even with concurrent requests)\n\t\tif (!sessionCookie) {\n\t\t\tif (!initializing) {\n\t\t\t\tinitializing = init();\n\t\t\t}\n\t\t\tawait initializing;\n\t\t}\n\n\t\tif (sessionCookie) {\n\t\t\tconst headers = new Headers(request.headers);\n\t\t\tconst existing = headers.get(\"cookie\");\n\t\t\theaders.set(\"cookie\", existing ? `${existing}; ${sessionCookie}` : sessionCookie);\n\t\t\treturn next(new Request(request, { headers }));\n\t\t}\n\n\t\treturn next(request);\n\t};\n}\n\n/**\n * Auto-refreshes expired OAuth tokens on 401 responses.\n * Requires a refresh token and the token endpoint URL.\n */\nexport function refreshInterceptor(options: {\n\trefreshToken: string;\n\ttokenEndpoint: string;\n\tonTokenRefreshed?: (accessToken: string, refreshToken: string, expiresAt: string) => void;\n}): Interceptor {\n\tlet refreshing: Promise<string | null> | null = null;\n\n\tasync function refresh(): Promise<string | null> {\n\t\tconst res = await globalThis.fetch(options.tokenEndpoint, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\tbody: JSON.stringify({\n\t\t\t\tgrant_type: \"refresh_token\",\n\t\t\t\trefresh_token: options.refreshToken,\n\t\t\t}),\n\t\t});\n\n\t\tif (!res.ok) return null;\n\n\t\tinterface TokenFields {\n\t\t\taccess_token: string;\n\t\t\trefresh_token?: string;\n\t\t\texpires_in?: number;\n\t\t}\n\n\t\tconst json = (await res.json()) as Record<string, unknown>;\n\n\t\t// The token endpoint wraps the response in { success, data: ... } via apiSuccess.\n\t\t// Handle both wrapped and bare shapes for robustness.\n\t\tconst tokenData: TokenFields =\n\t\t\tjson.data && typeof json.data === \"object\" && \"access_token\" in json.data\n\t\t\t\t? (json.data as TokenFields)\n\t\t\t\t: (json as unknown as TokenFields);\n\n\t\tconst expiresAt = tokenData.expires_in\n\t\t\t? new Date(Date.now() + tokenData.expires_in * 1000).toISOString()\n\t\t\t: new Date(Date.now() + 3600_000).toISOString();\n\n\t\tif (options.onTokenRefreshed) {\n\t\t\toptions.onTokenRefreshed(\n\t\t\t\ttokenData.access_token,\n\t\t\t\ttokenData.refresh_token ?? options.refreshToken,\n\t\t\t\texpiresAt,\n\t\t\t);\n\t\t}\n\n\t\treturn tokenData.access_token;\n\t}\n\n\treturn async (request, next) => {\n\t\t// A request body can only be read once; clone before sending so the\n\t\t// 401 retry has an unconsumed request to rebuild from.\n\t\tconst retryTemplate = request.body ? request.clone() : request;\n\n\t\tconst response = await next(request);\n\n\t\tif (response.status === 401) {\n\t\t\t// Try to refresh\n\t\t\tif (!refreshing) {\n\t\t\t\trefreshing = refresh().finally(() => {\n\t\t\t\t\trefreshing = null;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst newToken = await refreshing;\n\t\t\tif (newToken) {\n\t\t\t\t// Retry with new token\n\t\t\t\tconst headers = new Headers(retryTemplate.headers);\n\t\t\t\theaders.set(\"Authorization\", `Bearer ${newToken}`);\n\t\t\t\treturn next(new Request(retryTemplate, { headers }));\n\t\t\t}\n\t\t}\n\n\t\treturn response;\n\t};\n}\n"],"mappings":"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"}
|
|
@@ -39,4 +39,4 @@ declare function tokenInterceptor(token: string): Interceptor;
|
|
|
39
39
|
declare function devBypassInterceptor(baseUrl: string): Interceptor;
|
|
40
40
|
//#endregion
|
|
41
41
|
export { tokenInterceptor as a, devBypassInterceptor as i, createTransport as n, csrfInterceptor as r, Interceptor as t };
|
|
42
|
-
//# sourceMappingURL=transport-
|
|
42
|
+
//# sourceMappingURL=transport-xh6YKW2G.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport-
|
|
1
|
+
{"version":3,"file":"transport-xh6YKW2G.d.mts","names":[],"sources":["../src/client/transport.ts"],"mappings":";;AAeA;;;;;;;;;;KAAY,WAAA,IACX,OAAA,EAAS,OAAA,EACT,IAAA,GAAO,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,QAAA,MAChC,OAAA,CAAQ,QAAA;AAAA,UAEI,gBAAA;EAChB,YAAA,GAAe,WAAA;AAAA;;;;iBAUA,eAAA,CAAgB,OAAA,GAAS,gBAAA;EACxC,KAAA,GAAQ,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,QAAA;AAAA;;;AAZtC;;;;iBAqCgB,eAAA,CAAA,GAAmB,WAAA;AA1BnC;;;AAAA,iBA8CgB,gBAAA,CAAiB,KAAA,WAAgB,WAAA;;;;;;iBAajC,oBAAA,CAAqB,OAAA,WAAkB,WAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trusted-proxy-
|
|
1
|
+
{"version":3,"file":"trusted-proxy-BR5F1Otp.mjs","names":[],"sources":["../src/auth/trusted-proxy.ts"],"sourcesContent":["/**\n * Resolve the list of client-IP headers the operator trusts.\n *\n * Resolution order:\n * 1. `config.trustedProxyHeaders` — explicit opt-in via astro.config.mjs.\n * An empty array is respected (means \"trust nothing, ignore env\").\n * 2. `EMDASH_TRUSTED_PROXY_HEADERS` env var — comma-separated header names.\n * 3. `[]` — default, no trusted headers.\n *\n * Operators must only set this when they control the reverse proxy.\n * Untrusted clients can set any header they like; trusting headers from\n * an open network defeats rate limiting.\n *\n * Header names are returned lowercased because HTTP header lookups are\n * case-insensitive.\n */\n\nimport type { EmDashConfig } from \"../astro/integration/runtime.js\";\n\n/**\n * RFC 7230 token — valid characters for an HTTP header name. Invalid names\n * passed to `Headers.get()` throw a TypeError at runtime, which would\n * otherwise surface as a 500 from every auth route.\n */\nconst HEADER_NAME_PATTERN = /^[!#$%&'*+\\-.^_`|~0-9a-z]+$/;\n\n/**\n * Normalise a list of header names the way both the config path and any\n * caller passing a pre-resolved list should do: trim, lowercase, drop\n * empty, drop anything that isn't a valid RFC 7230 token. Invalid names\n * would crash `Headers.get()` at runtime.\n */\nexport function normalizeTrustedHeaders(names: readonly string[]): string[] {\n\treturn names\n\t\t.map((h) => h.trim().toLowerCase())\n\t\t.filter((h) => h.length > 0 && HEADER_NAME_PATTERN.test(h));\n}\n\nfunction isValidHeaderName(name: string): boolean {\n\treturn HEADER_NAME_PATTERN.test(name);\n}\n\n/** Cache for the env-derived value. `null` means \"not yet parsed\". */\nlet _envCache: string[] | null = null;\n\n/** Test-only: clear the env cache so a fresh value is read on next call. */\nexport function _resetTrustedProxyHeadersCache(): void {\n\t_envCache = null;\n}\n\nfunction getEnvTrustedHeaders(): string[] {\n\tif (_envCache !== null) return _envCache;\n\tlet raw: string | undefined;\n\ttry {\n\t\t// Prefer process.env so SSR/container deployments can override this\n\t\t// value at runtime (Vite/Astro inline import.meta.env at build time,\n\t\t// which locks the value into the bundle). Fall back to import.meta.env\n\t\t// for bundler-managed environments where process.env isn't populated.\n\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- import.meta.env shape varies by bundler\n\t\tconst importMetaEnv = (import.meta as unknown as { env?: Record<string, string | undefined> })\n\t\t\t.env;\n\t\traw =\n\t\t\t(typeof process !== \"undefined\" ? process.env?.EMDASH_TRUSTED_PROXY_HEADERS : undefined) ||\n\t\t\timportMetaEnv?.EMDASH_TRUSTED_PROXY_HEADERS;\n\t} catch {\n\t\traw = undefined;\n\t}\n\tif (!raw) {\n\t\t_envCache = [];\n\t\treturn _envCache;\n\t}\n\t_envCache = raw\n\t\t.split(\",\")\n\t\t.map((s) => s.trim().toLowerCase())\n\t\t.filter((s) => s.length > 0 && isValidHeaderName(s));\n\treturn _envCache;\n}\n\n/**\n * Return the lowercased list of headers to trust for client-IP resolution.\n *\n * When `config?.trustedProxyHeaders` is explicitly set (even to `[]`), it\n * wins. Otherwise fall through to the env var, then to `[]`.\n */\nexport function getTrustedProxyHeaders(config: EmDashConfig | null | undefined): string[] {\n\tif (config && config.trustedProxyHeaders !== undefined) {\n\t\treturn config.trustedProxyHeaders\n\t\t\t.map((h) => h.trim().toLowerCase())\n\t\t\t.filter((h) => h.length > 0 && isValidHeaderName(h));\n\t}\n\treturn getEnvTrustedHeaders();\n}\n"],"mappings":";;;;;;AAwBA,MAAM,sBAAsB;;;;;;;AAQ5B,SAAgB,wBAAwB,OAAoC;AAC3E,QAAO,MACL,KAAK,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,CAClC,QAAQ,MAAM,EAAE,SAAS,KAAK,oBAAoB,KAAK,EAAE,CAAC;;AAG7D,SAAS,kBAAkB,MAAuB;AACjD,QAAO,oBAAoB,KAAK,KAAK;;;AAItC,IAAI,YAA6B;AAOjC,SAAS,uBAAiC;AACzC,KAAI,cAAc,KAAM,QAAO;CAC/B,IAAI;AACJ,KAAI;EAMH,MAAM,gBAAiB,OAAO,KAC5B;AACF,SACE,OAAO,YAAY,cAAc,QAAQ,KAAK,+BAA+B,WAC9E,eAAe;SACT;AACP,QAAM;;AAEP,KAAI,CAAC,KAAK;AACT,cAAY,EAAE;AACd,SAAO;;AAER,aAAY,IACV,MAAM,IAAI,CACV,KAAK,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,CAClC,QAAQ,MAAM,EAAE,SAAS,KAAK,kBAAkB,EAAE,CAAC;AACrD,QAAO;;;;;;;;AASR,SAAgB,uBAAuB,QAAmD;AACzF,KAAI,UAAU,OAAO,wBAAwB,OAC5C,QAAO,OAAO,oBACZ,KAAK,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,CAClC,QAAQ,MAAM,EAAE,SAAS,KAAK,kBAAkB,EAAE,CAAC;AAEtD,QAAO,sBAAsB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-
|
|
1
|
+
{"version":3,"file":"types-3qNFPlci.mjs","names":[],"sources":["../src/storage/types.ts"],"sourcesContent":["/**\n * Storage Layer Types\n *\n * Defines the interface for S3-compatible storage backends.\n * Works with R2, AWS S3, Minio, and other S3-compatible services.\n */\n\n/**\n * Storage configuration for S3-compatible backends\n */\nexport interface S3StorageConfig {\n\t/** S3 endpoint URL (e.g., \"https://xxx.r2.cloudflarestorage.com\") */\n\tendpoint: string;\n\t/** Bucket name */\n\tbucket: string;\n\t/**\n\t * AWS access key ID.\n\t * May be resolved from the `S3_ACCESS_KEY_ID` env var at runtime on Node.\n\t * Must be provided together with `secretAccessKey`, or both omitted.\n\t */\n\taccessKeyId?: string;\n\t/**\n\t * AWS secret access key.\n\t * May be resolved from the `S3_SECRET_ACCESS_KEY` env var at runtime on Node.\n\t * Must be provided together with `accessKeyId`, or both omitted.\n\t */\n\tsecretAccessKey?: string;\n\t/** Optional region (defaults to \"auto\") */\n\tregion?: string;\n\t/** Optional public URL prefix for generated URLs (e.g., CDN URL) */\n\tpublicUrl?: string;\n}\n\n/**\n * Local filesystem storage for development\n */\nexport interface LocalStorageConfig {\n\t/** Directory path for storing files */\n\tdirectory: string;\n\t/** Base URL for serving files */\n\tbaseUrl: string;\n}\n\n/**\n * Storage adapter descriptor (serializable config)\n */\nexport interface StorageDescriptor {\n\t/** Module path exporting createStorage function */\n\tentrypoint: string;\n\t/** Serializable config passed to createStorage at runtime */\n\tconfig: Record<string, unknown>;\n}\n\n/**\n * Factory function signature for storage adapters\n *\n * Each adapter accesses its own bindings directly:\n * - R2: imports from cloudflare:workers\n * - S3: uses credentials from config\n * - Local: uses filesystem path from config\n */\nexport type CreateStorageFn = (config: Record<string, unknown>) => Storage;\n\n/**\n * Upload result\n */\nexport interface UploadResult {\n\t/** Storage key (path within bucket) */\n\tkey: string;\n\t/** Public URL to access the file */\n\turl: string;\n\t/** File size in bytes */\n\tsize: number;\n}\n\n/**\n * Download result\n */\nexport interface DownloadResult {\n\t/** File content as readable stream */\n\tbody: ReadableStream<Uint8Array>;\n\t/** MIME type */\n\tcontentType: string;\n\t/** File size in bytes */\n\tsize: number;\n}\n\n/**\n * Signed URL for direct upload\n */\nexport interface SignedUploadUrl {\n\t/** Signed URL for PUT request */\n\turl: string;\n\t/** HTTP method (always PUT) */\n\tmethod: \"PUT\";\n\t/** Headers to include in the upload request */\n\theaders: Record<string, string>;\n\t/** URL expiration time (ISO string) */\n\texpiresAt: string;\n}\n\n/**\n * Options for generating signed upload URL\n */\nexport interface SignedUploadOptions {\n\t/** Storage key (path within bucket) */\n\tkey: string;\n\t/** MIME type of the file */\n\tcontentType: string;\n\t/** File size in bytes (for content-length validation) */\n\tsize?: number;\n\t/** URL expiration in seconds (default: 3600) */\n\texpiresIn?: number;\n}\n\n/**\n * File listing result\n */\nexport interface ListResult {\n\t/** List of files */\n\tfiles: FileInfo[];\n\t/** Cursor for next page (if more results) */\n\tnextCursor?: string;\n}\n\n/**\n * File info from listing\n */\nexport interface FileInfo {\n\t/** Storage key */\n\tkey: string;\n\t/** File size in bytes */\n\tsize: number;\n\t/** Last modified date */\n\tlastModified: Date;\n\t/** ETag (content hash) */\n\tetag?: string;\n}\n\n/**\n * Options for listing files\n */\nexport interface ListOptions {\n\t/** Filter by key prefix */\n\tprefix?: string;\n\t/** Maximum results per page */\n\tlimit?: number;\n\t/** Cursor from previous list call */\n\tcursor?: string;\n}\n\n/**\n * Storage interface\n *\n * All storage backends must implement this interface.\n */\nexport interface Storage {\n\t/**\n\t * Upload a file to storage\n\t */\n\tupload(options: {\n\t\tkey: string;\n\t\tbody: Buffer | Uint8Array | ReadableStream<Uint8Array>;\n\t\tcontentType: string;\n\t\t/** Optional HTTP cache policy stored with publicly served objects. */\n\t\tcacheControl?: string;\n\t}): Promise<UploadResult>;\n\n\t/**\n\t * Download a file from storage\n\t */\n\tdownload(key: string): Promise<DownloadResult>;\n\n\t/**\n\t * Delete a file from storage\n\t * Idempotent - does not throw if file doesn't exist\n\t */\n\tdelete(key: string): Promise<void>;\n\n\t/**\n\t * Check if a file exists\n\t */\n\texists(key: string): Promise<boolean>;\n\n\t/**\n\t * List files in storage\n\t */\n\tlist(options?: ListOptions): Promise<ListResult>;\n\n\t/**\n\t * Generate a signed URL for direct upload\n\t * Client uploads directly to storage, bypassing the server\n\t */\n\tgetSignedUploadUrl(options: SignedUploadOptions): Promise<SignedUploadUrl>;\n\n\t/**\n\t * Get public URL for a file\n\t */\n\tgetPublicUrl(key: string): string;\n\n\t/**\n\t * Get the origin the browser connects to for direct client uploads.\n\t * Used by the admin CSP when the storage descriptor has no static endpoint.\n\t */\n\tgetClientUploadOrigin?(): string;\n}\n\n/**\n * Storage error with additional context\n */\nexport class EmDashStorageError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic code: string,\n\t\tpublic override cause?: unknown,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"EmDashStorageError\";\n\t}\n}\n"],"mappings":";;;;AAkNA,IAAa,qBAAb,cAAwC,MAAM;CAC7C,YACC,SACA,AAAO,MACP,AAAgB,OACf;AACD,QAAM,QAAQ;EAHP;EACS;AAGhB,OAAK,OAAO"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { r as ContentFieldFilters } from "./content-list-query-
|
|
2
|
-
import { f as FieldType } from "./types-
|
|
1
|
+
import { r as ContentFieldFilters } from "./content-list-query-Btqd4uV2.mjs";
|
|
2
|
+
import { f as FieldType } from "./types-xDMtUFnO.mjs";
|
|
3
3
|
import { z } from "astro/zod";
|
|
4
4
|
import { Permission } from "@emdash-cms/auth";
|
|
5
5
|
import { CAPABILITY_RENAMES, CurrentPluginCapability, DeclaredAccess, DeprecatedPluginCapability, ManifestHookEntry as ManifestHookEntry$1, ManifestRouteEntry as ManifestRouteEntry$1, PluginCapability, PluginMcpManifestConfig, PluginStorageConfig, StorageCollectionConfig, isDeprecatedCapability, normalizeCapabilities, normalizeCapability } from "@emdash-cms/plugin-types";
|
|
@@ -766,6 +766,12 @@ interface ContentHookEvent {
|
|
|
766
766
|
content: Record<string, unknown>;
|
|
767
767
|
collection: string;
|
|
768
768
|
isNew: boolean;
|
|
769
|
+
/**
|
|
770
|
+
* ID of the existing item on `content:beforeSave` for an update. Absent on
|
|
771
|
+
* creates, where the ID is assigned when the save completes, and on
|
|
772
|
+
* `content:afterSave`, where `content.id` carries it.
|
|
773
|
+
*/
|
|
774
|
+
id?: string;
|
|
769
775
|
}
|
|
770
776
|
/**
|
|
771
777
|
* Content delete hook event
|
|
@@ -1326,4 +1332,4 @@ interface PluginManifest {
|
|
|
1326
1332
|
}
|
|
1327
1333
|
//#endregion
|
|
1328
1334
|
export { MediaUploadEvent as $, CronHandler as A, SettingField as At, FieldWidgetConfig as B, UserInfo as Bt, ContentDeleteEvent as C, PublicPageContext as Ct, ContentScheduleStateChangeEvent as D, ResolvedPlugin as Dt, ContentRestoreStateChangeEvent as E, ResolvedHook as Et, EmailBeforeSendEvent as F, TaxonomyDefInfo as Ft, LifecycleEvent as G, Element as Gt, HookName as H, isDeprecatedCapability as Ht, EmailBeforeSendHandler as I, TaxonomyReadOptions as It, MediaAccess as J, LifecycleHandler as K, EmailDeliverEvent as L, TaxonomyTermInfo as Lt, DeprecatedPluginCapability as M, StorageCollectionConfig as Mt, EmailAfterSendEvent as N, StoredComment as Nt, ContentStateChangeEvent as O, ResolvedPluginHooks as Ot, EmailAfterSendHandler as P, TaxonomyAccess as Pt, MediaItem as Q, EmailDeliverHandler as R, UninstallEvent as Rt, ContentCreateOptions as S, PortableTextBlockField as St, ContentPublishStateChangeEvent as T, RequestMeta as Tt, HttpAccess as U, normalizeCapabilities as Ut, HookConfig as V, WhereClause as Vt, KVAccess as W, normalizeCapability as Wt, MediaAfterUploadHandler as X, MediaAfterUploadEvent as Y, MediaBeforeUploadHandler as Z, ContentAfterScheduleHandler as _, PluginManifest as _t, CommentAfterCreateHandler as a, PageMetadataEvent as at, ContentBeforeDeleteHandler as b, PluginStorageConfig as bt, CommentBeforeCreateEvent as c, PagePlacement as ct, CommentModerateHandler as d, PluginAdminExports as dt, ModerationDecision as et, ContentAccess as f, PluginAdminPage as ft, ContentAfterSaveHandler as g, PluginHooks as gt, ContentAfterRestoreHandler as h, PluginDefinition as ht, CommentAfterCreateEvent as i, PageMetadataContribution as it, CurrentPluginCapability as j, StorageCollection as jt, CronEvent as k, RouteContext as kt, CommentBeforeCreateHandler as l, PaginatedResult as lt, ContentAfterPublishHandler as m, PluginContext as mt, CAPABILITY_RENAMES as n, PageFragmentEvent as nt, CommentAfterModerateEvent as o, PageMetadataHandler as ot, ContentAfterDeleteHandler as p, PluginCapability as pt, LogAccess as q, CollectionCommentSettings as r, PageFragmentHandler as rt, CommentAfterModerateHandler as s, PageMetadataLinkRel as st, BreadcrumbItem as t, PageFragmentContribution as tt, CommentModerateEvent as u, PluginAdminConfig as ut, ContentAfterUnpublishHandler as v, PluginMcpManifestConfig as vt, ContentHookEvent as w, QueryOptions as wt, ContentBeforeSaveHandler as x, PortableTextBlockConfig as xt, ContentAfterUnscheduleHandler as y, PluginRoute as yt, EmailMessage as z, UninstallHandler as zt };
|
|
1329
|
-
//# sourceMappingURL=types-
|
|
1335
|
+
//# sourceMappingURL=types-B6GrPic4.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-Vg6f5i3s.d.mts","names":["ConfirmDialog","title","text","confirm","deny","style","ButtonElement","type","action_id","label","value","TextInputElement","placeholder","initial_value","multiline","NumberInputElement","min","max","SelectElement","Array","options","optionsRoute","ToggleElement","description","SecretInputElement","has_value","CheckboxElement","DateInputElement","ComboboxElement","RadioElement","RepeaterSubField","RepeaterElement","Record","item_label","fields","min_items","max_items","MediaPickerElement","mime_type_filter","Element","FieldCondition","field","eq","neq","FormField","condition","TableColumn","key","format","sortable","StatItem","trend","ChartSeries","name","data","color","TimeseriesChartConfig","chart_type","series","x_axis_name","y_axis_name","height","gradient","CustomChartConfig","ChartConfig","BlockBase","block_id","HeaderBlock","SectionBlock","accessory","DividerBlock","FieldsBlock","TableBlock","columns","rows","next_cursor","page_action_id","empty_text","ActionsBlock","elements","StatsBlock","items","FormBlock","submit","ImageBlock","url","alt","ContextBlock","ColumnsBlock","Block","ChartBlock","config","BannerBlock","variant","MeterBlock","custom_value","CodeBlock","code","language","TabPanel","blocks","TabBlock","panels","default_tab","EmptyBlock","command_line","size","actions","AccordionBlock","default_open","BlockAction","FormSubmit","values","PageLoad","page","BlockInteraction","BlockResponse","toast","message","header","blockId","opts","section","divider","fieldsBlock","table","nextCursor","pageActionId","emptyText","actionsBlock","stats","form","actionId","image","context","columnsBlock","bannerBlock","textInput","initialValue","numberInput","select","toggle","button","secretInput","hasValue","checkbox","dateInput","combobox","radio","repeater","itemLabel","minItems","maxItems","mediaPicker","mimeTypeFilter","timeseriesChart","xAxisName","yAxisName","customChart","meter","customValue","codeBlock","tabBlock","defaultTab","empty","commandLine","accordion","defaultOpen","banner","tab","ValidationError","path","validateBlocks","valid","errors","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","R","S","T","U","V","W","X","Y","Z","_","a","b","c","d","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],"sources":["../../blocks/dist/validation-5vL6669b.d.ts","../src/plugins/types.ts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types-B6GrPic4.d.mts","names":["ConfirmDialog","title","text","confirm","deny","style","ButtonElement","type","action_id","label","value","TextInputElement","placeholder","initial_value","multiline","NumberInputElement","min","max","SelectElement","Array","options","optionsRoute","ToggleElement","description","SecretInputElement","has_value","CheckboxElement","DateInputElement","ComboboxElement","RadioElement","RepeaterSubField","RepeaterElement","Record","item_label","fields","min_items","max_items","MediaPickerElement","mime_type_filter","Element","FieldCondition","field","eq","neq","FormField","condition","TableColumn","key","format","sortable","StatItem","trend","ChartSeries","name","data","color","TimeseriesChartConfig","chart_type","series","x_axis_name","y_axis_name","height","gradient","CustomChartConfig","ChartConfig","BlockBase","block_id","HeaderBlock","SectionBlock","accessory","DividerBlock","FieldsBlock","TableBlock","columns","rows","next_cursor","page_action_id","empty_text","ActionsBlock","elements","StatsBlock","items","FormBlock","submit","ImageBlock","url","alt","ContextBlock","ColumnsBlock","Block","ChartBlock","config","BannerBlock","variant","MeterBlock","custom_value","CodeBlock","code","language","TabPanel","blocks","TabBlock","panels","default_tab","EmptyBlock","command_line","size","actions","AccordionBlock","default_open","BlockAction","FormSubmit","values","PageLoad","page","BlockInteraction","BlockResponse","toast","message","header","blockId","opts","section","divider","fieldsBlock","table","nextCursor","pageActionId","emptyText","actionsBlock","stats","form","actionId","image","context","columnsBlock","bannerBlock","textInput","initialValue","numberInput","select","toggle","button","secretInput","hasValue","checkbox","dateInput","combobox","radio","repeater","itemLabel","minItems","maxItems","mediaPicker","mimeTypeFilter","timeseriesChart","xAxisName","yAxisName","customChart","meter","customValue","codeBlock","tabBlock","defaultTab","empty","commandLine","accordion","defaultOpen","banner","tab","ValidationError","path","validateBlocks","valid","errors","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","R","S","T","U","V","W","X","Y","Z","_","a","b","c","d","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],"sources":["../../blocks/dist/validation-5vL6669b.d.ts","../src/plugins/types.ts"],"mappings":"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"}
|