dineway 0.1.9 → 0.1.12
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/README.md +63 -17
- package/dist/activity-events-B4wp7CrU.mjs +540 -0
- package/dist/allowed-origins-C1AKK9AT.mjs +68 -0
- package/dist/api/route-utils.d.mts +42 -0
- package/dist/api/route-utils.mjs +26 -0
- package/dist/api/schemas/index.d.mts +3 -0
- package/dist/api/schemas/index.mjs +6 -0
- package/dist/api/schemas/setup.d.mts +42 -0
- package/dist/api/schemas/setup.mjs +39 -0
- package/dist/api-BR7Y0GBo.mjs +2704 -0
- package/dist/api-tokens-CPjC3zf8.mjs +3 -0
- package/dist/api-tokens-D7UjLbdt.mjs +153 -0
- package/dist/{apply-iVSqz2qs.mjs → apply-Bm5QgdrE.mjs} +15 -689
- package/dist/astro/index.d.mts +11 -6
- package/dist/astro/index.mjs +86 -11
- package/dist/astro/middleware/auth.d.mts +11 -7
- package/dist/astro/middleware/auth.mjs +19 -104
- package/dist/astro/middleware/redirect.mjs +24 -14
- package/dist/astro/middleware/request-context.mjs +9 -6
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.mjs +88 -145
- package/dist/astro/routes/PluginRegistry.d.mts +14 -0
- package/dist/astro/routes/PluginRegistry.mjs +24 -0
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.d.mts +14 -0
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +65 -0
- package/dist/astro/routes/api/admin/allowed-domains/index.d.mts +14 -0
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +65 -0
- package/dist/astro/routes/api/admin/api-tokens/_id_.d.mts +10 -0
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +33 -0
- package/dist/astro/routes/api/admin/api-tokens/index.d.mts +16 -0
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +59 -0
- package/dist/astro/routes/api/admin/briefing.d.mts +7 -0
- package/dist/astro/routes/api/admin/briefing.mjs +71 -0
- package/dist/astro/routes/api/admin/bylines/_id_/index.d.mts +9 -0
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +74 -0
- package/dist/astro/routes/api/admin/bylines/index.d.mts +8 -0
- package/dist/astro/routes/api/admin/bylines/index.mjs +61 -0
- package/dist/astro/routes/api/admin/comments/_id_/status.d.mts +7 -0
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +80 -0
- package/dist/astro/routes/api/admin/comments/_id_.d.mts +14 -0
- package/dist/astro/routes/api/admin/comments/_id_.mjs +46 -0
- package/dist/astro/routes/api/admin/comments/bulk.d.mts +7 -0
- package/dist/astro/routes/api/admin/comments/bulk.mjs +36 -0
- package/dist/astro/routes/api/admin/comments/counts.d.mts +7 -0
- package/dist/astro/routes/api/admin/comments/counts.mjs +24 -0
- package/dist/astro/routes/api/admin/comments/index.d.mts +10 -0
- package/dist/astro/routes/api/admin/comments/index.mjs +40 -0
- package/dist/astro/routes/api/admin/context/_id_/history.d.mts +7 -0
- package/dist/astro/routes/api/admin/context/_id_/history.mjs +46 -0
- package/dist/astro/routes/api/admin/context/_id_/index.d.mts +7 -0
- package/dist/astro/routes/api/admin/context/_id_/index.mjs +46 -0
- package/dist/astro/routes/api/admin/context/_id_/review.d.mts +7 -0
- package/dist/astro/routes/api/admin/context/_id_/review.mjs +61 -0
- package/dist/astro/routes/api/admin/context/_id_/supersede.d.mts +7 -0
- package/dist/astro/routes/api/admin/context/_id_/supersede.mjs +64 -0
- package/dist/astro/routes/api/admin/context/diff.d.mts +7 -0
- package/dist/astro/routes/api/admin/context/diff.mjs +50 -0
- package/dist/astro/routes/api/admin/context/index.d.mts +8 -0
- package/dist/astro/routes/api/admin/context/index.mjs +72 -0
- package/dist/astro/routes/api/admin/context/stale.d.mts +7 -0
- package/dist/astro/routes/api/admin/context/stale.mjs +50 -0
- package/dist/astro/routes/api/admin/hitl-requests/_id_/index.d.mts +7 -0
- package/dist/astro/routes/api/admin/hitl-requests/_id_/index.mjs +52 -0
- package/dist/astro/routes/api/admin/hitl-requests/_id_/resolve.d.mts +7 -0
- package/dist/astro/routes/api/admin/hitl-requests/_id_/resolve.mjs +68 -0
- package/dist/astro/routes/api/admin/hitl-requests/index.d.mts +7 -0
- package/dist/astro/routes/api/admin/hitl-requests/index.mjs +56 -0
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.d.mts +7 -0
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +99 -0
- package/dist/astro/routes/api/admin/hooks/exclusive/index.d.mts +7 -0
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +33 -0
- package/dist/astro/routes/api/admin/oauth-clients/_id_.d.mts +18 -0
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +79 -0
- package/dist/astro/routes/api/admin/oauth-clients/index.d.mts +14 -0
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +58 -0
- package/dist/astro/routes/api/admin/plugins/_id_/disable.d.mts +7 -0
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +90 -0
- package/dist/astro/routes/api/admin/plugins/_id_/enable.d.mts +7 -0
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +90 -0
- package/dist/astro/routes/api/admin/plugins/_id_/index.d.mts +7 -0
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +55 -0
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.d.mts +7 -0
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +99 -0
- package/dist/astro/routes/api/admin/plugins/_id_/update.d.mts +7 -0
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +132 -0
- package/dist/astro/routes/api/admin/plugins/index.d.mts +7 -0
- package/dist/astro/routes/api/admin/plugins/index.mjs +53 -0
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.d.mts +7 -0
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +36 -0
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.d.mts +7 -0
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +55 -0
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.d.mts +7 -0
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +129 -0
- package/dist/astro/routes/api/admin/plugins/marketplace/index.d.mts +7 -0
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +62 -0
- package/dist/astro/routes/api/admin/plugins/updates.d.mts +7 -0
- package/dist/astro/routes/api/admin/plugins/updates.mjs +53 -0
- package/dist/astro/routes/api/admin/review-requests/_id_/index.d.mts +7 -0
- package/dist/astro/routes/api/admin/review-requests/_id_/index.mjs +26 -0
- package/dist/astro/routes/api/admin/review-requests/_id_/resolve.d.mts +7 -0
- package/dist/astro/routes/api/admin/review-requests/_id_/resolve.mjs +98 -0
- package/dist/astro/routes/api/admin/review-requests/index.d.mts +7 -0
- package/dist/astro/routes/api/admin/review-requests/index.mjs +31 -0
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.d.mts +7 -0
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +55 -0
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.d.mts +7 -0
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +36 -0
- package/dist/astro/routes/api/admin/themes/marketplace/index.d.mts +7 -0
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +71 -0
- package/dist/astro/routes/api/admin/users/_id_/disable.d.mts +7 -0
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +38 -0
- package/dist/astro/routes/api/admin/users/_id_/enable.d.mts +7 -0
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +29 -0
- package/dist/astro/routes/api/admin/users/_id_/index.d.mts +8 -0
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +104 -0
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.d.mts +7 -0
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +43 -0
- package/dist/astro/routes/api/admin/users/index.d.mts +7 -0
- package/dist/astro/routes/api/admin/users/index.mjs +54 -0
- package/dist/astro/routes/api/auth/dev-bypass.d.mts +8 -0
- package/dist/astro/routes/api/auth/dev-bypass.mjs +81 -0
- package/dist/astro/routes/api/auth/invite/accept.d.mts +7 -0
- package/dist/astro/routes/api/auth/invite/accept.mjs +31 -0
- package/dist/astro/routes/api/auth/invite/complete.d.mts +7 -0
- package/dist/astro/routes/api/auth/invite/complete.mjs +54 -0
- package/dist/astro/routes/api/auth/invite/index.d.mts +7 -0
- package/dist/astro/routes/api/auth/invite/index.mjs +51 -0
- package/dist/astro/routes/api/auth/invite/register-options.d.mts +7 -0
- package/dist/astro/routes/api/auth/invite/register-options.mjs +44 -0
- package/dist/astro/routes/api/auth/logout.d.mts +7 -0
- package/dist/astro/routes/api/auth/logout.mjs +24 -0
- package/dist/astro/routes/api/auth/magic-link/send.d.mts +7 -0
- package/dist/astro/routes/api/auth/magic-link/send.mjs +48 -0
- package/dist/astro/routes/api/auth/magic-link/verify.d.mts +7 -0
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +32 -0
- package/dist/astro/routes/api/auth/me.d.mts +13 -0
- package/dist/astro/routes/api/auth/me.mjs +41 -0
- package/dist/astro/routes/api/auth/mode.d.mts +7 -0
- package/dist/astro/routes/api/auth/mode.mjs +28 -0
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.d.mts +7 -0
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +114 -0
- package/dist/astro/routes/api/auth/oauth/_provider_.d.mts +7 -0
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +58 -0
- package/dist/astro/routes/api/auth/passkey/_id_.d.mts +14 -0
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +62 -0
- package/dist/astro/routes/api/auth/passkey/index.d.mts +7 -0
- package/dist/astro/routes/api/auth/passkey/index.mjs +25 -0
- package/dist/astro/routes/api/auth/passkey/options.d.mts +7 -0
- package/dist/astro/routes/api/auth/passkey/options.mjs +46 -0
- package/dist/astro/routes/api/auth/passkey/register/options.d.mts +7 -0
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +44 -0
- package/dist/astro/routes/api/auth/passkey/register/verify.d.mts +7 -0
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +59 -0
- package/dist/astro/routes/api/auth/passkey/verify.d.mts +7 -0
- package/dist/astro/routes/api/auth/passkey/verify.mjs +47 -0
- package/dist/astro/routes/api/auth/signup/complete.d.mts +7 -0
- package/dist/astro/routes/api/auth/signup/complete.mjs +55 -0
- package/dist/astro/routes/api/auth/signup/request.d.mts +7 -0
- package/dist/astro/routes/api/auth/signup/request.mjs +44 -0
- package/dist/astro/routes/api/auth/signup/verify.d.mts +7 -0
- package/dist/astro/routes/api/auth/signup/verify.mjs +32 -0
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.d.mts +14 -0
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +193 -0
- package/dist/astro/routes/api/content/_collection_/_id_/compare.d.mts +7 -0
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +17 -0
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.d.mts +7 -0
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +36 -0
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.d.mts +7 -0
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +39 -0
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.d.mts +7 -0
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +31 -0
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.d.mts +7 -0
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +78 -0
- package/dist/astro/routes/api/content/_collection_/_id_/publish.d.mts +7 -0
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +93 -0
- package/dist/astro/routes/api/content/_collection_/_id_/restore.d.mts +7 -0
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +36 -0
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.d.mts +7 -0
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +19 -0
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.d.mts +8 -0
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +75 -0
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.d.mts +14 -0
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +85 -0
- package/dist/astro/routes/api/content/_collection_/_id_/translations.d.mts +7 -0
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +40 -0
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.d.mts +7 -0
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +36 -0
- package/dist/astro/routes/api/content/_collection_/_id_.d.mts +9 -0
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +114 -0
- package/dist/astro/routes/api/content/_collection_/index.d.mts +8 -0
- package/dist/astro/routes/api/content/_collection_/index.mjs +74 -0
- package/dist/astro/routes/api/content/_collection_/trash.d.mts +7 -0
- package/dist/astro/routes/api/content/_collection_/trash.mjs +23 -0
- package/dist/astro/routes/api/dashboard.d.mts +7 -0
- package/dist/astro/routes/api/dashboard.mjs +26 -0
- package/dist/astro/routes/api/dev/emails.d.mts +8 -0
- package/dist/astro/routes/api/dev/emails.mjs +17 -0
- package/dist/astro/routes/api/health.d.mts +7 -0
- package/dist/astro/routes/api/health.mjs +34 -0
- package/dist/astro/routes/api/import/probe.d.mts +17 -0
- package/dist/astro/routes/api/import/probe.mjs +33 -0
- package/dist/astro/routes/api/import/wordpress/analyze.d.mts +87 -0
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +305 -0
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +37 -0
- package/dist/astro/routes/api/import/wordpress/execute.mjs +198 -0
- package/dist/astro/routes/api/import/wordpress/media.d.mts +35 -0
- package/dist/astro/routes/api/import/wordpress/media.mjs +222 -0
- package/dist/astro/routes/api/import/wordpress/prepare.d.mts +19 -0
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +156 -0
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +21 -0
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +290 -0
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +15 -0
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +69 -0
- package/dist/astro/routes/api/import/wordpress-plugin/callback.d.mts +7 -0
- package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs +28 -0
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +19 -0
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +269 -0
- package/dist/astro/routes/api/manifest.d.mts +7 -0
- package/dist/astro/routes/api/manifest.mjs +50 -0
- package/dist/astro/routes/api/mcp.d.mts +15 -0
- package/dist/astro/routes/api/mcp.mjs +2701 -0
- package/dist/astro/routes/api/media/_id_/confirm.d.mts +10 -0
- package/dist/astro/routes/api/media/_id_/confirm.mjs +59 -0
- package/dist/astro/routes/api/media/_id_.d.mts +22 -0
- package/dist/astro/routes/api/media/_id_.mjs +81 -0
- package/dist/astro/routes/api/media/file/_...key_.d.mts +7 -0
- package/dist/astro/routes/api/media/file/_...key_.mjs +49 -0
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.d.mts +14 -0
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +49 -0
- package/dist/astro/routes/api/media/providers/_providerId_/index.d.mts +14 -0
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +72 -0
- package/dist/astro/routes/api/media/providers/index.d.mts +10 -0
- package/dist/astro/routes/api/media/providers/index.mjs +18 -0
- package/dist/astro/routes/api/media/upload-url.d.mts +10 -0
- package/dist/astro/routes/api/media/upload-url.mjs +82 -0
- package/dist/astro/routes/api/media.d.mts +16 -0
- package/dist/astro/routes/api/media.mjs +137 -0
- package/dist/astro/routes/api/menus/_name_/items.d.mts +9 -0
- package/dist/astro/routes/api/menus/_name_/items.mjs +165 -0
- package/dist/astro/routes/api/menus/_name_/reorder.d.mts +7 -0
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +78 -0
- package/dist/astro/routes/api/menus/_name_.d.mts +9 -0
- package/dist/astro/routes/api/menus/_name_.mjs +124 -0
- package/dist/astro/routes/api/menus/index.d.mts +8 -0
- package/dist/astro/routes/api/menus/index.mjs +85 -0
- package/dist/astro/routes/api/oauth/authorize.d.mts +8 -0
- package/dist/astro/routes/api/oauth/authorize.mjs +265 -0
- package/dist/astro/routes/api/oauth/device/authorize.d.mts +7 -0
- package/dist/astro/routes/api/oauth/device/authorize.mjs +30 -0
- package/dist/astro/routes/api/oauth/device/code.d.mts +7 -0
- package/dist/astro/routes/api/oauth/device/code.mjs +34 -0
- package/dist/astro/routes/api/oauth/device/token.d.mts +7 -0
- package/dist/astro/routes/api/oauth/device/token.mjs +45 -0
- package/dist/astro/routes/api/oauth/register.d.mts +8 -0
- package/dist/astro/routes/api/oauth/register.mjs +115 -0
- package/dist/astro/routes/api/oauth/token/refresh.d.mts +7 -0
- package/dist/astro/routes/api/oauth/token/refresh.mjs +28 -0
- package/dist/astro/routes/api/oauth/token/revoke.d.mts +7 -0
- package/dist/astro/routes/api/oauth/token/revoke.mjs +25 -0
- package/dist/astro/routes/api/oauth/token.d.mts +8 -0
- package/dist/astro/routes/api/oauth/token.mjs +138 -0
- package/dist/astro/routes/api/openapi.json.d.mts +7 -0
- package/dist/astro/routes/api/openapi.json.mjs +2638 -0
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.d.mts +11 -0
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +77 -0
- package/dist/astro/routes/api/redirects/404s/index.d.mts +9 -0
- package/dist/astro/routes/api/redirects/404s/index.mjs +62 -0
- package/dist/astro/routes/api/redirects/404s/summary.d.mts +7 -0
- package/dist/astro/routes/api/redirects/404s/summary.mjs +34 -0
- package/dist/astro/routes/api/redirects/_id_.d.mts +9 -0
- package/dist/astro/routes/api/redirects/_id_.mjs +153 -0
- package/dist/astro/routes/api/redirects/index.d.mts +8 -0
- package/dist/astro/routes/api/redirects/index.mjs +98 -0
- package/dist/astro/routes/api/revisions/_revisionId_/index.d.mts +7 -0
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +16 -0
- package/dist/astro/routes/api/revisions/_revisionId_/restore.d.mts +7 -0
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +23 -0
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.d.mts +9 -0
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +99 -0
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.d.mts +8 -0
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +81 -0
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.d.mts +7 -0
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +68 -0
- package/dist/astro/routes/api/schema/collections/_slug_/index.d.mts +9 -0
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +98 -0
- package/dist/astro/routes/api/schema/collections/index.d.mts +8 -0
- package/dist/astro/routes/api/schema/collections/index.mjs +78 -0
- package/dist/astro/routes/api/schema/index.d.mts +7 -0
- package/dist/astro/routes/api/schema/index.mjs +79 -0
- package/dist/astro/routes/api/schema/orphans/_slug_.d.mts +7 -0
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +59 -0
- package/dist/astro/routes/api/schema/orphans/index.d.mts +7 -0
- package/dist/astro/routes/api/schema/orphans/index.mjs +54 -0
- package/dist/astro/routes/api/search/enable.d.mts +15 -0
- package/dist/astro/routes/api/search/enable.mjs +55 -0
- package/dist/astro/routes/api/search/index.d.mts +16 -0
- package/dist/astro/routes/api/search/index.mjs +52 -0
- package/dist/astro/routes/api/search/rebuild.d.mts +13 -0
- package/dist/astro/routes/api/search/rebuild.mjs +48 -0
- package/dist/astro/routes/api/search/stats.d.mts +10 -0
- package/dist/astro/routes/api/search/stats.mjs +28 -0
- package/dist/astro/routes/api/search/suggest.d.mts +15 -0
- package/dist/astro/routes/api/search/suggest.mjs +43 -0
- package/dist/astro/routes/api/sections/_slug_.d.mts +9 -0
- package/dist/astro/routes/api/sections/_slug_.mjs +157 -0
- package/dist/astro/routes/api/sections/index.d.mts +8 -0
- package/dist/astro/routes/api/sections/index.mjs +100 -0
- package/dist/astro/routes/api/settings/email.d.mts +17 -0
- package/dist/astro/routes/api/settings/email.mjs +102 -0
- package/dist/astro/routes/api/settings.d.mts +20 -0
- package/dist/astro/routes/api/settings.mjs +102 -0
- package/dist/astro/routes/api/setup/admin-verify.d.mts +7 -0
- package/dist/astro/routes/api/setup/admin-verify.mjs +67 -0
- package/dist/astro/routes/api/setup/admin.d.mts +7 -0
- package/dist/astro/routes/api/setup/admin.mjs +68 -0
- package/dist/astro/routes/api/setup/dev-bypass.d.mts +8 -0
- package/dist/astro/routes/api/setup/dev-bypass.mjs +137 -0
- package/dist/astro/routes/api/setup/dev-reset.d.mts +7 -0
- package/dist/astro/routes/api/setup/dev-reset.mjs +22 -0
- package/dist/astro/routes/api/setup/index.d.mts +7 -0
- package/dist/astro/routes/api/setup/index.mjs +93 -0
- package/dist/astro/routes/api/setup/status.d.mts +7 -0
- package/dist/astro/routes/api/setup/status.mjs +57 -0
- package/dist/astro/routes/api/snapshot.d.mts +7 -0
- package/dist/astro/routes/api/snapshot.mjs +227 -0
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.d.mts +18 -0
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +190 -0
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.d.mts +14 -0
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +114 -0
- package/dist/astro/routes/api/taxonomies/index.d.mts +14 -0
- package/dist/astro/routes/api/taxonomies/index.mjs +104 -0
- package/dist/astro/routes/api/themes/preview.d.mts +7 -0
- package/dist/astro/routes/api/themes/preview.mjs +47 -0
- package/dist/astro/routes/api/typegen.d.mts +17 -0
- package/dist/astro/routes/api/typegen.mjs +75 -0
- package/dist/astro/routes/api/well-known/auth.d.mts +7 -0
- package/dist/astro/routes/api/well-known/auth.mjs +42 -0
- package/dist/astro/routes/api/well-known/oauth-authorization-server.d.mts +7 -0
- package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +33 -0
- package/dist/astro/routes/api/well-known/oauth-protected-resource.d.mts +7 -0
- package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +21 -0
- package/dist/astro/routes/api/widget-areas/_name_/reorder.d.mts +7 -0
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +89 -0
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.d.mts +8 -0
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +159 -0
- package/dist/astro/routes/api/widget-areas/_name_/widgets.d.mts +7 -0
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +105 -0
- package/dist/astro/routes/api/widget-areas/_name_.d.mts +8 -0
- package/dist/astro/routes/api/widget-areas/_name_.mjs +100 -0
- package/dist/astro/routes/api/widget-areas/index.d.mts +8 -0
- package/dist/astro/routes/api/widget-areas/index.mjs +109 -0
- package/dist/astro/routes/api/widget-components.d.mts +7 -0
- package/dist/astro/routes/api/widget-components.mjs +15 -0
- package/dist/astro/routes/robots.txt.d.mts +7 -0
- package/dist/astro/routes/robots.txt.mjs +60 -0
- package/dist/astro/routes/sitemap-_collection_.xml.d.mts +7 -0
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +70 -0
- package/dist/astro/routes/sitemap.xml.d.mts +7 -0
- package/dist/astro/routes/sitemap.xml.mjs +63 -0
- package/dist/astro/types.d.mts +42 -9
- package/dist/auth/providers/github-admin.d.mts +9 -0
- package/dist/auth/providers/github-admin.mjs +27 -0
- package/dist/auth/providers/github.d.mts +12 -0
- package/dist/auth/providers/github.mjs +17 -0
- package/dist/auth/providers/google-admin.d.mts +9 -0
- package/dist/auth/providers/google-admin.mjs +43 -0
- package/dist/auth/providers/google.d.mts +12 -0
- package/dist/auth/providers/google.mjs +17 -0
- package/dist/auth-control-guard-DOZ3UCsP.mjs +13 -0
- package/dist/authorize-BAdbMCwC.mjs +36 -0
- package/dist/briefing-MVYe_Uyf.mjs +1294 -0
- package/dist/briefing-rty4O-wa.mjs +29 -0
- package/dist/{byline-OhH2dlRu.mjs → byline-naZxOPSa.mjs} +3 -3
- package/dist/{bylines-BGpD9_hy.mjs → bylines-C4LIBOOO.mjs} +20 -53
- package/dist/bylines-eVVCuOe4.d.mts +2023 -0
- package/dist/{cache-BdSY-gQN.mjs → cache-DEbQ13c9.mjs} +21 -11
- package/dist/challenge-store-DDTbisbf.mjs +48 -0
- package/dist/cli/index.mjs +142 -22
- package/dist/client/external-auth-headers.d.mts +1 -1
- package/dist/client/index.d.mts +1 -1
- package/dist/client/index.mjs +3 -3
- package/dist/comment-DFO-gWDH.mjs +246 -0
- package/dist/comments--BsZ9pqA.mjs +186 -0
- package/dist/components-BPknylYg.mjs +107 -0
- package/dist/{content-DWi4d0rT.mjs → content-CyLkb-qH.mjs} +33 -44
- package/dist/context-CNIkMzot.mjs +849 -0
- package/dist/context-DNfcm853.mjs +184 -0
- package/dist/context-route-helpers-MurhoxWF.mjs +45 -0
- package/dist/context-types-C-LwdAxx.mjs +23 -0
- package/dist/cron-CKxvBrRT.mjs +263 -0
- package/dist/dashboard-DqnYU8EU.mjs +120 -0
- package/dist/db/index.d.mts +3 -3
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/libsql.mjs +3 -3
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/db/sqlite.mjs +1 -2
- package/dist/device-flow-BGEH5jfn.mjs +487 -0
- package/dist/email-console-CuefUXfX.mjs +36 -0
- package/dist/entity-aliases-C0v-yNET.mjs +51 -0
- package/dist/error-BMUPwxgx.mjs +435 -0
- package/dist/escape-BRVaw1Ai.mjs +8 -0
- package/dist/experimental-workflows-C9X7yblQ.mjs +38 -0
- package/dist/fts-manager-B1pTNEG_.mjs +297 -0
- package/dist/hash-CDX7M0ze.mjs +32 -0
- package/dist/hitl-requests-ChT32Ilo.mjs +118 -0
- package/dist/hitl-route-helpers-CSit54Ru.mjs +96 -0
- package/dist/import-BHRLhXAn.mjs +1323 -0
- package/dist/import-CNcKWTbp.mjs +243 -0
- package/dist/index-CYfhYgXd.d.mts +227 -0
- package/dist/index-EUAWaIxW.d.mts +835 -0
- package/dist/index.d.mts +17 -11
- package/dist/index.mjs +63 -22
- package/dist/jsonld-D2gUY4kA.d.mts +141 -0
- package/dist/{loader-sMG4TZ-u.mjs → loader-PZnPxFLc.mjs} +42 -5
- package/dist/{manifest-schema-D1MSVnoI.mjs → manifest-schema-CgFJAp0H.mjs} +22 -10
- package/dist/media/index.d.mts +2 -1
- package/dist/media/index.mjs +2 -1
- package/dist/media/local-runtime.d.mts +12 -7
- package/dist/media/local-runtime.mjs +3 -3
- package/dist/{media-DMTr80Gv.mjs → media-_7Fxdu45.mjs} +1 -1
- package/dist/menus-DS3_5nWY.mjs +312 -0
- package/dist/menus-DYW_UHjv.mjs +256 -0
- package/dist/normalize-C49G_o1k.mjs +126 -0
- package/dist/oauth-authorization-DxGjiWKL.mjs +283 -0
- package/dist/oauth-clients-DxO_NO7k.mjs +298 -0
- package/dist/oauth-state-store-C5UFhzwD.mjs +48 -0
- package/dist/oauth-user-lookup-Bi0ek9eM.mjs +25 -0
- package/dist/options-z8VVg1Ll.mjs +114 -0
- package/dist/page/index.d.mts +2 -139
- package/dist/page/index.mjs +1 -427
- package/dist/parse-C9106ehs.mjs +88 -0
- package/dist/passkey-config-BRSZx4pW.mjs +42 -0
- package/dist/{patterns-CrCYkMBb.mjs → patterns-K0DLqWir.mjs} +53 -1
- package/dist/placeholder-Bh1dfUOd.d.mts +40 -0
- package/dist/{placeholder-Cp8g5Emj.mjs → placeholder-C2P5fKa4.mjs} +1 -126
- package/dist/plugins/adapt-sandbox-entry.d.mts +10 -5
- package/dist/plugins/adapt-sandbox-entry.mjs +4 -4
- package/dist/plugins-D7-ILNib.mjs +3249 -0
- package/dist/preview-DvYRU-Oy.mjs +788 -0
- package/dist/provider-loader-BiQ6lNmf.d.mts +20 -0
- package/dist/provider-loader-C21b9OpH.mjs +36 -0
- package/dist/public-url-Cun8N3NU.mjs +71 -0
- package/dist/{query-kDmwCsHh.mjs → query-B9BO5goQ.mjs} +93 -19
- package/dist/query-CsbOywSY.mjs +35 -0
- package/dist/rate-limit-DmVTHI5v.mjs +112 -0
- package/dist/{redirect-DnEWAkVg.mjs → redirect-CGl64yOX.mjs} +9 -5
- package/dist/redirect-COZy-3iY.mjs +16 -0
- package/dist/redirects-Cgi_cZfN.mjs +499 -0
- package/dist/redirects-lrlmYXVE.mjs +1023 -0
- package/dist/{registry-C0zjeB9P.mjs → registry-C-_hxLqa.mjs} +26 -294
- package/dist/request-meta-DixlNKKa.mjs +130 -0
- package/dist/review-requests-C2DIHwlJ.mjs +148 -0
- package/dist/review-requests-DIyjw-K_.mjs +79 -0
- package/dist/{runner-CFI6B6J2.d.mts → runner-BU6Lo1ZS.d.mts} +1 -1
- package/dist/{index-yvc6E_17.d.mts → runtime-Db4LbNVZ.d.mts} +1188 -2484
- package/dist/runtime.d.mts +11 -24
- package/dist/runtime.mjs +4 -38
- package/dist/schema-BECjUhP8.mjs +8 -0
- package/dist/search-DqTHQqtV.mjs +337 -0
- package/dist/secrets-CkoJ9zN0.mjs +160 -0
- package/dist/sections-B61OxnfB.mjs +338 -0
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +18 -13
- package/dist/seo/index.d.mts +1 -1
- package/dist/seo-C007Luwn.mjs +85 -0
- package/dist/seo-CUQctrog.mjs +129 -0
- package/dist/seo-contributions-B1fWCnqY.mjs +429 -0
- package/dist/service-CyOsm0R6.mjs +194 -0
- package/dist/settings-DGtLLSaz.mjs +237 -0
- package/dist/settings-Dzgswvg4.mjs +50 -0
- package/dist/setup-complete-ChilE-da.mjs +21 -0
- package/dist/setup-nonce-BpmLXAuu.mjs +17 -0
- package/dist/sidecar-client-B1C6Cf80.mjs +66 -0
- package/dist/site-activity-B8FjLIVh.mjs +104 -0
- package/dist/site-context-WBxoD99D.mjs +4122 -0
- package/dist/site-url-BP7k7OCe.mjs +12 -0
- package/dist/slugify-PDTDtMXp.mjs +30 -0
- package/dist/ssrf-DDwRxF6B.mjs +248 -0
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +2 -2
- package/dist/{taxonomies-1s5PaS_8.mjs → taxonomies-D2aZGuns.mjs} +11 -7
- package/dist/taxonomies-z6Lz91BC.mjs +355 -0
- package/dist/taxonomy-D5cbhc8u.mjs +165 -0
- package/dist/{tokens-CJz9ubV6.mjs → tokens-BOJw-D9F.mjs} +1 -1
- package/dist/{transport-DB5eDN4x.mjs → transport-D3i4yWRE.mjs} +5 -4
- package/dist/trusted-proxy-BbaZfkT9.mjs +30 -0
- package/dist/types-0Vr68fc2.d.mts +344 -0
- package/dist/types-BFmjniC2.d.mts +165 -0
- package/dist/{types-BawVha09.mjs → types-Bs6lTBBW.mjs} +1 -1
- package/dist/{types-BuMDPy5C.d.mts → types-C0mmVRJN.d.mts} +6 -0
- package/dist/{placeholder--wOi4TbO.d.mts → types-OPs5Q_sX.d.mts} +1 -38
- package/dist/{types-Cj0KMIZV.d.mts → types-Q616b2Hn.d.mts} +54 -16
- package/dist/ui/client-runtime.d.mts +12 -0
- package/dist/ui/client-runtime.mjs +32 -0
- package/dist/ui/server-runtime.d.mts +33 -0
- package/dist/ui/server-runtime.mjs +80 -0
- package/dist/url-DNjT2abR.mjs +49 -0
- package/dist/user-CcXq-zoL.mjs +154 -0
- package/dist/utils-C0ONdBul.mjs +285 -0
- package/dist/{validate-IPf8n4Fj.d.mts → validate-BwmQEbu8.d.mts} +3 -3
- package/dist/{validate-BZ5wnLLp.mjs → validate-C7TzfamJ.mjs} +1 -1
- package/dist/version-D3vDb22n.mjs +6 -0
- package/dist/widgets-B7DRpZvy.mjs +104 -0
- package/dist/wordpress-slugs-CnporCYH.mjs +14 -0
- package/dist/zod-generator-DBVP8D0P.mjs +132 -0
- package/locals.d.ts +1 -6
- package/package.json +81 -11
- package/src/components/Button.astro +1 -1
- package/src/components/CommentForm.astro +1 -1
- package/src/components/Comments.astro +1 -3
- package/src/components/DinewayBodyEnd.astro +5 -3
- package/src/components/DinewayBodyStart.astro +5 -3
- package/src/components/DinewayHead.astro +15 -9
- package/src/components/DinewayImage.astro +12 -8
- package/src/components/DinewayMedia.astro +15 -6
- package/src/components/Embed.astro +1 -2
- package/src/components/File.astro +1 -1
- package/src/components/Gallery.astro +5 -3
- package/src/components/HtmlBlock.astro +1 -1
- package/src/components/Image.astro +9 -3
- package/src/components/InlinePortableTextEditor.tsx +69 -20
- package/src/components/PortableText.astro +1 -1
- package/src/components/WidgetArea.astro +1 -1
- package/src/components/WidgetRenderer.astro +1 -3
- package/src/components/marks/Link.astro +1 -1
- package/src/components/widgets/Archives.astro +1 -1
- package/src/components/widgets/Categories.astro +1 -1
- package/src/components/widgets/RecentPosts.astro +1 -1
- package/src/components/widgets/Tags.astro +1 -1
- package/dist/error-BmL6QipT.mjs +0 -30
- package/dist/search-DxopAWxs.mjs +0 -11200
- package/dist/version-BPz1imu2.mjs +0 -6
- package/src/astro/routes/PluginRegistry.tsx +0 -21
- package/src/astro/routes/api/admin/allowed-domains/[domain].ts +0 -112
- package/src/astro/routes/api/admin/allowed-domains/index.ts +0 -108
- package/src/astro/routes/api/admin/api-tokens/[id].ts +0 -44
- package/src/astro/routes/api/admin/api-tokens/index.ts +0 -90
- package/src/astro/routes/api/admin/briefing.ts +0 -76
- package/src/astro/routes/api/admin/bylines/[id]/index.ts +0 -90
- package/src/astro/routes/api/admin/bylines/index.ts +0 -74
- package/src/astro/routes/api/admin/comments/[id]/status.ts +0 -120
- package/src/astro/routes/api/admin/comments/[id].ts +0 -64
- package/src/astro/routes/api/admin/comments/bulk.ts +0 -42
- package/src/astro/routes/api/admin/comments/counts.ts +0 -30
- package/src/astro/routes/api/admin/comments/index.ts +0 -46
- package/src/astro/routes/api/admin/context/[id]/history.ts +0 -35
- package/src/astro/routes/api/admin/context/[id]/index.ts +0 -35
- package/src/astro/routes/api/admin/context/[id]/review.ts +0 -57
- package/src/astro/routes/api/admin/context/[id]/supersede.ts +0 -58
- package/src/astro/routes/api/admin/context/diff.ts +0 -35
- package/src/astro/routes/api/admin/context/index.ts +0 -69
- package/src/astro/routes/api/admin/context/stale.ts +0 -35
- package/src/astro/routes/api/admin/hitl-requests/[id]/index.ts +0 -38
- package/src/astro/routes/api/admin/hitl-requests/[id]/resolve.ts +0 -54
- package/src/astro/routes/api/admin/hitl-requests/index.ts +0 -38
- package/src/astro/routes/api/admin/hooks/exclusive/[hookName].ts +0 -132
- package/src/astro/routes/api/admin/hooks/exclusive/index.ts +0 -51
- package/src/astro/routes/api/admin/oauth-clients/[id].ts +0 -137
- package/src/astro/routes/api/admin/oauth-clients/index.ts +0 -95
- package/src/astro/routes/api/admin/plugins/[id]/disable.ts +0 -91
- package/src/astro/routes/api/admin/plugins/[id]/enable.ts +0 -91
- package/src/astro/routes/api/admin/plugins/[id]/index.ts +0 -38
- package/src/astro/routes/api/admin/plugins/[id]/uninstall.ts +0 -98
- package/src/astro/routes/api/admin/plugins/[id]/update.ts +0 -154
- package/src/astro/routes/api/admin/plugins/index.ts +0 -32
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/icon.ts +0 -62
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/index.ts +0 -33
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/install.ts +0 -135
- package/src/astro/routes/api/admin/plugins/marketplace/index.ts +0 -38
- package/src/astro/routes/api/admin/plugins/updates.ts +0 -28
- package/src/astro/routes/api/admin/review-requests/[id]/index.ts +0 -35
- package/src/astro/routes/api/admin/review-requests/[id]/resolve.ts +0 -52
- package/src/astro/routes/api/admin/review-requests/index.ts +0 -35
- package/src/astro/routes/api/admin/themes/marketplace/[id]/index.ts +0 -33
- package/src/astro/routes/api/admin/themes/marketplace/[id]/thumbnail.ts +0 -62
- package/src/astro/routes/api/admin/themes/marketplace/index.ts +0 -45
- package/src/astro/routes/api/admin/users/[id]/disable.ts +0 -72
- package/src/astro/routes/api/admin/users/[id]/enable.ts +0 -48
- package/src/astro/routes/api/admin/users/[id]/index.ts +0 -166
- package/src/astro/routes/api/admin/users/[id]/send-recovery.ts +0 -72
- package/src/astro/routes/api/admin/users/index.ts +0 -66
- package/src/astro/routes/api/auth/dev-bypass.ts +0 -139
- package/src/astro/routes/api/auth/invite/accept.ts +0 -52
- package/src/astro/routes/api/auth/invite/complete.ts +0 -86
- package/src/astro/routes/api/auth/invite/index.ts +0 -99
- package/src/astro/routes/api/auth/invite/register-options.ts +0 -73
- package/src/astro/routes/api/auth/logout.ts +0 -40
- package/src/astro/routes/api/auth/magic-link/send.ts +0 -90
- package/src/astro/routes/api/auth/magic-link/verify.ts +0 -71
- package/src/astro/routes/api/auth/me.ts +0 -60
- package/src/astro/routes/api/auth/oauth/[provider]/callback.ts +0 -221
- package/src/astro/routes/api/auth/oauth/[provider].ts +0 -120
- package/src/astro/routes/api/auth/passkey/[id].ts +0 -124
- package/src/astro/routes/api/auth/passkey/index.ts +0 -54
- package/src/astro/routes/api/auth/passkey/options.ts +0 -85
- package/src/astro/routes/api/auth/passkey/register/options.ts +0 -88
- package/src/astro/routes/api/auth/passkey/register/verify.ts +0 -119
- package/src/astro/routes/api/auth/passkey/verify.ts +0 -72
- package/src/astro/routes/api/auth/signup/complete.ts +0 -87
- package/src/astro/routes/api/auth/signup/request.ts +0 -89
- package/src/astro/routes/api/auth/signup/verify.ts +0 -53
- package/src/astro/routes/api/comments/[collection]/[contentId]/index.ts +0 -310
- package/src/astro/routes/api/content/[collection]/[id]/compare.ts +0 -28
- package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +0 -68
- package/src/astro/routes/api/content/[collection]/[id]/duplicate.ts +0 -77
- package/src/astro/routes/api/content/[collection]/[id]/permanent.ts +0 -42
- package/src/astro/routes/api/content/[collection]/[id]/preview-url.ts +0 -107
- package/src/astro/routes/api/content/[collection]/[id]/publish.ts +0 -100
- package/src/astro/routes/api/content/[collection]/[id]/restore.ts +0 -64
- package/src/astro/routes/api/content/[collection]/[id]/revisions.ts +0 -31
- package/src/astro/routes/api/content/[collection]/[id]/schedule.ts +0 -129
- package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +0 -143
- package/src/astro/routes/api/content/[collection]/[id]/translations.ts +0 -50
- package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +0 -69
- package/src/astro/routes/api/content/[collection]/[id].ts +0 -173
- package/src/astro/routes/api/content/[collection]/index.ts +0 -103
- package/src/astro/routes/api/content/[collection]/trash.ts +0 -33
- package/src/astro/routes/api/dashboard.ts +0 -32
- package/src/astro/routes/api/dev/emails.ts +0 -36
- package/src/astro/routes/api/health.ts +0 -54
- package/src/astro/routes/api/import/probe.ts +0 -47
- package/src/astro/routes/api/import/wordpress/analyze.ts +0 -523
- package/src/astro/routes/api/import/wordpress/execute.ts +0 -330
- package/src/astro/routes/api/import/wordpress/media.ts +0 -338
- package/src/astro/routes/api/import/wordpress/prepare.ts +0 -212
- package/src/astro/routes/api/import/wordpress/rewrite-urls.ts +0 -425
- package/src/astro/routes/api/import/wordpress-plugin/analyze.ts +0 -111
- package/src/astro/routes/api/import/wordpress-plugin/callback.ts +0 -58
- package/src/astro/routes/api/import/wordpress-plugin/execute.ts +0 -399
- package/src/astro/routes/api/manifest.ts +0 -75
- package/src/astro/routes/api/mcp.ts +0 -125
- package/src/astro/routes/api/media/[id]/confirm.ts +0 -93
- package/src/astro/routes/api/media/[id].ts +0 -145
- package/src/astro/routes/api/media/file/[...key].ts +0 -79
- package/src/astro/routes/api/media/providers/[providerId]/[itemId].ts +0 -91
- package/src/astro/routes/api/media/providers/[providerId]/index.ts +0 -111
- package/src/astro/routes/api/media/providers/index.ts +0 -30
- package/src/astro/routes/api/media/upload-url.ts +0 -146
- package/src/astro/routes/api/media.ts +0 -204
- package/src/astro/routes/api/menus/[name]/items.ts +0 -206
- package/src/astro/routes/api/menus/[name]/reorder.ts +0 -79
- package/src/astro/routes/api/menus/[name].ts +0 -145
- package/src/astro/routes/api/menus/index.ts +0 -91
- package/src/astro/routes/api/oauth/authorize.ts +0 -430
- package/src/astro/routes/api/oauth/device/authorize.ts +0 -45
- package/src/astro/routes/api/oauth/device/code.ts +0 -56
- package/src/astro/routes/api/oauth/device/token.ts +0 -70
- package/src/astro/routes/api/oauth/register.ts +0 -182
- package/src/astro/routes/api/oauth/token/refresh.ts +0 -38
- package/src/astro/routes/api/oauth/token/revoke.ts +0 -38
- package/src/astro/routes/api/oauth/token.ts +0 -195
- package/src/astro/routes/api/openapi.json.ts +0 -33
- package/src/astro/routes/api/plugins/[pluginId]/[...path].ts +0 -109
- package/src/astro/routes/api/redirects/404s/index.ts +0 -72
- package/src/astro/routes/api/redirects/404s/summary.ts +0 -33
- package/src/astro/routes/api/redirects/[id].ts +0 -183
- package/src/astro/routes/api/redirects/index.ts +0 -100
- package/src/astro/routes/api/revisions/[revisionId]/index.ts +0 -29
- package/src/astro/routes/api/revisions/[revisionId]/restore.ts +0 -62
- package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +0 -104
- package/src/astro/routes/api/schema/collections/[slug]/fields/index.ts +0 -67
- package/src/astro/routes/api/schema/collections/[slug]/fields/reorder.ts +0 -45
- package/src/astro/routes/api/schema/collections/[slug]/index.ts +0 -107
- package/src/astro/routes/api/schema/collections/index.ts +0 -61
- package/src/astro/routes/api/schema/index.ts +0 -109
- package/src/astro/routes/api/schema/orphans/[slug].ts +0 -36
- package/src/astro/routes/api/schema/orphans/index.ts +0 -26
- package/src/astro/routes/api/search/enable.ts +0 -64
- package/src/astro/routes/api/search/index.ts +0 -52
- package/src/astro/routes/api/search/rebuild.ts +0 -72
- package/src/astro/routes/api/search/stats.ts +0 -35
- package/src/astro/routes/api/search/suggest.ts +0 -50
- package/src/astro/routes/api/sections/[slug].ts +0 -203
- package/src/astro/routes/api/sections/index.ts +0 -107
- package/src/astro/routes/api/settings/email.ts +0 -150
- package/src/astro/routes/api/settings.ts +0 -116
- package/src/astro/routes/api/setup/admin-verify.ts +0 -122
- package/src/astro/routes/api/setup/admin.ts +0 -104
- package/src/astro/routes/api/setup/dev-bypass.ts +0 -200
- package/src/astro/routes/api/setup/dev-reset.ts +0 -40
- package/src/astro/routes/api/setup/index.ts +0 -128
- package/src/astro/routes/api/setup/status.ts +0 -122
- package/src/astro/routes/api/snapshot.ts +0 -76
- package/src/astro/routes/api/taxonomies/[name]/terms/[slug].ts +0 -232
- package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +0 -131
- package/src/astro/routes/api/taxonomies/index.ts +0 -114
- package/src/astro/routes/api/themes/preview.ts +0 -78
- package/src/astro/routes/api/typegen.ts +0 -114
- package/src/astro/routes/api/well-known/auth.ts +0 -71
- package/src/astro/routes/api/well-known/oauth-authorization-server.ts +0 -48
- package/src/astro/routes/api/well-known/oauth-protected-resource.ts +0 -39
- package/src/astro/routes/api/widget-areas/[name]/reorder.ts +0 -114
- package/src/astro/routes/api/widget-areas/[name]/widgets/[id].ts +0 -213
- package/src/astro/routes/api/widget-areas/[name]/widgets.ts +0 -126
- package/src/astro/routes/api/widget-areas/[name].ts +0 -135
- package/src/astro/routes/api/widget-areas/index.ts +0 -149
- package/src/astro/routes/api/widget-components.ts +0 -22
- package/src/astro/routes/robots.txt.ts +0 -81
- package/src/astro/routes/sitemap-[collection].xml.ts +0 -104
- package/src/astro/routes/sitemap.xml.ts +0 -92
- /package/dist/{adapters-C2ypTrZZ.d.mts → adapters-DuLQZhRY.d.mts} +0 -0
- /package/{src → dist}/astro/routes/admin.astro +0 -0
- /package/dist/{base64-F8-DUraK.mjs → base64-Cz-aU0X1.mjs} +0 -0
- /package/dist/{chunks--4F8ddV4.mjs → chunks-D_jVet6z.mjs} +0 -0
- /package/dist/{config-BXwuX8Bx.mjs → config-CAMFxGaV.mjs} +0 -0
- /package/dist/{db-errors-CEqD7qH9.mjs → db-errors-DyZkswzF.mjs} +0 -0
- /package/dist/{default-VjJyuuG9.mjs → default-D4ngTpW8.mjs} +0 -0
- /package/dist/{load-Coc9HpHH.mjs → load-B2XtDw__.mjs} +0 -0
- /package/dist/{mode-47goXBBK.mjs → mode-DUhxwUhv.mjs} +0 -0
- /package/dist/{request-cache-Dk5qPSOx.mjs → request-cache-DHMRr2Lf.mjs} +0 -0
- /package/dist/{transaction-Cn2rjY78.mjs → transaction-x2tJQ-A1.mjs} +0 -0
- /package/dist/{transport-Wge_IzKl.d.mts → transport-BXe1AM79.d.mts} +0 -0
- /package/dist/{types-CWbdtiux.d.mts → types-B7kpsMJ3.d.mts} +0 -0
- /package/dist/{types-BzcUjoqg.d.mts → types-DJlpx5Ay.d.mts} +0 -0
- /package/dist/{types-COeOq9nK.mjs → types-DL7Y8D_t.mjs} +0 -0
- /package/dist/{types-DOrVigru.d.mts → types-DZPw8Rru.d.mts} +0 -0
- /package/dist/{types-griIBQOQ.mjs → types-fAInWQDO.mjs} +0 -0
|
@@ -0,0 +1,849 @@
|
|
|
1
|
+
import { n as validateJsonFieldName } from "./validate-VPnKoIzW.mjs";
|
|
2
|
+
import { o as jsonExtractExpr } from "./dialect-helpers-DhTzaUxP.mjs";
|
|
3
|
+
import { t as ContentRepository } from "./content-CyLkb-qH.mjs";
|
|
4
|
+
import { n as decodeCursor, r as encodeCursor } from "./types-Bs6lTBBW.mjs";
|
|
5
|
+
import { t as MediaRepository } from "./media-_7Fxdu45.mjs";
|
|
6
|
+
import { t as UserRepository } from "./user-CcXq-zoL.mjs";
|
|
7
|
+
import { t as OptionsRepository } from "./options-z8VVg1Ll.mjs";
|
|
8
|
+
import { t as withTransaction } from "./transaction-x2tJQ-A1.mjs";
|
|
9
|
+
import { t as SeoRepository } from "./seo-CUQctrog.mjs";
|
|
10
|
+
import { a as validateExternalUrl, i as stripCredentialHeaders, t as SsrfError } from "./ssrf-DDwRxF6B.mjs";
|
|
11
|
+
import { t as CronAccessImpl } from "./cron-CKxvBrRT.mjs";
|
|
12
|
+
import { sql } from "kysely";
|
|
13
|
+
import { ulid } from "ulidx";
|
|
14
|
+
|
|
15
|
+
//#region src/plugins/storage-query.ts
|
|
16
|
+
/**
|
|
17
|
+
* Error thrown when querying non-indexed fields
|
|
18
|
+
*/
|
|
19
|
+
var StorageQueryError = class extends Error {
|
|
20
|
+
constructor(message, field, suggestion) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.field = field;
|
|
23
|
+
this.suggestion = suggestion;
|
|
24
|
+
this.name = "StorageQueryError";
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Check if a value is a range filter
|
|
29
|
+
*/
|
|
30
|
+
function isRangeFilter(value) {
|
|
31
|
+
if (typeof value !== "object" || value === null) return false;
|
|
32
|
+
return "gt" in value || "gte" in value || "lt" in value || "lte" in value;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Check if a value is an IN filter
|
|
36
|
+
*/
|
|
37
|
+
function isInFilter(value) {
|
|
38
|
+
if (typeof value !== "object" || value === null) return false;
|
|
39
|
+
return "in" in value && Array.isArray(value.in);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Check if a value is a startsWith filter
|
|
43
|
+
*/
|
|
44
|
+
function isStartsWithFilter(value) {
|
|
45
|
+
if (typeof value !== "object" || value === null) return false;
|
|
46
|
+
return "startsWith" in value && typeof value.startsWith === "string";
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get the set of indexed fields from index declarations
|
|
50
|
+
*/
|
|
51
|
+
function getIndexedFields(indexes) {
|
|
52
|
+
const fields = /* @__PURE__ */ new Set();
|
|
53
|
+
for (const index of indexes) if (Array.isArray(index)) for (const field of index) fields.add(field);
|
|
54
|
+
else fields.add(index);
|
|
55
|
+
return fields;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Validate that all fields in a where clause are indexed
|
|
59
|
+
*/
|
|
60
|
+
function validateWhereClause(where, indexedFields, pluginId, collection) {
|
|
61
|
+
for (const field of Object.keys(where)) if (!indexedFields.has(field)) throw new StorageQueryError(`Cannot query on non-indexed field '${field}'.`, field, `Add '${field}' to storage.${collection}.indexes in plugin '${pluginId}' to enable this query.`);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Validate orderBy fields are indexed
|
|
65
|
+
*/
|
|
66
|
+
function validateOrderByClause(orderBy, indexedFields, pluginId, collection) {
|
|
67
|
+
for (const field of Object.keys(orderBy)) if (!indexedFields.has(field)) throw new StorageQueryError(`Cannot order by non-indexed field '${field}'.`, field, `Add '${field}' to storage.${collection}.indexes in plugin '${pluginId}' to enable ordering by this field.`);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* SQL expression for extracting JSON field.
|
|
71
|
+
*
|
|
72
|
+
* Validates the field name before interpolation to prevent SQL injection
|
|
73
|
+
* via crafted JSON path expressions.
|
|
74
|
+
*/
|
|
75
|
+
function jsonExtract(db, field) {
|
|
76
|
+
validateJsonFieldName(field, "query field name");
|
|
77
|
+
return jsonExtractExpr(db, "data", field);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Build a WHERE clause condition for a single field
|
|
81
|
+
*/
|
|
82
|
+
function buildCondition(db, field, value) {
|
|
83
|
+
const extract = jsonExtract(db, field);
|
|
84
|
+
if (value === null) return {
|
|
85
|
+
sql: `${extract} IS NULL`,
|
|
86
|
+
params: []
|
|
87
|
+
};
|
|
88
|
+
if (typeof value === "string" || typeof value === "number") return {
|
|
89
|
+
sql: `${extract} = ?`,
|
|
90
|
+
params: [value]
|
|
91
|
+
};
|
|
92
|
+
if (typeof value === "boolean") return {
|
|
93
|
+
sql: `${extract} = ?`,
|
|
94
|
+
params: [value]
|
|
95
|
+
};
|
|
96
|
+
if (isInFilter(value)) return {
|
|
97
|
+
sql: `${extract} IN (${value.in.map(() => "?").join(", ")})`,
|
|
98
|
+
params: value.in
|
|
99
|
+
};
|
|
100
|
+
if (isStartsWithFilter(value)) return {
|
|
101
|
+
sql: `${extract} LIKE ?`,
|
|
102
|
+
params: [`${value.startsWith}%`]
|
|
103
|
+
};
|
|
104
|
+
if (isRangeFilter(value)) {
|
|
105
|
+
const conditions = [];
|
|
106
|
+
const params = [];
|
|
107
|
+
if (value.gt !== void 0) {
|
|
108
|
+
conditions.push(`${extract} > ?`);
|
|
109
|
+
params.push(value.gt);
|
|
110
|
+
}
|
|
111
|
+
if (value.gte !== void 0) {
|
|
112
|
+
conditions.push(`${extract} >= ?`);
|
|
113
|
+
params.push(value.gte);
|
|
114
|
+
}
|
|
115
|
+
if (value.lt !== void 0) {
|
|
116
|
+
conditions.push(`${extract} < ?`);
|
|
117
|
+
params.push(value.lt);
|
|
118
|
+
}
|
|
119
|
+
if (value.lte !== void 0) {
|
|
120
|
+
conditions.push(`${extract} <= ?`);
|
|
121
|
+
params.push(value.lte);
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
sql: conditions.join(" AND "),
|
|
125
|
+
params
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
throw new StorageQueryError(`Unknown filter type for field '${field}'`);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Build a complete WHERE clause from a WhereClause object
|
|
132
|
+
*/
|
|
133
|
+
function buildWhereClause(db, where) {
|
|
134
|
+
const conditions = [];
|
|
135
|
+
const params = [];
|
|
136
|
+
for (const [field, value] of Object.entries(where)) {
|
|
137
|
+
const condition = buildCondition(db, field, value);
|
|
138
|
+
conditions.push(condition.sql);
|
|
139
|
+
params.push(...condition.params);
|
|
140
|
+
}
|
|
141
|
+
if (conditions.length === 0) return {
|
|
142
|
+
sql: "",
|
|
143
|
+
params: []
|
|
144
|
+
};
|
|
145
|
+
return {
|
|
146
|
+
sql: conditions.join(" AND "),
|
|
147
|
+
params
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
//#endregion
|
|
152
|
+
//#region src/database/repositories/plugin-storage.ts
|
|
153
|
+
/**
|
|
154
|
+
* Plugin Storage Repository
|
|
155
|
+
*
|
|
156
|
+
* Implements the StorageCollection interface for a specific plugin and collection.
|
|
157
|
+
*/
|
|
158
|
+
var PluginStorageRepository = class {
|
|
159
|
+
indexedFields;
|
|
160
|
+
constructor(db, pluginId, collection, indexes) {
|
|
161
|
+
this.db = db;
|
|
162
|
+
this.pluginId = pluginId;
|
|
163
|
+
this.collection = collection;
|
|
164
|
+
this.indexedFields = getIndexedFields(indexes);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Get a document by ID
|
|
168
|
+
*/
|
|
169
|
+
async get(id) {
|
|
170
|
+
const row = await this.db.selectFrom("_plugin_storage").select("data").where("plugin_id", "=", this.pluginId).where("collection", "=", this.collection).where("id", "=", id).executeTakeFirst();
|
|
171
|
+
if (!row) return null;
|
|
172
|
+
return JSON.parse(row.data);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Store a document
|
|
176
|
+
*/
|
|
177
|
+
async put(id, data) {
|
|
178
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
179
|
+
const jsonData = JSON.stringify(data);
|
|
180
|
+
await this.db.insertInto("_plugin_storage").values({
|
|
181
|
+
plugin_id: this.pluginId,
|
|
182
|
+
collection: this.collection,
|
|
183
|
+
id,
|
|
184
|
+
data: jsonData,
|
|
185
|
+
created_at: now,
|
|
186
|
+
updated_at: now
|
|
187
|
+
}).onConflict((oc) => oc.columns([
|
|
188
|
+
"plugin_id",
|
|
189
|
+
"collection",
|
|
190
|
+
"id"
|
|
191
|
+
]).doUpdateSet({
|
|
192
|
+
data: jsonData,
|
|
193
|
+
updated_at: now
|
|
194
|
+
})).execute();
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Delete a document
|
|
198
|
+
*/
|
|
199
|
+
async delete(id) {
|
|
200
|
+
return ((await this.db.deleteFrom("_plugin_storage").where("plugin_id", "=", this.pluginId).where("collection", "=", this.collection).where("id", "=", id).executeTakeFirst()).numDeletedRows ?? 0) > 0;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Check if a document exists
|
|
204
|
+
*/
|
|
205
|
+
async exists(id) {
|
|
206
|
+
return !!await this.db.selectFrom("_plugin_storage").select("id").where("plugin_id", "=", this.pluginId).where("collection", "=", this.collection).where("id", "=", id).executeTakeFirst();
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Get multiple documents by ID
|
|
210
|
+
*/
|
|
211
|
+
async getMany(ids) {
|
|
212
|
+
if (ids.length === 0) return /* @__PURE__ */ new Map();
|
|
213
|
+
const rows = await this.db.selectFrom("_plugin_storage").select(["id", "data"]).where("plugin_id", "=", this.pluginId).where("collection", "=", this.collection).where("id", "in", ids).execute();
|
|
214
|
+
const result = /* @__PURE__ */ new Map();
|
|
215
|
+
for (const row of rows) result.set(row.id, JSON.parse(row.data));
|
|
216
|
+
return result;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Store multiple documents
|
|
220
|
+
*/
|
|
221
|
+
async putMany(items) {
|
|
222
|
+
if (items.length === 0) return;
|
|
223
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
224
|
+
await withTransaction(this.db, async (trx) => {
|
|
225
|
+
for (const item of items) {
|
|
226
|
+
const jsonData = JSON.stringify(item.data);
|
|
227
|
+
await trx.insertInto("_plugin_storage").values({
|
|
228
|
+
plugin_id: this.pluginId,
|
|
229
|
+
collection: this.collection,
|
|
230
|
+
id: item.id,
|
|
231
|
+
data: jsonData,
|
|
232
|
+
created_at: now,
|
|
233
|
+
updated_at: now
|
|
234
|
+
}).onConflict((oc) => oc.columns([
|
|
235
|
+
"plugin_id",
|
|
236
|
+
"collection",
|
|
237
|
+
"id"
|
|
238
|
+
]).doUpdateSet({
|
|
239
|
+
data: jsonData,
|
|
240
|
+
updated_at: now
|
|
241
|
+
})).execute();
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Delete multiple documents
|
|
247
|
+
*/
|
|
248
|
+
async deleteMany(ids) {
|
|
249
|
+
if (ids.length === 0) return 0;
|
|
250
|
+
const result = await this.db.deleteFrom("_plugin_storage").where("plugin_id", "=", this.pluginId).where("collection", "=", this.collection).where("id", "in", ids).executeTakeFirst();
|
|
251
|
+
return Number(result.numDeletedRows ?? 0);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Query documents with filters
|
|
255
|
+
*/
|
|
256
|
+
async query(options = {}) {
|
|
257
|
+
const { where = {}, orderBy = {}, cursor } = options;
|
|
258
|
+
const limit = Math.min(options.limit ?? 50, 100);
|
|
259
|
+
validateWhereClause(where, this.indexedFields, this.pluginId, this.collection);
|
|
260
|
+
if (Object.keys(orderBy).length > 0) validateOrderByClause(orderBy, this.indexedFields, this.pluginId, this.collection);
|
|
261
|
+
let query = this.db.selectFrom("_plugin_storage").select([
|
|
262
|
+
"id",
|
|
263
|
+
"data",
|
|
264
|
+
"created_at"
|
|
265
|
+
]).where("plugin_id", "=", this.pluginId).where("collection", "=", this.collection);
|
|
266
|
+
const whereResult = buildWhereClause(this.db, where);
|
|
267
|
+
if (whereResult.sql) {
|
|
268
|
+
const whereSqlParts = [];
|
|
269
|
+
let paramIndex = 0;
|
|
270
|
+
const sqlParts = whereResult.sql.split("?");
|
|
271
|
+
for (let i = 0; i < sqlParts.length; i++) {
|
|
272
|
+
if (i > 0) whereSqlParts.push(sql`${whereResult.params[paramIndex++]}`);
|
|
273
|
+
if (sqlParts[i]) whereSqlParts.push(sql.raw(sqlParts[i]));
|
|
274
|
+
}
|
|
275
|
+
query = query.where(({ eb }) => eb(sql.join(whereSqlParts, sql.raw("")), "=", sql.raw("1")));
|
|
276
|
+
}
|
|
277
|
+
if (cursor) {
|
|
278
|
+
const decoded = decodeCursor(cursor);
|
|
279
|
+
if (decoded) query = query.where(({ eb }) => eb(sql`(created_at, id)`, ">", sql`(${decoded.orderValue}, ${decoded.id})`));
|
|
280
|
+
}
|
|
281
|
+
if (Object.keys(orderBy).length > 0) for (const [field, direction] of Object.entries(orderBy)) {
|
|
282
|
+
const extract = jsonExtract(this.db, field);
|
|
283
|
+
const orderExpr = direction === "desc" ? sql`${sql.raw(extract)} desc` : sql`${sql.raw(extract)} asc`;
|
|
284
|
+
query = query.orderBy(orderExpr);
|
|
285
|
+
}
|
|
286
|
+
else query = query.orderBy("created_at", "asc").orderBy("id", "asc");
|
|
287
|
+
query = query.limit(limit + 1);
|
|
288
|
+
const rows = await query.execute();
|
|
289
|
+
const hasMore = rows.length > limit;
|
|
290
|
+
const items = rows.slice(0, limit).map((row) => ({
|
|
291
|
+
id: row.id,
|
|
292
|
+
data: JSON.parse(row.data)
|
|
293
|
+
}));
|
|
294
|
+
let nextCursor;
|
|
295
|
+
if (hasMore) {
|
|
296
|
+
const lastItem = rows[limit - 1];
|
|
297
|
+
if (lastItem) nextCursor = encodeCursor(lastItem.created_at, lastItem.id);
|
|
298
|
+
}
|
|
299
|
+
return {
|
|
300
|
+
items,
|
|
301
|
+
cursor: nextCursor,
|
|
302
|
+
hasMore
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Count documents matching a filter
|
|
307
|
+
*/
|
|
308
|
+
async count(where) {
|
|
309
|
+
if (where && Object.keys(where).length > 0) validateWhereClause(where, this.indexedFields, this.pluginId, this.collection);
|
|
310
|
+
let query = this.db.selectFrom("_plugin_storage").select(sql`COUNT(*)`.as("count")).where("plugin_id", "=", this.pluginId).where("collection", "=", this.collection);
|
|
311
|
+
if (where && Object.keys(where).length > 0) {
|
|
312
|
+
const whereResult = buildWhereClause(this.db, where);
|
|
313
|
+
if (whereResult.sql) {
|
|
314
|
+
const whereSqlParts = [];
|
|
315
|
+
let paramIndex = 0;
|
|
316
|
+
const sqlParts = whereResult.sql.split("?");
|
|
317
|
+
for (let i = 0; i < sqlParts.length; i++) {
|
|
318
|
+
if (i > 0) whereSqlParts.push(sql`${whereResult.params[paramIndex++]}`);
|
|
319
|
+
if (sqlParts[i]) whereSqlParts.push(sql.raw(sqlParts[i]));
|
|
320
|
+
}
|
|
321
|
+
query = query.where(({ eb }) => eb(sql.join(whereSqlParts, sql.raw("")), "=", sql.raw("1")));
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return (await query.executeTakeFirst())?.count ?? 0;
|
|
325
|
+
}
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
//#endregion
|
|
329
|
+
//#region src/plugins/context.ts
|
|
330
|
+
/**
|
|
331
|
+
* Create KV accessor for a plugin
|
|
332
|
+
* All keys are automatically prefixed with the plugin ID
|
|
333
|
+
*/
|
|
334
|
+
function createKVAccess(optionsRepo, pluginId) {
|
|
335
|
+
const prefix = `plugin:${pluginId}:`;
|
|
336
|
+
return {
|
|
337
|
+
async get(key) {
|
|
338
|
+
return optionsRepo.get(`${prefix}${key}`);
|
|
339
|
+
},
|
|
340
|
+
async set(key, value) {
|
|
341
|
+
await optionsRepo.set(`${prefix}${key}`, value);
|
|
342
|
+
},
|
|
343
|
+
async delete(key) {
|
|
344
|
+
return optionsRepo.delete(`${prefix}${key}`);
|
|
345
|
+
},
|
|
346
|
+
async list(keyPrefix) {
|
|
347
|
+
const fullPrefix = `${prefix}${keyPrefix ?? ""}`;
|
|
348
|
+
const entriesMap = await optionsRepo.getByPrefix(fullPrefix);
|
|
349
|
+
const result = [];
|
|
350
|
+
for (const [fullKey, value] of entriesMap) result.push({
|
|
351
|
+
key: fullKey.slice(prefix.length),
|
|
352
|
+
value
|
|
353
|
+
});
|
|
354
|
+
return result;
|
|
355
|
+
}
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Create storage collection accessor for a plugin
|
|
360
|
+
* Wraps PluginStorageRepository with the v2 interface (no async iterators)
|
|
361
|
+
*/
|
|
362
|
+
function createStorageCollection(db, pluginId, collectionName, indexes) {
|
|
363
|
+
const repo = new PluginStorageRepository(db, pluginId, collectionName, indexes);
|
|
364
|
+
return {
|
|
365
|
+
get: (id) => repo.get(id),
|
|
366
|
+
put: (id, data) => repo.put(id, data),
|
|
367
|
+
delete: (id) => repo.delete(id),
|
|
368
|
+
exists: (id) => repo.exists(id),
|
|
369
|
+
getMany: (ids) => repo.getMany(ids),
|
|
370
|
+
putMany: (items) => repo.putMany(items),
|
|
371
|
+
deleteMany: (ids) => repo.deleteMany(ids),
|
|
372
|
+
count: (where) => repo.count(where),
|
|
373
|
+
async query(options) {
|
|
374
|
+
const result = await repo.query({
|
|
375
|
+
where: options?.where,
|
|
376
|
+
orderBy: options?.orderBy,
|
|
377
|
+
limit: options?.limit,
|
|
378
|
+
cursor: options?.cursor
|
|
379
|
+
});
|
|
380
|
+
return {
|
|
381
|
+
items: result.items,
|
|
382
|
+
cursor: result.cursor,
|
|
383
|
+
hasMore: result.hasMore
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Create storage accessor with all declared collections
|
|
390
|
+
*/
|
|
391
|
+
function createStorageAccess(db, pluginId, storageConfig) {
|
|
392
|
+
const storage = {};
|
|
393
|
+
for (const [collectionName, config] of Object.entries(storageConfig)) storage[collectionName] = createStorageCollection(db, pluginId, collectionName, [...config.indexes, ...config.uniqueIndexes ?? []]);
|
|
394
|
+
return storage;
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Extract `seo` from a plugin-supplied content write input and return both
|
|
398
|
+
* parts. Mutates nothing — returns a new field map without the `seo` key.
|
|
399
|
+
*/
|
|
400
|
+
function splitSeoFromInput(input) {
|
|
401
|
+
const { seo, ...fields } = input;
|
|
402
|
+
if (seo !== void 0 && (seo === null || typeof seo !== "object" || Array.isArray(seo))) throw new Error("content.seo must be an object");
|
|
403
|
+
return {
|
|
404
|
+
fields,
|
|
405
|
+
seo
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Reject writing SEO to a collection that does not have it enabled.
|
|
410
|
+
* Matches the REST API behavior (VALIDATION_ERROR).
|
|
411
|
+
*/
|
|
412
|
+
async function assertSeoEnabled(seoRepo, collection, seo) {
|
|
413
|
+
const hasSeo = await seoRepo.isEnabled(collection);
|
|
414
|
+
if (seo !== void 0 && !hasSeo) throw new Error(`Collection "${collection}" does not have SEO enabled. Remove the seo field or enable SEO on this collection.`);
|
|
415
|
+
return hasSeo;
|
|
416
|
+
}
|
|
417
|
+
function toPluginContentItem(item) {
|
|
418
|
+
return {
|
|
419
|
+
id: item.id,
|
|
420
|
+
type: item.type,
|
|
421
|
+
slug: item.slug,
|
|
422
|
+
status: item.status,
|
|
423
|
+
data: item.data,
|
|
424
|
+
createdAt: item.createdAt,
|
|
425
|
+
updatedAt: item.updatedAt,
|
|
426
|
+
publishedAt: item.publishedAt,
|
|
427
|
+
locale: item.locale
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Create read-only content access
|
|
432
|
+
*/
|
|
433
|
+
function createContentAccess(db) {
|
|
434
|
+
const contentRepo = new ContentRepository(db);
|
|
435
|
+
const seoRepo = new SeoRepository(db);
|
|
436
|
+
return {
|
|
437
|
+
async get(collection, id) {
|
|
438
|
+
const item = await contentRepo.findById(collection, id);
|
|
439
|
+
if (!item) return null;
|
|
440
|
+
const result = toPluginContentItem(item);
|
|
441
|
+
if (await seoRepo.isEnabled(collection)) result.seo = await seoRepo.get(collection, item.id);
|
|
442
|
+
return result;
|
|
443
|
+
},
|
|
444
|
+
async list(collection, options) {
|
|
445
|
+
let orderBy;
|
|
446
|
+
if (options?.orderBy) {
|
|
447
|
+
const first = Object.entries(options.orderBy)[0];
|
|
448
|
+
if (first) orderBy = {
|
|
449
|
+
field: first[0],
|
|
450
|
+
direction: first[1]
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
const result = await contentRepo.findMany(collection, {
|
|
454
|
+
limit: options?.limit ?? 50,
|
|
455
|
+
cursor: options?.cursor,
|
|
456
|
+
orderBy,
|
|
457
|
+
where: options?.where
|
|
458
|
+
});
|
|
459
|
+
const items = result.items.map(toPluginContentItem);
|
|
460
|
+
if (items.length > 0 && await seoRepo.isEnabled(collection)) {
|
|
461
|
+
const seoMap = await seoRepo.getMany(collection, items.map((i) => i.id));
|
|
462
|
+
for (const item of items) {
|
|
463
|
+
const seo = seoMap.get(item.id);
|
|
464
|
+
if (seo) item.seo = seo;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
return {
|
|
468
|
+
items,
|
|
469
|
+
cursor: result.nextCursor,
|
|
470
|
+
hasMore: !!result.nextCursor
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Create full content access with write operations.
|
|
477
|
+
*
|
|
478
|
+
* `create` and `update` accept a reserved `seo` key in their `data`
|
|
479
|
+
* argument. When present, it is routed to the core SEO panel
|
|
480
|
+
* (`_dineway_seo`) via `SeoRepository.upsert`, in the same transaction as
|
|
481
|
+
* the content write. The returned `ContentItem.seo` reflects the resulting
|
|
482
|
+
* SEO state for SEO-enabled collections.
|
|
483
|
+
*/
|
|
484
|
+
function createContentAccessWithWrite(db) {
|
|
485
|
+
return {
|
|
486
|
+
...createContentAccess(db),
|
|
487
|
+
async create(collection, data) {
|
|
488
|
+
const { fields, seo } = splitSeoFromInput(data);
|
|
489
|
+
return withTransaction(db, async (trx) => {
|
|
490
|
+
const trxContentRepo = new ContentRepository(trx);
|
|
491
|
+
const trxSeoRepo = new SeoRepository(trx);
|
|
492
|
+
const hasSeo = await assertSeoEnabled(trxSeoRepo, collection, seo);
|
|
493
|
+
const item = await trxContentRepo.create({
|
|
494
|
+
type: collection,
|
|
495
|
+
data: fields
|
|
496
|
+
});
|
|
497
|
+
const result = toPluginContentItem(item);
|
|
498
|
+
if (hasSeo) result.seo = seo !== void 0 ? await trxSeoRepo.upsert(collection, item.id, seo) : await trxSeoRepo.get(collection, item.id);
|
|
499
|
+
return result;
|
|
500
|
+
});
|
|
501
|
+
},
|
|
502
|
+
async update(collection, id, data) {
|
|
503
|
+
const { fields, seo } = splitSeoFromInput(data);
|
|
504
|
+
return withTransaction(db, async (trx) => {
|
|
505
|
+
const trxContentRepo = new ContentRepository(trx);
|
|
506
|
+
const trxSeoRepo = new SeoRepository(trx);
|
|
507
|
+
const hasSeo = await assertSeoEnabled(trxSeoRepo, collection, seo);
|
|
508
|
+
const item = Object.keys(fields).length > 0 ? await trxContentRepo.update(collection, id, { data: fields }) : await (async () => {
|
|
509
|
+
const existing = await trxContentRepo.findById(collection, id);
|
|
510
|
+
if (!existing) throw new Error("Content not found");
|
|
511
|
+
return existing;
|
|
512
|
+
})();
|
|
513
|
+
const result = toPluginContentItem(item);
|
|
514
|
+
if (hasSeo) result.seo = seo !== void 0 ? await trxSeoRepo.upsert(collection, item.id, seo) : await trxSeoRepo.get(collection, item.id);
|
|
515
|
+
return result;
|
|
516
|
+
});
|
|
517
|
+
},
|
|
518
|
+
async delete(collection, id) {
|
|
519
|
+
return new ContentRepository(db).delete(collection, id);
|
|
520
|
+
}
|
|
521
|
+
};
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Create read-only media access
|
|
525
|
+
*/
|
|
526
|
+
function createMediaAccess(db) {
|
|
527
|
+
const mediaRepo = new MediaRepository(db);
|
|
528
|
+
return {
|
|
529
|
+
async get(id) {
|
|
530
|
+
const item = await mediaRepo.findById(id);
|
|
531
|
+
if (!item) return null;
|
|
532
|
+
return {
|
|
533
|
+
id: item.id,
|
|
534
|
+
filename: item.filename,
|
|
535
|
+
mimeType: item.mimeType,
|
|
536
|
+
size: item.size,
|
|
537
|
+
url: `/media/${item.id}/${item.filename}`,
|
|
538
|
+
createdAt: item.createdAt
|
|
539
|
+
};
|
|
540
|
+
},
|
|
541
|
+
async list(options) {
|
|
542
|
+
const result = await mediaRepo.findMany({
|
|
543
|
+
limit: options?.limit ?? 50,
|
|
544
|
+
cursor: options?.cursor,
|
|
545
|
+
mimeType: options?.mimeType
|
|
546
|
+
});
|
|
547
|
+
return {
|
|
548
|
+
items: result.items.map((item) => ({
|
|
549
|
+
id: item.id,
|
|
550
|
+
filename: item.filename,
|
|
551
|
+
mimeType: item.mimeType,
|
|
552
|
+
size: item.size,
|
|
553
|
+
url: `/media/${item.id}/${item.filename}`,
|
|
554
|
+
createdAt: item.createdAt
|
|
555
|
+
})),
|
|
556
|
+
cursor: result.nextCursor,
|
|
557
|
+
hasMore: !!result.nextCursor
|
|
558
|
+
};
|
|
559
|
+
}
|
|
560
|
+
};
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* Create full media access with write operations.
|
|
564
|
+
* If storage is not provided, upload() will throw at call time.
|
|
565
|
+
*/
|
|
566
|
+
function createMediaAccessWithWrite(db, getUploadUrlFn, storage) {
|
|
567
|
+
const mediaRepo = new MediaRepository(db);
|
|
568
|
+
return {
|
|
569
|
+
...createMediaAccess(db),
|
|
570
|
+
getUploadUrl: getUploadUrlFn,
|
|
571
|
+
async upload(filename, contentType, bytes) {
|
|
572
|
+
if (!storage) throw new Error("Media upload() requires a storage backend. Configure storage in PluginContextFactoryOptions.");
|
|
573
|
+
const keyPrefix = ulid();
|
|
574
|
+
const basename = filename.split("/").pop() ?? filename;
|
|
575
|
+
const dotIdx = basename.lastIndexOf(".");
|
|
576
|
+
const storageKey = `${keyPrefix}${dotIdx > 0 ? basename.slice(dotIdx).toLowerCase() : ""}`;
|
|
577
|
+
await storage.upload({
|
|
578
|
+
key: storageKey,
|
|
579
|
+
body: new Uint8Array(bytes),
|
|
580
|
+
contentType
|
|
581
|
+
});
|
|
582
|
+
let media;
|
|
583
|
+
try {
|
|
584
|
+
media = await mediaRepo.create({
|
|
585
|
+
filename: basename,
|
|
586
|
+
mimeType: contentType,
|
|
587
|
+
size: bytes.byteLength,
|
|
588
|
+
storageKey,
|
|
589
|
+
status: "ready"
|
|
590
|
+
});
|
|
591
|
+
} catch (error) {
|
|
592
|
+
try {
|
|
593
|
+
await storage.delete(storageKey);
|
|
594
|
+
} catch {}
|
|
595
|
+
throw error;
|
|
596
|
+
}
|
|
597
|
+
return {
|
|
598
|
+
mediaId: media.id,
|
|
599
|
+
storageKey,
|
|
600
|
+
url: `/_dineway/api/media/file/${storageKey}`
|
|
601
|
+
};
|
|
602
|
+
},
|
|
603
|
+
async delete(id) {
|
|
604
|
+
return mediaRepo.delete(id);
|
|
605
|
+
}
|
|
606
|
+
};
|
|
607
|
+
}
|
|
608
|
+
/** Maximum number of redirects to follow in plugin HTTP access */
|
|
609
|
+
const MAX_PLUGIN_REDIRECTS = 5;
|
|
610
|
+
function isHostAllowed(host, allowedHosts) {
|
|
611
|
+
return allowedHosts.some((pattern) => {
|
|
612
|
+
if (pattern === "*") return true;
|
|
613
|
+
if (pattern.startsWith("*.")) {
|
|
614
|
+
const suffix = pattern.slice(1);
|
|
615
|
+
return host.endsWith(suffix) || host === pattern.slice(2);
|
|
616
|
+
}
|
|
617
|
+
return host === pattern;
|
|
618
|
+
});
|
|
619
|
+
}
|
|
620
|
+
/**
|
|
621
|
+
* Create HTTP access with host validation.
|
|
622
|
+
*
|
|
623
|
+
* Uses redirect: "manual" to re-validate each redirect target against
|
|
624
|
+
* the allowedHosts list, preventing redirects to unauthorized hosts.
|
|
625
|
+
*/
|
|
626
|
+
function createHttpAccess(pluginId, allowedHosts) {
|
|
627
|
+
return { async fetch(url, init) {
|
|
628
|
+
if (allowedHosts.length === 0) throw new Error(`Plugin "${pluginId}" has no allowed hosts configured. Add hosts to the plugin's allowedHosts array to enable HTTP requests.`);
|
|
629
|
+
let currentUrl = url;
|
|
630
|
+
let currentInit = init;
|
|
631
|
+
for (let i = 0; i <= MAX_PLUGIN_REDIRECTS; i++) {
|
|
632
|
+
const hostname = new URL(currentUrl).hostname;
|
|
633
|
+
if (!isHostAllowed(hostname, allowedHosts)) throw new Error(`Plugin "${pluginId}" is not allowed to fetch from host "${hostname}". Allowed hosts: ${allowedHosts.join(", ")}`);
|
|
634
|
+
const response = await globalThis.fetch(currentUrl, {
|
|
635
|
+
...currentInit,
|
|
636
|
+
redirect: "manual"
|
|
637
|
+
});
|
|
638
|
+
if (response.status < 300 || response.status >= 400) return response;
|
|
639
|
+
const location = response.headers.get("Location");
|
|
640
|
+
if (!location) return response;
|
|
641
|
+
const previousOrigin = new URL(currentUrl).origin;
|
|
642
|
+
currentUrl = new URL(location, currentUrl).href;
|
|
643
|
+
if (previousOrigin !== new URL(currentUrl).origin && currentInit) currentInit = stripCredentialHeaders(currentInit);
|
|
644
|
+
}
|
|
645
|
+
throw new Error(`Plugin "${pluginId}": too many redirects (max ${MAX_PLUGIN_REDIRECTS})`);
|
|
646
|
+
} };
|
|
647
|
+
}
|
|
648
|
+
/**
|
|
649
|
+
* Create unrestricted HTTP access (for plugins with network:request:unrestricted capability).
|
|
650
|
+
* No host validation, but applies SSRF protection on redirect targets to
|
|
651
|
+
* prevent plugins from being tricked into reaching internal services.
|
|
652
|
+
*/
|
|
653
|
+
function createUnrestrictedHttpAccess(pluginId) {
|
|
654
|
+
return { async fetch(url, init) {
|
|
655
|
+
let currentUrl = url;
|
|
656
|
+
let currentInit = init;
|
|
657
|
+
for (let i = 0; i <= MAX_PLUGIN_REDIRECTS; i++) {
|
|
658
|
+
try {
|
|
659
|
+
validateExternalUrl(currentUrl);
|
|
660
|
+
} catch (e) {
|
|
661
|
+
const msg = e instanceof SsrfError ? e.message : "SSRF validation failed";
|
|
662
|
+
throw new Error(`Plugin "${pluginId}": blocked fetch to "${new URL(currentUrl).hostname}": ${msg}`, { cause: e });
|
|
663
|
+
}
|
|
664
|
+
const response = await globalThis.fetch(currentUrl, {
|
|
665
|
+
...currentInit,
|
|
666
|
+
redirect: "manual"
|
|
667
|
+
});
|
|
668
|
+
if (response.status < 300 || response.status >= 400) return response;
|
|
669
|
+
const location = response.headers.get("Location");
|
|
670
|
+
if (!location) return response;
|
|
671
|
+
const previousOrigin = new URL(currentUrl).origin;
|
|
672
|
+
currentUrl = new URL(location, currentUrl).href;
|
|
673
|
+
if (previousOrigin !== new URL(currentUrl).origin && currentInit) currentInit = stripCredentialHeaders(currentInit);
|
|
674
|
+
}
|
|
675
|
+
throw new Error(`Plugin "${pluginId}": too many redirects (max ${MAX_PLUGIN_REDIRECTS})`);
|
|
676
|
+
} };
|
|
677
|
+
}
|
|
678
|
+
/**
|
|
679
|
+
* Create logger for a plugin
|
|
680
|
+
*/
|
|
681
|
+
function createLogAccess(pluginId) {
|
|
682
|
+
const prefix = `[plugin:${pluginId}]`;
|
|
683
|
+
return {
|
|
684
|
+
debug(message, data) {
|
|
685
|
+
if (data !== void 0) console.debug(prefix, message, data);
|
|
686
|
+
else console.debug(prefix, message);
|
|
687
|
+
},
|
|
688
|
+
info(message, data) {
|
|
689
|
+
if (data !== void 0) console.info(prefix, message, data);
|
|
690
|
+
else console.info(prefix, message);
|
|
691
|
+
},
|
|
692
|
+
warn(message, data) {
|
|
693
|
+
if (data !== void 0) console.warn(prefix, message, data);
|
|
694
|
+
else console.warn(prefix, message);
|
|
695
|
+
},
|
|
696
|
+
error(message, data) {
|
|
697
|
+
if (data !== void 0) console.error(prefix, message, data);
|
|
698
|
+
else console.error(prefix, message);
|
|
699
|
+
}
|
|
700
|
+
};
|
|
701
|
+
}
|
|
702
|
+
const TRAILING_SLASH_RE = /\/$/;
|
|
703
|
+
/**
|
|
704
|
+
* Create site info from config and settings.
|
|
705
|
+
*
|
|
706
|
+
* Resolution order for URL:
|
|
707
|
+
* 1. options table (dineway:site_url)
|
|
708
|
+
* 2. Astro `site` config
|
|
709
|
+
* 3. fallback to empty string
|
|
710
|
+
*/
|
|
711
|
+
function createSiteInfo(options) {
|
|
712
|
+
return {
|
|
713
|
+
name: options.siteName ?? "",
|
|
714
|
+
url: (options.siteUrl ?? "").replace(TRAILING_SLASH_RE, ""),
|
|
715
|
+
locale: options.locale ?? "en"
|
|
716
|
+
};
|
|
717
|
+
}
|
|
718
|
+
/**
|
|
719
|
+
* Create a URL helper that generates absolute URLs from relative paths.
|
|
720
|
+
* Validates that path starts with "/" and rejects protocol-relative paths ("//").
|
|
721
|
+
*/
|
|
722
|
+
function createUrlHelper(siteUrl) {
|
|
723
|
+
const base = siteUrl.replace(TRAILING_SLASH_RE, "");
|
|
724
|
+
return (path) => {
|
|
725
|
+
if (!path.startsWith("/")) throw new Error(`URL path must start with "/", got: "${path}"`);
|
|
726
|
+
if (path.startsWith("//")) throw new Error(`URL path must not be protocol-relative, got: "${path}"`);
|
|
727
|
+
return `${base}${path}`;
|
|
728
|
+
};
|
|
729
|
+
}
|
|
730
|
+
/**
|
|
731
|
+
* Convert a UserRepository user to the plugin-facing UserInfo shape.
|
|
732
|
+
* Strips sensitive fields (avatarUrl, emailVerified, data).
|
|
733
|
+
*/
|
|
734
|
+
function toUserInfo(user) {
|
|
735
|
+
return {
|
|
736
|
+
id: user.id,
|
|
737
|
+
email: user.email,
|
|
738
|
+
name: user.name,
|
|
739
|
+
role: user.role,
|
|
740
|
+
createdAt: user.createdAt
|
|
741
|
+
};
|
|
742
|
+
}
|
|
743
|
+
/**
|
|
744
|
+
* Create read-only user access for plugins.
|
|
745
|
+
* Excludes sensitive fields (password hashes, sessions, passkeys, avatar URL, data).
|
|
746
|
+
*/
|
|
747
|
+
function createUserAccess(db) {
|
|
748
|
+
const userRepo = new UserRepository(db);
|
|
749
|
+
return {
|
|
750
|
+
async get(id) {
|
|
751
|
+
const user = await userRepo.findById(id);
|
|
752
|
+
if (!user) return null;
|
|
753
|
+
return toUserInfo(user);
|
|
754
|
+
},
|
|
755
|
+
async getByEmail(email) {
|
|
756
|
+
const user = await userRepo.findByEmail(email);
|
|
757
|
+
if (!user) return null;
|
|
758
|
+
return toUserInfo(user);
|
|
759
|
+
},
|
|
760
|
+
async list(opts) {
|
|
761
|
+
const result = await userRepo.findMany({
|
|
762
|
+
role: opts?.role,
|
|
763
|
+
cursor: opts?.cursor,
|
|
764
|
+
limit: opts?.limit
|
|
765
|
+
});
|
|
766
|
+
return {
|
|
767
|
+
items: result.items.map(toUserInfo),
|
|
768
|
+
nextCursor: result.nextCursor
|
|
769
|
+
};
|
|
770
|
+
}
|
|
771
|
+
};
|
|
772
|
+
}
|
|
773
|
+
/**
|
|
774
|
+
* Factory for creating plugin contexts
|
|
775
|
+
*/
|
|
776
|
+
var PluginContextFactory = class {
|
|
777
|
+
optionsRepo;
|
|
778
|
+
db;
|
|
779
|
+
storage;
|
|
780
|
+
getUploadUrl;
|
|
781
|
+
site;
|
|
782
|
+
urlHelper;
|
|
783
|
+
cronReschedule;
|
|
784
|
+
emailPipeline;
|
|
785
|
+
constructor(options) {
|
|
786
|
+
this.db = options.db;
|
|
787
|
+
this.optionsRepo = new OptionsRepository(options.db);
|
|
788
|
+
this.storage = options.storage;
|
|
789
|
+
this.getUploadUrl = options.getUploadUrl;
|
|
790
|
+
this.site = createSiteInfo(options.siteInfo ?? {});
|
|
791
|
+
this.urlHelper = createUrlHelper(this.site.url);
|
|
792
|
+
this.cronReschedule = options.cronReschedule;
|
|
793
|
+
this.emailPipeline = options.emailPipeline;
|
|
794
|
+
}
|
|
795
|
+
/**
|
|
796
|
+
* Create the unified plugin context
|
|
797
|
+
*/
|
|
798
|
+
createContext(plugin) {
|
|
799
|
+
const capabilities = new Set(plugin.capabilities);
|
|
800
|
+
const kv = createKVAccess(this.optionsRepo, plugin.id);
|
|
801
|
+
const log = createLogAccess(plugin.id);
|
|
802
|
+
const storage = createStorageAccess(this.db, plugin.id, plugin.storage);
|
|
803
|
+
let content;
|
|
804
|
+
if (capabilities.has("content:write")) content = createContentAccessWithWrite(this.db);
|
|
805
|
+
else if (capabilities.has("content:read")) content = createContentAccess(this.db);
|
|
806
|
+
let media;
|
|
807
|
+
if (capabilities.has("media:write") && this.getUploadUrl) media = createMediaAccessWithWrite(this.db, this.getUploadUrl, this.storage);
|
|
808
|
+
else if (capabilities.has("media:read")) media = createMediaAccess(this.db);
|
|
809
|
+
let http;
|
|
810
|
+
if (capabilities.has("network:request:unrestricted")) http = createUnrestrictedHttpAccess(plugin.id);
|
|
811
|
+
else if (capabilities.has("network:request")) http = createHttpAccess(plugin.id, plugin.allowedHosts);
|
|
812
|
+
let users;
|
|
813
|
+
if (capabilities.has("users:read")) users = createUserAccess(this.db);
|
|
814
|
+
let cron;
|
|
815
|
+
if (this.cronReschedule) cron = new CronAccessImpl(this.db, plugin.id, this.cronReschedule);
|
|
816
|
+
let email;
|
|
817
|
+
if (capabilities.has("email:send") && this.emailPipeline?.isAvailable()) {
|
|
818
|
+
const pipeline = this.emailPipeline;
|
|
819
|
+
const pluginId = plugin.id;
|
|
820
|
+
email = { send: (message) => pipeline.send(message, pluginId) };
|
|
821
|
+
}
|
|
822
|
+
return {
|
|
823
|
+
plugin: {
|
|
824
|
+
id: plugin.id,
|
|
825
|
+
version: plugin.version
|
|
826
|
+
},
|
|
827
|
+
storage,
|
|
828
|
+
kv,
|
|
829
|
+
content,
|
|
830
|
+
media,
|
|
831
|
+
http,
|
|
832
|
+
log,
|
|
833
|
+
site: this.site,
|
|
834
|
+
url: this.urlHelper,
|
|
835
|
+
users,
|
|
836
|
+
cron,
|
|
837
|
+
email
|
|
838
|
+
};
|
|
839
|
+
}
|
|
840
|
+
};
|
|
841
|
+
/**
|
|
842
|
+
* Create a plugin context for a resolved plugin
|
|
843
|
+
*/
|
|
844
|
+
function createPluginContext(options, plugin) {
|
|
845
|
+
return new PluginContextFactory(options).createContext(plugin);
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
//#endregion
|
|
849
|
+
export { createPluginContext as n, createStorageAccess as r, PluginContextFactory as t };
|