emdash 0.12.0 → 0.14.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 (1003) hide show
  1. package/dist/{adapters-BktHA7EO.d.mts → adapters-9DybjTO6.d.mts} +1 -1
  2. package/dist/{adapters-BktHA7EO.d.mts.map → adapters-9DybjTO6.d.mts.map} +1 -1
  3. package/dist/allowed-origins-CDdG-4Gd.mjs +116 -0
  4. package/dist/allowed-origins-CDdG-4Gd.mjs.map +1 -0
  5. package/dist/api/route-utils.d.mts +68 -0
  6. package/dist/api/route-utils.d.mts.map +1 -0
  7. package/dist/api/route-utils.mjs +44 -0
  8. package/dist/api/route-utils.mjs.map +1 -0
  9. package/dist/api/schemas/index.d.mts +2 -0
  10. package/dist/api/schemas/index.mjs +4 -0
  11. package/dist/api-BMLZuwM4.mjs +3941 -0
  12. package/dist/api-BMLZuwM4.mjs.map +1 -0
  13. package/dist/api-tokens-D3C9v02m.mjs +3 -0
  14. package/dist/api-tokens-eYymBhIT.mjs +153 -0
  15. package/dist/api-tokens-eYymBhIT.mjs.map +1 -0
  16. package/dist/{apply-C1ZORgcy.mjs → apply-v4DBgjPw.mjs} +19 -346
  17. package/dist/apply-v4DBgjPw.mjs.map +1 -0
  18. package/dist/astro/index.d.mts +10 -6
  19. package/dist/astro/index.d.mts.map +1 -1
  20. package/dist/astro/index.mjs +42 -83
  21. package/dist/astro/index.mjs.map +1 -1
  22. package/dist/astro/middleware/auth.d.mts +9 -5
  23. package/dist/astro/middleware/auth.d.mts.map +1 -1
  24. package/dist/astro/middleware/auth.mjs +25 -65
  25. package/dist/astro/middleware/auth.mjs.map +1 -1
  26. package/dist/astro/middleware/redirect.mjs +5 -5
  27. package/dist/astro/middleware/request-context.mjs +4 -4
  28. package/dist/astro/middleware/setup.mjs +1 -1
  29. package/dist/astro/middleware.d.mts.map +1 -1
  30. package/dist/astro/middleware.mjs +140 -69
  31. package/dist/astro/middleware.mjs.map +1 -1
  32. package/dist/astro/routes/PluginRegistry.d.mts +15 -0
  33. package/dist/astro/routes/PluginRegistry.d.mts.map +1 -0
  34. package/dist/astro/routes/PluginRegistry.mjs +25 -0
  35. package/dist/astro/routes/PluginRegistry.mjs.map +1 -0
  36. package/dist/astro/routes/api/admin/allowed-domains/_domain_.d.mts +15 -0
  37. package/dist/astro/routes/api/admin/allowed-domains/_domain_.d.mts.map +1 -0
  38. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +67 -0
  39. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs.map +1 -0
  40. package/dist/astro/routes/api/admin/allowed-domains/index.d.mts +15 -0
  41. package/dist/astro/routes/api/admin/allowed-domains/index.d.mts.map +1 -0
  42. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +67 -0
  43. package/dist/astro/routes/api/admin/allowed-domains/index.mjs.map +1 -0
  44. package/dist/astro/routes/api/admin/api-tokens/_id_.d.mts +11 -0
  45. package/dist/astro/routes/api/admin/api-tokens/_id_.d.mts.map +1 -0
  46. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +33 -0
  47. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs.map +1 -0
  48. package/dist/astro/routes/api/admin/api-tokens/index.d.mts +17 -0
  49. package/dist/astro/routes/api/admin/api-tokens/index.d.mts.map +1 -0
  50. package/dist/astro/routes/api/admin/api-tokens/index.mjs +52 -0
  51. package/dist/astro/routes/api/admin/api-tokens/index.mjs.map +1 -0
  52. package/dist/astro/routes/api/admin/bylines/_id_/index.d.mts +10 -0
  53. package/dist/astro/routes/api/admin/bylines/_id_/index.d.mts.map +1 -0
  54. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +74 -0
  55. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -0
  56. package/dist/astro/routes/api/admin/bylines/index.d.mts +9 -0
  57. package/dist/astro/routes/api/admin/bylines/index.d.mts.map +1 -0
  58. package/dist/astro/routes/api/admin/bylines/index.mjs +61 -0
  59. package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -0
  60. package/dist/astro/routes/api/admin/comments/_id_/status.d.mts +8 -0
  61. package/dist/astro/routes/api/admin/comments/_id_/status.d.mts.map +1 -0
  62. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +80 -0
  63. package/dist/astro/routes/api/admin/comments/_id_/status.mjs.map +1 -0
  64. package/dist/astro/routes/api/admin/comments/_id_.d.mts +15 -0
  65. package/dist/astro/routes/api/admin/comments/_id_.d.mts.map +1 -0
  66. package/dist/astro/routes/api/admin/comments/_id_.mjs +47 -0
  67. package/dist/astro/routes/api/admin/comments/_id_.mjs.map +1 -0
  68. package/dist/astro/routes/api/admin/comments/bulk.d.mts +8 -0
  69. package/dist/astro/routes/api/admin/comments/bulk.d.mts.map +1 -0
  70. package/dist/astro/routes/api/admin/comments/bulk.mjs +36 -0
  71. package/dist/astro/routes/api/admin/comments/bulk.mjs.map +1 -0
  72. package/dist/astro/routes/api/admin/comments/counts.d.mts +8 -0
  73. package/dist/astro/routes/api/admin/comments/counts.d.mts.map +1 -0
  74. package/dist/astro/routes/api/admin/comments/counts.mjs +25 -0
  75. package/dist/astro/routes/api/admin/comments/counts.mjs.map +1 -0
  76. package/dist/astro/routes/api/admin/comments/index.d.mts +11 -0
  77. package/dist/astro/routes/api/admin/comments/index.d.mts.map +1 -0
  78. package/dist/astro/routes/api/admin/comments/index.mjs +40 -0
  79. package/dist/astro/routes/api/admin/comments/index.mjs.map +1 -0
  80. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.d.mts +8 -0
  81. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.d.mts.map +1 -0
  82. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +48 -0
  83. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs.map +1 -0
  84. package/dist/astro/routes/api/admin/hooks/exclusive/index.d.mts +8 -0
  85. package/dist/astro/routes/api/admin/hooks/exclusive/index.d.mts.map +1 -0
  86. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +36 -0
  87. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs.map +1 -0
  88. package/dist/astro/routes/api/admin/oauth-clients/_id_.d.mts +19 -0
  89. package/dist/astro/routes/api/admin/oauth-clients/_id_.d.mts.map +1 -0
  90. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +69 -0
  91. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs.map +1 -0
  92. package/dist/astro/routes/api/admin/oauth-clients/index.d.mts +15 -0
  93. package/dist/astro/routes/api/admin/oauth-clients/index.d.mts.map +1 -0
  94. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +50 -0
  95. package/dist/astro/routes/api/admin/oauth-clients/index.mjs.map +1 -0
  96. package/dist/astro/routes/api/admin/plugins/_id_/disable.d.mts +8 -0
  97. package/dist/astro/routes/api/admin/plugins/_id_/disable.d.mts.map +1 -0
  98. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +56 -0
  99. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -0
  100. package/dist/astro/routes/api/admin/plugins/_id_/enable.d.mts +8 -0
  101. package/dist/astro/routes/api/admin/plugins/_id_/enable.d.mts.map +1 -0
  102. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +59 -0
  103. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -0
  104. package/dist/astro/routes/api/admin/plugins/_id_/index.d.mts +8 -0
  105. package/dist/astro/routes/api/admin/plugins/_id_/index.d.mts.map +1 -0
  106. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +51 -0
  107. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -0
  108. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.d.mts +8 -0
  109. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.d.mts.map +1 -0
  110. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +58 -0
  111. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -0
  112. package/dist/astro/routes/api/admin/plugins/_id_/update.d.mts +8 -0
  113. package/dist/astro/routes/api/admin/plugins/_id_/update.d.mts.map +1 -0
  114. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +66 -0
  115. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -0
  116. package/dist/astro/routes/api/admin/plugins/index.d.mts +8 -0
  117. package/dist/astro/routes/api/admin/plugins/index.d.mts.map +1 -0
  118. package/dist/astro/routes/api/admin/plugins/index.mjs +49 -0
  119. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -0
  120. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.d.mts +8 -0
  121. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.d.mts.map +1 -0
  122. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +39 -0
  123. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs.map +1 -0
  124. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.d.mts +8 -0
  125. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.d.mts.map +1 -0
  126. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +51 -0
  127. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -0
  128. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.d.mts +8 -0
  129. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.d.mts.map +1 -0
  130. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +69 -0
  131. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -0
  132. package/dist/astro/routes/api/admin/plugins/marketplace/index.d.mts +8 -0
  133. package/dist/astro/routes/api/admin/plugins/marketplace/index.d.mts.map +1 -0
  134. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +58 -0
  135. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -0
  136. package/dist/astro/routes/api/admin/plugins/registry/install.d.mts +8 -0
  137. package/dist/astro/routes/api/admin/plugins/registry/install.d.mts.map +1 -0
  138. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +72 -0
  139. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -0
  140. package/dist/astro/routes/api/admin/plugins/updates.d.mts +8 -0
  141. package/dist/astro/routes/api/admin/plugins/updates.d.mts.map +1 -0
  142. package/dist/astro/routes/api/admin/plugins/updates.mjs +49 -0
  143. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -0
  144. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.d.mts +8 -0
  145. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.d.mts.map +1 -0
  146. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +51 -0
  147. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -0
  148. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.d.mts +8 -0
  149. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.d.mts.map +1 -0
  150. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +39 -0
  151. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs.map +1 -0
  152. package/dist/astro/routes/api/admin/themes/marketplace/index.d.mts +8 -0
  153. package/dist/astro/routes/api/admin/themes/marketplace/index.d.mts.map +1 -0
  154. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +67 -0
  155. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -0
  156. package/dist/astro/routes/api/admin/users/_id_/disable.d.mts +8 -0
  157. package/dist/astro/routes/api/admin/users/_id_/disable.d.mts.map +1 -0
  158. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +43 -0
  159. package/dist/astro/routes/api/admin/users/_id_/disable.mjs.map +1 -0
  160. package/dist/astro/routes/api/admin/users/_id_/enable.d.mts +8 -0
  161. package/dist/astro/routes/api/admin/users/_id_/enable.d.mts.map +1 -0
  162. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +32 -0
  163. package/dist/astro/routes/api/admin/users/_id_/enable.mjs.map +1 -0
  164. package/dist/astro/routes/api/admin/users/_id_/index.d.mts +9 -0
  165. package/dist/astro/routes/api/admin/users/_id_/index.d.mts.map +1 -0
  166. package/dist/astro/routes/api/admin/users/_id_/index.mjs +106 -0
  167. package/dist/astro/routes/api/admin/users/_id_/index.mjs.map +1 -0
  168. package/dist/astro/routes/api/admin/users/_id_/send-recovery.d.mts +8 -0
  169. package/dist/astro/routes/api/admin/users/_id_/send-recovery.d.mts.map +1 -0
  170. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +46 -0
  171. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs.map +1 -0
  172. package/dist/astro/routes/api/admin/users/index.d.mts +8 -0
  173. package/dist/astro/routes/api/admin/users/index.d.mts.map +1 -0
  174. package/dist/astro/routes/api/admin/users/index.mjs +56 -0
  175. package/dist/astro/routes/api/admin/users/index.mjs.map +1 -0
  176. package/dist/astro/routes/api/auth/dev-bypass.d.mts +9 -0
  177. package/dist/astro/routes/api/auth/dev-bypass.d.mts.map +1 -0
  178. package/dist/astro/routes/api/auth/dev-bypass.mjs +84 -0
  179. package/dist/astro/routes/api/auth/dev-bypass.mjs.map +1 -0
  180. package/dist/astro/routes/api/auth/invite/accept.d.mts +8 -0
  181. package/dist/astro/routes/api/auth/invite/accept.d.mts.map +1 -0
  182. package/dist/astro/routes/api/auth/invite/accept.mjs +34 -0
  183. package/dist/astro/routes/api/auth/invite/accept.mjs.map +1 -0
  184. package/dist/astro/routes/api/auth/invite/complete.d.mts +8 -0
  185. package/dist/astro/routes/api/auth/invite/complete.d.mts.map +1 -0
  186. package/dist/astro/routes/api/auth/invite/complete.mjs +56 -0
  187. package/dist/astro/routes/api/auth/invite/complete.mjs.map +1 -0
  188. package/dist/astro/routes/api/auth/invite/index.d.mts +8 -0
  189. package/dist/astro/routes/api/auth/invite/index.d.mts.map +1 -0
  190. package/dist/astro/routes/api/auth/invite/index.mjs +53 -0
  191. package/dist/astro/routes/api/auth/invite/index.mjs.map +1 -0
  192. package/dist/astro/routes/api/auth/invite/register-options.d.mts +8 -0
  193. package/dist/astro/routes/api/auth/invite/register-options.d.mts.map +1 -0
  194. package/dist/astro/routes/api/auth/invite/register-options.mjs +46 -0
  195. package/dist/astro/routes/api/auth/invite/register-options.mjs.map +1 -0
  196. package/dist/astro/routes/api/auth/logout.d.mts +8 -0
  197. package/dist/astro/routes/api/auth/logout.d.mts.map +1 -0
  198. package/dist/astro/routes/api/auth/logout.mjs +27 -0
  199. package/dist/astro/routes/api/auth/logout.mjs.map +1 -0
  200. package/dist/astro/routes/api/auth/magic-link/send.d.mts +8 -0
  201. package/dist/astro/routes/api/auth/magic-link/send.d.mts.map +1 -0
  202. package/dist/astro/routes/api/auth/magic-link/send.mjs +50 -0
  203. package/dist/astro/routes/api/auth/magic-link/send.mjs.map +1 -0
  204. package/dist/astro/routes/api/auth/magic-link/verify.d.mts +8 -0
  205. package/dist/astro/routes/api/auth/magic-link/verify.d.mts.map +1 -0
  206. package/dist/astro/routes/api/auth/magic-link/verify.mjs +35 -0
  207. package/dist/astro/routes/api/auth/magic-link/verify.mjs.map +1 -0
  208. package/dist/astro/routes/api/auth/me.d.mts +14 -0
  209. package/dist/astro/routes/api/auth/me.d.mts.map +1 -0
  210. package/dist/astro/routes/api/auth/me.mjs +43 -0
  211. package/dist/astro/routes/api/auth/me.mjs.map +1 -0
  212. package/dist/astro/routes/api/auth/mode.d.mts +8 -0
  213. package/dist/astro/routes/api/auth/mode.d.mts.map +1 -0
  214. package/dist/astro/routes/api/auth/mode.mjs +29 -0
  215. package/dist/astro/routes/api/auth/mode.mjs.map +1 -0
  216. package/dist/astro/routes/api/auth/oauth/_provider_/callback.d.mts +8 -0
  217. package/dist/astro/routes/api/auth/oauth/_provider_/callback.d.mts.map +1 -0
  218. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +130 -0
  219. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs.map +1 -0
  220. package/dist/astro/routes/api/auth/oauth/_provider_.d.mts +8 -0
  221. package/dist/astro/routes/api/auth/oauth/_provider_.d.mts.map +1 -0
  222. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +60 -0
  223. package/dist/astro/routes/api/auth/oauth/_provider_.mjs.map +1 -0
  224. package/dist/astro/routes/api/auth/passkey/_id_.d.mts +15 -0
  225. package/dist/astro/routes/api/auth/passkey/_id_.d.mts.map +1 -0
  226. package/dist/astro/routes/api/auth/passkey/_id_.mjs +64 -0
  227. package/dist/astro/routes/api/auth/passkey/_id_.mjs.map +1 -0
  228. package/dist/astro/routes/api/auth/passkey/index.d.mts +8 -0
  229. package/dist/astro/routes/api/auth/passkey/index.d.mts.map +1 -0
  230. package/dist/astro/routes/api/auth/passkey/index.mjs +28 -0
  231. package/dist/astro/routes/api/auth/passkey/index.mjs.map +1 -0
  232. package/dist/astro/routes/api/auth/passkey/options.d.mts +8 -0
  233. package/dist/astro/routes/api/auth/passkey/options.d.mts.map +1 -0
  234. package/dist/astro/routes/api/auth/passkey/options.mjs +48 -0
  235. package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -0
  236. package/dist/astro/routes/api/auth/passkey/register/options.d.mts +8 -0
  237. package/dist/astro/routes/api/auth/passkey/register/options.d.mts.map +1 -0
  238. package/dist/astro/routes/api/auth/passkey/register/options.mjs +46 -0
  239. package/dist/astro/routes/api/auth/passkey/register/options.mjs.map +1 -0
  240. package/dist/astro/routes/api/auth/passkey/register/verify.d.mts +8 -0
  241. package/dist/astro/routes/api/auth/passkey/register/verify.d.mts.map +1 -0
  242. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +61 -0
  243. package/dist/astro/routes/api/auth/passkey/register/verify.mjs.map +1 -0
  244. package/dist/astro/routes/api/auth/passkey/verify.d.mts +8 -0
  245. package/dist/astro/routes/api/auth/passkey/verify.d.mts.map +1 -0
  246. package/dist/astro/routes/api/auth/passkey/verify.mjs +49 -0
  247. package/dist/astro/routes/api/auth/passkey/verify.mjs.map +1 -0
  248. package/dist/astro/routes/api/auth/signup/complete.d.mts +8 -0
  249. package/dist/astro/routes/api/auth/signup/complete.d.mts.map +1 -0
  250. package/dist/astro/routes/api/auth/signup/complete.mjs +57 -0
  251. package/dist/astro/routes/api/auth/signup/complete.mjs.map +1 -0
  252. package/dist/astro/routes/api/auth/signup/request.d.mts +8 -0
  253. package/dist/astro/routes/api/auth/signup/request.d.mts.map +1 -0
  254. package/dist/astro/routes/api/auth/signup/request.mjs +46 -0
  255. package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -0
  256. package/dist/astro/routes/api/auth/signup/verify.d.mts +8 -0
  257. package/dist/astro/routes/api/auth/signup/verify.d.mts.map +1 -0
  258. package/dist/astro/routes/api/auth/signup/verify.mjs +35 -0
  259. package/dist/astro/routes/api/auth/signup/verify.mjs.map +1 -0
  260. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.d.mts +15 -0
  261. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.d.mts.map +1 -0
  262. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +193 -0
  263. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs.map +1 -0
  264. package/dist/astro/routes/api/content/_collection_/_id_/compare.d.mts +8 -0
  265. package/dist/astro/routes/api/content/_collection_/_id_/compare.d.mts.map +1 -0
  266. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +20 -0
  267. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs.map +1 -0
  268. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.d.mts +8 -0
  269. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.d.mts.map +1 -0
  270. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +28 -0
  271. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -0
  272. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.d.mts +8 -0
  273. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.d.mts.map +1 -0
  274. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +30 -0
  275. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs.map +1 -0
  276. package/dist/astro/routes/api/content/_collection_/_id_/permanent.d.mts +8 -0
  277. package/dist/astro/routes/api/content/_collection_/_id_/permanent.d.mts.map +1 -0
  278. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +23 -0
  279. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs.map +1 -0
  280. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.d.mts +8 -0
  281. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.d.mts.map +1 -0
  282. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +78 -0
  283. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs.map +1 -0
  284. package/dist/astro/routes/api/content/_collection_/_id_/publish.d.mts +8 -0
  285. package/dist/astro/routes/api/content/_collection_/_id_/publish.d.mts.map +1 -0
  286. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +48 -0
  287. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -0
  288. package/dist/astro/routes/api/content/_collection_/_id_/restore.d.mts +8 -0
  289. package/dist/astro/routes/api/content/_collection_/_id_/restore.d.mts.map +1 -0
  290. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +28 -0
  291. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs.map +1 -0
  292. package/dist/astro/routes/api/content/_collection_/_id_/revisions.d.mts +8 -0
  293. package/dist/astro/routes/api/content/_collection_/_id_/revisions.d.mts.map +1 -0
  294. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +22 -0
  295. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs.map +1 -0
  296. package/dist/astro/routes/api/content/_collection_/_id_/schedule.d.mts +9 -0
  297. package/dist/astro/routes/api/content/_collection_/_id_/schedule.d.mts.map +1 -0
  298. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +58 -0
  299. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -0
  300. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.d.mts +15 -0
  301. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.d.mts.map +1 -0
  302. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +85 -0
  303. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -0
  304. package/dist/astro/routes/api/content/_collection_/_id_/translations.d.mts +8 -0
  305. package/dist/astro/routes/api/content/_collection_/_id_/translations.d.mts.map +1 -0
  306. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +43 -0
  307. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs.map +1 -0
  308. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.d.mts +8 -0
  309. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.d.mts.map +1 -0
  310. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +28 -0
  311. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -0
  312. package/dist/astro/routes/api/content/_collection_/_id_.d.mts +10 -0
  313. package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -0
  314. package/dist/astro/routes/api/content/_collection_/_id_.mjs +88 -0
  315. package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -0
  316. package/dist/astro/routes/api/content/_collection_/index.d.mts +9 -0
  317. package/dist/astro/routes/api/content/_collection_/index.d.mts.map +1 -0
  318. package/dist/astro/routes/api/content/_collection_/index.mjs +61 -0
  319. package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -0
  320. package/dist/astro/routes/api/content/_collection_/trash.d.mts +8 -0
  321. package/dist/astro/routes/api/content/_collection_/trash.d.mts.map +1 -0
  322. package/dist/astro/routes/api/content/_collection_/trash.mjs +25 -0
  323. package/dist/astro/routes/api/content/_collection_/trash.mjs.map +1 -0
  324. package/dist/astro/routes/api/dashboard.d.mts +8 -0
  325. package/dist/astro/routes/api/dashboard.d.mts.map +1 -0
  326. package/dist/astro/routes/api/dashboard.mjs +26 -0
  327. package/dist/astro/routes/api/dashboard.mjs.map +1 -0
  328. package/dist/astro/routes/api/dev/emails.d.mts +9 -0
  329. package/dist/astro/routes/api/dev/emails.d.mts.map +1 -0
  330. package/dist/astro/routes/api/dev/emails.mjs +20 -0
  331. package/dist/astro/routes/api/dev/emails.mjs.map +1 -0
  332. package/dist/astro/routes/api/import/probe.d.mts +18 -0
  333. package/dist/astro/routes/api/import/probe.d.mts.map +1 -0
  334. package/dist/astro/routes/api/import/probe.mjs +35 -0
  335. package/dist/astro/routes/api/import/probe.mjs.map +1 -0
  336. package/dist/astro/routes/api/import/wordpress/analyze.d.mts +88 -0
  337. package/dist/astro/routes/api/import/wordpress/analyze.d.mts.map +1 -0
  338. package/dist/astro/routes/api/import/wordpress/analyze.mjs +313 -0
  339. package/dist/astro/routes/api/import/wordpress/analyze.mjs.map +1 -0
  340. package/dist/astro/routes/api/import/wordpress/execute.d.mts +93 -0
  341. package/dist/astro/routes/api/import/wordpress/execute.d.mts.map +1 -0
  342. package/dist/astro/routes/api/import/wordpress/execute.mjs +593 -0
  343. package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -0
  344. package/dist/astro/routes/api/import/wordpress/media.d.mts +36 -0
  345. package/dist/astro/routes/api/import/wordpress/media.d.mts.map +1 -0
  346. package/dist/astro/routes/api/import/wordpress/media.mjs +225 -0
  347. package/dist/astro/routes/api/import/wordpress/media.mjs.map +1 -0
  348. package/dist/astro/routes/api/import/wordpress/prepare.d.mts +20 -0
  349. package/dist/astro/routes/api/import/wordpress/prepare.d.mts.map +1 -0
  350. package/dist/astro/routes/api/import/wordpress/prepare.mjs +120 -0
  351. package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -0
  352. package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.d.mts +49 -0
  353. package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.d.mts.map +1 -0
  354. package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.mjs +131 -0
  355. package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.mjs.map +1 -0
  356. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +22 -0
  357. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts.map +1 -0
  358. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +139 -0
  359. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -0
  360. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +16 -0
  361. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts.map +1 -0
  362. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +71 -0
  363. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -0
  364. package/dist/astro/routes/api/import/wordpress-plugin/callback.d.mts +8 -0
  365. package/dist/astro/routes/api/import/wordpress-plugin/callback.d.mts.map +1 -0
  366. package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs +29 -0
  367. package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs.map +1 -0
  368. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +20 -0
  369. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts.map +1 -0
  370. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +219 -0
  371. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -0
  372. package/dist/astro/routes/api/manifest.d.mts +8 -0
  373. package/dist/astro/routes/api/manifest.d.mts.map +1 -0
  374. package/dist/astro/routes/api/manifest.mjs +47 -0
  375. package/dist/astro/routes/api/manifest.mjs.map +1 -0
  376. package/dist/astro/routes/api/mcp.d.mts +16 -0
  377. package/dist/astro/routes/api/mcp.d.mts.map +1 -0
  378. package/dist/astro/routes/api/mcp.mjs +1414 -0
  379. package/dist/astro/routes/api/mcp.mjs.map +1 -0
  380. package/dist/astro/routes/api/media/_id_/confirm.d.mts +11 -0
  381. package/dist/astro/routes/api/media/_id_/confirm.d.mts.map +1 -0
  382. package/dist/astro/routes/api/media/_id_/confirm.mjs +61 -0
  383. package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -0
  384. package/dist/astro/routes/api/media/_id_.d.mts +23 -0
  385. package/dist/astro/routes/api/media/_id_.d.mts.map +1 -0
  386. package/dist/astro/routes/api/media/_id_.mjs +83 -0
  387. package/dist/astro/routes/api/media/_id_.mjs.map +1 -0
  388. package/dist/astro/routes/api/media/file/_...key_.d.mts +8 -0
  389. package/dist/astro/routes/api/media/file/_...key_.d.mts.map +1 -0
  390. package/dist/astro/routes/api/media/file/_...key_.mjs +52 -0
  391. package/dist/astro/routes/api/media/file/_...key_.mjs.map +1 -0
  392. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.d.mts +15 -0
  393. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.d.mts.map +1 -0
  394. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +52 -0
  395. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs.map +1 -0
  396. package/dist/astro/routes/api/media/providers/_providerId_/index.d.mts +15 -0
  397. package/dist/astro/routes/api/media/providers/_providerId_/index.d.mts.map +1 -0
  398. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +75 -0
  399. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs.map +1 -0
  400. package/dist/astro/routes/api/media/providers/index.d.mts +11 -0
  401. package/dist/astro/routes/api/media/providers/index.d.mts.map +1 -0
  402. package/dist/astro/routes/api/media/providers/index.mjs +21 -0
  403. package/dist/astro/routes/api/media/providers/index.mjs.map +1 -0
  404. package/dist/astro/routes/api/media/upload-url.d.mts +11 -0
  405. package/dist/astro/routes/api/media/upload-url.d.mts.map +1 -0
  406. package/dist/astro/routes/api/media/upload-url.mjs +82 -0
  407. package/dist/astro/routes/api/media/upload-url.mjs.map +1 -0
  408. package/dist/astro/routes/api/media.d.mts +17 -0
  409. package/dist/astro/routes/api/media.d.mts.map +1 -0
  410. package/dist/astro/routes/api/media.mjs +138 -0
  411. package/dist/astro/routes/api/media.mjs.map +1 -0
  412. package/dist/astro/routes/api/menus/_name_/items/_id_.d.mts +9 -0
  413. package/dist/astro/routes/api/menus/_name_/items/_id_.d.mts.map +1 -0
  414. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +48 -0
  415. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -0
  416. package/dist/astro/routes/api/menus/_name_/items.d.mts +8 -0
  417. package/dist/astro/routes/api/menus/_name_/items.d.mts.map +1 -0
  418. package/dist/astro/routes/api/menus/_name_/items.mjs +31 -0
  419. package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -0
  420. package/dist/astro/routes/api/menus/_name_/reorder.d.mts +8 -0
  421. package/dist/astro/routes/api/menus/_name_/reorder.d.mts.map +1 -0
  422. package/dist/astro/routes/api/menus/_name_/reorder.mjs +31 -0
  423. package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -0
  424. package/dist/astro/routes/api/menus/_name_/translations.d.mts +9 -0
  425. package/dist/astro/routes/api/menus/_name_/translations.d.mts.map +1 -0
  426. package/dist/astro/routes/api/menus/_name_/translations.mjs +62 -0
  427. package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -0
  428. package/dist/astro/routes/api/menus/_name_.d.mts +10 -0
  429. package/dist/astro/routes/api/menus/_name_.d.mts.map +1 -0
  430. package/dist/astro/routes/api/menus/_name_.mjs +60 -0
  431. package/dist/astro/routes/api/menus/_name_.mjs.map +1 -0
  432. package/dist/astro/routes/api/menus/index.d.mts +9 -0
  433. package/dist/astro/routes/api/menus/index.d.mts.map +1 -0
  434. package/dist/astro/routes/api/menus/index.mjs +40 -0
  435. package/dist/astro/routes/api/menus/index.mjs.map +1 -0
  436. package/dist/astro/routes/api/oauth/authorize.d.mts +9 -0
  437. package/dist/astro/routes/api/oauth/authorize.d.mts.map +1 -0
  438. package/dist/astro/routes/api/oauth/authorize.mjs +260 -0
  439. package/dist/astro/routes/api/oauth/authorize.mjs.map +1 -0
  440. package/dist/astro/routes/api/oauth/device/authorize.d.mts +8 -0
  441. package/dist/astro/routes/api/oauth/device/authorize.d.mts.map +1 -0
  442. package/dist/astro/routes/api/oauth/device/authorize.mjs +32 -0
  443. package/dist/astro/routes/api/oauth/device/authorize.mjs.map +1 -0
  444. package/dist/astro/routes/api/oauth/device/code.d.mts +8 -0
  445. package/dist/astro/routes/api/oauth/device/code.d.mts.map +1 -0
  446. package/dist/astro/routes/api/oauth/device/code.mjs +36 -0
  447. package/dist/astro/routes/api/oauth/device/code.mjs.map +1 -0
  448. package/dist/astro/routes/api/oauth/device/token.d.mts +8 -0
  449. package/dist/astro/routes/api/oauth/device/token.d.mts.map +1 -0
  450. package/dist/astro/routes/api/oauth/device/token.mjs +47 -0
  451. package/dist/astro/routes/api/oauth/device/token.mjs.map +1 -0
  452. package/dist/astro/routes/api/oauth/register.d.mts +9 -0
  453. package/dist/astro/routes/api/oauth/register.d.mts.map +1 -0
  454. package/dist/astro/routes/api/oauth/register.mjs +113 -0
  455. package/dist/astro/routes/api/oauth/register.mjs.map +1 -0
  456. package/dist/astro/routes/api/oauth/token/refresh.d.mts +8 -0
  457. package/dist/astro/routes/api/oauth/token/refresh.d.mts.map +1 -0
  458. package/dist/astro/routes/api/oauth/token/refresh.mjs +30 -0
  459. package/dist/astro/routes/api/oauth/token/refresh.mjs.map +1 -0
  460. package/dist/astro/routes/api/oauth/token/revoke.d.mts +8 -0
  461. package/dist/astro/routes/api/oauth/token/revoke.d.mts.map +1 -0
  462. package/dist/astro/routes/api/oauth/token/revoke.mjs +27 -0
  463. package/dist/astro/routes/api/oauth/token/revoke.mjs.map +1 -0
  464. package/dist/astro/routes/api/oauth/token.d.mts +9 -0
  465. package/dist/astro/routes/api/oauth/token.d.mts.map +1 -0
  466. package/dist/astro/routes/api/oauth/token.mjs +141 -0
  467. package/dist/astro/routes/api/oauth/token.mjs.map +1 -0
  468. package/dist/astro/routes/api/openapi.json.d.mts +8 -0
  469. package/dist/astro/routes/api/openapi.json.d.mts.map +1 -0
  470. package/dist/astro/routes/api/openapi.json.mjs +2642 -0
  471. package/dist/astro/routes/api/openapi.json.mjs.map +1 -0
  472. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.d.mts +12 -0
  473. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.d.mts.map +1 -0
  474. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +78 -0
  475. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs.map +1 -0
  476. package/dist/astro/routes/api/redirects/404s/index.d.mts +10 -0
  477. package/dist/astro/routes/api/redirects/404s/index.d.mts.map +1 -0
  478. package/dist/astro/routes/api/redirects/404s/index.mjs +62 -0
  479. package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -0
  480. package/dist/astro/routes/api/redirects/404s/summary.d.mts +8 -0
  481. package/dist/astro/routes/api/redirects/404s/summary.d.mts.map +1 -0
  482. package/dist/astro/routes/api/redirects/404s/summary.mjs +34 -0
  483. package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -0
  484. package/dist/astro/routes/api/redirects/_id_.d.mts +10 -0
  485. package/dist/astro/routes/api/redirects/_id_.d.mts.map +1 -0
  486. package/dist/astro/routes/api/redirects/_id_.mjs +71 -0
  487. package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -0
  488. package/dist/astro/routes/api/redirects/index.d.mts +9 -0
  489. package/dist/astro/routes/api/redirects/index.d.mts.map +1 -0
  490. package/dist/astro/routes/api/redirects/index.mjs +52 -0
  491. package/dist/astro/routes/api/redirects/index.mjs.map +1 -0
  492. package/dist/astro/routes/api/revisions/_revisionId_/index.d.mts +8 -0
  493. package/dist/astro/routes/api/revisions/_revisionId_/index.d.mts.map +1 -0
  494. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +19 -0
  495. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs.map +1 -0
  496. package/dist/astro/routes/api/revisions/_revisionId_/restore.d.mts +8 -0
  497. package/dist/astro/routes/api/revisions/_revisionId_/restore.d.mts.map +1 -0
  498. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +26 -0
  499. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs.map +1 -0
  500. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.d.mts +10 -0
  501. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.d.mts.map +1 -0
  502. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +75 -0
  503. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -0
  504. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.d.mts +9 -0
  505. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.d.mts.map +1 -0
  506. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +63 -0
  507. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -0
  508. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.d.mts +8 -0
  509. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.d.mts.map +1 -0
  510. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +54 -0
  511. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -0
  512. package/dist/astro/routes/api/schema/collections/_slug_/index.d.mts +10 -0
  513. package/dist/astro/routes/api/schema/collections/_slug_/index.d.mts.map +1 -0
  514. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +79 -0
  515. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -0
  516. package/dist/astro/routes/api/schema/collections/index.d.mts +9 -0
  517. package/dist/astro/routes/api/schema/collections/index.d.mts.map +1 -0
  518. package/dist/astro/routes/api/schema/collections/index.mjs +63 -0
  519. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -0
  520. package/dist/astro/routes/api/schema/index.d.mts +8 -0
  521. package/dist/astro/routes/api/schema/index.d.mts.map +1 -0
  522. package/dist/astro/routes/api/schema/index.mjs +82 -0
  523. package/dist/astro/routes/api/schema/index.mjs.map +1 -0
  524. package/dist/astro/routes/api/schema/orphans/_slug_.d.mts +8 -0
  525. package/dist/astro/routes/api/schema/orphans/_slug_.d.mts.map +1 -0
  526. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +55 -0
  527. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -0
  528. package/dist/astro/routes/api/schema/orphans/index.d.mts +8 -0
  529. package/dist/astro/routes/api/schema/orphans/index.d.mts.map +1 -0
  530. package/dist/astro/routes/api/schema/orphans/index.mjs +50 -0
  531. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -0
  532. package/dist/astro/routes/api/search/enable.d.mts +16 -0
  533. package/dist/astro/routes/api/search/enable.d.mts.map +1 -0
  534. package/dist/astro/routes/api/search/enable.mjs +55 -0
  535. package/dist/astro/routes/api/search/enable.mjs.map +1 -0
  536. package/dist/astro/routes/api/search/index.d.mts +17 -0
  537. package/dist/astro/routes/api/search/index.d.mts.map +1 -0
  538. package/dist/astro/routes/api/search/index.mjs +52 -0
  539. package/dist/astro/routes/api/search/index.mjs.map +1 -0
  540. package/dist/astro/routes/api/search/rebuild.d.mts +14 -0
  541. package/dist/astro/routes/api/search/rebuild.d.mts.map +1 -0
  542. package/dist/astro/routes/api/search/rebuild.mjs +48 -0
  543. package/dist/astro/routes/api/search/rebuild.mjs.map +1 -0
  544. package/dist/astro/routes/api/search/stats.d.mts +11 -0
  545. package/dist/astro/routes/api/search/stats.d.mts.map +1 -0
  546. package/dist/astro/routes/api/search/stats.mjs +29 -0
  547. package/dist/astro/routes/api/search/stats.mjs.map +1 -0
  548. package/dist/astro/routes/api/search/suggest.d.mts +16 -0
  549. package/dist/astro/routes/api/search/suggest.d.mts.map +1 -0
  550. package/dist/astro/routes/api/search/suggest.mjs +43 -0
  551. package/dist/astro/routes/api/search/suggest.mjs.map +1 -0
  552. package/dist/astro/routes/api/sections/_slug_.d.mts +10 -0
  553. package/dist/astro/routes/api/sections/_slug_.d.mts.map +1 -0
  554. package/dist/astro/routes/api/sections/_slug_.mjs +65 -0
  555. package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -0
  556. package/dist/astro/routes/api/sections/index.d.mts +9 -0
  557. package/dist/astro/routes/api/sections/index.d.mts.map +1 -0
  558. package/dist/astro/routes/api/sections/index.mjs +48 -0
  559. package/dist/astro/routes/api/sections/index.mjs.map +1 -0
  560. package/dist/astro/routes/api/settings/email.d.mts +18 -0
  561. package/dist/astro/routes/api/settings/email.d.mts.map +1 -0
  562. package/dist/astro/routes/api/settings/email.mjs +105 -0
  563. package/dist/astro/routes/api/settings/email.mjs.map +1 -0
  564. package/dist/astro/routes/api/settings.d.mts +21 -0
  565. package/dist/astro/routes/api/settings.d.mts.map +1 -0
  566. package/dist/astro/routes/api/settings.mjs +58 -0
  567. package/dist/astro/routes/api/settings.mjs.map +1 -0
  568. package/dist/astro/routes/api/setup/admin-verify.d.mts +8 -0
  569. package/dist/astro/routes/api/setup/admin-verify.d.mts.map +1 -0
  570. package/dist/astro/routes/api/setup/admin-verify.mjs +68 -0
  571. package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -0
  572. package/dist/astro/routes/api/setup/admin.d.mts +8 -0
  573. package/dist/astro/routes/api/setup/admin.d.mts.map +1 -0
  574. package/dist/astro/routes/api/setup/admin.mjs +69 -0
  575. package/dist/astro/routes/api/setup/admin.mjs.map +1 -0
  576. package/dist/astro/routes/api/setup/dev-bypass.d.mts +9 -0
  577. package/dist/astro/routes/api/setup/dev-bypass.d.mts.map +1 -0
  578. package/dist/astro/routes/api/setup/dev-bypass.mjs +139 -0
  579. package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -0
  580. package/dist/astro/routes/api/setup/dev-reset.d.mts +8 -0
  581. package/dist/astro/routes/api/setup/dev-reset.d.mts.map +1 -0
  582. package/dist/astro/routes/api/setup/dev-reset.mjs +25 -0
  583. package/dist/astro/routes/api/setup/dev-reset.mjs.map +1 -0
  584. package/dist/astro/routes/api/setup/index.d.mts +8 -0
  585. package/dist/astro/routes/api/setup/index.d.mts.map +1 -0
  586. package/dist/astro/routes/api/setup/index.mjs +93 -0
  587. package/dist/astro/routes/api/setup/index.mjs.map +1 -0
  588. package/dist/astro/routes/api/setup/status.d.mts +8 -0
  589. package/dist/astro/routes/api/setup/status.d.mts.map +1 -0
  590. package/dist/astro/routes/api/setup/status.mjs +60 -0
  591. package/dist/astro/routes/api/setup/status.mjs.map +1 -0
  592. package/dist/astro/routes/api/snapshot.d.mts +8 -0
  593. package/dist/astro/routes/api/snapshot.d.mts.map +1 -0
  594. package/dist/astro/routes/api/snapshot.mjs +270 -0
  595. package/dist/astro/routes/api/snapshot.mjs.map +1 -0
  596. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.d.mts +9 -0
  597. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.d.mts.map +1 -0
  598. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +72 -0
  599. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -0
  600. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.d.mts +19 -0
  601. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.d.mts.map +1 -0
  602. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +80 -0
  603. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -0
  604. package/dist/astro/routes/api/taxonomies/_name_/terms/index.d.mts +15 -0
  605. package/dist/astro/routes/api/taxonomies/_name_/terms/index.d.mts.map +1 -0
  606. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +59 -0
  607. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -0
  608. package/dist/astro/routes/api/taxonomies/index.d.mts +15 -0
  609. package/dist/astro/routes/api/taxonomies/index.d.mts.map +1 -0
  610. package/dist/astro/routes/api/taxonomies/index.mjs +55 -0
  611. package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -0
  612. package/dist/astro/routes/api/themes/preview.d.mts +8 -0
  613. package/dist/astro/routes/api/themes/preview.d.mts.map +1 -0
  614. package/dist/astro/routes/api/themes/preview.mjs +49 -0
  615. package/dist/astro/routes/api/themes/preview.mjs.map +1 -0
  616. package/dist/astro/routes/api/typegen.d.mts +18 -0
  617. package/dist/astro/routes/api/typegen.d.mts.map +1 -0
  618. package/dist/astro/routes/api/typegen.mjs +78 -0
  619. package/dist/astro/routes/api/typegen.mjs.map +1 -0
  620. package/dist/astro/routes/api/well-known/auth.d.mts +8 -0
  621. package/dist/astro/routes/api/well-known/auth.d.mts.map +1 -0
  622. package/dist/astro/routes/api/well-known/auth.mjs +42 -0
  623. package/dist/astro/routes/api/well-known/auth.mjs.map +1 -0
  624. package/dist/astro/routes/api/well-known/oauth-authorization-server.d.mts +8 -0
  625. package/dist/astro/routes/api/well-known/oauth-authorization-server.d.mts.map +1 -0
  626. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +32 -0
  627. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs.map +1 -0
  628. package/dist/astro/routes/api/well-known/oauth-protected-resource.d.mts +8 -0
  629. package/dist/astro/routes/api/well-known/oauth-protected-resource.d.mts.map +1 -0
  630. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +21 -0
  631. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs.map +1 -0
  632. package/dist/astro/routes/api/widget-areas/_name_/reorder.d.mts +8 -0
  633. package/dist/astro/routes/api/widget-areas/_name_/reorder.d.mts.map +1 -0
  634. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +36 -0
  635. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -0
  636. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.d.mts +9 -0
  637. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.d.mts.map +1 -0
  638. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +62 -0
  639. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -0
  640. package/dist/astro/routes/api/widget-areas/_name_/widgets.d.mts +8 -0
  641. package/dist/astro/routes/api/widget-areas/_name_/widgets.d.mts.map +1 -0
  642. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +49 -0
  643. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -0
  644. package/dist/astro/routes/api/widget-areas/_name_.d.mts +9 -0
  645. package/dist/astro/routes/api/widget-areas/_name_.d.mts.map +1 -0
  646. package/dist/astro/routes/api/widget-areas/_name_.mjs +49 -0
  647. package/dist/astro/routes/api/widget-areas/_name_.mjs.map +1 -0
  648. package/dist/astro/routes/api/widget-areas/index.d.mts +9 -0
  649. package/dist/astro/routes/api/widget-areas/index.d.mts.map +1 -0
  650. package/dist/astro/routes/api/widget-areas/index.mjs +59 -0
  651. package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -0
  652. package/dist/astro/routes/api/widget-components.d.mts +8 -0
  653. package/dist/astro/routes/api/widget-components.d.mts.map +1 -0
  654. package/dist/astro/routes/api/widget-components.mjs +18 -0
  655. package/dist/astro/routes/api/widget-components.mjs.map +1 -0
  656. package/dist/astro/routes/robots.txt.d.mts +8 -0
  657. package/dist/astro/routes/robots.txt.d.mts.map +1 -0
  658. package/dist/astro/routes/robots.txt.mjs +61 -0
  659. package/dist/astro/routes/robots.txt.mjs.map +1 -0
  660. package/dist/astro/routes/sitemap-_collection_.xml.d.mts +8 -0
  661. package/dist/astro/routes/sitemap-_collection_.xml.d.mts.map +1 -0
  662. package/dist/astro/routes/sitemap-_collection_.xml.mjs +71 -0
  663. package/dist/astro/routes/sitemap-_collection_.xml.mjs.map +1 -0
  664. package/dist/astro/routes/sitemap.xml.d.mts +8 -0
  665. package/dist/astro/routes/sitemap.xml.d.mts.map +1 -0
  666. package/dist/astro/routes/sitemap.xml.mjs +64 -0
  667. package/dist/astro/routes/sitemap.xml.mjs.map +1 -0
  668. package/dist/astro/types.d.mts +48 -8
  669. package/dist/astro/types.d.mts.map +1 -1
  670. package/dist/auth/providers/github.d.mts +13 -0
  671. package/dist/auth/providers/github.d.mts.map +1 -0
  672. package/dist/auth/providers/github.mjs +18 -0
  673. package/dist/auth/providers/github.mjs.map +1 -0
  674. package/dist/auth/providers/google.d.mts +13 -0
  675. package/dist/auth/providers/google.d.mts.map +1 -0
  676. package/dist/auth/providers/google.mjs +18 -0
  677. package/dist/auth/providers/google.mjs.map +1 -0
  678. package/dist/authorize-BlyCH-96.mjs +37 -0
  679. package/dist/authorize-BlyCH-96.mjs.map +1 -0
  680. package/dist/{base64-MBPo9ozB.mjs → base64-CqR-7kqF.mjs} +1 -1
  681. package/dist/{base64-MBPo9ozB.mjs.map → base64-CqR-7kqF.mjs.map} +1 -1
  682. package/dist/{byline-gFn1r0vA.mjs → byline-D09BaS4j.mjs} +4 -4
  683. package/dist/{byline-gFn1r0vA.mjs.map → byline-D09BaS4j.mjs.map} +1 -1
  684. package/dist/{bylines-DTFI8nDM.mjs → bylines-BTM2xtP8.mjs} +6 -6
  685. package/dist/{bylines-DTFI8nDM.mjs.map → bylines-BTM2xtP8.mjs.map} +1 -1
  686. package/dist/bylines-BdUP8NuI.d.mts +1971 -0
  687. package/dist/bylines-BdUP8NuI.d.mts.map +1 -0
  688. package/dist/{cache-BAJbeoZ8.mjs → cache-CXCpjWiL.mjs} +3 -3
  689. package/dist/{cache-BAJbeoZ8.mjs.map → cache-CXCpjWiL.mjs.map} +1 -1
  690. package/dist/challenge-store-CJ0OOHOr.mjs +49 -0
  691. package/dist/challenge-store-CJ0OOHOr.mjs.map +1 -0
  692. package/dist/{chunks-BK1oZS-l.mjs → chunks-DyGtu1Bv.mjs} +2 -2
  693. package/dist/{chunks-BK1oZS-l.mjs.map → chunks-DyGtu1Bv.mjs.map} +1 -1
  694. package/dist/cli/index.mjs +23 -18
  695. package/dist/cli/index.mjs.map +1 -1
  696. package/dist/client/cf-access.d.mts +1 -1
  697. package/dist/client/index.d.mts +1 -1
  698. package/dist/client/index.d.mts.map +1 -1
  699. package/dist/client/index.mjs +2 -2
  700. package/dist/client/index.mjs.map +1 -1
  701. package/dist/comment-Dd9MI82-.mjs +247 -0
  702. package/dist/comment-Dd9MI82-.mjs.map +1 -0
  703. package/dist/comments-koGI0FrK.mjs +204 -0
  704. package/dist/comments-koGI0FrK.mjs.map +1 -0
  705. package/dist/components-mZem7pbe.mjs +108 -0
  706. package/dist/components-mZem7pbe.mjs.map +1 -0
  707. package/dist/{content-CERxPUN0.mjs → content-D6YG26WG.mjs} +10 -34
  708. package/dist/content-D6YG26WG.mjs.map +1 -0
  709. package/dist/context-qF8d3IPR.mjs +879 -0
  710. package/dist/context-qF8d3IPR.mjs.map +1 -0
  711. package/dist/cron-H8eJ46dv.mjs +264 -0
  712. package/dist/cron-H8eJ46dv.mjs.map +1 -0
  713. package/dist/dashboard-BmWSIUwY.mjs +105 -0
  714. package/dist/dashboard-BmWSIUwY.mjs.map +1 -0
  715. package/dist/db/index.d.mts +3 -3
  716. package/dist/db/index.mjs +1 -1
  717. package/dist/db/libsql.d.mts +1 -1
  718. package/dist/db/postgres.d.mts +1 -1
  719. package/dist/db/sqlite.d.mts +1 -1
  720. package/dist/{db-errors-B7P2pSCn.mjs → db-errors-CGN9kJfo.mjs} +1 -1
  721. package/dist/{db-errors-B7P2pSCn.mjs.map → db-errors-CGN9kJfo.mjs.map} +1 -1
  722. package/dist/{default-pHuz9WF6.mjs → default-Dbs22Gg4.mjs} +1 -1
  723. package/dist/{default-pHuz9WF6.mjs.map → default-Dbs22Gg4.mjs.map} +1 -1
  724. package/dist/device-flow-BqJRxa0Q.mjs +467 -0
  725. package/dist/device-flow-BqJRxa0Q.mjs.map +1 -0
  726. package/dist/email-console-Dmp5Q-P2.mjs +50 -0
  727. package/dist/email-console-Dmp5Q-P2.mjs.map +1 -0
  728. package/dist/error-tSQWIl5U.mjs +437 -0
  729. package/dist/error-tSQWIl5U.mjs.map +1 -0
  730. package/dist/escape-B8bdIryO.mjs +9 -0
  731. package/dist/escape-B8bdIryO.mjs.map +1 -0
  732. package/dist/fts-manager-B633C-kQ.mjs +339 -0
  733. package/dist/fts-manager-B633C-kQ.mjs.map +1 -0
  734. package/dist/hash-DlUxGhQS.mjs +33 -0
  735. package/dist/hash-DlUxGhQS.mjs.map +1 -0
  736. package/dist/import-CNfLOgDE.mjs +1531 -0
  737. package/dist/import-CNfLOgDE.mjs.map +1 -0
  738. package/dist/{index-Dlkzhb4C.d.mts → index-BV8iJ-6s.d.mts} +310 -911
  739. package/dist/index-BV8iJ-6s.d.mts.map +1 -0
  740. package/dist/index-D2gvztOP.d.mts +262 -0
  741. package/dist/index-D2gvztOP.d.mts.map +1 -0
  742. package/dist/index.d.mts +17 -11
  743. package/dist/index.mjs +57 -28
  744. package/dist/{load-DR1VwFXR.mjs → load-QzYRpVN3.mjs} +2 -2
  745. package/dist/{load-DR1VwFXR.mjs.map → load-QzYRpVN3.mjs.map} +1 -1
  746. package/dist/{loader-ou_PXAjg.mjs → loader-Cs6-Bqe6.mjs} +4 -4
  747. package/dist/{loader-ou_PXAjg.mjs.map → loader-Cs6-Bqe6.mjs.map} +1 -1
  748. package/dist/{manifest-schema-Bp6d4d4n.mjs → manifest-schema-HCtSh4Jq.mjs} +1 -1
  749. package/dist/{manifest-schema-Bp6d4d4n.mjs.map → manifest-schema-HCtSh4Jq.mjs.map} +1 -1
  750. package/dist/media/index.d.mts +1 -1
  751. package/dist/media/index.mjs +2 -1
  752. package/dist/media/index.mjs.map +1 -1
  753. package/dist/media/local-runtime.d.mts +11 -7
  754. package/dist/media/local-runtime.d.mts.map +1 -1
  755. package/dist/media/local-runtime.mjs +7 -6
  756. package/dist/media/local-runtime.mjs.map +1 -1
  757. package/dist/media-Dg7he9uK.mjs +209 -0
  758. package/dist/media-Dg7he9uK.mjs.map +1 -0
  759. package/dist/media-allowlist-B8EX01DH.mjs +32 -0
  760. package/dist/media-allowlist-B8EX01DH.mjs.map +1 -0
  761. package/dist/menus-DOzIecHi.mjs +723 -0
  762. package/dist/menus-DOzIecHi.mjs.map +1 -0
  763. package/dist/menus-X4Z-eBA1.mjs +2788 -0
  764. package/dist/menus-X4Z-eBA1.mjs.map +1 -0
  765. package/dist/mime-KV5TqkMN.mjs +36 -0
  766. package/dist/mime-KV5TqkMN.mjs.map +1 -0
  767. package/dist/{mode-YhqNVef_.mjs → mode-DPRPvJYm.mjs} +1 -1
  768. package/dist/{mode-YhqNVef_.mjs.map → mode-DPRPvJYm.mjs.map} +1 -1
  769. package/dist/normalize-CN5kRSMC.mjs +151 -0
  770. package/dist/normalize-CN5kRSMC.mjs.map +1 -0
  771. package/dist/oauth-authorization-62GmpGIH.mjs +275 -0
  772. package/dist/oauth-authorization-62GmpGIH.mjs.map +1 -0
  773. package/dist/oauth-clients-D_B0_-Bz.mjs +266 -0
  774. package/dist/oauth-clients-D_B0_-Bz.mjs.map +1 -0
  775. package/dist/oauth-state-store-DpsZViTu.mjs +49 -0
  776. package/dist/oauth-state-store-DpsZViTu.mjs.map +1 -0
  777. package/dist/oauth-user-lookup-meyS2oB1.mjs +26 -0
  778. package/dist/oauth-user-lookup-meyS2oB1.mjs.map +1 -0
  779. package/dist/{options-nPxWnrya.mjs → options-BL4X94qY.mjs} +1 -1
  780. package/dist/{options-nPxWnrya.mjs.map → options-BL4X94qY.mjs.map} +1 -1
  781. package/dist/options-Cq64Wx0O.d.mts +207 -0
  782. package/dist/options-Cq64Wx0O.d.mts.map +1 -0
  783. package/dist/page/index.d.mts +2 -2
  784. package/dist/parse-BFTPon-J.mjs +89 -0
  785. package/dist/parse-BFTPon-J.mjs.map +1 -0
  786. package/dist/passkey-config-Cg86_ISa.mjs +46 -0
  787. package/dist/passkey-config-Cg86_ISa.mjs.map +1 -0
  788. package/dist/{patterns-DsUZ4uxI.mjs → patterns-CqG5Ya3i.mjs} +54 -2
  789. package/dist/{patterns-DsUZ4uxI.mjs.map → patterns-CqG5Ya3i.mjs.map} +1 -1
  790. package/dist/{placeholder-CDPtkelt.d.mts → placeholder-D3cFCU9y.d.mts} +2 -1
  791. package/dist/{placeholder-CDPtkelt.d.mts.map → placeholder-D3cFCU9y.d.mts.map} +1 -1
  792. package/dist/placeholder-LqmHqvBw.mjs +143 -0
  793. package/dist/placeholder-LqmHqvBw.mjs.map +1 -0
  794. package/dist/plugin-types.d.mts +122 -0
  795. package/dist/plugin-types.d.mts.map +1 -0
  796. package/dist/plugin-types.mjs +1 -0
  797. package/dist/plugins/adapt-sandbox-entry.d.mts +20 -12
  798. package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
  799. package/dist/plugins/adapt-sandbox-entry.mjs +46 -23
  800. package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
  801. package/dist/preview-C1LOEbWZ.mjs +107 -0
  802. package/dist/preview-C1LOEbWZ.mjs.map +1 -0
  803. package/dist/{public-url-B1AxbbbQ.mjs → public-url-CseXl9Fv.mjs} +39 -2
  804. package/dist/{public-url-B1AxbbbQ.mjs.map → public-url-CseXl9Fv.mjs.map} +1 -1
  805. package/dist/{query-yA3-rFji.mjs → query-axZmO6Tn.mjs} +12 -12
  806. package/dist/{query-yA3-rFji.mjs.map → query-axZmO6Tn.mjs.map} +1 -1
  807. package/dist/rate-limit-t5CVjCO6.mjs +120 -0
  808. package/dist/rate-limit-t5CVjCO6.mjs.map +1 -0
  809. package/dist/redirect-DGRsLO2I.mjs +17 -0
  810. package/dist/redirect-DGRsLO2I.mjs.map +1 -0
  811. package/dist/{redirect-C5H7VGIX.mjs → redirect-DkaDxq8e.mjs} +3 -3
  812. package/dist/{redirect-C5H7VGIX.mjs.map → redirect-DkaDxq8e.mjs.map} +1 -1
  813. package/dist/redirects-D1fdd68T.mjs +573 -0
  814. package/dist/redirects-D1fdd68T.mjs.map +1 -0
  815. package/dist/redirects-Dmj6KRU3.mjs +1141 -0
  816. package/dist/redirects-Dmj6KRU3.mjs.map +1 -0
  817. package/dist/{registry-Do34mz_P.mjs → registry-BnCeHYsf.mjs} +8 -300
  818. package/dist/registry-BnCeHYsf.mjs.map +1 -0
  819. package/dist/{request-cache-D4I69LeL.mjs → request-cache-dzCt8TZB.mjs} +1 -1
  820. package/dist/{request-cache-D4I69LeL.mjs.map → request-cache-dzCt8TZB.mjs.map} +1 -1
  821. package/dist/request-meta-CLCwSQOS.mjs +140 -0
  822. package/dist/request-meta-CLCwSQOS.mjs.map +1 -0
  823. package/dist/{runner-Iu3IZSDM.d.mts → runner-DcfZewkO.d.mts} +2 -2
  824. package/dist/{runner-Iu3IZSDM.d.mts.map → runner-DcfZewkO.d.mts.map} +1 -1
  825. package/dist/{runner-DIcU2UCC.mjs → runner-DdnQIwz_.mjs} +436 -187
  826. package/dist/runner-DdnQIwz_.mjs.map +1 -0
  827. package/dist/runtime.d.mts +10 -6
  828. package/dist/runtime.d.mts.map +1 -1
  829. package/dist/runtime.mjs +3 -3
  830. package/dist/schema-BmqagCwG.mjs +41 -0
  831. package/dist/schema-BmqagCwG.mjs.map +1 -0
  832. package/dist/search-CPrvO5u8.mjs +376 -0
  833. package/dist/search-CPrvO5u8.mjs.map +1 -0
  834. package/dist/{secrets-CZ8rxLX3.mjs → secrets-6pgZyq0K.mjs} +3 -3
  835. package/dist/{secrets-CZ8rxLX3.mjs.map → secrets-6pgZyq0K.mjs.map} +1 -1
  836. package/dist/sections-Cm-zb-gZ.mjs +346 -0
  837. package/dist/sections-Cm-zb-gZ.mjs.map +1 -0
  838. package/dist/seed/index.d.mts +2 -2
  839. package/dist/seed/index.mjs +19 -15
  840. package/dist/seo/index.d.mts +1 -1
  841. package/dist/seo-BoR4wCUh.mjs +86 -0
  842. package/dist/seo-BoR4wCUh.mjs.map +1 -0
  843. package/dist/seo-DRq9-EPP.mjs +130 -0
  844. package/dist/seo-DRq9-EPP.mjs.map +1 -0
  845. package/dist/service-vByySp-2.mjs +195 -0
  846. package/dist/service-vByySp-2.mjs.map +1 -0
  847. package/dist/settings-CBBj7HUd.mjs +51 -0
  848. package/dist/settings-CBBj7HUd.mjs.map +1 -0
  849. package/dist/settings-xQKsWnzQ.mjs +235 -0
  850. package/dist/settings-xQKsWnzQ.mjs.map +1 -0
  851. package/dist/setup-BGAJ2uXs.mjs +137 -0
  852. package/dist/setup-BGAJ2uXs.mjs.map +1 -0
  853. package/dist/setup-complete-C6ZCLhKo.mjs +26 -0
  854. package/dist/setup-complete-C6ZCLhKo.mjs.map +1 -0
  855. package/dist/setup-nonce-CY1gQiAU.mjs +25 -0
  856. package/dist/setup-nonce-CY1gQiAU.mjs.map +1 -0
  857. package/dist/site-url-D-M4Fd8O.mjs +13 -0
  858. package/dist/site-url-D-M4Fd8O.mjs.map +1 -0
  859. package/dist/slugify-Cjh1ssOZ.mjs +30 -0
  860. package/dist/slugify-Cjh1ssOZ.mjs.map +1 -0
  861. package/dist/ssrf-CTul4uQi.mjs +1 -0
  862. package/dist/ssrf-DzFN_qV-.mjs +332 -0
  863. package/dist/ssrf-DzFN_qV-.mjs.map +1 -0
  864. package/dist/storage/local.d.mts +1 -1
  865. package/dist/storage/local.mjs +1 -1
  866. package/dist/storage/s3.d.mts +1 -1
  867. package/dist/storage/s3.mjs +1 -1
  868. package/dist/{taxonomies-JmQQZiG1.mjs → taxonomies-Cn9UpaR2.mjs} +7 -7
  869. package/dist/{taxonomies-JmQQZiG1.mjs.map → taxonomies-Cn9UpaR2.mjs.map} +1 -1
  870. package/dist/taxonomies-Dc0mzlms.mjs +508 -0
  871. package/dist/taxonomies-Dc0mzlms.mjs.map +1 -0
  872. package/dist/{taxonomy-D6NvlKo8.mjs → taxonomy-wPfusMK9.mjs} +3 -3
  873. package/dist/{taxonomy-D6NvlKo8.mjs.map → taxonomy-wPfusMK9.mjs.map} +1 -1
  874. package/dist/{tokens-CyRDPVW2.mjs → tokens-DILYNZMi.mjs} +2 -2
  875. package/dist/{tokens-CyRDPVW2.mjs.map → tokens-DILYNZMi.mjs.map} +1 -1
  876. package/dist/{transaction-D44LBXvU.mjs → transaction-NQj4VJ7Z.mjs} +1 -1
  877. package/dist/{transaction-D44LBXvU.mjs.map → transaction-NQj4VJ7Z.mjs.map} +1 -1
  878. package/dist/{transport-DX_5rpsq.d.mts → transport-GeXlLscf.d.mts} +1 -1
  879. package/dist/{transport-DX_5rpsq.d.mts.map → transport-GeXlLscf.d.mts.map} +1 -1
  880. package/dist/{transport-xpzIjCIB.mjs → transport-fw-mKJzT.mjs} +1 -1
  881. package/dist/{transport-xpzIjCIB.mjs.map → transport-fw-mKJzT.mjs.map} +1 -1
  882. package/dist/trusted-proxy-CJhQIk65.mjs +51 -0
  883. package/dist/trusted-proxy-CJhQIk65.mjs.map +1 -0
  884. package/dist/{types-DgSc9Rpc.d.mts → types-B05e2naf.d.mts} +5 -59
  885. package/dist/types-B05e2naf.d.mts.map +1 -0
  886. package/dist/{types-B1gLSAH2.d.mts → types-BWhaSS7U.d.mts} +2 -75
  887. package/dist/types-BWhaSS7U.d.mts.map +1 -0
  888. package/dist/{types-BQx6ZXpR.d.mts → types-C1KKK4VP.d.mts} +3 -1
  889. package/dist/{types-BQx6ZXpR.d.mts.map → types-C1KKK4VP.d.mts.map} +1 -1
  890. package/dist/types-Cb2UCDJg.d.mts +345 -0
  891. package/dist/types-Cb2UCDJg.d.mts.map +1 -0
  892. package/dist/{types-BIgulNsW.mjs → types-CwXMEPRr.mjs} +10 -3
  893. package/dist/types-CwXMEPRr.mjs.map +1 -0
  894. package/dist/{types-B_CXXnzh.d.mts → types-CzvJd1ND.d.mts} +7 -1
  895. package/dist/{types-B_CXXnzh.d.mts.map → types-CzvJd1ND.d.mts.map} +1 -1
  896. package/dist/types-DFowNO60.d.mts +198 -0
  897. package/dist/types-DFowNO60.d.mts.map +1 -0
  898. package/dist/{types-56BKbld_.mjs → types-DSZl1Dsv.mjs} +1 -1
  899. package/dist/{types-56BKbld_.mjs.map → types-DSZl1Dsv.mjs.map} +1 -1
  900. package/dist/types-DW1l0gCv.d.mts +75 -0
  901. package/dist/types-DW1l0gCv.d.mts.map +1 -0
  902. package/dist/types-Db67HHlU.mjs +3 -0
  903. package/dist/{types-C-aFbqmA.d.mts → types-DmxPPXGf.d.mts} +1 -1
  904. package/dist/{types-C-aFbqmA.d.mts.map → types-DmxPPXGf.d.mts.map} +1 -1
  905. package/dist/{types-PafqtQuM.mjs → types-Dz9CGX_d.mjs} +1 -1
  906. package/dist/{types-PafqtQuM.mjs.map → types-Dz9CGX_d.mjs.map} +1 -1
  907. package/dist/user-Dr1bOCqS.mjs +155 -0
  908. package/dist/user-Dr1bOCqS.mjs.map +1 -0
  909. package/dist/utils-_F-rWBTN.mjs +286 -0
  910. package/dist/utils-_F-rWBTN.mjs.map +1 -0
  911. package/dist/{validate-BcC3m2O7.d.mts → validate-BpQGsmd7.d.mts} +5 -4
  912. package/dist/validate-BpQGsmd7.d.mts.map +1 -0
  913. package/dist/{validate-UK4Ja1uo.mjs → validate-DlFxcVVK.mjs} +3 -3
  914. package/dist/{validate-UK4Ja1uo.mjs.map → validate-DlFxcVVK.mjs.map} +1 -1
  915. package/dist/{validation-Vc5DQkJa.mjs → validation-BiFJqUp5.mjs} +6 -5
  916. package/dist/{validation-Vc5DQkJa.mjs.map → validation-BiFJqUp5.mjs.map} +1 -1
  917. package/dist/version-DNmQakZO.mjs +7 -0
  918. package/dist/{version-BdP--J1g.mjs.map → version-DNmQakZO.mjs.map} +1 -1
  919. package/dist/widgets-B9j_yzlk.mjs +106 -0
  920. package/dist/widgets-B9j_yzlk.mjs.map +1 -0
  921. package/dist/zod-generator-DSyz01KE.mjs +234 -0
  922. package/dist/zod-generator-DSyz01KE.mjs.map +1 -0
  923. package/locals.d.ts +1 -1
  924. package/package.json +38 -15
  925. package/src/api/handlers/content.ts +1 -0
  926. package/src/api/handlers/index.ts +7 -0
  927. package/src/api/handlers/marketplace.ts +27 -6
  928. package/src/api/handlers/menus.ts +157 -580
  929. package/src/api/handlers/plugins.ts +77 -31
  930. package/src/api/handlers/registry.ts +1083 -0
  931. package/src/api/openapi/document.ts +10 -4
  932. package/src/api/schemas/content.ts +1 -0
  933. package/src/api/schemas/menus.ts +27 -23
  934. package/src/api/types.ts +6 -0
  935. package/src/astro/integration/index.ts +1 -0
  936. package/src/astro/integration/route-naming.ts +19 -0
  937. package/src/astro/integration/routes.ts +25 -3
  938. package/src/astro/integration/runtime.ts +35 -8
  939. package/src/astro/middleware/auth.ts +8 -2
  940. package/src/astro/middleware/csp.ts +25 -3
  941. package/src/astro/middleware.ts +3 -0
  942. package/src/astro/routes/api/admin/plugins/[id]/enable.ts +10 -0
  943. package/src/astro/routes/api/admin/plugins/registry/install.ts +107 -0
  944. package/src/astro/routes/api/auth/invite/register-options.ts +8 -1
  945. package/src/astro/routes/api/import/wordpress/execute.ts +185 -6
  946. package/src/astro/routes/api/menus/[name]/items/[id].ts +69 -0
  947. package/src/astro/routes/api/menus/[name]/items.ts +4 -65
  948. package/src/astro/types.ts +38 -0
  949. package/src/cli/wxr/parser.ts +263 -0
  950. package/src/client/index.ts +2 -1
  951. package/src/database/migrations/036_i18n_menus_and_taxonomies.ts +166 -49
  952. package/src/database/migrations/038_registry_plugin_state.ts +130 -0
  953. package/src/database/migrations/039_fix_fts5_triggers.ts +264 -0
  954. package/src/database/migrations/runner.ts +4 -0
  955. package/src/database/repositories/content.ts +5 -1
  956. package/src/database/repositories/index.ts +14 -0
  957. package/src/database/repositories/menu.ts +644 -0
  958. package/src/database/repositories/types.ts +6 -0
  959. package/src/database/types.ts +5 -1
  960. package/src/emdash-runtime.ts +122 -34
  961. package/src/import/sources/wordpress-plugin.ts +9 -2
  962. package/src/import/sources/wxr.ts +16 -2
  963. package/src/import/ssrf.ts +20 -500
  964. package/src/import/wxr-taxonomies.ts +730 -0
  965. package/src/index.ts +3 -10
  966. package/src/media/normalize.ts +37 -4
  967. package/src/plugin-types.ts +240 -0
  968. package/src/plugins/adapt-sandbox-entry.ts +115 -39
  969. package/src/plugins/define-plugin.ts +34 -56
  970. package/src/plugins/index.ts +1 -9
  971. package/src/plugins/marketplace.ts +63 -4
  972. package/src/plugins/sandbox/index.ts +1 -1
  973. package/src/plugins/sandbox/noop.ts +2 -2
  974. package/src/plugins/sandbox/types.ts +7 -4
  975. package/src/plugins/state.ts +84 -38
  976. package/src/plugins/types.ts +2 -79
  977. package/src/registry/config.ts +311 -0
  978. package/src/registry/plugin-id.ts +116 -0
  979. package/src/registry/types.ts +206 -0
  980. package/src/search/fts-manager.ts +77 -15
  981. package/src/security/ssrf.ts +501 -0
  982. package/dist/apply-C1ZORgcy.mjs.map +0 -1
  983. package/dist/content-CERxPUN0.mjs.map +0 -1
  984. package/dist/error-D6LuHLw9.mjs +0 -27
  985. package/dist/error-D6LuHLw9.mjs.map +0 -1
  986. package/dist/index-Dlkzhb4C.d.mts.map +0 -1
  987. package/dist/placeholder-Ci0RLeCk.mjs +0 -268
  988. package/dist/placeholder-Ci0RLeCk.mjs.map +0 -1
  989. package/dist/registry-Do34mz_P.mjs.map +0 -1
  990. package/dist/runner-DIcU2UCC.mjs.map +0 -1
  991. package/dist/search-n-ZCMfr3.mjs +0 -9914
  992. package/dist/search-n-ZCMfr3.mjs.map +0 -1
  993. package/dist/settings-nTXPRi3D.mjs +0 -440
  994. package/dist/settings-nTXPRi3D.mjs.map +0 -1
  995. package/dist/types-B1gLSAH2.d.mts.map +0 -1
  996. package/dist/types-BIgulNsW.mjs.map +0 -1
  997. package/dist/types-Cug_RO3W.mjs +0 -16
  998. package/dist/types-Cug_RO3W.mjs.map +0 -1
  999. package/dist/types-DgSc9Rpc.d.mts.map +0 -1
  1000. package/dist/validate-BcC3m2O7.d.mts.map +0 -1
  1001. package/dist/version-BdP--J1g.mjs +0 -7
  1002. package/dist/zod-generator-CHnJUP2l.mjs +0 -137
  1003. package/dist/zod-generator-CHnJUP2l.mjs.map +0 -1
