emdash 0.40.0 → 0.41.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/action-token-CbKDcPJi.mjs +26 -0
- package/dist/action-token-CbKDcPJi.mjs.map +1 -0
- package/dist/activation-PtniBLt9.mjs +382 -0
- package/dist/activation-PtniBLt9.mjs.map +1 -0
- package/dist/adapters-C_Tf5x90.d.mts +171 -0
- package/dist/adapters-C_Tf5x90.d.mts.map +1 -0
- package/dist/allowed-origins-U1z4TdEZ.mjs +116 -0
- package/dist/allowed-origins-U1z4TdEZ.mjs.map +1 -0
- package/dist/api/route-utils.d.mts +4 -4
- package/dist/api/route-utils.mjs +46 -45
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +10 -10
- package/dist/api-CXwQkV_m.mjs +5122 -0
- package/dist/api-CXwQkV_m.mjs.map +1 -0
- package/dist/api-tokens-89WlohEN.mjs +166 -0
- package/dist/api-tokens-89WlohEN.mjs.map +1 -0
- package/dist/apply-Do3KNnUk.mjs +1659 -0
- package/dist/apply-Do3KNnUk.mjs.map +1 -0
- package/dist/approvals-CAX9Yw33.mjs +460 -0
- package/dist/approvals-CAX9Yw33.mjs.map +1 -0
- package/dist/artifact-fetch-B9W4CEST.mjs +659 -0
- package/dist/artifact-fetch-B9W4CEST.mjs.map +1 -0
- package/dist/astro/index.d.mts +14 -14
- package/dist/astro/index.mjs +26 -30
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +12 -12
- package/dist/astro/middleware/auth.mjs +10 -10
- package/dist/astro/middleware/media-usage-write-fence.mjs +5 -5
- package/dist/astro/middleware/redirect.mjs +7 -7
- package/dist/astro/middleware/request-context.mjs +3 -3
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +12 -12
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +110 -106
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +14 -14
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +14 -14
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +7 -7
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +17 -17
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +17 -17
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +17 -17
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +23 -23
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +23 -23
- package/dist/astro/routes/api/admin/bylines/index.mjs +23 -23
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +18 -18
- package/dist/astro/routes/api/admin/comments/_id_.mjs +7 -7
- package/dist/astro/routes/api/admin/comments/bulk.mjs +17 -17
- package/dist/astro/routes/api/admin/comments/counts.mjs +7 -7
- package/dist/astro/routes/api/admin/comments/index.mjs +17 -17
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +6 -6
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +5 -5
- package/dist/astro/routes/api/admin/media-usage/activation.mjs +20 -20
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +22 -22
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +22 -22
- package/dist/astro/routes/api/admin/media-usage/progress.mjs +25 -25
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +31 -31
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +22 -22
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +22 -22
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +8 -8
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +8 -8
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +72 -68
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +7 -7
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +71 -67
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +72 -68
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +82 -78
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +72 -68
- package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +5 -5
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +71 -67
- 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 +81 -77
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +71 -67
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +72 -68
- 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 +83 -79
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +9 -9
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +74 -70
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/publisher-handle.mjs +7 -7
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +72 -68
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +71 -67
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +71 -67
- 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 +5 -5
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +71 -67
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/_...path_.mjs +4 -4
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs +40 -40
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs +40 -40
- package/dist/astro/routes/api/admin/transfer/approvals/index.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/capabilities.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs +43 -43
- package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs +43 -43
- package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs +43 -43
- package/dist/astro/routes/api/admin/transfer/exports/index.mjs +44 -44
- package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs +44 -44
- package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs +44 -44
- package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs +44 -44
- package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/index.mjs +44 -44
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +5 -5
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +4 -4
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +15 -15
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +6 -6
- package/dist/astro/routes/api/admin/users/index.mjs +14 -14
- package/dist/astro/routes/api/auth/dev-bypass.mjs +6 -6
- package/dist/astro/routes/api/auth/invite/accept.mjs +4 -4
- package/dist/astro/routes/api/auth/invite/complete.mjs +18 -18
- package/dist/astro/routes/api/auth/invite/index.mjs +16 -16
- package/dist/astro/routes/api/auth/invite/register-options.mjs +17 -17
- package/dist/astro/routes/api/auth/logout.mjs +5 -5
- package/dist/astro/routes/api/auth/magic-link/send.mjs +18 -18
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +14 -14
- package/dist/astro/routes/api/auth/me.mjs +15 -15
- package/dist/astro/routes/api/auth/mode.mjs +5 -5
- 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 +14 -14
- package/dist/astro/routes/api/auth/passkey/index.mjs +4 -4
- package/dist/astro/routes/api/auth/passkey/options.mjs +19 -19
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +17 -17
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +18 -18
- package/dist/astro/routes/api/auth/passkey/verify.mjs +18 -18
- package/dist/astro/routes/api/auth/signup/complete.mjs +18 -18
- package/dist/astro/routes/api/auth/signup/request.mjs +17 -17
- package/dist/astro/routes/api/auth/signup/verify.mjs +4 -4
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +12 -12
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +18 -18
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs +11 -11
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +31 -31
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts +1 -2
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +42 -53
- 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 +34 -29
- 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 +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +25 -24
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +18 -18
- package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/authors.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/index.mjs +15 -15
- package/dist/astro/routes/api/content/_collection_/trash.mjs +15 -15
- package/dist/astro/routes/api/dashboard.mjs +10 -9
- package/dist/astro/routes/api/dashboard.mjs.map +1 -1
- package/dist/astro/routes/api/dev/emails.mjs +5 -5
- package/dist/astro/routes/api/health.mjs +6 -6
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +23 -23
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +6 -6
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +13 -13
- package/dist/astro/routes/api/import/wordpress/execute.mjs +16 -16
- package/dist/astro/routes/api/import/wordpress/media.d.mts +12 -12
- package/dist/astro/routes/api/import/wordpress/media.mjs +19 -19
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +18 -18
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +13 -13
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +28 -28
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +23 -23
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +13 -13
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +34 -34
- package/dist/astro/routes/api/manifest.mjs +6 -6
- package/dist/astro/routes/api/mcp.mjs +98 -118
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +19 -19
- package/dist/astro/routes/api/media/_id_/replace.mjs +16 -16
- package/dist/astro/routes/api/media/_id_/upload.mjs +9 -9
- package/dist/astro/routes/api/media/_id_/usage.mjs +33 -33
- package/dist/astro/routes/api/media/_id_.mjs +31 -31
- package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs +6 -6
- package/dist/astro/routes/api/media/file/_...key_.mjs +9 -9
- package/dist/astro/routes/api/media/folders/_id_.mjs +16 -16
- package/dist/astro/routes/api/media/folders/index.mjs +16 -16
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +5 -5
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +5 -5
- package/dist/astro/routes/api/media/providers/index.mjs +5 -5
- package/dist/astro/routes/api/media/upload-url.mjs +18 -18
- package/dist/astro/routes/api/media.mjs +35 -35
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +17 -17
- package/dist/astro/routes/api/menus/_name_/items.mjs +17 -17
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +17 -17
- package/dist/astro/routes/api/menus/_name_/translations.mjs +17 -17
- package/dist/astro/routes/api/menus/_name_.mjs +17 -17
- package/dist/astro/routes/api/menus/index.mjs +17 -17
- package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/authorize.d.mts +2 -1
- package/dist/astro/routes/api/oauth/device/authorize.d.mts.map +1 -1
- package/dist/astro/routes/api/oauth/device/authorize.mjs +23 -9
- package/dist/astro/routes/api/oauth/device/authorize.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/device/code.mjs +11 -11
- package/dist/astro/routes/api/oauth/device/token.mjs +10 -10
- package/dist/astro/routes/api/oauth/register.mjs +5 -5
- package/dist/astro/routes/api/oauth/token/refresh.mjs +8 -8
- package/dist/astro/routes/api/oauth/token/revoke.mjs +8 -8
- package/dist/astro/routes/api/oauth/token.mjs +8 -8
- package/dist/astro/routes/api/openapi.json.mjs +20 -20
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +11 -11
- package/dist/astro/routes/api/redirects/404s/index.mjs +19 -19
- package/dist/astro/routes/api/redirects/404s/summary.mjs +19 -19
- package/dist/astro/routes/api/redirects/_id_.mjs +19 -19
- package/dist/astro/routes/api/redirects/index.mjs +19 -19
- package/dist/astro/routes/api/relations/_id_/index.mjs +34 -29
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/index.mjs +36 -31
- package/dist/astro/routes/api/relations/index.mjs.map +1 -1
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +5 -5
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +5 -5
- package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs +71 -67
- package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs +71 -67
- package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs.map +1 -1
- package/dist/astro/routes/api/schema/block-types/index.mjs +71 -67
- package/dist/astro/routes/api/schema/block-types/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +73 -69
- 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 +71 -67
- 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 +71 -67
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +71 -67
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +71 -67
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/reorder.mjs +71 -67
- package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +16 -16
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +71 -67
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +71 -67
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +19 -19
- package/dist/astro/routes/api/search/index.mjs +18 -18
- package/dist/astro/routes/api/search/rebuild.mjs +19 -19
- package/dist/astro/routes/api/search/stats.mjs +9 -9
- package/dist/astro/routes/api/search/suggest.mjs +18 -18
- package/dist/astro/routes/api/sections/_slug_.mjs +18 -18
- package/dist/astro/routes/api/sections/index.mjs +18 -18
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/export.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/index.mjs +8 -8
- package/dist/astro/routes/api/settings/email.mjs +6 -6
- package/dist/astro/routes/api/settings.mjs +21 -21
- package/dist/astro/routes/api/setup/admin-verify.mjs +19 -19
- package/dist/astro/routes/api/setup/admin.mjs +18 -18
- package/dist/astro/routes/api/setup/dev-bypass.mjs +45 -39
- package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-reset.mjs +4 -4
- package/dist/astro/routes/api/setup/index.d.mts.map +1 -1
- package/dist/astro/routes/api/setup/index.mjs +80 -49
- package/dist/astro/routes/api/setup/index.mjs.map +1 -1
- package/dist/astro/routes/api/setup/status.mjs +6 -6
- package/dist/astro/routes/api/snapshot.mjs +9 -9
- package/dist/astro/routes/api/snapshot.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +22 -22
- package/dist/astro/routes/api/taxonomies/_name_.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/bulk-tag.mjs +36 -35
- package/dist/astro/routes/api/taxonomies/bulk-tag.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +23 -23
- package/dist/astro/routes/api/themes/preview.mjs +6 -6
- package/dist/astro/routes/api/typegen.mjs +8 -8
- package/dist/astro/routes/api/visual-editing/action-token.mjs +6 -6
- package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs +19 -19
- package/dist/astro/routes/api/visual-editing/toolbar-labels.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.mjs +16 -16
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +19 -19
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +19 -19
- package/dist/astro/routes/api/widget-areas/_name_.mjs +9 -9
- package/dist/astro/routes/api/widget-areas/index.mjs +19 -19
- package/dist/astro/routes/api/widget-components.mjs +5 -5
- package/dist/astro/routes/robots.txt.mjs +6 -6
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +9 -9
- package/dist/astro/routes/sitemap.xml.mjs +7 -7
- package/dist/astro/types.d.mts +28 -18
- package/dist/astro/types.d.mts.map +1 -1
- package/dist/audit-CrgmE9LE.mjs +127 -0
- package/dist/audit-CrgmE9LE.mjs.map +1 -0
- package/dist/auth/providers/github.d.mts +1 -1
- package/dist/auth/providers/google.d.mts +1 -1
- package/dist/authoritative-records-C2YzIdbu.mjs +5172 -0
- package/dist/authoritative-records-C2YzIdbu.mjs.map +1 -0
- package/dist/authorize-WgdKF8QY.mjs +49 -0
- package/dist/authorize-WgdKF8QY.mjs.map +1 -0
- package/dist/backup-Ck8_lMO3.mjs +246 -0
- package/dist/backup-Ck8_lMO3.mjs.map +1 -0
- package/dist/block-types-BQ90asVI.mjs +132 -0
- package/dist/block-types-BQ90asVI.mjs.map +1 -0
- package/dist/block-values-ACFqgB1D.mjs +175 -0
- package/dist/block-values-ACFqgB1D.mjs.map +1 -0
- package/dist/bundle-Db1iNMv_.mjs +667 -0
- package/dist/bundle-Db1iNMv_.mjs.map +1 -0
- package/dist/byline-BayaYGoj.mjs +909 -0
- package/dist/byline-BayaYGoj.mjs.map +1 -0
- package/dist/byline-fields-B8HH-35f.mjs +254 -0
- package/dist/byline-fields-B8HH-35f.mjs.map +1 -0
- package/dist/byline-fields-hMPjf6Eu.mjs +123 -0
- package/dist/byline-fields-hMPjf6Eu.mjs.map +1 -0
- package/dist/byline-registry-B_EK_TQf.mjs +406 -0
- package/dist/byline-registry-B_EK_TQf.mjs.map +1 -0
- package/dist/bylines-DFAaFXWi.mjs +214 -0
- package/dist/bylines-DFAaFXWi.mjs.map +1 -0
- package/dist/bylines-DkIxUxmr.mjs +232 -0
- package/dist/bylines-DkIxUxmr.mjs.map +1 -0
- package/dist/cache-DkvhQ8XE.mjs +108 -0
- package/dist/cache-DkvhQ8XE.mjs.map +1 -0
- package/dist/canonical-CcSuuTlH.mjs +174 -0
- package/dist/canonical-CcSuuTlH.mjs.map +1 -0
- package/dist/capture-triggers-DJEoOTOq.mjs +362 -0
- package/dist/capture-triggers-DJEoOTOq.mjs.map +1 -0
- package/dist/challenge-store-CvBl81AQ.mjs +51 -0
- package/dist/challenge-store-CvBl81AQ.mjs.map +1 -0
- package/dist/checksum-CClweQzI.mjs +162 -0
- package/dist/checksum-CClweQzI.mjs.map +1 -0
- package/dist/chrome-tags-D5caJwwp.mjs +24 -0
- package/dist/chrome-tags-D5caJwwp.mjs.map +1 -0
- package/dist/chunks-DwBaj8aT.mjs +25 -0
- package/dist/chunks-DwBaj8aT.mjs.map +1 -0
- package/dist/cli/index.mjs +374 -761
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +18 -18
- package/dist/client/index.mjs +2 -2
- package/dist/collection-deletion-CLCdXsnV.mjs +436 -0
- package/dist/collection-deletion-CLCdXsnV.mjs.map +1 -0
- package/dist/collection-deletion-processor-hNw8x01F.mjs +217 -0
- package/dist/collection-deletion-processor-hNw8x01F.mjs.map +1 -0
- package/dist/collection-slugs-cache-CUuiduLq.mjs +85 -0
- package/dist/collection-slugs-cache-CUuiduLq.mjs.map +1 -0
- package/dist/comment-D2uvL63j.mjs +313 -0
- package/dist/comment-D2uvL63j.mjs.map +1 -0
- package/dist/comment-reaction-DevUuzg4.mjs +85 -0
- package/dist/comment-reaction-DevUuzg4.mjs.map +1 -0
- package/dist/comments-Cq0s7_hO.mjs +195 -0
- package/dist/comments-Cq0s7_hO.mjs.map +1 -0
- package/dist/comments-M4EDYAHw.mjs +99 -0
- package/dist/comments-M4EDYAHw.mjs.map +1 -0
- package/dist/components-CuIGwXMs.mjs +108 -0
- package/dist/components-CuIGwXMs.mjs.map +1 -0
- package/dist/config-52Ea5IWt.d.mts +39 -0
- package/dist/config-52Ea5IWt.d.mts.map +1 -0
- package/dist/config-CCz3xOLc.mjs +242 -0
- package/dist/config-CCz3xOLc.mjs.map +1 -0
- package/dist/config-D3d5Qudq.d.mts +6669 -0
- package/dist/config-D3d5Qudq.d.mts.map +1 -0
- package/dist/content-CbnufDsM.mjs +2018 -0
- package/dist/content-CbnufDsM.mjs.map +1 -0
- package/dist/content-list-query-D_7B1FE5.d.mts +26 -0
- package/dist/content-list-query-D_7B1FE5.d.mts.map +1 -0
- package/dist/content-policy-CYu6K1KB.mjs +46 -0
- package/dist/content-policy-CYu6K1KB.mjs.map +1 -0
- package/dist/content-repair-DlDUgFGp.mjs +442 -0
- package/dist/content-repair-DlDUgFGp.mjs.map +1 -0
- package/dist/context-CGQLA1-a.mjs +1922 -0
- package/dist/context-CGQLA1-a.mjs.map +1 -0
- package/dist/cron-c4D5C5Fx.mjs +284 -0
- package/dist/cron-c4D5C5Fx.mjs.map +1 -0
- package/dist/dashboard-CBq9kmOn.mjs +151 -0
- package/dist/dashboard-CBq9kmOn.mjs.map +1 -0
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +1 -1
- package/dist/db/libsql-migrations.d.mts +1 -1
- package/dist/db/libsql-migrations.mjs +4 -4
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres-migrations.d.mts +1 -1
- package/dist/db/postgres-migrations.mjs +4 -4
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite-migrations.d.mts +1 -1
- package/dist/db/sqlite-migrations.mjs +4 -4
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/db/sqlite.mjs +1 -1
- package/dist/default-DPsys51U.mjs +81 -0
- package/dist/default-DPsys51U.mjs.map +1 -0
- package/dist/deferred-tasks-CZ7rzBdo.d.mts +9 -0
- package/dist/deferred-tasks-CZ7rzBdo.d.mts.map +1 -0
- package/dist/dev-typegen-HRxwLRcT.mjs +29 -0
- package/dist/dev-typegen-HRxwLRcT.mjs.map +1 -0
- package/dist/device-flow-OcSqE9uY.mjs +521 -0
- package/dist/device-flow-OcSqE9uY.mjs.map +1 -0
- package/dist/digest-DVZ--cE9.mjs +194 -0
- package/dist/digest-DVZ--cE9.mjs.map +1 -0
- package/dist/direct-executor-DyjAqkpT.mjs +104 -0
- package/dist/direct-executor-DyjAqkpT.mjs.map +1 -0
- package/dist/dist-FPR93_xf.mjs +810 -0
- package/dist/dist-FPR93_xf.mjs.map +1 -0
- package/dist/email-console-DyQIgEnz.mjs +50 -0
- package/dist/email-console-DyQIgEnz.mjs.map +1 -0
- package/dist/email-locale-BYb16rVd.mjs +25 -0
- package/dist/email-locale-BYb16rVd.mjs.map +1 -0
- package/dist/emdash-runtime-CrzxJFmF.mjs +4214 -0
- package/dist/emdash-runtime-CrzxJFmF.mjs.map +1 -0
- package/dist/enrich-DBtCncE2.mjs +194 -0
- package/dist/enrich-DBtCncE2.mjs.map +1 -0
- package/dist/entry-lock-BN5y4YbO.d.mts +4481 -0
- package/dist/entry-lock-BN5y4YbO.d.mts.map +1 -0
- package/dist/entry-lock-BaRBHCsH.mjs +1173 -0
- package/dist/entry-lock-BaRBHCsH.mjs.map +1 -0
- package/dist/entry-lock-C6NcnZPV.mjs +163 -0
- package/dist/entry-lock-C6NcnZPV.mjs.map +1 -0
- package/dist/entry-locks-BTyQLdbC.mjs +167 -0
- package/dist/entry-locks-BTyQLdbC.mjs.map +1 -0
- package/dist/error-BfsNNrIE.mjs +90 -0
- package/dist/error-BfsNNrIE.mjs.map +1 -0
- package/dist/errors-BN1QAnEY.mjs +460 -0
- package/dist/errors-BN1QAnEY.mjs.map +1 -0
- package/dist/errors-Bt3goF8I.mjs +120 -0
- package/dist/errors-Bt3goF8I.mjs.map +1 -0
- package/dist/escape-BveidMa2.mjs +9 -0
- package/dist/escape-BveidMa2.mjs.map +1 -0
- package/dist/fence-Bb_IbCxI.mjs +162 -0
- package/dist/fence-Bb_IbCxI.mjs.map +1 -0
- package/dist/field-defs-cache-CsZctvbu.mjs +77 -0
- package/dist/field-defs-cache-CsZctvbu.mjs.map +1 -0
- package/dist/field-map-6m9rF49t.mjs +83 -0
- package/dist/field-map-6m9rF49t.mjs.map +1 -0
- package/dist/focal-point-CZ3d1wK5.mjs +23 -0
- package/dist/focal-point-CZ3d1wK5.mjs.map +1 -0
- package/dist/fts-manager-CCaZTp8y.mjs +443 -0
- package/dist/fts-manager-CCaZTp8y.mjs.map +1 -0
- package/dist/gc-xowRjczI.mjs +75 -0
- package/dist/gc-xowRjczI.mjs.map +1 -0
- package/dist/hash-COVK27Pc.mjs +37 -0
- package/dist/hash-COVK27Pc.mjs.map +1 -0
- package/dist/hook-result-CYSk0XFe.d.mts +31 -0
- package/dist/hook-result-CYSk0XFe.d.mts.map +1 -0
- package/dist/hreflang-CChPV7jx.mjs +105 -0
- package/dist/hreflang-CChPV7jx.mjs.map +1 -0
- package/dist/hreflang-DRslq3QI.d.mts +50 -0
- package/dist/hreflang-DRslq3QI.d.mts.map +1 -0
- package/dist/http-route-dispatch-CAdp2onn.mjs +339 -0
- package/dist/http-route-dispatch-CAdp2onn.mjs.map +1 -0
- package/dist/identity-NVTOOQyq.mjs +35 -0
- package/dist/identity-NVTOOQyq.mjs.map +1 -0
- package/dist/import-wpSO2N0x.mjs +2020 -0
- package/dist/import-wpSO2N0x.mjs.map +1 -0
- package/dist/index-CDs2wq4X.d.mts +623 -0
- package/dist/index-CDs2wq4X.d.mts.map +1 -0
- package/dist/index.d.mts +24 -24
- package/dist/index.mjs +103 -101
- package/dist/install-finalization-D9R9R-W8.mjs +58 -0
- package/dist/install-finalization-D9R9R-W8.mjs.map +1 -0
- package/dist/keys-Bck6LBfF.mjs +61 -0
- package/dist/keys-Bck6LBfF.mjs.map +1 -0
- package/dist/kinds-CYmRESWj.mjs +974 -0
- package/dist/kinds-CYmRESWj.mjs.map +1 -0
- package/dist/lifecycle-C815ZQfV.mjs +25 -0
- package/dist/lifecycle-C815ZQfV.mjs.map +1 -0
- package/dist/load-D99axixL.mjs +28 -0
- package/dist/load-D99axixL.mjs.map +1 -0
- package/dist/loader-CrRPfkHS.mjs +1197 -0
- package/dist/loader-CrRPfkHS.mjs.map +1 -0
- package/dist/loops-DMKlygqX.mjs +203 -0
- package/dist/loops-DMKlygqX.mjs.map +1 -0
- package/dist/manifest-builder-BQzCHNgB.mjs +189 -0
- package/dist/manifest-builder-BQzCHNgB.mjs.map +1 -0
- package/dist/manifest-schema-Ci2gmd0u.mjs +492 -0
- package/dist/manifest-schema-Ci2gmd0u.mjs.map +1 -0
- package/dist/media/image-endpoint.mjs +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +4 -4
- package/dist/media/local-runtime.d.mts +14 -14
- package/dist/media/local-runtime.mjs +6 -6
- package/dist/media-BUQePMxP.mjs +373 -0
- package/dist/media-BUQePMxP.mjs.map +1 -0
- package/dist/media-DH8ibNlY.mjs +294 -0
- package/dist/media-DH8ibNlY.mjs.map +1 -0
- package/dist/media-OEIQ3bVc.mjs +408 -0
- package/dist/media-OEIQ3bVc.mjs.map +1 -0
- package/dist/media-allowlist-pYtaBA95.mjs +44 -0
- package/dist/media-allowlist-pYtaBA95.mjs.map +1 -0
- package/dist/media-folders-Bf8_s4de.mjs +210 -0
- package/dist/media-folders-Bf8_s4de.mjs.map +1 -0
- package/dist/media-url-C6klEuNd.mjs +43 -0
- package/dist/media-url-C6klEuNd.mjs.map +1 -0
- package/dist/media-usage-D7Y64m6v.mjs +1629 -0
- package/dist/media-usage-D7Y64m6v.mjs.map +1 -0
- package/dist/media-usage-activation-DrqbmgLA.mjs +78 -0
- package/dist/media-usage-activation-DrqbmgLA.mjs.map +1 -0
- package/dist/media-usage-work-DommYhYA.mjs +152 -0
- package/dist/media-usage-work-DommYhYA.mjs.map +1 -0
- package/dist/media-usage-work-HU63hNDu.mjs +586 -0
- package/dist/media-usage-work-HU63hNDu.mjs.map +1 -0
- package/dist/menus-BQfusWEC.mjs +3608 -0
- package/dist/menus-BQfusWEC.mjs.map +1 -0
- package/dist/menus-BtwjQt5s.mjs +753 -0
- package/dist/menus-BtwjQt5s.mjs.map +1 -0
- package/dist/menus-p_M1V7J_.mjs +139 -0
- package/dist/menus-p_M1V7J_.mjs.map +1 -0
- package/dist/migrations/index.d.mts +1 -1
- package/dist/migrations/index.mjs +3 -3
- package/dist/mime-C94qBG-P.mjs +36 -0
- package/dist/mime-C94qBG-P.mjs.map +1 -0
- package/dist/mode-DpYW3w6U.mjs +23 -0
- package/dist/mode-DpYW3w6U.mjs.map +1 -0
- package/dist/node-sqlite-compat-pWFw0lcc.mjs +46 -0
- package/dist/node-sqlite-compat-pWFw0lcc.mjs.map +1 -0
- package/dist/normalize-DduyxBjf.mjs +191 -0
- package/dist/normalize-DduyxBjf.mjs.map +1 -0
- package/dist/oauth-authorization-DAXsH1H9.mjs +274 -0
- package/dist/oauth-authorization-DAXsH1H9.mjs.map +1 -0
- package/dist/oauth-clients-DENiDQri.mjs +266 -0
- package/dist/oauth-clients-DENiDQri.mjs.map +1 -0
- package/dist/oauth-state-store-y8mEYVq9.mjs +50 -0
- package/dist/oauth-state-store-y8mEYVq9.mjs.map +1 -0
- package/dist/oauth-user-lookup-CtTYAy-O.mjs +26 -0
- package/dist/oauth-user-lookup-CtTYAy-O.mjs.map +1 -0
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/options-BYa1FgIM.d.mts +81 -0
- package/dist/options-BYa1FgIM.d.mts.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/page/index.mjs +5 -5
- package/dist/parse-CORGGhHf.mjs +81 -0
- package/dist/parse-CORGGhHf.mjs.map +1 -0
- package/dist/parse-avNM1xWV.d.mts +168 -0
- package/dist/parse-avNM1xWV.d.mts.map +1 -0
- package/dist/passkey-config-Dih5YeIS.mjs +46 -0
- package/dist/passkey-config-Dih5YeIS.mjs.map +1 -0
- package/dist/paths-d51RFm8M.mjs +77 -0
- package/dist/paths-d51RFm8M.mjs.map +1 -0
- package/dist/patterns-CoqlXUvk.mjs +145 -0
- package/dist/patterns-CoqlXUvk.mjs.map +1 -0
- package/dist/placeholder-D2aksPMF.d.mts +306 -0
- package/dist/placeholder-D2aksPMF.d.mts.map +1 -0
- package/dist/plan-DqeZKuaR.mjs +135 -0
- package/dist/plan-DqeZKuaR.mjs.map +1 -0
- package/dist/plugin-test-runtime.d.mts +14 -14
- package/dist/plugin-test-runtime.mjs +110 -107
- package/dist/plugin-types.d.mts +2 -2
- package/dist/plugin-utils.d.mts +12 -12
- package/dist/plugins/adapt-sandbox-entry.d.mts +12 -12
- package/dist/plugins/adapt-sandbox-entry.mjs +3 -3
- package/dist/plugins/host.d.mts +5 -5
- package/dist/plugins/host.mjs +42 -41
- package/dist/plugins-Bb7oqjQA.mjs +277 -0
- package/dist/plugins-Bb7oqjQA.mjs.map +1 -0
- package/dist/policy-BcEqut3n.mjs +45 -0
- package/dist/policy-BcEqut3n.mjs.map +1 -0
- package/dist/portable-text-DXE8ymtD.mjs +307 -0
- package/dist/portable-text-DXE8ymtD.mjs.map +1 -0
- package/dist/preview-DEDWbwA_.mjs +107 -0
- package/dist/preview-DEDWbwA_.mjs.map +1 -0
- package/dist/protocol-BJbTzvwl.d.mts +61 -0
- package/dist/protocol-BJbTzvwl.d.mts.map +1 -0
- package/dist/public-submission-D9c9S14m.mjs +250 -0
- package/dist/public-submission-D9c9S14m.mjs.map +1 -0
- package/dist/public-url-CIRe-2T6.mjs +101 -0
- package/dist/public-url-CIRe-2T6.mjs.map +1 -0
- package/dist/query-BzifXlPS.mjs +1156 -0
- package/dist/query-BzifXlPS.mjs.map +1 -0
- package/dist/query-OzMJ6vJP.mjs +41 -0
- package/dist/query-OzMJ6vJP.mjs.map +1 -0
- package/dist/rate-limit-Csp60Vik.mjs +120 -0
- package/dist/rate-limit-Csp60Vik.mjs.map +1 -0
- package/dist/receipt-B-aU4hpJ.mjs +43 -0
- package/dist/receipt-B-aU4hpJ.mjs.map +1 -0
- package/dist/redirect-CDSw1sU3.mjs +17 -0
- package/dist/redirect-CDSw1sU3.mjs.map +1 -0
- package/dist/redirect-D1ArbO85.mjs +411 -0
- package/dist/redirect-D1ArbO85.mjs.map +1 -0
- package/dist/redirects-BjTwDTsV.mjs +148 -0
- package/dist/redirects-BjTwDTsV.mjs.map +1 -0
- package/dist/redirects-Ck50kH3n.mjs +446 -0
- package/dist/redirects-Ck50kH3n.mjs.map +1 -0
- package/dist/registry/testing.mjs +3 -3
- package/dist/registry-CFcNCayZ.mjs +6754 -0
- package/dist/registry-CFcNCayZ.mjs.map +1 -0
- package/dist/relations-Cfaa1fDl.mjs +776 -0
- package/dist/relations-Cfaa1fDl.mjs.map +1 -0
- package/dist/request-cache-iHRlHx1d.mjs +104 -0
- package/dist/request-cache-iHRlHx1d.mjs.map +1 -0
- package/dist/request-context.d.mts +1 -1
- package/dist/request-meta-D47mqyev.mjs +141 -0
- package/dist/request-meta-D47mqyev.mjs.map +1 -0
- package/dist/resolve-BPE8sMvx.mjs +99 -0
- package/dist/resolve-BPE8sMvx.mjs.map +1 -0
- package/dist/resolve-C0s1E_fH.mjs +199 -0
- package/dist/resolve-C0s1E_fH.mjs.map +1 -0
- package/dist/revision-j1p4-bOj.mjs +302 -0
- package/dist/revision-j1p4-bOj.mjs.map +1 -0
- package/dist/route-wire-C9PJV9aL.mjs +197 -0
- package/dist/route-wire-C9PJV9aL.mjs.map +1 -0
- package/dist/routes-lyYw0mMf.mjs +272 -0
- package/dist/routes-lyYw0mMf.mjs.map +1 -0
- package/dist/runner-B3eyB9Gb.mjs +6121 -0
- package/dist/runner-B3eyB9Gb.mjs.map +1 -0
- package/dist/runner-DoYH2Jcu.d.mts +68 -0
- package/dist/runner-DoYH2Jcu.d.mts.map +1 -0
- package/dist/runtime.d.mts +13 -13
- package/dist/runtime.mjs +3 -3
- package/dist/schema-BAayK46S.mjs +13 -0
- package/dist/schema-BAayK46S.mjs.map +1 -0
- package/dist/schema-Gqcl-8G4.mjs +815 -0
- package/dist/schema-Gqcl-8G4.mjs.map +1 -0
- package/dist/scopes-BqPOKoKf.mjs +34 -0
- package/dist/scopes-BqPOKoKf.mjs.map +1 -0
- package/dist/search-YJKPIEV6.mjs +448 -0
- package/dist/search-YJKPIEV6.mjs.map +1 -0
- package/dist/sections-BR_e-wK5.mjs +346 -0
- package/dist/sections-BR_e-wK5.mjs.map +1 -0
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +37 -31
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.mjs +22 -21
- package/dist/seo/index.mjs.map +1 -1
- package/dist/seo-Dsj8hy3j.mjs +114 -0
- package/dist/seo-Dsj8hy3j.mjs.map +1 -0
- package/dist/seo-XvH4LNNp.mjs +133 -0
- package/dist/seo-XvH4LNNp.mjs.map +1 -0
- package/dist/service-BsVG05gS.mjs +150 -0
- package/dist/service-BsVG05gS.mjs.map +1 -0
- package/dist/session-user-DgKbYrlj.mjs +51 -0
- package/dist/session-user-DgKbYrlj.mjs.map +1 -0
- package/dist/settings-CNPUntkh.mjs +51 -0
- package/dist/settings-CNPUntkh.mjs.map +1 -0
- package/dist/settings-D5EHi0Tk.mjs +439 -0
- package/dist/settings-D5EHi0Tk.mjs.map +1 -0
- package/dist/settings-DSfE7wOa.mjs +61 -0
- package/dist/settings-DSfE7wOa.mjs.map +1 -0
- package/dist/setup-complete-B8W8sJ9v.mjs +26 -0
- package/dist/setup-complete-B8W8sJ9v.mjs.map +1 -0
- package/dist/setup-nonce-DnSBP260.mjs +25 -0
- package/dist/setup-nonce-DnSBP260.mjs.map +1 -0
- package/dist/site-settings-NGzdrt7O.mjs +50 -0
- package/dist/site-settings-NGzdrt7O.mjs.map +1 -0
- package/dist/site-url-D6JB7tLW.mjs +16 -0
- package/dist/site-url-D6JB7tLW.mjs.map +1 -0
- package/dist/snapshot-CdcwwWAf.mjs +414 -0
- package/dist/snapshot-CdcwwWAf.mjs.map +1 -0
- package/dist/ssrf-Dv0_tRpo.mjs +406 -0
- package/dist/ssrf-Dv0_tRpo.mjs.map +1 -0
- package/dist/stage-CUjhED3P.mjs +662 -0
- package/dist/stage-CUjhED3P.mjs.map +1 -0
- package/dist/staged-C36IWXff.mjs +659 -0
- package/dist/staged-C36IWXff.mjs.map +1 -0
- package/dist/state-CKouMCSY.mjs +153 -0
- package/dist/state-CKouMCSY.mjs.map +1 -0
- package/dist/status-lzyj4Uu7.mjs +30 -0
- package/dist/status-lzyj4Uu7.mjs.map +1 -0
- 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/storage-query-B-cWcTjJ.d.mts +1594 -0
- package/dist/storage-query-B-cWcTjJ.d.mts.map +1 -0
- package/dist/tar-DsTXX6ch.mjs +449 -0
- package/dist/tar-DsTXX6ch.mjs.map +1 -0
- package/dist/target-DLQCwp_Z.mjs +27 -0
- package/dist/target-DLQCwp_Z.mjs.map +1 -0
- package/dist/taxonomies-BlAjr4BL.mjs +697 -0
- package/dist/taxonomies-BlAjr4BL.mjs.map +1 -0
- package/dist/taxonomies-Byyo7LOZ.mjs +939 -0
- package/dist/taxonomies-Byyo7LOZ.mjs.map +1 -0
- package/dist/taxonomy-CKDwM61Y.mjs +525 -0
- package/dist/taxonomy-CKDwM61Y.mjs.map +1 -0
- package/dist/tokens-BojXlk49.mjs +171 -0
- package/dist/tokens-BojXlk49.mjs.map +1 -0
- package/dist/transaction-DLPQWik1.mjs +29 -0
- package/dist/transaction-DLPQWik1.mjs.map +1 -0
- package/dist/transfer-XSTh2BCr.mjs +8706 -0
- package/dist/transfer-XSTh2BCr.mjs.map +1 -0
- package/dist/transfer-download-DkoCDA9d.mjs +33 -0
- package/dist/transfer-download-DkoCDA9d.mjs.map +1 -0
- package/dist/transfer-iQ26J-RT.mjs +166 -0
- package/dist/transfer-iQ26J-RT.mjs.map +1 -0
- package/dist/transformations-C7RQabKQ.mjs +196 -0
- package/dist/transformations-C7RQabKQ.mjs.map +1 -0
- package/dist/transport-D3RulfD6.mjs +136 -0
- package/dist/transport-D3RulfD6.mjs.map +1 -0
- package/dist/transport-DhlZlf4D.d.mts +42 -0
- package/dist/transport-DhlZlf4D.d.mts.map +1 -0
- package/dist/trusted-proxy-B6ECOZJc.mjs +51 -0
- package/dist/trusted-proxy-B6ECOZJc.mjs.map +1 -0
- package/dist/turnstile-lqUiY7lP.mjs +53 -0
- package/dist/turnstile-lqUiY7lP.mjs.map +1 -0
- package/dist/types-4Dn9bZhu.mjs +77 -0
- package/dist/types-4Dn9bZhu.mjs.map +1 -0
- package/dist/types-5LSo7PPx.d.mts +85 -0
- package/dist/types-5LSo7PPx.d.mts.map +1 -0
- package/dist/types-BQ3hwYJT.d.mts +896 -0
- package/dist/types-BQ3hwYJT.d.mts.map +1 -0
- package/dist/types-BYEk7qo3.d.mts +198 -0
- package/dist/types-BYEk7qo3.d.mts.map +1 -0
- package/dist/types-CJKsWVFR.mjs +199 -0
- package/dist/types-CJKsWVFR.mjs.map +1 -0
- package/dist/types-Ca_w8mmY.d.mts +363 -0
- package/dist/types-Ca_w8mmY.d.mts.map +1 -0
- package/dist/types-CkE41ZAG.mjs +18 -0
- package/dist/types-CkE41ZAG.mjs.map +1 -0
- package/dist/types-D0aJW2uR.d.mts +1641 -0
- package/dist/types-D0aJW2uR.d.mts.map +1 -0
- package/dist/types-DbpN4Qto.d.mts +372 -0
- package/dist/types-DbpN4Qto.d.mts.map +1 -0
- package/dist/types-ILDI1sdY.mjs +16 -0
- package/dist/types-ILDI1sdY.mjs.map +1 -0
- package/dist/types-OC5c-edM.mjs +22 -0
- package/dist/types-OC5c-edM.mjs.map +1 -0
- package/dist/types-aOOxRSx6.mjs +103 -0
- package/dist/types-aOOxRSx6.mjs.map +1 -0
- package/dist/types-m1WbUffD.d.mts +198 -0
- package/dist/types-m1WbUffD.d.mts.map +1 -0
- package/dist/types-uxLoPBio.d.mts +124 -0
- package/dist/types-uxLoPBio.d.mts.map +1 -0
- package/dist/types-we5uR-tV.d.mts +287 -0
- package/dist/types-we5uR-tV.d.mts.map +1 -0
- package/dist/upload-attempts-DduMy6B0.mjs +32 -0
- package/dist/upload-attempts-DduMy6B0.mjs.map +1 -0
- package/dist/url-pattern-B3EwxAAk.mjs +33 -0
- package/dist/url-pattern-B3EwxAAk.mjs.map +1 -0
- package/dist/user-ElwQjTQT.mjs +171 -0
- package/dist/user-ElwQjTQT.mjs.map +1 -0
- package/dist/utils-BlAXmfOG.mjs +439 -0
- package/dist/utils-BlAXmfOG.mjs.map +1 -0
- package/dist/validate-CH0X5b2c.d.mts +468 -0
- package/dist/validate-CH0X5b2c.d.mts.map +1 -0
- package/dist/validate-CfgRpcjA.mjs +492 -0
- package/dist/validate-CfgRpcjA.mjs.map +1 -0
- package/dist/validation-DvYJtv4k.mjs +218 -0
- package/dist/validation-DvYJtv4k.mjs.map +1 -0
- package/dist/version-DgYjhTud.mjs +9 -0
- package/dist/version-DgYjhTud.mjs.map +1 -0
- package/dist/version-Dq71scUb.mjs +7 -0
- package/dist/version-Dq71scUb.mjs.map +1 -0
- package/dist/widgets-ChFIj0be.mjs +126 -0
- package/dist/widgets-ChFIj0be.mjs.map +1 -0
- package/dist/wxr-taxonomies-CBZMp2YX.mjs +372 -0
- package/dist/wxr-taxonomies-CBZMp2YX.mjs.map +1 -0
- package/dist/wxr-taxonomies-DlKDpWN1.d.mts +34 -0
- package/dist/wxr-taxonomies-DlKDpWN1.d.mts.map +1 -0
- package/dist/zod-generator-DmTKI-Ig.mjs +426 -0
- package/dist/zod-generator-DmTKI-Ig.mjs.map +1 -0
- package/package.json +7 -6
- package/src/api/handlers/content.ts +593 -16
- package/src/api/handlers/device-flow.ts +74 -21
- package/src/api/handlers/index.ts +1 -0
- package/src/api/handlers/manifest.ts +79 -5
- package/src/api/handlers/media-upload.ts +17 -71
- package/src/api/handlers/media.ts +97 -3
- package/src/api/handlers/relations.ts +638 -157
- package/src/api/handlers/revision.ts +30 -0
- package/src/api/handlers/schema.ts +403 -1
- package/src/api/handlers/snapshot.ts +257 -3
- package/src/api/handlers/staged-references.ts +142 -0
- package/src/api/handlers/validate-references.ts +146 -0
- package/src/api/schemas/content.ts +13 -0
- package/src/api/schemas/relations.ts +54 -44
- package/src/api/schemas/schema.ts +14 -0
- package/src/astro/integration/routes.ts +15 -19
- package/src/astro/integration/vite-config.ts +10 -4
- package/src/astro/middleware.ts +1 -0
- package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/children.ts +11 -54
- package/src/astro/routes/api/content/[collection]/[id].ts +3 -1
- package/src/astro/routes/api/oauth/device/authorize.ts +33 -4
- package/src/astro/routes/api/relations/index.ts +4 -4
- package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +6 -2
- package/src/astro/routes/api/setup/index.ts +66 -23
- package/src/astro/routes/api/snapshot.ts +2 -1
- package/src/astro/types.ts +10 -0
- package/src/cleanup.ts +10 -0
- package/src/cli/commands/export-seed.ts +510 -89
- package/src/components/Columns.astro +3 -1
- package/src/components/Cover.astro +3 -1
- package/src/components/WidgetArea.astro +3 -2
- package/src/database/migrations/086_relations_structural.ts +197 -0
- package/src/database/migrations/087_reference_field_relations.ts +407 -0
- package/src/database/migrations/runner.ts +4 -0
- package/src/database/reference-backfill.ts +141 -0
- package/src/database/repositories/content.ts +43 -8
- package/src/database/repositories/media.ts +40 -1
- package/src/database/repositories/redirect.ts +17 -34
- package/src/database/repositories/relation.ts +620 -208
- package/src/database/repositories/revision.ts +16 -0
- package/src/database/repositories/types.ts +38 -0
- package/src/database/transaction.ts +12 -1
- package/src/database/types.ts +14 -5
- package/src/emdash-runtime.ts +114 -11
- package/src/index.ts +11 -0
- package/src/loader.ts +169 -22
- package/src/mcp/server.ts +13 -48
- package/src/query.ts +455 -25
- package/src/references/field-map.ts +115 -0
- package/src/references/resolve.ts +160 -0
- package/src/references/staged.ts +117 -0
- package/src/references/types.ts +16 -0
- package/src/registry/artifact-fetch.ts +45 -271
- package/src/schema/registry.ts +99 -24
- package/src/schema/types.ts +58 -0
- package/src/schema/zod-generator.ts +67 -1
- package/src/seed/apply.ts +841 -103
- package/src/seed/types.ts +36 -2
- package/src/seed/validate.ts +78 -2
- package/src/transfer/analyze/unique-keys.ts +3 -12
- package/src/transfer/analyze/validate.ts +65 -39
- package/src/transfer/analyze/values.ts +12 -1
- package/src/transfer/export/readers.ts +12 -8
- package/src/transfer/format/columns.ts +26 -6
- package/src/transfer/format/kinds.ts +21 -5
- package/src/transfer/import/context.ts +8 -1
- package/src/transfer/ops/package-index.ts +1 -1
- package/dist/action-token-DYwe4Pk0.mjs +0 -26
- package/dist/action-token-DYwe4Pk0.mjs.map +0 -1
- package/dist/activation-LOkDM5WT.mjs +0 -382
- package/dist/activation-LOkDM5WT.mjs.map +0 -1
- package/dist/adapters-B64LbYcB.d.mts +0 -171
- package/dist/adapters-B64LbYcB.d.mts.map +0 -1
- package/dist/allowed-origins-CHB8oZNM.mjs +0 -116
- package/dist/allowed-origins-CHB8oZNM.mjs.map +0 -1
- package/dist/api-cFFZpyS0.mjs +0 -4718
- package/dist/api-cFFZpyS0.mjs.map +0 -1
- package/dist/api-tokens-s4i4aUp_.mjs +0 -166
- package/dist/api-tokens-s4i4aUp_.mjs.map +0 -1
- package/dist/apply-CoT603H3.mjs +0 -1163
- package/dist/apply-CoT603H3.mjs.map +0 -1
- package/dist/approvals-CqMfNxak.mjs +0 -460
- package/dist/approvals-CqMfNxak.mjs.map +0 -1
- package/dist/artifact-fetch-DZMOGZ3-.mjs +0 -818
- package/dist/artifact-fetch-DZMOGZ3-.mjs.map +0 -1
- package/dist/astro/routes/api/relations/_id_/translations.d.mts +0 -8
- package/dist/astro/routes/api/relations/_id_/translations.d.mts.map +0 -1
- package/dist/astro/routes/api/relations/_id_/translations.mjs +0 -47
- package/dist/astro/routes/api/relations/_id_/translations.mjs.map +0 -1
- package/dist/audit-RfCugiSB.mjs +0 -127
- package/dist/audit-RfCugiSB.mjs.map +0 -1
- package/dist/authoritative-records-CoJvBXAD.mjs +0 -5172
- package/dist/authoritative-records-CoJvBXAD.mjs.map +0 -1
- package/dist/authorize-seCifOMJ.mjs +0 -49
- package/dist/authorize-seCifOMJ.mjs.map +0 -1
- package/dist/backup-CBu0LrXf.mjs +0 -246
- package/dist/backup-CBu0LrXf.mjs.map +0 -1
- package/dist/block-type-registry-DUI_3KxT.mjs +0 -6709
- package/dist/block-type-registry-DUI_3KxT.mjs.map +0 -1
- package/dist/block-types-BmZmLmAD.mjs +0 -132
- package/dist/block-types-BmZmLmAD.mjs.map +0 -1
- package/dist/block-values-C_VIPr5t.mjs +0 -175
- package/dist/block-values-C_VIPr5t.mjs.map +0 -1
- package/dist/byline-DYmkXqvo.mjs +0 -909
- package/dist/byline-DYmkXqvo.mjs.map +0 -1
- package/dist/byline-fields-D28AT-Fh.mjs +0 -123
- package/dist/byline-fields-D28AT-Fh.mjs.map +0 -1
- package/dist/byline-registry-gnKscbQX.mjs +0 -406
- package/dist/byline-registry-gnKscbQX.mjs.map +0 -1
- package/dist/bylines-BPwJqoYH.mjs +0 -232
- package/dist/bylines-BPwJqoYH.mjs.map +0 -1
- package/dist/bylines-ukLaYpVZ.mjs +0 -214
- package/dist/bylines-ukLaYpVZ.mjs.map +0 -1
- package/dist/cache-m7UEkRFV.mjs +0 -108
- package/dist/cache-m7UEkRFV.mjs.map +0 -1
- package/dist/canonical-YhEQezjg.mjs +0 -174
- package/dist/canonical-YhEQezjg.mjs.map +0 -1
- package/dist/capture-triggers-kJyl_yyM.mjs +0 -362
- package/dist/capture-triggers-kJyl_yyM.mjs.map +0 -1
- package/dist/challenge-store-ppU6Uv13.mjs +0 -51
- package/dist/challenge-store-ppU6Uv13.mjs.map +0 -1
- package/dist/checksum-B2IINIlN.mjs +0 -162
- package/dist/checksum-B2IINIlN.mjs.map +0 -1
- package/dist/chrome-tags-DApCQSIk.mjs +0 -24
- package/dist/chrome-tags-DApCQSIk.mjs.map +0 -1
- package/dist/chunks-Dms7Uxbt.mjs +0 -25
- package/dist/chunks-Dms7Uxbt.mjs.map +0 -1
- package/dist/collection-deletion-BIm28mo3.mjs +0 -436
- package/dist/collection-deletion-BIm28mo3.mjs.map +0 -1
- package/dist/collection-deletion-processor-Br6rxs3u.mjs +0 -217
- package/dist/collection-deletion-processor-Br6rxs3u.mjs.map +0 -1
- package/dist/collection-slugs-cache-CjGk__zp.mjs +0 -85
- package/dist/collection-slugs-cache-CjGk__zp.mjs.map +0 -1
- package/dist/comment-CrBl22OF.mjs +0 -313
- package/dist/comment-CrBl22OF.mjs.map +0 -1
- package/dist/comment-reaction-JEQ2Fpd8.mjs +0 -85
- package/dist/comment-reaction-JEQ2Fpd8.mjs.map +0 -1
- package/dist/comments-2ah9du9y.mjs +0 -195
- package/dist/comments-2ah9du9y.mjs.map +0 -1
- package/dist/comments-fHZ8ON9O.mjs +0 -99
- package/dist/comments-fHZ8ON9O.mjs.map +0 -1
- package/dist/components-CXbq7CSM.mjs +0 -108
- package/dist/components-CXbq7CSM.mjs.map +0 -1
- package/dist/config-5ii2haYu.d.mts +0 -6528
- package/dist/config-5ii2haYu.d.mts.map +0 -1
- package/dist/config-IhybvkIQ.mjs +0 -242
- package/dist/config-IhybvkIQ.mjs.map +0 -1
- package/dist/config-Py43JK9r.d.mts +0 -39
- package/dist/config-Py43JK9r.d.mts.map +0 -1
- package/dist/content-DFaIEDj9.mjs +0 -2281
- package/dist/content-DFaIEDj9.mjs.map +0 -1
- package/dist/content-list-query-Dra4Dalc.d.mts +0 -26
- package/dist/content-list-query-Dra4Dalc.d.mts.map +0 -1
- package/dist/content-policy-DFNw91-d.mjs +0 -46
- package/dist/content-policy-DFNw91-d.mjs.map +0 -1
- package/dist/content-repair-Q8IUrpLL.mjs +0 -442
- package/dist/content-repair-Q8IUrpLL.mjs.map +0 -1
- package/dist/context-BeGccdUX.mjs +0 -1921
- package/dist/context-BeGccdUX.mjs.map +0 -1
- package/dist/cron-7DCJwPXq.mjs +0 -284
- package/dist/cron-7DCJwPXq.mjs.map +0 -1
- package/dist/dashboard-DjrB-xxZ.mjs +0 -151
- package/dist/dashboard-DjrB-xxZ.mjs.map +0 -1
- package/dist/default-DQ6vsviu.mjs +0 -81
- package/dist/default-DQ6vsviu.mjs.map +0 -1
- package/dist/deferred-tasks-BPxXUB4x.d.mts +0 -9
- package/dist/deferred-tasks-BPxXUB4x.d.mts.map +0 -1
- package/dist/dev-typegen-CZaPLl3V.mjs +0 -29
- package/dist/dev-typegen-CZaPLl3V.mjs.map +0 -1
- package/dist/device-flow-CRd6DXmW.mjs +0 -466
- package/dist/device-flow-CRd6DXmW.mjs.map +0 -1
- package/dist/digest-BarSh-pN.mjs +0 -194
- package/dist/digest-BarSh-pN.mjs.map +0 -1
- package/dist/direct-executor-BmuFJJZV.mjs +0 -104
- package/dist/direct-executor-BmuFJJZV.mjs.map +0 -1
- package/dist/dist-BNwANFJR.mjs +0 -810
- package/dist/dist-BNwANFJR.mjs.map +0 -1
- package/dist/email-console-bJn3ctqA.mjs +0 -50
- package/dist/email-console-bJn3ctqA.mjs.map +0 -1
- package/dist/email-locale-CN6WAMx0.mjs +0 -25
- package/dist/email-locale-CN6WAMx0.mjs.map +0 -1
- package/dist/emdash-runtime-DAjghyEG.mjs +0 -4186
- package/dist/emdash-runtime-DAjghyEG.mjs.map +0 -1
- package/dist/enrich-Dl3kZ-lP.mjs +0 -194
- package/dist/enrich-Dl3kZ-lP.mjs.map +0 -1
- package/dist/entry-lock-BJYdBfXb.mjs +0 -1097
- package/dist/entry-lock-BJYdBfXb.mjs.map +0 -1
- package/dist/entry-lock-DHQOxN7R.mjs +0 -163
- package/dist/entry-lock-DHQOxN7R.mjs.map +0 -1
- package/dist/entry-lock-DVhCt49A.d.mts +0 -4368
- package/dist/entry-lock-DVhCt49A.d.mts.map +0 -1
- package/dist/entry-locks-D0foLdjQ.mjs +0 -167
- package/dist/entry-locks-D0foLdjQ.mjs.map +0 -1
- package/dist/error-CfvOHP0M.mjs +0 -90
- package/dist/error-CfvOHP0M.mjs.map +0 -1
- package/dist/errors-BF0_LFhW.mjs +0 -460
- package/dist/errors-BF0_LFhW.mjs.map +0 -1
- package/dist/errors-DgE1zJGG.mjs +0 -120
- package/dist/errors-DgE1zJGG.mjs.map +0 -1
- package/dist/escape-CuaZhZvL.mjs +0 -9
- package/dist/escape-CuaZhZvL.mjs.map +0 -1
- package/dist/fence-CMDXJYc_.mjs +0 -162
- package/dist/fence-CMDXJYc_.mjs.map +0 -1
- package/dist/field-defs-cache-HIgBbqZZ.mjs +0 -77
- package/dist/field-defs-cache-HIgBbqZZ.mjs.map +0 -1
- package/dist/focal-point-Gr34o-4o.mjs +0 -23
- package/dist/focal-point-Gr34o-4o.mjs.map +0 -1
- package/dist/fts-manager-S-K0laoS.mjs +0 -443
- package/dist/fts-manager-S-K0laoS.mjs.map +0 -1
- package/dist/gc-DjKY0Ay1.mjs +0 -75
- package/dist/gc-DjKY0Ay1.mjs.map +0 -1
- package/dist/hash-SDAW6zC-.mjs +0 -37
- package/dist/hash-SDAW6zC-.mjs.map +0 -1
- package/dist/hook-result-B5bXDgS2.d.mts +0 -31
- package/dist/hook-result-B5bXDgS2.d.mts.map +0 -1
- package/dist/hreflang-D5uNnsGJ.d.mts +0 -50
- package/dist/hreflang-D5uNnsGJ.d.mts.map +0 -1
- package/dist/hreflang-DMFBL2eb.mjs +0 -105
- package/dist/hreflang-DMFBL2eb.mjs.map +0 -1
- package/dist/http-route-dispatch-BitqzwMy.mjs +0 -339
- package/dist/http-route-dispatch-BitqzwMy.mjs.map +0 -1
- package/dist/identity-IyNWwXr6.mjs +0 -35
- package/dist/identity-IyNWwXr6.mjs.map +0 -1
- package/dist/import-C3JZplWq.mjs +0 -2020
- package/dist/import-C3JZplWq.mjs.map +0 -1
- package/dist/index-D-hdtLe8.d.mts +0 -623
- package/dist/index-D-hdtLe8.d.mts.map +0 -1
- package/dist/install-finalization-DfM1fj5x.mjs +0 -58
- package/dist/install-finalization-DfM1fj5x.mjs.map +0 -1
- package/dist/keys-yxLm5l35.mjs +0 -61
- package/dist/keys-yxLm5l35.mjs.map +0 -1
- package/dist/kinds-CRu_T5T5.mjs +0 -961
- package/dist/kinds-CRu_T5T5.mjs.map +0 -1
- package/dist/lifecycle-BzeGPeQ-.mjs +0 -25
- package/dist/lifecycle-BzeGPeQ-.mjs.map +0 -1
- package/dist/load-XgJiE6_3.mjs +0 -28
- package/dist/load-XgJiE6_3.mjs.map +0 -1
- package/dist/loader-BzqeR1ZN.mjs +0 -1086
- package/dist/loader-BzqeR1ZN.mjs.map +0 -1
- package/dist/loops-BQSzv5Zn.mjs +0 -203
- package/dist/loops-BQSzv5Zn.mjs.map +0 -1
- package/dist/manifest-builder-B8zR-73J.mjs +0 -189
- package/dist/manifest-builder-B8zR-73J.mjs.map +0 -1
- package/dist/manifest-schema-CY3zng_M.mjs +0 -492
- package/dist/manifest-schema-CY3zng_M.mjs.map +0 -1
- package/dist/media-Pu1L6xir.mjs +0 -408
- package/dist/media-Pu1L6xir.mjs.map +0 -1
- package/dist/media-Qp5S3eH3.mjs +0 -355
- package/dist/media-Qp5S3eH3.mjs.map +0 -1
- package/dist/media-allowlist-BSoa9Vvm.mjs +0 -44
- package/dist/media-allowlist-BSoa9Vvm.mjs.map +0 -1
- package/dist/media-folders-BE0oo2eX.mjs +0 -210
- package/dist/media-folders-BE0oo2eX.mjs.map +0 -1
- package/dist/media-h7tOiDLj.mjs +0 -221
- package/dist/media-h7tOiDLj.mjs.map +0 -1
- package/dist/media-url-jArBpzIG.mjs +0 -43
- package/dist/media-url-jArBpzIG.mjs.map +0 -1
- package/dist/media-usage-My-Vi-ex.mjs +0 -1629
- package/dist/media-usage-My-Vi-ex.mjs.map +0 -1
- package/dist/media-usage-activation-HKp7zk7W.mjs +0 -78
- package/dist/media-usage-activation-HKp7zk7W.mjs.map +0 -1
- package/dist/media-usage-work-C2OZLCAd.mjs +0 -586
- package/dist/media-usage-work-C2OZLCAd.mjs.map +0 -1
- package/dist/media-usage-work-DwUNbgvS.mjs +0 -152
- package/dist/media-usage-work-DwUNbgvS.mjs.map +0 -1
- package/dist/menus-BM7BPLOb.mjs +0 -139
- package/dist/menus-BM7BPLOb.mjs.map +0 -1
- package/dist/menus-ITeAbcIF.mjs +0 -753
- package/dist/menus-ITeAbcIF.mjs.map +0 -1
- package/dist/menus-TsSGmSR4.mjs +0 -3608
- package/dist/menus-TsSGmSR4.mjs.map +0 -1
- package/dist/mime-ChLqYwDk.mjs +0 -36
- package/dist/mime-ChLqYwDk.mjs.map +0 -1
- package/dist/mode-CCuKXUci.mjs +0 -23
- package/dist/mode-CCuKXUci.mjs.map +0 -1
- package/dist/node-sqlite-compat-CONMsl-x.mjs +0 -46
- package/dist/node-sqlite-compat-CONMsl-x.mjs.map +0 -1
- package/dist/normalize-CO2P8-iE.mjs +0 -191
- package/dist/normalize-CO2P8-iE.mjs.map +0 -1
- package/dist/oauth-authorization-DlMIL5_h.mjs +0 -274
- package/dist/oauth-authorization-DlMIL5_h.mjs.map +0 -1
- package/dist/oauth-clients-Djq9r_KP.mjs +0 -266
- package/dist/oauth-clients-Djq9r_KP.mjs.map +0 -1
- package/dist/oauth-state-store-BbjnZXNC.mjs +0 -50
- package/dist/oauth-state-store-BbjnZXNC.mjs.map +0 -1
- package/dist/oauth-user-lookup-vue9a64A.mjs +0 -26
- package/dist/oauth-user-lookup-vue9a64A.mjs.map +0 -1
- package/dist/options-SQCHQCPH.d.mts +0 -81
- package/dist/options-SQCHQCPH.d.mts.map +0 -1
- package/dist/parse-CVgO-Qai.d.mts +0 -168
- package/dist/parse-CVgO-Qai.d.mts.map +0 -1
- package/dist/parse-DY6OD1j_.mjs +0 -81
- package/dist/parse-DY6OD1j_.mjs.map +0 -1
- package/dist/passkey-config-X_H8128a.mjs +0 -46
- package/dist/passkey-config-X_H8128a.mjs.map +0 -1
- package/dist/paths-JxokKIbr.mjs +0 -77
- package/dist/paths-JxokKIbr.mjs.map +0 -1
- package/dist/patterns-BhAvqO0S.mjs +0 -145
- package/dist/patterns-BhAvqO0S.mjs.map +0 -1
- package/dist/placeholder-MSEd8gty.d.mts +0 -306
- package/dist/placeholder-MSEd8gty.d.mts.map +0 -1
- package/dist/plan-xjcWrAah.mjs +0 -135
- package/dist/plan-xjcWrAah.mjs.map +0 -1
- package/dist/plugins-DUXUt8B9.mjs +0 -277
- package/dist/plugins-DUXUt8B9.mjs.map +0 -1
- package/dist/policy-CUvwAARc.mjs +0 -45
- package/dist/policy-CUvwAARc.mjs.map +0 -1
- package/dist/portable-text-5O_ZGUjB.mjs +0 -307
- package/dist/portable-text-5O_ZGUjB.mjs.map +0 -1
- package/dist/preview-CIUcPYr6.mjs +0 -107
- package/dist/preview-CIUcPYr6.mjs.map +0 -1
- package/dist/protocol-B97DZaFr.d.mts +0 -61
- package/dist/protocol-B97DZaFr.d.mts.map +0 -1
- package/dist/public-submission-BFBUrqst.mjs +0 -250
- package/dist/public-submission-BFBUrqst.mjs.map +0 -1
- package/dist/public-url-Bn7U0D7-.mjs +0 -101
- package/dist/public-url-Bn7U0D7-.mjs.map +0 -1
- package/dist/query-B48peoRT.mjs +0 -890
- package/dist/query-B48peoRT.mjs.map +0 -1
- package/dist/query-C4IH0uhR.mjs +0 -41
- package/dist/query-C4IH0uhR.mjs.map +0 -1
- package/dist/rate-limit-BZ6nybgc.mjs +0 -120
- package/dist/rate-limit-BZ6nybgc.mjs.map +0 -1
- package/dist/receipt-B4wJj5Jq.mjs +0 -43
- package/dist/receipt-B4wJj5Jq.mjs.map +0 -1
- package/dist/redirect-Cd1E7VUt.mjs +0 -17
- package/dist/redirect-Cd1E7VUt.mjs.map +0 -1
- package/dist/redirect-iJf5fltD.mjs +0 -415
- package/dist/redirect-iJf5fltD.mjs.map +0 -1
- package/dist/redirects-CYu1u1aK.mjs +0 -446
- package/dist/redirects-CYu1u1aK.mjs.map +0 -1
- package/dist/redirects-Cv9apQKj.mjs +0 -148
- package/dist/redirects-Cv9apQKj.mjs.map +0 -1
- package/dist/relation-M4NUCb0b.mjs +0 -334
- package/dist/relation-M4NUCb0b.mjs.map +0 -1
- package/dist/relations-CCif47Oq.mjs +0 -403
- package/dist/relations-CCif47Oq.mjs.map +0 -1
- package/dist/relations-CK9CYUyr.mjs +0 -310
- package/dist/relations-CK9CYUyr.mjs.map +0 -1
- package/dist/request-cache-DzLYKm_x.mjs +0 -104
- package/dist/request-cache-DzLYKm_x.mjs.map +0 -1
- package/dist/request-meta-sZXt3sRo.mjs +0 -141
- package/dist/request-meta-sZXt3sRo.mjs.map +0 -1
- package/dist/resolve-2WbQsCvT.mjs +0 -199
- package/dist/resolve-2WbQsCvT.mjs.map +0 -1
- package/dist/route-wire--1hLuACz.mjs +0 -197
- package/dist/route-wire--1hLuACz.mjs.map +0 -1
- package/dist/routes-CUsM40Cc.mjs +0 -272
- package/dist/routes-CUsM40Cc.mjs.map +0 -1
- package/dist/runner-1y4J9fJB.mjs +0 -5742
- package/dist/runner-1y4J9fJB.mjs.map +0 -1
- package/dist/runner-D5_LzKXI.d.mts +0 -68
- package/dist/runner-D5_LzKXI.d.mts.map +0 -1
- package/dist/schema-BABiRdsH.mjs +0 -13
- package/dist/schema-BABiRdsH.mjs.map +0 -1
- package/dist/schema-Du3MzCG0.mjs +0 -446
- package/dist/schema-Du3MzCG0.mjs.map +0 -1
- package/dist/scopes-Dbk-ElhT.mjs +0 -34
- package/dist/scopes-Dbk-ElhT.mjs.map +0 -1
- package/dist/search-Bt1PL1jf.mjs +0 -448
- package/dist/search-Bt1PL1jf.mjs.map +0 -1
- package/dist/sections-Ddptx_o9.mjs +0 -346
- package/dist/sections-Ddptx_o9.mjs.map +0 -1
- package/dist/seo-CZT2oLtT.mjs +0 -114
- package/dist/seo-CZT2oLtT.mjs.map +0 -1
- package/dist/seo-D5w3-Azy.mjs +0 -133
- package/dist/seo-D5w3-Azy.mjs.map +0 -1
- package/dist/service-DuykXPyW.mjs +0 -150
- package/dist/service-DuykXPyW.mjs.map +0 -1
- package/dist/session-user-BhaVp8w0.mjs +0 -51
- package/dist/session-user-BhaVp8w0.mjs.map +0 -1
- package/dist/settings-2xNYr90o.mjs +0 -51
- package/dist/settings-2xNYr90o.mjs.map +0 -1
- package/dist/settings-CgjRWGW9.mjs +0 -439
- package/dist/settings-CgjRWGW9.mjs.map +0 -1
- package/dist/settings-DYidIB26.mjs +0 -61
- package/dist/settings-DYidIB26.mjs.map +0 -1
- package/dist/setup-complete-bOogcHWG.mjs +0 -26
- package/dist/setup-complete-bOogcHWG.mjs.map +0 -1
- package/dist/setup-nonce-0EGuKM4s.mjs +0 -25
- package/dist/setup-nonce-0EGuKM4s.mjs.map +0 -1
- package/dist/site-settings-DOgRUoFX.mjs +0 -50
- package/dist/site-settings-DOgRUoFX.mjs.map +0 -1
- package/dist/site-url-BU_bbxwj.mjs +0 -16
- package/dist/site-url-BU_bbxwj.mjs.map +0 -1
- package/dist/snapshot-CugwUqKQ.mjs +0 -237
- package/dist/snapshot-CugwUqKQ.mjs.map +0 -1
- package/dist/ssrf-CJUnJymJ.mjs +0 -406
- package/dist/ssrf-CJUnJymJ.mjs.map +0 -1
- package/dist/stage-DgrBz_du.mjs +0 -662
- package/dist/stage-DgrBz_du.mjs.map +0 -1
- package/dist/state-DDiPySSG.mjs +0 -153
- package/dist/state-DDiPySSG.mjs.map +0 -1
- package/dist/status-DZKIG4a9.mjs +0 -30
- package/dist/status-DZKIG4a9.mjs.map +0 -1
- package/dist/storage-query-Bdv7A62k.d.mts +0 -1576
- package/dist/storage-query-Bdv7A62k.d.mts.map +0 -1
- package/dist/tar-_1AgTYFu.mjs +0 -449
- package/dist/tar-_1AgTYFu.mjs.map +0 -1
- package/dist/target-_7pn2Gbg.mjs +0 -27
- package/dist/target-_7pn2Gbg.mjs.map +0 -1
- package/dist/taxonomies-C1IwNe8Q.mjs +0 -697
- package/dist/taxonomies-C1IwNe8Q.mjs.map +0 -1
- package/dist/taxonomies-C_XMoRcX.mjs +0 -939
- package/dist/taxonomies-C_XMoRcX.mjs.map +0 -1
- package/dist/taxonomy-C3Fu1YeH.mjs +0 -525
- package/dist/taxonomy-C3Fu1YeH.mjs.map +0 -1
- package/dist/tokens-u78jETkX.mjs +0 -171
- package/dist/tokens-u78jETkX.mjs.map +0 -1
- package/dist/transaction-BcJO4Tmc.mjs +0 -29
- package/dist/transaction-BcJO4Tmc.mjs.map +0 -1
- package/dist/transfer-BhUCrgDc.mjs +0 -8675
- package/dist/transfer-BhUCrgDc.mjs.map +0 -1
- package/dist/transfer-DIGvR9Af.mjs +0 -166
- package/dist/transfer-DIGvR9Af.mjs.map +0 -1
- package/dist/transfer-download-Pml7RMio.mjs +0 -33
- package/dist/transfer-download-Pml7RMio.mjs.map +0 -1
- package/dist/transformations-9gfpwY65.mjs +0 -196
- package/dist/transformations-9gfpwY65.mjs.map +0 -1
- package/dist/transport-BIfH7_hx.d.mts +0 -42
- package/dist/transport-BIfH7_hx.d.mts.map +0 -1
- package/dist/transport-DKWIq53q.mjs +0 -136
- package/dist/transport-DKWIq53q.mjs.map +0 -1
- package/dist/trusted-proxy-tKiVtyTD.mjs +0 -51
- package/dist/trusted-proxy-tKiVtyTD.mjs.map +0 -1
- package/dist/turnstile-DpsoyOfg.mjs +0 -53
- package/dist/turnstile-DpsoyOfg.mjs.map +0 -1
- package/dist/types-B4sUC2p1.d.mts +0 -198
- package/dist/types-B4sUC2p1.d.mts.map +0 -1
- package/dist/types-B7Lmsh1E.d.mts +0 -887
- package/dist/types-B7Lmsh1E.d.mts.map +0 -1
- package/dist/types-BZakh7Ym.mjs +0 -22
- package/dist/types-BZakh7Ym.mjs.map +0 -1
- package/dist/types-B_CppEmv.d.mts +0 -264
- package/dist/types-B_CppEmv.d.mts.map +0 -1
- package/dist/types-BcrBrE6-.mjs +0 -159
- package/dist/types-BcrBrE6-.mjs.map +0 -1
- package/dist/types-BkUg2yHx.mjs +0 -92
- package/dist/types-BkUg2yHx.mjs.map +0 -1
- package/dist/types-CAZgq9fO.d.mts +0 -124
- package/dist/types-CAZgq9fO.d.mts.map +0 -1
- package/dist/types-Cd-O03VG.d.mts +0 -363
- package/dist/types-Cd-O03VG.d.mts.map +0 -1
- package/dist/types-Cr-Kg-3D.d.mts +0 -1641
- package/dist/types-Cr-Kg-3D.d.mts.map +0 -1
- package/dist/types-D2fvWd1i.d.mts +0 -359
- package/dist/types-D2fvWd1i.d.mts.map +0 -1
- package/dist/types-D7HUsguf.mjs +0 -77
- package/dist/types-D7HUsguf.mjs.map +0 -1
- package/dist/types-DA1Te3Oy.d.mts +0 -198
- package/dist/types-DA1Te3Oy.d.mts.map +0 -1
- package/dist/types-DhV6Q5bP.mjs +0 -18
- package/dist/types-DhV6Q5bP.mjs.map +0 -1
- package/dist/types-DnnVSl6Y.d.mts +0 -85
- package/dist/types-DnnVSl6Y.d.mts.map +0 -1
- package/dist/types-VT4-BugW.mjs +0 -16
- package/dist/types-VT4-BugW.mjs.map +0 -1
- package/dist/upload-attempts-B68ZGNu9.mjs +0 -32
- package/dist/upload-attempts-B68ZGNu9.mjs.map +0 -1
- package/dist/url-pattern-CCeZMGOh.mjs +0 -33
- package/dist/url-pattern-CCeZMGOh.mjs.map +0 -1
- package/dist/user-DDSL-sGw.mjs +0 -171
- package/dist/user-DDSL-sGw.mjs.map +0 -1
- package/dist/utils-DdhmO9w9.mjs +0 -439
- package/dist/utils-DdhmO9w9.mjs.map +0 -1
- package/dist/validate-CHosPEhs.mjs +0 -453
- package/dist/validate-CHosPEhs.mjs.map +0 -1
- package/dist/validate-CM79QXYE.d.mts +0 -432
- package/dist/validate-CM79QXYE.d.mts.map +0 -1
- package/dist/validation-BFecQczG.mjs +0 -218
- package/dist/validation-BFecQczG.mjs.map +0 -1
- package/dist/version-BRZXVifl.mjs +0 -9
- package/dist/version-BRZXVifl.mjs.map +0 -1
- package/dist/version-DUQDHgrf.mjs +0 -7
- package/dist/version-DUQDHgrf.mjs.map +0 -1
- package/dist/widgets-WdV72brA.mjs +0 -126
- package/dist/widgets-WdV72brA.mjs.map +0 -1
- package/dist/wxr-taxonomies-BHTdqkmZ.d.mts +0 -34
- package/dist/wxr-taxonomies-BHTdqkmZ.d.mts.map +0 -1
- package/dist/wxr-taxonomies-DP6ESgMN.mjs +0 -372
- package/dist/wxr-taxonomies-DP6ESgMN.mjs.map +0 -1
- package/dist/zod-generator-D6uE4WiS.mjs +0 -389
- package/dist/zod-generator-D6uE4WiS.mjs.map +0 -1
- package/src/astro/routes/api/relations/[id]/translations.ts +0 -33
- /package/dist/{api-tokens-CE1ECIg0.mjs → api-tokens-FaG1zPsj.mjs} +0 -0
- /package/dist/{ssrf-DpBH7aOt.mjs → ssrf-DZOt8Qof.mjs} +0 -0
|
@@ -6,13 +6,29 @@ import {
|
|
|
6
6
|
type ContentReference,
|
|
7
7
|
type CreateRelationInput,
|
|
8
8
|
type Relation,
|
|
9
|
+
type UpdateRelationInput,
|
|
9
10
|
} from "../../database/repositories/relation.js";
|
|
11
|
+
import { RevisionRepository } from "../../database/repositories/revision.js";
|
|
10
12
|
import { InvalidCursorError } from "../../database/repositories/types.js";
|
|
11
13
|
import type { ContentItem } from "../../database/repositories/types.js";
|
|
14
|
+
import { withTransaction } from "../../database/transaction.js";
|
|
12
15
|
import type { Database } from "../../database/types.js";
|
|
13
|
-
import {
|
|
16
|
+
import { invalidateCollectionCache } from "../../object-cache/index.js";
|
|
17
|
+
import {
|
|
18
|
+
pageStagedGroups,
|
|
19
|
+
readStagedReferences,
|
|
20
|
+
type PageOfGroups,
|
|
21
|
+
} from "../../references/staged.js";
|
|
22
|
+
import { requestCached } from "../../request-cache.js";
|
|
23
|
+
import { invalidateSchemaCache } from "../../schema/index.js";
|
|
14
24
|
import { SchemaRegistry } from "../../schema/registry.js";
|
|
15
25
|
import type { ApiResult } from "../types.js";
|
|
26
|
+
import {
|
|
27
|
+
constraintsForRelationSide,
|
|
28
|
+
referenceFieldConstraints,
|
|
29
|
+
validateReferenceSelection,
|
|
30
|
+
type ReferenceFieldConstraints,
|
|
31
|
+
} from "./validate-references.js";
|
|
16
32
|
|
|
17
33
|
/** Map an edge-read failure: a bad pagination cursor is a 400 client error,
|
|
18
34
|
* everything else is the generic 500-shaped reference-read error. */
|
|
@@ -26,6 +42,10 @@ function referencesGetError(error: unknown): ApiResult<never> {
|
|
|
26
42
|
};
|
|
27
43
|
}
|
|
28
44
|
|
|
45
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
46
|
+
return typeof value === "object" && value !== null;
|
|
47
|
+
}
|
|
48
|
+
|
|
29
49
|
/** True for SQLite UNIQUE / Postgres unique_violation messages (matches the
|
|
30
50
|
* fingerprint used in the content handlers). Narrow enough not to catch NOT
|
|
31
51
|
* NULL / CHECK violations whose messages also say "constraint". */
|
|
@@ -42,60 +62,31 @@ export async function handleRelationCreate(
|
|
|
42
62
|
const repo = new RelationRepository(db);
|
|
43
63
|
|
|
44
64
|
// Invariant: a relation must point at collections that exist. There is no
|
|
45
|
-
// SQL FK (
|
|
46
|
-
//
|
|
47
|
-
//
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
if (!
|
|
65
|
+
// SQL FK (the edge endpoints are content translation_groups, which
|
|
66
|
+
// precludes one), so a ghost collection would yield a
|
|
67
|
+
// structurally-valid-but-permanently-useless relation.
|
|
68
|
+
const registry = new SchemaRegistry(db);
|
|
69
|
+
for (const collection of [input.parentCollection, input.childCollection]) {
|
|
70
|
+
if (!(await registry.getCollection(collection))) {
|
|
51
71
|
return {
|
|
52
72
|
success: false,
|
|
53
73
|
error: {
|
|
54
|
-
code: "
|
|
55
|
-
message:
|
|
56
|
-
"parentCollection and childCollection are required unless translationOf is set",
|
|
74
|
+
code: "COLLECTION_NOT_FOUND",
|
|
75
|
+
message: `Collection '${collection}' not found`,
|
|
57
76
|
},
|
|
58
77
|
};
|
|
59
78
|
}
|
|
60
|
-
const registry = new SchemaRegistry(db);
|
|
61
|
-
for (const collection of [input.parentCollection, input.childCollection]) {
|
|
62
|
-
if (!(await registry.getCollection(collection))) {
|
|
63
|
-
return {
|
|
64
|
-
success: false,
|
|
65
|
-
error: {
|
|
66
|
-
code: "COLLECTION_NOT_FOUND",
|
|
67
|
-
message: `Collection '${collection}' not found`,
|
|
68
|
-
},
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
79
|
}
|
|
73
80
|
|
|
74
|
-
const relation = await repo.create(
|
|
75
|
-
...input,
|
|
76
|
-
locale: input.locale ? resolveConfiguredLocale(input.locale) : undefined,
|
|
77
|
-
});
|
|
81
|
+
const relation = await repo.create(input);
|
|
78
82
|
return { success: true, data: { relation } };
|
|
79
83
|
} catch (error) {
|
|
80
|
-
// A bad `translationOf` makes the repo throw loudly rather than mint an
|
|
81
|
-
// unlinked relation — surface it as 404, not a generic 500.
|
|
82
|
-
if (
|
|
83
|
-
error instanceof Error &&
|
|
84
|
-
error.message.includes("Source relation for translation not found")
|
|
85
|
-
) {
|
|
86
|
-
return {
|
|
87
|
-
success: false,
|
|
88
|
-
error: { code: "NOT_FOUND", message: "Source relation for translation not found" },
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
// UNIQUE(name, locale) collision, or a second translation for an
|
|
92
|
-
// already-present (translation_group, locale) — both are client conflicts.
|
|
93
84
|
if (isUniqueViolation(error)) {
|
|
94
85
|
return {
|
|
95
86
|
success: false,
|
|
96
87
|
error: {
|
|
97
88
|
code: "CONFLICT",
|
|
98
|
-
message: "A relation with this
|
|
89
|
+
message: "A relation with this slug already exists",
|
|
99
90
|
},
|
|
100
91
|
};
|
|
101
92
|
}
|
|
@@ -106,17 +97,34 @@ export async function handleRelationCreate(
|
|
|
106
97
|
}
|
|
107
98
|
}
|
|
108
99
|
|
|
100
|
+
/**
|
|
101
|
+
* A relation plus what deleting it would take with it: the reference fields
|
|
102
|
+
* that view it, and how many links it holds. Both delete dialogs enumerate
|
|
103
|
+
* these before the user confirms.
|
|
104
|
+
*/
|
|
105
|
+
export interface RelationWithUsage extends Relation {
|
|
106
|
+
boundFields: BoundField[];
|
|
107
|
+
linkCount: number;
|
|
108
|
+
}
|
|
109
|
+
|
|
109
110
|
export async function handleRelationGet(
|
|
110
111
|
db: Kysely<Database>,
|
|
111
112
|
id: string,
|
|
112
|
-
): Promise<ApiResult<{ relation:
|
|
113
|
+
): Promise<ApiResult<{ relation: RelationWithUsage }>> {
|
|
113
114
|
try {
|
|
114
115
|
const repo = new RelationRepository(db);
|
|
115
116
|
const relation = await repo.findById(id);
|
|
116
117
|
if (!relation) {
|
|
117
118
|
return { success: false, error: { code: "NOT_FOUND", message: "Relation not found" } };
|
|
118
119
|
}
|
|
119
|
-
|
|
120
|
+
const [boundFields, edgeCounts] = await Promise.all([
|
|
121
|
+
fieldsBoundToRelation(db, relation.slug),
|
|
122
|
+
repo.countEdgesByRelation(),
|
|
123
|
+
]);
|
|
124
|
+
return {
|
|
125
|
+
success: true,
|
|
126
|
+
data: { relation: { ...relation, boundFields, linkCount: edgeCounts.get(relation.id) ?? 0 } },
|
|
127
|
+
};
|
|
120
128
|
} catch {
|
|
121
129
|
return {
|
|
122
130
|
success: false,
|
|
@@ -125,15 +133,33 @@ export async function handleRelationGet(
|
|
|
125
133
|
}
|
|
126
134
|
}
|
|
127
135
|
|
|
136
|
+
/**
|
|
137
|
+
* List relations, optionally only those `collection` takes part in.
|
|
138
|
+
*
|
|
139
|
+
* The admin's relation picker filters this way: a reference field can only bind
|
|
140
|
+
* to a relation with its own collection on one end.
|
|
141
|
+
*/
|
|
128
142
|
export async function handleRelationList(
|
|
129
143
|
db: Kysely<Database>,
|
|
130
|
-
opts: {
|
|
131
|
-
): Promise<ApiResult<{ relations:
|
|
144
|
+
opts: { collection?: string } = {},
|
|
145
|
+
): Promise<ApiResult<{ relations: RelationWithUsage[] }>> {
|
|
132
146
|
try {
|
|
133
147
|
const repo = new RelationRepository(db);
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
148
|
+
const [relations, boundByRelation, edgeCounts] = await Promise.all([
|
|
149
|
+
opts.collection ? repo.findForCollection(opts.collection) : repo.list(),
|
|
150
|
+
fieldsBoundByRelation(db),
|
|
151
|
+
repo.countEdgesByRelation(),
|
|
152
|
+
]);
|
|
153
|
+
return {
|
|
154
|
+
success: true,
|
|
155
|
+
data: {
|
|
156
|
+
relations: relations.map((relation) => ({
|
|
157
|
+
...relation,
|
|
158
|
+
boundFields: boundByRelation.get(relation.slug) ?? [],
|
|
159
|
+
linkCount: edgeCounts.get(relation.id) ?? 0,
|
|
160
|
+
})),
|
|
161
|
+
},
|
|
162
|
+
};
|
|
137
163
|
} catch {
|
|
138
164
|
return {
|
|
139
165
|
success: false,
|
|
@@ -145,7 +171,7 @@ export async function handleRelationList(
|
|
|
145
171
|
export async function handleRelationUpdate(
|
|
146
172
|
db: Kysely<Database>,
|
|
147
173
|
id: string,
|
|
148
|
-
input:
|
|
174
|
+
input: UpdateRelationInput,
|
|
149
175
|
): Promise<ApiResult<{ relation: Relation }>> {
|
|
150
176
|
try {
|
|
151
177
|
const repo = new RelationRepository(db);
|
|
@@ -162,64 +188,122 @@ export async function handleRelationUpdate(
|
|
|
162
188
|
}
|
|
163
189
|
}
|
|
164
190
|
|
|
165
|
-
|
|
191
|
+
/** A reference field that views a relation, and which end it views it from. */
|
|
192
|
+
export interface BoundField {
|
|
193
|
+
collectionSlug: string;
|
|
194
|
+
fieldSlug: string;
|
|
195
|
+
side: "parent" | "child";
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Every reference field on the site, grouped by the slug of the relation it
|
|
200
|
+
* binds.
|
|
201
|
+
*
|
|
202
|
+
* Filtered in JS rather than through `json_extract`: `_emdash_fields` holds one
|
|
203
|
+
* row per field on the whole site, and the reference-typed subset of that is
|
|
204
|
+
* small enough that a scan beats a dialect-specific JSON path. Grouping the
|
|
205
|
+
* whole set in one pass also keeps the relations list to a single scan instead
|
|
206
|
+
* of one per row.
|
|
207
|
+
*/
|
|
208
|
+
export async function fieldsBoundByRelation(
|
|
166
209
|
db: Kysely<Database>,
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
210
|
+
): Promise<Map<string, BoundField[]>> {
|
|
211
|
+
const rows = await db
|
|
212
|
+
.selectFrom("_emdash_fields")
|
|
213
|
+
.innerJoin("_emdash_collections", "_emdash_collections.id", "_emdash_fields.collection_id")
|
|
214
|
+
.select([
|
|
215
|
+
"_emdash_fields.slug as fieldSlug",
|
|
216
|
+
"_emdash_collections.slug as collectionSlug",
|
|
217
|
+
"_emdash_fields.validation as validation",
|
|
218
|
+
])
|
|
219
|
+
.where("_emdash_fields.type", "=", "reference")
|
|
220
|
+
.execute();
|
|
221
|
+
|
|
222
|
+
const byRelation = new Map<string, BoundField[]>();
|
|
223
|
+
for (const row of rows) {
|
|
224
|
+
if (!row.validation) continue;
|
|
225
|
+
let parsed: unknown;
|
|
226
|
+
try {
|
|
227
|
+
parsed = JSON.parse(row.validation);
|
|
228
|
+
} catch {
|
|
229
|
+
continue;
|
|
174
230
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
231
|
+
if (!isRecord(parsed) || typeof parsed.relation !== "string") continue;
|
|
232
|
+
const bound: BoundField = {
|
|
233
|
+
collectionSlug: row.collectionSlug,
|
|
234
|
+
fieldSlug: row.fieldSlug,
|
|
235
|
+
side: parsed.relationSide === "child" ? "child" : "parent",
|
|
180
236
|
};
|
|
237
|
+
const list = byRelation.get(parsed.relation);
|
|
238
|
+
if (list) list.push(bound);
|
|
239
|
+
else byRelation.set(parsed.relation, [bound]);
|
|
181
240
|
}
|
|
241
|
+
return byRelation;
|
|
182
242
|
}
|
|
183
243
|
|
|
184
|
-
|
|
244
|
+
/** Every reference field bound to one relation, across both of its ends. */
|
|
245
|
+
export async function fieldsBoundToRelation(
|
|
246
|
+
db: Kysely<Database>,
|
|
247
|
+
relationSlug: string,
|
|
248
|
+
): Promise<BoundField[]> {
|
|
249
|
+
return (await fieldsBoundByRelation(db)).get(relationSlug) ?? [];
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Delete a relation, the reference fields bound to it, and its edges.
|
|
254
|
+
*
|
|
255
|
+
* A relation is only ever deleted deliberately — from the relations admin page,
|
|
256
|
+
* or by the checkbox on a field delete — and it cannot leave a field pointing at
|
|
257
|
+
* nothing, so the fields go with it either way. Callers show the count first;
|
|
258
|
+
* `deletedFields` reports what actually went.
|
|
259
|
+
*
|
|
260
|
+
* Order matters: fields first, then the relation row and its edges. On D1
|
|
261
|
+
* `withTransaction` degrades to sequential statements, so an interrupted run
|
|
262
|
+
* leaves a relation with fewer bound fields — visible on the relations page and
|
|
263
|
+
* finishable — rather than fields pointing at a relation that no longer exists.
|
|
264
|
+
*/
|
|
265
|
+
export async function handleRelationDelete(
|
|
185
266
|
db: Kysely<Database>,
|
|
186
267
|
id: string,
|
|
187
|
-
): Promise<
|
|
188
|
-
ApiResult<{
|
|
189
|
-
translationGroup: string;
|
|
190
|
-
translations: {
|
|
191
|
-
id: string;
|
|
192
|
-
name: string;
|
|
193
|
-
locale: string;
|
|
194
|
-
parentLabel: string;
|
|
195
|
-
childLabel: string;
|
|
196
|
-
}[];
|
|
197
|
-
}>
|
|
198
|
-
> {
|
|
268
|
+
): Promise<ApiResult<{ deleted: true; deletedFields: string[] }>> {
|
|
199
269
|
try {
|
|
200
270
|
const repo = new RelationRepository(db);
|
|
201
271
|
const relation = await repo.findById(id);
|
|
202
272
|
if (!relation) {
|
|
203
273
|
return { success: false, error: { code: "NOT_FOUND", message: "Relation not found" } };
|
|
204
274
|
}
|
|
205
|
-
|
|
275
|
+
|
|
276
|
+
const bound = await fieldsBoundToRelation(db, relation.slug);
|
|
277
|
+
|
|
278
|
+
const deleted = await withTransaction(db, async (trx) => {
|
|
279
|
+
const registry = new SchemaRegistry(trx);
|
|
280
|
+
for (const field of bound) {
|
|
281
|
+
await registry.deleteField(field.collectionSlug, field.fieldSlug);
|
|
282
|
+
}
|
|
283
|
+
return new RelationRepository(trx).delete(id);
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
if (!deleted) {
|
|
287
|
+
return { success: false, error: { code: "NOT_FOUND", message: "Relation not found" } };
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
for (const collection of new Set(bound.map((f) => f.collectionSlug))) {
|
|
291
|
+
invalidateCollectionCache(collection);
|
|
292
|
+
invalidateSchemaCache(collection);
|
|
293
|
+
}
|
|
294
|
+
|
|
206
295
|
return {
|
|
207
296
|
success: true,
|
|
208
297
|
data: {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
id: r.id,
|
|
212
|
-
name: r.name,
|
|
213
|
-
locale: r.locale,
|
|
214
|
-
parentLabel: r.parentLabel,
|
|
215
|
-
childLabel: r.childLabel,
|
|
216
|
-
})),
|
|
298
|
+
deleted: true,
|
|
299
|
+
deletedFields: bound.map((f) => `${f.collectionSlug}.${f.fieldSlug}`),
|
|
217
300
|
},
|
|
218
301
|
};
|
|
219
|
-
} catch {
|
|
302
|
+
} catch (error) {
|
|
303
|
+
console.error("Relation delete error:", error);
|
|
220
304
|
return {
|
|
221
305
|
success: false,
|
|
222
|
-
error: { code: "
|
|
306
|
+
error: { code: "RELATION_DELETE_ERROR", message: "Failed to delete relation" },
|
|
223
307
|
};
|
|
224
308
|
}
|
|
225
309
|
}
|
|
@@ -228,20 +312,62 @@ export type EntryRef = {
|
|
|
228
312
|
id: string;
|
|
229
313
|
slug: string | null;
|
|
230
314
|
collection: string;
|
|
315
|
+
/**
|
|
316
|
+
* Display label sourced from the collection's configured `titleField`, then
|
|
317
|
+
* `title`, then `name` — `null` when none is set, leaving the client to fall
|
|
318
|
+
* back to slug/id. Mirrors the admin's `getEntryTitle`.
|
|
319
|
+
*/
|
|
320
|
+
title: string | null;
|
|
231
321
|
/** The actual locale of the resolved variant — see `pickVariant`. */
|
|
232
322
|
locale: string | null;
|
|
323
|
+
/**
|
|
324
|
+
* The edge's target: the translation group `id` was resolved from. Stable
|
|
325
|
+
* across locales, unlike `id`, so callers comparing a ref against a content
|
|
326
|
+
* row (the admin's picker) match the entry rather than one of its variants.
|
|
327
|
+
*/
|
|
328
|
+
translationGroup: string | null;
|
|
233
329
|
sortOrder?: number;
|
|
234
330
|
};
|
|
235
331
|
|
|
236
|
-
/**
|
|
332
|
+
/**
|
|
333
|
+
* Display title for a resolved entry: the collection's configured `titleField`,
|
|
334
|
+
* then `title`, then `name`, else null.
|
|
335
|
+
*/
|
|
336
|
+
function entryTitle(data: Record<string, unknown>, titleField?: string): string | null {
|
|
337
|
+
if (titleField) {
|
|
338
|
+
const configured = data[titleField];
|
|
339
|
+
if (typeof configured === "string" && configured.length > 0) return configured;
|
|
340
|
+
}
|
|
341
|
+
if (typeof data.title === "string" && data.title.length > 0) return data.title;
|
|
342
|
+
if (typeof data.name === "string" && data.name.length > 0) return data.name;
|
|
343
|
+
return null;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* The collection's configured `titleField`, memoized for the request: a single
|
|
348
|
+
* content read hydrates every reference field, and several of them commonly
|
|
349
|
+
* target the same collection.
|
|
350
|
+
*/
|
|
351
|
+
export async function getReferenceTitleField(
|
|
352
|
+
db: Kysely<Database>,
|
|
353
|
+
collection: string,
|
|
354
|
+
): Promise<string | undefined> {
|
|
355
|
+
return requestCached(`reference-title-field:${collection}`, async () => {
|
|
356
|
+
const row = await db
|
|
357
|
+
.selectFrom("_emdash_collections")
|
|
358
|
+
.select("title_field")
|
|
359
|
+
.where("slug", "=", collection)
|
|
360
|
+
.executeTakeFirst();
|
|
361
|
+
return row?.title_field ?? undefined;
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/** Resolve a relation from an id OR its slug. */
|
|
237
366
|
async function resolveRelation(
|
|
238
367
|
repo: RelationRepository,
|
|
239
|
-
|
|
368
|
+
idOrSlug: string,
|
|
240
369
|
): Promise<Relation | null> {
|
|
241
|
-
|
|
242
|
-
if (byId) return byId;
|
|
243
|
-
const group = await repo.findTranslations(idOrGroup);
|
|
244
|
-
return group[0] ?? null;
|
|
370
|
+
return (await repo.findById(idOrSlug)) ?? (await repo.findBySlug(idOrSlug));
|
|
245
371
|
}
|
|
246
372
|
|
|
247
373
|
/**
|
|
@@ -268,21 +394,65 @@ function pickVariant(items: ContentItem[], locale: string | null): ContentItem |
|
|
|
268
394
|
* is restricted to published entries so a draft/scheduled entry referenced by an
|
|
269
395
|
* edge is skipped exactly like a dangling one, never leaking its id/slug/locale.
|
|
270
396
|
*/
|
|
271
|
-
|
|
397
|
+
export function resolveEntries(
|
|
272
398
|
content: ContentRepository,
|
|
273
399
|
collection: string,
|
|
274
400
|
edges: ContentReference[],
|
|
275
401
|
pick: (e: ContentReference) => string,
|
|
276
402
|
locale: string | null,
|
|
277
403
|
includeDrafts: boolean,
|
|
404
|
+
titleField?: string,
|
|
278
405
|
): Promise<EntryRef[]> {
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
406
|
+
return resolveGroupSelection(
|
|
407
|
+
content,
|
|
408
|
+
collection,
|
|
409
|
+
edges.map((edge) => ({ group: pick(edge), sortOrder: edge.sortOrder })),
|
|
410
|
+
locale,
|
|
411
|
+
includeDrafts,
|
|
412
|
+
titleField,
|
|
413
|
+
);
|
|
414
|
+
}
|
|
283
415
|
|
|
284
|
-
|
|
285
|
-
|
|
416
|
+
/**
|
|
417
|
+
* `resolveEntries` for a selection that has no links behind it yet — a pending
|
|
418
|
+
* one staged in a draft revision, which is already a list of translation groups
|
|
419
|
+
* in the order the editor chose. Position stands in for the `sort_order` the
|
|
420
|
+
* links will carry once it is published.
|
|
421
|
+
*/
|
|
422
|
+
export function resolveEntryGroups(
|
|
423
|
+
content: ContentRepository,
|
|
424
|
+
collection: string,
|
|
425
|
+
groups: string[],
|
|
426
|
+
locale: string | null,
|
|
427
|
+
includeDrafts: boolean,
|
|
428
|
+
titleField?: string,
|
|
429
|
+
): Promise<EntryRef[]> {
|
|
430
|
+
return resolveGroupSelection(
|
|
431
|
+
content,
|
|
432
|
+
collection,
|
|
433
|
+
groups.map((group, index) => ({ group, sortOrder: index })),
|
|
434
|
+
locale,
|
|
435
|
+
includeDrafts,
|
|
436
|
+
titleField,
|
|
437
|
+
);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
async function resolveGroupSelection(
|
|
441
|
+
content: ContentRepository,
|
|
442
|
+
collection: string,
|
|
443
|
+
selection: Array<{ group: string; sortOrder: number }>,
|
|
444
|
+
locale: string | null,
|
|
445
|
+
includeDrafts: boolean,
|
|
446
|
+
titleField?: string,
|
|
447
|
+
): Promise<EntryRef[]> {
|
|
448
|
+
const all = await content.findTranslationsForGroups(
|
|
449
|
+
collection,
|
|
450
|
+
selection.map((entry) => entry.group),
|
|
451
|
+
{ publishedOnly: !includeDrafts },
|
|
452
|
+
);
|
|
453
|
+
|
|
454
|
+
// Group the flat variant list by translation_group so each selected entry can
|
|
455
|
+
// pick its own locale variant.
|
|
286
456
|
const variantsByGroup = new Map<string, ContentItem[]>();
|
|
287
457
|
for (const item of all) {
|
|
288
458
|
if (item.translationGroup == null) continue;
|
|
@@ -292,8 +462,8 @@ async function resolveEntries(
|
|
|
292
462
|
}
|
|
293
463
|
|
|
294
464
|
const refs: EntryRef[] = [];
|
|
295
|
-
for (const
|
|
296
|
-
const variants = variantsByGroup.get(
|
|
465
|
+
for (const selected of selection) {
|
|
466
|
+
const variants = variantsByGroup.get(selected.group);
|
|
297
467
|
if (!variants) continue;
|
|
298
468
|
const entry = pickVariant(variants, locale);
|
|
299
469
|
if (!entry) continue;
|
|
@@ -301,8 +471,10 @@ async function resolveEntries(
|
|
|
301
471
|
id: entry.id,
|
|
302
472
|
slug: entry.slug,
|
|
303
473
|
collection,
|
|
474
|
+
title: entryTitle(entry.data, titleField),
|
|
304
475
|
locale: entry.locale,
|
|
305
|
-
|
|
476
|
+
translationGroup: entry.translationGroup,
|
|
477
|
+
sortOrder: selected.sortOrder,
|
|
306
478
|
});
|
|
307
479
|
}
|
|
308
480
|
return refs;
|
|
@@ -311,6 +483,42 @@ async function resolveEntries(
|
|
|
311
483
|
/** Pagination inputs for the edge read endpoints. */
|
|
312
484
|
export type PageOptions = { limit?: number; cursor?: string };
|
|
313
485
|
|
|
486
|
+
/**
|
|
487
|
+
* The page of a pending selection this end stages, when there is one.
|
|
488
|
+
*
|
|
489
|
+
* These routes address a relation and a side; a staged selection is keyed by the
|
|
490
|
+
* field slug the entry API takes it under, so the field viewing this end is what
|
|
491
|
+
* connects them. Returns undefined when the caller may not see drafts, the entry
|
|
492
|
+
* has no draft, or the draft stages nothing for this field — all of which mean
|
|
493
|
+
* the published links are the answer.
|
|
494
|
+
*/
|
|
495
|
+
async function stagedPageFor(
|
|
496
|
+
db: Kysely<Database>,
|
|
497
|
+
options: {
|
|
498
|
+
collection: string;
|
|
499
|
+
relationSlug: string;
|
|
500
|
+
side: "parent" | "child";
|
|
501
|
+
draftRevisionId: string | null | undefined;
|
|
502
|
+
includeDrafts: boolean;
|
|
503
|
+
page: PageOptions;
|
|
504
|
+
},
|
|
505
|
+
): Promise<PageOfGroups | undefined> {
|
|
506
|
+
if (!options.includeDrafts || !options.draftRevisionId) return undefined;
|
|
507
|
+
|
|
508
|
+
const field = constraintsForRelationSide(
|
|
509
|
+
await referenceFieldConstraints(db, options.collection),
|
|
510
|
+
options.relationSlug,
|
|
511
|
+
options.side,
|
|
512
|
+
);
|
|
513
|
+
if (!field) return undefined;
|
|
514
|
+
|
|
515
|
+
const revision = await new RevisionRepository(db).findById(options.draftRevisionId);
|
|
516
|
+
const groups = readStagedReferences(revision?.data)?.[field.slug];
|
|
517
|
+
if (!groups) return undefined;
|
|
518
|
+
|
|
519
|
+
return pageStagedGroups(groups, options.page);
|
|
520
|
+
}
|
|
521
|
+
|
|
314
522
|
export async function handleReferenceChildrenGet(
|
|
315
523
|
db: Kysely<Database>,
|
|
316
524
|
collection: string,
|
|
@@ -344,7 +552,32 @@ export async function handleReferenceChildrenGet(
|
|
|
344
552
|
return { success: false, error: { code: "NOT_FOUND", message: "Content entry not found" } };
|
|
345
553
|
}
|
|
346
554
|
|
|
347
|
-
const
|
|
555
|
+
const titleField = await getReferenceTitleField(db, rel.childCollection);
|
|
556
|
+
|
|
557
|
+
// A pending selection replaces the published one for a caller that may see
|
|
558
|
+
// it, page for page — the entry read answers the same way, and a walk that
|
|
559
|
+
// started on one of them must not continue on the other.
|
|
560
|
+
const staged = await stagedPageFor(db, {
|
|
561
|
+
collection,
|
|
562
|
+
relationSlug: rel.slug,
|
|
563
|
+
side: "parent",
|
|
564
|
+
draftRevisionId: entry.draftRevisionId,
|
|
565
|
+
includeDrafts,
|
|
566
|
+
page,
|
|
567
|
+
});
|
|
568
|
+
if (staged) {
|
|
569
|
+
const children = await resolveEntryGroups(
|
|
570
|
+
content,
|
|
571
|
+
rel.childCollection,
|
|
572
|
+
staged.groups,
|
|
573
|
+
entry.locale,
|
|
574
|
+
includeDrafts,
|
|
575
|
+
titleField,
|
|
576
|
+
);
|
|
577
|
+
return { success: true, data: { children, nextCursor: staged.nextCursor } };
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
const edges = await repo.getChildrenPage(rel.id, entry.translationGroup, page);
|
|
348
581
|
const children = await resolveEntries(
|
|
349
582
|
content,
|
|
350
583
|
rel.childCollection,
|
|
@@ -352,6 +585,7 @@ export async function handleReferenceChildrenGet(
|
|
|
352
585
|
(e) => e.childGroup,
|
|
353
586
|
entry.locale,
|
|
354
587
|
includeDrafts,
|
|
588
|
+
titleField,
|
|
355
589
|
);
|
|
356
590
|
return { success: true, data: { children, nextCursor: edges.nextCursor } };
|
|
357
591
|
} catch (error) {
|
|
@@ -359,76 +593,297 @@ export async function handleReferenceChildrenGet(
|
|
|
359
593
|
}
|
|
360
594
|
}
|
|
361
595
|
|
|
362
|
-
|
|
596
|
+
/**
|
|
597
|
+
* A selection expressed in the identifiers the link table actually stores:
|
|
598
|
+
* `translation_group` on both ends, because an edge names a thing rather than
|
|
599
|
+
* one locale's row of it.
|
|
600
|
+
*/
|
|
601
|
+
export interface ReferenceSelectionWrite extends ResolvedReferenceTargets {
|
|
602
|
+
/** The selecting entry's own translation group. */
|
|
603
|
+
entryGroup: string;
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
/**
|
|
607
|
+
* The same selection, resolved before the entry it belongs to is known — which
|
|
608
|
+
* is what a create has to do, since its row does not exist until it is written
|
|
609
|
+
* and, on D1, writing it cannot be taken back.
|
|
610
|
+
*/
|
|
611
|
+
export interface ResolvedReferenceTargets {
|
|
612
|
+
/** The relation, by id or slug — `setChildren` / `setParents` take either. */
|
|
613
|
+
relation: string;
|
|
614
|
+
/** The end of the relation the selecting entry sits on. */
|
|
615
|
+
side: "parent" | "child";
|
|
616
|
+
/** The selected entries' translation groups, in the caller's order. */
|
|
617
|
+
groups: string[];
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
/**
|
|
621
|
+
* Resolve a bound field's selection to what the link table stores, without
|
|
622
|
+
* writing anything and without needing the selecting entry to exist.
|
|
623
|
+
*
|
|
624
|
+
* The field decides the relation and the end it views: a field on the `parent`
|
|
625
|
+
* end selects children, one on the `child` end selects the parents pointing at
|
|
626
|
+
* it. `entryGroup` is the selecting entry's own translation group when it has
|
|
627
|
+
* one — the far-side count discounts links it already holds, since replacing a
|
|
628
|
+
* selection with itself adds nothing. A new entry passes `null`: it holds no
|
|
629
|
+
* links yet.
|
|
630
|
+
*/
|
|
631
|
+
async function resolveReferenceTargets(
|
|
363
632
|
db: Kysely<Database>,
|
|
364
633
|
collection: string,
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
): Promise<ApiResult<
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
634
|
+
constraints: ReferenceFieldConstraints,
|
|
635
|
+
selectedIds: string[],
|
|
636
|
+
entryGroup: string | null,
|
|
637
|
+
): Promise<ApiResult<ResolvedReferenceTargets>> {
|
|
638
|
+
const repo = new RelationRepository(db);
|
|
639
|
+
const content = new ContentRepository(db);
|
|
640
|
+
const side = constraints.relationSide;
|
|
641
|
+
|
|
642
|
+
const rel = await resolveRelation(repo, constraints.relation);
|
|
643
|
+
if (!rel) return { success: false, error: { code: "NOT_FOUND", message: "Relation not found" } };
|
|
644
|
+
|
|
645
|
+
const ownCollection = side === "parent" ? rel.parentCollection : rel.childCollection;
|
|
646
|
+
const otherCollection = side === "parent" ? rel.childCollection : rel.parentCollection;
|
|
647
|
+
if (collection !== ownCollection) {
|
|
648
|
+
return {
|
|
649
|
+
success: false,
|
|
650
|
+
error: {
|
|
651
|
+
code: "VALIDATION_ERROR",
|
|
652
|
+
message: `Entry is not the ${side} side of this relation`,
|
|
653
|
+
},
|
|
654
|
+
};
|
|
655
|
+
}
|
|
372
656
|
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
657
|
+
const selection = validateReferenceSelection(constraints, selectedIds);
|
|
658
|
+
if (!selection.success) return selection;
|
|
659
|
+
|
|
660
|
+
// Resolve every selected entry within the relation's other collection in one
|
|
661
|
+
// batch (constant queries, not an N+1 of point lookups for a set up to 1000).
|
|
662
|
+
// An id that does not resolve there fails collection-agreement (invariant 3);
|
|
663
|
+
// order is preserved by iterating the caller's ids.
|
|
664
|
+
const resolved = await content.findManyByIdOrSlug(otherCollection, selectedIds);
|
|
665
|
+
const groups: string[] = [];
|
|
666
|
+
for (const selectedId of selectedIds) {
|
|
667
|
+
const other = resolved.get(selectedId);
|
|
668
|
+
if (!other?.translationGroup) {
|
|
377
669
|
return {
|
|
378
670
|
success: false,
|
|
379
671
|
error: {
|
|
380
|
-
code: "
|
|
381
|
-
message: "
|
|
672
|
+
code: "NOT_FOUND",
|
|
673
|
+
message: `${side === "parent" ? "Child" : "Parent"} entry '${selectedId}' not found in ${otherCollection}`,
|
|
382
674
|
},
|
|
383
675
|
};
|
|
384
676
|
}
|
|
677
|
+
groups.push(other.translationGroup);
|
|
678
|
+
}
|
|
385
679
|
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
const resolvedChildren = await content.findManyByIdOrSlug(rel.childCollection, childIds);
|
|
396
|
-
const childGroups: string[] = [];
|
|
397
|
-
for (const childId of childIds) {
|
|
398
|
-
const child = resolvedChildren.get(childId);
|
|
399
|
-
if (!child?.translationGroup) {
|
|
400
|
-
return {
|
|
401
|
-
success: false,
|
|
402
|
-
error: {
|
|
403
|
-
code: "NOT_FOUND",
|
|
404
|
-
message: `Child entry '${childId}' not found in ${rel.childCollection}`,
|
|
405
|
-
},
|
|
406
|
-
};
|
|
407
|
-
}
|
|
408
|
-
childGroups.push(child.translationGroup);
|
|
409
|
-
}
|
|
680
|
+
const far = await validateOppositeSideLimit(db, {
|
|
681
|
+
relationId: rel.id,
|
|
682
|
+
farLimit: side === "parent" ? rel.maxParentsPerChild : rel.maxChildrenPerParent,
|
|
683
|
+
side,
|
|
684
|
+
entryGroup,
|
|
685
|
+
groups,
|
|
686
|
+
labels: selectedIds,
|
|
687
|
+
});
|
|
688
|
+
if (!far.success) return far;
|
|
410
689
|
|
|
411
|
-
|
|
690
|
+
return { success: true, data: { relation: rel.id, side, groups } };
|
|
691
|
+
}
|
|
412
692
|
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
693
|
+
/**
|
|
694
|
+
* Check what a selection does to the *other* end's cardinality.
|
|
695
|
+
*
|
|
696
|
+
* Cardinality binds both ends, but only one end ever selects: a field on the
|
|
697
|
+
* parent side that hands a child its second parent breaks `maxParentsPerChild`
|
|
698
|
+
* even though the parent's own limit is untouched. Links the selecting entry
|
|
699
|
+
* already holds are discounted — replacing a selection with itself adds nothing.
|
|
700
|
+
*
|
|
701
|
+
* `labels` names each group the way the caller addressed it, so the message
|
|
702
|
+
* quotes the id someone typed. Publication has only the groups, which it stages;
|
|
703
|
+
* it quotes those.
|
|
704
|
+
*/
|
|
705
|
+
export async function validateOppositeSideLimit(
|
|
706
|
+
db: Kysely<Database>,
|
|
707
|
+
options: {
|
|
708
|
+
relationId: string;
|
|
709
|
+
/** The opposite end's limit. `null` is unlimited — nothing to check. */
|
|
710
|
+
farLimit: number | null;
|
|
711
|
+
/** The end the selecting entry sits on. */
|
|
712
|
+
side: "parent" | "child";
|
|
713
|
+
entryGroup: string | null;
|
|
714
|
+
groups: string[];
|
|
715
|
+
labels?: string[];
|
|
716
|
+
},
|
|
717
|
+
): Promise<ApiResult<true>> {
|
|
718
|
+
const { farLimit, side, groups } = options;
|
|
719
|
+
if (farLimit === null || groups.length === 0) return { success: true, data: true };
|
|
720
|
+
|
|
721
|
+
const counts = await new RelationRepository(db).countEdgesByGroup(
|
|
722
|
+
options.relationId,
|
|
723
|
+
side === "parent" ? "child" : "parent",
|
|
724
|
+
groups,
|
|
725
|
+
options.entryGroup,
|
|
726
|
+
);
|
|
727
|
+
for (const [index, group] of groups.entries()) {
|
|
728
|
+
if ((counts.get(group) ?? 0) + 1 <= farLimit) continue;
|
|
729
|
+
const farSide = side === "parent" ? "parent" : "child";
|
|
730
|
+
const label = options.labels?.[index] ?? group;
|
|
427
731
|
return {
|
|
428
732
|
success: false,
|
|
429
|
-
error: {
|
|
733
|
+
error: {
|
|
734
|
+
code: "VALIDATION_ERROR",
|
|
735
|
+
message:
|
|
736
|
+
farLimit === 1
|
|
737
|
+
? `Entry '${label}' already has a ${farSide} on this relation, which allows one.`
|
|
738
|
+
: `Entry '${label}' already has the maximum of ${farLimit} ${farSide} entries on this relation.`,
|
|
739
|
+
},
|
|
430
740
|
};
|
|
431
741
|
}
|
|
742
|
+
return { success: true, data: true };
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
/**
|
|
746
|
+
* {@link resolveReferenceTargets} for an entry that already exists, anchoring the
|
|
747
|
+
* selection on that entry's translation group.
|
|
748
|
+
*/
|
|
749
|
+
async function resolveReferenceSide(
|
|
750
|
+
db: Kysely<Database>,
|
|
751
|
+
collection: string,
|
|
752
|
+
entryId: string,
|
|
753
|
+
constraints: ReferenceFieldConstraints,
|
|
754
|
+
selectedIds: string[],
|
|
755
|
+
): Promise<ApiResult<ReferenceSelectionWrite>> {
|
|
756
|
+
const entry = await new ContentRepository(db).findByIdOrSlug(collection, entryId);
|
|
757
|
+
if (!entry?.translationGroup) {
|
|
758
|
+
return { success: false, error: { code: "NOT_FOUND", message: "Content entry not found" } };
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
const resolved = await resolveReferenceTargets(
|
|
762
|
+
db,
|
|
763
|
+
collection,
|
|
764
|
+
constraints,
|
|
765
|
+
selectedIds,
|
|
766
|
+
entry.translationGroup,
|
|
767
|
+
);
|
|
768
|
+
if (!resolved.success) return resolved;
|
|
769
|
+
return { success: true, data: { ...resolved.data, entryGroup: entry.translationGroup } };
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
/**
|
|
773
|
+
* Replace one end's links from an already-resolved selection.
|
|
774
|
+
*
|
|
775
|
+
* Resolution has already proved the relation, the entry and every selected entry
|
|
776
|
+
* exist, so nothing here fails on the caller's input. What it can still hit is
|
|
777
|
+
* the far end's limit closing between resolving and writing — a slot another
|
|
778
|
+
* request took in that window. The write refuses the edge rather than exceeding
|
|
779
|
+
* the limit, and throws so the save reports it; the throw carries an `apiError`
|
|
780
|
+
* the content handlers map to a response.
|
|
781
|
+
*/
|
|
782
|
+
export async function writeReferenceSelection(
|
|
783
|
+
db: Kysely<Database>,
|
|
784
|
+
selection: ReferenceSelectionWrite,
|
|
785
|
+
): Promise<void> {
|
|
786
|
+
const repo = new RelationRepository(db);
|
|
787
|
+
const rel = await resolveRelation(repo, selection.relation);
|
|
788
|
+
if (!rel) return;
|
|
789
|
+
|
|
790
|
+
const rejected =
|
|
791
|
+
selection.side === "parent"
|
|
792
|
+
? await repo.setChildren(rel.id, selection.entryGroup, selection.groups)
|
|
793
|
+
: await repo.setParents(rel.id, selection.entryGroup, selection.groups);
|
|
794
|
+
if (rejected.length > 0) {
|
|
795
|
+
const farSide = selection.side === "parent" ? "parent" : "child";
|
|
796
|
+
throw Object.assign(
|
|
797
|
+
new Error(
|
|
798
|
+
`Entry '${rejected[0]}' already has the maximum number of ${farSide} entries on this relation.`,
|
|
799
|
+
),
|
|
800
|
+
{ apiError: { code: "VALIDATION_ERROR" } },
|
|
801
|
+
);
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
// A link is part of what a cached entry renders on both ends — a parent's
|
|
805
|
+
// selection and a child's backlinks — while no row of either collection has
|
|
806
|
+
// changed. Nothing else here would tell those snapshots they are stale.
|
|
807
|
+
invalidateCollectionCache(rel.parentCollection);
|
|
808
|
+
if (rel.childCollection !== rel.parentCollection) {
|
|
809
|
+
invalidateCollectionCache(rel.childCollection);
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
/**
|
|
814
|
+
* Replace a reference field's selection on one entry, addressed by field slug.
|
|
815
|
+
*
|
|
816
|
+
* The field decides which relation and which end: a field bound to the parent
|
|
817
|
+
* end replaces that entry's children, one bound to the child end replaces the
|
|
818
|
+
* parents pointing at it. This is what the entry create/update body writes
|
|
819
|
+
* through, so a site addresses a selection the way it addresses any other field.
|
|
820
|
+
*/
|
|
821
|
+
export async function setReferenceSelection(
|
|
822
|
+
db: Kysely<Database>,
|
|
823
|
+
collection: string,
|
|
824
|
+
entryId: string,
|
|
825
|
+
fieldSlug: string,
|
|
826
|
+
selectedIds: string[],
|
|
827
|
+
): Promise<ApiResult<{ relationId: string; entryGroup: string }>> {
|
|
828
|
+
const resolved = await resolveReferenceSelection(db, collection, entryId, fieldSlug, selectedIds);
|
|
829
|
+
if (!resolved.success) return resolved;
|
|
830
|
+
await writeReferenceSelection(db, resolved.data);
|
|
831
|
+
return {
|
|
832
|
+
success: true,
|
|
833
|
+
data: { relationId: resolved.data.relation, entryGroup: resolved.data.entryGroup },
|
|
834
|
+
};
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
/**
|
|
838
|
+
* `setReferenceSelection` up to but not including the write.
|
|
839
|
+
*
|
|
840
|
+
* A collection that keeps drafts stages the result in its draft revision instead
|
|
841
|
+
* of writing links, so a save reports a bad id or an over-long selection exactly
|
|
842
|
+
* as a direct write would, and publication has nothing left to resolve.
|
|
843
|
+
*/
|
|
844
|
+
export async function resolveReferenceSelection(
|
|
845
|
+
db: Kysely<Database>,
|
|
846
|
+
collection: string,
|
|
847
|
+
entryId: string,
|
|
848
|
+
fieldSlug: string,
|
|
849
|
+
selectedIds: string[],
|
|
850
|
+
): Promise<ApiResult<ReferenceSelectionWrite>> {
|
|
851
|
+
const constraints = (await referenceFieldConstraints(db, collection)).get(fieldSlug);
|
|
852
|
+
if (!constraints) return notAReferenceField(fieldSlug, collection);
|
|
853
|
+
return resolveReferenceSide(db, collection, entryId, constraints, selectedIds);
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
/**
|
|
857
|
+
* `resolveReferenceSelection` for an entry that does not exist yet.
|
|
858
|
+
*
|
|
859
|
+
* A create resolves its whole payload before it writes its row, because on D1
|
|
860
|
+
* that row is committed the moment it is written: a selection that cannot be
|
|
861
|
+
* resolved has to be refused while there is still nothing to take back.
|
|
862
|
+
*
|
|
863
|
+
* `entryGroup` is the group the new row will join — a new translation inherits
|
|
864
|
+
* the source's — or null when the row starts a group of its own and so holds no
|
|
865
|
+
* links yet.
|
|
866
|
+
*/
|
|
867
|
+
export async function resolveReferenceSelectionTargets(
|
|
868
|
+
db: Kysely<Database>,
|
|
869
|
+
collection: string,
|
|
870
|
+
fieldSlug: string,
|
|
871
|
+
selectedIds: string[],
|
|
872
|
+
entryGroup: string | null,
|
|
873
|
+
): Promise<ApiResult<ResolvedReferenceTargets>> {
|
|
874
|
+
const constraints = (await referenceFieldConstraints(db, collection)).get(fieldSlug);
|
|
875
|
+
if (!constraints) return notAReferenceField(fieldSlug, collection);
|
|
876
|
+
return resolveReferenceTargets(db, collection, constraints, selectedIds, entryGroup);
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
function notAReferenceField(fieldSlug: string, collection: string): ApiResult<never> {
|
|
880
|
+
return {
|
|
881
|
+
success: false,
|
|
882
|
+
error: {
|
|
883
|
+
code: "VALIDATION_ERROR",
|
|
884
|
+
message: `Field '${fieldSlug}' is not a reference field on ${collection}`,
|
|
885
|
+
},
|
|
886
|
+
};
|
|
432
887
|
}
|
|
433
888
|
|
|
434
889
|
export async function handleReferenceParentsGet(
|
|
@@ -463,7 +918,32 @@ export async function handleReferenceParentsGet(
|
|
|
463
918
|
return { success: false, error: { code: "NOT_FOUND", message: "Content entry not found" } };
|
|
464
919
|
}
|
|
465
920
|
|
|
466
|
-
const
|
|
921
|
+
const titleField = await getReferenceTitleField(db, rel.parentCollection);
|
|
922
|
+
|
|
923
|
+
// As on the children read: a field bound to this end stages its pending
|
|
924
|
+
// selection in the entry's draft, and that is what a drafts-aware caller
|
|
925
|
+
// pages through.
|
|
926
|
+
const staged = await stagedPageFor(db, {
|
|
927
|
+
collection,
|
|
928
|
+
relationSlug: rel.slug,
|
|
929
|
+
side: "child",
|
|
930
|
+
draftRevisionId: entry.draftRevisionId,
|
|
931
|
+
includeDrafts,
|
|
932
|
+
page,
|
|
933
|
+
});
|
|
934
|
+
if (staged) {
|
|
935
|
+
const parents = await resolveEntryGroups(
|
|
936
|
+
content,
|
|
937
|
+
rel.parentCollection,
|
|
938
|
+
staged.groups,
|
|
939
|
+
entry.locale,
|
|
940
|
+
includeDrafts,
|
|
941
|
+
titleField,
|
|
942
|
+
);
|
|
943
|
+
return { success: true, data: { parents, nextCursor: staged.nextCursor } };
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
const edges = await repo.getParentsPage(rel.id, entry.translationGroup, page);
|
|
467
947
|
const parents = await resolveEntries(
|
|
468
948
|
content,
|
|
469
949
|
rel.parentCollection,
|
|
@@ -471,6 +951,7 @@ export async function handleReferenceParentsGet(
|
|
|
471
951
|
(e) => e.parentGroup,
|
|
472
952
|
entry.locale,
|
|
473
953
|
includeDrafts,
|
|
954
|
+
titleField,
|
|
474
955
|
);
|
|
475
956
|
return { success: true, data: { parents, nextCursor: edges.nextCursor } };
|
|
476
957
|
} catch (error) {
|