emdash 0.35.0 → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/activation-K0kGBWuJ.mjs +382 -0
- package/dist/activation-K0kGBWuJ.mjs.map +1 -0
- package/dist/{adapters-Bb1vG41D.d.mts → adapters-BDQwg236.d.mts} +6 -4
- package/dist/{adapters-Bb1vG41D.d.mts.map → adapters-BDQwg236.d.mts.map} +1 -1
- package/dist/{allowed-origins-DW7sYyqg.mjs → allowed-origins-BGglilcs.mjs} +2 -2
- package/dist/{allowed-origins-DW7sYyqg.mjs.map → allowed-origins-BGglilcs.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -3
- package/dist/api/route-utils.mjs +23 -21
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +5 -5
- package/dist/api-Dz6rgoa3.mjs +10040 -0
- package/dist/api-Dz6rgoa3.mjs.map +1 -0
- package/dist/{api-tokens-KO24G1Fd.mjs → api-tokens-BSsQACNe.mjs} +2 -2
- package/dist/{api-tokens-KO24G1Fd.mjs.map → api-tokens-BSsQACNe.mjs.map} +1 -1
- package/dist/{apply-kUDt80-G.mjs → apply-B4SIOxR1.mjs} +34 -35
- package/dist/{apply-kUDt80-G.mjs.map → apply-B4SIOxR1.mjs.map} +1 -1
- package/dist/astro/image-endpoint.mjs +2 -2
- package/dist/astro/image-endpoint.mjs.map +1 -1
- package/dist/astro/index.d.mts +12 -12
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +128 -44
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +10 -10
- package/dist/astro/middleware/auth.d.mts.map +1 -1
- package/dist/astro/middleware/auth.mjs +10 -7
- package/dist/astro/middleware/auth.mjs.map +1 -1
- package/dist/astro/middleware/media-usage-write-fence.mjs +2 -2
- package/dist/astro/middleware/redirect.mjs +4 -4
- package/dist/astro/middleware/request-context.mjs +3 -3
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +11 -12
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +237 -1412
- 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 +16 -16
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +16 -16
- package/dist/astro/routes/api/admin/bylines/index.mjs +16 -16
- 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.d.mts +9 -0
- package/dist/astro/routes/api/admin/media-usage/activation.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/activation.mjs +46 -0
- package/dist/astro/routes/api/admin/media-usage/activation.mjs.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +14 -13
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +14 -13
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/progress.d.mts +9 -0
- package/dist/astro/routes/api/admin/media-usage/progress.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/progress.mjs +44 -0
- package/dist/astro/routes/api/admin/media-usage/progress.mjs.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +16 -11
- package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +14 -13
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +14 -13
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs.map +1 -1
- 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 +55 -49
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +55 -49
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +53 -47
- 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 +53 -47
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +54 -48
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +54 -48
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +53 -47
- 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 +53 -47
- 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 +54 -48
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +53 -47
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +54 -48
- 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 +60 -50
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +179 -139
- 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 +61 -51
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/verify.d.mts +8 -0
- package/dist/astro/routes/api/admin/plugins/registry/verify.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +93 -0
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -0
- package/dist/astro/routes/api/admin/plugins/updates.mjs +53 -47
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +53 -47
- 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 +53 -47
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +2 -2
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +1 -1
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +7 -7
- 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.d.mts.map +1 -1
- package/dist/astro/routes/api/auth/me.mjs +19 -9
- package/dist/astro/routes/api/auth/me.mjs.map +1 -1
- 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 +14 -5
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +11 -11
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +13 -10
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +17 -15
- 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 +17 -15
- 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.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +14 -14
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +14 -5
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/index.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/trash.mjs +7 -7
- package/dist/astro/routes/api/dashboard.mjs +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 +17 -17
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +2 -2
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/execute.mjs +13 -13
- 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 +9 -9
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +12 -10
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +17 -17
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +27 -27
- 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 +188 -65
- 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 +18 -13
- package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/media/_id_.mjs +21 -13
- package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
- 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_.d.mts +10 -0
- package/dist/astro/routes/api/media/folders/_id_.d.mts.map +1 -0
- package/dist/astro/routes/api/media/folders/_id_.mjs +52 -0
- package/dist/astro/routes/api/media/folders/_id_.mjs.map +1 -0
- package/dist/astro/routes/api/media/folders/index.d.mts +9 -0
- package/dist/astro/routes/api/media/folders/index.d.mts.map +1 -0
- package/dist/astro/routes/api/media/folders/index.mjs +41 -0
- package/dist/astro/routes/api/media/folders/index.mjs.map +1 -0
- 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 +59 -27
- 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 +253 -40
- 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 +10 -10
- package/dist/astro/routes/api/redirects/404s/summary.mjs +10 -10
- package/dist/astro/routes/api/redirects/_id_.mjs +11 -11
- package/dist/astro/routes/api/redirects/index.mjs +11 -11
- package/dist/astro/routes/api/relations/_id_/index.mjs +17 -15
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/translations.mjs +12 -10
- package/dist/astro/routes/api/relations/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/relations/index.mjs +17 -15
- 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 +53 -47
- 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 +53 -47
- 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 +53 -47
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +53 -47
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +53 -47
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/reorder.mjs +53 -47
- package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +10 -8
- package/dist/astro/routes/api/schema/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +53 -47
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +53 -47
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +10 -10
- package/dist/astro/routes/api/search/index.mjs +9 -9
- package/dist/astro/routes/api/search/rebuild.mjs +10 -10
- package/dist/astro/routes/api/search/stats.mjs +5 -5
- package/dist/astro/routes/api/search/suggest.mjs +9 -9
- package/dist/astro/routes/api/sections/_slug_.mjs +9 -9
- package/dist/astro/routes/api/sections/index.mjs +9 -9
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +6 -6
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +5 -5
- package/dist/astro/routes/api/settings/backups/export.mjs +6 -6
- package/dist/astro/routes/api/settings/backups/index.mjs +7 -7
- 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 +20 -16
- 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.d.mts.map +1 -1
- package/dist/astro/routes/api/setup/dev-bypass.mjs +35 -28
- 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 +32 -30
- 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 +7 -7
- package/dist/astro/routes/api/taxonomies/_name_/reorder.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +20 -16
- 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 +21 -17
- 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 +25 -18
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +20 -16
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +14 -14
- package/dist/astro/routes/api/taxonomies/_name_.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_.mjs +26 -19
- 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 +20 -16
- 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 +17 -13
- 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 +15 -12
- 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 +8 -6
- 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 +15 -12
- 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 +7 -7
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +10 -10
- package/dist/astro/routes/sitemap.xml.mjs +8 -8
- package/dist/astro/types.d.mts +37 -17
- package/dist/astro/types.d.mts.map +1 -1
- package/dist/auth/providers/github.d.mts +1 -1
- package/dist/auth/providers/google.d.mts +1 -1
- package/dist/{authorize-DUElxgOQ.mjs → authorize-Bkf_UHhD.mjs} +2 -2
- package/dist/{authorize-DUElxgOQ.mjs.map → authorize-Bkf_UHhD.mjs.map} +1 -1
- package/dist/{backup-DWYpJlLj.mjs → backup-rwVAl9NI.mjs} +5 -5
- package/dist/{backup-DWYpJlLj.mjs.map → backup-rwVAl9NI.mjs.map} +1 -1
- package/dist/{bundle-vn56sLos.mjs → bundle-C8S2Zl6U.mjs} +4 -4
- package/dist/{bundle-vn56sLos.mjs.map → bundle-C8S2Zl6U.mjs.map} +1 -1
- package/dist/{byline-yjvWq4ip.mjs → byline-DuhF7NWl.mjs} +27 -14
- package/dist/byline-DuhF7NWl.mjs.map +1 -0
- package/dist/{byline-fields-txaLGoME.mjs → byline-fields-BovY4KYM.mjs} +2 -2
- package/dist/{byline-fields-txaLGoME.mjs.map → byline-fields-BovY4KYM.mjs.map} +1 -1
- package/dist/{byline-registry-DDun8sxh.mjs → byline-registry-Bpu9-MVs.mjs} +2 -2
- package/dist/{byline-registry-DDun8sxh.mjs.map → byline-registry-Bpu9-MVs.mjs.map} +1 -1
- package/dist/{bylines-DjXS5p0P.mjs → bylines-CJ5nd6Lw.mjs} +7 -7
- package/dist/{bylines-DjXS5p0P.mjs.map → bylines-CJ5nd6Lw.mjs.map} +1 -1
- package/dist/{bylines-Bu7pchQ4.mjs → bylines-RwBAeOF1.mjs} +3 -3
- package/dist/{bylines-Bu7pchQ4.mjs.map → bylines-RwBAeOF1.mjs.map} +1 -1
- package/dist/{cache-C46-3Irl.mjs → cache-BF5Kvn59.mjs} +4 -4
- package/dist/{cache-C46-3Irl.mjs.map → cache-BF5Kvn59.mjs.map} +1 -1
- package/dist/capture-triggers-CNW1q3HK.mjs +362 -0
- package/dist/capture-triggers-CNW1q3HK.mjs.map +1 -0
- package/dist/{challenge-store-SIL5DsF2.mjs → challenge-store-DQN_Yrck.mjs} +5 -3
- package/dist/challenge-store-DQN_Yrck.mjs.map +1 -0
- package/dist/chrome-tags-D8fiZG94.mjs +24 -0
- package/dist/chrome-tags-D8fiZG94.mjs.map +1 -0
- package/dist/{chunks-fiZ8G9RJ.mjs → chunks-C4szrD8o.mjs} +2 -2
- package/dist/{chunks-fiZ8G9RJ.mjs.map → chunks-C4szrD8o.mjs.map} +1 -1
- package/dist/cli/index.mjs +37 -53
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +74 -4
- package/dist/client/index.d.mts.map +1 -1
- package/dist/client/index.mjs +54 -2
- package/dist/client/index.mjs.map +1 -1
- package/dist/{collection-deletion-DQPvMD8R.mjs → collection-deletion-Bj07NHbj.mjs} +13 -356
- package/dist/collection-deletion-Bj07NHbj.mjs.map +1 -0
- package/dist/{comment-reaction-D-2J84UE.mjs → comment-reaction-BhrvSHml.mjs} +2 -2
- package/dist/{comment-reaction-D-2J84UE.mjs.map → comment-reaction-BhrvSHml.mjs.map} +1 -1
- package/dist/{comment-Dxlep6cE.mjs → comment-vxOzWbZN.mjs} +2 -2
- package/dist/{comment-Dxlep6cE.mjs.map → comment-vxOzWbZN.mjs.map} +1 -1
- package/dist/{comments-CTfZtLmM.mjs → comments-Ct4ensnf.mjs} +2 -2
- package/dist/{comments-CTfZtLmM.mjs.map → comments-Ct4ensnf.mjs.map} +1 -1
- package/dist/{components-CQy3lh9x.mjs → components-DJbo1z0S.mjs} +1 -1
- package/dist/{components-CQy3lh9x.mjs.map → components-DJbo1z0S.mjs.map} +1 -1
- package/dist/{config-COQzTe5Q.d.mts → config-B9eZ340f.d.mts} +1 -1
- package/dist/{config-COQzTe5Q.d.mts.map → config-B9eZ340f.d.mts.map} +1 -1
- package/dist/config-it29yDLA.mjs +1163 -0
- package/dist/config-it29yDLA.mjs.map +1 -0
- package/dist/{content-ZHCc1ngN.mjs → content-DjvM0T92.mjs} +86 -45
- package/dist/content-DjvM0T92.mjs.map +1 -0
- package/dist/{content-list-query-wJ2WN8Vp.d.mts → content-list-query-Btqd4uV2.d.mts} +1 -1
- package/dist/{content-list-query-wJ2WN8Vp.d.mts.map → content-list-query-Btqd4uV2.d.mts.map} +1 -1
- package/dist/{content-refresh-B_8SJzuU.mjs → content-refresh-Bwp-8yGy.mjs} +1139 -111
- package/dist/content-refresh-Bwp-8yGy.mjs.map +1 -0
- package/dist/{media-usage-BZCydfvu.mjs → content-repair-Czdp7jz5.mjs} +5 -196
- package/dist/content-repair-Czdp7jz5.mjs.map +1 -0
- package/dist/{context-ZldbZcle.mjs → context-CX6gxOLW.mjs} +55 -20
- package/dist/context-CX6gxOLW.mjs.map +1 -0
- package/dist/{cron-Y9aLtgrA.mjs → cron-C6o7VppJ.mjs} +1 -1
- package/dist/{cron-Y9aLtgrA.mjs.map → cron-C6o7VppJ.mjs.map} +1 -1
- package/dist/{dashboard-DvHbk_cv.mjs → dashboard-C2kTeeRI.mjs} +5 -5
- package/dist/{dashboard-DvHbk_cv.mjs.map → dashboard-C2kTeeRI.mjs.map} +1 -1
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +3 -3
- package/dist/db/index.mjs.map +1 -1
- package/dist/db/libsql-migrations.d.mts +1 -1
- package/dist/db/libsql-migrations.mjs +4 -4
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres-migrations.d.mts +1 -1
- package/dist/db/postgres-migrations.mjs +4 -4
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/postgres.d.mts.map +1 -1
- package/dist/db/postgres.mjs +19 -3
- package/dist/db/postgres.mjs.map +1 -1
- package/dist/db/sqlite-migrations.d.mts +1 -1
- package/dist/db/sqlite-migrations.mjs +4 -4
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/db/sqlite.mjs +3 -3
- package/dist/db/sqlite.mjs.map +1 -1
- package/dist/{default-DdDl3fxv.mjs → default-Clra32mw.mjs} +1 -1
- package/dist/{default-DdDl3fxv.mjs.map → default-Clra32mw.mjs.map} +1 -1
- package/dist/{deferred-tasks-SDWxrgzJ.d.mts → deferred-tasks-CvDETTJO.d.mts} +1 -1
- package/dist/{deferred-tasks-SDWxrgzJ.d.mts.map → deferred-tasks-CvDETTJO.d.mts.map} +1 -1
- package/dist/dev-typegen-DzOPfsNj.mjs +29 -0
- package/dist/dev-typegen-DzOPfsNj.mjs.map +1 -0
- package/dist/{device-flow-C0GdD_z8.mjs → device-flow-D2oCWvLJ.mjs} +5 -5
- package/dist/{device-flow-C0GdD_z8.mjs.map → device-flow-D2oCWvLJ.mjs.map} +1 -1
- package/dist/{direct-executor-CDXeJCSs.mjs → direct-executor-Bfa5_ToE.mjs} +3 -3
- package/dist/{direct-executor-CDXeJCSs.mjs.map → direct-executor-Bfa5_ToE.mjs.map} +1 -1
- package/dist/{dist-D_6CKR8z.mjs → dist-89xCrGqi.mjs} +1 -1
- package/dist/{dist-D_6CKR8z.mjs.map → dist-89xCrGqi.mjs.map} +1 -1
- package/dist/{email-console-BHNjIwiB.mjs → email-console-Dzb6uGYa.mjs} +1 -1
- package/dist/{email-console-BHNjIwiB.mjs.map → email-console-Dzb6uGYa.mjs.map} +1 -1
- package/dist/{enrich-_ySMEvEE.mjs → enrich-BX0IDp4z.mjs} +3 -3
- package/dist/{enrich-_ySMEvEE.mjs.map → enrich-BX0IDp4z.mjs.map} +1 -1
- package/dist/{error-DupyJZE2.mjs → error-DFrQjppn.mjs} +2 -2
- package/dist/{error-DupyJZE2.mjs.map → error-DFrQjppn.mjs.map} +1 -1
- package/dist/{errors-CLUPm7aD.mjs → errors-DsVoDUjJ.mjs} +24 -2
- package/dist/errors-DsVoDUjJ.mjs.map +1 -0
- package/dist/{escape-DUY2r2Zs.mjs → escape-HmHTC1Is.mjs} +1 -1
- package/dist/{escape-DUY2r2Zs.mjs.map → escape-HmHTC1Is.mjs.map} +1 -1
- package/dist/{field-defs-cache-BzwBlJrR.mjs → field-defs-cache-BM4SIRqH.mjs} +5 -5
- package/dist/{field-defs-cache-BzwBlJrR.mjs.map → field-defs-cache-BM4SIRqH.mjs.map} +1 -1
- package/dist/focal-point-BeWFo6Xx.mjs +23 -0
- package/dist/focal-point-BeWFo6Xx.mjs.map +1 -0
- package/dist/{fts-manager-DyZEohZC.mjs → fts-manager-Do1BlW2r.mjs} +3 -3
- package/dist/{fts-manager-DyZEohZC.mjs.map → fts-manager-Do1BlW2r.mjs.map} +1 -1
- package/dist/{hash-Cg0TXJPV.mjs → hash-3JJPlHF2.mjs} +1 -1
- package/dist/{hash-Cg0TXJPV.mjs.map → hash-3JJPlHF2.mjs.map} +1 -1
- package/dist/hook-result-DCh2WUpe.d.mts +31 -0
- package/dist/hook-result-DCh2WUpe.d.mts.map +1 -0
- package/dist/{hreflang-DwT2E0Sa.d.mts → hreflang-B6hbAuuO.d.mts} +2 -2
- package/dist/{hreflang-DwT2E0Sa.d.mts.map → hreflang-B6hbAuuO.d.mts.map} +1 -1
- package/dist/{hreflang-BBe83kKa.mjs → hreflang-DQbPZliA.mjs} +7 -7
- package/dist/{hreflang-BBe83kKa.mjs.map → hreflang-DQbPZliA.mjs.map} +1 -1
- package/dist/{identity-Ys6Dlc9C.mjs → identity-DksvEazf.mjs} +3 -3
- package/dist/{identity-Ys6Dlc9C.mjs.map → identity-DksvEazf.mjs.map} +1 -1
- package/dist/{import-DPkLmeXO.mjs → import-CJpaBBBT.mjs} +6 -6
- package/dist/{import-DPkLmeXO.mjs.map → import-CJpaBBBT.mjs.map} +1 -1
- package/dist/{index-BVBZj4-7.d.mts → index-BJNMCWmu.d.mts} +267 -82
- package/dist/index-BJNMCWmu.d.mts.map +1 -0
- package/dist/{index-C9KuQyO-.d.mts → index-Du8K7bWa.d.mts} +3 -3
- package/dist/{index-C9KuQyO-.d.mts.map → index-Du8K7bWa.d.mts.map} +1 -1
- package/dist/index.d.mts +22 -21
- package/dist/index.mjs +79 -73
- package/dist/{init-lock-6b309ZrF.mjs → init-lock-DJkX6Hto.mjs} +1 -1
- package/dist/{init-lock-6b309ZrF.mjs.map → init-lock-DJkX6Hto.mjs.map} +1 -1
- package/dist/{load-YJ2xl3ra.mjs → load-CawHjTOH.mjs} +2 -2
- package/dist/{load-YJ2xl3ra.mjs.map → load-CawHjTOH.mjs.map} +1 -1
- package/dist/{loader-CdG_Ci3H.mjs → loader-Z8vl7zTq.mjs} +48 -13
- package/dist/loader-Z8vl7zTq.mjs.map +1 -0
- package/dist/{manifest-builder-B252yQUf.mjs → manifest-builder-COtzuca2.mjs} +2 -2
- package/dist/{manifest-builder-B252yQUf.mjs.map → manifest-builder-COtzuca2.mjs.map} +1 -1
- package/dist/{manifest-schema-BXbUAHod.mjs → manifest-schema-BNWwR8Vd.mjs} +5 -5
- package/dist/manifest-schema-BNWwR8Vd.mjs.map +1 -0
- package/dist/media/image-endpoint.d.mts +4 -2
- package/dist/media/image-endpoint.d.mts.map +1 -1
- package/dist/media/image-endpoint.mjs +6 -4
- package/dist/media/image-endpoint.mjs.map +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +13 -3
- package/dist/media/index.mjs.map +1 -1
- package/dist/media/local-runtime.d.mts +14 -12
- package/dist/media/local-runtime.d.mts.map +1 -1
- package/dist/media/local-runtime.mjs +12 -6
- package/dist/media/local-runtime.mjs.map +1 -1
- package/dist/{media-CzhAn2--.mjs → media-BBm8Wg3f.mjs} +69 -12
- package/dist/media-BBm8Wg3f.mjs.map +1 -0
- package/dist/{media-BWWWb8kg.mjs → media-BHjus86Y.mjs} +133 -9
- package/dist/media-BHjus86Y.mjs.map +1 -0
- package/dist/{media-allowlist-D6x-Us02.mjs → media-allowlist-CoTBWoDp.mjs} +3 -2
- package/dist/media-allowlist-CoTBWoDp.mjs.map +1 -0
- package/dist/media-folders-BGkATs8n.mjs +210 -0
- package/dist/media-folders-BGkATs8n.mjs.map +1 -0
- package/dist/{media-upload-CHBVn6m-.mjs → media-upload-BCidR-EY.mjs} +9 -9
- package/dist/{media-upload-CHBVn6m-.mjs.map → media-upload-BCidR-EY.mjs.map} +1 -1
- package/dist/{media-url-BvoX88FA.mjs → media-url-DHoPr0hq.mjs} +1 -1
- package/dist/{media-url-BvoX88FA.mjs.map → media-url-DHoPr0hq.mjs.map} +1 -1
- package/dist/media-usage-CdY5jhSR.mjs +1833 -0
- package/dist/media-usage-CdY5jhSR.mjs.map +1 -0
- package/dist/media-usage-activation-BgeMtK5C.mjs +78 -0
- package/dist/media-usage-activation-BgeMtK5C.mjs.map +1 -0
- package/dist/{media-usage-work-CLo_6tct.mjs → media-usage-work-CnGCdHxx.mjs} +4 -4
- package/dist/{media-usage-work-CLo_6tct.mjs.map → media-usage-work-CnGCdHxx.mjs.map} +1 -1
- package/dist/{media-usage-work-DrCbqBcl.mjs → media-usage-work-D6D9sMCA.mjs} +221 -59
- package/dist/media-usage-work-D6D9sMCA.mjs.map +1 -0
- package/dist/{media-usage-write-fence-aHEgN1zB.mjs → media-usage-write-fence-hjeD4u7s.mjs} +2 -2
- package/dist/{media-usage-write-fence-aHEgN1zB.mjs.map → media-usage-write-fence-hjeD4u7s.mjs.map} +1 -1
- package/dist/{menus-DSo5QeW0.mjs → menus-6qSwTNxG.mjs} +375 -107
- package/dist/menus-6qSwTNxG.mjs.map +1 -0
- package/dist/{menus-TCNSd2vp.mjs → menus-uvPLXMZf.mjs} +4 -4
- package/dist/{menus-TCNSd2vp.mjs.map → menus-uvPLXMZf.mjs.map} +1 -1
- package/dist/migrations/index.d.mts +1 -1
- package/dist/migrations/index.mjs +3 -3
- package/dist/{mime-DfIVjNkr.mjs → mime-CUIG6x84.mjs} +1 -1
- package/dist/mime-CUIG6x84.mjs.map +1 -0
- package/dist/{mode-BDoH_WcF.mjs → mode-DN_WneRx.mjs} +1 -1
- package/dist/{mode-BDoH_WcF.mjs.map → mode-DN_WneRx.mjs.map} +1 -1
- package/dist/node-sqlite-compat-BuJXIeMz.mjs +46 -0
- package/dist/node-sqlite-compat-BuJXIeMz.mjs.map +1 -0
- package/dist/{normalize-Bc-s_r-a.mjs → normalize-C2xNjTSG.mjs} +36 -5
- package/dist/normalize-C2xNjTSG.mjs.map +1 -0
- package/dist/{oauth-authorization-iOikmrJd.mjs → oauth-authorization-Dj6Kwc21.mjs} +5 -5
- package/dist/{oauth-authorization-iOikmrJd.mjs.map → oauth-authorization-Dj6Kwc21.mjs.map} +1 -1
- package/dist/{oauth-clients-CvI0nHMJ.mjs → oauth-clients-FD7I0J8m.mjs} +1 -1
- package/dist/{oauth-clients-CvI0nHMJ.mjs.map → oauth-clients-FD7I0J8m.mjs.map} +1 -1
- package/dist/{oauth-state-store-Ba8KZlwW.mjs → oauth-state-store-DkmDOmHs.mjs} +1 -1
- package/dist/{oauth-state-store-Ba8KZlwW.mjs.map → oauth-state-store-DkmDOmHs.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-C5SQwGYC.mjs → oauth-user-lookup-CvIwGpYd.mjs} +1 -1
- package/dist/{oauth-user-lookup-C5SQwGYC.mjs.map → oauth-user-lookup-CvIwGpYd.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/{object-cache-71tPfV4A.mjs → object-cache-DVKnyOfy.mjs} +19 -3
- package/dist/object-cache-DVKnyOfy.mjs.map +1 -0
- package/dist/{options-CBXIHUoT.mjs → options-BHPeIbBd.mjs} +1 -1
- package/dist/{options-CBXIHUoT.mjs.map → options-BHPeIbBd.mjs.map} +1 -1
- package/dist/{options--hhz-jZ1.d.mts → options-CYb4y7hM.d.mts} +24 -11
- package/dist/options-CYb4y7hM.d.mts.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/{parse-DFbuc-Fh.mjs → parse-Ckpg-Qfp.mjs} +2 -2
- package/dist/{parse-DFbuc-Fh.mjs.map → parse-Ckpg-Qfp.mjs.map} +1 -1
- package/dist/{passkey-config-DFAmUyuE.mjs → passkey-config-O_lj3y0k.mjs} +1 -1
- package/dist/{passkey-config-DFAmUyuE.mjs.map → passkey-config-O_lj3y0k.mjs.map} +1 -1
- package/dist/{patterns-CiyXeDgr.mjs → patterns-D9iDO3j8.mjs} +1 -1
- package/dist/{patterns-CiyXeDgr.mjs.map → patterns-D9iDO3j8.mjs.map} +1 -1
- package/dist/{placeholder-Dp0K3RkD.d.mts → placeholder-4X9BrRrp.d.mts} +7 -1
- package/dist/placeholder-4X9BrRrp.d.mts.map +1 -0
- 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-TluUIxuu.mjs → policy-Dhtwntrt.mjs} +2 -2
- package/dist/{policy-TluUIxuu.mjs.map → policy-Dhtwntrt.mjs.map} +1 -1
- package/dist/{portable-text-imBW5cHK.mjs → portable-text-U85hOafW.mjs} +1 -1
- package/dist/{portable-text-imBW5cHK.mjs.map → portable-text-U85hOafW.mjs.map} +1 -1
- package/dist/{preview-PW-nOnq4.mjs → preview-B_vJLvf8.mjs} +2 -2
- package/dist/{preview-PW-nOnq4.mjs.map → preview-B_vJLvf8.mjs.map} +1 -1
- package/dist/{protocol-DjsJHTlK.d.mts → protocol-JdD2YhY9.d.mts} +2 -2
- package/dist/{protocol-DjsJHTlK.d.mts.map → protocol-JdD2YhY9.d.mts.map} +1 -1
- package/dist/{public-url-CWoFhQT8.mjs → public-url-CarhZJgf.mjs} +1 -1
- package/dist/{public-url-CWoFhQT8.mjs.map → public-url-CarhZJgf.mjs.map} +1 -1
- package/dist/{query-zTVAR1Sl.mjs → query-BZKZcG5b.mjs} +15 -15
- package/dist/{query-zTVAR1Sl.mjs.map → query-BZKZcG5b.mjs.map} +1 -1
- package/dist/{query-BWs7O5Il.mjs → query-BndaFxxp.mjs} +5 -5
- package/dist/{query-BWs7O5Il.mjs.map → query-BndaFxxp.mjs.map} +1 -1
- package/dist/{rate-limit-Bx4g9m3p.mjs → rate-limit-BZmATC6W.mjs} +2 -2
- package/dist/{rate-limit-Bx4g9m3p.mjs.map → rate-limit-BZmATC6W.mjs.map} +1 -1
- package/dist/{redirect-COsS6SWJ.mjs → redirect-CZkbozu9.mjs} +2 -2
- package/dist/{redirect-COsS6SWJ.mjs.map → redirect-CZkbozu9.mjs.map} +1 -1
- package/dist/{redirect-BgAOGHDq.mjs → redirect-CzqnLxK-.mjs} +1 -1
- package/dist/{redirect-BgAOGHDq.mjs.map → redirect-CzqnLxK-.mjs.map} +1 -1
- package/dist/{redirects-DTDHWH31.mjs → redirects-BLNOWQTn.mjs} +64 -29
- package/dist/redirects-BLNOWQTn.mjs.map +1 -0
- package/dist/{redirects-DyChwDkG.mjs → redirects-CqzNM0KM.mjs} +5 -5
- package/dist/{redirects-DyChwDkG.mjs.map → redirects-CqzNM0KM.mjs.map} +1 -1
- package/dist/{registry-Cqa2I749.mjs → registry-AZAsRsor.mjs} +30 -126
- package/dist/registry-AZAsRsor.mjs.map +1 -0
- package/dist/{relation-BnHB0T4J.mjs → relation-04DfKRTO.mjs} +2 -2
- package/dist/{relation-BnHB0T4J.mjs.map → relation-04DfKRTO.mjs.map} +1 -1
- package/dist/{relations-BBApI4e2.mjs → relations-C4htk5sb.mjs} +7 -7
- package/dist/relations-C4htk5sb.mjs.map +1 -0
- package/dist/{relations-D5sM5fW0.mjs → relations-CcFwDJdJ.mjs} +4 -4
- package/dist/{relations-D5sM5fW0.mjs.map → relations-CcFwDJdJ.mjs.map} +1 -1
- package/dist/{relations-BHo5A8Zf.d.mts → relations-DnRK4YIT.d.mts} +347 -54
- package/dist/relations-DnRK4YIT.d.mts.map +1 -0
- package/dist/{request-cache-BSUptuJR.mjs → request-cache-DH9zdCOD.mjs} +1 -1
- package/dist/{request-cache-BSUptuJR.mjs.map → request-cache-DH9zdCOD.mjs.map} +1 -1
- package/dist/request-context.d.mts +1 -1
- package/dist/{request-meta-DgZJh3zG.mjs → request-meta-DYxLlnmz.mjs} +2 -2
- package/dist/{request-meta-DgZJh3zG.mjs.map → request-meta-DYxLlnmz.mjs.map} +1 -1
- package/dist/{resolve-DOhVEvty.mjs → resolve-prZ3mP7l.mjs} +1 -1
- package/dist/{resolve-DOhVEvty.mjs.map → resolve-prZ3mP7l.mjs.map} +1 -1
- package/dist/{runner-C1T11CfC.mjs → runner-BLIDKpmA.mjs} +471 -290
- package/dist/runner-BLIDKpmA.mjs.map +1 -0
- package/dist/{runner-BYHZn3Jy.d.mts → runner-YKfIMnaF.d.mts} +3 -2
- package/dist/runner-YKfIMnaF.d.mts.map +1 -0
- package/dist/runtime.d.mts +11 -11
- package/dist/runtime.mjs +1 -1
- package/dist/{schema-DZ5YVVZj.mjs → schema-CGnBeLiW.mjs} +3 -3
- package/dist/{schema-DZ5YVVZj.mjs.map → schema-CGnBeLiW.mjs.map} +1 -1
- package/dist/{schema-2AOsSn2v.mjs → schema-DYr-Vd-L.mjs} +36 -6
- package/dist/{schema-2AOsSn2v.mjs.map → schema-DYr-Vd-L.mjs.map} +1 -1
- package/dist/{scopes-8ClPF2bC.mjs → scopes-BhWvBavj.mjs} +3 -3
- package/dist/{scopes-8ClPF2bC.mjs.map → scopes-BhWvBavj.mjs.map} +1 -1
- package/dist/{search-u1QYdOCG.mjs → search-C-qDk4kx.mjs} +4 -4
- package/dist/{search-u1QYdOCG.mjs.map → search-C-qDk4kx.mjs.map} +1 -1
- package/dist/{secrets-BEgsAQEU.mjs → secrets-rEtHt-6z.mjs} +3 -3
- package/dist/{secrets-BEgsAQEU.mjs.map → secrets-rEtHt-6z.mjs.map} +1 -1
- package/dist/{sections-DmHviGyM.mjs → sections-B_nYvlwn.mjs} +2 -2
- package/dist/{sections-DmHviGyM.mjs.map → sections-B_nYvlwn.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +25 -23
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.mjs +17 -15
- package/dist/seo/index.mjs.map +1 -1
- package/dist/{seo-Dq4G-RrO.mjs → seo-926NRIgt.mjs} +3 -3
- package/dist/{seo-Dq4G-RrO.mjs.map → seo-926NRIgt.mjs.map} +1 -1
- package/dist/{seo-AFpVvTqr.mjs → seo-CVWkdv6x.mjs} +1 -1
- package/dist/{seo-AFpVvTqr.mjs.map → seo-CVWkdv6x.mjs.map} +1 -1
- package/dist/{service-BpArayPr.mjs → service-CJl3ZAYs.mjs} +3 -3
- package/dist/{service-BpArayPr.mjs.map → service-CJl3ZAYs.mjs.map} +1 -1
- package/dist/{session-user-BEorKVT-.mjs → session-user-BlMgqCHS.mjs} +1 -1
- package/dist/{session-user-BEorKVT-.mjs.map → session-user-BlMgqCHS.mjs.map} +1 -1
- package/dist/{settings-xRdoUZr0.mjs → settings--wobrkkC.mjs} +21 -8
- package/dist/settings--wobrkkC.mjs.map +1 -0
- package/dist/{settings-DE9xtzqd.mjs → settings-Cwm6o2jY.mjs} +3 -3
- package/dist/{settings-DE9xtzqd.mjs.map → settings-Cwm6o2jY.mjs.map} +1 -1
- package/dist/{setup-complete-BnT8pq_C.mjs → setup-complete-DQbClIN2.mjs} +2 -2
- package/dist/{setup-complete-BnT8pq_C.mjs.map → setup-complete-DQbClIN2.mjs.map} +1 -1
- package/dist/{setup-nonce-CBitf_oQ.mjs → setup-nonce-DZCFS2sn.mjs} +1 -1
- package/dist/{setup-nonce-CBitf_oQ.mjs.map → setup-nonce-DZCFS2sn.mjs.map} +1 -1
- package/dist/{single-flight-cache-B0eLKS6K.mjs → single-flight-cache-BPuGPdcN.mjs} +2 -2
- package/dist/{single-flight-cache-B0eLKS6K.mjs.map → single-flight-cache-BPuGPdcN.mjs.map} +1 -1
- package/dist/{site-url-DjpIXMXJ.mjs → site-url-BrxA_E9H.mjs} +3 -3
- package/dist/{site-url-DjpIXMXJ.mjs.map → site-url-BrxA_E9H.mjs.map} +1 -1
- package/dist/{snapshot-BBlGkb2q.mjs → snapshot--OCDTqdb.mjs} +1 -1
- package/dist/{snapshot-BBlGkb2q.mjs.map → snapshot--OCDTqdb.mjs.map} +1 -1
- package/dist/{ssrf-Cpvg_n3A.mjs → ssrf-5sIM5jzl.mjs} +23 -6
- package/dist/{ssrf-Cpvg_n3A.mjs.map → ssrf-5sIM5jzl.mjs.map} +1 -1
- package/dist/{state-DYwPue40.mjs → state-BpFVsJZB.mjs} +12 -4
- package/dist/state-BpFVsJZB.mjs.map +1 -0
- package/dist/{status-CWVYpbD8.mjs → status-B777-dXz.mjs} +1 -1
- package/dist/{status-CWVYpbD8.mjs.map → status-B777-dXz.mjs.map} +1 -1
- package/dist/storage/local.d.mts +2 -1
- package/dist/storage/local.d.mts.map +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/local.mjs.map +1 -1
- package/dist/storage/s3.d.mts +2 -1
- package/dist/storage/s3.d.mts.map +1 -1
- package/dist/storage/s3.mjs +3 -2
- package/dist/storage/s3.mjs.map +1 -1
- package/dist/{target-DixqqV5i.mjs → target-BmR0iTwz.mjs} +1 -1
- package/dist/{target-DixqqV5i.mjs.map → target-BmR0iTwz.mjs.map} +1 -1
- package/dist/{taxonomies-OHUIiIpI.mjs → taxonomies-DkAkMupr.mjs} +17 -14
- package/dist/taxonomies-DkAkMupr.mjs.map +1 -0
- package/dist/{taxonomies-BlrncHi9.mjs → taxonomies-Wfy_Lg12.mjs} +43 -17
- package/dist/taxonomies-Wfy_Lg12.mjs.map +1 -0
- package/dist/{taxonomy-BqCZ1TdU.mjs → taxonomy-tJepplLL.mjs} +5 -5
- package/dist/{taxonomy-BqCZ1TdU.mjs.map → taxonomy-tJepplLL.mjs.map} +1 -1
- package/dist/{tokens-C39klX8R.mjs → tokens-BCO1oruF.mjs} +1 -1
- package/dist/{tokens-C39klX8R.mjs.map → tokens-BCO1oruF.mjs.map} +1 -1
- package/dist/{transaction-NQj4VJ7Z.mjs → transaction-0KOpOyMu.mjs} +2 -1
- package/dist/{transaction-NQj4VJ7Z.mjs.map → transaction-0KOpOyMu.mjs.map} +1 -1
- package/dist/{transport-DBJwa-Si.mjs → transport-Dr3qtwXC.mjs} +4 -3
- package/dist/{transport-DBJwa-Si.mjs.map → transport-Dr3qtwXC.mjs.map} +1 -1
- package/dist/{transport-RQE36APG.d.mts → transport-xh6YKW2G.d.mts} +1 -1
- package/dist/{transport-RQE36APG.d.mts.map → transport-xh6YKW2G.d.mts.map} +1 -1
- package/dist/{trusted-proxy-CEVekpby.mjs → trusted-proxy-BR5F1Otp.mjs} +1 -1
- package/dist/{trusted-proxy-CEVekpby.mjs.map → trusted-proxy-BR5F1Otp.mjs.map} +1 -1
- package/dist/{types-BW1syrlw.mjs → types-3qNFPlci.mjs} +1 -1
- package/dist/{types-BW1syrlw.mjs.map → types-3qNFPlci.mjs.map} +1 -1
- package/dist/types-75KIqzL9.mjs.map +1 -1
- package/dist/{types-DrJrVCT1.d.mts → types-B6GrPic4.d.mts} +9 -3
- package/dist/{types-DrJrVCT1.d.mts.map → types-B6GrPic4.d.mts.map} +1 -1
- package/dist/{types-DN64_zzZ.d.mts → types-BuHW4xDE.d.mts} +11 -10
- package/dist/types-BuHW4xDE.d.mts.map +1 -0
- package/dist/{types-DWRhk9xZ.d.mts → types-C00oyCZp.d.mts} +1 -1
- package/dist/{types-DWRhk9xZ.d.mts.map → types-C00oyCZp.d.mts.map} +1 -1
- package/dist/{types-BntycPTF.d.mts → types-CDtkNSFQ.d.mts} +1 -1
- package/dist/{types-BntycPTF.d.mts.map → types-CDtkNSFQ.d.mts.map} +1 -1
- package/dist/{types-Dfk8KI5R.d.mts → types-CPeXo1wF.d.mts} +1 -1
- package/dist/{types-Dfk8KI5R.d.mts.map → types-CPeXo1wF.d.mts.map} +1 -1
- package/dist/types-CQPWhPxE.mjs.map +1 -1
- package/dist/{types-BcqdcT-r.d.mts → types-CXFkwEGC.d.mts} +3 -2
- package/dist/types-CXFkwEGC.d.mts.map +1 -0
- package/dist/{types-CtzytVXn.mjs → types-DM3vioBY.mjs} +1 -1
- package/dist/{types-CtzytVXn.mjs.map → types-DM3vioBY.mjs.map} +1 -1
- package/dist/{types-CXnOzDe1.d.mts → types-DczELMop.d.mts} +1 -1
- package/dist/{types-CXnOzDe1.d.mts.map → types-DczELMop.d.mts.map} +1 -1
- package/dist/types-DfuTR6dL.mjs +3 -0
- package/dist/{types-DQIDRKF2.d.mts → types-FV23hEoW.d.mts} +10 -1
- package/dist/types-FV23hEoW.d.mts.map +1 -0
- package/dist/{types-C2pMvO62.d.mts → types-xDMtUFnO.d.mts} +2 -1
- package/dist/types-xDMtUFnO.d.mts.map +1 -0
- package/dist/{upload-attempts-D4FS8LT6.mjs → upload-attempts-BsqoQ1fn.mjs} +1 -1
- package/dist/{upload-attempts-D4FS8LT6.mjs.map → upload-attempts-BsqoQ1fn.mjs.map} +1 -1
- package/dist/{url-pattern-BHS0V5Ng.mjs → url-pattern-D4c2czpJ.mjs} +1 -1
- package/dist/{url-pattern-BHS0V5Ng.mjs.map → url-pattern-D4c2czpJ.mjs.map} +1 -1
- package/dist/{user-DJZfUJVE.mjs → user-BTZ40aq6.mjs} +2 -2
- package/dist/{user-DJZfUJVE.mjs.map → user-BTZ40aq6.mjs.map} +1 -1
- package/dist/{utils-D4vD_Y98.mjs → utils-BKvNjjhY.mjs} +1 -1
- package/dist/{utils-D4vD_Y98.mjs.map → utils-BKvNjjhY.mjs.map} +1 -1
- package/dist/{validate-BMLBvxOC.mjs → validate-DE_LRwo9.mjs} +2 -2
- package/dist/{validate-BMLBvxOC.mjs.map → validate-DE_LRwo9.mjs.map} +1 -1
- package/dist/{validate-CTqt5nuE.d.mts → validate-DUP27OYD.d.mts} +5 -5
- package/dist/{validate-CTqt5nuE.d.mts.map → validate-DUP27OYD.d.mts.map} +1 -1
- package/dist/{validation-npvENUCB.mjs → validation-BMImFJ11.mjs} +10 -8
- package/dist/{validation-npvENUCB.mjs.map → validation-BMImFJ11.mjs.map} +1 -1
- package/dist/version-Bii3suaO.mjs +7 -0
- package/dist/{version-DB_fqCSI.mjs.map → version-Bii3suaO.mjs.map} +1 -1
- package/dist/{widgets-BD3ho7Rq.mjs → widgets-D3gJ10xU.mjs} +18 -5
- package/dist/widgets-D3gJ10xU.mjs.map +1 -0
- package/dist/{wxr-taxonomies-Ca68766D.d.mts → wxr-taxonomies-B2Og_6rU.d.mts} +1 -1
- package/dist/{wxr-taxonomies-Ca68766D.d.mts.map → wxr-taxonomies-B2Og_6rU.d.mts.map} +1 -1
- package/dist/{wxr-taxonomies-B1R3vBoD.mjs → wxr-taxonomies-Cxngsjwo.mjs} +4 -4
- package/dist/{wxr-taxonomies-B1R3vBoD.mjs.map → wxr-taxonomies-Cxngsjwo.mjs.map} +1 -1
- package/dist/{zod-generator-LC-on_Vb.mjs → zod-generator-BuYSQJB7.mjs} +32 -22
- package/dist/zod-generator-BuYSQJB7.mjs.map +1 -0
- package/package.json +20 -9
- package/src/api/errors.ts +22 -0
- package/src/api/handlers/content.ts +49 -11
- package/src/api/handlers/index.ts +18 -0
- package/src/api/handlers/manifest.ts +161 -12
- package/src/api/handlers/media-allowlist.ts +1 -0
- package/src/api/handlers/media-folders.ts +130 -0
- package/src/api/handlers/media-usage-activation.ts +102 -0
- package/src/api/handlers/media-usage.ts +108 -0
- package/src/api/handlers/media.ts +92 -2
- package/src/api/handlers/registry.ts +483 -561
- package/src/api/handlers/taxonomies.ts +16 -9
- package/src/api/openapi/document.ts +277 -7
- package/src/api/parse.ts +1 -1
- package/src/api/schemas/auth.ts +4 -4
- package/src/api/schemas/bylines.ts +3 -3
- package/src/api/schemas/comments.ts +1 -1
- package/src/api/schemas/common.ts +3 -2
- package/src/api/schemas/content.ts +78 -22
- package/src/api/schemas/media-usage.ts +77 -0
- package/src/api/schemas/media.ts +121 -0
- package/src/api/schemas/redirects.ts +6 -1
- package/src/api/schemas/schema.ts +4 -0
- package/src/api/schemas/setup.ts +1 -1
- package/src/api/schemas/taxonomies.ts +2 -2
- package/src/api/schemas/users.ts +1 -1
- package/src/api/types.ts +23 -10
- package/src/astro/dev-typegen.ts +35 -0
- package/src/astro/image-endpoint.ts +2 -2
- package/src/astro/integration/dev-typegen.ts +91 -0
- package/src/astro/integration/index.ts +9 -44
- package/src/astro/integration/routes.ts +23 -0
- package/src/astro/integration/vite-config.ts +23 -9
- package/src/astro/middleware/auth.ts +4 -0
- package/src/astro/middleware.ts +5 -7
- package/src/astro/routes/api/admin/api-tokens/index.ts +4 -1
- package/src/astro/routes/api/admin/media-usage/activation.ts +42 -0
- package/src/astro/routes/api/admin/media-usage/progress.ts +37 -0
- 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 +247 -101
- 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/auth/me.ts +14 -2
- package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +8 -2
- package/src/astro/routes/api/content/[collection]/[id]/publish.ts +2 -1
- package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +6 -2
- package/src/astro/routes/api/manifest.ts +1 -1
- package/src/astro/routes/api/media/[id]/replace.ts +114 -0
- package/src/astro/routes/api/media/[id].ts +3 -0
- package/src/astro/routes/api/media/file/[...key].ts +4 -1
- package/src/astro/routes/api/media/folders/[id].ts +55 -0
- package/src/astro/routes/api/media/folders/index.ts +37 -0
- package/src/astro/routes/api/media/upload-url.ts +8 -4
- package/src/astro/routes/api/media.ts +66 -10
- 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/setup/dev-bypass.ts +12 -0
- package/src/astro/routes/api/taxonomies/[name]/reorder.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name]/terms/[slug]/translations.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name]/terms/[slug].ts +7 -2
- package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name].ts +7 -2
- package/src/astro/routes/api/taxonomies/index.ts +4 -1
- package/src/astro/routes/api/widget-areas/[name]/reorder.ts +3 -1
- package/src/astro/routes/api/widget-areas/[name]/widgets/[id].ts +5 -2
- package/src/astro/routes/api/widget-areas/[name]/widgets.ts +3 -1
- package/src/astro/routes/api/widget-areas/[name].ts +3 -1
- package/src/astro/routes/api/widget-areas/index.ts +3 -1
- package/src/astro/types.ts +34 -6
- 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/client/index.ts +140 -2
- package/src/client/transport.ts +6 -2
- package/src/components/EmDashImage.astro +156 -51
- package/src/components/EmDashMedia.astro +2 -1
- package/src/components/Gallery.astro +7 -0
- package/src/components/InlinePortableTextEditor.tsx +136 -2
- package/src/components/LiveSearch.astro +23 -0
- package/src/components/inline-code-block.tsx +180 -49
- package/src/components/widgets/Archives.astro +2 -37
- package/src/content/converters/gallery.ts +2 -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 +202 -69
- package/src/content/converters/prosemirror-to-portable-text.ts +96 -25
- package/src/content/converters/types.ts +3 -0
- package/src/database/connection.ts +2 -31
- package/src/database/index.ts +1 -1
- package/src/database/json-recordset.ts +16 -0
- package/src/database/migrations/017_authorization_codes.ts +14 -4
- package/src/database/migrations/019_i18n.ts +1 -1
- package/src/database/migrations/071_restore_content_bylines_table.ts +43 -0
- package/src/database/migrations/072_media_folders.ts +72 -0
- package/src/database/migrations/073_media_focal_point.ts +57 -0
- package/src/database/migrations/074_content_deleted_scheduled_index.ts +55 -0
- package/src/database/migrations/runner.ts +11 -3
- package/src/database/repositories/byline.ts +32 -16
- package/src/database/repositories/content.ts +119 -51
- package/src/database/repositories/media-folders.ts +115 -0
- package/src/database/repositories/media-usage-work.ts +395 -111
- package/src/database/repositories/media-usage.ts +1104 -47
- package/src/database/repositories/media.ts +156 -29
- package/src/database/repositories/plugin-storage.ts +74 -9
- package/src/database/repositories/types.ts +8 -7
- package/src/database/transaction.ts +1 -0
- package/src/database/types.ts +13 -0
- package/src/db/adapters.ts +10 -3
- package/src/db/node-sqlite-compat.ts +78 -0
- package/src/db/postgres.ts +23 -0
- package/src/db/sqlite.ts +3 -3
- package/src/emdash-runtime.ts +186 -251
- package/src/fields/boolean.ts +1 -1
- package/src/fields/datetime.ts +1 -1
- package/src/fields/file.ts +1 -1
- package/src/fields/image.ts +7 -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 +8 -4
- package/src/index.ts +30 -3
- package/src/loader.ts +63 -10
- package/src/mcp/server.ts +228 -24
- package/src/media/focal-point.ts +37 -0
- package/src/media/image-endpoint.ts +5 -2
- package/src/media/local-runtime.ts +8 -0
- package/src/media/mime.ts +1 -0
- package/src/media/normalize.ts +25 -4
- package/src/media/types.ts +10 -0
- package/src/media/usage/activation.ts +162 -35
- package/src/media/usage/capture-triggers.ts +19 -3
- package/src/media/usage/cleanup.ts +9 -8
- package/src/media/usage/collection-deletion-processor.ts +7 -3
- package/src/media/usage/collection-deletion.ts +10 -0
- package/src/media/usage/content-refresh.ts +258 -39
- package/src/media/usage/content-snapshots.ts +128 -31
- package/src/media/usage/extractor.ts +32 -13
- package/src/media/usage/maintenance-engine.ts +166 -0
- package/src/media/usage/reconciliation-processor.ts +106 -29
- package/src/media/usage/reconciliation.ts +90 -7
- package/src/media/usage/work-processor.ts +342 -101
- package/src/menus/index.ts +16 -0
- package/src/object-cache/index.ts +44 -2
- package/src/plugin-types.ts +18 -1
- package/src/plugins/hooks.ts +4 -1
- package/src/plugins/index.ts +7 -0
- package/src/plugins/manager.ts +2 -1
- package/src/plugins/manifest-schema.ts +1 -1
- package/src/plugins/routes.ts +3 -1
- package/src/plugins/sandbox/hook-result.ts +52 -0
- package/src/plugins/sandbox/index.ts +10 -0
- package/src/plugins/save-rejection.ts +20 -0
- package/src/plugins/scheduler/node.ts +1 -13
- package/src/plugins/scheduler/types.ts +0 -2
- package/src/plugins/state.ts +13 -3
- package/src/plugins/types.ts +6 -0
- package/src/registry/artifact-checksum.ts +15 -0
- package/src/registry/artifact-fetch.ts +530 -0
- package/src/registry/artifact-verification.ts +85 -0
- package/src/registry/authoritative-records.ts +180 -0
- package/src/registry/config.ts +24 -6
- package/src/registry/record-labels.ts +28 -0
- package/src/registry/types.ts +12 -15
- package/src/schema/registry.ts +26 -3
- package/src/schema/types.ts +1 -0
- package/src/schema/zod-generator.ts +28 -17
- package/src/security/ssrf.ts +26 -4
- package/src/seed/apply.ts +4 -4
- 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/ui.ts +2 -0
- package/src/widgets/archives.ts +67 -0
- package/src/widgets/index.ts +16 -0
- package/dist/api-BeBglVxU.mjs +0 -4695
- package/dist/api-BeBglVxU.mjs.map +0 -1
- package/dist/byline-yjvWq4ip.mjs.map +0 -1
- package/dist/challenge-store-SIL5DsF2.mjs.map +0 -1
- package/dist/collection-deletion-DQPvMD8R.mjs.map +0 -1
- package/dist/content-ZHCc1ngN.mjs.map +0 -1
- package/dist/content-refresh-B_8SJzuU.mjs.map +0 -1
- package/dist/context-ZldbZcle.mjs.map +0 -1
- package/dist/errors-CLUPm7aD.mjs.map +0 -1
- package/dist/index-BVBZj4-7.d.mts.map +0 -1
- package/dist/loader-CdG_Ci3H.mjs.map +0 -1
- package/dist/manifest-schema-BXbUAHod.mjs.map +0 -1
- package/dist/media-BWWWb8kg.mjs.map +0 -1
- package/dist/media-CzhAn2--.mjs.map +0 -1
- package/dist/media-allowlist-D6x-Us02.mjs.map +0 -1
- package/dist/media-usage-BZCydfvu.mjs.map +0 -1
- package/dist/media-usage-work-DrCbqBcl.mjs.map +0 -1
- package/dist/menus-DSo5QeW0.mjs.map +0 -1
- package/dist/mime-DfIVjNkr.mjs.map +0 -1
- package/dist/normalize-Bc-s_r-a.mjs.map +0 -1
- package/dist/object-cache-71tPfV4A.mjs.map +0 -1
- package/dist/options--hhz-jZ1.d.mts.map +0 -1
- package/dist/placeholder-Dp0K3RkD.d.mts.map +0 -1
- package/dist/redirects-DTDHWH31.mjs.map +0 -1
- package/dist/registry-Cqa2I749.mjs.map +0 -1
- package/dist/relations-BBApI4e2.mjs.map +0 -1
- package/dist/relations-BHo5A8Zf.d.mts.map +0 -1
- package/dist/runner-BYHZn3Jy.d.mts.map +0 -1
- package/dist/runner-C1T11CfC.mjs.map +0 -1
- package/dist/settings-xRdoUZr0.mjs.map +0 -1
- package/dist/state-DYwPue40.mjs.map +0 -1
- package/dist/taxonomies-BlrncHi9.mjs.map +0 -1
- package/dist/taxonomies-OHUIiIpI.mjs.map +0 -1
- package/dist/types-BcqdcT-r.d.mts.map +0 -1
- package/dist/types-C2pMvO62.d.mts.map +0 -1
- package/dist/types-CP1CflWf.mjs +0 -3
- package/dist/types-DN64_zzZ.d.mts.map +0 -1
- package/dist/types-DQIDRKF2.d.mts.map +0 -1
- package/dist/version-DB_fqCSI.mjs +0 -7
- package/dist/widgets-BD3ho7Rq.mjs.map +0 -1
- package/dist/zod-generator-LC-on_Vb.mjs.map +0 -1
- /package/dist/{api-tokens-rIXC6LdE.mjs → api-tokens-BfYts-sq.mjs} +0 -0
- /package/dist/{ssrf-DpXgKsna.mjs → ssrf-Dg3cIT-b.mjs} +0 -0
package/src/emdash-runtime.ts
CHANGED
|
@@ -9,10 +9,12 @@
|
|
|
9
9
|
|
|
10
10
|
import { Permissions } from "@emdash-cms/auth";
|
|
11
11
|
import type { Element } from "@emdash-cms/blocks";
|
|
12
|
-
import { Kysely,
|
|
12
|
+
import { Kysely, type Dialect } from "kysely";
|
|
13
13
|
import virtualConfig from "virtual:emdash/config";
|
|
14
14
|
import { z } from "zod";
|
|
15
15
|
|
|
16
|
+
import { ErrorCode } from "./api/errors.js";
|
|
17
|
+
import { buildManifestCollections } from "./api/handlers/manifest.js";
|
|
16
18
|
import { assertMediaUsageActivationWriteAllowed } from "./api/media-usage-write-fence.js";
|
|
17
19
|
import { validateRev } from "./api/rev.js";
|
|
18
20
|
import type {
|
|
@@ -20,7 +22,7 @@ import type {
|
|
|
20
22
|
PluginAdminPage,
|
|
21
23
|
PluginDashboardWidget,
|
|
22
24
|
} from "./astro/integration/runtime.js";
|
|
23
|
-
import type { EmDashManifest
|
|
25
|
+
import type { EmDashManifest } from "./astro/types.js";
|
|
24
26
|
import { getAuthMode } from "./auth/mode.js";
|
|
25
27
|
import { getTrustedProxyHeaders } from "./auth/trusted-proxy.js";
|
|
26
28
|
import type { ContentFieldFilters } from "./content-list-query.js";
|
|
@@ -43,30 +45,21 @@ import type {
|
|
|
43
45
|
ContentItem as ContentItemInternal,
|
|
44
46
|
ContentDateField,
|
|
45
47
|
} from "./database/repositories/types.js";
|
|
48
|
+
import type { ImageValue } from "./fields/types.js";
|
|
46
49
|
import { getI18nConfig } from "./i18n/config.js";
|
|
47
50
|
import { repairLocaleCasing } from "./i18n/repair-locale-casing.js";
|
|
48
51
|
import { warnAboutUnconfiguredTaxonomyLocales } from "./i18n/taxonomy-locale-diagnostic.js";
|
|
49
52
|
import { normalizeMediaValue } from "./media/normalize.js";
|
|
50
53
|
import type { MediaProvider, MediaProviderCapabilities } from "./media/types.js";
|
|
51
|
-
import {
|
|
52
|
-
MEDIA_USAGE_COLLECTION_DELETION_LIMITS,
|
|
53
|
-
processDueMediaUsageCollectionDeletions,
|
|
54
|
-
} from "./media/usage/collection-deletion-processor.js";
|
|
54
|
+
import { activateMediaUsageCapture } from "./media/usage/activation.js";
|
|
55
55
|
import {
|
|
56
56
|
deleteContentMediaUsage,
|
|
57
57
|
findNonTranslatableSiblingContentIds,
|
|
58
58
|
markContentMediaUsageCollectionStale,
|
|
59
59
|
refreshContentMediaUsageAfterWrite,
|
|
60
60
|
} from "./media/usage/content-refresh.js";
|
|
61
|
-
import {
|
|
62
|
-
|
|
63
|
-
processDueMediaUsageReconciliation,
|
|
64
|
-
} from "./media/usage/reconciliation-processor.js";
|
|
65
|
-
import {
|
|
66
|
-
MEDIA_USAGE_WORK_PROCESSING_LIMITS,
|
|
67
|
-
processDueMediaUsageWork,
|
|
68
|
-
processMediaUsageWorkAfterWrite,
|
|
69
|
-
} from "./media/usage/work-processor.js";
|
|
61
|
+
import { processMediaUsageWorkAfterWrite } from "./media/usage/work-processor.js";
|
|
62
|
+
import { inspectSandboxHookResult } from "./plugins/sandbox/hook-result.js";
|
|
70
63
|
import { createSandboxRunnerOptions } from "./plugins/sandbox/runner-options.js";
|
|
71
64
|
import { getSandboxRouteErrorDetails } from "./plugins/sandbox/types.js";
|
|
72
65
|
import type {
|
|
@@ -75,6 +68,7 @@ import type {
|
|
|
75
68
|
SandboxRunnerFactory,
|
|
76
69
|
} from "./plugins/sandbox/types.js";
|
|
77
70
|
import type {
|
|
71
|
+
ContentHookEvent,
|
|
78
72
|
ResolvedPlugin,
|
|
79
73
|
MediaItem,
|
|
80
74
|
PluginManifest,
|
|
@@ -90,7 +84,6 @@ import type {
|
|
|
90
84
|
UserInfo,
|
|
91
85
|
} from "./plugins/types.js";
|
|
92
86
|
import { recordSchedulerHeartbeatSafely } from "./scheduler-health.js";
|
|
93
|
-
import { MAX_COLLECTION_LIST_COLUMNS, type FieldType } from "./schema/types.js";
|
|
94
87
|
import { isMissingTableError } from "./utils/db-errors.js";
|
|
95
88
|
import { hashString } from "./utils/hash.js";
|
|
96
89
|
import { createInitLock, type InitLock, initWithLock } from "./utils/init-lock.js";
|
|
@@ -198,6 +191,7 @@ import {
|
|
|
198
191
|
handleMediaGet,
|
|
199
192
|
handleMediaCreate,
|
|
200
193
|
handleMediaUpdate,
|
|
194
|
+
handleMediaReplaceMetadata,
|
|
201
195
|
handleMediaDelete,
|
|
202
196
|
handleRevisionList,
|
|
203
197
|
handleRevisionGet,
|
|
@@ -227,6 +221,7 @@ import {
|
|
|
227
221
|
type RouteCallerInput,
|
|
228
222
|
type RouteMeta,
|
|
229
223
|
} from "./plugins/routes.js";
|
|
224
|
+
import { isContentSaveRejection } from "./plugins/save-rejection.js";
|
|
230
225
|
import type { CronScheduler } from "./plugins/scheduler/types.js";
|
|
231
226
|
import { PluginStateRepository } from "./plugins/state.js";
|
|
232
227
|
import { syncDeclaredStorageIndexes } from "./plugins/storage-indexes.js";
|
|
@@ -237,41 +232,9 @@ import { publishDueContent, type PublishedRef } from "./scheduled-publish.js";
|
|
|
237
232
|
import { FTSManager } from "./search/fts-manager.js";
|
|
238
233
|
import { invalidateSiteSettingsCache } from "./settings/index.js";
|
|
239
234
|
|
|
240
|
-
/**
|
|
241
|
-
* Map schema field types to editor field kinds
|
|
242
|
-
*/
|
|
243
|
-
const FIELD_TYPE_TO_KIND: Record<FieldType, string> = {
|
|
244
|
-
string: "string",
|
|
245
|
-
slug: "string",
|
|
246
|
-
url: "url",
|
|
247
|
-
text: "richText",
|
|
248
|
-
number: "number",
|
|
249
|
-
integer: "number",
|
|
250
|
-
boolean: "boolean",
|
|
251
|
-
datetime: "datetime",
|
|
252
|
-
select: "select",
|
|
253
|
-
multiSelect: "multiSelect",
|
|
254
|
-
portableText: "portableText",
|
|
255
|
-
image: "image",
|
|
256
|
-
file: "file",
|
|
257
|
-
reference: "reference",
|
|
258
|
-
json: "json",
|
|
259
|
-
repeater: "repeater",
|
|
260
|
-
};
|
|
261
|
-
|
|
262
235
|
const DRAFT_ONLY_UPDATE_KEYS = new Set(["data", "slug", "locale", "skipRevision"]);
|
|
263
236
|
const MAX_DRAFT_STAGE_ATTEMPTS = 32;
|
|
264
237
|
|
|
265
|
-
const LIST_COLUMN_FIELD_TYPES: ReadonlySet<FieldType> = new Set([
|
|
266
|
-
"string",
|
|
267
|
-
"number",
|
|
268
|
-
"integer",
|
|
269
|
-
"boolean",
|
|
270
|
-
"datetime",
|
|
271
|
-
"select",
|
|
272
|
-
"multiSelect",
|
|
273
|
-
]);
|
|
274
|
-
|
|
275
238
|
/**
|
|
276
239
|
* Sandboxed plugin entry from virtual module
|
|
277
240
|
*/
|
|
@@ -434,6 +397,28 @@ export interface EmDashRuntimeParts {
|
|
|
434
397
|
pipelineRef: { current: HookPipeline };
|
|
435
398
|
}
|
|
436
399
|
|
|
400
|
+
/**
|
|
401
|
+
* A `ContentSaveRejectedError` carries a message the plugin wrote for the
|
|
402
|
+
* editor; every other exception stays internal and is replaced by a generic
|
|
403
|
+
* message so hook internals cannot leak through the API.
|
|
404
|
+
*/
|
|
405
|
+
function beforeSaveFailure(error: unknown) {
|
|
406
|
+
if (isContentSaveRejection(error)) {
|
|
407
|
+
return {
|
|
408
|
+
success: false as const,
|
|
409
|
+
error: { code: ErrorCode.SAVE_REJECTED, message: error.message },
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
console.error("EmDash: content:beforeSave hook failed:", error);
|
|
413
|
+
return {
|
|
414
|
+
success: false as const,
|
|
415
|
+
error: {
|
|
416
|
+
code: ErrorCode.CONTENT_HOOK_ERROR,
|
|
417
|
+
message: "A plugin hook failed while saving content",
|
|
418
|
+
},
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
|
|
437
422
|
/**
|
|
438
423
|
* Convert a ContentItem to Record<string, unknown> for hook consumption.
|
|
439
424
|
* Hooks receive the full item as a flat record.
|
|
@@ -553,62 +538,6 @@ const marketplaceManifestCache = new Map<
|
|
|
553
538
|
const sandboxedRouteMetaCache = new Map<string, Map<string, RouteMeta>>();
|
|
554
539
|
let sandboxRunner: SandboxRunner | null = null;
|
|
555
540
|
|
|
556
|
-
export const MEDIA_USAGE_MAINTENANCE_QUERY_RESERVATIONS = Object.freeze({
|
|
557
|
-
entryWork: MEDIA_USAGE_WORK_PROCESSING_LIMITS.ordinaryStatementsPerJob,
|
|
558
|
-
collectionDeletion: MEDIA_USAGE_COLLECTION_DELETION_LIMITS.maxQueriesPerTick,
|
|
559
|
-
reconciliation: MEDIA_USAGE_RECONCILIATION_LIMITS.maxQueriesPerTick,
|
|
560
|
-
maxClassQueries: Math.max(
|
|
561
|
-
MEDIA_USAGE_WORK_PROCESSING_LIMITS.ordinaryStatementsPerJob,
|
|
562
|
-
MEDIA_USAGE_COLLECTION_DELETION_LIMITS.maxQueriesPerTick,
|
|
563
|
-
MEDIA_USAGE_RECONCILIATION_LIMITS.maxQueriesPerTick,
|
|
564
|
-
),
|
|
565
|
-
eventCeiling: 40,
|
|
566
|
-
});
|
|
567
|
-
|
|
568
|
-
export type MediaUsageMaintenanceTaskClass =
|
|
569
|
-
| "entry_work"
|
|
570
|
-
| "collection_deletion"
|
|
571
|
-
| "reconciliation";
|
|
572
|
-
|
|
573
|
-
export type MediaUsageMaintenanceResult =
|
|
574
|
-
| { outcome: "inactive" | "admission_closed"; taskClass: null; turn: null }
|
|
575
|
-
| { outcome: "processed"; taskClass: MediaUsageMaintenanceTaskClass; turn: number };
|
|
576
|
-
|
|
577
|
-
async function runScheduledMediaUsageLane(
|
|
578
|
-
db: Kysely<Database>,
|
|
579
|
-
): Promise<MediaUsageMaintenanceResult> {
|
|
580
|
-
const queriesAlreadySpent = getRequestContext()?.metrics?.dbCount ?? 0;
|
|
581
|
-
if (
|
|
582
|
-
queriesAlreadySpent + 1 + MEDIA_USAGE_MAINTENANCE_QUERY_RESERVATIONS.maxClassQueries >
|
|
583
|
-
MEDIA_USAGE_MAINTENANCE_QUERY_RESERVATIONS.eventCeiling
|
|
584
|
-
) {
|
|
585
|
-
return { outcome: "admission_closed", taskClass: null, turn: null };
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
const activation = await db
|
|
589
|
-
.updateTable("_emdash_media_usage_activation")
|
|
590
|
-
.set({
|
|
591
|
-
media_usage_maintenance_turn: sql<number>`(media_usage_maintenance_turn + 1) % 3`,
|
|
592
|
-
})
|
|
593
|
-
.where("task_key", "=", "incremental_capture")
|
|
594
|
-
.where("state", "=", "active")
|
|
595
|
-
.returning("media_usage_maintenance_turn")
|
|
596
|
-
.executeTakeFirst();
|
|
597
|
-
if (!activation) return { outcome: "inactive", taskClass: null, turn: null };
|
|
598
|
-
|
|
599
|
-
const turn = activation.media_usage_maintenance_turn;
|
|
600
|
-
if (turn === 0) {
|
|
601
|
-
await processDueMediaUsageWork(db);
|
|
602
|
-
return { outcome: "processed", taskClass: "entry_work", turn };
|
|
603
|
-
}
|
|
604
|
-
if (turn === 1) {
|
|
605
|
-
await processDueMediaUsageCollectionDeletions(db);
|
|
606
|
-
return { outcome: "processed", taskClass: "collection_deletion", turn };
|
|
607
|
-
}
|
|
608
|
-
await processDueMediaUsageReconciliation(db);
|
|
609
|
-
return { outcome: "processed", taskClass: "reconciliation", turn };
|
|
610
|
-
}
|
|
611
|
-
|
|
612
541
|
/**
|
|
613
542
|
* EmDashRuntime - singleton per worker
|
|
614
543
|
*/
|
|
@@ -814,10 +743,6 @@ export class EmDashRuntime {
|
|
|
814
743
|
return { published };
|
|
815
744
|
}
|
|
816
745
|
|
|
817
|
-
async runScheduledMediaUsageTasks(): Promise<MediaUsageMaintenanceResult> {
|
|
818
|
-
return runScheduledMediaUsageLane(this.db);
|
|
819
|
-
}
|
|
820
|
-
|
|
821
746
|
/**
|
|
822
747
|
* Materialize plugin-declared storage indexes, once per process.
|
|
823
748
|
*
|
|
@@ -1448,6 +1373,15 @@ export class EmDashRuntime {
|
|
|
1448
1373
|
// per-isolate lock keyed by the configured db so a reclaimed-and-rerun
|
|
1449
1374
|
// create() can't apply the seed a second time concurrently.
|
|
1450
1375
|
if (seedGate.collectionCount === 0 && !seedGate.setupDone) {
|
|
1376
|
+
try {
|
|
1377
|
+
const activation = await activateMediaUsageCapture(db, { writersDrained: true });
|
|
1378
|
+
if (activation.outcome !== "active") {
|
|
1379
|
+
throw new Error("Fresh-site media usage activation did not complete");
|
|
1380
|
+
}
|
|
1381
|
+
} catch (error) {
|
|
1382
|
+
await disposeReadDb();
|
|
1383
|
+
throw error;
|
|
1384
|
+
}
|
|
1451
1385
|
const seedKey = deps.config.database?.entrypoint ?? "default";
|
|
1452
1386
|
const seedHolder = getSeedHolder();
|
|
1453
1387
|
try {
|
|
@@ -1756,14 +1690,6 @@ export class EmDashRuntime {
|
|
|
1756
1690
|
if (deps.createScheduler) {
|
|
1757
1691
|
const scheduler = deps.createScheduler(cronExecutor);
|
|
1758
1692
|
cronScheduler = scheduler;
|
|
1759
|
-
const runMediaUsageMaintenance = async () => {
|
|
1760
|
-
const runtime = runtimeRef.current;
|
|
1761
|
-
if (runtime) {
|
|
1762
|
-
await runtime.runScheduledMediaUsageTasks();
|
|
1763
|
-
} else {
|
|
1764
|
-
await runScheduledMediaUsageLane(db);
|
|
1765
|
-
}
|
|
1766
|
-
};
|
|
1767
1693
|
|
|
1768
1694
|
// Run scheduled publishing and system cleanup alongside each tick.
|
|
1769
1695
|
// Pass storage so cleanupPendingUploads can delete orphaned files.
|
|
@@ -1797,16 +1723,7 @@ export class EmDashRuntime {
|
|
|
1797
1723
|
// Never throws; no-op unless scheduled backups are enabled and due.
|
|
1798
1724
|
await maybeRunScheduledBackup(db, storage ?? undefined);
|
|
1799
1725
|
await recordSchedulerHeartbeatSafely(db);
|
|
1800
|
-
if (!scheduler.setMediaUsageMaintenance) {
|
|
1801
|
-
try {
|
|
1802
|
-
await runMediaUsageMaintenance();
|
|
1803
|
-
} catch (error) {
|
|
1804
|
-
console.error("[media-usage] Scheduled maintenance failed:", error);
|
|
1805
|
-
}
|
|
1806
|
-
}
|
|
1807
1726
|
});
|
|
1808
|
-
scheduler.setMediaUsageMaintenance?.(runMediaUsageMaintenance);
|
|
1809
|
-
|
|
1810
1727
|
// start() is void on the timer scheduler but the interface
|
|
1811
1728
|
// allows a promise (alarm-backed schedulers); we don't block on it.
|
|
1812
1729
|
void scheduler.start();
|
|
@@ -2506,103 +2423,10 @@ export class EmDashRuntime {
|
|
|
2506
2423
|
* is two queries in practice; never N+1.
|
|
2507
2424
|
*/
|
|
2508
2425
|
private async _buildManifest(): Promise<EmDashManifest> {
|
|
2509
|
-
// Build collections from database.
|
|
2426
|
+
// Build collections from the live database.
|
|
2510
2427
|
// Use this.db (ALS-aware getter) so playground mode picks up the
|
|
2511
2428
|
// per-session DO database instead of the hardcoded singleton.
|
|
2512
|
-
const manifestCollections
|
|
2513
|
-
try {
|
|
2514
|
-
const registry = new SchemaRegistry(this.db);
|
|
2515
|
-
const dbCollections = await registry.listCollectionsWithFields();
|
|
2516
|
-
for (const collection of dbCollections) {
|
|
2517
|
-
const fields: Record<
|
|
2518
|
-
string,
|
|
2519
|
-
{
|
|
2520
|
-
kind: string;
|
|
2521
|
-
label?: string;
|
|
2522
|
-
required?: boolean;
|
|
2523
|
-
widget?: string;
|
|
2524
|
-
// Two shapes: legacy enum-style `[{ value, label }]` for select widgets,
|
|
2525
|
-
// or arbitrary `Record<string, unknown>` for plugin field widgets that
|
|
2526
|
-
// need per-field config (e.g. a checkbox grid receiving its column defs).
|
|
2527
|
-
options?: Array<{ value: string; label: string }> | Record<string, unknown>;
|
|
2528
|
-
id?: string;
|
|
2529
|
-
validation?: Record<string, unknown>;
|
|
2530
|
-
}
|
|
2531
|
-
> = {};
|
|
2532
|
-
|
|
2533
|
-
for (const field of collection.fields) {
|
|
2534
|
-
const entry: (typeof fields)[string] = {
|
|
2535
|
-
kind: FIELD_TYPE_TO_KIND[field.type] ?? "string",
|
|
2536
|
-
label: field.label,
|
|
2537
|
-
required: field.required,
|
|
2538
|
-
};
|
|
2539
|
-
// Always include the field's database ID so the admin can forward it
|
|
2540
|
-
// to upload/media-list API calls for MIME allowlist widening.
|
|
2541
|
-
entry.id = field.id;
|
|
2542
|
-
if (field.widget) entry.widget = field.widget;
|
|
2543
|
-
// Plugin field widgets read their per-field config from `field.options`,
|
|
2544
|
-
// which the seed schema types as `Record<string, unknown>`. Pass it
|
|
2545
|
-
// through to the manifest so plugin widgets in the admin SPA receive it.
|
|
2546
|
-
if (field.options) {
|
|
2547
|
-
entry.options = field.options;
|
|
2548
|
-
}
|
|
2549
|
-
// Legacy: select/multiSelect enum options live on `field.validation.options`.
|
|
2550
|
-
// Wins over `field.options` to preserve existing behavior for enum widgets.
|
|
2551
|
-
if (field.validation?.options) {
|
|
2552
|
-
entry.options = field.validation.options.map((v) => ({
|
|
2553
|
-
value: v,
|
|
2554
|
-
label: v.charAt(0).toUpperCase() + v.slice(1),
|
|
2555
|
-
}));
|
|
2556
|
-
}
|
|
2557
|
-
// Include full validation for repeater fields (subFields, minItems, maxItems)
|
|
2558
|
-
// and for file/image fields (allowedMimeTypes).
|
|
2559
|
-
if (
|
|
2560
|
-
(field.type === "repeater" || field.type === "file" || field.type === "image") &&
|
|
2561
|
-
field.validation
|
|
2562
|
-
) {
|
|
2563
|
-
entry.validation = { ...field.validation };
|
|
2564
|
-
}
|
|
2565
|
-
fields[field.slug] = entry;
|
|
2566
|
-
}
|
|
2567
|
-
|
|
2568
|
-
const configuredListColumns = collection.admin?.listColumns ?? [];
|
|
2569
|
-
const fieldTypes = new Map(collection.fields.map((field) => [field.slug, field.type]));
|
|
2570
|
-
const listColumns: string[] = [];
|
|
2571
|
-
for (const slug of configuredListColumns) {
|
|
2572
|
-
if (listColumns.includes(slug)) continue;
|
|
2573
|
-
const fieldType = fieldTypes.get(slug);
|
|
2574
|
-
if (!fieldType || !LIST_COLUMN_FIELD_TYPES.has(fieldType)) {
|
|
2575
|
-
console.warn(
|
|
2576
|
-
`EmDash: Ignoring unsupported or unknown list column "${slug}" in collection "${collection.slug}".`,
|
|
2577
|
-
);
|
|
2578
|
-
continue;
|
|
2579
|
-
}
|
|
2580
|
-
if (listColumns.length >= MAX_COLLECTION_LIST_COLUMNS) {
|
|
2581
|
-
console.warn(
|
|
2582
|
-
`EmDash: Collection "${collection.slug}" declares more than ${MAX_COLLECTION_LIST_COLUMNS} list columns; extra columns are ignored.`,
|
|
2583
|
-
);
|
|
2584
|
-
break;
|
|
2585
|
-
}
|
|
2586
|
-
listColumns.push(slug);
|
|
2587
|
-
}
|
|
2588
|
-
|
|
2589
|
-
manifestCollections[collection.slug] = {
|
|
2590
|
-
label: collection.label,
|
|
2591
|
-
labelSingular: collection.labelSingular || collection.label,
|
|
2592
|
-
supports: collection.supports || [],
|
|
2593
|
-
hasSeo: collection.hasSeo,
|
|
2594
|
-
urlPattern: collection.urlPattern,
|
|
2595
|
-
routable: collection.routable !== false,
|
|
2596
|
-
titleField: collection.titleField,
|
|
2597
|
-
dateField: collection.dateField,
|
|
2598
|
-
...(collection.hidden ? { hidden: true } : {}),
|
|
2599
|
-
listColumns: listColumns.length > 0 ? listColumns : undefined,
|
|
2600
|
-
fields,
|
|
2601
|
-
};
|
|
2602
|
-
}
|
|
2603
|
-
} catch (error) {
|
|
2604
|
-
console.debug("EmDash: Could not load database collections:", error);
|
|
2605
|
-
}
|
|
2429
|
+
const manifestCollections = await buildManifestCollections({}, this.db);
|
|
2606
2430
|
|
|
2607
2431
|
// Build plugins manifest
|
|
2608
2432
|
const manifestPlugins: Record<
|
|
@@ -2768,7 +2592,11 @@ export class EmDashRuntime {
|
|
|
2768
2592
|
const i18nConfig = virtualConfig?.i18n ?? getI18nConfig();
|
|
2769
2593
|
const i18n =
|
|
2770
2594
|
i18nConfig && i18nConfig.locales && i18nConfig.locales.length > 1
|
|
2771
|
-
? {
|
|
2595
|
+
? {
|
|
2596
|
+
defaultLocale: i18nConfig.defaultLocale,
|
|
2597
|
+
locales: i18nConfig.locales,
|
|
2598
|
+
prefixDefaultLocale: i18nConfig.prefixDefaultLocale,
|
|
2599
|
+
}
|
|
2772
2600
|
: undefined;
|
|
2773
2601
|
|
|
2774
2602
|
// Normalize the experimental registry config for browser consumption.
|
|
@@ -2969,12 +2797,18 @@ export class EmDashRuntime {
|
|
|
2969
2797
|
// Run beforeSave hooks (trusted plugins)
|
|
2970
2798
|
let processedData = body.data;
|
|
2971
2799
|
if (this.hooks.hasHooks("content:beforeSave")) {
|
|
2972
|
-
|
|
2973
|
-
|
|
2800
|
+
try {
|
|
2801
|
+
const hookResult = await this.hooks.runContentBeforeSave(body.data, collection, true);
|
|
2802
|
+
processedData = hookResult.content;
|
|
2803
|
+
} catch (error) {
|
|
2804
|
+
return beforeSaveFailure(error);
|
|
2805
|
+
}
|
|
2974
2806
|
}
|
|
2975
2807
|
|
|
2976
2808
|
// Run beforeSave hooks (sandboxed plugins)
|
|
2977
|
-
|
|
2809
|
+
const sandboxResult = await this.runSandboxedBeforeSave(processedData, collection, true);
|
|
2810
|
+
if (!sandboxResult.success) return sandboxResult;
|
|
2811
|
+
processedData = sandboxResult.data;
|
|
2978
2812
|
|
|
2979
2813
|
// Normalize media fields (fill dimensions, storageKey, etc.)
|
|
2980
2814
|
processedData = await this.normalizeMediaFields(collection, processedData);
|
|
@@ -3065,16 +2899,28 @@ export class EmDashRuntime {
|
|
|
3065
2899
|
let processedData = bodyWithoutRev.data;
|
|
3066
2900
|
if (bodyWithoutRev.data) {
|
|
3067
2901
|
if (this.hooks.hasHooks("content:beforeSave")) {
|
|
3068
|
-
|
|
3069
|
-
|
|
3070
|
-
|
|
3071
|
-
|
|
3072
|
-
|
|
3073
|
-
|
|
2902
|
+
try {
|
|
2903
|
+
const hookResult = await this.hooks.runContentBeforeSave(
|
|
2904
|
+
bodyWithoutRev.data,
|
|
2905
|
+
collection,
|
|
2906
|
+
false,
|
|
2907
|
+
resolvedItem?.id,
|
|
2908
|
+
);
|
|
2909
|
+
processedData = hookResult.content;
|
|
2910
|
+
} catch (error) {
|
|
2911
|
+
return beforeSaveFailure(error);
|
|
2912
|
+
}
|
|
3074
2913
|
}
|
|
3075
2914
|
|
|
3076
2915
|
// Run sandboxed beforeSave hooks
|
|
3077
|
-
|
|
2916
|
+
const sandboxResult = await this.runSandboxedBeforeSave(
|
|
2917
|
+
processedData!,
|
|
2918
|
+
collection,
|
|
2919
|
+
false,
|
|
2920
|
+
resolvedItem?.id,
|
|
2921
|
+
);
|
|
2922
|
+
if (!sandboxResult.success) return sandboxResult;
|
|
2923
|
+
processedData = sandboxResult.data;
|
|
3078
2924
|
|
|
3079
2925
|
// Normalize media fields (fill dimensions, storageKey, etc.)
|
|
3080
2926
|
processedData = await this.normalizeMediaFields(collection, processedData);
|
|
@@ -3317,7 +3163,7 @@ export class EmDashRuntime {
|
|
|
3317
3163
|
|
|
3318
3164
|
async handleContentListTrashed(
|
|
3319
3165
|
collection: string,
|
|
3320
|
-
params: { cursor?: string; limit?: number } = {},
|
|
3166
|
+
params: { cursor?: string; limit?: number; locale?: string } = {},
|
|
3321
3167
|
) {
|
|
3322
3168
|
return handleContentListTrashed(this.db, collection, params);
|
|
3323
3169
|
}
|
|
@@ -3350,8 +3196,8 @@ export class EmDashRuntime {
|
|
|
3350
3196
|
return result;
|
|
3351
3197
|
}
|
|
3352
3198
|
|
|
3353
|
-
async handleContentCountTrashed(collection: string) {
|
|
3354
|
-
return handleContentCountTrashed(this.db, collection);
|
|
3199
|
+
async handleContentCountTrashed(collection: string, params: { locale?: string } = {}) {
|
|
3200
|
+
return handleContentCountTrashed(this.db, collection, params);
|
|
3355
3201
|
}
|
|
3356
3202
|
|
|
3357
3203
|
async handleContentDuplicate(collection: string, id: string, authorId?: string) {
|
|
@@ -3373,6 +3219,7 @@ export class EmDashRuntime {
|
|
|
3373
3219
|
publishedAt?: string;
|
|
3374
3220
|
requireScheduledDue?: boolean;
|
|
3375
3221
|
expectedScheduledAt?: string;
|
|
3222
|
+
_rev?: string;
|
|
3376
3223
|
} = {},
|
|
3377
3224
|
) {
|
|
3378
3225
|
const result = await handleContentPublish(this.db, collection, id, options);
|
|
@@ -3388,8 +3235,8 @@ export class EmDashRuntime {
|
|
|
3388
3235
|
return result;
|
|
3389
3236
|
}
|
|
3390
3237
|
|
|
3391
|
-
async handleContentUnpublish(collection: string, id: string) {
|
|
3392
|
-
const result = await handleContentUnpublish(this.db, collection, id);
|
|
3238
|
+
async handleContentUnpublish(collection: string, id: string, options: { _rev?: string } = {}) {
|
|
3239
|
+
const result = await handleContentUnpublish(this.db, collection, id, options);
|
|
3393
3240
|
if (result.success && result.data) {
|
|
3394
3241
|
await this.refreshContentUsageAfterSuccessfulWrite(collection, [result.data.item.id]);
|
|
3395
3242
|
}
|
|
@@ -3434,8 +3281,8 @@ export class EmDashRuntime {
|
|
|
3434
3281
|
return handleContentCountScheduled(this.db, collection);
|
|
3435
3282
|
}
|
|
3436
3283
|
|
|
3437
|
-
async handleContentDiscardDraft(collection: string, id: string) {
|
|
3438
|
-
const result = await handleContentDiscardDraft(this.db, collection, id);
|
|
3284
|
+
async handleContentDiscardDraft(collection: string, id: string, options: { _rev?: string } = {}) {
|
|
3285
|
+
const result = await handleContentDiscardDraft(this.db, collection, id, options);
|
|
3439
3286
|
if (result.success && result.data) {
|
|
3440
3287
|
await this.refreshContentUsageAfterSuccessfulWrite(collection, [result.data.item.id]);
|
|
3441
3288
|
}
|
|
@@ -3456,9 +3303,11 @@ export class EmDashRuntime {
|
|
|
3456
3303
|
|
|
3457
3304
|
async handleMediaList(params: {
|
|
3458
3305
|
cursor?: string;
|
|
3306
|
+
page?: number;
|
|
3459
3307
|
limit?: number;
|
|
3460
3308
|
mimeType?: string | readonly string[];
|
|
3461
3309
|
q?: string;
|
|
3310
|
+
folderId?: string | null;
|
|
3462
3311
|
}) {
|
|
3463
3312
|
return handleMediaList(this.db, params);
|
|
3464
3313
|
}
|
|
@@ -3478,6 +3327,7 @@ export class EmDashRuntime {
|
|
|
3478
3327
|
blurhash?: string;
|
|
3479
3328
|
dominantColor?: string;
|
|
3480
3329
|
authorId?: string;
|
|
3330
|
+
folderId?: string | null;
|
|
3481
3331
|
}) {
|
|
3482
3332
|
// Run beforeUpload hooks
|
|
3483
3333
|
let processedInput = input;
|
|
@@ -3519,7 +3369,15 @@ export class EmDashRuntime {
|
|
|
3519
3369
|
|
|
3520
3370
|
async handleMediaUpdate(
|
|
3521
3371
|
id: string,
|
|
3522
|
-
input: {
|
|
3372
|
+
input: {
|
|
3373
|
+
alt?: string;
|
|
3374
|
+
caption?: string;
|
|
3375
|
+
width?: number;
|
|
3376
|
+
height?: number;
|
|
3377
|
+
folderId?: string | null;
|
|
3378
|
+
focalX?: number | null;
|
|
3379
|
+
focalY?: number | null;
|
|
3380
|
+
},
|
|
3523
3381
|
) {
|
|
3524
3382
|
const result = await handleMediaUpdate(this.db, id, input);
|
|
3525
3383
|
// Resolved media references in site settings (`logo`, `favicon`,
|
|
@@ -3534,6 +3392,18 @@ export class EmDashRuntime {
|
|
|
3534
3392
|
return result;
|
|
3535
3393
|
}
|
|
3536
3394
|
|
|
3395
|
+
async handleMediaReplaceMetadata(
|
|
3396
|
+
id: string,
|
|
3397
|
+
expectedStorageKey: string,
|
|
3398
|
+
input: { size: number; width: number; height: number; contentHash: string },
|
|
3399
|
+
) {
|
|
3400
|
+
const result = await handleMediaReplaceMetadata(this.db, id, expectedStorageKey, input);
|
|
3401
|
+
if (result.success) {
|
|
3402
|
+
invalidateSiteSettingsCache();
|
|
3403
|
+
}
|
|
3404
|
+
return result;
|
|
3405
|
+
}
|
|
3406
|
+
|
|
3537
3407
|
async handleMediaDelete(id: string) {
|
|
3538
3408
|
const result = await handleMediaDelete(this.db, id);
|
|
3539
3409
|
// Same reasoning as `handleMediaUpdate`: if the deleted media row
|
|
@@ -3690,14 +3560,14 @@ export class EmDashRuntime {
|
|
|
3690
3560
|
for (const contentId of new Set(contentIds)) {
|
|
3691
3561
|
try {
|
|
3692
3562
|
const work = await processMediaUsageWorkAfterWrite(this.db, collection, contentId);
|
|
3693
|
-
if (work.outcome !== "inactive")
|
|
3563
|
+
if (work.outcome !== "inactive") continue;
|
|
3694
3564
|
await refreshContentMediaUsageAfterWrite(this.db, collection, contentId);
|
|
3695
3565
|
} catch (error) {
|
|
3696
3566
|
console.error(
|
|
3697
3567
|
`[media-usage] Failed after content write ${collection}/${contentId}:`,
|
|
3698
3568
|
error,
|
|
3699
3569
|
);
|
|
3700
|
-
|
|
3570
|
+
continue;
|
|
3701
3571
|
}
|
|
3702
3572
|
}
|
|
3703
3573
|
}
|
|
@@ -4056,7 +3926,11 @@ export class EmDashRuntime {
|
|
|
4056
3926
|
if (value == null) continue;
|
|
4057
3927
|
|
|
4058
3928
|
try {
|
|
4059
|
-
|
|
3929
|
+
// Only image fields carry a dark variant.
|
|
3930
|
+
const normalized =
|
|
3931
|
+
field.type === "image"
|
|
3932
|
+
? await normalizeImageValue(value, getProvider)
|
|
3933
|
+
: await normalizeMediaValue(value, getProvider);
|
|
4060
3934
|
if (normalized) {
|
|
4061
3935
|
result[field.slug] = normalized;
|
|
4062
3936
|
}
|
|
@@ -4083,7 +3957,7 @@ export class EmDashRuntime {
|
|
|
4083
3957
|
const subValue = normalizedItem[slug];
|
|
4084
3958
|
if (subValue == null) continue;
|
|
4085
3959
|
try {
|
|
4086
|
-
const normalized = await
|
|
3960
|
+
const normalized = await normalizeImageValue(subValue, getProvider);
|
|
4087
3961
|
if (normalized) {
|
|
4088
3962
|
normalizedItem[slug] = normalized;
|
|
4089
3963
|
}
|
|
@@ -4103,7 +3977,8 @@ export class EmDashRuntime {
|
|
|
4103
3977
|
content: Record<string, unknown>,
|
|
4104
3978
|
collection: string,
|
|
4105
3979
|
isNew: boolean,
|
|
4106
|
-
|
|
3980
|
+
contentId?: string,
|
|
3981
|
+
) {
|
|
4107
3982
|
let result = content;
|
|
4108
3983
|
|
|
4109
3984
|
for (const [pluginKey, plugin] of this.sandboxedPlugins) {
|
|
@@ -4111,11 +3986,30 @@ export class EmDashRuntime {
|
|
|
4111
3986
|
if (!id || !this.isPluginEnabled(id)) continue;
|
|
4112
3987
|
|
|
4113
3988
|
try {
|
|
4114
|
-
const
|
|
4115
|
-
|
|
4116
|
-
|
|
4117
|
-
|
|
4118
|
-
|
|
3989
|
+
const event: ContentHookEvent = { content: result, collection, isNew };
|
|
3990
|
+
if (contentId !== undefined) event.id = contentId;
|
|
3991
|
+
const hookResult = await plugin.invokeHook("content:beforeSave", event);
|
|
3992
|
+
const inspection = inspectSandboxHookResult(hookResult);
|
|
3993
|
+
if (inspection.kind === "error") {
|
|
3994
|
+
return {
|
|
3995
|
+
success: false as const,
|
|
3996
|
+
error: {
|
|
3997
|
+
code: ErrorCode.SAVE_REJECTED,
|
|
3998
|
+
message: "Save rejected by a sandboxed plugin",
|
|
3999
|
+
details: { pluginId: id, reason: inspection.error.reason },
|
|
4000
|
+
},
|
|
4001
|
+
};
|
|
4002
|
+
}
|
|
4003
|
+
if (inspection.kind === "malformed") {
|
|
4004
|
+
console.error(`EmDash: Sandboxed plugin ${id} returned an invalid hook result`);
|
|
4005
|
+
return {
|
|
4006
|
+
success: false as const,
|
|
4007
|
+
error: {
|
|
4008
|
+
code: ErrorCode.CONTENT_HOOK_ERROR,
|
|
4009
|
+
message: "A plugin hook failed while saving content",
|
|
4010
|
+
},
|
|
4011
|
+
};
|
|
4012
|
+
}
|
|
4119
4013
|
if (hookResult && typeof hookResult === "object" && !Array.isArray(hookResult)) {
|
|
4120
4014
|
// Sandbox returns unknown; convert to record by iterating own properties
|
|
4121
4015
|
const record: Record<string, unknown> = {};
|
|
@@ -4125,11 +4019,18 @@ export class EmDashRuntime {
|
|
|
4125
4019
|
result = record;
|
|
4126
4020
|
}
|
|
4127
4021
|
} catch (error) {
|
|
4128
|
-
console.error(`EmDash: Sandboxed plugin ${id} beforeSave hook
|
|
4022
|
+
console.error(`EmDash: Sandboxed plugin ${id} beforeSave hook failed:`, error);
|
|
4023
|
+
return {
|
|
4024
|
+
success: false as const,
|
|
4025
|
+
error: {
|
|
4026
|
+
code: ErrorCode.CONTENT_HOOK_ERROR,
|
|
4027
|
+
message: "A plugin hook failed while saving content",
|
|
4028
|
+
},
|
|
4029
|
+
};
|
|
4129
4030
|
}
|
|
4130
4031
|
}
|
|
4131
4032
|
|
|
4132
|
-
return result;
|
|
4033
|
+
return { success: true as const, data: result };
|
|
4133
4034
|
}
|
|
4134
4035
|
|
|
4135
4036
|
private async runSandboxedBeforeDelete(id: string, collection: string): Promise<boolean> {
|
|
@@ -4437,3 +4338,37 @@ export class EmDashRuntime {
|
|
|
4437
4338
|
return status === undefined || status === "active";
|
|
4438
4339
|
}
|
|
4439
4340
|
}
|
|
4341
|
+
|
|
4342
|
+
/**
|
|
4343
|
+
* Normalize an image field value together with its `darkVariant`. The media
|
|
4344
|
+
* normalizer only keeps the media item's own keys, so the variant is normalized
|
|
4345
|
+
* separately and reattached.
|
|
4346
|
+
*/
|
|
4347
|
+
async function normalizeImageValue(
|
|
4348
|
+
value: unknown,
|
|
4349
|
+
getProvider: (id: string) => MediaProvider | undefined,
|
|
4350
|
+
): Promise<ImageValue | null> {
|
|
4351
|
+
const primary = await normalizePrimaryImageValue(value, getProvider);
|
|
4352
|
+
if (!primary || !isRecord(value) || value.darkVariant == null) return primary;
|
|
4353
|
+
const darkVariant = await normalizeMediaValue(value.darkVariant, getProvider);
|
|
4354
|
+
return darkVariant ? { ...primary, darkVariant } : primary;
|
|
4355
|
+
}
|
|
4356
|
+
|
|
4357
|
+
/**
|
|
4358
|
+
* Normalize the primary image of an image field value.
|
|
4359
|
+
*
|
|
4360
|
+
* A legacy string URL that the admin upgraded to `{ id: "", src: url }` so it
|
|
4361
|
+
* can carry a dark variant still has to normalize as a string: as an object it
|
|
4362
|
+
* counts as local media, which strips `src` and leaves nothing behind. The
|
|
4363
|
+
* upgrade outlives the variant — an editor can add one and remove it again —
|
|
4364
|
+
* so the shape decides, not the presence of `darkVariant`.
|
|
4365
|
+
*/
|
|
4366
|
+
async function normalizePrimaryImageValue(
|
|
4367
|
+
value: unknown,
|
|
4368
|
+
getProvider: (id: string) => MediaProvider | undefined,
|
|
4369
|
+
): Promise<ImageValue | null> {
|
|
4370
|
+
if (isRecord(value) && !value.id && typeof value.src === "string" && !value.provider) {
|
|
4371
|
+
return normalizeMediaValue(value.src, getProvider);
|
|
4372
|
+
}
|
|
4373
|
+
return normalizeMediaValue(value, getProvider);
|
|
4374
|
+
}
|