emdash 0.36.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/{adapters-CzL3H752.d.mts → adapters-BDQwg236.d.mts} +4 -2
- package/dist/{adapters-CzL3H752.d.mts.map → adapters-BDQwg236.d.mts.map} +1 -1
- package/dist/{allowed-origins-maylGaHv.mjs → allowed-origins-BGglilcs.mjs} +2 -2
- package/dist/{allowed-origins-maylGaHv.mjs.map → allowed-origins-BGglilcs.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -3
- package/dist/api/route-utils.mjs +17 -17
- 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-9YrrCoE6.mjs → api-tokens-BSsQACNe.mjs} +2 -2
- package/dist/{api-tokens-9YrrCoE6.mjs.map → api-tokens-BSsQACNe.mjs.map} +1 -1
- package/dist/{apply-B_VMpJ2P.mjs → apply-B4SIOxR1.mjs} +18 -18
- package/dist/{apply-B_VMpJ2P.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 +110 -37
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +10 -10
- package/dist/astro/middleware/auth.mjs +6 -6
- package/dist/astro/middleware/media-usage-write-fence.mjs +2 -2
- package/dist/astro/middleware/redirect.mjs +3 -3
- package/dist/astro/middleware/request-context.mjs +2 -2
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +10 -10
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +157 -195
- 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 +3 -3
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +8 -8
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +8 -8
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +8 -8
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +14 -14
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +14 -14
- package/dist/astro/routes/api/admin/bylines/index.mjs +14 -14
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +12 -12
- 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 +3 -3
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +2 -2
- package/dist/astro/routes/api/admin/media-usage/activation.mjs +10 -10
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +13 -13
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +13 -13
- package/dist/astro/routes/api/admin/media-usage/progress.mjs +11 -11
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +14 -14
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +13 -13
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +13 -13
- 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 +49 -49
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +49 -49
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +47 -47
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +4 -4
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +47 -47
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +48 -48
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +48 -48
- package/dist/astro/routes/api/admin/plugins/index.mjs +47 -47
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +47 -47
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +48 -48
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +47 -47
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +48 -48
- 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 +54 -50
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +17 -16
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +55 -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 +47 -47
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +47 -47
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +2 -2
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +47 -47
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +1 -1
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +1 -1
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +6 -6
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +2 -2
- 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 +10 -10
- package/dist/astro/routes/api/auth/invite/index.mjs +7 -7
- package/dist/astro/routes/api/auth/invite/register-options.mjs +9 -9
- package/dist/astro/routes/api/auth/logout.mjs +2 -2
- package/dist/astro/routes/api/auth/magic-link/send.mjs +9 -9
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +2 -2
- package/dist/astro/routes/api/auth/me.mjs +7 -7
- package/dist/astro/routes/api/auth/mode.mjs +2 -2
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
- 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 +11 -11
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +9 -9
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +10 -10
- package/dist/astro/routes/api/auth/passkey/verify.mjs +10 -10
- package/dist/astro/routes/api/auth/signup/complete.mjs +10 -10
- package/dist/astro/routes/api/auth/signup/request.mjs +9 -9
- 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.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 +10 -10
- 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 +15 -15
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +15 -15
- 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.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 +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 +15 -15
- 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 +11 -11
- package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -10
- package/dist/astro/routes/api/import/wordpress/media.mjs +9 -9
- 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 +10 -10
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +15 -15
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +22 -22
- package/dist/astro/routes/api/manifest.mjs +3 -3
- 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 +9 -9
- 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 +5 -5
- package/dist/astro/routes/api/media/_id_/usage.mjs +16 -16
- package/dist/astro/routes/api/media/_id_.mjs +15 -15
- package/dist/astro/routes/api/media/file/_...key_.d.mts.map +1 -1
- package/dist/astro/routes/api/media/file/_...key_.mjs +3 -2
- package/dist/astro/routes/api/media/file/_...key_.mjs.map +1 -1
- package/dist/astro/routes/api/media/folders/_id_.mjs +8 -8
- package/dist/astro/routes/api/media/folders/index.mjs +8 -8
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
- package/dist/astro/routes/api/media/providers/index.mjs +2 -2
- package/dist/astro/routes/api/media/upload-url.mjs +15 -13
- 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 +47 -24
- 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 +104 -38
- 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 +8 -8
- package/dist/astro/routes/api/redirects/404s/summary.mjs +8 -8
- package/dist/astro/routes/api/redirects/_id_.mjs +9 -9
- package/dist/astro/routes/api/redirects/index.mjs +9 -9
- package/dist/astro/routes/api/relations/_id_/index.mjs +15 -15
- package/dist/astro/routes/api/relations/_id_/translations.mjs +10 -10
- package/dist/astro/routes/api/relations/index.mjs +15 -15
- 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 +47 -47
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +47 -47
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +47 -47
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +47 -47
- package/dist/astro/routes/api/schema/collections/index.mjs +47 -47
- package/dist/astro/routes/api/schema/collections/reorder.mjs +47 -47
- package/dist/astro/routes/api/schema/index.mjs +8 -8
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +47 -47
- package/dist/astro/routes/api/schema/orphans/index.mjs +47 -47
- 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 +5 -5
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +4 -4
- package/dist/astro/routes/api/settings/backups/export.mjs +5 -5
- package/dist/astro/routes/api/settings/backups/index.mjs +6 -6
- package/dist/astro/routes/api/settings/email.mjs +4 -4
- 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 +18 -14
- package/dist/astro/routes/api/settings.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin-verify.mjs +11 -11
- package/dist/astro/routes/api/setup/admin.mjs +10 -10
- package/dist/astro/routes/api/setup/dev-bypass.mjs +25 -25
- package/dist/astro/routes/api/setup/dev-reset.mjs +1 -1
- package/dist/astro/routes/api/setup/index.mjs +25 -25
- package/dist/astro/routes/api/setup/status.mjs +3 -3
- package/dist/astro/routes/api/snapshot.mjs +6 -6
- package/dist/astro/routes/api/taxonomies/_name_/reorder.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +19 -15
- 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 +20 -16
- 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 +24 -17
- 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 +19 -15
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +13 -13
- package/dist/astro/routes/api/taxonomies/_name_.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_.mjs +25 -18
- 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 +19 -15
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +4 -4
- package/dist/astro/routes/api/typegen.mjs +4 -4
- package/dist/astro/routes/api/well-known/auth.mjs +1 -1
- 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 +16 -12
- 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 +14 -11
- 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 +7 -5
- 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 +14 -11
- 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 +5 -5
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +8 -8
- package/dist/astro/routes/sitemap.xml.mjs +6 -6
- package/dist/astro/types.d.mts +32 -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-ByYs-Uxs.mjs → authorize-Bkf_UHhD.mjs} +2 -2
- package/dist/{authorize-ByYs-Uxs.mjs.map → authorize-Bkf_UHhD.mjs.map} +1 -1
- package/dist/{backup-ChyHfIoX.mjs → backup-rwVAl9NI.mjs} +4 -4
- package/dist/{backup-ChyHfIoX.mjs.map → backup-rwVAl9NI.mjs.map} +1 -1
- package/dist/{bundle-DZFhFurR.mjs → bundle-C8S2Zl6U.mjs} +3 -3
- package/dist/{bundle-DZFhFurR.mjs.map → bundle-C8S2Zl6U.mjs.map} +1 -1
- package/dist/{byline-Cpnwrje1.mjs → byline-DuhF7NWl.mjs} +25 -12
- package/dist/byline-DuhF7NWl.mjs.map +1 -0
- package/dist/{byline-fields-CAyA_Umd.mjs → byline-fields-BovY4KYM.mjs} +1 -1
- package/dist/{byline-fields-CAyA_Umd.mjs.map → byline-fields-BovY4KYM.mjs.map} +1 -1
- package/dist/{bylines-BSo9B9RX.mjs → bylines-CJ5nd6Lw.mjs} +6 -6
- package/dist/{bylines-BSo9B9RX.mjs.map → bylines-CJ5nd6Lw.mjs.map} +1 -1
- package/dist/{bylines-CHjvehVX.mjs → bylines-RwBAeOF1.mjs} +3 -3
- package/dist/{bylines-CHjvehVX.mjs.map → bylines-RwBAeOF1.mjs.map} +1 -1
- package/dist/{cache-5VirJ2Cn.mjs → cache-BF5Kvn59.mjs} +2 -2
- package/dist/{cache-5VirJ2Cn.mjs.map → cache-BF5Kvn59.mjs.map} +1 -1
- package/dist/{challenge-store-D5pSY2S1.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-bNiX6_DR.mjs → chunks-C4szrD8o.mjs} +2 -2
- package/dist/{chunks-bNiX6_DR.mjs.map → chunks-C4szrD8o.mjs.map} +1 -1
- package/dist/cli/index.mjs +26 -26
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +2 -2
- package/dist/client/index.mjs +2 -2
- package/dist/{collection-deletion-m_oi2c0N.mjs → collection-deletion-Bj07NHbj.mjs} +2 -2
- package/dist/{collection-deletion-m_oi2c0N.mjs.map → collection-deletion-Bj07NHbj.mjs.map} +1 -1
- package/dist/{comment-reaction-CRuItEjt.mjs → comment-reaction-BhrvSHml.mjs} +2 -2
- package/dist/{comment-reaction-CRuItEjt.mjs.map → comment-reaction-BhrvSHml.mjs.map} +1 -1
- package/dist/{comment-DhvLEdhQ.mjs → comment-vxOzWbZN.mjs} +2 -2
- package/dist/{comment-DhvLEdhQ.mjs.map → comment-vxOzWbZN.mjs.map} +1 -1
- package/dist/{comments-CLj4bi8I.mjs → comments-Ct4ensnf.mjs} +2 -2
- package/dist/{comments-CLj4bi8I.mjs.map → comments-Ct4ensnf.mjs.map} +1 -1
- package/dist/{components-v4U4DT2y.mjs → components-DJbo1z0S.mjs} +1 -1
- package/dist/{components-v4U4DT2y.mjs.map → components-DJbo1z0S.mjs.map} +1 -1
- package/dist/{config-DrfghTPe.d.mts → config-B9eZ340f.d.mts} +1 -1
- package/dist/{config-DrfghTPe.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-CP-SeXNa.mjs → content-DjvM0T92.mjs} +84 -44
- package/dist/content-DjvM0T92.mjs.map +1 -0
- package/dist/{content-list-query-BhejKVqb.d.mts → content-list-query-Btqd4uV2.d.mts} +1 -1
- package/dist/{content-list-query-BhejKVqb.d.mts.map → content-list-query-Btqd4uV2.d.mts.map} +1 -1
- package/dist/{content-refresh-DLOfIhYc.mjs → content-refresh-Bwp-8yGy.mjs} +48 -21
- package/dist/content-refresh-Bwp-8yGy.mjs.map +1 -0
- package/dist/{content-repair-BCxzy0r4.mjs → content-repair-Czdp7jz5.mjs} +4 -4
- package/dist/{content-repair-BCxzy0r4.mjs.map → content-repair-Czdp7jz5.mjs.map} +1 -1
- package/dist/{context-BR5hRWiK.mjs → context-CX6gxOLW.mjs} +52 -17
- package/dist/context-CX6gxOLW.mjs.map +1 -0
- package/dist/{cron-CWfWrWKG.mjs → cron-C6o7VppJ.mjs} +1 -1
- package/dist/{cron-CWfWrWKG.mjs.map → cron-C6o7VppJ.mjs.map} +1 -1
- package/dist/{dashboard-CkIV2rnQ.mjs → dashboard-C2kTeeRI.mjs} +4 -4
- package/dist/{dashboard-CkIV2rnQ.mjs.map → dashboard-C2kTeeRI.mjs.map} +1 -1
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +1 -1
- 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 +1 -1
- package/dist/{default-YMEfcQUx.mjs → default-Clra32mw.mjs} +1 -1
- package/dist/{default-YMEfcQUx.mjs.map → default-Clra32mw.mjs.map} +1 -1
- package/dist/{deferred-tasks-DfqxH5Xf.d.mts → deferred-tasks-CvDETTJO.d.mts} +1 -1
- package/dist/{deferred-tasks-DfqxH5Xf.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-CojjSBwb.mjs → device-flow-D2oCWvLJ.mjs} +4 -4
- package/dist/{device-flow-CojjSBwb.mjs.map → device-flow-D2oCWvLJ.mjs.map} +1 -1
- package/dist/{direct-executor-BWeWiRYB.mjs → direct-executor-Bfa5_ToE.mjs} +3 -3
- package/dist/{direct-executor-BWeWiRYB.mjs.map → direct-executor-Bfa5_ToE.mjs.map} +1 -1
- package/dist/{email-console-CEJgR_LB.mjs → email-console-Dzb6uGYa.mjs} +1 -1
- package/dist/{email-console-CEJgR_LB.mjs.map → email-console-Dzb6uGYa.mjs.map} +1 -1
- package/dist/{error-D9w94fjV.mjs → error-DFrQjppn.mjs} +2 -2
- package/dist/{error-D9w94fjV.mjs.map → error-DFrQjppn.mjs.map} +1 -1
- package/dist/{errors-n2j49uNf.mjs → errors-DsVoDUjJ.mjs} +3 -1
- package/dist/errors-DsVoDUjJ.mjs.map +1 -0
- package/dist/{escape-DN4Qmjsl.mjs → escape-HmHTC1Is.mjs} +1 -1
- package/dist/{escape-DN4Qmjsl.mjs.map → escape-HmHTC1Is.mjs.map} +1 -1
- package/dist/{field-defs-cache-Bh4q6oar.mjs → field-defs-cache-BM4SIRqH.mjs} +2 -2
- package/dist/{field-defs-cache-Bh4q6oar.mjs.map → field-defs-cache-BM4SIRqH.mjs.map} +1 -1
- package/dist/{fts-manager-BhOdW0bi.mjs → fts-manager-Do1BlW2r.mjs} +2 -2
- package/dist/{fts-manager-BhOdW0bi.mjs.map → fts-manager-Do1BlW2r.mjs.map} +1 -1
- package/dist/{hash-CTcngWvj.mjs → hash-3JJPlHF2.mjs} +1 -1
- package/dist/{hash-CTcngWvj.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-7pTHsLZJ.d.mts → hreflang-B6hbAuuO.d.mts} +2 -2
- package/dist/{hreflang-7pTHsLZJ.d.mts.map → hreflang-B6hbAuuO.d.mts.map} +1 -1
- package/dist/{hreflang-Huc6O5wa.mjs → hreflang-DQbPZliA.mjs} +6 -6
- package/dist/{hreflang-Huc6O5wa.mjs.map → hreflang-DQbPZliA.mjs.map} +1 -1
- package/dist/{identity-DXmb4aVp.mjs → identity-DksvEazf.mjs} +3 -3
- package/dist/{identity-DXmb4aVp.mjs.map → identity-DksvEazf.mjs.map} +1 -1
- package/dist/{import-C4_O3KXU.mjs → import-CJpaBBBT.mjs} +5 -5
- package/dist/{import-C4_O3KXU.mjs.map → import-CJpaBBBT.mjs.map} +1 -1
- package/dist/{index-DWbJrsAg.d.mts → index-BJNMCWmu.d.mts} +158 -49
- package/dist/index-BJNMCWmu.d.mts.map +1 -0
- package/dist/{index-6bRee8zb.d.mts → index-Du8K7bWa.d.mts} +3 -3
- package/dist/{index-6bRee8zb.d.mts.map → index-Du8K7bWa.d.mts.map} +1 -1
- package/dist/index.d.mts +22 -21
- package/dist/index.mjs +70 -70
- package/dist/{load-Bo7fZAbg.mjs → load-CawHjTOH.mjs} +2 -2
- package/dist/{load-Bo7fZAbg.mjs.map → load-CawHjTOH.mjs.map} +1 -1
- package/dist/{loader-ZsjE4paL.mjs → loader-Z8vl7zTq.mjs} +48 -13
- package/dist/loader-Z8vl7zTq.mjs.map +1 -0
- package/dist/{manifest-builder-QXuqvVMP.mjs → manifest-builder-COtzuca2.mjs} +2 -2
- package/dist/{manifest-builder-QXuqvVMP.mjs.map → manifest-builder-COtzuca2.mjs.map} +1 -1
- package/dist/{manifest-schema-CUYPfCEH.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 +1 -1
- package/dist/media/local-runtime.d.mts +12 -12
- package/dist/media/local-runtime.mjs +4 -4
- package/dist/{media-D6SeAfBl.mjs → media-BBm8Wg3f.mjs} +30 -2
- package/dist/media-BBm8Wg3f.mjs.map +1 -0
- package/dist/{media-BjwNuLEu.mjs → media-BHjus86Y.mjs} +35 -5
- package/dist/media-BHjus86Y.mjs.map +1 -0
- package/dist/{media-allowlist-D35v7bmL.mjs → media-allowlist-CoTBWoDp.mjs} +1 -1
- package/dist/{media-allowlist-D35v7bmL.mjs.map → media-allowlist-CoTBWoDp.mjs.map} +1 -1
- package/dist/{media-folders-D-0CmRZj.mjs → media-folders-BGkATs8n.mjs} +1 -1
- package/dist/{media-folders-D-0CmRZj.mjs.map → media-folders-BGkATs8n.mjs.map} +1 -1
- package/dist/{media-upload-C7bLXGcI.mjs → media-upload-BCidR-EY.mjs} +6 -6
- package/dist/{media-upload-C7bLXGcI.mjs.map → media-upload-BCidR-EY.mjs.map} +1 -1
- package/dist/{media-url-DH7giMx_.mjs → media-url-DHoPr0hq.mjs} +1 -1
- package/dist/{media-url-DH7giMx_.mjs.map → media-url-DHoPr0hq.mjs.map} +1 -1
- package/dist/{media-usage-BTRJvS6V.mjs → media-usage-CdY5jhSR.mjs} +8 -8
- package/dist/{media-usage-BTRJvS6V.mjs.map → media-usage-CdY5jhSR.mjs.map} +1 -1
- package/dist/{media-usage-activation-Dx0kPV6b.mjs → media-usage-activation-BgeMtK5C.mjs} +2 -2
- package/dist/{media-usage-activation-Dx0kPV6b.mjs.map → media-usage-activation-BgeMtK5C.mjs.map} +1 -1
- package/dist/{media-usage-work-DWb2XPMI.mjs → media-usage-work-CnGCdHxx.mjs} +4 -4
- package/dist/{media-usage-work-DWb2XPMI.mjs.map → media-usage-work-CnGCdHxx.mjs.map} +1 -1
- package/dist/{media-usage-work-C-fhM30c.mjs → media-usage-work-D6D9sMCA.mjs} +1 -1
- package/dist/{media-usage-work-C-fhM30c.mjs.map → media-usage-work-D6D9sMCA.mjs.map} +1 -1
- package/dist/{media-usage-write-fence-BwoJVRDC.mjs → media-usage-write-fence-hjeD4u7s.mjs} +2 -2
- package/dist/{media-usage-write-fence-BwoJVRDC.mjs.map → media-usage-write-fence-hjeD4u7s.mjs.map} +1 -1
- package/dist/{menus-CNg0QlDt.mjs → menus-6qSwTNxG.mjs} +346 -94
- package/dist/menus-6qSwTNxG.mjs.map +1 -0
- package/dist/{menus-CD7EFLwz.mjs → menus-uvPLXMZf.mjs} +3 -3
- package/dist/{menus-CD7EFLwz.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/{mode-DaUM_MB2.mjs → mode-DN_WneRx.mjs} +1 -1
- package/dist/{mode-DaUM_MB2.mjs.map → mode-DN_WneRx.mjs.map} +1 -1
- package/dist/{node-sqlite-compat-Udb4Y-rs.mjs → node-sqlite-compat-BuJXIeMz.mjs} +1 -1
- package/dist/{node-sqlite-compat-Udb4Y-rs.mjs.map → node-sqlite-compat-BuJXIeMz.mjs.map} +1 -1
- package/dist/{normalize-CSxdKBVa.mjs → normalize-C2xNjTSG.mjs} +15 -5
- package/dist/normalize-C2xNjTSG.mjs.map +1 -0
- package/dist/{oauth-authorization-Dpsb-fMJ.mjs → oauth-authorization-Dj6Kwc21.mjs} +4 -4
- package/dist/{oauth-authorization-Dpsb-fMJ.mjs.map → oauth-authorization-Dj6Kwc21.mjs.map} +1 -1
- package/dist/{oauth-clients-Bxnoe_67.mjs → oauth-clients-FD7I0J8m.mjs} +1 -1
- package/dist/{oauth-clients-Bxnoe_67.mjs.map → oauth-clients-FD7I0J8m.mjs.map} +1 -1
- package/dist/{oauth-state-store-0C4s0K6w.mjs → oauth-state-store-DkmDOmHs.mjs} +1 -1
- package/dist/{oauth-state-store-0C4s0K6w.mjs.map → oauth-state-store-DkmDOmHs.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-wlGYSeqX.mjs → oauth-user-lookup-CvIwGpYd.mjs} +1 -1
- package/dist/{oauth-user-lookup-wlGYSeqX.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-BhZIeFY1.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-BRJg1kz8.mjs → parse-Ckpg-Qfp.mjs} +2 -2
- package/dist/{parse-BRJg1kz8.mjs.map → parse-Ckpg-Qfp.mjs.map} +1 -1
- package/dist/{passkey-config-B3P0nHRR.mjs → passkey-config-O_lj3y0k.mjs} +1 -1
- package/dist/{passkey-config-B3P0nHRR.mjs.map → passkey-config-O_lj3y0k.mjs.map} +1 -1
- package/dist/{placeholder-BR4ZhVJl.d.mts → placeholder-4X9BrRrp.d.mts} +1 -1
- package/dist/{placeholder-BR4ZhVJl.d.mts.map → placeholder-4X9BrRrp.d.mts.map} +1 -1
- package/dist/plugin-types.d.mts +8 -3
- package/dist/plugin-types.d.mts.map +1 -1
- package/dist/plugin-utils.d.mts +10 -10
- package/dist/plugins/adapt-sandbox-entry.d.mts +10 -10
- package/dist/plugins/adapt-sandbox-entry.mjs +2 -2
- package/dist/{policy-BVRganJQ.mjs → policy-Dhtwntrt.mjs} +2 -2
- package/dist/{policy-BVRganJQ.mjs.map → policy-Dhtwntrt.mjs.map} +1 -1
- package/dist/{portable-text-C8Tvp4_g.mjs → portable-text-U85hOafW.mjs} +1 -1
- package/dist/{portable-text-C8Tvp4_g.mjs.map → portable-text-U85hOafW.mjs.map} +1 -1
- package/dist/{preview-dn2dUyM0.mjs → preview-B_vJLvf8.mjs} +2 -2
- package/dist/{preview-dn2dUyM0.mjs.map → preview-B_vJLvf8.mjs.map} +1 -1
- package/dist/{protocol-CuBEsqgE.d.mts → protocol-JdD2YhY9.d.mts} +2 -2
- package/dist/{protocol-CuBEsqgE.d.mts.map → protocol-JdD2YhY9.d.mts.map} +1 -1
- package/dist/{public-url-DRz_AinV.mjs → public-url-CarhZJgf.mjs} +1 -1
- package/dist/{public-url-DRz_AinV.mjs.map → public-url-CarhZJgf.mjs.map} +1 -1
- package/dist/{query-D18vTdha.mjs → query-BZKZcG5b.mjs} +14 -14
- package/dist/{query-D18vTdha.mjs.map → query-BZKZcG5b.mjs.map} +1 -1
- package/dist/{query-tZDEdtCN.mjs → query-BndaFxxp.mjs} +4 -4
- package/dist/{query-tZDEdtCN.mjs.map → query-BndaFxxp.mjs.map} +1 -1
- package/dist/{rate-limit-on7KPo-v.mjs → rate-limit-BZmATC6W.mjs} +2 -2
- package/dist/{rate-limit-on7KPo-v.mjs.map → rate-limit-BZmATC6W.mjs.map} +1 -1
- package/dist/{redirect-DrbEmU9a.mjs → redirect-CzqnLxK-.mjs} +1 -1
- package/dist/{redirect-DrbEmU9a.mjs.map → redirect-CzqnLxK-.mjs.map} +1 -1
- package/dist/{redirects-CRIM55KH.mjs → redirects-BLNOWQTn.mjs} +63 -28
- package/dist/redirects-BLNOWQTn.mjs.map +1 -0
- package/dist/{redirects-BahWiu8Z.mjs → redirects-CqzNM0KM.mjs} +2 -2
- package/dist/{redirects-BahWiu8Z.mjs.map → redirects-CqzNM0KM.mjs.map} +1 -1
- package/dist/{registry-Cx-jEJOS.mjs → registry-AZAsRsor.mjs} +27 -9
- package/dist/registry-AZAsRsor.mjs.map +1 -0
- package/dist/{relation-A6wLF_DS.mjs → relation-04DfKRTO.mjs} +2 -2
- package/dist/{relation-A6wLF_DS.mjs.map → relation-04DfKRTO.mjs.map} +1 -1
- package/dist/{relations-BTPM2saV.mjs → relations-C4htk5sb.mjs} +7 -7
- package/dist/relations-C4htk5sb.mjs.map +1 -0
- package/dist/{relations-Cj5hZ6Zg.mjs → relations-CcFwDJdJ.mjs} +4 -4
- package/dist/{relations-Cj5hZ6Zg.mjs.map → relations-CcFwDJdJ.mjs.map} +1 -1
- package/dist/{relations-C7B46bcU.d.mts → relations-DnRK4YIT.d.mts} +175 -41
- package/dist/relations-DnRK4YIT.d.mts.map +1 -0
- package/dist/request-context.d.mts +1 -1
- package/dist/{request-meta-DRp5ENd_.mjs → request-meta-DYxLlnmz.mjs} +2 -2
- package/dist/{request-meta-DRp5ENd_.mjs.map → request-meta-DYxLlnmz.mjs.map} +1 -1
- package/dist/{resolve-DxUpTMmE.mjs → resolve-prZ3mP7l.mjs} +1 -1
- package/dist/{resolve-DxUpTMmE.mjs.map → resolve-prZ3mP7l.mjs.map} +1 -1
- package/dist/{runner-77GOZCnH.mjs → runner-BLIDKpmA.mjs} +351 -294
- package/dist/runner-BLIDKpmA.mjs.map +1 -0
- package/dist/{runner-zgqA_CqP.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-BY-oVntF.mjs → schema-CGnBeLiW.mjs} +3 -3
- package/dist/{schema-BY-oVntF.mjs.map → schema-CGnBeLiW.mjs.map} +1 -1
- package/dist/{schema-Cw9kVK0I.mjs → schema-DYr-Vd-L.mjs} +5 -5
- package/dist/{schema-Cw9kVK0I.mjs.map → schema-DYr-Vd-L.mjs.map} +1 -1
- package/dist/{scopes-vMR1uIbt.mjs → scopes-BhWvBavj.mjs} +3 -3
- package/dist/{scopes-vMR1uIbt.mjs.map → scopes-BhWvBavj.mjs.map} +1 -1
- package/dist/{search-CfT3KxO5.mjs → search-C-qDk4kx.mjs} +4 -4
- package/dist/{search-CfT3KxO5.mjs.map → search-C-qDk4kx.mjs.map} +1 -1
- package/dist/{secrets-BH2Qow1-.mjs → secrets-rEtHt-6z.mjs} +1 -1
- package/dist/{secrets-BH2Qow1-.mjs.map → secrets-rEtHt-6z.mjs.map} +1 -1
- package/dist/{sections-DTfjyf1z.mjs → sections-B_nYvlwn.mjs} +2 -2
- package/dist/{sections-DTfjyf1z.mjs.map → sections-B_nYvlwn.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +18 -18
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.mjs +13 -13
- package/dist/{seo-Cm-dtvgk.mjs → seo-926NRIgt.mjs} +3 -3
- package/dist/{seo-Cm-dtvgk.mjs.map → seo-926NRIgt.mjs.map} +1 -1
- package/dist/{seo-BSiTIXzd.mjs → seo-CVWkdv6x.mjs} +1 -1
- package/dist/{seo-BSiTIXzd.mjs.map → seo-CVWkdv6x.mjs.map} +1 -1
- package/dist/{service-DYsDHEKe.mjs → service-CJl3ZAYs.mjs} +3 -3
- package/dist/{service-DYsDHEKe.mjs.map → service-CJl3ZAYs.mjs.map} +1 -1
- package/dist/{session-user-CNAfvsdw.mjs → session-user-BlMgqCHS.mjs} +1 -1
- package/dist/{session-user-CNAfvsdw.mjs.map → session-user-BlMgqCHS.mjs.map} +1 -1
- package/dist/{settings-BgN-0DT-.mjs → settings--wobrkkC.mjs} +18 -5
- package/dist/settings--wobrkkC.mjs.map +1 -0
- package/dist/{settings-DjtkUo__.mjs → settings-Cwm6o2jY.mjs} +3 -3
- package/dist/{settings-DjtkUo__.mjs.map → settings-Cwm6o2jY.mjs.map} +1 -1
- package/dist/{setup-complete-CcpXaPU7.mjs → setup-complete-DQbClIN2.mjs} +1 -1
- package/dist/{setup-complete-CcpXaPU7.mjs.map → setup-complete-DQbClIN2.mjs.map} +1 -1
- package/dist/{setup-nonce-Reyw30jg.mjs → setup-nonce-DZCFS2sn.mjs} +1 -1
- package/dist/{setup-nonce-Reyw30jg.mjs.map → setup-nonce-DZCFS2sn.mjs.map} +1 -1
- package/dist/{site-url-Cs_V9n3V.mjs → site-url-BrxA_E9H.mjs} +2 -2
- package/dist/{site-url-Cs_V9n3V.mjs.map → site-url-BrxA_E9H.mjs.map} +1 -1
- package/dist/{snapshot-DSB8P7Lm.mjs → snapshot--OCDTqdb.mjs} +1 -1
- package/dist/{snapshot-DSB8P7Lm.mjs.map → snapshot--OCDTqdb.mjs.map} +1 -1
- package/dist/{ssrf-DqebVE34.mjs → ssrf-5sIM5jzl.mjs} +4 -3
- package/dist/{ssrf-DqebVE34.mjs.map → ssrf-5sIM5jzl.mjs.map} +1 -1
- package/dist/{state-BJfU9Uzw.mjs → state-BpFVsJZB.mjs} +1 -1
- package/dist/{state-BJfU9Uzw.mjs.map → state-BpFVsJZB.mjs.map} +1 -1
- package/dist/{status-DDu8HIQl.mjs → status-B777-dXz.mjs} +1 -1
- package/dist/{status-DDu8HIQl.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-D0o26Azo.mjs → target-BmR0iTwz.mjs} +1 -1
- package/dist/{target-D0o26Azo.mjs.map → target-BmR0iTwz.mjs.map} +1 -1
- package/dist/{taxonomies-CPGxo-bn.mjs → taxonomies-DkAkMupr.mjs} +16 -13
- package/dist/taxonomies-DkAkMupr.mjs.map +1 -0
- package/dist/{taxonomies-kmyudNGP.mjs → taxonomies-Wfy_Lg12.mjs} +42 -16
- package/dist/taxonomies-Wfy_Lg12.mjs.map +1 -0
- package/dist/{taxonomy-8X09dLN5.mjs → taxonomy-tJepplLL.mjs} +4 -4
- package/dist/{taxonomy-8X09dLN5.mjs.map → taxonomy-tJepplLL.mjs.map} +1 -1
- package/dist/{tokens-gTS-IVUp.mjs → tokens-BCO1oruF.mjs} +1 -1
- package/dist/{tokens-gTS-IVUp.mjs.map → tokens-BCO1oruF.mjs.map} +1 -1
- package/dist/{transport-fX59xaJz.mjs → transport-Dr3qtwXC.mjs} +1 -1
- package/dist/{transport-fX59xaJz.mjs.map → transport-Dr3qtwXC.mjs.map} +1 -1
- package/dist/{transport-_6R1ub7t.d.mts → transport-xh6YKW2G.d.mts} +1 -1
- package/dist/{transport-_6R1ub7t.d.mts.map → transport-xh6YKW2G.d.mts.map} +1 -1
- package/dist/{trusted-proxy-fe6nEgR4.mjs → trusted-proxy-BR5F1Otp.mjs} +1 -1
- package/dist/{trusted-proxy-fe6nEgR4.mjs.map → trusted-proxy-BR5F1Otp.mjs.map} +1 -1
- package/dist/{types-BXUmsINL.mjs → types-3qNFPlci.mjs} +1 -1
- package/dist/{types-BXUmsINL.mjs.map → types-3qNFPlci.mjs.map} +1 -1
- package/dist/{types-Vg6f5i3s.d.mts → types-B6GrPic4.d.mts} +9 -3
- package/dist/{types-Vg6f5i3s.d.mts.map → types-B6GrPic4.d.mts.map} +1 -1
- package/dist/{types-DJQxln7q.d.mts → types-BuHW4xDE.d.mts} +11 -10
- package/dist/types-BuHW4xDE.d.mts.map +1 -0
- package/dist/{types-BzBd3PeX.d.mts → types-C00oyCZp.d.mts} +1 -1
- package/dist/{types-BzBd3PeX.d.mts.map → types-C00oyCZp.d.mts.map} +1 -1
- package/dist/{types-Blb-MRC3.d.mts → types-CDtkNSFQ.d.mts} +1 -1
- package/dist/{types-Blb-MRC3.d.mts.map → types-CDtkNSFQ.d.mts.map} +1 -1
- package/dist/{types-D5VVLr7J.d.mts → types-CPeXo1wF.d.mts} +1 -1
- package/dist/{types-D5VVLr7J.d.mts.map → types-CPeXo1wF.d.mts.map} +1 -1
- package/dist/types-CQPWhPxE.mjs.map +1 -1
- package/dist/{types-D_DWe7k9.d.mts → types-CXFkwEGC.d.mts} +3 -2
- package/dist/types-CXFkwEGC.d.mts.map +1 -0
- package/dist/{types-CLqvnd05.d.mts → types-DczELMop.d.mts} +1 -1
- package/dist/{types-CLqvnd05.d.mts.map → types-DczELMop.d.mts.map} +1 -1
- package/dist/types-DfuTR6dL.mjs +3 -0
- package/dist/{types-DHxzBjbD.d.mts → types-FV23hEoW.d.mts} +1 -1
- package/dist/{types-DHxzBjbD.d.mts.map → types-FV23hEoW.d.mts.map} +1 -1
- package/dist/{types-Br-ERaxh.d.mts → types-xDMtUFnO.d.mts} +1 -1
- package/dist/{types-Br-ERaxh.d.mts.map → types-xDMtUFnO.d.mts.map} +1 -1
- package/dist/{upload-attempts-CNyGSepg.mjs → upload-attempts-BsqoQ1fn.mjs} +1 -1
- package/dist/{upload-attempts-CNyGSepg.mjs.map → upload-attempts-BsqoQ1fn.mjs.map} +1 -1
- package/dist/{url-pattern-K-KdXcSe.mjs → url-pattern-D4c2czpJ.mjs} +1 -1
- package/dist/{url-pattern-K-KdXcSe.mjs.map → url-pattern-D4c2czpJ.mjs.map} +1 -1
- package/dist/{user-CtYY0tp2.mjs → user-BTZ40aq6.mjs} +2 -2
- package/dist/{user-CtYY0tp2.mjs.map → user-BTZ40aq6.mjs.map} +1 -1
- package/dist/{utils-HztC73hq.mjs → utils-BKvNjjhY.mjs} +1 -1
- package/dist/{utils-HztC73hq.mjs.map → utils-BKvNjjhY.mjs.map} +1 -1
- package/dist/{validate-Dd-IUjnZ.mjs → validate-DE_LRwo9.mjs} +2 -2
- package/dist/{validate-Dd-IUjnZ.mjs.map → validate-DE_LRwo9.mjs.map} +1 -1
- package/dist/{validate-DlqdOZXB.d.mts → validate-DUP27OYD.d.mts} +5 -5
- package/dist/{validate-DlqdOZXB.d.mts.map → validate-DUP27OYD.d.mts.map} +1 -1
- package/dist/{validation-D83n7Npi.mjs → validation-BMImFJ11.mjs} +8 -8
- package/dist/{validation-D83n7Npi.mjs.map → validation-BMImFJ11.mjs.map} +1 -1
- package/dist/version-Bii3suaO.mjs +7 -0
- package/dist/{version-ri-sCyAp.mjs.map → version-Bii3suaO.mjs.map} +1 -1
- package/dist/{widgets-CpmZd9Q-.mjs → widgets-D3gJ10xU.mjs} +17 -4
- package/dist/widgets-D3gJ10xU.mjs.map +1 -0
- package/dist/{wxr-taxonomies-BFd0y72_.d.mts → wxr-taxonomies-B2Og_6rU.d.mts} +1 -1
- package/dist/{wxr-taxonomies-BFd0y72_.d.mts.map → wxr-taxonomies-B2Og_6rU.d.mts.map} +1 -1
- package/dist/{wxr-taxonomies-Df4vxWcU.mjs → wxr-taxonomies-Cxngsjwo.mjs} +4 -4
- package/dist/{wxr-taxonomies-Df4vxWcU.mjs.map → wxr-taxonomies-Cxngsjwo.mjs.map} +1 -1
- package/dist/{zod-generator-DylzusHh.mjs → zod-generator-BuYSQJB7.mjs} +11 -7
- package/dist/zod-generator-BuYSQJB7.mjs.map +1 -0
- package/package.json +12 -9
- package/src/api/errors.ts +2 -0
- package/src/api/handlers/content.ts +49 -11
- package/src/api/handlers/index.ts +1 -0
- package/src/api/handlers/manifest.ts +161 -12
- package/src/api/handlers/media.ts +30 -0
- package/src/api/handlers/registry.ts +393 -289
- package/src/api/handlers/taxonomies.ts +16 -9
- package/src/api/openapi/document.ts +85 -5
- 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.ts +52 -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 +5 -0
- package/src/astro/integration/vite-config.ts +21 -2
- package/src/astro/middleware.ts +5 -0
- package/src/astro/routes/api/admin/api-tokens/index.ts +4 -1
- package/src/astro/routes/api/admin/oauth-clients/[id].ts +1 -1
- package/src/astro/routes/api/admin/oauth-clients/index.ts +1 -1
- package/src/astro/routes/api/admin/plugins/registry/[id]/update.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/artifact.ts +3 -7
- package/src/astro/routes/api/admin/plugins/registry/install.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/verify.ts +60 -0
- package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +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/file/[...key].ts +4 -1
- package/src/astro/routes/api/media/upload-url.ts +8 -4
- package/src/astro/routes/api/media.ts +54 -8
- package/src/astro/routes/api/menus/[name]/items/[id].ts +7 -2
- package/src/astro/routes/api/menus/[name]/items.ts +4 -1
- package/src/astro/routes/api/menus/[name]/reorder.ts +4 -1
- package/src/astro/routes/api/menus/[name]/translations.ts +4 -1
- package/src/astro/routes/api/menus/[name].ts +7 -2
- package/src/astro/routes/api/menus/index.ts +4 -1
- package/src/astro/routes/api/settings/email.ts +1 -1
- package/src/astro/routes/api/settings.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name]/reorder.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name]/terms/[slug]/translations.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name]/terms/[slug].ts +7 -2
- package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name].ts +7 -2
- package/src/astro/routes/api/taxonomies/index.ts +4 -1
- package/src/astro/routes/api/widget-areas/[name]/reorder.ts +3 -1
- package/src/astro/routes/api/widget-areas/[name]/widgets/[id].ts +5 -2
- package/src/astro/routes/api/widget-areas/[name]/widgets.ts +3 -1
- package/src/astro/routes/api/widget-areas/[name].ts +3 -1
- package/src/astro/routes/api/widget-areas/index.ts +3 -1
- package/src/astro/types.ts +23 -5
- 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/components/EmDashImage.astro +2 -1
- package/src/components/EmDashMedia.astro +2 -1
- package/src/components/InlinePortableTextEditor.tsx +6 -1
- package/src/components/widgets/Archives.astro +2 -37
- 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 +1 -0
- package/src/database/migrations/017_authorization_codes.ts +14 -4
- package/src/database/migrations/074_content_deleted_scheduled_index.ts +55 -0
- package/src/database/migrations/runner.ts +3 -1
- package/src/database/repositories/byline.ts +32 -16
- package/src/database/repositories/content.ts +114 -47
- package/src/database/repositories/media-usage.ts +66 -37
- package/src/database/repositories/media.ts +60 -1
- package/src/database/repositories/plugin-storage.ts +74 -9
- package/src/database/repositories/types.ts +8 -7
- package/src/db/adapters.ts +8 -1
- package/src/db/postgres.ts +23 -0
- package/src/emdash-runtime.ts +80 -150
- package/src/fields/boolean.ts +1 -1
- package/src/fields/datetime.ts +1 -1
- package/src/fields/file.ts +1 -1
- package/src/fields/integer.ts +1 -1
- package/src/fields/json.ts +1 -1
- package/src/fields/multiselect.ts +1 -1
- package/src/fields/number.ts +1 -1
- package/src/fields/portable-text.ts +1 -1
- package/src/fields/richtext.ts +1 -1
- package/src/fields/select.ts +1 -1
- package/src/fields/slug.ts +1 -1
- package/src/fields/text.ts +1 -1
- package/src/fields/textarea.ts +1 -1
- package/src/fields/types.ts +2 -2
- package/src/index.ts +25 -3
- package/src/loader.ts +63 -10
- package/src/mcp/server.ts +228 -24
- package/src/media/image-endpoint.ts +5 -2
- package/src/media/normalize.ts +15 -4
- package/src/media/usage/cleanup.ts +9 -8
- 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 +6 -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/types.ts +6 -0
- package/src/registry/artifact-checksum.ts +15 -0
- package/src/registry/artifact-verification.ts +85 -0
- package/src/registry/authoritative-records.ts +180 -0
- package/src/registry/record-labels.ts +28 -0
- package/src/schema/registry.ts +26 -3
- package/src/schema/zod-generator.ts +16 -13
- package/src/security/ssrf.ts +5 -2
- 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/widgets/archives.ts +67 -0
- package/src/widgets/index.ts +16 -0
- package/dist/api-B0w3uBiG.mjs +0 -2269
- package/dist/api-B0w3uBiG.mjs.map +0 -1
- package/dist/byline-Cpnwrje1.mjs.map +0 -1
- package/dist/challenge-store-D5pSY2S1.mjs.map +0 -1
- package/dist/content-CP-SeXNa.mjs.map +0 -1
- package/dist/content-refresh-DLOfIhYc.mjs.map +0 -1
- package/dist/context-BR5hRWiK.mjs.map +0 -1
- package/dist/errors-n2j49uNf.mjs.map +0 -1
- package/dist/index-DWbJrsAg.d.mts.map +0 -1
- package/dist/loader-ZsjE4paL.mjs.map +0 -1
- package/dist/manifest-schema-CUYPfCEH.mjs.map +0 -1
- package/dist/media-BjwNuLEu.mjs.map +0 -1
- package/dist/media-D6SeAfBl.mjs.map +0 -1
- package/dist/menus-CNg0QlDt.mjs.map +0 -1
- package/dist/normalize-CSxdKBVa.mjs.map +0 -1
- package/dist/object-cache-71tPfV4A.mjs.map +0 -1
- package/dist/options-BhZIeFY1.d.mts.map +0 -1
- package/dist/redirects-CRIM55KH.mjs.map +0 -1
- package/dist/registry-BiO5WwPq.mjs +0 -2716
- package/dist/registry-BiO5WwPq.mjs.map +0 -1
- package/dist/registry-Cx-jEJOS.mjs.map +0 -1
- package/dist/relations-BTPM2saV.mjs.map +0 -1
- package/dist/relations-C7B46bcU.d.mts.map +0 -1
- package/dist/runner-77GOZCnH.mjs.map +0 -1
- package/dist/runner-zgqA_CqP.d.mts.map +0 -1
- package/dist/settings-BgN-0DT-.mjs.map +0 -1
- package/dist/taxonomies-CPGxo-bn.mjs.map +0 -1
- package/dist/taxonomies-kmyudNGP.mjs.map +0 -1
- package/dist/types-D6OcIp2P.mjs +0 -3
- package/dist/types-DJQxln7q.d.mts.map +0 -1
- package/dist/types-D_DWe7k9.d.mts.map +0 -1
- package/dist/version-ri-sCyAp.mjs +0 -7
- package/dist/widgets-CpmZd9Q-.mjs.map +0 -1
- package/dist/zod-generator-DylzusHh.mjs.map +0 -1
- /package/dist/{api-tokens-B5NHLNUN.mjs → api-tokens-BfYts-sq.mjs} +0 -0
- /package/dist/{ssrf-BPKzkm6O.mjs → ssrf-Dg3cIT-b.mjs} +0 -0
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
validateOrderByClause,
|
|
17
17
|
getIndexedFields,
|
|
18
18
|
jsonOrderExtract,
|
|
19
|
+
StorageQueryError,
|
|
19
20
|
} from "../../plugins/storage-query.js";
|
|
20
21
|
import type {
|
|
21
22
|
StorageCollection,
|
|
@@ -52,6 +53,19 @@ function rawWhereExpr(sqlText: string, params: unknown[]): RawBuilder<boolean> {
|
|
|
52
53
|
*
|
|
53
54
|
* Implements the StorageCollection interface for a specific plugin and collection.
|
|
54
55
|
*/
|
|
56
|
+
/**
|
|
57
|
+
* Rank a sort expression so NULLs get a deterministic position.
|
|
58
|
+
*
|
|
59
|
+
* A missing key in a schemaless document extracts as NULL, which sorts
|
|
60
|
+
* differently per dialect (SQLite first, Postgres last) and makes every
|
|
61
|
+
* comparison against it UNKNOWN. Sorting on this rank ahead of the value puts
|
|
62
|
+
* NULLs in the same place on both dialects and keeps the seek operands
|
|
63
|
+
* non-NULL.
|
|
64
|
+
*/
|
|
65
|
+
function nullRank(expr: RawBuilder<unknown>): RawBuilder<number> {
|
|
66
|
+
return sql`(case when ${expr} is null then 1 else 0 end)`;
|
|
67
|
+
}
|
|
68
|
+
|
|
55
69
|
export class PluginStorageRepository<T = unknown> implements StorageCollection<T> {
|
|
56
70
|
private indexedFields: Set<string>;
|
|
57
71
|
|
|
@@ -234,24 +248,75 @@ export class PluginStorageRepository<T = unknown> implements StorageCollection<T
|
|
|
234
248
|
query = query.where(rawWhereExpr(whereResult.sql, whereResult.params));
|
|
235
249
|
}
|
|
236
250
|
|
|
251
|
+
const orderEntries = Object.entries(orderBy);
|
|
252
|
+
const orderDirections = new Set(orderEntries.map(([, direction]) => direction));
|
|
253
|
+
const descending = orderEntries.length > 0 && orderEntries[0][1] === "desc";
|
|
254
|
+
|
|
255
|
+
// A missing key in a schemaless document extracts as NULL, and NULL sorts
|
|
256
|
+
// differently per dialect (SQLite first, Postgres last) and makes any
|
|
257
|
+
// comparison against it UNKNOWN. Rank nulls explicitly so both the sort and
|
|
258
|
+
// the seek agree on where they sit, on either dialect, and so no comparison
|
|
259
|
+
// operand is ever NULL.
|
|
260
|
+
const sortExpr = (field: string): RawBuilder<unknown> =>
|
|
261
|
+
sql`${sql.raw(jsonOrderExtract(this.db, field))}`;
|
|
262
|
+
|
|
237
263
|
// Handle cursor-based pagination — throws on invalid cursor.
|
|
238
264
|
if (cursor) {
|
|
239
265
|
const decoded = decodeCursor(cursor);
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
266
|
+
if (orderEntries.length === 0) {
|
|
267
|
+
query = query.where(({ eb }) =>
|
|
268
|
+
eb(sql`(created_at, id)`, ">", sql`(${decoded.orderValue}, ${decoded.id})`),
|
|
269
|
+
);
|
|
270
|
+
} else {
|
|
271
|
+
if (orderDirections.size > 1) {
|
|
272
|
+
throw new StorageQueryError(
|
|
273
|
+
"Cursor pagination requires every orderBy field to share one direction.",
|
|
274
|
+
Object.keys(orderBy).join(", "),
|
|
275
|
+
"Sort every field the same way, or page without a cursor.",
|
|
276
|
+
);
|
|
277
|
+
}
|
|
278
|
+
const op = descending ? sql`<` : sql`>`;
|
|
279
|
+
// The cursor row's sort values, recomputed with the same expression
|
|
280
|
+
// rather than carried in the cursor, so nothing is bound as a literal
|
|
281
|
+
// and neither dialect has to coerce a JSON value to compare it.
|
|
282
|
+
const cursorExpr = (field: string): RawBuilder<unknown> =>
|
|
283
|
+
sql`(select ${sql.raw(jsonOrderExtract(this.db, field))} from _plugin_storage where plugin_id = ${this.pluginId} and collection = ${this.collection} and id = ${decoded.id})`;
|
|
284
|
+
|
|
285
|
+
const fields = orderEntries.map(([field]) => {
|
|
286
|
+
const own = sortExpr(field);
|
|
287
|
+
const theirs = cursorExpr(field);
|
|
288
|
+
return {
|
|
289
|
+
equal: sql`(${nullRank(own)} = ${nullRank(theirs)} and (${nullRank(own)} = 1 or ${own} = ${theirs}))`,
|
|
290
|
+
after: sql`(${nullRank(own)} ${op} ${nullRank(theirs)} or (${nullRank(own)} = ${nullRank(theirs)} and ${nullRank(own)} = 0 and ${own} ${op} ${theirs}))`,
|
|
291
|
+
};
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
// Lexicographic seek: ties on every earlier field, then strictly after
|
|
295
|
+
// on this one; finally all fields tied and strictly after on id.
|
|
296
|
+
const terms = fields.map(
|
|
297
|
+
(_, k) =>
|
|
298
|
+
sql`(${sql.join([...fields.slice(0, k).map((f) => f.equal), fields[k].after], sql` and `)})`,
|
|
299
|
+
);
|
|
300
|
+
terms.push(
|
|
301
|
+
sql`(${sql.join([...fields.map((f) => f.equal), sql`id ${op} ${decoded.id}`], sql` and `)})`,
|
|
302
|
+
);
|
|
303
|
+
query = query.where(sql<boolean>`(${sql.join(terms, sql` or `)})`);
|
|
304
|
+
}
|
|
243
305
|
}
|
|
244
306
|
|
|
245
307
|
// Build ORDER BY using sql template
|
|
246
|
-
if (
|
|
247
|
-
for (const [field, direction] of
|
|
308
|
+
if (orderEntries.length > 0) {
|
|
309
|
+
for (const [field, direction] of orderEntries) {
|
|
310
|
+
const dir = direction === "desc" ? sql`desc` : sql`asc`;
|
|
311
|
+
const expr = sortExpr(field);
|
|
312
|
+
// Null rank first so NULL placement is identical on both dialects.
|
|
313
|
+
query = query.orderBy(sql`${nullRank(expr)} ${dir}`);
|
|
248
314
|
// Order over the jsonb-native value on Postgres so numeric fields sort
|
|
249
315
|
// numerically, not lexically. See pluginDataOrderExpr.
|
|
250
|
-
|
|
251
|
-
const orderExpr =
|
|
252
|
-
direction === "desc" ? sql`${sql.raw(extract)} desc` : sql`${sql.raw(extract)} asc`;
|
|
253
|
-
query = query.orderBy(orderExpr);
|
|
316
|
+
query = query.orderBy(sql`${expr} ${dir}`);
|
|
254
317
|
}
|
|
318
|
+
// Total order, so a page boundary can never fall inside a group of ties.
|
|
319
|
+
query = query.orderBy("id", descending ? "desc" : "asc");
|
|
255
320
|
} else {
|
|
256
321
|
// Default ordering for consistent pagination
|
|
257
322
|
query = query.orderBy("created_at", "asc").orderBy("id", "asc");
|
|
@@ -64,13 +64,14 @@ export interface BylineSummary {
|
|
|
64
64
|
avatarMediaId: string | null;
|
|
65
65
|
/**
|
|
66
66
|
* The avatar media's storage key, folded in by a LEFT JOIN on the
|
|
67
|
-
* `media` table
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
* `
|
|
71
|
-
*
|
|
67
|
+
* `media` table. Populated by the content-credit hydration path
|
|
68
|
+
* (`getContentBylines` / `getContentBylinesMany`, i.e. the
|
|
69
|
+
* `entry.data.bylines` populated by `getEmDashCollection` /
|
|
70
|
+
* `getEmDashEntry`) and by the single-row finders (`findById`,
|
|
71
|
+
* `findBySlug`, `findByUserId`, `findByUserIds`). `findMany` doesn't
|
|
72
|
+
* join media, so it leaves this null.
|
|
72
73
|
*
|
|
73
|
-
* Lets
|
|
74
|
+
* Lets a page build a direct storage URL for an author avatar without a
|
|
74
75
|
* per-byline `MediaRepository.findById`, avoiding an N+1 when many distinct
|
|
75
76
|
* authors appear on one page.
|
|
76
77
|
*
|
|
@@ -86,7 +87,7 @@ export interface BylineSummary {
|
|
|
86
87
|
* same media join as `avatarStorageKey`. Lets a renderer paint a blurred
|
|
87
88
|
* placeholder while the full avatar loads, with no extra media lookup.
|
|
88
89
|
* Null when the byline has no avatar, the media row has no blurhash, or the
|
|
89
|
-
* byline
|
|
90
|
+
* byline came from `findMany`, which doesn't join media.
|
|
90
91
|
*/
|
|
91
92
|
avatarBlurhash?: string | null;
|
|
92
93
|
/**
|
package/src/db/adapters.ts
CHANGED
|
@@ -199,7 +199,14 @@ export interface PostgresConfig {
|
|
|
199
199
|
user?: string;
|
|
200
200
|
password?: string;
|
|
201
201
|
ssl?: boolean;
|
|
202
|
-
pool?: {
|
|
202
|
+
pool?: {
|
|
203
|
+
min?: number;
|
|
204
|
+
max?: number;
|
|
205
|
+
/** Maximum time to wait for a connection, in milliseconds. Uses the pg default when omitted. */
|
|
206
|
+
connectionTimeoutMillis?: number;
|
|
207
|
+
/** Time before an idle client is closed, in milliseconds. Uses the pg default when omitted. */
|
|
208
|
+
idleTimeoutMillis?: number;
|
|
209
|
+
};
|
|
203
210
|
migrationConnectionStringEnv?: string;
|
|
204
211
|
}
|
|
205
212
|
|
package/src/db/postgres.ts
CHANGED
|
@@ -11,6 +11,26 @@ import { Pool } from "pg";
|
|
|
11
11
|
import { FailFastPostgresDialect } from "../database/pg-migration-lock.js";
|
|
12
12
|
import type { PostgresConfig } from "./adapters.js";
|
|
13
13
|
|
|
14
|
+
const URL_PATTERN = /[A-Za-z][A-Za-z0-9+.-]*:\/\/\S+/g;
|
|
15
|
+
const CREDENTIAL_PATTERN = /\b(auth|credential|key|password|secret|signature|token)\s*[=:]\s*\S+/gi;
|
|
16
|
+
const ERROR_CODE_PATTERN = /^[A-Za-z0-9_-]{1,32}$/;
|
|
17
|
+
|
|
18
|
+
function redactPoolErrorMessage(message: string): string {
|
|
19
|
+
return message
|
|
20
|
+
.replace(URL_PATTERN, "[REDACTED_URL]")
|
|
21
|
+
.replace(CREDENTIAL_PATTERN, "$1=[REDACTED]")
|
|
22
|
+
.replaceAll(/[\r\n\t]/g, " ")
|
|
23
|
+
.slice(0, 1_000);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function logPoolError(error: Error): void {
|
|
27
|
+
// pg attaches the failed client to this error, which can contain connection credentials.
|
|
28
|
+
const code = "code" in error && typeof error.code === "string" ? error.code : undefined;
|
|
29
|
+
const safeCode = code && ERROR_CODE_PATTERN.test(code) ? ` (${code})` : "";
|
|
30
|
+
const message = redactPoolErrorMessage(error.message) || "Unknown error";
|
|
31
|
+
console.error(`[emdash] PostgreSQL idle client error${safeCode}: ${message}`);
|
|
32
|
+
}
|
|
33
|
+
|
|
14
34
|
/**
|
|
15
35
|
* Create a PostgreSQL dialect from config
|
|
16
36
|
*/
|
|
@@ -25,7 +45,10 @@ export function createDialect(config: PostgresConfig): PostgresDialect {
|
|
|
25
45
|
ssl: config.ssl,
|
|
26
46
|
min: config.pool?.min ?? 0,
|
|
27
47
|
max: config.pool?.max ?? 10,
|
|
48
|
+
connectionTimeoutMillis: config.pool?.connectionTimeoutMillis,
|
|
49
|
+
idleTimeoutMillis: config.pool?.idleTimeoutMillis,
|
|
28
50
|
});
|
|
51
|
+
pool.on("error", logPoolError);
|
|
29
52
|
|
|
30
53
|
// Fail-fast migration locking instead of Kysely's blocking advisory
|
|
31
54
|
// lock — see pg-migration-lock.ts (#1744).
|
package/src/emdash-runtime.ts
CHANGED
|
@@ -14,6 +14,7 @@ import virtualConfig from "virtual:emdash/config";
|
|
|
14
14
|
import { z } from "zod";
|
|
15
15
|
|
|
16
16
|
import { ErrorCode } from "./api/errors.js";
|
|
17
|
+
import { buildManifestCollections } from "./api/handlers/manifest.js";
|
|
17
18
|
import { assertMediaUsageActivationWriteAllowed } from "./api/media-usage-write-fence.js";
|
|
18
19
|
import { validateRev } from "./api/rev.js";
|
|
19
20
|
import type {
|
|
@@ -21,7 +22,7 @@ import type {
|
|
|
21
22
|
PluginAdminPage,
|
|
22
23
|
PluginDashboardWidget,
|
|
23
24
|
} from "./astro/integration/runtime.js";
|
|
24
|
-
import type { EmDashManifest
|
|
25
|
+
import type { EmDashManifest } from "./astro/types.js";
|
|
25
26
|
import { getAuthMode } from "./auth/mode.js";
|
|
26
27
|
import { getTrustedProxyHeaders } from "./auth/trusted-proxy.js";
|
|
27
28
|
import type { ContentFieldFilters } from "./content-list-query.js";
|
|
@@ -58,6 +59,7 @@ import {
|
|
|
58
59
|
refreshContentMediaUsageAfterWrite,
|
|
59
60
|
} from "./media/usage/content-refresh.js";
|
|
60
61
|
import { processMediaUsageWorkAfterWrite } from "./media/usage/work-processor.js";
|
|
62
|
+
import { inspectSandboxHookResult } from "./plugins/sandbox/hook-result.js";
|
|
61
63
|
import { createSandboxRunnerOptions } from "./plugins/sandbox/runner-options.js";
|
|
62
64
|
import { getSandboxRouteErrorDetails } from "./plugins/sandbox/types.js";
|
|
63
65
|
import type {
|
|
@@ -66,6 +68,7 @@ import type {
|
|
|
66
68
|
SandboxRunnerFactory,
|
|
67
69
|
} from "./plugins/sandbox/types.js";
|
|
68
70
|
import type {
|
|
71
|
+
ContentHookEvent,
|
|
69
72
|
ResolvedPlugin,
|
|
70
73
|
MediaItem,
|
|
71
74
|
PluginManifest,
|
|
@@ -81,7 +84,6 @@ import type {
|
|
|
81
84
|
UserInfo,
|
|
82
85
|
} from "./plugins/types.js";
|
|
83
86
|
import { recordSchedulerHeartbeatSafely } from "./scheduler-health.js";
|
|
84
|
-
import { MAX_COLLECTION_LIST_COLUMNS, type FieldType } from "./schema/types.js";
|
|
85
87
|
import { isMissingTableError } from "./utils/db-errors.js";
|
|
86
88
|
import { hashString } from "./utils/hash.js";
|
|
87
89
|
import { createInitLock, type InitLock, initWithLock } from "./utils/init-lock.js";
|
|
@@ -189,6 +191,7 @@ import {
|
|
|
189
191
|
handleMediaGet,
|
|
190
192
|
handleMediaCreate,
|
|
191
193
|
handleMediaUpdate,
|
|
194
|
+
handleMediaReplaceMetadata,
|
|
192
195
|
handleMediaDelete,
|
|
193
196
|
handleRevisionList,
|
|
194
197
|
handleRevisionGet,
|
|
@@ -229,41 +232,9 @@ import { publishDueContent, type PublishedRef } from "./scheduled-publish.js";
|
|
|
229
232
|
import { FTSManager } from "./search/fts-manager.js";
|
|
230
233
|
import { invalidateSiteSettingsCache } from "./settings/index.js";
|
|
231
234
|
|
|
232
|
-
/**
|
|
233
|
-
* Map schema field types to editor field kinds
|
|
234
|
-
*/
|
|
235
|
-
const FIELD_TYPE_TO_KIND: Record<FieldType, string> = {
|
|
236
|
-
string: "string",
|
|
237
|
-
slug: "string",
|
|
238
|
-
url: "url",
|
|
239
|
-
text: "richText",
|
|
240
|
-
number: "number",
|
|
241
|
-
integer: "number",
|
|
242
|
-
boolean: "boolean",
|
|
243
|
-
datetime: "datetime",
|
|
244
|
-
select: "select",
|
|
245
|
-
multiSelect: "multiSelect",
|
|
246
|
-
portableText: "portableText",
|
|
247
|
-
image: "image",
|
|
248
|
-
file: "file",
|
|
249
|
-
reference: "reference",
|
|
250
|
-
json: "json",
|
|
251
|
-
repeater: "repeater",
|
|
252
|
-
};
|
|
253
|
-
|
|
254
235
|
const DRAFT_ONLY_UPDATE_KEYS = new Set(["data", "slug", "locale", "skipRevision"]);
|
|
255
236
|
const MAX_DRAFT_STAGE_ATTEMPTS = 32;
|
|
256
237
|
|
|
257
|
-
const LIST_COLUMN_FIELD_TYPES: ReadonlySet<FieldType> = new Set([
|
|
258
|
-
"string",
|
|
259
|
-
"number",
|
|
260
|
-
"integer",
|
|
261
|
-
"boolean",
|
|
262
|
-
"datetime",
|
|
263
|
-
"select",
|
|
264
|
-
"multiSelect",
|
|
265
|
-
]);
|
|
266
|
-
|
|
267
238
|
/**
|
|
268
239
|
* Sandboxed plugin entry from virtual module
|
|
269
240
|
*/
|
|
@@ -2452,103 +2423,10 @@ export class EmDashRuntime {
|
|
|
2452
2423
|
* is two queries in practice; never N+1.
|
|
2453
2424
|
*/
|
|
2454
2425
|
private async _buildManifest(): Promise<EmDashManifest> {
|
|
2455
|
-
// Build collections from database.
|
|
2426
|
+
// Build collections from the live database.
|
|
2456
2427
|
// Use this.db (ALS-aware getter) so playground mode picks up the
|
|
2457
2428
|
// per-session DO database instead of the hardcoded singleton.
|
|
2458
|
-
const manifestCollections
|
|
2459
|
-
try {
|
|
2460
|
-
const registry = new SchemaRegistry(this.db);
|
|
2461
|
-
const dbCollections = await registry.listCollectionsWithFields();
|
|
2462
|
-
for (const collection of dbCollections) {
|
|
2463
|
-
const fields: Record<
|
|
2464
|
-
string,
|
|
2465
|
-
{
|
|
2466
|
-
kind: string;
|
|
2467
|
-
label?: string;
|
|
2468
|
-
required?: boolean;
|
|
2469
|
-
widget?: string;
|
|
2470
|
-
// Two shapes: legacy enum-style `[{ value, label }]` for select widgets,
|
|
2471
|
-
// or arbitrary `Record<string, unknown>` for plugin field widgets that
|
|
2472
|
-
// need per-field config (e.g. a checkbox grid receiving its column defs).
|
|
2473
|
-
options?: Array<{ value: string; label: string }> | Record<string, unknown>;
|
|
2474
|
-
id?: string;
|
|
2475
|
-
validation?: Record<string, unknown>;
|
|
2476
|
-
}
|
|
2477
|
-
> = {};
|
|
2478
|
-
|
|
2479
|
-
for (const field of collection.fields) {
|
|
2480
|
-
const entry: (typeof fields)[string] = {
|
|
2481
|
-
kind: FIELD_TYPE_TO_KIND[field.type] ?? "string",
|
|
2482
|
-
label: field.label,
|
|
2483
|
-
required: field.required,
|
|
2484
|
-
};
|
|
2485
|
-
// Always include the field's database ID so the admin can forward it
|
|
2486
|
-
// to upload/media-list API calls for MIME allowlist widening.
|
|
2487
|
-
entry.id = field.id;
|
|
2488
|
-
if (field.widget) entry.widget = field.widget;
|
|
2489
|
-
// Plugin field widgets read their per-field config from `field.options`,
|
|
2490
|
-
// which the seed schema types as `Record<string, unknown>`. Pass it
|
|
2491
|
-
// through to the manifest so plugin widgets in the admin SPA receive it.
|
|
2492
|
-
if (field.options) {
|
|
2493
|
-
entry.options = field.options;
|
|
2494
|
-
}
|
|
2495
|
-
// Legacy: select/multiSelect enum options live on `field.validation.options`.
|
|
2496
|
-
// Wins over `field.options` to preserve existing behavior for enum widgets.
|
|
2497
|
-
if (field.validation?.options) {
|
|
2498
|
-
entry.options = field.validation.options.map((v) => ({
|
|
2499
|
-
value: v,
|
|
2500
|
-
label: v.charAt(0).toUpperCase() + v.slice(1),
|
|
2501
|
-
}));
|
|
2502
|
-
}
|
|
2503
|
-
// Include full validation for repeater fields (subFields, minItems, maxItems)
|
|
2504
|
-
// and for file/image fields (allowedMimeTypes).
|
|
2505
|
-
if (
|
|
2506
|
-
(field.type === "repeater" || field.type === "file" || field.type === "image") &&
|
|
2507
|
-
field.validation
|
|
2508
|
-
) {
|
|
2509
|
-
entry.validation = { ...field.validation };
|
|
2510
|
-
}
|
|
2511
|
-
fields[field.slug] = entry;
|
|
2512
|
-
}
|
|
2513
|
-
|
|
2514
|
-
const configuredListColumns = collection.admin?.listColumns ?? [];
|
|
2515
|
-
const fieldTypes = new Map(collection.fields.map((field) => [field.slug, field.type]));
|
|
2516
|
-
const listColumns: string[] = [];
|
|
2517
|
-
for (const slug of configuredListColumns) {
|
|
2518
|
-
if (listColumns.includes(slug)) continue;
|
|
2519
|
-
const fieldType = fieldTypes.get(slug);
|
|
2520
|
-
if (!fieldType || !LIST_COLUMN_FIELD_TYPES.has(fieldType)) {
|
|
2521
|
-
console.warn(
|
|
2522
|
-
`EmDash: Ignoring unsupported or unknown list column "${slug}" in collection "${collection.slug}".`,
|
|
2523
|
-
);
|
|
2524
|
-
continue;
|
|
2525
|
-
}
|
|
2526
|
-
if (listColumns.length >= MAX_COLLECTION_LIST_COLUMNS) {
|
|
2527
|
-
console.warn(
|
|
2528
|
-
`EmDash: Collection "${collection.slug}" declares more than ${MAX_COLLECTION_LIST_COLUMNS} list columns; extra columns are ignored.`,
|
|
2529
|
-
);
|
|
2530
|
-
break;
|
|
2531
|
-
}
|
|
2532
|
-
listColumns.push(slug);
|
|
2533
|
-
}
|
|
2534
|
-
|
|
2535
|
-
manifestCollections[collection.slug] = {
|
|
2536
|
-
label: collection.label,
|
|
2537
|
-
labelSingular: collection.labelSingular || collection.label,
|
|
2538
|
-
supports: collection.supports || [],
|
|
2539
|
-
hasSeo: collection.hasSeo,
|
|
2540
|
-
urlPattern: collection.urlPattern,
|
|
2541
|
-
routable: collection.routable !== false,
|
|
2542
|
-
titleField: collection.titleField,
|
|
2543
|
-
dateField: collection.dateField,
|
|
2544
|
-
...(collection.hidden ? { hidden: true } : {}),
|
|
2545
|
-
listColumns: listColumns.length > 0 ? listColumns : undefined,
|
|
2546
|
-
fields,
|
|
2547
|
-
};
|
|
2548
|
-
}
|
|
2549
|
-
} catch (error) {
|
|
2550
|
-
console.debug("EmDash: Could not load database collections:", error);
|
|
2551
|
-
}
|
|
2429
|
+
const manifestCollections = await buildManifestCollections({}, this.db);
|
|
2552
2430
|
|
|
2553
2431
|
// Build plugins manifest
|
|
2554
2432
|
const manifestPlugins: Record<
|
|
@@ -2714,7 +2592,11 @@ export class EmDashRuntime {
|
|
|
2714
2592
|
const i18nConfig = virtualConfig?.i18n ?? getI18nConfig();
|
|
2715
2593
|
const i18n =
|
|
2716
2594
|
i18nConfig && i18nConfig.locales && i18nConfig.locales.length > 1
|
|
2717
|
-
? {
|
|
2595
|
+
? {
|
|
2596
|
+
defaultLocale: i18nConfig.defaultLocale,
|
|
2597
|
+
locales: i18nConfig.locales,
|
|
2598
|
+
prefixDefaultLocale: i18nConfig.prefixDefaultLocale,
|
|
2599
|
+
}
|
|
2718
2600
|
: undefined;
|
|
2719
2601
|
|
|
2720
2602
|
// Normalize the experimental registry config for browser consumption.
|
|
@@ -2924,7 +2806,9 @@ export class EmDashRuntime {
|
|
|
2924
2806
|
}
|
|
2925
2807
|
|
|
2926
2808
|
// Run beforeSave hooks (sandboxed plugins)
|
|
2927
|
-
|
|
2809
|
+
const sandboxResult = await this.runSandboxedBeforeSave(processedData, collection, true);
|
|
2810
|
+
if (!sandboxResult.success) return sandboxResult;
|
|
2811
|
+
processedData = sandboxResult.data;
|
|
2928
2812
|
|
|
2929
2813
|
// Normalize media fields (fill dimensions, storageKey, etc.)
|
|
2930
2814
|
processedData = await this.normalizeMediaFields(collection, processedData);
|
|
@@ -3020,6 +2904,7 @@ export class EmDashRuntime {
|
|
|
3020
2904
|
bodyWithoutRev.data,
|
|
3021
2905
|
collection,
|
|
3022
2906
|
false,
|
|
2907
|
+
resolvedItem?.id,
|
|
3023
2908
|
);
|
|
3024
2909
|
processedData = hookResult.content;
|
|
3025
2910
|
} catch (error) {
|
|
@@ -3028,7 +2913,14 @@ export class EmDashRuntime {
|
|
|
3028
2913
|
}
|
|
3029
2914
|
|
|
3030
2915
|
// Run sandboxed beforeSave hooks
|
|
3031
|
-
|
|
2916
|
+
const sandboxResult = await this.runSandboxedBeforeSave(
|
|
2917
|
+
processedData!,
|
|
2918
|
+
collection,
|
|
2919
|
+
false,
|
|
2920
|
+
resolvedItem?.id,
|
|
2921
|
+
);
|
|
2922
|
+
if (!sandboxResult.success) return sandboxResult;
|
|
2923
|
+
processedData = sandboxResult.data;
|
|
3032
2924
|
|
|
3033
2925
|
// Normalize media fields (fill dimensions, storageKey, etc.)
|
|
3034
2926
|
processedData = await this.normalizeMediaFields(collection, processedData);
|
|
@@ -3271,7 +3163,7 @@ export class EmDashRuntime {
|
|
|
3271
3163
|
|
|
3272
3164
|
async handleContentListTrashed(
|
|
3273
3165
|
collection: string,
|
|
3274
|
-
params: { cursor?: string; limit?: number } = {},
|
|
3166
|
+
params: { cursor?: string; limit?: number; locale?: string } = {},
|
|
3275
3167
|
) {
|
|
3276
3168
|
return handleContentListTrashed(this.db, collection, params);
|
|
3277
3169
|
}
|
|
@@ -3304,8 +3196,8 @@ export class EmDashRuntime {
|
|
|
3304
3196
|
return result;
|
|
3305
3197
|
}
|
|
3306
3198
|
|
|
3307
|
-
async handleContentCountTrashed(collection: string) {
|
|
3308
|
-
return handleContentCountTrashed(this.db, collection);
|
|
3199
|
+
async handleContentCountTrashed(collection: string, params: { locale?: string } = {}) {
|
|
3200
|
+
return handleContentCountTrashed(this.db, collection, params);
|
|
3309
3201
|
}
|
|
3310
3202
|
|
|
3311
3203
|
async handleContentDuplicate(collection: string, id: string, authorId?: string) {
|
|
@@ -3327,6 +3219,7 @@ export class EmDashRuntime {
|
|
|
3327
3219
|
publishedAt?: string;
|
|
3328
3220
|
requireScheduledDue?: boolean;
|
|
3329
3221
|
expectedScheduledAt?: string;
|
|
3222
|
+
_rev?: string;
|
|
3330
3223
|
} = {},
|
|
3331
3224
|
) {
|
|
3332
3225
|
const result = await handleContentPublish(this.db, collection, id, options);
|
|
@@ -3342,8 +3235,8 @@ export class EmDashRuntime {
|
|
|
3342
3235
|
return result;
|
|
3343
3236
|
}
|
|
3344
3237
|
|
|
3345
|
-
async handleContentUnpublish(collection: string, id: string) {
|
|
3346
|
-
const result = await handleContentUnpublish(this.db, collection, id);
|
|
3238
|
+
async handleContentUnpublish(collection: string, id: string, options: { _rev?: string } = {}) {
|
|
3239
|
+
const result = await handleContentUnpublish(this.db, collection, id, options);
|
|
3347
3240
|
if (result.success && result.data) {
|
|
3348
3241
|
await this.refreshContentUsageAfterSuccessfulWrite(collection, [result.data.item.id]);
|
|
3349
3242
|
}
|
|
@@ -3388,8 +3281,8 @@ export class EmDashRuntime {
|
|
|
3388
3281
|
return handleContentCountScheduled(this.db, collection);
|
|
3389
3282
|
}
|
|
3390
3283
|
|
|
3391
|
-
async handleContentDiscardDraft(collection: string, id: string) {
|
|
3392
|
-
const result = await handleContentDiscardDraft(this.db, collection, id);
|
|
3284
|
+
async handleContentDiscardDraft(collection: string, id: string, options: { _rev?: string } = {}) {
|
|
3285
|
+
const result = await handleContentDiscardDraft(this.db, collection, id, options);
|
|
3393
3286
|
if (result.success && result.data) {
|
|
3394
3287
|
await this.refreshContentUsageAfterSuccessfulWrite(collection, [result.data.item.id]);
|
|
3395
3288
|
}
|
|
@@ -3434,6 +3327,7 @@ export class EmDashRuntime {
|
|
|
3434
3327
|
blurhash?: string;
|
|
3435
3328
|
dominantColor?: string;
|
|
3436
3329
|
authorId?: string;
|
|
3330
|
+
folderId?: string | null;
|
|
3437
3331
|
}) {
|
|
3438
3332
|
// Run beforeUpload hooks
|
|
3439
3333
|
let processedInput = input;
|
|
@@ -3498,6 +3392,18 @@ export class EmDashRuntime {
|
|
|
3498
3392
|
return result;
|
|
3499
3393
|
}
|
|
3500
3394
|
|
|
3395
|
+
async handleMediaReplaceMetadata(
|
|
3396
|
+
id: string,
|
|
3397
|
+
expectedStorageKey: string,
|
|
3398
|
+
input: { size: number; width: number; height: number; contentHash: string },
|
|
3399
|
+
) {
|
|
3400
|
+
const result = await handleMediaReplaceMetadata(this.db, id, expectedStorageKey, input);
|
|
3401
|
+
if (result.success) {
|
|
3402
|
+
invalidateSiteSettingsCache();
|
|
3403
|
+
}
|
|
3404
|
+
return result;
|
|
3405
|
+
}
|
|
3406
|
+
|
|
3501
3407
|
async handleMediaDelete(id: string) {
|
|
3502
3408
|
const result = await handleMediaDelete(this.db, id);
|
|
3503
3409
|
// Same reasoning as `handleMediaUpdate`: if the deleted media row
|
|
@@ -4071,7 +3977,8 @@ export class EmDashRuntime {
|
|
|
4071
3977
|
content: Record<string, unknown>,
|
|
4072
3978
|
collection: string,
|
|
4073
3979
|
isNew: boolean,
|
|
4074
|
-
|
|
3980
|
+
contentId?: string,
|
|
3981
|
+
) {
|
|
4075
3982
|
let result = content;
|
|
4076
3983
|
|
|
4077
3984
|
for (const [pluginKey, plugin] of this.sandboxedPlugins) {
|
|
@@ -4079,11 +3986,30 @@ export class EmDashRuntime {
|
|
|
4079
3986
|
if (!id || !this.isPluginEnabled(id)) continue;
|
|
4080
3987
|
|
|
4081
3988
|
try {
|
|
4082
|
-
const
|
|
4083
|
-
|
|
4084
|
-
|
|
4085
|
-
|
|
4086
|
-
|
|
3989
|
+
const event: ContentHookEvent = { content: result, collection, isNew };
|
|
3990
|
+
if (contentId !== undefined) event.id = contentId;
|
|
3991
|
+
const hookResult = await plugin.invokeHook("content:beforeSave", event);
|
|
3992
|
+
const inspection = inspectSandboxHookResult(hookResult);
|
|
3993
|
+
if (inspection.kind === "error") {
|
|
3994
|
+
return {
|
|
3995
|
+
success: false as const,
|
|
3996
|
+
error: {
|
|
3997
|
+
code: ErrorCode.SAVE_REJECTED,
|
|
3998
|
+
message: "Save rejected by a sandboxed plugin",
|
|
3999
|
+
details: { pluginId: id, reason: inspection.error.reason },
|
|
4000
|
+
},
|
|
4001
|
+
};
|
|
4002
|
+
}
|
|
4003
|
+
if (inspection.kind === "malformed") {
|
|
4004
|
+
console.error(`EmDash: Sandboxed plugin ${id} returned an invalid hook result`);
|
|
4005
|
+
return {
|
|
4006
|
+
success: false as const,
|
|
4007
|
+
error: {
|
|
4008
|
+
code: ErrorCode.CONTENT_HOOK_ERROR,
|
|
4009
|
+
message: "A plugin hook failed while saving content",
|
|
4010
|
+
},
|
|
4011
|
+
};
|
|
4012
|
+
}
|
|
4087
4013
|
if (hookResult && typeof hookResult === "object" && !Array.isArray(hookResult)) {
|
|
4088
4014
|
// Sandbox returns unknown; convert to record by iterating own properties
|
|
4089
4015
|
const record: Record<string, unknown> = {};
|
|
@@ -4093,14 +4019,18 @@ export class EmDashRuntime {
|
|
|
4093
4019
|
result = record;
|
|
4094
4020
|
}
|
|
4095
4021
|
} catch (error) {
|
|
4096
|
-
console.error(
|
|
4097
|
-
|
|
4098
|
-
|
|
4099
|
-
|
|
4022
|
+
console.error(`EmDash: Sandboxed plugin ${id} beforeSave hook failed:`, error);
|
|
4023
|
+
return {
|
|
4024
|
+
success: false as const,
|
|
4025
|
+
error: {
|
|
4026
|
+
code: ErrorCode.CONTENT_HOOK_ERROR,
|
|
4027
|
+
message: "A plugin hook failed while saving content",
|
|
4028
|
+
},
|
|
4029
|
+
};
|
|
4100
4030
|
}
|
|
4101
4031
|
}
|
|
4102
4032
|
|
|
4103
|
-
return result;
|
|
4033
|
+
return { success: true as const, data: result };
|
|
4104
4034
|
}
|
|
4105
4035
|
|
|
4106
4036
|
private async runSandboxedBeforeDelete(id: string, collection: string): Promise<boolean> {
|
package/src/fields/boolean.ts
CHANGED
|
@@ -15,7 +15,7 @@ export function boolean(options: BooleanOptions = {}): FieldDefinition<boolean>
|
|
|
15
15
|
const boolSchema = z.boolean();
|
|
16
16
|
|
|
17
17
|
// Apply default
|
|
18
|
-
const schema: z.
|
|
18
|
+
const schema: z.ZodType =
|
|
19
19
|
options.default !== undefined ? boolSchema.default(options.default) : boolSchema;
|
|
20
20
|
|
|
21
21
|
const ui: FieldUIHints = {
|
package/src/fields/datetime.ts
CHANGED
|
@@ -25,7 +25,7 @@ export function datetime(options: DatetimeOptions = {}): FieldDefinition<Date> {
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
// Optional vs required
|
|
28
|
-
const schema: z.
|
|
28
|
+
const schema: z.ZodType = options.required ? dateSchema : dateSchema.optional();
|
|
29
29
|
|
|
30
30
|
const ui: FieldUIHints = {
|
|
31
31
|
widget: "datetime",
|
package/src/fields/file.ts
CHANGED
|
@@ -21,7 +21,7 @@ export function file(options: FileOptions = {}): FieldDefinition<FileValue> {
|
|
|
21
21
|
meta: z.record(z.string(), z.unknown()).optional(),
|
|
22
22
|
});
|
|
23
23
|
|
|
24
|
-
const schema: z.
|
|
24
|
+
const schema: z.ZodType = options.required ? fileObjSchema : fileObjSchema.optional();
|
|
25
25
|
|
|
26
26
|
const ui: FieldUIHints = {
|
|
27
27
|
widget: "file",
|
package/src/fields/integer.ts
CHANGED
|
@@ -29,7 +29,7 @@ export function integer(options: IntegerOptions = {}): FieldDefinition<number> {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
// Optional vs required
|
|
32
|
-
const schema: z.
|
|
32
|
+
const schema: z.ZodType = options.required ? intSchema : intSchema.optional();
|
|
33
33
|
|
|
34
34
|
const ui: FieldUIHints = {
|
|
35
35
|
widget: "number",
|
package/src/fields/json.ts
CHANGED
|
@@ -15,7 +15,7 @@ export function json<T = unknown>(options: JsonOptions<T> = {}): FieldDefinition
|
|
|
15
15
|
// When T = unknown (default), z.unknown() is already z.ZodType<unknown>.
|
|
16
16
|
// When a custom schema is provided, it carries the correct generic.
|
|
17
17
|
// The generic constraint ensures type safety for callers.
|
|
18
|
-
let schema: z.
|
|
18
|
+
let schema: z.ZodType = options.schema ?? z.unknown();
|
|
19
19
|
|
|
20
20
|
// Optional vs required
|
|
21
21
|
if (!options.required && !options.schema) {
|
|
@@ -28,7 +28,7 @@ export function multiSelect<T extends readonly [string, ...string[]]>(
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
// Optional vs required
|
|
31
|
-
const schema: z.
|
|
31
|
+
const schema: z.ZodType = msOptions.required ? arraySchema : arraySchema.optional();
|
|
32
32
|
|
|
33
33
|
const ui: FieldUIHints = {
|
|
34
34
|
widget: "multiSelect",
|
package/src/fields/number.ts
CHANGED
|
@@ -32,7 +32,7 @@ export function number(options: NumberOptions = {}): FieldDefinition<number> {
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
// Optional vs required
|
|
35
|
-
const schema: z.
|
|
35
|
+
const schema: z.ZodType = options.required ? numberSchema : numberSchema.optional();
|
|
36
36
|
|
|
37
37
|
const ui: FieldUIHints = {
|
|
38
38
|
widget: "number",
|
package/src/fields/richtext.ts
CHANGED
|
@@ -14,7 +14,7 @@ export function richText(options: RichTextOptions = {}): FieldDefinition<string>
|
|
|
14
14
|
const stringSchema = z.string();
|
|
15
15
|
|
|
16
16
|
// Optional vs required
|
|
17
|
-
const schema: z.
|
|
17
|
+
const schema: z.ZodType = options.required ? stringSchema : stringSchema.optional();
|
|
18
18
|
|
|
19
19
|
const ui: FieldUIHints = {
|
|
20
20
|
widget: "richText",
|