emdash 0.0.0-b → 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 -43
- 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,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EmDash Astro types
|
|
3
|
+
*
|
|
4
|
+
* This file re-exports types from the core package and defines
|
|
5
|
+
* the locals interface that the middleware provides.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { Element } from "@emdash-cms/blocks";
|
|
9
|
+
import type { Kysely } from "kysely";
|
|
10
|
+
|
|
11
|
+
// Re-export core types
|
|
12
|
+
export type {
|
|
13
|
+
ContentItem,
|
|
14
|
+
MediaItem,
|
|
15
|
+
ContentListResponse,
|
|
16
|
+
ContentResponse,
|
|
17
|
+
MediaListResponse,
|
|
18
|
+
MediaResponse,
|
|
19
|
+
Storage,
|
|
20
|
+
Database,
|
|
21
|
+
} from "../index.js";
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Manifest collection definition
|
|
25
|
+
*/
|
|
26
|
+
export interface ManifestCollection {
|
|
27
|
+
label: string;
|
|
28
|
+
labelSingular: string;
|
|
29
|
+
supports: string[];
|
|
30
|
+
hasSeo: boolean;
|
|
31
|
+
fields: Record<
|
|
32
|
+
string,
|
|
33
|
+
{
|
|
34
|
+
kind: string;
|
|
35
|
+
label?: string;
|
|
36
|
+
required?: boolean;
|
|
37
|
+
widget?: string;
|
|
38
|
+
options?: Array<{ value: string; label: string }>;
|
|
39
|
+
}
|
|
40
|
+
>;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Plugin manifest entry in the admin manifest
|
|
45
|
+
*/
|
|
46
|
+
export interface ManifestPlugin {
|
|
47
|
+
version?: string;
|
|
48
|
+
/** Package name for dynamic import (e.g., "@emdash-cms/plugin-audit-log") */
|
|
49
|
+
package?: string;
|
|
50
|
+
/** Whether the plugin is currently enabled */
|
|
51
|
+
enabled?: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* How this plugin renders its admin UI:
|
|
54
|
+
* - "react": Trusted plugin with React components (default for trusted plugins)
|
|
55
|
+
* - "blocks": Declarative Block Kit UI via admin route handler
|
|
56
|
+
* - "none": No admin UI
|
|
57
|
+
*/
|
|
58
|
+
adminMode?: "react" | "blocks" | "none";
|
|
59
|
+
adminPages?: Array<{
|
|
60
|
+
path: string;
|
|
61
|
+
label?: string;
|
|
62
|
+
icon?: string;
|
|
63
|
+
}>;
|
|
64
|
+
dashboardWidgets?: Array<{
|
|
65
|
+
id: string;
|
|
66
|
+
title?: string;
|
|
67
|
+
size?: string;
|
|
68
|
+
}>;
|
|
69
|
+
fieldWidgets?: Array<{
|
|
70
|
+
name: string;
|
|
71
|
+
label: string;
|
|
72
|
+
fieldTypes: string[];
|
|
73
|
+
elements?: Element[];
|
|
74
|
+
}>;
|
|
75
|
+
/** Portable Text block types provided by this plugin */
|
|
76
|
+
portableTextBlocks?: Array<{
|
|
77
|
+
type: string;
|
|
78
|
+
label: string;
|
|
79
|
+
icon?: string;
|
|
80
|
+
description?: string;
|
|
81
|
+
placeholder?: string;
|
|
82
|
+
fields?: Element[];
|
|
83
|
+
}>;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Auth mode indicator for the admin UI
|
|
88
|
+
* - "passkey": Built-in passkey authentication (default)
|
|
89
|
+
* - string: External auth provider type (e.g., "cloudflare-access")
|
|
90
|
+
*/
|
|
91
|
+
export type ManifestAuthMode = string;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* The EmDash manifest provided to the admin UI
|
|
95
|
+
*/
|
|
96
|
+
export interface EmDashManifest {
|
|
97
|
+
version: string;
|
|
98
|
+
hash: string;
|
|
99
|
+
collections: Record<string, ManifestCollection>;
|
|
100
|
+
plugins: Record<string, ManifestPlugin>;
|
|
101
|
+
/**
|
|
102
|
+
* Auth mode for the admin UI. When "passkey", the security settings
|
|
103
|
+
* (passkey management, self-signup domains) are shown. When using
|
|
104
|
+
* external auth (e.g., "cloudflare-access"), these are hidden since
|
|
105
|
+
* authentication is handled externally.
|
|
106
|
+
*/
|
|
107
|
+
authMode: ManifestAuthMode;
|
|
108
|
+
/**
|
|
109
|
+
* Whether self-signup is enabled (at least one allowed domain is active).
|
|
110
|
+
* Used by the login page to conditionally show the "Sign up" link.
|
|
111
|
+
*/
|
|
112
|
+
signupEnabled?: boolean;
|
|
113
|
+
/**
|
|
114
|
+
* i18n configuration from Astro config.
|
|
115
|
+
* Only present when i18n is enabled (multiple locales configured).
|
|
116
|
+
*/
|
|
117
|
+
i18n?: {
|
|
118
|
+
defaultLocale: string;
|
|
119
|
+
locales: string[];
|
|
120
|
+
prefixDefaultLocale?: boolean;
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* Whether the plugin marketplace is configured.
|
|
124
|
+
* When true, the admin UI can show marketplace browse/install features.
|
|
125
|
+
*/
|
|
126
|
+
marketplace?: boolean;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Standard handler response shape used by all EmDashHandlers methods.
|
|
131
|
+
*
|
|
132
|
+
* The error shape matches `ApiResult` from the core package — typing it
|
|
133
|
+
* here lets route files use `result.error?.code` without unsafe casts while
|
|
134
|
+
* keeping the data side loosely coupled (defaults to `unknown`).
|
|
135
|
+
*/
|
|
136
|
+
export interface HandlerResponse<T = unknown> {
|
|
137
|
+
success: boolean;
|
|
138
|
+
data?: T;
|
|
139
|
+
error?: {
|
|
140
|
+
code: string;
|
|
141
|
+
message: string;
|
|
142
|
+
details?: Record<string, unknown>;
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* The EmDash API handlers provided via Astro.locals
|
|
148
|
+
*
|
|
149
|
+
* Data types default to `unknown` to avoid tight coupling with the core
|
|
150
|
+
* package. Handlers whose data shape is accessed in route files (e.g.
|
|
151
|
+
* handleContentGet, handleRevisionGet) use narrower types.
|
|
152
|
+
*/
|
|
153
|
+
export interface EmDashHandlers {
|
|
154
|
+
// Content handlers
|
|
155
|
+
handleContentList: (
|
|
156
|
+
collection: string,
|
|
157
|
+
params: {
|
|
158
|
+
cursor?: string;
|
|
159
|
+
limit?: number;
|
|
160
|
+
status?: string;
|
|
161
|
+
orderBy?: string;
|
|
162
|
+
order?: "asc" | "desc";
|
|
163
|
+
locale?: string;
|
|
164
|
+
},
|
|
165
|
+
) => Promise<HandlerResponse>;
|
|
166
|
+
|
|
167
|
+
handleContentGet: (
|
|
168
|
+
collection: string,
|
|
169
|
+
id: string,
|
|
170
|
+
locale?: string,
|
|
171
|
+
) => Promise<
|
|
172
|
+
HandlerResponse<{
|
|
173
|
+
item: {
|
|
174
|
+
id: string;
|
|
175
|
+
authorId: string | null;
|
|
176
|
+
[key: string]: unknown;
|
|
177
|
+
};
|
|
178
|
+
_rev?: string;
|
|
179
|
+
}>
|
|
180
|
+
>;
|
|
181
|
+
|
|
182
|
+
handleContentCreate: (
|
|
183
|
+
collection: string,
|
|
184
|
+
body: {
|
|
185
|
+
data: Record<string, unknown>;
|
|
186
|
+
slug?: string;
|
|
187
|
+
status?: string;
|
|
188
|
+
authorId?: string;
|
|
189
|
+
locale?: string;
|
|
190
|
+
translationOf?: string;
|
|
191
|
+
},
|
|
192
|
+
) => Promise<HandlerResponse>;
|
|
193
|
+
|
|
194
|
+
handleContentUpdate: (
|
|
195
|
+
collection: string,
|
|
196
|
+
id: string,
|
|
197
|
+
body: {
|
|
198
|
+
data?: Record<string, unknown>;
|
|
199
|
+
slug?: string;
|
|
200
|
+
status?: string;
|
|
201
|
+
authorId?: string | null;
|
|
202
|
+
_rev?: string;
|
|
203
|
+
},
|
|
204
|
+
) => Promise<HandlerResponse>;
|
|
205
|
+
|
|
206
|
+
handleContentDelete: (collection: string, id: string) => Promise<HandlerResponse>;
|
|
207
|
+
|
|
208
|
+
// Trash handlers
|
|
209
|
+
handleContentListTrashed: (
|
|
210
|
+
collection: string,
|
|
211
|
+
params?: { cursor?: string; limit?: number },
|
|
212
|
+
) => Promise<HandlerResponse>;
|
|
213
|
+
|
|
214
|
+
handleContentRestore: (collection: string, id: string) => Promise<HandlerResponse>;
|
|
215
|
+
|
|
216
|
+
handleContentPermanentDelete: (collection: string, id: string) => Promise<HandlerResponse>;
|
|
217
|
+
|
|
218
|
+
handleContentCountTrashed: (collection: string) => Promise<HandlerResponse>;
|
|
219
|
+
|
|
220
|
+
handleContentGetIncludingTrashed: (collection: string, id: string) => Promise<HandlerResponse>;
|
|
221
|
+
|
|
222
|
+
handleContentDuplicate: (
|
|
223
|
+
collection: string,
|
|
224
|
+
id: string,
|
|
225
|
+
authorId?: string,
|
|
226
|
+
) => Promise<HandlerResponse>;
|
|
227
|
+
|
|
228
|
+
// Publishing & Scheduling handlers
|
|
229
|
+
handleContentPublish: (collection: string, id: string) => Promise<HandlerResponse>;
|
|
230
|
+
|
|
231
|
+
handleContentUnpublish: (collection: string, id: string) => Promise<HandlerResponse>;
|
|
232
|
+
|
|
233
|
+
handleContentSchedule: (
|
|
234
|
+
collection: string,
|
|
235
|
+
id: string,
|
|
236
|
+
scheduledAt: string,
|
|
237
|
+
) => Promise<HandlerResponse>;
|
|
238
|
+
|
|
239
|
+
handleContentUnschedule: (collection: string, id: string) => Promise<HandlerResponse>;
|
|
240
|
+
|
|
241
|
+
handleContentCountScheduled: (collection: string) => Promise<HandlerResponse>;
|
|
242
|
+
|
|
243
|
+
handleContentDiscardDraft: (collection: string, id: string) => Promise<HandlerResponse>;
|
|
244
|
+
|
|
245
|
+
handleContentCompare: (collection: string, id: string) => Promise<HandlerResponse>;
|
|
246
|
+
|
|
247
|
+
handleContentTranslations: (collection: string, id: string) => Promise<HandlerResponse>;
|
|
248
|
+
|
|
249
|
+
// Media handlers
|
|
250
|
+
handleMediaList: (params: {
|
|
251
|
+
cursor?: string;
|
|
252
|
+
limit?: number;
|
|
253
|
+
mimeType?: string;
|
|
254
|
+
}) => Promise<HandlerResponse>;
|
|
255
|
+
|
|
256
|
+
handleMediaGet: (id: string) => Promise<HandlerResponse>;
|
|
257
|
+
|
|
258
|
+
handleMediaCreate: (input: {
|
|
259
|
+
filename: string;
|
|
260
|
+
mimeType: string;
|
|
261
|
+
size?: number;
|
|
262
|
+
width?: number;
|
|
263
|
+
height?: number;
|
|
264
|
+
storageKey: string;
|
|
265
|
+
contentHash?: string;
|
|
266
|
+
blurhash?: string;
|
|
267
|
+
dominantColor?: string;
|
|
268
|
+
authorId?: string;
|
|
269
|
+
}) => Promise<HandlerResponse>;
|
|
270
|
+
|
|
271
|
+
handleMediaUpdate: (
|
|
272
|
+
id: string,
|
|
273
|
+
input: { alt?: string; caption?: string; width?: number; height?: number },
|
|
274
|
+
) => Promise<HandlerResponse>;
|
|
275
|
+
|
|
276
|
+
handleMediaDelete: (id: string) => Promise<HandlerResponse>;
|
|
277
|
+
|
|
278
|
+
// Revision handlers
|
|
279
|
+
handleRevisionList: (
|
|
280
|
+
collection: string,
|
|
281
|
+
entryId: string,
|
|
282
|
+
params?: { limit?: number },
|
|
283
|
+
) => Promise<HandlerResponse>;
|
|
284
|
+
|
|
285
|
+
handleRevisionGet: (revisionId: string) => Promise<
|
|
286
|
+
HandlerResponse<{
|
|
287
|
+
item: {
|
|
288
|
+
id: string;
|
|
289
|
+
collection: string;
|
|
290
|
+
entryId: string;
|
|
291
|
+
authorId: string | null;
|
|
292
|
+
[key: string]: unknown;
|
|
293
|
+
};
|
|
294
|
+
}>
|
|
295
|
+
>;
|
|
296
|
+
|
|
297
|
+
handleRevisionRestore: (revisionId: string, callerUserId: string) => Promise<HandlerResponse>;
|
|
298
|
+
|
|
299
|
+
// Plugin API route handler
|
|
300
|
+
handlePluginApiRoute: (
|
|
301
|
+
pluginId: string,
|
|
302
|
+
method: string,
|
|
303
|
+
path: string,
|
|
304
|
+
request: Request,
|
|
305
|
+
) => Promise<HandlerResponse>;
|
|
306
|
+
|
|
307
|
+
// Plugin route metadata (for auth decisions before dispatch)
|
|
308
|
+
getPluginRouteMeta: (pluginId: string, path: string) => { public: boolean } | null;
|
|
309
|
+
|
|
310
|
+
// Media provider handlers
|
|
311
|
+
getMediaProvider: (providerId: string) => import("../media/types.js").MediaProvider | undefined;
|
|
312
|
+
getMediaProviderList: () => Array<{
|
|
313
|
+
id: string;
|
|
314
|
+
name: string;
|
|
315
|
+
icon?: string;
|
|
316
|
+
capabilities: import("../media/types.js").MediaProviderCapabilities;
|
|
317
|
+
}>;
|
|
318
|
+
|
|
319
|
+
// Direct access to storage and database for advanced use cases
|
|
320
|
+
storage: import("../index.js").Storage | null;
|
|
321
|
+
db: Kysely<import("../index.js").Database>;
|
|
322
|
+
|
|
323
|
+
// Hook pipeline for plugin integrations
|
|
324
|
+
hooks: import("../plugins/hooks.js").HookPipeline;
|
|
325
|
+
|
|
326
|
+
// Email pipeline for sending emails through the plugin system
|
|
327
|
+
email: import("../plugins/email.js").EmailPipeline | null;
|
|
328
|
+
|
|
329
|
+
// Configured plugins (for plugin management)
|
|
330
|
+
configuredPlugins: import("../plugins/types.js").ResolvedPlugin[];
|
|
331
|
+
|
|
332
|
+
// Configuration (for checking database type, auth mode, etc.)
|
|
333
|
+
config: import("./integration/runtime.js").EmDashConfig;
|
|
334
|
+
|
|
335
|
+
// Manifest invalidation (call after schema changes)
|
|
336
|
+
invalidateManifest: () => void;
|
|
337
|
+
|
|
338
|
+
// Sandbox runner (for marketplace plugin install/update)
|
|
339
|
+
getSandboxRunner: () => import("../plugins/sandbox/types.js").SandboxRunner | null;
|
|
340
|
+
|
|
341
|
+
// Sync marketplace plugin states (after install/update/uninstall)
|
|
342
|
+
syncMarketplacePlugins: () => Promise<void>;
|
|
343
|
+
|
|
344
|
+
// Update plugin enabled/disabled status and rebuild hook pipeline
|
|
345
|
+
setPluginStatus: (pluginId: string, status: "active" | "inactive") => Promise<void>;
|
|
346
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API token generation and hashing utilities.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports from @emdash-cms/auth which owns the implementations.
|
|
5
|
+
* Uses Oslo.js (@oslojs/crypto, @oslojs/encoding) for all crypto.
|
|
6
|
+
*
|
|
7
|
+
* Token format: `ec_pat_<base64url>` (Personal Access Tokens)
|
|
8
|
+
* `ec_oat_<base64url>` (OAuth Access Tokens)
|
|
9
|
+
* `ec_ort_<base64url>` (OAuth Refresh Tokens)
|
|
10
|
+
*
|
|
11
|
+
* Prefix makes tokens identifiable in logs and secret scanners.
|
|
12
|
+
* Only the SHA-256 hash is stored server-side.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export {
|
|
16
|
+
TOKEN_PREFIXES,
|
|
17
|
+
generatePrefixedToken,
|
|
18
|
+
hashPrefixedToken,
|
|
19
|
+
hashPrefixedToken as hashApiToken,
|
|
20
|
+
VALID_SCOPES,
|
|
21
|
+
validateScopes,
|
|
22
|
+
hasScope,
|
|
23
|
+
computeS256Challenge,
|
|
24
|
+
type ApiTokenScope,
|
|
25
|
+
} from "@emdash-cms/auth";
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Challenge store for WebAuthn
|
|
3
|
+
*
|
|
4
|
+
* Stores WebAuthn challenges in a dedicated table with automatic expiration.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { ChallengeStore, ChallengeData } from "@emdash-cms/auth/passkey";
|
|
8
|
+
import type { Kysely } from "kysely";
|
|
9
|
+
|
|
10
|
+
import type { Database } from "../database/types.js";
|
|
11
|
+
|
|
12
|
+
export function createChallengeStore(db: Kysely<Database>): ChallengeStore {
|
|
13
|
+
return {
|
|
14
|
+
async set(challenge: string, data: ChallengeData): Promise<void> {
|
|
15
|
+
const expiresAt = new Date(data.expiresAt).toISOString();
|
|
16
|
+
|
|
17
|
+
await db
|
|
18
|
+
.insertInto("auth_challenges")
|
|
19
|
+
.values({
|
|
20
|
+
challenge,
|
|
21
|
+
type: data.type,
|
|
22
|
+
user_id: data.userId ?? null,
|
|
23
|
+
data: null, // Could store additional context if needed
|
|
24
|
+
expires_at: expiresAt,
|
|
25
|
+
})
|
|
26
|
+
.onConflict((oc) =>
|
|
27
|
+
oc.column("challenge").doUpdateSet({
|
|
28
|
+
type: data.type,
|
|
29
|
+
user_id: data.userId ?? null,
|
|
30
|
+
expires_at: expiresAt,
|
|
31
|
+
}),
|
|
32
|
+
)
|
|
33
|
+
.execute();
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
async get(challenge: string): Promise<ChallengeData | null> {
|
|
37
|
+
const row = await db
|
|
38
|
+
.selectFrom("auth_challenges")
|
|
39
|
+
.selectAll()
|
|
40
|
+
.where("challenge", "=", challenge)
|
|
41
|
+
.executeTakeFirst();
|
|
42
|
+
|
|
43
|
+
if (!row) return null;
|
|
44
|
+
|
|
45
|
+
const expiresAt = new Date(row.expires_at).getTime();
|
|
46
|
+
|
|
47
|
+
// Check expiration
|
|
48
|
+
if (expiresAt < Date.now()) {
|
|
49
|
+
// Expired, delete and return null
|
|
50
|
+
await this.delete(challenge);
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
type: row.type === "registration" ? "registration" : "authentication",
|
|
56
|
+
userId: row.user_id ?? undefined,
|
|
57
|
+
expiresAt,
|
|
58
|
+
};
|
|
59
|
+
},
|
|
60
|
+
|
|
61
|
+
async delete(challenge: string): Promise<void> {
|
|
62
|
+
await db.deleteFrom("auth_challenges").where("challenge", "=", challenge).execute();
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Clean up expired challenges.
|
|
69
|
+
* Should be called periodically (e.g., on startup, or via cron).
|
|
70
|
+
*/
|
|
71
|
+
export async function cleanupExpiredChallenges(db: Kysely<Database>): Promise<number> {
|
|
72
|
+
const now = new Date().toISOString();
|
|
73
|
+
|
|
74
|
+
const result = await db
|
|
75
|
+
.deleteFrom("auth_challenges")
|
|
76
|
+
.where("expires_at", "<", now)
|
|
77
|
+
.executeTakeFirst();
|
|
78
|
+
|
|
79
|
+
return Number(result.numDeletedRows ?? 0);
|
|
80
|
+
}
|
package/src/auth/mode.ts
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Mode Detection
|
|
3
|
+
*
|
|
4
|
+
* Determines which authentication provider is active based on config.
|
|
5
|
+
* Supports both passkey (default) and external auth providers via AuthDescriptor.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { EmDashConfig } from "../astro/integration/runtime.js";
|
|
9
|
+
import type { AuthDescriptor, AuthResult, ExternalAuthConfig } from "./types.js";
|
|
10
|
+
|
|
11
|
+
export type { AuthDescriptor, AuthResult, ExternalAuthConfig };
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Passkey auth mode (default)
|
|
15
|
+
*/
|
|
16
|
+
export interface PasskeyAuthMode {
|
|
17
|
+
type: "passkey";
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* External auth provider mode (Cloudflare Access, etc.)
|
|
22
|
+
*/
|
|
23
|
+
export interface ExternalAuthMode {
|
|
24
|
+
type: "external";
|
|
25
|
+
/** Provider type identifier (e.g., "cloudflare-access") */
|
|
26
|
+
providerType: string;
|
|
27
|
+
/** Module to import for authentication */
|
|
28
|
+
entrypoint: string;
|
|
29
|
+
/** Provider-specific configuration */
|
|
30
|
+
config: unknown;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Union of all auth modes
|
|
35
|
+
*/
|
|
36
|
+
export type AuthMode = PasskeyAuthMode | ExternalAuthMode;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Extended config type with auth.
|
|
40
|
+
*
|
|
41
|
+
* This is the same as `EmDashConfig` with an optional `auth` field.
|
|
42
|
+
* Kept for backwards compatibility — prefer `EmDashConfig` in new code
|
|
43
|
+
* since `getAuthMode` now accepts `EmDashConfig` directly.
|
|
44
|
+
*/
|
|
45
|
+
export interface EmDashConfigWithAuth extends EmDashConfig {
|
|
46
|
+
auth?: AuthDescriptor;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Determine the active auth mode from config.
|
|
51
|
+
*
|
|
52
|
+
* Accepts `EmDashConfig` (or subtype) — checks for `auth` field via duck typing.
|
|
53
|
+
*
|
|
54
|
+
* @param config EmDash configuration
|
|
55
|
+
* @returns The active auth mode
|
|
56
|
+
*/
|
|
57
|
+
export function getAuthMode(
|
|
58
|
+
config: (EmDashConfig & { auth?: AuthDescriptor }) | null | undefined,
|
|
59
|
+
): AuthMode {
|
|
60
|
+
const auth = config?.auth;
|
|
61
|
+
|
|
62
|
+
// Check for AuthDescriptor (new style)
|
|
63
|
+
if (auth && "entrypoint" in auth && auth.entrypoint) {
|
|
64
|
+
return {
|
|
65
|
+
type: "external",
|
|
66
|
+
providerType: auth.type,
|
|
67
|
+
entrypoint: auth.entrypoint,
|
|
68
|
+
config: auth.config,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Default to passkey
|
|
73
|
+
return { type: "passkey" };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Check if an external auth provider is active
|
|
78
|
+
*/
|
|
79
|
+
export function isExternalAuthEnabled(
|
|
80
|
+
config: (EmDashConfig & { auth?: AuthDescriptor }) | null | undefined,
|
|
81
|
+
): boolean {
|
|
82
|
+
return getAuthMode(config).type === "external";
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Get external auth config if enabled
|
|
87
|
+
*/
|
|
88
|
+
export function getExternalAuthConfig(
|
|
89
|
+
config: (EmDashConfig & { auth?: AuthDescriptor }) | null | undefined,
|
|
90
|
+
): ExternalAuthMode | null {
|
|
91
|
+
const mode = getAuthMode(config);
|
|
92
|
+
if (mode.type === "external") {
|
|
93
|
+
return mode;
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth state store
|
|
3
|
+
*
|
|
4
|
+
* Stores OAuth state in the auth_challenges table with automatic expiration.
|
|
5
|
+
* Uses the existing table but with type="oauth" to distinguish from WebAuthn challenges.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { StateStore, OAuthState } from "@emdash-cms/auth";
|
|
9
|
+
import type { Kysely } from "kysely";
|
|
10
|
+
|
|
11
|
+
import type { Database } from "../database/types.js";
|
|
12
|
+
|
|
13
|
+
const OAUTH_STATE_TTL_MS = 10 * 60 * 1000; // 10 minutes
|
|
14
|
+
|
|
15
|
+
export function createOAuthStateStore(db: Kysely<Database>): StateStore {
|
|
16
|
+
return {
|
|
17
|
+
async set(state: string, data: OAuthState): Promise<void> {
|
|
18
|
+
const expiresAt = new Date(Date.now() + OAUTH_STATE_TTL_MS).toISOString();
|
|
19
|
+
|
|
20
|
+
await db
|
|
21
|
+
.insertInto("auth_challenges")
|
|
22
|
+
.values({
|
|
23
|
+
challenge: state,
|
|
24
|
+
type: "oauth",
|
|
25
|
+
user_id: null,
|
|
26
|
+
data: JSON.stringify(data),
|
|
27
|
+
expires_at: expiresAt,
|
|
28
|
+
})
|
|
29
|
+
.onConflict((oc) =>
|
|
30
|
+
oc.column("challenge").doUpdateSet({
|
|
31
|
+
type: "oauth",
|
|
32
|
+
data: JSON.stringify(data),
|
|
33
|
+
expires_at: expiresAt,
|
|
34
|
+
}),
|
|
35
|
+
)
|
|
36
|
+
.execute();
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
async get(state: string): Promise<OAuthState | null> {
|
|
40
|
+
const row = await db
|
|
41
|
+
.selectFrom("auth_challenges")
|
|
42
|
+
.selectAll()
|
|
43
|
+
.where("challenge", "=", state)
|
|
44
|
+
.where("type", "=", "oauth")
|
|
45
|
+
.executeTakeFirst();
|
|
46
|
+
|
|
47
|
+
if (!row) return null;
|
|
48
|
+
|
|
49
|
+
const expiresAt = new Date(row.expires_at).getTime();
|
|
50
|
+
|
|
51
|
+
// Check expiration
|
|
52
|
+
if (expiresAt < Date.now()) {
|
|
53
|
+
// Expired, delete and return null
|
|
54
|
+
await this.delete(state);
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (!row.data) return null;
|
|
59
|
+
|
|
60
|
+
try {
|
|
61
|
+
const parsed: unknown = JSON.parse(row.data);
|
|
62
|
+
if (
|
|
63
|
+
typeof parsed !== "object" ||
|
|
64
|
+
parsed === null ||
|
|
65
|
+
!("provider" in parsed) ||
|
|
66
|
+
typeof parsed.provider !== "string" ||
|
|
67
|
+
!("redirectUri" in parsed) ||
|
|
68
|
+
typeof parsed.redirectUri !== "string"
|
|
69
|
+
) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
const oauthState: OAuthState = {
|
|
73
|
+
provider: parsed.provider,
|
|
74
|
+
redirectUri: parsed.redirectUri,
|
|
75
|
+
};
|
|
76
|
+
if ("codeVerifier" in parsed && typeof parsed.codeVerifier === "string") {
|
|
77
|
+
oauthState.codeVerifier = parsed.codeVerifier;
|
|
78
|
+
}
|
|
79
|
+
if ("nonce" in parsed && typeof parsed.nonce === "string") {
|
|
80
|
+
oauthState.nonce = parsed.nonce;
|
|
81
|
+
}
|
|
82
|
+
return oauthState;
|
|
83
|
+
} catch {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
async delete(state: string): Promise<void> {
|
|
89
|
+
await db
|
|
90
|
+
.deleteFrom("auth_challenges")
|
|
91
|
+
.where("challenge", "=", state)
|
|
92
|
+
.where("type", "=", "oauth")
|
|
93
|
+
.execute();
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Passkey configuration helper
|
|
3
|
+
*
|
|
4
|
+
* Extracts passkey configuration from the request URL.
|
|
5
|
+
* This ensures the rpId and origin are correctly set for both
|
|
6
|
+
* localhost development and production deployments.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export interface PasskeyConfig {
|
|
10
|
+
rpName: string;
|
|
11
|
+
rpId: string;
|
|
12
|
+
origin: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Get passkey configuration from request URL
|
|
17
|
+
*
|
|
18
|
+
* @param url The request URL
|
|
19
|
+
* @param siteName Optional site name for rpName (defaults to hostname)
|
|
20
|
+
*/
|
|
21
|
+
export function getPasskeyConfig(url: URL, siteName?: string): PasskeyConfig {
|
|
22
|
+
return {
|
|
23
|
+
rpName: siteName || url.hostname,
|
|
24
|
+
rpId: url.hostname,
|
|
25
|
+
origin: url.origin,
|
|
26
|
+
};
|
|
27
|
+
}
|