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
package/src/schema/types.ts
CHANGED
|
@@ -48,6 +48,23 @@ export const FIELD_TYPES: readonly FieldType[] = [
|
|
|
48
48
|
"repeater",
|
|
49
49
|
] as const;
|
|
50
50
|
|
|
51
|
+
/** Scalar field types that can be backed by a content-list query index. */
|
|
52
|
+
export const INDEXABLE_FIELD_TYPES: ReadonlySet<FieldType> = new Set([
|
|
53
|
+
"string",
|
|
54
|
+
"url",
|
|
55
|
+
"number",
|
|
56
|
+
"integer",
|
|
57
|
+
"boolean",
|
|
58
|
+
"datetime",
|
|
59
|
+
"select",
|
|
60
|
+
"reference",
|
|
61
|
+
"slug",
|
|
62
|
+
]);
|
|
63
|
+
|
|
64
|
+
export function isIndexableFieldType(type: FieldType): boolean {
|
|
65
|
+
return INDEXABLE_FIELD_TYPES.has(type);
|
|
66
|
+
}
|
|
67
|
+
|
|
51
68
|
/**
|
|
52
69
|
* SQLite column types that map from field types
|
|
53
70
|
*/
|
|
@@ -155,6 +172,14 @@ export interface FieldWidgetOptions {
|
|
|
155
172
|
[key: string]: unknown;
|
|
156
173
|
}
|
|
157
174
|
|
|
175
|
+
export const MAX_COLLECTION_LIST_COLUMNS = 4;
|
|
176
|
+
|
|
177
|
+
/** Collection-level admin presentation options. */
|
|
178
|
+
export interface CollectionAdminConfig {
|
|
179
|
+
/** Custom field slugs to show in the content list. */
|
|
180
|
+
listColumns?: string[];
|
|
181
|
+
}
|
|
182
|
+
|
|
158
183
|
/**
|
|
159
184
|
* A collection definition
|
|
160
185
|
*/
|
|
@@ -165,12 +190,19 @@ export interface Collection {
|
|
|
165
190
|
labelSingular?: string;
|
|
166
191
|
description?: string;
|
|
167
192
|
icon?: string;
|
|
193
|
+
admin?: CollectionAdminConfig;
|
|
168
194
|
supports: CollectionSupport[];
|
|
169
195
|
source?: CollectionSource;
|
|
170
196
|
/** Whether this collection has SEO metadata fields enabled */
|
|
171
197
|
hasSeo: boolean;
|
|
198
|
+
/** Field slug powering the admin list Title column. Defaults to the standard title display. */
|
|
199
|
+
titleField?: string;
|
|
200
|
+
/** Field slug powering the admin list Date column. Must be a `datetime` field. Defaults to last-updated. */
|
|
201
|
+
dateField?: string;
|
|
172
202
|
/** URL pattern with {slug} placeholder (e.g. "/{slug}", "/blog/{slug}") */
|
|
173
203
|
urlPattern?: string;
|
|
204
|
+
/** Whether published entries require a public slug. Defaults to true. */
|
|
205
|
+
routable?: boolean;
|
|
174
206
|
/**
|
|
175
207
|
* Omit this collection's auto-generated entry from the admin sidebar.
|
|
176
208
|
* The collection stays fully functional everywhere else (API, MCP, hooks,
|
|
@@ -214,6 +246,8 @@ export interface Field {
|
|
|
214
246
|
options?: FieldWidgetOptions;
|
|
215
247
|
sortOrder: number;
|
|
216
248
|
searchable: boolean;
|
|
249
|
+
/** Whether this field has a physical index for structured list queries. */
|
|
250
|
+
indexed: boolean;
|
|
217
251
|
/** Whether this field is translatable (default true). Non-translatable fields are synced across locales. */
|
|
218
252
|
translatable: boolean;
|
|
219
253
|
createdAt: string;
|
|
@@ -228,9 +262,11 @@ export interface CreateCollectionInput {
|
|
|
228
262
|
labelSingular?: string;
|
|
229
263
|
description?: string;
|
|
230
264
|
icon?: string;
|
|
265
|
+
admin?: CollectionAdminConfig;
|
|
231
266
|
supports?: CollectionSupport[];
|
|
232
267
|
source?: CollectionSource;
|
|
233
268
|
urlPattern?: string;
|
|
269
|
+
routable?: boolean;
|
|
234
270
|
hasSeo?: boolean;
|
|
235
271
|
/** Omit the auto-generated admin sidebar entry (defaults to false) */
|
|
236
272
|
hidden?: boolean;
|
|
@@ -247,8 +283,10 @@ export interface UpdateCollectionInput {
|
|
|
247
283
|
labelSingular?: string;
|
|
248
284
|
description?: string;
|
|
249
285
|
icon?: string;
|
|
286
|
+
admin?: CollectionAdminConfig;
|
|
250
287
|
supports?: CollectionSupport[];
|
|
251
|
-
urlPattern?: string;
|
|
288
|
+
urlPattern?: string | null;
|
|
289
|
+
routable?: boolean;
|
|
252
290
|
hasSeo?: boolean;
|
|
253
291
|
/** Omit the auto-generated admin sidebar entry */
|
|
254
292
|
hidden?: boolean;
|
|
@@ -258,6 +296,10 @@ export interface UpdateCollectionInput {
|
|
|
258
296
|
commentsModeration?: "all" | "first_time" | "none";
|
|
259
297
|
commentsClosedAfterDays?: number;
|
|
260
298
|
commentsAutoApproveUsers?: boolean;
|
|
299
|
+
/** Field slug for the Title column; `null`/`""` clears back to the default. */
|
|
300
|
+
titleField?: string | null;
|
|
301
|
+
/** Datetime field slug for the Date column; `null`/`""` clears back to the default. */
|
|
302
|
+
dateField?: string | null;
|
|
261
303
|
}
|
|
262
304
|
|
|
263
305
|
/**
|
|
@@ -276,6 +318,8 @@ export interface CreateFieldInput {
|
|
|
276
318
|
sortOrder?: number;
|
|
277
319
|
/** Whether this field should be indexed for search */
|
|
278
320
|
searchable?: boolean;
|
|
321
|
+
/** Create a physical index for structured sorting. */
|
|
322
|
+
indexed?: boolean;
|
|
279
323
|
/** Whether this field is translatable (default true). Non-translatable fields are synced across locales. */
|
|
280
324
|
translatable?: boolean;
|
|
281
325
|
}
|
|
@@ -286,13 +330,9 @@ export interface CreateFieldInput {
|
|
|
286
330
|
export interface UpdateFieldInput {
|
|
287
331
|
label?: string;
|
|
288
332
|
/**
|
|
289
|
-
* Change the field's type. Only
|
|
290
|
-
*
|
|
291
|
-
*
|
|
292
|
-
* `text` TEXT to `portableText` JSON) is rejected, because there is no
|
|
293
|
-
* in-place column migration and silently rewriting the metadata would
|
|
294
|
-
* desync `column_type` from the real `ec_*` column. Omit to keep the
|
|
295
|
-
* current type.
|
|
333
|
+
* Change the field's type. Only storage-compatible text aliases (`string`,
|
|
334
|
+
* `text`, and `slug`) can be changed in place. Other changes require an
|
|
335
|
+
* explicit content migration. Omit to keep the current type.
|
|
296
336
|
*/
|
|
297
337
|
type?: FieldType;
|
|
298
338
|
required?: boolean;
|
|
@@ -304,6 +344,8 @@ export interface UpdateFieldInput {
|
|
|
304
344
|
sortOrder?: number;
|
|
305
345
|
/** Whether this field should be indexed for search */
|
|
306
346
|
searchable?: boolean;
|
|
347
|
+
/** Create or remove the physical index used by structured sorting. */
|
|
348
|
+
indexed?: boolean;
|
|
307
349
|
/** Whether this field is translatable (default true). Non-translatable fields are synced across locales. */
|
|
308
350
|
translatable?: boolean;
|
|
309
351
|
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const URL_PARAM_PATTERN = /\{(\w+)\}/g;
|
|
2
|
+
const REGEX_SPECIAL_CHARACTERS = /[.*+?^${}()|[\]\\]/g;
|
|
3
|
+
const INVALID_LITERAL_PATTERN = /[{}]/;
|
|
4
|
+
|
|
5
|
+
function escapeRegex(literal: string): string {
|
|
6
|
+
return literal.replace(REGEX_SPECIAL_CHARACTERS, "\\$&");
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function compileUrlPattern(pattern: string): { regex: RegExp; paramNames: string[] } {
|
|
10
|
+
const paramNames: string[] = [];
|
|
11
|
+
let regexSource = "";
|
|
12
|
+
let previousIndex = 0;
|
|
13
|
+
|
|
14
|
+
for (const match of pattern.matchAll(URL_PARAM_PATTERN)) {
|
|
15
|
+
const matchIndex = match.index;
|
|
16
|
+
const literal = pattern.slice(previousIndex, matchIndex);
|
|
17
|
+
if (INVALID_LITERAL_PATTERN.test(literal)) throw new Error("Invalid URL pattern placeholder");
|
|
18
|
+
regexSource += escapeRegex(literal);
|
|
19
|
+
|
|
20
|
+
const name = match[1];
|
|
21
|
+
paramNames.push(name);
|
|
22
|
+
regexSource += "([^/]+)";
|
|
23
|
+
previousIndex = matchIndex + match[0].length;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const trailingLiteral = pattern.slice(previousIndex);
|
|
27
|
+
if (INVALID_LITERAL_PATTERN.test(trailingLiteral)) {
|
|
28
|
+
throw new Error("Invalid URL pattern placeholder");
|
|
29
|
+
}
|
|
30
|
+
regexSource += escapeRegex(trailingLiteral);
|
|
31
|
+
|
|
32
|
+
return { regex: new RegExp(`^${regexSource}$`), paramNames };
|
|
33
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z, type ZodTypeAny } from "zod";
|
|
2
2
|
|
|
3
3
|
import { hashString } from "../utils/hash.js";
|
|
4
|
-
import type { Field, FieldType,
|
|
4
|
+
import type { CollectionWithFields, Field, FieldType, RepeaterSubField } from "./types.js";
|
|
5
5
|
|
|
6
6
|
/** Pattern to split on underscores, hyphens, and spaces for PascalCase conversion */
|
|
7
7
|
const PASCAL_CASE_SPLIT_PATTERN = /[_\-\s]+/;
|
|
@@ -58,7 +58,7 @@ export function generateFieldSchema(field: Field): ZodTypeAny {
|
|
|
58
58
|
/**
|
|
59
59
|
* Get base Zod schema for a field type
|
|
60
60
|
*/
|
|
61
|
-
function getBaseSchema(type: FieldType, field: Field): ZodTypeAny {
|
|
61
|
+
function getBaseSchema(type: FieldType, field: Pick<Field, "validation">): ZodTypeAny {
|
|
62
62
|
switch (type) {
|
|
63
63
|
case "url":
|
|
64
64
|
return z.string().url();
|
|
@@ -114,6 +114,9 @@ function getBaseSchema(type: FieldType, field: Field): ZodTypeAny {
|
|
|
114
114
|
return z.array(z.string());
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
+
case "repeater":
|
|
118
|
+
return z.array(generateRepeaterRowSchema(field.validation?.subFields ?? []));
|
|
119
|
+
|
|
117
120
|
case "portableText":
|
|
118
121
|
// Portable Text is an array of blocks. We require `_type` because
|
|
119
122
|
// renderers dispatch on it, but `_key` is intentionally optional:
|
|
@@ -139,6 +142,10 @@ function getBaseSchema(type: FieldType, field: Field): ZodTypeAny {
|
|
|
139
142
|
alt: z.string().optional(),
|
|
140
143
|
width: z.number().optional(),
|
|
141
144
|
height: z.number().optional(),
|
|
145
|
+
filename: z.string().optional(),
|
|
146
|
+
mimeType: z.string().optional(),
|
|
147
|
+
blurhash: z.string().optional(),
|
|
148
|
+
dominantColor: z.string().optional(),
|
|
142
149
|
/** Provider ID (e.g. "local", "cloudflare-images") */
|
|
143
150
|
provider: z.string().optional(),
|
|
144
151
|
/** Admin-side preview URL for external providers (not persisted by plugins) */
|
|
@@ -150,6 +157,7 @@ function getBaseSchema(type: FieldType, field: Field): ZodTypeAny {
|
|
|
150
157
|
case "file":
|
|
151
158
|
return z.object({
|
|
152
159
|
id: z.string(),
|
|
160
|
+
url: z.string().optional(),
|
|
153
161
|
src: z.string().optional(),
|
|
154
162
|
filename: z.string().optional(),
|
|
155
163
|
mimeType: z.string().optional(),
|
|
@@ -171,6 +179,29 @@ function getBaseSchema(type: FieldType, field: Field): ZodTypeAny {
|
|
|
171
179
|
}
|
|
172
180
|
}
|
|
173
181
|
|
|
182
|
+
function generateRepeaterRowSchema(
|
|
183
|
+
subFields: readonly RepeaterSubField[],
|
|
184
|
+
): z.ZodObject<Record<string, ZodTypeAny>> {
|
|
185
|
+
const shape: Record<string, ZodTypeAny> = {};
|
|
186
|
+
|
|
187
|
+
for (const subField of subFields) {
|
|
188
|
+
let schema = getBaseSchema(subField.type, {
|
|
189
|
+
validation: subField.options ? { options: subField.options } : undefined,
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
if (subField.required && schema instanceof z.ZodString) {
|
|
193
|
+
schema = schema.min(1, "required (empty value not allowed)");
|
|
194
|
+
}
|
|
195
|
+
if (!subField.required) {
|
|
196
|
+
schema = schema.nullish();
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
shape[subField.slug] = schema;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return z.object(shape).passthrough();
|
|
203
|
+
}
|
|
204
|
+
|
|
174
205
|
/**
|
|
175
206
|
* Apply validation rules to a schema
|
|
176
207
|
*/
|
|
@@ -205,6 +236,17 @@ function applyValidation(schema: ZodTypeAny, field: Field): ZodTypeAny {
|
|
|
205
236
|
return numSchema;
|
|
206
237
|
}
|
|
207
238
|
|
|
239
|
+
if (field.type === "repeater" && schema instanceof z.ZodArray) {
|
|
240
|
+
let arraySchema = schema;
|
|
241
|
+
if (validation.minItems !== undefined) {
|
|
242
|
+
arraySchema = arraySchema.min(validation.minItems);
|
|
243
|
+
}
|
|
244
|
+
if (validation.maxItems !== undefined) {
|
|
245
|
+
arraySchema = arraySchema.max(validation.maxItems);
|
|
246
|
+
}
|
|
247
|
+
return arraySchema;
|
|
248
|
+
}
|
|
249
|
+
|
|
208
250
|
return schema;
|
|
209
251
|
}
|
|
210
252
|
|
|
@@ -378,7 +420,10 @@ export async function generateSchemaHash(collections: CollectionWithFields[]): P
|
|
|
378
420
|
/**
|
|
379
421
|
* Map field type to TypeScript type
|
|
380
422
|
*/
|
|
381
|
-
function fieldTypeToTypeScript(field:
|
|
423
|
+
function fieldTypeToTypeScript(field: {
|
|
424
|
+
type: Field["type"];
|
|
425
|
+
validation?: Field["validation"];
|
|
426
|
+
}): string {
|
|
382
427
|
switch (field.type) {
|
|
383
428
|
case "string":
|
|
384
429
|
case "text":
|
|
@@ -408,14 +453,41 @@ function fieldTypeToTypeScript(field: Field): string {
|
|
|
408
453
|
}
|
|
409
454
|
return "string[]";
|
|
410
455
|
|
|
456
|
+
case "repeater": {
|
|
457
|
+
const subFields = field.validation?.subFields;
|
|
458
|
+
// `validation` is unvalidated JSON on the seed and registry paths.
|
|
459
|
+
if (!Array.isArray(subFields) || subFields.length === 0) return "unknown";
|
|
460
|
+
|
|
461
|
+
// A duplicated slug keeps its first position and last declaration, as
|
|
462
|
+
// `generateRepeaterRowSchema`'s `shape[subField.slug]` does.
|
|
463
|
+
const members = new Map<string, string>();
|
|
464
|
+
|
|
465
|
+
for (const subField of subFields) {
|
|
466
|
+
const type = fieldTypeToTypeScript({
|
|
467
|
+
type: subField.type,
|
|
468
|
+
validation: subField.options ? { options: subField.options } : undefined,
|
|
469
|
+
});
|
|
470
|
+
// A sub-field slug is not guaranteed to be a valid identifier, so it is
|
|
471
|
+
// quoted rather than emitted bare.
|
|
472
|
+
const name = JSON.stringify(subField.slug);
|
|
473
|
+
// A sub-field that is not required may be null at runtime.
|
|
474
|
+
members.set(
|
|
475
|
+
subField.slug,
|
|
476
|
+
subField.required ? `${name}: ${type}` : `${name}?: ${type} | null`,
|
|
477
|
+
);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
return `{ ${[...members.values()].join("; ")} }[]`;
|
|
481
|
+
}
|
|
482
|
+
|
|
411
483
|
case "portableText":
|
|
412
484
|
return "PortableTextBlock[]";
|
|
413
485
|
|
|
414
486
|
case "image":
|
|
415
|
-
return "{ id: string; src?: string; alt?: string; width?: number; height?: number; provider?: string; previewUrl?: string; meta?: Record<string, unknown> }";
|
|
487
|
+
return "{ id: string; src?: string; alt?: string; width?: number; height?: number; filename?: string; mimeType?: string; blurhash?: string; dominantColor?: string; provider?: string; previewUrl?: string; meta?: Record<string, unknown> }";
|
|
416
488
|
|
|
417
489
|
case "file":
|
|
418
|
-
return "{ id: string; src?: string; filename?: string; mimeType?: string; size?: number; provider?: string; meta?: Record<string, unknown> }";
|
|
490
|
+
return "{ id: string; url?: string; src?: string; filename?: string; mimeType?: string; size?: number; provider?: string; meta?: Record<string, unknown> }";
|
|
419
491
|
|
|
420
492
|
case "reference":
|
|
421
493
|
// Could be enhanced to include the referenced collection type
|
|
@@ -93,25 +93,23 @@ export class FTSManager {
|
|
|
93
93
|
if (!isSqlite(this.db)) return;
|
|
94
94
|
this.validateInputs(collectionSlug, searchableFields);
|
|
95
95
|
const ftsTable = this.getFtsTableName(collectionSlug);
|
|
96
|
-
const contentTable = this.getContentTableName(collectionSlug);
|
|
97
96
|
|
|
98
97
|
// Build the column list for FTS5
|
|
99
98
|
// id and locale are UNINDEXED (used for joining/filtering, not searched)
|
|
100
99
|
const columns = ["id UNINDEXED", "locale UNINDEXED", ...searchableFields].join(", ");
|
|
101
100
|
|
|
102
|
-
// Create the FTS5 virtual table.
|
|
103
|
-
// `content
|
|
104
|
-
//
|
|
105
|
-
//
|
|
106
|
-
//
|
|
107
|
-
//
|
|
108
|
-
//
|
|
101
|
+
// Create the FTS5 virtual table. The table stores its own copy of the
|
|
102
|
+
// indexed values (no `content=` option): Portable Text fields are
|
|
103
|
+
// indexed as extracted plain text — see searchValueExpr — which cannot
|
|
104
|
+
// mirror the raw JSON in the ec_* column, and external-content FTS5
|
|
105
|
+
// requires the index to exactly mirror the backing table's values
|
|
106
|
+
// (snippet() reads them, and the 'delete' command must be fed the
|
|
107
|
+
// inserted values or the index corrupts — see migration 039's history).
|
|
108
|
+
// Storing the extracted text also makes snippet() return prose.
|
|
109
109
|
await sql
|
|
110
110
|
.raw(`
|
|
111
111
|
CREATE VIRTUAL TABLE IF NOT EXISTS "${ftsTable}" USING fts5(
|
|
112
112
|
${columns},
|
|
113
|
-
content='${contentTable}',
|
|
114
|
-
content_rowid='rowid',
|
|
115
113
|
tokenize='${tokenizer}'
|
|
116
114
|
)
|
|
117
115
|
`)
|
|
@@ -121,6 +119,55 @@ export class FTSManager {
|
|
|
121
119
|
await this.createTriggers(collectionSlug, searchableFields);
|
|
122
120
|
}
|
|
123
121
|
|
|
122
|
+
/**
|
|
123
|
+
* SQL expression producing the indexed value for one searchable field.
|
|
124
|
+
*
|
|
125
|
+
* Portable Text fields are stored as JSON; indexing the raw JSON pollutes
|
|
126
|
+
* the index with structural tokens (`_type`, style values like `normal`,
|
|
127
|
+
* `_key` ULIDs) and makes snippets show JSON fragments. Extract the prose
|
|
128
|
+
* instead: every JSON string under a `text`, `alt`, `caption`, or `code`
|
|
129
|
+
* key (span text, image alt/caption, code blocks). This is a superset of
|
|
130
|
+
* `extractPlainText` in text-extraction.ts, which walks only known block
|
|
131
|
+
* shapes — the SQL variant takes those keys at any depth, so search and
|
|
132
|
+
* the extractPlainText consumers (vectorize/ai-search) can see different
|
|
133
|
+
* text for the same document. Only JSON documents
|
|
134
|
+
* (arrays/objects) are extracted; legacy rows holding a bare string or a
|
|
135
|
+
* JSON scalar (`Some title`, `2024`) are indexed as-is. Extraction must
|
|
136
|
+
* live in SQL because the sync triggers cannot call into JS.
|
|
137
|
+
*
|
|
138
|
+
* `ref` must be a validated column reference (`NEW.x`, `OLD.x`, `"x"`).
|
|
139
|
+
*/
|
|
140
|
+
private searchValueExpr(ref: string, fieldType: string | undefined): string {
|
|
141
|
+
if (fieldType !== "portableText") return ref;
|
|
142
|
+
return (
|
|
143
|
+
`CASE WHEN ${ref} IS NULL THEN NULL ` +
|
|
144
|
+
`WHEN json_valid(${ref}) AND json_type(${ref}) IN ('array', 'object') THEN (` +
|
|
145
|
+
`SELECT group_concat(j.value, ' ') FROM json_tree(${ref}) AS j ` +
|
|
146
|
+
`WHERE j.key IN ('text', 'alt', 'caption', 'code') AND j.type = 'text') ` +
|
|
147
|
+
`ELSE ${ref} END`
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Field type per slug for a collection, for choosing the indexed-value
|
|
153
|
+
* expression. Fields missing from the schema fall back to raw indexing.
|
|
154
|
+
*/
|
|
155
|
+
private async getFieldTypes(collectionSlug: string): Promise<Map<string, string>> {
|
|
156
|
+
const collection = await this.db
|
|
157
|
+
.selectFrom("_emdash_collections")
|
|
158
|
+
.select("id")
|
|
159
|
+
.where("slug", "=", collectionSlug)
|
|
160
|
+
.executeTakeFirst();
|
|
161
|
+
if (!collection) return new Map();
|
|
162
|
+
|
|
163
|
+
const rows = await this.db
|
|
164
|
+
.selectFrom("_emdash_fields")
|
|
165
|
+
.select(["slug", "type"])
|
|
166
|
+
.where("collection_id", "=", collection.id)
|
|
167
|
+
.execute();
|
|
168
|
+
return new Map(rows.map((r) => [r.slug, r.type]));
|
|
169
|
+
}
|
|
170
|
+
|
|
124
171
|
/**
|
|
125
172
|
* Create triggers to keep FTS table in sync with content table.
|
|
126
173
|
*
|
|
@@ -129,31 +176,20 @@ export class FTSManager {
|
|
|
129
176
|
* search index and ensures the FTS row count matches the non-deleted
|
|
130
177
|
* content count (which `verifyAndRepairIndex` relies on).
|
|
131
178
|
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
179
|
+
* The FTS table stores its own values (no `content=` option), so removal
|
|
180
|
+
* is a plain `DELETE FROM fts WHERE rowid = OLD.rowid` — a harmless no-op
|
|
181
|
+
* for rows that were never indexed (soft-deleted content). The
|
|
182
|
+
* external-content `'delete'`-command choreography and its corruption
|
|
183
|
+
* modes (migration 039) do not apply to self-contained tables.
|
|
136
184
|
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
185
|
+
* `INSERT OR REPLACE` keeps the insert path idempotent: re-running a
|
|
186
|
+
* populate (D1 has no migration lock, so two isolates can race) converges
|
|
187
|
+
* on one index row per content row instead of failing on the rowid
|
|
188
|
+
* constraint.
|
|
139
189
|
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
* in an AFTER UPDATE trigger already holds the NEW values. The wrong
|
|
144
|
-
* tokens get removed and the inverted index drifts out of sync until
|
|
145
|
-
* SQLite raises `SQLITE_CORRUPT_VTAB` on the next mutation. See
|
|
146
|
-
* https://www.sqlite.org/fts5.html#external_content_tables.
|
|
147
|
-
*
|
|
148
|
-
* The UPDATE and DELETE triggers gate the `'delete'` on
|
|
149
|
-
* `OLD.deleted_at IS NULL` because the INSERT trigger never indexed
|
|
150
|
-
* rows that were already soft-deleted. Issuing `'delete'` for a rowid
|
|
151
|
-
* that was never inserted into the FTS index is itself a corruption
|
|
152
|
-
* trigger -- FTS5's `'delete'` is not a no-op on missing rowids and
|
|
153
|
-
* raises `SQLITE_CORRUPT_VTAB`. Affected paths include restore-from-
|
|
154
|
-
* trash (UPDATE where `OLD.deleted_at IS NOT NULL`), permanent-delete
|
|
155
|
-
* from trash (DELETE on a soft-deleted row), and any edit on a row
|
|
156
|
-
* that's currently in the trash.
|
|
190
|
+
* The trigger SQL emitted here MUST stay in lock-step with migration
|
|
191
|
+
* `064_fts_plain_text.ts`. If this changes again, add a new migration
|
|
192
|
+
* rather than editing shipped ones — migrations are forward-only.
|
|
157
193
|
*/
|
|
158
194
|
private async createTriggers(collectionSlug: string, searchableFields: string[]): Promise<void> {
|
|
159
195
|
this.validateInputs(collectionSlug, searchableFields);
|
|
@@ -165,64 +201,60 @@ export class FTSManager {
|
|
|
165
201
|
}
|
|
166
202
|
const ftsTable = this.getFtsTableName(collectionSlug);
|
|
167
203
|
const contentTable = this.getContentTableName(collectionSlug);
|
|
204
|
+
const fieldTypes = await this.getFieldTypes(collectionSlug);
|
|
168
205
|
const fieldList = searchableFields.join(", ");
|
|
169
|
-
const
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
// declared on the FTS5 table (in declaration order: id, locale,
|
|
173
|
-
// then each searchable field).
|
|
174
|
-
const oldFieldList = searchableFields.map((f) => `OLD.${f}`).join(", ");
|
|
206
|
+
const newValueList = searchableFields
|
|
207
|
+
.map((f) => this.searchValueExpr(`NEW.${f}`, fieldTypes.get(f)))
|
|
208
|
+
.join(", ");
|
|
175
209
|
|
|
176
210
|
// Insert trigger - only index non-deleted content
|
|
177
211
|
await sql
|
|
178
212
|
.raw(`
|
|
179
|
-
CREATE TRIGGER IF NOT EXISTS "${ftsTable}_insert"
|
|
180
|
-
AFTER INSERT ON "${contentTable}"
|
|
213
|
+
CREATE TRIGGER IF NOT EXISTS "${ftsTable}_insert"
|
|
214
|
+
AFTER INSERT ON "${contentTable}"
|
|
181
215
|
WHEN NEW.deleted_at IS NULL
|
|
182
216
|
BEGIN
|
|
183
|
-
INSERT INTO "${ftsTable}"(rowid, id, locale, ${fieldList})
|
|
184
|
-
VALUES (NEW.rowid, NEW.id, NEW.locale, ${
|
|
217
|
+
INSERT OR REPLACE INTO "${ftsTable}"(rowid, id, locale, ${fieldList})
|
|
218
|
+
VALUES (NEW.rowid, NEW.id, NEW.locale, ${newValueList});
|
|
185
219
|
END
|
|
186
220
|
`)
|
|
187
221
|
.execute(this.db);
|
|
188
222
|
|
|
189
|
-
// Update trigger -
|
|
190
|
-
//
|
|
191
|
-
//
|
|
192
|
-
// the new values when the row is still visible.
|
|
223
|
+
// Update trigger - drop the old index row, re-insert when the row is
|
|
224
|
+
// still visible. Trash (deleted_at set) ends at DELETE only; restore
|
|
225
|
+
// ends at DELETE (no-op) + re-insert.
|
|
193
226
|
//
|
|
194
|
-
//
|
|
195
|
-
//
|
|
196
|
-
//
|
|
197
|
-
//
|
|
198
|
-
//
|
|
227
|
+
// The WHEN guard compares raw column values (null-safe IS NOT) so the
|
|
228
|
+
// trigger fires only when an indexed value, the row's locale, or its
|
|
229
|
+
// trash state actually changed. Without it every UPDATE re-tokenizes
|
|
230
|
+
// the whole document — metadata-only saves (status flips, scheduling,
|
|
231
|
+
// version bumps) and the publish path's rewrite-identical-values
|
|
232
|
+
// UPDATEs dominate save CPU and WAL volume. deleted_at must stay in
|
|
233
|
+
// the guard or trash/restore stop syncing the index.
|
|
234
|
+
const changedCondition = ["deleted_at", "locale", ...searchableFields]
|
|
235
|
+
.map((f) => `OLD.${f} IS NOT NEW.${f}`)
|
|
236
|
+
.join(" OR ");
|
|
199
237
|
await sql
|
|
200
238
|
.raw(`
|
|
201
|
-
CREATE TRIGGER IF NOT EXISTS "${ftsTable}_update"
|
|
202
|
-
AFTER UPDATE ON "${contentTable}"
|
|
239
|
+
CREATE TRIGGER IF NOT EXISTS "${ftsTable}_update"
|
|
240
|
+
AFTER UPDATE ON "${contentTable}"
|
|
241
|
+
WHEN ${changedCondition}
|
|
203
242
|
BEGIN
|
|
204
|
-
|
|
205
|
-
SELECT 'delete', OLD.rowid, OLD.id, OLD.locale, ${oldFieldList}
|
|
206
|
-
WHERE OLD.deleted_at IS NULL;
|
|
243
|
+
DELETE FROM "${ftsTable}" WHERE rowid = OLD.rowid;
|
|
207
244
|
INSERT INTO "${ftsTable}"(rowid, id, locale, ${fieldList})
|
|
208
|
-
SELECT NEW.rowid, NEW.id, NEW.locale, ${
|
|
245
|
+
SELECT NEW.rowid, NEW.id, NEW.locale, ${newValueList}
|
|
209
246
|
WHERE NEW.deleted_at IS NULL;
|
|
210
247
|
END
|
|
211
248
|
`)
|
|
212
249
|
.execute(this.db);
|
|
213
250
|
|
|
214
|
-
// Delete trigger
|
|
215
|
-
// gated on `OLD.deleted_at IS NULL` for the same reason as the
|
|
216
|
-
// UPDATE trigger: permanent-delete from trash hits a row whose
|
|
217
|
-
// `deleted_at` is already set and which was never indexed.
|
|
251
|
+
// Delete trigger
|
|
218
252
|
await sql
|
|
219
253
|
.raw(`
|
|
220
|
-
CREATE TRIGGER IF NOT EXISTS "${ftsTable}_delete"
|
|
221
|
-
AFTER DELETE ON "${contentTable}"
|
|
254
|
+
CREATE TRIGGER IF NOT EXISTS "${ftsTable}_delete"
|
|
255
|
+
AFTER DELETE ON "${contentTable}"
|
|
222
256
|
BEGIN
|
|
223
|
-
|
|
224
|
-
SELECT 'delete', OLD.rowid, OLD.id, OLD.locale, ${oldFieldList}
|
|
225
|
-
WHERE OLD.deleted_at IS NULL;
|
|
257
|
+
DELETE FROM "${ftsTable}" WHERE rowid = OLD.rowid;
|
|
226
258
|
END
|
|
227
259
|
`)
|
|
228
260
|
.execute(this.db);
|
|
@@ -279,20 +311,30 @@ export class FTSManager {
|
|
|
279
311
|
}
|
|
280
312
|
|
|
281
313
|
/**
|
|
282
|
-
* Populate the FTS table from existing content
|
|
314
|
+
* Populate the FTS table from existing content.
|
|
315
|
+
*
|
|
316
|
+
* `INSERT OR REPLACE` so a concurrent double-populate (D1 has no
|
|
317
|
+
* migration lock) converges instead of failing on the rowid constraint.
|
|
283
318
|
*/
|
|
284
319
|
async populateFromContent(collectionSlug: string, searchableFields: string[]): Promise<void> {
|
|
285
320
|
if (!isSqlite(this.db)) return;
|
|
286
321
|
this.validateInputs(collectionSlug, searchableFields);
|
|
287
322
|
const ftsTable = this.getFtsTableName(collectionSlug);
|
|
288
323
|
const contentTable = this.getContentTableName(collectionSlug);
|
|
324
|
+
const fieldTypes = await this.getFieldTypes(collectionSlug);
|
|
289
325
|
const fieldList = searchableFields.join(", ");
|
|
326
|
+
// Table-qualified references: json_tree exposes columns named
|
|
327
|
+
// key/value/type/path/..., and inside the extraction subquery a bare
|
|
328
|
+
// column reference binds to those instead of the ec_* column.
|
|
329
|
+
const valueList = searchableFields
|
|
330
|
+
.map((f) => this.searchValueExpr(`"${contentTable}"."${f}"`, fieldTypes.get(f)))
|
|
331
|
+
.join(", ");
|
|
290
332
|
|
|
291
333
|
// Insert all existing content into FTS table
|
|
292
334
|
await sql
|
|
293
335
|
.raw(`
|
|
294
|
-
INSERT INTO "${ftsTable}"(rowid, id, locale, ${fieldList})
|
|
295
|
-
SELECT rowid, id, locale, ${
|
|
336
|
+
INSERT OR REPLACE INTO "${ftsTable}"(rowid, id, locale, ${fieldList})
|
|
337
|
+
SELECT rowid, id, locale, ${valueList} FROM "${contentTable}"
|
|
296
338
|
WHERE deleted_at IS NULL
|
|
297
339
|
`)
|
|
298
340
|
.execute(this.db);
|
|
@@ -304,7 +346,7 @@ export class FTSManager {
|
|
|
304
346
|
async getSearchConfig(collectionSlug: string): Promise<SearchConfig | null> {
|
|
305
347
|
const result = await this.db
|
|
306
348
|
.selectFrom("_emdash_collections")
|
|
307
|
-
.select("search_config")
|
|
349
|
+
.select(["search_config", "title_field"])
|
|
308
350
|
.where("slug", "=", collectionSlug)
|
|
309
351
|
.executeTakeFirst();
|
|
310
352
|
|
|
@@ -323,6 +365,7 @@ export class FTSManager {
|
|
|
323
365
|
return null;
|
|
324
366
|
}
|
|
325
367
|
const config: SearchConfig = { enabled: parsed.enabled };
|
|
368
|
+
if (result.title_field) config.titleField = result.title_field;
|
|
326
369
|
if ("weights" in parsed && typeof parsed.weights === "object" && parsed.weights !== null) {
|
|
327
370
|
// weights is a JSON-parsed object — safe to treat as Record<string, number>
|
|
328
371
|
const weights: Record<string, number> = {};
|
|
@@ -389,7 +432,7 @@ export class FTSManager {
|
|
|
389
432
|
* `title` is not a system column on `ec_*` tables -- it exists only when a
|
|
390
433
|
* collection defines a field with slug `title`. Search and suggestion SQL
|
|
391
434
|
* that selects `c.title` must check this first; otherwise collections
|
|
392
|
-
* without a title field raise "no such column: c.title"
|
|
435
|
+
* without a title field raise "no such column: c.title".
|
|
393
436
|
*/
|
|
394
437
|
async hasTitleColumn(collectionSlug: string): Promise<boolean> {
|
|
395
438
|
const withTitle = await this.getCollectionsWithTitleColumn([collectionSlug]);
|
|
@@ -534,10 +577,8 @@ export class FTSManager {
|
|
|
534
577
|
return true;
|
|
535
578
|
}
|
|
536
579
|
|
|
537
|
-
// Row count parity check
|
|
538
|
-
//
|
|
539
|
-
// (including soft-deleted rows), so we use the docsize shadow table
|
|
540
|
-
// which tracks rows actually present in the full-text index.
|
|
580
|
+
// Row count parity check against the docsize shadow table, which
|
|
581
|
+
// tracks rows actually present in the full-text index.
|
|
541
582
|
const contentCount = await sql<{ count: number }>`
|
|
542
583
|
SELECT COUNT(*) as count FROM ${sql.ref(contentTable)}
|
|
543
584
|
WHERE deleted_at IS NULL
|