emdash 0.31.1 → 0.33.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-C0ONzkUP.d.mts → adapters-BMyNSSZi.d.mts} +9 -1
- package/dist/adapters-BMyNSSZi.d.mts.map +1 -0
- package/dist/after-CBU2vkoO.mjs +96 -0
- package/dist/after-CBU2vkoO.mjs.map +1 -0
- package/dist/{allowed-origins-CCEi9bPI.mjs → allowed-origins-CG1pACtS.mjs} +2 -2
- package/dist/{allowed-origins-CCEi9bPI.mjs.map → allowed-origins-CG1pACtS.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -4
- package/dist/api/route-utils.d.mts.map +1 -1
- package/dist/api/route-utils.mjs +23 -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 +5 -5
- package/dist/{api-BkqFzIu4.mjs → api-D2hunekQ.mjs} +254 -48
- package/dist/api-D2hunekQ.mjs.map +1 -0
- package/dist/{api-tokens-uPt8UDpx.mjs → api-tokens-CSND0i1z.mjs} +2 -2
- package/dist/{api-tokens-uPt8UDpx.mjs.map → api-tokens-CSND0i1z.mjs.map} +1 -1
- package/dist/{apply-DuXsqll7.mjs → apply-kwNEJW2l.mjs} +36 -23
- package/dist/apply-kwNEJW2l.mjs.map +1 -0
- package/dist/astro/index.d.mts +12 -12
- package/dist/astro/index.mjs +17 -3
- 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/redirect.d.mts.map +1 -1
- package/dist/astro/middleware/redirect.mjs +8 -8
- package/dist/astro/middleware/redirect.mjs.map +1 -1
- package/dist/astro/middleware/request-context.mjs +4 -4
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +10 -10
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +370 -171
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +7 -7
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +7 -7
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +5 -5
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +5 -5
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +10 -10
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +10 -10
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +10 -10
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +19 -18
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +19 -18
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/index.mjs +19 -19
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +16 -16
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_.mjs +7 -7
- package/dist/astro/routes/api/admin/comments/bulk.mjs +12 -12
- package/dist/astro/routes/api/admin/comments/counts.mjs +7 -7
- package/dist/astro/routes/api/admin/comments/index.mjs +12 -12
- 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/repair.mjs +13 -11
- package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +4 -4
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +4 -4
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +47 -44
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +47 -44
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +46 -43
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +5 -5
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +46 -43
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +46 -43
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +46 -43
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +46 -43
- package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +3 -3
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +46 -43
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +46 -43
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +46 -43
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +46 -43
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +47 -44
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +46 -43
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +47 -44
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +46 -43
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +46 -43
- 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 +3 -3
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +46 -43
- 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 +2 -2
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +8 -8
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +5 -5
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/index.mjs +7 -7
- package/dist/astro/routes/api/auth/dev-bypass.mjs +7 -6
- package/dist/astro/routes/api/auth/dev-bypass.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/accept.mjs +2 -2
- package/dist/astro/routes/api/auth/invite/complete.mjs +12 -12
- package/dist/astro/routes/api/auth/invite/index.mjs +10 -10
- package/dist/astro/routes/api/auth/invite/index.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/register-options.mjs +11 -11
- package/dist/astro/routes/api/auth/logout.mjs +3 -3
- package/dist/astro/routes/api/auth/magic-link/send.mjs +12 -12
- package/dist/astro/routes/api/auth/magic-link/send.mjs.map +1 -1
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +3 -3
- package/dist/astro/routes/api/auth/me.mjs +8 -8
- package/dist/astro/routes/api/auth/mode.mjs +3 -3
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +4 -4
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +7 -7
- package/dist/astro/routes/api/auth/passkey/index.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/options.mjs +13 -13
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +11 -11
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +12 -12
- package/dist/astro/routes/api/auth/passkey/verify.mjs +12 -12
- package/dist/astro/routes/api/auth/signup/complete.mjs +12 -12
- package/dist/astro/routes/api/auth/signup/request.mjs +12 -12
- package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/verify.mjs +2 -2
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +18 -18
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs.map +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +15 -15
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +14 -14
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +9 -9
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +19 -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 +19 -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 +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +9 -9
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +17 -16
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +10 -10
- package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/authors.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/index.mjs +9 -9
- package/dist/astro/routes/api/content/_collection_/trash.mjs +8 -8
- package/dist/astro/routes/api/dashboard.mjs +9 -9
- package/dist/astro/routes/api/dev/emails.mjs +3 -3
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +19 -19
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +4 -4
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/execute.mjs +16 -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 +10 -10
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +11 -11
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +13 -11
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +19 -19
- 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.mjs +42 -42
- package/dist/astro/routes/api/media/_id_/confirm.d.mts.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +106 -37
- package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/upload.d.mts +8 -0
- package/dist/astro/routes/api/media/_id_/upload.d.mts.map +1 -0
- package/dist/astro/routes/api/media/_id_/upload.mjs +168 -0
- package/dist/astro/routes/api/media/_id_/upload.mjs.map +1 -0
- package/dist/astro/routes/api/media/_id_/usage.mjs +15 -13
- package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/media/_id_.mjs +22 -15
- package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/media/file/_...key_.mjs +2 -2
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +3 -3
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +3 -3
- package/dist/astro/routes/api/media/providers/index.mjs +3 -3
- package/dist/astro/routes/api/media/upload-url.d.mts.map +1 -1
- package/dist/astro/routes/api/media/upload-url.mjs +35 -24
- package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
- package/dist/astro/routes/api/media.mjs +14 -13
- package/dist/astro/routes/api/media.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +12 -11
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items.mjs +12 -11
- package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +12 -11
- package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/translations.mjs +12 -11
- package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_.mjs +12 -11
- package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/index.mjs +12 -11
- package/dist/astro/routes/api/menus/index.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/code.mjs +9 -9
- package/dist/astro/routes/api/oauth/device/token.mjs +8 -8
- package/dist/astro/routes/api/oauth/register.mjs +3 -3
- package/dist/astro/routes/api/oauth/token/refresh.mjs +6 -6
- package/dist/astro/routes/api/oauth/token/revoke.mjs +6 -6
- package/dist/astro/routes/api/oauth/token.mjs +6 -6
- package/dist/astro/routes/api/openapi.json.mjs +62 -9
- package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +5 -5
- package/dist/astro/routes/api/redirects/404s/index.mjs +12 -12
- package/dist/astro/routes/api/redirects/404s/summary.mjs +12 -12
- package/dist/astro/routes/api/redirects/_id_.mjs +14 -13
- package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/index.mjs +14 -13
- package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/index.mjs +19 -17
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/translations.mjs +14 -12
- package/dist/astro/routes/api/relations/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/relations/index.mjs +19 -17
- package/dist/astro/routes/api/relations/index.mjs.map +1 -1
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +3 -3
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +4 -4
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +46 -43
- 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 +46 -43
- 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 +46 -43
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +46 -43
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +46 -43
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/reorder.d.mts +8 -0
- package/dist/astro/routes/api/schema/collections/reorder.d.mts.map +1 -0
- package/dist/astro/routes/api/schema/collections/reorder.mjs +66 -0
- package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -0
- package/dist/astro/routes/api/schema/index.mjs +12 -8
- package/dist/astro/routes/api/schema/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +46 -43
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +46 -43
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.d.mts +1 -0
- package/dist/astro/routes/api/search/enable.d.mts.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +18 -13
- package/dist/astro/routes/api/search/enable.mjs.map +1 -1
- package/dist/astro/routes/api/search/index.mjs +12 -11
- package/dist/astro/routes/api/search/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/rebuild.mjs +14 -13
- package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
- package/dist/astro/routes/api/search/stats.mjs +8 -7
- package/dist/astro/routes/api/search/stats.mjs.map +1 -1
- package/dist/astro/routes/api/search/suggest.mjs +12 -11
- package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
- package/dist/astro/routes/api/sections/_slug_.mjs +11 -11
- package/dist/astro/routes/api/sections/index.mjs +11 -11
- 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 +16 -16
- package/dist/astro/routes/api/setup/admin-verify.mjs +13 -13
- package/dist/astro/routes/api/setup/admin.mjs +12 -12
- package/dist/astro/routes/api/setup/dev-bypass.mjs +31 -29
- 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 +33 -31
- package/dist/astro/routes/api/setup/index.mjs.map +1 -1
- package/dist/astro/routes/api/setup/status.mjs +4 -4
- package/dist/astro/routes/api/snapshot.mjs +9 -9
- package/dist/astro/routes/api/taxonomies/_name_/reorder.d.mts +8 -0
- package/dist/astro/routes/api/taxonomies/_name_/reorder.d.mts.map +1 -0
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +43 -0
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -0
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +17 -16
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +17 -16
- 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 +22 -18
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +17 -16
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +7 -7
- package/dist/astro/routes/api/typegen.mjs +5 -5
- package/dist/astro/routes/api/well-known/auth.mjs +2 -2
- 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 +8 -8
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +11 -11
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +11 -11
- package/dist/astro/routes/api/widget-areas/_name_.mjs +6 -6
- package/dist/astro/routes/api/widget-areas/index.mjs +11 -11
- package/dist/astro/routes/api/widget-components.mjs +3 -3
- package/dist/astro/routes/robots.txt.mjs +9 -9
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +13 -13
- package/dist/astro/routes/sitemap.xml.mjs +10 -10
- package/dist/astro/types.d.mts +20 -13
- 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-6WPZa1xZ.mjs → authorize-qRhWQnel.mjs} +2 -2
- package/dist/{authorize-6WPZa1xZ.mjs.map → authorize-qRhWQnel.mjs.map} +1 -1
- package/dist/{backup-DoW-H0r4.mjs → backup-CtA6LDNw.mjs} +5 -5
- package/dist/{backup-DoW-H0r4.mjs.map → backup-CtA6LDNw.mjs.map} +1 -1
- package/dist/{byline-BTOxUlFF.mjs → byline-Cp6csL84.mjs} +9 -9
- package/dist/{byline-BTOxUlFF.mjs.map → byline-Cp6csL84.mjs.map} +1 -1
- package/dist/{byline-fields-CdU_LTF1.mjs → byline-fields-CNc0Yq5i.mjs} +2 -2
- package/dist/{byline-fields-CdU_LTF1.mjs.map → byline-fields-CNc0Yq5i.mjs.map} +1 -1
- package/dist/{byline-registry-BCuOp4UF.mjs → byline-registry-ZkPKqEwC.mjs} +4 -4
- package/dist/{byline-registry-BCuOp4UF.mjs.map → byline-registry-ZkPKqEwC.mjs.map} +1 -1
- package/dist/{bylines-Bc-3xtpz.mjs → bylines-CEj5CdT4.mjs} +7 -7
- package/dist/{bylines-Bc-3xtpz.mjs.map → bylines-CEj5CdT4.mjs.map} +1 -1
- package/dist/{bylines-oVN0iPwX.mjs → bylines-cf-C9lmF.mjs} +5 -5
- package/dist/{bylines-oVN0iPwX.mjs.map → bylines-cf-C9lmF.mjs.map} +1 -1
- package/dist/cache-C9FptTFR.mjs +108 -0
- package/dist/cache-C9FptTFR.mjs.map +1 -0
- package/dist/{challenge-store-BFzgFRog.mjs → challenge-store-D9VNKELo.mjs} +1 -1
- package/dist/{challenge-store-BFzgFRog.mjs.map → challenge-store-D9VNKELo.mjs.map} +1 -1
- package/dist/{chunks-Bq-5DPrD.mjs → chunks-DbYzib_k.mjs} +2 -2
- package/dist/{chunks-Bq-5DPrD.mjs.map → chunks-DbYzib_k.mjs.map} +1 -1
- package/dist/cli/index.mjs +41 -32
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +1 -1
- package/dist/client/index.mjs +2 -2
- package/dist/{comment-B9cUud8H.mjs → comment-BIkJ6Fil.mjs} +3 -3
- package/dist/{comment-B9cUud8H.mjs.map → comment-BIkJ6Fil.mjs.map} +1 -1
- package/dist/{comment-reaction-VUXO981F.mjs → comment-reaction-D-laEceb.mjs} +2 -2
- package/dist/{comment-reaction-VUXO981F.mjs.map → comment-reaction-D-laEceb.mjs.map} +1 -1
- package/dist/{comments-PXj1E9Si.mjs → comments-0_w6KChA.mjs} +3 -3
- package/dist/{comments-PXj1E9Si.mjs.map → comments-0_w6KChA.mjs.map} +1 -1
- package/dist/{components-DZkL4Fx0.mjs → components-BPxrRjpE.mjs} +1 -1
- package/dist/{components-DZkL4Fx0.mjs.map → components-BPxrRjpE.mjs.map} +1 -1
- package/dist/{config-B6b_BobR.mjs → config-DyF3OKg_.mjs} +15 -10
- package/dist/config-DyF3OKg_.mjs.map +1 -0
- package/dist/{content-BC43pICM.mjs → content-CJ94NEx5.mjs} +170 -117
- package/dist/content-CJ94NEx5.mjs.map +1 -0
- package/dist/{content-refresh-CPMSauD3.mjs → content-refresh-Xw7aKmou.mjs} +7 -7
- package/dist/{content-refresh-CPMSauD3.mjs.map → content-refresh-Xw7aKmou.mjs.map} +1 -1
- package/dist/{context-DOurRIrb.mjs → context-C_1nrqnW.mjs} +14 -14
- package/dist/{context-DOurRIrb.mjs.map → context-C_1nrqnW.mjs.map} +1 -1
- package/dist/{cron-BlKIMD_e.mjs → cron-DRV-UC4K.mjs} +1 -1
- package/dist/{cron-BlKIMD_e.mjs.map → cron-DRV-UC4K.mjs.map} +1 -1
- package/dist/{dashboard-CBm4zhc3.mjs → dashboard-DINnNVVU.mjs} +5 -5
- package/dist/{dashboard-CBm4zhc3.mjs.map → dashboard-DINnNVVU.mjs.map} +1 -1
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +3 -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/{default-C4v9KP56.mjs → default-BD2FG0xV.mjs} +1 -1
- package/dist/{default-C4v9KP56.mjs.map → default-BD2FG0xV.mjs.map} +1 -1
- package/dist/deferred-tasks-C-WRCcKo.d.mts +9 -0
- package/dist/deferred-tasks-C-WRCcKo.d.mts.map +1 -0
- package/dist/{device-flow-BeA6lUS1.mjs → device-flow-CTqd8mud.mjs} +5 -5
- package/dist/{device-flow-BeA6lUS1.mjs.map → device-flow-CTqd8mud.mjs.map} +1 -1
- package/dist/{dialect-helpers-BtOwo2us.mjs → dialect-helpers-BSbfaO3F.mjs} +43 -16
- package/dist/dialect-helpers-BSbfaO3F.mjs.map +1 -0
- package/dist/{email-console-C-9Ng8DM.mjs → email-console-C6WdcWbL.mjs} +1 -1
- package/dist/{email-console-C-9Ng8DM.mjs.map → email-console-C6WdcWbL.mjs.map} +1 -1
- package/dist/{error-DJ98TRbQ.mjs → error-oh_9i6bR.mjs} +3 -3
- package/dist/{error-DJ98TRbQ.mjs.map → error-oh_9i6bR.mjs.map} +1 -1
- package/dist/{errors-DtEXIQQV.mjs → errors-BucQ8VYz.mjs} +2 -1
- package/dist/errors-BucQ8VYz.mjs.map +1 -0
- package/dist/{escape-CFedIB1C.mjs → escape-CXps5F_v.mjs} +1 -1
- package/dist/{escape-CFedIB1C.mjs.map → escape-CXps5F_v.mjs.map} +1 -1
- package/dist/{field-defs-cache-KfNJ_qLQ.mjs → field-defs-cache-WD82dMQq.mjs} +4 -4
- package/dist/{field-defs-cache-KfNJ_qLQ.mjs.map → field-defs-cache-WD82dMQq.mjs.map} +1 -1
- package/dist/{fts-manager-hyCU9OOp.mjs → fts-manager-BITakW_R.mjs} +37 -13
- package/dist/fts-manager-BITakW_R.mjs.map +1 -0
- package/dist/{hash-DFFrkivP.mjs → hash-Cg0TXJPV.mjs} +8 -4
- package/dist/hash-Cg0TXJPV.mjs.map +1 -0
- package/dist/{hreflang-CIxH_LKz.d.mts → hreflang-BaLCNcDx.d.mts} +2 -2
- package/dist/{hreflang-CIxH_LKz.d.mts.map → hreflang-BaLCNcDx.d.mts.map} +1 -1
- package/dist/{hreflang-CbYeCzl9.mjs → hreflang-BdZuVBhL.mjs} +7 -7
- package/dist/{hreflang-CbYeCzl9.mjs.map → hreflang-BdZuVBhL.mjs.map} +1 -1
- package/dist/{import-oDYCgNYQ.mjs → import-C-9uqyT3.mjs} +6 -6
- package/dist/{import-oDYCgNYQ.mjs.map → import-C-9uqyT3.mjs.map} +1 -1
- package/dist/{index-BZJ_5FOX.d.mts → index-M37iz29I.d.mts} +112 -37
- package/dist/index-M37iz29I.d.mts.map +1 -0
- package/dist/{index-BEui-cRd.d.mts → index-MGw47uWq.d.mts} +3 -3
- package/dist/{index-BEui-cRd.d.mts.map → index-MGw47uWq.d.mts.map} +1 -1
- package/dist/index.d.mts +19 -19
- package/dist/index.mjs +69 -67
- package/dist/{load-Dg5gtWma.mjs → load-DV1DZuUJ.mjs} +2 -2
- package/dist/{load-Dg5gtWma.mjs.map → load-DV1DZuUJ.mjs.map} +1 -1
- package/dist/{loader-D4rigvjR.mjs → loader-CGugY7Zl.mjs} +29 -15
- package/dist/loader-CGugY7Zl.mjs.map +1 -0
- package/dist/{manifest-schema-bCq54i7F.mjs → manifest-schema-Da7kj23y.mjs} +1 -1
- package/dist/{manifest-schema-bCq54i7F.mjs.map → manifest-schema-Da7kj23y.mjs.map} +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/local-runtime.d.mts +12 -12
- package/dist/media/local-runtime.mjs +8 -8
- package/dist/{media-its1WLYv.mjs → media-BP7S-nHT.mjs} +60 -15
- package/dist/media-BP7S-nHT.mjs.map +1 -0
- package/dist/{media-BJ6SRY3g.mjs → media-OhYL-7Io.mjs} +8 -4
- package/dist/{media-BJ6SRY3g.mjs.map → media-OhYL-7Io.mjs.map} +1 -1
- package/dist/{media-allowlist-jUppPWFy.mjs → media-allowlist-D-peH1H5.mjs} +1 -1
- package/dist/{media-allowlist-jUppPWFy.mjs.map → media-allowlist-D-peH1H5.mjs.map} +1 -1
- package/dist/{media-upload-DNu3QySc.mjs → media-upload-DtrwU2B0.mjs} +7 -7
- package/dist/{media-upload-DNu3QySc.mjs.map → media-upload-DtrwU2B0.mjs.map} +1 -1
- package/dist/{media-url-BCm5vBn6.mjs → media-url-DYs_YLOx.mjs} +1 -1
- package/dist/{media-url-BCm5vBn6.mjs.map → media-url-DYs_YLOx.mjs.map} +1 -1
- package/dist/{media-usage-DPQ3K4xB.mjs → media-usage-BlxfTkN0.mjs} +8 -8
- package/dist/{media-usage-DPQ3K4xB.mjs.map → media-usage-BlxfTkN0.mjs.map} +1 -1
- package/dist/{menus-BMGzWyWH.mjs → menus-BcQWxeXu.mjs} +5 -5
- package/dist/{menus-BMGzWyWH.mjs.map → menus-BcQWxeXu.mjs.map} +1 -1
- package/dist/{menus-CPf_SW7u.mjs → menus-Y54RDPIN.mjs} +215 -38
- package/dist/menus-Y54RDPIN.mjs.map +1 -0
- package/dist/{mode-fiXRMfeA.mjs → mode-BWyTBe3I.mjs} +1 -1
- package/dist/{mode-fiXRMfeA.mjs.map → mode-BWyTBe3I.mjs.map} +1 -1
- package/dist/{oauth-authorization-oqfbBuMH.mjs → oauth-authorization-ClvktmrL.mjs} +5 -5
- package/dist/{oauth-authorization-oqfbBuMH.mjs.map → oauth-authorization-ClvktmrL.mjs.map} +1 -1
- package/dist/{oauth-clients-BlrUHAsf.mjs → oauth-clients-8ao-U66l.mjs} +1 -1
- package/dist/{oauth-clients-BlrUHAsf.mjs.map → oauth-clients-8ao-U66l.mjs.map} +1 -1
- package/dist/{oauth-state-store-DnvjRMy6.mjs → oauth-state-store-B1ofdTiQ.mjs} +1 -1
- package/dist/{oauth-state-store-DnvjRMy6.mjs.map → oauth-state-store-B1ofdTiQ.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-oUllxvAv.mjs → oauth-user-lookup-CscEuIiR.mjs} +1 -1
- package/dist/{oauth-user-lookup-oUllxvAv.mjs.map → oauth-user-lookup-CscEuIiR.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/{object-cache-Bok5j2ae.mjs → object-cache-71tPfV4A.mjs} +106 -5
- package/dist/object-cache-71tPfV4A.mjs.map +1 -0
- package/dist/{options-BqMkWfYa.d.mts → options-CA4eVX6P.d.mts} +3 -3
- package/dist/{options-BqMkWfYa.d.mts.map → options-CA4eVX6P.d.mts.map} +1 -1
- package/dist/{options-BlmBHTvX.mjs → options-CBXIHUoT.mjs} +1 -1
- package/dist/{options-BlmBHTvX.mjs.map → options-CBXIHUoT.mjs.map} +1 -1
- package/dist/page/index.d.mts +2 -2
- package/dist/{parse-53zyxlpv.mjs → parse-CJKNuewM.mjs} +2 -2
- package/dist/{parse-53zyxlpv.mjs.map → parse-CJKNuewM.mjs.map} +1 -1
- package/dist/{passkey-config-C-SKpc0-.mjs → passkey-config-D-zrzMJI.mjs} +1 -1
- package/dist/{passkey-config-C-SKpc0-.mjs.map → passkey-config-D-zrzMJI.mjs.map} +1 -1
- package/dist/{placeholder-Dop47JMM.d.mts → placeholder-DaeNS-VG.d.mts} +1 -1
- package/dist/{placeholder-Dop47JMM.d.mts.map → placeholder-DaeNS-VG.d.mts.map} +1 -1
- package/dist/plugin-types.d.mts +1 -1
- package/dist/plugin-utils.d.mts +10 -10
- package/dist/plugins/adapt-sandbox-entry.d.mts +10 -10
- package/dist/plugins/adapt-sandbox-entry.mjs +2 -2
- package/dist/{portable-text-sDj92Kxv.mjs → portable-text-B_kqBmXB.mjs} +1 -1
- package/dist/{portable-text-sDj92Kxv.mjs.map → portable-text-B_kqBmXB.mjs.map} +1 -1
- package/dist/{preview-D4Jnbfx7.mjs → preview-BU6PaLpM.mjs} +2 -2
- package/dist/{preview-D4Jnbfx7.mjs.map → preview-BU6PaLpM.mjs.map} +1 -1
- package/dist/{public-url-DSGTnJFw.mjs → public-url-Ox9oOlgp.mjs} +14 -3
- package/dist/public-url-Ox9oOlgp.mjs.map +1 -0
- package/dist/{query-Bz9bWZfm.mjs → query-C5w7PsRQ.mjs} +43 -44
- package/dist/query-C5w7PsRQ.mjs.map +1 -0
- package/dist/{query-DdFGHzQF.mjs → query-rC9HKv1N.mjs} +4 -4
- package/dist/{query-DdFGHzQF.mjs.map → query-rC9HKv1N.mjs.map} +1 -1
- package/dist/{rate-limit-D3IEiUi2.mjs → rate-limit-kug6q99V.mjs} +2 -2
- package/dist/{rate-limit-D3IEiUi2.mjs.map → rate-limit-kug6q99V.mjs.map} +1 -1
- package/dist/{redirect-BoUac4NT.mjs → redirect-DIJxXKOG.mjs} +3 -3
- package/dist/{redirect-BoUac4NT.mjs.map → redirect-DIJxXKOG.mjs.map} +1 -1
- package/dist/{redirect-Botom7X6.mjs → redirect-Egf2R9yP.mjs} +1 -1
- package/dist/{redirect-Botom7X6.mjs.map → redirect-Egf2R9yP.mjs.map} +1 -1
- package/dist/{redirects-ChbpqKiS.mjs → redirects-Bzm812bY.mjs} +5 -5
- package/dist/{redirects-ChbpqKiS.mjs.map → redirects-Bzm812bY.mjs.map} +1 -1
- package/dist/{redirects-D457qwt0.mjs → redirects-G8wAhWAf.mjs} +25 -7
- package/dist/redirects-G8wAhWAf.mjs.map +1 -0
- package/dist/{registry-y21kjhfG.mjs → registry-Dbodb4Uo.mjs} +59 -14
- package/dist/registry-Dbodb4Uo.mjs.map +1 -0
- package/dist/{relation-Du0r04E0.mjs → relation-Cbe3Sd3m.mjs} +3 -3
- package/dist/{relation-Du0r04E0.mjs.map → relation-Cbe3Sd3m.mjs.map} +1 -1
- package/dist/{relations-CZMpBqEd.mjs → relations-Bw_E1TXo.mjs} +3 -3
- package/dist/{relations-CZMpBqEd.mjs.map → relations-Bw_E1TXo.mjs.map} +1 -1
- package/dist/{relations-qKmSj9KM.d.mts → relations-G2ta7GIl.d.mts} +50 -12
- package/dist/relations-G2ta7GIl.d.mts.map +1 -0
- package/dist/{relations-DtX1UMBH.mjs → relations-qHwpUe66.mjs} +6 -6
- package/dist/{relations-DtX1UMBH.mjs.map → relations-qHwpUe66.mjs.map} +1 -1
- package/dist/request-context.d.mts +3 -0
- package/dist/request-context.d.mts.map +1 -1
- package/dist/request-context.mjs.map +1 -1
- package/dist/{request-meta-DzXYYI-n.mjs → request-meta-Df-jFbAd.mjs} +2 -2
- package/dist/{request-meta-DzXYYI-n.mjs.map → request-meta-Df-jFbAd.mjs.map} +1 -1
- package/dist/{resolve-DFr4kq72.mjs → resolve-DZzG4HqM.mjs} +2 -2
- package/dist/{resolve-DFr4kq72.mjs.map → resolve-DZzG4HqM.mjs.map} +1 -1
- package/dist/{runner-BdeLEgad.mjs → runner-BFTrkYhu.mjs} +497 -213
- package/dist/runner-BFTrkYhu.mjs.map +1 -0
- package/dist/{runner-Dd8m8k9F.d.mts → runner-BaADli8l.d.mts} +2 -2
- package/dist/{runner-Dd8m8k9F.d.mts.map → runner-BaADli8l.d.mts.map} +1 -1
- package/dist/runtime.d.mts +11 -11
- package/dist/runtime.mjs +3 -3
- package/dist/{schema-BH8P8vaC.mjs → schema-CiQXr6_F.mjs} +3 -3
- package/dist/{schema-BH8P8vaC.mjs.map → schema-CiQXr6_F.mjs.map} +1 -1
- package/dist/{scopes-DTIkIaGA.mjs → scopes-CNJVT5i5.mjs} +3 -3
- package/dist/{scopes-DTIkIaGA.mjs.map → scopes-CNJVT5i5.mjs.map} +1 -1
- package/dist/{search-D-Yhpmvs.mjs → search-FZhx5dDU.mjs} +7 -7
- package/dist/{search-D-Yhpmvs.mjs.map → search-FZhx5dDU.mjs.map} +1 -1
- package/dist/{secrets-CQ-69kF9.mjs → secrets-DLd8RXee.mjs} +4 -4
- package/dist/{secrets-CQ-69kF9.mjs.map → secrets-DLd8RXee.mjs.map} +1 -1
- package/dist/{sections-CzVBAKjw.mjs → sections-BrIrMUCn.mjs} +3 -3
- package/dist/{sections-CzVBAKjw.mjs.map → sections-BrIrMUCn.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +25 -23
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.mjs +18 -16
- package/dist/seo/index.mjs.map +1 -1
- package/dist/{seo-C3GDfT0V.mjs → seo-CobNfOvb.mjs} +2 -2
- package/dist/{seo-C3GDfT0V.mjs.map → seo-CobNfOvb.mjs.map} +1 -1
- package/dist/{seo-kJzVAmmu.mjs → seo-DTHRntNC.mjs} +3 -3
- package/dist/{seo-kJzVAmmu.mjs.map → seo-DTHRntNC.mjs.map} +1 -1
- package/dist/{service-CQnc276a.mjs → service-B-pYGPgR.mjs} +4 -4
- package/dist/{service-CQnc276a.mjs.map → service-B-pYGPgR.mjs.map} +1 -1
- package/dist/{session-user-DbHqKDKe.mjs → session-user-BvM9-zNl.mjs} +2 -2
- package/dist/{session-user-DbHqKDKe.mjs.map → session-user-BvM9-zNl.mjs.map} +1 -1
- package/dist/{settings-Dtc0DU31.mjs → settings-DPHau-WH.mjs} +3 -3
- package/dist/{settings-Dtc0DU31.mjs.map → settings-DPHau-WH.mjs.map} +1 -1
- package/dist/{settings-C2PaBS49.mjs → settings-kJhGiQ4z.mjs} +7 -7
- package/dist/{settings-C2PaBS49.mjs.map → settings-kJhGiQ4z.mjs.map} +1 -1
- package/dist/{setup-complete-CdIlqloh.mjs → setup-complete-u50Qm8rY.mjs} +2 -2
- package/dist/{setup-complete-CdIlqloh.mjs.map → setup-complete-u50Qm8rY.mjs.map} +1 -1
- package/dist/{setup-nonce-DqiIPr-J.mjs → setup-nonce-DCjiiOD2.mjs} +1 -1
- package/dist/{setup-nonce-DqiIPr-J.mjs.map → setup-nonce-DCjiiOD2.mjs.map} +1 -1
- package/dist/{single-flight-cache-C2exrGAi.mjs → single-flight-cache-DW3w11Pu.mjs} +1 -1
- package/dist/{single-flight-cache-C2exrGAi.mjs.map → single-flight-cache-DW3w11Pu.mjs.map} +1 -1
- package/dist/site-url-I-lJ5kma.mjs +16 -0
- package/dist/site-url-I-lJ5kma.mjs.map +1 -0
- package/dist/{snapshot-BdpUJKD-.mjs → snapshot-I_fjLDaD.mjs} +2 -2
- package/dist/{snapshot-BdpUJKD-.mjs.map → snapshot-I_fjLDaD.mjs.map} +1 -1
- package/dist/{ssrf-CviKqWmq.mjs → ssrf-CTa6v21i.mjs} +1 -1
- package/dist/{ssrf-CviKqWmq.mjs.map → ssrf-CTa6v21i.mjs.map} +1 -1
- package/dist/{state-xxv6ZTMv.mjs → state-CQvoefYP.mjs} +1 -1
- package/dist/{state-xxv6ZTMv.mjs.map → state-CQvoefYP.mjs.map} +1 -1
- package/dist/{status-COfycGIU.mjs → status-CIsmlC1E.mjs} +1 -1
- package/dist/{status-COfycGIU.mjs.map → status-CIsmlC1E.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 +2 -2
- package/dist/storage/s3.mjs.map +1 -1
- package/dist/{taxonomies-BN6M9Nrv.mjs → taxonomies-CKuaZER5.mjs} +90 -9
- package/dist/taxonomies-CKuaZER5.mjs.map +1 -0
- package/dist/{taxonomies-r7pqLBCn.mjs → taxonomies-CLN1N92E.mjs} +57 -32
- package/dist/taxonomies-CLN1N92E.mjs.map +1 -0
- package/dist/{taxonomy-0mCI25HN.mjs → taxonomy-pOrB2kZe.mjs} +142 -15
- package/dist/taxonomy-pOrB2kZe.mjs.map +1 -0
- package/dist/{tokens-DVltpO2D.mjs → tokens-DagaJGK8.mjs} +1 -1
- package/dist/{tokens-DVltpO2D.mjs.map → tokens-DagaJGK8.mjs.map} +1 -1
- package/dist/{transaction-D0FOsb3X.mjs → transaction-NQj4VJ7Z.mjs} +1 -1
- package/dist/{transaction-D0FOsb3X.mjs.map → transaction-NQj4VJ7Z.mjs.map} +1 -1
- package/dist/{transport-Vd7VdqHv.d.mts → transport-CAwTaTp_.d.mts} +1 -1
- package/dist/{transport-Vd7VdqHv.d.mts.map → transport-CAwTaTp_.d.mts.map} +1 -1
- package/dist/{transport-CKrlqSpD.mjs → transport-DVsa5YYo.mjs} +1 -1
- package/dist/{transport-CKrlqSpD.mjs.map → transport-DVsa5YYo.mjs.map} +1 -1
- package/dist/{trusted-proxy-CwjQj0YG.mjs → trusted-proxy-D20_7fyX.mjs} +1 -1
- package/dist/{trusted-proxy-CwjQj0YG.mjs.map → trusted-proxy-D20_7fyX.mjs.map} +1 -1
- package/dist/{types-BfYUPJdP.d.mts → types-BGWPMiBO.d.mts} +2 -2
- package/dist/{types-BfYUPJdP.d.mts.map → types-BGWPMiBO.d.mts.map} +1 -1
- package/dist/{types-iVeZ5g6N.d.mts → types-BK6U01Ro.d.mts} +1 -1
- package/dist/{types-iVeZ5g6N.d.mts.map → types-BK6U01Ro.d.mts.map} +1 -1
- package/dist/{types-BD40g7zz.mjs → types-BjxTKxrZ.mjs} +1 -1
- package/dist/{types-BD40g7zz.mjs.map → types-BjxTKxrZ.mjs.map} +1 -1
- package/dist/{types-Kmaxdarz.d.mts → types-BnFP1M3J.d.mts} +22 -1
- package/dist/types-BnFP1M3J.d.mts.map +1 -0
- package/dist/{types-C7U0HlEr.d.mts → types-C8oz_ayJ.d.mts} +1 -1
- package/dist/{types-C7U0HlEr.d.mts.map → types-C8oz_ayJ.d.mts.map} +1 -1
- package/dist/{types-B4vm81VH.d.mts → types-CbUcuxxc.d.mts} +1 -1
- package/dist/{types-B4vm81VH.d.mts.map → types-CbUcuxxc.d.mts.map} +1 -1
- package/dist/{types-CrRUFdej.mjs → types-Cd8iuS1J.mjs} +10 -3
- package/dist/{types-CrRUFdej.mjs.map → types-Cd8iuS1J.mjs.map} +1 -1
- package/dist/types-CtzytVXn.mjs +18 -0
- package/dist/types-CtzytVXn.mjs.map +1 -0
- package/dist/{types-BvB7gDOD.d.mts → types-Cz8hNch2.d.mts} +5 -5
- package/dist/{types-BvB7gDOD.d.mts.map → types-Cz8hNch2.d.mts.map} +1 -1
- package/dist/{types-B97jg3aW.d.mts → types-DLG4IFEQ.d.mts} +1 -1
- package/dist/{types-B97jg3aW.d.mts.map → types-DLG4IFEQ.d.mts.map} +1 -1
- package/dist/{types-DPKhI5ib.d.mts → types-Dc4ntQjQ.d.mts} +18 -1
- package/dist/types-Dc4ntQjQ.d.mts.map +1 -0
- package/dist/{types-BNfPHfay.d.mts → types-LoagAGzH.d.mts} +1 -1
- package/dist/{types-BNfPHfay.d.mts.map → types-LoagAGzH.d.mts.map} +1 -1
- package/dist/{types-o7xo7VgH.mjs → types-NBI3rF-_.mjs} +3 -2
- package/dist/types-NBI3rF-_.mjs.map +1 -0
- package/dist/upload-attempts-D8QAFLUJ.mjs +27 -0
- package/dist/upload-attempts-D8QAFLUJ.mjs.map +1 -0
- package/dist/{user-aTXqmXBz.mjs → user-DBrq4UVq.mjs} +3 -3
- package/dist/{user-aTXqmXBz.mjs.map → user-DBrq4UVq.mjs.map} +1 -1
- package/dist/{utils-BbUgmeZG.mjs → utils-hLzi_2Fn.mjs} +2 -2
- package/dist/{utils-BbUgmeZG.mjs.map → utils-hLzi_2Fn.mjs.map} +1 -1
- package/dist/{validate-VPnKoIzW.mjs → validate-BpwoDOgt.mjs} +25 -2
- package/dist/validate-BpwoDOgt.mjs.map +1 -0
- package/dist/{validate-DULfgpJP.d.mts → validate-C3oSmA7F.d.mts} +15 -5
- package/dist/validate-C3oSmA7F.d.mts.map +1 -0
- package/dist/{validate-CDT1jl6_.mjs → validate-mKo3RxBM.mjs} +4 -4
- package/dist/{validate-CDT1jl6_.mjs.map → validate-mKo3RxBM.mjs.map} +1 -1
- package/dist/{validation-DlD0E35W.mjs → validation-BgpucsvF.mjs} +11 -9
- package/dist/{validation-DlD0E35W.mjs.map → validation-BgpucsvF.mjs.map} +1 -1
- package/dist/version-C4PnpmoV.mjs +7 -0
- package/dist/{version-BRMngh9I.mjs.map → version-C4PnpmoV.mjs.map} +1 -1
- package/dist/{widgets-5fipNkMT.mjs → widgets-CJJtkiKh.mjs} +3 -3
- package/dist/{widgets-5fipNkMT.mjs.map → widgets-CJJtkiKh.mjs.map} +1 -1
- package/dist/{wxr-taxonomies-DrihupaC.mjs → wxr-taxonomies-9PPSy8X6.mjs} +4 -4
- package/dist/{wxr-taxonomies-DrihupaC.mjs.map → wxr-taxonomies-9PPSy8X6.mjs.map} +1 -1
- package/dist/{wxr-taxonomies-B4tMuN5T.d.mts → wxr-taxonomies-Bkpp_2tK.d.mts} +1 -1
- package/dist/{wxr-taxonomies-B4tMuN5T.d.mts.map → wxr-taxonomies-Bkpp_2tK.d.mts.map} +1 -1
- package/dist/{zod-generator-CwkHWz4f.mjs → zod-generator-CG64Hnbh.mjs} +3 -3
- package/dist/{zod-generator-CwkHWz4f.mjs.map → zod-generator-CG64Hnbh.mjs.map} +1 -1
- package/package.json +12 -8
- package/src/after.ts +6 -1
- package/src/api/errors.ts +1 -0
- package/src/api/handlers/content.ts +45 -4
- package/src/api/handlers/marketplace.ts +14 -0
- package/src/api/handlers/media.ts +4 -4
- package/src/api/handlers/registry.ts +14 -0
- package/src/api/handlers/revision.ts +19 -5
- package/src/api/handlers/schema.ts +37 -0
- package/src/api/handlers/snapshot.ts +1 -1
- package/src/api/handlers/taxonomies.ts +111 -10
- package/src/api/openapi/document.ts +84 -3
- package/src/api/public-url.ts +14 -2
- package/src/api/schemas/media.ts +9 -2
- package/src/api/schemas/schema.ts +13 -0
- package/src/api/schemas/search.ts +2 -0
- package/src/api/schemas/taxonomies.ts +34 -1
- package/src/api/site-url.ts +16 -6
- package/src/astro/integration/routes.ts +19 -0
- package/src/astro/integration/runtime.ts +13 -0
- package/src/astro/integration/virtual-modules.ts +2 -0
- package/src/astro/middleware/redirect.ts +2 -10
- package/src/astro/middleware/scoped-db.ts +35 -4
- package/src/astro/middleware.ts +56 -22
- package/src/astro/routes/api/admin/comments/[id]/status.ts +1 -1
- package/src/astro/routes/api/admin/users/[id]/send-recovery.ts +2 -2
- package/src/astro/routes/api/auth/invite/index.ts +2 -2
- package/src/astro/routes/api/auth/magic-link/send.ts +2 -2
- package/src/astro/routes/api/auth/signup/request.ts +2 -2
- package/src/astro/routes/api/comments/[collection]/[contentId]/index.ts +1 -1
- package/src/astro/routes/api/content/[collection]/[id].ts +3 -1
- package/src/astro/routes/api/media/[id]/confirm.ts +148 -59
- package/src/astro/routes/api/media/[id]/upload.ts +262 -0
- package/src/astro/routes/api/media/[id].ts +19 -10
- package/src/astro/routes/api/media/upload-url.ts +28 -31
- package/src/astro/routes/api/schema/collections/reorder.ts +31 -0
- package/src/astro/routes/api/schema/index.ts +2 -0
- package/src/astro/routes/api/search/enable.ts +5 -1
- package/src/astro/routes/api/search/rebuild.ts +6 -1
- package/src/astro/routes/api/taxonomies/[name]/reorder.ts +41 -0
- package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +6 -3
- package/src/astro/types.ts +7 -0
- package/src/cleanup.ts +54 -26
- package/src/cli/commands/dev.ts +13 -3
- package/src/cli/commands/export-seed.ts +2 -0
- package/src/cli/index.ts +1 -1
- package/src/components/CommentForm.astro +1 -1
- package/src/components/Comments.astro +1 -1
- package/src/components/InlinePortableTextEditor.tsx +175 -31
- package/src/components/OrderedList.astro +14 -0
- package/src/components/PortableText.astro +26 -4
- package/src/components/code-mark.ts +11 -0
- package/src/components/index.ts +12 -1
- package/src/components/ordered-list.ts +549 -0
- package/src/content/converters/numbered-list.ts +148 -0
- package/src/content/converters/portable-text-to-prosemirror.ts +59 -9
- package/src/content/converters/prosemirror-to-portable-text.ts +23 -12
- package/src/content/converters/types.ts +2 -0
- package/src/content/portable-text-lists.ts +205 -0
- package/src/database/dialect-helpers.ts +41 -22
- package/src/database/migrations/054_media_upload_attempts.ts +41 -0
- package/src/database/migrations/055_content_translation_group_locale_index.ts +67 -0
- package/src/database/migrations/056_taxonomy_term_sort_order.ts +189 -0
- package/src/database/migrations/057_collection_hidden.ts +24 -0
- package/src/database/migrations/058_collection_sort_order.ts +20 -0
- package/src/database/migrations/059_revision_prune_queue.ts +36 -0
- package/src/database/migrations/runner.ts +12 -0
- package/src/database/repositories/content.ts +193 -183
- package/src/database/repositories/media.ts +158 -28
- package/src/database/repositories/revision.ts +82 -17
- package/src/database/repositories/taxonomy.ts +202 -7
- package/src/database/repositories/types.ts +7 -0
- package/src/database/types.ts +23 -1
- package/src/database/validate.ts +39 -0
- package/src/db/adapters.ts +8 -0
- package/src/deferred-tasks.ts +71 -0
- package/src/emdash-runtime.ts +277 -88
- package/src/i18n/config.ts +17 -10
- package/src/index.ts +3 -0
- package/src/loader.ts +46 -24
- package/src/media/upload-attempts.ts +33 -0
- package/src/media/usage/gc.ts +50 -0
- package/src/object-cache/index.ts +160 -3
- package/src/plugins/routes.ts +34 -0
- package/src/plugins/storage-indexes.ts +50 -11
- package/src/query.ts +50 -44
- package/src/redirects/cache.ts +79 -19
- package/src/request-context.ts +3 -0
- package/src/scheduled-publish.ts +6 -1
- package/src/schema/registry.ts +95 -3
- package/src/schema/types.ts +24 -0
- package/src/search/fts-manager.ts +50 -10
- package/src/search/index.ts +2 -0
- package/src/search/types.ts +6 -0
- package/src/seed/apply.ts +22 -2
- package/src/seed/types.ts +10 -0
- package/src/storage/s3.ts +1 -1
- package/src/taxonomies/index.ts +11 -7
- package/src/taxonomies/term-counts.ts +56 -28
- package/src/ui-comments.ts +19 -0
- package/src/ui.ts +11 -3
- package/src/utils/hash.ts +14 -3
- package/src/virtual-modules.d.ts +8 -0
- package/dist/adapters-C0ONzkUP.d.mts.map +0 -1
- package/dist/after-B1IIdH3Y.mjs +0 -29
- package/dist/after-B1IIdH3Y.mjs.map +0 -1
- package/dist/api-BkqFzIu4.mjs.map +0 -1
- package/dist/apply-DuXsqll7.mjs.map +0 -1
- package/dist/cache-DDwy3JDW.mjs +0 -65
- package/dist/cache-DDwy3JDW.mjs.map +0 -1
- package/dist/config-B6b_BobR.mjs.map +0 -1
- package/dist/content-BC43pICM.mjs.map +0 -1
- package/dist/dialect-helpers-BtOwo2us.mjs.map +0 -1
- package/dist/errors-DtEXIQQV.mjs.map +0 -1
- package/dist/fts-manager-hyCU9OOp.mjs.map +0 -1
- package/dist/hash-DFFrkivP.mjs.map +0 -1
- package/dist/index-BZJ_5FOX.d.mts.map +0 -1
- package/dist/loader-D4rigvjR.mjs.map +0 -1
- package/dist/media-its1WLYv.mjs.map +0 -1
- package/dist/menus-CPf_SW7u.mjs.map +0 -1
- package/dist/object-cache-Bok5j2ae.mjs.map +0 -1
- package/dist/public-url-DSGTnJFw.mjs.map +0 -1
- package/dist/query-Bz9bWZfm.mjs.map +0 -1
- package/dist/redirects-D457qwt0.mjs.map +0 -1
- package/dist/registry-y21kjhfG.mjs.map +0 -1
- package/dist/relations-qKmSj9KM.d.mts.map +0 -1
- package/dist/runner-BdeLEgad.mjs.map +0 -1
- package/dist/site-url-NGJT6NTU.mjs +0 -13
- package/dist/site-url-NGJT6NTU.mjs.map +0 -1
- package/dist/taxonomies-BN6M9Nrv.mjs.map +0 -1
- package/dist/taxonomies-r7pqLBCn.mjs.map +0 -1
- package/dist/taxonomy-0mCI25HN.mjs.map +0 -1
- package/dist/types-DPKhI5ib.d.mts.map +0 -1
- package/dist/types-Kmaxdarz.d.mts.map +0 -1
- package/dist/types-o7xo7VgH.mjs.map +0 -1
- package/dist/validate-DULfgpJP.d.mts.map +0 -1
- package/dist/validate-VPnKoIzW.mjs.map +0 -1
- package/dist/version-BRMngh9I.mjs +0 -7
- /package/dist/{api-tokens-Cvmixds7.mjs → api-tokens-Dai9dND0.mjs} +0 -0
- /package/dist/{ssrf-BB__xfNM.mjs → ssrf-Cj568Dgs.mjs} +0 -0
- /package/dist/{types-CK0LxPUQ.mjs → types-DKuWPYV5.mjs} +0 -0
package/src/emdash-runtime.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
import { Permissions } from "@emdash-cms/auth";
|
|
11
11
|
import type { Element } from "@emdash-cms/blocks";
|
|
12
|
-
import { Kysely,
|
|
12
|
+
import { Kysely, type Dialect } from "kysely";
|
|
13
13
|
import virtualConfig from "virtual:emdash/config";
|
|
14
14
|
import { z } from "zod";
|
|
15
15
|
|
|
@@ -30,12 +30,13 @@ import {
|
|
|
30
30
|
runMigrations,
|
|
31
31
|
} from "./database/migrations/runner.js";
|
|
32
32
|
import { AuditRepository } from "./database/repositories/audit.js";
|
|
33
|
+
import { ContentRepository } from "./database/repositories/content.js";
|
|
33
34
|
import { RevisionRepository } from "./database/repositories/revision.js";
|
|
35
|
+
import { ContentMutationConflictError } from "./database/repositories/types.js";
|
|
34
36
|
import type {
|
|
35
37
|
ContentItem as ContentItemInternal,
|
|
36
38
|
ContentDateField,
|
|
37
39
|
} from "./database/repositories/types.js";
|
|
38
|
-
import { validateIdentifier } from "./database/validate.js";
|
|
39
40
|
import { getI18nConfig } from "./i18n/config.js";
|
|
40
41
|
import { repairLocaleCasing } from "./i18n/repair-locale-casing.js";
|
|
41
42
|
import { normalizeMediaValue } from "./media/normalize.js";
|
|
@@ -182,6 +183,7 @@ import {
|
|
|
182
183
|
type Storage,
|
|
183
184
|
} from "./index.js";
|
|
184
185
|
import { getDb } from "./loader.js";
|
|
186
|
+
import { isRecord } from "./plugin-utils.js";
|
|
185
187
|
import { CronExecutor, type InvokeCronHookFn } from "./plugins/cron.js";
|
|
186
188
|
import { definePlugin } from "./plugins/define-plugin.js";
|
|
187
189
|
import { DEV_CONSOLE_EMAIL_PLUGIN_ID, devConsoleEmailDeliver } from "./plugins/email-console.js";
|
|
@@ -193,9 +195,15 @@ import {
|
|
|
193
195
|
} from "./plugins/hooks.js";
|
|
194
196
|
import { normalizeManifestRoute } from "./plugins/manifest-schema.js";
|
|
195
197
|
import { extractRequestMeta, sanitizeHeadersForSandbox } from "./plugins/request-meta.js";
|
|
196
|
-
import {
|
|
198
|
+
import {
|
|
199
|
+
buildRouteMeta,
|
|
200
|
+
parseRouteInput,
|
|
201
|
+
PluginRouteRegistry,
|
|
202
|
+
type RouteMeta,
|
|
203
|
+
} from "./plugins/routes.js";
|
|
197
204
|
import type { CronScheduler } from "./plugins/scheduler/types.js";
|
|
198
205
|
import { PluginStateRepository } from "./plugins/state.js";
|
|
206
|
+
import { syncDeclaredStorageIndexes } from "./plugins/storage-indexes.js";
|
|
199
207
|
import { normalizeRegistryConfig } from "./registry/config.js";
|
|
200
208
|
import { requestCached } from "./request-cache.js";
|
|
201
209
|
import { getRequestContext } from "./request-context.js";
|
|
@@ -225,6 +233,9 @@ const FIELD_TYPE_TO_KIND: Record<FieldType, string> = {
|
|
|
225
233
|
repeater: "repeater",
|
|
226
234
|
};
|
|
227
235
|
|
|
236
|
+
const DRAFT_ONLY_UPDATE_KEYS = new Set(["data", "slug", "locale", "skipRevision"]);
|
|
237
|
+
const MAX_DRAFT_STAGE_ATTEMPTS = 32;
|
|
238
|
+
|
|
228
239
|
/**
|
|
229
240
|
* Sandboxed plugin entry from virtual module
|
|
230
241
|
*/
|
|
@@ -241,6 +252,10 @@ export interface SandboxedPluginEntry {
|
|
|
241
252
|
storage: PluginStorageConfig;
|
|
242
253
|
/** Serialized MCP declarations emitted at plugin build time. */
|
|
243
254
|
mcp?: PluginMcpManifestConfig;
|
|
255
|
+
/** Route declarations (name + public/permission/cacheControl), used for route auth decisions */
|
|
256
|
+
routes?: PluginManifest["routes"];
|
|
257
|
+
/** Hook declarations this plugin implements */
|
|
258
|
+
hooks?: PluginManifest["hooks"];
|
|
244
259
|
/** Admin pages */
|
|
245
260
|
adminPages?: Array<{ path: string; label?: string; icon?: string }>;
|
|
246
261
|
/** Dashboard widgets */
|
|
@@ -492,6 +507,7 @@ const marketplaceManifestCache = new Map<
|
|
|
492
507
|
settingsSchema?: Record<string, SettingField>;
|
|
493
508
|
};
|
|
494
509
|
mcp?: PluginMcpManifestConfig;
|
|
510
|
+
storage?: PluginManifest["storage"];
|
|
495
511
|
}
|
|
496
512
|
>();
|
|
497
513
|
/** Route metadata for sandboxed plugins: pluginId -> routeName -> RouteMeta */
|
|
@@ -553,6 +569,8 @@ export class EmDashRuntime {
|
|
|
553
569
|
/** All plugins eligible for the hook pipeline (includes built-in plugins).
|
|
554
570
|
* Stored so we can rebuild the pipeline when plugins are enabled/disabled. */
|
|
555
571
|
private allPipelinePlugins: ResolvedPlugin[];
|
|
572
|
+
/** Guards the once-per-process plugin storage-index sync. */
|
|
573
|
+
private storageIndexesSynced = false;
|
|
556
574
|
/** Factory options for the hook pipeline context factory */
|
|
557
575
|
private pipelineFactoryOptions: {
|
|
558
576
|
db: Kysely<Database>;
|
|
@@ -683,12 +701,36 @@ export class EmDashRuntime {
|
|
|
683
701
|
console.error("[cleanup] System cleanup failed:", error);
|
|
684
702
|
}
|
|
685
703
|
|
|
704
|
+
try {
|
|
705
|
+
await this.syncPluginStorageIndexesOnce();
|
|
706
|
+
} catch (error) {
|
|
707
|
+
console.error("[plugins] Storage index sync failed:", error);
|
|
708
|
+
}
|
|
709
|
+
|
|
686
710
|
// Never throws; no-op unless scheduled backups are enabled and due.
|
|
687
711
|
await maybeRunScheduledBackup(this.db, this.storage ?? undefined);
|
|
688
712
|
|
|
689
713
|
return { published };
|
|
690
714
|
}
|
|
691
715
|
|
|
716
|
+
/**
|
|
717
|
+
* Materialize plugin-declared storage indexes, once per process.
|
|
718
|
+
*
|
|
719
|
+
* Called from the scheduler path, not from request handlers — configured
|
|
720
|
+
* plugins have no install handler, so the tick is their only sync moment.
|
|
721
|
+
*/
|
|
722
|
+
async syncPluginStorageIndexesOnce(): Promise<void> {
|
|
723
|
+
if (this.storageIndexesSynced) return;
|
|
724
|
+
this.storageIndexesSynced = true;
|
|
725
|
+
// Sandboxed marketplace/registry plugins never join allPipelinePlugins;
|
|
726
|
+
// their manifests are cached at bundle load. Without them, plugins
|
|
727
|
+
// installed before this feature shipped would never get their indexes.
|
|
728
|
+
await syncDeclaredStorageIndexes(this.db, [
|
|
729
|
+
...this.allPipelinePlugins,
|
|
730
|
+
...marketplaceManifestCache.values(),
|
|
731
|
+
]);
|
|
732
|
+
}
|
|
733
|
+
|
|
692
734
|
/**
|
|
693
735
|
* Stop the cron scheduler gracefully.
|
|
694
736
|
* Call during worker shutdown or hot-reload.
|
|
@@ -896,6 +938,7 @@ export class EmDashRuntime {
|
|
|
896
938
|
version: bundle.manifest.version,
|
|
897
939
|
admin: bundle.manifest.admin,
|
|
898
940
|
mcp: bundle.manifest.mcp,
|
|
941
|
+
storage: bundle.manifest.storage,
|
|
899
942
|
});
|
|
900
943
|
|
|
901
944
|
// Cache route metadata from manifest for auth decisions
|
|
@@ -1011,6 +1054,7 @@ export class EmDashRuntime {
|
|
|
1011
1054
|
version: bundle.manifest.version,
|
|
1012
1055
|
admin: bundle.manifest.admin,
|
|
1013
1056
|
mcp: bundle.manifest.mcp,
|
|
1057
|
+
storage: bundle.manifest.storage,
|
|
1014
1058
|
});
|
|
1015
1059
|
if (bundle.manifest.routes.length > 0) {
|
|
1016
1060
|
const routeMetaMap = new Map<string, RouteMeta>();
|
|
@@ -1612,6 +1656,11 @@ export class EmDashRuntime {
|
|
|
1612
1656
|
// by runSystemCleanup. This catches unexpected errors.
|
|
1613
1657
|
console.error("[cleanup] System cleanup failed:", error);
|
|
1614
1658
|
}
|
|
1659
|
+
try {
|
|
1660
|
+
await runtimeRef.current?.syncPluginStorageIndexesOnce();
|
|
1661
|
+
} catch (error) {
|
|
1662
|
+
console.error("[plugins] Storage index sync failed:", error);
|
|
1663
|
+
}
|
|
1615
1664
|
// Never throws; no-op unless scheduled backups are enabled and due.
|
|
1616
1665
|
await maybeRunScheduledBackup(db, storage ?? undefined);
|
|
1617
1666
|
});
|
|
@@ -1977,8 +2026,8 @@ export class EmDashRuntime {
|
|
|
1977
2026
|
capabilities: entry.capabilities ?? [],
|
|
1978
2027
|
allowedHosts: entry.allowedHosts ?? [],
|
|
1979
2028
|
storage: entry.storage ?? {},
|
|
1980
|
-
hooks: [],
|
|
1981
|
-
routes: [],
|
|
2029
|
+
hooks: entry.hooks ?? [],
|
|
2030
|
+
routes: entry.routes ?? [],
|
|
1982
2031
|
admin: {},
|
|
1983
2032
|
mcp: entry.mcp,
|
|
1984
2033
|
};
|
|
@@ -1988,6 +2037,17 @@ export class EmDashRuntime {
|
|
|
1988
2037
|
console.log(
|
|
1989
2038
|
`EmDash: Loaded sandboxed plugin ${pluginKey} with capabilities: [${manifest.capabilities.join(", ")}]`,
|
|
1990
2039
|
);
|
|
2040
|
+
|
|
2041
|
+
if (manifest.routes.length > 0) {
|
|
2042
|
+
const routeMetaMap = new Map<string, RouteMeta>();
|
|
2043
|
+
for (const routeEntry of manifest.routes) {
|
|
2044
|
+
const normalized = normalizeManifestRoute(routeEntry);
|
|
2045
|
+
routeMetaMap.set(normalized.name, buildRouteMeta(normalized));
|
|
2046
|
+
}
|
|
2047
|
+
sandboxedRouteMetaCache.set(entry.id, routeMetaMap);
|
|
2048
|
+
} else {
|
|
2049
|
+
sandboxedRouteMetaCache.delete(entry.id);
|
|
2050
|
+
}
|
|
1991
2051
|
} catch (error) {
|
|
1992
2052
|
console.error(`EmDash: Failed to load sandboxed plugin ${entry.id}:`, error);
|
|
1993
2053
|
}
|
|
@@ -2090,6 +2150,7 @@ export class EmDashRuntime {
|
|
|
2090
2150
|
version: bundle.manifest.version,
|
|
2091
2151
|
admin: bundle.manifest.admin,
|
|
2092
2152
|
mcp: bundle.manifest.mcp,
|
|
2153
|
+
storage: bundle.manifest.storage,
|
|
2093
2154
|
});
|
|
2094
2155
|
|
|
2095
2156
|
// Cache route metadata from manifest for auth decisions
|
|
@@ -2162,6 +2223,7 @@ export class EmDashRuntime {
|
|
|
2162
2223
|
version: bundle.manifest.version,
|
|
2163
2224
|
admin: bundle.manifest.admin,
|
|
2164
2225
|
mcp: bundle.manifest.mcp,
|
|
2226
|
+
storage: bundle.manifest.storage,
|
|
2165
2227
|
});
|
|
2166
2228
|
if (bundle.manifest.routes.length > 0) {
|
|
2167
2229
|
const routeMeta = new Map<string, RouteMeta>();
|
|
@@ -2362,6 +2424,7 @@ export class EmDashRuntime {
|
|
|
2362
2424
|
supports: collection.supports || [],
|
|
2363
2425
|
hasSeo: collection.hasSeo,
|
|
2364
2426
|
urlPattern: collection.urlPattern,
|
|
2427
|
+
...(collection.hidden ? { hidden: true } : {}),
|
|
2365
2428
|
fields,
|
|
2366
2429
|
};
|
|
2367
2430
|
}
|
|
@@ -2769,13 +2832,12 @@ export class EmDashRuntime {
|
|
|
2769
2832
|
taxonomies?: Record<string, string[]>;
|
|
2770
2833
|
publishedAt?: string | null;
|
|
2771
2834
|
locale?: string;
|
|
2772
|
-
/**
|
|
2835
|
+
/** Replace the previous autosave revision after staging this save. */
|
|
2773
2836
|
skipRevision?: boolean;
|
|
2774
2837
|
_rev?: string;
|
|
2775
2838
|
},
|
|
2776
2839
|
) {
|
|
2777
2840
|
// Resolve slug → ID if needed (before any lookups)
|
|
2778
|
-
const { ContentRepository } = await import("./database/repositories/content.js");
|
|
2779
2841
|
const repo = new ContentRepository(this.db);
|
|
2780
2842
|
const resolvedItem = await repo.findByIdOrSlug(collection, id, body.locale);
|
|
2781
2843
|
const resolvedId = resolvedItem?.id ?? id;
|
|
@@ -2838,76 +2900,122 @@ export class EmDashRuntime {
|
|
|
2838
2900
|
let usesDraftRevisions = false;
|
|
2839
2901
|
let draftStorageChanged = false;
|
|
2840
2902
|
if (processedData) {
|
|
2841
|
-
|
|
2842
|
-
|
|
2843
|
-
|
|
2844
|
-
|
|
2845
|
-
|
|
2846
|
-
|
|
2847
|
-
|
|
2848
|
-
|
|
2849
|
-
if (existing) {
|
|
2850
|
-
|
|
2851
|
-
|
|
2852
|
-
|
|
2853
|
-
|
|
2854
|
-
|
|
2855
|
-
|
|
2856
|
-
|
|
2857
|
-
|
|
2903
|
+
const collectionInfo = await this.schemaRegistry.getCollectionWithFields(collection);
|
|
2904
|
+
if (collectionInfo?.supports?.includes("revisions")) {
|
|
2905
|
+
usesDraftRevisions = true;
|
|
2906
|
+
const revisionRepo = new RevisionRepository(this.db);
|
|
2907
|
+
let existing = await repo.findById(collection, resolvedId);
|
|
2908
|
+
|
|
2909
|
+
for (let attempt = 0; existing && attempt < MAX_DRAFT_STAGE_ATTEMPTS; attempt++) {
|
|
2910
|
+
let baseData: Record<string, unknown>;
|
|
2911
|
+
if (existing.draftRevisionId) {
|
|
2912
|
+
const draftRevision = await revisionRepo.findById(existing.draftRevisionId);
|
|
2913
|
+
baseData = draftRevision?.data ?? existing.data;
|
|
2914
|
+
} else {
|
|
2915
|
+
baseData = existing.data;
|
|
2916
|
+
}
|
|
2917
|
+
|
|
2918
|
+
const mergedData = { ...baseData, ...processedData };
|
|
2919
|
+
if (bodyWithoutRev.slug !== undefined) {
|
|
2920
|
+
mergedData._slug = bodyWithoutRev.slug;
|
|
2921
|
+
}
|
|
2922
|
+
|
|
2923
|
+
const revision = await revisionRepo.create({
|
|
2924
|
+
collection,
|
|
2925
|
+
entryId: resolvedId,
|
|
2926
|
+
data: mergedData,
|
|
2927
|
+
authorId: bodyWithoutRev.authorId ?? undefined,
|
|
2928
|
+
});
|
|
2929
|
+
|
|
2930
|
+
let staged: boolean;
|
|
2931
|
+
try {
|
|
2932
|
+
staged = await repo.replaceDraftRevision(collection, resolvedId, revision.id, existing);
|
|
2933
|
+
} catch (error) {
|
|
2934
|
+
try {
|
|
2935
|
+
await revisionRepo.deleteIfUnreferenced(collection, resolvedId, revision.id);
|
|
2936
|
+
} catch (cleanupError) {
|
|
2937
|
+
console.error(
|
|
2938
|
+
`[emdash] Failed to clean up unstaged revision ${revision.id}:`,
|
|
2939
|
+
cleanupError,
|
|
2940
|
+
);
|
|
2858
2941
|
}
|
|
2942
|
+
throw error;
|
|
2943
|
+
}
|
|
2859
2944
|
|
|
2860
|
-
|
|
2861
|
-
|
|
2862
|
-
|
|
2863
|
-
|
|
2945
|
+
if (!staged) {
|
|
2946
|
+
try {
|
|
2947
|
+
await revisionRepo.deleteIfUnreferenced(collection, resolvedId, revision.id);
|
|
2948
|
+
} catch (cleanupError) {
|
|
2949
|
+
console.error(
|
|
2950
|
+
`[emdash] Failed to clean up unstaged revision ${revision.id}:`,
|
|
2951
|
+
cleanupError,
|
|
2952
|
+
);
|
|
2953
|
+
}
|
|
2954
|
+
if (body._rev || attempt === MAX_DRAFT_STAGE_ATTEMPTS - 1) {
|
|
2955
|
+
const error = new ContentMutationConflictError();
|
|
2956
|
+
return {
|
|
2957
|
+
success: false as const,
|
|
2958
|
+
error: { code: "CONFLICT", message: error.message },
|
|
2959
|
+
};
|
|
2864
2960
|
}
|
|
2961
|
+
existing = await repo.findById(collection, resolvedId);
|
|
2962
|
+
continue;
|
|
2963
|
+
}
|
|
2865
2964
|
|
|
2866
|
-
|
|
2867
|
-
// Autosave: update existing draft revision in place
|
|
2868
|
-
await revisionRepo.updateData(existing.draftRevisionId, mergedData);
|
|
2869
|
-
draftStorageChanged = true;
|
|
2870
|
-
} else {
|
|
2871
|
-
// Create new draft revision
|
|
2872
|
-
const revision = await revisionRepo.create({
|
|
2873
|
-
collection,
|
|
2874
|
-
entryId: resolvedId,
|
|
2875
|
-
data: mergedData,
|
|
2876
|
-
authorId: bodyWithoutRev.authorId ?? undefined,
|
|
2877
|
-
});
|
|
2965
|
+
draftStorageChanged = true;
|
|
2878
2966
|
|
|
2879
|
-
|
|
2880
|
-
|
|
2881
|
-
|
|
2882
|
-
|
|
2883
|
-
|
|
2884
|
-
|
|
2885
|
-
|
|
2886
|
-
|
|
2887
|
-
|
|
2888
|
-
|
|
2889
|
-
|
|
2890
|
-
|
|
2891
|
-
// Fire-and-forget: prune old revisions to prevent unbounded growth
|
|
2892
|
-
void revisionRepo.pruneOldRevisions(collection, resolvedId, 50).catch(() => {});
|
|
2967
|
+
if (bodyWithoutRev.skipRevision && existing.draftRevisionId) {
|
|
2968
|
+
try {
|
|
2969
|
+
await revisionRepo.deleteIfUnreferenced(
|
|
2970
|
+
collection,
|
|
2971
|
+
resolvedId,
|
|
2972
|
+
existing.draftRevisionId,
|
|
2973
|
+
);
|
|
2974
|
+
} catch (error) {
|
|
2975
|
+
console.error(
|
|
2976
|
+
`[emdash] Failed to clean up superseded revision ${existing.draftRevisionId}:`,
|
|
2977
|
+
error,
|
|
2978
|
+
);
|
|
2893
2979
|
}
|
|
2980
|
+
} else {
|
|
2981
|
+
after(async () => {
|
|
2982
|
+
try {
|
|
2983
|
+
await revisionRepo.pruneQueuedEntry(collection, resolvedId, revision.id, 50);
|
|
2984
|
+
} catch (error) {
|
|
2985
|
+
console.error(
|
|
2986
|
+
`[revisions] Failed to prune revisions for ${collection}/${resolvedId}:`,
|
|
2987
|
+
error,
|
|
2988
|
+
);
|
|
2989
|
+
}
|
|
2990
|
+
});
|
|
2894
2991
|
}
|
|
2992
|
+
break;
|
|
2895
2993
|
}
|
|
2896
|
-
} catch {
|
|
2897
|
-
// Don't fail the update if revision creation fails
|
|
2898
2994
|
}
|
|
2899
2995
|
}
|
|
2900
2996
|
|
|
2997
|
+
// Public HTML comes from live columns / SEO / taxonomies, not draft revisions.
|
|
2998
|
+
const liveMetaTouched = Object.entries(bodyWithoutRev).some(
|
|
2999
|
+
([key, value]) => value !== undefined && !DRAFT_ONLY_UPDATE_KEYS.has(key),
|
|
3000
|
+
);
|
|
3001
|
+
|
|
2901
3002
|
// Update the content table:
|
|
2902
3003
|
// - If collection uses draft revisions: only update metadata (no data fields, no slug)
|
|
2903
3004
|
// - Otherwise: update everything as before
|
|
2904
|
-
const result =
|
|
2905
|
-
|
|
2906
|
-
|
|
2907
|
-
|
|
2908
|
-
|
|
2909
|
-
|
|
2910
|
-
|
|
3005
|
+
const result =
|
|
3006
|
+
usesDraftRevisions && !liveMetaTouched
|
|
3007
|
+
? await handleContentGet(this.db, collection, resolvedId)
|
|
3008
|
+
: await handleContentUpdate(this.db, collection, resolvedId, {
|
|
3009
|
+
...bodyWithoutRev,
|
|
3010
|
+
data: usesDraftRevisions ? undefined : processedData,
|
|
3011
|
+
slug: usesDraftRevisions ? undefined : bodyWithoutRev.slug,
|
|
3012
|
+
authorId: bodyWithoutRev.authorId,
|
|
3013
|
+
bylines: bodyWithoutRev.bylines,
|
|
3014
|
+
});
|
|
3015
|
+
|
|
3016
|
+
const liveContentChanged = usesDraftRevisions
|
|
3017
|
+
? liveMetaTouched
|
|
3018
|
+
: Boolean(processedData || bodyWithoutRev.slug !== undefined || liveMetaTouched);
|
|
2911
3019
|
|
|
2912
3020
|
// Hydrate draft data BEFORE firing afterSave hooks so the hook sees
|
|
2913
3021
|
// the same effective data the response surfaces — for revision-
|
|
@@ -2957,6 +3065,9 @@ export class EmDashRuntime {
|
|
|
2957
3065
|
this.runAfterSaveHooks(contentItemToRecord(hydrated.data.item), collection, false);
|
|
2958
3066
|
}
|
|
2959
3067
|
|
|
3068
|
+
if (hydrated.success) {
|
|
3069
|
+
return { ...hydrated, liveContentChanged };
|
|
3070
|
+
}
|
|
2960
3071
|
return hydrated;
|
|
2961
3072
|
}
|
|
2962
3073
|
|
|
@@ -3059,7 +3170,11 @@ export class EmDashRuntime {
|
|
|
3059
3170
|
async handleContentPublish(
|
|
3060
3171
|
collection: string,
|
|
3061
3172
|
id: string,
|
|
3062
|
-
options: {
|
|
3173
|
+
options: {
|
|
3174
|
+
publishedAt?: string;
|
|
3175
|
+
requireScheduledDue?: boolean;
|
|
3176
|
+
expectedScheduledAt?: string;
|
|
3177
|
+
} = {},
|
|
3063
3178
|
) {
|
|
3064
3179
|
const result = await handleContentPublish(this.db, collection, id, options);
|
|
3065
3180
|
if (result.success && result.data) {
|
|
@@ -3282,6 +3397,18 @@ export class EmDashRuntime {
|
|
|
3282
3397
|
// must then `content_publish` to promote the restored draft to
|
|
3283
3398
|
// live, matching the documented tool contract.
|
|
3284
3399
|
try {
|
|
3400
|
+
const contentRepo = new ContentRepository(this.db);
|
|
3401
|
+
const existing = await contentRepo.findById(revision.collection, revision.entryId);
|
|
3402
|
+
if (!existing) {
|
|
3403
|
+
return {
|
|
3404
|
+
success: false as const,
|
|
3405
|
+
error: {
|
|
3406
|
+
code: "NOT_FOUND",
|
|
3407
|
+
message: `Content item not found: ${revision.entryId}`,
|
|
3408
|
+
},
|
|
3409
|
+
};
|
|
3410
|
+
}
|
|
3411
|
+
|
|
3285
3412
|
const newDraft = await revisionRepo.create({
|
|
3286
3413
|
collection: revision.collection,
|
|
3287
3414
|
entryId: revision.entryId,
|
|
@@ -3289,18 +3416,45 @@ export class EmDashRuntime {
|
|
|
3289
3416
|
authorId: callerUserId,
|
|
3290
3417
|
});
|
|
3291
3418
|
|
|
3292
|
-
|
|
3293
|
-
|
|
3294
|
-
|
|
3295
|
-
|
|
3296
|
-
|
|
3297
|
-
|
|
3298
|
-
|
|
3419
|
+
try {
|
|
3420
|
+
const staged = await contentRepo.replaceDraftRevision(
|
|
3421
|
+
revision.collection,
|
|
3422
|
+
revision.entryId,
|
|
3423
|
+
newDraft.id,
|
|
3424
|
+
existing,
|
|
3425
|
+
);
|
|
3426
|
+
if (!staged) throw new ContentMutationConflictError();
|
|
3427
|
+
} catch (error) {
|
|
3428
|
+
try {
|
|
3429
|
+
await revisionRepo.deleteIfUnreferenced(
|
|
3430
|
+
revision.collection,
|
|
3431
|
+
revision.entryId,
|
|
3432
|
+
newDraft.id,
|
|
3433
|
+
);
|
|
3434
|
+
} catch (cleanupError) {
|
|
3435
|
+
console.error(
|
|
3436
|
+
`[emdash] Failed to clean up unrestored revision ${newDraft.id}:`,
|
|
3437
|
+
cleanupError,
|
|
3438
|
+
);
|
|
3439
|
+
}
|
|
3440
|
+
throw error;
|
|
3441
|
+
}
|
|
3299
3442
|
|
|
3300
|
-
|
|
3301
|
-
|
|
3302
|
-
|
|
3303
|
-
|
|
3443
|
+
after(async () => {
|
|
3444
|
+
try {
|
|
3445
|
+
await revisionRepo.pruneQueuedEntry(
|
|
3446
|
+
revision.collection,
|
|
3447
|
+
revision.entryId,
|
|
3448
|
+
newDraft.id,
|
|
3449
|
+
50,
|
|
3450
|
+
);
|
|
3451
|
+
} catch (error) {
|
|
3452
|
+
console.error(
|
|
3453
|
+
`[revisions] Failed to prune revisions for ${revision.collection}/${revision.entryId}:`,
|
|
3454
|
+
error,
|
|
3455
|
+
);
|
|
3456
|
+
}
|
|
3457
|
+
});
|
|
3304
3458
|
|
|
3305
3459
|
// Return the freshly-fetched item with the new draft hydrated
|
|
3306
3460
|
// onto `data`. Without this the response would echo the live
|
|
@@ -3313,6 +3467,12 @@ export class EmDashRuntime {
|
|
|
3313
3467
|
}
|
|
3314
3468
|
return hydrated;
|
|
3315
3469
|
} catch (error) {
|
|
3470
|
+
if (error instanceof ContentMutationConflictError) {
|
|
3471
|
+
return {
|
|
3472
|
+
success: false as const,
|
|
3473
|
+
error: { code: "CONFLICT", message: error.message },
|
|
3474
|
+
};
|
|
3475
|
+
}
|
|
3316
3476
|
console.error("[emdash] revision restore failed:", error);
|
|
3317
3477
|
return {
|
|
3318
3478
|
success: false as const,
|
|
@@ -3446,12 +3606,8 @@ export class EmDashRuntime {
|
|
|
3446
3606
|
|
|
3447
3607
|
const routeKey = path.replace(LEADING_SLASH_PATTERN, "");
|
|
3448
3608
|
|
|
3449
|
-
|
|
3450
|
-
|
|
3451
|
-
body = await request.json();
|
|
3452
|
-
} catch {
|
|
3453
|
-
// No body or not JSON
|
|
3454
|
-
}
|
|
3609
|
+
// Body methods parse JSON; GET/HEAD/DELETE parse the query string (#2146).
|
|
3610
|
+
const body = await parseRouteInput(request);
|
|
3455
3611
|
|
|
3456
3612
|
return routeRegistry.invoke(pluginId, routeKey, { request, body });
|
|
3457
3613
|
}
|
|
@@ -3662,7 +3818,13 @@ export class EmDashRuntime {
|
|
|
3662
3818
|
const imageFields = collectionInfo.fields.filter(
|
|
3663
3819
|
(f) => f.type === "image" || f.type === "file",
|
|
3664
3820
|
);
|
|
3665
|
-
|
|
3821
|
+
// Repeater fields can contain image sub-fields, whose values need the same normalization
|
|
3822
|
+
// (a bare media id posted inside a repeater item would otherwise be stored verbatim and
|
|
3823
|
+
// render as "Image not found" in the admin).
|
|
3824
|
+
const repeaterFields = collectionInfo.fields.filter(
|
|
3825
|
+
(f) => f.type === "repeater" && Array.isArray(f.validation?.subFields),
|
|
3826
|
+
);
|
|
3827
|
+
if (imageFields.length === 0 && repeaterFields.length === 0) return data;
|
|
3666
3828
|
|
|
3667
3829
|
const getProvider = (id: string) => this.getMediaProvider(id);
|
|
3668
3830
|
const result = { ...data };
|
|
@@ -3681,6 +3843,37 @@ export class EmDashRuntime {
|
|
|
3681
3843
|
}
|
|
3682
3844
|
}
|
|
3683
3845
|
|
|
3846
|
+
for (const field of repeaterFields) {
|
|
3847
|
+
const value = result[field.slug];
|
|
3848
|
+
if (!Array.isArray(value)) continue;
|
|
3849
|
+
|
|
3850
|
+
const mediaSubFieldSlugs = (field.validation?.subFields ?? [])
|
|
3851
|
+
.filter((sub) => sub.type === "image")
|
|
3852
|
+
.map((sub) => sub.slug);
|
|
3853
|
+
if (mediaSubFieldSlugs.length === 0) continue;
|
|
3854
|
+
|
|
3855
|
+
const items: unknown[] = value;
|
|
3856
|
+
result[field.slug] = await Promise.all(
|
|
3857
|
+
items.map(async (item) => {
|
|
3858
|
+
if (!isRecord(item)) return item;
|
|
3859
|
+
const normalizedItem: Record<string, unknown> = { ...item };
|
|
3860
|
+
for (const slug of mediaSubFieldSlugs) {
|
|
3861
|
+
const subValue = normalizedItem[slug];
|
|
3862
|
+
if (subValue == null) continue;
|
|
3863
|
+
try {
|
|
3864
|
+
const normalized = await normalizeMediaValue(subValue, getProvider);
|
|
3865
|
+
if (normalized) {
|
|
3866
|
+
normalizedItem[slug] = normalized;
|
|
3867
|
+
}
|
|
3868
|
+
} catch {
|
|
3869
|
+
// Don't fail the save if normalization fails for a single sub-field
|
|
3870
|
+
}
|
|
3871
|
+
}
|
|
3872
|
+
return normalizedItem;
|
|
3873
|
+
}),
|
|
3874
|
+
);
|
|
3875
|
+
}
|
|
3876
|
+
|
|
3684
3877
|
return result;
|
|
3685
3878
|
}
|
|
3686
3879
|
|
|
@@ -3893,12 +4086,8 @@ export class EmDashRuntime {
|
|
|
3893
4086
|
}> {
|
|
3894
4087
|
const routeName = path.replace(LEADING_SLASH_PATTERN, "");
|
|
3895
4088
|
|
|
3896
|
-
|
|
3897
|
-
|
|
3898
|
-
body = await request.json();
|
|
3899
|
-
} catch {
|
|
3900
|
-
// No body or not JSON
|
|
3901
|
-
}
|
|
4089
|
+
// Body methods parse JSON; GET/HEAD/DELETE parse the query string (#2146).
|
|
4090
|
+
const body = await parseRouteInput(request);
|
|
3902
4091
|
|
|
3903
4092
|
try {
|
|
3904
4093
|
const headers = sanitizeHeadersForSandbox(request.headers);
|
package/src/i18n/config.ts
CHANGED
|
@@ -12,14 +12,18 @@ export interface I18nConfig {
|
|
|
12
12
|
prefixDefaultLocale?: boolean;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
const I18N_CONFIG_KEY = Symbol.for("emdash:i18n-config");
|
|
16
|
+
|
|
17
|
+
function configStore(): Record<symbol, I18nConfig | null | undefined> {
|
|
18
|
+
return globalThis;
|
|
19
|
+
}
|
|
16
20
|
|
|
17
21
|
/**
|
|
18
22
|
* Initialize i18n config from virtual module data.
|
|
19
23
|
* Called during runtime initialization.
|
|
20
24
|
*/
|
|
21
25
|
export function setI18nConfig(config: I18nConfig | null): void {
|
|
22
|
-
|
|
26
|
+
configStore()[I18N_CONFIG_KEY] = config;
|
|
23
27
|
}
|
|
24
28
|
|
|
25
29
|
/**
|
|
@@ -27,13 +31,14 @@ export function setI18nConfig(config: I18nConfig | null): void {
|
|
|
27
31
|
* Returns null if i18n is not configured.
|
|
28
32
|
*/
|
|
29
33
|
export function getI18nConfig(): I18nConfig | null {
|
|
30
|
-
return
|
|
34
|
+
return configStore()[I18N_CONFIG_KEY] ?? null;
|
|
31
35
|
}
|
|
32
36
|
|
|
33
37
|
/** Match a locale to the exact casing used by the site configuration. */
|
|
34
38
|
export function resolveConfiguredLocale(locale: string): string {
|
|
39
|
+
const config = getI18nConfig();
|
|
35
40
|
return (
|
|
36
|
-
|
|
41
|
+
config?.locales.find((configured) => configured.toLowerCase() === locale.toLowerCase()) ??
|
|
37
42
|
locale
|
|
38
43
|
);
|
|
39
44
|
}
|
|
@@ -43,7 +48,8 @@ export function resolveConfiguredLocale(locale: string): string {
|
|
|
43
48
|
* Returns true when multiple locales are configured.
|
|
44
49
|
*/
|
|
45
50
|
export function isI18nEnabled(): boolean {
|
|
46
|
-
|
|
51
|
+
const config = getI18nConfig();
|
|
52
|
+
return config != null && config.locales.length > 1;
|
|
47
53
|
}
|
|
48
54
|
|
|
49
55
|
/**
|
|
@@ -52,15 +58,16 @@ export function isI18nEnabled(): boolean {
|
|
|
52
58
|
* Always ends with defaultLocale.
|
|
53
59
|
*/
|
|
54
60
|
export function getFallbackChain(locale: string): string[] {
|
|
55
|
-
|
|
61
|
+
const config = getI18nConfig();
|
|
62
|
+
if (!config) return [locale];
|
|
56
63
|
|
|
57
64
|
const chain: string[] = [locale];
|
|
58
65
|
let current = locale;
|
|
59
66
|
const visited = new Set<string>([locale]);
|
|
60
67
|
|
|
61
|
-
while (
|
|
68
|
+
while (config.fallback?.[current]) {
|
|
62
69
|
// eslint-disable-next-line typescript/no-unnecessary-type-assertion -- noUncheckedIndexedAccess
|
|
63
|
-
const next =
|
|
70
|
+
const next = config.fallback[current]!;
|
|
64
71
|
if (visited.has(next)) break; // prevent cycles
|
|
65
72
|
chain.push(next);
|
|
66
73
|
visited.add(next);
|
|
@@ -68,8 +75,8 @@ export function getFallbackChain(locale: string): string[] {
|
|
|
68
75
|
}
|
|
69
76
|
|
|
70
77
|
// Always end with defaultLocale if not already in chain
|
|
71
|
-
if (!visited.has(
|
|
72
|
-
chain.push(
|
|
78
|
+
if (!visited.has(config.defaultLocale)) {
|
|
79
|
+
chain.push(config.defaultLocale);
|
|
73
80
|
}
|
|
74
81
|
|
|
75
82
|
return chain;
|
package/src/index.ts
CHANGED
|
@@ -28,6 +28,7 @@ export type {
|
|
|
28
28
|
FindManyResult,
|
|
29
29
|
} from "./database/repositories/index.js";
|
|
30
30
|
export type { MediaItem, CreateMediaInput } from "./database/repositories/media.js";
|
|
31
|
+
export type { CompoundSelectLimitedAdapter } from "./database/dialect-helpers.js";
|
|
31
32
|
|
|
32
33
|
// Fields
|
|
33
34
|
export { portableText, image, file, reference } from "./fields/index.js";
|
|
@@ -509,6 +510,7 @@ export type {
|
|
|
509
510
|
|
|
510
511
|
// Search
|
|
511
512
|
export {
|
|
513
|
+
SEARCH_TOKENIZERS,
|
|
512
514
|
FTSManager,
|
|
513
515
|
search,
|
|
514
516
|
searchWithDb,
|
|
@@ -520,6 +522,7 @@ export {
|
|
|
520
522
|
} from "./search/index.js";
|
|
521
523
|
export type {
|
|
522
524
|
SearchConfig,
|
|
525
|
+
SearchTokenizer,
|
|
523
526
|
SearchOptions,
|
|
524
527
|
CollectionSearchOptions,
|
|
525
528
|
SearchResult,
|