emdash 0.36.0 → 0.38.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/{activation-K0kGBWuJ.mjs → activation-DyNTe_Tl.mjs} +3 -3
- package/dist/{activation-K0kGBWuJ.mjs.map → activation-DyNTe_Tl.mjs.map} +1 -1
- package/dist/{adapters-CzL3H752.d.mts → adapters-DCEgOBXi.d.mts} +4 -2
- package/dist/{adapters-CzL3H752.d.mts.map → adapters-DCEgOBXi.d.mts.map} +1 -1
- package/dist/{allowed-origins-maylGaHv.mjs → allowed-origins-GFUVavRj.mjs} +2 -2
- package/dist/{allowed-origins-maylGaHv.mjs.map → allowed-origins-GFUVavRj.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -3
- package/dist/api/route-utils.mjs +25 -24
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +5 -5
- package/dist/api-BvxJmnFY.mjs +10094 -0
- package/dist/api-BvxJmnFY.mjs.map +1 -0
- package/dist/{api-tokens-9YrrCoE6.mjs → api-tokens-xpGqMHrC.mjs} +2 -2
- package/dist/{api-tokens-9YrrCoE6.mjs.map → api-tokens-xpGqMHrC.mjs.map} +1 -1
- package/dist/{apply-B_VMpJ2P.mjs → apply-DLmM3R7f.mjs} +26 -22
- package/dist/apply-DLmM3R7f.mjs.map +1 -0
- package/dist/artifact-fetch-P2JXVwOq.mjs +972 -0
- package/dist/artifact-fetch-P2JXVwOq.mjs.map +1 -0
- package/dist/astro/image-endpoint.mjs +2 -2
- package/dist/astro/image-endpoint.mjs.map +1 -1
- package/dist/astro/index.d.mts +12 -12
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +138 -39
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +10 -10
- package/dist/astro/middleware/auth.mjs +6 -6
- package/dist/astro/middleware/media-usage-write-fence.mjs +3 -3
- package/dist/astro/middleware/redirect.mjs +7 -5
- package/dist/astro/middleware/redirect.mjs.map +1 -1
- package/dist/astro/middleware/request-context.mjs +3 -3
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +10 -10
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +223 -232
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +6 -6
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +6 -6
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +3 -3
- package/dist/astro/routes/api/admin/api-tokens/index.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +5 -5
- package/dist/astro/routes/api/admin/api-tokens/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +4 -4
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +9 -9
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +9 -9
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +9 -9
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +17 -17
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +17 -17
- package/dist/astro/routes/api/admin/bylines/index.mjs +17 -17
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +13 -13
- package/dist/astro/routes/api/admin/comments/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/comments/bulk.mjs +10 -10
- package/dist/astro/routes/api/admin/comments/counts.mjs +5 -5
- package/dist/astro/routes/api/admin/comments/index.mjs +10 -10
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +4 -4
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
- package/dist/astro/routes/api/admin/media-usage/activation.mjs +13 -13
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +15 -15
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +15 -15
- package/dist/astro/routes/api/admin/media-usage/progress.mjs +14 -14
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +17 -17
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +15 -15
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +15 -15
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +4 -4
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +4 -4
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +59 -56
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +59 -56
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +57 -54
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +4 -4
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +57 -54
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +58 -55
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +58 -55
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +57 -54
- package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +57 -54
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +58 -55
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +57 -54
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +58 -55
- 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 +64 -57
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +18 -16
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +65 -58
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/verify.d.mts +8 -0
- package/dist/astro/routes/api/admin/plugins/registry/verify.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +96 -0
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -0
- package/dist/astro/routes/api/admin/plugins/updates.mjs +57 -54
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +57 -54
- 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 +2 -2
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +57 -54
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +1 -1
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +1 -1
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +6 -6
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +3 -3
- package/dist/astro/routes/api/admin/users/index.mjs +6 -6
- package/dist/astro/routes/api/auth/dev-bypass.mjs +3 -3
- package/dist/astro/routes/api/auth/invite/accept.mjs +1 -1
- package/dist/astro/routes/api/auth/invite/complete.mjs +11 -11
- package/dist/astro/routes/api/auth/invite/index.mjs +8 -8
- package/dist/astro/routes/api/auth/invite/register-options.mjs +10 -10
- package/dist/astro/routes/api/auth/logout.mjs +2 -2
- package/dist/astro/routes/api/auth/magic-link/send.mjs +10 -10
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +2 -2
- package/dist/astro/routes/api/auth/me.mjs +7 -7
- package/dist/astro/routes/api/auth/mode.mjs +2 -2
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +4 -4
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +6 -6
- package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
- package/dist/astro/routes/api/auth/passkey/options.mjs +12 -12
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +10 -10
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +11 -11
- package/dist/astro/routes/api/auth/passkey/verify.mjs +11 -11
- package/dist/astro/routes/api/auth/signup/complete.mjs +11 -11
- package/dist/astro/routes/api/auth/signup/request.mjs +10 -10
- package/dist/astro/routes/api/auth/signup/verify.mjs +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +14 -14
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +13 -13
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +19 -5
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/lock.d.mts +10 -0
- package/dist/astro/routes/api/content/_collection_/_id_/lock.d.mts.map +1 -0
- package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +66 -0
- package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs.map +1 -0
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +11 -11
- package/dist/astro/routes/api/content/_collection_/_id_/publish.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +18 -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 +20 -18
- 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 +20 -18
- 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 +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +15 -8
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +16 -15
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +19 -5
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +23 -11
- package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/index.mjs +14 -9
- package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/trash.mjs +7 -7
- package/dist/astro/routes/api/dashboard.mjs +8 -8
- package/dist/astro/routes/api/dev/emails.mjs +2 -2
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +18 -18
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +3 -3
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/execute.mjs +15 -14
- 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 +11 -11
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +10 -10
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +13 -13
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +18 -18
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +29 -28
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
- package/dist/astro/routes/api/manifest.mjs +4 -4
- package/dist/astro/routes/api/manifest.mjs.map +1 -1
- package/dist/astro/routes/api/mcp.mjs +213 -74
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +11 -11
- package/dist/astro/routes/api/media/_id_/replace.d.mts +8 -0
- package/dist/astro/routes/api/media/_id_/replace.d.mts.map +1 -0
- package/dist/astro/routes/api/media/_id_/replace.mjs +91 -0
- package/dist/astro/routes/api/media/_id_/replace.mjs.map +1 -0
- package/dist/astro/routes/api/media/_id_/upload.mjs +6 -6
- package/dist/astro/routes/api/media/_id_/usage.mjs +19 -19
- package/dist/astro/routes/api/media/_id_.mjs +18 -18
- package/dist/astro/routes/api/media/file/_...key_.d.mts.map +1 -1
- package/dist/astro/routes/api/media/file/_...key_.mjs +3 -2
- package/dist/astro/routes/api/media/file/_...key_.mjs.map +1 -1
- package/dist/astro/routes/api/media/folders/_id_.mjs +8 -8
- package/dist/astro/routes/api/media/folders/index.mjs +8 -8
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
- package/dist/astro/routes/api/media/providers/index.mjs +2 -2
- package/dist/astro/routes/api/media/upload-url.mjs +16 -14
- package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
- package/dist/astro/routes/api/media.d.mts.map +1 -1
- package/dist/astro/routes/api/media.mjs +53 -30
- package/dist/astro/routes/api/media.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +20 -13
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items.mjs +15 -11
- package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/reorder.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +15 -11
- package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/translations.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/translations.mjs +16 -12
- package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_.mjs +21 -14
- package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/index.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/index.mjs +15 -11
- package/dist/astro/routes/api/menus/index.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/authorize.mjs +5 -5
- package/dist/astro/routes/api/oauth/device/code.mjs +8 -8
- package/dist/astro/routes/api/oauth/device/token.mjs +7 -7
- package/dist/astro/routes/api/oauth/register.mjs +2 -2
- package/dist/astro/routes/api/oauth/token/refresh.mjs +5 -5
- package/dist/astro/routes/api/oauth/token/revoke.mjs +5 -5
- package/dist/astro/routes/api/oauth/token.mjs +5 -5
- package/dist/astro/routes/api/openapi.json.mjs +184 -52
- package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +4 -4
- package/dist/astro/routes/api/redirects/404s/index.mjs +12 -11
- package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/summary.mjs +12 -11
- package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/_id_.mjs +13 -12
- package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/index.mjs +13 -12
- package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/index.mjs +20 -18
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/translations.mjs +15 -13
- package/dist/astro/routes/api/relations/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/relations/index.mjs +20 -18
- package/dist/astro/routes/api/relations/index.mjs.map +1 -1
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +2 -2
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +3 -3
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +57 -54
- 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 +57 -54
- 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 +57 -54
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +57 -54
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +57 -54
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/reorder.mjs +57 -54
- package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +13 -11
- package/dist/astro/routes/api/schema/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +57 -54
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +57 -54
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +12 -11
- package/dist/astro/routes/api/search/enable.mjs.map +1 -1
- package/dist/astro/routes/api/search/index.mjs +11 -10
- package/dist/astro/routes/api/search/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/rebuild.mjs +12 -11
- package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
- package/dist/astro/routes/api/search/stats.mjs +7 -6
- package/dist/astro/routes/api/search/stats.mjs.map +1 -1
- package/dist/astro/routes/api/search/suggest.mjs +11 -10
- package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
- package/dist/astro/routes/api/sections/_slug_.mjs +11 -10
- package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/sections/index.mjs +11 -10
- package/dist/astro/routes/api/sections/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -6
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +6 -5
- package/dist/astro/routes/api/settings/backups/archives/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/export.mjs +7 -6
- package/dist/astro/routes/api/settings/backups/export.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/index.mjs +8 -7
- package/dist/astro/routes/api/settings/backups/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/email.mjs +5 -5
- package/dist/astro/routes/api/settings/email.mjs.map +1 -1
- package/dist/astro/routes/api/settings.d.mts.map +1 -1
- package/dist/astro/routes/api/settings.mjs +21 -17
- package/dist/astro/routes/api/settings.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin-verify.mjs +12 -12
- package/dist/astro/routes/api/setup/admin.mjs +11 -11
- package/dist/astro/routes/api/setup/dev-bypass.mjs +35 -33
- package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
- package/dist/astro/routes/api/setup/index.mjs +35 -33
- package/dist/astro/routes/api/setup/index.mjs.map +1 -1
- package/dist/astro/routes/api/setup/status.mjs +3 -3
- package/dist/astro/routes/api/snapshot.mjs +8 -7
- package/dist/astro/routes/api/snapshot.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/reorder.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +22 -17
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +23 -18
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +27 -19
- 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 +22 -17
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_.mjs +28 -20
- package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +22 -17
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +5 -5
- package/dist/astro/routes/api/typegen.mjs +4 -4
- 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.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +10 -8
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +18 -14
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +16 -13
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.mjs +9 -7
- package/dist/astro/routes/api/widget-areas/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/index.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/index.mjs +16 -13
- package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
- package/dist/astro/routes/api/widget-components.mjs +2 -2
- package/dist/astro/routes/robots.txt.mjs +8 -8
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +13 -12
- package/dist/astro/routes/sitemap-_collection_.xml.mjs.map +1 -1
- package/dist/astro/routes/sitemap.xml.mjs +9 -9
- package/dist/astro/types.d.mts +50 -20
- package/dist/astro/types.d.mts.map +1 -1
- package/dist/auth/providers/github.d.mts +1 -1
- package/dist/auth/providers/google.d.mts +1 -1
- package/dist/{authorize-ByYs-Uxs.mjs → authorize-C2QHlWSS.mjs} +2 -2
- package/dist/{authorize-ByYs-Uxs.mjs.map → authorize-C2QHlWSS.mjs.map} +1 -1
- package/dist/{backup-ChyHfIoX.mjs → backup-oS8ft5Cm.mjs} +5 -5
- package/dist/{backup-ChyHfIoX.mjs.map → backup-oS8ft5Cm.mjs.map} +1 -1
- package/dist/{bundle-DZFhFurR.mjs → bundle-CL0JjIPx.mjs} +4 -4
- package/dist/{bundle-DZFhFurR.mjs.map → bundle-CL0JjIPx.mjs.map} +1 -1
- package/dist/{byline-Cpnwrje1.mjs → byline-Vdi85CsZ.mjs} +27 -14
- package/dist/byline-Vdi85CsZ.mjs.map +1 -0
- package/dist/{byline-fields-CAyA_Umd.mjs → byline-fields-DPVRFMz2.mjs} +2 -2
- package/dist/{byline-fields-CAyA_Umd.mjs.map → byline-fields-DPVRFMz2.mjs.map} +1 -1
- package/dist/{byline-registry-Bpu9-MVs.mjs → byline-registry-BxDGIO0I.mjs} +2 -2
- package/dist/{byline-registry-Bpu9-MVs.mjs.map → byline-registry-BxDGIO0I.mjs.map} +1 -1
- package/dist/{bylines-BSo9B9RX.mjs → bylines-BX8QhcTk.mjs} +7 -7
- package/dist/{bylines-BSo9B9RX.mjs.map → bylines-BX8QhcTk.mjs.map} +1 -1
- package/dist/{bylines-CHjvehVX.mjs → bylines-w-E1IEQd.mjs} +3 -3
- package/dist/{bylines-CHjvehVX.mjs.map → bylines-w-E1IEQd.mjs.map} +1 -1
- package/dist/{cache-5VirJ2Cn.mjs → cache--7HKu5Xm.mjs} +4 -4
- package/dist/{cache-5VirJ2Cn.mjs.map → cache--7HKu5Xm.mjs.map} +1 -1
- package/dist/{capture-triggers-CNW1q3HK.mjs → capture-triggers-CeAsC76Z.mjs} +2 -2
- package/dist/{capture-triggers-CNW1q3HK.mjs.map → capture-triggers-CeAsC76Z.mjs.map} +1 -1
- package/dist/{challenge-store-D5pSY2S1.mjs → challenge-store-BIOak-tp.mjs} +5 -3
- package/dist/challenge-store-BIOak-tp.mjs.map +1 -0
- package/dist/chrome-tags-DzDQBCjX.mjs +24 -0
- package/dist/chrome-tags-DzDQBCjX.mjs.map +1 -0
- package/dist/{chunks-bNiX6_DR.mjs → chunks-VG_tyqnP.mjs} +2 -2
- package/dist/{chunks-bNiX6_DR.mjs.map → chunks-VG_tyqnP.mjs.map} +1 -1
- package/dist/cli/index.mjs +68 -40
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +17 -7
- package/dist/client/index.d.mts.map +1 -1
- package/dist/client/index.mjs +17 -12
- package/dist/client/index.mjs.map +1 -1
- package/dist/{collection-deletion-m_oi2c0N.mjs → collection-deletion-BCwaWTDw.mjs} +4 -4
- package/dist/{collection-deletion-m_oi2c0N.mjs.map → collection-deletion-BCwaWTDw.mjs.map} +1 -1
- package/dist/collection-slugs-cache-7lTmNzeA.mjs +85 -0
- package/dist/collection-slugs-cache-7lTmNzeA.mjs.map +1 -0
- package/dist/{comment-reaction-CRuItEjt.mjs → comment-reaction-CDyvPQRj.mjs} +2 -2
- package/dist/{comment-reaction-CRuItEjt.mjs.map → comment-reaction-CDyvPQRj.mjs.map} +1 -1
- package/dist/{comment-DhvLEdhQ.mjs → comment-vxOzWbZN.mjs} +2 -2
- package/dist/{comment-DhvLEdhQ.mjs.map → comment-vxOzWbZN.mjs.map} +1 -1
- package/dist/{comments-CLj4bi8I.mjs → comments-VzmVLyaC.mjs} +2 -2
- package/dist/{comments-CLj4bi8I.mjs.map → comments-VzmVLyaC.mjs.map} +1 -1
- package/dist/{components-v4U4DT2y.mjs → components-CL6Wkdk-.mjs} +1 -1
- package/dist/{components-v4U4DT2y.mjs.map → components-CL6Wkdk-.mjs.map} +1 -1
- package/dist/config--eWjQJE5.mjs +217 -0
- package/dist/config--eWjQJE5.mjs.map +1 -0
- package/dist/{index-DWbJrsAg.d.mts → config-CGAhyOjP.d.mts} +276 -76
- package/dist/config-CGAhyOjP.d.mts.map +1 -0
- package/dist/{config-DrfghTPe.d.mts → config-ChFzshGd.d.mts} +1 -1
- package/dist/{config-DrfghTPe.d.mts.map → config-ChFzshGd.d.mts.map} +1 -1
- package/dist/{content-CP-SeXNa.mjs → content-CNfMWuhY.mjs} +202 -46
- package/dist/content-CNfMWuhY.mjs.map +1 -0
- package/dist/{content-list-query-BhejKVqb.d.mts → content-list-query-B8d4UQp9.d.mts} +1 -1
- package/dist/{content-list-query-BhejKVqb.d.mts.map → content-list-query-B8d4UQp9.d.mts.map} +1 -1
- package/dist/{content-refresh-DLOfIhYc.mjs → content-refresh-GTMyi2Xy.mjs} +53 -26
- package/dist/content-refresh-GTMyi2Xy.mjs.map +1 -0
- package/dist/{content-repair-BCxzy0r4.mjs → content-repair-CIMt5C0U.mjs} +4 -4
- package/dist/{content-repair-BCxzy0r4.mjs.map → content-repair-CIMt5C0U.mjs.map} +1 -1
- package/dist/{context-BR5hRWiK.mjs → context-C9PB8vGd.mjs} +308 -33
- package/dist/context-C9PB8vGd.mjs.map +1 -0
- package/dist/{cron-CWfWrWKG.mjs → cron-DHAy9oyq.mjs} +1 -1
- package/dist/{cron-CWfWrWKG.mjs.map → cron-DHAy9oyq.mjs.map} +1 -1
- package/dist/{dashboard-CkIV2rnQ.mjs → dashboard-BNSvAN8A.mjs} +5 -5
- package/dist/{dashboard-CkIV2rnQ.mjs.map → dashboard-BNSvAN8A.mjs.map} +1 -1
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +2 -2
- package/dist/db/index.mjs.map +1 -1
- package/dist/db/libsql-migrations.d.mts +1 -1
- package/dist/db/libsql-migrations.mjs +5 -5
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres-migrations.d.mts +1 -1
- package/dist/db/postgres-migrations.mjs +5 -5
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/postgres.d.mts.map +1 -1
- package/dist/db/postgres.mjs +19 -3
- package/dist/db/postgres.mjs.map +1 -1
- package/dist/db/sqlite-migrations.d.mts +1 -1
- package/dist/db/sqlite-migrations.mjs +5 -5
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/db/sqlite.mjs +1 -1
- package/dist/{default-YMEfcQUx.mjs → default-ByZ0JqZo.mjs} +1 -1
- package/dist/{default-YMEfcQUx.mjs.map → default-ByZ0JqZo.mjs.map} +1 -1
- package/dist/{deferred-tasks-DfqxH5Xf.d.mts → deferred-tasks-Cu4NSJpa.d.mts} +1 -1
- package/dist/{deferred-tasks-DfqxH5Xf.d.mts.map → deferred-tasks-Cu4NSJpa.d.mts.map} +1 -1
- package/dist/dev-typegen-DHT7lcMU.mjs +29 -0
- package/dist/dev-typegen-DHT7lcMU.mjs.map +1 -0
- package/dist/{device-flow-CojjSBwb.mjs → device-flow-Cf6bhCCT.mjs} +4 -4
- package/dist/{device-flow-CojjSBwb.mjs.map → device-flow-Cf6bhCCT.mjs.map} +1 -1
- package/dist/{dialect-helpers-BSbfaO3F.mjs → dialect-helpers-BcQvkHgn.mjs} +83 -2
- package/dist/dialect-helpers-BcQvkHgn.mjs.map +1 -0
- package/dist/{direct-executor-BWeWiRYB.mjs → direct-executor-yAyUGSqB.mjs} +3 -3
- package/dist/{direct-executor-BWeWiRYB.mjs.map → direct-executor-yAyUGSqB.mjs.map} +1 -1
- package/dist/{dist-89xCrGqi.mjs → dist-BAsh8dbf.mjs} +1 -1
- package/dist/{dist-89xCrGqi.mjs.map → dist-BAsh8dbf.mjs.map} +1 -1
- package/dist/{email-console-CEJgR_LB.mjs → email-console-DNup1Fku.mjs} +1 -1
- package/dist/{email-console-CEJgR_LB.mjs.map → email-console-DNup1Fku.mjs.map} +1 -1
- package/dist/{enrich-BX0IDp4z.mjs → enrich-t2Xvjdqa.mjs} +3 -3
- package/dist/{enrich-BX0IDp4z.mjs.map → enrich-t2Xvjdqa.mjs.map} +1 -1
- package/dist/entry-lock-BEr8gDkG.mjs +163 -0
- package/dist/entry-lock-BEr8gDkG.mjs.map +1 -0
- package/dist/{relations-C7B46bcU.d.mts → entry-lock-CGAtrwAR.d.mts} +265 -76
- package/dist/entry-lock-CGAtrwAR.d.mts.map +1 -0
- package/dist/{redirects-CRIM55KH.mjs → entry-lock-DIYHAaSw.mjs} +112 -34
- package/dist/entry-lock-DIYHAaSw.mjs.map +1 -0
- package/dist/entry-locks-BEcX7ET0.mjs +167 -0
- package/dist/entry-locks-BEcX7ET0.mjs.map +1 -0
- package/dist/{error-D9w94fjV.mjs → error-BDcFyoRt.mjs} +2 -2
- package/dist/{error-D9w94fjV.mjs.map → error-BDcFyoRt.mjs.map} +1 -1
- package/dist/{errors-n2j49uNf.mjs → errors-DvMdNrgf.mjs} +10 -1
- package/dist/errors-DvMdNrgf.mjs.map +1 -0
- package/dist/{escape-DN4Qmjsl.mjs → escape-B3asJC6W.mjs} +1 -1
- package/dist/{escape-DN4Qmjsl.mjs.map → escape-B3asJC6W.mjs.map} +1 -1
- package/dist/{field-defs-cache-Bh4q6oar.mjs → field-defs-cache-Cf5FHK0M.mjs} +5 -5
- package/dist/{field-defs-cache-Bh4q6oar.mjs.map → field-defs-cache-Cf5FHK0M.mjs.map} +1 -1
- package/dist/{fts-manager-BhOdW0bi.mjs → fts-manager-iddym8cd.mjs} +4 -4
- package/dist/{fts-manager-BhOdW0bi.mjs.map → fts-manager-iddym8cd.mjs.map} +1 -1
- package/dist/{hash-CTcngWvj.mjs → hash-BRweX6jz.mjs} +1 -1
- package/dist/{hash-CTcngWvj.mjs.map → hash-BRweX6jz.mjs.map} +1 -1
- package/dist/hook-result-BrshYHLx.d.mts +31 -0
- package/dist/hook-result-BrshYHLx.d.mts.map +1 -0
- package/dist/{hreflang-7pTHsLZJ.d.mts → hreflang-CQpu5bMy.d.mts} +2 -2
- package/dist/{hreflang-7pTHsLZJ.d.mts.map → hreflang-CQpu5bMy.d.mts.map} +1 -1
- package/dist/{hreflang-Huc6O5wa.mjs → hreflang-DshnweTC.mjs} +9 -8
- package/dist/{hreflang-Huc6O5wa.mjs.map → hreflang-DshnweTC.mjs.map} +1 -1
- package/dist/{identity-DXmb4aVp.mjs → identity-CjGKDq8J.mjs} +3 -3
- package/dist/{identity-DXmb4aVp.mjs.map → identity-CjGKDq8J.mjs.map} +1 -1
- package/dist/{import-C4_O3KXU.mjs → import-D96g2otw.mjs} +6 -6
- package/dist/{import-C4_O3KXU.mjs.map → import-D96g2otw.mjs.map} +1 -1
- package/dist/{index-6bRee8zb.d.mts → index-1ECYpfiF.d.mts} +3 -3
- package/dist/{index-6bRee8zb.d.mts.map → index-1ECYpfiF.d.mts.map} +1 -1
- package/dist/index.d.mts +22 -21
- package/dist/index.mjs +84 -81
- package/dist/{init-lock-DJkX6Hto.mjs → init-lock-CFNBe_iH.mjs} +1 -1
- package/dist/{init-lock-DJkX6Hto.mjs.map → init-lock-CFNBe_iH.mjs.map} +1 -1
- package/dist/{load-Bo7fZAbg.mjs → load-DPtY9cZo.mjs} +2 -2
- package/dist/{load-Bo7fZAbg.mjs.map → load-DPtY9cZo.mjs.map} +1 -1
- package/dist/{loader-ZsjE4paL.mjs → loader-WJi6GFRn.mjs} +90 -17
- package/dist/loader-WJi6GFRn.mjs.map +1 -0
- package/dist/{manifest-builder-QXuqvVMP.mjs → manifest-builder-BfNlGQIA.mjs} +2 -2
- package/dist/{manifest-builder-QXuqvVMP.mjs.map → manifest-builder-BfNlGQIA.mjs.map} +1 -1
- package/dist/{manifest-schema-CUYPfCEH.mjs → manifest-schema-CILooI5J.mjs} +5 -5
- package/dist/manifest-schema-CILooI5J.mjs.map +1 -0
- package/dist/media/image-endpoint.d.mts +4 -2
- package/dist/media/image-endpoint.d.mts.map +1 -1
- package/dist/media/image-endpoint.mjs +6 -4
- package/dist/media/image-endpoint.mjs.map +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +3 -3
- package/dist/media/local-runtime.d.mts +12 -12
- package/dist/media/local-runtime.mjs +7 -7
- package/dist/{media-D6SeAfBl.mjs → media-BBm8Wg3f.mjs} +30 -2
- package/dist/media-BBm8Wg3f.mjs.map +1 -0
- package/dist/{media-BjwNuLEu.mjs → media-C1EIZKh1.mjs} +35 -5
- package/dist/media-C1EIZKh1.mjs.map +1 -0
- package/dist/{media-allowlist-D35v7bmL.mjs → media-allowlist-elXJgb_K.mjs} +2 -2
- package/dist/{media-allowlist-D35v7bmL.mjs.map → media-allowlist-elXJgb_K.mjs.map} +1 -1
- package/dist/{media-folders-D-0CmRZj.mjs → media-folders-DASfX_DH.mjs} +1 -1
- package/dist/{media-folders-D-0CmRZj.mjs.map → media-folders-DASfX_DH.mjs.map} +1 -1
- package/dist/{media-upload-C7bLXGcI.mjs → media-upload-C7_AQJ5v.mjs} +9 -9
- package/dist/{media-upload-C7bLXGcI.mjs.map → media-upload-C7_AQJ5v.mjs.map} +1 -1
- package/dist/{media-url-DH7giMx_.mjs → media-url-8dVl1loq.mjs} +19 -2
- package/dist/media-url-8dVl1loq.mjs.map +1 -0
- package/dist/{media-usage-BTRJvS6V.mjs → media-usage-C1EswMTq.mjs} +10 -10
- package/dist/{media-usage-BTRJvS6V.mjs.map → media-usage-C1EswMTq.mjs.map} +1 -1
- package/dist/{media-usage-activation-Dx0kPV6b.mjs → media-usage-activation-CrHNltlL.mjs} +3 -3
- package/dist/{media-usage-activation-Dx0kPV6b.mjs.map → media-usage-activation-CrHNltlL.mjs.map} +1 -1
- package/dist/{media-usage-work-C-fhM30c.mjs → media-usage-work-C5B1zT1c.mjs} +2 -2
- package/dist/{media-usage-work-C-fhM30c.mjs.map → media-usage-work-C5B1zT1c.mjs.map} +1 -1
- package/dist/{media-usage-work-DWb2XPMI.mjs → media-usage-work-IkQx_Yz6.mjs} +4 -4
- package/dist/{media-usage-work-DWb2XPMI.mjs.map → media-usage-work-IkQx_Yz6.mjs.map} +1 -1
- package/dist/{media-usage-write-fence-BwoJVRDC.mjs → media-usage-write-fence-B9anjOSg.mjs} +3 -3
- package/dist/{media-usage-write-fence-BwoJVRDC.mjs.map → media-usage-write-fence-B9anjOSg.mjs.map} +1 -1
- package/dist/{menus-CNg0QlDt.mjs → menus-D8mC4eaN.mjs} +406 -175
- package/dist/menus-D8mC4eaN.mjs.map +1 -0
- package/dist/{menus-CD7EFLwz.mjs → menus-UdwjHZJC.mjs} +12 -4
- package/dist/{menus-CD7EFLwz.mjs.map → menus-UdwjHZJC.mjs.map} +1 -1
- package/dist/migrations/index.d.mts +1 -1
- package/dist/migrations/index.mjs +4 -4
- package/dist/{mime-CUIG6x84.mjs → mime-DYpsOAny.mjs} +1 -1
- package/dist/{mime-CUIG6x84.mjs.map → mime-DYpsOAny.mjs.map} +1 -1
- package/dist/{mode-DaUM_MB2.mjs → mode-Dm4BHhRH.mjs} +1 -1
- package/dist/{mode-DaUM_MB2.mjs.map → mode-Dm4BHhRH.mjs.map} +1 -1
- package/dist/{node-sqlite-compat-Udb4Y-rs.mjs → node-sqlite-compat-2sezm-Zd.mjs} +1 -1
- package/dist/{node-sqlite-compat-Udb4Y-rs.mjs.map → node-sqlite-compat-2sezm-Zd.mjs.map} +1 -1
- package/dist/{normalize-CSxdKBVa.mjs → normalize-4nkKGsuW.mjs} +15 -5
- package/dist/normalize-4nkKGsuW.mjs.map +1 -0
- package/dist/{oauth-authorization-Dpsb-fMJ.mjs → oauth-authorization-BxE_lURD.mjs} +4 -4
- package/dist/{oauth-authorization-Dpsb-fMJ.mjs.map → oauth-authorization-BxE_lURD.mjs.map} +1 -1
- package/dist/{oauth-clients-Bxnoe_67.mjs → oauth-clients-DJIdOdq0.mjs} +1 -1
- package/dist/{oauth-clients-Bxnoe_67.mjs.map → oauth-clients-DJIdOdq0.mjs.map} +1 -1
- package/dist/{oauth-state-store-0C4s0K6w.mjs → oauth-state-store-CsdxP57n.mjs} +1 -1
- package/dist/{oauth-state-store-0C4s0K6w.mjs.map → oauth-state-store-CsdxP57n.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-wlGYSeqX.mjs → oauth-user-lookup-HzzW-dkF.mjs} +1 -1
- package/dist/{oauth-user-lookup-wlGYSeqX.mjs.map → oauth-user-lookup-HzzW-dkF.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/{object-cache-71tPfV4A.mjs → object-cache-DVKnyOfy.mjs} +19 -3
- package/dist/object-cache-DVKnyOfy.mjs.map +1 -0
- package/dist/{options-BHPeIbBd.mjs → options-D1FBiAv1.mjs} +60 -5
- package/dist/options-D1FBiAv1.mjs.map +1 -0
- package/dist/{options-BhZIeFY1.d.mts → options-D8Y0VHc7.d.mts} +30 -11
- package/dist/options-D8Y0VHc7.d.mts.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/page/index.d.mts.map +1 -1
- package/dist/page/index.mjs +12 -0
- package/dist/page/index.mjs.map +1 -1
- package/dist/{parse-BRJg1kz8.mjs → parse-WRg5C3NX.mjs} +2 -2
- package/dist/{parse-BRJg1kz8.mjs.map → parse-WRg5C3NX.mjs.map} +1 -1
- package/dist/{passkey-config-B3P0nHRR.mjs → passkey-config-qIdO-wF6.mjs} +1 -1
- package/dist/{passkey-config-B3P0nHRR.mjs.map → passkey-config-qIdO-wF6.mjs.map} +1 -1
- package/dist/{patterns-D9iDO3j8.mjs → patterns-DC8CLptu.mjs} +1 -1
- package/dist/{patterns-D9iDO3j8.mjs.map → patterns-DC8CLptu.mjs.map} +1 -1
- package/dist/{placeholder-BR4ZhVJl.d.mts → placeholder-COrvARyD.d.mts} +1 -1
- package/dist/{placeholder-BR4ZhVJl.d.mts.map → placeholder-COrvARyD.d.mts.map} +1 -1
- package/dist/plugin-types.d.mts +8 -3
- package/dist/plugin-types.d.mts.map +1 -1
- package/dist/plugin-utils.d.mts +10 -10
- package/dist/plugins/adapt-sandbox-entry.d.mts +10 -10
- package/dist/plugins/adapt-sandbox-entry.mjs +2 -2
- package/dist/{policy-BVRganJQ.mjs → policy-XCfb-IE9.mjs} +2 -2
- package/dist/{policy-BVRganJQ.mjs.map → policy-XCfb-IE9.mjs.map} +1 -1
- package/dist/{portable-text-C8Tvp4_g.mjs → portable-text-BS3d5n-0.mjs} +1 -1
- package/dist/{portable-text-C8Tvp4_g.mjs.map → portable-text-BS3d5n-0.mjs.map} +1 -1
- package/dist/{preview-dn2dUyM0.mjs → preview-BxwsGgGp.mjs} +2 -2
- package/dist/{preview-dn2dUyM0.mjs.map → preview-BxwsGgGp.mjs.map} +1 -1
- package/dist/{protocol-CuBEsqgE.d.mts → protocol-CLn58-nw.d.mts} +2 -2
- package/dist/{protocol-CuBEsqgE.d.mts.map → protocol-CLn58-nw.d.mts.map} +1 -1
- package/dist/{public-url-DRz_AinV.mjs → public-url-FWWAvnre.mjs} +1 -1
- package/dist/{public-url-DRz_AinV.mjs.map → public-url-FWWAvnre.mjs.map} +1 -1
- package/dist/{query-D18vTdha.mjs → query-DygOte9M.mjs} +26 -17
- package/dist/query-DygOte9M.mjs.map +1 -0
- package/dist/{query-tZDEdtCN.mjs → query-gtXT03Wc.mjs} +5 -5
- package/dist/{query-tZDEdtCN.mjs.map → query-gtXT03Wc.mjs.map} +1 -1
- package/dist/{rate-limit-on7KPo-v.mjs → rate-limit-CQUPm0dh.mjs} +2 -2
- package/dist/{rate-limit-on7KPo-v.mjs.map → rate-limit-CQUPm0dh.mjs.map} +1 -1
- package/dist/{redirect-DrbEmU9a.mjs → redirect-D1cWafi6.mjs} +1 -1
- package/dist/{redirect-DrbEmU9a.mjs.map → redirect-D1cWafi6.mjs.map} +1 -1
- package/dist/{redirect-CZkbozu9.mjs → redirect-DId44BS1.mjs} +19 -6
- package/dist/redirect-DId44BS1.mjs.map +1 -0
- package/dist/{redirects-BahWiu8Z.mjs → redirects-DN-ZE33W.mjs} +5 -5
- package/dist/{redirects-BahWiu8Z.mjs.map → redirects-DN-ZE33W.mjs.map} +1 -1
- package/dist/{registry-Cx-jEJOS.mjs → registry-DTqaqxed.mjs} +46 -12
- package/dist/registry-DTqaqxed.mjs.map +1 -0
- package/dist/{relation-A6wLF_DS.mjs → relation-DxgCHOBw.mjs} +2 -2
- package/dist/{relation-A6wLF_DS.mjs.map → relation-DxgCHOBw.mjs.map} +1 -1
- package/dist/{relations-Cj5hZ6Zg.mjs → relations-KKDSLUwS.mjs} +4 -4
- package/dist/{relations-Cj5hZ6Zg.mjs.map → relations-KKDSLUwS.mjs.map} +1 -1
- package/dist/{relations-BTPM2saV.mjs → relations-rOmbndUJ.mjs} +8 -8
- package/dist/relations-rOmbndUJ.mjs.map +1 -0
- package/dist/{request-cache-DH9zdCOD.mjs → request-cache-DAZZmesc.mjs} +1 -1
- package/dist/{request-cache-DH9zdCOD.mjs.map → request-cache-DAZZmesc.mjs.map} +1 -1
- package/dist/request-context.d.mts +1 -1
- package/dist/{request-meta-DRp5ENd_.mjs → request-meta-BgjUQLQ-.mjs} +2 -2
- package/dist/{request-meta-DRp5ENd_.mjs.map → request-meta-BgjUQLQ-.mjs.map} +1 -1
- package/dist/{resolve-DxUpTMmE.mjs → resolve-Cy0aWSRj.mjs} +37 -4
- package/dist/resolve-Cy0aWSRj.mjs.map +1 -0
- package/dist/{runner-zgqA_CqP.d.mts → runner-CfwysRM0.d.mts} +3 -2
- package/dist/runner-CfwysRM0.d.mts.map +1 -0
- package/dist/{runner-77GOZCnH.mjs → runner-nEzvnogG.mjs} +476 -295
- package/dist/runner-nEzvnogG.mjs.map +1 -0
- package/dist/runtime.d.mts +11 -11
- package/dist/runtime.mjs +3 -2
- package/dist/runtime.mjs.map +1 -1
- package/dist/{schema-BY-oVntF.mjs → schema-CRu38Pr5.mjs} +3 -3
- package/dist/{schema-BY-oVntF.mjs.map → schema-CRu38Pr5.mjs.map} +1 -1
- package/dist/{schema-Cw9kVK0I.mjs → schema-DifxndJx.mjs} +5 -5
- package/dist/{schema-Cw9kVK0I.mjs.map → schema-DifxndJx.mjs.map} +1 -1
- package/dist/{scopes-vMR1uIbt.mjs → scopes-D5A1OZbq.mjs} +3 -3
- package/dist/{scopes-vMR1uIbt.mjs.map → scopes-D5A1OZbq.mjs.map} +1 -1
- package/dist/{search-CfT3KxO5.mjs → search-DEPFSBFq.mjs} +4 -4
- package/dist/{search-CfT3KxO5.mjs.map → search-DEPFSBFq.mjs.map} +1 -1
- package/dist/{secrets-BH2Qow1-.mjs → secrets-CdfzLdoO.mjs} +3 -3
- package/dist/{secrets-BH2Qow1-.mjs.map → secrets-CdfzLdoO.mjs.map} +1 -1
- package/dist/{sections-DTfjyf1z.mjs → sections-3X52kmIR.mjs} +2 -2
- package/dist/{sections-DTfjyf1z.mjs.map → sections-3X52kmIR.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.d.mts.map +1 -1
- package/dist/seo/index.mjs +20 -21
- package/dist/seo/index.mjs.map +1 -1
- package/dist/{seo-Cm-dtvgk.mjs → seo-Bw68KxRc.mjs} +3 -3
- package/dist/{seo-Cm-dtvgk.mjs.map → seo-Bw68KxRc.mjs.map} +1 -1
- package/dist/{seo-BSiTIXzd.mjs → seo-C4AmbsMU.mjs} +3 -2
- package/dist/seo-C4AmbsMU.mjs.map +1 -0
- package/dist/{service-DYsDHEKe.mjs → service-J_-Vgo7R.mjs} +3 -3
- package/dist/{service-DYsDHEKe.mjs.map → service-J_-Vgo7R.mjs.map} +1 -1
- package/dist/{session-user-CNAfvsdw.mjs → session-user-CbnMMwk6.mjs} +1 -1
- package/dist/{session-user-CNAfvsdw.mjs.map → session-user-CbnMMwk6.mjs.map} +1 -1
- package/dist/{settings-DjtkUo__.mjs → settings-AnEFYICn.mjs} +3 -3
- package/dist/{settings-DjtkUo__.mjs.map → settings-AnEFYICn.mjs.map} +1 -1
- package/dist/{settings-BgN-0DT-.mjs → settings-DcMjREe5.mjs} +21 -8
- package/dist/settings-DcMjREe5.mjs.map +1 -0
- package/dist/{setup-complete-CcpXaPU7.mjs → setup-complete-BClXXTvr.mjs} +2 -2
- package/dist/{setup-complete-CcpXaPU7.mjs.map → setup-complete-BClXXTvr.mjs.map} +1 -1
- package/dist/{setup-nonce-Reyw30jg.mjs → setup-nonce-BheRa4RG.mjs} +1 -1
- package/dist/{setup-nonce-Reyw30jg.mjs.map → setup-nonce-BheRa4RG.mjs.map} +1 -1
- package/dist/{single-flight-cache-BPuGPdcN.mjs → single-flight-cache-jaswDzmQ.mjs} +2 -2
- package/dist/{single-flight-cache-BPuGPdcN.mjs.map → single-flight-cache-jaswDzmQ.mjs.map} +1 -1
- package/dist/{site-url-Cs_V9n3V.mjs → site-url-Bqf-ea3N.mjs} +3 -3
- package/dist/{site-url-Cs_V9n3V.mjs.map → site-url-Bqf-ea3N.mjs.map} +1 -1
- package/dist/{snapshot-DSB8P7Lm.mjs → snapshot-C4CtXntb.mjs} +51 -35
- package/dist/snapshot-C4CtXntb.mjs.map +1 -0
- package/dist/{ssrf-DqebVE34.mjs → ssrf-gl4gFNhw.mjs} +151 -93
- package/dist/ssrf-gl4gFNhw.mjs.map +1 -0
- package/dist/{state-BJfU9Uzw.mjs → state-1F6IOhdQ.mjs} +1 -1
- package/dist/{state-BJfU9Uzw.mjs.map → state-1F6IOhdQ.mjs.map} +1 -1
- package/dist/{status-DDu8HIQl.mjs → status-Cenfk_r5.mjs} +1 -1
- package/dist/{status-DDu8HIQl.mjs.map → status-Cenfk_r5.mjs.map} +1 -1
- package/dist/storage/local.d.mts +2 -1
- package/dist/storage/local.d.mts.map +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/local.mjs.map +1 -1
- package/dist/storage/s3.d.mts +2 -1
- package/dist/storage/s3.d.mts.map +1 -1
- package/dist/storage/s3.mjs +3 -2
- package/dist/storage/s3.mjs.map +1 -1
- package/dist/{target-D0o26Azo.mjs → target-CRzeTs8G.mjs} +1 -1
- package/dist/{target-D0o26Azo.mjs.map → target-CRzeTs8G.mjs.map} +1 -1
- package/dist/{taxonomies-CPGxo-bn.mjs → taxonomies-BOdxuZpV.mjs} +23 -13
- package/dist/taxonomies-BOdxuZpV.mjs.map +1 -0
- package/dist/{taxonomies-kmyudNGP.mjs → taxonomies-NcFDq5Gg.mjs} +58 -23
- package/dist/taxonomies-NcFDq5Gg.mjs.map +1 -0
- package/dist/{taxonomy-8X09dLN5.mjs → taxonomy-DP1vny4K.mjs} +12 -4
- package/dist/{taxonomy-8X09dLN5.mjs.map → taxonomy-DP1vny4K.mjs.map} +1 -1
- package/dist/{tokens-gTS-IVUp.mjs → tokens-CDk8ox9p.mjs} +1 -1
- package/dist/{tokens-gTS-IVUp.mjs.map → tokens-CDk8ox9p.mjs.map} +1 -1
- package/dist/{transport-_6R1ub7t.d.mts → transport-BVn4tVb9.d.mts} +1 -1
- package/dist/{transport-_6R1ub7t.d.mts.map → transport-BVn4tVb9.d.mts.map} +1 -1
- package/dist/{transport-fX59xaJz.mjs → transport-DP0JI-8i.mjs} +1 -1
- package/dist/{transport-fX59xaJz.mjs.map → transport-DP0JI-8i.mjs.map} +1 -1
- package/dist/{trusted-proxy-fe6nEgR4.mjs → trusted-proxy-BTM6UxqD.mjs} +1 -1
- package/dist/{trusted-proxy-fe6nEgR4.mjs.map → trusted-proxy-BTM6UxqD.mjs.map} +1 -1
- package/dist/{types-D_DWe7k9.d.mts → types-2n848aVW.d.mts} +3 -2
- package/dist/types-2n848aVW.d.mts.map +1 -0
- package/dist/types-A2cN6a4a.mjs +3 -0
- package/dist/{types-75KIqzL9.mjs → types-BMXnRIrX.mjs} +4 -2
- package/dist/types-BMXnRIrX.mjs.map +1 -0
- package/dist/{types-Vg6f5i3s.d.mts → types-BouXpOsa.d.mts} +121 -4
- package/dist/types-BouXpOsa.d.mts.map +1 -0
- package/dist/{types-BXUmsINL.mjs → types-ByG2coLw.mjs} +1 -1
- package/dist/{types-BXUmsINL.mjs.map → types-ByG2coLw.mjs.map} +1 -1
- package/dist/types-CQPWhPxE.mjs.map +1 -1
- package/dist/{types-Blb-MRC3.d.mts → types-DEfNJ__A.d.mts} +1 -1
- package/dist/{types-Blb-MRC3.d.mts.map → types-DEfNJ__A.d.mts.map} +1 -1
- package/dist/{types-Br-ERaxh.d.mts → types-DKcKSbtB.d.mts} +23 -7
- package/dist/types-DKcKSbtB.d.mts.map +1 -0
- package/dist/{types-BzBd3PeX.d.mts → types-DRYs7uTL.d.mts} +1 -1
- package/dist/{types-BzBd3PeX.d.mts.map → types-DRYs7uTL.d.mts.map} +1 -1
- package/dist/{types-CLqvnd05.d.mts → types-DaEg7KX2.d.mts} +1 -1
- package/dist/{types-CLqvnd05.d.mts.map → types-DaEg7KX2.d.mts.map} +1 -1
- package/dist/{types-DJQxln7q.d.mts → types-LU8utpP_.d.mts} +14 -10
- package/dist/types-LU8utpP_.d.mts.map +1 -0
- package/dist/{types-D5VVLr7J.d.mts → types-VpYfPUxN.d.mts} +1 -1
- package/dist/{types-D5VVLr7J.d.mts.map → types-VpYfPUxN.d.mts.map} +1 -1
- package/dist/{types-DM3vioBY.mjs → types-c9GP7Dj5.mjs} +1 -1
- package/dist/{types-DM3vioBY.mjs.map → types-c9GP7Dj5.mjs.map} +1 -1
- package/dist/{types-DHxzBjbD.d.mts → types-tJWDK__M.d.mts} +14 -1
- package/dist/types-tJWDK__M.d.mts.map +1 -0
- package/dist/{upload-attempts-CNyGSepg.mjs → upload-attempts-C6S2y-lp.mjs} +1 -1
- package/dist/{upload-attempts-CNyGSepg.mjs.map → upload-attempts-C6S2y-lp.mjs.map} +1 -1
- package/dist/{url-pattern-K-KdXcSe.mjs → url-pattern-UYtxVTuj.mjs} +1 -1
- package/dist/{url-pattern-K-KdXcSe.mjs.map → url-pattern-UYtxVTuj.mjs.map} +1 -1
- package/dist/{user-CtYY0tp2.mjs → user-DIsIXogT.mjs} +2 -2
- package/dist/{user-CtYY0tp2.mjs.map → user-DIsIXogT.mjs.map} +1 -1
- package/dist/{utils-HztC73hq.mjs → utils-BicP5Qbg.mjs} +2 -2
- package/dist/{utils-HztC73hq.mjs.map → utils-BicP5Qbg.mjs.map} +1 -1
- package/dist/{validate-Dd-IUjnZ.mjs → validate-D8VPn4Hv.mjs} +8 -3
- package/dist/validate-D8VPn4Hv.mjs.map +1 -0
- package/dist/{validate-DlqdOZXB.d.mts → validate-Df6Dvwbw.d.mts} +12 -7
- package/dist/validate-Df6Dvwbw.d.mts.map +1 -0
- package/dist/{validation-D83n7Npi.mjs → validation-CzMJn9Ku.mjs} +13 -11
- package/dist/{validation-D83n7Npi.mjs.map → validation-CzMJn9Ku.mjs.map} +1 -1
- package/dist/version-CK67_SXX.mjs +7 -0
- package/dist/{version-ri-sCyAp.mjs.map → version-CK67_SXX.mjs.map} +1 -1
- package/dist/{widgets-CpmZd9Q-.mjs → widgets-RFVAxQl3.mjs} +18 -5
- package/dist/widgets-RFVAxQl3.mjs.map +1 -0
- package/dist/{wxr-taxonomies-BFd0y72_.d.mts → wxr-taxonomies-BX4yQL9s.d.mts} +1 -1
- package/dist/{wxr-taxonomies-BFd0y72_.d.mts.map → wxr-taxonomies-BX4yQL9s.d.mts.map} +1 -1
- package/dist/{wxr-taxonomies-Df4vxWcU.mjs → wxr-taxonomies-Csdp7yde.mjs} +4 -4
- package/dist/{wxr-taxonomies-Df4vxWcU.mjs.map → wxr-taxonomies-Csdp7yde.mjs.map} +1 -1
- package/dist/{zod-generator-DylzusHh.mjs → zod-generator-CNRGdnBY.mjs} +11 -7
- package/dist/zod-generator-CNRGdnBY.mjs.map +1 -0
- package/package.json +16 -11
- package/src/api/errors.ts +9 -0
- package/src/api/handlers/content.ts +115 -90
- package/src/api/handlers/entry-lock.ts +206 -0
- package/src/api/handlers/index.ts +1 -0
- package/src/api/handlers/manifest.ts +162 -12
- package/src/api/handlers/marketplace.ts +28 -20
- package/src/api/handlers/media.ts +30 -0
- package/src/api/handlers/menus.ts +9 -0
- package/src/api/handlers/registry.ts +406 -297
- package/src/api/handlers/revision.ts +2 -1
- package/src/api/handlers/seo.ts +10 -1
- package/src/api/handlers/snapshot.ts +84 -72
- package/src/api/handlers/taxonomies.ts +25 -9
- package/src/api/openapi/document.ts +196 -11
- package/src/api/parse.ts +1 -1
- package/src/api/schemas/auth.ts +4 -4
- package/src/api/schemas/bylines.ts +3 -3
- package/src/api/schemas/comments.ts +1 -1
- package/src/api/schemas/common.ts +3 -2
- package/src/api/schemas/content.ts +86 -22
- package/src/api/schemas/entry-lock.ts +48 -0
- package/src/api/schemas/index.ts +1 -0
- package/src/api/schemas/media.ts +52 -0
- package/src/api/schemas/redirects.ts +6 -1
- package/src/api/schemas/schema.ts +14 -1
- package/src/api/schemas/setup.ts +1 -1
- package/src/api/schemas/taxonomies.ts +2 -2
- package/src/api/schemas/users.ts +1 -1
- package/src/api/types.ts +25 -10
- package/src/astro/dev-typegen.ts +35 -0
- package/src/astro/image-endpoint.ts +2 -2
- package/src/astro/integration/dev-typegen.ts +91 -0
- package/src/astro/integration/index.ts +18 -50
- package/src/astro/integration/routes.ts +10 -0
- package/src/astro/integration/runtime.ts +13 -5
- package/src/astro/integration/vite-config.ts +51 -2
- package/src/astro/middleware.ts +21 -0
- package/src/astro/routes/api/admin/api-tokens/index.ts +4 -1
- package/src/astro/routes/api/admin/oauth-clients/[id].ts +1 -1
- package/src/astro/routes/api/admin/oauth-clients/index.ts +1 -1
- package/src/astro/routes/api/admin/plugins/registry/[id]/update.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/artifact.ts +3 -7
- package/src/astro/routes/api/admin/plugins/registry/install.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/verify.ts +60 -0
- package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +18 -2
- package/src/astro/routes/api/content/[collection]/[id]/lock.ts +133 -0
- package/src/astro/routes/api/content/[collection]/[id]/publish.ts +12 -1
- package/src/astro/routes/api/content/[collection]/[id]/schedule.ts +20 -0
- package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +16 -2
- package/src/astro/routes/api/content/[collection]/[id].ts +27 -2
- package/src/astro/routes/api/content/[collection]/index.ts +3 -0
- package/src/astro/routes/api/manifest.ts +1 -1
- package/src/astro/routes/api/media/[id]/replace.ts +114 -0
- package/src/astro/routes/api/media/file/[...key].ts +4 -1
- package/src/astro/routes/api/media/upload-url.ts +8 -4
- package/src/astro/routes/api/media.ts +54 -8
- package/src/astro/routes/api/menus/[name]/items/[id].ts +7 -2
- package/src/astro/routes/api/menus/[name]/items.ts +4 -1
- package/src/astro/routes/api/menus/[name]/reorder.ts +4 -1
- package/src/astro/routes/api/menus/[name]/translations.ts +4 -1
- package/src/astro/routes/api/menus/[name].ts +7 -2
- package/src/astro/routes/api/menus/index.ts +4 -1
- package/src/astro/routes/api/settings/email.ts +1 -1
- package/src/astro/routes/api/settings.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name]/reorder.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name]/terms/[slug]/translations.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name]/terms/[slug].ts +7 -2
- package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name].ts +7 -2
- package/src/astro/routes/api/taxonomies/index.ts +4 -1
- package/src/astro/routes/api/widget-areas/[name]/reorder.ts +3 -1
- package/src/astro/routes/api/widget-areas/[name]/widgets/[id].ts +5 -2
- package/src/astro/routes/api/widget-areas/[name]/widgets.ts +3 -1
- package/src/astro/routes/api/widget-areas/[name].ts +3 -1
- package/src/astro/routes/api/widget-areas/index.ts +3 -1
- package/src/astro/routes/sitemap-[collection].xml.ts +4 -0
- package/src/astro/types.ts +36 -8
- package/src/auth/challenge-store.ts +3 -1
- package/src/aws-sdk.d.ts +1 -0
- package/src/cache/chrome-tags.ts +24 -0
- package/src/cli/commands/content.ts +31 -5
- package/src/cli/commands/export-seed.ts +2 -0
- package/src/client/index.ts +34 -7
- package/src/components/EmDashBodyEnd.astro +4 -1
- package/src/components/EmDashBodyStart.astro +4 -1
- package/src/components/EmDashHead.astro +35 -16
- package/src/components/EmDashImage.astro +2 -1
- package/src/components/EmDashMedia.astro +2 -1
- package/src/components/Gallery.astro +18 -4
- package/src/components/InlineEditor.astro +3 -1
- package/src/components/InlinePortableTextEditor.tsx +112 -12
- package/src/components/PortableText.astro +4 -0
- package/src/components/Table.astro +147 -62
- package/src/components/widgets/Archives.astro +2 -37
- package/src/config/errors.ts +13 -0
- package/src/content/converters/index.ts +2 -0
- package/src/content/converters/mark-safety.ts +1 -0
- package/src/content/converters/portable-text-identity.ts +139 -0
- package/src/content/converters/portable-text-to-prosemirror.ts +226 -69
- package/src/content/converters/prosemirror-to-portable-text.ts +128 -28
- package/src/content/converters/types.ts +11 -0
- package/src/database/dialect-helpers.ts +125 -0
- package/src/database/migrations/017_authorization_codes.ts +14 -4
- package/src/database/migrations/074_content_deleted_scheduled_index.ts +55 -0
- package/src/database/migrations/075_entry_edit_locks.ts +44 -0
- package/src/database/migrations/076_collection_nav_group.ts +22 -0
- package/src/database/migrations/077_plugin_storage_revisions.ts +89 -0
- package/src/database/migrations/runner.ts +9 -1
- package/src/database/repositories/byline.ts +32 -16
- package/src/database/repositories/content.ts +284 -48
- package/src/database/repositories/entry-locks.ts +257 -0
- package/src/database/repositories/media-usage.ts +66 -37
- package/src/database/repositories/media.ts +60 -1
- package/src/database/repositories/options.ts +69 -5
- package/src/database/repositories/plugin-storage.ts +233 -9
- package/src/database/repositories/redirect.ts +17 -6
- package/src/database/repositories/taxonomy.ts +8 -0
- package/src/database/repositories/types.ts +11 -7
- package/src/database/types.ts +15 -1
- package/src/db/adapters.ts +8 -1
- package/src/db/postgres.ts +23 -0
- package/src/emdash-runtime.ts +196 -199
- package/src/fields/boolean.ts +1 -1
- package/src/fields/datetime.ts +1 -1
- package/src/fields/file.ts +1 -1
- package/src/fields/integer.ts +1 -1
- package/src/fields/json.ts +1 -1
- package/src/fields/multiselect.ts +1 -1
- package/src/fields/number.ts +1 -1
- package/src/fields/portable-text.ts +1 -1
- package/src/fields/richtext.ts +1 -1
- package/src/fields/select.ts +1 -1
- package/src/fields/slug.ts +1 -1
- package/src/fields/text.ts +1 -1
- package/src/fields/textarea.ts +1 -1
- package/src/fields/types.ts +2 -2
- package/src/i18n/resolve.ts +44 -4
- package/src/index.ts +39 -3
- package/src/loader.ts +96 -12
- package/src/mcp/server.ts +251 -29
- package/src/media/image-endpoint.ts +5 -2
- package/src/media/normalize.ts +15 -4
- package/src/media/responsive.ts +23 -0
- package/src/media/usage/cleanup.ts +9 -8
- package/src/media/usage/content-refresh.ts +2 -1
- package/src/menus/index.ts +33 -21
- package/src/object-cache/index.ts +44 -2
- package/src/page/seo-contributions.ts +78 -1
- package/src/page/seo-panel.ts +47 -0
- package/src/plugin-types.ts +27 -1
- package/src/plugins/conditional-storage.ts +30 -0
- package/src/plugins/context.ts +49 -17
- package/src/plugins/hooks.ts +10 -1
- package/src/plugins/index.ts +15 -0
- package/src/plugins/manager.ts +6 -2
- package/src/plugins/manifest-schema.ts +1 -1
- package/src/plugins/routes.ts +3 -1
- package/src/plugins/sandbox/hook-result.ts +52 -0
- package/src/plugins/sandbox/index.ts +10 -0
- package/src/plugins/sandbox/types.ts +16 -2
- package/src/plugins/storage-query.ts +45 -0
- package/src/plugins/storage-update.ts +96 -0
- package/src/plugins/types.ts +120 -0
- package/src/query.ts +29 -3
- package/src/registry/artifact-checksum.ts +15 -0
- package/src/registry/artifact-verification.ts +85 -0
- package/src/registry/authoritative-records.ts +180 -0
- package/src/registry/config.ts +130 -27
- package/src/registry/record-labels.ts +28 -0
- package/src/registry/types.ts +5 -6
- package/src/schema/collection-slugs-cache.ts +157 -0
- package/src/schema/registry.ts +45 -3
- package/src/schema/types.ts +25 -6
- package/src/schema/zod-generator.ts +16 -13
- package/src/security/ssrf.ts +172 -143
- package/src/seed/apply.ts +4 -0
- package/src/seed/types.ts +7 -2
- package/src/seed/validate.ts +18 -1
- package/src/seo/hreflang.ts +1 -0
- package/src/seo/index.ts +5 -10
- package/src/seo/media-url.ts +26 -0
- package/src/settings/index.ts +16 -0
- package/src/storage/local.ts +1 -0
- package/src/storage/s3.ts +2 -0
- package/src/storage/types.ts +2 -0
- package/src/taxonomies/index.ts +40 -20
- package/src/taxonomies/term-counts.ts +22 -5
- package/src/widgets/archives.ts +67 -0
- package/src/widgets/index.ts +16 -0
- package/dist/api-B0w3uBiG.mjs +0 -2269
- package/dist/api-B0w3uBiG.mjs.map +0 -1
- package/dist/apply-B_VMpJ2P.mjs.map +0 -1
- package/dist/byline-Cpnwrje1.mjs.map +0 -1
- package/dist/challenge-store-D5pSY2S1.mjs.map +0 -1
- package/dist/content-CP-SeXNa.mjs.map +0 -1
- package/dist/content-refresh-DLOfIhYc.mjs.map +0 -1
- package/dist/context-BR5hRWiK.mjs.map +0 -1
- package/dist/dialect-helpers-BSbfaO3F.mjs.map +0 -1
- package/dist/errors-n2j49uNf.mjs.map +0 -1
- package/dist/index-DWbJrsAg.d.mts.map +0 -1
- package/dist/loader-ZsjE4paL.mjs.map +0 -1
- package/dist/manifest-schema-CUYPfCEH.mjs.map +0 -1
- package/dist/media-BjwNuLEu.mjs.map +0 -1
- package/dist/media-D6SeAfBl.mjs.map +0 -1
- package/dist/media-url-DH7giMx_.mjs.map +0 -1
- package/dist/menus-CNg0QlDt.mjs.map +0 -1
- package/dist/normalize-CSxdKBVa.mjs.map +0 -1
- package/dist/object-cache-71tPfV4A.mjs.map +0 -1
- package/dist/options-BHPeIbBd.mjs.map +0 -1
- package/dist/options-BhZIeFY1.d.mts.map +0 -1
- package/dist/query-D18vTdha.mjs.map +0 -1
- package/dist/redirect-CZkbozu9.mjs.map +0 -1
- package/dist/redirects-CRIM55KH.mjs.map +0 -1
- package/dist/registry-BiO5WwPq.mjs +0 -2716
- package/dist/registry-BiO5WwPq.mjs.map +0 -1
- package/dist/registry-Cx-jEJOS.mjs.map +0 -1
- package/dist/relations-BTPM2saV.mjs.map +0 -1
- package/dist/relations-C7B46bcU.d.mts.map +0 -1
- package/dist/resolve-DxUpTMmE.mjs.map +0 -1
- package/dist/runner-77GOZCnH.mjs.map +0 -1
- package/dist/runner-zgqA_CqP.d.mts.map +0 -1
- package/dist/seo-BSiTIXzd.mjs.map +0 -1
- package/dist/settings-BgN-0DT-.mjs.map +0 -1
- package/dist/snapshot-DSB8P7Lm.mjs.map +0 -1
- package/dist/ssrf-DqebVE34.mjs.map +0 -1
- package/dist/taxonomies-CPGxo-bn.mjs.map +0 -1
- package/dist/taxonomies-kmyudNGP.mjs.map +0 -1
- package/dist/types-75KIqzL9.mjs.map +0 -1
- package/dist/types-Br-ERaxh.d.mts.map +0 -1
- package/dist/types-D6OcIp2P.mjs +0 -3
- package/dist/types-DHxzBjbD.d.mts.map +0 -1
- package/dist/types-DJQxln7q.d.mts.map +0 -1
- package/dist/types-D_DWe7k9.d.mts.map +0 -1
- package/dist/types-Vg6f5i3s.d.mts.map +0 -1
- package/dist/validate-Dd-IUjnZ.mjs.map +0 -1
- package/dist/validate-DlqdOZXB.d.mts.map +0 -1
- package/dist/version-ri-sCyAp.mjs +0 -7
- package/dist/widgets-CpmZd9Q-.mjs.map +0 -1
- package/dist/zod-generator-DylzusHh.mjs.map +0 -1
- /package/dist/{api-tokens-B5NHLNUN.mjs → api-tokens-B_lfpmH3.mjs} +0 -0
- /package/dist/{ssrf-BPKzkm6O.mjs → ssrf-TQhaljuI.mjs} +0 -0
package/src/menus/index.ts
CHANGED
|
@@ -11,11 +11,13 @@
|
|
|
11
11
|
import type { Kysely } from "kysely";
|
|
12
12
|
import { sql } from "kysely";
|
|
13
13
|
|
|
14
|
+
import { menuTag } from "../cache/chrome-tags.js";
|
|
14
15
|
import type { Database } from "../database/types.js";
|
|
15
16
|
import { validateIdentifier } from "../database/validate.js";
|
|
16
|
-
import { resolveLocale, resolveLocaleChain } from "../i18n/resolve.js";
|
|
17
|
+
import { interpolateUrlPattern, resolveLocale, resolveLocaleChain } from "../i18n/resolve.js";
|
|
17
18
|
import { getDb } from "../loader.js";
|
|
18
19
|
import { cachedQuery, CacheNamespace } from "../object-cache/index.js";
|
|
20
|
+
import type { CacheHint } from "../query.js";
|
|
19
21
|
import { requestCached } from "../request-cache.js";
|
|
20
22
|
import { chunks, SQL_BATCH_SIZE } from "../utils/chunks.js";
|
|
21
23
|
import { sanitizeHref } from "../utils/url.js";
|
|
@@ -126,6 +128,20 @@ export async function getMenusWithDb(
|
|
|
126
128
|
return query.execute();
|
|
127
129
|
}
|
|
128
130
|
|
|
131
|
+
/**
|
|
132
|
+
* Get a menu by name with a Workers edge-cache hint.
|
|
133
|
+
*
|
|
134
|
+
* Use the returned `cacheHint` with `Astro.cache.set()` so pages that render
|
|
135
|
+
* this menu can be purged automatically when the menu is edited.
|
|
136
|
+
*/
|
|
137
|
+
export async function getMenuWithCacheHint(
|
|
138
|
+
name: string,
|
|
139
|
+
options: MenuQueryOptions = {},
|
|
140
|
+
): Promise<{ data: Menu | null; cacheHint: CacheHint }> {
|
|
141
|
+
const data = await getMenu(name, options);
|
|
142
|
+
return { data, cacheHint: { tags: [menuTag(name)] } };
|
|
143
|
+
}
|
|
144
|
+
|
|
129
145
|
/**
|
|
130
146
|
* Build a hierarchical menu tree from a flat list of items. Items are
|
|
131
147
|
* resolved against the given `locale` so references land on the right
|
|
@@ -316,21 +332,10 @@ function resolveMenuItem(
|
|
|
316
332
|
};
|
|
317
333
|
}
|
|
318
334
|
|
|
319
|
-
const SLUG_PLACEHOLDER = /\{slug\}/g;
|
|
320
|
-
const ID_PLACEHOLDER = /\{id\}/g;
|
|
321
|
-
|
|
322
|
-
/**
|
|
323
|
-
* Interpolate a URL pattern with entry data
|
|
324
|
-
*
|
|
325
|
-
* Replaces `{slug}` and `{id}` placeholders.
|
|
326
|
-
*/
|
|
327
|
-
function interpolateUrlPattern(pattern: string, slug: string, id: string): string {
|
|
328
|
-
return pattern.replace(SLUG_PLACEHOLDER, slug).replace(ID_PLACEHOLDER, id);
|
|
329
|
-
}
|
|
330
|
-
|
|
331
335
|
interface ContentReferenceRow {
|
|
332
336
|
id: string;
|
|
333
337
|
slug: string;
|
|
338
|
+
published_at: string | null;
|
|
334
339
|
locale: string;
|
|
335
340
|
translation_group: string;
|
|
336
341
|
}
|
|
@@ -338,6 +343,7 @@ interface ContentReferenceRow {
|
|
|
338
343
|
interface ResolvedContentReference {
|
|
339
344
|
id: string;
|
|
340
345
|
slug: string;
|
|
346
|
+
publishedAt: string | null;
|
|
341
347
|
}
|
|
342
348
|
|
|
343
349
|
type ContentReferenceLookup = Map<string, Map<string, ResolvedContentReference>>;
|
|
@@ -355,7 +361,7 @@ async function resolveContentReferences(
|
|
|
355
361
|
validateIdentifier(collection, "menu item collection");
|
|
356
362
|
for (const batch of chunks([...referenceGroups], SQL_BATCH_SIZE)) {
|
|
357
363
|
const result = await sql<ContentReferenceRow>`
|
|
358
|
-
SELECT id, slug, locale, translation_group
|
|
364
|
+
SELECT id, slug, published_at, locale, translation_group
|
|
359
365
|
FROM ${sql.ref(`ec_${collection}`)}
|
|
360
366
|
WHERE translation_group IN (${sql.join(batch)})
|
|
361
367
|
`.execute(db);
|
|
@@ -367,16 +373,18 @@ async function resolveContentReferences(
|
|
|
367
373
|
}
|
|
368
374
|
}
|
|
369
375
|
for (const [referenceGroup, row] of localized) {
|
|
370
|
-
lookup.set(referenceGroup, { id: row.id, slug: row.slug });
|
|
376
|
+
lookup.set(referenceGroup, { id: row.id, slug: row.slug, publishedAt: row.published_at });
|
|
371
377
|
}
|
|
372
378
|
|
|
373
379
|
const unresolved = [...referenceGroups].filter((id) => !lookup.has(id));
|
|
374
380
|
for (const batch of chunks(unresolved, SQL_BATCH_SIZE)) {
|
|
375
|
-
const result = await sql<
|
|
376
|
-
SELECT id, slug FROM ${sql.ref(`ec_${collection}`)}
|
|
381
|
+
const result = await sql<Pick<ContentReferenceRow, "id" | "slug" | "published_at">>`
|
|
382
|
+
SELECT id, slug, published_at FROM ${sql.ref(`ec_${collection}`)}
|
|
377
383
|
WHERE id IN (${sql.join(batch)})
|
|
378
384
|
`.execute(db);
|
|
379
|
-
for (const row of result.rows)
|
|
385
|
+
for (const row of result.rows) {
|
|
386
|
+
lookup.set(row.id, { id: row.id, slug: row.slug, publishedAt: row.published_at });
|
|
387
|
+
}
|
|
380
388
|
}
|
|
381
389
|
} catch (error) {
|
|
382
390
|
console.error(`Failed to resolve content URLs for ${collection}:`, error);
|
|
@@ -421,9 +429,13 @@ function resolveContentUrl(
|
|
|
421
429
|
if (!referenceGroup) return null;
|
|
422
430
|
const row = contentLookup.get(collection)?.get(referenceGroup);
|
|
423
431
|
if (!row) return null;
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
432
|
+
return interpolateUrlPattern({
|
|
433
|
+
pattern: urlPatterns.get(collection) ?? null,
|
|
434
|
+
collection,
|
|
435
|
+
slug: row.slug,
|
|
436
|
+
id: row.id,
|
|
437
|
+
date: row.publishedAt,
|
|
438
|
+
});
|
|
427
439
|
}
|
|
428
440
|
|
|
429
441
|
interface TaxonomyReferenceRow {
|
|
@@ -46,6 +46,8 @@ interface BackendHolder {
|
|
|
46
46
|
backend: ObjectCacheBackend | null;
|
|
47
47
|
/** In-flight initialization promise (dedupes concurrent first calls). */
|
|
48
48
|
initPromise: Promise<ObjectCacheBackend | null> | null;
|
|
49
|
+
/** `Date.now()` when the in-flight initialization started. */
|
|
50
|
+
initPromiseAt?: number;
|
|
49
51
|
config: Required<Pick<ObjectCacheRuntimeConfig, "keyPrefix">> & {
|
|
50
52
|
defaultTtl: number;
|
|
51
53
|
revalidate: number;
|
|
@@ -128,6 +130,18 @@ function raceInFlightEpochRead(
|
|
|
128
130
|
return Promise.race([promise, timeout]).finally(() => clearTimeout(timer));
|
|
129
131
|
}
|
|
130
132
|
|
|
133
|
+
/** Bound a waiter on another request's backend initialization. */
|
|
134
|
+
function raceInFlightBackendInit(
|
|
135
|
+
promise: Promise<ObjectCacheBackend | null>,
|
|
136
|
+
ms: number,
|
|
137
|
+
): Promise<ObjectCacheBackend | null> {
|
|
138
|
+
let timer: ReturnType<typeof setTimeout>;
|
|
139
|
+
const timeout = new Promise<ObjectCacheBackend | null>((resolve) => {
|
|
140
|
+
timer = setTimeout(resolve, Math.max(ms, 1), null);
|
|
141
|
+
});
|
|
142
|
+
return Promise.race([promise, timeout]).finally(() => clearTimeout(timer));
|
|
143
|
+
}
|
|
144
|
+
|
|
131
145
|
const BACKEND_KEY = Symbol.for("emdash:object-cache:backend");
|
|
132
146
|
const EPOCH_KEY = Symbol.for("emdash:object-cache:epochs");
|
|
133
147
|
const PENDING_KEY = Symbol.for("emdash:object-cache:pending-bumps");
|
|
@@ -215,8 +229,15 @@ const contentWritePersist: { pending: boolean } =
|
|
|
215
229
|
*/
|
|
216
230
|
async function getBackend(): Promise<ObjectCacheBackend | null> {
|
|
217
231
|
if (holder.initialized) return holder.backend;
|
|
218
|
-
if (holder.initPromise)
|
|
232
|
+
if (holder.initPromise) {
|
|
233
|
+
const age = Date.now() - (holder.initPromiseAt ?? 0);
|
|
234
|
+
const deadline = epochReadDeadline();
|
|
235
|
+
if (age < deadline) {
|
|
236
|
+
return raceInFlightBackendInit(holder.initPromise, deadline - age);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
219
239
|
|
|
240
|
+
holder.initPromiseAt = Date.now();
|
|
220
241
|
holder.initPromise = (async () => {
|
|
221
242
|
try {
|
|
222
243
|
const mod: {
|
|
@@ -258,10 +279,19 @@ async function getBackend(): Promise<ObjectCacheBackend | null> {
|
|
|
258
279
|
}
|
|
259
280
|
holder.initialized = true;
|
|
260
281
|
holder.initPromise = null;
|
|
282
|
+
holder.initPromiseAt = undefined;
|
|
261
283
|
return holder.backend;
|
|
262
284
|
})();
|
|
263
285
|
|
|
264
|
-
|
|
286
|
+
const started = holder.initPromise;
|
|
287
|
+
after(() =>
|
|
288
|
+
started.then(
|
|
289
|
+
() => undefined,
|
|
290
|
+
() => undefined,
|
|
291
|
+
),
|
|
292
|
+
);
|
|
293
|
+
|
|
294
|
+
return started;
|
|
265
295
|
}
|
|
266
296
|
|
|
267
297
|
/**
|
|
@@ -278,6 +308,7 @@ export function __setObjectCacheBackendForTests(
|
|
|
278
308
|
): void {
|
|
279
309
|
holder.initialized = true;
|
|
280
310
|
holder.initPromise = null;
|
|
311
|
+
holder.initPromiseAt = undefined;
|
|
281
312
|
holder.backend = backend;
|
|
282
313
|
holder.config = { ...holder.config, ...config };
|
|
283
314
|
epochCache.clear();
|
|
@@ -288,6 +319,17 @@ export function __setObjectCacheBackendForTests(
|
|
|
288
319
|
contentWritePersist.pending = false;
|
|
289
320
|
}
|
|
290
321
|
|
|
322
|
+
/** @internal */
|
|
323
|
+
export function __setObjectCacheBackendInitForTests(
|
|
324
|
+
promise: Promise<ObjectCacheBackend | null>,
|
|
325
|
+
startedAt: number,
|
|
326
|
+
): void {
|
|
327
|
+
holder.initialized = false;
|
|
328
|
+
holder.backend = null;
|
|
329
|
+
holder.initPromise = promise;
|
|
330
|
+
holder.initPromiseAt = startedAt;
|
|
331
|
+
}
|
|
332
|
+
|
|
291
333
|
/** Build the backend key for a namespace's epoch anchor. */
|
|
292
334
|
function epochKey(namespace: string): string {
|
|
293
335
|
return `${holder.config.keyPrefix}:epoch:${namespace}`;
|
|
@@ -5,15 +5,22 @@
|
|
|
5
5
|
* `[...plugin, ...site, ...base]` and feeds it to `resolvePageMetadata()`,
|
|
6
6
|
* which is first-wins. That ordering means plugin contributions override
|
|
7
7
|
* site-level ones override base ones for any given key — base values are
|
|
8
|
-
* the fallback, not the source of truth.
|
|
8
|
+
* the fallback, not the source of truth. For content pages, the entry's
|
|
9
|
+
* SEO panel values are overlaid onto the page context before the base
|
|
10
|
+
* contributions (and JSON-LD) are generated, so editor-set values
|
|
11
|
+
* override the template-provided fields.
|
|
9
12
|
*
|
|
10
13
|
* This replaces the per-template SEO.astro components, eliminating
|
|
11
14
|
* the class of XSS bugs where templates hand-rolled JSON-LD serialization.
|
|
12
15
|
*/
|
|
13
16
|
|
|
17
|
+
import type { ContentSeo } from "../database/repositories/types.js";
|
|
14
18
|
import type { PageMetadataContribution, PublicPageContext } from "../plugins/types.js";
|
|
19
|
+
import { buildSeoImageUrl, resolveSeoCanonicalUrl } from "../seo/media-url.js";
|
|
20
|
+
import { getSiteSettings } from "../settings/index.js";
|
|
15
21
|
import type { SeoSettings } from "../settings/types.js";
|
|
16
22
|
import { buildBlogPostingJsonLd, buildWebSiteJsonLd } from "./jsonld.js";
|
|
23
|
+
import { peekSeoPanel } from "./seo-panel.js";
|
|
17
24
|
|
|
18
25
|
/**
|
|
19
26
|
* Generate base metadata contributions from a page context's SEO data.
|
|
@@ -147,6 +154,76 @@ export function generateBaseSeoContributions(
|
|
|
147
154
|
return contributions;
|
|
148
155
|
}
|
|
149
156
|
|
|
157
|
+
/**
|
|
158
|
+
* Resolve the page context for rendering: overlay the entry's SEO panel
|
|
159
|
+
* values when they were primed for this request.
|
|
160
|
+
*
|
|
161
|
+
* Used by `<EmDashHead>`, `<EmDashBodyStart>`, and `<EmDashBodyEnd>` so
|
|
162
|
+
* head tags, JSON-LD, and every plugin hook — head and body fragments
|
|
163
|
+
* alike — see the same overlaid context. Returns the context unchanged
|
|
164
|
+
* for non-content pages or when nothing was primed. The peek is a
|
|
165
|
+
* request-cache read; site settings are only consulted when a panel
|
|
166
|
+
* exists (and are request-cached themselves), so this adds no queries.
|
|
167
|
+
*/
|
|
168
|
+
export async function resolveSeoPanelPage(
|
|
169
|
+
page: PublicPageContext,
|
|
170
|
+
siteUrl?: string,
|
|
171
|
+
): Promise<PublicPageContext> {
|
|
172
|
+
if (!page.content) return page;
|
|
173
|
+
const seo = await peekSeoPanel(page.content.collection, page.content.id);
|
|
174
|
+
if (!seo) return page;
|
|
175
|
+
const resolvedSiteUrl =
|
|
176
|
+
siteUrl ||
|
|
177
|
+
page.siteUrl ||
|
|
178
|
+
(await getSiteSettings()).url ||
|
|
179
|
+
(URL.canParse(page.url) ? new URL(page.url).origin : "");
|
|
180
|
+
return applySeoPanelToPageContext(page, seo, { siteUrl: resolvedSiteUrl });
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Overlay a content entry's SEO panel data onto the page context.
|
|
185
|
+
*
|
|
186
|
+
* `<EmDashHead>` applies this overlay before anything consumes the context:
|
|
187
|
+
* editor-set panel values override whatever the template passed in, and
|
|
188
|
+
* because the overlaid context feeds plugin hooks, the base contributions,
|
|
189
|
+
* and the JSON-LD builders alike, structured data and head tags always
|
|
190
|
+
* agree. Plugins still override the rendered output via first-wins dedup.
|
|
191
|
+
*
|
|
192
|
+
* The `<title>` element itself stays the template's responsibility —
|
|
193
|
+
* head components can't replace it — so `seo.title` feeds
|
|
194
|
+
* `og:title` / `twitter:title` / the JSON-LD headline only. Templates that
|
|
195
|
+
* want the panel title in `<title>` keep using `getSeoMeta()`.
|
|
196
|
+
*
|
|
197
|
+
* Unset panel fields fall back to the template-provided values, so pages
|
|
198
|
+
* without SEO data are unaffected.
|
|
199
|
+
*/
|
|
200
|
+
export function applySeoPanelToPageContext(
|
|
201
|
+
page: PublicPageContext,
|
|
202
|
+
seo: ContentSeo,
|
|
203
|
+
options: { siteUrl?: string | null } = {},
|
|
204
|
+
): PublicPageContext {
|
|
205
|
+
const siteUrl = options.siteUrl ?? undefined;
|
|
206
|
+
const image = seo.image ? buildSeoImageUrl(seo.image, siteUrl) : null;
|
|
207
|
+
const canonical = seo.canonical ? resolveSeoCanonicalUrl(seo.canonical, siteUrl) : null;
|
|
208
|
+
|
|
209
|
+
return {
|
|
210
|
+
...page,
|
|
211
|
+
description: seo.description || page.description,
|
|
212
|
+
canonical: canonical || page.canonical,
|
|
213
|
+
// Mirror the resolved image into the top-level field too, so consumers
|
|
214
|
+
// reading page.image (e.g. page:metadata hooks) agree with og:image and
|
|
215
|
+
// the JSON-LD graph.
|
|
216
|
+
image: image || page.image,
|
|
217
|
+
seo: {
|
|
218
|
+
...page.seo,
|
|
219
|
+
ogTitle: seo.title || page.seo?.ogTitle,
|
|
220
|
+
ogDescription: seo.description || page.seo?.ogDescription,
|
|
221
|
+
ogImage: image || page.seo?.ogImage,
|
|
222
|
+
robots: seo.noIndex ? "noindex, nofollow" : page.seo?.robots,
|
|
223
|
+
},
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
|
|
150
227
|
/**
|
|
151
228
|
* Generate site-level SEO metadata contributions from SiteSettings.seo.
|
|
152
229
|
*
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request-scoped hand-off of SEO panel data from the entry query to the
|
|
3
|
+
* render components.
|
|
4
|
+
*
|
|
5
|
+
* The loader's single-entry path already folds the `_emdash_seo` row into
|
|
6
|
+
* the entry query as a JSON subselect, so the panel data is in hand when an
|
|
7
|
+
* entry is fetched — it primes this cache, and `<EmDashHead>` (plus the body
|
|
8
|
+
* fragment components) pick the data up with a plain map read. No code path
|
|
9
|
+
* here ever queries the database.
|
|
10
|
+
*
|
|
11
|
+
* Kept as a leaf module (request-cache only) so the loader and the query
|
|
12
|
+
* layer can prime without importing the page-context machinery, which pulls
|
|
13
|
+
* in site settings and would create an import cycle back into the loader.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type { ContentSeo } from "../database/repositories/types.js";
|
|
17
|
+
import { peekRequestCache, setRequestCacheEntry } from "../request-cache.js";
|
|
18
|
+
|
|
19
|
+
function seoPanelCacheKey(collection: string, id: string): string {
|
|
20
|
+
return `seo-panel:${collection}:${id}`;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Prime the request-scoped SEO panel cache for a content entry.
|
|
25
|
+
*
|
|
26
|
+
* Called wherever an entry's folded SEO data materializes: the loader's
|
|
27
|
+
* single-entry path (fresh query) and the object-cache revive path in
|
|
28
|
+
* `getEmDashEntry` (warm hit, where the loader never runs). No-ops outside
|
|
29
|
+
* a request context; never overwrites an already-primed value.
|
|
30
|
+
*/
|
|
31
|
+
export function primeSeoPanel(collection: string, id: string, seo: ContentSeo): void {
|
|
32
|
+
setRequestCacheEntry(seoPanelCacheKey(collection, id), seo);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Read the SEO panel data primed for a content entry in this request.
|
|
37
|
+
*
|
|
38
|
+
* Returns `null` when nothing was primed — either the entry has no SEO
|
|
39
|
+
* row, or it was not fetched through an EmDash loader in this request
|
|
40
|
+
* (e.g. prerendered pages, or a hand-rolled query). Callers treat null as
|
|
41
|
+
* "no overlay"; this never falls back to a database lookup, so the
|
|
42
|
+
* logged-out hot path gains zero queries.
|
|
43
|
+
*/
|
|
44
|
+
export async function peekSeoPanel(collection: string, id: string): Promise<ContentSeo | null> {
|
|
45
|
+
const primed = peekRequestCache<ContentSeo>(seoPanelCacheKey(collection, id));
|
|
46
|
+
return primed ? await primed : null;
|
|
47
|
+
}
|
package/src/plugin-types.ts
CHANGED
|
@@ -41,7 +41,9 @@
|
|
|
41
41
|
import type { Permission } from "@emdash-cms/auth";
|
|
42
42
|
import type { ZodType } from "zod";
|
|
43
43
|
|
|
44
|
+
import type { SandboxHookErrorEnvelope } from "./plugins/sandbox/hook-result.js";
|
|
44
45
|
import type {
|
|
46
|
+
ActorInfo,
|
|
45
47
|
CommentAfterCreateEvent,
|
|
46
48
|
CommentAfterCreateHandler,
|
|
47
49
|
CommentAfterModerateEvent,
|
|
@@ -240,12 +242,29 @@ export interface SandboxedMcpTool {
|
|
|
240
242
|
*/
|
|
241
243
|
export interface SandboxedPlugin {
|
|
242
244
|
hooks?: {
|
|
243
|
-
[K in keyof HookHandlers]?:
|
|
245
|
+
[K in keyof HookHandlers]?: K extends "content:beforeSave"
|
|
246
|
+
? SandboxedContentBeforeSaveHandler | SandboxedContentBeforeSaveConfig
|
|
247
|
+
: HookEntry<K>;
|
|
244
248
|
};
|
|
245
249
|
routes?: Record<string, RouteEntry>;
|
|
246
250
|
mcp?: { tools: Record<string, SandboxedMcpTool> };
|
|
247
251
|
}
|
|
248
252
|
|
|
253
|
+
export type SandboxedContentBeforeSaveHandler = (
|
|
254
|
+
event: ContentHookEvent,
|
|
255
|
+
ctx: PluginContext,
|
|
256
|
+
) => Promise<Record<string, unknown> | SandboxHookErrorEnvelope | void>;
|
|
257
|
+
|
|
258
|
+
export interface SandboxedContentBeforeSaveConfig extends Omit<
|
|
259
|
+
HookConfig<"content:beforeSave">,
|
|
260
|
+
"handler"
|
|
261
|
+
> {
|
|
262
|
+
handler: SandboxedContentBeforeSaveHandler;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
export type { SandboxHookErrorEnvelope };
|
|
266
|
+
export type { NumericDelta, UpdateIfArgs, UpdateIfResult } from "./plugins/types.js";
|
|
267
|
+
|
|
249
268
|
/**
|
|
250
269
|
* Re-export of event types so plugin authors can reference them
|
|
251
270
|
* explicitly when needed (helper functions, type predicates). Most
|
|
@@ -255,6 +274,7 @@ export interface SandboxedPlugin {
|
|
|
255
274
|
* portable `.d.mts`.
|
|
256
275
|
*/
|
|
257
276
|
export type {
|
|
277
|
+
ActorInfo,
|
|
258
278
|
CommentAfterCreateEvent,
|
|
259
279
|
CommentAfterModerateEvent,
|
|
260
280
|
CommentBeforeCreateEvent,
|
|
@@ -277,3 +297,9 @@ export type {
|
|
|
277
297
|
PluginContext,
|
|
278
298
|
UninstallEvent,
|
|
279
299
|
};
|
|
300
|
+
|
|
301
|
+
export type {
|
|
302
|
+
VersionedValue,
|
|
303
|
+
ConditionalWriteResult,
|
|
304
|
+
ConditionalDeleteResult,
|
|
305
|
+
} from "./plugins/types.js";
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const MAX_KEY_LENGTH = 1024;
|
|
2
|
+
const MAX_REVISION_LENGTH = 128;
|
|
3
|
+
const MAX_VALUE_BYTES = 1024 * 1024;
|
|
4
|
+
|
|
5
|
+
export function assertStorageKey(key: unknown, maxLength = MAX_KEY_LENGTH): asserts key is string {
|
|
6
|
+
if (typeof key !== "string" || key.length === 0 || key.length > maxLength) {
|
|
7
|
+
throw new TypeError(`Storage key must be a nonempty string of at most ${maxLength} characters`);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function assertStorageRevision(revision: unknown): asserts revision is string {
|
|
12
|
+
if (
|
|
13
|
+
typeof revision !== "string" ||
|
|
14
|
+
revision.length === 0 ||
|
|
15
|
+
revision.length > MAX_REVISION_LENGTH
|
|
16
|
+
) {
|
|
17
|
+
throw new TypeError("Storage revision must be a nonempty string of at most 128 characters");
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function serializeConditionalValue(value: unknown): string {
|
|
22
|
+
const serialized = JSON.stringify(value);
|
|
23
|
+
if (serialized === undefined) {
|
|
24
|
+
throw new TypeError("Storage value must be JSON serializable");
|
|
25
|
+
}
|
|
26
|
+
if (new TextEncoder().encode(serialized).byteLength > MAX_VALUE_BYTES) {
|
|
27
|
+
throw new TypeError("Conditional storage value must not exceed 1 MiB of JSON");
|
|
28
|
+
}
|
|
29
|
+
return serialized;
|
|
30
|
+
}
|
package/src/plugins/context.ts
CHANGED
|
@@ -9,6 +9,7 @@ import type { Kysely } from "kysely";
|
|
|
9
9
|
import { ulid } from "ulidx";
|
|
10
10
|
|
|
11
11
|
import { ContentRepository } from "../database/repositories/content.js";
|
|
12
|
+
import { EntryLockRepository } from "../database/repositories/entry-locks.js";
|
|
12
13
|
import { MediaRepository } from "../database/repositories/media.js";
|
|
13
14
|
import { OptionsRepository } from "../database/repositories/options.js";
|
|
14
15
|
import { PluginStorageRepository } from "../database/repositories/plugin-storage.js";
|
|
@@ -27,6 +28,7 @@ import { enrichImageMetadata } from "../media/enrich.js";
|
|
|
27
28
|
import { markContentMediaUsageCollectionStaleSafely } from "../media/usage/content-refresh.js";
|
|
28
29
|
import { invalidateSiteSettingsCache } from "../settings/index.js";
|
|
29
30
|
import type { Storage } from "../storage/types.js";
|
|
31
|
+
import { assertStorageKey } from "./conditional-storage.js";
|
|
30
32
|
import { CronAccessImpl } from "./cron.js";
|
|
31
33
|
import type { EmailPipeline } from "./email.js";
|
|
32
34
|
import type {
|
|
@@ -76,6 +78,18 @@ export function createKVAccess(optionsRepo: OptionsRepository, pluginId: string)
|
|
|
76
78
|
async get<T>(key: string): Promise<T | null> {
|
|
77
79
|
return optionsRepo.get<T>(`${prefix}${key}`);
|
|
78
80
|
},
|
|
81
|
+
async getVersioned<T>(key: string) {
|
|
82
|
+
assertStorageKey(key);
|
|
83
|
+
return optionsRepo.getVersioned<T>(`${prefix}${key}`);
|
|
84
|
+
},
|
|
85
|
+
async compareAndSet(key, expectedRevision, value) {
|
|
86
|
+
assertStorageKey(key);
|
|
87
|
+
return optionsRepo.compareAndSet(`${prefix}${key}`, expectedRevision, value);
|
|
88
|
+
},
|
|
89
|
+
async compareAndDelete(key, expectedRevision) {
|
|
90
|
+
assertStorageKey(key);
|
|
91
|
+
return optionsRepo.compareAndDelete(`${prefix}${key}`, expectedRevision);
|
|
92
|
+
},
|
|
79
93
|
|
|
80
94
|
async set(key: string, value: unknown): Promise<void> {
|
|
81
95
|
await optionsRepo.set(`${prefix}${key}`, value);
|
|
@@ -118,6 +132,9 @@ function createStorageCollection<T>(
|
|
|
118
132
|
|
|
119
133
|
return {
|
|
120
134
|
get: (id) => repo.get(id),
|
|
135
|
+
getVersioned: (id) => repo.getVersioned(id),
|
|
136
|
+
compareAndSet: (id, expectedRevision, data) => repo.compareAndSet(id, expectedRevision, data),
|
|
137
|
+
compareAndDelete: (id, expectedRevision) => repo.compareAndDelete(id, expectedRevision),
|
|
121
138
|
put: (id, data) => repo.put(id, data),
|
|
122
139
|
delete: (id) => repo.delete(id),
|
|
123
140
|
exists: (id) => repo.exists(id),
|
|
@@ -125,6 +142,7 @@ function createStorageCollection<T>(
|
|
|
125
142
|
putMany: (items) => repo.putMany(items),
|
|
126
143
|
deleteMany: (ids) => repo.deleteMany(ids),
|
|
127
144
|
count: (where) => repo.count(where),
|
|
145
|
+
updateIf: (id, updateArgs) => repo.updateIf(id, updateArgs),
|
|
128
146
|
|
|
129
147
|
// Query returns PaginatedResult instead of the old format
|
|
130
148
|
async query(options?: QueryOptions): Promise<PaginatedResult<{ id: string; data: T }>> {
|
|
@@ -500,6 +518,9 @@ export function createContentAccessWithWrite(
|
|
|
500
518
|
const contentRepo = new ContentRepository(db);
|
|
501
519
|
const deleted = await contentRepo.delete(collection, id);
|
|
502
520
|
if (deleted) {
|
|
521
|
+
// A trashed entry can no longer be opened, so its holder can never
|
|
522
|
+
// release the lease itself. Mirrors handleContentDelete.
|
|
523
|
+
await new EntryLockRepository(db).releaseEntry(collection, id);
|
|
503
524
|
await markContentMediaUsageCollectionStaleSafely(db, collection, "CONTENT_USAGE_STALE");
|
|
504
525
|
}
|
|
505
526
|
return deleted;
|
|
@@ -706,11 +727,31 @@ function isHostAllowed(host: string, allowedHosts: string[]): boolean {
|
|
|
706
727
|
});
|
|
707
728
|
}
|
|
708
729
|
|
|
730
|
+
function tryParsePluginHttpTarget(url: string): URL | null {
|
|
731
|
+
try {
|
|
732
|
+
return new URL(url);
|
|
733
|
+
} catch {
|
|
734
|
+
return null;
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
async function validatePluginHttpTarget(pluginId: string, url: string): Promise<URL> {
|
|
739
|
+
try {
|
|
740
|
+
return await resolveAndValidateExternalUrl(url);
|
|
741
|
+
} catch (error) {
|
|
742
|
+
const message = error instanceof SsrfError ? error.message : "SSRF validation failed";
|
|
743
|
+
const target = tryParsePluginHttpTarget(url);
|
|
744
|
+
throw new Error(
|
|
745
|
+
`Plugin "${pluginId}": blocked fetch to "${target ? target.hostname : "invalid URL"}": ${message}`,
|
|
746
|
+
{ cause: error },
|
|
747
|
+
);
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
|
|
709
751
|
/**
|
|
710
|
-
* Create HTTP access with host validation.
|
|
752
|
+
* Create HTTP access with host validation and SSRF protection.
|
|
711
753
|
*
|
|
712
|
-
* Uses redirect: "manual" to re-validate each redirect target
|
|
713
|
-
* the allowedHosts list, preventing redirects to unauthorized hosts.
|
|
754
|
+
* Uses redirect: "manual" to re-validate each redirect target before dispatch.
|
|
714
755
|
*/
|
|
715
756
|
export function createHttpAccess(pluginId: string, allowedHosts: string[]): HttpAccess {
|
|
716
757
|
return {
|
|
@@ -727,13 +768,14 @@ export function createHttpAccess(pluginId: string, allowedHosts: string[]): Http
|
|
|
727
768
|
let currentInit = init;
|
|
728
769
|
|
|
729
770
|
for (let i = 0; i <= MAX_PLUGIN_REDIRECTS; i++) {
|
|
730
|
-
const
|
|
731
|
-
if (!isHostAllowed(hostname, allowedHosts)) {
|
|
771
|
+
const target = tryParsePluginHttpTarget(currentUrl);
|
|
772
|
+
if (target && !isHostAllowed(target.hostname, allowedHosts)) {
|
|
732
773
|
throw new Error(
|
|
733
|
-
`Plugin "${pluginId}" is not allowed to fetch from host "${hostname}". ` +
|
|
774
|
+
`Plugin "${pluginId}" is not allowed to fetch from host "${target.hostname}". ` +
|
|
734
775
|
`Allowed hosts: ${allowedHosts.join(", ")}`,
|
|
735
776
|
);
|
|
736
777
|
}
|
|
778
|
+
await validatePluginHttpTarget(pluginId, currentUrl);
|
|
737
779
|
|
|
738
780
|
const response = await globalThis.fetch(currentUrl, {
|
|
739
781
|
...currentInit,
|
|
@@ -778,17 +820,7 @@ export function createUnrestrictedHttpAccess(pluginId: string): HttpAccess {
|
|
|
778
820
|
let currentInit = init;
|
|
779
821
|
|
|
780
822
|
for (let i = 0; i <= MAX_PLUGIN_REDIRECTS; i++) {
|
|
781
|
-
|
|
782
|
-
// endpoints, wildcard DNS, resolved-IP private ranges).
|
|
783
|
-
try {
|
|
784
|
-
await resolveAndValidateExternalUrl(currentUrl);
|
|
785
|
-
} catch (e) {
|
|
786
|
-
const msg = e instanceof SsrfError ? e.message : "SSRF validation failed";
|
|
787
|
-
throw new Error(
|
|
788
|
-
`Plugin "${pluginId}": blocked fetch to "${new URL(currentUrl).hostname}": ${msg}`,
|
|
789
|
-
{ cause: e },
|
|
790
|
-
);
|
|
791
|
-
}
|
|
823
|
+
await validatePluginHttpTarget(pluginId, currentUrl);
|
|
792
824
|
|
|
793
825
|
const response = await globalThis.fetch(currentUrl, {
|
|
794
826
|
...currentInit,
|
package/src/plugins/hooks.ts
CHANGED
|
@@ -15,6 +15,7 @@ import type {
|
|
|
15
15
|
ResolvedPlugin,
|
|
16
16
|
ResolvedHook,
|
|
17
17
|
PluginContext,
|
|
18
|
+
ActorInfo,
|
|
18
19
|
ContentHookEvent,
|
|
19
20
|
ContentDeleteEvent,
|
|
20
21
|
ContentStateChangeEvent,
|
|
@@ -487,12 +488,16 @@ export class HookPipeline {
|
|
|
487
488
|
|
|
488
489
|
/**
|
|
489
490
|
* Run content:beforeSave hooks
|
|
490
|
-
* Returns modified content from the pipeline
|
|
491
|
+
* Returns modified content from the pipeline. `id` is the existing item's
|
|
492
|
+
* ID when updating. `actor` is the authenticated user that triggered the
|
|
493
|
+
* save, when one is available.
|
|
491
494
|
*/
|
|
492
495
|
async runContentBeforeSave(
|
|
493
496
|
content: Record<string, unknown>,
|
|
494
497
|
collection: string,
|
|
495
498
|
isNew: boolean,
|
|
499
|
+
id?: string,
|
|
500
|
+
actor?: ActorInfo,
|
|
496
501
|
): Promise<{
|
|
497
502
|
content: Record<string, unknown>;
|
|
498
503
|
results: HookResult<Record<string, unknown>>[];
|
|
@@ -508,6 +513,8 @@ export class HookPipeline {
|
|
|
508
513
|
collection,
|
|
509
514
|
isNew,
|
|
510
515
|
};
|
|
516
|
+
if (id !== undefined) event.id = id;
|
|
517
|
+
if (actor !== undefined) event.actor = { ...actor };
|
|
511
518
|
const ctx = this.getContext(hook.pluginId);
|
|
512
519
|
const start = Date.now();
|
|
513
520
|
|
|
@@ -547,6 +554,7 @@ export class HookPipeline {
|
|
|
547
554
|
content: Record<string, unknown>,
|
|
548
555
|
collection: string,
|
|
549
556
|
isNew: boolean,
|
|
557
|
+
actor?: ActorInfo,
|
|
550
558
|
): Promise<HookResult<void>[]> {
|
|
551
559
|
const hooks = this.getTypedHooks("content:afterSave");
|
|
552
560
|
const results: HookResult<void>[] = [];
|
|
@@ -554,6 +562,7 @@ export class HookPipeline {
|
|
|
554
562
|
for (const hook of hooks) {
|
|
555
563
|
const { handler } = hook;
|
|
556
564
|
const event: ContentHookEvent = { content, collection, isNew };
|
|
565
|
+
if (actor !== undefined) event.actor = { ...actor };
|
|
557
566
|
const ctx = this.getContext(hook.pluginId);
|
|
558
567
|
const start = Date.now();
|
|
559
568
|
|
package/src/plugins/index.ts
CHANGED
|
@@ -78,6 +78,9 @@ export {
|
|
|
78
78
|
createSandboxRouteErrorEnvelope,
|
|
79
79
|
getSandboxRouteErrorDetails,
|
|
80
80
|
getSandboxRouteErrorEnvelope,
|
|
81
|
+
MAX_SANDBOX_SAVE_REJECTION_REASON_LENGTH,
|
|
82
|
+
SANDBOX_HOOK_RESULT_VERSION,
|
|
83
|
+
inspectSandboxHookResult,
|
|
81
84
|
createNoopSandboxRunner,
|
|
82
85
|
} from "./sandbox/index.js";
|
|
83
86
|
export type {
|
|
@@ -93,8 +96,13 @@ export type {
|
|
|
93
96
|
SandboxRouteErrorCode,
|
|
94
97
|
SandboxRouteErrorDetails,
|
|
95
98
|
SandboxRouteErrorEnvelope,
|
|
99
|
+
SandboxHookErrorEnvelope,
|
|
100
|
+
SandboxHookResultInspection,
|
|
101
|
+
SandboxSaveRejectedError,
|
|
96
102
|
} from "./sandbox/index.js";
|
|
97
103
|
|
|
104
|
+
export { StorageSerializationError } from "./storage-query.js";
|
|
105
|
+
|
|
98
106
|
// Types
|
|
99
107
|
export type {
|
|
100
108
|
// Core types
|
|
@@ -112,6 +120,12 @@ export type {
|
|
|
112
120
|
// Context APIs
|
|
113
121
|
PluginContext,
|
|
114
122
|
StorageCollection,
|
|
123
|
+
NumericDelta,
|
|
124
|
+
UpdateIfArgs,
|
|
125
|
+
UpdateIfResult,
|
|
126
|
+
VersionedValue,
|
|
127
|
+
ConditionalWriteResult,
|
|
128
|
+
ConditionalDeleteResult,
|
|
115
129
|
KVAccess,
|
|
116
130
|
ContentAccess,
|
|
117
131
|
ContentAccessWithWrite,
|
|
@@ -139,6 +153,7 @@ export type {
|
|
|
139
153
|
HookName,
|
|
140
154
|
ResolvedHook,
|
|
141
155
|
ResolvedPluginHooks,
|
|
156
|
+
ActorInfo,
|
|
142
157
|
ContentHookEvent,
|
|
143
158
|
ContentDeleteEvent,
|
|
144
159
|
ContentPublishStateChangeEvent,
|