emdash 0.40.1 → 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 +20 -24
- 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.mjs +109 -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 +91 -91
- 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.mjs +50 -44
- 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 +8 -8
- 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 +24 -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 +32 -32
- 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/manifest.ts +79 -5
- 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/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/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/types.ts +5 -0
- package/src/cli/commands/export-seed.ts +510 -89
- 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/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 +86 -11
- package/src/index.ts +10 -0
- package/src/loader.ts +169 -22
- 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 +519 -62
- 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-CuyNEHZG.mjs +0 -4718
- package/dist/api-CuyNEHZG.mjs.map +0 -1
- package/dist/api-tokens-s4i4aUp_.mjs +0 -166
- package/dist/api-tokens-s4i4aUp_.mjs.map +0 -1
- package/dist/apply-npY1TAhG.mjs +0 -1366
- package/dist/apply-npY1TAhG.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-BQRj3afm.mjs +0 -246
- package/dist/backup-BQRj3afm.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-BjEm_3xL.d.mts +0 -6537
- package/dist/config-BjEm_3xL.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-BV_7t-Ua.mjs +0 -1921
- package/dist/context-BV_7t-Ua.mjs.map +0 -1
- package/dist/cron-7DCJwPXq.mjs +0 -284
- package/dist/cron-7DCJwPXq.mjs.map +0 -1
- package/dist/dashboard-BP-iJqpd.mjs +0 -151
- package/dist/dashboard-BP-iJqpd.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-D2lNadwo.mjs +0 -104
- package/dist/direct-executor-D2lNadwo.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-CtfnZmPi.mjs +0 -4186
- package/dist/emdash-runtime-CtfnZmPi.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-Cf5OoIgN.d.mts +0 -4368
- package/dist/entry-lock-Cf5OoIgN.d.mts.map +0 -1
- package/dist/entry-lock-DHQOxN7R.mjs +0 -163
- package/dist/entry-lock-DHQOxN7R.mjs.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-CbVI4paR.mjs +0 -105
- package/dist/hreflang-CbVI4paR.mjs.map +0 -1
- package/dist/hreflang-D5uNnsGJ.d.mts +0 -50
- package/dist/hreflang-D5uNnsGJ.d.mts.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-Be5kzutJ.mjs +0 -35
- package/dist/identity-Be5kzutJ.mjs.map +0 -1
- package/dist/import-YzfKCaco.mjs +0 -2020
- package/dist/import-YzfKCaco.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-BmSAOOEF.mjs +0 -189
- package/dist/manifest-builder-BmSAOOEF.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-CPXTbb1R.mjs +0 -373
- package/dist/media-CPXTbb1R.mjs.map +0 -1
- package/dist/media-JXRWDhw3.mjs +0 -294
- package/dist/media-JXRWDhw3.mjs.map +0 -1
- package/dist/media-Pu1L6xir.mjs +0 -408
- package/dist/media-Pu1L6xir.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-url-jArBpzIG.mjs +0 -43
- package/dist/media-url-jArBpzIG.mjs.map +0 -1
- package/dist/media-usage-De-zeR9E.mjs +0 -1629
- package/dist/media-usage-De-zeR9E.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-Cm68rsAq.mjs +0 -3608
- package/dist/menus-Cm68rsAq.mjs.map +0 -1
- package/dist/menus-ITeAbcIF.mjs +0 -753
- package/dist/menus-ITeAbcIF.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-B29UjdUn.mjs +0 -411
- package/dist/redirect-B29UjdUn.mjs.map +0 -1
- package/dist/redirect-Cd1E7VUt.mjs +0 -17
- package/dist/redirect-Cd1E7VUt.mjs.map +0 -1
- package/dist/redirects-Ca2MPfEG.mjs +0 -446
- package/dist/redirects-Ca2MPfEG.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-vrR95WR6.mjs +0 -272
- package/dist/routes-vrR95WR6.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-B4vDl1fK.mjs +0 -439
- package/dist/settings-B4vDl1fK.mjs.map +0 -1
- package/dist/settings-DYidIB26.mjs +0 -61
- package/dist/settings-DYidIB26.mjs.map +0 -1
- package/dist/settings-Dyj6v8C4.mjs +0 -51
- package/dist/settings-Dyj6v8C4.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-PawoX-WG.mjs +0 -414
- package/dist/snapshot-PawoX-WG.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-FXJH5pI8.d.mts +0 -1581
- package/dist/storage-query-FXJH5pI8.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-DIGvR9Af.mjs +0 -166
- package/dist/transfer-DIGvR9Af.mjs.map +0 -1
- package/dist/transfer-DgeCvHnj.mjs +0 -8675
- package/dist/transfer-DgeCvHnj.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-DXsxRrob.mjs +0 -7
- package/dist/version-DXsxRrob.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
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
import { EntryLockRepository } from "../../database/repositories/entry-locks.js";
|
|
19
19
|
import { OptionsRepository } from "../../database/repositories/options.js";
|
|
20
20
|
import { RedirectRepository } from "../../database/repositories/redirect.js";
|
|
21
|
+
import { RelationRepository } from "../../database/repositories/relation.js";
|
|
21
22
|
import { RevisionRepository } from "../../database/repositories/revision.js";
|
|
22
23
|
import { SeoRepository } from "../../database/repositories/seo.js";
|
|
23
24
|
import { TaxonomyRepository } from "../../database/repositories/taxonomy.js";
|
|
@@ -46,12 +47,37 @@ import {
|
|
|
46
47
|
type ScheduledPolicyRejection,
|
|
47
48
|
} from "../../plugins/content-policy.js";
|
|
48
49
|
import { invalidateRedirectCache } from "../../redirects/cache.js";
|
|
50
|
+
import { isStoragelessFieldRow } from "../../schema/types.js";
|
|
49
51
|
import { FTSManager } from "../../search/fts-manager.js";
|
|
50
52
|
import { invalidateTermCache } from "../../taxonomies/index.js";
|
|
51
53
|
import { isMissingColumnError, isMissingTableError } from "../../utils/db-errors.js";
|
|
52
54
|
import { decodeRev, encodeRev, validateRev } from "../rev.js";
|
|
53
55
|
import type { ApiResult, ContentListResponse, ContentResponse } from "../types.js";
|
|
56
|
+
import {
|
|
57
|
+
getReferenceTitleField,
|
|
58
|
+
type ReferenceSelectionWrite,
|
|
59
|
+
resolveEntries,
|
|
60
|
+
resolveEntryGroups,
|
|
61
|
+
resolveReferenceSelection,
|
|
62
|
+
resolveReferenceSelectionTargets,
|
|
63
|
+
type ResolvedReferenceTargets,
|
|
64
|
+
writeReferenceSelection,
|
|
65
|
+
} from "./relations.js";
|
|
66
|
+
import {
|
|
67
|
+
applyStagedReferences,
|
|
68
|
+
liveReferenceSelection,
|
|
69
|
+
pageStagedGroups,
|
|
70
|
+
readStagedReferences,
|
|
71
|
+
recordPublishedReferences,
|
|
72
|
+
STAGED_REFERENCES_KEY,
|
|
73
|
+
type StagedReferences,
|
|
74
|
+
validateStagedReferences,
|
|
75
|
+
} from "./staged-references.js";
|
|
54
76
|
import { validateMediaFields } from "./validate-media-fields.js";
|
|
77
|
+
import {
|
|
78
|
+
referenceFieldConstraints,
|
|
79
|
+
validateRequiredReferencesPresent,
|
|
80
|
+
} from "./validate-references.js";
|
|
55
81
|
|
|
56
82
|
/**
|
|
57
83
|
* Narrow a caught error to one carrying a structured `apiError` discriminant.
|
|
@@ -69,6 +95,98 @@ function hasApiError(error: unknown): error is Error & { apiError: { code: strin
|
|
|
69
95
|
);
|
|
70
96
|
}
|
|
71
97
|
|
|
98
|
+
/**
|
|
99
|
+
* Abort the surrounding transaction when a relation's limit refused an edge.
|
|
100
|
+
*
|
|
101
|
+
* `farSide` names the end that filled up, which is the opposite of the end the
|
|
102
|
+
* refused group sits on: a child that cannot take another parent refuses with
|
|
103
|
+
* `"parent"`.
|
|
104
|
+
*/
|
|
105
|
+
function throwIfReferenceLimitRefused(rejected: string[], farSide: "parent" | "child"): void {
|
|
106
|
+
if (rejected.length === 0) return;
|
|
107
|
+
throw Object.assign(
|
|
108
|
+
new Error(
|
|
109
|
+
`Entry '${rejected[0]}' already has the maximum number of ${farSide} entries on this relation.`,
|
|
110
|
+
),
|
|
111
|
+
{ apiError: { code: "VALIDATION_ERROR" } },
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** The slug a draft revision stages, when it stages one. */
|
|
116
|
+
function readStagedSlug(data: Record<string, unknown> | undefined): string | null {
|
|
117
|
+
return typeof data?._slug === "string" ? data._slug : null;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Make every refusal `publish()` decides before it writes, ahead of it.
|
|
122
|
+
*
|
|
123
|
+
* `publish()` decides all of them again and stays authoritative; this does not
|
|
124
|
+
* replace it. It exists for the one caller that has irreversible work to do
|
|
125
|
+
* first — promoting a draft's staged reference selection, which nothing takes
|
|
126
|
+
* back where `withTransaction` degrades to plain statements. A refusal that
|
|
127
|
+
* landed after that promotion would leave a draft's links live on an entry that
|
|
128
|
+
* never published.
|
|
129
|
+
*
|
|
130
|
+
* The optimistic fence `publish()` ends on is not checked here, because it is
|
|
131
|
+
* the write itself: a publish lost to a concurrent edit still promotes.
|
|
132
|
+
*/
|
|
133
|
+
async function assertPublishWillNotBeRefused(
|
|
134
|
+
db: Kysely<Database>,
|
|
135
|
+
collection: string,
|
|
136
|
+
id: string,
|
|
137
|
+
existing: ContentItem,
|
|
138
|
+
options: {
|
|
139
|
+
stagedSlug: string | null;
|
|
140
|
+
requireSlug: boolean;
|
|
141
|
+
requireDue?: boolean;
|
|
142
|
+
expectedScheduledAt?: string;
|
|
143
|
+
expectedRevision?: ContentRevisionPrecondition;
|
|
144
|
+
},
|
|
145
|
+
): Promise<void> {
|
|
146
|
+
const { expectedRevision } = options;
|
|
147
|
+
if (
|
|
148
|
+
expectedRevision &&
|
|
149
|
+
(existing.version !== expectedRevision.version ||
|
|
150
|
+
existing.updatedAt !== expectedRevision.updatedAt)
|
|
151
|
+
) {
|
|
152
|
+
throw new ContentMutationConflictError();
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (
|
|
156
|
+
options.requireDue &&
|
|
157
|
+
options.expectedScheduledAt !== undefined &&
|
|
158
|
+
existing.scheduledAt !== options.expectedScheduledAt
|
|
159
|
+
) {
|
|
160
|
+
throw new ScheduledNotDueError();
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const intendedSlug = options.stagedSlug ?? existing.slug;
|
|
164
|
+
if (options.requireSlug && !intendedSlug?.trim()) {
|
|
165
|
+
throw new EmDashValidationError("Cannot publish routable content without a slug");
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Only a publish that moves the slug can collide, so this costs a read on
|
|
169
|
+
// that path alone.
|
|
170
|
+
if (
|
|
171
|
+
options.stagedSlug !== null &&
|
|
172
|
+
options.stagedSlug !== existing.slug &&
|
|
173
|
+
existing.locale !== null
|
|
174
|
+
) {
|
|
175
|
+
const conflict = await new ContentRepository(db).findBySlugIncludingTrashed(
|
|
176
|
+
collection,
|
|
177
|
+
options.stagedSlug,
|
|
178
|
+
existing.locale,
|
|
179
|
+
);
|
|
180
|
+
if (conflict && conflict.id !== id) {
|
|
181
|
+
throw new EmDashValidationError(
|
|
182
|
+
`Cannot publish: slug '${options.stagedSlug}' is already used by another entry` +
|
|
183
|
+
` in this collection (id: ${conflict.id}). Choose a different slug.`,
|
|
184
|
+
{ code: "SLUG_CONFLICT" },
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
72
190
|
function isTranslationLocaleConflict(error: unknown, collection: string): boolean {
|
|
73
191
|
if (!(error instanceof Error)) return false;
|
|
74
192
|
const message = error.message.toLowerCase();
|
|
@@ -221,6 +339,132 @@ async function hydrateBylines(
|
|
|
221
339
|
item.byline = null;
|
|
222
340
|
}
|
|
223
341
|
|
|
342
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
343
|
+
return typeof value === "object" && value !== null;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Hydrate the first page of each reference field's selection onto a single
|
|
348
|
+
* content item, keyed by field slug — the same key the create and update bodies
|
|
349
|
+
* take a selection under.
|
|
350
|
+
*
|
|
351
|
+
* Callers must have already decided `includeDrafts` — draft visibility is
|
|
352
|
+
* enforced by the caller, not this helper — because a resolved entry can carry
|
|
353
|
+
* a draft or scheduled entry's id and slug. The admin's REST GET route is the
|
|
354
|
+
* only caller, and it asks for every entry it serves, so a collection with no
|
|
355
|
+
* reference field still pays the two lookups below.
|
|
356
|
+
*
|
|
357
|
+
* For a caller that opted into drafts, a field whose selection is staged in the
|
|
358
|
+
* entry's draft revision is answered from that revision; every other field, and
|
|
359
|
+
* every field for a caller that did not opt in, is answered from the links,
|
|
360
|
+
* which hold the published selection. That is what keeps a picker change on a
|
|
361
|
+
* published entry invisible until it is published.
|
|
362
|
+
*
|
|
363
|
+
* Either selection arrives one page at a time, with the cursor to walk the rest
|
|
364
|
+
* through the edge routes — a draft's pending selection can be as long as a
|
|
365
|
+
* published one, and a caller that reads an entry should not have to take a
|
|
366
|
+
* field of a thousand entries to find out.
|
|
367
|
+
*/
|
|
368
|
+
async function hydrateReferences(
|
|
369
|
+
db: Kysely<Database>,
|
|
370
|
+
collection: string,
|
|
371
|
+
item: ContentItem,
|
|
372
|
+
includeDrafts: boolean,
|
|
373
|
+
): Promise<void> {
|
|
374
|
+
if (!item.translationGroup) return;
|
|
375
|
+
|
|
376
|
+
const collectionRow = await db
|
|
377
|
+
.selectFrom("_emdash_collections")
|
|
378
|
+
.select("id")
|
|
379
|
+
.where("slug", "=", collection)
|
|
380
|
+
.executeTakeFirst();
|
|
381
|
+
if (!collectionRow) return;
|
|
382
|
+
|
|
383
|
+
const fields = await db
|
|
384
|
+
.selectFrom("_emdash_fields")
|
|
385
|
+
.select(["slug", "validation"])
|
|
386
|
+
.where("collection_id", "=", collectionRow.id)
|
|
387
|
+
.where("type", "=", "reference")
|
|
388
|
+
.execute();
|
|
389
|
+
|
|
390
|
+
const references: NonNullable<ContentItem["references"]> = {};
|
|
391
|
+
if (fields.length === 0) {
|
|
392
|
+
item.references = references;
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
const repo = new RelationRepository(db);
|
|
397
|
+
const content = new ContentRepository(db);
|
|
398
|
+
|
|
399
|
+
const staged =
|
|
400
|
+
includeDrafts && item.draftRevisionId
|
|
401
|
+
? readStagedReferences(
|
|
402
|
+
(await new RevisionRepository(db).findById(item.draftRevisionId))?.data,
|
|
403
|
+
)
|
|
404
|
+
: undefined;
|
|
405
|
+
|
|
406
|
+
for (const field of fields) {
|
|
407
|
+
let validation: Record<string, unknown> = {};
|
|
408
|
+
if (field.validation) {
|
|
409
|
+
let parsed: unknown;
|
|
410
|
+
try {
|
|
411
|
+
parsed = JSON.parse(field.validation);
|
|
412
|
+
} catch {
|
|
413
|
+
continue;
|
|
414
|
+
}
|
|
415
|
+
if (isRecord(parsed)) validation = parsed;
|
|
416
|
+
}
|
|
417
|
+
const relation = typeof validation.relation === "string" ? validation.relation : undefined;
|
|
418
|
+
const targetCollection =
|
|
419
|
+
typeof validation.targetCollection === "string" ? validation.targetCollection : undefined;
|
|
420
|
+
// A field with no relation keeps its own column; its value is already in
|
|
421
|
+
// `data` and there are no links to resolve.
|
|
422
|
+
if (!relation || !targetCollection) continue;
|
|
423
|
+
|
|
424
|
+
const stagedGroups = staged?.[field.slug];
|
|
425
|
+
if (stagedGroups) {
|
|
426
|
+
// Paged like the links below it: the REST contract promises one page and
|
|
427
|
+
// a cursor whichever selection answers, and the editor walks the rest
|
|
428
|
+
// through the same edge route either way.
|
|
429
|
+
const page = pageStagedGroups(stagedGroups);
|
|
430
|
+
references[field.slug] = {
|
|
431
|
+
children: await resolveEntryGroups(
|
|
432
|
+
content,
|
|
433
|
+
targetCollection,
|
|
434
|
+
page.groups,
|
|
435
|
+
item.locale,
|
|
436
|
+
includeDrafts,
|
|
437
|
+
await getReferenceTitleField(db, targetCollection),
|
|
438
|
+
),
|
|
439
|
+
...(page.nextCursor ? { nextCursor: page.nextCursor } : {}),
|
|
440
|
+
};
|
|
441
|
+
continue;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
// A field on the child end of its relation selects parents, which carry no
|
|
445
|
+
// order of their own — `sort_order` positions children within one parent.
|
|
446
|
+
const onChildSide = validation.relationSide === "child";
|
|
447
|
+
const edges = onChildSide
|
|
448
|
+
? await repo.getParentsPage(relation, item.translationGroup)
|
|
449
|
+
: await repo.getChildrenPage(relation, item.translationGroup);
|
|
450
|
+
const children = await resolveEntries(
|
|
451
|
+
content,
|
|
452
|
+
targetCollection,
|
|
453
|
+
edges.items,
|
|
454
|
+
(e) => (onChildSide ? e.parentGroup : e.childGroup),
|
|
455
|
+
item.locale,
|
|
456
|
+
includeDrafts,
|
|
457
|
+
await getReferenceTitleField(db, targetCollection),
|
|
458
|
+
);
|
|
459
|
+
references[field.slug] = {
|
|
460
|
+
children,
|
|
461
|
+
...(edges.nextCursor ? { nextCursor: edges.nextCursor } : {}),
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
item.references = references;
|
|
466
|
+
}
|
|
467
|
+
|
|
224
468
|
/**
|
|
225
469
|
* Batch-hydrate bylines for multiple items using two bulk queries instead of N+1.
|
|
226
470
|
*
|
|
@@ -407,6 +651,84 @@ async function resolveSearchColumns(db: Kysely<Database>, collection: string): P
|
|
|
407
651
|
return [...columns];
|
|
408
652
|
}
|
|
409
653
|
|
|
654
|
+
/**
|
|
655
|
+
* The keys of `data` that name a storage-less field — a reference field bound
|
|
656
|
+
* to a relation, whose selection lives in the edge table and reaches the API
|
|
657
|
+
* under the separate `references` key.
|
|
658
|
+
*
|
|
659
|
+
* A reference field with no relation still owns its column, so its value in
|
|
660
|
+
* `data` is exactly where it belongs and is not returned here.
|
|
661
|
+
*/
|
|
662
|
+
async function storagelessDataKeys(
|
|
663
|
+
db: Kysely<Database>,
|
|
664
|
+
collection: string,
|
|
665
|
+
data: Record<string, unknown>,
|
|
666
|
+
): Promise<string[]> {
|
|
667
|
+
const collectionRow = await db
|
|
668
|
+
.selectFrom("_emdash_collections")
|
|
669
|
+
.select("id")
|
|
670
|
+
.where("slug", "=", collection)
|
|
671
|
+
.executeTakeFirst();
|
|
672
|
+
if (!collectionRow) return [];
|
|
673
|
+
const fields = await db
|
|
674
|
+
.selectFrom("_emdash_fields")
|
|
675
|
+
.select(["slug", "type", "validation"])
|
|
676
|
+
.where("collection_id", "=", collectionRow.id)
|
|
677
|
+
.execute();
|
|
678
|
+
const storageless = new Set(fields.filter(isStoragelessFieldRow).map((f) => f.slug));
|
|
679
|
+
if (storageless.size === 0) return [];
|
|
680
|
+
return Object.keys(data).filter((key) => storageless.has(key));
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
/**
|
|
684
|
+
* Refuse a `data` payload that tries to set a storage-less field.
|
|
685
|
+
*
|
|
686
|
+
* Such a key would otherwise reach the column writer and throw "no such
|
|
687
|
+
* column". Dropping it instead is worse than refusing it: a client that can
|
|
688
|
+
* only write `data` would be told its write succeeded while nothing was linked.
|
|
689
|
+
* On a collection that keeps drafts the key never reaches the column writer at
|
|
690
|
+
* all — it is merged into the draft revision's JSON — so the runtime applies
|
|
691
|
+
* this before staging rather than leaving it to the write below.
|
|
692
|
+
*/
|
|
693
|
+
export function storagelessDataKeyError(keys: string[]): {
|
|
694
|
+
success: false;
|
|
695
|
+
error: { code: string; message: string };
|
|
696
|
+
} {
|
|
697
|
+
return {
|
|
698
|
+
success: false,
|
|
699
|
+
error: {
|
|
700
|
+
code: "VALIDATION_ERROR",
|
|
701
|
+
message: `Reference fields bound to a relation are set through 'references', not 'data': ${keys.join(", ")}`,
|
|
702
|
+
},
|
|
703
|
+
};
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
/**
|
|
707
|
+
* The storage-less keys in `data` that an update is actually trying to change.
|
|
708
|
+
*
|
|
709
|
+
* A field bound to a relation after its column existed keeps that column, and
|
|
710
|
+
* every read hands the value frozen in it back under the field's own slug. A
|
|
711
|
+
* read-then-write client — the admin editor among them — therefore echoes a key
|
|
712
|
+
* it never touched, and refusing that would make such an entry unsaveable. An
|
|
713
|
+
* echo asks for nothing; a different value is an attempt to set a selection
|
|
714
|
+
* through the one channel that cannot carry it.
|
|
715
|
+
*
|
|
716
|
+
* A key the entry does not store counts as changed, which is every key of a
|
|
717
|
+
* field that never had a column: there is nothing for such a payload to be
|
|
718
|
+
* echoing, and letting it through would reach the column writer.
|
|
719
|
+
*/
|
|
720
|
+
export function changedStoragelessDataKeys(
|
|
721
|
+
storageless: ReadonlySet<string>,
|
|
722
|
+
data: Record<string, unknown>,
|
|
723
|
+
stored: Record<string, unknown>,
|
|
724
|
+
): string[] {
|
|
725
|
+
return Object.keys(data).filter(
|
|
726
|
+
(key) =>
|
|
727
|
+
storageless.has(key) &&
|
|
728
|
+
(!Object.hasOwn(stored, key) || JSON.stringify(data[key]) !== JSON.stringify(stored[key])),
|
|
729
|
+
);
|
|
730
|
+
}
|
|
731
|
+
|
|
410
732
|
/**
|
|
411
733
|
* Decide whether the content-list `q` filter can be served from the
|
|
412
734
|
* collection's FTS5 index instead of a full-scan substring LIKE (#1517).
|
|
@@ -731,6 +1053,7 @@ export async function handleContentGet(
|
|
|
731
1053
|
collection: string,
|
|
732
1054
|
id: string,
|
|
733
1055
|
locale?: string,
|
|
1056
|
+
referenceOptions?: { includeDrafts: boolean },
|
|
734
1057
|
): Promise<ApiResult<ContentResponse>> {
|
|
735
1058
|
try {
|
|
736
1059
|
const repo = new ContentRepository(db);
|
|
@@ -754,6 +1077,12 @@ export async function handleContentGet(
|
|
|
754
1077
|
const hasSeo = await collectionHasSeo(db, collection);
|
|
755
1078
|
await hydrateSeo(db, collection, item, hasSeo);
|
|
756
1079
|
await hydrateBylines(db, collection, item);
|
|
1080
|
+
// Opt-in: hydration is skipped entirely unless the caller passes
|
|
1081
|
+
// `referenceOptions`, since it can leak draft child ids/slugs — see
|
|
1082
|
+
// `hydrateReferences`'s doc comment.
|
|
1083
|
+
if (referenceOptions) {
|
|
1084
|
+
await hydrateReferences(db, collection, item, referenceOptions.includeDrafts);
|
|
1085
|
+
}
|
|
757
1086
|
|
|
758
1087
|
return {
|
|
759
1088
|
success: true,
|
|
@@ -840,6 +1169,8 @@ export async function handleContentCreate(
|
|
|
840
1169
|
translationOf?: string;
|
|
841
1170
|
seo?: ContentSeoInput;
|
|
842
1171
|
taxonomies?: Record<string, string[]>;
|
|
1172
|
+
/** Reference fields: field slug → ordered selected entry ids. */
|
|
1173
|
+
references?: Record<string, string[]>;
|
|
843
1174
|
createdAt?: string | null;
|
|
844
1175
|
publishedAt?: string | null;
|
|
845
1176
|
},
|
|
@@ -858,9 +1189,20 @@ export async function handleContentCreate(
|
|
|
858
1189
|
};
|
|
859
1190
|
}
|
|
860
1191
|
|
|
1192
|
+
const storagelessKeys = await storagelessDataKeys(db, collection, body.data);
|
|
1193
|
+
if (storagelessKeys.length > 0) return storagelessDataKeyError(storagelessKeys);
|
|
1194
|
+
|
|
861
1195
|
const mimeCheck = await validateMediaFields(db, collection, body.data);
|
|
862
1196
|
if (!mimeCheck.success) return mimeCheck;
|
|
863
1197
|
|
|
1198
|
+
const requiredReferences = await validateRequiredReferencesPresent(
|
|
1199
|
+
db,
|
|
1200
|
+
collection,
|
|
1201
|
+
body.references,
|
|
1202
|
+
body.translationOf,
|
|
1203
|
+
);
|
|
1204
|
+
if (!requiredReferences.success) return requiredReferences;
|
|
1205
|
+
|
|
864
1206
|
// Wrap content + SEO writes in a transaction for atomicity
|
|
865
1207
|
const item = await withTransaction(db, async (trx) => {
|
|
866
1208
|
const repo = new ContentRepository(trx);
|
|
@@ -881,6 +1223,34 @@ export async function handleContentCreate(
|
|
|
881
1223
|
).map((field) => field.slug)
|
|
882
1224
|
: [];
|
|
883
1225
|
|
|
1226
|
+
// Resolve the whole selection before the entry is written. On D1 the
|
|
1227
|
+
// statements below land one at a time with nothing to roll them back, so
|
|
1228
|
+
// a field slug or a selected id that fails to resolve has to fail here,
|
|
1229
|
+
// while the only thing written is nothing.
|
|
1230
|
+
const referenceWrites: ResolvedReferenceTargets[] = [];
|
|
1231
|
+
if (body.references) {
|
|
1232
|
+
// A new translation joins the source's group, which may already hold
|
|
1233
|
+
// links the far-side count must discount.
|
|
1234
|
+
const entryGroup = body.translationOf
|
|
1235
|
+
? ((await repo.findById(collection, body.translationOf))?.translationGroup ?? null)
|
|
1236
|
+
: null;
|
|
1237
|
+
for (const [fieldSlug, selectedIds] of Object.entries(body.references)) {
|
|
1238
|
+
const resolved = await resolveReferenceSelectionTargets(
|
|
1239
|
+
trx,
|
|
1240
|
+
collection,
|
|
1241
|
+
fieldSlug,
|
|
1242
|
+
selectedIds,
|
|
1243
|
+
entryGroup,
|
|
1244
|
+
);
|
|
1245
|
+
if (!resolved.success) {
|
|
1246
|
+
throw Object.assign(new Error(resolved.error.message), {
|
|
1247
|
+
apiError: { code: resolved.error.code },
|
|
1248
|
+
});
|
|
1249
|
+
}
|
|
1250
|
+
referenceWrites.push(resolved.data);
|
|
1251
|
+
}
|
|
1252
|
+
}
|
|
1253
|
+
|
|
884
1254
|
// Default to the configured site locale rather than the repo's
|
|
885
1255
|
// hard-coded "en" — otherwise non-English default-locale sites
|
|
886
1256
|
// silently create entries in a locale the editor never chose.
|
|
@@ -962,6 +1332,18 @@ export async function handleContentCreate(
|
|
|
962
1332
|
await assignTaxonomies(trx, collection, created.id, effectiveLocale, body.taxonomies);
|
|
963
1333
|
}
|
|
964
1334
|
|
|
1335
|
+
// Attach the links resolved above. Nothing here can fail on the
|
|
1336
|
+
// caller's input any more, so the entry cannot be left written with a
|
|
1337
|
+
// selection that was rejected.
|
|
1338
|
+
if (created.translationGroup) {
|
|
1339
|
+
for (const write of referenceWrites) {
|
|
1340
|
+
await writeReferenceSelection(trx, {
|
|
1341
|
+
...write,
|
|
1342
|
+
entryGroup: created.translationGroup,
|
|
1343
|
+
});
|
|
1344
|
+
}
|
|
1345
|
+
}
|
|
1346
|
+
|
|
965
1347
|
return created;
|
|
966
1348
|
});
|
|
967
1349
|
|
|
@@ -970,6 +1352,14 @@ export async function handleContentCreate(
|
|
|
970
1352
|
data: { item, _rev: encodeRev(item) },
|
|
971
1353
|
};
|
|
972
1354
|
} catch (error) {
|
|
1355
|
+
// Handle structured errors thrown from inside the transaction (e.g. a
|
|
1356
|
+
// reference resolution failure from `setReferenceSelection`).
|
|
1357
|
+
if (hasApiError(error)) {
|
|
1358
|
+
return {
|
|
1359
|
+
success: false,
|
|
1360
|
+
error: { code: error.apiError.code, message: error.message },
|
|
1361
|
+
};
|
|
1362
|
+
}
|
|
973
1363
|
if (isMissingTableError(error)) {
|
|
974
1364
|
return {
|
|
975
1365
|
success: false,
|
|
@@ -1061,6 +1451,8 @@ export async function handleContentUpdate(
|
|
|
1061
1451
|
_rev?: string;
|
|
1062
1452
|
seo?: ContentSeoInput;
|
|
1063
1453
|
taxonomies?: Record<string, string[]>;
|
|
1454
|
+
/** Reference fields: field slug → ordered selected entry ids. */
|
|
1455
|
+
references?: Record<string, string[]>;
|
|
1064
1456
|
publishedAt?: string | null;
|
|
1065
1457
|
},
|
|
1066
1458
|
): Promise<ApiResult<ContentResponse>> {
|
|
@@ -1088,6 +1480,19 @@ export async function handleContentUpdate(
|
|
|
1088
1480
|
// Resolve slug → ID if needed
|
|
1089
1481
|
const resolvedId = (await resolveId(repo, collection, id, body.locale)) ?? id;
|
|
1090
1482
|
|
|
1483
|
+
if (body.data) {
|
|
1484
|
+
const storagelessKeys = await storagelessDataKeys(db, collection, body.data);
|
|
1485
|
+
if (storagelessKeys.length > 0) {
|
|
1486
|
+
const stored = await repo.findById(collection, resolvedId);
|
|
1487
|
+
const changed = changedStoragelessDataKeys(
|
|
1488
|
+
new Set(storagelessKeys),
|
|
1489
|
+
body.data,
|
|
1490
|
+
stored?.data ?? {},
|
|
1491
|
+
);
|
|
1492
|
+
if (changed.length > 0) return storagelessDataKeyError(changed);
|
|
1493
|
+
}
|
|
1494
|
+
}
|
|
1495
|
+
|
|
1091
1496
|
// Wrap content + SEO writes in a transaction for atomicity.
|
|
1092
1497
|
// The _rev check is inside the transaction so the read-then-write
|
|
1093
1498
|
// is atomic -- no concurrent write can slip between the check and update.
|
|
@@ -1135,6 +1540,29 @@ export async function handleContentUpdate(
|
|
|
1135
1540
|
requireRoutablePublishSlug(publishConfig.routable, intendedSlug);
|
|
1136
1541
|
}
|
|
1137
1542
|
|
|
1543
|
+
// Resolve the whole selection before the update, for the reason the
|
|
1544
|
+
// matching block in `handleContentCreate` gives: on D1 the columns,
|
|
1545
|
+
// bylines and SEO below are committed one statement at a time, and a
|
|
1546
|
+
// reference rejected after them cannot take them back.
|
|
1547
|
+
const referenceWrites: ReferenceSelectionWrite[] = [];
|
|
1548
|
+
if (body.references) {
|
|
1549
|
+
for (const [fieldSlug, selectedIds] of Object.entries(body.references)) {
|
|
1550
|
+
const resolved = await resolveReferenceSelection(
|
|
1551
|
+
trx,
|
|
1552
|
+
collection,
|
|
1553
|
+
resolvedId,
|
|
1554
|
+
fieldSlug,
|
|
1555
|
+
selectedIds,
|
|
1556
|
+
);
|
|
1557
|
+
if (!resolved.success) {
|
|
1558
|
+
throw Object.assign(new Error(resolved.error.message), {
|
|
1559
|
+
apiError: { code: resolved.error.code },
|
|
1560
|
+
});
|
|
1561
|
+
}
|
|
1562
|
+
referenceWrites.push(resolved.data);
|
|
1563
|
+
}
|
|
1564
|
+
}
|
|
1565
|
+
|
|
1138
1566
|
const updated = await trxRepo.update(collection, resolvedId, {
|
|
1139
1567
|
data: body.data,
|
|
1140
1568
|
slug: body.slug,
|
|
@@ -1205,6 +1633,11 @@ export async function handleContentUpdate(
|
|
|
1205
1633
|
);
|
|
1206
1634
|
}
|
|
1207
1635
|
|
|
1636
|
+
// Replace the links from the selection resolved above.
|
|
1637
|
+
for (const write of referenceWrites) {
|
|
1638
|
+
await writeReferenceSelection(trx, write);
|
|
1639
|
+
}
|
|
1640
|
+
|
|
1208
1641
|
return updated;
|
|
1209
1642
|
});
|
|
1210
1643
|
|
|
@@ -1286,8 +1719,42 @@ export async function handleContentDuplicate(
|
|
|
1286
1719
|
const repo = new ContentRepository(trx);
|
|
1287
1720
|
const bylineRepo = new BylineRepository(trx);
|
|
1288
1721
|
const resolvedId = (await resolveId(repo, collection, id)) ?? id;
|
|
1722
|
+
const original = await repo.findById(collection, resolvedId);
|
|
1289
1723
|
const dup = await repo.duplicate(collection, resolvedId, authorId);
|
|
1290
1724
|
|
|
1725
|
+
// Reference edges are storage-less (keyed by translation_group, not in
|
|
1726
|
+
// `data`), so they don't ride along in the row copy — carry the original's
|
|
1727
|
+
// outgoing references onto the duplicate explicitly.
|
|
1728
|
+
if (original?.translationGroup && dup.translationGroup) {
|
|
1729
|
+
const relations = new RelationRepository(trx);
|
|
1730
|
+
// A relation's limits bind a copied edge like any other, and a
|
|
1731
|
+
// selection the copy cannot hold is not one to drop quietly: the
|
|
1732
|
+
// duplicate would look complete with a reference field the editor
|
|
1733
|
+
// never emptied. Refuse instead, and name what refused it.
|
|
1734
|
+
throwIfReferenceLimitRefused(
|
|
1735
|
+
await relations.copyParentEdges(original.translationGroup, dup.translationGroup),
|
|
1736
|
+
"parent",
|
|
1737
|
+
);
|
|
1738
|
+
|
|
1739
|
+
// Where a field on this collection binds the *child* end, its
|
|
1740
|
+
// backlinks are the field's value, so a duplicate that dropped them
|
|
1741
|
+
// would lose that field's whole selection. Backlinks no field views
|
|
1742
|
+
// still point only at the original.
|
|
1743
|
+
for (const field of (await referenceFieldConstraints(trx, collection)).values()) {
|
|
1744
|
+
if (field.relationSide !== "child") continue;
|
|
1745
|
+
const parents = await relations.getParents(field.relation, original.translationGroup);
|
|
1746
|
+
if (parents.length === 0) continue;
|
|
1747
|
+
throwIfReferenceLimitRefused(
|
|
1748
|
+
await relations.setParents(
|
|
1749
|
+
field.relation,
|
|
1750
|
+
dup.translationGroup,
|
|
1751
|
+
parents.map((parent) => parent.parentGroup),
|
|
1752
|
+
),
|
|
1753
|
+
"child",
|
|
1754
|
+
);
|
|
1755
|
+
}
|
|
1756
|
+
}
|
|
1757
|
+
|
|
1291
1758
|
const existingBylines = await bylineRepo.getContentBylines(collection, resolvedId);
|
|
1292
1759
|
if (existingBylines.length > 0) {
|
|
1293
1760
|
await bylineRepo.setContentBylines(
|
|
@@ -1327,6 +1794,14 @@ export async function handleContentDuplicate(
|
|
|
1327
1794
|
},
|
|
1328
1795
|
};
|
|
1329
1796
|
}
|
|
1797
|
+
// A relation limit that refused a copied edge names the entry that refused
|
|
1798
|
+
// it, which the editor needs to act on.
|
|
1799
|
+
if (hasApiError(err)) {
|
|
1800
|
+
return {
|
|
1801
|
+
success: false,
|
|
1802
|
+
error: { code: err.apiError.code, message: err.message },
|
|
1803
|
+
};
|
|
1804
|
+
}
|
|
1330
1805
|
console.error("Content duplicate error:", err);
|
|
1331
1806
|
return {
|
|
1332
1807
|
success: false,
|
|
@@ -1458,6 +1933,33 @@ export async function handleContentPermanentDelete(
|
|
|
1458
1933
|
const deleted = await withTransaction(db, async (trx) => {
|
|
1459
1934
|
const trxRepo = new ContentRepository(trx);
|
|
1460
1935
|
const item = await trxRepo.findByIdIncludingTrashed(collection, resolvedId);
|
|
1936
|
+
|
|
1937
|
+
// `permanentDelete` removes a trashed row only. Anything cleared ahead of
|
|
1938
|
+
// it has to answer the same question first, or purging a live entry strips
|
|
1939
|
+
// what belongs to it and then reports it was never found — and nothing
|
|
1940
|
+
// throws, so the clear stands even where the transaction is real.
|
|
1941
|
+
if (!item || item.deletedAt === null) return false;
|
|
1942
|
+
|
|
1943
|
+
// Term assignments and reference edges are keyed by translation_group, so
|
|
1944
|
+
// they belong to the group rather than to this row. They go only once no
|
|
1945
|
+
// row of the group is left, trashed ones included, since a trashed row
|
|
1946
|
+
// can still be restored.
|
|
1947
|
+
const lastOfGroup =
|
|
1948
|
+
item.translationGroup !== null
|
|
1949
|
+
? !(await trxRepo.hasTranslationsIncludingTrashed(collection, item.translationGroup, {
|
|
1950
|
+
excludeId: resolvedId,
|
|
1951
|
+
}))
|
|
1952
|
+
: false;
|
|
1953
|
+
|
|
1954
|
+
// The edges go before the row does. On D1 the delete below is committed
|
|
1955
|
+
// on its own, and this row is the only way back to the group that names
|
|
1956
|
+
// them — a cleanup that failed after it would strand edges that still
|
|
1957
|
+
// count and still show up as backlinks, with nothing left to find them
|
|
1958
|
+
// by. Failing here instead leaves everything as it was, to retry.
|
|
1959
|
+
if (lastOfGroup && item.translationGroup) {
|
|
1960
|
+
await new RelationRepository(trx).clearReferencesForGroup(item.translationGroup);
|
|
1961
|
+
}
|
|
1962
|
+
|
|
1461
1963
|
const wasDeleted = await trxRepo.permanentDelete(collection, resolvedId);
|
|
1462
1964
|
|
|
1463
1965
|
if (wasDeleted) {
|
|
@@ -1471,21 +1973,11 @@ export async function handleContentPermanentDelete(
|
|
|
1471
1973
|
const revisionRepo = new RevisionRepository(trx);
|
|
1472
1974
|
await revisionRepo.deleteByEntry(collection, resolvedId);
|
|
1473
1975
|
await new EntryLockRepository(trx).releaseEntry(collection, resolvedId);
|
|
1976
|
+
// Credits belong to this row alone — no other row reads them, so they
|
|
1977
|
+
// go with it whether or not the group survives.
|
|
1474
1978
|
await new BylineRepository(trx).deleteContentBylines(collection, resolvedId);
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
// left, trashed ones included, since a trashed row can still be restored.
|
|
1478
|
-
if (item?.translationGroup) {
|
|
1479
|
-
const groupSurvives = await trxRepo.hasTranslationsIncludingTrashed(
|
|
1480
|
-
collection,
|
|
1481
|
-
item.translationGroup,
|
|
1482
|
-
);
|
|
1483
|
-
if (!groupSurvives) {
|
|
1484
|
-
await new TaxonomyRepository(trx).clearEntryGroupTerms(
|
|
1485
|
-
collection,
|
|
1486
|
-
item.translationGroup,
|
|
1487
|
-
);
|
|
1488
|
-
}
|
|
1979
|
+
if (lastOfGroup && item.translationGroup) {
|
|
1980
|
+
await new TaxonomyRepository(trx).clearEntryGroupTerms(collection, item.translationGroup);
|
|
1489
1981
|
}
|
|
1490
1982
|
}
|
|
1491
1983
|
|
|
@@ -1806,6 +2298,54 @@ export async function handleContentPublish(
|
|
|
1806
2298
|
// are normally created.
|
|
1807
2299
|
const existing = await repo.findById(collection, resolvedId);
|
|
1808
2300
|
|
|
2301
|
+
// A selection staged in the draft becomes the live one here. Validate
|
|
2302
|
+
// before the publishing statement rather than after: `withTransaction`
|
|
2303
|
+
// degrades to sequential statements on D1, so a selection rejected
|
|
2304
|
+
// afterwards would leave the entry published with the old links.
|
|
2305
|
+
const draftRevision =
|
|
2306
|
+
publishConfig.supportsRevisions && existing?.draftRevisionId
|
|
2307
|
+
? await new RevisionRepository(trx).findById(existing.draftRevisionId)
|
|
2308
|
+
: undefined;
|
|
2309
|
+
const stagedReferences = draftRevision ? readStagedReferences(draftRevision.data) : undefined;
|
|
2310
|
+
if (existing?.translationGroup) {
|
|
2311
|
+
const valid = await validateStagedReferences(
|
|
2312
|
+
trx,
|
|
2313
|
+
collection,
|
|
2314
|
+
stagedReferences ?? {},
|
|
2315
|
+
existing.translationGroup,
|
|
2316
|
+
);
|
|
2317
|
+
if (!valid.success) {
|
|
2318
|
+
throw Object.assign(new Error(valid.error.message), {
|
|
2319
|
+
apiError: { code: valid.error.code },
|
|
2320
|
+
});
|
|
2321
|
+
}
|
|
2322
|
+
|
|
2323
|
+
// Promote before the publishing statement, which is also what clears
|
|
2324
|
+
// the draft pointer. On D1 that statement cannot be taken back, and
|
|
2325
|
+
// the draft is the only place the staged selection can be read from
|
|
2326
|
+
// again — a promotion that failed after it would have nothing left to
|
|
2327
|
+
// retry. Replacing a selection is idempotent, so a retry that reaches
|
|
2328
|
+
// here twice writes the same links.
|
|
2329
|
+
//
|
|
2330
|
+
// That ordering only holds if the publish is going to happen, so every
|
|
2331
|
+
// refusal `repo.publish()` decides before it writes is decided here
|
|
2332
|
+
// first. It repeats them all and stays authoritative; running them
|
|
2333
|
+
// early keeps a refusal from landing after a promotion nothing undoes,
|
|
2334
|
+
// which would show readers a selection that was never published. Its
|
|
2335
|
+
// last check is the optimistic fence, which cannot move ahead of the
|
|
2336
|
+
// write it guards.
|
|
2337
|
+
if (stagedReferences) {
|
|
2338
|
+
await assertPublishWillNotBeRefused(trx, collection, resolvedId, existing, {
|
|
2339
|
+
stagedSlug: readStagedSlug(draftRevision?.data),
|
|
2340
|
+
requireSlug: publishConfig.routable,
|
|
2341
|
+
requireDue: options.requireScheduledDue,
|
|
2342
|
+
expectedScheduledAt: options.expectedScheduledAt,
|
|
2343
|
+
expectedRevision,
|
|
2344
|
+
});
|
|
2345
|
+
await applyStagedReferences(trx, collection, existing.translationGroup, stagedReferences);
|
|
2346
|
+
}
|
|
2347
|
+
}
|
|
2348
|
+
|
|
1809
2349
|
const published = await repo.publish(
|
|
1810
2350
|
collection,
|
|
1811
2351
|
resolvedId,
|
|
@@ -1818,6 +2358,19 @@ export async function handleContentPublish(
|
|
|
1818
2358
|
options.currentTime,
|
|
1819
2359
|
);
|
|
1820
2360
|
|
|
2361
|
+
if (
|
|
2362
|
+
publishConfig.supportsRevisions &&
|
|
2363
|
+
published.liveRevisionId &&
|
|
2364
|
+
published.translationGroup
|
|
2365
|
+
) {
|
|
2366
|
+
await recordPublishedReferences(
|
|
2367
|
+
trx,
|
|
2368
|
+
collection,
|
|
2369
|
+
published.liveRevisionId,
|
|
2370
|
+
published.translationGroup,
|
|
2371
|
+
);
|
|
2372
|
+
}
|
|
2373
|
+
|
|
1821
2374
|
if (
|
|
1822
2375
|
existing &&
|
|
1823
2376
|
isI18nEnabled() &&
|
|
@@ -1864,6 +2417,12 @@ export async function handleContentPublish(
|
|
|
1864
2417
|
data: { item, _rev: encodeRev(item) },
|
|
1865
2418
|
};
|
|
1866
2419
|
} catch (error) {
|
|
2420
|
+
if (hasApiError(error)) {
|
|
2421
|
+
return {
|
|
2422
|
+
success: false,
|
|
2423
|
+
error: { code: error.apiError.code, message: error.message },
|
|
2424
|
+
};
|
|
2425
|
+
}
|
|
1867
2426
|
if (error instanceof ContentMutationConflictError) {
|
|
1868
2427
|
return {
|
|
1869
2428
|
success: false,
|
|
@@ -2094,13 +2653,31 @@ export async function handleContentCompare(
|
|
|
2094
2653
|
const live = entry.liveRevisionId ? await revisionRepo.findById(entry.liveRevisionId) : null;
|
|
2095
2654
|
const draft = entry.draftRevisionId ? await revisionRepo.findById(entry.draftRevisionId) : null;
|
|
2096
2655
|
|
|
2656
|
+
// Reference selections have to be filled in from the links on both sides
|
|
2657
|
+
// before they can be compared. The published selection is the links, not
|
|
2658
|
+
// whatever `_references` the live revision happens to carry; and the draft
|
|
2659
|
+
// stages only the fields its saves named, so the rest of its effective
|
|
2660
|
+
// selection is the live one.
|
|
2661
|
+
const liveReferences = entry.translationGroup
|
|
2662
|
+
? await liveReferenceSelection(db, collection, entry.translationGroup)
|
|
2663
|
+
: {};
|
|
2664
|
+
const withReferences = (
|
|
2665
|
+
revisionData: Record<string, unknown> | undefined,
|
|
2666
|
+
staged: StagedReferences,
|
|
2667
|
+
) => {
|
|
2668
|
+
if (!revisionData) return undefined;
|
|
2669
|
+
const selection = { ...liveReferences, ...staged };
|
|
2670
|
+
if (Object.keys(selection).length === 0) return revisionData;
|
|
2671
|
+
return { ...revisionData, [STAGED_REFERENCES_KEY]: selection };
|
|
2672
|
+
};
|
|
2673
|
+
|
|
2097
2674
|
return {
|
|
2098
2675
|
success: true,
|
|
2099
2676
|
data: {
|
|
2100
2677
|
hasChanges:
|
|
2101
2678
|
entry.draftRevisionId !== null && entry.draftRevisionId !== entry.liveRevisionId,
|
|
2102
|
-
live: live?.data ?? null,
|
|
2103
|
-
draft: draft?.data ?? null,
|
|
2679
|
+
live: withReferences(live?.data, {}) ?? null,
|
|
2680
|
+
draft: withReferences(draft?.data, readStagedReferences(draft?.data) ?? {}) ?? null,
|
|
2104
2681
|
},
|
|
2105
2682
|
};
|
|
2106
2683
|
} catch (error) {
|