emdash 0.36.0 → 0.37.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/{adapters-CzL3H752.d.mts → adapters-BDQwg236.d.mts} +4 -2
- package/dist/{adapters-CzL3H752.d.mts.map → adapters-BDQwg236.d.mts.map} +1 -1
- package/dist/{allowed-origins-maylGaHv.mjs → allowed-origins-BGglilcs.mjs} +2 -2
- package/dist/{allowed-origins-maylGaHv.mjs.map → allowed-origins-BGglilcs.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -3
- package/dist/api/route-utils.mjs +17 -17
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +5 -5
- package/dist/api-Dz6rgoa3.mjs +10040 -0
- package/dist/api-Dz6rgoa3.mjs.map +1 -0
- package/dist/{api-tokens-9YrrCoE6.mjs → api-tokens-BSsQACNe.mjs} +2 -2
- package/dist/{api-tokens-9YrrCoE6.mjs.map → api-tokens-BSsQACNe.mjs.map} +1 -1
- package/dist/{apply-B_VMpJ2P.mjs → apply-B4SIOxR1.mjs} +18 -18
- package/dist/{apply-B_VMpJ2P.mjs.map → apply-B4SIOxR1.mjs.map} +1 -1
- package/dist/astro/image-endpoint.mjs +2 -2
- package/dist/astro/image-endpoint.mjs.map +1 -1
- package/dist/astro/index.d.mts +12 -12
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +110 -37
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +10 -10
- package/dist/astro/middleware/auth.mjs +6 -6
- package/dist/astro/middleware/media-usage-write-fence.mjs +2 -2
- package/dist/astro/middleware/redirect.mjs +3 -3
- package/dist/astro/middleware/request-context.mjs +2 -2
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +10 -10
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +157 -195
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +6 -6
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +6 -6
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +3 -3
- package/dist/astro/routes/api/admin/api-tokens/index.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +5 -5
- package/dist/astro/routes/api/admin/api-tokens/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +3 -3
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +8 -8
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +8 -8
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +8 -8
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +14 -14
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +14 -14
- package/dist/astro/routes/api/admin/bylines/index.mjs +14 -14
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +12 -12
- package/dist/astro/routes/api/admin/comments/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/comments/bulk.mjs +10 -10
- package/dist/astro/routes/api/admin/comments/counts.mjs +5 -5
- package/dist/astro/routes/api/admin/comments/index.mjs +10 -10
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +3 -3
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +2 -2
- package/dist/astro/routes/api/admin/media-usage/activation.mjs +10 -10
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +13 -13
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +13 -13
- package/dist/astro/routes/api/admin/media-usage/progress.mjs +11 -11
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +14 -14
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +13 -13
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +13 -13
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +4 -4
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +4 -4
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +49 -49
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +49 -49
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +47 -47
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +4 -4
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +47 -47
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +48 -48
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +48 -48
- package/dist/astro/routes/api/admin/plugins/index.mjs +47 -47
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +47 -47
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +48 -48
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +47 -47
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +48 -48
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +54 -50
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +17 -16
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +55 -51
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/verify.d.mts +8 -0
- package/dist/astro/routes/api/admin/plugins/registry/verify.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +93 -0
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -0
- package/dist/astro/routes/api/admin/plugins/updates.mjs +47 -47
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +47 -47
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +2 -2
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +47 -47
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +1 -1
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +1 -1
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +6 -6
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +2 -2
- package/dist/astro/routes/api/admin/users/index.mjs +6 -6
- package/dist/astro/routes/api/auth/dev-bypass.mjs +3 -3
- package/dist/astro/routes/api/auth/invite/accept.mjs +1 -1
- package/dist/astro/routes/api/auth/invite/complete.mjs +10 -10
- package/dist/astro/routes/api/auth/invite/index.mjs +7 -7
- package/dist/astro/routes/api/auth/invite/register-options.mjs +9 -9
- package/dist/astro/routes/api/auth/logout.mjs +2 -2
- package/dist/astro/routes/api/auth/magic-link/send.mjs +9 -9
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +2 -2
- package/dist/astro/routes/api/auth/me.mjs +7 -7
- package/dist/astro/routes/api/auth/mode.mjs +2 -2
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +6 -6
- package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
- package/dist/astro/routes/api/auth/passkey/options.mjs +11 -11
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +9 -9
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +10 -10
- package/dist/astro/routes/api/auth/passkey/verify.mjs +10 -10
- package/dist/astro/routes/api/auth/signup/complete.mjs +10 -10
- package/dist/astro/routes/api/auth/signup/request.mjs +9 -9
- package/dist/astro/routes/api/auth/signup/verify.mjs +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +13 -13
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +12 -12
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +14 -5
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +10 -10
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +13 -10
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +15 -15
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +15 -15
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +13 -13
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +14 -5
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/index.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/trash.mjs +7 -7
- package/dist/astro/routes/api/dashboard.mjs +7 -7
- package/dist/astro/routes/api/dev/emails.mjs +2 -2
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +15 -15
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +2 -2
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/execute.mjs +11 -11
- package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -10
- package/dist/astro/routes/api/import/wordpress/media.mjs +9 -9
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +9 -9
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +10 -10
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +15 -15
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +22 -22
- package/dist/astro/routes/api/manifest.mjs +3 -3
- package/dist/astro/routes/api/manifest.mjs.map +1 -1
- package/dist/astro/routes/api/mcp.mjs +188 -65
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +9 -9
- package/dist/astro/routes/api/media/_id_/replace.d.mts +8 -0
- package/dist/astro/routes/api/media/_id_/replace.d.mts.map +1 -0
- package/dist/astro/routes/api/media/_id_/replace.mjs +91 -0
- package/dist/astro/routes/api/media/_id_/replace.mjs.map +1 -0
- package/dist/astro/routes/api/media/_id_/upload.mjs +5 -5
- package/dist/astro/routes/api/media/_id_/usage.mjs +16 -16
- package/dist/astro/routes/api/media/_id_.mjs +15 -15
- package/dist/astro/routes/api/media/file/_...key_.d.mts.map +1 -1
- package/dist/astro/routes/api/media/file/_...key_.mjs +3 -2
- package/dist/astro/routes/api/media/file/_...key_.mjs.map +1 -1
- package/dist/astro/routes/api/media/folders/_id_.mjs +8 -8
- package/dist/astro/routes/api/media/folders/index.mjs +8 -8
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
- package/dist/astro/routes/api/media/providers/index.mjs +2 -2
- package/dist/astro/routes/api/media/upload-url.mjs +15 -13
- package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
- package/dist/astro/routes/api/media.d.mts.map +1 -1
- package/dist/astro/routes/api/media.mjs +47 -24
- package/dist/astro/routes/api/media.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +20 -13
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items.mjs +15 -11
- package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/reorder.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +15 -11
- package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/translations.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/translations.mjs +16 -12
- package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_.mjs +21 -14
- package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/index.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/index.mjs +15 -11
- package/dist/astro/routes/api/menus/index.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/authorize.mjs +5 -5
- package/dist/astro/routes/api/oauth/device/code.mjs +8 -8
- package/dist/astro/routes/api/oauth/device/token.mjs +7 -7
- package/dist/astro/routes/api/oauth/register.mjs +2 -2
- package/dist/astro/routes/api/oauth/token/refresh.mjs +5 -5
- package/dist/astro/routes/api/oauth/token/revoke.mjs +5 -5
- package/dist/astro/routes/api/oauth/token.mjs +5 -5
- package/dist/astro/routes/api/openapi.json.mjs +104 -38
- package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +4 -4
- package/dist/astro/routes/api/redirects/404s/index.mjs +8 -8
- package/dist/astro/routes/api/redirects/404s/summary.mjs +8 -8
- package/dist/astro/routes/api/redirects/_id_.mjs +9 -9
- package/dist/astro/routes/api/redirects/index.mjs +9 -9
- package/dist/astro/routes/api/relations/_id_/index.mjs +15 -15
- package/dist/astro/routes/api/relations/_id_/translations.mjs +10 -10
- package/dist/astro/routes/api/relations/index.mjs +15 -15
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +2 -2
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +3 -3
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +47 -47
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +47 -47
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +47 -47
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +47 -47
- package/dist/astro/routes/api/schema/collections/index.mjs +47 -47
- package/dist/astro/routes/api/schema/collections/reorder.mjs +47 -47
- package/dist/astro/routes/api/schema/index.mjs +8 -8
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +47 -47
- package/dist/astro/routes/api/schema/orphans/index.mjs +47 -47
- package/dist/astro/routes/api/search/enable.mjs +10 -10
- package/dist/astro/routes/api/search/index.mjs +9 -9
- package/dist/astro/routes/api/search/rebuild.mjs +10 -10
- package/dist/astro/routes/api/search/stats.mjs +5 -5
- package/dist/astro/routes/api/search/suggest.mjs +9 -9
- package/dist/astro/routes/api/sections/_slug_.mjs +9 -9
- package/dist/astro/routes/api/sections/index.mjs +9 -9
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +5 -5
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +4 -4
- package/dist/astro/routes/api/settings/backups/export.mjs +5 -5
- package/dist/astro/routes/api/settings/backups/index.mjs +6 -6
- package/dist/astro/routes/api/settings/email.mjs +4 -4
- package/dist/astro/routes/api/settings/email.mjs.map +1 -1
- package/dist/astro/routes/api/settings.d.mts.map +1 -1
- package/dist/astro/routes/api/settings.mjs +18 -14
- package/dist/astro/routes/api/settings.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin-verify.mjs +11 -11
- package/dist/astro/routes/api/setup/admin.mjs +10 -10
- package/dist/astro/routes/api/setup/dev-bypass.mjs +25 -25
- package/dist/astro/routes/api/setup/dev-reset.mjs +1 -1
- package/dist/astro/routes/api/setup/index.mjs +25 -25
- package/dist/astro/routes/api/setup/status.mjs +3 -3
- package/dist/astro/routes/api/snapshot.mjs +6 -6
- package/dist/astro/routes/api/taxonomies/_name_/reorder.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +19 -15
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +20 -16
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +24 -17
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +19 -15
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +13 -13
- package/dist/astro/routes/api/taxonomies/_name_.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_.mjs +25 -18
- package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +19 -15
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +4 -4
- package/dist/astro/routes/api/typegen.mjs +4 -4
- package/dist/astro/routes/api/well-known/auth.mjs +1 -1
- package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
- package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
- package/dist/astro/routes/api/widget-areas/_name_/reorder.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +10 -8
- 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 +16 -12
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +14 -11
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.mjs +7 -5
- package/dist/astro/routes/api/widget-areas/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/index.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/index.mjs +14 -11
- package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
- package/dist/astro/routes/api/widget-components.mjs +2 -2
- package/dist/astro/routes/robots.txt.mjs +5 -5
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +8 -8
- package/dist/astro/routes/sitemap.xml.mjs +6 -6
- package/dist/astro/types.d.mts +32 -17
- package/dist/astro/types.d.mts.map +1 -1
- package/dist/auth/providers/github.d.mts +1 -1
- package/dist/auth/providers/google.d.mts +1 -1
- package/dist/{authorize-ByYs-Uxs.mjs → authorize-Bkf_UHhD.mjs} +2 -2
- package/dist/{authorize-ByYs-Uxs.mjs.map → authorize-Bkf_UHhD.mjs.map} +1 -1
- package/dist/{backup-ChyHfIoX.mjs → backup-rwVAl9NI.mjs} +4 -4
- package/dist/{backup-ChyHfIoX.mjs.map → backup-rwVAl9NI.mjs.map} +1 -1
- package/dist/{bundle-DZFhFurR.mjs → bundle-C8S2Zl6U.mjs} +3 -3
- package/dist/{bundle-DZFhFurR.mjs.map → bundle-C8S2Zl6U.mjs.map} +1 -1
- package/dist/{byline-Cpnwrje1.mjs → byline-DuhF7NWl.mjs} +25 -12
- package/dist/byline-DuhF7NWl.mjs.map +1 -0
- package/dist/{byline-fields-CAyA_Umd.mjs → byline-fields-BovY4KYM.mjs} +1 -1
- package/dist/{byline-fields-CAyA_Umd.mjs.map → byline-fields-BovY4KYM.mjs.map} +1 -1
- package/dist/{bylines-BSo9B9RX.mjs → bylines-CJ5nd6Lw.mjs} +6 -6
- package/dist/{bylines-BSo9B9RX.mjs.map → bylines-CJ5nd6Lw.mjs.map} +1 -1
- package/dist/{bylines-CHjvehVX.mjs → bylines-RwBAeOF1.mjs} +3 -3
- package/dist/{bylines-CHjvehVX.mjs.map → bylines-RwBAeOF1.mjs.map} +1 -1
- package/dist/{cache-5VirJ2Cn.mjs → cache-BF5Kvn59.mjs} +2 -2
- package/dist/{cache-5VirJ2Cn.mjs.map → cache-BF5Kvn59.mjs.map} +1 -1
- package/dist/{challenge-store-D5pSY2S1.mjs → challenge-store-DQN_Yrck.mjs} +5 -3
- package/dist/challenge-store-DQN_Yrck.mjs.map +1 -0
- package/dist/chrome-tags-D8fiZG94.mjs +24 -0
- package/dist/chrome-tags-D8fiZG94.mjs.map +1 -0
- package/dist/{chunks-bNiX6_DR.mjs → chunks-C4szrD8o.mjs} +2 -2
- package/dist/{chunks-bNiX6_DR.mjs.map → chunks-C4szrD8o.mjs.map} +1 -1
- package/dist/cli/index.mjs +26 -26
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +2 -2
- package/dist/client/index.mjs +2 -2
- package/dist/{collection-deletion-m_oi2c0N.mjs → collection-deletion-Bj07NHbj.mjs} +2 -2
- package/dist/{collection-deletion-m_oi2c0N.mjs.map → collection-deletion-Bj07NHbj.mjs.map} +1 -1
- package/dist/{comment-reaction-CRuItEjt.mjs → comment-reaction-BhrvSHml.mjs} +2 -2
- package/dist/{comment-reaction-CRuItEjt.mjs.map → comment-reaction-BhrvSHml.mjs.map} +1 -1
- package/dist/{comment-DhvLEdhQ.mjs → comment-vxOzWbZN.mjs} +2 -2
- package/dist/{comment-DhvLEdhQ.mjs.map → comment-vxOzWbZN.mjs.map} +1 -1
- package/dist/{comments-CLj4bi8I.mjs → comments-Ct4ensnf.mjs} +2 -2
- package/dist/{comments-CLj4bi8I.mjs.map → comments-Ct4ensnf.mjs.map} +1 -1
- package/dist/{components-v4U4DT2y.mjs → components-DJbo1z0S.mjs} +1 -1
- package/dist/{components-v4U4DT2y.mjs.map → components-DJbo1z0S.mjs.map} +1 -1
- package/dist/{config-DrfghTPe.d.mts → config-B9eZ340f.d.mts} +1 -1
- package/dist/{config-DrfghTPe.d.mts.map → config-B9eZ340f.d.mts.map} +1 -1
- package/dist/config-it29yDLA.mjs +1163 -0
- package/dist/config-it29yDLA.mjs.map +1 -0
- package/dist/{content-CP-SeXNa.mjs → content-DjvM0T92.mjs} +84 -44
- package/dist/content-DjvM0T92.mjs.map +1 -0
- package/dist/{content-list-query-BhejKVqb.d.mts → content-list-query-Btqd4uV2.d.mts} +1 -1
- package/dist/{content-list-query-BhejKVqb.d.mts.map → content-list-query-Btqd4uV2.d.mts.map} +1 -1
- package/dist/{content-refresh-DLOfIhYc.mjs → content-refresh-Bwp-8yGy.mjs} +48 -21
- package/dist/content-refresh-Bwp-8yGy.mjs.map +1 -0
- package/dist/{content-repair-BCxzy0r4.mjs → content-repair-Czdp7jz5.mjs} +4 -4
- package/dist/{content-repair-BCxzy0r4.mjs.map → content-repair-Czdp7jz5.mjs.map} +1 -1
- package/dist/{context-BR5hRWiK.mjs → context-CX6gxOLW.mjs} +52 -17
- package/dist/context-CX6gxOLW.mjs.map +1 -0
- package/dist/{cron-CWfWrWKG.mjs → cron-C6o7VppJ.mjs} +1 -1
- package/dist/{cron-CWfWrWKG.mjs.map → cron-C6o7VppJ.mjs.map} +1 -1
- package/dist/{dashboard-CkIV2rnQ.mjs → dashboard-C2kTeeRI.mjs} +4 -4
- package/dist/{dashboard-CkIV2rnQ.mjs.map → dashboard-C2kTeeRI.mjs.map} +1 -1
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +1 -1
- package/dist/db/index.mjs.map +1 -1
- package/dist/db/libsql-migrations.d.mts +1 -1
- package/dist/db/libsql-migrations.mjs +4 -4
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres-migrations.d.mts +1 -1
- package/dist/db/postgres-migrations.mjs +4 -4
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/postgres.d.mts.map +1 -1
- package/dist/db/postgres.mjs +19 -3
- package/dist/db/postgres.mjs.map +1 -1
- package/dist/db/sqlite-migrations.d.mts +1 -1
- package/dist/db/sqlite-migrations.mjs +4 -4
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/db/sqlite.mjs +1 -1
- package/dist/{default-YMEfcQUx.mjs → default-Clra32mw.mjs} +1 -1
- package/dist/{default-YMEfcQUx.mjs.map → default-Clra32mw.mjs.map} +1 -1
- package/dist/{deferred-tasks-DfqxH5Xf.d.mts → deferred-tasks-CvDETTJO.d.mts} +1 -1
- package/dist/{deferred-tasks-DfqxH5Xf.d.mts.map → deferred-tasks-CvDETTJO.d.mts.map} +1 -1
- package/dist/dev-typegen-DzOPfsNj.mjs +29 -0
- package/dist/dev-typegen-DzOPfsNj.mjs.map +1 -0
- package/dist/{device-flow-CojjSBwb.mjs → device-flow-D2oCWvLJ.mjs} +4 -4
- package/dist/{device-flow-CojjSBwb.mjs.map → device-flow-D2oCWvLJ.mjs.map} +1 -1
- package/dist/{direct-executor-BWeWiRYB.mjs → direct-executor-Bfa5_ToE.mjs} +3 -3
- package/dist/{direct-executor-BWeWiRYB.mjs.map → direct-executor-Bfa5_ToE.mjs.map} +1 -1
- package/dist/{email-console-CEJgR_LB.mjs → email-console-Dzb6uGYa.mjs} +1 -1
- package/dist/{email-console-CEJgR_LB.mjs.map → email-console-Dzb6uGYa.mjs.map} +1 -1
- package/dist/{error-D9w94fjV.mjs → error-DFrQjppn.mjs} +2 -2
- package/dist/{error-D9w94fjV.mjs.map → error-DFrQjppn.mjs.map} +1 -1
- package/dist/{errors-n2j49uNf.mjs → errors-DsVoDUjJ.mjs} +3 -1
- package/dist/errors-DsVoDUjJ.mjs.map +1 -0
- package/dist/{escape-DN4Qmjsl.mjs → escape-HmHTC1Is.mjs} +1 -1
- package/dist/{escape-DN4Qmjsl.mjs.map → escape-HmHTC1Is.mjs.map} +1 -1
- package/dist/{field-defs-cache-Bh4q6oar.mjs → field-defs-cache-BM4SIRqH.mjs} +2 -2
- package/dist/{field-defs-cache-Bh4q6oar.mjs.map → field-defs-cache-BM4SIRqH.mjs.map} +1 -1
- package/dist/{fts-manager-BhOdW0bi.mjs → fts-manager-Do1BlW2r.mjs} +2 -2
- package/dist/{fts-manager-BhOdW0bi.mjs.map → fts-manager-Do1BlW2r.mjs.map} +1 -1
- package/dist/{hash-CTcngWvj.mjs → hash-3JJPlHF2.mjs} +1 -1
- package/dist/{hash-CTcngWvj.mjs.map → hash-3JJPlHF2.mjs.map} +1 -1
- package/dist/hook-result-DCh2WUpe.d.mts +31 -0
- package/dist/hook-result-DCh2WUpe.d.mts.map +1 -0
- package/dist/{hreflang-7pTHsLZJ.d.mts → hreflang-B6hbAuuO.d.mts} +2 -2
- package/dist/{hreflang-7pTHsLZJ.d.mts.map → hreflang-B6hbAuuO.d.mts.map} +1 -1
- package/dist/{hreflang-Huc6O5wa.mjs → hreflang-DQbPZliA.mjs} +6 -6
- package/dist/{hreflang-Huc6O5wa.mjs.map → hreflang-DQbPZliA.mjs.map} +1 -1
- package/dist/{identity-DXmb4aVp.mjs → identity-DksvEazf.mjs} +3 -3
- package/dist/{identity-DXmb4aVp.mjs.map → identity-DksvEazf.mjs.map} +1 -1
- package/dist/{import-C4_O3KXU.mjs → import-CJpaBBBT.mjs} +5 -5
- package/dist/{import-C4_O3KXU.mjs.map → import-CJpaBBBT.mjs.map} +1 -1
- package/dist/{index-DWbJrsAg.d.mts → index-BJNMCWmu.d.mts} +158 -49
- package/dist/index-BJNMCWmu.d.mts.map +1 -0
- package/dist/{index-6bRee8zb.d.mts → index-Du8K7bWa.d.mts} +3 -3
- package/dist/{index-6bRee8zb.d.mts.map → index-Du8K7bWa.d.mts.map} +1 -1
- package/dist/index.d.mts +22 -21
- package/dist/index.mjs +70 -70
- package/dist/{load-Bo7fZAbg.mjs → load-CawHjTOH.mjs} +2 -2
- package/dist/{load-Bo7fZAbg.mjs.map → load-CawHjTOH.mjs.map} +1 -1
- package/dist/{loader-ZsjE4paL.mjs → loader-Z8vl7zTq.mjs} +48 -13
- package/dist/loader-Z8vl7zTq.mjs.map +1 -0
- package/dist/{manifest-builder-QXuqvVMP.mjs → manifest-builder-COtzuca2.mjs} +2 -2
- package/dist/{manifest-builder-QXuqvVMP.mjs.map → manifest-builder-COtzuca2.mjs.map} +1 -1
- package/dist/{manifest-schema-CUYPfCEH.mjs → manifest-schema-BNWwR8Vd.mjs} +5 -5
- package/dist/manifest-schema-BNWwR8Vd.mjs.map +1 -0
- package/dist/media/image-endpoint.d.mts +4 -2
- package/dist/media/image-endpoint.d.mts.map +1 -1
- package/dist/media/image-endpoint.mjs +6 -4
- package/dist/media/image-endpoint.mjs.map +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +1 -1
- package/dist/media/local-runtime.d.mts +12 -12
- package/dist/media/local-runtime.mjs +4 -4
- package/dist/{media-D6SeAfBl.mjs → media-BBm8Wg3f.mjs} +30 -2
- package/dist/media-BBm8Wg3f.mjs.map +1 -0
- package/dist/{media-BjwNuLEu.mjs → media-BHjus86Y.mjs} +35 -5
- package/dist/media-BHjus86Y.mjs.map +1 -0
- package/dist/{media-allowlist-D35v7bmL.mjs → media-allowlist-CoTBWoDp.mjs} +1 -1
- package/dist/{media-allowlist-D35v7bmL.mjs.map → media-allowlist-CoTBWoDp.mjs.map} +1 -1
- package/dist/{media-folders-D-0CmRZj.mjs → media-folders-BGkATs8n.mjs} +1 -1
- package/dist/{media-folders-D-0CmRZj.mjs.map → media-folders-BGkATs8n.mjs.map} +1 -1
- package/dist/{media-upload-C7bLXGcI.mjs → media-upload-BCidR-EY.mjs} +6 -6
- package/dist/{media-upload-C7bLXGcI.mjs.map → media-upload-BCidR-EY.mjs.map} +1 -1
- package/dist/{media-url-DH7giMx_.mjs → media-url-DHoPr0hq.mjs} +1 -1
- package/dist/{media-url-DH7giMx_.mjs.map → media-url-DHoPr0hq.mjs.map} +1 -1
- package/dist/{media-usage-BTRJvS6V.mjs → media-usage-CdY5jhSR.mjs} +8 -8
- package/dist/{media-usage-BTRJvS6V.mjs.map → media-usage-CdY5jhSR.mjs.map} +1 -1
- package/dist/{media-usage-activation-Dx0kPV6b.mjs → media-usage-activation-BgeMtK5C.mjs} +2 -2
- package/dist/{media-usage-activation-Dx0kPV6b.mjs.map → media-usage-activation-BgeMtK5C.mjs.map} +1 -1
- package/dist/{media-usage-work-DWb2XPMI.mjs → media-usage-work-CnGCdHxx.mjs} +4 -4
- package/dist/{media-usage-work-DWb2XPMI.mjs.map → media-usage-work-CnGCdHxx.mjs.map} +1 -1
- package/dist/{media-usage-work-C-fhM30c.mjs → media-usage-work-D6D9sMCA.mjs} +1 -1
- package/dist/{media-usage-work-C-fhM30c.mjs.map → media-usage-work-D6D9sMCA.mjs.map} +1 -1
- package/dist/{media-usage-write-fence-BwoJVRDC.mjs → media-usage-write-fence-hjeD4u7s.mjs} +2 -2
- package/dist/{media-usage-write-fence-BwoJVRDC.mjs.map → media-usage-write-fence-hjeD4u7s.mjs.map} +1 -1
- package/dist/{menus-CNg0QlDt.mjs → menus-6qSwTNxG.mjs} +346 -94
- package/dist/menus-6qSwTNxG.mjs.map +1 -0
- package/dist/{menus-CD7EFLwz.mjs → menus-uvPLXMZf.mjs} +3 -3
- package/dist/{menus-CD7EFLwz.mjs.map → menus-uvPLXMZf.mjs.map} +1 -1
- package/dist/migrations/index.d.mts +1 -1
- package/dist/migrations/index.mjs +3 -3
- package/dist/{mode-DaUM_MB2.mjs → mode-DN_WneRx.mjs} +1 -1
- package/dist/{mode-DaUM_MB2.mjs.map → mode-DN_WneRx.mjs.map} +1 -1
- package/dist/{node-sqlite-compat-Udb4Y-rs.mjs → node-sqlite-compat-BuJXIeMz.mjs} +1 -1
- package/dist/{node-sqlite-compat-Udb4Y-rs.mjs.map → node-sqlite-compat-BuJXIeMz.mjs.map} +1 -1
- package/dist/{normalize-CSxdKBVa.mjs → normalize-C2xNjTSG.mjs} +15 -5
- package/dist/normalize-C2xNjTSG.mjs.map +1 -0
- package/dist/{oauth-authorization-Dpsb-fMJ.mjs → oauth-authorization-Dj6Kwc21.mjs} +4 -4
- package/dist/{oauth-authorization-Dpsb-fMJ.mjs.map → oauth-authorization-Dj6Kwc21.mjs.map} +1 -1
- package/dist/{oauth-clients-Bxnoe_67.mjs → oauth-clients-FD7I0J8m.mjs} +1 -1
- package/dist/{oauth-clients-Bxnoe_67.mjs.map → oauth-clients-FD7I0J8m.mjs.map} +1 -1
- package/dist/{oauth-state-store-0C4s0K6w.mjs → oauth-state-store-DkmDOmHs.mjs} +1 -1
- package/dist/{oauth-state-store-0C4s0K6w.mjs.map → oauth-state-store-DkmDOmHs.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-wlGYSeqX.mjs → oauth-user-lookup-CvIwGpYd.mjs} +1 -1
- package/dist/{oauth-user-lookup-wlGYSeqX.mjs.map → oauth-user-lookup-CvIwGpYd.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/{object-cache-71tPfV4A.mjs → object-cache-DVKnyOfy.mjs} +19 -3
- package/dist/object-cache-DVKnyOfy.mjs.map +1 -0
- package/dist/{options-BhZIeFY1.d.mts → options-CYb4y7hM.d.mts} +24 -11
- package/dist/options-CYb4y7hM.d.mts.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/{parse-BRJg1kz8.mjs → parse-Ckpg-Qfp.mjs} +2 -2
- package/dist/{parse-BRJg1kz8.mjs.map → parse-Ckpg-Qfp.mjs.map} +1 -1
- package/dist/{passkey-config-B3P0nHRR.mjs → passkey-config-O_lj3y0k.mjs} +1 -1
- package/dist/{passkey-config-B3P0nHRR.mjs.map → passkey-config-O_lj3y0k.mjs.map} +1 -1
- package/dist/{placeholder-BR4ZhVJl.d.mts → placeholder-4X9BrRrp.d.mts} +1 -1
- package/dist/{placeholder-BR4ZhVJl.d.mts.map → placeholder-4X9BrRrp.d.mts.map} +1 -1
- package/dist/plugin-types.d.mts +8 -3
- package/dist/plugin-types.d.mts.map +1 -1
- package/dist/plugin-utils.d.mts +10 -10
- package/dist/plugins/adapt-sandbox-entry.d.mts +10 -10
- package/dist/plugins/adapt-sandbox-entry.mjs +2 -2
- package/dist/{policy-BVRganJQ.mjs → policy-Dhtwntrt.mjs} +2 -2
- package/dist/{policy-BVRganJQ.mjs.map → policy-Dhtwntrt.mjs.map} +1 -1
- package/dist/{portable-text-C8Tvp4_g.mjs → portable-text-U85hOafW.mjs} +1 -1
- package/dist/{portable-text-C8Tvp4_g.mjs.map → portable-text-U85hOafW.mjs.map} +1 -1
- package/dist/{preview-dn2dUyM0.mjs → preview-B_vJLvf8.mjs} +2 -2
- package/dist/{preview-dn2dUyM0.mjs.map → preview-B_vJLvf8.mjs.map} +1 -1
- package/dist/{protocol-CuBEsqgE.d.mts → protocol-JdD2YhY9.d.mts} +2 -2
- package/dist/{protocol-CuBEsqgE.d.mts.map → protocol-JdD2YhY9.d.mts.map} +1 -1
- package/dist/{public-url-DRz_AinV.mjs → public-url-CarhZJgf.mjs} +1 -1
- package/dist/{public-url-DRz_AinV.mjs.map → public-url-CarhZJgf.mjs.map} +1 -1
- package/dist/{query-D18vTdha.mjs → query-BZKZcG5b.mjs} +14 -14
- package/dist/{query-D18vTdha.mjs.map → query-BZKZcG5b.mjs.map} +1 -1
- package/dist/{query-tZDEdtCN.mjs → query-BndaFxxp.mjs} +4 -4
- package/dist/{query-tZDEdtCN.mjs.map → query-BndaFxxp.mjs.map} +1 -1
- package/dist/{rate-limit-on7KPo-v.mjs → rate-limit-BZmATC6W.mjs} +2 -2
- package/dist/{rate-limit-on7KPo-v.mjs.map → rate-limit-BZmATC6W.mjs.map} +1 -1
- package/dist/{redirect-DrbEmU9a.mjs → redirect-CzqnLxK-.mjs} +1 -1
- package/dist/{redirect-DrbEmU9a.mjs.map → redirect-CzqnLxK-.mjs.map} +1 -1
- package/dist/{redirects-CRIM55KH.mjs → redirects-BLNOWQTn.mjs} +63 -28
- package/dist/redirects-BLNOWQTn.mjs.map +1 -0
- package/dist/{redirects-BahWiu8Z.mjs → redirects-CqzNM0KM.mjs} +2 -2
- package/dist/{redirects-BahWiu8Z.mjs.map → redirects-CqzNM0KM.mjs.map} +1 -1
- package/dist/{registry-Cx-jEJOS.mjs → registry-AZAsRsor.mjs} +27 -9
- package/dist/registry-AZAsRsor.mjs.map +1 -0
- package/dist/{relation-A6wLF_DS.mjs → relation-04DfKRTO.mjs} +2 -2
- package/dist/{relation-A6wLF_DS.mjs.map → relation-04DfKRTO.mjs.map} +1 -1
- package/dist/{relations-BTPM2saV.mjs → relations-C4htk5sb.mjs} +7 -7
- package/dist/relations-C4htk5sb.mjs.map +1 -0
- package/dist/{relations-Cj5hZ6Zg.mjs → relations-CcFwDJdJ.mjs} +4 -4
- package/dist/{relations-Cj5hZ6Zg.mjs.map → relations-CcFwDJdJ.mjs.map} +1 -1
- package/dist/{relations-C7B46bcU.d.mts → relations-DnRK4YIT.d.mts} +175 -41
- package/dist/relations-DnRK4YIT.d.mts.map +1 -0
- package/dist/request-context.d.mts +1 -1
- package/dist/{request-meta-DRp5ENd_.mjs → request-meta-DYxLlnmz.mjs} +2 -2
- package/dist/{request-meta-DRp5ENd_.mjs.map → request-meta-DYxLlnmz.mjs.map} +1 -1
- package/dist/{resolve-DxUpTMmE.mjs → resolve-prZ3mP7l.mjs} +1 -1
- package/dist/{resolve-DxUpTMmE.mjs.map → resolve-prZ3mP7l.mjs.map} +1 -1
- package/dist/{runner-77GOZCnH.mjs → runner-BLIDKpmA.mjs} +351 -294
- package/dist/runner-BLIDKpmA.mjs.map +1 -0
- package/dist/{runner-zgqA_CqP.d.mts → runner-YKfIMnaF.d.mts} +3 -2
- package/dist/runner-YKfIMnaF.d.mts.map +1 -0
- package/dist/runtime.d.mts +11 -11
- package/dist/runtime.mjs +1 -1
- package/dist/{schema-BY-oVntF.mjs → schema-CGnBeLiW.mjs} +3 -3
- package/dist/{schema-BY-oVntF.mjs.map → schema-CGnBeLiW.mjs.map} +1 -1
- package/dist/{schema-Cw9kVK0I.mjs → schema-DYr-Vd-L.mjs} +5 -5
- package/dist/{schema-Cw9kVK0I.mjs.map → schema-DYr-Vd-L.mjs.map} +1 -1
- package/dist/{scopes-vMR1uIbt.mjs → scopes-BhWvBavj.mjs} +3 -3
- package/dist/{scopes-vMR1uIbt.mjs.map → scopes-BhWvBavj.mjs.map} +1 -1
- package/dist/{search-CfT3KxO5.mjs → search-C-qDk4kx.mjs} +4 -4
- package/dist/{search-CfT3KxO5.mjs.map → search-C-qDk4kx.mjs.map} +1 -1
- package/dist/{secrets-BH2Qow1-.mjs → secrets-rEtHt-6z.mjs} +1 -1
- package/dist/{secrets-BH2Qow1-.mjs.map → secrets-rEtHt-6z.mjs.map} +1 -1
- package/dist/{sections-DTfjyf1z.mjs → sections-B_nYvlwn.mjs} +2 -2
- package/dist/{sections-DTfjyf1z.mjs.map → sections-B_nYvlwn.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +18 -18
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.mjs +13 -13
- package/dist/{seo-Cm-dtvgk.mjs → seo-926NRIgt.mjs} +3 -3
- package/dist/{seo-Cm-dtvgk.mjs.map → seo-926NRIgt.mjs.map} +1 -1
- package/dist/{seo-BSiTIXzd.mjs → seo-CVWkdv6x.mjs} +1 -1
- package/dist/{seo-BSiTIXzd.mjs.map → seo-CVWkdv6x.mjs.map} +1 -1
- package/dist/{service-DYsDHEKe.mjs → service-CJl3ZAYs.mjs} +3 -3
- package/dist/{service-DYsDHEKe.mjs.map → service-CJl3ZAYs.mjs.map} +1 -1
- package/dist/{session-user-CNAfvsdw.mjs → session-user-BlMgqCHS.mjs} +1 -1
- package/dist/{session-user-CNAfvsdw.mjs.map → session-user-BlMgqCHS.mjs.map} +1 -1
- package/dist/{settings-BgN-0DT-.mjs → settings--wobrkkC.mjs} +18 -5
- package/dist/settings--wobrkkC.mjs.map +1 -0
- package/dist/{settings-DjtkUo__.mjs → settings-Cwm6o2jY.mjs} +3 -3
- package/dist/{settings-DjtkUo__.mjs.map → settings-Cwm6o2jY.mjs.map} +1 -1
- package/dist/{setup-complete-CcpXaPU7.mjs → setup-complete-DQbClIN2.mjs} +1 -1
- package/dist/{setup-complete-CcpXaPU7.mjs.map → setup-complete-DQbClIN2.mjs.map} +1 -1
- package/dist/{setup-nonce-Reyw30jg.mjs → setup-nonce-DZCFS2sn.mjs} +1 -1
- package/dist/{setup-nonce-Reyw30jg.mjs.map → setup-nonce-DZCFS2sn.mjs.map} +1 -1
- package/dist/{site-url-Cs_V9n3V.mjs → site-url-BrxA_E9H.mjs} +2 -2
- package/dist/{site-url-Cs_V9n3V.mjs.map → site-url-BrxA_E9H.mjs.map} +1 -1
- package/dist/{snapshot-DSB8P7Lm.mjs → snapshot--OCDTqdb.mjs} +1 -1
- package/dist/{snapshot-DSB8P7Lm.mjs.map → snapshot--OCDTqdb.mjs.map} +1 -1
- package/dist/{ssrf-DqebVE34.mjs → ssrf-5sIM5jzl.mjs} +4 -3
- package/dist/{ssrf-DqebVE34.mjs.map → ssrf-5sIM5jzl.mjs.map} +1 -1
- package/dist/{state-BJfU9Uzw.mjs → state-BpFVsJZB.mjs} +1 -1
- package/dist/{state-BJfU9Uzw.mjs.map → state-BpFVsJZB.mjs.map} +1 -1
- package/dist/{status-DDu8HIQl.mjs → status-B777-dXz.mjs} +1 -1
- package/dist/{status-DDu8HIQl.mjs.map → status-B777-dXz.mjs.map} +1 -1
- package/dist/storage/local.d.mts +2 -1
- package/dist/storage/local.d.mts.map +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/local.mjs.map +1 -1
- package/dist/storage/s3.d.mts +2 -1
- package/dist/storage/s3.d.mts.map +1 -1
- package/dist/storage/s3.mjs +3 -2
- package/dist/storage/s3.mjs.map +1 -1
- package/dist/{target-D0o26Azo.mjs → target-BmR0iTwz.mjs} +1 -1
- package/dist/{target-D0o26Azo.mjs.map → target-BmR0iTwz.mjs.map} +1 -1
- package/dist/{taxonomies-CPGxo-bn.mjs → taxonomies-DkAkMupr.mjs} +16 -13
- package/dist/taxonomies-DkAkMupr.mjs.map +1 -0
- package/dist/{taxonomies-kmyudNGP.mjs → taxonomies-Wfy_Lg12.mjs} +42 -16
- package/dist/taxonomies-Wfy_Lg12.mjs.map +1 -0
- package/dist/{taxonomy-8X09dLN5.mjs → taxonomy-tJepplLL.mjs} +4 -4
- package/dist/{taxonomy-8X09dLN5.mjs.map → taxonomy-tJepplLL.mjs.map} +1 -1
- package/dist/{tokens-gTS-IVUp.mjs → tokens-BCO1oruF.mjs} +1 -1
- package/dist/{tokens-gTS-IVUp.mjs.map → tokens-BCO1oruF.mjs.map} +1 -1
- package/dist/{transport-fX59xaJz.mjs → transport-Dr3qtwXC.mjs} +1 -1
- package/dist/{transport-fX59xaJz.mjs.map → transport-Dr3qtwXC.mjs.map} +1 -1
- package/dist/{transport-_6R1ub7t.d.mts → transport-xh6YKW2G.d.mts} +1 -1
- package/dist/{transport-_6R1ub7t.d.mts.map → transport-xh6YKW2G.d.mts.map} +1 -1
- package/dist/{trusted-proxy-fe6nEgR4.mjs → trusted-proxy-BR5F1Otp.mjs} +1 -1
- package/dist/{trusted-proxy-fe6nEgR4.mjs.map → trusted-proxy-BR5F1Otp.mjs.map} +1 -1
- package/dist/{types-BXUmsINL.mjs → types-3qNFPlci.mjs} +1 -1
- package/dist/{types-BXUmsINL.mjs.map → types-3qNFPlci.mjs.map} +1 -1
- package/dist/{types-Vg6f5i3s.d.mts → types-B6GrPic4.d.mts} +9 -3
- package/dist/{types-Vg6f5i3s.d.mts.map → types-B6GrPic4.d.mts.map} +1 -1
- package/dist/{types-DJQxln7q.d.mts → types-BuHW4xDE.d.mts} +11 -10
- package/dist/types-BuHW4xDE.d.mts.map +1 -0
- package/dist/{types-BzBd3PeX.d.mts → types-C00oyCZp.d.mts} +1 -1
- package/dist/{types-BzBd3PeX.d.mts.map → types-C00oyCZp.d.mts.map} +1 -1
- package/dist/{types-Blb-MRC3.d.mts → types-CDtkNSFQ.d.mts} +1 -1
- package/dist/{types-Blb-MRC3.d.mts.map → types-CDtkNSFQ.d.mts.map} +1 -1
- package/dist/{types-D5VVLr7J.d.mts → types-CPeXo1wF.d.mts} +1 -1
- package/dist/{types-D5VVLr7J.d.mts.map → types-CPeXo1wF.d.mts.map} +1 -1
- package/dist/types-CQPWhPxE.mjs.map +1 -1
- package/dist/{types-D_DWe7k9.d.mts → types-CXFkwEGC.d.mts} +3 -2
- package/dist/types-CXFkwEGC.d.mts.map +1 -0
- package/dist/{types-CLqvnd05.d.mts → types-DczELMop.d.mts} +1 -1
- package/dist/{types-CLqvnd05.d.mts.map → types-DczELMop.d.mts.map} +1 -1
- package/dist/types-DfuTR6dL.mjs +3 -0
- package/dist/{types-DHxzBjbD.d.mts → types-FV23hEoW.d.mts} +1 -1
- package/dist/{types-DHxzBjbD.d.mts.map → types-FV23hEoW.d.mts.map} +1 -1
- package/dist/{types-Br-ERaxh.d.mts → types-xDMtUFnO.d.mts} +1 -1
- package/dist/{types-Br-ERaxh.d.mts.map → types-xDMtUFnO.d.mts.map} +1 -1
- package/dist/{upload-attempts-CNyGSepg.mjs → upload-attempts-BsqoQ1fn.mjs} +1 -1
- package/dist/{upload-attempts-CNyGSepg.mjs.map → upload-attempts-BsqoQ1fn.mjs.map} +1 -1
- package/dist/{url-pattern-K-KdXcSe.mjs → url-pattern-D4c2czpJ.mjs} +1 -1
- package/dist/{url-pattern-K-KdXcSe.mjs.map → url-pattern-D4c2czpJ.mjs.map} +1 -1
- package/dist/{user-CtYY0tp2.mjs → user-BTZ40aq6.mjs} +2 -2
- package/dist/{user-CtYY0tp2.mjs.map → user-BTZ40aq6.mjs.map} +1 -1
- package/dist/{utils-HztC73hq.mjs → utils-BKvNjjhY.mjs} +1 -1
- package/dist/{utils-HztC73hq.mjs.map → utils-BKvNjjhY.mjs.map} +1 -1
- package/dist/{validate-Dd-IUjnZ.mjs → validate-DE_LRwo9.mjs} +2 -2
- package/dist/{validate-Dd-IUjnZ.mjs.map → validate-DE_LRwo9.mjs.map} +1 -1
- package/dist/{validate-DlqdOZXB.d.mts → validate-DUP27OYD.d.mts} +5 -5
- package/dist/{validate-DlqdOZXB.d.mts.map → validate-DUP27OYD.d.mts.map} +1 -1
- package/dist/{validation-D83n7Npi.mjs → validation-BMImFJ11.mjs} +8 -8
- package/dist/{validation-D83n7Npi.mjs.map → validation-BMImFJ11.mjs.map} +1 -1
- package/dist/version-Bii3suaO.mjs +7 -0
- package/dist/{version-ri-sCyAp.mjs.map → version-Bii3suaO.mjs.map} +1 -1
- package/dist/{widgets-CpmZd9Q-.mjs → widgets-D3gJ10xU.mjs} +17 -4
- package/dist/widgets-D3gJ10xU.mjs.map +1 -0
- package/dist/{wxr-taxonomies-BFd0y72_.d.mts → wxr-taxonomies-B2Og_6rU.d.mts} +1 -1
- package/dist/{wxr-taxonomies-BFd0y72_.d.mts.map → wxr-taxonomies-B2Og_6rU.d.mts.map} +1 -1
- package/dist/{wxr-taxonomies-Df4vxWcU.mjs → wxr-taxonomies-Cxngsjwo.mjs} +4 -4
- package/dist/{wxr-taxonomies-Df4vxWcU.mjs.map → wxr-taxonomies-Cxngsjwo.mjs.map} +1 -1
- package/dist/{zod-generator-DylzusHh.mjs → zod-generator-BuYSQJB7.mjs} +11 -7
- package/dist/zod-generator-BuYSQJB7.mjs.map +1 -0
- package/package.json +12 -9
- package/src/api/errors.ts +2 -0
- package/src/api/handlers/content.ts +49 -11
- package/src/api/handlers/index.ts +1 -0
- package/src/api/handlers/manifest.ts +161 -12
- package/src/api/handlers/media.ts +30 -0
- package/src/api/handlers/registry.ts +393 -289
- package/src/api/handlers/taxonomies.ts +16 -9
- package/src/api/openapi/document.ts +85 -5
- package/src/api/parse.ts +1 -1
- package/src/api/schemas/auth.ts +4 -4
- package/src/api/schemas/bylines.ts +3 -3
- package/src/api/schemas/comments.ts +1 -1
- package/src/api/schemas/common.ts +3 -2
- package/src/api/schemas/content.ts +78 -22
- package/src/api/schemas/media.ts +52 -0
- package/src/api/schemas/redirects.ts +6 -1
- package/src/api/schemas/schema.ts +4 -0
- package/src/api/schemas/setup.ts +1 -1
- package/src/api/schemas/taxonomies.ts +2 -2
- package/src/api/schemas/users.ts +1 -1
- package/src/api/types.ts +23 -10
- package/src/astro/dev-typegen.ts +35 -0
- package/src/astro/image-endpoint.ts +2 -2
- package/src/astro/integration/dev-typegen.ts +91 -0
- package/src/astro/integration/index.ts +9 -44
- package/src/astro/integration/routes.ts +5 -0
- package/src/astro/integration/vite-config.ts +21 -2
- package/src/astro/middleware.ts +5 -0
- package/src/astro/routes/api/admin/api-tokens/index.ts +4 -1
- package/src/astro/routes/api/admin/oauth-clients/[id].ts +1 -1
- package/src/astro/routes/api/admin/oauth-clients/index.ts +1 -1
- package/src/astro/routes/api/admin/plugins/registry/[id]/update.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/artifact.ts +3 -7
- package/src/astro/routes/api/admin/plugins/registry/install.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/verify.ts +60 -0
- package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +8 -2
- package/src/astro/routes/api/content/[collection]/[id]/publish.ts +2 -1
- package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +6 -2
- package/src/astro/routes/api/manifest.ts +1 -1
- package/src/astro/routes/api/media/[id]/replace.ts +114 -0
- package/src/astro/routes/api/media/file/[...key].ts +4 -1
- package/src/astro/routes/api/media/upload-url.ts +8 -4
- package/src/astro/routes/api/media.ts +54 -8
- package/src/astro/routes/api/menus/[name]/items/[id].ts +7 -2
- package/src/astro/routes/api/menus/[name]/items.ts +4 -1
- package/src/astro/routes/api/menus/[name]/reorder.ts +4 -1
- package/src/astro/routes/api/menus/[name]/translations.ts +4 -1
- package/src/astro/routes/api/menus/[name].ts +7 -2
- package/src/astro/routes/api/menus/index.ts +4 -1
- package/src/astro/routes/api/settings/email.ts +1 -1
- package/src/astro/routes/api/settings.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name]/reorder.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name]/terms/[slug]/translations.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name]/terms/[slug].ts +7 -2
- package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name].ts +7 -2
- package/src/astro/routes/api/taxonomies/index.ts +4 -1
- package/src/astro/routes/api/widget-areas/[name]/reorder.ts +3 -1
- package/src/astro/routes/api/widget-areas/[name]/widgets/[id].ts +5 -2
- package/src/astro/routes/api/widget-areas/[name]/widgets.ts +3 -1
- package/src/astro/routes/api/widget-areas/[name].ts +3 -1
- package/src/astro/routes/api/widget-areas/index.ts +3 -1
- package/src/astro/types.ts +23 -5
- package/src/auth/challenge-store.ts +3 -1
- package/src/aws-sdk.d.ts +1 -0
- package/src/cache/chrome-tags.ts +24 -0
- package/src/components/EmDashImage.astro +2 -1
- package/src/components/EmDashMedia.astro +2 -1
- package/src/components/InlinePortableTextEditor.tsx +6 -1
- package/src/components/widgets/Archives.astro +2 -37
- package/src/content/converters/index.ts +2 -0
- package/src/content/converters/mark-safety.ts +1 -0
- package/src/content/converters/portable-text-identity.ts +139 -0
- package/src/content/converters/portable-text-to-prosemirror.ts +202 -69
- package/src/content/converters/prosemirror-to-portable-text.ts +96 -25
- package/src/content/converters/types.ts +1 -0
- package/src/database/migrations/017_authorization_codes.ts +14 -4
- package/src/database/migrations/074_content_deleted_scheduled_index.ts +55 -0
- package/src/database/migrations/runner.ts +3 -1
- package/src/database/repositories/byline.ts +32 -16
- package/src/database/repositories/content.ts +114 -47
- package/src/database/repositories/media-usage.ts +66 -37
- package/src/database/repositories/media.ts +60 -1
- package/src/database/repositories/plugin-storage.ts +74 -9
- package/src/database/repositories/types.ts +8 -7
- package/src/db/adapters.ts +8 -1
- package/src/db/postgres.ts +23 -0
- package/src/emdash-runtime.ts +80 -150
- package/src/fields/boolean.ts +1 -1
- package/src/fields/datetime.ts +1 -1
- package/src/fields/file.ts +1 -1
- package/src/fields/integer.ts +1 -1
- package/src/fields/json.ts +1 -1
- package/src/fields/multiselect.ts +1 -1
- package/src/fields/number.ts +1 -1
- package/src/fields/portable-text.ts +1 -1
- package/src/fields/richtext.ts +1 -1
- package/src/fields/select.ts +1 -1
- package/src/fields/slug.ts +1 -1
- package/src/fields/text.ts +1 -1
- package/src/fields/textarea.ts +1 -1
- package/src/fields/types.ts +2 -2
- package/src/index.ts +25 -3
- package/src/loader.ts +63 -10
- package/src/mcp/server.ts +228 -24
- package/src/media/image-endpoint.ts +5 -2
- package/src/media/normalize.ts +15 -4
- package/src/media/usage/cleanup.ts +9 -8
- package/src/menus/index.ts +16 -0
- package/src/object-cache/index.ts +44 -2
- package/src/plugin-types.ts +18 -1
- package/src/plugins/hooks.ts +4 -1
- package/src/plugins/index.ts +6 -0
- package/src/plugins/manager.ts +2 -1
- package/src/plugins/manifest-schema.ts +1 -1
- package/src/plugins/routes.ts +3 -1
- package/src/plugins/sandbox/hook-result.ts +52 -0
- package/src/plugins/sandbox/index.ts +10 -0
- package/src/plugins/types.ts +6 -0
- package/src/registry/artifact-checksum.ts +15 -0
- package/src/registry/artifact-verification.ts +85 -0
- package/src/registry/authoritative-records.ts +180 -0
- package/src/registry/record-labels.ts +28 -0
- package/src/schema/registry.ts +26 -3
- package/src/schema/zod-generator.ts +16 -13
- package/src/security/ssrf.ts +5 -2
- package/src/settings/index.ts +16 -0
- package/src/storage/local.ts +1 -0
- package/src/storage/s3.ts +2 -0
- package/src/storage/types.ts +2 -0
- package/src/taxonomies/index.ts +40 -20
- package/src/widgets/archives.ts +67 -0
- package/src/widgets/index.ts +16 -0
- package/dist/api-B0w3uBiG.mjs +0 -2269
- package/dist/api-B0w3uBiG.mjs.map +0 -1
- package/dist/byline-Cpnwrje1.mjs.map +0 -1
- package/dist/challenge-store-D5pSY2S1.mjs.map +0 -1
- package/dist/content-CP-SeXNa.mjs.map +0 -1
- package/dist/content-refresh-DLOfIhYc.mjs.map +0 -1
- package/dist/context-BR5hRWiK.mjs.map +0 -1
- package/dist/errors-n2j49uNf.mjs.map +0 -1
- package/dist/index-DWbJrsAg.d.mts.map +0 -1
- package/dist/loader-ZsjE4paL.mjs.map +0 -1
- package/dist/manifest-schema-CUYPfCEH.mjs.map +0 -1
- package/dist/media-BjwNuLEu.mjs.map +0 -1
- package/dist/media-D6SeAfBl.mjs.map +0 -1
- package/dist/menus-CNg0QlDt.mjs.map +0 -1
- package/dist/normalize-CSxdKBVa.mjs.map +0 -1
- package/dist/object-cache-71tPfV4A.mjs.map +0 -1
- package/dist/options-BhZIeFY1.d.mts.map +0 -1
- package/dist/redirects-CRIM55KH.mjs.map +0 -1
- package/dist/registry-BiO5WwPq.mjs +0 -2716
- package/dist/registry-BiO5WwPq.mjs.map +0 -1
- package/dist/registry-Cx-jEJOS.mjs.map +0 -1
- package/dist/relations-BTPM2saV.mjs.map +0 -1
- package/dist/relations-C7B46bcU.d.mts.map +0 -1
- package/dist/runner-77GOZCnH.mjs.map +0 -1
- package/dist/runner-zgqA_CqP.d.mts.map +0 -1
- package/dist/settings-BgN-0DT-.mjs.map +0 -1
- package/dist/taxonomies-CPGxo-bn.mjs.map +0 -1
- package/dist/taxonomies-kmyudNGP.mjs.map +0 -1
- package/dist/types-D6OcIp2P.mjs +0 -3
- package/dist/types-DJQxln7q.d.mts.map +0 -1
- package/dist/types-D_DWe7k9.d.mts.map +0 -1
- package/dist/version-ri-sCyAp.mjs +0 -7
- package/dist/widgets-CpmZd9Q-.mjs.map +0 -1
- package/dist/zod-generator-DylzusHh.mjs.map +0 -1
- /package/dist/{api-tokens-B5NHLNUN.mjs → api-tokens-BfYts-sq.mjs} +0 -0
- /package/dist/{ssrf-BPKzkm6O.mjs → ssrf-Dg3cIT-b.mjs} +0 -0
|
@@ -42,6 +42,16 @@ const MAX_IN_FILTER_VALUES = SQL_BATCH_SIZE;
|
|
|
42
42
|
const MAX_FILTER_STRING_LENGTH = 2048;
|
|
43
43
|
|
|
44
44
|
type NormalizedFilterScalar = string | number;
|
|
45
|
+
export type ContentRevisionPrecondition = Pick<ContentItem, "version" | "updatedAt">;
|
|
46
|
+
|
|
47
|
+
function assertRevisionPrecondition(
|
|
48
|
+
item: ContentItem,
|
|
49
|
+
expected: ContentRevisionPrecondition | undefined,
|
|
50
|
+
): void {
|
|
51
|
+
if (expected && (item.version !== expected.version || item.updatedAt !== expected.updatedAt)) {
|
|
52
|
+
throw new ContentMutationConflictError();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
45
55
|
|
|
46
56
|
type ResolvedFieldFilter =
|
|
47
57
|
| { column: string; kind: "null" }
|
|
@@ -837,6 +847,15 @@ export class ContentRepository {
|
|
|
837
847
|
return mappedResult;
|
|
838
848
|
}
|
|
839
849
|
|
|
850
|
+
private normalizeScheduledAt(value: string | null): string | null {
|
|
851
|
+
if (value === null) return null;
|
|
852
|
+
const scheduledDate = new Date(value);
|
|
853
|
+
if (isNaN(scheduledDate.getTime())) {
|
|
854
|
+
throw new EmDashValidationError("Invalid scheduled date");
|
|
855
|
+
}
|
|
856
|
+
return scheduledDate.toISOString();
|
|
857
|
+
}
|
|
858
|
+
|
|
840
859
|
/**
|
|
841
860
|
* Update content
|
|
842
861
|
*/
|
|
@@ -861,7 +880,7 @@ export class ContentRepository {
|
|
|
861
880
|
}
|
|
862
881
|
|
|
863
882
|
if (input.scheduledAt !== undefined) {
|
|
864
|
-
updates.scheduled_at = input.scheduledAt;
|
|
883
|
+
updates.scheduled_at = this.normalizeScheduledAt(input.scheduledAt);
|
|
865
884
|
}
|
|
866
885
|
|
|
867
886
|
if (input.authorId !== undefined) {
|
|
@@ -1020,7 +1039,7 @@ export class ContentRepository {
|
|
|
1020
1039
|
liveMetadataChanged = true;
|
|
1021
1040
|
}
|
|
1022
1041
|
if (input.scheduledAt !== undefined) {
|
|
1023
|
-
assignments.push(sql`scheduled_at = ${input.scheduledAt}`);
|
|
1042
|
+
assignments.push(sql`scheduled_at = ${this.normalizeScheduledAt(input.scheduledAt)}`);
|
|
1024
1043
|
liveMetadataChanged = true;
|
|
1025
1044
|
}
|
|
1026
1045
|
if (input.authorId !== undefined) {
|
|
@@ -1129,7 +1148,7 @@ export class ContentRepository {
|
|
|
1129
1148
|
*/
|
|
1130
1149
|
async findTrashed(
|
|
1131
1150
|
type: string,
|
|
1132
|
-
options: Omit<FindManyOptions, "where"> = {},
|
|
1151
|
+
options: Omit<FindManyOptions, "where"> & { where?: { locale?: string } } = {},
|
|
1133
1152
|
): Promise<FindManyResult<ContentItem & { deletedAt: string }>> {
|
|
1134
1153
|
const tableName = getTableName(type);
|
|
1135
1154
|
const limit = Math.min(options.limit || 50, 100);
|
|
@@ -1146,6 +1165,10 @@ export class ContentRepository {
|
|
|
1146
1165
|
.selectAll()
|
|
1147
1166
|
.where("deleted_at" as never, "is not", null);
|
|
1148
1167
|
|
|
1168
|
+
if (options.where?.locale) {
|
|
1169
|
+
query = query.where("locale" as any, "=", options.where.locale);
|
|
1170
|
+
}
|
|
1171
|
+
|
|
1149
1172
|
// Handle cursor pagination — decodeCursor throws on invalid input.
|
|
1150
1173
|
if (options.cursor) {
|
|
1151
1174
|
const { orderValue, id: cursorId } = decodeCursor(options.cursor);
|
|
@@ -1202,14 +1225,19 @@ export class ContentRepository {
|
|
|
1202
1225
|
/**
|
|
1203
1226
|
* Count trashed content items
|
|
1204
1227
|
*/
|
|
1205
|
-
async countTrashed(type: string): Promise<number> {
|
|
1228
|
+
async countTrashed(type: string, options: { locale?: string } = {}): Promise<number> {
|
|
1206
1229
|
const tableName = getTableName(type);
|
|
1207
1230
|
|
|
1208
|
-
|
|
1231
|
+
let query = this.db
|
|
1209
1232
|
.selectFrom(tableName as keyof Database)
|
|
1210
1233
|
.select((eb) => eb.fn.count("id").as("count"))
|
|
1211
|
-
.where("deleted_at" as never, "is not", null)
|
|
1212
|
-
|
|
1234
|
+
.where("deleted_at" as never, "is not", null);
|
|
1235
|
+
|
|
1236
|
+
if (options.locale) {
|
|
1237
|
+
query = query.where("locale" as any, "=", options.locale);
|
|
1238
|
+
}
|
|
1239
|
+
|
|
1240
|
+
const result = await query.executeTakeFirst();
|
|
1213
1241
|
|
|
1214
1242
|
return Number(result?.count || 0);
|
|
1215
1243
|
}
|
|
@@ -1527,10 +1555,11 @@ export class ContentRepository {
|
|
|
1527
1555
|
// transition to 'scheduled' so they aren't visible before the time.
|
|
1528
1556
|
const newStatus = existing.status === "published" ? "published" : "scheduled";
|
|
1529
1557
|
|
|
1558
|
+
// The due query compares ISO strings, so every stored schedule uses the same UTC form.
|
|
1530
1559
|
await sql`
|
|
1531
1560
|
UPDATE ${sql.ref(tableName)}
|
|
1532
1561
|
SET status = ${newStatus},
|
|
1533
|
-
scheduled_at = ${
|
|
1562
|
+
scheduled_at = ${scheduledDate.toISOString()},
|
|
1534
1563
|
updated_at = ${now}
|
|
1535
1564
|
WHERE id = ${id}
|
|
1536
1565
|
AND deleted_at IS NULL
|
|
@@ -1777,6 +1806,7 @@ export class ContentRepository {
|
|
|
1777
1806
|
expectedScheduledAt?: string,
|
|
1778
1807
|
promoteRevision = true,
|
|
1779
1808
|
requireSlug = true,
|
|
1809
|
+
expectedRevision?: ContentRevisionPrecondition,
|
|
1780
1810
|
): Promise<ContentItem> {
|
|
1781
1811
|
const tableName = getTableName(type);
|
|
1782
1812
|
const now = new Date().toISOString();
|
|
@@ -1785,6 +1815,7 @@ export class ContentRepository {
|
|
|
1785
1815
|
if (!existing) {
|
|
1786
1816
|
throw new EmDashValidationError("Content item not found");
|
|
1787
1817
|
}
|
|
1818
|
+
assertRevisionPrecondition(existing, expectedRevision);
|
|
1788
1819
|
if (
|
|
1789
1820
|
requireDue &&
|
|
1790
1821
|
expectedScheduledAt !== undefined &&
|
|
@@ -1829,6 +1860,7 @@ export class ContentRepository {
|
|
|
1829
1860
|
WHERE id = ${id}
|
|
1830
1861
|
AND deleted_at IS NULL
|
|
1831
1862
|
AND version = ${existing.version}
|
|
1863
|
+
AND updated_at = ${existing.updatedAt}
|
|
1832
1864
|
AND status = ${existing.status}
|
|
1833
1865
|
AND ${nullableColumnMatch("live_revision_id", existing.liveRevisionId)}
|
|
1834
1866
|
AND ${nullableColumnMatch("draft_revision_id", existing.draftRevisionId)}
|
|
@@ -1954,6 +1986,7 @@ export class ContentRepository {
|
|
|
1954
1986
|
WHERE id = ${id}
|
|
1955
1987
|
AND deleted_at IS NULL
|
|
1956
1988
|
AND version = ${existing.version}
|
|
1989
|
+
AND updated_at = ${existing.updatedAt}
|
|
1957
1990
|
AND status = ${existing.status}
|
|
1958
1991
|
AND ${nullableColumnMatch("live_revision_id", existing.liveRevisionId)}
|
|
1959
1992
|
AND ${nullableColumnMatch("draft_revision_id", existing.draftRevisionId)}
|
|
@@ -2028,10 +2061,14 @@ export class ContentRepository {
|
|
|
2028
2061
|
/**
|
|
2029
2062
|
* Unpublish content
|
|
2030
2063
|
*
|
|
2031
|
-
* Removes live pointer but preserves draft. If no
|
|
2032
|
-
* creates one from the live version so the content isn't lost.
|
|
2064
|
+
* Removes live pointer but preserves the draft and publication date. If no
|
|
2065
|
+
* draft exists, creates one from the live version so the content isn't lost.
|
|
2033
2066
|
*/
|
|
2034
|
-
async unpublish(
|
|
2067
|
+
async unpublish(
|
|
2068
|
+
type: string,
|
|
2069
|
+
id: string,
|
|
2070
|
+
expectedRevision?: ContentRevisionPrecondition,
|
|
2071
|
+
): Promise<ContentItem> {
|
|
2035
2072
|
const tableName = getTableName(type);
|
|
2036
2073
|
const now = new Date().toISOString();
|
|
2037
2074
|
|
|
@@ -2039,44 +2076,61 @@ export class ContentRepository {
|
|
|
2039
2076
|
if (!existing) {
|
|
2040
2077
|
throw new EmDashValidationError("Content item not found");
|
|
2041
2078
|
}
|
|
2079
|
+
assertRevisionPrecondition(existing, expectedRevision);
|
|
2080
|
+
if (existing.status === "draft" && !existing.liveRevisionId) return existing;
|
|
2042
2081
|
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
|
|
2047
|
-
if (
|
|
2048
|
-
const
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
`.execute(this.db);
|
|
2082
|
+
const revisionRepo = new RevisionRepository(this.db);
|
|
2083
|
+
let provisionalRevisionId: string | null = null;
|
|
2084
|
+
try {
|
|
2085
|
+
let draftRevisionId = existing.draftRevisionId;
|
|
2086
|
+
if (!draftRevisionId && existing.liveRevisionId) {
|
|
2087
|
+
const liveRevision = await revisionRepo.findById(existing.liveRevisionId);
|
|
2088
|
+
if (liveRevision) {
|
|
2089
|
+
const draft = await revisionRepo.create({
|
|
2090
|
+
collection: type,
|
|
2091
|
+
entryId: id,
|
|
2092
|
+
data: liveRevision.data,
|
|
2093
|
+
});
|
|
2094
|
+
draftRevisionId = draft.id;
|
|
2095
|
+
provisionalRevisionId = draft.id;
|
|
2096
|
+
}
|
|
2059
2097
|
}
|
|
2060
|
-
}
|
|
2061
2098
|
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2099
|
+
const result = await sql`
|
|
2100
|
+
UPDATE ${sql.ref(tableName)}
|
|
2101
|
+
SET live_revision_id = NULL,
|
|
2102
|
+
draft_revision_id = ${draftRevisionId},
|
|
2103
|
+
status = 'draft',
|
|
2104
|
+
updated_at = ${now},
|
|
2105
|
+
version = version + 1
|
|
2106
|
+
WHERE id = ${id}
|
|
2107
|
+
AND deleted_at IS NULL
|
|
2108
|
+
AND version = ${existing.version}
|
|
2109
|
+
AND updated_at = ${existing.updatedAt}
|
|
2110
|
+
AND status = ${existing.status}
|
|
2111
|
+
AND ${nullableColumnMatch("live_revision_id", existing.liveRevisionId)}
|
|
2112
|
+
AND ${nullableColumnMatch("draft_revision_id", existing.draftRevisionId)}
|
|
2113
|
+
AND ${nullableColumnMatch("scheduled_at", existing.scheduledAt)}
|
|
2114
|
+
`.execute(this.db);
|
|
2115
|
+
if ((result.numAffectedRows ?? 0n) === 0n) throw new ContentMutationConflictError();
|
|
2071
2116
|
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2117
|
+
invalidateCollectionCache(type);
|
|
2118
|
+
const updated = await this.findById(type, id);
|
|
2119
|
+
if (!updated) throw new Error("Content not found");
|
|
2120
|
+
return updated;
|
|
2121
|
+
} catch (error) {
|
|
2122
|
+
if (provisionalRevisionId) {
|
|
2123
|
+
try {
|
|
2124
|
+
await revisionRepo.deleteIfUnreferenced(type, id, provisionalRevisionId);
|
|
2125
|
+
} catch (cleanupError) {
|
|
2126
|
+
console.error(
|
|
2127
|
+
`[content] Failed to clean up provisional revision ${provisionalRevisionId}:`,
|
|
2128
|
+
cleanupError,
|
|
2129
|
+
);
|
|
2130
|
+
}
|
|
2131
|
+
}
|
|
2132
|
+
throw error;
|
|
2077
2133
|
}
|
|
2078
|
-
|
|
2079
|
-
return updated;
|
|
2080
2134
|
}
|
|
2081
2135
|
|
|
2082
2136
|
/**
|
|
@@ -2143,13 +2197,18 @@ export class ContentRepository {
|
|
|
2143
2197
|
* Clears draft_revision_id. The content table columns already hold the
|
|
2144
2198
|
* published version, so no data sync is needed.
|
|
2145
2199
|
*/
|
|
2146
|
-
async discardDraft(
|
|
2200
|
+
async discardDraft(
|
|
2201
|
+
type: string,
|
|
2202
|
+
id: string,
|
|
2203
|
+
expectedRevision?: ContentRevisionPrecondition,
|
|
2204
|
+
): Promise<ContentItem> {
|
|
2147
2205
|
const tableName = getTableName(type);
|
|
2148
2206
|
|
|
2149
2207
|
const existing = await this.findById(type, id);
|
|
2150
2208
|
if (!existing) {
|
|
2151
2209
|
throw new EmDashValidationError("Content item not found");
|
|
2152
2210
|
}
|
|
2211
|
+
assertRevisionPrecondition(existing, expectedRevision);
|
|
2153
2212
|
|
|
2154
2213
|
if (!existing.draftRevisionId) {
|
|
2155
2214
|
// No draft to discard
|
|
@@ -2159,12 +2218,20 @@ export class ContentRepository {
|
|
|
2159
2218
|
// Discarding a draft restores the state from before the draft was
|
|
2160
2219
|
// staged — nothing about the live entry changed in between, so
|
|
2161
2220
|
// updated_at stays at its pre-draft value (#2143).
|
|
2162
|
-
await sql`
|
|
2221
|
+
const result = await sql`
|
|
2163
2222
|
UPDATE ${sql.ref(tableName)}
|
|
2164
|
-
SET draft_revision_id = NULL
|
|
2223
|
+
SET draft_revision_id = NULL,
|
|
2224
|
+
version = version + 1
|
|
2165
2225
|
WHERE id = ${id}
|
|
2166
2226
|
AND deleted_at IS NULL
|
|
2227
|
+
AND version = ${existing.version}
|
|
2228
|
+
AND updated_at = ${existing.updatedAt}
|
|
2229
|
+
AND status = ${existing.status}
|
|
2230
|
+
AND ${nullableColumnMatch("live_revision_id", existing.liveRevisionId)}
|
|
2231
|
+
AND ${nullableColumnMatch("draft_revision_id", existing.draftRevisionId)}
|
|
2232
|
+
AND ${nullableColumnMatch("scheduled_at", existing.scheduledAt)}
|
|
2167
2233
|
`.execute(this.db);
|
|
2234
|
+
if ((result.numAffectedRows ?? 0n) === 0n) throw new ContentMutationConflictError();
|
|
2168
2235
|
|
|
2169
2236
|
const updated = await this.findById(type, id);
|
|
2170
2237
|
if (!updated) {
|
|
@@ -1801,12 +1801,21 @@ export class MediaUsageRepository {
|
|
|
1801
1801
|
};
|
|
1802
1802
|
}
|
|
1803
1803
|
|
|
1804
|
+
/**
|
|
1805
|
+
* Scans for reclaimable occurrences, or resolves to `null` when the sweep was
|
|
1806
|
+
* never issued because the lease is gone or the tick is out of budget. An
|
|
1807
|
+
* empty array means the scan ran and found nothing, which lets the caller
|
|
1808
|
+
* retire the sweep window; `null` must leave the cursor where it was.
|
|
1809
|
+
*/
|
|
1804
1810
|
async findMediaUsageCleanupCandidates(input: {
|
|
1805
1811
|
cutoff: string;
|
|
1806
1812
|
cursor: MediaUsageCleanupCursor | null;
|
|
1807
1813
|
limit: number;
|
|
1808
1814
|
cleanupLease?: MediaUsageCleanupLease;
|
|
1809
|
-
|
|
1815
|
+
canIssueStatement?: () => boolean;
|
|
1816
|
+
}): Promise<MediaUsageCleanupCandidate[] | null> {
|
|
1817
|
+
if (!(await this.admitCleanupScan(input.cleanupLease, input.canIssueStatement))) return null;
|
|
1818
|
+
|
|
1810
1819
|
let query = this.db
|
|
1811
1820
|
.selectFrom("_emdash_media_usage as u")
|
|
1812
1821
|
.leftJoin("_emdash_media_usage_sources as s", "s.source_key", "u.source_key")
|
|
@@ -1828,19 +1837,11 @@ export class MediaUsageRepository {
|
|
|
1828
1837
|
.orderBy("u.created_at", "asc")
|
|
1829
1838
|
.orderBy("u.id", "asc")
|
|
1830
1839
|
.limit(Math.max(0, Math.floor(input.limit)));
|
|
1831
|
-
if (input.cleanupLease) {
|
|
1832
|
-
query = query.where(this.activeCleanupLeaseExpression(input.cleanupLease));
|
|
1833
|
-
}
|
|
1834
1840
|
|
|
1835
1841
|
if (input.cursor) {
|
|
1842
|
+
const cursor = input.cursor;
|
|
1836
1843
|
query = query.where((eb) =>
|
|
1837
|
-
eb.
|
|
1838
|
-
eb("u.created_at", ">", input.cursor!.createdAt),
|
|
1839
|
-
eb.and([
|
|
1840
|
-
eb("u.created_at", "=", input.cursor!.createdAt),
|
|
1841
|
-
eb("u.id", ">", input.cursor!.id),
|
|
1842
|
-
]),
|
|
1843
|
-
]),
|
|
1844
|
+
eb(eb.refTuple("u.created_at", "u.id"), ">", eb.tuple(cursor.createdAt, cursor.id)),
|
|
1844
1845
|
);
|
|
1845
1846
|
}
|
|
1846
1847
|
|
|
@@ -1928,9 +1929,9 @@ export class MediaUsageRepository {
|
|
|
1928
1929
|
options.canIssueStatement,
|
|
1929
1930
|
);
|
|
1930
1931
|
}
|
|
1931
|
-
if (!
|
|
1932
|
+
if (!(await this.admitCleanupScan(options.cleanupLease, options.canIssueStatement))) return 0;
|
|
1932
1933
|
|
|
1933
|
-
|
|
1934
|
+
const rows = await this.db
|
|
1934
1935
|
.selectFrom("_emdash_media_usage as u")
|
|
1935
1936
|
.leftJoin("_emdash_media_usage_sources as s", (join) =>
|
|
1936
1937
|
join.onRef("s.source_key", "=", "u.source_key"),
|
|
@@ -1946,11 +1947,8 @@ export class MediaUsageRepository {
|
|
|
1946
1947
|
.where(this.noActiveGenerationWriteExpression("u"))
|
|
1947
1948
|
.orderBy("u.created_at", "asc")
|
|
1948
1949
|
.orderBy("u.id", "asc")
|
|
1949
|
-
.limit(batchLimit)
|
|
1950
|
-
|
|
1951
|
-
query = query.where(this.activeCleanupLeaseExpression(options.cleanupLease));
|
|
1952
|
-
}
|
|
1953
|
-
const rows = await query.execute();
|
|
1950
|
+
.limit(batchLimit)
|
|
1951
|
+
.execute();
|
|
1954
1952
|
|
|
1955
1953
|
return this.deleteOrphanCandidateIds(
|
|
1956
1954
|
rows.map((row) => row.id),
|
|
@@ -1975,9 +1973,9 @@ export class MediaUsageRepository {
|
|
|
1975
1973
|
options.canIssueStatement,
|
|
1976
1974
|
);
|
|
1977
1975
|
}
|
|
1978
|
-
if (!
|
|
1976
|
+
if (!(await this.admitCleanupScan(options.cleanupLease, options.canIssueStatement))) return 0;
|
|
1979
1977
|
|
|
1980
|
-
|
|
1978
|
+
const rows = await this.db
|
|
1981
1979
|
.selectFrom("_emdash_media_usage as u")
|
|
1982
1980
|
.innerJoin("_emdash_media_usage_sources as s", (join) =>
|
|
1983
1981
|
join.onRef("s.source_key", "=", "u.source_key"),
|
|
@@ -1994,11 +1992,8 @@ export class MediaUsageRepository {
|
|
|
1994
1992
|
.where(this.noActiveGenerationWriteExpression("u"))
|
|
1995
1993
|
.orderBy("u.created_at", "asc")
|
|
1996
1994
|
.orderBy("u.id", "asc")
|
|
1997
|
-
.limit(batchLimit)
|
|
1998
|
-
|
|
1999
|
-
query = query.where(this.activeCleanupLeaseExpression(options.cleanupLease));
|
|
2000
|
-
}
|
|
2001
|
-
const rows = await query.execute();
|
|
1995
|
+
.limit(batchLimit)
|
|
1996
|
+
.execute();
|
|
2002
1997
|
|
|
2003
1998
|
return this.deleteStaleCandidateIds(
|
|
2004
1999
|
rows.map((row) => row.id),
|
|
@@ -2023,9 +2018,9 @@ export class MediaUsageRepository {
|
|
|
2023
2018
|
options.canIssueStatement,
|
|
2024
2019
|
);
|
|
2025
2020
|
}
|
|
2026
|
-
if (!
|
|
2021
|
+
if (!(await this.admitCleanupScan(options.cleanupLease, options.canIssueStatement))) return 0;
|
|
2027
2022
|
|
|
2028
|
-
|
|
2023
|
+
const rows = await this.db
|
|
2029
2024
|
.selectFrom("_emdash_media_usage as u")
|
|
2030
2025
|
.innerJoin("_emdash_media_usage_sources as s", (join) =>
|
|
2031
2026
|
join.onRef("s.source_key", "=", "u.source_key"),
|
|
@@ -2042,11 +2037,8 @@ export class MediaUsageRepository {
|
|
|
2042
2037
|
.where(this.noActiveGenerationWriteExpression("u"))
|
|
2043
2038
|
.orderBy("u.created_at", "asc")
|
|
2044
2039
|
.orderBy("u.id", "asc")
|
|
2045
|
-
.limit(batchLimit)
|
|
2046
|
-
|
|
2047
|
-
query = query.where(this.activeCleanupLeaseExpression(options.cleanupLease));
|
|
2048
|
-
}
|
|
2049
|
-
const rows = await query.execute();
|
|
2040
|
+
.limit(batchLimit)
|
|
2041
|
+
.execute();
|
|
2050
2042
|
|
|
2051
2043
|
return this.deleteAbandonedCandidateIds(
|
|
2052
2044
|
rows.map((row) => row.id),
|
|
@@ -2062,16 +2054,16 @@ export class MediaUsageRepository {
|
|
|
2062
2054
|
canIssueStatement?: () => boolean,
|
|
2063
2055
|
): Promise<number> {
|
|
2064
2056
|
const batchLimit = Math.floor(limit);
|
|
2065
|
-
if (batchLimit <= 0
|
|
2066
|
-
|
|
2057
|
+
if (batchLimit <= 0) return 0;
|
|
2058
|
+
if (!(await this.admitCleanupScan(cleanupLease, canIssueStatement))) return 0;
|
|
2059
|
+
const rows = await this.db
|
|
2067
2060
|
.selectFrom("_emdash_media_usage_generation_writes")
|
|
2068
2061
|
.select("lease_token")
|
|
2069
2062
|
.where(this.generationWriteLeaseHasExpired("expires_at"))
|
|
2070
2063
|
.orderBy("expires_at", "asc")
|
|
2071
2064
|
.orderBy("lease_token", "asc")
|
|
2072
|
-
.limit(batchLimit)
|
|
2073
|
-
|
|
2074
|
-
const rows = await query.execute();
|
|
2065
|
+
.limit(batchLimit)
|
|
2066
|
+
.execute();
|
|
2075
2067
|
if (rows.length === 0 || !canIssueCleanupStatement(canIssueStatement)) return 0;
|
|
2076
2068
|
let deleteQuery = this.db
|
|
2077
2069
|
.deleteFrom("_emdash_media_usage_generation_writes")
|
|
@@ -2906,6 +2898,43 @@ export class MediaUsageRepository {
|
|
|
2906
2898
|
)`;
|
|
2907
2899
|
}
|
|
2908
2900
|
|
|
2901
|
+
/**
|
|
2902
|
+
* Gates a bounded cleanup scan on the lease and the tick's statement budget.
|
|
2903
|
+
*
|
|
2904
|
+
* The budget is re-read after the lease row because that read is itself a
|
|
2905
|
+
* statement: an isolate suspended across it can resume with the budget spent.
|
|
2906
|
+
*/
|
|
2907
|
+
private async admitCleanupScan(
|
|
2908
|
+
cleanupLease: MediaUsageCleanupLease | undefined,
|
|
2909
|
+
canIssueStatement: (() => boolean) | undefined,
|
|
2910
|
+
): Promise<boolean> {
|
|
2911
|
+
if (!canIssueCleanupStatement(canIssueStatement)) return false;
|
|
2912
|
+
if (!cleanupLease) return true;
|
|
2913
|
+
return (
|
|
2914
|
+
(await this.holdsCleanupLease(cleanupLease)) && canIssueCleanupStatement(canIssueStatement)
|
|
2915
|
+
);
|
|
2916
|
+
}
|
|
2917
|
+
|
|
2918
|
+
/**
|
|
2919
|
+
* Reads the lease row on its own so a lost lease can short-circuit a sweep.
|
|
2920
|
+
*
|
|
2921
|
+
* As a row-level `EXISTS` inside a `LIMIT`ed scan this predicate is constant
|
|
2922
|
+
* across every candidate row: when it is false the limit is unreachable and
|
|
2923
|
+
* the scan reads the whole `created_at` range before returning nothing.
|
|
2924
|
+
* Mutating statements still carry {@link activeCleanupLeaseExpression},
|
|
2925
|
+
* which is what actually fences a displaced owner.
|
|
2926
|
+
*/
|
|
2927
|
+
private async holdsCleanupLease(cleanupLease: MediaUsageCleanupLease): Promise<boolean> {
|
|
2928
|
+
let query = this.db
|
|
2929
|
+
.selectFrom("_emdash_media_usage_cleanup")
|
|
2930
|
+
.select("task_key")
|
|
2931
|
+
.where("task_key", "=", "projection_gc")
|
|
2932
|
+
.where("lease_token", "=", cleanupLease.leaseToken)
|
|
2933
|
+
.where(this.cleanupLeaseExpiryIsInFuture("_emdash_media_usage_cleanup.lease_expires_at"));
|
|
2934
|
+
if (isPostgres(this.db)) query = query.forUpdate();
|
|
2935
|
+
return (await query.executeTakeFirst()) !== undefined;
|
|
2936
|
+
}
|
|
2937
|
+
|
|
2909
2938
|
private activeCleanupLeaseExpression(cleanupLease: MediaUsageCleanupLease) {
|
|
2910
2939
|
const rowLock = isPostgres(this.db) ? sql` FOR UPDATE` : sql``;
|
|
2911
2940
|
return sql<boolean>`EXISTS (
|
|
@@ -83,6 +83,7 @@ export interface CreateMediaInput {
|
|
|
83
83
|
dominantColor?: string;
|
|
84
84
|
status?: MediaStatus;
|
|
85
85
|
authorId?: string;
|
|
86
|
+
folderId?: string | null;
|
|
86
87
|
}
|
|
87
88
|
|
|
88
89
|
export interface FindManyMediaOptions {
|
|
@@ -105,6 +106,13 @@ export interface UpdateMediaInput extends FocalPointUpdate {
|
|
|
105
106
|
folderId?: string | null;
|
|
106
107
|
}
|
|
107
108
|
|
|
109
|
+
export interface ReplaceReadyMediaInput {
|
|
110
|
+
size: number;
|
|
111
|
+
width: number;
|
|
112
|
+
height: number;
|
|
113
|
+
contentHash: string;
|
|
114
|
+
}
|
|
115
|
+
|
|
108
116
|
export interface FindMediaPageOptions extends Omit<FindManyMediaOptions, "cursor"> {
|
|
109
117
|
page: number;
|
|
110
118
|
}
|
|
@@ -148,7 +156,7 @@ export class MediaRepository {
|
|
|
148
156
|
status: input.status ?? "ready",
|
|
149
157
|
created_at: now,
|
|
150
158
|
author_id: input.authorId ?? null,
|
|
151
|
-
folder_id: null,
|
|
159
|
+
folder_id: input.folderId ?? null,
|
|
152
160
|
};
|
|
153
161
|
|
|
154
162
|
await this.db.insertInto("media").values(row).execute();
|
|
@@ -166,6 +174,7 @@ export class MediaRepository {
|
|
|
166
174
|
storageKey: string;
|
|
167
175
|
contentHash?: string;
|
|
168
176
|
authorId?: string;
|
|
177
|
+
folderId?: string | null;
|
|
169
178
|
}): Promise<MediaItem> {
|
|
170
179
|
return this.create({
|
|
171
180
|
...input,
|
|
@@ -375,6 +384,30 @@ export class MediaRepository {
|
|
|
375
384
|
return row ? this.rowToItem(row) : null;
|
|
376
385
|
}
|
|
377
386
|
|
|
387
|
+
async findAvailableFilename(filename: string): Promise<string> {
|
|
388
|
+
const exists = async (candidate: string) =>
|
|
389
|
+
Boolean(
|
|
390
|
+
await this.db
|
|
391
|
+
.selectFrom("media")
|
|
392
|
+
.select("id")
|
|
393
|
+
.where(sql<string>`lower(filename)`, "=", candidate.toLowerCase())
|
|
394
|
+
.executeTakeFirst(),
|
|
395
|
+
);
|
|
396
|
+
if (!(await exists(filename))) return filename;
|
|
397
|
+
|
|
398
|
+
const extensionIndex = filename.lastIndexOf(".");
|
|
399
|
+
const hasExtension = extensionIndex > 0;
|
|
400
|
+
const extension = hasExtension ? filename.slice(extensionIndex) : "";
|
|
401
|
+
const stem = hasExtension ? filename.slice(0, extensionIndex) : filename;
|
|
402
|
+
let copyNumber = 2;
|
|
403
|
+
let candidate = `${stem}-${copyNumber}${extension}`;
|
|
404
|
+
while (await exists(candidate)) {
|
|
405
|
+
copyNumber += 1;
|
|
406
|
+
candidate = `${stem}-${copyNumber}${extension}`;
|
|
407
|
+
}
|
|
408
|
+
return candidate;
|
|
409
|
+
}
|
|
410
|
+
|
|
378
411
|
/**
|
|
379
412
|
* Find media by content hash
|
|
380
413
|
* Used for deduplication - same content = same hash
|
|
@@ -480,6 +513,32 @@ export class MediaRepository {
|
|
|
480
513
|
return this.findById(id);
|
|
481
514
|
}
|
|
482
515
|
|
|
516
|
+
async replaceReadyFile(
|
|
517
|
+
id: string,
|
|
518
|
+
expectedStorageKey: string,
|
|
519
|
+
input: ReplaceReadyMediaInput,
|
|
520
|
+
): Promise<MediaItem | null> {
|
|
521
|
+
const row = await this.db
|
|
522
|
+
.updateTable("media")
|
|
523
|
+
.set({
|
|
524
|
+
size: input.size,
|
|
525
|
+
width: input.width,
|
|
526
|
+
height: input.height,
|
|
527
|
+
content_hash: input.contentHash,
|
|
528
|
+
blurhash: null,
|
|
529
|
+
dominant_color: null,
|
|
530
|
+
focal_x: null,
|
|
531
|
+
focal_y: null,
|
|
532
|
+
})
|
|
533
|
+
.where("id", "=", id)
|
|
534
|
+
.where("status", "=", "ready")
|
|
535
|
+
.where("storage_key", "=", expectedStorageKey)
|
|
536
|
+
.returningAll()
|
|
537
|
+
.executeTakeFirst();
|
|
538
|
+
|
|
539
|
+
return row ? this.rowToItem(row) : null;
|
|
540
|
+
}
|
|
541
|
+
|
|
483
542
|
/**
|
|
484
543
|
* Delete media item
|
|
485
544
|
*/
|