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
|
@@ -48,10 +48,13 @@ import {
|
|
|
48
48
|
RESOLVED_VIRTUAL_SCHEDULER_ID,
|
|
49
49
|
VIRTUAL_ENV_ID,
|
|
50
50
|
RESOLVED_VIRTUAL_ENV_ID,
|
|
51
|
+
VIRTUAL_BUILD_ID,
|
|
52
|
+
RESOLVED_VIRTUAL_BUILD_ID,
|
|
51
53
|
generateSeedModule,
|
|
52
54
|
generateWaitUntilModule,
|
|
53
55
|
generateSchedulerModule,
|
|
54
56
|
generateEnvModule,
|
|
57
|
+
generateBuildModule,
|
|
55
58
|
generateConfigModule,
|
|
56
59
|
generateDialectModule,
|
|
57
60
|
generateStorageModule,
|
|
@@ -179,6 +182,11 @@ export function createVirtualModulesPlugin(
|
|
|
179
182
|
|
|
180
183
|
let viteCommand: "build" | "serve" | undefined;
|
|
181
184
|
|
|
185
|
+
// Captured once per plugin instance rather than inside load(): Vite may load
|
|
186
|
+
// the module more than once (client and server passes, dev reloads), and a
|
|
187
|
+
// validator that moved between those loads would invalidate at random.
|
|
188
|
+
const buildTime = Date.now();
|
|
189
|
+
|
|
182
190
|
return {
|
|
183
191
|
name: "emdash-virtual-modules",
|
|
184
192
|
configResolved(config) {
|
|
@@ -233,6 +241,9 @@ export function createVirtualModulesPlugin(
|
|
|
233
241
|
if (id === VIRTUAL_ENV_ID) {
|
|
234
242
|
return RESOLVED_VIRTUAL_ENV_ID;
|
|
235
243
|
}
|
|
244
|
+
if (id === VIRTUAL_BUILD_ID) {
|
|
245
|
+
return RESOLVED_VIRTUAL_BUILD_ID;
|
|
246
|
+
}
|
|
236
247
|
},
|
|
237
248
|
load(id: string) {
|
|
238
249
|
if (id === RESOLVED_VIRTUAL_CONFIG_ID) {
|
|
@@ -246,6 +257,8 @@ export function createVirtualModulesPlugin(
|
|
|
246
257
|
type: resolvedConfig.database?.type,
|
|
247
258
|
supportsRequestScope: resolvedConfig.database?.supportsRequestScope ?? false,
|
|
248
259
|
supportsCoalescing: resolvedConfig.database?.supportsCoalescing ?? false,
|
|
260
|
+
supportsCollectionDeletionGuard:
|
|
261
|
+
resolvedConfig.database?.supportsCollectionDeletionGuard ?? false,
|
|
249
262
|
});
|
|
250
263
|
}
|
|
251
264
|
// Generate a module that statically imports the configured storage
|
|
@@ -333,6 +346,9 @@ export function createVirtualModulesPlugin(
|
|
|
333
346
|
if (id === RESOLVED_VIRTUAL_ENV_ID) {
|
|
334
347
|
return generateEnvModule(astroConfig.adapter?.name);
|
|
335
348
|
}
|
|
349
|
+
if (id === RESOLVED_VIRTUAL_BUILD_ID) {
|
|
350
|
+
return generateBuildModule(buildTime);
|
|
351
|
+
}
|
|
336
352
|
},
|
|
337
353
|
};
|
|
338
354
|
}
|
|
@@ -478,7 +494,6 @@ export function createViteConfig(
|
|
|
478
494
|
"emdash > @unpic/placeholder",
|
|
479
495
|
"emdash > blurhash",
|
|
480
496
|
"emdash > croner",
|
|
481
|
-
"emdash > image-size",
|
|
482
497
|
"emdash > jose",
|
|
483
498
|
"emdash > jpeg-js",
|
|
484
499
|
"emdash > kysely",
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { defineMiddleware } from "astro:middleware";
|
|
2
|
+
|
|
3
|
+
import { checkMediaUsageActivationWriteFence } from "#api/media-usage-write-fence.js";
|
|
4
|
+
|
|
5
|
+
const FENCED_WRITE_PATHS = [
|
|
6
|
+
"/_emdash/api/content",
|
|
7
|
+
"/_emdash/api/schema",
|
|
8
|
+
"/_emdash/api/admin/media-usage/repair",
|
|
9
|
+
"/_emdash/api/revisions",
|
|
10
|
+
"/_emdash/api/import",
|
|
11
|
+
"/_emdash/api/mcp",
|
|
12
|
+
] as const;
|
|
13
|
+
|
|
14
|
+
const SAFE_METHODS = new Set(["GET", "HEAD", "OPTIONS"]);
|
|
15
|
+
|
|
16
|
+
export const onRequest = defineMiddleware(async (context, next) => {
|
|
17
|
+
if (!isFencedWriteRequest(context.request.method, context.url.pathname)) return next();
|
|
18
|
+
const db = context.locals.emdash?.db;
|
|
19
|
+
if (!db) return next();
|
|
20
|
+
return (await checkMediaUsageActivationWriteFence(db)) ?? next();
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
function isFencedWriteRequest(method: string, pathname: string): boolean {
|
|
24
|
+
if (SAFE_METHODS.has(method.toUpperCase())) return false;
|
|
25
|
+
return FENCED_WRITE_PATHS.some(
|
|
26
|
+
(prefix) => pathname === prefix || pathname.startsWith(`${prefix}/`),
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export default onRequest;
|
|
@@ -18,11 +18,7 @@ import { defineMiddleware } from "astro:middleware";
|
|
|
18
18
|
|
|
19
19
|
import { RedirectRepository } from "../../database/repositories/redirect.js";
|
|
20
20
|
import { getDb } from "../../loader.js";
|
|
21
|
-
import {
|
|
22
|
-
getCachedRedirects,
|
|
23
|
-
matchCachedPatterns,
|
|
24
|
-
setCachedRedirects,
|
|
25
|
-
} from "../../redirects/cache.js";
|
|
21
|
+
import { loadCachedRedirects, matchCachedPatterns } from "../../redirects/cache.js";
|
|
26
22
|
import { isTerminalStatus } from "../../redirects/status.js";
|
|
27
23
|
|
|
28
24
|
/** Paths that should never be intercepted by redirects */
|
|
@@ -68,11 +64,7 @@ export const onRequest = defineMiddleware(async (context, next) => {
|
|
|
68
64
|
// One query loads both exact and pattern rules into the cache; warm
|
|
69
65
|
// requests issue zero queries. Empty-redirect sites cache an empty
|
|
70
66
|
// Map + array, so the next request returns immediately without probing.
|
|
71
|
-
|
|
72
|
-
if (!cached) {
|
|
73
|
-
const all = await repo.findAllEnabled();
|
|
74
|
-
cached = setCachedRedirects(all);
|
|
75
|
-
}
|
|
67
|
+
const cached = await loadCachedRedirects(() => repo.findAllEnabled());
|
|
76
68
|
|
|
77
69
|
// 1. Exact match (O(1) Map lookup)
|
|
78
70
|
let exact = cached.exact.get(pathname);
|
|
@@ -112,8 +104,18 @@ export const onRequest = defineMiddleware(async (context, next) => {
|
|
|
112
104
|
// No redirect matched -- proceed and check for 404
|
|
113
105
|
const response = await next();
|
|
114
106
|
|
|
115
|
-
// Log
|
|
116
|
-
|
|
107
|
+
// Log misses (fire-and-forget) under the path the visitor requested.
|
|
108
|
+
// Two shapes count as a miss: an unmatched route rendering the error
|
|
109
|
+
// page with status 404, and a matched route answering a content miss
|
|
110
|
+
// with a redirect to /404 (the documented template pattern) — there the
|
|
111
|
+
// missed path exists only on this first pass, before the browser
|
|
112
|
+
// follows the redirect. The error page itself is never logged: /404
|
|
113
|
+
// answers 404 by design and carries no path information.
|
|
114
|
+
const location = response.headers.get("location");
|
|
115
|
+
const missedByRedirect =
|
|
116
|
+
isRedirectCode(response.status) && (location === "/404" || location === "/404/");
|
|
117
|
+
const missedDirectly = response.status === 404 && pathname !== "/404" && pathname !== "/404/";
|
|
118
|
+
if (missedDirectly || missedByRedirect) {
|
|
117
119
|
const referrer = context.request.headers.get("referer") ?? null;
|
|
118
120
|
const userAgent = context.request.headers.get("user-agent") ?? null;
|
|
119
121
|
repo
|
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
* request-scoped db adapter's lifecycle around the response.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
+
import { createDeferredTaskTracker } from "../../deferred-tasks.js";
|
|
10
|
+
import type { DeferredTaskTracker } from "../../deferred-tasks.js";
|
|
11
|
+
|
|
9
12
|
/**
|
|
10
13
|
* Astro attaches AstroCookies to outgoing responses via a well-known global
|
|
11
14
|
* symbol. Cloning a Response (`new Response(body, init)`) drops non-header
|
|
@@ -16,6 +19,34 @@
|
|
|
16
19
|
*/
|
|
17
20
|
export const ASTRO_COOKIES_SYMBOL = Symbol.for("astro.cookies");
|
|
18
21
|
|
|
22
|
+
interface ScopedDbLifecycle {
|
|
23
|
+
commit: () => void;
|
|
24
|
+
close?: () => void;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Hold the real adapter close behind both response and deferred-task completion. */
|
|
28
|
+
export function coordinateScopedDbLifecycle(scoped: ScopedDbLifecycle): {
|
|
29
|
+
closed?: Promise<void>;
|
|
30
|
+
deferredTasks?: DeferredTaskTracker;
|
|
31
|
+
lifecycle: ScopedDbLifecycle;
|
|
32
|
+
} {
|
|
33
|
+
if (!scoped.close) return { lifecycle: scoped };
|
|
34
|
+
|
|
35
|
+
const close = scoped.close;
|
|
36
|
+
const deferredTasks = createDeferredTaskTracker(() => {
|
|
37
|
+
try {
|
|
38
|
+
close();
|
|
39
|
+
} catch (error) {
|
|
40
|
+
console.error("[emdash] request-scoped db close failed:", error);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
return {
|
|
44
|
+
closed: deferredTasks.settled,
|
|
45
|
+
deferredTasks,
|
|
46
|
+
lifecycle: { commit: scoped.commit, close: deferredTasks.settle },
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
19
50
|
/**
|
|
20
51
|
* Run a request-scoped db's `close()` once the response body has finished
|
|
21
52
|
* streaming. Astro streams HTML and components issue DB queries during that
|
|
@@ -62,9 +93,9 @@ export function wrapResponseForScopedClose(response: Response, close: () => void
|
|
|
62
93
|
* Run the request body under a request-scoped db, then settle its lifecycle:
|
|
63
94
|
* `commit()` runs before the response is returned (so per-request state like a
|
|
64
95
|
* D1 bookmark cookie is persisted in the headers, even if render throws), while
|
|
65
|
-
* `close()` (if any) is deferred to
|
|
66
|
-
* isn't torn down mid-render. On error
|
|
67
|
-
* before rethrowing so it never leaks.
|
|
96
|
+
* `close()` (if any) is deferred to lifecycle settlement so a
|
|
97
|
+
* connection-backed adapter isn't torn down mid-render or mid-task. On error
|
|
98
|
+
* the lifecycle is settled before rethrowing so it never leaks.
|
|
68
99
|
*
|
|
69
100
|
* On the error path both `commit()` and `close()` are defended: a throw from
|
|
70
101
|
* either is logged and swallowed so it can't replace the propagating render
|
|
@@ -77,7 +108,7 @@ export function wrapResponseForScopedClose(response: Response, close: () => void
|
|
|
77
108
|
* or mask.
|
|
78
109
|
*/
|
|
79
110
|
export async function finishScoped(
|
|
80
|
-
scoped:
|
|
111
|
+
scoped: ScopedDbLifecycle,
|
|
81
112
|
run: () => Promise<Response>,
|
|
82
113
|
): Promise<Response> {
|
|
83
114
|
let response: Response;
|
package/src/astro/middleware.ts
CHANGED
|
@@ -5,10 +5,13 @@
|
|
|
5
5
|
* All heavy lifting happens in EmDashRuntime.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import type { APIContext } from "astro";
|
|
8
9
|
import { defineMiddleware } from "astro:middleware";
|
|
9
10
|
import type { Kysely } from "kysely";
|
|
10
11
|
// Import from virtual modules (populated by integration at build time)
|
|
11
12
|
// @ts-ignore - virtual module
|
|
13
|
+
import { buildTime as virtualBuildTime } from "virtual:emdash/build";
|
|
14
|
+
// @ts-ignore - virtual module
|
|
12
15
|
import virtualConfig from "virtual:emdash/config";
|
|
13
16
|
// @ts-ignore - virtual module
|
|
14
17
|
import {
|
|
@@ -36,9 +39,11 @@ import {
|
|
|
36
39
|
flushRecorder,
|
|
37
40
|
isInstrumentationEnabled,
|
|
38
41
|
} from "../database/instrumentation.js";
|
|
42
|
+
import { createDeferredTaskTracker } from "../deferred-tasks.js";
|
|
39
43
|
import {
|
|
40
44
|
DB_INIT_DEADLINE_MS,
|
|
41
45
|
EmDashRuntime,
|
|
46
|
+
type MediaUsageMaintenanceResult,
|
|
42
47
|
type RuntimeDependencies,
|
|
43
48
|
type SandboxedPluginEntry,
|
|
44
49
|
type MediaProviderEntry,
|
|
@@ -47,6 +52,7 @@ import {
|
|
|
47
52
|
import { setI18nConfig } from "../i18n/config.js";
|
|
48
53
|
import type { Database, Storage } from "../index.js";
|
|
49
54
|
import { createPublicMediaUrlResolver } from "../media/url.js";
|
|
55
|
+
import { getLastContentWriteAt } from "../object-cache/index.js";
|
|
50
56
|
import type { SandboxRunnerFactory } from "../plugins/sandbox/types.js";
|
|
51
57
|
import type { ResolvedPlugin } from "../plugins/types.js";
|
|
52
58
|
import { invalidateUrlPatternCache } from "../query.js";
|
|
@@ -60,7 +66,11 @@ import type { PublishedRef } from "../scheduled-publish.js";
|
|
|
60
66
|
import { isMissingTableError } from "../utils/db-errors.js";
|
|
61
67
|
import { createInitLock, type InitLock, initWithLock } from "../utils/init-lock.js";
|
|
62
68
|
import type { EmDashConfig } from "./integration/runtime.js";
|
|
63
|
-
import {
|
|
69
|
+
import {
|
|
70
|
+
ASTRO_COOKIES_SYMBOL,
|
|
71
|
+
coordinateScopedDbLifecycle,
|
|
72
|
+
finishScoped,
|
|
73
|
+
} from "./middleware/scoped-db.js";
|
|
64
74
|
import { wrapBodyForStreamMetrics } from "./middleware/stream-end-metrics.js";
|
|
65
75
|
import { prefetchLayoutData } from "./prefetch.js";
|
|
66
76
|
import { createPublicPluginApiRouteHandler } from "./public-plugin-api-routes.js";
|
|
@@ -279,6 +289,12 @@ export async function runScheduledTasks(
|
|
|
279
289
|
return runOutsideRequest(config, (runtime) => runtime.runScheduledTasks(options));
|
|
280
290
|
}
|
|
281
291
|
|
|
292
|
+
export async function runScheduledMediaUsageTasks(): Promise<MediaUsageMaintenanceResult> {
|
|
293
|
+
const config = getConfig();
|
|
294
|
+
if (!config) return { outcome: "inactive", taskClass: null, turn: null };
|
|
295
|
+
return runOutsideRequest(config, (runtime) => runtime.runScheduledMediaUsageTasks());
|
|
296
|
+
}
|
|
297
|
+
|
|
282
298
|
/**
|
|
283
299
|
* Run a callback against the EmDash runtime outside any HTTP request — from a
|
|
284
300
|
* Cloudflare Queue consumer, a `scheduled()` handler, or any other
|
|
@@ -329,57 +345,91 @@ export async function withEmDashRuntime<T>(
|
|
|
329
345
|
/**
|
|
330
346
|
* Shared plumbing for request-free entry points (`runScheduledTasks`,
|
|
331
347
|
* `withEmDashRuntime`): resolve the runtime singleton, then run the callback
|
|
332
|
-
* under an event-scoped db
|
|
348
|
+
* under an event-scoped db when the adapter needs one.
|
|
333
349
|
*
|
|
334
350
|
* Connection-backed adapters (e.g. Postgres over Hyperdrive) cannot reuse
|
|
335
351
|
* the per-isolate singleton from a platform event: its socket belongs to the
|
|
336
352
|
* request that opened it, and workerd rejects cross-event I/O. Open an
|
|
337
353
|
* event-scoped connection and run the callback under it in ALS — the
|
|
338
354
|
* runtime's db getter, the cron executor, and plugin contexts all resolve
|
|
339
|
-
* the connection from ALS — then close it
|
|
340
|
-
*
|
|
341
|
-
*
|
|
355
|
+
* the connection from ALS — then close it when required. Stateless adapters
|
|
356
|
+
* that need primary routing can return a close-less scope; adapters with no
|
|
357
|
+
* event scoping return null and keep using the singleton.
|
|
342
358
|
*/
|
|
343
359
|
async function runOutsideRequest<T>(
|
|
344
360
|
config: EmDashConfig,
|
|
345
361
|
fn: (runtime: EmDashRuntime) => Promise<T>,
|
|
346
362
|
): Promise<T> {
|
|
347
|
-
|
|
363
|
+
if (getRequestContext()) {
|
|
364
|
+
const runtime = await getRuntime(config);
|
|
365
|
+
return runOutsideRequestWithRuntime(config, runtime, fn);
|
|
366
|
+
}
|
|
348
367
|
|
|
368
|
+
const deferredTasks = createDeferredTaskTracker(() => {});
|
|
369
|
+
const context = {
|
|
370
|
+
editMode: false,
|
|
371
|
+
metrics: createRequestMetrics(performance.now()),
|
|
372
|
+
deferredTasks,
|
|
373
|
+
};
|
|
374
|
+
return runWithContext(context, async () => {
|
|
375
|
+
const runtime = await (async () => {
|
|
376
|
+
try {
|
|
377
|
+
return await getRuntime(config);
|
|
378
|
+
} finally {
|
|
379
|
+
deferredTasks.settle();
|
|
380
|
+
await deferredTasks.settled;
|
|
381
|
+
}
|
|
382
|
+
})();
|
|
383
|
+
return runOutsideRequestWithRuntime(config, runtime, fn);
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
async function runOutsideRequestWithRuntime<T>(
|
|
388
|
+
config: EmDashConfig,
|
|
389
|
+
runtime: EmDashRuntime,
|
|
390
|
+
fn: (runtime: EmDashRuntime) => Promise<T>,
|
|
391
|
+
): Promise<T> {
|
|
349
392
|
const scoped = createRequestScopedDb({
|
|
350
393
|
config: config.database?.config,
|
|
351
394
|
isAuthenticated: false,
|
|
352
395
|
// Event handlers publish, clean up, or run jobs — a write workload —
|
|
353
396
|
// so a connection-backed adapter routes them to the primary.
|
|
354
397
|
isWrite: true,
|
|
398
|
+
canUseCachedBinding: false,
|
|
355
399
|
cookies: NOOP_COOKIE_JAR,
|
|
356
400
|
url: CRON_EVENT_URL,
|
|
357
401
|
});
|
|
358
|
-
if (!scoped
|
|
359
|
-
//
|
|
360
|
-
// outside a request. Any close-less scope created above is discarded.
|
|
402
|
+
if (!scoped) {
|
|
403
|
+
// This adapter needs no event-specific routing or connection.
|
|
361
404
|
return fn(runtime);
|
|
362
405
|
}
|
|
406
|
+
const { closed, deferredTasks, lifecycle } = coordinateScopedDbLifecycle(scoped);
|
|
363
407
|
|
|
364
408
|
const parent = getRequestContext();
|
|
365
409
|
const ctx = parent
|
|
366
|
-
? { ...parent, db: scoped.db }
|
|
367
|
-
: {
|
|
410
|
+
? { ...parent, db: scoped.db, deferredTasks }
|
|
411
|
+
: {
|
|
412
|
+
editMode: false,
|
|
413
|
+
db: scoped.db,
|
|
414
|
+
metrics: createRequestMetrics(performance.now()),
|
|
415
|
+
deferredTasks,
|
|
416
|
+
};
|
|
368
417
|
try {
|
|
369
418
|
return await runWithContext(ctx, () => fn(runtime));
|
|
370
419
|
} finally {
|
|
371
420
|
// Guard both so a throw in teardown can't mask the callback result or
|
|
372
|
-
// skip
|
|
421
|
+
// skip lifecycle settlement and leak the connection.
|
|
373
422
|
try {
|
|
374
|
-
|
|
423
|
+
lifecycle.commit();
|
|
375
424
|
} catch (error) {
|
|
376
425
|
console.error("[emdash] event-scoped db commit failed:", error);
|
|
377
426
|
}
|
|
378
427
|
try {
|
|
379
|
-
|
|
428
|
+
lifecycle.close?.();
|
|
380
429
|
} catch (error) {
|
|
381
430
|
console.error("[emdash] event-scoped db close failed:", error);
|
|
382
431
|
}
|
|
432
|
+
await closed;
|
|
383
433
|
}
|
|
384
434
|
}
|
|
385
435
|
|
|
@@ -496,6 +546,34 @@ function createRequestScopedDb(
|
|
|
496
546
|
return fn(opts);
|
|
497
547
|
}
|
|
498
548
|
|
|
549
|
+
const buildDate = virtualBuildTime ? new Date(virtualBuildTime) : null;
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* Fold the build timestamp into the route cache validator.
|
|
553
|
+
*
|
|
554
|
+
* `CacheHint.lastModified` describes the content, but the response also depends
|
|
555
|
+
* on the build: `/_astro/*` names are content-hashed, and a deployment only
|
|
556
|
+
* serves its own. Without the build dimension a code-only deploy answers a
|
|
557
|
+
* returning visitor's conditional request with 304, leaving them on HTML whose
|
|
558
|
+
* assets 404.
|
|
559
|
+
*
|
|
560
|
+
* Prerendered pages are served by the host's static layer, which manages its
|
|
561
|
+
* own validators — only on-demand responses need the build dimension.
|
|
562
|
+
*
|
|
563
|
+
* Only forward moves are covered. `Last-Modified` expresses newer, not
|
|
564
|
+
* different, so after a rollback the earlier build still answers a conditional
|
|
565
|
+
* request with 304 and the browser stays on the newer build's HTML.
|
|
566
|
+
*
|
|
567
|
+
* Must run before next(): Astro keeps the later of two dates, so a route's own
|
|
568
|
+
* hint still wins when content is newer, and a route that opts out with
|
|
569
|
+
* `Astro.cache.set(false)` stays opted out — calling set() afterwards would
|
|
570
|
+
* clear that opt-out.
|
|
571
|
+
*/
|
|
572
|
+
function applyBuildValidator(context: APIContext): void {
|
|
573
|
+
if (context.isPrerendered || !buildDate || !context.cache?.enabled) return;
|
|
574
|
+
context.cache.set({ lastModified: buildDate });
|
|
575
|
+
}
|
|
576
|
+
|
|
499
577
|
export const onRequest = defineMiddleware(async (context, next) => {
|
|
500
578
|
const { request, locals, cookies } = context;
|
|
501
579
|
const url = context.url;
|
|
@@ -514,6 +592,8 @@ export const onRequest = defineMiddleware(async (context, next) => {
|
|
|
514
592
|
}
|
|
515
593
|
}
|
|
516
594
|
|
|
595
|
+
applyBuildValidator(context);
|
|
596
|
+
|
|
517
597
|
const queryRecorder = isInstrumentationEnabled()
|
|
518
598
|
? createRecorder(url.pathname, request.method, request.headers.get("x-perf-phase") ?? "default")
|
|
519
599
|
: undefined;
|
|
@@ -561,6 +641,15 @@ export const onRequest = defineMiddleware(async (context, next) => {
|
|
|
561
641
|
const hasBearerAuth = (request.headers.get("authorization") ?? "")
|
|
562
642
|
.toLowerCase()
|
|
563
643
|
.startsWith("bearer ");
|
|
644
|
+
const isWrite = request.method !== "GET" && request.method !== "HEAD";
|
|
645
|
+
const isAuthenticated = !!sessionUser || hasBearerAuth;
|
|
646
|
+
const canUseCachedBinding =
|
|
647
|
+
!isAuthenticated &&
|
|
648
|
+
!isWrite &&
|
|
649
|
+
!playgroundDb &&
|
|
650
|
+
!isEmDashRoute &&
|
|
651
|
+
!hasEditCookie &&
|
|
652
|
+
!hasPreviewToken;
|
|
564
653
|
|
|
565
654
|
if (!isEmDashRoute && !isPublicRuntimeRoute && !hasEditCookie && !hasPreviewToken) {
|
|
566
655
|
if (!sessionUser && !playgroundDb) {
|
|
@@ -647,12 +736,18 @@ export const onRequest = defineMiddleware(async (context, next) => {
|
|
|
647
736
|
// Even on the anonymous fast path we ask the adapter for a per-request
|
|
648
737
|
// scoped db. For D1 with read replication this routes anonymous reads
|
|
649
738
|
// to the nearest replica; for other adapters it's a no-op.
|
|
739
|
+
const lastContentWriteAt =
|
|
740
|
+
canUseCachedBinding && config?.database?.needsLastContentWriteAt
|
|
741
|
+
? await getLastContentWriteAt()
|
|
742
|
+
: undefined;
|
|
650
743
|
const anonScoped = createRequestScopedDb({
|
|
651
744
|
config: config?.database?.config,
|
|
652
|
-
isAuthenticated
|
|
653
|
-
isWrite
|
|
745
|
+
isAuthenticated,
|
|
746
|
+
isWrite,
|
|
747
|
+
canUseCachedBinding,
|
|
654
748
|
cookies,
|
|
655
749
|
url,
|
|
750
|
+
lastContentWriteAt,
|
|
656
751
|
});
|
|
657
752
|
const runAnon = async () => {
|
|
658
753
|
const t0 = performance.now();
|
|
@@ -666,10 +761,11 @@ export const onRequest = defineMiddleware(async (context, next) => {
|
|
|
666
761
|
return wrapBodyForStreamMetrics(finalizeResponse(response, timings));
|
|
667
762
|
};
|
|
668
763
|
if (anonScoped) {
|
|
764
|
+
const { deferredTasks, lifecycle } = coordinateScopedDbLifecycle(anonScoped);
|
|
669
765
|
const parent = getRequestContext();
|
|
670
766
|
const ctx = parent
|
|
671
|
-
? { ...parent, db: anonScoped.db }
|
|
672
|
-
: { editMode: false, db: anonScoped.db, metrics };
|
|
767
|
+
? { ...parent, db: anonScoped.db, deferredTasks }
|
|
768
|
+
: { editMode: false, db: anonScoped.db, metrics, deferredTasks };
|
|
673
769
|
// Eagerly warm site-global layout data (menus, widget areas,
|
|
674
770
|
// taxonomy terms, settings) concurrently so the layout's
|
|
675
771
|
// per-component reads overlap into ~one wall-clock round trip and
|
|
@@ -678,10 +774,8 @@ export const onRequest = defineMiddleware(async (context, next) => {
|
|
|
678
774
|
// pointless on synchronous local SQLite.
|
|
679
775
|
// - HTML navigations only -- feeds/sitemaps/JSON don't render the
|
|
680
776
|
// layout, so prefetching their chrome is pure waste.
|
|
681
|
-
// -
|
|
682
|
-
//
|
|
683
|
-
// given page doesn't render) is kept alive past the response rather
|
|
684
|
-
// than erroring on workerd as orphaned request I/O.
|
|
777
|
+
// - the work starts immediately, then after() keeps both it and the
|
|
778
|
+
// request-scoped connection alive until the response also finishes.
|
|
685
779
|
// Gate on the CLIENT'S PREFERRED type (leading media range), not a
|
|
686
780
|
// substring -- browser navigations lead with `text/html`, while feed
|
|
687
781
|
// readers lead with `application/rss+xml` etc. and only list
|
|
@@ -694,8 +788,8 @@ export const onRequest = defineMiddleware(async (context, next) => {
|
|
|
694
788
|
if (acceptsHtml) after(() => prefetchLayoutData());
|
|
695
789
|
// commit() persists per-request state (e.g. the D1 bookmark cookie)
|
|
696
790
|
// before the response is returned, even if render throws; close()
|
|
697
|
-
//
|
|
698
|
-
return finishScoped(
|
|
791
|
+
// waits for stream-end and request-owned deferred work. See finishScoped.
|
|
792
|
+
return finishScoped(lifecycle, runAnon);
|
|
699
793
|
});
|
|
700
794
|
}
|
|
701
795
|
return runAnon();
|
|
@@ -855,12 +949,18 @@ export const onRequest = defineMiddleware(async (context, next) => {
|
|
|
855
949
|
// it in ALS so the runtime's db getter and loader's getDb() pick it up,
|
|
856
950
|
// then call commit() after next() so the adapter can persist any
|
|
857
951
|
// per-request state (e.g. a D1 bookmark cookie for read-your-writes).
|
|
952
|
+
const lastContentWriteAt =
|
|
953
|
+
canUseCachedBinding && config?.database?.needsLastContentWriteAt
|
|
954
|
+
? await getLastContentWriteAt()
|
|
955
|
+
: undefined;
|
|
858
956
|
const scoped = createRequestScopedDb({
|
|
859
957
|
config: config?.database?.config,
|
|
860
|
-
isAuthenticated
|
|
861
|
-
isWrite
|
|
958
|
+
isAuthenticated,
|
|
959
|
+
isWrite,
|
|
960
|
+
canUseCachedBinding,
|
|
862
961
|
cookies: context.cookies,
|
|
863
962
|
url,
|
|
963
|
+
lastContentWriteAt,
|
|
864
964
|
});
|
|
865
965
|
|
|
866
966
|
const renderAndFinalize = async () => {
|
|
@@ -876,15 +976,16 @@ export const onRequest = defineMiddleware(async (context, next) => {
|
|
|
876
976
|
};
|
|
877
977
|
|
|
878
978
|
if (scoped) {
|
|
979
|
+
const { deferredTasks, lifecycle } = coordinateScopedDbLifecycle(scoped);
|
|
879
980
|
const parent = getRequestContext();
|
|
880
981
|
const ctx = parent
|
|
881
|
-
? { ...parent, db: scoped.db }
|
|
882
|
-
: { editMode: false, db: scoped.db, metrics };
|
|
982
|
+
? { ...parent, db: scoped.db, deferredTasks }
|
|
983
|
+
: { editMode: false, db: scoped.db, metrics, deferredTasks };
|
|
883
984
|
return runWithContext(ctx, () =>
|
|
884
985
|
// commit() persists per-request state (e.g. the D1 bookmark cookie)
|
|
885
986
|
// before the response returns, even if render throws; close()
|
|
886
|
-
//
|
|
887
|
-
finishScoped(
|
|
987
|
+
// waits for stream-end and request-owned deferred work. See finishScoped.
|
|
988
|
+
finishScoped(lifecycle, renderAndFinalize),
|
|
888
989
|
);
|
|
889
990
|
}
|
|
890
991
|
|
|
@@ -93,7 +93,7 @@ export const PUT: APIRoute = async ({ params, request, locals }) => {
|
|
|
93
93
|
// Send notification when a comment is newly approved
|
|
94
94
|
if (newStatus === "approved" && previousStatus !== "approved" && emdash.email) {
|
|
95
95
|
try {
|
|
96
|
-
const adminBaseUrl = await getSiteBaseUrl(emdash.db, request);
|
|
96
|
+
const adminBaseUrl = await getSiteBaseUrl(emdash.db, request, emdash.config);
|
|
97
97
|
const content = await lookupContentAuthor(emdash.db, updated.collection, updated.contentId);
|
|
98
98
|
if (content?.author) {
|
|
99
99
|
await sendCommentNotification({
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { APIRoute } from "astro";
|
|
2
|
+
|
|
3
|
+
import { requirePerm } from "#api/authorize.js";
|
|
4
|
+
import { requireDb, unwrapResult } from "#api/error.js";
|
|
5
|
+
import { handleMediaUsageCollectionDeletionList } from "#api/handlers/media-usage-work.js";
|
|
6
|
+
import { isParseError, parseQuery } from "#api/parse.js";
|
|
7
|
+
import { mediaUsageCollectionDeletionListQuery } from "#api/schemas.js";
|
|
8
|
+
import { requireScope } from "#auth/scopes.js";
|
|
9
|
+
|
|
10
|
+
export const prerender = false;
|
|
11
|
+
|
|
12
|
+
export const GET: APIRoute = async ({ request, locals }) => {
|
|
13
|
+
const dbErr = requireDb(locals.emdash?.db);
|
|
14
|
+
if (dbErr) return dbErr;
|
|
15
|
+
const denied = requirePerm(locals.user, "schema:manage");
|
|
16
|
+
if (denied) return denied;
|
|
17
|
+
const scopeDenied = requireScope(locals, "admin");
|
|
18
|
+
if (scopeDenied) return scopeDenied;
|
|
19
|
+
const query = parseQuery(new URL(request.url), mediaUsageCollectionDeletionListQuery);
|
|
20
|
+
if (isParseError(query)) return query;
|
|
21
|
+
return unwrapResult(await handleMediaUsageCollectionDeletionList(locals.emdash.db, query));
|
|
22
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { APIRoute } from "astro";
|
|
2
|
+
|
|
3
|
+
import { requirePerm } from "#api/authorize.js";
|
|
4
|
+
import { requireDb, unwrapResult } from "#api/error.js";
|
|
5
|
+
import { handleMediaUsageCollectionDeletionRetry } from "#api/handlers/media-usage-work.js";
|
|
6
|
+
import { isParseError, parseBody } from "#api/parse.js";
|
|
7
|
+
import { mediaUsageCollectionDeletionRetryBody } from "#api/schemas.js";
|
|
8
|
+
import { requireScope } from "#auth/scopes.js";
|
|
9
|
+
|
|
10
|
+
export const prerender = false;
|
|
11
|
+
|
|
12
|
+
export const POST: APIRoute = async ({ request, locals }) => {
|
|
13
|
+
const dbErr = requireDb(locals.emdash?.db);
|
|
14
|
+
if (dbErr) return dbErr;
|
|
15
|
+
const denied = requirePerm(locals.user, "schema:manage");
|
|
16
|
+
if (denied) return denied;
|
|
17
|
+
const scopeDenied = requireScope(locals, "admin");
|
|
18
|
+
if (scopeDenied) return scopeDenied;
|
|
19
|
+
const body = await parseBody(request, mediaUsageCollectionDeletionRetryBody);
|
|
20
|
+
if (isParseError(body)) return body;
|
|
21
|
+
return unwrapResult(await handleMediaUsageCollectionDeletionRetry(locals.emdash.db, body));
|
|
22
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { APIRoute } from "astro";
|
|
2
|
+
|
|
3
|
+
import { requirePerm } from "#api/authorize.js";
|
|
4
|
+
import { requireDb, unwrapResult } from "#api/error.js";
|
|
5
|
+
import { handleMediaUsageWorkList } from "#api/handlers/media-usage-work.js";
|
|
6
|
+
import { isParseError, parseQuery } from "#api/parse.js";
|
|
7
|
+
import { mediaUsageWorkListQuery } from "#api/schemas.js";
|
|
8
|
+
import { requireScope } from "#auth/scopes.js";
|
|
9
|
+
|
|
10
|
+
export const prerender = false;
|
|
11
|
+
|
|
12
|
+
export const GET: APIRoute = async ({ request, locals }) => {
|
|
13
|
+
const { emdash, user } = locals;
|
|
14
|
+
const dbErr = requireDb(emdash?.db);
|
|
15
|
+
if (dbErr) return dbErr;
|
|
16
|
+
|
|
17
|
+
const denied = requirePerm(user, "schema:manage");
|
|
18
|
+
if (denied) return denied;
|
|
19
|
+
const scopeDenied = requireScope(locals, "admin");
|
|
20
|
+
if (scopeDenied) return scopeDenied;
|
|
21
|
+
|
|
22
|
+
const query = parseQuery(new URL(request.url), mediaUsageWorkListQuery);
|
|
23
|
+
if (isParseError(query)) return query;
|
|
24
|
+
|
|
25
|
+
return unwrapResult(await handleMediaUsageWorkList(emdash.db, query));
|
|
26
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { APIRoute } from "astro";
|
|
2
|
+
|
|
3
|
+
import { requirePerm } from "#api/authorize.js";
|
|
4
|
+
import { requireDb, unwrapResult } from "#api/error.js";
|
|
5
|
+
import { handleMediaUsageWorkRetry } from "#api/handlers/media-usage-work.js";
|
|
6
|
+
import { isParseError, parseBody } from "#api/parse.js";
|
|
7
|
+
import { mediaUsageWorkRetryBody } from "#api/schemas.js";
|
|
8
|
+
import { requireScope } from "#auth/scopes.js";
|
|
9
|
+
|
|
10
|
+
export const prerender = false;
|
|
11
|
+
|
|
12
|
+
export const POST: APIRoute = async ({ request, locals }) => {
|
|
13
|
+
const { emdash, user } = locals;
|
|
14
|
+
const dbErr = requireDb(emdash?.db);
|
|
15
|
+
if (dbErr) return dbErr;
|
|
16
|
+
|
|
17
|
+
const denied = requirePerm(user, "schema:manage");
|
|
18
|
+
if (denied) return denied;
|
|
19
|
+
const scopeDenied = requireScope(locals, "admin");
|
|
20
|
+
if (scopeDenied) return scopeDenied;
|
|
21
|
+
|
|
22
|
+
const body = await parseBody(request, mediaUsageWorkRetryBody);
|
|
23
|
+
if (isParseError(body)) return body;
|
|
24
|
+
|
|
25
|
+
return unwrapResult(await handleMediaUsageWorkRetry(emdash.db, body));
|
|
26
|
+
};
|
|
@@ -9,6 +9,7 @@ import type { APIRoute } from "astro";
|
|
|
9
9
|
import { requirePerm } from "#api/authorize.js";
|
|
10
10
|
import { apiError, unwrapResult } from "#api/error.js";
|
|
11
11
|
import { handlePluginDisable } from "#api/index.js";
|
|
12
|
+
import { checkMediaUsageActivationWriteFence } from "#api/media-usage-write-fence.js";
|
|
12
13
|
import { setCronTasksEnabled } from "#plugins/cron.js";
|
|
13
14
|
|
|
14
15
|
export const prerender = false;
|
|
@@ -24,6 +25,9 @@ export const POST: APIRoute = async ({ params, locals }) => {
|
|
|
24
25
|
const denied = requirePerm(user, "plugins:manage");
|
|
25
26
|
if (denied) return denied;
|
|
26
27
|
|
|
28
|
+
const activationFence = await checkMediaUsageActivationWriteFence(emdash.db);
|
|
29
|
+
if (activationFence) return activationFence;
|
|
30
|
+
|
|
27
31
|
if (!id) {
|
|
28
32
|
return apiError("INVALID_REQUEST", "Plugin ID required", 400);
|
|
29
33
|
}
|