emdash 0.29.0 → 0.30.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 (839) hide show
  1. package/dist/{adapters-DPAkL6QF.d.mts → adapters-C0ONzkUP.d.mts} +10 -1
  2. package/dist/adapters-C0ONzkUP.d.mts.map +1 -0
  3. package/dist/{allowed-origins-FXB-FplB.mjs → allowed-origins-CCEi9bPI.mjs} +2 -2
  4. package/dist/{allowed-origins-FXB-FplB.mjs.map → allowed-origins-CCEi9bPI.mjs.map} +1 -1
  5. package/dist/api/route-utils.d.mts +3 -3
  6. package/dist/api/route-utils.d.mts.map +1 -1
  7. package/dist/api/route-utils.mjs +19 -19
  8. package/dist/api/schemas/index.d.mts +2 -2
  9. package/dist/api/schemas/index.mjs +5 -4
  10. package/dist/{api-DVbHNApo.mjs → api-b8WIiGU4.mjs} +253 -153
  11. package/dist/api-b8WIiGU4.mjs.map +1 -0
  12. package/dist/api-tokens-Cvmixds7.mjs +3 -0
  13. package/dist/{api-tokens-UYBkl17d.mjs → api-tokens-uPt8UDpx.mjs} +2 -2
  14. package/dist/{api-tokens-UYBkl17d.mjs.map → api-tokens-uPt8UDpx.mjs.map} +1 -1
  15. package/dist/{apply-D23iUV4q.mjs → apply-CmIJK9j8.mjs} +34 -37
  16. package/dist/apply-CmIJK9j8.mjs.map +1 -0
  17. package/dist/astro/index.d.mts +12 -13
  18. package/dist/astro/index.d.mts.map +1 -1
  19. package/dist/astro/index.mjs +90 -11
  20. package/dist/astro/index.mjs.map +1 -1
  21. package/dist/astro/middleware/auth.d.mts +10 -11
  22. package/dist/astro/middleware/auth.d.mts.map +1 -1
  23. package/dist/astro/middleware/auth.mjs +56 -107
  24. package/dist/astro/middleware/auth.mjs.map +1 -1
  25. package/dist/astro/middleware/redirect.mjs +7 -7
  26. package/dist/astro/middleware/request-context.mjs +4 -4
  27. package/dist/astro/middleware/request-context.mjs.map +1 -1
  28. package/dist/astro/middleware/setup.mjs +1 -1
  29. package/dist/astro/middleware.d.mts +47 -3
  30. package/dist/astro/middleware.d.mts.map +1 -1
  31. package/dist/astro/middleware.mjs +326 -110
  32. package/dist/astro/middleware.mjs.map +1 -1
  33. package/dist/astro/routes/PluginRegistry.d.mts +5 -1
  34. package/dist/astro/routes/PluginRegistry.d.mts.map +1 -1
  35. package/dist/astro/routes/PluginRegistry.mjs +2 -1
  36. package/dist/astro/routes/PluginRegistry.mjs.map +1 -1
  37. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +9 -8
  38. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs.map +1 -1
  39. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +9 -8
  40. package/dist/astro/routes/api/admin/allowed-domains/index.mjs.map +1 -1
  41. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +5 -5
  42. package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
  43. package/dist/astro/routes/api/admin/api-tokens/index.mjs.map +1 -1
  44. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +5 -5
  45. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +10 -9
  46. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs.map +1 -1
  47. package/dist/astro/routes/api/admin/byline-fields/index.mjs +10 -9
  48. package/dist/astro/routes/api/admin/byline-fields/index.mjs.map +1 -1
  49. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +10 -9
  50. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs.map +1 -1
  51. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +15 -14
  52. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
  53. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +16 -21
  54. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
  55. package/dist/astro/routes/api/admin/bylines/index.mjs +15 -14
  56. package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
  57. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +13 -12
  58. package/dist/astro/routes/api/admin/comments/_id_/status.mjs.map +1 -1
  59. package/dist/astro/routes/api/admin/comments/_id_.mjs +6 -6
  60. package/dist/astro/routes/api/admin/comments/bulk.mjs +11 -10
  61. package/dist/astro/routes/api/admin/comments/bulk.mjs.map +1 -1
  62. package/dist/astro/routes/api/admin/comments/counts.mjs +6 -6
  63. package/dist/astro/routes/api/admin/comments/index.mjs +11 -10
  64. package/dist/astro/routes/api/admin/comments/index.mjs.map +1 -1
  65. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +5 -5
  66. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +4 -4
  67. package/dist/astro/routes/api/admin/media-usage/repair.mjs +12 -10
  68. package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
  69. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +5 -5
  70. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +5 -5
  71. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +40 -39
  72. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
  73. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +40 -39
  74. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
  75. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +45 -39
  76. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  77. package/dist/astro/routes/api/admin/plugins/_id_/mcp.d.mts +8 -0
  78. package/dist/astro/routes/api/admin/plugins/_id_/mcp.d.mts.map +1 -0
  79. package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +39 -0
  80. package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs.map +1 -0
  81. package/dist/astro/routes/api/admin/plugins/_id_/settings.d.mts +9 -0
  82. package/dist/astro/routes/api/admin/plugins/_id_/settings.d.mts.map +1 -0
  83. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +78 -0
  84. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -0
  85. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +39 -38
  86. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  87. package/dist/astro/routes/api/admin/plugins/_id_/update.d.mts.map +1 -1
  88. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +42 -39
  89. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  90. package/dist/astro/routes/api/admin/plugins/index.mjs +45 -39
  91. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  92. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +4 -4
  93. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +39 -38
  94. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  95. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.d.mts.map +1 -1
  96. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +45 -40
  97. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
  98. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +39 -38
  99. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
  100. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +39 -38
  101. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
  102. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.d.mts.map +1 -1
  103. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +43 -40
  104. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
  105. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +39 -38
  106. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
  107. package/dist/astro/routes/api/admin/plugins/registry/install.d.mts.map +1 -1
  108. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +44 -41
  109. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  110. package/dist/astro/routes/api/admin/plugins/updates.mjs +40 -39
  111. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  112. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +39 -38
  113. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  114. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +4 -4
  115. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +39 -38
  116. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  117. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +4 -4
  118. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +4 -4
  119. package/dist/astro/routes/api/admin/users/_id_/index.mjs +9 -8
  120. package/dist/astro/routes/api/admin/users/_id_/index.mjs.map +1 -1
  121. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +5 -5
  122. package/dist/astro/routes/api/admin/users/index.mjs +9 -8
  123. package/dist/astro/routes/api/admin/users/index.mjs.map +1 -1
  124. package/dist/astro/routes/api/auth/dev-bypass.mjs +7 -7
  125. package/dist/astro/routes/api/auth/invite/accept.mjs +4 -4
  126. package/dist/astro/routes/api/auth/invite/complete.mjs +13 -12
  127. package/dist/astro/routes/api/auth/invite/complete.mjs.map +1 -1
  128. package/dist/astro/routes/api/auth/invite/index.mjs +10 -9
  129. package/dist/astro/routes/api/auth/invite/index.mjs.map +1 -1
  130. package/dist/astro/routes/api/auth/invite/register-options.mjs +12 -11
  131. package/dist/astro/routes/api/auth/invite/register-options.mjs.map +1 -1
  132. package/dist/astro/routes/api/auth/logout.mjs +4 -4
  133. package/dist/astro/routes/api/auth/magic-link/send.mjs +12 -11
  134. package/dist/astro/routes/api/auth/magic-link/send.mjs.map +1 -1
  135. package/dist/astro/routes/api/auth/magic-link/verify.mjs +5 -5
  136. package/dist/astro/routes/api/auth/me.mjs +9 -8
  137. package/dist/astro/routes/api/auth/me.mjs.map +1 -1
  138. package/dist/astro/routes/api/auth/mode.d.mts.map +1 -1
  139. package/dist/astro/routes/api/auth/mode.mjs +6 -3
  140. package/dist/astro/routes/api/auth/mode.mjs.map +1 -1
  141. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +15 -5
  142. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs.map +1 -1
  143. package/dist/astro/routes/api/auth/oauth/_provider_.d.mts.map +1 -1
  144. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +11 -5
  145. package/dist/astro/routes/api/auth/oauth/_provider_.mjs.map +1 -1
  146. package/dist/astro/routes/api/auth/passkey/_id_.mjs +8 -7
  147. package/dist/astro/routes/api/auth/passkey/_id_.mjs.map +1 -1
  148. package/dist/astro/routes/api/auth/passkey/index.mjs +3 -3
  149. package/dist/astro/routes/api/auth/passkey/options.mjs +13 -12
  150. package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -1
  151. package/dist/astro/routes/api/auth/passkey/register/options.mjs +11 -10
  152. package/dist/astro/routes/api/auth/passkey/register/options.mjs.map +1 -1
  153. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +12 -11
  154. package/dist/astro/routes/api/auth/passkey/register/verify.mjs.map +1 -1
  155. package/dist/astro/routes/api/auth/passkey/verify.mjs +12 -11
  156. package/dist/astro/routes/api/auth/passkey/verify.mjs.map +1 -1
  157. package/dist/astro/routes/api/auth/signup/complete.mjs +13 -12
  158. package/dist/astro/routes/api/auth/signup/complete.mjs.map +1 -1
  159. package/dist/astro/routes/api/auth/signup/request.mjs +12 -11
  160. package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -1
  161. package/dist/astro/routes/api/auth/signup/verify.mjs +4 -4
  162. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +14 -13
  163. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs.map +1 -1
  164. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +13 -12
  165. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs.map +1 -1
  166. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +5 -5
  167. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs.map +1 -1
  168. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +5 -4
  169. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
  170. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +6 -5
  171. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs.map +1 -1
  172. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +5 -5
  173. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs.map +1 -1
  174. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +13 -12
  175. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs.map +1 -1
  176. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +10 -8
  177. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
  178. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts.map +1 -1
  179. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +20 -19
  180. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
  181. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +18 -17
  182. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
  183. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +5 -4
  184. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs.map +1 -1
  185. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +5 -5
  186. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs.map +1 -1
  187. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +10 -8
  188. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
  189. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.d.mts.map +1 -1
  190. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +18 -17
  191. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
  192. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +5 -5
  193. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs.map +1 -1
  194. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +5 -4
  195. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
  196. package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
  197. package/dist/astro/routes/api/content/_collection_/_id_.mjs +11 -9
  198. package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
  199. package/dist/astro/routes/api/content/_collection_/authors.mjs +5 -5
  200. package/dist/astro/routes/api/content/_collection_/authors.mjs.map +1 -1
  201. package/dist/astro/routes/api/content/_collection_/index.d.mts.map +1 -1
  202. package/dist/astro/routes/api/content/_collection_/index.mjs +12 -10
  203. package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
  204. package/dist/astro/routes/api/content/_collection_/trash.mjs +10 -9
  205. package/dist/astro/routes/api/content/_collection_/trash.mjs.map +1 -1
  206. package/dist/astro/routes/api/dashboard.mjs +8 -8
  207. package/dist/astro/routes/api/dev/emails.mjs +4 -4
  208. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  209. package/dist/astro/routes/api/import/probe.mjs +17 -16
  210. package/dist/astro/routes/api/import/probe.mjs.map +1 -1
  211. package/dist/astro/routes/api/import/wordpress/analyze.mjs +4 -4
  212. package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -12
  213. package/dist/astro/routes/api/import/wordpress/execute.d.mts.map +1 -1
  214. package/dist/astro/routes/api/import/wordpress/execute.mjs +12 -12
  215. package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -11
  216. package/dist/astro/routes/api/import/wordpress/media.d.mts.map +1 -1
  217. package/dist/astro/routes/api/import/wordpress/media.mjs +11 -10
  218. package/dist/astro/routes/api/import/wordpress/media.mjs.map +1 -1
  219. package/dist/astro/routes/api/import/wordpress/prepare.mjs +11 -10
  220. package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
  221. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +11 -12
  222. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts.map +1 -1
  223. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +11 -10
  224. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
  225. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  226. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +17 -16
  227. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
  228. package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs +1 -1
  229. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +11 -12
  230. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts.map +1 -1
  231. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +23 -22
  232. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
  233. package/dist/astro/routes/api/manifest.mjs +7 -8
  234. package/dist/astro/routes/api/manifest.mjs.map +1 -1
  235. package/dist/astro/routes/api/mcp.d.mts.map +1 -1
  236. package/dist/astro/routes/api/mcp.mjs +149 -45
  237. package/dist/astro/routes/api/mcp.mjs.map +1 -1
  238. package/dist/astro/routes/api/media/_id_/confirm.mjs +9 -8
  239. package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
  240. package/dist/astro/routes/api/media/_id_/usage.d.mts +8 -0
  241. package/dist/astro/routes/api/media/_id_/usage.d.mts.map +1 -0
  242. package/dist/astro/routes/api/media/_id_/usage.mjs +37 -0
  243. package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -0
  244. package/dist/astro/routes/api/media/_id_.d.mts.map +1 -1
  245. package/dist/astro/routes/api/media/_id_.mjs +26 -10
  246. package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
  247. package/dist/astro/routes/api/media/file/_...key_.mjs +4 -3
  248. package/dist/astro/routes/api/media/file/_...key_.mjs.map +1 -1
  249. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +4 -4
  250. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +4 -4
  251. package/dist/astro/routes/api/media/providers/index.mjs +4 -4
  252. package/dist/astro/routes/api/media/upload-url.mjs +10 -9
  253. package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
  254. package/dist/astro/routes/api/media.d.mts.map +1 -1
  255. package/dist/astro/routes/api/media.mjs +31 -11
  256. package/dist/astro/routes/api/media.mjs.map +1 -1
  257. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +10 -9
  258. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
  259. package/dist/astro/routes/api/menus/_name_/items.mjs +10 -9
  260. package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
  261. package/dist/astro/routes/api/menus/_name_/reorder.mjs +10 -9
  262. package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
  263. package/dist/astro/routes/api/menus/_name_/translations.mjs +10 -9
  264. package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
  265. package/dist/astro/routes/api/menus/_name_.mjs +10 -9
  266. package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
  267. package/dist/astro/routes/api/menus/index.mjs +10 -9
  268. package/dist/astro/routes/api/menus/index.mjs.map +1 -1
  269. package/dist/astro/routes/api/oauth/authorize.d.mts.map +1 -1
  270. package/dist/astro/routes/api/oauth/authorize.mjs +7 -8
  271. package/dist/astro/routes/api/oauth/authorize.mjs.map +1 -1
  272. package/dist/astro/routes/api/oauth/device/authorize.mjs +7 -7
  273. package/dist/astro/routes/api/oauth/device/code.mjs +10 -10
  274. package/dist/astro/routes/api/oauth/device/token.mjs +9 -9
  275. package/dist/astro/routes/api/oauth/register.mjs +4 -4
  276. package/dist/astro/routes/api/oauth/token/refresh.mjs +7 -7
  277. package/dist/astro/routes/api/oauth/token/revoke.mjs +7 -7
  278. package/dist/astro/routes/api/oauth/token.mjs +7 -7
  279. package/dist/astro/routes/api/openapi.json.mjs +52 -24
  280. package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
  281. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.d.mts.map +1 -1
  282. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +20 -32
  283. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs.map +1 -1
  284. package/dist/astro/routes/api/redirects/404s/index.mjs +12 -11
  285. package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
  286. package/dist/astro/routes/api/redirects/404s/summary.mjs +12 -11
  287. package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
  288. package/dist/astro/routes/api/redirects/_id_.mjs +13 -12
  289. package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
  290. package/dist/astro/routes/api/redirects/index.mjs +13 -12
  291. package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
  292. package/dist/astro/routes/api/relations/_id_/index.mjs +16 -15
  293. package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
  294. package/dist/astro/routes/api/relations/_id_/translations.mjs +11 -11
  295. package/dist/astro/routes/api/relations/index.mjs +16 -15
  296. package/dist/astro/routes/api/relations/index.mjs.map +1 -1
  297. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +4 -4
  298. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +5 -4
  299. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs.map +1 -1
  300. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +39 -38
  301. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  302. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +39 -38
  303. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  304. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +39 -38
  305. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  306. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +39 -38
  307. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  308. package/dist/astro/routes/api/schema/collections/index.mjs +39 -38
  309. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  310. package/dist/astro/routes/api/schema/index.mjs +9 -9
  311. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +39 -38
  312. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  313. package/dist/astro/routes/api/schema/orphans/index.mjs +39 -38
  314. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  315. package/dist/astro/routes/api/search/enable.mjs +13 -12
  316. package/dist/astro/routes/api/search/enable.mjs.map +1 -1
  317. package/dist/astro/routes/api/search/index.mjs +12 -11
  318. package/dist/astro/routes/api/search/index.mjs.map +1 -1
  319. package/dist/astro/routes/api/search/rebuild.mjs +13 -12
  320. package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
  321. package/dist/astro/routes/api/search/stats.mjs +8 -8
  322. package/dist/astro/routes/api/search/suggest.mjs +12 -11
  323. package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
  324. package/dist/astro/routes/api/sections/_slug_.mjs +12 -11
  325. package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
  326. package/dist/astro/routes/api/sections/index.mjs +12 -11
  327. package/dist/astro/routes/api/sections/index.mjs.map +1 -1
  328. package/dist/astro/routes/api/settings/backups/archives/_name_.d.mts +9 -0
  329. package/dist/astro/routes/api/settings/backups/archives/_name_.d.mts.map +1 -0
  330. package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +48 -0
  331. package/dist/astro/routes/api/settings/backups/archives/_name_.mjs.map +1 -0
  332. package/dist/astro/routes/api/settings/backups/archives/index.d.mts +8 -0
  333. package/dist/astro/routes/api/settings/backups/archives/index.d.mts.map +1 -0
  334. package/dist/astro/routes/api/settings/backups/archives/index.mjs +23 -0
  335. package/dist/astro/routes/api/settings/backups/archives/index.mjs.map +1 -0
  336. package/dist/astro/routes/api/settings/backups/export.d.mts +8 -0
  337. package/dist/astro/routes/api/settings/backups/export.d.mts.map +1 -0
  338. package/dist/astro/routes/api/settings/backups/export.mjs +35 -0
  339. package/dist/astro/routes/api/settings/backups/export.mjs.map +1 -0
  340. package/dist/astro/routes/api/settings/backups/index.d.mts +9 -0
  341. package/dist/astro/routes/api/settings/backups/index.d.mts.map +1 -0
  342. package/dist/astro/routes/api/settings/backups/index.mjs +52 -0
  343. package/dist/astro/routes/api/settings/backups/index.mjs.map +1 -0
  344. package/dist/astro/routes/api/settings/email.mjs +5 -5
  345. package/dist/astro/routes/api/settings.mjs +14 -13
  346. package/dist/astro/routes/api/settings.mjs.map +1 -1
  347. package/dist/astro/routes/api/setup/admin-verify.mjs +19 -15
  348. package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -1
  349. package/dist/astro/routes/api/setup/admin.mjs +18 -14
  350. package/dist/astro/routes/api/setup/admin.mjs.map +1 -1
  351. package/dist/astro/routes/api/setup/dev-bypass.mjs +26 -26
  352. package/dist/astro/routes/api/setup/dev-reset.mjs +3 -3
  353. package/dist/astro/routes/api/setup/index.mjs +28 -27
  354. package/dist/astro/routes/api/setup/index.mjs.map +1 -1
  355. package/dist/astro/routes/api/setup/status.mjs +5 -5
  356. package/dist/astro/routes/api/snapshot.mjs +8 -215
  357. package/dist/astro/routes/api/snapshot.mjs.map +1 -1
  358. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +14 -13
  359. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
  360. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +14 -13
  361. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
  362. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +14 -13
  363. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
  364. package/dist/astro/routes/api/taxonomies/index.mjs +14 -13
  365. package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
  366. package/dist/astro/routes/api/themes/preview.mjs +6 -6
  367. package/dist/astro/routes/api/typegen.mjs +6 -6
  368. package/dist/astro/routes/api/well-known/auth.mjs +1 -1
  369. package/dist/astro/routes/api/well-known/oauth-authorization-server.d.mts.map +1 -1
  370. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +4 -3
  371. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs.map +1 -1
  372. package/dist/astro/routes/api/well-known/oauth-protected-resource.d.mts.map +1 -1
  373. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +4 -3
  374. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs.map +1 -1
  375. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +9 -8
  376. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
  377. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +12 -11
  378. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
  379. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +12 -11
  380. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
  381. package/dist/astro/routes/api/widget-areas/_name_.mjs +7 -7
  382. package/dist/astro/routes/api/widget-areas/index.mjs +12 -11
  383. package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
  384. package/dist/astro/routes/api/widget-components.mjs +4 -4
  385. package/dist/astro/routes/robots.txt.mjs +7 -7
  386. package/dist/astro/routes/sitemap-_collection_.xml.mjs +9 -9
  387. package/dist/astro/routes/sitemap.xml.mjs +8 -8
  388. package/dist/astro/types.d.mts +38 -17
  389. package/dist/astro/types.d.mts.map +1 -1
  390. package/dist/auth/providers/github.d.mts +1 -1
  391. package/dist/auth/providers/google.d.mts +1 -1
  392. package/dist/{authorize-BmCwQCib.mjs → authorize-WxsiePzy.mjs} +7 -4
  393. package/dist/authorize-WxsiePzy.mjs.map +1 -0
  394. package/dist/backup-S8kFWtwD.mjs +241 -0
  395. package/dist/backup-S8kFWtwD.mjs.map +1 -0
  396. package/dist/{base64-C74Msx8h.mjs → base64-B-PsqheR.mjs} +8 -4
  397. package/dist/base64-B-PsqheR.mjs.map +1 -0
  398. package/dist/{byline-BWb5H-65.mjs → byline-XEjchwzZ.mjs} +6 -6
  399. package/dist/{byline-BWb5H-65.mjs.map → byline-XEjchwzZ.mjs.map} +1 -1
  400. package/dist/{byline-fields-DO6bAYK8.mjs → byline-fields-CdU_LTF1.mjs} +1 -1
  401. package/dist/{byline-fields-DO6bAYK8.mjs.map → byline-fields-CdU_LTF1.mjs.map} +1 -1
  402. package/dist/{bylines-BGuKFaBy.mjs → bylines-BJbT4gKS.mjs} +4 -4
  403. package/dist/{bylines-BGuKFaBy.mjs.map → bylines-BJbT4gKS.mjs.map} +1 -1
  404. package/dist/{bylines-CHojDMpj.mjs → bylines-czseViYo.mjs} +6 -6
  405. package/dist/{bylines-CHojDMpj.mjs.map → bylines-czseViYo.mjs.map} +1 -1
  406. package/dist/{cache-BeR7RfN8.mjs → cache-CGCd6AVM.mjs} +2 -2
  407. package/dist/{cache-BeR7RfN8.mjs.map → cache-CGCd6AVM.mjs.map} +1 -1
  408. package/dist/{challenge-store-B426wQ6O.mjs → challenge-store-BFzgFRog.mjs} +1 -1
  409. package/dist/{challenge-store-B426wQ6O.mjs.map → challenge-store-BFzgFRog.mjs.map} +1 -1
  410. package/dist/{chunks-BU5_nrAC.mjs → chunks-BxXyunY-.mjs} +2 -2
  411. package/dist/{chunks-BU5_nrAC.mjs.map → chunks-BxXyunY-.mjs.map} +1 -1
  412. package/dist/cli/index.mjs +138 -31
  413. package/dist/cli/index.mjs.map +1 -1
  414. package/dist/client/cf-access.d.mts +1 -1
  415. package/dist/client/index.d.mts +54 -3
  416. package/dist/client/index.d.mts.map +1 -1
  417. package/dist/client/index.mjs +16 -4
  418. package/dist/client/index.mjs.map +1 -1
  419. package/dist/{comment-SWh31kS0.mjs → comment-DPT0WKyd.mjs} +2 -2
  420. package/dist/{comment-SWh31kS0.mjs.map → comment-DPT0WKyd.mjs.map} +1 -1
  421. package/dist/{comment-reaction-DgcpziXI.mjs → comment-reaction-C65MldIB.mjs} +2 -2
  422. package/dist/{comment-reaction-DgcpziXI.mjs.map → comment-reaction-C65MldIB.mjs.map} +1 -1
  423. package/dist/{comments-kZYGppMS.mjs → comments-Bz6sCbgD.mjs} +3 -3
  424. package/dist/{comments-kZYGppMS.mjs.map → comments-Bz6sCbgD.mjs.map} +1 -1
  425. package/dist/{components-CliOkZAs.mjs → components-DZkL4Fx0.mjs} +1 -1
  426. package/dist/{components-CliOkZAs.mjs.map → components-DZkL4Fx0.mjs.map} +1 -1
  427. package/dist/{content-BO61Sx4j.mjs → content-Ci04z2z-.mjs} +53 -19
  428. package/dist/content-Ci04z2z-.mjs.map +1 -0
  429. package/dist/{content-refresh-BkkApzeS.mjs → content-refresh-D4khvC0R.mjs} +95 -3
  430. package/dist/content-refresh-D4khvC0R.mjs.map +1 -0
  431. package/dist/{context-DtSFYFuS.mjs → context-B6hc7zJL.mjs} +97 -74
  432. package/dist/context-B6hc7zJL.mjs.map +1 -0
  433. package/dist/{cron-YFJ7uNVA.mjs → cron-BlKIMD_e.mjs} +1 -1
  434. package/dist/{cron-YFJ7uNVA.mjs.map → cron-BlKIMD_e.mjs.map} +1 -1
  435. package/dist/{dashboard-xo_gPs_D.mjs → dashboard-C5NkXFbi.mjs} +4 -4
  436. package/dist/{dashboard-xo_gPs_D.mjs.map → dashboard-C5NkXFbi.mjs.map} +1 -1
  437. package/dist/db/index.d.mts +3 -3
  438. package/dist/db/index.mjs +2 -2
  439. package/dist/db/index.mjs.map +1 -1
  440. package/dist/db/libsql.d.mts +1 -1
  441. package/dist/db/postgres.d.mts +1 -1
  442. package/dist/db/sqlite.d.mts +1 -1
  443. package/dist/{db-errors-BKuXh_fi.mjs → db-errors-CcWLaRiR.mjs} +4 -2
  444. package/dist/db-errors-CcWLaRiR.mjs.map +1 -0
  445. package/dist/{default-DY5ovGUG.mjs → default-C4v9KP56.mjs} +1 -1
  446. package/dist/{default-DY5ovGUG.mjs.map → default-C4v9KP56.mjs.map} +1 -1
  447. package/dist/{device-flow-CPXQ_QfW.mjs → device-flow-BeA6lUS1.mjs} +5 -6
  448. package/dist/device-flow-BeA6lUS1.mjs.map +1 -0
  449. package/dist/{dialect-helpers-Cue7QQOR.mjs → dialect-helpers-HxEQGl_1.mjs} +57 -11
  450. package/dist/{dialect-helpers-Cue7QQOR.mjs.map → dialect-helpers-HxEQGl_1.mjs.map} +1 -1
  451. package/dist/{email-console-CjkQc7oY.mjs → email-console-C-9Ng8DM.mjs} +1 -1
  452. package/dist/{email-console-CjkQc7oY.mjs.map → email-console-C-9Ng8DM.mjs.map} +1 -1
  453. package/dist/error-CEGF6UZb.mjs +90 -0
  454. package/dist/error-CEGF6UZb.mjs.map +1 -0
  455. package/dist/{error-CfJMLSkd.mjs → errors-DtEXIQQV.mjs} +15 -84
  456. package/dist/errors-DtEXIQQV.mjs.map +1 -0
  457. package/dist/{escape-r8_GbEU2.mjs → escape-CFedIB1C.mjs} +1 -1
  458. package/dist/{escape-r8_GbEU2.mjs.map → escape-CFedIB1C.mjs.map} +1 -1
  459. package/dist/{field-defs-cache-BVrNCgSj.mjs → field-defs-cache-DvmlgP-D.mjs} +2 -2
  460. package/dist/{field-defs-cache-BVrNCgSj.mjs.map → field-defs-cache-DvmlgP-D.mjs.map} +1 -1
  461. package/dist/{fts-manager-BD9s77qh.mjs → fts-manager-DzqIBrrW.mjs} +3 -3
  462. package/dist/{fts-manager-BD9s77qh.mjs.map → fts-manager-DzqIBrrW.mjs.map} +1 -1
  463. package/dist/{hreflang-CgIxhH4k.d.mts → hreflang-CIxH_LKz.d.mts} +2 -2
  464. package/dist/{hreflang-CgIxhH4k.d.mts.map → hreflang-CIxH_LKz.d.mts.map} +1 -1
  465. package/dist/{hreflang-pAWUiPd_.mjs → hreflang-db2Tpb2o.mjs} +5 -5
  466. package/dist/{hreflang-pAWUiPd_.mjs.map → hreflang-db2Tpb2o.mjs.map} +1 -1
  467. package/dist/{import-2jHtLzsO.mjs → import-Dmkm8S1W.mjs} +4 -4
  468. package/dist/{import-2jHtLzsO.mjs.map → import-Dmkm8S1W.mjs.map} +1 -1
  469. package/dist/{index-DxjWLKGT.d.mts → index-BEui-cRd.d.mts} +3 -3
  470. package/dist/{index-DxjWLKGT.d.mts.map → index-BEui-cRd.d.mts.map} +1 -1
  471. package/dist/{index-BXOCyLj0.d.mts → index-wYnC6u4o.d.mts} +780 -15
  472. package/dist/index-wYnC6u4o.d.mts.map +1 -0
  473. package/dist/index.d.mts +18 -19
  474. package/dist/index.mjs +59 -58
  475. package/dist/{load-DgoWMdRX.mjs → load-Cx27ki1l.mjs} +2 -2
  476. package/dist/{load-DgoWMdRX.mjs.map → load-Cx27ki1l.mjs.map} +1 -1
  477. package/dist/{loader-Rb8QlGZp.mjs → loader-Be3ouI5L.mjs} +170 -6
  478. package/dist/loader-Be3ouI5L.mjs.map +1 -0
  479. package/dist/{manifest-schema-DeGNma2O.mjs → manifest-schema-bCq54i7F.mjs} +16 -2
  480. package/dist/manifest-schema-bCq54i7F.mjs.map +1 -0
  481. package/dist/media/image-endpoint.d.mts +30 -2
  482. package/dist/media/image-endpoint.d.mts.map +1 -1
  483. package/dist/media/image-endpoint.mjs +29 -3
  484. package/dist/media/image-endpoint.mjs.map +1 -1
  485. package/dist/media/index.d.mts +1 -1
  486. package/dist/media/local-runtime.d.mts +12 -13
  487. package/dist/media/local-runtime.d.mts.map +1 -1
  488. package/dist/media/local-runtime.mjs +6 -6
  489. package/dist/{media-D2ZFowpn.mjs → media-BjhhENaJ.mjs} +2 -2
  490. package/dist/{media-D2ZFowpn.mjs.map → media-BjhhENaJ.mjs.map} +1 -1
  491. package/dist/{media-allowlist-Dc05vKtt.mjs → media-allowlist-jUppPWFy.mjs} +1 -1
  492. package/dist/{media-allowlist-Dc05vKtt.mjs.map → media-allowlist-jUppPWFy.mjs.map} +1 -1
  493. package/dist/media-kIV1IxFf.mjs +243 -0
  494. package/dist/media-kIV1IxFf.mjs.map +1 -0
  495. package/dist/media-upload-D2wk3EIt.mjs +145 -0
  496. package/dist/media-upload-D2wk3EIt.mjs.map +1 -0
  497. package/dist/{media-url-DgIEYZr4.mjs → media-url-BCm5vBn6.mjs} +1 -1
  498. package/dist/{media-url-DgIEYZr4.mjs.map → media-url-BCm5vBn6.mjs.map} +1 -1
  499. package/dist/{media-usage-B__v9NMm.mjs → media-usage-CljdO1mc.mjs} +138 -5
  500. package/dist/{media-usage-B__v9NMm.mjs.map → media-usage-CljdO1mc.mjs.map} +1 -1
  501. package/dist/{menus-BtvH7Z7t.mjs → menus-BcyElFtI.mjs} +155 -12
  502. package/dist/menus-BcyElFtI.mjs.map +1 -0
  503. package/dist/{menus-BpfevlJD.mjs → menus-CZyG6rvx.mjs} +2 -2
  504. package/dist/{menus-BpfevlJD.mjs.map → menus-CZyG6rvx.mjs.map} +1 -1
  505. package/dist/{mode-BVnhGZ2o.mjs → mode-fiXRMfeA.mjs} +1 -1
  506. package/dist/{mode-BVnhGZ2o.mjs.map → mode-fiXRMfeA.mjs.map} +1 -1
  507. package/dist/{oauth-authorization-BWqWTHBK.mjs → oauth-authorization-oqfbBuMH.mjs} +5 -6
  508. package/dist/oauth-authorization-oqfbBuMH.mjs.map +1 -0
  509. package/dist/{oauth-clients-43_XADoa.mjs → oauth-clients-BlrUHAsf.mjs} +1 -1
  510. package/dist/{oauth-clients-43_XADoa.mjs.map → oauth-clients-BlrUHAsf.mjs.map} +1 -1
  511. package/dist/{oauth-state-store-BRSUEkmx.mjs → oauth-state-store-DnvjRMy6.mjs} +2 -1
  512. package/dist/{oauth-state-store-BRSUEkmx.mjs.map → oauth-state-store-DnvjRMy6.mjs.map} +1 -1
  513. package/dist/{oauth-user-lookup-Ctgemb0k.mjs → oauth-user-lookup-oUllxvAv.mjs} +1 -1
  514. package/dist/{oauth-user-lookup-Ctgemb0k.mjs.map → oauth-user-lookup-oUllxvAv.mjs.map} +1 -1
  515. package/dist/object-cache/memory.d.mts +1 -1
  516. package/dist/{options-COXGTtqd.d.mts → options-BqMkWfYa.d.mts} +6 -6
  517. package/dist/{options-COXGTtqd.d.mts.map → options-BqMkWfYa.d.mts.map} +1 -1
  518. package/dist/page/index.d.mts +2 -2
  519. package/dist/page/index.d.mts.map +1 -1
  520. package/dist/page/index.mjs.map +1 -1
  521. package/dist/{parse-GLksnn-B.mjs → parse-C_-6klII.mjs} +4 -12
  522. package/dist/{parse-GLksnn-B.mjs.map → parse-C_-6klII.mjs.map} +1 -1
  523. package/dist/{passkey-config-CjA1UbDj.mjs → passkey-config-C-SKpc0-.mjs} +1 -1
  524. package/dist/{passkey-config-CjA1UbDj.mjs.map → passkey-config-C-SKpc0-.mjs.map} +1 -1
  525. package/dist/{placeholder-DR-eeZr-.d.mts → placeholder-Dop47JMM.d.mts} +1 -1
  526. package/dist/{placeholder-DR-eeZr-.d.mts.map → placeholder-Dop47JMM.d.mts.map} +1 -1
  527. package/dist/plugin-types.d.mts +21 -2
  528. package/dist/plugin-types.d.mts.map +1 -1
  529. package/dist/plugin-utils.d.mts +18 -17
  530. package/dist/plugin-utils.d.mts.map +1 -1
  531. package/dist/plugin-utils.mjs +8 -6
  532. package/dist/plugin-utils.mjs.map +1 -1
  533. package/dist/plugins/adapt-sandbox-entry.d.mts +10 -11
  534. package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
  535. package/dist/plugins/adapt-sandbox-entry.mjs +15 -3
  536. package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
  537. package/dist/{portable-text-BAkgEKcv.mjs → portable-text-sDj92Kxv.mjs} +1 -1
  538. package/dist/{portable-text-BAkgEKcv.mjs.map → portable-text-sDj92Kxv.mjs.map} +1 -1
  539. package/dist/{preview-Rloa09Wp.mjs → preview-D4Jnbfx7.mjs} +2 -2
  540. package/dist/{preview-Rloa09Wp.mjs.map → preview-D4Jnbfx7.mjs.map} +1 -1
  541. package/dist/{public-url-C0cEvrRu.mjs → public-url-DSGTnJFw.mjs} +5 -3
  542. package/dist/public-url-DSGTnJFw.mjs.map +1 -0
  543. package/dist/{query-ZzvXyxWq.mjs → query-DR73ZNfm.mjs} +14 -14
  544. package/dist/{query-ZzvXyxWq.mjs.map → query-DR73ZNfm.mjs.map} +1 -1
  545. package/dist/{query-BxT95opY.mjs → query-Di7DOmPV.mjs} +3 -3
  546. package/dist/{query-BxT95opY.mjs.map → query-Di7DOmPV.mjs.map} +1 -1
  547. package/dist/{rate-limit-Cg4Rvc_-.mjs → rate-limit-CMj83JNW.mjs} +2 -2
  548. package/dist/{rate-limit-Cg4Rvc_-.mjs.map → rate-limit-CMj83JNW.mjs.map} +1 -1
  549. package/dist/{redirect-Ce_6Yb6z.mjs → redirect-Botom7X6.mjs} +1 -1
  550. package/dist/{redirect-Ce_6Yb6z.mjs.map → redirect-Botom7X6.mjs.map} +1 -1
  551. package/dist/{redirect-Ch3E98qZ.mjs → redirect-CgLPYflR.mjs} +10 -4
  552. package/dist/redirect-CgLPYflR.mjs.map +1 -0
  553. package/dist/{redirects-CXmVGRNZ.mjs → redirects-B7t9bKsL.mjs} +4 -4
  554. package/dist/{redirects-CXmVGRNZ.mjs.map → redirects-B7t9bKsL.mjs.map} +1 -1
  555. package/dist/{redirects-CeD7K7EX.mjs → redirects-BBq3n2Rj.mjs} +4 -175
  556. package/dist/redirects-BBq3n2Rj.mjs.map +1 -0
  557. package/dist/{registry-CyIXPi4E.mjs → registry-FV15nLge.mjs} +97 -8
  558. package/dist/registry-FV15nLge.mjs.map +1 -0
  559. package/dist/{relation-Ba68Tm4Z.mjs → relation-9M9j_UWo.mjs} +3 -3
  560. package/dist/{relation-Ba68Tm4Z.mjs.map → relation-9M9j_UWo.mjs.map} +1 -1
  561. package/dist/{relations-BmBmX4Eb.mjs → relations-5_avdrN_.mjs} +2 -2
  562. package/dist/{relations-BmBmX4Eb.mjs.map → relations-5_avdrN_.mjs.map} +1 -1
  563. package/dist/{relations-C8hVyEy0.mjs → relations-BKvO39-9.mjs} +5 -5
  564. package/dist/{relations-C8hVyEy0.mjs.map → relations-BKvO39-9.mjs.map} +1 -1
  565. package/dist/{relations-CbBpoOys.d.mts → relations-Bh8jlFsU.d.mts} +306 -4
  566. package/dist/relations-Bh8jlFsU.d.mts.map +1 -0
  567. package/dist/{request-meta-DCwktC5P.mjs → request-meta-DzXYYI-n.mjs} +2 -2
  568. package/dist/{request-meta-DCwktC5P.mjs.map → request-meta-DzXYYI-n.mjs.map} +1 -1
  569. package/dist/{runner-CiNdIk3y.d.mts → runner-Dd8m8k9F.d.mts} +2 -2
  570. package/dist/{runner-CiNdIk3y.d.mts.map → runner-Dd8m8k9F.d.mts.map} +1 -1
  571. package/dist/{runner-jt65bF7F.mjs → runner-DfnZ5eUr.mjs} +333 -199
  572. package/dist/runner-DfnZ5eUr.mjs.map +1 -0
  573. package/dist/runtime.d.mts +11 -12
  574. package/dist/runtime.d.mts.map +1 -1
  575. package/dist/runtime.mjs +4 -4
  576. package/dist/{schema-DwjufZ1S.mjs → schema-BXxlHeAf.mjs} +3 -3
  577. package/dist/{schema-DwjufZ1S.mjs.map → schema-BXxlHeAf.mjs.map} +1 -1
  578. package/dist/scopes-Bl4IwHA-.mjs +27 -0
  579. package/dist/scopes-Bl4IwHA-.mjs.map +1 -0
  580. package/dist/{search-Cl875CVE.mjs → search-Bff-7jFt.mjs} +5 -5
  581. package/dist/{search-Cl875CVE.mjs.map → search-Bff-7jFt.mjs.map} +1 -1
  582. package/dist/{secrets-CO_bEmII.mjs → secrets-CSwQIl4q.mjs} +3 -3
  583. package/dist/{secrets-CO_bEmII.mjs.map → secrets-CSwQIl4q.mjs.map} +1 -1
  584. package/dist/{sections-DTKzgoiS.mjs → sections-CwW4s1al.mjs} +3 -3
  585. package/dist/{sections-DTKzgoiS.mjs.map → sections-CwW4s1al.mjs.map} +1 -1
  586. package/dist/seed/index.d.mts +2 -2
  587. package/dist/seed/index.mjs +20 -20
  588. package/dist/seo/index.d.mts +14 -3
  589. package/dist/seo/index.d.mts.map +1 -1
  590. package/dist/seo/index.mjs +16 -16
  591. package/dist/seo/index.mjs.map +1 -1
  592. package/dist/{seo-BLm6SXzS.mjs → seo-2cmFHZns.mjs} +2 -2
  593. package/dist/{seo-BLm6SXzS.mjs.map → seo-2cmFHZns.mjs.map} +1 -1
  594. package/dist/{seo-BjrbXAd_.mjs → seo-C3GDfT0V.mjs} +1 -1
  595. package/dist/{seo-BjrbXAd_.mjs.map → seo-C3GDfT0V.mjs.map} +1 -1
  596. package/dist/{service-D6zDmKXy.mjs → service-DkGTWGIi.mjs} +3 -3
  597. package/dist/{service-D6zDmKXy.mjs.map → service-DkGTWGIi.mjs.map} +1 -1
  598. package/dist/{session-user-DoSs6YM8.mjs → session-user-DbHqKDKe.mjs} +1 -1
  599. package/dist/{session-user-DoSs6YM8.mjs.map → session-user-DbHqKDKe.mjs.map} +1 -1
  600. package/dist/{settings-CmS3TwXf.mjs → settings-C4s8hFQm.mjs} +3 -3
  601. package/dist/{settings-CmS3TwXf.mjs.map → settings-C4s8hFQm.mjs.map} +1 -1
  602. package/dist/{settings-BuQYvLfy.mjs → settings-CpA4lQFt.mjs} +4 -4
  603. package/dist/{settings-BuQYvLfy.mjs.map → settings-CpA4lQFt.mjs.map} +1 -1
  604. package/dist/{setup-complete-BPNgLHlU.mjs → setup-complete-CdIlqloh.mjs} +1 -1
  605. package/dist/{setup-complete-BPNgLHlU.mjs.map → setup-complete-CdIlqloh.mjs.map} +1 -1
  606. package/dist/{setup-nonce-DEPZX96T.mjs → setup-nonce-DqiIPr-J.mjs} +1 -1
  607. package/dist/{setup-nonce-DEPZX96T.mjs.map → setup-nonce-DqiIPr-J.mjs.map} +1 -1
  608. package/dist/{single-flight-cache-DEtW-OEG.mjs → single-flight-cache-C2exrGAi.mjs} +1 -1
  609. package/dist/{single-flight-cache-DEtW-OEG.mjs.map → single-flight-cache-C2exrGAi.mjs.map} +1 -1
  610. package/dist/{site-url-CcLy5D5s.mjs → site-url-NGJT6NTU.mjs} +1 -1
  611. package/dist/{site-url-CcLy5D5s.mjs.map → site-url-NGJT6NTU.mjs.map} +1 -1
  612. package/dist/snapshot-BdpUJKD-.mjs +216 -0
  613. package/dist/snapshot-BdpUJKD-.mjs.map +1 -0
  614. package/dist/{ssrf-TrKYJAy0.mjs → ssrf-CviKqWmq.mjs} +1 -1
  615. package/dist/{ssrf-TrKYJAy0.mjs.map → ssrf-CviKqWmq.mjs.map} +1 -1
  616. package/dist/state-xxv6ZTMv.mjs +128 -0
  617. package/dist/state-xxv6ZTMv.mjs.map +1 -0
  618. package/dist/{status-D3Gy1Zc6.mjs → status-COfycGIU.mjs} +1 -1
  619. package/dist/{status-D3Gy1Zc6.mjs.map → status-COfycGIU.mjs.map} +1 -1
  620. package/dist/storage/local.d.mts +1 -1
  621. package/dist/storage/local.mjs +1 -1
  622. package/dist/storage/s3.d.mts +1 -1
  623. package/dist/storage/s3.mjs +1 -1
  624. package/dist/{taxonomies-ClS4RKaZ.mjs → taxonomies-Ce49uIzY.mjs} +4 -4
  625. package/dist/{taxonomies-ClS4RKaZ.mjs.map → taxonomies-Ce49uIzY.mjs.map} +1 -1
  626. package/dist/{taxonomies-pUkuD6nj.mjs → taxonomies-DjSKBZpq.mjs} +7 -7
  627. package/dist/{taxonomies-pUkuD6nj.mjs.map → taxonomies-DjSKBZpq.mjs.map} +1 -1
  628. package/dist/{taxonomy-BkxbUMSw.mjs → taxonomy-DfVooU4W.mjs} +51 -13
  629. package/dist/taxonomy-DfVooU4W.mjs.map +1 -0
  630. package/dist/{tokens-BV6fgl5A.mjs → tokens-DVltpO2D.mjs} +2 -2
  631. package/dist/{tokens-BV6fgl5A.mjs.map → tokens-DVltpO2D.mjs.map} +1 -1
  632. package/dist/{transport-DTFhhPOg.mjs → transport-CKrlqSpD.mjs} +1 -1
  633. package/dist/{transport-DTFhhPOg.mjs.map → transport-CKrlqSpD.mjs.map} +1 -1
  634. package/dist/{transport-DmlmzD2U.d.mts → transport-Vd7VdqHv.d.mts} +1 -1
  635. package/dist/{transport-DmlmzD2U.d.mts.map → transport-Vd7VdqHv.d.mts.map} +1 -1
  636. package/dist/{trusted-proxy-CSgZVESw.mjs → trusted-proxy-CwjQj0YG.mjs} +1 -1
  637. package/dist/{trusted-proxy-CSgZVESw.mjs.map → trusted-proxy-CwjQj0YG.mjs.map} +1 -1
  638. package/dist/{types-B6-N9cBB.d.mts → types-B4vm81VH.d.mts} +1 -1
  639. package/dist/{types-B6-N9cBB.d.mts.map → types-B4vm81VH.d.mts.map} +1 -1
  640. package/dist/{types-Cm4Cz-8M.d.mts → types-B97jg3aW.d.mts} +6 -1
  641. package/dist/{types-Cm4Cz-8M.d.mts.map → types-B97jg3aW.d.mts.map} +1 -1
  642. package/dist/{types-BNZsPL9z.mjs → types-BD40g7zz.mjs} +1 -1
  643. package/dist/{types-BNZsPL9z.mjs.map → types-BD40g7zz.mjs.map} +1 -1
  644. package/dist/{types-QnlQIyPE.d.mts → types-BNfPHfay.d.mts} +1 -1
  645. package/dist/{types-QnlQIyPE.d.mts.map → types-BNfPHfay.d.mts.map} +1 -1
  646. package/dist/{types-DLIrNtv5.d.mts → types-BfYUPJdP.d.mts} +2 -2
  647. package/dist/{types-DLIrNtv5.d.mts.map → types-BfYUPJdP.d.mts.map} +1 -1
  648. package/dist/{types-CtDVagM4.d.mts → types-BvB7gDOD.d.mts} +38 -4
  649. package/dist/types-BvB7gDOD.d.mts.map +1 -0
  650. package/dist/{types-B_pmP7Yq.d.mts → types-C7U0HlEr.d.mts} +1 -1
  651. package/dist/{types-B_pmP7Yq.d.mts.map → types-C7U0HlEr.d.mts.map} +1 -1
  652. package/dist/{types-Ch8pFMEm.mjs → types-D1iJ3DpO.mjs} +3 -3
  653. package/dist/{types-Ch8pFMEm.mjs.map → types-D1iJ3DpO.mjs.map} +1 -1
  654. package/dist/{types-momGysZk.d.mts → types-DPKhI5ib.d.mts} +9 -1
  655. package/dist/types-DPKhI5ib.d.mts.map +1 -0
  656. package/dist/{types-BCVuUPrL.d.mts → types-Kmaxdarz.d.mts} +1 -1
  657. package/dist/{types-BCVuUPrL.d.mts.map → types-Kmaxdarz.d.mts.map} +1 -1
  658. package/dist/{types-qljd1hsL.d.mts → types-iVeZ5g6N.d.mts} +1 -1
  659. package/dist/{types-qljd1hsL.d.mts.map → types-iVeZ5g6N.d.mts.map} +1 -1
  660. package/dist/{user-DTxX_Fha.mjs → user-Bh-L1qo6.mjs} +3 -3
  661. package/dist/{user-DTxX_Fha.mjs.map → user-Bh-L1qo6.mjs.map} +1 -1
  662. package/dist/{utils-Cz8PVrl4.mjs → utils-BbUgmeZG.mjs} +1 -1
  663. package/dist/{utils-Cz8PVrl4.mjs.map → utils-BbUgmeZG.mjs.map} +1 -1
  664. package/dist/{validate-9jLuE301.d.mts → validate-DULfgpJP.d.mts} +5 -5
  665. package/dist/{validate-9jLuE301.d.mts.map → validate-DULfgpJP.d.mts.map} +1 -1
  666. package/dist/{validate-C3CpWlNt.mjs → validate-V9nCwq_-.mjs} +2 -2
  667. package/dist/{validate-C3CpWlNt.mjs.map → validate-V9nCwq_-.mjs.map} +1 -1
  668. package/dist/{validation-DM2K_NJC.mjs → validation-BsVUJfsP.mjs} +10 -10
  669. package/dist/{validation-DM2K_NJC.mjs.map → validation-BsVUJfsP.mjs.map} +1 -1
  670. package/dist/version-907opKac.mjs +7 -0
  671. package/dist/{version-BlIJvNAZ.mjs.map → version-907opKac.mjs.map} +1 -1
  672. package/dist/{widgets-B_X6_UXJ.mjs → widgets-DGv1Z04V.mjs} +3 -3
  673. package/dist/{widgets-B_X6_UXJ.mjs.map → widgets-DGv1Z04V.mjs.map} +1 -1
  674. package/dist/{wxr-taxonomies-tADW4KTa.d.mts → wxr-taxonomies-B4tMuN5T.d.mts} +1 -1
  675. package/dist/{wxr-taxonomies-tADW4KTa.d.mts.map → wxr-taxonomies-B4tMuN5T.d.mts.map} +1 -1
  676. package/dist/{wxr-taxonomies-oNJB2S81.mjs → wxr-taxonomies-Cs1N6O8z.mjs} +3 -3
  677. package/dist/{wxr-taxonomies-oNJB2S81.mjs.map → wxr-taxonomies-Cs1N6O8z.mjs.map} +1 -1
  678. package/dist/{zod-generator-CrfV79De.mjs → zod-generator-B5prQ5M4.mjs} +2 -2
  679. package/dist/{zod-generator-CrfV79De.mjs.map → zod-generator-B5prQ5M4.mjs.map} +1 -1
  680. package/package.json +8 -8
  681. package/src/api/authorize.ts +10 -1
  682. package/src/api/error.ts +5 -5
  683. package/src/api/errors.ts +14 -0
  684. package/src/api/handlers/backup.ts +312 -0
  685. package/src/api/handlers/content.ts +36 -2
  686. package/src/api/handlers/device-flow.ts +2 -3
  687. package/src/api/handlers/index.ts +16 -0
  688. package/src/api/handlers/marketplace.ts +38 -0
  689. package/src/api/handlers/media-upload.ts +210 -0
  690. package/src/api/handlers/media-usage.ts +211 -2
  691. package/src/api/handlers/oauth-authorization.ts +2 -6
  692. package/src/api/handlers/plugin-settings.ts +218 -0
  693. package/src/api/handlers/plugins.ts +41 -0
  694. package/src/api/handlers/registry.ts +39 -0
  695. package/src/api/handlers/snapshot.ts +21 -3
  696. package/src/api/openapi/document.ts +48 -6
  697. package/src/api/parse.ts +1 -15
  698. package/src/api/public-url.ts +4 -2
  699. package/src/api/schemas/common.ts +6 -2
  700. package/src/api/schemas/media-usage.ts +72 -0
  701. package/src/api/schemas/media.ts +32 -1
  702. package/src/astro/integration/index.ts +38 -0
  703. package/src/astro/integration/routes.ts +35 -0
  704. package/src/astro/integration/runtime.ts +6 -0
  705. package/src/astro/integration/virtual-modules.ts +41 -7
  706. package/src/astro/integration/vite-config.ts +17 -1
  707. package/src/astro/middleware/auth.ts +70 -78
  708. package/src/astro/middleware/csp.ts +5 -2
  709. package/src/astro/middleware.ts +86 -31
  710. package/src/astro/public-plugin-api-routes.ts +2 -1
  711. package/src/astro/routes/PluginRegistry.tsx +5 -2
  712. package/src/astro/routes/admin.astro +56 -16
  713. package/src/astro/routes/api/admin/api-tokens/index.ts +2 -2
  714. package/src/astro/routes/api/admin/bylines/[id]/translations.ts +2 -5
  715. package/src/astro/routes/api/admin/plugins/[id]/index.ts +6 -0
  716. package/src/astro/routes/api/admin/plugins/[id]/mcp.ts +42 -0
  717. package/src/astro/routes/api/admin/plugins/[id]/settings.ts +80 -0
  718. package/src/astro/routes/api/admin/plugins/[id]/update.ts +2 -0
  719. package/src/astro/routes/api/admin/plugins/index.ts +9 -0
  720. package/src/astro/routes/api/admin/plugins/marketplace/[id]/install.ts +2 -0
  721. package/src/astro/routes/api/admin/plugins/registry/[id]/update.ts +2 -0
  722. package/src/astro/routes/api/admin/plugins/registry/install.ts +2 -0
  723. package/src/astro/routes/api/admin/plugins/updates.ts +2 -4
  724. package/src/astro/routes/api/auth/mode.ts +6 -14
  725. package/src/astro/routes/api/auth/oauth/[provider]/callback.ts +21 -4
  726. package/src/astro/routes/api/auth/oauth/[provider].ts +24 -6
  727. package/src/astro/routes/api/content/[collection]/[id]/compare.ts +3 -4
  728. package/src/astro/routes/api/content/[collection]/[id]/duplicate.ts +2 -3
  729. package/src/astro/routes/api/content/[collection]/[id]/permanent.ts +2 -3
  730. package/src/astro/routes/api/content/[collection]/[id]/preview-url.ts +3 -4
  731. package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/children.ts +4 -6
  732. package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/parents.ts +2 -3
  733. package/src/astro/routes/api/content/[collection]/[id]/revisions.ts +3 -4
  734. package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +4 -6
  735. package/src/astro/routes/api/content/[collection]/[id]/translations.ts +3 -4
  736. package/src/astro/routes/api/content/[collection]/[id].ts +3 -4
  737. package/src/astro/routes/api/content/[collection]/authors.ts +2 -3
  738. package/src/astro/routes/api/content/[collection]/index.ts +6 -8
  739. package/src/astro/routes/api/content/[collection]/trash.ts +2 -3
  740. package/src/astro/routes/api/manifest.ts +2 -9
  741. package/src/astro/routes/api/mcp.ts +2 -1
  742. package/src/astro/routes/api/media/[id]/usage.ts +30 -0
  743. package/src/astro/routes/api/media/[id].ts +17 -6
  744. package/src/astro/routes/api/media/file/[...key].ts +8 -0
  745. package/src/astro/routes/api/media.ts +21 -2
  746. package/src/astro/routes/api/oauth/authorize.ts +2 -6
  747. package/src/astro/routes/api/plugins/[pluginId]/[...path].ts +17 -3
  748. package/src/astro/routes/api/settings/backups/archives/[name].ts +78 -0
  749. package/src/astro/routes/api/settings/backups/archives/index.ts +33 -0
  750. package/src/astro/routes/api/settings/backups/export.ts +43 -0
  751. package/src/astro/routes/api/settings/backups/index.ts +76 -0
  752. package/src/astro/routes/api/setup/admin-verify.ts +8 -4
  753. package/src/astro/routes/api/setup/admin.ts +11 -4
  754. package/src/astro/routes/api/well-known/oauth-authorization-server.ts +4 -1
  755. package/src/astro/routes/api/well-known/oauth-protected-resource.ts +5 -1
  756. package/src/astro/types.ts +48 -2
  757. package/src/auth/api-tokens.ts +1 -0
  758. package/src/auth/oauth-state-store.ts +3 -0
  759. package/src/auth/providers/github-admin.tsx +5 -6
  760. package/src/auth/providers/google-admin.tsx +5 -6
  761. package/src/auth/scopes.ts +3 -9
  762. package/src/cli/client-factory.ts +0 -1
  763. package/src/cli/commands/bundle-utils.ts +50 -1
  764. package/src/cli/commands/bundle.ts +9 -2
  765. package/src/cli/commands/media.ts +127 -0
  766. package/src/client/index.ts +84 -2
  767. package/src/client/transport.ts +1 -1
  768. package/src/components/EmDashHead.astro +4 -8
  769. package/src/components/InlinePortableTextEditor.tsx +56 -35
  770. package/src/components/marks/Link.astro +5 -1
  771. package/src/database/dialect-helpers.ts +77 -3
  772. package/src/database/migrations/051_content_taxonomies_denorm.ts +120 -0
  773. package/src/database/migrations/052_media_usage_read_index.ts +26 -0
  774. package/src/database/migrations/053_plugin_mcp_tools.ts +21 -0
  775. package/src/database/migrations/runner.ts +6 -0
  776. package/src/database/repositories/audit.ts +2 -1
  777. package/src/database/repositories/content.ts +98 -16
  778. package/src/database/repositories/media-usage.ts +250 -1
  779. package/src/database/repositories/plugin-storage.ts +29 -32
  780. package/src/database/repositories/redirect.ts +14 -2
  781. package/src/database/repositories/taxonomy.ts +57 -8
  782. package/src/database/types.ts +23 -0
  783. package/src/db/adapters.ts +9 -0
  784. package/src/emdash-runtime.ts +310 -66
  785. package/src/loader.ts +292 -1
  786. package/src/mcp/server.ts +222 -5
  787. package/src/media/image-endpoint.ts +38 -2
  788. package/src/page/metadata.ts +27 -0
  789. package/src/plugin-types.ts +19 -0
  790. package/src/plugin-utils.ts +8 -6
  791. package/src/plugins/adapt-sandbox-entry.ts +30 -1
  792. package/src/plugins/context.ts +7 -0
  793. package/src/plugins/define-plugin.ts +16 -0
  794. package/src/plugins/manifest-schema.ts +28 -1
  795. package/src/plugins/routes.ts +27 -1
  796. package/src/plugins/sandbox/runner-options.ts +16 -0
  797. package/src/plugins/sandbox/types.ts +6 -1
  798. package/src/plugins/state.ts +17 -1
  799. package/src/plugins/storage-query.ts +67 -33
  800. package/src/plugins/types.ts +41 -0
  801. package/src/schema/registry.ts +141 -5
  802. package/src/seed/apply.ts +28 -29
  803. package/src/seo/index.ts +19 -4
  804. package/src/storage/types.ts +6 -0
  805. package/src/utils/base64.ts +7 -2
  806. package/src/utils/db-errors.ts +3 -1
  807. package/src/virtual-modules.d.ts +13 -0
  808. package/src/visual-editing/toolbar.ts +1 -1
  809. package/dist/adapters-DPAkL6QF.d.mts.map +0 -1
  810. package/dist/api-DVbHNApo.mjs.map +0 -1
  811. package/dist/api-tokens-Dk2GrJMY.mjs +0 -3
  812. package/dist/apply-D23iUV4q.mjs.map +0 -1
  813. package/dist/authorize-BmCwQCib.mjs.map +0 -1
  814. package/dist/base64-C74Msx8h.mjs.map +0 -1
  815. package/dist/content-BO61Sx4j.mjs.map +0 -1
  816. package/dist/content-refresh-BkkApzeS.mjs.map +0 -1
  817. package/dist/context-DtSFYFuS.mjs.map +0 -1
  818. package/dist/db-errors-BKuXh_fi.mjs.map +0 -1
  819. package/dist/device-flow-CPXQ_QfW.mjs.map +0 -1
  820. package/dist/error-CfJMLSkd.mjs.map +0 -1
  821. package/dist/index-BXOCyLj0.d.mts.map +0 -1
  822. package/dist/loader-Rb8QlGZp.mjs.map +0 -1
  823. package/dist/manifest-schema-DeGNma2O.mjs.map +0 -1
  824. package/dist/menus-BtvH7Z7t.mjs.map +0 -1
  825. package/dist/oauth-authorization-BWqWTHBK.mjs.map +0 -1
  826. package/dist/public-url-C0cEvrRu.mjs.map +0 -1
  827. package/dist/redirect-Ch3E98qZ.mjs.map +0 -1
  828. package/dist/redirects-CeD7K7EX.mjs.map +0 -1
  829. package/dist/registry-CyIXPi4E.mjs.map +0 -1
  830. package/dist/relations-CbBpoOys.d.mts.map +0 -1
  831. package/dist/runner-jt65bF7F.mjs.map +0 -1
  832. package/dist/scheduled-publish-DlJHGcuL.d.mts +0 -11
  833. package/dist/scheduled-publish-DlJHGcuL.d.mts.map +0 -1
  834. package/dist/taxonomy-BkxbUMSw.mjs.map +0 -1
  835. package/dist/types-CtDVagM4.d.mts.map +0 -1
  836. package/dist/types-momGysZk.d.mts.map +0 -1
  837. package/dist/version-BlIJvNAZ.mjs +0 -7
  838. /package/dist/{ssrf-B5DOv5E5.mjs → ssrf-BB__xfNM.mjs} +0 -0
  839. /package/dist/{types-DeCZBZxn.mjs → types-CK0LxPUQ.mjs} +0 -0
