emdash 0.40.1 → 0.41.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/action-token-CbKDcPJi.mjs +26 -0
- package/dist/action-token-CbKDcPJi.mjs.map +1 -0
- package/dist/activation-PtniBLt9.mjs +382 -0
- package/dist/activation-PtniBLt9.mjs.map +1 -0
- package/dist/adapters-C_Tf5x90.d.mts +171 -0
- package/dist/adapters-C_Tf5x90.d.mts.map +1 -0
- package/dist/allowed-origins-U1z4TdEZ.mjs +116 -0
- package/dist/allowed-origins-U1z4TdEZ.mjs.map +1 -0
- package/dist/api/route-utils.d.mts +4 -4
- package/dist/api/route-utils.mjs +46 -45
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +10 -10
- package/dist/api-CXwQkV_m.mjs +5122 -0
- package/dist/api-CXwQkV_m.mjs.map +1 -0
- package/dist/api-tokens-89WlohEN.mjs +166 -0
- package/dist/api-tokens-89WlohEN.mjs.map +1 -0
- package/dist/apply-Do3KNnUk.mjs +1659 -0
- package/dist/apply-Do3KNnUk.mjs.map +1 -0
- package/dist/approvals-CAX9Yw33.mjs +460 -0
- package/dist/approvals-CAX9Yw33.mjs.map +1 -0
- package/dist/artifact-fetch-B9W4CEST.mjs +659 -0
- package/dist/artifact-fetch-B9W4CEST.mjs.map +1 -0
- package/dist/astro/index.d.mts +14 -14
- package/dist/astro/index.mjs +20 -24
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +12 -12
- package/dist/astro/middleware/auth.mjs +10 -10
- package/dist/astro/middleware/media-usage-write-fence.mjs +5 -5
- package/dist/astro/middleware/redirect.mjs +7 -7
- package/dist/astro/middleware/request-context.mjs +3 -3
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +12 -12
- package/dist/astro/middleware.mjs +109 -106
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +14 -14
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +14 -14
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +7 -7
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +17 -17
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +17 -17
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +17 -17
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +23 -23
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +23 -23
- package/dist/astro/routes/api/admin/bylines/index.mjs +23 -23
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +18 -18
- package/dist/astro/routes/api/admin/comments/_id_.mjs +7 -7
- package/dist/astro/routes/api/admin/comments/bulk.mjs +17 -17
- package/dist/astro/routes/api/admin/comments/counts.mjs +7 -7
- package/dist/astro/routes/api/admin/comments/index.mjs +17 -17
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +6 -6
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +5 -5
- package/dist/astro/routes/api/admin/media-usage/activation.mjs +20 -20
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +22 -22
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +22 -22
- package/dist/astro/routes/api/admin/media-usage/progress.mjs +25 -25
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +31 -31
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +22 -22
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +22 -22
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +8 -8
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +8 -8
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +72 -68
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +7 -7
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +71 -67
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +72 -68
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +82 -78
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +72 -68
- package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +5 -5
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +71 -67
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +81 -77
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +71 -67
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +72 -68
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +83 -79
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +9 -9
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +74 -70
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/publisher-handle.mjs +7 -7
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +72 -68
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +71 -67
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +71 -67
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +5 -5
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +71 -67
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/_...path_.mjs +4 -4
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs +40 -40
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs +40 -40
- package/dist/astro/routes/api/admin/transfer/approvals/index.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/capabilities.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs +43 -43
- package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs +43 -43
- package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs +43 -43
- package/dist/astro/routes/api/admin/transfer/exports/index.mjs +44 -44
- package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs +44 -44
- package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs +44 -44
- package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs +44 -44
- package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/index.mjs +44 -44
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +5 -5
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +4 -4
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +15 -15
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +6 -6
- package/dist/astro/routes/api/admin/users/index.mjs +14 -14
- package/dist/astro/routes/api/auth/dev-bypass.mjs +6 -6
- package/dist/astro/routes/api/auth/invite/accept.mjs +4 -4
- package/dist/astro/routes/api/auth/invite/complete.mjs +18 -18
- package/dist/astro/routes/api/auth/invite/index.mjs +16 -16
- package/dist/astro/routes/api/auth/invite/register-options.mjs +17 -17
- package/dist/astro/routes/api/auth/logout.mjs +5 -5
- package/dist/astro/routes/api/auth/magic-link/send.mjs +18 -18
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +14 -14
- package/dist/astro/routes/api/auth/me.mjs +15 -15
- package/dist/astro/routes/api/auth/mode.mjs +5 -5
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +14 -14
- package/dist/astro/routes/api/auth/passkey/index.mjs +4 -4
- package/dist/astro/routes/api/auth/passkey/options.mjs +19 -19
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +17 -17
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +18 -18
- package/dist/astro/routes/api/auth/passkey/verify.mjs +18 -18
- package/dist/astro/routes/api/auth/signup/complete.mjs +18 -18
- package/dist/astro/routes/api/auth/signup/request.mjs +17 -17
- package/dist/astro/routes/api/auth/signup/verify.mjs +4 -4
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +12 -12
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +18 -18
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs +11 -11
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +31 -31
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts +1 -2
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +42 -53
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +34 -29
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +25 -24
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +18 -18
- package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/authors.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/index.mjs +15 -15
- package/dist/astro/routes/api/content/_collection_/trash.mjs +15 -15
- package/dist/astro/routes/api/dashboard.mjs +10 -9
- package/dist/astro/routes/api/dashboard.mjs.map +1 -1
- package/dist/astro/routes/api/dev/emails.mjs +5 -5
- package/dist/astro/routes/api/health.mjs +6 -6
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +23 -23
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +6 -6
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +13 -13
- package/dist/astro/routes/api/import/wordpress/execute.mjs +16 -16
- package/dist/astro/routes/api/import/wordpress/media.d.mts +12 -12
- package/dist/astro/routes/api/import/wordpress/media.mjs +19 -19
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +18 -18
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +13 -13
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +28 -28
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +23 -23
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +13 -13
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +34 -34
- package/dist/astro/routes/api/manifest.mjs +6 -6
- package/dist/astro/routes/api/mcp.mjs +91 -91
- package/dist/astro/routes/api/media/_id_/confirm.mjs +19 -19
- package/dist/astro/routes/api/media/_id_/replace.mjs +16 -16
- package/dist/astro/routes/api/media/_id_/upload.mjs +9 -9
- package/dist/astro/routes/api/media/_id_/usage.mjs +33 -33
- package/dist/astro/routes/api/media/_id_.mjs +31 -31
- package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs +6 -6
- package/dist/astro/routes/api/media/file/_...key_.mjs +9 -9
- package/dist/astro/routes/api/media/folders/_id_.mjs +16 -16
- package/dist/astro/routes/api/media/folders/index.mjs +16 -16
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +5 -5
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +5 -5
- package/dist/astro/routes/api/media/providers/index.mjs +5 -5
- package/dist/astro/routes/api/media/upload-url.mjs +18 -18
- package/dist/astro/routes/api/media.mjs +35 -35
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +17 -17
- package/dist/astro/routes/api/menus/_name_/items.mjs +17 -17
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +17 -17
- package/dist/astro/routes/api/menus/_name_/translations.mjs +17 -17
- package/dist/astro/routes/api/menus/_name_.mjs +17 -17
- package/dist/astro/routes/api/menus/index.mjs +17 -17
- package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/authorize.d.mts +2 -1
- package/dist/astro/routes/api/oauth/device/authorize.d.mts.map +1 -1
- package/dist/astro/routes/api/oauth/device/authorize.mjs +23 -9
- package/dist/astro/routes/api/oauth/device/authorize.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/device/code.mjs +11 -11
- package/dist/astro/routes/api/oauth/device/token.mjs +10 -10
- package/dist/astro/routes/api/oauth/register.mjs +5 -5
- package/dist/astro/routes/api/oauth/token/refresh.mjs +8 -8
- package/dist/astro/routes/api/oauth/token/revoke.mjs +8 -8
- package/dist/astro/routes/api/oauth/token.mjs +8 -8
- package/dist/astro/routes/api/openapi.json.mjs +20 -20
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +11 -11
- package/dist/astro/routes/api/redirects/404s/index.mjs +19 -19
- package/dist/astro/routes/api/redirects/404s/summary.mjs +19 -19
- package/dist/astro/routes/api/redirects/_id_.mjs +19 -19
- package/dist/astro/routes/api/redirects/index.mjs +19 -19
- package/dist/astro/routes/api/relations/_id_/index.mjs +34 -29
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/index.mjs +36 -31
- package/dist/astro/routes/api/relations/index.mjs.map +1 -1
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +5 -5
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +5 -5
- package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs +71 -67
- package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs +71 -67
- package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs.map +1 -1
- package/dist/astro/routes/api/schema/block-types/index.mjs +71 -67
- package/dist/astro/routes/api/schema/block-types/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +73 -69
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +71 -67
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +71 -67
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +71 -67
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +71 -67
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/reorder.mjs +71 -67
- package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +16 -16
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +71 -67
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +71 -67
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +19 -19
- package/dist/astro/routes/api/search/index.mjs +18 -18
- package/dist/astro/routes/api/search/rebuild.mjs +19 -19
- package/dist/astro/routes/api/search/stats.mjs +9 -9
- package/dist/astro/routes/api/search/suggest.mjs +18 -18
- package/dist/astro/routes/api/sections/_slug_.mjs +18 -18
- package/dist/astro/routes/api/sections/index.mjs +18 -18
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/export.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/index.mjs +8 -8
- package/dist/astro/routes/api/settings/email.mjs +6 -6
- package/dist/astro/routes/api/settings.mjs +21 -21
- package/dist/astro/routes/api/setup/admin-verify.mjs +19 -19
- package/dist/astro/routes/api/setup/admin.mjs +18 -18
- package/dist/astro/routes/api/setup/dev-bypass.mjs +45 -39
- package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-reset.mjs +4 -4
- package/dist/astro/routes/api/setup/index.mjs +50 -44
- package/dist/astro/routes/api/setup/index.mjs.map +1 -1
- package/dist/astro/routes/api/setup/status.mjs +6 -6
- package/dist/astro/routes/api/snapshot.mjs +8 -8
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +22 -22
- package/dist/astro/routes/api/taxonomies/_name_.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/bulk-tag.mjs +36 -35
- package/dist/astro/routes/api/taxonomies/bulk-tag.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +23 -23
- package/dist/astro/routes/api/themes/preview.mjs +6 -6
- package/dist/astro/routes/api/typegen.mjs +8 -8
- package/dist/astro/routes/api/visual-editing/action-token.mjs +6 -6
- package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs +19 -19
- package/dist/astro/routes/api/visual-editing/toolbar-labels.mjs +4 -4
- package/dist/astro/routes/api/well-known/auth.mjs +1 -1
- package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
- package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +16 -16
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +19 -19
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +19 -19
- package/dist/astro/routes/api/widget-areas/_name_.mjs +9 -9
- package/dist/astro/routes/api/widget-areas/index.mjs +19 -19
- package/dist/astro/routes/api/widget-components.mjs +5 -5
- package/dist/astro/routes/robots.txt.mjs +6 -6
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +9 -9
- package/dist/astro/routes/sitemap.xml.mjs +7 -7
- package/dist/astro/types.d.mts +24 -18
- package/dist/astro/types.d.mts.map +1 -1
- package/dist/audit-CrgmE9LE.mjs +127 -0
- package/dist/audit-CrgmE9LE.mjs.map +1 -0
- package/dist/auth/providers/github.d.mts +1 -1
- package/dist/auth/providers/google.d.mts +1 -1
- package/dist/authoritative-records-C2YzIdbu.mjs +5172 -0
- package/dist/authoritative-records-C2YzIdbu.mjs.map +1 -0
- package/dist/authorize-WgdKF8QY.mjs +49 -0
- package/dist/authorize-WgdKF8QY.mjs.map +1 -0
- package/dist/backup-Ck8_lMO3.mjs +246 -0
- package/dist/backup-Ck8_lMO3.mjs.map +1 -0
- package/dist/block-types-BQ90asVI.mjs +132 -0
- package/dist/block-types-BQ90asVI.mjs.map +1 -0
- package/dist/block-values-ACFqgB1D.mjs +175 -0
- package/dist/block-values-ACFqgB1D.mjs.map +1 -0
- package/dist/bundle-Db1iNMv_.mjs +667 -0
- package/dist/bundle-Db1iNMv_.mjs.map +1 -0
- package/dist/byline-BayaYGoj.mjs +909 -0
- package/dist/byline-BayaYGoj.mjs.map +1 -0
- package/dist/byline-fields-B8HH-35f.mjs +254 -0
- package/dist/byline-fields-B8HH-35f.mjs.map +1 -0
- package/dist/byline-fields-hMPjf6Eu.mjs +123 -0
- package/dist/byline-fields-hMPjf6Eu.mjs.map +1 -0
- package/dist/byline-registry-B_EK_TQf.mjs +406 -0
- package/dist/byline-registry-B_EK_TQf.mjs.map +1 -0
- package/dist/bylines-DFAaFXWi.mjs +214 -0
- package/dist/bylines-DFAaFXWi.mjs.map +1 -0
- package/dist/bylines-DkIxUxmr.mjs +232 -0
- package/dist/bylines-DkIxUxmr.mjs.map +1 -0
- package/dist/cache-DkvhQ8XE.mjs +108 -0
- package/dist/cache-DkvhQ8XE.mjs.map +1 -0
- package/dist/canonical-CcSuuTlH.mjs +174 -0
- package/dist/canonical-CcSuuTlH.mjs.map +1 -0
- package/dist/capture-triggers-DJEoOTOq.mjs +362 -0
- package/dist/capture-triggers-DJEoOTOq.mjs.map +1 -0
- package/dist/challenge-store-CvBl81AQ.mjs +51 -0
- package/dist/challenge-store-CvBl81AQ.mjs.map +1 -0
- package/dist/checksum-CClweQzI.mjs +162 -0
- package/dist/checksum-CClweQzI.mjs.map +1 -0
- package/dist/chrome-tags-D5caJwwp.mjs +24 -0
- package/dist/chrome-tags-D5caJwwp.mjs.map +1 -0
- package/dist/chunks-DwBaj8aT.mjs +25 -0
- package/dist/chunks-DwBaj8aT.mjs.map +1 -0
- package/dist/cli/index.mjs +374 -761
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +32 -32
- package/dist/client/index.mjs +2 -2
- package/dist/collection-deletion-CLCdXsnV.mjs +436 -0
- package/dist/collection-deletion-CLCdXsnV.mjs.map +1 -0
- package/dist/collection-deletion-processor-hNw8x01F.mjs +217 -0
- package/dist/collection-deletion-processor-hNw8x01F.mjs.map +1 -0
- package/dist/collection-slugs-cache-CUuiduLq.mjs +85 -0
- package/dist/collection-slugs-cache-CUuiduLq.mjs.map +1 -0
- package/dist/comment-D2uvL63j.mjs +313 -0
- package/dist/comment-D2uvL63j.mjs.map +1 -0
- package/dist/comment-reaction-DevUuzg4.mjs +85 -0
- package/dist/comment-reaction-DevUuzg4.mjs.map +1 -0
- package/dist/comments-Cq0s7_hO.mjs +195 -0
- package/dist/comments-Cq0s7_hO.mjs.map +1 -0
- package/dist/comments-M4EDYAHw.mjs +99 -0
- package/dist/comments-M4EDYAHw.mjs.map +1 -0
- package/dist/components-CuIGwXMs.mjs +108 -0
- package/dist/components-CuIGwXMs.mjs.map +1 -0
- package/dist/config-52Ea5IWt.d.mts +39 -0
- package/dist/config-52Ea5IWt.d.mts.map +1 -0
- package/dist/config-CCz3xOLc.mjs +242 -0
- package/dist/config-CCz3xOLc.mjs.map +1 -0
- package/dist/config-D3d5Qudq.d.mts +6669 -0
- package/dist/config-D3d5Qudq.d.mts.map +1 -0
- package/dist/content-CbnufDsM.mjs +2018 -0
- package/dist/content-CbnufDsM.mjs.map +1 -0
- package/dist/content-list-query-D_7B1FE5.d.mts +26 -0
- package/dist/content-list-query-D_7B1FE5.d.mts.map +1 -0
- package/dist/content-policy-CYu6K1KB.mjs +46 -0
- package/dist/content-policy-CYu6K1KB.mjs.map +1 -0
- package/dist/content-repair-DlDUgFGp.mjs +442 -0
- package/dist/content-repair-DlDUgFGp.mjs.map +1 -0
- package/dist/context-CGQLA1-a.mjs +1922 -0
- package/dist/context-CGQLA1-a.mjs.map +1 -0
- package/dist/cron-c4D5C5Fx.mjs +284 -0
- package/dist/cron-c4D5C5Fx.mjs.map +1 -0
- package/dist/dashboard-CBq9kmOn.mjs +151 -0
- package/dist/dashboard-CBq9kmOn.mjs.map +1 -0
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +1 -1
- package/dist/db/libsql-migrations.d.mts +1 -1
- package/dist/db/libsql-migrations.mjs +4 -4
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres-migrations.d.mts +1 -1
- package/dist/db/postgres-migrations.mjs +4 -4
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite-migrations.d.mts +1 -1
- package/dist/db/sqlite-migrations.mjs +4 -4
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/db/sqlite.mjs +1 -1
- package/dist/default-DPsys51U.mjs +81 -0
- package/dist/default-DPsys51U.mjs.map +1 -0
- package/dist/deferred-tasks-CZ7rzBdo.d.mts +9 -0
- package/dist/deferred-tasks-CZ7rzBdo.d.mts.map +1 -0
- package/dist/dev-typegen-HRxwLRcT.mjs +29 -0
- package/dist/dev-typegen-HRxwLRcT.mjs.map +1 -0
- package/dist/device-flow-OcSqE9uY.mjs +521 -0
- package/dist/device-flow-OcSqE9uY.mjs.map +1 -0
- package/dist/digest-DVZ--cE9.mjs +194 -0
- package/dist/digest-DVZ--cE9.mjs.map +1 -0
- package/dist/direct-executor-DyjAqkpT.mjs +104 -0
- package/dist/direct-executor-DyjAqkpT.mjs.map +1 -0
- package/dist/dist-FPR93_xf.mjs +810 -0
- package/dist/dist-FPR93_xf.mjs.map +1 -0
- package/dist/email-console-DyQIgEnz.mjs +50 -0
- package/dist/email-console-DyQIgEnz.mjs.map +1 -0
- package/dist/email-locale-BYb16rVd.mjs +25 -0
- package/dist/email-locale-BYb16rVd.mjs.map +1 -0
- package/dist/emdash-runtime-CrzxJFmF.mjs +4214 -0
- package/dist/emdash-runtime-CrzxJFmF.mjs.map +1 -0
- package/dist/enrich-DBtCncE2.mjs +194 -0
- package/dist/enrich-DBtCncE2.mjs.map +1 -0
- package/dist/entry-lock-BN5y4YbO.d.mts +4481 -0
- package/dist/entry-lock-BN5y4YbO.d.mts.map +1 -0
- package/dist/entry-lock-BaRBHCsH.mjs +1173 -0
- package/dist/entry-lock-BaRBHCsH.mjs.map +1 -0
- package/dist/entry-lock-C6NcnZPV.mjs +163 -0
- package/dist/entry-lock-C6NcnZPV.mjs.map +1 -0
- package/dist/entry-locks-BTyQLdbC.mjs +167 -0
- package/dist/entry-locks-BTyQLdbC.mjs.map +1 -0
- package/dist/error-BfsNNrIE.mjs +90 -0
- package/dist/error-BfsNNrIE.mjs.map +1 -0
- package/dist/errors-BN1QAnEY.mjs +460 -0
- package/dist/errors-BN1QAnEY.mjs.map +1 -0
- package/dist/errors-Bt3goF8I.mjs +120 -0
- package/dist/errors-Bt3goF8I.mjs.map +1 -0
- package/dist/escape-BveidMa2.mjs +9 -0
- package/dist/escape-BveidMa2.mjs.map +1 -0
- package/dist/fence-Bb_IbCxI.mjs +162 -0
- package/dist/fence-Bb_IbCxI.mjs.map +1 -0
- package/dist/field-defs-cache-CsZctvbu.mjs +77 -0
- package/dist/field-defs-cache-CsZctvbu.mjs.map +1 -0
- package/dist/field-map-6m9rF49t.mjs +83 -0
- package/dist/field-map-6m9rF49t.mjs.map +1 -0
- package/dist/focal-point-CZ3d1wK5.mjs +23 -0
- package/dist/focal-point-CZ3d1wK5.mjs.map +1 -0
- package/dist/fts-manager-CCaZTp8y.mjs +443 -0
- package/dist/fts-manager-CCaZTp8y.mjs.map +1 -0
- package/dist/gc-xowRjczI.mjs +75 -0
- package/dist/gc-xowRjczI.mjs.map +1 -0
- package/dist/hash-COVK27Pc.mjs +37 -0
- package/dist/hash-COVK27Pc.mjs.map +1 -0
- package/dist/hook-result-CYSk0XFe.d.mts +31 -0
- package/dist/hook-result-CYSk0XFe.d.mts.map +1 -0
- package/dist/hreflang-CChPV7jx.mjs +105 -0
- package/dist/hreflang-CChPV7jx.mjs.map +1 -0
- package/dist/hreflang-DRslq3QI.d.mts +50 -0
- package/dist/hreflang-DRslq3QI.d.mts.map +1 -0
- package/dist/http-route-dispatch-CAdp2onn.mjs +339 -0
- package/dist/http-route-dispatch-CAdp2onn.mjs.map +1 -0
- package/dist/identity-NVTOOQyq.mjs +35 -0
- package/dist/identity-NVTOOQyq.mjs.map +1 -0
- package/dist/import-wpSO2N0x.mjs +2020 -0
- package/dist/import-wpSO2N0x.mjs.map +1 -0
- package/dist/index-CDs2wq4X.d.mts +623 -0
- package/dist/index-CDs2wq4X.d.mts.map +1 -0
- package/dist/index.d.mts +24 -24
- package/dist/index.mjs +103 -101
- package/dist/install-finalization-D9R9R-W8.mjs +58 -0
- package/dist/install-finalization-D9R9R-W8.mjs.map +1 -0
- package/dist/keys-Bck6LBfF.mjs +61 -0
- package/dist/keys-Bck6LBfF.mjs.map +1 -0
- package/dist/kinds-CYmRESWj.mjs +974 -0
- package/dist/kinds-CYmRESWj.mjs.map +1 -0
- package/dist/lifecycle-C815ZQfV.mjs +25 -0
- package/dist/lifecycle-C815ZQfV.mjs.map +1 -0
- package/dist/load-D99axixL.mjs +28 -0
- package/dist/load-D99axixL.mjs.map +1 -0
- package/dist/loader-CrRPfkHS.mjs +1197 -0
- package/dist/loader-CrRPfkHS.mjs.map +1 -0
- package/dist/loops-DMKlygqX.mjs +203 -0
- package/dist/loops-DMKlygqX.mjs.map +1 -0
- package/dist/manifest-builder-BQzCHNgB.mjs +189 -0
- package/dist/manifest-builder-BQzCHNgB.mjs.map +1 -0
- package/dist/manifest-schema-Ci2gmd0u.mjs +492 -0
- package/dist/manifest-schema-Ci2gmd0u.mjs.map +1 -0
- package/dist/media/image-endpoint.mjs +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +4 -4
- package/dist/media/local-runtime.d.mts +14 -14
- package/dist/media/local-runtime.mjs +6 -6
- package/dist/media-BUQePMxP.mjs +373 -0
- package/dist/media-BUQePMxP.mjs.map +1 -0
- package/dist/media-DH8ibNlY.mjs +294 -0
- package/dist/media-DH8ibNlY.mjs.map +1 -0
- package/dist/media-OEIQ3bVc.mjs +408 -0
- package/dist/media-OEIQ3bVc.mjs.map +1 -0
- package/dist/media-allowlist-pYtaBA95.mjs +44 -0
- package/dist/media-allowlist-pYtaBA95.mjs.map +1 -0
- package/dist/media-folders-Bf8_s4de.mjs +210 -0
- package/dist/media-folders-Bf8_s4de.mjs.map +1 -0
- package/dist/media-url-C6klEuNd.mjs +43 -0
- package/dist/media-url-C6klEuNd.mjs.map +1 -0
- package/dist/media-usage-D7Y64m6v.mjs +1629 -0
- package/dist/media-usage-D7Y64m6v.mjs.map +1 -0
- package/dist/media-usage-activation-DrqbmgLA.mjs +78 -0
- package/dist/media-usage-activation-DrqbmgLA.mjs.map +1 -0
- package/dist/media-usage-work-DommYhYA.mjs +152 -0
- package/dist/media-usage-work-DommYhYA.mjs.map +1 -0
- package/dist/media-usage-work-HU63hNDu.mjs +586 -0
- package/dist/media-usage-work-HU63hNDu.mjs.map +1 -0
- package/dist/menus-BQfusWEC.mjs +3608 -0
- package/dist/menus-BQfusWEC.mjs.map +1 -0
- package/dist/menus-BtwjQt5s.mjs +753 -0
- package/dist/menus-BtwjQt5s.mjs.map +1 -0
- package/dist/menus-p_M1V7J_.mjs +139 -0
- package/dist/menus-p_M1V7J_.mjs.map +1 -0
- package/dist/migrations/index.d.mts +1 -1
- package/dist/migrations/index.mjs +3 -3
- package/dist/mime-C94qBG-P.mjs +36 -0
- package/dist/mime-C94qBG-P.mjs.map +1 -0
- package/dist/mode-DpYW3w6U.mjs +23 -0
- package/dist/mode-DpYW3w6U.mjs.map +1 -0
- package/dist/node-sqlite-compat-pWFw0lcc.mjs +46 -0
- package/dist/node-sqlite-compat-pWFw0lcc.mjs.map +1 -0
- package/dist/normalize-DduyxBjf.mjs +191 -0
- package/dist/normalize-DduyxBjf.mjs.map +1 -0
- package/dist/oauth-authorization-DAXsH1H9.mjs +274 -0
- package/dist/oauth-authorization-DAXsH1H9.mjs.map +1 -0
- package/dist/oauth-clients-DENiDQri.mjs +266 -0
- package/dist/oauth-clients-DENiDQri.mjs.map +1 -0
- package/dist/oauth-state-store-y8mEYVq9.mjs +50 -0
- package/dist/oauth-state-store-y8mEYVq9.mjs.map +1 -0
- package/dist/oauth-user-lookup-CtTYAy-O.mjs +26 -0
- package/dist/oauth-user-lookup-CtTYAy-O.mjs.map +1 -0
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/options-BYa1FgIM.d.mts +81 -0
- package/dist/options-BYa1FgIM.d.mts.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/page/index.mjs +5 -5
- package/dist/parse-CORGGhHf.mjs +81 -0
- package/dist/parse-CORGGhHf.mjs.map +1 -0
- package/dist/parse-avNM1xWV.d.mts +168 -0
- package/dist/parse-avNM1xWV.d.mts.map +1 -0
- package/dist/passkey-config-Dih5YeIS.mjs +46 -0
- package/dist/passkey-config-Dih5YeIS.mjs.map +1 -0
- package/dist/paths-d51RFm8M.mjs +77 -0
- package/dist/paths-d51RFm8M.mjs.map +1 -0
- package/dist/patterns-CoqlXUvk.mjs +145 -0
- package/dist/patterns-CoqlXUvk.mjs.map +1 -0
- package/dist/placeholder-D2aksPMF.d.mts +306 -0
- package/dist/placeholder-D2aksPMF.d.mts.map +1 -0
- package/dist/plan-DqeZKuaR.mjs +135 -0
- package/dist/plan-DqeZKuaR.mjs.map +1 -0
- package/dist/plugin-test-runtime.d.mts +14 -14
- package/dist/plugin-test-runtime.mjs +110 -107
- package/dist/plugin-types.d.mts +2 -2
- package/dist/plugin-utils.d.mts +12 -12
- package/dist/plugins/adapt-sandbox-entry.d.mts +12 -12
- package/dist/plugins/adapt-sandbox-entry.mjs +3 -3
- package/dist/plugins/host.d.mts +5 -5
- package/dist/plugins/host.mjs +42 -41
- package/dist/plugins-Bb7oqjQA.mjs +277 -0
- package/dist/plugins-Bb7oqjQA.mjs.map +1 -0
- package/dist/policy-BcEqut3n.mjs +45 -0
- package/dist/policy-BcEqut3n.mjs.map +1 -0
- package/dist/portable-text-DXE8ymtD.mjs +307 -0
- package/dist/portable-text-DXE8ymtD.mjs.map +1 -0
- package/dist/preview-DEDWbwA_.mjs +107 -0
- package/dist/preview-DEDWbwA_.mjs.map +1 -0
- package/dist/protocol-BJbTzvwl.d.mts +61 -0
- package/dist/protocol-BJbTzvwl.d.mts.map +1 -0
- package/dist/public-submission-D9c9S14m.mjs +250 -0
- package/dist/public-submission-D9c9S14m.mjs.map +1 -0
- package/dist/public-url-CIRe-2T6.mjs +101 -0
- package/dist/public-url-CIRe-2T6.mjs.map +1 -0
- package/dist/query-BzifXlPS.mjs +1156 -0
- package/dist/query-BzifXlPS.mjs.map +1 -0
- package/dist/query-OzMJ6vJP.mjs +41 -0
- package/dist/query-OzMJ6vJP.mjs.map +1 -0
- package/dist/rate-limit-Csp60Vik.mjs +120 -0
- package/dist/rate-limit-Csp60Vik.mjs.map +1 -0
- package/dist/receipt-B-aU4hpJ.mjs +43 -0
- package/dist/receipt-B-aU4hpJ.mjs.map +1 -0
- package/dist/redirect-CDSw1sU3.mjs +17 -0
- package/dist/redirect-CDSw1sU3.mjs.map +1 -0
- package/dist/redirect-D1ArbO85.mjs +411 -0
- package/dist/redirect-D1ArbO85.mjs.map +1 -0
- package/dist/redirects-BjTwDTsV.mjs +148 -0
- package/dist/redirects-BjTwDTsV.mjs.map +1 -0
- package/dist/redirects-Ck50kH3n.mjs +446 -0
- package/dist/redirects-Ck50kH3n.mjs.map +1 -0
- package/dist/registry/testing.mjs +3 -3
- package/dist/registry-CFcNCayZ.mjs +6754 -0
- package/dist/registry-CFcNCayZ.mjs.map +1 -0
- package/dist/relations-Cfaa1fDl.mjs +776 -0
- package/dist/relations-Cfaa1fDl.mjs.map +1 -0
- package/dist/request-cache-iHRlHx1d.mjs +104 -0
- package/dist/request-cache-iHRlHx1d.mjs.map +1 -0
- package/dist/request-context.d.mts +1 -1
- package/dist/request-meta-D47mqyev.mjs +141 -0
- package/dist/request-meta-D47mqyev.mjs.map +1 -0
- package/dist/resolve-BPE8sMvx.mjs +99 -0
- package/dist/resolve-BPE8sMvx.mjs.map +1 -0
- package/dist/resolve-C0s1E_fH.mjs +199 -0
- package/dist/resolve-C0s1E_fH.mjs.map +1 -0
- package/dist/revision-j1p4-bOj.mjs +302 -0
- package/dist/revision-j1p4-bOj.mjs.map +1 -0
- package/dist/route-wire-C9PJV9aL.mjs +197 -0
- package/dist/route-wire-C9PJV9aL.mjs.map +1 -0
- package/dist/routes-lyYw0mMf.mjs +272 -0
- package/dist/routes-lyYw0mMf.mjs.map +1 -0
- package/dist/runner-B3eyB9Gb.mjs +6121 -0
- package/dist/runner-B3eyB9Gb.mjs.map +1 -0
- package/dist/runner-DoYH2Jcu.d.mts +68 -0
- package/dist/runner-DoYH2Jcu.d.mts.map +1 -0
- package/dist/runtime.d.mts +13 -13
- package/dist/runtime.mjs +3 -3
- package/dist/schema-BAayK46S.mjs +13 -0
- package/dist/schema-BAayK46S.mjs.map +1 -0
- package/dist/schema-Gqcl-8G4.mjs +815 -0
- package/dist/schema-Gqcl-8G4.mjs.map +1 -0
- package/dist/scopes-BqPOKoKf.mjs +34 -0
- package/dist/scopes-BqPOKoKf.mjs.map +1 -0
- package/dist/search-YJKPIEV6.mjs +448 -0
- package/dist/search-YJKPIEV6.mjs.map +1 -0
- package/dist/sections-BR_e-wK5.mjs +346 -0
- package/dist/sections-BR_e-wK5.mjs.map +1 -0
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +37 -31
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.mjs +22 -21
- package/dist/seo/index.mjs.map +1 -1
- package/dist/seo-Dsj8hy3j.mjs +114 -0
- package/dist/seo-Dsj8hy3j.mjs.map +1 -0
- package/dist/seo-XvH4LNNp.mjs +133 -0
- package/dist/seo-XvH4LNNp.mjs.map +1 -0
- package/dist/service-BsVG05gS.mjs +150 -0
- package/dist/service-BsVG05gS.mjs.map +1 -0
- package/dist/session-user-DgKbYrlj.mjs +51 -0
- package/dist/session-user-DgKbYrlj.mjs.map +1 -0
- package/dist/settings-CNPUntkh.mjs +51 -0
- package/dist/settings-CNPUntkh.mjs.map +1 -0
- package/dist/settings-D5EHi0Tk.mjs +439 -0
- package/dist/settings-D5EHi0Tk.mjs.map +1 -0
- package/dist/settings-DSfE7wOa.mjs +61 -0
- package/dist/settings-DSfE7wOa.mjs.map +1 -0
- package/dist/setup-complete-B8W8sJ9v.mjs +26 -0
- package/dist/setup-complete-B8W8sJ9v.mjs.map +1 -0
- package/dist/setup-nonce-DnSBP260.mjs +25 -0
- package/dist/setup-nonce-DnSBP260.mjs.map +1 -0
- package/dist/site-settings-NGzdrt7O.mjs +50 -0
- package/dist/site-settings-NGzdrt7O.mjs.map +1 -0
- package/dist/site-url-D6JB7tLW.mjs +16 -0
- package/dist/site-url-D6JB7tLW.mjs.map +1 -0
- package/dist/snapshot-CdcwwWAf.mjs +414 -0
- package/dist/snapshot-CdcwwWAf.mjs.map +1 -0
- package/dist/ssrf-Dv0_tRpo.mjs +406 -0
- package/dist/ssrf-Dv0_tRpo.mjs.map +1 -0
- package/dist/stage-CUjhED3P.mjs +662 -0
- package/dist/stage-CUjhED3P.mjs.map +1 -0
- package/dist/staged-C36IWXff.mjs +659 -0
- package/dist/staged-C36IWXff.mjs.map +1 -0
- package/dist/state-CKouMCSY.mjs +153 -0
- package/dist/state-CKouMCSY.mjs.map +1 -0
- package/dist/status-lzyj4Uu7.mjs +30 -0
- package/dist/status-lzyj4Uu7.mjs.map +1 -0
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +1 -1
- package/dist/storage-query-B-cWcTjJ.d.mts +1594 -0
- package/dist/storage-query-B-cWcTjJ.d.mts.map +1 -0
- package/dist/tar-DsTXX6ch.mjs +449 -0
- package/dist/tar-DsTXX6ch.mjs.map +1 -0
- package/dist/target-DLQCwp_Z.mjs +27 -0
- package/dist/target-DLQCwp_Z.mjs.map +1 -0
- package/dist/taxonomies-BlAjr4BL.mjs +697 -0
- package/dist/taxonomies-BlAjr4BL.mjs.map +1 -0
- package/dist/taxonomies-Byyo7LOZ.mjs +939 -0
- package/dist/taxonomies-Byyo7LOZ.mjs.map +1 -0
- package/dist/taxonomy-CKDwM61Y.mjs +525 -0
- package/dist/taxonomy-CKDwM61Y.mjs.map +1 -0
- package/dist/tokens-BojXlk49.mjs +171 -0
- package/dist/tokens-BojXlk49.mjs.map +1 -0
- package/dist/transaction-DLPQWik1.mjs +29 -0
- package/dist/transaction-DLPQWik1.mjs.map +1 -0
- package/dist/transfer-XSTh2BCr.mjs +8706 -0
- package/dist/transfer-XSTh2BCr.mjs.map +1 -0
- package/dist/transfer-download-DkoCDA9d.mjs +33 -0
- package/dist/transfer-download-DkoCDA9d.mjs.map +1 -0
- package/dist/transfer-iQ26J-RT.mjs +166 -0
- package/dist/transfer-iQ26J-RT.mjs.map +1 -0
- package/dist/transformations-C7RQabKQ.mjs +196 -0
- package/dist/transformations-C7RQabKQ.mjs.map +1 -0
- package/dist/transport-D3RulfD6.mjs +136 -0
- package/dist/transport-D3RulfD6.mjs.map +1 -0
- package/dist/transport-DhlZlf4D.d.mts +42 -0
- package/dist/transport-DhlZlf4D.d.mts.map +1 -0
- package/dist/trusted-proxy-B6ECOZJc.mjs +51 -0
- package/dist/trusted-proxy-B6ECOZJc.mjs.map +1 -0
- package/dist/turnstile-lqUiY7lP.mjs +53 -0
- package/dist/turnstile-lqUiY7lP.mjs.map +1 -0
- package/dist/types-4Dn9bZhu.mjs +77 -0
- package/dist/types-4Dn9bZhu.mjs.map +1 -0
- package/dist/types-5LSo7PPx.d.mts +85 -0
- package/dist/types-5LSo7PPx.d.mts.map +1 -0
- package/dist/types-BQ3hwYJT.d.mts +896 -0
- package/dist/types-BQ3hwYJT.d.mts.map +1 -0
- package/dist/types-BYEk7qo3.d.mts +198 -0
- package/dist/types-BYEk7qo3.d.mts.map +1 -0
- package/dist/types-CJKsWVFR.mjs +199 -0
- package/dist/types-CJKsWVFR.mjs.map +1 -0
- package/dist/types-Ca_w8mmY.d.mts +363 -0
- package/dist/types-Ca_w8mmY.d.mts.map +1 -0
- package/dist/types-CkE41ZAG.mjs +18 -0
- package/dist/types-CkE41ZAG.mjs.map +1 -0
- package/dist/types-D0aJW2uR.d.mts +1641 -0
- package/dist/types-D0aJW2uR.d.mts.map +1 -0
- package/dist/types-DbpN4Qto.d.mts +372 -0
- package/dist/types-DbpN4Qto.d.mts.map +1 -0
- package/dist/types-ILDI1sdY.mjs +16 -0
- package/dist/types-ILDI1sdY.mjs.map +1 -0
- package/dist/types-OC5c-edM.mjs +22 -0
- package/dist/types-OC5c-edM.mjs.map +1 -0
- package/dist/types-aOOxRSx6.mjs +103 -0
- package/dist/types-aOOxRSx6.mjs.map +1 -0
- package/dist/types-m1WbUffD.d.mts +198 -0
- package/dist/types-m1WbUffD.d.mts.map +1 -0
- package/dist/types-uxLoPBio.d.mts +124 -0
- package/dist/types-uxLoPBio.d.mts.map +1 -0
- package/dist/types-we5uR-tV.d.mts +287 -0
- package/dist/types-we5uR-tV.d.mts.map +1 -0
- package/dist/upload-attempts-DduMy6B0.mjs +32 -0
- package/dist/upload-attempts-DduMy6B0.mjs.map +1 -0
- package/dist/url-pattern-B3EwxAAk.mjs +33 -0
- package/dist/url-pattern-B3EwxAAk.mjs.map +1 -0
- package/dist/user-ElwQjTQT.mjs +171 -0
- package/dist/user-ElwQjTQT.mjs.map +1 -0
- package/dist/utils-BlAXmfOG.mjs +439 -0
- package/dist/utils-BlAXmfOG.mjs.map +1 -0
- package/dist/validate-CH0X5b2c.d.mts +468 -0
- package/dist/validate-CH0X5b2c.d.mts.map +1 -0
- package/dist/validate-CfgRpcjA.mjs +492 -0
- package/dist/validate-CfgRpcjA.mjs.map +1 -0
- package/dist/validation-DvYJtv4k.mjs +218 -0
- package/dist/validation-DvYJtv4k.mjs.map +1 -0
- package/dist/version-DgYjhTud.mjs +9 -0
- package/dist/version-DgYjhTud.mjs.map +1 -0
- package/dist/version-Dq71scUb.mjs +7 -0
- package/dist/version-Dq71scUb.mjs.map +1 -0
- package/dist/widgets-ChFIj0be.mjs +126 -0
- package/dist/widgets-ChFIj0be.mjs.map +1 -0
- package/dist/wxr-taxonomies-CBZMp2YX.mjs +372 -0
- package/dist/wxr-taxonomies-CBZMp2YX.mjs.map +1 -0
- package/dist/wxr-taxonomies-DlKDpWN1.d.mts +34 -0
- package/dist/wxr-taxonomies-DlKDpWN1.d.mts.map +1 -0
- package/dist/zod-generator-DmTKI-Ig.mjs +426 -0
- package/dist/zod-generator-DmTKI-Ig.mjs.map +1 -0
- package/package.json +7 -6
- package/src/api/handlers/content.ts +593 -16
- package/src/api/handlers/device-flow.ts +74 -21
- package/src/api/handlers/manifest.ts +79 -5
- package/src/api/handlers/relations.ts +638 -157
- package/src/api/handlers/revision.ts +30 -0
- package/src/api/handlers/schema.ts +403 -1
- package/src/api/handlers/staged-references.ts +142 -0
- package/src/api/handlers/validate-references.ts +146 -0
- package/src/api/schemas/content.ts +13 -0
- package/src/api/schemas/relations.ts +54 -44
- package/src/api/schemas/schema.ts +14 -0
- package/src/astro/integration/routes.ts +15 -19
- package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/children.ts +11 -54
- package/src/astro/routes/api/content/[collection]/[id].ts +3 -1
- package/src/astro/routes/api/oauth/device/authorize.ts +33 -4
- package/src/astro/routes/api/relations/index.ts +4 -4
- package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +6 -2
- package/src/astro/types.ts +5 -0
- package/src/cli/commands/export-seed.ts +510 -89
- package/src/components/WidgetArea.astro +3 -2
- package/src/database/migrations/086_relations_structural.ts +197 -0
- package/src/database/migrations/087_reference_field_relations.ts +407 -0
- package/src/database/migrations/runner.ts +4 -0
- package/src/database/reference-backfill.ts +141 -0
- package/src/database/repositories/content.ts +43 -8
- package/src/database/repositories/relation.ts +620 -208
- package/src/database/repositories/revision.ts +16 -0
- package/src/database/repositories/types.ts +38 -0
- package/src/database/transaction.ts +12 -1
- package/src/database/types.ts +14 -5
- package/src/emdash-runtime.ts +86 -11
- package/src/index.ts +10 -0
- package/src/loader.ts +169 -22
- package/src/query.ts +455 -25
- package/src/references/field-map.ts +115 -0
- package/src/references/resolve.ts +160 -0
- package/src/references/staged.ts +117 -0
- package/src/references/types.ts +16 -0
- package/src/registry/artifact-fetch.ts +45 -271
- package/src/schema/registry.ts +99 -24
- package/src/schema/types.ts +58 -0
- package/src/schema/zod-generator.ts +67 -1
- package/src/seed/apply.ts +519 -62
- package/src/seed/types.ts +36 -2
- package/src/seed/validate.ts +78 -2
- package/src/transfer/analyze/unique-keys.ts +3 -12
- package/src/transfer/analyze/validate.ts +65 -39
- package/src/transfer/analyze/values.ts +12 -1
- package/src/transfer/export/readers.ts +12 -8
- package/src/transfer/format/columns.ts +26 -6
- package/src/transfer/format/kinds.ts +21 -5
- package/src/transfer/import/context.ts +8 -1
- package/src/transfer/ops/package-index.ts +1 -1
- package/dist/action-token-DYwe4Pk0.mjs +0 -26
- package/dist/action-token-DYwe4Pk0.mjs.map +0 -1
- package/dist/activation-LOkDM5WT.mjs +0 -382
- package/dist/activation-LOkDM5WT.mjs.map +0 -1
- package/dist/adapters-B64LbYcB.d.mts +0 -171
- package/dist/adapters-B64LbYcB.d.mts.map +0 -1
- package/dist/allowed-origins-CHB8oZNM.mjs +0 -116
- package/dist/allowed-origins-CHB8oZNM.mjs.map +0 -1
- package/dist/api-CuyNEHZG.mjs +0 -4718
- package/dist/api-CuyNEHZG.mjs.map +0 -1
- package/dist/api-tokens-s4i4aUp_.mjs +0 -166
- package/dist/api-tokens-s4i4aUp_.mjs.map +0 -1
- package/dist/apply-npY1TAhG.mjs +0 -1366
- package/dist/apply-npY1TAhG.mjs.map +0 -1
- package/dist/approvals-CqMfNxak.mjs +0 -460
- package/dist/approvals-CqMfNxak.mjs.map +0 -1
- package/dist/artifact-fetch-DZMOGZ3-.mjs +0 -818
- package/dist/artifact-fetch-DZMOGZ3-.mjs.map +0 -1
- package/dist/astro/routes/api/relations/_id_/translations.d.mts +0 -8
- package/dist/astro/routes/api/relations/_id_/translations.d.mts.map +0 -1
- package/dist/astro/routes/api/relations/_id_/translations.mjs +0 -47
- package/dist/astro/routes/api/relations/_id_/translations.mjs.map +0 -1
- package/dist/audit-RfCugiSB.mjs +0 -127
- package/dist/audit-RfCugiSB.mjs.map +0 -1
- package/dist/authoritative-records-CoJvBXAD.mjs +0 -5172
- package/dist/authoritative-records-CoJvBXAD.mjs.map +0 -1
- package/dist/authorize-seCifOMJ.mjs +0 -49
- package/dist/authorize-seCifOMJ.mjs.map +0 -1
- package/dist/backup-BQRj3afm.mjs +0 -246
- package/dist/backup-BQRj3afm.mjs.map +0 -1
- package/dist/block-type-registry-DUI_3KxT.mjs +0 -6709
- package/dist/block-type-registry-DUI_3KxT.mjs.map +0 -1
- package/dist/block-types-BmZmLmAD.mjs +0 -132
- package/dist/block-types-BmZmLmAD.mjs.map +0 -1
- package/dist/block-values-C_VIPr5t.mjs +0 -175
- package/dist/block-values-C_VIPr5t.mjs.map +0 -1
- package/dist/byline-DYmkXqvo.mjs +0 -909
- package/dist/byline-DYmkXqvo.mjs.map +0 -1
- package/dist/byline-fields-D28AT-Fh.mjs +0 -123
- package/dist/byline-fields-D28AT-Fh.mjs.map +0 -1
- package/dist/byline-registry-gnKscbQX.mjs +0 -406
- package/dist/byline-registry-gnKscbQX.mjs.map +0 -1
- package/dist/bylines-BPwJqoYH.mjs +0 -232
- package/dist/bylines-BPwJqoYH.mjs.map +0 -1
- package/dist/bylines-ukLaYpVZ.mjs +0 -214
- package/dist/bylines-ukLaYpVZ.mjs.map +0 -1
- package/dist/cache-m7UEkRFV.mjs +0 -108
- package/dist/cache-m7UEkRFV.mjs.map +0 -1
- package/dist/canonical-YhEQezjg.mjs +0 -174
- package/dist/canonical-YhEQezjg.mjs.map +0 -1
- package/dist/capture-triggers-kJyl_yyM.mjs +0 -362
- package/dist/capture-triggers-kJyl_yyM.mjs.map +0 -1
- package/dist/challenge-store-ppU6Uv13.mjs +0 -51
- package/dist/challenge-store-ppU6Uv13.mjs.map +0 -1
- package/dist/checksum-B2IINIlN.mjs +0 -162
- package/dist/checksum-B2IINIlN.mjs.map +0 -1
- package/dist/chrome-tags-DApCQSIk.mjs +0 -24
- package/dist/chrome-tags-DApCQSIk.mjs.map +0 -1
- package/dist/chunks-Dms7Uxbt.mjs +0 -25
- package/dist/chunks-Dms7Uxbt.mjs.map +0 -1
- package/dist/collection-deletion-BIm28mo3.mjs +0 -436
- package/dist/collection-deletion-BIm28mo3.mjs.map +0 -1
- package/dist/collection-deletion-processor-Br6rxs3u.mjs +0 -217
- package/dist/collection-deletion-processor-Br6rxs3u.mjs.map +0 -1
- package/dist/collection-slugs-cache-CjGk__zp.mjs +0 -85
- package/dist/collection-slugs-cache-CjGk__zp.mjs.map +0 -1
- package/dist/comment-CrBl22OF.mjs +0 -313
- package/dist/comment-CrBl22OF.mjs.map +0 -1
- package/dist/comment-reaction-JEQ2Fpd8.mjs +0 -85
- package/dist/comment-reaction-JEQ2Fpd8.mjs.map +0 -1
- package/dist/comments-2ah9du9y.mjs +0 -195
- package/dist/comments-2ah9du9y.mjs.map +0 -1
- package/dist/comments-fHZ8ON9O.mjs +0 -99
- package/dist/comments-fHZ8ON9O.mjs.map +0 -1
- package/dist/components-CXbq7CSM.mjs +0 -108
- package/dist/components-CXbq7CSM.mjs.map +0 -1
- package/dist/config-BjEm_3xL.d.mts +0 -6537
- package/dist/config-BjEm_3xL.d.mts.map +0 -1
- package/dist/config-IhybvkIQ.mjs +0 -242
- package/dist/config-IhybvkIQ.mjs.map +0 -1
- package/dist/config-Py43JK9r.d.mts +0 -39
- package/dist/config-Py43JK9r.d.mts.map +0 -1
- package/dist/content-DFaIEDj9.mjs +0 -2281
- package/dist/content-DFaIEDj9.mjs.map +0 -1
- package/dist/content-list-query-Dra4Dalc.d.mts +0 -26
- package/dist/content-list-query-Dra4Dalc.d.mts.map +0 -1
- package/dist/content-policy-DFNw91-d.mjs +0 -46
- package/dist/content-policy-DFNw91-d.mjs.map +0 -1
- package/dist/content-repair-Q8IUrpLL.mjs +0 -442
- package/dist/content-repair-Q8IUrpLL.mjs.map +0 -1
- package/dist/context-BV_7t-Ua.mjs +0 -1921
- package/dist/context-BV_7t-Ua.mjs.map +0 -1
- package/dist/cron-7DCJwPXq.mjs +0 -284
- package/dist/cron-7DCJwPXq.mjs.map +0 -1
- package/dist/dashboard-BP-iJqpd.mjs +0 -151
- package/dist/dashboard-BP-iJqpd.mjs.map +0 -1
- package/dist/default-DQ6vsviu.mjs +0 -81
- package/dist/default-DQ6vsviu.mjs.map +0 -1
- package/dist/deferred-tasks-BPxXUB4x.d.mts +0 -9
- package/dist/deferred-tasks-BPxXUB4x.d.mts.map +0 -1
- package/dist/dev-typegen-CZaPLl3V.mjs +0 -29
- package/dist/dev-typegen-CZaPLl3V.mjs.map +0 -1
- package/dist/device-flow-CRd6DXmW.mjs +0 -466
- package/dist/device-flow-CRd6DXmW.mjs.map +0 -1
- package/dist/digest-BarSh-pN.mjs +0 -194
- package/dist/digest-BarSh-pN.mjs.map +0 -1
- package/dist/direct-executor-D2lNadwo.mjs +0 -104
- package/dist/direct-executor-D2lNadwo.mjs.map +0 -1
- package/dist/dist-BNwANFJR.mjs +0 -810
- package/dist/dist-BNwANFJR.mjs.map +0 -1
- package/dist/email-console-bJn3ctqA.mjs +0 -50
- package/dist/email-console-bJn3ctqA.mjs.map +0 -1
- package/dist/email-locale-CN6WAMx0.mjs +0 -25
- package/dist/email-locale-CN6WAMx0.mjs.map +0 -1
- package/dist/emdash-runtime-CtfnZmPi.mjs +0 -4186
- package/dist/emdash-runtime-CtfnZmPi.mjs.map +0 -1
- package/dist/enrich-Dl3kZ-lP.mjs +0 -194
- package/dist/enrich-Dl3kZ-lP.mjs.map +0 -1
- package/dist/entry-lock-BJYdBfXb.mjs +0 -1097
- package/dist/entry-lock-BJYdBfXb.mjs.map +0 -1
- package/dist/entry-lock-Cf5OoIgN.d.mts +0 -4368
- package/dist/entry-lock-Cf5OoIgN.d.mts.map +0 -1
- package/dist/entry-lock-DHQOxN7R.mjs +0 -163
- package/dist/entry-lock-DHQOxN7R.mjs.map +0 -1
- package/dist/entry-locks-D0foLdjQ.mjs +0 -167
- package/dist/entry-locks-D0foLdjQ.mjs.map +0 -1
- package/dist/error-CfvOHP0M.mjs +0 -90
- package/dist/error-CfvOHP0M.mjs.map +0 -1
- package/dist/errors-BF0_LFhW.mjs +0 -460
- package/dist/errors-BF0_LFhW.mjs.map +0 -1
- package/dist/errors-DgE1zJGG.mjs +0 -120
- package/dist/errors-DgE1zJGG.mjs.map +0 -1
- package/dist/escape-CuaZhZvL.mjs +0 -9
- package/dist/escape-CuaZhZvL.mjs.map +0 -1
- package/dist/fence-CMDXJYc_.mjs +0 -162
- package/dist/fence-CMDXJYc_.mjs.map +0 -1
- package/dist/field-defs-cache-HIgBbqZZ.mjs +0 -77
- package/dist/field-defs-cache-HIgBbqZZ.mjs.map +0 -1
- package/dist/focal-point-Gr34o-4o.mjs +0 -23
- package/dist/focal-point-Gr34o-4o.mjs.map +0 -1
- package/dist/fts-manager-S-K0laoS.mjs +0 -443
- package/dist/fts-manager-S-K0laoS.mjs.map +0 -1
- package/dist/gc-DjKY0Ay1.mjs +0 -75
- package/dist/gc-DjKY0Ay1.mjs.map +0 -1
- package/dist/hash-SDAW6zC-.mjs +0 -37
- package/dist/hash-SDAW6zC-.mjs.map +0 -1
- package/dist/hook-result-B5bXDgS2.d.mts +0 -31
- package/dist/hook-result-B5bXDgS2.d.mts.map +0 -1
- package/dist/hreflang-CbVI4paR.mjs +0 -105
- package/dist/hreflang-CbVI4paR.mjs.map +0 -1
- package/dist/hreflang-D5uNnsGJ.d.mts +0 -50
- package/dist/hreflang-D5uNnsGJ.d.mts.map +0 -1
- package/dist/http-route-dispatch-BitqzwMy.mjs +0 -339
- package/dist/http-route-dispatch-BitqzwMy.mjs.map +0 -1
- package/dist/identity-Be5kzutJ.mjs +0 -35
- package/dist/identity-Be5kzutJ.mjs.map +0 -1
- package/dist/import-YzfKCaco.mjs +0 -2020
- package/dist/import-YzfKCaco.mjs.map +0 -1
- package/dist/index-D-hdtLe8.d.mts +0 -623
- package/dist/index-D-hdtLe8.d.mts.map +0 -1
- package/dist/install-finalization-DfM1fj5x.mjs +0 -58
- package/dist/install-finalization-DfM1fj5x.mjs.map +0 -1
- package/dist/keys-yxLm5l35.mjs +0 -61
- package/dist/keys-yxLm5l35.mjs.map +0 -1
- package/dist/kinds-CRu_T5T5.mjs +0 -961
- package/dist/kinds-CRu_T5T5.mjs.map +0 -1
- package/dist/lifecycle-BzeGPeQ-.mjs +0 -25
- package/dist/lifecycle-BzeGPeQ-.mjs.map +0 -1
- package/dist/load-XgJiE6_3.mjs +0 -28
- package/dist/load-XgJiE6_3.mjs.map +0 -1
- package/dist/loader-BzqeR1ZN.mjs +0 -1086
- package/dist/loader-BzqeR1ZN.mjs.map +0 -1
- package/dist/loops-BQSzv5Zn.mjs +0 -203
- package/dist/loops-BQSzv5Zn.mjs.map +0 -1
- package/dist/manifest-builder-BmSAOOEF.mjs +0 -189
- package/dist/manifest-builder-BmSAOOEF.mjs.map +0 -1
- package/dist/manifest-schema-CY3zng_M.mjs +0 -492
- package/dist/manifest-schema-CY3zng_M.mjs.map +0 -1
- package/dist/media-CPXTbb1R.mjs +0 -373
- package/dist/media-CPXTbb1R.mjs.map +0 -1
- package/dist/media-JXRWDhw3.mjs +0 -294
- package/dist/media-JXRWDhw3.mjs.map +0 -1
- package/dist/media-Pu1L6xir.mjs +0 -408
- package/dist/media-Pu1L6xir.mjs.map +0 -1
- package/dist/media-allowlist-BSoa9Vvm.mjs +0 -44
- package/dist/media-allowlist-BSoa9Vvm.mjs.map +0 -1
- package/dist/media-folders-BE0oo2eX.mjs +0 -210
- package/dist/media-folders-BE0oo2eX.mjs.map +0 -1
- package/dist/media-url-jArBpzIG.mjs +0 -43
- package/dist/media-url-jArBpzIG.mjs.map +0 -1
- package/dist/media-usage-De-zeR9E.mjs +0 -1629
- package/dist/media-usage-De-zeR9E.mjs.map +0 -1
- package/dist/media-usage-activation-HKp7zk7W.mjs +0 -78
- package/dist/media-usage-activation-HKp7zk7W.mjs.map +0 -1
- package/dist/media-usage-work-C2OZLCAd.mjs +0 -586
- package/dist/media-usage-work-C2OZLCAd.mjs.map +0 -1
- package/dist/media-usage-work-DwUNbgvS.mjs +0 -152
- package/dist/media-usage-work-DwUNbgvS.mjs.map +0 -1
- package/dist/menus-BM7BPLOb.mjs +0 -139
- package/dist/menus-BM7BPLOb.mjs.map +0 -1
- package/dist/menus-Cm68rsAq.mjs +0 -3608
- package/dist/menus-Cm68rsAq.mjs.map +0 -1
- package/dist/menus-ITeAbcIF.mjs +0 -753
- package/dist/menus-ITeAbcIF.mjs.map +0 -1
- package/dist/mime-ChLqYwDk.mjs +0 -36
- package/dist/mime-ChLqYwDk.mjs.map +0 -1
- package/dist/mode-CCuKXUci.mjs +0 -23
- package/dist/mode-CCuKXUci.mjs.map +0 -1
- package/dist/node-sqlite-compat-CONMsl-x.mjs +0 -46
- package/dist/node-sqlite-compat-CONMsl-x.mjs.map +0 -1
- package/dist/normalize-CO2P8-iE.mjs +0 -191
- package/dist/normalize-CO2P8-iE.mjs.map +0 -1
- package/dist/oauth-authorization-DlMIL5_h.mjs +0 -274
- package/dist/oauth-authorization-DlMIL5_h.mjs.map +0 -1
- package/dist/oauth-clients-Djq9r_KP.mjs +0 -266
- package/dist/oauth-clients-Djq9r_KP.mjs.map +0 -1
- package/dist/oauth-state-store-BbjnZXNC.mjs +0 -50
- package/dist/oauth-state-store-BbjnZXNC.mjs.map +0 -1
- package/dist/oauth-user-lookup-vue9a64A.mjs +0 -26
- package/dist/oauth-user-lookup-vue9a64A.mjs.map +0 -1
- package/dist/options-SQCHQCPH.d.mts +0 -81
- package/dist/options-SQCHQCPH.d.mts.map +0 -1
- package/dist/parse-CVgO-Qai.d.mts +0 -168
- package/dist/parse-CVgO-Qai.d.mts.map +0 -1
- package/dist/parse-DY6OD1j_.mjs +0 -81
- package/dist/parse-DY6OD1j_.mjs.map +0 -1
- package/dist/passkey-config-X_H8128a.mjs +0 -46
- package/dist/passkey-config-X_H8128a.mjs.map +0 -1
- package/dist/paths-JxokKIbr.mjs +0 -77
- package/dist/paths-JxokKIbr.mjs.map +0 -1
- package/dist/patterns-BhAvqO0S.mjs +0 -145
- package/dist/patterns-BhAvqO0S.mjs.map +0 -1
- package/dist/placeholder-MSEd8gty.d.mts +0 -306
- package/dist/placeholder-MSEd8gty.d.mts.map +0 -1
- package/dist/plan-xjcWrAah.mjs +0 -135
- package/dist/plan-xjcWrAah.mjs.map +0 -1
- package/dist/plugins-DUXUt8B9.mjs +0 -277
- package/dist/plugins-DUXUt8B9.mjs.map +0 -1
- package/dist/policy-CUvwAARc.mjs +0 -45
- package/dist/policy-CUvwAARc.mjs.map +0 -1
- package/dist/portable-text-5O_ZGUjB.mjs +0 -307
- package/dist/portable-text-5O_ZGUjB.mjs.map +0 -1
- package/dist/preview-CIUcPYr6.mjs +0 -107
- package/dist/preview-CIUcPYr6.mjs.map +0 -1
- package/dist/protocol-B97DZaFr.d.mts +0 -61
- package/dist/protocol-B97DZaFr.d.mts.map +0 -1
- package/dist/public-submission-BFBUrqst.mjs +0 -250
- package/dist/public-submission-BFBUrqst.mjs.map +0 -1
- package/dist/public-url-Bn7U0D7-.mjs +0 -101
- package/dist/public-url-Bn7U0D7-.mjs.map +0 -1
- package/dist/query-B48peoRT.mjs +0 -890
- package/dist/query-B48peoRT.mjs.map +0 -1
- package/dist/query-C4IH0uhR.mjs +0 -41
- package/dist/query-C4IH0uhR.mjs.map +0 -1
- package/dist/rate-limit-BZ6nybgc.mjs +0 -120
- package/dist/rate-limit-BZ6nybgc.mjs.map +0 -1
- package/dist/receipt-B4wJj5Jq.mjs +0 -43
- package/dist/receipt-B4wJj5Jq.mjs.map +0 -1
- package/dist/redirect-B29UjdUn.mjs +0 -411
- package/dist/redirect-B29UjdUn.mjs.map +0 -1
- package/dist/redirect-Cd1E7VUt.mjs +0 -17
- package/dist/redirect-Cd1E7VUt.mjs.map +0 -1
- package/dist/redirects-Ca2MPfEG.mjs +0 -446
- package/dist/redirects-Ca2MPfEG.mjs.map +0 -1
- package/dist/redirects-Cv9apQKj.mjs +0 -148
- package/dist/redirects-Cv9apQKj.mjs.map +0 -1
- package/dist/relation-M4NUCb0b.mjs +0 -334
- package/dist/relation-M4NUCb0b.mjs.map +0 -1
- package/dist/relations-CCif47Oq.mjs +0 -403
- package/dist/relations-CCif47Oq.mjs.map +0 -1
- package/dist/relations-CK9CYUyr.mjs +0 -310
- package/dist/relations-CK9CYUyr.mjs.map +0 -1
- package/dist/request-cache-DzLYKm_x.mjs +0 -104
- package/dist/request-cache-DzLYKm_x.mjs.map +0 -1
- package/dist/request-meta-sZXt3sRo.mjs +0 -141
- package/dist/request-meta-sZXt3sRo.mjs.map +0 -1
- package/dist/resolve-2WbQsCvT.mjs +0 -199
- package/dist/resolve-2WbQsCvT.mjs.map +0 -1
- package/dist/route-wire--1hLuACz.mjs +0 -197
- package/dist/route-wire--1hLuACz.mjs.map +0 -1
- package/dist/routes-vrR95WR6.mjs +0 -272
- package/dist/routes-vrR95WR6.mjs.map +0 -1
- package/dist/runner-1y4J9fJB.mjs +0 -5742
- package/dist/runner-1y4J9fJB.mjs.map +0 -1
- package/dist/runner-D5_LzKXI.d.mts +0 -68
- package/dist/runner-D5_LzKXI.d.mts.map +0 -1
- package/dist/schema-BABiRdsH.mjs +0 -13
- package/dist/schema-BABiRdsH.mjs.map +0 -1
- package/dist/schema-Du3MzCG0.mjs +0 -446
- package/dist/schema-Du3MzCG0.mjs.map +0 -1
- package/dist/scopes-Dbk-ElhT.mjs +0 -34
- package/dist/scopes-Dbk-ElhT.mjs.map +0 -1
- package/dist/search-Bt1PL1jf.mjs +0 -448
- package/dist/search-Bt1PL1jf.mjs.map +0 -1
- package/dist/sections-Ddptx_o9.mjs +0 -346
- package/dist/sections-Ddptx_o9.mjs.map +0 -1
- package/dist/seo-CZT2oLtT.mjs +0 -114
- package/dist/seo-CZT2oLtT.mjs.map +0 -1
- package/dist/seo-D5w3-Azy.mjs +0 -133
- package/dist/seo-D5w3-Azy.mjs.map +0 -1
- package/dist/service-DuykXPyW.mjs +0 -150
- package/dist/service-DuykXPyW.mjs.map +0 -1
- package/dist/session-user-BhaVp8w0.mjs +0 -51
- package/dist/session-user-BhaVp8w0.mjs.map +0 -1
- package/dist/settings-B4vDl1fK.mjs +0 -439
- package/dist/settings-B4vDl1fK.mjs.map +0 -1
- package/dist/settings-DYidIB26.mjs +0 -61
- package/dist/settings-DYidIB26.mjs.map +0 -1
- package/dist/settings-Dyj6v8C4.mjs +0 -51
- package/dist/settings-Dyj6v8C4.mjs.map +0 -1
- package/dist/setup-complete-bOogcHWG.mjs +0 -26
- package/dist/setup-complete-bOogcHWG.mjs.map +0 -1
- package/dist/setup-nonce-0EGuKM4s.mjs +0 -25
- package/dist/setup-nonce-0EGuKM4s.mjs.map +0 -1
- package/dist/site-settings-DOgRUoFX.mjs +0 -50
- package/dist/site-settings-DOgRUoFX.mjs.map +0 -1
- package/dist/site-url-BU_bbxwj.mjs +0 -16
- package/dist/site-url-BU_bbxwj.mjs.map +0 -1
- package/dist/snapshot-PawoX-WG.mjs +0 -414
- package/dist/snapshot-PawoX-WG.mjs.map +0 -1
- package/dist/ssrf-CJUnJymJ.mjs +0 -406
- package/dist/ssrf-CJUnJymJ.mjs.map +0 -1
- package/dist/stage-DgrBz_du.mjs +0 -662
- package/dist/stage-DgrBz_du.mjs.map +0 -1
- package/dist/state-DDiPySSG.mjs +0 -153
- package/dist/state-DDiPySSG.mjs.map +0 -1
- package/dist/status-DZKIG4a9.mjs +0 -30
- package/dist/status-DZKIG4a9.mjs.map +0 -1
- package/dist/storage-query-FXJH5pI8.d.mts +0 -1581
- package/dist/storage-query-FXJH5pI8.d.mts.map +0 -1
- package/dist/tar-_1AgTYFu.mjs +0 -449
- package/dist/tar-_1AgTYFu.mjs.map +0 -1
- package/dist/target-_7pn2Gbg.mjs +0 -27
- package/dist/target-_7pn2Gbg.mjs.map +0 -1
- package/dist/taxonomies-C1IwNe8Q.mjs +0 -697
- package/dist/taxonomies-C1IwNe8Q.mjs.map +0 -1
- package/dist/taxonomies-C_XMoRcX.mjs +0 -939
- package/dist/taxonomies-C_XMoRcX.mjs.map +0 -1
- package/dist/taxonomy-C3Fu1YeH.mjs +0 -525
- package/dist/taxonomy-C3Fu1YeH.mjs.map +0 -1
- package/dist/tokens-u78jETkX.mjs +0 -171
- package/dist/tokens-u78jETkX.mjs.map +0 -1
- package/dist/transaction-BcJO4Tmc.mjs +0 -29
- package/dist/transaction-BcJO4Tmc.mjs.map +0 -1
- package/dist/transfer-DIGvR9Af.mjs +0 -166
- package/dist/transfer-DIGvR9Af.mjs.map +0 -1
- package/dist/transfer-DgeCvHnj.mjs +0 -8675
- package/dist/transfer-DgeCvHnj.mjs.map +0 -1
- package/dist/transfer-download-Pml7RMio.mjs +0 -33
- package/dist/transfer-download-Pml7RMio.mjs.map +0 -1
- package/dist/transformations-9gfpwY65.mjs +0 -196
- package/dist/transformations-9gfpwY65.mjs.map +0 -1
- package/dist/transport-BIfH7_hx.d.mts +0 -42
- package/dist/transport-BIfH7_hx.d.mts.map +0 -1
- package/dist/transport-DKWIq53q.mjs +0 -136
- package/dist/transport-DKWIq53q.mjs.map +0 -1
- package/dist/trusted-proxy-tKiVtyTD.mjs +0 -51
- package/dist/trusted-proxy-tKiVtyTD.mjs.map +0 -1
- package/dist/turnstile-DpsoyOfg.mjs +0 -53
- package/dist/turnstile-DpsoyOfg.mjs.map +0 -1
- package/dist/types-B4sUC2p1.d.mts +0 -198
- package/dist/types-B4sUC2p1.d.mts.map +0 -1
- package/dist/types-B7Lmsh1E.d.mts +0 -887
- package/dist/types-B7Lmsh1E.d.mts.map +0 -1
- package/dist/types-BZakh7Ym.mjs +0 -22
- package/dist/types-BZakh7Ym.mjs.map +0 -1
- package/dist/types-B_CppEmv.d.mts +0 -264
- package/dist/types-B_CppEmv.d.mts.map +0 -1
- package/dist/types-BcrBrE6-.mjs +0 -159
- package/dist/types-BcrBrE6-.mjs.map +0 -1
- package/dist/types-BkUg2yHx.mjs +0 -92
- package/dist/types-BkUg2yHx.mjs.map +0 -1
- package/dist/types-CAZgq9fO.d.mts +0 -124
- package/dist/types-CAZgq9fO.d.mts.map +0 -1
- package/dist/types-Cd-O03VG.d.mts +0 -363
- package/dist/types-Cd-O03VG.d.mts.map +0 -1
- package/dist/types-Cr-Kg-3D.d.mts +0 -1641
- package/dist/types-Cr-Kg-3D.d.mts.map +0 -1
- package/dist/types-D2fvWd1i.d.mts +0 -359
- package/dist/types-D2fvWd1i.d.mts.map +0 -1
- package/dist/types-D7HUsguf.mjs +0 -77
- package/dist/types-D7HUsguf.mjs.map +0 -1
- package/dist/types-DA1Te3Oy.d.mts +0 -198
- package/dist/types-DA1Te3Oy.d.mts.map +0 -1
- package/dist/types-DhV6Q5bP.mjs +0 -18
- package/dist/types-DhV6Q5bP.mjs.map +0 -1
- package/dist/types-DnnVSl6Y.d.mts +0 -85
- package/dist/types-DnnVSl6Y.d.mts.map +0 -1
- package/dist/types-VT4-BugW.mjs +0 -16
- package/dist/types-VT4-BugW.mjs.map +0 -1
- package/dist/upload-attempts-B68ZGNu9.mjs +0 -32
- package/dist/upload-attempts-B68ZGNu9.mjs.map +0 -1
- package/dist/url-pattern-CCeZMGOh.mjs +0 -33
- package/dist/url-pattern-CCeZMGOh.mjs.map +0 -1
- package/dist/user-DDSL-sGw.mjs +0 -171
- package/dist/user-DDSL-sGw.mjs.map +0 -1
- package/dist/utils-DdhmO9w9.mjs +0 -439
- package/dist/utils-DdhmO9w9.mjs.map +0 -1
- package/dist/validate-CHosPEhs.mjs +0 -453
- package/dist/validate-CHosPEhs.mjs.map +0 -1
- package/dist/validate-CM79QXYE.d.mts +0 -432
- package/dist/validate-CM79QXYE.d.mts.map +0 -1
- package/dist/validation-BFecQczG.mjs +0 -218
- package/dist/validation-BFecQczG.mjs.map +0 -1
- package/dist/version-BRZXVifl.mjs +0 -9
- package/dist/version-BRZXVifl.mjs.map +0 -1
- package/dist/version-DXsxRrob.mjs +0 -7
- package/dist/version-DXsxRrob.mjs.map +0 -1
- package/dist/widgets-WdV72brA.mjs +0 -126
- package/dist/widgets-WdV72brA.mjs.map +0 -1
- package/dist/wxr-taxonomies-BHTdqkmZ.d.mts +0 -34
- package/dist/wxr-taxonomies-BHTdqkmZ.d.mts.map +0 -1
- package/dist/wxr-taxonomies-DP6ESgMN.mjs +0 -372
- package/dist/wxr-taxonomies-DP6ESgMN.mjs.map +0 -1
- package/dist/zod-generator-D6uE4WiS.mjs +0 -389
- package/dist/zod-generator-D6uE4WiS.mjs.map +0 -1
- package/src/astro/routes/api/relations/[id]/translations.ts +0 -33
- /package/dist/{api-tokens-CE1ECIg0.mjs → api-tokens-FaG1zPsj.mjs} +0 -0
- /package/dist/{ssrf-DpBH7aOt.mjs → ssrf-DZOt8Qof.mjs} +0 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
//#region src/transfer/errors.ts
|
|
4
|
+
/**
|
|
5
|
+
* Stable error codes for site transfer (export, analysis, import).
|
|
6
|
+
*
|
|
7
|
+
* Every code is `SCREAMING_SNAKE_CASE` with the `TRANSFER_` prefix and has a
|
|
8
|
+
* fixed HTTP status. `mapErrorStatus` in `api/errors.ts` consults
|
|
9
|
+
* {@link transferErrorStatus} first, so handlers can return these codes in an
|
|
10
|
+
* `ApiResult` and `unwrapResult` picks the right status.
|
|
11
|
+
*/
|
|
12
|
+
const TransferErrorCode = {
|
|
13
|
+
TRANSFER_IMPORT_IN_PROGRESS: "TRANSFER_IMPORT_IN_PROGRESS",
|
|
14
|
+
TRANSFER_FENCE_CHECK_FAILED: "TRANSFER_FENCE_CHECK_FAILED",
|
|
15
|
+
TRANSFER_EXPORT_CONCURRENT_WRITES: "TRANSFER_EXPORT_CONCURRENT_WRITES",
|
|
16
|
+
TRANSFER_OPERATION_NOT_FOUND: "TRANSFER_OPERATION_NOT_FOUND",
|
|
17
|
+
TRANSFER_INVALID_STATE: "TRANSFER_INVALID_STATE",
|
|
18
|
+
TRANSFER_LEASE_ACTIVE: "TRANSFER_LEASE_ACTIVE",
|
|
19
|
+
TRANSFER_LEASE_LOST: "TRANSFER_LEASE_LOST",
|
|
20
|
+
TRANSFER_RUNTIME_MISMATCH: "TRANSFER_RUNTIME_MISMATCH",
|
|
21
|
+
TRANSFER_IDEMPOTENCY_CONFLICT: "TRANSFER_IDEMPOTENCY_CONFLICT",
|
|
22
|
+
TRANSFER_TARGET_NOT_EMPTY: "TRANSFER_TARGET_NOT_EMPTY",
|
|
23
|
+
TRANSFER_EXPIRED: "TRANSFER_EXPIRED",
|
|
24
|
+
TRANSFER_MANIFEST_INVALID: "TRANSFER_MANIFEST_INVALID",
|
|
25
|
+
TRANSFER_UNSUPPORTED_FORMAT: "TRANSFER_UNSUPPORTED_FORMAT",
|
|
26
|
+
TRANSFER_UNSUPPORTED_FEATURE: "TRANSFER_UNSUPPORTED_FEATURE",
|
|
27
|
+
TRANSFER_PATH_INVALID: "TRANSFER_PATH_INVALID",
|
|
28
|
+
TRANSFER_FILE_NOT_DECLARED: "TRANSFER_FILE_NOT_DECLARED",
|
|
29
|
+
TRANSFER_FILE_MISSING: "TRANSFER_FILE_MISSING",
|
|
30
|
+
TRANSFER_FILE_SIZE_MISMATCH: "TRANSFER_FILE_SIZE_MISMATCH",
|
|
31
|
+
TRANSFER_FILE_DIGEST_MISMATCH: "TRANSFER_FILE_DIGEST_MISMATCH",
|
|
32
|
+
TRANSFER_CONTAINER_INVALID: "TRANSFER_CONTAINER_INVALID",
|
|
33
|
+
TRANSFER_LIMIT_EXCEEDED: "TRANSFER_LIMIT_EXCEEDED",
|
|
34
|
+
TRANSFER_RECORD_INVALID: "TRANSFER_RECORD_INVALID",
|
|
35
|
+
TRANSFER_REFERENCE_INVALID: "TRANSFER_REFERENCE_INVALID",
|
|
36
|
+
TRANSFER_MEDIA_REF_INVALID: "TRANSFER_MEDIA_REF_INVALID",
|
|
37
|
+
TRANSFER_MEDIA_BLOB_MISSING: "TRANSFER_MEDIA_BLOB_MISSING",
|
|
38
|
+
TRANSFER_SCHEMA_UNCLASSIFIED: "TRANSFER_SCHEMA_UNCLASSIFIED",
|
|
39
|
+
TRANSFER_PACKAGE_DIGEST_MISMATCH: "TRANSFER_PACKAGE_DIGEST_MISMATCH",
|
|
40
|
+
TRANSFER_PLAN_DIGEST_MISMATCH: "TRANSFER_PLAN_DIGEST_MISMATCH",
|
|
41
|
+
TRANSFER_PLAN_BLOCKED: "TRANSFER_PLAN_BLOCKED",
|
|
42
|
+
TRANSFER_DECISIONS_INVALID: "TRANSFER_DECISIONS_INVALID",
|
|
43
|
+
TRANSFER_VERIFICATION_FAILED: "TRANSFER_VERIFICATION_FAILED",
|
|
44
|
+
TRANSFER_APPROVAL_REQUIRED: "TRANSFER_APPROVAL_REQUIRED",
|
|
45
|
+
TRANSFER_APPROVAL_INVALID: "TRANSFER_APPROVAL_INVALID",
|
|
46
|
+
TRANSFER_STORAGE_ERROR: "TRANSFER_STORAGE_ERROR",
|
|
47
|
+
TRANSFER_EXPORT_ERROR: "TRANSFER_EXPORT_ERROR",
|
|
48
|
+
TRANSFER_ANALYZE_ERROR: "TRANSFER_ANALYZE_ERROR",
|
|
49
|
+
TRANSFER_IMPORT_ERROR: "TRANSFER_IMPORT_ERROR"
|
|
50
|
+
};
|
|
51
|
+
const TRANSFER_ERROR_STATUS = Object.freeze({
|
|
52
|
+
TRANSFER_IMPORT_IN_PROGRESS: 503,
|
|
53
|
+
TRANSFER_FENCE_CHECK_FAILED: 503,
|
|
54
|
+
TRANSFER_EXPORT_CONCURRENT_WRITES: 409,
|
|
55
|
+
TRANSFER_OPERATION_NOT_FOUND: 404,
|
|
56
|
+
TRANSFER_INVALID_STATE: 409,
|
|
57
|
+
TRANSFER_LEASE_ACTIVE: 409,
|
|
58
|
+
TRANSFER_LEASE_LOST: 409,
|
|
59
|
+
TRANSFER_RUNTIME_MISMATCH: 409,
|
|
60
|
+
TRANSFER_IDEMPOTENCY_CONFLICT: 409,
|
|
61
|
+
TRANSFER_TARGET_NOT_EMPTY: 409,
|
|
62
|
+
TRANSFER_EXPIRED: 410,
|
|
63
|
+
TRANSFER_MANIFEST_INVALID: 422,
|
|
64
|
+
TRANSFER_UNSUPPORTED_FORMAT: 422,
|
|
65
|
+
TRANSFER_UNSUPPORTED_FEATURE: 422,
|
|
66
|
+
TRANSFER_PATH_INVALID: 422,
|
|
67
|
+
TRANSFER_FILE_NOT_DECLARED: 422,
|
|
68
|
+
TRANSFER_FILE_MISSING: 422,
|
|
69
|
+
TRANSFER_FILE_SIZE_MISMATCH: 422,
|
|
70
|
+
TRANSFER_FILE_DIGEST_MISMATCH: 422,
|
|
71
|
+
TRANSFER_CONTAINER_INVALID: 422,
|
|
72
|
+
TRANSFER_LIMIT_EXCEEDED: 413,
|
|
73
|
+
TRANSFER_RECORD_INVALID: 422,
|
|
74
|
+
TRANSFER_REFERENCE_INVALID: 422,
|
|
75
|
+
TRANSFER_MEDIA_REF_INVALID: 422,
|
|
76
|
+
TRANSFER_MEDIA_BLOB_MISSING: 422,
|
|
77
|
+
TRANSFER_SCHEMA_UNCLASSIFIED: 500,
|
|
78
|
+
TRANSFER_PACKAGE_DIGEST_MISMATCH: 409,
|
|
79
|
+
TRANSFER_PLAN_DIGEST_MISMATCH: 409,
|
|
80
|
+
TRANSFER_PLAN_BLOCKED: 409,
|
|
81
|
+
TRANSFER_DECISIONS_INVALID: 422,
|
|
82
|
+
TRANSFER_VERIFICATION_FAILED: 422,
|
|
83
|
+
TRANSFER_APPROVAL_REQUIRED: 403,
|
|
84
|
+
TRANSFER_APPROVAL_INVALID: 403,
|
|
85
|
+
TRANSFER_STORAGE_ERROR: 500,
|
|
86
|
+
TRANSFER_EXPORT_ERROR: 500,
|
|
87
|
+
TRANSFER_ANALYZE_ERROR: 500,
|
|
88
|
+
TRANSFER_IMPORT_ERROR: 500
|
|
89
|
+
});
|
|
90
|
+
function isTransferErrorCode(code) {
|
|
91
|
+
return code !== void 0 && Object.hasOwn(TRANSFER_ERROR_STATUS, code);
|
|
92
|
+
}
|
|
93
|
+
function transferErrorStatus(code) {
|
|
94
|
+
return isTransferErrorCode(code) ? TRANSFER_ERROR_STATUS[code] : void 0;
|
|
95
|
+
}
|
|
96
|
+
const transferErrorDetailSchema = z.record(z.string(), z.union([
|
|
97
|
+
z.string(),
|
|
98
|
+
z.number(),
|
|
99
|
+
z.boolean(),
|
|
100
|
+
z.null()
|
|
101
|
+
]));
|
|
102
|
+
var TransferError = class extends Error {
|
|
103
|
+
code;
|
|
104
|
+
status;
|
|
105
|
+
detail;
|
|
106
|
+
constructor(code, message, options = {}) {
|
|
107
|
+
super(message, options.cause === void 0 ? void 0 : { cause: options.cause });
|
|
108
|
+
this.name = "TransferError";
|
|
109
|
+
this.code = code;
|
|
110
|
+
this.status = TRANSFER_ERROR_STATUS[code];
|
|
111
|
+
this.detail = options.detail;
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
function isTransferError(error) {
|
|
115
|
+
return error instanceof TransferError;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
//#endregion
|
|
119
|
+
export { transferErrorStatus as a, transferErrorDetailSchema as i, TransferErrorCode as n, isTransferError as r, TransferError as t };
|
|
120
|
+
//# sourceMappingURL=errors-Bt3goF8I.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors-Bt3goF8I.mjs","names":[],"sources":["../src/transfer/errors.ts"],"sourcesContent":["/**\n * Stable error codes for site transfer (export, analysis, import).\n *\n * Every code is `SCREAMING_SNAKE_CASE` with the `TRANSFER_` prefix and has a\n * fixed HTTP status. `mapErrorStatus` in `api/errors.ts` consults\n * {@link transferErrorStatus} first, so handlers can return these codes in an\n * `ApiResult` and `unwrapResult` picks the right status.\n */\n\nimport { z } from \"zod\";\n\nexport const TransferErrorCode = {\n\tTRANSFER_IMPORT_IN_PROGRESS: \"TRANSFER_IMPORT_IN_PROGRESS\",\n\tTRANSFER_FENCE_CHECK_FAILED: \"TRANSFER_FENCE_CHECK_FAILED\",\n\tTRANSFER_EXPORT_CONCURRENT_WRITES: \"TRANSFER_EXPORT_CONCURRENT_WRITES\",\n\tTRANSFER_OPERATION_NOT_FOUND: \"TRANSFER_OPERATION_NOT_FOUND\",\n\tTRANSFER_INVALID_STATE: \"TRANSFER_INVALID_STATE\",\n\tTRANSFER_LEASE_ACTIVE: \"TRANSFER_LEASE_ACTIVE\",\n\tTRANSFER_LEASE_LOST: \"TRANSFER_LEASE_LOST\",\n\tTRANSFER_RUNTIME_MISMATCH: \"TRANSFER_RUNTIME_MISMATCH\",\n\tTRANSFER_IDEMPOTENCY_CONFLICT: \"TRANSFER_IDEMPOTENCY_CONFLICT\",\n\tTRANSFER_TARGET_NOT_EMPTY: \"TRANSFER_TARGET_NOT_EMPTY\",\n\tTRANSFER_EXPIRED: \"TRANSFER_EXPIRED\",\n\tTRANSFER_MANIFEST_INVALID: \"TRANSFER_MANIFEST_INVALID\",\n\tTRANSFER_UNSUPPORTED_FORMAT: \"TRANSFER_UNSUPPORTED_FORMAT\",\n\tTRANSFER_UNSUPPORTED_FEATURE: \"TRANSFER_UNSUPPORTED_FEATURE\",\n\tTRANSFER_PATH_INVALID: \"TRANSFER_PATH_INVALID\",\n\tTRANSFER_FILE_NOT_DECLARED: \"TRANSFER_FILE_NOT_DECLARED\",\n\tTRANSFER_FILE_MISSING: \"TRANSFER_FILE_MISSING\",\n\tTRANSFER_FILE_SIZE_MISMATCH: \"TRANSFER_FILE_SIZE_MISMATCH\",\n\tTRANSFER_FILE_DIGEST_MISMATCH: \"TRANSFER_FILE_DIGEST_MISMATCH\",\n\tTRANSFER_CONTAINER_INVALID: \"TRANSFER_CONTAINER_INVALID\",\n\tTRANSFER_LIMIT_EXCEEDED: \"TRANSFER_LIMIT_EXCEEDED\",\n\tTRANSFER_RECORD_INVALID: \"TRANSFER_RECORD_INVALID\",\n\tTRANSFER_REFERENCE_INVALID: \"TRANSFER_REFERENCE_INVALID\",\n\tTRANSFER_MEDIA_REF_INVALID: \"TRANSFER_MEDIA_REF_INVALID\",\n\tTRANSFER_MEDIA_BLOB_MISSING: \"TRANSFER_MEDIA_BLOB_MISSING\",\n\tTRANSFER_SCHEMA_UNCLASSIFIED: \"TRANSFER_SCHEMA_UNCLASSIFIED\",\n\tTRANSFER_PACKAGE_DIGEST_MISMATCH: \"TRANSFER_PACKAGE_DIGEST_MISMATCH\",\n\tTRANSFER_PLAN_DIGEST_MISMATCH: \"TRANSFER_PLAN_DIGEST_MISMATCH\",\n\tTRANSFER_PLAN_BLOCKED: \"TRANSFER_PLAN_BLOCKED\",\n\tTRANSFER_DECISIONS_INVALID: \"TRANSFER_DECISIONS_INVALID\",\n\tTRANSFER_VERIFICATION_FAILED: \"TRANSFER_VERIFICATION_FAILED\",\n\tTRANSFER_APPROVAL_REQUIRED: \"TRANSFER_APPROVAL_REQUIRED\",\n\tTRANSFER_APPROVAL_INVALID: \"TRANSFER_APPROVAL_INVALID\",\n\tTRANSFER_STORAGE_ERROR: \"TRANSFER_STORAGE_ERROR\",\n\tTRANSFER_EXPORT_ERROR: \"TRANSFER_EXPORT_ERROR\",\n\tTRANSFER_ANALYZE_ERROR: \"TRANSFER_ANALYZE_ERROR\",\n\tTRANSFER_IMPORT_ERROR: \"TRANSFER_IMPORT_ERROR\",\n} as const;\n\nexport type TransferErrorCode = (typeof TransferErrorCode)[keyof typeof TransferErrorCode];\n\nexport const TRANSFER_ERROR_STATUS: Readonly<Record<TransferErrorCode, number>> = Object.freeze({\n\tTRANSFER_IMPORT_IN_PROGRESS: 503,\n\tTRANSFER_FENCE_CHECK_FAILED: 503,\n\tTRANSFER_EXPORT_CONCURRENT_WRITES: 409,\n\tTRANSFER_OPERATION_NOT_FOUND: 404,\n\tTRANSFER_INVALID_STATE: 409,\n\tTRANSFER_LEASE_ACTIVE: 409,\n\tTRANSFER_LEASE_LOST: 409,\n\tTRANSFER_RUNTIME_MISMATCH: 409,\n\tTRANSFER_IDEMPOTENCY_CONFLICT: 409,\n\tTRANSFER_TARGET_NOT_EMPTY: 409,\n\tTRANSFER_EXPIRED: 410,\n\tTRANSFER_MANIFEST_INVALID: 422,\n\tTRANSFER_UNSUPPORTED_FORMAT: 422,\n\tTRANSFER_UNSUPPORTED_FEATURE: 422,\n\tTRANSFER_PATH_INVALID: 422,\n\tTRANSFER_FILE_NOT_DECLARED: 422,\n\tTRANSFER_FILE_MISSING: 422,\n\tTRANSFER_FILE_SIZE_MISMATCH: 422,\n\tTRANSFER_FILE_DIGEST_MISMATCH: 422,\n\tTRANSFER_CONTAINER_INVALID: 422,\n\tTRANSFER_LIMIT_EXCEEDED: 413,\n\tTRANSFER_RECORD_INVALID: 422,\n\tTRANSFER_REFERENCE_INVALID: 422,\n\tTRANSFER_MEDIA_REF_INVALID: 422,\n\tTRANSFER_MEDIA_BLOB_MISSING: 422,\n\tTRANSFER_SCHEMA_UNCLASSIFIED: 500,\n\tTRANSFER_PACKAGE_DIGEST_MISMATCH: 409,\n\tTRANSFER_PLAN_DIGEST_MISMATCH: 409,\n\tTRANSFER_PLAN_BLOCKED: 409,\n\tTRANSFER_DECISIONS_INVALID: 422,\n\tTRANSFER_VERIFICATION_FAILED: 422,\n\tTRANSFER_APPROVAL_REQUIRED: 403,\n\tTRANSFER_APPROVAL_INVALID: 403,\n\tTRANSFER_STORAGE_ERROR: 500,\n\tTRANSFER_EXPORT_ERROR: 500,\n\tTRANSFER_ANALYZE_ERROR: 500,\n\tTRANSFER_IMPORT_ERROR: 500,\n});\n\nexport function isTransferErrorCode(code: string | undefined): code is TransferErrorCode {\n\treturn code !== undefined && Object.hasOwn(TRANSFER_ERROR_STATUS, code);\n}\n\nexport function transferErrorStatus(code: string | undefined): number | undefined {\n\treturn isTransferErrorCode(code) ? TRANSFER_ERROR_STATUS[code] : undefined;\n}\n\n/**\n * JSON-safe, bounded detail attached to a transfer error. Never put record\n * contents, credentials, or storage keys here: details reach API clients and\n * operation rows.\n */\nexport type TransferErrorDetail = Readonly<Record<string, string | number | boolean | null>>;\n\nexport const transferErrorDetailSchema = z.record(\n\tz.string(),\n\tz.union([z.string(), z.number(), z.boolean(), z.null()]),\n);\n\nexport class TransferError extends Error {\n\treadonly code: TransferErrorCode;\n\treadonly status: number;\n\treadonly detail: TransferErrorDetail | undefined;\n\n\tconstructor(\n\t\tcode: TransferErrorCode,\n\t\tmessage: string,\n\t\toptions: { detail?: TransferErrorDetail; cause?: unknown } = {},\n\t) {\n\t\tsuper(message, options.cause === undefined ? undefined : { cause: options.cause });\n\t\tthis.name = \"TransferError\";\n\t\tthis.code = code;\n\t\tthis.status = TRANSFER_ERROR_STATUS[code];\n\t\tthis.detail = options.detail;\n\t}\n}\n\nexport function isTransferError(error: unknown): error is TransferError {\n\treturn error instanceof TransferError;\n}\n"],"mappings":";;;;;;;;;;;AAWA,MAAa,oBAAoB;CAChC,6BAA6B;CAC7B,6BAA6B;CAC7B,mCAAmC;CACnC,8BAA8B;CAC9B,wBAAwB;CACxB,uBAAuB;CACvB,qBAAqB;CACrB,2BAA2B;CAC3B,+BAA+B;CAC/B,2BAA2B;CAC3B,kBAAkB;CAClB,2BAA2B;CAC3B,6BAA6B;CAC7B,8BAA8B;CAC9B,uBAAuB;CACvB,4BAA4B;CAC5B,uBAAuB;CACvB,6BAA6B;CAC7B,+BAA+B;CAC/B,4BAA4B;CAC5B,yBAAyB;CACzB,yBAAyB;CACzB,4BAA4B;CAC5B,4BAA4B;CAC5B,6BAA6B;CAC7B,8BAA8B;CAC9B,kCAAkC;CAClC,+BAA+B;CAC/B,uBAAuB;CACvB,4BAA4B;CAC5B,8BAA8B;CAC9B,4BAA4B;CAC5B,2BAA2B;CAC3B,wBAAwB;CACxB,uBAAuB;CACvB,wBAAwB;CACxB,uBAAuB;CACvB;AAID,MAAa,wBAAqE,OAAO,OAAO;CAC/F,6BAA6B;CAC7B,6BAA6B;CAC7B,mCAAmC;CACnC,8BAA8B;CAC9B,wBAAwB;CACxB,uBAAuB;CACvB,qBAAqB;CACrB,2BAA2B;CAC3B,+BAA+B;CAC/B,2BAA2B;CAC3B,kBAAkB;CAClB,2BAA2B;CAC3B,6BAA6B;CAC7B,8BAA8B;CAC9B,uBAAuB;CACvB,4BAA4B;CAC5B,uBAAuB;CACvB,6BAA6B;CAC7B,+BAA+B;CAC/B,4BAA4B;CAC5B,yBAAyB;CACzB,yBAAyB;CACzB,4BAA4B;CAC5B,4BAA4B;CAC5B,6BAA6B;CAC7B,8BAA8B;CAC9B,kCAAkC;CAClC,+BAA+B;CAC/B,uBAAuB;CACvB,4BAA4B;CAC5B,8BAA8B;CAC9B,4BAA4B;CAC5B,2BAA2B;CAC3B,wBAAwB;CACxB,uBAAuB;CACvB,wBAAwB;CACxB,uBAAuB;CACvB,CAAC;AAEF,SAAgB,oBAAoB,MAAqD;AACxF,QAAO,SAAS,UAAa,OAAO,OAAO,uBAAuB,KAAK;;AAGxE,SAAgB,oBAAoB,MAA8C;AACjF,QAAO,oBAAoB,KAAK,GAAG,sBAAsB,QAAQ;;AAUlE,MAAa,4BAA4B,EAAE,OAC1C,EAAE,QAAQ,EACV,EAAE,MAAM;CAAC,EAAE,QAAQ;CAAE,EAAE,QAAQ;CAAE,EAAE,SAAS;CAAE,EAAE,MAAM;CAAC,CAAC,CACxD;AAED,IAAa,gBAAb,cAAmC,MAAM;CACxC,AAAS;CACT,AAAS;CACT,AAAS;CAET,YACC,MACA,SACA,UAA6D,EAAE,EAC9D;AACD,QAAM,SAAS,QAAQ,UAAU,SAAY,SAAY,EAAE,OAAO,QAAQ,OAAO,CAAC;AAClF,OAAK,OAAO;AACZ,OAAK,OAAO;AACZ,OAAK,SAAS,sBAAsB;AACpC,OAAK,SAAS,QAAQ;;;AAIxB,SAAgB,gBAAgB,OAAwC;AACvE,QAAO,iBAAiB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//#region src/api/escape.ts
|
|
2
|
+
/** HTML-escape a string to prevent XSS when interpolated into HTML/JS */
|
|
3
|
+
function escapeHtml(str) {
|
|
4
|
+
return str.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll("\"", """).replaceAll("'", "'");
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
//#endregion
|
|
8
|
+
export { escapeHtml as t };
|
|
9
|
+
//# sourceMappingURL=escape-BveidMa2.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escape-BveidMa2.mjs","names":[],"sources":["../src/api/escape.ts"],"sourcesContent":["/** HTML-escape a string to prevent XSS when interpolated into HTML/JS */\nexport function escapeHtml(str: string): string {\n\treturn str\n\t\t.replaceAll(\"&\", \"&\")\n\t\t.replaceAll(\"<\", \"<\")\n\t\t.replaceAll(\">\", \">\")\n\t\t.replaceAll('\"', \""\")\n\t\t.replaceAll(\"'\", \"'\");\n}\n"],"mappings":";;AACA,SAAgB,WAAW,KAAqB;AAC/C,QAAO,IACL,WAAW,KAAK,QAAQ,CACxB,WAAW,KAAK,OAAO,CACvB,WAAW,KAAK,OAAO,CACvB,WAAW,MAAK,SAAS,CACzB,WAAW,KAAK,SAAS"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { n as isMissingTableError } from "./db-errors-CBD5yMro.mjs";
|
|
2
|
+
import { y as tableExists } from "./dialect-helpers-7_IqPdh9.mjs";
|
|
3
|
+
import { t as apiError } from "./error-BfsNNrIE.mjs";
|
|
4
|
+
import { sql } from "kysely";
|
|
5
|
+
|
|
6
|
+
//#region src/api/media-usage-write-fence.ts
|
|
7
|
+
/**
|
|
8
|
+
* The media usage activation fence alone. Write paths use the unified site
|
|
9
|
+
* write fence in `transfer/fence.ts`, which falls back to this before the
|
|
10
|
+
* transfer tables exist.
|
|
11
|
+
*/
|
|
12
|
+
async function findMediaUsageActivationWriteFenceError(db) {
|
|
13
|
+
if (!await tableExists(db, "_emdash_media_usage_activation")) return null;
|
|
14
|
+
try {
|
|
15
|
+
if ((await db.selectFrom("_emdash_media_usage_activation").select("state").where("task_key", "=", "incremental_capture").executeTakeFirst())?.state === "activating") return {
|
|
16
|
+
code: "MEDIA_USAGE_ACTIVATION_IN_PROGRESS",
|
|
17
|
+
message: "Media usage activation is in progress",
|
|
18
|
+
status: 503
|
|
19
|
+
};
|
|
20
|
+
} catch (error) {
|
|
21
|
+
console.error("[media-usage] Failed to check the activation write fence:", error);
|
|
22
|
+
return {
|
|
23
|
+
code: "MEDIA_USAGE_ACTIVATION_CHECK_FAILED",
|
|
24
|
+
message: "Unable to verify media usage activation state",
|
|
25
|
+
status: 503
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
//#endregion
|
|
32
|
+
//#region src/transfer/fence.ts
|
|
33
|
+
/**
|
|
34
|
+
* Unified site write fence: media-usage activation and transfer imports.
|
|
35
|
+
*
|
|
36
|
+
* One query answers both questions, so a fenced write path pays a single
|
|
37
|
+
* round trip. A transfer import fences writes while it executes and, after a
|
|
38
|
+
* failure or cancellation once writing started, until it is abandoned. The
|
|
39
|
+
* same query reports whether an export is running, so a fenced write can
|
|
40
|
+
* bump the export's write epoch without an extra query when none is.
|
|
41
|
+
*/
|
|
42
|
+
var SiteWriteBlockedError = class extends Error {
|
|
43
|
+
code;
|
|
44
|
+
status;
|
|
45
|
+
operationId;
|
|
46
|
+
constructor(error) {
|
|
47
|
+
super(error.message);
|
|
48
|
+
this.name = error.code;
|
|
49
|
+
this.code = error.code;
|
|
50
|
+
this.status = error.status;
|
|
51
|
+
this.operationId = error.operationId;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const CHECK_FAILED = {
|
|
55
|
+
code: "TRANSFER_FENCE_CHECK_FAILED",
|
|
56
|
+
message: "Unable to verify whether site writes are allowed",
|
|
57
|
+
status: 503
|
|
58
|
+
};
|
|
59
|
+
/** Read both fences and the running-export flag with one query. */
|
|
60
|
+
async function readSiteWriteFence(db, scope = {}) {
|
|
61
|
+
const mediaUsage = scope.mediaUsage !== false;
|
|
62
|
+
const transfer = scope.transfer !== false;
|
|
63
|
+
let row;
|
|
64
|
+
try {
|
|
65
|
+
row = (await sql`
|
|
66
|
+
SELECT
|
|
67
|
+
(
|
|
68
|
+
SELECT state FROM _emdash_media_usage_activation
|
|
69
|
+
WHERE task_key = 'incremental_capture'
|
|
70
|
+
) AS media_state,
|
|
71
|
+
(
|
|
72
|
+
SELECT id FROM _emdash_transfer_operations
|
|
73
|
+
WHERE kind = 'import'
|
|
74
|
+
AND (
|
|
75
|
+
state IN ('running', 'verifying')
|
|
76
|
+
OR (state IN ('failed', 'cancelled') AND mutation_started_at IS NOT NULL)
|
|
77
|
+
)
|
|
78
|
+
LIMIT 1
|
|
79
|
+
) AS import_id,
|
|
80
|
+
(
|
|
81
|
+
SELECT id FROM _emdash_transfer_operations
|
|
82
|
+
WHERE kind = 'export' AND state = 'running'
|
|
83
|
+
LIMIT 1
|
|
84
|
+
) AS export_id
|
|
85
|
+
`.execute(db)).rows[0];
|
|
86
|
+
} catch (error) {
|
|
87
|
+
if (isMissingTableError(error)) return {
|
|
88
|
+
error: mediaUsage ? await findMediaUsageActivationWriteFenceError(db) : null,
|
|
89
|
+
exportRunning: false
|
|
90
|
+
};
|
|
91
|
+
console.error("[transfer] Failed to check the site write fence:", error);
|
|
92
|
+
return {
|
|
93
|
+
error: CHECK_FAILED,
|
|
94
|
+
exportRunning: false
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
const exportRunning = Boolean(row?.export_id);
|
|
98
|
+
if (transfer && row?.import_id) return {
|
|
99
|
+
error: {
|
|
100
|
+
code: "TRANSFER_IMPORT_IN_PROGRESS",
|
|
101
|
+
message: "A site import is in progress or incomplete; writes are disabled",
|
|
102
|
+
status: 503,
|
|
103
|
+
operationId: row.import_id
|
|
104
|
+
},
|
|
105
|
+
exportRunning
|
|
106
|
+
};
|
|
107
|
+
if (mediaUsage && row?.media_state === "activating") return {
|
|
108
|
+
error: {
|
|
109
|
+
code: "MEDIA_USAGE_ACTIVATION_IN_PROGRESS",
|
|
110
|
+
message: "Media usage activation is in progress",
|
|
111
|
+
status: 503
|
|
112
|
+
},
|
|
113
|
+
exportRunning
|
|
114
|
+
};
|
|
115
|
+
return {
|
|
116
|
+
error: null,
|
|
117
|
+
exportRunning
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Tell running exports that a fenced write happened, so their consistency
|
|
122
|
+
* fence restarts them. Failures are logged, not thrown: the write itself is
|
|
123
|
+
* allowed either way.
|
|
124
|
+
*/
|
|
125
|
+
async function recordSiteWrite(db) {
|
|
126
|
+
try {
|
|
127
|
+
await bumpRunningExportWriteEpochs(db);
|
|
128
|
+
} catch (error) {
|
|
129
|
+
console.error("[transfer] Failed to record a write for running exports:", error);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/** Increments the write epoch of every running export; returns how many there were. */
|
|
133
|
+
async function bumpRunningExportWriteEpochs(db) {
|
|
134
|
+
const result = await db.updateTable("_emdash_transfer_operations").set({ write_epoch: sql`write_epoch + 1` }).where("kind", "=", "export").where("state", "=", "running").executeTakeFirst();
|
|
135
|
+
return Number(result.numUpdatedRows ?? 0n);
|
|
136
|
+
}
|
|
137
|
+
const NOTHING_TO_RECORD = async () => {};
|
|
138
|
+
/**
|
|
139
|
+
* Throw {@link SiteWriteBlockedError} when a fence blocks writes. Call it
|
|
140
|
+
* immediately before the write, and call the returned function once the
|
|
141
|
+
* write has succeeded: recording it afterwards means an export whose fence
|
|
142
|
+
* was captured while the write ran still sees it.
|
|
143
|
+
*/
|
|
144
|
+
async function assertSiteWriteAllowed(db) {
|
|
145
|
+
const status = await readSiteWriteFence(db);
|
|
146
|
+
if (status.error) throw new SiteWriteBlockedError(status.error);
|
|
147
|
+
return status.exportRunning ? () => recordSiteWrite(db) : NOTHING_TO_RECORD;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* The fence as an API error response, or null when writes are allowed.
|
|
151
|
+
* Records nothing: for the plugin lifecycle routes that call it, the fence
|
|
152
|
+
* middleware records a successful response's write.
|
|
153
|
+
*/
|
|
154
|
+
async function checkSiteWriteFence(db) {
|
|
155
|
+
const status = await readSiteWriteFence(db);
|
|
156
|
+
if (status.error) return apiError(status.error.code, status.error.message, status.error.status);
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
//#endregion
|
|
161
|
+
export { readSiteWriteFence as a, checkSiteWriteFence as i, assertSiteWriteAllowed as n, recordSiteWrite as o, bumpRunningExportWriteEpochs as r, SiteWriteBlockedError as t };
|
|
162
|
+
//# sourceMappingURL=fence-Bb_IbCxI.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fence-Bb_IbCxI.mjs","names":[],"sources":["../src/api/media-usage-write-fence.ts","../src/transfer/fence.ts"],"sourcesContent":["import type { Kysely } from \"kysely\";\n\nimport { tableExists } from \"../database/dialect-helpers.js\";\nimport type { Database } from \"../database/types.js\";\n\nexport interface MediaUsageActivationWriteFenceError {\n\tcode: \"MEDIA_USAGE_ACTIVATION_IN_PROGRESS\" | \"MEDIA_USAGE_ACTIVATION_CHECK_FAILED\";\n\tmessage: string;\n\tstatus: 503;\n}\n\n/**\n * The media usage activation fence alone. Write paths use the unified site\n * write fence in `transfer/fence.ts`, which falls back to this before the\n * transfer tables exist.\n */\nexport async function findMediaUsageActivationWriteFenceError(\n\tdb: Kysely<Database>,\n): Promise<MediaUsageActivationWriteFenceError | null> {\n\tif (!(await tableExists(db, \"_emdash_media_usage_activation\"))) return null;\n\ttry {\n\t\tconst row = await db\n\t\t\t.selectFrom(\"_emdash_media_usage_activation\")\n\t\t\t.select(\"state\")\n\t\t\t.where(\"task_key\", \"=\", \"incremental_capture\")\n\t\t\t.executeTakeFirst();\n\t\tif (row?.state === \"activating\") {\n\t\t\treturn {\n\t\t\t\tcode: \"MEDIA_USAGE_ACTIVATION_IN_PROGRESS\",\n\t\t\t\tmessage: \"Media usage activation is in progress\",\n\t\t\t\tstatus: 503,\n\t\t\t};\n\t\t}\n\t} catch (error) {\n\t\tconsole.error(\"[media-usage] Failed to check the activation write fence:\", error);\n\t\treturn {\n\t\t\tcode: \"MEDIA_USAGE_ACTIVATION_CHECK_FAILED\",\n\t\t\tmessage: \"Unable to verify media usage activation state\",\n\t\t\tstatus: 503,\n\t\t};\n\t}\n\treturn null;\n}\n","/**\n * Unified site write fence: media-usage activation and transfer imports.\n *\n * One query answers both questions, so a fenced write path pays a single\n * round trip. A transfer import fences writes while it executes and, after a\n * failure or cancellation once writing started, until it is abandoned. The\n * same query reports whether an export is running, so a fenced write can\n * bump the export's write epoch without an extra query when none is.\n */\n\nimport { sql, type Kysely } from \"kysely\";\n\nimport { apiError } from \"../api/error.js\";\nimport { findMediaUsageActivationWriteFenceError } from \"../api/media-usage-write-fence.js\";\nimport type { Database } from \"../database/types.js\";\nimport { isMissingTableError } from \"../utils/db-errors.js\";\n\nexport type SiteWriteFenceCode =\n\t| \"MEDIA_USAGE_ACTIVATION_IN_PROGRESS\"\n\t| \"MEDIA_USAGE_ACTIVATION_CHECK_FAILED\"\n\t| \"TRANSFER_IMPORT_IN_PROGRESS\"\n\t| \"TRANSFER_FENCE_CHECK_FAILED\";\n\nexport interface SiteWriteFenceError {\n\tcode: SiteWriteFenceCode;\n\tmessage: string;\n\tstatus: 503;\n\t/** The fencing import, when the fence is a transfer import. */\n\toperationId?: string;\n}\n\nexport class SiteWriteBlockedError extends Error {\n\treadonly code: SiteWriteFenceCode;\n\treadonly status: 503;\n\treadonly operationId: string | undefined;\n\n\tconstructor(error: SiteWriteFenceError) {\n\t\tsuper(error.message);\n\t\tthis.name = error.code;\n\t\tthis.code = error.code;\n\t\tthis.status = error.status;\n\t\tthis.operationId = error.operationId;\n\t}\n}\n\n/** Which fences apply to a write. Both apply unless one is turned off. */\nexport interface SiteWriteFenceScope {\n\tmediaUsage?: boolean;\n\ttransfer?: boolean;\n}\n\nexport interface SiteWriteFenceStatus {\n\terror: SiteWriteFenceError | null;\n\t/** Whether an export was running when the fence was read. */\n\texportRunning: boolean;\n}\n\nconst CHECK_FAILED: SiteWriteFenceError = {\n\tcode: \"TRANSFER_FENCE_CHECK_FAILED\",\n\tmessage: \"Unable to verify whether site writes are allowed\",\n\tstatus: 503,\n};\n\n/** Read both fences and the running-export flag with one query. */\nexport async function readSiteWriteFence(\n\tdb: Kysely<Database>,\n\tscope: SiteWriteFenceScope = {},\n): Promise<SiteWriteFenceStatus> {\n\tconst mediaUsage = scope.mediaUsage !== false;\n\tconst transfer = scope.transfer !== false;\n\tlet row:\n\t\t| { media_state: string | null; import_id: string | null; export_id: string | null }\n\t\t| undefined;\n\ttry {\n\t\tconst result = await sql<{\n\t\t\tmedia_state: string | null;\n\t\t\timport_id: string | null;\n\t\t\texport_id: string | null;\n\t\t}>`\n\t\t\tSELECT\n\t\t\t\t(\n\t\t\t\t\tSELECT state FROM _emdash_media_usage_activation\n\t\t\t\t\tWHERE task_key = 'incremental_capture'\n\t\t\t\t) AS media_state,\n\t\t\t\t(\n\t\t\t\t\tSELECT id FROM _emdash_transfer_operations\n\t\t\t\t\tWHERE kind = 'import'\n\t\t\t\t\t\tAND (\n\t\t\t\t\t\t\tstate IN ('running', 'verifying')\n\t\t\t\t\t\t\tOR (state IN ('failed', 'cancelled') AND mutation_started_at IS NOT NULL)\n\t\t\t\t\t\t)\n\t\t\t\t\tLIMIT 1\n\t\t\t\t) AS import_id,\n\t\t\t\t(\n\t\t\t\t\tSELECT id FROM _emdash_transfer_operations\n\t\t\t\t\tWHERE kind = 'export' AND state = 'running'\n\t\t\t\t\tLIMIT 1\n\t\t\t\t) AS export_id\n\t\t`.execute(db);\n\t\trow = result.rows[0];\n\t} catch (error) {\n\t\tif (isMissingTableError(error)) {\n\t\t\treturn {\n\t\t\t\terror: mediaUsage ? await findMediaUsageActivationWriteFenceError(db) : null,\n\t\t\t\texportRunning: false,\n\t\t\t};\n\t\t}\n\t\tconsole.error(\"[transfer] Failed to check the site write fence:\", error);\n\t\treturn { error: CHECK_FAILED, exportRunning: false };\n\t}\n\n\tconst exportRunning = Boolean(row?.export_id);\n\tif (transfer && row?.import_id) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\tcode: \"TRANSFER_IMPORT_IN_PROGRESS\",\n\t\t\t\tmessage: \"A site import is in progress or incomplete; writes are disabled\",\n\t\t\t\tstatus: 503,\n\t\t\t\toperationId: row.import_id,\n\t\t\t},\n\t\t\texportRunning,\n\t\t};\n\t}\n\tif (mediaUsage && row?.media_state === \"activating\") {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\tcode: \"MEDIA_USAGE_ACTIVATION_IN_PROGRESS\",\n\t\t\t\tmessage: \"Media usage activation is in progress\",\n\t\t\t\tstatus: 503,\n\t\t\t},\n\t\t\texportRunning,\n\t\t};\n\t}\n\treturn { error: null, exportRunning };\n}\n\nexport async function findSiteWriteFenceError(\n\tdb: Kysely<Database>,\n): Promise<SiteWriteFenceError | null> {\n\treturn (await readSiteWriteFence(db)).error;\n}\n\n/**\n * Tell running exports that a fenced write happened, so their consistency\n * fence restarts them. Failures are logged, not thrown: the write itself is\n * allowed either way.\n */\nexport async function recordSiteWrite(db: Kysely<Database>): Promise<void> {\n\ttry {\n\t\tawait bumpRunningExportWriteEpochs(db);\n\t} catch (error) {\n\t\tconsole.error(\"[transfer] Failed to record a write for running exports:\", error);\n\t}\n}\n\n/** Increments the write epoch of every running export; returns how many there were. */\nexport async function bumpRunningExportWriteEpochs(db: Kysely<Database>): Promise<number> {\n\tconst result = await db\n\t\t.updateTable(\"_emdash_transfer_operations\")\n\t\t.set({ write_epoch: sql<number>`write_epoch + 1` })\n\t\t.where(\"kind\", \"=\", \"export\")\n\t\t.where(\"state\", \"=\", \"running\")\n\t\t.executeTakeFirst();\n\treturn Number(result.numUpdatedRows ?? 0n);\n}\n\n/** Records a completed write for running exports; a no-op when none was running. */\nexport type RecordSiteWrite = () => Promise<void>;\n\nconst NOTHING_TO_RECORD: RecordSiteWrite = async () => {};\n\n/**\n * Throw {@link SiteWriteBlockedError} when a fence blocks writes. Call it\n * immediately before the write, and call the returned function once the\n * write has succeeded: recording it afterwards means an export whose fence\n * was captured while the write ran still sees it.\n */\nexport async function assertSiteWriteAllowed(db: Kysely<Database>): Promise<RecordSiteWrite> {\n\tconst status = await readSiteWriteFence(db);\n\tif (status.error) throw new SiteWriteBlockedError(status.error);\n\treturn status.exportRunning ? () => recordSiteWrite(db) : NOTHING_TO_RECORD;\n}\n\n/**\n * The fence as an API error response, or null when writes are allowed.\n * Records nothing: for the plugin lifecycle routes that call it, the fence\n * middleware records a successful response's write.\n */\nexport async function checkSiteWriteFence(db: Kysely<Database>): Promise<Response | null> {\n\tconst status = await readSiteWriteFence(db);\n\tif (status.error) return apiError(status.error.code, status.error.message, status.error.status);\n\treturn null;\n}\n"],"mappings":";;;;;;;;;;;AAgBA,eAAsB,wCACrB,IACsD;AACtD,KAAI,CAAE,MAAM,YAAY,IAAI,iCAAiC,CAAG,QAAO;AACvE,KAAI;AAMH,OALY,MAAM,GAChB,WAAW,iCAAiC,CAC5C,OAAO,QAAQ,CACf,MAAM,YAAY,KAAK,sBAAsB,CAC7C,kBAAkB,GACX,UAAU,aAClB,QAAO;GACN,MAAM;GACN,SAAS;GACT,QAAQ;GACR;UAEM,OAAO;AACf,UAAQ,MAAM,6DAA6D,MAAM;AACjF,SAAO;GACN,MAAM;GACN,SAAS;GACT,QAAQ;GACR;;AAEF,QAAO;;;;;;;;;;;;;;ACVR,IAAa,wBAAb,cAA2C,MAAM;CAChD,AAAS;CACT,AAAS;CACT,AAAS;CAET,YAAY,OAA4B;AACvC,QAAM,MAAM,QAAQ;AACpB,OAAK,OAAO,MAAM;AAClB,OAAK,OAAO,MAAM;AAClB,OAAK,SAAS,MAAM;AACpB,OAAK,cAAc,MAAM;;;AAgB3B,MAAM,eAAoC;CACzC,MAAM;CACN,SAAS;CACT,QAAQ;CACR;;AAGD,eAAsB,mBACrB,IACA,QAA6B,EAAE,EACC;CAChC,MAAM,aAAa,MAAM,eAAe;CACxC,MAAM,WAAW,MAAM,aAAa;CACpC,IAAI;AAGJ,KAAI;AA0BH,SAzBe,MAAM,GAInB;;;;;;;;;;;;;;;;;;;;IAoBA,QAAQ,GAAG,EACA,KAAK;UACV,OAAO;AACf,MAAI,oBAAoB,MAAM,CAC7B,QAAO;GACN,OAAO,aAAa,MAAM,wCAAwC,GAAG,GAAG;GACxE,eAAe;GACf;AAEF,UAAQ,MAAM,oDAAoD,MAAM;AACxE,SAAO;GAAE,OAAO;GAAc,eAAe;GAAO;;CAGrD,MAAM,gBAAgB,QAAQ,KAAK,UAAU;AAC7C,KAAI,YAAY,KAAK,UACpB,QAAO;EACN,OAAO;GACN,MAAM;GACN,SAAS;GACT,QAAQ;GACR,aAAa,IAAI;GACjB;EACD;EACA;AAEF,KAAI,cAAc,KAAK,gBAAgB,aACtC,QAAO;EACN,OAAO;GACN,MAAM;GACN,SAAS;GACT,QAAQ;GACR;EACD;EACA;AAEF,QAAO;EAAE,OAAO;EAAM;EAAe;;;;;;;AActC,eAAsB,gBAAgB,IAAqC;AAC1E,KAAI;AACH,QAAM,6BAA6B,GAAG;UAC9B,OAAO;AACf,UAAQ,MAAM,4DAA4D,MAAM;;;;AAKlF,eAAsB,6BAA6B,IAAuC;CACzF,MAAM,SAAS,MAAM,GACnB,YAAY,8BAA8B,CAC1C,IAAI,EAAE,aAAa,GAAW,mBAAmB,CAAC,CAClD,MAAM,QAAQ,KAAK,SAAS,CAC5B,MAAM,SAAS,KAAK,UAAU,CAC9B,kBAAkB;AACpB,QAAO,OAAO,OAAO,kBAAkB,GAAG;;AAM3C,MAAM,oBAAqC,YAAY;;;;;;;AAQvD,eAAsB,uBAAuB,IAAgD;CAC5F,MAAM,SAAS,MAAM,mBAAmB,GAAG;AAC3C,KAAI,OAAO,MAAO,OAAM,IAAI,sBAAsB,OAAO,MAAM;AAC/D,QAAO,OAAO,sBAAsB,gBAAgB,GAAG,GAAG;;;;;;;AAQ3D,eAAsB,oBAAoB,IAAgD;CACzF,MAAM,SAAS,MAAM,mBAAmB,GAAG;AAC3C,KAAI,OAAO,MAAO,QAAO,SAAS,OAAO,MAAM,MAAM,OAAO,MAAM,SAAS,OAAO,MAAM,OAAO;AAC/F,QAAO"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { u as __exportAll } from "./runner-B3eyB9Gb.mjs";
|
|
2
|
+
import { t as after } from "./after-PcEvMY_6.mjs";
|
|
3
|
+
import { getRequestContext } from "./request-context.mjs";
|
|
4
|
+
import { n as initWithLock, t as createInitLock } from "./init-lock-4eRRB4Le.mjs";
|
|
5
|
+
import { r as requestCached } from "./request-cache-iHRlHx1d.mjs";
|
|
6
|
+
import { n as BylineSchemaRegistry } from "./byline-registry-B_EK_TQf.mjs";
|
|
7
|
+
|
|
8
|
+
//#region src/bylines/field-defs-cache.ts
|
|
9
|
+
var field_defs_cache_exports = /* @__PURE__ */ __exportAll({ getBylineFieldDefs: () => getBylineFieldDefs });
|
|
10
|
+
const HOLDER_KEY = Symbol.for("emdash:byline-field-defs");
|
|
11
|
+
const g = globalThis;
|
|
12
|
+
const holder = g[HOLDER_KEY] ?? (() => {
|
|
13
|
+
const h = {
|
|
14
|
+
value: null,
|
|
15
|
+
hasValue: false,
|
|
16
|
+
cachedVersion: -1,
|
|
17
|
+
lock: createInitLock()
|
|
18
|
+
};
|
|
19
|
+
g[HOLDER_KEY] = h;
|
|
20
|
+
return h;
|
|
21
|
+
})();
|
|
22
|
+
const REQUEST_CACHE_KEY_VERSION = "byline-fields-version";
|
|
23
|
+
const REQUEST_CACHE_KEY_DEFS_PREFIX = "byline-field-defs:";
|
|
24
|
+
/**
|
|
25
|
+
* Reclaim window for the single-flight lock: if an owner holds it past
|
|
26
|
+
* this without publishing (e.g. its request was cancelled and the
|
|
27
|
+
* anchored fetch hasn't completed yet), the next reader reclaims and
|
|
28
|
+
* refetches. `listFields` is a single fast SELECT, so this only needs to
|
|
29
|
+
* cover a genuinely slow/stranded query. Mutable solely so tests can
|
|
30
|
+
* shorten it; production never changes it.
|
|
31
|
+
*/
|
|
32
|
+
let reclaimDeadlineMs = 1e4;
|
|
33
|
+
/**
|
|
34
|
+
* Read the persisted `options.byline_fields_version` counter. Cached for
|
|
35
|
+
* the duration of the current request via `requestCached`. Returns `0`
|
|
36
|
+
* when the row is missing (matches `BylineSchemaRegistry.getVersion`).
|
|
37
|
+
*/
|
|
38
|
+
async function getBylineFieldsVersion(db) {
|
|
39
|
+
return requestCached(REQUEST_CACHE_KEY_VERSION, () => new BylineSchemaRegistry(db).getVersion());
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Resolve registered byline custom-field definitions. Two-tier cache:
|
|
43
|
+
* per-request via `requestCached`, then per-isolate via the global
|
|
44
|
+
* holder.
|
|
45
|
+
*
|
|
46
|
+
* The global holder is bypassed for isolated requests (playground / DO
|
|
47
|
+
* preview, which point at a divergent schema) and for dirty versions
|
|
48
|
+
* (odd counter — see `BylineSchemaRegistry`'s class JSDoc — indicates
|
|
49
|
+
* an in-flight or crashed mutation). Both bypass paths still hit the
|
|
50
|
+
* per-request cache, so a single render dedupes within itself.
|
|
51
|
+
*
|
|
52
|
+
* Always returns an array. Empty = no custom fields registered.
|
|
53
|
+
*/
|
|
54
|
+
async function getBylineFieldDefs(db) {
|
|
55
|
+
const isolated = getRequestContext()?.dbIsIsolated === true;
|
|
56
|
+
const version = await getBylineFieldsVersion(db);
|
|
57
|
+
const dirty = version % 2 !== 0;
|
|
58
|
+
return requestCached(`${REQUEST_CACHE_KEY_DEFS_PREFIX}${version}`, async () => {
|
|
59
|
+
if (isolated || dirty) return new BylineSchemaRegistry(db).listFields();
|
|
60
|
+
return initWithLock(holder.lock, () => holder.hasValue && holder.cachedVersion === version ? holder.value : null, (isCurrentClaim) => (async () => {
|
|
61
|
+
const defs = await new BylineSchemaRegistry(db).listFields();
|
|
62
|
+
if (isCurrentClaim() && version >= holder.cachedVersion) {
|
|
63
|
+
holder.value = defs;
|
|
64
|
+
holder.hasValue = true;
|
|
65
|
+
holder.cachedVersion = version;
|
|
66
|
+
}
|
|
67
|
+
return defs;
|
|
68
|
+
})(), {
|
|
69
|
+
deadlineMs: reclaimDeadlineMs,
|
|
70
|
+
anchor: (promise) => after(() => promise)
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
//#endregion
|
|
76
|
+
export { getBylineFieldDefs as n, field_defs_cache_exports as t };
|
|
77
|
+
//# sourceMappingURL=field-defs-cache-CsZctvbu.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-defs-cache-CsZctvbu.mjs","names":[],"sources":["../src/bylines/field-defs-cache.ts"],"sourcesContent":["/**\n * Byline field-definitions cache\n *\n * Discussion #1174 / Phase 3. Two-tier cache for the byline custom-field\n * registry, mirroring the `settings/index.ts` pattern.\n *\n * **Tier 1 — per-isolate (globalThis).** Field definitions change rarely\n * but are read on every byline hydration (admin pages, content rendering,\n * API responses). Caching at the isolate level drops the SELECT-from-\n * `_emdash_byline_fields` from once-per-hydration to once-per-isolate-\n * after-bump. The cache holds the resolved *value* behind a reclaimable\n * single-flight lock (see `utils/single-flight-cache.ts`), never an\n * in-flight promise: concurrent cold-isolate readers coalesce onto one\n * query by polling the published value, so a reader whose request is\n * cancelled mid-query can never strand later byline hydrations on the\n * isolate (the workerd never-settling-promise hazard that produced 524s).\n *\n * Stored on globalThis under `Symbol.for(\"emdash:byline-field-defs\")` so\n * Vite SSR chunk duplication can't produce two independent caches (same\n * pattern as `request-cache.ts` and `request-context.ts`).\n *\n * **Tier 2 — per-request.** Wraps both the version read and the defs\n * fetch in `requestCached` so a single page render that hits byline\n * hydration multiple times (e.g. list view + individual byline lookups\n * in a sidebar) pays at most one version read and one defs fetch in\n * total. The defs cache key includes the version, so a (highly\n * unlikely) mid-request bump still produces a self-consistent view —\n * the second call sees a different key and refetches.\n *\n * **Invalidation.** `options.byline_fields_version` is bumped by every\n * `BylineSchemaRegistry` mutation (Phase 2). Each isolate independently\n * reads the persisted version on the next request and compares against\n * its cached version; mismatch triggers a refetch and overwrite. Other\n * isolates see the change within one request after the bump propagates.\n *\n * **Isolated databases bypass the global cache.** Playground and DO\n * preview sessions set `requestContext.dbIsIsolated = true`, signalling\n * the per-request `db` points at an isolated schema that may diverge\n * from the singleton. Schema-derived caches keyed by the singleton's\n * version would silently leak the singleton's defs into the isolated\n * request. We follow the `loader.ts:74` `getTaxonomyNames` precedent:\n * skip both reading from and writing to the global holder when the\n * request is isolated. The per-request cache (`requestCached`) is keyed\n * by the WeakMap'd `EmDashRequestContext`, so it can't cross-pollinate\n * between requests — it stays in play even for isolated DBs.\n *\n * **Why a versioned cache and not a TTL?** The version counter gives\n * deterministic invalidation without the staleness window a TTL would\n * impose. Field-definition changes need to be visible to the next\n * request, not eventually. The cost is one cheap `options` read per\n * request — cheaper than the field-defs fetch it replaces, and cheaper\n * than maintaining a TTL state machine.\n */\n\nimport type { Kysely } from \"kysely\";\n\nimport { after } from \"../after.js\";\nimport type { Database } from \"../database/types.js\";\nimport { requestCached } from \"../request-cache.js\";\nimport { getRequestContext } from \"../request-context.js\";\nimport { BylineSchemaRegistry } from \"../schema/byline-registry.js\";\nimport type { BylineFieldDefinition } from \"../schema/types.js\";\nimport { createInitLock, type InitLock, initWithLock } from \"../utils/init-lock.js\";\n\ninterface FieldDefsHolder {\n\t/** Last resolved defs, valid only when `hasValue` is true. */\n\tvalue: BylineFieldDefinition[] | null;\n\t/** Presence flag, separate from `value` so an empty-array result still caches. */\n\thasValue: boolean;\n\t/** Persisted-version value that `value` was fetched against. */\n\tcachedVersion: number;\n\t/** Reclaimable single-flight lock so a cancelled owner can't wedge readers. */\n\tlock: InitLock;\n}\n\nconst HOLDER_KEY = Symbol.for(\"emdash:byline-field-defs\");\nconst g = globalThis as Record<symbol, unknown>;\nconst holder: FieldDefsHolder =\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- globalThis singleton pattern (see request-cache.ts)\n\t(g[HOLDER_KEY] as FieldDefsHolder | undefined) ??\n\t(() => {\n\t\tconst h: FieldDefsHolder = {\n\t\t\tvalue: null,\n\t\t\thasValue: false,\n\t\t\tcachedVersion: -1,\n\t\t\tlock: createInitLock(),\n\t\t};\n\t\tg[HOLDER_KEY] = h;\n\t\treturn h;\n\t})();\n\nconst REQUEST_CACHE_KEY_VERSION = \"byline-fields-version\";\nconst REQUEST_CACHE_KEY_DEFS_PREFIX = \"byline-field-defs:\";\n\n/**\n * Reclaim window for the single-flight lock: if an owner holds it past\n * this without publishing (e.g. its request was cancelled and the\n * anchored fetch hasn't completed yet), the next reader reclaims and\n * refetches. `listFields` is a single fast SELECT, so this only needs to\n * cover a genuinely slow/stranded query. Mutable solely so tests can\n * shorten it; production never changes it.\n */\nlet reclaimDeadlineMs = 10_000;\n\n/**\n * Read the persisted `options.byline_fields_version` counter. Cached for\n * the duration of the current request via `requestCached`. Returns `0`\n * when the row is missing (matches `BylineSchemaRegistry.getVersion`).\n */\nasync function getBylineFieldsVersion(db: Kysely<Database>): Promise<number> {\n\treturn requestCached(REQUEST_CACHE_KEY_VERSION, () => new BylineSchemaRegistry(db).getVersion());\n}\n\n/**\n * Resolve registered byline custom-field definitions. Two-tier cache:\n * per-request via `requestCached`, then per-isolate via the global\n * holder.\n *\n * The global holder is bypassed for isolated requests (playground / DO\n * preview, which point at a divergent schema) and for dirty versions\n * (odd counter — see `BylineSchemaRegistry`'s class JSDoc — indicates\n * an in-flight or crashed mutation). Both bypass paths still hit the\n * per-request cache, so a single render dedupes within itself.\n *\n * Always returns an array. Empty = no custom fields registered.\n */\nexport async function getBylineFieldDefs(db: Kysely<Database>): Promise<BylineFieldDefinition[]> {\n\tconst isolated = getRequestContext()?.dbIsIsolated === true;\n\tconst version = await getBylineFieldsVersion(db);\n\tconst dirty = version % 2 !== 0;\n\treturn requestCached(`${REQUEST_CACHE_KEY_DEFS_PREFIX}${version}`, async () => {\n\t\tif (isolated || dirty) {\n\t\t\treturn new BylineSchemaRegistry(db).listFields();\n\t\t}\n\t\t// Per-isolate single-flight cache keyed on the persisted version.\n\t\t// Coalesce concurrent cold readers via the lock and read the\n\t\t// published value; never await another request's in-flight promise\n\t\t// (a cancelled owner would otherwise strand every later byline\n\t\t// hydration on the isolate). The fetch is anchored so a cancelled\n\t\t// originator still drives it to completion and populates the cache.\n\t\treturn initWithLock<BylineFieldDefinition[]>(\n\t\t\tholder.lock,\n\t\t\t() => (holder.hasValue && holder.cachedVersion === version ? holder.value : null),\n\t\t\t(isCurrentClaim) =>\n\t\t\t\t(async () => {\n\t\t\t\t\tconst defs = await new BylineSchemaRegistry(db).listFields();\n\t\t\t\t\t// Publish only while still the current claim, and never\n\t\t\t\t\t// regress over a newer version a concurrent reader stored.\n\t\t\t\t\tif (isCurrentClaim() && version >= holder.cachedVersion) {\n\t\t\t\t\t\tholder.value = defs;\n\t\t\t\t\t\tholder.hasValue = true;\n\t\t\t\t\t\tholder.cachedVersion = version;\n\t\t\t\t\t}\n\t\t\t\t\treturn defs;\n\t\t\t\t})(),\n\t\t\t{ deadlineMs: reclaimDeadlineMs, anchor: (promise) => after(() => promise) },\n\t\t);\n\t});\n}\n\n/**\n * Test/internal helper: clear the per-isolate cache. Useful for unit\n * tests that mutate the registry directly and need to force a refetch\n * without going through the full version-bump path.\n *\n * Production code paths should rely on the version counter for\n * invalidation — calling this from a write path would bypass the\n * coordination that lets other isolates see the change.\n */\nexport function resetBylineFieldDefsCacheForTests(): void {\n\tholder.value = null;\n\tholder.hasValue = false;\n\tholder.cachedVersion = -1;\n\tholder.lock.ownerStartedAt = null;\n\tholder.lock.generation = 0;\n\treclaimDeadlineMs = 10_000;\n}\n\n/**\n * Test-only: shorten the single-flight reclaim window so a \"stranded\n * owner\" scenario can be exercised without waiting out the production\n * deadline. Reset by `resetBylineFieldDefsCacheForTests`.\n *\n * @internal\n */\nexport function setBylineFieldDefsReclaimDeadlineForTests(ms: number): void {\n\treclaimDeadlineMs = ms;\n}\n"],"mappings":";;;;;;;;;AA2EA,MAAM,aAAa,OAAO,IAAI,2BAA2B;AACzD,MAAM,IAAI;AACV,MAAM,SAEJ,EAAE,sBACI;CACN,MAAM,IAAqB;EAC1B,OAAO;EACP,UAAU;EACV,eAAe;EACf,MAAM,gBAAgB;EACtB;AACD,GAAE,cAAc;AAChB,QAAO;IACJ;AAEL,MAAM,4BAA4B;AAClC,MAAM,gCAAgC;;;;;;;;;AAUtC,IAAI,oBAAoB;;;;;;AAOxB,eAAe,uBAAuB,IAAuC;AAC5E,QAAO,cAAc,iCAAiC,IAAI,qBAAqB,GAAG,CAAC,YAAY,CAAC;;;;;;;;;;;;;;;AAgBjG,eAAsB,mBAAmB,IAAwD;CAChG,MAAM,WAAW,mBAAmB,EAAE,iBAAiB;CACvD,MAAM,UAAU,MAAM,uBAAuB,GAAG;CAChD,MAAM,QAAQ,UAAU,MAAM;AAC9B,QAAO,cAAc,GAAG,gCAAgC,WAAW,YAAY;AAC9E,MAAI,YAAY,MACf,QAAO,IAAI,qBAAqB,GAAG,CAAC,YAAY;AAQjD,SAAO,aACN,OAAO,YACA,OAAO,YAAY,OAAO,kBAAkB,UAAU,OAAO,QAAQ,OAC3E,oBACC,YAAY;GACZ,MAAM,OAAO,MAAM,IAAI,qBAAqB,GAAG,CAAC,YAAY;AAG5D,OAAI,gBAAgB,IAAI,WAAW,OAAO,eAAe;AACxD,WAAO,QAAQ;AACf,WAAO,WAAW;AAClB,WAAO,gBAAgB;;AAExB,UAAO;MACJ,EACL;GAAE,YAAY;GAAmB,SAAS,YAAY,YAAY,QAAQ;GAAE,CAC5E;GACA"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { u as __exportAll } from "./runner-B3eyB9Gb.mjs";
|
|
2
|
+
import { n as isMissingTableError } from "./db-errors-CBD5yMro.mjs";
|
|
3
|
+
import { f as jsonExtractExpr } from "./dialect-helpers-7_IqPdh9.mjs";
|
|
4
|
+
import { n as cachedQuery, t as CacheNamespace } from "./object-cache-CqWNY5uP.mjs";
|
|
5
|
+
import { r as requestCached } from "./request-cache-iHRlHx1d.mjs";
|
|
6
|
+
import { s as getDb } from "./loader-CrRPfkHS.mjs";
|
|
7
|
+
import { sql } from "kysely";
|
|
8
|
+
|
|
9
|
+
//#region src/references/field-map.ts
|
|
10
|
+
/**
|
|
11
|
+
* The reference fields a collection carries, for the public query path.
|
|
12
|
+
*
|
|
13
|
+
* `referenceFieldConstraints` (api/handlers) answers the write question — how
|
|
14
|
+
* many entries may a field select, and is it required. Rendering asks a
|
|
15
|
+
* different one: which collection do I load, and which end of the relation am I
|
|
16
|
+
* standing on. Both read the same rows; keeping them apart keeps the render
|
|
17
|
+
* path off the relation table, which the constraints map has to read for its
|
|
18
|
+
* limits.
|
|
19
|
+
*/
|
|
20
|
+
var field_map_exports = /* @__PURE__ */ __exportAll({ getReferenceFieldMap: () => getReferenceFieldMap });
|
|
21
|
+
function isRecord(value) {
|
|
22
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
23
|
+
}
|
|
24
|
+
async function loadBindings(db, collection) {
|
|
25
|
+
const relationSlug = jsonExtractExpr(db, "validation", "relation");
|
|
26
|
+
let rows;
|
|
27
|
+
try {
|
|
28
|
+
rows = (await sql`
|
|
29
|
+
SELECT f.slug AS slug, f.validation AS validation, r.id AS relation_id
|
|
30
|
+
FROM ${sql.ref("_emdash_fields")} AS f
|
|
31
|
+
INNER JOIN ${sql.ref("_emdash_collections")} AS c ON c.id = f.collection_id
|
|
32
|
+
LEFT JOIN ${sql.ref("_emdash_relations")} AS r ON r.slug = ${sql.raw(relationSlug)}
|
|
33
|
+
WHERE c.slug = ${collection} AND f.type = 'reference'
|
|
34
|
+
`.execute(db)).rows;
|
|
35
|
+
} catch (error) {
|
|
36
|
+
if (isMissingTableError(error)) return [];
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
const bindings = [];
|
|
40
|
+
for (const row of rows) {
|
|
41
|
+
if (!row.validation) continue;
|
|
42
|
+
let parsed;
|
|
43
|
+
try {
|
|
44
|
+
parsed = JSON.parse(row.validation);
|
|
45
|
+
} catch {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (!isRecord(parsed)) continue;
|
|
49
|
+
const { relation, targetCollection } = parsed;
|
|
50
|
+
if (typeof relation !== "string" || typeof targetCollection !== "string") continue;
|
|
51
|
+
if (!row.relation_id) continue;
|
|
52
|
+
bindings.push({
|
|
53
|
+
slug: row.slug,
|
|
54
|
+
relation,
|
|
55
|
+
relationId: row.relation_id,
|
|
56
|
+
targetCollection,
|
|
57
|
+
side: parsed.relationSide === "child" ? "child" : "parent"
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return bindings;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Every bound reference field on `collection`, by field slug.
|
|
64
|
+
*
|
|
65
|
+
* Cached twice over: once per request, and once in the schema object-cache
|
|
66
|
+
* namespace, which a schema edit already bumps. A render that asks for
|
|
67
|
+
* references therefore pays for this lookup at most once per isolate between
|
|
68
|
+
* schema changes, and a render that asks for none never issues it.
|
|
69
|
+
*/
|
|
70
|
+
function getReferenceFieldMap(collection) {
|
|
71
|
+
return requestCached(`reference-field-map:${collection}`, async () => {
|
|
72
|
+
const bindings = await cachedQuery({
|
|
73
|
+
namespace: CacheNamespace.SCHEMA,
|
|
74
|
+
key: `reference-field-map:${collection}`,
|
|
75
|
+
load: async () => loadBindings(await getDb(), collection)
|
|
76
|
+
});
|
|
77
|
+
return new Map(bindings.map((binding) => [binding.slug, binding]));
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
//#endregion
|
|
82
|
+
export { getReferenceFieldMap as n, field_map_exports as t };
|
|
83
|
+
//# sourceMappingURL=field-map-6m9rF49t.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-map-6m9rF49t.mjs","names":[],"sources":["../src/references/field-map.ts"],"sourcesContent":["/**\n * The reference fields a collection carries, for the public query path.\n *\n * `referenceFieldConstraints` (api/handlers) answers the write question — how\n * many entries may a field select, and is it required. Rendering asks a\n * different one: which collection do I load, and which end of the relation am I\n * standing on. Both read the same rows; keeping them apart keeps the render\n * path off the relation table, which the constraints map has to read for its\n * limits.\n */\n\nimport { sql, type Kysely } from \"kysely\";\n\nimport { jsonExtractExpr } from \"../database/dialect-helpers.js\";\nimport type { Database } from \"../database/types.js\";\nimport { getDb } from \"../loader.js\";\nimport { cachedQuery, CacheNamespace } from \"../object-cache/index.js\";\nimport { requestCached } from \"../request-cache.js\";\nimport { isMissingTableError } from \"../utils/db-errors.js\";\n\n/** One reference field, as a render needs it. */\nexport interface ReferenceFieldBinding {\n\t/** Field slug — the key a caller names a selection under. */\n\tslug: string;\n\t/** Relation slug the field binds to. */\n\trelation: string;\n\t/**\n\t * The relation's id, read in the same statement as the binding. Rendering\n\t * pages the link table by id, so carrying it here is what keeps a field's\n\t * cost at one link read rather than a slug lookup and then the read.\n\t */\n\trelationId: string;\n\t/** Which end of the relation this field's own collection sits on. */\n\tside: \"parent\" | \"child\";\n\t/** The collection at the other end. */\n\ttargetCollection: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nasync function loadBindings(\n\tdb: Kysely<Database>,\n\tcollection: string,\n): Promise<ReferenceFieldBinding[]> {\n\t// The relation's id joins in here rather than being looked up per field at\n\t// render time: the field stores a slug, but the link table is keyed by id.\n\tconst relationSlug = jsonExtractExpr(db, \"validation\", \"relation\");\n\tlet rows: { slug: string; validation: string | null; relation_id: string | null }[];\n\ttry {\n\t\tconst result = await sql<{\n\t\t\tslug: string;\n\t\t\tvalidation: string | null;\n\t\t\trelation_id: string | null;\n\t\t}>`\n\t\t\tSELECT f.slug AS slug, f.validation AS validation, r.id AS relation_id\n\t\t\tFROM ${sql.ref(\"_emdash_fields\")} AS f\n\t\t\tINNER JOIN ${sql.ref(\"_emdash_collections\")} AS c ON c.id = f.collection_id\n\t\t\tLEFT JOIN ${sql.ref(\"_emdash_relations\")} AS r ON r.slug = ${sql.raw(relationSlug)}\n\t\t\tWHERE c.slug = ${collection} AND f.type = 'reference'\n\t\t`.execute(db);\n\t\trows = result.rows;\n\t} catch (error) {\n\t\tif (isMissingTableError(error)) return [];\n\t\tthrow error;\n\t}\n\n\tconst bindings: ReferenceFieldBinding[] = [];\n\tfor (const row of rows) {\n\t\tif (!row.validation) continue;\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(row.validation);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tif (!isRecord(parsed)) continue;\n\t\tconst { relation, targetCollection } = parsed;\n\t\t// A field with neither is unbound: it keeps its own column, and its value\n\t\t// is already in `data`. There is nothing to resolve. Nor is there when the\n\t\t// named relation is gone — the join leaves no id to page by.\n\t\tif (typeof relation !== \"string\" || typeof targetCollection !== \"string\") continue;\n\t\tif (!row.relation_id) continue;\n\t\tbindings.push({\n\t\t\tslug: row.slug,\n\t\t\trelation,\n\t\t\trelationId: row.relation_id,\n\t\t\ttargetCollection,\n\t\t\tside: parsed.relationSide === \"child\" ? \"child\" : \"parent\",\n\t\t});\n\t}\n\treturn bindings;\n}\n\n/**\n * Every bound reference field on `collection`, by field slug.\n *\n * Cached twice over: once per request, and once in the schema object-cache\n * namespace, which a schema edit already bumps. A render that asks for\n * references therefore pays for this lookup at most once per isolate between\n * schema changes, and a render that asks for none never issues it.\n */\nexport function getReferenceFieldMap(\n\tcollection: string,\n): Promise<Map<string, ReferenceFieldBinding>> {\n\treturn requestCached(`reference-field-map:${collection}`, async () => {\n\t\tconst bindings = await cachedQuery({\n\t\t\tnamespace: CacheNamespace.SCHEMA,\n\t\t\tkey: `reference-field-map:${collection}`,\n\t\t\tload: async () => loadBindings(await getDb(), collection),\n\t\t});\n\t\treturn new Map(bindings.map((binding) => [binding.slug, binding]));\n\t});\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAsCA,SAAS,SAAS,OAAkD;AACnE,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM;;AAG5E,eAAe,aACd,IACA,YACmC;CAGnC,MAAM,eAAe,gBAAgB,IAAI,cAAc,WAAW;CAClE,IAAI;AACJ,KAAI;AAYH,UAXe,MAAM,GAInB;;UAEM,IAAI,IAAI,iBAAiB,CAAC;gBACpB,IAAI,IAAI,sBAAsB,CAAC;eAChC,IAAI,IAAI,oBAAoB,CAAC,oBAAoB,IAAI,IAAI,aAAa,CAAC;oBAClE,WAAW;IAC3B,QAAQ,GAAG,EACC;UACN,OAAO;AACf,MAAI,oBAAoB,MAAM,CAAE,QAAO,EAAE;AACzC,QAAM;;CAGP,MAAM,WAAoC,EAAE;AAC5C,MAAK,MAAM,OAAO,MAAM;AACvB,MAAI,CAAC,IAAI,WAAY;EACrB,IAAI;AACJ,MAAI;AACH,YAAS,KAAK,MAAM,IAAI,WAAW;UAC5B;AACP;;AAED,MAAI,CAAC,SAAS,OAAO,CAAE;EACvB,MAAM,EAAE,UAAU,qBAAqB;AAIvC,MAAI,OAAO,aAAa,YAAY,OAAO,qBAAqB,SAAU;AAC1E,MAAI,CAAC,IAAI,YAAa;AACtB,WAAS,KAAK;GACb,MAAM,IAAI;GACV;GACA,YAAY,IAAI;GAChB;GACA,MAAM,OAAO,iBAAiB,UAAU,UAAU;GAClD,CAAC;;AAEH,QAAO;;;;;;;;;;AAWR,SAAgB,qBACf,YAC8C;AAC9C,QAAO,cAAc,uBAAuB,cAAc,YAAY;EACrE,MAAM,WAAW,MAAM,YAAY;GAClC,WAAW,eAAe;GAC1B,KAAK,uBAAuB;GAC5B,MAAM,YAAY,aAAa,MAAM,OAAO,EAAE,WAAW;GACzD,CAAC;AACF,SAAO,IAAI,IAAI,SAAS,KAAK,YAAY,CAAC,QAAQ,MAAM,QAAQ,CAAC,CAAC;GACjE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//#region src/media/focal-point.ts
|
|
2
|
+
function isFocalCoordinate(value) {
|
|
3
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 && value <= 1;
|
|
4
|
+
}
|
|
5
|
+
function normalizeFocalPoint(focalX, focalY) {
|
|
6
|
+
if (!isFocalCoordinate(focalX) || !isFocalCoordinate(focalY)) return null;
|
|
7
|
+
return {
|
|
8
|
+
focalX,
|
|
9
|
+
focalY
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function isValidFocalPointUpdate(input) {
|
|
13
|
+
const hasX = input.focalX !== void 0;
|
|
14
|
+
const hasY = input.focalY !== void 0;
|
|
15
|
+
if (!hasX && !hasY) return true;
|
|
16
|
+
if (!hasX || !hasY) return false;
|
|
17
|
+
if (input.focalX === null || input.focalY === null) return input.focalX === null && input.focalY === null;
|
|
18
|
+
return normalizeFocalPoint(input.focalX, input.focalY) !== null;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
//#endregion
|
|
22
|
+
export { normalizeFocalPoint as n, isValidFocalPointUpdate as t };
|
|
23
|
+
//# sourceMappingURL=focal-point-CZ3d1wK5.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focal-point-CZ3d1wK5.mjs","names":[],"sources":["../src/media/focal-point.ts"],"sourcesContent":["export interface FocalPoint {\n\tfocalX: number;\n\tfocalY: number;\n}\n\nexport interface FocalPointUpdate {\n\tfocalX?: number | null;\n\tfocalY?: number | null;\n}\n\nfunction isFocalCoordinate(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isFinite(value) && value >= 0 && value <= 1;\n}\n\nexport function normalizeFocalPoint(focalX: unknown, focalY: unknown): FocalPoint | null {\n\tif (!isFocalCoordinate(focalX) || !isFocalCoordinate(focalY)) return null;\n\treturn { focalX, focalY };\n}\n\nexport function isValidFocalPointUpdate(input: FocalPointUpdate): boolean {\n\tconst hasX = input.focalX !== undefined;\n\tconst hasY = input.focalY !== undefined;\n\tif (!hasX && !hasY) return true;\n\tif (!hasX || !hasY) return false;\n\tif (input.focalX === null || input.focalY === null) {\n\t\treturn input.focalX === null && input.focalY === null;\n\t}\n\treturn normalizeFocalPoint(input.focalX, input.focalY) !== null;\n}\n\nexport function focalPointToObjectPosition(focalX: unknown, focalY: unknown): string | undefined {\n\tconst point = normalizeFocalPoint(focalX, focalY);\n\tif (!point) return undefined;\n\tconst x = Math.round(point.focalX * 10_000) / 100;\n\tconst y = Math.round(point.focalY * 10_000) / 100;\n\treturn `${x}% ${y}%`;\n}\n"],"mappings":";AAUA,SAAS,kBAAkB,OAAiC;AAC3D,QAAO,OAAO,UAAU,YAAY,OAAO,SAAS,MAAM,IAAI,SAAS,KAAK,SAAS;;AAGtF,SAAgB,oBAAoB,QAAiB,QAAoC;AACxF,KAAI,CAAC,kBAAkB,OAAO,IAAI,CAAC,kBAAkB,OAAO,CAAE,QAAO;AACrE,QAAO;EAAE;EAAQ;EAAQ;;AAG1B,SAAgB,wBAAwB,OAAkC;CACzE,MAAM,OAAO,MAAM,WAAW;CAC9B,MAAM,OAAO,MAAM,WAAW;AAC9B,KAAI,CAAC,QAAQ,CAAC,KAAM,QAAO;AAC3B,KAAI,CAAC,QAAQ,CAAC,KAAM,QAAO;AAC3B,KAAI,MAAM,WAAW,QAAQ,MAAM,WAAW,KAC7C,QAAO,MAAM,WAAW,QAAQ,MAAM,WAAW;AAElD,QAAO,oBAAoB,MAAM,QAAQ,MAAM,OAAO,KAAK"}
|