emdash 0.33.0 → 0.34.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-BMyNSSZi.d.mts → adapters-34EN2eXO.d.mts} +26 -2
- package/dist/adapters-34EN2eXO.d.mts.map +1 -0
- package/dist/{allowed-origins-CG1pACtS.mjs → allowed-origins-DW7sYyqg.mjs} +2 -2
- package/dist/{allowed-origins-CG1pACtS.mjs.map → allowed-origins-DW7sYyqg.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -3
- package/dist/api/route-utils.mjs +22 -21
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +6 -5
- package/dist/{api-D2hunekQ.mjs → api-DdAsirBe.mjs} +98 -407
- package/dist/api-DdAsirBe.mjs.map +1 -0
- package/dist/{api-tokens-CSND0i1z.mjs → api-tokens-CFXu8F_2.mjs} +2 -2
- package/dist/{api-tokens-CSND0i1z.mjs.map → api-tokens-CFXu8F_2.mjs.map} +1 -1
- package/dist/{apply-kwNEJW2l.mjs → apply-D5zfeD09.mjs} +131 -107
- package/dist/apply-D5zfeD09.mjs.map +1 -0
- package/dist/astro/index.d.mts +12 -12
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +93 -35
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +10 -10
- package/dist/astro/middleware/auth.mjs +8 -8
- package/dist/astro/middleware/media-usage-write-fence.d.mts +7 -0
- package/dist/astro/middleware/media-usage-write-fence.d.mts.map +1 -0
- package/dist/astro/middleware/media-usage-write-fence.mjs +35 -0
- package/dist/astro/middleware/media-usage-write-fence.mjs.map +1 -0
- package/dist/astro/middleware/redirect.d.mts.map +1 -1
- package/dist/astro/middleware/redirect.mjs +10 -7
- package/dist/astro/middleware/redirect.mjs.map +1 -1
- package/dist/astro/middleware/request-context.mjs +3 -3
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +12 -11
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +1677 -156
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +9 -8
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +9 -8
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +6 -6
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +6 -6
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +12 -11
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +12 -11
- package/dist/astro/routes/api/admin/byline-fields/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +12 -11
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +17 -17
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +17 -17
- package/dist/astro/routes/api/admin/bylines/index.mjs +17 -17
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +14 -13
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/comments/bulk.mjs +12 -11
- package/dist/astro/routes/api/admin/comments/bulk.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/counts.mjs +6 -6
- package/dist/astro/routes/api/admin/comments/index.mjs +12 -11
- package/dist/astro/routes/api/admin/comments/index.mjs.map +1 -1
- 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/collection-deletions/index.d.mts +8 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +36 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.d.mts +8 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +36 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +15 -14
- package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/work/index.d.mts +8 -0
- package/dist/astro/routes/api/admin/media-usage/work/index.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +37 -0
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/work/retry.d.mts +8 -0
- package/dist/astro/routes/api/admin/media-usage/work/retry.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +37 -0
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs.map +1 -0
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +5 -5
- package/dist/astro/routes/api/admin/plugins/_id_/disable.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +51 -43
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +51 -43
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +47 -42
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +6 -6
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +47 -42
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +50 -42
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +50 -42
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +47 -42
- 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 +47 -42
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +50 -42
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +47 -42
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +50 -42
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
- 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 +51 -43
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +47 -42
- 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 +51 -43
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +47 -42
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +47 -42
- 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 +47 -42
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +3 -3
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +3 -3
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +9 -8
- package/dist/astro/routes/api/admin/users/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +4 -4
- package/dist/astro/routes/api/admin/users/index.mjs +9 -8
- package/dist/astro/routes/api/admin/users/index.mjs.map +1 -1
- package/dist/astro/routes/api/auth/dev-bypass.mjs +7 -7
- package/dist/astro/routes/api/auth/invite/accept.mjs +3 -3
- package/dist/astro/routes/api/auth/invite/complete.mjs +13 -12
- package/dist/astro/routes/api/auth/invite/complete.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/index.mjs +10 -9
- package/dist/astro/routes/api/auth/invite/index.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/register-options.mjs +12 -11
- package/dist/astro/routes/api/auth/invite/register-options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/logout.mjs +4 -4
- package/dist/astro/routes/api/auth/magic-link/send.mjs +12 -11
- package/dist/astro/routes/api/auth/magic-link/send.mjs.map +1 -1
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +4 -4
- package/dist/astro/routes/api/auth/me.mjs +10 -9
- package/dist/astro/routes/api/auth/me.mjs.map +1 -1
- package/dist/astro/routes/api/auth/mode.mjs +4 -4
- 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 +9 -8
- package/dist/astro/routes/api/auth/passkey/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/index.mjs +3 -3
- package/dist/astro/routes/api/auth/passkey/options.mjs +14 -13
- package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +12 -11
- package/dist/astro/routes/api/auth/passkey/register/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +13 -12
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/verify.mjs +13 -12
- package/dist/astro/routes/api/auth/passkey/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/complete.mjs +13 -12
- package/dist/astro/routes/api/auth/signup/complete.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/request.mjs +12 -11
- package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/verify.mjs +3 -3
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +15 -14
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs.map +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +14 -13
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +13 -13
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +11 -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 +18 -17
- 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 +18 -17
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +11 -10
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
- 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 +44 -31
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +11 -10
- package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/authors.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/index.mjs +11 -10
- package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/trash.mjs +10 -9
- package/dist/astro/routes/api/content/_collection_/trash.mjs.map +1 -1
- package/dist/astro/routes/api/dashboard.mjs +10 -8
- package/dist/astro/routes/api/dashboard.mjs.map +1 -1
- package/dist/astro/routes/api/dev/emails.mjs +4 -4
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +18 -16
- package/dist/astro/routes/api/import/probe.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +5 -5
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/execute.mjs +15 -15
- package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -10
- package/dist/astro/routes/api/import/wordpress/media.mjs +14 -12
- package/dist/astro/routes/api/import/wordpress/media.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +13 -12
- package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +14 -14
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +18 -16
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +28 -27
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
- package/dist/astro/routes/api/manifest.mjs +5 -5
- package/dist/astro/routes/api/mcp.d.mts.map +1 -1
- package/dist/astro/routes/api/mcp.mjs +174 -72
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +13 -11
- package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/upload.mjs +6 -6
- package/dist/astro/routes/api/media/_id_/usage.mjs +17 -16
- package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_.mjs +16 -15
- package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/media/file/_...key_.mjs +3 -3
- 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 +11 -10
- package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
- package/dist/astro/routes/api/media.mjs +18 -15
- package/dist/astro/routes/api/media.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +11 -11
- package/dist/astro/routes/api/menus/_name_/items.mjs +11 -11
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +11 -11
- package/dist/astro/routes/api/menus/_name_/translations.mjs +11 -11
- package/dist/astro/routes/api/menus/_name_.mjs +11 -11
- package/dist/astro/routes/api/menus/index.mjs +11 -11
- package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/authorize.mjs +7 -7
- package/dist/astro/routes/api/oauth/device/code.mjs +10 -10
- package/dist/astro/routes/api/oauth/device/token.mjs +9 -9
- package/dist/astro/routes/api/oauth/register.mjs +4 -4
- package/dist/astro/routes/api/oauth/token/refresh.mjs +7 -7
- package/dist/astro/routes/api/oauth/token/revoke.mjs +7 -7
- package/dist/astro/routes/api/oauth/token.mjs +7 -7
- package/dist/astro/routes/api/openapi.json.mjs +152 -6
- package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.d.mts.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +8 -7
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/index.mjs +12 -11
- package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/summary.mjs +12 -11
- package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/_id_.mjs +13 -12
- package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/index.mjs +13 -12
- package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/index.mjs +18 -17
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/translations.mjs +13 -12
- package/dist/astro/routes/api/relations/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/relations/index.mjs +18 -17
- 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 +5 -5
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +47 -42
- 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 +47 -42
- 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 +47 -42
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.d.mts.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +47 -42
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +47 -42
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/reorder.mjs +47 -42
- package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +10 -9
- package/dist/astro/routes/api/schema/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +47 -42
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +47 -42
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +13 -13
- package/dist/astro/routes/api/search/index.mjs +12 -12
- package/dist/astro/routes/api/search/rebuild.mjs +13 -13
- package/dist/astro/routes/api/search/stats.mjs +8 -8
- package/dist/astro/routes/api/search/suggest.mjs +12 -12
- package/dist/astro/routes/api/sections/_slug_.mjs +12 -11
- package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/sections/index.mjs +12 -11
- 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 +6 -6
- package/dist/astro/routes/api/settings/backups/export.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/index.mjs +8 -8
- package/dist/astro/routes/api/settings/email.mjs +5 -5
- package/dist/astro/routes/api/settings.mjs +14 -13
- package/dist/astro/routes/api/settings.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin-verify.mjs +14 -13
- package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin.mjs +13 -12
- package/dist/astro/routes/api/setup/admin.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-bypass.mjs +30 -28
- 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 +32 -30
- package/dist/astro/routes/api/setup/index.mjs.map +1 -1
- package/dist/astro/routes/api/setup/status.mjs +5 -5
- package/dist/astro/routes/api/snapshot.mjs +8 -8
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +16 -15
- 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 +18 -16
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/translations.d.mts +8 -0
- package/dist/astro/routes/api/taxonomies/_name_/translations.d.mts.map +1 -0
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +46 -0
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs.map +1 -0
- package/dist/astro/routes/api/taxonomies/_name_.d.mts +19 -0
- package/dist/astro/routes/api/taxonomies/_name_.d.mts.map +1 -0
- package/dist/astro/routes/api/taxonomies/_name_.mjs +88 -0
- package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -0
- package/dist/astro/routes/api/taxonomies/index.mjs +16 -15
- 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 +6 -6
- package/dist/astro/routes/api/well-known/auth.mjs +1 -1
- package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
- package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +10 -9
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +12 -11
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +12 -11
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.mjs +7 -6
- package/dist/astro/routes/api/widget-areas/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/index.mjs +12 -11
- package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
- package/dist/astro/routes/api/widget-components.mjs +4 -4
- package/dist/astro/routes/robots.txt.mjs +7 -6
- package/dist/astro/routes/robots.txt.mjs.map +1 -1
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +10 -10
- package/dist/astro/routes/sitemap.xml.mjs +8 -7
- package/dist/astro/routes/sitemap.xml.mjs.map +1 -1
- package/dist/astro/types.d.mts +35 -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-qRhWQnel.mjs → authorize-1iFJzPaZ.mjs} +2 -2
- package/dist/{authorize-qRhWQnel.mjs.map → authorize-1iFJzPaZ.mjs.map} +1 -1
- package/dist/{backup-CtA6LDNw.mjs → backup-LHjIAVNP.mjs} +4 -4
- package/dist/{backup-CtA6LDNw.mjs.map → backup-LHjIAVNP.mjs.map} +1 -1
- package/dist/{base64-B-PsqheR.mjs → base64-CvLhUKQv.mjs} +1 -1
- package/dist/{base64-B-PsqheR.mjs.map → base64-CvLhUKQv.mjs.map} +1 -1
- package/dist/bundle-CBEXrBnb.mjs +663 -0
- package/dist/bundle-CBEXrBnb.mjs.map +1 -0
- package/dist/{byline-fields-CNc0Yq5i.mjs → byline-fields-C5S8wygO.mjs} +2 -2
- package/dist/{byline-fields-CNc0Yq5i.mjs.map → byline-fields-C5S8wygO.mjs.map} +1 -1
- package/dist/{byline-Cp6csL84.mjs → byline-pEcoDps8.mjs} +5 -5
- package/dist/{byline-Cp6csL84.mjs.map → byline-pEcoDps8.mjs.map} +1 -1
- package/dist/{byline-registry-ZkPKqEwC.mjs → byline-registry-DDun8sxh.mjs} +2 -2
- package/dist/{byline-registry-ZkPKqEwC.mjs.map → byline-registry-DDun8sxh.mjs.map} +1 -1
- package/dist/{bylines-CEj5CdT4.mjs → bylines-BWemdX2k.mjs} +7 -7
- package/dist/{bylines-CEj5CdT4.mjs.map → bylines-BWemdX2k.mjs.map} +1 -1
- package/dist/{bylines-cf-C9lmF.mjs → bylines-DJfSfXCL.mjs} +5 -5
- package/dist/{bylines-cf-C9lmF.mjs.map → bylines-DJfSfXCL.mjs.map} +1 -1
- package/dist/{cache-C9FptTFR.mjs → cache-CBJaDy_E.mjs} +3 -3
- package/dist/{cache-C9FptTFR.mjs.map → cache-CBJaDy_E.mjs.map} +1 -1
- package/dist/{challenge-store-D9VNKELo.mjs → challenge-store-CZyFVaad.mjs} +1 -1
- package/dist/{challenge-store-D9VNKELo.mjs.map → challenge-store-CZyFVaad.mjs.map} +1 -1
- package/dist/{chunks-DbYzib_k.mjs → chunks-DfPax1I0.mjs} +2 -2
- package/dist/{chunks-DbYzib_k.mjs.map → chunks-DfPax1I0.mjs.map} +1 -1
- package/dist/cli/index.mjs +176 -698
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +74 -4
- package/dist/client/index.d.mts.map +1 -1
- package/dist/client/index.mjs +25 -2
- package/dist/client/index.mjs.map +1 -1
- package/dist/collection-deletion-C8BugSGz.mjs +779 -0
- package/dist/collection-deletion-C8BugSGz.mjs.map +1 -0
- package/dist/{comment-BIkJ6Fil.mjs → comment-Dxlep6cE.mjs} +2 -2
- package/dist/{comment-BIkJ6Fil.mjs.map → comment-Dxlep6cE.mjs.map} +1 -1
- package/dist/{comment-reaction-D-laEceb.mjs → comment-reaction-D6qfHKBc.mjs} +2 -2
- package/dist/{comment-reaction-D-laEceb.mjs.map → comment-reaction-D6qfHKBc.mjs.map} +1 -1
- package/dist/{comments-0_w6KChA.mjs → comments-CTOuhTSX.mjs} +3 -3
- package/dist/{comments-0_w6KChA.mjs.map → comments-CTOuhTSX.mjs.map} +1 -1
- package/dist/{components-BPxrRjpE.mjs → components-CQy3lh9x.mjs} +1 -1
- package/dist/{components-BPxrRjpE.mjs.map → components-CQy3lh9x.mjs.map} +1 -1
- package/dist/{config-DyF3OKg_.mjs → config-C3EBstHi.mjs} +18 -2
- package/dist/config-C3EBstHi.mjs.map +1 -0
- package/dist/{content-CJ94NEx5.mjs → content-BNfwh7xX.mjs} +509 -78
- package/dist/content-BNfwh7xX.mjs.map +1 -0
- package/dist/content-list-query-DhQ84eVV.d.mts +26 -0
- package/dist/content-list-query-DhQ84eVV.d.mts.map +1 -0
- package/dist/content-refresh-DNERP4-f.mjs +2560 -0
- package/dist/content-refresh-DNERP4-f.mjs.map +1 -0
- package/dist/{context-C_1nrqnW.mjs → context-DRgOvSnW.mjs} +25 -17
- package/dist/context-DRgOvSnW.mjs.map +1 -0
- package/dist/{cron-DRV-UC4K.mjs → cron-Y9aLtgrA.mjs} +1 -1
- package/dist/{cron-DRV-UC4K.mjs.map → cron-Y9aLtgrA.mjs.map} +1 -1
- package/dist/{dashboard-DINnNVVU.mjs → dashboard-CB8J89rJ.mjs} +44 -10
- package/dist/dashboard-CB8J89rJ.mjs.map +1 -0
- package/dist/db/index.d.mts +4 -4
- package/dist/db/index.mjs +2 -2
- package/dist/db/index.mjs.map +1 -1
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/{db-errors-CcWLaRiR.mjs → db-errors-Cl-sKYTm.mjs} +1 -1
- package/dist/{db-errors-CcWLaRiR.mjs.map → db-errors-Cl-sKYTm.mjs.map} +1 -1
- package/dist/{default-BD2FG0xV.mjs → default-DdDl3fxv.mjs} +1 -1
- package/dist/{default-BD2FG0xV.mjs.map → default-DdDl3fxv.mjs.map} +1 -1
- package/dist/{deferred-tasks-C-WRCcKo.d.mts → deferred-tasks-BMsa9F64.d.mts} +1 -1
- package/dist/{deferred-tasks-C-WRCcKo.d.mts.map → deferred-tasks-BMsa9F64.d.mts.map} +1 -1
- package/dist/{device-flow-CTqd8mud.mjs → device-flow-CaioYGK3.mjs} +4 -4
- package/dist/{device-flow-CTqd8mud.mjs.map → device-flow-CaioYGK3.mjs.map} +1 -1
- package/dist/dist-D_6CKR8z.mjs +810 -0
- package/dist/dist-D_6CKR8z.mjs.map +1 -0
- package/dist/{email-console-C6WdcWbL.mjs → email-console-BHNjIwiB.mjs} +1 -1
- package/dist/{email-console-C6WdcWbL.mjs.map → email-console-BHNjIwiB.mjs.map} +1 -1
- package/dist/{enrich-CFJJgxs_.mjs → enrich-_ySMEvEE.mjs} +2 -2
- package/dist/{enrich-CFJJgxs_.mjs.map → enrich-_ySMEvEE.mjs.map} +1 -1
- package/dist/{error-oh_9i6bR.mjs → error-DupyJZE2.mjs} +3 -3
- package/dist/{error-oh_9i6bR.mjs.map → error-DupyJZE2.mjs.map} +1 -1
- package/dist/{errors-BucQ8VYz.mjs → errors-CLUPm7aD.mjs} +14 -2
- package/dist/errors-CLUPm7aD.mjs.map +1 -0
- package/dist/{escape-CXps5F_v.mjs → escape-C_aLKP3H.mjs} +1 -1
- package/dist/{escape-CXps5F_v.mjs.map → escape-C_aLKP3H.mjs.map} +1 -1
- package/dist/{field-defs-cache-WD82dMQq.mjs → field-defs-cache-hg6QkjV9.mjs} +4 -4
- package/dist/{field-defs-cache-WD82dMQq.mjs.map → field-defs-cache-hg6QkjV9.mjs.map} +1 -1
- package/dist/{fts-manager-BITakW_R.mjs → fts-manager-CZ-5dVwJ.mjs} +76 -50
- package/dist/fts-manager-CZ-5dVwJ.mjs.map +1 -0
- package/dist/{hreflang-BaLCNcDx.d.mts → hreflang-D3Uehfv2.d.mts} +2 -2
- package/dist/{hreflang-BaLCNcDx.d.mts.map → hreflang-D3Uehfv2.d.mts.map} +1 -1
- package/dist/{hreflang-BdZuVBhL.mjs → hreflang-DNswoYsi.mjs} +7 -7
- package/dist/{hreflang-BdZuVBhL.mjs.map → hreflang-DNswoYsi.mjs.map} +1 -1
- package/dist/{import-C-9uqyT3.mjs → import-B41u8Rot.mjs} +5 -5
- package/dist/{import-C-9uqyT3.mjs.map → import-B41u8Rot.mjs.map} +1 -1
- package/dist/{index-M37iz29I.d.mts → index-C3Y-rsyN.d.mts} +226 -73
- package/dist/index-C3Y-rsyN.d.mts.map +1 -0
- package/dist/{index-MGw47uWq.d.mts → index-Cof4-Fab.d.mts} +5 -10
- package/dist/index-Cof4-Fab.d.mts.map +1 -0
- package/dist/index.d.mts +20 -19
- package/dist/index.mjs +73 -67
- package/dist/{init-lock-DJkX6Hto.mjs → init-lock-6b309ZrF.mjs} +1 -1
- package/dist/{init-lock-DJkX6Hto.mjs.map → init-lock-6b309ZrF.mjs.map} +1 -1
- package/dist/{load-DV1DZuUJ.mjs → load-DmvJrtxS.mjs} +2 -2
- package/dist/{load-DV1DZuUJ.mjs.map → load-DmvJrtxS.mjs.map} +1 -1
- package/dist/{loader-CGugY7Zl.mjs → loader-DLBqRiGP.mjs} +95 -53
- package/dist/loader-DLBqRiGP.mjs.map +1 -0
- package/dist/{manifest-schema-Da7kj23y.mjs → manifest-schema-BXbUAHod.mjs} +1 -1
- package/dist/{manifest-schema-Da7kj23y.mjs.map → manifest-schema-BXbUAHod.mjs.map} +1 -1
- package/dist/media/image-endpoint.mjs +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +3 -2
- package/dist/media/index.mjs.map +1 -1
- package/dist/media/local-runtime.d.mts +12 -12
- package/dist/media/local-runtime.mjs +6 -5
- package/dist/media/local-runtime.mjs.map +1 -1
- package/dist/{media-OhYL-7Io.mjs → media-BWWWb8kg.mjs} +92 -3
- package/dist/media-BWWWb8kg.mjs.map +1 -0
- package/dist/{media-BP7S-nHT.mjs → media-CzhAn2--.mjs} +2 -2
- package/dist/{media-BP7S-nHT.mjs.map → media-CzhAn2--.mjs.map} +1 -1
- package/dist/{media-allowlist-D-peH1H5.mjs → media-allowlist-BD6HhgXA.mjs} +14 -3
- package/dist/media-allowlist-BD6HhgXA.mjs.map +1 -0
- package/dist/{media-upload-DtrwU2B0.mjs → media-upload-9yas9zGH.mjs} +10 -8
- package/dist/{media-upload-DtrwU2B0.mjs.map → media-upload-9yas9zGH.mjs.map} +1 -1
- package/dist/{media-url-DYs_YLOx.mjs → media-url-BvoX88FA.mjs} +1 -1
- package/dist/{media-url-DYs_YLOx.mjs.map → media-url-BvoX88FA.mjs.map} +1 -1
- package/dist/{media-usage-BlxfTkN0.mjs → media-usage-De3qvwjc.mjs} +137 -60
- package/dist/media-usage-De3qvwjc.mjs.map +1 -0
- package/dist/media-usage-work-B9Bksh_b.mjs +152 -0
- package/dist/media-usage-work-B9Bksh_b.mjs.map +1 -0
- package/dist/media-usage-work-DrCbqBcl.mjs +424 -0
- package/dist/media-usage-work-DrCbqBcl.mjs.map +1 -0
- package/dist/media-usage-write-fence-aHEgN1zB.mjs +42 -0
- package/dist/media-usage-write-fence-aHEgN1zB.mjs.map +1 -0
- package/dist/{menus-Y54RDPIN.mjs → menus-CC-yn1F9.mjs} +351 -95
- package/dist/menus-CC-yn1F9.mjs.map +1 -0
- package/dist/{menus-BcQWxeXu.mjs → menus-fxvEDYE6.mjs} +3 -3
- package/dist/{menus-BcQWxeXu.mjs.map → menus-fxvEDYE6.mjs.map} +1 -1
- package/dist/{mode-BWyTBe3I.mjs → mode-Bpe-tNNy.mjs} +1 -1
- package/dist/{mode-BWyTBe3I.mjs.map → mode-Bpe-tNNy.mjs.map} +1 -1
- package/dist/{normalize-C-SHXmra.mjs → normalize-Bc-s_r-a.mjs} +1 -1
- package/dist/{normalize-C-SHXmra.mjs.map → normalize-Bc-s_r-a.mjs.map} +1 -1
- package/dist/{oauth-authorization-ClvktmrL.mjs → oauth-authorization-BXO1MKej.mjs} +4 -4
- package/dist/{oauth-authorization-ClvktmrL.mjs.map → oauth-authorization-BXO1MKej.mjs.map} +1 -1
- package/dist/{oauth-clients-8ao-U66l.mjs → oauth-clients-C_DNqtRu.mjs} +1 -1
- package/dist/{oauth-clients-8ao-U66l.mjs.map → oauth-clients-C_DNqtRu.mjs.map} +1 -1
- package/dist/{oauth-state-store-B1ofdTiQ.mjs → oauth-state-store-DwAxMtk4.mjs} +1 -1
- package/dist/{oauth-state-store-B1ofdTiQ.mjs.map → oauth-state-store-DwAxMtk4.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-CscEuIiR.mjs → oauth-user-lookup-BxfZizdk.mjs} +1 -1
- package/dist/{oauth-user-lookup-CscEuIiR.mjs.map → oauth-user-lookup-BxfZizdk.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/{options-CA4eVX6P.d.mts → options-DRe1pIBL.d.mts} +4 -3
- package/dist/options-DRe1pIBL.d.mts.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/{parse-CJKNuewM.mjs → parse-DFbuc-Fh.mjs} +2 -2
- package/dist/{parse-CJKNuewM.mjs.map → parse-DFbuc-Fh.mjs.map} +1 -1
- package/dist/{passkey-config-D-zrzMJI.mjs → passkey-config-_2GOwwK8.mjs} +1 -1
- package/dist/{passkey-config-D-zrzMJI.mjs.map → passkey-config-_2GOwwK8.mjs.map} +1 -1
- package/dist/{placeholder-DaeNS-VG.d.mts → placeholder-CzW7Lshs.d.mts} +1 -1
- package/dist/{placeholder-DaeNS-VG.d.mts.map → placeholder-CzW7Lshs.d.mts.map} +1 -1
- package/dist/plugin-types.d.mts +8 -1
- 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 +7 -4
- package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
- package/dist/{portable-text-B_kqBmXB.mjs → portable-text-DhKbDAGr.mjs} +1 -1
- package/dist/{portable-text-B_kqBmXB.mjs.map → portable-text-DhKbDAGr.mjs.map} +1 -1
- package/dist/{preview-BU6PaLpM.mjs → preview-PW-nOnq4.mjs} +2 -2
- package/dist/{preview-BU6PaLpM.mjs.map → preview-PW-nOnq4.mjs.map} +1 -1
- package/dist/{public-url-Ox9oOlgp.mjs → public-url-CWoFhQT8.mjs} +1 -1
- package/dist/{public-url-Ox9oOlgp.mjs.map → public-url-CWoFhQT8.mjs.map} +1 -1
- package/dist/{query-C5w7PsRQ.mjs → query-BgjfiLUQ.mjs} +31 -49
- package/dist/query-BgjfiLUQ.mjs.map +1 -0
- package/dist/{query-rC9HKv1N.mjs → query-vgZNwIhh.mjs} +3 -3
- package/dist/{query-rC9HKv1N.mjs.map → query-vgZNwIhh.mjs.map} +1 -1
- package/dist/{rate-limit-kug6q99V.mjs → rate-limit-L5anykgo.mjs} +2 -2
- package/dist/{rate-limit-kug6q99V.mjs.map → rate-limit-L5anykgo.mjs.map} +1 -1
- package/dist/{redirect-DIJxXKOG.mjs → redirect-COsS6SWJ.mjs} +2 -2
- package/dist/{redirect-DIJxXKOG.mjs.map → redirect-COsS6SWJ.mjs.map} +1 -1
- package/dist/{redirect-Egf2R9yP.mjs → redirect-KBNE3UEs.mjs} +1 -1
- package/dist/{redirect-Egf2R9yP.mjs.map → redirect-KBNE3UEs.mjs.map} +1 -1
- package/dist/{redirects-Bzm812bY.mjs → redirects-CufRQt0Q.mjs} +4 -4
- package/dist/{redirects-Bzm812bY.mjs.map → redirects-CufRQt0Q.mjs.map} +1 -1
- package/dist/{redirects-G8wAhWAf.mjs → redirects-cV9g7V-0.mjs} +133 -14
- package/dist/redirects-cV9g7V-0.mjs.map +1 -0
- package/dist/registry-C581V4TP.mjs +1275 -0
- package/dist/registry-C581V4TP.mjs.map +1 -0
- package/dist/{relation-Cbe3Sd3m.mjs → relation-DtmAQH7s.mjs} +3 -3
- package/dist/{relation-Cbe3Sd3m.mjs.map → relation-DtmAQH7s.mjs.map} +1 -1
- package/dist/{relations-Bw_E1TXo.mjs → relations-BBApI4e2.mjs} +3 -3
- package/dist/{relations-Bw_E1TXo.mjs.map → relations-BBApI4e2.mjs.map} +1 -1
- package/dist/{relations-qHwpUe66.mjs → relations-DICSyfsh.mjs} +6 -6
- package/dist/{relations-qHwpUe66.mjs.map → relations-DICSyfsh.mjs.map} +1 -1
- package/dist/{relations-G2ta7GIl.d.mts → relations-DItI3MN9.d.mts} +369 -35
- package/dist/relations-DItI3MN9.d.mts.map +1 -0
- package/dist/request-context.d.mts +1 -1
- package/dist/{request-meta-Df-jFbAd.mjs → request-meta-DgZJh3zG.mjs} +2 -2
- package/dist/{request-meta-Df-jFbAd.mjs.map → request-meta-DgZJh3zG.mjs.map} +1 -1
- package/dist/{resolve-DZzG4HqM.mjs → resolve-DOhVEvty.mjs} +2 -2
- package/dist/{resolve-DZzG4HqM.mjs.map → resolve-DOhVEvty.mjs.map} +1 -1
- package/dist/{runner-BFTrkYhu.mjs → runner-BiDvq5dv.mjs} +1157 -254
- package/dist/runner-BiDvq5dv.mjs.map +1 -0
- package/dist/{runner-BaADli8l.d.mts → runner-CgQbELYC.d.mts} +2 -2
- package/dist/{runner-BaADli8l.d.mts.map → runner-CgQbELYC.d.mts.map} +1 -1
- package/dist/runtime.d.mts +11 -11
- package/dist/runtime.mjs +4 -3
- package/dist/runtime.mjs.map +1 -1
- package/dist/{schema-CiQXr6_F.mjs → schema-BFyTg38T.mjs} +3 -3
- package/dist/{schema-CiQXr6_F.mjs.map → schema-BFyTg38T.mjs.map} +1 -1
- package/dist/schema-CeQSNwB3.mjs +390 -0
- package/dist/schema-CeQSNwB3.mjs.map +1 -0
- package/dist/{scopes-CNJVT5i5.mjs → scopes-BVeuhGBE.mjs} +3 -3
- package/dist/{scopes-CNJVT5i5.mjs.map → scopes-BVeuhGBE.mjs.map} +1 -1
- package/dist/{search-FZhx5dDU.mjs → search-BpuPKZb0.mjs} +25 -15
- package/dist/search-BpuPKZb0.mjs.map +1 -0
- package/dist/{secrets-DLd8RXee.mjs → secrets-dtYs2hDo.mjs} +3 -3
- package/dist/{secrets-DLd8RXee.mjs.map → secrets-dtYs2hDo.mjs.map} +1 -1
- package/dist/{sections-BrIrMUCn.mjs → sections-COctk6hf.mjs} +3 -3
- package/dist/{sections-BrIrMUCn.mjs.map → sections-COctk6hf.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +24 -22
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.mjs +16 -15
- package/dist/seo/index.mjs.map +1 -1
- package/dist/{seo-CobNfOvb.mjs → seo-AFpVvTqr.mjs} +5 -3
- package/dist/seo-AFpVvTqr.mjs.map +1 -0
- package/dist/{seo-DTHRntNC.mjs → seo-CvDxfvFb.mjs} +2 -2
- package/dist/{seo-DTHRntNC.mjs.map → seo-CvDxfvFb.mjs.map} +1 -1
- package/dist/{service-B-pYGPgR.mjs → service-xMiMSTsR.mjs} +3 -3
- package/dist/{service-B-pYGPgR.mjs.map → service-xMiMSTsR.mjs.map} +1 -1
- package/dist/{session-user-BvM9-zNl.mjs → session-user-BzVemLkw.mjs} +1 -1
- package/dist/{session-user-BvM9-zNl.mjs.map → session-user-BzVemLkw.mjs.map} +1 -1
- package/dist/{settings-kJhGiQ4z.mjs → settings-B372MV0p.mjs} +4 -4
- package/dist/{settings-kJhGiQ4z.mjs.map → settings-B372MV0p.mjs.map} +1 -1
- package/dist/{settings-DPHau-WH.mjs → settings-BE9aqn_9.mjs} +3 -3
- package/dist/{settings-DPHau-WH.mjs.map → settings-BE9aqn_9.mjs.map} +1 -1
- package/dist/{setup-complete-u50Qm8rY.mjs → setup-complete-DF7TAfD5.mjs} +1 -1
- package/dist/{setup-complete-u50Qm8rY.mjs.map → setup-complete-DF7TAfD5.mjs.map} +1 -1
- package/dist/{setup-nonce-DCjiiOD2.mjs → setup-nonce-Do-U_cg9.mjs} +1 -1
- package/dist/{setup-nonce-DCjiiOD2.mjs.map → setup-nonce-Do-U_cg9.mjs.map} +1 -1
- package/dist/{single-flight-cache-DW3w11Pu.mjs → single-flight-cache-B0eLKS6K.mjs} +2 -2
- package/dist/{single-flight-cache-DW3w11Pu.mjs.map → single-flight-cache-B0eLKS6K.mjs.map} +1 -1
- package/dist/{site-url-I-lJ5kma.mjs → site-url-Bowsi9T-.mjs} +2 -2
- package/dist/{site-url-I-lJ5kma.mjs.map → site-url-Bowsi9T-.mjs.map} +1 -1
- package/dist/slugify-B994zkXC.mjs +17 -0
- package/dist/slugify-B994zkXC.mjs.map +1 -0
- package/dist/{snapshot-I_fjLDaD.mjs → snapshot-B5h6aPMh.mjs} +1 -1
- package/dist/{snapshot-I_fjLDaD.mjs.map → snapshot-B5h6aPMh.mjs.map} +1 -1
- package/dist/{ssrf-CTa6v21i.mjs → ssrf-Cpvg_n3A.mjs} +1 -1
- package/dist/{ssrf-CTa6v21i.mjs.map → ssrf-Cpvg_n3A.mjs.map} +1 -1
- package/dist/{state-CQvoefYP.mjs → state-DYwPue40.mjs} +1 -1
- package/dist/{state-CQvoefYP.mjs.map → state-DYwPue40.mjs.map} +1 -1
- package/dist/{status-CIsmlC1E.mjs → status-CWVYpbD8.mjs} +1 -1
- package/dist/{status-CIsmlC1E.mjs.map → status-CWVYpbD8.mjs.map} +1 -1
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +1 -1
- package/dist/{taxonomies-CLN1N92E.mjs → taxonomies-B0o9ExNV.mjs} +75 -64
- package/dist/taxonomies-B0o9ExNV.mjs.map +1 -0
- package/dist/{taxonomies-CKuaZER5.mjs → taxonomies-Dk3MAklL.mjs} +280 -56
- package/dist/taxonomies-Dk3MAklL.mjs.map +1 -0
- package/dist/{taxonomy-pOrB2kZe.mjs → taxonomy-CPeM8d2o.mjs} +131 -78
- package/dist/taxonomy-CPeM8d2o.mjs.map +1 -0
- package/dist/{tokens-DagaJGK8.mjs → tokens-C39klX8R.mjs} +2 -2
- package/dist/{tokens-DagaJGK8.mjs.map → tokens-C39klX8R.mjs.map} +1 -1
- package/dist/{transport-DVsa5YYo.mjs → transport--CfOflrp.mjs} +1 -1
- package/dist/{transport-DVsa5YYo.mjs.map → transport--CfOflrp.mjs.map} +1 -1
- package/dist/{transport-CAwTaTp_.d.mts → transport-B_rfeU-a.d.mts} +1 -1
- package/dist/{transport-CAwTaTp_.d.mts.map → transport-B_rfeU-a.d.mts.map} +1 -1
- package/dist/{trusted-proxy-D20_7fyX.mjs → trusted-proxy-CEVekpby.mjs} +1 -1
- package/dist/{trusted-proxy-D20_7fyX.mjs.map → trusted-proxy-CEVekpby.mjs.map} +1 -1
- package/dist/{types-NBI3rF-_.mjs → types-75KIqzL9.mjs} +18 -2
- package/dist/types-75KIqzL9.mjs.map +1 -0
- package/dist/{types-CbUcuxxc.d.mts → types-BPuloofb.d.mts} +1 -1
- package/dist/{types-CbUcuxxc.d.mts.map → types-BPuloofb.d.mts.map} +1 -1
- package/dist/{types-BjxTKxrZ.mjs → types-BW1syrlw.mjs} +1 -1
- package/dist/{types-BjxTKxrZ.mjs.map → types-BW1syrlw.mjs.map} +1 -1
- package/dist/{types-BnFP1M3J.d.mts → types-C3_AbkDP.d.mts} +32 -10
- package/dist/types-C3_AbkDP.d.mts.map +1 -0
- package/dist/{types-Dc4ntQjQ.d.mts → types-CAGdePf3.d.mts} +124 -1
- package/dist/types-CAGdePf3.d.mts.map +1 -0
- package/dist/{types-DLG4IFEQ.d.mts → types-CFUfyt1s.d.mts} +1 -1
- package/dist/{types-DLG4IFEQ.d.mts.map → types-CFUfyt1s.d.mts.map} +1 -1
- package/dist/{types-LoagAGzH.d.mts → types-CPx2lIGo.d.mts} +1 -1
- package/dist/{types-LoagAGzH.d.mts.map → types-CPx2lIGo.d.mts.map} +1 -1
- package/dist/{types-Cd8iuS1J.mjs → types-CQPWhPxE.mjs} +9 -12
- package/dist/types-CQPWhPxE.mjs.map +1 -0
- package/dist/{types-Cz8hNch2.d.mts → types-Cs-TFLNf.d.mts} +25 -5
- package/dist/types-Cs-TFLNf.d.mts.map +1 -0
- package/dist/types-CtzytVXn.mjs.map +1 -1
- package/dist/{types-BGWPMiBO.d.mts → types-D4_1Ga4L.d.mts} +44 -5
- package/dist/types-D4_1Ga4L.d.mts.map +1 -0
- package/dist/{types-C8oz_ayJ.d.mts → types-DefV3OiO.d.mts} +1 -1
- package/dist/{types-C8oz_ayJ.d.mts.map → types-DefV3OiO.d.mts.map} +1 -1
- package/dist/{types-BK6U01Ro.d.mts → types-X0MThr7x.d.mts} +1 -1
- package/dist/{types-BK6U01Ro.d.mts.map → types-X0MThr7x.d.mts.map} +1 -1
- package/dist/{upload-attempts-D8QAFLUJ.mjs → upload-attempts-hlne3iA1.mjs} +1 -1
- package/dist/{upload-attempts-D8QAFLUJ.mjs.map → upload-attempts-hlne3iA1.mjs.map} +1 -1
- package/dist/url-pattern-BHS0V5Ng.mjs +33 -0
- package/dist/url-pattern-BHS0V5Ng.mjs.map +1 -0
- package/dist/{user-DBrq4UVq.mjs → user-sHgJ62SP.mjs} +3 -3
- package/dist/{user-DBrq4UVq.mjs.map → user-sHgJ62SP.mjs.map} +1 -1
- package/dist/{utils-hLzi_2Fn.mjs → utils-D4vD_Y98.mjs} +3 -3
- package/dist/{utils-hLzi_2Fn.mjs.map → utils-D4vD_Y98.mjs.map} +1 -1
- package/dist/{validate-mKo3RxBM.mjs → validate-BkqIG_Uj.mjs} +24 -5
- package/dist/validate-BkqIG_Uj.mjs.map +1 -0
- package/dist/{validate-C3oSmA7F.d.mts → validate-DeGtBN84.d.mts} +15 -7
- package/dist/validate-DeGtBN84.d.mts.map +1 -0
- package/dist/{validation-BgpucsvF.mjs → validation-CiJb_X5o.mjs} +11 -10
- package/dist/{validation-BgpucsvF.mjs.map → validation-CiJb_X5o.mjs.map} +1 -1
- package/dist/version-x0NjTScG.mjs +7 -0
- package/dist/{version-C4PnpmoV.mjs.map → version-x0NjTScG.mjs.map} +1 -1
- package/dist/{widgets-CJJtkiKh.mjs → widgets-Cwzvww0W.mjs} +3 -3
- package/dist/{widgets-CJJtkiKh.mjs.map → widgets-Cwzvww0W.mjs.map} +1 -1
- package/dist/{wxr-taxonomies-Bkpp_2tK.d.mts → wxr-taxonomies-CmC0ZsDr.d.mts} +1 -1
- package/dist/{wxr-taxonomies-Bkpp_2tK.d.mts.map → wxr-taxonomies-CmC0ZsDr.d.mts.map} +1 -1
- package/dist/{wxr-taxonomies-9PPSy8X6.mjs → wxr-taxonomies-QZjWxjyk.mjs} +13 -32
- package/dist/{wxr-taxonomies-9PPSy8X6.mjs.map → wxr-taxonomies-QZjWxjyk.mjs.map} +1 -1
- package/dist/{zod-generator-CG64Hnbh.mjs → zod-generator-D11MhxG4.mjs} +52 -5
- package/dist/zod-generator-D11MhxG4.mjs.map +1 -0
- package/package.json +16 -8
- package/src/api/errors.ts +12 -0
- package/src/api/handlers/content.ts +127 -29
- package/src/api/handlers/dashboard.ts +12 -2
- package/src/api/handlers/index.ts +16 -0
- package/src/api/handlers/manifest.ts +2 -0
- package/src/api/handlers/media-allowlist.ts +13 -2
- package/src/api/handlers/media-usage-work.ts +188 -0
- package/src/api/handlers/media-usage.ts +5 -3
- package/src/api/handlers/schema.ts +9 -3
- package/src/api/handlers/seo.ts +5 -2
- package/src/api/handlers/taxonomies.ts +345 -82
- package/src/api/media-usage-write-fence.ts +64 -0
- package/src/api/openapi/document.ts +199 -0
- package/src/api/schemas/common.ts +3 -1
- package/src/api/schemas/content.ts +122 -1
- package/src/api/schemas/media-usage.ts +133 -0
- package/src/api/schemas/schema.ts +78 -3
- package/src/api/schemas/taxonomies.ts +40 -8
- package/src/api/types.ts +1 -0
- package/src/astro/integration/index.ts +55 -42
- package/src/astro/integration/routes.ts +34 -4
- package/src/astro/integration/runtime.ts +15 -0
- package/src/astro/integration/virtual-modules.ts +25 -1
- package/src/astro/integration/vite-config.ts +16 -1
- package/src/astro/middleware/media-usage-write-fence.ts +30 -0
- package/src/astro/middleware/redirect.ts +12 -2
- package/src/astro/middleware.ts +75 -8
- package/src/astro/routes/api/admin/media-usage/collection-deletions/index.ts +22 -0
- package/src/astro/routes/api/admin/media-usage/collection-deletions/retry.ts +22 -0
- package/src/astro/routes/api/admin/media-usage/work/index.ts +26 -0
- package/src/astro/routes/api/admin/media-usage/work/retry.ts +26 -0
- package/src/astro/routes/api/admin/plugins/[id]/disable.ts +4 -0
- package/src/astro/routes/api/admin/plugins/[id]/enable.ts +4 -0
- package/src/astro/routes/api/admin/plugins/[id]/uninstall.ts +4 -0
- package/src/astro/routes/api/admin/plugins/[id]/update.ts +4 -0
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/install.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/[id]/uninstall.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/[id]/update.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/install.ts +4 -0
- package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +67 -31
- package/src/astro/routes/api/import/wordpress/execute.ts +3 -10
- package/src/astro/routes/api/mcp.ts +1 -0
- package/src/astro/routes/api/plugins/[pluginId]/[...path].ts +7 -1
- package/src/astro/routes/api/schema/collections/[slug]/index.ts +1 -7
- package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +1 -0
- package/src/astro/routes/api/taxonomies/[name]/translations.ts +48 -0
- package/src/astro/routes/api/taxonomies/[name].ts +102 -0
- package/src/astro/types.ts +25 -4
- package/src/cleanup.ts +6 -12
- package/src/cli/commands/doctor.ts +193 -6
- package/src/cli/commands/export-seed.ts +4 -1
- package/src/client/index.ts +119 -0
- package/src/components/Block.astro +12 -0
- package/src/components/InlinePortableTextEditor.tsx +89 -1
- package/src/content/converters/mark-safety.ts +120 -0
- package/src/content/converters/portable-text-to-prosemirror.ts +25 -16
- package/src/content/converters/prosemirror-to-portable-text.ts +12 -2
- package/src/content-list-query.ts +29 -0
- package/src/database/migrations/060_collection_admin_config.ts +16 -0
- package/src/database/migrations/061_media_usage_cleanup.ts +77 -0
- package/src/database/migrations/062_media_usage_cleanup_fence.ts +295 -0
- package/src/database/migrations/063_media_usage_incremental_work.ts +397 -0
- package/src/database/migrations/064_fts_plain_text.ts +253 -0
- package/src/database/migrations/065_media_usage_collection_deletion.ts +85 -0
- package/src/database/migrations/066_media_usage_reconciliation.ts +115 -0
- package/src/database/migrations/067_indexed_content_fields.ts +39 -0
- package/src/database/migrations/068_content_taxonomy_entry_groups.ts +61 -0
- package/src/database/migrations/069_collection_title_date_fields.ts +45 -0
- package/src/database/migrations/070_collection_routable.ts +18 -0
- package/src/database/migrations/runner.ts +22 -0
- package/src/database/repositories/content.ts +861 -96
- package/src/database/repositories/media-usage-work.ts +848 -0
- package/src/database/repositories/media-usage.ts +1502 -138
- package/src/database/repositories/revision.ts +17 -6
- package/src/database/repositories/taxonomy.ts +234 -103
- package/src/database/repositories/types.ts +51 -2
- package/src/database/types.ts +134 -16
- package/src/db/adapters.ts +28 -0
- package/src/db/index.ts +3 -0
- package/src/emdash-runtime.ts +227 -20
- package/src/fields/file.ts +7 -4
- package/src/fields/image.ts +8 -1
- package/src/fields/types.ts +18 -5
- package/src/i18n/config.ts +32 -0
- package/src/i18n/repair-locale-casing.ts +0 -14
- package/src/i18n/taxonomy-locale-diagnostic.ts +47 -0
- package/src/import/wxr-taxonomies.ts +7 -47
- package/src/index.ts +25 -2
- package/src/loader.ts +119 -65
- package/src/mcp/server.ts +242 -34
- package/src/media/usage/activation.ts +626 -0
- package/src/media/usage/capture-triggers.ts +543 -0
- package/src/media/usage/cleanup.ts +305 -0
- package/src/media/usage/collection-deletion-processor.ts +356 -0
- package/src/media/usage/collection-deletion.ts +836 -0
- package/src/media/usage/content-fields.ts +40 -3
- package/src/media/usage/content-refresh.ts +356 -47
- package/src/media/usage/content-repair.ts +180 -61
- package/src/media/usage/content-snapshots.ts +85 -105
- package/src/media/usage/projection-fingerprint.ts +129 -0
- package/src/media/usage/reconciliation-processor.ts +372 -0
- package/src/media/usage/reconciliation.ts +1117 -0
- package/src/media/usage/source-key.ts +4 -0
- package/src/media/usage/types.ts +2 -0
- package/src/media/usage/work-processor.ts +248 -0
- package/src/menus/index.ts +246 -141
- package/src/plugin-types.ts +8 -0
- package/src/plugins/adapt-sandbox-entry.ts +24 -5
- package/src/plugins/context.ts +24 -7
- package/src/plugins/index.ts +9 -0
- package/src/plugins/routes.ts +43 -1
- package/src/plugins/sandbox/index.ts +10 -1
- package/src/plugins/sandbox/types.ts +78 -1
- package/src/plugins/scheduler/node.ts +13 -1
- package/src/plugins/scheduler/types.ts +2 -0
- package/src/plugins/types.ts +39 -2
- package/src/query.ts +29 -37
- package/src/scheduler-health.ts +46 -0
- package/src/schema/registry.ts +777 -255
- package/src/schema/types.ts +50 -8
- package/src/schema/url-pattern.ts +33 -0
- package/src/schema/zod-generator.ts +77 -5
- package/src/search/fts-manager.ts +117 -76
- package/src/search/query.ts +32 -11
- package/src/search/types.ts +2 -0
- package/src/seed/apply.ts +68 -15
- package/src/seed/types.ts +11 -3
- package/src/seed/validate.ts +52 -2
- package/src/taxonomies/index.ts +77 -75
- package/src/taxonomies/term-counts.ts +21 -8
- package/src/utils/slugify.ts +1 -29
- package/src/virtual-modules.d.ts +16 -0
- package/dist/adapters-BMyNSSZi.d.mts.map +0 -1
- package/dist/api-D2hunekQ.mjs.map +0 -1
- package/dist/apply-kwNEJW2l.mjs.map +0 -1
- package/dist/config-DyF3OKg_.mjs.map +0 -1
- package/dist/content-CJ94NEx5.mjs.map +0 -1
- package/dist/content-refresh-Xw7aKmou.mjs +0 -1629
- package/dist/content-refresh-Xw7aKmou.mjs.map +0 -1
- package/dist/context-C_1nrqnW.mjs.map +0 -1
- package/dist/dashboard-DINnNVVU.mjs.map +0 -1
- package/dist/errors-BucQ8VYz.mjs.map +0 -1
- package/dist/fts-manager-BITakW_R.mjs.map +0 -1
- package/dist/index-M37iz29I.d.mts.map +0 -1
- package/dist/index-MGw47uWq.d.mts.map +0 -1
- package/dist/loader-CGugY7Zl.mjs.map +0 -1
- package/dist/media-OhYL-7Io.mjs.map +0 -1
- package/dist/media-allowlist-D-peH1H5.mjs.map +0 -1
- package/dist/media-usage-BlxfTkN0.mjs.map +0 -1
- package/dist/menus-Y54RDPIN.mjs.map +0 -1
- package/dist/options-CA4eVX6P.d.mts.map +0 -1
- package/dist/query-C5w7PsRQ.mjs.map +0 -1
- package/dist/redirects-G8wAhWAf.mjs.map +0 -1
- package/dist/registry-Dbodb4Uo.mjs +0 -840
- package/dist/registry-Dbodb4Uo.mjs.map +0 -1
- package/dist/relations-G2ta7GIl.d.mts.map +0 -1
- package/dist/runner-BFTrkYhu.mjs.map +0 -1
- package/dist/search-FZhx5dDU.mjs.map +0 -1
- package/dist/seo-CobNfOvb.mjs.map +0 -1
- package/dist/slugify-C_tqlU4G.mjs +0 -30
- package/dist/slugify-C_tqlU4G.mjs.map +0 -1
- package/dist/taxonomies-CKuaZER5.mjs.map +0 -1
- package/dist/taxonomies-CLN1N92E.mjs.map +0 -1
- package/dist/taxonomy-pOrB2kZe.mjs.map +0 -1
- package/dist/types-BGWPMiBO.d.mts.map +0 -1
- package/dist/types-BnFP1M3J.d.mts.map +0 -1
- package/dist/types-Cd8iuS1J.mjs.map +0 -1
- package/dist/types-Cz8hNch2.d.mts.map +0 -1
- package/dist/types-Dc4ntQjQ.d.mts.map +0 -1
- package/dist/types-NBI3rF-_.mjs.map +0 -1
- package/dist/validate-C3oSmA7F.d.mts.map +0 -1
- package/dist/validate-mKo3RxBM.mjs.map +0 -1
- package/dist/version-C4PnpmoV.mjs +0 -7
- package/dist/zod-generator-CG64Hnbh.mjs.map +0 -1
- /package/dist/{api-tokens-Dai9dND0.mjs → api-tokens-CyTsLszZ.mjs} +0 -0
- /package/dist/{ssrf-Cj568Dgs.mjs → ssrf-DpXgKsna.mjs} +0 -0
- /package/dist/{types-DKuWPYV5.mjs → types-CP1CflWf.mjs} +0 -0
|
@@ -0,0 +1,779 @@
|
|
|
1
|
+
import { t as validateIdentifier } from "./validate-BpwoDOgt.mjs";
|
|
2
|
+
import { p as tableExists, s as isPostgres } from "./dialect-helpers-BSbfaO3F.mjs";
|
|
3
|
+
import { n as isMissingTableError } from "./db-errors-Cl-sKYTm.mjs";
|
|
4
|
+
import { o as decodeCursor, s as encodeCursor } from "./types-CQPWhPxE.mjs";
|
|
5
|
+
import { t as withTransaction } from "./transaction-NQj4VJ7Z.mjs";
|
|
6
|
+
import { t as FTSManager } from "./fts-manager-CZ-5dVwJ.mjs";
|
|
7
|
+
import { sql } from "kysely";
|
|
8
|
+
import { ulid } from "ulidx";
|
|
9
|
+
|
|
10
|
+
//#region src/media/usage/capture-triggers.ts
|
|
11
|
+
const POSTGRES_TRIGGER_FUNCTION = "emdash_media_usage_capture_work";
|
|
12
|
+
const POSTGRES_IDENTIFIER_LIMIT = 63;
|
|
13
|
+
const CAPTURE_TRIGGER_VERSION = 1;
|
|
14
|
+
const OWNED_TRIGGER_PREFIX = "emdash_mu_";
|
|
15
|
+
const WHITESPACE_PATTERN = /\s+/g;
|
|
16
|
+
const TRAILING_SEMICOLON_PATTERN = /;$/;
|
|
17
|
+
async function installMediaUsageCaptureTriggers(db, identity, options = {}) {
|
|
18
|
+
const identifiers = await captureIdentifiers(identity);
|
|
19
|
+
if (isPostgres(db)) await installPostgresFunction(db);
|
|
20
|
+
const installedNames = await listOwnedCaptureTriggers(db, identifiers.tableName);
|
|
21
|
+
if (await hasExactCaptureTriggers(db, identifiers, identity, installedNames)) return;
|
|
22
|
+
await assertCaptureLifecycle(db, identity, ["installing"]);
|
|
23
|
+
const expectedNames = new Set(Object.values(identifiers.triggerNames));
|
|
24
|
+
const retainedNames = new Set(options.replaceExisting === false ? installedNames.filter((name) => expectedNames.has(name)) : []);
|
|
25
|
+
await removeCaptureTriggers(db, identifiers.tableName, installedNames.filter((name) => !retainedNames.has(name)));
|
|
26
|
+
for (const operation of captureOperations) {
|
|
27
|
+
if (retainedNames.has(identifiers.triggerNames[operation])) continue;
|
|
28
|
+
if (isPostgres(db)) await postgresCreateTrigger(db, identifiers.tableName, identifiers.triggerNames[operation], operation, identity);
|
|
29
|
+
else await sqliteCreateTrigger(db, identifiers.tableName, identifiers.triggerNames[operation], operation, identity);
|
|
30
|
+
}
|
|
31
|
+
await assertExpectedTriggerSet(db, identifiers, identity);
|
|
32
|
+
}
|
|
33
|
+
async function verifyMediaUsageCaptureTriggers(db, identity) {
|
|
34
|
+
const identifiers = await captureIdentifiers(identity);
|
|
35
|
+
if (!await tableExists(db, identifiers.tableName)) return false;
|
|
36
|
+
return hasExactCaptureTriggers(db, identifiers, identity, await listOwnedCaptureTriggers(db, identifiers.tableName));
|
|
37
|
+
}
|
|
38
|
+
const captureOperations = [
|
|
39
|
+
"insert",
|
|
40
|
+
"update",
|
|
41
|
+
"delete"
|
|
42
|
+
];
|
|
43
|
+
async function captureIdentifiers(identity) {
|
|
44
|
+
validateIdentifier(identity.collectionSlug, "collection slug");
|
|
45
|
+
const tableName = `ec_${identity.collectionSlug}`;
|
|
46
|
+
validateIdentifier(tableName, "content table");
|
|
47
|
+
const digest = await identityDigest(`${CAPTURE_TRIGGER_VERSION}:${identity.collectionId}:${identity.collectionSlug}`);
|
|
48
|
+
const triggerNames = {
|
|
49
|
+
insert: `emdash_mu_${digest}_ai`,
|
|
50
|
+
update: `emdash_mu_${digest}_au`,
|
|
51
|
+
delete: `emdash_mu_${digest}_ad`
|
|
52
|
+
};
|
|
53
|
+
for (const triggerName of Object.values(triggerNames)) {
|
|
54
|
+
validateIdentifier(triggerName, "media usage trigger");
|
|
55
|
+
if (triggerName.length > POSTGRES_IDENTIFIER_LIMIT) throw new Error(`Media usage trigger name exceeds ${POSTGRES_IDENTIFIER_LIMIT} bytes`);
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
tableName,
|
|
59
|
+
triggerNames
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
async function identityDigest(value) {
|
|
63
|
+
const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(value));
|
|
64
|
+
return Array.from(new Uint8Array(digest).slice(0, 16), (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
65
|
+
}
|
|
66
|
+
async function removeCaptureTriggers(db, tableName, triggerNames) {
|
|
67
|
+
for (const triggerName of triggerNames) {
|
|
68
|
+
validateIdentifier(triggerName, "media usage trigger");
|
|
69
|
+
if (isPostgres(db)) await sql`
|
|
70
|
+
DROP TRIGGER IF EXISTS ${sql.ref(triggerName)} ON ${sql.ref(tableName)}
|
|
71
|
+
`.execute(db);
|
|
72
|
+
else await sql`DROP TRIGGER IF EXISTS ${sql.ref(triggerName)}`.execute(db);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async function listOwnedCaptureTriggers(db, tableName) {
|
|
76
|
+
if (isPostgres(db)) return (await sql`
|
|
77
|
+
SELECT trigger.tgname AS name
|
|
78
|
+
FROM pg_trigger AS trigger
|
|
79
|
+
INNER JOIN pg_class AS relation ON relation.oid = trigger.tgrelid
|
|
80
|
+
INNER JOIN pg_namespace AS namespace ON namespace.oid = relation.relnamespace
|
|
81
|
+
WHERE namespace.nspname = current_schema()
|
|
82
|
+
AND relation.relname = ${tableName}
|
|
83
|
+
AND NOT trigger.tgisinternal
|
|
84
|
+
AND left(trigger.tgname, 10) = ${OWNED_TRIGGER_PREFIX}
|
|
85
|
+
`.execute(db)).rows.map((row) => row.name);
|
|
86
|
+
return (await sql`
|
|
87
|
+
SELECT name
|
|
88
|
+
FROM sqlite_master
|
|
89
|
+
WHERE type = 'trigger'
|
|
90
|
+
AND tbl_name = ${tableName}
|
|
91
|
+
AND substr(name, 1, 10) = ${OWNED_TRIGGER_PREFIX}
|
|
92
|
+
`.execute(db)).rows.map((row) => row.name);
|
|
93
|
+
}
|
|
94
|
+
async function hasExactCaptureTriggers(db, identifiers, identity, installedNames) {
|
|
95
|
+
const expectedNames = new Set(Object.values(identifiers.triggerNames));
|
|
96
|
+
if (installedNames.length !== expectedNames.size || installedNames.some((name) => !expectedNames.has(name))) return false;
|
|
97
|
+
if (isPostgres(db)) {
|
|
98
|
+
const result = await sql`
|
|
99
|
+
SELECT
|
|
100
|
+
trigger.tgname AS name,
|
|
101
|
+
trigger.tgtype AS trigger_type,
|
|
102
|
+
procedure.proname AS function_name,
|
|
103
|
+
encode(trigger.tgargs, 'hex') AS arguments_hex,
|
|
104
|
+
trigger.tgenabled AS enabled,
|
|
105
|
+
trigger.tgqual IS NOT NULL AS has_when
|
|
106
|
+
FROM pg_trigger AS trigger
|
|
107
|
+
INNER JOIN pg_class AS relation ON relation.oid = trigger.tgrelid
|
|
108
|
+
INNER JOIN pg_namespace AS namespace ON namespace.oid = relation.relnamespace
|
|
109
|
+
INNER JOIN pg_proc AS procedure ON procedure.oid = trigger.tgfoid
|
|
110
|
+
INNER JOIN pg_namespace AS function_namespace ON function_namespace.oid = procedure.pronamespace
|
|
111
|
+
WHERE namespace.nspname = current_schema()
|
|
112
|
+
AND function_namespace.nspname = current_schema()
|
|
113
|
+
AND relation.relname = ${identifiers.tableName}
|
|
114
|
+
AND NOT trigger.tgisinternal
|
|
115
|
+
AND trigger.tgconstraint = 0
|
|
116
|
+
AND NOT trigger.tgdeferrable
|
|
117
|
+
AND NOT trigger.tginitdeferred
|
|
118
|
+
AND trigger.tgattr = ''::int2vector
|
|
119
|
+
AND left(trigger.tgname, 10) = ${OWNED_TRIGGER_PREFIX}
|
|
120
|
+
`.execute(db);
|
|
121
|
+
const expectedArguments = triggerArgumentsHex(identity);
|
|
122
|
+
return captureOperations.every((operation) => {
|
|
123
|
+
const row = result.rows.find((candidate) => candidate.name === identifiers.triggerNames[operation]);
|
|
124
|
+
return row?.function_name === POSTGRES_TRIGGER_FUNCTION && Number(row.trigger_type) === postgresTriggerType(operation) && row.arguments_hex === expectedArguments && row.enabled === "O" && row.has_when === false;
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
const result = await sql`
|
|
128
|
+
SELECT name, sql AS definition
|
|
129
|
+
FROM sqlite_master
|
|
130
|
+
WHERE type = 'trigger'
|
|
131
|
+
AND tbl_name = ${identifiers.tableName}
|
|
132
|
+
AND substr(name, 1, 10) = ${OWNED_TRIGGER_PREFIX}
|
|
133
|
+
`.execute(db);
|
|
134
|
+
return captureOperations.every((operation) => {
|
|
135
|
+
const row = result.rows.find((candidate) => candidate.name === identifiers.triggerNames[operation]);
|
|
136
|
+
const contentId = operation === "delete" ? sql`OLD.id` : sql`NEW.id`;
|
|
137
|
+
const expected = sqliteTriggerSql(identifiers.tableName, identifiers.triggerNames[operation], operationSql(operation), contentId, identity).compile(db).sql;
|
|
138
|
+
return row ? normalizeDdl(row.definition) === normalizeDdl(expected) : false;
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
function triggerArgumentsHex(identity) {
|
|
142
|
+
const bytes = new TextEncoder().encode(`${identity.collectionId}\0${identity.collectionSlug}\0`);
|
|
143
|
+
return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
144
|
+
}
|
|
145
|
+
function postgresTriggerType(operation) {
|
|
146
|
+
switch (operation) {
|
|
147
|
+
case "insert": return 5;
|
|
148
|
+
case "update": return 17;
|
|
149
|
+
case "delete": return 9;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function normalizeDdl(definition) {
|
|
153
|
+
return definition.replace(WHITESPACE_PATTERN, " ").trim().replace(TRAILING_SEMICOLON_PATTERN, "");
|
|
154
|
+
}
|
|
155
|
+
async function assertCaptureLifecycle(db, identity, allowedStates) {
|
|
156
|
+
const lifecycle = await db.selectFrom("_emdash_media_usage_index_status").select("capture_state").where("adapter_id", "=", "content-media").where("scope_type", "=", "collection").where("scope_key", "=", identity.collectionSlug).where("collection_id", "=", identity.collectionId).executeTakeFirst();
|
|
157
|
+
if (!lifecycle?.capture_state || !allowedStates.includes(lifecycle.capture_state)) throw new Error("Media usage capture trigger changes require a fenced collection lifecycle");
|
|
158
|
+
}
|
|
159
|
+
async function assertExpectedTriggerSet(db, identifiers, identity) {
|
|
160
|
+
if (!await hasExactCaptureTriggers(db, identifiers, identity, await listOwnedCaptureTriggers(db, identifiers.tableName))) throw new Error("Media usage capture trigger installation is incomplete");
|
|
161
|
+
}
|
|
162
|
+
async function installPostgresFunction(db) {
|
|
163
|
+
await sql`
|
|
164
|
+
CREATE OR REPLACE FUNCTION ${sql.ref(POSTGRES_TRIGGER_FUNCTION)}()
|
|
165
|
+
RETURNS trigger
|
|
166
|
+
LANGUAGE plpgsql
|
|
167
|
+
AS $function$
|
|
168
|
+
DECLARE
|
|
169
|
+
v_collection_id text := TG_ARGV[0];
|
|
170
|
+
v_collection_slug text := TG_ARGV[1];
|
|
171
|
+
v_content_id text;
|
|
172
|
+
v_epoch bigint;
|
|
173
|
+
v_now text := to_char(
|
|
174
|
+
clock_timestamp() AT TIME ZONE 'UTC',
|
|
175
|
+
'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"'
|
|
176
|
+
);
|
|
177
|
+
BEGIN
|
|
178
|
+
IF TG_OP = 'DELETE' THEN
|
|
179
|
+
v_content_id := OLD.id;
|
|
180
|
+
ELSE
|
|
181
|
+
v_content_id := NEW.id;
|
|
182
|
+
END IF;
|
|
183
|
+
|
|
184
|
+
UPDATE _emdash_media_usage_index_status
|
|
185
|
+
SET change_epoch = change_epoch + 1,
|
|
186
|
+
status = CASE WHEN status = 'complete' THEN 'stale' ELSE status END,
|
|
187
|
+
completed_at = CASE WHEN status = 'complete' THEN NULL ELSE completed_at END,
|
|
188
|
+
updated_at = v_now
|
|
189
|
+
WHERE adapter_id = 'content-media'
|
|
190
|
+
AND scope_type = 'collection'
|
|
191
|
+
AND scope_key = v_collection_slug
|
|
192
|
+
AND collection_id = v_collection_id
|
|
193
|
+
AND capture_state = 'active'
|
|
194
|
+
AND EXISTS (
|
|
195
|
+
SELECT 1
|
|
196
|
+
FROM _emdash_collections AS collection
|
|
197
|
+
WHERE collection.id = v_collection_id
|
|
198
|
+
AND collection.slug = v_collection_slug
|
|
199
|
+
)
|
|
200
|
+
RETURNING change_epoch INTO v_epoch;
|
|
201
|
+
|
|
202
|
+
IF NOT FOUND THEN
|
|
203
|
+
RAISE EXCEPTION USING
|
|
204
|
+
ERRCODE = 'P0001',
|
|
205
|
+
MESSAGE = 'media usage capture inactive';
|
|
206
|
+
END IF;
|
|
207
|
+
|
|
208
|
+
INSERT INTO _emdash_media_usage_work (
|
|
209
|
+
collection_id,
|
|
210
|
+
collection_slug,
|
|
211
|
+
content_id,
|
|
212
|
+
change_epoch,
|
|
213
|
+
work_version,
|
|
214
|
+
state,
|
|
215
|
+
attempt_count,
|
|
216
|
+
next_attempt_at,
|
|
217
|
+
lease_token,
|
|
218
|
+
lease_expires_at,
|
|
219
|
+
last_attempted_at,
|
|
220
|
+
last_error_code,
|
|
221
|
+
created_at,
|
|
222
|
+
updated_at
|
|
223
|
+
)
|
|
224
|
+
VALUES (
|
|
225
|
+
v_collection_id,
|
|
226
|
+
v_collection_slug,
|
|
227
|
+
v_content_id,
|
|
228
|
+
v_epoch,
|
|
229
|
+
1,
|
|
230
|
+
'pending',
|
|
231
|
+
0,
|
|
232
|
+
v_now,
|
|
233
|
+
NULL,
|
|
234
|
+
NULL,
|
|
235
|
+
NULL,
|
|
236
|
+
NULL,
|
|
237
|
+
v_now,
|
|
238
|
+
v_now
|
|
239
|
+
)
|
|
240
|
+
ON CONFLICT (collection_id, content_id) DO UPDATE SET
|
|
241
|
+
collection_slug = EXCLUDED.collection_slug,
|
|
242
|
+
change_epoch = EXCLUDED.change_epoch,
|
|
243
|
+
work_version = _emdash_media_usage_work.work_version + 1,
|
|
244
|
+
state = 'pending',
|
|
245
|
+
attempt_count = 0,
|
|
246
|
+
next_attempt_at = EXCLUDED.next_attempt_at,
|
|
247
|
+
lease_token = NULL,
|
|
248
|
+
lease_expires_at = NULL,
|
|
249
|
+
last_attempted_at = NULL,
|
|
250
|
+
last_error_code = NULL,
|
|
251
|
+
updated_at = EXCLUDED.updated_at;
|
|
252
|
+
|
|
253
|
+
RETURN NULL;
|
|
254
|
+
END;
|
|
255
|
+
$function$
|
|
256
|
+
`.execute(db);
|
|
257
|
+
}
|
|
258
|
+
async function postgresCreateTrigger(db, tableName, triggerName, operation, identity) {
|
|
259
|
+
await sql`
|
|
260
|
+
CREATE TRIGGER ${sql.ref(triggerName)}
|
|
261
|
+
AFTER ${operationSql(operation)} ON ${sql.ref(tableName)}
|
|
262
|
+
FOR EACH ROW
|
|
263
|
+
EXECUTE FUNCTION ${sql.ref(POSTGRES_TRIGGER_FUNCTION)}(
|
|
264
|
+
${sql.lit(identity.collectionId)},
|
|
265
|
+
${sql.lit(identity.collectionSlug)}
|
|
266
|
+
)
|
|
267
|
+
`.execute(db);
|
|
268
|
+
}
|
|
269
|
+
async function sqliteCreateTrigger(db, tableName, triggerName, operation, identity) {
|
|
270
|
+
const contentId = operation === "delete" ? sql`OLD.id` : sql`NEW.id`;
|
|
271
|
+
await sqliteTriggerSql(tableName, triggerName, operationSql(operation), contentId, identity).execute(db);
|
|
272
|
+
}
|
|
273
|
+
function sqliteTriggerSql(tableName, triggerName, operation, contentId, identity) {
|
|
274
|
+
return sql`
|
|
275
|
+
CREATE TRIGGER ${sql.ref(triggerName)}
|
|
276
|
+
AFTER ${operation} ON ${sql.ref(tableName)}
|
|
277
|
+
FOR EACH ROW
|
|
278
|
+
BEGIN
|
|
279
|
+
UPDATE _emdash_media_usage_index_status
|
|
280
|
+
SET change_epoch = change_epoch + 1,
|
|
281
|
+
status = CASE WHEN status = 'complete' THEN 'stale' ELSE status END,
|
|
282
|
+
completed_at = CASE WHEN status = 'complete' THEN NULL ELSE completed_at END,
|
|
283
|
+
updated_at = strftime('%Y-%m-%dT%H:%M:%fZ', 'now')
|
|
284
|
+
WHERE adapter_id = 'content-media'
|
|
285
|
+
AND scope_type = 'collection'
|
|
286
|
+
AND scope_key = ${sql.lit(identity.collectionSlug)}
|
|
287
|
+
AND collection_id = ${sql.lit(identity.collectionId)}
|
|
288
|
+
AND capture_state = 'active'
|
|
289
|
+
AND EXISTS (
|
|
290
|
+
SELECT 1
|
|
291
|
+
FROM _emdash_collections AS collection
|
|
292
|
+
WHERE collection.id = ${sql.lit(identity.collectionId)}
|
|
293
|
+
AND collection.slug = ${sql.lit(identity.collectionSlug)}
|
|
294
|
+
);
|
|
295
|
+
|
|
296
|
+
SELECT CASE
|
|
297
|
+
WHEN changes() <> 1 THEN RAISE(ABORT, 'media usage capture inactive')
|
|
298
|
+
END;
|
|
299
|
+
|
|
300
|
+
INSERT INTO _emdash_media_usage_work (
|
|
301
|
+
collection_id,
|
|
302
|
+
collection_slug,
|
|
303
|
+
content_id,
|
|
304
|
+
change_epoch,
|
|
305
|
+
work_version,
|
|
306
|
+
state,
|
|
307
|
+
attempt_count,
|
|
308
|
+
next_attempt_at,
|
|
309
|
+
lease_token,
|
|
310
|
+
lease_expires_at,
|
|
311
|
+
last_attempted_at,
|
|
312
|
+
last_error_code,
|
|
313
|
+
created_at,
|
|
314
|
+
updated_at
|
|
315
|
+
)
|
|
316
|
+
SELECT
|
|
317
|
+
${sql.lit(identity.collectionId)},
|
|
318
|
+
${sql.lit(identity.collectionSlug)},
|
|
319
|
+
${contentId},
|
|
320
|
+
change_epoch,
|
|
321
|
+
1,
|
|
322
|
+
'pending',
|
|
323
|
+
0,
|
|
324
|
+
strftime('%Y-%m-%dT%H:%M:%fZ', 'now'),
|
|
325
|
+
NULL,
|
|
326
|
+
NULL,
|
|
327
|
+
NULL,
|
|
328
|
+
NULL,
|
|
329
|
+
strftime('%Y-%m-%dT%H:%M:%fZ', 'now'),
|
|
330
|
+
strftime('%Y-%m-%dT%H:%M:%fZ', 'now')
|
|
331
|
+
FROM _emdash_media_usage_index_status
|
|
332
|
+
WHERE adapter_id = 'content-media'
|
|
333
|
+
AND scope_type = 'collection'
|
|
334
|
+
AND scope_key = ${sql.lit(identity.collectionSlug)}
|
|
335
|
+
AND collection_id = ${sql.lit(identity.collectionId)}
|
|
336
|
+
AND capture_state = 'active'
|
|
337
|
+
ON CONFLICT (collection_id, content_id) DO UPDATE SET
|
|
338
|
+
collection_slug = excluded.collection_slug,
|
|
339
|
+
change_epoch = excluded.change_epoch,
|
|
340
|
+
work_version = _emdash_media_usage_work.work_version + 1,
|
|
341
|
+
state = 'pending',
|
|
342
|
+
attempt_count = 0,
|
|
343
|
+
next_attempt_at = excluded.next_attempt_at,
|
|
344
|
+
lease_token = NULL,
|
|
345
|
+
lease_expires_at = NULL,
|
|
346
|
+
last_attempted_at = NULL,
|
|
347
|
+
last_error_code = NULL,
|
|
348
|
+
updated_at = excluded.updated_at;
|
|
349
|
+
END
|
|
350
|
+
`;
|
|
351
|
+
}
|
|
352
|
+
function operationSql(operation) {
|
|
353
|
+
switch (operation) {
|
|
354
|
+
case "insert": return sql`INSERT`;
|
|
355
|
+
case "update": return sql`UPDATE`;
|
|
356
|
+
case "delete": return sql`DELETE`;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
//#endregion
|
|
361
|
+
//#region src/media/usage/collection-deletion.ts
|
|
362
|
+
const ACTIVATION_KEY = "incremental_capture";
|
|
363
|
+
const VIRTUAL_DIALECT_ID = "virtual:emdash/dialect";
|
|
364
|
+
var MediaUsageCollectionDeletionRepository = class {
|
|
365
|
+
constructor(db) {
|
|
366
|
+
this.db = db;
|
|
367
|
+
}
|
|
368
|
+
async createTombstone(input) {
|
|
369
|
+
assertIdentity(input);
|
|
370
|
+
const now = timestampOffset(this.db, 0);
|
|
371
|
+
await this.db.insertInto("_emdash_media_usage_collection_deletions").values({
|
|
372
|
+
collection_id: input.collectionId,
|
|
373
|
+
collection_slug: input.collectionSlug,
|
|
374
|
+
force_delete: input.forceDelete ? 1 : 0,
|
|
375
|
+
state: "pending",
|
|
376
|
+
phase: "fence",
|
|
377
|
+
next_attempt_at: now,
|
|
378
|
+
updated_at: now
|
|
379
|
+
}).onConflict((conflict) => conflict.column("collection_id").doNothing()).execute();
|
|
380
|
+
const row = await this.db.selectFrom("_emdash_media_usage_collection_deletions").selectAll().where("collection_id", "=", input.collectionId).executeTakeFirstOrThrow();
|
|
381
|
+
if (row.collection_slug !== input.collectionSlug || Boolean(row.force_delete) !== input.forceDelete) throw new Error("Collection deletion tombstone identity conflicts with existing work");
|
|
382
|
+
return rowToRecord(row);
|
|
383
|
+
}
|
|
384
|
+
async claim(input) {
|
|
385
|
+
if (!input.collectionId || !isPhase(input.phase)) throw new Error("Collection deletion claim requires an exact identity and phase");
|
|
386
|
+
if (!Number.isSafeInteger(input.leaseDurationSeconds) || input.leaseDurationSeconds < 1) throw new Error("Collection deletion lease duration must be a positive whole number");
|
|
387
|
+
const leaseToken = ulid();
|
|
388
|
+
const row = await this.db.updateTable("_emdash_media_usage_collection_deletions").set({
|
|
389
|
+
state: "leased",
|
|
390
|
+
lease_token: leaseToken,
|
|
391
|
+
lease_expires_at: timestampOffset(this.db, input.leaseDurationSeconds),
|
|
392
|
+
updated_at: timestampOffset(this.db, 0)
|
|
393
|
+
}).where("collection_id", "=", input.collectionId).where("phase", "=", input.phase).where((eb) => eb.or([eb.and([eb("state", "in", ["pending", "retry"]), timestampIsDue(this.db, "next_attempt_at")]), eb.and([eb("state", "=", "leased"), timestampIsDue(this.db, "lease_expires_at")])])).returningAll().executeTakeFirst();
|
|
394
|
+
if (!row) return null;
|
|
395
|
+
return {
|
|
396
|
+
...rowToRecord(row),
|
|
397
|
+
leaseToken
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
async findBySlug(collectionSlug) {
|
|
401
|
+
validateIdentifier(collectionSlug, "collection slug");
|
|
402
|
+
try {
|
|
403
|
+
const row = await this.db.selectFrom("_emdash_media_usage_collection_deletions").selectAll().where("collection_slug", "=", collectionSlug).executeTakeFirst();
|
|
404
|
+
return row ? rowToRecord(row) : null;
|
|
405
|
+
} catch (error) {
|
|
406
|
+
if (isMissingTableError(error)) return null;
|
|
407
|
+
throw error;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
async findDue(limit) {
|
|
411
|
+
if (!Number.isSafeInteger(limit) || limit < 1 || limit > 100) throw new Error("Collection deletion candidate limit must be from 1 to 100");
|
|
412
|
+
const nextAttemptIsDue = timestampIsDue(this.db, "next_attempt_at");
|
|
413
|
+
return (await sql`
|
|
414
|
+
WITH pending_candidates AS (
|
|
415
|
+
SELECT * FROM _emdash_media_usage_collection_deletions
|
|
416
|
+
WHERE state = 'pending' AND ${nextAttemptIsDue}
|
|
417
|
+
ORDER BY next_attempt_at, updated_at, collection_id
|
|
418
|
+
LIMIT ${limit}
|
|
419
|
+
), retry_candidates AS (
|
|
420
|
+
SELECT * FROM _emdash_media_usage_collection_deletions
|
|
421
|
+
WHERE state = 'retry' AND ${nextAttemptIsDue}
|
|
422
|
+
ORDER BY next_attempt_at, updated_at, collection_id
|
|
423
|
+
LIMIT ${limit}
|
|
424
|
+
), leased_candidates AS (
|
|
425
|
+
SELECT * FROM _emdash_media_usage_collection_deletions
|
|
426
|
+
WHERE state = 'leased' AND ${timestampIsDue(this.db, "lease_expires_at")}
|
|
427
|
+
ORDER BY lease_expires_at, updated_at, collection_id
|
|
428
|
+
LIMIT ${limit}
|
|
429
|
+
), candidates AS (
|
|
430
|
+
SELECT * FROM pending_candidates
|
|
431
|
+
UNION ALL SELECT * FROM retry_candidates
|
|
432
|
+
UNION ALL SELECT * FROM leased_candidates
|
|
433
|
+
)
|
|
434
|
+
SELECT * FROM candidates
|
|
435
|
+
ORDER BY CASE WHEN state = 'leased' THEN lease_expires_at ELSE next_attempt_at END,
|
|
436
|
+
updated_at,
|
|
437
|
+
collection_id
|
|
438
|
+
LIMIT ${limit}
|
|
439
|
+
`.execute(this.db)).rows.map(rowToRecord);
|
|
440
|
+
}
|
|
441
|
+
async findOperatorPage(options) {
|
|
442
|
+
const state = options.state ?? "failed";
|
|
443
|
+
if (!isState(state)) throw new Error("Invalid collection deletion state");
|
|
444
|
+
const limit = options.limit ?? 50;
|
|
445
|
+
if (!Number.isSafeInteger(limit) || limit < 1 || limit > 100) throw new Error("Collection deletion operator limit must be from 1 to 100");
|
|
446
|
+
const cursor = options.cursor ? decodeCursor(options.cursor) : null;
|
|
447
|
+
let query = this.db.selectFrom("_emdash_media_usage_collection_deletions").selectAll().where("state", "=", state);
|
|
448
|
+
if (cursor) query = query.where((eb) => eb.or([eb("updated_at", "<", cursor.orderValue), eb.and([eb("updated_at", "=", cursor.orderValue), eb("collection_id", "<", cursor.id)])]));
|
|
449
|
+
const rows = await query.orderBy("updated_at", "desc").orderBy("collection_id", "desc").limit(limit + 1).execute();
|
|
450
|
+
const items = rows.slice(0, limit).map(rowToOperatorItem);
|
|
451
|
+
const result = { items };
|
|
452
|
+
if (rows.length > limit && items.length > 0) {
|
|
453
|
+
const last = items.at(-1);
|
|
454
|
+
result.nextCursor = encodeCursor(last.updatedAt, last.collectionId);
|
|
455
|
+
}
|
|
456
|
+
return result;
|
|
457
|
+
}
|
|
458
|
+
async retryOperatorDeletion(input) {
|
|
459
|
+
if (!input.collectionId) throw new Error("Collection deletion retry requires an ID");
|
|
460
|
+
const observed = await this.db.selectFrom("_emdash_media_usage_collection_deletions").selectAll().where("collection_id", "=", input.collectionId).executeTakeFirst();
|
|
461
|
+
if (!observed) return { outcome: "not_found" };
|
|
462
|
+
if (observed.state === "leased" && observed.lease_expires_at) {
|
|
463
|
+
const live = await this.db.selectFrom("_emdash_media_usage_collection_deletions").select("lease_expires_at").where("collection_id", "=", input.collectionId).where("state", "=", "leased").where(liveLease(this.db)).executeTakeFirst();
|
|
464
|
+
if (live?.lease_expires_at) return {
|
|
465
|
+
outcome: "lease_active",
|
|
466
|
+
leaseExpiresAt: live.lease_expires_at
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
const now = timestampOffset(this.db, 0);
|
|
470
|
+
const reopened = await this.db.updateTable("_emdash_media_usage_collection_deletions").set({
|
|
471
|
+
state: "pending",
|
|
472
|
+
attempt_count: 0,
|
|
473
|
+
next_attempt_at: now,
|
|
474
|
+
lease_token: null,
|
|
475
|
+
lease_expires_at: null,
|
|
476
|
+
last_error_code: null,
|
|
477
|
+
updated_at: now
|
|
478
|
+
}).where("collection_id", "=", input.collectionId).where((eb) => eb.or([eb("state", "in", ["failed", "retry"]), eb.and([eb("state", "=", "leased"), timestampIsDue(this.db, "lease_expires_at")])])).returningAll().executeTakeFirst();
|
|
479
|
+
if (reopened) return {
|
|
480
|
+
outcome: "pending",
|
|
481
|
+
changed: true,
|
|
482
|
+
item: rowToOperatorItem(reopened)
|
|
483
|
+
};
|
|
484
|
+
return { outcome: "conflict" };
|
|
485
|
+
}
|
|
486
|
+
async checkpoint(input) {
|
|
487
|
+
const result = await this.db.updateTable("_emdash_media_usage_collection_deletions").set({
|
|
488
|
+
phase: input.toPhase,
|
|
489
|
+
attempt_count: 0,
|
|
490
|
+
last_error_code: null,
|
|
491
|
+
updated_at: timestampOffset(this.db, 0)
|
|
492
|
+
}).where("collection_id", "=", input.collectionId).where("state", "=", "leased").where("phase", "=", input.fromPhase).where("lease_token", "=", input.leaseToken).where(liveLease(this.db)).executeTakeFirst();
|
|
493
|
+
return Number(result.numUpdatedRows ?? 0) === 1;
|
|
494
|
+
}
|
|
495
|
+
async release(input) {
|
|
496
|
+
const now = timestampOffset(this.db, 0);
|
|
497
|
+
const result = await this.db.updateTable("_emdash_media_usage_collection_deletions").set({
|
|
498
|
+
state: "pending",
|
|
499
|
+
next_attempt_at: now,
|
|
500
|
+
lease_token: null,
|
|
501
|
+
lease_expires_at: null,
|
|
502
|
+
attempt_count: 0,
|
|
503
|
+
last_error_code: null,
|
|
504
|
+
updated_at: now
|
|
505
|
+
}).where("collection_id", "=", input.collectionId).where("state", "=", "leased").where("lease_token", "=", input.leaseToken).where(liveLease(this.db)).executeTakeFirst();
|
|
506
|
+
return Number(result.numUpdatedRows ?? 0) === 1;
|
|
507
|
+
}
|
|
508
|
+
async cancelFence(input) {
|
|
509
|
+
const result = await this.db.deleteFrom("_emdash_media_usage_collection_deletions").where("collection_id", "=", input.collectionId).where("state", "=", "leased").where("phase", "=", "fence").where("lease_token", "=", input.leaseToken).where(liveLease(this.db)).executeTakeFirst();
|
|
510
|
+
return Number(result.numDeletedRows ?? 0) === 1;
|
|
511
|
+
}
|
|
512
|
+
async recordFailure(input) {
|
|
513
|
+
const result = await this.db.updateTable("_emdash_media_usage_collection_deletions").set({
|
|
514
|
+
state: input.terminal ? "failed" : "retry",
|
|
515
|
+
attempt_count: sql`attempt_count + 1`,
|
|
516
|
+
next_attempt_at: timestampOffset(this.db, input.retryDelaySeconds),
|
|
517
|
+
lease_token: null,
|
|
518
|
+
lease_expires_at: null,
|
|
519
|
+
last_error_code: input.errorCode,
|
|
520
|
+
updated_at: timestampOffset(this.db, 0)
|
|
521
|
+
}).where("collection_id", "=", input.collectionId).where("state", "=", "leased").where("lease_token", "=", input.leaseToken).where(liveLease(this.db)).executeTakeFirst();
|
|
522
|
+
return Number(result.numUpdatedRows ?? 0) === 1;
|
|
523
|
+
}
|
|
524
|
+
async deleteRegistryAndCheckpoint(input) {
|
|
525
|
+
return withTransaction(this.db, async (trx) => {
|
|
526
|
+
await trx.deleteFrom("_emdash_collections").where("id", "=", input.collectionId).where("slug", "=", input.collectionSlug).where((eb) => eb.exists(eb.selectFrom("_emdash_media_usage_collection_deletions as deletion").select("deletion.collection_id").where("deletion.collection_id", "=", input.collectionId).where("deletion.collection_slug", "=", input.collectionSlug).where("deletion.state", "=", "leased").where("deletion.phase", "=", "registry").where("deletion.lease_token", "=", input.leaseToken).where(liveLease(trx, "deletion.lease_expires_at")))).execute();
|
|
527
|
+
const checkpoint = await trx.updateTable("_emdash_media_usage_collection_deletions").set({
|
|
528
|
+
phase: "table",
|
|
529
|
+
updated_at: timestampOffset(trx, 0)
|
|
530
|
+
}).where("collection_id", "=", input.collectionId).where("collection_slug", "=", input.collectionSlug).where("state", "=", "leased").where("phase", "=", "registry").where("lease_token", "=", input.leaseToken).where(liveLease(trx)).executeTakeFirst();
|
|
531
|
+
return Number(checkpoint.numUpdatedRows ?? 0) === 1;
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
};
|
|
535
|
+
async function deleteActivatedMediaUsageCollection(db, input, options = {}) {
|
|
536
|
+
const frontPhaseLimit = options.frontPhaseLimit ?? 3;
|
|
537
|
+
if (!Number.isSafeInteger(frontPhaseLimit) || frontPhaseLimit < 1 || frontPhaseLimit > 3) throw new Error("Collection deletion front-phase limit must be from 1 to 3");
|
|
538
|
+
validateIdentifier(input.collectionSlug, "collection slug");
|
|
539
|
+
const repository = new MediaUsageCollectionDeletionRepository(db);
|
|
540
|
+
let deletion = await repository.findBySlug(input.collectionSlug);
|
|
541
|
+
if (deletion && input.collectionId && deletion.collectionId !== input.collectionId) throw new Error("Collection deletion tombstone identity conflict");
|
|
542
|
+
if (!deletion) {
|
|
543
|
+
let activation;
|
|
544
|
+
try {
|
|
545
|
+
activation = await db.selectFrom("_emdash_media_usage_activation").select("state").where("task_key", "=", ACTIVATION_KEY).executeTakeFirst();
|
|
546
|
+
} catch (error) {
|
|
547
|
+
if (!isMissingTableError(error)) throw error;
|
|
548
|
+
}
|
|
549
|
+
if (!activation || activation.state === "expanded") return "inactive";
|
|
550
|
+
if (activation.state !== "active") throw new Error("Media usage activation must be active before collection deletion");
|
|
551
|
+
if (!input.collectionId) return "not_found";
|
|
552
|
+
await assertActivatedCollectionDeletionReady(db, {
|
|
553
|
+
collectionId: input.collectionId,
|
|
554
|
+
collectionSlug: input.collectionSlug
|
|
555
|
+
});
|
|
556
|
+
deletion = await repository.createTombstone({
|
|
557
|
+
collectionId: input.collectionId,
|
|
558
|
+
collectionSlug: input.collectionSlug,
|
|
559
|
+
forceDelete: input.forceDelete
|
|
560
|
+
});
|
|
561
|
+
}
|
|
562
|
+
if (deletion.phase !== "fence" && deletion.phase !== "registry" && deletion.phase !== "table") return "deleted";
|
|
563
|
+
const claim = options.claimed ?? await repository.claim({
|
|
564
|
+
collectionId: deletion.collectionId,
|
|
565
|
+
phase: deletion.phase,
|
|
566
|
+
leaseDurationSeconds: 300
|
|
567
|
+
});
|
|
568
|
+
if (!claim) return "in_progress";
|
|
569
|
+
if (claim.collectionId !== deletion.collectionId || claim.phase !== deletion.phase) throw new Error("Collection deletion claim identity conflict");
|
|
570
|
+
let phase = claim.phase;
|
|
571
|
+
let processedFrontPhases = 0;
|
|
572
|
+
const lease = {
|
|
573
|
+
collectionId: claim.collectionId,
|
|
574
|
+
leaseToken: claim.leaseToken
|
|
575
|
+
};
|
|
576
|
+
if (phase === "fence") {
|
|
577
|
+
const captureState = await findCollectionCaptureState(db, claim);
|
|
578
|
+
if (captureState !== "active" && captureState !== "deleting") throw new Error("Activated collection deletion requires a fenced capture lifecycle");
|
|
579
|
+
if (!await verifyMediaUsageCaptureTriggers(db, claim)) throw new Error("Activated collection deletion requires the exact capture trigger set");
|
|
580
|
+
if (captureState === "active") {
|
|
581
|
+
const result = await executeCollectionDeletionGuard(db, {
|
|
582
|
+
action: "fence",
|
|
583
|
+
collectionId: claim.collectionId,
|
|
584
|
+
collectionSlug: claim.collectionSlug,
|
|
585
|
+
leaseToken: claim.leaseToken,
|
|
586
|
+
forceDelete: claim.forceDelete
|
|
587
|
+
});
|
|
588
|
+
if (result.outcome === "has_content") {
|
|
589
|
+
if (!await repository.cancelFence(lease)) throw new Error("Collection deletion lost its fence while preserving content");
|
|
590
|
+
return "has_content";
|
|
591
|
+
}
|
|
592
|
+
if (result.outcome !== "fenced") throw new Error("Collection deletion lost its fence");
|
|
593
|
+
}
|
|
594
|
+
if (!await repository.checkpoint({
|
|
595
|
+
...lease,
|
|
596
|
+
fromPhase: "fence",
|
|
597
|
+
toPhase: "registry"
|
|
598
|
+
})) throw new Error("Collection deletion lost its fence checkpoint");
|
|
599
|
+
phase = "registry";
|
|
600
|
+
processedFrontPhases++;
|
|
601
|
+
if (processedFrontPhases >= frontPhaseLimit) {
|
|
602
|
+
if (!await repository.release(lease)) throw new Error("Collection deletion lost its handoff");
|
|
603
|
+
return "advanced";
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
if (phase === "registry") {
|
|
607
|
+
if (!await repository.deleteRegistryAndCheckpoint({
|
|
608
|
+
...lease,
|
|
609
|
+
collectionSlug: claim.collectionSlug
|
|
610
|
+
})) throw new Error("Collection deletion lost its registry checkpoint");
|
|
611
|
+
phase = "table";
|
|
612
|
+
processedFrontPhases++;
|
|
613
|
+
if (processedFrontPhases >= frontPhaseLimit) {
|
|
614
|
+
if (!await repository.release(lease)) throw new Error("Collection deletion lost its handoff");
|
|
615
|
+
return "advanced";
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
if (phase === "table") {
|
|
619
|
+
if ((await executeCollectionDeletionGuard(db, {
|
|
620
|
+
action: "drop",
|
|
621
|
+
collectionId: claim.collectionId,
|
|
622
|
+
collectionSlug: claim.collectionSlug,
|
|
623
|
+
leaseToken: claim.leaseToken
|
|
624
|
+
})).outcome !== "dropped") throw new Error("Collection deletion lost its table fence");
|
|
625
|
+
if (!await repository.checkpoint({
|
|
626
|
+
...lease,
|
|
627
|
+
fromPhase: "table",
|
|
628
|
+
toPhase: "work"
|
|
629
|
+
})) throw new Error("Collection deletion lost its table checkpoint");
|
|
630
|
+
}
|
|
631
|
+
if (!await repository.release(lease)) throw new Error("Collection deletion lost its cleanup handoff");
|
|
632
|
+
return "deleted";
|
|
633
|
+
}
|
|
634
|
+
async function isMediaUsageCollectionSlugDeleting(db, collectionSlug) {
|
|
635
|
+
validateIdentifier(collectionSlug, "collection slug");
|
|
636
|
+
try {
|
|
637
|
+
return await db.selectFrom("_emdash_media_usage_collection_deletions").select("collection_id").where("collection_slug", "=", collectionSlug).executeTakeFirst() !== void 0;
|
|
638
|
+
} catch (error) {
|
|
639
|
+
if (isMissingTableError(error)) return false;
|
|
640
|
+
throw error;
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
async function assertActivatedCollectionDeletionReady(db, identity) {
|
|
644
|
+
if (await findCollectionCaptureState(db, identity) !== "active") throw new Error("Activated collection deletion requires an active capture lifecycle");
|
|
645
|
+
if (!await verifyMediaUsageCaptureTriggers(db, identity)) throw new Error("Activated collection deletion requires the exact capture trigger set");
|
|
646
|
+
}
|
|
647
|
+
async function findCollectionCaptureState(db, identity) {
|
|
648
|
+
return (await db.selectFrom("_emdash_media_usage_index_status").select("capture_state").where("adapter_id", "=", "content-media").where("scope_type", "=", "collection").where("scope_key", "=", identity.collectionSlug).where("collection_id", "=", identity.collectionId).executeTakeFirst())?.capture_state ?? null;
|
|
649
|
+
}
|
|
650
|
+
async function executeCollectionDeletionGuard(db, input) {
|
|
651
|
+
const executeAdapterGuard = await loadAdapterCollectionDeletionGuard();
|
|
652
|
+
if (executeAdapterGuard) {
|
|
653
|
+
const { default: config } = await import("virtual:emdash/config");
|
|
654
|
+
return executeAdapterGuard(config.database?.config, input);
|
|
655
|
+
}
|
|
656
|
+
return executeLocalCollectionDeletionGuard(db, input);
|
|
657
|
+
}
|
|
658
|
+
async function loadAdapterCollectionDeletionGuard() {
|
|
659
|
+
try {
|
|
660
|
+
return (await import("virtual:emdash/dialect")).executeCollectionDeletionGuard;
|
|
661
|
+
} catch (error) {
|
|
662
|
+
if (isVirtualDialectUnavailableError(error)) return void 0;
|
|
663
|
+
throw error;
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
function isVirtualDialectUnavailableError(error) {
|
|
667
|
+
if (!(error instanceof Error) || !("code" in error)) return false;
|
|
668
|
+
if (error.code === "ERR_MODULE_NOT_FOUND") return error.message.includes(VIRTUAL_DIALECT_ID);
|
|
669
|
+
return error.code === "ERR_UNSUPPORTED_ESM_URL_SCHEME" && error.message.includes("Received protocol 'virtual:'");
|
|
670
|
+
}
|
|
671
|
+
async function executeLocalCollectionDeletionGuard(db, input) {
|
|
672
|
+
assertGuardInput(input);
|
|
673
|
+
return db.transaction().execute(async (trx) => {
|
|
674
|
+
if (!await lockLiveTombstone(trx, input)) return { outcome: "stale" };
|
|
675
|
+
if (input.action === "fence") return fenceCollection(trx, input);
|
|
676
|
+
await new FTSManager(trx).dropFtsTable(input.collectionSlug);
|
|
677
|
+
await sql`DROP TABLE IF EXISTS ${sql.ref(`ec_${input.collectionSlug}`)}`.execute(trx);
|
|
678
|
+
return { outcome: "dropped" };
|
|
679
|
+
});
|
|
680
|
+
}
|
|
681
|
+
async function fenceCollection(trx, input) {
|
|
682
|
+
const tableName = `ec_${input.collectionSlug}`;
|
|
683
|
+
validateIdentifier(tableName, "content table");
|
|
684
|
+
if (isPostgres(trx)) await sql`LOCK TABLE ${sql.ref(tableName)} IN SHARE ROW EXCLUSIVE MODE`.execute(trx);
|
|
685
|
+
if (!input.forceDelete) {
|
|
686
|
+
if ((await sql`
|
|
687
|
+
SELECT 1 AS present FROM ${sql.ref(tableName)}
|
|
688
|
+
WHERE deleted_at IS NULL
|
|
689
|
+
LIMIT 1
|
|
690
|
+
`.execute(trx)).rows.length > 0) return { outcome: "has_content" };
|
|
691
|
+
}
|
|
692
|
+
const result = await trx.updateTable("_emdash_media_usage_index_status as status").set({
|
|
693
|
+
capture_state: "deleting",
|
|
694
|
+
updated_at: timestampOffset(trx, 0)
|
|
695
|
+
}).where("status.adapter_id", "=", "content-media").where("status.scope_type", "=", "collection").where("status.scope_key", "=", input.collectionSlug).where("status.collection_id", "=", input.collectionId).where("status.capture_state", "=", "active").where((eb) => eb.exists(eb.selectFrom("_emdash_collections as collection").select("collection.id").where("collection.id", "=", input.collectionId).where("collection.slug", "=", input.collectionSlug))).executeTakeFirst();
|
|
696
|
+
return Number(result.numUpdatedRows ?? 0) === 1 ? { outcome: "fenced" } : { outcome: "stale" };
|
|
697
|
+
}
|
|
698
|
+
async function lockLiveTombstone(trx, input) {
|
|
699
|
+
const phase = input.action === "fence" ? "fence" : "table";
|
|
700
|
+
if (isPostgres(trx)) return await trx.selectFrom("_emdash_media_usage_collection_deletions").select("collection_id").where("collection_id", "=", input.collectionId).where("collection_slug", "=", input.collectionSlug).where("state", "=", "leased").where("phase", "=", phase).where("lease_token", "=", input.leaseToken).where(liveLease(trx)).forUpdate().executeTakeFirst() !== void 0;
|
|
701
|
+
const locked = await trx.updateTable("_emdash_media_usage_collection_deletions").set({ updated_at: sql`updated_at` }).where("collection_id", "=", input.collectionId).where("collection_slug", "=", input.collectionSlug).where("state", "=", "leased").where("phase", "=", phase).where("lease_token", "=", input.leaseToken).where(liveLease(trx)).executeTakeFirst();
|
|
702
|
+
return Number(locked.numUpdatedRows ?? 0) === 1;
|
|
703
|
+
}
|
|
704
|
+
function assertIdentity(input) {
|
|
705
|
+
if (!input.collectionId) throw new Error("Collection deletion requires a collection ID");
|
|
706
|
+
validateIdentifier(input.collectionSlug, "collection slug");
|
|
707
|
+
}
|
|
708
|
+
function assertGuardInput(input) {
|
|
709
|
+
assertIdentity(input);
|
|
710
|
+
if (!input.leaseToken) throw new Error("Collection deletion requires a lease token");
|
|
711
|
+
}
|
|
712
|
+
function liveLease(db, column = "lease_expires_at") {
|
|
713
|
+
const leaseExpiresAt = sql.ref(column);
|
|
714
|
+
return isPostgres(db) ? sql`${leaseExpiresAt}::timestamptz > clock_timestamp()` : sql`${leaseExpiresAt} > strftime('%Y-%m-%dT%H:%M:%fZ', 'now')`;
|
|
715
|
+
}
|
|
716
|
+
function timestampIsDue(db, column) {
|
|
717
|
+
return isPostgres(db) ? sql`${sql.ref(column)} <= to_char(
|
|
718
|
+
statement_timestamp() AT TIME ZONE 'UTC',
|
|
719
|
+
'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"'
|
|
720
|
+
)` : sql`${sql.ref(column)} <= strftime('%Y-%m-%dT%H:%M:%fZ', 'now')`;
|
|
721
|
+
}
|
|
722
|
+
function timestampOffset(db, offsetSeconds) {
|
|
723
|
+
if (isPostgres(db)) return sql`to_char(
|
|
724
|
+
(clock_timestamp() AT TIME ZONE 'UTC') + (${offsetSeconds} * INTERVAL '1 second'),
|
|
725
|
+
'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"'
|
|
726
|
+
)`;
|
|
727
|
+
return sql`strftime(
|
|
728
|
+
'%Y-%m-%dT%H:%M:%fZ',
|
|
729
|
+
'now',
|
|
730
|
+
${`${offsetSeconds >= 0 ? "+" : ""}${offsetSeconds} seconds`}
|
|
731
|
+
)`;
|
|
732
|
+
}
|
|
733
|
+
function collectionDeletionCurrentTimestamp(db) {
|
|
734
|
+
return timestampOffset(db, 0);
|
|
735
|
+
}
|
|
736
|
+
function rowToRecord(row) {
|
|
737
|
+
if (!isState(row.state) || !isPhase(row.phase)) throw new Error("Invalid media usage collection deletion lifecycle");
|
|
738
|
+
return {
|
|
739
|
+
collectionId: row.collection_id,
|
|
740
|
+
collectionSlug: row.collection_slug,
|
|
741
|
+
forceDelete: Boolean(row.force_delete),
|
|
742
|
+
state: row.state,
|
|
743
|
+
phase: row.phase,
|
|
744
|
+
workCursor: row.work_cursor,
|
|
745
|
+
sourceKey: row.source_key,
|
|
746
|
+
occurrenceCursor: row.occurrence_cursor,
|
|
747
|
+
attemptCount: row.attempt_count,
|
|
748
|
+
nextAttemptAt: row.next_attempt_at,
|
|
749
|
+
leaseToken: row.lease_token,
|
|
750
|
+
leaseExpiresAt: row.lease_expires_at,
|
|
751
|
+
lastErrorCode: row.last_error_code,
|
|
752
|
+
createdAt: row.created_at,
|
|
753
|
+
updatedAt: row.updated_at
|
|
754
|
+
};
|
|
755
|
+
}
|
|
756
|
+
function rowToOperatorItem(row) {
|
|
757
|
+
const deletion = rowToRecord(row);
|
|
758
|
+
return {
|
|
759
|
+
collectionId: deletion.collectionId,
|
|
760
|
+
collectionSlug: deletion.collectionSlug,
|
|
761
|
+
state: deletion.state,
|
|
762
|
+
phase: deletion.phase,
|
|
763
|
+
attemptCount: deletion.attemptCount,
|
|
764
|
+
nextAttemptAt: deletion.nextAttemptAt,
|
|
765
|
+
leaseExpiresAt: deletion.leaseExpiresAt,
|
|
766
|
+
lastErrorCode: deletion.lastErrorCode,
|
|
767
|
+
updatedAt: deletion.updatedAt
|
|
768
|
+
};
|
|
769
|
+
}
|
|
770
|
+
function isState(value) {
|
|
771
|
+
return value === "pending" || value === "retry" || value === "leased" || value === "failed";
|
|
772
|
+
}
|
|
773
|
+
function isPhase(value) {
|
|
774
|
+
return value === "fence" || value === "registry" || value === "table" || value === "work" || value === "sources" || value === "status" || value === "finalize";
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
//#endregion
|
|
778
|
+
export { installMediaUsageCaptureTriggers as a, isMediaUsageCollectionSlugDeleting as i, collectionDeletionCurrentTimestamp as n, verifyMediaUsageCaptureTriggers as o, deleteActivatedMediaUsageCollection as r, MediaUsageCollectionDeletionRepository as t };
|
|
779
|
+
//# sourceMappingURL=collection-deletion-C8BugSGz.mjs.map
|