@@ -1,15 +1,16 @@
1
1
  import "../../../../../after-B1IIdH3Y.mjs";
2
2
  import "../../../../../object-cache-Bok5j2ae.mjs";
3
- import "../../../../../base64-C74Msx8h.mjs";
4
- import "../../../../../types-Ch8pFMEm.mjs";
5
- import { o as handleMenuItemReorder } from "../../../../../menus-BpfevlJD.mjs";
6
- import { a as unwrapResult, r as handleError } from "../../../../../error-CfJMLSkd.mjs";
7
- import { i as parseQuery, n as parseBody, t as isParseError } from "../../../../../parse-GLksnn-B.mjs";
8
- import { st as reorderMenuItemsBody, zn as localeFilterQuery } from "../../../../../redirects-CeD7K7EX.mjs";
9
- import "../../../../../relations-BmBmX4Eb.mjs";
10
- import "../../../../../status-D3Gy1Zc6.mjs";
3
+ import "../../../../../base64-B-PsqheR.mjs";
4
+ import "../../../../../types-D1iJ3DpO.mjs";
5
+ import { o as handleMenuItemReorder } from "../../../../../menus-CZyG6rvx.mjs";
6
+ import { a as unwrapResult, r as handleError } from "../../../../../error-CEGF6UZb.mjs";
7
+ import { i as parseQuery, n as parseBody, t as isParseError } from "../../../../../parse-C_-6klII.mjs";
8
+ import { z as localeFilterQuery } from "../../../../../media-kIV1IxFf.mjs";
9
+ import { st as reorderMenuItemsBody } from "../../../../../redirects-BBq3n2Rj.mjs";
10
+ import "../../../../../relations-5_avdrN_.mjs";
11
+ import "../../../../../status-COfycGIU.mjs";
11
12
  import "../../../../../api/schemas/index.mjs";
