emdash 0.32.0 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{adapters-C0ONzkUP.d.mts → adapters-34EN2eXO.d.mts} +34 -2
- package/dist/adapters-34EN2eXO.d.mts.map +1 -0
- package/dist/after-CBU2vkoO.mjs +96 -0
- package/dist/after-CBU2vkoO.mjs.map +1 -0
- package/dist/{allowed-origins-CCEi9bPI.mjs → allowed-origins-DW7sYyqg.mjs} +2 -2
- package/dist/{allowed-origins-CCEi9bPI.mjs.map → allowed-origins-DW7sYyqg.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -4
- package/dist/api/route-utils.d.mts.map +1 -1
- package/dist/api/route-utils.mjs +26 -25
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +6 -5
- package/dist/{api-DgPbMlng.mjs → api-DdAsirBe.mjs} +321 -428
- package/dist/api-DdAsirBe.mjs.map +1 -0
- package/dist/{api-tokens-p-iMzvXR.mjs → api-tokens-CFXu8F_2.mjs} +2 -2
- package/dist/{api-tokens-p-iMzvXR.mjs.map → api-tokens-CFXu8F_2.mjs.map} +1 -1
- package/dist/{apply-1_6ra7NP.mjs → apply-D5zfeD09.mjs} +139 -102
- package/dist/apply-D5zfeD09.mjs.map +1 -0
- package/dist/astro/index.d.mts +12 -12
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +103 -35
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +10 -10
- package/dist/astro/middleware/auth.mjs +9 -9
- package/dist/astro/middleware/media-usage-write-fence.d.mts +7 -0
- package/dist/astro/middleware/media-usage-write-fence.d.mts.map +1 -0
- package/dist/astro/middleware/media-usage-write-fence.mjs +35 -0
- package/dist/astro/middleware/media-usage-write-fence.mjs.map +1 -0
- package/dist/astro/middleware/redirect.d.mts.map +1 -1
- package/dist/astro/middleware/redirect.mjs +13 -10
- package/dist/astro/middleware/redirect.mjs.map +1 -1
- package/dist/astro/middleware/request-context.mjs +5 -5
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +12 -11
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +1915 -223
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +9 -8
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +9 -8
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +6 -6
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +6 -6
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +12 -11
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +12 -11
- package/dist/astro/routes/api/admin/byline-fields/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +12 -11
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +20 -20
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +20 -20
- package/dist/astro/routes/api/admin/bylines/index.mjs +20 -20
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +18 -17
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_.mjs +8 -8
- package/dist/astro/routes/api/admin/comments/bulk.mjs +14 -13
- package/dist/astro/routes/api/admin/comments/bulk.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/counts.mjs +8 -8
- package/dist/astro/routes/api/admin/comments/index.mjs +14 -13
- package/dist/astro/routes/api/admin/comments/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +6 -6
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +5 -5
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.d.mts +8 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +36 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.d.mts +8 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +36 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +15 -14
- package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/work/index.d.mts +8 -0
- package/dist/astro/routes/api/admin/media-usage/work/index.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +37 -0
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/work/retry.d.mts +8 -0
- package/dist/astro/routes/api/admin/media-usage/work/retry.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +37 -0
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs.map +1 -0
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +5 -5
- package/dist/astro/routes/api/admin/plugins/_id_/disable.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +56 -47
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +56 -47
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +52 -46
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +6 -6
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +52 -46
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +55 -46
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +55 -46
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +52 -46
- package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +4 -4
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +52 -46
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +55 -46
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +52 -46
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +55 -46
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +56 -47
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +52 -46
- 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 +56 -47
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +52 -46
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +52 -46
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +4 -4
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +52 -46
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +4 -4
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +3 -3
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +10 -9
- package/dist/astro/routes/api/admin/users/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +6 -6
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/index.mjs +9 -8
- package/dist/astro/routes/api/admin/users/index.mjs.map +1 -1
- package/dist/astro/routes/api/auth/dev-bypass.mjs +8 -8
- package/dist/astro/routes/api/auth/invite/accept.mjs +3 -3
- package/dist/astro/routes/api/auth/invite/complete.mjs +14 -13
- package/dist/astro/routes/api/auth/invite/complete.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/index.mjs +12 -11
- package/dist/astro/routes/api/auth/invite/index.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/register-options.mjs +13 -12
- package/dist/astro/routes/api/auth/invite/register-options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/logout.mjs +4 -4
- package/dist/astro/routes/api/auth/magic-link/send.mjs +14 -13
- package/dist/astro/routes/api/auth/magic-link/send.mjs.map +1 -1
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +4 -4
- package/dist/astro/routes/api/auth/me.mjs +10 -9
- package/dist/astro/routes/api/auth/me.mjs.map +1 -1
- package/dist/astro/routes/api/auth/mode.mjs +4 -4
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +4 -4
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +9 -8
- package/dist/astro/routes/api/auth/passkey/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/index.mjs +3 -3
- package/dist/astro/routes/api/auth/passkey/options.mjs +15 -14
- package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +13 -12
- package/dist/astro/routes/api/auth/passkey/register/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +14 -13
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/verify.mjs +14 -13
- package/dist/astro/routes/api/auth/passkey/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/complete.mjs +14 -13
- package/dist/astro/routes/api/auth/signup/complete.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/request.mjs +14 -13
- package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/verify.mjs +3 -3
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +20 -19
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs.map +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +17 -16
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +15 -15
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +11 -10
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +21 -20
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +21 -20
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +11 -10
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +47 -34
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +11 -10
- package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/authors.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/index.mjs +11 -10
- package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/trash.mjs +10 -9
- package/dist/astro/routes/api/content/_collection_/trash.mjs.map +1 -1
- package/dist/astro/routes/api/dashboard.mjs +12 -10
- package/dist/astro/routes/api/dashboard.mjs.map +1 -1
- package/dist/astro/routes/api/dev/emails.mjs +4 -4
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +22 -20
- package/dist/astro/routes/api/import/probe.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +5 -5
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/execute.mjs +18 -18
- package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -10
- package/dist/astro/routes/api/import/wordpress/media.mjs +14 -12
- package/dist/astro/routes/api/import/wordpress/media.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +13 -12
- package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +15 -15
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +22 -20
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +32 -31
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
- package/dist/astro/routes/api/manifest.mjs +6 -6
- package/dist/astro/routes/api/mcp.d.mts.map +1 -1
- package/dist/astro/routes/api/mcp.mjs +174 -72
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +14 -12
- package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/upload.mjs +7 -7
- package/dist/astro/routes/api/media/_id_/usage.mjs +17 -16
- package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_.mjs +16 -15
- package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/media/file/_...key_.mjs +3 -3
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +4 -4
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +4 -4
- package/dist/astro/routes/api/media/providers/index.mjs +4 -4
- package/dist/astro/routes/api/media/upload-url.mjs +11 -10
- package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
- package/dist/astro/routes/api/media.mjs +19 -16
- package/dist/astro/routes/api/media.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +13 -13
- package/dist/astro/routes/api/menus/_name_/items.mjs +13 -13
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +13 -13
- package/dist/astro/routes/api/menus/_name_/translations.mjs +13 -13
- package/dist/astro/routes/api/menus/_name_.mjs +13 -13
- package/dist/astro/routes/api/menus/index.mjs +13 -13
- package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/authorize.mjs +7 -7
- package/dist/astro/routes/api/oauth/device/code.mjs +10 -10
- package/dist/astro/routes/api/oauth/device/token.mjs +9 -9
- package/dist/astro/routes/api/oauth/register.mjs +4 -4
- package/dist/astro/routes/api/oauth/token/refresh.mjs +7 -7
- package/dist/astro/routes/api/oauth/token/revoke.mjs +7 -7
- package/dist/astro/routes/api/oauth/token.mjs +7 -7
- package/dist/astro/routes/api/openapi.json.mjs +183 -6
- package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.d.mts.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +8 -7
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/index.mjs +14 -13
- package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/summary.mjs +14 -13
- package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/_id_.mjs +16 -14
- package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/index.mjs +16 -14
- package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/index.mjs +21 -20
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/translations.mjs +16 -15
- package/dist/astro/routes/api/relations/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/relations/index.mjs +21 -20
- package/dist/astro/routes/api/relations/index.mjs.map +1 -1
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +4 -4
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +5 -5
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +52 -46
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +52 -46
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +52 -46
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.d.mts.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +52 -46
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +52 -46
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/reorder.d.mts +8 -0
- package/dist/astro/routes/api/schema/collections/reorder.d.mts.map +1 -0
- package/dist/astro/routes/api/schema/collections/reorder.mjs +71 -0
- package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -0
- package/dist/astro/routes/api/schema/index.mjs +14 -11
- package/dist/astro/routes/api/schema/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +52 -46
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +52 -46
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.d.mts +1 -0
- package/dist/astro/routes/api/search/enable.d.mts.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +19 -15
- package/dist/astro/routes/api/search/enable.mjs.map +1 -1
- package/dist/astro/routes/api/search/index.mjs +13 -13
- package/dist/astro/routes/api/search/rebuild.mjs +15 -15
- package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
- package/dist/astro/routes/api/search/stats.mjs +9 -9
- package/dist/astro/routes/api/search/suggest.mjs +13 -13
- package/dist/astro/routes/api/sections/_slug_.mjs +13 -12
- package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/sections/index.mjs +13 -12
- package/dist/astro/routes/api/sections/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +8 -8
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/export.mjs +8 -8
- package/dist/astro/routes/api/settings/backups/index.mjs +9 -9
- package/dist/astro/routes/api/settings/email.mjs +6 -6
- package/dist/astro/routes/api/settings.mjs +18 -17
- package/dist/astro/routes/api/settings.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin-verify.mjs +15 -14
- package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin.mjs +14 -13
- package/dist/astro/routes/api/setup/admin.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-bypass.mjs +34 -32
- package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-reset.mjs +4 -4
- package/dist/astro/routes/api/setup/index.mjs +36 -34
- package/dist/astro/routes/api/setup/index.mjs.map +1 -1
- package/dist/astro/routes/api/setup/status.mjs +5 -5
- package/dist/astro/routes/api/snapshot.mjs +10 -10
- package/dist/astro/routes/api/taxonomies/_name_/reorder.d.mts +8 -0
- package/dist/astro/routes/api/taxonomies/_name_/reorder.d.mts.map +1 -0
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +44 -0
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -0
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +19 -18
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +19 -18
- 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 +21 -19
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/translations.d.mts +8 -0
- package/dist/astro/routes/api/taxonomies/_name_/translations.d.mts.map +1 -0
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +46 -0
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs.map +1 -0
- package/dist/astro/routes/api/taxonomies/_name_.d.mts +19 -0
- package/dist/astro/routes/api/taxonomies/_name_.d.mts.map +1 -0
- package/dist/astro/routes/api/taxonomies/_name_.mjs +88 -0
- package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -0
- package/dist/astro/routes/api/taxonomies/index.mjs +19 -18
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +8 -8
- package/dist/astro/routes/api/typegen.mjs +6 -6
- package/dist/astro/routes/api/well-known/auth.mjs +2 -2
- package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
- package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +10 -9
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +13 -12
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +13 -12
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.mjs +8 -7
- package/dist/astro/routes/api/widget-areas/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/index.mjs +13 -12
- package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
- package/dist/astro/routes/api/widget-components.mjs +4 -4
- package/dist/astro/routes/robots.txt.mjs +11 -10
- package/dist/astro/routes/robots.txt.mjs.map +1 -1
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +14 -14
- package/dist/astro/routes/sitemap.xml.mjs +12 -11
- package/dist/astro/routes/sitemap.xml.mjs.map +1 -1
- package/dist/astro/types.d.mts +41 -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-R5iYYrpa.mjs → authorize-1iFJzPaZ.mjs} +2 -2
- package/dist/{authorize-R5iYYrpa.mjs.map → authorize-1iFJzPaZ.mjs.map} +1 -1
- package/dist/{backup-LpQ1V_sR.mjs → backup-LHjIAVNP.mjs} +5 -5
- package/dist/{backup-LpQ1V_sR.mjs.map → backup-LHjIAVNP.mjs.map} +1 -1
- package/dist/{base64-B-PsqheR.mjs → base64-CvLhUKQv.mjs} +1 -1
- package/dist/{base64-B-PsqheR.mjs.map → base64-CvLhUKQv.mjs.map} +1 -1
- package/dist/bundle-CBEXrBnb.mjs +663 -0
- package/dist/bundle-CBEXrBnb.mjs.map +1 -0
- package/dist/{byline-fields-T9ZLZMxJ.mjs → byline-fields-C5S8wygO.mjs} +2 -2
- package/dist/{byline-fields-T9ZLZMxJ.mjs.map → byline-fields-C5S8wygO.mjs.map} +1 -1
- package/dist/{byline-C5TAqs8N.mjs → byline-pEcoDps8.mjs} +9 -9
- package/dist/{byline-C5TAqs8N.mjs.map → byline-pEcoDps8.mjs.map} +1 -1
- package/dist/{byline-registry-BCuOp4UF.mjs → byline-registry-DDun8sxh.mjs} +4 -4
- package/dist/{byline-registry-BCuOp4UF.mjs.map → byline-registry-DDun8sxh.mjs.map} +1 -1
- package/dist/{bylines-B8-WGdja.mjs → bylines-BWemdX2k.mjs} +8 -8
- package/dist/{bylines-B8-WGdja.mjs.map → bylines-BWemdX2k.mjs.map} +1 -1
- package/dist/{bylines-DGuqBLjV.mjs → bylines-DJfSfXCL.mjs} +5 -5
- package/dist/{bylines-DGuqBLjV.mjs.map → bylines-DJfSfXCL.mjs.map} +1 -1
- package/dist/cache-CBJaDy_E.mjs +108 -0
- package/dist/cache-CBJaDy_E.mjs.map +1 -0
- package/dist/{challenge-store-BFzgFRog.mjs → challenge-store-CZyFVaad.mjs} +1 -1
- package/dist/{challenge-store-BFzgFRog.mjs.map → challenge-store-CZyFVaad.mjs.map} +1 -1
- package/dist/{chunks-D5dlPeRb.mjs → chunks-DfPax1I0.mjs} +2 -2
- package/dist/{chunks-D5dlPeRb.mjs.map → chunks-DfPax1I0.mjs.map} +1 -1
- package/dist/cli/index.mjs +193 -707
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +74 -4
- package/dist/client/index.d.mts.map +1 -1
- package/dist/client/index.mjs +25 -2
- package/dist/client/index.mjs.map +1 -1
- package/dist/collection-deletion-C8BugSGz.mjs +779 -0
- package/dist/collection-deletion-C8BugSGz.mjs.map +1 -0
- package/dist/{comment-DnTxxVHv.mjs → comment-Dxlep6cE.mjs} +3 -3
- package/dist/{comment-DnTxxVHv.mjs.map → comment-Dxlep6cE.mjs.map} +1 -1
- package/dist/{comment-reaction-BUlUz2bh.mjs → comment-reaction-D6qfHKBc.mjs} +2 -2
- package/dist/{comment-reaction-BUlUz2bh.mjs.map → comment-reaction-D6qfHKBc.mjs.map} +1 -1
- package/dist/{comments-QPKgK3nk.mjs → comments-CTOuhTSX.mjs} +3 -3
- package/dist/{comments-QPKgK3nk.mjs.map → comments-CTOuhTSX.mjs.map} +1 -1
- package/dist/{components-DZkL4Fx0.mjs → components-CQy3lh9x.mjs} +1 -1
- package/dist/{components-DZkL4Fx0.mjs.map → components-CQy3lh9x.mjs.map} +1 -1
- package/dist/{config-DyF3OKg_.mjs → config-C3EBstHi.mjs} +18 -2
- package/dist/config-C3EBstHi.mjs.map +1 -0
- package/dist/{content-CpfKV9QE.mjs → content-BNfwh7xX.mjs} +667 -183
- package/dist/content-BNfwh7xX.mjs.map +1 -0
- package/dist/content-list-query-DhQ84eVV.d.mts +26 -0
- package/dist/content-list-query-DhQ84eVV.d.mts.map +1 -0
- package/dist/content-refresh-DNERP4-f.mjs +2560 -0
- package/dist/content-refresh-DNERP4-f.mjs.map +1 -0
- package/dist/{context-kO4YZB03.mjs → context-DRgOvSnW.mjs} +28 -20
- package/dist/context-DRgOvSnW.mjs.map +1 -0
- package/dist/{cron-BlKIMD_e.mjs → cron-Y9aLtgrA.mjs} +1 -1
- package/dist/{cron-BlKIMD_e.mjs.map → cron-Y9aLtgrA.mjs.map} +1 -1
- package/dist/{dashboard-DoBwPnON.mjs → dashboard-CB8J89rJ.mjs} +45 -11
- package/dist/dashboard-CB8J89rJ.mjs.map +1 -0
- package/dist/db/index.d.mts +4 -4
- package/dist/db/index.mjs +3 -3
- package/dist/db/index.mjs.map +1 -1
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/{db-errors-CcWLaRiR.mjs → db-errors-Cl-sKYTm.mjs} +1 -1
- package/dist/{db-errors-CcWLaRiR.mjs.map → db-errors-Cl-sKYTm.mjs.map} +1 -1
- package/dist/{default-C4v9KP56.mjs → default-DdDl3fxv.mjs} +1 -1
- package/dist/{default-C4v9KP56.mjs.map → default-DdDl3fxv.mjs.map} +1 -1
- package/dist/deferred-tasks-BMsa9F64.d.mts +9 -0
- package/dist/deferred-tasks-BMsa9F64.d.mts.map +1 -0
- package/dist/{device-flow-DhUsyJU6.mjs → device-flow-CaioYGK3.mjs} +5 -5
- package/dist/{device-flow-DhUsyJU6.mjs.map → device-flow-CaioYGK3.mjs.map} +1 -1
- package/dist/{dialect-helpers-DFwyWjTM.mjs → dialect-helpers-BSbfaO3F.mjs} +24 -16
- package/dist/dialect-helpers-BSbfaO3F.mjs.map +1 -0
- package/dist/dist-D_6CKR8z.mjs +810 -0
- package/dist/dist-D_6CKR8z.mjs.map +1 -0
- package/dist/{email-console-C-9Ng8DM.mjs → email-console-BHNjIwiB.mjs} +1 -1
- package/dist/{email-console-C-9Ng8DM.mjs.map → email-console-BHNjIwiB.mjs.map} +1 -1
- package/dist/{enrich-CFJJgxs_.mjs → enrich-_ySMEvEE.mjs} +2 -2
- package/dist/{enrich-CFJJgxs_.mjs.map → enrich-_ySMEvEE.mjs.map} +1 -1
- package/dist/{error-DmmN74gW.mjs → error-DupyJZE2.mjs} +3 -3
- package/dist/{error-DmmN74gW.mjs.map → error-DupyJZE2.mjs.map} +1 -1
- package/dist/{errors-DtEXIQQV.mjs → errors-CLUPm7aD.mjs} +15 -2
- package/dist/errors-CLUPm7aD.mjs.map +1 -0
- package/dist/{escape-CdW31WsG.mjs → escape-C_aLKP3H.mjs} +1 -1
- package/dist/{escape-CdW31WsG.mjs.map → escape-C_aLKP3H.mjs.map} +1 -1
- package/dist/{field-defs-cache-QMVnzTH6.mjs → field-defs-cache-hg6QkjV9.mjs} +5 -5
- package/dist/{field-defs-cache-QMVnzTH6.mjs.map → field-defs-cache-hg6QkjV9.mjs.map} +1 -1
- package/dist/{fts-manager-vncsZIJm.mjs → fts-manager-CZ-5dVwJ.mjs} +111 -61
- package/dist/fts-manager-CZ-5dVwJ.mjs.map +1 -0
- package/dist/{hash-Cb7U1b5M.mjs → hash-Cg0TXJPV.mjs} +1 -1
- package/dist/{hash-Cb7U1b5M.mjs.map → hash-Cg0TXJPV.mjs.map} +1 -1
- package/dist/{hreflang-CZbSx6Bg.d.mts → hreflang-D3Uehfv2.d.mts} +2 -2
- package/dist/{hreflang-CZbSx6Bg.d.mts.map → hreflang-D3Uehfv2.d.mts.map} +1 -1
- package/dist/{hreflang-Bg-zMpkr.mjs → hreflang-DNswoYsi.mjs} +7 -7
- package/dist/{hreflang-Bg-zMpkr.mjs.map → hreflang-DNswoYsi.mjs.map} +1 -1
- package/dist/{import-PKhLeXvn.mjs → import-B41u8Rot.mjs} +7 -7
- package/dist/{import-PKhLeXvn.mjs.map → import-B41u8Rot.mjs.map} +1 -1
- package/dist/{index-j9rTh3cp.d.mts → index-C3Y-rsyN.d.mts} +286 -93
- package/dist/index-C3Y-rsyN.d.mts.map +1 -0
- package/dist/{index-BeNto_Vs.d.mts → index-Cof4-Fab.d.mts} +5 -10
- package/dist/index-Cof4-Fab.d.mts.map +1 -0
- package/dist/index.d.mts +20 -19
- package/dist/index.mjs +79 -71
- package/dist/{init-lock-DJkX6Hto.mjs → init-lock-6b309ZrF.mjs} +1 -1
- package/dist/{init-lock-DJkX6Hto.mjs.map → init-lock-6b309ZrF.mjs.map} +1 -1
- package/dist/{load-BwTdWE8B.mjs → load-DmvJrtxS.mjs} +2 -2
- package/dist/{load-BwTdWE8B.mjs.map → load-DmvJrtxS.mjs.map} +1 -1
- package/dist/{loader-C1XOLV5b.mjs → loader-DLBqRiGP.mjs} +120 -64
- package/dist/loader-DLBqRiGP.mjs.map +1 -0
- package/dist/{manifest-schema-bCq54i7F.mjs → manifest-schema-BXbUAHod.mjs} +1 -1
- package/dist/{manifest-schema-bCq54i7F.mjs.map → manifest-schema-BXbUAHod.mjs.map} +1 -1
- package/dist/media/image-endpoint.mjs +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +3 -2
- package/dist/media/index.mjs.map +1 -1
- package/dist/media/local-runtime.d.mts +12 -12
- package/dist/media/local-runtime.mjs +10 -9
- package/dist/media/local-runtime.mjs.map +1 -1
- package/dist/{media-DWIzoVFL.mjs → media-BWWWb8kg.mjs} +92 -3
- package/dist/media-BWWWb8kg.mjs.map +1 -0
- package/dist/{media-tQDZEdu7.mjs → media-CzhAn2--.mjs} +2 -2
- package/dist/{media-tQDZEdu7.mjs.map → media-CzhAn2--.mjs.map} +1 -1
- package/dist/{media-allowlist-B7TPD6aq.mjs → media-allowlist-BD6HhgXA.mjs} +14 -3
- package/dist/media-allowlist-BD6HhgXA.mjs.map +1 -0
- package/dist/{media-upload-Bc9Nc5Zf.mjs → media-upload-9yas9zGH.mjs} +11 -9
- package/dist/{media-upload-Bc9Nc5Zf.mjs.map → media-upload-9yas9zGH.mjs.map} +1 -1
- package/dist/{media-url-BCm5vBn6.mjs → media-url-BvoX88FA.mjs} +1 -1
- package/dist/{media-url-BCm5vBn6.mjs.map → media-url-BvoX88FA.mjs.map} +1 -1
- package/dist/{media-usage-DPJcNaAq.mjs → media-usage-De3qvwjc.mjs} +138 -61
- package/dist/media-usage-De3qvwjc.mjs.map +1 -0
- package/dist/media-usage-work-B9Bksh_b.mjs +152 -0
- package/dist/media-usage-work-B9Bksh_b.mjs.map +1 -0
- package/dist/media-usage-work-DrCbqBcl.mjs +424 -0
- package/dist/media-usage-work-DrCbqBcl.mjs.map +1 -0
- package/dist/media-usage-write-fence-aHEgN1zB.mjs +42 -0
- package/dist/media-usage-write-fence-aHEgN1zB.mjs.map +1 -0
- package/dist/{menus-C6qhqP4X.mjs → menus-CC-yn1F9.mjs} +554 -121
- package/dist/menus-CC-yn1F9.mjs.map +1 -0
- package/dist/{menus-BxPLFfIc.mjs → menus-fxvEDYE6.mjs} +5 -5
- package/dist/{menus-BxPLFfIc.mjs.map → menus-fxvEDYE6.mjs.map} +1 -1
- package/dist/{mode-fiXRMfeA.mjs → mode-Bpe-tNNy.mjs} +1 -1
- package/dist/{mode-fiXRMfeA.mjs.map → mode-Bpe-tNNy.mjs.map} +1 -1
- package/dist/{normalize-C-SHXmra.mjs → normalize-Bc-s_r-a.mjs} +1 -1
- package/dist/{normalize-C-SHXmra.mjs.map → normalize-Bc-s_r-a.mjs.map} +1 -1
- package/dist/{oauth-authorization-C9tFinly.mjs → oauth-authorization-BXO1MKej.mjs} +5 -5
- package/dist/{oauth-authorization-C9tFinly.mjs.map → oauth-authorization-BXO1MKej.mjs.map} +1 -1
- package/dist/{oauth-clients-BwTxE1aE.mjs → oauth-clients-C_DNqtRu.mjs} +1 -1
- package/dist/{oauth-clients-BwTxE1aE.mjs.map → oauth-clients-C_DNqtRu.mjs.map} +1 -1
- package/dist/{oauth-state-store-DaRUwPWO.mjs → oauth-state-store-DwAxMtk4.mjs} +1 -1
- package/dist/{oauth-state-store-DaRUwPWO.mjs.map → oauth-state-store-DwAxMtk4.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-CzuzOSlF.mjs → oauth-user-lookup-BxfZizdk.mjs} +1 -1
- package/dist/{oauth-user-lookup-CzuzOSlF.mjs.map → oauth-user-lookup-BxfZizdk.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/{object-cache-Bok5j2ae.mjs → object-cache-71tPfV4A.mjs} +106 -5
- package/dist/object-cache-71tPfV4A.mjs.map +1 -0
- package/dist/{options-BlmBHTvX.mjs → options-CBXIHUoT.mjs} +1 -1
- package/dist/{options-BlmBHTvX.mjs.map → options-CBXIHUoT.mjs.map} +1 -1
- package/dist/{options-aeIs8WFu.d.mts → options-DRe1pIBL.d.mts} +4 -3
- package/dist/options-DRe1pIBL.d.mts.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/{parse-BL49yb9D.mjs → parse-DFbuc-Fh.mjs} +2 -2
- package/dist/{parse-BL49yb9D.mjs.map → parse-DFbuc-Fh.mjs.map} +1 -1
- package/dist/{passkey-config-KMhgFjdQ.mjs → passkey-config-_2GOwwK8.mjs} +1 -1
- package/dist/{passkey-config-KMhgFjdQ.mjs.map → passkey-config-_2GOwwK8.mjs.map} +1 -1
- package/dist/{placeholder-Dxo5Zt58.d.mts → placeholder-CzW7Lshs.d.mts} +1 -1
- package/dist/{placeholder-Dxo5Zt58.d.mts.map → placeholder-CzW7Lshs.d.mts.map} +1 -1
- package/dist/plugin-types.d.mts +8 -1
- package/dist/plugin-types.d.mts.map +1 -1
- package/dist/plugin-utils.d.mts +10 -10
- package/dist/plugins/adapt-sandbox-entry.d.mts +10 -10
- package/dist/plugins/adapt-sandbox-entry.mjs +7 -4
- package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
- package/dist/{portable-text-CNahFfj6.mjs → portable-text-DhKbDAGr.mjs} +1 -1
- package/dist/{portable-text-CNahFfj6.mjs.map → portable-text-DhKbDAGr.mjs.map} +1 -1
- package/dist/{preview-D4Jnbfx7.mjs → preview-PW-nOnq4.mjs} +2 -2
- package/dist/{preview-D4Jnbfx7.mjs.map → preview-PW-nOnq4.mjs.map} +1 -1
- package/dist/{public-url-DSGTnJFw.mjs → public-url-CWoFhQT8.mjs} +14 -3
- package/dist/public-url-CWoFhQT8.mjs.map +1 -0
- package/dist/{query-DCiXI7OZ.mjs → query-BgjfiLUQ.mjs} +38 -77
- package/dist/query-BgjfiLUQ.mjs.map +1 -0
- package/dist/{query-1xOcEy18.mjs → query-vgZNwIhh.mjs} +4 -4
- package/dist/{query-1xOcEy18.mjs.map → query-vgZNwIhh.mjs.map} +1 -1
- package/dist/{rate-limit-Vkp9gQ1Y.mjs → rate-limit-L5anykgo.mjs} +2 -2
- package/dist/{rate-limit-Vkp9gQ1Y.mjs.map → rate-limit-L5anykgo.mjs.map} +1 -1
- package/dist/{redirect-BJ6d1yHh.mjs → redirect-COsS6SWJ.mjs} +3 -3
- package/dist/{redirect-BJ6d1yHh.mjs.map → redirect-COsS6SWJ.mjs.map} +1 -1
- package/dist/{redirect-CDgfv9vh.mjs → redirect-KBNE3UEs.mjs} +1 -1
- package/dist/{redirect-CDgfv9vh.mjs.map → redirect-KBNE3UEs.mjs.map} +1 -1
- package/dist/{redirects-Cwkq2H-G.mjs → redirects-CufRQt0Q.mjs} +5 -5
- package/dist/{redirects-Cwkq2H-G.mjs.map → redirects-CufRQt0Q.mjs.map} +1 -1
- package/dist/{redirects-BOn2DIUs.mjs → redirects-cV9g7V-0.mjs} +149 -16
- package/dist/redirects-cV9g7V-0.mjs.map +1 -0
- package/dist/registry-C581V4TP.mjs +1275 -0
- package/dist/registry-C581V4TP.mjs.map +1 -0
- package/dist/{relation-DJ5DZh7B.mjs → relation-DtmAQH7s.mjs} +3 -3
- package/dist/{relation-DJ5DZh7B.mjs.map → relation-DtmAQH7s.mjs.map} +1 -1
- package/dist/{relations-C4duJnwI.mjs → relations-BBApI4e2.mjs} +3 -3
- package/dist/{relations-C4duJnwI.mjs.map → relations-BBApI4e2.mjs.map} +1 -1
- package/dist/{relations-DpTjftCl.mjs → relations-DICSyfsh.mjs} +6 -6
- package/dist/{relations-DpTjftCl.mjs.map → relations-DICSyfsh.mjs.map} +1 -1
- package/dist/{relations-DHFQGX0h.d.mts → relations-DItI3MN9.d.mts} +401 -40
- package/dist/relations-DItI3MN9.d.mts.map +1 -0
- package/dist/request-context.d.mts +3 -0
- package/dist/request-context.d.mts.map +1 -1
- package/dist/request-context.mjs.map +1 -1
- package/dist/{request-meta-DzXYYI-n.mjs → request-meta-DgZJh3zG.mjs} +2 -2
- package/dist/{request-meta-DzXYYI-n.mjs.map → request-meta-DgZJh3zG.mjs.map} +1 -1
- package/dist/{resolve-BUvFE0Lr.mjs → resolve-DOhVEvty.mjs} +2 -2
- package/dist/{resolve-BUvFE0Lr.mjs.map → resolve-DOhVEvty.mjs.map} +1 -1
- package/dist/{runner-BsI18UgP.mjs → runner-BiDvq5dv.mjs} +1404 -235
- package/dist/runner-BiDvq5dv.mjs.map +1 -0
- package/dist/{runner-CHdkERbt.d.mts → runner-CgQbELYC.d.mts} +2 -2
- package/dist/{runner-CHdkERbt.d.mts.map → runner-CgQbELYC.d.mts.map} +1 -1
- package/dist/runtime.d.mts +11 -11
- package/dist/runtime.mjs +5 -4
- package/dist/runtime.mjs.map +1 -1
- package/dist/{schema-eqZhkR0S.mjs → schema-BFyTg38T.mjs} +3 -3
- package/dist/{schema-eqZhkR0S.mjs.map → schema-BFyTg38T.mjs.map} +1 -1
- package/dist/schema-CeQSNwB3.mjs +390 -0
- package/dist/schema-CeQSNwB3.mjs.map +1 -0
- package/dist/{scopes-Be2d8bSb.mjs → scopes-BVeuhGBE.mjs} +3 -3
- package/dist/{scopes-Be2d8bSb.mjs.map → scopes-BVeuhGBE.mjs.map} +1 -1
- package/dist/{search-CeO678cp.mjs → search-BpuPKZb0.mjs} +26 -16
- package/dist/search-BpuPKZb0.mjs.map +1 -0
- package/dist/{secrets-870d-7yA.mjs → secrets-dtYs2hDo.mjs} +5 -5
- package/dist/{secrets-870d-7yA.mjs.map → secrets-dtYs2hDo.mjs.map} +1 -1
- package/dist/{sections-DSuEfirn.mjs → sections-COctk6hf.mjs} +3 -3
- package/dist/{sections-DSuEfirn.mjs.map → sections-COctk6hf.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +28 -26
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.mjs +20 -19
- package/dist/seo/index.mjs.map +1 -1
- package/dist/{seo-C3GDfT0V.mjs → seo-AFpVvTqr.mjs} +6 -4
- package/dist/seo-AFpVvTqr.mjs.map +1 -0
- package/dist/{seo-BAPKiED8.mjs → seo-CvDxfvFb.mjs} +3 -3
- package/dist/{seo-BAPKiED8.mjs.map → seo-CvDxfvFb.mjs.map} +1 -1
- package/dist/{service-DyFT-k-R.mjs → service-xMiMSTsR.mjs} +4 -4
- package/dist/{service-DyFT-k-R.mjs.map → service-xMiMSTsR.mjs.map} +1 -1
- package/dist/{session-user-BrK2zz7S.mjs → session-user-BzVemLkw.mjs} +2 -2
- package/dist/{session-user-BrK2zz7S.mjs.map → session-user-BzVemLkw.mjs.map} +1 -1
- package/dist/{settings-DgKouY2S.mjs → settings-B372MV0p.mjs} +7 -7
- package/dist/{settings-DgKouY2S.mjs.map → settings-B372MV0p.mjs.map} +1 -1
- package/dist/{settings-CREKyj8I.mjs → settings-BE9aqn_9.mjs} +3 -3
- package/dist/{settings-CREKyj8I.mjs.map → settings-BE9aqn_9.mjs.map} +1 -1
- package/dist/{setup-complete-L7bMK2VI.mjs → setup-complete-DF7TAfD5.mjs} +2 -2
- package/dist/{setup-complete-L7bMK2VI.mjs.map → setup-complete-DF7TAfD5.mjs.map} +1 -1
- package/dist/{setup-nonce-Ct5tjWcq.mjs → setup-nonce-Do-U_cg9.mjs} +1 -1
- package/dist/{setup-nonce-Ct5tjWcq.mjs.map → setup-nonce-Do-U_cg9.mjs.map} +1 -1
- package/dist/{single-flight-cache-C2exrGAi.mjs → single-flight-cache-B0eLKS6K.mjs} +2 -2
- package/dist/{single-flight-cache-C2exrGAi.mjs.map → single-flight-cache-B0eLKS6K.mjs.map} +1 -1
- package/dist/site-url-Bowsi9T-.mjs +16 -0
- package/dist/site-url-Bowsi9T-.mjs.map +1 -0
- package/dist/slugify-B994zkXC.mjs +17 -0
- package/dist/slugify-B994zkXC.mjs.map +1 -0
- package/dist/{snapshot-BdpUJKD-.mjs → snapshot-B5h6aPMh.mjs} +2 -2
- package/dist/{snapshot-BdpUJKD-.mjs.map → snapshot-B5h6aPMh.mjs.map} +1 -1
- package/dist/{ssrf-CviKqWmq.mjs → ssrf-Cpvg_n3A.mjs} +1 -1
- package/dist/{ssrf-CviKqWmq.mjs.map → ssrf-Cpvg_n3A.mjs.map} +1 -1
- package/dist/{state-xxv6ZTMv.mjs → state-DYwPue40.mjs} +1 -1
- package/dist/{state-xxv6ZTMv.mjs.map → state-DYwPue40.mjs.map} +1 -1
- package/dist/{status-COfycGIU.mjs → status-CWVYpbD8.mjs} +1 -1
- package/dist/{status-COfycGIU.mjs.map → status-CWVYpbD8.mjs.map} +1 -1
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +1 -1
- package/dist/{taxonomies-B61CRSha.mjs → taxonomies-B0o9ExNV.mjs} +85 -75
- package/dist/taxonomies-B0o9ExNV.mjs.map +1 -0
- package/dist/{taxonomies-Dbdki3Un.mjs → taxonomies-Dk3MAklL.mjs} +360 -56
- package/dist/taxonomies-Dk3MAklL.mjs.map +1 -0
- package/dist/taxonomy-CPeM8d2o.mjs +484 -0
- package/dist/taxonomy-CPeM8d2o.mjs.map +1 -0
- package/dist/{tokens-DVltpO2D.mjs → tokens-C39klX8R.mjs} +2 -2
- package/dist/{tokens-DVltpO2D.mjs.map → tokens-C39klX8R.mjs.map} +1 -1
- package/dist/{transaction-D0FOsb3X.mjs → transaction-NQj4VJ7Z.mjs} +1 -1
- package/dist/{transaction-D0FOsb3X.mjs.map → transaction-NQj4VJ7Z.mjs.map} +1 -1
- package/dist/{transport-BWQo0Foy.mjs → transport--CfOflrp.mjs} +1 -1
- package/dist/{transport-BWQo0Foy.mjs.map → transport--CfOflrp.mjs.map} +1 -1
- package/dist/{transport-DokJOScS.d.mts → transport-B_rfeU-a.d.mts} +1 -1
- package/dist/{transport-DokJOScS.d.mts.map → transport-B_rfeU-a.d.mts.map} +1 -1
- package/dist/{trusted-proxy-CwjQj0YG.mjs → trusted-proxy-CEVekpby.mjs} +1 -1
- package/dist/{trusted-proxy-CwjQj0YG.mjs.map → trusted-proxy-CEVekpby.mjs.map} +1 -1
- package/dist/{types-o7xo7VgH.mjs → types-75KIqzL9.mjs} +20 -3
- package/dist/types-75KIqzL9.mjs.map +1 -0
- package/dist/{types-C9P3ysxq.d.mts → types-BPuloofb.d.mts} +1 -1
- package/dist/{types-C9P3ysxq.d.mts.map → types-BPuloofb.d.mts.map} +1 -1
- package/dist/{types-BD40g7zz.mjs → types-BW1syrlw.mjs} +1 -1
- package/dist/{types-BD40g7zz.mjs.map → types-BW1syrlw.mjs.map} +1 -1
- package/dist/{types-jISEalTX.d.mts → types-C3_AbkDP.d.mts} +53 -10
- package/dist/types-C3_AbkDP.d.mts.map +1 -0
- package/dist/{types-84Bque3-.d.mts → types-CAGdePf3.d.mts} +133 -1
- package/dist/types-CAGdePf3.d.mts.map +1 -0
- package/dist/{types-CcSZCcF1.d.mts → types-CFUfyt1s.d.mts} +1 -1
- package/dist/{types-CcSZCcF1.d.mts.map → types-CFUfyt1s.d.mts.map} +1 -1
- package/dist/{types-DQLZ58GV.d.mts → types-CPx2lIGo.d.mts} +1 -1
- package/dist/{types-DQLZ58GV.d.mts.map → types-CPx2lIGo.d.mts.map} +1 -1
- package/dist/{types-XrQQ-Aex.mjs → types-CQPWhPxE.mjs} +15 -11
- package/dist/types-CQPWhPxE.mjs.map +1 -0
- package/dist/{types-BQY7VYw6.d.mts → types-Cs-TFLNf.d.mts} +28 -8
- package/dist/types-Cs-TFLNf.d.mts.map +1 -0
- package/dist/types-CtzytVXn.mjs +18 -0
- package/dist/types-CtzytVXn.mjs.map +1 -0
- package/dist/{types-DqZVPILm.d.mts → types-D4_1Ga4L.d.mts} +44 -5
- package/dist/types-D4_1Ga4L.d.mts.map +1 -0
- package/dist/{types-Dr2GLlwu.d.mts → types-DefV3OiO.d.mts} +1 -1
- package/dist/{types-Dr2GLlwu.d.mts.map → types-DefV3OiO.d.mts.map} +1 -1
- package/dist/{types-DsAMyD_o.d.mts → types-X0MThr7x.d.mts} +1 -1
- package/dist/{types-DsAMyD_o.d.mts.map → types-X0MThr7x.d.mts.map} +1 -1
- package/dist/{upload-attempts-C5yd6Gae.mjs → upload-attempts-hlne3iA1.mjs} +1 -1
- package/dist/{upload-attempts-C5yd6Gae.mjs.map → upload-attempts-hlne3iA1.mjs.map} +1 -1
- package/dist/url-pattern-BHS0V5Ng.mjs +33 -0
- package/dist/url-pattern-BHS0V5Ng.mjs.map +1 -0
- package/dist/{user-BAumEmpA.mjs → user-sHgJ62SP.mjs} +3 -3
- package/dist/{user-BAumEmpA.mjs.map → user-sHgJ62SP.mjs.map} +1 -1
- package/dist/{utils-BbUgmeZG.mjs → utils-D4vD_Y98.mjs} +3 -3
- package/dist/{utils-BbUgmeZG.mjs.map → utils-D4vD_Y98.mjs.map} +1 -1
- package/dist/{validate-Bs_wT2ul.mjs → validate-BkqIG_Uj.mjs} +24 -5
- package/dist/validate-BkqIG_Uj.mjs.map +1 -0
- package/dist/{validate-VPnKoIzW.mjs → validate-BpwoDOgt.mjs} +25 -2
- package/dist/validate-BpwoDOgt.mjs.map +1 -0
- package/dist/{validate-CdYcY-Ln.d.mts → validate-DeGtBN84.d.mts} +25 -7
- package/dist/validate-DeGtBN84.d.mts.map +1 -0
- package/dist/{validation-BngR0nit.mjs → validation-CiJb_X5o.mjs} +14 -13
- package/dist/{validation-BngR0nit.mjs.map → validation-CiJb_X5o.mjs.map} +1 -1
- package/dist/version-x0NjTScG.mjs +7 -0
- package/dist/{version-Bdfb34kk.mjs.map → version-x0NjTScG.mjs.map} +1 -1
- package/dist/{widgets-L-VndTKD.mjs → widgets-Cwzvww0W.mjs} +3 -3
- package/dist/{widgets-L-VndTKD.mjs.map → widgets-Cwzvww0W.mjs.map} +1 -1
- package/dist/{wxr-taxonomies-DueaLFd9.d.mts → wxr-taxonomies-CmC0ZsDr.d.mts} +1 -1
- package/dist/{wxr-taxonomies-DueaLFd9.d.mts.map → wxr-taxonomies-CmC0ZsDr.d.mts.map} +1 -1
- package/dist/{wxr-taxonomies-BexjtNid.mjs → wxr-taxonomies-QZjWxjyk.mjs} +13 -32
- package/dist/{wxr-taxonomies-BexjtNid.mjs.map → wxr-taxonomies-QZjWxjyk.mjs.map} +1 -1
- package/dist/{zod-generator-DMzfga3g.mjs → zod-generator-D11MhxG4.mjs} +53 -6
- package/dist/zod-generator-D11MhxG4.mjs.map +1 -0
- package/package.json +18 -7
- package/src/after.ts +6 -1
- package/src/api/errors.ts +13 -0
- package/src/api/handlers/content.ts +172 -33
- package/src/api/handlers/dashboard.ts +12 -2
- package/src/api/handlers/index.ts +16 -0
- package/src/api/handlers/manifest.ts +2 -0
- package/src/api/handlers/marketplace.ts +14 -0
- package/src/api/handlers/media-allowlist.ts +13 -2
- package/src/api/handlers/media-usage-work.ts +188 -0
- package/src/api/handlers/media-usage.ts +5 -3
- package/src/api/handlers/registry.ts +14 -0
- package/src/api/handlers/revision.ts +19 -5
- package/src/api/handlers/schema.ts +46 -3
- package/src/api/handlers/seo.ts +5 -2
- package/src/api/handlers/snapshot.ts +1 -1
- package/src/api/handlers/taxonomies.ts +446 -83
- package/src/api/media-usage-write-fence.ts +64 -0
- package/src/api/openapi/document.ts +247 -0
- package/src/api/public-url.ts +14 -2
- package/src/api/schemas/common.ts +3 -1
- package/src/api/schemas/content.ts +122 -1
- package/src/api/schemas/media-usage.ts +133 -0
- package/src/api/schemas/schema.ts +91 -3
- package/src/api/schemas/search.ts +2 -0
- package/src/api/schemas/taxonomies.ts +58 -8
- package/src/api/site-url.ts +16 -6
- package/src/api/types.ts +1 -0
- package/src/astro/integration/index.ts +55 -42
- package/src/astro/integration/routes.ts +48 -4
- package/src/astro/integration/runtime.ts +28 -0
- package/src/astro/integration/virtual-modules.ts +27 -1
- package/src/astro/integration/vite-config.ts +16 -1
- package/src/astro/middleware/media-usage-write-fence.ts +30 -0
- package/src/astro/middleware/redirect.ts +14 -12
- package/src/astro/middleware/scoped-db.ts +35 -4
- package/src/astro/middleware.ts +131 -30
- package/src/astro/routes/api/admin/comments/[id]/status.ts +1 -1
- package/src/astro/routes/api/admin/media-usage/collection-deletions/index.ts +22 -0
- package/src/astro/routes/api/admin/media-usage/collection-deletions/retry.ts +22 -0
- package/src/astro/routes/api/admin/media-usage/work/index.ts +26 -0
- package/src/astro/routes/api/admin/media-usage/work/retry.ts +26 -0
- package/src/astro/routes/api/admin/plugins/[id]/disable.ts +4 -0
- package/src/astro/routes/api/admin/plugins/[id]/enable.ts +4 -0
- package/src/astro/routes/api/admin/plugins/[id]/uninstall.ts +4 -0
- package/src/astro/routes/api/admin/plugins/[id]/update.ts +4 -0
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/install.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/[id]/uninstall.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/[id]/update.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/install.ts +4 -0
- package/src/astro/routes/api/admin/users/[id]/send-recovery.ts +2 -2
- package/src/astro/routes/api/auth/invite/index.ts +2 -2
- package/src/astro/routes/api/auth/magic-link/send.ts +2 -2
- package/src/astro/routes/api/auth/signup/request.ts +2 -2
- package/src/astro/routes/api/comments/[collection]/[contentId]/index.ts +1 -1
- package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +67 -31
- package/src/astro/routes/api/import/wordpress/execute.ts +3 -10
- package/src/astro/routes/api/mcp.ts +1 -0
- package/src/astro/routes/api/plugins/[pluginId]/[...path].ts +7 -1
- package/src/astro/routes/api/schema/collections/[slug]/index.ts +1 -7
- package/src/astro/routes/api/schema/collections/reorder.ts +31 -0
- package/src/astro/routes/api/schema/index.ts +2 -0
- package/src/astro/routes/api/search/enable.ts +5 -1
- package/src/astro/routes/api/search/rebuild.ts +6 -1
- package/src/astro/routes/api/taxonomies/[name]/reorder.ts +41 -0
- package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +1 -0
- package/src/astro/routes/api/taxonomies/[name]/translations.ts +48 -0
- package/src/astro/routes/api/taxonomies/[name].ts +102 -0
- package/src/astro/types.ts +31 -4
- package/src/cleanup.ts +25 -26
- package/src/cli/commands/dev.ts +13 -3
- package/src/cli/commands/doctor.ts +193 -6
- package/src/cli/commands/export-seed.ts +6 -1
- package/src/cli/index.ts +1 -1
- package/src/client/index.ts +119 -0
- package/src/components/Block.astro +12 -0
- package/src/components/CommentForm.astro +1 -1
- package/src/components/Comments.astro +1 -1
- package/src/components/InlinePortableTextEditor.tsx +260 -32
- package/src/components/OrderedList.astro +14 -0
- package/src/components/PortableText.astro +26 -4
- package/src/components/index.ts +12 -1
- package/src/components/ordered-list.ts +549 -0
- package/src/content/converters/mark-safety.ts +120 -0
- package/src/content/converters/numbered-list.ts +148 -0
- package/src/content/converters/portable-text-to-prosemirror.ts +84 -25
- package/src/content/converters/prosemirror-to-portable-text.ts +35 -14
- package/src/content/converters/types.ts +2 -0
- package/src/content/portable-text-lists.ts +205 -0
- package/src/content-list-query.ts +29 -0
- package/src/database/dialect-helpers.ts +3 -22
- package/src/database/migrations/055_content_translation_group_locale_index.ts +67 -0
- package/src/database/migrations/056_taxonomy_term_sort_order.ts +189 -0
- package/src/database/migrations/057_collection_hidden.ts +24 -0
- package/src/database/migrations/058_collection_sort_order.ts +20 -0
- package/src/database/migrations/059_revision_prune_queue.ts +36 -0
- package/src/database/migrations/060_collection_admin_config.ts +16 -0
- package/src/database/migrations/061_media_usage_cleanup.ts +77 -0
- package/src/database/migrations/062_media_usage_cleanup_fence.ts +295 -0
- package/src/database/migrations/063_media_usage_incremental_work.ts +397 -0
- package/src/database/migrations/064_fts_plain_text.ts +253 -0
- package/src/database/migrations/065_media_usage_collection_deletion.ts +85 -0
- package/src/database/migrations/066_media_usage_reconciliation.ts +115 -0
- package/src/database/migrations/067_indexed_content_fields.ts +39 -0
- package/src/database/migrations/068_content_taxonomy_entry_groups.ts +61 -0
- package/src/database/migrations/069_collection_title_date_fields.ts +45 -0
- package/src/database/migrations/070_collection_routable.ts +18 -0
- package/src/database/migrations/runner.ts +32 -0
- package/src/database/repositories/content.ts +1051 -273
- package/src/database/repositories/media-usage-work.ts +848 -0
- package/src/database/repositories/media-usage.ts +1502 -138
- package/src/database/repositories/revision.ts +98 -22
- package/src/database/repositories/taxonomy.ts +429 -103
- package/src/database/repositories/types.ts +58 -2
- package/src/database/types.ts +147 -17
- package/src/database/validate.ts +39 -0
- package/src/db/adapters.ts +36 -0
- package/src/db/index.ts +3 -0
- package/src/deferred-tasks.ts +71 -0
- package/src/emdash-runtime.ts +493 -110
- package/src/fields/file.ts +7 -4
- package/src/fields/image.ts +8 -1
- package/src/fields/types.ts +18 -5
- package/src/i18n/config.ts +32 -0
- package/src/i18n/repair-locale-casing.ts +0 -14
- package/src/i18n/taxonomy-locale-diagnostic.ts +47 -0
- package/src/import/wxr-taxonomies.ts +7 -47
- package/src/index.ts +27 -2
- package/src/loader.ts +165 -89
- package/src/mcp/server.ts +242 -34
- package/src/media/usage/activation.ts +626 -0
- package/src/media/usage/capture-triggers.ts +543 -0
- package/src/media/usage/cleanup.ts +305 -0
- package/src/media/usage/collection-deletion-processor.ts +356 -0
- package/src/media/usage/collection-deletion.ts +836 -0
- package/src/media/usage/content-fields.ts +40 -3
- package/src/media/usage/content-refresh.ts +356 -47
- package/src/media/usage/content-repair.ts +180 -61
- package/src/media/usage/content-snapshots.ts +85 -105
- package/src/media/usage/gc.ts +50 -0
- package/src/media/usage/projection-fingerprint.ts +129 -0
- package/src/media/usage/reconciliation-processor.ts +372 -0
- package/src/media/usage/reconciliation.ts +1117 -0
- package/src/media/usage/source-key.ts +4 -0
- package/src/media/usage/types.ts +2 -0
- package/src/media/usage/work-processor.ts +248 -0
- package/src/menus/index.ts +246 -141
- package/src/object-cache/index.ts +160 -3
- package/src/plugin-types.ts +8 -0
- package/src/plugins/adapt-sandbox-entry.ts +24 -5
- package/src/plugins/context.ts +24 -7
- package/src/plugins/index.ts +9 -0
- package/src/plugins/routes.ts +77 -1
- package/src/plugins/sandbox/index.ts +10 -1
- package/src/plugins/sandbox/types.ts +78 -1
- package/src/plugins/scheduler/node.ts +13 -1
- package/src/plugins/scheduler/types.ts +2 -0
- package/src/plugins/storage-indexes.ts +50 -11
- package/src/plugins/types.ts +39 -2
- package/src/query.ts +50 -79
- package/src/redirects/cache.ts +79 -19
- package/src/request-context.ts +3 -0
- package/src/scheduled-publish.ts +6 -1
- package/src/scheduler-health.ts +46 -0
- package/src/schema/registry.ts +863 -249
- package/src/schema/types.ts +74 -8
- package/src/schema/url-pattern.ts +33 -0
- package/src/schema/zod-generator.ts +77 -5
- package/src/search/fts-manager.ts +167 -86
- package/src/search/index.ts +2 -0
- package/src/search/query.ts +32 -11
- package/src/search/types.ts +8 -0
- package/src/seed/apply.ts +89 -16
- package/src/seed/types.ts +21 -3
- package/src/seed/validate.ts +52 -2
- package/src/taxonomies/index.ts +88 -82
- package/src/taxonomies/term-counts.ts +23 -12
- package/src/ui-comments.ts +19 -0
- package/src/ui.ts +11 -3
- package/src/utils/slugify.ts +1 -29
- package/src/virtual-modules.d.ts +24 -0
- package/dist/adapters-C0ONzkUP.d.mts.map +0 -1
- package/dist/after-B1IIdH3Y.mjs +0 -29
- package/dist/after-B1IIdH3Y.mjs.map +0 -1
- package/dist/api-DgPbMlng.mjs.map +0 -1
- package/dist/apply-1_6ra7NP.mjs.map +0 -1
- package/dist/cache-B26cufFd.mjs +0 -65
- package/dist/cache-B26cufFd.mjs.map +0 -1
- package/dist/config-DyF3OKg_.mjs.map +0 -1
- package/dist/content-CpfKV9QE.mjs.map +0 -1
- package/dist/content-refresh-DgqUBeTv.mjs +0 -1629
- package/dist/content-refresh-DgqUBeTv.mjs.map +0 -1
- package/dist/context-kO4YZB03.mjs.map +0 -1
- package/dist/dashboard-DoBwPnON.mjs.map +0 -1
- package/dist/dialect-helpers-DFwyWjTM.mjs.map +0 -1
- package/dist/errors-DtEXIQQV.mjs.map +0 -1
- package/dist/fts-manager-vncsZIJm.mjs.map +0 -1
- package/dist/index-BeNto_Vs.d.mts.map +0 -1
- package/dist/index-j9rTh3cp.d.mts.map +0 -1
- package/dist/loader-C1XOLV5b.mjs.map +0 -1
- package/dist/media-DWIzoVFL.mjs.map +0 -1
- package/dist/media-allowlist-B7TPD6aq.mjs.map +0 -1
- package/dist/media-usage-DPJcNaAq.mjs.map +0 -1
- package/dist/menus-C6qhqP4X.mjs.map +0 -1
- package/dist/object-cache-Bok5j2ae.mjs.map +0 -1
- package/dist/options-aeIs8WFu.d.mts.map +0 -1
- package/dist/public-url-DSGTnJFw.mjs.map +0 -1
- package/dist/query-DCiXI7OZ.mjs.map +0 -1
- package/dist/redirects-BOn2DIUs.mjs.map +0 -1
- package/dist/registry-BP1JK2xh.mjs +0 -795
- package/dist/registry-BP1JK2xh.mjs.map +0 -1
- package/dist/relations-DHFQGX0h.d.mts.map +0 -1
- package/dist/runner-BsI18UgP.mjs.map +0 -1
- package/dist/search-CeO678cp.mjs.map +0 -1
- package/dist/seo-C3GDfT0V.mjs.map +0 -1
- package/dist/site-url-8N3kSyVZ.mjs +0 -13
- package/dist/site-url-8N3kSyVZ.mjs.map +0 -1
- package/dist/slugify-C_tqlU4G.mjs +0 -30
- package/dist/slugify-C_tqlU4G.mjs.map +0 -1
- package/dist/taxonomies-B61CRSha.mjs.map +0 -1
- package/dist/taxonomies-Dbdki3Un.mjs.map +0 -1
- package/dist/taxonomy-DvwWAPvA.mjs +0 -304
- package/dist/taxonomy-DvwWAPvA.mjs.map +0 -1
- package/dist/types-84Bque3-.d.mts.map +0 -1
- package/dist/types-BQY7VYw6.d.mts.map +0 -1
- package/dist/types-DqZVPILm.d.mts.map +0 -1
- package/dist/types-XrQQ-Aex.mjs.map +0 -1
- package/dist/types-jISEalTX.d.mts.map +0 -1
- package/dist/types-o7xo7VgH.mjs.map +0 -1
- package/dist/validate-Bs_wT2ul.mjs.map +0 -1
- package/dist/validate-CdYcY-Ln.d.mts.map +0 -1
- package/dist/validate-VPnKoIzW.mjs.map +0 -1
- package/dist/version-Bdfb34kk.mjs +0 -7
- package/dist/zod-generator-DMzfga3g.mjs.map +0 -1
- /package/dist/{api-tokens-CEsW_jCg.mjs → api-tokens-CyTsLszZ.mjs} +0 -0
- /package/dist/{ssrf-BB__xfNM.mjs → ssrf-DpXgKsna.mjs} +0 -0
- /package/dist/{types-CK0LxPUQ.mjs → types-CP1CflWf.mjs} +0 -0
package/src/seed/apply.ts
CHANGED
|
@@ -30,6 +30,7 @@ import type {
|
|
|
30
30
|
SeedFile,
|
|
31
31
|
SeedApplyOptions,
|
|
32
32
|
SeedApplyResult,
|
|
33
|
+
SeedCollection,
|
|
33
34
|
SeedTaxonomyTerm,
|
|
34
35
|
SeedMenuItem,
|
|
35
36
|
SeedWidget,
|
|
@@ -37,6 +38,21 @@ import type {
|
|
|
37
38
|
SeedBylineAvatar,
|
|
38
39
|
} from "./types.js";
|
|
39
40
|
|
|
41
|
+
/**
|
|
42
|
+
* Set a collection's `titleField`/`dateField`: a separate write run after the
|
|
43
|
+
* fields exist, so `updateCollection` can validate them. No-op when neither is set.
|
|
44
|
+
*/
|
|
45
|
+
async function applyDisplayDateFields(
|
|
46
|
+
registry: SchemaRegistry,
|
|
47
|
+
collection: SeedCollection,
|
|
48
|
+
): Promise<void> {
|
|
49
|
+
if (collection.titleField === undefined && collection.dateField === undefined) return;
|
|
50
|
+
await registry.updateCollection(collection.slug, {
|
|
51
|
+
titleField: collection.titleField,
|
|
52
|
+
dateField: collection.dateField,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
40
56
|
const FILE_EXTENSION_PATTERN = /\.([a-z0-9]+)(?:\?|$)/i;
|
|
41
57
|
import { validateSeed } from "./validate.js";
|
|
42
58
|
|
|
@@ -177,8 +193,12 @@ export async function applySeed(
|
|
|
177
193
|
labelSingular: collection.labelSingular,
|
|
178
194
|
description: collection.description,
|
|
179
195
|
icon: collection.icon,
|
|
196
|
+
admin: collection.admin,
|
|
180
197
|
supports: collection.supports || [],
|
|
181
198
|
urlPattern: collection.urlPattern,
|
|
199
|
+
routable: collection.routable,
|
|
200
|
+
hidden: collection.hidden,
|
|
201
|
+
sortOrder: collection.sortOrder,
|
|
182
202
|
commentsEnabled: collection.commentsEnabled,
|
|
183
203
|
});
|
|
184
204
|
result.collections.updated++;
|
|
@@ -193,6 +213,7 @@ export async function applySeed(
|
|
|
193
213
|
required: field.required || false,
|
|
194
214
|
unique: field.unique || false,
|
|
195
215
|
searchable: field.searchable || false,
|
|
216
|
+
indexed: field.indexed || false,
|
|
196
217
|
defaultValue: field.defaultValue,
|
|
197
218
|
validation: field.validation,
|
|
198
219
|
widget: field.widget,
|
|
@@ -207,6 +228,7 @@ export async function applySeed(
|
|
|
207
228
|
required: field.required || false,
|
|
208
229
|
unique: field.unique || false,
|
|
209
230
|
searchable: field.searchable || false,
|
|
231
|
+
indexed: field.indexed || false,
|
|
210
232
|
defaultValue: field.defaultValue,
|
|
211
233
|
validation: field.validation,
|
|
212
234
|
widget: field.widget,
|
|
@@ -215,6 +237,9 @@ export async function applySeed(
|
|
|
215
237
|
result.fields.created++;
|
|
216
238
|
}
|
|
217
239
|
}
|
|
240
|
+
|
|
241
|
+
// Second write: display/date fields, now that fields exist.
|
|
242
|
+
await applyDisplayDateFields(registry, collection);
|
|
218
243
|
continue;
|
|
219
244
|
}
|
|
220
245
|
|
|
@@ -231,6 +256,7 @@ export async function applySeed(
|
|
|
231
256
|
required: field.required || false,
|
|
232
257
|
unique: field.unique || false,
|
|
233
258
|
searchable: field.searchable || false,
|
|
259
|
+
indexed: field.indexed || false,
|
|
234
260
|
defaultValue: field.defaultValue,
|
|
235
261
|
validation: field.validation,
|
|
236
262
|
widget: field.widget,
|
|
@@ -245,12 +271,19 @@ export async function applySeed(
|
|
|
245
271
|
labelSingular: collection.labelSingular,
|
|
246
272
|
description: collection.description,
|
|
247
273
|
icon: collection.icon,
|
|
274
|
+
admin: collection.admin,
|
|
248
275
|
supports: collection.supports || [],
|
|
249
276
|
urlPattern: collection.urlPattern,
|
|
277
|
+
routable: collection.routable,
|
|
278
|
+
hidden: collection.hidden,
|
|
279
|
+
sortOrder: collection.sortOrder,
|
|
250
280
|
commentsEnabled: collection.commentsEnabled,
|
|
251
281
|
},
|
|
252
282
|
fields,
|
|
253
283
|
);
|
|
284
|
+
// titleField/dateField reference existing fields, so set them after
|
|
285
|
+
// the schema exists.
|
|
286
|
+
await applyDisplayDateFields(registry, collection);
|
|
254
287
|
result.collections.created++;
|
|
255
288
|
result.fields.created += fields.length;
|
|
256
289
|
}
|
|
@@ -456,23 +489,31 @@ export async function applySeed(
|
|
|
456
489
|
// 7. Content (created before menus so refs can resolve)
|
|
457
490
|
if (includeContent && seed.content) {
|
|
458
491
|
const contentRepo = new ContentRepository(db);
|
|
492
|
+
const schemaRegistry = new SchemaRegistry(db);
|
|
459
493
|
|
|
460
494
|
try {
|
|
461
495
|
// Create content entries
|
|
462
496
|
for (const [collectionSlug, entries] of Object.entries(seed.content)) {
|
|
497
|
+
const collectionRoutable =
|
|
498
|
+
(await schemaRegistry.getCollection(collectionSlug))?.routable !== false;
|
|
463
499
|
for (const entry of entries) {
|
|
500
|
+
const entrySlug =
|
|
501
|
+
typeof entry.slug === "string" && entry.slug.trim().length > 0 ? entry.slug : null;
|
|
464
502
|
// Resolve the entry's locale up front so a non-`en` single-locale
|
|
465
503
|
// export (which omits `locale`) is filed under the project default
|
|
466
504
|
// rather than `en` (#1421).
|
|
467
505
|
const entryLocale = resolveConfiguredLocale(entry.locale ?? defaultLocale);
|
|
468
506
|
|
|
469
|
-
//
|
|
470
|
-
|
|
507
|
+
// Slugful entries use the existing locale-aware key. Slugless seed
|
|
508
|
+
// entries persist their seed ID, which keeps re-application idempotent.
|
|
509
|
+
const existing = entrySlug
|
|
510
|
+
? await contentRepo.findBySlug(collectionSlug, entrySlug, entryLocale)
|
|
511
|
+
: await contentRepo.findById(collectionSlug, entry.id);
|
|
471
512
|
|
|
472
513
|
if (existing) {
|
|
473
514
|
if (onConflict === "error") {
|
|
474
515
|
throw new Error(
|
|
475
|
-
`Conflict: content "${entry.
|
|
516
|
+
`Conflict: content "${entrySlug ?? entry.id}" in "${collectionSlug}" already exists`,
|
|
476
517
|
);
|
|
477
518
|
}
|
|
478
519
|
|
|
@@ -523,8 +564,32 @@ export async function applySeed(
|
|
|
523
564
|
entryId: existing.id,
|
|
524
565
|
data: resolvedData,
|
|
525
566
|
});
|
|
526
|
-
|
|
527
|
-
|
|
567
|
+
try {
|
|
568
|
+
await trxContentRepo.setDraftRevision(collectionSlug, existing.id, draft.id);
|
|
569
|
+
await trxContentRepo.publish(
|
|
570
|
+
collectionSlug,
|
|
571
|
+
existing.id,
|
|
572
|
+
undefined,
|
|
573
|
+
false,
|
|
574
|
+
undefined,
|
|
575
|
+
true,
|
|
576
|
+
collectionRoutable,
|
|
577
|
+
);
|
|
578
|
+
} catch (error) {
|
|
579
|
+
try {
|
|
580
|
+
await trxRevisionRepo.deleteIfUnreferenced(
|
|
581
|
+
collectionSlug,
|
|
582
|
+
existing.id,
|
|
583
|
+
draft.id,
|
|
584
|
+
);
|
|
585
|
+
} catch (cleanupError) {
|
|
586
|
+
console.error(
|
|
587
|
+
`[seed] Failed to clean up unstaged revision ${draft.id}:`,
|
|
588
|
+
cleanupError,
|
|
589
|
+
);
|
|
590
|
+
}
|
|
591
|
+
throw error;
|
|
592
|
+
}
|
|
528
593
|
}
|
|
529
594
|
});
|
|
530
595
|
} catch (error) {
|
|
@@ -570,8 +635,9 @@ export async function applySeed(
|
|
|
570
635
|
const trxBylineRepo = new BylineRepository(trx);
|
|
571
636
|
|
|
572
637
|
const item = await trxContentRepo.create({
|
|
638
|
+
...(entrySlug ? {} : { id: entry.id }),
|
|
573
639
|
type: collectionSlug,
|
|
574
|
-
slug:
|
|
640
|
+
slug: entrySlug,
|
|
575
641
|
status,
|
|
576
642
|
data: resolvedData,
|
|
577
643
|
locale: entryLocale,
|
|
@@ -593,7 +659,15 @@ export async function applySeed(
|
|
|
593
659
|
// revision so the admin UI shows "Unpublish" instead of "Save & Publish"
|
|
594
660
|
// and `live_revision_id` is populated for downstream queries.
|
|
595
661
|
if (status === "published") {
|
|
596
|
-
await trxContentRepo.publish(
|
|
662
|
+
await trxContentRepo.publish(
|
|
663
|
+
collectionSlug,
|
|
664
|
+
item.id,
|
|
665
|
+
undefined,
|
|
666
|
+
false,
|
|
667
|
+
undefined,
|
|
668
|
+
true,
|
|
669
|
+
collectionRoutable,
|
|
670
|
+
);
|
|
597
671
|
}
|
|
598
672
|
|
|
599
673
|
return item;
|
|
@@ -941,7 +1015,11 @@ async function applyContentBylines(
|
|
|
941
1015
|
bylineRepo: BylineRepository,
|
|
942
1016
|
collectionSlug: string,
|
|
943
1017
|
contentId: string,
|
|
944
|
-
entry: {
|
|
1018
|
+
entry: {
|
|
1019
|
+
id: string;
|
|
1020
|
+
slug?: string | null;
|
|
1021
|
+
bylines?: Array<{ byline: string; roleLabel?: string }>;
|
|
1022
|
+
},
|
|
945
1023
|
seedBylineIdMap: Map<string, string>,
|
|
946
1024
|
isUpdate = false,
|
|
947
1025
|
): Promise<void> {
|
|
@@ -966,7 +1044,7 @@ async function applyContentBylines(
|
|
|
966
1044
|
|
|
967
1045
|
if (credits.length !== entry.bylines.length) {
|
|
968
1046
|
console.warn(
|
|
969
|
-
`content.${collectionSlug}.${entry.slug}: one or more byline refs could not be resolved`,
|
|
1047
|
+
`content.${collectionSlug}.${entry.slug ?? entry.id}: one or more byline refs could not be resolved`,
|
|
970
1048
|
);
|
|
971
1049
|
}
|
|
972
1050
|
|
|
@@ -989,13 +1067,10 @@ async function applyContentTaxonomies(
|
|
|
989
1067
|
entry: { taxonomies?: Record<string, string[]> },
|
|
990
1068
|
isUpdate: boolean,
|
|
991
1069
|
): Promise<void> {
|
|
1070
|
+
const termRepo = new TaxonomyRepository(db);
|
|
992
1071
|
// In update mode, clear existing taxonomy assignments first
|
|
993
1072
|
if (isUpdate) {
|
|
994
|
-
await
|
|
995
|
-
.deleteFrom("content_taxonomies")
|
|
996
|
-
.where("collection", "=", collectionSlug)
|
|
997
|
-
.where("entry_id", "=", contentId)
|
|
998
|
-
.execute();
|
|
1073
|
+
await termRepo.clearEntryTerms(collectionSlug, contentId);
|
|
999
1074
|
}
|
|
1000
1075
|
|
|
1001
1076
|
if (!entry.taxonomies) {
|
|
@@ -1009,8 +1084,6 @@ async function applyContentTaxonomies(
|
|
|
1009
1084
|
}
|
|
1010
1085
|
|
|
1011
1086
|
for (const [taxonomyName, termSlugs] of Object.entries(entry.taxonomies)) {
|
|
1012
|
-
const termRepo = new TaxonomyRepository(db);
|
|
1013
|
-
|
|
1014
1087
|
for (const termSlug of termSlugs) {
|
|
1015
1088
|
const term = await termRepo.findBySlug(taxonomyName, termSlug);
|
|
1016
1089
|
if (term) {
|
package/src/seed/types.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* collections, fields, menus, settings, taxonomies, redirects, widget areas, and optional sample content.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import type { FieldType } from "../schema/types.js";
|
|
8
|
+
import type { CollectionAdminConfig, FieldType } from "../schema/types.js";
|
|
9
9
|
import type { SiteSettings } from "../settings/types.js";
|
|
10
10
|
import type { Storage } from "../storage/types.js";
|
|
11
11
|
|
|
@@ -72,10 +72,27 @@ export interface SeedCollection {
|
|
|
72
72
|
labelSingular?: string;
|
|
73
73
|
description?: string;
|
|
74
74
|
icon?: string;
|
|
75
|
+
admin?: CollectionAdminConfig;
|
|
75
76
|
supports?: ("drafts" | "revisions" | "preview" | "scheduling" | "search" | "seo")[];
|
|
76
77
|
urlPattern?: string;
|
|
78
|
+
/** Require a slug before an entry can be published. Defaults to true. */
|
|
79
|
+
routable?: boolean;
|
|
80
|
+
/**
|
|
81
|
+
* Omit this collection from the admin sidebar. It stays reachable through
|
|
82
|
+
* the API, MCP, plugin hooks, and direct `/content/:collection` URLs.
|
|
83
|
+
*/
|
|
84
|
+
hidden?: boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Explicit position in the admin sidebar (ascending). Collections without
|
|
87
|
+
* a `sortOrder` keep the alphabetical order and follow the ordered ones.
|
|
88
|
+
*/
|
|
89
|
+
sortOrder?: number;
|
|
77
90
|
/** Enable comments on this collection */
|
|
78
91
|
commentsEnabled?: boolean;
|
|
92
|
+
/** Field slug powering the admin list Title column (defaults to title display) */
|
|
93
|
+
titleField?: string;
|
|
94
|
+
/** Field slug (a datetime field) powering the admin list Date column (defaults to last-updated) */
|
|
95
|
+
dateField?: string;
|
|
79
96
|
fields: SeedField[];
|
|
80
97
|
}
|
|
81
98
|
|
|
@@ -89,6 +106,7 @@ export interface SeedField {
|
|
|
89
106
|
required?: boolean;
|
|
90
107
|
unique?: boolean;
|
|
91
108
|
searchable?: boolean;
|
|
109
|
+
indexed?: boolean;
|
|
92
110
|
defaultValue?: unknown;
|
|
93
111
|
validation?: Record<string, unknown>;
|
|
94
112
|
widget?: string;
|
|
@@ -253,8 +271,8 @@ export interface SeedContentEntry {
|
|
|
253
271
|
/** Seed-local ID for $ref resolution */
|
|
254
272
|
id: string;
|
|
255
273
|
|
|
256
|
-
/** URL slug */
|
|
257
|
-
slug
|
|
274
|
+
/** URL slug. May be omitted for entries in non-routable collections. */
|
|
275
|
+
slug?: string | null;
|
|
258
276
|
|
|
259
277
|
/** Publication status */
|
|
260
278
|
status?: "published" | "draft";
|
package/src/seed/validate.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { getI18nConfig, resolveConfiguredLocale } from "../i18n/config.js";
|
|
8
|
-
import { FIELD_TYPES } from "../schema/types.js";
|
|
8
|
+
import { FIELD_TYPES, isIndexableFieldType, MAX_COLLECTION_LIST_COLUMNS } from "../schema/types.js";
|
|
9
9
|
import type { SeedFile, SeedMenuItem, ValidationResult } from "./types.js";
|
|
10
10
|
|
|
11
11
|
const COLLECTION_FIELD_SLUG_PATTERN = /^[a-z][a-z0-9_]*$/;
|
|
@@ -107,6 +107,43 @@ export function validateSeed(data: unknown): ValidationResult {
|
|
|
107
107
|
if (!collection.label) {
|
|
108
108
|
errors.push(`${prefix}: label is required`);
|
|
109
109
|
}
|
|
110
|
+
if (collection.routable !== undefined && typeof collection.routable !== "boolean") {
|
|
111
|
+
errors.push(`${prefix}.routable: must be a boolean`);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const declaredFieldSlugs = new Set(
|
|
115
|
+
Array.isArray(collection.fields)
|
|
116
|
+
? collection.fields.flatMap((field) =>
|
|
117
|
+
isRecord(field) && typeof field.slug === "string" ? [field.slug] : [],
|
|
118
|
+
)
|
|
119
|
+
: [],
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
if (collection.admin !== undefined) {
|
|
123
|
+
if (!isRecord(collection.admin)) {
|
|
124
|
+
errors.push(`${prefix}.admin: must be an object`);
|
|
125
|
+
} else if (collection.admin.listColumns !== undefined) {
|
|
126
|
+
if (!Array.isArray(collection.admin.listColumns)) {
|
|
127
|
+
errors.push(`${prefix}.admin.listColumns: must be an array`);
|
|
128
|
+
} else {
|
|
129
|
+
if (collection.admin.listColumns.length > MAX_COLLECTION_LIST_COLUMNS) {
|
|
130
|
+
errors.push(
|
|
131
|
+
`${prefix}.admin.listColumns: must contain at most ${MAX_COLLECTION_LIST_COLUMNS} items`,
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
for (let j = 0; j < collection.admin.listColumns.length; j++) {
|
|
135
|
+
const slug = collection.admin.listColumns[j];
|
|
136
|
+
if (typeof slug !== "string" || !COLLECTION_FIELD_SLUG_PATTERN.test(slug)) {
|
|
137
|
+
errors.push(`${prefix}.admin.listColumns[${j}]: must be a valid field slug`);
|
|
138
|
+
} else if (!declaredFieldSlugs.has(slug)) {
|
|
139
|
+
errors.push(
|
|
140
|
+
`${prefix}.admin.listColumns[${j}]: references unknown field "${slug}"`,
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
110
147
|
|
|
111
148
|
// Validate fields
|
|
112
149
|
if (!Array.isArray(collection.fields)) {
|
|
@@ -141,10 +178,16 @@ export function validateSeed(data: unknown): ValidationResult {
|
|
|
141
178
|
errors.push(`${fieldPrefix}: label is required`);
|
|
142
179
|
}
|
|
143
180
|
|
|
181
|
+
if (field.indexed !== undefined && typeof field.indexed !== "boolean") {
|
|
182
|
+
errors.push(`${fieldPrefix}.indexed: must be a boolean`);
|
|
183
|
+
}
|
|
184
|
+
|
|
144
185
|
if (!field.type) {
|
|
145
186
|
errors.push(`${fieldPrefix}: type is required`);
|
|
146
187
|
} else if (!(FIELD_TYPES as readonly string[]).includes(field.type)) {
|
|
147
188
|
errors.push(`${fieldPrefix}.type: unsupported field type "${field.type}"`);
|
|
189
|
+
} else if (field.indexed === true && !isIndexableFieldType(field.type)) {
|
|
190
|
+
errors.push(`${fieldPrefix}.indexed: type "${field.type}" cannot be indexed`);
|
|
148
191
|
}
|
|
149
192
|
}
|
|
150
193
|
}
|
|
@@ -550,6 +593,9 @@ export function validateSeed(data: unknown): ValidationResult {
|
|
|
550
593
|
errors.push(`content.${collectionSlug}: must be an array`);
|
|
551
594
|
continue;
|
|
552
595
|
}
|
|
596
|
+
const collectionRoutable =
|
|
597
|
+
seed.collections?.find((collection) => collection.slug === collectionSlug)?.routable !==
|
|
598
|
+
false;
|
|
553
599
|
|
|
554
600
|
const entryIds = new Set<string>();
|
|
555
601
|
|
|
@@ -569,7 +615,11 @@ export function validateSeed(data: unknown): ValidationResult {
|
|
|
569
615
|
entryIds.add(entry.id);
|
|
570
616
|
}
|
|
571
617
|
|
|
572
|
-
|
|
618
|
+
const hasSlug = typeof entry.slug === "string" && entry.slug.trim().length > 0;
|
|
619
|
+
if (entry.slug !== undefined && entry.slug !== null && typeof entry.slug !== "string") {
|
|
620
|
+
errors.push(`${prefix}.slug: must be a string`);
|
|
621
|
+
}
|
|
622
|
+
if (collectionRoutable && !hasSlug) {
|
|
573
623
|
errors.push(`${prefix}: slug is required`);
|
|
574
624
|
}
|
|
575
625
|
|
package/src/taxonomies/index.ts
CHANGED
|
@@ -6,17 +6,21 @@
|
|
|
6
6
|
* `i18n/resolve.ts`).
|
|
7
7
|
*
|
|
8
8
|
* Because `content_taxonomies.taxonomy_id` stores the translation_group (not a
|
|
9
|
-
* specific term id),
|
|
10
|
-
*
|
|
11
|
-
* the right per-locale term.
|
|
9
|
+
* specific term id), and `entry_id` stores the content translation_group, one
|
|
10
|
+
* assignment resolves to the requested locale on both sides.
|
|
12
11
|
*/
|
|
13
12
|
|
|
13
|
+
import { sql, type Kysely } from "kysely";
|
|
14
|
+
|
|
15
|
+
import type { Database } from "../database/types.js";
|
|
16
|
+
import { validateIdentifier } from "../database/validate.js";
|
|
17
|
+
import { getI18nConfig } from "../i18n/config.js";
|
|
14
18
|
import { resolveLocale, resolveLocaleChain } from "../i18n/resolve.js";
|
|
15
19
|
import { getDb, resetTaxonomyNamesCache } from "../loader.js";
|
|
16
20
|
import {
|
|
17
21
|
cachedQuery,
|
|
18
22
|
CacheNamespace,
|
|
19
|
-
|
|
23
|
+
contentCacheNamespaces,
|
|
20
24
|
invalidateTaxonomyObjectCache,
|
|
21
25
|
isObjectCacheActive,
|
|
22
26
|
} from "../object-cache/index.js";
|
|
@@ -40,6 +44,55 @@ export interface TaxonomyTermsOptions extends TaxonomyQueryOptions {
|
|
|
40
44
|
includeCounts?: boolean;
|
|
41
45
|
}
|
|
42
46
|
|
|
47
|
+
interface EntryTermRow {
|
|
48
|
+
entry_id: string;
|
|
49
|
+
id: string;
|
|
50
|
+
name: string;
|
|
51
|
+
slug: string;
|
|
52
|
+
label: string;
|
|
53
|
+
parent_id: string | null;
|
|
54
|
+
locale: string;
|
|
55
|
+
translation_group: string | null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async function selectEntryTermRows(
|
|
59
|
+
db: Kysely<Database>,
|
|
60
|
+
collection: string,
|
|
61
|
+
entryIds: string[],
|
|
62
|
+
taxonomyName?: string,
|
|
63
|
+
locale?: string,
|
|
64
|
+
): Promise<EntryTermRow[]> {
|
|
65
|
+
validateIdentifier(collection, "collection slug");
|
|
66
|
+
const tableName = `ec_${collection}`;
|
|
67
|
+
const preferredLocale = locale ? sql`${locale}` : sql`content.locale`;
|
|
68
|
+
const defaultLocale = getI18nConfig()?.defaultLocale ?? "en";
|
|
69
|
+
const result = await sql<EntryTermRow>`
|
|
70
|
+
SELECT content.id AS entry_id,
|
|
71
|
+
coalesce(exact_term.id, default_term.id) AS id,
|
|
72
|
+
coalesce(exact_term.name, default_term.name) AS name,
|
|
73
|
+
coalesce(exact_term.slug, default_term.slug) AS slug,
|
|
74
|
+
coalesce(exact_term.label, default_term.label) AS label,
|
|
75
|
+
coalesce(exact_term.parent_id, default_term.parent_id) AS parent_id,
|
|
76
|
+
coalesce(exact_term.locale, default_term.locale) AS locale,
|
|
77
|
+
coalesce(exact_term.translation_group, default_term.translation_group) AS translation_group
|
|
78
|
+
FROM ${sql.ref(tableName)} AS content
|
|
79
|
+
INNER JOIN content_taxonomies AS pivot
|
|
80
|
+
ON pivot.entry_id = content.translation_group
|
|
81
|
+
AND pivot.collection = ${collection}
|
|
82
|
+
LEFT JOIN taxonomies AS exact_term
|
|
83
|
+
ON exact_term.translation_group = pivot.taxonomy_id
|
|
84
|
+
AND exact_term.locale = ${preferredLocale}
|
|
85
|
+
LEFT JOIN taxonomies AS default_term
|
|
86
|
+
ON default_term.translation_group = pivot.taxonomy_id
|
|
87
|
+
AND default_term.locale = ${defaultLocale}
|
|
88
|
+
WHERE content.id IN (${sql.join(entryIds.map((id) => sql`${id}`))})
|
|
89
|
+
AND coalesce(exact_term.id, default_term.id) IS NOT NULL
|
|
90
|
+
${taxonomyName ? sql`AND coalesce(exact_term.name, default_term.name) = ${taxonomyName}` : sql``}
|
|
91
|
+
ORDER BY coalesce(exact_term.label, default_term.label) ASC
|
|
92
|
+
`.execute(db);
|
|
93
|
+
return result.rows;
|
|
94
|
+
}
|
|
95
|
+
|
|
43
96
|
/** Invalidate cached taxonomy term data and any content that hydrates terms. */
|
|
44
97
|
export function invalidateTermCache(): void {
|
|
45
98
|
invalidateTaxonomyObjectCache();
|
|
@@ -51,10 +104,9 @@ export function invalidateTermCache(): void {
|
|
|
51
104
|
* Taxonomy *definitions* (the "category"/"tag" taxonomies themselves, not
|
|
52
105
|
* their terms) are read on every public render that hydrates entry terms —
|
|
53
106
|
* `getAllTermsForEntries` → `getCollectionTaxonomyNames` → `getTaxonomyDefs` —
|
|
54
|
-
* but change extremely rarely: they're
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
* to once-per-isolate.
|
|
107
|
+
* but change extremely rarely: they're written only by the admin API and by
|
|
108
|
+
* seed application. Caching them across the isolate lifetime drops the
|
|
109
|
+
* per-render `SELECT * FROM _emdash_taxonomy_defs` to once-per-isolate.
|
|
58
110
|
*
|
|
59
111
|
* Stored on globalThis behind a Symbol key (same pattern as
|
|
60
112
|
* `settings/index.ts`) so the bundler duplicating this module across SSR
|
|
@@ -89,8 +141,8 @@ const defsHolder: TaxonomyDefsHolder =
|
|
|
89
141
|
/**
|
|
90
142
|
* Invalidate the isolate-wide taxonomy-definitions cache (and the related
|
|
91
143
|
* loader taxonomy-names cache). Called from every taxonomy-def write path
|
|
92
|
-
* (`handleTaxonomyCreate`, seed application). Other isolates
|
|
93
|
-
* next recycle — staleness bounded by isolate lifetime.
|
|
144
|
+
* (`handleTaxonomyCreate`/`Update`/`Delete`, seed application). Other isolates
|
|
145
|
+
* refresh on their next recycle — staleness bounded by isolate lifetime.
|
|
94
146
|
*/
|
|
95
147
|
export function invalidateTaxonomyDefsCache(): void {
|
|
96
148
|
defsHolder.version++;
|
|
@@ -228,12 +280,14 @@ export async function getTaxonomyDef(
|
|
|
228
280
|
* Object-cache namespaces for values that embed visible term counts: the
|
|
229
281
|
* taxonomy epoch (term/assignment writes) plus each counted collection's
|
|
230
282
|
* content epoch, so publishing, unpublishing, or trashing an entry
|
|
231
|
-
* invalidates the cached count promptly.
|
|
232
|
-
*
|
|
233
|
-
* cache entry's TTL.
|
|
283
|
+
* invalidates the cached count promptly. Both content namespace generations
|
|
284
|
+
* participate so rolling deployments preserve invalidation in either direction.
|
|
234
285
|
*/
|
|
235
286
|
function termCountNamespaces(collections: string[]): string[] {
|
|
236
|
-
return [
|
|
287
|
+
return [
|
|
288
|
+
...[...new Set(collections)].flatMap((collection) => contentCacheNamespaces(collection)),
|
|
289
|
+
CacheNamespace.TAXONOMIES,
|
|
290
|
+
];
|
|
237
291
|
}
|
|
238
292
|
|
|
239
293
|
/**
|
|
@@ -259,7 +313,7 @@ export async function getTaxonomyTerms(
|
|
|
259
313
|
// The two are independent, so run them concurrently to save a round trip.
|
|
260
314
|
const [terms, counts] = await Promise.all([
|
|
261
315
|
getTermList(def, locale),
|
|
262
|
-
getVisibleTermCounts(def.name, def.collections),
|
|
316
|
+
getVisibleTermCounts(def.name, def.collections, locale),
|
|
263
317
|
]);
|
|
264
318
|
return withCounts(terms, counts);
|
|
265
319
|
}
|
|
@@ -299,6 +353,7 @@ async function loadTaxonomyTerms(
|
|
|
299
353
|
.selectFrom("taxonomies")
|
|
300
354
|
.selectAll()
|
|
301
355
|
.where("name", "=", def.name)
|
|
356
|
+
.orderBy("sort_order", "asc")
|
|
302
357
|
.orderBy("label", "asc");
|
|
303
358
|
if (locale !== undefined) termsQuery = termsQuery.where("locale", "=", locale);
|
|
304
359
|
|
|
@@ -331,28 +386,30 @@ async function loadTaxonomyTerms(
|
|
|
331
386
|
|
|
332
387
|
/**
|
|
333
388
|
* Per-translation-group visible-usage counts for one taxonomy, in a single
|
|
334
|
-
* round-trip (see `fetchVisibleTermCounts`).
|
|
335
|
-
*
|
|
336
|
-
*
|
|
337
|
-
*
|
|
389
|
+
* round-trip (see `fetchVisibleTermCounts`). The pivot identity is the
|
|
390
|
+
* translation group, while entry rows are scoped to the resolved locale.
|
|
391
|
+
* Request and object cache keys include that locale so translated views never
|
|
392
|
+
* reuse each other's visible counts.
|
|
338
393
|
*/
|
|
339
394
|
function getVisibleTermCounts(
|
|
340
395
|
taxonomyName: string,
|
|
341
396
|
collections: string[],
|
|
397
|
+
locale?: string,
|
|
342
398
|
): Promise<Map<string, number>> {
|
|
343
399
|
// The collection scope is part of the key: per-locale rows of the same def
|
|
344
400
|
// can drift in their declared collections, and a caller may pass a narrower
|
|
345
401
|
// scope. Identical inputs (the widget + term-page hot path) still share one
|
|
346
402
|
// entry.
|
|
347
403
|
const scope = [...new Set(collections)].toSorted().join(",");
|
|
348
|
-
|
|
404
|
+
const localeScope = locale ?? "*";
|
|
405
|
+
return requestCached(`taxonomy-term-counts:${taxonomyName}:${scope}:${localeScope}`, async () => {
|
|
349
406
|
// A Map is not JSON-representable — cache the entries, rebuild on read.
|
|
350
407
|
const entries = await cachedQuery({
|
|
351
408
|
namespace: termCountNamespaces(collections),
|
|
352
|
-
key: `termCounts:${taxonomyName}:${scope}`,
|
|
409
|
+
key: `termCounts:${taxonomyName}:${scope}:${localeScope}`,
|
|
353
410
|
load: async (): Promise<Array<[string, number]>> => {
|
|
354
411
|
const db = await getDb();
|
|
355
|
-
return [...(await fetchVisibleTermCounts(db, taxonomyName, collections))];
|
|
412
|
+
return [...(await fetchVisibleTermCounts(db, taxonomyName, collections, locale))];
|
|
356
413
|
},
|
|
357
414
|
});
|
|
358
415
|
return new Map(entries);
|
|
@@ -417,6 +474,7 @@ async function loadTerm(
|
|
|
417
474
|
// Children store the parent's translation_group in parent_id (not a row
|
|
418
475
|
// id), so a translated parent still owns its children in its own locale.
|
|
419
476
|
.where("parent_id", "=", row.translation_group ?? row.id)
|
|
477
|
+
.orderBy("sort_order", "asc")
|
|
420
478
|
.orderBy("label", "asc");
|
|
421
479
|
const termLocale = row.locale;
|
|
422
480
|
if (termLocale) childrenQuery = childrenQuery.where("locale", "=", termLocale);
|
|
@@ -426,7 +484,7 @@ async function loadTerm(
|
|
|
426
484
|
// databases. The counts map is request-cached per taxonomy — on a page
|
|
427
485
|
// that also renders the taxonomy widget it's a free Map lookup.
|
|
428
486
|
const [counts, childRows] = await Promise.all([
|
|
429
|
-
getVisibleTermCounts(taxonomyName, collections),
|
|
487
|
+
getVisibleTermCounts(taxonomyName, collections, chain[0] ?? row.locale),
|
|
430
488
|
childrenQuery.execute(),
|
|
431
489
|
]);
|
|
432
490
|
const count = counts.get(row.translation_group ?? row.id) ?? 0;
|
|
@@ -457,8 +515,8 @@ async function loadTerm(
|
|
|
457
515
|
}
|
|
458
516
|
|
|
459
517
|
/**
|
|
460
|
-
* Terms assigned to a content entry, resolved into the active locale
|
|
461
|
-
*
|
|
518
|
+
* Terms assigned to a content entry, resolved into the active locale and then
|
|
519
|
+
* the configured default locale.
|
|
462
520
|
*/
|
|
463
521
|
export function getEntryTerms(
|
|
464
522
|
collection: string,
|
|
@@ -475,26 +533,11 @@ export function getEntryTerms(
|
|
|
475
533
|
`terms:${collection}:${entryId}:${taxonomyName ?? "*"}:${locale ?? "*"}`,
|
|
476
534
|
() =>
|
|
477
535
|
cachedQuery({
|
|
478
|
-
namespace: [
|
|
536
|
+
namespace: [...contentCacheNamespaces(collection), CacheNamespace.TAXONOMIES],
|
|
479
537
|
key: `entryTerms:${collection}:${entryId}:${taxonomyName ?? "*"}:${locale ?? "*"}`,
|
|
480
538
|
load: async () => {
|
|
481
539
|
const db = await getDb();
|
|
482
|
-
|
|
483
|
-
let query = db
|
|
484
|
-
.selectFrom("content_taxonomies")
|
|
485
|
-
.innerJoin(
|
|
486
|
-
"taxonomies",
|
|
487
|
-
"taxonomies.translation_group",
|
|
488
|
-
"content_taxonomies.taxonomy_id",
|
|
489
|
-
)
|
|
490
|
-
.selectAll("taxonomies")
|
|
491
|
-
.where("content_taxonomies.collection", "=", collection)
|
|
492
|
-
.where("content_taxonomies.entry_id", "=", entryId);
|
|
493
|
-
|
|
494
|
-
if (taxonomyName) query = query.where("taxonomies.name", "=", taxonomyName);
|
|
495
|
-
if (locale !== undefined) query = query.where("taxonomies.locale", "=", locale);
|
|
496
|
-
|
|
497
|
-
const rows = await query.execute();
|
|
540
|
+
const rows = await selectEntryTermRows(db, collection, [entryId], taxonomyName, locale);
|
|
498
541
|
return rows.map<TaxonomyTerm>((row) => ({
|
|
499
542
|
id: row.id,
|
|
500
543
|
name: row.name,
|
|
@@ -579,27 +622,7 @@ export async function getTermsForEntries(
|
|
|
579
622
|
for (const chunk of chunks(missedIds, SQL_BATCH_SIZE)) {
|
|
580
623
|
let rows;
|
|
581
624
|
try {
|
|
582
|
-
|
|
583
|
-
.selectFrom("content_taxonomies")
|
|
584
|
-
.innerJoin("taxonomies", "taxonomies.translation_group", "content_taxonomies.taxonomy_id")
|
|
585
|
-
.select([
|
|
586
|
-
"content_taxonomies.entry_id",
|
|
587
|
-
"taxonomies.id",
|
|
588
|
-
"taxonomies.name",
|
|
589
|
-
"taxonomies.slug",
|
|
590
|
-
"taxonomies.label",
|
|
591
|
-
"taxonomies.parent_id",
|
|
592
|
-
"taxonomies.locale",
|
|
593
|
-
"taxonomies.translation_group",
|
|
594
|
-
])
|
|
595
|
-
.where("content_taxonomies.collection", "=", collection)
|
|
596
|
-
.where("content_taxonomies.entry_id", "in", chunk)
|
|
597
|
-
.where("taxonomies.name", "=", taxonomyName)
|
|
598
|
-
// Match the order getAllTermsForEntries (the cache primer) uses, so
|
|
599
|
-
// cache-hit and DB-miss entries in one result are ordered consistently.
|
|
600
|
-
.orderBy("taxonomies.label", "asc");
|
|
601
|
-
if (locale !== undefined) query = query.where("taxonomies.locale", "=", locale);
|
|
602
|
-
rows = await query.execute();
|
|
625
|
+
rows = await selectEntryTermRows(db, collection, chunk, taxonomyName, locale);
|
|
603
626
|
} catch (error) {
|
|
604
627
|
if (isMissingTableError(error)) return [...result.entries()];
|
|
605
628
|
throw error;
|
|
@@ -631,7 +654,7 @@ export async function getTermsForEntries(
|
|
|
631
654
|
const pairs =
|
|
632
655
|
idKey.length <= 256
|
|
633
656
|
? await cachedQuery({
|
|
634
|
-
namespace: [
|
|
657
|
+
namespace: [...contentCacheNamespaces(collection), CacheNamespace.TAXONOMIES],
|
|
635
658
|
key: `termsForEntries:${collection}:${taxonomyName}:${locale ?? "*"}:${idKey}`,
|
|
636
659
|
load,
|
|
637
660
|
})
|
|
@@ -661,24 +684,7 @@ export async function getAllTermsForEntries(
|
|
|
661
684
|
for (const chunk of chunks(uniqueIds, SQL_BATCH_SIZE)) {
|
|
662
685
|
let rows;
|
|
663
686
|
try {
|
|
664
|
-
|
|
665
|
-
.selectFrom("content_taxonomies")
|
|
666
|
-
.innerJoin("taxonomies", "taxonomies.translation_group", "content_taxonomies.taxonomy_id")
|
|
667
|
-
.select([
|
|
668
|
-
"content_taxonomies.entry_id",
|
|
669
|
-
"taxonomies.id",
|
|
670
|
-
"taxonomies.name",
|
|
671
|
-
"taxonomies.slug",
|
|
672
|
-
"taxonomies.label",
|
|
673
|
-
"taxonomies.parent_id",
|
|
674
|
-
"taxonomies.locale",
|
|
675
|
-
"taxonomies.translation_group",
|
|
676
|
-
])
|
|
677
|
-
.where("content_taxonomies.collection", "=", collection)
|
|
678
|
-
.where("content_taxonomies.entry_id", "in", chunk)
|
|
679
|
-
.orderBy("taxonomies.label", "asc");
|
|
680
|
-
if (locale !== undefined) query = query.where("taxonomies.locale", "=", locale);
|
|
681
|
-
rows = await query.execute();
|
|
687
|
+
rows = await selectEntryTermRows(db, collection, chunk, undefined, locale);
|
|
682
688
|
} catch (error) {
|
|
683
689
|
if (isMissingTableError(error)) {
|
|
684
690
|
for (const id of uniqueIds) {
|