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.
Files changed (661) hide show
  1. package/README.md +87 -1
  2. package/dist/adapters-BLMa4JGD.d.mts +106 -0
  3. package/dist/adapters-BLMa4JGD.d.mts.map +1 -0
  4. package/dist/apply-Bjfq_b4-.mjs +1293 -0
  5. package/dist/apply-Bjfq_b4-.mjs.map +1 -0
  6. package/dist/astro/index.d.mts +51 -0
  7. package/dist/astro/index.d.mts.map +1 -0
  8. package/dist/astro/index.mjs +1333 -0
  9. package/dist/astro/index.mjs.map +1 -0
  10. package/dist/astro/middleware/auth.d.mts +31 -0
  11. package/dist/astro/middleware/auth.d.mts.map +1 -0
  12. package/dist/astro/middleware/auth.mjs +654 -0
  13. package/dist/astro/middleware/auth.mjs.map +1 -0
  14. package/dist/astro/middleware/redirect.d.mts +22 -0
  15. package/dist/astro/middleware/redirect.d.mts.map +1 -0
  16. package/dist/astro/middleware/redirect.mjs +63 -0
  17. package/dist/astro/middleware/redirect.mjs.map +1 -0
  18. package/dist/astro/middleware/request-context.d.mts +18 -0
  19. package/dist/astro/middleware/request-context.d.mts.map +1 -0
  20. package/dist/astro/middleware/request-context.mjs +1310 -0
  21. package/dist/astro/middleware/request-context.mjs.map +1 -0
  22. package/dist/astro/middleware/setup.d.mts +20 -0
  23. package/dist/astro/middleware/setup.d.mts.map +1 -0
  24. package/dist/astro/middleware/setup.mjs +47 -0
  25. package/dist/astro/middleware/setup.mjs.map +1 -0
  26. package/dist/astro/middleware.d.mts +13 -0
  27. package/dist/astro/middleware.d.mts.map +1 -0
  28. package/dist/astro/middleware.mjs +1613 -0
  29. package/dist/astro/middleware.mjs.map +1 -0
  30. package/dist/astro/types.d.mts +250 -0
  31. package/dist/astro/types.d.mts.map +1 -0
  32. package/dist/astro/types.mjs +1 -0
  33. package/dist/base64-MBPo9ozB.mjs +59 -0
  34. package/dist/base64-MBPo9ozB.mjs.map +1 -0
  35. package/dist/byline-CL847F26.mjs +213 -0
  36. package/dist/byline-CL847F26.mjs.map +1 -0
  37. package/dist/bylines-C2a-2TGt.mjs +136 -0
  38. package/dist/bylines-C2a-2TGt.mjs.map +1 -0
  39. package/dist/chunk-ClPoSABd.mjs +21 -0
  40. package/dist/cli/index.d.mts +1 -0
  41. package/dist/cli/index.mjs +3909 -0
  42. package/dist/cli/index.mjs.map +1 -0
  43. package/dist/client/cf-access.d.mts +60 -0
  44. package/dist/client/cf-access.d.mts.map +1 -0
  45. package/dist/client/cf-access.mjs +179 -0
  46. package/dist/client/cf-access.mjs.map +1 -0
  47. package/dist/client/index.d.mts +398 -0
  48. package/dist/client/index.d.mts.map +1 -0
  49. package/dist/client/index.mjs +346 -0
  50. package/dist/client/index.mjs.map +1 -0
  51. package/dist/config-CKE8p9xM.mjs +55 -0
  52. package/dist/config-CKE8p9xM.mjs.map +1 -0
  53. package/dist/connection-B4zVnQIa.mjs +40 -0
  54. package/dist/connection-B4zVnQIa.mjs.map +1 -0
  55. package/dist/content-D6C2WsZC.mjs +824 -0
  56. package/dist/content-D6C2WsZC.mjs.map +1 -0
  57. package/dist/db/index.d.mts +4 -0
  58. package/dist/db/index.mjs +62 -0
  59. package/dist/db/index.mjs.map +1 -0
  60. package/dist/db/libsql.d.mts +11 -0
  61. package/dist/db/libsql.d.mts.map +1 -0
  62. package/dist/db/libsql.mjs +17 -0
  63. package/dist/db/libsql.mjs.map +1 -0
  64. package/dist/db/postgres.d.mts +11 -0
  65. package/dist/db/postgres.d.mts.map +1 -0
  66. package/dist/db/postgres.mjs +30 -0
  67. package/dist/db/postgres.mjs.map +1 -0
  68. package/dist/db/sqlite.d.mts +11 -0
  69. package/dist/db/sqlite.d.mts.map +1 -0
  70. package/dist/db/sqlite.mjs +16 -0
  71. package/dist/db/sqlite.mjs.map +1 -0
  72. package/dist/default-Cyi4aAxu.mjs +81 -0
  73. package/dist/default-Cyi4aAxu.mjs.map +1 -0
  74. package/dist/dialect-helpers-B9uSp2GJ.mjs +90 -0
  75. package/dist/dialect-helpers-B9uSp2GJ.mjs.map +1 -0
  76. package/dist/error-Cxz0tQeO.mjs +27 -0
  77. package/dist/error-Cxz0tQeO.mjs.map +1 -0
  78. package/dist/index-C1xF3OGh.d.mts +4527 -0
  79. package/dist/index-C1xF3OGh.d.mts.map +1 -0
  80. package/dist/index.d.mts +16 -0
  81. package/dist/index.mjs +30 -0
  82. package/dist/load-yOOlckBj.mjs +28 -0
  83. package/dist/load-yOOlckBj.mjs.map +1 -0
  84. package/dist/loader-fz8Q_3EO.mjs +447 -0
  85. package/dist/loader-fz8Q_3EO.mjs.map +1 -0
  86. package/dist/manifest-schema-Dcl0R6nM.mjs +184 -0
  87. package/dist/manifest-schema-Dcl0R6nM.mjs.map +1 -0
  88. package/dist/media/index.d.mts +26 -0
  89. package/dist/media/index.d.mts.map +1 -0
  90. package/dist/media/index.mjs +55 -0
  91. package/dist/media/index.mjs.map +1 -0
  92. package/dist/media/local-runtime.d.mts +39 -0
  93. package/dist/media/local-runtime.d.mts.map +1 -0
  94. package/dist/media/local-runtime.mjs +133 -0
  95. package/dist/media/local-runtime.mjs.map +1 -0
  96. package/dist/media-DqHVh136.mjs +200 -0
  97. package/dist/media-DqHVh136.mjs.map +1 -0
  98. package/dist/mode-C2EzN1uE.mjs +23 -0
  99. package/dist/mode-C2EzN1uE.mjs.map +1 -0
  100. package/dist/page/index.d.mts +140 -0
  101. package/dist/page/index.d.mts.map +1 -0
  102. package/dist/page/index.mjs +416 -0
  103. package/dist/page/index.mjs.map +1 -0
  104. package/dist/placeholder-CmGAmqeO.d.mts +276 -0
  105. package/dist/placeholder-CmGAmqeO.d.mts.map +1 -0
  106. package/dist/placeholder-SmpOx-_v.mjs +243 -0
  107. package/dist/placeholder-SmpOx-_v.mjs.map +1 -0
  108. package/dist/plugin-utils.d.mts +58 -0
  109. package/dist/plugin-utils.d.mts.map +1 -0
  110. package/dist/plugin-utils.mjs +78 -0
  111. package/dist/plugin-utils.mjs.map +1 -0
  112. package/dist/plugins/adapt-sandbox-entry.d.mts +22 -0
  113. package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -0
  114. package/dist/plugins/adapt-sandbox-entry.mjs +113 -0
  115. package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -0
  116. package/dist/query-CS_iSj34.mjs +460 -0
  117. package/dist/query-CS_iSj34.mjs.map +1 -0
  118. package/dist/redirect-DIfIni3r.mjs +329 -0
  119. package/dist/redirect-DIfIni3r.mjs.map +1 -0
  120. package/dist/registry-D_w5HW4G.mjs +863 -0
  121. package/dist/registry-D_w5HW4G.mjs.map +1 -0
  122. package/dist/request-context.d.mts +49 -0
  123. package/dist/request-context.d.mts.map +1 -0
  124. package/dist/request-context.mjs +43 -0
  125. package/dist/request-context.mjs.map +1 -0
  126. package/dist/runner-B-u2F2b6.mjs +1412 -0
  127. package/dist/runner-B-u2F2b6.mjs.map +1 -0
  128. package/dist/runner-EAtf0ZIe.d.mts +27 -0
  129. package/dist/runner-EAtf0ZIe.d.mts.map +1 -0
  130. package/dist/runtime.d.mts +26 -0
  131. package/dist/runtime.d.mts.map +1 -0
  132. package/dist/runtime.mjs +42 -0
  133. package/dist/runtime.mjs.map +1 -0
  134. package/dist/search-DG603UrT.mjs +9211 -0
  135. package/dist/search-DG603UrT.mjs.map +1 -0
  136. package/dist/seed/index.d.mts +3 -0
  137. package/dist/seed/index.mjs +15 -0
  138. package/dist/seo/index.d.mts +70 -0
  139. package/dist/seo/index.d.mts.map +1 -0
  140. package/dist/seo/index.mjs +70 -0
  141. package/dist/seo/index.mjs.map +1 -0
  142. package/dist/storage/local.d.mts +39 -0
  143. package/dist/storage/local.d.mts.map +1 -0
  144. package/dist/storage/local.mjs +166 -0
  145. package/dist/storage/local.mjs.map +1 -0
  146. package/dist/storage/s3.d.mts +32 -0
  147. package/dist/storage/s3.d.mts.map +1 -0
  148. package/dist/storage/s3.mjs +175 -0
  149. package/dist/storage/s3.mjs.map +1 -0
  150. package/dist/tokens-DpgrkrXK.mjs +171 -0
  151. package/dist/tokens-DpgrkrXK.mjs.map +1 -0
  152. package/dist/transport-BFGblqwG.d.mts +42 -0
  153. package/dist/transport-BFGblqwG.d.mts.map +1 -0
  154. package/dist/transport-yxiQsi8I.mjs +418 -0
  155. package/dist/transport-yxiQsi8I.mjs.map +1 -0
  156. package/dist/types-BRuPJGdV.d.mts +102 -0
  157. package/dist/types-BRuPJGdV.d.mts.map +1 -0
  158. package/dist/types-C4-fAxN3.d.mts +182 -0
  159. package/dist/types-C4-fAxN3.d.mts.map +1 -0
  160. package/dist/types-CMMN0pNg.mjs +31 -0
  161. package/dist/types-CMMN0pNg.mjs.map +1 -0
  162. package/dist/types-CUBbjgmP.mjs +16 -0
  163. package/dist/types-CUBbjgmP.mjs.map +1 -0
  164. package/dist/types-DRjfYOEv.d.mts +426 -0
  165. package/dist/types-DRjfYOEv.d.mts.map +1 -0
  166. package/dist/types-DY5zk5HN.mjs +73 -0
  167. package/dist/types-DY5zk5HN.mjs.map +1 -0
  168. package/dist/types-DaNLHo_T.d.mts +184 -0
  169. package/dist/types-DaNLHo_T.d.mts.map +1 -0
  170. package/dist/types-DvhsUmSJ.d.mts +1111 -0
  171. package/dist/types-DvhsUmSJ.d.mts.map +1 -0
  172. package/dist/validate-CpBtVMsD.d.mts +378 -0
  173. package/dist/validate-CpBtVMsD.d.mts.map +1 -0
  174. package/dist/validate-CqRJb_xU.mjs +97 -0
  175. package/dist/validate-CqRJb_xU.mjs.map +1 -0
  176. package/dist/validate-O7PWmlnq.mjs +328 -0
  177. package/dist/validate-O7PWmlnq.mjs.map +1 -0
  178. package/locals.d.ts +46 -0
  179. package/package.json +233 -19
  180. package/src/api/authorize.ts +63 -0
  181. package/src/api/csrf.ts +48 -0
  182. package/src/api/error.ts +99 -0
  183. package/src/api/errors.ts +445 -0
  184. package/src/api/escape.ts +9 -0
  185. package/src/api/handlers/api-tokens.ts +240 -0
  186. package/src/api/handlers/comments.ts +314 -0
  187. package/src/api/handlers/content.ts +1315 -0
  188. package/src/api/handlers/dashboard.ts +205 -0
  189. package/src/api/handlers/device-flow.ts +687 -0
  190. package/src/api/handlers/index.ts +163 -0
  191. package/src/api/handlers/manifest.ts +158 -0
  192. package/src/api/handlers/marketplace.ts +930 -0
  193. package/src/api/handlers/media.ts +207 -0
  194. package/src/api/handlers/menus.ts +493 -0
  195. package/src/api/handlers/oauth-authorization.ts +429 -0
  196. package/src/api/handlers/oauth-clients.ts +353 -0
  197. package/src/api/handlers/oauth-user-lookup.ts +39 -0
  198. package/src/api/handlers/plugins.ts +254 -0
  199. package/src/api/handlers/redirects.ts +360 -0
  200. package/src/api/handlers/revision.ts +145 -0
  201. package/src/api/handlers/schema.ts +534 -0
  202. package/src/api/handlers/sections.ts +289 -0
  203. package/src/api/handlers/seo.ts +115 -0
  204. package/src/api/handlers/settings.ts +49 -0
  205. package/src/api/handlers/snapshot.ts +350 -0
  206. package/src/api/handlers/taxonomies.ts +523 -0
  207. package/src/api/index.ts +6 -0
  208. package/src/api/openapi/document.ts +2368 -0
  209. package/src/api/openapi/index.ts +1 -0
  210. package/src/api/parse.ts +139 -0
  211. package/src/api/redirect.ts +14 -0
  212. package/src/api/rev.ts +67 -0
  213. package/src/api/schemas/auth.ts +112 -0
  214. package/src/api/schemas/bylines.ts +85 -0
  215. package/src/api/schemas/comments.ts +117 -0
  216. package/src/api/schemas/common.ts +89 -0
  217. package/src/api/schemas/content.ts +191 -0
  218. package/src/api/schemas/import.ts +52 -0
  219. package/src/api/schemas/index.ts +17 -0
  220. package/src/api/schemas/media.ts +116 -0
  221. package/src/api/schemas/menus.ts +111 -0
  222. package/src/api/schemas/redirects.ts +155 -0
  223. package/src/api/schemas/schema.ts +203 -0
  224. package/src/api/schemas/search.ts +63 -0
  225. package/src/api/schemas/sections.ts +67 -0
  226. package/src/api/schemas/settings.ts +63 -0
  227. package/src/api/schemas/setup.ts +37 -0
  228. package/src/api/schemas/taxonomies.ts +113 -0
  229. package/src/api/schemas/users.ts +96 -0
  230. package/src/api/schemas/widgets.ts +80 -0
  231. package/src/api/site-url.ts +25 -0
  232. package/src/api/types.ts +82 -0
  233. package/src/astro/index.ts +27 -0
  234. package/src/astro/integration/index.ts +303 -0
  235. package/src/astro/integration/routes.ts +834 -0
  236. package/src/astro/integration/runtime.ts +338 -0
  237. package/src/astro/integration/virtual-modules.ts +469 -0
  238. package/src/astro/integration/vite-config.ts +328 -0
  239. package/src/astro/middleware/auth.ts +743 -0
  240. package/src/astro/middleware/redirect.ts +89 -0
  241. package/src/astro/middleware/request-context.ts +129 -0
  242. package/src/astro/middleware/setup.ts +89 -0
  243. package/src/astro/middleware.ts +398 -0
  244. package/src/astro/routes/PluginRegistry.tsx +15 -0
  245. package/src/astro/routes/admin.astro +81 -0
  246. package/src/astro/routes/api/admin/allowed-domains/[domain].ts +112 -0
  247. package/src/astro/routes/api/admin/allowed-domains/index.ts +108 -0
  248. package/src/astro/routes/api/admin/api-tokens/[id].ts +40 -0
  249. package/src/astro/routes/api/admin/api-tokens/index.ts +68 -0
  250. package/src/astro/routes/api/admin/bylines/[id]/index.ts +87 -0
  251. package/src/astro/routes/api/admin/bylines/index.ts +72 -0
  252. package/src/astro/routes/api/admin/comments/[id]/status.ts +120 -0
  253. package/src/astro/routes/api/admin/comments/[id].ts +64 -0
  254. package/src/astro/routes/api/admin/comments/bulk.ts +42 -0
  255. package/src/astro/routes/api/admin/comments/counts.ts +30 -0
  256. package/src/astro/routes/api/admin/comments/index.ts +46 -0
  257. package/src/astro/routes/api/admin/hooks/exclusive/[hookName].ts +91 -0
  258. package/src/astro/routes/api/admin/hooks/exclusive/index.ts +51 -0
  259. package/src/astro/routes/api/admin/oauth-clients/[id].ts +110 -0
  260. package/src/astro/routes/api/admin/oauth-clients/index.ts +71 -0
  261. package/src/astro/routes/api/admin/plugins/[id]/disable.ts +39 -0
  262. package/src/astro/routes/api/admin/plugins/[id]/enable.ts +39 -0
  263. package/src/astro/routes/api/admin/plugins/[id]/index.ts +38 -0
  264. package/src/astro/routes/api/admin/plugins/[id]/uninstall.ts +48 -0
  265. package/src/astro/routes/api/admin/plugins/[id]/update.ts +59 -0
  266. package/src/astro/routes/api/admin/plugins/index.ts +32 -0
  267. package/src/astro/routes/api/admin/plugins/marketplace/[id]/icon.ts +61 -0
  268. package/src/astro/routes/api/admin/plugins/marketplace/[id]/index.ts +33 -0
  269. package/src/astro/routes/api/admin/plugins/marketplace/[id]/install.ts +62 -0
  270. package/src/astro/routes/api/admin/plugins/marketplace/index.ts +38 -0
  271. package/src/astro/routes/api/admin/plugins/updates.ts +28 -0
  272. package/src/astro/routes/api/admin/themes/marketplace/[id]/index.ts +33 -0
  273. package/src/astro/routes/api/admin/themes/marketplace/[id]/thumbnail.ts +61 -0
  274. package/src/astro/routes/api/admin/themes/marketplace/index.ts +45 -0
  275. package/src/astro/routes/api/admin/users/[id]/disable.ts +69 -0
  276. package/src/astro/routes/api/admin/users/[id]/enable.ts +48 -0
  277. package/src/astro/routes/api/admin/users/[id]/index.ts +146 -0
  278. package/src/astro/routes/api/admin/users/[id]/send-recovery.ts +72 -0
  279. package/src/astro/routes/api/admin/users/index.ts +66 -0
  280. package/src/astro/routes/api/auth/dev-bypass.ts +139 -0
  281. package/src/astro/routes/api/auth/invite/accept.ts +52 -0
  282. package/src/astro/routes/api/auth/invite/complete.ts +84 -0
  283. package/src/astro/routes/api/auth/invite/index.ts +99 -0
  284. package/src/astro/routes/api/auth/logout.ts +40 -0
  285. package/src/astro/routes/api/auth/magic-link/send.ts +89 -0
  286. package/src/astro/routes/api/auth/magic-link/verify.ts +71 -0
  287. package/src/astro/routes/api/auth/me.ts +60 -0
  288. package/src/astro/routes/api/auth/oauth/[provider]/callback.ts +219 -0
  289. package/src/astro/routes/api/auth/oauth/[provider].ts +119 -0
  290. package/src/astro/routes/api/auth/passkey/[id].ts +124 -0
  291. package/src/astro/routes/api/auth/passkey/index.ts +54 -0
  292. package/src/astro/routes/api/auth/passkey/options.ts +82 -0
  293. package/src/astro/routes/api/auth/passkey/register/options.ts +86 -0
  294. package/src/astro/routes/api/auth/passkey/register/verify.ts +117 -0
  295. package/src/astro/routes/api/auth/passkey/verify.ts +66 -0
  296. package/src/astro/routes/api/auth/signup/complete.ts +85 -0
  297. package/src/astro/routes/api/auth/signup/request.ts +77 -0
  298. package/src/astro/routes/api/auth/signup/verify.ts +53 -0
  299. package/src/astro/routes/api/comments/[collection]/[contentId]/index.ts +312 -0
  300. package/src/astro/routes/api/content/[collection]/[id]/compare.ts +28 -0
  301. package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +54 -0
  302. package/src/astro/routes/api/content/[collection]/[id]/duplicate.ts +61 -0
  303. package/src/astro/routes/api/content/[collection]/[id]/permanent.ts +33 -0
  304. package/src/astro/routes/api/content/[collection]/[id]/preview-url.ts +107 -0
  305. package/src/astro/routes/api/content/[collection]/[id]/publish.ts +56 -0
  306. package/src/astro/routes/api/content/[collection]/[id]/restore.ts +54 -0
  307. package/src/astro/routes/api/content/[collection]/[id]/revisions.ts +31 -0
  308. package/src/astro/routes/api/content/[collection]/[id]/schedule.ts +105 -0
  309. package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +140 -0
  310. package/src/astro/routes/api/content/[collection]/[id]/translations.ts +30 -0
  311. package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +56 -0
  312. package/src/astro/routes/api/content/[collection]/[id].ts +137 -0
  313. package/src/astro/routes/api/content/[collection]/index.ts +59 -0
  314. package/src/astro/routes/api/content/[collection]/trash.ts +33 -0
  315. package/src/astro/routes/api/dashboard.ts +32 -0
  316. package/src/astro/routes/api/dev/emails.ts +36 -0
  317. package/src/astro/routes/api/import/probe.ts +47 -0
  318. package/src/astro/routes/api/import/wordpress/analyze.ts +510 -0
  319. package/src/astro/routes/api/import/wordpress/execute.ts +283 -0
  320. package/src/astro/routes/api/import/wordpress/media.ts +338 -0
  321. package/src/astro/routes/api/import/wordpress/prepare.ts +181 -0
  322. package/src/astro/routes/api/import/wordpress/rewrite-urls.ts +393 -0
  323. package/src/astro/routes/api/import/wordpress-plugin/analyze.ts +111 -0
  324. package/src/astro/routes/api/import/wordpress-plugin/callback.ts +58 -0
  325. package/src/astro/routes/api/import/wordpress-plugin/execute.ts +347 -0
  326. package/src/astro/routes/api/manifest.ts +62 -0
  327. package/src/astro/routes/api/mcp.ts +124 -0
  328. package/src/astro/routes/api/media/[id]/confirm.ts +93 -0
  329. package/src/astro/routes/api/media/[id].ts +145 -0
  330. package/src/astro/routes/api/media/file/[key].ts +79 -0
  331. package/src/astro/routes/api/media/providers/[providerId]/[itemId].ts +86 -0
  332. package/src/astro/routes/api/media/providers/[providerId]/index.ts +111 -0
  333. package/src/astro/routes/api/media/providers/index.ts +30 -0
  334. package/src/astro/routes/api/media/upload-url.ts +137 -0
  335. package/src/astro/routes/api/media.ts +190 -0
  336. package/src/astro/routes/api/menus/[name]/items.ts +87 -0
  337. package/src/astro/routes/api/menus/[name]/reorder.ts +33 -0
  338. package/src/astro/routes/api/menus/[name].ts +65 -0
  339. package/src/astro/routes/api/menus/index.ts +47 -0
  340. package/src/astro/routes/api/oauth/authorize.ts +412 -0
  341. package/src/astro/routes/api/oauth/device/authorize.ts +45 -0
  342. package/src/astro/routes/api/oauth/device/code.ts +51 -0
  343. package/src/astro/routes/api/oauth/device/token.ts +69 -0
  344. package/src/astro/routes/api/oauth/token/refresh.ts +38 -0
  345. package/src/astro/routes/api/oauth/token/revoke.ts +38 -0
  346. package/src/astro/routes/api/oauth/token.ts +184 -0
  347. package/src/astro/routes/api/openapi.json.ts +32 -0
  348. package/src/astro/routes/api/plugins/[pluginId]/[...path].ts +92 -0
  349. package/src/astro/routes/api/redirects/404s/index.ts +72 -0
  350. package/src/astro/routes/api/redirects/404s/summary.ts +33 -0
  351. package/src/astro/routes/api/redirects/[id].ts +84 -0
  352. package/src/astro/routes/api/redirects/index.ts +52 -0
  353. package/src/astro/routes/api/revisions/[revisionId]/index.ts +29 -0
  354. package/src/astro/routes/api/revisions/[revisionId]/restore.ts +62 -0
  355. package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +76 -0
  356. package/src/astro/routes/api/schema/collections/[slug]/fields/index.ts +52 -0
  357. package/src/astro/routes/api/schema/collections/[slug]/fields/reorder.ts +32 -0
  358. package/src/astro/routes/api/schema/collections/[slug]/index.ts +80 -0
  359. package/src/astro/routes/api/schema/collections/index.ts +47 -0
  360. package/src/astro/routes/api/schema/index.ts +109 -0
  361. package/src/astro/routes/api/schema/orphans/[slug].ts +36 -0
  362. package/src/astro/routes/api/schema/orphans/index.ts +26 -0
  363. package/src/astro/routes/api/search/enable.ts +64 -0
  364. package/src/astro/routes/api/search/index.ts +55 -0
  365. package/src/astro/routes/api/search/rebuild.ts +72 -0
  366. package/src/astro/routes/api/search/stats.ts +35 -0
  367. package/src/astro/routes/api/search/suggest.ts +53 -0
  368. package/src/astro/routes/api/sections/[slug].ts +84 -0
  369. package/src/astro/routes/api/sections/index.ts +52 -0
  370. package/src/astro/routes/api/settings/email.ts +150 -0
  371. package/src/astro/routes/api/settings.ts +67 -0
  372. package/src/astro/routes/api/setup/admin-verify.ts +100 -0
  373. package/src/astro/routes/api/setup/admin.ts +94 -0
  374. package/src/astro/routes/api/setup/dev-bypass.ts +199 -0
  375. package/src/astro/routes/api/setup/dev-reset.ts +40 -0
  376. package/src/astro/routes/api/setup/index.ts +126 -0
  377. package/src/astro/routes/api/setup/status.ts +122 -0
  378. package/src/astro/routes/api/snapshot.ts +75 -0
  379. package/src/astro/routes/api/taxonomies/[name]/terms/[slug].ts +95 -0
  380. package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +69 -0
  381. package/src/astro/routes/api/taxonomies/index.ts +59 -0
  382. package/src/astro/routes/api/themes/preview.ts +77 -0
  383. package/src/astro/routes/api/typegen.ts +114 -0
  384. package/src/astro/routes/api/well-known/auth.ts +68 -0
  385. package/src/astro/routes/api/well-known/oauth-authorization-server.ts +44 -0
  386. package/src/astro/routes/api/well-known/oauth-protected-resource.ts +37 -0
  387. package/src/astro/routes/api/widget-areas/[name]/reorder.ts +72 -0
  388. package/src/astro/routes/api/widget-areas/[name]/widgets/[id].ts +127 -0
  389. package/src/astro/routes/api/widget-areas/[name]/widgets.ts +80 -0
  390. package/src/astro/routes/api/widget-areas/[name].ts +87 -0
  391. package/src/astro/routes/api/widget-areas/index.ts +99 -0
  392. package/src/astro/routes/api/widget-components.ts +22 -0
  393. package/src/astro/routes/robots.txt.ts +77 -0
  394. package/src/astro/routes/sitemap.xml.ts +97 -0
  395. package/src/astro/storage/adapters.ts +74 -0
  396. package/src/astro/storage/index.ts +19 -0
  397. package/src/astro/storage/types.ts +60 -0
  398. package/src/astro/types.ts +346 -0
  399. package/src/auth/api-tokens.ts +25 -0
  400. package/src/auth/challenge-store.ts +80 -0
  401. package/src/auth/mode.ts +96 -0
  402. package/src/auth/oauth-state-store.ts +96 -0
  403. package/src/auth/passkey-config.ts +27 -0
  404. package/src/auth/rate-limit.ts +158 -0
  405. package/src/auth/scopes.ts +33 -0
  406. package/src/auth/types.ts +104 -0
  407. package/src/aws-sdk.d.ts +100 -0
  408. package/src/bylines/index.ts +237 -0
  409. package/src/cleanup.ts +153 -0
  410. package/src/cli/client-factory.ts +100 -0
  411. package/src/cli/commands/auth.ts +46 -0
  412. package/src/cli/commands/bundle-utils.ts +247 -0
  413. package/src/cli/commands/bundle.ts +609 -0
  414. package/src/cli/commands/content.ts +442 -0
  415. package/src/cli/commands/dev.ts +191 -0
  416. package/src/cli/commands/doctor.ts +211 -0
  417. package/src/cli/commands/export-seed.ts +630 -0
  418. package/src/cli/commands/import/wordpress.ts +1056 -0
  419. package/src/cli/commands/init.ts +192 -0
  420. package/src/cli/commands/login.ts +547 -0
  421. package/src/cli/commands/media.ts +165 -0
  422. package/src/cli/commands/menu.ts +67 -0
  423. package/src/cli/commands/plugin-init.ts +291 -0
  424. package/src/cli/commands/plugin-validate.ts +31 -0
  425. package/src/cli/commands/plugin.ts +33 -0
  426. package/src/cli/commands/publish.ts +699 -0
  427. package/src/cli/commands/schema.ts +233 -0
  428. package/src/cli/commands/search-cmd.ts +54 -0
  429. package/src/cli/commands/seed.ts +288 -0
  430. package/src/cli/commands/taxonomy.ts +128 -0
  431. package/src/cli/commands/types.ts +68 -0
  432. package/src/cli/credentials.ts +236 -0
  433. package/src/cli/index.ts +70 -0
  434. package/src/cli/output.ts +75 -0
  435. package/src/cli/wxr/parser.ts +969 -0
  436. package/src/client/cf-access.ts +193 -0
  437. package/src/client/index.ts +854 -0
  438. package/src/client/portable-text.ts +413 -0
  439. package/src/client/transport.ts +200 -0
  440. package/src/comments/moderator.ts +46 -0
  441. package/src/comments/notifications.ts +144 -0
  442. package/src/comments/query.ts +105 -0
  443. package/src/comments/service.ts +213 -0
  444. package/src/components/Break.astro +45 -0
  445. package/src/components/Button.astro +71 -0
  446. package/src/components/Buttons.astro +49 -0
  447. package/src/components/Code.astro +59 -0
  448. package/src/components/Columns.astro +59 -0
  449. package/src/components/CommentForm.astro +315 -0
  450. package/src/components/Comments.astro +232 -0
  451. package/src/components/Cover.astro +128 -0
  452. package/src/components/EmDashBodyEnd.astro +32 -0
  453. package/src/components/EmDashBodyStart.astro +32 -0
  454. package/src/components/EmDashHead.astro +53 -0
  455. package/src/components/EmDashImage.astro +178 -0
  456. package/src/components/EmDashMedia.astro +167 -0
  457. package/src/components/Embed.astro +128 -0
  458. package/src/components/File.astro +122 -0
  459. package/src/components/Gallery.astro +93 -0
  460. package/src/components/HtmlBlock.astro +33 -0
  461. package/src/components/Image.astro +178 -0
  462. package/src/components/InlineEditor.astro +27 -0
  463. package/src/components/InlinePortableTextEditor.tsx +1905 -0
  464. package/src/components/LiveSearch.astro +614 -0
  465. package/src/components/PortableText.astro +51 -0
  466. package/src/components/Pullquote.astro +51 -0
  467. package/src/components/Table.astro +108 -0
  468. package/src/components/WidgetArea.astro +22 -0
  469. package/src/components/WidgetRenderer.astro +72 -0
  470. package/src/components/index.ts +116 -0
  471. package/src/components/marks/Link.astro +31 -0
  472. package/src/components/marks/StrikeThrough.astro +7 -0
  473. package/src/components/marks/Subscript.astro +7 -0
  474. package/src/components/marks/Superscript.astro +7 -0
  475. package/src/components/marks/Underline.astro +7 -0
  476. package/src/components/widgets/Archives.astro +65 -0
  477. package/src/components/widgets/Categories.astro +35 -0
  478. package/src/components/widgets/RecentPosts.astro +51 -0
  479. package/src/components/widgets/Search.astro +18 -0
  480. package/src/components/widgets/Tags.astro +38 -0
  481. package/src/content/converters/index.ts +9 -0
  482. package/src/content/converters/portable-text-to-prosemirror.ts +385 -0
  483. package/src/content/converters/prosemirror-to-portable-text.ts +413 -0
  484. package/src/content/converters/types.ts +120 -0
  485. package/src/content/index.ts +5 -0
  486. package/src/database/connection.ts +67 -0
  487. package/src/database/dialect-helpers.ts +138 -0
  488. package/src/database/index.ts +5 -0
  489. package/src/database/migrations/001_initial.ts +136 -0
  490. package/src/database/migrations/002_media_status.ts +26 -0
  491. package/src/database/migrations/003_schema_registry.ts +79 -0
  492. package/src/database/migrations/004_plugins.ts +62 -0
  493. package/src/database/migrations/005_menus.ts +67 -0
  494. package/src/database/migrations/006_taxonomy_defs.ts +51 -0
  495. package/src/database/migrations/007_widgets.ts +42 -0
  496. package/src/database/migrations/008_auth.ts +194 -0
  497. package/src/database/migrations/009_user_disabled.ts +27 -0
  498. package/src/database/migrations/011_sections.ts +65 -0
  499. package/src/database/migrations/012_search.ts +25 -0
  500. package/src/database/migrations/013_scheduled_publishing.ts +51 -0
  501. package/src/database/migrations/014_draft_revisions.ts +72 -0
  502. package/src/database/migrations/015_indexes.ts +82 -0
  503. package/src/database/migrations/016_api_tokens.ts +89 -0
  504. package/src/database/migrations/017_authorization_codes.ts +45 -0
  505. package/src/database/migrations/018_seo.ts +56 -0
  506. package/src/database/migrations/019_i18n.ts +618 -0
  507. package/src/database/migrations/020_collection_url_pattern.ts +23 -0
  508. package/src/database/migrations/021_remove_section_categories.ts +43 -0
  509. package/src/database/migrations/022_marketplace_plugin_state.ts +46 -0
  510. package/src/database/migrations/023_plugin_metadata.ts +33 -0
  511. package/src/database/migrations/024_media_placeholders.ts +32 -0
  512. package/src/database/migrations/025_oauth_clients.ts +28 -0
  513. package/src/database/migrations/026_cron_tasks.ts +49 -0
  514. package/src/database/migrations/027_comments.ts +87 -0
  515. package/src/database/migrations/028_drop_author_url.ts +9 -0
  516. package/src/database/migrations/029_redirects.ts +67 -0
  517. package/src/database/migrations/030_widen_scheduled_index.ts +48 -0
  518. package/src/database/migrations/031_bylines.ts +90 -0
  519. package/src/database/migrations/032_rate_limits.ts +42 -0
  520. package/src/database/migrations/runner.ts +170 -0
  521. package/src/database/repositories/audit.ts +294 -0
  522. package/src/database/repositories/byline.ts +387 -0
  523. package/src/database/repositories/comment.ts +458 -0
  524. package/src/database/repositories/content.ts +1144 -0
  525. package/src/database/repositories/index.ts +30 -0
  526. package/src/database/repositories/media.ts +347 -0
  527. package/src/database/repositories/options.ts +150 -0
  528. package/src/database/repositories/plugin-storage.ts +373 -0
  529. package/src/database/repositories/redirect.ts +480 -0
  530. package/src/database/repositories/revision.ts +200 -0
  531. package/src/database/repositories/seo.ts +176 -0
  532. package/src/database/repositories/taxonomy.ts +294 -0
  533. package/src/database/repositories/types.ts +132 -0
  534. package/src/database/repositories/user.ts +258 -0
  535. package/src/database/transaction.ts +54 -0
  536. package/src/database/types.ts +501 -0
  537. package/src/database/validate.ts +138 -0
  538. package/src/db/adapters.ts +125 -0
  539. package/src/db/index.ts +37 -0
  540. package/src/db/libsql.ts +23 -0
  541. package/src/db/postgres.ts +30 -0
  542. package/src/db/sqlite.ts +27 -0
  543. package/src/emdash-runtime.ts +2096 -0
  544. package/src/fields/boolean.ts +34 -0
  545. package/src/fields/datetime.ts +44 -0
  546. package/src/fields/file.ts +41 -0
  547. package/src/fields/image.ts +34 -0
  548. package/src/fields/index.ts +42 -0
  549. package/src/fields/integer.ts +50 -0
  550. package/src/fields/json.ts +37 -0
  551. package/src/fields/multiselect.ts +48 -0
  552. package/src/fields/number.ts +52 -0
  553. package/src/fields/portable-text.ts +33 -0
  554. package/src/fields/reference.ts +29 -0
  555. package/src/fields/richtext.ts +31 -0
  556. package/src/fields/select.ts +46 -0
  557. package/src/fields/slug.ts +38 -0
  558. package/src/fields/text.ts +55 -0
  559. package/src/fields/textarea.ts +52 -0
  560. package/src/fields/types.ts +64 -0
  561. package/src/i18n/config.ts +68 -0
  562. package/src/import/index.ts +90 -0
  563. package/src/import/menus.ts +436 -0
  564. package/src/import/registry.ts +111 -0
  565. package/src/import/sections.ts +103 -0
  566. package/src/import/settings.ts +281 -0
  567. package/src/import/sources/wordpress-plugin.ts +641 -0
  568. package/src/import/sources/wordpress-rest.ts +191 -0
  569. package/src/import/sources/wxr.ts +330 -0
  570. package/src/import/ssrf.ts +260 -0
  571. package/src/import/types.ts +418 -0
  572. package/src/import/utils.ts +412 -0
  573. package/src/index.ts +481 -0
  574. package/src/loader.ts +770 -0
  575. package/src/mcp/server.ts +1463 -0
  576. package/src/media/index.ts +32 -0
  577. package/src/media/local-runtime.ts +213 -0
  578. package/src/media/local.ts +46 -0
  579. package/src/media/normalize.ts +190 -0
  580. package/src/media/placeholder.ts +150 -0
  581. package/src/media/provider-loader.ts +78 -0
  582. package/src/media/types.ts +279 -0
  583. package/src/menus/index.ts +324 -0
  584. package/src/menus/types.ts +112 -0
  585. package/src/page/context.ts +93 -0
  586. package/src/page/fragments.ts +89 -0
  587. package/src/page/index.ts +58 -0
  588. package/src/page/jsonld.ts +94 -0
  589. package/src/page/metadata.ts +185 -0
  590. package/src/page/seo-contributions.ts +136 -0
  591. package/src/plugin-utils.ts +80 -0
  592. package/src/plugins/adapt-sandbox-entry.ts +207 -0
  593. package/src/plugins/context.ts +833 -0
  594. package/src/plugins/cron.ts +361 -0
  595. package/src/plugins/define-plugin.ts +259 -0
  596. package/src/plugins/email-console.ts +73 -0
  597. package/src/plugins/email.ts +209 -0
  598. package/src/plugins/hooks.ts +1273 -0
  599. package/src/plugins/index.ts +193 -0
  600. package/src/plugins/manager.ts +595 -0
  601. package/src/plugins/manifest-schema.ts +230 -0
  602. package/src/plugins/marketplace.ts +460 -0
  603. package/src/plugins/request-meta.ts +139 -0
  604. package/src/plugins/routes.ts +302 -0
  605. package/src/plugins/sandbox/index.ts +18 -0
  606. package/src/plugins/sandbox/noop.ts +76 -0
  607. package/src/plugins/sandbox/types.ts +173 -0
  608. package/src/plugins/scheduler/node.ts +122 -0
  609. package/src/plugins/scheduler/piggyback.ts +71 -0
  610. package/src/plugins/scheduler/types.ts +27 -0
  611. package/src/plugins/state.ts +208 -0
  612. package/src/plugins/storage-indexes.ts +326 -0
  613. package/src/plugins/storage-query.ts +240 -0
  614. package/src/plugins/types.ts +1284 -0
  615. package/src/preview/helpers.ts +27 -0
  616. package/src/preview/index.ts +40 -0
  617. package/src/preview/tokens.ts +279 -0
  618. package/src/preview/urls.ts +118 -0
  619. package/src/query.ts +674 -0
  620. package/src/redirects/patterns.ts +224 -0
  621. package/src/request-context.ts +67 -0
  622. package/src/runtime.ts +21 -0
  623. package/src/schema/index.ts +29 -0
  624. package/src/schema/query.ts +44 -0
  625. package/src/schema/registry.ts +965 -0
  626. package/src/schema/types.ts +276 -0
  627. package/src/schema/zod-generator.ts +413 -0
  628. package/src/search/fts-manager.ts +452 -0
  629. package/src/search/index.ts +26 -0
  630. package/src/search/query.ts +396 -0
  631. package/src/search/text-extraction.ts +162 -0
  632. package/src/search/types.ts +114 -0
  633. package/src/sections/index.ts +226 -0
  634. package/src/sections/types.ts +86 -0
  635. package/src/seed/apply.ts +1141 -0
  636. package/src/seed/default.ts +86 -0
  637. package/src/seed/index.ts +28 -0
  638. package/src/seed/load.ts +35 -0
  639. package/src/seed/types.ts +341 -0
  640. package/src/seed/validate.ts +642 -0
  641. package/src/seo/index.ts +179 -0
  642. package/src/settings/index.ts +203 -0
  643. package/src/settings/types.ts +58 -0
  644. package/src/storage/index.ts +28 -0
  645. package/src/storage/local.ts +253 -0
  646. package/src/storage/s3.ts +271 -0
  647. package/src/storage/types.ts +204 -0
  648. package/src/taxonomies/index.ts +309 -0
  649. package/src/taxonomies/types.ts +61 -0
  650. package/src/ui.ts +75 -0
  651. package/src/utils/base64.ts +73 -0
  652. package/src/utils/hash.ts +36 -0
  653. package/src/utils/sanitize.ts +20 -0
  654. package/src/utils/slugify.ts +29 -0
  655. package/src/utils/url.ts +48 -0
  656. package/src/virtual-modules.d.ts +111 -0
  657. package/src/visual-editing/editable.ts +108 -0
  658. package/src/visual-editing/toolbar.ts +1229 -0
  659. package/src/widgets/components.ts +105 -0
  660. package/src/widgets/index.ts +131 -0
  661. package/src/widgets/types.ts +81 -0