12
- import { n as requirePerm } from "../../../../../authorize-BmCwQCib.mjs";
13
+ import { r as requirePerm } from "../../../../../authorize-WxsiePzy.mjs";
13
14
 
14
15
  //#region src/astro/routes/api/menus/[name]/reorder.ts
15
16
  const prerender = false;
@@ -1 +1 @@
1
- {"version":3,"file":"reorder.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/menus/[name]/reorder.ts"],"sourcesContent":["/**\n * Menu items reorder endpoint\n *\n * POST /_emdash/api/menus/:name/reorder - Batch update positions\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { handleError, unwrapResult } from \"#api/error.js\";\nimport { handleMenuItemReorder } from \"#api/handlers/menus.js\";\nimport { isParseError, parseBody, parseQuery } from \"#api/parse.js\";\nimport { localeFilterQuery, reorderMenuItemsBody } from \"#api/schemas.js\";\n\nexport const prerender = false;\n\nexport const POST: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst name = params.name!;\n\n\tconst denied = requirePerm(user, \"menus:manage\");\n\tif (denied) return denied;\n\n\tconst localeQ = parseQuery(new URL(request.url), localeFilterQuery);\n\tif (isParseError(localeQ)) return localeQ;\n\n\ttry {\n\t\tconst body = await parseBody(request, reorderMenuItemsBody);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst result = await handleMenuItemReorder(emdash.db, name, body.items, {\n\t\t\tlocale: localeQ.locale,\n\t\t});\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to reorder menu items\", \"MENU_REORDER_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;AAcA,MAAa,YAAY;AAEzB,MAAa,OAAiB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACpE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,OAAO,OAAO;CAEpB,MAAM,SAAS,YAAY,MAAM,eAAe;AAChD,KAAI,OAAQ,QAAO;CAEnB,MAAM,UAAU,WAAW,IAAI,IAAI,QAAQ,IAAI,EAAE,kBAAkB;AACnE,KAAI,aAAa,QAAQ,CAAE,QAAO;AAElC,KAAI;EACH,MAAM,OAAO,MAAM,UAAU,SAAS,qBAAqB;AAC3D,MAAI,aAAa,KAAK,CAAE,QAAO;AAK/B,SAAO,aAHQ,MAAM,sBAAsB,OAAO,IAAI,MAAM,KAAK,OAAO,EACvE,QAAQ,QAAQ,QAChB,CAAC,CACyB;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,gCAAgC,qBAAqB"}
1
+ {"version":3,"file":"reorder.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/menus/[name]/reorder.ts"],"sourcesContent":["/**\n * Menu items reorder endpoint\n *\n * POST /_emdash/api/menus/:name/reorder - Batch update positions\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { handleError, unwrapResult } from \"#api/error.js\";\nimport { handleMenuItemReorder } from \"#api/handlers/menus.js\";\nimport { isParseError, parseBody, parseQuery } from \"#api/parse.js\";\nimport { localeFilterQuery, reorderMenuItemsBody } from \"#api/schemas.js\";\n\nexport const prerender = false;\n\nexport const POST: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst name = params.name!;\n\n\tconst denied = requirePerm(user, \"menus:manage\");\n\tif (denied) return denied;\n\n\tconst localeQ = parseQuery(new URL(request.url), localeFilterQuery);\n\tif (isParseError(localeQ)) return localeQ;\n\n\ttry {\n\t\tconst body = await parseBody(request, reorderMenuItemsBody);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst result = await handleMenuItemReorder(emdash.db, name, body.items, {\n\t\t\tlocale: localeQ.locale,\n\t\t});\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to reorder menu items\", \"MENU_REORDER_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;;AAcA,MAAa,YAAY;AAEzB,MAAa,OAAiB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACpE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,OAAO,OAAO;CAEpB,MAAM,SAAS,YAAY,MAAM,eAAe;AAChD,KAAI,OAAQ,QAAO;CAEnB,MAAM,UAAU,WAAW,IAAI,IAAI,QAAQ,IAAI,EAAE,kBAAkB;AACnE,KAAI,aAAa,QAAQ,CAAE,QAAO;AAElC,KAAI;EACH,MAAM,OAAO,MAAM,UAAU,SAAS,qBAAqB;AAC3D,MAAI,aAAa,KAAK,CAAE,QAAO;AAK/B,SAAO,aAHQ,MAAM,sBAAsB,OAAO,IAAI,MAAM,KAAK,OAAO,EACvE,QAAQ,QAAQ,QAChB,CAAC,CACyB;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,gCAAgC,qBAAqB"}
@@ -1,15 +1,16 @@
1
1
  import "../../../../../after-B1IIdH3Y.mjs";
