emdash 0.0.0-a → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +87 -1
- package/dist/adapters-BLMa4JGD.d.mts +106 -0
- package/dist/adapters-BLMa4JGD.d.mts.map +1 -0
- package/dist/apply-Bjfq_b4-.mjs +1293 -0
- package/dist/apply-Bjfq_b4-.mjs.map +1 -0
- package/dist/astro/index.d.mts +51 -0
- package/dist/astro/index.d.mts.map +1 -0
- package/dist/astro/index.mjs +1333 -0
- package/dist/astro/index.mjs.map +1 -0
- package/dist/astro/middleware/auth.d.mts +31 -0
- package/dist/astro/middleware/auth.d.mts.map +1 -0
- package/dist/astro/middleware/auth.mjs +654 -0
- package/dist/astro/middleware/auth.mjs.map +1 -0
- package/dist/astro/middleware/redirect.d.mts +22 -0
- package/dist/astro/middleware/redirect.d.mts.map +1 -0
- package/dist/astro/middleware/redirect.mjs +63 -0
- package/dist/astro/middleware/redirect.mjs.map +1 -0
- package/dist/astro/middleware/request-context.d.mts +18 -0
- package/dist/astro/middleware/request-context.d.mts.map +1 -0
- package/dist/astro/middleware/request-context.mjs +1310 -0
- package/dist/astro/middleware/request-context.mjs.map +1 -0
- package/dist/astro/middleware/setup.d.mts +20 -0
- package/dist/astro/middleware/setup.d.mts.map +1 -0
- package/dist/astro/middleware/setup.mjs +47 -0
- package/dist/astro/middleware/setup.mjs.map +1 -0
- package/dist/astro/middleware.d.mts +13 -0
- package/dist/astro/middleware.d.mts.map +1 -0
- package/dist/astro/middleware.mjs +1613 -0
- package/dist/astro/middleware.mjs.map +1 -0
- package/dist/astro/types.d.mts +250 -0
- package/dist/astro/types.d.mts.map +1 -0
- package/dist/astro/types.mjs +1 -0
- package/dist/base64-MBPo9ozB.mjs +59 -0
- package/dist/base64-MBPo9ozB.mjs.map +1 -0
- package/dist/byline-CL847F26.mjs +213 -0
- package/dist/byline-CL847F26.mjs.map +1 -0
- package/dist/bylines-C2a-2TGt.mjs +136 -0
- package/dist/bylines-C2a-2TGt.mjs.map +1 -0
- package/dist/chunk-ClPoSABd.mjs +21 -0
- package/dist/cli/index.d.mts +1 -0
- package/dist/cli/index.mjs +3909 -0
- package/dist/cli/index.mjs.map +1 -0
- package/dist/client/cf-access.d.mts +60 -0
- package/dist/client/cf-access.d.mts.map +1 -0
- package/dist/client/cf-access.mjs +179 -0
- package/dist/client/cf-access.mjs.map +1 -0
- package/dist/client/index.d.mts +398 -0
- package/dist/client/index.d.mts.map +1 -0
- package/dist/client/index.mjs +346 -0
- package/dist/client/index.mjs.map +1 -0
- package/dist/config-CKE8p9xM.mjs +55 -0
- package/dist/config-CKE8p9xM.mjs.map +1 -0
- package/dist/connection-B4zVnQIa.mjs +40 -0
- package/dist/connection-B4zVnQIa.mjs.map +1 -0
- package/dist/content-D6C2WsZC.mjs +824 -0
- package/dist/content-D6C2WsZC.mjs.map +1 -0
- package/dist/db/index.d.mts +4 -0
- package/dist/db/index.mjs +62 -0
- package/dist/db/index.mjs.map +1 -0
- package/dist/db/libsql.d.mts +11 -0
- package/dist/db/libsql.d.mts.map +1 -0
- package/dist/db/libsql.mjs +17 -0
- package/dist/db/libsql.mjs.map +1 -0
- package/dist/db/postgres.d.mts +11 -0
- package/dist/db/postgres.d.mts.map +1 -0
- package/dist/db/postgres.mjs +30 -0
- package/dist/db/postgres.mjs.map +1 -0
- package/dist/db/sqlite.d.mts +11 -0
- package/dist/db/sqlite.d.mts.map +1 -0
- package/dist/db/sqlite.mjs +16 -0
- package/dist/db/sqlite.mjs.map +1 -0
- package/dist/default-Cyi4aAxu.mjs +81 -0
- package/dist/default-Cyi4aAxu.mjs.map +1 -0
- package/dist/dialect-helpers-B9uSp2GJ.mjs +90 -0
- package/dist/dialect-helpers-B9uSp2GJ.mjs.map +1 -0
- package/dist/error-Cxz0tQeO.mjs +27 -0
- package/dist/error-Cxz0tQeO.mjs.map +1 -0
- package/dist/index-C1xF3OGh.d.mts +4527 -0
- package/dist/index-C1xF3OGh.d.mts.map +1 -0
- package/dist/index.d.mts +16 -0
- package/dist/index.mjs +30 -0
- package/dist/load-yOOlckBj.mjs +28 -0
- package/dist/load-yOOlckBj.mjs.map +1 -0
- package/dist/loader-fz8Q_3EO.mjs +447 -0
- package/dist/loader-fz8Q_3EO.mjs.map +1 -0
- package/dist/manifest-schema-Dcl0R6nM.mjs +184 -0
- package/dist/manifest-schema-Dcl0R6nM.mjs.map +1 -0
- package/dist/media/index.d.mts +26 -0
- package/dist/media/index.d.mts.map +1 -0
- package/dist/media/index.mjs +55 -0
- package/dist/media/index.mjs.map +1 -0
- package/dist/media/local-runtime.d.mts +39 -0
- package/dist/media/local-runtime.d.mts.map +1 -0
- package/dist/media/local-runtime.mjs +133 -0
- package/dist/media/local-runtime.mjs.map +1 -0
- package/dist/media-DqHVh136.mjs +200 -0
- package/dist/media-DqHVh136.mjs.map +1 -0
- package/dist/mode-C2EzN1uE.mjs +23 -0
- package/dist/mode-C2EzN1uE.mjs.map +1 -0
- package/dist/page/index.d.mts +140 -0
- package/dist/page/index.d.mts.map +1 -0
- package/dist/page/index.mjs +416 -0
- package/dist/page/index.mjs.map +1 -0
- package/dist/placeholder-CmGAmqeO.d.mts +276 -0
- package/dist/placeholder-CmGAmqeO.d.mts.map +1 -0
- package/dist/placeholder-SmpOx-_v.mjs +243 -0
- package/dist/placeholder-SmpOx-_v.mjs.map +1 -0
- package/dist/plugin-utils.d.mts +58 -0
- package/dist/plugin-utils.d.mts.map +1 -0
- package/dist/plugin-utils.mjs +78 -0
- package/dist/plugin-utils.mjs.map +1 -0
- package/dist/plugins/adapt-sandbox-entry.d.mts +22 -0
- package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -0
- package/dist/plugins/adapt-sandbox-entry.mjs +113 -0
- package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -0
- package/dist/query-CS_iSj34.mjs +460 -0
- package/dist/query-CS_iSj34.mjs.map +1 -0
- package/dist/redirect-DIfIni3r.mjs +329 -0
- package/dist/redirect-DIfIni3r.mjs.map +1 -0
- package/dist/registry-D_w5HW4G.mjs +863 -0
- package/dist/registry-D_w5HW4G.mjs.map +1 -0
- package/dist/request-context.d.mts +49 -0
- package/dist/request-context.d.mts.map +1 -0
- package/dist/request-context.mjs +43 -0
- package/dist/request-context.mjs.map +1 -0
- package/dist/runner-B-u2F2b6.mjs +1412 -0
- package/dist/runner-B-u2F2b6.mjs.map +1 -0
- package/dist/runner-EAtf0ZIe.d.mts +27 -0
- package/dist/runner-EAtf0ZIe.d.mts.map +1 -0
- package/dist/runtime.d.mts +26 -0
- package/dist/runtime.d.mts.map +1 -0
- package/dist/runtime.mjs +42 -0
- package/dist/runtime.mjs.map +1 -0
- package/dist/search-DG603UrT.mjs +9211 -0
- package/dist/search-DG603UrT.mjs.map +1 -0
- package/dist/seed/index.d.mts +3 -0
- package/dist/seed/index.mjs +15 -0
- package/dist/seo/index.d.mts +70 -0
- package/dist/seo/index.d.mts.map +1 -0
- package/dist/seo/index.mjs +70 -0
- package/dist/seo/index.mjs.map +1 -0
- package/dist/storage/local.d.mts +39 -0
- package/dist/storage/local.d.mts.map +1 -0
- package/dist/storage/local.mjs +166 -0
- package/dist/storage/local.mjs.map +1 -0
- package/dist/storage/s3.d.mts +32 -0
- package/dist/storage/s3.d.mts.map +1 -0
- package/dist/storage/s3.mjs +175 -0
- package/dist/storage/s3.mjs.map +1 -0
- package/dist/tokens-DpgrkrXK.mjs +171 -0
- package/dist/tokens-DpgrkrXK.mjs.map +1 -0
- package/dist/transport-BFGblqwG.d.mts +42 -0
- package/dist/transport-BFGblqwG.d.mts.map +1 -0
- package/dist/transport-yxiQsi8I.mjs +418 -0
- package/dist/transport-yxiQsi8I.mjs.map +1 -0
- package/dist/types-BRuPJGdV.d.mts +102 -0
- package/dist/types-BRuPJGdV.d.mts.map +1 -0
- package/dist/types-C4-fAxN3.d.mts +182 -0
- package/dist/types-C4-fAxN3.d.mts.map +1 -0
- package/dist/types-CMMN0pNg.mjs +31 -0
- package/dist/types-CMMN0pNg.mjs.map +1 -0
- package/dist/types-CUBbjgmP.mjs +16 -0
- package/dist/types-CUBbjgmP.mjs.map +1 -0
- package/dist/types-DRjfYOEv.d.mts +426 -0
- package/dist/types-DRjfYOEv.d.mts.map +1 -0
- package/dist/types-DY5zk5HN.mjs +73 -0
- package/dist/types-DY5zk5HN.mjs.map +1 -0
- package/dist/types-DaNLHo_T.d.mts +184 -0
- package/dist/types-DaNLHo_T.d.mts.map +1 -0
- package/dist/types-DvhsUmSJ.d.mts +1111 -0
- package/dist/types-DvhsUmSJ.d.mts.map +1 -0
- package/dist/validate-CpBtVMsD.d.mts +378 -0
- package/dist/validate-CpBtVMsD.d.mts.map +1 -0
- package/dist/validate-CqRJb_xU.mjs +97 -0
- package/dist/validate-CqRJb_xU.mjs.map +1 -0
- package/dist/validate-O7PWmlnq.mjs +328 -0
- package/dist/validate-O7PWmlnq.mjs.map +1 -0
- package/locals.d.ts +46 -0
- package/package.json +233 -19
- package/src/api/authorize.ts +63 -0
- package/src/api/csrf.ts +48 -0
- package/src/api/error.ts +99 -0
- package/src/api/errors.ts +445 -0
- package/src/api/escape.ts +9 -0
- package/src/api/handlers/api-tokens.ts +240 -0
- package/src/api/handlers/comments.ts +314 -0
- package/src/api/handlers/content.ts +1315 -0
- package/src/api/handlers/dashboard.ts +205 -0
- package/src/api/handlers/device-flow.ts +687 -0
- package/src/api/handlers/index.ts +163 -0
- package/src/api/handlers/manifest.ts +158 -0
- package/src/api/handlers/marketplace.ts +930 -0
- package/src/api/handlers/media.ts +207 -0
- package/src/api/handlers/menus.ts +493 -0
- package/src/api/handlers/oauth-authorization.ts +429 -0
- package/src/api/handlers/oauth-clients.ts +353 -0
- package/src/api/handlers/oauth-user-lookup.ts +39 -0
- package/src/api/handlers/plugins.ts +254 -0
- package/src/api/handlers/redirects.ts +360 -0
- package/src/api/handlers/revision.ts +145 -0
- package/src/api/handlers/schema.ts +534 -0
- package/src/api/handlers/sections.ts +289 -0
- package/src/api/handlers/seo.ts +115 -0
- package/src/api/handlers/settings.ts +49 -0
- package/src/api/handlers/snapshot.ts +350 -0
- package/src/api/handlers/taxonomies.ts +523 -0
- package/src/api/index.ts +6 -0
- package/src/api/openapi/document.ts +2368 -0
- package/src/api/openapi/index.ts +1 -0
- package/src/api/parse.ts +139 -0
- package/src/api/redirect.ts +14 -0
- package/src/api/rev.ts +67 -0
- package/src/api/schemas/auth.ts +112 -0
- package/src/api/schemas/bylines.ts +85 -0
- package/src/api/schemas/comments.ts +117 -0
- package/src/api/schemas/common.ts +89 -0
- package/src/api/schemas/content.ts +191 -0
- package/src/api/schemas/import.ts +52 -0
- package/src/api/schemas/index.ts +17 -0
- package/src/api/schemas/media.ts +116 -0
- package/src/api/schemas/menus.ts +111 -0
- package/src/api/schemas/redirects.ts +155 -0
- package/src/api/schemas/schema.ts +203 -0
- package/src/api/schemas/search.ts +63 -0
- package/src/api/schemas/sections.ts +67 -0
- package/src/api/schemas/settings.ts +63 -0
- package/src/api/schemas/setup.ts +37 -0
- package/src/api/schemas/taxonomies.ts +113 -0
- package/src/api/schemas/users.ts +96 -0
- package/src/api/schemas/widgets.ts +80 -0
- package/src/api/site-url.ts +25 -0
- package/src/api/types.ts +82 -0
- package/src/astro/index.ts +27 -0
- package/src/astro/integration/index.ts +303 -0
- package/src/astro/integration/routes.ts +834 -0
- package/src/astro/integration/runtime.ts +338 -0
- package/src/astro/integration/virtual-modules.ts +469 -0
- package/src/astro/integration/vite-config.ts +328 -0
- package/src/astro/middleware/auth.ts +743 -0
- package/src/astro/middleware/redirect.ts +89 -0
- package/src/astro/middleware/request-context.ts +129 -0
- package/src/astro/middleware/setup.ts +89 -0
- package/src/astro/middleware.ts +398 -0
- package/src/astro/routes/PluginRegistry.tsx +15 -0
- package/src/astro/routes/admin.astro +81 -0
- package/src/astro/routes/api/admin/allowed-domains/[domain].ts +112 -0
- package/src/astro/routes/api/admin/allowed-domains/index.ts +108 -0
- package/src/astro/routes/api/admin/api-tokens/[id].ts +40 -0
- package/src/astro/routes/api/admin/api-tokens/index.ts +68 -0
- package/src/astro/routes/api/admin/bylines/[id]/index.ts +87 -0
- package/src/astro/routes/api/admin/bylines/index.ts +72 -0
- package/src/astro/routes/api/admin/comments/[id]/status.ts +120 -0
- package/src/astro/routes/api/admin/comments/[id].ts +64 -0
- package/src/astro/routes/api/admin/comments/bulk.ts +42 -0
- package/src/astro/routes/api/admin/comments/counts.ts +30 -0
- package/src/astro/routes/api/admin/comments/index.ts +46 -0
- package/src/astro/routes/api/admin/hooks/exclusive/[hookName].ts +91 -0
- package/src/astro/routes/api/admin/hooks/exclusive/index.ts +51 -0
- package/src/astro/routes/api/admin/oauth-clients/[id].ts +110 -0
- package/src/astro/routes/api/admin/oauth-clients/index.ts +71 -0
- package/src/astro/routes/api/admin/plugins/[id]/disable.ts +39 -0
- package/src/astro/routes/api/admin/plugins/[id]/enable.ts +39 -0
- package/src/astro/routes/api/admin/plugins/[id]/index.ts +38 -0
- package/src/astro/routes/api/admin/plugins/[id]/uninstall.ts +48 -0
- package/src/astro/routes/api/admin/plugins/[id]/update.ts +59 -0
- package/src/astro/routes/api/admin/plugins/index.ts +32 -0
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/icon.ts +61 -0
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/index.ts +33 -0
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/install.ts +62 -0
- package/src/astro/routes/api/admin/plugins/marketplace/index.ts +38 -0
- package/src/astro/routes/api/admin/plugins/updates.ts +28 -0
- package/src/astro/routes/api/admin/themes/marketplace/[id]/index.ts +33 -0
- package/src/astro/routes/api/admin/themes/marketplace/[id]/thumbnail.ts +61 -0
- package/src/astro/routes/api/admin/themes/marketplace/index.ts +45 -0
- package/src/astro/routes/api/admin/users/[id]/disable.ts +69 -0
- package/src/astro/routes/api/admin/users/[id]/enable.ts +48 -0
- package/src/astro/routes/api/admin/users/[id]/index.ts +146 -0
- package/src/astro/routes/api/admin/users/[id]/send-recovery.ts +72 -0
- package/src/astro/routes/api/admin/users/index.ts +66 -0
- package/src/astro/routes/api/auth/dev-bypass.ts +139 -0
- package/src/astro/routes/api/auth/invite/accept.ts +52 -0
- package/src/astro/routes/api/auth/invite/complete.ts +84 -0
- package/src/astro/routes/api/auth/invite/index.ts +99 -0
- package/src/astro/routes/api/auth/logout.ts +40 -0
- package/src/astro/routes/api/auth/magic-link/send.ts +89 -0
- package/src/astro/routes/api/auth/magic-link/verify.ts +71 -0
- package/src/astro/routes/api/auth/me.ts +60 -0
- package/src/astro/routes/api/auth/oauth/[provider]/callback.ts +219 -0
- package/src/astro/routes/api/auth/oauth/[provider].ts +119 -0
- package/src/astro/routes/api/auth/passkey/[id].ts +124 -0
- package/src/astro/routes/api/auth/passkey/index.ts +54 -0
- package/src/astro/routes/api/auth/passkey/options.ts +82 -0
- package/src/astro/routes/api/auth/passkey/register/options.ts +86 -0
- package/src/astro/routes/api/auth/passkey/register/verify.ts +117 -0
- package/src/astro/routes/api/auth/passkey/verify.ts +66 -0
- package/src/astro/routes/api/auth/signup/complete.ts +85 -0
- package/src/astro/routes/api/auth/signup/request.ts +77 -0
- package/src/astro/routes/api/auth/signup/verify.ts +53 -0
- package/src/astro/routes/api/comments/[collection]/[contentId]/index.ts +312 -0
- package/src/astro/routes/api/content/[collection]/[id]/compare.ts +28 -0
- package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +54 -0
- package/src/astro/routes/api/content/[collection]/[id]/duplicate.ts +61 -0
- package/src/astro/routes/api/content/[collection]/[id]/permanent.ts +33 -0
- package/src/astro/routes/api/content/[collection]/[id]/preview-url.ts +107 -0
- package/src/astro/routes/api/content/[collection]/[id]/publish.ts +56 -0
- package/src/astro/routes/api/content/[collection]/[id]/restore.ts +54 -0
- package/src/astro/routes/api/content/[collection]/[id]/revisions.ts +31 -0
- package/src/astro/routes/api/content/[collection]/[id]/schedule.ts +105 -0
- package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +140 -0
- package/src/astro/routes/api/content/[collection]/[id]/translations.ts +30 -0
- package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +56 -0
- package/src/astro/routes/api/content/[collection]/[id].ts +137 -0
- package/src/astro/routes/api/content/[collection]/index.ts +59 -0
- package/src/astro/routes/api/content/[collection]/trash.ts +33 -0
- package/src/astro/routes/api/dashboard.ts +32 -0
- package/src/astro/routes/api/dev/emails.ts +36 -0
- package/src/astro/routes/api/import/probe.ts +47 -0
- package/src/astro/routes/api/import/wordpress/analyze.ts +510 -0
- package/src/astro/routes/api/import/wordpress/execute.ts +283 -0
- package/src/astro/routes/api/import/wordpress/media.ts +338 -0
- package/src/astro/routes/api/import/wordpress/prepare.ts +181 -0
- package/src/astro/routes/api/import/wordpress/rewrite-urls.ts +393 -0
- package/src/astro/routes/api/import/wordpress-plugin/analyze.ts +111 -0
- package/src/astro/routes/api/import/wordpress-plugin/callback.ts +58 -0
- package/src/astro/routes/api/import/wordpress-plugin/execute.ts +347 -0
- package/src/astro/routes/api/manifest.ts +62 -0
- package/src/astro/routes/api/mcp.ts +124 -0
- package/src/astro/routes/api/media/[id]/confirm.ts +93 -0
- package/src/astro/routes/api/media/[id].ts +145 -0
- package/src/astro/routes/api/media/file/[key].ts +79 -0
- package/src/astro/routes/api/media/providers/[providerId]/[itemId].ts +86 -0
- package/src/astro/routes/api/media/providers/[providerId]/index.ts +111 -0
- package/src/astro/routes/api/media/providers/index.ts +30 -0
- package/src/astro/routes/api/media/upload-url.ts +137 -0
- package/src/astro/routes/api/media.ts +190 -0
- package/src/astro/routes/api/menus/[name]/items.ts +87 -0
- package/src/astro/routes/api/menus/[name]/reorder.ts +33 -0
- package/src/astro/routes/api/menus/[name].ts +65 -0
- package/src/astro/routes/api/menus/index.ts +47 -0
- package/src/astro/routes/api/oauth/authorize.ts +412 -0
- package/src/astro/routes/api/oauth/device/authorize.ts +45 -0
- package/src/astro/routes/api/oauth/device/code.ts +51 -0
- package/src/astro/routes/api/oauth/device/token.ts +69 -0
- package/src/astro/routes/api/oauth/token/refresh.ts +38 -0
- package/src/astro/routes/api/oauth/token/revoke.ts +38 -0
- package/src/astro/routes/api/oauth/token.ts +184 -0
- package/src/astro/routes/api/openapi.json.ts +32 -0
- package/src/astro/routes/api/plugins/[pluginId]/[...path].ts +92 -0
- package/src/astro/routes/api/redirects/404s/index.ts +72 -0
- package/src/astro/routes/api/redirects/404s/summary.ts +33 -0
- package/src/astro/routes/api/redirects/[id].ts +84 -0
- package/src/astro/routes/api/redirects/index.ts +52 -0
- package/src/astro/routes/api/revisions/[revisionId]/index.ts +29 -0
- package/src/astro/routes/api/revisions/[revisionId]/restore.ts +62 -0
- package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +76 -0
- package/src/astro/routes/api/schema/collections/[slug]/fields/index.ts +52 -0
- package/src/astro/routes/api/schema/collections/[slug]/fields/reorder.ts +32 -0
- package/src/astro/routes/api/schema/collections/[slug]/index.ts +80 -0
- package/src/astro/routes/api/schema/collections/index.ts +47 -0
- package/src/astro/routes/api/schema/index.ts +109 -0
- package/src/astro/routes/api/schema/orphans/[slug].ts +36 -0
- package/src/astro/routes/api/schema/orphans/index.ts +26 -0
- package/src/astro/routes/api/search/enable.ts +64 -0
- package/src/astro/routes/api/search/index.ts +55 -0
- package/src/astro/routes/api/search/rebuild.ts +72 -0
- package/src/astro/routes/api/search/stats.ts +35 -0
- package/src/astro/routes/api/search/suggest.ts +53 -0
- package/src/astro/routes/api/sections/[slug].ts +84 -0
- package/src/astro/routes/api/sections/index.ts +52 -0
- package/src/astro/routes/api/settings/email.ts +150 -0
- package/src/astro/routes/api/settings.ts +67 -0
- package/src/astro/routes/api/setup/admin-verify.ts +100 -0
- package/src/astro/routes/api/setup/admin.ts +94 -0
- package/src/astro/routes/api/setup/dev-bypass.ts +199 -0
- package/src/astro/routes/api/setup/dev-reset.ts +40 -0
- package/src/astro/routes/api/setup/index.ts +126 -0
- package/src/astro/routes/api/setup/status.ts +122 -0
- package/src/astro/routes/api/snapshot.ts +75 -0
- package/src/astro/routes/api/taxonomies/[name]/terms/[slug].ts +95 -0
- package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +69 -0
- package/src/astro/routes/api/taxonomies/index.ts +59 -0
- package/src/astro/routes/api/themes/preview.ts +77 -0
- package/src/astro/routes/api/typegen.ts +114 -0
- package/src/astro/routes/api/well-known/auth.ts +68 -0
- package/src/astro/routes/api/well-known/oauth-authorization-server.ts +44 -0
- package/src/astro/routes/api/well-known/oauth-protected-resource.ts +37 -0
- package/src/astro/routes/api/widget-areas/[name]/reorder.ts +72 -0
- package/src/astro/routes/api/widget-areas/[name]/widgets/[id].ts +127 -0
- package/src/astro/routes/api/widget-areas/[name]/widgets.ts +80 -0
- package/src/astro/routes/api/widget-areas/[name].ts +87 -0
- package/src/astro/routes/api/widget-areas/index.ts +99 -0
- package/src/astro/routes/api/widget-components.ts +22 -0
- package/src/astro/routes/robots.txt.ts +77 -0
- package/src/astro/routes/sitemap.xml.ts +97 -0
- package/src/astro/storage/adapters.ts +74 -0
- package/src/astro/storage/index.ts +19 -0
- package/src/astro/storage/types.ts +60 -0
- package/src/astro/types.ts +346 -0
- package/src/auth/api-tokens.ts +25 -0
- package/src/auth/challenge-store.ts +80 -0
- package/src/auth/mode.ts +96 -0
- package/src/auth/oauth-state-store.ts +96 -0
- package/src/auth/passkey-config.ts +27 -0
- package/src/auth/rate-limit.ts +158 -0
- package/src/auth/scopes.ts +33 -0
- package/src/auth/types.ts +104 -0
- package/src/aws-sdk.d.ts +100 -0
- package/src/bylines/index.ts +237 -0
- package/src/cleanup.ts +153 -0
- package/src/cli/client-factory.ts +100 -0
- package/src/cli/commands/auth.ts +46 -0
- package/src/cli/commands/bundle-utils.ts +247 -0
- package/src/cli/commands/bundle.ts +609 -0
- package/src/cli/commands/content.ts +442 -0
- package/src/cli/commands/dev.ts +191 -0
- package/src/cli/commands/doctor.ts +211 -0
- package/src/cli/commands/export-seed.ts +630 -0
- package/src/cli/commands/import/wordpress.ts +1056 -0
- package/src/cli/commands/init.ts +192 -0
- package/src/cli/commands/login.ts +547 -0
- package/src/cli/commands/media.ts +165 -0
- package/src/cli/commands/menu.ts +67 -0
- package/src/cli/commands/plugin-init.ts +291 -0
- package/src/cli/commands/plugin-validate.ts +31 -0
- package/src/cli/commands/plugin.ts +33 -0
- package/src/cli/commands/publish.ts +699 -0
- package/src/cli/commands/schema.ts +233 -0
- package/src/cli/commands/search-cmd.ts +54 -0
- package/src/cli/commands/seed.ts +288 -0
- package/src/cli/commands/taxonomy.ts +128 -0
- package/src/cli/commands/types.ts +68 -0
- package/src/cli/credentials.ts +236 -0
- package/src/cli/index.ts +70 -0
- package/src/cli/output.ts +75 -0
- package/src/cli/wxr/parser.ts +969 -0
- package/src/client/cf-access.ts +193 -0
- package/src/client/index.ts +854 -0
- package/src/client/portable-text.ts +413 -0
- package/src/client/transport.ts +200 -0
- package/src/comments/moderator.ts +46 -0
- package/src/comments/notifications.ts +144 -0
- package/src/comments/query.ts +105 -0
- package/src/comments/service.ts +213 -0
- package/src/components/Break.astro +45 -0
- package/src/components/Button.astro +71 -0
- package/src/components/Buttons.astro +49 -0
- package/src/components/Code.astro +59 -0
- package/src/components/Columns.astro +59 -0
- package/src/components/CommentForm.astro +315 -0
- package/src/components/Comments.astro +232 -0
- package/src/components/Cover.astro +128 -0
- package/src/components/EmDashBodyEnd.astro +32 -0
- package/src/components/EmDashBodyStart.astro +32 -0
- package/src/components/EmDashHead.astro +53 -0
- package/src/components/EmDashImage.astro +178 -0
- package/src/components/EmDashMedia.astro +167 -0
- package/src/components/Embed.astro +128 -0
- package/src/components/File.astro +122 -0
- package/src/components/Gallery.astro +93 -0
- package/src/components/HtmlBlock.astro +33 -0
- package/src/components/Image.astro +178 -0
- package/src/components/InlineEditor.astro +27 -0
- package/src/components/InlinePortableTextEditor.tsx +1905 -0
- package/src/components/LiveSearch.astro +614 -0
- package/src/components/PortableText.astro +51 -0
- package/src/components/Pullquote.astro +51 -0
- package/src/components/Table.astro +108 -0
- package/src/components/WidgetArea.astro +22 -0
- package/src/components/WidgetRenderer.astro +72 -0
- package/src/components/index.ts +116 -0
- package/src/components/marks/Link.astro +31 -0
- package/src/components/marks/StrikeThrough.astro +7 -0
- package/src/components/marks/Subscript.astro +7 -0
- package/src/components/marks/Superscript.astro +7 -0
- package/src/components/marks/Underline.astro +7 -0
- package/src/components/widgets/Archives.astro +65 -0
- package/src/components/widgets/Categories.astro +35 -0
- package/src/components/widgets/RecentPosts.astro +51 -0
- package/src/components/widgets/Search.astro +18 -0
- package/src/components/widgets/Tags.astro +38 -0
- package/src/content/converters/index.ts +9 -0
- package/src/content/converters/portable-text-to-prosemirror.ts +385 -0
- package/src/content/converters/prosemirror-to-portable-text.ts +413 -0
- package/src/content/converters/types.ts +120 -0
- package/src/content/index.ts +5 -0
- package/src/database/connection.ts +67 -0
- package/src/database/dialect-helpers.ts +138 -0
- package/src/database/index.ts +5 -0
- package/src/database/migrations/001_initial.ts +136 -0
- package/src/database/migrations/002_media_status.ts +26 -0
- package/src/database/migrations/003_schema_registry.ts +79 -0
- package/src/database/migrations/004_plugins.ts +62 -0
- package/src/database/migrations/005_menus.ts +67 -0
- package/src/database/migrations/006_taxonomy_defs.ts +51 -0
- package/src/database/migrations/007_widgets.ts +42 -0
- package/src/database/migrations/008_auth.ts +194 -0
- package/src/database/migrations/009_user_disabled.ts +27 -0
- package/src/database/migrations/011_sections.ts +65 -0
- package/src/database/migrations/012_search.ts +25 -0
- package/src/database/migrations/013_scheduled_publishing.ts +51 -0
- package/src/database/migrations/014_draft_revisions.ts +72 -0
- package/src/database/migrations/015_indexes.ts +82 -0
- package/src/database/migrations/016_api_tokens.ts +89 -0
- package/src/database/migrations/017_authorization_codes.ts +45 -0
- package/src/database/migrations/018_seo.ts +56 -0
- package/src/database/migrations/019_i18n.ts +618 -0
- package/src/database/migrations/020_collection_url_pattern.ts +23 -0
- package/src/database/migrations/021_remove_section_categories.ts +43 -0
- package/src/database/migrations/022_marketplace_plugin_state.ts +46 -0
- package/src/database/migrations/023_plugin_metadata.ts +33 -0
- package/src/database/migrations/024_media_placeholders.ts +32 -0
- package/src/database/migrations/025_oauth_clients.ts +28 -0
- package/src/database/migrations/026_cron_tasks.ts +49 -0
- package/src/database/migrations/027_comments.ts +87 -0
- package/src/database/migrations/028_drop_author_url.ts +9 -0
- package/src/database/migrations/029_redirects.ts +67 -0
- package/src/database/migrations/030_widen_scheduled_index.ts +48 -0
- package/src/database/migrations/031_bylines.ts +90 -0
- package/src/database/migrations/032_rate_limits.ts +42 -0
- package/src/database/migrations/runner.ts +170 -0
- package/src/database/repositories/audit.ts +294 -0
- package/src/database/repositories/byline.ts +387 -0
- package/src/database/repositories/comment.ts +458 -0
- package/src/database/repositories/content.ts +1144 -0
- package/src/database/repositories/index.ts +30 -0
- package/src/database/repositories/media.ts +347 -0
- package/src/database/repositories/options.ts +150 -0
- package/src/database/repositories/plugin-storage.ts +373 -0
- package/src/database/repositories/redirect.ts +480 -0
- package/src/database/repositories/revision.ts +200 -0
- package/src/database/repositories/seo.ts +176 -0
- package/src/database/repositories/taxonomy.ts +294 -0
- package/src/database/repositories/types.ts +132 -0
- package/src/database/repositories/user.ts +258 -0
- package/src/database/transaction.ts +54 -0
- package/src/database/types.ts +501 -0
- package/src/database/validate.ts +138 -0
- package/src/db/adapters.ts +125 -0
- package/src/db/index.ts +37 -0
- package/src/db/libsql.ts +23 -0
- package/src/db/postgres.ts +30 -0
- package/src/db/sqlite.ts +27 -0
- package/src/emdash-runtime.ts +2096 -0
- package/src/fields/boolean.ts +34 -0
- package/src/fields/datetime.ts +44 -0
- package/src/fields/file.ts +41 -0
- package/src/fields/image.ts +34 -0
- package/src/fields/index.ts +42 -0
- package/src/fields/integer.ts +50 -0
- package/src/fields/json.ts +37 -0
- package/src/fields/multiselect.ts +48 -0
- package/src/fields/number.ts +52 -0
- package/src/fields/portable-text.ts +33 -0
- package/src/fields/reference.ts +29 -0
- package/src/fields/richtext.ts +31 -0
- package/src/fields/select.ts +46 -0
- package/src/fields/slug.ts +38 -0
- package/src/fields/text.ts +55 -0
- package/src/fields/textarea.ts +52 -0
- package/src/fields/types.ts +64 -0
- package/src/i18n/config.ts +68 -0
- package/src/import/index.ts +90 -0
- package/src/import/menus.ts +436 -0
- package/src/import/registry.ts +111 -0
- package/src/import/sections.ts +103 -0
- package/src/import/settings.ts +281 -0
- package/src/import/sources/wordpress-plugin.ts +641 -0
- package/src/import/sources/wordpress-rest.ts +191 -0
- package/src/import/sources/wxr.ts +330 -0
- package/src/import/ssrf.ts +260 -0
- package/src/import/types.ts +418 -0
- package/src/import/utils.ts +412 -0
- package/src/index.ts +481 -0
- package/src/loader.ts +770 -0
- package/src/mcp/server.ts +1463 -0
- package/src/media/index.ts +32 -0
- package/src/media/local-runtime.ts +213 -0
- package/src/media/local.ts +46 -0
- package/src/media/normalize.ts +190 -0
- package/src/media/placeholder.ts +150 -0
- package/src/media/provider-loader.ts +78 -0
- package/src/media/types.ts +279 -0
- package/src/menus/index.ts +324 -0
- package/src/menus/types.ts +112 -0
- package/src/page/context.ts +93 -0
- package/src/page/fragments.ts +89 -0
- package/src/page/index.ts +58 -0
- package/src/page/jsonld.ts +94 -0
- package/src/page/metadata.ts +185 -0
- package/src/page/seo-contributions.ts +136 -0
- package/src/plugin-utils.ts +80 -0
- package/src/plugins/adapt-sandbox-entry.ts +207 -0
- package/src/plugins/context.ts +833 -0
- package/src/plugins/cron.ts +361 -0
- package/src/plugins/define-plugin.ts +259 -0
- package/src/plugins/email-console.ts +73 -0
- package/src/plugins/email.ts +209 -0
- package/src/plugins/hooks.ts +1273 -0
- package/src/plugins/index.ts +193 -0
- package/src/plugins/manager.ts +595 -0
- package/src/plugins/manifest-schema.ts +230 -0
- package/src/plugins/marketplace.ts +460 -0
- package/src/plugins/request-meta.ts +139 -0
- package/src/plugins/routes.ts +302 -0
- package/src/plugins/sandbox/index.ts +18 -0
- package/src/plugins/sandbox/noop.ts +76 -0
- package/src/plugins/sandbox/types.ts +173 -0
- package/src/plugins/scheduler/node.ts +122 -0
- package/src/plugins/scheduler/piggyback.ts +71 -0
- package/src/plugins/scheduler/types.ts +27 -0
- package/src/plugins/state.ts +208 -0
- package/src/plugins/storage-indexes.ts +326 -0
- package/src/plugins/storage-query.ts +240 -0
- package/src/plugins/types.ts +1284 -0
- package/src/preview/helpers.ts +27 -0
- package/src/preview/index.ts +40 -0
- package/src/preview/tokens.ts +279 -0
- package/src/preview/urls.ts +118 -0
- package/src/query.ts +674 -0
- package/src/redirects/patterns.ts +224 -0
- package/src/request-context.ts +67 -0
- package/src/runtime.ts +21 -0
- package/src/schema/index.ts +29 -0
- package/src/schema/query.ts +44 -0
- package/src/schema/registry.ts +965 -0
- package/src/schema/types.ts +276 -0
- package/src/schema/zod-generator.ts +413 -0
- package/src/search/fts-manager.ts +452 -0
- package/src/search/index.ts +26 -0
- package/src/search/query.ts +396 -0
- package/src/search/text-extraction.ts +162 -0
- package/src/search/types.ts +114 -0
- package/src/sections/index.ts +226 -0
- package/src/sections/types.ts +86 -0
- package/src/seed/apply.ts +1141 -0
- package/src/seed/default.ts +86 -0
- package/src/seed/index.ts +28 -0
- package/src/seed/load.ts +35 -0
- package/src/seed/types.ts +341 -0
- package/src/seed/validate.ts +642 -0
- package/src/seo/index.ts +179 -0
- package/src/settings/index.ts +203 -0
- package/src/settings/types.ts +58 -0
- package/src/storage/index.ts +28 -0
- package/src/storage/local.ts +253 -0
- package/src/storage/s3.ts +271 -0
- package/src/storage/types.ts +204 -0
- package/src/taxonomies/index.ts +309 -0
- package/src/taxonomies/types.ts +61 -0
- package/src/ui.ts +75 -0
- package/src/utils/base64.ts +73 -0
- package/src/utils/hash.ts +36 -0
- package/src/utils/sanitize.ts +20 -0
- package/src/utils/slugify.ts +29 -0
- package/src/utils/url.ts +48 -0
- package/src/virtual-modules.d.ts +111 -0
- package/src/visual-editing/editable.ts +108 -0
- package/src/visual-editing/toolbar.ts +1229 -0
- package/src/widgets/components.ts +105 -0
- package/src/widgets/index.ts +131 -0
- package/src/widgets/types.ts +81 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Media Provider Types
|
|
3
|
+
*
|
|
4
|
+
* Media providers are pluggable sources for browsing, uploading, and embedding media.
|
|
5
|
+
* They enable integration with external services (Unsplash, Cloudinary, Mux, etc.)
|
|
6
|
+
* alongside the built-in local media library.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Serializable media provider configuration descriptor
|
|
11
|
+
* Returned by provider config functions (e.g., unsplash(), mux())
|
|
12
|
+
*/
|
|
13
|
+
export interface MediaProviderDescriptor<TConfig = Record<string, unknown>> {
|
|
14
|
+
/** Unique identifier, used in MediaValue.provider */
|
|
15
|
+
id: string;
|
|
16
|
+
|
|
17
|
+
/** Display name for admin UI */
|
|
18
|
+
name: string;
|
|
19
|
+
|
|
20
|
+
/** Icon for tab UI (emoji or URL) */
|
|
21
|
+
icon?: string;
|
|
22
|
+
|
|
23
|
+
/** Module path exporting createMediaProvider function */
|
|
24
|
+
entrypoint: string;
|
|
25
|
+
|
|
26
|
+
/** Optional React component module for custom admin UI */
|
|
27
|
+
adminModule?: string;
|
|
28
|
+
|
|
29
|
+
/** Capability flags determine UI behavior */
|
|
30
|
+
capabilities: MediaProviderCapabilities;
|
|
31
|
+
|
|
32
|
+
/** Serializable config passed to createMediaProvider at runtime */
|
|
33
|
+
config: TConfig;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Provider capabilities determine what UI elements to show
|
|
38
|
+
*/
|
|
39
|
+
export interface MediaProviderCapabilities {
|
|
40
|
+
/** Can list/browse media */
|
|
41
|
+
browse: boolean;
|
|
42
|
+
/** Supports text search */
|
|
43
|
+
search: boolean;
|
|
44
|
+
/** Can upload new media */
|
|
45
|
+
upload: boolean;
|
|
46
|
+
/** Can delete media */
|
|
47
|
+
delete: boolean;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Options for listing media
|
|
52
|
+
*/
|
|
53
|
+
export interface MediaListOptions {
|
|
54
|
+
/** Pagination cursor */
|
|
55
|
+
cursor?: string;
|
|
56
|
+
/** Max items to return (default 20) */
|
|
57
|
+
limit?: number;
|
|
58
|
+
/** Search query (if capabilities.search is true) */
|
|
59
|
+
query?: string;
|
|
60
|
+
/** Filter by MIME type prefix, e.g., "image/", "video/" */
|
|
61
|
+
mimeType?: string;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Result from listing media
|
|
66
|
+
*/
|
|
67
|
+
export interface MediaListResult {
|
|
68
|
+
items: MediaProviderItem[];
|
|
69
|
+
nextCursor?: string;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* A media item as returned by a provider
|
|
74
|
+
* This is the provider's view of the item, before it's selected
|
|
75
|
+
*/
|
|
76
|
+
export interface MediaProviderItem {
|
|
77
|
+
/** Provider-specific ID */
|
|
78
|
+
id: string;
|
|
79
|
+
/** Original filename */
|
|
80
|
+
filename: string;
|
|
81
|
+
/** MIME type */
|
|
82
|
+
mimeType: string;
|
|
83
|
+
/** File size in bytes (if known) */
|
|
84
|
+
size?: number;
|
|
85
|
+
/** Dimensions (for images/video) */
|
|
86
|
+
width?: number;
|
|
87
|
+
height?: number;
|
|
88
|
+
/** Accessibility text */
|
|
89
|
+
alt?: string;
|
|
90
|
+
/** Preview URL for admin UI thumbnail */
|
|
91
|
+
previewUrl?: string;
|
|
92
|
+
/** Provider-specific metadata */
|
|
93
|
+
meta?: Record<string, unknown>;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Input for uploading media
|
|
98
|
+
*/
|
|
99
|
+
export interface MediaUploadInput {
|
|
100
|
+
file: File;
|
|
101
|
+
filename: string;
|
|
102
|
+
alt?: string;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Options for generating embed
|
|
107
|
+
*/
|
|
108
|
+
export interface EmbedOptions {
|
|
109
|
+
/** Desired width (provider may use for optimization) */
|
|
110
|
+
width?: number;
|
|
111
|
+
/** Desired height */
|
|
112
|
+
height?: number;
|
|
113
|
+
/** Image format preference */
|
|
114
|
+
format?: "webp" | "avif" | "jpeg" | "png" | "auto";
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Embed result types
|
|
119
|
+
*/
|
|
120
|
+
export type EmbedResult = ImageEmbed | VideoEmbed | AudioEmbed | ComponentEmbed;
|
|
121
|
+
|
|
122
|
+
export interface ImageEmbed {
|
|
123
|
+
type: "image";
|
|
124
|
+
src: string;
|
|
125
|
+
srcset?: string;
|
|
126
|
+
sizes?: string;
|
|
127
|
+
width?: number;
|
|
128
|
+
height?: number;
|
|
129
|
+
alt?: string;
|
|
130
|
+
/** Base URL without transforms, for responsive image generation */
|
|
131
|
+
cdnBaseUrl?: string;
|
|
132
|
+
/** For providers with URL-based transforms (Cloudinary, imgix) */
|
|
133
|
+
getSrc?: (opts: { width?: number; height?: number; format?: string }) => string;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export interface VideoEmbed {
|
|
137
|
+
type: "video";
|
|
138
|
+
/** Single source URL */
|
|
139
|
+
src?: string;
|
|
140
|
+
/** Multiple sources for format fallback */
|
|
141
|
+
sources?: Array<{ src: string; type: string }>;
|
|
142
|
+
/** Poster/thumbnail image */
|
|
143
|
+
poster?: string;
|
|
144
|
+
width?: number;
|
|
145
|
+
height?: number;
|
|
146
|
+
/** Player controls */
|
|
147
|
+
controls?: boolean;
|
|
148
|
+
autoplay?: boolean;
|
|
149
|
+
muted?: boolean;
|
|
150
|
+
loop?: boolean;
|
|
151
|
+
playsinline?: boolean;
|
|
152
|
+
preload?: "none" | "metadata" | "auto";
|
|
153
|
+
crossorigin?: "anonymous" | "use-credentials";
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export interface AudioEmbed {
|
|
157
|
+
type: "audio";
|
|
158
|
+
src?: string;
|
|
159
|
+
sources?: Array<{ src: string; type: string }>;
|
|
160
|
+
controls?: boolean;
|
|
161
|
+
autoplay?: boolean;
|
|
162
|
+
muted?: boolean;
|
|
163
|
+
loop?: boolean;
|
|
164
|
+
preload?: "none" | "metadata" | "auto";
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export interface ComponentEmbed {
|
|
168
|
+
type: "component";
|
|
169
|
+
/** Package to import from, e.g., "@mux/player-react" */
|
|
170
|
+
package: string;
|
|
171
|
+
/** Named export (default export if not specified) */
|
|
172
|
+
export?: string;
|
|
173
|
+
/** Props to pass to the component */
|
|
174
|
+
props: Record<string, unknown>;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Options for thumbnail generation
|
|
179
|
+
*/
|
|
180
|
+
export interface ThumbnailOptions {
|
|
181
|
+
/** Desired width */
|
|
182
|
+
width?: number;
|
|
183
|
+
/** Desired height */
|
|
184
|
+
height?: number;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Runtime media provider interface
|
|
189
|
+
* Implemented by provider entrypoints
|
|
190
|
+
*/
|
|
191
|
+
export interface MediaProvider {
|
|
192
|
+
/**
|
|
193
|
+
* List/search media items
|
|
194
|
+
*/
|
|
195
|
+
list(options: MediaListOptions): Promise<MediaListResult>;
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Get a single item by ID (optional, for refresh/validation)
|
|
199
|
+
*/
|
|
200
|
+
get?(id: string): Promise<MediaProviderItem | null>;
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Upload new media (if capabilities.upload is true)
|
|
204
|
+
*/
|
|
205
|
+
upload?(input: MediaUploadInput): Promise<MediaProviderItem>;
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Delete media (if capabilities.delete is true)
|
|
209
|
+
*/
|
|
210
|
+
delete?(id: string): Promise<void>;
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Get embed information for rendering this media item
|
|
214
|
+
* Called at runtime when rendering content
|
|
215
|
+
*/
|
|
216
|
+
getEmbed(value: MediaValue, options?: EmbedOptions): Promise<EmbedResult> | EmbedResult;
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Get a thumbnail URL for admin display
|
|
220
|
+
* For images: returns a resized image URL
|
|
221
|
+
* For videos: returns a poster/thumbnail URL
|
|
222
|
+
*/
|
|
223
|
+
getThumbnailUrl?(id: string, mimeType?: string, options?: ThumbnailOptions): string;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Function signature for provider entrypoint modules
|
|
228
|
+
*/
|
|
229
|
+
export type CreateMediaProviderFn<TConfig = Record<string, unknown>> = (
|
|
230
|
+
config: TConfig,
|
|
231
|
+
) => MediaProvider;
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Media value stored in content fields
|
|
235
|
+
* This is what gets persisted when media is selected
|
|
236
|
+
*
|
|
237
|
+
* For backwards compatibility:
|
|
238
|
+
* - `provider` defaults to "local" if not specified
|
|
239
|
+
* - `src` is supported for legacy data or external URLs
|
|
240
|
+
*/
|
|
241
|
+
export interface MediaValue {
|
|
242
|
+
/** Provider ID, e.g., "local", "unsplash", "mux" (defaults to "local") */
|
|
243
|
+
provider?: string;
|
|
244
|
+
|
|
245
|
+
/** Provider-specific item ID */
|
|
246
|
+
id: string;
|
|
247
|
+
|
|
248
|
+
/** Direct URL (for local media or legacy data) */
|
|
249
|
+
src?: string;
|
|
250
|
+
|
|
251
|
+
/** Preview URL for admin display (external providers) */
|
|
252
|
+
previewUrl?: string;
|
|
253
|
+
|
|
254
|
+
/** Cached metadata for display without runtime lookup */
|
|
255
|
+
filename?: string;
|
|
256
|
+
mimeType?: string;
|
|
257
|
+
width?: number;
|
|
258
|
+
height?: number;
|
|
259
|
+
alt?: string;
|
|
260
|
+
|
|
261
|
+
/** Provider-specific data needed for embedding */
|
|
262
|
+
meta?: Record<string, unknown>;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Convert a MediaProviderItem to a MediaValue for storage
|
|
267
|
+
*/
|
|
268
|
+
export function mediaItemToValue(providerId: string, item: MediaProviderItem): MediaValue {
|
|
269
|
+
return {
|
|
270
|
+
provider: providerId,
|
|
271
|
+
id: item.id,
|
|
272
|
+
filename: item.filename,
|
|
273
|
+
mimeType: item.mimeType,
|
|
274
|
+
width: item.width,
|
|
275
|
+
height: item.height,
|
|
276
|
+
alt: item.alt,
|
|
277
|
+
meta: item.meta,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Navigation menu runtime functions
|
|
3
|
+
*
|
|
4
|
+
* These are called from templates to query menus and resolve URLs.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { Kysely } from "kysely";
|
|
8
|
+
import { sql } from "kysely";
|
|
9
|
+
|
|
10
|
+
import type { Database } from "../database/types.js";
|
|
11
|
+
import { getDb } from "../loader.js";
|
|
12
|
+
import type { Menu, MenuItem, MenuItemRow } from "./types.js";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Get menu by name with resolved URLs
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* import { getMenu } from "emdash";
|
|
20
|
+
*
|
|
21
|
+
* const menu = await getMenu("primary");
|
|
22
|
+
* if (menu) {
|
|
23
|
+
* console.log(menu.items); // Array of MenuItem with resolved URLs
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export async function getMenu(name: string): Promise<Menu | null> {
|
|
28
|
+
const db = await getDb();
|
|
29
|
+
return getMenuWithDb(name, db);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Get menu by name with resolved URLs (with explicit db)
|
|
34
|
+
*
|
|
35
|
+
* @internal Use `getMenu()` in templates. This variant is for admin routes
|
|
36
|
+
* that already have a database handle.
|
|
37
|
+
*/
|
|
38
|
+
export async function getMenuWithDb(name: string, db: Kysely<Database>): Promise<Menu | null> {
|
|
39
|
+
// Get menu
|
|
40
|
+
const menuRow = await db
|
|
41
|
+
.selectFrom("_emdash_menus")
|
|
42
|
+
.selectAll()
|
|
43
|
+
.where("name", "=", name)
|
|
44
|
+
.executeTakeFirst();
|
|
45
|
+
|
|
46
|
+
if (!menuRow) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Get all menu items
|
|
51
|
+
const itemRows = await db
|
|
52
|
+
.selectFrom("_emdash_menu_items")
|
|
53
|
+
.selectAll()
|
|
54
|
+
.$castTo<MenuItemRow>()
|
|
55
|
+
.where("menu_id", "=", menuRow.id)
|
|
56
|
+
.orderBy("sort_order", "asc")
|
|
57
|
+
.execute();
|
|
58
|
+
|
|
59
|
+
// Resolve URLs and build tree
|
|
60
|
+
const items = await buildMenuTree(itemRows, db);
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
id: menuRow.id,
|
|
64
|
+
name: menuRow.name,
|
|
65
|
+
label: menuRow.label,
|
|
66
|
+
items,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Get all menus (without items - for admin list)
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```ts
|
|
75
|
+
* import { getMenus } from "emdash";
|
|
76
|
+
*
|
|
77
|
+
* const menus = await getMenus();
|
|
78
|
+
* console.log(menus); // [{ id, name, label }]
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export async function getMenus(): Promise<Array<{ id: string; name: string; label: string }>> {
|
|
82
|
+
const db = await getDb();
|
|
83
|
+
return getMenusWithDb(db);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Get all menus (with explicit db)
|
|
88
|
+
*
|
|
89
|
+
* @internal Use `getMenus()` in templates. This variant is for admin routes
|
|
90
|
+
* that already have a database handle.
|
|
91
|
+
*/
|
|
92
|
+
export async function getMenusWithDb(
|
|
93
|
+
db: Kysely<Database>,
|
|
94
|
+
): Promise<Array<{ id: string; name: string; label: string }>> {
|
|
95
|
+
const rows = await db
|
|
96
|
+
.selectFrom("_emdash_menus")
|
|
97
|
+
.select(["id", "name", "label"])
|
|
98
|
+
.orderBy("name", "asc")
|
|
99
|
+
.execute();
|
|
100
|
+
|
|
101
|
+
return rows;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Build hierarchical menu tree from flat array of items
|
|
106
|
+
*/
|
|
107
|
+
async function buildMenuTree(items: MenuItemRow[], db: Kysely<Database>): Promise<MenuItem[]> {
|
|
108
|
+
// Pre-load URL patterns for all collections referenced in this menu
|
|
109
|
+
const collectionSlugs = new Set<string>();
|
|
110
|
+
for (const item of items) {
|
|
111
|
+
if (item.reference_collection) {
|
|
112
|
+
collectionSlugs.add(item.reference_collection);
|
|
113
|
+
}
|
|
114
|
+
if (item.type === "page" || item.type === "post") {
|
|
115
|
+
collectionSlugs.add(item.reference_collection || `${item.type}s`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const urlPatterns = new Map<string, string | null>();
|
|
120
|
+
if (collectionSlugs.size > 0) {
|
|
121
|
+
const rows = await db
|
|
122
|
+
.selectFrom("_emdash_collections")
|
|
123
|
+
.select(["slug", "url_pattern"])
|
|
124
|
+
.where("slug", "in", [...collectionSlugs])
|
|
125
|
+
.execute();
|
|
126
|
+
for (const row of rows) {
|
|
127
|
+
urlPatterns.set(row.slug, row.url_pattern);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Resolve all URLs first
|
|
132
|
+
const resolvedItems = await Promise.all(
|
|
133
|
+
items.map((item) => resolveMenuItem(item, db, urlPatterns)),
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
// Filter out items that couldn't be resolved (e.g., deleted content)
|
|
137
|
+
const validItems = resolvedItems.filter((item) => item !== null);
|
|
138
|
+
|
|
139
|
+
// Build tree structure
|
|
140
|
+
const itemMap = new Map<string, MenuItem & { children: MenuItem[] }>();
|
|
141
|
+
const rootItems: MenuItem[] = [];
|
|
142
|
+
|
|
143
|
+
// First pass: create all items
|
|
144
|
+
for (const item of validItems) {
|
|
145
|
+
itemMap.set(item.id, { ...item, children: [] });
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Second pass: build parent-child relationships
|
|
149
|
+
for (const item of items) {
|
|
150
|
+
const menuItem = itemMap.get(item.id);
|
|
151
|
+
if (!menuItem) continue;
|
|
152
|
+
|
|
153
|
+
if (item.parent_id) {
|
|
154
|
+
const parent = itemMap.get(item.parent_id);
|
|
155
|
+
if (parent) {
|
|
156
|
+
parent.children.push(menuItem);
|
|
157
|
+
} else {
|
|
158
|
+
// Parent not found, treat as root
|
|
159
|
+
rootItems.push(menuItem);
|
|
160
|
+
}
|
|
161
|
+
} else {
|
|
162
|
+
rootItems.push(menuItem);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return rootItems;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Resolve a single menu item's URL
|
|
171
|
+
*
|
|
172
|
+
* Returns null if the referenced content no longer exists (item should be skipped)
|
|
173
|
+
*/
|
|
174
|
+
async function resolveMenuItem(
|
|
175
|
+
item: MenuItemRow,
|
|
176
|
+
db: Kysely<Database>,
|
|
177
|
+
urlPatterns: Map<string, string | null>,
|
|
178
|
+
): Promise<MenuItem | null> {
|
|
179
|
+
let url: string | null;
|
|
180
|
+
|
|
181
|
+
try {
|
|
182
|
+
switch (item.type) {
|
|
183
|
+
case "custom":
|
|
184
|
+
url = item.custom_url || "#";
|
|
185
|
+
break;
|
|
186
|
+
|
|
187
|
+
case "page":
|
|
188
|
+
case "post":
|
|
189
|
+
url = await resolveContentUrl(
|
|
190
|
+
// Default to plural collection name (pages/posts) if not specified
|
|
191
|
+
item.reference_collection || `${item.type}s`,
|
|
192
|
+
item.reference_id,
|
|
193
|
+
db,
|
|
194
|
+
urlPatterns,
|
|
195
|
+
);
|
|
196
|
+
// Skip items where content no longer exists
|
|
197
|
+
if (url === null) {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
break;
|
|
201
|
+
|
|
202
|
+
case "taxonomy":
|
|
203
|
+
url = await resolveTaxonomyUrl(item.reference_id, db);
|
|
204
|
+
// Skip items where taxonomy no longer exists
|
|
205
|
+
if (url === null) {
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
break;
|
|
209
|
+
|
|
210
|
+
case "collection":
|
|
211
|
+
url = `/${item.reference_collection}/`;
|
|
212
|
+
break;
|
|
213
|
+
|
|
214
|
+
default:
|
|
215
|
+
if (item.reference_collection && item.reference_id) {
|
|
216
|
+
url = await resolveContentUrl(
|
|
217
|
+
item.reference_collection,
|
|
218
|
+
item.reference_id,
|
|
219
|
+
db,
|
|
220
|
+
urlPatterns,
|
|
221
|
+
);
|
|
222
|
+
if (url === null) {
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
} else {
|
|
226
|
+
url = "#";
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
} catch (error) {
|
|
230
|
+
// If resolution fails, skip this item
|
|
231
|
+
console.error(`Failed to resolve menu item ${item.id}:`, error);
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return {
|
|
236
|
+
id: item.id,
|
|
237
|
+
label: item.label,
|
|
238
|
+
url,
|
|
239
|
+
target: item.target || undefined,
|
|
240
|
+
titleAttr: item.title_attr || undefined,
|
|
241
|
+
cssClasses: item.css_classes || undefined,
|
|
242
|
+
children: [], // Will be populated by buildMenuTree
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const SLUG_PLACEHOLDER = /\{slug\}/g;
|
|
247
|
+
const ID_PLACEHOLDER = /\{id\}/g;
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Interpolate a URL pattern with entry data
|
|
251
|
+
*
|
|
252
|
+
* Replaces `{slug}` and `{id}` placeholders.
|
|
253
|
+
*/
|
|
254
|
+
function interpolateUrlPattern(pattern: string, slug: string, id: string): string {
|
|
255
|
+
return pattern.replace(SLUG_PLACEHOLDER, slug).replace(ID_PLACEHOLDER, id);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Resolve URL for a content entry (page/post)
|
|
260
|
+
*
|
|
261
|
+
* Uses the collection's url_pattern if set, otherwise falls back to /{collection}/{slug}.
|
|
262
|
+
* Returns null if content not found (item should be skipped).
|
|
263
|
+
*/
|
|
264
|
+
async function resolveContentUrl(
|
|
265
|
+
collection: string,
|
|
266
|
+
entryId: string | null,
|
|
267
|
+
db: Kysely<Database>,
|
|
268
|
+
urlPatterns: Map<string, string | null>,
|
|
269
|
+
): Promise<string | null> {
|
|
270
|
+
if (!entryId) {
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
try {
|
|
275
|
+
// Dynamic content tables (ec_*) aren't in the Database type, so use sql
|
|
276
|
+
const result = await sql<{ slug: string }>`
|
|
277
|
+
SELECT slug FROM ${sql.ref(`ec_${collection}`)} WHERE id = ${entryId} LIMIT 1
|
|
278
|
+
`.execute(db);
|
|
279
|
+
|
|
280
|
+
const row = result.rows[0];
|
|
281
|
+
if (row) {
|
|
282
|
+
const pattern = urlPatterns.get(collection);
|
|
283
|
+
if (pattern) {
|
|
284
|
+
return interpolateUrlPattern(pattern, row.slug, entryId);
|
|
285
|
+
}
|
|
286
|
+
return `/${collection}/${row.slug}`;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// Content not found, skip item
|
|
290
|
+
return null;
|
|
291
|
+
} catch (error) {
|
|
292
|
+
// Table might not exist or query failed
|
|
293
|
+
console.error(`Failed to resolve content URL for ${collection}/${entryId}:`, error);
|
|
294
|
+
return null;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Resolve URL for a taxonomy term
|
|
300
|
+
*
|
|
301
|
+
* Returns null if taxonomy not found (item should be skipped)
|
|
302
|
+
*/
|
|
303
|
+
async function resolveTaxonomyUrl(
|
|
304
|
+
taxonomyId: string | null,
|
|
305
|
+
db: Kysely<Database>,
|
|
306
|
+
): Promise<string | null> {
|
|
307
|
+
if (!taxonomyId) {
|
|
308
|
+
return null;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
const taxonomy = await db
|
|
312
|
+
.selectFrom("taxonomies")
|
|
313
|
+
.select(["name", "slug"])
|
|
314
|
+
.where("id", "=", taxonomyId)
|
|
315
|
+
.executeTakeFirst();
|
|
316
|
+
|
|
317
|
+
if (!taxonomy) {
|
|
318
|
+
// Taxonomy not found, skip item
|
|
319
|
+
return null;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// Use taxonomy name as base (e.g., "categories" or "tags")
|
|
323
|
+
return `/${taxonomy.name}/${taxonomy.slug}`;
|
|
324
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Menu item types
|
|
3
|
+
*/
|
|
4
|
+
export type MenuItemType = string;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Menu item as returned to templates (with resolved URL)
|
|
8
|
+
*/
|
|
9
|
+
export interface MenuItem {
|
|
10
|
+
id: string;
|
|
11
|
+
label: string;
|
|
12
|
+
url: string; // Resolved URL
|
|
13
|
+
target?: string; // '_blank' etc
|
|
14
|
+
titleAttr?: string; // title="" attribute
|
|
15
|
+
cssClasses?: string;
|
|
16
|
+
children: MenuItem[]; // Nested items
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Menu as returned to templates
|
|
21
|
+
*/
|
|
22
|
+
export interface Menu {
|
|
23
|
+
id: string;
|
|
24
|
+
name: string;
|
|
25
|
+
label: string;
|
|
26
|
+
items: MenuItem[];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Menu item as stored in database
|
|
31
|
+
*/
|
|
32
|
+
export interface MenuItemRow {
|
|
33
|
+
id: string;
|
|
34
|
+
menu_id: string;
|
|
35
|
+
parent_id: string | null;
|
|
36
|
+
sort_order: number;
|
|
37
|
+
type: MenuItemType;
|
|
38
|
+
reference_collection: string | null;
|
|
39
|
+
reference_id: string | null;
|
|
40
|
+
custom_url: string | null;
|
|
41
|
+
label: string;
|
|
42
|
+
title_attr: string | null;
|
|
43
|
+
target: string | null;
|
|
44
|
+
css_classes: string | null;
|
|
45
|
+
created_at: string;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Menu as stored in database
|
|
50
|
+
*/
|
|
51
|
+
export interface MenuRow {
|
|
52
|
+
id: string;
|
|
53
|
+
name: string;
|
|
54
|
+
label: string;
|
|
55
|
+
created_at: string;
|
|
56
|
+
updated_at: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Input for creating a menu item
|
|
61
|
+
*/
|
|
62
|
+
export interface CreateMenuItemInput {
|
|
63
|
+
type: MenuItemType;
|
|
64
|
+
label: string;
|
|
65
|
+
referenceCollection?: string;
|
|
66
|
+
referenceId?: string;
|
|
67
|
+
customUrl?: string;
|
|
68
|
+
target?: string;
|
|
69
|
+
titleAttr?: string;
|
|
70
|
+
cssClasses?: string;
|
|
71
|
+
parentId?: string;
|
|
72
|
+
sortOrder?: number;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Input for updating a menu item
|
|
77
|
+
*/
|
|
78
|
+
export interface UpdateMenuItemInput {
|
|
79
|
+
label?: string;
|
|
80
|
+
customUrl?: string;
|
|
81
|
+
target?: string;
|
|
82
|
+
titleAttr?: string;
|
|
83
|
+
cssClasses?: string;
|
|
84
|
+
parentId?: string | null;
|
|
85
|
+
sortOrder?: number;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Input for creating a menu
|
|
90
|
+
*/
|
|
91
|
+
export interface CreateMenuInput {
|
|
92
|
+
name: string;
|
|
93
|
+
label: string;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Input for updating a menu
|
|
98
|
+
*/
|
|
99
|
+
export interface UpdateMenuInput {
|
|
100
|
+
label?: string;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Input for reordering menu items
|
|
105
|
+
*/
|
|
106
|
+
export interface ReorderMenuItemsInput {
|
|
107
|
+
items: Array<{
|
|
108
|
+
id: string;
|
|
109
|
+
parentId: string | null;
|
|
110
|
+
sortOrder: number;
|
|
111
|
+
}>;
|
|
112
|
+
}
|