emdash 0.13.0 → 0.15.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-9DybjTO6.d.mts → adapters-C4yd_UJR.d.mts} +1 -1
- package/dist/{adapters-9DybjTO6.d.mts.map → adapters-C4yd_UJR.d.mts.map} +1 -1
- package/dist/{allowed-origins-CDdG-4Gd.mjs → allowed-origins-D0fFk9a6.mjs} +2 -2
- package/dist/{allowed-origins-CDdG-4Gd.mjs.map → allowed-origins-D0fFk9a6.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -3
- package/dist/api/route-utils.mjs +15 -15
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +3 -3
- package/dist/{api-ayIQ7rIe.mjs → api-CLwG_3dh.mjs} +523 -59
- package/dist/api-CLwG_3dh.mjs.map +1 -0
- package/dist/{api-tokens-eYymBhIT.mjs → api-tokens-ucpcNXDt.mjs} +2 -2
- package/dist/{api-tokens-eYymBhIT.mjs.map → api-tokens-ucpcNXDt.mjs.map} +1 -1
- package/dist/{apply-v4DBgjPw.mjs → apply-wJhM_bwU.mjs} +17 -17
- package/dist/{apply-v4DBgjPw.mjs.map → apply-wJhM_bwU.mjs.map} +1 -1
- package/dist/astro/index.d.mts +10 -10
- package/dist/astro/index.mjs +21 -5
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +9 -9
- package/dist/astro/middleware/auth.mjs +6 -6
- package/dist/astro/middleware/auth.mjs.map +1 -1
- package/dist/astro/middleware/redirect.mjs +4 -4
- package/dist/astro/middleware/request-context.mjs +2 -2
- package/dist/astro/middleware/request-context.mjs.map +1 -1
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +353 -71
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +5 -5
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +5 -5
- 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/bylines/_id_/index.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +14 -17
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/translations.d.mts +9 -0
- package/dist/astro/routes/api/admin/bylines/_id_/translations.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +70 -0
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -0
- package/dist/astro/routes/api/admin/bylines/index.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/bylines/index.mjs +25 -16
- package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +10 -10
- package/dist/astro/routes/api/admin/comments/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/comments/bulk.mjs +8 -8
- package/dist/astro/routes/api/admin/comments/counts.mjs +5 -5
- package/dist/astro/routes/api/admin/comments/index.mjs +8 -8
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +4 -4
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
- 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 +32 -31
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +32 -31
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +31 -30
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +31 -30
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +33 -31
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +31 -30
- 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 +31 -30
- 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 +33 -31
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +31 -30
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.d.mts +8 -0
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +59 -0
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -0
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.d.mts +8 -0
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +72 -0
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -0
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +31 -30
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +44 -31
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +31 -30
- 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 +31 -30
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +2 -2
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +2 -2
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +5 -5
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +3 -3
- package/dist/astro/routes/api/admin/users/index.mjs +5 -5
- package/dist/astro/routes/api/auth/dev-bypass.mjs +5 -5
- package/dist/astro/routes/api/auth/invite/accept.mjs +2 -2
- package/dist/astro/routes/api/auth/invite/complete.mjs +9 -9
- package/dist/astro/routes/api/auth/invite/index.mjs +6 -6
- package/dist/astro/routes/api/auth/invite/register-options.mjs +8 -8
- package/dist/astro/routes/api/auth/logout.mjs +3 -3
- package/dist/astro/routes/api/auth/magic-link/send.mjs +8 -8
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +3 -3
- package/dist/astro/routes/api/auth/me.mjs +5 -5
- package/dist/astro/routes/api/auth/mode.mjs +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs.map +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +5 -5
- package/dist/astro/routes/api/auth/passkey/index.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/options.mjs +10 -10
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +8 -8
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +9 -9
- package/dist/astro/routes/api/auth/passkey/verify.mjs +9 -9
- package/dist/astro/routes/api/auth/signup/complete.mjs +9 -9
- package/dist/astro/routes/api/auth/signup/request.mjs +8 -8
- package/dist/astro/routes/api/auth/signup/verify.mjs +2 -2
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +11 -11
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +9 -9
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +10 -9
- 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_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/index.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/trash.mjs +6 -6
- package/dist/astro/routes/api/dashboard.mjs +7 -7
- 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 +10 -10
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +3 -3
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +9 -9
- package/dist/astro/routes/api/import/wordpress/execute.mjs +9 -8
- package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/media.mjs +8 -8
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +8 -8
- package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +7 -7
- 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 +10 -10
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +11 -11
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
- package/dist/astro/routes/api/manifest.mjs +4 -4
- package/dist/astro/routes/api/mcp.mjs +29 -29
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +6 -6
- package/dist/astro/routes/api/media/_id_.mjs +6 -6
- 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.mjs +7 -7
- package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
- package/dist/astro/routes/api/media.mjs +8 -8
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +7 -7
- package/dist/astro/routes/api/menus/_name_/items.mjs +7 -7
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +7 -7
- package/dist/astro/routes/api/menus/_name_/translations.mjs +7 -7
- package/dist/astro/routes/api/menus/_name_.mjs +7 -7
- package/dist/astro/routes/api/menus/index.mjs +7 -7
- 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 +3 -3
- package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +4 -4
- package/dist/astro/routes/api/redirects/404s/index.mjs +8 -8
- package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/summary.mjs +8 -8
- package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/_id_.mjs +9 -9
- package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/index.mjs +9 -9
- package/dist/astro/routes/api/redirects/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 +3 -3
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +31 -30
- 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 +31 -30
- 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 +31 -30
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +31 -30
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +31 -30
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +6 -6
- package/dist/astro/routes/api/schema/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +31 -30
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +31 -30
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +9 -9
- package/dist/astro/routes/api/search/index.mjs +8 -8
- package/dist/astro/routes/api/search/rebuild.mjs +9 -9
- package/dist/astro/routes/api/search/stats.mjs +6 -6
- package/dist/astro/routes/api/search/suggest.mjs +8 -8
- package/dist/astro/routes/api/sections/_slug_.mjs +8 -8
- package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/sections/index.mjs +8 -8
- package/dist/astro/routes/api/sections/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/email.mjs +4 -4
- package/dist/astro/routes/api/settings.mjs +10 -10
- package/dist/astro/routes/api/setup/admin-verify.mjs +10 -10
- package/dist/astro/routes/api/setup/admin.mjs +9 -9
- package/dist/astro/routes/api/setup/dev-bypass.mjs +22 -22
- package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
- package/dist/astro/routes/api/setup/index.mjs +22 -22
- package/dist/astro/routes/api/setup/status.mjs +4 -4
- package/dist/astro/routes/api/snapshot.mjs +5 -5
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +11 -10
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +11 -10
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +11 -10
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +11 -10
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +5 -5
- package/dist/astro/routes/api/typegen.mjs +5 -5
- package/dist/astro/routes/api/well-known/auth.mjs +1 -1
- package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
- package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +6 -6
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +8 -8
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +8 -8
- package/dist/astro/routes/api/widget-areas/_name_.mjs +5 -5
- package/dist/astro/routes/api/widget-areas/index.mjs +8 -8
- package/dist/astro/routes/api/widget-components.mjs +3 -3
- package/dist/astro/routes/robots.txt.mjs +5 -5
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +4 -4
- package/dist/astro/routes/sitemap.xml.mjs +5 -5
- package/dist/astro/types.d.mts +13 -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-BlyCH-96.mjs → authorize-Bkwe8kuL.mjs} +2 -2
- package/dist/{authorize-BlyCH-96.mjs.map → authorize-Bkwe8kuL.mjs.map} +1 -1
- package/dist/byline-CTaWkMh5.mjs +404 -0
- package/dist/byline-CTaWkMh5.mjs.map +1 -0
- package/dist/bylines-BYHWU3T7.mjs +174 -0
- package/dist/bylines-BYHWU3T7.mjs.map +1 -0
- package/dist/{bylines-C6eYUWlZ.d.mts → bylines-DtDRNF1n.d.mts} +63 -18
- package/dist/bylines-DtDRNF1n.d.mts.map +1 -0
- package/dist/bylines-H0Xh5TMy.mjs +118 -0
- package/dist/bylines-H0Xh5TMy.mjs.map +1 -0
- package/dist/{cache-CXCpjWiL.mjs → cache-CNk1jIxp.mjs} +2 -2
- package/dist/{cache-CXCpjWiL.mjs.map → cache-CNk1jIxp.mjs.map} +1 -1
- package/dist/{challenge-store-CJ0OOHOr.mjs → challenge-store-Dng1SxKT.mjs} +1 -1
- package/dist/{challenge-store-CJ0OOHOr.mjs.map → challenge-store-Dng1SxKT.mjs.map} +1 -1
- package/dist/{chunks-DyGtu1Bv.mjs → chunks-BkfVdD-3.mjs} +2 -2
- package/dist/{chunks-DyGtu1Bv.mjs.map → chunks-BkfVdD-3.mjs.map} +1 -1
- package/dist/cli/index.mjs +21 -29
- 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 +1 -1
- package/dist/client/index.mjs.map +1 -1
- package/dist/{comment-Dd9MI82-.mjs → comment-_yzlBYPx.mjs} +2 -2
- package/dist/{comment-Dd9MI82-.mjs.map → comment-_yzlBYPx.mjs.map} +1 -1
- package/dist/{comments-koGI0FrK.mjs → comments-DxID-rsd.mjs} +3 -3
- package/dist/{comments-koGI0FrK.mjs.map → comments-DxID-rsd.mjs.map} +1 -1
- package/dist/{components-mZem7pbe.mjs → components-Dx3DM0gg.mjs} +1 -1
- package/dist/{components-mZem7pbe.mjs.map → components-Dx3DM0gg.mjs.map} +1 -1
- package/dist/config-CVssduLe.mjs.map +1 -1
- package/dist/{content-D6YG26WG.mjs → content-C0ooIs-f.mjs} +3 -3
- package/dist/{content-D6YG26WG.mjs.map → content-C0ooIs-f.mjs.map} +1 -1
- package/dist/{context-qF8d3IPR.mjs → context-sAnCaUIR.mjs} +10 -10
- package/dist/context-sAnCaUIR.mjs.map +1 -0
- package/dist/{cron-H8eJ46dv.mjs → cron-Bd3b3iuj.mjs} +1 -1
- package/dist/{cron-H8eJ46dv.mjs.map → cron-Bd3b3iuj.mjs.map} +1 -1
- package/dist/{dashboard-BmWSIUwY.mjs → dashboard-Cqw3ay2X.mjs} +4 -4
- package/dist/{dashboard-BmWSIUwY.mjs.map → dashboard-Cqw3ay2X.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/{default-Dbs22Gg4.mjs → default-BvTAYCzx.mjs} +1 -1
- package/dist/{default-Dbs22Gg4.mjs.map → default-BvTAYCzx.mjs.map} +1 -1
- package/dist/{device-flow-BqJRxa0Q.mjs → device-flow-B9oG8PwP.mjs} +4 -4
- package/dist/{device-flow-BqJRxa0Q.mjs.map → device-flow-B9oG8PwP.mjs.map} +1 -1
- package/dist/{email-console-Dmp5Q-P2.mjs → email-console-CubRll9q.mjs} +1 -1
- package/dist/email-console-CubRll9q.mjs.map +1 -0
- package/dist/{error-tSQWIl5U.mjs → error-CPh_8eLq.mjs} +16 -8
- package/dist/error-CPh_8eLq.mjs.map +1 -0
- package/dist/{escape-B8bdIryO.mjs → escape-Cg6kMELH.mjs} +1 -1
- package/dist/{escape-B8bdIryO.mjs.map → escape-Cg6kMELH.mjs.map} +1 -1
- package/dist/{fts-manager-B633C-kQ.mjs → fts-manager-Mnrtn-r2.mjs} +2 -2
- package/dist/{fts-manager-B633C-kQ.mjs.map → fts-manager-Mnrtn-r2.mjs.map} +1 -1
- package/dist/{import-CNfLOgDE.mjs → import-DG80rC_I.mjs} +3 -3
- package/dist/{import-CNfLOgDE.mjs.map → import-DG80rC_I.mjs.map} +1 -1
- package/dist/{index-UmOMt9T-.d.mts → index-Bv1Wf1zB.d.mts} +235 -18
- package/dist/index-Bv1Wf1zB.d.mts.map +1 -0
- package/dist/{index-D2gvztOP.d.mts → index-CC42STEm.d.mts} +3 -3
- package/dist/{index-D2gvztOP.d.mts.map → index-CC42STEm.d.mts.map} +1 -1
- package/dist/index.d.mts +17 -17
- package/dist/index.mjs +50 -49
- package/dist/{load-QzYRpVN3.mjs → load-DmXNVhst.mjs} +2 -2
- package/dist/{load-QzYRpVN3.mjs.map → load-DmXNVhst.mjs.map} +1 -1
- package/dist/{loader-Cs6-Bqe6.mjs → loader-Chm5h7Gr.mjs} +3 -3
- package/dist/loader-Chm5h7Gr.mjs.map +1 -0
- package/dist/{manifest-schema-HCtSh4Jq.mjs → manifest-schema-Czqf0TLu.mjs} +1 -1
- package/dist/{manifest-schema-HCtSh4Jq.mjs.map → manifest-schema-Czqf0TLu.mjs.map} +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/local-runtime.d.mts +11 -11
- package/dist/media/local-runtime.mjs +4 -4
- package/dist/{media-allowlist-B8EX01DH.mjs → media-allowlist-BNloC69x.mjs} +1 -1
- package/dist/{media-allowlist-B8EX01DH.mjs.map → media-allowlist-BNloC69x.mjs.map} +1 -1
- package/dist/{media-Dg7he9uK.mjs → media-oqRcNiQf.mjs} +2 -2
- package/dist/media-oqRcNiQf.mjs.map +1 -0
- package/dist/{menus-DOzIecHi.mjs → menus-Bjf5R1Qq.mjs} +2 -2
- package/dist/menus-Bjf5R1Qq.mjs.map +1 -0
- package/dist/{menus-X4Z-eBA1.mjs → menus-C75SSmRy.mjs} +30 -11
- package/dist/menus-C75SSmRy.mjs.map +1 -0
- package/dist/mime-KV5TqkMN.mjs.map +1 -1
- package/dist/{mode-DPRPvJYm.mjs → mode-CaaiebZI.mjs} +1 -1
- package/dist/{mode-DPRPvJYm.mjs.map → mode-CaaiebZI.mjs.map} +1 -1
- package/dist/{oauth-authorization-62GmpGIH.mjs → oauth-authorization-CTMeVfvj.mjs} +4 -4
- package/dist/{oauth-authorization-62GmpGIH.mjs.map → oauth-authorization-CTMeVfvj.mjs.map} +1 -1
- package/dist/{oauth-clients-D_B0_-Bz.mjs → oauth-clients-eJCbkVSG.mjs} +1 -1
- package/dist/oauth-clients-eJCbkVSG.mjs.map +1 -0
- package/dist/{oauth-state-store-DpsZViTu.mjs → oauth-state-store-vOSdOeGe.mjs} +1 -1
- package/dist/{oauth-state-store-DpsZViTu.mjs.map → oauth-state-store-vOSdOeGe.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-meyS2oB1.mjs → oauth-user-lookup-3JwsVw6N.mjs} +1 -1
- package/dist/{oauth-user-lookup-meyS2oB1.mjs.map → oauth-user-lookup-3JwsVw6N.mjs.map} +1 -1
- package/dist/options-BL4X94qY.mjs.map +1 -1
- package/dist/{options-Cq64Wx0O.d.mts → options-DhV-gwJb.d.mts} +4 -4
- package/dist/options-DhV-gwJb.d.mts.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/{parse-BFTPon-J.mjs → parse-3-caTKgt.mjs} +2 -2
- package/dist/{parse-BFTPon-J.mjs.map → parse-3-caTKgt.mjs.map} +1 -1
- package/dist/{passkey-config-Cg86_ISa.mjs → passkey-config-BloQOT3y.mjs} +1 -1
- package/dist/{passkey-config-Cg86_ISa.mjs.map → passkey-config-BloQOT3y.mjs.map} +1 -1
- package/dist/{placeholder-D3cFCU9y.d.mts → placeholder-KCkkCtgQ.d.mts} +1 -1
- package/dist/{placeholder-D3cFCU9y.d.mts.map → placeholder-KCkkCtgQ.d.mts.map} +1 -1
- package/dist/plugin-types.d.mts +1 -1
- package/dist/plugins/adapt-sandbox-entry.d.mts +9 -9
- package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
- package/dist/plugins/adapt-sandbox-entry.mjs +26 -15
- package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
- package/dist/{preview-C1LOEbWZ.mjs → preview-D4z0WONU.mjs} +2 -2
- package/dist/{preview-C1LOEbWZ.mjs.map → preview-D4z0WONU.mjs.map} +1 -1
- package/dist/{public-url-CseXl9Fv.mjs → public-url-CUWWFME2.mjs} +1 -1
- package/dist/{public-url-CseXl9Fv.mjs.map → public-url-CUWWFME2.mjs.map} +1 -1
- package/dist/{query-axZmO6Tn.mjs → query-BJn8TOPk.mjs} +16 -13
- package/dist/{query-axZmO6Tn.mjs.map → query-BJn8TOPk.mjs.map} +1 -1
- package/dist/{rate-limit-t5CVjCO6.mjs → rate-limit-D_-gAeJ0.mjs} +2 -2
- package/dist/{rate-limit-t5CVjCO6.mjs.map → rate-limit-D_-gAeJ0.mjs.map} +1 -1
- package/dist/{redirect-DGRsLO2I.mjs → redirect-BINiRYq4.mjs} +1 -1
- package/dist/{redirect-DGRsLO2I.mjs.map → redirect-BINiRYq4.mjs.map} +1 -1
- package/dist/{redirect-DkaDxq8e.mjs → redirect-CNv4mHX2.mjs} +2 -2
- package/dist/{redirect-DkaDxq8e.mjs.map → redirect-CNv4mHX2.mjs.map} +1 -1
- package/dist/{redirects-D1fdd68T.mjs → redirects-B-CUZ1Xh.mjs} +3 -3
- package/dist/{redirects-D1fdd68T.mjs.map → redirects-B-CUZ1Xh.mjs.map} +1 -1
- package/dist/{redirects-Dmj6KRU3.mjs → redirects-COMLwsV5.mjs} +19 -5
- package/dist/redirects-COMLwsV5.mjs.map +1 -0
- package/dist/{registry-BnCeHYsf.mjs → registry-DqrAQDXH.mjs} +4 -4
- package/dist/{registry-BnCeHYsf.mjs.map → registry-DqrAQDXH.mjs.map} +1 -1
- package/dist/request-cache-dzCt8TZB.mjs.map +1 -1
- package/dist/request-context.mjs.map +1 -1
- package/dist/{request-meta-CLCwSQOS.mjs → request-meta-C_Cjii-T.mjs} +2 -2
- package/dist/{request-meta-CLCwSQOS.mjs.map → request-meta-C_Cjii-T.mjs.map} +1 -1
- package/dist/resolve-Cj98DuqN.mjs +39 -0
- package/dist/resolve-Cj98DuqN.mjs.map +1 -0
- package/dist/{runner-DdnQIwz_.mjs → runner-CGlojznK.mjs} +472 -165
- package/dist/runner-CGlojznK.mjs.map +1 -0
- package/dist/{runner-DcfZewkO.d.mts → runner-CNHRo1mT.d.mts} +2 -2
- package/dist/{runner-DcfZewkO.d.mts.map → runner-CNHRo1mT.d.mts.map} +1 -1
- package/dist/runtime.d.mts +10 -10
- package/dist/runtime.mjs +2 -2
- package/dist/{schema-BmqagCwG.mjs → schema-Djdlfi5G.mjs} +4 -4
- package/dist/{schema-BmqagCwG.mjs.map → schema-Djdlfi5G.mjs.map} +1 -1
- package/dist/{search-CPrvO5u8.mjs → search-By-NN3da.mjs} +4 -4
- package/dist/{search-CPrvO5u8.mjs.map → search-By-NN3da.mjs.map} +1 -1
- package/dist/{secrets-6pgZyq0K.mjs → secrets-rPdhEBkD.mjs} +1 -1
- package/dist/{secrets-6pgZyq0K.mjs.map → secrets-rPdhEBkD.mjs.map} +1 -1
- package/dist/{sections-Cm-zb-gZ.mjs → sections-DcBIlOq1.mjs} +3 -3
- package/dist/{sections-Cm-zb-gZ.mjs.map → sections-DcBIlOq1.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +16 -16
- package/dist/seo/index.d.mts +1 -1
- package/dist/{seo-DRq9-EPP.mjs → seo-bjDoq9Eg.mjs} +2 -2
- package/dist/{seo-DRq9-EPP.mjs.map → seo-bjDoq9Eg.mjs.map} +1 -1
- package/dist/{service-vByySp-2.mjs → service-BuuTdGAT.mjs} +3 -3
- package/dist/{service-vByySp-2.mjs.map → service-BuuTdGAT.mjs.map} +1 -1
- package/dist/{settings-CBBj7HUd.mjs → settings-CJnKiWuR.mjs} +3 -3
- package/dist/{settings-CBBj7HUd.mjs.map → settings-CJnKiWuR.mjs.map} +1 -1
- package/dist/{settings-xQKsWnzQ.mjs → settings-hcubRfkr.mjs} +3 -3
- package/dist/settings-hcubRfkr.mjs.map +1 -0
- package/dist/{setup-BGAJ2uXs.mjs → setup-Cf_TyOv5.mjs} +2 -2
- package/dist/{setup-BGAJ2uXs.mjs.map → setup-Cf_TyOv5.mjs.map} +1 -1
- package/dist/{setup-complete-C6ZCLhKo.mjs → setup-complete-MzzN9u0b.mjs} +1 -1
- package/dist/{setup-complete-C6ZCLhKo.mjs.map → setup-complete-MzzN9u0b.mjs.map} +1 -1
- package/dist/{setup-nonce-CY1gQiAU.mjs → setup-nonce-DXuriHsg.mjs} +1 -1
- package/dist/{setup-nonce-CY1gQiAU.mjs.map → setup-nonce-DXuriHsg.mjs.map} +1 -1
- package/dist/{site-url-D-M4Fd8O.mjs → site-url-xkhw1tcz.mjs} +1 -1
- package/dist/{site-url-D-M4Fd8O.mjs.map → site-url-xkhw1tcz.mjs.map} +1 -1
- package/dist/{ssrf-DzFN_qV-.mjs → ssrf-MZ-zrG6-.mjs} +1 -1
- package/dist/{ssrf-DzFN_qV-.mjs.map → ssrf-MZ-zrG6-.mjs.map} +1 -1
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/local.mjs.map +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +1 -1
- package/dist/storage/s3.mjs.map +1 -1
- package/dist/{taxonomies-Dc0mzlms.mjs → taxonomies-CLs9HPE2.mjs} +4 -4
- package/dist/{taxonomies-Dc0mzlms.mjs.map → taxonomies-CLs9HPE2.mjs.map} +1 -1
- package/dist/{taxonomies-Cn9UpaR2.mjs → taxonomies-WamPVA2x.mjs} +7 -42
- package/dist/taxonomies-WamPVA2x.mjs.map +1 -0
- package/dist/{taxonomy-wPfusMK9.mjs → taxonomy-D4Uc2LsZ.mjs} +3 -3
- package/dist/{taxonomy-wPfusMK9.mjs.map → taxonomy-D4Uc2LsZ.mjs.map} +1 -1
- package/dist/{tokens-DILYNZMi.mjs → tokens-N8otWMmj.mjs} +1 -1
- package/dist/{tokens-DILYNZMi.mjs.map → tokens-N8otWMmj.mjs.map} +1 -1
- package/dist/{transport-fw-mKJzT.mjs → transport-B6CHddbu.mjs} +1 -1
- package/dist/{transport-fw-mKJzT.mjs.map → transport-B6CHddbu.mjs.map} +1 -1
- package/dist/{transport-GeXlLscf.d.mts → transport-DOxLfUir.d.mts} +1 -1
- package/dist/{transport-GeXlLscf.d.mts.map → transport-DOxLfUir.d.mts.map} +1 -1
- package/dist/{trusted-proxy-CJhQIk65.mjs → trusted-proxy-97pajC2f.mjs} +1 -1
- package/dist/{trusted-proxy-CJhQIk65.mjs.map → trusted-proxy-97pajC2f.mjs.map} +1 -1
- package/dist/{types-CwXMEPRr.mjs → types-ByV5sgsv.mjs} +2 -2
- package/dist/types-ByV5sgsv.mjs.map +1 -0
- package/dist/{types-Dz9CGX_d.mjs → types-Cd9UCu3t.mjs} +1 -1
- package/dist/{types-Dz9CGX_d.mjs.map → types-Cd9UCu3t.mjs.map} +1 -1
- package/dist/{types-DmxPPXGf.d.mts → types-CkDSF81F.d.mts} +1 -1
- package/dist/{types-DmxPPXGf.d.mts.map → types-CkDSF81F.d.mts.map} +1 -1
- package/dist/{types-BWhaSS7U.d.mts → types-CpUuGcd5.d.mts} +1 -1
- package/dist/{types-BWhaSS7U.d.mts.map → types-CpUuGcd5.d.mts.map} +1 -1
- package/dist/{types-DFowNO60.d.mts → types-D599-ruj.d.mts} +1 -1
- package/dist/{types-DFowNO60.d.mts.map → types-D599-ruj.d.mts.map} +1 -1
- package/dist/{types-B05e2naf.d.mts → types-DGHWRQgr.d.mts} +3 -3
- package/dist/{types-B05e2naf.d.mts.map → types-DGHWRQgr.d.mts.map} +1 -1
- package/dist/{types-CzvJd1ND.d.mts → types-DaYDYW6g.d.mts} +14 -1
- package/dist/types-DaYDYW6g.d.mts.map +1 -0
- package/dist/{types-C1KKK4VP.d.mts → types-DaqNzqVt.d.mts} +16 -1
- package/dist/{types-C1KKK4VP.d.mts.map → types-DaqNzqVt.d.mts.map} +1 -1
- package/dist/{types-DW1l0gCv.d.mts → types-Dgo6y-Ut.d.mts} +1 -1
- package/dist/{types-DW1l0gCv.d.mts.map → types-Dgo6y-Ut.d.mts.map} +1 -1
- package/dist/{types-Cb2UCDJg.d.mts → types-bYmRn_Uy.d.mts} +1 -1
- package/dist/{types-Cb2UCDJg.d.mts.map → types-bYmRn_Uy.d.mts.map} +1 -1
- package/dist/{user-Dr1bOCqS.mjs → user-D3BD5zdT.mjs} +2 -2
- package/dist/{user-Dr1bOCqS.mjs.map → user-D3BD5zdT.mjs.map} +1 -1
- package/dist/{utils-_F-rWBTN.mjs → utils-C3wTAP-P.mjs} +1 -1
- package/dist/{utils-_F-rWBTN.mjs.map → utils-C3wTAP-P.mjs.map} +1 -1
- package/dist/{validate-BpQGsmd7.d.mts → validate-DQtHw9NT.d.mts} +5 -5
- package/dist/{validate-BpQGsmd7.d.mts.map → validate-DQtHw9NT.d.mts.map} +1 -1
- package/dist/{validate-DlFxcVVK.mjs → validate-mz87i8_1.mjs} +2 -2
- package/dist/{validate-DlFxcVVK.mjs.map → validate-mz87i8_1.mjs.map} +1 -1
- package/dist/{validation-BiFJqUp5.mjs → validation-DKHhXjPr.mjs} +5 -5
- package/dist/{validation-BiFJqUp5.mjs.map → validation-DKHhXjPr.mjs.map} +1 -1
- package/dist/version-Ct7C6RSo.mjs +7 -0
- package/dist/{version-Dw7Z5PVU.mjs.map → version-Ct7C6RSo.mjs.map} +1 -1
- package/dist/{widgets-B9j_yzlk.mjs → widgets-lShIQXU5.mjs} +3 -3
- package/dist/widgets-lShIQXU5.mjs.map +1 -0
- package/dist/{zod-generator-DSyz01KE.mjs → zod-generator-dvxgmd1M.mjs} +2 -2
- package/dist/{zod-generator-DSyz01KE.mjs.map → zod-generator-dvxgmd1M.mjs.map} +1 -1
- package/package.json +10 -8
- package/src/api/error.ts +18 -3
- package/src/api/errors.ts +6 -0
- package/src/api/handlers/bylines.ts +161 -0
- package/src/api/handlers/content.ts +125 -43
- package/src/api/handlers/index.ts +6 -0
- package/src/api/handlers/marketplace.ts +27 -5
- package/src/api/handlers/oauth-clients.ts +1 -1
- package/src/api/handlers/registry.ts +568 -22
- package/src/api/openapi/document.ts +1 -1
- package/src/api/schemas/bylines.ts +46 -0
- package/src/astro/integration/index.ts +1 -1
- package/src/astro/integration/routes.ts +5 -0
- package/src/astro/integration/runtime.ts +12 -1
- package/src/astro/integration/virtual-modules.ts +19 -2
- package/src/astro/integration/vite-config.ts +2 -2
- package/src/astro/middleware/auth.ts +7 -7
- package/src/astro/middleware/request-context.ts +1 -1
- package/src/astro/middleware.ts +31 -20
- package/src/astro/routes/api/admin/bylines/[id]/index.ts +3 -12
- package/src/astro/routes/api/admin/bylines/[id]/translations.ts +99 -0
- package/src/astro/routes/api/admin/bylines/index.ts +22 -11
- package/src/astro/routes/api/admin/plugins/[id]/update.ts +1 -0
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/install.ts +6 -1
- package/src/astro/routes/api/admin/plugins/registry/[id]/uninstall.ts +51 -0
- package/src/astro/routes/api/admin/plugins/registry/[id]/update.ts +79 -0
- package/src/astro/routes/api/admin/plugins/updates.ts +43 -6
- package/src/astro/routes/api/admin/themes/marketplace/index.ts +1 -1
- package/src/astro/routes/api/auth/oauth/[provider]/callback.ts +2 -2
- package/src/astro/routes/api/auth/oauth/[provider].ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id]/duplicate.ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id]/publish.ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id]/restore.ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id]/schedule.ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +6 -6
- package/src/astro/routes/api/content/[collection]/[id]/translations.ts +1 -1
- package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id].ts +6 -6
- package/src/astro/routes/api/import/wordpress/execute.ts +1 -1
- package/src/astro/routes/api/import/wordpress/prepare.ts +2 -2
- package/src/astro/routes/api/import/wordpress/rewrite-urls.ts +3 -3
- package/src/astro/routes/api/import/wordpress-plugin/execute.ts +2 -2
- package/src/astro/routes/api/media/upload-url.ts +1 -1
- package/src/astro/routes/api/redirects/404s/index.ts +3 -3
- package/src/astro/routes/api/redirects/404s/summary.ts +1 -1
- package/src/astro/routes/api/redirects/[id].ts +3 -3
- package/src/astro/routes/api/redirects/index.ts +2 -2
- package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +4 -4
- package/src/astro/routes/api/schema/collections/[slug]/fields/index.ts +2 -6
- package/src/astro/routes/api/schema/collections/[slug]/fields/reorder.ts +1 -1
- package/src/astro/routes/api/schema/collections/[slug]/index.ts +6 -6
- package/src/astro/routes/api/schema/collections/index.ts +4 -4
- package/src/astro/routes/api/schema/index.ts +1 -1
- package/src/astro/routes/api/schema/orphans/[slug].ts +1 -1
- package/src/astro/routes/api/schema/orphans/index.ts +1 -1
- package/src/astro/routes/api/sections/[slug].ts +3 -3
- package/src/astro/routes/api/sections/index.ts +2 -2
- package/src/astro/types.ts +4 -0
- package/src/auth/rate-limit.ts +1 -1
- package/src/auth/trusted-proxy.ts +1 -1
- package/src/bylines/index.ts +154 -55
- package/src/cli/commands/init.ts +4 -8
- package/src/client/index.ts +1 -1
- package/src/components/InlinePortableTextEditor.tsx +5 -1
- package/src/components/inline-code-block.tsx +343 -0
- package/src/config/secrets.ts +3 -3
- package/src/database/migrations/006_taxonomy_defs.ts +1 -1
- package/src/database/migrations/014_draft_revisions.ts +6 -6
- package/src/database/migrations/040_byline_i18n.ts +497 -0
- package/src/database/migrations/runner.ts +4 -1
- package/src/database/repositories/audit.ts +2 -2
- package/src/database/repositories/byline.ts +320 -50
- package/src/database/repositories/media.ts +2 -2
- package/src/database/repositories/menu.ts +1 -1
- package/src/database/repositories/options.ts +3 -3
- package/src/database/repositories/plugin-storage.ts +3 -3
- package/src/database/repositories/types.ts +13 -0
- package/src/database/types.ts +15 -0
- package/src/emdash-runtime.ts +492 -20
- package/src/i18n/config.ts +1 -1
- package/src/index.ts +7 -0
- package/src/loader.ts +1 -1
- package/src/mcp/server.ts +3 -3
- package/src/media/mime.ts +1 -1
- package/src/page/absolute-url.ts +1 -1
- package/src/plugins/adapt-sandbox-entry.ts +45 -40
- package/src/plugins/email-console.ts +1 -1
- package/src/plugins/index.ts +1 -0
- package/src/plugins/marketplace.ts +1 -1
- package/src/plugins/sandbox/index.ts +1 -0
- package/src/plugins/sandbox/noop.ts +11 -3
- package/src/plugins/sandbox/types.ts +28 -0
- package/src/query.ts +17 -2
- package/src/registry/config.ts +1 -1
- package/src/request-cache.ts +3 -3
- package/src/request-context.ts +1 -1
- package/src/settings/index.ts +4 -4
- package/src/storage/local.ts +1 -1
- package/src/storage/s3.ts +3 -3
- package/src/widgets/index.ts +1 -1
- package/dist/api-ayIQ7rIe.mjs.map +0 -1
- package/dist/byline-D09BaS4j.mjs +0 -220
- package/dist/byline-D09BaS4j.mjs.map +0 -1
- package/dist/bylines-BTM2xtP8.mjs +0 -113
- package/dist/bylines-BTM2xtP8.mjs.map +0 -1
- package/dist/bylines-C6eYUWlZ.d.mts.map +0 -1
- package/dist/context-qF8d3IPR.mjs.map +0 -1
- package/dist/email-console-Dmp5Q-P2.mjs.map +0 -1
- package/dist/error-tSQWIl5U.mjs.map +0 -1
- package/dist/index-UmOMt9T-.d.mts.map +0 -1
- package/dist/loader-Cs6-Bqe6.mjs.map +0 -1
- package/dist/media-Dg7he9uK.mjs.map +0 -1
- package/dist/menus-DOzIecHi.mjs.map +0 -1
- package/dist/menus-X4Z-eBA1.mjs.map +0 -1
- package/dist/oauth-clients-D_B0_-Bz.mjs.map +0 -1
- package/dist/options-Cq64Wx0O.d.mts.map +0 -1
- package/dist/redirects-Dmj6KRU3.mjs.map +0 -1
- package/dist/runner-DdnQIwz_.mjs.map +0 -1
- package/dist/settings-xQKsWnzQ.mjs.map +0 -1
- package/dist/taxonomies-Cn9UpaR2.mjs.map +0 -1
- package/dist/types-CwXMEPRr.mjs.map +0 -1
- package/dist/types-CzvJd1ND.d.mts.map +0 -1
- package/dist/version-Dw7Z5PVU.mjs +0 -7
- package/dist/widgets-B9j_yzlk.mjs.map +0 -1
- /package/dist/{api-tokens-D3C9v02m.mjs → api-tokens-iPIHAY8N.mjs} +0 -0
- /package/dist/{ssrf-CTul4uQi.mjs → ssrf-BIcd-aXW.mjs} +0 -0
- /package/dist/{types-Db67HHlU.mjs → types-1NNkmTIn.mjs} +0 -0
|
@@ -1,27 +1,28 @@
|
|
|
1
1
|
import { r as validatePluginIdentifier, t as validateIdentifier } from "./validate-VPnKoIzW.mjs";
|
|
2
|
-
import { r as isI18nEnabled } from "./config-CVssduLe.mjs";
|
|
3
|
-
import { r as RevisionRepository, t as ContentRepository } from "./content-
|
|
2
|
+
import { n as getI18nConfig, r as isI18nEnabled } from "./config-CVssduLe.mjs";
|
|
3
|
+
import { r as RevisionRepository, t as ContentRepository } from "./content-C0ooIs-f.mjs";
|
|
4
4
|
import { r as encodeBase64, t as decodeBase64 } from "./base64-CqR-7kqF.mjs";
|
|
5
|
-
import { n as InvalidCursorError, t as EmDashValidationError } from "./types-
|
|
6
|
-
import { t as MediaRepository } from "./media-
|
|
7
|
-
import { t as CommentRepository } from "./comment-
|
|
5
|
+
import { n as InvalidCursorError, t as EmDashValidationError } from "./types-ByV5sgsv.mjs";
|
|
6
|
+
import { t as MediaRepository } from "./media-oqRcNiQf.mjs";
|
|
7
|
+
import { t as CommentRepository } from "./comment-_yzlBYPx.mjs";
|
|
8
8
|
import { t as withTransaction } from "./transaction-NQj4VJ7Z.mjs";
|
|
9
|
-
import { t as RedirectRepository } from "./redirect-
|
|
10
|
-
import { n as chunks, t as SQL_BATCH_SIZE } from "./chunks-
|
|
11
|
-
import { t as BylineRepository } from "./byline-
|
|
12
|
-
import { t as SeoRepository } from "./seo-
|
|
13
|
-
import { r as invalidateRedirectCache } from "./cache-
|
|
9
|
+
import { t as RedirectRepository } from "./redirect-CNv4mHX2.mjs";
|
|
10
|
+
import { n as chunks, t as SQL_BATCH_SIZE } from "./chunks-BkfVdD-3.mjs";
|
|
11
|
+
import { t as BylineRepository } from "./byline-CTaWkMh5.mjs";
|
|
12
|
+
import { t as SeoRepository } from "./seo-bjDoq9Eg.mjs";
|
|
13
|
+
import { r as invalidateRedirectCache } from "./cache-CNk1jIxp.mjs";
|
|
14
14
|
import { t as isMissingTableError } from "./db-errors-CGN9kJfo.mjs";
|
|
15
15
|
import { r as parseAllowedMimeTypes, t as matchesMimeAllowlist } from "./mime-KV5TqkMN.mjs";
|
|
16
16
|
import { n as requestCached } from "./request-cache-dzCt8TZB.mjs";
|
|
17
17
|
import { n as hashString } from "./hash-DlUxGhQS.mjs";
|
|
18
|
-
import { n as SchemaRegistry, t as SchemaError } from "./registry-
|
|
19
|
-
import { i as pluginManifestSchema, r as normalizeManifestRoute } from "./manifest-schema-
|
|
20
|
-
import { r as normalizeCapabilities } from "./types-
|
|
21
|
-
import { t as EmDashStorageError } from "./types-
|
|
22
|
-
import { n as resolveAndValidateExternalUrl, t as SsrfError } from "./ssrf-
|
|
18
|
+
import { n as SchemaRegistry, t as SchemaError } from "./registry-DqrAQDXH.mjs";
|
|
19
|
+
import { i as pluginManifestSchema, r as normalizeManifestRoute } from "./manifest-schema-Czqf0TLu.mjs";
|
|
20
|
+
import { r as normalizeCapabilities } from "./types-1NNkmTIn.mjs";
|
|
21
|
+
import { t as EmDashStorageError } from "./types-Cd9UCu3t.mjs";
|
|
22
|
+
import { n as resolveAndValidateExternalUrl, t as SsrfError } from "./ssrf-MZ-zrG6-.mjs";
|
|
23
23
|
import { sql } from "kysely";
|
|
24
24
|
import { createGzipDecoder, unpackTar } from "modern-tar";
|
|
25
|
+
import { ClientResponseError, ClientValidationError } from "@atcute/client";
|
|
25
26
|
|
|
26
27
|
//#region src/api/rev.ts
|
|
27
28
|
/**
|
|
@@ -195,7 +196,8 @@ async function hydrateSeoMany(db, collection, items, hasSeo) {
|
|
|
195
196
|
}
|
|
196
197
|
async function hydrateBylines(db, collection, item) {
|
|
197
198
|
const bylineRepo = new BylineRepository(db);
|
|
198
|
-
const
|
|
199
|
+
const localeOpt = item.locale ? { locale: item.locale } : void 0;
|
|
200
|
+
const bylines = await bylineRepo.getContentBylines(collection, item.id, localeOpt);
|
|
199
201
|
if (bylines.length > 0) {
|
|
200
202
|
item.bylines = bylines.map((c) => ({
|
|
201
203
|
...c,
|
|
@@ -204,9 +206,13 @@ async function hydrateBylines(db, collection, item) {
|
|
|
204
206
|
item.byline = bylines[0]?.byline ?? null;
|
|
205
207
|
return;
|
|
206
208
|
}
|
|
207
|
-
if (item.primaryBylineId)
|
|
209
|
+
if (item.primaryBylineId) {
|
|
210
|
+
item.bylines = [];
|
|
211
|
+
item.byline = null;
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
208
214
|
if (item.authorId) {
|
|
209
|
-
const fallback = await bylineRepo.findByUserId(item.authorId);
|
|
215
|
+
const fallback = await bylineRepo.findByUserId(item.authorId, localeOpt);
|
|
210
216
|
if (fallback) {
|
|
211
217
|
item.bylines = [{
|
|
212
218
|
byline: fallback,
|
|
@@ -223,18 +229,59 @@ async function hydrateBylines(db, collection, item) {
|
|
|
223
229
|
}
|
|
224
230
|
/**
|
|
225
231
|
* Batch-hydrate bylines for multiple items using two bulk queries instead of N+1.
|
|
232
|
+
*
|
|
233
|
+
* Items may live at different locales (e.g. a list endpoint returning the
|
|
234
|
+
* translations of an entry). Group by `item.locale` and call the strict
|
|
235
|
+
* per-locale repo method once per group so each item resolves against its
|
|
236
|
+
* own locale's byline rows.
|
|
226
237
|
*/
|
|
227
238
|
async function hydrateBylinesMany(db, collection, items) {
|
|
228
239
|
if (items.length === 0) return;
|
|
229
240
|
const bylineRepo = new BylineRepository(db);
|
|
230
|
-
const
|
|
231
|
-
const bylinesMap = await bylineRepo.getContentBylinesMany(collection, contentIds);
|
|
232
|
-
const fallbackAuthorIds = [];
|
|
233
|
-
for (const item of items) if (!bylinesMap.has(item.id) && item.authorId) fallbackAuthorIds.push(item.authorId);
|
|
234
|
-
const uniqueAuthorIds = [...new Set(fallbackAuthorIds)];
|
|
235
|
-
const authorBylineMap = await bylineRepo.findByUserIds(uniqueAuthorIds);
|
|
241
|
+
const localeBuckets = /* @__PURE__ */ new Map();
|
|
236
242
|
for (const item of items) {
|
|
237
|
-
const
|
|
243
|
+
const key = item.locale ?? null;
|
|
244
|
+
const bucket = localeBuckets.get(key);
|
|
245
|
+
if (bucket) bucket.push(item);
|
|
246
|
+
else localeBuckets.set(key, [item]);
|
|
247
|
+
}
|
|
248
|
+
const bylinesByItem = /* @__PURE__ */ new Map();
|
|
249
|
+
const itemsNeedingAuthorCheck = [];
|
|
250
|
+
for (const [locale, bucket] of localeBuckets) {
|
|
251
|
+
const localeOpt = locale ? { locale } : void 0;
|
|
252
|
+
const ids = bucket.map((i) => i.id);
|
|
253
|
+
const credits = await bylineRepo.getContentBylinesMany(collection, ids, localeOpt);
|
|
254
|
+
for (const [id, list] of credits) bylinesByItem.set(id, list);
|
|
255
|
+
for (const item of bucket) {
|
|
256
|
+
if (credits.has(item.id) && credits.get(item.id).length > 0) continue;
|
|
257
|
+
if (item.authorId) itemsNeedingAuthorCheck.push(item);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
const fallbackByItem = /* @__PURE__ */ new Map();
|
|
261
|
+
if (itemsNeedingAuthorCheck.length > 0) {
|
|
262
|
+
const authorBuckets = /* @__PURE__ */ new Map();
|
|
263
|
+
for (const item of itemsNeedingAuthorCheck) {
|
|
264
|
+
if (item.primaryBylineId) continue;
|
|
265
|
+
const key = item.locale ?? null;
|
|
266
|
+
const bucket = authorBuckets.get(key);
|
|
267
|
+
if (bucket) bucket.push(item);
|
|
268
|
+
else authorBuckets.set(key, [item]);
|
|
269
|
+
}
|
|
270
|
+
for (const [locale, bucket] of authorBuckets) {
|
|
271
|
+
const localeOpt = locale ? { locale } : void 0;
|
|
272
|
+
const authorIds = bucket.map((i) => i.authorId).filter((id) => id !== null);
|
|
273
|
+
const uniqueAuthorIds = [...new Set(authorIds)];
|
|
274
|
+
if (uniqueAuthorIds.length === 0) continue;
|
|
275
|
+
const authorMap = await bylineRepo.findByUserIds(uniqueAuthorIds, localeOpt);
|
|
276
|
+
for (const item of bucket) {
|
|
277
|
+
if (!item.authorId) continue;
|
|
278
|
+
const f = authorMap.get(item.authorId);
|
|
279
|
+
if (f) fallbackByItem.set(item.id, f);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
for (const item of items) {
|
|
284
|
+
const explicit = bylinesByItem.get(item.id);
|
|
238
285
|
if (explicit && explicit.length > 0) {
|
|
239
286
|
item.bylines = explicit.map((c) => ({
|
|
240
287
|
...c,
|
|
@@ -243,19 +290,16 @@ async function hydrateBylinesMany(db, collection, items) {
|
|
|
243
290
|
item.byline = explicit[0]?.byline ?? null;
|
|
244
291
|
continue;
|
|
245
292
|
}
|
|
246
|
-
|
|
247
|
-
if (
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
item.byline = fallback;
|
|
257
|
-
continue;
|
|
258
|
-
}
|
|
293
|
+
const fallback = fallbackByItem.get(item.id);
|
|
294
|
+
if (fallback) {
|
|
295
|
+
item.bylines = [{
|
|
296
|
+
byline: fallback,
|
|
297
|
+
sortOrder: 0,
|
|
298
|
+
roleLabel: null,
|
|
299
|
+
source: "inferred"
|
|
300
|
+
}];
|
|
301
|
+
item.byline = fallback;
|
|
302
|
+
continue;
|
|
259
303
|
}
|
|
260
304
|
item.bylines = [];
|
|
261
305
|
item.byline = null;
|
|
@@ -426,10 +470,11 @@ async function handleContentCreate(db, collection, body) {
|
|
|
426
470
|
const item = await withTransaction(db, async (trx) => {
|
|
427
471
|
const repo = new ContentRepository(trx);
|
|
428
472
|
const bylineRepo = new BylineRepository(trx);
|
|
473
|
+
const effectiveLocale = body.locale ?? getI18nConfig()?.defaultLocale;
|
|
429
474
|
let slug = body.slug;
|
|
430
475
|
if (!slug) {
|
|
431
476
|
const slugSource = getSlugSource(body.data);
|
|
432
|
-
if (slugSource) slug = await repo.generateUniqueSlug(collection, slugSource,
|
|
477
|
+
if (slugSource) slug = await repo.generateUniqueSlug(collection, slugSource, effectiveLocale);
|
|
433
478
|
}
|
|
434
479
|
const created = await repo.create({
|
|
435
480
|
type: collection,
|
|
@@ -437,20 +482,22 @@ async function handleContentCreate(db, collection, body) {
|
|
|
437
482
|
data: body.data,
|
|
438
483
|
status: body.status || "draft",
|
|
439
484
|
authorId: body.authorId,
|
|
440
|
-
locale:
|
|
485
|
+
locale: effectiveLocale,
|
|
441
486
|
translationOf: body.translationOf,
|
|
442
487
|
createdAt: body.createdAt,
|
|
443
488
|
publishedAt: body.publishedAt
|
|
444
489
|
});
|
|
445
|
-
if (body.bylines !== void 0)
|
|
446
|
-
await bylineRepo.setContentBylines(collection, created.id, body.bylines);
|
|
447
|
-
created.primaryBylineId = body.bylines[0]?.bylineId ?? null;
|
|
448
|
-
}
|
|
449
|
-
await hydrateBylines(trx, collection, created);
|
|
490
|
+
if (body.bylines !== void 0) created.primaryBylineId = (await bylineRepo.setContentBylines(collection, created.id, body.bylines))[0]?.byline.translationGroup ?? null;
|
|
450
491
|
if (body.translationOf) {
|
|
451
|
-
const { TaxonomyRepository } = await import("./taxonomy-
|
|
492
|
+
const { TaxonomyRepository } = await import("./taxonomy-D4Uc2LsZ.mjs").then((n) => n.n);
|
|
452
493
|
await new TaxonomyRepository(trx).copyEntryTerms(collection, body.translationOf, created.id);
|
|
494
|
+
if (body.bylines === void 0) {
|
|
495
|
+
await bylineRepo.copyContentBylines(collection, body.translationOf, created.id);
|
|
496
|
+
const source = await repo.findById(collection, body.translationOf);
|
|
497
|
+
if (source) created.primaryBylineId = source.primaryBylineId;
|
|
498
|
+
}
|
|
453
499
|
}
|
|
500
|
+
await hydrateBylines(trx, collection, created);
|
|
454
501
|
if (body.seo && hasSeo) created.seo = await new SeoRepository(trx).upsert(collection, created.id, body.seo);
|
|
455
502
|
else if (hasSeo) created.seo = { ...SEO_DEFAULTS };
|
|
456
503
|
return created;
|
|
@@ -544,10 +591,7 @@ async function handleContentUpdate(db, collection, id, body) {
|
|
|
544
591
|
authorId: body.authorId,
|
|
545
592
|
publishedAt: body.publishedAt
|
|
546
593
|
});
|
|
547
|
-
if (body.bylines !== void 0)
|
|
548
|
-
await bylineRepo.setContentBylines(collection, resolvedId, body.bylines);
|
|
549
|
-
updated.primaryBylineId = body.bylines[0]?.bylineId ?? null;
|
|
550
|
-
}
|
|
594
|
+
if (body.bylines !== void 0) updated.primaryBylineId = (await bylineRepo.setContentBylines(collection, resolvedId, body.bylines))[0]?.byline.translationGroup ?? null;
|
|
551
595
|
if (oldSlug && body.slug) {
|
|
552
596
|
const collectionRow = await trx.selectFrom("_emdash_collections").select("url_pattern").where("slug", "=", collection).executeTakeFirst();
|
|
553
597
|
await new RedirectRepository(trx).createAutoRedirect(collection, oldSlug, body.slug, resolvedId, collectionRow?.url_pattern ?? null);
|
|
@@ -2583,7 +2627,7 @@ async function handleMarketplaceInstall(db, storage, sandboxRunner, marketplaceU
|
|
|
2583
2627
|
message: "Storage is required for marketplace plugin installation"
|
|
2584
2628
|
}
|
|
2585
2629
|
};
|
|
2586
|
-
if (!sandboxRunner || !sandboxRunner.isAvailable()) return {
|
|
2630
|
+
if (!opts?.sandboxBypassed && (!sandboxRunner || !sandboxRunner.isAvailable())) return {
|
|
2587
2631
|
success: false,
|
|
2588
2632
|
error: {
|
|
2589
2633
|
code: "SANDBOX_NOT_AVAILABLE",
|
|
@@ -2715,7 +2759,7 @@ async function handleMarketplaceUpdate(db, storage, sandboxRunner, marketplaceUr
|
|
|
2715
2759
|
message: "Storage is required"
|
|
2716
2760
|
}
|
|
2717
2761
|
};
|
|
2718
|
-
if (!sandboxRunner || !sandboxRunner.isAvailable()) return {
|
|
2762
|
+
if (!opts?.sandboxBypassed && (!sandboxRunner || !sandboxRunner.isAvailable())) return {
|
|
2719
2763
|
success: false,
|
|
2720
2764
|
error: {
|
|
2721
2765
|
code: "SANDBOX_NOT_AVAILABLE",
|
|
@@ -3336,6 +3380,45 @@ async function makeRegistryPluginId(publisherDid, slug) {
|
|
|
3336
3380
|
|
|
3337
3381
|
//#endregion
|
|
3338
3382
|
//#region src/api/handlers/registry.ts
|
|
3383
|
+
/**
|
|
3384
|
+
* Registry plugin install handler.
|
|
3385
|
+
*
|
|
3386
|
+
* Installs a plugin published to the experimental decentralized plugin
|
|
3387
|
+
* registry described in RFC 0001. The install flow:
|
|
3388
|
+
*
|
|
3389
|
+
* 1. Resolve `(handle, slug)` to a publisher DID via the configured
|
|
3390
|
+
* aggregator's `resolvePackage` XRPC.
|
|
3391
|
+
* 2. Look up the requested release (or the policy-filtered latest one)
|
|
3392
|
+
* via `getLatestRelease` / `listReleases`.
|
|
3393
|
+
* 3. Reject the install if the aggregator surfaces a `security:yanked`
|
|
3394
|
+
* hard-enforcement label or the release is below the configured
|
|
3395
|
+
* minimum release age.
|
|
3396
|
+
* 4. Fetch the bundle artifact, walking aggregator mirrors first and
|
|
3397
|
+
* falling back to the publisher-declared URL.
|
|
3398
|
+
* 5. Verify the artifact's multibase checksum against the signed
|
|
3399
|
+
* release record's `artifacts.package.checksum`.
|
|
3400
|
+
* 6. Extract `manifest.json` + `backend.js` + optional `admin.js` from
|
|
3401
|
+
* the gzipped tar bundle.
|
|
3402
|
+
* 7. Store the extracted files in site-local R2 under the
|
|
3403
|
+
* `registry/<plugin-id>/<version>/` prefix.
|
|
3404
|
+
* 8. Write a `plugin_states` row with `source = "registry"` and the
|
|
3405
|
+
* `(publisher_did, slug)` pair so updates can be resolved later.
|
|
3406
|
+
* 9. Sync the runtime so the plugin becomes active immediately.
|
|
3407
|
+
*
|
|
3408
|
+
* Known gaps (tracked separately):
|
|
3409
|
+
*
|
|
3410
|
+
* - The aggregator-supplied records are not yet cryptographically
|
|
3411
|
+
* verified against the publisher's MST signature. The signed bytes
|
|
3412
|
+
* and CIDs are passed through verbatim per the lexicon, but full
|
|
3413
|
+
* PDS-direct verification with proof traversal is follow-up work.
|
|
3414
|
+
* The artifact checksum is verified end-to-end against the value
|
|
3415
|
+
* in the (aggregator-relayed) release record, which is the actual
|
|
3416
|
+
* trust boundary for the bytes that end up in the sandbox.
|
|
3417
|
+
* - `acceptLabelers` is forwarded as-is to the aggregator; this
|
|
3418
|
+
* handler does not independently re-fetch and verify labels from
|
|
3419
|
+
* each labeller's DID. Aggregator label envelope tampering is
|
|
3420
|
+
* mitigated by the artifact checksum but not detected.
|
|
3421
|
+
*/
|
|
3339
3422
|
/** Matches a bare 64-character lowercase/uppercase hex SHA-256 digest. */
|
|
3340
3423
|
const SHA256_HEX_PATTERN = /^[a-f0-9]{64}$/i;
|
|
3341
3424
|
/** Compute the SHA-256 of `bytes` as a lowercase hex string. */
|
|
@@ -3530,7 +3613,7 @@ async function assertSafeArtifactUrl(urlString) {
|
|
|
3530
3613
|
try {
|
|
3531
3614
|
return await resolveAndValidateExternalUrl(url.href);
|
|
3532
3615
|
} catch (err) {
|
|
3533
|
-
if (err instanceof SsrfError) throw new Error(`Artifact URL rejected: ${err.message}
|
|
3616
|
+
if (err instanceof SsrfError) throw new Error(`Artifact URL rejected: ${err.message}`, { cause: err });
|
|
3534
3617
|
throw err;
|
|
3535
3618
|
}
|
|
3536
3619
|
}
|
|
@@ -3817,8 +3900,8 @@ async function handleRegistryInstall(db, storage, sandboxRunner, registryConfigI
|
|
|
3817
3900
|
};
|
|
3818
3901
|
}
|
|
3819
3902
|
const release = releaseView.release;
|
|
3820
|
-
const declaredUrl = release
|
|
3821
|
-
const declaredChecksum = release
|
|
3903
|
+
const declaredUrl = release?.artifacts?.package?.url;
|
|
3904
|
+
const declaredChecksum = release?.artifacts?.package?.checksum;
|
|
3822
3905
|
if (!declaredUrl || !declaredChecksum) return {
|
|
3823
3906
|
success: false,
|
|
3824
3907
|
error: {
|
|
@@ -3887,8 +3970,8 @@ async function handleRegistryInstall(db, storage, sandboxRunner, registryConfigI
|
|
|
3887
3970
|
try {
|
|
3888
3971
|
await stateRepo.upsert(pluginId, version, "active", {
|
|
3889
3972
|
source: "registry",
|
|
3890
|
-
displayName: profile
|
|
3891
|
-
description: profile
|
|
3973
|
+
displayName: profile?.name ?? slug,
|
|
3974
|
+
description: profile?.description ?? void 0,
|
|
3892
3975
|
registryPublisherDid: publisherDid,
|
|
3893
3976
|
registrySlug: slug
|
|
3894
3977
|
});
|
|
@@ -3918,6 +4001,20 @@ async function handleRegistryInstall(db, storage, sandboxRunner, registryConfigI
|
|
|
3918
4001
|
}
|
|
3919
4002
|
};
|
|
3920
4003
|
} catch (err) {
|
|
4004
|
+
if (err instanceof ClientValidationError) return {
|
|
4005
|
+
success: false,
|
|
4006
|
+
error: {
|
|
4007
|
+
code: "AGGREGATOR_RESPONSE_INVALID",
|
|
4008
|
+
message: `Aggregator returned a response that does not conform to its lexicon (${err.target})`
|
|
4009
|
+
}
|
|
4010
|
+
};
|
|
4011
|
+
if (err instanceof ClientResponseError) return {
|
|
4012
|
+
success: false,
|
|
4013
|
+
error: {
|
|
4014
|
+
code: err.status === 404 ? "AGGREGATOR_NOT_FOUND" : "AGGREGATOR_HTTP_ERROR",
|
|
4015
|
+
message: `Aggregator returned ${err.status}: ${err.error}`
|
|
4016
|
+
}
|
|
4017
|
+
};
|
|
3921
4018
|
if (err instanceof EmDashStorageError) return {
|
|
3922
4019
|
success: false,
|
|
3923
4020
|
error: {
|
|
@@ -3935,7 +4032,374 @@ async function handleRegistryInstall(db, storage, sandboxRunner, registryConfigI
|
|
|
3935
4032
|
};
|
|
3936
4033
|
}
|
|
3937
4034
|
}
|
|
4035
|
+
/**
|
|
4036
|
+
* Uninstall a registry-source plugin. Deletes the R2 bundle under
|
|
4037
|
+
* `registry/<pluginId>/<version>/`, optionally drops the plugin's
|
|
4038
|
+
* `_plugin_storage` rows, and removes the `_plugin_state` row. The
|
|
4039
|
+
* sandbox runtime is reconciled by the route's `syncRegistryPlugins`
|
|
4040
|
+
* call after this returns.
|
|
4041
|
+
*
|
|
4042
|
+
* Refuses to uninstall plugins whose `source` is not `"registry"` to
|
|
4043
|
+
* avoid trashing a marketplace/config plugin that happens to share the
|
|
4044
|
+
* pluginId namespace.
|
|
4045
|
+
*/
|
|
4046
|
+
async function handleRegistryUninstall(db, storage, pluginId, opts) {
|
|
4047
|
+
try {
|
|
4048
|
+
const stateRepo = new PluginStateRepository(db);
|
|
4049
|
+
const existing = await stateRepo.get(pluginId);
|
|
4050
|
+
if (!existing || existing.source !== "registry") return {
|
|
4051
|
+
success: false,
|
|
4052
|
+
error: {
|
|
4053
|
+
code: "NOT_FOUND",
|
|
4054
|
+
message: `No registry plugin found: ${pluginId}`
|
|
4055
|
+
}
|
|
4056
|
+
};
|
|
4057
|
+
const version = existing.version;
|
|
4058
|
+
let dataDeleted = false;
|
|
4059
|
+
if (opts?.deleteData) {
|
|
4060
|
+
await db.deleteFrom("_plugin_storage").where("plugin_id", "=", pluginId).execute();
|
|
4061
|
+
dataDeleted = true;
|
|
4062
|
+
}
|
|
4063
|
+
if (storage) await deleteBundleFromR2(storage, pluginId, version, "registry");
|
|
4064
|
+
await stateRepo.delete(pluginId);
|
|
4065
|
+
return {
|
|
4066
|
+
success: true,
|
|
4067
|
+
data: {
|
|
4068
|
+
pluginId,
|
|
4069
|
+
dataDeleted
|
|
4070
|
+
}
|
|
4071
|
+
};
|
|
4072
|
+
} catch (err) {
|
|
4073
|
+
console.error("[registry-uninstall] Failed:", err);
|
|
4074
|
+
return {
|
|
4075
|
+
success: false,
|
|
4076
|
+
error: {
|
|
4077
|
+
code: "UNINSTALL_FAILED",
|
|
4078
|
+
message: "Failed to uninstall plugin"
|
|
4079
|
+
}
|
|
4080
|
+
};
|
|
4081
|
+
}
|
|
4082
|
+
}
|
|
4083
|
+
/**
|
|
4084
|
+
* Update a registry-source plugin to a newer release. Mirrors
|
|
4085
|
+
* `handleMarketplaceUpdate`: resolves the target version via the aggregator,
|
|
4086
|
+
* re-runs the artifact fetch / checksum / extract pipeline, diffs capabilities
|
|
4087
|
+
* and route visibility against the currently installed bundle, and gates
|
|
4088
|
+
* escalations behind `confirmCapabilityChanges` / `confirmRouteVisibilityChanges`
|
|
4089
|
+
* so the admin re-consents to widened permissions.
|
|
4090
|
+
*
|
|
4091
|
+
* Refuses non-registry sources. Refuses when the stored state row is missing
|
|
4092
|
+
* the `(publisherDid, slug)` it needs to resolve against the aggregator.
|
|
4093
|
+
*/
|
|
4094
|
+
async function handleRegistryUpdate(db, storage, sandboxRunner, registryConfigInput, pluginId, opts) {
|
|
4095
|
+
const registryConfig = coerceRegistryConfig(registryConfigInput);
|
|
4096
|
+
if (!registryConfig) return {
|
|
4097
|
+
success: false,
|
|
4098
|
+
error: {
|
|
4099
|
+
code: "REGISTRY_NOT_CONFIGURED",
|
|
4100
|
+
message: "Registry is not configured"
|
|
4101
|
+
}
|
|
4102
|
+
};
|
|
4103
|
+
if (!storage) return {
|
|
4104
|
+
success: false,
|
|
4105
|
+
error: {
|
|
4106
|
+
code: "STORAGE_NOT_CONFIGURED",
|
|
4107
|
+
message: "Storage is required for registry plugin updates"
|
|
4108
|
+
}
|
|
4109
|
+
};
|
|
4110
|
+
if (!sandboxRunner || !sandboxRunner.isAvailable()) return {
|
|
4111
|
+
success: false,
|
|
4112
|
+
error: {
|
|
4113
|
+
code: "SANDBOX_NOT_AVAILABLE",
|
|
4114
|
+
message: "Sandbox runner is required"
|
|
4115
|
+
}
|
|
4116
|
+
};
|
|
4117
|
+
try {
|
|
4118
|
+
validateAggregatorUrl(registryConfig.aggregatorUrl);
|
|
4119
|
+
} catch (err) {
|
|
4120
|
+
return {
|
|
4121
|
+
success: false,
|
|
4122
|
+
error: {
|
|
4123
|
+
code: "REGISTRY_NOT_CONFIGURED",
|
|
4124
|
+
message: err instanceof Error ? err.message : "Invalid aggregator URL"
|
|
4125
|
+
}
|
|
4126
|
+
};
|
|
4127
|
+
}
|
|
4128
|
+
try {
|
|
4129
|
+
const stateRepo = new PluginStateRepository(db);
|
|
4130
|
+
const existing = await stateRepo.get(pluginId);
|
|
4131
|
+
if (!existing || existing.source !== "registry") return {
|
|
4132
|
+
success: false,
|
|
4133
|
+
error: {
|
|
4134
|
+
code: "NOT_FOUND",
|
|
4135
|
+
message: `No registry plugin found: ${pluginId}`
|
|
4136
|
+
}
|
|
4137
|
+
};
|
|
4138
|
+
if (!existing.registryPublisherDid || !existing.registrySlug) return {
|
|
4139
|
+
success: false,
|
|
4140
|
+
error: {
|
|
4141
|
+
code: "INVALID_STATE",
|
|
4142
|
+
message: `Registry plugin ${pluginId} is missing publisher DID or slug in state`
|
|
4143
|
+
}
|
|
4144
|
+
};
|
|
4145
|
+
const oldVersion = existing.version;
|
|
4146
|
+
const publisherDid = existing.registryPublisherDid;
|
|
4147
|
+
const slug = existing.registrySlug;
|
|
4148
|
+
const { DiscoveryClient } = await import("@emdash-cms/registry-client/discovery");
|
|
4149
|
+
const aggregatorDeadline = Date.now() + AGGREGATOR_TOTAL_BUDGET_MS;
|
|
4150
|
+
const discovery = new DiscoveryClient({
|
|
4151
|
+
aggregatorUrl: registryConfig.aggregatorUrl,
|
|
4152
|
+
acceptLabelers: registryConfig.acceptLabelers,
|
|
4153
|
+
fetch: timedFetch(aggregatorDeadline)
|
|
4154
|
+
});
|
|
4155
|
+
const MAX_LIST_PAGES = 20;
|
|
4156
|
+
const releaseView = await (async () => {
|
|
4157
|
+
if (!opts?.version) return discovery.getLatestRelease({
|
|
4158
|
+
did: publisherDid,
|
|
4159
|
+
package: slug
|
|
4160
|
+
});
|
|
4161
|
+
let cursor;
|
|
4162
|
+
const seenCursors = /* @__PURE__ */ new Set();
|
|
4163
|
+
for (let page = 0; page < MAX_LIST_PAGES; page++) {
|
|
4164
|
+
if (cursor !== void 0) {
|
|
4165
|
+
if (seenCursors.has(cursor)) break;
|
|
4166
|
+
seenCursors.add(cursor);
|
|
4167
|
+
}
|
|
4168
|
+
const result = await discovery.listReleases({
|
|
4169
|
+
did: publisherDid,
|
|
4170
|
+
package: slug,
|
|
4171
|
+
cursor,
|
|
4172
|
+
limit: 50
|
|
4173
|
+
});
|
|
4174
|
+
for (const r of result.releases) if (r.version === opts.version) return r;
|
|
4175
|
+
if (!result.cursor) break;
|
|
4176
|
+
cursor = result.cursor;
|
|
4177
|
+
}
|
|
4178
|
+
})();
|
|
4179
|
+
if (!releaseView) return {
|
|
4180
|
+
success: false,
|
|
4181
|
+
error: {
|
|
4182
|
+
code: "NO_VERSION",
|
|
4183
|
+
message: opts?.version ? `Version ${opts.version} not found for ${publisherDid}/${slug}` : `No installable release found for ${publisherDid}/${slug}`
|
|
4184
|
+
}
|
|
4185
|
+
};
|
|
4186
|
+
const signedRelease = releaseView.release;
|
|
4187
|
+
if (releaseView.did !== publisherDid || releaseView.package !== slug || signedRelease?.package !== slug || opts?.version !== void 0 && releaseView.version !== opts.version || signedRelease?.version !== releaseView.version) return {
|
|
4188
|
+
success: false,
|
|
4189
|
+
error: {
|
|
4190
|
+
code: "AGGREGATOR_IDENTITY_MISMATCH",
|
|
4191
|
+
message: "Aggregator returned a release view that does not match the requested package or version."
|
|
4192
|
+
}
|
|
4193
|
+
};
|
|
4194
|
+
const newVersion = releaseView.version;
|
|
4195
|
+
if (newVersion === oldVersion) return {
|
|
4196
|
+
success: false,
|
|
4197
|
+
error: {
|
|
4198
|
+
code: "ALREADY_UP_TO_DATE",
|
|
4199
|
+
message: "Plugin is already at the requested version"
|
|
4200
|
+
}
|
|
4201
|
+
};
|
|
4202
|
+
if ((releaseView.labels ?? []).some((l) => l.val === "security:yanked")) return {
|
|
4203
|
+
success: false,
|
|
4204
|
+
error: {
|
|
4205
|
+
code: "YANKED",
|
|
4206
|
+
message: "Release has been yanked by a trusted labeller"
|
|
4207
|
+
}
|
|
4208
|
+
};
|
|
4209
|
+
const declaredUrl = signedRelease.artifacts?.package?.url;
|
|
4210
|
+
const declaredChecksum = signedRelease.artifacts?.package?.checksum;
|
|
4211
|
+
if (!declaredUrl || !declaredChecksum) return {
|
|
4212
|
+
success: false,
|
|
4213
|
+
error: {
|
|
4214
|
+
code: "INVALID_RELEASE",
|
|
4215
|
+
message: "Release record is missing artifact url or checksum"
|
|
4216
|
+
}
|
|
4217
|
+
};
|
|
4218
|
+
await assertSafeArtifactUrl(declaredUrl);
|
|
4219
|
+
const mirrors = (releaseView.mirrors ?? []).slice(0, MAX_MIRRORS);
|
|
4220
|
+
for (const mirror of mirrors) await assertSafeArtifactUrl(mirror);
|
|
4221
|
+
const artifactBytes = await fetchArtifact(mirrors, declaredUrl);
|
|
4222
|
+
if (!await verifyChecksum(artifactBytes, declaredChecksum)) return {
|
|
4223
|
+
success: false,
|
|
4224
|
+
error: {
|
|
4225
|
+
code: "CHECKSUM_MISMATCH",
|
|
4226
|
+
message: "Artifact bytes do not match the release's published checksum"
|
|
4227
|
+
}
|
|
4228
|
+
};
|
|
4229
|
+
const bundle = await extractBundle(artifactBytes);
|
|
4230
|
+
if (bundle.manifest.version !== newVersion) return {
|
|
4231
|
+
success: false,
|
|
4232
|
+
error: {
|
|
4233
|
+
code: "BUNDLE_VERSION_MISMATCH",
|
|
4234
|
+
message: `Bundle manifest version (${bundle.manifest.version}) does not match release version (${newVersion})`
|
|
4235
|
+
}
|
|
4236
|
+
};
|
|
4237
|
+
if (bundle.manifest.id !== slug) return {
|
|
4238
|
+
success: false,
|
|
4239
|
+
error: {
|
|
4240
|
+
code: "BUNDLE_IDENTITY_MISMATCH",
|
|
4241
|
+
message: `Bundle manifest id (${bundle.manifest.id}) does not match registry slug (${slug})`
|
|
4242
|
+
}
|
|
4243
|
+
};
|
|
4244
|
+
bundle.manifest = {
|
|
4245
|
+
...bundle.manifest,
|
|
4246
|
+
id: pluginId
|
|
4247
|
+
};
|
|
4248
|
+
const oldBundle = await loadBundleFromR2(storage, pluginId, oldVersion, "registry");
|
|
4249
|
+
const capabilityChanges = diffCapabilities(oldBundle?.manifest.capabilities ?? [], bundle.manifest.capabilities);
|
|
4250
|
+
if (capabilityChanges.added.length > 0 && !opts?.confirmCapabilityChanges) return {
|
|
4251
|
+
success: false,
|
|
4252
|
+
error: {
|
|
4253
|
+
code: "CAPABILITY_ESCALATION",
|
|
4254
|
+
message: "Plugin update requires new capabilities",
|
|
4255
|
+
details: { capabilityChanges }
|
|
4256
|
+
}
|
|
4257
|
+
};
|
|
4258
|
+
const routeVisibilityChanges = diffRouteVisibility(oldBundle?.manifest, bundle.manifest);
|
|
4259
|
+
const hasNewPublicRoutes = routeVisibilityChanges.newlyPublic.length > 0;
|
|
4260
|
+
if (hasNewPublicRoutes && !opts?.confirmRouteVisibilityChanges) return {
|
|
4261
|
+
success: false,
|
|
4262
|
+
error: {
|
|
4263
|
+
code: "ROUTE_VISIBILITY_ESCALATION",
|
|
4264
|
+
message: "Plugin update exposes new public (unauthenticated) routes",
|
|
4265
|
+
details: {
|
|
4266
|
+
routeVisibilityChanges,
|
|
4267
|
+
capabilityChanges
|
|
4268
|
+
}
|
|
4269
|
+
}
|
|
4270
|
+
};
|
|
4271
|
+
await storeBundleInR2(storage, pluginId, newVersion, bundle, "registry");
|
|
4272
|
+
await stateRepo.upsert(pluginId, newVersion, "active", {
|
|
4273
|
+
source: "registry",
|
|
4274
|
+
registryPublisherDid: publisherDid,
|
|
4275
|
+
registrySlug: slug,
|
|
4276
|
+
displayName: existing.displayName ?? slug,
|
|
4277
|
+
description: existing.description ?? void 0
|
|
4278
|
+
});
|
|
4279
|
+
deleteBundleFromR2(storage, pluginId, oldVersion, "registry").catch(() => {});
|
|
4280
|
+
return {
|
|
4281
|
+
success: true,
|
|
4282
|
+
data: {
|
|
4283
|
+
pluginId,
|
|
4284
|
+
oldVersion,
|
|
4285
|
+
newVersion,
|
|
4286
|
+
capabilityChanges,
|
|
4287
|
+
routeVisibilityChanges: hasNewPublicRoutes ? routeVisibilityChanges : void 0
|
|
4288
|
+
}
|
|
4289
|
+
};
|
|
4290
|
+
} catch (err) {
|
|
4291
|
+
if (err instanceof ClientValidationError) return {
|
|
4292
|
+
success: false,
|
|
4293
|
+
error: {
|
|
4294
|
+
code: "AGGREGATOR_RESPONSE_INVALID",
|
|
4295
|
+
message: `Aggregator returned a response that does not conform to its lexicon (${err.target})`
|
|
4296
|
+
}
|
|
4297
|
+
};
|
|
4298
|
+
if (err instanceof ClientResponseError) return {
|
|
4299
|
+
success: false,
|
|
4300
|
+
error: {
|
|
4301
|
+
code: err.status === 404 ? "AGGREGATOR_NOT_FOUND" : "AGGREGATOR_HTTP_ERROR",
|
|
4302
|
+
message: `Aggregator returned ${err.status}: ${err.error}`
|
|
4303
|
+
}
|
|
4304
|
+
};
|
|
4305
|
+
if (err instanceof EmDashStorageError) return {
|
|
4306
|
+
success: false,
|
|
4307
|
+
error: {
|
|
4308
|
+
code: err.code ?? "STORAGE_ERROR",
|
|
4309
|
+
message: "Storage error while updating plugin"
|
|
4310
|
+
}
|
|
4311
|
+
};
|
|
4312
|
+
console.error("[registry-update] Failed:", err);
|
|
4313
|
+
return {
|
|
4314
|
+
success: false,
|
|
4315
|
+
error: {
|
|
4316
|
+
code: "UPDATE_FAILED",
|
|
4317
|
+
message: err instanceof Error ? err.message : "Failed to update plugin"
|
|
4318
|
+
}
|
|
4319
|
+
};
|
|
4320
|
+
}
|
|
4321
|
+
}
|
|
4322
|
+
/**
|
|
4323
|
+
* Bulk update check across every installed registry plugin. Queries the
|
|
4324
|
+
* aggregator for each plugin's latest release and reports `hasUpdate`
|
|
4325
|
+
* based on the version comparison. Plugins whose aggregator lookup fails
|
|
4326
|
+
* (unreachable, delisted, malformed) are skipped silently — one bad
|
|
4327
|
+
* publisher must not blank the whole admin Updates list.
|
|
4328
|
+
*/
|
|
4329
|
+
async function handleRegistryUpdateCheck(db, registryConfigInput) {
|
|
4330
|
+
const registryConfig = coerceRegistryConfig(registryConfigInput);
|
|
4331
|
+
if (!registryConfig) return {
|
|
4332
|
+
success: false,
|
|
4333
|
+
error: {
|
|
4334
|
+
code: "REGISTRY_NOT_CONFIGURED",
|
|
4335
|
+
message: "Registry is not configured"
|
|
4336
|
+
}
|
|
4337
|
+
};
|
|
4338
|
+
try {
|
|
4339
|
+
const registryPlugins = await new PluginStateRepository(db).getRegistryPlugins();
|
|
4340
|
+
if (registryPlugins.length === 0) return {
|
|
4341
|
+
success: true,
|
|
4342
|
+
data: { items: [] }
|
|
4343
|
+
};
|
|
4344
|
+
const { DiscoveryClient } = await import("@emdash-cms/registry-client/discovery");
|
|
4345
|
+
const aggregatorDeadline = Date.now() + AGGREGATOR_TOTAL_BUDGET_MS;
|
|
4346
|
+
const discovery = new DiscoveryClient({
|
|
4347
|
+
aggregatorUrl: registryConfig.aggregatorUrl,
|
|
4348
|
+
acceptLabelers: registryConfig.acceptLabelers,
|
|
4349
|
+
fetch: timedFetch(aggregatorDeadline)
|
|
4350
|
+
});
|
|
4351
|
+
const items = [];
|
|
4352
|
+
for (const plugin of registryPlugins) {
|
|
4353
|
+
if (!plugin.registryPublisherDid || !plugin.registrySlug) continue;
|
|
4354
|
+
try {
|
|
4355
|
+
const latest = (await discovery.getLatestRelease({
|
|
4356
|
+
did: plugin.registryPublisherDid,
|
|
4357
|
+
package: plugin.registrySlug
|
|
4358
|
+
})).version;
|
|
4359
|
+
if (!latest) continue;
|
|
4360
|
+
const installed = plugin.version;
|
|
4361
|
+
items.push({
|
|
4362
|
+
pluginId: plugin.pluginId,
|
|
4363
|
+
installed,
|
|
4364
|
+
latest,
|
|
4365
|
+
hasUpdate: latest !== installed,
|
|
4366
|
+
hasCapabilityChanges: false,
|
|
4367
|
+
hasRouteVisibilityChanges: false
|
|
4368
|
+
});
|
|
4369
|
+
} catch (err) {
|
|
4370
|
+
console.warn(`[registry-update-check] Skipped ${plugin.pluginId}:`, err);
|
|
4371
|
+
}
|
|
4372
|
+
}
|
|
4373
|
+
return {
|
|
4374
|
+
success: true,
|
|
4375
|
+
data: { items }
|
|
4376
|
+
};
|
|
4377
|
+
} catch (err) {
|
|
4378
|
+
if (err instanceof ClientValidationError) return {
|
|
4379
|
+
success: false,
|
|
4380
|
+
error: {
|
|
4381
|
+
code: "AGGREGATOR_RESPONSE_INVALID",
|
|
4382
|
+
message: `Aggregator returned a response that does not conform to its lexicon (${err.target})`
|
|
4383
|
+
}
|
|
4384
|
+
};
|
|
4385
|
+
if (err instanceof ClientResponseError) return {
|
|
4386
|
+
success: false,
|
|
4387
|
+
error: {
|
|
4388
|
+
code: err.status === 404 ? "AGGREGATOR_NOT_FOUND" : "AGGREGATOR_HTTP_ERROR",
|
|
4389
|
+
message: `Aggregator returned ${err.status}: ${err.error}`
|
|
4390
|
+
}
|
|
4391
|
+
};
|
|
4392
|
+
console.error("[registry-update-check] Failed:", err);
|
|
4393
|
+
return {
|
|
4394
|
+
success: false,
|
|
4395
|
+
error: {
|
|
4396
|
+
code: "UPDATE_CHECK_FAILED",
|
|
4397
|
+
message: "Failed to check for registry updates"
|
|
4398
|
+
}
|
|
4399
|
+
};
|
|
4400
|
+
}
|
|
4401
|
+
}
|
|
3938
4402
|
|
|
3939
4403
|
//#endregion
|
|
3940
|
-
export {
|
|
3941
|
-
//# sourceMappingURL=api-
|
|
4404
|
+
export { handleContentPermanentDelete as $, handleSchemaFieldList as A, handleRevisionRestore as B, handleSchemaCollectionDelete as C, handleSchemaFieldCreate as D, handleSchemaCollectionUpdate as E, handleMediaGet as F, handleContentCreate as G, handleContentCompare as H, handleMediaList as I, handleContentDuplicate as J, handleContentDelete as K, handleMediaUpdate as L, handleSchemaFieldUpdate as M, handleMediaCreate as N, handleSchemaFieldDelete as O, handleMediaDelete as P, handleContentListTrashed as Q, handleRevisionGet as R, handleSchemaCollectionCreate as S, handleSchemaCollectionList as T, handleContentCountScheduled as U, generateManifest as V, handleContentCountTrashed as W, handleContentGetIncludingTrashed as X, handleContentGet as Y, handleContentList as Z, handlePluginGet as _, normalizeRegistryConfig as a, handleContentUnschedule as at, handleOrphanedTableList as b, handleMarketplaceSearch as c, handleMarketplaceUpdateCheck as d, handleContentPublish as et, handleThemeGetDetail as f, handlePluginEnable as g, handlePluginDisable as h, handleRegistryUpdateCheck as i, handleContentUnpublish as it, handleSchemaFieldReorder as j, handleSchemaFieldGet as k, handleMarketplaceUninstall as l, loadBundleFromR2 as m, handleRegistryUninstall as n, handleContentSchedule as nt, handleMarketplaceGetPlugin as o, handleContentUpdate as ot, handleThemeSearch as p, handleContentDiscardDraft as q, handleRegistryUpdate as r, handleContentTranslations as rt, handleMarketplaceInstall as s, validateRev as st, handleRegistryInstall as t, handleContentRestore as tt, handleMarketplaceUpdate as u, handlePluginList as v, handleSchemaCollectionGet as w, handleOrphanedTableRegister as x, PluginStateRepository as y, handleRevisionList as z };
|
|
4405
|
+
//# sourceMappingURL=api-CLwG_3dh.mjs.map
|