@@ -0,0 +1,1333 @@
1
+ import { t as defaultSeed } from "../default-Cyi4aAxu.mjs";
2
+ import { createRequire } from "node:module";
3
+ import { dirname, resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { readFileSync } from "node:fs";
6
+
7
+ //#region src/astro/storage/adapters.ts
8
+ /**
9
+ * S3-compatible storage adapter
10
+ *
11
+ * Works with AWS S3, Cloudflare R2 (via S3 API), Minio, etc.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * storage: s3({
16
+ * endpoint: "https://xxx.r2.cloudflarestorage.com",
17
+ * bucket: "media",
18
+ * accessKeyId: process.env.R2_ACCESS_KEY_ID!,
19
+ * secretAccessKey: process.env.R2_SECRET_ACCESS_KEY!,
20
+ * publicUrl: "https://cdn.example.com", // optional CDN
21
+ * })
22
+ * ```
23
+ */
24
+ function s3(config) {
25
+ return {
26
+ entrypoint: "emdash/storage/s3",
27
+ config
28
+ };
29
+ }
30
+ /**
31
+ * Local filesystem storage adapter
32
+ *
33
+ * For development and testing. Stores files in a local directory.
34
+ * Does NOT support signed upload URLs.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * storage: local({
39
+ * directory: "./uploads",
40
+ * baseUrl: "/_emdash/api/media/file",
41
+ * })
42
+ * ```
43
+ */
44
+ function local(config) {
45
+ return {
46
+ entrypoint: "emdash/storage/local",
47
+ config
48
+ };
49
+ }
50
+
51
+ //#endregion
52
+ //#region src/astro/integration/routes.ts
53
+ /**
54
+ * Route Injection
55
+ *
56
+ * Defines and injects all EmDash routes into the Astro application.
57
+ */
58
+ /**
59
+ * Resolve path to a route file in the package
60
+ * Uses Node.js APIs - only call at build time
61
+ */
62
+ function resolveRoute(route) {
63
+ const require = createRequire(import.meta.url);
64
+ const __dirname = dirname(fileURLToPath(import.meta.url));
65
+ try {
66
+ return require.resolve(`emdash/routes/${route}`);
67
+ } catch {
68
+ return resolve(__dirname, "../routes", route);
69
+ }
70
+ }
71
+ /**
72
+ * Injects all core EmDash routes.
73
+ */
74
+ function injectCoreRoutes(injectRoute) {
75
+ injectRoute({
76
+ pattern: "/_emdash/admin/[...path]",
77
+ entrypoint: resolveRoute("admin.astro")
78
+ });
79
+ injectRoute({
80
+ pattern: "/_emdash/api/manifest",
81
+ entrypoint: resolveRoute("api/manifest.ts")
82
+ });
83
+ injectRoute({
84
+ pattern: "/_emdash/api/dashboard",
85
+ entrypoint: resolveRoute("api/dashboard.ts")
86
+ });
87
+ injectRoute({
88
+ pattern: "/_emdash/api/content/[collection]",
89
+ entrypoint: resolveRoute("api/content/[collection]/index.ts")
90
+ });
91
+ injectRoute({
92
+ pattern: "/_emdash/api/content/[collection]/[id]",
93
+ entrypoint: resolveRoute("api/content/[collection]/[id].ts")
94
+ });
95
+ injectRoute({
96
+ pattern: "/_emdash/api/content/[collection]/[id]/revisions",
97
+ entrypoint: resolveRoute("api/content/[collection]/[id]/revisions.ts")
98
+ });
99
+ injectRoute({
100
+ pattern: "/_emdash/api/content/[collection]/[id]/preview-url",
101
+ entrypoint: resolveRoute("api/content/[collection]/[id]/preview-url.ts")
102
+ });
103
+ injectRoute({
104
+ pattern: "/_emdash/api/content/[collection]/trash",
105
+ entrypoint: resolveRoute("api/content/[collection]/trash.ts")
106
+ });
107
+ injectRoute({
108
+ pattern: "/_emdash/api/content/[collection]/[id]/restore",
109
+ entrypoint: resolveRoute("api/content/[collection]/[id]/restore.ts")
110
+ });
111
+ injectRoute({
112
+ pattern: "/_emdash/api/content/[collection]/[id]/permanent",
113
+ entrypoint: resolveRoute("api/content/[collection]/[id]/permanent.ts")
114
+ });
115
+ injectRoute({
116
+ pattern: "/_emdash/api/content/[collection]/[id]/duplicate",
117
+ entrypoint: resolveRoute("api/content/[collection]/[id]/duplicate.ts")
118
+ });
119
+ injectRoute({
120
+ pattern: "/_emdash/api/content/[collection]/[id]/publish",
121
+ entrypoint: resolveRoute("api/content/[collection]/[id]/publish.ts")
122
+ });
123
+ injectRoute({
124
+ pattern: "/_emdash/api/content/[collection]/[id]/unpublish",
125
+ entrypoint: resolveRoute("api/content/[collection]/[id]/unpublish.ts")
126
+ });
127
+ injectRoute({
128
+ pattern: "/_emdash/api/content/[collection]/[id]/discard-draft",
129
+ entrypoint: resolveRoute("api/content/[collection]/[id]/discard-draft.ts")
130
+ });
131
+ injectRoute({
132
+ pattern: "/_emdash/api/content/[collection]/[id]/compare",
133
+ entrypoint: resolveRoute("api/content/[collection]/[id]/compare.ts")
134
+ });
135
+ injectRoute({
136
+ pattern: "/_emdash/api/content/[collection]/[id]/translations",
137
+ entrypoint: resolveRoute("api/content/[collection]/[id]/translations.ts")
138
+ });
139
+ injectRoute({
140
+ pattern: "/_emdash/api/content/[collection]/[id]/schedule",
141
+ entrypoint: resolveRoute("api/content/[collection]/[id]/schedule.ts")
142
+ });
143
+ injectRoute({
144
+ pattern: "/_emdash/api/revisions/[revisionId]",
145
+ entrypoint: resolveRoute("api/revisions/[revisionId]/index.ts")
146
+ });
147
+ injectRoute({
148
+ pattern: "/_emdash/api/revisions/[revisionId]/restore",
149
+ entrypoint: resolveRoute("api/revisions/[revisionId]/restore.ts")
150
+ });
151
+ injectRoute({
152
+ pattern: "/_emdash/api/media",
153
+ entrypoint: resolveRoute("api/media.ts")
154
+ });
155
+ injectRoute({
156
+ pattern: "/_emdash/api/media/upload-url",
157
+ entrypoint: resolveRoute("api/media/upload-url.ts")
158
+ });
159
+ injectRoute({
160
+ pattern: "/_emdash/api/media/file/[key]",
161
+ entrypoint: resolveRoute("api/media/file/[key].ts")
162
+ });
163
+ injectRoute({
164
+ pattern: "/_emdash/api/media/[id]",
165
+ entrypoint: resolveRoute("api/media/[id].ts")
166
+ });
167
+ injectRoute({
168
+ pattern: "/_emdash/api/media/[id]/confirm",
169
+ entrypoint: resolveRoute("api/media/[id]/confirm.ts")
170
+ });
171
+ injectRoute({
172
+ pattern: "/_emdash/api/media/providers",
173
+ entrypoint: resolveRoute("api/media/providers/index.ts")
174
+ });
175
+ injectRoute({
176
+ pattern: "/_emdash/api/media/providers/[providerId]",
177
+ entrypoint: resolveRoute("api/media/providers/[providerId]/index.ts")
178
+ });
179
+ injectRoute({
180
+ pattern: "/_emdash/api/media/providers/[providerId]/[itemId]",
181
+ entrypoint: resolveRoute("api/media/providers/[providerId]/[itemId].ts")
182
+ });
183
+ injectRoute({
184
+ pattern: "/_emdash/api/import/probe",
185
+ entrypoint: resolveRoute("api/import/probe.ts")
186
+ });
187
+ injectRoute({
188
+ pattern: "/_emdash/api/import/wordpress/analyze",
189
+ entrypoint: resolveRoute("api/import/wordpress/analyze.ts")
190
+ });
191
+ injectRoute({
192
+ pattern: "/_emdash/api/import/wordpress/prepare",
193
+ entrypoint: resolveRoute("api/import/wordpress/prepare.ts")
194
+ });
195
+ injectRoute({
196
+ pattern: "/_emdash/api/import/wordpress/execute",
197
+ entrypoint: resolveRoute("api/import/wordpress/execute.ts")
198
+ });
199
+ injectRoute({
200
+ pattern: "/_emdash/api/import/wordpress/media",
201
+ entrypoint: resolveRoute("api/import/wordpress/media.ts")
202
+ });
203
+ injectRoute({
204
+ pattern: "/_emdash/api/import/wordpress/rewrite-urls",
205
+ entrypoint: resolveRoute("api/import/wordpress/rewrite-urls.ts")
206
+ });
207
+ injectRoute({
208
+ pattern: "/_emdash/api/import/wordpress-plugin/analyze",
209
+ entrypoint: resolveRoute("api/import/wordpress-plugin/analyze.ts")
210
+ });
211
+ injectRoute({
212
+ pattern: "/_emdash/api/import/wordpress-plugin/execute",
213
+ entrypoint: resolveRoute("api/import/wordpress-plugin/execute.ts")
214
+ });
215
+ injectRoute({
216
+ pattern: "/_emdash/api/import/wordpress-plugin/callback",
217
+ entrypoint: resolveRoute("api/import/wordpress-plugin/callback.ts")
218
+ });
219
+ injectRoute({
220
+ pattern: "/_emdash/api/schema",
221
+ entrypoint: resolveRoute("api/schema/index.ts")
222
+ });
223
+ injectRoute({
224
+ pattern: "/_emdash/api/typegen",
225
+ entrypoint: resolveRoute("api/typegen.ts")
226
+ });
227
+ injectRoute({
228
+ pattern: "/_emdash/api/schema/collections",
229
+ entrypoint: resolveRoute("api/schema/collections/index.ts")
230
+ });
231
+ injectRoute({
232
+ pattern: "/_emdash/api/schema/collections/[slug]",
233
+ entrypoint: resolveRoute("api/schema/collections/[slug]/index.ts")
234
+ });
235
+ injectRoute({
236
+ pattern: "/_emdash/api/schema/collections/[slug]/fields",
237
+ entrypoint: resolveRoute("api/schema/collections/[slug]/fields/index.ts")
238
+ });
239
+ injectRoute({
240
+ pattern: "/_emdash/api/schema/collections/[slug]/fields/reorder",
241
+ entrypoint: resolveRoute("api/schema/collections/[slug]/fields/reorder.ts")
242
+ });
243
+ injectRoute({
244
+ pattern: "/_emdash/api/schema/collections/[slug]/fields/[fieldSlug]",
245
+ entrypoint: resolveRoute("api/schema/collections/[slug]/fields/[fieldSlug].ts")
246
+ });
247
+ injectRoute({
248
+ pattern: "/_emdash/api/schema/orphans",
249
+ entrypoint: resolveRoute("api/schema/orphans/index.ts")
250
+ });
251
+ injectRoute({
252
+ pattern: "/_emdash/api/schema/orphans/[slug]",
253
+ entrypoint: resolveRoute("api/schema/orphans/[slug].ts")
254
+ });
255
+ injectRoute({
256
+ pattern: "/_emdash/api/settings",
257
+ entrypoint: resolveRoute("api/settings.ts")
258
+ });
259
+ injectRoute({
260
+ pattern: "/_emdash/api/snapshot",
261
+ entrypoint: resolveRoute("api/snapshot.ts")
262
+ });
263
+ injectRoute({
264
+ pattern: "/_emdash/api/taxonomies",
265
+ entrypoint: resolveRoute("api/taxonomies/index.ts")
266
+ });
267
+ injectRoute({
268
+ pattern: "/_emdash/api/taxonomies/[name]/terms",
269
+ entrypoint: resolveRoute("api/taxonomies/[name]/terms/index.ts")
270
+ });
271
+ injectRoute({
272
+ pattern: "/_emdash/api/taxonomies/[name]/terms/[slug]",
273
+ entrypoint: resolveRoute("api/taxonomies/[name]/terms/[slug].ts")
274
+ });
275
+ injectRoute({
276
+ pattern: "/_emdash/api/content/[collection]/[id]/terms/[taxonomy]",
277
+ entrypoint: resolveRoute("api/content/[collection]/[id]/terms/[taxonomy].ts")
278
+ });
279
+ injectRoute({
280
+ pattern: "/_emdash/api/admin/plugins",
281
+ entrypoint: resolveRoute("api/admin/plugins/index.ts")
282
+ });
283
+ injectRoute({
284
+ pattern: "/_emdash/api/admin/plugins/[id]",
285
+ entrypoint: resolveRoute("api/admin/plugins/[id]/index.ts")
286
+ });
287
+ injectRoute({
288
+ pattern: "/_emdash/api/admin/plugins/[id]/enable",
289
+ entrypoint: resolveRoute("api/admin/plugins/[id]/enable.ts")
290
+ });
291
+ injectRoute({
292
+ pattern: "/_emdash/api/admin/plugins/[id]/disable",
293
+ entrypoint: resolveRoute("api/admin/plugins/[id]/disable.ts")
294
+ });
295
+ injectRoute({
296
+ pattern: "/_emdash/api/admin/plugins/marketplace",
297
+ entrypoint: resolveRoute("api/admin/plugins/marketplace/index.ts")
298
+ });
299
+ injectRoute({
300
+ pattern: "/_emdash/api/admin/plugins/marketplace/[id]",
301
+ entrypoint: resolveRoute("api/admin/plugins/marketplace/[id]/index.ts")
302
+ });
303
+ injectRoute({
304
+ pattern: "/_emdash/api/admin/plugins/marketplace/[id]/icon",
305
+ entrypoint: resolveRoute("api/admin/plugins/marketplace/[id]/icon.ts")
306
+ });
307
+ injectRoute({
308
+ pattern: "/_emdash/api/admin/plugins/marketplace/[id]/install",
309
+ entrypoint: resolveRoute("api/admin/plugins/marketplace/[id]/install.ts")
310
+ });
311
+ injectRoute({
312
+ pattern: "/_emdash/api/admin/plugins/[id]/update",
313
+ entrypoint: resolveRoute("api/admin/plugins/[id]/update.ts")
314
+ });
315
+ injectRoute({
316
+ pattern: "/_emdash/api/admin/plugins/[id]/uninstall",
317
+ entrypoint: resolveRoute("api/admin/plugins/[id]/uninstall.ts")
318
+ });
319
+ injectRoute({
320
+ pattern: "/_emdash/api/admin/plugins/updates",
321
+ entrypoint: resolveRoute("api/admin/plugins/updates.ts")
322
+ });
323
+ injectRoute({
324
+ pattern: "/_emdash/api/admin/hooks/exclusive",
325
+ entrypoint: resolveRoute("api/admin/hooks/exclusive/index.ts")
326
+ });
327
+ injectRoute({
328
+ pattern: "/_emdash/api/admin/hooks/exclusive/[hookName]",
329
+ entrypoint: resolveRoute("api/admin/hooks/exclusive/[hookName].ts")
330
+ });
331
+ injectRoute({
332
+ pattern: "/_emdash/api/admin/themes/marketplace",
333
+ entrypoint: resolveRoute("api/admin/themes/marketplace/index.ts")
334
+ });
335
+ injectRoute({
336
+ pattern: "/_emdash/api/admin/themes/marketplace/[id]",
337
+ entrypoint: resolveRoute("api/admin/themes/marketplace/[id]/index.ts")
338
+ });
339
+ injectRoute({
340
+ pattern: "/_emdash/api/admin/themes/marketplace/[id]/thumbnail",
341
+ entrypoint: resolveRoute("api/admin/themes/marketplace/[id]/thumbnail.ts")
342
+ });
343
+ injectRoute({
344
+ pattern: "/_emdash/api/themes/preview",
345
+ entrypoint: resolveRoute("api/themes/preview.ts")
346
+ });
347
+ injectRoute({
348
+ pattern: "/_emdash/api/admin/users",
349
+ entrypoint: resolveRoute("api/admin/users/index.ts")
350
+ });
351
+ injectRoute({
352
+ pattern: "/_emdash/api/admin/bylines",
353
+ entrypoint: resolveRoute("api/admin/bylines/index.ts")
354
+ });
355
+ injectRoute({
356
+ pattern: "/_emdash/api/admin/bylines/[id]",
357
+ entrypoint: resolveRoute("api/admin/bylines/[id]/index.ts")
358
+ });
359
+ injectRoute({
360
+ pattern: "/_emdash/api/admin/users/[id]",
361
+ entrypoint: resolveRoute("api/admin/users/[id]/index.ts")
362
+ });
363
+ injectRoute({
364
+ pattern: "/_emdash/api/admin/users/[id]/disable",
365
+ entrypoint: resolveRoute("api/admin/users/[id]/disable.ts")
366
+ });
367
+ injectRoute({
368
+ pattern: "/_emdash/api/admin/users/[id]/enable",
369
+ entrypoint: resolveRoute("api/admin/users/[id]/enable.ts")
370
+ });
371
+ injectRoute({
372
+ pattern: "/_emdash/api/admin/users/[id]/send-recovery",
373
+ entrypoint: resolveRoute("api/admin/users/[id]/send-recovery.ts")
374
+ });
375
+ injectRoute({
376
+ pattern: "/_emdash/api/admin/api-tokens",
377
+ entrypoint: resolveRoute("api/admin/api-tokens/index.ts")
378
+ });
379
+ injectRoute({
380
+ pattern: "/_emdash/api/admin/api-tokens/[id]",
381
+ entrypoint: resolveRoute("api/admin/api-tokens/[id].ts")
382
+ });
383
+ injectRoute({
384
+ pattern: "/_emdash/api/admin/oauth-clients",
385
+ entrypoint: resolveRoute("api/admin/oauth-clients/index.ts")
386
+ });
387
+ injectRoute({
388
+ pattern: "/_emdash/api/admin/oauth-clients/[id]",
389
+ entrypoint: resolveRoute("api/admin/oauth-clients/[id].ts")
390
+ });
391
+ injectRoute({
392
+ pattern: "/_emdash/api/oauth/device/code",
393
+ entrypoint: resolveRoute("api/oauth/device/code.ts")
394
+ });
395
+ injectRoute({
396
+ pattern: "/_emdash/api/oauth/device/token",
397
+ entrypoint: resolveRoute("api/oauth/device/token.ts")
398
+ });
399
+ injectRoute({
400
+ pattern: "/_emdash/api/oauth/device/authorize",
401
+ entrypoint: resolveRoute("api/oauth/device/authorize.ts")
402
+ });
403
+ injectRoute({
404
+ pattern: "/_emdash/api/oauth/token/refresh",
405
+ entrypoint: resolveRoute("api/oauth/token/refresh.ts")
406
+ });
407
+ injectRoute({
408
+ pattern: "/_emdash/api/oauth/token/revoke",
409
+ entrypoint: resolveRoute("api/oauth/token/revoke.ts")
410
+ });
411
+ injectRoute({
412
+ pattern: "/_emdash/.well-known/auth",
413
+ entrypoint: resolveRoute("api/well-known/auth.ts")
414
+ });
415
+ injectRoute({
416
+ pattern: "/_emdash/api/oauth/token",
417
+ entrypoint: resolveRoute("api/oauth/token.ts")
418
+ });
419
+ injectRoute({
420
+ pattern: "/_emdash/oauth/authorize",
421
+ entrypoint: resolveRoute("api/oauth/authorize.ts")
422
+ });
423
+ injectRoute({
424
+ pattern: "/.well-known/oauth-protected-resource",
425
+ entrypoint: resolveRoute("api/well-known/oauth-protected-resource.ts")
426
+ });
427
+ injectRoute({
428
+ pattern: "/_emdash/.well-known/oauth-authorization-server",
429
+ entrypoint: resolveRoute("api/well-known/oauth-authorization-server.ts")
430
+ });
431
+ injectRoute({
432
+ pattern: "/_emdash/api/plugins/[pluginId]/[...path]",
433
+ entrypoint: resolveRoute("api/plugins/[pluginId]/[...path].ts")
434
+ });
435
+ injectRoute({
436
+ pattern: "/_emdash/api/menus",
437
+ entrypoint: resolveRoute("api/menus/index.ts")
438
+ });
439
+ injectRoute({
440
+ pattern: "/_emdash/api/menus/[name]",
441
+ entrypoint: resolveRoute("api/menus/[name].ts")
442
+ });
443
+ injectRoute({
444
+ pattern: "/_emdash/api/menus/[name]/items",
445
+ entrypoint: resolveRoute("api/menus/[name]/items.ts")
446
+ });
447
+ injectRoute({
448
+ pattern: "/_emdash/api/menus/[name]/reorder",
449
+ entrypoint: resolveRoute("api/menus/[name]/reorder.ts")
450
+ });
451
+ injectRoute({
452
+ pattern: "/_emdash/api/widget-areas",
453
+ entrypoint: resolveRoute("api/widget-areas/index.ts")
454
+ });
455
+ injectRoute({
456
+ pattern: "/_emdash/api/widget-components",
457
+ entrypoint: resolveRoute("api/widget-components.ts")
458
+ });
459
+ injectRoute({
460
+ pattern: "/_emdash/api/widget-areas/[name]",
461
+ entrypoint: resolveRoute("api/widget-areas/[name].ts")
462
+ });
463
+ injectRoute({
464
+ pattern: "/_emdash/api/widget-areas/[name]/widgets",
465
+ entrypoint: resolveRoute("api/widget-areas/[name]/widgets.ts")
466
+ });
467
+ injectRoute({
468
+ pattern: "/_emdash/api/widget-areas/[name]/widgets/[id]",
469
+ entrypoint: resolveRoute("api/widget-areas/[name]/widgets/[id].ts")
470
+ });
471
+ injectRoute({
472
+ pattern: "/_emdash/api/widget-areas/[name]/reorder",
473
+ entrypoint: resolveRoute("api/widget-areas/[name]/reorder.ts")
474
+ });
475
+ injectRoute({
476
+ pattern: "/_emdash/api/sections",
477
+ entrypoint: resolveRoute("api/sections/index.ts")
478
+ });
479
+ injectRoute({
480
+ pattern: "/_emdash/api/sections/[slug]",
481
+ entrypoint: resolveRoute("api/sections/[slug].ts")
482
+ });
483
+ injectRoute({
484
+ pattern: "/_emdash/api/redirects",
485
+ entrypoint: resolveRoute("api/redirects/index.ts")
486
+ });
487
+ injectRoute({
488
+ pattern: "/_emdash/api/redirects/404s/summary",
489
+ entrypoint: resolveRoute("api/redirects/404s/summary.ts")
490
+ });
491
+ injectRoute({
492
+ pattern: "/_emdash/api/redirects/404s",
493
+ entrypoint: resolveRoute("api/redirects/404s/index.ts")
494
+ });
495
+ injectRoute({
496
+ pattern: "/_emdash/api/redirects/[id]",
497
+ entrypoint: resolveRoute("api/redirects/[id].ts")
498
+ });
499
+ injectRoute({
500
+ pattern: "/_emdash/api/search",
501
+ entrypoint: resolveRoute("api/search/index.ts")
502
+ });
503
+ injectRoute({
504
+ pattern: "/_emdash/api/search/suggest",
505
+ entrypoint: resolveRoute("api/search/suggest.ts")
506
+ });
507
+ injectRoute({
508
+ pattern: "/_emdash/api/search/stats",
509
+ entrypoint: resolveRoute("api/search/stats.ts")
510
+ });
511
+ injectRoute({
512
+ pattern: "/_emdash/api/search/rebuild",
513
+ entrypoint: resolveRoute("api/search/rebuild.ts")
514
+ });
515
+ injectRoute({
516
+ pattern: "/_emdash/api/search/enable",
517
+ entrypoint: resolveRoute("api/search/enable.ts")
518
+ });
519
+ injectRoute({
520
+ pattern: "/_emdash/api/comments/[collection]/[contentId]",
521
+ entrypoint: resolveRoute("api/comments/[collection]/[contentId]/index.ts")
522
+ });
523
+ injectRoute({
524
+ pattern: "/_emdash/api/admin/comments",
525
+ entrypoint: resolveRoute("api/admin/comments/index.ts")
526
+ });
527
+ injectRoute({
528
+ pattern: "/_emdash/api/admin/comments/counts",
529
+ entrypoint: resolveRoute("api/admin/comments/counts.ts")
530
+ });
531
+ injectRoute({
532
+ pattern: "/_emdash/api/admin/comments/bulk",
533
+ entrypoint: resolveRoute("api/admin/comments/bulk.ts")
534
+ });
535
+ injectRoute({
536
+ pattern: "/_emdash/api/admin/comments/[id]/status",
537
+ entrypoint: resolveRoute("api/admin/comments/[id]/status.ts")
538
+ });
539
+ injectRoute({
540
+ pattern: "/_emdash/api/admin/comments/[id]",
541
+ entrypoint: resolveRoute("api/admin/comments/[id].ts")
542
+ });
543
+ injectRoute({
544
+ pattern: "/sitemap.xml",
545
+ entrypoint: resolveRoute("sitemap.xml.ts")
546
+ });
547
+ injectRoute({
548
+ pattern: "/robots.txt",
549
+ entrypoint: resolveRoute("robots.txt.ts")
550
+ });
551
+ injectRoute({
552
+ pattern: "/_emdash/api/setup/status",
553
+ entrypoint: resolveRoute("api/setup/status.ts")
554
+ });
555
+ injectRoute({
556
+ pattern: "/_emdash/api/setup",
557
+ entrypoint: resolveRoute("api/setup/index.ts")
558
+ });
559
+ injectRoute({
560
+ pattern: "/_emdash/api/setup/admin",
561
+ entrypoint: resolveRoute("api/setup/admin.ts")
562
+ });
563
+ injectRoute({
564
+ pattern: "/_emdash/api/setup/admin/verify",
565
+ entrypoint: resolveRoute("api/setup/admin-verify.ts")
566
+ });
567
+ injectRoute({
568
+ pattern: "/_emdash/api/setup/dev-bypass",
569
+ entrypoint: resolveRoute("api/setup/dev-bypass.ts")
570
+ });
571
+ injectRoute({
572
+ pattern: "/_emdash/api/setup/dev-reset",
573
+ entrypoint: resolveRoute("api/setup/dev-reset.ts")
574
+ });
575
+ injectRoute({
576
+ pattern: "/_emdash/api/auth/me",
577
+ entrypoint: resolveRoute("api/auth/me.ts")
578
+ });
579
+ injectRoute({
580
+ pattern: "/_emdash/api/auth/logout",
581
+ entrypoint: resolveRoute("api/auth/logout.ts")
582
+ });
583
+ }
584
+ /**
585
+ * Injects the MCP (Model Context Protocol) server route.
586
+ * Only injected when `mcp: true` is set in the EmDash config.
587
+ */
588
+ function injectMcpRoute(injectRoute) {
589
+ injectRoute({
590
+ pattern: "/_emdash/api/mcp",
591
+ entrypoint: resolveRoute("api/mcp.ts")
592
+ });
593
+ }
594
+ /**
595
+ * Injects passkey/oauth/magic-link auth routes.
596
+ * Only used when NOT using external auth.
597
+ */
598
+ function injectBuiltinAuthRoutes(injectRoute) {
599
+ injectRoute({
600
+ pattern: "/_emdash/api/auth/passkey/options",
601
+ entrypoint: resolveRoute("api/auth/passkey/options.ts")
602
+ });
603
+ injectRoute({
604
+ pattern: "/_emdash/api/auth/passkey/verify",
605
+ entrypoint: resolveRoute("api/auth/passkey/verify.ts")
606
+ });
607
+ injectRoute({
608
+ pattern: "/_emdash/api/auth/passkey",
609
+ entrypoint: resolveRoute("api/auth/passkey/index.ts")
610
+ });
611
+ injectRoute({
612
+ pattern: "/_emdash/api/auth/passkey/register/options",
613
+ entrypoint: resolveRoute("api/auth/passkey/register/options.ts")
614
+ });
615
+ injectRoute({
616
+ pattern: "/_emdash/api/auth/passkey/register/verify",
617
+ entrypoint: resolveRoute("api/auth/passkey/register/verify.ts")
618
+ });
619
+ injectRoute({
620
+ pattern: "/_emdash/api/auth/passkey/[id]",
621
+ entrypoint: resolveRoute("api/auth/passkey/[id].ts")
622
+ });
623
+ injectRoute({
624
+ pattern: "/_emdash/api/auth/dev-bypass",
625
+ entrypoint: resolveRoute("api/auth/dev-bypass.ts")
626
+ });
627
+ injectRoute({
628
+ pattern: "/_emdash/api/auth/invite",
629
+ entrypoint: resolveRoute("api/auth/invite/index.ts")
630
+ });
631
+ injectRoute({
632
+ pattern: "/_emdash/api/auth/invite/accept",
633
+ entrypoint: resolveRoute("api/auth/invite/accept.ts")
634
+ });
635
+ injectRoute({
636
+ pattern: "/_emdash/api/auth/invite/complete",
637
+ entrypoint: resolveRoute("api/auth/invite/complete.ts")
638
+ });
639
+ injectRoute({
640
+ pattern: "/_emdash/api/auth/magic-link/send",
641
+ entrypoint: resolveRoute("api/auth/magic-link/send.ts")
642
+ });
643
+ injectRoute({
644
+ pattern: "/_emdash/api/auth/magic-link/verify",
645
+ entrypoint: resolveRoute("api/auth/magic-link/verify.ts")
646
+ });
647
+ injectRoute({
648
+ pattern: "/_emdash/api/auth/oauth/[provider]",
649
+ entrypoint: resolveRoute("api/auth/oauth/[provider].ts")
650
+ });
651
+ injectRoute({
652
+ pattern: "/_emdash/api/auth/oauth/[provider]/callback",
653
+ entrypoint: resolveRoute("api/auth/oauth/[provider]/callback.ts")
654
+ });
655
+ injectRoute({
656
+ pattern: "/_emdash/api/auth/signup/request",
657
+ entrypoint: resolveRoute("api/auth/signup/request.ts")
658
+ });
659
+ injectRoute({
660
+ pattern: "/_emdash/api/auth/signup/verify",
661
+ entrypoint: resolveRoute("api/auth/signup/verify.ts")
662
+ });
663
+ injectRoute({
664
+ pattern: "/_emdash/api/auth/signup/complete",
665
+ entrypoint: resolveRoute("api/auth/signup/complete.ts")
666
+ });
667
+ injectRoute({
668
+ pattern: "/_emdash/api/admin/allowed-domains",
669
+ entrypoint: resolveRoute("api/admin/allowed-domains/index.ts")
670
+ });
671
+ injectRoute({
672
+ pattern: "/_emdash/api/admin/allowed-domains/[domain]",
673
+ entrypoint: resolveRoute("api/admin/allowed-domains/[domain].ts")
674
+ });
675
+ }
676
+
677
+ //#endregion
678
+ //#region src/astro/integration/virtual-modules.ts
679
+ /**
680
+ * Virtual Module Generators
681
+ *
682
+ * Functions that generate virtual module content for Vite.
683
+ * These modules statically import configured dependencies
684
+ * so Vite can properly resolve and bundle them.
685
+ */
686
+ /** Pattern to remove scoped package prefix from plugin ID */
687
+ const SCOPED_PREFIX_PATTERN = /^@[^/]+\/plugin-/;
688
+ /** Pattern to remove emdash-plugin- prefix from plugin ID */
689
+ const EMDASH_PREFIX_PATTERN = /^emdash-plugin-/;
690
+ const VIRTUAL_CONFIG_ID = "virtual:emdash/config";
691
+ const RESOLVED_VIRTUAL_CONFIG_ID = "\0" + VIRTUAL_CONFIG_ID;
692
+ const VIRTUAL_DIALECT_ID = "virtual:emdash/dialect";
693
+ const RESOLVED_VIRTUAL_DIALECT_ID = "\0" + VIRTUAL_DIALECT_ID;
694
+ const VIRTUAL_STORAGE_ID = "virtual:emdash/storage";
695
+ const RESOLVED_VIRTUAL_STORAGE_ID = "\0" + VIRTUAL_STORAGE_ID;
696
+ const VIRTUAL_ADMIN_REGISTRY_ID = "virtual:emdash/admin-registry";
697
+ const RESOLVED_VIRTUAL_ADMIN_REGISTRY_ID = "\0" + VIRTUAL_ADMIN_REGISTRY_ID;
698
+ const VIRTUAL_PLUGINS_ID = "virtual:emdash/plugins";
699
+ const RESOLVED_VIRTUAL_PLUGINS_ID = "\0" + VIRTUAL_PLUGINS_ID;
700
+ const VIRTUAL_SANDBOX_RUNNER_ID = "virtual:emdash/sandbox-runner";
701
+ const RESOLVED_VIRTUAL_SANDBOX_RUNNER_ID = "\0" + VIRTUAL_SANDBOX_RUNNER_ID;
702
+ const VIRTUAL_SANDBOXED_PLUGINS_ID = "virtual:emdash/sandboxed-plugins";
703
+ const RESOLVED_VIRTUAL_SANDBOXED_PLUGINS_ID = "\0" + VIRTUAL_SANDBOXED_PLUGINS_ID;
704
+ const VIRTUAL_AUTH_ID = "virtual:emdash/auth";
705
+ const RESOLVED_VIRTUAL_AUTH_ID = "\0" + VIRTUAL_AUTH_ID;
706
+ const VIRTUAL_MEDIA_PROVIDERS_ID = "virtual:emdash/media-providers";
707
+ const RESOLVED_VIRTUAL_MEDIA_PROVIDERS_ID = "\0" + VIRTUAL_MEDIA_PROVIDERS_ID;
708
+ const VIRTUAL_BLOCK_COMPONENTS_ID = "virtual:emdash/block-components";
709
+ const RESOLVED_VIRTUAL_BLOCK_COMPONENTS_ID = "\0" + VIRTUAL_BLOCK_COMPONENTS_ID;
710
+ const VIRTUAL_SEED_ID = "virtual:emdash/seed";
711
+ const RESOLVED_VIRTUAL_SEED_ID = "\0" + VIRTUAL_SEED_ID;
712
+ /**
713
+ * Generates the config virtual module.
714
+ */
715
+ function generateConfigModule(serializableConfig) {
716
+ return `export default ${JSON.stringify(serializableConfig)};`;
717
+ }
718
+ /**
719
+ * Generates the dialect virtual module.
720
+ * Statically imports the configured database dialect and exports the dialect type.
721
+ *
722
+ * For D1 adapters, also re-exports session helpers (isSessionEnabled, getD1Binding,
723
+ * getDefaultConstraint, getBookmarkCookieName, createSessionDialect) used by
724
+ * middleware for per-request read replica sessions.
725
+ *
726
+ * For non-D1 adapters, session exports are no-ops.
727
+ */
728
+ function generateDialectModule(dbEntrypoint, dbType, dbConfig) {
729
+ if (!dbEntrypoint) return [
730
+ `export const createDialect = undefined;`,
731
+ `export const dialectType = "sqlite";`,
732
+ `export const isSessionEnabled = () => false;`,
733
+ `export const getD1Binding = () => null;`,
734
+ `export const getDefaultConstraint = () => "first-unconstrained";`,
735
+ `export const getBookmarkCookieName = () => "";`,
736
+ `export const createSessionDialect = undefined;`
737
+ ].join("\n");
738
+ const type = dbType ?? "sqlite";
739
+ const isD1 = dbEntrypoint.includes("cloudflare") && dbEntrypoint.includes("d1");
740
+ const sessionMode = isD1 && dbConfig && typeof dbConfig === "object" && "session" in dbConfig ? dbConfig.session : void 0;
741
+ if (isD1 && !!sessionMode && sessionMode !== "disabled") return `
742
+ import { createDialect as _createDialect } from "${dbEntrypoint}";
743
+ export { isSessionEnabled, getD1Binding, getDefaultConstraint, getBookmarkCookieName, createSessionDialect } from "${dbEntrypoint}";
744
+ export const createDialect = _createDialect;
745
+ export const dialectType = ${JSON.stringify(type)};
746
+ `;
747
+ return `
748
+ import { createDialect as _createDialect } from "${dbEntrypoint}";
749
+ export const createDialect = _createDialect;
750
+ export const dialectType = ${JSON.stringify(type)};
751
+ export const isSessionEnabled = () => false;
752
+ export const getD1Binding = () => null;
753
+ export const getDefaultConstraint = () => "first-unconstrained";
754
+ export const getBookmarkCookieName = () => "";
755
+ export const createSessionDialect = undefined;
756
+ `;
757
+ }
758
+ /**
759
+ * Generates the storage virtual module.
760
+ * Statically imports the configured storage adapter.
761
+ */
762
+ function generateStorageModule(storageEntrypoint) {
763
+ if (!storageEntrypoint) return `export const createStorage = undefined;`;
764
+ return `
765
+ import { createStorage as _createStorage } from "${storageEntrypoint}";
766
+ export const createStorage = _createStorage;
767
+ `;
768
+ }
769
+ /**
770
+ * Generates the auth virtual module.
771
+ * Statically imports the configured auth provider.
772
+ */
773
+ function generateAuthModule(authEntrypoint) {
774
+ if (!authEntrypoint) return `export const authenticate = undefined;`;
775
+ return `
776
+ import { authenticate as _authenticate } from "${authEntrypoint}";
777
+ export const authenticate = _authenticate;
778
+ `;
779
+ }
780
+ /**
781
+ * Generates the plugins module.
782
+ * Imports and instantiates all plugins at runtime.
783
+ *
784
+ * Handles two plugin formats:
785
+ * - **Native**: imports `createPlugin` and calls it with options
786
+ * - **Standard**: imports the default export and wraps it with `adaptSandboxEntry`
787
+ *
788
+ * The format is determined by `descriptor.format`:
789
+ * - `"standard"` -- uses adaptSandboxEntry
790
+ * - `"native"` or undefined -- uses createPlugin
791
+ *
792
+ * This is critical for Cloudflare Workers where globals don't persist
793
+ * between build time and runtime.
794
+ */
795
+ function generatePluginsModule(descriptors) {
796
+ if (descriptors.length === 0) return `export const plugins = [];`;
797
+ const imports = [];
798
+ const instantiations = [];
799
+ let needsAdapter = false;
800
+ descriptors.forEach((descriptor, index) => {
801
+ if (descriptor.format === "standard") {
802
+ needsAdapter = true;
803
+ const varName = `pluginDef${index}`;
804
+ imports.push(`import ${varName} from "${descriptor.entrypoint}";`);
805
+ instantiations.push(`adaptSandboxEntry(${varName}, ${JSON.stringify({
806
+ id: descriptor.id,
807
+ version: descriptor.version,
808
+ capabilities: descriptor.capabilities,
809
+ allowedHosts: descriptor.allowedHosts,
810
+ storage: descriptor.storage,
811
+ adminPages: descriptor.adminPages,
812
+ adminWidgets: descriptor.adminWidgets
813
+ })})`);
814
+ } else {
815
+ const varName = `createPlugin${index}`;
816
+ imports.push(`import { createPlugin as ${varName} } from "${descriptor.entrypoint}";`);
817
+ instantiations.push(`${varName}(${JSON.stringify(descriptor.options ?? {})})`);
818
+ }
819
+ });
820
+ return `
821
+ // Auto-generated plugins module
822
+ // Imports and instantiates all configured plugins at runtime
823
+
824
+ ${needsAdapter ? `import { adaptSandboxEntry } from "emdash/plugins/adapt-sandbox-entry";\n` : ""}${imports.join("\n")}
825
+
826
+ /** Resolved plugins array */
827
+ export const plugins = [
828
+ ${instantiations.join(",\n ")}
829
+ ];
830
+ `;
831
+ }
832
+ /**
833
+ * Generates the admin registry module.
834
+ * Uses adminEntry from plugin descriptors to statically import admin modules.
835
+ */
836
+ function generateAdminRegistryModule(descriptors) {
837
+ const adminDescriptors = descriptors.filter((d) => d.adminEntry);
838
+ if (adminDescriptors.length === 0) return `export const pluginAdmins = {};`;
839
+ const imports = [];
840
+ const entries = [];
841
+ adminDescriptors.forEach((descriptor, index) => {
842
+ const varName = `admin${index}`;
843
+ const pluginId = descriptor.id ?? descriptor.entrypoint.replace(SCOPED_PREFIX_PATTERN, "").replace(EMDASH_PREFIX_PATTERN, "");
844
+ imports.push(`import * as ${varName} from "${descriptor.adminEntry}";`);
845
+ entries.push(` "${pluginId}": ${varName},`);
846
+ });
847
+ return `
848
+ // Auto-generated plugin admin registry
849
+ ${imports.join("\n")}
850
+
851
+ export const pluginAdmins = {
852
+ ${entries.join("\n")}
853
+ };
854
+ `;
855
+ }
856
+ /**
857
+ * Generates the sandbox runner module.
858
+ * Imports the configured sandbox runner factory or provides a noop default.
859
+ */
860
+ function generateSandboxRunnerModule(sandboxRunner) {
861
+ if (!sandboxRunner) return `
862
+ // No sandbox runner configured - sandboxed plugins disabled
863
+ import { createNoopSandboxRunner } from "emdash";
864
+
865
+ export const createSandboxRunner = createNoopSandboxRunner;
866
+ export const sandboxEnabled = false;
867
+ `;
868
+ return `
869
+ // Auto-generated sandbox runner module
870
+ import { createSandboxRunner as _createSandboxRunner } from "${sandboxRunner}";
871
+
872
+ export const createSandboxRunner = _createSandboxRunner;
873
+ export const sandboxEnabled = true;
874
+ `;
875
+ }
876
+ /**
877
+ * Generates the media providers module.
878
+ * Imports and instantiates configured media providers at runtime.
879
+ */
880
+ function generateMediaProvidersModule(descriptors) {
881
+ const localDisabled = descriptors.some((d) => d.id === "local" && d.config.enabled === false);
882
+ const imports = [];
883
+ const entries = [];
884
+ if (!localDisabled) {
885
+ imports.push(`import { createMediaProvider as createLocalProvider } from "emdash/media/local-runtime";`);
886
+ entries.push(`{
887
+ id: "local",
888
+ name: "Library",
889
+ icon: "folder",
890
+ capabilities: { browse: true, search: false, upload: true, delete: true },
891
+ createProvider: (ctx) => createLocalProvider({ ...ctx, enabled: true }),
892
+ }`);
893
+ }
894
+ descriptors.filter((d) => d.id !== "local" || d.config.enabled !== false).filter((d) => d.id !== "local").forEach((descriptor, index) => {
895
+ const varName = `createProvider${index}`;
896
+ imports.push(`import { createMediaProvider as ${varName} } from "${descriptor.entrypoint}";`);
897
+ entries.push(`{
898
+ id: ${JSON.stringify(descriptor.id)},
899
+ name: ${JSON.stringify(descriptor.name)},
900
+ icon: ${JSON.stringify(descriptor.icon)},
901
+ capabilities: ${JSON.stringify(descriptor.capabilities)},
902
+ createProvider: (ctx) => ${varName}({ ...${JSON.stringify(descriptor.config)}, ...ctx }),
903
+ }`);
904
+ });
905
+ return `
906
+ // Auto-generated media providers module
907
+ ${imports.join("\n")}
908
+
909
+ /** Media provider descriptors with factory functions */
910
+ export const mediaProviders = [
911
+ ${entries.join(",\n ")}
912
+ ];
913
+ `;
914
+ }
915
+ /**
916
+ * Generates the block components module.
917
+ * Collects and merges `blockComponents` exports from plugin component entries.
918
+ */
919
+ function generateBlockComponentsModule(descriptors) {
920
+ const withComponents = descriptors.filter((d) => d.componentsEntry);
921
+ if (withComponents.length === 0) return `export const pluginBlockComponents = {};`;
922
+ const imports = [];
923
+ const spreads = [];
924
+ withComponents.forEach((d, i) => {
925
+ imports.push(`import { blockComponents as bc${i} } from "${d.componentsEntry}";`);
926
+ spreads.push(`...bc${i}`);
927
+ });
928
+ return `${imports.join("\n")}\nexport const pluginBlockComponents = { ${spreads.join(", ")} };`;
929
+ }
930
+ /**
931
+ * Generates the seed virtual module.
932
+ * Reads the user's seed file at build time (in Node context) and embeds it,
933
+ * so the runtime doesn't need filesystem access (required for workerd).
934
+ *
935
+ * Exports `userSeed` (user's seed or null) and `seed` (user's seed or default).
936
+ */
937
+ function generateSeedModule(projectRoot) {
938
+ let userSeedJson = null;
939
+ try {
940
+ const content = readFileSync(resolve(projectRoot, ".emdash", "seed.json"), "utf-8");
941
+ JSON.parse(content);
942
+ userSeedJson = content;
943
+ } catch {}
944
+ if (!userSeedJson) try {
945
+ const pkgContent = readFileSync(resolve(projectRoot, "package.json"), "utf-8");
946
+ const pkg = JSON.parse(pkgContent);
947
+ if (pkg.emdash?.seed) {
948
+ const content = readFileSync(resolve(projectRoot, pkg.emdash.seed), "utf-8");
949
+ JSON.parse(content);
950
+ userSeedJson = content;
951
+ }
952
+ } catch {}
953
+ if (userSeedJson) return [`export const userSeed = ${userSeedJson};`, `export const seed = userSeed;`].join("\n");
954
+ return [`export const userSeed = null;`, `export const seed = ${JSON.stringify(defaultSeed)};`].join("\n");
955
+ }
956
+ /**
957
+ * Resolve a module specifier from the project's context.
958
+ * Uses Node.js require.resolve with the project root as base.
959
+ */
960
+ function resolveModulePathFromProject(specifier, projectRoot) {
961
+ return createRequire(resolve(projectRoot, "package.json")).resolve(specifier);
962
+ }
963
+ /**
964
+ * Generates the sandboxed plugins module.
965
+ * Resolves plugin entrypoints to files, reads them, and embeds the code.
966
+ *
967
+ * At runtime, middleware uses SandboxRunner to load these into isolates.
968
+ */
969
+ function generateSandboxedPluginsModule(sandboxed, projectRoot) {
970
+ if (sandboxed.length === 0) return `
971
+ // No sandboxed plugins configured
972
+ export const sandboxedPlugins = [];
973
+ `;
974
+ const pluginEntries = [];
975
+ for (const descriptor of sandboxed) {
976
+ const bundleSpecifier = descriptor.entrypoint;
977
+ const filePath = resolveModulePathFromProject(bundleSpecifier, projectRoot);
978
+ const code = readFileSync(filePath, "utf-8");
979
+ pluginEntries.push(`{
980
+ id: ${JSON.stringify(descriptor.id)},
981
+ version: ${JSON.stringify(descriptor.version)},
982
+ options: ${JSON.stringify(descriptor.options ?? {})},
983
+ capabilities: ${JSON.stringify(descriptor.capabilities ?? [])},
984
+ allowedHosts: ${JSON.stringify(descriptor.allowedHosts ?? [])},
985
+ storage: ${JSON.stringify(descriptor.storage ?? {})},
986
+ adminPages: ${JSON.stringify(descriptor.adminPages ?? [])},
987
+ adminWidgets: ${JSON.stringify(descriptor.adminWidgets ?? [])},
988
+ adminEntry: ${JSON.stringify(descriptor.adminEntry)},
989
+ // Code read from: ${filePath}
990
+ code: ${JSON.stringify(code)},
991
+ }`);
992
+ }
993
+ return `
994
+ // Auto-generated sandboxed plugins module
995
+ // Plugin code is embedded at build time
996
+
997
+ /**
998
+ * Sandboxed plugin entries with embedded code.
999
+ * Loaded at runtime via SandboxRunner.
1000
+ */
1001
+ export const sandboxedPlugins = [
1002
+ ${pluginEntries.join(",\n ")}
1003
+ ];
1004
+ `;
1005
+ }
1006
+
1007
+ //#endregion
1008
+ //#region src/astro/integration/vite-config.ts
1009
+ /**
1010
+ * Vite Plugin Configuration
1011
+ *
1012
+ * Defines the Vite plugin that handles virtual modules and other
1013
+ * Vite-specific configuration for EmDash.
1014
+ */
1015
+ /**
1016
+ * Resolve path to the admin package dist directory.
1017
+ * Used for Vite alias to ensure the package is found in pnpm's isolated node_modules.
1018
+ */
1019
+ function resolveAdminDist() {
1020
+ return dirname(createRequire(import.meta.url).resolve("@emdash-cms/admin"));
1021
+ }
1022
+ /**
1023
+ * Resolve path to the admin package source directory.
1024
+ * In dev mode, we alias @emdash-cms/admin to the source so Vite processes it
1025
+ * directly — giving instant HMR instead of requiring a rebuild + restart.
1026
+ */
1027
+ function resolveAdminSource() {
1028
+ const require = createRequire(import.meta.url);
1029
+ const packageRoot = resolve(dirname(require.resolve("@emdash-cms/admin")), "..");
1030
+ const srcEntry = resolve(packageRoot, "src", "index.ts");
1031
+ try {
1032
+ if (require("node:fs").existsSync(srcEntry)) return resolve(packageRoot, "src");
1033
+ } catch {}
1034
+ }
1035
+ /**
1036
+ * Creates the EmDash virtual modules Vite plugin.
1037
+ */
1038
+ function createVirtualModulesPlugin(options) {
1039
+ const { serializableConfig, resolvedConfig, pluginDescriptors, astroConfig } = options;
1040
+ return {
1041
+ name: "emdash-virtual-modules",
1042
+ resolveId(id) {
1043
+ if (id === VIRTUAL_CONFIG_ID) return RESOLVED_VIRTUAL_CONFIG_ID;
1044
+ if (id === VIRTUAL_DIALECT_ID) return RESOLVED_VIRTUAL_DIALECT_ID;
1045
+ if (id === VIRTUAL_STORAGE_ID) return RESOLVED_VIRTUAL_STORAGE_ID;
1046
+ if (id === VIRTUAL_ADMIN_REGISTRY_ID) return RESOLVED_VIRTUAL_ADMIN_REGISTRY_ID;
1047
+ if (id === VIRTUAL_PLUGINS_ID) return RESOLVED_VIRTUAL_PLUGINS_ID;
1048
+ if (id === VIRTUAL_SANDBOX_RUNNER_ID) return RESOLVED_VIRTUAL_SANDBOX_RUNNER_ID;
1049
+ if (id === VIRTUAL_SANDBOXED_PLUGINS_ID) return RESOLVED_VIRTUAL_SANDBOXED_PLUGINS_ID;
1050
+ if (id === VIRTUAL_AUTH_ID) return RESOLVED_VIRTUAL_AUTH_ID;
1051
+ if (id === VIRTUAL_MEDIA_PROVIDERS_ID) return RESOLVED_VIRTUAL_MEDIA_PROVIDERS_ID;
1052
+ if (id === VIRTUAL_BLOCK_COMPONENTS_ID) return RESOLVED_VIRTUAL_BLOCK_COMPONENTS_ID;
1053
+ if (id === VIRTUAL_SEED_ID) return RESOLVED_VIRTUAL_SEED_ID;
1054
+ },
1055
+ load(id) {
1056
+ if (id === RESOLVED_VIRTUAL_CONFIG_ID) return generateConfigModule(serializableConfig);
1057
+ if (id === RESOLVED_VIRTUAL_DIALECT_ID) return generateDialectModule(resolvedConfig.database?.entrypoint, resolvedConfig.database?.type, resolvedConfig.database?.config);
1058
+ if (id === RESOLVED_VIRTUAL_STORAGE_ID) return generateStorageModule(resolvedConfig.storage?.entrypoint);
1059
+ if (id === RESOLVED_VIRTUAL_PLUGINS_ID) return generatePluginsModule(pluginDescriptors);
1060
+ if (id === RESOLVED_VIRTUAL_ADMIN_REGISTRY_ID) return generateAdminRegistryModule([...pluginDescriptors, ...resolvedConfig.sandboxed ?? []]);
1061
+ if (id === RESOLVED_VIRTUAL_SANDBOX_RUNNER_ID) return generateSandboxRunnerModule(resolvedConfig.sandboxRunner);
1062
+ if (id === RESOLVED_VIRTUAL_SANDBOXED_PLUGINS_ID) {
1063
+ const projectRoot = fileURLToPath(astroConfig.root);
1064
+ return generateSandboxedPluginsModule(resolvedConfig.sandboxed ?? [], projectRoot);
1065
+ }
1066
+ if (id === RESOLVED_VIRTUAL_AUTH_ID) {
1067
+ const authDescriptor = resolvedConfig.auth;
1068
+ if (!authDescriptor || !("entrypoint" in authDescriptor)) return generateAuthModule(void 0);
1069
+ return generateAuthModule(authDescriptor.entrypoint);
1070
+ }
1071
+ if (id === RESOLVED_VIRTUAL_MEDIA_PROVIDERS_ID) return generateMediaProvidersModule(resolvedConfig.mediaProviders ?? []);
1072
+ if (id === RESOLVED_VIRTUAL_BLOCK_COMPONENTS_ID) return generateBlockComponentsModule(pluginDescriptors);
1073
+ if (id === RESOLVED_VIRTUAL_SEED_ID) return generateSeedModule(fileURLToPath(astroConfig.root));
1074
+ }
1075
+ };
1076
+ }
1077
+ /**
1078
+ * Modules that contain native Node.js addons or Node-only code.
1079
+ * These must be external in SSR to avoid bundling failures on Node.
1080
+ * On Cloudflare, the adapter handles its own externalization — setting
1081
+ * ssr.external there conflicts with @cloudflare/vite-plugin's validation.
1082
+ */
1083
+ const NODE_NATIVE_EXTERNALS = [
1084
+ "better-sqlite3",
1085
+ "bindings",
1086
+ "file-uri-to-path",
1087
+ "@libsql/kysely-libsql",
1088
+ "pg"
1089
+ ];
1090
+ /**
1091
+ * Detect whether the Cloudflare adapter is being used.
1092
+ */
1093
+ function isCloudflareAdapter(astroConfig) {
1094
+ return astroConfig.adapter?.name === "@astrojs/cloudflare";
1095
+ }
1096
+ /**
1097
+ * Creates the Vite config update for EmDash.
1098
+ */
1099
+ function createViteConfig(options, command) {
1100
+ const adminDistPath = resolveAdminDist();
1101
+ const cloudflare = isCloudflareAdapter(options.astroConfig);
1102
+ const adminSourcePath = command === "dev" ? resolveAdminSource() : void 0;
1103
+ const useSource = adminSourcePath !== void 0;
1104
+ return {
1105
+ resolve: {
1106
+ dedupe: [
1107
+ "@emdash-cms/admin",
1108
+ "react",
1109
+ "react-dom"
1110
+ ],
1111
+ alias: [{
1112
+ find: "@emdash-cms/admin/styles.css",
1113
+ replacement: resolve(adminDistPath, "styles.css")
1114
+ }, {
1115
+ find: "@emdash-cms/admin",
1116
+ replacement: useSource ? adminSourcePath : adminDistPath
1117
+ }]
1118
+ },
1119
+ plugins: [createVirtualModulesPlugin(options)],
1120
+ ssr: cloudflare ? {
1121
+ noExternal: ["emdash", "@emdash-cms/admin"],
1122
+ optimizeDeps: { include: [
1123
+ "emdash > @portabletext/toolkit",
1124
+ "emdash > @unpic/placeholder",
1125
+ "emdash > blurhash",
1126
+ "emdash > croner",
1127
+ "emdash > image-size",
1128
+ "emdash > jose",
1129
+ "emdash > jpeg-js",
1130
+ "emdash > kysely",
1131
+ "emdash > mime/lite",
1132
+ "emdash > modern-tar",
1133
+ "emdash > sanitize-html",
1134
+ "emdash > ulidx",
1135
+ "emdash > upng-js",
1136
+ "emdash > astro-portabletext",
1137
+ "emdash > sax",
1138
+ "emdash > sanitize-html > parse5",
1139
+ "emdash > @emdash-cms/gutenberg-to-portable-text > @wordpress/block-serialization-default-parser",
1140
+ "emdash > @emdash-cms/auth > @oslojs/crypto/ecdsa",
1141
+ "emdash > @emdash-cms/auth > @oslojs/crypto/sha2",
1142
+ "emdash > @emdash-cms/auth > @oslojs/webauthn",
1143
+ "react",
1144
+ "react/jsx-dev-runtime",
1145
+ "react/jsx-runtime",
1146
+ "react-dom",
1147
+ "react-dom/server",
1148
+ "astro > zod/v4",
1149
+ "astro > zod/v4/core",
1150
+ "@emdash-cms/cloudflare > kysely-d1",
1151
+ "astro/virtual-modules/middleware.js",
1152
+ "astro/virtual-modules/live-config",
1153
+ "astro/content/runtime",
1154
+ "astro/assets/utils/inferRemoteSize.js",
1155
+ "astro/assets/fonts/runtime.js",
1156
+ "@astrojs/cloudflare/image-service"
1157
+ ] }
1158
+ } : {
1159
+ external: NODE_NATIVE_EXTERNALS,
1160
+ noExternal: ["emdash", "@emdash-cms/admin"]
1161
+ },
1162
+ optimizeDeps: {
1163
+ include: useSource ? ["@astrojs/react/client.js"] : ["@emdash-cms/admin", "@astrojs/react/client.js"],
1164
+ exclude: cloudflare ? [] : NODE_NATIVE_EXTERNALS
1165
+ }
1166
+ };
1167
+ }
1168
+
1169
+ //#endregion
1170
+ //#region src/astro/integration/runtime.ts
1171
+ /**
1172
+ * Get stored config from global
1173
+ * This is set by the virtual module at build time
1174
+ */
1175
+ function getStoredConfig() {
1176
+ return globalThis.__emdashConfig || null;
1177
+ }
1178
+
1179
+ //#endregion
1180
+ //#region src/astro/integration/index.ts
1181
+ /** Default storage: Local filesystem in .emdash directory */
1182
+ const DEFAULT_STORAGE = local({
1183
+ directory: "./.emdash/uploads",
1184
+ baseUrl: "/_emdash/api/media/file"
1185
+ });
1186
+ const dim = (s) => `\x1b[2m${s}\x1b[22m`;
1187
+ const bold = (s) => `\x1b[1m${s}\x1b[22m`;
1188
+ const cyan = (s) => `\x1b[36m${s}\x1b[39m`;
1189
+ /** Print the EmDash startup banner */
1190
+ function printBanner(_logger) {
1191
+ const banner = `
1192
+
1193
+ ${bold(cyan("E C L I P T I C"))}
1194
+ `;
1195
+ console.log(banner);
1196
+ }
1197
+ /** Print route injection summary */
1198
+ function printRoutesSummary(_logger) {
1199
+ console.log(`\n ${dim("›")} Admin UI ${cyan("/_emdash/admin")}`);
1200
+ console.log(` ${dim("›")} API ${cyan("/_emdash/api/*")}`);
1201
+ console.log("");
1202
+ }
1203
+ /**
1204
+ * Create the EmDash Astro integration
1205
+ */
1206
+ function emdash(config = {}) {
1207
+ const resolvedConfig = {
1208
+ ...config,
1209
+ storage: config.storage ?? DEFAULT_STORAGE
1210
+ };
1211
+ if (resolvedConfig.marketplace) {
1212
+ const url = resolvedConfig.marketplace;
1213
+ try {
1214
+ const parsed = new URL(url);
1215
+ const isLocalhost = parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1";
1216
+ if (parsed.protocol !== "https:" && !isLocalhost) throw new Error(`Marketplace URL must use HTTPS (got ${parsed.protocol}). Only localhost URLs are allowed over HTTP.`);
1217
+ } catch (e) {
1218
+ if (e instanceof TypeError) throw new Error(`Invalid marketplace URL: "${url}"`, { cause: e });
1219
+ throw e;
1220
+ }
1221
+ if (!resolvedConfig.sandboxRunner) throw new Error("Marketplace requires `sandboxRunner` to be configured. Marketplace plugins run in sandboxed V8 isolates.");
1222
+ }
1223
+ const pluginDescriptors = resolvedConfig.plugins ?? [];
1224
+ const sandboxedDescriptors = resolvedConfig.sandboxed ?? [];
1225
+ for (const descriptor of [...pluginDescriptors, ...sandboxedDescriptors]) if (descriptor.format === "standard") {
1226
+ if (descriptor.adminEntry) throw new Error(`Plugin "${descriptor.id}" is standard format but declares adminEntry. Standard plugins use Block Kit for admin UI, not React components. Remove adminEntry or change format to "native".`);
1227
+ if (descriptor.componentsEntry) throw new Error(`Plugin "${descriptor.id}" is standard format but declares componentsEntry. Portable Text block components require native format. Remove componentsEntry or change format to "native".`);
1228
+ }
1229
+ for (const descriptor of sandboxedDescriptors) if (descriptor.format !== "standard") throw new Error(`Plugin "${descriptor.id}" uses the native format and cannot be placed in \`sandboxed: []\`. Native plugins can only run in \`plugins: []\`. To sandbox this plugin, convert it to the standard format.`);
1230
+ const serializableConfig = {
1231
+ database: resolvedConfig.database,
1232
+ storage: resolvedConfig.storage,
1233
+ auth: resolvedConfig.auth,
1234
+ marketplace: resolvedConfig.marketplace
1235
+ };
1236
+ const useExternalAuth = !!(resolvedConfig.auth && "entrypoint" in resolvedConfig.auth);
1237
+ return {
1238
+ name: "emdash",
1239
+ hooks: {
1240
+ "astro:config:setup": ({ injectRoute, addMiddleware, logger, updateConfig, config: astroConfig, command }) => {
1241
+ printBanner(logger);
1242
+ if (astroConfig.i18n) {
1243
+ const routing = astroConfig.i18n.routing;
1244
+ serializableConfig.i18n = {
1245
+ defaultLocale: astroConfig.i18n.defaultLocale,
1246
+ locales: astroConfig.i18n.locales.map((l) => typeof l === "string" ? l : l.path),
1247
+ fallback: astroConfig.i18n.fallback,
1248
+ prefixDefaultLocale: typeof routing === "object" ? routing.prefixDefaultLocale ?? false : false
1249
+ };
1250
+ }
1251
+ updateConfig({ vite: createViteConfig({
1252
+ serializableConfig,
1253
+ resolvedConfig,
1254
+ pluginDescriptors,
1255
+ astroConfig
1256
+ }, command) });
1257
+ injectCoreRoutes(injectRoute);
1258
+ if (!useExternalAuth) injectBuiltinAuthRoutes(injectRoute);
1259
+ if (resolvedConfig.mcp) {
1260
+ injectMcpRoute(injectRoute);
1261
+ logger.info("MCP server enabled at /_emdash/api/mcp");
1262
+ }
1263
+ if (resolvedConfig.playground) addMiddleware({
1264
+ entrypoint: resolvedConfig.playground.middlewareEntrypoint,
1265
+ order: "pre"
1266
+ });
1267
+ addMiddleware({
1268
+ entrypoint: "emdash/middleware",
1269
+ order: "pre"
1270
+ });
1271
+ addMiddleware({
1272
+ entrypoint: "emdash/middleware/redirect",
1273
+ order: "pre"
1274
+ });
1275
+ if (!resolvedConfig.playground) {
1276
+ addMiddleware({
1277
+ entrypoint: "emdash/middleware/setup",
1278
+ order: "pre"
1279
+ });
1280
+ addMiddleware({
1281
+ entrypoint: "emdash/middleware/auth",
1282
+ order: "pre"
1283
+ });
1284
+ }
1285
+ addMiddleware({
1286
+ entrypoint: "emdash/middleware/request-context",
1287
+ order: "pre"
1288
+ });
1289
+ printRoutesSummary(logger);
1290
+ },
1291
+ "astro:server:setup": ({ server, logger }) => {
1292
+ server.httpServer?.once("listening", async () => {
1293
+ const { writeFile, readFile } = await import("node:fs/promises");
1294
+ const { resolve } = await import("node:path");
1295
+ const address = server.httpServer?.address();
1296
+ if (!address || typeof address === "string") return;
1297
+ const typegenUrl = `http://localhost:${address.port}/_emdash/api/typegen`;
1298
+ const outputPath = resolve(process.cwd(), "emdash-env.d.ts");
1299
+ try {
1300
+ const response = await fetch(typegenUrl, {
1301
+ method: "POST",
1302
+ headers: { "Content-Type": "application/json" }
1303
+ });
1304
+ if (!response.ok) {
1305
+ const body = await response.text().catch(() => "");
1306
+ logger.warn(`Typegen failed: ${response.status} ${body.slice(0, 200)}`);
1307
+ return;
1308
+ }
1309
+ const { data: result } = await response.json();
1310
+ let needsWrite = true;
1311
+ try {
1312
+ if (await readFile(outputPath, "utf-8") === result.types) needsWrite = false;
1313
+ } catch {}
1314
+ if (needsWrite) {
1315
+ await writeFile(outputPath, result.types, "utf-8");
1316
+ logger.info(`Generated emdash-env.d.ts (${result.collections} collections)`);
1317
+ }
1318
+ } catch (error) {
1319
+ const msg = error instanceof Error ? error.message : String(error);
1320
+ logger.warn(`Typegen failed: ${msg}`);
1321
+ }
1322
+ });
1323
+ },
1324
+ "astro:build:done": ({ logger }) => {
1325
+ logger.info("Build complete");
1326
+ }
1327
+ }
1328
+ };
1329
+ }
1330
+
1331
+ //#endregion
1332
+ export { emdash as default, getStoredConfig, local, s3 };
1333
+ //# sourceMappingURL=index.mjs.map