2
2
  import "../../../../../object-cache-Bok5j2ae.mjs";
3
- import "../../../../../base64-C74Msx8h.mjs";
4
- import "../../../../../types-Ch8pFMEm.mjs";
5
- import { l as handleMenuTranslations, r as handleMenuGet, t as handleMenuCreate } from "../../../../../menus-BpfevlJD.mjs";
6
- import { a as unwrapResult, i as requireDb, r as handleError } from "../../../../../error-CfJMLSkd.mjs";
7
- import { i as parseQuery, n as parseBody, t as isParseError } from "../../../../../parse-GLksnn-B.mjs";
8
- import { zn as localeFilterQuery } from "../../../../../redirects-CeD7K7EX.mjs";
9
- import "../../../../../relations-BmBmX4Eb.mjs";
10
- import "../../../../../status-D3Gy1Zc6.mjs";
3
+ import "../../../../../base64-B-PsqheR.mjs";
4
+ import "../../../../../types-D1iJ3DpO.mjs";
5
+ import { l as handleMenuTranslations, r as handleMenuGet, t as handleMenuCreate } from "../../../../../menus-CZyG6rvx.mjs";
6
+ import { a as unwrapResult, i as requireDb, r as handleError } from "../../../../../error-CEGF6UZb.mjs";
7
+ import { i as parseQuery, n as parseBody, t as isParseError } from "../../../../../parse-C_-6klII.mjs";
8
+ import { z as localeFilterQuery } from "../../../../../media-kIV1IxFf.mjs";
9
+ import "../../../../../redirects-BBq3n2Rj.mjs";
10
+ import "../../../../../relations-5_avdrN_.mjs";
11
+ import "../../../../../status-COfycGIU.mjs";
11
12
  import "../../../../../api/schemas/index.mjs";
12
- import { n as requirePerm } from "../../../../../authorize-BmCwQCib.mjs";
13
+ import { r as requirePerm } from "../../../../../authorize-WxsiePzy.mjs";
13
14
  import { z } from "zod";
14
15
 
15
16
  //#region src/astro/routes/api/menus/[name]/translations.ts
