emdash 0.21.0 → 0.23.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-BxSmgtbF.d.mts → adapters-DAAjOID4.d.mts} +1 -1
- package/dist/{adapters-BxSmgtbF.d.mts.map → adapters-DAAjOID4.d.mts.map} +1 -1
- package/dist/after-B1IIdH3Y.mjs +29 -0
- package/dist/after-B1IIdH3Y.mjs.map +1 -0
- package/dist/{allowed-origins-BqC8cul8.mjs → allowed-origins-D5FxMUo8.mjs} +2 -2
- package/dist/{allowed-origins-BqC8cul8.mjs.map → allowed-origins-D5FxMUo8.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -3
- package/dist/api/route-utils.mjs +20 -19
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +4 -4
- package/dist/{api-DxjIV2o8.mjs → api-BQ_yKRdG.mjs} +31 -25
- package/dist/api-BQ_yKRdG.mjs.map +1 -0
- package/dist/{api-tokens-BFFkB0jB.mjs → api-tokens-D6ppjIVi.mjs} +13 -3
- package/dist/api-tokens-D6ppjIVi.mjs.map +1 -0
- package/dist/{apply-CLjxheyb.mjs → apply-CWRyxIoO.mjs} +18 -18
- package/dist/{apply-CLjxheyb.mjs.map → apply-CWRyxIoO.mjs.map} +1 -1
- package/dist/astro/image-endpoint.d.mts +8 -0
- package/dist/astro/image-endpoint.d.mts.map +1 -0
- package/dist/astro/image-endpoint.mjs +55 -0
- package/dist/astro/image-endpoint.mjs.map +1 -0
- package/dist/astro/index.d.mts +36 -11
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +122 -26
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +9 -9
- package/dist/astro/middleware/auth.d.mts.map +1 -1
- package/dist/astro/middleware/auth.mjs +12 -10
- package/dist/astro/middleware/auth.mjs.map +1 -1
- package/dist/astro/middleware/redirect.mjs +6 -6
- package/dist/astro/middleware/request-context.d.mts.map +1 -1
- package/dist/astro/middleware/request-context.mjs +8 -6
- package/dist/astro/middleware/request-context.mjs.map +1 -1
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +1 -1
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +444 -149
- 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 +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 +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 +18 -16
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +18 -16
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/index.mjs +18 -16
- package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +15 -13
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_.mjs +8 -6
- package/dist/astro/routes/api/admin/comments/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/bulk.mjs +12 -10
- package/dist/astro/routes/api/admin/comments/bulk.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/counts.mjs +8 -6
- package/dist/astro/routes/api/admin/comments/counts.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/index.mjs +12 -10
- package/dist/astro/routes/api/admin/comments/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +6 -6
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +5 -5
- 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.mjs +41 -39
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +41 -39
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +40 -38
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +40 -38
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +40 -38
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +40 -38
- 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 +40 -38
- 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 +40 -38
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +40 -38
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +40 -38
- 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 +41 -39
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +40 -38
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +41 -39
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +40 -38
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +40 -38
- 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 +40 -38
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +4 -4
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +3 -3
- 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/index.mjs +7 -7
- package/dist/astro/routes/api/auth/dev-bypass.mjs +6 -6
- package/dist/astro/routes/api/auth/invite/accept.mjs +3 -3
- package/dist/astro/routes/api/auth/invite/complete.mjs +12 -12
- package/dist/astro/routes/api/auth/invite/index.mjs +9 -9
- package/dist/astro/routes/api/auth/invite/register-options.mjs +11 -11
- package/dist/astro/routes/api/auth/logout.mjs +4 -4
- package/dist/astro/routes/api/auth/magic-link/send.mjs +11 -11
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +4 -4
- package/dist/astro/routes/api/auth/me.mjs +8 -8
- package/dist/astro/routes/api/auth/mode.mjs +1 -1
- 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 +3 -3
- 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 +11 -11
- package/dist/astro/routes/api/auth/signup/verify.mjs +3 -3
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +16 -15
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs.map +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.d.mts +9 -0
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.d.mts.map +1 -0
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +179 -0
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs.map +1 -0
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +4 -4
- 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 +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 +8 -8
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +17 -15
- 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 +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/authors.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/index.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/trash.mjs +8 -8
- 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 +12 -12
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +5 -5
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +9 -9
- package/dist/astro/routes/api/import/wordpress/execute.mjs +17 -15
- package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
- 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.mjs +10 -10
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +12 -12
- package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +19 -17
- 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 +213 -46
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +8 -8
- package/dist/astro/routes/api/media/_id_.mjs +8 -8
- 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 +10 -10
- package/dist/astro/routes/api/media.mjs +13 -13
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +11 -9
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items.mjs +11 -9
- package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +11 -9
- package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/translations.mjs +11 -9
- package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_.mjs +11 -9
- package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/index.mjs +11 -9
- 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 +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 +5 -5
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +5 -5
- package/dist/astro/routes/api/redirects/404s/index.mjs +11 -11
- package/dist/astro/routes/api/redirects/404s/summary.mjs +11 -11
- package/dist/astro/routes/api/redirects/_id_.mjs +12 -12
- package/dist/astro/routes/api/redirects/index.mjs +12 -12
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +4 -4
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +4 -4
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +40 -38
- 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 +40 -38
- 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 +40 -38
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +40 -38
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +40 -38
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +9 -8
- package/dist/astro/routes/api/schema/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +40 -38
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +40 -38
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +11 -11
- package/dist/astro/routes/api/search/index.mjs +10 -10
- package/dist/astro/routes/api/search/rebuild.mjs +11 -11
- package/dist/astro/routes/api/search/stats.mjs +7 -7
- package/dist/astro/routes/api/search/suggest.mjs +10 -10
- package/dist/astro/routes/api/sections/_slug_.mjs +10 -10
- package/dist/astro/routes/api/sections/index.mjs +10 -10
- package/dist/astro/routes/api/settings/email.mjs +6 -6
- package/dist/astro/routes/api/settings.mjs +16 -15
- package/dist/astro/routes/api/settings.mjs.map +1 -1
- 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.d.mts.map +1 -1
- package/dist/astro/routes/api/setup/dev-bypass.mjs +30 -27
- package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-reset.mjs +4 -4
- package/dist/astro/routes/api/setup/index.mjs +30 -28
- 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.d.mts.map +1 -1
- package/dist/astro/routes/api/snapshot.mjs +10 -9
- package/dist/astro/routes/api/snapshot.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +16 -14
- 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 -14
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +16 -14
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +16 -14
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +8 -8
- package/dist/astro/routes/api/typegen.mjs +6 -6
- 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 +7 -7
- package/dist/astro/routes/api/widget-areas/index.mjs +11 -11
- package/dist/astro/routes/api/widget-components.mjs +4 -4
- package/dist/astro/routes/robots.txt.mjs +10 -9
- package/dist/astro/routes/robots.txt.mjs.map +1 -1
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +13 -12
- package/dist/astro/routes/sitemap-_collection_.xml.mjs.map +1 -1
- package/dist/astro/routes/sitemap.xml.mjs +11 -10
- package/dist/astro/routes/sitemap.xml.mjs.map +1 -1
- package/dist/astro/types.d.mts +16 -12
- 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-D5gfBVU5.mjs → authorize-Cse0k7B0.mjs} +2 -2
- package/dist/{authorize-D5gfBVU5.mjs.map → authorize-Cse0k7B0.mjs.map} +1 -1
- package/dist/{base64-CqR-7kqF.mjs → base64-CmWvODNW.mjs} +1 -1
- package/dist/{base64-CqR-7kqF.mjs.map → base64-CmWvODNW.mjs.map} +1 -1
- package/dist/{byline-V_Qp1Ziw.mjs → byline-DVo-liaP.mjs} +27 -76
- package/dist/byline-DVo-liaP.mjs.map +1 -0
- package/dist/{byline-fields-B0NO1yUB.mjs → byline-fields-B-KXkg5R.mjs} +3 -3
- package/dist/{byline-fields-B0NO1yUB.mjs.map → byline-fields-B-KXkg5R.mjs.map} +1 -1
- package/dist/{byline-fields-nBVqK_Ff.mjs → byline-fields-DaMKzkhO.mjs} +2 -2
- package/dist/{byline-fields-nBVqK_Ff.mjs.map → byline-fields-DaMKzkhO.mjs.map} +1 -1
- package/dist/{byline-fields-CQJRIQkn.d.mts → byline-fields-RFPkDLRw.d.mts} +56 -31
- package/dist/byline-fields-RFPkDLRw.d.mts.map +1 -0
- package/dist/{byline-registry-DedidtqC.mjs → byline-registry-BOjqDOim.mjs} +3 -3
- package/dist/{byline-registry-DedidtqC.mjs.map → byline-registry-BOjqDOim.mjs.map} +1 -1
- package/dist/{bylines-DfGDnred.mjs → bylines-f5ppBpD5.mjs} +8 -8
- package/dist/{bylines-DfGDnred.mjs.map → bylines-f5ppBpD5.mjs.map} +1 -1
- package/dist/{bylines-B2NWnIwS.mjs → bylines-pIKgc_TL.mjs} +10 -4
- package/dist/{bylines-B2NWnIwS.mjs.map → bylines-pIKgc_TL.mjs.map} +1 -1
- package/dist/{cache-DTTHWD8n.mjs → cache-Q6V4U-Xz.mjs} +3 -3
- package/dist/{cache-DTTHWD8n.mjs.map → cache-Q6V4U-Xz.mjs.map} +1 -1
- package/dist/{challenge-store-woE0bbCf.mjs → challenge-store-LhiqMccz.mjs} +1 -1
- package/dist/{challenge-store-woE0bbCf.mjs.map → challenge-store-LhiqMccz.mjs.map} +1 -1
- package/dist/{chunks-BerYVuve.mjs → chunks-SyjZaYwV.mjs} +2 -2
- package/dist/{chunks-BerYVuve.mjs.map → chunks-SyjZaYwV.mjs.map} +1 -1
- package/dist/cli/index.mjs +29 -27
- 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 -1
- package/dist/client/index.mjs.map +1 -1
- package/dist/{comment-sqQxNpN3.mjs → comment-80UyJJUR.mjs} +11 -3
- package/dist/comment-80UyJJUR.mjs.map +1 -0
- package/dist/comment-reaction-Dyb-AutY.mjs +85 -0
- package/dist/comment-reaction-Dyb-AutY.mjs.map +1 -0
- package/dist/{comments-D2hNuxNa.mjs → comments-Cczx7AvD.mjs} +3 -3
- package/dist/{comments-D2hNuxNa.mjs.map → comments-Cczx7AvD.mjs.map} +1 -1
- package/dist/{components-DYKp2gmo.mjs → components-CYt4uVK9.mjs} +1 -1
- package/dist/{components-DYKp2gmo.mjs.map → components-CYt4uVK9.mjs.map} +1 -1
- package/dist/{content-BIlVx-RX.mjs → content-2PTDNnoh.mjs} +22 -7
- package/dist/content-2PTDNnoh.mjs.map +1 -0
- package/dist/{context-Cm4pt1Ws.mjs → context-B1W8soLv.mjs} +64 -26
- package/dist/context-B1W8soLv.mjs.map +1 -0
- package/dist/{cron-DdEVrQ2Y.mjs → cron-C5LVoNmP.mjs} +14 -2
- package/dist/cron-C5LVoNmP.mjs.map +1 -0
- package/dist/{dashboard-C-UYpps0.mjs → dashboard-CYjpQZ6-.mjs} +4 -4
- package/dist/{dashboard-C-UYpps0.mjs.map → dashboard-CYjpQZ6-.mjs.map} +1 -1
- package/dist/database/instrumentation.d.mts +19 -0
- package/dist/database/instrumentation.d.mts.map +1 -1
- package/dist/database/instrumentation.mjs +8 -1
- package/dist/database/instrumentation.mjs.map +1 -1
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +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-BluWkwGI.mjs → db-errors-UXB1CK42.mjs} +1 -1
- package/dist/{db-errors-BluWkwGI.mjs.map → db-errors-UXB1CK42.mjs.map} +1 -1
- package/dist/{default-NHGuJzQ3.mjs → default-CeRG-Ot4.mjs} +1 -1
- package/dist/{default-NHGuJzQ3.mjs.map → default-CeRG-Ot4.mjs.map} +1 -1
- package/dist/{device-flow-BQApWgnW.mjs → device-flow-DENDCQ9F.mjs} +5 -5
- package/dist/{device-flow-BQApWgnW.mjs.map → device-flow-DENDCQ9F.mjs.map} +1 -1
- package/dist/{email-console-BbU3RbWv.mjs → email-console-DJP32ucW.mjs} +1 -1
- package/dist/{email-console-BbU3RbWv.mjs.map → email-console-DJP32ucW.mjs.map} +1 -1
- package/dist/{error-CNn_w7jf.mjs → error-Bl6kZgtt.mjs} +2 -2
- package/dist/{error-CNn_w7jf.mjs.map → error-Bl6kZgtt.mjs.map} +1 -1
- package/dist/{escape-DPgcxcpL.mjs → escape-Bjio4ZsM.mjs} +1 -1
- package/dist/{escape-DPgcxcpL.mjs.map → escape-Bjio4ZsM.mjs.map} +1 -1
- package/dist/field-defs-cache-ztrdzUGb.mjs +77 -0
- package/dist/field-defs-cache-ztrdzUGb.mjs.map +1 -0
- package/dist/{fts-manager-Cx5z8jdA.mjs → fts-manager-CQuHt-vS.mjs} +2 -2
- package/dist/{fts-manager-Cx5z8jdA.mjs.map → fts-manager-CQuHt-vS.mjs.map} +1 -1
- package/dist/{hash-DlvIFn0b.mjs → hash-DrvzIXcz.mjs} +1 -1
- package/dist/{hash-DlvIFn0b.mjs.map → hash-DrvzIXcz.mjs.map} +1 -1
- package/dist/{import-KyxT1Mbs.mjs → import-Bb1T9WJS.mjs} +4 -4
- package/dist/{import-KyxT1Mbs.mjs.map → import-Bb1T9WJS.mjs.map} +1 -1
- package/dist/{index-D2VAiumu.d.mts → index-BaIj5hIq.d.mts} +198 -21
- package/dist/index-BaIj5hIq.d.mts.map +1 -0
- package/dist/{index-uT2yR66F.d.mts → index-qbL02uhs.d.mts} +3 -3
- package/dist/{index-uT2yR66F.d.mts.map → index-qbL02uhs.d.mts.map} +1 -1
- package/dist/index.d.mts +18 -17
- package/dist/index.mjs +64 -61
- package/dist/{init-lock-DlBHjf9-.mjs → init-lock-6b309ZrF.mjs} +2 -29
- package/dist/init-lock-6b309ZrF.mjs.map +1 -0
- package/dist/{load-Dq91b_DK.mjs → load-BNo-ER8C.mjs} +2 -2
- package/dist/{load-Dq91b_DK.mjs.map → load-BNo-ER8C.mjs.map} +1 -1
- package/dist/{loader-BqWjcH3h.mjs → loader-Dn74CG1b.mjs} +70 -11
- package/dist/loader-Dn74CG1b.mjs.map +1 -0
- package/dist/{manifest-schema-DFPeqMAn.mjs → manifest-schema-BWKnQYQF.mjs} +1 -1
- package/dist/{manifest-schema-DFPeqMAn.mjs.map → manifest-schema-BWKnQYQF.mjs.map} +1 -1
- package/dist/media/image-endpoint.d.mts +74 -0
- package/dist/media/image-endpoint.d.mts.map +1 -0
- package/dist/media/image-endpoint.mjs +162 -0
- package/dist/media/image-endpoint.mjs.map +1 -0
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +2 -2
- package/dist/media/local-runtime.d.mts +19 -11
- package/dist/media/local-runtime.d.mts.map +1 -1
- package/dist/media/local-runtime.mjs +16 -13
- package/dist/media/local-runtime.mjs.map +1 -1
- package/dist/{media-JOf3pNkw.mjs → media-Bw0sA6rb.mjs} +2 -2
- package/dist/{media-JOf3pNkw.mjs.map → media-Bw0sA6rb.mjs.map} +1 -1
- package/dist/{media-allowlist-_A0SuDn4.mjs → media-allowlist-B77I5_bw.mjs} +2 -2
- package/dist/{media-allowlist-_A0SuDn4.mjs.map → media-allowlist-B77I5_bw.mjs.map} +1 -1
- package/dist/{media-url-CqLd69IO.mjs → media-url-O4rm9-SQ.mjs} +1 -1
- package/dist/{media-url-CqLd69IO.mjs.map → media-url-O4rm9-SQ.mjs.map} +1 -1
- package/dist/{menus-DX4_E01q.mjs → menus-CYs0WZoL.mjs} +20 -6
- package/dist/menus-CYs0WZoL.mjs.map +1 -0
- package/dist/{menus-Ryk9L7fT.mjs → menus-DS8VTZgo.mjs} +167 -24
- package/dist/menus-DS8VTZgo.mjs.map +1 -0
- package/dist/{mime-YbtlEtvS.mjs → mime-BTzvzJ8M.mjs} +1 -1
- package/dist/{mime-YbtlEtvS.mjs.map → mime-BTzvzJ8M.mjs.map} +1 -1
- package/dist/{mode-CGXzIbD8.mjs → mode-BB0F8xTC.mjs} +1 -1
- package/dist/{mode-CGXzIbD8.mjs.map → mode-BB0F8xTC.mjs.map} +1 -1
- package/dist/{normalize-DKsg36ty.mjs → normalize-ClbNIenm.mjs} +1 -1
- package/dist/{normalize-DKsg36ty.mjs.map → normalize-ClbNIenm.mjs.map} +1 -1
- package/dist/{oauth-authorization-C2kVyjXI.mjs → oauth-authorization-CsvzIp_F.mjs} +5 -5
- package/dist/{oauth-authorization-C2kVyjXI.mjs.map → oauth-authorization-CsvzIp_F.mjs.map} +1 -1
- package/dist/{oauth-clients-BC873NCV.mjs → oauth-clients-C9SYwEbZ.mjs} +1 -1
- package/dist/{oauth-clients-BC873NCV.mjs.map → oauth-clients-C9SYwEbZ.mjs.map} +1 -1
- package/dist/{oauth-state-store-Cd--TUaq.mjs → oauth-state-store---zrApfB.mjs} +1 -1
- package/dist/{oauth-state-store-Cd--TUaq.mjs.map → oauth-state-store---zrApfB.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-e4wOvDud.mjs → oauth-user-lookup-SHsWRlG9.mjs} +1 -1
- package/dist/{oauth-user-lookup-e4wOvDud.mjs.map → oauth-user-lookup-SHsWRlG9.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +15 -0
- package/dist/object-cache/memory.d.mts.map +1 -0
- package/dist/object-cache/memory.mjs +56 -0
- package/dist/object-cache/memory.mjs.map +1 -0
- package/dist/object-cache-SEb2IM4Z.mjs +373 -0
- package/dist/object-cache-SEb2IM4Z.mjs.map +1 -0
- package/dist/{options-9kLgkE8m.d.mts → options-CqECG0gM.d.mts} +3 -3
- package/dist/{options-9kLgkE8m.d.mts.map → options-CqECG0gM.d.mts.map} +1 -1
- package/dist/{options-BPCVnesz.mjs → options-DTTML-Tx.mjs} +1 -1
- package/dist/{options-BPCVnesz.mjs.map → options-DTTML-Tx.mjs.map} +1 -1
- package/dist/page/index.d.mts +2 -2
- package/dist/{parse-DzSrk1t8.mjs → parse-C9hpjUyY.mjs} +2 -2
- package/dist/{parse-DzSrk1t8.mjs.map → parse-C9hpjUyY.mjs.map} +1 -1
- package/dist/{passkey-config-BpjbE_Uv.mjs → passkey-config-C0YfSBko.mjs} +1 -1
- package/dist/{passkey-config-BpjbE_Uv.mjs.map → passkey-config-C0YfSBko.mjs.map} +1 -1
- package/dist/{patterns-p-RBdTbM.mjs → patterns-BKmjvM7K.mjs} +1 -1
- package/dist/{patterns-p-RBdTbM.mjs.map → patterns-BKmjvM7K.mjs.map} +1 -1
- package/dist/{placeholder-2xumZh4g.mjs → placeholder-B0s2mWu5.mjs} +1 -1
- package/dist/{placeholder-2xumZh4g.mjs.map → placeholder-B0s2mWu5.mjs.map} +1 -1
- package/dist/{placeholder-BevVKfay.d.mts → placeholder-QoI4gEzP.d.mts} +1 -1
- package/dist/{placeholder-BevVKfay.d.mts.map → placeholder-QoI4gEzP.d.mts.map} +1 -1
- package/dist/plugin-types.d.mts +1 -1
- package/dist/plugin-utils.d.mts +9 -9
- package/dist/plugins/adapt-sandbox-entry.d.mts +9 -9
- package/dist/plugins/adapt-sandbox-entry.mjs +4 -2
- package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
- package/dist/{transport-1cIrOb1Y.mjs → portable-text-BICg8bTk.mjs} +2 -135
- package/dist/portable-text-BICg8bTk.mjs.map +1 -0
- package/dist/{preview-Dqv2hwXr.mjs → preview-DKGCt2_p.mjs} +2 -2
- package/dist/{preview-Dqv2hwXr.mjs.map → preview-DKGCt2_p.mjs.map} +1 -1
- package/dist/{public-url-D_zARuvZ.mjs → public-url-CTVqgMmg.mjs} +1 -1
- package/dist/{public-url-D_zARuvZ.mjs.map → public-url-CTVqgMmg.mjs.map} +1 -1
- package/dist/{query-Crm038Mc.mjs → query-DgUHZLWB.mjs} +230 -31
- package/dist/query-DgUHZLWB.mjs.map +1 -0
- package/dist/{rate-limit-hRTBqmw1.mjs → rate-limit-BuQ5d4X_.mjs} +2 -2
- package/dist/{rate-limit-hRTBqmw1.mjs.map → rate-limit-BuQ5d4X_.mjs.map} +1 -1
- package/dist/{redirect-CRWIt8Zj.mjs → redirect-Bifv_yHv.mjs} +3 -3
- package/dist/{redirect-CRWIt8Zj.mjs.map → redirect-Bifv_yHv.mjs.map} +1 -1
- package/dist/{redirect-C-OOkyku.mjs → redirect-CS-PHtNh.mjs} +1 -1
- package/dist/{redirect-C-OOkyku.mjs.map → redirect-CS-PHtNh.mjs.map} +1 -1
- package/dist/{redirects-CP3TnTLO.mjs → redirects-BZ8Mxn8H.mjs} +6 -6
- package/dist/{redirects-CP3TnTLO.mjs.map → redirects-BZ8Mxn8H.mjs.map} +1 -1
- package/dist/{redirects-6Zg2SoYo.mjs → redirects-x9eFPeyi.mjs} +10 -3
- package/dist/redirects-x9eFPeyi.mjs.map +1 -0
- package/dist/{registry-diMzD1Wf.mjs → registry-CK1SS6pi.mjs} +6 -6
- package/dist/{registry-diMzD1Wf.mjs.map → registry-CK1SS6pi.mjs.map} +1 -1
- package/dist/{request-cache-UwmBAiUK.mjs → request-cache-KCNHp_RJ.mjs} +1 -1
- package/dist/{request-cache-UwmBAiUK.mjs.map → request-cache-KCNHp_RJ.mjs.map} +1 -1
- package/dist/{request-meta-DPechd0W.mjs → request-meta-CmS1tDFf.mjs} +2 -2
- package/dist/{request-meta-DPechd0W.mjs.map → request-meta-CmS1tDFf.mjs.map} +1 -1
- package/dist/{resolve-B3NUUtVY.mjs → resolve-C7I0qiR0.mjs} +1 -1
- package/dist/{resolve-B3NUUtVY.mjs.map → resolve-C7I0qiR0.mjs.map} +1 -1
- package/dist/{runner-C8vcbvCe.d.mts → runner-CEtq-6Sm.d.mts} +2 -2
- package/dist/{runner-C8vcbvCe.d.mts.map → runner-CEtq-6Sm.d.mts.map} +1 -1
- package/dist/{runner--4wMWwKM.mjs → runner-DYYnW530.mjs} +201 -170
- package/dist/runner-DYYnW530.mjs.map +1 -0
- package/dist/runtime.d.mts +10 -10
- package/dist/runtime.mjs +3 -3
- package/dist/{schema-BDOkd3OU.mjs → schema-CbFRFoM7.mjs} +13 -8
- package/dist/schema-CbFRFoM7.mjs.map +1 -0
- package/dist/{search-Bs_J_EW-.mjs → search-C-waE_YW.mjs} +4 -4
- package/dist/{search-Bs_J_EW-.mjs.map → search-C-waE_YW.mjs.map} +1 -1
- package/dist/{secrets-C8xmE6mR.mjs → secrets-BSf9pRRY.mjs} +5 -5
- package/dist/{secrets-C8xmE6mR.mjs.map → secrets-BSf9pRRY.mjs.map} +1 -1
- package/dist/{sections-P0zuBlyz.mjs → sections-osX9U-YJ.mjs} +3 -3
- package/dist/{sections-P0zuBlyz.mjs.map → sections-osX9U-YJ.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +23 -21
- package/dist/seo/index.d.mts +1 -1
- package/dist/seo/index.mjs +1 -1
- package/dist/{seo-DpNgGQjF.mjs → seo-4FovMwNS.mjs} +5 -2
- package/dist/seo-4FovMwNS.mjs.map +1 -0
- package/dist/{seo-CLhm-Fmb.mjs → seo-DCEF-AVr.mjs} +1 -1
- package/dist/{seo-CLhm-Fmb.mjs.map → seo-DCEF-AVr.mjs.map} +1 -1
- package/dist/{service-CDQQnT8W.mjs → service-jby1RRmU.mjs} +3 -3
- package/dist/{service-CDQQnT8W.mjs.map → service-jby1RRmU.mjs.map} +1 -1
- package/dist/session-user-B8aLtKAH.mjs +51 -0
- package/dist/session-user-B8aLtKAH.mjs.map +1 -0
- package/dist/{settings-sO0Fif4p.mjs → settings-4bRT2NIf.mjs} +3 -3
- package/dist/{settings-sO0Fif4p.mjs.map → settings-4bRT2NIf.mjs.map} +1 -1
- package/dist/{settings-BjBsmVAo.mjs → settings-t-H2jPuJ.mjs} +18 -10
- package/dist/settings-t-H2jPuJ.mjs.map +1 -0
- package/dist/{setup-complete-CMMr-oZU.mjs → setup-complete-gEiySUc-.mjs} +2 -2
- package/dist/{setup-complete-CMMr-oZU.mjs.map → setup-complete-gEiySUc-.mjs.map} +1 -1
- package/dist/{setup-nonce-169xl4fV.mjs → setup-nonce-DzS50zme.mjs} +1 -1
- package/dist/{setup-nonce-169xl4fV.mjs.map → setup-nonce-DzS50zme.mjs.map} +1 -1
- package/dist/{single-flight-cache-C0UV1Npg.mjs → single-flight-cache-Cdfkic3t.mjs} +2 -2
- package/dist/{single-flight-cache-C0UV1Npg.mjs.map → single-flight-cache-Cdfkic3t.mjs.map} +1 -1
- package/dist/{site-url-vtsuOvSD.mjs → site-url-BLebyON8.mjs} +2 -2
- package/dist/{site-url-vtsuOvSD.mjs.map → site-url-BLebyON8.mjs.map} +1 -1
- package/dist/{slugify-Cjh1ssOZ.mjs → slugify-Cce3dTdg.mjs} +1 -1
- package/dist/{slugify-Cjh1ssOZ.mjs.map → slugify-Cce3dTdg.mjs.map} +1 -1
- package/dist/{ssrf-XO05Voq6.mjs → ssrf-BRKb343l.mjs} +1 -1
- package/dist/{ssrf-XO05Voq6.mjs.map → ssrf-BRKb343l.mjs.map} +1 -1
- package/dist/{status-2gZklYuj.mjs → status-vUK0SA17.mjs} +1 -1
- package/dist/{status-2gZklYuj.mjs.map → status-vUK0SA17.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-DuESHWKI.mjs → taxonomies-BBB8O-CU.mjs} +7 -7
- package/dist/{taxonomies-DuESHWKI.mjs.map → taxonomies-BBB8O-CU.mjs.map} +1 -1
- package/dist/{taxonomies-BBxYA38v.mjs → taxonomies-Dxrc_szG.mjs} +177 -123
- package/dist/taxonomies-Dxrc_szG.mjs.map +1 -0
- package/dist/{taxonomy-CdllE4oq.mjs → taxonomy-B2HQuVf5.mjs} +19 -6
- package/dist/taxonomy-B2HQuVf5.mjs.map +1 -0
- package/dist/{tokens-DMkVjxrx.mjs → tokens-LeuXF9gG.mjs} +2 -2
- package/dist/{tokens-DMkVjxrx.mjs.map → tokens-LeuXF9gG.mjs.map} +1 -1
- package/dist/{transaction-x2tJQ-A1.mjs → transaction-qfqpPVpu.mjs} +1 -1
- package/dist/{transaction-x2tJQ-A1.mjs.map → transaction-qfqpPVpu.mjs.map} +1 -1
- package/dist/{transport-jdvsZEIt.d.mts → transport-BZ-03aFT.d.mts} +1 -1
- package/dist/{transport-jdvsZEIt.d.mts.map → transport-BZ-03aFT.d.mts.map} +1 -1
- package/dist/transport-_2nBz7e9.mjs +135 -0
- package/dist/transport-_2nBz7e9.mjs.map +1 -0
- package/dist/{trusted-proxy-CHp41Fjj.mjs → trusted-proxy-DZY5WCn2.mjs} +1 -1
- package/dist/{trusted-proxy-CHp41Fjj.mjs.map → trusted-proxy-DZY5WCn2.mjs.map} +1 -1
- package/dist/{types-Del0VMij.d.mts → types-B-gIxFCE.d.mts} +9 -1
- package/dist/{types-Del0VMij.d.mts.map → types-B-gIxFCE.d.mts.map} +1 -1
- package/dist/{types-DdkL6fyv.d.mts → types-BG8_XTLj.d.mts} +1 -1
- package/dist/{types-DdkL6fyv.d.mts.map → types-BG8_XTLj.d.mts.map} +1 -1
- package/dist/{types-BTnnBYVX.d.mts → types-BWh2MjmA.d.mts} +15 -2
- package/dist/types-BWh2MjmA.d.mts.map +1 -0
- package/dist/{types-CkEuk-Zr.d.mts → types-BWqGVhFn.d.mts} +1 -1
- package/dist/{types-CkEuk-Zr.d.mts.map → types-BWqGVhFn.d.mts.map} +1 -1
- package/dist/{types-DejCHqWT.mjs → types-CQAugunJ.mjs} +1 -1
- package/dist/{types-DejCHqWT.mjs.map → types-CQAugunJ.mjs.map} +1 -1
- package/dist/{types-Bzfk2yC8.d.mts → types-CTLJYMhN.d.mts} +1 -1
- package/dist/{types-Bzfk2yC8.d.mts.map → types-CTLJYMhN.d.mts.map} +1 -1
- package/dist/{types-BFgYtuKd.d.mts → types-CUsXGRVj.d.mts} +1 -1
- package/dist/{types-BFgYtuKd.d.mts.map → types-CUsXGRVj.d.mts.map} +1 -1
- package/dist/{types-BXSUSAjt.mjs → types-DXOIbece.mjs} +3 -3
- package/dist/types-DXOIbece.mjs.map +1 -0
- package/dist/{types-u_XxjbS8.d.mts → types-DrYMm9s5.d.mts} +1 -1
- package/dist/{types-u_XxjbS8.d.mts.map → types-DrYMm9s5.d.mts.map} +1 -1
- package/dist/{types-DO7whVYU.d.mts → types-TTx8uP7V.d.mts} +2 -2
- package/dist/{types-DO7whVYU.d.mts.map → types-TTx8uP7V.d.mts.map} +1 -1
- package/dist/types-fS7-VTdR.d.mts +124 -0
- package/dist/types-fS7-VTdR.d.mts.map +1 -0
- package/dist/{types-BIduXPJk.mjs → types-tM44hEcf.mjs} +1 -1
- package/dist/{types-BIduXPJk.mjs.map → types-tM44hEcf.mjs.map} +1 -1
- package/dist/{user-C0um7wrg.mjs → user-Db-Rti_z.mjs} +3 -3
- package/dist/{user-C0um7wrg.mjs.map → user-Db-Rti_z.mjs.map} +1 -1
- package/dist/{utils-C4M981Br.mjs → utils-B7A57fm9.mjs} +2 -2
- package/dist/{utils-C4M981Br.mjs.map → utils-B7A57fm9.mjs.map} +1 -1
- package/dist/{validate-DGhQPXzI.mjs → validate-0Utjspbs.mjs} +3 -3
- package/dist/{validate-DGhQPXzI.mjs.map → validate-0Utjspbs.mjs.map} +1 -1
- package/dist/{validate-cJOiOvT2.d.mts → validate-DOFrIb-c.d.mts} +5 -5
- package/dist/{validate-cJOiOvT2.d.mts.map → validate-DOFrIb-c.d.mts.map} +1 -1
- package/dist/{validation-DVHjPM1M.mjs → validation-D9EnzH1T.mjs} +6 -6
- package/dist/{validation-DVHjPM1M.mjs.map → validation-D9EnzH1T.mjs.map} +1 -1
- package/dist/version-BgVM_1MU.mjs +7 -0
- package/dist/{version-BOjj_cfz.mjs.map → version-BgVM_1MU.mjs.map} +1 -1
- package/dist/{widgets-Ci6hLwfO.mjs → widgets-BSTzPUYa.mjs} +4 -4
- package/dist/{widgets-Ci6hLwfO.mjs.map → widgets-BSTzPUYa.mjs.map} +1 -1
- package/dist/{zod-generator-CarzgPAu.mjs → zod-generator-ElVQOav7.mjs} +51 -15
- package/dist/zod-generator-ElVQOav7.mjs.map +1 -0
- package/package.json +19 -6
- package/src/api/handlers/api-tokens.ts +19 -0
- package/src/api/handlers/comment-reactions.ts +165 -0
- package/src/api/handlers/schema.ts +8 -0
- package/src/api/schemas/bylines.ts +8 -0
- package/src/api/schemas/comments.ts +10 -0
- package/src/astro/image-endpoint.ts +84 -0
- package/src/astro/index.ts +6 -0
- package/src/astro/integration/index.ts +83 -22
- package/src/astro/integration/routes.ts +5 -0
- package/src/astro/integration/runtime.ts +65 -1
- package/src/astro/integration/virtual-modules.ts +40 -0
- package/src/astro/integration/vite-config.ts +25 -1
- package/src/astro/middleware/auth.ts +4 -3
- package/src/astro/middleware/request-context.ts +6 -1
- package/src/astro/middleware/scoped-db.ts +131 -0
- package/src/astro/middleware/stream-end-metrics.ts +15 -9
- package/src/astro/middleware.ts +131 -31
- package/src/astro/object-cache/adapters.ts +50 -0
- package/src/astro/prefetch.ts +77 -0
- package/src/astro/routes/admin.astro +5 -1
- package/src/astro/routes/api/comments/[collection]/[contentId]/reactions.ts +97 -0
- package/src/astro/routes/api/schema/index.ts +9 -3
- package/src/astro/routes/api/setup/dev-bypass.ts +5 -1
- package/src/astro/routes/api/snapshot.ts +3 -1
- package/src/astro/session-user.ts +57 -0
- package/src/astro/types.ts +1 -0
- package/src/cli/commands/export-seed.ts +10 -7
- package/src/comments/query.ts +78 -7
- package/src/comments/ranking.ts +58 -0
- package/src/components/Block.astro +71 -0
- package/src/components/Comments.astro +136 -1
- package/src/components/EmDashMedia.astro +1 -2
- package/src/components/Image.astro +36 -2
- package/src/components/InlinePortableTextEditor.tsx +10 -2
- package/src/components/index.ts +5 -0
- package/src/components/portable-text-text-align.ts +38 -0
- package/src/content/converters/portable-text-to-prosemirror.ts +5 -1
- package/src/content/converters/prosemirror-to-portable-text.ts +8 -0
- package/src/content/converters/types.ts +1 -0
- package/src/database/instrumentation.ts +21 -1
- package/src/database/migrations/044_comment_reactions.ts +56 -0
- package/src/database/migrations/runner.ts +2 -0
- package/src/database/repositories/byline.ts +27 -0
- package/src/database/repositories/comment-reaction.ts +132 -0
- package/src/database/repositories/comment.ts +10 -0
- package/src/database/repositories/content.ts +25 -3
- package/src/database/repositories/menu.ts +13 -1
- package/src/database/repositories/seo.ts +3 -0
- package/src/database/repositories/taxonomy.ts +13 -1
- package/src/database/repositories/types.ts +13 -0
- package/src/database/types.ts +9 -0
- package/src/emdash-runtime.ts +244 -75
- package/src/index.ts +22 -0
- package/src/loader.ts +97 -5
- package/src/mcp/server.ts +307 -20
- package/src/media/image-endpoint.ts +167 -0
- package/src/media/local-runtime.ts +18 -5
- package/src/menus/index.ts +11 -4
- package/src/object-cache/codec.ts +73 -0
- package/src/object-cache/index.ts +495 -0
- package/src/object-cache/memory.ts +91 -0
- package/src/object-cache/types.ts +124 -0
- package/src/plugins/adapt-sandbox-entry.ts +11 -1
- package/src/plugins/context.ts +94 -22
- package/src/plugins/cron.ts +18 -2
- package/src/plugins/routes.ts +40 -1
- package/src/query.ts +304 -18
- package/src/schema/query.ts +11 -4
- package/src/schema/zod-generator.ts +53 -8
- package/src/settings/index.ts +18 -5
- package/src/taxonomies/index.ts +263 -165
- package/src/ui.ts +5 -0
- package/src/virtual-modules.d.ts +24 -0
- package/dist/api-DxjIV2o8.mjs.map +0 -1
- package/dist/api-tokens-BFFkB0jB.mjs.map +0 -1
- package/dist/byline-V_Qp1Ziw.mjs.map +0 -1
- package/dist/byline-fields-CQJRIQkn.d.mts.map +0 -1
- package/dist/comment-sqQxNpN3.mjs.map +0 -1
- package/dist/content-BIlVx-RX.mjs.map +0 -1
- package/dist/context-Cm4pt1Ws.mjs.map +0 -1
- package/dist/cron-DdEVrQ2Y.mjs.map +0 -1
- package/dist/index-D2VAiumu.d.mts.map +0 -1
- package/dist/init-lock-DlBHjf9-.mjs.map +0 -1
- package/dist/loader-BqWjcH3h.mjs.map +0 -1
- package/dist/menus-DX4_E01q.mjs.map +0 -1
- package/dist/menus-Ryk9L7fT.mjs.map +0 -1
- package/dist/query-Crm038Mc.mjs.map +0 -1
- package/dist/redirects-6Zg2SoYo.mjs.map +0 -1
- package/dist/runner--4wMWwKM.mjs.map +0 -1
- package/dist/schema-BDOkd3OU.mjs.map +0 -1
- package/dist/seo-DpNgGQjF.mjs.map +0 -1
- package/dist/settings-BjBsmVAo.mjs.map +0 -1
- package/dist/taxonomies-BBxYA38v.mjs.map +0 -1
- package/dist/taxonomy-CdllE4oq.mjs.map +0 -1
- package/dist/transport-1cIrOb1Y.mjs.map +0 -1
- package/dist/types-BTnnBYVX.d.mts.map +0 -1
- package/dist/types-BXSUSAjt.mjs.map +0 -1
- package/dist/version-BOjj_cfz.mjs +0 -7
- package/dist/zod-generator-CarzgPAu.mjs.map +0 -1
- /package/dist/{api-tokens-C7ywRx7l.mjs → api-tokens-B4BQybOp.mjs} +0 -0
- /package/dist/{ssrf-CRZGzjdL.mjs → ssrf-CcX9zvMK.mjs} +0 -0
- /package/dist/{types-BoRm8-pp.mjs → types-BvbeGEtr.mjs} +0 -0
|
@@ -21,6 +21,10 @@ interface Props {
|
|
|
21
21
|
collection: string;
|
|
22
22
|
contentId: string;
|
|
23
23
|
threaded?: boolean;
|
|
24
|
+
/** Show a like/reaction button per comment (opt-in). */
|
|
25
|
+
reactions?: boolean;
|
|
26
|
+
/** Order of top-level comments: chronological (default) or Wilson-ranked. */
|
|
27
|
+
sort?: "oldest" | "best";
|
|
24
28
|
class?: string;
|
|
25
29
|
}
|
|
26
30
|
|
|
@@ -28,13 +32,15 @@ const {
|
|
|
28
32
|
collection,
|
|
29
33
|
contentId,
|
|
30
34
|
threaded = false,
|
|
35
|
+
reactions = false,
|
|
36
|
+
sort = "oldest",
|
|
31
37
|
class: className,
|
|
32
38
|
} = Astro.props;
|
|
33
39
|
|
|
34
40
|
const collectionInfo = await getCollectionInfo(collection);
|
|
35
41
|
const enabled = collectionInfo?.commentsEnabled ?? false;
|
|
36
42
|
const { items, total } = enabled
|
|
37
|
-
? await getComments({ collection, contentId, threaded })
|
|
43
|
+
? await getComments({ collection, contentId, threaded, reactions, sort })
|
|
38
44
|
: { items: [], total: 0 };
|
|
39
45
|
|
|
40
46
|
const URL_RE = /https?:\/\/[^\s<>"')\]]+/g;
|
|
@@ -62,15 +68,72 @@ function escapeHtml(text: string): string {
|
|
|
62
68
|
function formatBody(text: string): string {
|
|
63
69
|
return autoLinkUrls(escapeHtml(text));
|
|
64
70
|
}
|
|
71
|
+
|
|
72
|
+
// Progressive-enhancement script for reactions. Emitted verbatim (is:inline)
|
|
73
|
+
// only when `reactions` is enabled, so non-reaction pages ship zero extra JS.
|
|
74
|
+
// Avoids template literals internally so it survives the outer backticks.
|
|
75
|
+
const REACTION_SCRIPT = `
|
|
76
|
+
(() => {
|
|
77
|
+
const sections = document.querySelectorAll('[data-ec-comments][data-ec-reactions]');
|
|
78
|
+
sections.forEach((section) => {
|
|
79
|
+
const collection = section.getAttribute('data-collection');
|
|
80
|
+
const contentId = section.getAttribute('data-content-id');
|
|
81
|
+
if (!collection || !contentId) return;
|
|
82
|
+
const base = '/_emdash/api/comments/' + encodeURIComponent(collection) + '/' + encodeURIComponent(contentId) + '/reactions';
|
|
83
|
+
const headers = { 'X-EmDash-Request': '1' };
|
|
84
|
+
|
|
85
|
+
fetch(base, { headers: headers })
|
|
86
|
+
.then((r) => (r.ok ? r.json() : null))
|
|
87
|
+
.then((payload) => {
|
|
88
|
+
const viewer = payload && payload.data && payload.data.viewer;
|
|
89
|
+
if (!viewer) return;
|
|
90
|
+
Object.keys(viewer).forEach((commentId) => {
|
|
91
|
+
(viewer[commentId] || []).forEach((reaction) => {
|
|
92
|
+
const sel = '.ec-reaction[data-comment-id="' + commentId + '"][data-ec-reaction="' + reaction + '"]';
|
|
93
|
+
const btn = section.querySelector(sel);
|
|
94
|
+
if (btn) btn.setAttribute('aria-pressed', 'true');
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
})
|
|
98
|
+
.catch(() => {});
|
|
99
|
+
|
|
100
|
+
section.addEventListener('click', (event) => {
|
|
101
|
+
const btn = event.target.closest('.ec-reaction');
|
|
102
|
+
if (!btn || !section.contains(btn)) return;
|
|
103
|
+
const commentId = btn.getAttribute('data-comment-id');
|
|
104
|
+
const reaction = btn.getAttribute('data-ec-reaction');
|
|
105
|
+
if (!commentId || !reaction) return;
|
|
106
|
+
btn.disabled = true;
|
|
107
|
+
fetch(base, {
|
|
108
|
+
method: 'POST',
|
|
109
|
+
headers: Object.assign({ 'Content-Type': 'application/json' }, headers),
|
|
110
|
+
body: JSON.stringify({ commentId: commentId, reaction: reaction }),
|
|
111
|
+
})
|
|
112
|
+
.then((r) => (r.ok ? r.json() : null))
|
|
113
|
+
.then((payload) => {
|
|
114
|
+
const data = payload && payload.data;
|
|
115
|
+
if (!data) return;
|
|
116
|
+
btn.setAttribute('aria-pressed', data.reacted ? 'true' : 'false');
|
|
117
|
+
const countEl = btn.querySelector('[data-ec-reaction-count]');
|
|
118
|
+
if (countEl) countEl.textContent = String((data.counts && data.counts[reaction]) || 0);
|
|
119
|
+
})
|
|
120
|
+
.catch(() => {})
|
|
121
|
+
.finally(() => { btn.disabled = false; });
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
})();
|
|
125
|
+
`;
|
|
65
126
|
---
|
|
66
127
|
|
|
67
128
|
{
|
|
68
129
|
enabled && (
|
|
130
|
+
<Fragment>
|
|
69
131
|
<section
|
|
70
132
|
class:list={["ec-comments", className]}
|
|
71
133
|
data-ec-comments
|
|
72
134
|
data-collection={collection}
|
|
73
135
|
data-content-id={contentId}
|
|
136
|
+
{...(reactions ? { "data-ec-reactions": "" } : {})}
|
|
74
137
|
>
|
|
75
138
|
<h3 class="ec-comments-heading">
|
|
76
139
|
{total === 0
|
|
@@ -112,6 +175,25 @@ function formatBody(text: string): string {
|
|
|
112
175
|
class="ec-comment-body"
|
|
113
176
|
set:html={formatBody(comment.body)}
|
|
114
177
|
/>
|
|
178
|
+
{reactions && (
|
|
179
|
+
<div class="ec-comment-actions">
|
|
180
|
+
<button
|
|
181
|
+
type="button"
|
|
182
|
+
class="ec-reaction"
|
|
183
|
+
data-ec-reaction="like"
|
|
184
|
+
data-comment-id={comment.id}
|
|
185
|
+
aria-pressed="false"
|
|
186
|
+
>
|
|
187
|
+
<span class="ec-reaction-icon" aria-hidden="true">
|
|
188
|
+
♡
|
|
189
|
+
</span>
|
|
190
|
+
<span class="ec-reaction-label">Like</span>
|
|
191
|
+
<span class="ec-reaction-count" data-ec-reaction-count>
|
|
192
|
+
{comment.reactions?.like ?? 0}
|
|
193
|
+
</span>
|
|
194
|
+
</button>
|
|
195
|
+
</div>
|
|
196
|
+
)}
|
|
115
197
|
{threaded && comment.replies && comment.replies.length > 0 && (
|
|
116
198
|
<ol class="ec-comment-replies">
|
|
117
199
|
{comment.replies.map((reply: PublicComment) => (
|
|
@@ -153,6 +235,21 @@ function formatBody(text: string): string {
|
|
|
153
235
|
class="ec-comment-body"
|
|
154
236
|
set:html={formatBody(reply.body)}
|
|
155
237
|
/>
|
|
238
|
+
{reactions && (
|
|
239
|
+
<div class="ec-comment-actions">
|
|
240
|
+
<button
|
|
241
|
+
type="button"
|
|
242
|
+
class="ec-reaction"
|
|
243
|
+
data-ec-reaction="like"
|
|
244
|
+
data-comment-id={reply.id}
|
|
245
|
+
aria-pressed="false"
|
|
246
|
+
>
|
|
247
|
+
<span class="ec-reaction-icon" aria-hidden="true">♡</span>
|
|
248
|
+
<span class="ec-reaction-label">Like</span>
|
|
249
|
+
<span class="ec-reaction-count" data-ec-reaction-count>{reply.reactions?.like ?? 0}</span>
|
|
250
|
+
</button>
|
|
251
|
+
</div>
|
|
252
|
+
)}
|
|
156
253
|
</article>
|
|
157
254
|
</li>
|
|
158
255
|
))}
|
|
@@ -164,6 +261,8 @@ function formatBody(text: string): string {
|
|
|
164
261
|
</ol>
|
|
165
262
|
)}
|
|
166
263
|
</section>
|
|
264
|
+
{reactions && <script is:inline set:html={REACTION_SCRIPT} />}
|
|
265
|
+
</Fragment>
|
|
167
266
|
)
|
|
168
267
|
}
|
|
169
268
|
|
|
@@ -229,4 +328,40 @@ function formatBody(text: string): string {
|
|
|
229
328
|
white-space: pre-wrap;
|
|
230
329
|
word-break: break-word;
|
|
231
330
|
}
|
|
331
|
+
|
|
332
|
+
.ec-comment-actions {
|
|
333
|
+
margin-top: 0.5rem;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
.ec-reaction {
|
|
337
|
+
display: inline-flex;
|
|
338
|
+
align-items: center;
|
|
339
|
+
gap: 0.35rem;
|
|
340
|
+
font: inherit;
|
|
341
|
+
font-size: 0.875em;
|
|
342
|
+
color: inherit;
|
|
343
|
+
background: none;
|
|
344
|
+
border: var(--ec-comment-border);
|
|
345
|
+
border-radius: 999px;
|
|
346
|
+
padding: 0.15rem 0.6rem;
|
|
347
|
+
cursor: pointer;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
.ec-reaction[aria-pressed="true"] {
|
|
351
|
+
border-color: currentColor;
|
|
352
|
+
font-weight: 600;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
.ec-reaction[aria-pressed="true"] .ec-reaction-icon {
|
|
356
|
+
color: #e0245e;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
.ec-reaction:disabled {
|
|
360
|
+
opacity: 0.5;
|
|
361
|
+
cursor: default;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
.ec-reaction-count {
|
|
365
|
+
font-variant-numeric: tabular-nums;
|
|
366
|
+
}
|
|
232
367
|
</style>
|
|
@@ -158,9 +158,8 @@ const finalAlt = alt ?? (embed?.type === "image" ? embed.alt : undefined) ?? med
|
|
|
158
158
|
</audio>
|
|
159
159
|
)}
|
|
160
160
|
|
|
161
|
+
{/* Custom component embeds (Mux player, etc.) require dynamic import. Placeholder until that lands. */}
|
|
161
162
|
{embed?.type === "component" && (
|
|
162
|
-
<!-- Custom component embeds (Mux player, etc.) require dynamic import -->
|
|
163
|
-
<!-- For now, show a placeholder - full implementation TBD -->
|
|
164
163
|
<div class="emdash-media-component" data-package={embed.package} data-export={embed.export}>
|
|
165
164
|
<p>Custom media component: {embed.package}</p>
|
|
166
165
|
</div>
|
|
@@ -38,6 +38,8 @@ export interface Props {
|
|
|
38
38
|
displayWidth?: number;
|
|
39
39
|
/** Display height for this instance (overrides original) */
|
|
40
40
|
displayHeight?: number;
|
|
41
|
+
/** Alignment for this image instance (e.g. from a WordPress import) */
|
|
42
|
+
alignment?: "left" | "center" | "right" | "wide" | "full";
|
|
41
43
|
};
|
|
42
44
|
}
|
|
43
45
|
|
|
@@ -63,7 +65,7 @@ if (!node?.asset) {
|
|
|
63
65
|
return null;
|
|
64
66
|
}
|
|
65
67
|
|
|
66
|
-
const { asset, alt = "", caption, width, height, displayWidth, displayHeight } = node;
|
|
68
|
+
const { asset, alt = "", caption, width, height, displayWidth, displayHeight, alignment } = node;
|
|
67
69
|
|
|
68
70
|
// Calculate aspect ratio from original dimensions
|
|
69
71
|
const aspectRatio = width && height ? width / height : undefined;
|
|
@@ -168,7 +170,7 @@ const baseStyle = aspectRatio
|
|
|
168
170
|
const imgStyle = placeholderStyle ? `${baseStyle} ${placeholderStyle}` : baseStyle;
|
|
169
171
|
---
|
|
170
172
|
|
|
171
|
-
<figure class="emdash-image">
|
|
173
|
+
<figure class:list={["emdash-image", alignment && `emdash-image--align-${alignment}`]}>
|
|
172
174
|
<img
|
|
173
175
|
src={src}
|
|
174
176
|
srcset={srcset}
|
|
@@ -197,4 +199,36 @@ const imgStyle = placeholderStyle ? `${baseStyle} ${placeholderStyle}` : baseSty
|
|
|
197
199
|
margin-top: 0.5rem;
|
|
198
200
|
text-align: center;
|
|
199
201
|
}
|
|
202
|
+
/* Alignment (WordPress-style). Floats wrap surrounding text; wide/full span the column. */
|
|
203
|
+
.emdash-image--align-left,
|
|
204
|
+
.emdash-image--align-right {
|
|
205
|
+
width: fit-content;
|
|
206
|
+
max-width: 50%;
|
|
207
|
+
}
|
|
208
|
+
.emdash-image--align-left {
|
|
209
|
+
float: left;
|
|
210
|
+
margin: 0 1.5rem 1rem 0;
|
|
211
|
+
}
|
|
212
|
+
.emdash-image--align-right {
|
|
213
|
+
float: right;
|
|
214
|
+
margin: 0 0 1rem 1.5rem;
|
|
215
|
+
}
|
|
216
|
+
.emdash-image--align-center {
|
|
217
|
+
width: fit-content;
|
|
218
|
+
margin-inline: auto;
|
|
219
|
+
}
|
|
220
|
+
.emdash-image--align-wide,
|
|
221
|
+
.emdash-image--align-full {
|
|
222
|
+
width: 100%;
|
|
223
|
+
}
|
|
224
|
+
/* On narrow screens, un-float left/right so the image is not cramped beside text. */
|
|
225
|
+
@media (max-width: 640px) {
|
|
226
|
+
.emdash-image--align-left,
|
|
227
|
+
.emdash-image--align-right {
|
|
228
|
+
float: none;
|
|
229
|
+
width: 100%;
|
|
230
|
+
max-width: 100%;
|
|
231
|
+
margin-inline: 0;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
200
234
|
</style>
|
|
@@ -51,6 +51,7 @@ interface PTTextBlock {
|
|
|
51
51
|
level?: number;
|
|
52
52
|
children: PTSpan[];
|
|
53
53
|
markDefs?: PTMarkDef[];
|
|
54
|
+
textAlign?: "left" | "center" | "right" | "justify";
|
|
54
55
|
}
|
|
55
56
|
|
|
56
57
|
type PTBlock = PTTextBlock | { _type: string; _key: string; [key: string]: unknown };
|
|
@@ -119,12 +120,15 @@ function convertPMNode(node: PMNode): PTBlock | PTBlock[] | null {
|
|
|
119
120
|
case "paragraph": {
|
|
120
121
|
const { children, markDefs } = convertInline(node.content || []);
|
|
121
122
|
if (children.length === 0) return null;
|
|
123
|
+
const ta = node.attrs?.textAlign;
|
|
124
|
+
const textAlign = ta === "center" || ta === "right" || ta === "justify" ? ta : undefined;
|
|
122
125
|
return {
|
|
123
126
|
_type: "block",
|
|
124
127
|
_key: k(),
|
|
125
128
|
style: "normal",
|
|
126
129
|
children,
|
|
127
130
|
markDefs: markDefs.length > 0 ? markDefs : undefined,
|
|
131
|
+
...(textAlign ? { textAlign } : {}),
|
|
128
132
|
};
|
|
129
133
|
}
|
|
130
134
|
case "heading": {
|
|
@@ -140,12 +144,15 @@ function convertPMNode(node: PMNode): PTBlock | PTBlock[] | null {
|
|
|
140
144
|
6: "h6",
|
|
141
145
|
};
|
|
142
146
|
const headingStyle = headingStyles[level] ?? "h1";
|
|
147
|
+
const ta = node.attrs?.textAlign;
|
|
148
|
+
const textAlign = ta === "center" || ta === "right" || ta === "justify" ? ta : undefined;
|
|
143
149
|
return {
|
|
144
150
|
_type: "block",
|
|
145
151
|
_key: k(),
|
|
146
152
|
style: headingStyle,
|
|
147
153
|
children,
|
|
148
154
|
markDefs: markDefs.length > 0 ? markDefs : undefined,
|
|
155
|
+
...(textAlign ? { textAlign } : {}),
|
|
149
156
|
};
|
|
150
157
|
}
|
|
151
158
|
case "bulletList":
|
|
@@ -361,7 +368,7 @@ function portableTextToPM(blocks: PTBlock[]): JSONContent {
|
|
|
361
368
|
|
|
362
369
|
function convertPTBlock(block: PTBlock): JSONContent | null {
|
|
363
370
|
if (isPTTextBlock(block)) {
|
|
364
|
-
const { style = "normal", children, markDefs = [] } = block;
|
|
371
|
+
const { style = "normal", children, markDefs = [], textAlign } = block;
|
|
365
372
|
const pmContent = convertPTSpans(children, markDefs);
|
|
366
373
|
|
|
367
374
|
if (style === "blockquote") {
|
|
@@ -379,12 +386,13 @@ function convertPTBlock(block: PTBlock): JSONContent | null {
|
|
|
379
386
|
const level = parseInt(style.substring(1), 10);
|
|
380
387
|
return {
|
|
381
388
|
type: "heading",
|
|
382
|
-
attrs: { level },
|
|
389
|
+
attrs: { level, ...(textAlign ? { textAlign } : {}) },
|
|
383
390
|
content: pmContent.length > 0 ? pmContent : undefined,
|
|
384
391
|
};
|
|
385
392
|
}
|
|
386
393
|
return {
|
|
387
394
|
type: "paragraph",
|
|
395
|
+
attrs: textAlign ? { textAlign } : undefined,
|
|
388
396
|
content: pmContent.length > 0 ? pmContent : undefined,
|
|
389
397
|
};
|
|
390
398
|
}
|
package/src/components/index.ts
CHANGED
|
@@ -36,6 +36,7 @@ export { default as EmDashImage } from "./EmDashImage.astro";
|
|
|
36
36
|
export { default as EmDashMedia } from "./EmDashMedia.astro";
|
|
37
37
|
|
|
38
38
|
// Portable Text block type components
|
|
39
|
+
export { default as Block } from "./Block.astro";
|
|
39
40
|
export { default as Image } from "./Image.astro";
|
|
40
41
|
export { default as Code } from "./Code.astro";
|
|
41
42
|
export { default as Embed } from "./Embed.astro";
|
|
@@ -57,6 +58,7 @@ export { default as Underline } from "./marks/Underline.astro";
|
|
|
57
58
|
export { default as StrikeThrough } from "./marks/StrikeThrough.astro";
|
|
58
59
|
export { default as Link } from "./marks/Link.astro";
|
|
59
60
|
|
|
61
|
+
import BlockComponent from "./Block.astro";
|
|
60
62
|
import BreakComponent from "./Break.astro";
|
|
61
63
|
import ButtonComponent from "./Button.astro";
|
|
62
64
|
import ButtonsComponent from "./Buttons.astro";
|
|
@@ -77,11 +79,14 @@ import TableComponent from "./Table.astro";
|
|
|
77
79
|
* Pre-configured components for EmDash Portable Text content
|
|
78
80
|
*
|
|
79
81
|
* Includes renderers for:
|
|
82
|
+
* - Block styles: paragraph, h1..h6, blockquote — with `textAlign` honoured
|
|
83
|
+
* as a WordPress-style `has-text-align-{value}` class (#1201)
|
|
80
84
|
* - Block types: image, code, embed, gallery, columns, break, htmlBlock, table,
|
|
81
85
|
* button, buttons, cover, file, pullquote
|
|
82
86
|
* - Marks: superscript, subscript, underline, strike-through, link
|
|
83
87
|
*/
|
|
84
88
|
export const emdashComponents = {
|
|
89
|
+
block: BlockComponent,
|
|
85
90
|
type: {
|
|
86
91
|
image: ImageComponent,
|
|
87
92
|
code: CodeComponent,
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps a Portable Text block's `textAlign` to a WordPress-style class name
|
|
3
|
+
* (`has-text-align-{value}`) for public rendering. Used by the Portable Text
|
|
4
|
+
* `Block` override in `./Block.astro`.
|
|
5
|
+
*
|
|
6
|
+
* `left` is the document default and intentionally does not produce a class —
|
|
7
|
+
* this matches the converter's omit-on-default rule (see
|
|
8
|
+
* `src/content/converters/prosemirror-to-portable-text.ts`) so untouched
|
|
9
|
+
* content stays bytewise identical and renders without an extra class.
|
|
10
|
+
*
|
|
11
|
+
* Related: https://github.com/emdash-cms/emdash/issues/1201
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
type AlignClassName = "has-text-align-center" | "has-text-align-right" | "has-text-align-justify";
|
|
15
|
+
|
|
16
|
+
const ALIGN_CLASS_MAP: Record<string, AlignClassName> = {
|
|
17
|
+
center: "has-text-align-center",
|
|
18
|
+
right: "has-text-align-right",
|
|
19
|
+
justify: "has-text-align-justify",
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Returns the CSS class for a textAlign value, or `undefined` when no class
|
|
24
|
+
* should be emitted (default left, missing, or unknown values).
|
|
25
|
+
*
|
|
26
|
+
* Allowlist-only by design: arbitrary strings are rejected so a hand-edited
|
|
27
|
+
* or imported Portable Text block cannot inject attacker-controlled class
|
|
28
|
+
* names into the rendered HTML.
|
|
29
|
+
*/
|
|
30
|
+
export function textAlignClassName(value: string | undefined): AlignClassName | undefined {
|
|
31
|
+
if (value === undefined) return undefined;
|
|
32
|
+
// `Object.hasOwn` (not `in`) so prototype keys like "toString" or
|
|
33
|
+
// "constructor" can't slip through as valid alignments.
|
|
34
|
+
if (Object.hasOwn(ALIGN_CLASS_MAP, value)) {
|
|
35
|
+
return ALIGN_CLASS_MAP[value];
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
@@ -164,7 +164,10 @@ function convertTextBlock(block: PortableTextTextBlock): ProseMirrorNode | null
|
|
|
164
164
|
const level = parseInt(style.substring(1), 10);
|
|
165
165
|
return {
|
|
166
166
|
type: "heading",
|
|
167
|
-
attrs: {
|
|
167
|
+
attrs: {
|
|
168
|
+
level,
|
|
169
|
+
...(block.textAlign ? { textAlign: block.textAlign } : {}),
|
|
170
|
+
},
|
|
168
171
|
content: content.length > 0 ? content : undefined,
|
|
169
172
|
};
|
|
170
173
|
}
|
|
@@ -184,6 +187,7 @@ function convertTextBlock(block: PortableTextTextBlock): ProseMirrorNode | null
|
|
|
184
187
|
default:
|
|
185
188
|
return {
|
|
186
189
|
type: "paragraph",
|
|
190
|
+
attrs: block.textAlign ? { textAlign: block.textAlign } : undefined,
|
|
187
191
|
content: content.length > 0 ? content : undefined,
|
|
188
192
|
};
|
|
189
193
|
}
|
|
@@ -106,12 +106,16 @@ function convertParagraph(node: ProseMirrorNode): PortableTextTextBlock | null {
|
|
|
106
106
|
return null;
|
|
107
107
|
}
|
|
108
108
|
|
|
109
|
+
const ta = node.attrs?.textAlign;
|
|
110
|
+
const textAlign = ta === "center" || ta === "right" || ta === "justify" ? ta : undefined;
|
|
111
|
+
|
|
109
112
|
return {
|
|
110
113
|
_type: "block",
|
|
111
114
|
_key: generateKey(),
|
|
112
115
|
style: "normal",
|
|
113
116
|
children,
|
|
114
117
|
markDefs: markDefs.length > 0 ? markDefs : undefined,
|
|
118
|
+
...(textAlign ? { textAlign } : {}),
|
|
115
119
|
};
|
|
116
120
|
}
|
|
117
121
|
|
|
@@ -147,12 +151,16 @@ function convertHeading(node: ProseMirrorNode): PortableTextTextBlock | null {
|
|
|
147
151
|
return null;
|
|
148
152
|
}
|
|
149
153
|
|
|
154
|
+
const ta = node.attrs?.textAlign;
|
|
155
|
+
const textAlign = ta === "center" || ta === "right" || ta === "justify" ? ta : undefined;
|
|
156
|
+
|
|
150
157
|
return {
|
|
151
158
|
_type: "block",
|
|
152
159
|
_key: generateKey(),
|
|
153
160
|
style,
|
|
154
161
|
children,
|
|
155
162
|
markDefs: markDefs.length > 0 ? markDefs : undefined,
|
|
163
|
+
...(textAlign ? { textAlign } : {}),
|
|
156
164
|
};
|
|
157
165
|
}
|
|
158
166
|
|
|
@@ -33,6 +33,19 @@ export interface QueryRecorder {
|
|
|
33
33
|
route: string;
|
|
34
34
|
method: string;
|
|
35
35
|
phase: string;
|
|
36
|
+
/**
|
|
37
|
+
* Set once the recorder has been emitted, so a flush is idempotent.
|
|
38
|
+
* Without this, a fallback flush and the stream-end flush could both
|
|
39
|
+
* fire and double-emit the events.
|
|
40
|
+
*/
|
|
41
|
+
flushed?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Set when the response body is wrapped for stream-end metrics. The
|
|
44
|
+
* recorder is then flushed when the body finishes streaming (so it
|
|
45
|
+
* captures queries issued by components during streaming) rather than
|
|
46
|
+
* when middleware returns (headers ready, body not yet streamed).
|
|
47
|
+
*/
|
|
48
|
+
deferredFlush?: boolean;
|
|
36
49
|
}
|
|
37
50
|
|
|
38
51
|
export function createRecorder(route: string, method: string, phase: string): QueryRecorder {
|
|
@@ -60,9 +73,16 @@ export function recordEvent(
|
|
|
60
73
|
* harness pipes the child's stdout, filters lines beginning with
|
|
61
74
|
* QUERY_LOG_PREFIX, and writes them to its own file. Using stdout means
|
|
62
75
|
* the sink works uniformly in Node and in workerd (which has no fs).
|
|
76
|
+
*
|
|
77
|
+
* Idempotent: the first call emits and marks the recorder flushed, later
|
|
78
|
+
* calls no-op. For streamed responses the flush is deferred to stream end
|
|
79
|
+
* (see wrapBodyForStreamMetrics) so it captures queries issued while the
|
|
80
|
+
* body is still rendering; bodyless responses fall back to a flush when
|
|
81
|
+
* middleware returns.
|
|
63
82
|
*/
|
|
64
83
|
export function flushRecorder(rec: QueryRecorder): void {
|
|
65
|
-
if (rec.
|
|
84
|
+
if (rec.flushed) return;
|
|
85
|
+
rec.flushed = true;
|
|
66
86
|
for (const e of rec.events) {
|
|
67
87
|
console.log(`${QUERY_LOG_PREFIX} ${JSON.stringify(e)}`);
|
|
68
88
|
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Kysely } from "kysely";
|
|
2
|
+
|
|
3
|
+
import { currentTimestamp } from "../dialect-helpers.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Comment reactions (Tier 1 of the best-in-class comments RFC).
|
|
7
|
+
*
|
|
8
|
+
* One row per (comment, voter, reaction). Toggle semantics are enforced by the
|
|
9
|
+
* unique index — a voter either has a given reaction on a comment or doesn't.
|
|
10
|
+
* `voter_hash` is a salted SHA-256 of the visitor's IP (same primitive as
|
|
11
|
+
* `_emdash_comments.ip_hash`), so no cleartext identity is stored.
|
|
12
|
+
*
|
|
13
|
+
* Additive and backward-compatible: a new table, no change to existing schema.
|
|
14
|
+
*/
|
|
15
|
+
export async function up(db: Kysely<unknown>): Promise<void> {
|
|
16
|
+
await db.schema
|
|
17
|
+
.createTable("_emdash_comment_reactions")
|
|
18
|
+
.ifNotExists()
|
|
19
|
+
.addColumn("id", "text", (col) => col.primaryKey())
|
|
20
|
+
.addColumn("comment_id", "text", (col) =>
|
|
21
|
+
col.notNull().references("_emdash_comments.id").onDelete("cascade"),
|
|
22
|
+
)
|
|
23
|
+
.addColumn("reaction", "text", (col) => col.notNull().defaultTo("like"))
|
|
24
|
+
.addColumn("voter_hash", "text", (col) => col.notNull())
|
|
25
|
+
.addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db)))
|
|
26
|
+
.execute();
|
|
27
|
+
|
|
28
|
+
// One reaction of a given type per voter per comment (toggle semantics).
|
|
29
|
+
await db.schema
|
|
30
|
+
.createIndex("idx_comment_reactions_unique")
|
|
31
|
+
.ifNotExists()
|
|
32
|
+
.on("_emdash_comment_reactions")
|
|
33
|
+
.columns(["comment_id", "voter_hash", "reaction"])
|
|
34
|
+
.unique()
|
|
35
|
+
.execute();
|
|
36
|
+
|
|
37
|
+
// Aggregate counts per comment (GROUP BY comment_id, reaction).
|
|
38
|
+
await db.schema
|
|
39
|
+
.createIndex("idx_comment_reactions_comment")
|
|
40
|
+
.ifNotExists()
|
|
41
|
+
.on("_emdash_comment_reactions")
|
|
42
|
+
.column("comment_id")
|
|
43
|
+
.execute();
|
|
44
|
+
|
|
45
|
+
// Per-voter rate limiting (recent reactions by a voter).
|
|
46
|
+
await db.schema
|
|
47
|
+
.createIndex("idx_comment_reactions_voter")
|
|
48
|
+
.ifNotExists()
|
|
49
|
+
.on("_emdash_comment_reactions")
|
|
50
|
+
.columns(["voter_hash", "created_at"])
|
|
51
|
+
.execute();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export async function down(db: Kysely<unknown>): Promise<void> {
|
|
55
|
+
await db.schema.dropTable("_emdash_comment_reactions").execute();
|
|
56
|
+
}
|
|
@@ -45,6 +45,7 @@ import * as m040 from "./040_byline_i18n.js";
|
|
|
45
45
|
import * as m041 from "./041_content_locale_list_index.js";
|
|
46
46
|
import * as m042 from "./042_byline_fields.js";
|
|
47
47
|
import * as m043 from "./043_content_references.js";
|
|
48
|
+
import * as m044 from "./044_comment_reactions.js";
|
|
48
49
|
|
|
49
50
|
const MIGRATIONS: Readonly<Record<string, Migration>> = Object.freeze({
|
|
50
51
|
"001_initial": m001,
|
|
@@ -89,6 +90,7 @@ const MIGRATIONS: Readonly<Record<string, Migration>> = Object.freeze({
|
|
|
89
90
|
"041_content_locale_list_index": m041,
|
|
90
91
|
"042_byline_fields": m042,
|
|
91
92
|
"043_content_references": m043,
|
|
93
|
+
"044_comment_reactions": m044,
|
|
92
94
|
});
|
|
93
95
|
|
|
94
96
|
/** Total number of registered migrations. Exported for use in tests. */
|