emdash 0.35.0 → 0.36.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-CzL3H752.d.mts} +3 -3
- package/dist/{adapters-Bb1vG41D.d.mts.map → adapters-CzL3H752.d.mts.map} +1 -1
- package/dist/{allowed-origins-DW7sYyqg.mjs → allowed-origins-maylGaHv.mjs} +2 -2
- package/dist/{allowed-origins-DW7sYyqg.mjs.map → allowed-origins-maylGaHv.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -3
- package/dist/api/route-utils.mjs +22 -20
- 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-B0w3uBiG.mjs +2269 -0
- package/dist/api-B0w3uBiG.mjs.map +1 -0
- package/dist/{api-tokens-KO24G1Fd.mjs → api-tokens-9YrrCoE6.mjs} +2 -2
- package/dist/{api-tokens-KO24G1Fd.mjs.map → api-tokens-9YrrCoE6.mjs.map} +1 -1
- package/dist/{apply-kUDt80-G.mjs → apply-B_VMpJ2P.mjs} +34 -35
- package/dist/{apply-kUDt80-G.mjs.map → apply-B_VMpJ2P.mjs.map} +1 -1
- package/dist/astro/index.d.mts +12 -12
- package/dist/astro/index.mjs +26 -15
- 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 +168 -1305
- 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.mjs +4 -4
- 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 +15 -15
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +15 -15
- package/dist/astro/routes/api/admin/bylines/index.mjs +15 -15
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +12 -12
- package/dist/astro/routes/api/admin/comments/_id_.mjs +4 -4
- package/dist/astro/routes/api/admin/comments/bulk.mjs +9 -9
- package/dist/astro/routes/api/admin/comments/counts.mjs +4 -4
- package/dist/astro/routes/api/admin/comments/index.mjs +9 -9
- 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 +3 -3
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +3 -3
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +54 -48
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +54 -48
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +52 -46
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +4 -4
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +52 -46
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +53 -47
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +53 -47
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +52 -46
- package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +52 -46
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +53 -47
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +52 -46
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +53 -47
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +54 -48
- 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 +172 -133
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +54 -48
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +52 -46
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +52 -46
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +2 -2
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +52 -46
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +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 +13 -13
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +12 -12
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +3 -3
- 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 +8 -8
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +16 -14
- 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 +16 -14
- 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 +13 -13
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/index.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/trash.mjs +7 -7
- package/dist/astro/routes/api/dashboard.mjs +7 -7
- package/dist/astro/routes/api/dev/emails.mjs +2 -2
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +16 -16
- 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 +12 -12
- 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 +16 -16
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +26 -26
- package/dist/astro/routes/api/manifest.mjs +4 -4
- package/dist/astro/routes/api/mcp.mjs +42 -42
- package/dist/astro/routes/api/media/_id_/confirm.mjs +11 -11
- 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_.mjs +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 +9 -9
- package/dist/astro/routes/api/media.d.mts.map +1 -1
- package/dist/astro/routes/api/media.mjs +28 -19
- package/dist/astro/routes/api/media.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +8 -8
- package/dist/astro/routes/api/menus/_name_/items.mjs +8 -8
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +8 -8
- package/dist/astro/routes/api/menus/_name_/translations.mjs +8 -8
- package/dist/astro/routes/api/menus/_name_.mjs +8 -8
- package/dist/astro/routes/api/menus/index.mjs +8 -8
- 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 +153 -6
- 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 +16 -14
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/translations.mjs +11 -9
- package/dist/astro/routes/api/relations/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/relations/index.mjs +16 -14
- 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 +52 -46
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +52 -46
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +52 -46
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +52 -46
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +52 -46
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/reorder.mjs +52 -46
- 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 +52 -46
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +52 -46
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.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 +4 -4
- package/dist/astro/routes/api/settings.mjs +13 -13
- 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 +34 -27
- 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 +31 -29
- 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.mjs +13 -13
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +13 -13
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +13 -13
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +13 -13
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +13 -13
- package/dist/astro/routes/api/taxonomies/_name_.mjs +13 -13
- package/dist/astro/routes/api/taxonomies/index.mjs +13 -13
- 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.mjs +7 -7
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +10 -10
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +10 -10
- package/dist/astro/routes/api/widget-areas/_name_.mjs +5 -5
- package/dist/astro/routes/api/widget-areas/index.mjs +10 -10
- package/dist/astro/routes/api/widget-components.mjs +2 -2
- package/dist/astro/routes/robots.txt.mjs +6 -6
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +9 -9
- package/dist/astro/routes/sitemap.xml.mjs +7 -7
- package/dist/astro/types.d.mts +19 -14
- 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-ByYs-Uxs.mjs} +2 -2
- package/dist/{authorize-DUElxgOQ.mjs.map → authorize-ByYs-Uxs.mjs.map} +1 -1
- package/dist/{backup-DWYpJlLj.mjs → backup-ChyHfIoX.mjs} +5 -5
- package/dist/{backup-DWYpJlLj.mjs.map → backup-ChyHfIoX.mjs.map} +1 -1
- package/dist/{bundle-vn56sLos.mjs → bundle-DZFhFurR.mjs} +4 -4
- package/dist/{bundle-vn56sLos.mjs.map → bundle-DZFhFurR.mjs.map} +1 -1
- package/dist/{byline-yjvWq4ip.mjs → byline-Cpnwrje1.mjs} +6 -6
- package/dist/{byline-yjvWq4ip.mjs.map → byline-Cpnwrje1.mjs.map} +1 -1
- package/dist/{byline-fields-txaLGoME.mjs → byline-fields-CAyA_Umd.mjs} +2 -2
- package/dist/{byline-fields-txaLGoME.mjs.map → byline-fields-CAyA_Umd.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-BSo9B9RX.mjs} +7 -7
- package/dist/{bylines-DjXS5p0P.mjs.map → bylines-BSo9B9RX.mjs.map} +1 -1
- package/dist/{bylines-Bu7pchQ4.mjs → bylines-CHjvehVX.mjs} +3 -3
- package/dist/{bylines-Bu7pchQ4.mjs.map → bylines-CHjvehVX.mjs.map} +1 -1
- package/dist/{cache-C46-3Irl.mjs → cache-5VirJ2Cn.mjs} +4 -4
- package/dist/{cache-C46-3Irl.mjs.map → cache-5VirJ2Cn.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-D5pSY2S1.mjs} +1 -1
- package/dist/{challenge-store-SIL5DsF2.mjs.map → challenge-store-D5pSY2S1.mjs.map} +1 -1
- package/dist/{chunks-fiZ8G9RJ.mjs → chunks-bNiX6_DR.mjs} +2 -2
- package/dist/{chunks-fiZ8G9RJ.mjs.map → chunks-bNiX6_DR.mjs.map} +1 -1
- package/dist/cli/index.mjs +36 -52
- 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-m_oi2c0N.mjs} +13 -356
- package/dist/collection-deletion-m_oi2c0N.mjs.map +1 -0
- package/dist/{comment-Dxlep6cE.mjs → comment-DhvLEdhQ.mjs} +1 -1
- package/dist/{comment-Dxlep6cE.mjs.map → comment-DhvLEdhQ.mjs.map} +1 -1
- package/dist/{comment-reaction-D-2J84UE.mjs → comment-reaction-CRuItEjt.mjs} +2 -2
- package/dist/{comment-reaction-D-2J84UE.mjs.map → comment-reaction-CRuItEjt.mjs.map} +1 -1
- package/dist/{comments-CTfZtLmM.mjs → comments-CLj4bi8I.mjs} +2 -2
- package/dist/{comments-CTfZtLmM.mjs.map → comments-CLj4bi8I.mjs.map} +1 -1
- package/dist/{components-CQy3lh9x.mjs → components-v4U4DT2y.mjs} +1 -1
- package/dist/{components-CQy3lh9x.mjs.map → components-v4U4DT2y.mjs.map} +1 -1
- package/dist/{config-COQzTe5Q.d.mts → config-DrfghTPe.d.mts} +1 -1
- package/dist/{config-COQzTe5Q.d.mts.map → config-DrfghTPe.d.mts.map} +1 -1
- package/dist/{content-ZHCc1ngN.mjs → content-CP-SeXNa.mjs} +5 -4
- package/dist/content-CP-SeXNa.mjs.map +1 -0
- package/dist/{content-list-query-wJ2WN8Vp.d.mts → content-list-query-BhejKVqb.d.mts} +1 -1
- package/dist/{content-list-query-wJ2WN8Vp.d.mts.map → content-list-query-BhejKVqb.d.mts.map} +1 -1
- package/dist/{content-refresh-B_8SJzuU.mjs → content-refresh-DLOfIhYc.mjs} +1094 -93
- package/dist/content-refresh-DLOfIhYc.mjs.map +1 -0
- package/dist/{media-usage-BZCydfvu.mjs → content-repair-BCxzy0r4.mjs} +5 -196
- package/dist/content-repair-BCxzy0r4.mjs.map +1 -0
- package/dist/{context-ZldbZcle.mjs → context-BR5hRWiK.mjs} +13 -13
- package/dist/{context-ZldbZcle.mjs.map → context-BR5hRWiK.mjs.map} +1 -1
- package/dist/{cron-Y9aLtgrA.mjs → cron-CWfWrWKG.mjs} +1 -1
- package/dist/{cron-Y9aLtgrA.mjs.map → cron-CWfWrWKG.mjs.map} +1 -1
- package/dist/{dashboard-DvHbk_cv.mjs → dashboard-CkIV2rnQ.mjs} +5 -5
- package/dist/{dashboard-DvHbk_cv.mjs.map → dashboard-CkIV2rnQ.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/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-YMEfcQUx.mjs} +1 -1
- package/dist/{default-DdDl3fxv.mjs.map → default-YMEfcQUx.mjs.map} +1 -1
- package/dist/{deferred-tasks-SDWxrgzJ.d.mts → deferred-tasks-DfqxH5Xf.d.mts} +1 -1
- package/dist/{deferred-tasks-SDWxrgzJ.d.mts.map → deferred-tasks-DfqxH5Xf.d.mts.map} +1 -1
- package/dist/{device-flow-C0GdD_z8.mjs → device-flow-CojjSBwb.mjs} +5 -5
- package/dist/{device-flow-C0GdD_z8.mjs.map → device-flow-CojjSBwb.mjs.map} +1 -1
- package/dist/{direct-executor-CDXeJCSs.mjs → direct-executor-BWeWiRYB.mjs} +3 -3
- package/dist/{direct-executor-CDXeJCSs.mjs.map → direct-executor-BWeWiRYB.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-CEJgR_LB.mjs} +1 -1
- package/dist/{email-console-BHNjIwiB.mjs.map → email-console-CEJgR_LB.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-D9w94fjV.mjs} +2 -2
- package/dist/{error-DupyJZE2.mjs.map → error-D9w94fjV.mjs.map} +1 -1
- package/dist/{errors-CLUPm7aD.mjs → errors-n2j49uNf.mjs} +22 -2
- package/dist/errors-n2j49uNf.mjs.map +1 -0
- package/dist/{escape-DUY2r2Zs.mjs → escape-DN4Qmjsl.mjs} +1 -1
- package/dist/{escape-DUY2r2Zs.mjs.map → escape-DN4Qmjsl.mjs.map} +1 -1
- package/dist/{field-defs-cache-BzwBlJrR.mjs → field-defs-cache-Bh4q6oar.mjs} +5 -5
- package/dist/{field-defs-cache-BzwBlJrR.mjs.map → field-defs-cache-Bh4q6oar.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-BhOdW0bi.mjs} +3 -3
- package/dist/{fts-manager-DyZEohZC.mjs.map → fts-manager-BhOdW0bi.mjs.map} +1 -1
- package/dist/{hash-Cg0TXJPV.mjs → hash-CTcngWvj.mjs} +1 -1
- package/dist/{hash-Cg0TXJPV.mjs.map → hash-CTcngWvj.mjs.map} +1 -1
- package/dist/{hreflang-DwT2E0Sa.d.mts → hreflang-7pTHsLZJ.d.mts} +2 -2
- package/dist/{hreflang-DwT2E0Sa.d.mts.map → hreflang-7pTHsLZJ.d.mts.map} +1 -1
- package/dist/{hreflang-BBe83kKa.mjs → hreflang-Huc6O5wa.mjs} +7 -7
- package/dist/{hreflang-BBe83kKa.mjs.map → hreflang-Huc6O5wa.mjs.map} +1 -1
- package/dist/{identity-Ys6Dlc9C.mjs → identity-DXmb4aVp.mjs} +3 -3
- package/dist/{identity-Ys6Dlc9C.mjs.map → identity-DXmb4aVp.mjs.map} +1 -1
- package/dist/{import-DPkLmeXO.mjs → import-C4_O3KXU.mjs} +5 -5
- package/dist/{import-DPkLmeXO.mjs.map → import-C4_O3KXU.mjs.map} +1 -1
- package/dist/{index-C9KuQyO-.d.mts → index-6bRee8zb.d.mts} +3 -3
- package/dist/{index-C9KuQyO-.d.mts.map → index-6bRee8zb.d.mts.map} +1 -1
- package/dist/{index-BVBZj4-7.d.mts → index-DWbJrsAg.d.mts} +128 -52
- package/dist/index-DWbJrsAg.d.mts.map +1 -0
- package/dist/index.d.mts +21 -21
- package/dist/index.mjs +78 -72
- 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-Bo7fZAbg.mjs} +2 -2
- package/dist/{load-YJ2xl3ra.mjs.map → load-Bo7fZAbg.mjs.map} +1 -1
- package/dist/{loader-CdG_Ci3H.mjs → loader-ZsjE4paL.mjs} +2 -2
- package/dist/{loader-CdG_Ci3H.mjs.map → loader-ZsjE4paL.mjs.map} +1 -1
- package/dist/{manifest-builder-B252yQUf.mjs → manifest-builder-QXuqvVMP.mjs} +2 -2
- package/dist/{manifest-builder-B252yQUf.mjs.map → manifest-builder-QXuqvVMP.mjs.map} +1 -1
- package/dist/{manifest-schema-BXbUAHod.mjs → manifest-schema-CUYPfCEH.mjs} +1 -1
- package/dist/{manifest-schema-BXbUAHod.mjs.map → manifest-schema-CUYPfCEH.mjs.map} +1 -1
- package/dist/media/image-endpoint.mjs +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +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 +11 -5
- package/dist/media/local-runtime.mjs.map +1 -1
- package/dist/{media-BWWWb8kg.mjs → media-BjwNuLEu.mjs} +100 -6
- package/dist/media-BjwNuLEu.mjs.map +1 -0
- package/dist/{media-CzhAn2--.mjs → media-D6SeAfBl.mjs} +41 -12
- package/dist/media-D6SeAfBl.mjs.map +1 -0
- package/dist/{media-allowlist-D6x-Us02.mjs → media-allowlist-D35v7bmL.mjs} +3 -2
- package/dist/media-allowlist-D35v7bmL.mjs.map +1 -0
- package/dist/media-folders-D-0CmRZj.mjs +210 -0
- package/dist/media-folders-D-0CmRZj.mjs.map +1 -0
- package/dist/{media-upload-CHBVn6m-.mjs → media-upload-C7bLXGcI.mjs} +9 -9
- package/dist/{media-upload-CHBVn6m-.mjs.map → media-upload-C7bLXGcI.mjs.map} +1 -1
- package/dist/{media-url-BvoX88FA.mjs → media-url-DH7giMx_.mjs} +1 -1
- package/dist/{media-url-BvoX88FA.mjs.map → media-url-DH7giMx_.mjs.map} +1 -1
- package/dist/media-usage-BTRJvS6V.mjs +1833 -0
- package/dist/media-usage-BTRJvS6V.mjs.map +1 -0
- package/dist/media-usage-activation-Dx0kPV6b.mjs +78 -0
- package/dist/media-usage-activation-Dx0kPV6b.mjs.map +1 -0
- package/dist/{media-usage-work-DrCbqBcl.mjs → media-usage-work-C-fhM30c.mjs} +221 -59
- package/dist/media-usage-work-C-fhM30c.mjs.map +1 -0
- package/dist/{media-usage-work-CLo_6tct.mjs → media-usage-work-DWb2XPMI.mjs} +4 -4
- package/dist/{media-usage-work-CLo_6tct.mjs.map → media-usage-work-DWb2XPMI.mjs.map} +1 -1
- package/dist/{media-usage-write-fence-aHEgN1zB.mjs → media-usage-write-fence-BwoJVRDC.mjs} +2 -2
- package/dist/{media-usage-write-fence-aHEgN1zB.mjs.map → media-usage-write-fence-BwoJVRDC.mjs.map} +1 -1
- package/dist/{menus-TCNSd2vp.mjs → menus-CD7EFLwz.mjs} +3 -3
- package/dist/{menus-TCNSd2vp.mjs.map → menus-CD7EFLwz.mjs.map} +1 -1
- package/dist/{menus-DSo5QeW0.mjs → menus-CNg0QlDt.mjs} +42 -26
- package/dist/menus-CNg0QlDt.mjs.map +1 -0
- 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-DaUM_MB2.mjs} +1 -1
- package/dist/{mode-BDoH_WcF.mjs.map → mode-DaUM_MB2.mjs.map} +1 -1
- package/dist/node-sqlite-compat-Udb4Y-rs.mjs +46 -0
- package/dist/node-sqlite-compat-Udb4Y-rs.mjs.map +1 -0
- package/dist/{normalize-Bc-s_r-a.mjs → normalize-CSxdKBVa.mjs} +22 -1
- package/dist/normalize-CSxdKBVa.mjs.map +1 -0
- package/dist/{oauth-authorization-iOikmrJd.mjs → oauth-authorization-Dpsb-fMJ.mjs} +5 -5
- package/dist/{oauth-authorization-iOikmrJd.mjs.map → oauth-authorization-Dpsb-fMJ.mjs.map} +1 -1
- package/dist/{oauth-clients-CvI0nHMJ.mjs → oauth-clients-Bxnoe_67.mjs} +1 -1
- package/dist/{oauth-clients-CvI0nHMJ.mjs.map → oauth-clients-Bxnoe_67.mjs.map} +1 -1
- package/dist/{oauth-state-store-Ba8KZlwW.mjs → oauth-state-store-0C4s0K6w.mjs} +1 -1
- package/dist/{oauth-state-store-Ba8KZlwW.mjs.map → oauth-state-store-0C4s0K6w.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-C5SQwGYC.mjs → oauth-user-lookup-wlGYSeqX.mjs} +1 -1
- package/dist/{oauth-user-lookup-C5SQwGYC.mjs.map → oauth-user-lookup-wlGYSeqX.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +1 -1
- 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-BhZIeFY1.d.mts} +3 -3
- package/dist/{options--hhz-jZ1.d.mts.map → options-BhZIeFY1.d.mts.map} +1 -1
- package/dist/page/index.d.mts +2 -2
- package/dist/{parse-DFbuc-Fh.mjs → parse-BRJg1kz8.mjs} +2 -2
- package/dist/{parse-DFbuc-Fh.mjs.map → parse-BRJg1kz8.mjs.map} +1 -1
- package/dist/{passkey-config-DFAmUyuE.mjs → passkey-config-B3P0nHRR.mjs} +1 -1
- package/dist/{passkey-config-DFAmUyuE.mjs.map → passkey-config-B3P0nHRR.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-BR4ZhVJl.d.mts} +7 -1
- package/dist/placeholder-BR4ZhVJl.d.mts.map +1 -0
- package/dist/plugin-types.d.mts +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-BVRganJQ.mjs} +2 -2
- package/dist/{policy-TluUIxuu.mjs.map → policy-BVRganJQ.mjs.map} +1 -1
- package/dist/{portable-text-imBW5cHK.mjs → portable-text-C8Tvp4_g.mjs} +1 -1
- package/dist/{portable-text-imBW5cHK.mjs.map → portable-text-C8Tvp4_g.mjs.map} +1 -1
- package/dist/{preview-PW-nOnq4.mjs → preview-dn2dUyM0.mjs} +2 -2
- package/dist/{preview-PW-nOnq4.mjs.map → preview-dn2dUyM0.mjs.map} +1 -1
- package/dist/{protocol-DjsJHTlK.d.mts → protocol-CuBEsqgE.d.mts} +2 -2
- package/dist/{protocol-DjsJHTlK.d.mts.map → protocol-CuBEsqgE.d.mts.map} +1 -1
- package/dist/{public-url-CWoFhQT8.mjs → public-url-DRz_AinV.mjs} +1 -1
- package/dist/{public-url-CWoFhQT8.mjs.map → public-url-DRz_AinV.mjs.map} +1 -1
- package/dist/{query-zTVAR1Sl.mjs → query-D18vTdha.mjs} +14 -14
- package/dist/{query-zTVAR1Sl.mjs.map → query-D18vTdha.mjs.map} +1 -1
- package/dist/{query-BWs7O5Il.mjs → query-tZDEdtCN.mjs} +4 -4
- package/dist/{query-BWs7O5Il.mjs.map → query-tZDEdtCN.mjs.map} +1 -1
- package/dist/{rate-limit-Bx4g9m3p.mjs → rate-limit-on7KPo-v.mjs} +2 -2
- package/dist/{rate-limit-Bx4g9m3p.mjs.map → rate-limit-on7KPo-v.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-DrbEmU9a.mjs} +1 -1
- package/dist/{redirect-BgAOGHDq.mjs.map → redirect-DrbEmU9a.mjs.map} +1 -1
- package/dist/{redirects-DyChwDkG.mjs → redirects-BahWiu8Z.mjs} +5 -5
- package/dist/{redirects-DyChwDkG.mjs.map → redirects-BahWiu8Z.mjs.map} +1 -1
- package/dist/{redirects-DTDHWH31.mjs → redirects-CRIM55KH.mjs} +6 -6
- package/dist/{redirects-DTDHWH31.mjs.map → redirects-CRIM55KH.mjs.map} +1 -1
- package/dist/{api-BeBglVxU.mjs → registry-BiO5WwPq.mjs} +483 -2462
- package/dist/registry-BiO5WwPq.mjs.map +1 -0
- package/dist/{registry-Cqa2I749.mjs → registry-Cx-jEJOS.mjs} +9 -123
- package/dist/registry-Cx-jEJOS.mjs.map +1 -0
- package/dist/{relation-BnHB0T4J.mjs → relation-A6wLF_DS.mjs} +2 -2
- package/dist/{relation-BnHB0T4J.mjs.map → relation-A6wLF_DS.mjs.map} +1 -1
- package/dist/{relations-BBApI4e2.mjs → relations-BTPM2saV.mjs} +2 -2
- package/dist/{relations-BBApI4e2.mjs.map → relations-BTPM2saV.mjs.map} +1 -1
- package/dist/{relations-BHo5A8Zf.d.mts → relations-C7B46bcU.d.mts} +192 -33
- package/dist/relations-C7B46bcU.d.mts.map +1 -0
- package/dist/{relations-D5sM5fW0.mjs → relations-Cj5hZ6Zg.mjs} +4 -4
- package/dist/{relations-D5sM5fW0.mjs.map → relations-Cj5hZ6Zg.mjs.map} +1 -1
- 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-DRp5ENd_.mjs} +2 -2
- package/dist/{request-meta-DgZJh3zG.mjs.map → request-meta-DRp5ENd_.mjs.map} +1 -1
- package/dist/{resolve-DOhVEvty.mjs → resolve-DxUpTMmE.mjs} +1 -1
- package/dist/{resolve-DOhVEvty.mjs.map → resolve-DxUpTMmE.mjs.map} +1 -1
- package/dist/{runner-C1T11CfC.mjs → runner-77GOZCnH.mjs} +410 -286
- package/dist/runner-77GOZCnH.mjs.map +1 -0
- package/dist/{runner-BYHZn3Jy.d.mts → runner-zgqA_CqP.d.mts} +2 -2
- package/dist/{runner-BYHZn3Jy.d.mts.map → runner-zgqA_CqP.d.mts.map} +1 -1
- package/dist/runtime.d.mts +11 -11
- package/dist/runtime.mjs +1 -1
- package/dist/{schema-DZ5YVVZj.mjs → schema-BY-oVntF.mjs} +3 -3
- package/dist/{schema-DZ5YVVZj.mjs.map → schema-BY-oVntF.mjs.map} +1 -1
- package/dist/{schema-2AOsSn2v.mjs → schema-Cw9kVK0I.mjs} +35 -5
- package/dist/{schema-2AOsSn2v.mjs.map → schema-Cw9kVK0I.mjs.map} +1 -1
- package/dist/{scopes-8ClPF2bC.mjs → scopes-vMR1uIbt.mjs} +3 -3
- package/dist/{scopes-8ClPF2bC.mjs.map → scopes-vMR1uIbt.mjs.map} +1 -1
- package/dist/{search-u1QYdOCG.mjs → search-CfT3KxO5.mjs} +4 -4
- package/dist/{search-u1QYdOCG.mjs.map → search-CfT3KxO5.mjs.map} +1 -1
- package/dist/{secrets-BEgsAQEU.mjs → secrets-BH2Qow1-.mjs} +3 -3
- package/dist/{secrets-BEgsAQEU.mjs.map → secrets-BH2Qow1-.mjs.map} +1 -1
- package/dist/{sections-DmHviGyM.mjs → sections-DTfjyf1z.mjs} +2 -2
- package/dist/{sections-DmHviGyM.mjs.map → sections-DTfjyf1z.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +24 -22
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.mjs +16 -14
- package/dist/seo/index.mjs.map +1 -1
- package/dist/{seo-AFpVvTqr.mjs → seo-BSiTIXzd.mjs} +1 -1
- package/dist/{seo-AFpVvTqr.mjs.map → seo-BSiTIXzd.mjs.map} +1 -1
- package/dist/{seo-Dq4G-RrO.mjs → seo-Cm-dtvgk.mjs} +2 -2
- package/dist/{seo-Dq4G-RrO.mjs.map → seo-Cm-dtvgk.mjs.map} +1 -1
- package/dist/{service-BpArayPr.mjs → service-DYsDHEKe.mjs} +3 -3
- package/dist/{service-BpArayPr.mjs.map → service-DYsDHEKe.mjs.map} +1 -1
- package/dist/{session-user-BEorKVT-.mjs → session-user-CNAfvsdw.mjs} +1 -1
- package/dist/{session-user-BEorKVT-.mjs.map → session-user-CNAfvsdw.mjs.map} +1 -1
- package/dist/{settings-xRdoUZr0.mjs → settings-BgN-0DT-.mjs} +6 -6
- package/dist/{settings-xRdoUZr0.mjs.map → settings-BgN-0DT-.mjs.map} +1 -1
- package/dist/{settings-DE9xtzqd.mjs → settings-DjtkUo__.mjs} +3 -3
- package/dist/{settings-DE9xtzqd.mjs.map → settings-DjtkUo__.mjs.map} +1 -1
- package/dist/{setup-complete-BnT8pq_C.mjs → setup-complete-CcpXaPU7.mjs} +2 -2
- package/dist/{setup-complete-BnT8pq_C.mjs.map → setup-complete-CcpXaPU7.mjs.map} +1 -1
- package/dist/{setup-nonce-CBitf_oQ.mjs → setup-nonce-Reyw30jg.mjs} +1 -1
- package/dist/{setup-nonce-CBitf_oQ.mjs.map → setup-nonce-Reyw30jg.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-Cs_V9n3V.mjs} +3 -3
- package/dist/{site-url-DjpIXMXJ.mjs.map → site-url-Cs_V9n3V.mjs.map} +1 -1
- package/dist/{snapshot-BBlGkb2q.mjs → snapshot-DSB8P7Lm.mjs} +1 -1
- package/dist/{snapshot-BBlGkb2q.mjs.map → snapshot-DSB8P7Lm.mjs.map} +1 -1
- package/dist/{ssrf-Cpvg_n3A.mjs → ssrf-DqebVE34.mjs} +21 -5
- package/dist/{ssrf-Cpvg_n3A.mjs.map → ssrf-DqebVE34.mjs.map} +1 -1
- package/dist/{state-DYwPue40.mjs → state-BJfU9Uzw.mjs} +12 -4
- package/dist/state-BJfU9Uzw.mjs.map +1 -0
- package/dist/{status-CWVYpbD8.mjs → status-DDu8HIQl.mjs} +1 -1
- package/dist/{status-CWVYpbD8.mjs.map → status-DDu8HIQl.mjs.map} +1 -1
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +1 -1
- package/dist/{target-DixqqV5i.mjs → target-D0o26Azo.mjs} +1 -1
- package/dist/{target-DixqqV5i.mjs.map → target-D0o26Azo.mjs.map} +1 -1
- package/dist/{taxonomies-OHUIiIpI.mjs → taxonomies-CPGxo-bn.mjs} +5 -5
- package/dist/{taxonomies-OHUIiIpI.mjs.map → taxonomies-CPGxo-bn.mjs.map} +1 -1
- package/dist/{taxonomies-BlrncHi9.mjs → taxonomies-kmyudNGP.mjs} +7 -7
- package/dist/{taxonomies-BlrncHi9.mjs.map → taxonomies-kmyudNGP.mjs.map} +1 -1
- package/dist/{taxonomy-BqCZ1TdU.mjs → taxonomy-8X09dLN5.mjs} +4 -4
- package/dist/{taxonomy-BqCZ1TdU.mjs.map → taxonomy-8X09dLN5.mjs.map} +1 -1
- package/dist/{tokens-C39klX8R.mjs → tokens-gTS-IVUp.mjs} +1 -1
- package/dist/{tokens-C39klX8R.mjs.map → tokens-gTS-IVUp.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-RQE36APG.d.mts → transport-_6R1ub7t.d.mts} +1 -1
- package/dist/{transport-RQE36APG.d.mts.map → transport-_6R1ub7t.d.mts.map} +1 -1
- package/dist/{transport-DBJwa-Si.mjs → transport-fX59xaJz.mjs} +4 -3
- package/dist/{transport-DBJwa-Si.mjs.map → transport-fX59xaJz.mjs.map} +1 -1
- package/dist/{trusted-proxy-CEVekpby.mjs → trusted-proxy-fe6nEgR4.mjs} +1 -1
- package/dist/{trusted-proxy-CEVekpby.mjs.map → trusted-proxy-fe6nEgR4.mjs.map} +1 -1
- package/dist/types-75KIqzL9.mjs.map +1 -1
- package/dist/{types-BW1syrlw.mjs → types-BXUmsINL.mjs} +1 -1
- package/dist/{types-BW1syrlw.mjs.map → types-BXUmsINL.mjs.map} +1 -1
- package/dist/{types-BntycPTF.d.mts → types-Blb-MRC3.d.mts} +1 -1
- package/dist/{types-BntycPTF.d.mts.map → types-Blb-MRC3.d.mts.map} +1 -1
- package/dist/{types-C2pMvO62.d.mts → types-Br-ERaxh.d.mts} +2 -1
- package/dist/types-Br-ERaxh.d.mts.map +1 -0
- package/dist/{types-DWRhk9xZ.d.mts → types-BzBd3PeX.d.mts} +1 -1
- package/dist/{types-DWRhk9xZ.d.mts.map → types-BzBd3PeX.d.mts.map} +1 -1
- package/dist/{types-CXnOzDe1.d.mts → types-CLqvnd05.d.mts} +1 -1
- package/dist/{types-CXnOzDe1.d.mts.map → types-CLqvnd05.d.mts.map} +1 -1
- package/dist/{types-Dfk8KI5R.d.mts → types-D5VVLr7J.d.mts} +1 -1
- package/dist/{types-Dfk8KI5R.d.mts.map → types-D5VVLr7J.d.mts.map} +1 -1
- package/dist/{types-DQIDRKF2.d.mts → types-DHxzBjbD.d.mts} +10 -1
- package/dist/types-DHxzBjbD.d.mts.map +1 -0
- package/dist/{types-DN64_zzZ.d.mts → types-DJQxln7q.d.mts} +3 -3
- package/dist/{types-DN64_zzZ.d.mts.map → types-DJQxln7q.d.mts.map} +1 -1
- 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-BcqdcT-r.d.mts → types-D_DWe7k9.d.mts} +1 -1
- package/dist/{types-BcqdcT-r.d.mts.map → types-D_DWe7k9.d.mts.map} +1 -1
- package/dist/{types-DrJrVCT1.d.mts → types-Vg6f5i3s.d.mts} +3 -3
- package/dist/{types-DrJrVCT1.d.mts.map → types-Vg6f5i3s.d.mts.map} +1 -1
- package/dist/{upload-attempts-D4FS8LT6.mjs → upload-attempts-CNyGSepg.mjs} +1 -1
- package/dist/{upload-attempts-D4FS8LT6.mjs.map → upload-attempts-CNyGSepg.mjs.map} +1 -1
- package/dist/{url-pattern-BHS0V5Ng.mjs → url-pattern-K-KdXcSe.mjs} +1 -1
- package/dist/{url-pattern-BHS0V5Ng.mjs.map → url-pattern-K-KdXcSe.mjs.map} +1 -1
- package/dist/{user-DJZfUJVE.mjs → user-CtYY0tp2.mjs} +2 -2
- package/dist/{user-DJZfUJVE.mjs.map → user-CtYY0tp2.mjs.map} +1 -1
- package/dist/{utils-D4vD_Y98.mjs → utils-HztC73hq.mjs} +1 -1
- package/dist/{utils-D4vD_Y98.mjs.map → utils-HztC73hq.mjs.map} +1 -1
- package/dist/{validate-BMLBvxOC.mjs → validate-Dd-IUjnZ.mjs} +2 -2
- package/dist/{validate-BMLBvxOC.mjs.map → validate-Dd-IUjnZ.mjs.map} +1 -1
- package/dist/{validate-CTqt5nuE.d.mts → validate-DlqdOZXB.d.mts} +5 -5
- package/dist/{validate-CTqt5nuE.d.mts.map → validate-DlqdOZXB.d.mts.map} +1 -1
- package/dist/{validation-npvENUCB.mjs → validation-D83n7Npi.mjs} +10 -8
- package/dist/{validation-npvENUCB.mjs.map → validation-D83n7Npi.mjs.map} +1 -1
- package/dist/version-ri-sCyAp.mjs +7 -0
- package/dist/{version-DB_fqCSI.mjs.map → version-ri-sCyAp.mjs.map} +1 -1
- package/dist/{widgets-BD3ho7Rq.mjs → widgets-CpmZd9Q-.mjs} +4 -4
- package/dist/{widgets-BD3ho7Rq.mjs.map → widgets-CpmZd9Q-.mjs.map} +1 -1
- package/dist/{wxr-taxonomies-Ca68766D.d.mts → wxr-taxonomies-BFd0y72_.d.mts} +1 -1
- package/dist/{wxr-taxonomies-Ca68766D.d.mts.map → wxr-taxonomies-BFd0y72_.d.mts.map} +1 -1
- package/dist/{wxr-taxonomies-B1R3vBoD.mjs → wxr-taxonomies-Df4vxWcU.mjs} +4 -4
- package/dist/{wxr-taxonomies-B1R3vBoD.mjs.map → wxr-taxonomies-Df4vxWcU.mjs.map} +1 -1
- package/dist/{zod-generator-LC-on_Vb.mjs → zod-generator-DylzusHh.mjs} +24 -18
- package/dist/zod-generator-DylzusHh.mjs.map +1 -0
- package/package.json +16 -8
- package/src/api/errors.ts +20 -0
- package/src/api/handlers/index.ts +17 -0
- 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 +62 -2
- package/src/api/handlers/registry.ts +134 -316
- package/src/api/openapi/document.ts +192 -2
- package/src/api/schemas/media-usage.ts +77 -0
- package/src/api/schemas/media.ts +69 -0
- package/src/astro/integration/routes.ts +18 -0
- package/src/astro/integration/vite-config.ts +2 -7
- package/src/astro/middleware/auth.ts +4 -0
- package/src/astro/middleware.ts +0 -7
- 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/plugins/registry/artifact.ts +246 -96
- package/src/astro/routes/api/auth/me.ts +14 -2
- package/src/astro/routes/api/media/[id].ts +3 -0
- 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.ts +12 -2
- package/src/astro/routes/api/setup/dev-bypass.ts +12 -0
- package/src/astro/types.ts +11 -1
- package/src/client/index.ts +140 -2
- package/src/client/transport.ts +6 -2
- package/src/components/EmDashImage.astro +154 -50
- package/src/components/Gallery.astro +7 -0
- package/src/components/InlinePortableTextEditor.tsx +130 -1
- package/src/components/LiveSearch.astro +23 -0
- package/src/components/inline-code-block.tsx +180 -49
- package/src/content/converters/gallery.ts +2 -0
- package/src/content/converters/types.ts +2 -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/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/runner.ts +8 -2
- package/src/database/repositories/content.ts +5 -4
- 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 +1038 -10
- package/src/database/repositories/media.ts +97 -29
- package/src/database/transaction.ts +1 -0
- package/src/database/types.ts +13 -0
- package/src/db/adapters.ts +2 -2
- package/src/db/node-sqlite-compat.ts +78 -0
- package/src/db/sqlite.ts +3 -3
- package/src/emdash-runtime.ts +110 -105
- package/src/fields/image.ts +7 -1
- package/src/fields/types.ts +6 -2
- package/src/index.ts +5 -0
- package/src/media/focal-point.ts +37 -0
- package/src/media/local-runtime.ts +8 -0
- package/src/media/mime.ts +1 -0
- package/src/media/normalize.ts +10 -0
- 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/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/plugins/index.ts +1 -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/registry/artifact-fetch.ts +530 -0
- package/src/registry/config.ts +24 -6
- package/src/registry/types.ts +12 -15
- package/src/schema/types.ts +1 -0
- package/src/schema/zod-generator.ts +12 -4
- package/src/security/ssrf.ts +21 -2
- package/src/seed/apply.ts +4 -4
- package/src/ui.ts +2 -0
- package/dist/api-BeBglVxU.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/errors-CLUPm7aD.mjs.map +0 -1
- package/dist/index-BVBZj4-7.d.mts.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/placeholder-Dp0K3RkD.d.mts.map +0 -1
- package/dist/registry-Cqa2I749.mjs.map +0 -1
- package/dist/relations-BHo5A8Zf.d.mts.map +0 -1
- package/dist/runner-C1T11CfC.mjs.map +0 -1
- package/dist/state-DYwPue40.mjs.map +0 -1
- package/dist/types-C2pMvO62.d.mts.map +0 -1
- package/dist/types-DQIDRKF2.d.mts.map +0 -1
- package/dist/version-DB_fqCSI.mjs +0 -7
- package/dist/zod-generator-LC-on_Vb.mjs.map +0 -1
- /package/dist/{api-tokens-rIXC6LdE.mjs → api-tokens-B5NHLNUN.mjs} +0 -0
- /package/dist/{ssrf-DpXgKsna.mjs → ssrf-BPKzkm6O.mjs} +0 -0
- /package/dist/{types-CP1CflWf.mjs → types-D6OcIp2P.mjs} +0 -0
package/src/emdash-runtime.ts
CHANGED
|
@@ -9,10 +9,11 @@
|
|
|
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";
|
|
16
17
|
import { assertMediaUsageActivationWriteAllowed } from "./api/media-usage-write-fence.js";
|
|
17
18
|
import { validateRev } from "./api/rev.js";
|
|
18
19
|
import type {
|
|
@@ -43,30 +44,20 @@ import type {
|
|
|
43
44
|
ContentItem as ContentItemInternal,
|
|
44
45
|
ContentDateField,
|
|
45
46
|
} from "./database/repositories/types.js";
|
|
47
|
+
import type { ImageValue } from "./fields/types.js";
|
|
46
48
|
import { getI18nConfig } from "./i18n/config.js";
|
|
47
49
|
import { repairLocaleCasing } from "./i18n/repair-locale-casing.js";
|
|
48
50
|
import { warnAboutUnconfiguredTaxonomyLocales } from "./i18n/taxonomy-locale-diagnostic.js";
|
|
49
51
|
import { normalizeMediaValue } from "./media/normalize.js";
|
|
50
52
|
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";
|
|
53
|
+
import { activateMediaUsageCapture } from "./media/usage/activation.js";
|
|
55
54
|
import {
|
|
56
55
|
deleteContentMediaUsage,
|
|
57
56
|
findNonTranslatableSiblingContentIds,
|
|
58
57
|
markContentMediaUsageCollectionStale,
|
|
59
58
|
refreshContentMediaUsageAfterWrite,
|
|
60
59
|
} from "./media/usage/content-refresh.js";
|
|
61
|
-
import {
|
|
62
|
-
MEDIA_USAGE_RECONCILIATION_LIMITS,
|
|
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";
|
|
60
|
+
import { processMediaUsageWorkAfterWrite } from "./media/usage/work-processor.js";
|
|
70
61
|
import { createSandboxRunnerOptions } from "./plugins/sandbox/runner-options.js";
|
|
71
62
|
import { getSandboxRouteErrorDetails } from "./plugins/sandbox/types.js";
|
|
72
63
|
import type {
|
|
@@ -227,6 +218,7 @@ import {
|
|
|
227
218
|
type RouteCallerInput,
|
|
228
219
|
type RouteMeta,
|
|
229
220
|
} from "./plugins/routes.js";
|
|
221
|
+
import { isContentSaveRejection } from "./plugins/save-rejection.js";
|
|
230
222
|
import type { CronScheduler } from "./plugins/scheduler/types.js";
|
|
231
223
|
import { PluginStateRepository } from "./plugins/state.js";
|
|
232
224
|
import { syncDeclaredStorageIndexes } from "./plugins/storage-indexes.js";
|
|
@@ -434,6 +426,28 @@ export interface EmDashRuntimeParts {
|
|
|
434
426
|
pipelineRef: { current: HookPipeline };
|
|
435
427
|
}
|
|
436
428
|
|
|
429
|
+
/**
|
|
430
|
+
* A `ContentSaveRejectedError` carries a message the plugin wrote for the
|
|
431
|
+
* editor; every other exception stays internal and is replaced by a generic
|
|
432
|
+
* message so hook internals cannot leak through the API.
|
|
433
|
+
*/
|
|
434
|
+
function beforeSaveFailure(error: unknown) {
|
|
435
|
+
if (isContentSaveRejection(error)) {
|
|
436
|
+
return {
|
|
437
|
+
success: false as const,
|
|
438
|
+
error: { code: ErrorCode.SAVE_REJECTED, message: error.message },
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
console.error("EmDash: content:beforeSave hook failed:", error);
|
|
442
|
+
return {
|
|
443
|
+
success: false as const,
|
|
444
|
+
error: {
|
|
445
|
+
code: ErrorCode.CONTENT_HOOK_ERROR,
|
|
446
|
+
message: "A plugin hook failed while saving content",
|
|
447
|
+
},
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
|
|
437
451
|
/**
|
|
438
452
|
* Convert a ContentItem to Record<string, unknown> for hook consumption.
|
|
439
453
|
* Hooks receive the full item as a flat record.
|
|
@@ -553,62 +567,6 @@ const marketplaceManifestCache = new Map<
|
|
|
553
567
|
const sandboxedRouteMetaCache = new Map<string, Map<string, RouteMeta>>();
|
|
554
568
|
let sandboxRunner: SandboxRunner | null = null;
|
|
555
569
|
|
|
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
570
|
/**
|
|
613
571
|
* EmDashRuntime - singleton per worker
|
|
614
572
|
*/
|
|
@@ -814,10 +772,6 @@ export class EmDashRuntime {
|
|
|
814
772
|
return { published };
|
|
815
773
|
}
|
|
816
774
|
|
|
817
|
-
async runScheduledMediaUsageTasks(): Promise<MediaUsageMaintenanceResult> {
|
|
818
|
-
return runScheduledMediaUsageLane(this.db);
|
|
819
|
-
}
|
|
820
|
-
|
|
821
775
|
/**
|
|
822
776
|
* Materialize plugin-declared storage indexes, once per process.
|
|
823
777
|
*
|
|
@@ -1448,6 +1402,15 @@ export class EmDashRuntime {
|
|
|
1448
1402
|
// per-isolate lock keyed by the configured db so a reclaimed-and-rerun
|
|
1449
1403
|
// create() can't apply the seed a second time concurrently.
|
|
1450
1404
|
if (seedGate.collectionCount === 0 && !seedGate.setupDone) {
|
|
1405
|
+
try {
|
|
1406
|
+
const activation = await activateMediaUsageCapture(db, { writersDrained: true });
|
|
1407
|
+
if (activation.outcome !== "active") {
|
|
1408
|
+
throw new Error("Fresh-site media usage activation did not complete");
|
|
1409
|
+
}
|
|
1410
|
+
} catch (error) {
|
|
1411
|
+
await disposeReadDb();
|
|
1412
|
+
throw error;
|
|
1413
|
+
}
|
|
1451
1414
|
const seedKey = deps.config.database?.entrypoint ?? "default";
|
|
1452
1415
|
const seedHolder = getSeedHolder();
|
|
1453
1416
|
try {
|
|
@@ -1756,14 +1719,6 @@ export class EmDashRuntime {
|
|
|
1756
1719
|
if (deps.createScheduler) {
|
|
1757
1720
|
const scheduler = deps.createScheduler(cronExecutor);
|
|
1758
1721
|
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
1722
|
|
|
1768
1723
|
// Run scheduled publishing and system cleanup alongside each tick.
|
|
1769
1724
|
// Pass storage so cleanupPendingUploads can delete orphaned files.
|
|
@@ -1797,16 +1752,7 @@ export class EmDashRuntime {
|
|
|
1797
1752
|
// Never throws; no-op unless scheduled backups are enabled and due.
|
|
1798
1753
|
await maybeRunScheduledBackup(db, storage ?? undefined);
|
|
1799
1754
|
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
1755
|
});
|
|
1808
|
-
scheduler.setMediaUsageMaintenance?.(runMediaUsageMaintenance);
|
|
1809
|
-
|
|
1810
1756
|
// start() is void on the timer scheduler but the interface
|
|
1811
1757
|
// allows a promise (alarm-backed schedulers); we don't block on it.
|
|
1812
1758
|
void scheduler.start();
|
|
@@ -2969,8 +2915,12 @@ export class EmDashRuntime {
|
|
|
2969
2915
|
// Run beforeSave hooks (trusted plugins)
|
|
2970
2916
|
let processedData = body.data;
|
|
2971
2917
|
if (this.hooks.hasHooks("content:beforeSave")) {
|
|
2972
|
-
|
|
2973
|
-
|
|
2918
|
+
try {
|
|
2919
|
+
const hookResult = await this.hooks.runContentBeforeSave(body.data, collection, true);
|
|
2920
|
+
processedData = hookResult.content;
|
|
2921
|
+
} catch (error) {
|
|
2922
|
+
return beforeSaveFailure(error);
|
|
2923
|
+
}
|
|
2974
2924
|
}
|
|
2975
2925
|
|
|
2976
2926
|
// Run beforeSave hooks (sandboxed plugins)
|
|
@@ -3065,12 +3015,16 @@ export class EmDashRuntime {
|
|
|
3065
3015
|
let processedData = bodyWithoutRev.data;
|
|
3066
3016
|
if (bodyWithoutRev.data) {
|
|
3067
3017
|
if (this.hooks.hasHooks("content:beforeSave")) {
|
|
3068
|
-
|
|
3069
|
-
|
|
3070
|
-
|
|
3071
|
-
|
|
3072
|
-
|
|
3073
|
-
|
|
3018
|
+
try {
|
|
3019
|
+
const hookResult = await this.hooks.runContentBeforeSave(
|
|
3020
|
+
bodyWithoutRev.data,
|
|
3021
|
+
collection,
|
|
3022
|
+
false,
|
|
3023
|
+
);
|
|
3024
|
+
processedData = hookResult.content;
|
|
3025
|
+
} catch (error) {
|
|
3026
|
+
return beforeSaveFailure(error);
|
|
3027
|
+
}
|
|
3074
3028
|
}
|
|
3075
3029
|
|
|
3076
3030
|
// Run sandboxed beforeSave hooks
|
|
@@ -3456,9 +3410,11 @@ export class EmDashRuntime {
|
|
|
3456
3410
|
|
|
3457
3411
|
async handleMediaList(params: {
|
|
3458
3412
|
cursor?: string;
|
|
3413
|
+
page?: number;
|
|
3459
3414
|
limit?: number;
|
|
3460
3415
|
mimeType?: string | readonly string[];
|
|
3461
3416
|
q?: string;
|
|
3417
|
+
folderId?: string | null;
|
|
3462
3418
|
}) {
|
|
3463
3419
|
return handleMediaList(this.db, params);
|
|
3464
3420
|
}
|
|
@@ -3519,7 +3475,15 @@ export class EmDashRuntime {
|
|
|
3519
3475
|
|
|
3520
3476
|
async handleMediaUpdate(
|
|
3521
3477
|
id: string,
|
|
3522
|
-
input: {
|
|
3478
|
+
input: {
|
|
3479
|
+
alt?: string;
|
|
3480
|
+
caption?: string;
|
|
3481
|
+
width?: number;
|
|
3482
|
+
height?: number;
|
|
3483
|
+
folderId?: string | null;
|
|
3484
|
+
focalX?: number | null;
|
|
3485
|
+
focalY?: number | null;
|
|
3486
|
+
},
|
|
3523
3487
|
) {
|
|
3524
3488
|
const result = await handleMediaUpdate(this.db, id, input);
|
|
3525
3489
|
// Resolved media references in site settings (`logo`, `favicon`,
|
|
@@ -3690,14 +3654,14 @@ export class EmDashRuntime {
|
|
|
3690
3654
|
for (const contentId of new Set(contentIds)) {
|
|
3691
3655
|
try {
|
|
3692
3656
|
const work = await processMediaUsageWorkAfterWrite(this.db, collection, contentId);
|
|
3693
|
-
if (work.outcome !== "inactive")
|
|
3657
|
+
if (work.outcome !== "inactive") continue;
|
|
3694
3658
|
await refreshContentMediaUsageAfterWrite(this.db, collection, contentId);
|
|
3695
3659
|
} catch (error) {
|
|
3696
3660
|
console.error(
|
|
3697
3661
|
`[media-usage] Failed after content write ${collection}/${contentId}:`,
|
|
3698
3662
|
error,
|
|
3699
3663
|
);
|
|
3700
|
-
|
|
3664
|
+
continue;
|
|
3701
3665
|
}
|
|
3702
3666
|
}
|
|
3703
3667
|
}
|
|
@@ -4056,7 +4020,11 @@ export class EmDashRuntime {
|
|
|
4056
4020
|
if (value == null) continue;
|
|
4057
4021
|
|
|
4058
4022
|
try {
|
|
4059
|
-
|
|
4023
|
+
// Only image fields carry a dark variant.
|
|
4024
|
+
const normalized =
|
|
4025
|
+
field.type === "image"
|
|
4026
|
+
? await normalizeImageValue(value, getProvider)
|
|
4027
|
+
: await normalizeMediaValue(value, getProvider);
|
|
4060
4028
|
if (normalized) {
|
|
4061
4029
|
result[field.slug] = normalized;
|
|
4062
4030
|
}
|
|
@@ -4083,7 +4051,7 @@ export class EmDashRuntime {
|
|
|
4083
4051
|
const subValue = normalizedItem[slug];
|
|
4084
4052
|
if (subValue == null) continue;
|
|
4085
4053
|
try {
|
|
4086
|
-
const normalized = await
|
|
4054
|
+
const normalized = await normalizeImageValue(subValue, getProvider);
|
|
4087
4055
|
if (normalized) {
|
|
4088
4056
|
normalizedItem[slug] = normalized;
|
|
4089
4057
|
}
|
|
@@ -4125,7 +4093,10 @@ export class EmDashRuntime {
|
|
|
4125
4093
|
result = record;
|
|
4126
4094
|
}
|
|
4127
4095
|
} catch (error) {
|
|
4128
|
-
console.error(
|
|
4096
|
+
console.error(
|
|
4097
|
+
`EmDash: Sandboxed plugin ${id} beforeSave hook threw; a sandboxed plugin cannot cancel a save, so the save continues:`,
|
|
4098
|
+
error,
|
|
4099
|
+
);
|
|
4129
4100
|
}
|
|
4130
4101
|
}
|
|
4131
4102
|
|
|
@@ -4437,3 +4408,37 @@ export class EmDashRuntime {
|
|
|
4437
4408
|
return status === undefined || status === "active";
|
|
4438
4409
|
}
|
|
4439
4410
|
}
|
|
4411
|
+
|
|
4412
|
+
/**
|
|
4413
|
+
* Normalize an image field value together with its `darkVariant`. The media
|
|
4414
|
+
* normalizer only keeps the media item's own keys, so the variant is normalized
|
|
4415
|
+
* separately and reattached.
|
|
4416
|
+
*/
|
|
4417
|
+
async function normalizeImageValue(
|
|
4418
|
+
value: unknown,
|
|
4419
|
+
getProvider: (id: string) => MediaProvider | undefined,
|
|
4420
|
+
): Promise<ImageValue | null> {
|
|
4421
|
+
const primary = await normalizePrimaryImageValue(value, getProvider);
|
|
4422
|
+
if (!primary || !isRecord(value) || value.darkVariant == null) return primary;
|
|
4423
|
+
const darkVariant = await normalizeMediaValue(value.darkVariant, getProvider);
|
|
4424
|
+
return darkVariant ? { ...primary, darkVariant } : primary;
|
|
4425
|
+
}
|
|
4426
|
+
|
|
4427
|
+
/**
|
|
4428
|
+
* Normalize the primary image of an image field value.
|
|
4429
|
+
*
|
|
4430
|
+
* A legacy string URL that the admin upgraded to `{ id: "", src: url }` so it
|
|
4431
|
+
* can carry a dark variant still has to normalize as a string: as an object it
|
|
4432
|
+
* counts as local media, which strips `src` and leaves nothing behind. The
|
|
4433
|
+
* upgrade outlives the variant — an editor can add one and remove it again —
|
|
4434
|
+
* so the shape decides, not the presence of `darkVariant`.
|
|
4435
|
+
*/
|
|
4436
|
+
async function normalizePrimaryImageValue(
|
|
4437
|
+
value: unknown,
|
|
4438
|
+
getProvider: (id: string) => MediaProvider | undefined,
|
|
4439
|
+
): Promise<ImageValue | null> {
|
|
4440
|
+
if (isRecord(value) && !value.id && typeof value.src === "string" && !value.provider) {
|
|
4441
|
+
return normalizeMediaValue(value.src, getProvider);
|
|
4442
|
+
}
|
|
4443
|
+
return normalizeMediaValue(value, getProvider);
|
|
4444
|
+
}
|
package/src/fields/image.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { z } from "astro/zod";
|
|
|
2
2
|
|
|
3
3
|
import type { FieldDefinition, ImageValue } from "./types.js";
|
|
4
4
|
|
|
5
|
-
const
|
|
5
|
+
const mediaSchema = z.object({
|
|
6
6
|
id: z.string(),
|
|
7
7
|
src: z.string().optional(),
|
|
8
8
|
alt: z.string().optional(),
|
|
@@ -17,10 +17,16 @@ const imageSchema = z.object({
|
|
|
17
17
|
meta: z.record(z.string(), z.unknown()).optional(),
|
|
18
18
|
});
|
|
19
19
|
|
|
20
|
+
const imageSchema = mediaSchema.extend({
|
|
21
|
+
darkVariant: mediaSchema.optional(),
|
|
22
|
+
});
|
|
23
|
+
|
|
20
24
|
export interface ImageOptions {
|
|
21
25
|
required?: boolean;
|
|
22
26
|
maxSize?: number; // in bytes
|
|
23
27
|
allowedTypes?: string[]; // MIME types — exact or prefix
|
|
28
|
+
/** Offer editors a second slot for a dark-color-scheme counterpart of the image. */
|
|
29
|
+
darkVariant?: boolean;
|
|
24
30
|
}
|
|
25
31
|
|
|
26
32
|
export function image(options: ImageOptions = {}): FieldDefinition<ImageValue | undefined> {
|
package/src/fields/types.ts
CHANGED
|
@@ -51,9 +51,13 @@ export type { MediaValue } from "../media/types.js";
|
|
|
51
51
|
import type { MediaValue } from "../media/types.js";
|
|
52
52
|
|
|
53
53
|
/**
|
|
54
|
-
*
|
|
54
|
+
* Persisted image field value: the media item shown by default, plus an
|
|
55
|
+
* optional counterpart for dark color schemes.
|
|
55
56
|
*/
|
|
56
|
-
export
|
|
57
|
+
export interface ImageValue extends MediaValue {
|
|
58
|
+
/** Media item shown instead of the primary one when the page renders in a dark color scheme. */
|
|
59
|
+
darkVariant?: MediaValue;
|
|
60
|
+
}
|
|
57
61
|
|
|
58
62
|
/**
|
|
59
63
|
* Persisted file field value.
|
package/src/index.ts
CHANGED
|
@@ -84,6 +84,9 @@ export {
|
|
|
84
84
|
handleMediaCreate,
|
|
85
85
|
handleMediaUpdate,
|
|
86
86
|
handleMediaDelete,
|
|
87
|
+
handleMediaUsageActivationAdvance,
|
|
88
|
+
handleMediaUsageProgress,
|
|
89
|
+
handleMediaUsageRepair,
|
|
87
90
|
handleRevisionList,
|
|
88
91
|
handleRevisionGet,
|
|
89
92
|
handleRevisionRestore,
|
|
@@ -243,6 +246,8 @@ export {
|
|
|
243
246
|
PluginManager,
|
|
244
247
|
createPluginManager,
|
|
245
248
|
PluginRouteError,
|
|
249
|
+
ContentSaveRejectedError,
|
|
250
|
+
isContentSaveRejection,
|
|
246
251
|
// Scheduler (Node timer heartbeat — used by virtual:emdash/scheduler)
|
|
247
252
|
NodeCronScheduler,
|
|
248
253
|
// Sandbox
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface FocalPoint {
|
|
2
|
+
focalX: number;
|
|
3
|
+
focalY: number;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export interface FocalPointUpdate {
|
|
7
|
+
focalX?: number | null;
|
|
8
|
+
focalY?: number | null;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function isFocalCoordinate(value: unknown): value is number {
|
|
12
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 && value <= 1;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function normalizeFocalPoint(focalX: unknown, focalY: unknown): FocalPoint | null {
|
|
16
|
+
if (!isFocalCoordinate(focalX) || !isFocalCoordinate(focalY)) return null;
|
|
17
|
+
return { focalX, focalY };
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function isValidFocalPointUpdate(input: FocalPointUpdate): boolean {
|
|
21
|
+
const hasX = input.focalX !== undefined;
|
|
22
|
+
const hasY = input.focalY !== undefined;
|
|
23
|
+
if (!hasX && !hasY) return true;
|
|
24
|
+
if (!hasX || !hasY) return false;
|
|
25
|
+
if (input.focalX === null || input.focalY === null) {
|
|
26
|
+
return input.focalX === null && input.focalY === null;
|
|
27
|
+
}
|
|
28
|
+
return normalizeFocalPoint(input.focalX, input.focalY) !== null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function focalPointToObjectPosition(focalX: unknown, focalY: unknown): string | undefined {
|
|
32
|
+
const point = normalizeFocalPoint(focalX, focalY);
|
|
33
|
+
if (!point) return undefined;
|
|
34
|
+
const x = Math.round(point.focalX * 10_000) / 100;
|
|
35
|
+
const y = Math.round(point.focalY * 10_000) / 100;
|
|
36
|
+
return `${x}% ${y}%`;
|
|
37
|
+
}
|
|
@@ -73,6 +73,8 @@ export const createMediaProvider: CreateMediaProviderFn<LocalMediaRuntimeConfig>
|
|
|
73
73
|
size: item.size ?? undefined,
|
|
74
74
|
width: item.width ?? undefined,
|
|
75
75
|
height: item.height ?? undefined,
|
|
76
|
+
focalX: item.focalX ?? undefined,
|
|
77
|
+
focalY: item.focalY ?? undefined,
|
|
76
78
|
blurhash: item.blurhash ?? undefined,
|
|
77
79
|
dominantColor: item.dominantColor ?? undefined,
|
|
78
80
|
alt: item.alt ?? undefined,
|
|
@@ -99,6 +101,8 @@ export const createMediaProvider: CreateMediaProviderFn<LocalMediaRuntimeConfig>
|
|
|
99
101
|
size: item.size ?? undefined,
|
|
100
102
|
width: item.width ?? undefined,
|
|
101
103
|
height: item.height ?? undefined,
|
|
104
|
+
focalX: item.focalX ?? undefined,
|
|
105
|
+
focalY: item.focalY ?? undefined,
|
|
102
106
|
blurhash: item.blurhash ?? undefined,
|
|
103
107
|
dominantColor: item.dominantColor ?? undefined,
|
|
104
108
|
alt: item.alt ?? undefined,
|
|
@@ -225,6 +229,8 @@ export function repoItemToProviderItem(item: {
|
|
|
225
229
|
size: number | null;
|
|
226
230
|
width: number | null;
|
|
227
231
|
height: number | null;
|
|
232
|
+
focalX?: number | null;
|
|
233
|
+
focalY?: number | null;
|
|
228
234
|
alt: string | null;
|
|
229
235
|
caption: string | null;
|
|
230
236
|
storageKey: string;
|
|
@@ -238,6 +244,8 @@ export function repoItemToProviderItem(item: {
|
|
|
238
244
|
size: item.size ?? undefined,
|
|
239
245
|
width: item.width ?? undefined,
|
|
240
246
|
height: item.height ?? undefined,
|
|
247
|
+
focalX: item.focalX ?? undefined,
|
|
248
|
+
focalY: item.focalY ?? undefined,
|
|
241
249
|
blurhash: item.blurhash ?? undefined,
|
|
242
250
|
dominantColor: item.dominantColor ?? undefined,
|
|
243
251
|
alt: item.alt ?? undefined,
|
package/src/media/mime.ts
CHANGED
package/src/media/normalize.ts
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* the provider's `get()` method.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
+
import { normalizeFocalPoint } from "./focal-point.js";
|
|
12
13
|
import type { MediaProvider, MediaProviderItem, MediaValue } from "./types.js";
|
|
13
14
|
|
|
14
15
|
export const INTERNAL_MEDIA_PREFIX = "/_emdash/api/media/file/";
|
|
@@ -138,6 +139,7 @@ async function resolveInternalUrl(
|
|
|
138
139
|
return { provider: "external", id: "", src: url };
|
|
139
140
|
}
|
|
140
141
|
|
|
142
|
+
const focalPoint = normalizeFocalPoint(item.focalX, item.focalY);
|
|
141
143
|
return {
|
|
142
144
|
provider: "local",
|
|
143
145
|
id: item.id,
|
|
@@ -145,6 +147,7 @@ async function resolveInternalUrl(
|
|
|
145
147
|
mimeType: item.mimeType,
|
|
146
148
|
width: item.width,
|
|
147
149
|
height: item.height,
|
|
150
|
+
...focalPoint,
|
|
148
151
|
blurhash: item.blurhash,
|
|
149
152
|
dominantColor: item.dominantColor,
|
|
150
153
|
alt: item.alt,
|
|
@@ -169,6 +172,7 @@ async function resolveLocalId(
|
|
|
169
172
|
|
|
170
173
|
if (!item) return null;
|
|
171
174
|
|
|
175
|
+
const focalPoint = normalizeFocalPoint(item.focalX, item.focalY);
|
|
172
176
|
return {
|
|
173
177
|
provider: "local",
|
|
174
178
|
id: item.id,
|
|
@@ -176,6 +180,7 @@ async function resolveLocalId(
|
|
|
176
180
|
mimeType: item.mimeType,
|
|
177
181
|
width: item.width,
|
|
178
182
|
height: item.height,
|
|
183
|
+
...focalPoint,
|
|
179
184
|
blurhash: item.blurhash,
|
|
180
185
|
dominantColor: item.dominantColor,
|
|
181
186
|
alt: item.alt,
|
|
@@ -234,6 +239,11 @@ function recordToMediaValue(obj: Record<string, unknown>): MediaValue {
|
|
|
234
239
|
if (typeof obj.mimeType === "string") result.mimeType = obj.mimeType;
|
|
235
240
|
if (typeof obj.width === "number") result.width = obj.width;
|
|
236
241
|
if (typeof obj.height === "number") result.height = obj.height;
|
|
242
|
+
const focalPoint = normalizeFocalPoint(obj.focalX, obj.focalY);
|
|
243
|
+
if (focalPoint) {
|
|
244
|
+
result.focalX = focalPoint.focalX;
|
|
245
|
+
result.focalY = focalPoint.focalY;
|
|
246
|
+
}
|
|
237
247
|
if (typeof obj.blurhash === "string") result.blurhash = obj.blurhash;
|
|
238
248
|
if (typeof obj.dominantColor === "string") result.dominantColor = obj.dominantColor;
|
|
239
249
|
if (typeof obj.alt === "string") result.alt = obj.alt;
|
package/src/media/types.ts
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
* alongside the built-in local media library.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
+
import { normalizeFocalPoint } from "./focal-point.js";
|
|
10
|
+
|
|
9
11
|
/**
|
|
10
12
|
* Serializable media provider configuration descriptor
|
|
11
13
|
* Returned by provider config functions (e.g., unsplash(), mux())
|
|
@@ -85,6 +87,9 @@ export interface MediaProviderItem {
|
|
|
85
87
|
/** Dimensions (for images/video) */
|
|
86
88
|
width?: number;
|
|
87
89
|
height?: number;
|
|
90
|
+
/** Default focal point for cover-cropped displays */
|
|
91
|
+
focalX?: number;
|
|
92
|
+
focalY?: number;
|
|
88
93
|
/** LQIP blurhash placeholder (images only) */
|
|
89
94
|
blurhash?: string;
|
|
90
95
|
/** LQIP dominant-color placeholder, as a CSS color (images only) */
|
|
@@ -264,6 +269,9 @@ export interface MediaValue {
|
|
|
264
269
|
mimeType?: string;
|
|
265
270
|
width?: number;
|
|
266
271
|
height?: number;
|
|
272
|
+
/** Default focal point copied when the media item is selected */
|
|
273
|
+
focalX?: number;
|
|
274
|
+
focalY?: number;
|
|
267
275
|
/** Cached LQIP blurhash placeholder (images only) */
|
|
268
276
|
blurhash?: string;
|
|
269
277
|
/** Cached LQIP dominant-color placeholder, as a CSS color (images only) */
|
|
@@ -278,6 +286,7 @@ export interface MediaValue {
|
|
|
278
286
|
* Convert a MediaProviderItem to a MediaValue for storage
|
|
279
287
|
*/
|
|
280
288
|
export function mediaItemToValue(providerId: string, item: MediaProviderItem): MediaValue {
|
|
289
|
+
const focalPoint = normalizeFocalPoint(item.focalX, item.focalY);
|
|
281
290
|
return {
|
|
282
291
|
provider: providerId,
|
|
283
292
|
id: item.id,
|
|
@@ -285,6 +294,7 @@ export function mediaItemToValue(providerId: string, item: MediaProviderItem): M
|
|
|
285
294
|
mimeType: item.mimeType,
|
|
286
295
|
width: item.width,
|
|
287
296
|
height: item.height,
|
|
297
|
+
...focalPoint,
|
|
288
298
|
blurhash: item.blurhash,
|
|
289
299
|
dominantColor: item.dominantColor,
|
|
290
300
|
alt: item.alt,
|