@@ -1 +1 @@
1
- {"version":3,"file":"translations.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/menus/[name]/translations.ts"],"sourcesContent":["/**\n * Menu translation endpoints\n *\n * GET /_emdash/api/menus/:name/translations — list translations for a menu (uses any locale row)\n * POST /_emdash/api/menus/:name/translations — create a new locale translation (body: { locale, label })\n */\n\nimport type { APIRoute } from \"astro\";\nimport { z } from \"zod\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { handleError, requireDb, unwrapResult } from \"#api/error.js\";\nimport { handleMenuCreate, handleMenuGet, handleMenuTranslations } from \"#api/handlers/menus.js\";\nimport { isParseError, parseBody, parseQuery } from \"#api/parse.js\";\nimport { localeFilterQuery } from \"#api/schemas.js\";\n\nexport const prerender = false;\n\nconst createTranslationBody = z\n\t.object({\n\t\tlocale: z.string().min(1),\n\t\tlabel: z.string().min(1).optional(),\n\t})\n\t.meta({ id: \"CreateMenuTranslationBody\" });\n\nexport const GET: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst name = params.name!;\n\n\tconst dbErr = requireDb(emdash?.db);\n\tif (dbErr) return dbErr;\n\n\tconst denied = requirePerm(user, \"menus:read\");\n\tif (denied) return denied;\n\n\tconst localeQ = parseQuery(new URL(request.url), localeFilterQuery);\n\tif (isParseError(localeQ)) return localeQ;\n\n\ttry {\n\t\t// Look up any menu row matching the name so we can get its translation_group.\n\t\tconst anchor = await handleMenuGet(emdash.db, name, { locale: localeQ.locale });\n\t\tif (!anchor.success) return unwrapResult(anchor);\n\t\tconst result = await handleMenuTranslations(emdash.db, anchor.data.id);\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to fetch menu translations\", \"MENU_TRANSLATIONS_ERROR\");\n\t}\n};\n\nexport const POST: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst name = params.name!;\n\n\tconst dbErr = requireDb(emdash?.db);\n\tif (dbErr) return dbErr;\n\n\tconst denied = requirePerm(user, \"menus:manage\");\n\tif (denied) return denied;\n\n\tconst localeQ = parseQuery(new URL(request.url), localeFilterQuery);\n\tif (isParseError(localeQ)) return localeQ;\n\n\ttry {\n\t\tconst body = await parseBody(request, createTranslationBody);\n\t\tif (isParseError(body)) return body;\n\n\t\t// Resolve the source menu (either by explicit locale in query, or the\n\t\t// first matching row). Its id becomes the `translationOf` for the new row.\n\t\tconst source = await handleMenuGet(emdash.db, name, { locale: localeQ.locale });\n\t\tif (!source.success) return unwrapResult(source);\n\n\t\tconst result = await handleMenuCreate(emdash.db, {\n\t\t\tname,\n\t\t\tlabel: body.label ?? source.data.label,\n\t\t\tlocale: body.locale,\n\t\t\ttranslationOf: source.data.id,\n\t\t});\n\t\treturn unwrapResult(result, 201);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to create menu translation\", \"MENU_TRANSLATION_CREATE_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,MAAa,YAAY;AAEzB,MAAM,wBAAwB,EAC5B,OAAO;CACP,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE;CACzB,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;CACnC,CAAC,CACD,KAAK,EAAE,IAAI,6BAA6B,CAAC;AAE3C,MAAa,MAAgB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACnE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,OAAO,OAAO;CAEpB,MAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,KAAI,MAAO,QAAO;CAElB,MAAM,SAAS,YAAY,MAAM,aAAa;AAC9C,KAAI,OAAQ,QAAO;CAEnB,MAAM,UAAU,WAAW,IAAI,IAAI,QAAQ,IAAI,EAAE,kBAAkB;AACnE,KAAI,aAAa,QAAQ,CAAE,QAAO;AAElC,KAAI;EAEH,MAAM,SAAS,MAAM,cAAc,OAAO,IAAI,MAAM,EAAE,QAAQ,QAAQ,QAAQ,CAAC;AAC/E,MAAI,CAAC,OAAO,QAAS,QAAO,aAAa,OAAO;AAEhD,SAAO,aADQ,MAAM,uBAAuB,OAAO,IAAI,OAAO,KAAK,GAAG,CAC3C;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,qCAAqC,0BAA0B;;;AAI3F,MAAa,OAAiB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACpE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,OAAO,OAAO;CAEpB,MAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,KAAI,MAAO,QAAO;CAElB,MAAM,SAAS,YAAY,MAAM,eAAe;AAChD,KAAI,OAAQ,QAAO;CAEnB,MAAM,UAAU,WAAW,IAAI,IAAI,QAAQ,IAAI,EAAE,kBAAkB;AACnE,KAAI,aAAa,QAAQ,CAAE,QAAO;AAElC,KAAI;EACH,MAAM,OAAO,MAAM,UAAU,SAAS,sBAAsB;AAC5D,MAAI,aAAa,KAAK,CAAE,QAAO;EAI/B,MAAM,SAAS,MAAM,cAAc,OAAO,IAAI,MAAM,EAAE,QAAQ,QAAQ,QAAQ,CAAC;AAC/E,MAAI,CAAC,OAAO,QAAS,QAAO,aAAa,OAAO;AAQhD,SAAO,aANQ,MAAM,iBAAiB,OAAO,IAAI;GAChD;GACA,OAAO,KAAK,SAAS,OAAO,KAAK;GACjC,QAAQ,KAAK;GACb,eAAe,OAAO,KAAK;GAC3B,CAAC,EAC0B,IAAI;UACxB,OAAO;AACf,SAAO,YAAY,OAAO,qCAAqC,gCAAgC"}
1
+ {"version":3,"file":"translations.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/menus/[name]/translations.ts"],"sourcesContent":["/**\n * Menu translation endpoints\n *\n * GET /_emdash/api/menus/:name/translations — list translations for a menu (uses any locale row)\n * POST /_emdash/api/menus/:name/translations — create a new locale translation (body: { locale, label })\n */\n\nimport type { APIRoute } from \"astro\";\nimport { z } from \"zod\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { handleError, requireDb, unwrapResult } from \"#api/error.js\";\nimport { handleMenuCreate, handleMenuGet, handleMenuTranslations } from \"#api/handlers/menus.js\";\nimport { isParseError, parseBody, parseQuery } from \"#api/parse.js\";\nimport { localeFilterQuery } from \"#api/schemas.js\";\n\nexport const prerender = false;\n\nconst createTranslationBody = z\n\t.object({\n\t\tlocale: z.string().min(1),\n\t\tlabel: z.string().min(1).optional(),\n\t})\n\t.meta({ id: \"CreateMenuTranslationBody\" });\n\nexport const GET: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst name = params.name!;\n\n\tconst dbErr = requireDb(emdash?.db);\n\tif (dbErr) return dbErr;\n\n\tconst denied = requirePerm(user, \"menus:read\");\n\tif (denied) return denied;\n\n\tconst localeQ = parseQuery(new URL(request.url), localeFilterQuery);\n\tif (isParseError(localeQ)) return localeQ;\n\n\ttry {\n\t\t// Look up any menu row matching the name so we can get its translation_group.\n\t\tconst anchor = await handleMenuGet(emdash.db, name, { locale: localeQ.locale });\n\t\tif (!anchor.success) return unwrapResult(anchor);\n\t\tconst result = await handleMenuTranslations(emdash.db, anchor.data.id);\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to fetch menu translations\", \"MENU_TRANSLATIONS_ERROR\");\n\t}\n};\n\nexport const POST: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst name = params.name!;\n\n\tconst dbErr = requireDb(emdash?.db);\n\tif (dbErr) return dbErr;\n\n\tconst denied = requirePerm(user, \"menus:manage\");\n\tif (denied) return denied;\n\n\tconst localeQ = parseQuery(new URL(request.url), localeFilterQuery);\n\tif (isParseError(localeQ)) return localeQ;\n\n\ttry {\n\t\tconst body = await parseBody(request, createTranslationBody);\n\t\tif (isParseError(body)) return body;\n\n\t\t// Resolve the source menu (either by explicit locale in query, or the\n\t\t// first matching row). Its id becomes the `translationOf` for the new row.\n\t\tconst source = await handleMenuGet(emdash.db, name, { locale: localeQ.locale });\n\t\tif (!source.success) return unwrapResult(source);\n\n\t\tconst result = await handleMenuCreate(emdash.db, {\n\t\t\tname,\n\t\t\tlabel: body.label ?? source.data.label,\n\t\t\tlocale: body.locale,\n\t\t\ttranslationOf: source.data.id,\n\t\t});\n\t\treturn unwrapResult(result, 201);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to create menu translation\", \"MENU_TRANSLATION_CREATE_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAgBA,MAAa,YAAY;AAEzB,MAAM,wBAAwB,EAC5B,OAAO;CACP,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE;CACzB,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;CACnC,CAAC,CACD,KAAK,EAAE,IAAI,6BAA6B,CAAC;AAE3C,MAAa,MAAgB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACnE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,OAAO,OAAO;CAEpB,MAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,KAAI,MAAO,QAAO;CAElB,MAAM,SAAS,YAAY,MAAM,aAAa;AAC9C,KAAI,OAAQ,QAAO;CAEnB,MAAM,UAAU,WAAW,IAAI,IAAI,QAAQ,IAAI,EAAE,kBAAkB;AACnE,KAAI,aAAa,QAAQ,CAAE,QAAO;AAElC,KAAI;EAEH,MAAM,SAAS,MAAM,cAAc,OAAO,IAAI,MAAM,EAAE,QAAQ,QAAQ,QAAQ,CAAC;AAC/E,MAAI,CAAC,OAAO,QAAS,QAAO,aAAa,OAAO;AAEhD,SAAO,aADQ,MAAM,uBAAuB,OAAO,IAAI,OAAO,KAAK,GAAG,CAC3C;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,qCAAqC,0BAA0B;;;AAI3F,MAAa,OAAiB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACpE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,OAAO,OAAO;CAEpB,MAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,KAAI,MAAO,QAAO;CAElB,MAAM,SAAS,YAAY,MAAM,eAAe;AAChD,KAAI,OAAQ,QAAO;CAEnB,MAAM,UAAU,WAAW,IAAI,IAAI,QAAQ,IAAI,EAAE,kBAAkB;AACnE,KAAI,aAAa,QAAQ,CAAE,QAAO;AAElC,KAAI;EACH,MAAM,OAAO,MAAM,UAAU,SAAS,sBAAsB;AAC5D,MAAI,aAAa,KAAK,CAAE,QAAO;EAI/B,MAAM,SAAS,MAAM,cAAc,OAAO,IAAI,MAAM,EAAE,QAAQ,QAAQ,QAAQ,CAAC;AAC/E,MAAI,CAAC,OAAO,QAAS,QAAO,aAAa,OAAO;AAQhD,SAAO,aANQ,MAAM,iBAAiB,OAAO,IAAI;GAChD;GACA,OAAO,KAAK,SAAS,OAAO,KAAK;GACjC,QAAQ,KAAK;GACb,eAAe,OAAO,KAAK;GAC3B,CAAC,EAC0B,IAAI;UACxB,OAAO;AACf,SAAO,YAAY,OAAO,qCAAqC,gCAAgC"}
@@ -1,15 +1,16 @@
1
1
  import "../../../../after-B1IIdH3Y.mjs";
2
2
  import "../../../../object-cache-Bok5j2ae.mjs";
3
- import "../../../../base64-C74Msx8h.mjs";
4
- import "../../../../types-Ch8pFMEm.mjs";
5
- import { n as handleMenuDelete, r as handleMenuGet, u as handleMenuUpdate } from "../../../../menus-BpfevlJD.mjs";
6
- import { a as unwrapResult, r as handleError } from "../../../../error-CfJMLSkd.mjs";
7
- import { i as parseQuery, n as parseBody, t as isParseError } from "../../../../parse-GLksnn-B.mjs";
8
- import { ct as updateMenuBody, zn as localeFilterQuery } from "../../../../redirects-CeD7K7EX.mjs";
9
- import "../../../../relations-BmBmX4Eb.mjs";
10
- import "../../../../status-D3Gy1Zc6.mjs";
3
+ import "../../../../base64-B-PsqheR.mjs";
4
+ import "../../../../types-D1iJ3DpO.mjs";
5
+ import { n as handleMenuDelete, r as handleMenuGet, u as handleMenuUpdate } from "../../../../menus-CZyG6rvx.mjs";
6
+ import { a as unwrapResult, r as handleError } from "../../../../error-CEGF6UZb.mjs";
7
+ import { i as parseQuery, n as parseBody, t as isParseError } from "../../../../parse-C_-6klII.mjs";
8
+ import { z as localeFilterQuery } from "../../../../media-kIV1IxFf.mjs";
9
+ import { ct as updateMenuBody } from "../../../../redirects-BBq3n2Rj.mjs";
10
+ import "../../../../relations-5_avdrN_.mjs";
11
+ import "../../../../status-COfycGIU.mjs";
11
12
  import "../../../../api/schemas/index.mjs";
12
- import { n as requirePerm } from "../../../../authorize-BmCwQCib.mjs";
13
+ import { r as requirePerm } from "../../../../authorize-WxsiePzy.mjs";
13
14
 
14
15
  //#region src/astro/routes/api/menus/[name].ts
15
16
  const prerender = false;
