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,80 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Widgets: Input schemas
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
|
|
7
|
+
const widgetType = z.enum(["content", "menu", "component"]);
|
|
8
|
+
|
|
9
|
+
export const createWidgetAreaBody = z
|
|
10
|
+
.object({
|
|
11
|
+
name: z.string().min(1),
|
|
12
|
+
label: z.string().min(1),
|
|
13
|
+
description: z.string().optional(),
|
|
14
|
+
})
|
|
15
|
+
.meta({ id: "CreateWidgetAreaBody" });
|
|
16
|
+
|
|
17
|
+
export const createWidgetBody = z
|
|
18
|
+
.object({
|
|
19
|
+
type: widgetType,
|
|
20
|
+
title: z.string().optional(),
|
|
21
|
+
content: z.array(z.record(z.string(), z.unknown())).optional(),
|
|
22
|
+
menuName: z.string().optional(),
|
|
23
|
+
componentId: z.string().optional(),
|
|
24
|
+
componentProps: z.record(z.string(), z.unknown()).optional(),
|
|
25
|
+
})
|
|
26
|
+
.meta({ id: "CreateWidgetBody" });
|
|
27
|
+
|
|
28
|
+
export const updateWidgetBody = z
|
|
29
|
+
.object({
|
|
30
|
+
type: widgetType.optional(),
|
|
31
|
+
title: z.string().optional(),
|
|
32
|
+
content: z.array(z.record(z.string(), z.unknown())).optional(),
|
|
33
|
+
menuName: z.string().optional(),
|
|
34
|
+
componentId: z.string().optional(),
|
|
35
|
+
componentProps: z.record(z.string(), z.unknown()).optional(),
|
|
36
|
+
})
|
|
37
|
+
.meta({ id: "UpdateWidgetBody" });
|
|
38
|
+
|
|
39
|
+
export const reorderWidgetsBody = z
|
|
40
|
+
.object({
|
|
41
|
+
widgetIds: z.array(z.string().min(1)),
|
|
42
|
+
})
|
|
43
|
+
.meta({ id: "ReorderWidgetsBody" });
|
|
44
|
+
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
// Widgets: Response schemas
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
|
|
49
|
+
export const widgetAreaSchema = z
|
|
50
|
+
.object({
|
|
51
|
+
id: z.string(),
|
|
52
|
+
name: z.string(),
|
|
53
|
+
label: z.string(),
|
|
54
|
+
description: z.string().nullable(),
|
|
55
|
+
created_at: z.string(),
|
|
56
|
+
updated_at: z.string(),
|
|
57
|
+
})
|
|
58
|
+
.meta({ id: "WidgetArea" });
|
|
59
|
+
|
|
60
|
+
export const widgetSchema = z
|
|
61
|
+
.object({
|
|
62
|
+
id: z.string(),
|
|
63
|
+
area_id: z.string(),
|
|
64
|
+
type: z.string(),
|
|
65
|
+
title: z.string().nullable(),
|
|
66
|
+
content: z.string().nullable(),
|
|
67
|
+
menu_name: z.string().nullable(),
|
|
68
|
+
component_id: z.string().nullable(),
|
|
69
|
+
component_props: z.string().nullable(),
|
|
70
|
+
sort_order: z.number().int(),
|
|
71
|
+
created_at: z.string(),
|
|
72
|
+
updated_at: z.string(),
|
|
73
|
+
})
|
|
74
|
+
.meta({ id: "Widget" });
|
|
75
|
+
|
|
76
|
+
export const widgetAreaWithWidgetsSchema = widgetAreaSchema
|
|
77
|
+
.extend({
|
|
78
|
+
widgets: z.array(widgetSchema),
|
|
79
|
+
})
|
|
80
|
+
.meta({ id: "WidgetAreaWithWidgets" });
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the canonical site base URL for use in outbound links (emails, etc.).
|
|
3
|
+
*
|
|
4
|
+
* Uses the stored `emdash:site_url` (set during setup on the real domain)
|
|
5
|
+
* so that Host header spoofing in later requests cannot redirect users to
|
|
6
|
+
* attacker-controlled domains.
|
|
7
|
+
*
|
|
8
|
+
* Falls back to the request URL only if no stored value exists (pre-setup).
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { Kysely } from "kysely";
|
|
12
|
+
|
|
13
|
+
import { OptionsRepository } from "../database/repositories/options.js";
|
|
14
|
+
import type { Database } from "../database/types.js";
|
|
15
|
+
|
|
16
|
+
export async function getSiteBaseUrl(db: Kysely<Database>, request: Request): Promise<string> {
|
|
17
|
+
const options = new OptionsRepository(db);
|
|
18
|
+
const storedUrl = await options.get<string>("emdash:site_url");
|
|
19
|
+
if (storedUrl) {
|
|
20
|
+
return `${storedUrl}/_emdash`;
|
|
21
|
+
}
|
|
22
|
+
// Fallback: derive from request (only reached before setup completes)
|
|
23
|
+
const url = new URL(request.url);
|
|
24
|
+
return `${url.protocol}//${url.host}/_emdash`;
|
|
25
|
+
}
|
package/src/api/types.ts
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API types for EmDash REST endpoints
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { ContentItem } from "../database/repositories/types.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* List response with cursor pagination
|
|
9
|
+
*/
|
|
10
|
+
export interface ListResponse<T> {
|
|
11
|
+
items: T[];
|
|
12
|
+
nextCursor?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Content API responses
|
|
17
|
+
*/
|
|
18
|
+
export interface ContentListResponse extends ListResponse<ContentItem> {}
|
|
19
|
+
|
|
20
|
+
export interface ContentResponse {
|
|
21
|
+
item: ContentItem;
|
|
22
|
+
/** Opaque revision token for optimistic concurrency */
|
|
23
|
+
_rev?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Manifest API response
|
|
28
|
+
*/
|
|
29
|
+
export interface ManifestResponse {
|
|
30
|
+
version: string;
|
|
31
|
+
hash: string;
|
|
32
|
+
collections: Record<
|
|
33
|
+
string,
|
|
34
|
+
{
|
|
35
|
+
label: string;
|
|
36
|
+
labelSingular: string;
|
|
37
|
+
supports: string[];
|
|
38
|
+
fields: Record<string, FieldDescriptor>;
|
|
39
|
+
}
|
|
40
|
+
>;
|
|
41
|
+
plugins: Record<
|
|
42
|
+
string,
|
|
43
|
+
{
|
|
44
|
+
adminPages?: Array<{ path: string; component: string }>;
|
|
45
|
+
widgets?: string[];
|
|
46
|
+
}
|
|
47
|
+
>;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface FieldDescriptor {
|
|
51
|
+
kind: string;
|
|
52
|
+
label?: string;
|
|
53
|
+
required?: boolean;
|
|
54
|
+
options?: Array<{ value: string; label: string }>;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Discriminated union for handler results.
|
|
59
|
+
*
|
|
60
|
+
* Handlers return `ApiResult<T>` -- either `{ success: true, data: T }` or
|
|
61
|
+
* `{ success: false, error: { code, message } }`. The `success` literal
|
|
62
|
+
* enables TypeScript narrowing on `.data`.
|
|
63
|
+
*
|
|
64
|
+
* The generic `E` parameter defaults to `ErrorCode` but can be narrowed to
|
|
65
|
+
* `OAuthErrorCode` for OAuth token-endpoint handlers.
|
|
66
|
+
*
|
|
67
|
+
* Use `unwrapResult()` from `error.ts` to convert to an HTTP Response.
|
|
68
|
+
*/
|
|
69
|
+
export type ApiResult<T, E extends string = string> =
|
|
70
|
+
| { success: true; data: T }
|
|
71
|
+
| {
|
|
72
|
+
success: false;
|
|
73
|
+
error: { code: E; message: string; details?: Record<string, unknown> };
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* API request context
|
|
78
|
+
*/
|
|
79
|
+
export interface ApiContext {
|
|
80
|
+
userId?: string;
|
|
81
|
+
userRole?: string;
|
|
82
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* emdash/astro
|
|
3
|
+
*
|
|
4
|
+
* Astro integration for EmDash CMS (build-time only)
|
|
5
|
+
*
|
|
6
|
+
* For runtime APIs (loader, query functions, dialects), import from "emdash" directly.
|
|
7
|
+
* For Cloudflare-specific adapters (d1, r2, access), import from "@emdash-cms/cloudflare".
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
// Locals types (for typing Astro.locals in API routes)
|
|
11
|
+
export type {
|
|
12
|
+
EmDashHandlers,
|
|
13
|
+
EmDashManifest,
|
|
14
|
+
MediaItem,
|
|
15
|
+
ContentItem,
|
|
16
|
+
ManifestCollection,
|
|
17
|
+
} from "./types.js";
|
|
18
|
+
|
|
19
|
+
// Storage adapters (for integration config)
|
|
20
|
+
// Note: For R2 bindings, use `r2()` from `@emdash-cms/cloudflare`
|
|
21
|
+
export { local, s3 } from "./storage/index.js";
|
|
22
|
+
export type { StorageDescriptor, LocalStorageConfig, S3StorageConfig } from "./storage/index.js";
|
|
23
|
+
|
|
24
|
+
// Integration (build-time only - the emdash() function uses Node.js APIs)
|
|
25
|
+
export { default } from "./integration/index.js";
|
|
26
|
+
export { getStoredConfig } from "./integration/runtime.js";
|
|
27
|
+
export type { EmDashConfig, ResolvedPlugin } from "./integration/runtime.js";
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EmDash Astro Integration
|
|
3
|
+
*
|
|
4
|
+
* This integration:
|
|
5
|
+
* - Injects the admin shell route at /_emdash/admin/[...path].astro
|
|
6
|
+
* - Sets up REST API endpoints under /_emdash/api/*
|
|
7
|
+
* - Configures middleware to provide database and manifest
|
|
8
|
+
*
|
|
9
|
+
* NOTE: This file is for build-time only. Runtime utilities are in runtime.ts
|
|
10
|
+
* to avoid bundling Node.js-only code into the production build.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type { AstroIntegration, AstroIntegrationLogger } from "astro";
|
|
14
|
+
|
|
15
|
+
import type { ResolvedPlugin } from "../../plugins/types.js";
|
|
16
|
+
import { local } from "../storage/adapters.js";
|
|
17
|
+
import { injectCoreRoutes, injectBuiltinAuthRoutes, injectMcpRoute } from "./routes.js";
|
|
18
|
+
import type { EmDashConfig, PluginDescriptor } from "./runtime.js";
|
|
19
|
+
import { createViteConfig } from "./vite-config.js";
|
|
20
|
+
|
|
21
|
+
// Re-export runtime types and functions
|
|
22
|
+
export type {
|
|
23
|
+
EmDashConfig,
|
|
24
|
+
PluginDescriptor,
|
|
25
|
+
SandboxedPluginDescriptor,
|
|
26
|
+
ResolvedPlugin,
|
|
27
|
+
} from "./runtime.js";
|
|
28
|
+
export { getStoredConfig } from "./runtime.js";
|
|
29
|
+
|
|
30
|
+
/** Default storage: Local filesystem in .emdash directory */
|
|
31
|
+
const DEFAULT_STORAGE = local({
|
|
32
|
+
directory: "./.emdash/uploads",
|
|
33
|
+
baseUrl: "/_emdash/api/media/file",
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// Terminal formatting
|
|
37
|
+
const dim = (s: string) => `\x1b[2m${s}\x1b[22m`;
|
|
38
|
+
const bold = (s: string) => `\x1b[1m${s}\x1b[22m`;
|
|
39
|
+
const cyan = (s: string) => `\x1b[36m${s}\x1b[39m`;
|
|
40
|
+
|
|
41
|
+
/** Print the EmDash startup banner */
|
|
42
|
+
function printBanner(_logger: AstroIntegrationLogger): void {
|
|
43
|
+
const banner = `
|
|
44
|
+
|
|
45
|
+
${bold(cyan("E C L I P T I C"))}
|
|
46
|
+
`;
|
|
47
|
+
console.log(banner);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Print route injection summary */
|
|
51
|
+
function printRoutesSummary(_logger: AstroIntegrationLogger): void {
|
|
52
|
+
console.log(`\n ${dim("›")} Admin UI ${cyan("/_emdash/admin")}`);
|
|
53
|
+
console.log(` ${dim("›")} API ${cyan("/_emdash/api/*")}`);
|
|
54
|
+
console.log("");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Create the EmDash Astro integration
|
|
59
|
+
*/
|
|
60
|
+
export function emdash(config: EmDashConfig = {}): AstroIntegration {
|
|
61
|
+
// Apply defaults
|
|
62
|
+
const resolvedConfig: EmDashConfig = {
|
|
63
|
+
...config,
|
|
64
|
+
storage: config.storage ?? DEFAULT_STORAGE,
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// Validate marketplace URL
|
|
68
|
+
if (resolvedConfig.marketplace) {
|
|
69
|
+
const url = resolvedConfig.marketplace;
|
|
70
|
+
try {
|
|
71
|
+
const parsed = new URL(url);
|
|
72
|
+
const isLocalhost = parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1";
|
|
73
|
+
if (parsed.protocol !== "https:" && !isLocalhost) {
|
|
74
|
+
throw new Error(
|
|
75
|
+
`Marketplace URL must use HTTPS (got ${parsed.protocol}). ` +
|
|
76
|
+
`Only localhost URLs are allowed over HTTP.`,
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
} catch (e) {
|
|
80
|
+
if (e instanceof TypeError) {
|
|
81
|
+
throw new Error(`Invalid marketplace URL: "${url}"`, { cause: e });
|
|
82
|
+
}
|
|
83
|
+
throw e;
|
|
84
|
+
}
|
|
85
|
+
if (!resolvedConfig.sandboxRunner) {
|
|
86
|
+
throw new Error(
|
|
87
|
+
"Marketplace requires `sandboxRunner` to be configured. " +
|
|
88
|
+
"Marketplace plugins run in sandboxed V8 isolates.",
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Plugin descriptors from config
|
|
94
|
+
const pluginDescriptors = resolvedConfig.plugins ?? [];
|
|
95
|
+
const sandboxedDescriptors = resolvedConfig.sandboxed ?? [];
|
|
96
|
+
|
|
97
|
+
// Validate all plugin descriptors
|
|
98
|
+
for (const descriptor of [...pluginDescriptors, ...sandboxedDescriptors]) {
|
|
99
|
+
// Standard-format plugins can't use features that require trusted mode
|
|
100
|
+
if (descriptor.format === "standard") {
|
|
101
|
+
if (descriptor.adminEntry) {
|
|
102
|
+
throw new Error(
|
|
103
|
+
`Plugin "${descriptor.id}" is standard format but declares adminEntry. ` +
|
|
104
|
+
`Standard plugins use Block Kit for admin UI, not React components. ` +
|
|
105
|
+
`Remove adminEntry or change format to "native".`,
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
if (descriptor.componentsEntry) {
|
|
109
|
+
throw new Error(
|
|
110
|
+
`Plugin "${descriptor.id}" is standard format but declares componentsEntry. ` +
|
|
111
|
+
`Portable Text block components require native format. ` +
|
|
112
|
+
`Remove componentsEntry or change format to "native".`,
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Validate: non-standard plugins cannot be placed in sandboxed: []
|
|
119
|
+
for (const descriptor of sandboxedDescriptors) {
|
|
120
|
+
if (descriptor.format !== "standard") {
|
|
121
|
+
throw new Error(
|
|
122
|
+
`Plugin "${descriptor.id}" uses the native format and cannot be placed in ` +
|
|
123
|
+
`\`sandboxed: []\`. Native plugins can only run in \`plugins: []\`. ` +
|
|
124
|
+
`To sandbox this plugin, convert it to the standard format.`,
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Resolved plugins (populated at build time by importing entrypoints)
|
|
130
|
+
let _resolvedPlugins: ResolvedPlugin[] = [];
|
|
131
|
+
|
|
132
|
+
// Serialize config for virtual module (database/storage/auth - plugins handled separately)
|
|
133
|
+
// i18n is populated in astro:config:setup from astroConfig.i18n
|
|
134
|
+
const serializableConfig: Record<string, unknown> = {
|
|
135
|
+
database: resolvedConfig.database,
|
|
136
|
+
storage: resolvedConfig.storage,
|
|
137
|
+
auth: resolvedConfig.auth,
|
|
138
|
+
marketplace: resolvedConfig.marketplace,
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
// Determine auth mode for route injection
|
|
142
|
+
// Check if auth is an AuthDescriptor (has entrypoint) indicating external auth
|
|
143
|
+
const useExternalAuth = !!(resolvedConfig.auth && "entrypoint" in resolvedConfig.auth);
|
|
144
|
+
|
|
145
|
+
return {
|
|
146
|
+
name: "emdash",
|
|
147
|
+
hooks: {
|
|
148
|
+
"astro:config:setup": ({
|
|
149
|
+
injectRoute,
|
|
150
|
+
addMiddleware,
|
|
151
|
+
logger,
|
|
152
|
+
updateConfig,
|
|
153
|
+
config: astroConfig,
|
|
154
|
+
command,
|
|
155
|
+
}) => {
|
|
156
|
+
printBanner(logger);
|
|
157
|
+
// Extract i18n config from Astro config
|
|
158
|
+
// Astro locales can be strings OR { path, codes } objects — normalize to paths
|
|
159
|
+
if (astroConfig.i18n) {
|
|
160
|
+
const routing = astroConfig.i18n.routing;
|
|
161
|
+
serializableConfig.i18n = {
|
|
162
|
+
defaultLocale: astroConfig.i18n.defaultLocale,
|
|
163
|
+
locales: astroConfig.i18n.locales.map((l) => (typeof l === "string" ? l : l.path)),
|
|
164
|
+
fallback: astroConfig.i18n.fallback,
|
|
165
|
+
prefixDefaultLocale:
|
|
166
|
+
typeof routing === "object" ? (routing.prefixDefaultLocale ?? false) : false,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Update Vite config with virtual modules and other settings
|
|
171
|
+
updateConfig({
|
|
172
|
+
vite: createViteConfig(
|
|
173
|
+
{
|
|
174
|
+
serializableConfig,
|
|
175
|
+
resolvedConfig,
|
|
176
|
+
pluginDescriptors,
|
|
177
|
+
astroConfig,
|
|
178
|
+
},
|
|
179
|
+
command,
|
|
180
|
+
),
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
// Inject all core routes
|
|
184
|
+
injectCoreRoutes(injectRoute);
|
|
185
|
+
|
|
186
|
+
// Only inject passkey/oauth/magic-link routes when NOT using external auth
|
|
187
|
+
if (!useExternalAuth) {
|
|
188
|
+
injectBuiltinAuthRoutes(injectRoute);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Inject MCP endpoint when enabled
|
|
192
|
+
if (resolvedConfig.mcp) {
|
|
193
|
+
injectMcpRoute(injectRoute);
|
|
194
|
+
logger.info("MCP server enabled at /_emdash/api/mcp");
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// In playground mode, inject the playground middleware FIRST.
|
|
198
|
+
// It sets up a per-session DO database in ALS before anything
|
|
199
|
+
// else runs, so the runtime init middleware sees a real DB.
|
|
200
|
+
if (resolvedConfig.playground) {
|
|
201
|
+
addMiddleware({
|
|
202
|
+
entrypoint: resolvedConfig.playground.middlewareEntrypoint,
|
|
203
|
+
order: "pre",
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Add middleware to provide database and manifest
|
|
208
|
+
addMiddleware({
|
|
209
|
+
entrypoint: "emdash/middleware",
|
|
210
|
+
order: "pre",
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
// Add redirect middleware (runs after runtime init, before setup/auth)
|
|
214
|
+
addMiddleware({
|
|
215
|
+
entrypoint: "emdash/middleware/redirect",
|
|
216
|
+
order: "pre",
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
// Skip setup and auth in playground mode -- the playground middleware
|
|
220
|
+
// handles session creation and injects an anonymous admin user.
|
|
221
|
+
if (!resolvedConfig.playground) {
|
|
222
|
+
addMiddleware({
|
|
223
|
+
entrypoint: "emdash/middleware/setup",
|
|
224
|
+
order: "pre",
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
addMiddleware({
|
|
228
|
+
entrypoint: "emdash/middleware/auth",
|
|
229
|
+
order: "pre",
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Add request context middleware (runs after auth, on ALL routes)
|
|
234
|
+
// Sets up ALS-based context for query functions (edit mode, preview)
|
|
235
|
+
addMiddleware({
|
|
236
|
+
entrypoint: "emdash/middleware/request-context",
|
|
237
|
+
order: "pre",
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
printRoutesSummary(logger);
|
|
241
|
+
},
|
|
242
|
+
"astro:server:setup": ({ server, logger }) => {
|
|
243
|
+
// Generate types once the server is listening.
|
|
244
|
+
// The endpoint returns the types content; we write the file here
|
|
245
|
+
// (in Node) because workerd has no real filesystem access.
|
|
246
|
+
server.httpServer?.once("listening", async () => {
|
|
247
|
+
const { writeFile, readFile } = await import("node:fs/promises");
|
|
248
|
+
const { resolve } = await import("node:path");
|
|
249
|
+
|
|
250
|
+
const address = server.httpServer?.address();
|
|
251
|
+
if (!address || typeof address === "string") return;
|
|
252
|
+
|
|
253
|
+
const port = address.port;
|
|
254
|
+
const typegenUrl = `http://localhost:${port}/_emdash/api/typegen`;
|
|
255
|
+
const outputPath = resolve(process.cwd(), "emdash-env.d.ts");
|
|
256
|
+
|
|
257
|
+
try {
|
|
258
|
+
const response = await fetch(typegenUrl, {
|
|
259
|
+
method: "POST",
|
|
260
|
+
headers: { "Content-Type": "application/json" },
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
if (!response.ok) {
|
|
264
|
+
const body = await response.text().catch(() => "");
|
|
265
|
+
logger.warn(`Typegen failed: ${response.status} ${body.slice(0, 200)}`);
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const { data: result } = (await response.json()) as {
|
|
270
|
+
data: {
|
|
271
|
+
types: string;
|
|
272
|
+
hash: string;
|
|
273
|
+
collections: number;
|
|
274
|
+
};
|
|
275
|
+
};
|
|
276
|
+
|
|
277
|
+
// Only write if content changed
|
|
278
|
+
let needsWrite = true;
|
|
279
|
+
try {
|
|
280
|
+
const existing = await readFile(outputPath, "utf-8");
|
|
281
|
+
if (existing === result.types) needsWrite = false;
|
|
282
|
+
} catch {
|
|
283
|
+
// File doesn't exist yet
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
if (needsWrite) {
|
|
287
|
+
await writeFile(outputPath, result.types, "utf-8");
|
|
288
|
+
logger.info(`Generated emdash-env.d.ts (${result.collections} collections)`);
|
|
289
|
+
}
|
|
290
|
+
} catch (error) {
|
|
291
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
292
|
+
logger.warn(`Typegen failed: ${msg}`);
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
},
|
|
296
|
+
"astro:build:done": ({ logger }) => {
|
|
297
|
+
logger.info("Build complete");
|
|
298
|
+
},
|
|
299
|
+
},
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
export default emdash;
|