emdash 0.40.0 → 0.41.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/action-token-CbKDcPJi.mjs +26 -0
- package/dist/action-token-CbKDcPJi.mjs.map +1 -0
- package/dist/activation-PtniBLt9.mjs +382 -0
- package/dist/activation-PtniBLt9.mjs.map +1 -0
- package/dist/adapters-C_Tf5x90.d.mts +171 -0
- package/dist/adapters-C_Tf5x90.d.mts.map +1 -0
- package/dist/allowed-origins-U1z4TdEZ.mjs +116 -0
- package/dist/allowed-origins-U1z4TdEZ.mjs.map +1 -0
- package/dist/api/route-utils.d.mts +4 -4
- package/dist/api/route-utils.mjs +46 -45
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +10 -10
- package/dist/api-CXwQkV_m.mjs +5122 -0
- package/dist/api-CXwQkV_m.mjs.map +1 -0
- package/dist/api-tokens-89WlohEN.mjs +166 -0
- package/dist/api-tokens-89WlohEN.mjs.map +1 -0
- package/dist/apply-Do3KNnUk.mjs +1659 -0
- package/dist/apply-Do3KNnUk.mjs.map +1 -0
- package/dist/approvals-CAX9Yw33.mjs +460 -0
- package/dist/approvals-CAX9Yw33.mjs.map +1 -0
- package/dist/artifact-fetch-B9W4CEST.mjs +659 -0
- package/dist/artifact-fetch-B9W4CEST.mjs.map +1 -0
- package/dist/astro/index.d.mts +14 -14
- package/dist/astro/index.mjs +26 -30
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +12 -12
- package/dist/astro/middleware/auth.mjs +10 -10
- package/dist/astro/middleware/media-usage-write-fence.mjs +5 -5
- package/dist/astro/middleware/redirect.mjs +7 -7
- package/dist/astro/middleware/request-context.mjs +3 -3
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +12 -12
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +110 -106
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +14 -14
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +14 -14
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +7 -7
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +17 -17
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +17 -17
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +17 -17
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +23 -23
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +23 -23
- package/dist/astro/routes/api/admin/bylines/index.mjs +23 -23
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +18 -18
- package/dist/astro/routes/api/admin/comments/_id_.mjs +7 -7
- package/dist/astro/routes/api/admin/comments/bulk.mjs +17 -17
- package/dist/astro/routes/api/admin/comments/counts.mjs +7 -7
- package/dist/astro/routes/api/admin/comments/index.mjs +17 -17
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +6 -6
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +5 -5
- package/dist/astro/routes/api/admin/media-usage/activation.mjs +20 -20
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +22 -22
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +22 -22
- package/dist/astro/routes/api/admin/media-usage/progress.mjs +25 -25
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +31 -31
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +22 -22
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +22 -22
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +8 -8
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +8 -8
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +72 -68
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +7 -7
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +71 -67
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +72 -68
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +82 -78
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +72 -68
- package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +5 -5
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +71 -67
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +81 -77
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +71 -67
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +72 -68
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +83 -79
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +9 -9
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +74 -70
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/publisher-handle.mjs +7 -7
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +72 -68
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +71 -67
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +71 -67
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +5 -5
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +71 -67
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/_...path_.mjs +4 -4
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs +40 -40
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs +40 -40
- package/dist/astro/routes/api/admin/transfer/approvals/index.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/capabilities.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs +43 -43
- package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs +43 -43
- package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs +43 -43
- package/dist/astro/routes/api/admin/transfer/exports/index.mjs +44 -44
- package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs +44 -44
- package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs +44 -44
- package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs +44 -44
- package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/index.mjs +44 -44
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +5 -5
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +4 -4
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +15 -15
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +6 -6
- package/dist/astro/routes/api/admin/users/index.mjs +14 -14
- package/dist/astro/routes/api/auth/dev-bypass.mjs +6 -6
- package/dist/astro/routes/api/auth/invite/accept.mjs +4 -4
- package/dist/astro/routes/api/auth/invite/complete.mjs +18 -18
- package/dist/astro/routes/api/auth/invite/index.mjs +16 -16
- package/dist/astro/routes/api/auth/invite/register-options.mjs +17 -17
- package/dist/astro/routes/api/auth/logout.mjs +5 -5
- package/dist/astro/routes/api/auth/magic-link/send.mjs +18 -18
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +14 -14
- package/dist/astro/routes/api/auth/me.mjs +15 -15
- package/dist/astro/routes/api/auth/mode.mjs +5 -5
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +14 -14
- package/dist/astro/routes/api/auth/passkey/index.mjs +4 -4
- package/dist/astro/routes/api/auth/passkey/options.mjs +19 -19
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +17 -17
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +18 -18
- package/dist/astro/routes/api/auth/passkey/verify.mjs +18 -18
- package/dist/astro/routes/api/auth/signup/complete.mjs +18 -18
- package/dist/astro/routes/api/auth/signup/request.mjs +17 -17
- package/dist/astro/routes/api/auth/signup/verify.mjs +4 -4
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +12 -12
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +18 -18
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs +11 -11
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +31 -31
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts +1 -2
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +42 -53
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +34 -29
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +25 -24
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +18 -18
- package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/authors.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/index.mjs +15 -15
- package/dist/astro/routes/api/content/_collection_/trash.mjs +15 -15
- package/dist/astro/routes/api/dashboard.mjs +10 -9
- package/dist/astro/routes/api/dashboard.mjs.map +1 -1
- package/dist/astro/routes/api/dev/emails.mjs +5 -5
- package/dist/astro/routes/api/health.mjs +6 -6
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +23 -23
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +6 -6
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +13 -13
- package/dist/astro/routes/api/import/wordpress/execute.mjs +16 -16
- package/dist/astro/routes/api/import/wordpress/media.d.mts +12 -12
- package/dist/astro/routes/api/import/wordpress/media.mjs +19 -19
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +18 -18
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +13 -13
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +28 -28
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +23 -23
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +13 -13
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +34 -34
- package/dist/astro/routes/api/manifest.mjs +6 -6
- package/dist/astro/routes/api/mcp.mjs +98 -118
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +19 -19
- package/dist/astro/routes/api/media/_id_/replace.mjs +16 -16
- package/dist/astro/routes/api/media/_id_/upload.mjs +9 -9
- package/dist/astro/routes/api/media/_id_/usage.mjs +33 -33
- package/dist/astro/routes/api/media/_id_.mjs +31 -31
- package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs +6 -6
- package/dist/astro/routes/api/media/file/_...key_.mjs +9 -9
- package/dist/astro/routes/api/media/folders/_id_.mjs +16 -16
- package/dist/astro/routes/api/media/folders/index.mjs +16 -16
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +5 -5
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +5 -5
- package/dist/astro/routes/api/media/providers/index.mjs +5 -5
- package/dist/astro/routes/api/media/upload-url.mjs +18 -18
- package/dist/astro/routes/api/media.mjs +35 -35
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +17 -17
- package/dist/astro/routes/api/menus/_name_/items.mjs +17 -17
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +17 -17
- package/dist/astro/routes/api/menus/_name_/translations.mjs +17 -17
- package/dist/astro/routes/api/menus/_name_.mjs +17 -17
- package/dist/astro/routes/api/menus/index.mjs +17 -17
- package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/authorize.d.mts +2 -1
- package/dist/astro/routes/api/oauth/device/authorize.d.mts.map +1 -1
- package/dist/astro/routes/api/oauth/device/authorize.mjs +23 -9
- package/dist/astro/routes/api/oauth/device/authorize.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/device/code.mjs +11 -11
- package/dist/astro/routes/api/oauth/device/token.mjs +10 -10
- package/dist/astro/routes/api/oauth/register.mjs +5 -5
- package/dist/astro/routes/api/oauth/token/refresh.mjs +8 -8
- package/dist/astro/routes/api/oauth/token/revoke.mjs +8 -8
- package/dist/astro/routes/api/oauth/token.mjs +8 -8
- package/dist/astro/routes/api/openapi.json.mjs +20 -20
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +11 -11
- package/dist/astro/routes/api/redirects/404s/index.mjs +19 -19
- package/dist/astro/routes/api/redirects/404s/summary.mjs +19 -19
- package/dist/astro/routes/api/redirects/_id_.mjs +19 -19
- package/dist/astro/routes/api/redirects/index.mjs +19 -19
- package/dist/astro/routes/api/relations/_id_/index.mjs +34 -29
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/index.mjs +36 -31
- package/dist/astro/routes/api/relations/index.mjs.map +1 -1
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +5 -5
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +5 -5
- package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs +71 -67
- package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs +71 -67
- package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs.map +1 -1
- package/dist/astro/routes/api/schema/block-types/index.mjs +71 -67
- package/dist/astro/routes/api/schema/block-types/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +73 -69
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +71 -67
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +71 -67
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +71 -67
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +71 -67
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/reorder.mjs +71 -67
- package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +16 -16
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +71 -67
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +71 -67
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +19 -19
- package/dist/astro/routes/api/search/index.mjs +18 -18
- package/dist/astro/routes/api/search/rebuild.mjs +19 -19
- package/dist/astro/routes/api/search/stats.mjs +9 -9
- package/dist/astro/routes/api/search/suggest.mjs +18 -18
- package/dist/astro/routes/api/sections/_slug_.mjs +18 -18
- package/dist/astro/routes/api/sections/index.mjs +18 -18
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/export.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/index.mjs +8 -8
- package/dist/astro/routes/api/settings/email.mjs +6 -6
- package/dist/astro/routes/api/settings.mjs +21 -21
- package/dist/astro/routes/api/setup/admin-verify.mjs +19 -19
- package/dist/astro/routes/api/setup/admin.mjs +18 -18
- package/dist/astro/routes/api/setup/dev-bypass.mjs +45 -39
- package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-reset.mjs +4 -4
- package/dist/astro/routes/api/setup/index.d.mts.map +1 -1
- package/dist/astro/routes/api/setup/index.mjs +80 -49
- package/dist/astro/routes/api/setup/index.mjs.map +1 -1
- package/dist/astro/routes/api/setup/status.mjs +6 -6
- package/dist/astro/routes/api/snapshot.mjs +9 -9
- package/dist/astro/routes/api/snapshot.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +22 -22
- package/dist/astro/routes/api/taxonomies/_name_.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/bulk-tag.mjs +36 -35
- package/dist/astro/routes/api/taxonomies/bulk-tag.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +23 -23
- package/dist/astro/routes/api/themes/preview.mjs +6 -6
- package/dist/astro/routes/api/typegen.mjs +8 -8
- package/dist/astro/routes/api/visual-editing/action-token.mjs +6 -6
- package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs +19 -19
- package/dist/astro/routes/api/visual-editing/toolbar-labels.mjs +4 -4
- package/dist/astro/routes/api/well-known/auth.mjs +1 -1
- package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
- package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +16 -16
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +19 -19
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +19 -19
- package/dist/astro/routes/api/widget-areas/_name_.mjs +9 -9
- package/dist/astro/routes/api/widget-areas/index.mjs +19 -19
- package/dist/astro/routes/api/widget-components.mjs +5 -5
- package/dist/astro/routes/robots.txt.mjs +6 -6
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +9 -9
- package/dist/astro/routes/sitemap.xml.mjs +7 -7
- package/dist/astro/types.d.mts +28 -18
- package/dist/astro/types.d.mts.map +1 -1
- package/dist/audit-CrgmE9LE.mjs +127 -0
- package/dist/audit-CrgmE9LE.mjs.map +1 -0
- package/dist/auth/providers/github.d.mts +1 -1
- package/dist/auth/providers/google.d.mts +1 -1
- package/dist/authoritative-records-C2YzIdbu.mjs +5172 -0
- package/dist/authoritative-records-C2YzIdbu.mjs.map +1 -0
- package/dist/authorize-WgdKF8QY.mjs +49 -0
- package/dist/authorize-WgdKF8QY.mjs.map +1 -0
- package/dist/backup-Ck8_lMO3.mjs +246 -0
- package/dist/backup-Ck8_lMO3.mjs.map +1 -0
- package/dist/block-types-BQ90asVI.mjs +132 -0
- package/dist/block-types-BQ90asVI.mjs.map +1 -0
- package/dist/block-values-ACFqgB1D.mjs +175 -0
- package/dist/block-values-ACFqgB1D.mjs.map +1 -0
- package/dist/bundle-Db1iNMv_.mjs +667 -0
- package/dist/bundle-Db1iNMv_.mjs.map +1 -0
- package/dist/byline-BayaYGoj.mjs +909 -0
- package/dist/byline-BayaYGoj.mjs.map +1 -0
- package/dist/byline-fields-B8HH-35f.mjs +254 -0
- package/dist/byline-fields-B8HH-35f.mjs.map +1 -0
- package/dist/byline-fields-hMPjf6Eu.mjs +123 -0
- package/dist/byline-fields-hMPjf6Eu.mjs.map +1 -0
- package/dist/byline-registry-B_EK_TQf.mjs +406 -0
- package/dist/byline-registry-B_EK_TQf.mjs.map +1 -0
- package/dist/bylines-DFAaFXWi.mjs +214 -0
- package/dist/bylines-DFAaFXWi.mjs.map +1 -0
- package/dist/bylines-DkIxUxmr.mjs +232 -0
- package/dist/bylines-DkIxUxmr.mjs.map +1 -0
- package/dist/cache-DkvhQ8XE.mjs +108 -0
- package/dist/cache-DkvhQ8XE.mjs.map +1 -0
- package/dist/canonical-CcSuuTlH.mjs +174 -0
- package/dist/canonical-CcSuuTlH.mjs.map +1 -0
- package/dist/capture-triggers-DJEoOTOq.mjs +362 -0
- package/dist/capture-triggers-DJEoOTOq.mjs.map +1 -0
- package/dist/challenge-store-CvBl81AQ.mjs +51 -0
- package/dist/challenge-store-CvBl81AQ.mjs.map +1 -0
- package/dist/checksum-CClweQzI.mjs +162 -0
- package/dist/checksum-CClweQzI.mjs.map +1 -0
- package/dist/chrome-tags-D5caJwwp.mjs +24 -0
- package/dist/chrome-tags-D5caJwwp.mjs.map +1 -0
- package/dist/chunks-DwBaj8aT.mjs +25 -0
- package/dist/chunks-DwBaj8aT.mjs.map +1 -0
- package/dist/cli/index.mjs +374 -761
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +18 -18
- package/dist/client/index.mjs +2 -2
- package/dist/collection-deletion-CLCdXsnV.mjs +436 -0
- package/dist/collection-deletion-CLCdXsnV.mjs.map +1 -0
- package/dist/collection-deletion-processor-hNw8x01F.mjs +217 -0
- package/dist/collection-deletion-processor-hNw8x01F.mjs.map +1 -0
- package/dist/collection-slugs-cache-CUuiduLq.mjs +85 -0
- package/dist/collection-slugs-cache-CUuiduLq.mjs.map +1 -0
- package/dist/comment-D2uvL63j.mjs +313 -0
- package/dist/comment-D2uvL63j.mjs.map +1 -0
- package/dist/comment-reaction-DevUuzg4.mjs +85 -0
- package/dist/comment-reaction-DevUuzg4.mjs.map +1 -0
- package/dist/comments-Cq0s7_hO.mjs +195 -0
- package/dist/comments-Cq0s7_hO.mjs.map +1 -0
- package/dist/comments-M4EDYAHw.mjs +99 -0
- package/dist/comments-M4EDYAHw.mjs.map +1 -0
- package/dist/components-CuIGwXMs.mjs +108 -0
- package/dist/components-CuIGwXMs.mjs.map +1 -0
- package/dist/config-52Ea5IWt.d.mts +39 -0
- package/dist/config-52Ea5IWt.d.mts.map +1 -0
- package/dist/config-CCz3xOLc.mjs +242 -0
- package/dist/config-CCz3xOLc.mjs.map +1 -0
- package/dist/config-D3d5Qudq.d.mts +6669 -0
- package/dist/config-D3d5Qudq.d.mts.map +1 -0
- package/dist/content-CbnufDsM.mjs +2018 -0
- package/dist/content-CbnufDsM.mjs.map +1 -0
- package/dist/content-list-query-D_7B1FE5.d.mts +26 -0
- package/dist/content-list-query-D_7B1FE5.d.mts.map +1 -0
- package/dist/content-policy-CYu6K1KB.mjs +46 -0
- package/dist/content-policy-CYu6K1KB.mjs.map +1 -0
- package/dist/content-repair-DlDUgFGp.mjs +442 -0
- package/dist/content-repair-DlDUgFGp.mjs.map +1 -0
- package/dist/context-CGQLA1-a.mjs +1922 -0
- package/dist/context-CGQLA1-a.mjs.map +1 -0
- package/dist/cron-c4D5C5Fx.mjs +284 -0
- package/dist/cron-c4D5C5Fx.mjs.map +1 -0
- package/dist/dashboard-CBq9kmOn.mjs +151 -0
- package/dist/dashboard-CBq9kmOn.mjs.map +1 -0
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +1 -1
- package/dist/db/libsql-migrations.d.mts +1 -1
- package/dist/db/libsql-migrations.mjs +4 -4
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres-migrations.d.mts +1 -1
- package/dist/db/postgres-migrations.mjs +4 -4
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite-migrations.d.mts +1 -1
- package/dist/db/sqlite-migrations.mjs +4 -4
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/db/sqlite.mjs +1 -1
- package/dist/default-DPsys51U.mjs +81 -0
- package/dist/default-DPsys51U.mjs.map +1 -0
- package/dist/deferred-tasks-CZ7rzBdo.d.mts +9 -0
- package/dist/deferred-tasks-CZ7rzBdo.d.mts.map +1 -0
- package/dist/dev-typegen-HRxwLRcT.mjs +29 -0
- package/dist/dev-typegen-HRxwLRcT.mjs.map +1 -0
- package/dist/device-flow-OcSqE9uY.mjs +521 -0
- package/dist/device-flow-OcSqE9uY.mjs.map +1 -0
- package/dist/digest-DVZ--cE9.mjs +194 -0
- package/dist/digest-DVZ--cE9.mjs.map +1 -0
- package/dist/direct-executor-DyjAqkpT.mjs +104 -0
- package/dist/direct-executor-DyjAqkpT.mjs.map +1 -0
- package/dist/dist-FPR93_xf.mjs +810 -0
- package/dist/dist-FPR93_xf.mjs.map +1 -0
- package/dist/email-console-DyQIgEnz.mjs +50 -0
- package/dist/email-console-DyQIgEnz.mjs.map +1 -0
- package/dist/email-locale-BYb16rVd.mjs +25 -0
- package/dist/email-locale-BYb16rVd.mjs.map +1 -0
- package/dist/emdash-runtime-CrzxJFmF.mjs +4214 -0
- package/dist/emdash-runtime-CrzxJFmF.mjs.map +1 -0
- package/dist/enrich-DBtCncE2.mjs +194 -0
- package/dist/enrich-DBtCncE2.mjs.map +1 -0
- package/dist/entry-lock-BN5y4YbO.d.mts +4481 -0
- package/dist/entry-lock-BN5y4YbO.d.mts.map +1 -0
- package/dist/entry-lock-BaRBHCsH.mjs +1173 -0
- package/dist/entry-lock-BaRBHCsH.mjs.map +1 -0
- package/dist/entry-lock-C6NcnZPV.mjs +163 -0
- package/dist/entry-lock-C6NcnZPV.mjs.map +1 -0
- package/dist/entry-locks-BTyQLdbC.mjs +167 -0
- package/dist/entry-locks-BTyQLdbC.mjs.map +1 -0
- package/dist/error-BfsNNrIE.mjs +90 -0
- package/dist/error-BfsNNrIE.mjs.map +1 -0
- package/dist/errors-BN1QAnEY.mjs +460 -0
- package/dist/errors-BN1QAnEY.mjs.map +1 -0
- package/dist/errors-Bt3goF8I.mjs +120 -0
- package/dist/errors-Bt3goF8I.mjs.map +1 -0
- package/dist/escape-BveidMa2.mjs +9 -0
- package/dist/escape-BveidMa2.mjs.map +1 -0
- package/dist/fence-Bb_IbCxI.mjs +162 -0
- package/dist/fence-Bb_IbCxI.mjs.map +1 -0
- package/dist/field-defs-cache-CsZctvbu.mjs +77 -0
- package/dist/field-defs-cache-CsZctvbu.mjs.map +1 -0
- package/dist/field-map-6m9rF49t.mjs +83 -0
- package/dist/field-map-6m9rF49t.mjs.map +1 -0
- package/dist/focal-point-CZ3d1wK5.mjs +23 -0
- package/dist/focal-point-CZ3d1wK5.mjs.map +1 -0
- package/dist/fts-manager-CCaZTp8y.mjs +443 -0
- package/dist/fts-manager-CCaZTp8y.mjs.map +1 -0
- package/dist/gc-xowRjczI.mjs +75 -0
- package/dist/gc-xowRjczI.mjs.map +1 -0
- package/dist/hash-COVK27Pc.mjs +37 -0
- package/dist/hash-COVK27Pc.mjs.map +1 -0
- package/dist/hook-result-CYSk0XFe.d.mts +31 -0
- package/dist/hook-result-CYSk0XFe.d.mts.map +1 -0
- package/dist/hreflang-CChPV7jx.mjs +105 -0
- package/dist/hreflang-CChPV7jx.mjs.map +1 -0
- package/dist/hreflang-DRslq3QI.d.mts +50 -0
- package/dist/hreflang-DRslq3QI.d.mts.map +1 -0
- package/dist/http-route-dispatch-CAdp2onn.mjs +339 -0
- package/dist/http-route-dispatch-CAdp2onn.mjs.map +1 -0
- package/dist/identity-NVTOOQyq.mjs +35 -0
- package/dist/identity-NVTOOQyq.mjs.map +1 -0
- package/dist/import-wpSO2N0x.mjs +2020 -0
- package/dist/import-wpSO2N0x.mjs.map +1 -0
- package/dist/index-CDs2wq4X.d.mts +623 -0
- package/dist/index-CDs2wq4X.d.mts.map +1 -0
- package/dist/index.d.mts +24 -24
- package/dist/index.mjs +103 -101
- package/dist/install-finalization-D9R9R-W8.mjs +58 -0
- package/dist/install-finalization-D9R9R-W8.mjs.map +1 -0
- package/dist/keys-Bck6LBfF.mjs +61 -0
- package/dist/keys-Bck6LBfF.mjs.map +1 -0
- package/dist/kinds-CYmRESWj.mjs +974 -0
- package/dist/kinds-CYmRESWj.mjs.map +1 -0
- package/dist/lifecycle-C815ZQfV.mjs +25 -0
- package/dist/lifecycle-C815ZQfV.mjs.map +1 -0
- package/dist/load-D99axixL.mjs +28 -0
- package/dist/load-D99axixL.mjs.map +1 -0
- package/dist/loader-CrRPfkHS.mjs +1197 -0
- package/dist/loader-CrRPfkHS.mjs.map +1 -0
- package/dist/loops-DMKlygqX.mjs +203 -0
- package/dist/loops-DMKlygqX.mjs.map +1 -0
- package/dist/manifest-builder-BQzCHNgB.mjs +189 -0
- package/dist/manifest-builder-BQzCHNgB.mjs.map +1 -0
- package/dist/manifest-schema-Ci2gmd0u.mjs +492 -0
- package/dist/manifest-schema-Ci2gmd0u.mjs.map +1 -0
- package/dist/media/image-endpoint.mjs +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +4 -4
- package/dist/media/local-runtime.d.mts +14 -14
- package/dist/media/local-runtime.mjs +6 -6
- package/dist/media-BUQePMxP.mjs +373 -0
- package/dist/media-BUQePMxP.mjs.map +1 -0
- package/dist/media-DH8ibNlY.mjs +294 -0
- package/dist/media-DH8ibNlY.mjs.map +1 -0
- package/dist/media-OEIQ3bVc.mjs +408 -0
- package/dist/media-OEIQ3bVc.mjs.map +1 -0
- package/dist/media-allowlist-pYtaBA95.mjs +44 -0
- package/dist/media-allowlist-pYtaBA95.mjs.map +1 -0
- package/dist/media-folders-Bf8_s4de.mjs +210 -0
- package/dist/media-folders-Bf8_s4de.mjs.map +1 -0
- package/dist/media-url-C6klEuNd.mjs +43 -0
- package/dist/media-url-C6klEuNd.mjs.map +1 -0
- package/dist/media-usage-D7Y64m6v.mjs +1629 -0
- package/dist/media-usage-D7Y64m6v.mjs.map +1 -0
- package/dist/media-usage-activation-DrqbmgLA.mjs +78 -0
- package/dist/media-usage-activation-DrqbmgLA.mjs.map +1 -0
- package/dist/media-usage-work-DommYhYA.mjs +152 -0
- package/dist/media-usage-work-DommYhYA.mjs.map +1 -0
- package/dist/media-usage-work-HU63hNDu.mjs +586 -0
- package/dist/media-usage-work-HU63hNDu.mjs.map +1 -0
- package/dist/menus-BQfusWEC.mjs +3608 -0
- package/dist/menus-BQfusWEC.mjs.map +1 -0
- package/dist/menus-BtwjQt5s.mjs +753 -0
- package/dist/menus-BtwjQt5s.mjs.map +1 -0
- package/dist/menus-p_M1V7J_.mjs +139 -0
- package/dist/menus-p_M1V7J_.mjs.map +1 -0
- package/dist/migrations/index.d.mts +1 -1
- package/dist/migrations/index.mjs +3 -3
- package/dist/mime-C94qBG-P.mjs +36 -0
- package/dist/mime-C94qBG-P.mjs.map +1 -0
- package/dist/mode-DpYW3w6U.mjs +23 -0
- package/dist/mode-DpYW3w6U.mjs.map +1 -0
- package/dist/node-sqlite-compat-pWFw0lcc.mjs +46 -0
- package/dist/node-sqlite-compat-pWFw0lcc.mjs.map +1 -0
- package/dist/normalize-DduyxBjf.mjs +191 -0
- package/dist/normalize-DduyxBjf.mjs.map +1 -0
- package/dist/oauth-authorization-DAXsH1H9.mjs +274 -0
- package/dist/oauth-authorization-DAXsH1H9.mjs.map +1 -0
- package/dist/oauth-clients-DENiDQri.mjs +266 -0
- package/dist/oauth-clients-DENiDQri.mjs.map +1 -0
- package/dist/oauth-state-store-y8mEYVq9.mjs +50 -0
- package/dist/oauth-state-store-y8mEYVq9.mjs.map +1 -0
- package/dist/oauth-user-lookup-CtTYAy-O.mjs +26 -0
- package/dist/oauth-user-lookup-CtTYAy-O.mjs.map +1 -0
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/options-BYa1FgIM.d.mts +81 -0
- package/dist/options-BYa1FgIM.d.mts.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/page/index.mjs +5 -5
- package/dist/parse-CORGGhHf.mjs +81 -0
- package/dist/parse-CORGGhHf.mjs.map +1 -0
- package/dist/parse-avNM1xWV.d.mts +168 -0
- package/dist/parse-avNM1xWV.d.mts.map +1 -0
- package/dist/passkey-config-Dih5YeIS.mjs +46 -0
- package/dist/passkey-config-Dih5YeIS.mjs.map +1 -0
- package/dist/paths-d51RFm8M.mjs +77 -0
- package/dist/paths-d51RFm8M.mjs.map +1 -0
- package/dist/patterns-CoqlXUvk.mjs +145 -0
- package/dist/patterns-CoqlXUvk.mjs.map +1 -0
- package/dist/placeholder-D2aksPMF.d.mts +306 -0
- package/dist/placeholder-D2aksPMF.d.mts.map +1 -0
- package/dist/plan-DqeZKuaR.mjs +135 -0
- package/dist/plan-DqeZKuaR.mjs.map +1 -0
- package/dist/plugin-test-runtime.d.mts +14 -14
- package/dist/plugin-test-runtime.mjs +110 -107
- package/dist/plugin-types.d.mts +2 -2
- package/dist/plugin-utils.d.mts +12 -12
- package/dist/plugins/adapt-sandbox-entry.d.mts +12 -12
- package/dist/plugins/adapt-sandbox-entry.mjs +3 -3
- package/dist/plugins/host.d.mts +5 -5
- package/dist/plugins/host.mjs +42 -41
- package/dist/plugins-Bb7oqjQA.mjs +277 -0
- package/dist/plugins-Bb7oqjQA.mjs.map +1 -0
- package/dist/policy-BcEqut3n.mjs +45 -0
- package/dist/policy-BcEqut3n.mjs.map +1 -0
- package/dist/portable-text-DXE8ymtD.mjs +307 -0
- package/dist/portable-text-DXE8ymtD.mjs.map +1 -0
- package/dist/preview-DEDWbwA_.mjs +107 -0
- package/dist/preview-DEDWbwA_.mjs.map +1 -0
- package/dist/protocol-BJbTzvwl.d.mts +61 -0
- package/dist/protocol-BJbTzvwl.d.mts.map +1 -0
- package/dist/public-submission-D9c9S14m.mjs +250 -0
- package/dist/public-submission-D9c9S14m.mjs.map +1 -0
- package/dist/public-url-CIRe-2T6.mjs +101 -0
- package/dist/public-url-CIRe-2T6.mjs.map +1 -0
- package/dist/query-BzifXlPS.mjs +1156 -0
- package/dist/query-BzifXlPS.mjs.map +1 -0
- package/dist/query-OzMJ6vJP.mjs +41 -0
- package/dist/query-OzMJ6vJP.mjs.map +1 -0
- package/dist/rate-limit-Csp60Vik.mjs +120 -0
- package/dist/rate-limit-Csp60Vik.mjs.map +1 -0
- package/dist/receipt-B-aU4hpJ.mjs +43 -0
- package/dist/receipt-B-aU4hpJ.mjs.map +1 -0
- package/dist/redirect-CDSw1sU3.mjs +17 -0
- package/dist/redirect-CDSw1sU3.mjs.map +1 -0
- package/dist/redirect-D1ArbO85.mjs +411 -0
- package/dist/redirect-D1ArbO85.mjs.map +1 -0
- package/dist/redirects-BjTwDTsV.mjs +148 -0
- package/dist/redirects-BjTwDTsV.mjs.map +1 -0
- package/dist/redirects-Ck50kH3n.mjs +446 -0
- package/dist/redirects-Ck50kH3n.mjs.map +1 -0
- package/dist/registry/testing.mjs +3 -3
- package/dist/registry-CFcNCayZ.mjs +6754 -0
- package/dist/registry-CFcNCayZ.mjs.map +1 -0
- package/dist/relations-Cfaa1fDl.mjs +776 -0
- package/dist/relations-Cfaa1fDl.mjs.map +1 -0
- package/dist/request-cache-iHRlHx1d.mjs +104 -0
- package/dist/request-cache-iHRlHx1d.mjs.map +1 -0
- package/dist/request-context.d.mts +1 -1
- package/dist/request-meta-D47mqyev.mjs +141 -0
- package/dist/request-meta-D47mqyev.mjs.map +1 -0
- package/dist/resolve-BPE8sMvx.mjs +99 -0
- package/dist/resolve-BPE8sMvx.mjs.map +1 -0
- package/dist/resolve-C0s1E_fH.mjs +199 -0
- package/dist/resolve-C0s1E_fH.mjs.map +1 -0
- package/dist/revision-j1p4-bOj.mjs +302 -0
- package/dist/revision-j1p4-bOj.mjs.map +1 -0
- package/dist/route-wire-C9PJV9aL.mjs +197 -0
- package/dist/route-wire-C9PJV9aL.mjs.map +1 -0
- package/dist/routes-lyYw0mMf.mjs +272 -0
- package/dist/routes-lyYw0mMf.mjs.map +1 -0
- package/dist/runner-B3eyB9Gb.mjs +6121 -0
- package/dist/runner-B3eyB9Gb.mjs.map +1 -0
- package/dist/runner-DoYH2Jcu.d.mts +68 -0
- package/dist/runner-DoYH2Jcu.d.mts.map +1 -0
- package/dist/runtime.d.mts +13 -13
- package/dist/runtime.mjs +3 -3
- package/dist/schema-BAayK46S.mjs +13 -0
- package/dist/schema-BAayK46S.mjs.map +1 -0
- package/dist/schema-Gqcl-8G4.mjs +815 -0
- package/dist/schema-Gqcl-8G4.mjs.map +1 -0
- package/dist/scopes-BqPOKoKf.mjs +34 -0
- package/dist/scopes-BqPOKoKf.mjs.map +1 -0
- package/dist/search-YJKPIEV6.mjs +448 -0
- package/dist/search-YJKPIEV6.mjs.map +1 -0
- package/dist/sections-BR_e-wK5.mjs +346 -0
- package/dist/sections-BR_e-wK5.mjs.map +1 -0
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +37 -31
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.mjs +22 -21
- package/dist/seo/index.mjs.map +1 -1
- package/dist/seo-Dsj8hy3j.mjs +114 -0
- package/dist/seo-Dsj8hy3j.mjs.map +1 -0
- package/dist/seo-XvH4LNNp.mjs +133 -0
- package/dist/seo-XvH4LNNp.mjs.map +1 -0
- package/dist/service-BsVG05gS.mjs +150 -0
- package/dist/service-BsVG05gS.mjs.map +1 -0
- package/dist/session-user-DgKbYrlj.mjs +51 -0
- package/dist/session-user-DgKbYrlj.mjs.map +1 -0
- package/dist/settings-CNPUntkh.mjs +51 -0
- package/dist/settings-CNPUntkh.mjs.map +1 -0
- package/dist/settings-D5EHi0Tk.mjs +439 -0
- package/dist/settings-D5EHi0Tk.mjs.map +1 -0
- package/dist/settings-DSfE7wOa.mjs +61 -0
- package/dist/settings-DSfE7wOa.mjs.map +1 -0
- package/dist/setup-complete-B8W8sJ9v.mjs +26 -0
- package/dist/setup-complete-B8W8sJ9v.mjs.map +1 -0
- package/dist/setup-nonce-DnSBP260.mjs +25 -0
- package/dist/setup-nonce-DnSBP260.mjs.map +1 -0
- package/dist/site-settings-NGzdrt7O.mjs +50 -0
- package/dist/site-settings-NGzdrt7O.mjs.map +1 -0
- package/dist/site-url-D6JB7tLW.mjs +16 -0
- package/dist/site-url-D6JB7tLW.mjs.map +1 -0
- package/dist/snapshot-CdcwwWAf.mjs +414 -0
- package/dist/snapshot-CdcwwWAf.mjs.map +1 -0
- package/dist/ssrf-Dv0_tRpo.mjs +406 -0
- package/dist/ssrf-Dv0_tRpo.mjs.map +1 -0
- package/dist/stage-CUjhED3P.mjs +662 -0
- package/dist/stage-CUjhED3P.mjs.map +1 -0
- package/dist/staged-C36IWXff.mjs +659 -0
- package/dist/staged-C36IWXff.mjs.map +1 -0
- package/dist/state-CKouMCSY.mjs +153 -0
- package/dist/state-CKouMCSY.mjs.map +1 -0
- package/dist/status-lzyj4Uu7.mjs +30 -0
- package/dist/status-lzyj4Uu7.mjs.map +1 -0
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +1 -1
- package/dist/storage-query-B-cWcTjJ.d.mts +1594 -0
- package/dist/storage-query-B-cWcTjJ.d.mts.map +1 -0
- package/dist/tar-DsTXX6ch.mjs +449 -0
- package/dist/tar-DsTXX6ch.mjs.map +1 -0
- package/dist/target-DLQCwp_Z.mjs +27 -0
- package/dist/target-DLQCwp_Z.mjs.map +1 -0
- package/dist/taxonomies-BlAjr4BL.mjs +697 -0
- package/dist/taxonomies-BlAjr4BL.mjs.map +1 -0
- package/dist/taxonomies-Byyo7LOZ.mjs +939 -0
- package/dist/taxonomies-Byyo7LOZ.mjs.map +1 -0
- package/dist/taxonomy-CKDwM61Y.mjs +525 -0
- package/dist/taxonomy-CKDwM61Y.mjs.map +1 -0
- package/dist/tokens-BojXlk49.mjs +171 -0
- package/dist/tokens-BojXlk49.mjs.map +1 -0
- package/dist/transaction-DLPQWik1.mjs +29 -0
- package/dist/transaction-DLPQWik1.mjs.map +1 -0
- package/dist/transfer-XSTh2BCr.mjs +8706 -0
- package/dist/transfer-XSTh2BCr.mjs.map +1 -0
- package/dist/transfer-download-DkoCDA9d.mjs +33 -0
- package/dist/transfer-download-DkoCDA9d.mjs.map +1 -0
- package/dist/transfer-iQ26J-RT.mjs +166 -0
- package/dist/transfer-iQ26J-RT.mjs.map +1 -0
- package/dist/transformations-C7RQabKQ.mjs +196 -0
- package/dist/transformations-C7RQabKQ.mjs.map +1 -0
- package/dist/transport-D3RulfD6.mjs +136 -0
- package/dist/transport-D3RulfD6.mjs.map +1 -0
- package/dist/transport-DhlZlf4D.d.mts +42 -0
- package/dist/transport-DhlZlf4D.d.mts.map +1 -0
- package/dist/trusted-proxy-B6ECOZJc.mjs +51 -0
- package/dist/trusted-proxy-B6ECOZJc.mjs.map +1 -0
- package/dist/turnstile-lqUiY7lP.mjs +53 -0
- package/dist/turnstile-lqUiY7lP.mjs.map +1 -0
- package/dist/types-4Dn9bZhu.mjs +77 -0
- package/dist/types-4Dn9bZhu.mjs.map +1 -0
- package/dist/types-5LSo7PPx.d.mts +85 -0
- package/dist/types-5LSo7PPx.d.mts.map +1 -0
- package/dist/types-BQ3hwYJT.d.mts +896 -0
- package/dist/types-BQ3hwYJT.d.mts.map +1 -0
- package/dist/types-BYEk7qo3.d.mts +198 -0
- package/dist/types-BYEk7qo3.d.mts.map +1 -0
- package/dist/types-CJKsWVFR.mjs +199 -0
- package/dist/types-CJKsWVFR.mjs.map +1 -0
- package/dist/types-Ca_w8mmY.d.mts +363 -0
- package/dist/types-Ca_w8mmY.d.mts.map +1 -0
- package/dist/types-CkE41ZAG.mjs +18 -0
- package/dist/types-CkE41ZAG.mjs.map +1 -0
- package/dist/types-D0aJW2uR.d.mts +1641 -0
- package/dist/types-D0aJW2uR.d.mts.map +1 -0
- package/dist/types-DbpN4Qto.d.mts +372 -0
- package/dist/types-DbpN4Qto.d.mts.map +1 -0
- package/dist/types-ILDI1sdY.mjs +16 -0
- package/dist/types-ILDI1sdY.mjs.map +1 -0
- package/dist/types-OC5c-edM.mjs +22 -0
- package/dist/types-OC5c-edM.mjs.map +1 -0
- package/dist/types-aOOxRSx6.mjs +103 -0
- package/dist/types-aOOxRSx6.mjs.map +1 -0
- package/dist/types-m1WbUffD.d.mts +198 -0
- package/dist/types-m1WbUffD.d.mts.map +1 -0
- package/dist/types-uxLoPBio.d.mts +124 -0
- package/dist/types-uxLoPBio.d.mts.map +1 -0
- package/dist/types-we5uR-tV.d.mts +287 -0
- package/dist/types-we5uR-tV.d.mts.map +1 -0
- package/dist/upload-attempts-DduMy6B0.mjs +32 -0
- package/dist/upload-attempts-DduMy6B0.mjs.map +1 -0
- package/dist/url-pattern-B3EwxAAk.mjs +33 -0
- package/dist/url-pattern-B3EwxAAk.mjs.map +1 -0
- package/dist/user-ElwQjTQT.mjs +171 -0
- package/dist/user-ElwQjTQT.mjs.map +1 -0
- package/dist/utils-BlAXmfOG.mjs +439 -0
- package/dist/utils-BlAXmfOG.mjs.map +1 -0
- package/dist/validate-CH0X5b2c.d.mts +468 -0
- package/dist/validate-CH0X5b2c.d.mts.map +1 -0
- package/dist/validate-CfgRpcjA.mjs +492 -0
- package/dist/validate-CfgRpcjA.mjs.map +1 -0
- package/dist/validation-DvYJtv4k.mjs +218 -0
- package/dist/validation-DvYJtv4k.mjs.map +1 -0
- package/dist/version-DgYjhTud.mjs +9 -0
- package/dist/version-DgYjhTud.mjs.map +1 -0
- package/dist/version-Dq71scUb.mjs +7 -0
- package/dist/version-Dq71scUb.mjs.map +1 -0
- package/dist/widgets-ChFIj0be.mjs +126 -0
- package/dist/widgets-ChFIj0be.mjs.map +1 -0
- package/dist/wxr-taxonomies-CBZMp2YX.mjs +372 -0
- package/dist/wxr-taxonomies-CBZMp2YX.mjs.map +1 -0
- package/dist/wxr-taxonomies-DlKDpWN1.d.mts +34 -0
- package/dist/wxr-taxonomies-DlKDpWN1.d.mts.map +1 -0
- package/dist/zod-generator-DmTKI-Ig.mjs +426 -0
- package/dist/zod-generator-DmTKI-Ig.mjs.map +1 -0
- package/package.json +7 -6
- package/src/api/handlers/content.ts +593 -16
- package/src/api/handlers/device-flow.ts +74 -21
- package/src/api/handlers/index.ts +1 -0
- package/src/api/handlers/manifest.ts +79 -5
- package/src/api/handlers/media-upload.ts +17 -71
- package/src/api/handlers/media.ts +97 -3
- package/src/api/handlers/relations.ts +638 -157
- package/src/api/handlers/revision.ts +30 -0
- package/src/api/handlers/schema.ts +403 -1
- package/src/api/handlers/snapshot.ts +257 -3
- package/src/api/handlers/staged-references.ts +142 -0
- package/src/api/handlers/validate-references.ts +146 -0
- package/src/api/schemas/content.ts +13 -0
- package/src/api/schemas/relations.ts +54 -44
- package/src/api/schemas/schema.ts +14 -0
- package/src/astro/integration/routes.ts +15 -19
- package/src/astro/integration/vite-config.ts +10 -4
- package/src/astro/middleware.ts +1 -0
- package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/children.ts +11 -54
- package/src/astro/routes/api/content/[collection]/[id].ts +3 -1
- package/src/astro/routes/api/oauth/device/authorize.ts +33 -4
- package/src/astro/routes/api/relations/index.ts +4 -4
- package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +6 -2
- package/src/astro/routes/api/setup/index.ts +66 -23
- package/src/astro/routes/api/snapshot.ts +2 -1
- package/src/astro/types.ts +10 -0
- package/src/cleanup.ts +10 -0
- package/src/cli/commands/export-seed.ts +510 -89
- package/src/components/Columns.astro +3 -1
- package/src/components/Cover.astro +3 -1
- package/src/components/WidgetArea.astro +3 -2
- package/src/database/migrations/086_relations_structural.ts +197 -0
- package/src/database/migrations/087_reference_field_relations.ts +407 -0
- package/src/database/migrations/runner.ts +4 -0
- package/src/database/reference-backfill.ts +141 -0
- package/src/database/repositories/content.ts +43 -8
- package/src/database/repositories/media.ts +40 -1
- package/src/database/repositories/redirect.ts +17 -34
- package/src/database/repositories/relation.ts +620 -208
- package/src/database/repositories/revision.ts +16 -0
- package/src/database/repositories/types.ts +38 -0
- package/src/database/transaction.ts +12 -1
- package/src/database/types.ts +14 -5
- package/src/emdash-runtime.ts +114 -11
- package/src/index.ts +11 -0
- package/src/loader.ts +169 -22
- package/src/mcp/server.ts +13 -48
- package/src/query.ts +455 -25
- package/src/references/field-map.ts +115 -0
- package/src/references/resolve.ts +160 -0
- package/src/references/staged.ts +117 -0
- package/src/references/types.ts +16 -0
- package/src/registry/artifact-fetch.ts +45 -271
- package/src/schema/registry.ts +99 -24
- package/src/schema/types.ts +58 -0
- package/src/schema/zod-generator.ts +67 -1
- package/src/seed/apply.ts +841 -103
- package/src/seed/types.ts +36 -2
- package/src/seed/validate.ts +78 -2
- package/src/transfer/analyze/unique-keys.ts +3 -12
- package/src/transfer/analyze/validate.ts +65 -39
- package/src/transfer/analyze/values.ts +12 -1
- package/src/transfer/export/readers.ts +12 -8
- package/src/transfer/format/columns.ts +26 -6
- package/src/transfer/format/kinds.ts +21 -5
- package/src/transfer/import/context.ts +8 -1
- package/src/transfer/ops/package-index.ts +1 -1
- package/dist/action-token-DYwe4Pk0.mjs +0 -26
- package/dist/action-token-DYwe4Pk0.mjs.map +0 -1
- package/dist/activation-LOkDM5WT.mjs +0 -382
- package/dist/activation-LOkDM5WT.mjs.map +0 -1
- package/dist/adapters-B64LbYcB.d.mts +0 -171
- package/dist/adapters-B64LbYcB.d.mts.map +0 -1
- package/dist/allowed-origins-CHB8oZNM.mjs +0 -116
- package/dist/allowed-origins-CHB8oZNM.mjs.map +0 -1
- package/dist/api-cFFZpyS0.mjs +0 -4718
- package/dist/api-cFFZpyS0.mjs.map +0 -1
- package/dist/api-tokens-s4i4aUp_.mjs +0 -166
- package/dist/api-tokens-s4i4aUp_.mjs.map +0 -1
- package/dist/apply-CoT603H3.mjs +0 -1163
- package/dist/apply-CoT603H3.mjs.map +0 -1
- package/dist/approvals-CqMfNxak.mjs +0 -460
- package/dist/approvals-CqMfNxak.mjs.map +0 -1
- package/dist/artifact-fetch-DZMOGZ3-.mjs +0 -818
- package/dist/artifact-fetch-DZMOGZ3-.mjs.map +0 -1
- package/dist/astro/routes/api/relations/_id_/translations.d.mts +0 -8
- package/dist/astro/routes/api/relations/_id_/translations.d.mts.map +0 -1
- package/dist/astro/routes/api/relations/_id_/translations.mjs +0 -47
- package/dist/astro/routes/api/relations/_id_/translations.mjs.map +0 -1
- package/dist/audit-RfCugiSB.mjs +0 -127
- package/dist/audit-RfCugiSB.mjs.map +0 -1
- package/dist/authoritative-records-CoJvBXAD.mjs +0 -5172
- package/dist/authoritative-records-CoJvBXAD.mjs.map +0 -1
- package/dist/authorize-seCifOMJ.mjs +0 -49
- package/dist/authorize-seCifOMJ.mjs.map +0 -1
- package/dist/backup-CBu0LrXf.mjs +0 -246
- package/dist/backup-CBu0LrXf.mjs.map +0 -1
- package/dist/block-type-registry-DUI_3KxT.mjs +0 -6709
- package/dist/block-type-registry-DUI_3KxT.mjs.map +0 -1
- package/dist/block-types-BmZmLmAD.mjs +0 -132
- package/dist/block-types-BmZmLmAD.mjs.map +0 -1
- package/dist/block-values-C_VIPr5t.mjs +0 -175
- package/dist/block-values-C_VIPr5t.mjs.map +0 -1
- package/dist/byline-DYmkXqvo.mjs +0 -909
- package/dist/byline-DYmkXqvo.mjs.map +0 -1
- package/dist/byline-fields-D28AT-Fh.mjs +0 -123
- package/dist/byline-fields-D28AT-Fh.mjs.map +0 -1
- package/dist/byline-registry-gnKscbQX.mjs +0 -406
- package/dist/byline-registry-gnKscbQX.mjs.map +0 -1
- package/dist/bylines-BPwJqoYH.mjs +0 -232
- package/dist/bylines-BPwJqoYH.mjs.map +0 -1
- package/dist/bylines-ukLaYpVZ.mjs +0 -214
- package/dist/bylines-ukLaYpVZ.mjs.map +0 -1
- package/dist/cache-m7UEkRFV.mjs +0 -108
- package/dist/cache-m7UEkRFV.mjs.map +0 -1
- package/dist/canonical-YhEQezjg.mjs +0 -174
- package/dist/canonical-YhEQezjg.mjs.map +0 -1
- package/dist/capture-triggers-kJyl_yyM.mjs +0 -362
- package/dist/capture-triggers-kJyl_yyM.mjs.map +0 -1
- package/dist/challenge-store-ppU6Uv13.mjs +0 -51
- package/dist/challenge-store-ppU6Uv13.mjs.map +0 -1
- package/dist/checksum-B2IINIlN.mjs +0 -162
- package/dist/checksum-B2IINIlN.mjs.map +0 -1
- package/dist/chrome-tags-DApCQSIk.mjs +0 -24
- package/dist/chrome-tags-DApCQSIk.mjs.map +0 -1
- package/dist/chunks-Dms7Uxbt.mjs +0 -25
- package/dist/chunks-Dms7Uxbt.mjs.map +0 -1
- package/dist/collection-deletion-BIm28mo3.mjs +0 -436
- package/dist/collection-deletion-BIm28mo3.mjs.map +0 -1
- package/dist/collection-deletion-processor-Br6rxs3u.mjs +0 -217
- package/dist/collection-deletion-processor-Br6rxs3u.mjs.map +0 -1
- package/dist/collection-slugs-cache-CjGk__zp.mjs +0 -85
- package/dist/collection-slugs-cache-CjGk__zp.mjs.map +0 -1
- package/dist/comment-CrBl22OF.mjs +0 -313
- package/dist/comment-CrBl22OF.mjs.map +0 -1
- package/dist/comment-reaction-JEQ2Fpd8.mjs +0 -85
- package/dist/comment-reaction-JEQ2Fpd8.mjs.map +0 -1
- package/dist/comments-2ah9du9y.mjs +0 -195
- package/dist/comments-2ah9du9y.mjs.map +0 -1
- package/dist/comments-fHZ8ON9O.mjs +0 -99
- package/dist/comments-fHZ8ON9O.mjs.map +0 -1
- package/dist/components-CXbq7CSM.mjs +0 -108
- package/dist/components-CXbq7CSM.mjs.map +0 -1
- package/dist/config-5ii2haYu.d.mts +0 -6528
- package/dist/config-5ii2haYu.d.mts.map +0 -1
- package/dist/config-IhybvkIQ.mjs +0 -242
- package/dist/config-IhybvkIQ.mjs.map +0 -1
- package/dist/config-Py43JK9r.d.mts +0 -39
- package/dist/config-Py43JK9r.d.mts.map +0 -1
- package/dist/content-DFaIEDj9.mjs +0 -2281
- package/dist/content-DFaIEDj9.mjs.map +0 -1
- package/dist/content-list-query-Dra4Dalc.d.mts +0 -26
- package/dist/content-list-query-Dra4Dalc.d.mts.map +0 -1
- package/dist/content-policy-DFNw91-d.mjs +0 -46
- package/dist/content-policy-DFNw91-d.mjs.map +0 -1
- package/dist/content-repair-Q8IUrpLL.mjs +0 -442
- package/dist/content-repair-Q8IUrpLL.mjs.map +0 -1
- package/dist/context-BeGccdUX.mjs +0 -1921
- package/dist/context-BeGccdUX.mjs.map +0 -1
- package/dist/cron-7DCJwPXq.mjs +0 -284
- package/dist/cron-7DCJwPXq.mjs.map +0 -1
- package/dist/dashboard-DjrB-xxZ.mjs +0 -151
- package/dist/dashboard-DjrB-xxZ.mjs.map +0 -1
- package/dist/default-DQ6vsviu.mjs +0 -81
- package/dist/default-DQ6vsviu.mjs.map +0 -1
- package/dist/deferred-tasks-BPxXUB4x.d.mts +0 -9
- package/dist/deferred-tasks-BPxXUB4x.d.mts.map +0 -1
- package/dist/dev-typegen-CZaPLl3V.mjs +0 -29
- package/dist/dev-typegen-CZaPLl3V.mjs.map +0 -1
- package/dist/device-flow-CRd6DXmW.mjs +0 -466
- package/dist/device-flow-CRd6DXmW.mjs.map +0 -1
- package/dist/digest-BarSh-pN.mjs +0 -194
- package/dist/digest-BarSh-pN.mjs.map +0 -1
- package/dist/direct-executor-BmuFJJZV.mjs +0 -104
- package/dist/direct-executor-BmuFJJZV.mjs.map +0 -1
- package/dist/dist-BNwANFJR.mjs +0 -810
- package/dist/dist-BNwANFJR.mjs.map +0 -1
- package/dist/email-console-bJn3ctqA.mjs +0 -50
- package/dist/email-console-bJn3ctqA.mjs.map +0 -1
- package/dist/email-locale-CN6WAMx0.mjs +0 -25
- package/dist/email-locale-CN6WAMx0.mjs.map +0 -1
- package/dist/emdash-runtime-DAjghyEG.mjs +0 -4186
- package/dist/emdash-runtime-DAjghyEG.mjs.map +0 -1
- package/dist/enrich-Dl3kZ-lP.mjs +0 -194
- package/dist/enrich-Dl3kZ-lP.mjs.map +0 -1
- package/dist/entry-lock-BJYdBfXb.mjs +0 -1097
- package/dist/entry-lock-BJYdBfXb.mjs.map +0 -1
- package/dist/entry-lock-DHQOxN7R.mjs +0 -163
- package/dist/entry-lock-DHQOxN7R.mjs.map +0 -1
- package/dist/entry-lock-DVhCt49A.d.mts +0 -4368
- package/dist/entry-lock-DVhCt49A.d.mts.map +0 -1
- package/dist/entry-locks-D0foLdjQ.mjs +0 -167
- package/dist/entry-locks-D0foLdjQ.mjs.map +0 -1
- package/dist/error-CfvOHP0M.mjs +0 -90
- package/dist/error-CfvOHP0M.mjs.map +0 -1
- package/dist/errors-BF0_LFhW.mjs +0 -460
- package/dist/errors-BF0_LFhW.mjs.map +0 -1
- package/dist/errors-DgE1zJGG.mjs +0 -120
- package/dist/errors-DgE1zJGG.mjs.map +0 -1
- package/dist/escape-CuaZhZvL.mjs +0 -9
- package/dist/escape-CuaZhZvL.mjs.map +0 -1
- package/dist/fence-CMDXJYc_.mjs +0 -162
- package/dist/fence-CMDXJYc_.mjs.map +0 -1
- package/dist/field-defs-cache-HIgBbqZZ.mjs +0 -77
- package/dist/field-defs-cache-HIgBbqZZ.mjs.map +0 -1
- package/dist/focal-point-Gr34o-4o.mjs +0 -23
- package/dist/focal-point-Gr34o-4o.mjs.map +0 -1
- package/dist/fts-manager-S-K0laoS.mjs +0 -443
- package/dist/fts-manager-S-K0laoS.mjs.map +0 -1
- package/dist/gc-DjKY0Ay1.mjs +0 -75
- package/dist/gc-DjKY0Ay1.mjs.map +0 -1
- package/dist/hash-SDAW6zC-.mjs +0 -37
- package/dist/hash-SDAW6zC-.mjs.map +0 -1
- package/dist/hook-result-B5bXDgS2.d.mts +0 -31
- package/dist/hook-result-B5bXDgS2.d.mts.map +0 -1
- package/dist/hreflang-D5uNnsGJ.d.mts +0 -50
- package/dist/hreflang-D5uNnsGJ.d.mts.map +0 -1
- package/dist/hreflang-DMFBL2eb.mjs +0 -105
- package/dist/hreflang-DMFBL2eb.mjs.map +0 -1
- package/dist/http-route-dispatch-BitqzwMy.mjs +0 -339
- package/dist/http-route-dispatch-BitqzwMy.mjs.map +0 -1
- package/dist/identity-IyNWwXr6.mjs +0 -35
- package/dist/identity-IyNWwXr6.mjs.map +0 -1
- package/dist/import-C3JZplWq.mjs +0 -2020
- package/dist/import-C3JZplWq.mjs.map +0 -1
- package/dist/index-D-hdtLe8.d.mts +0 -623
- package/dist/index-D-hdtLe8.d.mts.map +0 -1
- package/dist/install-finalization-DfM1fj5x.mjs +0 -58
- package/dist/install-finalization-DfM1fj5x.mjs.map +0 -1
- package/dist/keys-yxLm5l35.mjs +0 -61
- package/dist/keys-yxLm5l35.mjs.map +0 -1
- package/dist/kinds-CRu_T5T5.mjs +0 -961
- package/dist/kinds-CRu_T5T5.mjs.map +0 -1
- package/dist/lifecycle-BzeGPeQ-.mjs +0 -25
- package/dist/lifecycle-BzeGPeQ-.mjs.map +0 -1
- package/dist/load-XgJiE6_3.mjs +0 -28
- package/dist/load-XgJiE6_3.mjs.map +0 -1
- package/dist/loader-BzqeR1ZN.mjs +0 -1086
- package/dist/loader-BzqeR1ZN.mjs.map +0 -1
- package/dist/loops-BQSzv5Zn.mjs +0 -203
- package/dist/loops-BQSzv5Zn.mjs.map +0 -1
- package/dist/manifest-builder-B8zR-73J.mjs +0 -189
- package/dist/manifest-builder-B8zR-73J.mjs.map +0 -1
- package/dist/manifest-schema-CY3zng_M.mjs +0 -492
- package/dist/manifest-schema-CY3zng_M.mjs.map +0 -1
- package/dist/media-Pu1L6xir.mjs +0 -408
- package/dist/media-Pu1L6xir.mjs.map +0 -1
- package/dist/media-Qp5S3eH3.mjs +0 -355
- package/dist/media-Qp5S3eH3.mjs.map +0 -1
- package/dist/media-allowlist-BSoa9Vvm.mjs +0 -44
- package/dist/media-allowlist-BSoa9Vvm.mjs.map +0 -1
- package/dist/media-folders-BE0oo2eX.mjs +0 -210
- package/dist/media-folders-BE0oo2eX.mjs.map +0 -1
- package/dist/media-h7tOiDLj.mjs +0 -221
- package/dist/media-h7tOiDLj.mjs.map +0 -1
- package/dist/media-url-jArBpzIG.mjs +0 -43
- package/dist/media-url-jArBpzIG.mjs.map +0 -1
- package/dist/media-usage-My-Vi-ex.mjs +0 -1629
- package/dist/media-usage-My-Vi-ex.mjs.map +0 -1
- package/dist/media-usage-activation-HKp7zk7W.mjs +0 -78
- package/dist/media-usage-activation-HKp7zk7W.mjs.map +0 -1
- package/dist/media-usage-work-C2OZLCAd.mjs +0 -586
- package/dist/media-usage-work-C2OZLCAd.mjs.map +0 -1
- package/dist/media-usage-work-DwUNbgvS.mjs +0 -152
- package/dist/media-usage-work-DwUNbgvS.mjs.map +0 -1
- package/dist/menus-BM7BPLOb.mjs +0 -139
- package/dist/menus-BM7BPLOb.mjs.map +0 -1
- package/dist/menus-ITeAbcIF.mjs +0 -753
- package/dist/menus-ITeAbcIF.mjs.map +0 -1
- package/dist/menus-TsSGmSR4.mjs +0 -3608
- package/dist/menus-TsSGmSR4.mjs.map +0 -1
- package/dist/mime-ChLqYwDk.mjs +0 -36
- package/dist/mime-ChLqYwDk.mjs.map +0 -1
- package/dist/mode-CCuKXUci.mjs +0 -23
- package/dist/mode-CCuKXUci.mjs.map +0 -1
- package/dist/node-sqlite-compat-CONMsl-x.mjs +0 -46
- package/dist/node-sqlite-compat-CONMsl-x.mjs.map +0 -1
- package/dist/normalize-CO2P8-iE.mjs +0 -191
- package/dist/normalize-CO2P8-iE.mjs.map +0 -1
- package/dist/oauth-authorization-DlMIL5_h.mjs +0 -274
- package/dist/oauth-authorization-DlMIL5_h.mjs.map +0 -1
- package/dist/oauth-clients-Djq9r_KP.mjs +0 -266
- package/dist/oauth-clients-Djq9r_KP.mjs.map +0 -1
- package/dist/oauth-state-store-BbjnZXNC.mjs +0 -50
- package/dist/oauth-state-store-BbjnZXNC.mjs.map +0 -1
- package/dist/oauth-user-lookup-vue9a64A.mjs +0 -26
- package/dist/oauth-user-lookup-vue9a64A.mjs.map +0 -1
- package/dist/options-SQCHQCPH.d.mts +0 -81
- package/dist/options-SQCHQCPH.d.mts.map +0 -1
- package/dist/parse-CVgO-Qai.d.mts +0 -168
- package/dist/parse-CVgO-Qai.d.mts.map +0 -1
- package/dist/parse-DY6OD1j_.mjs +0 -81
- package/dist/parse-DY6OD1j_.mjs.map +0 -1
- package/dist/passkey-config-X_H8128a.mjs +0 -46
- package/dist/passkey-config-X_H8128a.mjs.map +0 -1
- package/dist/paths-JxokKIbr.mjs +0 -77
- package/dist/paths-JxokKIbr.mjs.map +0 -1
- package/dist/patterns-BhAvqO0S.mjs +0 -145
- package/dist/patterns-BhAvqO0S.mjs.map +0 -1
- package/dist/placeholder-MSEd8gty.d.mts +0 -306
- package/dist/placeholder-MSEd8gty.d.mts.map +0 -1
- package/dist/plan-xjcWrAah.mjs +0 -135
- package/dist/plan-xjcWrAah.mjs.map +0 -1
- package/dist/plugins-DUXUt8B9.mjs +0 -277
- package/dist/plugins-DUXUt8B9.mjs.map +0 -1
- package/dist/policy-CUvwAARc.mjs +0 -45
- package/dist/policy-CUvwAARc.mjs.map +0 -1
- package/dist/portable-text-5O_ZGUjB.mjs +0 -307
- package/dist/portable-text-5O_ZGUjB.mjs.map +0 -1
- package/dist/preview-CIUcPYr6.mjs +0 -107
- package/dist/preview-CIUcPYr6.mjs.map +0 -1
- package/dist/protocol-B97DZaFr.d.mts +0 -61
- package/dist/protocol-B97DZaFr.d.mts.map +0 -1
- package/dist/public-submission-BFBUrqst.mjs +0 -250
- package/dist/public-submission-BFBUrqst.mjs.map +0 -1
- package/dist/public-url-Bn7U0D7-.mjs +0 -101
- package/dist/public-url-Bn7U0D7-.mjs.map +0 -1
- package/dist/query-B48peoRT.mjs +0 -890
- package/dist/query-B48peoRT.mjs.map +0 -1
- package/dist/query-C4IH0uhR.mjs +0 -41
- package/dist/query-C4IH0uhR.mjs.map +0 -1
- package/dist/rate-limit-BZ6nybgc.mjs +0 -120
- package/dist/rate-limit-BZ6nybgc.mjs.map +0 -1
- package/dist/receipt-B4wJj5Jq.mjs +0 -43
- package/dist/receipt-B4wJj5Jq.mjs.map +0 -1
- package/dist/redirect-Cd1E7VUt.mjs +0 -17
- package/dist/redirect-Cd1E7VUt.mjs.map +0 -1
- package/dist/redirect-iJf5fltD.mjs +0 -415
- package/dist/redirect-iJf5fltD.mjs.map +0 -1
- package/dist/redirects-CYu1u1aK.mjs +0 -446
- package/dist/redirects-CYu1u1aK.mjs.map +0 -1
- package/dist/redirects-Cv9apQKj.mjs +0 -148
- package/dist/redirects-Cv9apQKj.mjs.map +0 -1
- package/dist/relation-M4NUCb0b.mjs +0 -334
- package/dist/relation-M4NUCb0b.mjs.map +0 -1
- package/dist/relations-CCif47Oq.mjs +0 -403
- package/dist/relations-CCif47Oq.mjs.map +0 -1
- package/dist/relations-CK9CYUyr.mjs +0 -310
- package/dist/relations-CK9CYUyr.mjs.map +0 -1
- package/dist/request-cache-DzLYKm_x.mjs +0 -104
- package/dist/request-cache-DzLYKm_x.mjs.map +0 -1
- package/dist/request-meta-sZXt3sRo.mjs +0 -141
- package/dist/request-meta-sZXt3sRo.mjs.map +0 -1
- package/dist/resolve-2WbQsCvT.mjs +0 -199
- package/dist/resolve-2WbQsCvT.mjs.map +0 -1
- package/dist/route-wire--1hLuACz.mjs +0 -197
- package/dist/route-wire--1hLuACz.mjs.map +0 -1
- package/dist/routes-CUsM40Cc.mjs +0 -272
- package/dist/routes-CUsM40Cc.mjs.map +0 -1
- package/dist/runner-1y4J9fJB.mjs +0 -5742
- package/dist/runner-1y4J9fJB.mjs.map +0 -1
- package/dist/runner-D5_LzKXI.d.mts +0 -68
- package/dist/runner-D5_LzKXI.d.mts.map +0 -1
- package/dist/schema-BABiRdsH.mjs +0 -13
- package/dist/schema-BABiRdsH.mjs.map +0 -1
- package/dist/schema-Du3MzCG0.mjs +0 -446
- package/dist/schema-Du3MzCG0.mjs.map +0 -1
- package/dist/scopes-Dbk-ElhT.mjs +0 -34
- package/dist/scopes-Dbk-ElhT.mjs.map +0 -1
- package/dist/search-Bt1PL1jf.mjs +0 -448
- package/dist/search-Bt1PL1jf.mjs.map +0 -1
- package/dist/sections-Ddptx_o9.mjs +0 -346
- package/dist/sections-Ddptx_o9.mjs.map +0 -1
- package/dist/seo-CZT2oLtT.mjs +0 -114
- package/dist/seo-CZT2oLtT.mjs.map +0 -1
- package/dist/seo-D5w3-Azy.mjs +0 -133
- package/dist/seo-D5w3-Azy.mjs.map +0 -1
- package/dist/service-DuykXPyW.mjs +0 -150
- package/dist/service-DuykXPyW.mjs.map +0 -1
- package/dist/session-user-BhaVp8w0.mjs +0 -51
- package/dist/session-user-BhaVp8w0.mjs.map +0 -1
- package/dist/settings-2xNYr90o.mjs +0 -51
- package/dist/settings-2xNYr90o.mjs.map +0 -1
- package/dist/settings-CgjRWGW9.mjs +0 -439
- package/dist/settings-CgjRWGW9.mjs.map +0 -1
- package/dist/settings-DYidIB26.mjs +0 -61
- package/dist/settings-DYidIB26.mjs.map +0 -1
- package/dist/setup-complete-bOogcHWG.mjs +0 -26
- package/dist/setup-complete-bOogcHWG.mjs.map +0 -1
- package/dist/setup-nonce-0EGuKM4s.mjs +0 -25
- package/dist/setup-nonce-0EGuKM4s.mjs.map +0 -1
- package/dist/site-settings-DOgRUoFX.mjs +0 -50
- package/dist/site-settings-DOgRUoFX.mjs.map +0 -1
- package/dist/site-url-BU_bbxwj.mjs +0 -16
- package/dist/site-url-BU_bbxwj.mjs.map +0 -1
- package/dist/snapshot-CugwUqKQ.mjs +0 -237
- package/dist/snapshot-CugwUqKQ.mjs.map +0 -1
- package/dist/ssrf-CJUnJymJ.mjs +0 -406
- package/dist/ssrf-CJUnJymJ.mjs.map +0 -1
- package/dist/stage-DgrBz_du.mjs +0 -662
- package/dist/stage-DgrBz_du.mjs.map +0 -1
- package/dist/state-DDiPySSG.mjs +0 -153
- package/dist/state-DDiPySSG.mjs.map +0 -1
- package/dist/status-DZKIG4a9.mjs +0 -30
- package/dist/status-DZKIG4a9.mjs.map +0 -1
- package/dist/storage-query-Bdv7A62k.d.mts +0 -1576
- package/dist/storage-query-Bdv7A62k.d.mts.map +0 -1
- package/dist/tar-_1AgTYFu.mjs +0 -449
- package/dist/tar-_1AgTYFu.mjs.map +0 -1
- package/dist/target-_7pn2Gbg.mjs +0 -27
- package/dist/target-_7pn2Gbg.mjs.map +0 -1
- package/dist/taxonomies-C1IwNe8Q.mjs +0 -697
- package/dist/taxonomies-C1IwNe8Q.mjs.map +0 -1
- package/dist/taxonomies-C_XMoRcX.mjs +0 -939
- package/dist/taxonomies-C_XMoRcX.mjs.map +0 -1
- package/dist/taxonomy-C3Fu1YeH.mjs +0 -525
- package/dist/taxonomy-C3Fu1YeH.mjs.map +0 -1
- package/dist/tokens-u78jETkX.mjs +0 -171
- package/dist/tokens-u78jETkX.mjs.map +0 -1
- package/dist/transaction-BcJO4Tmc.mjs +0 -29
- package/dist/transaction-BcJO4Tmc.mjs.map +0 -1
- package/dist/transfer-BhUCrgDc.mjs +0 -8675
- package/dist/transfer-BhUCrgDc.mjs.map +0 -1
- package/dist/transfer-DIGvR9Af.mjs +0 -166
- package/dist/transfer-DIGvR9Af.mjs.map +0 -1
- package/dist/transfer-download-Pml7RMio.mjs +0 -33
- package/dist/transfer-download-Pml7RMio.mjs.map +0 -1
- package/dist/transformations-9gfpwY65.mjs +0 -196
- package/dist/transformations-9gfpwY65.mjs.map +0 -1
- package/dist/transport-BIfH7_hx.d.mts +0 -42
- package/dist/transport-BIfH7_hx.d.mts.map +0 -1
- package/dist/transport-DKWIq53q.mjs +0 -136
- package/dist/transport-DKWIq53q.mjs.map +0 -1
- package/dist/trusted-proxy-tKiVtyTD.mjs +0 -51
- package/dist/trusted-proxy-tKiVtyTD.mjs.map +0 -1
- package/dist/turnstile-DpsoyOfg.mjs +0 -53
- package/dist/turnstile-DpsoyOfg.mjs.map +0 -1
- package/dist/types-B4sUC2p1.d.mts +0 -198
- package/dist/types-B4sUC2p1.d.mts.map +0 -1
- package/dist/types-B7Lmsh1E.d.mts +0 -887
- package/dist/types-B7Lmsh1E.d.mts.map +0 -1
- package/dist/types-BZakh7Ym.mjs +0 -22
- package/dist/types-BZakh7Ym.mjs.map +0 -1
- package/dist/types-B_CppEmv.d.mts +0 -264
- package/dist/types-B_CppEmv.d.mts.map +0 -1
- package/dist/types-BcrBrE6-.mjs +0 -159
- package/dist/types-BcrBrE6-.mjs.map +0 -1
- package/dist/types-BkUg2yHx.mjs +0 -92
- package/dist/types-BkUg2yHx.mjs.map +0 -1
- package/dist/types-CAZgq9fO.d.mts +0 -124
- package/dist/types-CAZgq9fO.d.mts.map +0 -1
- package/dist/types-Cd-O03VG.d.mts +0 -363
- package/dist/types-Cd-O03VG.d.mts.map +0 -1
- package/dist/types-Cr-Kg-3D.d.mts +0 -1641
- package/dist/types-Cr-Kg-3D.d.mts.map +0 -1
- package/dist/types-D2fvWd1i.d.mts +0 -359
- package/dist/types-D2fvWd1i.d.mts.map +0 -1
- package/dist/types-D7HUsguf.mjs +0 -77
- package/dist/types-D7HUsguf.mjs.map +0 -1
- package/dist/types-DA1Te3Oy.d.mts +0 -198
- package/dist/types-DA1Te3Oy.d.mts.map +0 -1
- package/dist/types-DhV6Q5bP.mjs +0 -18
- package/dist/types-DhV6Q5bP.mjs.map +0 -1
- package/dist/types-DnnVSl6Y.d.mts +0 -85
- package/dist/types-DnnVSl6Y.d.mts.map +0 -1
- package/dist/types-VT4-BugW.mjs +0 -16
- package/dist/types-VT4-BugW.mjs.map +0 -1
- package/dist/upload-attempts-B68ZGNu9.mjs +0 -32
- package/dist/upload-attempts-B68ZGNu9.mjs.map +0 -1
- package/dist/url-pattern-CCeZMGOh.mjs +0 -33
- package/dist/url-pattern-CCeZMGOh.mjs.map +0 -1
- package/dist/user-DDSL-sGw.mjs +0 -171
- package/dist/user-DDSL-sGw.mjs.map +0 -1
- package/dist/utils-DdhmO9w9.mjs +0 -439
- package/dist/utils-DdhmO9w9.mjs.map +0 -1
- package/dist/validate-CHosPEhs.mjs +0 -453
- package/dist/validate-CHosPEhs.mjs.map +0 -1
- package/dist/validate-CM79QXYE.d.mts +0 -432
- package/dist/validate-CM79QXYE.d.mts.map +0 -1
- package/dist/validation-BFecQczG.mjs +0 -218
- package/dist/validation-BFecQczG.mjs.map +0 -1
- package/dist/version-BRZXVifl.mjs +0 -9
- package/dist/version-BRZXVifl.mjs.map +0 -1
- package/dist/version-DUQDHgrf.mjs +0 -7
- package/dist/version-DUQDHgrf.mjs.map +0 -1
- package/dist/widgets-WdV72brA.mjs +0 -126
- package/dist/widgets-WdV72brA.mjs.map +0 -1
- package/dist/wxr-taxonomies-BHTdqkmZ.d.mts +0 -34
- package/dist/wxr-taxonomies-BHTdqkmZ.d.mts.map +0 -1
- package/dist/wxr-taxonomies-DP6ESgMN.mjs +0 -372
- package/dist/wxr-taxonomies-DP6ESgMN.mjs.map +0 -1
- package/dist/zod-generator-D6uE4WiS.mjs +0 -389
- package/dist/zod-generator-D6uE4WiS.mjs.map +0 -1
- package/src/astro/routes/api/relations/[id]/translations.ts +0 -33
- /package/dist/{api-tokens-CE1ECIg0.mjs → api-tokens-FaG1zPsj.mjs} +0 -0
- /package/dist/{ssrf-DpBH7aOt.mjs → ssrf-DZOt8Qof.mjs} +0 -0
|
@@ -0,0 +1,659 @@
|
|
|
1
|
+
import { n as chunks, t as SQL_BATCH_SIZE } from "./chunks-DwBaj8aT.mjs";
|
|
2
|
+
import { a as STAGED_CURSOR_MARKER, c as encodeCursor, i as InvalidCursorError, s as decodeCursor } from "./types-aOOxRSx6.mjs";
|
|
3
|
+
import { sql } from "kysely";
|
|
4
|
+
import { ulid } from "ulidx";
|
|
5
|
+
|
|
6
|
+
//#region src/database/repositories/relation.ts
|
|
7
|
+
const REFERENCE_INSERT_BIND_COLUMNS = 6;
|
|
8
|
+
const D1_MAX_BOUND_PARAMETERS = 100;
|
|
9
|
+
const REFERENCE_INSERT_BATCH_SIZE = Math.floor(D1_MAX_BOUND_PARAMETERS / REFERENCE_INSERT_BIND_COLUMNS);
|
|
10
|
+
const REFERENCE_REPOSITION_BATCH_SIZE = Math.floor(D1_MAX_BOUND_PARAMETERS / 2);
|
|
11
|
+
/**
|
|
12
|
+
* Narrow a computed position to a non-negative integer before it is written as
|
|
13
|
+
* a SQL literal. Every caller passes an array index; this is what keeps that
|
|
14
|
+
* true at the one place the value stops being a bound parameter.
|
|
15
|
+
*/
|
|
16
|
+
function asPosition(sortOrder) {
|
|
17
|
+
if (!Number.isInteger(sortOrder) || sortOrder < 0) throw new TypeError(`Invalid reference sort order: ${sortOrder}`);
|
|
18
|
+
return sortOrder;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Content-references repository.
|
|
22
|
+
*
|
|
23
|
+
* Owns relation *definitions* (`_emdash_relations`) and the *edge* junction
|
|
24
|
+
* (`_emdash_content_references`, whose endpoints are content
|
|
25
|
+
* `translation_group`s so edges are locale-agnostic, mirroring
|
|
26
|
+
* `content_taxonomies`).
|
|
27
|
+
*
|
|
28
|
+
* A relation is schema, so it is not localized — it sits with
|
|
29
|
+
* `_emdash_collections` and `_emdash_fields`, not with the row-per-locale
|
|
30
|
+
* tables. See migration 086.
|
|
31
|
+
*
|
|
32
|
+
* Like `TaxonomyRepository`, this is not the validation boundary: it trusts its
|
|
33
|
+
* typed inputs. The API slice supplies Zod schemas at the route and enforces
|
|
34
|
+
* collection-agreement / relation-existence invariants in the handler.
|
|
35
|
+
*/
|
|
36
|
+
var RelationRepository = class {
|
|
37
|
+
constructor(db) {
|
|
38
|
+
this.db = db;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create a relation.
|
|
42
|
+
*
|
|
43
|
+
* `slug` is unique across all relations, so a duplicate raises the DB's
|
|
44
|
+
* unique violation for the handler to translate into a conflict.
|
|
45
|
+
*/
|
|
46
|
+
async create(input) {
|
|
47
|
+
const id = ulid();
|
|
48
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
49
|
+
await this.db.insertInto("_emdash_relations").values({
|
|
50
|
+
id,
|
|
51
|
+
slug: input.slug,
|
|
52
|
+
parent_collection: input.parentCollection,
|
|
53
|
+
child_collection: input.childCollection,
|
|
54
|
+
parent_label: input.parentLabel,
|
|
55
|
+
child_label: input.childLabel,
|
|
56
|
+
parent_label_singular: input.parentLabelSingular ?? null,
|
|
57
|
+
child_label_singular: input.childLabelSingular ?? null,
|
|
58
|
+
max_children_per_parent: input.maxChildrenPerParent ?? null,
|
|
59
|
+
max_parents_per_child: input.maxParentsPerChild ?? null,
|
|
60
|
+
created_at: now,
|
|
61
|
+
updated_at: now
|
|
62
|
+
}).execute();
|
|
63
|
+
const relation = await this.findById(id);
|
|
64
|
+
if (!relation) throw new Error("Failed to create relation");
|
|
65
|
+
return relation;
|
|
66
|
+
}
|
|
67
|
+
async findById(id) {
|
|
68
|
+
const row = await this.db.selectFrom("_emdash_relations").selectAll().where("id", "=", id).executeTakeFirst();
|
|
69
|
+
return row ? this.rowToRelation(row) : null;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Find a relation by its slug. No locale: a slug identifies a relation
|
|
73
|
+
* outright (`UNIQUE(slug)`, migration 086), which is what lets an entry in
|
|
74
|
+
* any locale address it.
|
|
75
|
+
*/
|
|
76
|
+
async findBySlug(slug) {
|
|
77
|
+
const row = await this.db.selectFrom("_emdash_relations").selectAll().where("slug", "=", slug).executeTakeFirst();
|
|
78
|
+
return row ? this.rowToRelation(row) : null;
|
|
79
|
+
}
|
|
80
|
+
/** All relations, ordered by slug. */
|
|
81
|
+
async list() {
|
|
82
|
+
return (await this.db.selectFrom("_emdash_relations").selectAll().orderBy("slug", "asc").execute()).map((row) => this.rowToRelation(row));
|
|
83
|
+
}
|
|
84
|
+
/** Relations where `collection` is the parent OR the child side. */
|
|
85
|
+
async findForCollection(collection) {
|
|
86
|
+
return (await this.db.selectFrom("_emdash_relations").selectAll().where((eb) => eb.or([eb("parent_collection", "=", collection), eb("child_collection", "=", collection)])).orderBy("slug", "asc").execute()).map((row) => this.rowToRelation(row));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Update a relation's role labels and cardinality. Structural fields are
|
|
90
|
+
* immutable — a reference field stores the slug, and the edges are keyed by
|
|
91
|
+
* the id. No-ops when nothing is supplied.
|
|
92
|
+
*/
|
|
93
|
+
async update(id, input) {
|
|
94
|
+
if (!await this.findById(id)) return null;
|
|
95
|
+
const updates = {};
|
|
96
|
+
if (input.parentLabel !== void 0) updates.parent_label = input.parentLabel;
|
|
97
|
+
if (input.childLabel !== void 0) updates.child_label = input.childLabel;
|
|
98
|
+
if (input.parentLabelSingular !== void 0) updates.parent_label_singular = input.parentLabelSingular;
|
|
99
|
+
if (input.childLabelSingular !== void 0) updates.child_label_singular = input.childLabelSingular;
|
|
100
|
+
if (input.maxChildrenPerParent !== void 0) updates.max_children_per_parent = input.maxChildrenPerParent;
|
|
101
|
+
if (input.maxParentsPerChild !== void 0) updates.max_parents_per_child = input.maxParentsPerChild;
|
|
102
|
+
if (Object.keys(updates).length > 0) {
|
|
103
|
+
updates.updated_at = (/* @__PURE__ */ new Date()).toISOString();
|
|
104
|
+
await this.db.updateTable("_emdash_relations").set(updates).where("id", "=", id).execute();
|
|
105
|
+
}
|
|
106
|
+
return this.findById(id);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Delete a relation and its edges (application-layer cascade — the edge
|
|
110
|
+
* table has no FK).
|
|
111
|
+
*/
|
|
112
|
+
async delete(id) {
|
|
113
|
+
if (!await this.findById(id)) return false;
|
|
114
|
+
await this.db.deleteFrom("_emdash_content_references").where("relation_id", "=", id).execute();
|
|
115
|
+
return ((await this.db.deleteFrom("_emdash_relations").where("id", "=", id).executeTakeFirst()).numDeletedRows ?? 0n) > 0n;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Insert one edge only while the end it lands on is still under its limit,
|
|
119
|
+
* deciding and writing in a single statement.
|
|
120
|
+
*
|
|
121
|
+
* A count read before the insert answers for a moment that has passed by the
|
|
122
|
+
* time the row goes in: two requests can both read a free slot and both fill
|
|
123
|
+
* it, and the unique edge constraint does not catch it because they are
|
|
124
|
+
* different pairs. Folding the count into the insert's `WHERE` makes the
|
|
125
|
+
* decision and the write one thing, on D1 as much as anywhere. Returns false
|
|
126
|
+
* when the limit refused the row.
|
|
127
|
+
*/
|
|
128
|
+
async insertEdgeWithinLimit(row, limitedSide, limit) {
|
|
129
|
+
const column = limitedSide === "parent" ? "parent_group" : "child_group";
|
|
130
|
+
const group = limitedSide === "parent" ? row.parent_group : row.child_group;
|
|
131
|
+
return ((await sql`
|
|
132
|
+
INSERT INTO ${sql.ref("_emdash_content_references")}
|
|
133
|
+
(id, relation_id, parent_group, child_group, sort_order, created_at)
|
|
134
|
+
SELECT ${row.id}, ${row.relation_id}, ${row.parent_group}, ${row.child_group},
|
|
135
|
+
${row.sort_order}, ${row.created_at}
|
|
136
|
+
WHERE (
|
|
137
|
+
SELECT COUNT(*) FROM ${sql.ref("_emdash_content_references")}
|
|
138
|
+
WHERE relation_id = ${row.relation_id} AND ${sql.ref(column)} = ${group}
|
|
139
|
+
) < ${limit}
|
|
140
|
+
`.execute(this.db)).numAffectedRows ?? 0n) > 0n;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Write new edges, taking back the ones already written if the limited end
|
|
144
|
+
* refuses a later one.
|
|
145
|
+
*
|
|
146
|
+
* Returns the refused group in a one-element array, or an empty array when
|
|
147
|
+
* every row went in. The rollback is what lets a replacement add before it
|
|
148
|
+
* removes: on D1 nothing else can take a partial write back.
|
|
149
|
+
*
|
|
150
|
+
* An unlimited end cannot refuse anything, so its rows go in as batches; a
|
|
151
|
+
* limited one takes a statement per edge, because a limit enforced only by a
|
|
152
|
+
* count before the write is one two requests can both walk past.
|
|
153
|
+
*/
|
|
154
|
+
async insertEdges(rows, limitedSide, limit) {
|
|
155
|
+
if (rows.length === 0) return [];
|
|
156
|
+
if (limit === null) {
|
|
157
|
+
for (const rowBatch of chunks(rows, REFERENCE_INSERT_BATCH_SIZE)) await this.db.insertInto("_emdash_content_references").values(rowBatch).onConflict((oc) => oc.doNothing()).execute();
|
|
158
|
+
return [];
|
|
159
|
+
}
|
|
160
|
+
const written = [];
|
|
161
|
+
for (const row of rows) {
|
|
162
|
+
if (await this.insertEdgeWithinLimit(row, limitedSide, limit)) {
|
|
163
|
+
written.push(row.id);
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
await this.deleteEdgesById(written);
|
|
167
|
+
return [limitedSide === "parent" ? row.parent_group : row.child_group];
|
|
168
|
+
}
|
|
169
|
+
return [];
|
|
170
|
+
}
|
|
171
|
+
/** Remove edges by id, in D1-safe batches. */
|
|
172
|
+
async deleteEdgesById(ids) {
|
|
173
|
+
for (const idBatch of chunks(ids, SQL_BATCH_SIZE)) await this.db.deleteFrom("_emdash_content_references").where("id", "in", idBatch).execute();
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Move kept edges to their new positions, a statement per batch rather than
|
|
177
|
+
* one per edge: dragging one entry up a long list moves every entry below it,
|
|
178
|
+
* and that is a single editor action.
|
|
179
|
+
*/
|
|
180
|
+
async repositionEdges(moves) {
|
|
181
|
+
for (const moveBatch of chunks(moves, REFERENCE_REPOSITION_BATCH_SIZE)) {
|
|
182
|
+
const branches = moveBatch.map((move) => sql`WHEN ${move.id} THEN ${sql.lit(asPosition(move.sortOrder))}`);
|
|
183
|
+
await this.db.updateTable("_emdash_content_references").set({ sort_order: sql`CASE ${sql.ref("id")} ${sql.join(branches, sql` `)} END` }).where("id", "in", moveBatch.map((move) => move.id)).execute();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/** Normalize a relation id OR slug to its id. Returns null for an unknown
|
|
187
|
+
* relation (edge methods then no-op, matching
|
|
188
|
+
* `TaxonomyRepository.attachToEntry`). */
|
|
189
|
+
async resolveRelationId(idOrSlug) {
|
|
190
|
+
return (await this.resolveRelationLimits(idOrSlug))?.id ?? null;
|
|
191
|
+
}
|
|
192
|
+
/** The same lookup, carrying the limits an edge write has to hold to. */
|
|
193
|
+
async resolveRelationLimits(idOrSlug) {
|
|
194
|
+
const row = await this.db.selectFrom("_emdash_relations").select([
|
|
195
|
+
"id",
|
|
196
|
+
"max_children_per_parent",
|
|
197
|
+
"max_parents_per_child"
|
|
198
|
+
]).where((eb) => eb.or([eb("id", "=", idOrSlug), eb("slug", "=", idOrSlug)])).executeTakeFirst();
|
|
199
|
+
if (!row) return null;
|
|
200
|
+
return {
|
|
201
|
+
id: row.id,
|
|
202
|
+
maxChildrenPerParent: row.max_children_per_parent,
|
|
203
|
+
maxParentsPerChild: row.max_parents_per_child
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
rowToReference(row) {
|
|
207
|
+
return {
|
|
208
|
+
id: row.id,
|
|
209
|
+
relationId: row.relation_id,
|
|
210
|
+
parentGroup: row.parent_group,
|
|
211
|
+
childGroup: row.child_group,
|
|
212
|
+
sortOrder: row.sort_order
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Link `parentGroup → childGroup` under a relation. `relation` is a relation
|
|
217
|
+
* id or group. Idempotent (onConflict doNothing against the unique edge).
|
|
218
|
+
* `sortOrder` defaults to append: max(sort_order)+1 within (relation, parent).
|
|
219
|
+
*
|
|
220
|
+
* The default-append MAX→INSERT is not atomic: concurrent appends without an
|
|
221
|
+
* explicit `sortOrder` may both read the same max and collide on sort_order,
|
|
222
|
+
* and onConflict silently drops the loser. Callers needing strict ordering
|
|
223
|
+
* under concurrency should pass `sortOrder` explicitly (or serialize).
|
|
224
|
+
*/
|
|
225
|
+
async addReference(relation, parentGroup, childGroup, sortOrder) {
|
|
226
|
+
const relationId = await this.resolveRelationId(relation);
|
|
227
|
+
if (!relationId) return;
|
|
228
|
+
let order = sortOrder;
|
|
229
|
+
if (order === void 0) {
|
|
230
|
+
const max = await this.db.selectFrom("_emdash_content_references").select((eb) => eb.fn.max("sort_order").as("max")).where("relation_id", "=", relationId).where("parent_group", "=", parentGroup).executeTakeFirst();
|
|
231
|
+
order = max?.max === null || max?.max === void 0 ? 0 : Number(max.max) + 1;
|
|
232
|
+
}
|
|
233
|
+
await this.db.insertInto("_emdash_content_references").values({
|
|
234
|
+
id: ulid(),
|
|
235
|
+
relation_id: relationId,
|
|
236
|
+
parent_group: parentGroup,
|
|
237
|
+
child_group: childGroup,
|
|
238
|
+
sort_order: order,
|
|
239
|
+
created_at: (/* @__PURE__ */ new Date()).toISOString()
|
|
240
|
+
}).onConflict((oc) => oc.doNothing()).execute();
|
|
241
|
+
}
|
|
242
|
+
/** Remove one `parentGroup → childGroup` edge under a relation. */
|
|
243
|
+
async removeReference(relation, parentGroup, childGroup) {
|
|
244
|
+
const relationId = await this.resolveRelationId(relation);
|
|
245
|
+
if (!relationId) return;
|
|
246
|
+
await this.db.deleteFrom("_emdash_content_references").where("relation_id", "=", relationId).where("parent_group", "=", parentGroup).where("child_group", "=", childGroup).execute();
|
|
247
|
+
}
|
|
248
|
+
/** Forward traversal: a parent's children for a relation, ordered. */
|
|
249
|
+
async getChildren(relation, parentGroup) {
|
|
250
|
+
const relationId = await this.resolveRelationId(relation);
|
|
251
|
+
if (!relationId) return [];
|
|
252
|
+
return (await this.db.selectFrom("_emdash_content_references").selectAll().where("relation_id", "=", relationId).where("parent_group", "=", parentGroup).orderBy("sort_order", "asc").orderBy("id", "asc").execute()).map((row) => this.rowToReference(row));
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Forward traversal, paginated: one page of a parent's children for a
|
|
256
|
+
* relation, ordered by `(sort_order, id)`. Use this on request paths — a
|
|
257
|
+
* parent's children are capped but still up to 1000, and an unbounded read
|
|
258
|
+
* scales poorly. Returns `{ items, nextCursor? }`; the cursor's order value is
|
|
259
|
+
* the row's `sort_order`. Default limit 50, max 100.
|
|
260
|
+
*/
|
|
261
|
+
async getChildrenPage(relation, parentGroup, options = {}) {
|
|
262
|
+
const relationId = await this.resolveRelationId(relation);
|
|
263
|
+
if (!relationId) return { items: [] };
|
|
264
|
+
return this.getChildrenPageById(relationId, parentGroup, options);
|
|
265
|
+
}
|
|
266
|
+
/** `getChildrenPage` for a caller that already holds the relation's id. */
|
|
267
|
+
async getChildrenPageById(relationId, parentGroup, options = {}) {
|
|
268
|
+
const limit = Math.min(options.limit || 50, 100);
|
|
269
|
+
let query = this.db.selectFrom("_emdash_content_references").selectAll().where("relation_id", "=", relationId).where("parent_group", "=", parentGroup);
|
|
270
|
+
if (options.cursor) {
|
|
271
|
+
const decoded = decodeCursor(options.cursor);
|
|
272
|
+
if (decoded.orderValue === STAGED_CURSOR_MARKER) query = query.where((eb) => {
|
|
273
|
+
const anchor = () => eb.selectFrom("_emdash_content_references as anchor").where("anchor.relation_id", "=", relationId).where("anchor.parent_group", "=", parentGroup).where("anchor.child_group", "=", decoded.id);
|
|
274
|
+
return eb.or([
|
|
275
|
+
eb.not(eb.exists(anchor().select("anchor.id"))),
|
|
276
|
+
eb("sort_order", ">", anchor().select("anchor.sort_order")),
|
|
277
|
+
eb.and([eb("sort_order", "=", anchor().select("anchor.sort_order")), eb("id", ">", anchor().select("anchor.id"))])
|
|
278
|
+
]);
|
|
279
|
+
});
|
|
280
|
+
else {
|
|
281
|
+
const sortOrder = Number(decoded.orderValue);
|
|
282
|
+
if (!Number.isFinite(sortOrder)) throw new InvalidCursorError(options.cursor);
|
|
283
|
+
query = query.where((eb) => eb.or([eb("sort_order", ">", sortOrder), eb.and([eb("sort_order", "=", sortOrder), eb("id", ">", decoded.id)])]));
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
const rows = await query.orderBy("sort_order", "asc").orderBy("id", "asc").limit(limit + 1).execute();
|
|
287
|
+
const hasMore = rows.length > limit;
|
|
288
|
+
const items = rows.slice(0, limit).map((row) => this.rowToReference(row));
|
|
289
|
+
const result = { items };
|
|
290
|
+
const last = items.at(-1);
|
|
291
|
+
if (hasMore && last) result.nextCursor = encodeCursor(String(last.sortOrder), last.id);
|
|
292
|
+
return result;
|
|
293
|
+
}
|
|
294
|
+
/** Backlink traversal: the parents that reference a child for a relation. */
|
|
295
|
+
async getParents(relation, childGroup) {
|
|
296
|
+
const relationId = await this.resolveRelationId(relation);
|
|
297
|
+
if (!relationId) return [];
|
|
298
|
+
return (await this.db.selectFrom("_emdash_content_references").selectAll().where("relation_id", "=", relationId).where("child_group", "=", childGroup).orderBy("id", "asc").execute()).map((row) => this.rowToReference(row));
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Replace all children of `parentGroup` under a relation with `childGroups`,
|
|
302
|
+
* assigning positional sort_order (index in the deduped array).
|
|
303
|
+
* Mirrors the intent of `TaxonomyRepository.setTermsForEntry`.
|
|
304
|
+
*
|
|
305
|
+
* A parent references a given child at most once (the unique edge), so
|
|
306
|
+
* duplicate `childGroups` are collapsed first-occurrence-wins rather than
|
|
307
|
+
* relying on the insert's onConflict to silently drop them.
|
|
308
|
+
*
|
|
309
|
+
* Written as a diff, in the order add → remove → reposition, rather than as a
|
|
310
|
+
* delete of the whole end followed by a re-insert. There is no transaction on
|
|
311
|
+
* D1: a replacement that removed first would leave the parent holding nothing
|
|
312
|
+
* the moment the far side refused one of the additions, and report a failed
|
|
313
|
+
* save over an emptied field. Additions already written come back out when a
|
|
314
|
+
* later one is refused, so a refused call leaves the selection as it found it.
|
|
315
|
+
* The diff also keeps an edge the caller is merely re-stating out of the far
|
|
316
|
+
* side's count, which a delete-and-reinsert survives only because its delete
|
|
317
|
+
* frees the slot a moment before it asks for it back.
|
|
318
|
+
*
|
|
319
|
+
* Concurrency: two simultaneous replace-all calls for the same (relation,
|
|
320
|
+
* parent) can interleave and merge into the union of both sets (a lost update
|
|
321
|
+
* — neither "replace" wins). This is non-corrupting — keyset pagination stays
|
|
322
|
+
* totally ordered via the `(sort_order, id)` tiebreak even with duplicate
|
|
323
|
+
* sort_orders — and a single client editing one parent's children serially
|
|
324
|
+
* never hits it. A D1-portable fix isn't available (no multi-statement
|
|
325
|
+
* transactions), so concurrent replace-all on one parent is unsupported by
|
|
326
|
+
* design rather than guarded here.
|
|
327
|
+
*
|
|
328
|
+
* Returns the child group `maxParentsPerChild` refused, in a one-element
|
|
329
|
+
* array — empty unless the relation limits that end and something else has
|
|
330
|
+
* taken the slot since the caller resolved its selection.
|
|
331
|
+
*/
|
|
332
|
+
async setChildren(relation, parentGroup, childGroups) {
|
|
333
|
+
const rel = await this.resolveRelationLimits(relation);
|
|
334
|
+
if (!rel) return [];
|
|
335
|
+
const existing = await this.db.selectFrom("_emdash_content_references").select([
|
|
336
|
+
"id",
|
|
337
|
+
"child_group",
|
|
338
|
+
"sort_order"
|
|
339
|
+
]).where("relation_id", "=", rel.id).where("parent_group", "=", parentGroup).execute();
|
|
340
|
+
const existingChildren = new Set(existing.map((row) => row.child_group));
|
|
341
|
+
const uniqueChildGroups = [...new Set(childGroups)];
|
|
342
|
+
const positions = new Map(uniqueChildGroups.map((childGroup, index) => [childGroup, index]));
|
|
343
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
344
|
+
const additions = uniqueChildGroups.map((childGroup, index) => ({
|
|
345
|
+
childGroup,
|
|
346
|
+
index
|
|
347
|
+
})).filter(({ childGroup }) => !existingChildren.has(childGroup)).map(({ childGroup, index }) => ({
|
|
348
|
+
id: ulid(),
|
|
349
|
+
relation_id: rel.id,
|
|
350
|
+
parent_group: parentGroup,
|
|
351
|
+
child_group: childGroup,
|
|
352
|
+
sort_order: index,
|
|
353
|
+
created_at: now
|
|
354
|
+
}));
|
|
355
|
+
const rejected = await this.insertEdges(additions, "child", rel.maxParentsPerChild);
|
|
356
|
+
if (rejected.length > 0) return rejected;
|
|
357
|
+
const removals = [];
|
|
358
|
+
const repositions = [];
|
|
359
|
+
for (const row of existing) {
|
|
360
|
+
const position = positions.get(row.child_group);
|
|
361
|
+
if (position === void 0) removals.push(row.id);
|
|
362
|
+
else if (position !== row.sort_order) repositions.push({
|
|
363
|
+
id: row.id,
|
|
364
|
+
sortOrder: position
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
await this.deleteEdgesById(removals);
|
|
368
|
+
await this.repositionEdges(repositions);
|
|
369
|
+
return [];
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Replace all parents of `childGroup` under a relation with `parentGroups`:
|
|
373
|
+
* the mirror of `setChildren`, for a field bound to the child side.
|
|
374
|
+
*
|
|
375
|
+
* Duplicates collapse first-occurrence-wins, and the same diff ordering and
|
|
376
|
+
* non-transactional caveats apply — see `setChildren`, including that two
|
|
377
|
+
* concurrent replace-all calls for one (relation, child) can merge.
|
|
378
|
+
*
|
|
379
|
+
* `sort_order` orders children within a parent and has no counterpart on this
|
|
380
|
+
* side, so a *new* edge takes the next position among that parent's existing
|
|
381
|
+
* children rather than a position in this child's list. A parent the caller
|
|
382
|
+
* re-states keeps the position it already holds: that position is the other
|
|
383
|
+
* side's list order, and saving a backlink field must not rewrite it. A
|
|
384
|
+
* child-side field therefore has no order of its own; `getParents` reads by
|
|
385
|
+
* `id`.
|
|
386
|
+
*
|
|
387
|
+
* Returns the parent group `maxChildrenPerParent` refused, the mirror of what
|
|
388
|
+
* `setChildren` returns.
|
|
389
|
+
*/
|
|
390
|
+
async setParents(relation, childGroup, parentGroups) {
|
|
391
|
+
const rel = await this.resolveRelationLimits(relation);
|
|
392
|
+
if (!rel) return [];
|
|
393
|
+
const relationId = rel.id;
|
|
394
|
+
const existing = await this.db.selectFrom("_emdash_content_references").select(["id", "parent_group"]).where("relation_id", "=", relationId).where("child_group", "=", childGroup).execute();
|
|
395
|
+
const existingParents = new Set(existing.map((row) => row.parent_group));
|
|
396
|
+
const uniqueParentGroups = [...new Set(parentGroups)];
|
|
397
|
+
const selected = new Set(uniqueParentGroups);
|
|
398
|
+
const newParents = uniqueParentGroups.filter((parentGroup) => !existingParents.has(parentGroup));
|
|
399
|
+
const nextSortOrder = /* @__PURE__ */ new Map();
|
|
400
|
+
for (const groupBatch of chunks(newParents, REFERENCE_INSERT_BATCH_SIZE)) {
|
|
401
|
+
const maxima = await this.db.selectFrom("_emdash_content_references").select((eb) => ["parent_group", eb.fn.max("sort_order").as("max")]).where("relation_id", "=", relationId).where("parent_group", "in", groupBatch).groupBy("parent_group").execute();
|
|
402
|
+
for (const row of maxima) nextSortOrder.set(row.parent_group, row.max === null ? 0 : Number(row.max) + 1);
|
|
403
|
+
}
|
|
404
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
405
|
+
const additions = newParents.map((parentGroup) => ({
|
|
406
|
+
id: ulid(),
|
|
407
|
+
relation_id: relationId,
|
|
408
|
+
parent_group: parentGroup,
|
|
409
|
+
child_group: childGroup,
|
|
410
|
+
sort_order: nextSortOrder.get(parentGroup) ?? 0,
|
|
411
|
+
created_at: now
|
|
412
|
+
}));
|
|
413
|
+
const rejected = await this.insertEdges(additions, "parent", rel.maxChildrenPerParent);
|
|
414
|
+
if (rejected.length > 0) return rejected;
|
|
415
|
+
await this.deleteEdgesById(existing.filter((row) => !selected.has(row.parent_group)).map((row) => row.id));
|
|
416
|
+
return [];
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Copy every outgoing edge of `fromParentGroup` onto `toParentGroup`,
|
|
420
|
+
* preserving relation, child, and sort order. Used when duplicating a content
|
|
421
|
+
* entry so the copy carries the same reference selections (edges are
|
|
422
|
+
* storage-less, keyed by translation_group, so they don't ride along in the
|
|
423
|
+
* row's `data`). Only the parent side is copied; backlinks pointing at the
|
|
424
|
+
* original stay on the original. Idempotent per edge via onConflict.
|
|
425
|
+
*
|
|
426
|
+
* A copy is still a new edge, so it holds to `maxParentsPerChild` like any
|
|
427
|
+
* other: a child already at its limit cannot also belong to the copy. Returns
|
|
428
|
+
* the child group that refused, in a one-element array, having taken back
|
|
429
|
+
* every edge this call had already written — the caller decides what a
|
|
430
|
+
* duplicate that cannot carry its selection should do.
|
|
431
|
+
*/
|
|
432
|
+
async copyParentEdges(fromParentGroup, toParentGroup) {
|
|
433
|
+
const rows = await this.db.selectFrom("_emdash_content_references").selectAll().where("parent_group", "=", fromParentGroup).execute();
|
|
434
|
+
if (rows.length === 0) return [];
|
|
435
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
436
|
+
const byRelation = /* @__PURE__ */ new Map();
|
|
437
|
+
for (const row of rows) {
|
|
438
|
+
const copies = byRelation.get(row.relation_id) ?? [];
|
|
439
|
+
copies.push({
|
|
440
|
+
id: ulid(),
|
|
441
|
+
relation_id: row.relation_id,
|
|
442
|
+
parent_group: toParentGroup,
|
|
443
|
+
child_group: row.child_group,
|
|
444
|
+
sort_order: row.sort_order,
|
|
445
|
+
created_at: now
|
|
446
|
+
});
|
|
447
|
+
byRelation.set(row.relation_id, copies);
|
|
448
|
+
}
|
|
449
|
+
const written = [];
|
|
450
|
+
for (const [relationId, copies] of byRelation) {
|
|
451
|
+
const rel = await this.resolveRelationLimits(relationId);
|
|
452
|
+
const rejected = await this.insertEdges(copies, "child", rel?.maxParentsPerChild ?? null);
|
|
453
|
+
if (rejected.length > 0) {
|
|
454
|
+
await this.deleteEdgesById(written);
|
|
455
|
+
return rejected;
|
|
456
|
+
}
|
|
457
|
+
written.push(...copies.map((copy) => copy.id));
|
|
458
|
+
}
|
|
459
|
+
return [];
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* How many edges each of `groups` already holds at one end of a relation,
|
|
463
|
+
* ignoring edges whose opposite end is `excludeOppositeGroup`.
|
|
464
|
+
*
|
|
465
|
+
* The exclusion is what lets a re-save of an unchanged selection pass: the
|
|
466
|
+
* selecting entry's own edges are not counted against the limit it is about
|
|
467
|
+
* to re-establish. Groups with no edges are absent from the map.
|
|
468
|
+
*/
|
|
469
|
+
async countEdgesByGroup(relationId, side, groups, excludeOppositeGroup) {
|
|
470
|
+
const column = side === "parent" ? "parent_group" : "child_group";
|
|
471
|
+
const opposite = side === "parent" ? "child_group" : "parent_group";
|
|
472
|
+
const counts = /* @__PURE__ */ new Map();
|
|
473
|
+
for (const groupBatch of chunks([...new Set(groups)], SQL_BATCH_SIZE)) {
|
|
474
|
+
let query = this.db.selectFrom("_emdash_content_references").select((eb) => [column, eb.fn.countAll().as("count")]).where("relation_id", "=", relationId).where(column, "in", groupBatch);
|
|
475
|
+
if (excludeOppositeGroup !== null) query = query.where(opposite, "!=", excludeOppositeGroup);
|
|
476
|
+
const rows = await query.groupBy(column).execute();
|
|
477
|
+
for (const row of rows) counts.set(row[column], Number(row.count));
|
|
478
|
+
}
|
|
479
|
+
return counts;
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Backlink traversal, paginated: one page of the parents that reference a
|
|
483
|
+
* child for a relation, ordered by `id`. Unlike a parent's children, a
|
|
484
|
+
* child's backlinks are *unbounded* — one popular entry can be referenced by
|
|
485
|
+
* arbitrarily many parents — so this read must paginate. Returns
|
|
486
|
+
* `{ items, nextCursor? }`; the cursor's order value is the row `id`. Default
|
|
487
|
+
* limit 50, max 100.
|
|
488
|
+
*/
|
|
489
|
+
async getParentsPage(relation, childGroup, options = {}) {
|
|
490
|
+
const relationId = await this.resolveRelationId(relation);
|
|
491
|
+
if (!relationId) return { items: [] };
|
|
492
|
+
return this.getParentsPageById(relationId, childGroup, options);
|
|
493
|
+
}
|
|
494
|
+
/** `getParentsPage` for a caller that already holds the relation's id. */
|
|
495
|
+
async getParentsPageById(relationId, childGroup, options = {}) {
|
|
496
|
+
const limit = Math.min(options.limit || 50, 100);
|
|
497
|
+
let query = this.db.selectFrom("_emdash_content_references").selectAll().where("relation_id", "=", relationId).where("child_group", "=", childGroup);
|
|
498
|
+
if (options.cursor) {
|
|
499
|
+
const decoded = decodeCursor(options.cursor);
|
|
500
|
+
if (decoded.orderValue === STAGED_CURSOR_MARKER) query = query.where((eb) => {
|
|
501
|
+
const anchor = eb.selectFrom("_emdash_content_references as anchor").where("anchor.relation_id", "=", relationId).where("anchor.child_group", "=", childGroup).where("anchor.parent_group", "=", decoded.id);
|
|
502
|
+
return eb.or([eb.not(eb.exists(anchor.select("anchor.id"))), eb("id", ">", anchor.select("anchor.id"))]);
|
|
503
|
+
});
|
|
504
|
+
else query = query.where("id", ">", decoded.id);
|
|
505
|
+
}
|
|
506
|
+
const rows = await query.orderBy("id", "asc").limit(limit + 1).execute();
|
|
507
|
+
const hasMore = rows.length > limit;
|
|
508
|
+
const items = rows.slice(0, limit).map((row) => this.rowToReference(row));
|
|
509
|
+
const result = { items };
|
|
510
|
+
const last = items.at(-1);
|
|
511
|
+
if (hasMore && last) result.nextCursor = encodeCursor(last.id, last.id);
|
|
512
|
+
return result;
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* Remove every edge where `group` is the parent OR the child — i.e. ensure no
|
|
516
|
+
* orphaned reference edges survive when a content entry is deleted. The
|
|
517
|
+
* application-layer cascade that group-linking precludes at the SQL level.
|
|
518
|
+
* Callers must be sure the whole group is gone: edges outlive any single
|
|
519
|
+
* locale row. Returns the number of edges removed.
|
|
520
|
+
*/
|
|
521
|
+
async clearReferencesForGroup(group) {
|
|
522
|
+
const result = await this.db.deleteFrom("_emdash_content_references").where((eb) => eb.or([eb("parent_group", "=", group), eb("child_group", "=", group)])).executeTakeFirst();
|
|
523
|
+
return Number(result.numDeletedRows ?? 0);
|
|
524
|
+
}
|
|
525
|
+
/** Count a parent's children under a relation. */
|
|
526
|
+
async countChildren(relation, parentGroup) {
|
|
527
|
+
const relationId = await this.resolveRelationId(relation);
|
|
528
|
+
if (!relationId) return 0;
|
|
529
|
+
const result = await this.db.selectFrom("_emdash_content_references").select((eb) => eb.fn.count("id").as("count")).where("relation_id", "=", relationId).where("parent_group", "=", parentGroup).executeTakeFirst();
|
|
530
|
+
return Number(result?.count ?? 0);
|
|
531
|
+
}
|
|
532
|
+
/** Count a child's parents (backlinks) under a relation. */
|
|
533
|
+
async countParents(relation, childGroup) {
|
|
534
|
+
const relationId = await this.resolveRelationId(relation);
|
|
535
|
+
if (!relationId) return 0;
|
|
536
|
+
const result = await this.db.selectFrom("_emdash_content_references").select((eb) => eb.fn.count("id").as("count")).where("relation_id", "=", relationId).where("child_group", "=", childGroup).executeTakeFirst();
|
|
537
|
+
return Number(result?.count ?? 0);
|
|
538
|
+
}
|
|
539
|
+
/**
|
|
540
|
+
* Total edges per relation, for every relation at once. Relations with no
|
|
541
|
+
* edges are absent from the map.
|
|
542
|
+
*
|
|
543
|
+
* One grouped scan rather than a count per relation: the delete dialogs name
|
|
544
|
+
* how many links go with a relation, and the relations list shows the same
|
|
545
|
+
* number on every row.
|
|
546
|
+
*/
|
|
547
|
+
async countEdgesByRelation() {
|
|
548
|
+
const rows = await this.db.selectFrom("_emdash_content_references").select(["relation_id", (eb) => eb.fn.count("id").as("count")]).groupBy("relation_id").execute();
|
|
549
|
+
return new Map(rows.map((row) => [row.relation_id, Number(row.count ?? 0)]));
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* Batch child-counts for many parents under a relation. Chunks at
|
|
553
|
+
* SQL_BATCH_SIZE for D1's bind-parameter limit. Returns parent_group → count
|
|
554
|
+
* (parents with no children are absent from the map). Mirrors
|
|
555
|
+
* `TaxonomyRepository.countEntriesForTerms`.
|
|
556
|
+
*/
|
|
557
|
+
async countChildrenForParents(relation, parentGroups) {
|
|
558
|
+
const counts = /* @__PURE__ */ new Map();
|
|
559
|
+
if (parentGroups.length === 0) return counts;
|
|
560
|
+
const relationId = await this.resolveRelationId(relation);
|
|
561
|
+
if (!relationId) return counts;
|
|
562
|
+
for (const chunk of chunks(parentGroups, SQL_BATCH_SIZE)) {
|
|
563
|
+
const rows = await this.db.selectFrom("_emdash_content_references").select(["parent_group", (eb) => eb.fn.count("id").as("count")]).where("relation_id", "=", relationId).where("parent_group", "in", chunk).groupBy("parent_group").execute();
|
|
564
|
+
for (const row of rows) counts.set(row.parent_group, Number(row.count ?? 0));
|
|
565
|
+
}
|
|
566
|
+
return counts;
|
|
567
|
+
}
|
|
568
|
+
rowToRelation(row) {
|
|
569
|
+
return {
|
|
570
|
+
id: row.id,
|
|
571
|
+
slug: row.slug,
|
|
572
|
+
parentCollection: row.parent_collection,
|
|
573
|
+
childCollection: row.child_collection,
|
|
574
|
+
parentLabel: row.parent_label,
|
|
575
|
+
childLabel: row.child_label,
|
|
576
|
+
parentLabelSingular: row.parent_label_singular,
|
|
577
|
+
childLabelSingular: row.child_label_singular,
|
|
578
|
+
maxChildrenPerParent: row.max_children_per_parent,
|
|
579
|
+
maxParentsPerChild: row.max_parents_per_child
|
|
580
|
+
};
|
|
581
|
+
}
|
|
582
|
+
};
|
|
583
|
+
|
|
584
|
+
//#endregion
|
|
585
|
+
//#region src/references/staged.ts
|
|
586
|
+
/**
|
|
587
|
+
* The shape a pending reference selection takes inside a draft revision, and how
|
|
588
|
+
* to read and page it.
|
|
589
|
+
*
|
|
590
|
+
* Nothing here touches the database, which is what lets both the write side
|
|
591
|
+
* (`api/handlers/staged-references.ts`, which promotes and validates a staged
|
|
592
|
+
* selection) and the read side (the entry read, the edge routes, the public
|
|
593
|
+
* query resolver) share it without importing each other.
|
|
594
|
+
*/
|
|
595
|
+
/**
|
|
596
|
+
* Where a collection that keeps drafts stages a pending reference selection: in
|
|
597
|
+
* the draft revision's data, beside `_slug`. The leading underscore is what
|
|
598
|
+
* keeps it out of the column writer, the loaded entry's `data`, and the publish
|
|
599
|
+
* promotion loop, all of which already skip `_`-prefixed keys.
|
|
600
|
+
*
|
|
601
|
+
* The link table holds the live selection only.
|
|
602
|
+
*/
|
|
603
|
+
const STAGED_REFERENCES_KEY = "_references";
|
|
604
|
+
/** Default page size for one reference field, matching the list endpoints. */
|
|
605
|
+
const REFERENCE_PAGE_LIMIT = 50;
|
|
606
|
+
/** Hard ceiling, matching the list endpoints. */
|
|
607
|
+
const REFERENCE_PAGE_MAX_LIMIT = 100;
|
|
608
|
+
/**
|
|
609
|
+
* Page a staged selection, which is a list in memory rather than a table.
|
|
610
|
+
*
|
|
611
|
+
* The cursor anchors on the last group of the previous page rather than on its
|
|
612
|
+
* index: the editor can reorder or drop entries between one page and the next,
|
|
613
|
+
* and an index would then silently skip or repeat. An anchor that is no longer
|
|
614
|
+
* in the selection means the entries it pointed past are gone, so the walk ends.
|
|
615
|
+
*/
|
|
616
|
+
function pageStagedGroups(groups, options = {}) {
|
|
617
|
+
const limit = Math.min(Math.max(options.limit ?? REFERENCE_PAGE_LIMIT, 1), REFERENCE_PAGE_MAX_LIMIT);
|
|
618
|
+
let start = 0;
|
|
619
|
+
if (options.cursor) {
|
|
620
|
+
const decoded = decodeCursor(options.cursor);
|
|
621
|
+
if (decoded.orderValue === STAGED_CURSOR_MARKER) {
|
|
622
|
+
const index = groups.indexOf(decoded.id);
|
|
623
|
+
if (index === -1) return { groups: [] };
|
|
624
|
+
start = index + 1;
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
const page = groups.slice(start, start + limit);
|
|
628
|
+
const last = page.at(-1);
|
|
629
|
+
return {
|
|
630
|
+
groups: page,
|
|
631
|
+
nextCursor: last && start + page.length < groups.length ? encodeCursor(STAGED_CURSOR_MARKER, last) : void 0
|
|
632
|
+
};
|
|
633
|
+
}
|
|
634
|
+
function isGroupList(value) {
|
|
635
|
+
return Array.isArray(value) && value.every((entry) => typeof entry === "string");
|
|
636
|
+
}
|
|
637
|
+
/** The staged selection inside a revision's data, if it carries one. */
|
|
638
|
+
function readStagedReferences(data) {
|
|
639
|
+
const staged = data?.[STAGED_REFERENCES_KEY];
|
|
640
|
+
if (typeof staged !== "object" || staged === null || Array.isArray(staged)) return void 0;
|
|
641
|
+
const result = {};
|
|
642
|
+
for (const [fieldSlug, groups] of Object.entries(staged)) if (isGroupList(groups)) result[fieldSlug] = groups;
|
|
643
|
+
return Object.keys(result).length > 0 ? result : void 0;
|
|
644
|
+
}
|
|
645
|
+
/**
|
|
646
|
+
* Fold a save's selections into whatever the previous draft staged. A save that
|
|
647
|
+
* names one reference field must not drop another field's pending selection, so
|
|
648
|
+
* fields absent from `incoming` keep their staged value.
|
|
649
|
+
*/
|
|
650
|
+
function mergeStagedReferences(base, incoming) {
|
|
651
|
+
return {
|
|
652
|
+
...readStagedReferences(base),
|
|
653
|
+
...incoming
|
|
654
|
+
};
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
//#endregion
|
|
658
|
+
export { pageStagedGroups as a, RelationRepository as c, mergeStagedReferences as i, REFERENCE_PAGE_MAX_LIMIT as n, readStagedReferences as o, STAGED_REFERENCES_KEY as r, REFERENCE_INSERT_BATCH_SIZE as s, REFERENCE_PAGE_LIMIT as t };
|
|
659
|
+
//# sourceMappingURL=staged-C36IWXff.mjs.map
|