@@ -1 +1 @@
1
- {"version":3,"file":"_name_.mjs","names":[],"sources":["../../../../../src/astro/routes/api/menus/[name].ts"],"sourcesContent":["/**\n * Single menu endpoint\n *\n * GET /_emdash/api/menus/:name[?locale=xx]\n * PUT /_emdash/api/menus/:name[?locale=xx]\n * DELETE /_emdash/api/menus/:name[?locale=xx]\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { handleError, unwrapResult } from \"#api/error.js\";\nimport { handleMenuDelete, handleMenuGet, handleMenuUpdate } from \"#api/handlers/menus.js\";\nimport { isParseError, parseBody, parseQuery } from \"#api/parse.js\";\nimport { localeFilterQuery, updateMenuBody } from \"#api/schemas.js\";\n\nexport const prerender = false;\n\nexport const GET: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst name = params.name!;\n\n\tconst denied = requirePerm(user, \"menus:read\");\n\tif (denied) return denied;\n\n\tconst query = parseQuery(new URL(request.url), localeFilterQuery);\n\tif (isParseError(query)) return query;\n\n\ttry {\n\t\tconst result = await handleMenuGet(emdash.db, name, { locale: query.locale });\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to fetch menu\", \"MENU_GET_ERROR\");\n\t}\n};\n\nexport const PUT: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst name = params.name!;\n\n\tconst denied = requirePerm(user, \"menus:manage\");\n\tif (denied) return denied;\n\n\tconst query = parseQuery(new URL(request.url), localeFilterQuery);\n\tif (isParseError(query)) return query;\n\n\ttry {\n\t\tconst body = await parseBody(request, updateMenuBody);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst result = await handleMenuUpdate(emdash.db, name, { ...body, locale: query.locale });\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to update menu\", \"MENU_UPDATE_ERROR\");\n\t}\n};\n\nexport const DELETE: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst name = params.name!;\n\n\tconst denied = requirePerm(user, \"menus:manage\");\n\tif (denied) return denied;\n\n\tconst query = parseQuery(new URL(request.url), localeFilterQuery);\n\tif (isParseError(query)) return query;\n\n\ttry {\n\t\tconst result = await handleMenuDelete(emdash.db, name, { locale: query.locale });\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to delete menu\", \"MENU_DELETE_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;AAgBA,MAAa,YAAY;AAEzB,MAAa,MAAgB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACnE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,OAAO,OAAO;CAEpB,MAAM,SAAS,YAAY,MAAM,aAAa;AAC9C,KAAI,OAAQ,QAAO;CAEnB,MAAM,QAAQ,WAAW,IAAI,IAAI,QAAQ,IAAI,EAAE,kBAAkB;AACjE,KAAI,aAAa,MAAM,CAAE,QAAO;AAEhC,KAAI;AAEH,SAAO,aADQ,MAAM,cAAc,OAAO,IAAI,MAAM,EAAE,QAAQ,MAAM,QAAQ,CAAC,CAClD;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,wBAAwB,iBAAiB;;;AAIrE,MAAa,MAAgB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACnE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,OAAO,OAAO;CAEpB,MAAM,SAAS,YAAY,MAAM,eAAe;AAChD,KAAI,OAAQ,QAAO;CAEnB,MAAM,QAAQ,WAAW,IAAI,IAAI,QAAQ,IAAI,EAAE,kBAAkB;AACjE,KAAI,aAAa,MAAM,CAAE,QAAO;AAEhC,KAAI;EACH,MAAM,OAAO,MAAM,UAAU,SAAS,eAAe;AACrD,MAAI,aAAa,KAAK,CAAE,QAAO;AAG/B,SAAO,aADQ,MAAM,iBAAiB,OAAO,IAAI,MAAM;GAAE,GAAG;GAAM,QAAQ,MAAM;GAAQ,CAAC,CAC9D;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,yBAAyB,oBAAoB;;;AAIzE,MAAa,SAAmB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACtE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,OAAO,OAAO;CAEpB,MAAM,SAAS,YAAY,MAAM,eAAe;AAChD,KAAI,OAAQ,QAAO;CAEnB,MAAM,QAAQ,WAAW,IAAI,IAAI,QAAQ,IAAI,EAAE,kBAAkB;AACjE,KAAI,aAAa,MAAM,CAAE,QAAO;AAEhC,KAAI;AAEH,SAAO,aADQ,MAAM,iBAAiB,OAAO,IAAI,MAAM,EAAE,QAAQ,MAAM,QAAQ,CAAC,CACrD;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,yBAAyB,oBAAoB"}
1
+ {"version":3,"file":"_name_.mjs","names":[],"sources":["../../../../../src/astro/routes/api/menus/[name].ts"],"sourcesContent":["/**\n * Single menu endpoint\n *\n * GET /_emdash/api/menus/:name[?locale=xx]\n * PUT /_emdash/api/menus/:name[?locale=xx]\n * DELETE /_emdash/api/menus/:name[?locale=xx]\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { handleError, unwrapResult } from \"#api/error.js\";\nimport { handleMenuDelete, handleMenuGet, handleMenuUpdate } from \"#api/handlers/menus.js\";\nimport { isParseError, parseBody, parseQuery } from \"#api/parse.js\";\nimport { localeFilterQuery, updateMenuBody } from \"#api/schemas.js\";\n\nexport const prerender = false;\n\nexport const GET: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst name = params.name!;\n\n\tconst denied = requirePerm(user, \"menus:read\");\n\tif (denied) return denied;\n\n\tconst query = parseQuery(new URL(request.url), localeFilterQuery);\n\tif (isParseError(query)) return query;\n\n\ttry {\n\t\tconst result = await handleMenuGet(emdash.db, name, { locale: query.locale });\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to fetch menu\", \"MENU_GET_ERROR\");\n\t}\n};\n\nexport const PUT: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst name = params.name!;\n\n\tconst denied = requirePerm(user, \"menus:manage\");\n\tif (denied) return denied;\n\n\tconst query = parseQuery(new URL(request.url), localeFilterQuery);\n\tif (isParseError(query)) return query;\n\n\ttry {\n\t\tconst body = await parseBody(request, updateMenuBody);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst result = await handleMenuUpdate(emdash.db, name, { ...body, locale: query.locale });\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to update menu\", \"MENU_UPDATE_ERROR\");\n\t}\n};\n\nexport const DELETE: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst name = params.name!;\n\n\tconst denied = requirePerm(user, \"menus:manage\");\n\tif (denied) return denied;\n\n\tconst query = parseQuery(new URL(request.url), localeFilterQuery);\n\tif (isParseError(query)) return query;\n\n\ttry {\n\t\tconst result = await handleMenuDelete(emdash.db, name, { locale: query.locale });\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to delete menu\", \"MENU_DELETE_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,MAAa,YAAY;AAEzB,MAAa,MAAgB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACnE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,OAAO,OAAO;CAEpB,MAAM,SAAS,YAAY,MAAM,aAAa;AAC9C,KAAI,OAAQ,QAAO;CAEnB,MAAM,QAAQ,WAAW,IAAI,IAAI,QAAQ,IAAI,EAAE,kBAAkB;AACjE,KAAI,aAAa,MAAM,CAAE,QAAO;AAEhC,KAAI;AAEH,SAAO,aADQ,MAAM,cAAc,OAAO,IAAI,MAAM,EAAE,QAAQ,MAAM,QAAQ,CAAC,CAClD;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,wBAAwB,iBAAiB;;;AAIrE,MAAa,MAAgB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACnE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,OAAO,OAAO;CAEpB,MAAM,SAAS,YAAY,MAAM,eAAe;AAChD,KAAI,OAAQ,QAAO;CAEnB,MAAM,QAAQ,WAAW,IAAI,IAAI,QAAQ,IAAI,EAAE,kBAAkB;AACjE,KAAI,aAAa,MAAM,CAAE,QAAO;AAEhC,KAAI;EACH,MAAM,OAAO,MAAM,UAAU,SAAS,eAAe;AACrD,MAAI,aAAa,KAAK,CAAE,QAAO;AAG/B,SAAO,aADQ,MAAM,iBAAiB,OAAO,IAAI,MAAM;GAAE,GAAG;GAAM,QAAQ,MAAM;GAAQ,CAAC,CAC9D;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,yBAAyB,oBAAoB;;;AAIzE,MAAa,SAAmB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACtE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,OAAO,OAAO;CAEpB,MAAM,SAAS,YAAY,MAAM,eAAe;AAChD,KAAI,OAAQ,QAAO;CAEnB,MAAM,QAAQ,WAAW,IAAI,IAAI,QAAQ,IAAI,EAAE,kBAAkB;AACjE,KAAI,aAAa,MAAM,CAAE,QAAO;AAEhC,KAAI;AAEH,SAAO,aADQ,MAAM,iBAAiB,OAAO,IAAI,MAAM,EAAE,QAAQ,MAAM,QAAQ,CAAC,CACrD;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,yBAAyB,oBAAoB"}
@@ -1,15 +1,16 @@
1
1
  import "../../../../after-B1IIdH3Y.mjs";
2
2
  import "../../../../object-cache-Bok5j2ae.mjs";
3
- import "../../../../base64-C74Msx8h.mjs";
4
- import "../../../../types-Ch8pFMEm.mjs";
5
- import { c as handleMenuList, t as handleMenuCreate } from "../../../../menus-BpfevlJD.mjs";
6
- import { a as unwrapResult, r as handleError } from "../../../../error-CfJMLSkd.mjs";
7
- import { i as parseQuery, n as parseBody, t as isParseError } from "../../../../parse-GLksnn-B.mjs";
8
- import { $ as createMenuBody, zn as localeFilterQuery } from "../../../../redirects-CeD7K7EX.mjs";
9
- import "../../../../relations-BmBmX4Eb.mjs";
10
- import "../../../../status-D3Gy1Zc6.mjs";
3
+ import "../../../../base64-B-PsqheR.mjs";
4
+ import "../../../../types-D1iJ3DpO.mjs";
5
+ import { c as handleMenuList, t as handleMenuCreate } from "../../../../menus-CZyG6rvx.mjs";
6
+ import { a as unwrapResult, r as handleError } from "../../../../error-CEGF6UZb.mjs";
7
+ import { i as parseQuery, n as parseBody, t as isParseError } from "../../../../parse-C_-6klII.mjs";
8
+ import { z as localeFilterQuery } from "../../../../media-kIV1IxFf.mjs";
9
+ import { $ as createMenuBody } from "../../../../redirects-BBq3n2Rj.mjs";
10
+ import "../../../../relations-5_avdrN_.mjs";
11
+ import "../../../../status-COfycGIU.mjs";
11
12
  import "../../../../api/schemas/index.mjs";
12
- import { n as requirePerm } from "../../../../authorize-BmCwQCib.mjs";
13
+ import { r as requirePerm } from "../../../../authorize-WxsiePzy.mjs";
13
14
 
14
15
  //#region src/astro/routes/api/menus/index.ts
15
16
  const prerender = false;
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../../../src/astro/routes/api/menus/index.ts"],"sourcesContent":["/**\n * Menus list and create endpoints\n *\n * GET /_emdash/api/menus[?locale=xx] - List menus (optionally filtered by locale)\n * POST /_emdash/api/menus - Create menu (body may include locale & translationOf)\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { handleError, unwrapResult } from \"#api/error.js\";\nimport { handleMenuCreate, handleMenuList } from \"#api/handlers/menus.js\";\nimport { isParseError, parseBody, parseQuery } from \"#api/parse.js\";\nimport { createMenuBody, localeFilterQuery } from \"#api/schemas.js\";\n\nexport const prerender = false;\n\nexport const GET: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tconst denied = requirePerm(user, \"menus:read\");\n\tif (denied) return denied;\n\n\tconst query = parseQuery(new URL(request.url), localeFilterQuery);\n\tif (isParseError(query)) return query;\n\n\ttry {\n\t\tconst result = await handleMenuList(emdash.db, { locale: query.locale });\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to fetch menus\", \"MENU_LIST_ERROR\");\n\t}\n};\n\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tconst denied = requirePerm(user, \"menus:manage\");\n\tif (denied) return denied;\n\n\ttry {\n\t\tconst body = await parseBody(request, createMenuBody);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst result = await handleMenuCreate(emdash.db, body);\n\t\treturn unwrapResult(result, 201);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to create menu\", \"MENU_CREATE_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;AAeA,MAAa,YAAY;AAEzB,MAAa,MAAgB,OAAO,EAAE,SAAS,aAAa;CAC3D,MAAM,EAAE,QAAQ,SAAS;CAEzB,MAAM,SAAS,YAAY,MAAM,aAAa;AAC9C,KAAI,OAAQ,QAAO;CAEnB,MAAM,QAAQ,WAAW,IAAI,IAAI,QAAQ,IAAI,EAAE,kBAAkB;AACjE,KAAI,aAAa,MAAM,CAAE,QAAO;AAEhC,KAAI;AAEH,SAAO,aADQ,MAAM,eAAe,OAAO,IAAI,EAAE,QAAQ,MAAM,QAAQ,CAAC,CAC7C;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,yBAAyB,kBAAkB;;;AAIvE,MAAa,OAAiB,OAAO,EAAE,SAAS,aAAa;CAC5D,MAAM,EAAE,QAAQ,SAAS;CAEzB,MAAM,SAAS,YAAY,MAAM,eAAe;AAChD,KAAI,OAAQ,QAAO;AAEnB,KAAI;EACH,MAAM,OAAO,MAAM,UAAU,SAAS,eAAe;AACrD,MAAI,aAAa,KAAK,CAAE,QAAO;AAG/B,SAAO,aADQ,MAAM,iBAAiB,OAAO,IAAI,KAAK,EAC1B,IAAI;UACxB,OAAO;AACf,SAAO,YAAY,OAAO,yBAAyB,oBAAoB"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../../src/astro/routes/api/menus/index.ts"],"sourcesContent":["/**\n * Menus list and create endpoints\n *\n * GET /_emdash/api/menus[?locale=xx] - List menus (optionally filtered by locale)\n * POST /_emdash/api/menus - Create menu (body may include locale & translationOf)\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { handleError, unwrapResult } from \"#api/error.js\";\nimport { handleMenuCreate, handleMenuList } from \"#api/handlers/menus.js\";\nimport { isParseError, parseBody, parseQuery } from \"#api/parse.js\";\nimport { createMenuBody, localeFilterQuery } from \"#api/schemas.js\";\n\nexport const prerender = false;\n\nexport const GET: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tconst denied = requirePerm(user, \"menus:read\");\n\tif (denied) return denied;\n\n\tconst query = parseQuery(new URL(request.url), localeFilterQuery);\n\tif (isParseError(query)) return query;\n\n\ttry {\n\t\tconst result = await handleMenuList(emdash.db, { locale: query.locale });\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to fetch menus\", \"MENU_LIST_ERROR\");\n\t}\n};\n\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tconst denied = requirePerm(user, \"menus:manage\");\n\tif (denied) return denied;\n\n\ttry {\n\t\tconst body = await parseBody(request, createMenuBody);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst result = await handleMenuCreate(emdash.db, body);\n\t\treturn unwrapResult(result, 201);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to create menu\", \"MENU_CREATE_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;;AAeA,MAAa,YAAY;AAEzB,MAAa,MAAgB,OAAO,EAAE,SAAS,aAAa;CAC3D,MAAM,EAAE,QAAQ,SAAS;CAEzB,MAAM,SAAS,YAAY,MAAM,aAAa;AAC9C,KAAI,OAAQ,QAAO;CAEnB,MAAM,QAAQ,WAAW,IAAI,IAAI,QAAQ,IAAI,EAAE,kBAAkB;AACjE,KAAI,aAAa,MAAM,CAAE,QAAO;AAEhC,KAAI;AAEH,SAAO,aADQ,MAAM,eAAe,OAAO,IAAI,EAAE,QAAQ,MAAM,QAAQ,CAAC,CAC7C;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,yBAAyB,kBAAkB;;;AAIvE,MAAa,OAAiB,OAAO,EAAE,SAAS,aAAa;CAC5D,MAAM,EAAE,QAAQ,SAAS;CAEzB,MAAM,SAAS,YAAY,MAAM,eAAe;AAChD,KAAI,OAAQ,QAAO;AAEnB,KAAI;EACH,MAAM,OAAO,MAAM,UAAU,SAAS,eAAe;AACrD,MAAI,aAAa,KAAK,CAAE,QAAO;AAG/B,SAAO,aADQ,MAAM,iBAAiB,OAAO,IAAI,KAAK,EAC1B,IAAI;UACxB,OAAO;AACf,SAAO,YAAY,OAAO,yBAAyB,oBAAoB"}
@@ -1 +1 @@
1
- {"version":3,"file":"authorize.d.mts","names":[],"sources":["../../../../../src/astro/routes/api/oauth/authorize.ts"],"mappings":";;;cA2Ba,SAAA;AAAA,cAwDA,GAAA,EAAK,QAAA;AAAA,cAsGL,IAAA,EAAM,QAAA"}
1
+ {"version":3,"file":"authorize.d.mts","names":[],"sources":["../../../../../src/astro/routes/api/oauth/authorize.ts"],"mappings":";;;cA2Ba,SAAA;AAAA,cAwDA,GAAA,EAAK,QAAA;AAAA,cAkGL,IAAA,EAAM,QAAA"}
@@ -1,9 +1,9 @@
1
- import { n as getPublicOrigin } from "../../../../public-url-C0cEvrRu.mjs";
2
- import { n as VALID_SCOPES } from "../../../../api-tokens-Dk2GrJMY.mjs";
3
- import { t as escapeHtml } from "../../../../escape-r8_GbEU2.mjs";
4
- import { c as validateRedirectUri, o as lookupOAuthClient, s as validateClientRedirectUri } from "../../../../oauth-clients-43_XADoa.mjs";
5
- import "../../../../oauth-user-lookup-Ctgemb0k.mjs";
6
- import { n as handleAuthorizationApproval, t as buildDeniedRedirect } from "../../../../oauth-authorization-BWqWTHBK.mjs";
1
+ import { n as getPublicOrigin } from "../../../../public-url-DSGTnJFw.mjs";
2
+ import { o as isValidScope } from "../../../../api-tokens-Cvmixds7.mjs";
3
+ import { t as escapeHtml } from "../../../../escape-CFedIB1C.mjs";
4
+ import { c as validateRedirectUri, o as lookupOAuthClient, s as validateClientRedirectUri } from "../../../../oauth-clients-BlrUHAsf.mjs";
5
+ import "../../../../oauth-user-lookup-oUllxvAv.mjs";
6
+ import { n as handleAuthorizationApproval, t as buildDeniedRedirect } from "../../../../oauth-authorization-oqfbBuMH.mjs";
7
7
 
8
8
  //#region src/astro/routes/api/oauth/authorize.ts
9
9
  const prerender = false;
@@ -66,8 +66,7 @@ const GET = async ({ url, request, locals }) => {
66
66
  loginUrl.searchParams.set("redirect", url.pathname + url.search);
67
67
  return Response.redirect(loginUrl.toString(), 302);
68
68
  }
69
- const validSet = new Set(VALID_SCOPES);
70
- const requestedScopes = (scope ?? "").split(" ").filter(Boolean).filter((s) => validSet.has(s));
69
+ const requestedScopes = (scope ?? "").split(" ").filter(Boolean).filter(isValidScope);
71
70
  if (requestedScopes.length === 0) return new Response(renderErrorPage("No valid scopes requested."), {
72
71
  status: 400,
73
72
  headers: { "Content-Type": "text/html; charset=utf-8" }
@@ -1 +1 @@
1
- {"version":3,"file":"authorize.mjs","names":[],"sources":["../../../../../src/astro/routes/api/oauth/authorize.ts"],"sourcesContent":["/**\n * GET/POST /_emdash/oauth/authorize\n *\n * OAuth 2.1 Authorization Endpoint. Handles both the consent page (GET)\n * and consent submission (POST).\n *\n * GET: Renders an HTML consent page showing which client is requesting\n * access and which scopes are being requested.\n * POST: Processes the user's decision (approve/deny) and redirects\n * to the client's redirect_uri with an authorization code or error.\n *\n * Requires an authenticated session (not token auth). If unauthenticated,\n * redirects to login with a return URL.\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { escapeHtml } from \"#api/escape.js\";\nimport {\n\tbuildDeniedRedirect,\n\thandleAuthorizationApproval,\n\tvalidateRedirectUri,\n} from \"#api/handlers/oauth-authorization.js\";\nimport { lookupOAuthClient, validateClientRedirectUri } from \"#api/handlers/oauth-clients.js\";\nimport { getPublicOrigin } from \"#api/public-url.js\";\nimport { VALID_SCOPES } from \"#auth/api-tokens.js\";\n\nexport const prerender = false;\n\n// ---------------------------------------------------------------------------\n// CSRF (SEC-18): Double-submit cookie pattern\n// ---------------------------------------------------------------------------\n\nconst CSRF_COOKIE_NAME = \"emdash_oauth_csrf\";\n\n/** Generate a 32-byte random token as hex. */\nfunction generateCsrfToken(): string {\n\tconst bytes = new Uint8Array(32);\n\tcrypto.getRandomValues(bytes);\n\treturn Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\n/** Build the Set-Cookie header value for the CSRF token. */\nfunction csrfCookieHeader(token: string, request: Request, siteUrl?: string): string {\n\t// SameSite=Strict prevents cross-site form submission.\n\t// HttpOnly: the token value is embedded in the form hidden field server-side,\n\t// so JS never needs to read the cookie. HttpOnly adds defense-in-depth.\n\t// Secure is set when:\n\t// - siteUrl is configured and uses https (proxy case — request may be http internally), OR\n\t// - the actual request is over https (non-proxy case, preserve existing behaviour)\n\tconst isSecure = siteUrl\n\t\t? siteUrl.startsWith(\"https:\")\n\t\t: new URL(request.url).protocol === \"https:\";\n\tconst secure = isSecure ? \"; Secure\" : \"\";\n\treturn `${CSRF_COOKIE_NAME}=${token}; Path=/_emdash/oauth/authorize; HttpOnly; SameSite=Strict${secure}`;\n}\n\n/** Extract the CSRF token from the request's cookies. */\nfunction getCsrfCookie(request: Request): string | null {\n\tconst cookieHeader = request.headers.get(\"Cookie\");\n\tif (!cookieHeader) return null;\n\tconst match = cookieHeader.match(new RegExp(`(?:^|;\\\\s*)${CSRF_COOKIE_NAME}=([^;]+)`));\n\treturn match?.[1] ?? null;\n}\n\n// ---------------------------------------------------------------------------\n// Human-readable scope labels\n// ---------------------------------------------------------------------------\n\nconst SCOPE_LABELS: Record<string, string> = {\n\t\"content:read\": \"Read content (posts, pages, etc.)\",\n\t\"content:write\": \"Create, edit, and delete content\",\n\t\"media:read\": \"View media files\",\n\t\"media:write\": \"Upload and manage media files\",\n\t\"schema:read\": \"View collection schemas\",\n\t\"schema:write\": \"Create and modify collection schemas\",\n\tadmin: \"Full administrative access\",\n};\n\n// ---------------------------------------------------------------------------\n// GET: Render consent page\n// ---------------------------------------------------------------------------\n\nexport const GET: APIRoute = async ({ url, request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\t// Validate required OAuth params before rendering\n\tconst clientId = url.searchParams.get(\"client_id\");\n\tconst redirectUri = url.searchParams.get(\"redirect_uri\");\n\tconst responseType = url.searchParams.get(\"response_type\");\n\tconst codeChallenge = url.searchParams.get(\"code_challenge\");\n\tconst codeChallengeMethod = url.searchParams.get(\"code_challenge_method\");\n\tconst scope = url.searchParams.get(\"scope\");\n\tconst state = url.searchParams.get(\"state\");\n\n\t// Basic validation — detailed validation happens on POST\n\tif (!clientId || !redirectUri || responseType !== \"code\" || !codeChallenge) {\n\t\treturn new Response(\n\t\t\trenderErrorPage(\"Invalid authorization request. Missing required parameters.\"),\n\t\t\t{\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t\t},\n\t\t);\n\t}\n\n\tif (codeChallengeMethod && codeChallengeMethod !== \"S256\") {\n\t\treturn new Response(renderErrorPage(\"Only S256 code challenge method is supported.\"), {\n\t\t\tstatus: 400,\n\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t});\n\t}\n\n\t// Validate client_id is registered and redirect_uri is in the allowlist.\n\t// This check happens BEFORE authentication so we never redirect to an\n\t// unregistered URI (even for the login redirect, we only redirect to our\n\t// own login page, not to the client's redirect_uri).\n\tif (emdash?.db) {\n\t\tconst client = await lookupOAuthClient(emdash.db, clientId);\n\t\tif (!client) {\n\t\t\treturn new Response(renderErrorPage(\"Unknown client application.\"), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t\t});\n\t\t}\n\n\t\tconst clientUriError = validateClientRedirectUri(redirectUri, client.redirectUris);\n\t\tif (clientUriError) {\n\t\t\treturn new Response(renderErrorPage(\"The redirect URI is not registered for this client.\"), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t\t});\n\t\t}\n\t}\n\n\t// If not authenticated, redirect to login with return URL\n\tif (!user) {\n\t\tconst loginUrl = new URL(\"/_emdash/admin/login\", getPublicOrigin(url, emdash?.config));\n\t\tloginUrl.searchParams.set(\"redirect\", url.pathname + url.search);\n\t\treturn Response.redirect(loginUrl.toString(), 302);\n\t}\n\n\t// Parse and validate scopes\n\tconst validSet = new Set<string>(VALID_SCOPES);\n\tconst requestedScopes = (scope ?? \"\")\n\t\t.split(\" \")\n\t\t.filter(Boolean)\n\t\t.filter((s) => validSet.has(s));\n\n\tif (requestedScopes.length === 0) {\n\t\treturn new Response(renderErrorPage(\"No valid scopes requested.\"), {\n\t\t\tstatus: 400,\n\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t});\n\t}\n\n\t// SEC-18: Generate CSRF token for the consent form (double-submit cookie pattern)\n\tconst csrfToken = generateCsrfToken();\n\n\t// Render the consent page\n\tconst html = renderConsentPage({\n\t\tclientId,\n\t\tscopes: requestedScopes,\n\t\tredirectUri,\n\t\tresponseType,\n\t\tcodeChallenge,\n\t\tcodeChallengeMethod: codeChallengeMethod ?? \"S256\",\n\t\tstate: state ?? \"\",\n\t\tresource: url.searchParams.get(\"resource\") ?? \"\",\n\t\tuserName: user.name ?? user.email,\n\t\tcsrfToken,\n\t});\n\n\treturn new Response(html, {\n\t\theaders: {\n\t\t\t\"Content-Type\": \"text/html; charset=utf-8\",\n\t\t\t\"Set-Cookie\": csrfCookieHeader(csrfToken, request, getPublicOrigin(url, emdash?.config)),\n\t\t},\n\t});\n};\n\n// ---------------------------------------------------------------------------\n// POST: Process consent\n// ---------------------------------------------------------------------------\n\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tif (!emdash?.db) {\n\t\treturn new Response(renderErrorPage(\"EmDash is not initialized.\"), {\n\t\t\tstatus: 500,\n\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t});\n\t}\n\n\tif (!user) {\n\t\treturn new Response(renderErrorPage(\"Authentication required.\"), {\n\t\t\tstatus: 401,\n\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t});\n\t}\n\n\tconst formData = await request.formData();\n\tconst field = (name: string, fallback = \"\"): string => {\n\t\tconst v = formData.get(name);\n\t\treturn typeof v === \"string\" ? v : fallback;\n\t};\n\n\t// SEC-18: Validate CSRF token (double-submit cookie pattern).\n\t// The form includes a hidden csrf_token field; the cookie has the same value.\n\t// An attacker cannot read the cookie to forge the form field (HttpOnly + SameSite=Strict).\n\tconst formCsrf = field(\"csrf_token\");\n\tconst cookieCsrf = getCsrfCookie(request);\n\tconst csrfError = new Response(\n\t\trenderErrorPage(\"Invalid or missing CSRF token. Please try again.\"),\n\t\t{ status: 403, headers: { \"Content-Type\": \"text/html; charset=utf-8\" } },\n\t);\n\tif (!formCsrf || !cookieCsrf) return csrfError;\n\n\t// Constant-time comparison: hash both values to fixed-length 32-byte digests,\n\t// then XOR every byte pair. This avoids crypto.subtle.timingSafeEqual which is\n\t// a Cloudflare Workers extension and doesn't exist in Node.js.\n\t// The SHA-256 pre-hash ensures fixed length, eliminating length-leaking.\n\tconst csrfEncoder = new TextEncoder();\n\tconst [csrfHashA, csrfHashB] = await Promise.all([\n\t\tcrypto.subtle.digest(\"SHA-256\", csrfEncoder.encode(formCsrf)),\n\t\tcrypto.subtle.digest(\"SHA-256\", csrfEncoder.encode(cookieCsrf)),\n\t]);\n\tconst a = new Uint8Array(csrfHashA);\n\tconst b = new Uint8Array(csrfHashB);\n\tlet diff = 0;\n\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion -- tsgo needs these\n\tfor (let i = 0; i < a.length; i++) diff |= a[i]! ^ b[i]!;\n\tif (diff !== 0) return csrfError;\n\n\tconst action = field(\"action\");\n\tconst redirectUri = field(\"redirect_uri\");\n\tconst state = field(\"state\") || undefined;\n\n\tif (!redirectUri) {\n\t\treturn new Response(renderErrorPage(\"Missing redirect_uri.\"), {\n\t\t\tstatus: 400,\n\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t});\n\t}\n\n\t// Validate redirect_uri scheme/host before using it for any redirect\n\tconst uriError = validateRedirectUri(redirectUri);\n\tif (uriError) {\n\t\treturn new Response(renderErrorPage(escapeHtml(uriError)), {\n\t\t\tstatus: 400,\n\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t});\n\t}\n\n\t// User denied — SEC-44: validate redirect_uri against client's registered URIs\n\t// before redirecting, to prevent open redirect on the deny path.\n\tif (action === \"deny\") {\n\t\tconst clientId = field(\"client_id\");\n\t\tif (!clientId) {\n\t\t\treturn new Response(renderErrorPage(\"Missing client_id.\"), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t\t});\n\t\t}\n\n\t\tconst client = await lookupOAuthClient(emdash.db, clientId);\n\t\tif (!client) {\n\t\t\treturn new Response(renderErrorPage(\"Unknown client application.\"), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t\t});\n\t\t}\n\n\t\tconst clientUriError = validateClientRedirectUri(redirectUri, client.redirectUris);\n\t\tif (clientUriError) {\n\t\t\treturn new Response(renderErrorPage(\"The redirect URI is not registered for this client.\"), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t\t});\n\t\t}\n\n\t\tconst denyUrl = buildDeniedRedirect(redirectUri, state);\n\t\treturn Response.redirect(denyUrl, 302);\n\t}\n\n\t// User approved — process the authorization\n\tconst result = await handleAuthorizationApproval(emdash.db, user.id, user.role, {\n\t\tresponse_type: field(\"response_type\", \"code\"),\n\t\tclient_id: field(\"client_id\"),\n\t\tredirect_uri: redirectUri,\n\t\tscope: field(\"scope\"),\n\t\tstate,\n\t\tcode_challenge: field(\"code_challenge\"),\n\t\tcode_challenge_method: field(\"code_challenge_method\", \"S256\"),\n\t\tresource: field(\"resource\") || undefined,\n\t});\n\n\tif (!result.success) {\n\t\tconst errMsg = result.error?.message ?? \"Authorization failed\";\n\t\t// On error, redirect back with error params — use generic description to avoid\n\t\t// leaking internal error details to the (already-validated) redirect target\n\t\ttry {\n\t\t\tconst errorUrl = new URL(redirectUri);\n\t\t\terrorUrl.searchParams.set(\"error\", \"server_error\");\n\t\t\terrorUrl.searchParams.set(\"error_description\", \"Authorization failed\");\n\t\t\tif (state) errorUrl.searchParams.set(\"state\", state);\n\t\t\treturn Response.redirect(errorUrl.toString(), 302);\n\t\t} catch {\n\t\t\treturn new Response(renderErrorPage(escapeHtml(errMsg)), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t\t});\n\t\t}\n\t}\n\n\treturn Response.redirect(result.data.redirect_url, 302);\n};\n\n// ---------------------------------------------------------------------------\n// HTML rendering\n// ---------------------------------------------------------------------------\n\nfunction renderConsentPage(params: {\n\tclientId: string;\n\tscopes: string[];\n\tredirectUri: string;\n\tresponseType: string;\n\tcodeChallenge: string;\n\tcodeChallengeMethod: string;\n\tstate: string;\n\tresource: string;\n\tuserName: string;\n\tcsrfToken: string;\n}): string {\n\tconst scopeList = params.scopes\n\t\t.map((s) => {\n\t\t\tconst label = SCOPE_LABELS[s] ?? s;\n\t\t\treturn `<li>${escapeHtml(label)}</li>`;\n\t\t})\n\t\t.join(\"\\n\");\n\n\treturn `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Authorize Application — EmDash</title>\n<style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { font-family: system-ui, -apple-system, sans-serif; background: #0a0a0a; color: #e5e5e5; display: flex; justify-content: center; align-items: center; min-height: 100vh; padding: 1rem; }\n .card { background: #171717; border: 1px solid #262626; border-radius: 12px; max-width: 420px; width: 100%; padding: 2rem; }\n h1 { font-size: 1.25rem; font-weight: 600; margin-bottom: 0.5rem; }\n .client-id { color: #a3a3a3; font-size: 0.875rem; word-break: break-all; margin-bottom: 1.5rem; }\n .user { color: #a3a3a3; font-size: 0.875rem; margin-bottom: 1rem; }\n h2 { font-size: 0.875rem; font-weight: 500; color: #a3a3a3; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.75rem; }\n ul { list-style: none; margin-bottom: 1.5rem; }\n li { padding: 0.5rem 0; border-bottom: 1px solid #262626; font-size: 0.875rem; }\n li:last-child { border-bottom: none; }\n .actions { display: flex; gap: 0.75rem; }\n button { flex: 1; padding: 0.625rem 1rem; border-radius: 8px; border: none; font-size: 0.875rem; font-weight: 500; cursor: pointer; }\n .approve { background: #2563eb; color: white; }\n .approve:hover { background: #1d4ed8; }\n .deny { background: #262626; color: #e5e5e5; }\n .deny:hover { background: #333; }\n</style>\n</head>\n<body>\n<div class=\"card\">\n <h1>Authorize Application</h1>\n <p class=\"client-id\">${escapeHtml(params.clientId)}</p>\n <p class=\"user\">Signed in as <strong>${escapeHtml(params.userName)}</strong></p>\n <h2>Permissions requested</h2>\n <ul>${scopeList}</ul>\n <form method=\"POST\">\n <input type=\"hidden\" name=\"csrf_token\" value=\"${escapeHtml(params.csrfToken)}\">\n <input type=\"hidden\" name=\"response_type\" value=\"${escapeHtml(params.responseType)}\">\n <input type=\"hidden\" name=\"client_id\" value=\"${escapeHtml(params.clientId)}\">\n <input type=\"hidden\" name=\"redirect_uri\" value=\"${escapeHtml(params.redirectUri)}\">\n <input type=\"hidden\" name=\"scope\" value=\"${escapeHtml(params.scopes.join(\" \"))}\">\n <input type=\"hidden\" name=\"state\" value=\"${escapeHtml(params.state)}\">\n <input type=\"hidden\" name=\"code_challenge\" value=\"${escapeHtml(params.codeChallenge)}\">\n <input type=\"hidden\" name=\"code_challenge_method\" value=\"${escapeHtml(params.codeChallengeMethod)}\">\n <input type=\"hidden\" name=\"resource\" value=\"${escapeHtml(params.resource)}\">\n <div class=\"actions\">\n <button type=\"submit\" name=\"action\" value=\"deny\" class=\"deny\">Deny</button>\n <button type=\"submit\" name=\"action\" value=\"approve\" class=\"approve\">Approve</button>\n </div>\n </form>\n</div>\n</body>\n</html>`;\n}\n\nfunction renderErrorPage(message: string): string {\n\treturn `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Authorization Error — EmDash</title>\n<style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { font-family: system-ui, -apple-system, sans-serif; background: #0a0a0a; color: #e5e5e5; display: flex; justify-content: center; align-items: center; min-height: 100vh; padding: 1rem; }\n .card { background: #171717; border: 1px solid #262626; border-radius: 12px; max-width: 420px; width: 100%; padding: 2rem; }\n h1 { font-size: 1.25rem; font-weight: 600; margin-bottom: 1rem; color: #ef4444; }\n p { font-size: 0.875rem; color: #a3a3a3; }\n</style>\n</head>\n<body>\n<div class=\"card\">\n <h1>Authorization Error</h1>\n <p>${escapeHtml(message)}</p>\n</div>\n</body>\n</html>`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"authorize.mjs","names":[],"sources":["../../../../../src/astro/routes/api/oauth/authorize.ts"],"sourcesContent":["/**\n * GET/POST /_emdash/oauth/authorize\n *\n * OAuth 2.1 Authorization Endpoint. Handles both the consent page (GET)\n * and consent submission (POST).\n *\n * GET: Renders an HTML consent page showing which client is requesting\n * access and which scopes are being requested.\n * POST: Processes the user's decision (approve/deny) and redirects\n * to the client's redirect_uri with an authorization code or error.\n *\n * Requires an authenticated session (not token auth). If unauthenticated,\n * redirects to login with a return URL.\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { escapeHtml } from \"#api/escape.js\";\nimport {\n\tbuildDeniedRedirect,\n\thandleAuthorizationApproval,\n\tvalidateRedirectUri,\n} from \"#api/handlers/oauth-authorization.js\";\nimport { lookupOAuthClient, validateClientRedirectUri } from \"#api/handlers/oauth-clients.js\";\nimport { getPublicOrigin } from \"#api/public-url.js\";\nimport { isValidScope } from \"#auth/api-tokens.js\";\n\nexport const prerender = false;\n\n// ---------------------------------------------------------------------------\n// CSRF (SEC-18): Double-submit cookie pattern\n// ---------------------------------------------------------------------------\n\nconst CSRF_COOKIE_NAME = \"emdash_oauth_csrf\";\n\n/** Generate a 32-byte random token as hex. */\nfunction generateCsrfToken(): string {\n\tconst bytes = new Uint8Array(32);\n\tcrypto.getRandomValues(bytes);\n\treturn Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\n/** Build the Set-Cookie header value for the CSRF token. */\nfunction csrfCookieHeader(token: string, request: Request, siteUrl?: string): string {\n\t// SameSite=Strict prevents cross-site form submission.\n\t// HttpOnly: the token value is embedded in the form hidden field server-side,\n\t// so JS never needs to read the cookie. HttpOnly adds defense-in-depth.\n\t// Secure is set when:\n\t// - siteUrl is configured and uses https (proxy case — request may be http internally), OR\n\t// - the actual request is over https (non-proxy case, preserve existing behaviour)\n\tconst isSecure = siteUrl\n\t\t? siteUrl.startsWith(\"https:\")\n\t\t: new URL(request.url).protocol === \"https:\";\n\tconst secure = isSecure ? \"; Secure\" : \"\";\n\treturn `${CSRF_COOKIE_NAME}=${token}; Path=/_emdash/oauth/authorize; HttpOnly; SameSite=Strict${secure}`;\n}\n\n/** Extract the CSRF token from the request's cookies. */\nfunction getCsrfCookie(request: Request): string | null {\n\tconst cookieHeader = request.headers.get(\"Cookie\");\n\tif (!cookieHeader) return null;\n\tconst match = cookieHeader.match(new RegExp(`(?:^|;\\\\s*)${CSRF_COOKIE_NAME}=([^;]+)`));\n\treturn match?.[1] ?? null;\n}\n\n// ---------------------------------------------------------------------------\n// Human-readable scope labels\n// ---------------------------------------------------------------------------\n\nconst SCOPE_LABELS: Record<string, string> = {\n\t\"content:read\": \"Read content (posts, pages, etc.)\",\n\t\"content:write\": \"Create, edit, and delete content\",\n\t\"media:read\": \"View media files\",\n\t\"media:write\": \"Upload and manage media files\",\n\t\"schema:read\": \"View collection schemas\",\n\t\"schema:write\": \"Create and modify collection schemas\",\n\tadmin: \"Full administrative access\",\n};\n\n// ---------------------------------------------------------------------------\n// GET: Render consent page\n// ---------------------------------------------------------------------------\n\nexport const GET: APIRoute = async ({ url, request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\t// Validate required OAuth params before rendering\n\tconst clientId = url.searchParams.get(\"client_id\");\n\tconst redirectUri = url.searchParams.get(\"redirect_uri\");\n\tconst responseType = url.searchParams.get(\"response_type\");\n\tconst codeChallenge = url.searchParams.get(\"code_challenge\");\n\tconst codeChallengeMethod = url.searchParams.get(\"code_challenge_method\");\n\tconst scope = url.searchParams.get(\"scope\");\n\tconst state = url.searchParams.get(\"state\");\n\n\t// Basic validation — detailed validation happens on POST\n\tif (!clientId || !redirectUri || responseType !== \"code\" || !codeChallenge) {\n\t\treturn new Response(\n\t\t\trenderErrorPage(\"Invalid authorization request. Missing required parameters.\"),\n\t\t\t{\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t\t},\n\t\t);\n\t}\n\n\tif (codeChallengeMethod && codeChallengeMethod !== \"S256\") {\n\t\treturn new Response(renderErrorPage(\"Only S256 code challenge method is supported.\"), {\n\t\t\tstatus: 400,\n\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t});\n\t}\n\n\t// Validate client_id is registered and redirect_uri is in the allowlist.\n\t// This check happens BEFORE authentication so we never redirect to an\n\t// unregistered URI (even for the login redirect, we only redirect to our\n\t// own login page, not to the client's redirect_uri).\n\tif (emdash?.db) {\n\t\tconst client = await lookupOAuthClient(emdash.db, clientId);\n\t\tif (!client) {\n\t\t\treturn new Response(renderErrorPage(\"Unknown client application.\"), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t\t});\n\t\t}\n\n\t\tconst clientUriError = validateClientRedirectUri(redirectUri, client.redirectUris);\n\t\tif (clientUriError) {\n\t\t\treturn new Response(renderErrorPage(\"The redirect URI is not registered for this client.\"), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t\t});\n\t\t}\n\t}\n\n\t// If not authenticated, redirect to login with return URL\n\tif (!user) {\n\t\tconst loginUrl = new URL(\"/_emdash/admin/login\", getPublicOrigin(url, emdash?.config));\n\t\tloginUrl.searchParams.set(\"redirect\", url.pathname + url.search);\n\t\treturn Response.redirect(loginUrl.toString(), 302);\n\t}\n\n\t// Parse and validate scopes\n\tconst requestedScopes = (scope ?? \"\").split(\" \").filter(Boolean).filter(isValidScope);\n\n\tif (requestedScopes.length === 0) {\n\t\treturn new Response(renderErrorPage(\"No valid scopes requested.\"), {\n\t\t\tstatus: 400,\n\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t});\n\t}\n\n\t// SEC-18: Generate CSRF token for the consent form (double-submit cookie pattern)\n\tconst csrfToken = generateCsrfToken();\n\n\t// Render the consent page\n\tconst html = renderConsentPage({\n\t\tclientId,\n\t\tscopes: requestedScopes,\n\t\tredirectUri,\n\t\tresponseType,\n\t\tcodeChallenge,\n\t\tcodeChallengeMethod: codeChallengeMethod ?? \"S256\",\n\t\tstate: state ?? \"\",\n\t\tresource: url.searchParams.get(\"resource\") ?? \"\",\n\t\tuserName: user.name ?? user.email,\n\t\tcsrfToken,\n\t});\n\n\treturn new Response(html, {\n\t\theaders: {\n\t\t\t\"Content-Type\": \"text/html; charset=utf-8\",\n\t\t\t\"Set-Cookie\": csrfCookieHeader(csrfToken, request, getPublicOrigin(url, emdash?.config)),\n\t\t},\n\t});\n};\n\n// ---------------------------------------------------------------------------\n// POST: Process consent\n// ---------------------------------------------------------------------------\n\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tif (!emdash?.db) {\n\t\treturn new Response(renderErrorPage(\"EmDash is not initialized.\"), {\n\t\t\tstatus: 500,\n\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t});\n\t}\n\n\tif (!user) {\n\t\treturn new Response(renderErrorPage(\"Authentication required.\"), {\n\t\t\tstatus: 401,\n\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t});\n\t}\n\n\tconst formData = await request.formData();\n\tconst field = (name: string, fallback = \"\"): string => {\n\t\tconst v = formData.get(name);\n\t\treturn typeof v === \"string\" ? v : fallback;\n\t};\n\n\t// SEC-18: Validate CSRF token (double-submit cookie pattern).\n\t// The form includes a hidden csrf_token field; the cookie has the same value.\n\t// An attacker cannot read the cookie to forge the form field (HttpOnly + SameSite=Strict).\n\tconst formCsrf = field(\"csrf_token\");\n\tconst cookieCsrf = getCsrfCookie(request);\n\tconst csrfError = new Response(\n\t\trenderErrorPage(\"Invalid or missing CSRF token. Please try again.\"),\n\t\t{ status: 403, headers: { \"Content-Type\": \"text/html; charset=utf-8\" } },\n\t);\n\tif (!formCsrf || !cookieCsrf) return csrfError;\n\n\t// Constant-time comparison: hash both values to fixed-length 32-byte digests,\n\t// then XOR every byte pair. This avoids crypto.subtle.timingSafeEqual which is\n\t// a Cloudflare Workers extension and doesn't exist in Node.js.\n\t// The SHA-256 pre-hash ensures fixed length, eliminating length-leaking.\n\tconst csrfEncoder = new TextEncoder();\n\tconst [csrfHashA, csrfHashB] = await Promise.all([\n\t\tcrypto.subtle.digest(\"SHA-256\", csrfEncoder.encode(formCsrf)),\n\t\tcrypto.subtle.digest(\"SHA-256\", csrfEncoder.encode(cookieCsrf)),\n\t]);\n\tconst a = new Uint8Array(csrfHashA);\n\tconst b = new Uint8Array(csrfHashB);\n\tlet diff = 0;\n\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion -- tsgo needs these\n\tfor (let i = 0; i < a.length; i++) diff |= a[i]! ^ b[i]!;\n\tif (diff !== 0) return csrfError;\n\n\tconst action = field(\"action\");\n\tconst redirectUri = field(\"redirect_uri\");\n\tconst state = field(\"state\") || undefined;\n\n\tif (!redirectUri) {\n\t\treturn new Response(renderErrorPage(\"Missing redirect_uri.\"), {\n\t\t\tstatus: 400,\n\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t});\n\t}\n\n\t// Validate redirect_uri scheme/host before using it for any redirect\n\tconst uriError = validateRedirectUri(redirectUri);\n\tif (uriError) {\n\t\treturn new Response(renderErrorPage(escapeHtml(uriError)), {\n\t\t\tstatus: 400,\n\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t});\n\t}\n\n\t// User denied — SEC-44: validate redirect_uri against client's registered URIs\n\t// before redirecting, to prevent open redirect on the deny path.\n\tif (action === \"deny\") {\n\t\tconst clientId = field(\"client_id\");\n\t\tif (!clientId) {\n\t\t\treturn new Response(renderErrorPage(\"Missing client_id.\"), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t\t});\n\t\t}\n\n\t\tconst client = await lookupOAuthClient(emdash.db, clientId);\n\t\tif (!client) {\n\t\t\treturn new Response(renderErrorPage(\"Unknown client application.\"), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t\t});\n\t\t}\n\n\t\tconst clientUriError = validateClientRedirectUri(redirectUri, client.redirectUris);\n\t\tif (clientUriError) {\n\t\t\treturn new Response(renderErrorPage(\"The redirect URI is not registered for this client.\"), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t\t});\n\t\t}\n\n\t\tconst denyUrl = buildDeniedRedirect(redirectUri, state);\n\t\treturn Response.redirect(denyUrl, 302);\n\t}\n\n\t// User approved — process the authorization\n\tconst result = await handleAuthorizationApproval(emdash.db, user.id, user.role, {\n\t\tresponse_type: field(\"response_type\", \"code\"),\n\t\tclient_id: field(\"client_id\"),\n\t\tredirect_uri: redirectUri,\n\t\tscope: field(\"scope\"),\n\t\tstate,\n\t\tcode_challenge: field(\"code_challenge\"),\n\t\tcode_challenge_method: field(\"code_challenge_method\", \"S256\"),\n\t\tresource: field(\"resource\") || undefined,\n\t});\n\n\tif (!result.success) {\n\t\tconst errMsg = result.error?.message ?? \"Authorization failed\";\n\t\t// On error, redirect back with error params — use generic description to avoid\n\t\t// leaking internal error details to the (already-validated) redirect target\n\t\ttry {\n\t\t\tconst errorUrl = new URL(redirectUri);\n\t\t\terrorUrl.searchParams.set(\"error\", \"server_error\");\n\t\t\terrorUrl.searchParams.set(\"error_description\", \"Authorization failed\");\n\t\t\tif (state) errorUrl.searchParams.set(\"state\", state);\n\t\t\treturn Response.redirect(errorUrl.toString(), 302);\n\t\t} catch {\n\t\t\treturn new Response(renderErrorPage(escapeHtml(errMsg)), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\t\t});\n\t\t}\n\t}\n\n\treturn Response.redirect(result.data.redirect_url, 302);\n};\n\n// ---------------------------------------------------------------------------\n// HTML rendering\n// ---------------------------------------------------------------------------\n\nfunction renderConsentPage(params: {\n\tclientId: string;\n\tscopes: string[];\n\tredirectUri: string;\n\tresponseType: string;\n\tcodeChallenge: string;\n\tcodeChallengeMethod: string;\n\tstate: string;\n\tresource: string;\n\tuserName: string;\n\tcsrfToken: string;\n}): string {\n\tconst scopeList = params.scopes\n\t\t.map((s) => {\n\t\t\tconst label = SCOPE_LABELS[s] ?? s;\n\t\t\treturn `<li>${escapeHtml(label)}</li>`;\n\t\t})\n\t\t.join(\"\\n\");\n\n\treturn `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Authorize Application — EmDash</title>\n<style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { font-family: system-ui, -apple-system, sans-serif; background: #0a0a0a; color: #e5e5e5; display: flex; justify-content: center; align-items: center; min-height: 100vh; padding: 1rem; }\n .card { background: #171717; border: 1px solid #262626; border-radius: 12px; max-width: 420px; width: 100%; padding: 2rem; }\n h1 { font-size: 1.25rem; font-weight: 600; margin-bottom: 0.5rem; }\n .client-id { color: #a3a3a3; font-size: 0.875rem; word-break: break-all; margin-bottom: 1.5rem; }\n .user { color: #a3a3a3; font-size: 0.875rem; margin-bottom: 1rem; }\n h2 { font-size: 0.875rem; font-weight: 500; color: #a3a3a3; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.75rem; }\n ul { list-style: none; margin-bottom: 1.5rem; }\n li { padding: 0.5rem 0; border-bottom: 1px solid #262626; font-size: 0.875rem; }\n li:last-child { border-bottom: none; }\n .actions { display: flex; gap: 0.75rem; }\n button { flex: 1; padding: 0.625rem 1rem; border-radius: 8px; border: none; font-size: 0.875rem; font-weight: 500; cursor: pointer; }\n .approve { background: #2563eb; color: white; }\n .approve:hover { background: #1d4ed8; }\n .deny { background: #262626; color: #e5e5e5; }\n .deny:hover { background: #333; }\n</style>\n</head>\n<body>\n<div class=\"card\">\n <h1>Authorize Application</h1>\n <p class=\"client-id\">${escapeHtml(params.clientId)}</p>\n <p class=\"user\">Signed in as <strong>${escapeHtml(params.userName)}</strong></p>\n <h2>Permissions requested</h2>\n <ul>${scopeList}</ul>\n <form method=\"POST\">\n <input type=\"hidden\" name=\"csrf_token\" value=\"${escapeHtml(params.csrfToken)}\">\n <input type=\"hidden\" name=\"response_type\" value=\"${escapeHtml(params.responseType)}\">\n <input type=\"hidden\" name=\"client_id\" value=\"${escapeHtml(params.clientId)}\">\n <input type=\"hidden\" name=\"redirect_uri\" value=\"${escapeHtml(params.redirectUri)}\">\n <input type=\"hidden\" name=\"scope\" value=\"${escapeHtml(params.scopes.join(\" \"))}\">\n <input type=\"hidden\" name=\"state\" value=\"${escapeHtml(params.state)}\">\n <input type=\"hidden\" name=\"code_challenge\" value=\"${escapeHtml(params.codeChallenge)}\">\n <input type=\"hidden\" name=\"code_challenge_method\" value=\"${escapeHtml(params.codeChallengeMethod)}\">\n <input type=\"hidden\" name=\"resource\" value=\"${escapeHtml(params.resource)}\">\n <div class=\"actions\">\n <button type=\"submit\" name=\"action\" value=\"deny\" class=\"deny\">Deny</button>\n <button type=\"submit\" name=\"action\" value=\"approve\" class=\"approve\">Approve</button>\n </div>\n </form>\n</div>\n</body>\n</html>`;\n}\n\nfunction renderErrorPage(message: string): string {\n\treturn `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Authorization Error — EmDash</title>\n<style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { font-family: system-ui, -apple-system, sans-serif; background: #0a0a0a; color: #e5e5e5; display: flex; justify-content: center; align-items: center; min-height: 100vh; padding: 1rem; }\n .card { background: #171717; border: 1px solid #262626; border-radius: 12px; max-width: 420px; width: 100%; padding: 2rem; }\n h1 { font-size: 1.25rem; font-weight: 600; margin-bottom: 1rem; color: #ef4444; }\n p { font-size: 0.875rem; color: #a3a3a3; }\n</style>\n</head>\n<body>\n<div class=\"card\">\n <h1>Authorization Error</h1>\n <p>${escapeHtml(message)}</p>\n</div>\n</body>\n</html>`;\n}\n"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- import "../../../../../base64-C74Msx8h.mjs";
2
- import "../../../../../types-Ch8pFMEm.mjs";
3
- import { a as unwrapResult, r as handleError, t as apiError } from "../../../../../error-CfJMLSkd.mjs";
4
- import { n as parseBody, t as isParseError } from "../../../../../parse-GLksnn-B.mjs";
5
- import "../../../../../api-tokens-Dk2GrJMY.mjs";
6
- import "../../../../../oauth-user-lookup-Ctgemb0k.mjs";
7
- import { t as handleDeviceAuthorize } from "../../../../../device-flow-CPXQ_QfW.mjs";
1
+ import "../../../../../base64-B-PsqheR.mjs";
2
+ import "../../../../../types-D1iJ3DpO.mjs";
3
+ import { a as unwrapResult, r as handleError, t as apiError } from "../../../../../error-CEGF6UZb.mjs";
4
+ import { n as parseBody, t as isParseError } from "../../../../../parse-C_-6klII.mjs";
5
+ import "../../../../../api-tokens-Cvmixds7.mjs";
6
+ import "../../../../../oauth-user-lookup-oUllxvAv.mjs";
7
+ import { t as handleDeviceAuthorize } from "../../../../../device-flow-BeA6lUS1.mjs";
8
8
  import { z } from "zod";
9
9
 
10
10
  //#region src/astro/routes/api/oauth/device/authorize.ts
@@ -1,13 +1,13 @@
1
- import "../../../../../base64-C74Msx8h.mjs";
2
- import "../../../../../types-Ch8pFMEm.mjs";
3
- import { a as unwrapResult, r as handleError, t as apiError } from "../../../../../error-CfJMLSkd.mjs";
4
- import { n as parseBody, t as isParseError } from "../../../../../parse-GLksnn-B.mjs";
5
- import { t as getTrustedProxyHeaders } from "../../../../../trusted-proxy-CSgZVESw.mjs";
6
- import { n as getPublicOrigin } from "../../../../../public-url-C0cEvrRu.mjs";
7
- import "../../../../../api-tokens-Dk2GrJMY.mjs";
8
- import "../../../../../oauth-user-lookup-Ctgemb0k.mjs";
9
- import { n as handleDeviceCodeRequest } from "../../../../../device-flow-CPXQ_QfW.mjs";
10
- import { n as getClientIp, r as rateLimitResponse, t as checkRateLimit } from "../../../../../rate-limit-Cg4Rvc_-.mjs";
1
+ import "../../../../../base64-B-PsqheR.mjs";
2
+ import "../../../../../types-D1iJ3DpO.mjs";
3
+ import { a as unwrapResult, r as handleError, t as apiError } from "../../../../../error-CEGF6UZb.mjs";
4
+ import { n as parseBody, t as isParseError } from "../../../../../parse-C_-6klII.mjs";
5
+ import { t as getTrustedProxyHeaders } from "../../../../../trusted-proxy-CwjQj0YG.mjs";
6
+ import { n as getPublicOrigin } from "../../../../../public-url-DSGTnJFw.mjs";
7
+ import "../../../../../api-tokens-Cvmixds7.mjs";
8
+ import "../../../../../oauth-user-lookup-oUllxvAv.mjs";
9
+ import { n as handleDeviceCodeRequest } from "../../../../../device-flow-BeA6lUS1.mjs";
10
+ import { n as getClientIp, r as rateLimitResponse, t as checkRateLimit } from "../../../../../rate-limit-CMj83JNW.mjs";
11
11
  import { z } from "zod";
12
12
 
13
13
  //#region src/astro/routes/api/oauth/device/code.ts
@@ -1,12 +1,12 @@
1
- import "../../../../../base64-C74Msx8h.mjs";
2
- import "../../../../../types-Ch8pFMEm.mjs";
3
- import { a as unwrapResult, r as handleError, t as apiError } from "../../../../../error-CfJMLSkd.mjs";
4
- import { n as parseBody, t as isParseError } from "../../../../../parse-GLksnn-B.mjs";
5
- import { t as getTrustedProxyHeaders } from "../../../../../trusted-proxy-CSgZVESw.mjs";
6
- import "../../../../../api-tokens-Dk2GrJMY.mjs";
7
- import "../../../../../oauth-user-lookup-Ctgemb0k.mjs";
8
- import { r as handleDeviceTokenExchange } from "../../../../../device-flow-CPXQ_QfW.mjs";
9
- import { n as getClientIp, r as rateLimitResponse, t as checkRateLimit } from "../../../../../rate-limit-Cg4Rvc_-.mjs";
1
+ import "../../../../../base64-B-PsqheR.mjs";
2
+ import "../../../../../types-D1iJ3DpO.mjs";
3
+ import { a as unwrapResult, r as handleError, t as apiError } from "../../../../../error-CEGF6UZb.mjs";
4
+ import { n as parseBody, t as isParseError } from "../../../../../parse-C_-6klII.mjs";
5
+ import { t as getTrustedProxyHeaders } from "../../../../../trusted-proxy-CwjQj0YG.mjs";
6
+ import "../../../../../api-tokens-Cvmixds7.mjs";
7
+ import "../../../../../oauth-user-lookup-oUllxvAv.mjs";
8
+ import { r as handleDeviceTokenExchange } from "../../../../../device-flow-BeA6lUS1.mjs";
9
+ import { n as getClientIp, r as rateLimitResponse, t as checkRateLimit } from "../../../../../rate-limit-CMj83JNW.mjs";
10
10
  import { z } from "zod";
11
11
 
12
12
  //#region src/astro/routes/api/oauth/device/token.ts
@@ -1,7 +1,7 @@
1
- import "../../../../base64-C74Msx8h.mjs";
2
- import "../../../../types-Ch8pFMEm.mjs";
3
- import { r as handleError, t as apiError } from "../../../../error-CfJMLSkd.mjs";
4
- import { t as handleOAuthClientCreate } from "../../../../oauth-clients-43_XADoa.mjs";
1
+ import "../../../../base64-B-PsqheR.mjs";
2
+ import "../../../../types-D1iJ3DpO.mjs";
3
+ import { r as handleError, t as apiError } from "../../../../error-CEGF6UZb.mjs";
4
+ import { t as handleOAuthClientCreate } from "../../../../oauth-clients-BlrUHAsf.mjs";
5
5
 
6
6
  //#region src/astro/routes/api/oauth/register.ts
7
7
  const prerender = false;
@@ -1,10 +1,10 @@
1
- import "../../../../../base64-C74Msx8h.mjs";
2
- import "../../../../../types-Ch8pFMEm.mjs";
3
- import { a as unwrapResult, r as handleError, t as apiError } from "../../../../../error-CfJMLSkd.mjs";
4
- import { n as parseBody, t as isParseError } from "../../../../../parse-GLksnn-B.mjs";
5
- import "../../../../../api-tokens-Dk2GrJMY.mjs";
6
- import "../../../../../oauth-user-lookup-Ctgemb0k.mjs";
7
- import { i as handleTokenRefresh } from "../../../../../device-flow-CPXQ_QfW.mjs";
1
+ import "../../../../../base64-B-PsqheR.mjs";
2
+ import "../../../../../types-D1iJ3DpO.mjs";
3
+ import { a as unwrapResult, r as handleError, t as apiError } from "../../../../../error-CEGF6UZb.mjs";
4
+ import { n as parseBody, t as isParseError } from "../../../../../parse-C_-6klII.mjs";
5
+ import "../../../../../api-tokens-Cvmixds7.mjs";
6
+ import "../../../../../oauth-user-lookup-oUllxvAv.mjs";
7
+ import { i as handleTokenRefresh } from "../../../../../device-flow-BeA6lUS1.mjs";
8
8
  import { z } from "zod";
9
9
 
10
10
  //#region src/astro/routes/api/oauth/token/refresh.ts
@@ -1,10 +1,10 @@
1
- import "../../../../../base64-C74Msx8h.mjs";
2
- import "../../../../../types-Ch8pFMEm.mjs";
3
- import { a as unwrapResult, r as handleError, t as apiError } from "../../../../../error-CfJMLSkd.mjs";
4
- import { n as parseBody, t as isParseError } from "../../../../../parse-GLksnn-B.mjs";
5
- import "../../../../../api-tokens-Dk2GrJMY.mjs";
6
- import "../../../../../oauth-user-lookup-Ctgemb0k.mjs";
7
- import { a as handleTokenRevoke } from "../../../../../device-flow-CPXQ_QfW.mjs";
1
+ import "../../../../../base64-B-PsqheR.mjs";
2
+ import "../../../../../types-D1iJ3DpO.mjs";
3
+ import { a as unwrapResult, r as handleError, t as apiError } from "../../../../../error-CEGF6UZb.mjs";
4
+ import { n as parseBody, t as isParseError } from "../../../../../parse-C_-6klII.mjs";
5
+ import "../../../../../api-tokens-Cvmixds7.mjs";
6
+ import "../../../../../oauth-user-lookup-oUllxvAv.mjs";
7
+ import { a as handleTokenRevoke } from "../../../../../device-flow-BeA6lUS1.mjs";
8
8
  import { z } from "zod";
9
9
 
10
10
  //#region src/astro/routes/api/oauth/token/revoke.ts
@@ -1,10 +1,10 @@
1
- import "../../../../base64-C74Msx8h.mjs";
2
- import "../../../../types-Ch8pFMEm.mjs";
3
- import { r as handleError, t as apiError } from "../../../../error-CfJMLSkd.mjs";
4
- import "../../../../api-tokens-Dk2GrJMY.mjs";
5
- import "../../../../oauth-user-lookup-Ctgemb0k.mjs";
6
- import { r as handleAuthorizationCodeExchange } from "../../../../oauth-authorization-BWqWTHBK.mjs";
7
- import { i as handleTokenRefresh, r as handleDeviceTokenExchange } from "../../../../device-flow-CPXQ_QfW.mjs";
1
+ import "../../../../base64-B-PsqheR.mjs";
2
+ import "../../../../types-D1iJ3DpO.mjs";
3
+ import { r as handleError, t as apiError } from "../../../../error-CEGF6UZb.mjs";
4
+ import "../../../../api-tokens-Cvmixds7.mjs";
5
+ import "../../../../oauth-user-lookup-oUllxvAv.mjs";
6
+ import { r as handleAuthorizationCodeExchange } from "../../../../oauth-authorization-oqfbBuMH.mjs";
7
+ import { i as handleTokenRefresh, r as handleDeviceTokenExchange } from "../../../../device-flow-BeA6lUS1.mjs";
8
8
  import { z } from "zod";
9
9
 
10
10
  //#region src/astro/routes/api/oauth/token.ts