@@ -0,0 +1,2642 @@
1
+ import "../../../base64-CqR-7kqF.mjs";
2
+ import "../../../types-CwXMEPRr.mjs";
3
+ import { r as handleError } from "../../../error-tSQWIl5U.mjs";
4
+ import { $ as createMenuBody, $t as contentCreateBody, A as searchRebuildBody, At as fieldReorderBody, B as updateSectionBody, C as userDetailSchema, Ct as collectionListResponseSchema, D as usersListQuery, Dn as deleteResponseSchema, Dt as createCollectionBody, E as userUpdateBody, Et as collectionWithFieldsResponseSchema, F as siteSettingsSchema, G as taxonomyListResponseSchema, Gt as mediaListQuery, H as createTermBody, Ht as mediaConfirmResponseSchema, I as createSectionBody, J as termResponseSchema, Jt as mediaResponseSchema, K as termGetResponseSchema, Kt as mediaListResponseSchema, L as sectionListResponseSchema, Lt as updateCollectionBody, N as searchSuggestQuery, Nt as orphanRegisterBody, O as searchEnableBody, Ot as createFieldBody, P as settingsUpdateBody, Pn as successEnvelope, Pt as orphanedTableListResponseSchema, Q as updateTermBody, Qt as contentCompareResponseSchema, R as sectionSchema, Rt as updateFieldBody, S as allowedDomainUpdateBody, St as collectionGetQuery, T as userSchema, Ut as mediaExistingResponseSchema, Vt as mediaConfirmBody, Xt as mediaUploadUrlBody, Yt as mediaUpdateBody, Zt as mediaUploadUrlResponseSchema, _ as widgetAreaSchema, _t as commentSchema, a as notFoundPruneBody, an as contentResponseSchema, b as widgetSchema, bt as publicCommentListResponseSchema, ct as updateMenuBody, d as redirectsListQuery, dn as contentTranslationsResponseSchema, en as contentItemSchema, et as createMenuItemBody, f as updateRedirectBody, fn as contentTrashQuery, ft as adminCommentListResponseSchema, g as updateWidgetBody, gt as commentListQuery, h as reorderWidgetsBody, hn as trashedContentListResponseSchema, ht as commentCountsResponseSchema, i as notFoundListResponseSchema, j as searchResponseSchema, jt as fieldResponseSchema, k as searchQuery, kt as fieldListResponseSchema, l as redirectListResponseSchema, ln as contentTermsBody, lt as updateMenuItemBody, m as createWidgetBody, mt as commentBulkResponseSchema, nn as contentListResponseSchema, on as contentScheduleBody, ot as menuWithItemsSchema, p as createWidgetAreaBody, pn as contentUpdateBody, pt as commentBulkBody, q as termListResponseSchema, r as notFoundListQuery, rt as menuListItemSchema, s as notFoundSummaryResponseSchema, st as reorderMenuItemsBody, t as createRedirectBody, tn as contentListQuery, tt as menuItemSchema, u as redirectSchema, v as widgetAreaWithWidgetsAndCountSchema, vt as commentStatusBody, w as userListResponseSchema, wn as apiErrorSchema, wt as collectionResponseSchema, x as allowedDomainCreateBody, y as widgetAreaWithWidgetsSchema, yt as createCommentBody, z as sectionsListQuery, zt as DEFAULT_MAX_UPLOAD_SIZE } from "../../../redirects-Dmj6KRU3.mjs";
5
+ import { z } from "zod";
6
+ import { globalRegistry } from "zod/v4/core";
7
+ import { globalRegistry as globalRegistry$1, object, registry, toJSONSchema } from "zod/v4";
8
+
9
+ //#region ../../node_modules/.pnpm/zod-openapi@5.4.6_zod@4.4.1/node_modules/zod-openapi/dist/components-DiNDbisK.mjs
10
+ const isAnyZodType = (schema) => typeof schema === "object" && schema !== null && "_zod" in schema;
11
+ const createExamples = (examples, registry$1, path) => {
12
+ if (!examples) return;
13
+ const examplesObject = {};
14
+ for (const [name, example] of Object.entries(examples)) examplesObject[name] = registry$1.addExample(example, [...path, name]);
15
+ return examplesObject;
16
+ };
17
+ const createMediaTypeObject = (mediaType, ctx, path) => {
18
+ const { schema, examples, ...rest } = mediaType;
19
+ const mediaTypeObject = rest;
20
+ if (isAnyZodType(schema)) mediaTypeObject.schema = ctx.registry.addSchema(schema, [...path, "schema"], {
21
+ io: ctx.io,
22
+ source: { type: "mediaType" }
23
+ });
24
+ else mediaTypeObject.schema = schema;
25
+ if (examples) mediaTypeObject.examples = createExamples(examples, ctx.registry, [...path, "examples"]);
26
+ return mediaTypeObject;
27
+ };
28
+ const createContent = (content, ctx, path) => {
29
+ const contentObject = {};
30
+ for (const [mediaType, mediaTypeObject] of Object.entries(content)) if (mediaTypeObject) contentObject[mediaType] = createMediaTypeObject(mediaTypeObject, ctx, [...path, mediaType]);
31
+ return contentObject;
32
+ };
33
+ const unwrapZodObject = (zodType, io, path) => {
34
+ const def = zodType._zod.def;
35
+ switch (def.type) {
36
+ case "object": return zodType;
37
+ case "lazy": return unwrapZodObject(def.getter(), io, path);
38
+ case "pipe":
39
+ if (io === "input") return unwrapZodObject(def.in, io, path);
40
+ return unwrapZodObject(def.out, io, path);
41
+ }
42
+ throw new Error(`Failed to unwrap ZodObject from type: ${zodType._zod.def.type} at ${path.join(" > ")}`);
43
+ };
44
+ const isRequired = (zodType, io) => {
45
+ if (io === "input") return zodType._zod.optin === void 0;
46
+ return zodType._zod.optout === void 0;
47
+ };
48
+ const createHeaders = (headers, registry$1, path) => {
49
+ if (!headers) return;
50
+ if (isAnyZodType(headers)) {
51
+ const zodObject = unwrapZodObject(headers, "output", path);
52
+ const headersObject = {};
53
+ for (const [key, zodSchema] of Object.entries(zodObject._zod.def.shape)) headersObject[key] = registry$1.addHeader(zodSchema, [...path, key]);
54
+ return headersObject;
55
+ }
56
+ return headers;
57
+ };
58
+ const createLinks = (links, registry$1, path) => {
59
+ if (!links) return;
60
+ const linksObject = {};
61
+ for (const [name, link] of Object.entries(links)) linksObject[name] = registry$1.addLink(link, [...path, name]);
62
+ return linksObject;
63
+ };
64
+ const createManualParameters = (parameters, registry$1, path) => {
65
+ if (!parameters) return;
66
+ const parameterObjects = [];
67
+ for (const parameter of parameters) {
68
+ if (isAnyZodType(parameter)) {
69
+ const paramObject = registry$1.addParameter(parameter, [...path, "parameters"]);
70
+ parameterObjects.push(paramObject);
71
+ continue;
72
+ }
73
+ parameterObjects.push(parameter);
74
+ }
75
+ return parameterObjects;
76
+ };
77
+ const createParameters = (requestParams, registry$1, path) => {
78
+ if (!requestParams) return;
79
+ const parameterObjects = [];
80
+ for (const [location, schema] of Object.entries(requestParams ?? {})) {
81
+ const zodObject = unwrapZodObject(schema, "input", path);
82
+ for (const [name, zodSchema] of Object.entries(zodObject._zod.def.shape)) {
83
+ const paramObject = registry$1.addParameter(zodSchema, [
84
+ ...path,
85
+ location,
86
+ name
87
+ ], { location: {
88
+ in: location,
89
+ name
90
+ } });
91
+ parameterObjects.push(paramObject);
92
+ }
93
+ }
94
+ return parameterObjects;
95
+ };
96
+ const isISpecificationExtension = (key) => key.startsWith("x-");
97
+ const createCallbacks = (callbacks, registry$1, path) => {
98
+ if (!callbacks) return;
99
+ const callbacksObject = {};
100
+ for (const [name, value] of Object.entries(callbacks)) {
101
+ if (isISpecificationExtension(name)) {
102
+ callbacksObject[name] = value;
103
+ continue;
104
+ }
105
+ callbacksObject[name] = registry$1.addCallback(value, [...path, name]);
106
+ }
107
+ return callbacksObject;
108
+ };
109
+ const createResponses = (responses, registry$1, path) => {
110
+ if (!responses) return;
111
+ const responsesObject = {};
112
+ for (const [statusCode, response] of Object.entries(responses)) {
113
+ if (!response) continue;
114
+ if (isISpecificationExtension(statusCode)) {
115
+ responsesObject[statusCode] = response;
116
+ continue;
117
+ }
118
+ if ("$ref" in response) {
119
+ responsesObject[statusCode] = response;
120
+ continue;
121
+ }
122
+ responsesObject[statusCode] = registry$1.addResponse(response, [...path, statusCode]);
123
+ }
124
+ return responsesObject;
125
+ };
126
+ const createOperation = (operation, registry$1, path) => {
127
+ const { parameters, requestParams, requestBody, responses, callbacks, ...rest } = operation;
128
+ const operationObject = rest;
129
+ const maybeManualParameters = createManualParameters(parameters, registry$1, [...path, "parameters"]);
130
+ const maybeRequestParams = createParameters(requestParams, registry$1, [...path, "requestParams"]);
131
+ if (maybeRequestParams || maybeManualParameters) operationObject.parameters = [...maybeRequestParams ?? [], ...maybeManualParameters ?? []];
132
+ const maybeRequestBody = requestBody && registry$1.addRequestBody(requestBody, path);
133
+ if (maybeRequestBody) operationObject.requestBody = maybeRequestBody;
134
+ const maybeResponses = createResponses(responses, registry$1, [...path, "responses"]);
135
+ if (maybeResponses) operationObject.responses = maybeResponses;
136
+ const maybeCallbacks = createCallbacks(callbacks, registry$1, [...path, "callbacks"]);
137
+ if (maybeCallbacks) operationObject.callbacks = maybeCallbacks;
138
+ return operationObject;
139
+ };
140
+ const createPaths = (paths, registry$1, path) => {
141
+ if (!paths) return;
142
+ const pathsObject = {};
143
+ for (const [singlePath, pathItemObject] of Object.entries(paths)) {
144
+ if (isISpecificationExtension(singlePath)) {
145
+ pathsObject[singlePath] = pathItemObject;
146
+ continue;
147
+ }
148
+ pathsObject[singlePath] = registry$1.addPathItem(pathItemObject, [...path, singlePath]);
149
+ }
150
+ return pathsObject;
151
+ };
152
+ const openApiVersions = [
153
+ "3.0.0",
154
+ "3.0.1",
155
+ "3.0.2",
156
+ "3.0.3",
157
+ "3.1.0",
158
+ "3.1.1"
159
+ ];
160
+ const satisfiesVersion = (test, against) => openApiVersions.indexOf(test) >= openApiVersions.indexOf(against);
161
+ const override = (ctx) => {
162
+ const def = ctx.zodSchema._zod.def;
163
+ switch (def.type) {
164
+ case "bigint":
165
+ ctx.jsonSchema.type = "integer";
166
+ ctx.jsonSchema.format = "int64";
167
+ break;
168
+ case "union": {
169
+ if ("discriminator" in def && typeof def.discriminator === "string") {
170
+ ctx.jsonSchema.oneOf ??= ctx.jsonSchema.anyOf;
171
+ delete ctx.jsonSchema.anyOf;
172
+ ctx.jsonSchema.type = "object";
173
+ ctx.jsonSchema.discriminator = { propertyName: def.discriminator };
174
+ const mapping = {};
175
+ for (const [index, obj] of Object.entries(ctx.jsonSchema.oneOf)) {
176
+ const ref = obj.$ref;
177
+ if (!ref) {
178
+ delete ctx.jsonSchema.discriminator;
179
+ return;
180
+ }
181
+ const discriminatorValues = def.options[Number(index)]._zod.propValues?.[def.discriminator];
182
+ if (!discriminatorValues?.size) return;
183
+ for (const value of [...discriminatorValues ?? []]) {
184
+ if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") return;
185
+ mapping[String(value)] = ref;
186
+ }
187
+ }
188
+ ctx.jsonSchema.discriminator.mapping = mapping;
189
+ }
190
+ const meta = globalRegistry$1.get(ctx.zodSchema);
191
+ if (typeof meta?.unionOneOf === "boolean") {
192
+ if (meta.unionOneOf) {
193
+ ctx.jsonSchema.oneOf = ctx.jsonSchema.anyOf;
194
+ delete ctx.jsonSchema.anyOf;
195
+ }
196
+ delete ctx.jsonSchema.unionOneOf;
197
+ }
198
+ break;
199
+ }
200
+ case "date":
201
+ ctx.jsonSchema.type = "string";
202
+ break;
203
+ case "literal":
204
+ if (def.values.includes(void 0)) break;
205
+ break;
206
+ case "undefined":
207
+ ctx.jsonSchema.not = {};
208
+ break;
209
+ }
210
+ };
211
+ const validate = (ctx, opts, previousContext) => {
212
+ if (previousContext.context && ctx.zodSchema._zod.parent !== previousContext.context.zodSchema) {
213
+ if (previousContext.context.zodSchema._zod.def.type === "pipe") throw new Error(`Zod transform found at ${previousContext.context.path.join(" > ")} are not supported in output schemas. Please use \`.overwrite()\` or wrap the schema in a \`.pipe()\` or assign it manual metadata with \`.meta()\``);
214
+ throw new Error(`Zod schema of type \`${previousContext.context.zodSchema._zod.def.type}\` at ${previousContext.context?.path.join(" > ")} cannot be represented in OpenAPI. Please assign it metadata with \`.meta()\``);
215
+ }
216
+ previousContext.context = void 0;
217
+ if (Object.keys(ctx.jsonSchema).length) return;
218
+ const def = ctx.zodSchema._zod.def;
219
+ const allowEmptySchema = opts.allowEmptySchema?.[def.type];
220
+ if (allowEmptySchema === true || allowEmptySchema?.[ctx.io]) return;
221
+ switch (def.type) {
222
+ case "optional":
223
+ validate({
224
+ ...ctx,
225
+ zodSchema: def.innerType
226
+ }, opts, previousContext);
227
+ return;
228
+ case "any": return;
229
+ case "unknown": return;
230
+ case "pipe":
231
+ if (ctx.io === "output") {
232
+ if (!ctx.zodSchema._zod.parent) {
233
+ previousContext.context = ctx;
234
+ return;
235
+ }
236
+ }
237
+ return;
238
+ case "transform":
239
+ if (ctx.io === "output") return;
240
+ break;
241
+ case "literal":
242
+ if (def.values.includes(void 0)) throw new Error(`Zod literal at ${ctx.path.join(" > ")} cannot include \`undefined\` as a value. Please use \`z.undefined()\` or \`.optional()\` instead.`);
243
+ return;
244
+ case "custom": if (!ctx.zodSchema._zod.parent) {
245
+ previousContext.context = ctx;
246
+ return;
247
+ }
248
+ }
249
+ throw new Error(`Zod schema of type \`${def.type}\` at ${ctx.path.join(" > ")} cannot be represented in OpenAPI. Please assign it metadata with \`.meta()\``);
250
+ };
251
+ const renameComponents = (components, outputIds, ctx, refPath) => {
252
+ const componentsToRename = /* @__PURE__ */ new Map();
253
+ if (ctx.io === "input") return componentsToRename;
254
+ const componentDependencies = /* @__PURE__ */ new Map();
255
+ const stringifiedComponents = /* @__PURE__ */ new Map();
256
+ for (const [key, value] of Object.entries(components)) {
257
+ const stringified = JSON.stringify(value);
258
+ const regex = new RegExp(`"${refPath}([^"]+)"`, "g");
259
+ const matches = stringified.matchAll(regex);
260
+ const dependencies = /* @__PURE__ */ new Set();
261
+ for (const match of matches) {
262
+ const dep = match[1];
263
+ if (dep !== key) dependencies.add(dep);
264
+ }
265
+ stringifiedComponents.set(key, stringified);
266
+ componentDependencies.set(key, { dependencies });
267
+ }
268
+ for (const [key] of stringifiedComponents) {
269
+ if (!ctx.registry.components.schemas.ids.get(key)) continue;
270
+ if (isDependencyPure(componentDependencies, stringifiedComponents, ctx.registry, key)) continue;
271
+ const newName = outputIds.get(key) ?? `${key}${ctx.opts.outputIdSuffix ?? "Output"}`;
272
+ componentsToRename.set(key, newName);
273
+ components[newName] = components[key];
274
+ delete components[key];
275
+ }
276
+ return componentsToRename;
277
+ };
278
+ const isDependencyPure = (componentDependencies, stringifiedComponents, registry$1, key, visited = /* @__PURE__ */ new Set()) => {
279
+ if (visited.has(key)) return true;
280
+ const dependencies = componentDependencies.get(key);
281
+ if (dependencies.pure !== void 0) return dependencies.pure;
282
+ const stringified = stringifiedComponents.get(key);
283
+ const component = registry$1.components.schemas.ids.get(key);
284
+ if (component && stringified !== JSON.stringify(component)) {
285
+ dependencies.pure = false;
286
+ return false;
287
+ }
288
+ visited.add(key);
289
+ const result = [...dependencies.dependencies].every((dep) => isDependencyPure(componentDependencies, stringifiedComponents, registry$1, dep, new Set(visited)));
290
+ dependencies.pure = result;
291
+ return result;
292
+ };
293
+ const zodOpenApiMetadataFields = [
294
+ "param",
295
+ "header",
296
+ "unusedIO",
297
+ "override",
298
+ "outputId"
299
+ ];
300
+ const deleteZodOpenApiMeta = (jsonSchema) => {
301
+ zodOpenApiMetadataFields.forEach((field) => {
302
+ delete jsonSchema[field];
303
+ });
304
+ };
305
+ const deleteInvalidJsonSchemaFields = (jsonSchema) => {
306
+ delete jsonSchema.$schema;
307
+ delete jsonSchema.id;
308
+ delete jsonSchema.$id;
309
+ };
310
+ const createSchemas = (schemas, ctx) => {
311
+ const refPath = ctx.opts.schemaRefPath ?? "#/components/schemas/";
312
+ const entries = {};
313
+ for (const [name, { zodType }] of Object.entries(schemas)) entries[name] = zodType;
314
+ const zodRegistry = registry();
315
+ zodRegistry.add(object(entries), { id: "zodOpenApiCreateSchema" });
316
+ for (const [id, { zodType }] of ctx.registry.components.schemas.manual) zodRegistry.add(zodType, { id });
317
+ const outputIds = /* @__PURE__ */ new Map();
318
+ const defsName = satisfiesVersion(ctx.openapiVersion ?? "3.1.0", "3.1.0") ? "$defs" : "definitions";
319
+ const previousContext = {};
320
+ const jsonSchema = toJSONSchema(zodRegistry, {
321
+ override(context) {
322
+ const meta = globalRegistry$1.get(context.zodSchema);
323
+ if (meta?.outputId && meta?.id) outputIds.set(meta.id, meta.outputId);
324
+ if (context.jsonSchema.$ref) return;
325
+ const enrichedContext = {
326
+ ...context,
327
+ io: ctx.io
328
+ };
329
+ override(enrichedContext);
330
+ if (typeof ctx.opts.override === "function") ctx.opts.override(enrichedContext);
331
+ if (typeof meta?.override === "function") {
332
+ meta.override(enrichedContext);
333
+ delete context.jsonSchema.override;
334
+ }
335
+ if (typeof meta?.override === "object" && meta.override !== null) {
336
+ Object.assign(context.jsonSchema, meta.override);
337
+ delete context.jsonSchema.override;
338
+ }
339
+ deleteInvalidJsonSchemaFields(context.jsonSchema);
340
+ deleteZodOpenApiMeta(context.jsonSchema);
341
+ validate(enrichedContext, ctx.opts, previousContext);
342
+ },
343
+ io: ctx.io,
344
+ unrepresentable: "any",
345
+ reused: ctx.opts.reused,
346
+ cycles: ctx.opts.cycles,
347
+ target: satisfiesVersion(ctx.openapiVersion ?? "3.1.0", "3.1.0") ? void 0 : "openapi-3.0",
348
+ uri: (id) => id === "__shared" ? `#ZOD_OPENAPI/${id}` : `#ZOD_OPENAPI/__shared#/${defsName}/${id}`
349
+ });
350
+ const components = jsonSchema.schemas.__shared?.[defsName] ?? {};
351
+ jsonSchema.schemas.__shared ??= { [defsName]: components };
352
+ const dynamicComponents = /* @__PURE__ */ new Map();
353
+ for (const [key, value] of Object.entries(components)) {
354
+ deleteInvalidJsonSchemaFields(value);
355
+ if (/^schema\d+$/.test(key)) {
356
+ const newName = `__schema${ctx.registry.components.schemas.dynamicSchemaCount++}`;
357
+ dynamicComponents.set(key, `"${refPath}${newName}"`);
358
+ if (newName !== key) {
359
+ components[newName] = value;
360
+ delete components[key];
361
+ }
362
+ }
363
+ }
364
+ for (const [key] of ctx.registry.components.schemas.manual) {
365
+ const manualComponent = jsonSchema.schemas[key];
366
+ if (!manualComponent) continue;
367
+ deleteInvalidJsonSchemaFields(manualComponent);
368
+ }
369
+ const manualUsed = {};
370
+ const parsedJsonSchema = JSON.parse(JSON.stringify(jsonSchema).replace(/"#ZOD_OPENAPI\/__shared#\/(?:\$defs|definitions)\/([^"]+)"/g, (_, match) => {
371
+ const dynamic = dynamicComponents.get(match);
372
+ if (dynamic) return dynamic;
373
+ if (ctx.registry.components.schemas.manual.get(match)) manualUsed[match] = true;
374
+ return `"${refPath}${match}"`;
375
+ }));
376
+ const parsedComponents = parsedJsonSchema.schemas.__shared?.[defsName] ?? {};
377
+ parsedJsonSchema.schemas.__shared ??= { [defsName]: parsedComponents };
378
+ for (const [key] of ctx.registry.components.schemas.manual) {
379
+ const manualComponent = parsedJsonSchema.schemas[key];
380
+ if (!manualComponent) continue;
381
+ if (manualUsed[key]) {
382
+ if (parsedComponents[key]) throw new Error(`Component "${key}" is already registered as a component in the registry`);
383
+ parsedComponents[key] = manualComponent;
384
+ }
385
+ }
386
+ const componentsToRename = renameComponents(parsedComponents, outputIds, ctx, refPath);
387
+ if (!componentsToRename.size) {
388
+ const parsedSchemas = parsedJsonSchema.schemas.zodOpenApiCreateSchema?.properties;
389
+ delete parsedJsonSchema.schemas.zodOpenApiCreateSchema;
390
+ delete parsedJsonSchema.schemas.__shared;
391
+ return {
392
+ schemas: parsedSchemas,
393
+ components: parsedComponents,
394
+ manual: parsedJsonSchema.schemas
395
+ };
396
+ }
397
+ const renamedJsonSchema = JSON.parse(JSON.stringify(parsedJsonSchema).replace(new RegExp(`"${refPath}([^"]+)"`, "g"), (_, match) => {
398
+ const replacement = componentsToRename.get(match);
399
+ if (replacement) return `"${refPath}${replacement}"`;
400
+ return `"${refPath}${match}"`;
401
+ }));
402
+ const renamedSchemas = renamedJsonSchema.schemas.zodOpenApiCreateSchema?.properties;
403
+ const renamedComponents = renamedJsonSchema.schemas.__shared?.[defsName] ?? {};
404
+ delete renamedJsonSchema.schemas.zodOpenApiCreateSchema;
405
+ delete renamedJsonSchema.schemas.__shared;
406
+ return {
407
+ schemas: renamedSchemas,
408
+ components: renamedComponents,
409
+ manual: renamedJsonSchema.schemas
410
+ };
411
+ };
412
+ const createRegistry = (components) => {
413
+ const registry$1 = {
414
+ components: {
415
+ schemas: {
416
+ dynamicSchemaCount: 0,
417
+ input: /* @__PURE__ */ new Map(),
418
+ output: /* @__PURE__ */ new Map(),
419
+ ids: /* @__PURE__ */ new Map(),
420
+ manual: /* @__PURE__ */ new Map()
421
+ },
422
+ headers: {
423
+ ids: /* @__PURE__ */ new Map(),
424
+ seen: /* @__PURE__ */ new WeakMap()
425
+ },
426
+ requestBodies: {
427
+ ids: /* @__PURE__ */ new Map(),
428
+ seen: /* @__PURE__ */ new WeakMap()
429
+ },
430
+ responses: {
431
+ ids: /* @__PURE__ */ new Map(),
432
+ seen: /* @__PURE__ */ new WeakMap()
433
+ },
434
+ parameters: {
435
+ ids: /* @__PURE__ */ new Map(),
436
+ seen: /* @__PURE__ */ new WeakMap()
437
+ },
438
+ callbacks: {
439
+ ids: /* @__PURE__ */ new Map(),
440
+ seen: /* @__PURE__ */ new WeakMap()
441
+ },
442
+ pathItems: {
443
+ ids: /* @__PURE__ */ new Map(),
444
+ seen: /* @__PURE__ */ new WeakMap()
445
+ },
446
+ securitySchemes: {
447
+ ids: /* @__PURE__ */ new Map(),
448
+ seen: /* @__PURE__ */ new WeakMap()
449
+ },
450
+ links: {
451
+ ids: /* @__PURE__ */ new Map(),
452
+ seen: /* @__PURE__ */ new WeakMap()
453
+ },
454
+ examples: {
455
+ ids: /* @__PURE__ */ new Map(),
456
+ seen: /* @__PURE__ */ new WeakMap()
457
+ }
458
+ },
459
+ addSchema: (schema, path, opts) => {
460
+ const schemaObject = {};
461
+ registry$1.components.schemas[opts.io].set(path.join(" > "), {
462
+ schemaObject,
463
+ zodType: schema,
464
+ source: {
465
+ path,
466
+ ...opts?.source
467
+ }
468
+ });
469
+ return schemaObject;
470
+ },
471
+ addParameter: (parameter, path, opts) => {
472
+ const seenParameter = registry$1.components.parameters.seen.get(parameter);
473
+ if (seenParameter) return seenParameter;
474
+ const meta = globalRegistry.get(parameter);
475
+ const name = opts?.location?.name ?? meta?.param?.name;
476
+ const inLocation = opts?.location?.in ?? meta?.param?.in;
477
+ if (opts?.location?.name && meta?.param?.name || opts?.location?.in && meta?.param?.in) throw new Error(`Parameter at ${path.join(" > ")} has both \`.meta({ param: { name, in } })\` and \`.meta({ param: { location: { in, name } } })\` information`);
478
+ if (!name || !inLocation) throw new Error(`Parameter at ${path.join(" > ")} is missing \`.meta({ param: { name, in } })\` information`);
479
+ const schemaObject = registry$1.addSchema(parameter, [
480
+ ...path,
481
+ inLocation,
482
+ name,
483
+ "schema"
484
+ ], {
485
+ io: "input",
486
+ source: {
487
+ type: "parameter",
488
+ location: {
489
+ in: inLocation,
490
+ name
491
+ }
492
+ }
493
+ });
494
+ const { id: metaId, examples, ...rest } = meta?.param ?? {};
495
+ const parameterObject = {
496
+ in: inLocation,
497
+ name,
498
+ schema: schemaObject,
499
+ ...rest
500
+ };
501
+ const examplesObject = createExamples(examples, registry$1, [
502
+ ...path,
503
+ inLocation,
504
+ name,
505
+ "examples"
506
+ ]);
507
+ if (examplesObject) parameterObject.examples = examplesObject;
508
+ if (isRequired(parameter, "input")) parameterObject.required = true;
509
+ if (!parameterObject.description && meta?.description) parameterObject.description = meta.description;
510
+ const id = metaId ?? opts?.manualId;
511
+ if (id) {
512
+ if (registry$1.components.parameters.ids.has(id)) throw new Error(`Schema "${id}" at ${path.join(" > ")} is already registered`);
513
+ const ref = { $ref: `#/components/parameters/${id}` };
514
+ registry$1.components.parameters.seen.set(parameter, ref);
515
+ registry$1.components.parameters.ids.set(id, parameterObject);
516
+ if (opts?.manualId) return parameterObject;
517
+ return ref;
518
+ }
519
+ if (opts?.location?.name || opts?.location?.in) return parameterObject;
520
+ registry$1.components.parameters.seen.set(parameter, parameterObject);
521
+ return parameterObject;
522
+ },
523
+ addHeader: (header, path, opts) => {
524
+ const seenHeader = registry$1.components.headers.seen.get(header);
525
+ if (seenHeader) return seenHeader;
526
+ const meta = globalRegistry.get(header);
527
+ const { id: metaId, ...rest } = meta?.header ?? {};
528
+ const id = metaId ?? opts?.manualId;
529
+ const headerObject = rest;
530
+ if (isRequired(header, "output")) headerObject.required = true;
531
+ if (!headerObject.description && meta?.description) headerObject.description = meta.description;
532
+ headerObject.schema = registry$1.addSchema(header, [...path, "schema"], {
533
+ io: "output",
534
+ source: { type: "header" }
535
+ });
536
+ if (id) {
537
+ if (registry$1.components.schemas.ids.has(id)) throw new Error(`Schema "${id}" at ${path.join(" > ")} is already registered`);
538
+ const ref = { $ref: `#/components/headers/${id}` };
539
+ registry$1.components.headers.ids.set(id, headerObject);
540
+ registry$1.components.headers.seen.set(header, ref);
541
+ if (opts?.manualId) return headerObject;
542
+ return ref;
543
+ }
544
+ registry$1.components.headers.seen.set(header, headerObject);
545
+ return headerObject;
546
+ },
547
+ addRequestBody: (requestBody, path, opts) => {
548
+ const seenRequestBody = registry$1.components.requestBodies.seen.get(requestBody);
549
+ if (seenRequestBody) return seenRequestBody;
550
+ const { content, id: metaId, ...rest } = requestBody;
551
+ const requestBodyObject = {
552
+ ...rest,
553
+ content: createContent(content, {
554
+ registry: registry$1,
555
+ io: "input"
556
+ }, [...path, "content"])
557
+ };
558
+ const id = metaId ?? opts?.manualId;
559
+ if (id) {
560
+ if (registry$1.components.requestBodies.ids.has(id)) throw new Error(`RequestBody "${id}" at ${path.join(" > ")} is already registered`);
561
+ const ref = { $ref: `#/components/requestBodies/${id}` };
562
+ registry$1.components.requestBodies.ids.set(id, requestBodyObject);
563
+ registry$1.components.requestBodies.seen.set(requestBody, ref);
564
+ if (opts?.manualId) return requestBodyObject;
565
+ return ref;
566
+ }
567
+ registry$1.components.requestBodies.seen.set(requestBody, requestBodyObject);
568
+ return requestBodyObject;
569
+ },
570
+ addPathItem: (pathItem, path, opts) => {
571
+ const seenPathItem = registry$1.components.pathItems.seen.get(pathItem);
572
+ if (seenPathItem) return seenPathItem;
573
+ const pathItemObject = {};
574
+ const { id: metaId, ...rest } = pathItem;
575
+ const id = metaId ?? opts?.manualId;
576
+ for (const [key, value] of Object.entries(rest)) {
577
+ if (isISpecificationExtension(key)) {
578
+ pathItemObject[key] = value;
579
+ continue;
580
+ }
581
+ if (key === "get" || key === "put" || key === "post" || key === "delete" || key === "options" || key === "head" || key === "patch" || key === "trace") {
582
+ pathItemObject[key] = createOperation(value, registry$1, [...path, key]);
583
+ continue;
584
+ }
585
+ if (key === "parameters") {
586
+ pathItemObject[key] = createManualParameters(value, registry$1, [...path, key]);
587
+ continue;
588
+ }
589
+ pathItemObject[key] = value;
590
+ }
591
+ if (id) {
592
+ if (registry$1.components.pathItems.ids.has(id)) throw new Error(`PathItem "${id}" at ${path.join(" > ")} is already registered`);
593
+ const ref = { $ref: `#/components/pathItems/${id}` };
594
+ registry$1.components.pathItems.ids.set(id, pathItemObject);
595
+ registry$1.components.pathItems.seen.set(pathItem, ref);
596
+ if (opts?.manualId) return pathItemObject;
597
+ return ref;
598
+ }
599
+ registry$1.components.pathItems.seen.set(pathItem, pathItemObject);
600
+ return pathItemObject;
601
+ },
602
+ addResponse: (response, path, opts) => {
603
+ const seenResponse = registry$1.components.responses.seen.get(response);
604
+ if (seenResponse) return seenResponse;
605
+ const { content, headers, links, id: metaId, ...rest } = response;
606
+ const responseObject = rest;
607
+ const maybeHeaders = createHeaders(headers, registry$1, [...path, "headers"]);
608
+ if (maybeHeaders) responseObject.headers = maybeHeaders;
609
+ if (content) responseObject.content = createContent(content, {
610
+ registry: registry$1,
611
+ io: "output"
612
+ }, [...path, "content"]);
613
+ if (links) responseObject.links = createLinks(links, registry$1, [...path, "links"]);
614
+ const id = metaId ?? opts?.manualId;
615
+ if (id) {
616
+ if (registry$1.components.responses.ids.has(id)) throw new Error(`Response "${id}" at ${path.join(" > ")} is already registered`);
617
+ const ref = { $ref: `#/components/responses/${id}` };
618
+ registry$1.components.responses.ids.set(id, responseObject);
619
+ registry$1.components.responses.seen.set(response, ref);
620
+ if (opts?.manualId) return responseObject;
621
+ return ref;
622
+ }
623
+ registry$1.components.responses.seen.set(response, responseObject);
624
+ return responseObject;
625
+ },
626
+ addCallback: (callback, path, opts) => {
627
+ const seenCallback = registry$1.components.callbacks.seen.get(callback);
628
+ if (seenCallback) return seenCallback;
629
+ const { id: metaId, ...rest } = callback;
630
+ const callbackObject = {};
631
+ for (const [name, pathItem] of Object.entries(rest)) {
632
+ if (isISpecificationExtension(name)) {
633
+ callbackObject[name] = pathItem;
634
+ continue;
635
+ }
636
+ callbackObject[name] = registry$1.addPathItem(pathItem, [...path, name]);
637
+ }
638
+ const id = metaId ?? opts?.manualId;
639
+ if (id) {
640
+ if (registry$1.components.callbacks.ids.has(id)) throw new Error(`Callback "${id}" at ${path.join(" > ")} is already registered`);
641
+ const ref = { $ref: `#/components/callbacks/${id}` };
642
+ registry$1.components.callbacks.ids.set(id, callbackObject);
643
+ registry$1.components.callbacks.seen.set(callback, ref);
644
+ if (opts?.manualId) return callbackObject;
645
+ return ref;
646
+ }
647
+ registry$1.components.callbacks.seen.set(callback, callbackObject);
648
+ return callbackObject;
649
+ },
650
+ addSecurityScheme: (securityScheme, path, opts) => {
651
+ const seenSecurityScheme = registry$1.components.securitySchemes.seen.get(securityScheme);
652
+ if (seenSecurityScheme) return seenSecurityScheme;
653
+ const { id: metaId, ...rest } = securityScheme;
654
+ const securitySchemeObject = rest;
655
+ const id = metaId ?? opts?.manualId;
656
+ if (id) {
657
+ if (registry$1.components.securitySchemes.ids.has(id)) throw new Error(`SecurityScheme "${id}" at ${path.join(" > ")} is already registered`);
658
+ const ref = { $ref: `#/components/securitySchemes/${id}` };
659
+ registry$1.components.securitySchemes.ids.set(id, securitySchemeObject);
660
+ registry$1.components.securitySchemes.seen.set(securityScheme, ref);
661
+ if (opts?.manualId) return securitySchemeObject;
662
+ return ref;
663
+ }
664
+ registry$1.components.securitySchemes.seen.set(securityScheme, securitySchemeObject);
665
+ return securitySchemeObject;
666
+ },
667
+ addLink: (link, path, opts) => {
668
+ const seenLink = registry$1.components.links.seen.get(link);
669
+ if (seenLink) return seenLink;
670
+ const { id: metaId, ...rest } = link;
671
+ const linkObject = rest;
672
+ const id = metaId ?? opts?.manualId;
673
+ if (id) {
674
+ if (registry$1.components.links.ids.has(id)) throw new Error(`Link "${id}" at ${path.join(" > ")} is already registered`);
675
+ const ref = { $ref: `#/components/links/${id}` };
676
+ registry$1.components.links.ids.set(id, linkObject);
677
+ registry$1.components.links.seen.set(link, ref);
678
+ if (opts?.manualId) return linkObject;
679
+ return ref;
680
+ }
681
+ registry$1.components.links.seen.set(link, linkObject);
682
+ return linkObject;
683
+ },
684
+ addExample: (example, path, opts) => {
685
+ const seenExample = registry$1.components.examples.seen.get(example);
686
+ if (seenExample) return seenExample;
687
+ const { id: metaId, ...rest } = example;
688
+ const exampleObject = rest;
689
+ const id = metaId ?? opts?.manualId;
690
+ if (id) {
691
+ if (registry$1.components.examples.ids.has(id)) throw new Error(`Example "${id}" at ${path.join(" > ")} is already registered`);
692
+ const ref = { $ref: `#/components/examples/${id}` };
693
+ registry$1.components.examples.ids.set(id, exampleObject);
694
+ registry$1.components.examples.seen.set(example, ref);
695
+ if (opts?.manualId) return exampleObject;
696
+ return ref;
697
+ }
698
+ registry$1.components.examples.seen.set(example, exampleObject);
699
+ return exampleObject;
700
+ }
701
+ };
702
+ registerSchemas(components?.schemas, registry$1);
703
+ registerParameters(components?.parameters, registry$1);
704
+ registerHeaders(components?.headers, registry$1);
705
+ registerResponses(components?.responses, registry$1);
706
+ registerPathItems(components?.pathItems, registry$1);
707
+ registerRequestBodies(components?.requestBodies, registry$1);
708
+ registerCallbacks(components?.callbacks, registry$1);
709
+ registerSecuritySchemes(components?.securitySchemes, registry$1);
710
+ registerLinks(components?.links, registry$1);
711
+ registerExamples(components?.examples, registry$1);
712
+ return registry$1;
713
+ };
714
+ const registerSchemas = (schemas, registry$1) => {
715
+ if (!schemas) return;
716
+ for (const [key, schema] of Object.entries(schemas)) {
717
+ if (isAnyZodType(schema)) {
718
+ const id = globalRegistry.get(schema)?.id ?? key;
719
+ registry$1.components.schemas.manual.set(id, {
720
+ input: { schemaObject: {} },
721
+ output: { schemaObject: {} },
722
+ zodType: schema
723
+ });
724
+ continue;
725
+ }
726
+ registry$1.components.schemas.ids.set(key, schema);
727
+ }
728
+ };
729
+ const registerParameters = (parameters, registry$1) => {
730
+ if (!parameters) return;
731
+ for (const [key, schema] of Object.entries(parameters)) {
732
+ if (isAnyZodType(schema)) {
733
+ const path = [
734
+ "components",
735
+ "parameters",
736
+ key
737
+ ];
738
+ registry$1.addParameter(schema, path, { manualId: key });
739
+ continue;
740
+ }
741
+ registry$1.components.parameters.ids.set(key, schema);
742
+ }
743
+ };
744
+ const registerHeaders = (headers, registry$1) => {
745
+ if (!headers) return;
746
+ for (const [key, schema] of Object.entries(headers)) {
747
+ if (isAnyZodType(schema)) {
748
+ const path = [
749
+ "components",
750
+ "headers",
751
+ key
752
+ ];
753
+ registry$1.addHeader(schema, path, { manualId: key });
754
+ continue;
755
+ }
756
+ registry$1.components.headers.ids.set(key, schema);
757
+ }
758
+ };
759
+ const registerResponses = (responses, registry$1) => {
760
+ if (!responses) return;
761
+ for (const [key, schema] of Object.entries(responses)) {
762
+ const responseObject = registry$1.addResponse(schema, [
763
+ "components",
764
+ "responses",
765
+ key
766
+ ], { manualId: key });
767
+ registry$1.components.responses.ids.set(key, responseObject);
768
+ registry$1.components.responses.seen.set(schema, responseObject);
769
+ }
770
+ };
771
+ const registerRequestBodies = (requestBodies, registry$1) => {
772
+ if (!requestBodies) return;
773
+ for (const [key, schema] of Object.entries(requestBodies)) {
774
+ if (isAnyZodType(schema)) {
775
+ registry$1.addRequestBody(schema, [
776
+ "components",
777
+ "requestBodies",
778
+ key
779
+ ], { manualId: key });
780
+ continue;
781
+ }
782
+ registry$1.components.requestBodies.ids.set(key, schema);
783
+ }
784
+ };
785
+ const registerCallbacks = (callbacks, registry$1) => {
786
+ if (!callbacks) return;
787
+ for (const [key, schema] of Object.entries(callbacks)) registry$1.addCallback(schema, [
788
+ "components",
789
+ "callbacks",
790
+ key
791
+ ], { manualId: key });
792
+ };
793
+ const registerPathItems = (pathItems, registry$1) => {
794
+ if (!pathItems) return;
795
+ for (const [key, schema] of Object.entries(pathItems)) registry$1.addPathItem(schema, [
796
+ "components",
797
+ "pathItems",
798
+ key
799
+ ], { manualId: key });
800
+ };
801
+ const registerSecuritySchemes = (securitySchemes, registry$1) => {
802
+ if (!securitySchemes) return;
803
+ for (const [key, schema] of Object.entries(securitySchemes)) registry$1.addSecurityScheme(schema, [
804
+ "components",
805
+ "securitySchemes",
806
+ key
807
+ ], { manualId: key });
808
+ };
809
+ const registerLinks = (links, registry$1) => {
810
+ if (!links) return;
811
+ for (const [key, schema] of Object.entries(links)) registry$1.addLink(schema, [
812
+ "components",
813
+ "links",
814
+ key
815
+ ], { manualId: key });
816
+ };
817
+ const registerExamples = (examples, registry$1) => {
818
+ if (!examples) return;
819
+ for (const [key, schema] of Object.entries(examples)) registry$1.components.examples.ids.set(key, schema);
820
+ };
821
+ const createIOSchemas = (ctx) => {
822
+ const { schemas, components, manual } = createSchemas(Object.fromEntries(ctx.registry.components.schemas[ctx.io]), ctx);
823
+ for (const [key, schema] of Object.entries(components)) ctx.registry.components.schemas.ids.set(key, schema);
824
+ for (const [key, schema] of Object.entries(schemas)) {
825
+ const ioSchema = ctx.registry.components.schemas[ctx.io].get(key);
826
+ if (ioSchema) Object.assign(ioSchema.schemaObject, schema);
827
+ }
828
+ for (const [key, value] of Object.entries(manual)) {
829
+ const manualSchema = ctx.registry.components.schemas.manual.get(key);
830
+ if (!manualSchema) continue;
831
+ if (components[key]) manualSchema[ctx.io].used = true;
832
+ Object.assign(manualSchema[ctx.io].schemaObject, value);
833
+ }
834
+ };
835
+ const createManualSchemas = (registry$1) => {
836
+ for (const [key, value] of registry$1.components.schemas.manual) if (!value.input.used) {
837
+ const schema = value[globalRegistry.get(value.zodType)?.unusedIO ?? "output"].schemaObject;
838
+ registry$1.components.schemas.ids.set(key, schema);
839
+ }
840
+ };
841
+ const createComponents = (registry$1, opts, openapiVersion) => {
842
+ createIOSchemas({
843
+ registry: registry$1,
844
+ io: "input",
845
+ opts,
846
+ openapiVersion
847
+ });
848
+ createIOSchemas({
849
+ registry: registry$1,
850
+ io: "output",
851
+ opts,
852
+ openapiVersion
853
+ });
854
+ createManualSchemas(registry$1);
855
+ const components = {};
856
+ if (registry$1.components.schemas.ids.size > 0) components.schemas = Object.fromEntries(registry$1.components.schemas.ids);
857
+ if (registry$1.components.headers.ids.size > 0) components.headers = Object.fromEntries(registry$1.components.headers.ids);
858
+ if (registry$1.components.requestBodies.ids.size > 0) components.requestBodies = Object.fromEntries(registry$1.components.requestBodies.ids);
859
+ if (registry$1.components.responses.ids.size > 0) components.responses = Object.fromEntries(registry$1.components.responses.ids);
860
+ if (registry$1.components.parameters.ids.size > 0) components.parameters = Object.fromEntries(registry$1.components.parameters.ids);
861
+ if (registry$1.components.callbacks.ids.size > 0) components.callbacks = Object.fromEntries(registry$1.components.callbacks.ids);
862
+ if (registry$1.components.pathItems.ids.size > 0) components.pathItems = Object.fromEntries(registry$1.components.pathItems.ids);
863
+ if (registry$1.components.securitySchemes.ids.size > 0) components.securitySchemes = Object.fromEntries(registry$1.components.securitySchemes.ids);
864
+ if (registry$1.components.links.ids.size > 0) components.links = Object.fromEntries(registry$1.components.links.ids);
865
+ if (registry$1.components.examples.ids.size > 0) components.examples = Object.fromEntries(registry$1.components.examples.ids);
866
+ return components;
867
+ };
868
+
869
+ //#endregion
870
+ //#region ../../node_modules/.pnpm/zod-openapi@5.4.6_zod@4.4.1/node_modules/zod-openapi/dist/index.mjs
871
+ const createDocument = (zodOpenApiObject, opts = {}) => {
872
+ const { paths, webhooks, components, ...rest } = zodOpenApiObject;
873
+ const document = rest;
874
+ const registry = createRegistry(components);
875
+ const createdPaths = createPaths(paths, registry, ["paths"]);
876
+ if (createdPaths) document.paths = createdPaths;
877
+ const createdWebhooks = createPaths(webhooks, registry, ["webhooks"]);
878
+ if (createdWebhooks) document.webhooks = createdWebhooks;
879
+ const createdComponents = createComponents(registry, opts, zodOpenApiObject.openapi);
880
+ if (Object.keys(createdComponents).length > 0) document.components = createdComponents;
881
+ return document;
882
+ };
883
+
884
+ //#endregion
885
+ //#region src/api/openapi/document.ts
886
+ /**
887
+ * OpenAPI 3.1 document generator.
888
+ *
889
+ * Builds the full OpenAPI spec from Zod schemas. The Zod schemas are the
890
+ * single source of truth -- we never hand-write OpenAPI YAML.
891
+ *
892
+ * Covers all public API domains.
893
+ */
894
+ const JSON_CONTENT = "application/json";
895
+ /** Standard error responses shared across all authenticated endpoints */
896
+ function standardErrors(...codes) {
897
+ const responses = {};
898
+ const errorMap = {
899
+ 400: "Bad Request",
900
+ 401: "Not authenticated",
901
+ 403: "Forbidden",
902
+ 404: "Not Found",
903
+ 409: "Conflict",
904
+ 500: "Internal Server Error"
905
+ };
906
+ for (const code of codes) responses[String(code)] = {
907
+ description: errorMap[code] ?? `Error ${code}`,
908
+ content: { [JSON_CONTENT]: { schema: apiErrorSchema } }
909
+ };
910
+ return responses;
911
+ }
912
+ /** Common auth error responses (401 + 403) */
913
+ const authErrors = standardErrors(401, 403);
914
+ const contentPaths = {
915
+ "/_emdash/api/content/{collection}": {
916
+ get: {
917
+ operationId: "listContent",
918
+ summary: "List content items",
919
+ description: "Returns a paginated list of content items in the specified collection.",
920
+ tags: ["Content"],
921
+ requestParams: {
922
+ path: z.object({ collection: z.string().meta({
923
+ description: "Collection slug",
924
+ example: "posts"
925
+ }) }),
926
+ query: contentListQuery
927
+ },
928
+ responses: {
929
+ "200": {
930
+ description: "Content list",
931
+ content: { [JSON_CONTENT]: { schema: successEnvelope(contentListResponseSchema) } }
932
+ },
933
+ ...authErrors,
934
+ ...standardErrors(500)
935
+ }
936
+ },
937
+ post: {
938
+ operationId: "createContent",
939
+ summary: "Create a content item",
940
+ tags: ["Content"],
941
+ requestParams: { path: z.object({ collection: z.string().meta({ description: "Collection slug" }) }) },
942
+ requestBody: { content: { [JSON_CONTENT]: { schema: contentCreateBody } } },
943
+ responses: {
944
+ "201": {
945
+ description: "Created content item",
946
+ content: { [JSON_CONTENT]: { schema: successEnvelope(contentResponseSchema) } }
947
+ },
948
+ ...authErrors,
949
+ ...standardErrors(400, 500)
950
+ }
951
+ }
952
+ },
953
+ "/_emdash/api/content/{collection}/{id}": {
954
+ get: {
955
+ operationId: "getContent",
956
+ summary: "Get a content item",
957
+ tags: ["Content"],
958
+ requestParams: {
959
+ path: z.object({
960
+ collection: z.string().meta({ description: "Collection slug" }),
961
+ id: z.string().meta({ description: "Content ID or slug" })
962
+ }),
963
+ query: z.object({ locale: z.string().optional().meta({ description: "Locale filter" }) })
964
+ },
965
+ responses: {
966
+ "200": {
967
+ description: "Content item",
968
+ content: { [JSON_CONTENT]: { schema: successEnvelope(contentResponseSchema) } }
969
+ },
970
+ ...authErrors,
971
+ ...standardErrors(404, 500)
972
+ }
973
+ },
974
+ put: {
975
+ operationId: "updateContent",
976
+ summary: "Update a content item",
977
+ tags: ["Content"],
978
+ requestParams: { path: z.object({
979
+ collection: z.string().meta({ description: "Collection slug" }),
980
+ id: z.string().meta({ description: "Content ID or slug" })
981
+ }) },
982
+ requestBody: { content: { [JSON_CONTENT]: { schema: contentUpdateBody } } },
983
+ responses: {
984
+ "200": {
985
+ description: "Updated content item",
986
+ content: { [JSON_CONTENT]: { schema: successEnvelope(contentResponseSchema) } }
987
+ },
988
+ ...authErrors,
989
+ ...standardErrors(400, 404, 409, 500)
990
+ }
991
+ },
992
+ delete: {
993
+ operationId: "deleteContent",
994
+ summary: "Delete a content item (soft delete)",
995
+ description: "Moves the content item to trash. Use the permanent delete endpoint to remove permanently.",
996
+ tags: ["Content"],
997
+ requestParams: { path: z.object({
998
+ collection: z.string().meta({ description: "Collection slug" }),
999
+ id: z.string().meta({ description: "Content ID or slug" })
1000
+ }) },
1001
+ responses: {
1002
+ "200": {
1003
+ description: "Deleted",
1004
+ content: { [JSON_CONTENT]: { schema: successEnvelope(deleteResponseSchema) } }
1005
+ },
1006
+ ...authErrors,
1007
+ ...standardErrors(404, 500)
1008
+ }
1009
+ }
1010
+ },
1011
+ "/_emdash/api/content/{collection}/{id}/publish": { post: {
1012
+ operationId: "publishContent",
1013
+ summary: "Publish a content item",
1014
+ tags: ["Content"],
1015
+ requestParams: { path: z.object({
1016
+ collection: z.string().meta({ description: "Collection slug" }),
1017
+ id: z.string().meta({ description: "Content ID or slug" })
1018
+ }) },
1019
+ responses: {
1020
+ "200": {
1021
+ description: "Published content item",
1022
+ content: { [JSON_CONTENT]: { schema: successEnvelope(contentResponseSchema) } }
1023
+ },
1024
+ ...authErrors,
1025
+ ...standardErrors(404, 500)
1026
+ }
1027
+ } },
1028
+ "/_emdash/api/content/{collection}/{id}/unpublish": { post: {
1029
+ operationId: "unpublishContent",
1030
+ summary: "Unpublish a content item",
1031
+ description: "Reverts content to draft status.",
1032
+ tags: ["Content"],
1033
+ requestParams: { path: z.object({
1034
+ collection: z.string().meta({ description: "Collection slug" }),
1035
+ id: z.string().meta({ description: "Content ID or slug" })
1036
+ }) },
1037
+ responses: {
1038
+ "200": {
1039
+ description: "Unpublished content item",
1040
+ content: { [JSON_CONTENT]: { schema: successEnvelope(contentResponseSchema) } }
1041
+ },
1042
+ ...authErrors,
1043
+ ...standardErrors(404, 500)
1044
+ }
1045
+ } },
1046
+ "/_emdash/api/content/{collection}/{id}/schedule": {
1047
+ post: {
1048
+ operationId: "scheduleContent",
1049
+ summary: "Schedule content for future publishing",
1050
+ tags: ["Content"],
1051
+ requestParams: { path: z.object({
1052
+ collection: z.string().meta({ description: "Collection slug" }),
1053
+ id: z.string().meta({ description: "Content ID or slug" })
1054
+ }) },
1055
+ requestBody: { content: { [JSON_CONTENT]: { schema: contentScheduleBody } } },
1056
+ responses: {
1057
+ "200": {
1058
+ description: "Scheduled content item",
1059
+ content: { [JSON_CONTENT]: { schema: successEnvelope(contentResponseSchema) } }
1060
+ },
1061
+ ...authErrors,
1062
+ ...standardErrors(400, 404, 500)
1063
+ }
1064
+ },
1065
+ delete: {
1066
+ operationId: "unscheduleContent",
1067
+ summary: "Cancel scheduled publishing",
1068
+ description: "Reverts a scheduled item to draft status.",
1069
+ tags: ["Content"],
1070
+ requestParams: { path: z.object({
1071
+ collection: z.string().meta({ description: "Collection slug" }),
1072
+ id: z.string().meta({ description: "Content ID or slug" })
1073
+ }) },
1074
+ responses: {
1075
+ "200": {
1076
+ description: "Unscheduled content item",
1077
+ content: { [JSON_CONTENT]: { schema: successEnvelope(contentResponseSchema) } }
1078
+ },
1079
+ ...authErrors,
1080
+ ...standardErrors(404, 500)
1081
+ }
1082
+ }
1083
+ },
1084
+ "/_emdash/api/content/{collection}/{id}/duplicate": { post: {
1085
+ operationId: "duplicateContent",
1086
+ summary: "Duplicate a content item",
1087
+ tags: ["Content"],
1088
+ requestParams: { path: z.object({
1089
+ collection: z.string().meta({ description: "Collection slug" }),
1090
+ id: z.string().meta({ description: "Content ID or slug" })
1091
+ }) },
1092
+ responses: {
1093
+ "201": {
1094
+ description: "Duplicated content item",
1095
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.object({ item: contentItemSchema })) } }
1096
+ },
1097
+ ...authErrors,
1098
+ ...standardErrors(404, 500)
1099
+ }
1100
+ } },
1101
+ "/_emdash/api/content/{collection}/{id}/restore": { post: {
1102
+ operationId: "restoreContent",
1103
+ summary: "Restore a content item from trash",
1104
+ tags: ["Content"],
1105
+ requestParams: { path: z.object({
1106
+ collection: z.string().meta({ description: "Collection slug" }),
1107
+ id: z.string().meta({ description: "Content ID" })
1108
+ }) },
1109
+ responses: {
1110
+ "200": {
1111
+ description: "Restored",
1112
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.object({ restored: z.literal(true) })) } }
1113
+ },
1114
+ ...authErrors,
1115
+ ...standardErrors(404, 500)
1116
+ }
1117
+ } },
1118
+ "/_emdash/api/content/{collection}/{id}/permanent": { delete: {
1119
+ operationId: "permanentDeleteContent",
1120
+ summary: "Permanently delete a content item",
1121
+ description: "Permanently removes a trashed content item. This cannot be undone.",
1122
+ tags: ["Content"],
1123
+ requestParams: { path: z.object({
1124
+ collection: z.string().meta({ description: "Collection slug" }),
1125
+ id: z.string().meta({ description: "Content ID" })
1126
+ }) },
1127
+ responses: {
1128
+ "200": {
1129
+ description: "Permanently deleted",
1130
+ content: { [JSON_CONTENT]: { schema: successEnvelope(deleteResponseSchema) } }
1131
+ },
1132
+ ...authErrors,
1133
+ ...standardErrors(404, 500)
1134
+ }
1135
+ } },
1136
+ "/_emdash/api/content/{collection}/{id}/compare": { get: {
1137
+ operationId: "compareContent",
1138
+ summary: "Compare live and draft revisions",
1139
+ tags: ["Content"],
1140
+ requestParams: { path: z.object({
1141
+ collection: z.string().meta({ description: "Collection slug" }),
1142
+ id: z.string().meta({ description: "Content ID or slug" })
1143
+ }) },
1144
+ responses: {
1145
+ "200": {
1146
+ description: "Comparison result",
1147
+ content: { [JSON_CONTENT]: { schema: successEnvelope(contentCompareResponseSchema) } }
1148
+ },
1149
+ ...authErrors,
1150
+ ...standardErrors(404, 500)
1151
+ }
1152
+ } },
1153
+ "/_emdash/api/content/{collection}/{id}/discard-draft": { post: {
1154
+ operationId: "discardDraft",
1155
+ summary: "Discard draft changes",
1156
+ description: "Reverts the content item to its live (published) version.",
1157
+ tags: ["Content"],
1158
+ requestParams: { path: z.object({
1159
+ collection: z.string().meta({ description: "Collection slug" }),
1160
+ id: z.string().meta({ description: "Content ID or slug" })
1161
+ }) },
1162
+ responses: {
1163
+ "200": {
1164
+ description: "Content item reverted to live version",
1165
+ content: { [JSON_CONTENT]: { schema: successEnvelope(contentResponseSchema) } }
1166
+ },
1167
+ ...authErrors,
1168
+ ...standardErrors(404, 500)
1169
+ }
1170
+ } },
1171
+ "/_emdash/api/content/{collection}/{id}/translations": { get: {
1172
+ operationId: "getContentTranslations",
1173
+ summary: "Get translations for a content item",
1174
+ tags: ["Content"],
1175
+ requestParams: { path: z.object({
1176
+ collection: z.string().meta({ description: "Collection slug" }),
1177
+ id: z.string().meta({ description: "Content ID or slug" })
1178
+ }) },
1179
+ responses: {
1180
+ "200": {
1181
+ description: "Translation group members",
1182
+ content: { [JSON_CONTENT]: { schema: successEnvelope(contentTranslationsResponseSchema) } }
1183
+ },
1184
+ ...authErrors,
1185
+ ...standardErrors(404, 500)
1186
+ }
1187
+ } },
1188
+ "/_emdash/api/content/{collection}/{id}/terms": { put: {
1189
+ operationId: "setContentTerms",
1190
+ summary: "Set taxonomy terms on a content item",
1191
+ tags: ["Content"],
1192
+ requestParams: { path: z.object({
1193
+ collection: z.string().meta({ description: "Collection slug" }),
1194
+ id: z.string().meta({ description: "Content ID or slug" })
1195
+ }) },
1196
+ requestBody: { content: { [JSON_CONTENT]: { schema: contentTermsBody } } },
1197
+ responses: {
1198
+ "200": {
1199
+ description: "Terms updated",
1200
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.object({ termIds: z.array(z.string()) })) } }
1201
+ },
1202
+ ...authErrors,
1203
+ ...standardErrors(400, 404, 500)
1204
+ }
1205
+ } },
1206
+ "/_emdash/api/content/{collection}/trash": { get: {
1207
+ operationId: "listTrashedContent",
1208
+ summary: "List trashed content items",
1209
+ tags: ["Content"],
1210
+ requestParams: {
1211
+ path: z.object({ collection: z.string().meta({ description: "Collection slug" }) }),
1212
+ query: contentTrashQuery
1213
+ },
1214
+ responses: {
1215
+ "200": {
1216
+ description: "Trashed content list",
1217
+ content: { [JSON_CONTENT]: { schema: successEnvelope(trashedContentListResponseSchema) } }
1218
+ },
1219
+ ...authErrors,
1220
+ ...standardErrors(500)
1221
+ }
1222
+ } }
1223
+ };
1224
+ function buildMediaPaths(maxUploadSize) {
1225
+ return {
1226
+ "/_emdash/api/media": { get: {
1227
+ operationId: "listMedia",
1228
+ summary: "List media items",
1229
+ tags: ["Media"],
1230
+ requestParams: { query: mediaListQuery },
1231
+ responses: {
1232
+ "200": {
1233
+ description: "Media list",
1234
+ content: { [JSON_CONTENT]: { schema: successEnvelope(mediaListResponseSchema) } }
1235
+ },
1236
+ ...authErrors,
1237
+ ...standardErrors(500)
1238
+ }
1239
+ } },
1240
+ "/_emdash/api/media/{id}": {
1241
+ get: {
1242
+ operationId: "getMedia",
1243
+ summary: "Get a media item",
1244
+ tags: ["Media"],
1245
+ requestParams: { path: z.object({ id: z.string().meta({ description: "Media ID" }) }) },
1246
+ responses: {
1247
+ "200": {
1248
+ description: "Media item",
1249
+ content: { [JSON_CONTENT]: { schema: successEnvelope(mediaResponseSchema) } }
1250
+ },
1251
+ ...authErrors,
1252
+ ...standardErrors(404, 500)
1253
+ }
1254
+ },
1255
+ put: {
1256
+ operationId: "updateMedia",
1257
+ summary: "Update media metadata",
1258
+ tags: ["Media"],
1259
+ requestParams: { path: z.object({ id: z.string().meta({ description: "Media ID" }) }) },
1260
+ requestBody: { content: { [JSON_CONTENT]: { schema: mediaUpdateBody } } },
1261
+ responses: {
1262
+ "200": {
1263
+ description: "Updated media item",
1264
+ content: { [JSON_CONTENT]: { schema: successEnvelope(mediaResponseSchema) } }
1265
+ },
1266
+ ...authErrors,
1267
+ ...standardErrors(400, 404, 500)
1268
+ }
1269
+ },
1270
+ delete: {
1271
+ operationId: "deleteMedia",
1272
+ summary: "Delete a media item",
1273
+ tags: ["Media"],
1274
+ requestParams: { path: z.object({ id: z.string().meta({ description: "Media ID" }) }) },
1275
+ responses: {
1276
+ "200": {
1277
+ description: "Deleted",
1278
+ content: { [JSON_CONTENT]: { schema: successEnvelope(deleteResponseSchema) } }
1279
+ },
1280
+ ...authErrors,
1281
+ ...standardErrors(404, 500)
1282
+ }
1283
+ }
1284
+ },
1285
+ "/_emdash/api/media/upload-url": { post: {
1286
+ operationId: "getMediaUploadUrl",
1287
+ summary: "Get a signed URL for direct upload",
1288
+ description: "Returns a signed URL for direct-to-storage upload. Creates a pending media record.",
1289
+ tags: ["Media"],
1290
+ requestBody: { content: { [JSON_CONTENT]: { schema: mediaUploadUrlBody(maxUploadSize) } } },
1291
+ responses: {
1292
+ "200": {
1293
+ description: "Upload URL or existing media (deduplication)",
1294
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.union([mediaUploadUrlResponseSchema, mediaExistingResponseSchema])) } }
1295
+ },
1296
+ ...authErrors,
1297
+ ...standardErrors(400, 500)
1298
+ }
1299
+ } },
1300
+ "/_emdash/api/media/{id}/confirm": { post: {
1301
+ operationId: "confirmMediaUpload",
1302
+ summary: "Confirm a media upload",
1303
+ description: "Marks a pending media record as ready after the file has been uploaded.",
1304
+ tags: ["Media"],
1305
+ requestParams: { path: z.object({ id: z.string().meta({ description: "Media ID" }) }) },
1306
+ requestBody: { content: { [JSON_CONTENT]: { schema: mediaConfirmBody } } },
1307
+ responses: {
1308
+ "200": {
1309
+ description: "Confirmed media item with URL",
1310
+ content: { [JSON_CONTENT]: { schema: successEnvelope(mediaConfirmResponseSchema) } }
1311
+ },
1312
+ ...authErrors,
1313
+ ...standardErrors(400, 404, 500)
1314
+ }
1315
+ } }
1316
+ };
1317
+ }
1318
+ const schemaPaths = {
1319
+ "/_emdash/api/schema/collections": {
1320
+ get: {
1321
+ operationId: "listCollections",
1322
+ summary: "List all collections",
1323
+ tags: ["Schema"],
1324
+ responses: {
1325
+ "200": {
1326
+ description: "Collection list",
1327
+ content: { [JSON_CONTENT]: { schema: successEnvelope(collectionListResponseSchema) } }
1328
+ },
1329
+ ...authErrors,
1330
+ ...standardErrors(500)
1331
+ }
1332
+ },
1333
+ post: {
1334
+ operationId: "createCollection",
1335
+ summary: "Create a collection",
1336
+ tags: ["Schema"],
1337
+ requestBody: { content: { [JSON_CONTENT]: { schema: createCollectionBody } } },
1338
+ responses: {
1339
+ "201": {
1340
+ description: "Created collection",
1341
+ content: { [JSON_CONTENT]: { schema: successEnvelope(collectionResponseSchema) } }
1342
+ },
1343
+ ...authErrors,
1344
+ ...standardErrors(400, 409, 500)
1345
+ }
1346
+ }
1347
+ },
1348
+ "/_emdash/api/schema/collections/{slug}": {
1349
+ get: {
1350
+ operationId: "getCollection",
1351
+ summary: "Get a collection",
1352
+ tags: ["Schema"],
1353
+ requestParams: {
1354
+ path: z.object({ slug: z.string().meta({ description: "Collection slug" }) }),
1355
+ query: collectionGetQuery
1356
+ },
1357
+ responses: {
1358
+ "200": {
1359
+ description: "Collection (optionally with fields)",
1360
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.union([collectionResponseSchema.shape.item, collectionWithFieldsResponseSchema.shape.item])) } }
1361
+ },
1362
+ ...authErrors,
1363
+ ...standardErrors(404, 500)
1364
+ }
1365
+ },
1366
+ put: {
1367
+ operationId: "updateCollection",
1368
+ summary: "Update a collection",
1369
+ tags: ["Schema"],
1370
+ requestParams: { path: z.object({ slug: z.string().meta({ description: "Collection slug" }) }) },
1371
+ requestBody: { content: { [JSON_CONTENT]: { schema: updateCollectionBody } } },
1372
+ responses: {
1373
+ "200": {
1374
+ description: "Updated collection",
1375
+ content: { [JSON_CONTENT]: { schema: successEnvelope(collectionResponseSchema) } }
1376
+ },
1377
+ ...authErrors,
1378
+ ...standardErrors(400, 404, 500)
1379
+ }
1380
+ },
1381
+ delete: {
1382
+ operationId: "deleteCollection",
1383
+ summary: "Delete a collection",
1384
+ tags: ["Schema"],
1385
+ requestParams: { path: z.object({ slug: z.string().meta({ description: "Collection slug" }) }) },
1386
+ responses: {
1387
+ "200": {
1388
+ description: "Deleted",
1389
+ content: { [JSON_CONTENT]: { schema: successEnvelope(deleteResponseSchema) } }
1390
+ },
1391
+ ...authErrors,
1392
+ ...standardErrors(404, 500)
1393
+ }
1394
+ }
1395
+ },
1396
+ "/_emdash/api/schema/collections/{slug}/fields": {
1397
+ get: {
1398
+ operationId: "listFields",
1399
+ summary: "List fields for a collection",
1400
+ tags: ["Schema"],
1401
+ requestParams: { path: z.object({ slug: z.string().meta({ description: "Collection slug" }) }) },
1402
+ responses: {
1403
+ "200": {
1404
+ description: "Field list",
1405
+ content: { [JSON_CONTENT]: { schema: successEnvelope(fieldListResponseSchema) } }
1406
+ },
1407
+ ...authErrors,
1408
+ ...standardErrors(404, 500)
1409
+ }
1410
+ },
1411
+ post: {
1412
+ operationId: "createField",
1413
+ summary: "Create a field",
1414
+ tags: ["Schema"],
1415
+ requestParams: { path: z.object({ slug: z.string().meta({ description: "Collection slug" }) }) },
1416
+ requestBody: { content: { [JSON_CONTENT]: { schema: createFieldBody } } },
1417
+ responses: {
1418
+ "201": {
1419
+ description: "Created field",
1420
+ content: { [JSON_CONTENT]: { schema: successEnvelope(fieldResponseSchema) } }
1421
+ },
1422
+ ...authErrors,
1423
+ ...standardErrors(400, 409, 500)
1424
+ }
1425
+ }
1426
+ },
1427
+ "/_emdash/api/schema/collections/{slug}/fields/{fieldSlug}": {
1428
+ get: {
1429
+ operationId: "getField",
1430
+ summary: "Get a field",
1431
+ tags: ["Schema"],
1432
+ requestParams: { path: z.object({
1433
+ slug: z.string().meta({ description: "Collection slug" }),
1434
+ fieldSlug: z.string().meta({ description: "Field slug" })
1435
+ }) },
1436
+ responses: {
1437
+ "200": {
1438
+ description: "Field",
1439
+ content: { [JSON_CONTENT]: { schema: successEnvelope(fieldResponseSchema) } }
1440
+ },
1441
+ ...authErrors,
1442
+ ...standardErrors(404, 500)
1443
+ }
1444
+ },
1445
+ put: {
1446
+ operationId: "updateField",
1447
+ summary: "Update a field",
1448
+ tags: ["Schema"],
1449
+ requestParams: { path: z.object({
1450
+ slug: z.string().meta({ description: "Collection slug" }),
1451
+ fieldSlug: z.string().meta({ description: "Field slug" })
1452
+ }) },
1453
+ requestBody: { content: { [JSON_CONTENT]: { schema: updateFieldBody } } },
1454
+ responses: {
1455
+ "200": {
1456
+ description: "Updated field",
1457
+ content: { [JSON_CONTENT]: { schema: successEnvelope(fieldResponseSchema) } }
1458
+ },
1459
+ ...authErrors,
1460
+ ...standardErrors(400, 404, 500)
1461
+ }
1462
+ },
1463
+ delete: {
1464
+ operationId: "deleteField",
1465
+ summary: "Delete a field",
1466
+ tags: ["Schema"],
1467
+ requestParams: { path: z.object({
1468
+ slug: z.string().meta({ description: "Collection slug" }),
1469
+ fieldSlug: z.string().meta({ description: "Field slug" })
1470
+ }) },
1471
+ responses: {
1472
+ "200": {
1473
+ description: "Deleted",
1474
+ content: { [JSON_CONTENT]: { schema: successEnvelope(deleteResponseSchema) } }
1475
+ },
1476
+ ...authErrors,
1477
+ ...standardErrors(404, 500)
1478
+ }
1479
+ }
1480
+ },
1481
+ "/_emdash/api/schema/collections/{slug}/fields/reorder": { post: {
1482
+ operationId: "reorderFields",
1483
+ summary: "Reorder fields in a collection",
1484
+ tags: ["Schema"],
1485
+ requestParams: { path: z.object({ slug: z.string().meta({ description: "Collection slug" }) }) },
1486
+ requestBody: { content: { [JSON_CONTENT]: { schema: fieldReorderBody } } },
1487
+ responses: {
1488
+ "200": {
1489
+ description: "Reordered",
1490
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.object({ success: z.literal(true) })) } }
1491
+ },
1492
+ ...authErrors,
1493
+ ...standardErrors(400, 404, 500)
1494
+ }
1495
+ } },
1496
+ "/_emdash/api/schema/orphans": { get: {
1497
+ operationId: "listOrphanedTables",
1498
+ summary: "List orphaned content tables",
1499
+ description: "Finds ec_* tables without matching collection definitions.",
1500
+ tags: ["Schema"],
1501
+ responses: {
1502
+ "200": {
1503
+ description: "Orphaned tables",
1504
+ content: { [JSON_CONTENT]: { schema: successEnvelope(orphanedTableListResponseSchema) } }
1505
+ },
1506
+ ...authErrors,
1507
+ ...standardErrors(500)
1508
+ }
1509
+ } },
1510
+ "/_emdash/api/schema/orphans/{slug}": { post: {
1511
+ operationId: "registerOrphanedTable",
1512
+ summary: "Register an orphaned table as a collection",
1513
+ tags: ["Schema"],
1514
+ requestParams: { path: z.object({ slug: z.string().meta({ description: "Table slug (without ec_ prefix)" }) }) },
1515
+ requestBody: { content: { [JSON_CONTENT]: { schema: orphanRegisterBody } } },
1516
+ responses: {
1517
+ "201": {
1518
+ description: "Registered collection",
1519
+ content: { [JSON_CONTENT]: { schema: successEnvelope(collectionResponseSchema) } }
1520
+ },
1521
+ ...authErrors,
1522
+ ...standardErrors(400, 404, 500)
1523
+ }
1524
+ } }
1525
+ };
1526
+ const commentsPaths = {
1527
+ "/_emdash/api/comments/{collection}/{contentId}": {
1528
+ get: {
1529
+ operationId: "listPublicComments",
1530
+ summary: "List approved comments for content",
1531
+ description: "Public endpoint. Returns approved comments with optional threading.",
1532
+ tags: ["Comments"],
1533
+ requestParams: {
1534
+ path: z.object({
1535
+ collection: z.string().meta({ description: "Collection slug" }),
1536
+ contentId: z.string().meta({ description: "Content ID" })
1537
+ }),
1538
+ query: z.object({
1539
+ limit: z.coerce.number().int().min(1).max(100).optional(),
1540
+ cursor: z.string().optional(),
1541
+ threaded: z.enum(["true", "false"]).transform((v) => v === "true").optional()
1542
+ })
1543
+ },
1544
+ responses: {
1545
+ "200": {
1546
+ description: "Comment list",
1547
+ content: { [JSON_CONTENT]: { schema: successEnvelope(publicCommentListResponseSchema) } }
1548
+ },
1549
+ ...standardErrors(500)
1550
+ }
1551
+ },
1552
+ post: {
1553
+ operationId: "createComment",
1554
+ summary: "Submit a new comment",
1555
+ description: "Public endpoint. Comment enters moderation queue.",
1556
+ tags: ["Comments"],
1557
+ requestParams: { path: z.object({
1558
+ collection: z.string().meta({ description: "Collection slug" }),
1559
+ contentId: z.string().meta({ description: "Content ID" })
1560
+ }) },
1561
+ requestBody: { content: { [JSON_CONTENT]: { schema: createCommentBody } } },
1562
+ responses: {
1563
+ "201": {
1564
+ description: "Comment created (pending moderation)",
1565
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.object({
1566
+ id: z.string(),
1567
+ status: z.string()
1568
+ })) } }
1569
+ },
1570
+ ...standardErrors(400, 429, 500)
1571
+ }
1572
+ }
1573
+ },
1574
+ "/_emdash/api/admin/comments": { get: {
1575
+ operationId: "listAdminComments",
1576
+ summary: "List comments for moderation",
1577
+ tags: ["Comments"],
1578
+ requestParams: { query: commentListQuery },
1579
+ responses: {
1580
+ "200": {
1581
+ description: "Comment moderation inbox",
1582
+ content: { [JSON_CONTENT]: { schema: successEnvelope(adminCommentListResponseSchema) } }
1583
+ },
1584
+ ...authErrors,
1585
+ ...standardErrors(500)
1586
+ }
1587
+ } },
1588
+ "/_emdash/api/admin/comments/counts": { get: {
1589
+ operationId: "getCommentCounts",
1590
+ summary: "Get comment status counts",
1591
+ tags: ["Comments"],
1592
+ responses: {
1593
+ "200": {
1594
+ description: "Counts by status",
1595
+ content: { [JSON_CONTENT]: { schema: successEnvelope(commentCountsResponseSchema) } }
1596
+ },
1597
+ ...authErrors,
1598
+ ...standardErrors(500)
1599
+ }
1600
+ } },
1601
+ "/_emdash/api/admin/comments/bulk": { post: {
1602
+ operationId: "bulkCommentAction",
1603
+ summary: "Bulk approve, spam, trash, or delete comments",
1604
+ tags: ["Comments"],
1605
+ requestBody: { content: { [JSON_CONTENT]: { schema: commentBulkBody } } },
1606
+ responses: {
1607
+ "200": {
1608
+ description: "Bulk action result",
1609
+ content: { [JSON_CONTENT]: { schema: successEnvelope(commentBulkResponseSchema) } }
1610
+ },
1611
+ ...authErrors,
1612
+ ...standardErrors(400, 500)
1613
+ }
1614
+ } },
1615
+ "/_emdash/api/admin/comments/{id}": {
1616
+ get: {
1617
+ operationId: "getComment",
1618
+ summary: "Get a single comment",
1619
+ tags: ["Comments"],
1620
+ requestParams: { path: z.object({ id: z.string().meta({ description: "Comment ID" }) }) },
1621
+ responses: {
1622
+ "200": {
1623
+ description: "Comment",
1624
+ content: { [JSON_CONTENT]: { schema: successEnvelope(commentSchema) } }
1625
+ },
1626
+ ...authErrors,
1627
+ ...standardErrors(404, 500)
1628
+ }
1629
+ },
1630
+ delete: {
1631
+ operationId: "deleteComment",
1632
+ summary: "Permanently delete a comment",
1633
+ tags: ["Comments"],
1634
+ requestParams: { path: z.object({ id: z.string().meta({ description: "Comment ID" }) }) },
1635
+ responses: {
1636
+ "200": {
1637
+ description: "Deleted",
1638
+ content: { [JSON_CONTENT]: { schema: successEnvelope(deleteResponseSchema) } }
1639
+ },
1640
+ ...authErrors,
1641
+ ...standardErrors(404, 500)
1642
+ }
1643
+ }
1644
+ },
1645
+ "/_emdash/api/admin/comments/{id}/status": { put: {
1646
+ operationId: "updateCommentStatus",
1647
+ summary: "Change comment status",
1648
+ tags: ["Comments"],
1649
+ requestParams: { path: z.object({ id: z.string().meta({ description: "Comment ID" }) }) },
1650
+ requestBody: { content: { [JSON_CONTENT]: { schema: commentStatusBody } } },
1651
+ responses: {
1652
+ "200": {
1653
+ description: "Updated comment",
1654
+ content: { [JSON_CONTENT]: { schema: successEnvelope(commentSchema) } }
1655
+ },
1656
+ ...authErrors,
1657
+ ...standardErrors(400, 404, 500)
1658
+ }
1659
+ } }
1660
+ };
1661
+ const taxonomyPaths = {
1662
+ "/_emdash/api/taxonomies": { get: {
1663
+ operationId: "listTaxonomies",
1664
+ summary: "List all taxonomy definitions",
1665
+ tags: ["Taxonomies"],
1666
+ responses: {
1667
+ "200": {
1668
+ description: "Taxonomy list",
1669
+ content: { [JSON_CONTENT]: { schema: successEnvelope(taxonomyListResponseSchema) } }
1670
+ },
1671
+ ...authErrors,
1672
+ ...standardErrors(500)
1673
+ }
1674
+ } },
1675
+ "/_emdash/api/taxonomies/{name}/terms": {
1676
+ get: {
1677
+ operationId: "listTerms",
1678
+ summary: "List terms for a taxonomy",
1679
+ description: "Returns a tree for hierarchical taxonomies, flat list otherwise.",
1680
+ tags: ["Taxonomies"],
1681
+ requestParams: { path: z.object({ name: z.string().meta({ description: "Taxonomy name" }) }) },
1682
+ responses: {
1683
+ "200": {
1684
+ description: "Term list",
1685
+ content: { [JSON_CONTENT]: { schema: successEnvelope(termListResponseSchema) } }
1686
+ },
1687
+ ...authErrors,
1688
+ ...standardErrors(404, 500)
1689
+ }
1690
+ },
1691
+ post: {
1692
+ operationId: "createTerm",
1693
+ summary: "Create a term",
1694
+ tags: ["Taxonomies"],
1695
+ requestParams: { path: z.object({ name: z.string().meta({ description: "Taxonomy name" }) }) },
1696
+ requestBody: { content: { [JSON_CONTENT]: { schema: createTermBody } } },
1697
+ responses: {
1698
+ "201": {
1699
+ description: "Created term",
1700
+ content: { [JSON_CONTENT]: { schema: successEnvelope(termResponseSchema) } }
1701
+ },
1702
+ ...authErrors,
1703
+ ...standardErrors(400, 409, 500)
1704
+ }
1705
+ }
1706
+ },
1707
+ "/_emdash/api/taxonomies/{name}/terms/{slug}": {
1708
+ get: {
1709
+ operationId: "getTerm",
1710
+ summary: "Get a term by slug",
1711
+ tags: ["Taxonomies"],
1712
+ requestParams: { path: z.object({
1713
+ name: z.string().meta({ description: "Taxonomy name" }),
1714
+ slug: z.string().meta({ description: "Term slug" })
1715
+ }) },
1716
+ responses: {
1717
+ "200": {
1718
+ description: "Term with children and count",
1719
+ content: { [JSON_CONTENT]: { schema: successEnvelope(termGetResponseSchema) } }
1720
+ },
1721
+ ...authErrors,
1722
+ ...standardErrors(404, 500)
1723
+ }
1724
+ },
1725
+ put: {
1726
+ operationId: "updateTerm",
1727
+ summary: "Update a term",
1728
+ tags: ["Taxonomies"],
1729
+ requestParams: { path: z.object({
1730
+ name: z.string().meta({ description: "Taxonomy name" }),
1731
+ slug: z.string().meta({ description: "Term slug" })
1732
+ }) },
1733
+ requestBody: { content: { [JSON_CONTENT]: { schema: updateTermBody } } },
1734
+ responses: {
1735
+ "200": {
1736
+ description: "Updated term",
1737
+ content: { [JSON_CONTENT]: { schema: successEnvelope(termResponseSchema) } }
1738
+ },
1739
+ ...authErrors,
1740
+ ...standardErrors(400, 404, 409, 500)
1741
+ }
1742
+ },
1743
+ delete: {
1744
+ operationId: "deleteTerm",
1745
+ summary: "Delete a term",
1746
+ tags: ["Taxonomies"],
1747
+ requestParams: { path: z.object({
1748
+ name: z.string().meta({ description: "Taxonomy name" }),
1749
+ slug: z.string().meta({ description: "Term slug" })
1750
+ }) },
1751
+ responses: {
1752
+ "200": {
1753
+ description: "Deleted",
1754
+ content: { [JSON_CONTENT]: { schema: successEnvelope(deleteResponseSchema) } }
1755
+ },
1756
+ ...authErrors,
1757
+ ...standardErrors(400, 404, 500)
1758
+ }
1759
+ }
1760
+ }
1761
+ };
1762
+ const menuPaths = {
1763
+ "/_emdash/api/menus": {
1764
+ get: {
1765
+ operationId: "listMenus",
1766
+ summary: "List all menus with item counts",
1767
+ tags: ["Menus"],
1768
+ responses: {
1769
+ "200": {
1770
+ description: "Menu list",
1771
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.array(menuListItemSchema)) } }
1772
+ },
1773
+ ...authErrors,
1774
+ ...standardErrors(500)
1775
+ }
1776
+ },
1777
+ post: {
1778
+ operationId: "createMenu",
1779
+ summary: "Create a menu",
1780
+ tags: ["Menus"],
1781
+ requestBody: { content: { [JSON_CONTENT]: { schema: createMenuBody } } },
1782
+ responses: {
1783
+ "201": {
1784
+ description: "Created menu",
1785
+ content: { [JSON_CONTENT]: { schema: successEnvelope(menuWithItemsSchema) } }
1786
+ },
1787
+ ...authErrors,
1788
+ ...standardErrors(400, 409, 500)
1789
+ }
1790
+ }
1791
+ },
1792
+ "/_emdash/api/menus/{name}": {
1793
+ get: {
1794
+ operationId: "getMenu",
1795
+ summary: "Get a menu with all items",
1796
+ tags: ["Menus"],
1797
+ requestParams: { path: z.object({ name: z.string().meta({ description: "Menu name" }) }) },
1798
+ responses: {
1799
+ "200": {
1800
+ description: "Menu with items",
1801
+ content: { [JSON_CONTENT]: { schema: successEnvelope(menuWithItemsSchema) } }
1802
+ },
1803
+ ...authErrors,
1804
+ ...standardErrors(404, 500)
1805
+ }
1806
+ },
1807
+ put: {
1808
+ operationId: "updateMenu",
1809
+ summary: "Update a menu",
1810
+ tags: ["Menus"],
1811
+ requestParams: { path: z.object({ name: z.string().meta({ description: "Menu name" }) }) },
1812
+ requestBody: { content: { [JSON_CONTENT]: { schema: updateMenuBody } } },
1813
+ responses: {
1814
+ "200": {
1815
+ description: "Updated menu",
1816
+ content: { [JSON_CONTENT]: { schema: successEnvelope(menuWithItemsSchema) } }
1817
+ },
1818
+ ...authErrors,
1819
+ ...standardErrors(404, 500)
1820
+ }
1821
+ },
1822
+ delete: {
1823
+ operationId: "deleteMenu",
1824
+ summary: "Delete a menu and its items",
1825
+ tags: ["Menus"],
1826
+ requestParams: { path: z.object({ name: z.string().meta({ description: "Menu name" }) }) },
1827
+ responses: {
1828
+ "200": {
1829
+ description: "Deleted",
1830
+ content: { [JSON_CONTENT]: { schema: successEnvelope(deleteResponseSchema) } }
1831
+ },
1832
+ ...authErrors,
1833
+ ...standardErrors(404, 500)
1834
+ }
1835
+ }
1836
+ },
1837
+ "/_emdash/api/menus/{name}/items": { post: {
1838
+ operationId: "createMenuItem",
1839
+ summary: "Add an item to a menu",
1840
+ tags: ["Menus"],
1841
+ requestParams: { path: z.object({ name: z.string().meta({ description: "Menu name" }) }) },
1842
+ requestBody: { content: { [JSON_CONTENT]: { schema: createMenuItemBody } } },
1843
+ responses: {
1844
+ "201": {
1845
+ description: "Created menu item",
1846
+ content: { [JSON_CONTENT]: { schema: successEnvelope(menuItemSchema) } }
1847
+ },
1848
+ ...authErrors,
1849
+ ...standardErrors(400, 404, 500)
1850
+ }
1851
+ } },
1852
+ "/_emdash/api/menus/{name}/items/{id}": {
1853
+ put: {
1854
+ operationId: "updateMenuItem",
1855
+ summary: "Update a menu item",
1856
+ tags: ["Menus"],
1857
+ requestParams: { path: z.object({
1858
+ name: z.string().meta({ description: "Menu name" }),
1859
+ id: z.string().meta({ description: "Menu item id" })
1860
+ }) },
1861
+ requestBody: { content: { [JSON_CONTENT]: { schema: updateMenuItemBody } } },
1862
+ responses: {
1863
+ "200": {
1864
+ description: "Updated menu item",
1865
+ content: { [JSON_CONTENT]: { schema: successEnvelope(menuItemSchema) } }
1866
+ },
1867
+ ...authErrors,
1868
+ ...standardErrors(400, 404, 500)
1869
+ }
1870
+ },
1871
+ delete: {
1872
+ operationId: "deleteMenuItem",
1873
+ summary: "Delete a menu item",
1874
+ tags: ["Menus"],
1875
+ requestParams: { path: z.object({
1876
+ name: z.string().meta({ description: "Menu name" }),
1877
+ id: z.string().meta({ description: "Menu item id" })
1878
+ }) },
1879
+ responses: {
1880
+ "200": {
1881
+ description: "Deleted",
1882
+ content: { [JSON_CONTENT]: { schema: successEnvelope(deleteResponseSchema) } }
1883
+ },
1884
+ ...authErrors,
1885
+ ...standardErrors(404, 500)
1886
+ }
1887
+ }
1888
+ },
1889
+ "/_emdash/api/menus/{name}/reorder": { post: {
1890
+ operationId: "reorderMenuItems",
1891
+ summary: "Batch reorder menu items",
1892
+ tags: ["Menus"],
1893
+ requestParams: { path: z.object({ name: z.string().meta({ description: "Menu name" }) }) },
1894
+ requestBody: { content: { [JSON_CONTENT]: { schema: reorderMenuItemsBody } } },
1895
+ responses: {
1896
+ "200": {
1897
+ description: "Reordered items",
1898
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.array(menuItemSchema)) } }
1899
+ },
1900
+ ...authErrors,
1901
+ ...standardErrors(400, 404, 500)
1902
+ }
1903
+ } }
1904
+ };
1905
+ const sectionPaths = {
1906
+ "/_emdash/api/sections": {
1907
+ get: {
1908
+ operationId: "listSections",
1909
+ summary: "List sections",
1910
+ tags: ["Sections"],
1911
+ requestParams: { query: sectionsListQuery },
1912
+ responses: {
1913
+ "200": {
1914
+ description: "Section list",
1915
+ content: { [JSON_CONTENT]: { schema: successEnvelope(sectionListResponseSchema) } }
1916
+ },
1917
+ ...authErrors,
1918
+ ...standardErrors(500)
1919
+ }
1920
+ },
1921
+ post: {
1922
+ operationId: "createSection",
1923
+ summary: "Create a section",
1924
+ tags: ["Sections"],
1925
+ requestBody: { content: { [JSON_CONTENT]: { schema: createSectionBody } } },
1926
+ responses: {
1927
+ "201": {
1928
+ description: "Created section",
1929
+ content: { [JSON_CONTENT]: { schema: successEnvelope(sectionSchema) } }
1930
+ },
1931
+ ...authErrors,
1932
+ ...standardErrors(400, 409, 500)
1933
+ }
1934
+ }
1935
+ },
1936
+ "/_emdash/api/sections/{slug}": {
1937
+ get: {
1938
+ operationId: "getSection",
1939
+ summary: "Get a section by slug",
1940
+ tags: ["Sections"],
1941
+ requestParams: { path: z.object({ slug: z.string().meta({ description: "Section slug" }) }) },
1942
+ responses: {
1943
+ "200": {
1944
+ description: "Section",
1945
+ content: { [JSON_CONTENT]: { schema: successEnvelope(sectionSchema) } }
1946
+ },
1947
+ ...authErrors,
1948
+ ...standardErrors(404, 500)
1949
+ }
1950
+ },
1951
+ put: {
1952
+ operationId: "updateSection",
1953
+ summary: "Update a section",
1954
+ tags: ["Sections"],
1955
+ requestParams: { path: z.object({ slug: z.string().meta({ description: "Section slug" }) }) },
1956
+ requestBody: { content: { [JSON_CONTENT]: { schema: updateSectionBody } } },
1957
+ responses: {
1958
+ "200": {
1959
+ description: "Updated section",
1960
+ content: { [JSON_CONTENT]: { schema: successEnvelope(sectionSchema) } }
1961
+ },
1962
+ ...authErrors,
1963
+ ...standardErrors(400, 404, 409, 500)
1964
+ }
1965
+ },
1966
+ delete: {
1967
+ operationId: "deleteSection",
1968
+ summary: "Delete a section",
1969
+ tags: ["Sections"],
1970
+ requestParams: { path: z.object({ slug: z.string().meta({ description: "Section slug" }) }) },
1971
+ responses: {
1972
+ "200": {
1973
+ description: "Deleted",
1974
+ content: { [JSON_CONTENT]: { schema: successEnvelope(deleteResponseSchema) } }
1975
+ },
1976
+ ...authErrors,
1977
+ ...standardErrors(403, 404, 500)
1978
+ }
1979
+ }
1980
+ }
1981
+ };
1982
+ const widgetPaths = {
1983
+ "/_emdash/api/widget-areas": {
1984
+ get: {
1985
+ operationId: "listWidgetAreas",
1986
+ summary: "List all widget areas",
1987
+ tags: ["Widgets"],
1988
+ responses: {
1989
+ "200": {
1990
+ description: "Widget area list",
1991
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.object({ items: z.array(widgetAreaWithWidgetsAndCountSchema) })) } }
1992
+ },
1993
+ ...authErrors,
1994
+ ...standardErrors(500)
1995
+ }
1996
+ },
1997
+ post: {
1998
+ operationId: "createWidgetArea",
1999
+ summary: "Create a widget area",
2000
+ tags: ["Widgets"],
2001
+ requestBody: { content: { [JSON_CONTENT]: { schema: createWidgetAreaBody } } },
2002
+ responses: {
2003
+ "201": {
2004
+ description: "Created widget area",
2005
+ content: { [JSON_CONTENT]: { schema: successEnvelope(widgetAreaSchema) } }
2006
+ },
2007
+ ...authErrors,
2008
+ ...standardErrors(400, 409, 500)
2009
+ }
2010
+ }
2011
+ },
2012
+ "/_emdash/api/widget-areas/{name}": {
2013
+ get: {
2014
+ operationId: "getWidgetArea",
2015
+ summary: "Get a widget area with widgets",
2016
+ tags: ["Widgets"],
2017
+ requestParams: { path: z.object({ name: z.string().meta({ description: "Widget area name" }) }) },
2018
+ responses: {
2019
+ "200": {
2020
+ description: "Widget area with widgets",
2021
+ content: { [JSON_CONTENT]: { schema: successEnvelope(widgetAreaWithWidgetsSchema) } }
2022
+ },
2023
+ ...authErrors,
2024
+ ...standardErrors(404, 500)
2025
+ }
2026
+ },
2027
+ delete: {
2028
+ operationId: "deleteWidgetArea",
2029
+ summary: "Delete a widget area and its widgets",
2030
+ tags: ["Widgets"],
2031
+ requestParams: { path: z.object({ name: z.string().meta({ description: "Widget area name" }) }) },
2032
+ responses: {
2033
+ "200": {
2034
+ description: "Deleted",
2035
+ content: { [JSON_CONTENT]: { schema: successEnvelope(deleteResponseSchema) } }
2036
+ },
2037
+ ...authErrors,
2038
+ ...standardErrors(404, 500)
2039
+ }
2040
+ }
2041
+ },
2042
+ "/_emdash/api/widget-areas/{name}/widgets": { post: {
2043
+ operationId: "createWidget",
2044
+ summary: "Add a widget to an area",
2045
+ tags: ["Widgets"],
2046
+ requestParams: { path: z.object({ name: z.string().meta({ description: "Widget area name" }) }) },
2047
+ requestBody: { content: { [JSON_CONTENT]: { schema: createWidgetBody } } },
2048
+ responses: {
2049
+ "201": {
2050
+ description: "Created widget",
2051
+ content: { [JSON_CONTENT]: { schema: successEnvelope(widgetSchema) } }
2052
+ },
2053
+ ...authErrors,
2054
+ ...standardErrors(400, 404, 500)
2055
+ }
2056
+ } },
2057
+ "/_emdash/api/widget-areas/{name}/widgets/{id}": {
2058
+ put: {
2059
+ operationId: "updateWidget",
2060
+ summary: "Update a widget",
2061
+ tags: ["Widgets"],
2062
+ requestParams: { path: z.object({
2063
+ name: z.string().meta({ description: "Widget area name" }),
2064
+ id: z.string().meta({ description: "Widget ID" })
2065
+ }) },
2066
+ requestBody: { content: { [JSON_CONTENT]: { schema: updateWidgetBody } } },
2067
+ responses: {
2068
+ "200": {
2069
+ description: "Updated widget",
2070
+ content: { [JSON_CONTENT]: { schema: successEnvelope(widgetSchema) } }
2071
+ },
2072
+ ...authErrors,
2073
+ ...standardErrors(400, 404, 500)
2074
+ }
2075
+ },
2076
+ delete: {
2077
+ operationId: "deleteWidget",
2078
+ summary: "Delete a widget",
2079
+ tags: ["Widgets"],
2080
+ requestParams: { path: z.object({
2081
+ name: z.string().meta({ description: "Widget area name" }),
2082
+ id: z.string().meta({ description: "Widget ID" })
2083
+ }) },
2084
+ responses: {
2085
+ "200": {
2086
+ description: "Deleted",
2087
+ content: { [JSON_CONTENT]: { schema: successEnvelope(deleteResponseSchema) } }
2088
+ },
2089
+ ...authErrors,
2090
+ ...standardErrors(404, 500)
2091
+ }
2092
+ }
2093
+ },
2094
+ "/_emdash/api/widget-areas/{name}/reorder": { post: {
2095
+ operationId: "reorderWidgets",
2096
+ summary: "Reorder widgets in an area",
2097
+ tags: ["Widgets"],
2098
+ requestParams: { path: z.object({ name: z.string().meta({ description: "Widget area name" }) }) },
2099
+ requestBody: { content: { [JSON_CONTENT]: { schema: reorderWidgetsBody } } },
2100
+ responses: {
2101
+ "200": {
2102
+ description: "Reordered",
2103
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.object({ success: z.literal(true) })) } }
2104
+ },
2105
+ ...authErrors,
2106
+ ...standardErrors(400, 404, 500)
2107
+ }
2108
+ } }
2109
+ };
2110
+ const settingsPaths = { "/_emdash/api/settings": {
2111
+ get: {
2112
+ operationId: "getSettings",
2113
+ summary: "Get site settings",
2114
+ tags: ["Settings"],
2115
+ responses: {
2116
+ "200": {
2117
+ description: "Site settings",
2118
+ content: { [JSON_CONTENT]: { schema: successEnvelope(siteSettingsSchema) } }
2119
+ },
2120
+ ...authErrors,
2121
+ ...standardErrors(500)
2122
+ }
2123
+ },
2124
+ put: {
2125
+ operationId: "updateSettings",
2126
+ summary: "Update site settings",
2127
+ tags: ["Settings"],
2128
+ requestBody: { content: { [JSON_CONTENT]: { schema: settingsUpdateBody } } },
2129
+ responses: {
2130
+ "200": {
2131
+ description: "Updated settings",
2132
+ content: { [JSON_CONTENT]: { schema: successEnvelope(siteSettingsSchema) } }
2133
+ },
2134
+ ...authErrors,
2135
+ ...standardErrors(400, 500)
2136
+ }
2137
+ }
2138
+ } };
2139
+ const searchPaths = {
2140
+ "/_emdash/api/search": { get: {
2141
+ operationId: "search",
2142
+ summary: "Full-text search across collections",
2143
+ tags: ["Search"],
2144
+ requestParams: { query: searchQuery },
2145
+ responses: {
2146
+ "200": {
2147
+ description: "Search results",
2148
+ content: { [JSON_CONTENT]: { schema: successEnvelope(searchResponseSchema) } }
2149
+ },
2150
+ ...authErrors,
2151
+ ...standardErrors(500)
2152
+ }
2153
+ } },
2154
+ "/_emdash/api/search/suggest": { get: {
2155
+ operationId: "searchSuggest",
2156
+ summary: "Autocomplete search suggestions",
2157
+ tags: ["Search"],
2158
+ requestParams: { query: searchSuggestQuery },
2159
+ responses: {
2160
+ "200": {
2161
+ description: "Search suggestions",
2162
+ content: { [JSON_CONTENT]: { schema: successEnvelope(searchResponseSchema) } }
2163
+ },
2164
+ ...authErrors,
2165
+ ...standardErrors(500)
2166
+ }
2167
+ } },
2168
+ "/_emdash/api/search/rebuild": { post: {
2169
+ operationId: "rebuildSearchIndex",
2170
+ summary: "Rebuild the search index for a collection",
2171
+ tags: ["Search"],
2172
+ requestBody: { content: { [JSON_CONTENT]: { schema: searchRebuildBody } } },
2173
+ responses: {
2174
+ "200": {
2175
+ description: "Rebuild started",
2176
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.object({
2177
+ collection: z.string(),
2178
+ indexed: z.number().int()
2179
+ })) } }
2180
+ },
2181
+ ...authErrors,
2182
+ ...standardErrors(400, 500)
2183
+ }
2184
+ } },
2185
+ "/_emdash/api/search/enable": { post: {
2186
+ operationId: "enableSearch",
2187
+ summary: "Enable or disable search for a collection",
2188
+ tags: ["Search"],
2189
+ requestBody: { content: { [JSON_CONTENT]: { schema: searchEnableBody } } },
2190
+ responses: {
2191
+ "200": {
2192
+ description: "Search config updated",
2193
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.object({
2194
+ collection: z.string(),
2195
+ enabled: z.boolean()
2196
+ })) } }
2197
+ },
2198
+ ...authErrors,
2199
+ ...standardErrors(400, 500)
2200
+ }
2201
+ } },
2202
+ "/_emdash/api/search/stats": { get: {
2203
+ operationId: "getSearchStats",
2204
+ summary: "Get search index statistics",
2205
+ tags: ["Search"],
2206
+ responses: {
2207
+ "200": {
2208
+ description: "Search stats per collection",
2209
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.object({ collections: z.array(z.object({
2210
+ collection: z.string(),
2211
+ enabled: z.boolean(),
2212
+ indexed: z.number().int()
2213
+ })) })) } }
2214
+ },
2215
+ ...authErrors,
2216
+ ...standardErrors(500)
2217
+ }
2218
+ } }
2219
+ };
2220
+ const redirectPaths = {
2221
+ "/_emdash/api/redirects": {
2222
+ get: {
2223
+ operationId: "listRedirects",
2224
+ summary: "List redirects",
2225
+ tags: ["Redirects"],
2226
+ requestParams: { query: redirectsListQuery },
2227
+ responses: {
2228
+ "200": {
2229
+ description: "Redirect list",
2230
+ content: { [JSON_CONTENT]: { schema: successEnvelope(redirectListResponseSchema) } }
2231
+ },
2232
+ ...authErrors,
2233
+ ...standardErrors(500)
2234
+ }
2235
+ },
2236
+ post: {
2237
+ operationId: "createRedirect",
2238
+ summary: "Create a redirect rule",
2239
+ tags: ["Redirects"],
2240
+ requestBody: { content: { [JSON_CONTENT]: { schema: createRedirectBody } } },
2241
+ responses: {
2242
+ "201": {
2243
+ description: "Created redirect",
2244
+ content: { [JSON_CONTENT]: { schema: successEnvelope(redirectSchema) } }
2245
+ },
2246
+ ...authErrors,
2247
+ ...standardErrors(400, 409, 500)
2248
+ }
2249
+ }
2250
+ },
2251
+ "/_emdash/api/redirects/{id}": {
2252
+ get: {
2253
+ operationId: "getRedirect",
2254
+ summary: "Get a redirect",
2255
+ tags: ["Redirects"],
2256
+ requestParams: { path: z.object({ id: z.string().meta({ description: "Redirect ID" }) }) },
2257
+ responses: {
2258
+ "200": {
2259
+ description: "Redirect",
2260
+ content: { [JSON_CONTENT]: { schema: successEnvelope(redirectSchema) } }
2261
+ },
2262
+ ...authErrors,
2263
+ ...standardErrors(404, 500)
2264
+ }
2265
+ },
2266
+ put: {
2267
+ operationId: "updateRedirect",
2268
+ summary: "Update a redirect",
2269
+ tags: ["Redirects"],
2270
+ requestParams: { path: z.object({ id: z.string().meta({ description: "Redirect ID" }) }) },
2271
+ requestBody: { content: { [JSON_CONTENT]: { schema: updateRedirectBody } } },
2272
+ responses: {
2273
+ "200": {
2274
+ description: "Updated redirect",
2275
+ content: { [JSON_CONTENT]: { schema: successEnvelope(redirectSchema) } }
2276
+ },
2277
+ ...authErrors,
2278
+ ...standardErrors(400, 404, 409, 500)
2279
+ }
2280
+ },
2281
+ delete: {
2282
+ operationId: "deleteRedirect",
2283
+ summary: "Delete a redirect",
2284
+ tags: ["Redirects"],
2285
+ requestParams: { path: z.object({ id: z.string().meta({ description: "Redirect ID" }) }) },
2286
+ responses: {
2287
+ "200": {
2288
+ description: "Deleted",
2289
+ content: { [JSON_CONTENT]: { schema: successEnvelope(deleteResponseSchema) } }
2290
+ },
2291
+ ...authErrors,
2292
+ ...standardErrors(404, 500)
2293
+ }
2294
+ }
2295
+ },
2296
+ "/_emdash/api/redirects/404s": {
2297
+ get: {
2298
+ operationId: "listNotFoundEntries",
2299
+ summary: "List 404 log entries",
2300
+ tags: ["Redirects"],
2301
+ requestParams: { query: notFoundListQuery },
2302
+ responses: {
2303
+ "200": {
2304
+ description: "404 log entries",
2305
+ content: { [JSON_CONTENT]: { schema: successEnvelope(notFoundListResponseSchema) } }
2306
+ },
2307
+ ...authErrors,
2308
+ ...standardErrors(500)
2309
+ }
2310
+ },
2311
+ delete: {
2312
+ operationId: "clearNotFoundLog",
2313
+ summary: "Clear all 404 log entries",
2314
+ tags: ["Redirects"],
2315
+ responses: {
2316
+ "200": {
2317
+ description: "Cleared",
2318
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.object({ deleted: z.number().int() })) } }
2319
+ },
2320
+ ...authErrors,
2321
+ ...standardErrors(500)
2322
+ }
2323
+ },
2324
+ post: {
2325
+ operationId: "pruneNotFoundLog",
2326
+ summary: "Prune old 404 log entries",
2327
+ tags: ["Redirects"],
2328
+ requestBody: { content: { [JSON_CONTENT]: { schema: notFoundPruneBody } } },
2329
+ responses: {
2330
+ "200": {
2331
+ description: "Pruned",
2332
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.object({ deleted: z.number().int() })) } }
2333
+ },
2334
+ ...authErrors,
2335
+ ...standardErrors(400, 500)
2336
+ }
2337
+ }
2338
+ },
2339
+ "/_emdash/api/redirects/404s/summary": { get: {
2340
+ operationId: "getNotFoundSummary",
2341
+ summary: "Get 404 summary grouped by path",
2342
+ tags: ["Redirects"],
2343
+ responses: {
2344
+ "200": {
2345
+ description: "404 summary",
2346
+ content: { [JSON_CONTENT]: { schema: successEnvelope(notFoundSummaryResponseSchema) } }
2347
+ },
2348
+ ...authErrors,
2349
+ ...standardErrors(500)
2350
+ }
2351
+ } }
2352
+ };
2353
+ const userPaths = {
2354
+ "/_emdash/api/admin/users": { get: {
2355
+ operationId: "listUsers",
2356
+ summary: "List users",
2357
+ tags: ["Users"],
2358
+ requestParams: { query: usersListQuery },
2359
+ responses: {
2360
+ "200": {
2361
+ description: "User list",
2362
+ content: { [JSON_CONTENT]: { schema: successEnvelope(userListResponseSchema) } }
2363
+ },
2364
+ ...authErrors,
2365
+ ...standardErrors(500)
2366
+ }
2367
+ } },
2368
+ "/_emdash/api/admin/users/{id}": {
2369
+ get: {
2370
+ operationId: "getUser",
2371
+ summary: "Get user details",
2372
+ tags: ["Users"],
2373
+ requestParams: { path: z.object({ id: z.string().meta({ description: "User ID" }) }) },
2374
+ responses: {
2375
+ "200": {
2376
+ description: "User detail",
2377
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.object({ item: userDetailSchema })) } }
2378
+ },
2379
+ ...authErrors,
2380
+ ...standardErrors(404, 500)
2381
+ }
2382
+ },
2383
+ put: {
2384
+ operationId: "updateUser",
2385
+ summary: "Update a user",
2386
+ tags: ["Users"],
2387
+ requestParams: { path: z.object({ id: z.string().meta({ description: "User ID" }) }) },
2388
+ requestBody: { content: { [JSON_CONTENT]: { schema: userUpdateBody } } },
2389
+ responses: {
2390
+ "200": {
2391
+ description: "Updated user",
2392
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.object({ item: userSchema })) } }
2393
+ },
2394
+ ...authErrors,
2395
+ ...standardErrors(400, 404, 409, 500)
2396
+ }
2397
+ }
2398
+ },
2399
+ "/_emdash/api/admin/users/{id}/disable": { post: {
2400
+ operationId: "disableUser",
2401
+ summary: "Disable a user account",
2402
+ tags: ["Users"],
2403
+ requestParams: { path: z.object({ id: z.string().meta({ description: "User ID" }) }) },
2404
+ responses: {
2405
+ "200": {
2406
+ description: "User disabled",
2407
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.object({ item: userSchema })) } }
2408
+ },
2409
+ ...authErrors,
2410
+ ...standardErrors(400, 404, 500)
2411
+ }
2412
+ } },
2413
+ "/_emdash/api/admin/users/{id}/enable": { post: {
2414
+ operationId: "enableUser",
2415
+ summary: "Enable a user account",
2416
+ tags: ["Users"],
2417
+ requestParams: { path: z.object({ id: z.string().meta({ description: "User ID" }) }) },
2418
+ responses: {
2419
+ "200": {
2420
+ description: "User enabled",
2421
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.object({ item: userSchema })) } }
2422
+ },
2423
+ ...authErrors,
2424
+ ...standardErrors(404, 500)
2425
+ }
2426
+ } },
2427
+ "/_emdash/api/admin/allowed-domains": {
2428
+ get: {
2429
+ operationId: "listAllowedDomains",
2430
+ summary: "List allowed email domains",
2431
+ tags: ["Users"],
2432
+ responses: {
2433
+ "200": {
2434
+ description: "Allowed domains list",
2435
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.object({ items: z.array(z.object({
2436
+ domain: z.string(),
2437
+ defaultRole: z.number().int(),
2438
+ enabled: z.boolean(),
2439
+ createdAt: z.string()
2440
+ })) })) } }
2441
+ },
2442
+ ...authErrors,
2443
+ ...standardErrors(500)
2444
+ }
2445
+ },
2446
+ post: {
2447
+ operationId: "createAllowedDomain",
2448
+ summary: "Add an allowed email domain",
2449
+ tags: ["Users"],
2450
+ requestBody: { content: { [JSON_CONTENT]: { schema: allowedDomainCreateBody } } },
2451
+ responses: {
2452
+ "201": {
2453
+ description: "Created",
2454
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.object({
2455
+ domain: z.string(),
2456
+ defaultRole: z.number().int(),
2457
+ enabled: z.boolean()
2458
+ })) } }
2459
+ },
2460
+ ...authErrors,
2461
+ ...standardErrors(400, 409, 500)
2462
+ }
2463
+ }
2464
+ },
2465
+ "/_emdash/api/admin/allowed-domains/{domain}": {
2466
+ put: {
2467
+ operationId: "updateAllowedDomain",
2468
+ summary: "Update an allowed domain",
2469
+ tags: ["Users"],
2470
+ requestParams: { path: z.object({ domain: z.string().meta({ description: "Domain name" }) }) },
2471
+ requestBody: { content: { [JSON_CONTENT]: { schema: allowedDomainUpdateBody } } },
2472
+ responses: {
2473
+ "200": {
2474
+ description: "Updated",
2475
+ content: { [JSON_CONTENT]: { schema: successEnvelope(z.object({
2476
+ domain: z.string(),
2477
+ defaultRole: z.number().int(),
2478
+ enabled: z.boolean()
2479
+ })) } }
2480
+ },
2481
+ ...authErrors,
2482
+ ...standardErrors(404, 500)
2483
+ }
2484
+ },
2485
+ delete: {
2486
+ operationId: "deleteAllowedDomain",
2487
+ summary: "Remove an allowed domain",
2488
+ tags: ["Users"],
2489
+ requestParams: { path: z.object({ domain: z.string().meta({ description: "Domain name" }) }) },
2490
+ responses: {
2491
+ "200": {
2492
+ description: "Deleted",
2493
+ content: { [JSON_CONTENT]: { schema: successEnvelope(deleteResponseSchema) } }
2494
+ },
2495
+ ...authErrors,
2496
+ ...standardErrors(404, 500)
2497
+ }
2498
+ }
2499
+ }
2500
+ };
2501
+ function buildAllPaths(maxUploadSize) {
2502
+ return {
2503
+ ...contentPaths,
2504
+ ...buildMediaPaths(maxUploadSize),
2505
+ ...schemaPaths,
2506
+ ...commentsPaths,
2507
+ ...taxonomyPaths,
2508
+ ...menuPaths,
2509
+ ...sectionPaths,
2510
+ ...widgetPaths,
2511
+ ...settingsPaths,
2512
+ ...searchPaths,
2513
+ ...redirectPaths,
2514
+ ...userPaths
2515
+ };
2516
+ }
2517
+ /**
2518
+ * Generate the OpenAPI 3.1 document for the EmDash CMS API.
2519
+ *
2520
+ * Covers: Content, Media, Schema, Comments, Taxonomies, Menus,
2521
+ * Sections, Widgets, Settings, Search, Redirects, Users.
2522
+ */
2523
+ function generateOpenApiDocument(options = {}) {
2524
+ return createDocument({
2525
+ openapi: "3.1.0",
2526
+ info: {
2527
+ title: "EmDash CMS API",
2528
+ version: "0.1.0",
2529
+ description: "REST API for the EmDash CMS. All endpoints require authentication and return responses wrapped in a `{ data }` envelope."
2530
+ },
2531
+ servers: [{
2532
+ url: "{baseUrl}",
2533
+ description: "CMS instance",
2534
+ variables: { baseUrl: { default: "http://localhost:4321" } }
2535
+ }],
2536
+ tags: [
2537
+ {
2538
+ name: "Content",
2539
+ description: "CRUD operations for content items across collections"
2540
+ },
2541
+ {
2542
+ name: "Media",
2543
+ description: "Media library — upload, manage, and serve files"
2544
+ },
2545
+ {
2546
+ name: "Schema",
2547
+ description: "Collection and field management"
2548
+ },
2549
+ {
2550
+ name: "Comments",
2551
+ description: "Public comments and admin moderation"
2552
+ },
2553
+ {
2554
+ name: "Taxonomies",
2555
+ description: "Taxonomy definitions and terms"
2556
+ },
2557
+ {
2558
+ name: "Menus",
2559
+ description: "Navigation menu management"
2560
+ },
2561
+ {
2562
+ name: "Sections",
2563
+ description: "Reusable content sections"
2564
+ },
2565
+ {
2566
+ name: "Widgets",
2567
+ description: "Widget areas and widget management"
2568
+ },
2569
+ {
2570
+ name: "Settings",
2571
+ description: "Site-wide settings"
2572
+ },
2573
+ {
2574
+ name: "Search",
2575
+ description: "Full-text search and index management"
2576
+ },
2577
+ {
2578
+ name: "Redirects",
2579
+ description: "Redirect rules and 404 logging"
2580
+ },
2581
+ {
2582
+ name: "Users",
2583
+ description: "User management and access control"
2584
+ }
2585
+ ],
2586
+ components: { securitySchemes: {
2587
+ session: {
2588
+ type: "apiKey",
2589
+ in: "cookie",
2590
+ name: "emdash_session",
2591
+ description: "Session cookie set by the auth endpoints"
2592
+ },
2593
+ bearer: {
2594
+ type: "http",
2595
+ scheme: "bearer",
2596
+ description: "OAuth2 or API token"
2597
+ }
2598
+ } },
2599
+ security: [{ session: [] }, { bearer: [] }],
2600
+ paths: buildAllPaths(options.maxUploadSize ?? DEFAULT_MAX_UPLOAD_SIZE)
2601
+ });
2602
+ }
2603
+
2604
+ //#endregion
2605
+ //#region src/astro/routes/api/openapi.json.ts
2606
+ const prerender = false;
2607
+ const OPENAPI_CACHE_KEY = Symbol.for("emdash.openapi.cachedSpec");
2608
+ function getCachedSpec() {
2609
+ const val = globalThis[OPENAPI_CACHE_KEY];
2610
+ return typeof val === "string" ? val : null;
2611
+ }
2612
+ function setCachedSpec(spec) {
2613
+ globalThis[OPENAPI_CACHE_KEY] = spec;
2614
+ }
2615
+ const GET = async ({ locals }) => {
2616
+ const { emdash } = locals;
2617
+ let spec = getCachedSpec();
2618
+ if (!spec && emdash) try {
2619
+ const doc = generateOpenApiDocument({ maxUploadSize: emdash.config.maxUploadSize });
2620
+ spec = JSON.stringify(doc);
2621
+ setCachedSpec(spec);
2622
+ } catch (error) {
2623
+ return handleError(error, "Failed to generate OpenAPI document", "OPENAPI_ERROR");
2624
+ }
2625
+ if (!spec) try {
2626
+ spec = JSON.stringify(generateOpenApiDocument());
2627
+ } catch (error) {
2628
+ return handleError(error, "Failed to generate OpenAPI document", "OPENAPI_ERROR");
2629
+ }
2630
+ return new Response(spec, {
2631
+ status: 200,
2632
+ headers: {
2633
+ "Content-Type": "application/json",
2634
+ "Cache-Control": "private, no-store",
2635
+ "Access-Control-Allow-Origin": "*"
2636
+ }
2637
+ });
2638
+ };
2639
+
2640
+ //#endregion
2641
+ export { GET, prerender };
2642
+ //# sourceMappingURL=openapi.json.mjs.map