emdash 1.1.0 → 1.3.0

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 (1571) hide show
  1. package/dist/action-token-SK8zyN7w.mjs +26 -0
  2. package/dist/action-token-SK8zyN7w.mjs.map +1 -0
  3. package/dist/activation-Dim4YMM7.mjs +387 -0
  4. package/dist/activation-Dim4YMM7.mjs.map +1 -0
  5. package/dist/adapters-F_xorvWv.d.mts +173 -0
  6. package/dist/adapters-F_xorvWv.d.mts.map +1 -0
  7. package/dist/allowed-origins-CEug-p0t.mjs +116 -0
  8. package/dist/allowed-origins-CEug-p0t.mjs.map +1 -0
  9. package/dist/api/route-utils.d.mts +4 -4
  10. package/dist/api/route-utils.d.mts.map +1 -1
  11. package/dist/api/route-utils.mjs +48 -46
  12. package/dist/api/route-utils.mjs.map +1 -1
  13. package/dist/api/schemas/index.d.mts +2 -2
  14. package/dist/api/schemas/index.mjs +10 -10
  15. package/dist/api-D-7BNHoz.mjs +5025 -0
  16. package/dist/api-D-7BNHoz.mjs.map +1 -0
  17. package/dist/api-tokens-Bx38ZCQp.mjs +173 -0
  18. package/dist/api-tokens-Bx38ZCQp.mjs.map +1 -0
  19. package/dist/apply-T7ATgzCh.mjs +1702 -0
  20. package/dist/apply-T7ATgzCh.mjs.map +1 -0
  21. package/dist/approvals-D-m6wvGl.mjs +460 -0
  22. package/dist/approvals-D-m6wvGl.mjs.map +1 -0
  23. package/dist/artifact-fetch-DIh7iyOV.mjs +659 -0
  24. package/dist/artifact-fetch-DIh7iyOV.mjs.map +1 -0
  25. package/dist/artifacts-htGyfCSt.mjs +307 -0
  26. package/dist/artifacts-htGyfCSt.mjs.map +1 -0
  27. package/dist/astro/image-endpoint.d.mts.map +1 -1
  28. package/dist/astro/image-endpoint.mjs +26 -6
  29. package/dist/astro/image-endpoint.mjs.map +1 -1
  30. package/dist/astro/index.d.mts +14 -14
  31. package/dist/astro/index.d.mts.map +1 -1
  32. package/dist/astro/index.mjs +324 -23
  33. package/dist/astro/index.mjs.map +1 -1
  34. package/dist/astro/middleware/auth.d.mts +12 -12
  35. package/dist/astro/middleware/auth.d.mts.map +1 -1
  36. package/dist/astro/middleware/auth.mjs +18 -13
  37. package/dist/astro/middleware/auth.mjs.map +1 -1
  38. package/dist/astro/middleware/media-usage-write-fence.mjs +5 -5
  39. package/dist/astro/middleware/redirect.d.mts.map +1 -1
  40. package/dist/astro/middleware/redirect.mjs +81 -46
  41. package/dist/astro/middleware/redirect.mjs.map +1 -1
  42. package/dist/astro/middleware/request-context.d.mts.map +1 -1
  43. package/dist/astro/middleware/request-context.mjs +117 -56
  44. package/dist/astro/middleware/request-context.mjs.map +1 -1
  45. package/dist/astro/middleware/setup.mjs +1 -1
  46. package/dist/astro/middleware.d.mts +12 -12
  47. package/dist/astro/middleware.d.mts.map +1 -1
  48. package/dist/astro/middleware.mjs +145 -415
  49. package/dist/astro/middleware.mjs.map +1 -1
  50. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +14 -14
  51. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +14 -14
  52. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +7 -6
  53. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs.map +1 -1
  54. package/dist/astro/routes/api/admin/api-tokens/index.mjs +8 -7
  55. package/dist/astro/routes/api/admin/api-tokens/index.mjs.map +1 -1
  56. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +6 -6
  57. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +16 -16
  58. package/dist/astro/routes/api/admin/byline-fields/index.mjs +16 -16
  59. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +16 -16
  60. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +22 -21
  61. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
  62. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +22 -21
  63. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
  64. package/dist/astro/routes/api/admin/bylines/index.mjs +22 -21
  65. package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
  66. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +18 -18
  67. package/dist/astro/routes/api/admin/comments/_id_.mjs +7 -7
  68. package/dist/astro/routes/api/admin/comments/bulk.mjs +17 -17
  69. package/dist/astro/routes/api/admin/comments/counts.mjs +7 -7
  70. package/dist/astro/routes/api/admin/comments/index.mjs +17 -17
  71. package/dist/astro/routes/api/admin/core-update.mjs +7 -7
  72. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +6 -6
  73. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +5 -5
  74. package/dist/astro/routes/api/admin/media-usage/activation.mjs +20 -20
  75. package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +21 -21
  76. package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +21 -21
  77. package/dist/astro/routes/api/admin/media-usage/progress.mjs +23 -22
  78. package/dist/astro/routes/api/admin/media-usage/progress.mjs.map +1 -1
  79. package/dist/astro/routes/api/admin/media-usage/repair.mjs +29 -28
  80. package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
  81. package/dist/astro/routes/api/admin/media-usage/work/index.mjs +21 -21
  82. package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +21 -21
  83. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
  84. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
  85. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +8 -8
  86. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +8 -8
  87. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +72 -70
  88. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  89. package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +7 -7
  90. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +71 -69
  91. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
  92. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +71 -70
  93. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  94. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +80 -79
  95. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  96. package/dist/astro/routes/api/admin/plugins/index.mjs +72 -70
  97. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  98. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +7 -7
  99. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +71 -69
  100. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  101. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +79 -78
  102. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
  103. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +71 -69
  104. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
  105. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +71 -70
  106. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
  107. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +81 -80
  108. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
  109. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +10 -10
  110. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
  111. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +73 -72
  112. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  113. package/dist/astro/routes/api/admin/plugins/registry/publisher-handle.mjs +7 -7
  114. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +72 -70
  115. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
  116. package/dist/astro/routes/api/admin/plugins/updates.mjs +71 -69
  117. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  118. package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.mjs +5 -5
  119. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +71 -69
  120. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  121. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +7 -7
  122. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +71 -69
  123. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  124. package/dist/astro/routes/api/admin/transfer/_...path_.mjs +4 -4
  125. package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs +38 -37
  126. package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs.map +1 -1
  127. package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs +38 -37
  128. package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs.map +1 -1
  129. package/dist/astro/routes/api/admin/transfer/approvals/index.mjs +40 -39
  130. package/dist/astro/routes/api/admin/transfer/approvals/index.mjs.map +1 -1
  131. package/dist/astro/routes/api/admin/transfer/capabilities.mjs +40 -39
  132. package/dist/astro/routes/api/admin/transfer/capabilities.mjs.map +1 -1
  133. package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs +40 -39
  134. package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs.map +1 -1
  135. package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs +41 -40
  136. package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs.map +1 -1
  137. package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs +41 -40
  138. package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs.map +1 -1
  139. package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs +40 -39
  140. package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs.map +1 -1
  141. package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs +41 -40
  142. package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs.map +1 -1
  143. package/dist/astro/routes/api/admin/transfer/exports/index.mjs +42 -41
  144. package/dist/astro/routes/api/admin/transfer/exports/index.mjs.map +1 -1
  145. package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs +40 -39
  146. package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs.map +1 -1
  147. package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs +40 -39
  148. package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs.map +1 -1
  149. package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs +42 -41
  150. package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs.map +1 -1
  151. package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs +40 -39
  152. package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs.map +1 -1
  153. package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs +42 -41
  154. package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs.map +1 -1
  155. package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs +40 -39
  156. package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs.map +1 -1
  157. package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs +40 -39
  158. package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs.map +1 -1
  159. package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs +42 -41
  160. package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs.map +1 -1
  161. package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs +40 -39
  162. package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs.map +1 -1
  163. package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs +40 -39
  164. package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs.map +1 -1
  165. package/dist/astro/routes/api/admin/transfer/imports/index.mjs +42 -41
  166. package/dist/astro/routes/api/admin/transfer/imports/index.mjs.map +1 -1
  167. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +4 -4
  168. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +4 -4
  169. package/dist/astro/routes/api/admin/users/_id_/index.mjs +14 -14
  170. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +6 -6
  171. package/dist/astro/routes/api/admin/users/index.mjs +14 -14
  172. package/dist/astro/routes/api/auth/dev-bypass.mjs +6 -6
  173. package/dist/astro/routes/api/auth/handover.d.mts +8 -0
  174. package/dist/astro/routes/api/auth/handover.d.mts.map +1 -0
  175. package/dist/astro/routes/api/auth/handover.mjs +49 -0
  176. package/dist/astro/routes/api/auth/handover.mjs.map +1 -0
  177. package/dist/astro/routes/api/auth/invite/accept.mjs +4 -4
  178. package/dist/astro/routes/api/auth/invite/complete.mjs +19 -19
  179. package/dist/astro/routes/api/auth/invite/index.mjs +16 -16
  180. package/dist/astro/routes/api/auth/invite/register-options.mjs +17 -17
  181. package/dist/astro/routes/api/auth/logout.mjs +5 -5
  182. package/dist/astro/routes/api/auth/magic-link/send.mjs +19 -18
  183. package/dist/astro/routes/api/auth/magic-link/send.mjs.map +1 -1
  184. package/dist/astro/routes/api/auth/magic-link/verify.d.mts.map +1 -1
  185. package/dist/astro/routes/api/auth/magic-link/verify.mjs +23 -17
  186. package/dist/astro/routes/api/auth/magic-link/verify.mjs.map +1 -1
  187. package/dist/astro/routes/api/auth/me.mjs +15 -15
  188. package/dist/astro/routes/api/auth/mode.mjs +5 -5
  189. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +8 -8
  190. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  191. package/dist/astro/routes/api/auth/passkey/_id_.mjs +14 -14
  192. package/dist/astro/routes/api/auth/passkey/index.mjs +4 -4
  193. package/dist/astro/routes/api/auth/passkey/options.d.mts.map +1 -1
  194. package/dist/astro/routes/api/auth/passkey/options.mjs +27 -20
  195. package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -1
  196. package/dist/astro/routes/api/auth/passkey/register/options.mjs +17 -17
  197. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +18 -18
  198. package/dist/astro/routes/api/auth/passkey/verify.mjs +19 -19
  199. package/dist/astro/routes/api/auth/signup/complete.mjs +19 -19
  200. package/dist/astro/routes/api/auth/signup/request.mjs +18 -17
  201. package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -1
  202. package/dist/astro/routes/api/auth/signup/verify.mjs +4 -4
  203. package/dist/astro/routes/api/calendar.mjs +15 -15
  204. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +12 -12
  205. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +18 -18
  206. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +5 -5
  207. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.d.mts.map +1 -1
  208. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +18 -17
  209. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
  210. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +7 -10
  211. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs.map +1 -1
  212. package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +20 -17
  213. package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs.map +1 -1
  214. package/dist/astro/routes/api/content/_collection_/_id_/permanent.d.mts.map +1 -1
  215. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +7 -6
  216. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs.map +1 -1
  217. package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs +11 -11
  218. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +30 -29
  219. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs.map +1 -1
  220. package/dist/astro/routes/api/content/_collection_/_id_/publish.d.mts.map +1 -1
  221. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +18 -17
  222. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
  223. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +35 -34
  224. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
  225. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +35 -34
  226. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
  227. package/dist/astro/routes/api/content/_collection_/_id_/restore.d.mts.map +1 -1
  228. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +7 -6
  229. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs.map +1 -1
  230. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +5 -5
  231. package/dist/astro/routes/api/content/_collection_/_id_/schedule.d.mts.map +1 -1
  232. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +19 -18
  233. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
  234. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.d.mts.map +1 -1
  235. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +31 -26
  236. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
  237. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +5 -5
  238. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.d.mts.map +1 -1
  239. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +18 -17
  240. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
  241. package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
  242. package/dist/astro/routes/api/content/_collection_/_id_.mjs +27 -20
  243. package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
  244. package/dist/astro/routes/api/content/_collection_/authors.mjs +5 -5
  245. package/dist/astro/routes/api/content/_collection_/index.mjs +18 -21
  246. package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
  247. package/dist/astro/routes/api/content/_collection_/trash.mjs +15 -15
  248. package/dist/astro/routes/api/dashboard.d.mts.map +1 -1
  249. package/dist/astro/routes/api/dashboard.mjs +18 -12
  250. package/dist/astro/routes/api/dashboard.mjs.map +1 -1
  251. package/dist/astro/routes/api/dev/emails.mjs +5 -5
  252. package/dist/astro/routes/api/dev/scheduled-tasks.d.mts +12 -0
  253. package/dist/astro/routes/api/dev/scheduled-tasks.d.mts.map +1 -0
  254. package/dist/astro/routes/api/dev/scheduled-tasks.mjs +140 -0
  255. package/dist/astro/routes/api/dev/scheduled-tasks.mjs.map +1 -0
  256. package/dist/astro/routes/api/health.mjs +6 -6
  257. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  258. package/dist/astro/routes/api/import/probe.mjs +25 -23
  259. package/dist/astro/routes/api/import/probe.mjs.map +1 -1
  260. package/dist/astro/routes/api/import/wordpress/analyze.d.mts.map +1 -1
  261. package/dist/astro/routes/api/import/wordpress/analyze.mjs +7 -20
  262. package/dist/astro/routes/api/import/wordpress/analyze.mjs.map +1 -1
  263. package/dist/astro/routes/api/import/wordpress/execute.d.mts +15 -14
  264. package/dist/astro/routes/api/import/wordpress/execute.d.mts.map +1 -1
  265. package/dist/astro/routes/api/import/wordpress/execute.mjs +36 -30
  266. package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
  267. package/dist/astro/routes/api/import/wordpress/media.d.mts +12 -12
  268. package/dist/astro/routes/api/import/wordpress/media.mjs +17 -17
  269. package/dist/astro/routes/api/import/wordpress/prepare.mjs +19 -17
  270. package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
  271. package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.d.mts +8 -0
  272. package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.d.mts.map +1 -1
  273. package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.mjs +67 -31
  274. package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.mjs.map +1 -1
  275. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +13 -13
  276. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +27 -26
  277. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
  278. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  279. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +26 -23
  280. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
  281. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +13 -13
  282. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts.map +1 -1
  283. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +63 -35
  284. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
  285. package/dist/astro/routes/api/manifest.mjs +9 -6
  286. package/dist/astro/routes/api/manifest.mjs.map +1 -1
  287. package/dist/astro/routes/api/mcp.mjs +135 -101
  288. package/dist/astro/routes/api/mcp.mjs.map +1 -1
  289. package/dist/astro/routes/api/media/_id_/confirm.d.mts.map +1 -1
  290. package/dist/astro/routes/api/media/_id_/confirm.mjs +34 -18
  291. package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
  292. package/dist/astro/routes/api/media/_id_/replace.mjs +15 -15
  293. package/dist/astro/routes/api/media/_id_/upload.mjs +8 -8
  294. package/dist/astro/routes/api/media/_id_/usage.mjs +31 -30
  295. package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -1
  296. package/dist/astro/routes/api/media/_id_.mjs +29 -28
  297. package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
  298. package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs +6 -6
  299. package/dist/astro/routes/api/media/file/_...key_.d.mts.map +1 -1
  300. package/dist/astro/routes/api/media/file/_...key_.mjs +45 -15
  301. package/dist/astro/routes/api/media/file/_...key_.mjs.map +1 -1
  302. package/dist/astro/routes/api/media/folders/_id_.mjs +16 -16
  303. package/dist/astro/routes/api/media/folders/index.mjs +16 -16
  304. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +5 -5
  305. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +5 -5
  306. package/dist/astro/routes/api/media/providers/index.mjs +5 -5
  307. package/dist/astro/routes/api/media/upload-url.mjs +40 -20
  308. package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
  309. package/dist/astro/routes/api/media.d.mts.map +1 -1
  310. package/dist/astro/routes/api/media.mjs +40 -29
  311. package/dist/astro/routes/api/media.mjs.map +1 -1
  312. package/dist/astro/routes/api/menus/_name_/items/_id_.d.mts.map +1 -1
  313. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +19 -18
  314. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
  315. package/dist/astro/routes/api/menus/_name_/items.d.mts.map +1 -1
  316. package/dist/astro/routes/api/menus/_name_/items.mjs +18 -17
  317. package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
  318. package/dist/astro/routes/api/menus/_name_/reorder.d.mts.map +1 -1
  319. package/dist/astro/routes/api/menus/_name_/reorder.mjs +18 -17
  320. package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
  321. package/dist/astro/routes/api/menus/_name_/translations.d.mts.map +1 -1
  322. package/dist/astro/routes/api/menus/_name_/translations.mjs +18 -17
  323. package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
  324. package/dist/astro/routes/api/menus/_name_.d.mts.map +1 -1
  325. package/dist/astro/routes/api/menus/_name_.mjs +19 -18
  326. package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
  327. package/dist/astro/routes/api/menus/index.d.mts.map +1 -1
  328. package/dist/astro/routes/api/menus/index.mjs +18 -17
  329. package/dist/astro/routes/api/menus/index.mjs.map +1 -1
  330. package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
  331. package/dist/astro/routes/api/oauth/device/authorize.mjs +8 -8
  332. package/dist/astro/routes/api/oauth/device/code.mjs +12 -11
  333. package/dist/astro/routes/api/oauth/device/code.mjs.map +1 -1
  334. package/dist/astro/routes/api/oauth/device/token.mjs +11 -10
  335. package/dist/astro/routes/api/oauth/device/token.mjs.map +1 -1
  336. package/dist/astro/routes/api/oauth/register.mjs +8 -7
  337. package/dist/astro/routes/api/oauth/register.mjs.map +1 -1
  338. package/dist/astro/routes/api/oauth/token/refresh.mjs +8 -8
  339. package/dist/astro/routes/api/oauth/token/revoke.mjs +8 -8
  340. package/dist/astro/routes/api/oauth/token.mjs +8 -8
  341. package/dist/astro/routes/api/openapi.json.mjs +22 -22
  342. package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
  343. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +11 -11
  344. package/dist/astro/routes/api/redirects/404s/index.mjs +19 -19
  345. package/dist/astro/routes/api/redirects/404s/summary.mjs +19 -19
  346. package/dist/astro/routes/api/redirects/_id_.d.mts.map +1 -1
  347. package/dist/astro/routes/api/redirects/_id_.mjs +32 -23
  348. package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
  349. package/dist/astro/routes/api/redirects/index.d.mts.map +1 -1
  350. package/dist/astro/routes/api/redirects/index.mjs +24 -21
  351. package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
  352. package/dist/astro/routes/api/relations/_id_/index.mjs +35 -34
  353. package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
  354. package/dist/astro/routes/api/relations/index.mjs +35 -34
  355. package/dist/astro/routes/api/relations/index.mjs.map +1 -1
  356. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +5 -5
  357. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +16 -16
  358. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs +71 -69
  359. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs.map +1 -1
  360. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs +71 -69
  361. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs.map +1 -1
  362. package/dist/astro/routes/api/schema/block-types/index.mjs +71 -69
  363. package/dist/astro/routes/api/schema/block-types/index.mjs.map +1 -1
  364. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +71 -69
  365. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  366. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +71 -69
  367. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  368. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +71 -69
  369. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  370. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +71 -69
  371. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  372. package/dist/astro/routes/api/schema/collections/index.mjs +71 -69
  373. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  374. package/dist/astro/routes/api/schema/collections/reorder.mjs +71 -69
  375. package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
  376. package/dist/astro/routes/api/schema/index.mjs +17 -16
  377. package/dist/astro/routes/api/schema/index.mjs.map +1 -1
  378. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +71 -69
  379. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  380. package/dist/astro/routes/api/schema/orphans/index.mjs +71 -69
  381. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  382. package/dist/astro/routes/api/search/enable.mjs +19 -18
  383. package/dist/astro/routes/api/search/enable.mjs.map +1 -1
  384. package/dist/astro/routes/api/search/index.mjs +18 -17
  385. package/dist/astro/routes/api/search/index.mjs.map +1 -1
  386. package/dist/astro/routes/api/search/rebuild.mjs +19 -18
  387. package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
  388. package/dist/astro/routes/api/search/stats.mjs +9 -8
  389. package/dist/astro/routes/api/search/stats.mjs.map +1 -1
  390. package/dist/astro/routes/api/search/suggest.mjs +18 -17
  391. package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
  392. package/dist/astro/routes/api/sections/_slug_.mjs +18 -17
  393. package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
  394. package/dist/astro/routes/api/sections/index.mjs +18 -17
  395. package/dist/astro/routes/api/sections/index.mjs.map +1 -1
  396. package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -7
  397. package/dist/astro/routes/api/settings/backups/archives/index.mjs +7 -7
  398. package/dist/astro/routes/api/settings/backups/export.mjs +7 -7
  399. package/dist/astro/routes/api/settings/backups/index.mjs +8 -8
  400. package/dist/astro/routes/api/settings/domain-notify.d.mts +8 -0
  401. package/dist/astro/routes/api/settings/domain-notify.d.mts.map +1 -0
  402. package/dist/astro/routes/api/settings/domain-notify.mjs +125 -0
  403. package/dist/astro/routes/api/settings/domain-notify.mjs.map +1 -0
  404. package/dist/astro/routes/api/settings/domain.d.mts +9 -0
  405. package/dist/astro/routes/api/settings/domain.d.mts.map +1 -0
  406. package/dist/astro/routes/api/settings/domain.mjs +64 -0
  407. package/dist/astro/routes/api/settings/domain.mjs.map +1 -0
  408. package/dist/astro/routes/api/settings/email.mjs +6 -6
  409. package/dist/astro/routes/api/settings.d.mts.map +1 -1
  410. package/dist/astro/routes/api/settings.mjs +23 -20
  411. package/dist/astro/routes/api/settings.mjs.map +1 -1
  412. package/dist/astro/routes/api/setup/admin-verify.d.mts.map +1 -1
  413. package/dist/astro/routes/api/setup/admin-verify.mjs +25 -21
  414. package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -1
  415. package/dist/astro/routes/api/setup/admin.mjs +18 -18
  416. package/dist/astro/routes/api/setup/dev-bypass.mjs +43 -41
  417. package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
  418. package/dist/astro/routes/api/setup/dev-reset.mjs +4 -4
  419. package/dist/astro/routes/api/setup/index.d.mts.map +1 -1
  420. package/dist/astro/routes/api/setup/index.mjs +53 -47
  421. package/dist/astro/routes/api/setup/index.mjs.map +1 -1
  422. package/dist/astro/routes/api/setup/status.mjs +6 -6
  423. package/dist/astro/routes/api/site/domain-proof.d.mts +8 -0
  424. package/dist/astro/routes/api/site/domain-proof.d.mts.map +1 -0
  425. package/dist/astro/routes/api/site/domain-proof.mjs +35 -0
  426. package/dist/astro/routes/api/site/domain-proof.mjs.map +1 -0
  427. package/dist/astro/routes/api/snapshot.mjs +8 -8
  428. package/dist/astro/routes/api/taxonomies/_name_/reorder.d.mts.map +1 -1
  429. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +24 -22
  430. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
  431. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.d.mts.map +1 -1
  432. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +24 -22
  433. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
  434. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.d.mts.map +1 -1
  435. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +25 -23
  436. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
  437. package/dist/astro/routes/api/taxonomies/_name_/terms/index.d.mts.map +1 -1
  438. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +24 -22
  439. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
  440. package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +22 -21
  441. package/dist/astro/routes/api/taxonomies/_name_/translations.mjs.map +1 -1
  442. package/dist/astro/routes/api/taxonomies/_name_.d.mts.map +1 -1
  443. package/dist/astro/routes/api/taxonomies/_name_.mjs +25 -23
  444. package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -1
  445. package/dist/astro/routes/api/taxonomies/bulk-tag.mjs +35 -34
  446. package/dist/astro/routes/api/taxonomies/bulk-tag.mjs.map +1 -1
  447. package/dist/astro/routes/api/taxonomies/index.d.mts.map +1 -1
  448. package/dist/astro/routes/api/taxonomies/index.mjs +24 -22
  449. package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
  450. package/dist/astro/routes/api/themes/preview.mjs +6 -6
  451. package/dist/astro/routes/api/typegen.mjs +6 -6
  452. package/dist/astro/routes/api/visual-editing/action-token.mjs +6 -6
  453. package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs +18 -18
  454. package/dist/astro/routes/api/visual-editing/toolbar-labels.mjs +4 -4
  455. package/dist/astro/routes/api/well-known/auth.mjs +1 -1
  456. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
  457. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
  458. package/dist/astro/routes/api/widget-areas/_name_/reorder.d.mts.map +1 -1
  459. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +17 -16
  460. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
  461. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.d.mts.map +1 -1
  462. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +21 -19
  463. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
  464. package/dist/astro/routes/api/widget-areas/_name_/widgets.d.mts.map +1 -1
  465. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +20 -18
  466. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
  467. package/dist/astro/routes/api/widget-areas/_name_.d.mts.map +1 -1
  468. package/dist/astro/routes/api/widget-areas/_name_.mjs +10 -8
  469. package/dist/astro/routes/api/widget-areas/_name_.mjs.map +1 -1
  470. package/dist/astro/routes/api/widget-areas/index.d.mts.map +1 -1
  471. package/dist/astro/routes/api/widget-areas/index.mjs +20 -18
  472. package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
  473. package/dist/astro/routes/api/widget-components.mjs +5 -5
  474. package/dist/astro/routes/robots.txt.d.mts.map +1 -1
  475. package/dist/astro/routes/robots.txt.mjs +38 -5
  476. package/dist/astro/routes/robots.txt.mjs.map +1 -1
  477. package/dist/astro/routes/sitemap-_collection_.xml.d.mts.map +1 -1
  478. package/dist/astro/routes/sitemap-_collection_.xml.mjs +33 -11
  479. package/dist/astro/routes/sitemap-_collection_.xml.mjs.map +1 -1
  480. package/dist/astro/routes/sitemap.xml.d.mts.map +1 -1
  481. package/dist/astro/routes/sitemap.xml.mjs +17 -11
  482. package/dist/astro/routes/sitemap.xml.mjs.map +1 -1
  483. package/dist/astro/types.d.mts +32 -18
  484. package/dist/astro/types.d.mts.map +1 -1
  485. package/dist/audit-_gieLVGU.mjs +127 -0
  486. package/dist/audit-_gieLVGU.mjs.map +1 -0
  487. package/dist/auth/providers/github.d.mts +1 -1
  488. package/dist/auth/providers/google.d.mts +1 -1
  489. package/dist/auth/providers/microsoft.d.mts +1 -1
  490. package/dist/authoritative-records-CQlB3JzE.mjs +5183 -0
  491. package/dist/authoritative-records-CQlB3JzE.mjs.map +1 -0
  492. package/dist/authorize-DPFBGbE6.mjs +74 -0
  493. package/dist/authorize-DPFBGbE6.mjs.map +1 -0
  494. package/dist/backup-3FgVxiDJ.mjs +246 -0
  495. package/dist/backup-3FgVxiDJ.mjs.map +1 -0
  496. package/dist/block-types-CYcG56JB.mjs +132 -0
  497. package/dist/block-types-CYcG56JB.mjs.map +1 -0
  498. package/dist/block-values-gCX4HBSl.mjs +215 -0
  499. package/dist/block-values-gCX4HBSl.mjs.map +1 -0
  500. package/dist/byline-BR1qhyiw.mjs +909 -0
  501. package/dist/byline-BR1qhyiw.mjs.map +1 -0
  502. package/dist/byline-fields-4ClDC88c.mjs +123 -0
  503. package/dist/byline-fields-4ClDC88c.mjs.map +1 -0
  504. package/dist/byline-fields-BLXZnX7N.mjs +280 -0
  505. package/dist/byline-fields-BLXZnX7N.mjs.map +1 -0
  506. package/dist/bylines-CVOvRUL7.mjs +234 -0
  507. package/dist/bylines-CVOvRUL7.mjs.map +1 -0
  508. package/dist/bylines-DxOs9B7z.mjs +150 -0
  509. package/dist/bylines-DxOs9B7z.mjs.map +1 -0
  510. package/dist/cache-CEU9wo_h.mjs +151 -0
  511. package/dist/cache-CEU9wo_h.mjs.map +1 -0
  512. package/dist/canonical-BudtH-Fx.mjs +174 -0
  513. package/dist/canonical-BudtH-Fx.mjs.map +1 -0
  514. package/dist/capture-triggers-CT6dK9zd.mjs +362 -0
  515. package/dist/capture-triggers-CT6dK9zd.mjs.map +1 -0
  516. package/dist/challenge-store-C17BYx2-.mjs +51 -0
  517. package/dist/challenge-store-C17BYx2-.mjs.map +1 -0
  518. package/dist/checksum-CEqvfxGX.mjs +162 -0
  519. package/dist/checksum-CEqvfxGX.mjs.map +1 -0
  520. package/dist/chunks-xC4UD5-S.mjs +25 -0
  521. package/dist/chunks-xC4UD5-S.mjs.map +1 -0
  522. package/dist/cli/index.mjs +134 -118
  523. package/dist/cli/index.mjs.map +1 -1
  524. package/dist/client/cf-access.d.mts +1 -1
  525. package/dist/client/index.d.mts +122 -122
  526. package/dist/client/index.d.mts.map +1 -1
  527. package/dist/client/index.mjs +12 -10
  528. package/dist/client/index.mjs.map +1 -1
  529. package/dist/collection-slugs-cache-e09QeJQt.mjs +85 -0
  530. package/dist/collection-slugs-cache-e09QeJQt.mjs.map +1 -0
  531. package/dist/comment-UvIWDKcW.mjs +325 -0
  532. package/dist/comment-UvIWDKcW.mjs.map +1 -0
  533. package/dist/comment-reaction-dGp6_FRo.mjs +85 -0
  534. package/dist/comment-reaction-dGp6_FRo.mjs.map +1 -0
  535. package/dist/comments-pej-_BUO.mjs +195 -0
  536. package/dist/comments-pej-_BUO.mjs.map +1 -0
  537. package/dist/comments-yiRFx3w5.mjs +99 -0
  538. package/dist/comments-yiRFx3w5.mjs.map +1 -0
  539. package/dist/components-Brp__9xo.mjs +112 -0
  540. package/dist/components-Brp__9xo.mjs.map +1 -0
  541. package/dist/config-Bsm_u_oE.d.mts +6799 -0
  542. package/dist/config-Bsm_u_oE.d.mts.map +1 -0
  543. package/dist/config-CFMojMFK.d.mts +39 -0
  544. package/dist/config-CFMojMFK.d.mts.map +1 -0
  545. package/dist/config-DBU6iUQB.mjs +228 -0
  546. package/dist/config-DBU6iUQB.mjs.map +1 -0
  547. package/dist/connection-BtEN_lP9.mjs +36 -0
  548. package/dist/connection-BtEN_lP9.mjs.map +1 -0
  549. package/dist/content-DQSRZTVw.mjs +2075 -0
  550. package/dist/content-DQSRZTVw.mjs.map +1 -0
  551. package/dist/content-list-query-CYKcY6Vi.d.mts +26 -0
  552. package/dist/content-list-query-CYKcY6Vi.d.mts.map +1 -0
  553. package/dist/content-repair-DNh5--x5.mjs +442 -0
  554. package/dist/content-repair-DNh5--x5.mjs.map +1 -0
  555. package/dist/context-BYptmCN0.mjs +2090 -0
  556. package/dist/context-BYptmCN0.mjs.map +1 -0
  557. package/dist/credits-B9iORdWB.mjs +110 -0
  558. package/dist/credits-B9iORdWB.mjs.map +1 -0
  559. package/dist/cron-D7obTIfk.mjs +306 -0
  560. package/dist/cron-D7obTIfk.mjs.map +1 -0
  561. package/dist/dashboard-D0jcgBD7.mjs +167 -0
  562. package/dist/dashboard-D0jcgBD7.mjs.map +1 -0
  563. package/dist/database/migration-lock.d.mts +17 -4
  564. package/dist/database/migration-lock.d.mts.map +1 -1
  565. package/dist/database/migration-lock.mjs +32 -5
  566. package/dist/database/migration-lock.mjs.map +1 -1
  567. package/dist/db/index.d.mts +3 -3
  568. package/dist/db/index.mjs +1 -1
  569. package/dist/db/libsql-migrations.d.mts +1 -1
  570. package/dist/db/libsql-migrations.mjs +4 -4
  571. package/dist/db/libsql.d.mts +1 -1
  572. package/dist/db/postgres-migrations.d.mts +1 -1
  573. package/dist/db/postgres-migrations.mjs +4 -4
  574. package/dist/db/postgres.d.mts +1 -1
  575. package/dist/db/sqlite-migrations.d.mts +1 -1
  576. package/dist/db/sqlite-migrations.mjs +4 -4
  577. package/dist/db/sqlite.d.mts +1 -1
  578. package/dist/db/sqlite.mjs +1 -1
  579. package/dist/default-C0W-PhAp.mjs +81 -0
  580. package/dist/default-C0W-PhAp.mjs.map +1 -0
  581. package/dist/deferred-tasks-ZvUECSzI.d.mts +9 -0
  582. package/dist/deferred-tasks-ZvUECSzI.d.mts.map +1 -0
  583. package/dist/dev-typegen-EBni_pOQ.mjs +29 -0
  584. package/dist/dev-typegen-EBni_pOQ.mjs.map +1 -0
  585. package/dist/device-flow-BkFKBoAn.mjs +521 -0
  586. package/dist/device-flow-BkFKBoAn.mjs.map +1 -0
  587. package/dist/digest-DJ1tHCgy.mjs +194 -0
  588. package/dist/digest-DJ1tHCgy.mjs.map +1 -0
  589. package/dist/direct-executor-Cbxzg4qe.mjs +117 -0
  590. package/dist/direct-executor-Cbxzg4qe.mjs.map +1 -0
  591. package/dist/email-console-FFVJWb9N.mjs +50 -0
  592. package/dist/email-console-FFVJWb9N.mjs.map +1 -0
  593. package/dist/email-locale-BJ8DjTzZ.mjs +25 -0
  594. package/dist/email-locale-BJ8DjTzZ.mjs.map +1 -0
  595. package/dist/emdash-runtime-DVi7vtXC.mjs +4379 -0
  596. package/dist/emdash-runtime-DVi7vtXC.mjs.map +1 -0
  597. package/dist/entry-lock-C7VX0NGK.d.mts +4568 -0
  598. package/dist/entry-lock-C7VX0NGK.d.mts.map +1 -0
  599. package/dist/entry-lock-DLxCffFW.mjs +163 -0
  600. package/dist/entry-lock-DLxCffFW.mjs.map +1 -0
  601. package/dist/entry-lock-Df6-XhIu.mjs +1211 -0
  602. package/dist/entry-lock-Df6-XhIu.mjs.map +1 -0
  603. package/dist/env-types-C3FCVBWe.mjs +38 -0
  604. package/dist/env-types-C3FCVBWe.mjs.map +1 -0
  605. package/dist/error-CVWeIOku.mjs +90 -0
  606. package/dist/error-CVWeIOku.mjs.map +1 -0
  607. package/dist/errors-B4f4It-2.mjs +120 -0
  608. package/dist/errors-B4f4It-2.mjs.map +1 -0
  609. package/dist/errors-BOYNdIo3.mjs +479 -0
  610. package/dist/errors-BOYNdIo3.mjs.map +1 -0
  611. package/dist/escape-lsNq38PP.mjs +9 -0
  612. package/dist/escape-lsNq38PP.mjs.map +1 -0
  613. package/dist/fence-C3MUitUN.mjs +162 -0
  614. package/dist/fence-C3MUitUN.mjs.map +1 -0
  615. package/dist/field-defs-cache-Dez5iWJJ.mjs +77 -0
  616. package/dist/field-defs-cache-Dez5iWJJ.mjs.map +1 -0
  617. package/dist/field-map-Bft9LKak.mjs +83 -0
  618. package/dist/field-map-Bft9LKak.mjs.map +1 -0
  619. package/dist/fts-manager-Beg3e4bI.mjs +443 -0
  620. package/dist/fts-manager-Beg3e4bI.mjs.map +1 -0
  621. package/dist/gc-ByyAYiYE.mjs +75 -0
  622. package/dist/gc-ByyAYiYE.mjs.map +1 -0
  623. package/dist/hash-BJaeek87.mjs +37 -0
  624. package/dist/hash-BJaeek87.mjs.map +1 -0
  625. package/dist/hook-result-BrdLyOdI.d.mts +31 -0
  626. package/dist/hook-result-BrdLyOdI.d.mts.map +1 -0
  627. package/dist/hreflang-C8Jb-hrf.mjs +105 -0
  628. package/dist/hreflang-C8Jb-hrf.mjs.map +1 -0
  629. package/dist/hreflang-CY_F5OjF.d.mts +50 -0
  630. package/dist/hreflang-CY_F5OjF.d.mts.map +1 -0
  631. package/dist/http-route-dispatch-CyeW6iPv.mjs +342 -0
  632. package/dist/http-route-dispatch-CyeW6iPv.mjs.map +1 -0
  633. package/dist/identity-Cael5uTT.mjs +35 -0
  634. package/dist/identity-Cael5uTT.mjs.map +1 -0
  635. package/dist/import-BUXjdZUn.mjs +2126 -0
  636. package/dist/import-BUXjdZUn.mjs.map +1 -0
  637. package/dist/index-BB9sVisO.d.mts +623 -0
  638. package/dist/index-BB9sVisO.d.mts.map +1 -0
  639. package/dist/index.d.mts +24 -24
  640. package/dist/index.mjs +97 -95
  641. package/dist/install-finalization-3JX5qQEA.mjs +58 -0
  642. package/dist/install-finalization-3JX5qQEA.mjs.map +1 -0
  643. package/dist/json-recordset-BUjxhr77.mjs +12 -0
  644. package/dist/json-recordset-BUjxhr77.mjs.map +1 -0
  645. package/dist/json-schema-v_D_pPNG.mjs +15 -0
  646. package/dist/json-schema-v_D_pPNG.mjs.map +1 -0
  647. package/dist/keys-CifIkT0N.mjs +61 -0
  648. package/dist/keys-CifIkT0N.mjs.map +1 -0
  649. package/dist/kinds-B_Qcl5pz.mjs +974 -0
  650. package/dist/kinds-B_Qcl5pz.mjs.map +1 -0
  651. package/dist/lifecycle-7vUJeFRe.mjs +25 -0
  652. package/dist/lifecycle-7vUJeFRe.mjs.map +1 -0
  653. package/dist/load-CdAG9wz-.mjs +28 -0
  654. package/dist/load-CdAG9wz-.mjs.map +1 -0
  655. package/dist/loader-CswroUbe.mjs +1380 -0
  656. package/dist/loader-CswroUbe.mjs.map +1 -0
  657. package/dist/loops-uA4iTOzd.mjs +205 -0
  658. package/dist/loops-uA4iTOzd.mjs.map +1 -0
  659. package/dist/manifest-builder-B8zjuH3f.mjs +189 -0
  660. package/dist/manifest-builder-B8zjuH3f.mjs.map +1 -0
  661. package/dist/manifest-schema-DNb4XmTS.mjs +497 -0
  662. package/dist/manifest-schema-DNb4XmTS.mjs.map +1 -0
  663. package/dist/marketplace-CqbgeIa7.mjs +257 -0
  664. package/dist/marketplace-CqbgeIa7.mjs.map +1 -0
  665. package/dist/media/image-endpoint.d.mts +26 -2
  666. package/dist/media/image-endpoint.d.mts.map +1 -1
  667. package/dist/media/image-endpoint.mjs +73 -3
  668. package/dist/media/image-endpoint.mjs.map +1 -1
  669. package/dist/media/index.d.mts +1 -1
  670. package/dist/media/local-runtime.d.mts +14 -14
  671. package/dist/media/local-runtime.mjs +10 -5
  672. package/dist/media/local-runtime.mjs.map +1 -1
  673. package/dist/media--dJRU6i2.mjs +294 -0
  674. package/dist/media--dJRU6i2.mjs.map +1 -0
  675. package/dist/media-1WC65OCB.mjs +416 -0
  676. package/dist/media-1WC65OCB.mjs.map +1 -0
  677. package/dist/media-Bws9f18T.mjs +373 -0
  678. package/dist/media-Bws9f18T.mjs.map +1 -0
  679. package/dist/media-allowlist-BJB7MFx6.mjs +45 -0
  680. package/dist/media-allowlist-BJB7MFx6.mjs.map +1 -0
  681. package/dist/media-folders-Dn3C16B8.mjs +210 -0
  682. package/dist/media-folders-Dn3C16B8.mjs.map +1 -0
  683. package/dist/media-url-BQgKvpQ5.mjs +43 -0
  684. package/dist/media-url-BQgKvpQ5.mjs.map +1 -0
  685. package/dist/media-usage-CF0WVcLO.mjs +282 -0
  686. package/dist/media-usage-CF0WVcLO.mjs.map +1 -0
  687. package/dist/media-usage-activation-C9HwVw5w.mjs +78 -0
  688. package/dist/media-usage-activation-C9HwVw5w.mjs.map +1 -0
  689. package/dist/media-usage-work-CkLa5-nc.mjs +1036 -0
  690. package/dist/media-usage-work-CkLa5-nc.mjs.map +1 -0
  691. package/dist/media-usage-work-m3AWTmmC.mjs +151 -0
  692. package/dist/media-usage-work-m3AWTmmC.mjs.map +1 -0
  693. package/dist/menus-BCVSSp1z.mjs +753 -0
  694. package/dist/menus-BCVSSp1z.mjs.map +1 -0
  695. package/dist/menus-BSzwObhV.mjs +92 -0
  696. package/dist/menus-BSzwObhV.mjs.map +1 -0
  697. package/dist/menus-Cl4kwdt7.mjs +3721 -0
  698. package/dist/menus-Cl4kwdt7.mjs.map +1 -0
  699. package/dist/migrations/index.d.mts +1 -1
  700. package/dist/migrations/index.d.mts.map +1 -1
  701. package/dist/migrations/index.mjs +3 -3
  702. package/dist/mode-C-D3qICy.mjs +23 -0
  703. package/dist/mode-C-D3qICy.mjs.map +1 -0
  704. package/dist/node-sqlite-compat-CrKzRr0J.mjs +63 -0
  705. package/dist/node-sqlite-compat-CrKzRr0J.mjs.map +1 -0
  706. package/dist/oauth-authorization-TpEJrYB7.mjs +274 -0
  707. package/dist/oauth-authorization-TpEJrYB7.mjs.map +1 -0
  708. package/dist/oauth-clients-BT0Pg-MO.mjs +266 -0
  709. package/dist/oauth-clients-BT0Pg-MO.mjs.map +1 -0
  710. package/dist/oauth-state-store-CHMn_mwc.mjs +50 -0
  711. package/dist/oauth-state-store-CHMn_mwc.mjs.map +1 -0
  712. package/dist/oauth-user-lookup-BDgF6IVG.mjs +26 -0
  713. package/dist/oauth-user-lookup-BDgF6IVG.mjs.map +1 -0
  714. package/dist/object-cache/memory.d.mts +1 -1
  715. package/dist/options-DJWaq3Ie.d.mts +81 -0
  716. package/dist/options-DJWaq3Ie.d.mts.map +1 -0
  717. package/dist/ownership-MiyA7qKO.mjs +12 -0
  718. package/dist/ownership-MiyA7qKO.mjs.map +1 -0
  719. package/dist/page/index.d.mts +2 -2
  720. package/dist/page/index.mjs +9 -4
  721. package/dist/page/index.mjs.map +1 -1
  722. package/dist/parse-CWHOFc6z.d.mts +176 -0
  723. package/dist/parse-CWHOFc6z.d.mts.map +1 -0
  724. package/dist/parse-DgQ2NABT.mjs +81 -0
  725. package/dist/parse-DgQ2NABT.mjs.map +1 -0
  726. package/dist/passkey-config-D0kdzEao.mjs +46 -0
  727. package/dist/passkey-config-D0kdzEao.mjs.map +1 -0
  728. package/dist/paths-biDzFTY2.mjs +77 -0
  729. package/dist/paths-biDzFTY2.mjs.map +1 -0
  730. package/dist/patterns-CMNnYCgf.mjs +159 -0
  731. package/dist/patterns-CMNnYCgf.mjs.map +1 -0
  732. package/dist/placeholder-D41vk11_.d.mts +306 -0
  733. package/dist/placeholder-D41vk11_.d.mts.map +1 -0
  734. package/dist/plan-CCoqxNoU.mjs +135 -0
  735. package/dist/plan-CCoqxNoU.mjs.map +1 -0
  736. package/dist/plugin-test-runtime.d.mts +14 -14
  737. package/dist/plugin-test-runtime.d.mts.map +1 -1
  738. package/dist/plugin-test-runtime.mjs +110 -108
  739. package/dist/plugin-tool-name-DDUgN_0p.mjs +27 -0
  740. package/dist/plugin-tool-name-DDUgN_0p.mjs.map +1 -0
  741. package/dist/plugin-types.d.mts +2 -2
  742. package/dist/plugin-utils.d.mts +12 -12
  743. package/dist/plugin-utils.mjs +1 -1
  744. package/dist/plugin-utils.mjs.map +1 -1
  745. package/dist/plugins/adapt-sandbox-entry.d.mts +12 -12
  746. package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
  747. package/dist/plugins/adapt-sandbox-entry.mjs +9 -8
  748. package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
  749. package/dist/plugins/host.d.mts +5 -5
  750. package/dist/plugins/host.mjs +46 -42
  751. package/dist/plugins-COJ2L49n.mjs +261 -0
  752. package/dist/plugins-COJ2L49n.mjs.map +1 -0
  753. package/dist/policy-DLQ--Hnm.mjs +45 -0
  754. package/dist/policy-DLQ--Hnm.mjs.map +1 -0
  755. package/dist/portable-text-BH4zgkSm.mjs +311 -0
  756. package/dist/portable-text-BH4zgkSm.mjs.map +1 -0
  757. package/dist/preview-DLexxwp3.mjs +107 -0
  758. package/dist/preview-DLexxwp3.mjs.map +1 -0
  759. package/dist/protocol-79kUO7jP.d.mts +65 -0
  760. package/dist/protocol-79kUO7jP.d.mts.map +1 -0
  761. package/dist/public-plugin-api-routes-BuAMJ8nN.mjs +316 -0
  762. package/dist/public-plugin-api-routes-BuAMJ8nN.mjs.map +1 -0
  763. package/dist/public-submission-Di3TsgzX.mjs +251 -0
  764. package/dist/public-submission-Di3TsgzX.mjs.map +1 -0
  765. package/dist/public-url-Bt98vysr.mjs +101 -0
  766. package/dist/public-url-Bt98vysr.mjs.map +1 -0
  767. package/dist/query-CpnRlBh8.mjs +1156 -0
  768. package/dist/query-CpnRlBh8.mjs.map +1 -0
  769. package/dist/query-haKvLAWl.mjs +41 -0
  770. package/dist/query-haKvLAWl.mjs.map +1 -0
  771. package/dist/range-CYfeXgGK.mjs +51 -0
  772. package/dist/range-CYfeXgGK.mjs.map +1 -0
  773. package/dist/rate-limit-Xp4d0NBY.mjs +127 -0
  774. package/dist/rate-limit-Xp4d0NBY.mjs.map +1 -0
  775. package/dist/receipt-BUsQCOeM.mjs +43 -0
  776. package/dist/receipt-BUsQCOeM.mjs.map +1 -0
  777. package/dist/redirect-CQAV7mCo.mjs +19 -0
  778. package/dist/redirect-CQAV7mCo.mjs.map +1 -0
  779. package/dist/redirect-DiS_3mA4.mjs +423 -0
  780. package/dist/redirect-DiS_3mA4.mjs.map +1 -0
  781. package/dist/redirect-paths-CNYq7w80.mjs +36 -0
  782. package/dist/redirect-paths-CNYq7w80.mjs.map +1 -0
  783. package/dist/redirects-BEVSRMa2.mjs +148 -0
  784. package/dist/redirects-BEVSRMa2.mjs.map +1 -0
  785. package/dist/redirects-BHpy-VsZ.mjs +446 -0
  786. package/dist/redirects-BHpy-VsZ.mjs.map +1 -0
  787. package/dist/registry/testing.mjs +3 -3
  788. package/dist/registry-TUVaid9Z.mjs +8369 -0
  789. package/dist/registry-TUVaid9Z.mjs.map +1 -0
  790. package/dist/relations-CA_QuMTU.mjs +776 -0
  791. package/dist/relations-CA_QuMTU.mjs.map +1 -0
  792. package/dist/request-context.d.mts +1 -1
  793. package/dist/request-meta-bwZ_NsvU.mjs +141 -0
  794. package/dist/request-meta-bwZ_NsvU.mjs.map +1 -0
  795. package/dist/resolve-DwNM-CXl.mjs +101 -0
  796. package/dist/resolve-DwNM-CXl.mjs.map +1 -0
  797. package/dist/revision-BVp8S0e_.mjs +374 -0
  798. package/dist/revision-BVp8S0e_.mjs.map +1 -0
  799. package/dist/route-cache-QSOyDEw0.mjs +20 -0
  800. package/dist/route-cache-QSOyDEw0.mjs.map +1 -0
  801. package/dist/route-wire-Ca_HWCZ5.mjs +197 -0
  802. package/dist/route-wire-Ca_HWCZ5.mjs.map +1 -0
  803. package/dist/routes-BerZFrvV.mjs +272 -0
  804. package/dist/routes-BerZFrvV.mjs.map +1 -0
  805. package/dist/runner-BObHz5FC.d.mts +68 -0
  806. package/dist/runner-BObHz5FC.d.mts.map +1 -0
  807. package/dist/runner-C5NeAkBQ.mjs +6595 -0
  808. package/dist/runner-C5NeAkBQ.mjs.map +1 -0
  809. package/dist/runtime.d.mts +13 -13
  810. package/dist/runtime.mjs +3 -2
  811. package/dist/runtime.mjs.map +1 -1
  812. package/dist/schema/project-env-types.mjs +40 -36
  813. package/dist/schema/project-env-types.mjs.map +1 -1
  814. package/dist/schema-C4OBuv6Z.mjs +13 -0
  815. package/dist/schema-C4OBuv6Z.mjs.map +1 -0
  816. package/dist/schema-DJRfvM_o.mjs +815 -0
  817. package/dist/schema-DJRfvM_o.mjs.map +1 -0
  818. package/dist/scopes-BU03K7Uo.mjs +34 -0
  819. package/dist/scopes-BU03K7Uo.mjs.map +1 -0
  820. package/dist/search-DfVzks89.mjs +450 -0
  821. package/dist/search-DfVzks89.mjs.map +1 -0
  822. package/dist/sections-BMy4JVUz.mjs +346 -0
  823. package/dist/sections-BMy4JVUz.mjs.map +1 -0
  824. package/dist/seed/index.d.mts +2 -2
  825. package/dist/seed/index.mjs +38 -34
  826. package/dist/seo/index.d.mts +3 -3
  827. package/dist/seo/index.mjs +25 -21
  828. package/dist/seo/index.mjs.map +1 -1
  829. package/dist/seo-ClB-dw9w.mjs +188 -0
  830. package/dist/seo-ClB-dw9w.mjs.map +1 -0
  831. package/dist/seo-VZYOEy8f.mjs +133 -0
  832. package/dist/seo-VZYOEy8f.mjs.map +1 -0
  833. package/dist/service-Bo_usgSk.mjs +150 -0
  834. package/dist/service-Bo_usgSk.mjs.map +1 -0
  835. package/dist/session-user-DlpPdf8L.mjs +61 -0
  836. package/dist/session-user-DlpPdf8L.mjs.map +1 -0
  837. package/dist/settings-CWb84sDm.mjs +452 -0
  838. package/dist/settings-CWb84sDm.mjs.map +1 -0
  839. package/dist/settings-DS914jjE.mjs +66 -0
  840. package/dist/settings-DS914jjE.mjs.map +1 -0
  841. package/dist/settings-Dd1uivmQ.mjs +73 -0
  842. package/dist/settings-Dd1uivmQ.mjs.map +1 -0
  843. package/dist/setup-complete-BuNxAUiN.mjs +65 -0
  844. package/dist/setup-complete-BuNxAUiN.mjs.map +1 -0
  845. package/dist/setup-nonce-BnEAX0iy.mjs +25 -0
  846. package/dist/setup-nonce-BnEAX0iy.mjs.map +1 -0
  847. package/dist/site-domain-Bq5j5bVg.mjs +131 -0
  848. package/dist/site-domain-Bq5j5bVg.mjs.map +1 -0
  849. package/dist/site-settings-DRHfX7bq.mjs +50 -0
  850. package/dist/site-settings-DRHfX7bq.mjs.map +1 -0
  851. package/dist/site-url-MB685I5X.mjs +45 -0
  852. package/dist/site-url-MB685I5X.mjs.map +1 -0
  853. package/dist/sitemap-name-BTg2NJJv.mjs +26 -0
  854. package/dist/sitemap-name-BTg2NJJv.mjs.map +1 -0
  855. package/dist/slug-aVnUV4SL.mjs +16 -0
  856. package/dist/slug-aVnUV4SL.mjs.map +1 -0
  857. package/dist/slugify-bu2-jKia.mjs +22 -0
  858. package/dist/slugify-bu2-jKia.mjs.map +1 -0
  859. package/dist/snapshot-DYsG4uOq.mjs +414 -0
  860. package/dist/snapshot-DYsG4uOq.mjs.map +1 -0
  861. package/dist/ssrf-BcYjyM4M.mjs +406 -0
  862. package/dist/ssrf-BcYjyM4M.mjs.map +1 -0
  863. package/dist/stage-D8DWgPcO.mjs +662 -0
  864. package/dist/stage-D8DWgPcO.mjs.map +1 -0
  865. package/dist/staged-CD_imitH.mjs +686 -0
  866. package/dist/staged-CD_imitH.mjs.map +1 -0
  867. package/dist/state-CFbGZziM.mjs +178 -0
  868. package/dist/state-CFbGZziM.mjs.map +1 -0
  869. package/dist/status-BFNdxzKc.mjs +30 -0
  870. package/dist/status-BFNdxzKc.mjs.map +1 -0
  871. package/dist/storage/local.d.mts +2 -2
  872. package/dist/storage/local.d.mts.map +1 -1
  873. package/dist/storage/local.mjs +12 -5
  874. package/dist/storage/local.mjs.map +1 -1
  875. package/dist/storage/s3.d.mts +4 -2
  876. package/dist/storage/s3.d.mts.map +1 -1
  877. package/dist/storage/s3.mjs +56 -9
  878. package/dist/storage/s3.mjs.map +1 -1
  879. package/dist/storage-query-DRyu3bSU.d.mts +1615 -0
  880. package/dist/storage-query-DRyu3bSU.d.mts.map +1 -0
  881. package/dist/tar-DFjExb9X.mjs +449 -0
  882. package/dist/tar-DFjExb9X.mjs.map +1 -0
  883. package/dist/target-CWZs2-o6.mjs +27 -0
  884. package/dist/target-CWZs2-o6.mjs.map +1 -0
  885. package/dist/taxonomies-ChnU7Mc8.mjs +697 -0
  886. package/dist/taxonomies-ChnU7Mc8.mjs.map +1 -0
  887. package/dist/taxonomies-Dd9JJv_a.mjs +939 -0
  888. package/dist/taxonomies-Dd9JJv_a.mjs.map +1 -0
  889. package/dist/taxonomy-C_C_LBAU.mjs +550 -0
  890. package/dist/taxonomy-C_C_LBAU.mjs.map +1 -0
  891. package/dist/tokens-BnhSnGwJ.mjs +171 -0
  892. package/dist/tokens-BnhSnGwJ.mjs.map +1 -0
  893. package/dist/transfer-ClH6w6BV.mjs +8873 -0
  894. package/dist/transfer-ClH6w6BV.mjs.map +1 -0
  895. package/dist/transfer-WmWiR3xf.mjs +166 -0
  896. package/dist/transfer-WmWiR3xf.mjs.map +1 -0
  897. package/dist/transfer-download--ofRj9Cw.mjs +33 -0
  898. package/dist/transfer-download--ofRj9Cw.mjs.map +1 -0
  899. package/dist/transformations-Bx4lYY0Y.mjs +196 -0
  900. package/dist/transformations-Bx4lYY0Y.mjs.map +1 -0
  901. package/dist/transport-BjbqNiPI.mjs +136 -0
  902. package/dist/transport-BjbqNiPI.mjs.map +1 -0
  903. package/dist/transport-DxiXnbXk.d.mts +42 -0
  904. package/dist/transport-DxiXnbXk.d.mts.map +1 -0
  905. package/dist/trusted-proxy-BU3Nx9g1.mjs +51 -0
  906. package/dist/trusted-proxy-BU3Nx9g1.mjs.map +1 -0
  907. package/dist/turnstile-CJwvsOqw.mjs +58 -0
  908. package/dist/turnstile-CJwvsOqw.mjs.map +1 -0
  909. package/dist/types-BA3ey2QH.d.mts +87 -0
  910. package/dist/types-BA3ey2QH.d.mts.map +1 -0
  911. package/dist/types-Bwpzb5o6.d.mts +227 -0
  912. package/dist/types-Bwpzb5o6.d.mts.map +1 -0
  913. package/dist/types-CNB-dj6F.d.mts +289 -0
  914. package/dist/types-CNB-dj6F.d.mts.map +1 -0
  915. package/dist/types-CgfFGfO5.mjs +16 -0
  916. package/dist/types-CgfFGfO5.mjs.map +1 -0
  917. package/dist/types-D2NEXtgB.mjs +127 -0
  918. package/dist/types-D2NEXtgB.mjs.map +1 -0
  919. package/dist/types-DCFavOii.d.mts +916 -0
  920. package/dist/types-DCFavOii.d.mts.map +1 -0
  921. package/dist/types-DHO7Pd25.d.mts +366 -0
  922. package/dist/types-DHO7Pd25.d.mts.map +1 -0
  923. package/dist/types-DvqVxZXa.d.mts +125 -0
  924. package/dist/types-DvqVxZXa.d.mts.map +1 -0
  925. package/dist/types-QoPHm-2w.d.mts +1741 -0
  926. package/dist/types-QoPHm-2w.d.mts.map +1 -0
  927. package/dist/types-RLgeIpnF.d.mts +374 -0
  928. package/dist/types-RLgeIpnF.d.mts.map +1 -0
  929. package/dist/types-qHVygneX.mjs +77 -0
  930. package/dist/types-qHVygneX.mjs.map +1 -0
  931. package/dist/types-sUHaH7lC.mjs +37 -0
  932. package/dist/types-sUHaH7lC.mjs.map +1 -0
  933. package/dist/types-slSqujQL.d.mts +204 -0
  934. package/dist/types-slSqujQL.d.mts.map +1 -0
  935. package/dist/update-check-BxNg9T6N.mjs +161 -0
  936. package/dist/update-check-BxNg9T6N.mjs.map +1 -0
  937. package/dist/upload-attempts-DPFC4COv.mjs +32 -0
  938. package/dist/upload-attempts-DPFC4COv.mjs.map +1 -0
  939. package/dist/url-pattern-QATUE_rv.mjs +41 -0
  940. package/dist/url-pattern-QATUE_rv.mjs.map +1 -0
  941. package/dist/user-BlCTKVAm.mjs +171 -0
  942. package/dist/user-BlCTKVAm.mjs.map +1 -0
  943. package/dist/utils-TPt7w2cS.mjs +442 -0
  944. package/dist/utils-TPt7w2cS.mjs.map +1 -0
  945. package/dist/validate-DxYhJQA-.mjs +524 -0
  946. package/dist/validate-DxYhJQA-.mjs.map +1 -0
  947. package/dist/validate-emKxGC5F.d.mts +468 -0
  948. package/dist/validate-emKxGC5F.d.mts.map +1 -0
  949. package/dist/validation-Ckq4vsVg.mjs +220 -0
  950. package/dist/validation-Ckq4vsVg.mjs.map +1 -0
  951. package/dist/version-BZj18Q7G.mjs +9 -0
  952. package/dist/version-BZj18Q7G.mjs.map +1 -0
  953. package/dist/version-DHmGpcch.mjs +7 -0
  954. package/dist/version-DHmGpcch.mjs.map +1 -0
  955. package/dist/video-DytCnw3L.mjs +54 -0
  956. package/dist/video-DytCnw3L.mjs.map +1 -0
  957. package/dist/virtual-modules-DO954n7P.mjs +515 -0
  958. package/dist/virtual-modules-DO954n7P.mjs.map +1 -0
  959. package/dist/widgets-DA5XmvVC.mjs +121 -0
  960. package/dist/widgets-DA5XmvVC.mjs.map +1 -0
  961. package/dist/wxr-taxonomies-CrMonejI.d.mts +34 -0
  962. package/dist/wxr-taxonomies-CrMonejI.d.mts.map +1 -0
  963. package/dist/wxr-taxonomies-RgRG0d5e.mjs +453 -0
  964. package/dist/wxr-taxonomies-RgRG0d5e.mjs.map +1 -0
  965. package/dist/zod-generator-D0JKy94C.mjs +424 -0
  966. package/dist/zod-generator-D0JKy94C.mjs.map +1 -0
  967. package/package.json +15 -11
  968. package/src/api/authorize.ts +42 -0
  969. package/src/api/errors.ts +9 -0
  970. package/src/api/handlers/api-tokens.ts +12 -6
  971. package/src/api/handlers/content.ts +57 -8
  972. package/src/api/handlers/dashboard.ts +33 -10
  973. package/src/api/handlers/domain-move-notice.ts +94 -0
  974. package/src/api/handlers/index.ts +2 -0
  975. package/src/api/handlers/manifest.ts +6 -0
  976. package/src/api/handlers/media-usage.ts +2 -1
  977. package/src/api/handlers/media.ts +1 -0
  978. package/src/api/handlers/plugins.ts +1 -0
  979. package/src/api/handlers/revision.ts +6 -2
  980. package/src/api/handlers/seo.ts +155 -59
  981. package/src/api/handlers/settings.ts +31 -1
  982. package/src/api/handlers/site-domain.ts +159 -0
  983. package/src/api/openapi/document.ts +2 -2
  984. package/src/api/public-url.ts +1 -1
  985. package/src/api/schemas/content.ts +20 -0
  986. package/src/api/schemas/media-usage.ts +7 -1
  987. package/src/api/schemas/media.ts +12 -0
  988. package/src/api/schemas/settings.ts +2 -0
  989. package/src/api/site-url.ts +53 -5
  990. package/src/api/types.ts +4 -0
  991. package/src/astro/image-endpoint.ts +46 -4
  992. package/src/astro/integration/admin-locales.ts +168 -0
  993. package/src/astro/integration/dev-env.ts +84 -0
  994. package/src/astro/integration/dev-scheduler-bridge.ts +91 -0
  995. package/src/astro/integration/index.ts +97 -10
  996. package/src/astro/integration/routes.ts +28 -0
  997. package/src/astro/integration/runtime.ts +17 -1
  998. package/src/astro/integration/virtual-modules.ts +9 -16
  999. package/src/astro/integration/vite-config.ts +22 -16
  1000. package/src/astro/middleware/auth.ts +19 -4
  1001. package/src/astro/middleware/csp.ts +1 -0
  1002. package/src/astro/middleware/redirect.ts +94 -50
  1003. package/src/astro/middleware/request-context.ts +12 -6
  1004. package/src/astro/middleware.ts +71 -17
  1005. package/src/astro/prefetch.ts +7 -5
  1006. package/src/astro/public-plugin-api-routes.ts +10 -2
  1007. package/src/astro/routes/api/admin/plugins/registry/artifact.ts +1 -1
  1008. package/src/astro/routes/api/auth/handover.ts +58 -0
  1009. package/src/astro/routes/api/auth/magic-link/verify.ts +11 -3
  1010. package/src/astro/routes/api/auth/passkey/options.ts +10 -2
  1011. package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +2 -1
  1012. package/src/astro/routes/api/content/[collection]/[id]/duplicate.ts +1 -5
  1013. package/src/astro/routes/api/content/[collection]/[id]/lock.ts +2 -2
  1014. package/src/astro/routes/api/content/[collection]/[id]/permanent.ts +2 -1
  1015. package/src/astro/routes/api/content/[collection]/[id]/publish.ts +2 -1
  1016. package/src/astro/routes/api/content/[collection]/[id]/restore.ts +2 -1
  1017. package/src/astro/routes/api/content/[collection]/[id]/schedule.ts +3 -2
  1018. package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +5 -4
  1019. package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +2 -1
  1020. package/src/astro/routes/api/content/[collection]/[id].ts +18 -6
  1021. package/src/astro/routes/api/content/[collection]/index.ts +1 -5
  1022. package/src/astro/routes/api/dashboard.ts +4 -1
  1023. package/src/astro/routes/api/dev/scheduled-tasks.ts +20 -0
  1024. package/src/astro/routes/api/import/wordpress/analyze.ts +1 -16
  1025. package/src/astro/routes/api/import/wordpress/execute.ts +27 -3
  1026. package/src/astro/routes/api/import/wordpress/rewrite-url-helpers.ts +80 -42
  1027. package/src/astro/routes/api/import/wordpress-plugin/analyze.ts +4 -1
  1028. package/src/astro/routes/api/import/wordpress-plugin/execute.ts +49 -5
  1029. package/src/astro/routes/api/manifest.ts +10 -0
  1030. package/src/astro/routes/api/media/[id]/confirm.ts +19 -0
  1031. package/src/astro/routes/api/media/file/[...key].ts +60 -12
  1032. package/src/astro/routes/api/media/upload-url.ts +28 -4
  1033. package/src/astro/routes/api/media.ts +15 -0
  1034. package/src/astro/routes/api/menus/[name]/items/[id].ts +3 -2
  1035. package/src/astro/routes/api/menus/[name]/items.ts +2 -1
  1036. package/src/astro/routes/api/menus/[name]/reorder.ts +2 -1
  1037. package/src/astro/routes/api/menus/[name]/translations.ts +2 -1
  1038. package/src/astro/routes/api/menus/[name].ts +3 -2
  1039. package/src/astro/routes/api/menus/index.ts +2 -1
  1040. package/src/astro/routes/api/redirects/[id].ts +15 -2
  1041. package/src/astro/routes/api/redirects/index.ts +5 -1
  1042. package/src/astro/routes/api/schema/index.ts +1 -1
  1043. package/src/astro/routes/api/settings/domain-notify.ts +76 -0
  1044. package/src/astro/routes/api/settings/domain.ts +64 -0
  1045. package/src/astro/routes/api/settings.ts +2 -1
  1046. package/src/astro/routes/api/setup/admin-verify.ts +7 -1
  1047. package/src/astro/routes/api/setup/index.ts +7 -0
  1048. package/src/astro/routes/api/site/domain-proof.ts +28 -0
  1049. package/src/astro/routes/api/taxonomies/[name]/reorder.ts +2 -1
  1050. package/src/astro/routes/api/taxonomies/[name]/terms/[slug]/translations.ts +2 -1
  1051. package/src/astro/routes/api/taxonomies/[name]/terms/[slug].ts +3 -2
  1052. package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +2 -1
  1053. package/src/astro/routes/api/taxonomies/[name].ts +3 -2
  1054. package/src/astro/routes/api/taxonomies/index.ts +2 -1
  1055. package/src/astro/routes/api/widget-areas/[name]/reorder.ts +2 -1
  1056. package/src/astro/routes/api/widget-areas/[name]/widgets/[id].ts +3 -2
  1057. package/src/astro/routes/api/widget-areas/[name]/widgets.ts +2 -1
  1058. package/src/astro/routes/api/widget-areas/[name].ts +2 -1
  1059. package/src/astro/routes/api/widget-areas/index.ts +2 -1
  1060. package/src/astro/routes/robots.txt.ts +33 -2
  1061. package/src/astro/routes/sitemap-[collection].xml.ts +31 -8
  1062. package/src/astro/routes/sitemap.xml.ts +12 -10
  1063. package/src/astro/types.ts +23 -2
  1064. package/src/auth/rate-limit.ts +18 -13
  1065. package/src/auth/types.ts +11 -4
  1066. package/src/aws-sdk.d.ts +2 -1
  1067. package/src/cache/redirect-paths.ts +56 -0
  1068. package/src/cache/route-cache.ts +22 -0
  1069. package/src/cleanup.ts +26 -0
  1070. package/src/cli/commands/export-seed.ts +2 -0
  1071. package/src/cli/commands/import/wordpress.ts +3 -27
  1072. package/src/cli/commands/login.ts +35 -43
  1073. package/src/cli/commands/migrate.ts +36 -4
  1074. package/src/cli/commands/seed.ts +23 -12
  1075. package/src/cli/wxr/parser.ts +2 -2
  1076. package/src/client/index.ts +18 -3
  1077. package/src/client/portable-text.ts +21 -7
  1078. package/src/comments/public-submission.ts +15 -8
  1079. package/src/comments/query.ts +8 -2
  1080. package/src/components/CommentForm.astro +50 -10
  1081. package/src/components/Comments.astro +51 -29
  1082. package/src/components/EmDashImage.astro +6 -4
  1083. package/src/components/Gallery.astro +4 -3
  1084. package/src/components/Image.astro +4 -3
  1085. package/src/components/InlinePortableTextEditor.tsx +269 -1320
  1086. package/src/components/Video.astro +100 -0
  1087. package/src/components/index.ts +4 -1
  1088. package/src/components/inline-block-types.ts +278 -0
  1089. package/src/components/inline-bubble-menu.tsx +696 -0
  1090. package/src/components/inline-code-block.tsx +8 -0
  1091. package/src/components/inline-editor-ui.tsx +1192 -0
  1092. package/src/components/inline-image.tsx +722 -0
  1093. package/src/components/inline-media-picker.tsx +1221 -0
  1094. package/src/components/inline-slash-menu.tsx +556 -0
  1095. package/src/components/webmcp-search.ts +15 -19
  1096. package/src/components/widgets/RecentPosts.astro +57 -17
  1097. package/src/content/converters/mark-safety.ts +3 -3
  1098. package/src/content/converters/portable-text-identity.ts +1 -0
  1099. package/src/content/converters/portable-text-to-prosemirror.ts +7 -0
  1100. package/src/content/converters/prosemirror-to-portable-text.ts +16 -0
  1101. package/src/content/converters/types.ts +22 -0
  1102. package/src/content/converters/video.ts +77 -0
  1103. package/src/database/collection-cleanup.ts +30 -0
  1104. package/src/database/datetime-storage.ts +337 -60
  1105. package/src/database/migration-lock.ts +43 -7
  1106. package/src/database/migrations/runner.ts +13 -1
  1107. package/src/database/repositories/comment.ts +17 -3
  1108. package/src/database/repositories/content.ts +25 -4
  1109. package/src/database/repositories/plugin-storage.ts +137 -27
  1110. package/src/database/repositories/redirect.ts +24 -2
  1111. package/src/database/repositories/revision.ts +24 -6
  1112. package/src/database/repositories/taxonomy.ts +61 -46
  1113. package/src/database/repositories/types.ts +67 -7
  1114. package/src/emdash-runtime.ts +393 -228
  1115. package/src/import/index.ts +1 -0
  1116. package/src/import/registry.ts +17 -0
  1117. package/src/import/sources/wordpress-plugin.ts +154 -11
  1118. package/src/import/types.ts +3 -0
  1119. package/src/import/utils.ts +7 -3
  1120. package/src/index.ts +3 -0
  1121. package/src/loader.ts +170 -45
  1122. package/src/mcp/json-schema.ts +14 -0
  1123. package/src/mcp/plugin-tool-name.ts +36 -0
  1124. package/src/mcp/server.ts +74 -15
  1125. package/src/media/image-endpoint.ts +101 -1
  1126. package/src/media/responsive.ts +14 -7
  1127. package/src/media/usage/collection-deletion.ts +4 -0
  1128. package/src/media/usage/extractor.ts +19 -2
  1129. package/src/media/usage/types.ts +5 -1
  1130. package/src/migrations/direct-executor.ts +42 -12
  1131. package/src/migrations/protocol.ts +6 -2
  1132. package/src/plugin-utils.ts +1 -1
  1133. package/src/plugins/adapt-sandbox-entry.ts +16 -6
  1134. package/src/plugins/context.ts +3 -7
  1135. package/src/plugins/hooks.ts +1 -1
  1136. package/src/plugins/http-route-dispatch.ts +5 -1
  1137. package/src/plugins/manifest-schema.ts +1 -0
  1138. package/src/plugins/route-error.ts +14 -0
  1139. package/src/plugins/routes.ts +2 -2
  1140. package/src/plugins/state.ts +41 -8
  1141. package/src/plugins/types.ts +6 -0
  1142. package/src/query.ts +59 -10
  1143. package/src/redirects/cache.ts +34 -2
  1144. package/src/redirects/patterns.ts +26 -2
  1145. package/src/schema/block-values.ts +80 -17
  1146. package/src/schema/registry.ts +16 -5
  1147. package/src/schema/slug.ts +19 -0
  1148. package/src/search/query.ts +3 -1
  1149. package/src/search/text-extraction.ts +6 -1
  1150. package/src/seed/apply.ts +32 -8
  1151. package/src/seed/validate.ts +31 -0
  1152. package/src/seo/sitemap-name.ts +22 -0
  1153. package/src/settings/index.ts +20 -0
  1154. package/src/settings/types.ts +2 -0
  1155. package/src/storage/index.ts +2 -0
  1156. package/src/storage/local.ts +10 -2
  1157. package/src/storage/range.ts +54 -0
  1158. package/src/storage/s3.ts +52 -8
  1159. package/src/storage/types.ts +30 -3
  1160. package/src/ui.ts +1 -0
  1161. package/src/utils/slugify.ts +6 -1
  1162. package/src/visual-editing/toolbar.ts +126 -47
  1163. package/src/widgets/components.ts +4 -0
  1164. package/src/widgets/index.ts +74 -82
  1165. package/src/widgets/recent-posts.ts +62 -0
  1166. package/dist/action-token-AgOs1UWD.mjs +0 -26
  1167. package/dist/action-token-AgOs1UWD.mjs.map +0 -1
  1168. package/dist/activation-xomsCMJg.mjs +0 -387
  1169. package/dist/activation-xomsCMJg.mjs.map +0 -1
  1170. package/dist/adapters-DM1oyHIN.d.mts +0 -173
  1171. package/dist/adapters-DM1oyHIN.d.mts.map +0 -1
  1172. package/dist/allowed-origins-CFtudhyw.mjs +0 -116
  1173. package/dist/allowed-origins-CFtudhyw.mjs.map +0 -1
  1174. package/dist/api-CltsXhiX.mjs +0 -4980
  1175. package/dist/api-CltsXhiX.mjs.map +0 -1
  1176. package/dist/api-tokens-P3mAaQgr.mjs +0 -166
  1177. package/dist/api-tokens-P3mAaQgr.mjs.map +0 -1
  1178. package/dist/apply-Q7uvzBWW.mjs +0 -1680
  1179. package/dist/apply-Q7uvzBWW.mjs.map +0 -1
  1180. package/dist/approvals-DycwI6lZ.mjs +0 -460
  1181. package/dist/approvals-DycwI6lZ.mjs.map +0 -1
  1182. package/dist/artifact-fetch-CWxyELVI.mjs +0 -659
  1183. package/dist/artifact-fetch-CWxyELVI.mjs.map +0 -1
  1184. package/dist/artifacts-UzWbysb8.mjs +0 -307
  1185. package/dist/artifacts-UzWbysb8.mjs.map +0 -1
  1186. package/dist/audit-CCH3MA4Y.mjs +0 -127
  1187. package/dist/audit-CCH3MA4Y.mjs.map +0 -1
  1188. package/dist/authoritative-records-dSvXCfzb.mjs +0 -5172
  1189. package/dist/authoritative-records-dSvXCfzb.mjs.map +0 -1
  1190. package/dist/authorize-DeWfk--K.mjs +0 -49
  1191. package/dist/authorize-DeWfk--K.mjs.map +0 -1
  1192. package/dist/backup-CFnbdTSJ.mjs +0 -246
  1193. package/dist/backup-CFnbdTSJ.mjs.map +0 -1
  1194. package/dist/block-types-C0YFSfR7.mjs +0 -132
  1195. package/dist/block-types-C0YFSfR7.mjs.map +0 -1
  1196. package/dist/block-values-H4E0XwE8.mjs +0 -175
  1197. package/dist/block-values-H4E0XwE8.mjs.map +0 -1
  1198. package/dist/byline-BhVslYLz.mjs +0 -909
  1199. package/dist/byline-BhVslYLz.mjs.map +0 -1
  1200. package/dist/byline-fields-DHJs0Mja.mjs +0 -280
  1201. package/dist/byline-fields-DHJs0Mja.mjs.map +0 -1
  1202. package/dist/byline-fields-xdxE9kxZ.mjs +0 -123
  1203. package/dist/byline-fields-xdxE9kxZ.mjs.map +0 -1
  1204. package/dist/bylines-B_nN9liM.mjs +0 -234
  1205. package/dist/bylines-B_nN9liM.mjs.map +0 -1
  1206. package/dist/bylines-C71YACkL.mjs +0 -150
  1207. package/dist/bylines-C71YACkL.mjs.map +0 -1
  1208. package/dist/cache-aTYCL9nK.mjs +0 -133
  1209. package/dist/cache-aTYCL9nK.mjs.map +0 -1
  1210. package/dist/canonical-Y1dpjCnp.mjs +0 -174
  1211. package/dist/canonical-Y1dpjCnp.mjs.map +0 -1
  1212. package/dist/capture-triggers-C9JKoIdT.mjs +0 -362
  1213. package/dist/capture-triggers-C9JKoIdT.mjs.map +0 -1
  1214. package/dist/challenge-store-CxZxPqaw.mjs +0 -51
  1215. package/dist/challenge-store-CxZxPqaw.mjs.map +0 -1
  1216. package/dist/checksum-DtH6m5uk.mjs +0 -162
  1217. package/dist/checksum-DtH6m5uk.mjs.map +0 -1
  1218. package/dist/chunks-zlGB5IQP.mjs +0 -25
  1219. package/dist/chunks-zlGB5IQP.mjs.map +0 -1
  1220. package/dist/collection-slugs-cache-B2Gs9Jwx.mjs +0 -85
  1221. package/dist/collection-slugs-cache-B2Gs9Jwx.mjs.map +0 -1
  1222. package/dist/comment-Bu08Wvr3.mjs +0 -313
  1223. package/dist/comment-Bu08Wvr3.mjs.map +0 -1
  1224. package/dist/comment-reaction-B8SfT-yM.mjs +0 -85
  1225. package/dist/comment-reaction-B8SfT-yM.mjs.map +0 -1
  1226. package/dist/comments-BRtp992B.mjs +0 -99
  1227. package/dist/comments-BRtp992B.mjs.map +0 -1
  1228. package/dist/comments-DVUYqdyC.mjs +0 -195
  1229. package/dist/comments-DVUYqdyC.mjs.map +0 -1
  1230. package/dist/components-CQY-Sgm-.mjs +0 -108
  1231. package/dist/components-CQY-Sgm-.mjs.map +0 -1
  1232. package/dist/config-B-uePMLj.d.mts +0 -39
  1233. package/dist/config-B-uePMLj.d.mts.map +0 -1
  1234. package/dist/config-B6BDSsz2.d.mts +0 -6712
  1235. package/dist/config-B6BDSsz2.d.mts.map +0 -1
  1236. package/dist/config-BsJHiQxC.mjs +0 -228
  1237. package/dist/config-BsJHiQxC.mjs.map +0 -1
  1238. package/dist/connection-B9pIasFd.mjs +0 -36
  1239. package/dist/connection-B9pIasFd.mjs.map +0 -1
  1240. package/dist/content-Dji9vEiW.mjs +0 -2063
  1241. package/dist/content-Dji9vEiW.mjs.map +0 -1
  1242. package/dist/content-list-query-DiNwyKtd.d.mts +0 -26
  1243. package/dist/content-list-query-DiNwyKtd.d.mts.map +0 -1
  1244. package/dist/content-repair-B7wnbzhN.mjs +0 -442
  1245. package/dist/content-repair-B7wnbzhN.mjs.map +0 -1
  1246. package/dist/context-Ctcxc8Ia.mjs +0 -2026
  1247. package/dist/context-Ctcxc8Ia.mjs.map +0 -1
  1248. package/dist/credits-Bu7dlobo.mjs +0 -110
  1249. package/dist/credits-Bu7dlobo.mjs.map +0 -1
  1250. package/dist/cron-xe5XKqA-.mjs +0 -306
  1251. package/dist/cron-xe5XKqA-.mjs.map +0 -1
  1252. package/dist/dashboard-B5hVHOtf.mjs +0 -151
  1253. package/dist/dashboard-B5hVHOtf.mjs.map +0 -1
  1254. package/dist/default-DaoYyFRS.mjs +0 -81
  1255. package/dist/default-DaoYyFRS.mjs.map +0 -1
  1256. package/dist/deferred-tasks-BYcDx2o_.d.mts +0 -9
  1257. package/dist/deferred-tasks-BYcDx2o_.d.mts.map +0 -1
  1258. package/dist/dev-typegen-Dtl8AfS6.mjs +0 -29
  1259. package/dist/dev-typegen-Dtl8AfS6.mjs.map +0 -1
  1260. package/dist/device-flow-Ma5P5d2e.mjs +0 -521
  1261. package/dist/device-flow-Ma5P5d2e.mjs.map +0 -1
  1262. package/dist/digest-xIpR3o64.mjs +0 -194
  1263. package/dist/digest-xIpR3o64.mjs.map +0 -1
  1264. package/dist/direct-executor-DMWwCey3.mjs +0 -104
  1265. package/dist/direct-executor-DMWwCey3.mjs.map +0 -1
  1266. package/dist/email-console-DmqVF5J_.mjs +0 -50
  1267. package/dist/email-console-DmqVF5J_.mjs.map +0 -1
  1268. package/dist/email-locale-Cc5YSXfJ.mjs +0 -25
  1269. package/dist/email-locale-Cc5YSXfJ.mjs.map +0 -1
  1270. package/dist/emdash-runtime-BlybX9Ui.mjs +0 -4249
  1271. package/dist/emdash-runtime-BlybX9Ui.mjs.map +0 -1
  1272. package/dist/entry-lock-De1L8qUQ.mjs +0 -163
  1273. package/dist/entry-lock-De1L8qUQ.mjs.map +0 -1
  1274. package/dist/entry-lock-esmMbgI9.d.mts +0 -4551
  1275. package/dist/entry-lock-esmMbgI9.d.mts.map +0 -1
  1276. package/dist/entry-lock-sxz2PGAT.mjs +0 -1197
  1277. package/dist/entry-lock-sxz2PGAT.mjs.map +0 -1
  1278. package/dist/env-types-BkjCtN13.mjs +0 -38
  1279. package/dist/env-types-BkjCtN13.mjs.map +0 -1
  1280. package/dist/error-B0rgPgsQ.mjs +0 -90
  1281. package/dist/error-B0rgPgsQ.mjs.map +0 -1
  1282. package/dist/errors-CuHQRiBW.mjs +0 -120
  1283. package/dist/errors-CuHQRiBW.mjs.map +0 -1
  1284. package/dist/errors-DTE6C3K_.mjs +0 -470
  1285. package/dist/errors-DTE6C3K_.mjs.map +0 -1
  1286. package/dist/escape-nJW7dR0s.mjs +0 -9
  1287. package/dist/escape-nJW7dR0s.mjs.map +0 -1
  1288. package/dist/fence-CGw57S4v.mjs +0 -162
  1289. package/dist/fence-CGw57S4v.mjs.map +0 -1
  1290. package/dist/field-defs-cache-Bw8w499w.mjs +0 -77
  1291. package/dist/field-defs-cache-Bw8w499w.mjs.map +0 -1
  1292. package/dist/field-map-hn-D-SyH.mjs +0 -83
  1293. package/dist/field-map-hn-D-SyH.mjs.map +0 -1
  1294. package/dist/fts-manager-DacCYIe4.mjs +0 -443
  1295. package/dist/fts-manager-DacCYIe4.mjs.map +0 -1
  1296. package/dist/gc-BBplHrv6.mjs +0 -75
  1297. package/dist/gc-BBplHrv6.mjs.map +0 -1
  1298. package/dist/hash-C4DFoJ7Z.mjs +0 -37
  1299. package/dist/hash-C4DFoJ7Z.mjs.map +0 -1
  1300. package/dist/hook-result-DSRRxu_-.d.mts +0 -31
  1301. package/dist/hook-result-DSRRxu_-.d.mts.map +0 -1
  1302. package/dist/hreflang-CKPunvU0.mjs +0 -105
  1303. package/dist/hreflang-CKPunvU0.mjs.map +0 -1
  1304. package/dist/hreflang-egumj6WF.d.mts +0 -50
  1305. package/dist/hreflang-egumj6WF.d.mts.map +0 -1
  1306. package/dist/http-route-dispatch-DjNFZcJ2.mjs +0 -339
  1307. package/dist/http-route-dispatch-DjNFZcJ2.mjs.map +0 -1
  1308. package/dist/identity-Dfrx2_Bc.mjs +0 -35
  1309. package/dist/identity-Dfrx2_Bc.mjs.map +0 -1
  1310. package/dist/import-ROBvhbNc.mjs +0 -2021
  1311. package/dist/import-ROBvhbNc.mjs.map +0 -1
  1312. package/dist/index-B4sIdCAT.d.mts +0 -623
  1313. package/dist/index-B4sIdCAT.d.mts.map +0 -1
  1314. package/dist/install-finalization-CPM7Gged.mjs +0 -58
  1315. package/dist/install-finalization-CPM7Gged.mjs.map +0 -1
  1316. package/dist/keys-DxqxcAD4.mjs +0 -61
  1317. package/dist/keys-DxqxcAD4.mjs.map +0 -1
  1318. package/dist/kinds-BQl5gN6e.mjs +0 -974
  1319. package/dist/kinds-BQl5gN6e.mjs.map +0 -1
  1320. package/dist/lifecycle-DGQI7itS.mjs +0 -25
  1321. package/dist/lifecycle-DGQI7itS.mjs.map +0 -1
  1322. package/dist/load-DMxRl4VK.mjs +0 -28
  1323. package/dist/load-DMxRl4VK.mjs.map +0 -1
  1324. package/dist/loader-1DMiOq5s.mjs +0 -1303
  1325. package/dist/loader-1DMiOq5s.mjs.map +0 -1
  1326. package/dist/loops-Dn1i16FP.mjs +0 -205
  1327. package/dist/loops-Dn1i16FP.mjs.map +0 -1
  1328. package/dist/manifest-builder-CTw4FmZk.mjs +0 -189
  1329. package/dist/manifest-builder-CTw4FmZk.mjs.map +0 -1
  1330. package/dist/manifest-schema-gy37bD_D.mjs +0 -496
  1331. package/dist/manifest-schema-gy37bD_D.mjs.map +0 -1
  1332. package/dist/marketplace-tHWSsCUo.mjs +0 -257
  1333. package/dist/marketplace-tHWSsCUo.mjs.map +0 -1
  1334. package/dist/media-Bw-Q65ve.mjs +0 -294
  1335. package/dist/media-Bw-Q65ve.mjs.map +0 -1
  1336. package/dist/media-BzUDu7nl.mjs +0 -373
  1337. package/dist/media-BzUDu7nl.mjs.map +0 -1
  1338. package/dist/media-aahnKHze.mjs +0 -408
  1339. package/dist/media-aahnKHze.mjs.map +0 -1
  1340. package/dist/media-allowlist-RMrjo8TU.mjs +0 -45
  1341. package/dist/media-allowlist-RMrjo8TU.mjs.map +0 -1
  1342. package/dist/media-folders-kabR1oJf.mjs +0 -210
  1343. package/dist/media-folders-kabR1oJf.mjs.map +0 -1
  1344. package/dist/media-url-DloW2xrP.mjs +0 -43
  1345. package/dist/media-url-DloW2xrP.mjs.map +0 -1
  1346. package/dist/media-usage-CHHpV7ee.mjs +0 -282
  1347. package/dist/media-usage-CHHpV7ee.mjs.map +0 -1
  1348. package/dist/media-usage-activation-BinYqC_r.mjs +0 -78
  1349. package/dist/media-usage-activation-BinYqC_r.mjs.map +0 -1
  1350. package/dist/media-usage-work-C734aq6s.mjs +0 -1015
  1351. package/dist/media-usage-work-C734aq6s.mjs.map +0 -1
  1352. package/dist/media-usage-work-lxvV0-UO.mjs +0 -151
  1353. package/dist/media-usage-work-lxvV0-UO.mjs.map +0 -1
  1354. package/dist/menus-6RHNq4ZK.mjs +0 -753
  1355. package/dist/menus-6RHNq4ZK.mjs.map +0 -1
  1356. package/dist/menus-AuCTaO9W.mjs +0 -3704
  1357. package/dist/menus-AuCTaO9W.mjs.map +0 -1
  1358. package/dist/menus-BQKqf0Up.mjs +0 -92
  1359. package/dist/menus-BQKqf0Up.mjs.map +0 -1
  1360. package/dist/mode-nh0ppSX5.mjs +0 -23
  1361. package/dist/mode-nh0ppSX5.mjs.map +0 -1
  1362. package/dist/node-sqlite-compat-CDOEcc97.mjs +0 -63
  1363. package/dist/node-sqlite-compat-CDOEcc97.mjs.map +0 -1
  1364. package/dist/oauth-authorization-BtYQ80uU.mjs +0 -274
  1365. package/dist/oauth-authorization-BtYQ80uU.mjs.map +0 -1
  1366. package/dist/oauth-clients-C1S4NQHh.mjs +0 -266
  1367. package/dist/oauth-clients-C1S4NQHh.mjs.map +0 -1
  1368. package/dist/oauth-state-store-CpGi2FZH.mjs +0 -50
  1369. package/dist/oauth-state-store-CpGi2FZH.mjs.map +0 -1
  1370. package/dist/oauth-user-lookup-BNp1aFAr.mjs +0 -26
  1371. package/dist/oauth-user-lookup-BNp1aFAr.mjs.map +0 -1
  1372. package/dist/options-B41aLm1I.d.mts +0 -81
  1373. package/dist/options-B41aLm1I.d.mts.map +0 -1
  1374. package/dist/ownership-DoeAIuTg.mjs +0 -12
  1375. package/dist/ownership-DoeAIuTg.mjs.map +0 -1
  1376. package/dist/parse-CmFDTGzp.mjs +0 -81
  1377. package/dist/parse-CmFDTGzp.mjs.map +0 -1
  1378. package/dist/parse-QVS0t5oR.d.mts +0 -172
  1379. package/dist/parse-QVS0t5oR.d.mts.map +0 -1
  1380. package/dist/passkey-config-C-MxsV22.mjs +0 -46
  1381. package/dist/passkey-config-C-MxsV22.mjs.map +0 -1
  1382. package/dist/paths-kr8hAMMI.mjs +0 -77
  1383. package/dist/paths-kr8hAMMI.mjs.map +0 -1
  1384. package/dist/patterns-DyZJ67I7.mjs +0 -140
  1385. package/dist/patterns-DyZJ67I7.mjs.map +0 -1
  1386. package/dist/placeholder-Dn7MMdWr.d.mts +0 -306
  1387. package/dist/placeholder-Dn7MMdWr.d.mts.map +0 -1
  1388. package/dist/plan-CuQOeU9g.mjs +0 -135
  1389. package/dist/plan-CuQOeU9g.mjs.map +0 -1
  1390. package/dist/plugins-CGb-G98c.mjs +0 -261
  1391. package/dist/plugins-CGb-G98c.mjs.map +0 -1
  1392. package/dist/policy-C5wrDXYV.mjs +0 -45
  1393. package/dist/policy-C5wrDXYV.mjs.map +0 -1
  1394. package/dist/portable-text-BnRuiR1-.mjs +0 -307
  1395. package/dist/portable-text-BnRuiR1-.mjs.map +0 -1
  1396. package/dist/preview-xWNSR1Li.mjs +0 -107
  1397. package/dist/preview-xWNSR1Li.mjs.map +0 -1
  1398. package/dist/protocol-ClxN-m1e.d.mts +0 -61
  1399. package/dist/protocol-ClxN-m1e.d.mts.map +0 -1
  1400. package/dist/public-submission-CkmT2SKv.mjs +0 -250
  1401. package/dist/public-submission-CkmT2SKv.mjs.map +0 -1
  1402. package/dist/public-url-B5a0QAh6.mjs +0 -101
  1403. package/dist/public-url-B5a0QAh6.mjs.map +0 -1
  1404. package/dist/query-DHqFiqqH.mjs +0 -41
  1405. package/dist/query-DHqFiqqH.mjs.map +0 -1
  1406. package/dist/query-DT85BehD.mjs +0 -1125
  1407. package/dist/query-DT85BehD.mjs.map +0 -1
  1408. package/dist/rate-limit-iMvcu3eu.mjs +0 -120
  1409. package/dist/rate-limit-iMvcu3eu.mjs.map +0 -1
  1410. package/dist/receipt-Dpp1uaX9.mjs +0 -43
  1411. package/dist/receipt-Dpp1uaX9.mjs.map +0 -1
  1412. package/dist/redirect-BRoLiWQE.mjs +0 -19
  1413. package/dist/redirect-BRoLiWQE.mjs.map +0 -1
  1414. package/dist/redirect-xZNpBoGp.mjs +0 -417
  1415. package/dist/redirect-xZNpBoGp.mjs.map +0 -1
  1416. package/dist/redirects-D4EWeXAo.mjs +0 -148
  1417. package/dist/redirects-D4EWeXAo.mjs.map +0 -1
  1418. package/dist/redirects-DCKqwiWp.mjs +0 -446
  1419. package/dist/redirects-DCKqwiWp.mjs.map +0 -1
  1420. package/dist/registry-DaXmUsD4.mjs +0 -8369
  1421. package/dist/registry-DaXmUsD4.mjs.map +0 -1
  1422. package/dist/relations-JvBP8nGP.mjs +0 -776
  1423. package/dist/relations-JvBP8nGP.mjs.map +0 -1
  1424. package/dist/request-meta-B6blULFY.mjs +0 -141
  1425. package/dist/request-meta-B6blULFY.mjs.map +0 -1
  1426. package/dist/resolve-DAhHi5tn.mjs +0 -100
  1427. package/dist/resolve-DAhHi5tn.mjs.map +0 -1
  1428. package/dist/revision-BWEH2qQB.mjs +0 -368
  1429. package/dist/revision-BWEH2qQB.mjs.map +0 -1
  1430. package/dist/route-wire-DK600v4u.mjs +0 -197
  1431. package/dist/route-wire-DK600v4u.mjs.map +0 -1
  1432. package/dist/routes-BeZyaCzv.mjs +0 -272
  1433. package/dist/routes-BeZyaCzv.mjs.map +0 -1
  1434. package/dist/runner-CskI4Hmq.mjs +0 -6372
  1435. package/dist/runner-CskI4Hmq.mjs.map +0 -1
  1436. package/dist/runner-J3Cj6DGk.d.mts +0 -68
  1437. package/dist/runner-J3Cj6DGk.d.mts.map +0 -1
  1438. package/dist/schema-CK0ihqMR.mjs +0 -815
  1439. package/dist/schema-CK0ihqMR.mjs.map +0 -1
  1440. package/dist/schema-VtaZSrC-.mjs +0 -13
  1441. package/dist/schema-VtaZSrC-.mjs.map +0 -1
  1442. package/dist/scopes-BRnGlL9t.mjs +0 -34
  1443. package/dist/scopes-BRnGlL9t.mjs.map +0 -1
  1444. package/dist/search-D6-XK1Sn.mjs +0 -448
  1445. package/dist/search-D6-XK1Sn.mjs.map +0 -1
  1446. package/dist/sections-CBDCf7qR.mjs +0 -346
  1447. package/dist/sections-CBDCf7qR.mjs.map +0 -1
  1448. package/dist/seo-BdeEPDNW.mjs +0 -133
  1449. package/dist/seo-BdeEPDNW.mjs.map +0 -1
  1450. package/dist/seo-C61bnPuV.mjs +0 -114
  1451. package/dist/seo-C61bnPuV.mjs.map +0 -1
  1452. package/dist/service-BuRKLMxa.mjs +0 -150
  1453. package/dist/service-BuRKLMxa.mjs.map +0 -1
  1454. package/dist/session-user-CqkPtrPL.mjs +0 -61
  1455. package/dist/session-user-CqkPtrPL.mjs.map +0 -1
  1456. package/dist/settings-0u0lTthS.mjs +0 -51
  1457. package/dist/settings-0u0lTthS.mjs.map +0 -1
  1458. package/dist/settings-WHr45II1.mjs +0 -61
  1459. package/dist/settings-WHr45II1.mjs.map +0 -1
  1460. package/dist/settings-m5tIYnF0.mjs +0 -443
  1461. package/dist/settings-m5tIYnF0.mjs.map +0 -1
  1462. package/dist/setup-complete-B2_dhZZz.mjs +0 -65
  1463. package/dist/setup-complete-B2_dhZZz.mjs.map +0 -1
  1464. package/dist/setup-nonce-CJV9ftSK.mjs +0 -25
  1465. package/dist/setup-nonce-CJV9ftSK.mjs.map +0 -1
  1466. package/dist/site-settings-KJOqJW6W.mjs +0 -50
  1467. package/dist/site-settings-KJOqJW6W.mjs.map +0 -1
  1468. package/dist/site-url-Ceq_AUK0.mjs +0 -16
  1469. package/dist/site-url-Ceq_AUK0.mjs.map +0 -1
  1470. package/dist/slugify-T5GHH42D.mjs +0 -17
  1471. package/dist/slugify-T5GHH42D.mjs.map +0 -1
  1472. package/dist/snapshot-Dzsn3NZa.mjs +0 -414
  1473. package/dist/snapshot-Dzsn3NZa.mjs.map +0 -1
  1474. package/dist/ssrf-DsmvZB80.mjs +0 -406
  1475. package/dist/ssrf-DsmvZB80.mjs.map +0 -1
  1476. package/dist/stage-Csnh_yEd.mjs +0 -662
  1477. package/dist/stage-Csnh_yEd.mjs.map +0 -1
  1478. package/dist/staged-Q7pnEVvI.mjs +0 -686
  1479. package/dist/staged-Q7pnEVvI.mjs.map +0 -1
  1480. package/dist/state-kGdOMQRY.mjs +0 -153
  1481. package/dist/state-kGdOMQRY.mjs.map +0 -1
  1482. package/dist/status-D39Fpy8R.mjs +0 -30
  1483. package/dist/status-D39Fpy8R.mjs.map +0 -1
  1484. package/dist/storage-query-C7iy6eUb.d.mts +0 -1615
  1485. package/dist/storage-query-C7iy6eUb.d.mts.map +0 -1
  1486. package/dist/tar-BWiraSUY.mjs +0 -449
  1487. package/dist/tar-BWiraSUY.mjs.map +0 -1
  1488. package/dist/target-DOFs5oUC.mjs +0 -27
  1489. package/dist/target-DOFs5oUC.mjs.map +0 -1
  1490. package/dist/taxonomies-BS40Wxvi.mjs +0 -939
  1491. package/dist/taxonomies-BS40Wxvi.mjs.map +0 -1
  1492. package/dist/taxonomies-DAZU9VDd.mjs +0 -697
  1493. package/dist/taxonomies-DAZU9VDd.mjs.map +0 -1
  1494. package/dist/taxonomy-XzLE95Vx.mjs +0 -525
  1495. package/dist/taxonomy-XzLE95Vx.mjs.map +0 -1
  1496. package/dist/tokens-DSQan4p7.mjs +0 -171
  1497. package/dist/tokens-DSQan4p7.mjs.map +0 -1
  1498. package/dist/transfer-BcCVxDgf.mjs +0 -166
  1499. package/dist/transfer-BcCVxDgf.mjs.map +0 -1
  1500. package/dist/transfer-OMrancOt.mjs +0 -8873
  1501. package/dist/transfer-OMrancOt.mjs.map +0 -1
  1502. package/dist/transfer-download-Dc-ltjZY.mjs +0 -33
  1503. package/dist/transfer-download-Dc-ltjZY.mjs.map +0 -1
  1504. package/dist/transformations-Ddx7UtrY.mjs +0 -196
  1505. package/dist/transformations-Ddx7UtrY.mjs.map +0 -1
  1506. package/dist/transport-flR-Zmds.d.mts +0 -42
  1507. package/dist/transport-flR-Zmds.d.mts.map +0 -1
  1508. package/dist/transport-umzEbgYO.mjs +0 -136
  1509. package/dist/transport-umzEbgYO.mjs.map +0 -1
  1510. package/dist/trusted-proxy-BqfQFs6a.mjs +0 -51
  1511. package/dist/trusted-proxy-BqfQFs6a.mjs.map +0 -1
  1512. package/dist/turnstile-Do60baId.mjs +0 -58
  1513. package/dist/turnstile-Do60baId.mjs.map +0 -1
  1514. package/dist/types-BT1p3uyb.d.mts +0 -1735
  1515. package/dist/types-BT1p3uyb.d.mts.map +0 -1
  1516. package/dist/types-BYaPWs_F.d.mts +0 -198
  1517. package/dist/types-BYaPWs_F.d.mts.map +0 -1
  1518. package/dist/types-C-Xp0CcN.mjs +0 -103
  1519. package/dist/types-C-Xp0CcN.mjs.map +0 -1
  1520. package/dist/types-CLTQ9b_r.d.mts +0 -374
  1521. package/dist/types-CLTQ9b_r.d.mts.map +0 -1
  1522. package/dist/types-CPkQw2T2.d.mts +0 -85
  1523. package/dist/types-CPkQw2T2.d.mts.map +0 -1
  1524. package/dist/types-CQLvuXoZ.d.mts +0 -198
  1525. package/dist/types-CQLvuXoZ.d.mts.map +0 -1
  1526. package/dist/types-CV5xszpF.d.mts +0 -363
  1527. package/dist/types-CV5xszpF.d.mts.map +0 -1
  1528. package/dist/types-CdEMurNh.mjs +0 -77
  1529. package/dist/types-CdEMurNh.mjs.map +0 -1
  1530. package/dist/types-CxwtnuSS.mjs +0 -37
  1531. package/dist/types-CxwtnuSS.mjs.map +0 -1
  1532. package/dist/types-DGw8KMX_.mjs +0 -16
  1533. package/dist/types-DGw8KMX_.mjs.map +0 -1
  1534. package/dist/types-DOfVMPoo.d.mts +0 -125
  1535. package/dist/types-DOfVMPoo.d.mts.map +0 -1
  1536. package/dist/types-LtS0SM4F.d.mts +0 -287
  1537. package/dist/types-LtS0SM4F.d.mts.map +0 -1
  1538. package/dist/types-ifgOkcBa.d.mts +0 -916
  1539. package/dist/types-ifgOkcBa.d.mts.map +0 -1
  1540. package/dist/update-check-DOc2aBIU.mjs +0 -161
  1541. package/dist/update-check-DOc2aBIU.mjs.map +0 -1
  1542. package/dist/upload-attempts-nzdc3cay.mjs +0 -32
  1543. package/dist/upload-attempts-nzdc3cay.mjs.map +0 -1
  1544. package/dist/url-pattern-hVbqpXs6.mjs +0 -41
  1545. package/dist/url-pattern-hVbqpXs6.mjs.map +0 -1
  1546. package/dist/user-Dnp53zTq.mjs +0 -171
  1547. package/dist/user-Dnp53zTq.mjs.map +0 -1
  1548. package/dist/utils-CoV-PYhg.mjs +0 -439
  1549. package/dist/utils-CoV-PYhg.mjs.map +0 -1
  1550. package/dist/validate-CfQ9_YlD.d.mts +0 -468
  1551. package/dist/validate-CfQ9_YlD.d.mts.map +0 -1
  1552. package/dist/validate-DBX3DKtL.mjs +0 -516
  1553. package/dist/validate-DBX3DKtL.mjs.map +0 -1
  1554. package/dist/validation-BJMiDhB1.mjs +0 -219
  1555. package/dist/validation-BJMiDhB1.mjs.map +0 -1
  1556. package/dist/version-BaT8yKIT.mjs +0 -7
  1557. package/dist/version-BaT8yKIT.mjs.map +0 -1
  1558. package/dist/version-BwEGkqkx.mjs +0 -9
  1559. package/dist/version-BwEGkqkx.mjs.map +0 -1
  1560. package/dist/virtual-modules-B6vJW15k.mjs +0 -516
  1561. package/dist/virtual-modules-B6vJW15k.mjs.map +0 -1
  1562. package/dist/widgets-BkxBAgZ_.mjs +0 -126
  1563. package/dist/widgets-BkxBAgZ_.mjs.map +0 -1
  1564. package/dist/wxr-taxonomies-D7gAJyOF.mjs +0 -453
  1565. package/dist/wxr-taxonomies-D7gAJyOF.mjs.map +0 -1
  1566. package/dist/wxr-taxonomies-DM5J9AsT.d.mts +0 -34
  1567. package/dist/wxr-taxonomies-DM5J9AsT.d.mts.map +0 -1
  1568. package/dist/zod-generator-BQilAboC.mjs +0 -424
  1569. package/dist/zod-generator-BQilAboC.mjs.map +0 -1
  1570. /package/dist/{api-tokens-BLz2MtQs.mjs → api-tokens-CdP49zVF.mjs} +0 -0
  1571. /package/dist/{ssrf-tA45vIPX.mjs → ssrf-DM0E-D_8.mjs} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["nodeMkdir","nodeWriteFile","nodeRename","nodeUnlink"],"sources":["../../src/astro/storage/adapters.ts","../../src/astro/object-cache/adapters.ts","../../src/migrations/manifest-writer.ts","../../src/astro/integration/dev-typegen.ts","../../src/astro/integration/font-provider.ts","../../src/astro/integration/route-naming.ts","../../src/astro/integration/routes.ts","../../src/astro/integration/vite-config.ts","../../src/astro/integration/runtime.ts","../../src/astro/integration/index.ts"],"sourcesContent":["/**\n * Storage Adapter Functions\n *\n * These run at config time (astro.config.mjs) and return serializable descriptors.\n * The actual storage is created at runtime by loading the entrypoint.\n *\n * @example\n * ```ts\n * // astro.config.mjs\n * import emdash, { s3, local } from \"emdash/astro\";\n *\n * export default defineConfig({\n * integrations: [\n * emdash({\n * storage: s3({\n * endpoint: \"https://xxx.r2.cloudflarestorage.com\",\n * bucket: \"media\",\n * accessKeyId: process.env.R2_ACCESS_KEY_ID!,\n * secretAccessKey: process.env.R2_SECRET_ACCESS_KEY!,\n * }),\n * // or: storage: local({ directory: \"./uploads\", baseUrl: \"/_emdash/api/media/file\" }),\n * }),\n * ],\n * });\n * ```\n *\n * For Cloudflare R2 bindings, use `r2()` from `@emdash-cms/cloudflare`.\n */\n\nimport type { StorageDescriptor, S3StorageConfig, LocalStorageConfig } from \"./types.js\";\n\n/**\n * S3-compatible storage adapter\n *\n * Works with AWS S3, Cloudflare R2 (via S3 API), MinIO, etc.\n *\n * Any field omitted here is resolved from the matching `S3_*` environment\n * variable when the container starts (`S3_ENDPOINT`, `S3_BUCKET`,\n * `S3_ACCESS_KEY_ID`, `S3_SECRET_ACCESS_KEY`, `S3_REGION`, `S3_PUBLIC_URL`).\n * Explicit values always take precedence over env vars.\n *\n * Note: env var resolution reads `process.env` on Node at runtime.\n * Workers users should continue passing explicit values to `s3({...})`.\n *\n * @example\n * ```ts\n * // All fields from env (container deployments)\n * storage: s3()\n *\n * // Mix: CDN from config, credentials from env\n * storage: s3({ publicUrl: \"https://cdn.example.com\" })\n *\n * // All explicit (unchanged from before)\n * storage: s3({\n * endpoint: \"https://xxx.r2.cloudflarestorage.com\",\n * bucket: \"media\",\n * accessKeyId: process.env.R2_ACCESS_KEY_ID,\n * secretAccessKey: process.env.R2_SECRET_ACCESS_KEY,\n * })\n * ```\n */\nexport function s3(config: Partial<S3StorageConfig> = {}): StorageDescriptor {\n\treturn {\n\t\tentrypoint: \"emdash/storage/s3\",\n\t\tconfig,\n\t};\n}\n\n/**\n * Local filesystem storage adapter\n *\n * For development and testing. Stores files in a local directory.\n * Does NOT support signed upload URLs.\n *\n * @example\n * ```ts\n * storage: local({\n * directory: \"./uploads\",\n * baseUrl: \"/_emdash/api/media/file\",\n * })\n * ```\n */\nexport function local(config: LocalStorageConfig): StorageDescriptor {\n\treturn {\n\t\tentrypoint: \"emdash/storage/local\",\n\t\tconfig,\n\t};\n}\n","/**\n * Object-cache adapter functions (config time).\n *\n * These run in `astro.config.mjs` and return serializable\n * {@link ObjectCacheDescriptor}s. The backend is instantiated at runtime by\n * loading the descriptor's `entrypoint`.\n *\n * For Cloudflare KV, use `kvCache()` from `@emdash-cms/cloudflare`.\n *\n * @example\n * ```ts\n * // astro.config.mjs (Node / local)\n * import emdash, { memoryCache } from \"emdash/astro\";\n *\n * export default defineConfig({\n * integrations: [emdash({ objectCache: memoryCache() })],\n * });\n * ```\n */\n\nimport type { ObjectCacheDescriptor, ObjectCacheRuntimeConfig } from \"../../object-cache/types.js\";\n\n/** Options for {@link memoryCache}. */\nexport interface MemoryCacheOptions extends ObjectCacheRuntimeConfig {\n\t/**\n\t * Soft cap on the number of cached keys per isolate before FIFO eviction.\n\t * @default 1000\n\t */\n\tmaxEntries?: number;\n}\n\n/**\n * In-isolate memory object cache.\n *\n * Caches query results across requests within a single isolate/process. On\n * Node (one long-lived process) this is a genuine cross-request cache; on\n * multi-isolate platforms (Cloudflare) prefer `kvCache()` so the cache is\n * shared. Useful for local development regardless of target.\n *\n * @example\n * ```ts\n * emdash({ objectCache: memoryCache({ defaultTtl: 600 }) })\n * ```\n */\nexport function memoryCache(options: MemoryCacheOptions = {}): ObjectCacheDescriptor {\n\treturn {\n\t\tentrypoint: \"emdash/internal/object-cache/memory\",\n\t\tconfig: { ...options },\n\t};\n}\n","import { randomUUID } from \"node:crypto\";\nimport {\n\tmkdir as nodeMkdir,\n\trename as nodeRename,\n\tunlink as nodeUnlink,\n\twriteFile as nodeWriteFile,\n} from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nimport type { MigrationManifestV1 } from \"./manifest.js\";\nimport { serializeMigrationManifest, validateMigrationManifest } from \"./manifest.js\";\n\nexport const MIGRATION_MANIFEST_PATH = \".emdash/migrations.json\";\n\nexport interface ManifestWriterFileSystem {\n\tmkdir(path: string, options: { recursive: true }): Promise<unknown>;\n\twriteFile(\n\t\tpath: string,\n\t\tdata: string,\n\t\toptions: { encoding: \"utf8\"; flag: \"wx\" },\n\t): Promise<unknown>;\n\trename(from: string, to: string): Promise<unknown>;\n\tunlink(path: string): Promise<unknown>;\n}\n\nconst nodeFileSystem: ManifestWriterFileSystem = {\n\tmkdir: (path, options) => nodeMkdir(path, options),\n\twriteFile: (path, data, options) => nodeWriteFile(path, data, options),\n\trename: (from, to) => nodeRename(from, to),\n\tunlink: (path) => nodeUnlink(path),\n};\n\nexport async function writeMigrationManifest(\n\tprojectRoot: string,\n\tmanifest: MigrationManifestV1,\n\tfileSystem: ManifestWriterFileSystem = nodeFileSystem,\n): Promise<string> {\n\tconst validated = await validateMigrationManifest(manifest);\n\tconst outputPath = join(projectRoot, MIGRATION_MANIFEST_PATH);\n\tconst outputDirectory = dirname(outputPath);\n\tawait fileSystem.mkdir(outputDirectory, { recursive: true });\n\n\tconst temporaryPath = join(\n\t\toutputDirectory,\n\t\t`.migrations.json.${process.pid}.${randomUUID()}.tmp`,\n\t);\n\tlet temporaryFileMayExist = false;\n\ttry {\n\t\ttemporaryFileMayExist = true;\n\t\tawait fileSystem.writeFile(temporaryPath, serializeMigrationManifest(validated), {\n\t\t\tencoding: \"utf8\",\n\t\t\tflag: \"wx\",\n\t\t});\n\t\tawait fileSystem.rename(temporaryPath, outputPath);\n\t\ttemporaryFileMayExist = false;\n\t\treturn outputPath;\n\t} catch (error) {\n\t\tif (temporaryFileMayExist) {\n\t\t\tawait fileSystem.unlink(temporaryPath).catch(() => undefined);\n\t\t}\n\t\tthrow error;\n\t}\n}\n","import type { AstroIntegrationLogger } from \"astro\";\n\nimport { DEV_TYPEGEN_REFRESH_EVENT, DEV_TYPEGEN_REFRESH_GLOBAL } from \"../dev-typegen.js\";\n\ninterface DevServerEnvironments {\n\tenvironments: Record<\n\t\tstring,\n\t\t{\n\t\t\tconfig: { consumer: string };\n\t\t\thot: { on(event: string, listener: () => void): void };\n\t\t}\n\t>;\n}\n\n/**\n * Call `refresh` whenever server-side code in any Vite environment reports a\n * schema change. Schema mutations can run in a separate realm from the\n * integration (workerd under the Cloudflare adapter), so the signal travels\n * over each environment's hot channel. The global covers same-realm SSR when\n * HMR is disabled and modules have no hot channel.\n */\nexport function listenForDevTypegenRefresh(\n\tserver: DevServerEnvironments,\n\trefresh: () => void,\n): void {\n\tfor (const environment of Object.values(server.environments)) {\n\t\tif (environment.config.consumer !== \"server\") continue;\n\t\tenvironment.hot.on(DEV_TYPEGEN_REFRESH_EVENT, () => refresh());\n\t}\n\tReflect.set(globalThis, DEV_TYPEGEN_REFRESH_GLOBAL, refresh);\n}\n\n/**\n * Create a debounced refresh function that fetches the generated types from\n * the dev server and writes them to `emdash-env.d.ts` in the project root.\n *\n * This runs in the Astro integration (Node), never in production builds or\n * in workerd SSR isolates.\n */\nexport function createDebouncedTypegenRefresh(\n\tport: number,\n\tlogger: AstroIntegrationLogger,\n): () => void {\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet inFlight: Promise<unknown> | undefined;\n\n\tfunction refresh(): void {\n\t\tif (timer) clearTimeout(timer);\n\t\ttimer = setTimeout(() => {\n\t\t\ttimer = undefined;\n\t\t\tif (inFlight) return;\n\t\t\tinFlight = writeDevTypes(port, logger).finally(() => {\n\t\t\t\tinFlight = undefined;\n\t\t\t});\n\t\t}, 200);\n\t}\n\n\treturn refresh;\n}\n\nasync function writeDevTypes(port: number, logger: AstroIntegrationLogger): Promise<void> {\n\tconst typegenUrl = `http://localhost:${port}/_emdash/api/typegen`;\n\n\ttry {\n\t\tconst { writeFile, readFile } = await import(\"node:fs/promises\");\n\t\tconst { resolve } = await import(\"node:path\");\n\t\tconst outputPath = resolve(process.cwd(), \"emdash-env.d.ts\");\n\n\t\tconst response = await fetch(typegenUrl, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst body = await response.text().catch(() => \"\");\n\t\t\tlogger.warn(`Typegen failed: ${response.status} ${body.slice(0, 200)}`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst json = await response.json();\n\t\tif (typeof json !== \"object\" || json === null || !(\"data\" in json)) {\n\t\t\tlogger.warn(\"Typegen returned an unexpected response shape\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst result = json.data;\n\t\tif (\n\t\t\ttypeof result !== \"object\" ||\n\t\t\tresult === null ||\n\t\t\t!(\"types\" in result) ||\n\t\t\t!(\"collections\" in result)\n\t\t) {\n\t\t\tlogger.warn(\"Typegen returned an unexpected response shape\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst types = result.types;\n\t\tconst collections = result.collections;\n\t\tif (typeof types !== \"string\" || typeof collections !== \"number\") {\n\t\t\tlogger.warn(\"Typegen returned an unexpected response shape\");\n\t\t\treturn;\n\t\t}\n\n\t\tlet needsWrite = true;\n\t\ttry {\n\t\t\tconst existing = await readFile(outputPath, \"utf-8\");\n\t\t\tif (existing === types) needsWrite = false;\n\t\t} catch {\n\t\t\t// File doesn't exist yet\n\t\t}\n\n\t\tif (needsWrite) {\n\t\t\tawait writeFile(outputPath, types, \"utf-8\");\n\t\t\tlogger.info(`Generated emdash-env.d.ts (${collections} collections)`);\n\t\t}\n\t} catch (error) {\n\t\tconst msg = error instanceof Error ? error.message : String(error);\n\t\tlogger.warn(`Typegen failed: ${msg}`);\n\t}\n}\n","/**\n * EmDash Noto Sans font provider\n *\n * A custom Astro font provider that wraps Google Fonts to resolve\n * multiple Noto Sans families (Latin, Arabic, JP, etc.) under a\n * single logical font entry. This lets all @font-face blocks share\n * the same font-family name, so the browser picks the right file\n * per character via unicode-range.\n *\n * Without this, registering \"Noto Sans\" and \"Noto Sans Arabic\" as\n * separate font entries on the same cssVariable triggers an Astro\n * warning and the last entry overwrites the first.\n */\n\nimport { fontProviders } from \"astro/config\";\n\n/**\n * All subset names used by Google Fonts CSS responses.\n * Passed when resolving extra script families so the unifont\n * provider doesn't filter out any faces.\n */\nconst ALL_GOOGLE_SUBSETS = [\n\t\"arabic\",\n\t\"armenian\",\n\t\"bengali\",\n\t\"chinese-simplified\",\n\t\"chinese-traditional\",\n\t\"chinese-hongkong\",\n\t\"cyrillic\",\n\t\"cyrillic-ext\",\n\t\"devanagari\",\n\t\"ethiopic\",\n\t\"farsi\",\n\t\"georgian\",\n\t\"greek\",\n\t\"greek-ext\",\n\t\"gujarati\",\n\t\"gurmukhi\",\n\t\"hebrew\",\n\t\"japanese\",\n\t\"kannada\",\n\t\"khmer\",\n\t\"korean\",\n\t\"lao\",\n\t\"latin\",\n\t\"latin-ext\",\n\t\"malayalam\",\n\t\"math\",\n\t\"myanmar\",\n\t\"oriya\",\n\t\"sinhala\",\n\t\"symbols\",\n\t\"tamil\",\n\t\"telugu\",\n\t\"thai\",\n\t\"tibetan\",\n\t\"vietnamese\",\n];\n\n/**\n * Known Noto Sans and Sans script families on Google Fonts.\n * Maps user-friendly script names to Google Fonts family names.\n */\nconst NOTO_SCRIPT_FAMILIES: Record<string, string> = {\n\tarabic: \"Noto Sans Arabic\",\n\tarmenian: \"Noto Sans Armenian\",\n\tbengali: \"Noto Sans Bengali\",\n\t\"chinese-simplified\": \"Noto Sans SC\",\n\t\"chinese-traditional\": \"Noto Sans TC\",\n\t\"chinese-hongkong\": \"Noto Sans HK\",\n\tdevanagari: \"Noto Sans Devanagari\",\n\tethiopic: \"Noto Sans Ethiopic\",\n\tfarsi: \"Vazirmatn\",\n\tgeorgian: \"Noto Sans Georgian\",\n\tgujarati: \"Noto Sans Gujarati\",\n\tgurmukhi: \"Noto Sans Gurmukhi\",\n\thebrew: \"Noto Sans Hebrew\",\n\tjapanese: \"Noto Sans JP\",\n\tkannada: \"Noto Sans Kannada\",\n\tkhmer: \"Noto Sans Khmer\",\n\tkorean: \"Noto Sans KR\",\n\tlao: \"Noto Sans Lao\",\n\tmalayalam: \"Noto Sans Malayalam\",\n\tmyanmar: \"Noto Sans Myanmar\",\n\toriya: \"Noto Sans Oriya\",\n\tsinhala: \"Noto Sans Sinhala\",\n\ttamil: \"Noto Sans Tamil\",\n\ttelugu: \"Noto Sans Telugu\",\n\tthai: \"Noto Sans Thai\",\n\ttibetan: \"Noto Sans Tibetan\",\n};\n\nexport interface NotoSansProviderOptions {\n\t/**\n\t * Additional Noto Sans script families to include.\n\t * Use script names like \"arabic\", \"japanese\", \"chinese-simplified\".\n\t *\n\t * @see {@link NOTO_SCRIPT_FAMILIES} for the full list of supported scripts.\n\t */\n\tscripts?: string[];\n}\n\n// Use ReturnType to get the provider type without importing it directly.\n// The Astro FontProvider type is not part of the public API surface.\ntype GoogleProvider = ReturnType<typeof fontProviders.google>;\n\n/**\n * Create a font provider that resolves Noto Sans plus additional\n * script-specific Noto families from Google Fonts, all under one\n * font-family name.\n */\nexport function notoSans(options?: NotoSansProviderOptions): GoogleProvider {\n\t// Create a single Google provider instance to share initialization\n\tconst googleProvider = fontProviders.google();\n\n\treturn {\n\t\tname: \"emdash-noto\",\n\t\tasync init(context) {\n\t\t\tawait googleProvider.init?.(context);\n\t\t},\n\t\tasync resolveFont(resolveFontOptions) {\n\t\t\t// Resolve the base Noto Sans (Latin, Cyrillic, Greek, etc.)\n\t\t\tconst base = await googleProvider.resolveFont(resolveFontOptions);\n\t\t\tconst baseFonts = base?.fonts ?? [];\n\n\t\t\tif (!options?.scripts?.length) {\n\t\t\t\treturn base;\n\t\t\t}\n\n\t\t\t// Collect subset names already covered by the base font so we\n\t\t\t// can filter out duplicate faces from extra script families.\n\t\t\t// e.g. Noto Sans Arabic includes latin/latin-ext faces that\n\t\t\t// would otherwise override the base Noto Sans latin faces.\n\t\t\tconst baseSubsets = new Set(baseFonts.map((f) => f.meta?.subset).filter(Boolean));\n\n\t\t\t// Resolve additional script families\n\t\t\tconst extraFonts = await Promise.all(\n\t\t\t\toptions.scripts.map(async (script) => {\n\t\t\t\t\tconst family = NOTO_SCRIPT_FAMILIES[script];\n\t\t\t\t\tif (!family) {\n\t\t\t\t\t\t// Silently skip subset names that are already covered\n\t\t\t\t\t\t// by the base Noto Sans font (latin, cyrillic, etc.)\n\t\t\t\t\t\tif (ALL_GOOGLE_SUBSETS.includes(script)) {\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t`[emdash] Unknown Noto Sans script \"${script}\". ` +\n\t\t\t\t\t\t\t\t`Available: ${Object.keys(NOTO_SCRIPT_FAMILIES).join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\treturn googleProvider.resolveFont({\n\t\t\t\t\t\t...resolveFontOptions,\n\t\t\t\t\t\tfamilyName: family,\n\t\t\t\t\t\t// Pass all known subset names so the unifont provider\n\t\t\t\t\t\t// doesn't filter out any faces. Each script family\n\t\t\t\t\t\t// only returns faces for its own subsets anyway.\n\t\t\t\t\t\tsubsets: ALL_GOOGLE_SUBSETS,\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\t// Merge, dropping faces from extra fonts that duplicate base subsets\n\t\t\tconst extraFaces = extraFonts.flatMap((r) =>\n\t\t\t\t(r?.fonts ?? []).filter((f) => !f.meta?.subset || !baseSubsets.has(f.meta.subset)),\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tfonts: [...baseFonts, ...extraFaces],\n\t\t\t};\n\t\t},\n\t};\n}\n\n/** Get the list of available Noto Sans script names */\nexport function getAvailableNotoScripts(): string[] {\n\treturn Object.keys(NOTO_SCRIPT_FAMILIES);\n}\n","/**\n * Compiled route artifact naming -- single source of truth.\n *\n * rolldown reserves `[name]`, `[hash]`, `[ext]` (and more) as output-filename\n * placeholders, so compiled route files cannot keep Astro's literal\n * `[param]` dynamic-segment filenames -- a path containing `[name]` would be\n * substituted by the bundler. This function defines the safe artifact form.\n *\n * It is imported by BOTH the build (`tsdown.config.ts` `entryFileNames`) and\n * the route injector (`resolveRoute`, which resolves `emdash/internal/routes/*`).\n * They must stay in lockstep: change the scheme here and both follow.\n *\n * `[` and `]` -> `_` (e.g. `[collection]` -> `_collection_`,\n * `[...path]` -> `_...path_`). The Astro route URL pattern is set explicitly\n * at injection time, so the artifact filename never affects routing.\n */\nexport function routeArtifactName(srcRelativePathNoExt: string): string {\n\treturn srcRelativePathNoExt.replaceAll(\"[\", \"_\").replaceAll(\"]\", \"_\");\n}\n","/**\n * Route Injection\n *\n * Defines and injects all EmDash routes into the Astro application.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { routeArtifactName } from \"./route-naming.js\";\n\nconst TS_EXT = /\\.tsx?$/;\n\n/**\n * Resolve path to a route file in the package\n * Uses Node.js APIs - only call at build time\n */\nfunction resolveRoute(route: string): string {\n\t// Lazy initialization to avoid running Node.js code at import time\n\t// This prevents issues when the module is bundled for Cloudflare Workers\n\tconst require = createRequire(import.meta.url);\n\tconst __dirname = dirname(fileURLToPath(import.meta.url));\n\n\t// .astro routes ship as source (the consumer's Astro build processes them);\n\t// .ts/.tsx routes are compiled, exported extensionless via emdash/internal/routes/*.\n\tconst isAstro = route.endsWith(\".astro\");\n\tconst specifier = isAstro ? route : routeArtifactName(route.replace(TS_EXT, \"\"));\n\n\ttry {\n\t\t// Try to resolve as package export\n\t\treturn require.resolve(`emdash/internal/routes/${specifier}`);\n\t} catch {\n\t\t// Fallback for development (e.g. dist not yet built).\n\t\treturn isAstro\n\t\t\t? resolve(__dirname, \"../routes\", route)\n\t\t\t: resolve(__dirname, \"../routes\", `${specifier}.mjs`);\n\t}\n}\n\n/** Route injection function type */\ntype InjectRoute = (route: { pattern: string; entrypoint: string }) => void;\n\ninterface InjectCoreRoutesOptions {\n\tsrcDir?: URL;\n}\n\nconst ROUTE_OVERRIDE_EXTENSIONS = [\n\t\".astro\",\n\t\".js\",\n\t\".ts\",\n\t\".jsx\",\n\t\".tsx\",\n\t\".mjs\",\n\t\".mts\",\n\t\".md\",\n\t\".mdx\",\n\t\".html\",\n];\n\n/**\n * Detect whether the host site defines its own root-level public route file.\n */\nexport function hasUserDefinedPublicRoute(srcDir: URL, basename: string): boolean {\n\tconst srcDirPath = fileURLToPath(srcDir);\n\treturn ROUTE_OVERRIDE_EXTENSIONS.some(\n\t\t(extension) =>\n\t\t\texistsSync(resolve(srcDirPath, \"pages\", `${basename}${extension}`)) ||\n\t\t\texistsSync(resolve(srcDirPath, \"pages\", basename, `index${extension}`)),\n\t);\n}\n\n/**\n * Injects all core EmDash routes.\n */\nexport function injectCoreRoutes(\n\tinjectRoute: InjectRoute,\n\toptions: InjectCoreRoutesOptions = {},\n): void {\n\t// Inject admin shell route\n\tinjectRoute({\n\t\tpattern: \"/_emdash/admin/[...path]\",\n\t\tentrypoint: resolveRoute(\"admin.astro\"),\n\t});\n\n\t// Inject API routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/manifest\",\n\t\tentrypoint: resolveRoute(\"api/manifest.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/health\",\n\t\tentrypoint: resolveRoute(\"api/health.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/openapi.json\",\n\t\tentrypoint: resolveRoute(\"api/openapi.json.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/visual-editing/action-token\",\n\t\tentrypoint: resolveRoute(\"api/visual-editing/action-token.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/visual-editing/toolbar-labels\",\n\t\tentrypoint: resolveRoute(\"api/visual-editing/toolbar-labels.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/visual-editing/content/[collection]/[id]/publish\",\n\t\tentrypoint: resolveRoute(\"api/visual-editing/content/[collection]/[id]/publish.ts\"),\n\t});\n\n\t// Auth mode endpoint (public — used by the login page to pick the right UI)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/mode\",\n\t\tentrypoint: resolveRoute(\"api/auth/mode.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/dashboard\",\n\t\tentrypoint: resolveRoute(\"api/dashboard.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/calendar\",\n\t\tentrypoint: resolveRoute(\"api/calendar.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/scheduled-policy-rejections/[collection]/[id]\",\n\t\tentrypoint: resolveRoute(\"api/admin/scheduled-policy-rejections/[collection]/[id].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern:\n\t\t\t\"/_emdash/api/content/[collection]/[id]/plugin-extensions/[pluginId]/[kind]/[extensionId]\",\n\t\tentrypoint: resolveRoute(\n\t\t\t\"api/content/[collection]/[id]/plugin-extensions/[pluginId]/[kind]/[extensionId].ts\",\n\t\t),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/revisions\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/revisions.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/preview-url\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/preview-url.ts\"),\n\t});\n\n\t// Content authors (for the admin author filter)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/authors\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/authors.ts\"),\n\t});\n\n\t// Trash/restore routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/trash\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/trash.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/restore\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/restore.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/permanent\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/permanent.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/duplicate\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/duplicate.ts\"),\n\t});\n\n\t// Publishing routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/publish\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/publish.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/unpublish\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/unpublish.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/discard-draft\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/discard-draft.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/compare\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/compare.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/lock\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/lock.ts\"),\n\t});\n\n\t// i18n translation routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/translations\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/translations.ts\"),\n\t});\n\n\t// Scheduled publishing routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/schedule\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/schedule.ts\"),\n\t});\n\n\t// Reference field edge routes (children = parent side, parents = backlinks)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/references/[relation]/children\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/references/[relation]/children.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/references/[relation]/parents\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/references/[relation]/parents.ts\"),\n\t});\n\n\t// Revision management routes (for restore, etc.)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/revisions/[revisionId]\",\n\t\tentrypoint: resolveRoute(\"api/revisions/[revisionId]/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/revisions/[revisionId]/restore\",\n\t\tentrypoint: resolveRoute(\"api/revisions/[revisionId]/restore.ts\"),\n\t});\n\n\t// Media API routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media\",\n\t\tentrypoint: resolveRoute(\"api/media.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/upload-url\",\n\t\tentrypoint: resolveRoute(\"api/media/upload-url.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/file/[...key]\",\n\t\tentrypoint: resolveRoute(\"api/media/file/[...key].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/asset/[id]/[filename]\",\n\t\tentrypoint: resolveRoute(\"api/media/asset/[id]/[filename].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/folders\",\n\t\tentrypoint: resolveRoute(\"api/media/folders/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/folders/[id]\",\n\t\tentrypoint: resolveRoute(\"api/media/folders/[id].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/[id]\",\n\t\tentrypoint: resolveRoute(\"api/media/[id].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/[id]/usage\",\n\t\tentrypoint: resolveRoute(\"api/media/[id]/usage.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/[id]/confirm\",\n\t\tentrypoint: resolveRoute(\"api/media/[id]/confirm.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/[id]/upload\",\n\t\tentrypoint: resolveRoute(\"api/media/[id]/upload.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/[id]/replace\",\n\t\tentrypoint: resolveRoute(\"api/media/[id]/replace.ts\"),\n\t});\n\n\t// Media provider routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/providers\",\n\t\tentrypoint: resolveRoute(\"api/media/providers/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/providers/[providerId]\",\n\t\tentrypoint: resolveRoute(\"api/media/providers/[providerId]/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/providers/[providerId]/[itemId]\",\n\t\tentrypoint: resolveRoute(\"api/media/providers/[providerId]/[itemId].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/media-usage/repair\",\n\t\tentrypoint: resolveRoute(\"api/admin/media-usage/repair.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/media-usage/work\",\n\t\tentrypoint: resolveRoute(\"api/admin/media-usage/work/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/media-usage/work/retry\",\n\t\tentrypoint: resolveRoute(\"api/admin/media-usage/work/retry.ts\"),\n\t});\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/media-usage/activation\",\n\t\tentrypoint: resolveRoute(\"api/admin/media-usage/activation.ts\"),\n\t});\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/media-usage/progress\",\n\t\tentrypoint: resolveRoute(\"api/admin/media-usage/progress.ts\"),\n\t});\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/media-usage/collection-deletions\",\n\t\tentrypoint: resolveRoute(\"api/admin/media-usage/collection-deletions/index.ts\"),\n\t});\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/media-usage/collection-deletions/retry\",\n\t\tentrypoint: resolveRoute(\"api/admin/media-usage/collection-deletions/retry.ts\"),\n\t});\n\n\t// Import API routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/import/probe\",\n\t\tentrypoint: resolveRoute(\"api/import/probe.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/import/wordpress/analyze\",\n\t\tentrypoint: resolveRoute(\"api/import/wordpress/analyze.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/import/wordpress/prepare\",\n\t\tentrypoint: resolveRoute(\"api/import/wordpress/prepare.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/import/wordpress/execute\",\n\t\tentrypoint: resolveRoute(\"api/import/wordpress/execute.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/import/wordpress/media\",\n\t\tentrypoint: resolveRoute(\"api/import/wordpress/media.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/import/wordpress/rewrite-urls\",\n\t\tentrypoint: resolveRoute(\"api/import/wordpress/rewrite-urls.ts\"),\n\t});\n\n\t// WordPress Plugin (EmDash Exporter) direct import routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/import/wordpress-plugin/analyze\",\n\t\tentrypoint: resolveRoute(\"api/import/wordpress-plugin/analyze.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/import/wordpress-plugin/execute\",\n\t\tentrypoint: resolveRoute(\"api/import/wordpress-plugin/execute.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/import/wordpress-plugin/callback\",\n\t\tentrypoint: resolveRoute(\"api/import/wordpress-plugin/callback.ts\"),\n\t});\n\n\t// Schema API routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema\",\n\t\tentrypoint: resolveRoute(\"api/schema/index.ts\"),\n\t});\n\n\t// Typegen endpoint (dev-only)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/typegen\",\n\t\tentrypoint: resolveRoute(\"api/typegen.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema/collections\",\n\t\tentrypoint: resolveRoute(\"api/schema/collections/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema/block-types\",\n\t\tentrypoint: resolveRoute(\"api/schema/block-types/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema/block-types/[slug]/versions/[version]/activate\",\n\t\tentrypoint: resolveRoute(\"api/schema/block-types/[slug]/versions/[version]/activate.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema/block-types/[slug]\",\n\t\tentrypoint: resolveRoute(\"api/schema/block-types/[slug]/index.ts\"),\n\t});\n\n\t// Order matters: the static `reorder` route must precede the dynamic\n\t// `[slug]` route so Astro's resolver dispatches POST\n\t// /schema/collections/reorder to the reorder handler instead of treating\n\t// \"reorder\" as a collection slug.\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema/collections/reorder\",\n\t\tentrypoint: resolveRoute(\"api/schema/collections/reorder.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema/collections/[slug]\",\n\t\tentrypoint: resolveRoute(\"api/schema/collections/[slug]/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema/collections/[slug]/fields\",\n\t\tentrypoint: resolveRoute(\"api/schema/collections/[slug]/fields/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema/collections/[slug]/fields/reorder\",\n\t\tentrypoint: resolveRoute(\"api/schema/collections/[slug]/fields/reorder.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema/collections/[slug]/fields/[fieldSlug]\",\n\t\tentrypoint: resolveRoute(\"api/schema/collections/[slug]/fields/[fieldSlug].ts\"),\n\t});\n\n\t// Orphaned tables discovery\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema/orphans\",\n\t\tentrypoint: resolveRoute(\"api/schema/orphans/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema/orphans/[slug]\",\n\t\tentrypoint: resolveRoute(\"api/schema/orphans/[slug].ts\"),\n\t});\n\n\t// Site settings route\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/settings\",\n\t\tentrypoint: resolveRoute(\"api/settings.ts\"),\n\t});\n\n\t// Email settings route\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/settings/email\",\n\t\tentrypoint: resolveRoute(\"api/settings/email.ts\"),\n\t});\n\n\t// Backup routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/settings/backups\",\n\t\tentrypoint: resolveRoute(\"api/settings/backups/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/settings/backups/export\",\n\t\tentrypoint: resolveRoute(\"api/settings/backups/export.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/settings/backups/archives\",\n\t\tentrypoint: resolveRoute(\"api/settings/backups/archives/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/settings/backups/archives/[name]\",\n\t\tentrypoint: resolveRoute(\"api/settings/backups/archives/[name].ts\"),\n\t});\n\n\t// Site transfer routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/transfer/[...path]\",\n\t\tentrypoint: resolveRoute(\"api/admin/transfer/[...path].ts\"),\n\t});\n\n\t// Snapshot route (for DO preview database population)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/snapshot\",\n\t\tentrypoint: resolveRoute(\"api/snapshot.ts\"),\n\t});\n\n\t// Taxonomy API routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/taxonomies\",\n\t\tentrypoint: resolveRoute(\"api/taxonomies/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/taxonomies/bulk-tag\",\n\t\tentrypoint: resolveRoute(\"api/taxonomies/bulk-tag.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/taxonomies/[name]\",\n\t\tentrypoint: resolveRoute(\"api/taxonomies/[name].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/taxonomies/[name]/translations\",\n\t\tentrypoint: resolveRoute(\"api/taxonomies/[name]/translations.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/taxonomies/[name]/reorder\",\n\t\tentrypoint: resolveRoute(\"api/taxonomies/[name]/reorder.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/taxonomies/[name]/terms\",\n\t\tentrypoint: resolveRoute(\"api/taxonomies/[name]/terms/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/taxonomies/[name]/terms/[slug]\",\n\t\tentrypoint: resolveRoute(\"api/taxonomies/[name]/terms/[slug].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/taxonomies/[name]/terms/[slug]/translations\",\n\t\tentrypoint: resolveRoute(\"api/taxonomies/[name]/terms/[slug]/translations.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/terms/[taxonomy]\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/terms/[taxonomy].ts\"),\n\t});\n\n\t// Relation definition routes (reference field relations)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/relations\",\n\t\tentrypoint: resolveRoute(\"api/relations/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/relations/[id]\",\n\t\tentrypoint: resolveRoute(\"api/relations/[id]/index.ts\"),\n\t});\n\n\t// Plugin management routes (under /admin to avoid conflict with plugin API routes)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/[id]\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/[id]/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/[id]/enable\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/[id]/enable.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/[id]/disable\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/[id]/disable.ts\"),\n\t});\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/[id]/mcp\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/[id]/mcp.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/[id]/settings\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/[id]/settings.ts\"),\n\t});\n\n\t// Marketplace plugin routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/marketplace\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/marketplace/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/marketplace/[id]\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/marketplace/[id]/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/marketplace/[id]/icon\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/marketplace/[id]/icon.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/marketplace/[id]/install\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/marketplace/[id]/install.ts\"),\n\t});\n\n\t// Experimental registry routes (see RFC 0001)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/registry/install\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/registry/install.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/registry/verify\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/registry/verify.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/registry/artifact\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/registry/artifact.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/registry/publisher-handle\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/registry/publisher-handle.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/registry/[id]/update\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/registry/[id]/update.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/registry/[id]/uninstall\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/registry/[id]/uninstall.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/[id]/update\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/[id]/update.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/[id]/uninstall\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/[id]/uninstall.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/updates\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/updates.ts\"),\n\t});\n\n\t// Core update notice\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/core-update\",\n\t\tentrypoint: resolveRoute(\"api/admin/core-update.ts\"),\n\t});\n\n\t// Exclusive hooks admin routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/hooks/exclusive\",\n\t\tentrypoint: resolveRoute(\"api/admin/hooks/exclusive/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/hooks/exclusive/[hookName]\",\n\t\tentrypoint: resolveRoute(\"api/admin/hooks/exclusive/[hookName].ts\"),\n\t});\n\n\t// Theme marketplace routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/themes/marketplace\",\n\t\tentrypoint: resolveRoute(\"api/admin/themes/marketplace/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/themes/marketplace/[id]\",\n\t\tentrypoint: resolveRoute(\"api/admin/themes/marketplace/[id]/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/themes/marketplace/[id]/thumbnail\",\n\t\tentrypoint: resolveRoute(\"api/admin/themes/marketplace/[id]/thumbnail.ts\"),\n\t});\n\n\t// Theme preview signing (local, not proxied)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/themes/preview\",\n\t\tentrypoint: resolveRoute(\"api/themes/preview.ts\"),\n\t});\n\n\t// User management routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/users\",\n\t\tentrypoint: resolveRoute(\"api/admin/users/index.ts\"),\n\t});\n\n\t// Bylines routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/bylines\",\n\t\tentrypoint: resolveRoute(\"api/admin/bylines/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/bylines/[id]\",\n\t\tentrypoint: resolveRoute(\"api/admin/bylines/[id]/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/bylines/[id]/translations\",\n\t\tentrypoint: resolveRoute(\"api/admin/bylines/[id]/translations.ts\"),\n\t});\n\n\t// Byline custom-field schema routes (Discussion #1174, Phase 4).\n\t// Order matters: the static `reorder` route must precede the dynamic\n\t// `[slug]` route so Astro's resolver dispatches POST /byline-fields/reorder\n\t// to the reorder handler instead of treating \"reorder\" as a slug. The\n\t// `reorder` slug is also reserved at the data layer\n\t// (RESERVED_BYLINE_FIELD_SLUGS) so the registry rejects field creation\n\t// with that name — defence in depth.\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/byline-fields\",\n\t\tentrypoint: resolveRoute(\"api/admin/byline-fields/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/byline-fields/reorder\",\n\t\tentrypoint: resolveRoute(\"api/admin/byline-fields/reorder.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/byline-fields/[slug]\",\n\t\tentrypoint: resolveRoute(\"api/admin/byline-fields/[slug].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/byline-fields/[slug]/usage\",\n\t\tentrypoint: resolveRoute(\"api/admin/byline-fields/[slug]/usage.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/users/[id]\",\n\t\tentrypoint: resolveRoute(\"api/admin/users/[id]/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/users/[id]/disable\",\n\t\tentrypoint: resolveRoute(\"api/admin/users/[id]/disable.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/users/[id]/enable\",\n\t\tentrypoint: resolveRoute(\"api/admin/users/[id]/enable.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/users/[id]/send-recovery\",\n\t\tentrypoint: resolveRoute(\"api/admin/users/[id]/send-recovery.ts\"),\n\t});\n\n\t// API token admin routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/api-tokens\",\n\t\tentrypoint: resolveRoute(\"api/admin/api-tokens/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/api-tokens/[id]\",\n\t\tentrypoint: resolveRoute(\"api/admin/api-tokens/[id].ts\"),\n\t});\n\n\t// OAuth client admin routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/oauth-clients\",\n\t\tentrypoint: resolveRoute(\"api/admin/oauth-clients/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/oauth-clients/[id]\",\n\t\tentrypoint: resolveRoute(\"api/admin/oauth-clients/[id].ts\"),\n\t});\n\n\t// OAuth Device Flow routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/oauth/device/code\",\n\t\tentrypoint: resolveRoute(\"api/oauth/device/code.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/oauth/device/token\",\n\t\tentrypoint: resolveRoute(\"api/oauth/device/token.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/oauth/device/authorize\",\n\t\tentrypoint: resolveRoute(\"api/oauth/device/authorize.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/oauth/token/refresh\",\n\t\tentrypoint: resolveRoute(\"api/oauth/token/refresh.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/oauth/token/revoke\",\n\t\tentrypoint: resolveRoute(\"api/oauth/token/revoke.ts\"),\n\t});\n\n\t// Auth discovery endpoint\n\tinjectRoute({\n\t\tpattern: \"/_emdash/.well-known/auth\",\n\t\tentrypoint: resolveRoute(\"api/well-known/auth.ts\"),\n\t});\n\n\t// OAuth 2.1 Authorization Code flow routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/oauth/token\",\n\t\tentrypoint: resolveRoute(\"api/oauth/token.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/oauth/authorize\",\n\t\tentrypoint: resolveRoute(\"api/oauth/authorize.ts\"),\n\t});\n\n\t// OAuth discovery endpoints (RFC 9728, RFC 8414)\n\tinjectRoute({\n\t\tpattern: \"/.well-known/oauth-protected-resource\",\n\t\tentrypoint: resolveRoute(\"api/well-known/oauth-protected-resource.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/.well-known/oauth-authorization-server/_emdash\",\n\t\tentrypoint: resolveRoute(\"api/well-known/oauth-authorization-server.ts\"),\n\t});\n\n\t// RFC 7591 Dynamic Client Registration\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/oauth/register\",\n\t\tentrypoint: resolveRoute(\"api/oauth/register.ts\"),\n\t});\n\n\t// Plugin-defined API routes\n\t// All plugin routes are handled by a single catch-all handler\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/plugins/[pluginId]/[...path]\",\n\t\tentrypoint: resolveRoute(\"api/plugins/[pluginId]/[...path].ts\"),\n\t});\n\n\t// Menu API routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/menus\",\n\t\tentrypoint: resolveRoute(\"api/menus/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/menus/[name]\",\n\t\tentrypoint: resolveRoute(\"api/menus/[name].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/menus/[name]/items\",\n\t\tentrypoint: resolveRoute(\"api/menus/[name]/items.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/menus/[name]/items/[id]\",\n\t\tentrypoint: resolveRoute(\"api/menus/[name]/items/[id].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/menus/[name]/reorder\",\n\t\tentrypoint: resolveRoute(\"api/menus/[name]/reorder.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/menus/[name]/translations\",\n\t\tentrypoint: resolveRoute(\"api/menus/[name]/translations.ts\"),\n\t});\n\n\t// Widget area routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/widget-areas\",\n\t\tentrypoint: resolveRoute(\"api/widget-areas/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/widget-components\",\n\t\tentrypoint: resolveRoute(\"api/widget-components.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/widget-areas/[name]\",\n\t\tentrypoint: resolveRoute(\"api/widget-areas/[name].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/widget-areas/[name]/widgets\",\n\t\tentrypoint: resolveRoute(\"api/widget-areas/[name]/widgets.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/widget-areas/[name]/widgets/[id]\",\n\t\tentrypoint: resolveRoute(\"api/widget-areas/[name]/widgets/[id].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/widget-areas/[name]/reorder\",\n\t\tentrypoint: resolveRoute(\"api/widget-areas/[name]/reorder.ts\"),\n\t});\n\n\t// Section routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/sections\",\n\t\tentrypoint: resolveRoute(\"api/sections/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/sections/[slug]\",\n\t\tentrypoint: resolveRoute(\"api/sections/[slug].ts\"),\n\t});\n\n\t// Redirect routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/redirects\",\n\t\tentrypoint: resolveRoute(\"api/redirects/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/redirects/404s/summary\",\n\t\tentrypoint: resolveRoute(\"api/redirects/404s/summary.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/redirects/404s\",\n\t\tentrypoint: resolveRoute(\"api/redirects/404s/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/redirects/[id]\",\n\t\tentrypoint: resolveRoute(\"api/redirects/[id].ts\"),\n\t});\n\n\t// Search routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/search\",\n\t\tentrypoint: resolveRoute(\"api/search/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/search/suggest\",\n\t\tentrypoint: resolveRoute(\"api/search/suggest.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/search/stats\",\n\t\tentrypoint: resolveRoute(\"api/search/stats.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/search/rebuild\",\n\t\tentrypoint: resolveRoute(\"api/search/rebuild.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/search/enable\",\n\t\tentrypoint: resolveRoute(\"api/search/enable.ts\"),\n\t});\n\n\t// Comment routes (public)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/comments/[collection]/[contentId]\",\n\t\tentrypoint: resolveRoute(\"api/comments/[collection]/[contentId]/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/comments/[collection]/[contentId]/reactions\",\n\t\tentrypoint: resolveRoute(\"api/comments/[collection]/[contentId]/reactions.ts\"),\n\t});\n\n\t// Comment routes (admin)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/comments\",\n\t\tentrypoint: resolveRoute(\"api/admin/comments/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/comments/counts\",\n\t\tentrypoint: resolveRoute(\"api/admin/comments/counts.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/comments/bulk\",\n\t\tentrypoint: resolveRoute(\"api/admin/comments/bulk.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/comments/[id]/status\",\n\t\tentrypoint: resolveRoute(\"api/admin/comments/[id]/status.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/comments/[id]\",\n\t\tentrypoint: resolveRoute(\"api/admin/comments/[id].ts\"),\n\t});\n\n\t// SEO routes (public, at site root)\n\tif (!options.srcDir || !hasUserDefinedPublicRoute(options.srcDir, \"sitemap.xml\")) {\n\t\tinjectRoute({\n\t\t\tpattern: \"/sitemap.xml\",\n\t\t\tentrypoint: resolveRoute(\"sitemap.xml.ts\"),\n\t\t});\n\t}\n\n\tif (!options.srcDir || !hasUserDefinedPublicRoute(options.srcDir, \"sitemap-[collection].xml\")) {\n\t\tinjectRoute({\n\t\t\tpattern: \"/sitemap-[collection].xml\",\n\t\t\tentrypoint: resolveRoute(\"sitemap-[collection].xml.ts\"),\n\t\t});\n\t}\n\n\tif (!options.srcDir || !hasUserDefinedPublicRoute(options.srcDir, \"robots.txt\")) {\n\t\tinjectRoute({\n\t\t\tpattern: \"/robots.txt\",\n\t\t\tentrypoint: resolveRoute(\"robots.txt.ts\"),\n\t\t});\n\t}\n\n\t// Setup wizard API routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/setup/status\",\n\t\tentrypoint: resolveRoute(\"api/setup/status.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/setup\",\n\t\tentrypoint: resolveRoute(\"api/setup/index.ts\"),\n\t});\n\n\t// Auth API routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/setup/admin\",\n\t\tentrypoint: resolveRoute(\"api/setup/admin.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/setup/admin/verify\",\n\t\tentrypoint: resolveRoute(\"api/setup/admin-verify.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/setup/dev-bypass\",\n\t\tentrypoint: resolveRoute(\"api/setup/dev-bypass.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/setup/dev-reset\",\n\t\tentrypoint: resolveRoute(\"api/setup/dev-reset.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/dev/emails\",\n\t\tentrypoint: resolveRoute(\"api/dev/emails.ts\"),\n\t});\n\n\t// Current user endpoint (always available)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/me\",\n\t\tentrypoint: resolveRoute(\"api/auth/me.ts\"),\n\t});\n\n\t// Logout is always available (though behavior differs by auth mode)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/logout\",\n\t\tentrypoint: resolveRoute(\"api/auth/logout.ts\"),\n\t});\n}\n\n/**\n * Injects the MCP (Model Context Protocol) server route.\n * Only injected when `mcp: true` is set in the EmDash config.\n */\nexport function injectMcpRoute(injectRoute: InjectRoute): void {\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/mcp\",\n\t\tentrypoint: resolveRoute(\"api/mcp.ts\"),\n\t});\n}\n\n/**\n * Injects routes from pluggable auth providers.\n *\n * Each provider declares the routes it needs in its `AuthProviderDescriptor.routes` array.\n * Routes are injected at build time so Vite can bundle them.\n */\nexport function injectAuthProviderRoutes(\n\tinjectRoute: InjectRoute,\n\tproviders: Array<{ routes?: Array<{ pattern: string; entrypoint: string }> }>,\n): void {\n\tfor (const provider of providers) {\n\t\tif (provider.routes) {\n\t\t\tfor (const route of provider.routes) {\n\t\t\t\tinjectRoute({\n\t\t\t\t\tpattern: route.pattern,\n\t\t\t\t\tentrypoint: route.entrypoint,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Injects passkey/oauth/magic-link auth routes.\n * Only used when NOT using external auth.\n */\nexport function injectBuiltinAuthRoutes(injectRoute: InjectRoute): void {\n\t// Passkey authentication routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/passkey/options\",\n\t\tentrypoint: resolveRoute(\"api/auth/passkey/options.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/passkey/verify\",\n\t\tentrypoint: resolveRoute(\"api/auth/passkey/verify.ts\"),\n\t});\n\n\t// Passkey management routes (authenticated users)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/passkey\",\n\t\tentrypoint: resolveRoute(\"api/auth/passkey/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/passkey/register/options\",\n\t\tentrypoint: resolveRoute(\"api/auth/passkey/register/options.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/passkey/register/verify\",\n\t\tentrypoint: resolveRoute(\"api/auth/passkey/register/verify.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/passkey/[id]\",\n\t\tentrypoint: resolveRoute(\"api/auth/passkey/[id].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/dev-bypass\",\n\t\tentrypoint: resolveRoute(\"api/auth/dev-bypass.ts\"),\n\t});\n\n\t// Invite routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/invite\",\n\t\tentrypoint: resolveRoute(\"api/auth/invite/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/invite/accept\",\n\t\tentrypoint: resolveRoute(\"api/auth/invite/accept.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/invite/complete\",\n\t\tentrypoint: resolveRoute(\"api/auth/invite/complete.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/invite/register-options\",\n\t\tentrypoint: resolveRoute(\"api/auth/invite/register-options.ts\"),\n\t});\n\n\t// Magic link routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/magic-link/send\",\n\t\tentrypoint: resolveRoute(\"api/auth/magic-link/send.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/magic-link/verify\",\n\t\tentrypoint: resolveRoute(\"api/auth/magic-link/verify.ts\"),\n\t});\n\n\t// OAuth routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/oauth/[provider]\",\n\t\tentrypoint: resolveRoute(\"api/auth/oauth/[provider].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/oauth/[provider]/callback\",\n\t\tentrypoint: resolveRoute(\"api/auth/oauth/[provider]/callback.ts\"),\n\t});\n\n\t// Self-signup routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/signup/request\",\n\t\tentrypoint: resolveRoute(\"api/auth/signup/request.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/signup/verify\",\n\t\tentrypoint: resolveRoute(\"api/auth/signup/verify.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/signup/complete\",\n\t\tentrypoint: resolveRoute(\"api/auth/signup/complete.ts\"),\n\t});\n\n\t// Allowed domains admin routes (only relevant for passkey mode)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/allowed-domains\",\n\t\tentrypoint: resolveRoute(\"api/admin/allowed-domains/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/allowed-domains/[domain]\",\n\t\tentrypoint: resolveRoute(\"api/admin/allowed-domains/[domain].ts\"),\n\t});\n}\n","/**\n * Vite Plugin Configuration\n *\n * Defines the Vite plugin that handles virtual modules and other\n * Vite-specific configuration for EmDash.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, isAbsolute, relative, resolve, win32 } from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\n\nimport type { AstroConfig } from \"astro\";\nimport type { Plugin } from \"vite\";\n\nimport { COMMIT, VERSION } from \"../../version.js\";\nimport type { EmDashConfig, PluginDescriptor } from \"./runtime.js\";\nimport {\n\tVIRTUAL_CONFIG_ID,\n\tRESOLVED_VIRTUAL_CONFIG_ID,\n\tVIRTUAL_DIALECT_ID,\n\tRESOLVED_VIRTUAL_DIALECT_ID,\n\tVIRTUAL_STORAGE_ID,\n\tRESOLVED_VIRTUAL_STORAGE_ID,\n\tVIRTUAL_OBJECT_CACHE_ID,\n\tRESOLVED_VIRTUAL_OBJECT_CACHE_ID,\n\tVIRTUAL_ADMIN_REGISTRY_ID,\n\tRESOLVED_VIRTUAL_ADMIN_REGISTRY_ID,\n\tVIRTUAL_PLUGINS_ID,\n\tRESOLVED_VIRTUAL_PLUGINS_ID,\n\tVIRTUAL_SANDBOX_RUNNER_ID,\n\tRESOLVED_VIRTUAL_SANDBOX_RUNNER_ID,\n\tVIRTUAL_SANDBOXED_PLUGINS_ID,\n\tRESOLVED_VIRTUAL_SANDBOXED_PLUGINS_ID,\n\tVIRTUAL_AUTH_ID,\n\tRESOLVED_VIRTUAL_AUTH_ID,\n\tVIRTUAL_AUTH_PROVIDERS_ID,\n\tRESOLVED_VIRTUAL_AUTH_PROVIDERS_ID,\n\tVIRTUAL_MEDIA_PROVIDERS_ID,\n\tRESOLVED_VIRTUAL_MEDIA_PROVIDERS_ID,\n\tVIRTUAL_BLOCK_COMPONENTS_ID,\n\tRESOLVED_VIRTUAL_BLOCK_COMPONENTS_ID,\n\tVIRTUAL_SEED_ID,\n\tRESOLVED_VIRTUAL_SEED_ID,\n\tVIRTUAL_WAIT_UNTIL_ID,\n\tRESOLVED_VIRTUAL_WAIT_UNTIL_ID,\n\tVIRTUAL_SCHEDULER_ID,\n\tRESOLVED_VIRTUAL_SCHEDULER_ID,\n\tVIRTUAL_ENV_ID,\n\tRESOLVED_VIRTUAL_ENV_ID,\n\tVIRTUAL_BUILD_ID,\n\tRESOLVED_VIRTUAL_BUILD_ID,\n\tgenerateSeedModule,\n\tgenerateWaitUntilModule,\n\tgenerateSchedulerModule,\n\tgenerateEnvModule,\n\tgenerateBuildModule,\n\tgenerateConfigModule,\n\tgenerateDialectModule,\n\tgenerateStorageModule,\n\tgenerateObjectCacheModule,\n\tgenerateAuthModule,\n\tgenerateAuthProvidersModule,\n\tgeneratePluginsModule,\n\tgenerateAdminRegistryModule,\n\tgenerateSandboxRunnerModule,\n\tgenerateSandboxedPluginsModule,\n\tgenerateMediaProvidersModule,\n\tgenerateBlockComponentsModule,\n} from \"./virtual-modules.js\";\n\nconst LOCALE_MESSAGES_RE = /[/\\\\]([a-z]{2}(?:-[A-Z]{2})?)[/\\\\]messages\\.mjs$/;\n\nexport function pathToImportUrl(path: string): string {\n\treturn pathToFileURL(path, { windows: win32.isAbsolute(path) }).href;\n}\n\n/**\n * Vite plugin that compiles Lingui macros in admin source files.\n * Only active in dev mode when the admin package is aliased to source for HMR.\n * @babel/core is dynamically imported from admin's devDependencies —\n * not declared by core, never ships to end users.\n */\nexport function linguiMacroPlugin(adminSourcePath: string, adminDistPath: string): Plugin {\n\tconst adminRequire = createRequire(resolve(adminDistPath, \"index.js\"));\n\tconst babelCorePath = adminRequire.resolve(\"@babel/core\");\n\tconst linguiMacroPluginPath = adminRequire.resolve(\"@lingui/babel-plugin-lingui-macro\");\n\tconst adminSourceVitePath = adminSourcePath.replaceAll(\"\\\\\", \"/\");\n\n\treturn {\n\t\tname: \"emdash-lingui-macro\",\n\t\tenforce: \"pre\",\n\t\tresolveId(id, importer) {\n\t\t\t// Redirect relative locale catalog imports (e.g. ./de/messages.mjs) from\n\t\t\t// within admin source to the compiled dist/locales/ directory, since\n\t\t\t// lingui compile only runs during build — not in dev watch mode.\n\t\t\tif (!importer?.startsWith(adminSourceVitePath)) return;\n\t\t\tconst match = id.match(LOCALE_MESSAGES_RE);\n\t\t\tif (match?.[1]) {\n\t\t\t\treturn resolve(adminDistPath, \"locales\", match[1], \"messages.mjs\");\n\t\t\t}\n\t\t},\n\t\tasync transform(code, id) {\n\t\t\tif (!id.startsWith(adminSourceVitePath) || !code.includes(\"@lingui\")) return;\n\t\t\tconst { transformAsync } = (await import(\n\t\t\t\tpathToImportUrl(babelCorePath)\n\t\t\t)) as typeof import(\"@babel/core\");\n\t\t\tconst result = await transformAsync(code, {\n\t\t\t\tfilename: id,\n\t\t\t\tplugins: [linguiMacroPluginPath],\n\t\t\t\tparserOpts: { plugins: [\"jsx\", \"typescript\"] },\n\t\t\t});\n\t\t\tif (!result?.code) return;\n\t\t\treturn { code: result.code, map: result.map ?? undefined };\n\t\t},\n\t};\n}\n\n/**\n * Resolve path to the admin package dist directory.\n * Used for Vite alias to ensure the package is found in pnpm's isolated node_modules.\n */\nfunction resolveAdminDist(): string {\n\tconst require = createRequire(import.meta.url);\n\tconst adminPath = require.resolve(\"@emdash-cms/admin\");\n\t// Return the directory containing the built package (dist/)\n\treturn dirname(adminPath);\n}\n\n/**\n * Check whether child is inside parent without relying on simple prefix checks.\n */\nfunction isInside(parent: string, child: string): boolean {\n\tconst relativePath = relative(parent, child);\n\treturn relativePath === \"\" || (!relativePath.startsWith(\"..\") && !isAbsolute(relativePath));\n}\n\n/**\n * Resolve path to the admin package source directory.\n * In dev mode inside this repo, we alias @emdash-cms/admin to the source so\n * Vite processes it directly — giving instant HMR instead of requiring a\n * rebuild + restart. External apps should use the built package surface.\n */\nfunction resolveAdminSource(projectRoot: string): string | undefined {\n\tconst require = createRequire(import.meta.url);\n\tconst adminPath = require.resolve(\"@emdash-cms/admin\");\n\t// dist/index.js -> go up to package root, then into src/\n\tconst packageRoot = resolve(dirname(adminPath), \"..\");\n\tconst repoRoot = resolve(packageRoot, \"..\", \"..\");\n\tconst srcEntry = resolve(packageRoot, \"src\", \"index.ts\");\n\n\ttry {\n\t\tif (existsSync(srcEntry) && isInside(repoRoot, projectRoot)) {\n\t\t\treturn resolve(packageRoot, \"src\");\n\t\t}\n\t} catch {\n\t\t// Not in local repo — fall back to dist\n\t}\n\treturn undefined;\n}\n\nfunction resolveIntegrationShim(fileName: string): string {\n\tconst currentDir = dirname(fileURLToPath(import.meta.url));\n\tconst sourceShimPath = resolve(currentDir, \"shims\", fileName);\n\tif (existsSync(sourceShimPath)) {\n\t\treturn sourceShimPath;\n\t}\n\treturn resolve(currentDir, \"..\", \"..\", \"src\", \"astro\", \"integration\", \"shims\", fileName);\n}\n\nexport interface VitePluginOptions {\n\t/** Serializable config (database, storage, auth descriptors) */\n\tserializableConfig: Record<string, unknown>;\n\t/** Resolved EmDash config */\n\tresolvedConfig: EmDashConfig;\n\t/** Plugin descriptors */\n\tpluginDescriptors: PluginDescriptor[];\n\t/** Astro config */\n\tastroConfig: AstroConfig;\n}\n\n/**\n * Creates the EmDash virtual modules Vite plugin.\n */\nexport function createVirtualModulesPlugin(\n\toptions: VitePluginOptions,\n\tastroCommand: \"dev\" | \"build\" | \"preview\" | \"sync\",\n): Plugin {\n\tconst { serializableConfig, resolvedConfig, pluginDescriptors, astroConfig } = options;\n\n\tlet viteCommand: \"build\" | \"serve\" | undefined;\n\n\t// Captured once per plugin instance rather than inside load(): Vite may load\n\t// the module more than once (client and server passes, dev reloads), and a\n\t// validator that moved between those loads would invalidate at random.\n\tconst buildTime = Date.now();\n\n\treturn {\n\t\tname: \"emdash-virtual-modules\",\n\t\tconfigResolved(config) {\n\t\t\tviteCommand = config.command;\n\t\t},\n\t\tresolveId(id: string) {\n\t\t\tif (id === VIRTUAL_CONFIG_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_CONFIG_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_DIALECT_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_DIALECT_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_STORAGE_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_STORAGE_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_OBJECT_CACHE_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_OBJECT_CACHE_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_ADMIN_REGISTRY_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_ADMIN_REGISTRY_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_PLUGINS_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_PLUGINS_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_SANDBOX_RUNNER_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_SANDBOX_RUNNER_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_SANDBOXED_PLUGINS_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_SANDBOXED_PLUGINS_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_AUTH_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_AUTH_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_AUTH_PROVIDERS_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_AUTH_PROVIDERS_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_MEDIA_PROVIDERS_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_MEDIA_PROVIDERS_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_BLOCK_COMPONENTS_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_BLOCK_COMPONENTS_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_SEED_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_SEED_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_WAIT_UNTIL_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_WAIT_UNTIL_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_SCHEDULER_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_SCHEDULER_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_ENV_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_ENV_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_BUILD_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_BUILD_ID;\n\t\t\t}\n\t\t},\n\t\tload(id: string) {\n\t\t\tif (id === RESOLVED_VIRTUAL_CONFIG_ID) {\n\t\t\t\treturn generateConfigModule(serializableConfig);\n\t\t\t}\n\t\t\t// Generate a module that statically imports the configured dialect\n\t\t\t// This allows Vite to properly resolve and bundle it\n\t\t\tif (id === RESOLVED_VIRTUAL_DIALECT_ID) {\n\t\t\t\treturn generateDialectModule({\n\t\t\t\t\tentrypoint: resolvedConfig.database?.entrypoint,\n\t\t\t\t\ttype: resolvedConfig.database?.type,\n\t\t\t\t\tsupportsRequestScope: resolvedConfig.database?.supportsRequestScope ?? false,\n\t\t\t\t\tsupportsCoalescing: resolvedConfig.database?.supportsCoalescing ?? false,\n\t\t\t\t\tsupportsCollectionDeletionGuard:\n\t\t\t\t\t\tresolvedConfig.database?.supportsCollectionDeletionGuard ?? false,\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Generate a module that statically imports the configured storage\n\t\t\tif (id === RESOLVED_VIRTUAL_STORAGE_ID) {\n\t\t\t\treturn generateStorageModule(resolvedConfig.storage?.entrypoint);\n\t\t\t}\n\t\t\t// Generate the object-cache module — statically imports the\n\t\t\t// configured backend factory, or exports undefined (cache off).\n\t\t\tif (id === RESOLVED_VIRTUAL_OBJECT_CACHE_ID) {\n\t\t\t\treturn generateObjectCacheModule(\n\t\t\t\t\tresolvedConfig.objectCache?.entrypoint,\n\t\t\t\t\tresolvedConfig.objectCache?.config,\n\t\t\t\t);\n\t\t\t}\n\t\t\t// Generate plugins module that imports and instantiates all plugins\n\t\t\tif (id === RESOLVED_VIRTUAL_PLUGINS_ID) {\n\t\t\t\treturn generatePluginsModule(pluginDescriptors);\n\t\t\t}\n\t\t\t// Generate admin registry module with plugin components\n\t\t\tif (id === RESOLVED_VIRTUAL_ADMIN_REGISTRY_ID) {\n\t\t\t\t// Include both trusted and sandboxed plugins\n\t\t\t\tconst allDescriptors = [...pluginDescriptors, ...(resolvedConfig.sandboxed ?? [])];\n\t\t\t\treturn generateAdminRegistryModule(allDescriptors);\n\t\t\t}\n\t\t\t// Generate sandbox runner module\n\t\t\tif (id === RESOLVED_VIRTUAL_SANDBOX_RUNNER_ID) {\n\t\t\t\treturn generateSandboxRunnerModule(resolvedConfig.sandboxRunner, resolvedConfig.sandbox);\n\t\t\t}\n\t\t\t// Generate sandboxed plugins config module\n\t\t\tif (id === RESOLVED_VIRTUAL_SANDBOXED_PLUGINS_ID) {\n\t\t\t\t// Pass project root for proper module resolution\n\t\t\t\tconst projectRoot = fileURLToPath(astroConfig.root);\n\t\t\t\treturn generateSandboxedPluginsModule(\n\t\t\t\t\tresolvedConfig.sandboxed ?? [],\n\t\t\t\t\tprojectRoot,\n\t\t\t\t\t(filePath) => this.addWatchFile(filePath),\n\t\t\t\t);\n\t\t\t}\n\t\t\t// Generate auth module that statically imports the configured auth provider\n\t\t\tif (id === RESOLVED_VIRTUAL_AUTH_ID) {\n\t\t\t\tconst authDescriptor = resolvedConfig.auth;\n\t\t\t\tif (!authDescriptor || !(\"entrypoint\" in authDescriptor)) {\n\t\t\t\t\treturn generateAuthModule(undefined);\n\t\t\t\t}\n\t\t\t\treturn generateAuthModule(authDescriptor.entrypoint);\n\t\t\t}\n\t\t\t// Generate auth providers module (pluggable login methods)\n\t\t\tif (id === RESOLVED_VIRTUAL_AUTH_PROVIDERS_ID) {\n\t\t\t\treturn generateAuthProvidersModule(resolvedConfig.authProviders ?? []);\n\t\t\t}\n\t\t\t// Generate media providers module\n\t\t\tif (id === RESOLVED_VIRTUAL_MEDIA_PROVIDERS_ID) {\n\t\t\t\treturn generateMediaProvidersModule(resolvedConfig.mediaProviders ?? []);\n\t\t\t}\n\t\t\t// Generate block components module (plugin rendering components for PortableText)\n\t\t\tif (id === RESOLVED_VIRTUAL_BLOCK_COMPONENTS_ID) {\n\t\t\t\treturn generateBlockComponentsModule(pluginDescriptors);\n\t\t\t}\n\t\t\t// Generate seed module — embeds user seed or default at build time\n\t\t\tif (id === RESOLVED_VIRTUAL_SEED_ID) {\n\t\t\t\tconst projectRoot = fileURLToPath(astroConfig.root);\n\t\t\t\treturn generateSeedModule(projectRoot, viteCommand === \"serve\");\n\t\t\t}\n\t\t\t// Generate wait-until module — re-exports cloudflare:workers'\n\t\t\t// waitUntil under the Cloudflare adapter, undefined otherwise.\n\t\t\tif (id === RESOLVED_VIRTUAL_WAIT_UNTIL_ID) {\n\t\t\t\treturn generateWaitUntilModule(astroConfig.adapter?.name);\n\t\t\t}\n\t\t\t// Generate scheduler module — a NodeCronScheduler factory on\n\t\t\t// long-lived runtimes, or null under the Cloudflare adapter where\n\t\t\t// a Cron Trigger drives scheduled work instead.\n\t\t\t//\n\t\t\t// Decide from Astro's command, not Vite's config.command: the\n\t\t\t// Cloudflare adapter builds the worker bundle via a nested Vite\n\t\t\t// *build* pass even during `astro dev`, so viteCommand reports\n\t\t\t// \"build\" and would wrongly suppress the in-process timer (#1635).\n\t\t\t// Astro's command stays \"dev\", which is the only case that should\n\t\t\t// fall through to a NodeCronScheduler.\n\t\t\tif (id === RESOLVED_VIRTUAL_SCHEDULER_ID) {\n\t\t\t\tconst schedulerCommand = astroCommand === \"dev\" ? \"serve\" : \"build\";\n\t\t\t\treturn generateSchedulerModule(astroConfig.adapter?.name, schedulerCommand);\n\t\t\t}\n\t\t\t// Generate env module — re-exports cloudflare:workers' env under\n\t\t\t// the Cloudflare adapter, undefined otherwise (#1736).\n\t\t\tif (id === RESOLVED_VIRTUAL_ENV_ID) {\n\t\t\t\treturn generateEnvModule(astroConfig.adapter?.name);\n\t\t\t}\n\t\t\tif (id === RESOLVED_VIRTUAL_BUILD_ID) {\n\t\t\t\treturn generateBuildModule(buildTime);\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Modules that contain native Node.js addons or Node-only code.\n * These must be external in SSR to avoid bundling failures on Node.\n * On Cloudflare, the adapter handles its own externalization — setting\n * ssr.external there conflicts with @cloudflare/vite-plugin's validation.\n */\n// Matches the admin stylesheet import with or without a trailing query (e.g.\n// `?url`), so both forms resolve to dist rather than the source alias.\nconst ADMIN_STYLES_ALIAS = /^@emdash-cms\\/admin\\/styles\\.css/;\n\nconst NODE_NATIVE_EXTERNALS = [\"@libsql/kysely-libsql\", \"pg\"];\n\n/**\n * Detect whether the Cloudflare adapter is being used.\n */\nfunction isCloudflareAdapter(astroConfig: AstroConfig): boolean {\n\treturn astroConfig.adapter?.name === \"@astrojs/cloudflare\";\n}\n\n/**\n * Workers built-ins that core imports dynamically behind a runtime fallback.\n * Outside workerd nothing resolves them, and Rollup fails the server build on\n * an unresolved import, so they are left to the runtime. List only core's own\n * imports: any other `cloudflare:` import on a non-Cloudflare adapter should\n * still fail the build instead of failing at runtime.\n */\nconst CORE_WORKERS_BUILTINS = new Set([\"cloudflare:sockets\"]);\n\nfunction createWorkersBuiltinsExternalPlugin(): Plugin {\n\treturn {\n\t\tname: \"emdash-workers-builtins-external\",\n\t\tapply: \"build\",\n\t\tresolveId(id) {\n\t\t\tif (CORE_WORKERS_BUILTINS.has(id) && this.environment.config.consumer === \"server\") {\n\t\t\t\treturn { id, external: true };\n\t\t\t}\n\t\t},\n\t};\n}\n\nfunction canResolveProjectDependency(projectRoot: string, specifier: string): boolean {\n\ttry {\n\t\tcreateRequire(resolve(projectRoot, \"package.json\")).resolve(specifier);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Creates the Vite config update for EmDash.\n */\nexport function createViteConfig(\n\toptions: VitePluginOptions,\n\tcommand: \"dev\" | \"build\" | \"preview\" | \"sync\",\n): NonNullable<AstroConfig[\"vite\"]> {\n\tconst adminDistPath = resolveAdminDist();\n\tconst cloudflare = isCloudflareAdapter(options.astroConfig);\n\tconst isDev = command === \"dev\";\n\tconst projectRoot = fileURLToPath(options.astroConfig.root);\n\tconst hasAstroConsoleLogger = canResolveProjectDependency(projectRoot, \"astro/logger/console\");\n\n\tconst adminSourcePath = isDev ? resolveAdminSource(projectRoot) : undefined;\n\tconst useSource = adminSourcePath !== undefined;\n\tconst useSyncExternalStoreShimPath = resolveIntegrationShim(\"use-sync-external-store.js\");\n\tconst useSyncExternalStoreWithSelectorShimPath = resolveIntegrationShim(\n\t\t\"use-sync-external-store-with-selector.js\",\n\t);\n\tconst configuredWatchIgnored = options.astroConfig.vite?.server?.watch?.ignored;\n\tconst watchIgnored = Array.isArray(configuredWatchIgnored)\n\t\t? configuredWatchIgnored\n\t\t: configuredWatchIgnored\n\t\t\t? [configuredWatchIgnored]\n\t\t\t: [];\n\n\treturn {\n\t\t// Astro SSR routes resolve version.ts from source (not tsdown dist),\n\t\t// so Vite needs its own define pass for the __EMDASH_*__ placeholders.\n\t\tdefine: {\n\t\t\t__EMDASH_VERSION__: JSON.stringify(VERSION),\n\t\t\t__EMDASH_COMMIT__: JSON.stringify(COMMIT),\n\t\t\t__EMDASH_PSEUDO_LOCALE__: JSON.stringify(\n\t\t\t\tisDev && process.env[\"EMDASH_PSEUDO_LOCALE\"] === \"1\",\n\t\t\t),\n\t\t},\n\t\tresolve: {\n\t\t\tdedupe: [\"@emdash-cms/admin\", \"react\", \"react-dom\"],\n\t\t\t// Array form so more-specific entries are checked first.\n\t\t\t// The styles.css alias must come before the package alias, otherwise\n\t\t\t// Vite's prefix matching on \"@emdash-cms/admin\" would resolve\n\t\t\t// \"@emdash-cms/admin/styles.css\" through the source directory.\n\t\t\t// Regex (not string) so the `?url` variant — admin.astro imports the\n\t\t\t// stylesheet as `?url` to keep it out of the page CSS graph — also\n\t\t\t// resolves to dist; a string `find` only matches on a `/` or end\n\t\t\t// boundary, so `styles.css?url` would slip through to the source alias.\n\t\t\talias: [\n\t\t\t\t{ find: ADMIN_STYLES_ALIAS, replacement: resolve(adminDistPath, \"styles.css\") },\n\t\t\t\t{ find: \"@emdash-cms/admin\", replacement: useSource ? adminSourcePath : adminDistPath },\n\t\t\t\t// `use-sync-external-store/shim` is a React <18 polyfill that ships\n\t\t\t\t// only as CJS. It's pulled in transitively by `@tiptap/react`. With\n\t\t\t\t// pnpm's virtual store the file lives under .pnpm/, where Vite's\n\t\t\t\t// dep scanner can't reach it for pre-bundling — so the browser is\n\t\t\t\t// served raw `module.exports` and hydration fails with\n\t\t\t\t// `SyntaxError: ... does not provide an export named\n\t\t\t\t// 'useSyncExternalStore'`. Redirect both shim entry points to a\n\t\t\t\t// tiny ESM shim file that re-exports React's built-in hook, and\n\t\t\t\t// redirect the selector entry points to an ESM wrapper around that\n\t\t\t\t// hook. The absolute file paths are required because Vite/Rolldown\n\t\t\t\t// dependency optimization applies aliases without EmDash's virtual\n\t\t\t\t// module plugin. This also avoids the package main entry's React\n\t\t\t\t// 18+ dev warning.\n\t\t\t\t{\n\t\t\t\t\tfind: \"use-sync-external-store/shim/with-selector.js\",\n\t\t\t\t\treplacement: useSyncExternalStoreWithSelectorShimPath,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tfind: \"use-sync-external-store/shim/with-selector\",\n\t\t\t\t\treplacement: useSyncExternalStoreWithSelectorShimPath,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tfind: \"use-sync-external-store/shim/index.js\",\n\t\t\t\t\treplacement: useSyncExternalStoreShimPath,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tfind: \"use-sync-external-store/shim\",\n\t\t\t\t\treplacement: useSyncExternalStoreShimPath,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- Monorepo has both vite 6 (docs) and vite 7 (core). tsgo resolves correctly.\n\t\tplugins: [\n\t\t\tcreateVirtualModulesPlugin(options, command),\n\t\t\t...(cloudflare ? [] : [createWorkersBuiltinsExternalPlugin()]),\n\t\t\t// In dev mode with source alias, compile Lingui macros on the fly\n\t\t\t// and redirect locale .mjs imports to dist/.\n\t\t\t// In production, macros are pre-compiled by tsdown in the admin package.\n\t\t\t...(useSource ? [linguiMacroPlugin(adminSourcePath, adminDistPath)] : []),\n\t\t] as NonNullable<AstroConfig[\"vite\"]>[\"plugins\"],\n\t\tserver: {\n\t\t\twatch: {\n\t\t\t\tignored: [...watchIgnored, \"**/.wrangler/**\"],\n\t\t\t},\n\t\t},\n\t\t// Handle native modules for SSR.\n\t\t// On Node: external keeps native addons out of the SSR bundle.\n\t\t// On Cloudflare: skip — the adapter handles externalization, and setting\n\t\t// ssr.external conflicts with @cloudflare/vite-plugin's resolve.external validation.\n\t\tssr: cloudflare\n\t\t\t? {\n\t\t\t\t\tnoExternal: [\"emdash\", \"@emdash-cms/admin\"],\n\t\t\t\t\t// Pre-bundle EmDash's runtime deps for workerd. Without this,\n\t\t\t\t\t// Vite discovers them one-by-one on first request, causing workerd\n\t\t\t\t\t// to enter \"worker cancelled\" state on cold cache.\n\t\t\t\t\toptimizeDeps: {\n\t\t\t\t\t\t// Exclude EmDash virtual modules from esbuild's dependency\n\t\t\t\t\t\t// scan. These are resolved by the Vite plugin at transform time,\n\t\t\t\t\t\t// but esbuild encounters them when crawling emdash's dist files\n\t\t\t\t\t\t// during pre-bundling and can't resolve them. Vite's exclude\n\t\t\t\t\t\t// uses prefix matching (id.startsWith(m + \"/\")), so\n\t\t\t\t\t\t// \"virtual:emdash\" matches all \"virtual:emdash/*\" imports.\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// First-party packages must also stay excluded. In a\n\t\t\t\t\t\t// real install (unlike the workspace symlink, which Vite never\n\t\t\t\t\t\t// optimizes), the optimizer bundles their dist and code-splits\n\t\t\t\t\t\t// lazily-executed dynamic imports (MCP tools, content\n\t\t\t\t\t\t// validation) into hashed chunks. A mid-session re-optimization\n\t\t\t\t\t\t// deletes those chunks while loaded modules still reference\n\t\t\t\t\t\t// them, so every content write fails with \"The file does not\n\t\t\t\t\t\t// exist at .../deps_ssr/...\" until the dev server restarts.\n\t\t\t\t\t\t// Their CJS deps are still pre-bundled via the \"parent > dep\"\n\t\t\t\t\t\t// include entries below, which resolve through excluded parents.\n\t\t\t\t\t\texclude: [\"virtual:emdash\", \"emdash\", \"@emdash-cms/admin\", \"@emdash-cms/cloudflare\"],\n\t\t\t\t\t\tinclude: [\n\t\t\t\t\t\t\t// EmDash direct deps\n\t\t\t\t\t\t\t\"emdash > @portabletext/toolkit\",\n\t\t\t\t\t\t\t\"emdash > @unpic/placeholder\",\n\t\t\t\t\t\t\t\"emdash > @atcute/client\",\n\t\t\t\t\t\t\t\"emdash > @atcute/lexicons/syntax\",\n\t\t\t\t\t\t\t\"emdash > @atcute/lexicons/validations\",\n\t\t\t\t\t\t\t\"emdash > blurhash\",\n\t\t\t\t\t\t\t\"emdash > croner\",\n\t\t\t\t\t\t\t\"emdash > jose\",\n\t\t\t\t\t\t\t\"emdash > jpeg-js\",\n\t\t\t\t\t\t\t\"emdash > kysely\",\n\t\t\t\t\t\t\t// Only imported by the migration runner, so the first\n\t\t\t\t\t\t\t// dev-bypass/setup request would otherwise discover it.\n\t\t\t\t\t\t\t\"emdash > kysely/migration\",\n\t\t\t\t\t\t\t\"emdash > mime/lite\",\n\t\t\t\t\t\t\t\"emdash > modern-tar\",\n\t\t\t\t\t\t\t\"emdash > sanitize-html\",\n\t\t\t\t\t\t\t\"emdash > @tiptap/core\",\n\t\t\t\t\t\t\t\"emdash > ulidx\",\n\t\t\t\t\t\t\t\"emdash > upng-js\",\n\t\t\t\t\t\t\t\"emdash > astro-portabletext\",\n\t\t\t\t\t\t\t\"emdash > sax\",\n\t\t\t\t\t\t\t// Deeper transitive deps\n\t\t\t\t\t\t\t\"emdash > sanitize-html > parse5\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/gutenberg-to-portable-text > @wordpress/block-serialization-default-parser\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/auth > @oslojs/crypto/ecdsa\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/auth > @oslojs/crypto/sha2\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/auth > @oslojs/webauthn\",\n\t\t\t\t\t\t\t// Registry routes are lazy, so their AT Protocol graph is not\n\t\t\t\t\t\t\t// present during Vite's initial dependency scan.\n\t\t\t\t\t\t\t\"emdash > @atcute/identity-resolver\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-lexicons > @atcute/atproto/types/label/defs\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @atcute/client\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @atcute/crypto\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @atcute/identity\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @atcute/identity-resolver\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @atcute/lexicons/syntax\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @atcute/lexicons/validations\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @atcute/multibase\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @atcute/repo\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @emdash-cms/registry-moderation > @atcute/cbor\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @emdash-cms/registry-moderation > @atcute/cid\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @emdash-cms/registry-moderation > @atcute/crypto\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @emdash-cms/registry-moderation > @atcute/multibase\",\n\t\t\t\t\t\t\t// Auth deps imported only on auth/login/callback routes, so\n\t\t\t\t\t\t\t// the initial page scan misses them. Pre-bundle to avoid a\n\t\t\t\t\t\t\t// re-optimize + reload cascade on first authenticated request.\n\t\t\t\t\t\t\t\"emdash > @oslojs/crypto/hmac\",\n\t\t\t\t\t\t\t\"emdash > @oslojs/crypto/subtle\",\n\t\t\t\t\t\t\t\"emdash > @oslojs/crypto/rsa\",\n\t\t\t\t\t\t\t\"emdash > arctic\",\n\t\t\t\t\t\t\t// MCP SDK — server/index.js statically imports ajv (CJS-only).\n\t\t\t\t\t\t\t// Pre-bundling converts CJS to ESM so workerd can load it.\n\t\t\t\t\t\t\t\"emdash > @modelcontextprotocol/sdk > ajv\",\n\t\t\t\t\t\t\t\"emdash > @modelcontextprotocol/sdk > ajv-formats\",\n\t\t\t\t\t\t\t// MCP server entrypoints — only imported on the MCP route, so\n\t\t\t\t\t\t\t// also missed by the initial scan.\n\t\t\t\t\t\t\t\"emdash > @modelcontextprotocol/sdk/server/mcp.js\",\n\t\t\t\t\t\t\t\"emdash > @modelcontextprotocol/sdk/server/webStandardStreamableHttp.js\",\n\t\t\t\t\t\t\t// Admin shell SSR deps, reached only when the admin route is\n\t\t\t\t\t\t\t// first rendered.\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @lingui/react\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @cloudflare/kumo/primitives\",\n\t\t\t\t\t\t\t// System email copy resolution (invite, magic link) — reached\n\t\t\t\t\t\t\t// only when one of those routes sends an email.\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @lingui/core\",\n\t\t\t\t\t\t\t// React (commonly used, may be hoisted)\n\t\t\t\t\t\t\t\"react\",\n\t\t\t\t\t\t\t\"react/jsx-dev-runtime\",\n\t\t\t\t\t\t\t\"react/jsx-runtime\",\n\t\t\t\t\t\t\t\"react-dom\",\n\t\t\t\t\t\t\t\"react-dom/server\",\n\t\t\t\t\t\t\t// Top-level deps (use astro > path for pnpm compat)\n\t\t\t\t\t\t\t\"astro > zod/v4\",\n\t\t\t\t\t\t\t\"astro > zod/v4/core\",\n\t\t\t\t\t\t\t\"astro/zod\",\n\t\t\t\t\t\t\t// zod-generator imports the bare `zod` entry, not `zod/v4`\n\t\t\t\t\t\t\t\"emdash > zod\",\n\t\t\t\t\t\t\t\"@emdash-cms/cloudflare > kysely-d1\",\n\t\t\t\t\t\t\t// Astro internal deps not covered by @astrojs/cloudflare adapter\n\t\t\t\t\t\t\t\"astro/app/entrypoint\",\n\t\t\t\t\t\t\t\"astro/app/manifest\",\n\t\t\t\t\t\t\t...(hasAstroConsoleLogger ? [\"astro/logger/console\"] : []),\n\t\t\t\t\t\t\t\"astro/virtual-modules/middleware.js\",\n\t\t\t\t\t\t\t\"astro/virtual-modules/live-config\",\n\t\t\t\t\t\t\t\"astro/content/runtime\",\n\t\t\t\t\t\t\t\"astro/assets/utils/inferRemoteSize.js\",\n\t\t\t\t\t\t\t\"astro/assets/fonts/runtime.js\",\n\t\t\t\t\t\t\t\"astro/assets/services/noop\",\n\t\t\t\t\t\t\t\"@astrojs/cloudflare/image-service\",\n\t\t\t\t\t\t\t// Only imported by the /_image route, so the first image\n\t\t\t\t\t\t\t// request would otherwise discover it.\n\t\t\t\t\t\t\t\"@astrojs/cloudflare/image-transform-endpoint\",\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\texternal: NODE_NATIVE_EXTERNALS,\n\t\t\t\t\tnoExternal: [\"emdash\", \"@emdash-cms/admin\"],\n\t\t\t\t},\n\t\toptimizeDeps: {\n\t\t\t// When using source, don't pre-bundle JS — let Vite transform on the fly for HMR.\n\t\t\t// When using dist, pre-bundle to avoid re-optimization on first hydration.\n\t\t\t// lowlight pulls in a CommonJS highlight.js entry, so the inline Portable\n\t\t\t// Text editor requires these to be pre-bundled with ESM interop in dev.\n\t\t\t// Bare ids would not resolve on pnpm sites, which have no top-level copy.\n\t\t\tinclude: useSource\n\t\t\t\t? [\n\t\t\t\t\t\t\"@astrojs/react/client.js\",\n\t\t\t\t\t\t\"emdash > lowlight\",\n\t\t\t\t\t\t\"emdash > highlight.js\",\n\t\t\t\t\t\t\"emdash > highlight.js/lib/core\",\n\t\t\t\t\t\t// The HTML block's code editor loads these lazily. Discovering\n\t\t\t\t\t\t// them on first use would re-optimize and reload the admin.\n\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @codemirror/autocomplete\",\n\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @codemirror/commands\",\n\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @codemirror/lang-css\",\n\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @codemirror/lang-html\",\n\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @codemirror/lang-javascript\",\n\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @codemirror/language\",\n\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @codemirror/state\",\n\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @codemirror/view\",\n\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @lezer/highlight\",\n\t\t\t\t\t]\n\t\t\t\t: [\n\t\t\t\t\t\t\"@emdash-cms/admin\",\n\t\t\t\t\t\t\"@astrojs/react/client.js\",\n\t\t\t\t\t\t\"emdash > lowlight\",\n\t\t\t\t\t\t\"emdash > highlight.js\",\n\t\t\t\t\t\t\"emdash > highlight.js/lib/core\",\n\t\t\t\t\t],\n\t\t\texclude: cloudflare ? [\"virtual:emdash\"] : [...NODE_NATIVE_EXTERNALS, \"virtual:emdash\"],\n\t\t},\n\t};\n}\n","/**\n * Runtime utilities for EmDash\n *\n * This file contains functions that are used at runtime (in middleware, routes, etc.)\n * and must work in all environments including Cloudflare Workers.\n *\n * DO NOT import Node.js-only modules here (fs, path, module, etc.)\n */\n\nimport type { ManifestHookEntry, ManifestRouteEntry } from \"@emdash-cms/plugin-types\";\n\nimport type { AuthDescriptor, AuthProviderDescriptor } from \"../../auth/types.js\";\nimport type { RuntimeMigrationConfig } from \"../../database/migrations/policy.js\";\nimport type { DatabaseDescriptor } from \"../../db/adapters.js\";\nimport type { MediaProviderDescriptor } from \"../../media/types.js\";\nimport type { ObjectCacheDescriptor } from \"../../object-cache/types.js\";\nimport type {\n\tFieldWidgetConfig,\n\tPluginEditorAction,\n\tPluginEditorPanel,\n\tPluginMcpManifestConfig,\n\tPortableTextBlockConfig,\n\tResolvedPlugin,\n\tSettingField,\n} from \"../../plugins/types.js\";\nimport type { RegistryConfigOption } from \"../../registry/types.js\";\nimport type { StorageDescriptor } from \"../storage/types.js\";\n\nexport type { RegistryConfig, RegistryConfigOption } from \"../../registry/types.js\";\n\nexport type { ResolvedPlugin };\nexport type { MediaProviderDescriptor };\n\n/**\n * Admin page definition (copied from plugins/types to avoid circular deps)\n */\nexport interface PluginAdminPage {\n\tpath: string;\n\tlabel: string;\n\ticon?: string;\n}\n\n/**\n * Dashboard widget definition (copied from plugins/types to avoid circular deps)\n */\nexport interface PluginDashboardWidget {\n\tid: string;\n\tsize?: \"full\" | \"half\" | \"third\";\n\ttitle?: string;\n}\n\n/**\n * Plugin descriptor - returned by plugin factory functions\n *\n * Contains all static metadata needed for manifest and admin UI,\n * plus the entrypoint for runtime instantiation.\n *\n * @example\n * ```ts\n * export function myPlugin(options?: MyPluginOptions): PluginDescriptor {\n * return {\n * id: \"my-plugin\",\n * version: \"1.0.0\",\n * entrypoint: \"@my-org/emdash-plugin-foo\",\n * options: options ?? {},\n * adminEntry: \"@my-org/emdash-plugin-foo/admin\",\n * adminPages: [{ path: \"/settings\", label: \"Settings\" }],\n * };\n * }\n * ```\n */\n/**\n * Storage collection declaration for sandboxed plugins\n */\nexport interface StorageCollectionDeclaration {\n\tindexes?: string[];\n\tuniqueIndexes?: string[];\n}\n\nexport interface PluginDescriptor<TOptions extends object = object> {\n\t/** Unique plugin identifier */\n\tid: string;\n\t/** Plugin version (semver) */\n\tversion: string;\n\t/** Module specifier to import (e.g., \"@emdash-cms/plugin-api-test\") */\n\tentrypoint: string;\n\t/**\n\t * Options to pass to createPlugin(). Native format only.\n\t * Standard-format plugins configure themselves via KV settings\n\t * and Block Kit admin pages -- not constructor options.\n\t */\n\toptions?: TOptions;\n\t/**\n\t * Plugin format. Determines how the entrypoint is loaded:\n\t * - `\"standard\"` -- exports `definePlugin({ hooks, routes })` as default.\n\t * Wrapped with `adaptSandboxEntry` for in-process execution. Can run in both\n\t * `plugins: []` (in-process) and `sandboxed: []` (isolate).\n\t * - `\"native\"` -- exports `createPlugin(options)` returning a `ResolvedPlugin`.\n\t * Can only run in `plugins: []`. Cannot be sandboxed or published to marketplace.\n\t *\n\t * Defaults to `\"native\"` when unset.\n\t *\n\t */\n\tformat?: \"standard\" | \"native\";\n\t/** Admin UI module specifier (e.g., \"@emdash-cms/plugin-audit-log/admin\") */\n\tadminEntry?: string;\n\t/** Module specifier for site-side Astro rendering components (must export `blockComponents`) */\n\tcomponentsEntry?: string;\n\t/** Admin pages for navigation */\n\tadminPages?: PluginAdminPage[];\n\t/** Dashboard widgets */\n\tadminWidgets?: PluginDashboardWidget[];\n\t/** Saved-entry Block Kit panels. */\n\teditorPanels?: PluginEditorPanel[];\n\t/** Saved-entry host-rendered actions. */\n\teditorActions?: PluginEditorAction[];\n\t/** Settings schema for the auto-generated admin settings form */\n\tsettingsSchema?: Record<string, SettingField>;\n\t/**\n\t * Portable Text block types this plugin contributes to the editor.\n\t * Declarative (Block Kit) — surfaced in the admin slash menu and consumed\n\t * from the manifest, so standard/sandboxed plugins can contribute blocks\n\t * without a native render component.\n\t */\n\tportableTextBlocks?: PortableTextBlockConfig[];\n\t/** Field widget types this plugin contributes for schema-field editing UIs. */\n\tfieldWidgets?: FieldWidgetConfig[];\n\n\t// === Sandbox-specific fields (for sandboxed plugins) ===\n\n\t/**\n\t * Capabilities the plugin requests.\n\t * For standard-format plugins, capabilities are enforced in both trusted and\n\t * sandboxed modes via the PluginContextFactory.\n\t */\n\tcapabilities?: string[];\n\t/**\n\t * Allowed hosts for network:fetch capability\n\t * Supports wildcards like \"*.example.com\"\n\t */\n\tallowedHosts?: string[];\n\t/**\n\t * Storage collections the plugin declares\n\t * Sandboxed plugins can only access declared collections.\n\t */\n\tstorage?: Record<string, StorageCollectionDeclaration>;\n\t/** Serialized MCP declarations emitted by the plugin build. */\n\tmcp?: PluginMcpManifestConfig;\n\t/**\n\t * Route declarations for sandboxed config-declared plugins. Mirrors\n\t * definePlugin({ routes }) and drives route auth decisions; omitted routes\n\t * default to non-public.\n\t */\n\troutes?: Array<ManifestRouteEntry | string>;\n\t/**\n\t * Hook declarations for sandboxed config-declared plugins. Mirrors\n\t * definePlugin({ hooks }).\n\t */\n\thooks?: Array<ManifestHookEntry | string>;\n}\n\n/**\n * Sandboxed plugin descriptor - same format as PluginDescriptor\n *\n * These run in isolated V8 isolates via Worker Loader on Cloudflare.\n * The `entrypoint` is resolved to a file and bundled at build time.\n */\nexport type SandboxedPluginDescriptor<TOptions extends object = object> =\n\tPluginDescriptor<TOptions>;\n\nexport interface EmDashConfig {\n\t/**\n\t * Database configuration\n\t *\n\t * Use one of the adapter functions:\n\t * - `sqlite({ url: \"file:./data.db\" })` - Local SQLite\n\t * - `libsql({ url: \"...\", authToken: \"...\" })` - Turso/libSQL\n\t * - `d1({ binding: \"DB\" })` - Cloudflare D1\n\t *\n\t * @example\n\t * ```ts\n\t * import { sqlite } from \"emdash/db\";\n\t *\n\t * emdash({\n\t * database: sqlite({ url: \"file:./data.db\" }),\n\t * })\n\t * ```\n\t */\n\tdatabase?: DatabaseDescriptor;\n\t/** Core database migration behavior at runtime. Defaults to `auto`. */\n\tmigrations?: RuntimeMigrationConfig;\n\t/**\n\t * Storage configuration (for media)\n\t */\n\tstorage?: StorageDescriptor;\n\n\t/**\n\t * Optional distributed object cache for query results.\n\t *\n\t * Off by default. When configured, content and chrome (settings, menus,\n\t * taxonomies) reads are cached in a fast key/value store and served without\n\t * touching the database on repeat requests across isolates. This offloads\n\t * read pressure from D1/SQLite, which is especially valuable on Cloudflare\n\t * where D1 has far lower request capacity than KV.\n\t *\n\t * Use a backend adapter:\n\t * - `memoryCache()` from `emdash/astro` — in-isolate (Node / local dev)\n\t * - `kvCache({ binding: \"CACHE\" })` from `@emdash-cms/cloudflare` — KV\n\t *\n\t * Preview and visual-edit requests bypass the cache, so editors previewing\n\t * see live content. All other reads — including authenticated browsing outside\n\t * edit mode — are served from the cache, which only ever stores published\n\t * content. When Astro route caching is enabled, a rendered cache fill bypasses\n\t * the object cache so a purged page cannot be rebuilt from an older snapshot.\n\t * Other requests may see stale content until isolates pick up the bumped epoch:\n\t * immediate with the memory backend, and on KV bounded by KV's edge-cache\n\t * propagation (eventual consistency, up to ~60s) plus the isolate-local\n\t * `revalidate` window (default 1s).\n\t *\n\t * Scheduled content becomes visible at query time (no write event fires when\n\t * its publish time passes), so a cached list/entry won't surface a newly-due\n\t * scheduled item until the next write to that collection or until the\n\t * entry's TTL lapses (`defaultTtl`, default 1h). Sites that rely on precise\n\t * scheduled publishing should lower `defaultTtl` accordingly.\n\t *\n\t * @example\n\t * ```ts\n\t * import { kvCache } from \"@emdash-cms/cloudflare\";\n\t *\n\t * emdash({\n\t * database: d1({ binding: \"DB\" }),\n\t * objectCache: kvCache({ binding: \"CACHE\" }),\n\t * })\n\t * ```\n\t */\n\tobjectCache?: ObjectCacheDescriptor;\n\t/**\n\t * Image optimization.\n\t *\n\t * By default EmDash wraps Astro's image endpoint so media served from\n\t * storage is optimized through the normal `<Image>` / `getImage` pipeline,\n\t * loading source bytes directly from the storage adapter (works behind\n\t * Cloudflare Access). Set to `false` to leave Astro's image endpoint\n\t * untouched -- media then renders as a plain `<img>` unless your image\n\t * service can fetch it over HTTP.\n\t */\n\timages?: boolean;\n\t/**\n\t * Trusted plugins to load (run in main isolate)\n\t *\n\t * @example\n\t * ```ts\n\t * import auditLog from \"@emdash-cms/plugin-audit-log\";\n\t * import webhookNotifier from \"@emdash-cms/plugin-webhook-notifier\";\n\t *\n\t * emdash({\n\t * plugins: [auditLog, webhookNotifier],\n\t * })\n\t * ```\n\t */\n\tplugins?: PluginDescriptor[];\n\t/**\n\t * Sandboxed plugins to load (run in isolated V8 isolates)\n\t *\n\t * Only works on Cloudflare with Worker Loader enabled.\n\t * Uses the same format as `plugins` - the difference is where they run.\n\t *\n\t * @example\n\t * ```ts\n\t * import { sandbox } from \"@emdash-cms/cloudflare\";\n\t * import { untrustedPlugin } from \"some-third-party-plugin\";\n\t *\n\t * emdash({\n\t * plugins: [trustedPlugin()], // runs in host\n\t * sandboxed: [untrustedPlugin()], // runs in isolate\n\t * sandboxRunner: sandbox(),\n\t * })\n\t * ```\n\t */\n\tsandboxed?: SandboxedPluginDescriptor[];\n\t/**\n\t * Module that exports the sandbox runner factory.\n\t * Required if using sandboxed plugins.\n\t *\n\t * @example\n\t * ```ts\n\t * import { sandbox } from \"@emdash-cms/cloudflare\";\n\t *\n\t * emdash({\n\t * sandboxRunner: sandbox(),\n\t * })\n\t * ```\n\t */\n\tsandboxRunner?: string;\n\n\t/**\n\t * Explicitly disable plugin sandboxing, even if a sandbox runner is configured.\n\t * Use this as a debugging escape hatch to determine whether a bug is in your\n\t * plugin code or in the sandbox runtime.\n\t *\n\t * When set to `false`, all plugins run in-process without isolation.\n\t *\n\t * @default true (sandboxing enabled if sandboxRunner is configured)\n\t */\n\tsandbox?: boolean;\n\n\t/**\n\t * Authentication configuration\n\t *\n\t * Use an auth adapter function from a platform package:\n\t * - `access({ teamDomain: \"...\" })` from `@emdash-cms/cloudflare`\n\t *\n\t * When an external auth provider is configured, passkey auth is disabled.\n\t *\n\t * @example\n\t * ```ts\n\t * import { access } from \"@emdash-cms/cloudflare\";\n\t *\n\t * emdash({\n\t * auth: access({\n\t * teamDomain: \"myteam.cloudflareaccess.com\",\n\t * audience: \"abc123...\",\n\t * roleMapping: {\n\t * \"Admins\": 50,\n\t * \"Editors\": 30,\n\t * },\n\t * }),\n\t * })\n\t * ```\n\t */\n\tauth?: AuthDescriptor;\n\n\t/**\n\t * Pluggable auth providers (login methods on the login page).\n\t *\n\t * Auth providers appear as options alongside passkey on the login page\n\t * and setup wizard. Any provider can be used to create the initial\n\t * admin account. Passkey is built-in; providers listed here are additive.\n\t *\n\t * @example\n\t * ```ts\n\t * import { atproto } from \"@emdash-cms/auth-atproto\";\n\t *\n\t * emdash({\n\t * authProviders: [atproto()],\n\t * })\n\t * ```\n\t */\n\tauthProviders?: AuthProviderDescriptor[];\n\n\t/**\n\t * MCP (Model Context Protocol) server endpoint.\n\t *\n\t * Exposes an MCP Streamable HTTP server at `/_emdash/api/mcp`\n\t * that allows AI agents and tools to interact with the CMS using\n\t * the standardized MCP protocol.\n\t *\n\t * Enabled by default. The endpoint requires bearer token auth, so\n\t * it has no effect unless the user creates an API token and\n\t * configures a client. Set to `false` to disable.\n\t *\n\t * @default true\n\t */\n\tmcp?: boolean;\n\n\t/**\n\t * Plugin marketplace URL\n\t *\n\t * Existing marketplace-installed plugins use this URL for updates.\n\t * Marketplace browsing and new installs are no longer shown in the admin.\n\t *\n\t * Must be an HTTPS URL in production, or localhost/127.0.0.1 in dev.\n\t * Installing or updating plugins requires an available `sandboxRunner`.\n\t * Existing marketplace-installed plugins remain updateable and uninstallable.\n\t * New plugin discovery and installs use the registry.\n\t *\n\t * @example\n\t * ```ts\n\t * import { sandbox } from \"@emdash-cms/cloudflare\";\n\t *\n\t * emdash({\n\t * marketplace: \"https://marketplace.emdashcms.com\",\n\t * sandboxRunner: sandbox(),\n\t * })\n\t * ```\n\t *\n\t * @deprecated Keep this option only while the site has plugins installed from\n\t * the legacy marketplace. Remove it after those plugins are replaced or\n\t * uninstalled.\n\t */\n\tmarketplace?: string;\n\n\t/**\n\t * Plugin registry discovery and installation.\n\t *\n\t * An enabled sandbox runner uses the hosted registry by default. Pass a\n\t * registry URL or configuration object to customize it, or `false` to\n\t * disable registry discovery while retaining the sandbox runner.\n\t *\n\t * @default \"https://registry.emdashcms.com\" when sandboxing is enabled\n\t */\n\tregistry?: RegistryConfigOption;\n\n\t/**\n\t * Core update notice in the admin dashboard.\n\t *\n\t * When enabled (the default), EmDash checks the public npm registry\n\t * (`registry.npmjs.org`) at most once per day for published `emdash`\n\t * releases and shows a dismissible banner in the admin dashboard when\n\t * a newer version is available. The check is deferred after the\n\t * response and carries no site data — it's a plain GET to the public\n\t * registry. Sites without outbound internet simply never see the banner.\n\t *\n\t * The banner names the newest stable release that has been public for\n\t * `minimumReleaseAge`: a duration string (`\"48h\"`, `\"7d\"`) or a number\n\t * of seconds, `\"24h\"` by default. Set it to match a package manager's\n\t * release-age policy, such as pnpm's `minimumReleaseAge`.\n\t *\n\t * Set to `false` to disable the check entirely.\n\t *\n\t * @default true\n\t */\n\tupdateCheck?: boolean | { minimumReleaseAge?: string | number };\n\n\t/**\n\t * Maximum allowed media file upload size in bytes.\n\t *\n\t * Applies to both direct multipart uploads and signed-URL uploads.\n\t * When unset, defaults to 52_428_800 (50 MB).\n\t *\n\t * @example\n\t * ```ts\n\t * emdash({ maxUploadSize: 100 * 1024 * 1024 }) // 100 MB\n\t * ```\n\t */\n\tmaxUploadSize?: number;\n\n\t/**\n\t * Public browser-facing origin for the site.\n\t *\n\t * Use when `Astro.url` / `request.url` do not match what users open — common with a\n\t * **TLS-terminating reverse proxy**: the app often sees `http://` on the internal hop\n\t * while the browser uses `https://`, which breaks WebAuthn, CSRF, OAuth, and redirect URLs.\n\t *\n\t * Set to the full origin users type in the address bar (no path), e.g.\n\t * `https://mysite.example.com`. When not set, falls back to environment variables\n\t * `EMDASH_SITE_URL` > `SITE_URL`, then to the request URL's origin.\n\t *\n\t * Replaces `passkeyPublicOrigin` (which only fixed passkeys).\n\t */\n\tsiteUrl?: string;\n\n\t/**\n\t * Additional origins accepted by passkey verification.\n\t *\n\t * When the same EmDash deployment is reachable under several hostnames sharing\n\t * a registrable parent (e.g. `https://example.com` plus\n\t * `https://preview.example.com`), the canonical `siteUrl` defines the `rpId`\n\t * and the entries here are the *additional* origins from which assertions\n\t * are accepted. Each entry must be the same hostname as `siteUrl` or a\n\t * subdomain of it — WebAuthn requires `rpId` to be a registrable suffix of\n\t * every origin.\n\t *\n\t * Merged at runtime with the `EMDASH_ALLOWED_ORIGINS` env var (comma-separated).\n\t * Validation:\n\t * - Config-declared entries are shape-checked at Astro startup.\n\t * - Subdomain relationship to `siteUrl` is checked at startup when\n\t * `siteUrl` is also config-declared, otherwise at first passkey\n\t * verification (since `siteUrl` may come from `EMDASH_SITE_URL`).\n\t *\n\t * Mismatches throw with a source-attributed message naming\n\t * `config.allowedOrigins` or `EMDASH_ALLOWED_ORIGINS`.\n\t *\n\t * @example\n\t * ```ts\n\t * emdash({\n\t * siteUrl: \"https://example.com\",\n\t * allowedOrigins: [\"https://preview.example.com\"],\n\t * })\n\t * ```\n\t */\n\tallowedOrigins?: string[];\n\t/*\n\t * Headers to trust for client IP resolution when running behind a reverse\n\t * proxy. The first header in this list that is present on the request\n\t * wins. Applies to rate limiting for auth endpoints and comment\n\t * submission.\n\t *\n\t * Common values:\n\t * - `x-real-ip` — nginx, Caddy, Traefik\n\t * - `fly-client-ip` — Fly.io\n\t * - `x-forwarded-for` — generic (first entry is used)\n\t *\n\t * Only set this when you **control the reverse proxy**. Untrusted\n\t * clients can set any header they like; trusting headers from an open\n\t * network is an IP-spoofing vulnerability that defeats rate limiting.\n\t *\n\t * On Cloudflare the `cf` object on the request is used automatically —\n\t * you normally don't need to set this. Leave unset (or empty) to\n\t * preserve the default: IP is resolved only when the request came\n\t * through Cloudflare's edge.\n\t *\n\t * Falls back to `EMDASH_TRUSTED_PROXY_HEADERS` env var (comma-separated)\n\t * when this option is not set, so operators can configure at deploy\n\t * time without touching the Astro config.\n\t */\n\ttrustedProxyHeaders?: string[];\n\n\t/**\n\t * User middleware that wraps the complete EmDash request pipeline.\n\t *\n\t * Before `next()` it runs before EmDash initializes its runtime or database,\n\t * so `locals.emdash`, the authenticated user, and request-scoped EmDash state\n\t * are unavailable. This allows cached responses and request gates to return\n\t * without paying initialization cost. When it calls `next()`, the resolved\n\t * response includes EmDash HTML injection and all other response mutations,\n\t * allowing the middleware to finalize caching and response headers safely.\n\t */\n\tmiddleware?: {\n\t\t/** Astro middleware module entrypoint. */\n\t\touter: string | URL;\n\t};\n\n\t/**\n\t * Enable playground mode for ephemeral \"try EmDash\" sites.\n\t *\n\t * When set, the integration injects a playground middleware (order: \"pre\")\n\t * that runs BEFORE the normal EmDash middleware chain. It creates an\n\t * isolated Durable Object database per session, runs migrations, applies\n\t * the seed, creates an anonymous admin user, and sets the DB in ALS.\n\t * By the time the runtime middleware runs, the database is fully ready.\n\t *\n\t * Setup and auth middleware are skipped (the playground handles both).\n\t *\n\t * Requires `@emdash-cms/cloudflare` as a dependency and a DO binding\n\t * in wrangler.jsonc.\n\t *\n\t * @example\n\t * ```ts\n\t * emdash({\n\t * database: playgroundDatabase({ binding: \"PLAYGROUND_DB\" }),\n\t * playground: {\n\t * middlewareEntrypoint: \"@emdash-cms/cloudflare/db/playground-middleware\",\n\t * },\n\t * })\n\t * ```\n\t */\n\tplayground?: {\n\t\t/** Module path for the playground middleware. */\n\t\tmiddlewareEntrypoint: string;\n\t};\n\n\t/**\n\t * Media providers for browsing and uploading media\n\t *\n\t * The local media provider (using storage adapter) is available by default.\n\t * Additional providers can be added for external services like Unsplash,\n\t * Cloudinary, Mux, Cloudflare Images, etc.\n\t *\n\t * @example\n\t * ```ts\n\t * import { cloudflareImages, cloudflareStream } from \"@emdash-cms/cloudflare\";\n\t * import { unsplash } from \"@emdash-cms/provider-unsplash\";\n\t *\n\t * emdash({\n\t * mediaProviders: [\n\t * cloudflareImages({ accountId: \"...\" }),\n\t * cloudflareStream({ accountId: \"...\" }),\n\t * unsplash({ accessKey: \"...\" }),\n\t * ],\n\t * })\n\t * ```\n\t */\n\tmediaProviders?: MediaProviderDescriptor[];\n\n\t/**\n\t * Admin UI font configuration.\n\t *\n\t * By default, EmDash loads Noto Sans via the Astro Font API, covering\n\t * Latin, Latin Extended, Cyrillic, Cyrillic Extended, Greek, Greek\n\t * Extended, Devanagari, and Vietnamese. Fonts are downloaded from\n\t * Google at build time and self-hosted, so there are no runtime CDN\n\t * requests.\n\t *\n\t * To add support for additional writing systems (Arabic, CJK, etc.),\n\t * pass script names. EmDash resolves the matching Noto Sans variant\n\t * from Google Fonts and merges all script faces under a single\n\t * font-family, so the browser downloads only the glyphs it needs\n\t * via unicode-range.\n\t *\n\t * Set to `false` to disable font injection entirely and use system fonts.\n\t *\n\t * @example\n\t * ```ts\n\t * // Add Arabic and Japanese support\n\t * emdash({\n\t * fonts: {\n\t * scripts: [\"arabic\", \"japanese\"],\n\t * },\n\t * })\n\t * ```\n\t *\n\t * @example\n\t * ```ts\n\t * // Disable web fonts entirely (use system fonts)\n\t * emdash({\n\t * fonts: false,\n\t * })\n\t * ```\n\t */\n\tfonts?:\n\t\t| false\n\t\t| {\n\t\t\t\t/**\n\t\t\t\t * Additional Noto Sans script families to include.\n\t\t\t\t *\n\t\t\t\t * Available scripts: arabic, armenian, bengali, chinese-simplified,\n\t\t\t\t * chinese-traditional, chinese-hongkong, devanagari, ethiopic, farsi,\n\t\t\t\t * georgian, gujarati, gurmukhi, hebrew, japanese, kannada, khmer,\n\t\t\t\t * korean, lao, malayalam, myanmar, oriya, sinhala, tamil, telugu,\n\t\t\t\t * thai, tibetan.\n\t\t\t\t */\n\t\t\t\tscripts?: string[];\n\t\t };\n\n\t/**\n\t * Admin UI branding (white-labeling).\n\t *\n\t * Overrides the default EmDash logo and name in the admin panel.\n\t * Use this to white-label the CMS for agency or enterprise deployments.\n\t * These settings are separate from the public site settings (title, logo,\n\t * favicon) which remain available for SEO and front-end use.\n\t *\n\t * @example\n\t * ```ts\n\t * emdash({\n\t * admin: {\n\t * logo: \"/images/agency-logo.webp\",\n\t * siteName: \"AgencyX CMS\",\n\t * footerLabel: \"AgencyX\",\n\t * favicon: \"/favicon.ico\",\n\t * },\n\t * })\n\t * ```\n\t */\n\tadmin?: {\n\t\t/** URL or path to a custom logo image for the admin UI (login page, sidebar). */\n\t\tlogo?: string;\n\t\t/** Custom name displayed in the admin sidebar header and browser tab. */\n\t\tsiteName?: string;\n\t\t/** Label displayed beside the version in the sidebar footer. Set to false to hide it. */\n\t\tfooterLabel?: string | false;\n\t\t/** URL or path to a custom favicon for the admin panel. */\n\t\tfavicon?: string;\n\t};\n\n\t/**\n\t * Editor toolbar delivery on public pages.\n\t *\n\t * - `\"server\"` (default): the toolbar is injected server-side into every\n\t * HTML response rendered for an authenticated editor. Simple and\n\t * zero-config, but behind a shared cache (Cloudflare Cache Everything /\n\t * Workers Cache, Fastly, Varnish, …) editors often receive the cached\n\t * anonymous variant — without the toolbar — whenever an anonymous visitor\n\t * primed the cache first, so the toolbar appears and disappears with\n\t * cache state.\n\t * - `\"client\"`: public HTML is identical for everyone (nothing\n\t * session-specific is injected server-side, so shared caches stay fully\n\t * effective). A tiny bootstrap script shows an \"Edit\" pill for browsers\n\t * that have logged into the admin (non-secret localStorage flag). Clicking\n\t * it verifies the session and reloads the page with an `_edit` query\n\t * param, which is always rendered fresh (never cached) with the full\n\t * toolbar. Logged-out visitors opening an `_edit` URL are redirected to\n\t * the canonical URL.\n\t * - `false`: never render the toolbar or bootstrap script.\n\t *\n\t * See the visual-editing docs for the cache-behavior details.\n\t */\n\ttoolbar?: \"server\" | \"client\" | false;\n\n\t/**\n\t * Version of Astro the host project is building with. Populated by the\n\t * integration's `astro:config:setup` hook (not authored by the user) and\n\t * surfaced to the admin and the registry install gate so a plugin's\n\t * `env:astro` requirement can be evaluated against the real host version.\n\t */\n\tastroVersion?: string;\n}\n\nconst STORED_CONFIG_KEY = Symbol.for(\"emdash:stored-config\");\nconst configHolder = globalThis as Record<symbol, unknown>;\n\n/**\n * Get stored config from global\n * This is set by the virtual module at build time\n */\nexport function getStoredConfig(): EmDashConfig | null {\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- globalThis singleton pattern (see request-context.ts)\n\treturn (configHolder[STORED_CONFIG_KEY] as EmDashConfig | undefined) ?? null;\n}\n\n/**\n * Set stored config in global\n * Called by the integration at config time\n */\nexport function setStoredConfig(config: EmDashConfig): void {\n\tconfigHolder[STORED_CONFIG_KEY] = config;\n}\n","/**\n * EmDash Astro Integration\n *\n * This integration:\n * - Injects the admin shell route at /_emdash/admin/[...path].astro\n * - Sets up REST API endpoints under /_emdash/api/*\n * - Configures middleware to provide database and manifest\n *\n * NOTE: This file is for build-time only. Runtime utilities are in runtime.ts\n * to avoid bundling Node.js-only code into the production build.\n */\n\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\n\nimport type { AstroIntegration, AstroIntegrationLogger, AstroIntegrationMiddleware } from \"astro\";\n\nimport { validateAllowedOrigins, validateOriginShape } from \"../../auth/allowed-origins.js\";\nimport { normalizeMigrationConfig } from \"../../database/migrations/policy.js\";\nimport { normalizeAstroI18n } from \"../../i18n/normalize.js\";\nimport { INTERNAL_MEDIA_PREFIX } from \"../../media/normalize.js\";\nimport { getCoreMigrationIdentity } from \"../../migrations/identity.js\";\nimport {\n\tcreateMigrationIntegrationMetadata,\n\tMIGRATION_CONFIG_SYMBOL,\n} from \"../../migrations/integration-metadata.js\";\nimport { buildMigrationManifest } from \"../../migrations/manifest-builder.js\";\nimport { writeMigrationManifest } from \"../../migrations/manifest-writer.js\";\nimport type { ResolvedPlugin } from \"../../plugins/types.js\";\nimport {\n\tnormalizeRegistryConfig,\n\tparseDurationSeconds,\n\tresolveRegistryConfigForSandbox,\n} from \"../../registry/config.js\";\nimport { VERSION } from \"../../version.js\";\nimport { local } from \"../storage/adapters.js\";\nimport { createDebouncedTypegenRefresh, listenForDevTypegenRefresh } from \"./dev-typegen.js\";\nimport { notoSans } from \"./font-provider.js\";\nimport {\n\tinjectCoreRoutes,\n\tinjectBuiltinAuthRoutes,\n\tinjectAuthProviderRoutes,\n\tinjectMcpRoute,\n} from \"./routes.js\";\nimport type { EmDashConfig } from \"./runtime.js\";\nimport { createViteConfig } from \"./vite-config.js\";\n\n// Re-export runtime types and functions\nexport type {\n\tEmDashConfig,\n\tPluginDescriptor,\n\tSandboxedPluginDescriptor,\n\tResolvedPlugin,\n} from \"./runtime.js\";\nexport { getStoredConfig } from \"./runtime.js\";\n\n/**\n * Resolve the version of Astro the host project is building with, by reading\n * `astro/package.json` from the project's own dependency tree. Surfaced to the\n * admin and the registry install gate so a plugin's `env:astro` constraint can\n * be evaluated against the real host version. Returns `undefined` if Astro\n * can't be resolved (shouldn't happen in a real build, but never throw here).\n */\nfunction resolveAstroVersion(): string | undefined {\n\ttry {\n\t\tconst require = createRequire(import.meta.url);\n\t\tconst pkg = require(\"astro/package.json\") as { version?: unknown };\n\t\treturn typeof pkg.version === \"string\" ? pkg.version : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** Default storage: Local filesystem in .emdash directory */\nconst DEFAULT_STORAGE = local({\n\tdirectory: \"./.emdash/uploads\",\n\tbaseUrl: \"/_emdash/api/media/file\",\n});\n\ninterface ImageRemotePattern {\n\tprotocol?: \"http\" | \"https\";\n\thostname?: string;\n\tpathname?: string;\n}\n\n/**\n * Build `image.remotePatterns` entries so Astro will optimize EmDash media.\n *\n * Astro's image services only build a transform URL for sources allowed via\n * `image.domains` / `image.remotePatterns` (relative URLs are never optimized —\n * see `isRemoteAllowed`). We authorize the media sources automatically:\n *\n * 1. The storage adapter's public URL host (R2 custom domain, S3/CDN).\n * 2. The site's own origin, scoped to the media proxy route\n * (`/_emdash/api/media/file/**`), so same-origin proxied media is optimized.\n * The components absolutize the media URL against this origin; EmDash's\n * wrapped image endpoint then serves the bytes from storage (so the absolute\n * URL is never fetched). Only registered when `siteUrl` is known at build.\n * 3. In `astro dev` the dev-server origin isn't known at build time, so we\n * register a host-agnostic pattern scoped to the media route. Dev-only.\n *\n * Returns an empty array when no source is statically known (production build,\n * local storage, no `siteUrl`), in which case media renders as a plain `<img>`.\n *\n * @internal Exported for unit testing.\n */\nexport function buildImageRemotePatterns(\n\tstorage: { config?: unknown } | undefined,\n\tsiteUrl: string | undefined,\n\tcommand: \"dev\" | \"build\" | \"preview\" | \"sync\",\n): ImageRemotePattern[] {\n\tconst patterns: ImageRemotePattern[] = [];\n\n\tconst config = storage?.config;\n\tconst publicUrl =\n\t\tconfig && typeof config === \"object\"\n\t\t\t? (config as { publicUrl?: unknown }).publicUrl\n\t\t\t: undefined;\n\tif (typeof publicUrl === \"string\" && publicUrl) {\n\t\ttry {\n\t\t\tconst url = new URL(publicUrl);\n\t\t\t// Only authorize http(s) hosts — a `file:`/`ftp:` URL is not a media\n\t\t\t// origin Astro can fetch.\n\t\t\tif (url.protocol === \"http:\" || url.protocol === \"https:\") {\n\t\t\t\tconst pattern: ImageRemotePattern = {\n\t\t\t\t\tprotocol: url.protocol === \"http:\" ? \"http\" : \"https\",\n\t\t\t\t\thostname: url.hostname,\n\t\t\t\t};\n\t\t\t\t// When the public URL has a path prefix (CDN sub-path), scope the\n\t\t\t\t// pattern to it so we don't authorize the entire host. Media keys\n\t\t\t\t// are appended as `${publicUrl}/${key}`, so the prefix is exact.\n\t\t\t\tconst prefix = url.pathname.endsWith(\"/\") ? url.pathname.slice(0, -1) : url.pathname;\n\t\t\t\tif (prefix && prefix !== \"/\") {\n\t\t\t\t\tpattern.pathname = `${prefix}/**`;\n\t\t\t\t}\n\t\t\t\tpatterns.push(pattern);\n\t\t\t}\n\t\t} catch {\n\t\t\t// ignore an unparseable public URL\n\t\t}\n\t}\n\n\tif (siteUrl) {\n\t\ttry {\n\t\t\tpatterns.push({\n\t\t\t\thostname: new URL(siteUrl).hostname,\n\t\t\t\tpathname: `${INTERNAL_MEDIA_PREFIX}**`,\n\t\t\t});\n\t\t} catch {\n\t\t\t// ignore an unparseable site URL\n\t\t}\n\t}\n\n\tif (command === \"dev\") {\n\t\tpatterns.push({ pathname: `${INTERNAL_MEDIA_PREFIX}**` });\n\t}\n\n\treturn patterns;\n}\n\n/**\n * Build the config subset baked into `virtual:emdash/config` and exposed\n * at runtime as `locals.emdash.config`. A config option that runtime code\n * reads (routes, middleware) MUST be listed here — an option only on\n * `EmDashConfig` is invisible at runtime and silently ignored.\n *\n * @internal Exported for unit testing.\n */\nexport function buildSerializableConfig(resolvedConfig: EmDashConfig): Record<string, unknown> {\n\treturn {\n\t\tdatabase: resolvedConfig.database,\n\t\tmigrations: resolvedConfig.migrations,\n\t\tstorage: resolvedConfig.storage,\n\t\tauth: resolvedConfig.auth,\n\t\tauthProviders: resolvedConfig.authProviders,\n\t\tmarketplace: resolvedConfig.marketplace,\n\t\tregistry: resolvedConfig.registry,\n\t\tsiteUrl: resolvedConfig.siteUrl,\n\t\ttrustedProxyHeaders: resolvedConfig.trustedProxyHeaders,\n\t\tmaxUploadSize: resolvedConfig.maxUploadSize,\n\t\tadmin: resolvedConfig.admin,\n\t\ttoolbar: resolvedConfig.toolbar,\n\t\tupdateCheck: resolvedConfig.updateCheck,\n\t\tobjectCacheEnabled: resolvedConfig.objectCache !== undefined,\n\t};\n}\n\n/**\n * Stock image endpoints EmDash may safely replace with its storage-backed\n * wrapper. Our wrapper delegates non-EmDash images to the platform's transform\n * endpoint, so we only override endpoints whose transform we can delegate to.\n */\nconst OVERRIDABLE_IMAGE_ENDPOINTS = new Set([\n\t\"astro/assets/endpoint/generic\",\n\t\"astro/assets/endpoint/node\",\n\t\"astro/assets/endpoint/dev\",\n\t\"@astrojs/cloudflare/image-transform-endpoint\",\n]);\n\n/**\n * Stock endpoints that deliberately don't transform (the user opted into\n * passthrough). We leave these untouched -- and without a warning, since it's a\n * supported choice, not a custom endpoint. Overriding would route non-EmDash\n * images through a transformer the passthrough setup doesn't provide.\n */\nconst PASSTHROUGH_IMAGE_ENDPOINTS = new Set([\"@astrojs/cloudflare/image-passthrough-endpoint\"]);\n\n/**\n * Decide which image endpoint to install (if any). EmDash wraps Astro's image\n * endpoint so EmDash media bytes load from storage; the wrapper delegates other\n * images back to the platform's stock endpoint.\n *\n * Returns `{ entrypoint }` to install, `{ warn }` to skip with a warning (a\n * custom endpoint we can't delegate to), or `{}` to skip silently (opted out).\n *\n * @internal Exported for unit testing.\n */\nexport function resolveImageEndpoint(opts: {\n\timagesDisabled: boolean;\n\tcurrentEntrypoint: string | undefined;\n\tisCloudflare: boolean;\n}): { entrypoint?: string; warn?: string } {\n\tif (opts.imagesDisabled) return {};\n\tconst current = opts.currentEntrypoint;\n\tif (current === undefined || OVERRIDABLE_IMAGE_ENDPOINTS.has(current)) {\n\t\treturn {\n\t\t\tentrypoint: opts.isCloudflare\n\t\t\t\t? \"@emdash-cms/cloudflare/image-endpoint\"\n\t\t\t\t: \"emdash/internal/image-endpoint\",\n\t\t};\n\t}\n\t// A deliberate passthrough setup: leave it alone, no warning.\n\tif (PASSTHROUGH_IMAGE_ENDPOINTS.has(current)) return {};\n\treturn {\n\t\twarn:\n\t\t\t`A custom image.endpoint (${current}) is configured; EmDash will not wrap ` +\n\t\t\t`it, so storage-backed media may render unoptimized.`,\n\t};\n}\n\nconst EDGE_SLASHES = /^\\/+|\\/+$/g;\n\n/**\n * The `routePattern` Astro reports for requests to the image endpoint. It drops\n * the trailing slash `image.endpoint.route` carries under `trailingSlash: \"always\"`.\n *\n * @internal\n */\nexport function imageEndpointRoutePattern(route: string | undefined): string {\n\treturn `/${(route ?? \"/_image\").replace(EDGE_SLASHES, \"\")}`;\n}\n\n/**\n * Warn when `@astrojs/react` is not registered in the host's `integrations`.\n *\n * The admin SPA is a React app hydrated via `client:only=\"react\"`. Without the\n * React integration the build succeeds and the admin route returns 200, but the\n * bundle never hydrates -- the page sits on \"Loading EmDash...\" forever with no\n * error anywhere (#962). Checked in `astro:config:done` so integrations added\n * by other integrations are visible too.\n *\n * @internal Exported for unit testing.\n */\nexport function missingReactIntegrationWarning(\n\tintegrations: readonly { name: string }[],\n): string | undefined {\n\tif (integrations.some((integration) => integration.name === \"@astrojs/react\")) {\n\t\treturn undefined;\n\t}\n\treturn (\n\t\t`@astrojs/react is not registered in your Astro config. The EmDash admin UI ` +\n\t\t`will not hydrate without it (the page stays on \"Loading EmDash...\"). ` +\n\t\t`Add it to your integrations:\\n\\n` +\n\t\t` import react from \"@astrojs/react\";\\n` +\n\t\t` export default defineConfig({\\n` +\n\t\t` integrations: [react(), emdash({ ... })],\\n` +\n\t\t` });`\n\t);\n}\n\n/**\n * Warn when Astro has no session driver. Sign-in stores the user in the Astro\n * session, so without a driver every sign-in route fails. The Node, Cloudflare,\n * and Netlify adapters configure a driver in `astro:config:setup`; others,\n * such as Vercel, do not.\n */\nfunction missingSessionDriverWarning(\n\tsession: { driver?: unknown } | false | undefined,\n): string | undefined {\n\tif (session && session.driver) return undefined;\n\tconst problem =\n\t\tsession === false\n\t\t\t? `Astro sessions are disabled (\\`session: false\\`), but EmDash stores signed-in users in the Astro session.`\n\t\t\t: `No Astro session driver is configured, but EmDash stores signed-in users in the Astro session.`;\n\treturn (\n\t\t`${problem} Without one, signing in to the admin fails. Use an adapter that ` +\n\t\t`provides a driver (Node, Cloudflare, Netlify) or configure one yourself, for example:\\n\\n` +\n\t\t` import { defineConfig, sessionDrivers } from \"astro/config\";\\n` +\n\t\t` export default defineConfig({\\n` +\n\t\t` session: { driver: sessionDrivers.redis({ url: process.env.REDIS_URL }) },\\n` +\n\t\t` });\\n\\n` +\n\t\t`See https://docs.astro.build/en/guides/sessions/`\n\t);\n}\n\n// Terminal formatting\nconst dim = (s: string) => `\\x1b[2m${s}\\x1b[22m`;\nconst bold = (s: string) => `\\x1b[1m${s}\\x1b[22m`;\nconst cyan = (s: string) => `\\x1b[36m${s}\\x1b[39m`;\n\n/** Print the EmDash startup banner */\nfunction printBanner(_logger: AstroIntegrationLogger): void {\n\tconst banner = `\n\n ${bold(cyan(\"— E M D A S H —\"))} ${dim(`v${VERSION}`)}\n `;\n\tconsole.log(banner);\n}\n\n/**\n * Print dev-server route info with absolute (clickable) URLs, including the\n * dev-bypass shortcut that skips passkey auth. Dev only -- the dev-bypass\n * endpoint returns 403 in production.\n */\nfunction printDevServerInfo(baseUrl: string, mcpEnabled: boolean): void {\n\tconst devBypassUrl = `${baseUrl}/_emdash/api/setup/dev-bypass?redirect=/_emdash/admin`;\n\tconsole.log(`\\n ${dim(\"›\")} Admin UI ${cyan(`${baseUrl}/_emdash/admin`)}`);\n\tif (mcpEnabled) {\n\t\tconsole.log(` ${dim(\"›\")} MCP server ${cyan(`${baseUrl}/_emdash/api/mcp`)}`);\n\t}\n\tconsole.log(` ${dim(\"›\")} Dev bypass ${cyan(devBypassUrl)}`);\n\tconsole.log(` ${dim(\"Skips passkey setup/auth and signs you in as a dev admin\")}`);\n\tconsole.log(\"\");\n}\n\nexport function buildMiddlewareEntries(\n\tconfig: Pick<EmDashConfig, \"middleware\" | \"playground\">,\n\troot: URL,\n): AstroIntegrationMiddleware[] {\n\tconst entries: AstroIntegrationMiddleware[] = [];\n\n\tif (config.middleware !== undefined) {\n\t\tconst configuredEntrypoint = config.middleware?.outer;\n\t\tif (\n\t\t\t(typeof configuredEntrypoint !== \"string\" && !(configuredEntrypoint instanceof URL)) ||\n\t\t\t(typeof configuredEntrypoint === \"string\" && configuredEntrypoint.trim() === \"\")\n\t\t) {\n\t\t\tthrow new Error(\"middleware.outer must be a non-empty module specifier string or URL.\");\n\t\t}\n\t\tconst entrypoint =\n\t\t\ttypeof configuredEntrypoint === \"string\" &&\n\t\t\t(configuredEntrypoint.startsWith(\"./\") || configuredEntrypoint.startsWith(\"../\"))\n\t\t\t\t? new URL(configuredEntrypoint, root)\n\t\t\t\t: configuredEntrypoint;\n\t\tentries.push({\n\t\t\tentrypoint,\n\t\t\torder: \"pre\",\n\t\t});\n\t}\n\n\tif (config.playground) {\n\t\tentries.push({\n\t\t\tentrypoint: config.playground.middlewareEntrypoint,\n\t\t\torder: \"pre\",\n\t\t});\n\t}\n\n\tentries.push(\n\t\t{ entrypoint: \"emdash/middleware\", order: \"pre\" },\n\t\t{ entrypoint: \"emdash/internal/middleware/redirect\", order: \"pre\" },\n\t);\n\n\tif (!config.playground) {\n\t\tentries.push(\n\t\t\t{ entrypoint: \"emdash/internal/middleware/setup\", order: \"pre\" },\n\t\t\t{ entrypoint: \"emdash/internal/middleware/auth\", order: \"pre\" },\n\t\t);\n\t}\n\n\tentries.push(\n\t\t{ entrypoint: \"emdash/internal/middleware/media-usage-write-fence\", order: \"pre\" },\n\t\t{ entrypoint: \"emdash/internal/middleware/request-context\", order: \"pre\" },\n\t);\n\n\treturn entries;\n}\n\nfunction assertNoRemovedRegistryOption(config: EmDashConfig): void {\n\tconst experimental: unknown = Reflect.get(config, \"experimental\");\n\tif (\n\t\ttypeof experimental === \"object\" &&\n\t\texperimental !== null &&\n\t\tReflect.get(experimental, \"registry\") !== undefined\n\t) {\n\t\tthrow new Error(\n\t\t\t\"EmDash config: `experimental.registry` has been removed. Configure the registry with the top-level `registry` option instead.\",\n\t\t);\n\t}\n}\n\n/**\n * Create the EmDash Astro integration\n */\nexport function emdash(config: EmDashConfig = {}): AstroIntegration {\n\tassertNoRemovedRegistryOption(config);\n\n\tconst registry = resolveRegistryConfigForSandbox({\n\t\tregistry: config.registry,\n\t\tsandboxRunner: config.sandboxRunner,\n\t\tsandboxEnabled: config.sandbox !== false,\n\t});\n\n\t// Apply defaults\n\tconst resolvedConfig: EmDashConfig = {\n\t\t...config,\n\t\tstorage: config.storage ?? DEFAULT_STORAGE,\n\t\tmigrations: normalizeMigrationConfig(config.migrations),\n\t\tregistry: config.registry === false ? false : registry,\n\t};\n\n\t// Validate environment-independent registry settings while Astro is still\n\t// evaluating its config. The command-aware check in astro:config:setup\n\t// applies the stricter production localhost policy.\n\tnormalizeRegistryConfig(registry, { allowLocalhost: true });\n\n\tconst updateCheckAge =\n\t\ttypeof resolvedConfig.updateCheck === \"object\"\n\t\t\t? resolvedConfig.updateCheck?.minimumReleaseAge\n\t\t\t: undefined;\n\tif (updateCheckAge !== undefined) {\n\t\ttry {\n\t\t\tparseDurationSeconds(updateCheckAge);\n\t\t} catch (e) {\n\t\t\tthrow new Error(`Invalid updateCheck.minimumReleaseAge: ${String(updateCheckAge)}`, {\n\t\t\t\tcause: e,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Validate marketplace URL\n\tif (resolvedConfig.marketplace) {\n\t\tconst url = resolvedConfig.marketplace;\n\t\ttry {\n\t\t\tconst parsed = new URL(url);\n\t\t\tconst isLocalhost = parsed.hostname === \"localhost\" || parsed.hostname === \"127.0.0.1\";\n\t\t\tif (parsed.protocol !== \"https:\" && !isLocalhost) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Marketplace URL must use HTTPS (got ${parsed.protocol}). ` +\n\t\t\t\t\t\t`Only localhost URLs are allowed over HTTP.`,\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tif (e instanceof TypeError) {\n\t\t\t\tthrow new Error(`Invalid marketplace URL: \"${url}\"`, { cause: e });\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\t// Validate siteUrl if provided in astro.config.mjs.\n\t// Env-var fallback (EMDASH_SITE_URL / SITE_URL) is handled at runtime by\n\t// getPublicOrigin() in api/public-url.ts — NOT here — so Docker images built\n\t// without a domain can pick it up at container start via process.env.\n\tif (resolvedConfig.siteUrl) {\n\t\tconst raw = resolvedConfig.siteUrl;\n\t\ttry {\n\t\t\tconst parsed = new URL(raw);\n\t\t\tif (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n\t\t\t\tthrow new Error(`siteUrl must be http or https (got ${parsed.protocol})`);\n\t\t\t}\n\t\t\t// Always store origin-normalized value (no path) — security invariant L-1\n\t\t\tresolvedConfig.siteUrl = parsed.origin;\n\t\t} catch (e) {\n\t\t\tif (e instanceof TypeError) {\n\t\t\t\tthrow new Error(`Invalid siteUrl: \"${raw}\"`, { cause: e });\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\t// Validate config.allowedOrigins shape at startup (per-entry rules: parseable,\n\t// http(s), no trailing dots, no empty labels). The siteUrl-dependent rules\n\t// (Rule A: requires siteUrl; Rule B: must be a subdomain of siteUrl) are\n\t// deferred to runtime when config.siteUrl is absent — EMDASH_SITE_URL may\n\t// supply it post-build, just like the env-var fallback for siteUrl above.\n\t// When config.siteUrl IS present, run the full validator here for fail-fast.\n\tif (resolvedConfig.allowedOrigins?.length) {\n\t\tconst tagged = resolvedConfig.allowedOrigins.map((origin) => ({\n\t\t\torigin,\n\t\t\tsource: \"config.allowedOrigins\" as const,\n\t\t}));\n\t\tresolvedConfig.allowedOrigins = resolvedConfig.siteUrl\n\t\t\t? validateAllowedOrigins(resolvedConfig.siteUrl, tagged)\n\t\t\t: validateOriginShape(tagged);\n\t}\n\n\t// Plugin descriptors from config\n\tconst pluginDescriptors = resolvedConfig.plugins ?? [];\n\tconst sandboxedDescriptors = resolvedConfig.sandboxed ?? [];\n\n\t// Validate all plugin descriptors\n\tfor (const descriptor of [...pluginDescriptors, ...sandboxedDescriptors]) {\n\t\t// Standard-format plugins can't use features that require trusted mode\n\t\tif (descriptor.format === \"standard\") {\n\t\t\tif (descriptor.adminEntry) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Plugin \"${descriptor.id}\" is standard format but declares adminEntry. ` +\n\t\t\t\t\t\t`Standard plugins use Block Kit for admin UI, not React components. ` +\n\t\t\t\t\t\t`Remove adminEntry or change format to \"native\".`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (descriptor.componentsEntry) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Plugin \"${descriptor.id}\" is standard format but declares componentsEntry. ` +\n\t\t\t\t\t\t`Portable Text block components require native format. ` +\n\t\t\t\t\t\t`Remove componentsEntry or change format to \"native\".`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Validate: non-standard plugins cannot be placed in sandboxed: []\n\tfor (const descriptor of sandboxedDescriptors) {\n\t\tif (descriptor.format !== \"standard\") {\n\t\t\tthrow new Error(\n\t\t\t\t`Plugin \"${descriptor.id}\" uses the native format and cannot be placed in ` +\n\t\t\t\t\t`\\`sandboxed: []\\`. Native plugins can only run in \\`plugins: []\\`. ` +\n\t\t\t\t\t`To sandbox this plugin, convert it to the standard format.`,\n\t\t\t);\n\t\t}\n\t}\n\n\t// Resolved plugins (populated at build time by importing entrypoints)\n\tlet _resolvedPlugins: ResolvedPlugin[] = [];\n\n\t// Serialize config for virtual module (database/storage/auth - plugins handled separately)\n\t// i18n is populated in astro:config:setup from astroConfig.i18n\n\tconst serializableConfig = buildSerializableConfig(resolvedConfig);\n\n\t// Determine auth mode for route injection\n\t// Check if auth is an AuthDescriptor (has entrypoint) indicating external auth\n\tconst useExternalAuth = !!(resolvedConfig.auth && \"entrypoint\" in resolvedConfig.auth);\n\n\t// Captured in astro:config:setup so the astro:server:setup hook can tell\n\t// whether we're running `astro dev` (where the dev-bypass shortcut applies).\n\tlet astroCommand: \"dev\" | \"build\" | \"preview\" | \"sync\" | undefined;\n\tlet normalizedI18n: ReturnType<typeof normalizeAstroI18n> = null;\n\tconst migrationMetadata = createMigrationIntegrationMetadata(resolvedConfig.database);\n\n\tconst integration: AstroIntegration = {\n\t\tname: \"emdash\",\n\t\thooks: {\n\t\t\t\"astro:config:setup\": ({\n\t\t\t\tinjectRoute: astroInjectRoute,\n\t\t\t\taddMiddleware,\n\t\t\t\tlogger,\n\t\t\t\tupdateConfig,\n\t\t\t\tconfig: astroConfig,\n\t\t\t\tcommand,\n\t\t\t}) => {\n\t\t\t\tastroCommand = command;\n\t\t\t\tnormalizeRegistryConfig(registry, {\n\t\t\t\t\tallowLocalhost: command === \"dev\" || command === \"sync\",\n\t\t\t\t});\n\t\t\t\tprintBanner(logger);\n\t\t\t\t// Capture the host's Astro version so the runtime can expose it\n\t\t\t\t// to the admin and the registry install gate for `env:astro`\n\t\t\t\t// constraint checks.\n\t\t\t\tconst astroVersion = resolveAstroVersion();\n\t\t\t\tif (astroVersion !== undefined) {\n\t\t\t\t\tserializableConfig.astroVersion = astroVersion;\n\t\t\t\t}\n\t\t\t\t// EmDashHead must not access Astro.csp when the host has disabled\n\t\t\t\t// Astro's built-in CSP runtime; Astro logs a warning for that access.\n\t\t\t\tserializableConfig.astroCspEnabled = Boolean(astroConfig.security.csp);\n\t\t\t\t// Expose Astro's trailingSlash routing policy so plugins can build\n\t\t\t\t// URLs (sitemap/canonical/hreflang) that match what the site serves.\n\t\t\t\tserializableConfig.trailingSlash = astroConfig.trailingSlash;\n\t\t\t\tnormalizedI18n = normalizeAstroI18n(astroConfig.i18n);\n\t\t\t\tif (normalizedI18n) serializableConfig.i18n = normalizedI18n;\n\n\t\t\t\t// Disable Astro's built-in checkOrigin -- EmDash's own CSRF\n\t\t\t\t// layer (checkPublicCsrf in api/csrf.ts) handles origin\n\t\t\t\t// validation with dual-origin support: it accepts both the\n\t\t\t\t// internal origin AND the public origin from getPublicOrigin(),\n\t\t\t\t// which resolves siteUrl from config or env vars at runtime.\n\t\t\t\t// Astro's check can't do this because allowedDomains is baked\n\t\t\t\t// at build time, which breaks Docker deployments where the\n\t\t\t\t// domain is only known at container start via EMDASH_SITE_URL.\n\t\t\t\t//\n\t\t\t\t// When siteUrl is known at build time, also set allowedDomains\n\t\t\t\t// so Astro.url reflects the public origin (helps user template\n\t\t\t\t// code that reads Astro.url directly).\n\t\t\t\tconst securityConfig: Record<string, unknown> = {\n\t\t\t\t\tcheckOrigin: false,\n\t\t\t\t\t...(resolvedConfig.siteUrl\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tallowedDomains: [{ hostname: new URL(resolvedConfig.siteUrl).hostname }],\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t};\n\n\t\t\t\t// Inject default Noto Sans font for the admin UI.\n\t\t\t\t// Uses the Astro Font API so fonts are downloaded at build time\n\t\t\t\t// and self-hosted (no runtime CDN requests).\n\t\t\t\t//\n\t\t\t\t// The admin CSS references var(--font-emdash) with a system font\n\t\t\t\t// fallback. Users can add extra script coverage (Arabic, CJK, etc.)\n\t\t\t\t// by passing fonts.scripts in the emdash() config. The custom\n\t\t\t\t// notoSans provider resolves all script families from Google Fonts\n\t\t\t\t// under a single font-family name, so they stack via unicode-range.\n\t\t\t\tconst fontsConfig = resolvedConfig.fonts;\n\t\t\t\tconst emdashFonts =\n\t\t\t\t\tfontsConfig === false\n\t\t\t\t\t\t? []\n\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tprovider: notoSans({\n\t\t\t\t\t\t\t\t\t\tscripts: fontsConfig?.scripts,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\tname: \"Noto Sans\",\n\t\t\t\t\t\t\t\t\tcssVariable: \"--font-emdash\",\n\t\t\t\t\t\t\t\t\tweights: [\"100 900\" as const],\n\t\t\t\t\t\t\t\t\tstyles: [\"normal\" as const, \"italic\" as const],\n\t\t\t\t\t\t\t\t\tsubsets: [\n\t\t\t\t\t\t\t\t\t\t\"latin\" as const,\n\t\t\t\t\t\t\t\t\t\t\"latin-ext\" as const,\n\t\t\t\t\t\t\t\t\t\t\"cyrillic\" as const,\n\t\t\t\t\t\t\t\t\t\t\"cyrillic-ext\" as const,\n\t\t\t\t\t\t\t\t\t\t\"devanagari\" as const,\n\t\t\t\t\t\t\t\t\t\t\"greek\" as const,\n\t\t\t\t\t\t\t\t\t\t\"greek-ext\" as const,\n\t\t\t\t\t\t\t\t\t\t\"vietnamese\" as const,\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tfallbacks: [\"ui-sans-serif\", \"system-ui\", \"sans-serif\"],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t];\n\n\t\t\t\t// Authorize media sources so Astro's image service builds transform\n\t\t\t\t// URLs for them (it won't optimize an un-allowed source). `updateConfig`\n\t\t\t\t// merges arrays, so user-configured remotePatterns are preserved.\n\t\t\t\tconst imageRemotePatterns = buildImageRemotePatterns(\n\t\t\t\t\tresolvedConfig.storage,\n\t\t\t\t\tresolvedConfig.siteUrl,\n\t\t\t\t\tcommand,\n\t\t\t\t);\n\n\t\t\t\t// Wrap Astro's image endpoint so EmDash media bytes load straight from\n\t\t\t\t// storage (Access-safe) instead of over HTTP. Skip when the user opts\n\t\t\t\t// out or has a custom endpoint we can't delegate back to.\n\t\t\t\tconst { entrypoint: imageEndpoint, warn: imageEndpointWarning } = resolveImageEndpoint({\n\t\t\t\t\timagesDisabled: resolvedConfig.images === false,\n\t\t\t\t\tcurrentEntrypoint: astroConfig.image?.endpoint?.entrypoint,\n\t\t\t\t\tisCloudflare: astroConfig.adapter?.name === \"@astrojs/cloudflare\",\n\t\t\t\t});\n\t\t\t\tif (imageEndpointWarning) logger.warn(imageEndpointWarning);\n\n\t\t\t\tconst imageConfig: Record<string, unknown> = {};\n\t\t\t\tif (imageRemotePatterns.length) imageConfig.remotePatterns = imageRemotePatterns;\n\t\t\t\tif (imageEndpoint) {\n\t\t\t\t\timageConfig.endpoint = { entrypoint: imageEndpoint };\n\t\t\t\t\tserializableConfig.imageEndpointRoute = imageEndpointRoutePattern(\n\t\t\t\t\t\tastroConfig.image?.endpoint?.route,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tupdateConfig({\n\t\t\t\t\tsecurity: securityConfig,\n\t\t\t\t\t...(Object.keys(imageConfig).length ? { image: imageConfig } : {}),\n\t\t\t\t\t// fonts is a valid AstroConfig key but may not be in the\n\t\t\t\t\t// type definition for the minimum supported Astro version\n\t\t\t\t\t...({ fonts: emdashFonts } as Record<string, unknown>),\n\t\t\t\t\tvite: createViteConfig(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tserializableConfig,\n\t\t\t\t\t\t\tresolvedConfig,\n\t\t\t\t\t\t\tpluginDescriptors,\n\t\t\t\t\t\t\tastroConfig,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcommand,\n\t\t\t\t\t),\n\t\t\t\t});\n\n\t\t\t\t// Astro reads a route's `export const prerender` by matching the file's\n\t\t\t\t// source text, which the compiled route modules don't match. Without an\n\t\t\t\t// explicit value, `output: \"static\"` would prerender them.\n\t\t\t\tconst injectRoute: typeof astroInjectRoute = (route) =>\n\t\t\t\t\tastroInjectRoute({ ...route, prerender: false });\n\n\t\t\t\t// Inject all core routes\n\t\t\t\tinjectCoreRoutes(injectRoute, { srcDir: astroConfig.srcDir });\n\n\t\t\t\t// Inject routes from pluggable auth providers (authProviders config)\n\t\t\t\tif (resolvedConfig.authProviders?.length) {\n\t\t\t\t\tinjectAuthProviderRoutes(injectRoute, resolvedConfig.authProviders);\n\t\t\t\t}\n\n\t\t\t\t// Inject passkey/oauth/magic-link routes unless transparent external auth is active\n\t\t\t\tif (!useExternalAuth) {\n\t\t\t\t\tinjectBuiltinAuthRoutes(injectRoute);\n\t\t\t\t}\n\n\t\t\t\t// Inject MCP endpoint (always on — bearer-token-only, no cost if unused)\n\t\t\t\tif (resolvedConfig.mcp !== false) {\n\t\t\t\t\tinjectMcpRoute(injectRoute);\n\t\t\t\t}\n\n\t\t\t\tfor (const middleware of buildMiddlewareEntries(resolvedConfig, astroConfig.root)) {\n\t\t\t\t\taddMiddleware(middleware);\n\t\t\t\t}\n\n\t\t\t\t// Route info is printed with absolute, clickable URLs once the\n\t\t\t\t// dev server is listening (see astro:server:setup), since the\n\t\t\t\t// port isn't known yet here. Nothing useful to print for build.\n\t\t\t},\n\t\t\t\"astro:config:done\": async ({ config: finalConfig, logger }) => {\n\t\t\t\tconst warning = missingReactIntegrationWarning(finalConfig.integrations);\n\t\t\t\tif (warning) logger.warn(warning);\n\t\t\t\tconst sessionWarning = useExternalAuth\n\t\t\t\t\t? undefined\n\t\t\t\t\t: missingSessionDriverWarning(finalConfig.session);\n\t\t\t\tif (sessionWarning) logger.warn(sessionWarning);\n\n\t\t\t\tif (astroCommand !== \"build\" && astroCommand !== \"sync\") return;\n\t\t\t\tif (!migrationMetadata.database) {\n\t\t\t\t\tlogger.warn(\n\t\t\t\t\t\t\"EmDash migration manifest was not written because no database adapter is configured.\",\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!migrationMetadata.database.migrations) {\n\t\t\t\t\tlogger.warn(\n\t\t\t\t\t\t\"EmDash migration manifest was not written because the configured database adapter does not support deployment migrations.\",\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst identity = await getCoreMigrationIdentity();\n\t\t\t\tconst manifest = await buildMigrationManifest({\n\t\t\t\t\tidentity,\n\t\t\t\t\ti18n: normalizedI18n,\n\t\t\t\t\tdatabase: migrationMetadata.database,\n\t\t\t\t});\n\t\t\t\tawait writeMigrationManifest(fileURLToPath(finalConfig.root), manifest);\n\t\t\t},\n\t\t\t\"astro:server:setup\": ({ server, logger }) => {\n\t\t\t\t// Print route info with absolute, clickable URLs once the server\n\t\t\t\t// is listening. Only in `astro dev` -- the dev-bypass shortcut is\n\t\t\t\t// dev-only and the port is unknown until now.\n\t\t\t\tif (astroCommand === \"dev\") {\n\t\t\t\t\tserver.httpServer?.once(\"listening\", () => {\n\t\t\t\t\t\tconst address = server.httpServer?.address();\n\t\t\t\t\t\tif (!address || typeof address === \"string\") return;\n\t\t\t\t\t\tlet host = address.address;\n\t\t\t\t\t\tif (host === \"::1\" || host === \"::\" || host === \"0.0.0.0\") {\n\t\t\t\t\t\t\thost = \"localhost\";\n\t\t\t\t\t\t} else if (address.family === \"IPv6\") {\n\t\t\t\t\t\t\thost = `[${host}]`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tprintDevServerInfo(`http://${host}:${address.port}`, resolvedConfig.mcp !== false);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Generate types once the server is listening, and listen for\n\t\t\t\t// schema mutations in dev so they update the file too.\n\t\t\t\t// The endpoint returns the types content; we write the file here\n\t\t\t\t// (in Node) because workerd has no real filesystem access.\n\t\t\t\tserver.httpServer?.once(\"listening\", () => {\n\t\t\t\t\tconst address = server.httpServer?.address();\n\t\t\t\t\tif (!address || typeof address === \"string\") return;\n\n\t\t\t\t\tconst port = address.port;\n\t\t\t\t\tconst refreshDevTypes = createDebouncedTypegenRefresh(port, logger);\n\t\t\t\t\tlistenForDevTypegenRefresh(server, refreshDevTypes);\n\n\t\t\t\t\t// Initial generation now that the server is up.\n\t\t\t\t\trefreshDevTypes();\n\t\t\t\t});\n\t\t\t},\n\t\t\t\"astro:build:done\": ({ logger }) => {\n\t\t\t\tlogger.info(\"Build complete\");\n\t\t\t},\n\t\t},\n\t};\n\n\tObject.defineProperty(integration, MIGRATION_CONFIG_SYMBOL, {\n\t\tvalue: migrationMetadata,\n\t\tenumerable: false,\n\t});\n\treturn integration;\n}\n\nexport default emdash;\n"],"mappings":"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a,YAAY,kBAAkB;KAAe;IAcvF;KACC,MAAM;KACN,aAAa;KACb;IACD;KACC,MAAM;KACN,aAAa;KACb;IACD;KACC,MAAM;KACN,aAAa;KACb;IACD;KACC,MAAM;KACN,aAAa;KACb;IACD;GACD;EAED,SAAS;GACR,2BAA2B,SAAS,QAAQ;GAC5C,GAAI,aAAa,EAAE,GAAG,CAAC,qCAAqC,CAAC;GAI7D,GAAI,YAAY,CAAC,kBAAkB,iBAAiB,cAAc,CAAC,GAAG,EAAE;GACxE;EACD,QAAQ,EACP,OAAO,EACN,SAAS,CAAC,GAAG,cAAc,kBAAkB,EAC7C,EACD;EAKD,KAAK,aACF;GACA,YAAY,CAAC,UAAU,oBAAoB;GAI3C,cAAc;IAkBb,SAAS;KAAC;KAAkB;KAAU;KAAqB;KAAyB;IACpF,SAAS;KAER;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KAGA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KAEA;KACA;KACA;KACA;KACA;KAGA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KAIA;KACA;KACA;KACA;KAGA;KACA;KAGA;KACA;KAGA;KACA;KAGA;KAEA;KACA;KACA;KACA;KACA;KAEA;KACA;KACA;KAEA;KACA;KAEA;KACA;KACA,GAAI,wBAAwB,CAAC,uBAAuB,GAAG,EAAE;KACzD;KACA;KACA;KACA;KACA;KACA;KACA;KAGA;KACA;IACD;GACD,GACA;GACA,UAAU;GACV,YAAY,CAAC,UAAU,oBAAoB;GAC3C;EACH,cAAc;GAMb,SAAS,YACN;IACA;IACA;IACA;IACA;IAGA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,GACA;IACA;IACA;IACA;IACA;IACA;IACA;GACH,SAAS,aAAa,CAAC,iBAAiB,GAAG,CAAC,GAAG,uBAAuB,iBAAiB;GACvF;EACD;;;;;ACoBF,MAAM,oBAAoB,OAAO,IAAI,uBAAuB;AAC5D,MAAM,eAAe;;;;;AAMrB,SAAgB,kBAAuC;AAEtD,QAAQ,aAAa,sBAAmD;;;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"}
1
+ {"version":3,"file":"index.mjs","names":["nodeMkdir","nodeWriteFile","nodeRename","nodeUnlink","request","requestHttps"],"sources":["../../src/astro/storage/adapters.ts","../../src/astro/object-cache/adapters.ts","../../src/migrations/manifest-writer.ts","../../src/astro/integration/admin-locales.ts","../../src/astro/integration/dev-env.ts","../../src/astro/integration/dev-scheduler-bridge.ts","../../src/astro/integration/dev-typegen.ts","../../src/astro/integration/font-provider.ts","../../src/astro/integration/route-naming.ts","../../src/astro/integration/routes.ts","../../src/astro/integration/vite-config.ts","../../src/astro/integration/runtime.ts","../../src/astro/integration/index.ts"],"sourcesContent":["/**\n * Storage Adapter Functions\n *\n * These run at config time (astro.config.mjs) and return serializable descriptors.\n * The actual storage is created at runtime by loading the entrypoint.\n *\n * @example\n * ```ts\n * // astro.config.mjs\n * import emdash, { s3, local } from \"emdash/astro\";\n *\n * export default defineConfig({\n * integrations: [\n * emdash({\n * storage: s3({\n * endpoint: \"https://xxx.r2.cloudflarestorage.com\",\n * bucket: \"media\",\n * accessKeyId: process.env.R2_ACCESS_KEY_ID!,\n * secretAccessKey: process.env.R2_SECRET_ACCESS_KEY!,\n * }),\n * // or: storage: local({ directory: \"./uploads\", baseUrl: \"/_emdash/api/media/file\" }),\n * }),\n * ],\n * });\n * ```\n *\n * For Cloudflare R2 bindings, use `r2()` from `@emdash-cms/cloudflare`.\n */\n\nimport type { StorageDescriptor, S3StorageConfig, LocalStorageConfig } from \"./types.js\";\n\n/**\n * S3-compatible storage adapter\n *\n * Works with AWS S3, Cloudflare R2 (via S3 API), MinIO, etc.\n *\n * Any field omitted here is resolved from the matching `S3_*` environment\n * variable when the container starts (`S3_ENDPOINT`, `S3_BUCKET`,\n * `S3_ACCESS_KEY_ID`, `S3_SECRET_ACCESS_KEY`, `S3_REGION`, `S3_PUBLIC_URL`).\n * Explicit values always take precedence over env vars.\n *\n * Note: env var resolution reads `process.env` on Node at runtime.\n * Workers users should continue passing explicit values to `s3({...})`.\n *\n * @example\n * ```ts\n * // All fields from env (container deployments)\n * storage: s3()\n *\n * // Mix: CDN from config, credentials from env\n * storage: s3({ publicUrl: \"https://cdn.example.com\" })\n *\n * // All explicit (unchanged from before)\n * storage: s3({\n * endpoint: \"https://xxx.r2.cloudflarestorage.com\",\n * bucket: \"media\",\n * accessKeyId: process.env.R2_ACCESS_KEY_ID,\n * secretAccessKey: process.env.R2_SECRET_ACCESS_KEY,\n * })\n * ```\n */\nexport function s3(config: Partial<S3StorageConfig> = {}): StorageDescriptor {\n\treturn {\n\t\tentrypoint: \"emdash/storage/s3\",\n\t\tconfig,\n\t};\n}\n\n/**\n * Local filesystem storage adapter\n *\n * For development and testing. Stores files in a local directory.\n * Does NOT support signed upload URLs.\n *\n * @example\n * ```ts\n * storage: local({\n * directory: \"./uploads\",\n * baseUrl: \"/_emdash/api/media/file\",\n * })\n * ```\n */\nexport function local(config: LocalStorageConfig): StorageDescriptor {\n\treturn {\n\t\tentrypoint: \"emdash/storage/local\",\n\t\tconfig,\n\t};\n}\n","/**\n * Object-cache adapter functions (config time).\n *\n * These run in `astro.config.mjs` and return serializable\n * {@link ObjectCacheDescriptor}s. The backend is instantiated at runtime by\n * loading the descriptor's `entrypoint`.\n *\n * For Cloudflare KV, use `kvCache()` from `@emdash-cms/cloudflare`.\n *\n * @example\n * ```ts\n * // astro.config.mjs (Node / local)\n * import emdash, { memoryCache } from \"emdash/astro\";\n *\n * export default defineConfig({\n * integrations: [emdash({ objectCache: memoryCache() })],\n * });\n * ```\n */\n\nimport type { ObjectCacheDescriptor, ObjectCacheRuntimeConfig } from \"../../object-cache/types.js\";\n\n/** Options for {@link memoryCache}. */\nexport interface MemoryCacheOptions extends ObjectCacheRuntimeConfig {\n\t/**\n\t * Soft cap on the number of cached keys per isolate before FIFO eviction.\n\t * @default 1000\n\t */\n\tmaxEntries?: number;\n}\n\n/**\n * In-isolate memory object cache.\n *\n * Caches query results across requests within a single isolate/process. On\n * Node (one long-lived process) this is a genuine cross-request cache; on\n * multi-isolate platforms (Cloudflare) prefer `kvCache()` so the cache is\n * shared. Useful for local development regardless of target.\n *\n * @example\n * ```ts\n * emdash({ objectCache: memoryCache({ defaultTtl: 600 }) })\n * ```\n */\nexport function memoryCache(options: MemoryCacheOptions = {}): ObjectCacheDescriptor {\n\treturn {\n\t\tentrypoint: \"emdash/internal/object-cache/memory\",\n\t\tconfig: { ...options },\n\t};\n}\n","import { randomUUID } from \"node:crypto\";\nimport {\n\tmkdir as nodeMkdir,\n\trename as nodeRename,\n\tunlink as nodeUnlink,\n\twriteFile as nodeWriteFile,\n} from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nimport type { MigrationManifestV1 } from \"./manifest.js\";\nimport { serializeMigrationManifest, validateMigrationManifest } from \"./manifest.js\";\n\nexport const MIGRATION_MANIFEST_PATH = \".emdash/migrations.json\";\n\nexport interface ManifestWriterFileSystem {\n\tmkdir(path: string, options: { recursive: true }): Promise<unknown>;\n\twriteFile(\n\t\tpath: string,\n\t\tdata: string,\n\t\toptions: { encoding: \"utf8\"; flag: \"wx\" },\n\t): Promise<unknown>;\n\trename(from: string, to: string): Promise<unknown>;\n\tunlink(path: string): Promise<unknown>;\n}\n\nconst nodeFileSystem: ManifestWriterFileSystem = {\n\tmkdir: (path, options) => nodeMkdir(path, options),\n\twriteFile: (path, data, options) => nodeWriteFile(path, data, options),\n\trename: (from, to) => nodeRename(from, to),\n\tunlink: (path) => nodeUnlink(path),\n};\n\nexport async function writeMigrationManifest(\n\tprojectRoot: string,\n\tmanifest: MigrationManifestV1,\n\tfileSystem: ManifestWriterFileSystem = nodeFileSystem,\n): Promise<string> {\n\tconst validated = await validateMigrationManifest(manifest);\n\tconst outputPath = join(projectRoot, MIGRATION_MANIFEST_PATH);\n\tconst outputDirectory = dirname(outputPath);\n\tawait fileSystem.mkdir(outputDirectory, { recursive: true });\n\n\tconst temporaryPath = join(\n\t\toutputDirectory,\n\t\t`.migrations.json.${process.pid}.${randomUUID()}.tmp`,\n\t);\n\tlet temporaryFileMayExist = false;\n\ttry {\n\t\ttemporaryFileMayExist = true;\n\t\tawait fileSystem.writeFile(temporaryPath, serializeMigrationManifest(validated), {\n\t\t\tencoding: \"utf8\",\n\t\t\tflag: \"wx\",\n\t\t});\n\t\tawait fileSystem.rename(temporaryPath, outputPath);\n\t\ttemporaryFileMayExist = false;\n\t\treturn outputPath;\n\t} catch (error) {\n\t\tif (temporaryFileMayExist) {\n\t\t\tawait fileSystem.unlink(temporaryPath).catch(() => undefined);\n\t\t}\n\t\tthrow error;\n\t}\n}\n","/**\n * Build-time support for the `admin.locales` allowlist: validates it against\n * the catalogs the installed admin package ships, and keeps excluded catalogs\n * out of the bundle by resolving their imports to the source-locale catalog.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { posix, resolve } from \"node:path\";\n\nimport type { Plugin } from \"vite\";\n\nconst SOURCE_LOCALE = \"en\";\nconst MANIFEST_FILE = \"locales-manifest.json\";\nconst QUERY_RE = /[?#].*$/;\n\n/** Locale code mapped to its catalog chunk, relative to the admin dist directory. */\nexport type AdminLocaleManifest = Record<string, string>;\n\nfunction isStringRecord(value: unknown): value is Record<string, string> {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t!Array.isArray(value) &&\n\t\tObject.values(value).every((entry) => typeof entry === \"string\")\n\t);\n}\n\n/**\n * Read the locale manifest emitted by the `@emdash-cms/admin` build. Throws if\n * it is missing, malformed, lacks the source locale, or names a chunk that is\n * not in the dist directory.\n */\nexport function readAdminLocaleManifest(adminDistPath: string): AdminLocaleManifest {\n\tconst manifestPath = resolve(adminDistPath, MANIFEST_FILE);\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(readFileSync(manifestPath, \"utf8\"));\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`\\`admin.locales\\` needs the admin locale manifest at ${manifestPath}, but it could not be read. ` +\n\t\t\t\t\"Reinstall or rebuild @emdash-cms/admin.\",\n\t\t\t{ cause: error },\n\t\t);\n\t}\n\n\tconst locales =\n\t\ttypeof parsed === \"object\" && parsed !== null && \"locales\" in parsed\n\t\t\t? parsed.locales\n\t\t\t: undefined;\n\tif (!isStringRecord(locales) || !Object.hasOwn(locales, SOURCE_LOCALE)) {\n\t\tthrow new Error(\n\t\t\t`The admin locale manifest at ${manifestPath} is invalid: expected a \"locales\" object ` +\n\t\t\t\t`mapping locale codes to chunk files, including \"${SOURCE_LOCALE}\". ` +\n\t\t\t\t\"Reinstall or rebuild @emdash-cms/admin.\",\n\t\t);\n\t}\n\n\tfor (const [code, chunk] of Object.entries(locales)) {\n\t\tif (!existsSync(resolve(adminDistPath, chunk))) {\n\t\t\tthrow new Error(\n\t\t\t\t`The admin locale manifest at ${manifestPath} lists \"${chunk}\" for \"${code}\", ` +\n\t\t\t\t\t\"but that file does not exist. Reinstall or rebuild @emdash-cms/admin.\",\n\t\t\t);\n\t\t}\n\t}\n\n\treturn locales;\n}\n\nfunction canonicalizeLocale(code: string): string | undefined {\n\ttry {\n\t\treturn new Intl.Locale(code.trim()).baseName;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Resolve a user-supplied `admin.locales` list to the admin's own locale\n * codes. Matching ignores case and surrounding whitespace, the source locale\n * is always included first, and duplicates are dropped. Throws, naming every\n * unrecognized entry and listing the available codes, if any entry does not\n * match an available locale.\n */\nexport function resolveAdminLocales(requested: unknown, available: Iterable<string>): string[] {\n\tif (!Array.isArray(requested)) {\n\t\tthrow new Error(\"`admin.locales` must be an array of locale codes.\");\n\t}\n\tconst entries: unknown[] = requested;\n\n\tconst byCanonical = new Map<string, string>();\n\tfor (const code of available) {\n\t\tbyCanonical.set(canonicalizeLocale(code) ?? code, code);\n\t}\n\n\tconst resolved = new Set([SOURCE_LOCALE]);\n\tconst unknownEntries: string[] = [];\n\tfor (const entry of entries) {\n\t\tconst canonical = typeof entry === \"string\" ? canonicalizeLocale(entry) : undefined;\n\t\tconst code = canonical === undefined ? undefined : byCanonical.get(canonical);\n\t\tif (code === undefined) {\n\t\t\tunknownEntries.push(String(JSON.stringify(entry)));\n\t\t} else {\n\t\t\tresolved.add(code);\n\t\t}\n\t}\n\n\tif (unknownEntries.length > 0) {\n\t\tconst availableCodes = [...byCanonical.values()].toSorted().join(\", \");\n\t\tthrow new Error(\n\t\t\t`Unknown admin locale${unknownEntries.length === 1 ? \"\" : \"s\"} in \\`admin.locales\\`: ` +\n\t\t\t\t`${unknownEntries.join(\", \")}. Available locales: ${availableCodes}.`,\n\t\t);\n\t}\n\n\treturn [...resolved];\n}\n\nfunction toVitePath(path: string): string {\n\treturn path.replaceAll(\"\\\\\", \"/\");\n}\n\ninterface AdminLocaleResolverOptions {\n\tadminDistPath: string;\n\t/** Set in dev when the admin package is aliased to its source. */\n\tadminSourcePath?: string;\n\tlocales: readonly string[];\n\tmanifest: AdminLocaleManifest;\n}\n\n/**\n * Vite plugin that resolves imports of excluded admin catalogs to the source\n * locale's catalog, so the excluded catalogs are never bundled. Covers both\n * the built admin package (hashed chunks listed in the manifest) and, in dev,\n * the admin source (`./<code>/messages.mjs`).\n */\nexport function createAdminLocaleResolverPlugin(options: AdminLocaleResolverOptions): Plugin {\n\tconst { manifest } = options;\n\tconst sourceLocaleChunk = manifest[SOURCE_LOCALE];\n\tif (sourceLocaleChunk === undefined) {\n\t\tthrow new Error(`The admin locale manifest has no \"${SOURCE_LOCALE}\" catalog.`);\n\t}\n\n\tconst allowed = new Set(options.locales);\n\tconst distDir = toVitePath(options.adminDistPath);\n\tconst sourceDir = options.adminSourcePath ? toVitePath(options.adminSourcePath) : undefined;\n\tconst redirects = new Map<string, string>();\n\tfor (const [code, chunk] of Object.entries(manifest)) {\n\t\tif (code === SOURCE_LOCALE || allowed.has(code)) continue;\n\t\tredirects.set(posix.join(distDir, chunk), posix.join(distDir, sourceLocaleChunk));\n\t\tif (sourceDir) {\n\t\t\tredirects.set(\n\t\t\t\tposix.join(sourceDir, \"locales\", code, \"messages.mjs\"),\n\t\t\t\tposix.join(distDir, \"locales\", SOURCE_LOCALE, \"messages.mjs\"),\n\t\t\t);\n\t\t}\n\t}\n\n\treturn {\n\t\tname: \"emdash-admin-locales\",\n\t\tenforce: \"pre\",\n\t\tresolveId(source, importer) {\n\t\t\tif (!importer || !source.startsWith(\".\")) return;\n\t\t\tconst importerDir = posix.dirname(toVitePath(importer).replace(QUERY_RE, \"\"));\n\t\t\treturn redirects.get(posix.join(importerDir, source.replace(QUERY_RE, \"\")));\n\t\t},\n\t};\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst DEV_ENV_SECRET_VAR_NAMES = new Set([\"EMDASH_ENCRYPTION_KEY\"]);\nconst NEWLINE_RE = /\\r?\\n/;\n\n/**\n * Parse a minimal subset of dotenv syntax, enough for the local secrets\n * scaffolder and common user edits. Inline comments, blank lines, and\n * lines without an `=` are ignored; leading/trailing whitespace is trimmed.\n * Single and double quotes are stripped; no variable expansion is performed.\n */\nfunction parseDotenv(content: string): Record<string, string> {\n\tconst result: Record<string, string> = {};\n\tfor (const rawLine of content.split(NEWLINE_RE)) {\n\t\tconst line = stripInlineComment(rawLine).trim();\n\t\tif (line === \"\" || line.startsWith(\"#\")) continue;\n\n\t\tconst eq = line.indexOf(\"=\");\n\t\tif (eq === -1) continue;\n\n\t\tconst key = line.slice(0, eq).trim();\n\t\tlet value = line.slice(eq + 1).trim();\n\n\t\t// Strip matching quote pair. Keep escaped quotes simple: only unescape\n\t\t// the quote char that wrapped the value.\n\t\tif (value.length >= 2) {\n\t\t\tconst first = value[0];\n\t\t\tconst last = value.at(-1)!;\n\t\t\tif ((first === '\"' || first === \"'\") && first === last) {\n\t\t\t\tvalue = value.slice(1, -1).replaceAll(`\\\\${first}`, first);\n\t\t\t}\n\t\t}\n\n\t\tresult[key] = value;\n\t}\n\treturn result;\n}\n\n/**\n * Remove an inline `#` comment only if it is not inside a quoted value. This\n * keeps values like `FOO=\"a # b\"` intact while stripping trailing comments.\n */\nfunction stripInlineComment(line: string): string {\n\tlet inSingleQuote = false;\n\tlet inDoubleQuote = false;\n\tfor (let i = 0; i < line.length; i++) {\n\t\tconst char = line[i];\n\t\tif (char === \"'\" && !inDoubleQuote) {\n\t\t\tinSingleQuote = !inSingleQuote;\n\t\t} else if (char === '\"' && !inSingleQuote) {\n\t\t\tinDoubleQuote = !inDoubleQuote;\n\t\t} else if (char === \"#\" && !inSingleQuote && !inDoubleQuote) {\n\t\t\treturn line.slice(0, i);\n\t\t}\n\t}\n\treturn line;\n}\n\n/**\n * Load the plugin-secret encryption key from the project's `.env` into\n * `process.env` during `astro dev`. Existing environment variables (e.g.\n * already exported in the shell, or set by the host platform) are honored and\n * never overwritten.\n *\n * This keeps the deliberate `process.env`-only rule in the secrets module\n * while letting freshly scaffolded Node sites use the generated encryption key\n * without a manual `export` step. Other EmDash variables are intentionally not\n * copied, so `.env` values intended for production do not accidentally replace\n * generated dev values (for example `SITE_URL`).\n */\nexport function loadDevEnv(root: URL | string): void {\n\tconst rootPath = typeof root === \"string\" ? root : fileURLToPath(root);\n\tconst envPath = join(rootPath, \".env\");\n\tif (!existsSync(envPath)) return;\n\n\tconst parsed = parseDotenv(readFileSync(envPath, \"utf-8\"));\n\tfor (const [key, value] of Object.entries(parsed)) {\n\t\tif (DEV_ENV_SECRET_VAR_NAMES.has(key) && !process.env[key]) {\n\t\t\tprocess.env[key] = value;\n\t\t}\n\t}\n}\n","import type { Server } from \"node:http\";\nimport { request as requestHttps } from \"node:https\";\n\nimport type { AstroIntegrationLogger } from \"astro\";\n\nconst DEFAULT_INTERVAL_MS = 60_000;\n\ninterface DevServer {\n\thttpServer: Pick<Server, \"once\"> | null;\n\tresolvedUrls: { local: string[]; network: string[] } | null;\n}\n\ninterface SchedulerOptions {\n\tintervalMs?: number;\n\tfetch?: typeof fetch;\n}\n\nfunction postMaintenance(url: URL): Promise<{ ok: boolean; status: number }> {\n\tif (url.protocol !== \"https:\") return fetch(url, { method: \"POST\" });\n\t// Dev servers commonly run on self-signed or host-mismatch certificates\n\t// that Node would reject by default. This request stays inside the local\n\t// dev server and the route is dev-only, so accept the certificate to keep\n\t// maintenance running without requiring a matching SAN/CN or trusted CA.\n\treturn new Promise((resolve, reject) => {\n\t\tconst request = requestHttps(\n\t\t\turl,\n\t\t\t{ method: \"POST\", rejectUnauthorized: false, agent: false },\n\t\t\t(response) => {\n\t\t\t\tconst status = response.statusCode ?? 500;\n\t\t\t\tresponse.once(\"error\", reject);\n\t\t\t\tresponse.once(\"end\", () => resolve({ ok: status >= 200 && status < 300, status }));\n\t\t\t\tresponse.resume();\n\t\t\t},\n\t\t);\n\t\trequest.once(\"error\", reject);\n\t\trequest.end();\n\t});\n}\n\nexport function startDevSchedulerBridge(\n\tserver: DevServer,\n\tlogger: Pick<AstroIntegrationLogger, \"warn\">,\n\toptions: SchedulerOptions = {},\n): void {\n\tconst httpServer = server.httpServer;\n\tif (!httpServer) return;\n\n\tconst intervalMs = options.intervalMs ?? DEFAULT_INTERVAL_MS;\n\tlet stopped = false;\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\n\tconst schedule = () => {\n\t\tif (stopped) return;\n\t\ttimer = setTimeout(() => void run(), intervalMs);\n\t\tif (typeof timer === \"object\" && \"unref\" in timer) timer.unref();\n\t};\n\n\tconst run = async () => {\n\t\ttry {\n\t\t\tconst origin = server.resolvedUrls?.local[0] ?? server.resolvedUrls?.network[0];\n\t\t\tif (!origin) {\n\t\t\t\tlogger.warn(\"Dev scheduler bridge could not resolve the dev server origin.\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst base = origin.endsWith(\"/\") ? origin : `${origin}/`;\n\t\t\tconst url = new URL(\"_emdash/api/dev/scheduled-tasks\", base);\n\t\t\tconst response = options.fetch\n\t\t\t\t? await options.fetch(url, { method: \"POST\" })\n\t\t\t\t: await postMaintenance(url);\n\t\t\tif (!response.ok) {\n\t\t\t\tlogger.warn(\n\t\t\t\t\t`Dev scheduler bridge request failed with status ${response.status}. ` +\n\t\t\t\t\t\t\"Verify that EmDash's dev maintenance route is available.\",\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger.warn(\n\t\t\t\t`Dev scheduler bridge request failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t} finally {\n\t\t\tschedule();\n\t\t}\n\t};\n\n\thttpServer.once(\"listening\", schedule);\n\thttpServer.once(\"close\", () => {\n\t\tstopped = true;\n\t\tif (timer !== undefined) clearTimeout(timer);\n\t});\n}\n","import type { AstroIntegrationLogger } from \"astro\";\n\nimport { DEV_TYPEGEN_REFRESH_EVENT, DEV_TYPEGEN_REFRESH_GLOBAL } from \"../dev-typegen.js\";\n\ninterface DevServerEnvironments {\n\tenvironments: Record<\n\t\tstring,\n\t\t{\n\t\t\tconfig: { consumer: string };\n\t\t\thot: { on(event: string, listener: () => void): void };\n\t\t}\n\t>;\n}\n\n/**\n * Call `refresh` whenever server-side code in any Vite environment reports a\n * schema change. Schema mutations can run in a separate realm from the\n * integration (workerd under the Cloudflare adapter), so the signal travels\n * over each environment's hot channel. The global covers same-realm SSR when\n * HMR is disabled and modules have no hot channel.\n */\nexport function listenForDevTypegenRefresh(\n\tserver: DevServerEnvironments,\n\trefresh: () => void,\n): void {\n\tfor (const environment of Object.values(server.environments)) {\n\t\tif (environment.config.consumer !== \"server\") continue;\n\t\tenvironment.hot.on(DEV_TYPEGEN_REFRESH_EVENT, () => refresh());\n\t}\n\tReflect.set(globalThis, DEV_TYPEGEN_REFRESH_GLOBAL, refresh);\n}\n\n/**\n * Create a debounced refresh function that fetches the generated types from\n * the dev server and writes them to `emdash-env.d.ts` in the project root.\n *\n * This runs in the Astro integration (Node), never in production builds or\n * in workerd SSR isolates.\n */\nexport function createDebouncedTypegenRefresh(\n\tport: number,\n\tlogger: AstroIntegrationLogger,\n): () => void {\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet inFlight: Promise<unknown> | undefined;\n\n\tfunction refresh(): void {\n\t\tif (timer) clearTimeout(timer);\n\t\ttimer = setTimeout(() => {\n\t\t\ttimer = undefined;\n\t\t\tif (inFlight) return;\n\t\t\tinFlight = writeDevTypes(port, logger).finally(() => {\n\t\t\t\tinFlight = undefined;\n\t\t\t});\n\t\t}, 200);\n\t}\n\n\treturn refresh;\n}\n\nasync function writeDevTypes(port: number, logger: AstroIntegrationLogger): Promise<void> {\n\tconst typegenUrl = `http://localhost:${port}/_emdash/api/typegen`;\n\n\ttry {\n\t\tconst { writeFile, readFile } = await import(\"node:fs/promises\");\n\t\tconst { resolve } = await import(\"node:path\");\n\t\tconst outputPath = resolve(process.cwd(), \"emdash-env.d.ts\");\n\n\t\tconst response = await fetch(typegenUrl, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst body = await response.text().catch(() => \"\");\n\t\t\tlogger.warn(`Typegen failed: ${response.status} ${body.slice(0, 200)}`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst json = await response.json();\n\t\tif (typeof json !== \"object\" || json === null || !(\"data\" in json)) {\n\t\t\tlogger.warn(\"Typegen returned an unexpected response shape\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst result = json.data;\n\t\tif (\n\t\t\ttypeof result !== \"object\" ||\n\t\t\tresult === null ||\n\t\t\t!(\"types\" in result) ||\n\t\t\t!(\"collections\" in result)\n\t\t) {\n\t\t\tlogger.warn(\"Typegen returned an unexpected response shape\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst types = result.types;\n\t\tconst collections = result.collections;\n\t\tif (typeof types !== \"string\" || typeof collections !== \"number\") {\n\t\t\tlogger.warn(\"Typegen returned an unexpected response shape\");\n\t\t\treturn;\n\t\t}\n\n\t\tlet needsWrite = true;\n\t\ttry {\n\t\t\tconst existing = await readFile(outputPath, \"utf-8\");\n\t\t\tif (existing === types) needsWrite = false;\n\t\t} catch {\n\t\t\t// File doesn't exist yet\n\t\t}\n\n\t\tif (needsWrite) {\n\t\t\tawait writeFile(outputPath, types, \"utf-8\");\n\t\t\tlogger.info(`Generated emdash-env.d.ts (${collections} collections)`);\n\t\t}\n\t} catch (error) {\n\t\tconst msg = error instanceof Error ? error.message : String(error);\n\t\tlogger.warn(`Typegen failed: ${msg}`);\n\t}\n}\n","/**\n * EmDash Noto Sans font provider\n *\n * A custom Astro font provider that wraps Google Fonts to resolve\n * multiple Noto Sans families (Latin, Arabic, JP, etc.) under a\n * single logical font entry. This lets all @font-face blocks share\n * the same font-family name, so the browser picks the right file\n * per character via unicode-range.\n *\n * Without this, registering \"Noto Sans\" and \"Noto Sans Arabic\" as\n * separate font entries on the same cssVariable triggers an Astro\n * warning and the last entry overwrites the first.\n */\n\nimport { fontProviders } from \"astro/config\";\n\n/**\n * All subset names used by Google Fonts CSS responses.\n * Passed when resolving extra script families so the unifont\n * provider doesn't filter out any faces.\n */\nconst ALL_GOOGLE_SUBSETS = [\n\t\"arabic\",\n\t\"armenian\",\n\t\"bengali\",\n\t\"chinese-simplified\",\n\t\"chinese-traditional\",\n\t\"chinese-hongkong\",\n\t\"cyrillic\",\n\t\"cyrillic-ext\",\n\t\"devanagari\",\n\t\"ethiopic\",\n\t\"farsi\",\n\t\"georgian\",\n\t\"greek\",\n\t\"greek-ext\",\n\t\"gujarati\",\n\t\"gurmukhi\",\n\t\"hebrew\",\n\t\"japanese\",\n\t\"kannada\",\n\t\"khmer\",\n\t\"korean\",\n\t\"lao\",\n\t\"latin\",\n\t\"latin-ext\",\n\t\"malayalam\",\n\t\"math\",\n\t\"myanmar\",\n\t\"oriya\",\n\t\"sinhala\",\n\t\"symbols\",\n\t\"tamil\",\n\t\"telugu\",\n\t\"thai\",\n\t\"tibetan\",\n\t\"vietnamese\",\n];\n\n/**\n * Known Noto Sans and Sans script families on Google Fonts.\n * Maps user-friendly script names to Google Fonts family names.\n */\nconst NOTO_SCRIPT_FAMILIES: Record<string, string> = {\n\tarabic: \"Noto Sans Arabic\",\n\tarmenian: \"Noto Sans Armenian\",\n\tbengali: \"Noto Sans Bengali\",\n\t\"chinese-simplified\": \"Noto Sans SC\",\n\t\"chinese-traditional\": \"Noto Sans TC\",\n\t\"chinese-hongkong\": \"Noto Sans HK\",\n\tdevanagari: \"Noto Sans Devanagari\",\n\tethiopic: \"Noto Sans Ethiopic\",\n\tfarsi: \"Vazirmatn\",\n\tgeorgian: \"Noto Sans Georgian\",\n\tgujarati: \"Noto Sans Gujarati\",\n\tgurmukhi: \"Noto Sans Gurmukhi\",\n\thebrew: \"Noto Sans Hebrew\",\n\tjapanese: \"Noto Sans JP\",\n\tkannada: \"Noto Sans Kannada\",\n\tkhmer: \"Noto Sans Khmer\",\n\tkorean: \"Noto Sans KR\",\n\tlao: \"Noto Sans Lao\",\n\tmalayalam: \"Noto Sans Malayalam\",\n\tmyanmar: \"Noto Sans Myanmar\",\n\toriya: \"Noto Sans Oriya\",\n\tsinhala: \"Noto Sans Sinhala\",\n\ttamil: \"Noto Sans Tamil\",\n\ttelugu: \"Noto Sans Telugu\",\n\tthai: \"Noto Sans Thai\",\n\ttibetan: \"Noto Sans Tibetan\",\n};\n\nexport interface NotoSansProviderOptions {\n\t/**\n\t * Additional Noto Sans script families to include.\n\t * Use script names like \"arabic\", \"japanese\", \"chinese-simplified\".\n\t *\n\t * @see {@link NOTO_SCRIPT_FAMILIES} for the full list of supported scripts.\n\t */\n\tscripts?: string[];\n}\n\n// Use ReturnType to get the provider type without importing it directly.\n// The Astro FontProvider type is not part of the public API surface.\ntype GoogleProvider = ReturnType<typeof fontProviders.google>;\n\n/**\n * Create a font provider that resolves Noto Sans plus additional\n * script-specific Noto families from Google Fonts, all under one\n * font-family name.\n */\nexport function notoSans(options?: NotoSansProviderOptions): GoogleProvider {\n\t// Create a single Google provider instance to share initialization\n\tconst googleProvider = fontProviders.google();\n\n\treturn {\n\t\tname: \"emdash-noto\",\n\t\tasync init(context) {\n\t\t\tawait googleProvider.init?.(context);\n\t\t},\n\t\tasync resolveFont(resolveFontOptions) {\n\t\t\t// Resolve the base Noto Sans (Latin, Cyrillic, Greek, etc.)\n\t\t\tconst base = await googleProvider.resolveFont(resolveFontOptions);\n\t\t\tconst baseFonts = base?.fonts ?? [];\n\n\t\t\tif (!options?.scripts?.length) {\n\t\t\t\treturn base;\n\t\t\t}\n\n\t\t\t// Collect subset names already covered by the base font so we\n\t\t\t// can filter out duplicate faces from extra script families.\n\t\t\t// e.g. Noto Sans Arabic includes latin/latin-ext faces that\n\t\t\t// would otherwise override the base Noto Sans latin faces.\n\t\t\tconst baseSubsets = new Set(baseFonts.map((f) => f.meta?.subset).filter(Boolean));\n\n\t\t\t// Resolve additional script families\n\t\t\tconst extraFonts = await Promise.all(\n\t\t\t\toptions.scripts.map(async (script) => {\n\t\t\t\t\tconst family = NOTO_SCRIPT_FAMILIES[script];\n\t\t\t\t\tif (!family) {\n\t\t\t\t\t\t// Silently skip subset names that are already covered\n\t\t\t\t\t\t// by the base Noto Sans font (latin, cyrillic, etc.)\n\t\t\t\t\t\tif (ALL_GOOGLE_SUBSETS.includes(script)) {\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t`[emdash] Unknown Noto Sans script \"${script}\". ` +\n\t\t\t\t\t\t\t\t`Available: ${Object.keys(NOTO_SCRIPT_FAMILIES).join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\treturn googleProvider.resolveFont({\n\t\t\t\t\t\t...resolveFontOptions,\n\t\t\t\t\t\tfamilyName: family,\n\t\t\t\t\t\t// Pass all known subset names so the unifont provider\n\t\t\t\t\t\t// doesn't filter out any faces. Each script family\n\t\t\t\t\t\t// only returns faces for its own subsets anyway.\n\t\t\t\t\t\tsubsets: ALL_GOOGLE_SUBSETS,\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\t// Merge, dropping faces from extra fonts that duplicate base subsets\n\t\t\tconst extraFaces = extraFonts.flatMap((r) =>\n\t\t\t\t(r?.fonts ?? []).filter((f) => !f.meta?.subset || !baseSubsets.has(f.meta.subset)),\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tfonts: [...baseFonts, ...extraFaces],\n\t\t\t};\n\t\t},\n\t};\n}\n\n/** Get the list of available Noto Sans script names */\nexport function getAvailableNotoScripts(): string[] {\n\treturn Object.keys(NOTO_SCRIPT_FAMILIES);\n}\n","/**\n * Compiled route artifact naming -- single source of truth.\n *\n * rolldown reserves `[name]`, `[hash]`, `[ext]` (and more) as output-filename\n * placeholders, so compiled route files cannot keep Astro's literal\n * `[param]` dynamic-segment filenames -- a path containing `[name]` would be\n * substituted by the bundler. This function defines the safe artifact form.\n *\n * It is imported by BOTH the build (`tsdown.config.ts` `entryFileNames`) and\n * the route injector (`resolveRoute`, which resolves `emdash/internal/routes/*`).\n * They must stay in lockstep: change the scheme here and both follow.\n *\n * `[` and `]` -> `_` (e.g. `[collection]` -> `_collection_`,\n * `[...path]` -> `_...path_`). The Astro route URL pattern is set explicitly\n * at injection time, so the artifact filename never affects routing.\n */\nexport function routeArtifactName(srcRelativePathNoExt: string): string {\n\treturn srcRelativePathNoExt.replaceAll(\"[\", \"_\").replaceAll(\"]\", \"_\");\n}\n","/**\n * Route Injection\n *\n * Defines and injects all EmDash routes into the Astro application.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { routeArtifactName } from \"./route-naming.js\";\n\nconst TS_EXT = /\\.tsx?$/;\n\n/**\n * Resolve path to a route file in the package\n * Uses Node.js APIs - only call at build time\n */\nfunction resolveRoute(route: string): string {\n\t// Lazy initialization to avoid running Node.js code at import time\n\t// This prevents issues when the module is bundled for Cloudflare Workers\n\tconst require = createRequire(import.meta.url);\n\tconst __dirname = dirname(fileURLToPath(import.meta.url));\n\n\t// .astro routes ship as source (the consumer's Astro build processes them);\n\t// .ts/.tsx routes are compiled, exported extensionless via emdash/internal/routes/*.\n\tconst isAstro = route.endsWith(\".astro\");\n\tconst specifier = isAstro ? route : routeArtifactName(route.replace(TS_EXT, \"\"));\n\n\ttry {\n\t\t// Try to resolve as package export\n\t\treturn require.resolve(`emdash/internal/routes/${specifier}`);\n\t} catch {\n\t\t// Fallback for development (e.g. dist not yet built).\n\t\treturn isAstro\n\t\t\t? resolve(__dirname, \"../routes\", route)\n\t\t\t: resolve(__dirname, \"../routes\", `${specifier}.mjs`);\n\t}\n}\n\n/** Route injection function type */\ntype InjectRoute = (route: { pattern: string; entrypoint: string }) => void;\n\ninterface InjectCoreRoutesOptions {\n\tsrcDir?: URL;\n\tcloudflareDevScheduler?: boolean;\n}\n\nconst ROUTE_OVERRIDE_EXTENSIONS = [\n\t\".astro\",\n\t\".js\",\n\t\".ts\",\n\t\".jsx\",\n\t\".tsx\",\n\t\".mjs\",\n\t\".mts\",\n\t\".md\",\n\t\".mdx\",\n\t\".html\",\n];\n\n/**\n * Detect whether the host site defines its own root-level public route file.\n */\nexport function hasUserDefinedPublicRoute(srcDir: URL, basename: string): boolean {\n\tconst srcDirPath = fileURLToPath(srcDir);\n\treturn ROUTE_OVERRIDE_EXTENSIONS.some(\n\t\t(extension) =>\n\t\t\texistsSync(resolve(srcDirPath, \"pages\", `${basename}${extension}`)) ||\n\t\t\texistsSync(resolve(srcDirPath, \"pages\", basename, `index${extension}`)),\n\t);\n}\n\n/**\n * Injects all core EmDash routes.\n */\nexport function injectCoreRoutes(\n\tinjectRoute: InjectRoute,\n\toptions: InjectCoreRoutesOptions = {},\n): void {\n\t// Inject admin shell route\n\tinjectRoute({\n\t\tpattern: \"/_emdash/admin/[...path]\",\n\t\tentrypoint: resolveRoute(\"admin.astro\"),\n\t});\n\n\t// Inject API routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/manifest\",\n\t\tentrypoint: resolveRoute(\"api/manifest.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/health\",\n\t\tentrypoint: resolveRoute(\"api/health.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/openapi.json\",\n\t\tentrypoint: resolveRoute(\"api/openapi.json.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/visual-editing/action-token\",\n\t\tentrypoint: resolveRoute(\"api/visual-editing/action-token.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/visual-editing/toolbar-labels\",\n\t\tentrypoint: resolveRoute(\"api/visual-editing/toolbar-labels.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/visual-editing/content/[collection]/[id]/publish\",\n\t\tentrypoint: resolveRoute(\"api/visual-editing/content/[collection]/[id]/publish.ts\"),\n\t});\n\n\t// Auth mode endpoint (public — used by the login page to pick the right UI)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/mode\",\n\t\tentrypoint: resolveRoute(\"api/auth/mode.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/dashboard\",\n\t\tentrypoint: resolveRoute(\"api/dashboard.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/calendar\",\n\t\tentrypoint: resolveRoute(\"api/calendar.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/scheduled-policy-rejections/[collection]/[id]\",\n\t\tentrypoint: resolveRoute(\"api/admin/scheduled-policy-rejections/[collection]/[id].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern:\n\t\t\t\"/_emdash/api/content/[collection]/[id]/plugin-extensions/[pluginId]/[kind]/[extensionId]\",\n\t\tentrypoint: resolveRoute(\n\t\t\t\"api/content/[collection]/[id]/plugin-extensions/[pluginId]/[kind]/[extensionId].ts\",\n\t\t),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/revisions\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/revisions.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/preview-url\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/preview-url.ts\"),\n\t});\n\n\t// Content authors (for the admin author filter)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/authors\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/authors.ts\"),\n\t});\n\n\t// Trash/restore routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/trash\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/trash.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/restore\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/restore.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/permanent\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/permanent.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/duplicate\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/duplicate.ts\"),\n\t});\n\n\t// Publishing routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/publish\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/publish.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/unpublish\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/unpublish.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/discard-draft\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/discard-draft.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/compare\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/compare.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/lock\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/lock.ts\"),\n\t});\n\n\t// i18n translation routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/translations\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/translations.ts\"),\n\t});\n\n\t// Scheduled publishing routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/schedule\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/schedule.ts\"),\n\t});\n\n\t// Reference field edge routes (children = parent side, parents = backlinks)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/references/[relation]/children\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/references/[relation]/children.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/references/[relation]/parents\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/references/[relation]/parents.ts\"),\n\t});\n\n\t// Revision management routes (for restore, etc.)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/revisions/[revisionId]\",\n\t\tentrypoint: resolveRoute(\"api/revisions/[revisionId]/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/revisions/[revisionId]/restore\",\n\t\tentrypoint: resolveRoute(\"api/revisions/[revisionId]/restore.ts\"),\n\t});\n\n\t// Media API routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media\",\n\t\tentrypoint: resolveRoute(\"api/media.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/upload-url\",\n\t\tentrypoint: resolveRoute(\"api/media/upload-url.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/file/[...key]\",\n\t\tentrypoint: resolveRoute(\"api/media/file/[...key].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/asset/[id]/[filename]\",\n\t\tentrypoint: resolveRoute(\"api/media/asset/[id]/[filename].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/folders\",\n\t\tentrypoint: resolveRoute(\"api/media/folders/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/folders/[id]\",\n\t\tentrypoint: resolveRoute(\"api/media/folders/[id].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/[id]\",\n\t\tentrypoint: resolveRoute(\"api/media/[id].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/[id]/usage\",\n\t\tentrypoint: resolveRoute(\"api/media/[id]/usage.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/[id]/confirm\",\n\t\tentrypoint: resolveRoute(\"api/media/[id]/confirm.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/[id]/upload\",\n\t\tentrypoint: resolveRoute(\"api/media/[id]/upload.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/[id]/replace\",\n\t\tentrypoint: resolveRoute(\"api/media/[id]/replace.ts\"),\n\t});\n\n\t// Media provider routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/providers\",\n\t\tentrypoint: resolveRoute(\"api/media/providers/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/providers/[providerId]\",\n\t\tentrypoint: resolveRoute(\"api/media/providers/[providerId]/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/media/providers/[providerId]/[itemId]\",\n\t\tentrypoint: resolveRoute(\"api/media/providers/[providerId]/[itemId].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/media-usage/repair\",\n\t\tentrypoint: resolveRoute(\"api/admin/media-usage/repair.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/media-usage/work\",\n\t\tentrypoint: resolveRoute(\"api/admin/media-usage/work/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/media-usage/work/retry\",\n\t\tentrypoint: resolveRoute(\"api/admin/media-usage/work/retry.ts\"),\n\t});\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/media-usage/activation\",\n\t\tentrypoint: resolveRoute(\"api/admin/media-usage/activation.ts\"),\n\t});\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/media-usage/progress\",\n\t\tentrypoint: resolveRoute(\"api/admin/media-usage/progress.ts\"),\n\t});\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/media-usage/collection-deletions\",\n\t\tentrypoint: resolveRoute(\"api/admin/media-usage/collection-deletions/index.ts\"),\n\t});\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/media-usage/collection-deletions/retry\",\n\t\tentrypoint: resolveRoute(\"api/admin/media-usage/collection-deletions/retry.ts\"),\n\t});\n\n\t// Import API routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/import/probe\",\n\t\tentrypoint: resolveRoute(\"api/import/probe.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/import/wordpress/analyze\",\n\t\tentrypoint: resolveRoute(\"api/import/wordpress/analyze.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/import/wordpress/prepare\",\n\t\tentrypoint: resolveRoute(\"api/import/wordpress/prepare.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/import/wordpress/execute\",\n\t\tentrypoint: resolveRoute(\"api/import/wordpress/execute.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/import/wordpress/media\",\n\t\tentrypoint: resolveRoute(\"api/import/wordpress/media.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/import/wordpress/rewrite-urls\",\n\t\tentrypoint: resolveRoute(\"api/import/wordpress/rewrite-urls.ts\"),\n\t});\n\n\t// WordPress Plugin (EmDash Exporter) direct import routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/import/wordpress-plugin/analyze\",\n\t\tentrypoint: resolveRoute(\"api/import/wordpress-plugin/analyze.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/import/wordpress-plugin/execute\",\n\t\tentrypoint: resolveRoute(\"api/import/wordpress-plugin/execute.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/import/wordpress-plugin/callback\",\n\t\tentrypoint: resolveRoute(\"api/import/wordpress-plugin/callback.ts\"),\n\t});\n\n\t// Schema API routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema\",\n\t\tentrypoint: resolveRoute(\"api/schema/index.ts\"),\n\t});\n\n\t// Typegen endpoint (dev-only)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/typegen\",\n\t\tentrypoint: resolveRoute(\"api/typegen.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema/collections\",\n\t\tentrypoint: resolveRoute(\"api/schema/collections/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema/block-types\",\n\t\tentrypoint: resolveRoute(\"api/schema/block-types/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema/block-types/[slug]/versions/[version]/activate\",\n\t\tentrypoint: resolveRoute(\"api/schema/block-types/[slug]/versions/[version]/activate.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema/block-types/[slug]\",\n\t\tentrypoint: resolveRoute(\"api/schema/block-types/[slug]/index.ts\"),\n\t});\n\n\t// Order matters: the static `reorder` route must precede the dynamic\n\t// `[slug]` route so Astro's resolver dispatches POST\n\t// /schema/collections/reorder to the reorder handler instead of treating\n\t// \"reorder\" as a collection slug.\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema/collections/reorder\",\n\t\tentrypoint: resolveRoute(\"api/schema/collections/reorder.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema/collections/[slug]\",\n\t\tentrypoint: resolveRoute(\"api/schema/collections/[slug]/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema/collections/[slug]/fields\",\n\t\tentrypoint: resolveRoute(\"api/schema/collections/[slug]/fields/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema/collections/[slug]/fields/reorder\",\n\t\tentrypoint: resolveRoute(\"api/schema/collections/[slug]/fields/reorder.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema/collections/[slug]/fields/[fieldSlug]\",\n\t\tentrypoint: resolveRoute(\"api/schema/collections/[slug]/fields/[fieldSlug].ts\"),\n\t});\n\n\t// Orphaned tables discovery\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema/orphans\",\n\t\tentrypoint: resolveRoute(\"api/schema/orphans/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/schema/orphans/[slug]\",\n\t\tentrypoint: resolveRoute(\"api/schema/orphans/[slug].ts\"),\n\t});\n\n\t// Site settings route\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/settings\",\n\t\tentrypoint: resolveRoute(\"api/settings.ts\"),\n\t});\n\n\t// Email settings route\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/settings/email\",\n\t\tentrypoint: resolveRoute(\"api/settings/email.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/settings/domain\",\n\t\tentrypoint: resolveRoute(\"api/settings/domain.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/settings/domain/notify\",\n\t\tentrypoint: resolveRoute(\"api/settings/domain-notify.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/site/domain-proof\",\n\t\tentrypoint: resolveRoute(\"api/site/domain-proof.ts\"),\n\t});\n\n\t// Backup routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/settings/backups\",\n\t\tentrypoint: resolveRoute(\"api/settings/backups/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/settings/backups/export\",\n\t\tentrypoint: resolveRoute(\"api/settings/backups/export.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/settings/backups/archives\",\n\t\tentrypoint: resolveRoute(\"api/settings/backups/archives/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/settings/backups/archives/[name]\",\n\t\tentrypoint: resolveRoute(\"api/settings/backups/archives/[name].ts\"),\n\t});\n\n\t// Site transfer routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/transfer/[...path]\",\n\t\tentrypoint: resolveRoute(\"api/admin/transfer/[...path].ts\"),\n\t});\n\n\t// Snapshot route (for DO preview database population)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/snapshot\",\n\t\tentrypoint: resolveRoute(\"api/snapshot.ts\"),\n\t});\n\n\t// Taxonomy API routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/taxonomies\",\n\t\tentrypoint: resolveRoute(\"api/taxonomies/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/taxonomies/bulk-tag\",\n\t\tentrypoint: resolveRoute(\"api/taxonomies/bulk-tag.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/taxonomies/[name]\",\n\t\tentrypoint: resolveRoute(\"api/taxonomies/[name].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/taxonomies/[name]/translations\",\n\t\tentrypoint: resolveRoute(\"api/taxonomies/[name]/translations.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/taxonomies/[name]/reorder\",\n\t\tentrypoint: resolveRoute(\"api/taxonomies/[name]/reorder.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/taxonomies/[name]/terms\",\n\t\tentrypoint: resolveRoute(\"api/taxonomies/[name]/terms/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/taxonomies/[name]/terms/[slug]\",\n\t\tentrypoint: resolveRoute(\"api/taxonomies/[name]/terms/[slug].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/taxonomies/[name]/terms/[slug]/translations\",\n\t\tentrypoint: resolveRoute(\"api/taxonomies/[name]/terms/[slug]/translations.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/content/[collection]/[id]/terms/[taxonomy]\",\n\t\tentrypoint: resolveRoute(\"api/content/[collection]/[id]/terms/[taxonomy].ts\"),\n\t});\n\n\t// Relation definition routes (reference field relations)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/relations\",\n\t\tentrypoint: resolveRoute(\"api/relations/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/relations/[id]\",\n\t\tentrypoint: resolveRoute(\"api/relations/[id]/index.ts\"),\n\t});\n\n\t// Plugin management routes (under /admin to avoid conflict with plugin API routes)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/[id]\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/[id]/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/[id]/enable\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/[id]/enable.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/[id]/disable\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/[id]/disable.ts\"),\n\t});\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/[id]/mcp\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/[id]/mcp.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/[id]/settings\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/[id]/settings.ts\"),\n\t});\n\n\t// Marketplace plugin routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/marketplace\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/marketplace/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/marketplace/[id]\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/marketplace/[id]/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/marketplace/[id]/icon\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/marketplace/[id]/icon.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/marketplace/[id]/install\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/marketplace/[id]/install.ts\"),\n\t});\n\n\t// Experimental registry routes (see RFC 0001)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/registry/install\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/registry/install.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/registry/verify\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/registry/verify.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/registry/artifact\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/registry/artifact.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/registry/publisher-handle\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/registry/publisher-handle.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/registry/[id]/update\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/registry/[id]/update.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/registry/[id]/uninstall\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/registry/[id]/uninstall.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/[id]/update\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/[id]/update.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/[id]/uninstall\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/[id]/uninstall.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/plugins/updates\",\n\t\tentrypoint: resolveRoute(\"api/admin/plugins/updates.ts\"),\n\t});\n\n\t// Core update notice\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/core-update\",\n\t\tentrypoint: resolveRoute(\"api/admin/core-update.ts\"),\n\t});\n\n\t// Exclusive hooks admin routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/hooks/exclusive\",\n\t\tentrypoint: resolveRoute(\"api/admin/hooks/exclusive/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/hooks/exclusive/[hookName]\",\n\t\tentrypoint: resolveRoute(\"api/admin/hooks/exclusive/[hookName].ts\"),\n\t});\n\n\t// Theme marketplace routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/themes/marketplace\",\n\t\tentrypoint: resolveRoute(\"api/admin/themes/marketplace/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/themes/marketplace/[id]\",\n\t\tentrypoint: resolveRoute(\"api/admin/themes/marketplace/[id]/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/themes/marketplace/[id]/thumbnail\",\n\t\tentrypoint: resolveRoute(\"api/admin/themes/marketplace/[id]/thumbnail.ts\"),\n\t});\n\n\t// Theme preview signing (local, not proxied)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/themes/preview\",\n\t\tentrypoint: resolveRoute(\"api/themes/preview.ts\"),\n\t});\n\n\t// User management routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/users\",\n\t\tentrypoint: resolveRoute(\"api/admin/users/index.ts\"),\n\t});\n\n\t// Bylines routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/bylines\",\n\t\tentrypoint: resolveRoute(\"api/admin/bylines/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/bylines/[id]\",\n\t\tentrypoint: resolveRoute(\"api/admin/bylines/[id]/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/bylines/[id]/translations\",\n\t\tentrypoint: resolveRoute(\"api/admin/bylines/[id]/translations.ts\"),\n\t});\n\n\t// Byline custom-field schema routes (Discussion #1174, Phase 4).\n\t// Order matters: the static `reorder` route must precede the dynamic\n\t// `[slug]` route so Astro's resolver dispatches POST /byline-fields/reorder\n\t// to the reorder handler instead of treating \"reorder\" as a slug. The\n\t// `reorder` slug is also reserved at the data layer\n\t// (RESERVED_BYLINE_FIELD_SLUGS) so the registry rejects field creation\n\t// with that name — defence in depth.\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/byline-fields\",\n\t\tentrypoint: resolveRoute(\"api/admin/byline-fields/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/byline-fields/reorder\",\n\t\tentrypoint: resolveRoute(\"api/admin/byline-fields/reorder.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/byline-fields/[slug]\",\n\t\tentrypoint: resolveRoute(\"api/admin/byline-fields/[slug].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/byline-fields/[slug]/usage\",\n\t\tentrypoint: resolveRoute(\"api/admin/byline-fields/[slug]/usage.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/users/[id]\",\n\t\tentrypoint: resolveRoute(\"api/admin/users/[id]/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/users/[id]/disable\",\n\t\tentrypoint: resolveRoute(\"api/admin/users/[id]/disable.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/users/[id]/enable\",\n\t\tentrypoint: resolveRoute(\"api/admin/users/[id]/enable.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/users/[id]/send-recovery\",\n\t\tentrypoint: resolveRoute(\"api/admin/users/[id]/send-recovery.ts\"),\n\t});\n\n\t// API token admin routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/api-tokens\",\n\t\tentrypoint: resolveRoute(\"api/admin/api-tokens/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/api-tokens/[id]\",\n\t\tentrypoint: resolveRoute(\"api/admin/api-tokens/[id].ts\"),\n\t});\n\n\t// OAuth client admin routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/oauth-clients\",\n\t\tentrypoint: resolveRoute(\"api/admin/oauth-clients/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/oauth-clients/[id]\",\n\t\tentrypoint: resolveRoute(\"api/admin/oauth-clients/[id].ts\"),\n\t});\n\n\t// OAuth Device Flow routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/oauth/device/code\",\n\t\tentrypoint: resolveRoute(\"api/oauth/device/code.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/oauth/device/token\",\n\t\tentrypoint: resolveRoute(\"api/oauth/device/token.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/oauth/device/authorize\",\n\t\tentrypoint: resolveRoute(\"api/oauth/device/authorize.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/oauth/token/refresh\",\n\t\tentrypoint: resolveRoute(\"api/oauth/token/refresh.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/oauth/token/revoke\",\n\t\tentrypoint: resolveRoute(\"api/oauth/token/revoke.ts\"),\n\t});\n\n\t// Auth discovery endpoint\n\tinjectRoute({\n\t\tpattern: \"/_emdash/.well-known/auth\",\n\t\tentrypoint: resolveRoute(\"api/well-known/auth.ts\"),\n\t});\n\n\t// OAuth 2.1 Authorization Code flow routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/oauth/token\",\n\t\tentrypoint: resolveRoute(\"api/oauth/token.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/oauth/authorize\",\n\t\tentrypoint: resolveRoute(\"api/oauth/authorize.ts\"),\n\t});\n\n\t// OAuth discovery endpoints (RFC 9728, RFC 8414)\n\tinjectRoute({\n\t\tpattern: \"/.well-known/oauth-protected-resource\",\n\t\tentrypoint: resolveRoute(\"api/well-known/oauth-protected-resource.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/.well-known/oauth-authorization-server/_emdash\",\n\t\tentrypoint: resolveRoute(\"api/well-known/oauth-authorization-server.ts\"),\n\t});\n\n\t// RFC 7591 Dynamic Client Registration\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/oauth/register\",\n\t\tentrypoint: resolveRoute(\"api/oauth/register.ts\"),\n\t});\n\n\t// Plugin-defined API routes\n\t// All plugin routes are handled by a single catch-all handler\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/plugins/[pluginId]/[...path]\",\n\t\tentrypoint: resolveRoute(\"api/plugins/[pluginId]/[...path].ts\"),\n\t});\n\n\t// Menu API routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/menus\",\n\t\tentrypoint: resolveRoute(\"api/menus/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/menus/[name]\",\n\t\tentrypoint: resolveRoute(\"api/menus/[name].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/menus/[name]/items\",\n\t\tentrypoint: resolveRoute(\"api/menus/[name]/items.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/menus/[name]/items/[id]\",\n\t\tentrypoint: resolveRoute(\"api/menus/[name]/items/[id].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/menus/[name]/reorder\",\n\t\tentrypoint: resolveRoute(\"api/menus/[name]/reorder.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/menus/[name]/translations\",\n\t\tentrypoint: resolveRoute(\"api/menus/[name]/translations.ts\"),\n\t});\n\n\t// Widget area routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/widget-areas\",\n\t\tentrypoint: resolveRoute(\"api/widget-areas/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/widget-components\",\n\t\tentrypoint: resolveRoute(\"api/widget-components.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/widget-areas/[name]\",\n\t\tentrypoint: resolveRoute(\"api/widget-areas/[name].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/widget-areas/[name]/widgets\",\n\t\tentrypoint: resolveRoute(\"api/widget-areas/[name]/widgets.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/widget-areas/[name]/widgets/[id]\",\n\t\tentrypoint: resolveRoute(\"api/widget-areas/[name]/widgets/[id].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/widget-areas/[name]/reorder\",\n\t\tentrypoint: resolveRoute(\"api/widget-areas/[name]/reorder.ts\"),\n\t});\n\n\t// Section routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/sections\",\n\t\tentrypoint: resolveRoute(\"api/sections/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/sections/[slug]\",\n\t\tentrypoint: resolveRoute(\"api/sections/[slug].ts\"),\n\t});\n\n\t// Redirect routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/redirects\",\n\t\tentrypoint: resolveRoute(\"api/redirects/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/redirects/404s/summary\",\n\t\tentrypoint: resolveRoute(\"api/redirects/404s/summary.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/redirects/404s\",\n\t\tentrypoint: resolveRoute(\"api/redirects/404s/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/redirects/[id]\",\n\t\tentrypoint: resolveRoute(\"api/redirects/[id].ts\"),\n\t});\n\n\t// Search routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/search\",\n\t\tentrypoint: resolveRoute(\"api/search/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/search/suggest\",\n\t\tentrypoint: resolveRoute(\"api/search/suggest.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/search/stats\",\n\t\tentrypoint: resolveRoute(\"api/search/stats.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/search/rebuild\",\n\t\tentrypoint: resolveRoute(\"api/search/rebuild.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/search/enable\",\n\t\tentrypoint: resolveRoute(\"api/search/enable.ts\"),\n\t});\n\n\t// Comment routes (public)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/comments/[collection]/[contentId]\",\n\t\tentrypoint: resolveRoute(\"api/comments/[collection]/[contentId]/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/comments/[collection]/[contentId]/reactions\",\n\t\tentrypoint: resolveRoute(\"api/comments/[collection]/[contentId]/reactions.ts\"),\n\t});\n\n\t// Comment routes (admin)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/comments\",\n\t\tentrypoint: resolveRoute(\"api/admin/comments/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/comments/counts\",\n\t\tentrypoint: resolveRoute(\"api/admin/comments/counts.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/comments/bulk\",\n\t\tentrypoint: resolveRoute(\"api/admin/comments/bulk.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/comments/[id]/status\",\n\t\tentrypoint: resolveRoute(\"api/admin/comments/[id]/status.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/comments/[id]\",\n\t\tentrypoint: resolveRoute(\"api/admin/comments/[id].ts\"),\n\t});\n\n\t// SEO routes (public, at site root)\n\tif (!options.srcDir || !hasUserDefinedPublicRoute(options.srcDir, \"sitemap.xml\")) {\n\t\tinjectRoute({\n\t\t\tpattern: \"/sitemap.xml\",\n\t\t\tentrypoint: resolveRoute(\"sitemap.xml.ts\"),\n\t\t});\n\t}\n\n\tif (!options.srcDir || !hasUserDefinedPublicRoute(options.srcDir, \"sitemap-[collection].xml\")) {\n\t\tinjectRoute({\n\t\t\tpattern: \"/sitemap-[collection].xml\",\n\t\t\tentrypoint: resolveRoute(\"sitemap-[collection].xml.ts\"),\n\t\t});\n\t}\n\n\tif (!options.srcDir || !hasUserDefinedPublicRoute(options.srcDir, \"robots.txt\")) {\n\t\tinjectRoute({\n\t\t\tpattern: \"/robots.txt\",\n\t\t\tentrypoint: resolveRoute(\"robots.txt.ts\"),\n\t\t});\n\t}\n\n\t// Setup wizard API routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/setup/status\",\n\t\tentrypoint: resolveRoute(\"api/setup/status.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/setup\",\n\t\tentrypoint: resolveRoute(\"api/setup/index.ts\"),\n\t});\n\n\t// Auth API routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/setup/admin\",\n\t\tentrypoint: resolveRoute(\"api/setup/admin.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/setup/admin/verify\",\n\t\tentrypoint: resolveRoute(\"api/setup/admin-verify.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/setup/dev-bypass\",\n\t\tentrypoint: resolveRoute(\"api/setup/dev-bypass.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/setup/dev-reset\",\n\t\tentrypoint: resolveRoute(\"api/setup/dev-reset.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/dev/emails\",\n\t\tentrypoint: resolveRoute(\"api/dev/emails.ts\"),\n\t});\n\n\tif (options.cloudflareDevScheduler) {\n\t\tinjectRoute({\n\t\t\tpattern: \"/_emdash/api/dev/scheduled-tasks\",\n\t\t\tentrypoint: resolveRoute(\"api/dev/scheduled-tasks.ts\"),\n\t\t});\n\t}\n\n\t// Current user endpoint (always available)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/me\",\n\t\tentrypoint: resolveRoute(\"api/auth/me.ts\"),\n\t});\n\n\t// Logout is always available (though behavior differs by auth mode)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/logout\",\n\t\tentrypoint: resolveRoute(\"api/auth/logout.ts\"),\n\t});\n}\n\n/**\n * Injects the MCP (Model Context Protocol) server route.\n * Only injected when `mcp: true` is set in the EmDash config.\n */\nexport function injectMcpRoute(injectRoute: InjectRoute): void {\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/mcp\",\n\t\tentrypoint: resolveRoute(\"api/mcp.ts\"),\n\t});\n}\n\n/**\n * Injects routes from pluggable auth providers.\n *\n * Each provider declares the routes it needs in its `AuthProviderDescriptor.routes` array.\n * Routes are injected at build time so Vite can bundle them.\n */\nexport function injectAuthProviderRoutes(\n\tinjectRoute: InjectRoute,\n\tproviders: Array<{ routes?: Array<{ pattern: string; entrypoint: string }> }>,\n): void {\n\tfor (const provider of providers) {\n\t\tif (provider.routes) {\n\t\t\tfor (const route of provider.routes) {\n\t\t\t\tinjectRoute({\n\t\t\t\t\tpattern: route.pattern,\n\t\t\t\t\tentrypoint: route.entrypoint,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Injects passkey/oauth/magic-link auth routes.\n * Only used when NOT using external auth.\n */\nexport function injectBuiltinAuthRoutes(injectRoute: InjectRoute): void {\n\t// Passkey authentication routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/passkey/options\",\n\t\tentrypoint: resolveRoute(\"api/auth/passkey/options.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/passkey/verify\",\n\t\tentrypoint: resolveRoute(\"api/auth/passkey/verify.ts\"),\n\t});\n\n\t// Passkey management routes (authenticated users)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/passkey\",\n\t\tentrypoint: resolveRoute(\"api/auth/passkey/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/passkey/register/options\",\n\t\tentrypoint: resolveRoute(\"api/auth/passkey/register/options.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/passkey/register/verify\",\n\t\tentrypoint: resolveRoute(\"api/auth/passkey/register/verify.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/passkey/[id]\",\n\t\tentrypoint: resolveRoute(\"api/auth/passkey/[id].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/dev-bypass\",\n\t\tentrypoint: resolveRoute(\"api/auth/dev-bypass.ts\"),\n\t});\n\n\t// Invite routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/invite\",\n\t\tentrypoint: resolveRoute(\"api/auth/invite/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/invite/accept\",\n\t\tentrypoint: resolveRoute(\"api/auth/invite/accept.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/invite/complete\",\n\t\tentrypoint: resolveRoute(\"api/auth/invite/complete.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/invite/register-options\",\n\t\tentrypoint: resolveRoute(\"api/auth/invite/register-options.ts\"),\n\t});\n\n\t// Magic link routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/magic-link/send\",\n\t\tentrypoint: resolveRoute(\"api/auth/magic-link/send.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/magic-link/verify\",\n\t\tentrypoint: resolveRoute(\"api/auth/magic-link/verify.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/handover\",\n\t\tentrypoint: resolveRoute(\"api/auth/handover.ts\"),\n\t});\n\n\t// OAuth routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/oauth/[provider]\",\n\t\tentrypoint: resolveRoute(\"api/auth/oauth/[provider].ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/oauth/[provider]/callback\",\n\t\tentrypoint: resolveRoute(\"api/auth/oauth/[provider]/callback.ts\"),\n\t});\n\n\t// Self-signup routes\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/signup/request\",\n\t\tentrypoint: resolveRoute(\"api/auth/signup/request.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/signup/verify\",\n\t\tentrypoint: resolveRoute(\"api/auth/signup/verify.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/auth/signup/complete\",\n\t\tentrypoint: resolveRoute(\"api/auth/signup/complete.ts\"),\n\t});\n\n\t// Allowed domains admin routes (only relevant for passkey mode)\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/allowed-domains\",\n\t\tentrypoint: resolveRoute(\"api/admin/allowed-domains/index.ts\"),\n\t});\n\n\tinjectRoute({\n\t\tpattern: \"/_emdash/api/admin/allowed-domains/[domain]\",\n\t\tentrypoint: resolveRoute(\"api/admin/allowed-domains/[domain].ts\"),\n\t});\n}\n","/**\n * Vite Plugin Configuration\n *\n * Defines the Vite plugin that handles virtual modules and other\n * Vite-specific configuration for EmDash.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, isAbsolute, relative, resolve, win32 } from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\n\nimport type { AstroConfig } from \"astro\";\nimport type { Plugin } from \"vite\";\n\nimport { COMMIT, VERSION } from \"../../version.js\";\nimport { createAdminLocaleResolverPlugin, readAdminLocaleManifest } from \"./admin-locales.js\";\nimport type { EmDashConfig, PluginDescriptor } from \"./runtime.js\";\nimport {\n\tVIRTUAL_CONFIG_ID,\n\tRESOLVED_VIRTUAL_CONFIG_ID,\n\tVIRTUAL_DIALECT_ID,\n\tRESOLVED_VIRTUAL_DIALECT_ID,\n\tVIRTUAL_STORAGE_ID,\n\tRESOLVED_VIRTUAL_STORAGE_ID,\n\tVIRTUAL_OBJECT_CACHE_ID,\n\tRESOLVED_VIRTUAL_OBJECT_CACHE_ID,\n\tVIRTUAL_ADMIN_REGISTRY_ID,\n\tRESOLVED_VIRTUAL_ADMIN_REGISTRY_ID,\n\tVIRTUAL_PLUGINS_ID,\n\tRESOLVED_VIRTUAL_PLUGINS_ID,\n\tVIRTUAL_SANDBOX_RUNNER_ID,\n\tRESOLVED_VIRTUAL_SANDBOX_RUNNER_ID,\n\tVIRTUAL_SANDBOXED_PLUGINS_ID,\n\tRESOLVED_VIRTUAL_SANDBOXED_PLUGINS_ID,\n\tVIRTUAL_AUTH_ID,\n\tRESOLVED_VIRTUAL_AUTH_ID,\n\tVIRTUAL_AUTH_PROVIDERS_ID,\n\tRESOLVED_VIRTUAL_AUTH_PROVIDERS_ID,\n\tVIRTUAL_MEDIA_PROVIDERS_ID,\n\tRESOLVED_VIRTUAL_MEDIA_PROVIDERS_ID,\n\tVIRTUAL_BLOCK_COMPONENTS_ID,\n\tRESOLVED_VIRTUAL_BLOCK_COMPONENTS_ID,\n\tVIRTUAL_SEED_ID,\n\tRESOLVED_VIRTUAL_SEED_ID,\n\tVIRTUAL_WAIT_UNTIL_ID,\n\tRESOLVED_VIRTUAL_WAIT_UNTIL_ID,\n\tVIRTUAL_SCHEDULER_ID,\n\tRESOLVED_VIRTUAL_SCHEDULER_ID,\n\tVIRTUAL_ENV_ID,\n\tRESOLVED_VIRTUAL_ENV_ID,\n\tVIRTUAL_BUILD_ID,\n\tRESOLVED_VIRTUAL_BUILD_ID,\n\tgenerateSeedModule,\n\tgenerateWaitUntilModule,\n\tgenerateSchedulerModule,\n\tgenerateEnvModule,\n\tgenerateBuildModule,\n\tgenerateConfigModule,\n\tgenerateDialectModule,\n\tgenerateStorageModule,\n\tgenerateObjectCacheModule,\n\tgenerateAuthModule,\n\tgenerateAuthProvidersModule,\n\tgeneratePluginsModule,\n\tgenerateAdminRegistryModule,\n\tgenerateSandboxRunnerModule,\n\tgenerateSandboxedPluginsModule,\n\tgenerateMediaProvidersModule,\n\tgenerateBlockComponentsModule,\n} from \"./virtual-modules.js\";\n\nconst LOCALE_MESSAGES_RE = /[/\\\\]([a-z]{2}(?:-[A-Z]{2})?)[/\\\\]messages\\.mjs$/;\n\nexport function pathToImportUrl(path: string): string {\n\treturn pathToFileURL(path, { windows: win32.isAbsolute(path) }).href;\n}\n\n/**\n * Vite plugin that compiles Lingui macros in admin source files.\n * Only active in dev mode when the admin package is aliased to source for HMR.\n * @babel/core is dynamically imported from admin's devDependencies —\n * not declared by core, never ships to end users.\n */\nexport function linguiMacroPlugin(adminSourcePath: string, adminDistPath: string): Plugin {\n\tconst adminRequire = createRequire(resolve(adminDistPath, \"index.js\"));\n\tconst babelCorePath = adminRequire.resolve(\"@babel/core\");\n\tconst linguiMacroPluginPath = adminRequire.resolve(\"@lingui/babel-plugin-lingui-macro\");\n\tconst adminSourceVitePath = adminSourcePath.replaceAll(\"\\\\\", \"/\");\n\n\treturn {\n\t\tname: \"emdash-lingui-macro\",\n\t\tenforce: \"pre\",\n\t\tresolveId(id, importer) {\n\t\t\t// Redirect relative locale catalog imports (e.g. ./de/messages.mjs) from\n\t\t\t// within admin source to the compiled dist/locales/ directory, since\n\t\t\t// lingui compile only runs during build — not in dev watch mode.\n\t\t\tif (!importer?.startsWith(adminSourceVitePath)) return;\n\t\t\tconst match = id.match(LOCALE_MESSAGES_RE);\n\t\t\tif (match?.[1]) {\n\t\t\t\treturn resolve(adminDistPath, \"locales\", match[1], \"messages.mjs\");\n\t\t\t}\n\t\t},\n\t\tasync transform(code, id) {\n\t\t\tif (!id.startsWith(adminSourceVitePath) || !code.includes(\"@lingui\")) return;\n\t\t\tconst { transformAsync } = (await import(\n\t\t\t\tpathToImportUrl(babelCorePath)\n\t\t\t)) as typeof import(\"@babel/core\");\n\t\t\tconst result = await transformAsync(code, {\n\t\t\t\tfilename: id,\n\t\t\t\tplugins: [linguiMacroPluginPath],\n\t\t\t\tparserOpts: { plugins: [\"jsx\", \"typescript\"] },\n\t\t\t});\n\t\t\tif (!result?.code) return;\n\t\t\treturn { code: result.code, map: result.map ?? undefined };\n\t\t},\n\t};\n}\n\n/**\n * Resolve path to the admin package dist directory.\n * Used for Vite alias to ensure the package is found in pnpm's isolated node_modules.\n */\nexport function resolveAdminDist(): string {\n\tconst require = createRequire(import.meta.url);\n\tconst adminPath = require.resolve(\"@emdash-cms/admin\");\n\t// Return the directory containing the built package (dist/)\n\treturn dirname(adminPath);\n}\n\n/**\n * Check whether child is inside parent without relying on simple prefix checks.\n */\nfunction isInside(parent: string, child: string): boolean {\n\tconst relativePath = relative(parent, child);\n\treturn relativePath === \"\" || (!relativePath.startsWith(\"..\") && !isAbsolute(relativePath));\n}\n\n/**\n * Resolve path to the admin package source directory.\n * In dev mode inside this repo, we alias @emdash-cms/admin to the source so\n * Vite processes it directly — giving instant HMR instead of requiring a\n * rebuild + restart. External apps should use the built package surface.\n */\nfunction resolveAdminSource(projectRoot: string): string | undefined {\n\tconst require = createRequire(import.meta.url);\n\tconst adminPath = require.resolve(\"@emdash-cms/admin\");\n\t// dist/index.js -> go up to package root, then into src/\n\tconst packageRoot = resolve(dirname(adminPath), \"..\");\n\tconst repoRoot = resolve(packageRoot, \"..\", \"..\");\n\tconst srcEntry = resolve(packageRoot, \"src\", \"index.ts\");\n\n\ttry {\n\t\tif (existsSync(srcEntry) && isInside(repoRoot, projectRoot)) {\n\t\t\treturn resolve(packageRoot, \"src\");\n\t\t}\n\t} catch {\n\t\t// Not in local repo — fall back to dist\n\t}\n\treturn undefined;\n}\n\nfunction resolveIntegrationShim(fileName: string): string {\n\tconst currentDir = dirname(fileURLToPath(import.meta.url));\n\tconst sourceShimPath = resolve(currentDir, \"shims\", fileName);\n\tif (existsSync(sourceShimPath)) {\n\t\treturn sourceShimPath;\n\t}\n\treturn resolve(currentDir, \"..\", \"..\", \"src\", \"astro\", \"integration\", \"shims\", fileName);\n}\n\nexport interface VitePluginOptions {\n\t/** Serializable config (database, storage, auth descriptors) */\n\tserializableConfig: Record<string, unknown>;\n\t/** Resolved EmDash config */\n\tresolvedConfig: EmDashConfig;\n\t/** Plugin descriptors */\n\tpluginDescriptors: PluginDescriptor[];\n\t/** Astro config */\n\tastroConfig: AstroConfig;\n}\n\n/**\n * Creates the EmDash virtual modules Vite plugin.\n */\nexport function createVirtualModulesPlugin(options: VitePluginOptions): Plugin {\n\tconst { serializableConfig, resolvedConfig, pluginDescriptors, astroConfig } = options;\n\n\tlet viteCommand: \"build\" | \"serve\" | undefined;\n\n\t// Captured once per plugin instance rather than inside load(): Vite may load\n\t// the module more than once (client and server passes, dev reloads), and a\n\t// validator that moved between those loads would invalidate at random.\n\tconst buildTime = Date.now();\n\n\treturn {\n\t\tname: \"emdash-virtual-modules\",\n\t\tconfigResolved(config) {\n\t\t\tviteCommand = config.command;\n\t\t},\n\t\tresolveId(id: string) {\n\t\t\tif (id === VIRTUAL_CONFIG_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_CONFIG_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_DIALECT_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_DIALECT_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_STORAGE_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_STORAGE_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_OBJECT_CACHE_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_OBJECT_CACHE_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_ADMIN_REGISTRY_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_ADMIN_REGISTRY_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_PLUGINS_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_PLUGINS_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_SANDBOX_RUNNER_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_SANDBOX_RUNNER_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_SANDBOXED_PLUGINS_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_SANDBOXED_PLUGINS_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_AUTH_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_AUTH_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_AUTH_PROVIDERS_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_AUTH_PROVIDERS_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_MEDIA_PROVIDERS_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_MEDIA_PROVIDERS_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_BLOCK_COMPONENTS_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_BLOCK_COMPONENTS_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_SEED_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_SEED_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_WAIT_UNTIL_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_WAIT_UNTIL_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_SCHEDULER_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_SCHEDULER_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_ENV_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_ENV_ID;\n\t\t\t}\n\t\t\tif (id === VIRTUAL_BUILD_ID) {\n\t\t\t\treturn RESOLVED_VIRTUAL_BUILD_ID;\n\t\t\t}\n\t\t},\n\t\tload(id: string) {\n\t\t\tif (id === RESOLVED_VIRTUAL_CONFIG_ID) {\n\t\t\t\treturn generateConfigModule(serializableConfig);\n\t\t\t}\n\t\t\t// Generate a module that statically imports the configured dialect\n\t\t\t// This allows Vite to properly resolve and bundle it\n\t\t\tif (id === RESOLVED_VIRTUAL_DIALECT_ID) {\n\t\t\t\treturn generateDialectModule({\n\t\t\t\t\tentrypoint: resolvedConfig.database?.entrypoint,\n\t\t\t\t\ttype: resolvedConfig.database?.type,\n\t\t\t\t\tsupportsRequestScope: resolvedConfig.database?.supportsRequestScope ?? false,\n\t\t\t\t\tsupportsCoalescing: resolvedConfig.database?.supportsCoalescing ?? false,\n\t\t\t\t\tsupportsCollectionDeletionGuard:\n\t\t\t\t\t\tresolvedConfig.database?.supportsCollectionDeletionGuard ?? false,\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Generate a module that statically imports the configured storage\n\t\t\tif (id === RESOLVED_VIRTUAL_STORAGE_ID) {\n\t\t\t\treturn generateStorageModule(resolvedConfig.storage?.entrypoint);\n\t\t\t}\n\t\t\t// Generate the object-cache module — statically imports the\n\t\t\t// configured backend factory, or exports undefined (cache off).\n\t\t\tif (id === RESOLVED_VIRTUAL_OBJECT_CACHE_ID) {\n\t\t\t\treturn generateObjectCacheModule(\n\t\t\t\t\tresolvedConfig.objectCache?.entrypoint,\n\t\t\t\t\tresolvedConfig.objectCache?.config,\n\t\t\t\t);\n\t\t\t}\n\t\t\t// Generate plugins module that imports and instantiates all plugins\n\t\t\tif (id === RESOLVED_VIRTUAL_PLUGINS_ID) {\n\t\t\t\treturn generatePluginsModule(pluginDescriptors);\n\t\t\t}\n\t\t\t// Generate admin registry module with plugin components\n\t\t\tif (id === RESOLVED_VIRTUAL_ADMIN_REGISTRY_ID) {\n\t\t\t\t// Include both trusted and sandboxed plugins\n\t\t\t\tconst allDescriptors = [...pluginDescriptors, ...(resolvedConfig.sandboxed ?? [])];\n\t\t\t\treturn generateAdminRegistryModule(allDescriptors);\n\t\t\t}\n\t\t\t// Generate sandbox runner module\n\t\t\tif (id === RESOLVED_VIRTUAL_SANDBOX_RUNNER_ID) {\n\t\t\t\treturn generateSandboxRunnerModule(resolvedConfig.sandboxRunner, resolvedConfig.sandbox);\n\t\t\t}\n\t\t\t// Generate sandboxed plugins config module\n\t\t\tif (id === RESOLVED_VIRTUAL_SANDBOXED_PLUGINS_ID) {\n\t\t\t\t// Pass project root for proper module resolution\n\t\t\t\tconst projectRoot = fileURLToPath(astroConfig.root);\n\t\t\t\treturn generateSandboxedPluginsModule(\n\t\t\t\t\tresolvedConfig.sandboxed ?? [],\n\t\t\t\t\tprojectRoot,\n\t\t\t\t\t(filePath) => this.addWatchFile(filePath),\n\t\t\t\t);\n\t\t\t}\n\t\t\t// Generate auth module that statically imports the configured auth provider\n\t\t\tif (id === RESOLVED_VIRTUAL_AUTH_ID) {\n\t\t\t\tconst authDescriptor = resolvedConfig.auth;\n\t\t\t\tif (!authDescriptor || !(\"entrypoint\" in authDescriptor)) {\n\t\t\t\t\treturn generateAuthModule(undefined);\n\t\t\t\t}\n\t\t\t\treturn generateAuthModule(authDescriptor.entrypoint);\n\t\t\t}\n\t\t\t// Generate auth providers module (pluggable login methods)\n\t\t\tif (id === RESOLVED_VIRTUAL_AUTH_PROVIDERS_ID) {\n\t\t\t\treturn generateAuthProvidersModule(resolvedConfig.authProviders ?? []);\n\t\t\t}\n\t\t\t// Generate media providers module\n\t\t\tif (id === RESOLVED_VIRTUAL_MEDIA_PROVIDERS_ID) {\n\t\t\t\treturn generateMediaProvidersModule(resolvedConfig.mediaProviders ?? []);\n\t\t\t}\n\t\t\t// Generate block components module (plugin rendering components for PortableText)\n\t\t\tif (id === RESOLVED_VIRTUAL_BLOCK_COMPONENTS_ID) {\n\t\t\t\treturn generateBlockComponentsModule(pluginDescriptors);\n\t\t\t}\n\t\t\t// Generate seed module — embeds user seed or default at build time\n\t\t\tif (id === RESOLVED_VIRTUAL_SEED_ID) {\n\t\t\t\tconst projectRoot = fileURLToPath(astroConfig.root);\n\t\t\t\treturn generateSeedModule(projectRoot, viteCommand === \"serve\");\n\t\t\t}\n\t\t\t// Generate wait-until module — re-exports cloudflare:workers'\n\t\t\t// waitUntil under the Cloudflare adapter, undefined otherwise.\n\t\t\tif (id === RESOLVED_VIRTUAL_WAIT_UNTIL_ID) {\n\t\t\t\treturn generateWaitUntilModule(astroConfig.adapter?.name);\n\t\t\t}\n\t\t\t// Generate scheduler module — a NodeCronScheduler factory on\n\t\t\t// long-lived runtimes, or null under the Cloudflare adapter where\n\t\t\t// platform events drive scheduled work.\n\t\t\tif (id === RESOLVED_VIRTUAL_SCHEDULER_ID) {\n\t\t\t\treturn generateSchedulerModule(astroConfig.adapter?.name);\n\t\t\t}\n\t\t\t// Generate env module — re-exports cloudflare:workers' env under\n\t\t\t// the Cloudflare adapter, undefined otherwise (#1736).\n\t\t\tif (id === RESOLVED_VIRTUAL_ENV_ID) {\n\t\t\t\treturn generateEnvModule(astroConfig.adapter?.name);\n\t\t\t}\n\t\t\tif (id === RESOLVED_VIRTUAL_BUILD_ID) {\n\t\t\t\treturn generateBuildModule(buildTime);\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Modules that contain native Node.js addons or Node-only code.\n * These must be external in SSR to avoid bundling failures on Node.\n * On Cloudflare, the adapter handles its own externalization — setting\n * ssr.external there conflicts with @cloudflare/vite-plugin's validation.\n */\n// Matches the admin stylesheet import with or without a trailing query (e.g.\n// `?url`), so both forms resolve to dist rather than the source alias.\nconst ADMIN_STYLES_ALIAS = /^@emdash-cms\\/admin\\/styles\\.css/;\n\nconst NODE_NATIVE_EXTERNALS = [\"@libsql/kysely-libsql\", \"pg\"];\n\n/**\n * Detect whether the Cloudflare adapter is being used.\n */\nfunction isCloudflareAdapter(astroConfig: AstroConfig): boolean {\n\treturn astroConfig.adapter?.name === \"@astrojs/cloudflare\";\n}\n\n/**\n * Workers built-ins that core imports dynamically behind a runtime fallback.\n * Outside workerd nothing resolves them, and Rollup fails the server build on\n * an unresolved import, so they are left to the runtime. List only core's own\n * imports: any other `cloudflare:` import on a non-Cloudflare adapter should\n * still fail the build instead of failing at runtime.\n */\nconst CORE_WORKERS_BUILTINS = new Set([\"cloudflare:sockets\"]);\n\nfunction createWorkersBuiltinsExternalPlugin(): Plugin {\n\treturn {\n\t\tname: \"emdash-workers-builtins-external\",\n\t\tapply: \"build\",\n\t\tresolveId(id) {\n\t\t\tif (CORE_WORKERS_BUILTINS.has(id) && this.environment.config.consumer === \"server\") {\n\t\t\t\treturn { id, external: true };\n\t\t\t}\n\t\t},\n\t};\n}\n\nfunction canResolveProjectDependency(projectRoot: string, specifier: string): boolean {\n\ttry {\n\t\tcreateRequire(resolve(projectRoot, \"package.json\")).resolve(specifier);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Creates the Vite config update for EmDash.\n */\nexport function createViteConfig(\n\toptions: VitePluginOptions,\n\tcommand: \"dev\" | \"build\" | \"preview\" | \"sync\",\n): NonNullable<AstroConfig[\"vite\"]> {\n\tconst adminDistPath = resolveAdminDist();\n\tconst cloudflare = isCloudflareAdapter(options.astroConfig);\n\tconst isDev = command === \"dev\";\n\tconst projectRoot = fileURLToPath(options.astroConfig.root);\n\tconst hasAstroConsoleLogger = canResolveProjectDependency(projectRoot, \"astro/logger/console\");\n\n\tconst adminSourcePath = isDev ? resolveAdminSource(projectRoot) : undefined;\n\tconst useSource = adminSourcePath !== undefined;\n\tconst adminLocales = options.resolvedConfig.admin?.locales;\n\tconst useSyncExternalStoreShimPath = resolveIntegrationShim(\"use-sync-external-store.js\");\n\tconst useSyncExternalStoreWithSelectorShimPath = resolveIntegrationShim(\n\t\t\"use-sync-external-store-with-selector.js\",\n\t);\n\tconst configuredWatchIgnored = options.astroConfig.vite?.server?.watch?.ignored;\n\tconst watchIgnored = Array.isArray(configuredWatchIgnored)\n\t\t? configuredWatchIgnored\n\t\t: configuredWatchIgnored\n\t\t\t? [configuredWatchIgnored]\n\t\t\t: [];\n\n\treturn {\n\t\t// Astro SSR routes resolve version.ts from source (not tsdown dist),\n\t\t// so Vite needs its own define pass for the __EMDASH_*__ placeholders.\n\t\tdefine: {\n\t\t\t__EMDASH_VERSION__: JSON.stringify(VERSION),\n\t\t\t__EMDASH_COMMIT__: JSON.stringify(COMMIT),\n\t\t\t__EMDASH_PSEUDO_LOCALE__: JSON.stringify(\n\t\t\t\tisDev && process.env[\"EMDASH_PSEUDO_LOCALE\"] === \"1\",\n\t\t\t),\n\t\t\t__EMDASH_ADMIN_LOCALES__: JSON.stringify(adminLocales ?? null),\n\t\t},\n\t\tresolve: {\n\t\t\tdedupe: [\"@emdash-cms/admin\", \"react\", \"react-dom\"],\n\t\t\t// Array form so more-specific entries are checked first.\n\t\t\t// The styles.css alias must come before the package alias, otherwise\n\t\t\t// Vite's prefix matching on \"@emdash-cms/admin\" would resolve\n\t\t\t// \"@emdash-cms/admin/styles.css\" through the source directory.\n\t\t\t// Regex (not string) so the `?url` variant — admin.astro imports the\n\t\t\t// stylesheet as `?url` to keep it out of the page CSS graph — also\n\t\t\t// resolves to dist; a string `find` only matches on a `/` or end\n\t\t\t// boundary, so `styles.css?url` would slip through to the source alias.\n\t\t\talias: [\n\t\t\t\t{ find: ADMIN_STYLES_ALIAS, replacement: resolve(adminDistPath, \"styles.css\") },\n\t\t\t\t{ find: \"@emdash-cms/admin\", replacement: useSource ? adminSourcePath : adminDistPath },\n\t\t\t\t// `use-sync-external-store/shim` is a React <18 polyfill that ships\n\t\t\t\t// only as CJS. It's pulled in transitively by `@tiptap/react`. With\n\t\t\t\t// pnpm's virtual store the file lives under .pnpm/, where Vite's\n\t\t\t\t// dep scanner can't reach it for pre-bundling — so the browser is\n\t\t\t\t// served raw `module.exports` and hydration fails with\n\t\t\t\t// `SyntaxError: ... does not provide an export named\n\t\t\t\t// 'useSyncExternalStore'`. Redirect both shim entry points to a\n\t\t\t\t// tiny ESM shim file that re-exports React's built-in hook, and\n\t\t\t\t// redirect the selector entry points to an ESM wrapper around that\n\t\t\t\t// hook. The absolute file paths are required because Vite/Rolldown\n\t\t\t\t// dependency optimization applies aliases without EmDash's virtual\n\t\t\t\t// module plugin. This also avoids the package main entry's React\n\t\t\t\t// 18+ dev warning.\n\t\t\t\t{\n\t\t\t\t\tfind: \"use-sync-external-store/shim/with-selector.js\",\n\t\t\t\t\treplacement: useSyncExternalStoreWithSelectorShimPath,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tfind: \"use-sync-external-store/shim/with-selector\",\n\t\t\t\t\treplacement: useSyncExternalStoreWithSelectorShimPath,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tfind: \"use-sync-external-store/shim/index.js\",\n\t\t\t\t\treplacement: useSyncExternalStoreShimPath,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tfind: \"use-sync-external-store/shim\",\n\t\t\t\t\treplacement: useSyncExternalStoreShimPath,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- Monorepo has both vite 6 (docs) and vite 7 (core). tsgo resolves correctly.\n\t\tplugins: [\n\t\t\tcreateVirtualModulesPlugin(options),\n\t\t\t// Must precede the Lingui macro plugin, which redirects source\n\t\t\t// catalog imports to dist/ in dev.\n\t\t\t...(adminLocales\n\t\t\t\t? [\n\t\t\t\t\t\tcreateAdminLocaleResolverPlugin({\n\t\t\t\t\t\t\tadminDistPath,\n\t\t\t\t\t\t\tadminSourcePath,\n\t\t\t\t\t\t\tlocales: adminLocales,\n\t\t\t\t\t\t\tmanifest: readAdminLocaleManifest(adminDistPath),\n\t\t\t\t\t\t}),\n\t\t\t\t\t]\n\t\t\t\t: []),\n\t\t\t...(cloudflare ? [] : [createWorkersBuiltinsExternalPlugin()]),\n\t\t\t// In dev mode with source alias, compile Lingui macros on the fly\n\t\t\t// and redirect locale .mjs imports to dist/.\n\t\t\t// In production, macros are pre-compiled by tsdown in the admin package.\n\t\t\t...(useSource ? [linguiMacroPlugin(adminSourcePath, adminDistPath)] : []),\n\t\t] as NonNullable<AstroConfig[\"vite\"]>[\"plugins\"],\n\t\tserver: {\n\t\t\twatch: {\n\t\t\t\tignored: [...watchIgnored, \"**/.wrangler/**\"],\n\t\t\t},\n\t\t},\n\t\t// Handle native modules for SSR.\n\t\t// On Node: external keeps native addons out of the SSR bundle.\n\t\t// On Cloudflare: skip — the adapter handles externalization, and setting\n\t\t// ssr.external conflicts with @cloudflare/vite-plugin's resolve.external validation.\n\t\tssr: cloudflare\n\t\t\t? {\n\t\t\t\t\tnoExternal: [\"emdash\", \"@emdash-cms/admin\"],\n\t\t\t\t\t// Pre-bundle EmDash's runtime deps for workerd. Without this,\n\t\t\t\t\t// Vite discovers them one-by-one on first request, causing workerd\n\t\t\t\t\t// to enter \"worker cancelled\" state on cold cache.\n\t\t\t\t\toptimizeDeps: {\n\t\t\t\t\t\t// Exclude EmDash virtual modules from esbuild's dependency\n\t\t\t\t\t\t// scan. These are resolved by the Vite plugin at transform time,\n\t\t\t\t\t\t// but esbuild encounters them when crawling emdash's dist files\n\t\t\t\t\t\t// during pre-bundling and can't resolve them. Vite's exclude\n\t\t\t\t\t\t// uses prefix matching (id.startsWith(m + \"/\")), so\n\t\t\t\t\t\t// \"virtual:emdash\" matches all \"virtual:emdash/*\" imports.\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// First-party packages must also stay excluded. In a\n\t\t\t\t\t\t// real install (unlike the workspace symlink, which Vite never\n\t\t\t\t\t\t// optimizes), the optimizer bundles their dist and code-splits\n\t\t\t\t\t\t// lazily-executed dynamic imports (MCP tools, content\n\t\t\t\t\t\t// validation) into hashed chunks. A mid-session re-optimization\n\t\t\t\t\t\t// deletes those chunks while loaded modules still reference\n\t\t\t\t\t\t// them, so every content write fails with \"The file does not\n\t\t\t\t\t\t// exist at .../deps_ssr/...\" until the dev server restarts.\n\t\t\t\t\t\t// Their CJS deps are still pre-bundled via the \"parent > dep\"\n\t\t\t\t\t\t// include entries below, which resolve through excluded parents.\n\t\t\t\t\t\texclude: [\"virtual:emdash\", \"emdash\", \"@emdash-cms/admin\", \"@emdash-cms/cloudflare\"],\n\t\t\t\t\t\tinclude: [\n\t\t\t\t\t\t\t// EmDash direct deps\n\t\t\t\t\t\t\t\"emdash > @portabletext/toolkit\",\n\t\t\t\t\t\t\t\"emdash > @unpic/placeholder\",\n\t\t\t\t\t\t\t\"emdash > @atcute/client\",\n\t\t\t\t\t\t\t\"emdash > @atcute/lexicons/syntax\",\n\t\t\t\t\t\t\t\"emdash > @atcute/lexicons/validations\",\n\t\t\t\t\t\t\t\"emdash > blurhash\",\n\t\t\t\t\t\t\t\"emdash > croner\",\n\t\t\t\t\t\t\t\"emdash > jose\",\n\t\t\t\t\t\t\t\"emdash > jpeg-js\",\n\t\t\t\t\t\t\t\"emdash > kysely\",\n\t\t\t\t\t\t\t// Only imported by the migration runner, so the first\n\t\t\t\t\t\t\t// dev-bypass/setup request would otherwise discover it.\n\t\t\t\t\t\t\t\"emdash > kysely/migration\",\n\t\t\t\t\t\t\t\"emdash > mime/lite\",\n\t\t\t\t\t\t\t\"emdash > modern-tar\",\n\t\t\t\t\t\t\t\"emdash > sanitize-html\",\n\t\t\t\t\t\t\t\"emdash > @tiptap/core\",\n\t\t\t\t\t\t\t\"emdash > ulidx\",\n\t\t\t\t\t\t\t\"emdash > upng-js\",\n\t\t\t\t\t\t\t\"emdash > astro-portabletext\",\n\t\t\t\t\t\t\t\"emdash > sax\",\n\t\t\t\t\t\t\t// Deeper transitive deps\n\t\t\t\t\t\t\t\"emdash > sanitize-html > parse5\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/gutenberg-to-portable-text > @wordpress/block-serialization-default-parser\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/auth > @oslojs/crypto/ecdsa\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/auth > @oslojs/crypto/sha2\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/auth > @oslojs/webauthn\",\n\t\t\t\t\t\t\t// Registry routes are lazy, so their AT Protocol graph is not\n\t\t\t\t\t\t\t// present during Vite's initial dependency scan.\n\t\t\t\t\t\t\t\"emdash > @atcute/identity-resolver\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-lexicons > @atcute/atproto/types/label/defs\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @atcute/client\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @atcute/crypto\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @atcute/identity\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @atcute/identity-resolver\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @atcute/lexicons/syntax\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @atcute/lexicons/validations\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @atcute/multibase\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @atcute/repo\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @emdash-cms/registry-moderation > @atcute/cbor\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @emdash-cms/registry-moderation > @atcute/cid\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @emdash-cms/registry-moderation > @atcute/crypto\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/registry-client > @emdash-cms/registry-moderation > @atcute/multibase\",\n\t\t\t\t\t\t\t// Auth deps imported only on auth/login/callback routes, so\n\t\t\t\t\t\t\t// the initial page scan misses them. Pre-bundle to avoid a\n\t\t\t\t\t\t\t// re-optimize + reload cascade on first authenticated request.\n\t\t\t\t\t\t\t\"emdash > @oslojs/crypto/hmac\",\n\t\t\t\t\t\t\t\"emdash > @oslojs/crypto/subtle\",\n\t\t\t\t\t\t\t\"emdash > @oslojs/crypto/rsa\",\n\t\t\t\t\t\t\t\"emdash > arctic\",\n\t\t\t\t\t\t\t// MCP SDK — server/index.js statically imports ajv (CJS-only).\n\t\t\t\t\t\t\t// Pre-bundling converts CJS to ESM so workerd can load it.\n\t\t\t\t\t\t\t\"emdash > @modelcontextprotocol/sdk > ajv\",\n\t\t\t\t\t\t\t\"emdash > @modelcontextprotocol/sdk > ajv-formats\",\n\t\t\t\t\t\t\t// MCP server entrypoints — only imported on the MCP route, so\n\t\t\t\t\t\t\t// also missed by the initial scan.\n\t\t\t\t\t\t\t\"emdash > @modelcontextprotocol/sdk/server/mcp.js\",\n\t\t\t\t\t\t\t\"emdash > @modelcontextprotocol/sdk/server/webStandardStreamableHttp.js\",\n\t\t\t\t\t\t\t// Admin shell SSR deps, reached only when the admin route is\n\t\t\t\t\t\t\t// first rendered.\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @lingui/react\",\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @cloudflare/kumo/primitives\",\n\t\t\t\t\t\t\t// System email copy resolution (invite, magic link) — reached\n\t\t\t\t\t\t\t// only when one of those routes sends an email.\n\t\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @lingui/core\",\n\t\t\t\t\t\t\t// React (commonly used, may be hoisted)\n\t\t\t\t\t\t\t\"react\",\n\t\t\t\t\t\t\t\"react/jsx-dev-runtime\",\n\t\t\t\t\t\t\t\"react/jsx-runtime\",\n\t\t\t\t\t\t\t\"react-dom\",\n\t\t\t\t\t\t\t\"react-dom/server\",\n\t\t\t\t\t\t\t// Top-level deps (use astro > path for pnpm compat)\n\t\t\t\t\t\t\t\"astro > zod/v4\",\n\t\t\t\t\t\t\t\"astro > zod/v4/core\",\n\t\t\t\t\t\t\t\"astro/zod\",\n\t\t\t\t\t\t\t// zod-generator imports the bare `zod` entry, not `zod/v4`\n\t\t\t\t\t\t\t\"emdash > zod\",\n\t\t\t\t\t\t\t\"@emdash-cms/cloudflare > kysely-d1\",\n\t\t\t\t\t\t\t// Astro internal deps not covered by @astrojs/cloudflare adapter\n\t\t\t\t\t\t\t\"astro/app/entrypoint\",\n\t\t\t\t\t\t\t\"astro/app/manifest\",\n\t\t\t\t\t\t\t...(hasAstroConsoleLogger ? [\"astro/logger/console\"] : []),\n\t\t\t\t\t\t\t\"astro/virtual-modules/middleware.js\",\n\t\t\t\t\t\t\t\"astro/virtual-modules/live-config\",\n\t\t\t\t\t\t\t\"astro/content/runtime\",\n\t\t\t\t\t\t\t\"astro/assets/utils/inferRemoteSize.js\",\n\t\t\t\t\t\t\t\"astro/assets/fonts/runtime.js\",\n\t\t\t\t\t\t\t\"astro/assets/services/noop\",\n\t\t\t\t\t\t\t\"@astrojs/cloudflare/image-service\",\n\t\t\t\t\t\t\t// Only imported by the /_image route, so the first image\n\t\t\t\t\t\t\t// request would otherwise discover it.\n\t\t\t\t\t\t\t\"@astrojs/cloudflare/image-transform-endpoint\",\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\texternal: NODE_NATIVE_EXTERNALS,\n\t\t\t\t\tnoExternal: [\"emdash\", \"@emdash-cms/admin\"],\n\t\t\t\t},\n\t\toptimizeDeps: {\n\t\t\t// When using source, don't pre-bundle JS — let Vite transform on the fly for HMR.\n\t\t\t// When using dist, pre-bundle to avoid re-optimization on first hydration.\n\t\t\t// lowlight pulls in a CommonJS highlight.js entry, so the inline Portable\n\t\t\t// Text editor requires these to be pre-bundled with ESM interop in dev.\n\t\t\t// Bare ids would not resolve on pnpm sites, which have no top-level copy.\n\t\t\tinclude: useSource\n\t\t\t\t? [\n\t\t\t\t\t\t\"@astrojs/react/client.js\",\n\t\t\t\t\t\t\"emdash > lowlight\",\n\t\t\t\t\t\t\"emdash > highlight.js\",\n\t\t\t\t\t\t\"emdash > highlight.js/lib/core\",\n\t\t\t\t\t\t// The HTML block's code editor loads these lazily. Discovering\n\t\t\t\t\t\t// them on first use would re-optimize and reload the admin.\n\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @codemirror/autocomplete\",\n\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @codemirror/commands\",\n\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @codemirror/lang-css\",\n\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @codemirror/lang-html\",\n\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @codemirror/lang-javascript\",\n\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @codemirror/language\",\n\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @codemirror/state\",\n\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @codemirror/view\",\n\t\t\t\t\t\t\"emdash > @emdash-cms/admin > @lezer/highlight\",\n\t\t\t\t\t\t// Each admin language loads its date locale on first use.\n\t\t\t\t\t\t\"emdash > @emdash-cms/admin > react-day-picker/locale/*\",\n\t\t\t\t\t]\n\t\t\t\t: [\n\t\t\t\t\t\t\"@emdash-cms/admin\",\n\t\t\t\t\t\t\"@astrojs/react/client.js\",\n\t\t\t\t\t\t\"emdash > lowlight\",\n\t\t\t\t\t\t\"emdash > highlight.js\",\n\t\t\t\t\t\t\"emdash > highlight.js/lib/core\",\n\t\t\t\t\t],\n\t\t\texclude: cloudflare ? [\"virtual:emdash\"] : [...NODE_NATIVE_EXTERNALS, \"virtual:emdash\"],\n\t\t},\n\t};\n}\n","/**\n * Runtime utilities for EmDash\n *\n * This file contains functions that are used at runtime (in middleware, routes, etc.)\n * and must work in all environments including Cloudflare Workers.\n *\n * DO NOT import Node.js-only modules here (fs, path, module, etc.)\n */\n\nimport type { ManifestHookEntry, ManifestRouteEntry } from \"@emdash-cms/plugin-types\";\n\nimport type { AuthDescriptor, AuthProviderDescriptor } from \"../../auth/types.js\";\nimport type { RuntimeMigrationConfig } from \"../../database/migrations/policy.js\";\nimport type { DatabaseDescriptor } from \"../../db/adapters.js\";\nimport type { MediaProviderDescriptor } from \"../../media/types.js\";\nimport type { ObjectCacheDescriptor } from \"../../object-cache/types.js\";\nimport type {\n\tFieldWidgetConfig,\n\tPluginEditorAction,\n\tPluginEditorPanel,\n\tPluginMcpManifestConfig,\n\tPortableTextBlockConfig,\n\tResolvedPlugin,\n\tSettingField,\n} from \"../../plugins/types.js\";\nimport type { RegistryConfigOption } from \"../../registry/types.js\";\nimport type { StorageDescriptor } from \"../storage/types.js\";\n\nexport type { RegistryConfig, RegistryConfigOption } from \"../../registry/types.js\";\n\nexport type { ResolvedPlugin };\nexport type { MediaProviderDescriptor };\n\n/**\n * Admin page definition (copied from plugins/types to avoid circular deps)\n */\nexport interface PluginAdminPage {\n\tpath: string;\n\tlabel: string;\n\ticon?: string;\n}\n\n/**\n * Dashboard widget definition (copied from plugins/types to avoid circular deps)\n */\nexport interface PluginDashboardWidget {\n\tid: string;\n\tsize?: \"full\" | \"half\" | \"third\";\n\ttitle?: string;\n}\n\n/**\n * Plugin descriptor - returned by plugin factory functions\n *\n * Contains all static metadata needed for manifest and admin UI,\n * plus the entrypoint for runtime instantiation.\n *\n * @example\n * ```ts\n * export function myPlugin(options?: MyPluginOptions): PluginDescriptor {\n * return {\n * id: \"my-plugin\",\n * version: \"1.0.0\",\n * entrypoint: \"@my-org/emdash-plugin-foo\",\n * options: options ?? {},\n * adminEntry: \"@my-org/emdash-plugin-foo/admin\",\n * adminPages: [{ path: \"/settings\", label: \"Settings\" }],\n * };\n * }\n * ```\n */\n/**\n * Storage collection declaration for sandboxed plugins\n */\nexport interface StorageCollectionDeclaration {\n\tindexes?: string[];\n\tuniqueIndexes?: string[];\n}\n\nexport interface PluginDescriptor<TOptions extends object = object> {\n\t/** Unique plugin identifier */\n\tid: string;\n\t/** Plugin version (semver) */\n\tversion: string;\n\t/** Module specifier to import (e.g., \"@emdash-cms/plugin-api-test\") */\n\tentrypoint: string;\n\t/**\n\t * Options to pass to createPlugin(). Native format only.\n\t * Standard-format plugins configure themselves via KV settings\n\t * and Block Kit admin pages -- not constructor options.\n\t */\n\toptions?: TOptions;\n\t/**\n\t * Plugin format. Determines how the entrypoint is loaded:\n\t * - `\"standard\"` -- exports `definePlugin({ hooks, routes })` as default.\n\t * Wrapped with `adaptSandboxEntry` for in-process execution. Can run in both\n\t * `plugins: []` (in-process) and `sandboxed: []` (isolate).\n\t * - `\"native\"` -- exports `createPlugin(options)` returning a `ResolvedPlugin`.\n\t * Can only run in `plugins: []`. Cannot be sandboxed or published to marketplace.\n\t *\n\t * Defaults to `\"native\"` when unset.\n\t *\n\t */\n\tformat?: \"standard\" | \"native\";\n\t/** Admin UI module specifier (e.g., \"@emdash-cms/plugin-audit-log/admin\") */\n\tadminEntry?: string;\n\t/** Module specifier for site-side Astro rendering components (must export `blockComponents`) */\n\tcomponentsEntry?: string;\n\t/** Admin pages for navigation */\n\tadminPages?: PluginAdminPage[];\n\t/** Dashboard widgets */\n\tadminWidgets?: PluginDashboardWidget[];\n\t/** Saved-entry Block Kit panels. */\n\teditorPanels?: PluginEditorPanel[];\n\t/** Saved-entry host-rendered actions. */\n\teditorActions?: PluginEditorAction[];\n\t/** Settings schema for the auto-generated admin settings form */\n\tsettingsSchema?: Record<string, SettingField>;\n\t/**\n\t * Portable Text block types this plugin contributes to the editor.\n\t * Declarative (Block Kit) — surfaced in the admin slash menu and consumed\n\t * from the manifest, so standard/sandboxed plugins can contribute blocks\n\t * without a native render component.\n\t */\n\tportableTextBlocks?: PortableTextBlockConfig[];\n\t/** Field widget types this plugin contributes for schema-field editing UIs. */\n\tfieldWidgets?: FieldWidgetConfig[];\n\n\t// === Sandbox-specific fields (for sandboxed plugins) ===\n\n\t/**\n\t * Capabilities the plugin requests.\n\t * For standard-format plugins, capabilities are enforced in both trusted and\n\t * sandboxed modes via the PluginContextFactory.\n\t */\n\tcapabilities?: string[];\n\t/**\n\t * Allowed hosts for network:fetch capability\n\t * Supports wildcards like \"*.example.com\"\n\t */\n\tallowedHosts?: string[];\n\t/**\n\t * Storage collections the plugin declares\n\t * Sandboxed plugins can only access declared collections.\n\t */\n\tstorage?: Record<string, StorageCollectionDeclaration>;\n\t/** Serialized MCP declarations emitted by the plugin build. */\n\tmcp?: PluginMcpManifestConfig;\n\t/**\n\t * Route declarations for sandboxed config-declared plugins. Mirrors\n\t * definePlugin({ routes }) and drives route auth decisions; omitted routes\n\t * default to non-public.\n\t */\n\troutes?: Array<ManifestRouteEntry | string>;\n\t/**\n\t * Hook declarations for sandboxed config-declared plugins. Mirrors\n\t * definePlugin({ hooks }).\n\t */\n\thooks?: Array<ManifestHookEntry | string>;\n}\n\n/**\n * Sandboxed plugin descriptor - same format as PluginDescriptor\n *\n * These run in isolated V8 isolates via Worker Loader on Cloudflare.\n * The `entrypoint` is resolved to a file and bundled at build time.\n */\nexport type SandboxedPluginDescriptor<TOptions extends object = object> =\n\tPluginDescriptor<TOptions>;\n\nexport interface EmDashConfig {\n\t/**\n\t * Database configuration\n\t *\n\t * Use one of the adapter functions:\n\t * - `sqlite({ url: \"file:./data.db\" })` - Local SQLite\n\t * - `libsql({ url: \"...\", authToken: \"...\" })` - Turso/libSQL\n\t * - `d1({ binding: \"DB\" })` - Cloudflare D1\n\t *\n\t * @example\n\t * ```ts\n\t * import { sqlite } from \"emdash/db\";\n\t *\n\t * emdash({\n\t * database: sqlite({ url: \"file:./data.db\" }),\n\t * })\n\t * ```\n\t */\n\tdatabase?: DatabaseDescriptor;\n\t/** Core database migration behavior at runtime. Defaults to `auto`. */\n\tmigrations?: RuntimeMigrationConfig;\n\t/**\n\t * Storage configuration (for media)\n\t */\n\tstorage?: StorageDescriptor;\n\n\t/**\n\t * Optional distributed object cache for query results.\n\t *\n\t * Off by default. When configured, content and chrome (settings, menus,\n\t * taxonomies) reads are cached in a fast key/value store and served without\n\t * touching the database on repeat requests across isolates. This offloads\n\t * read pressure from D1/SQLite, which is especially valuable on Cloudflare\n\t * where D1 has far lower request capacity than KV.\n\t *\n\t * Use a backend adapter:\n\t * - `memoryCache()` from `emdash/astro` — in-isolate (Node / local dev)\n\t * - `kvCache({ binding: \"CACHE\" })` from `@emdash-cms/cloudflare` — KV\n\t *\n\t * Preview and visual-edit requests bypass the cache, so editors previewing\n\t * see live content. All other reads — including authenticated browsing outside\n\t * edit mode — are served from the cache, which only ever stores published\n\t * content. When Astro route caching is enabled, a rendered cache fill bypasses\n\t * the object cache so a purged page cannot be rebuilt from an older snapshot.\n\t * Other requests may see stale content until isolates pick up the bumped epoch:\n\t * immediate with the memory backend, and on KV bounded by KV's edge-cache\n\t * propagation (eventual consistency, up to ~60s) plus the isolate-local\n\t * `revalidate` window (default 1s).\n\t *\n\t * Scheduled content becomes visible at query time (no write event fires when\n\t * its publish time passes), so a cached list/entry won't surface a newly-due\n\t * scheduled item until the next write to that collection or until the\n\t * entry's TTL lapses (`defaultTtl`, default 1h). Sites that rely on precise\n\t * scheduled publishing should lower `defaultTtl` accordingly.\n\t *\n\t * @example\n\t * ```ts\n\t * import { kvCache } from \"@emdash-cms/cloudflare\";\n\t *\n\t * emdash({\n\t * database: d1({ binding: \"DB\" }),\n\t * objectCache: kvCache({ binding: \"CACHE\" }),\n\t * })\n\t * ```\n\t */\n\tobjectCache?: ObjectCacheDescriptor;\n\t/**\n\t * Image optimization.\n\t *\n\t * By default EmDash wraps Astro's image endpoint so media served from\n\t * storage is optimized through the normal `<Image>` / `getImage` pipeline,\n\t * loading source bytes directly from the storage adapter (works behind\n\t * Cloudflare Access). Set to `false` to leave Astro's image endpoint\n\t * untouched -- media then renders as a plain `<img>` unless your image\n\t * service can fetch it over HTTP.\n\t */\n\timages?: boolean;\n\t/**\n\t * Trusted plugins to load (run in main isolate)\n\t *\n\t * @example\n\t * ```ts\n\t * import auditLog from \"@emdash-cms/plugin-audit-log\";\n\t * import webhookNotifier from \"@emdash-cms/plugin-webhook-notifier\";\n\t *\n\t * emdash({\n\t * plugins: [auditLog, webhookNotifier],\n\t * })\n\t * ```\n\t */\n\tplugins?: PluginDescriptor[];\n\t/**\n\t * Sandboxed plugins to load (run in isolated V8 isolates)\n\t *\n\t * Only works on Cloudflare with Worker Loader enabled.\n\t * Uses the same format as `plugins` - the difference is where they run.\n\t *\n\t * @example\n\t * ```ts\n\t * import { sandbox } from \"@emdash-cms/cloudflare\";\n\t * import { untrustedPlugin } from \"some-third-party-plugin\";\n\t *\n\t * emdash({\n\t * plugins: [trustedPlugin()], // runs in host\n\t * sandboxed: [untrustedPlugin()], // runs in isolate\n\t * sandboxRunner: sandbox(),\n\t * })\n\t * ```\n\t */\n\tsandboxed?: SandboxedPluginDescriptor[];\n\t/**\n\t * Module that exports the sandbox runner factory.\n\t * Required if using sandboxed plugins.\n\t *\n\t * @example\n\t * ```ts\n\t * import { sandbox } from \"@emdash-cms/cloudflare\";\n\t *\n\t * emdash({\n\t * sandboxRunner: sandbox(),\n\t * })\n\t * ```\n\t */\n\tsandboxRunner?: string;\n\n\t/**\n\t * Explicitly disable plugin sandboxing, even if a sandbox runner is configured.\n\t * Use this as a debugging escape hatch to determine whether a bug is in your\n\t * plugin code or in the sandbox runtime.\n\t *\n\t * When set to `false`, all plugins run in-process without isolation.\n\t *\n\t * @default true (sandboxing enabled if sandboxRunner is configured)\n\t */\n\tsandbox?: boolean;\n\n\t/**\n\t * Authentication configuration\n\t *\n\t * Use an auth adapter function from a platform package:\n\t * - `access({ teamDomain: \"...\" })` from `@emdash-cms/cloudflare`\n\t *\n\t * When an external auth provider is configured, passkey auth is disabled.\n\t *\n\t * @example\n\t * ```ts\n\t * import { access } from \"@emdash-cms/cloudflare\";\n\t *\n\t * emdash({\n\t * auth: access({\n\t * teamDomain: \"myteam.cloudflareaccess.com\",\n\t * audience: \"abc123...\",\n\t * roleMapping: {\n\t * \"Admins\": 50,\n\t * \"Editors\": 40, // Editor\n\t * \"Authors\": 30, // Author\n\t * },\n\t * }),\n\t * })\n\t * ```\n\t */\n\tauth?: AuthDescriptor;\n\n\t/**\n\t * Pluggable auth providers (login methods on the login page).\n\t *\n\t * Auth providers appear as options alongside passkey on the login page\n\t * and setup wizard. Any provider can be used to create the initial\n\t * admin account. Passkey is built-in; providers listed here are additive.\n\t *\n\t * @example\n\t * ```ts\n\t * import { atproto } from \"@emdash-cms/auth-atproto\";\n\t *\n\t * emdash({\n\t * authProviders: [atproto()],\n\t * })\n\t * ```\n\t */\n\tauthProviders?: AuthProviderDescriptor[];\n\n\t/**\n\t * MCP (Model Context Protocol) server endpoint.\n\t *\n\t * Exposes an MCP Streamable HTTP server at `/_emdash/api/mcp`\n\t * that allows AI agents and tools to interact with the CMS using\n\t * the standardized MCP protocol.\n\t *\n\t * Enabled by default. The endpoint requires bearer token auth, so\n\t * it has no effect unless the user creates an API token and\n\t * configures a client. Set to `false` to disable.\n\t *\n\t * @default true\n\t */\n\tmcp?: boolean;\n\n\t/**\n\t * Plugin marketplace URL\n\t *\n\t * Existing marketplace-installed plugins use this URL for updates.\n\t * Marketplace browsing and new installs are no longer shown in the admin.\n\t *\n\t * Must be an HTTPS URL in production, or localhost/127.0.0.1 in dev.\n\t * Installing or updating plugins requires an available `sandboxRunner`.\n\t * Existing marketplace-installed plugins remain updateable and uninstallable.\n\t * New plugin discovery and installs use the registry.\n\t *\n\t * @example\n\t * ```ts\n\t * import { sandbox } from \"@emdash-cms/cloudflare\";\n\t *\n\t * emdash({\n\t * marketplace: \"https://marketplace.emdashcms.com\",\n\t * sandboxRunner: sandbox(),\n\t * })\n\t * ```\n\t *\n\t * @deprecated Keep this option only while the site has plugins installed from\n\t * the legacy marketplace. Remove it after those plugins are replaced or\n\t * uninstalled.\n\t */\n\tmarketplace?: string;\n\n\t/**\n\t * Plugin registry discovery and installation.\n\t *\n\t * An enabled sandbox runner uses the hosted registry by default. Pass a\n\t * registry URL or configuration object to customize it, or `false` to\n\t * disable registry discovery while retaining the sandbox runner.\n\t *\n\t * @default \"https://registry.emdashcms.com\" when sandboxing is enabled\n\t */\n\tregistry?: RegistryConfigOption;\n\n\t/**\n\t * Core update notice in the admin dashboard.\n\t *\n\t * When enabled (the default), EmDash checks the public npm registry\n\t * (`registry.npmjs.org`) at most once per day for published `emdash`\n\t * releases and shows a dismissible banner in the admin dashboard when\n\t * a newer version is available. The check is deferred after the\n\t * response and carries no site data — it's a plain GET to the public\n\t * registry. Sites without outbound internet simply never see the banner.\n\t *\n\t * The banner names the newest stable release that has been public for\n\t * `minimumReleaseAge`: a duration string (`\"48h\"`, `\"7d\"`) or a number\n\t * of seconds, `\"24h\"` by default. Set it to match a package manager's\n\t * release-age policy, such as pnpm's `minimumReleaseAge`.\n\t *\n\t * Set to `false` to disable the check entirely.\n\t *\n\t * @default true\n\t */\n\tupdateCheck?: boolean | { minimumReleaseAge?: string | number };\n\n\t/**\n\t * Maximum allowed media file upload size in bytes.\n\t *\n\t * Applies to both direct multipart uploads and signed-URL uploads.\n\t * When unset, defaults to 52_428_800 (50 MB).\n\t *\n\t * @example\n\t * ```ts\n\t * emdash({ maxUploadSize: 100 * 1024 * 1024 }) // 100 MB\n\t * ```\n\t */\n\tmaxUploadSize?: number;\n\n\t/**\n\t * Public browser-facing origin for the site.\n\t *\n\t * Use when `Astro.url` / `request.url` do not match what users open — common with a\n\t * **TLS-terminating reverse proxy**: the app often sees `http://` on the internal hop\n\t * while the browser uses `https://`, which breaks WebAuthn, CSRF, OAuth, and redirect URLs.\n\t *\n\t * Set to the full origin users type in the address bar (no path), e.g.\n\t * `https://mysite.example.com`. When not set, falls back to environment variables\n\t * `EMDASH_SITE_URL` > `SITE_URL`, then to the request URL's origin.\n\t *\n\t * Replaces `passkeyPublicOrigin` (which only fixed passkeys).\n\t */\n\tsiteUrl?: string;\n\n\t/**\n\t * Additional origins accepted by passkey verification.\n\t *\n\t * When the same EmDash deployment is reachable under several hostnames sharing\n\t * a registrable parent (e.g. `https://example.com` plus\n\t * `https://preview.example.com`), the canonical `siteUrl` defines the `rpId`\n\t * and the entries here are the *additional* origins from which assertions\n\t * are accepted. Each entry must be the same hostname as `siteUrl` or a\n\t * subdomain of it — WebAuthn requires `rpId` to be a registrable suffix of\n\t * every origin.\n\t *\n\t * Merged at runtime with the `EMDASH_ALLOWED_ORIGINS` env var (comma-separated).\n\t * Validation:\n\t * - Config-declared entries are shape-checked at Astro startup.\n\t * - Subdomain relationship to `siteUrl` is checked at startup when\n\t * `siteUrl` is also config-declared, otherwise at first passkey\n\t * verification (since `siteUrl` may come from `EMDASH_SITE_URL`).\n\t *\n\t * Mismatches throw with a source-attributed message naming\n\t * `config.allowedOrigins` or `EMDASH_ALLOWED_ORIGINS`.\n\t *\n\t * @example\n\t * ```ts\n\t * emdash({\n\t * siteUrl: \"https://example.com\",\n\t * allowedOrigins: [\"https://preview.example.com\"],\n\t * })\n\t * ```\n\t */\n\tallowedOrigins?: string[];\n\t/*\n\t * Headers to trust for client IP resolution when running behind a reverse\n\t * proxy. The first header in this list that is present on the request\n\t * wins. Applies to rate limiting for auth endpoints and comment\n\t * submission.\n\t *\n\t * Common values:\n\t * - `x-real-ip` — nginx, Caddy, Traefik\n\t * - `fly-client-ip` — Fly.io\n\t * - `x-forwarded-for` — generic (first entry is used)\n\t *\n\t * Only set this when you **control the reverse proxy**. Untrusted\n\t * clients can set any header they like; trusting headers from an open\n\t * network is an IP-spoofing vulnerability that defeats rate limiting.\n\t *\n\t * On Cloudflare the `cf` object on the request is used automatically —\n\t * you normally don't need to set this. Leave unset (or empty) to\n\t * preserve the default: IP is resolved only when the request came\n\t * through Cloudflare's edge.\n\t *\n\t * Falls back to `EMDASH_TRUSTED_PROXY_HEADERS` env var (comma-separated)\n\t * when this option is not set, so operators can configure at deploy\n\t * time without touching the Astro config.\n\t */\n\ttrustedProxyHeaders?: string[];\n\n\t/**\n\t * User middleware that wraps the complete EmDash request pipeline.\n\t *\n\t * Before `next()` it runs before EmDash initializes its runtime or database,\n\t * so `locals.emdash`, the authenticated user, and request-scoped EmDash state\n\t * are unavailable. This allows cached responses and request gates to return\n\t * without paying initialization cost. When it calls `next()`, the resolved\n\t * response includes EmDash HTML injection and all other response mutations,\n\t * allowing the middleware to finalize caching and response headers safely.\n\t */\n\tmiddleware?: {\n\t\t/** Astro middleware module entrypoint. */\n\t\touter: string | URL;\n\t};\n\n\t/**\n\t * Enable playground mode for ephemeral \"try EmDash\" sites.\n\t *\n\t * When set, the integration injects a playground middleware (order: \"pre\")\n\t * that runs BEFORE the normal EmDash middleware chain. It creates an\n\t * isolated Durable Object database per session, runs migrations, applies\n\t * the seed, creates an anonymous admin user, and sets the DB in ALS.\n\t * By the time the runtime middleware runs, the database is fully ready.\n\t *\n\t * Setup and auth middleware are skipped (the playground handles both).\n\t *\n\t * Requires `@emdash-cms/cloudflare` as a dependency and a DO binding\n\t * in wrangler.jsonc.\n\t *\n\t * @example\n\t * ```ts\n\t * emdash({\n\t * database: playgroundDatabase({ binding: \"PLAYGROUND_DB\" }),\n\t * playground: {\n\t * middlewareEntrypoint: \"@emdash-cms/cloudflare/db/playground-middleware\",\n\t * },\n\t * })\n\t * ```\n\t */\n\tplayground?: {\n\t\t/** Module path for the playground middleware. */\n\t\tmiddlewareEntrypoint: string;\n\t};\n\n\t/**\n\t * Media providers for browsing and uploading media\n\t *\n\t * The local media provider (using storage adapter) is available by default.\n\t * Additional providers can be added for external services like Unsplash,\n\t * Cloudinary, Mux, Cloudflare Images, etc.\n\t *\n\t * @example\n\t * ```ts\n\t * import { cloudflareImages, cloudflareStream } from \"@emdash-cms/cloudflare\";\n\t * import { unsplash } from \"@emdash-cms/provider-unsplash\";\n\t *\n\t * emdash({\n\t * mediaProviders: [\n\t * cloudflareImages({ accountId: \"...\" }),\n\t * cloudflareStream({ accountId: \"...\" }),\n\t * unsplash({ accessKey: \"...\" }),\n\t * ],\n\t * })\n\t * ```\n\t */\n\tmediaProviders?: MediaProviderDescriptor[];\n\n\t/**\n\t * Admin UI font configuration.\n\t *\n\t * By default, EmDash loads Noto Sans via the Astro Font API, covering\n\t * Latin, Latin Extended, Cyrillic, Cyrillic Extended, Greek, Greek\n\t * Extended, Devanagari, and Vietnamese. Fonts are downloaded from\n\t * Google at build time and self-hosted, so there are no runtime CDN\n\t * requests.\n\t *\n\t * To add support for additional writing systems (Arabic, CJK, etc.),\n\t * pass script names. EmDash resolves the matching Noto Sans variant\n\t * from Google Fonts and merges all script faces under a single\n\t * font-family, so the browser downloads only the glyphs it needs\n\t * via unicode-range.\n\t *\n\t * Set to `false` to disable font injection entirely and use system fonts.\n\t *\n\t * @example\n\t * ```ts\n\t * // Add Arabic and Japanese support\n\t * emdash({\n\t * fonts: {\n\t * scripts: [\"arabic\", \"japanese\"],\n\t * },\n\t * })\n\t * ```\n\t *\n\t * @example\n\t * ```ts\n\t * // Disable web fonts entirely (use system fonts)\n\t * emdash({\n\t * fonts: false,\n\t * })\n\t * ```\n\t */\n\tfonts?:\n\t\t| false\n\t\t| {\n\t\t\t\t/**\n\t\t\t\t * Additional Noto Sans script families to include.\n\t\t\t\t *\n\t\t\t\t * Available scripts: arabic, armenian, bengali, chinese-simplified,\n\t\t\t\t * chinese-traditional, chinese-hongkong, devanagari, ethiopic, farsi,\n\t\t\t\t * georgian, gujarati, gurmukhi, hebrew, japanese, kannada, khmer,\n\t\t\t\t * korean, lao, malayalam, myanmar, oriya, sinhala, tamil, telugu,\n\t\t\t\t * thai, tibetan.\n\t\t\t\t */\n\t\t\t\tscripts?: string[];\n\t\t };\n\n\t/**\n\t * Admin UI branding (white-labeling).\n\t *\n\t * Overrides the default EmDash logo and name in the admin panel.\n\t * Use this to white-label the CMS for agency or enterprise deployments.\n\t * These settings are separate from the public site settings (title, logo,\n\t * favicon) which remain available for SEO and front-end use.\n\t *\n\t * @example\n\t * ```ts\n\t * emdash({\n\t * admin: {\n\t * logo: \"/images/agency-logo.webp\",\n\t * siteName: \"AgencyX CMS\",\n\t * footerLabel: \"AgencyX\",\n\t * favicon: \"/favicon.ico\",\n\t * },\n\t * })\n\t * ```\n\t */\n\tadmin?: {\n\t\t/** URL or path to a custom logo image for the admin UI (login page, sidebar). */\n\t\tlogo?: string;\n\t\t/** Custom name displayed in the admin sidebar header and browser tab. */\n\t\tsiteName?: string;\n\t\t/** Label displayed beside the version in the sidebar footer. Set to false to hide it. */\n\t\tfooterLabel?: string | false;\n\t\t/** URL or path to a custom favicon for the admin panel. */\n\t\tfavicon?: string;\n\t\t/**\n\t\t * Build-time allowlist of admin UI locales to ship.\n\t\t *\n\t\t * Only the listed locales are bundled and offered in the language\n\t\t * switcher; other locales fall back to English. `en` is always\n\t\t * included. Unknown codes fail the build.\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * emdash({\n\t\t * admin: { locales: [\"en\", \"de\"] },\n\t\t * })\n\t\t * ```\n\t\t */\n\t\tlocales?: string[];\n\t};\n\n\t/**\n\t * Editor toolbar delivery on public pages.\n\t *\n\t * - `\"server\"` (default): the toolbar is injected server-side into every\n\t * HTML response rendered for an authenticated editor. Simple and\n\t * zero-config, but behind a shared cache (Cloudflare Cache Everything /\n\t * Workers Cache, Fastly, Varnish, …) editors often receive the cached\n\t * anonymous variant — without the toolbar — whenever an anonymous visitor\n\t * primed the cache first, so the toolbar appears and disappears with\n\t * cache state.\n\t * - `\"client\"`: public HTML is identical for everyone (nothing\n\t * session-specific is injected server-side, so shared caches stay fully\n\t * effective). A tiny bootstrap script shows an \"Edit\" pill for browsers\n\t * that have logged into the admin (non-secret localStorage flag). Clicking\n\t * it verifies the session and reloads the page with an `_edit` query\n\t * param, which is always rendered fresh (never cached) with the full\n\t * toolbar. Logged-out visitors opening an `_edit` URL are redirected to\n\t * the canonical URL.\n\t * - `false`: never render the toolbar or bootstrap script.\n\t *\n\t * See the visual-editing docs for the cache-behavior details.\n\t */\n\ttoolbar?: \"server\" | \"client\" | false;\n\n\t/**\n\t * Version of Astro the host project is building with. Populated by the\n\t * integration's `astro:config:setup` hook (not authored by the user) and\n\t * surfaced to the admin and the registry install gate so a plugin's\n\t * `env:astro` requirement can be evaluated against the real host version.\n\t */\n\tastroVersion?: string;\n}\n\nconst STORED_CONFIG_KEY = Symbol.for(\"emdash:stored-config\");\nconst configHolder = globalThis as Record<symbol, unknown>;\n\n/**\n * Get stored config from global\n * This is set by the virtual module at build time\n */\nexport function getStoredConfig(): EmDashConfig | null {\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- globalThis singleton pattern (see request-context.ts)\n\treturn (configHolder[STORED_CONFIG_KEY] as EmDashConfig | undefined) ?? null;\n}\n\n/**\n * Set stored config in global\n * Called by the integration at config time\n */\nexport function setStoredConfig(config: EmDashConfig): void {\n\tconfigHolder[STORED_CONFIG_KEY] = config;\n}\n","/**\n * EmDash Astro Integration\n *\n * This integration:\n * - Injects the admin shell route at /_emdash/admin/[...path].astro\n * - Sets up REST API endpoints under /_emdash/api/*\n * - Configures middleware to provide database and manifest\n *\n * NOTE: This file is for build-time only. Runtime utilities are in runtime.ts\n * to avoid bundling Node.js-only code into the production build.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport type { AstroIntegration, AstroIntegrationLogger, AstroIntegrationMiddleware } from \"astro\";\n\nimport { getEnvSiteUrl } from \"../../api/public-url.js\";\nimport { validateAllowedOrigins, validateOriginShape } from \"../../auth/allowed-origins.js\";\nimport { normalizeMigrationConfig } from \"../../database/migrations/policy.js\";\nimport { normalizeAstroI18n } from \"../../i18n/normalize.js\";\nimport { INTERNAL_MEDIA_PREFIX } from \"../../media/normalize.js\";\nimport { getCoreMigrationIdentity } from \"../../migrations/identity.js\";\nimport {\n\tcreateMigrationIntegrationMetadata,\n\tMIGRATION_CONFIG_SYMBOL,\n} from \"../../migrations/integration-metadata.js\";\nimport { buildMigrationManifest } from \"../../migrations/manifest-builder.js\";\nimport { writeMigrationManifest } from \"../../migrations/manifest-writer.js\";\nimport type { ResolvedPlugin } from \"../../plugins/types.js\";\nimport {\n\tnormalizeRegistryConfig,\n\tparseDurationSeconds,\n\tresolveRegistryConfigForSandbox,\n} from \"../../registry/config.js\";\nimport { VERSION } from \"../../version.js\";\nimport { local } from \"../storage/adapters.js\";\nimport { readAdminLocaleManifest, resolveAdminLocales } from \"./admin-locales.js\";\nimport { loadDevEnv } from \"./dev-env.js\";\nimport { startDevSchedulerBridge } from \"./dev-scheduler-bridge.js\";\nimport { createDebouncedTypegenRefresh, listenForDevTypegenRefresh } from \"./dev-typegen.js\";\nimport { notoSans } from \"./font-provider.js\";\nimport {\n\tinjectCoreRoutes,\n\tinjectBuiltinAuthRoutes,\n\tinjectAuthProviderRoutes,\n\tinjectMcpRoute,\n} from \"./routes.js\";\nimport type { EmDashConfig } from \"./runtime.js\";\nimport { createViteConfig, resolveAdminDist } from \"./vite-config.js\";\n\n// Re-export runtime types and functions\nexport type {\n\tEmDashConfig,\n\tPluginDescriptor,\n\tSandboxedPluginDescriptor,\n\tResolvedPlugin,\n} from \"./runtime.js\";\nexport { getStoredConfig } from \"./runtime.js\";\n\n/**\n * Resolve the version of Astro the host project is building with, by reading\n * `astro/package.json` from the project's own dependency tree. Surfaced to the\n * admin and the registry install gate so a plugin's `env:astro` constraint can\n * be evaluated against the real host version. Returns `undefined` if Astro\n * can't be resolved (shouldn't happen in a real build, but never throw here).\n */\nfunction resolveAstroVersion(): string | undefined {\n\ttry {\n\t\tconst require = createRequire(import.meta.url);\n\t\tconst pkg = require(\"astro/package.json\") as { version?: unknown };\n\t\treturn typeof pkg.version === \"string\" ? pkg.version : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/**\n * `@emdash-cms/cloudflare` depends on the exact `emdash` version it was\n * released with. A site that upgrades only one of the two installs a second\n * copy of `emdash` for the adapter, so warn when the installed adapter's\n * version differs from this one.\n *\n * @internal Exported for unit testing.\n */\nexport function adapterVersionMismatchWarning(\n\troot: URL,\n\tversion: string = VERSION,\n): string | undefined {\n\tif (version === \"dev\") return undefined;\n\tfor (let dir = fileURLToPath(root); dir !== dirname(dir); dir = dirname(dir)) {\n\t\tconst file = join(dir, \"node_modules\", \"@emdash-cms\", \"cloudflare\", \"package.json\");\n\t\tif (!existsSync(file)) continue;\n\t\tlet pkg: { version?: unknown };\n\t\ttry {\n\t\t\tpkg = JSON.parse(readFileSync(file, \"utf8\")) as { version?: unknown };\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (typeof pkg.version !== \"string\" || pkg.version === version) return undefined;\n\t\treturn (\n\t\t\t`@emdash-cms/cloudflare ${pkg.version} does not match emdash ${version}, ` +\n\t\t\t`so the adapter runs against its own copy of emdash ${pkg.version}. ` +\n\t\t\t`Install the same version of both packages, for example:\\n\\n` +\n\t\t\t` npm install emdash@${version} @emdash-cms/cloudflare@${version}`\n\t\t);\n\t}\n\treturn undefined;\n}\n\n/** Default storage: Local filesystem in .emdash directory */\nconst DEFAULT_STORAGE = local({\n\tdirectory: \"./.emdash/uploads\",\n\tbaseUrl: \"/_emdash/api/media/file\",\n});\n\nexport interface ImageRemotePattern {\n\tprotocol?: \"http\" | \"https\";\n\thostname?: string;\n\tpathname?: string;\n}\n\n/**\n * Resolve the site origin for `image.remotePatterns`: the configured `siteUrl`,\n * then `EMDASH_SITE_URL` / `SITE_URL`. Astro bakes `remotePatterns` into the\n * build output, so the env vars only take effect if they are set when\n * `astro build` runs.\n *\n * @internal Exported for unit testing.\n */\nexport function resolveBuildTimeSiteUrl(configuredSiteUrl: string | undefined): string | undefined {\n\tif (configuredSiteUrl) return configuredSiteUrl;\n\treturn getEnvSiteUrl();\n}\n\n/**\n * Build `image.remotePatterns` entries so Astro will optimize EmDash media.\n *\n * Astro's image services only build a transform URL for sources allowed via\n * `image.domains` / `image.remotePatterns` (relative URLs are never optimized —\n * see `isRemoteAllowed`). We authorize the media sources automatically:\n *\n * 1. The storage adapter's public URL host (R2 custom domain, S3/CDN).\n * 2. The site's own origin, scoped to the media proxy route\n * (`/_emdash/api/media/file/**`), so same-origin proxied media is optimized.\n * The components absolutize the media URL against this origin; EmDash's\n * wrapped image endpoint then serves the bytes from storage (so the absolute\n * URL is never fetched). Only registered when `siteUrl` is known at build.\n * 3. In `astro dev` the dev-server origin isn't known at build time, so we\n * register a host-agnostic pattern scoped to the media route. Dev-only.\n *\n * Returns an empty array when no source is statically known (production build,\n * local storage, no `siteUrl`), in which case media renders as a plain `<img>`.\n *\n * @internal Exported for unit testing.\n */\nexport function buildImageRemotePatterns(\n\tstorage: { config?: unknown } | undefined,\n\tsiteUrl: string | undefined,\n\tcommand: \"dev\" | \"build\" | \"preview\" | \"sync\",\n): ImageRemotePattern[] {\n\tconst patterns: ImageRemotePattern[] = [];\n\n\tconst config = storage?.config;\n\tconst publicUrl =\n\t\tconfig && typeof config === \"object\"\n\t\t\t? (config as { publicUrl?: unknown }).publicUrl\n\t\t\t: undefined;\n\tif (typeof publicUrl === \"string\" && publicUrl) {\n\t\ttry {\n\t\t\tconst url = new URL(publicUrl);\n\t\t\t// Only authorize http(s) hosts — a `file:`/`ftp:` URL is not a media\n\t\t\t// origin Astro can fetch.\n\t\t\tif (url.protocol === \"http:\" || url.protocol === \"https:\") {\n\t\t\t\tconst pattern: ImageRemotePattern = {\n\t\t\t\t\tprotocol: url.protocol === \"http:\" ? \"http\" : \"https\",\n\t\t\t\t\thostname: url.hostname,\n\t\t\t\t};\n\t\t\t\t// When the public URL has a path prefix (CDN sub-path), scope the\n\t\t\t\t// pattern to it so we don't authorize the entire host. Media keys\n\t\t\t\t// are appended as `${publicUrl}/${key}`, so the prefix is exact.\n\t\t\t\tconst prefix = url.pathname.endsWith(\"/\") ? url.pathname.slice(0, -1) : url.pathname;\n\t\t\t\tif (prefix && prefix !== \"/\") {\n\t\t\t\t\tpattern.pathname = `${prefix}/**`;\n\t\t\t\t}\n\t\t\t\tpatterns.push(pattern);\n\t\t\t}\n\t\t} catch {\n\t\t\t// ignore an unparseable public URL\n\t\t}\n\t}\n\n\tif (siteUrl) {\n\t\ttry {\n\t\t\tconst { hostname } = new URL(siteUrl);\n\t\t\t// WHATWG URL accepts `*` in a hostname, which Astro's matcher treats\n\t\t\t// as a wildcard that would allowlist other hosts.\n\t\t\tif (!hostname.includes(\"*\")) {\n\t\t\t\tpatterns.push({ hostname, pathname: `${INTERNAL_MEDIA_PREFIX}**` });\n\t\t\t}\n\t\t} catch {\n\t\t\t// ignore an unparseable site URL\n\t\t}\n\t}\n\n\tif (command === \"dev\") {\n\t\tpatterns.push({ pathname: `${INTERNAL_MEDIA_PREFIX}**` });\n\t}\n\n\treturn patterns;\n}\n\n/**\n * Build the config subset baked into `virtual:emdash/config` and exposed\n * at runtime as `locals.emdash.config`. A config option that runtime code\n * reads (routes, middleware) MUST be listed here — an option only on\n * `EmDashConfig` is invisible at runtime and silently ignored.\n *\n * @internal Exported for unit testing.\n */\nexport function buildSerializableConfig(resolvedConfig: EmDashConfig): Record<string, unknown> {\n\treturn {\n\t\tdatabase: resolvedConfig.database,\n\t\tmigrations: resolvedConfig.migrations,\n\t\tstorage: resolvedConfig.storage,\n\t\tauth: resolvedConfig.auth,\n\t\tauthProviders: resolvedConfig.authProviders,\n\t\tmarketplace: resolvedConfig.marketplace,\n\t\tregistry: resolvedConfig.registry,\n\t\tsiteUrl: resolvedConfig.siteUrl,\n\t\ttrustedProxyHeaders: resolvedConfig.trustedProxyHeaders,\n\t\tmaxUploadSize: resolvedConfig.maxUploadSize,\n\t\tadmin: resolvedConfig.admin,\n\t\ttoolbar: resolvedConfig.toolbar,\n\t\tupdateCheck: resolvedConfig.updateCheck,\n\t\tobjectCacheEnabled: resolvedConfig.objectCache !== undefined,\n\t};\n}\n\n/**\n * Stock image endpoints EmDash may safely replace with its storage-backed\n * wrapper. Our wrapper delegates non-EmDash images to the platform's transform\n * endpoint, so we only override endpoints whose transform we can delegate to.\n */\nconst OVERRIDABLE_IMAGE_ENDPOINTS = new Set([\n\t\"astro/assets/endpoint/generic\",\n\t\"astro/assets/endpoint/node\",\n\t\"astro/assets/endpoint/dev\",\n\t\"@astrojs/cloudflare/image-transform-endpoint\",\n]);\n\n/**\n * Stock endpoints that deliberately don't transform (the user opted into\n * passthrough). We leave these untouched -- and without a warning, since it's a\n * supported choice, not a custom endpoint. Overriding would route non-EmDash\n * images through a transformer the passthrough setup doesn't provide.\n */\nconst PASSTHROUGH_IMAGE_ENDPOINTS = new Set([\"@astrojs/cloudflare/image-passthrough-endpoint\"]);\n\n/**\n * Decide which image endpoint to install (if any). EmDash wraps Astro's image\n * endpoint so EmDash media bytes load from storage; the wrapper delegates other\n * images back to the platform's stock endpoint.\n *\n * Returns `{ entrypoint }` to install, `{ warn }` to skip with a warning (a\n * custom endpoint we can't delegate to), or `{}` to skip silently (opted out).\n *\n * @internal Exported for unit testing.\n */\nexport function resolveImageEndpoint(opts: {\n\timagesDisabled: boolean;\n\tcurrentEntrypoint: string | undefined;\n\tisCloudflare: boolean;\n}): { entrypoint?: string; warn?: string } {\n\tif (opts.imagesDisabled) return {};\n\tconst current = opts.currentEntrypoint;\n\tif (current === undefined || OVERRIDABLE_IMAGE_ENDPOINTS.has(current)) {\n\t\treturn {\n\t\t\tentrypoint: opts.isCloudflare\n\t\t\t\t? \"@emdash-cms/cloudflare/image-endpoint\"\n\t\t\t\t: \"emdash/internal/image-endpoint\",\n\t\t};\n\t}\n\t// A deliberate passthrough setup: leave it alone, no warning.\n\tif (PASSTHROUGH_IMAGE_ENDPOINTS.has(current)) return {};\n\treturn {\n\t\twarn:\n\t\t\t`A custom image.endpoint (${current}) is configured; EmDash will not wrap ` +\n\t\t\t`it, so storage-backed media may render unoptimized.`,\n\t};\n}\n\nconst EDGE_SLASHES = /^\\/+|\\/+$/g;\n\n/**\n * The `routePattern` Astro reports for requests to the image endpoint. It drops\n * the trailing slash `image.endpoint.route` carries under `trailingSlash: \"always\"`.\n *\n * @internal\n */\nexport function imageEndpointRoutePattern(route: string | undefined): string {\n\treturn `/${(route ?? \"/_image\").replace(EDGE_SLASHES, \"\")}`;\n}\n\n/**\n * Warn when `@astrojs/react` is not registered in the host's `integrations`.\n *\n * The admin SPA is a React app hydrated via `client:only=\"react\"`. Without the\n * React integration the build succeeds and the admin route returns 200, but the\n * bundle never hydrates -- the page sits on \"Loading EmDash...\" forever with no\n * error anywhere (#962). Checked in `astro:config:done` so integrations added\n * by other integrations are visible too.\n *\n * @internal Exported for unit testing.\n */\nexport function missingReactIntegrationWarning(\n\tintegrations: readonly { name: string }[],\n): string | undefined {\n\tif (integrations.some((integration) => integration.name === \"@astrojs/react\")) {\n\t\treturn undefined;\n\t}\n\treturn (\n\t\t`@astrojs/react is not registered in your Astro config. The EmDash admin UI ` +\n\t\t`will not hydrate without it (the page stays on \"Loading EmDash...\"). ` +\n\t\t`Add it to your integrations:\\n\\n` +\n\t\t` import react from \"@astrojs/react\";\\n` +\n\t\t` export default defineConfig({\\n` +\n\t\t` integrations: [react(), emdash({ ... })],\\n` +\n\t\t` });`\n\t);\n}\n\n/**\n * Warn when Astro has no session driver. Sign-in stores the user in the Astro\n * session, so without a driver every sign-in route fails. The Node, Cloudflare,\n * and Netlify adapters configure a driver in `astro:config:setup`; others,\n * such as Vercel, do not.\n */\nfunction missingSessionDriverWarning(\n\tsession: { driver?: unknown } | false | undefined,\n): string | undefined {\n\tif (session && session.driver) return undefined;\n\tconst problem =\n\t\tsession === false\n\t\t\t? `Astro sessions are disabled (\\`session: false\\`), but EmDash stores signed-in users in the Astro session.`\n\t\t\t: `No Astro session driver is configured, but EmDash stores signed-in users in the Astro session.`;\n\treturn (\n\t\t`${problem} Without one, signing in to the admin fails. Use an adapter that ` +\n\t\t`provides a driver (Node, Cloudflare, Netlify) or configure one yourself, for example:\\n\\n` +\n\t\t` import { defineConfig, sessionDrivers } from \"astro/config\";\\n` +\n\t\t` export default defineConfig({\\n` +\n\t\t` session: { driver: sessionDrivers.redis({ url: process.env.REDIS_URL }) },\\n` +\n\t\t` });\\n\\n` +\n\t\t`See https://docs.astro.build/en/guides/sessions/`\n\t);\n}\n\n// Terminal formatting\nconst dim = (s: string) => `\\x1b[2m${s}\\x1b[22m`;\nconst bold = (s: string) => `\\x1b[1m${s}\\x1b[22m`;\nconst cyan = (s: string) => `\\x1b[36m${s}\\x1b[39m`;\n\n/** Print the EmDash startup banner */\nfunction printBanner(_logger: AstroIntegrationLogger): void {\n\tconst banner = `\n\n ${bold(cyan(\"— E M D A S H —\"))} ${dim(`v${VERSION}`)}\n `;\n\tconsole.log(banner);\n}\n\n/**\n * Print dev-server route info with absolute (clickable) URLs, including the\n * dev-bypass shortcut that skips passkey auth. Dev only -- the dev-bypass\n * endpoint returns 403 in production.\n */\nfunction printDevServerInfo(baseUrl: string, mcpEnabled: boolean): void {\n\tconst devBypassUrl = `${baseUrl}/_emdash/api/setup/dev-bypass?redirect=/_emdash/admin`;\n\tconsole.log(`\\n ${dim(\"›\")} Admin UI ${cyan(`${baseUrl}/_emdash/admin`)}`);\n\tif (mcpEnabled) {\n\t\tconsole.log(` ${dim(\"›\")} MCP server ${cyan(`${baseUrl}/_emdash/api/mcp`)}`);\n\t}\n\tconsole.log(` ${dim(\"›\")} Dev bypass ${cyan(devBypassUrl)}`);\n\tconsole.log(` ${dim(\"Skips passkey setup/auth and signs you in as a dev admin\")}`);\n\tconsole.log(\"\");\n}\n\nexport function buildMiddlewareEntries(\n\tconfig: Pick<EmDashConfig, \"middleware\" | \"playground\">,\n\troot: URL,\n): AstroIntegrationMiddleware[] {\n\tconst entries: AstroIntegrationMiddleware[] = [];\n\n\tif (config.middleware !== undefined) {\n\t\tconst configuredEntrypoint = config.middleware?.outer;\n\t\tif (\n\t\t\t(typeof configuredEntrypoint !== \"string\" && !(configuredEntrypoint instanceof URL)) ||\n\t\t\t(typeof configuredEntrypoint === \"string\" && configuredEntrypoint.trim() === \"\")\n\t\t) {\n\t\t\tthrow new Error(\"middleware.outer must be a non-empty module specifier string or URL.\");\n\t\t}\n\t\tconst entrypoint =\n\t\t\ttypeof configuredEntrypoint === \"string\" &&\n\t\t\t(configuredEntrypoint.startsWith(\"./\") || configuredEntrypoint.startsWith(\"../\"))\n\t\t\t\t? new URL(configuredEntrypoint, root)\n\t\t\t\t: configuredEntrypoint;\n\t\tentries.push({\n\t\t\tentrypoint,\n\t\t\torder: \"pre\",\n\t\t});\n\t}\n\n\tif (config.playground) {\n\t\tentries.push({\n\t\t\tentrypoint: config.playground.middlewareEntrypoint,\n\t\t\torder: \"pre\",\n\t\t});\n\t}\n\n\tentries.push(\n\t\t{ entrypoint: \"emdash/middleware\", order: \"pre\" },\n\t\t{ entrypoint: \"emdash/internal/middleware/redirect\", order: \"pre\" },\n\t);\n\n\tif (!config.playground) {\n\t\tentries.push(\n\t\t\t{ entrypoint: \"emdash/internal/middleware/setup\", order: \"pre\" },\n\t\t\t{ entrypoint: \"emdash/internal/middleware/auth\", order: \"pre\" },\n\t\t);\n\t}\n\n\tentries.push(\n\t\t{ entrypoint: \"emdash/internal/middleware/media-usage-write-fence\", order: \"pre\" },\n\t\t{ entrypoint: \"emdash/internal/middleware/request-context\", order: \"pre\" },\n\t);\n\n\treturn entries;\n}\n\nfunction assertNoRemovedRegistryOption(config: EmDashConfig): void {\n\tconst experimental: unknown = Reflect.get(config, \"experimental\");\n\tif (\n\t\ttypeof experimental === \"object\" &&\n\t\texperimental !== null &&\n\t\tReflect.get(experimental, \"registry\") !== undefined\n\t) {\n\t\tthrow new Error(\n\t\t\t\"EmDash config: `experimental.registry` has been removed. Configure the registry with the top-level `registry` option instead.\",\n\t\t);\n\t}\n}\n\n/**\n * Create the EmDash Astro integration\n */\nexport function emdash(config: EmDashConfig = {}): AstroIntegration {\n\tassertNoRemovedRegistryOption(config);\n\n\tconst registry = resolveRegistryConfigForSandbox({\n\t\tregistry: config.registry,\n\t\tsandboxRunner: config.sandboxRunner,\n\t\tsandboxEnabled: config.sandbox !== false,\n\t});\n\n\t// Apply defaults\n\tconst resolvedConfig: EmDashConfig = {\n\t\t...config,\n\t\tstorage: config.storage ?? DEFAULT_STORAGE,\n\t\tmigrations: normalizeMigrationConfig(config.migrations),\n\t\tregistry: config.registry === false ? false : registry,\n\t};\n\n\t// Validate environment-independent registry settings while Astro is still\n\t// evaluating its config. The command-aware check in astro:config:setup\n\t// applies the stricter production localhost policy.\n\tnormalizeRegistryConfig(registry, { allowLocalhost: true });\n\n\tconst updateCheckAge =\n\t\ttypeof resolvedConfig.updateCheck === \"object\"\n\t\t\t? resolvedConfig.updateCheck?.minimumReleaseAge\n\t\t\t: undefined;\n\tif (updateCheckAge !== undefined) {\n\t\ttry {\n\t\t\tparseDurationSeconds(updateCheckAge);\n\t\t} catch (e) {\n\t\t\tthrow new Error(`Invalid updateCheck.minimumReleaseAge: ${String(updateCheckAge)}`, {\n\t\t\t\tcause: e,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Validate marketplace URL\n\tif (resolvedConfig.marketplace) {\n\t\tconst url = resolvedConfig.marketplace;\n\t\ttry {\n\t\t\tconst parsed = new URL(url);\n\t\t\tconst isLocalhost = parsed.hostname === \"localhost\" || parsed.hostname === \"127.0.0.1\";\n\t\t\tif (parsed.protocol !== \"https:\" && !isLocalhost) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Marketplace URL must use HTTPS (got ${parsed.protocol}). ` +\n\t\t\t\t\t\t`Only localhost URLs are allowed over HTTP.`,\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tif (e instanceof TypeError) {\n\t\t\t\tthrow new Error(`Invalid marketplace URL: \"${url}\"`, { cause: e });\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\t// Validate siteUrl if provided in astro.config.mjs.\n\t// Env-var fallback (EMDASH_SITE_URL / SITE_URL) is handled at runtime by\n\t// getPublicOrigin() in api/public-url.ts — don't fold it into\n\t// resolvedConfig.siteUrl here — so Docker images built without a domain can\n\t// pick it up at container start via process.env.\n\tif (resolvedConfig.siteUrl) {\n\t\tconst raw = resolvedConfig.siteUrl;\n\t\ttry {\n\t\t\tconst parsed = new URL(raw);\n\t\t\tif (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n\t\t\t\tthrow new Error(`siteUrl must be http or https (got ${parsed.protocol})`);\n\t\t\t}\n\t\t\t// Always store origin-normalized value (no path) — security invariant L-1\n\t\t\tresolvedConfig.siteUrl = parsed.origin;\n\t\t} catch (e) {\n\t\t\tif (e instanceof TypeError) {\n\t\t\t\tthrow new Error(`Invalid siteUrl: \"${raw}\"`, { cause: e });\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\t// Validate config.allowedOrigins shape at startup (per-entry rules: parseable,\n\t// http(s), no trailing dots, no empty labels). The siteUrl-dependent rules\n\t// (Rule A: requires siteUrl; Rule B: must be a subdomain of siteUrl) are\n\t// deferred to runtime when config.siteUrl is absent — EMDASH_SITE_URL may\n\t// supply it post-build, just like the env-var fallback for siteUrl above.\n\t// When config.siteUrl IS present, run the full validator here for fail-fast.\n\tif (resolvedConfig.allowedOrigins?.length) {\n\t\tconst tagged = resolvedConfig.allowedOrigins.map((origin) => ({\n\t\t\torigin,\n\t\t\tsource: \"config.allowedOrigins\" as const,\n\t\t}));\n\t\tresolvedConfig.allowedOrigins = resolvedConfig.siteUrl\n\t\t\t? validateAllowedOrigins(resolvedConfig.siteUrl, tagged)\n\t\t\t: validateOriginShape(tagged);\n\t}\n\n\t// Plugin descriptors from config\n\tconst pluginDescriptors = resolvedConfig.plugins ?? [];\n\tconst sandboxedDescriptors = resolvedConfig.sandboxed ?? [];\n\n\t// Validate all plugin descriptors\n\tfor (const descriptor of [...pluginDescriptors, ...sandboxedDescriptors]) {\n\t\t// Standard-format plugins can't use features that require trusted mode\n\t\tif (descriptor.format === \"standard\") {\n\t\t\tif (descriptor.adminEntry) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Plugin \"${descriptor.id}\" is standard format but declares adminEntry. ` +\n\t\t\t\t\t\t`Standard plugins use Block Kit for admin UI, not React components. ` +\n\t\t\t\t\t\t`Remove adminEntry or change format to \"native\".`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (descriptor.componentsEntry) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Plugin \"${descriptor.id}\" is standard format but declares componentsEntry. ` +\n\t\t\t\t\t\t`Portable Text block components require native format. ` +\n\t\t\t\t\t\t`Remove componentsEntry or change format to \"native\".`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Validate: non-standard plugins cannot be placed in sandboxed: []\n\tfor (const descriptor of sandboxedDescriptors) {\n\t\tif (descriptor.format !== \"standard\") {\n\t\t\tthrow new Error(\n\t\t\t\t`Plugin \"${descriptor.id}\" uses the native format and cannot be placed in ` +\n\t\t\t\t\t`\\`sandboxed: []\\`. Native plugins can only run in \\`plugins: []\\`. ` +\n\t\t\t\t\t`To sandbox this plugin, convert it to the standard format.`,\n\t\t\t);\n\t\t}\n\t}\n\n\tif (config.admin?.locales !== undefined) {\n\t\tconst manifest = readAdminLocaleManifest(resolveAdminDist());\n\t\tresolvedConfig.admin = {\n\t\t\t...config.admin,\n\t\t\tlocales: resolveAdminLocales(config.admin.locales, Object.keys(manifest)),\n\t\t};\n\t}\n\n\t// Resolved plugins (populated at build time by importing entrypoints)\n\tlet _resolvedPlugins: ResolvedPlugin[] = [];\n\n\t// Serialize config for virtual module (database/storage/auth - plugins handled separately)\n\t// i18n is populated in astro:config:setup from astroConfig.i18n\n\tconst serializableConfig = buildSerializableConfig(resolvedConfig);\n\n\t// Determine auth mode for route injection\n\t// Check if auth is an AuthDescriptor (has entrypoint) indicating external auth\n\tconst useExternalAuth = !!(resolvedConfig.auth && \"entrypoint\" in resolvedConfig.auth);\n\n\t// Captured in astro:config:setup so the astro:server:setup hook can tell\n\t// whether we're running `astro dev` (where the dev-bypass shortcut applies).\n\tlet astroCommand: \"dev\" | \"build\" | \"preview\" | \"sync\" | undefined;\n\tlet usesCloudflareAdapter = false;\n\tlet normalizedI18n: ReturnType<typeof normalizeAstroI18n> = null;\n\tconst migrationMetadata = createMigrationIntegrationMetadata(resolvedConfig.database);\n\n\tconst integration: AstroIntegration = {\n\t\tname: \"emdash\",\n\t\thooks: {\n\t\t\t\"astro:config:setup\": ({\n\t\t\t\tinjectRoute: astroInjectRoute,\n\t\t\t\taddMiddleware,\n\t\t\t\tlogger,\n\t\t\t\tupdateConfig,\n\t\t\t\tconfig: astroConfig,\n\t\t\t\tcommand,\n\t\t\t}) => {\n\t\t\t\tastroCommand = command;\n\t\t\t\tusesCloudflareAdapter = astroConfig.adapter?.name === \"@astrojs/cloudflare\";\n\t\t\t\tnormalizeRegistryConfig(registry, {\n\t\t\t\t\tallowLocalhost: command === \"dev\" || command === \"sync\",\n\t\t\t\t});\n\t\t\t\tprintBanner(logger);\n\t\t\t\tif (command === \"dev\") {\n\t\t\t\t\t// In Node `astro dev`, Vite loads `.env` into `import.meta.env`\n\t\t\t\t\t// but not `process.env`. The plugin-secret encryption key\n\t\t\t\t\t// intentionally reads only `process.env`, so a freshly\n\t\t\t\t\t// scaffolded site can't save secret plugin settings until the\n\t\t\t\t\t// key is copied over. Load only `EMDASH_ENCRYPTION_KEY` here,\n\t\t\t\t\t// honoring any value already present in the shell.\n\t\t\t\t\ttry {\n\t\t\t\t\t\tloadDevEnv(astroConfig.root);\n\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\tlogger.warn(`Failed to load EMDASH_ENCRYPTION_KEY from .env: ${String(error)}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Capture the host's Astro version so the runtime can expose it\n\t\t\t\t// to the admin and the registry install gate for `env:astro`\n\t\t\t\t// constraint checks.\n\t\t\t\tconst astroVersion = resolveAstroVersion();\n\t\t\t\tif (astroVersion !== undefined) {\n\t\t\t\t\tserializableConfig.astroVersion = astroVersion;\n\t\t\t\t}\n\t\t\t\t// EmDashHead must not access Astro.csp when the host has disabled\n\t\t\t\t// Astro's built-in CSP runtime; Astro logs a warning for that access.\n\t\t\t\tserializableConfig.astroCspEnabled = Boolean(astroConfig.security.csp);\n\t\t\t\t// Expose Astro's trailingSlash routing policy so plugins can build\n\t\t\t\t// URLs (sitemap/canonical/hreflang) that match what the site serves.\n\t\t\t\tserializableConfig.trailingSlash = astroConfig.trailingSlash;\n\t\t\t\tnormalizedI18n = normalizeAstroI18n(astroConfig.i18n);\n\t\t\t\tif (normalizedI18n) serializableConfig.i18n = normalizedI18n;\n\n\t\t\t\t// Disable Astro's built-in checkOrigin -- EmDash's own CSRF\n\t\t\t\t// layer (checkPublicCsrf in api/csrf.ts) handles origin\n\t\t\t\t// validation with dual-origin support: it accepts both the\n\t\t\t\t// internal origin AND the public origin from getPublicOrigin(),\n\t\t\t\t// which resolves siteUrl from config or env vars at runtime.\n\t\t\t\t// Astro's check can't do this because allowedDomains is baked\n\t\t\t\t// at build time, which breaks Docker deployments where the\n\t\t\t\t// domain is only known at container start via EMDASH_SITE_URL.\n\t\t\t\t//\n\t\t\t\t// When siteUrl is known at build time, also set allowedDomains\n\t\t\t\t// so Astro.url reflects the public origin (helps user template\n\t\t\t\t// code that reads Astro.url directly).\n\t\t\t\tconst securityConfig: Record<string, unknown> = {\n\t\t\t\t\tcheckOrigin: false,\n\t\t\t\t\t...(resolvedConfig.siteUrl\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tallowedDomains: [{ hostname: new URL(resolvedConfig.siteUrl).hostname }],\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t};\n\n\t\t\t\t// Inject default Noto Sans font for the admin UI.\n\t\t\t\t// Uses the Astro Font API so fonts are downloaded at build time\n\t\t\t\t// and self-hosted (no runtime CDN requests).\n\t\t\t\t//\n\t\t\t\t// The admin CSS references var(--font-emdash) with a system font\n\t\t\t\t// fallback. Users can add extra script coverage (Arabic, CJK, etc.)\n\t\t\t\t// by passing fonts.scripts in the emdash() config. The custom\n\t\t\t\t// notoSans provider resolves all script families from Google Fonts\n\t\t\t\t// under a single font-family name, so they stack via unicode-range.\n\t\t\t\tconst fontsConfig = resolvedConfig.fonts;\n\t\t\t\tconst emdashFonts =\n\t\t\t\t\tfontsConfig === false\n\t\t\t\t\t\t? []\n\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tprovider: notoSans({\n\t\t\t\t\t\t\t\t\t\tscripts: fontsConfig?.scripts,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\tname: \"Noto Sans\",\n\t\t\t\t\t\t\t\t\tcssVariable: \"--font-emdash\",\n\t\t\t\t\t\t\t\t\tweights: [\"100 900\" as const],\n\t\t\t\t\t\t\t\t\tstyles: [\"normal\" as const, \"italic\" as const],\n\t\t\t\t\t\t\t\t\tsubsets: [\n\t\t\t\t\t\t\t\t\t\t\"latin\" as const,\n\t\t\t\t\t\t\t\t\t\t\"latin-ext\" as const,\n\t\t\t\t\t\t\t\t\t\t\"cyrillic\" as const,\n\t\t\t\t\t\t\t\t\t\t\"cyrillic-ext\" as const,\n\t\t\t\t\t\t\t\t\t\t\"devanagari\" as const,\n\t\t\t\t\t\t\t\t\t\t\"greek\" as const,\n\t\t\t\t\t\t\t\t\t\t\"greek-ext\" as const,\n\t\t\t\t\t\t\t\t\t\t\"vietnamese\" as const,\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tfallbacks: [\"ui-sans-serif\", \"system-ui\", \"sans-serif\"],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t];\n\n\t\t\t\t// Authorize media sources so Astro's image service builds transform\n\t\t\t\t// URLs for them (it won't optimize an un-allowed source). `updateConfig`\n\t\t\t\t// merges arrays, so user-configured remotePatterns are preserved.\n\t\t\t\tconst imageRemotePatterns = buildImageRemotePatterns(\n\t\t\t\t\tresolvedConfig.storage,\n\t\t\t\t\tresolveBuildTimeSiteUrl(resolvedConfig.siteUrl),\n\t\t\t\t\tcommand,\n\t\t\t\t);\n\n\t\t\t\t// Wrap Astro's image endpoint so EmDash media bytes load straight from\n\t\t\t\t// storage (Access-safe) instead of over HTTP. Skip when the user opts\n\t\t\t\t// out or has a custom endpoint we can't delegate back to.\n\t\t\t\tconst { entrypoint: imageEndpoint, warn: imageEndpointWarning } = resolveImageEndpoint({\n\t\t\t\t\timagesDisabled: resolvedConfig.images === false,\n\t\t\t\t\tcurrentEntrypoint: astroConfig.image?.endpoint?.entrypoint,\n\t\t\t\t\tisCloudflare: astroConfig.adapter?.name === \"@astrojs/cloudflare\",\n\t\t\t\t});\n\t\t\t\tif (imageEndpointWarning) logger.warn(imageEndpointWarning);\n\n\t\t\t\tconst imageConfig: Record<string, unknown> = {};\n\t\t\t\tif (imageRemotePatterns.length) imageConfig.remotePatterns = imageRemotePatterns;\n\t\t\t\tif (imageEndpoint) {\n\t\t\t\t\timageConfig.endpoint = { entrypoint: imageEndpoint };\n\t\t\t\t\tserializableConfig.imageEndpointRoute = imageEndpointRoutePattern(\n\t\t\t\t\t\tastroConfig.image?.endpoint?.route,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tupdateConfig({\n\t\t\t\t\tsecurity: securityConfig,\n\t\t\t\t\t...(Object.keys(imageConfig).length ? { image: imageConfig } : {}),\n\t\t\t\t\t// fonts is a valid AstroConfig key but may not be in the\n\t\t\t\t\t// type definition for the minimum supported Astro version\n\t\t\t\t\t...({ fonts: emdashFonts } as Record<string, unknown>),\n\t\t\t\t\tvite: createViteConfig(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tserializableConfig,\n\t\t\t\t\t\t\tresolvedConfig,\n\t\t\t\t\t\t\tpluginDescriptors,\n\t\t\t\t\t\t\tastroConfig,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcommand,\n\t\t\t\t\t),\n\t\t\t\t});\n\n\t\t\t\t// Astro reads a route's `export const prerender` by matching the file's\n\t\t\t\t// source text, which the compiled route modules don't match. Without an\n\t\t\t\t// explicit value, `output: \"static\"` would prerender them.\n\t\t\t\tconst injectRoute: typeof astroInjectRoute = (route) =>\n\t\t\t\t\tastroInjectRoute({ ...route, prerender: false });\n\n\t\t\t\t// Inject all core routes\n\t\t\t\tinjectCoreRoutes(injectRoute, {\n\t\t\t\t\tsrcDir: astroConfig.srcDir,\n\t\t\t\t\tcloudflareDevScheduler: command === \"dev\" && usesCloudflareAdapter,\n\t\t\t\t});\n\n\t\t\t\t// Inject routes from pluggable auth providers (authProviders config)\n\t\t\t\tif (resolvedConfig.authProviders?.length) {\n\t\t\t\t\tinjectAuthProviderRoutes(injectRoute, resolvedConfig.authProviders);\n\t\t\t\t}\n\n\t\t\t\t// Inject passkey/oauth/magic-link routes unless transparent external auth is active\n\t\t\t\tif (!useExternalAuth) {\n\t\t\t\t\tinjectBuiltinAuthRoutes(injectRoute);\n\t\t\t\t}\n\n\t\t\t\t// Inject MCP endpoint (always on — bearer-token-only, no cost if unused)\n\t\t\t\tif (resolvedConfig.mcp !== false) {\n\t\t\t\t\tinjectMcpRoute(injectRoute);\n\t\t\t\t}\n\n\t\t\t\tfor (const middleware of buildMiddlewareEntries(resolvedConfig, astroConfig.root)) {\n\t\t\t\t\taddMiddleware(middleware);\n\t\t\t\t}\n\n\t\t\t\t// Route info is printed with absolute, clickable URLs once the\n\t\t\t\t// dev server is listening (see astro:server:setup), since the\n\t\t\t\t// port isn't known yet here. Nothing useful to print for build.\n\t\t\t},\n\t\t\t\"astro:config:done\": async ({ config: finalConfig, logger }) => {\n\t\t\t\tconst warning = missingReactIntegrationWarning(finalConfig.integrations);\n\t\t\t\tif (warning) logger.warn(warning);\n\t\t\t\tconst adapterWarning = adapterVersionMismatchWarning(finalConfig.root);\n\t\t\t\tif (adapterWarning) logger.warn(adapterWarning);\n\t\t\t\tconst sessionWarning = useExternalAuth\n\t\t\t\t\t? undefined\n\t\t\t\t\t: missingSessionDriverWarning(finalConfig.session);\n\t\t\t\tif (sessionWarning) logger.warn(sessionWarning);\n\n\t\t\t\tif (astroCommand !== \"build\" && astroCommand !== \"sync\") return;\n\t\t\t\tif (!migrationMetadata.database) {\n\t\t\t\t\tlogger.warn(\n\t\t\t\t\t\t\"EmDash migration manifest was not written because no database adapter is configured.\",\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!migrationMetadata.database.migrations) {\n\t\t\t\t\tlogger.warn(\n\t\t\t\t\t\t\"EmDash migration manifest was not written because the configured database adapter does not support deployment migrations.\",\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst identity = await getCoreMigrationIdentity();\n\t\t\t\tconst manifest = await buildMigrationManifest({\n\t\t\t\t\tidentity,\n\t\t\t\t\ti18n: normalizedI18n,\n\t\t\t\t\tdatabase: migrationMetadata.database,\n\t\t\t\t});\n\t\t\t\tawait writeMigrationManifest(fileURLToPath(finalConfig.root), manifest);\n\t\t\t},\n\t\t\t\"astro:server:setup\": ({ server, logger }) => {\n\t\t\t\tif (astroCommand === \"dev\" && usesCloudflareAdapter) {\n\t\t\t\t\tstartDevSchedulerBridge(server, logger);\n\t\t\t\t}\n\n\t\t\t\t// Print route info with absolute, clickable URLs once the server\n\t\t\t\t// is listening. Only in `astro dev` -- the dev-bypass shortcut is\n\t\t\t\t// dev-only and the port is unknown until now.\n\t\t\t\tif (astroCommand === \"dev\") {\n\t\t\t\t\tserver.httpServer?.once(\"listening\", () => {\n\t\t\t\t\t\tconst address = server.httpServer?.address();\n\t\t\t\t\t\tif (!address || typeof address === \"string\") return;\n\t\t\t\t\t\tlet host = address.address;\n\t\t\t\t\t\tif (host === \"::1\" || host === \"::\" || host === \"0.0.0.0\") {\n\t\t\t\t\t\t\thost = \"localhost\";\n\t\t\t\t\t\t} else if (address.family === \"IPv6\") {\n\t\t\t\t\t\t\thost = `[${host}]`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tprintDevServerInfo(`http://${host}:${address.port}`, resolvedConfig.mcp !== false);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Generate types once the server is listening, and listen for\n\t\t\t\t// schema mutations in dev so they update the file too.\n\t\t\t\t// The endpoint returns the types content; we write the file here\n\t\t\t\t// (in Node) because workerd has no real filesystem access.\n\t\t\t\tserver.httpServer?.once(\"listening\", () => {\n\t\t\t\t\tconst address = server.httpServer?.address();\n\t\t\t\t\tif (!address || typeof address === \"string\") return;\n\n\t\t\t\t\tconst port = address.port;\n\t\t\t\t\tconst refreshDevTypes = createDebouncedTypegenRefresh(port, logger);\n\t\t\t\t\tlistenForDevTypegenRefresh(server, refreshDevTypes);\n\n\t\t\t\t\t// Initial generation now that the server is up.\n\t\t\t\t\trefreshDevTypes();\n\t\t\t\t});\n\t\t\t},\n\t\t\t\"astro:build:done\": ({ logger }) => {\n\t\t\t\tlogger.info(\"Build complete\");\n\t\t\t},\n\t\t},\n\t};\n\n\tObject.defineProperty(integration, MIGRATION_CONFIG_SYMBOL, {\n\t\tvalue: migrationMetadata,\n\t\tenumerable: false,\n\t});\n\treturn integration;\n}\n\nexport default emdash;\n"],"mappings":"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"}