emdash 0.37.0 → 0.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{activation-K0kGBWuJ.mjs → activation-DyNTe_Tl.mjs} +3 -3
- package/dist/{activation-K0kGBWuJ.mjs.map → activation-DyNTe_Tl.mjs.map} +1 -1
- package/dist/{adapters-BDQwg236.d.mts → adapters-DCEgOBXi.d.mts} +1 -1
- package/dist/{adapters-BDQwg236.d.mts.map → adapters-DCEgOBXi.d.mts.map} +1 -1
- package/dist/{allowed-origins-BGglilcs.mjs → allowed-origins-GFUVavRj.mjs} +2 -2
- package/dist/{allowed-origins-BGglilcs.mjs.map → allowed-origins-GFUVavRj.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -3
- package/dist/api/route-utils.mjs +23 -22
- 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 → api-BvxJmnFY.mjs} +141 -87
- package/dist/api-BvxJmnFY.mjs.map +1 -0
- package/dist/{api-tokens-BSsQACNe.mjs → api-tokens-xpGqMHrC.mjs} +2 -2
- package/dist/{api-tokens-BSsQACNe.mjs.map → api-tokens-xpGqMHrC.mjs.map} +1 -1
- package/dist/{apply-B4SIOxR1.mjs → apply-DLmM3R7f.mjs} +25 -21
- package/dist/apply-DLmM3R7f.mjs.map +1 -0
- package/dist/{config-it29yDLA.mjs → artifact-fetch-P2JXVwOq.mjs} +8 -199
- package/dist/artifact-fetch-P2JXVwOq.mjs.map +1 -0
- package/dist/astro/index.d.mts +12 -12
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +37 -11
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +10 -10
- package/dist/astro/middleware/auth.mjs +6 -6
- package/dist/astro/middleware/media-usage-write-fence.mjs +3 -3
- package/dist/astro/middleware/redirect.mjs +7 -5
- package/dist/astro/middleware/redirect.mjs.map +1 -1
- package/dist/astro/middleware/request-context.mjs +3 -3
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +10 -10
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +154 -125
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +6 -6
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +6 -6
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +3 -3
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +4 -4
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +4 -4
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +9 -9
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +9 -9
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +9 -9
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +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 +11 -11
- package/dist/astro/routes/api/admin/comments/_id_.mjs +3 -3
- package/dist/astro/routes/api/admin/comments/bulk.mjs +8 -8
- package/dist/astro/routes/api/admin/comments/counts.mjs +3 -3
- package/dist/astro/routes/api/admin/comments/index.mjs +8 -8
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +4 -4
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
- package/dist/astro/routes/api/admin/media-usage/activation.mjs +13 -13
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +15 -15
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +15 -15
- package/dist/astro/routes/api/admin/media-usage/progress.mjs +13 -13
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +16 -16
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +15 -15
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +15 -15
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +3 -3
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +3 -3
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +56 -53
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +56 -53
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +54 -51
- 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 +54 -51
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +55 -52
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +55 -52
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +54 -51
- 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 +54 -51
- 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 +55 -52
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +54 -51
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +55 -52
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +56 -53
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +5 -4
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +56 -53
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +55 -52
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +54 -51
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +54 -51
- 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 +54 -51
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +1 -1
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +1 -1
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +6 -6
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +3 -3
- package/dist/astro/routes/api/admin/users/index.mjs +6 -6
- package/dist/astro/routes/api/auth/dev-bypass.mjs +3 -3
- package/dist/astro/routes/api/auth/invite/accept.mjs +1 -1
- package/dist/astro/routes/api/auth/invite/complete.mjs +11 -11
- package/dist/astro/routes/api/auth/invite/index.mjs +8 -8
- package/dist/astro/routes/api/auth/invite/register-options.mjs +10 -10
- package/dist/astro/routes/api/auth/logout.mjs +2 -2
- package/dist/astro/routes/api/auth/magic-link/send.mjs +10 -10
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +2 -2
- package/dist/astro/routes/api/auth/me.mjs +7 -7
- package/dist/astro/routes/api/auth/mode.mjs +2 -2
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +4 -4
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +6 -6
- package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
- package/dist/astro/routes/api/auth/passkey/options.mjs +12 -12
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +10 -10
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +11 -11
- package/dist/astro/routes/api/auth/passkey/verify.mjs +11 -11
- package/dist/astro/routes/api/auth/signup/complete.mjs +11 -11
- package/dist/astro/routes/api/auth/signup/request.mjs +10 -10
- package/dist/astro/routes/api/auth/signup/verify.mjs +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +12 -12
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +11 -11
- 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 +13 -8
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/lock.d.mts +10 -0
- package/dist/astro/routes/api/content/_collection_/_id_/lock.d.mts.map +1 -0
- package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +66 -0
- package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs.map +1 -0
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +11 -11
- package/dist/astro/routes/api/content/_collection_/_id_/publish.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +14 -9
- 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 +19 -17
- 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 +19 -17
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +15 -8
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +15 -14
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +13 -8
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +23 -11
- package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/index.mjs +14 -9
- package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/trash.mjs +7 -7
- package/dist/astro/routes/api/dashboard.mjs +6 -6
- package/dist/astro/routes/api/dev/emails.mjs +2 -2
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +16 -16
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +3 -3
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/execute.mjs +14 -13
- package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -10
- package/dist/astro/routes/api/import/wordpress/media.mjs +11 -11
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +10 -10
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +13 -13
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +16 -16
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +27 -26
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
- package/dist/astro/routes/api/manifest.mjs +4 -4
- package/dist/astro/routes/api/mcp.mjs +71 -55
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +10 -10
- package/dist/astro/routes/api/media/_id_/replace.mjs +8 -8
- package/dist/astro/routes/api/media/_id_/upload.mjs +5 -5
- package/dist/astro/routes/api/media/_id_/usage.mjs +18 -18
- package/dist/astro/routes/api/media/_id_.mjs +17 -17
- package/dist/astro/routes/api/media/file/_...key_.mjs +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 +9 -9
- package/dist/astro/routes/api/media.mjs +21 -21
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +9 -9
- package/dist/astro/routes/api/menus/_name_/items.mjs +9 -9
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +9 -9
- package/dist/astro/routes/api/menus/_name_/translations.mjs +9 -9
- package/dist/astro/routes/api/menus/_name_.mjs +9 -9
- package/dist/astro/routes/api/menus/index.mjs +9 -9
- 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 +84 -18
- package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +4 -4
- package/dist/astro/routes/api/redirects/404s/index.mjs +12 -11
- package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/summary.mjs +12 -11
- package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/_id_.mjs +13 -12
- package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/index.mjs +13 -12
- package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/index.mjs +19 -17
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/translations.mjs +14 -12
- package/dist/astro/routes/api/relations/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/relations/index.mjs +19 -17
- 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 +54 -51
- 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 +54 -51
- 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 +54 -51
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +54 -51
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +54 -51
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/reorder.mjs +54 -51
- package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +13 -11
- package/dist/astro/routes/api/schema/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +54 -51
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +54 -51
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +12 -11
- package/dist/astro/routes/api/search/enable.mjs.map +1 -1
- package/dist/astro/routes/api/search/index.mjs +11 -10
- package/dist/astro/routes/api/search/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/rebuild.mjs +12 -11
- package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
- package/dist/astro/routes/api/search/stats.mjs +7 -6
- package/dist/astro/routes/api/search/stats.mjs.map +1 -1
- package/dist/astro/routes/api/search/suggest.mjs +11 -10
- package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
- package/dist/astro/routes/api/sections/_slug_.mjs +11 -10
- package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/sections/index.mjs +11 -10
- package/dist/astro/routes/api/sections/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -6
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +6 -5
- package/dist/astro/routes/api/settings/backups/archives/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/export.mjs +7 -6
- package/dist/astro/routes/api/settings/backups/export.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/index.mjs +8 -7
- package/dist/astro/routes/api/settings/backups/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/email.mjs +4 -4
- package/dist/astro/routes/api/settings.mjs +14 -14
- package/dist/astro/routes/api/setup/admin-verify.mjs +12 -12
- package/dist/astro/routes/api/setup/admin.mjs +11 -11
- package/dist/astro/routes/api/setup/dev-bypass.mjs +33 -31
- 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 +33 -31
- package/dist/astro/routes/api/setup/index.mjs.map +1 -1
- package/dist/astro/routes/api/setup/status.mjs +3 -3
- package/dist/astro/routes/api/snapshot.mjs +8 -7
- package/dist/astro/routes/api/snapshot.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +15 -14
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +16 -15
- 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.mjs +8 -8
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +12 -12
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +12 -12
- package/dist/astro/routes/api/widget-areas/_name_.mjs +7 -7
- package/dist/astro/routes/api/widget-areas/index.mjs +12 -12
- package/dist/astro/routes/api/widget-components.mjs +2 -2
- package/dist/astro/routes/robots.txt.mjs +6 -6
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +11 -10
- package/dist/astro/routes/sitemap-_collection_.xml.mjs.map +1 -1
- package/dist/astro/routes/sitemap.xml.mjs +7 -7
- 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-Bkf_UHhD.mjs → authorize-C2QHlWSS.mjs} +2 -2
- package/dist/{authorize-Bkf_UHhD.mjs.map → authorize-C2QHlWSS.mjs.map} +1 -1
- package/dist/{backup-rwVAl9NI.mjs → backup-oS8ft5Cm.mjs} +5 -5
- package/dist/{backup-rwVAl9NI.mjs.map → backup-oS8ft5Cm.mjs.map} +1 -1
- package/dist/{bundle-C8S2Zl6U.mjs → bundle-CL0JjIPx.mjs} +4 -4
- package/dist/{bundle-C8S2Zl6U.mjs.map → bundle-CL0JjIPx.mjs.map} +1 -1
- package/dist/{byline-DuhF7NWl.mjs → byline-Vdi85CsZ.mjs} +6 -6
- package/dist/{byline-DuhF7NWl.mjs.map → byline-Vdi85CsZ.mjs.map} +1 -1
- package/dist/{byline-fields-BovY4KYM.mjs → byline-fields-DPVRFMz2.mjs} +2 -2
- package/dist/{byline-fields-BovY4KYM.mjs.map → byline-fields-DPVRFMz2.mjs.map} +1 -1
- package/dist/{byline-registry-Bpu9-MVs.mjs → byline-registry-BxDGIO0I.mjs} +2 -2
- package/dist/{byline-registry-Bpu9-MVs.mjs.map → byline-registry-BxDGIO0I.mjs.map} +1 -1
- package/dist/{bylines-CJ5nd6Lw.mjs → bylines-BX8QhcTk.mjs} +7 -7
- package/dist/{bylines-CJ5nd6Lw.mjs.map → bylines-BX8QhcTk.mjs.map} +1 -1
- package/dist/{bylines-RwBAeOF1.mjs → bylines-w-E1IEQd.mjs} +3 -3
- package/dist/{bylines-RwBAeOF1.mjs.map → bylines-w-E1IEQd.mjs.map} +1 -1
- package/dist/{cache-BF5Kvn59.mjs → cache--7HKu5Xm.mjs} +4 -4
- package/dist/{cache-BF5Kvn59.mjs.map → cache--7HKu5Xm.mjs.map} +1 -1
- package/dist/{capture-triggers-CNW1q3HK.mjs → capture-triggers-CeAsC76Z.mjs} +2 -2
- package/dist/{capture-triggers-CNW1q3HK.mjs.map → capture-triggers-CeAsC76Z.mjs.map} +1 -1
- package/dist/{challenge-store-DQN_Yrck.mjs → challenge-store-BIOak-tp.mjs} +1 -1
- package/dist/{challenge-store-DQN_Yrck.mjs.map → challenge-store-BIOak-tp.mjs.map} +1 -1
- package/dist/{chrome-tags-D8fiZG94.mjs → chrome-tags-DzDQBCjX.mjs} +1 -1
- package/dist/{chrome-tags-D8fiZG94.mjs.map → chrome-tags-DzDQBCjX.mjs.map} +1 -1
- package/dist/{chunks-C4szrD8o.mjs → chunks-VG_tyqnP.mjs} +2 -2
- package/dist/{chunks-C4szrD8o.mjs.map → chunks-VG_tyqnP.mjs.map} +1 -1
- package/dist/cli/index.mjs +66 -38
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +17 -7
- package/dist/client/index.d.mts.map +1 -1
- package/dist/client/index.mjs +17 -12
- package/dist/client/index.mjs.map +1 -1
- package/dist/{collection-deletion-Bj07NHbj.mjs → collection-deletion-BCwaWTDw.mjs} +4 -4
- package/dist/{collection-deletion-Bj07NHbj.mjs.map → collection-deletion-BCwaWTDw.mjs.map} +1 -1
- package/dist/collection-slugs-cache-7lTmNzeA.mjs +85 -0
- package/dist/collection-slugs-cache-7lTmNzeA.mjs.map +1 -0
- package/dist/{comment-reaction-BhrvSHml.mjs → comment-reaction-CDyvPQRj.mjs} +2 -2
- package/dist/{comment-reaction-BhrvSHml.mjs.map → comment-reaction-CDyvPQRj.mjs.map} +1 -1
- package/dist/{comments-Ct4ensnf.mjs → comments-VzmVLyaC.mjs} +1 -1
- package/dist/{comments-Ct4ensnf.mjs.map → comments-VzmVLyaC.mjs.map} +1 -1
- package/dist/{components-DJbo1z0S.mjs → components-CL6Wkdk-.mjs} +1 -1
- package/dist/{components-DJbo1z0S.mjs.map → components-CL6Wkdk-.mjs.map} +1 -1
- package/dist/config--eWjQJE5.mjs +217 -0
- package/dist/config--eWjQJE5.mjs.map +1 -0
- package/dist/{index-BJNMCWmu.d.mts → config-CGAhyOjP.d.mts} +138 -47
- package/dist/config-CGAhyOjP.d.mts.map +1 -0
- package/dist/{config-B9eZ340f.d.mts → config-ChFzshGd.d.mts} +1 -1
- package/dist/{config-B9eZ340f.d.mts.map → config-ChFzshGd.d.mts.map} +1 -1
- package/dist/{content-DjvM0T92.mjs → content-CNfMWuhY.mjs} +121 -5
- package/dist/content-CNfMWuhY.mjs.map +1 -0
- package/dist/{content-list-query-Btqd4uV2.d.mts → content-list-query-B8d4UQp9.d.mts} +1 -1
- package/dist/{content-list-query-Btqd4uV2.d.mts.map → content-list-query-B8d4UQp9.d.mts.map} +1 -1
- package/dist/{content-refresh-Bwp-8yGy.mjs → content-refresh-GTMyi2Xy.mjs} +8 -8
- package/dist/{content-refresh-Bwp-8yGy.mjs.map → content-refresh-GTMyi2Xy.mjs.map} +1 -1
- package/dist/{content-repair-Czdp7jz5.mjs → content-repair-CIMt5C0U.mjs} +4 -4
- package/dist/{content-repair-Czdp7jz5.mjs.map → content-repair-CIMt5C0U.mjs.map} +1 -1
- package/dist/{context-CX6gxOLW.mjs → context-C9PB8vGd.mjs} +265 -25
- package/dist/context-C9PB8vGd.mjs.map +1 -0
- package/dist/{cron-C6o7VppJ.mjs → cron-DHAy9oyq.mjs} +1 -1
- package/dist/{cron-C6o7VppJ.mjs.map → cron-DHAy9oyq.mjs.map} +1 -1
- package/dist/{dashboard-C2kTeeRI.mjs → dashboard-BNSvAN8A.mjs} +4 -4
- package/dist/{dashboard-C2kTeeRI.mjs.map → dashboard-BNSvAN8A.mjs.map} +1 -1
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +2 -2
- package/dist/db/libsql-migrations.d.mts +1 -1
- package/dist/db/libsql-migrations.mjs +5 -5
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres-migrations.d.mts +1 -1
- package/dist/db/postgres-migrations.mjs +5 -5
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite-migrations.d.mts +1 -1
- package/dist/db/sqlite-migrations.mjs +5 -5
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/db/sqlite.mjs +1 -1
- package/dist/{default-Clra32mw.mjs → default-ByZ0JqZo.mjs} +1 -1
- package/dist/{default-Clra32mw.mjs.map → default-ByZ0JqZo.mjs.map} +1 -1
- package/dist/{deferred-tasks-CvDETTJO.d.mts → deferred-tasks-Cu4NSJpa.d.mts} +1 -1
- package/dist/{deferred-tasks-CvDETTJO.d.mts.map → deferred-tasks-Cu4NSJpa.d.mts.map} +1 -1
- package/dist/{dev-typegen-DzOPfsNj.mjs → dev-typegen-DHT7lcMU.mjs} +1 -1
- package/dist/{dev-typegen-DzOPfsNj.mjs.map → dev-typegen-DHT7lcMU.mjs.map} +1 -1
- package/dist/{device-flow-D2oCWvLJ.mjs → device-flow-Cf6bhCCT.mjs} +4 -4
- package/dist/{device-flow-D2oCWvLJ.mjs.map → device-flow-Cf6bhCCT.mjs.map} +1 -1
- package/dist/{dialect-helpers-BSbfaO3F.mjs → dialect-helpers-BcQvkHgn.mjs} +83 -2
- package/dist/dialect-helpers-BcQvkHgn.mjs.map +1 -0
- package/dist/{direct-executor-Bfa5_ToE.mjs → direct-executor-yAyUGSqB.mjs} +3 -3
- package/dist/{direct-executor-Bfa5_ToE.mjs.map → direct-executor-yAyUGSqB.mjs.map} +1 -1
- package/dist/{dist-89xCrGqi.mjs → dist-BAsh8dbf.mjs} +1 -1
- package/dist/{dist-89xCrGqi.mjs.map → dist-BAsh8dbf.mjs.map} +1 -1
- package/dist/{email-console-Dzb6uGYa.mjs → email-console-DNup1Fku.mjs} +1 -1
- package/dist/{email-console-Dzb6uGYa.mjs.map → email-console-DNup1Fku.mjs.map} +1 -1
- package/dist/{enrich-BX0IDp4z.mjs → enrich-t2Xvjdqa.mjs} +3 -3
- package/dist/{enrich-BX0IDp4z.mjs.map → enrich-t2Xvjdqa.mjs.map} +1 -1
- package/dist/entry-lock-BEr8gDkG.mjs +163 -0
- package/dist/entry-lock-BEr8gDkG.mjs.map +1 -0
- package/dist/{relations-DnRK4YIT.d.mts → entry-lock-CGAtrwAR.d.mts} +92 -37
- package/dist/entry-lock-CGAtrwAR.d.mts.map +1 -0
- package/dist/{redirects-BLNOWQTn.mjs → entry-lock-DIYHAaSw.mjs} +57 -14
- package/dist/entry-lock-DIYHAaSw.mjs.map +1 -0
- package/dist/entry-locks-BEcX7ET0.mjs +167 -0
- package/dist/entry-locks-BEcX7ET0.mjs.map +1 -0
- package/dist/{error-DFrQjppn.mjs → error-BDcFyoRt.mjs} +2 -2
- package/dist/{error-DFrQjppn.mjs.map → error-BDcFyoRt.mjs.map} +1 -1
- package/dist/{errors-DsVoDUjJ.mjs → errors-DvMdNrgf.mjs} +8 -1
- package/dist/errors-DvMdNrgf.mjs.map +1 -0
- package/dist/{escape-HmHTC1Is.mjs → escape-B3asJC6W.mjs} +1 -1
- package/dist/{escape-HmHTC1Is.mjs.map → escape-B3asJC6W.mjs.map} +1 -1
- package/dist/{field-defs-cache-BM4SIRqH.mjs → field-defs-cache-Cf5FHK0M.mjs} +5 -5
- package/dist/{field-defs-cache-BM4SIRqH.mjs.map → field-defs-cache-Cf5FHK0M.mjs.map} +1 -1
- package/dist/{fts-manager-Do1BlW2r.mjs → fts-manager-iddym8cd.mjs} +4 -4
- package/dist/{fts-manager-Do1BlW2r.mjs.map → fts-manager-iddym8cd.mjs.map} +1 -1
- package/dist/{hash-3JJPlHF2.mjs → hash-BRweX6jz.mjs} +1 -1
- package/dist/{hash-3JJPlHF2.mjs.map → hash-BRweX6jz.mjs.map} +1 -1
- package/dist/{hook-result-DCh2WUpe.d.mts → hook-result-BrshYHLx.d.mts} +1 -1
- package/dist/{hook-result-DCh2WUpe.d.mts.map → hook-result-BrshYHLx.d.mts.map} +1 -1
- package/dist/{hreflang-B6hbAuuO.d.mts → hreflang-CQpu5bMy.d.mts} +2 -2
- package/dist/{hreflang-B6hbAuuO.d.mts.map → hreflang-CQpu5bMy.d.mts.map} +1 -1
- package/dist/{hreflang-DQbPZliA.mjs → hreflang-DshnweTC.mjs} +9 -8
- package/dist/{hreflang-DQbPZliA.mjs.map → hreflang-DshnweTC.mjs.map} +1 -1
- package/dist/{identity-DksvEazf.mjs → identity-CjGKDq8J.mjs} +3 -3
- package/dist/{identity-DksvEazf.mjs.map → identity-CjGKDq8J.mjs.map} +1 -1
- package/dist/{import-CJpaBBBT.mjs → import-D96g2otw.mjs} +5 -5
- package/dist/{import-CJpaBBBT.mjs.map → import-D96g2otw.mjs.map} +1 -1
- package/dist/{index-Du8K7bWa.d.mts → index-1ECYpfiF.d.mts} +3 -3
- package/dist/{index-Du8K7bWa.d.mts.map → index-1ECYpfiF.d.mts.map} +1 -1
- package/dist/index.d.mts +22 -22
- package/dist/index.mjs +81 -78
- package/dist/{init-lock-DJkX6Hto.mjs → init-lock-CFNBe_iH.mjs} +1 -1
- package/dist/{init-lock-DJkX6Hto.mjs.map → init-lock-CFNBe_iH.mjs.map} +1 -1
- package/dist/{load-CawHjTOH.mjs → load-DPtY9cZo.mjs} +2 -2
- package/dist/{load-CawHjTOH.mjs.map → load-DPtY9cZo.mjs.map} +1 -1
- package/dist/{loader-Z8vl7zTq.mjs → loader-WJi6GFRn.mjs} +46 -8
- package/dist/loader-WJi6GFRn.mjs.map +1 -0
- package/dist/{manifest-builder-COtzuca2.mjs → manifest-builder-BfNlGQIA.mjs} +2 -2
- package/dist/{manifest-builder-COtzuca2.mjs.map → manifest-builder-BfNlGQIA.mjs.map} +1 -1
- package/dist/{manifest-schema-BNWwR8Vd.mjs → manifest-schema-CILooI5J.mjs} +1 -1
- package/dist/{manifest-schema-BNWwR8Vd.mjs.map → manifest-schema-CILooI5J.mjs.map} +1 -1
- package/dist/media/image-endpoint.mjs +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +3 -3
- package/dist/media/local-runtime.d.mts +12 -12
- package/dist/media/local-runtime.mjs +5 -5
- package/dist/{media-BHjus86Y.mjs → media-C1EIZKh1.mjs} +1 -1
- package/dist/{media-BHjus86Y.mjs.map → media-C1EIZKh1.mjs.map} +1 -1
- package/dist/{media-allowlist-CoTBWoDp.mjs → media-allowlist-elXJgb_K.mjs} +2 -2
- package/dist/{media-allowlist-CoTBWoDp.mjs.map → media-allowlist-elXJgb_K.mjs.map} +1 -1
- package/dist/{media-folders-BGkATs8n.mjs → media-folders-DASfX_DH.mjs} +1 -1
- package/dist/{media-folders-BGkATs8n.mjs.map → media-folders-DASfX_DH.mjs.map} +1 -1
- package/dist/{media-upload-BCidR-EY.mjs → media-upload-C7_AQJ5v.mjs} +8 -8
- package/dist/{media-upload-BCidR-EY.mjs.map → media-upload-C7_AQJ5v.mjs.map} +1 -1
- package/dist/{media-url-DHoPr0hq.mjs → media-url-8dVl1loq.mjs} +19 -2
- package/dist/media-url-8dVl1loq.mjs.map +1 -0
- package/dist/{media-usage-CdY5jhSR.mjs → media-usage-C1EswMTq.mjs} +9 -9
- package/dist/{media-usage-CdY5jhSR.mjs.map → media-usage-C1EswMTq.mjs.map} +1 -1
- package/dist/{media-usage-activation-BgeMtK5C.mjs → media-usage-activation-CrHNltlL.mjs} +3 -3
- package/dist/{media-usage-activation-BgeMtK5C.mjs.map → media-usage-activation-CrHNltlL.mjs.map} +1 -1
- package/dist/{media-usage-work-D6D9sMCA.mjs → media-usage-work-C5B1zT1c.mjs} +2 -2
- package/dist/{media-usage-work-D6D9sMCA.mjs.map → media-usage-work-C5B1zT1c.mjs.map} +1 -1
- package/dist/{media-usage-work-CnGCdHxx.mjs → media-usage-work-IkQx_Yz6.mjs} +4 -4
- package/dist/{media-usage-work-CnGCdHxx.mjs.map → media-usage-work-IkQx_Yz6.mjs.map} +1 -1
- package/dist/{media-usage-write-fence-hjeD4u7s.mjs → media-usage-write-fence-B9anjOSg.mjs} +3 -3
- package/dist/{media-usage-write-fence-hjeD4u7s.mjs.map → media-usage-write-fence-B9anjOSg.mjs.map} +1 -1
- package/dist/{menus-6qSwTNxG.mjs → menus-D8mC4eaN.mjs} +115 -136
- package/dist/menus-D8mC4eaN.mjs.map +1 -0
- package/dist/{menus-uvPLXMZf.mjs → menus-UdwjHZJC.mjs} +11 -3
- package/dist/{menus-uvPLXMZf.mjs.map → menus-UdwjHZJC.mjs.map} +1 -1
- package/dist/migrations/index.d.mts +1 -1
- package/dist/migrations/index.mjs +4 -4
- package/dist/{mime-CUIG6x84.mjs → mime-DYpsOAny.mjs} +1 -1
- package/dist/{mime-CUIG6x84.mjs.map → mime-DYpsOAny.mjs.map} +1 -1
- package/dist/{mode-DN_WneRx.mjs → mode-Dm4BHhRH.mjs} +1 -1
- package/dist/{mode-DN_WneRx.mjs.map → mode-Dm4BHhRH.mjs.map} +1 -1
- package/dist/{node-sqlite-compat-BuJXIeMz.mjs → node-sqlite-compat-2sezm-Zd.mjs} +1 -1
- package/dist/{node-sqlite-compat-BuJXIeMz.mjs.map → node-sqlite-compat-2sezm-Zd.mjs.map} +1 -1
- package/dist/{normalize-C2xNjTSG.mjs → normalize-4nkKGsuW.mjs} +1 -1
- package/dist/{normalize-C2xNjTSG.mjs.map → normalize-4nkKGsuW.mjs.map} +1 -1
- package/dist/{oauth-authorization-Dj6Kwc21.mjs → oauth-authorization-BxE_lURD.mjs} +4 -4
- package/dist/{oauth-authorization-Dj6Kwc21.mjs.map → oauth-authorization-BxE_lURD.mjs.map} +1 -1
- package/dist/{oauth-clients-FD7I0J8m.mjs → oauth-clients-DJIdOdq0.mjs} +1 -1
- package/dist/{oauth-clients-FD7I0J8m.mjs.map → oauth-clients-DJIdOdq0.mjs.map} +1 -1
- package/dist/{oauth-state-store-DkmDOmHs.mjs → oauth-state-store-CsdxP57n.mjs} +1 -1
- package/dist/{oauth-state-store-DkmDOmHs.mjs.map → oauth-state-store-CsdxP57n.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-CvIwGpYd.mjs → oauth-user-lookup-HzzW-dkF.mjs} +1 -1
- package/dist/{oauth-user-lookup-CvIwGpYd.mjs.map → oauth-user-lookup-HzzW-dkF.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/{options-BHPeIbBd.mjs → options-D1FBiAv1.mjs} +60 -5
- package/dist/options-D1FBiAv1.mjs.map +1 -0
- package/dist/{options-CYb4y7hM.d.mts → options-D8Y0VHc7.d.mts} +9 -3
- package/dist/options-D8Y0VHc7.d.mts.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/page/index.d.mts.map +1 -1
- package/dist/page/index.mjs +12 -0
- package/dist/page/index.mjs.map +1 -1
- package/dist/{parse-Ckpg-Qfp.mjs → parse-WRg5C3NX.mjs} +2 -2
- package/dist/{parse-Ckpg-Qfp.mjs.map → parse-WRg5C3NX.mjs.map} +1 -1
- package/dist/{passkey-config-O_lj3y0k.mjs → passkey-config-qIdO-wF6.mjs} +1 -1
- package/dist/{passkey-config-O_lj3y0k.mjs.map → passkey-config-qIdO-wF6.mjs.map} +1 -1
- package/dist/{patterns-D9iDO3j8.mjs → patterns-DC8CLptu.mjs} +1 -1
- package/dist/{patterns-D9iDO3j8.mjs.map → patterns-DC8CLptu.mjs.map} +1 -1
- package/dist/{placeholder-4X9BrRrp.d.mts → placeholder-COrvARyD.d.mts} +1 -1
- package/dist/{placeholder-4X9BrRrp.d.mts.map → placeholder-COrvARyD.d.mts.map} +1 -1
- package/dist/plugin-types.d.mts +3 -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-Dhtwntrt.mjs → policy-XCfb-IE9.mjs} +2 -2
- package/dist/{policy-Dhtwntrt.mjs.map → policy-XCfb-IE9.mjs.map} +1 -1
- package/dist/{portable-text-U85hOafW.mjs → portable-text-BS3d5n-0.mjs} +1 -1
- package/dist/{portable-text-U85hOafW.mjs.map → portable-text-BS3d5n-0.mjs.map} +1 -1
- package/dist/{preview-B_vJLvf8.mjs → preview-BxwsGgGp.mjs} +2 -2
- package/dist/{preview-B_vJLvf8.mjs.map → preview-BxwsGgGp.mjs.map} +1 -1
- package/dist/{protocol-JdD2YhY9.d.mts → protocol-CLn58-nw.d.mts} +2 -2
- package/dist/{protocol-JdD2YhY9.d.mts.map → protocol-CLn58-nw.d.mts.map} +1 -1
- package/dist/{public-url-CarhZJgf.mjs → public-url-FWWAvnre.mjs} +1 -1
- package/dist/{public-url-CarhZJgf.mjs.map → public-url-FWWAvnre.mjs.map} +1 -1
- package/dist/{query-BZKZcG5b.mjs → query-DygOte9M.mjs} +25 -16
- package/dist/query-DygOte9M.mjs.map +1 -0
- package/dist/{query-BndaFxxp.mjs → query-gtXT03Wc.mjs} +4 -4
- package/dist/{query-BndaFxxp.mjs.map → query-gtXT03Wc.mjs.map} +1 -1
- package/dist/{rate-limit-BZmATC6W.mjs → rate-limit-CQUPm0dh.mjs} +2 -2
- package/dist/{rate-limit-BZmATC6W.mjs.map → rate-limit-CQUPm0dh.mjs.map} +1 -1
- package/dist/{redirect-CzqnLxK-.mjs → redirect-D1cWafi6.mjs} +1 -1
- package/dist/{redirect-CzqnLxK-.mjs.map → redirect-D1cWafi6.mjs.map} +1 -1
- package/dist/{redirect-CZkbozu9.mjs → redirect-DId44BS1.mjs} +19 -6
- package/dist/redirect-DId44BS1.mjs.map +1 -0
- package/dist/{redirects-CqzNM0KM.mjs → redirects-DN-ZE33W.mjs} +5 -5
- package/dist/{redirects-CqzNM0KM.mjs.map → redirects-DN-ZE33W.mjs.map} +1 -1
- package/dist/{registry-AZAsRsor.mjs → registry-DTqaqxed.mjs} +26 -10
- package/dist/registry-DTqaqxed.mjs.map +1 -0
- package/dist/{relation-04DfKRTO.mjs → relation-DxgCHOBw.mjs} +2 -2
- package/dist/{relation-04DfKRTO.mjs.map → relation-DxgCHOBw.mjs.map} +1 -1
- package/dist/{relations-CcFwDJdJ.mjs → relations-KKDSLUwS.mjs} +4 -4
- package/dist/{relations-CcFwDJdJ.mjs.map → relations-KKDSLUwS.mjs.map} +1 -1
- package/dist/{relations-C4htk5sb.mjs → relations-rOmbndUJ.mjs} +3 -3
- package/dist/{relations-C4htk5sb.mjs.map → relations-rOmbndUJ.mjs.map} +1 -1
- package/dist/{request-cache-DH9zdCOD.mjs → request-cache-DAZZmesc.mjs} +1 -1
- package/dist/{request-cache-DH9zdCOD.mjs.map → request-cache-DAZZmesc.mjs.map} +1 -1
- package/dist/request-context.d.mts +1 -1
- package/dist/{request-meta-DYxLlnmz.mjs → request-meta-BgjUQLQ-.mjs} +2 -2
- package/dist/{request-meta-DYxLlnmz.mjs.map → request-meta-BgjUQLQ-.mjs.map} +1 -1
- package/dist/{resolve-prZ3mP7l.mjs → resolve-Cy0aWSRj.mjs} +37 -4
- package/dist/resolve-Cy0aWSRj.mjs.map +1 -0
- package/dist/{runner-YKfIMnaF.d.mts → runner-CfwysRM0.d.mts} +2 -2
- package/dist/{runner-YKfIMnaF.d.mts.map → runner-CfwysRM0.d.mts.map} +1 -1
- package/dist/{runner-BLIDKpmA.mjs → runner-nEzvnogG.mjs} +419 -295
- package/dist/runner-nEzvnogG.mjs.map +1 -0
- package/dist/runtime.d.mts +11 -11
- package/dist/runtime.mjs +3 -2
- package/dist/runtime.mjs.map +1 -1
- package/dist/{schema-CGnBeLiW.mjs → schema-CRu38Pr5.mjs} +3 -3
- package/dist/{schema-CGnBeLiW.mjs.map → schema-CRu38Pr5.mjs.map} +1 -1
- package/dist/{schema-DYr-Vd-L.mjs → schema-DifxndJx.mjs} +4 -4
- package/dist/{schema-DYr-Vd-L.mjs.map → schema-DifxndJx.mjs.map} +1 -1
- package/dist/{scopes-BhWvBavj.mjs → scopes-D5A1OZbq.mjs} +3 -3
- package/dist/{scopes-BhWvBavj.mjs.map → scopes-D5A1OZbq.mjs.map} +1 -1
- package/dist/{search-C-qDk4kx.mjs → search-DEPFSBFq.mjs} +4 -4
- package/dist/{search-C-qDk4kx.mjs.map → search-DEPFSBFq.mjs.map} +1 -1
- package/dist/{secrets-rEtHt-6z.mjs → secrets-CdfzLdoO.mjs} +3 -3
- package/dist/{secrets-rEtHt-6z.mjs.map → secrets-CdfzLdoO.mjs.map} +1 -1
- package/dist/{sections-B_nYvlwn.mjs → sections-3X52kmIR.mjs} +2 -2
- package/dist/{sections-B_nYvlwn.mjs.map → sections-3X52kmIR.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +26 -24
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.d.mts.map +1 -1
- package/dist/seo/index.mjs +18 -19
- package/dist/seo/index.mjs.map +1 -1
- package/dist/{seo-926NRIgt.mjs → seo-Bw68KxRc.mjs} +2 -2
- package/dist/{seo-926NRIgt.mjs.map → seo-Bw68KxRc.mjs.map} +1 -1
- package/dist/{seo-CVWkdv6x.mjs → seo-C4AmbsMU.mjs} +3 -2
- package/dist/seo-C4AmbsMU.mjs.map +1 -0
- package/dist/{service-CJl3ZAYs.mjs → service-J_-Vgo7R.mjs} +2 -2
- package/dist/{service-CJl3ZAYs.mjs.map → service-J_-Vgo7R.mjs.map} +1 -1
- package/dist/{session-user-BlMgqCHS.mjs → session-user-CbnMMwk6.mjs} +1 -1
- package/dist/{session-user-BlMgqCHS.mjs.map → session-user-CbnMMwk6.mjs.map} +1 -1
- package/dist/{settings-Cwm6o2jY.mjs → settings-AnEFYICn.mjs} +3 -3
- package/dist/{settings-Cwm6o2jY.mjs.map → settings-AnEFYICn.mjs.map} +1 -1
- package/dist/{settings--wobrkkC.mjs → settings-DcMjREe5.mjs} +6 -6
- package/dist/{settings--wobrkkC.mjs.map → settings-DcMjREe5.mjs.map} +1 -1
- package/dist/{setup-complete-DQbClIN2.mjs → setup-complete-BClXXTvr.mjs} +2 -2
- package/dist/{setup-complete-DQbClIN2.mjs.map → setup-complete-BClXXTvr.mjs.map} +1 -1
- package/dist/{setup-nonce-DZCFS2sn.mjs → setup-nonce-BheRa4RG.mjs} +1 -1
- package/dist/{setup-nonce-DZCFS2sn.mjs.map → setup-nonce-BheRa4RG.mjs.map} +1 -1
- package/dist/{single-flight-cache-BPuGPdcN.mjs → single-flight-cache-jaswDzmQ.mjs} +2 -2
- package/dist/{single-flight-cache-BPuGPdcN.mjs.map → single-flight-cache-jaswDzmQ.mjs.map} +1 -1
- package/dist/{site-url-BrxA_E9H.mjs → site-url-Bqf-ea3N.mjs} +3 -3
- package/dist/{site-url-BrxA_E9H.mjs.map → site-url-Bqf-ea3N.mjs.map} +1 -1
- package/dist/{snapshot--OCDTqdb.mjs → snapshot-C4CtXntb.mjs} +51 -35
- package/dist/snapshot-C4CtXntb.mjs.map +1 -0
- package/dist/{ssrf-5sIM5jzl.mjs → ssrf-gl4gFNhw.mjs} +148 -91
- package/dist/ssrf-gl4gFNhw.mjs.map +1 -0
- package/dist/{state-BpFVsJZB.mjs → state-1F6IOhdQ.mjs} +1 -1
- package/dist/{state-BpFVsJZB.mjs.map → state-1F6IOhdQ.mjs.map} +1 -1
- package/dist/{status-B777-dXz.mjs → status-Cenfk_r5.mjs} +1 -1
- package/dist/{status-B777-dXz.mjs.map → status-Cenfk_r5.mjs.map} +1 -1
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +1 -1
- package/dist/{target-BmR0iTwz.mjs → target-CRzeTs8G.mjs} +1 -1
- package/dist/{target-BmR0iTwz.mjs.map → target-CRzeTs8G.mjs.map} +1 -1
- package/dist/{taxonomies-DkAkMupr.mjs → taxonomies-BOdxuZpV.mjs} +11 -4
- package/dist/taxonomies-BOdxuZpV.mjs.map +1 -0
- package/dist/{taxonomies-Wfy_Lg12.mjs → taxonomies-NcFDq5Gg.mjs} +23 -14
- package/dist/taxonomies-NcFDq5Gg.mjs.map +1 -0
- package/dist/{taxonomy-tJepplLL.mjs → taxonomy-DP1vny4K.mjs} +11 -3
- package/dist/{taxonomy-tJepplLL.mjs.map → taxonomy-DP1vny4K.mjs.map} +1 -1
- package/dist/{tokens-BCO1oruF.mjs → tokens-CDk8ox9p.mjs} +1 -1
- package/dist/{tokens-BCO1oruF.mjs.map → tokens-CDk8ox9p.mjs.map} +1 -1
- package/dist/{transport-xh6YKW2G.d.mts → transport-BVn4tVb9.d.mts} +1 -1
- package/dist/{transport-xh6YKW2G.d.mts.map → transport-BVn4tVb9.d.mts.map} +1 -1
- package/dist/{transport-Dr3qtwXC.mjs → transport-DP0JI-8i.mjs} +1 -1
- package/dist/{transport-Dr3qtwXC.mjs.map → transport-DP0JI-8i.mjs.map} +1 -1
- package/dist/{trusted-proxy-BR5F1Otp.mjs → trusted-proxy-BTM6UxqD.mjs} +1 -1
- package/dist/{trusted-proxy-BR5F1Otp.mjs.map → trusted-proxy-BTM6UxqD.mjs.map} +1 -1
- package/dist/{types-CXFkwEGC.d.mts → types-2n848aVW.d.mts} +1 -1
- package/dist/{types-CXFkwEGC.d.mts.map → types-2n848aVW.d.mts.map} +1 -1
- package/dist/{types-75KIqzL9.mjs → types-BMXnRIrX.mjs} +4 -2
- package/dist/types-BMXnRIrX.mjs.map +1 -0
- package/dist/{types-B6GrPic4.d.mts → types-BouXpOsa.d.mts} +115 -4
- package/dist/types-BouXpOsa.d.mts.map +1 -0
- package/dist/{types-3qNFPlci.mjs → types-ByG2coLw.mjs} +1 -1
- package/dist/{types-3qNFPlci.mjs.map → types-ByG2coLw.mjs.map} +1 -1
- package/dist/types-CQPWhPxE.mjs.map +1 -1
- package/dist/{types-CDtkNSFQ.d.mts → types-DEfNJ__A.d.mts} +1 -1
- package/dist/{types-CDtkNSFQ.d.mts.map → types-DEfNJ__A.d.mts.map} +1 -1
- package/dist/{types-xDMtUFnO.d.mts → types-DKcKSbtB.d.mts} +23 -7
- package/dist/types-DKcKSbtB.d.mts.map +1 -0
- package/dist/{types-C00oyCZp.d.mts → types-DRYs7uTL.d.mts} +1 -1
- package/dist/{types-C00oyCZp.d.mts.map → types-DRYs7uTL.d.mts.map} +1 -1
- package/dist/{types-DczELMop.d.mts → types-DaEg7KX2.d.mts} +1 -1
- package/dist/{types-DczELMop.d.mts.map → types-DaEg7KX2.d.mts.map} +1 -1
- package/dist/{types-BuHW4xDE.d.mts → types-LU8utpP_.d.mts} +6 -3
- package/dist/types-LU8utpP_.d.mts.map +1 -0
- package/dist/{types-CPeXo1wF.d.mts → types-VpYfPUxN.d.mts} +1 -1
- package/dist/{types-CPeXo1wF.d.mts.map → types-VpYfPUxN.d.mts.map} +1 -1
- package/dist/{types-DM3vioBY.mjs → types-c9GP7Dj5.mjs} +1 -1
- package/dist/{types-DM3vioBY.mjs.map → types-c9GP7Dj5.mjs.map} +1 -1
- package/dist/{types-FV23hEoW.d.mts → types-tJWDK__M.d.mts} +14 -1
- package/dist/types-tJWDK__M.d.mts.map +1 -0
- package/dist/{upload-attempts-BsqoQ1fn.mjs → upload-attempts-C6S2y-lp.mjs} +1 -1
- package/dist/{upload-attempts-BsqoQ1fn.mjs.map → upload-attempts-C6S2y-lp.mjs.map} +1 -1
- package/dist/{url-pattern-D4c2czpJ.mjs → url-pattern-UYtxVTuj.mjs} +1 -1
- package/dist/{url-pattern-D4c2czpJ.mjs.map → url-pattern-UYtxVTuj.mjs.map} +1 -1
- package/dist/{user-BTZ40aq6.mjs → user-DIsIXogT.mjs} +2 -2
- package/dist/{user-BTZ40aq6.mjs.map → user-DIsIXogT.mjs.map} +1 -1
- package/dist/{utils-BKvNjjhY.mjs → utils-BicP5Qbg.mjs} +2 -2
- package/dist/{utils-BKvNjjhY.mjs.map → utils-BicP5Qbg.mjs.map} +1 -1
- package/dist/{validate-DE_LRwo9.mjs → validate-D8VPn4Hv.mjs} +8 -3
- package/dist/validate-D8VPn4Hv.mjs.map +1 -0
- package/dist/{validate-DUP27OYD.d.mts → validate-Df6Dvwbw.d.mts} +12 -7
- package/dist/validate-Df6Dvwbw.d.mts.map +1 -0
- package/dist/{validation-BMImFJ11.mjs → validation-CzMJn9Ku.mjs} +13 -11
- package/dist/{validation-BMImFJ11.mjs.map → validation-CzMJn9Ku.mjs.map} +1 -1
- package/dist/version-CK67_SXX.mjs +7 -0
- package/dist/{version-Bii3suaO.mjs.map → version-CK67_SXX.mjs.map} +1 -1
- package/dist/{widgets-D3gJ10xU.mjs → widgets-RFVAxQl3.mjs} +5 -5
- package/dist/{widgets-D3gJ10xU.mjs.map → widgets-RFVAxQl3.mjs.map} +1 -1
- package/dist/{wxr-taxonomies-B2Og_6rU.d.mts → wxr-taxonomies-BX4yQL9s.d.mts} +1 -1
- package/dist/{wxr-taxonomies-B2Og_6rU.d.mts.map → wxr-taxonomies-BX4yQL9s.d.mts.map} +1 -1
- package/dist/{wxr-taxonomies-Cxngsjwo.mjs → wxr-taxonomies-Csdp7yde.mjs} +4 -4
- package/dist/{wxr-taxonomies-Cxngsjwo.mjs.map → wxr-taxonomies-Csdp7yde.mjs.map} +1 -1
- package/dist/{zod-generator-BuYSQJB7.mjs → zod-generator-CNRGdnBY.mjs} +3 -3
- package/dist/{zod-generator-BuYSQJB7.mjs.map → zod-generator-CNRGdnBY.mjs.map} +1 -1
- package/package.json +12 -10
- package/src/api/errors.ts +7 -0
- package/src/api/handlers/content.ts +66 -79
- package/src/api/handlers/entry-lock.ts +206 -0
- package/src/api/handlers/manifest.ts +1 -0
- package/src/api/handlers/marketplace.ts +28 -20
- package/src/api/handlers/menus.ts +9 -0
- package/src/api/handlers/registry.ts +13 -8
- package/src/api/handlers/revision.ts +2 -1
- package/src/api/handlers/seo.ts +10 -1
- package/src/api/handlers/snapshot.ts +84 -72
- package/src/api/handlers/taxonomies.ts +9 -0
- package/src/api/openapi/document.ts +111 -6
- package/src/api/schemas/content.ts +8 -0
- package/src/api/schemas/entry-lock.ts +48 -0
- package/src/api/schemas/index.ts +1 -0
- package/src/api/schemas/schema.ts +10 -1
- package/src/api/types.ts +2 -0
- package/src/astro/integration/index.ts +9 -6
- package/src/astro/integration/routes.ts +5 -0
- package/src/astro/integration/runtime.ts +13 -5
- package/src/astro/integration/vite-config.ts +30 -0
- package/src/astro/middleware.ts +16 -0
- package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +10 -0
- package/src/astro/routes/api/content/[collection]/[id]/lock.ts +133 -0
- package/src/astro/routes/api/content/[collection]/[id]/publish.ts +11 -1
- package/src/astro/routes/api/content/[collection]/[id]/schedule.ts +20 -0
- package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +10 -0
- package/src/astro/routes/api/content/[collection]/[id].ts +27 -2
- package/src/astro/routes/api/content/[collection]/index.ts +3 -0
- package/src/astro/routes/sitemap-[collection].xml.ts +4 -0
- package/src/astro/types.ts +13 -3
- package/src/cli/commands/content.ts +31 -5
- package/src/cli/commands/export-seed.ts +2 -0
- package/src/client/index.ts +34 -7
- package/src/components/EmDashBodyEnd.astro +4 -1
- package/src/components/EmDashBodyStart.astro +4 -1
- package/src/components/EmDashHead.astro +35 -16
- package/src/components/Gallery.astro +18 -4
- package/src/components/InlineEditor.astro +3 -1
- package/src/components/InlinePortableTextEditor.tsx +106 -11
- package/src/components/PortableText.astro +4 -0
- package/src/components/Table.astro +147 -62
- package/src/config/errors.ts +13 -0
- package/src/content/converters/portable-text-to-prosemirror.ts +26 -2
- package/src/content/converters/prosemirror-to-portable-text.ts +35 -6
- package/src/content/converters/types.ts +10 -0
- package/src/database/dialect-helpers.ts +125 -0
- package/src/database/migrations/075_entry_edit_locks.ts +44 -0
- package/src/database/migrations/076_collection_nav_group.ts +22 -0
- package/src/database/migrations/077_plugin_storage_revisions.ts +89 -0
- package/src/database/migrations/runner.ts +6 -0
- package/src/database/repositories/content.ts +170 -1
- package/src/database/repositories/entry-locks.ts +257 -0
- package/src/database/repositories/options.ts +69 -5
- package/src/database/repositories/plugin-storage.ts +159 -0
- package/src/database/repositories/redirect.ts +17 -6
- package/src/database/repositories/taxonomy.ts +8 -0
- package/src/database/repositories/types.ts +3 -0
- package/src/database/types.ts +15 -1
- package/src/emdash-runtime.ts +117 -50
- package/src/i18n/resolve.ts +44 -4
- package/src/index.ts +14 -0
- package/src/loader.ts +35 -4
- package/src/mcp/server.ts +23 -5
- package/src/media/responsive.ts +23 -0
- package/src/media/usage/content-refresh.ts +2 -1
- package/src/menus/index.ts +17 -21
- package/src/page/seo-contributions.ts +78 -1
- package/src/page/seo-panel.ts +47 -0
- package/src/plugin-types.ts +9 -0
- package/src/plugins/conditional-storage.ts +30 -0
- package/src/plugins/context.ts +49 -17
- package/src/plugins/hooks.ts +7 -1
- package/src/plugins/index.ts +9 -0
- package/src/plugins/manager.ts +5 -2
- package/src/plugins/sandbox/types.ts +16 -2
- package/src/plugins/storage-query.ts +45 -0
- package/src/plugins/storage-update.ts +96 -0
- package/src/plugins/types.ts +114 -0
- package/src/query.ts +29 -3
- package/src/registry/config.ts +130 -27
- package/src/registry/types.ts +5 -6
- package/src/schema/collection-slugs-cache.ts +157 -0
- package/src/schema/registry.ts +19 -0
- package/src/schema/types.ts +25 -6
- package/src/security/ssrf.ts +167 -141
- package/src/seed/apply.ts +4 -0
- package/src/seed/types.ts +7 -2
- package/src/seed/validate.ts +18 -1
- package/src/seo/hreflang.ts +1 -0
- package/src/seo/index.ts +5 -10
- package/src/seo/media-url.ts +26 -0
- package/src/taxonomies/term-counts.ts +22 -5
- package/dist/api-Dz6rgoa3.mjs.map +0 -1
- package/dist/apply-B4SIOxR1.mjs.map +0 -1
- package/dist/config-it29yDLA.mjs.map +0 -1
- package/dist/content-DjvM0T92.mjs.map +0 -1
- package/dist/context-CX6gxOLW.mjs.map +0 -1
- package/dist/dialect-helpers-BSbfaO3F.mjs.map +0 -1
- package/dist/errors-DsVoDUjJ.mjs.map +0 -1
- package/dist/index-BJNMCWmu.d.mts.map +0 -1
- package/dist/loader-Z8vl7zTq.mjs.map +0 -1
- package/dist/media-url-DHoPr0hq.mjs.map +0 -1
- package/dist/menus-6qSwTNxG.mjs.map +0 -1
- package/dist/options-BHPeIbBd.mjs.map +0 -1
- package/dist/options-CYb4y7hM.d.mts.map +0 -1
- package/dist/query-BZKZcG5b.mjs.map +0 -1
- package/dist/redirect-CZkbozu9.mjs.map +0 -1
- package/dist/redirects-BLNOWQTn.mjs.map +0 -1
- package/dist/registry-AZAsRsor.mjs.map +0 -1
- package/dist/relations-DnRK4YIT.d.mts.map +0 -1
- package/dist/resolve-prZ3mP7l.mjs.map +0 -1
- package/dist/runner-BLIDKpmA.mjs.map +0 -1
- package/dist/seo-CVWkdv6x.mjs.map +0 -1
- package/dist/snapshot--OCDTqdb.mjs.map +0 -1
- package/dist/ssrf-5sIM5jzl.mjs.map +0 -1
- package/dist/taxonomies-DkAkMupr.mjs.map +0 -1
- package/dist/taxonomies-Wfy_Lg12.mjs.map +0 -1
- package/dist/types-75KIqzL9.mjs.map +0 -1
- package/dist/types-B6GrPic4.d.mts.map +0 -1
- package/dist/types-BuHW4xDE.d.mts.map +0 -1
- package/dist/types-FV23hEoW.d.mts.map +0 -1
- package/dist/types-xDMtUFnO.d.mts.map +0 -1
- package/dist/validate-DE_LRwo9.mjs.map +0 -1
- package/dist/validate-DUP27OYD.d.mts.map +0 -1
- package/dist/version-Bii3suaO.mjs +0 -7
- /package/dist/{api-tokens-BfYts-sq.mjs → api-tokens-B_lfpmH3.mjs} +0 -0
- /package/dist/{ssrf-Dg3cIT-b.mjs → ssrf-TQhaljuI.mjs} +0 -0
- /package/dist/{types-DfuTR6dL.mjs → types-A2cN6a4a.mjs} +0 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { validateJsonFieldName } from "../database/validate.js";
|
|
2
|
+
import type { RangeFilter, WhereClause, WhereValue } from "./types.js";
|
|
3
|
+
|
|
4
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
5
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function requireRecord(value: unknown, label: string): Record<string, unknown> {
|
|
9
|
+
if (!isRecord(value)) {
|
|
10
|
+
throw new TypeError(`${label} must be an object`);
|
|
11
|
+
}
|
|
12
|
+
const prototype: unknown = Object.getPrototypeOf(value);
|
|
13
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
14
|
+
throw new TypeError(`${label} must be a plain object`);
|
|
15
|
+
}
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function operand(value: unknown): string | number {
|
|
20
|
+
if (typeof value === "string" || (typeof value === "number" && Number.isFinite(value))) {
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
throw new TypeError("Storage guard operands must be strings or finite numbers");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function normalizeFilter(value: unknown): WhereValue {
|
|
27
|
+
if (value === null || typeof value === "boolean") return value;
|
|
28
|
+
if (typeof value === "string" || typeof value === "number") return operand(value);
|
|
29
|
+
const filter = requireRecord(value, "Storage guard filter");
|
|
30
|
+
const values = filter.in;
|
|
31
|
+
if (Array.isArray(values)) {
|
|
32
|
+
return { in: Array.from(values, operand) };
|
|
33
|
+
}
|
|
34
|
+
const prefix = filter.startsWith;
|
|
35
|
+
if (typeof prefix === "string") {
|
|
36
|
+
return { startsWith: prefix };
|
|
37
|
+
}
|
|
38
|
+
const range: RangeFilter = {};
|
|
39
|
+
for (const key of ["gt", "gte", "lt", "lte"] as const) {
|
|
40
|
+
if (key in filter) {
|
|
41
|
+
const bound = filter[key];
|
|
42
|
+
range[key] = bound === undefined ? undefined : operand(bound);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return range;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function parseStorageUpdate(value: unknown): {
|
|
49
|
+
where: WhereClause;
|
|
50
|
+
setEntries: Array<[string, unknown]>;
|
|
51
|
+
deltaEntries: Array<[string, number]>;
|
|
52
|
+
} {
|
|
53
|
+
const args = requireRecord(value, "Storage update arguments");
|
|
54
|
+
if (Object.keys(args).some((key) => key !== "where" && key !== "set" && key !== "delta")) {
|
|
55
|
+
throw new TypeError("Unknown storage update argument");
|
|
56
|
+
}
|
|
57
|
+
const where: WhereClause = {};
|
|
58
|
+
for (const [field, filter] of Object.entries(requireRecord(args.where, "Storage where guard"))) {
|
|
59
|
+
validateJsonFieldName(field);
|
|
60
|
+
where[field] = normalizeFilter(filter);
|
|
61
|
+
}
|
|
62
|
+
const set = args.set === undefined ? {} : requireRecord(args.set, "Storage set");
|
|
63
|
+
const delta = args.delta === undefined ? {} : requireRecord(args.delta, "Storage delta");
|
|
64
|
+
const setEntries: Array<[string, unknown]> = [];
|
|
65
|
+
for (const [field, entry] of Object.entries(set)) {
|
|
66
|
+
if (entry === undefined) continue;
|
|
67
|
+
validateJsonFieldName(field);
|
|
68
|
+
const serialized = JSON.stringify(entry);
|
|
69
|
+
if (serialized === undefined)
|
|
70
|
+
throw new TypeError("Storage set values must be JSON serializable");
|
|
71
|
+
const normalized: unknown = JSON.parse(serialized);
|
|
72
|
+
setEntries.push([field, normalized]);
|
|
73
|
+
}
|
|
74
|
+
const setFields = new Set(setEntries.map(([field]) => field));
|
|
75
|
+
const deltaEntries: Array<[string, number]> = [];
|
|
76
|
+
for (const [field, entry] of Object.entries(delta)) {
|
|
77
|
+
if (entry === undefined) continue;
|
|
78
|
+
validateJsonFieldName(field);
|
|
79
|
+
if (setFields.has(field)) throw new TypeError("Storage field appears in both set and delta");
|
|
80
|
+
const spec = requireRecord(entry, "Storage numeric delta");
|
|
81
|
+
const keys = Object.keys(spec);
|
|
82
|
+
const key = keys[0];
|
|
83
|
+
if (keys.length !== 1 || (key !== "inc" && key !== "dec")) {
|
|
84
|
+
throw new TypeError("Storage delta must contain exactly one of inc or dec");
|
|
85
|
+
}
|
|
86
|
+
const amount = spec[key];
|
|
87
|
+
if (typeof amount !== "number" || !Number.isSafeInteger(amount)) {
|
|
88
|
+
throw new TypeError("Storage delta must be a safe integer");
|
|
89
|
+
}
|
|
90
|
+
deltaEntries.push([field, key === "dec" ? -amount : amount]);
|
|
91
|
+
}
|
|
92
|
+
if (setEntries.length + deltaEntries.length === 0) {
|
|
93
|
+
throw new TypeError("Storage update requires at least one of set or delta");
|
|
94
|
+
}
|
|
95
|
+
return { where, setEntries, deltaEntries };
|
|
96
|
+
}
|
package/src/plugins/types.ts
CHANGED
|
@@ -135,6 +135,71 @@ export interface PaginatedResult<T> {
|
|
|
135
135
|
hasMore: boolean;
|
|
136
136
|
}
|
|
137
137
|
|
|
138
|
+
export interface VersionedValue<T = unknown> {
|
|
139
|
+
value: T;
|
|
140
|
+
/** Opaque host revision, valid only for the key from which it was read. */
|
|
141
|
+
revision: string;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export type ConditionalWriteResult = { applied: true; revision: string } | { applied: false };
|
|
145
|
+
|
|
146
|
+
export interface ConditionalDeleteResult {
|
|
147
|
+
applied: boolean;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* A single per-field integer delta for {@link StorageCollection.updateIf}.
|
|
152
|
+
*
|
|
153
|
+
* `inc`/`dec` values must be safe integers, enforced at runtime with
|
|
154
|
+
* `Number.isSafeInteger` (which also rejects `NaN`/`Infinity`), because a TS
|
|
155
|
+
* `number` cannot forbid float literals. Deltas are applied entirely in-SQL
|
|
156
|
+
* over the stored value with `COALESCE(<value>, 0) ± n`, so a delta on a
|
|
157
|
+
* missing or JSON-`null` field starts from `0` (never corrupts the document).
|
|
158
|
+
*
|
|
159
|
+
* `updateIf` does NOT clamp: a `dec` can drive a field negative when the
|
|
160
|
+
* `where` guard doesn't cover the delta magnitude (e.g. stock `2` with
|
|
161
|
+
* `where: { stock: { gte: 1 } }` and `delta: { stock: { dec: 3 } }` → `-1`,
|
|
162
|
+
* `applied: true`). The guard is the caller's responsibility — pair a `dec: k`
|
|
163
|
+
* with a `gte: k` guard to prevent underflow.
|
|
164
|
+
*/
|
|
165
|
+
export type NumericDelta = { inc: number } | { dec: number };
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Arguments to {@link StorageCollection.updateIf}.
|
|
169
|
+
*
|
|
170
|
+
* `where` reuses the {@link QueryOptions} `WhereClause` verbatim — the guard is
|
|
171
|
+
* evaluated in-SQL with the same numeric-correct, total comparisons as
|
|
172
|
+
* `query()`. An empty `where: {}` emits no guard, i.e. it matches the row
|
|
173
|
+
* unconditionally (update-if-row-exists) — a footgun in the no-oversell case,
|
|
174
|
+
* where a real predicate (e.g. `{ stock: { gte: 1 } }`) is what you want.
|
|
175
|
+
*
|
|
176
|
+
* At least one of `set` / `delta` must be present (a runtime error is thrown
|
|
177
|
+
* otherwise). A field may not appear in both `set` and `delta` in the same
|
|
178
|
+
* call. `set` and `delta` are separate arguments (not a union) so a wholesale
|
|
179
|
+
* value that happens to look like `{ inc: 5 }` is never mistaken for a delta.
|
|
180
|
+
*/
|
|
181
|
+
export interface UpdateIfArgs<T> {
|
|
182
|
+
/**
|
|
183
|
+
* Guard evaluated in-SQL; identical semantics to `query({ where })`. An
|
|
184
|
+
* empty `{}` means "match the row unconditionally (no guard)".
|
|
185
|
+
*/
|
|
186
|
+
where: WhereClause;
|
|
187
|
+
/** Wholesale field values merged into the stored JSON document. */
|
|
188
|
+
set?: Partial<T>;
|
|
189
|
+
/** Per-field integer deltas applied in-SQL (`COALESCE(base, 0) ± n`). */
|
|
190
|
+
delta?: { [K in keyof T]?: NumericDelta };
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Result of {@link StorageCollection.updateIf}.
|
|
195
|
+
*
|
|
196
|
+
* `applied: false` intentionally conflates "row absent" and "guard failed": a
|
|
197
|
+
* single-statement guarded `UPDATE` cannot distinguish them, and the caller
|
|
198
|
+
* should not need to. `updateIf` is update-only — it never inserts a missing
|
|
199
|
+
* row.
|
|
200
|
+
*/
|
|
201
|
+
export type UpdateIfResult<T> = { applied: true; data: T } | { applied: false };
|
|
202
|
+
|
|
138
203
|
/**
|
|
139
204
|
* Storage collection interface - the API exposed to plugins
|
|
140
205
|
* No async iterators - all operations return promises with pagination
|
|
@@ -145,6 +210,15 @@ export interface StorageCollection<T = unknown> {
|
|
|
145
210
|
put(id: string, data: T): Promise<void>;
|
|
146
211
|
delete(id: string): Promise<boolean>;
|
|
147
212
|
exists(id: string): Promise<boolean>;
|
|
213
|
+
/** A stored JSON null returns an envelope with value: null; only an absent row returns null. */
|
|
214
|
+
getVersioned(id: string): Promise<VersionedValue<T> | null>;
|
|
215
|
+
/** A null expected revision creates only when absent. Errors reject; conflicts return applied: false. */
|
|
216
|
+
compareAndSet(
|
|
217
|
+
id: string,
|
|
218
|
+
expectedRevision: string | null,
|
|
219
|
+
data: T,
|
|
220
|
+
): Promise<ConditionalWriteResult>;
|
|
221
|
+
compareAndDelete(id: string, expectedRevision: string): Promise<ConditionalDeleteResult>;
|
|
148
222
|
|
|
149
223
|
// Batch operations
|
|
150
224
|
getMany(ids: string[]): Promise<Map<string, T>>;
|
|
@@ -154,6 +228,23 @@ export interface StorageCollection<T = unknown> {
|
|
|
154
228
|
// Query - always paginated
|
|
155
229
|
query(options?: QueryOptions): Promise<PaginatedResult<{ id: string; data: T }>>;
|
|
156
230
|
count(where?: WhereClause): Promise<number>;
|
|
231
|
+
|
|
232
|
+
// Conditional write (single-statement, atomic per row).
|
|
233
|
+
/**
|
|
234
|
+
* Predicate-guarded atomic update. Applies `set`/`delta` to the row `id`
|
|
235
|
+
* only if it exists and the `where` guard matches, in a single guarded
|
|
236
|
+
* `UPDATE … RETURNING`. This is the no-oversell primitive: the guard and the
|
|
237
|
+
* arithmetic live in one statement, so N concurrent guarded decrements
|
|
238
|
+
* serialize correctly. `applied: false` means the row was absent OR the
|
|
239
|
+
* guard failed (the two are intentionally indistinguishable). Non-object
|
|
240
|
+
* documents, invalid counters and unsafe arithmetic results also fail the
|
|
241
|
+
* guard. Never inserts.
|
|
242
|
+
*
|
|
243
|
+
* Serialization failures and deadlocks throw `StorageSerializationError`.
|
|
244
|
+
* Retry the write with a bounded policy; restart an explicit transaction
|
|
245
|
+
* before retrying its operations.
|
|
246
|
+
*/
|
|
247
|
+
updateIf(id: string, args: UpdateIfArgs<T>): Promise<UpdateIfResult<T>>;
|
|
157
248
|
}
|
|
158
249
|
|
|
159
250
|
/**
|
|
@@ -176,6 +267,14 @@ export type PluginStorage<T extends PluginStorageConfig> = {
|
|
|
176
267
|
*/
|
|
177
268
|
export interface KVAccess {
|
|
178
269
|
get<T>(key: string): Promise<T | null>;
|
|
270
|
+
getVersioned<T>(key: string): Promise<VersionedValue<T> | null>;
|
|
271
|
+
/** A null expected revision creates only when absent. Errors reject; conflicts return applied: false. */
|
|
272
|
+
compareAndSet(
|
|
273
|
+
key: string,
|
|
274
|
+
expectedRevision: string | null,
|
|
275
|
+
value: unknown,
|
|
276
|
+
): Promise<ConditionalWriteResult>;
|
|
277
|
+
compareAndDelete(key: string, expectedRevision: string): Promise<ConditionalDeleteResult>;
|
|
179
278
|
set(key: string, value: unknown): Promise<void>;
|
|
180
279
|
delete(key: string): Promise<boolean>;
|
|
181
280
|
list(prefix?: string): Promise<Array<{ key: string; value: unknown }>>;
|
|
@@ -804,6 +903,15 @@ export interface HookConfig<THandler> {
|
|
|
804
903
|
handler: THandler;
|
|
805
904
|
}
|
|
806
905
|
|
|
906
|
+
/**
|
|
907
|
+
* Acting user that triggered a content hook. Present for authenticated
|
|
908
|
+
* saves; absent for unauthenticated or internal writes.
|
|
909
|
+
*/
|
|
910
|
+
export interface ActorInfo {
|
|
911
|
+
readonly id: string;
|
|
912
|
+
readonly role: number;
|
|
913
|
+
}
|
|
914
|
+
|
|
807
915
|
/**
|
|
808
916
|
* Content hook event
|
|
809
917
|
*/
|
|
@@ -817,6 +925,12 @@ export interface ContentHookEvent {
|
|
|
817
925
|
* `content:afterSave`, where `content.id` carries it.
|
|
818
926
|
*/
|
|
819
927
|
id?: string;
|
|
928
|
+
/**
|
|
929
|
+
* The acting user for this save. Carries the same authenticated identity
|
|
930
|
+
* used to set the revision author, so plugins (e.g. audit logs) can record
|
|
931
|
+
* who made the change.
|
|
932
|
+
*/
|
|
933
|
+
actor?: ActorInfo;
|
|
820
934
|
}
|
|
821
935
|
|
|
822
936
|
/**
|
package/src/query.ts
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
* import resolves there at typecheck time without our help.
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
|
-
import { encodeCursor } from "./database/repositories/types.js";
|
|
27
|
+
import { encodeCursor, type ContentSeo } from "./database/repositories/types.js";
|
|
28
28
|
import { getFallbackChain, getI18nConfig, isI18nEnabled } from "./i18n/config.js";
|
|
29
29
|
import {
|
|
30
30
|
creditsFromFoldedBylines,
|
|
@@ -40,8 +40,10 @@ import {
|
|
|
40
40
|
contentNamespaces,
|
|
41
41
|
invalidateSchemaObjectCache,
|
|
42
42
|
} from "./object-cache/index.js";
|
|
43
|
+
import { primeSeoPanel } from "./page/seo-panel.js";
|
|
43
44
|
import { requestCached } from "./request-cache.js";
|
|
44
45
|
import { getRequestContext } from "./request-context.js";
|
|
46
|
+
import { resetRegisteredCollectionsCache } from "./schema/collection-slugs-cache.js";
|
|
45
47
|
import { compileUrlPattern } from "./schema/url-pattern.js";
|
|
46
48
|
import type { TaxonomyTerm } from "./taxonomies/types.js";
|
|
47
49
|
import { isMissingTableError } from "./utils/db-errors.js";
|
|
@@ -398,8 +400,21 @@ export async function getEmDashCollection<T extends string, D = InferCollectionD
|
|
|
398
400
|
// Cursor-paginated calls are exempt: their limit is part of the
|
|
399
401
|
// pagination contract.
|
|
400
402
|
const bucketed = bucketFilter(filter);
|
|
403
|
+
|
|
404
|
+
// Preview and edit-mode requests skip `loadCollectionCached`. That path
|
|
405
|
+
// reduces every entry to a JSON snapshot (`entrySnapshot`) and rebuilds it
|
|
406
|
+
// with `reviveEntry`, which cannot carry the `edit` proxy and re-attaches
|
|
407
|
+
// the no-op — so annotations spread as `{...entry.edit.title}` would render
|
|
408
|
+
// nothing on list pages. `getEmDashEntry` has the same bypass for the same
|
|
409
|
+
// reason (see its `serveDrafts` branch). The request-scoped cache still
|
|
410
|
+
// collapses duplicate queries within the render.
|
|
411
|
+
const ctx = getRequestContext();
|
|
412
|
+
const serveDrafts = ctx?.editMode === true || ctx?.preview !== undefined;
|
|
413
|
+
|
|
401
414
|
const cached = await requestCached(collectionCacheKey(type, bucketed.fetchFilter), () =>
|
|
402
|
-
|
|
415
|
+
serveDrafts
|
|
416
|
+
? getEmDashCollectionUncached<T, D>(type, bucketed.fetchFilter)
|
|
417
|
+
: loadCollectionCached<T, D>(type, bucketed.fetchFilter),
|
|
403
418
|
);
|
|
404
419
|
return bucketed.requestedLimit === undefined
|
|
405
420
|
? cached
|
|
@@ -979,6 +994,15 @@ export async function getEmDashEntry<T extends string, D = InferCollectionData<T
|
|
|
979
994
|
}
|
|
980
995
|
const revived = snapshot.value.entry ? reviveEntry<D>(snapshot.value.entry) : null;
|
|
981
996
|
if (revived && !canExposeRevisionMetadata(revived, type)) stripRevisionMetadata(revived);
|
|
997
|
+
if (revived) {
|
|
998
|
+
// On a warm object-cache hit the loader never runs, so prime the
|
|
999
|
+
// SEO panel cache from the snapshot's data (a no-op after a miss,
|
|
1000
|
+
// where the loader already primed).
|
|
1001
|
+
// eslint-disable-next-line typescript/no-unsafe-type-assertion -- snapshot `data` is always a record
|
|
1002
|
+
const { id: rowId, seo } = revived.data as Record<string, unknown>;
|
|
1003
|
+
// eslint-disable-next-line typescript/no-unsafe-type-assertion -- `data.seo` is written by the loader as ContentSeo
|
|
1004
|
+
if (seo && typeof rowId === "string") primeSeoPanel(type, rowId, seo as ContentSeo);
|
|
1005
|
+
}
|
|
982
1006
|
return {
|
|
983
1007
|
entry: revived,
|
|
984
1008
|
isPreview: snapshot.value.isPreview,
|
|
@@ -1326,11 +1350,13 @@ const urlPatternCache: UrlPatternCache =
|
|
|
1326
1350
|
* Call when collection URL patterns change (schema updates).
|
|
1327
1351
|
*
|
|
1328
1352
|
* Also busts the distributed schema cache (collection metadata such as
|
|
1329
|
-
* `commentsEnabled`, `supports`, fields read by `getCollectionInfo`)
|
|
1353
|
+
* `commentsEnabled`, `supports`, fields read by `getCollectionInfo`) and the
|
|
1354
|
+
* per-isolate registered-collection-slugs cache used by term counting, since
|
|
1330
1355
|
* every schema-mutation path already routes through here.
|
|
1331
1356
|
*/
|
|
1332
1357
|
export function invalidateUrlPatternCache(): void {
|
|
1333
1358
|
urlPatternCache.patterns = null;
|
|
1359
|
+
resetRegisteredCollectionsCache();
|
|
1334
1360
|
invalidateSchemaObjectCache();
|
|
1335
1361
|
}
|
|
1336
1362
|
|
package/src/registry/config.ts
CHANGED
|
@@ -41,6 +41,39 @@ export interface ManifestRegistryConfig {
|
|
|
41
41
|
};
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
export type RegistryConfigurationErrorCode =
|
|
45
|
+
| "REGISTRY_AGGREGATOR_URL_REQUIRED"
|
|
46
|
+
| "REGISTRY_AGGREGATOR_URL_INVALID"
|
|
47
|
+
| "REGISTRY_AGGREGATOR_URL_FORBIDDEN"
|
|
48
|
+
| "REGISTRY_MINIMUM_RELEASE_AGE_INVALID"
|
|
49
|
+
| "REGISTRY_MINIMUM_RELEASE_AGE_EXCLUDE_INVALID";
|
|
50
|
+
|
|
51
|
+
export type RegistryConfigurationField =
|
|
52
|
+
| "experimental.registry.aggregatorUrl"
|
|
53
|
+
| "experimental.registry.policy.minimumReleaseAge"
|
|
54
|
+
| "experimental.registry.policy.minimumReleaseAgeExclude";
|
|
55
|
+
|
|
56
|
+
export interface ManifestRegistryConfigurationError {
|
|
57
|
+
code: RegistryConfigurationErrorCode;
|
|
58
|
+
field: RegistryConfigurationField;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
class RegistryConfigurationError extends Error {
|
|
62
|
+
constructor(
|
|
63
|
+
public readonly code: RegistryConfigurationErrorCode,
|
|
64
|
+
public readonly field: RegistryConfigurationField,
|
|
65
|
+
message: string,
|
|
66
|
+
options?: ErrorOptions,
|
|
67
|
+
) {
|
|
68
|
+
super(`EmDash registry configuration error in ${field}: ${message}`, options);
|
|
69
|
+
this.name = "RegistryConfigurationError";
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
interface RegistryConfigurationValidationOptions {
|
|
74
|
+
allowLocalhost?: boolean;
|
|
75
|
+
}
|
|
76
|
+
|
|
44
77
|
/**
|
|
45
78
|
* Canonicalize a capabilities list for set-style comparison.
|
|
46
79
|
*
|
|
@@ -169,15 +202,27 @@ export function parseDurationSeconds(duration: string | number): number {
|
|
|
169
202
|
* own HTTPS bundle, defeating the checksum trust chain because the
|
|
170
203
|
* attacker controls the unsigned transport that supplied the checksum.
|
|
171
204
|
*/
|
|
172
|
-
export function validateAggregatorUrl(
|
|
205
|
+
export function validateAggregatorUrl(
|
|
206
|
+
aggregatorUrl: string,
|
|
207
|
+
options: RegistryConfigurationValidationOptions = {},
|
|
208
|
+
): URL {
|
|
173
209
|
let parsed: URL;
|
|
174
210
|
try {
|
|
175
211
|
parsed = new URL(aggregatorUrl);
|
|
176
|
-
} catch {
|
|
177
|
-
throw new
|
|
212
|
+
} catch (cause) {
|
|
213
|
+
throw new RegistryConfigurationError(
|
|
214
|
+
"REGISTRY_AGGREGATOR_URL_INVALID",
|
|
215
|
+
"experimental.registry.aggregatorUrl",
|
|
216
|
+
"must be a valid URL",
|
|
217
|
+
{ cause },
|
|
218
|
+
);
|
|
178
219
|
}
|
|
179
220
|
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
180
|
-
throw new
|
|
221
|
+
throw new RegistryConfigurationError(
|
|
222
|
+
"REGISTRY_AGGREGATOR_URL_FORBIDDEN",
|
|
223
|
+
"experimental.registry.aggregatorUrl",
|
|
224
|
+
"must use HTTP or HTTPS",
|
|
225
|
+
);
|
|
181
226
|
}
|
|
182
227
|
// Reject embedded credentials. The normalized aggregator URL ends
|
|
183
228
|
// up in the admin manifest and is shipped to every admin browser;
|
|
@@ -185,7 +230,11 @@ export function validateAggregatorUrl(aggregatorUrl: string): URL {
|
|
|
185
230
|
// so leaving them in would both leak the credentials and break the
|
|
186
231
|
// registry UI at runtime.
|
|
187
232
|
if (parsed.username || parsed.password) {
|
|
188
|
-
throw new
|
|
233
|
+
throw new RegistryConfigurationError(
|
|
234
|
+
"REGISTRY_AGGREGATOR_URL_FORBIDDEN",
|
|
235
|
+
"experimental.registry.aggregatorUrl",
|
|
236
|
+
"must not contain embedded credentials",
|
|
237
|
+
);
|
|
189
238
|
}
|
|
190
239
|
|
|
191
240
|
// WHATWG URL preserves the brackets on IPv6 hostnames -- strip them
|
|
@@ -205,18 +254,27 @@ export function validateAggregatorUrl(aggregatorUrl: string): URL {
|
|
|
205
254
|
hostname.startsWith("::ffff:127.") ||
|
|
206
255
|
hostname.startsWith("::ffff:7f00:");
|
|
207
256
|
|
|
208
|
-
|
|
257
|
+
const allowLocalhost = options.allowLocalhost ?? import.meta.env.DEV;
|
|
258
|
+
if (!allowLocalhost) {
|
|
209
259
|
if (parsed.protocol === "http:") {
|
|
210
|
-
throw new
|
|
260
|
+
throw new RegistryConfigurationError(
|
|
261
|
+
"REGISTRY_AGGREGATOR_URL_FORBIDDEN",
|
|
262
|
+
"experimental.registry.aggregatorUrl",
|
|
263
|
+
"must use HTTPS outside development",
|
|
264
|
+
);
|
|
211
265
|
}
|
|
212
266
|
if (isLocalhost) {
|
|
213
|
-
throw new
|
|
214
|
-
|
|
267
|
+
throw new RegistryConfigurationError(
|
|
268
|
+
"REGISTRY_AGGREGATOR_URL_FORBIDDEN",
|
|
269
|
+
"experimental.registry.aggregatorUrl",
|
|
270
|
+
"must not point at localhost outside development",
|
|
215
271
|
);
|
|
216
272
|
}
|
|
217
273
|
} else if (parsed.protocol === "http:" && !isLocalhost) {
|
|
218
|
-
throw new
|
|
219
|
-
|
|
274
|
+
throw new RegistryConfigurationError(
|
|
275
|
+
"REGISTRY_AGGREGATOR_URL_FORBIDDEN",
|
|
276
|
+
"experimental.registry.aggregatorUrl",
|
|
277
|
+
"must use HTTPS unless it points at localhost in development",
|
|
220
278
|
);
|
|
221
279
|
}
|
|
222
280
|
|
|
@@ -251,28 +309,30 @@ export function coerceRegistryConfig(
|
|
|
251
309
|
* object. Returns `null` when `input` is undefined so callers can
|
|
252
310
|
* spread the result directly into the manifest object.
|
|
253
311
|
*
|
|
254
|
-
* Throws if the aggregator URL is
|
|
255
|
-
* or
|
|
256
|
-
*
|
|
257
|
-
*
|
|
258
|
-
*
|
|
259
|
-
*
|
|
260
|
-
* TODO: switch to a Zod schema for richer per-field error messages and
|
|
261
|
-
* to surface misconfigurations to the admin UI as a banner instead of
|
|
262
|
-
* a manifest 500.
|
|
312
|
+
* Throws a field-specific configuration error if the aggregator URL is
|
|
313
|
+
* malformed or forbidden, or a registry policy value cannot be normalized.
|
|
314
|
+
* The Astro integration uses this to fail during config loading. Runtime
|
|
315
|
+
* manifest generation uses {@link resolveManifestRegistryConfig} to expose
|
|
316
|
+
* recognized failures without exposing the configured value.
|
|
263
317
|
*/
|
|
264
318
|
export function normalizeRegistryConfig(
|
|
265
319
|
input: RegistryConfigInput | undefined,
|
|
320
|
+
options: RegistryConfigurationValidationOptions = {},
|
|
266
321
|
): ManifestRegistryConfig | null {
|
|
267
322
|
const config = coerceRegistryConfig(input);
|
|
268
323
|
if (!config) return null;
|
|
269
324
|
|
|
270
|
-
const aggregatorUrl =
|
|
325
|
+
const aggregatorUrl =
|
|
326
|
+
typeof config.aggregatorUrl === "string" ? config.aggregatorUrl.trim() : undefined;
|
|
271
327
|
if (!aggregatorUrl) {
|
|
272
|
-
throw new
|
|
328
|
+
throw new RegistryConfigurationError(
|
|
329
|
+
"REGISTRY_AGGREGATOR_URL_REQUIRED",
|
|
330
|
+
"experimental.registry.aggregatorUrl",
|
|
331
|
+
"is required when the registry is configured",
|
|
332
|
+
);
|
|
273
333
|
}
|
|
274
334
|
|
|
275
|
-
validateAggregatorUrl(aggregatorUrl);
|
|
335
|
+
validateAggregatorUrl(aggregatorUrl, options);
|
|
276
336
|
|
|
277
337
|
const out: ManifestRegistryConfig = {
|
|
278
338
|
// Strip any trailing slash so `${aggregatorUrl}/xrpc/...` works
|
|
@@ -288,18 +348,45 @@ export function normalizeRegistryConfig(
|
|
|
288
348
|
let hasPolicy = false;
|
|
289
349
|
|
|
290
350
|
if (config.policy?.minimumReleaseAge !== undefined) {
|
|
291
|
-
|
|
351
|
+
try {
|
|
352
|
+
policy.minimumReleaseAgeSeconds = parseDurationSeconds(config.policy.minimumReleaseAge);
|
|
353
|
+
} catch (cause) {
|
|
354
|
+
throw new RegistryConfigurationError(
|
|
355
|
+
"REGISTRY_MINIMUM_RELEASE_AGE_INVALID",
|
|
356
|
+
"experimental.registry.policy.minimumReleaseAge",
|
|
357
|
+
'must be a duration such as "48h", "7d", or a non-negative number of seconds',
|
|
358
|
+
{ cause },
|
|
359
|
+
);
|
|
360
|
+
}
|
|
292
361
|
hasPolicy = true;
|
|
293
362
|
}
|
|
294
363
|
|
|
295
364
|
if (config.policy?.minimumReleaseAgeExclude !== undefined) {
|
|
365
|
+
if (!Array.isArray(config.policy.minimumReleaseAgeExclude)) {
|
|
366
|
+
throw new RegistryConfigurationError(
|
|
367
|
+
"REGISTRY_MINIMUM_RELEASE_AGE_EXCLUDE_INVALID",
|
|
368
|
+
"experimental.registry.policy.minimumReleaseAgeExclude",
|
|
369
|
+
"must be an array of DIDs or <did>/<slug> entries",
|
|
370
|
+
);
|
|
371
|
+
}
|
|
296
372
|
// Normalize at load time so callers (browser and server) can do
|
|
297
373
|
// plain string compares without each one re-implementing the
|
|
298
374
|
// case-folding rule.
|
|
299
375
|
const list = config.policy.minimumReleaseAgeExclude.map((entry) => {
|
|
376
|
+
if (typeof entry !== "string") {
|
|
377
|
+
throw new RegistryConfigurationError(
|
|
378
|
+
"REGISTRY_MINIMUM_RELEASE_AGE_EXCLUDE_INVALID",
|
|
379
|
+
"experimental.registry.policy.minimumReleaseAgeExclude",
|
|
380
|
+
"minimumReleaseAgeExclude entry must be a DID or <did>/<slug>",
|
|
381
|
+
);
|
|
382
|
+
}
|
|
300
383
|
const trimmed = entry.trim();
|
|
301
384
|
if (!trimmed) {
|
|
302
|
-
throw new
|
|
385
|
+
throw new RegistryConfigurationError(
|
|
386
|
+
"REGISTRY_MINIMUM_RELEASE_AGE_EXCLUDE_INVALID",
|
|
387
|
+
"experimental.registry.policy.minimumReleaseAgeExclude",
|
|
388
|
+
"entries cannot be empty",
|
|
389
|
+
);
|
|
303
390
|
}
|
|
304
391
|
const lower = trimmed.toLowerCase();
|
|
305
392
|
const [did, slug, ...extra] = lower.split("/");
|
|
@@ -309,8 +396,10 @@ export function normalizeRegistryConfig(
|
|
|
309
396
|
extra.length > 0 ||
|
|
310
397
|
(slug !== undefined && !REGISTRY_PACKAGE_SLUG_PATTERN.test(slug))
|
|
311
398
|
) {
|
|
312
|
-
throw new
|
|
313
|
-
|
|
399
|
+
throw new RegistryConfigurationError(
|
|
400
|
+
"REGISTRY_MINIMUM_RELEASE_AGE_EXCLUDE_INVALID",
|
|
401
|
+
"experimental.registry.policy.minimumReleaseAgeExclude",
|
|
402
|
+
"minimumReleaseAgeExclude entry must be a DID or <did>/<slug>",
|
|
314
403
|
);
|
|
315
404
|
}
|
|
316
405
|
return lower;
|
|
@@ -327,3 +416,17 @@ export function normalizeRegistryConfig(
|
|
|
327
416
|
|
|
328
417
|
return out;
|
|
329
418
|
}
|
|
419
|
+
|
|
420
|
+
/** Normalize registry config without allowing a known config error to hide the admin. */
|
|
421
|
+
export function resolveManifestRegistryConfig(input: RegistryConfigInput | undefined): {
|
|
422
|
+
registry?: ManifestRegistryConfig;
|
|
423
|
+
error?: ManifestRegistryConfigurationError;
|
|
424
|
+
} {
|
|
425
|
+
try {
|
|
426
|
+
const registry = normalizeRegistryConfig(input);
|
|
427
|
+
return registry ? { registry } : {};
|
|
428
|
+
} catch (error) {
|
|
429
|
+
if (!(error instanceof RegistryConfigurationError)) throw error;
|
|
430
|
+
return { error: { code: error.code, field: error.field } };
|
|
431
|
+
}
|
|
432
|
+
}
|
package/src/registry/types.ts
CHANGED
|
@@ -56,12 +56,11 @@ export interface RegistryConfig {
|
|
|
56
56
|
* Accepts a duration string (`"24h"`, `"48h"`, `"72h"`, `"7d"`) or a
|
|
57
57
|
* number of seconds.
|
|
58
58
|
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
* history
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
* whose packages should install immediately.
|
|
59
|
+
* A package's first release is exempt only when the aggregator
|
|
60
|
+
* reports one release and confirms that its retained history is
|
|
61
|
+
* complete. Missing or incomplete history keeps the holdback in
|
|
62
|
+
* force. Use {@link minimumReleaseAgeExclude} to allowlist trusted
|
|
63
|
+
* publishers whose packages should always install immediately.
|
|
65
64
|
*
|
|
66
65
|
* Defaults to `undefined` (no holdback). A future trust/moderation
|
|
67
66
|
* RFC will specify the recommended default.
|