emdash 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{activation-Dim4YMM7.mjs → activation-CGlyigmg.mjs} +3 -3
- package/dist/{activation-Dim4YMM7.mjs.map → activation-CGlyigmg.mjs.map} +1 -1
- package/dist/{adapters-F_xorvWv.d.mts → adapters-D9a1PfqH.d.mts} +1 -1
- package/dist/{adapters-F_xorvWv.d.mts.map → adapters-D9a1PfqH.d.mts.map} +1 -1
- package/dist/{after-PcEvMY_6.mjs → after-32yNRvd2.mjs} +5 -2
- package/dist/{after-PcEvMY_6.mjs.map → after-32yNRvd2.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +4 -4
- package/dist/api/route-utils.mjs +50 -49
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +1 -1
- package/dist/api/schemas/index.mjs +7 -7
- package/dist/{api-D-7BNHoz.mjs → api--PYoyeTo.mjs} +121 -48
- package/dist/api--PYoyeTo.mjs.map +1 -0
- package/dist/api-tokens-DqSlkDVI.mjs +9 -0
- package/dist/api-tokens-DqSlkDVI.mjs.map +1 -0
- package/dist/{api-tokens-Bx38ZCQp.mjs → api-tokens-GNCsIegW.mjs} +3 -3
- package/dist/{api-tokens-Bx38ZCQp.mjs.map → api-tokens-GNCsIegW.mjs.map} +1 -1
- package/dist/{apply-T7ATgzCh.mjs → apply-DVnupNeS.mjs} +149 -91
- package/dist/apply-DVnupNeS.mjs.map +1 -0
- package/dist/{approvals-D-m6wvGl.mjs → approvals-DTtYSB27.mjs} +2 -2
- package/dist/{approvals-D-m6wvGl.mjs.map → approvals-DTtYSB27.mjs.map} +1 -1
- package/dist/{artifacts-htGyfCSt.mjs → artifacts-Dvdp2KK-.mjs} +29 -13
- package/dist/artifacts-Dvdp2KK-.mjs.map +1 -0
- package/dist/astro/image-endpoint.mjs +12 -2
- package/dist/astro/image-endpoint.mjs.map +1 -1
- package/dist/astro/index.d.mts +15 -14
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +59 -8
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +13 -12
- package/dist/astro/middleware/auth.d.mts.map +1 -1
- package/dist/astro/middleware/auth.mjs +10 -8
- package/dist/astro/middleware/auth.mjs.map +1 -1
- package/dist/astro/middleware/media-usage-write-fence.mjs +5 -5
- package/dist/astro/middleware/redirect.d.mts.map +1 -1
- package/dist/astro/middleware/redirect.mjs +129 -49
- package/dist/astro/middleware/redirect.mjs.map +1 -1
- package/dist/astro/middleware/request-context.d.mts.map +1 -1
- package/dist/astro/middleware/request-context.mjs +18 -9
- package/dist/astro/middleware/request-context.mjs.map +1 -1
- package/dist/astro/middleware.d.mts +13 -12
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +111 -101
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +11 -11
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +11 -11
- 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 +6 -6
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +14 -14
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +14 -14
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +14 -14
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +25 -25
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +25 -25
- package/dist/astro/routes/api/admin/bylines/index.mjs +25 -25
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +17 -17
- package/dist/astro/routes/api/admin/comments/_id_.mjs +8 -8
- package/dist/astro/routes/api/admin/comments/bulk.mjs +16 -16
- package/dist/astro/routes/api/admin/comments/counts.mjs +8 -8
- package/dist/astro/routes/api/admin/comments/index.mjs +16 -16
- package/dist/astro/routes/api/admin/core-update.mjs +6 -6
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +5 -5
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +4 -4
- package/dist/astro/routes/api/admin/media-usage/activation.mjs +18 -18
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +19 -19
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +19 -19
- package/dist/astro/routes/api/admin/media-usage/progress.mjs +22 -21
- package/dist/astro/routes/api/admin/media-usage/progress.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +26 -25
- package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +19 -19
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +19 -19
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +4 -4
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +4 -4
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +7 -7
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +7 -7
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +66 -65
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +5 -5
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +66 -65
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +66 -65
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +73 -72
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +66 -65
- package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +4 -4
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +66 -65
- 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 +73 -72
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +66 -65
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +66 -65
- 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 +74 -73
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +4 -4
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +68 -67
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/publisher-handle.mjs +4 -4
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +67 -66
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +66 -65
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +66 -65
- 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 +4 -4
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +66 -65
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/_...path_.mjs +3 -3
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs +33 -32
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs +33 -32
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/approvals/index.mjs +35 -34
- package/dist/astro/routes/api/admin/transfer/approvals/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/capabilities.mjs +35 -34
- package/dist/astro/routes/api/admin/transfer/capabilities.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs +35 -34
- package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs +36 -35
- package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs +36 -35
- package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs +35 -34
- package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs +36 -35
- package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/exports/index.mjs +37 -36
- package/dist/astro/routes/api/admin/transfer/exports/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs +35 -34
- package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs +35 -34
- package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs +37 -36
- package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs +35 -34
- package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs +37 -36
- package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs +35 -34
- package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs +35 -34
- package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs +37 -36
- package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs +35 -34
- package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs +35 -34
- package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/index.mjs +37 -36
- package/dist/astro/routes/api/admin/transfer/imports/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +4 -4
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +3 -3
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +12 -12
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +4 -4
- package/dist/astro/routes/api/admin/users/index.mjs +11 -11
- package/dist/astro/routes/api/auth/dev-bypass.mjs +3 -3
- package/dist/astro/routes/api/auth/handover.mjs +5 -5
- package/dist/astro/routes/api/auth/invite/accept.mjs +3 -3
- package/dist/astro/routes/api/auth/invite/complete.mjs +15 -15
- package/dist/astro/routes/api/auth/invite/index.mjs +12 -12
- package/dist/astro/routes/api/auth/invite/register-options.mjs +13 -13
- package/dist/astro/routes/api/auth/logout.mjs +3 -3
- package/dist/astro/routes/api/auth/magic-link/send.mjs +14 -14
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +13 -13
- package/dist/astro/routes/api/auth/me.mjs +12 -12
- package/dist/astro/routes/api/auth/mode.mjs +3 -3
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +8 -8
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +1 -1
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +11 -11
- package/dist/astro/routes/api/auth/passkey/index.mjs +3 -3
- package/dist/astro/routes/api/auth/passkey/options.mjs +15 -15
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +13 -13
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +13 -13
- package/dist/astro/routes/api/auth/passkey/verify.mjs +15 -15
- package/dist/astro/routes/api/auth/signup/complete.mjs +15 -15
- package/dist/astro/routes/api/auth/signup/request.mjs +13 -13
- package/dist/astro/routes/api/auth/signup/verify.mjs +3 -3
- package/dist/astro/routes/api/calendar.mjs +12 -12
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +12 -12
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +15 -15
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +15 -15
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs +9 -9
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +29 -28
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +15 -15
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +34 -33
- 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 -33
- 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 +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +15 -15
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +35 -27
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/translations.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +8 -4
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +15 -15
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +15 -15
- package/dist/astro/routes/api/content/_collection_/authors.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/index.mjs +12 -12
- package/dist/astro/routes/api/content/_collection_/trash.mjs +12 -12
- package/dist/astro/routes/api/dashboard.mjs +22 -16
- package/dist/astro/routes/api/dashboard.mjs.map +1 -1
- package/dist/astro/routes/api/dev/emails.mjs +3 -3
- package/dist/astro/routes/api/dev/scheduled-tasks.mjs +97 -95
- package/dist/astro/routes/api/dev/scheduled-tasks.mjs.map +1 -1
- package/dist/astro/routes/api/health.mjs +4 -4
- package/dist/astro/routes/api/import/probe.d.mts +4 -3
- package/dist/astro/routes/api/import/probe.d.mts.map +1 -1
- package/dist/astro/routes/api/import/probe.mjs +27 -25
- package/dist/astro/routes/api/import/probe.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/analyze.d.mts +4 -3
- package/dist/astro/routes/api/import/wordpress/analyze.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +7 -29
- package/dist/astro/routes/api/import/wordpress/analyze.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +14 -13
- package/dist/astro/routes/api/import/wordpress/execute.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/execute.mjs +29 -29
- package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/media.d.mts +13 -12
- package/dist/astro/routes/api/import/wordpress/media.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/media.mjs +14 -14
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +19 -19
- package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +14 -13
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +25 -24
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +27 -25
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +14 -13
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +39 -38
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
- package/dist/astro/routes/api/manifest.mjs +4 -4
- package/dist/astro/routes/api/mcp.mjs +99 -83
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +16 -16
- package/dist/astro/routes/api/media/_id_/replace.mjs +12 -12
- package/dist/astro/routes/api/media/_id_/upload.mjs +6 -6
- package/dist/astro/routes/api/media/_id_/usage.mjs +28 -27
- package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_.mjs +26 -25
- package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs +5 -5
- package/dist/astro/routes/api/media/file/_...key_.d.mts.map +1 -1
- package/dist/astro/routes/api/media/file/_...key_.mjs +62 -8
- package/dist/astro/routes/api/media/file/_...key_.mjs.map +1 -1
- package/dist/astro/routes/api/media/folders/_id_.mjs +13 -13
- package/dist/astro/routes/api/media/folders/index.mjs +13 -13
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +4 -4
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +4 -4
- package/dist/astro/routes/api/media/providers/index.mjs +4 -4
- package/dist/astro/routes/api/media/upload-url.mjs +15 -15
- package/dist/astro/routes/api/media.mjs +30 -29
- package/dist/astro/routes/api/media.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +17 -15
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items.mjs +17 -15
- package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +17 -15
- package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/translations.mjs +17 -15
- package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_.mjs +17 -15
- package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/index.mjs +17 -15
- package/dist/astro/routes/api/menus/index.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/authorize.mjs +2 -2
- package/dist/astro/routes/api/oauth/device/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/code.mjs +8 -8
- package/dist/astro/routes/api/oauth/device/token.mjs +8 -8
- package/dist/astro/routes/api/oauth/register.mjs +5 -5
- package/dist/astro/routes/api/oauth/token/refresh.mjs +6 -6
- package/dist/astro/routes/api/oauth/token/revoke.mjs +6 -6
- package/dist/astro/routes/api/oauth/token.d.mts.map +1 -1
- package/dist/astro/routes/api/oauth/token.mjs +7 -7
- package/dist/astro/routes/api/oauth/token.mjs.map +1 -1
- package/dist/astro/routes/api/openapi.json.mjs +12 -12
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +9 -9
- package/dist/astro/routes/api/redirects/404s/index.mjs +20 -19
- package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/summary.mjs +20 -19
- package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/_id_.mjs +21 -20
- package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/index.mjs +21 -20
- package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/index.mjs +34 -33
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/index.mjs +34 -33
- package/dist/astro/routes/api/relations/index.mjs.map +1 -1
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +4 -4
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +15 -15
- package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs +66 -65
- 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 +66 -65
- 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 +66 -65
- package/dist/astro/routes/api/schema/block-types/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +66 -65
- 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 +66 -65
- 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 +66 -65
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +66 -65
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +66 -65
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/reorder.mjs +66 -65
- package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +17 -16
- package/dist/astro/routes/api/schema/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +66 -65
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +66 -65
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +20 -18
- package/dist/astro/routes/api/search/enable.mjs.map +1 -1
- package/dist/astro/routes/api/search/index.mjs +19 -17
- package/dist/astro/routes/api/search/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/rebuild.mjs +20 -18
- package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
- package/dist/astro/routes/api/search/stats.mjs +13 -11
- package/dist/astro/routes/api/search/stats.mjs.map +1 -1
- package/dist/astro/routes/api/search/suggest.mjs +19 -17
- package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
- package/dist/astro/routes/api/sections/_slug_.mjs +19 -17
- package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/sections/index.mjs +19 -17
- package/dist/astro/routes/api/sections/index.mjs.map +1 -1
- 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/domain-notify.mjs +7 -7
- package/dist/astro/routes/api/settings/domain.mjs +19 -17
- package/dist/astro/routes/api/settings/domain.mjs.map +1 -1
- package/dist/astro/routes/api/settings/email.mjs +5 -5
- package/dist/astro/routes/api/settings.mjs +25 -23
- package/dist/astro/routes/api/settings.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin-verify.mjs +18 -18
- package/dist/astro/routes/api/setup/admin.mjs +14 -14
- package/dist/astro/routes/api/setup/dev-bypass.mjs +45 -44
- package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-reset.mjs +3 -3
- package/dist/astro/routes/api/setup/index.mjs +48 -47
- package/dist/astro/routes/api/setup/index.mjs.map +1 -1
- package/dist/astro/routes/api/setup/status.mjs +4 -4
- package/dist/astro/routes/api/site/domain-proof.mjs +17 -15
- package/dist/astro/routes/api/site/domain-proof.mjs.map +1 -1
- package/dist/astro/routes/api/snapshot.mjs +9 -9
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +25 -24
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +25 -24
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +25 -24
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +25 -24
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +25 -24
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_.mjs +25 -24
- package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/bulk-tag.mjs +35 -34
- package/dist/astro/routes/api/taxonomies/bulk-tag.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +25 -24
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +6 -6
- package/dist/astro/routes/api/typegen.mjs +5 -5
- package/dist/astro/routes/api/visual-editing/action-token.mjs +5 -5
- package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs +17 -17
- package/dist/astro/routes/api/visual-editing/toolbar-labels.mjs +3 -3
- package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +1 -1
- package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/reorder.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +24 -13
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +22 -17
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +21 -17
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.mjs +14 -10
- package/dist/astro/routes/api/widget-areas/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/index.mjs +21 -17
- package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
- package/dist/astro/routes/api/widget-components.mjs +3 -3
- package/dist/astro/routes/robots.txt.mjs +16 -14
- package/dist/astro/routes/robots.txt.mjs.map +1 -1
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +18 -16
- package/dist/astro/routes/sitemap-_collection_.xml.mjs.map +1 -1
- package/dist/astro/routes/sitemap.xml.mjs +16 -14
- package/dist/astro/routes/sitemap.xml.mjs.map +1 -1
- package/dist/astro/types.d.mts +22 -20
- package/dist/astro/types.d.mts.map +1 -1
- package/dist/{audit-_gieLVGU.mjs → audit-B8XE-0UV.mjs} +2 -2
- package/dist/{audit-_gieLVGU.mjs.map → audit-B8XE-0UV.mjs.map} +1 -1
- package/dist/auth/providers/github.d.mts +1 -1
- package/dist/auth/providers/google.d.mts +1 -1
- package/dist/auth/providers/microsoft.d.mts +1 -1
- package/dist/{authorize-DPFBGbE6.mjs → authorize-NJgp8kLI.mjs} +2 -2
- package/dist/{authorize-DPFBGbE6.mjs.map → authorize-NJgp8kLI.mjs.map} +1 -1
- package/dist/{backup-3FgVxiDJ.mjs → backup-8rPSJ28a.mjs} +4 -4
- package/dist/{backup-3FgVxiDJ.mjs.map → backup-8rPSJ28a.mjs.map} +1 -1
- package/dist/{block-types-CYcG56JB.mjs → block-types-BbOrfnWs.mjs} +5 -5
- package/dist/{block-types-CYcG56JB.mjs.map → block-types-BbOrfnWs.mjs.map} +1 -1
- package/dist/{block-values-gCX4HBSl.mjs → block-values-Dg0-8PPS.mjs} +4 -4
- package/dist/{block-values-gCX4HBSl.mjs.map → block-values-Dg0-8PPS.mjs.map} +1 -1
- package/dist/{byline-BR1qhyiw.mjs → byline-DHJS-GGb.mjs} +123 -38
- package/dist/byline-DHJS-GGb.mjs.map +1 -0
- package/dist/{byline-fields-BLXZnX7N.mjs → byline-fields-CiR8FvvF.mjs} +3 -3
- package/dist/{byline-fields-BLXZnX7N.mjs.map → byline-fields-CiR8FvvF.mjs.map} +1 -1
- package/dist/{byline-fields-4ClDC88c.mjs → byline-fields-D6KYsEa7.mjs} +2 -2
- package/dist/{byline-fields-4ClDC88c.mjs.map → byline-fields-D6KYsEa7.mjs.map} +1 -1
- package/dist/{byline-registry-dvt4N3xV.mjs → byline-registry-BhzpO41z.mjs} +3 -3
- package/dist/{byline-registry-dvt4N3xV.mjs.map → byline-registry-BhzpO41z.mjs.map} +1 -1
- package/dist/{bylines-CVOvRUL7.mjs → bylines-Bsg5cH4S.mjs} +7 -7
- package/dist/bylines-Bsg5cH4S.mjs.map +1 -0
- package/dist/{bylines-DxOs9B7z.mjs → bylines-f_ZEc6Sn.mjs} +8 -8
- package/dist/{bylines-DxOs9B7z.mjs.map → bylines-f_ZEc6Sn.mjs.map} +1 -1
- package/dist/{cache-CEU9wo_h.mjs → cache-5DHbpEWu.mjs} +4 -4
- package/dist/{cache-CEU9wo_h.mjs.map → cache-5DHbpEWu.mjs.map} +1 -1
- package/dist/{capture-triggers-CT6dK9zd.mjs → capture-triggers-BezAvWcB.mjs} +2 -2
- package/dist/{capture-triggers-CT6dK9zd.mjs.map → capture-triggers-BezAvWcB.mjs.map} +1 -1
- package/dist/{challenge-store-C17BYx2-.mjs → challenge-store-B1C0V4b3.mjs} +1 -1
- package/dist/{challenge-store-C17BYx2-.mjs.map → challenge-store-B1C0V4b3.mjs.map} +1 -1
- package/dist/{chunks-xC4UD5-S.mjs → chunks-DiW8VMwz.mjs} +2 -2
- package/dist/{chunks-xC4UD5-S.mjs.map → chunks-DiW8VMwz.mjs.map} +1 -1
- package/dist/cli/index.mjs +53 -52
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +61 -61
- package/dist/client/index.d.mts.map +1 -1
- package/dist/client/index.mjs +3 -2
- package/dist/client/index.mjs.map +1 -1
- package/dist/{collection-slugs-cache-e09QeJQt.mjs → collection-slugs-cache-DIrLjqH-.mjs} +20 -14
- package/dist/collection-slugs-cache-DIrLjqH-.mjs.map +1 -0
- package/dist/{comment-UvIWDKcW.mjs → comment-DB74Zpa4.mjs} +18 -8
- package/dist/comment-DB74Zpa4.mjs.map +1 -0
- package/dist/{comment-reaction-dGp6_FRo.mjs → comment-reaction-BScxIWUn.mjs} +2 -2
- package/dist/{comment-reaction-dGp6_FRo.mjs.map → comment-reaction-BScxIWUn.mjs.map} +1 -1
- package/dist/{comments-pej-_BUO.mjs → comments-Cor_zKml.mjs} +3 -3
- package/dist/{comments-pej-_BUO.mjs.map → comments-Cor_zKml.mjs.map} +1 -1
- package/dist/config-Cs_AwWXI.mjs +106 -0
- package/dist/config-Cs_AwWXI.mjs.map +1 -0
- package/dist/{config-CFMojMFK.d.mts → config-D44_8G9J.d.mts} +3 -1
- package/dist/config-D44_8G9J.d.mts.map +1 -0
- package/dist/{config-Bsm_u_oE.d.mts → config-sDhZvkLR.d.mts} +56 -20
- package/dist/config-sDhZvkLR.d.mts.map +1 -0
- package/dist/{content-DQSRZTVw.mjs → content-BKHUVsE5.mjs} +67 -30
- package/dist/content-BKHUVsE5.mjs.map +1 -0
- package/dist/{content-list-query-CYKcY6Vi.d.mts → content-list-query-ByP4jRpZ.d.mts} +1 -1
- package/dist/{content-list-query-CYKcY6Vi.d.mts.map → content-list-query-ByP4jRpZ.d.mts.map} +1 -1
- package/dist/{content-policy-Dm32n9C6.mjs → content-policy-BmE0MPZY.mjs} +1 -1
- package/dist/{content-policy-Dm32n9C6.mjs.map → content-policy-BmE0MPZY.mjs.map} +1 -1
- package/dist/{content-repair-DNh5--x5.mjs → content-repair-Ukdxoq-R.mjs} +4 -4
- package/dist/{content-repair-DNh5--x5.mjs.map → content-repair-Ukdxoq-R.mjs.map} +1 -1
- package/dist/{context-BYptmCN0.mjs → context-CzjejcsE.mjs} +32 -33
- package/dist/context-CzjejcsE.mjs.map +1 -0
- package/dist/{credits-B9iORdWB.mjs → credits-BKREepht.mjs} +3 -3
- package/dist/{credits-B9iORdWB.mjs.map → credits-BKREepht.mjs.map} +1 -1
- package/dist/{dashboard-D0jcgBD7.mjs → dashboard-ynr1qJWM.mjs} +10 -9
- package/dist/dashboard-ynr1qJWM.mjs.map +1 -0
- package/dist/database/migration-lock.mjs +1 -1
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +3 -3
- package/dist/db/libsql-migrations.d.mts +1 -1
- package/dist/db/libsql-migrations.mjs +5 -5
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres-migrations.d.mts +1 -1
- package/dist/db/postgres-migrations.mjs +5 -5
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite-migrations.d.mts +1 -1
- package/dist/db/sqlite-migrations.mjs +5 -5
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/{db-errors-CBD5yMro.mjs → db-errors-unnO6yiZ.mjs} +12 -2
- package/dist/db-errors-unnO6yiZ.mjs.map +1 -0
- package/dist/deferred-tasks-wlMFJL95.d.mts +10 -0
- package/dist/deferred-tasks-wlMFJL95.d.mts.map +1 -0
- package/dist/{destination-r2zIAZ2S.mjs → destination-DR3IHjmy.mjs} +1 -1
- package/dist/{destination-r2zIAZ2S.mjs.map → destination-DR3IHjmy.mjs.map} +1 -1
- package/dist/{device-flow-BkFKBoAn.mjs → device-flow-D1U392GC.mjs} +3 -5
- package/dist/device-flow-D1U392GC.mjs.map +1 -0
- package/dist/{dialect-helpers-7_IqPdh9.mjs → dialect-helpers-B1XN2HGB.mjs} +10 -3
- package/dist/dialect-helpers-B1XN2HGB.mjs.map +1 -0
- package/dist/{direct-executor-Cbxzg4qe.mjs → direct-executor-Bs2g0ake.mjs} +4 -4
- package/dist/{direct-executor-Cbxzg4qe.mjs.map → direct-executor-Bs2g0ake.mjs.map} +1 -1
- package/dist/{dist-Cfu8mMBs.mjs → dist-BUmWMTbN.mjs} +1 -1
- package/dist/{dist-Cfu8mMBs.mjs.map → dist-BUmWMTbN.mjs.map} +1 -1
- package/dist/{email-locale-BJ8DjTzZ.mjs → email-locale-Bs3HFdnq.mjs} +1 -1
- package/dist/{email-locale-BJ8DjTzZ.mjs.map → email-locale-Bs3HFdnq.mjs.map} +1 -1
- package/dist/{emdash-runtime-DVi7vtXC.mjs → emdash-runtime-C8T-pZpS.mjs} +108 -62
- package/dist/emdash-runtime-C8T-pZpS.mjs.map +1 -0
- package/dist/{enrich-Duu4sV3a.mjs → enrich-DFlfnd3u.mjs} +3 -3
- package/dist/{enrich-Duu4sV3a.mjs.map → enrich-DFlfnd3u.mjs.map} +1 -1
- package/dist/{entry-lock-C7VX0NGK.d.mts → entry-lock-BulbgPBX.d.mts} +23 -23
- package/dist/{entry-lock-C7VX0NGK.d.mts.map → entry-lock-BulbgPBX.d.mts.map} +1 -1
- package/dist/{entry-lock-Df6-XhIu.mjs → entry-lock-CRVmruM0.mjs} +4 -4
- package/dist/{entry-lock-Df6-XhIu.mjs.map → entry-lock-CRVmruM0.mjs.map} +1 -1
- package/dist/{entry-lock-DLxCffFW.mjs → entry-lock-D-zJQ4q6.mjs} +3 -3
- package/dist/{entry-lock-DLxCffFW.mjs.map → entry-lock-D-zJQ4q6.mjs.map} +1 -1
- package/dist/{entry-locks-DJAqVweV.mjs → entry-locks-CJ9uhqg1.mjs} +2 -2
- package/dist/{entry-locks-DJAqVweV.mjs.map → entry-locks-CJ9uhqg1.mjs.map} +1 -1
- package/dist/{env-types-C3FCVBWe.mjs → env-types-BE3bCvfP.mjs} +5 -5
- package/dist/{env-types-C3FCVBWe.mjs.map → env-types-BE3bCvfP.mjs.map} +1 -1
- package/dist/{error-CVWeIOku.mjs → error-BCMgPxdn.mjs} +3 -3
- package/dist/{error-CVWeIOku.mjs.map → error-BCMgPxdn.mjs.map} +1 -1
- package/dist/{errors-BOYNdIo3.mjs → errors-8gJqv-XV.mjs} +15 -2
- package/dist/{errors-BOYNdIo3.mjs.map → errors-8gJqv-XV.mjs.map} +1 -1
- package/dist/{fence-C3MUitUN.mjs → fence-Dagicj14.mjs} +4 -4
- package/dist/{fence-C3MUitUN.mjs.map → fence-Dagicj14.mjs.map} +1 -1
- package/dist/{field-map-Bft9LKak.mjs → field-map-BSXdNGt5.mjs} +11 -10
- package/dist/field-map-BSXdNGt5.mjs.map +1 -0
- package/dist/{focal-point-JX8kcOTQ.mjs → focal-point-CgCcr1Ca.mjs} +1 -1
- package/dist/{focal-point-JX8kcOTQ.mjs.map → focal-point-CgCcr1Ca.mjs.map} +1 -1
- package/dist/{fts-manager-Beg3e4bI.mjs → fts-manager-6861qcwk.mjs} +68 -22
- package/dist/fts-manager-6861qcwk.mjs.map +1 -0
- package/dist/{gc-ByyAYiYE.mjs → gc-CNkXB3mE.mjs} +8 -8
- package/dist/{gc-ByyAYiYE.mjs.map → gc-CNkXB3mE.mjs.map} +1 -1
- package/dist/{hook-result-BrdLyOdI.d.mts → hook-result-f8t7hIuu.d.mts} +1 -1
- package/dist/{hook-result-BrdLyOdI.d.mts.map → hook-result-f8t7hIuu.d.mts.map} +1 -1
- package/dist/{hreflang-CY_F5OjF.d.mts → hreflang-8dUOJAPJ.d.mts} +2 -2
- package/dist/{hreflang-CY_F5OjF.d.mts.map → hreflang-8dUOJAPJ.d.mts.map} +1 -1
- package/dist/{hreflang-C8Jb-hrf.mjs → hreflang-BW5A4FLK.mjs} +8 -8
- package/dist/{hreflang-C8Jb-hrf.mjs.map → hreflang-BW5A4FLK.mjs.map} +1 -1
- package/dist/{http-route-dispatch-CyeW6iPv.mjs → http-route-dispatch-rXKvTNm9.mjs} +5 -5
- package/dist/{http-route-dispatch-CyeW6iPv.mjs.map → http-route-dispatch-rXKvTNm9.mjs.map} +1 -1
- package/dist/{identity-Cael5uTT.mjs → identity-CPRRSovU.mjs} +3 -3
- package/dist/{identity-Cael5uTT.mjs.map → identity-CPRRSovU.mjs.map} +1 -1
- package/dist/{import-BUXjdZUn.mjs → import-yVbfPyfd.mjs} +5 -5
- package/dist/{import-BUXjdZUn.mjs.map → import-yVbfPyfd.mjs.map} +1 -1
- package/dist/index-VM7Fzxwe.d.mts +260 -0
- package/dist/index-VM7Fzxwe.d.mts.map +1 -0
- package/dist/index.d.mts +25 -24
- package/dist/index.mjs +89 -88
- package/dist/{install-finalization-3JX5qQEA.mjs → install-finalization-RU6VrHOX.mjs} +1 -1
- package/dist/{install-finalization-3JX5qQEA.mjs.map → install-finalization-RU6VrHOX.mjs.map} +1 -1
- package/dist/{json-recordset-BUjxhr77.mjs → json-recordset-D0WhN2UA.mjs} +2 -2
- package/dist/{json-recordset-BUjxhr77.mjs.map → json-recordset-D0WhN2UA.mjs.map} +1 -1
- package/dist/{lifecycle-7vUJeFRe.mjs → lifecycle-B8d7Rdqx.mjs} +1 -1
- package/dist/{lifecycle-7vUJeFRe.mjs.map → lifecycle-B8d7Rdqx.mjs.map} +1 -1
- package/dist/{load-CdAG9wz-.mjs → load-D4xtzm6h.mjs} +2 -2
- package/dist/{load-CdAG9wz-.mjs.map → load-D4xtzm6h.mjs.map} +1 -1
- package/dist/{loader-CswroUbe.mjs → loader-DhnedqY4.mjs} +199 -101
- package/dist/loader-DhnedqY4.mjs.map +1 -0
- package/dist/{loops-uA4iTOzd.mjs → loops-B2YS-Zzr.mjs} +2 -2
- package/dist/{loops-uA4iTOzd.mjs.map → loops-B2YS-Zzr.mjs.map} +1 -1
- package/dist/{manifest-builder-B8zjuH3f.mjs → manifest-builder-g1FLviel.mjs} +10 -3
- package/dist/manifest-builder-g1FLviel.mjs.map +1 -0
- package/dist/media/image-endpoint.d.mts +3 -2
- package/dist/media/image-endpoint.d.mts.map +1 -1
- package/dist/media/image-endpoint.mjs +17 -8
- package/dist/media/image-endpoint.mjs.map +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +7 -6
- package/dist/media/index.mjs.map +1 -1
- package/dist/media/local-runtime.d.mts +15 -14
- package/dist/media/local-runtime.d.mts.map +1 -1
- package/dist/media/local-runtime.mjs +20 -15
- package/dist/media/local-runtime.mjs.map +1 -1
- package/dist/{media-1WC65OCB.mjs → media-BR4_t-Wd.mjs} +3 -3
- package/dist/{media-1WC65OCB.mjs.map → media-BR4_t-Wd.mjs.map} +1 -1
- package/dist/{media--dJRU6i2.mjs → media-CikS-q6E.mjs} +4 -4
- package/dist/{media--dJRU6i2.mjs.map → media-CikS-q6E.mjs.map} +1 -1
- package/dist/{media-Bws9f18T.mjs → media-DepNLhPq.mjs} +14 -4
- package/dist/media-DepNLhPq.mjs.map +1 -0
- package/dist/{media-allowlist-BJB7MFx6.mjs → media-allowlist-BMBLqyWh.mjs} +2 -2
- package/dist/{media-allowlist-BJB7MFx6.mjs.map → media-allowlist-BMBLqyWh.mjs.map} +1 -1
- package/dist/{media-folders-Dn3C16B8.mjs → media-folders-CI0Wydfo.mjs} +2 -2
- package/dist/{media-folders-Dn3C16B8.mjs.map → media-folders-CI0Wydfo.mjs.map} +1 -1
- package/dist/{media-usage-CF0WVcLO.mjs → media-usage-X1_20MY-.mjs} +8 -8
- package/dist/{media-usage-CF0WVcLO.mjs.map → media-usage-X1_20MY-.mjs.map} +1 -1
- package/dist/{media-usage-activation-C9HwVw5w.mjs → media-usage-activation-bWusy3M2.mjs} +3 -3
- package/dist/{media-usage-activation-C9HwVw5w.mjs.map → media-usage-activation-bWusy3M2.mjs.map} +1 -1
- package/dist/{media-usage-work-m3AWTmmC.mjs → media-usage-work-B2RaoJIa.mjs} +4 -4
- package/dist/{media-usage-work-m3AWTmmC.mjs.map → media-usage-work-B2RaoJIa.mjs.map} +1 -1
- package/dist/{media-usage-work-CkLa5-nc.mjs → media-usage-work-BCK2J-v_.mjs} +7 -7
- package/dist/{media-usage-work-CkLa5-nc.mjs.map → media-usage-work-BCK2J-v_.mjs.map} +1 -1
- package/dist/{menus-BCVSSp1z.mjs → menus-B0Qqv_cS.mjs} +176 -92
- package/dist/menus-B0Qqv_cS.mjs.map +1 -0
- package/dist/{menus-Cl4kwdt7.mjs → menus-oypxT1pI.mjs} +134 -53
- package/dist/menus-oypxT1pI.mjs.map +1 -0
- package/dist/{menus-BSzwObhV.mjs → menus-uEAxWAm1.mjs} +3 -3
- package/dist/{menus-BSzwObhV.mjs.map → menus-uEAxWAm1.mjs.map} +1 -1
- package/dist/migrations/index.d.mts +1 -1
- package/dist/migrations/index.mjs +5 -5
- package/dist/{mime-B5M9R53H.mjs → mime-D1We9jUx.mjs} +1 -1
- package/dist/{mime-B5M9R53H.mjs.map → mime-D1We9jUx.mjs.map} +1 -1
- package/dist/{normalize-BuWa0lvd.mjs → normalize-Cx-bNwhP.mjs} +41 -12
- package/dist/normalize-Cx-bNwhP.mjs.map +1 -0
- package/dist/{oauth-authorization-TpEJrYB7.mjs → oauth-authorization-CPLgBrdo.mjs} +19 -6
- package/dist/oauth-authorization-CPLgBrdo.mjs.map +1 -0
- package/dist/{oauth-state-store-CHMn_mwc.mjs → oauth-state-store-BndCfRum.mjs} +1 -1
- package/dist/{oauth-state-store-CHMn_mwc.mjs.map → oauth-state-store-BndCfRum.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/{object-cache-Bo6DGaC9.mjs → object-cache-DmKr09La.mjs} +21 -4
- package/dist/{object-cache-Bo6DGaC9.mjs.map → object-cache-DmKr09La.mjs.map} +1 -1
- package/dist/{options-DJWaq3Ie.d.mts → options-BUUgroHg.d.mts} +3 -3
- package/dist/{options-DJWaq3Ie.d.mts.map → options-BUUgroHg.d.mts.map} +1 -1
- package/dist/page/index.d.mts +2 -2
- package/dist/page/index.mjs +16 -14
- package/dist/page/index.mjs.map +1 -1
- package/dist/{parse-DgQ2NABT.mjs → parse-B_b6gZxG.mjs} +2 -2
- package/dist/{parse-DgQ2NABT.mjs.map → parse-B_b6gZxG.mjs.map} +1 -1
- package/dist/{parse-CWHOFc6z.d.mts → parse-Dndx1QmN.d.mts} +3 -3
- package/dist/{parse-CWHOFc6z.d.mts.map → parse-Dndx1QmN.d.mts.map} +1 -1
- package/dist/{passkey-config-D0kdzEao.mjs → passkey-config-D2Lua5__.mjs} +1 -1
- package/dist/{passkey-config-D0kdzEao.mjs.map → passkey-config-D2Lua5__.mjs.map} +1 -1
- package/dist/{patterns-CMNnYCgf.mjs → patterns-CryGz_EV.mjs} +1 -1
- package/dist/{patterns-CMNnYCgf.mjs.map → patterns-CryGz_EV.mjs.map} +1 -1
- package/dist/{placeholder-D41vk11_.d.mts → placeholder-CSKu5OkD.d.mts} +9 -1
- package/dist/placeholder-CSKu5OkD.d.mts.map +1 -0
- package/dist/plugin-test-runtime.d.mts +17 -15
- package/dist/plugin-test-runtime.d.mts.map +1 -1
- package/dist/plugin-test-runtime.mjs +99 -98
- package/dist/plugin-types.d.mts +2 -2
- package/dist/plugin-utils.d.mts +13 -12
- package/dist/plugin-utils.d.mts.map +1 -1
- package/dist/plugins/adapt-sandbox-entry.d.mts +13 -12
- package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
- package/dist/plugins/host.d.mts +5 -5
- package/dist/plugins/host.mjs +48 -47
- package/dist/{policy-DLQ--Hnm.mjs → policy-BPugqmeV.mjs} +13 -5
- package/dist/policy-BPugqmeV.mjs.map +1 -0
- package/dist/{protocol-79kUO7jP.d.mts → protocol-PoAfD_9W.d.mts} +2 -2
- package/dist/{protocol-79kUO7jP.d.mts.map → protocol-PoAfD_9W.d.mts.map} +1 -1
- package/dist/{public-plugin-api-routes-BuAMJ8nN.mjs → public-plugin-api-routes-CMljrTby.mjs} +9 -9
- package/dist/{public-plugin-api-routes-BuAMJ8nN.mjs.map → public-plugin-api-routes-CMljrTby.mjs.map} +1 -1
- package/dist/{public-submission-Di3TsgzX.mjs → public-submission-ayqoyee4.mjs} +10 -10
- package/dist/{public-submission-Di3TsgzX.mjs.map → public-submission-ayqoyee4.mjs.map} +1 -1
- package/dist/query-BFHjCzSh.mjs +37 -0
- package/dist/query-BFHjCzSh.mjs.map +1 -0
- package/dist/{query-CpnRlBh8.mjs → query-D62NntCZ.mjs} +55 -65
- package/dist/query-D62NntCZ.mjs.map +1 -0
- package/dist/{query-haKvLAWl.mjs → query-LmPY2y0C.mjs} +5 -5
- package/dist/{query-haKvLAWl.mjs.map → query-LmPY2y0C.mjs.map} +1 -1
- package/dist/{rate-limit-Xp4d0NBY.mjs → rate-limit-C04Llsoc.mjs} +3 -3
- package/dist/{rate-limit-Xp4d0NBY.mjs.map → rate-limit-C04Llsoc.mjs.map} +1 -1
- package/dist/{redirect-DiS_3mA4.mjs → redirect-DjLdw427.mjs} +6 -6
- package/dist/{redirect-DiS_3mA4.mjs.map → redirect-DjLdw427.mjs.map} +1 -1
- package/dist/{redirect-paths-CNYq7w80.mjs → redirect-paths-DOaVBp6E.mjs} +1 -1
- package/dist/{redirect-paths-CNYq7w80.mjs.map → redirect-paths-DOaVBp6E.mjs.map} +1 -1
- package/dist/{redirects-BHpy-VsZ.mjs → redirects-Cpq1catN.mjs} +6 -6
- package/dist/{redirects-BHpy-VsZ.mjs.map → redirects-Cpq1catN.mjs.map} +1 -1
- package/dist/{redirects-BEVSRMa2.mjs → redirects-CyvvZrCJ.mjs} +2 -2
- package/dist/{redirects-BEVSRMa2.mjs.map → redirects-CyvvZrCJ.mjs.map} +1 -1
- package/dist/{registry-TUVaid9Z.mjs → registry-B0-O575m.mjs} +25 -20
- package/dist/registry-B0-O575m.mjs.map +1 -0
- package/dist/{relations-CA_QuMTU.mjs → relations-WIOojTL4.mjs} +24 -11
- package/dist/relations-WIOojTL4.mjs.map +1 -0
- package/dist/{request-cache-C4CIo5ad.mjs → request-cache-5z2WzWmh.mjs} +1 -1
- package/dist/{request-cache-C4CIo5ad.mjs.map → request-cache-5z2WzWmh.mjs.map} +1 -1
- package/dist/request-context.d.mts +12 -1
- package/dist/request-context.d.mts.map +1 -1
- package/dist/request-context.mjs.map +1 -1
- package/dist/{resolve-DwNM-CXl.mjs → resolve-BNnm8EkB.mjs} +14 -13
- package/dist/{resolve-DwNM-CXl.mjs.map → resolve-BNnm8EkB.mjs.map} +1 -1
- package/dist/{resolve-D-kqyKns.mjs → resolve-DdNXBJSr.mjs} +4 -4
- package/dist/resolve-DdNXBJSr.mjs.map +1 -0
- package/dist/{revision-BVp8S0e_.mjs → revision-Dx7Uth1X.mjs} +5 -5
- package/dist/{revision-BVp8S0e_.mjs.map → revision-Dx7Uth1X.mjs.map} +1 -1
- package/dist/{routes-BerZFrvV.mjs → routes-avqgc-8r.mjs} +3 -3
- package/dist/{routes-BerZFrvV.mjs.map → routes-avqgc-8r.mjs.map} +1 -1
- package/dist/{runner-C5NeAkBQ.mjs → runner-Bkkfk4O8.mjs} +78 -4
- package/dist/runner-Bkkfk4O8.mjs.map +1 -0
- package/dist/{runner-BObHz5FC.d.mts → runner-Dfgp6-S_.d.mts} +7 -2
- package/dist/runner-Dfgp6-S_.d.mts.map +1 -0
- package/dist/runtime.d.mts +14 -13
- package/dist/runtime.d.mts.map +1 -1
- package/dist/runtime.mjs +8 -6
- package/dist/runtime.mjs.map +1 -1
- package/dist/schema/project-env-types.mjs +43 -42
- package/dist/schema/project-env-types.mjs.map +1 -1
- package/dist/{schema-DJRfvM_o.mjs → schema-B-3rntlX.mjs} +11 -11
- package/dist/{schema-DJRfvM_o.mjs.map → schema-B-3rntlX.mjs.map} +1 -1
- package/dist/{schema-C4OBuv6Z.mjs → schema-BqBlUZtb.mjs} +4 -4
- package/dist/{schema-C4OBuv6Z.mjs.map → schema-BqBlUZtb.mjs.map} +1 -1
- package/dist/{scopes-BU03K7Uo.mjs → scopes-DNaY7Ey0.mjs} +3 -3
- package/dist/{scopes-BU03K7Uo.mjs.map → scopes-DNaY7Ey0.mjs.map} +1 -1
- package/dist/{search-DfVzks89.mjs → search-BPWTnpnD.mjs} +32 -32
- package/dist/search-BPWTnpnD.mjs.map +1 -0
- package/dist/{secrets-Cc_O3Kp-.mjs → secrets-Dswzrz3k.mjs} +2 -2
- package/dist/{secrets-Cc_O3Kp-.mjs.map → secrets-Dswzrz3k.mjs.map} +1 -1
- package/dist/{sections-BMy4JVUz.mjs → sections-rSao6rBG.mjs} +3 -3
- package/dist/{sections-BMy4JVUz.mjs.map → sections-rSao6rBG.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +42 -41
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.mjs +30 -28
- package/dist/seo/index.mjs.map +1 -1
- package/dist/{seo-VZYOEy8f.mjs → seo-B_H_pqOd.mjs} +3 -3
- package/dist/{seo-VZYOEy8f.mjs.map → seo-B_H_pqOd.mjs.map} +1 -1
- package/dist/{service-Bo_usgSk.mjs → service-DpiUQVpp.mjs} +2 -2
- package/dist/{service-Bo_usgSk.mjs.map → service-DpiUQVpp.mjs.map} +1 -1
- package/dist/{session-user-DlpPdf8L.mjs → session-user-DiE4JKPP.mjs} +4 -4
- package/dist/{session-user-DlpPdf8L.mjs.map → session-user-DiE4JKPP.mjs.map} +1 -1
- package/dist/{settings-DS914jjE.mjs → settings--XlUdUaI.mjs} +3 -3
- package/dist/{settings-DS914jjE.mjs.map → settings--XlUdUaI.mjs.map} +1 -1
- package/dist/{settings-CWb84sDm.mjs → settings-D932YP2-.mjs} +111 -44
- package/dist/settings-D932YP2-.mjs.map +1 -0
- package/dist/{setup-complete-BuNxAUiN.mjs → setup-complete-qsJYWutC.mjs} +2 -2
- package/dist/{setup-complete-BuNxAUiN.mjs.map → setup-complete-qsJYWutC.mjs.map} +1 -1
- package/dist/{setup-nonce-BnEAX0iy.mjs → setup-nonce-CBFgUFXw.mjs} +1 -1
- package/dist/{setup-nonce-BnEAX0iy.mjs.map → setup-nonce-CBFgUFXw.mjs.map} +1 -1
- package/dist/{site-domain-Bq5j5bVg.mjs → site-domain-oRGS_JfA.mjs} +2 -2
- package/dist/{site-domain-Bq5j5bVg.mjs.map → site-domain-oRGS_JfA.mjs.map} +1 -1
- package/dist/{sitemap-name-BTg2NJJv.mjs → sitemap-name-B8QP8wud.mjs} +1 -1
- package/dist/{sitemap-name-BTg2NJJv.mjs.map → sitemap-name-B8QP8wud.mjs.map} +1 -1
- package/dist/{slugify-bu2-jKia.mjs → slugify-BDEG9pLk.mjs} +1 -1
- package/dist/{slugify-bu2-jKia.mjs.map → slugify-BDEG9pLk.mjs.map} +1 -1
- package/dist/{snapshot-DYsG4uOq.mjs → snapshot-BjaXDZQ5.mjs} +2 -2
- package/dist/{snapshot-DYsG4uOq.mjs.map → snapshot-BjaXDZQ5.mjs.map} +1 -1
- package/dist/{stage-D8DWgPcO.mjs → stage-CZQnXM_G.mjs} +3 -3
- package/dist/{stage-D8DWgPcO.mjs.map → stage-CZQnXM_G.mjs.map} +1 -1
- package/dist/{staged-CD_imitH.mjs → staged-ByBmPFtX.mjs} +3 -3
- package/dist/{staged-CD_imitH.mjs.map → staged-ByBmPFtX.mjs.map} +1 -1
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/{storage-query-DRyu3bSU.d.mts → storage-query-BFp06Y0s.d.mts} +22 -10
- package/dist/storage-query-BFp06Y0s.d.mts.map +1 -0
- package/dist/{taxonomies-Dd9JJv_a.mjs → taxonomies-5SR76j11.mjs} +15 -17
- package/dist/taxonomies-5SR76j11.mjs.map +1 -0
- package/dist/{taxonomies-ChnU7Mc8.mjs → taxonomies-B__VmCKQ.mjs} +64 -58
- package/dist/taxonomies-B__VmCKQ.mjs.map +1 -0
- package/dist/{taxonomy-C_C_LBAU.mjs → taxonomy-CMI5fczd.mjs} +30 -17
- package/dist/taxonomy-CMI5fczd.mjs.map +1 -0
- package/dist/{transaction-BVYIo_yu.mjs → transaction-CkoQ5wqQ.mjs} +1 -1
- package/dist/{transaction-BVYIo_yu.mjs.map → transaction-CkoQ5wqQ.mjs.map} +1 -1
- package/dist/{transfer-WmWiR3xf.mjs → transfer-BbKfufJ4.mjs} +2 -2
- package/dist/{transfer-WmWiR3xf.mjs.map → transfer-BbKfufJ4.mjs.map} +1 -1
- package/dist/{transfer-ClH6w6BV.mjs → transfer-DTGblAj2.mjs} +71 -34
- package/dist/{transfer-ClH6w6BV.mjs.map → transfer-DTGblAj2.mjs.map} +1 -1
- package/dist/{transfer-download--ofRj9Cw.mjs → transfer-download-D9LQEDX0.mjs} +1 -1
- package/dist/{transfer-download--ofRj9Cw.mjs.map → transfer-download-D9LQEDX0.mjs.map} +1 -1
- package/dist/{transport-DxiXnbXk.d.mts → transport-Dm5QzpT_.d.mts} +1 -1
- package/dist/{transport-DxiXnbXk.d.mts.map → transport-Dm5QzpT_.d.mts.map} +1 -1
- package/dist/{transport-BjbqNiPI.mjs → transport-Dzpn5b3i.mjs} +4 -3
- package/dist/transport-Dzpn5b3i.mjs.map +1 -0
- package/dist/{turnstile-CJwvsOqw.mjs → turnstile-Cs2wfkJG.mjs} +1 -1
- package/dist/{turnstile-CJwvsOqw.mjs.map → turnstile-Cs2wfkJG.mjs.map} +1 -1
- package/dist/{types-BA3ey2QH.d.mts → types-BAsCk5KU.d.mts} +1 -1
- package/dist/{types-BA3ey2QH.d.mts.map → types-BAsCk5KU.d.mts.map} +1 -1
- package/dist/{types-RLgeIpnF.d.mts → types-BuvSwT9Y.d.mts} +8 -7
- package/dist/{types-RLgeIpnF.d.mts.map → types-BuvSwT9Y.d.mts.map} +1 -1
- package/dist/{types-CNB-dj6F.d.mts → types-C4KT3Md2.d.mts} +10 -6
- package/dist/types-C4KT3Md2.d.mts.map +1 -0
- package/dist/{types-DvqVxZXa.d.mts → types-CVXHwIBB.d.mts} +1 -1
- package/dist/{types-DvqVxZXa.d.mts.map → types-CVXHwIBB.d.mts.map} +1 -1
- package/dist/{types-BGmQ0uXs.mjs → types-C_asjp1J.mjs} +1 -1
- package/dist/types-C_asjp1J.mjs.map +1 -0
- package/dist/{types-DHO7Pd25.d.mts → types-CadaL_k8.d.mts} +1 -1
- package/dist/{types-DHO7Pd25.d.mts.map → types-CadaL_k8.d.mts.map} +1 -1
- package/dist/{types-QoPHm-2w.d.mts → types-CjftrmZR.d.mts} +3 -3
- package/dist/{types-QoPHm-2w.d.mts.map → types-CjftrmZR.d.mts.map} +1 -1
- package/dist/{types-DCFavOii.d.mts → types-DKwRUA-x.d.mts} +1 -1
- package/dist/{types-DCFavOii.d.mts.map → types-DKwRUA-x.d.mts.map} +1 -1
- package/dist/{types-D2NEXtgB.mjs → types-DwhEvIVb.mjs} +8 -2
- package/dist/types-DwhEvIVb.mjs.map +1 -0
- package/dist/{types-Bwpzb5o6.d.mts → types-GwAyS5SH.d.mts} +1 -1
- package/dist/{types-Bwpzb5o6.d.mts.map → types-GwAyS5SH.d.mts.map} +1 -1
- package/dist/{types-slSqujQL.d.mts → types-uU2YNYSt.d.mts} +6 -1
- package/dist/types-uU2YNYSt.d.mts.map +1 -0
- package/dist/{update-check-BxNg9T6N.mjs → update-check-ABBJgg6M.mjs} +4 -4
- package/dist/{update-check-BxNg9T6N.mjs.map → update-check-ABBJgg6M.mjs.map} +1 -1
- package/dist/{url-Dn3IStq8.mjs → url-DTfGDJhI.mjs} +1 -1
- package/dist/{url-Dn3IStq8.mjs.map → url-DTfGDJhI.mjs.map} +1 -1
- package/dist/{user-BlCTKVAm.mjs → user-By8SzQxS.mjs} +3 -3
- package/dist/{user-BlCTKVAm.mjs.map → user-By8SzQxS.mjs.map} +1 -1
- package/dist/{utils-TPt7w2cS.mjs → utils-D5uOi6WS.mjs} +13 -5
- package/dist/utils-D5uOi6WS.mjs.map +1 -0
- package/dist/{index-BB9sVisO.d.mts → utils-Szp4iBQB.d.mts} +9 -256
- package/dist/utils-Szp4iBQB.d.mts.map +1 -0
- package/dist/{validate-emKxGC5F.d.mts → validate-DDvxy6qG.d.mts} +8 -8
- package/dist/{validate-emKxGC5F.d.mts.map → validate-DDvxy6qG.d.mts.map} +1 -1
- package/dist/{validate-DxYhJQA-.mjs → validate-Dz-TIOFB.mjs} +7 -7
- package/dist/{validate-DxYhJQA-.mjs.map → validate-Dz-TIOFB.mjs.map} +1 -1
- package/dist/{validation-Ckq4vsVg.mjs → validation-Fc9ZSUS_.mjs} +17 -16
- package/dist/{validation-Ckq4vsVg.mjs.map → validation-Fc9ZSUS_.mjs.map} +1 -1
- package/dist/version-Bu6Nlbb5.mjs +7 -0
- package/dist/{version-DHmGpcch.mjs.map → version-Bu6Nlbb5.mjs.map} +1 -1
- package/dist/version-DqB7LIO7.mjs +49 -0
- package/dist/version-DqB7LIO7.mjs.map +1 -0
- package/dist/{widgets-DA5XmvVC.mjs → widgets-BUx_Mf2q.mjs} +18 -5
- package/dist/widgets-BUx_Mf2q.mjs.map +1 -0
- package/dist/{wxr-taxonomies-RgRG0d5e.mjs → wxr-taxonomies-DbJtWrWM.mjs} +7 -6
- package/dist/wxr-taxonomies-DbJtWrWM.mjs.map +1 -0
- package/dist/{wxr-taxonomies-CrMonejI.d.mts → wxr-taxonomies-Dy2i2ON3.d.mts} +1 -1
- package/dist/wxr-taxonomies-Dy2i2ON3.d.mts.map +1 -0
- package/dist/{zod-generator-D0JKy94C.mjs → zod-generator--nlM0930.mjs} +5 -4
- package/dist/zod-generator--nlM0930.mjs.map +1 -0
- package/package.json +5 -5
- package/src/api/handlers/bulk-tag.ts +11 -3
- package/src/api/handlers/bylines.ts +6 -2
- package/src/api/handlers/content.ts +154 -23
- package/src/api/handlers/dashboard.ts +13 -6
- package/src/api/handlers/device-flow.ts +1 -3
- package/src/api/handlers/menus.ts +27 -13
- package/src/api/handlers/oauth-authorization.ts +1 -3
- package/src/api/handlers/relations.ts +15 -1
- package/src/api/handlers/taxonomies.ts +27 -17
- package/src/astro/image-endpoint.ts +23 -2
- package/src/astro/integration/admin-nav.ts +52 -0
- package/src/astro/integration/index.ts +7 -0
- package/src/astro/integration/runtime.ts +14 -0
- package/src/astro/integration/shims/use-sync-external-store-with-selector.js +2 -0
- package/src/astro/integration/shims/use-sync-external-store.js +4 -1
- package/src/astro/integration/vite-config.ts +16 -8
- package/src/astro/middleware/auth.ts +9 -2
- package/src/astro/middleware/redirect.ts +158 -63
- package/src/astro/middleware/request-context.ts +1 -0
- package/src/astro/middleware.ts +17 -4
- package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +4 -1
- package/src/astro/routes/api/content/[collection]/[id]/translations.ts +14 -1
- package/src/astro/routes/api/dashboard.ts +2 -0
- package/src/astro/routes/api/import/wordpress/analyze.ts +5 -29
- package/src/astro/routes/api/import/wordpress-plugin/execute.ts +3 -3
- package/src/astro/routes/api/media/file/[...key].ts +31 -7
- package/src/astro/routes/api/oauth/token.ts +5 -1
- package/src/astro/routes/api/widget-areas/[name]/reorder.ts +7 -1
- package/src/astro/routes/api/widget-areas/[name]/widgets/[id].ts +3 -1
- package/src/astro/routes/api/widget-areas/[name]/widgets.ts +2 -1
- package/src/astro/routes/api/widget-areas/[name].ts +2 -1
- package/src/astro/routes/api/widget-areas/index.ts +2 -1
- package/src/astro/types.ts +4 -3
- package/src/auth/api-tokens.ts +3 -0
- package/src/auth/types.ts +6 -0
- package/src/cleanup.ts +44 -0
- package/src/cli/commands/export-seed.ts +6 -4
- package/src/cli/commands/login.ts +2 -4
- package/src/client/index.ts +1 -0
- package/src/client/transport.ts +11 -7
- package/src/components/EmDashImage.astro +14 -2
- package/src/components/InlinePortableTextEditor.tsx +4 -1
- package/src/components/inline-bubble-menu.tsx +109 -95
- package/src/components/inline-image.tsx +54 -48
- package/src/database/dialect-helpers.ts +10 -3
- package/src/database/migrations/content-sized.ts +82 -0
- package/src/database/migrations/policy.ts +28 -2
- package/src/database/migrations/runner.ts +48 -0
- package/src/database/repositories/byline.ts +95 -31
- package/src/database/repositories/comment.ts +17 -7
- package/src/database/repositories/content.ts +96 -23
- package/src/database/repositories/media.ts +17 -0
- package/src/database/repositories/menu.ts +236 -139
- package/src/database/repositories/taxonomy-def.ts +9 -2
- package/src/database/repositories/taxonomy.ts +47 -14
- package/src/database/repositories/types.ts +14 -3
- package/src/database/types.ts +1 -1
- package/src/emdash-runtime.ts +60 -17
- package/src/fields/image.ts +1 -0
- package/src/i18n/config.ts +58 -10
- package/src/i18n/normalize.ts +16 -2
- package/src/i18n/query.ts +47 -0
- package/src/i18n/resolve.ts +8 -3
- package/src/import/utils.ts +15 -2
- package/src/import/wxr-taxonomies.ts +3 -2
- package/src/index.ts +1 -0
- package/src/loader.ts +183 -114
- package/src/mcp/server.ts +28 -1
- package/src/media/caption.ts +30 -0
- package/src/media/content-disposition.ts +56 -0
- package/src/media/image-endpoint.ts +13 -6
- package/src/media/local-runtime.ts +3 -0
- package/src/media/normalize.ts +17 -8
- package/src/media/responsive.ts +12 -2
- package/src/media/types.ts +16 -3
- package/src/media/usage/content-fields.ts +2 -1
- package/src/menus/index.ts +158 -36
- package/src/migrations/manifest.ts +1 -0
- package/src/object-cache/index.ts +22 -0
- package/src/plugin-test-runtime.ts +1 -0
- package/src/plugins/byline-access.ts +3 -1
- package/src/plugins/context.ts +1 -2
- package/src/plugins/storage-indexes.ts +7 -3
- package/src/query.ts +67 -53
- package/src/redirects/artifacts.ts +39 -5
- package/src/references/field-map.ts +6 -4
- package/src/request-context.ts +8 -0
- package/src/schema/collection-slugs-cache.ts +31 -17
- package/src/schema/registry.ts +9 -0
- package/src/schema/types.ts +7 -6
- package/src/schema/zod-generator.ts +2 -1
- package/src/search/fts-manager.ts +103 -31
- package/src/search/query.ts +31 -64
- package/src/seed/apply.ts +221 -109
- package/src/seed/types.ts +6 -4
- package/src/settings/index.ts +135 -35
- package/src/settings/version.ts +54 -0
- package/src/taxonomies/index.ts +99 -85
- package/src/taxonomies/term-counts.ts +2 -1
- package/src/transfer/import/advance.ts +12 -1
- package/src/transfer/import/scaffold.ts +7 -1
- package/src/transfer/import/stages.ts +53 -2
- package/src/utils/db-errors.ts +15 -0
- package/src/utils/revalidating-cache.ts +85 -0
- package/src/virtual-modules.d.ts +1 -0
- package/src/visual-editing/toolbar.ts +7 -2
- package/src/widgets/index.ts +27 -13
- package/dist/api-D-7BNHoz.mjs.map +0 -1
- package/dist/api-tokens-CdP49zVF.mjs +0 -3
- package/dist/apply-T7ATgzCh.mjs.map +0 -1
- package/dist/artifacts-htGyfCSt.mjs.map +0 -1
- package/dist/byline-BR1qhyiw.mjs.map +0 -1
- package/dist/bylines-CVOvRUL7.mjs.map +0 -1
- package/dist/collection-slugs-cache-e09QeJQt.mjs.map +0 -1
- package/dist/comment-UvIWDKcW.mjs.map +0 -1
- package/dist/config-Bsm_u_oE.d.mts.map +0 -1
- package/dist/config-CFMojMFK.d.mts.map +0 -1
- package/dist/config-CvmjJcVw.mjs +0 -73
- package/dist/config-CvmjJcVw.mjs.map +0 -1
- package/dist/content-DQSRZTVw.mjs.map +0 -1
- package/dist/context-BYptmCN0.mjs.map +0 -1
- package/dist/dashboard-D0jcgBD7.mjs.map +0 -1
- package/dist/db-errors-CBD5yMro.mjs.map +0 -1
- package/dist/deferred-tasks-ZvUECSzI.d.mts +0 -9
- package/dist/deferred-tasks-ZvUECSzI.d.mts.map +0 -1
- package/dist/device-flow-BkFKBoAn.mjs.map +0 -1
- package/dist/dialect-helpers-7_IqPdh9.mjs.map +0 -1
- package/dist/emdash-runtime-DVi7vtXC.mjs.map +0 -1
- package/dist/field-defs-cache-Dez5iWJJ.mjs +0 -77
- package/dist/field-defs-cache-Dez5iWJJ.mjs.map +0 -1
- package/dist/field-map-Bft9LKak.mjs.map +0 -1
- package/dist/fts-manager-Beg3e4bI.mjs.map +0 -1
- package/dist/index-BB9sVisO.d.mts.map +0 -1
- package/dist/loader-CswroUbe.mjs.map +0 -1
- package/dist/manifest-builder-B8zjuH3f.mjs.map +0 -1
- package/dist/media-Bws9f18T.mjs.map +0 -1
- package/dist/menus-BCVSSp1z.mjs.map +0 -1
- package/dist/menus-Cl4kwdt7.mjs.map +0 -1
- package/dist/normalize-BuWa0lvd.mjs.map +0 -1
- package/dist/oauth-authorization-TpEJrYB7.mjs.map +0 -1
- package/dist/placeholder-D41vk11_.d.mts.map +0 -1
- package/dist/policy-DLQ--Hnm.mjs.map +0 -1
- package/dist/query-CpnRlBh8.mjs.map +0 -1
- package/dist/registry-TUVaid9Z.mjs.map +0 -1
- package/dist/relations-CA_QuMTU.mjs.map +0 -1
- package/dist/resolve-D-kqyKns.mjs.map +0 -1
- package/dist/runner-BObHz5FC.d.mts.map +0 -1
- package/dist/runner-C5NeAkBQ.mjs.map +0 -1
- package/dist/search-DfVzks89.mjs.map +0 -1
- package/dist/settings-CWb84sDm.mjs.map +0 -1
- package/dist/storage-query-DRyu3bSU.d.mts.map +0 -1
- package/dist/taxonomies-ChnU7Mc8.mjs.map +0 -1
- package/dist/taxonomies-Dd9JJv_a.mjs.map +0 -1
- package/dist/taxonomy-C_C_LBAU.mjs.map +0 -1
- package/dist/transport-BjbqNiPI.mjs.map +0 -1
- package/dist/types-BGmQ0uXs.mjs.map +0 -1
- package/dist/types-CNB-dj6F.d.mts.map +0 -1
- package/dist/types-D2NEXtgB.mjs.map +0 -1
- package/dist/types-slSqujQL.d.mts.map +0 -1
- package/dist/utils-TPt7w2cS.mjs.map +0 -1
- package/dist/version-DHmGpcch.mjs +0 -7
- package/dist/widgets-DA5XmvVC.mjs.map +0 -1
- package/dist/wxr-taxonomies-CrMonejI.d.mts.map +0 -1
- package/dist/wxr-taxonomies-RgRG0d5e.mjs.map +0 -1
- package/dist/zod-generator-D0JKy94C.mjs.map +0 -1
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { t as
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
1
|
+
import { i as getLocaleCandidates, o as getLocaleRank } from "./config-Cs_AwWXI.mjs";
|
|
2
|
+
import { t as ContentRepository } from "./content-BKHUVsE5.mjs";
|
|
3
|
+
import { u as invalidateCollectionCache } from "./object-cache-DmKr09La.mjs";
|
|
4
|
+
import { r as requestCached } from "./request-cache-5z2WzWmh.mjs";
|
|
5
|
+
import { a as InvalidCursorError } from "./types-DwhEvIVb.mjs";
|
|
6
|
+
import { t as RevisionRepository } from "./revision-Dx7Uth1X.mjs";
|
|
7
|
+
import { t as withTransaction } from "./transaction-CkoQ5wqQ.mjs";
|
|
8
|
+
import { d as RelationRepository, l as readStagedReferences, s as pageStagedGroups } from "./staged-ByBmPFtX.mjs";
|
|
9
|
+
import { n as SchemaRegistry } from "./registry-B0-O575m.mjs";
|
|
10
|
+
import { s as invalidateSchemaCache } from "./zod-generator--nlM0930.mjs";
|
|
10
11
|
|
|
11
12
|
//#region src/api/handlers/validate-references.ts
|
|
12
13
|
function validationError(message) {
|
|
@@ -380,7 +381,19 @@ async function resolveRelation(repo, idOrSlug) {
|
|
|
380
381
|
* `locale` so callers never mistake a fallback for the requested locale.
|
|
381
382
|
*/
|
|
382
383
|
function pickVariant(items, locale) {
|
|
383
|
-
|
|
384
|
+
if (locale === null) return items[0];
|
|
385
|
+
const candidates = getLocaleCandidates(locale);
|
|
386
|
+
let best;
|
|
387
|
+
let bestRank = candidates.length;
|
|
388
|
+
for (const item of items) {
|
|
389
|
+
if (item.locale === null) continue;
|
|
390
|
+
const rank = getLocaleRank(item.locale, locale);
|
|
391
|
+
if (rank < bestRank) {
|
|
392
|
+
best = item;
|
|
393
|
+
bestRank = rank;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
return best ?? items[0];
|
|
384
397
|
}
|
|
385
398
|
/**
|
|
386
399
|
* Resolve edge groups to loadable entries in `collection` at `locale`.
|
|
@@ -773,4 +786,4 @@ async function handleReferenceParentsGet(db, collection, entryId, relation, page
|
|
|
773
786
|
|
|
774
787
|
//#endregion
|
|
775
788
|
export { referenceFieldConstraints as _, handleRelationCreate as a, handleRelationList as c, resolveEntryGroups as d, resolveReferenceSelection as f, writeReferenceSelection as g, validateOppositeSideLimit as h, handleReferenceParentsGet as i, handleRelationUpdate as l, setReferenceSelection as m, getReferenceTitleField as n, handleRelationDelete as o, resolveReferenceSelectionTargets as p, handleReferenceChildrenGet as r, handleRelationGet as s, fieldsBoundToRelation as t, resolveEntries as u, validateReferenceSelection as v, validateRequiredReferencesPresent as y };
|
|
776
|
-
//# sourceMappingURL=relations-
|
|
789
|
+
//# sourceMappingURL=relations-WIOojTL4.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relations-WIOojTL4.mjs","names":["isRecord"],"sources":["../src/api/handlers/validate-references.ts","../src/api/handlers/relations.ts"],"sourcesContent":["import type { Kysely } from \"kysely\";\n\nimport type { Database } from \"../../database/types.js\";\nimport { requestCached } from \"../../request-cache.js\";\nimport type { ApiResult } from \"../types.js\";\n\nexport interface ReferenceFieldConstraints {\n\t/** Field slug — how the entry API addresses the selection. */\n\tslug: string;\n\t/** Relation slug the field binds to. */\n\trelation: string;\n\t/** Relation id, for the reads that address the link table directly. */\n\trelationId: string | null;\n\t/** Which end of the relation the field's own collection sits on. */\n\trelationSide: \"parent\" | \"child\";\n\t/** How many entries this side of the relation may hold. `null` is unlimited. */\n\tmaxSelected: number | null;\n\t/** How many this field's selection may hand each entry it selects. */\n\tmaxOpposite: number | null;\n\trequired: boolean;\n}\n\nfunction validationError(message: string): ApiResult<never> {\n\treturn { success: false, error: { code: \"VALIDATION_ERROR\", message } };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\n/**\n * Every reference field on a collection that is bound to a relation, by field\n * slug — the key the entry API takes a selection under.\n */\nexport function referenceFieldConstraints(\n\tdb: Kysely<Database>,\n\tcollection: string,\n): Promise<Map<string, ReferenceFieldConstraints>> {\n\treturn requestCached(`reference-field-constraints:${collection}`, async () => {\n\t\tconst fields = await db\n\t\t\t.selectFrom(\"_emdash_fields\")\n\t\t\t.innerJoin(\"_emdash_collections\", \"_emdash_collections.id\", \"_emdash_fields.collection_id\")\n\t\t\t.select([\"_emdash_fields.slug\", \"_emdash_fields.required\", \"_emdash_fields.validation\"])\n\t\t\t.where(\"_emdash_collections.slug\", \"=\", collection)\n\t\t\t.where(\"_emdash_fields.type\", \"=\", \"reference\")\n\t\t\t.execute();\n\n\t\t// Cardinality lives on the relation, not the field: with both ends of a\n\t\t// relation bindable, two fields carrying their own limits could disagree\n\t\t// about one edge set. The field contributes only which end it views.\n\t\tconst relations = await db\n\t\t\t.selectFrom(\"_emdash_relations\")\n\t\t\t.select([\"id\", \"slug\", \"max_children_per_parent\", \"max_parents_per_child\"])\n\t\t\t.execute();\n\t\tconst limits = new Map(relations.map((r) => [r.slug, r]));\n\n\t\tconst constraints = new Map<string, ReferenceFieldConstraints>();\n\t\tfor (const field of fields) {\n\t\t\tif (!field.validation) continue;\n\n\t\t\tlet parsed: unknown;\n\t\t\ttry {\n\t\t\t\tparsed = JSON.parse(field.validation);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!isRecord(parsed) || typeof parsed.relation !== \"string\") continue;\n\n\t\t\tconst relation = limits.get(parsed.relation);\n\t\t\tconst relationSide = parsed.relationSide === \"child\" ? \"child\" : \"parent\";\n\t\t\tconst onChildSide = relationSide === \"child\";\n\n\t\t\tconstraints.set(field.slug, {\n\t\t\t\tslug: field.slug,\n\t\t\t\trelation: parsed.relation,\n\t\t\t\trelationId: relation?.id ?? null,\n\t\t\t\trelationSide,\n\t\t\t\tmaxSelected: onChildSide\n\t\t\t\t\t? (relation?.max_parents_per_child ?? null)\n\t\t\t\t\t: (relation?.max_children_per_parent ?? null),\n\t\t\t\tmaxOpposite: onChildSide\n\t\t\t\t\t? (relation?.max_children_per_parent ?? null)\n\t\t\t\t\t: (relation?.max_parents_per_child ?? null),\n\t\t\t\trequired: field.required === 1,\n\t\t\t});\n\t\t}\n\t\treturn constraints;\n\t});\n}\n\n/**\n * The field viewing one end of a relation, for the relation-scoped routes, which\n * address a relation rather than a field. At most one field binds each\n * (relation, side), so this is unambiguous.\n */\nexport function constraintsForRelationSide(\n\tconstraints: Map<string, ReferenceFieldConstraints>,\n\trelation: string,\n\tside: \"parent\" | \"child\",\n): ReferenceFieldConstraints | undefined {\n\tfor (const field of constraints.values()) {\n\t\tif (field.relation === relation && field.relationSide === side) return field;\n\t}\n\treturn undefined;\n}\n\nexport function validateReferenceSelection(\n\tconstraints: ReferenceFieldConstraints,\n\tchildIds: string[],\n): ApiResult<true> {\n\tconst max = constraints.maxSelected;\n\tif (max !== null && childIds.length > max) {\n\t\treturn validationError(\n\t\t\tmax === 1\n\t\t\t\t? `Field '${constraints.slug}' accepts a single reference, received ${childIds.length}.`\n\t\t\t\t: `Field '${constraints.slug}' accepts at most ${max} references, received ${childIds.length}.`,\n\t\t);\n\t}\n\tif (constraints.required && childIds.length === 0) {\n\t\treturn validationError(\n\t\t\t`Field '${constraints.slug}' is required and must reference at least one entry.`,\n\t\t);\n\t}\n\treturn { success: true, data: true };\n}\n\nexport async function validateRequiredReferencesPresent(\n\tdb: Kysely<Database>,\n\tcollection: string,\n\treferences: Record<string, string[]> | undefined,\n\ttranslationOf: string | undefined,\n): Promise<ApiResult<true>> {\n\t// References belong to a translation group, so a new locale row inherits\n\t// the source group's existing edges when its payload omits them.\n\tif (translationOf) return { success: true, data: true };\n\n\tconst constraints = await referenceFieldConstraints(db, collection);\n\tfor (const field of constraints.values()) {\n\t\tif (!field.required) continue;\n\t\tif (references && Object.hasOwn(references, field.slug)) continue;\n\t\treturn validationError(\n\t\t\t`Field '${field.slug}' is required and must reference at least one entry.`,\n\t\t);\n\t}\n\treturn { success: true, data: true };\n}\n","import type { Kysely } from \"kysely\";\n\nimport { ContentRepository } from \"../../database/repositories/content.js\";\nimport {\n\tRelationRepository,\n\ttype ContentReference,\n\ttype CreateRelationInput,\n\ttype Relation,\n\ttype UpdateRelationInput,\n} from \"../../database/repositories/relation.js\";\nimport { RevisionRepository } from \"../../database/repositories/revision.js\";\nimport { InvalidCursorError } from \"../../database/repositories/types.js\";\nimport type { ContentItem } from \"../../database/repositories/types.js\";\nimport { withTransaction } from \"../../database/transaction.js\";\nimport type { Database } from \"../../database/types.js\";\nimport { getLocaleCandidates, getLocaleRank } from \"../../i18n/config.js\";\nimport { invalidateCollectionCache } from \"../../object-cache/index.js\";\nimport {\n\tpageStagedGroups,\n\treadStagedReferences,\n\ttype PageOfGroups,\n} from \"../../references/staged.js\";\nimport { requestCached } from \"../../request-cache.js\";\nimport { invalidateSchemaCache } from \"../../schema/index.js\";\nimport { SchemaRegistry } from \"../../schema/registry.js\";\nimport type { ApiResult } from \"../types.js\";\nimport {\n\tconstraintsForRelationSide,\n\treferenceFieldConstraints,\n\tvalidateReferenceSelection,\n\ttype ReferenceFieldConstraints,\n} from \"./validate-references.js\";\n\n/** Map an edge-read failure: a bad pagination cursor is a 400 client error,\n * everything else is the generic 500-shaped reference-read error. */\nfunction referencesGetError(error: unknown): ApiResult<never> {\n\tif (error instanceof InvalidCursorError) {\n\t\treturn { success: false, error: { code: \"INVALID_CURSOR\", message: error.message } };\n\t}\n\treturn {\n\t\tsuccess: false,\n\t\terror: { code: \"REFERENCES_GET_ERROR\", message: \"Failed to get references\" },\n\t};\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\n/** True for SQLite UNIQUE / Postgres unique_violation messages (matches the\n * fingerprint used in the content handlers). Narrow enough not to catch NOT\n * NULL / CHECK violations whose messages also say \"constraint\". */\nfunction isUniqueViolation(error: unknown): boolean {\n\tconst message = error instanceof Error ? error.message.toLowerCase() : \"\";\n\treturn message.includes(\"unique constraint failed\") || message.includes(\"duplicate key\");\n}\n\nexport async function handleRelationCreate(\n\tdb: Kysely<Database>,\n\tinput: CreateRelationInput,\n): Promise<ApiResult<{ relation: Relation }>> {\n\ttry {\n\t\tconst repo = new RelationRepository(db);\n\n\t\t// Invariant: a relation must point at collections that exist. There is no\n\t\t// SQL FK (the edge endpoints are content translation_groups, which\n\t\t// precludes one), so a ghost collection would yield a\n\t\t// structurally-valid-but-permanently-useless relation.\n\t\tconst registry = new SchemaRegistry(db);\n\t\tfor (const collection of [input.parentCollection, input.childCollection]) {\n\t\t\tif (!(await registry.getCollection(collection))) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: {\n\t\t\t\t\t\tcode: \"COLLECTION_NOT_FOUND\",\n\t\t\t\t\t\tmessage: `Collection '${collection}' not found`,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst relation = await repo.create(input);\n\t\treturn { success: true, data: { relation } };\n\t} catch (error) {\n\t\tif (isUniqueViolation(error)) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: \"CONFLICT\",\n\t\t\t\t\tmessage: \"A relation with this slug already exists\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: { code: \"RELATION_CREATE_ERROR\", message: \"Failed to create relation\" },\n\t\t};\n\t}\n}\n\n/**\n * A relation plus what deleting it would take with it: the reference fields\n * that view it, and how many links it holds. Both delete dialogs enumerate\n * these before the user confirms.\n */\nexport interface RelationWithUsage extends Relation {\n\tboundFields: BoundField[];\n\tlinkCount: number;\n}\n\nexport async function handleRelationGet(\n\tdb: Kysely<Database>,\n\tid: string,\n): Promise<ApiResult<{ relation: RelationWithUsage }>> {\n\ttry {\n\t\tconst repo = new RelationRepository(db);\n\t\tconst relation = await repo.findById(id);\n\t\tif (!relation) {\n\t\t\treturn { success: false, error: { code: \"NOT_FOUND\", message: \"Relation not found\" } };\n\t\t}\n\t\tconst [boundFields, edgeCounts] = await Promise.all([\n\t\t\tfieldsBoundToRelation(db, relation.slug),\n\t\t\trepo.countEdgesByRelation(),\n\t\t]);\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: { relation: { ...relation, boundFields, linkCount: edgeCounts.get(relation.id) ?? 0 } },\n\t\t};\n\t} catch {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: { code: \"RELATION_GET_ERROR\", message: \"Failed to get relation\" },\n\t\t};\n\t}\n}\n\n/**\n * List relations, optionally only those `collection` takes part in.\n *\n * The admin's relation picker filters this way: a reference field can only bind\n * to a relation with its own collection on one end.\n */\nexport async function handleRelationList(\n\tdb: Kysely<Database>,\n\topts: { collection?: string } = {},\n): Promise<ApiResult<{ relations: RelationWithUsage[] }>> {\n\ttry {\n\t\tconst repo = new RelationRepository(db);\n\t\tconst [relations, boundByRelation, edgeCounts] = await Promise.all([\n\t\t\topts.collection ? repo.findForCollection(opts.collection) : repo.list(),\n\t\t\tfieldsBoundByRelation(db),\n\t\t\trepo.countEdgesByRelation(),\n\t\t]);\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: {\n\t\t\t\trelations: relations.map((relation) => ({\n\t\t\t\t\t...relation,\n\t\t\t\t\tboundFields: boundByRelation.get(relation.slug) ?? [],\n\t\t\t\t\tlinkCount: edgeCounts.get(relation.id) ?? 0,\n\t\t\t\t})),\n\t\t\t},\n\t\t};\n\t} catch {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: { code: \"RELATION_LIST_ERROR\", message: \"Failed to list relations\" },\n\t\t};\n\t}\n}\n\nexport async function handleRelationUpdate(\n\tdb: Kysely<Database>,\n\tid: string,\n\tinput: UpdateRelationInput,\n): Promise<ApiResult<{ relation: Relation }>> {\n\ttry {\n\t\tconst repo = new RelationRepository(db);\n\t\tconst relation = await repo.update(id, input);\n\t\tif (!relation) {\n\t\t\treturn { success: false, error: { code: \"NOT_FOUND\", message: \"Relation not found\" } };\n\t\t}\n\t\treturn { success: true, data: { relation } };\n\t} catch {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: { code: \"RELATION_UPDATE_ERROR\", message: \"Failed to update relation\" },\n\t\t};\n\t}\n}\n\n/** A reference field that views a relation, and which end it views it from. */\nexport interface BoundField {\n\tcollectionSlug: string;\n\tfieldSlug: string;\n\tside: \"parent\" | \"child\";\n}\n\n/**\n * Every reference field on the site, grouped by the slug of the relation it\n * binds.\n *\n * Filtered in JS rather than through `json_extract`: `_emdash_fields` holds one\n * row per field on the whole site, and the reference-typed subset of that is\n * small enough that a scan beats a dialect-specific JSON path. Grouping the\n * whole set in one pass also keeps the relations list to a single scan instead\n * of one per row.\n */\nexport async function fieldsBoundByRelation(\n\tdb: Kysely<Database>,\n): Promise<Map<string, BoundField[]>> {\n\tconst rows = await db\n\t\t.selectFrom(\"_emdash_fields\")\n\t\t.innerJoin(\"_emdash_collections\", \"_emdash_collections.id\", \"_emdash_fields.collection_id\")\n\t\t.select([\n\t\t\t\"_emdash_fields.slug as fieldSlug\",\n\t\t\t\"_emdash_collections.slug as collectionSlug\",\n\t\t\t\"_emdash_fields.validation as validation\",\n\t\t])\n\t\t.where(\"_emdash_fields.type\", \"=\", \"reference\")\n\t\t.execute();\n\n\tconst byRelation = new Map<string, BoundField[]>();\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) || typeof parsed.relation !== \"string\") continue;\n\t\tconst bound: BoundField = {\n\t\t\tcollectionSlug: row.collectionSlug,\n\t\t\tfieldSlug: row.fieldSlug,\n\t\t\tside: parsed.relationSide === \"child\" ? \"child\" : \"parent\",\n\t\t};\n\t\tconst list = byRelation.get(parsed.relation);\n\t\tif (list) list.push(bound);\n\t\telse byRelation.set(parsed.relation, [bound]);\n\t}\n\treturn byRelation;\n}\n\n/** Every reference field bound to one relation, across both of its ends. */\nexport async function fieldsBoundToRelation(\n\tdb: Kysely<Database>,\n\trelationSlug: string,\n): Promise<BoundField[]> {\n\treturn (await fieldsBoundByRelation(db)).get(relationSlug) ?? [];\n}\n\n/**\n * Delete a relation, the reference fields bound to it, and its edges.\n *\n * A relation is only ever deleted deliberately — from the relations admin page,\n * or by the checkbox on a field delete — and it cannot leave a field pointing at\n * nothing, so the fields go with it either way. Callers show the count first;\n * `deletedFields` reports what actually went.\n *\n * Order matters: fields first, then the relation row and its edges. On D1\n * `withTransaction` degrades to sequential statements, so an interrupted run\n * leaves a relation with fewer bound fields — visible on the relations page and\n * finishable — rather than fields pointing at a relation that no longer exists.\n */\nexport async function handleRelationDelete(\n\tdb: Kysely<Database>,\n\tid: string,\n): Promise<ApiResult<{ deleted: true; deletedFields: string[] }>> {\n\ttry {\n\t\tconst repo = new RelationRepository(db);\n\t\tconst relation = await repo.findById(id);\n\t\tif (!relation) {\n\t\t\treturn { success: false, error: { code: \"NOT_FOUND\", message: \"Relation not found\" } };\n\t\t}\n\n\t\tconst bound = await fieldsBoundToRelation(db, relation.slug);\n\n\t\tconst deleted = await withTransaction(db, async (trx) => {\n\t\t\tconst registry = new SchemaRegistry(trx);\n\t\t\tfor (const field of bound) {\n\t\t\t\tawait registry.deleteField(field.collectionSlug, field.fieldSlug);\n\t\t\t}\n\t\t\treturn new RelationRepository(trx).delete(id);\n\t\t});\n\n\t\tif (!deleted) {\n\t\t\treturn { success: false, error: { code: \"NOT_FOUND\", message: \"Relation not found\" } };\n\t\t}\n\n\t\tfor (const collection of new Set(bound.map((f) => f.collectionSlug))) {\n\t\t\tinvalidateCollectionCache(collection);\n\t\t\tinvalidateSchemaCache(collection);\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: {\n\t\t\t\tdeleted: true,\n\t\t\t\tdeletedFields: bound.map((f) => `${f.collectionSlug}.${f.fieldSlug}`),\n\t\t\t},\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"Relation delete error:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: { code: \"RELATION_DELETE_ERROR\", message: \"Failed to delete relation\" },\n\t\t};\n\t}\n}\n\nexport type EntryRef = {\n\tid: string;\n\tslug: string | null;\n\tcollection: string;\n\t/**\n\t * Display label sourced from the collection's configured `titleField`, then\n\t * `title`, then `name` — `null` when none is set, leaving the client to fall\n\t * back to slug/id. Mirrors the admin's `getEntryTitle`.\n\t */\n\ttitle: string | null;\n\t/** The actual locale of the resolved variant — see `pickVariant`. */\n\tlocale: string | null;\n\t/**\n\t * The edge's target: the translation group `id` was resolved from. Stable\n\t * across locales, unlike `id`, so callers comparing a ref against a content\n\t * row (the admin's picker) match the entry rather than one of its variants.\n\t */\n\ttranslationGroup: string | null;\n\tsortOrder?: number;\n};\n\n/**\n * Display title for a resolved entry: the collection's configured `titleField`,\n * then `title`, then `name`, else null.\n */\nfunction entryTitle(data: Record<string, unknown>, titleField?: string): string | null {\n\tif (titleField) {\n\t\tconst configured = data[titleField];\n\t\tif (typeof configured === \"string\" && configured.length > 0) return configured;\n\t}\n\tif (typeof data.title === \"string\" && data.title.length > 0) return data.title;\n\tif (typeof data.name === \"string\" && data.name.length > 0) return data.name;\n\treturn null;\n}\n\n/**\n * The collection's configured `titleField`, memoized for the request: a single\n * content read hydrates every reference field, and several of them commonly\n * target the same collection.\n */\nexport async function getReferenceTitleField(\n\tdb: Kysely<Database>,\n\tcollection: string,\n): Promise<string | undefined> {\n\treturn requestCached(`reference-title-field:${collection}`, async () => {\n\t\tconst row = await db\n\t\t\t.selectFrom(\"_emdash_collections\")\n\t\t\t.select(\"title_field\")\n\t\t\t.where(\"slug\", \"=\", collection)\n\t\t\t.executeTakeFirst();\n\t\treturn row?.title_field ?? undefined;\n\t});\n}\n\n/** Resolve a relation from an id OR its slug. */\nasync function resolveRelation(\n\trepo: RelationRepository,\n\tidOrSlug: string,\n): Promise<Relation | null> {\n\treturn (await repo.findById(idOrSlug)) ?? (await repo.findBySlug(idOrSlug));\n}\n\n/**\n * Pick the locale variant matching `locale`, falling back to the first entry\n * (lowest locale code). The fallback is intentional — an edge is keyed by\n * `translation_group`, so a referenced entry that exists only in another locale\n * is still a real reference — but the returned ref carries the variant's actual\n * `locale` so callers never mistake a fallback for the requested locale.\n */\nfunction pickVariant(items: ContentItem[], locale: string | null): ContentItem | undefined {\n\tif (locale === null) return items[0];\n\n\tconst candidates = getLocaleCandidates(locale);\n\tlet best: ContentItem | undefined;\n\tlet bestRank = candidates.length;\n\tfor (const item of items) {\n\t\tif (item.locale === null) continue;\n\t\tconst rank = getLocaleRank(item.locale, locale);\n\t\tif (rank < bestRank) {\n\t\t\tbest = item;\n\t\t\tbestRank = rank;\n\t\t}\n\t}\n\treturn best ?? items[0];\n}\n\n/**\n * Resolve edge groups to loadable entries in `collection` at `locale`.\n * Dangling groups (no surviving entry) are skipped — cleanup is a later slice.\n *\n * All groups are loaded in one batched query (chunked at `SQL_BATCH_SIZE`)\n * rather than a `findTranslations` per edge, so a parent with N children costs\n * a constant number of queries, not N+1. Edge order (the caller's `sort_order`)\n * is preserved by iterating `edges`.\n *\n * `includeDrafts` is false for callers without `content:read_drafts`: the load\n * is restricted to published entries so a draft/scheduled entry referenced by an\n * edge is skipped exactly like a dangling one, never leaking its id/slug/locale.\n */\nexport function resolveEntries(\n\tcontent: ContentRepository,\n\tcollection: string,\n\tedges: ContentReference[],\n\tpick: (e: ContentReference) => string,\n\tlocale: string | null,\n\tincludeDrafts: boolean,\n\ttitleField?: string,\n): Promise<EntryRef[]> {\n\treturn resolveGroupSelection(\n\t\tcontent,\n\t\tcollection,\n\t\tedges.map((edge) => ({ group: pick(edge), sortOrder: edge.sortOrder })),\n\t\tlocale,\n\t\tincludeDrafts,\n\t\ttitleField,\n\t);\n}\n\n/**\n * `resolveEntries` for a selection that has no links behind it yet — a pending\n * one staged in a draft revision, which is already a list of translation groups\n * in the order the editor chose. Position stands in for the `sort_order` the\n * links will carry once it is published.\n */\nexport function resolveEntryGroups(\n\tcontent: ContentRepository,\n\tcollection: string,\n\tgroups: string[],\n\tlocale: string | null,\n\tincludeDrafts: boolean,\n\ttitleField?: string,\n): Promise<EntryRef[]> {\n\treturn resolveGroupSelection(\n\t\tcontent,\n\t\tcollection,\n\t\tgroups.map((group, index) => ({ group, sortOrder: index })),\n\t\tlocale,\n\t\tincludeDrafts,\n\t\ttitleField,\n\t);\n}\n\nasync function resolveGroupSelection(\n\tcontent: ContentRepository,\n\tcollection: string,\n\tselection: Array<{ group: string; sortOrder: number }>,\n\tlocale: string | null,\n\tincludeDrafts: boolean,\n\ttitleField?: string,\n): Promise<EntryRef[]> {\n\tconst all = await content.findTranslationsForGroups(\n\t\tcollection,\n\t\tselection.map((entry) => entry.group),\n\t\t{ publishedOnly: !includeDrafts },\n\t);\n\n\t// Group the flat variant list by translation_group so each selected entry can\n\t// pick its own locale variant.\n\tconst variantsByGroup = new Map<string, ContentItem[]>();\n\tfor (const item of all) {\n\t\tif (item.translationGroup == null) continue;\n\t\tconst list = variantsByGroup.get(item.translationGroup);\n\t\tif (list) list.push(item);\n\t\telse variantsByGroup.set(item.translationGroup, [item]);\n\t}\n\n\tconst refs: EntryRef[] = [];\n\tfor (const selected of selection) {\n\t\tconst variants = variantsByGroup.get(selected.group);\n\t\tif (!variants) continue;\n\t\tconst entry = pickVariant(variants, locale);\n\t\tif (!entry) continue;\n\t\trefs.push({\n\t\t\tid: entry.id,\n\t\t\tslug: entry.slug,\n\t\t\tcollection,\n\t\t\ttitle: entryTitle(entry.data, titleField),\n\t\t\tlocale: entry.locale,\n\t\t\ttranslationGroup: entry.translationGroup,\n\t\t\tsortOrder: selected.sortOrder,\n\t\t});\n\t}\n\treturn refs;\n}\n\n/** Pagination inputs for the edge read endpoints. */\nexport type PageOptions = { limit?: number; cursor?: string };\n\n/**\n * The page of a pending selection this end stages, when there is one.\n *\n * These routes address a relation and a side; a staged selection is keyed by the\n * field slug the entry API takes it under, so the field viewing this end is what\n * connects them. Returns undefined when the caller may not see drafts, the entry\n * has no draft, or the draft stages nothing for this field — all of which mean\n * the published links are the answer.\n */\nasync function stagedPageFor(\n\tdb: Kysely<Database>,\n\toptions: {\n\t\tcollection: string;\n\t\trelationSlug: string;\n\t\tside: \"parent\" | \"child\";\n\t\tdraftRevisionId: string | null | undefined;\n\t\tincludeDrafts: boolean;\n\t\tpage: PageOptions;\n\t},\n): Promise<PageOfGroups | undefined> {\n\tif (!options.includeDrafts || !options.draftRevisionId) return undefined;\n\n\tconst field = constraintsForRelationSide(\n\t\tawait referenceFieldConstraints(db, options.collection),\n\t\toptions.relationSlug,\n\t\toptions.side,\n\t);\n\tif (!field) return undefined;\n\n\tconst revision = await new RevisionRepository(db).findById(options.draftRevisionId);\n\tconst groups = readStagedReferences(revision?.data)?.[field.slug];\n\tif (!groups) return undefined;\n\n\treturn pageStagedGroups(groups, options.page);\n}\n\nexport async function handleReferenceChildrenGet(\n\tdb: Kysely<Database>,\n\tcollection: string,\n\tentryId: string,\n\trelation: string,\n\tpage: PageOptions = {},\n\tincludeDrafts = false,\n): Promise<ApiResult<{ children: EntryRef[]; nextCursor?: string }>> {\n\ttry {\n\t\tconst repo = new RelationRepository(db);\n\t\tconst content = new ContentRepository(db);\n\n\t\tconst rel = await resolveRelation(repo, relation);\n\t\tif (!rel)\n\t\t\treturn { success: false, error: { code: \"NOT_FOUND\", message: \"Relation not found\" } };\n\t\tif (collection !== rel.parentCollection) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: \"VALIDATION_ERROR\",\n\t\t\t\t\tmessage: \"Entry is not the parent side of this relation\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst entry = await content.findByIdOrSlug(collection, entryId);\n\t\t// A caller without draft access must not anchor on a non-published entry —\n\t\t// return NOT_FOUND (not 403) so they can't probe draft ids by status code,\n\t\t// mirroring the single-item content read.\n\t\tif (!entry?.translationGroup || (!includeDrafts && entry.status !== \"published\")) {\n\t\t\treturn { success: false, error: { code: \"NOT_FOUND\", message: \"Content entry not found\" } };\n\t\t}\n\n\t\tconst titleField = await getReferenceTitleField(db, rel.childCollection);\n\n\t\t// A pending selection replaces the published one for a caller that may see\n\t\t// it, page for page — the entry read answers the same way, and a walk that\n\t\t// started on one of them must not continue on the other.\n\t\tconst staged = await stagedPageFor(db, {\n\t\t\tcollection,\n\t\t\trelationSlug: rel.slug,\n\t\t\tside: \"parent\",\n\t\t\tdraftRevisionId: entry.draftRevisionId,\n\t\t\tincludeDrafts,\n\t\t\tpage,\n\t\t});\n\t\tif (staged) {\n\t\t\tconst children = await resolveEntryGroups(\n\t\t\t\tcontent,\n\t\t\t\trel.childCollection,\n\t\t\t\tstaged.groups,\n\t\t\t\tentry.locale,\n\t\t\t\tincludeDrafts,\n\t\t\t\ttitleField,\n\t\t\t);\n\t\t\treturn { success: true, data: { children, nextCursor: staged.nextCursor } };\n\t\t}\n\n\t\tconst edges = await repo.getChildrenPage(rel.id, entry.translationGroup, page);\n\t\tconst children = await resolveEntries(\n\t\t\tcontent,\n\t\t\trel.childCollection,\n\t\t\tedges.items,\n\t\t\t(e) => e.childGroup,\n\t\t\tentry.locale,\n\t\t\tincludeDrafts,\n\t\t\ttitleField,\n\t\t);\n\t\treturn { success: true, data: { children, nextCursor: edges.nextCursor } };\n\t} catch (error) {\n\t\treturn referencesGetError(error);\n\t}\n}\n\n/**\n * A selection expressed in the identifiers the link table actually stores:\n * `translation_group` on both ends, because an edge names a thing rather than\n * one locale's row of it.\n */\nexport interface ReferenceSelectionWrite extends ResolvedReferenceTargets {\n\t/** The selecting entry's own translation group. */\n\tentryGroup: string;\n}\n\n/**\n * The same selection, resolved before the entry it belongs to is known — which\n * is what a create has to do, since its row does not exist until it is written\n * and, on D1, writing it cannot be taken back.\n */\nexport interface ResolvedReferenceTargets {\n\t/** The relation, by id or slug — `setChildren` / `setParents` take either. */\n\trelation: string;\n\t/** The end of the relation the selecting entry sits on. */\n\tside: \"parent\" | \"child\";\n\t/** The selected entries' translation groups, in the caller's order. */\n\tgroups: string[];\n}\n\n/**\n * Resolve a bound field's selection to what the link table stores, without\n * writing anything and without needing the selecting entry to exist.\n *\n * The field decides the relation and the end it views: a field on the `parent`\n * end selects children, one on the `child` end selects the parents pointing at\n * it. `entryGroup` is the selecting entry's own translation group when it has\n * one — the far-side count discounts links it already holds, since replacing a\n * selection with itself adds nothing. A new entry passes `null`: it holds no\n * links yet.\n */\nasync function resolveReferenceTargets(\n\tdb: Kysely<Database>,\n\tcollection: string,\n\tconstraints: ReferenceFieldConstraints,\n\tselectedIds: string[],\n\tentryGroup: string | null,\n): Promise<ApiResult<ResolvedReferenceTargets>> {\n\tconst repo = new RelationRepository(db);\n\tconst content = new ContentRepository(db);\n\tconst side = constraints.relationSide;\n\n\tconst rel = await resolveRelation(repo, constraints.relation);\n\tif (!rel) return { success: false, error: { code: \"NOT_FOUND\", message: \"Relation not found\" } };\n\n\tconst ownCollection = side === \"parent\" ? rel.parentCollection : rel.childCollection;\n\tconst otherCollection = side === \"parent\" ? rel.childCollection : rel.parentCollection;\n\tif (collection !== ownCollection) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: \"VALIDATION_ERROR\",\n\t\t\t\tmessage: `Entry is not the ${side} side of this relation`,\n\t\t\t},\n\t\t};\n\t}\n\n\tconst selection = validateReferenceSelection(constraints, selectedIds);\n\tif (!selection.success) return selection;\n\n\t// Resolve every selected entry within the relation's other collection in one\n\t// batch (constant queries, not an N+1 of point lookups for a set up to 1000).\n\t// An id that does not resolve there fails collection-agreement (invariant 3);\n\t// order is preserved by iterating the caller's ids.\n\tconst resolved = await content.findManyByIdOrSlug(otherCollection, selectedIds);\n\tconst groups: string[] = [];\n\tfor (const selectedId of selectedIds) {\n\t\tconst other = resolved.get(selectedId);\n\t\tif (!other?.translationGroup) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: \"NOT_FOUND\",\n\t\t\t\t\tmessage: `${side === \"parent\" ? \"Child\" : \"Parent\"} entry '${selectedId}' not found in ${otherCollection}`,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tgroups.push(other.translationGroup);\n\t}\n\n\tconst far = await validateOppositeSideLimit(db, {\n\t\trelationId: rel.id,\n\t\tfarLimit: side === \"parent\" ? rel.maxParentsPerChild : rel.maxChildrenPerParent,\n\t\tside,\n\t\tentryGroup,\n\t\tgroups,\n\t\tlabels: selectedIds,\n\t});\n\tif (!far.success) return far;\n\n\treturn { success: true, data: { relation: rel.id, side, groups } };\n}\n\n/**\n * Check what a selection does to the *other* end's cardinality.\n *\n * Cardinality binds both ends, but only one end ever selects: a field on the\n * parent side that hands a child its second parent breaks `maxParentsPerChild`\n * even though the parent's own limit is untouched. Links the selecting entry\n * already holds are discounted — replacing a selection with itself adds nothing.\n *\n * `labels` names each group the way the caller addressed it, so the message\n * quotes the id someone typed. Publication has only the groups, which it stages;\n * it quotes those.\n */\nexport async function validateOppositeSideLimit(\n\tdb: Kysely<Database>,\n\toptions: {\n\t\trelationId: string;\n\t\t/** The opposite end's limit. `null` is unlimited — nothing to check. */\n\t\tfarLimit: number | null;\n\t\t/** The end the selecting entry sits on. */\n\t\tside: \"parent\" | \"child\";\n\t\tentryGroup: string | null;\n\t\tgroups: string[];\n\t\tlabels?: string[];\n\t},\n): Promise<ApiResult<true>> {\n\tconst { farLimit, side, groups } = options;\n\tif (farLimit === null || groups.length === 0) return { success: true, data: true };\n\n\tconst counts = await new RelationRepository(db).countEdgesByGroup(\n\t\toptions.relationId,\n\t\tside === \"parent\" ? \"child\" : \"parent\",\n\t\tgroups,\n\t\toptions.entryGroup,\n\t);\n\tfor (const [index, group] of groups.entries()) {\n\t\tif ((counts.get(group) ?? 0) + 1 <= farLimit) continue;\n\t\tconst farSide = side === \"parent\" ? \"parent\" : \"child\";\n\t\tconst label = options.labels?.[index] ?? group;\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: \"VALIDATION_ERROR\",\n\t\t\t\tmessage:\n\t\t\t\t\tfarLimit === 1\n\t\t\t\t\t\t? `Entry '${label}' already has a ${farSide} on this relation, which allows one.`\n\t\t\t\t\t\t: `Entry '${label}' already has the maximum of ${farLimit} ${farSide} entries on this relation.`,\n\t\t\t},\n\t\t};\n\t}\n\treturn { success: true, data: true };\n}\n\n/**\n * {@link resolveReferenceTargets} for an entry that already exists, anchoring the\n * selection on that entry's translation group.\n */\nasync function resolveReferenceSide(\n\tdb: Kysely<Database>,\n\tcollection: string,\n\tentryId: string,\n\tconstraints: ReferenceFieldConstraints,\n\tselectedIds: string[],\n): Promise<ApiResult<ReferenceSelectionWrite>> {\n\tconst entry = await new ContentRepository(db).findByIdOrSlug(collection, entryId);\n\tif (!entry?.translationGroup) {\n\t\treturn { success: false, error: { code: \"NOT_FOUND\", message: \"Content entry not found\" } };\n\t}\n\n\tconst resolved = await resolveReferenceTargets(\n\t\tdb,\n\t\tcollection,\n\t\tconstraints,\n\t\tselectedIds,\n\t\tentry.translationGroup,\n\t);\n\tif (!resolved.success) return resolved;\n\treturn { success: true, data: { ...resolved.data, entryGroup: entry.translationGroup } };\n}\n\n/**\n * Replace one end's links from an already-resolved selection.\n *\n * Resolution has already proved the relation, the entry and every selected entry\n * exist, so nothing here fails on the caller's input. What it can still hit is\n * the far end's limit closing between resolving and writing — a slot another\n * request took in that window. The write refuses the edge rather than exceeding\n * the limit, and throws so the save reports it; the throw carries an `apiError`\n * the content handlers map to a response.\n */\nexport async function writeReferenceSelection(\n\tdb: Kysely<Database>,\n\tselection: ReferenceSelectionWrite,\n): Promise<void> {\n\tconst repo = new RelationRepository(db);\n\tconst rel = await resolveRelation(repo, selection.relation);\n\tif (!rel) return;\n\n\tconst rejected =\n\t\tselection.side === \"parent\"\n\t\t\t? await repo.setChildren(rel.id, selection.entryGroup, selection.groups)\n\t\t\t: await repo.setParents(rel.id, selection.entryGroup, selection.groups);\n\tif (rejected.length > 0) {\n\t\tconst farSide = selection.side === \"parent\" ? \"parent\" : \"child\";\n\t\tthrow Object.assign(\n\t\t\tnew Error(\n\t\t\t\t`Entry '${rejected[0]}' already has the maximum number of ${farSide} entries on this relation.`,\n\t\t\t),\n\t\t\t{ apiError: { code: \"VALIDATION_ERROR\" } },\n\t\t);\n\t}\n\n\t// A link is part of what a cached entry renders on both ends — a parent's\n\t// selection and a child's backlinks — while no row of either collection has\n\t// changed. Nothing else here would tell those snapshots they are stale.\n\tinvalidateCollectionCache(rel.parentCollection);\n\tif (rel.childCollection !== rel.parentCollection) {\n\t\tinvalidateCollectionCache(rel.childCollection);\n\t}\n}\n\n/**\n * Replace a reference field's selection on one entry, addressed by field slug.\n *\n * The field decides which relation and which end: a field bound to the parent\n * end replaces that entry's children, one bound to the child end replaces the\n * parents pointing at it. This is what the entry create/update body writes\n * through, so a site addresses a selection the way it addresses any other field.\n */\nexport async function setReferenceSelection(\n\tdb: Kysely<Database>,\n\tcollection: string,\n\tentryId: string,\n\tfieldSlug: string,\n\tselectedIds: string[],\n): Promise<ApiResult<{ relationId: string; entryGroup: string }>> {\n\tconst resolved = await resolveReferenceSelection(db, collection, entryId, fieldSlug, selectedIds);\n\tif (!resolved.success) return resolved;\n\tawait writeReferenceSelection(db, resolved.data);\n\treturn {\n\t\tsuccess: true,\n\t\tdata: { relationId: resolved.data.relation, entryGroup: resolved.data.entryGroup },\n\t};\n}\n\n/**\n * `setReferenceSelection` up to but not including the write.\n *\n * A collection that keeps drafts stages the result in its draft revision instead\n * of writing links, so a save reports a bad id or an over-long selection exactly\n * as a direct write would, and publication has nothing left to resolve.\n */\nexport async function resolveReferenceSelection(\n\tdb: Kysely<Database>,\n\tcollection: string,\n\tentryId: string,\n\tfieldSlug: string,\n\tselectedIds: string[],\n): Promise<ApiResult<ReferenceSelectionWrite>> {\n\tconst constraints = (await referenceFieldConstraints(db, collection)).get(fieldSlug);\n\tif (!constraints) return notAReferenceField(fieldSlug, collection);\n\treturn resolveReferenceSide(db, collection, entryId, constraints, selectedIds);\n}\n\n/**\n * `resolveReferenceSelection` for an entry that does not exist yet.\n *\n * A create resolves its whole payload before it writes its row, because on D1\n * that row is committed the moment it is written: a selection that cannot be\n * resolved has to be refused while there is still nothing to take back.\n *\n * `entryGroup` is the group the new row will join — a new translation inherits\n * the source's — or null when the row starts a group of its own and so holds no\n * links yet.\n */\nexport async function resolveReferenceSelectionTargets(\n\tdb: Kysely<Database>,\n\tcollection: string,\n\tfieldSlug: string,\n\tselectedIds: string[],\n\tentryGroup: string | null,\n): Promise<ApiResult<ResolvedReferenceTargets>> {\n\tconst constraints = (await referenceFieldConstraints(db, collection)).get(fieldSlug);\n\tif (!constraints) return notAReferenceField(fieldSlug, collection);\n\treturn resolveReferenceTargets(db, collection, constraints, selectedIds, entryGroup);\n}\n\nfunction notAReferenceField(fieldSlug: string, collection: string): ApiResult<never> {\n\treturn {\n\t\tsuccess: false,\n\t\terror: {\n\t\t\tcode: \"VALIDATION_ERROR\",\n\t\t\tmessage: `Field '${fieldSlug}' is not a reference field on ${collection}`,\n\t\t},\n\t};\n}\n\nexport async function handleReferenceParentsGet(\n\tdb: Kysely<Database>,\n\tcollection: string,\n\tentryId: string,\n\trelation: string,\n\tpage: PageOptions = {},\n\tincludeDrafts = false,\n): Promise<ApiResult<{ parents: EntryRef[]; nextCursor?: string }>> {\n\ttry {\n\t\tconst repo = new RelationRepository(db);\n\t\tconst content = new ContentRepository(db);\n\n\t\tconst rel = await resolveRelation(repo, relation);\n\t\tif (!rel)\n\t\t\treturn { success: false, error: { code: \"NOT_FOUND\", message: \"Relation not found\" } };\n\t\tif (collection !== rel.childCollection) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: \"VALIDATION_ERROR\",\n\t\t\t\t\tmessage: \"Entry is not the child side of this relation\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst entry = await content.findByIdOrSlug(collection, entryId);\n\t\t// Same draft-anchor guard as the children read: a non-draft-reader anchoring\n\t\t// on an unpublished entry gets NOT_FOUND, not its backlinks.\n\t\tif (!entry?.translationGroup || (!includeDrafts && entry.status !== \"published\")) {\n\t\t\treturn { success: false, error: { code: \"NOT_FOUND\", message: \"Content entry not found\" } };\n\t\t}\n\n\t\tconst titleField = await getReferenceTitleField(db, rel.parentCollection);\n\n\t\t// As on the children read: a field bound to this end stages its pending\n\t\t// selection in the entry's draft, and that is what a drafts-aware caller\n\t\t// pages through.\n\t\tconst staged = await stagedPageFor(db, {\n\t\t\tcollection,\n\t\t\trelationSlug: rel.slug,\n\t\t\tside: \"child\",\n\t\t\tdraftRevisionId: entry.draftRevisionId,\n\t\t\tincludeDrafts,\n\t\t\tpage,\n\t\t});\n\t\tif (staged) {\n\t\t\tconst parents = await resolveEntryGroups(\n\t\t\t\tcontent,\n\t\t\t\trel.parentCollection,\n\t\t\t\tstaged.groups,\n\t\t\t\tentry.locale,\n\t\t\t\tincludeDrafts,\n\t\t\t\ttitleField,\n\t\t\t);\n\t\t\treturn { success: true, data: { parents, nextCursor: staged.nextCursor } };\n\t\t}\n\n\t\tconst edges = await repo.getParentsPage(rel.id, entry.translationGroup, page);\n\t\tconst parents = await resolveEntries(\n\t\t\tcontent,\n\t\t\trel.parentCollection,\n\t\t\tedges.items,\n\t\t\t(e) => e.parentGroup,\n\t\t\tentry.locale,\n\t\t\tincludeDrafts,\n\t\t\ttitleField,\n\t\t);\n\t\treturn { success: true, data: { parents, nextCursor: edges.nextCursor } };\n\t} catch (error) {\n\t\treturn referencesGetError(error);\n\t}\n}\n"],"mappings":";;;;;;;;;;;;AAsBA,SAAS,gBAAgB,SAAmC;AAC3D,QAAO;EAAE,SAAS;EAAO,OAAO;GAAE,MAAM;GAAoB;GAAS;EAAE;;AAGxE,SAASA,WAAS,OAAkD;AACnE,QAAO,OAAO,UAAU,YAAY,UAAU;;;;;;AAO/C,SAAgB,0BACf,IACA,YACkD;AAClD,QAAO,cAAc,+BAA+B,cAAc,YAAY;EAC7E,MAAM,SAAS,MAAM,GACnB,WAAW,iBAAiB,CAC5B,UAAU,uBAAuB,0BAA0B,+BAA+B,CAC1F,OAAO;GAAC;GAAuB;GAA2B;GAA4B,CAAC,CACvF,MAAM,4BAA4B,KAAK,WAAW,CAClD,MAAM,uBAAuB,KAAK,YAAY,CAC9C,SAAS;EAKX,MAAM,YAAY,MAAM,GACtB,WAAW,oBAAoB,CAC/B,OAAO;GAAC;GAAM;GAAQ;GAA2B;GAAwB,CAAC,CAC1E,SAAS;EACX,MAAM,SAAS,IAAI,IAAI,UAAU,KAAK,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;EAEzD,MAAM,8BAAc,IAAI,KAAwC;AAChE,OAAK,MAAM,SAAS,QAAQ;AAC3B,OAAI,CAAC,MAAM,WAAY;GAEvB,IAAI;AACJ,OAAI;AACH,aAAS,KAAK,MAAM,MAAM,WAAW;WAC9B;AACP;;AAED,OAAI,CAACA,WAAS,OAAO,IAAI,OAAO,OAAO,aAAa,SAAU;GAE9D,MAAM,WAAW,OAAO,IAAI,OAAO,SAAS;GAC5C,MAAM,eAAe,OAAO,iBAAiB,UAAU,UAAU;GACjE,MAAM,cAAc,iBAAiB;AAErC,eAAY,IAAI,MAAM,MAAM;IAC3B,MAAM,MAAM;IACZ,UAAU,OAAO;IACjB,YAAY,UAAU,MAAM;IAC5B;IACA,aAAa,cACT,UAAU,yBAAyB,OACnC,UAAU,2BAA2B;IACzC,aAAa,cACT,UAAU,2BAA2B,OACrC,UAAU,yBAAyB;IACvC,UAAU,MAAM,aAAa;IAC7B,CAAC;;AAEH,SAAO;GACN;;;;;;;AAQH,SAAgB,2BACf,aACA,UACA,MACwC;AACxC,MAAK,MAAM,SAAS,YAAY,QAAQ,CACvC,KAAI,MAAM,aAAa,YAAY,MAAM,iBAAiB,KAAM,QAAO;;AAKzE,SAAgB,2BACf,aACA,UACkB;CAClB,MAAM,MAAM,YAAY;AACxB,KAAI,QAAQ,QAAQ,SAAS,SAAS,IACrC,QAAO,gBACN,QAAQ,IACL,UAAU,YAAY,KAAK,yCAAyC,SAAS,OAAO,KACpF,UAAU,YAAY,KAAK,oBAAoB,IAAI,wBAAwB,SAAS,OAAO,GAC9F;AAEF,KAAI,YAAY,YAAY,SAAS,WAAW,EAC/C,QAAO,gBACN,UAAU,YAAY,KAAK,sDAC3B;AAEF,QAAO;EAAE,SAAS;EAAM,MAAM;EAAM;;AAGrC,eAAsB,kCACrB,IACA,YACA,YACA,eAC2B;AAG3B,KAAI,cAAe,QAAO;EAAE,SAAS;EAAM,MAAM;EAAM;CAEvD,MAAM,cAAc,MAAM,0BAA0B,IAAI,WAAW;AACnE,MAAK,MAAM,SAAS,YAAY,QAAQ,EAAE;AACzC,MAAI,CAAC,MAAM,SAAU;AACrB,MAAI,cAAc,OAAO,OAAO,YAAY,MAAM,KAAK,CAAE;AACzD,SAAO,gBACN,UAAU,MAAM,KAAK,sDACrB;;AAEF,QAAO;EAAE,SAAS;EAAM,MAAM;EAAM;;;;;;;AC7GrC,SAAS,mBAAmB,OAAkC;AAC7D,KAAI,iBAAiB,mBACpB,QAAO;EAAE,SAAS;EAAO,OAAO;GAAE,MAAM;GAAkB,SAAS,MAAM;GAAS;EAAE;AAErF,QAAO;EACN,SAAS;EACT,OAAO;GAAE,MAAM;GAAwB,SAAS;GAA4B;EAC5E;;AAGF,SAAS,SAAS,OAAkD;AACnE,QAAO,OAAO,UAAU,YAAY,UAAU;;;;;AAM/C,SAAS,kBAAkB,OAAyB;CACnD,MAAM,UAAU,iBAAiB,QAAQ,MAAM,QAAQ,aAAa,GAAG;AACvE,QAAO,QAAQ,SAAS,2BAA2B,IAAI,QAAQ,SAAS,gBAAgB;;AAGzF,eAAsB,qBACrB,IACA,OAC6C;AAC7C,KAAI;EACH,MAAM,OAAO,IAAI,mBAAmB,GAAG;EAMvC,MAAM,WAAW,IAAI,eAAe,GAAG;AACvC,OAAK,MAAM,cAAc,CAAC,MAAM,kBAAkB,MAAM,gBAAgB,CACvE,KAAI,CAAE,MAAM,SAAS,cAAc,WAAW,CAC7C,QAAO;GACN,SAAS;GACT,OAAO;IACN,MAAM;IACN,SAAS,eAAe,WAAW;IACnC;GACD;AAKH,SAAO;GAAE,SAAS;GAAM,MAAM,EAAE,UADf,MAAM,KAAK,OAAO,MAAM,EACC;GAAE;UACpC,OAAO;AACf,MAAI,kBAAkB,MAAM,CAC3B,QAAO;GACN,SAAS;GACT,OAAO;IACN,MAAM;IACN,SAAS;IACT;GACD;AAEF,SAAO;GACN,SAAS;GACT,OAAO;IAAE,MAAM;IAAyB,SAAS;IAA6B;GAC9E;;;AAcH,eAAsB,kBACrB,IACA,IACsD;AACtD,KAAI;EACH,MAAM,OAAO,IAAI,mBAAmB,GAAG;EACvC,MAAM,WAAW,MAAM,KAAK,SAAS,GAAG;AACxC,MAAI,CAAC,SACJ,QAAO;GAAE,SAAS;GAAO,OAAO;IAAE,MAAM;IAAa,SAAS;IAAsB;GAAE;EAEvF,MAAM,CAAC,aAAa,cAAc,MAAM,QAAQ,IAAI,CACnD,sBAAsB,IAAI,SAAS,KAAK,EACxC,KAAK,sBAAsB,CAC3B,CAAC;AACF,SAAO;GACN,SAAS;GACT,MAAM,EAAE,UAAU;IAAE,GAAG;IAAU;IAAa,WAAW,WAAW,IAAI,SAAS,GAAG,IAAI;IAAG,EAAE;GAC7F;SACM;AACP,SAAO;GACN,SAAS;GACT,OAAO;IAAE,MAAM;IAAsB,SAAS;IAA0B;GACxE;;;;;;;;;AAUH,eAAsB,mBACrB,IACA,OAAgC,EAAE,EACuB;AACzD,KAAI;EACH,MAAM,OAAO,IAAI,mBAAmB,GAAG;EACvC,MAAM,CAAC,WAAW,iBAAiB,cAAc,MAAM,QAAQ,IAAI;GAClE,KAAK,aAAa,KAAK,kBAAkB,KAAK,WAAW,GAAG,KAAK,MAAM;GACvE,sBAAsB,GAAG;GACzB,KAAK,sBAAsB;GAC3B,CAAC;AACF,SAAO;GACN,SAAS;GACT,MAAM,EACL,WAAW,UAAU,KAAK,cAAc;IACvC,GAAG;IACH,aAAa,gBAAgB,IAAI,SAAS,KAAK,IAAI,EAAE;IACrD,WAAW,WAAW,IAAI,SAAS,GAAG,IAAI;IAC1C,EAAE,EACH;GACD;SACM;AACP,SAAO;GACN,SAAS;GACT,OAAO;IAAE,MAAM;IAAuB,SAAS;IAA4B;GAC3E;;;AAIH,eAAsB,qBACrB,IACA,IACA,OAC6C;AAC7C,KAAI;EAEH,MAAM,WAAW,MADJ,IAAI,mBAAmB,GAAG,CACX,OAAO,IAAI,MAAM;AAC7C,MAAI,CAAC,SACJ,QAAO;GAAE,SAAS;GAAO,OAAO;IAAE,MAAM;IAAa,SAAS;IAAsB;GAAE;AAEvF,SAAO;GAAE,SAAS;GAAM,MAAM,EAAE,UAAU;GAAE;SACrC;AACP,SAAO;GACN,SAAS;GACT,OAAO;IAAE,MAAM;IAAyB,SAAS;IAA6B;GAC9E;;;;;;;;;;;;;AAqBH,eAAsB,sBACrB,IACqC;CACrC,MAAM,OAAO,MAAM,GACjB,WAAW,iBAAiB,CAC5B,UAAU,uBAAuB,0BAA0B,+BAA+B,CAC1F,OAAO;EACP;EACA;EACA;EACA,CAAC,CACD,MAAM,uBAAuB,KAAK,YAAY,CAC9C,SAAS;CAEX,MAAM,6BAAa,IAAI,KAA2B;AAClD,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,IAAI,OAAO,OAAO,aAAa,SAAU;EAC9D,MAAM,QAAoB;GACzB,gBAAgB,IAAI;GACpB,WAAW,IAAI;GACf,MAAM,OAAO,iBAAiB,UAAU,UAAU;GAClD;EACD,MAAM,OAAO,WAAW,IAAI,OAAO,SAAS;AAC5C,MAAI,KAAM,MAAK,KAAK,MAAM;MACrB,YAAW,IAAI,OAAO,UAAU,CAAC,MAAM,CAAC;;AAE9C,QAAO;;;AAIR,eAAsB,sBACrB,IACA,cACwB;AACxB,SAAQ,MAAM,sBAAsB,GAAG,EAAE,IAAI,aAAa,IAAI,EAAE;;;;;;;;;;;;;;;AAgBjE,eAAsB,qBACrB,IACA,IACiE;AACjE,KAAI;EAEH,MAAM,WAAW,MADJ,IAAI,mBAAmB,GAAG,CACX,SAAS,GAAG;AACxC,MAAI,CAAC,SACJ,QAAO;GAAE,SAAS;GAAO,OAAO;IAAE,MAAM;IAAa,SAAS;IAAsB;GAAE;EAGvF,MAAM,QAAQ,MAAM,sBAAsB,IAAI,SAAS,KAAK;AAU5D,MAAI,CARY,MAAM,gBAAgB,IAAI,OAAO,QAAQ;GACxD,MAAM,WAAW,IAAI,eAAe,IAAI;AACxC,QAAK,MAAM,SAAS,MACnB,OAAM,SAAS,YAAY,MAAM,gBAAgB,MAAM,UAAU;AAElE,UAAO,IAAI,mBAAmB,IAAI,CAAC,OAAO,GAAG;IAC5C,CAGD,QAAO;GAAE,SAAS;GAAO,OAAO;IAAE,MAAM;IAAa,SAAS;IAAsB;GAAE;AAGvF,OAAK,MAAM,cAAc,IAAI,IAAI,MAAM,KAAK,MAAM,EAAE,eAAe,CAAC,EAAE;AACrE,6BAA0B,WAAW;AACrC,yBAAsB,WAAW;;AAGlC,SAAO;GACN,SAAS;GACT,MAAM;IACL,SAAS;IACT,eAAe,MAAM,KAAK,MAAM,GAAG,EAAE,eAAe,GAAG,EAAE,YAAY;IACrE;GACD;UACO,OAAO;AACf,UAAQ,MAAM,0BAA0B,MAAM;AAC9C,SAAO;GACN,SAAS;GACT,OAAO;IAAE,MAAM;IAAyB,SAAS;IAA6B;GAC9E;;;;;;;AA6BH,SAAS,WAAW,MAA+B,YAAoC;AACtF,KAAI,YAAY;EACf,MAAM,aAAa,KAAK;AACxB,MAAI,OAAO,eAAe,YAAY,WAAW,SAAS,EAAG,QAAO;;AAErE,KAAI,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,SAAS,EAAG,QAAO,KAAK;AACzE,KAAI,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,SAAS,EAAG,QAAO,KAAK;AACvE,QAAO;;;;;;;AAQR,eAAsB,uBACrB,IACA,YAC8B;AAC9B,QAAO,cAAc,yBAAyB,cAAc,YAAY;AAMvE,UALY,MAAM,GAChB,WAAW,sBAAsB,CACjC,OAAO,cAAc,CACrB,MAAM,QAAQ,KAAK,WAAW,CAC9B,kBAAkB,GACR,eAAe;GAC1B;;;AAIH,eAAe,gBACd,MACA,UAC2B;AAC3B,QAAQ,MAAM,KAAK,SAAS,SAAS,IAAM,MAAM,KAAK,WAAW,SAAS;;;;;;;;;AAU3E,SAAS,YAAY,OAAsB,QAAgD;AAC1F,KAAI,WAAW,KAAM,QAAO,MAAM;CAElC,MAAM,aAAa,oBAAoB,OAAO;CAC9C,IAAI;CACJ,IAAI,WAAW,WAAW;AAC1B,MAAK,MAAM,QAAQ,OAAO;AACzB,MAAI,KAAK,WAAW,KAAM;EAC1B,MAAM,OAAO,cAAc,KAAK,QAAQ,OAAO;AAC/C,MAAI,OAAO,UAAU;AACpB,UAAO;AACP,cAAW;;;AAGb,QAAO,QAAQ,MAAM;;;;;;;;;;;;;;;AAgBtB,SAAgB,eACf,SACA,YACA,OACA,MACA,QACA,eACA,YACsB;AACtB,QAAO,sBACN,SACA,YACA,MAAM,KAAK,UAAU;EAAE,OAAO,KAAK,KAAK;EAAE,WAAW,KAAK;EAAW,EAAE,EACvE,QACA,eACA,WACA;;;;;;;;AASF,SAAgB,mBACf,SACA,YACA,QACA,QACA,eACA,YACsB;AACtB,QAAO,sBACN,SACA,YACA,OAAO,KAAK,OAAO,WAAW;EAAE;EAAO,WAAW;EAAO,EAAE,EAC3D,QACA,eACA,WACA;;AAGF,eAAe,sBACd,SACA,YACA,WACA,QACA,eACA,YACsB;CACtB,MAAM,MAAM,MAAM,QAAQ,0BACzB,YACA,UAAU,KAAK,UAAU,MAAM,MAAM,EACrC,EAAE,eAAe,CAAC,eAAe,CACjC;CAID,MAAM,kCAAkB,IAAI,KAA4B;AACxD,MAAK,MAAM,QAAQ,KAAK;AACvB,MAAI,KAAK,oBAAoB,KAAM;EACnC,MAAM,OAAO,gBAAgB,IAAI,KAAK,iBAAiB;AACvD,MAAI,KAAM,MAAK,KAAK,KAAK;MACpB,iBAAgB,IAAI,KAAK,kBAAkB,CAAC,KAAK,CAAC;;CAGxD,MAAM,OAAmB,EAAE;AAC3B,MAAK,MAAM,YAAY,WAAW;EACjC,MAAM,WAAW,gBAAgB,IAAI,SAAS,MAAM;AACpD,MAAI,CAAC,SAAU;EACf,MAAM,QAAQ,YAAY,UAAU,OAAO;AAC3C,MAAI,CAAC,MAAO;AACZ,OAAK,KAAK;GACT,IAAI,MAAM;GACV,MAAM,MAAM;GACZ;GACA,OAAO,WAAW,MAAM,MAAM,WAAW;GACzC,QAAQ,MAAM;GACd,kBAAkB,MAAM;GACxB,WAAW,SAAS;GACpB,CAAC;;AAEH,QAAO;;;;;;;;;;;AAeR,eAAe,cACd,IACA,SAQoC;AACpC,KAAI,CAAC,QAAQ,iBAAiB,CAAC,QAAQ,gBAAiB,QAAO;CAE/D,MAAM,QAAQ,2BACb,MAAM,0BAA0B,IAAI,QAAQ,WAAW,EACvD,QAAQ,cACR,QAAQ,KACR;AACD,KAAI,CAAC,MAAO,QAAO;CAGnB,MAAM,SAAS,sBADE,MAAM,IAAI,mBAAmB,GAAG,CAAC,SAAS,QAAQ,gBAAgB,GACrC,KAAK,GAAG,MAAM;AAC5D,KAAI,CAAC,OAAQ,QAAO;AAEpB,QAAO,iBAAiB,QAAQ,QAAQ,KAAK;;AAG9C,eAAsB,2BACrB,IACA,YACA,SACA,UACA,OAAoB,EAAE,EACtB,gBAAgB,OACoD;AACpE,KAAI;EACH,MAAM,OAAO,IAAI,mBAAmB,GAAG;EACvC,MAAM,UAAU,IAAI,kBAAkB,GAAG;EAEzC,MAAM,MAAM,MAAM,gBAAgB,MAAM,SAAS;AACjD,MAAI,CAAC,IACJ,QAAO;GAAE,SAAS;GAAO,OAAO;IAAE,MAAM;IAAa,SAAS;IAAsB;GAAE;AACvF,MAAI,eAAe,IAAI,iBACtB,QAAO;GACN,SAAS;GACT,OAAO;IACN,MAAM;IACN,SAAS;IACT;GACD;EAGF,MAAM,QAAQ,MAAM,QAAQ,eAAe,YAAY,QAAQ;AAI/D,MAAI,CAAC,OAAO,oBAAqB,CAAC,iBAAiB,MAAM,WAAW,YACnE,QAAO;GAAE,SAAS;GAAO,OAAO;IAAE,MAAM;IAAa,SAAS;IAA2B;GAAE;EAG5F,MAAM,aAAa,MAAM,uBAAuB,IAAI,IAAI,gBAAgB;EAKxE,MAAM,SAAS,MAAM,cAAc,IAAI;GACtC;GACA,cAAc,IAAI;GAClB,MAAM;GACN,iBAAiB,MAAM;GACvB;GACA;GACA,CAAC;AACF,MAAI,OASH,QAAO;GAAE,SAAS;GAAM,MAAM;IAAE,UARf,MAAM,mBACtB,SACA,IAAI,iBACJ,OAAO,QACP,MAAM,QACN,eACA,WACA;IACyC,YAAY,OAAO;IAAY;GAAE;EAG5E,MAAM,QAAQ,MAAM,KAAK,gBAAgB,IAAI,IAAI,MAAM,kBAAkB,KAAK;AAU9E,SAAO;GAAE,SAAS;GAAM,MAAM;IAAE,UATf,MAAM,eACtB,SACA,IAAI,iBACJ,MAAM,QACL,MAAM,EAAE,YACT,MAAM,QACN,eACA,WACA;IACyC,YAAY,MAAM;IAAY;GAAE;UAClE,OAAO;AACf,SAAO,mBAAmB,MAAM;;;;;;;;;;;;;;AAuClC,eAAe,wBACd,IACA,YACA,aACA,aACA,YAC+C;CAC/C,MAAM,OAAO,IAAI,mBAAmB,GAAG;CACvC,MAAM,UAAU,IAAI,kBAAkB,GAAG;CACzC,MAAM,OAAO,YAAY;CAEzB,MAAM,MAAM,MAAM,gBAAgB,MAAM,YAAY,SAAS;AAC7D,KAAI,CAAC,IAAK,QAAO;EAAE,SAAS;EAAO,OAAO;GAAE,MAAM;GAAa,SAAS;GAAsB;EAAE;CAEhG,MAAM,gBAAgB,SAAS,WAAW,IAAI,mBAAmB,IAAI;CACrE,MAAM,kBAAkB,SAAS,WAAW,IAAI,kBAAkB,IAAI;AACtE,KAAI,eAAe,cAClB,QAAO;EACN,SAAS;EACT,OAAO;GACN,MAAM;GACN,SAAS,oBAAoB,KAAK;GAClC;EACD;CAGF,MAAM,YAAY,2BAA2B,aAAa,YAAY;AACtE,KAAI,CAAC,UAAU,QAAS,QAAO;CAM/B,MAAM,WAAW,MAAM,QAAQ,mBAAmB,iBAAiB,YAAY;CAC/E,MAAM,SAAmB,EAAE;AAC3B,MAAK,MAAM,cAAc,aAAa;EACrC,MAAM,QAAQ,SAAS,IAAI,WAAW;AACtC,MAAI,CAAC,OAAO,iBACX,QAAO;GACN,SAAS;GACT,OAAO;IACN,MAAM;IACN,SAAS,GAAG,SAAS,WAAW,UAAU,SAAS,UAAU,WAAW,iBAAiB;IACzF;GACD;AAEF,SAAO,KAAK,MAAM,iBAAiB;;CAGpC,MAAM,MAAM,MAAM,0BAA0B,IAAI;EAC/C,YAAY,IAAI;EAChB,UAAU,SAAS,WAAW,IAAI,qBAAqB,IAAI;EAC3D;EACA;EACA;EACA,QAAQ;EACR,CAAC;AACF,KAAI,CAAC,IAAI,QAAS,QAAO;AAEzB,QAAO;EAAE,SAAS;EAAM,MAAM;GAAE,UAAU,IAAI;GAAI;GAAM;GAAQ;EAAE;;;;;;;;;;;;;;AAenE,eAAsB,0BACrB,IACA,SAU2B;CAC3B,MAAM,EAAE,UAAU,MAAM,WAAW;AACnC,KAAI,aAAa,QAAQ,OAAO,WAAW,EAAG,QAAO;EAAE,SAAS;EAAM,MAAM;EAAM;CAElF,MAAM,SAAS,MAAM,IAAI,mBAAmB,GAAG,CAAC,kBAC/C,QAAQ,YACR,SAAS,WAAW,UAAU,UAC9B,QACA,QAAQ,WACR;AACD,MAAK,MAAM,CAAC,OAAO,UAAU,OAAO,SAAS,EAAE;AAC9C,OAAK,OAAO,IAAI,MAAM,IAAI,KAAK,KAAK,SAAU;EAC9C,MAAM,UAAU,SAAS,WAAW,WAAW;EAC/C,MAAM,QAAQ,QAAQ,SAAS,UAAU;AACzC,SAAO;GACN,SAAS;GACT,OAAO;IACN,MAAM;IACN,SACC,aAAa,IACV,UAAU,MAAM,kBAAkB,QAAQ,wCAC1C,UAAU,MAAM,+BAA+B,SAAS,GAAG,QAAQ;IACvE;GACD;;AAEF,QAAO;EAAE,SAAS;EAAM,MAAM;EAAM;;;;;;AAOrC,eAAe,qBACd,IACA,YACA,SACA,aACA,aAC8C;CAC9C,MAAM,QAAQ,MAAM,IAAI,kBAAkB,GAAG,CAAC,eAAe,YAAY,QAAQ;AACjF,KAAI,CAAC,OAAO,iBACX,QAAO;EAAE,SAAS;EAAO,OAAO;GAAE,MAAM;GAAa,SAAS;GAA2B;EAAE;CAG5F,MAAM,WAAW,MAAM,wBACtB,IACA,YACA,aACA,aACA,MAAM,iBACN;AACD,KAAI,CAAC,SAAS,QAAS,QAAO;AAC9B,QAAO;EAAE,SAAS;EAAM,MAAM;GAAE,GAAG,SAAS;GAAM,YAAY,MAAM;GAAkB;EAAE;;;;;;;;;;;;AAazF,eAAsB,wBACrB,IACA,WACgB;CAChB,MAAM,OAAO,IAAI,mBAAmB,GAAG;CACvC,MAAM,MAAM,MAAM,gBAAgB,MAAM,UAAU,SAAS;AAC3D,KAAI,CAAC,IAAK;CAEV,MAAM,WACL,UAAU,SAAS,WAChB,MAAM,KAAK,YAAY,IAAI,IAAI,UAAU,YAAY,UAAU,OAAO,GACtE,MAAM,KAAK,WAAW,IAAI,IAAI,UAAU,YAAY,UAAU,OAAO;AACzE,KAAI,SAAS,SAAS,GAAG;EACxB,MAAM,UAAU,UAAU,SAAS,WAAW,WAAW;AACzD,QAAM,OAAO,uBACZ,IAAI,MACH,UAAU,SAAS,GAAG,sCAAsC,QAAQ,4BACpE,EACD,EAAE,UAAU,EAAE,MAAM,oBAAoB,EAAE,CAC1C;;AAMF,2BAA0B,IAAI,iBAAiB;AAC/C,KAAI,IAAI,oBAAoB,IAAI,iBAC/B,2BAA0B,IAAI,gBAAgB;;;;;;;;;;AAYhD,eAAsB,sBACrB,IACA,YACA,SACA,WACA,aACiE;CACjE,MAAM,WAAW,MAAM,0BAA0B,IAAI,YAAY,SAAS,WAAW,YAAY;AACjG,KAAI,CAAC,SAAS,QAAS,QAAO;AAC9B,OAAM,wBAAwB,IAAI,SAAS,KAAK;AAChD,QAAO;EACN,SAAS;EACT,MAAM;GAAE,YAAY,SAAS,KAAK;GAAU,YAAY,SAAS,KAAK;GAAY;EAClF;;;;;;;;;AAUF,eAAsB,0BACrB,IACA,YACA,SACA,WACA,aAC8C;CAC9C,MAAM,eAAe,MAAM,0BAA0B,IAAI,WAAW,EAAE,IAAI,UAAU;AACpF,KAAI,CAAC,YAAa,QAAO,mBAAmB,WAAW,WAAW;AAClE,QAAO,qBAAqB,IAAI,YAAY,SAAS,aAAa,YAAY;;;;;;;;;;;;;AAc/E,eAAsB,iCACrB,IACA,YACA,WACA,aACA,YAC+C;CAC/C,MAAM,eAAe,MAAM,0BAA0B,IAAI,WAAW,EAAE,IAAI,UAAU;AACpF,KAAI,CAAC,YAAa,QAAO,mBAAmB,WAAW,WAAW;AAClE,QAAO,wBAAwB,IAAI,YAAY,aAAa,aAAa,WAAW;;AAGrF,SAAS,mBAAmB,WAAmB,YAAsC;AACpF,QAAO;EACN,SAAS;EACT,OAAO;GACN,MAAM;GACN,SAAS,UAAU,UAAU,gCAAgC;GAC7D;EACD;;AAGF,eAAsB,0BACrB,IACA,YACA,SACA,UACA,OAAoB,EAAE,EACtB,gBAAgB,OACmD;AACnE,KAAI;EACH,MAAM,OAAO,IAAI,mBAAmB,GAAG;EACvC,MAAM,UAAU,IAAI,kBAAkB,GAAG;EAEzC,MAAM,MAAM,MAAM,gBAAgB,MAAM,SAAS;AACjD,MAAI,CAAC,IACJ,QAAO;GAAE,SAAS;GAAO,OAAO;IAAE,MAAM;IAAa,SAAS;IAAsB;GAAE;AACvF,MAAI,eAAe,IAAI,gBACtB,QAAO;GACN,SAAS;GACT,OAAO;IACN,MAAM;IACN,SAAS;IACT;GACD;EAGF,MAAM,QAAQ,MAAM,QAAQ,eAAe,YAAY,QAAQ;AAG/D,MAAI,CAAC,OAAO,oBAAqB,CAAC,iBAAiB,MAAM,WAAW,YACnE,QAAO;GAAE,SAAS;GAAO,OAAO;IAAE,MAAM;IAAa,SAAS;IAA2B;GAAE;EAG5F,MAAM,aAAa,MAAM,uBAAuB,IAAI,IAAI,iBAAiB;EAKzE,MAAM,SAAS,MAAM,cAAc,IAAI;GACtC;GACA,cAAc,IAAI;GAClB,MAAM;GACN,iBAAiB,MAAM;GACvB;GACA;GACA,CAAC;AACF,MAAI,OASH,QAAO;GAAE,SAAS;GAAM,MAAM;IAAE,SARhB,MAAM,mBACrB,SACA,IAAI,kBACJ,OAAO,QACP,MAAM,QACN,eACA,WACA;IACwC,YAAY,OAAO;IAAY;GAAE;EAG3E,MAAM,QAAQ,MAAM,KAAK,eAAe,IAAI,IAAI,MAAM,kBAAkB,KAAK;AAU7E,SAAO;GAAE,SAAS;GAAM,MAAM;IAAE,SAThB,MAAM,eACrB,SACA,IAAI,kBACJ,MAAM,QACL,MAAM,EAAE,aACT,MAAM,QACN,eACA,WACA;IACwC,YAAY,MAAM;IAAY;GAAE;UACjE,OAAO;AACf,SAAO,mBAAmB,MAAM"}
|
|
@@ -101,4 +101,4 @@ function clearRequestCacheEntry(key) {
|
|
|
101
101
|
|
|
102
102
|
//#endregion
|
|
103
103
|
export { setRequestCacheEntry as i, peekRequestCache as n, requestCached as r, clearRequestCacheEntry as t };
|
|
104
|
-
//# sourceMappingURL=request-cache-
|
|
104
|
+
//# sourceMappingURL=request-cache-5z2WzWmh.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-cache-
|
|
1
|
+
{"version":3,"file":"request-cache-5z2WzWmh.mjs","names":[],"sources":["../src/request-cache.ts"],"sourcesContent":["/**\n * Per-request query cache\n *\n * Deduplicates identical database queries within a single page render.\n * Uses the ALS request context as a WeakMap key so the cache is\n * automatically GC'd when the request completes.\n *\n * When no request context is available (e.g. local dev without D1\n * replicas), queries bypass the cache — local SQLite is fast enough\n * that deduplication doesn't matter.\n *\n * The WeakMap is stored on globalThis with a Symbol key to guarantee\n * a singleton even when bundlers duplicate this module across chunks\n * (same pattern as request-context.ts).\n */\n\nimport type { EmDashRequestContext } from \"./request-context.js\";\nimport { getRequestContext } from \"./request-context.js\";\n\ntype CacheStore = WeakMap<EmDashRequestContext, Map<string, Promise<unknown>>>;\n\nconst STORE_KEY = Symbol.for(\"emdash:request-cache\");\nconst g = globalThis as Record<symbol, unknown>;\nconst store: CacheStore =\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- globalThis singleton pattern (see request-context.ts)\n\t(g[STORE_KEY] as CacheStore | undefined) ??\n\t(() => {\n\t\tconst wm: CacheStore = new WeakMap();\n\t\tg[STORE_KEY] = wm;\n\t\treturn wm;\n\t})();\n\n/**\n * Return a cached result for `key` if one exists in the current\n * request scope, otherwise call `fn`, cache its promise, and return it.\n *\n * Caches the *promise*, not the resolved value, so concurrent calls\n * with the same key share a single in-flight query.\n */\nexport function requestCached<T>(key: string, fn: () => Promise<T>): Promise<T> {\n\tconst ctx = getRequestContext();\n\tif (!ctx) return fn();\n\n\tlet cache = store.get(ctx);\n\tif (!cache) {\n\t\tcache = new Map();\n\t\tstore.set(ctx, cache);\n\t}\n\n\tconst existing = cache.get(key);\n\tif (existing) {\n\t\tif (ctx.metrics) ctx.metrics.cacheHits += 1;\n\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- heterogeneous cache; key namespacing guarantees the stored promise resolves to T\n\t\treturn existing as Promise<T>;\n\t}\n\tif (ctx.metrics) ctx.metrics.cacheMisses += 1;\n\n\tconst promise = Promise.resolve()\n\t\t.then(fn)\n\t\t.catch((error) => {\n\t\t\tcache.delete(key);\n\t\t\tthrow error;\n\t\t});\n\tcache.set(key, promise);\n\treturn promise;\n}\n\n/**\n * Look up an entry in the request-scoped cache without inserting one.\n *\n * Returns the in-flight or resolved promise if the key exists in the\n * current request, otherwise `undefined`. Callers can use this to\n * opportunistically satisfy a narrower query (e.g. `getSiteSetting(\"seo\")`)\n * from a broader one (`getSiteSettings()`) that's already been loaded\n * by a parent template — avoiding a redundant round-trip.\n *\n * No-ops outside a request context.\n */\nexport function peekRequestCache<T>(key: string): Promise<T> | undefined {\n\tconst ctx = getRequestContext();\n\tif (!ctx) return undefined;\n\tconst cache = store.get(ctx);\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- heterogeneous cache; caller is responsible for using a T-compatible key\n\treturn cache?.get(key) as Promise<T> | undefined;\n}\n\n/**\n * Pre-populate the request-scoped cache with a resolved value.\n *\n * Internal helper shared between hydration paths (taxonomy terms,\n * bylines, etc.) that already have the data in hand and want downstream\n * callers using `requestCached(key, ...)` to skip the database entirely.\n * Not exported from the package entrypoint — keep it internal until we\n * have a documented plugin/extension surface for hydration.\n *\n * No-ops outside a request context (local dev without ALS).\n *\n * Does not overwrite an existing entry — if a query for this key is already\n * in flight, its promise wins.\n */\nexport function setRequestCacheEntry<T>(key: string, value: T): void {\n\tconst ctx = getRequestContext();\n\tif (!ctx) return;\n\n\tlet cache = store.get(ctx);\n\tif (!cache) {\n\t\tcache = new Map();\n\t\tstore.set(ctx, cache);\n\t}\n\n\tif (cache.has(key)) return;\n\tcache.set(key, Promise.resolve(value));\n}\n\n/**\n * Remove a key from the request-scoped cache.\n *\n * Used by write paths that need to invalidate a downstream read cache —\n * `setRequestCacheEntry` deliberately doesn't overwrite, and `requestCached`\n * returns the cached promise even after the underlying data has changed.\n * Without an explicit clear, a `read → write → read` sequence in a single\n * request can return stale data on the second read.\n *\n * Concrete case: `BylineRepository.update` invalidates\n * `byline-field-group-values:${translation_group}` after writing a\n * non-translatable custom-field value, so the post-update `findById`\n * (and any later reads in the same request) see the fresh value.\n *\n * No-ops outside a request context.\n */\nexport function clearRequestCacheEntry(key: string): void {\n\tconst ctx = getRequestContext();\n\tif (!ctx) return;\n\tconst cache = store.get(ctx);\n\tcache?.delete(key);\n}\n"],"mappings":";;;AAqBA,MAAM,YAAY,OAAO,IAAI,uBAAuB;AACpD,MAAM,IAAI;AACV,MAAM,QAEJ,EAAE,qBACI;CACN,MAAM,qBAAiB,IAAI,SAAS;AACpC,GAAE,aAAa;AACf,QAAO;IACJ;;;;;;;;AASL,SAAgB,cAAiB,KAAa,IAAkC;CAC/E,MAAM,MAAM,mBAAmB;AAC/B,KAAI,CAAC,IAAK,QAAO,IAAI;CAErB,IAAI,QAAQ,MAAM,IAAI,IAAI;AAC1B,KAAI,CAAC,OAAO;AACX,0BAAQ,IAAI,KAAK;AACjB,QAAM,IAAI,KAAK,MAAM;;CAGtB,MAAM,WAAW,MAAM,IAAI,IAAI;AAC/B,KAAI,UAAU;AACb,MAAI,IAAI,QAAS,KAAI,QAAQ,aAAa;AAE1C,SAAO;;AAER,KAAI,IAAI,QAAS,KAAI,QAAQ,eAAe;CAE5C,MAAM,UAAU,QAAQ,SAAS,CAC/B,KAAK,GAAG,CACR,OAAO,UAAU;AACjB,QAAM,OAAO,IAAI;AACjB,QAAM;GACL;AACH,OAAM,IAAI,KAAK,QAAQ;AACvB,QAAO;;;;;;;;;;;;;AAcR,SAAgB,iBAAoB,KAAqC;CACxE,MAAM,MAAM,mBAAmB;AAC/B,KAAI,CAAC,IAAK,QAAO;AAGjB,QAFc,MAAM,IAAI,IAAI,EAEd,IAAI,IAAI;;;;;;;;;;;;;;;;AAiBvB,SAAgB,qBAAwB,KAAa,OAAgB;CACpE,MAAM,MAAM,mBAAmB;AAC/B,KAAI,CAAC,IAAK;CAEV,IAAI,QAAQ,MAAM,IAAI,IAAI;AAC1B,KAAI,CAAC,OAAO;AACX,0BAAQ,IAAI,KAAK;AACjB,QAAM,IAAI,KAAK,MAAM;;AAGtB,KAAI,MAAM,IAAI,IAAI,CAAE;AACpB,OAAM,IAAI,KAAK,QAAQ,QAAQ,MAAM,CAAC;;;;;;;;;;;;;;;;;;AAmBvC,SAAgB,uBAAuB,KAAmB;CACzD,MAAM,MAAM,mBAAmB;AAC/B,KAAI,CAAC,IAAK;AAEV,CADc,MAAM,IAAI,IAAI,EACrB,OAAO,IAAI"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { a as SiteSettings } from "./types-BAsCk5KU.mjs";
|
|
1
2
|
import { QueryRecorder } from "./database/instrumentation.mjs";
|
|
2
|
-
import { t as DeferredTaskTracker } from "./deferred-tasks-
|
|
3
|
+
import { t as DeferredTaskTracker } from "./deferred-tasks-wlMFJL95.mjs";
|
|
3
4
|
|
|
4
5
|
//#region src/request-context.d.ts
|
|
5
6
|
/**
|
|
@@ -40,6 +41,16 @@ interface EmDashRequestContext {
|
|
|
40
41
|
* eventually-consistent object-cache snapshot.
|
|
41
42
|
*/
|
|
42
43
|
routeCacheFill?: boolean;
|
|
44
|
+
/** Shares verified settings with components that render after cache headers are sent. @internal */
|
|
45
|
+
siteSettings?: {
|
|
46
|
+
snapshot?: {
|
|
47
|
+
data: Partial<SiteSettings>;
|
|
48
|
+
version: string;
|
|
49
|
+
};
|
|
50
|
+
version?: string;
|
|
51
|
+
live?: boolean;
|
|
52
|
+
onRead: (version: string) => void;
|
|
53
|
+
};
|
|
43
54
|
/** Preview token info, if this is a preview request */
|
|
44
55
|
preview?: {
|
|
45
56
|
collection: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-context.d.mts","names":[],"sources":["../src/request-context.ts"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"request-context.d.mts","names":[],"sources":["../src/request-context.ts"],"mappings":";;;;;;;;AAiEA;;;;;;;UA9BiB,cAAA;EAChB,KAAA;EACA,OAAA;EACA,SAAA;EACA,aAAA;EACA,YAAA;EACA,SAAA;EACA,WAAA;EAoCoB;;;;;;EA7BpB,QAAA;AAAA;AAAA,iBAGe,oBAAA,CAAqB,KAAA,WAAgB,cAAA;AAAA,UAapC,oBAAA;EAwBhB;EAtBA,QAAA;EAyCA;;;;;;;EAjCA,cAAA;EA+CmC;EA7CnC,YAAA;IACC,QAAA;MAAa,IAAA,EAAM,OAAA,CAAQ,YAAA;MAAe,OAAA;IAAA;IAC1C,OAAA;IACA,IAAA;IACA,MAAA,GAAS,OAAA;EAAA;EA6D4B;EA1DtC,OAAA;IACC,UAAA;IACA,EAAA;EAAA;EAwD0E;EArD3E,MAAA;EA6De;;;;;;;EArDf,EAAA;;;;;;;;;;;EAWA,YAAA;;;;;;EAMA,aAAA,GAAgB,aAAA;;;;;;EAMhB,OAAA,GAAU,cAAA;;EAEV,aAAA,GAAgB,mBAAA;AAAA;;;;;iBAoBD,cAAA,GAAA,CAAkB,GAAA,EAAK,oBAAA,EAAsB,EAAA,QAAU,CAAA,GAAI,CAAA;;;;;iBAQ3D,iBAAA,CAAA,GAAqB,oBAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-context.mjs","names":[],"sources":["../src/request-context.ts"],"sourcesContent":["/**\n * EmDash Request Context\n *\n * Uses AsyncLocalStorage to provide request-scoped state to query functions\n * without requiring explicit parameter passing. The middleware wraps next()\n * in als.run(), making the context available to all code during rendering.\n *\n * Middleware always wraps each request in a context so per-request\n * metrics (db.*, cache.*) can be surfaced via Server-Timing. The cost is\n * one ALS frame per request — sub-microsecond, negligible compared to\n * any real work.\n *\n * The AsyncLocalStorage instance is stored on globalThis with a Symbol key\n * to guarantee a singleton even when bundlers duplicate this module across\n * code-split chunks. Without this, Rollup/Vite may inline the module into\n * multiple chunks (e.g. middleware and page components), each with its own\n * ALS instance — breaking request-scoped state propagation.\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\n\nimport type { QueryRecorder } from \"./database/instrumentation.js\";\nimport type { DeferredTaskTracker } from \"./deferred-tasks.js\";\n\n/**\n * Lightweight always-on counters surfaced in Server-Timing.\n *\n * Bumped by the Kysely log hook (db queries) and by `requestCached`\n * (cache hits/misses). Read by middleware after the response is\n * generated to emit `db.*` and `cache.*` Server-Timing fields.\n *\n * Offsets are milliseconds from `start` (the request's entry into\n * middleware), captured via `performance.now()`.\n */\nexport interface RequestMetrics {\n\tstart: number;\n\tdbCount: number;\n\tdbTotalMs: number;\n\tdbFirstOffset: number | null;\n\tdbLastOffset: number | null;\n\tcacheHits: number;\n\tcacheMisses: number;\n\t/**\n\t * Physical database round trips. Differs from `dbCount` (logical queries)\n\t * when a backend batches: the DO SQL driver coalesces same-turn SELECTs into\n\t * one RPC, so `rpcCount` can be far lower than `dbCount`. Bumped by the\n\t * adapter, not the Kysely log hook.\n\t */\n\trpcCount: number;\n}\n\nexport function createRequestMetrics(start: number): RequestMetrics {\n\treturn {\n\t\tstart,\n\t\tdbCount: 0,\n\t\tdbTotalMs: 0,\n\t\tdbFirstOffset: null,\n\t\tdbLastOffset: null,\n\t\tcacheHits: 0,\n\t\tcacheMisses: 0,\n\t\trpcCount: 0,\n\t};\n}\n\nexport interface EmDashRequestContext {\n\t/** Whether the current request is in visual editing mode */\n\teditMode: boolean;\n\t/**\n\t * The response may be stored by Astro's route cache.\n\t *\n\t * Cache hits never execute the Worker. A request that reaches rendering is\n\t * therefore a fill candidate and must not rebuild a purged response from an\n\t * eventually-consistent object-cache snapshot.\n\t */\n\trouteCacheFill?: boolean;\n\t/** Preview token info, if this is a preview request */\n\tpreview?: {\n\t\tcollection: string;\n\t\tid: string;\n\t};\n\t/** Current locale from Astro's i18n routing (when configured) */\n\tlocale?: string;\n\t/**\n\t * Per-request database override.\n\t *\n\t * Set by middleware when D1 read replica sessions are enabled.\n\t * The runtime's `db` getter checks this first, falling back to\n\t * the singleton instance. Also used by the DO preview pattern.\n\t */\n\tdb?: unknown;\n\t/**\n\t * Indicates the per-request `db` points at an isolated database\n\t * instance whose schema may diverge from the configured one\n\t * (playground, DO preview sessions). When true, schema-derived caches\n\t * (manifest, taxonomy defs, etc.) must not be reused across requests.\n\t *\n\t * Plain D1 Sessions API routing does NOT set this — sessions are just\n\t * a routing hint over the same schema, so the module-scoped manifest\n\t * cache remains valid.\n\t */\n\tdbIsIsolated?: boolean;\n\t/**\n\t * Query recorder attached by middleware when EMDASH_QUERY_LOG=1 is set.\n\t * The Kysely `log` hook appends an event per query; middleware flushes\n\t * to NDJSON after the response.\n\t */\n\tqueryRecorder?: QueryRecorder;\n\t/**\n\t * Per-request metrics for Server-Timing. Always attached by middleware\n\t * for requests that emit timing headers; bumped by the Kysely log hook\n\t * and `requestCached`.\n\t */\n\tmetrics?: RequestMetrics;\n\t/** Deferred work that owns resources scoped to this request. */\n\tdeferredTasks?: DeferredTaskTracker;\n}\n\nconst ALS_KEY = Symbol.for(\"emdash:request-context\");\n\nconst storage: AsyncLocalStorage<EmDashRequestContext> =\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- globalThis singleton pattern\n\t((globalThis as Record<symbol, unknown>)[ALS_KEY] as\n\t\t| AsyncLocalStorage<EmDashRequestContext>\n\t\t| undefined) ??\n\t(() => {\n\t\tconst als = new AsyncLocalStorage<EmDashRequestContext>();\n\t\t(globalThis as Record<symbol, unknown>)[ALS_KEY] = als;\n\t\treturn als;\n\t})();\n\n/**\n * Run a function within an EmDash request context.\n * Called by middleware to wrap next().\n */\nexport function runWithContext<T>(ctx: EmDashRequestContext, fn: () => T): T {\n\treturn storage.run(ctx, fn);\n}\n\n/**\n * Get the current request context.\n * Returns undefined if no context is set (logged-out fast path).\n */\nexport function getRequestContext(): EmDashRequestContext | undefined {\n\treturn storage.getStore();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"request-context.mjs","names":[],"sources":["../src/request-context.ts"],"sourcesContent":["/**\n * EmDash Request Context\n *\n * Uses AsyncLocalStorage to provide request-scoped state to query functions\n * without requiring explicit parameter passing. The middleware wraps next()\n * in als.run(), making the context available to all code during rendering.\n *\n * Middleware always wraps each request in a context so per-request\n * metrics (db.*, cache.*) can be surfaced via Server-Timing. The cost is\n * one ALS frame per request — sub-microsecond, negligible compared to\n * any real work.\n *\n * The AsyncLocalStorage instance is stored on globalThis with a Symbol key\n * to guarantee a singleton even when bundlers duplicate this module across\n * code-split chunks. Without this, Rollup/Vite may inline the module into\n * multiple chunks (e.g. middleware and page components), each with its own\n * ALS instance — breaking request-scoped state propagation.\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\n\nimport type { QueryRecorder } from \"./database/instrumentation.js\";\nimport type { DeferredTaskTracker } from \"./deferred-tasks.js\";\nimport type { SiteSettings } from \"./settings/types.js\";\n\n/**\n * Lightweight always-on counters surfaced in Server-Timing.\n *\n * Bumped by the Kysely log hook (db queries) and by `requestCached`\n * (cache hits/misses). Read by middleware after the response is\n * generated to emit `db.*` and `cache.*` Server-Timing fields.\n *\n * Offsets are milliseconds from `start` (the request's entry into\n * middleware), captured via `performance.now()`.\n */\nexport interface RequestMetrics {\n\tstart: number;\n\tdbCount: number;\n\tdbTotalMs: number;\n\tdbFirstOffset: number | null;\n\tdbLastOffset: number | null;\n\tcacheHits: number;\n\tcacheMisses: number;\n\t/**\n\t * Physical database round trips. Differs from `dbCount` (logical queries)\n\t * when a backend batches: the DO SQL driver coalesces same-turn SELECTs into\n\t * one RPC, so `rpcCount` can be far lower than `dbCount`. Bumped by the\n\t * adapter, not the Kysely log hook.\n\t */\n\trpcCount: number;\n}\n\nexport function createRequestMetrics(start: number): RequestMetrics {\n\treturn {\n\t\tstart,\n\t\tdbCount: 0,\n\t\tdbTotalMs: 0,\n\t\tdbFirstOffset: null,\n\t\tdbLastOffset: null,\n\t\tcacheHits: 0,\n\t\tcacheMisses: 0,\n\t\trpcCount: 0,\n\t};\n}\n\nexport interface EmDashRequestContext {\n\t/** Whether the current request is in visual editing mode */\n\teditMode: boolean;\n\t/**\n\t * The response may be stored by Astro's route cache.\n\t *\n\t * Cache hits never execute the Worker. A request that reaches rendering is\n\t * therefore a fill candidate and must not rebuild a purged response from an\n\t * eventually-consistent object-cache snapshot.\n\t */\n\trouteCacheFill?: boolean;\n\t/** Shares verified settings with components that render after cache headers are sent. @internal */\n\tsiteSettings?: {\n\t\tsnapshot?: { data: Partial<SiteSettings>; version: string };\n\t\tversion?: string;\n\t\tlive?: boolean;\n\t\tonRead: (version: string) => void;\n\t};\n\t/** Preview token info, if this is a preview request */\n\tpreview?: {\n\t\tcollection: string;\n\t\tid: string;\n\t};\n\t/** Current locale from Astro's i18n routing (when configured) */\n\tlocale?: string;\n\t/**\n\t * Per-request database override.\n\t *\n\t * Set by middleware when D1 read replica sessions are enabled.\n\t * The runtime's `db` getter checks this first, falling back to\n\t * the singleton instance. Also used by the DO preview pattern.\n\t */\n\tdb?: unknown;\n\t/**\n\t * Indicates the per-request `db` points at an isolated database\n\t * instance whose schema may diverge from the configured one\n\t * (playground, DO preview sessions). When true, schema-derived caches\n\t * (manifest, taxonomy defs, etc.) must not be reused across requests.\n\t *\n\t * Plain D1 Sessions API routing does NOT set this — sessions are just\n\t * a routing hint over the same schema, so the module-scoped manifest\n\t * cache remains valid.\n\t */\n\tdbIsIsolated?: boolean;\n\t/**\n\t * Query recorder attached by middleware when EMDASH_QUERY_LOG=1 is set.\n\t * The Kysely `log` hook appends an event per query; middleware flushes\n\t * to NDJSON after the response.\n\t */\n\tqueryRecorder?: QueryRecorder;\n\t/**\n\t * Per-request metrics for Server-Timing. Always attached by middleware\n\t * for requests that emit timing headers; bumped by the Kysely log hook\n\t * and `requestCached`.\n\t */\n\tmetrics?: RequestMetrics;\n\t/** Deferred work that owns resources scoped to this request. */\n\tdeferredTasks?: DeferredTaskTracker;\n}\n\nconst ALS_KEY = Symbol.for(\"emdash:request-context\");\n\nconst storage: AsyncLocalStorage<EmDashRequestContext> =\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- globalThis singleton pattern\n\t((globalThis as Record<symbol, unknown>)[ALS_KEY] as\n\t\t| AsyncLocalStorage<EmDashRequestContext>\n\t\t| undefined) ??\n\t(() => {\n\t\tconst als = new AsyncLocalStorage<EmDashRequestContext>();\n\t\t(globalThis as Record<symbol, unknown>)[ALS_KEY] = als;\n\t\treturn als;\n\t})();\n\n/**\n * Run a function within an EmDash request context.\n * Called by middleware to wrap next().\n */\nexport function runWithContext<T>(ctx: EmDashRequestContext, fn: () => T): T {\n\treturn storage.run(ctx, fn);\n}\n\n/**\n * Get the current request context.\n * Returns undefined if no context is set (logged-out fast path).\n */\nexport function getRequestContext(): EmDashRequestContext | undefined {\n\treturn storage.getStore();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAoDA,SAAgB,qBAAqB,OAA+B;AACnE,QAAO;EACN;EACA,SAAS;EACT,WAAW;EACX,eAAe;EACf,cAAc;EACd,WAAW;EACX,aAAa;EACb,UAAU;EACV;;AA+DF,MAAM,UAAU,OAAO,IAAI,yBAAyB;AAEpD,MAAM,UAEH,WAAuC,mBAGlC;CACN,MAAM,MAAM,IAAI,mBAAyC;AACzD,CAAC,WAAuC,WAAW;AACnD,QAAO;IACJ;;;;;AAML,SAAgB,eAAkB,KAA2B,IAAgB;AAC5E,QAAO,QAAQ,IAAI,KAAK,GAAG;;;;;;AAO5B,SAAgB,oBAAsD;AACrE,QAAO,QAAQ,UAAU"}
|
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
import "./dialect-helpers-
|
|
2
|
-
import {
|
|
1
|
+
import "./dialect-helpers-B1XN2HGB.mjs";
|
|
2
|
+
import { n as getFallbackChain, s as isI18nEnabled } from "./config-Cs_AwWXI.mjs";
|
|
3
3
|
import "./datetime-normalization-PeiEdcRY.mjs";
|
|
4
|
-
import "./after-
|
|
4
|
+
import "./after-32yNRvd2.mjs";
|
|
5
5
|
import "./base64-BQBZwXCx.mjs";
|
|
6
|
-
import "./
|
|
7
|
-
import "./
|
|
8
|
-
import "./
|
|
9
|
-
import "./
|
|
10
|
-
import
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import "./
|
|
14
|
-
import
|
|
6
|
+
import "./query-BFHjCzSh.mjs";
|
|
7
|
+
import "./object-cache-DmKr09La.mjs";
|
|
8
|
+
import "./request-cache-5z2WzWmh.mjs";
|
|
9
|
+
import "./url-DTfGDJhI.mjs";
|
|
10
|
+
import "./types-DwhEvIVb.mjs";
|
|
11
|
+
import { t as RevisionRepository } from "./revision-Dx7Uth1X.mjs";
|
|
12
|
+
import { d as RelationRepository, l as readStagedReferences, n as REFERENCE_PAGE_MAX_LIMIT, s as pageStagedGroups, t as REFERENCE_PAGE_LIMIT } from "./staged-ByBmPFtX.mjs";
|
|
13
|
+
import { d as loadEntriesByGroups, u as getDb } from "./loader-DhnedqY4.mjs";
|
|
14
|
+
import "./json-recordset-D0WhN2UA.mjs";
|
|
15
|
+
import { n as getReferenceFieldMap } from "./field-map-BSXdNGt5.mjs";
|
|
15
16
|
|
|
16
17
|
//#region src/references/resolve.ts
|
|
17
18
|
/**
|
|
@@ -98,4 +99,4 @@ async function resolveReferencePages(options) {
|
|
|
98
99
|
|
|
99
100
|
//#endregion
|
|
100
101
|
export { resolveReferencePages };
|
|
101
|
-
//# sourceMappingURL=resolve-
|
|
102
|
+
//# sourceMappingURL=resolve-BNnm8EkB.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-
|
|
1
|
+
{"version":3,"file":"resolve-BNnm8EkB.mjs","names":[],"sources":["../src/references/resolve.ts"],"sourcesContent":["/**\n * Resolve an entry's reference selections to loadable entries, for the public\n * query path.\n *\n * The cost is bounded and predictable: one link read per selected field, then\n * one entry read per *distinct* target collection — never one per link. A\n * caller that selects no fields issues nothing at all, which is what keeps\n * references off the logged-out hot path of every render that does not ask for\n * them.\n */\n\nimport { RelationRepository } from \"../database/repositories/relation.js\";\nimport { RevisionRepository } from \"../database/repositories/revision.js\";\nimport { getFallbackChain, isI18nEnabled } from \"../i18n/config.js\";\nimport { getDb, loadEntriesByGroups, type LoadedEntry } from \"../loader.js\";\nimport { getReferenceFieldMap } from \"./field-map.js\";\nimport {\n\tpageStagedGroups,\n\treadStagedReferences,\n\tREFERENCE_PAGE_LIMIT,\n\tREFERENCE_PAGE_MAX_LIMIT,\n\ttype PageOfGroups,\n} from \"./staged.js\";\nimport type { ReferenceQuery, ReferenceSelection } from \"./types.js\";\n\n/** One reference field's resolved page, before the query layer wraps the entries. */\nexport interface ResolvedReferencePage {\n\t/** The collection the entries belong to — what the `edit` proxy is scoped to. */\n\tcollection: string;\n\tentries: LoadedEntry[];\n\tnextCursor?: string;\n}\n\nexport interface ResolveReferencesOptions {\n\t/** The collection the selecting entry belongs to. */\n\tcollection: string;\n\t/** The selecting entry's own translation group. */\n\tentryGroup: string;\n\t/** The locale the parent resolved to, used to pick each target's variant. */\n\tlocale: string | null;\n\t/** The selecting entry's draft revision, when it has one. */\n\tdraftRevisionId?: string;\n\t/**\n\t * Whether this render may see unpublished content. It decides both halves of\n\t * draft visibility: whether a pending selection staged in the draft revision\n\t * replaces the published one, and whether an unpublished target resolves at\n\t * all.\n\t */\n\tserveDrafts: boolean;\n\t/** The fields to resolve, by field slug. */\n\tselection: ReferenceSelection;\n}\n\nfunction pageOptions(query: ReferenceQuery): { limit: number; cursor?: string } {\n\tif (query === true) return { limit: REFERENCE_PAGE_LIMIT };\n\tconst requested = query.limit ?? REFERENCE_PAGE_LIMIT;\n\treturn {\n\t\tlimit: Math.min(Math.max(requested, 1), REFERENCE_PAGE_MAX_LIMIT),\n\t\tcursor: query.cursor,\n\t};\n}\n\nfunction localeChainFor(locale: string | null): string[] {\n\tif (locale === null) return [];\n\treturn isI18nEnabled() ? getFallbackChain(locale) : [locale];\n}\n\nexport async function resolveReferencePages(\n\toptions: ResolveReferencesOptions,\n): Promise<Record<string, ResolvedReferencePage>> {\n\tconst fieldMap = await getReferenceFieldMap(options.collection);\n\tconst requested = Object.entries(options.selection).filter(\n\t\t(entry): entry is [string, ReferenceQuery] => entry[1] !== undefined && fieldMap.has(entry[0]),\n\t);\n\tif (requested.length === 0) return {};\n\n\tconst db = await getDb();\n\tconst relations = new RelationRepository(db);\n\n\tconst staged =\n\t\toptions.serveDrafts && options.draftRevisionId\n\t\t\t? readStagedReferences(\n\t\t\t\t\t(await new RevisionRepository(db).findById(options.draftRevisionId))?.data,\n\t\t\t\t)\n\t\t\t: undefined;\n\n\t// Phase one: each field's page of translation groups, in selection order.\n\t// Concurrent, like phase two — the fields are independent, and awaiting them\n\t// in turn would make N fields N sequential round trips.\n\tconst pages = new Map(\n\t\tawait Promise.all(\n\t\t\trequested.map(async ([slug, query]): Promise<[string, PageOfGroups]> => {\n\t\t\t\tconst binding = fieldMap.get(slug)!;\n\t\t\t\tconst page = pageOptions(query);\n\n\t\t\t\tconst stagedGroups = staged?.[slug];\n\t\t\t\tif (stagedGroups) return [slug, pageStagedGroups(stagedGroups, page)];\n\n\t\t\t\tconst links =\n\t\t\t\t\tbinding.side === \"child\"\n\t\t\t\t\t\t? await relations.getParentsPageById(binding.relationId, options.entryGroup, page)\n\t\t\t\t\t\t: await relations.getChildrenPageById(binding.relationId, options.entryGroup, page);\n\t\t\t\treturn [\n\t\t\t\t\tslug,\n\t\t\t\t\t{\n\t\t\t\t\t\tgroups: links.items.map((link) =>\n\t\t\t\t\t\t\tbinding.side === \"child\" ? link.parentGroup : link.childGroup,\n\t\t\t\t\t\t),\n\t\t\t\t\t\tnextCursor: links.nextCursor,\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t}),\n\t\t),\n\t);\n\n\t// Phase two: one entry read per distinct target collection, however many\n\t// fields point at it.\n\tconst groupsByCollection = new Map<string, Set<string>>();\n\tfor (const [slug, page] of pages) {\n\t\tconst target = fieldMap.get(slug)!.targetCollection;\n\t\tconst groups = groupsByCollection.get(target) ?? new Set<string>();\n\t\tfor (const group of page.groups) groups.add(group);\n\t\tgroupsByCollection.set(target, groups);\n\t}\n\n\tconst localeChain = localeChainFor(options.locale);\n\tconst variantsByCollection = new Map<string, Map<string, LoadedEntry>>();\n\tawait Promise.all(\n\t\tArray.from(groupsByCollection, async ([collection, groups]) => {\n\t\t\tconst loaded = await loadEntriesByGroups(collection, [...groups], {\n\t\t\t\tpublishedOnly: !options.serveDrafts,\n\t\t\t\tlocaleChain,\n\t\t\t});\n\t\t\tconst byGroup = new Map<string, LoadedEntry>();\n\t\t\tfor (const entry of loaded) {\n\t\t\t\tconst group = entry.data.translationGroup;\n\t\t\t\tif (typeof group === \"string\") byGroup.set(group, entry);\n\t\t\t}\n\t\t\tvariantsByCollection.set(collection, byGroup);\n\t\t}),\n\t);\n\n\t// Phase three: rebuild each field in link order. A group with no surviving\n\t// variant — deleted, or unpublished for a render that may not see drafts —\n\t// drops out, exactly as a dangling link does.\n\tconst resolved: Record<string, ResolvedReferencePage> = {};\n\tfor (const [slug, page] of pages) {\n\t\tconst collection = fieldMap.get(slug)!.targetCollection;\n\t\tconst byGroup = variantsByCollection.get(collection);\n\t\tconst entries: LoadedEntry[] = [];\n\t\tfor (const group of page.groups) {\n\t\t\tconst variant = byGroup?.get(group);\n\t\t\tif (variant) entries.push(variant);\n\t\t}\n\t\tresolved[slug] = page.nextCursor\n\t\t\t? { collection, entries, nextCursor: page.nextCursor }\n\t\t\t: { collection, entries };\n\t}\n\treturn resolved;\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { l as resolveConfiguredLocale, n as getFallbackChain, r as getI18nConfig, s as isI18nEnabled } from "./config-Cs_AwWXI.mjs";
|
|
2
2
|
import { getRequestContext } from "./request-context.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/i18n/resolve.ts
|
|
@@ -16,9 +16,9 @@ import { getRequestContext } from "./request-context.mjs";
|
|
|
16
16
|
* treat that as "do not filter by locale".
|
|
17
17
|
*/
|
|
18
18
|
function resolveLocale(explicit) {
|
|
19
|
-
if (explicit !== void 0) return explicit;
|
|
19
|
+
if (explicit !== void 0) return resolveConfiguredLocale(explicit);
|
|
20
20
|
const ctxLocale = getRequestContext()?.locale;
|
|
21
|
-
if (ctxLocale !== void 0) return ctxLocale;
|
|
21
|
+
if (ctxLocale !== void 0) return resolveConfiguredLocale(ctxLocale);
|
|
22
22
|
const cfg = getI18nConfig();
|
|
23
23
|
if (cfg && isI18nEnabled()) return cfg.defaultLocale;
|
|
24
24
|
}
|
|
@@ -196,4 +196,4 @@ function normalizePath(path) {
|
|
|
196
196
|
|
|
197
197
|
//#endregion
|
|
198
198
|
export { resolveLocalizedContentRoutePath as a, resolveLocaleChain as i, localizePath as n, resolveLocale as r, interpolateUrlPattern as t };
|
|
199
|
-
//# sourceMappingURL=resolve-
|
|
199
|
+
//# sourceMappingURL=resolve-DdNXBJSr.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-DdNXBJSr.mjs","names":[],"sources":["../src/i18n/resolve.ts"],"sourcesContent":["/**\n * Shared locale-resolution helpers.\n *\n * Matches the pattern used by `query.ts` for content: an explicit locale wins,\n * otherwise we fall back to the request-context locale, otherwise to\n * `defaultLocale` when i18n is enabled, otherwise to `undefined` (meaning \"do\n * not filter by locale\" — legacy single-locale behaviour).\n */\n\nimport { getRequestContext } from \"../request-context.js\";\nimport {\n\tgetFallbackChain,\n\tgetI18nConfig,\n\tisI18nEnabled,\n\tresolveConfiguredLocale,\n} from \"./config.js\";\n\n/**\n * Resolve the locale to use for a query given an optional explicit value.\n * Returns `undefined` when no locale information is available; callers should\n * treat that as \"do not filter by locale\".\n */\nexport function resolveLocale(explicit?: string): string | undefined {\n\tif (explicit !== undefined) return resolveConfiguredLocale(explicit);\n\tconst ctxLocale = getRequestContext()?.locale;\n\tif (ctxLocale !== undefined) return resolveConfiguredLocale(ctxLocale);\n\tconst cfg = getI18nConfig();\n\tif (cfg && isI18nEnabled()) return cfg.defaultLocale;\n\treturn undefined;\n}\n\n/**\n * Fallback chain to try when looking up a single item. When i18n is disabled\n * or the locale is unspecified, returns a single-element array (or empty when\n * no locale resolves) so callers can iterate uniformly.\n */\nexport function resolveLocaleChain(explicit?: string): string[] {\n\tconst locale = resolveLocale(explicit);\n\tif (locale === undefined) return [];\n\tif (!isI18nEnabled()) return [locale];\n\treturn getFallbackChain(locale);\n}\n\nconst REPEATED_SLASHES = /\\/{2,}/g;\nconst TRAILING_SLASH = /\\/$/;\nconst DATE_TOKEN = /\\{(year|month|day|hour|minute|second)\\}/g;\n// SQLite-style datetime without timezone info (\"2023-05-08 10:00:00\").\n// Stored values are UTC; without this, `new Date()` would parse them in the\n// server's local zone and the same row could yield different URLs per host.\nconst OFFSETLESS_DATETIME = /^(\\d{4}-\\d{2}-\\d{2})[ T](\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?)$/;\nconst pad2 = (n: number) => String(n).padStart(2, \"0\");\n\nfunction parseUtcDate(date: string | Date): Date {\n\tif (date instanceof Date) return date;\n\tconst offsetless = OFFSETLESS_DATETIME.exec(date);\n\treturn new Date(offsetless ? `${offsetless[1]}T${offsetless[2]}Z` : date);\n}\n\n/**\n * Substitute WordPress-style date tokens (`{year}`, `{month}`, `{day}`,\n * `{hour}`, `{minute}`, `{second}`) from a publish date. Month/day/time parts\n * are zero-padded, mirroring WordPress (`%monthnum%`, `%day%`, ...). Tokens are\n * left untouched when no valid date is available, so callers without a date\n * (or unpublished entries) never produce a half-resolved URL.\n */\nfunction applyDateTokens(path: string, date: string | Date | null | undefined): string {\n\tconst d = date == null ? null : parseUtcDate(date);\n\tif (!d || Number.isNaN(d.getTime())) return path;\n\tconst parts: Record<string, string> = {\n\t\tyear: String(d.getUTCFullYear()),\n\t\tmonth: pad2(d.getUTCMonth() + 1),\n\t\tday: pad2(d.getUTCDate()),\n\t\thour: pad2(d.getUTCHours()),\n\t\tminute: pad2(d.getUTCMinutes()),\n\t\tsecond: pad2(d.getUTCSeconds()),\n\t};\n\treturn path.replace(DATE_TOKEN, (match, key: string) => parts[key] ?? match);\n}\n\n/**\n * Interpolate a collection `url_pattern` with a row's slug, id and publish date.\n *\n * Supported tokens: `{slug}`, `{id}`, and the date tokens `{year}`,\n * `{month}`, `{day}`, `{hour}`, `{minute}`, `{second}` (resolved from `date`,\n * for WordPress-style permalinks like `/{year}/{month}/{day}/{slug}.html`).\n *\n * Falls back to `/{collection}/{slug}` when no pattern is configured.\n * Does NOT apply any locale prefix — pass the result through\n * Astro's `getRelativeLocaleUrl` / `getAbsoluteLocaleUrl` (or the\n * `localizePath` helper below) to add the locale segment.\n */\nexport function interpolateUrlPattern(options: {\n\tpattern: string | null;\n\tcollection: string;\n\tslug: string;\n\tid: string;\n\t/** Publish date used for date tokens; tokens stay literal when absent. */\n\tdate?: string | Date | null;\n}): string {\n\tconst { pattern, collection, slug, id, date } = options;\n\tconst basePattern = pattern ?? `/${encodeURIComponent(collection)}/{slug}`;\n\tlet path = basePattern\n\t\t.replaceAll(\"{slug}\", encodeURIComponent(slug))\n\t\t.replaceAll(\"{id}\", encodeURIComponent(id));\n\tpath = applyDateTokens(path, date);\n\tpath = path.replace(REPEATED_SLASHES, \"/\");\n\tif (path.length > 1 && path.endsWith(\"/\")) path = path.slice(0, -1);\n\tif (!path.startsWith(\"/\")) path = `/${path}`;\n\treturn path;\n}\n\nexport interface ContentRoutePathOptions {\n\tpattern: string | null;\n\tcollection: string;\n\tslug: string;\n\tid: string;\n\tdate?: string | Date | null;\n\ttrailingSlash?: \"always\" | \"never\" | \"ignore\";\n}\n\n/** Resolve a content row to the route path shared by menus and public URL surfaces. */\nexport function resolveContentRoutePath(options: ContentRoutePathOptions): string {\n\tconst path = interpolateUrlPattern(options);\n\tif (options.trailingSlash === \"always\" && path !== \"/\") return `${path}/`;\n\tif (options.trailingSlash === \"never\" && path !== \"/\") return path.replace(TRAILING_SLASH, \"\");\n\treturn path;\n}\n\n/** Resolve a content row to its locale-aware route path. */\nexport async function resolveLocalizedContentRoutePath(\n\toptions: ContentRoutePathOptions & { locale: string },\n): Promise<string | null> {\n\tconst path = interpolateUrlPattern(options);\n\tconst localized = await localizePath(path, options.locale);\n\tif (localized === null) return null;\n\tif (options.trailingSlash === \"always\" && localized !== \"/\") return `${localized}/`;\n\tif (options.trailingSlash === \"never\" && localized !== \"/\") {\n\t\treturn localized.replace(TRAILING_SLASH, \"\");\n\t}\n\treturn localized;\n}\n\n/**\n * Apply a locale prefix to a path, honouring the user's Astro `i18n`\n * routing config (`prefixDefaultLocale`, custom `path`/`codes` mappings).\n *\n * Reads the resolved config from `astro:config/server`, which is always\n * available regardless of whether i18n is enabled -- so this function\n * works in both i18n and non-i18n builds without tripping Astro's\n * `i18nNotEnabled` resolver (the case with importing `astro:i18n`).\n *\n * Returns:\n * - The original `path` when i18n is not configured.\n * - The original `path` for the default locale when\n * `prefixDefaultLocale` is false.\n * - `/{segment}{path}` for any other configured locale, where\n * `{segment}` is the locale's custom `path` if one is set,\n * otherwise the locale code.\n * - `null` when the row's locale isn't in the configured list.\n * Callers should drop the entry: a sitemap link to a route the\n * site can't serve is worse than no link at all (search engines\n * get a 404 / soft-404 and downrank the page).\n *\n * Falls back to `getI18nConfig()` (EmDash's mirror of the same config,\n * populated at runtime startup) when `astro:config/server` is\n * unavailable -- e.g. running outside an Astro build context, such as\n * in vitest.\n */\nexport async function localizePath(path: string, locale: string): Promise<string | null> {\n\tconst segment = await resolveLocaleSegment(locale);\n\tif (segment === undefined) return null;\n\tif (segment === null || segment === \"\") return normalizePath(path);\n\treturn normalizePath(`/${segment}${path}`);\n}\n\n/**\n * Resolve the URL segment to use for a locale.\n *\n * Returns:\n * - `null` when i18n isn't configured (caller should not prefix).\n * - `\"\"` when the locale is the default locale and\n * `prefixDefaultLocale` is false (caller should not prefix).\n * - The locale's custom `path` value, or the locale string itself.\n * - `undefined` when the locale isn't in the configured list --\n * the row points at a route the site can't serve.\n */\nasync function resolveLocaleSegment(locale: string): Promise<string | null | undefined> {\n\tconst i18n = await readAstroI18nConfig();\n\treturn resolveLocaleSegmentFromConfig(i18n, locale);\n}\n\n/** @internal Exported for testing Astro object-locale routing without a virtual module. */\nexport function resolveLocaleSegmentFromConfig(\n\ti18n: AstroI18nConfig | null,\n\tlocale: string,\n): string | null | undefined {\n\tif (!i18n || !i18n.locales || i18n.locales.length <= 1) return null;\n\n\tlet segment: string | undefined;\n\tlet isDefault = locale === i18n.defaultLocale;\n\tfor (const entry of i18n.locales) {\n\t\tif (typeof entry === \"string\") {\n\t\t\tif (entry === locale) {\n\t\t\t\tsegment = entry;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else if (entry.path === locale || entry.codes.includes(locale)) {\n\t\t\tsegment = entry.path;\n\t\t\tisDefault ||= entry.path === i18n.defaultLocale || entry.codes.includes(i18n.defaultLocale);\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (segment === undefined) return undefined;\n\tif (isDefault && !i18n.prefixDefaultLocale) return \"\";\n\treturn segment;\n}\n\nexport interface AstroI18nConfig {\n\tdefaultLocale: string;\n\tlocales: Array<string | { codes: readonly string[]; path: string }>;\n\tprefixDefaultLocale?: boolean;\n}\n\nlet astroI18nCache: AstroI18nConfig | null | undefined;\n\nasync function readAstroI18nConfig(): Promise<AstroI18nConfig | null> {\n\tif (astroI18nCache !== undefined) return astroI18nCache;\n\n\ttry {\n\t\tconst mod = (await import(\"astro:config/server\")) as {\n\t\t\ti18n?: {\n\t\t\t\tdefaultLocale: string;\n\t\t\t\tlocales: Array<string | { codes: readonly string[]; path: string }>;\n\t\t\t\trouting?: { prefixDefaultLocale?: boolean } | string;\n\t\t\t};\n\t\t};\n\t\tif (!mod.i18n) {\n\t\t\tastroI18nCache = null;\n\t\t\treturn null;\n\t\t}\n\t\tconst routing = mod.i18n.routing;\n\t\tastroI18nCache = {\n\t\t\tdefaultLocale: mod.i18n.defaultLocale,\n\t\t\tlocales: mod.i18n.locales,\n\t\t\tprefixDefaultLocale:\n\t\t\t\ttypeof routing === \"object\" ? (routing.prefixDefaultLocale ?? false) : false,\n\t\t};\n\t\treturn astroI18nCache;\n\t} catch {\n\t\t// `astro:config/server` isn't resolvable (e.g. running under vitest\n\t\t// outside an Astro build). Fall back to EmDash's runtime config,\n\t\t// which is populated at startup via the same astroConfig object.\n\t\tconst cfg = getI18nConfig();\n\t\tif (!cfg || !isI18nEnabled()) {\n\t\t\tastroI18nCache = null;\n\t\t\treturn null;\n\t\t}\n\t\tastroI18nCache = {\n\t\t\tdefaultLocale: cfg.defaultLocale,\n\t\t\tlocales: cfg.locales,\n\t\t\tprefixDefaultLocale: cfg.prefixDefaultLocale,\n\t\t};\n\t\treturn astroI18nCache;\n\t}\n}\n\n/** @internal -- exposed for tests to reset the module-level cache. */\nexport function _resetAstroI18nCacheForTests(): void {\n\tastroI18nCache = undefined;\n}\n\nfunction normalizePath(path: string): string {\n\tlet p = path.replace(REPEATED_SLASHES, \"/\");\n\tif (p.length > 1 && p.endsWith(\"/\")) p = p.slice(0, -1);\n\tif (!p.startsWith(\"/\")) p = `/${p}`;\n\treturn p;\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { t as validateIdentifier } from "./validate-DANX1-Qi.mjs";
|
|
2
2
|
import { n as normalizeContentDatetimes, r as normalizeDatetime, t as DatetimeNormalizationError } from "./datetime-normalization-PeiEdcRY.mjs";
|
|
3
|
-
import { m as isStoragelessFieldRow } from "./types-
|
|
4
|
-
import { r as requestCached } from "./request-cache-
|
|
5
|
-
import { r as isSafeUrlFieldWriteValue } from "./url-
|
|
6
|
-
import {
|
|
3
|
+
import { m as isStoragelessFieldRow } from "./types-C_asjp1J.mjs";
|
|
4
|
+
import { r as requestCached } from "./request-cache-5z2WzWmh.mjs";
|
|
5
|
+
import { r as isSafeUrlFieldWriteValue } from "./url-DTfGDJhI.mjs";
|
|
6
|
+
import { i as EmDashValidationError } from "./types-DwhEvIVb.mjs";
|
|
7
7
|
import { sql } from "kysely";
|
|
8
8
|
import { monotonicFactory } from "ulidx";
|
|
9
9
|
|
|
@@ -371,4 +371,4 @@ var RevisionRepository = class {
|
|
|
371
371
|
|
|
372
372
|
//#endregion
|
|
373
373
|
export { ContentDatetimeNormalizer as i, createRevisionId as n, normalizeRevisionLimit as r, RevisionRepository as t };
|
|
374
|
-
//# sourceMappingURL=revision-
|
|
374
|
+
//# sourceMappingURL=revision-Dx7Uth1X.mjs.map
|