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
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
DirectPdsDidDocumentResolver,
|
|
3
|
+
DirectPdsProfileRecord,
|
|
4
|
+
DirectPdsReadErrorCode,
|
|
5
|
+
DirectPdsReleaseRecord,
|
|
6
|
+
} from "@emdash-cms/registry-client/direct-pds";
|
|
7
|
+
import { DirectPdsClient, DirectPdsReadError } from "@emdash-cms/registry-client/direct-pds";
|
|
8
|
+
import {
|
|
9
|
+
fetchVerifiedResource,
|
|
10
|
+
inspectPackageReleaseRecords,
|
|
11
|
+
verifyMultihash,
|
|
12
|
+
verifyPackageReleaseRecords,
|
|
13
|
+
type FetchImplementation,
|
|
14
|
+
type HostnameResolver,
|
|
15
|
+
type ProvenanceVerifier,
|
|
16
|
+
type RecordInspectionReport,
|
|
17
|
+
type RecordVerificationFailure,
|
|
18
|
+
type RecordVerificationReport,
|
|
19
|
+
type VerificationErrorCode,
|
|
20
|
+
} from "@emdash-cms/registry-verification";
|
|
21
|
+
|
|
22
|
+
import { cloudflareDohResolver, ssrfSafeFetch } from "../security/ssrf.js";
|
|
23
|
+
|
|
24
|
+
const MAX_PROVENANCE_BYTES = 5 * 1024 * 1024;
|
|
25
|
+
|
|
26
|
+
export type AuthoritativeRecordErrorCode =
|
|
27
|
+
| DirectPdsReadErrorCode
|
|
28
|
+
| VerificationErrorCode
|
|
29
|
+
| "AUTHORITATIVE_RECORD_READ_FAILED";
|
|
30
|
+
|
|
31
|
+
export interface AuthoritativeRecordReadOptions {
|
|
32
|
+
fetch?: typeof fetch;
|
|
33
|
+
didDocumentResolver?: DirectPdsDidDocumentResolver;
|
|
34
|
+
provenanceFetch?: FetchImplementation;
|
|
35
|
+
resolveHostname?: HostnameResolver;
|
|
36
|
+
provenanceVerifier?: ProvenanceVerifier;
|
|
37
|
+
artifactDigests?: readonly Uint8Array[];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface VerifiedAuthoritativeRecords {
|
|
41
|
+
publisherDid: string;
|
|
42
|
+
packageSlug: string;
|
|
43
|
+
version: string;
|
|
44
|
+
profile: DirectPdsProfileRecord;
|
|
45
|
+
release: DirectPdsReleaseRecord;
|
|
46
|
+
inspection: Extract<RecordInspectionReport, { success: true }>;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export type VerifiedAuthoritativeReleaseReport = Extract<
|
|
50
|
+
RecordVerificationReport,
|
|
51
|
+
{ success: true }
|
|
52
|
+
>;
|
|
53
|
+
|
|
54
|
+
export type AuthoritativeRecordReadResult =
|
|
55
|
+
| { success: true; value: VerifiedAuthoritativeRecords }
|
|
56
|
+
| {
|
|
57
|
+
success: false;
|
|
58
|
+
error: { code: AuthoritativeRecordErrorCode; message: string };
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export type AuthoritativeRecordReader = (
|
|
62
|
+
publisherDid: string,
|
|
63
|
+
packageSlug: string,
|
|
64
|
+
version: string,
|
|
65
|
+
options?: AuthoritativeRecordReadOptions,
|
|
66
|
+
) => Promise<AuthoritativeRecordReadResult>;
|
|
67
|
+
|
|
68
|
+
export async function readAuthoritativePackageRelease(
|
|
69
|
+
publisherDid: string,
|
|
70
|
+
packageSlug: string,
|
|
71
|
+
version: string,
|
|
72
|
+
options: AuthoritativeRecordReadOptions = {},
|
|
73
|
+
): Promise<AuthoritativeRecordReadResult> {
|
|
74
|
+
try {
|
|
75
|
+
const client = new DirectPdsClient({
|
|
76
|
+
did: publisherDid,
|
|
77
|
+
fetch: options.fetch ?? guardedFetch,
|
|
78
|
+
didDocumentResolver: options.didDocumentResolver,
|
|
79
|
+
});
|
|
80
|
+
const [profile, release] = await Promise.all([
|
|
81
|
+
client.getPackageProfile(packageSlug),
|
|
82
|
+
client.getPackageRelease(packageSlug, version),
|
|
83
|
+
]);
|
|
84
|
+
const inspection = await inspectPackageReleaseRecords({
|
|
85
|
+
publisherDid,
|
|
86
|
+
package: packageSlug,
|
|
87
|
+
version,
|
|
88
|
+
rkey: release.rkey,
|
|
89
|
+
profile: profile.value,
|
|
90
|
+
release: release.value,
|
|
91
|
+
});
|
|
92
|
+
if (!inspection.success) {
|
|
93
|
+
return {
|
|
94
|
+
success: false,
|
|
95
|
+
error: {
|
|
96
|
+
code: inspection.code,
|
|
97
|
+
message: inspection.reasons[0]?.message ?? "The signed package records are invalid.",
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
success: true,
|
|
103
|
+
value: { publisherDid, packageSlug, version, profile, release, inspection },
|
|
104
|
+
};
|
|
105
|
+
} catch (error) {
|
|
106
|
+
if (error instanceof DirectPdsReadError) {
|
|
107
|
+
return { success: false, error: { code: error.code, message: error.message } };
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
success: false,
|
|
111
|
+
error: {
|
|
112
|
+
code: "AUTHORITATIVE_RECORD_READ_FAILED",
|
|
113
|
+
message: "The publisher's signed package records could not be verified.",
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export async function verifyAuthoritativePackageRelease(
|
|
120
|
+
records: VerifiedAuthoritativeRecords,
|
|
121
|
+
artifactDigest: Uint8Array,
|
|
122
|
+
options: AuthoritativeRecordReadOptions = {},
|
|
123
|
+
): Promise<RecordVerificationReport> {
|
|
124
|
+
const context = records.inspection.value;
|
|
125
|
+
const provenanceReference = context.releaseExtension.provenance;
|
|
126
|
+
let document: Uint8Array | undefined;
|
|
127
|
+
if (provenanceReference) {
|
|
128
|
+
const fetched = await fetchVerifiedResource(provenanceReference.url, {
|
|
129
|
+
fetch: options.provenanceFetch ?? defaultProvenanceFetch,
|
|
130
|
+
resolveHostname: options.resolveHostname ?? cloudflareDohResolver,
|
|
131
|
+
maxBytes: MAX_PROVENANCE_BYTES,
|
|
132
|
+
});
|
|
133
|
+
if (!fetched.success) {
|
|
134
|
+
return verificationFailure(fetched.error.code, fetched.error.message);
|
|
135
|
+
}
|
|
136
|
+
const checksum = await verifyMultihash(fetched.value.bytes, provenanceReference.checksum);
|
|
137
|
+
if (!checksum.success) {
|
|
138
|
+
return verificationFailure(checksum.error.code, checksum.error.message);
|
|
139
|
+
}
|
|
140
|
+
document = fetched.value.bytes;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return verifyPackageReleaseRecords({
|
|
144
|
+
publisherDid: records.publisherDid,
|
|
145
|
+
package: records.packageSlug,
|
|
146
|
+
version: records.version,
|
|
147
|
+
rkey: records.release.rkey,
|
|
148
|
+
profile: records.profile.value,
|
|
149
|
+
release: records.release.value,
|
|
150
|
+
provenance:
|
|
151
|
+
document === undefined
|
|
152
|
+
? undefined
|
|
153
|
+
: {
|
|
154
|
+
document,
|
|
155
|
+
artifactDigest,
|
|
156
|
+
artifactDigests: options.artifactDigests,
|
|
157
|
+
verifier: options.provenanceVerifier,
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function verificationFailure(
|
|
163
|
+
code: VerificationErrorCode,
|
|
164
|
+
message: string,
|
|
165
|
+
): RecordVerificationFailure {
|
|
166
|
+
return {
|
|
167
|
+
success: false,
|
|
168
|
+
status: "failed",
|
|
169
|
+
code,
|
|
170
|
+
reasons: [{ code, message }],
|
|
171
|
+
provenance: { status: "failed" },
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const guardedFetch: typeof fetch = async (input, init) => {
|
|
176
|
+
const url = input instanceof Request ? input.url : String(input);
|
|
177
|
+
return ssrfSafeFetch(url, init, { httpsOnly: true });
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
const defaultProvenanceFetch: FetchImplementation = (input, init) => globalThis.fetch(input, init);
|
package/src/registry/config.ts
CHANGED
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
* seconds so the browser doesn't need a duration parser.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
+
import { isDid } from "@atcute/lexicons/syntax";
|
|
12
|
+
|
|
11
13
|
import type { RegistryConfig, RegistryConfigInput } from "./types.js";
|
|
12
14
|
|
|
13
15
|
/**
|
|
@@ -24,10 +26,12 @@ export interface ManifestRegistryConfig {
|
|
|
24
26
|
* Allowlist of publishers / packages exempt from the
|
|
25
27
|
* {@link minimumReleaseAgeSeconds} holdback. Each entry is either:
|
|
26
28
|
*
|
|
27
|
-
* - A bare publisher
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
29
|
+
* - A bare publisher DID: `"did:plc:abc123"`. Every package from
|
|
30
|
+
* that publisher is exempt.
|
|
31
|
+
* - A `<did>/<slug>` pair: only that specific package is exempt.
|
|
32
|
+
*
|
|
33
|
+
* Handles are not accepted because they are mutable
|
|
34
|
+
* aggregator-supplied envelope data.
|
|
31
35
|
*
|
|
32
36
|
* Normalized to lowercase strings at config load time so the
|
|
33
37
|
* browser does case-insensitive comparison. See
|
|
@@ -110,6 +114,8 @@ const TRAILING_SLASHES = /\/+$/;
|
|
|
110
114
|
/** Trailing dot on a hostname, stripped before URL host comparisons. */
|
|
111
115
|
const TRAILING_DOT = /\.$/;
|
|
112
116
|
|
|
117
|
+
const REGISTRY_PACKAGE_SLUG_PATTERN = /^[a-z][a-z0-9_-]{0,63}$/;
|
|
118
|
+
|
|
113
119
|
/**
|
|
114
120
|
* Parse a duration string or raw second count into a non-negative
|
|
115
121
|
* integer count of seconds. Throws on unrecognised input so config
|
|
@@ -157,7 +163,7 @@ export function parseDurationSeconds(duration: string | number): number {
|
|
|
157
163
|
* required in production; `http://localhost` allowed only in dev.
|
|
158
164
|
*
|
|
159
165
|
* The aggregator's responses are the trust source for release records,
|
|
160
|
-
* checksums, labels,
|
|
166
|
+
* checksums, labels, artifact cache descriptors, and `indexedAt` (until full MST
|
|
161
167
|
* verification lands). Allowing plain HTTP here would let a network
|
|
162
168
|
* attacker swap a release record and point the artifact URL at their
|
|
163
169
|
* own HTTPS bundle, defeating the checksum trust chain because the
|
|
@@ -295,7 +301,19 @@ export function normalizeRegistryConfig(
|
|
|
295
301
|
if (!trimmed) {
|
|
296
302
|
throw new Error("registry.policy.minimumReleaseAgeExclude entries cannot be empty");
|
|
297
303
|
}
|
|
298
|
-
|
|
304
|
+
const lower = trimmed.toLowerCase();
|
|
305
|
+
const [did, slug, ...extra] = lower.split("/");
|
|
306
|
+
if (
|
|
307
|
+
!did ||
|
|
308
|
+
!isDid(did) ||
|
|
309
|
+
extra.length > 0 ||
|
|
310
|
+
(slug !== undefined && !REGISTRY_PACKAGE_SLUG_PATTERN.test(slug))
|
|
311
|
+
) {
|
|
312
|
+
throw new Error(
|
|
313
|
+
`registry.policy.minimumReleaseAgeExclude entry must be a DID or <did>/<slug>: ${trimmed}`,
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
return lower;
|
|
299
317
|
});
|
|
300
318
|
if (list.length > 0) {
|
|
301
319
|
policy.minimumReleaseAgeExclude = list;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
interface VersionedRecordLabel {
|
|
2
|
+
val?: string;
|
|
3
|
+
uri?: string;
|
|
4
|
+
cid?: string;
|
|
5
|
+
neg?: boolean;
|
|
6
|
+
exp?: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function hasCurrentRecordLabel(
|
|
10
|
+
labels: readonly VersionedRecordLabel[],
|
|
11
|
+
value: string,
|
|
12
|
+
record: { uri: string; cid: string },
|
|
13
|
+
now = Date.now(),
|
|
14
|
+
): boolean {
|
|
15
|
+
return labels.some((label) => {
|
|
16
|
+
if (
|
|
17
|
+
label.val !== value ||
|
|
18
|
+
label.uri !== record.uri ||
|
|
19
|
+
label.cid !== record.cid ||
|
|
20
|
+
label.neg === true
|
|
21
|
+
) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
if (label.exp === undefined) return true;
|
|
25
|
+
const expiresAt = Date.parse(label.exp);
|
|
26
|
+
return Number.isFinite(expiresAt) && expiresAt > now;
|
|
27
|
+
});
|
|
28
|
+
}
|
package/src/registry/types.ts
CHANGED
|
@@ -29,15 +29,13 @@ export interface RegistryConfig {
|
|
|
29
29
|
aggregatorUrl: string;
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
|
-
* Optional comma-separated list of labeller DIDs forwarded as the
|
|
33
|
-
* `atproto-accept-labelers` header on every aggregator request.
|
|
32
|
+
* Optional comma-separated list of bare labeller DIDs forwarded as the
|
|
33
|
+
* `atproto-accept-labelers` header on every aggregator request. The
|
|
34
|
+
* declaration contributes to the client's cache identity.
|
|
34
35
|
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* When unset, the aggregator applies its operator-default labeller set
|
|
39
|
-
* (typically the EmDash publisher-verification labeller and any
|
|
40
|
-
* additional trusted labellers the aggregator operator configured).
|
|
36
|
+
* The aggregator validates the declaration and rejects unknown sources or
|
|
37
|
+
* a list that omits a required source. It does not let the declaration
|
|
38
|
+
* override its configured approval, block, takedown, or withdrawal policy.
|
|
41
39
|
*/
|
|
42
40
|
acceptLabelers?: string;
|
|
43
41
|
|
|
@@ -157,8 +155,8 @@ export interface ExperimentalConfig {
|
|
|
157
155
|
* release:
|
|
158
156
|
*
|
|
159
157
|
* - The publisher DID associated with a `(did, slug)` pair.
|
|
160
|
-
* - The artifact
|
|
161
|
-
*
|
|
158
|
+
* - The artifact source fields, checksum, and cache services returned for
|
|
159
|
+
* a release.
|
|
162
160
|
* - The published handle for a DID (used for display only;
|
|
163
161
|
* EmDash separately verifies the DID->handle round-trip in the
|
|
164
162
|
* admin UI before treating a handle as confirmed).
|
|
@@ -167,7 +165,7 @@ export interface ExperimentalConfig {
|
|
|
167
165
|
* installed plugin:
|
|
168
166
|
*
|
|
169
167
|
* - The artifact bytes hash to the checksum the aggregator
|
|
170
|
-
* returned (so a malicious
|
|
168
|
+
* returned (so a malicious cache or in-transit tamper can't
|
|
171
169
|
* swap the bundle).
|
|
172
170
|
* - The bundle's `manifest.id` matches the requested slug, and
|
|
173
171
|
* its `manifest.version` matches the release version (so an
|
|
@@ -190,10 +188,9 @@ export interface ExperimentalConfig {
|
|
|
190
188
|
* **Recommendation.** Until full signature verification lands,
|
|
191
189
|
* point `aggregatorUrl` only at an aggregator you operate
|
|
192
190
|
* yourself or one you trust with the same level of authority as
|
|
193
|
-
* a centralized plugin source.
|
|
194
|
-
*
|
|
195
|
-
*
|
|
196
|
-
* system is operating.
|
|
191
|
+
* a centralized plugin source. `policy.minimumReleaseAge` widens
|
|
192
|
+
* the detection window for takedowns. `acceptLabelers` declares a
|
|
193
|
+
* request and cache identity; it does not change aggregator policy.
|
|
197
194
|
*
|
|
198
195
|
* Requires `sandboxRunner` to be configured -- registry plugins
|
|
199
196
|
* always run sandboxed.
|
package/src/schema/registry.ts
CHANGED
|
@@ -9,6 +9,7 @@ import type {
|
|
|
9
9
|
import { sql } from "kysely";
|
|
10
10
|
import { ulid } from "ulidx";
|
|
11
11
|
|
|
12
|
+
import { refreshDevTypes } from "../astro/dev-typegen.js";
|
|
12
13
|
import { currentTimestamp, listTablesLike, tableExists } from "../database/dialect-helpers.js";
|
|
13
14
|
import { withTransaction } from "../database/transaction.js";
|
|
14
15
|
import type { CollectionTable, Database, FieldTable } from "../database/types.js";
|
|
@@ -244,6 +245,13 @@ export class SchemaError extends Error {
|
|
|
244
245
|
export class SchemaRegistry {
|
|
245
246
|
constructor(private db: Kysely<Database>) {}
|
|
246
247
|
|
|
248
|
+
/**
|
|
249
|
+
* Notify the dev typegen hook that the schema has changed.
|
|
250
|
+
*/
|
|
251
|
+
private notifyTypegen(): void {
|
|
252
|
+
refreshDevTypes(this.db);
|
|
253
|
+
}
|
|
254
|
+
|
|
247
255
|
// ============================================
|
|
248
256
|
// Collection Operations
|
|
249
257
|
// ============================================
|
|
@@ -496,6 +504,7 @@ export class SchemaRegistry {
|
|
|
496
504
|
throw new SchemaError("Failed to create collection", "CREATE_FAILED");
|
|
497
505
|
}
|
|
498
506
|
|
|
507
|
+
this.notifyTypegen();
|
|
499
508
|
return collection;
|
|
500
509
|
}
|
|
501
510
|
|
|
@@ -671,6 +680,7 @@ export class SchemaRegistry {
|
|
|
671
680
|
}
|
|
672
681
|
throw error;
|
|
673
682
|
}
|
|
683
|
+
this.notifyTypegen();
|
|
674
684
|
}
|
|
675
685
|
|
|
676
686
|
private async assertSeedFieldDefinitions(
|
|
@@ -719,7 +729,7 @@ export class SchemaRegistry {
|
|
|
719
729
|
* Update a collection
|
|
720
730
|
*/
|
|
721
731
|
async updateCollection(slug: string, input: UpdateCollectionInput): Promise<Collection> {
|
|
722
|
-
|
|
732
|
+
const updated = await withTransaction(this.db, async (trx) => {
|
|
723
733
|
const existingRow = await trx
|
|
724
734
|
.selectFrom("_emdash_collections")
|
|
725
735
|
.where("slug", "=", slug)
|
|
@@ -798,6 +808,8 @@ export class SchemaRegistry {
|
|
|
798
808
|
|
|
799
809
|
return this.mapCollectionRow(row);
|
|
800
810
|
});
|
|
811
|
+
this.notifyTypegen();
|
|
812
|
+
return updated;
|
|
801
813
|
}
|
|
802
814
|
|
|
803
815
|
/**
|
|
@@ -852,6 +864,7 @@ export class SchemaRegistry {
|
|
|
852
864
|
}
|
|
853
865
|
throw error;
|
|
854
866
|
}
|
|
867
|
+
this.notifyTypegen();
|
|
855
868
|
}
|
|
856
869
|
|
|
857
870
|
// ============================================
|
|
@@ -1005,6 +1018,7 @@ export class SchemaRegistry {
|
|
|
1005
1018
|
"CONTENT_USAGE_STALE",
|
|
1006
1019
|
);
|
|
1007
1020
|
}
|
|
1021
|
+
this.notifyTypegen();
|
|
1008
1022
|
return created;
|
|
1009
1023
|
} catch (error) {
|
|
1010
1024
|
if (schemaMutated) {
|
|
@@ -1185,6 +1199,7 @@ export class SchemaRegistry {
|
|
|
1185
1199
|
);
|
|
1186
1200
|
}
|
|
1187
1201
|
}
|
|
1202
|
+
this.notifyTypegen();
|
|
1188
1203
|
return updatedField;
|
|
1189
1204
|
} catch (error) {
|
|
1190
1205
|
if (schemaMutated) {
|
|
@@ -1326,6 +1341,7 @@ export class SchemaRegistry {
|
|
|
1326
1341
|
}
|
|
1327
1342
|
throw error;
|
|
1328
1343
|
}
|
|
1344
|
+
this.notifyTypegen();
|
|
1329
1345
|
}
|
|
1330
1346
|
|
|
1331
1347
|
/**
|
|
@@ -1380,6 +1396,7 @@ export class SchemaRegistry {
|
|
|
1380
1396
|
.execute();
|
|
1381
1397
|
}
|
|
1382
1398
|
});
|
|
1399
|
+
this.notifyTypegen();
|
|
1383
1400
|
}
|
|
1384
1401
|
|
|
1385
1402
|
/**
|
|
@@ -1400,6 +1417,7 @@ export class SchemaRegistry {
|
|
|
1400
1417
|
.where("slug", "=", fieldSlugs[i])
|
|
1401
1418
|
.execute();
|
|
1402
1419
|
}
|
|
1420
|
+
this.notifyTypegen();
|
|
1403
1421
|
}
|
|
1404
1422
|
|
|
1405
1423
|
// ============================================
|
|
@@ -1463,9 +1481,13 @@ export class SchemaRegistry {
|
|
|
1463
1481
|
ON ${sql.ref(tableName)} (slug)
|
|
1464
1482
|
`.execute(conn);
|
|
1465
1483
|
|
|
1484
|
+
// Name must stay identical to migration 074. `deleted_at` leads so the
|
|
1485
|
+
// scheduled-publishing sweep can seek it and walk `scheduled_at` for both
|
|
1486
|
+
// its range and its ORDER BY; a `scheduled_at`-only index leaves a
|
|
1487
|
+
// stats-blind planner reading every live row.
|
|
1466
1488
|
await sql`
|
|
1467
|
-
${createIndex} ${sql.ref(`idx_${tableName}
|
|
1468
|
-
ON ${sql.ref(tableName)} (scheduled_at)
|
|
1489
|
+
${createIndex} ${sql.ref(`idx_${tableName}_del_sched`)}
|
|
1490
|
+
ON ${sql.ref(tableName)} (deleted_at, scheduled_at)
|
|
1469
1491
|
WHERE scheduled_at IS NOT NULL
|
|
1470
1492
|
`.execute(conn);
|
|
1471
1493
|
|
|
@@ -1992,6 +2014,7 @@ export class SchemaRegistry {
|
|
|
1992
2014
|
throw new SchemaError("Failed to register orphaned table", "REGISTER_FAILED");
|
|
1993
2015
|
}
|
|
1994
2016
|
await markContentMediaUsageCollectionStaleSafely(this.db, slug, "CONTENT_USAGE_STALE");
|
|
2017
|
+
this.notifyTypegen();
|
|
1995
2018
|
|
|
1996
2019
|
return collection;
|
|
1997
2020
|
} catch (error) {
|
package/src/schema/types.ts
CHANGED
|
@@ -167,6 +167,7 @@ export interface FieldValidation {
|
|
|
167
167
|
export interface FieldWidgetOptions {
|
|
168
168
|
rows?: number; // For textarea
|
|
169
169
|
showPreview?: boolean; // For image/file
|
|
170
|
+
darkVariant?: boolean; // For image: offer a second slot for a dark-color-scheme counterpart
|
|
170
171
|
collection?: string; // For reference - which collection to reference
|
|
171
172
|
allowMultiple?: boolean; // For reference
|
|
172
173
|
[key: string]: unknown;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { z, type
|
|
1
|
+
import { z, type ZodType } from "zod";
|
|
2
2
|
|
|
3
3
|
import { hashString } from "../utils/hash.js";
|
|
4
4
|
import type { CollectionWithFields, Field, FieldType, RepeaterSubField } from "./types.js";
|
|
@@ -14,8 +14,8 @@ const PASCAL_CASE_SPLIT_PATTERN = /[_\-\s]+/;
|
|
|
14
14
|
*/
|
|
15
15
|
export function generateZodSchema(
|
|
16
16
|
collection: CollectionWithFields,
|
|
17
|
-
): z.ZodObject<Record<string,
|
|
18
|
-
const shape: Record<string,
|
|
17
|
+
): z.ZodObject<Record<string, ZodType>> {
|
|
18
|
+
const shape: Record<string, ZodType> = {};
|
|
19
19
|
|
|
20
20
|
for (const field of collection.fields) {
|
|
21
21
|
shape[field.slug] = generateFieldSchema(field);
|
|
@@ -27,7 +27,7 @@ export function generateZodSchema(
|
|
|
27
27
|
/**
|
|
28
28
|
* Generate Zod schema for a single field
|
|
29
29
|
*/
|
|
30
|
-
export function generateFieldSchema(field: Field):
|
|
30
|
+
export function generateFieldSchema(field: Field): ZodType {
|
|
31
31
|
let schema = getBaseSchema(field.type, field);
|
|
32
32
|
|
|
33
33
|
// Apply validation rules
|
|
@@ -58,10 +58,10 @@ export function generateFieldSchema(field: Field): ZodTypeAny {
|
|
|
58
58
|
/**
|
|
59
59
|
* Get base Zod schema for a field type
|
|
60
60
|
*/
|
|
61
|
-
function getBaseSchema(type: FieldType, field: Pick<Field, "validation">):
|
|
61
|
+
function getBaseSchema(type: FieldType, field: Pick<Field, "validation">): ZodType {
|
|
62
62
|
switch (type) {
|
|
63
63
|
case "url":
|
|
64
|
-
return z.string().url();
|
|
64
|
+
return z.string().check(z.url());
|
|
65
65
|
|
|
66
66
|
case "string":
|
|
67
67
|
case "text":
|
|
@@ -94,7 +94,10 @@ function getBaseSchema(type: FieldType, field: Pick<Field, "validation">): ZodTy
|
|
|
94
94
|
// validate or the entry becomes unsavable through its own editor
|
|
95
95
|
// (#1368; same class as #867). `z.iso.*` retains semantic validation,
|
|
96
96
|
// so impossible dates are still rejected.
|
|
97
|
-
return z.iso
|
|
97
|
+
return z.iso
|
|
98
|
+
.datetime({ offset: true, local: true })
|
|
99
|
+
.or(z.iso.datetime({ offset: true, local: true, precision: -1 }))
|
|
100
|
+
.or(z.iso.date());
|
|
98
101
|
|
|
99
102
|
case "select": {
|
|
100
103
|
const options = field.validation?.options;
|
|
@@ -122,7 +125,7 @@ function getBaseSchema(type: FieldType, field: Pick<Field, "validation">): ZodTy
|
|
|
122
125
|
// renderers dispatch on it, but `_key` is intentionally optional:
|
|
123
126
|
// it's a UI-layer concern that the editor regenerates on every
|
|
124
127
|
// change (see `PortableTextEditor`), and the rest of this schema
|
|
125
|
-
// uses `.
|
|
128
|
+
// uses `.loose()` for everything below the top level. Making
|
|
126
129
|
// `_key` strictly required here was an accidentally tight invariant
|
|
127
130
|
// that rejected any seed/import data not authored against the
|
|
128
131
|
// editor (#867 — autosave failures on seeded template content).
|
|
@@ -132,11 +135,11 @@ function getBaseSchema(type: FieldType, field: Pick<Field, "validation">): ZodTy
|
|
|
132
135
|
_type: z.string(),
|
|
133
136
|
_key: z.string().optional(),
|
|
134
137
|
})
|
|
135
|
-
.
|
|
138
|
+
.loose(),
|
|
136
139
|
);
|
|
137
140
|
|
|
138
|
-
case "image":
|
|
139
|
-
|
|
141
|
+
case "image": {
|
|
142
|
+
const mediaSchema = z.object({
|
|
140
143
|
id: z.string(),
|
|
141
144
|
src: z.string().optional(),
|
|
142
145
|
alt: z.string().optional(),
|
|
@@ -153,6 +156,11 @@ function getBaseSchema(type: FieldType, field: Pick<Field, "validation">): ZodTy
|
|
|
153
156
|
/** Provider-specific metadata; for local media this carries storageKey */
|
|
154
157
|
meta: z.record(z.string(), z.unknown()).optional(),
|
|
155
158
|
});
|
|
159
|
+
return mediaSchema.extend({
|
|
160
|
+
/** Counterpart shown when the page renders in a dark color scheme */
|
|
161
|
+
darkVariant: mediaSchema.optional(),
|
|
162
|
+
});
|
|
163
|
+
}
|
|
156
164
|
|
|
157
165
|
case "file":
|
|
158
166
|
return z.object({
|
|
@@ -181,8 +189,8 @@ function getBaseSchema(type: FieldType, field: Pick<Field, "validation">): ZodTy
|
|
|
181
189
|
|
|
182
190
|
function generateRepeaterRowSchema(
|
|
183
191
|
subFields: readonly RepeaterSubField[],
|
|
184
|
-
): z.ZodObject<Record<string,
|
|
185
|
-
const shape: Record<string,
|
|
192
|
+
): z.ZodObject<Record<string, ZodType>> {
|
|
193
|
+
const shape: Record<string, ZodType> = {};
|
|
186
194
|
|
|
187
195
|
for (const subField of subFields) {
|
|
188
196
|
let schema = getBaseSchema(subField.type, {
|
|
@@ -199,13 +207,13 @@ function generateRepeaterRowSchema(
|
|
|
199
207
|
shape[subField.slug] = schema;
|
|
200
208
|
}
|
|
201
209
|
|
|
202
|
-
return z.object(shape).
|
|
210
|
+
return z.object(shape).loose();
|
|
203
211
|
}
|
|
204
212
|
|
|
205
213
|
/**
|
|
206
214
|
* Apply validation rules to a schema
|
|
207
215
|
*/
|
|
208
|
-
function applyValidation(schema:
|
|
216
|
+
function applyValidation(schema: ZodType, field: Field): ZodType {
|
|
209
217
|
const validation = field.validation;
|
|
210
218
|
if (!validation) return schema;
|
|
211
219
|
|
|
@@ -483,8 +491,11 @@ function fieldTypeToTypeScript(field: {
|
|
|
483
491
|
case "portableText":
|
|
484
492
|
return "PortableTextBlock[]";
|
|
485
493
|
|
|
486
|
-
case "image":
|
|
487
|
-
|
|
494
|
+
case "image": {
|
|
495
|
+
const media =
|
|
496
|
+
"{ id: string; src?: string; alt?: string; width?: number; height?: number; filename?: string; mimeType?: string; blurhash?: string; dominantColor?: string; provider?: string; previewUrl?: string; meta?: Record<string, unknown> }";
|
|
497
|
+
return `${media.slice(0, -2)}; darkVariant?: ${media} }`;
|
|
498
|
+
}
|
|
488
499
|
|
|
489
500
|
case "file":
|
|
490
501
|
return "{ id: string; url?: string; src?: string; filename?: string; mimeType?: string; size?: number; provider?: string; meta?: Record<string, unknown> }";
|
package/src/security/ssrf.ts
CHANGED
|
@@ -389,6 +389,22 @@ export async function resolveAndValidateExternalUrl(
|
|
|
389
389
|
url: string,
|
|
390
390
|
options?: { resolver?: DnsResolver },
|
|
391
391
|
): Promise<URL> {
|
|
392
|
+
return (await resolveAndValidateExternalUrlTarget(url, options)).url;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
export interface ResolvedExternalUrlTarget {
|
|
396
|
+
url: URL;
|
|
397
|
+
addresses: readonly string[];
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/**
|
|
401
|
+
* Validate a URL and return the exact public addresses approved for the
|
|
402
|
+
* subsequent connection.
|
|
403
|
+
*/
|
|
404
|
+
export async function resolveAndValidateExternalUrlTarget(
|
|
405
|
+
url: string,
|
|
406
|
+
options?: { resolver?: DnsResolver },
|
|
407
|
+
): Promise<ResolvedExternalUrlTarget> {
|
|
392
408
|
const parsed = validateExternalUrl(url);
|
|
393
409
|
|
|
394
410
|
// Strip brackets from IPv6 hostnames
|
|
@@ -397,7 +413,7 @@ export async function resolveAndValidateExternalUrl(
|
|
|
397
413
|
// If the hostname is already an IP literal, validateExternalUrl has
|
|
398
414
|
// already checked it against the private-range list. Skip DNS.
|
|
399
415
|
if (isIpLiteral(hostname)) {
|
|
400
|
-
return parsed;
|
|
416
|
+
return { url: parsed, addresses: [hostname] };
|
|
401
417
|
}
|
|
402
418
|
|
|
403
419
|
const resolver = options?.resolver ?? defaultResolver ?? cloudflareDohResolver;
|
|
@@ -416,12 +432,15 @@ export async function resolveAndValidateExternalUrl(
|
|
|
416
432
|
}
|
|
417
433
|
|
|
418
434
|
for (const ip of addresses) {
|
|
435
|
+
if (!isIpLiteral(ip)) {
|
|
436
|
+
throw new SsrfError("Hostname resolver returned a non-IP address");
|
|
437
|
+
}
|
|
419
438
|
if (isPrivateIp(ip)) {
|
|
420
439
|
throw new SsrfError("Hostname resolves to a private IP address");
|
|
421
440
|
}
|
|
422
441
|
}
|
|
423
442
|
|
|
424
|
-
return parsed;
|
|
443
|
+
return { url: parsed, addresses };
|
|
425
444
|
}
|
|
426
445
|
|
|
427
446
|
/** True when a string looks like an IPv4 or IPv6 literal. */
|
|
@@ -448,13 +467,16 @@ const CREDENTIAL_HEADERS = ["authorization", "cookie", "proxy-authorization"];
|
|
|
448
467
|
export async function ssrfSafeFetch(
|
|
449
468
|
url: string,
|
|
450
469
|
init?: RequestInit,
|
|
451
|
-
options?: { resolver?: DnsResolver },
|
|
470
|
+
options?: { resolver?: DnsResolver; httpsOnly?: boolean },
|
|
452
471
|
): Promise<Response> {
|
|
453
472
|
let currentUrl = url;
|
|
454
473
|
let currentInit = init;
|
|
455
474
|
|
|
456
475
|
for (let i = 0; i <= MAX_REDIRECTS; i++) {
|
|
457
|
-
await resolveAndValidateExternalUrl(currentUrl, options);
|
|
476
|
+
const validated = await resolveAndValidateExternalUrl(currentUrl, options);
|
|
477
|
+
if (options?.httpsOnly === true && validated.protocol !== "https:") {
|
|
478
|
+
throw new SsrfError("Only HTTPS URLs are allowed");
|
|
479
|
+
}
|
|
458
480
|
|
|
459
481
|
const response = await globalThis.fetch(currentUrl, {
|
|
460
482
|
...currentInit,
|
package/src/seed/apply.ts
CHANGED
|
@@ -1419,9 +1419,9 @@ async function resolveMedia(
|
|
|
1419
1419
|
const ext = getExtensionFromContentType(contentType) || getExtensionFromUrl(url) || ".bin";
|
|
1420
1420
|
|
|
1421
1421
|
// Generate filename and storage key
|
|
1422
|
-
const
|
|
1422
|
+
const storageId = ulid();
|
|
1423
1423
|
const finalFilename = filename || generateFilename(url, ext);
|
|
1424
|
-
const storageKey = `${
|
|
1424
|
+
const storageKey = `${storageId}${ext}`;
|
|
1425
1425
|
|
|
1426
1426
|
// Get the body as buffer
|
|
1427
1427
|
const arrayBuffer = await response.arrayBuffer();
|
|
@@ -1445,7 +1445,7 @@ async function resolveMedia(
|
|
|
1445
1445
|
|
|
1446
1446
|
// Create media record
|
|
1447
1447
|
const mediaRepo = new MediaRepository(ctx.db);
|
|
1448
|
-
await mediaRepo.create({
|
|
1448
|
+
const media = await mediaRepo.create({
|
|
1449
1449
|
filename: finalFilename,
|
|
1450
1450
|
mimeType: contentType,
|
|
1451
1451
|
size: body.length,
|
|
@@ -1460,7 +1460,7 @@ async function resolveMedia(
|
|
|
1460
1460
|
// Create the MediaValue - only store id, URL is built at runtime by EmDashMedia
|
|
1461
1461
|
const mediaValue: MediaValue = {
|
|
1462
1462
|
provider: "local",
|
|
1463
|
-
id,
|
|
1463
|
+
id: media.id,
|
|
1464
1464
|
alt: alt ?? undefined,
|
|
1465
1465
|
width,
|
|
1466
1466
|
height,
|