emdash 0.0.0-a → 0.0.1
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 +87 -1
- package/dist/adapters-BLMa4JGD.d.mts +106 -0
- package/dist/adapters-BLMa4JGD.d.mts.map +1 -0
- package/dist/apply-Bjfq_b4-.mjs +1293 -0
- package/dist/apply-Bjfq_b4-.mjs.map +1 -0
- package/dist/astro/index.d.mts +51 -0
- package/dist/astro/index.d.mts.map +1 -0
- package/dist/astro/index.mjs +1333 -0
- package/dist/astro/index.mjs.map +1 -0
- package/dist/astro/middleware/auth.d.mts +31 -0
- package/dist/astro/middleware/auth.d.mts.map +1 -0
- package/dist/astro/middleware/auth.mjs +654 -0
- package/dist/astro/middleware/auth.mjs.map +1 -0
- package/dist/astro/middleware/redirect.d.mts +22 -0
- package/dist/astro/middleware/redirect.d.mts.map +1 -0
- package/dist/astro/middleware/redirect.mjs +63 -0
- package/dist/astro/middleware/redirect.mjs.map +1 -0
- package/dist/astro/middleware/request-context.d.mts +18 -0
- package/dist/astro/middleware/request-context.d.mts.map +1 -0
- package/dist/astro/middleware/request-context.mjs +1310 -0
- package/dist/astro/middleware/request-context.mjs.map +1 -0
- package/dist/astro/middleware/setup.d.mts +20 -0
- package/dist/astro/middleware/setup.d.mts.map +1 -0
- package/dist/astro/middleware/setup.mjs +47 -0
- package/dist/astro/middleware/setup.mjs.map +1 -0
- package/dist/astro/middleware.d.mts +13 -0
- package/dist/astro/middleware.d.mts.map +1 -0
- package/dist/astro/middleware.mjs +1613 -0
- package/dist/astro/middleware.mjs.map +1 -0
- package/dist/astro/types.d.mts +250 -0
- package/dist/astro/types.d.mts.map +1 -0
- package/dist/astro/types.mjs +1 -0
- package/dist/base64-MBPo9ozB.mjs +59 -0
- package/dist/base64-MBPo9ozB.mjs.map +1 -0
- package/dist/byline-CL847F26.mjs +213 -0
- package/dist/byline-CL847F26.mjs.map +1 -0
- package/dist/bylines-C2a-2TGt.mjs +136 -0
- package/dist/bylines-C2a-2TGt.mjs.map +1 -0
- package/dist/chunk-ClPoSABd.mjs +21 -0
- package/dist/cli/index.d.mts +1 -0
- package/dist/cli/index.mjs +3909 -0
- package/dist/cli/index.mjs.map +1 -0
- package/dist/client/cf-access.d.mts +60 -0
- package/dist/client/cf-access.d.mts.map +1 -0
- package/dist/client/cf-access.mjs +179 -0
- package/dist/client/cf-access.mjs.map +1 -0
- package/dist/client/index.d.mts +398 -0
- package/dist/client/index.d.mts.map +1 -0
- package/dist/client/index.mjs +346 -0
- package/dist/client/index.mjs.map +1 -0
- package/dist/config-CKE8p9xM.mjs +55 -0
- package/dist/config-CKE8p9xM.mjs.map +1 -0
- package/dist/connection-B4zVnQIa.mjs +40 -0
- package/dist/connection-B4zVnQIa.mjs.map +1 -0
- package/dist/content-D6C2WsZC.mjs +824 -0
- package/dist/content-D6C2WsZC.mjs.map +1 -0
- package/dist/db/index.d.mts +4 -0
- package/dist/db/index.mjs +62 -0
- package/dist/db/index.mjs.map +1 -0
- package/dist/db/libsql.d.mts +11 -0
- package/dist/db/libsql.d.mts.map +1 -0
- package/dist/db/libsql.mjs +17 -0
- package/dist/db/libsql.mjs.map +1 -0
- package/dist/db/postgres.d.mts +11 -0
- package/dist/db/postgres.d.mts.map +1 -0
- package/dist/db/postgres.mjs +30 -0
- package/dist/db/postgres.mjs.map +1 -0
- package/dist/db/sqlite.d.mts +11 -0
- package/dist/db/sqlite.d.mts.map +1 -0
- package/dist/db/sqlite.mjs +16 -0
- package/dist/db/sqlite.mjs.map +1 -0
- package/dist/default-Cyi4aAxu.mjs +81 -0
- package/dist/default-Cyi4aAxu.mjs.map +1 -0
- package/dist/dialect-helpers-B9uSp2GJ.mjs +90 -0
- package/dist/dialect-helpers-B9uSp2GJ.mjs.map +1 -0
- package/dist/error-Cxz0tQeO.mjs +27 -0
- package/dist/error-Cxz0tQeO.mjs.map +1 -0
- package/dist/index-C1xF3OGh.d.mts +4527 -0
- package/dist/index-C1xF3OGh.d.mts.map +1 -0
- package/dist/index.d.mts +16 -0
- package/dist/index.mjs +30 -0
- package/dist/load-yOOlckBj.mjs +28 -0
- package/dist/load-yOOlckBj.mjs.map +1 -0
- package/dist/loader-fz8Q_3EO.mjs +447 -0
- package/dist/loader-fz8Q_3EO.mjs.map +1 -0
- package/dist/manifest-schema-Dcl0R6nM.mjs +184 -0
- package/dist/manifest-schema-Dcl0R6nM.mjs.map +1 -0
- package/dist/media/index.d.mts +26 -0
- package/dist/media/index.d.mts.map +1 -0
- package/dist/media/index.mjs +55 -0
- package/dist/media/index.mjs.map +1 -0
- package/dist/media/local-runtime.d.mts +39 -0
- package/dist/media/local-runtime.d.mts.map +1 -0
- package/dist/media/local-runtime.mjs +133 -0
- package/dist/media/local-runtime.mjs.map +1 -0
- package/dist/media-DqHVh136.mjs +200 -0
- package/dist/media-DqHVh136.mjs.map +1 -0
- package/dist/mode-C2EzN1uE.mjs +23 -0
- package/dist/mode-C2EzN1uE.mjs.map +1 -0
- package/dist/page/index.d.mts +140 -0
- package/dist/page/index.d.mts.map +1 -0
- package/dist/page/index.mjs +416 -0
- package/dist/page/index.mjs.map +1 -0
- package/dist/placeholder-CmGAmqeO.d.mts +276 -0
- package/dist/placeholder-CmGAmqeO.d.mts.map +1 -0
- package/dist/placeholder-SmpOx-_v.mjs +243 -0
- package/dist/placeholder-SmpOx-_v.mjs.map +1 -0
- package/dist/plugin-utils.d.mts +58 -0
- package/dist/plugin-utils.d.mts.map +1 -0
- package/dist/plugin-utils.mjs +78 -0
- package/dist/plugin-utils.mjs.map +1 -0
- package/dist/plugins/adapt-sandbox-entry.d.mts +22 -0
- package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -0
- package/dist/plugins/adapt-sandbox-entry.mjs +113 -0
- package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -0
- package/dist/query-CS_iSj34.mjs +460 -0
- package/dist/query-CS_iSj34.mjs.map +1 -0
- package/dist/redirect-DIfIni3r.mjs +329 -0
- package/dist/redirect-DIfIni3r.mjs.map +1 -0
- package/dist/registry-D_w5HW4G.mjs +863 -0
- package/dist/registry-D_w5HW4G.mjs.map +1 -0
- package/dist/request-context.d.mts +49 -0
- package/dist/request-context.d.mts.map +1 -0
- package/dist/request-context.mjs +43 -0
- package/dist/request-context.mjs.map +1 -0
- package/dist/runner-B-u2F2b6.mjs +1412 -0
- package/dist/runner-B-u2F2b6.mjs.map +1 -0
- package/dist/runner-EAtf0ZIe.d.mts +27 -0
- package/dist/runner-EAtf0ZIe.d.mts.map +1 -0
- package/dist/runtime.d.mts +26 -0
- package/dist/runtime.d.mts.map +1 -0
- package/dist/runtime.mjs +42 -0
- package/dist/runtime.mjs.map +1 -0
- package/dist/search-DG603UrT.mjs +9211 -0
- package/dist/search-DG603UrT.mjs.map +1 -0
- package/dist/seed/index.d.mts +3 -0
- package/dist/seed/index.mjs +15 -0
- package/dist/seo/index.d.mts +70 -0
- package/dist/seo/index.d.mts.map +1 -0
- package/dist/seo/index.mjs +70 -0
- package/dist/seo/index.mjs.map +1 -0
- package/dist/storage/local.d.mts +39 -0
- package/dist/storage/local.d.mts.map +1 -0
- package/dist/storage/local.mjs +166 -0
- package/dist/storage/local.mjs.map +1 -0
- package/dist/storage/s3.d.mts +32 -0
- package/dist/storage/s3.d.mts.map +1 -0
- package/dist/storage/s3.mjs +175 -0
- package/dist/storage/s3.mjs.map +1 -0
- package/dist/tokens-DpgrkrXK.mjs +171 -0
- package/dist/tokens-DpgrkrXK.mjs.map +1 -0
- package/dist/transport-BFGblqwG.d.mts +42 -0
- package/dist/transport-BFGblqwG.d.mts.map +1 -0
- package/dist/transport-yxiQsi8I.mjs +418 -0
- package/dist/transport-yxiQsi8I.mjs.map +1 -0
- package/dist/types-BRuPJGdV.d.mts +102 -0
- package/dist/types-BRuPJGdV.d.mts.map +1 -0
- package/dist/types-C4-fAxN3.d.mts +182 -0
- package/dist/types-C4-fAxN3.d.mts.map +1 -0
- package/dist/types-CMMN0pNg.mjs +31 -0
- package/dist/types-CMMN0pNg.mjs.map +1 -0
- package/dist/types-CUBbjgmP.mjs +16 -0
- package/dist/types-CUBbjgmP.mjs.map +1 -0
- package/dist/types-DRjfYOEv.d.mts +426 -0
- package/dist/types-DRjfYOEv.d.mts.map +1 -0
- package/dist/types-DY5zk5HN.mjs +73 -0
- package/dist/types-DY5zk5HN.mjs.map +1 -0
- package/dist/types-DaNLHo_T.d.mts +184 -0
- package/dist/types-DaNLHo_T.d.mts.map +1 -0
- package/dist/types-DvhsUmSJ.d.mts +1111 -0
- package/dist/types-DvhsUmSJ.d.mts.map +1 -0
- package/dist/validate-CpBtVMsD.d.mts +378 -0
- package/dist/validate-CpBtVMsD.d.mts.map +1 -0
- package/dist/validate-CqRJb_xU.mjs +97 -0
- package/dist/validate-CqRJb_xU.mjs.map +1 -0
- package/dist/validate-O7PWmlnq.mjs +328 -0
- package/dist/validate-O7PWmlnq.mjs.map +1 -0
- package/locals.d.ts +46 -0
- package/package.json +233 -19
- package/src/api/authorize.ts +63 -0
- package/src/api/csrf.ts +48 -0
- package/src/api/error.ts +99 -0
- package/src/api/errors.ts +445 -0
- package/src/api/escape.ts +9 -0
- package/src/api/handlers/api-tokens.ts +240 -0
- package/src/api/handlers/comments.ts +314 -0
- package/src/api/handlers/content.ts +1315 -0
- package/src/api/handlers/dashboard.ts +205 -0
- package/src/api/handlers/device-flow.ts +687 -0
- package/src/api/handlers/index.ts +163 -0
- package/src/api/handlers/manifest.ts +158 -0
- package/src/api/handlers/marketplace.ts +930 -0
- package/src/api/handlers/media.ts +207 -0
- package/src/api/handlers/menus.ts +493 -0
- package/src/api/handlers/oauth-authorization.ts +429 -0
- package/src/api/handlers/oauth-clients.ts +353 -0
- package/src/api/handlers/oauth-user-lookup.ts +39 -0
- package/src/api/handlers/plugins.ts +254 -0
- package/src/api/handlers/redirects.ts +360 -0
- package/src/api/handlers/revision.ts +145 -0
- package/src/api/handlers/schema.ts +534 -0
- package/src/api/handlers/sections.ts +289 -0
- package/src/api/handlers/seo.ts +115 -0
- package/src/api/handlers/settings.ts +49 -0
- package/src/api/handlers/snapshot.ts +350 -0
- package/src/api/handlers/taxonomies.ts +523 -0
- package/src/api/index.ts +6 -0
- package/src/api/openapi/document.ts +2368 -0
- package/src/api/openapi/index.ts +1 -0
- package/src/api/parse.ts +139 -0
- package/src/api/redirect.ts +14 -0
- package/src/api/rev.ts +67 -0
- package/src/api/schemas/auth.ts +112 -0
- package/src/api/schemas/bylines.ts +85 -0
- package/src/api/schemas/comments.ts +117 -0
- package/src/api/schemas/common.ts +89 -0
- package/src/api/schemas/content.ts +191 -0
- package/src/api/schemas/import.ts +52 -0
- package/src/api/schemas/index.ts +17 -0
- package/src/api/schemas/media.ts +116 -0
- package/src/api/schemas/menus.ts +111 -0
- package/src/api/schemas/redirects.ts +155 -0
- package/src/api/schemas/schema.ts +203 -0
- package/src/api/schemas/search.ts +63 -0
- package/src/api/schemas/sections.ts +67 -0
- package/src/api/schemas/settings.ts +63 -0
- package/src/api/schemas/setup.ts +37 -0
- package/src/api/schemas/taxonomies.ts +113 -0
- package/src/api/schemas/users.ts +96 -0
- package/src/api/schemas/widgets.ts +80 -0
- package/src/api/site-url.ts +25 -0
- package/src/api/types.ts +82 -0
- package/src/astro/index.ts +27 -0
- package/src/astro/integration/index.ts +303 -0
- package/src/astro/integration/routes.ts +834 -0
- package/src/astro/integration/runtime.ts +338 -0
- package/src/astro/integration/virtual-modules.ts +469 -0
- package/src/astro/integration/vite-config.ts +328 -0
- package/src/astro/middleware/auth.ts +743 -0
- package/src/astro/middleware/redirect.ts +89 -0
- package/src/astro/middleware/request-context.ts +129 -0
- package/src/astro/middleware/setup.ts +89 -0
- package/src/astro/middleware.ts +398 -0
- package/src/astro/routes/PluginRegistry.tsx +15 -0
- package/src/astro/routes/admin.astro +81 -0
- package/src/astro/routes/api/admin/allowed-domains/[domain].ts +112 -0
- package/src/astro/routes/api/admin/allowed-domains/index.ts +108 -0
- package/src/astro/routes/api/admin/api-tokens/[id].ts +40 -0
- package/src/astro/routes/api/admin/api-tokens/index.ts +68 -0
- package/src/astro/routes/api/admin/bylines/[id]/index.ts +87 -0
- package/src/astro/routes/api/admin/bylines/index.ts +72 -0
- package/src/astro/routes/api/admin/comments/[id]/status.ts +120 -0
- package/src/astro/routes/api/admin/comments/[id].ts +64 -0
- package/src/astro/routes/api/admin/comments/bulk.ts +42 -0
- package/src/astro/routes/api/admin/comments/counts.ts +30 -0
- package/src/astro/routes/api/admin/comments/index.ts +46 -0
- package/src/astro/routes/api/admin/hooks/exclusive/[hookName].ts +91 -0
- package/src/astro/routes/api/admin/hooks/exclusive/index.ts +51 -0
- package/src/astro/routes/api/admin/oauth-clients/[id].ts +110 -0
- package/src/astro/routes/api/admin/oauth-clients/index.ts +71 -0
- package/src/astro/routes/api/admin/plugins/[id]/disable.ts +39 -0
- package/src/astro/routes/api/admin/plugins/[id]/enable.ts +39 -0
- package/src/astro/routes/api/admin/plugins/[id]/index.ts +38 -0
- package/src/astro/routes/api/admin/plugins/[id]/uninstall.ts +48 -0
- package/src/astro/routes/api/admin/plugins/[id]/update.ts +59 -0
- package/src/astro/routes/api/admin/plugins/index.ts +32 -0
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/icon.ts +61 -0
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/index.ts +33 -0
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/install.ts +62 -0
- package/src/astro/routes/api/admin/plugins/marketplace/index.ts +38 -0
- package/src/astro/routes/api/admin/plugins/updates.ts +28 -0
- package/src/astro/routes/api/admin/themes/marketplace/[id]/index.ts +33 -0
- package/src/astro/routes/api/admin/themes/marketplace/[id]/thumbnail.ts +61 -0
- package/src/astro/routes/api/admin/themes/marketplace/index.ts +45 -0
- package/src/astro/routes/api/admin/users/[id]/disable.ts +69 -0
- package/src/astro/routes/api/admin/users/[id]/enable.ts +48 -0
- package/src/astro/routes/api/admin/users/[id]/index.ts +146 -0
- package/src/astro/routes/api/admin/users/[id]/send-recovery.ts +72 -0
- package/src/astro/routes/api/admin/users/index.ts +66 -0
- package/src/astro/routes/api/auth/dev-bypass.ts +139 -0
- package/src/astro/routes/api/auth/invite/accept.ts +52 -0
- package/src/astro/routes/api/auth/invite/complete.ts +84 -0
- package/src/astro/routes/api/auth/invite/index.ts +99 -0
- package/src/astro/routes/api/auth/logout.ts +40 -0
- package/src/astro/routes/api/auth/magic-link/send.ts +89 -0
- package/src/astro/routes/api/auth/magic-link/verify.ts +71 -0
- package/src/astro/routes/api/auth/me.ts +60 -0
- package/src/astro/routes/api/auth/oauth/[provider]/callback.ts +219 -0
- package/src/astro/routes/api/auth/oauth/[provider].ts +119 -0
- package/src/astro/routes/api/auth/passkey/[id].ts +124 -0
- package/src/astro/routes/api/auth/passkey/index.ts +54 -0
- package/src/astro/routes/api/auth/passkey/options.ts +82 -0
- package/src/astro/routes/api/auth/passkey/register/options.ts +86 -0
- package/src/astro/routes/api/auth/passkey/register/verify.ts +117 -0
- package/src/astro/routes/api/auth/passkey/verify.ts +66 -0
- package/src/astro/routes/api/auth/signup/complete.ts +85 -0
- package/src/astro/routes/api/auth/signup/request.ts +77 -0
- package/src/astro/routes/api/auth/signup/verify.ts +53 -0
- package/src/astro/routes/api/comments/[collection]/[contentId]/index.ts +312 -0
- package/src/astro/routes/api/content/[collection]/[id]/compare.ts +28 -0
- package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +54 -0
- package/src/astro/routes/api/content/[collection]/[id]/duplicate.ts +61 -0
- package/src/astro/routes/api/content/[collection]/[id]/permanent.ts +33 -0
- package/src/astro/routes/api/content/[collection]/[id]/preview-url.ts +107 -0
- package/src/astro/routes/api/content/[collection]/[id]/publish.ts +56 -0
- package/src/astro/routes/api/content/[collection]/[id]/restore.ts +54 -0
- package/src/astro/routes/api/content/[collection]/[id]/revisions.ts +31 -0
- package/src/astro/routes/api/content/[collection]/[id]/schedule.ts +105 -0
- package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +140 -0
- package/src/astro/routes/api/content/[collection]/[id]/translations.ts +30 -0
- package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +56 -0
- package/src/astro/routes/api/content/[collection]/[id].ts +137 -0
- package/src/astro/routes/api/content/[collection]/index.ts +59 -0
- package/src/astro/routes/api/content/[collection]/trash.ts +33 -0
- package/src/astro/routes/api/dashboard.ts +32 -0
- package/src/astro/routes/api/dev/emails.ts +36 -0
- package/src/astro/routes/api/import/probe.ts +47 -0
- package/src/astro/routes/api/import/wordpress/analyze.ts +510 -0
- package/src/astro/routes/api/import/wordpress/execute.ts +283 -0
- package/src/astro/routes/api/import/wordpress/media.ts +338 -0
- package/src/astro/routes/api/import/wordpress/prepare.ts +181 -0
- package/src/astro/routes/api/import/wordpress/rewrite-urls.ts +393 -0
- package/src/astro/routes/api/import/wordpress-plugin/analyze.ts +111 -0
- package/src/astro/routes/api/import/wordpress-plugin/callback.ts +58 -0
- package/src/astro/routes/api/import/wordpress-plugin/execute.ts +347 -0
- package/src/astro/routes/api/manifest.ts +62 -0
- package/src/astro/routes/api/mcp.ts +124 -0
- package/src/astro/routes/api/media/[id]/confirm.ts +93 -0
- package/src/astro/routes/api/media/[id].ts +145 -0
- package/src/astro/routes/api/media/file/[key].ts +79 -0
- package/src/astro/routes/api/media/providers/[providerId]/[itemId].ts +86 -0
- package/src/astro/routes/api/media/providers/[providerId]/index.ts +111 -0
- package/src/astro/routes/api/media/providers/index.ts +30 -0
- package/src/astro/routes/api/media/upload-url.ts +137 -0
- package/src/astro/routes/api/media.ts +190 -0
- package/src/astro/routes/api/menus/[name]/items.ts +87 -0
- package/src/astro/routes/api/menus/[name]/reorder.ts +33 -0
- package/src/astro/routes/api/menus/[name].ts +65 -0
- package/src/astro/routes/api/menus/index.ts +47 -0
- package/src/astro/routes/api/oauth/authorize.ts +412 -0
- package/src/astro/routes/api/oauth/device/authorize.ts +45 -0
- package/src/astro/routes/api/oauth/device/code.ts +51 -0
- package/src/astro/routes/api/oauth/device/token.ts +69 -0
- package/src/astro/routes/api/oauth/token/refresh.ts +38 -0
- package/src/astro/routes/api/oauth/token/revoke.ts +38 -0
- package/src/astro/routes/api/oauth/token.ts +184 -0
- package/src/astro/routes/api/openapi.json.ts +32 -0
- package/src/astro/routes/api/plugins/[pluginId]/[...path].ts +92 -0
- package/src/astro/routes/api/redirects/404s/index.ts +72 -0
- package/src/astro/routes/api/redirects/404s/summary.ts +33 -0
- package/src/astro/routes/api/redirects/[id].ts +84 -0
- package/src/astro/routes/api/redirects/index.ts +52 -0
- package/src/astro/routes/api/revisions/[revisionId]/index.ts +29 -0
- package/src/astro/routes/api/revisions/[revisionId]/restore.ts +62 -0
- package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +76 -0
- package/src/astro/routes/api/schema/collections/[slug]/fields/index.ts +52 -0
- package/src/astro/routes/api/schema/collections/[slug]/fields/reorder.ts +32 -0
- package/src/astro/routes/api/schema/collections/[slug]/index.ts +80 -0
- package/src/astro/routes/api/schema/collections/index.ts +47 -0
- package/src/astro/routes/api/schema/index.ts +109 -0
- package/src/astro/routes/api/schema/orphans/[slug].ts +36 -0
- package/src/astro/routes/api/schema/orphans/index.ts +26 -0
- package/src/astro/routes/api/search/enable.ts +64 -0
- package/src/astro/routes/api/search/index.ts +55 -0
- package/src/astro/routes/api/search/rebuild.ts +72 -0
- package/src/astro/routes/api/search/stats.ts +35 -0
- package/src/astro/routes/api/search/suggest.ts +53 -0
- package/src/astro/routes/api/sections/[slug].ts +84 -0
- package/src/astro/routes/api/sections/index.ts +52 -0
- package/src/astro/routes/api/settings/email.ts +150 -0
- package/src/astro/routes/api/settings.ts +67 -0
- package/src/astro/routes/api/setup/admin-verify.ts +100 -0
- package/src/astro/routes/api/setup/admin.ts +94 -0
- package/src/astro/routes/api/setup/dev-bypass.ts +199 -0
- package/src/astro/routes/api/setup/dev-reset.ts +40 -0
- package/src/astro/routes/api/setup/index.ts +126 -0
- package/src/astro/routes/api/setup/status.ts +122 -0
- package/src/astro/routes/api/snapshot.ts +75 -0
- package/src/astro/routes/api/taxonomies/[name]/terms/[slug].ts +95 -0
- package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +69 -0
- package/src/astro/routes/api/taxonomies/index.ts +59 -0
- package/src/astro/routes/api/themes/preview.ts +77 -0
- package/src/astro/routes/api/typegen.ts +114 -0
- package/src/astro/routes/api/well-known/auth.ts +68 -0
- package/src/astro/routes/api/well-known/oauth-authorization-server.ts +44 -0
- package/src/astro/routes/api/well-known/oauth-protected-resource.ts +37 -0
- package/src/astro/routes/api/widget-areas/[name]/reorder.ts +72 -0
- package/src/astro/routes/api/widget-areas/[name]/widgets/[id].ts +127 -0
- package/src/astro/routes/api/widget-areas/[name]/widgets.ts +80 -0
- package/src/astro/routes/api/widget-areas/[name].ts +87 -0
- package/src/astro/routes/api/widget-areas/index.ts +99 -0
- package/src/astro/routes/api/widget-components.ts +22 -0
- package/src/astro/routes/robots.txt.ts +77 -0
- package/src/astro/routes/sitemap.xml.ts +97 -0
- package/src/astro/storage/adapters.ts +74 -0
- package/src/astro/storage/index.ts +19 -0
- package/src/astro/storage/types.ts +60 -0
- package/src/astro/types.ts +346 -0
- package/src/auth/api-tokens.ts +25 -0
- package/src/auth/challenge-store.ts +80 -0
- package/src/auth/mode.ts +96 -0
- package/src/auth/oauth-state-store.ts +96 -0
- package/src/auth/passkey-config.ts +27 -0
- package/src/auth/rate-limit.ts +158 -0
- package/src/auth/scopes.ts +33 -0
- package/src/auth/types.ts +104 -0
- package/src/aws-sdk.d.ts +100 -0
- package/src/bylines/index.ts +237 -0
- package/src/cleanup.ts +153 -0
- package/src/cli/client-factory.ts +100 -0
- package/src/cli/commands/auth.ts +46 -0
- package/src/cli/commands/bundle-utils.ts +247 -0
- package/src/cli/commands/bundle.ts +609 -0
- package/src/cli/commands/content.ts +442 -0
- package/src/cli/commands/dev.ts +191 -0
- package/src/cli/commands/doctor.ts +211 -0
- package/src/cli/commands/export-seed.ts +630 -0
- package/src/cli/commands/import/wordpress.ts +1056 -0
- package/src/cli/commands/init.ts +192 -0
- package/src/cli/commands/login.ts +547 -0
- package/src/cli/commands/media.ts +165 -0
- package/src/cli/commands/menu.ts +67 -0
- package/src/cli/commands/plugin-init.ts +291 -0
- package/src/cli/commands/plugin-validate.ts +31 -0
- package/src/cli/commands/plugin.ts +33 -0
- package/src/cli/commands/publish.ts +699 -0
- package/src/cli/commands/schema.ts +233 -0
- package/src/cli/commands/search-cmd.ts +54 -0
- package/src/cli/commands/seed.ts +288 -0
- package/src/cli/commands/taxonomy.ts +128 -0
- package/src/cli/commands/types.ts +68 -0
- package/src/cli/credentials.ts +236 -0
- package/src/cli/index.ts +70 -0
- package/src/cli/output.ts +75 -0
- package/src/cli/wxr/parser.ts +969 -0
- package/src/client/cf-access.ts +193 -0
- package/src/client/index.ts +854 -0
- package/src/client/portable-text.ts +413 -0
- package/src/client/transport.ts +200 -0
- package/src/comments/moderator.ts +46 -0
- package/src/comments/notifications.ts +144 -0
- package/src/comments/query.ts +105 -0
- package/src/comments/service.ts +213 -0
- package/src/components/Break.astro +45 -0
- package/src/components/Button.astro +71 -0
- package/src/components/Buttons.astro +49 -0
- package/src/components/Code.astro +59 -0
- package/src/components/Columns.astro +59 -0
- package/src/components/CommentForm.astro +315 -0
- package/src/components/Comments.astro +232 -0
- package/src/components/Cover.astro +128 -0
- package/src/components/EmDashBodyEnd.astro +32 -0
- package/src/components/EmDashBodyStart.astro +32 -0
- package/src/components/EmDashHead.astro +53 -0
- package/src/components/EmDashImage.astro +178 -0
- package/src/components/EmDashMedia.astro +167 -0
- package/src/components/Embed.astro +128 -0
- package/src/components/File.astro +122 -0
- package/src/components/Gallery.astro +93 -0
- package/src/components/HtmlBlock.astro +33 -0
- package/src/components/Image.astro +178 -0
- package/src/components/InlineEditor.astro +27 -0
- package/src/components/InlinePortableTextEditor.tsx +1905 -0
- package/src/components/LiveSearch.astro +614 -0
- package/src/components/PortableText.astro +51 -0
- package/src/components/Pullquote.astro +51 -0
- package/src/components/Table.astro +108 -0
- package/src/components/WidgetArea.astro +22 -0
- package/src/components/WidgetRenderer.astro +72 -0
- package/src/components/index.ts +116 -0
- package/src/components/marks/Link.astro +31 -0
- package/src/components/marks/StrikeThrough.astro +7 -0
- package/src/components/marks/Subscript.astro +7 -0
- package/src/components/marks/Superscript.astro +7 -0
- package/src/components/marks/Underline.astro +7 -0
- package/src/components/widgets/Archives.astro +65 -0
- package/src/components/widgets/Categories.astro +35 -0
- package/src/components/widgets/RecentPosts.astro +51 -0
- package/src/components/widgets/Search.astro +18 -0
- package/src/components/widgets/Tags.astro +38 -0
- package/src/content/converters/index.ts +9 -0
- package/src/content/converters/portable-text-to-prosemirror.ts +385 -0
- package/src/content/converters/prosemirror-to-portable-text.ts +413 -0
- package/src/content/converters/types.ts +120 -0
- package/src/content/index.ts +5 -0
- package/src/database/connection.ts +67 -0
- package/src/database/dialect-helpers.ts +138 -0
- package/src/database/index.ts +5 -0
- package/src/database/migrations/001_initial.ts +136 -0
- package/src/database/migrations/002_media_status.ts +26 -0
- package/src/database/migrations/003_schema_registry.ts +79 -0
- package/src/database/migrations/004_plugins.ts +62 -0
- package/src/database/migrations/005_menus.ts +67 -0
- package/src/database/migrations/006_taxonomy_defs.ts +51 -0
- package/src/database/migrations/007_widgets.ts +42 -0
- package/src/database/migrations/008_auth.ts +194 -0
- package/src/database/migrations/009_user_disabled.ts +27 -0
- package/src/database/migrations/011_sections.ts +65 -0
- package/src/database/migrations/012_search.ts +25 -0
- package/src/database/migrations/013_scheduled_publishing.ts +51 -0
- package/src/database/migrations/014_draft_revisions.ts +72 -0
- package/src/database/migrations/015_indexes.ts +82 -0
- package/src/database/migrations/016_api_tokens.ts +89 -0
- package/src/database/migrations/017_authorization_codes.ts +45 -0
- package/src/database/migrations/018_seo.ts +56 -0
- package/src/database/migrations/019_i18n.ts +618 -0
- package/src/database/migrations/020_collection_url_pattern.ts +23 -0
- package/src/database/migrations/021_remove_section_categories.ts +43 -0
- package/src/database/migrations/022_marketplace_plugin_state.ts +46 -0
- package/src/database/migrations/023_plugin_metadata.ts +33 -0
- package/src/database/migrations/024_media_placeholders.ts +32 -0
- package/src/database/migrations/025_oauth_clients.ts +28 -0
- package/src/database/migrations/026_cron_tasks.ts +49 -0
- package/src/database/migrations/027_comments.ts +87 -0
- package/src/database/migrations/028_drop_author_url.ts +9 -0
- package/src/database/migrations/029_redirects.ts +67 -0
- package/src/database/migrations/030_widen_scheduled_index.ts +48 -0
- package/src/database/migrations/031_bylines.ts +90 -0
- package/src/database/migrations/032_rate_limits.ts +42 -0
- package/src/database/migrations/runner.ts +170 -0
- package/src/database/repositories/audit.ts +294 -0
- package/src/database/repositories/byline.ts +387 -0
- package/src/database/repositories/comment.ts +458 -0
- package/src/database/repositories/content.ts +1144 -0
- package/src/database/repositories/index.ts +30 -0
- package/src/database/repositories/media.ts +347 -0
- package/src/database/repositories/options.ts +150 -0
- package/src/database/repositories/plugin-storage.ts +373 -0
- package/src/database/repositories/redirect.ts +480 -0
- package/src/database/repositories/revision.ts +200 -0
- package/src/database/repositories/seo.ts +176 -0
- package/src/database/repositories/taxonomy.ts +294 -0
- package/src/database/repositories/types.ts +132 -0
- package/src/database/repositories/user.ts +258 -0
- package/src/database/transaction.ts +54 -0
- package/src/database/types.ts +501 -0
- package/src/database/validate.ts +138 -0
- package/src/db/adapters.ts +125 -0
- package/src/db/index.ts +37 -0
- package/src/db/libsql.ts +23 -0
- package/src/db/postgres.ts +30 -0
- package/src/db/sqlite.ts +27 -0
- package/src/emdash-runtime.ts +2096 -0
- package/src/fields/boolean.ts +34 -0
- package/src/fields/datetime.ts +44 -0
- package/src/fields/file.ts +41 -0
- package/src/fields/image.ts +34 -0
- package/src/fields/index.ts +42 -0
- package/src/fields/integer.ts +50 -0
- package/src/fields/json.ts +37 -0
- package/src/fields/multiselect.ts +48 -0
- package/src/fields/number.ts +52 -0
- package/src/fields/portable-text.ts +33 -0
- package/src/fields/reference.ts +29 -0
- package/src/fields/richtext.ts +31 -0
- package/src/fields/select.ts +46 -0
- package/src/fields/slug.ts +38 -0
- package/src/fields/text.ts +55 -0
- package/src/fields/textarea.ts +52 -0
- package/src/fields/types.ts +64 -0
- package/src/i18n/config.ts +68 -0
- package/src/import/index.ts +90 -0
- package/src/import/menus.ts +436 -0
- package/src/import/registry.ts +111 -0
- package/src/import/sections.ts +103 -0
- package/src/import/settings.ts +281 -0
- package/src/import/sources/wordpress-plugin.ts +641 -0
- package/src/import/sources/wordpress-rest.ts +191 -0
- package/src/import/sources/wxr.ts +330 -0
- package/src/import/ssrf.ts +260 -0
- package/src/import/types.ts +418 -0
- package/src/import/utils.ts +412 -0
- package/src/index.ts +481 -0
- package/src/loader.ts +770 -0
- package/src/mcp/server.ts +1463 -0
- package/src/media/index.ts +32 -0
- package/src/media/local-runtime.ts +213 -0
- package/src/media/local.ts +46 -0
- package/src/media/normalize.ts +190 -0
- package/src/media/placeholder.ts +150 -0
- package/src/media/provider-loader.ts +78 -0
- package/src/media/types.ts +279 -0
- package/src/menus/index.ts +324 -0
- package/src/menus/types.ts +112 -0
- package/src/page/context.ts +93 -0
- package/src/page/fragments.ts +89 -0
- package/src/page/index.ts +58 -0
- package/src/page/jsonld.ts +94 -0
- package/src/page/metadata.ts +185 -0
- package/src/page/seo-contributions.ts +136 -0
- package/src/plugin-utils.ts +80 -0
- package/src/plugins/adapt-sandbox-entry.ts +207 -0
- package/src/plugins/context.ts +833 -0
- package/src/plugins/cron.ts +361 -0
- package/src/plugins/define-plugin.ts +259 -0
- package/src/plugins/email-console.ts +73 -0
- package/src/plugins/email.ts +209 -0
- package/src/plugins/hooks.ts +1273 -0
- package/src/plugins/index.ts +193 -0
- package/src/plugins/manager.ts +595 -0
- package/src/plugins/manifest-schema.ts +230 -0
- package/src/plugins/marketplace.ts +460 -0
- package/src/plugins/request-meta.ts +139 -0
- package/src/plugins/routes.ts +302 -0
- package/src/plugins/sandbox/index.ts +18 -0
- package/src/plugins/sandbox/noop.ts +76 -0
- package/src/plugins/sandbox/types.ts +173 -0
- package/src/plugins/scheduler/node.ts +122 -0
- package/src/plugins/scheduler/piggyback.ts +71 -0
- package/src/plugins/scheduler/types.ts +27 -0
- package/src/plugins/state.ts +208 -0
- package/src/plugins/storage-indexes.ts +326 -0
- package/src/plugins/storage-query.ts +240 -0
- package/src/plugins/types.ts +1284 -0
- package/src/preview/helpers.ts +27 -0
- package/src/preview/index.ts +40 -0
- package/src/preview/tokens.ts +279 -0
- package/src/preview/urls.ts +118 -0
- package/src/query.ts +674 -0
- package/src/redirects/patterns.ts +224 -0
- package/src/request-context.ts +67 -0
- package/src/runtime.ts +21 -0
- package/src/schema/index.ts +29 -0
- package/src/schema/query.ts +44 -0
- package/src/schema/registry.ts +965 -0
- package/src/schema/types.ts +276 -0
- package/src/schema/zod-generator.ts +413 -0
- package/src/search/fts-manager.ts +452 -0
- package/src/search/index.ts +26 -0
- package/src/search/query.ts +396 -0
- package/src/search/text-extraction.ts +162 -0
- package/src/search/types.ts +114 -0
- package/src/sections/index.ts +226 -0
- package/src/sections/types.ts +86 -0
- package/src/seed/apply.ts +1141 -0
- package/src/seed/default.ts +86 -0
- package/src/seed/index.ts +28 -0
- package/src/seed/load.ts +35 -0
- package/src/seed/types.ts +341 -0
- package/src/seed/validate.ts +642 -0
- package/src/seo/index.ts +179 -0
- package/src/settings/index.ts +203 -0
- package/src/settings/types.ts +58 -0
- package/src/storage/index.ts +28 -0
- package/src/storage/local.ts +253 -0
- package/src/storage/s3.ts +271 -0
- package/src/storage/types.ts +204 -0
- package/src/taxonomies/index.ts +309 -0
- package/src/taxonomies/types.ts +61 -0
- package/src/ui.ts +75 -0
- package/src/utils/base64.ts +73 -0
- package/src/utils/hash.ts +36 -0
- package/src/utils/sanitize.ts +20 -0
- package/src/utils/slugify.ts +29 -0
- package/src/utils/url.ts +48 -0
- package/src/virtual-modules.d.ts +111 -0
- package/src/visual-editing/editable.ts +108 -0
- package/src/visual-editing/toolbar.ts +1229 -0
- package/src/widgets/components.ts +105 -0
- package/src/widgets/index.ts +131 -0
- package/src/widgets/types.ts +81 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema field CRUD endpoints
|
|
3
|
+
*
|
|
4
|
+
* GET /_emdash/api/schema/collections/{slug}/fields/{fieldSlug} - Get field
|
|
5
|
+
* PUT /_emdash/api/schema/collections/{slug}/fields/{fieldSlug} - Update field
|
|
6
|
+
* DELETE /_emdash/api/schema/collections/{slug}/fields/{fieldSlug} - Delete field
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { APIRoute } from "astro";
|
|
10
|
+
|
|
11
|
+
import { requirePerm } from "#api/authorize.js";
|
|
12
|
+
import { requireDb, unwrapResult } from "#api/error.js";
|
|
13
|
+
import {
|
|
14
|
+
handleSchemaFieldGet,
|
|
15
|
+
handleSchemaFieldUpdate,
|
|
16
|
+
handleSchemaFieldDelete,
|
|
17
|
+
} from "#api/index.js";
|
|
18
|
+
import { parseBody, isParseError } from "#api/parse.js";
|
|
19
|
+
import { updateFieldBody } from "#api/schemas.js";
|
|
20
|
+
import type { UpdateFieldInput } from "#schema/types.js";
|
|
21
|
+
|
|
22
|
+
export const prerender = false;
|
|
23
|
+
|
|
24
|
+
export const GET: APIRoute = async ({ params, locals }) => {
|
|
25
|
+
const { emdash, user } = locals;
|
|
26
|
+
const collectionSlug = params.slug!;
|
|
27
|
+
const fieldSlug = params.fieldSlug!;
|
|
28
|
+
|
|
29
|
+
const dbErr = requireDb(emdash?.db);
|
|
30
|
+
if (dbErr) return dbErr;
|
|
31
|
+
|
|
32
|
+
const denied = requirePerm(user, "schema:read");
|
|
33
|
+
if (denied) return denied;
|
|
34
|
+
|
|
35
|
+
const result = await handleSchemaFieldGet(emdash!.db, collectionSlug, fieldSlug);
|
|
36
|
+
return unwrapResult(result);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const PUT: APIRoute = async ({ params, request, locals }) => {
|
|
40
|
+
const { emdash, user } = locals;
|
|
41
|
+
const collectionSlug = params.slug!;
|
|
42
|
+
const fieldSlug = params.fieldSlug!;
|
|
43
|
+
|
|
44
|
+
const dbErr = requireDb(emdash?.db);
|
|
45
|
+
if (dbErr) return dbErr;
|
|
46
|
+
|
|
47
|
+
const denied = requirePerm(user, "schema:manage");
|
|
48
|
+
if (denied) return denied;
|
|
49
|
+
|
|
50
|
+
const body = await parseBody(request, updateFieldBody);
|
|
51
|
+
if (isParseError(body)) return body;
|
|
52
|
+
|
|
53
|
+
// eslint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- body is Zod-validated via parseBody(request, updateFieldBody) above
|
|
54
|
+
const result = await handleSchemaFieldUpdate(
|
|
55
|
+
emdash!.db,
|
|
56
|
+
collectionSlug,
|
|
57
|
+
fieldSlug,
|
|
58
|
+
body as UpdateFieldInput,
|
|
59
|
+
);
|
|
60
|
+
return unwrapResult(result);
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export const DELETE: APIRoute = async ({ params, locals }) => {
|
|
64
|
+
const { emdash, user } = locals;
|
|
65
|
+
const collectionSlug = params.slug!;
|
|
66
|
+
const fieldSlug = params.fieldSlug!;
|
|
67
|
+
|
|
68
|
+
const dbErr = requireDb(emdash?.db);
|
|
69
|
+
if (dbErr) return dbErr;
|
|
70
|
+
|
|
71
|
+
const denied = requirePerm(user, "schema:manage");
|
|
72
|
+
if (denied) return denied;
|
|
73
|
+
|
|
74
|
+
const result = await handleSchemaFieldDelete(emdash!.db, collectionSlug, fieldSlug);
|
|
75
|
+
return unwrapResult(result);
|
|
76
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema fields list and create endpoints
|
|
3
|
+
*
|
|
4
|
+
* GET /_emdash/api/schema/collections/{slug}/fields - List fields
|
|
5
|
+
* POST /_emdash/api/schema/collections/{slug}/fields - Create field
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { APIRoute } from "astro";
|
|
9
|
+
|
|
10
|
+
import { requirePerm } from "#api/authorize.js";
|
|
11
|
+
import { requireDb, unwrapResult } from "#api/error.js";
|
|
12
|
+
import { handleSchemaFieldList, handleSchemaFieldCreate } from "#api/index.js";
|
|
13
|
+
import { parseBody, isParseError } from "#api/parse.js";
|
|
14
|
+
import { createFieldBody } from "#api/schemas.js";
|
|
15
|
+
import type { CreateFieldInput } from "#schema/types.js";
|
|
16
|
+
|
|
17
|
+
export const prerender = false;
|
|
18
|
+
|
|
19
|
+
export const GET: APIRoute = async ({ params, locals }) => {
|
|
20
|
+
const { emdash, user } = locals;
|
|
21
|
+
const collectionSlug = params.slug!;
|
|
22
|
+
|
|
23
|
+
const dbErr = requireDb(emdash?.db);
|
|
24
|
+
if (dbErr) return dbErr;
|
|
25
|
+
|
|
26
|
+
const denied = requirePerm(user, "schema:read");
|
|
27
|
+
if (denied) return denied;
|
|
28
|
+
|
|
29
|
+
const result = await handleSchemaFieldList(emdash!.db, collectionSlug);
|
|
30
|
+
return unwrapResult(result);
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export const POST: APIRoute = async ({ params, request, locals }) => {
|
|
34
|
+
const { emdash, user } = locals;
|
|
35
|
+
const collectionSlug = params.slug!;
|
|
36
|
+
|
|
37
|
+
const dbErr = requireDb(emdash?.db);
|
|
38
|
+
if (dbErr) return dbErr;
|
|
39
|
+
|
|
40
|
+
const denied = requirePerm(user, "schema:manage");
|
|
41
|
+
if (denied) return denied;
|
|
42
|
+
|
|
43
|
+
const body = await parseBody(request, createFieldBody);
|
|
44
|
+
if (isParseError(body)) return body;
|
|
45
|
+
|
|
46
|
+
const result = await handleSchemaFieldCreate(
|
|
47
|
+
emdash!.db,
|
|
48
|
+
collectionSlug,
|
|
49
|
+
body as CreateFieldInput,
|
|
50
|
+
);
|
|
51
|
+
return unwrapResult(result, 201);
|
|
52
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema field reorder endpoint
|
|
3
|
+
*
|
|
4
|
+
* POST /_emdash/api/schema/collections/{slug}/fields/reorder - Reorder fields
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { APIRoute } from "astro";
|
|
8
|
+
|
|
9
|
+
import { requirePerm } from "#api/authorize.js";
|
|
10
|
+
import { requireDb, unwrapResult } from "#api/error.js";
|
|
11
|
+
import { handleSchemaFieldReorder } from "#api/index.js";
|
|
12
|
+
import { parseBody, isParseError } from "#api/parse.js";
|
|
13
|
+
import { fieldReorderBody } from "#api/schemas.js";
|
|
14
|
+
|
|
15
|
+
export const prerender = false;
|
|
16
|
+
|
|
17
|
+
export const POST: APIRoute = async ({ params, request, locals }) => {
|
|
18
|
+
const { emdash, user } = locals;
|
|
19
|
+
const collectionSlug = params.slug!;
|
|
20
|
+
|
|
21
|
+
const dbErr = requireDb(emdash?.db);
|
|
22
|
+
if (dbErr) return dbErr;
|
|
23
|
+
|
|
24
|
+
const denied = requirePerm(user, "schema:manage");
|
|
25
|
+
if (denied) return denied;
|
|
26
|
+
|
|
27
|
+
const body = await parseBody(request, fieldReorderBody);
|
|
28
|
+
if (isParseError(body)) return body;
|
|
29
|
+
|
|
30
|
+
const result = await handleSchemaFieldReorder(emdash!.db, collectionSlug, body.fieldSlugs);
|
|
31
|
+
return unwrapResult(result);
|
|
32
|
+
};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema collection CRUD endpoints
|
|
3
|
+
*
|
|
4
|
+
* GET /_emdash/api/schema/collections/{slug} - Get collection
|
|
5
|
+
* PUT /_emdash/api/schema/collections/{slug} - Update collection
|
|
6
|
+
* DELETE /_emdash/api/schema/collections/{slug} - Delete collection
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { APIRoute } from "astro";
|
|
10
|
+
|
|
11
|
+
import { requirePerm } from "#api/authorize.js";
|
|
12
|
+
import { requireDb, unwrapResult } from "#api/error.js";
|
|
13
|
+
import {
|
|
14
|
+
handleSchemaCollectionGet,
|
|
15
|
+
handleSchemaCollectionUpdate,
|
|
16
|
+
handleSchemaCollectionDelete,
|
|
17
|
+
} from "#api/index.js";
|
|
18
|
+
import { parseBody, parseQuery, isParseError } from "#api/parse.js";
|
|
19
|
+
import { collectionGetQuery, updateCollectionBody } from "#api/schemas.js";
|
|
20
|
+
import type { UpdateCollectionInput } from "#schema/types.js";
|
|
21
|
+
|
|
22
|
+
export const prerender = false;
|
|
23
|
+
|
|
24
|
+
export const GET: APIRoute = async ({ params, url, locals }) => {
|
|
25
|
+
const { emdash, user } = locals;
|
|
26
|
+
const slug = params.slug!;
|
|
27
|
+
|
|
28
|
+
const dbErr = requireDb(emdash?.db);
|
|
29
|
+
if (dbErr) return dbErr;
|
|
30
|
+
|
|
31
|
+
const denied = requirePerm(user, "schema:read");
|
|
32
|
+
if (denied) return denied;
|
|
33
|
+
|
|
34
|
+
const query = parseQuery(url, collectionGetQuery);
|
|
35
|
+
if (isParseError(query)) return query;
|
|
36
|
+
|
|
37
|
+
const result = await handleSchemaCollectionGet(emdash!.db, slug, {
|
|
38
|
+
includeFields: query.includeFields ?? false,
|
|
39
|
+
});
|
|
40
|
+
return unwrapResult(result);
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export const PUT: APIRoute = async ({ params, request, locals }) => {
|
|
44
|
+
const { emdash, user } = locals;
|
|
45
|
+
const slug = params.slug!;
|
|
46
|
+
|
|
47
|
+
const dbErr = requireDb(emdash?.db);
|
|
48
|
+
if (dbErr) return dbErr;
|
|
49
|
+
|
|
50
|
+
const denied = requirePerm(user, "schema:manage");
|
|
51
|
+
if (denied) return denied;
|
|
52
|
+
|
|
53
|
+
const body = await parseBody(request, updateCollectionBody);
|
|
54
|
+
if (isParseError(body)) return body;
|
|
55
|
+
|
|
56
|
+
const result = await handleSchemaCollectionUpdate(
|
|
57
|
+
emdash!.db,
|
|
58
|
+
slug,
|
|
59
|
+
// eslint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- parseBody validates via Zod
|
|
60
|
+
body as UpdateCollectionInput,
|
|
61
|
+
);
|
|
62
|
+
return unwrapResult(result);
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export const DELETE: APIRoute = async ({ params, url, locals }) => {
|
|
66
|
+
const { emdash, user } = locals;
|
|
67
|
+
const slug = params.slug!;
|
|
68
|
+
const force = url.searchParams.get("force") === "true";
|
|
69
|
+
|
|
70
|
+
const dbErr = requireDb(emdash?.db);
|
|
71
|
+
if (dbErr) return dbErr;
|
|
72
|
+
|
|
73
|
+
const denied = requirePerm(user, "schema:manage");
|
|
74
|
+
if (denied) return denied;
|
|
75
|
+
|
|
76
|
+
const result = await handleSchemaCollectionDelete(emdash!.db, slug, {
|
|
77
|
+
force,
|
|
78
|
+
});
|
|
79
|
+
return unwrapResult(result);
|
|
80
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema collections list and create endpoints
|
|
3
|
+
*
|
|
4
|
+
* GET /_emdash/api/schema/collections - List collections
|
|
5
|
+
* POST /_emdash/api/schema/collections - Create collection
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { APIRoute } from "astro";
|
|
9
|
+
|
|
10
|
+
import { requirePerm } from "#api/authorize.js";
|
|
11
|
+
import { requireDb, unwrapResult } from "#api/error.js";
|
|
12
|
+
import { handleSchemaCollectionList, handleSchemaCollectionCreate } from "#api/index.js";
|
|
13
|
+
import { parseBody, isParseError } from "#api/parse.js";
|
|
14
|
+
import { createCollectionBody } from "#api/schemas.js";
|
|
15
|
+
import type { CreateCollectionInput } from "#schema/types.js";
|
|
16
|
+
|
|
17
|
+
export const prerender = false;
|
|
18
|
+
|
|
19
|
+
export const GET: APIRoute = async ({ locals }) => {
|
|
20
|
+
const { emdash, user } = locals;
|
|
21
|
+
|
|
22
|
+
const dbErr = requireDb(emdash?.db);
|
|
23
|
+
if (dbErr) return dbErr;
|
|
24
|
+
|
|
25
|
+
const denied = requirePerm(user, "schema:read");
|
|
26
|
+
if (denied) return denied;
|
|
27
|
+
|
|
28
|
+
const result = await handleSchemaCollectionList(emdash!.db);
|
|
29
|
+
return unwrapResult(result);
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export const POST: APIRoute = async ({ request, locals }) => {
|
|
33
|
+
const { emdash, user } = locals;
|
|
34
|
+
|
|
35
|
+
const dbErr = requireDb(emdash?.db);
|
|
36
|
+
if (dbErr) return dbErr;
|
|
37
|
+
|
|
38
|
+
const denied = requirePerm(user, "schema:manage");
|
|
39
|
+
if (denied) return denied;
|
|
40
|
+
|
|
41
|
+
const body = await parseBody(request, createCollectionBody);
|
|
42
|
+
if (isParseError(body)) return body;
|
|
43
|
+
|
|
44
|
+
// eslint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- Zod schema output narrowed to CreateCollectionInput
|
|
45
|
+
const result = await handleSchemaCollectionCreate(emdash!.db, body as CreateCollectionInput);
|
|
46
|
+
return unwrapResult(result, 201);
|
|
47
|
+
};
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema export endpoint for CLI sync
|
|
3
|
+
*
|
|
4
|
+
* GET /_emdash/api/schema - Export full schema (requires schema:read permission)
|
|
5
|
+
*
|
|
6
|
+
* This endpoint is used by:
|
|
7
|
+
* - CLI `emdash types` to fetch schema and generate types
|
|
8
|
+
* - Local dev server to sync schema from remote
|
|
9
|
+
* - CI/CD to detect schema drift
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { APIRoute } from "astro";
|
|
13
|
+
import { hashString } from "emdash";
|
|
14
|
+
|
|
15
|
+
import { requirePerm } from "#api/authorize.js";
|
|
16
|
+
import { handleError, requireDb } from "#api/error.js";
|
|
17
|
+
import { SchemaRegistry } from "#schema/registry.js";
|
|
18
|
+
import { generateTypeScript } from "#schema/zod-generator.js";
|
|
19
|
+
|
|
20
|
+
export const prerender = false;
|
|
21
|
+
|
|
22
|
+
export const GET: APIRoute = async ({ request, locals }) => {
|
|
23
|
+
const { emdash, user } = locals;
|
|
24
|
+
|
|
25
|
+
const dbErr = requireDb(emdash?.db);
|
|
26
|
+
if (dbErr) return dbErr;
|
|
27
|
+
|
|
28
|
+
const denied = requirePerm(user, "schema:read");
|
|
29
|
+
if (denied) return denied;
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
const registry = new SchemaRegistry(emdash!.db);
|
|
33
|
+
|
|
34
|
+
// Get all collections with their fields
|
|
35
|
+
const collections = await registry.listCollections();
|
|
36
|
+
const collectionsWithFields = await Promise.all(
|
|
37
|
+
collections.map(async (c) => {
|
|
38
|
+
const fields = await registry.listFields(c.id);
|
|
39
|
+
return { ...c, fields };
|
|
40
|
+
}),
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
// Check for format parameter
|
|
44
|
+
const url = new URL(request.url);
|
|
45
|
+
const format = url.searchParams.get("format");
|
|
46
|
+
|
|
47
|
+
if (format === "typescript") {
|
|
48
|
+
// Generate TypeScript definitions
|
|
49
|
+
const types = collectionsWithFields.map((c) => generateTypeScript(c)).join("\n\n");
|
|
50
|
+
|
|
51
|
+
const header = `// Generated by EmDash CLI
|
|
52
|
+
// Do not edit manually - run \`emdash types\` to regenerate
|
|
53
|
+
|
|
54
|
+
import type { PortableTextBlock } from "emdash";
|
|
55
|
+
|
|
56
|
+
`;
|
|
57
|
+
|
|
58
|
+
return new Response(header + types, {
|
|
59
|
+
status: 200,
|
|
60
|
+
headers: {
|
|
61
|
+
"Content-Type": "text/typescript",
|
|
62
|
+
"Cache-Control": "private, no-store",
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Default: JSON format
|
|
68
|
+
const schemaExport = {
|
|
69
|
+
collections: collectionsWithFields.map((c) => ({
|
|
70
|
+
slug: c.slug,
|
|
71
|
+
label: c.label,
|
|
72
|
+
labelSingular: c.labelSingular,
|
|
73
|
+
description: c.description,
|
|
74
|
+
icon: c.icon,
|
|
75
|
+
supports: c.supports,
|
|
76
|
+
fields: c.fields.map((f) => ({
|
|
77
|
+
slug: f.slug,
|
|
78
|
+
label: f.label,
|
|
79
|
+
type: f.type,
|
|
80
|
+
required: f.required,
|
|
81
|
+
unique: f.unique,
|
|
82
|
+
defaultValue: f.defaultValue,
|
|
83
|
+
validation: f.validation,
|
|
84
|
+
widget: f.widget,
|
|
85
|
+
options: f.options,
|
|
86
|
+
})),
|
|
87
|
+
})),
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
const version = await hashString(JSON.stringify(schemaExport));
|
|
91
|
+
|
|
92
|
+
return new Response(
|
|
93
|
+
JSON.stringify({
|
|
94
|
+
...schemaExport,
|
|
95
|
+
version,
|
|
96
|
+
}),
|
|
97
|
+
{
|
|
98
|
+
status: 200,
|
|
99
|
+
headers: {
|
|
100
|
+
"Content-Type": "application/json",
|
|
101
|
+
"Cache-Control": "private, no-store",
|
|
102
|
+
"X-Schema-Version": version,
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
);
|
|
106
|
+
} catch (error) {
|
|
107
|
+
return handleError(error, "Schema export failed", "SCHEMA_EXPORT_ERROR");
|
|
108
|
+
}
|
|
109
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Register orphaned table endpoint
|
|
3
|
+
*
|
|
4
|
+
* POST /_emdash/api/schema/orphans/:slug - Register an orphaned table as a collection
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { APIRoute } from "astro";
|
|
8
|
+
|
|
9
|
+
import { requirePerm } from "#api/authorize.js";
|
|
10
|
+
import { apiError, requireDb, unwrapResult } from "#api/error.js";
|
|
11
|
+
import { handleOrphanedTableRegister } from "#api/index.js";
|
|
12
|
+
import { parseOptionalBody, isParseError } from "#api/parse.js";
|
|
13
|
+
import { orphanRegisterBody } from "#api/schemas.js";
|
|
14
|
+
|
|
15
|
+
export const prerender = false;
|
|
16
|
+
|
|
17
|
+
export const POST: APIRoute = async ({ params, request, locals }) => {
|
|
18
|
+
const { emdash, user } = locals;
|
|
19
|
+
|
|
20
|
+
const dbErr = requireDb(emdash?.db);
|
|
21
|
+
if (dbErr) return dbErr;
|
|
22
|
+
|
|
23
|
+
const denied = requirePerm(user, "schema:manage");
|
|
24
|
+
if (denied) return denied;
|
|
25
|
+
|
|
26
|
+
const slug = params.slug;
|
|
27
|
+
if (!slug) {
|
|
28
|
+
return apiError("VALIDATION_ERROR", "Slug is required", 400);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const options = await parseOptionalBody(request, orphanRegisterBody, {});
|
|
32
|
+
if (isParseError(options)) return options;
|
|
33
|
+
|
|
34
|
+
const result = await handleOrphanedTableRegister(emdash!.db, slug, options);
|
|
35
|
+
return unwrapResult(result, 201);
|
|
36
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orphaned tables discovery endpoint
|
|
3
|
+
*
|
|
4
|
+
* GET /_emdash/api/schema/orphans - List orphaned content tables
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { APIRoute } from "astro";
|
|
8
|
+
|
|
9
|
+
import { requirePerm } from "#api/authorize.js";
|
|
10
|
+
import { requireDb, unwrapResult } from "#api/error.js";
|
|
11
|
+
import { handleOrphanedTableList } from "#api/index.js";
|
|
12
|
+
|
|
13
|
+
export const prerender = false;
|
|
14
|
+
|
|
15
|
+
export const GET: APIRoute = async ({ locals }) => {
|
|
16
|
+
const { emdash, user } = locals;
|
|
17
|
+
|
|
18
|
+
const dbErr = requireDb(emdash?.db);
|
|
19
|
+
if (dbErr) return dbErr;
|
|
20
|
+
|
|
21
|
+
const denied = requirePerm(user, "schema:manage");
|
|
22
|
+
if (denied) return denied;
|
|
23
|
+
|
|
24
|
+
const result = await handleOrphanedTableList(emdash!.db);
|
|
25
|
+
return unwrapResult(result);
|
|
26
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search enable/disable endpoint
|
|
3
|
+
*
|
|
4
|
+
* POST /_emdash/api/search/enable
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { APIRoute } from "astro";
|
|
8
|
+
|
|
9
|
+
import { requirePerm } from "#api/authorize.js";
|
|
10
|
+
import { apiError, apiSuccess, handleError } from "#api/error.js";
|
|
11
|
+
import { isParseError, parseBody } from "#api/parse.js";
|
|
12
|
+
import { searchEnableBody } from "#api/schemas.js";
|
|
13
|
+
import { FTSManager } from "#search/index.js";
|
|
14
|
+
|
|
15
|
+
export const prerender = false;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Enable or disable search for a collection
|
|
19
|
+
*
|
|
20
|
+
* Body:
|
|
21
|
+
* - collection: Collection slug (required)
|
|
22
|
+
* - enabled: boolean (required)
|
|
23
|
+
* - weights: Optional field weights for ranking
|
|
24
|
+
*/
|
|
25
|
+
export const POST: APIRoute = async ({ request, locals }) => {
|
|
26
|
+
const { emdash, user } = locals;
|
|
27
|
+
|
|
28
|
+
if (!emdash?.db) {
|
|
29
|
+
return apiError("NOT_CONFIGURED", "EmDash not configured", 500);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const denied = requirePerm(user, "search:manage");
|
|
33
|
+
if (denied) return denied;
|
|
34
|
+
|
|
35
|
+
const body = await parseBody(request, searchEnableBody);
|
|
36
|
+
if (isParseError(body)) return body;
|
|
37
|
+
|
|
38
|
+
const ftsManager = new FTSManager(emdash.db);
|
|
39
|
+
|
|
40
|
+
try {
|
|
41
|
+
if (body.enabled) {
|
|
42
|
+
// Enable search - creates FTS table, triggers, and populates index
|
|
43
|
+
await ftsManager.enableSearch(body.collection, { weights: body.weights });
|
|
44
|
+
|
|
45
|
+
const stats = await ftsManager.getIndexStats(body.collection);
|
|
46
|
+
|
|
47
|
+
return apiSuccess({
|
|
48
|
+
collection: body.collection,
|
|
49
|
+
enabled: true,
|
|
50
|
+
indexed: stats?.indexed ?? 0,
|
|
51
|
+
});
|
|
52
|
+
} else {
|
|
53
|
+
// Disable search - drops FTS table and triggers
|
|
54
|
+
await ftsManager.disableSearch(body.collection);
|
|
55
|
+
|
|
56
|
+
return apiSuccess({
|
|
57
|
+
collection: body.collection,
|
|
58
|
+
enabled: false,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
} catch (error) {
|
|
62
|
+
return handleError(error, "Failed to update search config", "SEARCH_ERROR");
|
|
63
|
+
}
|
|
64
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search endpoint - Full-text search across collections
|
|
3
|
+
*
|
|
4
|
+
* GET /_emdash/api/search?q=query&collections=posts,pages&limit=20
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { APIRoute } from "astro";
|
|
8
|
+
|
|
9
|
+
import { requirePerm } from "#api/authorize.js";
|
|
10
|
+
import { apiError, apiSuccess, handleError } from "#api/error.js";
|
|
11
|
+
import { isParseError, parseQuery } from "#api/parse.js";
|
|
12
|
+
import { searchQuery } from "#api/schemas.js";
|
|
13
|
+
import { searchWithDb } from "#search/index.js";
|
|
14
|
+
|
|
15
|
+
export const prerender = false;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Search content
|
|
19
|
+
*
|
|
20
|
+
* Query parameters:
|
|
21
|
+
* - q: Search query (required)
|
|
22
|
+
* - collections: Comma-separated list of collection slugs (optional, defaults to all)
|
|
23
|
+
* - status: Filter by status (optional, defaults to 'published')
|
|
24
|
+
* - limit: Maximum results (optional, defaults to 20)
|
|
25
|
+
*/
|
|
26
|
+
export const GET: APIRoute = async ({ url, locals }) => {
|
|
27
|
+
const { emdash, user } = locals;
|
|
28
|
+
|
|
29
|
+
const denied = requirePerm(user, "search:read");
|
|
30
|
+
if (denied) return denied;
|
|
31
|
+
|
|
32
|
+
if (!emdash?.db) {
|
|
33
|
+
return apiError("NOT_CONFIGURED", "EmDash not configured", 500);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const query = parseQuery(url, searchQuery);
|
|
37
|
+
if (isParseError(query)) return query;
|
|
38
|
+
|
|
39
|
+
const collections = query.collections
|
|
40
|
+
? query.collections.split(",").map((c: string) => c.trim())
|
|
41
|
+
: undefined;
|
|
42
|
+
|
|
43
|
+
try {
|
|
44
|
+
const result = await searchWithDb(emdash.db, query.q, {
|
|
45
|
+
collections,
|
|
46
|
+
status: query.status,
|
|
47
|
+
locale: query.locale,
|
|
48
|
+
limit: query.limit,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
return apiSuccess(result);
|
|
52
|
+
} catch (error) {
|
|
53
|
+
return handleError(error, "Search failed", "SEARCH_ERROR");
|
|
54
|
+
}
|
|
55
|
+
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search rebuild endpoint - Rebuild FTS index
|
|
3
|
+
*
|
|
4
|
+
* POST /_emdash/api/search/rebuild
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { APIRoute } from "astro";
|
|
8
|
+
|
|
9
|
+
import { requirePerm } from "#api/authorize.js";
|
|
10
|
+
import { apiError, apiSuccess, handleError } from "#api/error.js";
|
|
11
|
+
import { isParseError, parseBody } from "#api/parse.js";
|
|
12
|
+
import { searchRebuildBody } from "#api/schemas.js";
|
|
13
|
+
import { FTSManager } from "#search/index.js";
|
|
14
|
+
|
|
15
|
+
export const prerender = false;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Rebuild the search index for a collection
|
|
19
|
+
*
|
|
20
|
+
* Body:
|
|
21
|
+
* - collection: Collection slug to rebuild (required)
|
|
22
|
+
*/
|
|
23
|
+
export const POST: APIRoute = async ({ request, locals }) => {
|
|
24
|
+
const { emdash, user } = locals;
|
|
25
|
+
|
|
26
|
+
if (!emdash?.db) {
|
|
27
|
+
return apiError("NOT_CONFIGURED", "EmDash not configured", 500);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const denied = requirePerm(user, "search:manage");
|
|
31
|
+
if (denied) return denied;
|
|
32
|
+
|
|
33
|
+
const body = await parseBody(request, searchRebuildBody);
|
|
34
|
+
if (isParseError(body)) return body;
|
|
35
|
+
|
|
36
|
+
const ftsManager = new FTSManager(emdash.db);
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
// Get search config for the collection
|
|
40
|
+
const config = await ftsManager.getSearchConfig(body.collection);
|
|
41
|
+
if (!config?.enabled) {
|
|
42
|
+
return apiError(
|
|
43
|
+
"SEARCH_NOT_ENABLED",
|
|
44
|
+
`Search is not enabled for collection "${body.collection}"`,
|
|
45
|
+
400,
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Get searchable fields
|
|
50
|
+
const searchableFields = await ftsManager.getSearchableFields(body.collection);
|
|
51
|
+
if (searchableFields.length === 0) {
|
|
52
|
+
return apiError(
|
|
53
|
+
"NO_SEARCHABLE_FIELDS",
|
|
54
|
+
`No searchable fields defined for collection "${body.collection}"`,
|
|
55
|
+
400,
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Rebuild the index
|
|
60
|
+
await ftsManager.rebuildIndex(body.collection, searchableFields, config.weights);
|
|
61
|
+
|
|
62
|
+
// Get stats after rebuild
|
|
63
|
+
const stats = await ftsManager.getIndexStats(body.collection);
|
|
64
|
+
|
|
65
|
+
return apiSuccess({
|
|
66
|
+
collection: body.collection,
|
|
67
|
+
indexed: stats?.indexed ?? 0,
|
|
68
|
+
});
|
|
69
|
+
} catch (error) {
|
|
70
|
+
return handleError(error, "Failed to rebuild index", "REBUILD_ERROR");
|
|
71
|
+
}
|
|
72
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search stats endpoint
|
|
3
|
+
*
|
|
4
|
+
* GET /_emdash/api/search/stats
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { APIRoute } from "astro";
|
|
8
|
+
|
|
9
|
+
import { requirePerm } from "#api/authorize.js";
|
|
10
|
+
import { apiError, apiSuccess, handleError } from "#api/error.js";
|
|
11
|
+
import { getSearchStats } from "#search/index.js";
|
|
12
|
+
|
|
13
|
+
export const prerender = false;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Get search index statistics
|
|
17
|
+
*/
|
|
18
|
+
export const GET: APIRoute = async ({ locals }) => {
|
|
19
|
+
const { emdash, user } = locals;
|
|
20
|
+
|
|
21
|
+
const denied = requirePerm(user, "search:manage");
|
|
22
|
+
if (denied) return denied;
|
|
23
|
+
|
|
24
|
+
if (!emdash?.db) {
|
|
25
|
+
return apiError("NOT_CONFIGURED", "EmDash not configured", 500);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
try {
|
|
29
|
+
const stats = await getSearchStats(emdash.db);
|
|
30
|
+
|
|
31
|
+
return apiSuccess(stats);
|
|
32
|
+
} catch (error) {
|
|
33
|
+
return handleError(error, "Failed to get stats", "STATS_ERROR");
|
|
34
|
+
}
|
|
35
|
+
};
|