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,295 @@
|
|
|
1
|
+
import { sql, type Kysely } from "kysely";
|
|
2
|
+
|
|
3
|
+
import { columnExists, currentTimestamp, isPostgres } from "../dialect-helpers.js";
|
|
4
|
+
|
|
5
|
+
export async function up(db: Kysely<unknown>): Promise<void> {
|
|
6
|
+
if (!(await columnExists(db, "_emdash_media_usage", "cleanup_lease_token"))) {
|
|
7
|
+
await db.schema
|
|
8
|
+
.alterTable("_emdash_media_usage")
|
|
9
|
+
.addColumn("cleanup_lease_token", "text")
|
|
10
|
+
.execute();
|
|
11
|
+
}
|
|
12
|
+
await db.schema
|
|
13
|
+
.createTable("_emdash_media_usage_cleanup_fence")
|
|
14
|
+
.ifNotExists()
|
|
15
|
+
.addColumn("task_key", "text", (c) => c.primaryKey())
|
|
16
|
+
.addColumn("generation_floor", "text", (c) => c.notNull())
|
|
17
|
+
.addColumn("updated_at", "text", (c) => c.notNull().defaultTo(currentTimestamp(db)))
|
|
18
|
+
.execute();
|
|
19
|
+
|
|
20
|
+
if (isPostgres(db)) {
|
|
21
|
+
await sql
|
|
22
|
+
.raw("DROP TRIGGER IF EXISTS emdash_media_usage_record_cleanup_fence ON _emdash_media_usage")
|
|
23
|
+
.execute(db);
|
|
24
|
+
await sql
|
|
25
|
+
.raw(
|
|
26
|
+
"DROP TRIGGER IF EXISTS emdash_media_usage_fence_source_generation_update ON _emdash_media_usage_sources",
|
|
27
|
+
)
|
|
28
|
+
.execute(db);
|
|
29
|
+
await sql
|
|
30
|
+
.raw(
|
|
31
|
+
"DROP TRIGGER IF EXISTS emdash_media_usage_fence_source_generation_insert ON _emdash_media_usage_sources",
|
|
32
|
+
)
|
|
33
|
+
.execute(db);
|
|
34
|
+
await sql
|
|
35
|
+
.raw(
|
|
36
|
+
"DROP TRIGGER IF EXISTS emdash_media_usage_lock_cleanup_update ON _emdash_media_usage_sources",
|
|
37
|
+
)
|
|
38
|
+
.execute(db);
|
|
39
|
+
await sql
|
|
40
|
+
.raw(
|
|
41
|
+
"DROP TRIGGER IF EXISTS emdash_media_usage_lock_cleanup_insert ON _emdash_media_usage_sources",
|
|
42
|
+
)
|
|
43
|
+
.execute(db);
|
|
44
|
+
await sql
|
|
45
|
+
.raw(
|
|
46
|
+
"DROP TRIGGER IF EXISTS emdash_media_usage_lock_cleanup_delete ON _emdash_media_usage_sources",
|
|
47
|
+
)
|
|
48
|
+
.execute(db);
|
|
49
|
+
await sql
|
|
50
|
+
.raw(`
|
|
51
|
+
CREATE OR REPLACE FUNCTION emdash_media_usage_lock_cleanup()
|
|
52
|
+
RETURNS trigger
|
|
53
|
+
LANGUAGE plpgsql
|
|
54
|
+
AS $$
|
|
55
|
+
BEGIN
|
|
56
|
+
PERFORM 1
|
|
57
|
+
FROM _emdash_media_usage_cleanup AS cleanup
|
|
58
|
+
WHERE cleanup.task_key = 'projection_gc'
|
|
59
|
+
FOR SHARE;
|
|
60
|
+
RETURN NULL;
|
|
61
|
+
END;
|
|
62
|
+
$$
|
|
63
|
+
`)
|
|
64
|
+
.execute(db);
|
|
65
|
+
await sql
|
|
66
|
+
.raw(`
|
|
67
|
+
CREATE OR REPLACE FUNCTION emdash_media_usage_fence_source_generation()
|
|
68
|
+
RETURNS trigger
|
|
69
|
+
LANGUAGE plpgsql
|
|
70
|
+
AS $$
|
|
71
|
+
BEGIN
|
|
72
|
+
IF EXISTS (
|
|
73
|
+
SELECT 1
|
|
74
|
+
FROM _emdash_media_usage_cleanup_fence AS fence
|
|
75
|
+
WHERE fence.task_key = 'projection_gc'
|
|
76
|
+
AND NEW.current_generation <= fence.generation_floor
|
|
77
|
+
) AND NOT EXISTS (
|
|
78
|
+
SELECT 1
|
|
79
|
+
FROM _emdash_media_usage_generation_writes AS writer
|
|
80
|
+
WHERE writer.source_key = NEW.source_key
|
|
81
|
+
AND writer.generation = NEW.current_generation
|
|
82
|
+
AND writer.expires_at::timestamptz > clock_timestamp()
|
|
83
|
+
) THEN
|
|
84
|
+
RETURN NULL;
|
|
85
|
+
END IF;
|
|
86
|
+
RETURN NEW;
|
|
87
|
+
END;
|
|
88
|
+
$$
|
|
89
|
+
`)
|
|
90
|
+
.execute(db);
|
|
91
|
+
await sql
|
|
92
|
+
.raw(`
|
|
93
|
+
CREATE TRIGGER emdash_media_usage_lock_cleanup_insert
|
|
94
|
+
BEFORE INSERT ON _emdash_media_usage_sources
|
|
95
|
+
FOR EACH STATEMENT
|
|
96
|
+
EXECUTE FUNCTION emdash_media_usage_lock_cleanup()
|
|
97
|
+
`)
|
|
98
|
+
.execute(db);
|
|
99
|
+
await sql
|
|
100
|
+
.raw(`
|
|
101
|
+
CREATE TRIGGER emdash_media_usage_lock_cleanup_update
|
|
102
|
+
BEFORE UPDATE OF current_generation ON _emdash_media_usage_sources
|
|
103
|
+
FOR EACH STATEMENT
|
|
104
|
+
EXECUTE FUNCTION emdash_media_usage_lock_cleanup()
|
|
105
|
+
`)
|
|
106
|
+
.execute(db);
|
|
107
|
+
await sql
|
|
108
|
+
.raw(`
|
|
109
|
+
CREATE TRIGGER emdash_media_usage_lock_cleanup_delete
|
|
110
|
+
BEFORE DELETE ON _emdash_media_usage_sources
|
|
111
|
+
FOR EACH STATEMENT
|
|
112
|
+
EXECUTE FUNCTION emdash_media_usage_lock_cleanup()
|
|
113
|
+
`)
|
|
114
|
+
.execute(db);
|
|
115
|
+
await sql
|
|
116
|
+
.raw(`
|
|
117
|
+
CREATE OR REPLACE FUNCTION emdash_media_usage_record_cleanup_fence()
|
|
118
|
+
RETURNS trigger
|
|
119
|
+
LANGUAGE plpgsql
|
|
120
|
+
AS $$
|
|
121
|
+
BEGIN
|
|
122
|
+
IF OLD.cleanup_lease_token IS NOT NULL AND EXISTS (
|
|
123
|
+
SELECT 1
|
|
124
|
+
FROM _emdash_media_usage_cleanup AS cleanup
|
|
125
|
+
WHERE cleanup.task_key = 'projection_gc'
|
|
126
|
+
AND cleanup.lease_token = OLD.cleanup_lease_token
|
|
127
|
+
) THEN
|
|
128
|
+
INSERT INTO _emdash_media_usage_cleanup_fence (
|
|
129
|
+
task_key,
|
|
130
|
+
generation_floor,
|
|
131
|
+
updated_at
|
|
132
|
+
)
|
|
133
|
+
VALUES ('projection_gc', OLD.generation, CURRENT_TIMESTAMP::text)
|
|
134
|
+
ON CONFLICT (task_key) DO UPDATE SET
|
|
135
|
+
generation_floor = CASE
|
|
136
|
+
WHEN EXCLUDED.generation_floor > _emdash_media_usage_cleanup_fence.generation_floor
|
|
137
|
+
THEN EXCLUDED.generation_floor
|
|
138
|
+
ELSE _emdash_media_usage_cleanup_fence.generation_floor
|
|
139
|
+
END,
|
|
140
|
+
updated_at = EXCLUDED.updated_at;
|
|
141
|
+
END IF;
|
|
142
|
+
RETURN OLD;
|
|
143
|
+
END;
|
|
144
|
+
$$
|
|
145
|
+
`)
|
|
146
|
+
.execute(db);
|
|
147
|
+
await sql
|
|
148
|
+
.raw(`
|
|
149
|
+
CREATE TRIGGER emdash_media_usage_fence_source_generation_insert
|
|
150
|
+
BEFORE INSERT ON _emdash_media_usage_sources
|
|
151
|
+
FOR EACH ROW
|
|
152
|
+
EXECUTE FUNCTION emdash_media_usage_fence_source_generation()
|
|
153
|
+
`)
|
|
154
|
+
.execute(db);
|
|
155
|
+
await sql
|
|
156
|
+
.raw(`
|
|
157
|
+
CREATE TRIGGER emdash_media_usage_fence_source_generation_update
|
|
158
|
+
BEFORE UPDATE OF current_generation ON _emdash_media_usage_sources
|
|
159
|
+
FOR EACH ROW
|
|
160
|
+
EXECUTE FUNCTION emdash_media_usage_fence_source_generation()
|
|
161
|
+
`)
|
|
162
|
+
.execute(db);
|
|
163
|
+
await sql
|
|
164
|
+
.raw(`
|
|
165
|
+
CREATE TRIGGER emdash_media_usage_record_cleanup_fence
|
|
166
|
+
BEFORE DELETE ON _emdash_media_usage
|
|
167
|
+
FOR EACH ROW
|
|
168
|
+
WHEN (OLD.cleanup_lease_token IS NOT NULL)
|
|
169
|
+
EXECUTE FUNCTION emdash_media_usage_record_cleanup_fence()
|
|
170
|
+
`)
|
|
171
|
+
.execute(db);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
await sql
|
|
176
|
+
.raw(`
|
|
177
|
+
CREATE TRIGGER IF NOT EXISTS emdash_media_usage_fence_source_generation_insert
|
|
178
|
+
BEFORE INSERT ON _emdash_media_usage_sources
|
|
179
|
+
WHEN EXISTS (
|
|
180
|
+
SELECT 1
|
|
181
|
+
FROM _emdash_media_usage_cleanup_fence AS fence
|
|
182
|
+
WHERE fence.task_key = 'projection_gc'
|
|
183
|
+
AND NEW.current_generation <= fence.generation_floor
|
|
184
|
+
) AND NOT EXISTS (
|
|
185
|
+
SELECT 1
|
|
186
|
+
FROM _emdash_media_usage_generation_writes AS writer
|
|
187
|
+
WHERE writer.source_key = NEW.source_key
|
|
188
|
+
AND writer.generation = NEW.current_generation
|
|
189
|
+
AND writer.expires_at > strftime('%Y-%m-%dT%H:%M:%fZ', 'now')
|
|
190
|
+
)
|
|
191
|
+
BEGIN
|
|
192
|
+
SELECT RAISE(IGNORE);
|
|
193
|
+
END
|
|
194
|
+
`)
|
|
195
|
+
.execute(db);
|
|
196
|
+
await sql
|
|
197
|
+
.raw(`
|
|
198
|
+
CREATE TRIGGER IF NOT EXISTS emdash_media_usage_fence_source_generation_update
|
|
199
|
+
BEFORE UPDATE OF current_generation ON _emdash_media_usage_sources
|
|
200
|
+
WHEN NEW.current_generation <> OLD.current_generation
|
|
201
|
+
AND EXISTS (
|
|
202
|
+
SELECT 1
|
|
203
|
+
FROM _emdash_media_usage_cleanup_fence AS fence
|
|
204
|
+
WHERE fence.task_key = 'projection_gc'
|
|
205
|
+
AND NEW.current_generation <= fence.generation_floor
|
|
206
|
+
) AND NOT EXISTS (
|
|
207
|
+
SELECT 1
|
|
208
|
+
FROM _emdash_media_usage_generation_writes AS writer
|
|
209
|
+
WHERE writer.source_key = NEW.source_key
|
|
210
|
+
AND writer.generation = NEW.current_generation
|
|
211
|
+
AND writer.expires_at > strftime('%Y-%m-%dT%H:%M:%fZ', 'now')
|
|
212
|
+
)
|
|
213
|
+
BEGIN
|
|
214
|
+
SELECT RAISE(IGNORE);
|
|
215
|
+
END
|
|
216
|
+
`)
|
|
217
|
+
.execute(db);
|
|
218
|
+
await sql
|
|
219
|
+
.raw(`
|
|
220
|
+
CREATE TRIGGER IF NOT EXISTS emdash_media_usage_record_cleanup_fence
|
|
221
|
+
BEFORE DELETE ON _emdash_media_usage
|
|
222
|
+
WHEN OLD.cleanup_lease_token IS NOT NULL AND EXISTS (
|
|
223
|
+
SELECT 1
|
|
224
|
+
FROM _emdash_media_usage_cleanup AS cleanup
|
|
225
|
+
WHERE cleanup.task_key = 'projection_gc'
|
|
226
|
+
AND cleanup.lease_token = OLD.cleanup_lease_token
|
|
227
|
+
)
|
|
228
|
+
BEGIN
|
|
229
|
+
INSERT INTO _emdash_media_usage_cleanup_fence (
|
|
230
|
+
task_key,
|
|
231
|
+
generation_floor,
|
|
232
|
+
updated_at
|
|
233
|
+
)
|
|
234
|
+
VALUES ('projection_gc', OLD.generation, strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
|
|
235
|
+
ON CONFLICT (task_key) DO UPDATE SET
|
|
236
|
+
generation_floor = CASE
|
|
237
|
+
WHEN excluded.generation_floor > _emdash_media_usage_cleanup_fence.generation_floor
|
|
238
|
+
THEN excluded.generation_floor
|
|
239
|
+
ELSE _emdash_media_usage_cleanup_fence.generation_floor
|
|
240
|
+
END,
|
|
241
|
+
updated_at = excluded.updated_at;
|
|
242
|
+
END
|
|
243
|
+
`)
|
|
244
|
+
.execute(db);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export async function down(db: Kysely<unknown>): Promise<void> {
|
|
248
|
+
if (isPostgres(db)) {
|
|
249
|
+
await sql
|
|
250
|
+
.raw("DROP TRIGGER IF EXISTS emdash_media_usage_record_cleanup_fence ON _emdash_media_usage")
|
|
251
|
+
.execute(db);
|
|
252
|
+
await sql
|
|
253
|
+
.raw(
|
|
254
|
+
"DROP TRIGGER IF EXISTS emdash_media_usage_fence_source_generation_update ON _emdash_media_usage_sources",
|
|
255
|
+
)
|
|
256
|
+
.execute(db);
|
|
257
|
+
await sql
|
|
258
|
+
.raw(
|
|
259
|
+
"DROP TRIGGER IF EXISTS emdash_media_usage_fence_source_generation_insert ON _emdash_media_usage_sources",
|
|
260
|
+
)
|
|
261
|
+
.execute(db);
|
|
262
|
+
await sql
|
|
263
|
+
.raw(
|
|
264
|
+
"DROP TRIGGER IF EXISTS emdash_media_usage_lock_cleanup_update ON _emdash_media_usage_sources",
|
|
265
|
+
)
|
|
266
|
+
.execute(db);
|
|
267
|
+
await sql
|
|
268
|
+
.raw(
|
|
269
|
+
"DROP TRIGGER IF EXISTS emdash_media_usage_lock_cleanup_insert ON _emdash_media_usage_sources",
|
|
270
|
+
)
|
|
271
|
+
.execute(db);
|
|
272
|
+
await sql
|
|
273
|
+
.raw(
|
|
274
|
+
"DROP TRIGGER IF EXISTS emdash_media_usage_lock_cleanup_delete ON _emdash_media_usage_sources",
|
|
275
|
+
)
|
|
276
|
+
.execute(db);
|
|
277
|
+
await sql.raw("DROP FUNCTION IF EXISTS emdash_media_usage_record_cleanup_fence()").execute(db);
|
|
278
|
+
await sql
|
|
279
|
+
.raw("DROP FUNCTION IF EXISTS emdash_media_usage_fence_source_generation()")
|
|
280
|
+
.execute(db);
|
|
281
|
+
await sql.raw("DROP FUNCTION IF EXISTS emdash_media_usage_lock_cleanup()").execute(db);
|
|
282
|
+
} else {
|
|
283
|
+
await sql.raw("DROP TRIGGER IF EXISTS emdash_media_usage_record_cleanup_fence").execute(db);
|
|
284
|
+
await sql
|
|
285
|
+
.raw("DROP TRIGGER IF EXISTS emdash_media_usage_fence_source_generation_update")
|
|
286
|
+
.execute(db);
|
|
287
|
+
await sql
|
|
288
|
+
.raw("DROP TRIGGER IF EXISTS emdash_media_usage_fence_source_generation_insert")
|
|
289
|
+
.execute(db);
|
|
290
|
+
}
|
|
291
|
+
await db.schema.dropTable("_emdash_media_usage_cleanup_fence").ifExists().execute();
|
|
292
|
+
if (await columnExists(db, "_emdash_media_usage", "cleanup_lease_token")) {
|
|
293
|
+
await db.schema.alterTable("_emdash_media_usage").dropColumn("cleanup_lease_token").execute();
|
|
294
|
+
}
|
|
295
|
+
}
|
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
import { sql, type Kysely, type RawBuilder } from "kysely";
|
|
2
|
+
|
|
3
|
+
import { columnExists, isPostgres, tableExists } from "../dialect-helpers.js";
|
|
4
|
+
|
|
5
|
+
const ACTIVATION_KEY = "incremental_capture";
|
|
6
|
+
const CONTENT_ADAPTER_ID = "content-media";
|
|
7
|
+
const COLLECTION_SCOPE = "collection";
|
|
8
|
+
const DUPLICATE_COLUMN_RE = /(?:duplicate column|column .* already exists|already exists.*column)/i;
|
|
9
|
+
|
|
10
|
+
export async function up(db: Kysely<unknown>): Promise<void> {
|
|
11
|
+
await db.schema
|
|
12
|
+
.createTable("_emdash_media_usage_activation")
|
|
13
|
+
.ifNotExists()
|
|
14
|
+
.addColumn("task_key", "text", (column) => column.primaryKey())
|
|
15
|
+
.addColumn("state", "text", (column) => column.notNull().defaultTo("expanded"))
|
|
16
|
+
.addColumn("runtime_generation", "integer", (column) => column.notNull().defaultTo(1))
|
|
17
|
+
.addColumn("collection_cursor", "text")
|
|
18
|
+
.addColumn("drain_confirmed_at", "text")
|
|
19
|
+
.addColumn("lease_token", "text")
|
|
20
|
+
.addColumn("lease_expires_at", "text")
|
|
21
|
+
.addColumn("attempt_count", "integer", (column) => column.notNull().defaultTo(0))
|
|
22
|
+
.addColumn("last_attempted_at", "text")
|
|
23
|
+
.addColumn("last_error_code", "text")
|
|
24
|
+
.addColumn("activated_at", "text")
|
|
25
|
+
.addColumn("created_at", "text", (column) =>
|
|
26
|
+
column.notNull().defaultTo(sortableUtcTimestamp(db)),
|
|
27
|
+
)
|
|
28
|
+
.addColumn("updated_at", "text", (column) =>
|
|
29
|
+
column.notNull().defaultTo(sortableUtcTimestamp(db)),
|
|
30
|
+
)
|
|
31
|
+
.execute();
|
|
32
|
+
|
|
33
|
+
await sql`
|
|
34
|
+
INSERT INTO _emdash_media_usage_activation (task_key, state)
|
|
35
|
+
VALUES (${ACTIVATION_KEY}, 'expanded')
|
|
36
|
+
ON CONFLICT (task_key) DO NOTHING
|
|
37
|
+
`.execute(db);
|
|
38
|
+
|
|
39
|
+
await db.schema
|
|
40
|
+
.createTable("_emdash_media_usage_work")
|
|
41
|
+
.ifNotExists()
|
|
42
|
+
.addColumn("collection_id", "text", (column) => column.notNull())
|
|
43
|
+
.addColumn("collection_slug", "text", (column) => column.notNull())
|
|
44
|
+
.addColumn("content_id", "text", (column) => column.notNull())
|
|
45
|
+
.addColumn("change_epoch", "bigint", (column) => column.notNull())
|
|
46
|
+
.addColumn("work_version", "bigint", (column) => column.notNull().defaultTo(1))
|
|
47
|
+
.addColumn("state", "text", (column) => column.notNull().defaultTo("pending"))
|
|
48
|
+
.addColumn("attempt_count", "integer", (column) => column.notNull().defaultTo(0))
|
|
49
|
+
.addColumn("next_attempt_at", "text", (column) => column.notNull())
|
|
50
|
+
.addColumn("lease_token", "text")
|
|
51
|
+
.addColumn("lease_expires_at", "text")
|
|
52
|
+
.addColumn("last_attempted_at", "text")
|
|
53
|
+
.addColumn("last_error_code", "text")
|
|
54
|
+
.addColumn("created_at", "text", (column) =>
|
|
55
|
+
column.notNull().defaultTo(sortableUtcTimestamp(db)),
|
|
56
|
+
)
|
|
57
|
+
.addColumn("updated_at", "text", (column) =>
|
|
58
|
+
column.notNull().defaultTo(sortableUtcTimestamp(db)),
|
|
59
|
+
)
|
|
60
|
+
.addPrimaryKeyConstraint("_emdash_media_usage_work_pk", ["collection_id", "content_id"])
|
|
61
|
+
.execute();
|
|
62
|
+
|
|
63
|
+
await addStatusColumns(db);
|
|
64
|
+
await addSourceColumns(db);
|
|
65
|
+
|
|
66
|
+
await db.schema
|
|
67
|
+
.createIndex("idx__emdash_media_usage_work_due")
|
|
68
|
+
.ifNotExists()
|
|
69
|
+
.on("_emdash_media_usage_work")
|
|
70
|
+
.columns(["state", "next_attempt_at", "updated_at", "collection_id", "content_id"])
|
|
71
|
+
.execute();
|
|
72
|
+
await db.schema
|
|
73
|
+
.createIndex("idx__emdash_media_usage_work_lease")
|
|
74
|
+
.ifNotExists()
|
|
75
|
+
.on("_emdash_media_usage_work")
|
|
76
|
+
.columns(["state", "lease_expires_at", "collection_id", "content_id"])
|
|
77
|
+
.execute();
|
|
78
|
+
await db.schema
|
|
79
|
+
.createIndex("idx__emdash_media_usage_work_operator")
|
|
80
|
+
.ifNotExists()
|
|
81
|
+
.on("_emdash_media_usage_work")
|
|
82
|
+
.columns(["collection_id", "state", "updated_at", "content_id"])
|
|
83
|
+
.execute();
|
|
84
|
+
await db.schema
|
|
85
|
+
.createIndex("idx__emdash_media_usage_status_collection")
|
|
86
|
+
.ifNotExists()
|
|
87
|
+
.unique()
|
|
88
|
+
.on("_emdash_media_usage_index_status")
|
|
89
|
+
.columns(["adapter_id", "scope_type", "collection_id"])
|
|
90
|
+
.execute();
|
|
91
|
+
await db.schema
|
|
92
|
+
.createIndex("idx__emdash_media_usage_sources_identity")
|
|
93
|
+
.ifNotExists()
|
|
94
|
+
.on("_emdash_media_usage_sources")
|
|
95
|
+
.columns(["source_type", "collection_id", "content_id", "source_variant"])
|
|
96
|
+
.execute();
|
|
97
|
+
|
|
98
|
+
await sql`
|
|
99
|
+
DELETE FROM _emdash_media_usage_index_status
|
|
100
|
+
WHERE adapter_id = ${CONTENT_ADAPTER_ID}
|
|
101
|
+
AND scope_type = ${COLLECTION_SCOPE}
|
|
102
|
+
AND (
|
|
103
|
+
(
|
|
104
|
+
collection_id IS NULL
|
|
105
|
+
AND NOT EXISTS (
|
|
106
|
+
SELECT 1
|
|
107
|
+
FROM _emdash_collections AS collection
|
|
108
|
+
WHERE collection.slug = _emdash_media_usage_index_status.scope_key
|
|
109
|
+
)
|
|
110
|
+
)
|
|
111
|
+
OR (
|
|
112
|
+
collection_id IS NOT NULL
|
|
113
|
+
AND capture_state = 'installing'
|
|
114
|
+
AND EXISTS (
|
|
115
|
+
SELECT 1
|
|
116
|
+
FROM _emdash_media_usage_activation AS activation
|
|
117
|
+
WHERE activation.task_key = ${ACTIVATION_KEY}
|
|
118
|
+
AND activation.state = 'expanded'
|
|
119
|
+
)
|
|
120
|
+
AND NOT EXISTS (
|
|
121
|
+
SELECT 1
|
|
122
|
+
FROM _emdash_collections AS collection
|
|
123
|
+
WHERE collection.id = _emdash_media_usage_index_status.collection_id
|
|
124
|
+
AND collection.slug = _emdash_media_usage_index_status.scope_key
|
|
125
|
+
)
|
|
126
|
+
)
|
|
127
|
+
)
|
|
128
|
+
`.execute(db);
|
|
129
|
+
|
|
130
|
+
await sql`
|
|
131
|
+
UPDATE _emdash_media_usage_index_status
|
|
132
|
+
SET collection_id = (
|
|
133
|
+
SELECT collection.id
|
|
134
|
+
FROM _emdash_collections AS collection
|
|
135
|
+
WHERE collection.slug = _emdash_media_usage_index_status.scope_key
|
|
136
|
+
),
|
|
137
|
+
reconciliation_required = 1,
|
|
138
|
+
capture_state = COALESCE(capture_state, 'installing')
|
|
139
|
+
WHERE adapter_id = ${CONTENT_ADAPTER_ID}
|
|
140
|
+
AND scope_type = ${COLLECTION_SCOPE}
|
|
141
|
+
AND (
|
|
142
|
+
collection_id IS NULL
|
|
143
|
+
OR capture_state IS NULL
|
|
144
|
+
)
|
|
145
|
+
AND EXISTS (
|
|
146
|
+
SELECT 1
|
|
147
|
+
FROM _emdash_collections AS collection
|
|
148
|
+
WHERE collection.id = COALESCE(
|
|
149
|
+
_emdash_media_usage_index_status.collection_id,
|
|
150
|
+
collection.id
|
|
151
|
+
)
|
|
152
|
+
AND collection.slug = _emdash_media_usage_index_status.scope_key
|
|
153
|
+
)
|
|
154
|
+
`.execute(db);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export async function down(db: Kysely<unknown>): Promise<void> {
|
|
158
|
+
await assertRollbackIsEmptyAndInactive(db);
|
|
159
|
+
|
|
160
|
+
await db.schema.dropIndex("idx__emdash_media_usage_sources_identity").ifExists().execute();
|
|
161
|
+
await db.schema.dropIndex("idx__emdash_media_usage_status_collection").ifExists().execute();
|
|
162
|
+
await db.schema.dropIndex("idx__emdash_media_usage_work_operator").ifExists().execute();
|
|
163
|
+
await db.schema.dropIndex("idx__emdash_media_usage_work_lease").ifExists().execute();
|
|
164
|
+
await db.schema.dropIndex("idx__emdash_media_usage_work_due").ifExists().execute();
|
|
165
|
+
await db.schema.dropTable("_emdash_media_usage_work").ifExists().execute();
|
|
166
|
+
await db.schema.dropTable("_emdash_media_usage_activation").ifExists().execute();
|
|
167
|
+
if (isPostgres(db)) {
|
|
168
|
+
await sql`DROP FUNCTION IF EXISTS emdash_media_usage_capture_work()`.execute(db);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
for (const columnName of ["identity_version", "collection_id"] as const) {
|
|
172
|
+
if (await columnExists(db, "_emdash_media_usage_sources", columnName)) {
|
|
173
|
+
await db.schema.alterTable("_emdash_media_usage_sources").dropColumn(columnName).execute();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
for (const columnName of [
|
|
178
|
+
"capture_state",
|
|
179
|
+
"last_incremental_success_at",
|
|
180
|
+
"reconciliation_required",
|
|
181
|
+
"change_epoch",
|
|
182
|
+
"collection_id",
|
|
183
|
+
] as const) {
|
|
184
|
+
if (await columnExists(db, "_emdash_media_usage_index_status", columnName)) {
|
|
185
|
+
await db.schema
|
|
186
|
+
.alterTable("_emdash_media_usage_index_status")
|
|
187
|
+
.dropColumn(columnName)
|
|
188
|
+
.execute();
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
async function addStatusColumns(db: Kysely<unknown>): Promise<void> {
|
|
194
|
+
await addColumnIfMissing(db, "_emdash_media_usage_index_status", "collection_id", () =>
|
|
195
|
+
db.schema
|
|
196
|
+
.alterTable("_emdash_media_usage_index_status")
|
|
197
|
+
.addColumn("collection_id", "text")
|
|
198
|
+
.execute(),
|
|
199
|
+
);
|
|
200
|
+
await addColumnIfMissing(db, "_emdash_media_usage_index_status", "change_epoch", () =>
|
|
201
|
+
db.schema
|
|
202
|
+
.alterTable("_emdash_media_usage_index_status")
|
|
203
|
+
.addColumn("change_epoch", "bigint", (column) => column.notNull().defaultTo(0))
|
|
204
|
+
.execute(),
|
|
205
|
+
);
|
|
206
|
+
await addColumnIfMissing(db, "_emdash_media_usage_index_status", "reconciliation_required", () =>
|
|
207
|
+
db.schema
|
|
208
|
+
.alterTable("_emdash_media_usage_index_status")
|
|
209
|
+
.addColumn("reconciliation_required", "integer", (column) => column.notNull().defaultTo(0))
|
|
210
|
+
.execute(),
|
|
211
|
+
);
|
|
212
|
+
await addStatusTextColumn(db, "last_incremental_success_at");
|
|
213
|
+
await addStatusTextColumn(db, "capture_state");
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
async function assertRollbackIsEmptyAndInactive(db: Kysely<unknown>): Promise<void> {
|
|
217
|
+
if (await hasCaptureTriggers(db)) {
|
|
218
|
+
throw new Error("Cannot roll back media usage capture while capture triggers are installed");
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (await tableExists(db, "_emdash_media_usage_activation")) {
|
|
222
|
+
const activation = await sql<{ state: string }>`
|
|
223
|
+
SELECT state
|
|
224
|
+
FROM _emdash_media_usage_activation
|
|
225
|
+
WHERE task_key = ${ACTIVATION_KEY}
|
|
226
|
+
`.execute(db);
|
|
227
|
+
if (activation.rows[0] && activation.rows[0].state !== "expanded") {
|
|
228
|
+
throw new Error("Cannot roll back media usage capture after activation has started");
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
if (await tableExists(db, "_emdash_media_usage_work")) {
|
|
233
|
+
const work = await sql<{ present: number }>`
|
|
234
|
+
SELECT 1 AS present FROM _emdash_media_usage_work LIMIT 1
|
|
235
|
+
`.execute(db);
|
|
236
|
+
if (work.rows.length > 0) {
|
|
237
|
+
throw new Error("Cannot roll back media usage capture while durable work exists");
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
const sourceHasCollectionId = await columnExists(
|
|
242
|
+
db,
|
|
243
|
+
"_emdash_media_usage_sources",
|
|
244
|
+
"collection_id",
|
|
245
|
+
);
|
|
246
|
+
const sourceHasIdentityVersion = await columnExists(
|
|
247
|
+
db,
|
|
248
|
+
"_emdash_media_usage_sources",
|
|
249
|
+
"identity_version",
|
|
250
|
+
);
|
|
251
|
+
if (sourceHasCollectionId || sourceHasIdentityVersion) {
|
|
252
|
+
const canonicalSources = sourceHasCollectionId
|
|
253
|
+
? await sql<{ present: number }>`
|
|
254
|
+
SELECT 1 AS present
|
|
255
|
+
FROM _emdash_media_usage_sources
|
|
256
|
+
WHERE collection_id IS NOT NULL
|
|
257
|
+
LIMIT 1
|
|
258
|
+
`.execute(db)
|
|
259
|
+
: await sql<{ present: number }>`
|
|
260
|
+
SELECT 1 AS present
|
|
261
|
+
FROM _emdash_media_usage_sources
|
|
262
|
+
WHERE identity_version IS NOT NULL
|
|
263
|
+
LIMIT 1
|
|
264
|
+
`.execute(db);
|
|
265
|
+
if (canonicalSources.rows.length > 0) {
|
|
266
|
+
throw new Error("Cannot roll back media usage capture after canonical sources exist");
|
|
267
|
+
}
|
|
268
|
+
if (sourceHasCollectionId && sourceHasIdentityVersion) {
|
|
269
|
+
const versionedSources = await sql<{ present: number }>`
|
|
270
|
+
SELECT 1 AS present
|
|
271
|
+
FROM _emdash_media_usage_sources
|
|
272
|
+
WHERE identity_version IS NOT NULL
|
|
273
|
+
LIMIT 1
|
|
274
|
+
`.execute(db);
|
|
275
|
+
if (versionedSources.rows.length > 0) {
|
|
276
|
+
throw new Error("Cannot roll back media usage capture after canonical sources exist");
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
if (await columnExists(db, "_emdash_media_usage_index_status", "capture_state")) {
|
|
282
|
+
const lifecycle = await sql<{ present: number }>`
|
|
283
|
+
SELECT 1 AS present FROM _emdash_media_usage_index_status
|
|
284
|
+
WHERE capture_state IN ('active', 'deleting') LIMIT 1
|
|
285
|
+
`.execute(db);
|
|
286
|
+
if (lifecycle.rows.length > 0) throwRollbackLifecycleError();
|
|
287
|
+
}
|
|
288
|
+
if (await columnExists(db, "_emdash_media_usage_index_status", "change_epoch")) {
|
|
289
|
+
const epoch = await sql<{ present: number }>`
|
|
290
|
+
SELECT 1 AS present FROM _emdash_media_usage_index_status
|
|
291
|
+
WHERE change_epoch <> 0 LIMIT 1
|
|
292
|
+
`.execute(db);
|
|
293
|
+
if (epoch.rows.length > 0) throwRollbackLifecycleError();
|
|
294
|
+
}
|
|
295
|
+
if (await columnExists(db, "_emdash_media_usage_index_status", "last_incremental_success_at")) {
|
|
296
|
+
const success = await sql<{ present: number }>`
|
|
297
|
+
SELECT 1 AS present FROM _emdash_media_usage_index_status
|
|
298
|
+
WHERE last_incremental_success_at IS NOT NULL LIMIT 1
|
|
299
|
+
`.execute(db);
|
|
300
|
+
if (success.rows.length > 0) throwRollbackLifecycleError();
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
function throwRollbackLifecycleError(): never {
|
|
305
|
+
throw new Error("Cannot roll back media usage capture while capture lifecycle state exists");
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
async function hasCaptureTriggers(db: Kysely<unknown>): Promise<boolean> {
|
|
309
|
+
if (isPostgres(db)) {
|
|
310
|
+
const result = await sql<{ present: boolean }>`
|
|
311
|
+
SELECT EXISTS (
|
|
312
|
+
SELECT 1
|
|
313
|
+
FROM pg_trigger AS trigger
|
|
314
|
+
INNER JOIN pg_class AS relation ON relation.oid = trigger.tgrelid
|
|
315
|
+
INNER JOIN pg_namespace AS namespace ON namespace.oid = relation.relnamespace
|
|
316
|
+
WHERE namespace.nspname = current_schema()
|
|
317
|
+
AND NOT trigger.tgisinternal
|
|
318
|
+
AND left(trigger.tgname, 10) = 'emdash_mu_'
|
|
319
|
+
) AS present
|
|
320
|
+
`.execute(db);
|
|
321
|
+
return result.rows[0]?.present === true;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
const result = await sql<{ present: number }>`
|
|
325
|
+
SELECT 1 AS present
|
|
326
|
+
FROM sqlite_master
|
|
327
|
+
WHERE type = 'trigger' AND substr(name, 1, 10) = 'emdash_mu_'
|
|
328
|
+
LIMIT 1
|
|
329
|
+
`.execute(db);
|
|
330
|
+
return result.rows.length > 0;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
async function addStatusTextColumn(db: Kysely<unknown>, columnName: string): Promise<void> {
|
|
334
|
+
await addColumnIfMissing(db, "_emdash_media_usage_index_status", columnName, () =>
|
|
335
|
+
db.schema
|
|
336
|
+
.alterTable("_emdash_media_usage_index_status")
|
|
337
|
+
.addColumn(columnName, "text")
|
|
338
|
+
.execute(),
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
async function addSourceColumns(db: Kysely<unknown>): Promise<void> {
|
|
343
|
+
await addColumnIfMissing(db, "_emdash_media_usage_sources", "collection_id", () =>
|
|
344
|
+
db.schema
|
|
345
|
+
.alterTable("_emdash_media_usage_sources")
|
|
346
|
+
.addColumn("collection_id", "text")
|
|
347
|
+
.execute(),
|
|
348
|
+
);
|
|
349
|
+
await addColumnIfMissing(db, "_emdash_media_usage_sources", "identity_version", () =>
|
|
350
|
+
db.schema
|
|
351
|
+
.alterTable("_emdash_media_usage_sources")
|
|
352
|
+
.addColumn("identity_version", "integer")
|
|
353
|
+
.execute(),
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
async function addColumnIfMissing(
|
|
358
|
+
db: Kysely<unknown>,
|
|
359
|
+
tableName: string,
|
|
360
|
+
columnName: string,
|
|
361
|
+
addColumn: () => Promise<void>,
|
|
362
|
+
): Promise<void> {
|
|
363
|
+
if (await columnExists(db, tableName, columnName)) return;
|
|
364
|
+
|
|
365
|
+
try {
|
|
366
|
+
await addColumn();
|
|
367
|
+
} catch (error) {
|
|
368
|
+
if (DUPLICATE_COLUMN_RE.test(deepErrorMessage(error))) {
|
|
369
|
+
if (await columnExists(db, tableName, columnName)) return;
|
|
370
|
+
}
|
|
371
|
+
throw error;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
function sortableUtcTimestamp(db: Kysely<unknown>): RawBuilder<string> {
|
|
376
|
+
if (isPostgres(db)) {
|
|
377
|
+
return sql`to_char(clock_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"')`;
|
|
378
|
+
}
|
|
379
|
+
return sql`(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))`;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
function deepErrorMessage(error: unknown): string {
|
|
383
|
+
if (error instanceof Error) {
|
|
384
|
+
const own = error.message ?? "";
|
|
385
|
+
if (error.cause) {
|
|
386
|
+
const causeMessage = deepErrorMessage(error.cause);
|
|
387
|
+
return own ? `${own}: ${causeMessage}` : causeMessage;
|
|
388
|
+
}
|
|
389
|
+
return own;
|
|
390
|
+
}
|
|
391
|
+
if (typeof error === "string") return error;
|
|
392
|
+
try {
|
|
393
|
+
return JSON.stringify(error);
|
|
394
|
+
} catch {
|
|
395
|
+
return String(error);
|
|
396
|
+
}
|
|
397
|
+
}
|