emdash 0.20.0 → 0.21.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 (547) hide show
  1. package/dist/{adapters-BzIHV3sw.d.mts → adapters-BxSmgtbF.d.mts} +1 -1
  2. package/dist/{adapters-BzIHV3sw.d.mts.map → adapters-BxSmgtbF.d.mts.map} +1 -1
  3. package/dist/{allowed-origins-B1u7Qnvg.mjs → allowed-origins-BqC8cul8.mjs} +2 -2
  4. package/dist/{allowed-origins-B1u7Qnvg.mjs.map → allowed-origins-BqC8cul8.mjs.map} +1 -1
  5. package/dist/api/route-utils.d.mts +3 -3
  6. package/dist/api/route-utils.mjs +13 -12
  7. package/dist/api/route-utils.mjs.map +1 -1
  8. package/dist/api/schemas/index.d.mts +1 -1
  9. package/dist/api/schemas/index.mjs +3 -2
  10. package/dist/{api-DStv36ik.mjs → api-DxjIV2o8.mjs} +13 -13
  11. package/dist/{api-DStv36ik.mjs.map → api-DxjIV2o8.mjs.map} +1 -1
  12. package/dist/{api-tokens-DPfhPu5V.mjs → api-tokens-BFFkB0jB.mjs} +2 -2
  13. package/dist/{api-tokens-DPfhPu5V.mjs.map → api-tokens-BFFkB0jB.mjs.map} +1 -1
  14. package/dist/{apply-Dr7snAMT.mjs → apply-CLjxheyb.mjs} +12 -12
  15. package/dist/{apply-Dr7snAMT.mjs.map → apply-CLjxheyb.mjs.map} +1 -1
  16. package/dist/astro/index.d.mts +10 -10
  17. package/dist/astro/index.d.mts.map +1 -1
  18. package/dist/astro/index.mjs +50 -15
  19. package/dist/astro/index.mjs.map +1 -1
  20. package/dist/astro/middleware/auth.d.mts +9 -9
  21. package/dist/astro/middleware/auth.mjs +5 -5
  22. package/dist/astro/middleware/redirect.d.mts.map +1 -1
  23. package/dist/astro/middleware/redirect.mjs +11 -2
  24. package/dist/astro/middleware/redirect.mjs.map +1 -1
  25. package/dist/astro/middleware/request-context.mjs +3 -2
  26. package/dist/astro/middleware/request-context.mjs.map +1 -1
  27. package/dist/astro/middleware/setup.mjs +1 -1
  28. package/dist/astro/middleware.d.mts +1 -1
  29. package/dist/astro/middleware.mjs +63 -60
  30. package/dist/astro/middleware.mjs.map +1 -1
  31. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +5 -4
  32. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs.map +1 -1
  33. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +5 -4
  34. package/dist/astro/routes/api/admin/allowed-domains/index.mjs.map +1 -1
  35. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +3 -3
  36. package/dist/astro/routes/api/admin/api-tokens/index.mjs +4 -4
  37. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +4 -4
  38. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +8 -7
  39. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs.map +1 -1
  40. package/dist/astro/routes/api/admin/byline-fields/index.mjs +8 -7
  41. package/dist/astro/routes/api/admin/byline-fields/index.mjs.map +1 -1
  42. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +8 -7
  43. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs.map +1 -1
  44. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +14 -12
  45. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
  46. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +14 -12
  47. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
  48. package/dist/astro/routes/api/admin/bylines/index.mjs +14 -12
  49. package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
  50. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +9 -8
  51. package/dist/astro/routes/api/admin/comments/_id_/status.mjs.map +1 -1
  52. package/dist/astro/routes/api/admin/comments/_id_.mjs +3 -3
  53. package/dist/astro/routes/api/admin/comments/bulk.mjs +7 -6
  54. package/dist/astro/routes/api/admin/comments/bulk.mjs.map +1 -1
  55. package/dist/astro/routes/api/admin/comments/counts.mjs +3 -3
  56. package/dist/astro/routes/api/admin/comments/index.mjs +7 -6
  57. package/dist/astro/routes/api/admin/comments/index.mjs.map +1 -1
  58. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +3 -3
  59. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +2 -2
  60. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +3 -3
  61. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +3 -3
  62. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +29 -27
  63. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
  64. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +29 -27
  65. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
  66. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +28 -26
  67. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  68. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +28 -26
  69. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  70. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +28 -26
  71. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  72. package/dist/astro/routes/api/admin/plugins/index.mjs +28 -26
  73. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  74. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
  75. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +28 -26
  76. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  77. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +28 -26
  78. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
  79. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +28 -26
  80. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
  81. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +28 -26
  82. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
  83. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +29 -27
  84. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
  85. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +28 -26
  86. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
  87. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +29 -27
  88. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  89. package/dist/astro/routes/api/admin/plugins/updates.mjs +28 -26
  90. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  91. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +28 -26
  92. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  93. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +2 -2
  94. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +28 -26
  95. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  96. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +1 -1
  97. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +1 -1
  98. package/dist/astro/routes/api/admin/users/_id_/index.mjs +5 -4
  99. package/dist/astro/routes/api/admin/users/_id_/index.mjs.map +1 -1
  100. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +2 -2
  101. package/dist/astro/routes/api/admin/users/index.mjs +5 -4
  102. package/dist/astro/routes/api/admin/users/index.mjs.map +1 -1
  103. package/dist/astro/routes/api/auth/dev-bypass.mjs +3 -3
  104. package/dist/astro/routes/api/auth/invite/accept.mjs +1 -1
  105. package/dist/astro/routes/api/auth/invite/complete.mjs +9 -8
  106. package/dist/astro/routes/api/auth/invite/complete.mjs.map +1 -1
  107. package/dist/astro/routes/api/auth/invite/index.mjs +6 -5
  108. package/dist/astro/routes/api/auth/invite/index.mjs.map +1 -1
  109. package/dist/astro/routes/api/auth/invite/register-options.mjs +8 -7
  110. package/dist/astro/routes/api/auth/invite/register-options.mjs.map +1 -1
  111. package/dist/astro/routes/api/auth/logout.mjs +2 -2
  112. package/dist/astro/routes/api/auth/magic-link/send.mjs +8 -7
  113. package/dist/astro/routes/api/auth/magic-link/send.mjs.map +1 -1
  114. package/dist/astro/routes/api/auth/magic-link/verify.mjs +2 -2
  115. package/dist/astro/routes/api/auth/me.mjs +5 -4
  116. package/dist/astro/routes/api/auth/me.mjs.map +1 -1
  117. package/dist/astro/routes/api/auth/mode.mjs +1 -1
  118. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
  119. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  120. package/dist/astro/routes/api/auth/passkey/_id_.mjs +5 -4
  121. package/dist/astro/routes/api/auth/passkey/_id_.mjs.map +1 -1
  122. package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
  123. package/dist/astro/routes/api/auth/passkey/options.mjs +10 -9
  124. package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -1
  125. package/dist/astro/routes/api/auth/passkey/register/options.mjs +8 -7
  126. package/dist/astro/routes/api/auth/passkey/register/options.mjs.map +1 -1
  127. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +9 -8
  128. package/dist/astro/routes/api/auth/passkey/register/verify.mjs.map +1 -1
  129. package/dist/astro/routes/api/auth/passkey/verify.mjs +9 -8
  130. package/dist/astro/routes/api/auth/passkey/verify.mjs.map +1 -1
  131. package/dist/astro/routes/api/auth/signup/complete.mjs +9 -8
  132. package/dist/astro/routes/api/auth/signup/complete.mjs.map +1 -1
  133. package/dist/astro/routes/api/auth/signup/request.mjs +8 -7
  134. package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -1
  135. package/dist/astro/routes/api/auth/signup/verify.mjs +1 -1
  136. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +11 -9
  137. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs.map +1 -1
  138. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
  139. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +2 -2
  140. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +2 -2
  141. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +2 -2
  142. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +10 -8
  143. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs.map +1 -1
  144. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +6 -5
  145. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
  146. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +2 -2
  147. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
  148. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +6 -5
  149. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
  150. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +10 -9
  151. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
  152. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
  153. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +2 -2
  154. package/dist/astro/routes/api/content/_collection_/_id_.mjs +6 -5
  155. package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
  156. package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
  157. package/dist/astro/routes/api/content/_collection_/index.mjs +6 -5
  158. package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
  159. package/dist/astro/routes/api/content/_collection_/trash.mjs +6 -5
  160. package/dist/astro/routes/api/content/_collection_/trash.mjs.map +1 -1
  161. package/dist/astro/routes/api/dashboard.mjs +3 -3
  162. package/dist/astro/routes/api/dev/emails.mjs +2 -2
  163. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  164. package/dist/astro/routes/api/import/probe.mjs +10 -9
  165. package/dist/astro/routes/api/import/probe.mjs.map +1 -1
  166. package/dist/astro/routes/api/import/wordpress/analyze.mjs +3 -3
  167. package/dist/astro/routes/api/import/wordpress/execute.d.mts +9 -9
  168. package/dist/astro/routes/api/import/wordpress/execute.mjs +10 -9
  169. package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
  170. package/dist/astro/routes/api/import/wordpress/media.mjs +8 -7
  171. package/dist/astro/routes/api/import/wordpress/media.mjs.map +1 -1
  172. package/dist/astro/routes/api/import/wordpress/prepare.mjs +9 -8
  173. package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
  174. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +8 -7
  175. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
  176. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  177. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +10 -9
  178. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
  179. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +1 -1
  180. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +14 -12
  181. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
  182. package/dist/astro/routes/api/manifest.mjs +3 -3
  183. package/dist/astro/routes/api/mcp.mjs +20 -19
  184. package/dist/astro/routes/api/mcp.mjs.map +1 -1
  185. package/dist/astro/routes/api/media/_id_/confirm.mjs +6 -5
  186. package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
  187. package/dist/astro/routes/api/media/_id_.mjs +6 -5
  188. package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
  189. package/dist/astro/routes/api/media/file/_...key_.mjs +1 -1
  190. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
  191. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
  192. package/dist/astro/routes/api/media/providers/index.mjs +2 -2
  193. package/dist/astro/routes/api/media/upload-url.mjs +8 -7
  194. package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
  195. package/dist/astro/routes/api/media.mjs +10 -9
  196. package/dist/astro/routes/api/media.mjs.map +1 -1
  197. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +6 -5
  198. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
  199. package/dist/astro/routes/api/menus/_name_/items.mjs +6 -5
  200. package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
  201. package/dist/astro/routes/api/menus/_name_/reorder.mjs +6 -5
  202. package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
  203. package/dist/astro/routes/api/menus/_name_/translations.mjs +6 -5
  204. package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
  205. package/dist/astro/routes/api/menus/_name_.mjs +6 -5
  206. package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
  207. package/dist/astro/routes/api/menus/index.mjs +6 -5
  208. package/dist/astro/routes/api/menus/index.mjs.map +1 -1
  209. package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
  210. package/dist/astro/routes/api/oauth/device/authorize.mjs +5 -5
  211. package/dist/astro/routes/api/oauth/device/code.mjs +8 -8
  212. package/dist/astro/routes/api/oauth/device/token.mjs +7 -7
  213. package/dist/astro/routes/api/oauth/register.mjs +2 -2
  214. package/dist/astro/routes/api/oauth/token/refresh.mjs +5 -5
  215. package/dist/astro/routes/api/oauth/token/revoke.mjs +5 -5
  216. package/dist/astro/routes/api/oauth/token.mjs +5 -5
  217. package/dist/astro/routes/api/openapi.json.mjs +3 -2
  218. package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
  219. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +3 -3
  220. package/dist/astro/routes/api/redirects/404s/index.mjs +7 -6
  221. package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
  222. package/dist/astro/routes/api/redirects/404s/summary.mjs +7 -6
  223. package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
  224. package/dist/astro/routes/api/redirects/_id_.mjs +8 -7
  225. package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
  226. package/dist/astro/routes/api/redirects/index.mjs +8 -7
  227. package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
  228. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +2 -2
  229. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +2 -2
  230. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +28 -26
  231. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  232. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +28 -26
  233. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  234. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +28 -26
  235. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  236. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +28 -26
  237. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  238. package/dist/astro/routes/api/schema/collections/index.mjs +28 -26
  239. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  240. package/dist/astro/routes/api/schema/index.mjs +5 -5
  241. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +28 -26
  242. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  243. package/dist/astro/routes/api/schema/orphans/index.mjs +28 -26
  244. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  245. package/dist/astro/routes/api/search/enable.mjs +9 -8
  246. package/dist/astro/routes/api/search/enable.mjs.map +1 -1
  247. package/dist/astro/routes/api/search/index.mjs +8 -7
  248. package/dist/astro/routes/api/search/index.mjs.map +1 -1
  249. package/dist/astro/routes/api/search/rebuild.mjs +9 -8
  250. package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
  251. package/dist/astro/routes/api/search/stats.mjs +5 -5
  252. package/dist/astro/routes/api/search/suggest.mjs +8 -7
  253. package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
  254. package/dist/astro/routes/api/sections/_slug_.mjs +8 -7
  255. package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
  256. package/dist/astro/routes/api/sections/index.mjs +8 -7
  257. package/dist/astro/routes/api/sections/index.mjs.map +1 -1
  258. package/dist/astro/routes/api/settings/email.mjs +3 -3
  259. package/dist/astro/routes/api/settings.mjs +11 -9
  260. package/dist/astro/routes/api/settings.mjs.map +1 -1
  261. package/dist/astro/routes/api/setup/admin-verify.mjs +10 -9
  262. package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -1
  263. package/dist/astro/routes/api/setup/admin.mjs +9 -8
  264. package/dist/astro/routes/api/setup/admin.mjs.map +1 -1
  265. package/dist/astro/routes/api/setup/dev-bypass.mjs +19 -18
  266. package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
  267. package/dist/astro/routes/api/setup/dev-reset.mjs +1 -1
  268. package/dist/astro/routes/api/setup/index.mjs +20 -18
  269. package/dist/astro/routes/api/setup/index.mjs.map +1 -1
  270. package/dist/astro/routes/api/setup/status.mjs +3 -3
  271. package/dist/astro/routes/api/snapshot.mjs +5 -4
  272. package/dist/astro/routes/api/snapshot.mjs.map +1 -1
  273. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +11 -10
  274. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
  275. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +11 -10
  276. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
  277. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +11 -10
  278. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
  279. package/dist/astro/routes/api/taxonomies/index.mjs +11 -10
  280. package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
  281. package/dist/astro/routes/api/themes/preview.mjs +5 -4
  282. package/dist/astro/routes/api/themes/preview.mjs.map +1 -1
  283. package/dist/astro/routes/api/typegen.mjs +4 -4
  284. package/dist/astro/routes/api/well-known/auth.mjs +1 -1
  285. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
  286. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
  287. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +6 -5
  288. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
  289. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +9 -8
  290. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
  291. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +9 -8
  292. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
  293. package/dist/astro/routes/api/widget-areas/_name_.mjs +5 -5
  294. package/dist/astro/routes/api/widget-areas/index.mjs +9 -8
  295. package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
  296. package/dist/astro/routes/api/widget-components.mjs +2 -2
  297. package/dist/astro/routes/robots.txt.mjs +5 -4
  298. package/dist/astro/routes/robots.txt.mjs.map +1 -1
  299. package/dist/astro/routes/sitemap-_collection_.xml.mjs +8 -7
  300. package/dist/astro/routes/sitemap-_collection_.xml.mjs.map +1 -1
  301. package/dist/astro/routes/sitemap.xml.mjs +6 -5
  302. package/dist/astro/routes/sitemap.xml.mjs.map +1 -1
  303. package/dist/astro/types.d.mts +12 -12
  304. package/dist/auth/providers/github.d.mts +1 -1
  305. package/dist/auth/providers/google.d.mts +1 -1
  306. package/dist/{authorize-DsMSVSaY.mjs → authorize-D5gfBVU5.mjs} +2 -2
  307. package/dist/{authorize-DsMSVSaY.mjs.map → authorize-D5gfBVU5.mjs.map} +1 -1
  308. package/dist/{byline-DUx48sJp.mjs → byline-V_Qp1Ziw.mjs} +27 -14
  309. package/dist/byline-V_Qp1Ziw.mjs.map +1 -0
  310. package/dist/{byline-fields-8TMtkBnH.mjs → byline-fields-B0NO1yUB.mjs} +3 -3
  311. package/dist/{byline-fields-8TMtkBnH.mjs.map → byline-fields-B0NO1yUB.mjs.map} +1 -1
  312. package/dist/{byline-fields-DbibsvTl.d.mts → byline-fields-CQJRIQkn.d.mts} +32 -32
  313. package/dist/{byline-fields-DbibsvTl.d.mts.map → byline-fields-CQJRIQkn.d.mts.map} +1 -1
  314. package/dist/{byline-fields--WxSNS79.mjs → byline-fields-nBVqK_Ff.mjs} +2 -2
  315. package/dist/{byline-fields--WxSNS79.mjs.map → byline-fields-nBVqK_Ff.mjs.map} +1 -1
  316. package/dist/{byline-registry-CWP7I71B.mjs → byline-registry-DedidtqC.mjs} +2 -2
  317. package/dist/{byline-registry-CWP7I71B.mjs.map → byline-registry-DedidtqC.mjs.map} +1 -1
  318. package/dist/{bylines-BdxWCnPL.mjs → bylines-B2NWnIwS.mjs} +2 -2
  319. package/dist/{bylines-BdxWCnPL.mjs.map → bylines-B2NWnIwS.mjs.map} +1 -1
  320. package/dist/{bylines-s8c2DXbH.mjs → bylines-DfGDnred.mjs} +7 -7
  321. package/dist/{bylines-s8c2DXbH.mjs.map → bylines-DfGDnred.mjs.map} +1 -1
  322. package/dist/{cache-B_HzASVT.mjs → cache-DTTHWD8n.mjs} +1 -1
  323. package/dist/{cache-B_HzASVT.mjs.map → cache-DTTHWD8n.mjs.map} +1 -1
  324. package/dist/{challenge-store-DXX3rfdI.mjs → challenge-store-woE0bbCf.mjs} +1 -1
  325. package/dist/{challenge-store-DXX3rfdI.mjs.map → challenge-store-woE0bbCf.mjs.map} +1 -1
  326. package/dist/cli/index.mjs +19 -18
  327. package/dist/cli/index.mjs.map +1 -1
  328. package/dist/client/cf-access.d.mts +1 -1
  329. package/dist/client/index.d.mts +1 -1
  330. package/dist/client/index.mjs +1 -1
  331. package/dist/{comments-Vkivawyl.mjs → comments-D2hNuxNa.mjs} +1 -1
  332. package/dist/{comments-Vkivawyl.mjs.map → comments-D2hNuxNa.mjs.map} +1 -1
  333. package/dist/{components-CK0cuUoH.mjs → components-DYKp2gmo.mjs} +1 -1
  334. package/dist/{components-CK0cuUoH.mjs.map → components-DYKp2gmo.mjs.map} +1 -1
  335. package/dist/{context-Y7BRkWes.mjs → context-Cm4pt1Ws.mjs} +5 -5
  336. package/dist/{context-Y7BRkWes.mjs.map → context-Cm4pt1Ws.mjs.map} +1 -1
  337. package/dist/{cron-BJ2ClIlj.mjs → cron-DdEVrQ2Y.mjs} +1 -1
  338. package/dist/{cron-BJ2ClIlj.mjs.map → cron-DdEVrQ2Y.mjs.map} +1 -1
  339. package/dist/{dashboard-2JgAMWxK.mjs → dashboard-C-UYpps0.mjs} +1 -1
  340. package/dist/{dashboard-2JgAMWxK.mjs.map → dashboard-C-UYpps0.mjs.map} +1 -1
  341. package/dist/db/index.d.mts +3 -3
  342. package/dist/db/libsql.d.mts +1 -1
  343. package/dist/db/postgres.d.mts +1 -1
  344. package/dist/db/sqlite.d.mts +1 -1
  345. package/dist/{db-errors-CtzxKBxe.mjs → db-errors-BluWkwGI.mjs} +1 -1
  346. package/dist/{db-errors-CtzxKBxe.mjs.map → db-errors-BluWkwGI.mjs.map} +1 -1
  347. package/dist/{default-IlBaTFxM.mjs → default-NHGuJzQ3.mjs} +1 -1
  348. package/dist/{default-IlBaTFxM.mjs.map → default-NHGuJzQ3.mjs.map} +1 -1
  349. package/dist/{device-flow-R23SIbQ2.mjs → device-flow-BQApWgnW.mjs} +4 -4
  350. package/dist/{device-flow-R23SIbQ2.mjs.map → device-flow-BQApWgnW.mjs.map} +1 -1
  351. package/dist/{email-console-DHT2Fbpj.mjs → email-console-BbU3RbWv.mjs} +1 -1
  352. package/dist/{email-console-DHT2Fbpj.mjs.map → email-console-BbU3RbWv.mjs.map} +1 -1
  353. package/dist/{error-RwM4dD35.mjs → error-CNn_w7jf.mjs} +1 -1
  354. package/dist/{error-RwM4dD35.mjs.map → error-CNn_w7jf.mjs.map} +1 -1
  355. package/dist/{escape-Ds07EEyu.mjs → escape-DPgcxcpL.mjs} +1 -1
  356. package/dist/{escape-Ds07EEyu.mjs.map → escape-DPgcxcpL.mjs.map} +1 -1
  357. package/dist/{fts-manager-1RgHmopc.mjs → fts-manager-Cx5z8jdA.mjs} +1 -1
  358. package/dist/{fts-manager-1RgHmopc.mjs.map → fts-manager-Cx5z8jdA.mjs.map} +1 -1
  359. package/dist/{hash-9w3pd3-m.mjs → hash-DlvIFn0b.mjs} +1 -1
  360. package/dist/{hash-9w3pd3-m.mjs.map → hash-DlvIFn0b.mjs.map} +1 -1
  361. package/dist/{import-Dh8bWmyq.mjs → import-KyxT1Mbs.mjs} +3 -3
  362. package/dist/{import-Dh8bWmyq.mjs.map → import-KyxT1Mbs.mjs.map} +1 -1
  363. package/dist/{index-B1keaX5Y.d.mts → index-D2VAiumu.d.mts} +15 -15
  364. package/dist/{index-B1keaX5Y.d.mts.map → index-D2VAiumu.d.mts.map} +1 -1
  365. package/dist/{index-DR56od45.d.mts → index-uT2yR66F.d.mts} +3 -3
  366. package/dist/{index-DR56od45.d.mts.map → index-uT2yR66F.d.mts.map} +1 -1
  367. package/dist/index.d.mts +16 -16
  368. package/dist/index.mjs +48 -46
  369. package/dist/init-lock-DlBHjf9-.mjs +83 -0
  370. package/dist/init-lock-DlBHjf9-.mjs.map +1 -0
  371. package/dist/{load-BBetCvLC.mjs → load-Dq91b_DK.mjs} +1 -1
  372. package/dist/{load-BBetCvLC.mjs.map → load-Dq91b_DK.mjs.map} +1 -1
  373. package/dist/{loader-ZN1ll-d-.mjs → loader-BqWjcH3h.mjs} +2 -2
  374. package/dist/{loader-ZN1ll-d-.mjs.map → loader-BqWjcH3h.mjs.map} +1 -1
  375. package/dist/{manifest-schema-BtwbL_vj.mjs → manifest-schema-DFPeqMAn.mjs} +1 -1
  376. package/dist/{manifest-schema-BtwbL_vj.mjs.map → manifest-schema-DFPeqMAn.mjs.map} +1 -1
  377. package/dist/media/index.d.mts +1 -1
  378. package/dist/media/index.mjs +2 -2
  379. package/dist/media/local-runtime.d.mts +11 -11
  380. package/dist/media/local-runtime.mjs +4 -3
  381. package/dist/media/local-runtime.mjs.map +1 -1
  382. package/dist/{media-allowlist-Dknq-OFY.mjs → media-allowlist-_A0SuDn4.mjs} +2 -2
  383. package/dist/{media-allowlist-Dknq-OFY.mjs.map → media-allowlist-_A0SuDn4.mjs.map} +1 -1
  384. package/dist/{media-url-VClf8glU.mjs → media-url-CqLd69IO.mjs} +1 -1
  385. package/dist/{media-url-VClf8glU.mjs.map → media-url-CqLd69IO.mjs.map} +1 -1
  386. package/dist/{menus-DrQLusqj.mjs → menus-Ryk9L7fT.mjs} +9 -9
  387. package/dist/{menus-DrQLusqj.mjs.map → menus-Ryk9L7fT.mjs.map} +1 -1
  388. package/dist/{mime-CCEzze7W.mjs → mime-YbtlEtvS.mjs} +1 -1
  389. package/dist/{mime-CCEzze7W.mjs.map → mime-YbtlEtvS.mjs.map} +1 -1
  390. package/dist/{mode-CO2vQHfq.mjs → mode-CGXzIbD8.mjs} +1 -1
  391. package/dist/{mode-CO2vQHfq.mjs.map → mode-CGXzIbD8.mjs.map} +1 -1
  392. package/dist/{normalize-CK5o04zr.mjs → normalize-DKsg36ty.mjs} +1 -1
  393. package/dist/{normalize-CK5o04zr.mjs.map → normalize-DKsg36ty.mjs.map} +1 -1
  394. package/dist/{oauth-authorization-Bw4NdF_S.mjs → oauth-authorization-C2kVyjXI.mjs} +4 -4
  395. package/dist/{oauth-authorization-Bw4NdF_S.mjs.map → oauth-authorization-C2kVyjXI.mjs.map} +1 -1
  396. package/dist/{oauth-clients-BGGFp57s.mjs → oauth-clients-BC873NCV.mjs} +1 -1
  397. package/dist/{oauth-clients-BGGFp57s.mjs.map → oauth-clients-BC873NCV.mjs.map} +1 -1
  398. package/dist/{oauth-state-store-97x0xtN2.mjs → oauth-state-store-Cd--TUaq.mjs} +1 -1
  399. package/dist/{oauth-state-store-97x0xtN2.mjs.map → oauth-state-store-Cd--TUaq.mjs.map} +1 -1
  400. package/dist/{oauth-user-lookup-B_vnZHKO.mjs → oauth-user-lookup-e4wOvDud.mjs} +1 -1
  401. package/dist/{oauth-user-lookup-B_vnZHKO.mjs.map → oauth-user-lookup-e4wOvDud.mjs.map} +1 -1
  402. package/dist/{options-DyYIYpPd.d.mts → options-9kLgkE8m.d.mts} +3 -3
  403. package/dist/{options-DyYIYpPd.d.mts.map → options-9kLgkE8m.d.mts.map} +1 -1
  404. package/dist/page/index.d.mts +2 -2
  405. package/dist/{parse-CrGndy1A.mjs → parse-DzSrk1t8.mjs} +2 -2
  406. package/dist/{parse-CrGndy1A.mjs.map → parse-DzSrk1t8.mjs.map} +1 -1
  407. package/dist/{passkey-config-C3QgnQnU.mjs → passkey-config-BpjbE_Uv.mjs} +1 -1
  408. package/dist/{passkey-config-C3QgnQnU.mjs.map → passkey-config-BpjbE_Uv.mjs.map} +1 -1
  409. package/dist/{placeholder-BZxr8W1j.mjs → placeholder-2xumZh4g.mjs} +1 -1
  410. package/dist/{placeholder-BZxr8W1j.mjs.map → placeholder-2xumZh4g.mjs.map} +1 -1
  411. package/dist/{placeholder-CVBv5z8k.d.mts → placeholder-BevVKfay.d.mts} +1 -1
  412. package/dist/{placeholder-CVBv5z8k.d.mts.map → placeholder-BevVKfay.d.mts.map} +1 -1
  413. package/dist/plugin-types.d.mts +1 -1
  414. package/dist/plugin-utils.d.mts +9 -9
  415. package/dist/plugins/adapt-sandbox-entry.d.mts +9 -9
  416. package/dist/plugins/adapt-sandbox-entry.mjs +2 -2
  417. package/dist/{preview-BfuRkVKW.mjs → preview-Dqv2hwXr.mjs} +2 -2
  418. package/dist/{preview-BfuRkVKW.mjs.map → preview-Dqv2hwXr.mjs.map} +1 -1
  419. package/dist/{public-url-BFVC2OTJ.mjs → public-url-D_zARuvZ.mjs} +1 -1
  420. package/dist/{public-url-BFVC2OTJ.mjs.map → public-url-D_zARuvZ.mjs.map} +1 -1
  421. package/dist/{query-CbUcI4Xk.mjs → query-Crm038Mc.mjs} +9 -9
  422. package/dist/{query-CbUcI4Xk.mjs.map → query-Crm038Mc.mjs.map} +1 -1
  423. package/dist/{rate-limit-C7hjdkS5.mjs → rate-limit-hRTBqmw1.mjs} +2 -2
  424. package/dist/{rate-limit-C7hjdkS5.mjs.map → rate-limit-hRTBqmw1.mjs.map} +1 -1
  425. package/dist/{redirect-B_q19j4v.mjs → redirect-C-OOkyku.mjs} +1 -1
  426. package/dist/{redirect-B_q19j4v.mjs.map → redirect-C-OOkyku.mjs.map} +1 -1
  427. package/dist/{redirects-CCbCqCCd.mjs → redirects-6Zg2SoYo.mjs} +8 -9
  428. package/dist/{redirects-CCbCqCCd.mjs.map → redirects-6Zg2SoYo.mjs.map} +1 -1
  429. package/dist/{redirects-DxVoR7PI.mjs → redirects-CP3TnTLO.mjs} +20 -14
  430. package/dist/redirects-CP3TnTLO.mjs.map +1 -0
  431. package/dist/{registry-brYh-rAT.mjs → registry-diMzD1Wf.mjs} +3 -3
  432. package/dist/{registry-brYh-rAT.mjs.map → registry-diMzD1Wf.mjs.map} +1 -1
  433. package/dist/{request-cache-D32LpnmI.mjs → request-cache-UwmBAiUK.mjs} +1 -1
  434. package/dist/{request-cache-D32LpnmI.mjs.map → request-cache-UwmBAiUK.mjs.map} +1 -1
  435. package/dist/{request-meta-7ByVLxB-.mjs → request-meta-DPechd0W.mjs} +2 -2
  436. package/dist/{request-meta-7ByVLxB-.mjs.map → request-meta-DPechd0W.mjs.map} +1 -1
  437. package/dist/{resolve-BqYMVG0D.mjs → resolve-B3NUUtVY.mjs} +1 -1
  438. package/dist/{resolve-BqYMVG0D.mjs.map → resolve-B3NUUtVY.mjs.map} +1 -1
  439. package/dist/{runner-DTdhuI9i.d.mts → runner-C8vcbvCe.d.mts} +2 -2
  440. package/dist/{runner-DTdhuI9i.d.mts.map → runner-C8vcbvCe.d.mts.map} +1 -1
  441. package/dist/runtime.d.mts +10 -10
  442. package/dist/runtime.mjs +1 -1
  443. package/dist/{schema-C1E70ug_.mjs → schema-BDOkd3OU.mjs} +4 -4
  444. package/dist/{schema-C1E70ug_.mjs.map → schema-BDOkd3OU.mjs.map} +1 -1
  445. package/dist/{search-B3SGZw91.mjs → search-Bs_J_EW-.mjs} +3 -3
  446. package/dist/{search-B3SGZw91.mjs.map → search-Bs_J_EW-.mjs.map} +1 -1
  447. package/dist/{secrets-ChPTmy9x.mjs → secrets-C8xmE6mR.mjs} +21 -11
  448. package/dist/secrets-C8xmE6mR.mjs.map +1 -0
  449. package/dist/{sections-D_lVzwRZ.mjs → sections-P0zuBlyz.mjs} +2 -2
  450. package/dist/{sections-D_lVzwRZ.mjs.map → sections-P0zuBlyz.mjs.map} +1 -1
  451. package/dist/seed/index.d.mts +2 -2
  452. package/dist/seed/index.mjs +14 -13
  453. package/dist/seo/index.d.mts +1 -1
  454. package/dist/seo/index.mjs +1 -1
  455. package/dist/{seo-D_LPkOtu.mjs → seo-CLhm-Fmb.mjs} +1 -1
  456. package/dist/{seo-D_LPkOtu.mjs.map → seo-CLhm-Fmb.mjs.map} +1 -1
  457. package/dist/{seo-B5e6y9Wk.mjs → seo-DpNgGQjF.mjs} +1 -1
  458. package/dist/{seo-B5e6y9Wk.mjs.map → seo-DpNgGQjF.mjs.map} +1 -1
  459. package/dist/{service-ChDcsTBs.mjs → service-CDQQnT8W.mjs} +2 -2
  460. package/dist/{service-ChDcsTBs.mjs.map → service-CDQQnT8W.mjs.map} +1 -1
  461. package/dist/{settings-DfxiWY_s.mjs → settings-BjBsmVAo.mjs} +10 -184
  462. package/dist/settings-BjBsmVAo.mjs.map +1 -0
  463. package/dist/{settings-Cv47v9u8.mjs → settings-sO0Fif4p.mjs} +2 -2
  464. package/dist/{settings-Cv47v9u8.mjs.map → settings-sO0Fif4p.mjs.map} +1 -1
  465. package/dist/{setup-complete-yvPE4OsP.mjs → setup-complete-CMMr-oZU.mjs} +1 -1
  466. package/dist/{setup-complete-yvPE4OsP.mjs.map → setup-complete-CMMr-oZU.mjs.map} +1 -1
  467. package/dist/{setup-nonce-C9aFzb94.mjs → setup-nonce-169xl4fV.mjs} +1 -1
  468. package/dist/{setup-nonce-C9aFzb94.mjs.map → setup-nonce-169xl4fV.mjs.map} +1 -1
  469. package/dist/single-flight-cache-C0UV1Npg.mjs +104 -0
  470. package/dist/single-flight-cache-C0UV1Npg.mjs.map +1 -0
  471. package/dist/{site-url-CnHlmAs9.mjs → site-url-vtsuOvSD.mjs} +1 -1
  472. package/dist/{site-url-CnHlmAs9.mjs.map → site-url-vtsuOvSD.mjs.map} +1 -1
  473. package/dist/{ssrf-BsVGIE0Z.mjs → ssrf-XO05Voq6.mjs} +1 -1
  474. package/dist/{ssrf-BsVGIE0Z.mjs.map → ssrf-XO05Voq6.mjs.map} +1 -1
  475. package/dist/status-2gZklYuj.mjs +30 -0
  476. package/dist/status-2gZklYuj.mjs.map +1 -0
  477. package/dist/storage/local.d.mts +1 -1
  478. package/dist/storage/local.mjs +2 -2
  479. package/dist/storage/s3.d.mts +1 -1
  480. package/dist/storage/s3.mjs +1 -1
  481. package/dist/{taxonomies-BdAmbOwx.mjs → taxonomies-BBxYA38v.mjs} +6 -6
  482. package/dist/{taxonomies-BdAmbOwx.mjs.map → taxonomies-BBxYA38v.mjs.map} +1 -1
  483. package/dist/{taxonomies-BILwiyGk.mjs → taxonomies-DuESHWKI.mjs} +2 -2
  484. package/dist/{taxonomies-BILwiyGk.mjs.map → taxonomies-DuESHWKI.mjs.map} +1 -1
  485. package/dist/{tokens-Bx2afeT-.mjs → tokens-DMkVjxrx.mjs} +1 -1
  486. package/dist/{tokens-Bx2afeT-.mjs.map → tokens-DMkVjxrx.mjs.map} +1 -1
  487. package/dist/{transport-CmpLD7W3.mjs → transport-1cIrOb1Y.mjs} +1 -1
  488. package/dist/{transport-CmpLD7W3.mjs.map → transport-1cIrOb1Y.mjs.map} +1 -1
  489. package/dist/{transport-B7PPP2CC.d.mts → transport-jdvsZEIt.d.mts} +1 -1
  490. package/dist/{transport-B7PPP2CC.d.mts.map → transport-jdvsZEIt.d.mts.map} +1 -1
  491. package/dist/{trusted-proxy-B4AfnoAp.mjs → trusted-proxy-CHp41Fjj.mjs} +1 -1
  492. package/dist/{trusted-proxy-B4AfnoAp.mjs.map → trusted-proxy-CHp41Fjj.mjs.map} +1 -1
  493. package/dist/{types-BFgrqwSk.d.mts → types-BFgYtuKd.d.mts} +1 -1
  494. package/dist/{types-BFgrqwSk.d.mts.map → types-BFgYtuKd.d.mts.map} +1 -1
  495. package/dist/{types-DZk_y-MU.mjs → types-BIduXPJk.mjs} +1 -1
  496. package/dist/{types-DZk_y-MU.mjs.map → types-BIduXPJk.mjs.map} +1 -1
  497. package/dist/{types-DTniiNto.d.mts → types-BTnnBYVX.d.mts} +2 -2
  498. package/dist/{types-DTniiNto.d.mts.map → types-BTnnBYVX.d.mts.map} +1 -1
  499. package/dist/{types-BUUVn1zr.d.mts → types-Bzfk2yC8.d.mts} +1 -1
  500. package/dist/{types-BUUVn1zr.d.mts.map → types-Bzfk2yC8.d.mts.map} +1 -1
  501. package/dist/{types-BH8-30hc.d.mts → types-CkEuk-Zr.d.mts} +1 -1
  502. package/dist/{types-BH8-30hc.d.mts.map → types-CkEuk-Zr.d.mts.map} +1 -1
  503. package/dist/{types-CPAPl93j.d.mts → types-DO7whVYU.d.mts} +2 -2
  504. package/dist/{types-CPAPl93j.d.mts.map → types-DO7whVYU.d.mts.map} +1 -1
  505. package/dist/{types-S15DXXNi.d.mts → types-DdkL6fyv.d.mts} +1 -1
  506. package/dist/{types-S15DXXNi.d.mts.map → types-DdkL6fyv.d.mts.map} +1 -1
  507. package/dist/{types-DpFmlNyB.mjs → types-DejCHqWT.mjs} +1 -1
  508. package/dist/{types-DpFmlNyB.mjs.map → types-DejCHqWT.mjs.map} +1 -1
  509. package/dist/{types-BPzXTV9x.d.mts → types-Del0VMij.d.mts} +1 -1
  510. package/dist/{types-BPzXTV9x.d.mts.map → types-Del0VMij.d.mts.map} +1 -1
  511. package/dist/{types-D4kUqbHh.d.mts → types-u_XxjbS8.d.mts} +1 -1
  512. package/dist/{types-D4kUqbHh.d.mts.map → types-u_XxjbS8.d.mts.map} +1 -1
  513. package/dist/{utils-C4Ih4DML.mjs → utils-C4M981Br.mjs} +1 -1
  514. package/dist/{utils-C4Ih4DML.mjs.map → utils-C4M981Br.mjs.map} +1 -1
  515. package/dist/{validate-Bz4vqcX1.mjs → validate-DGhQPXzI.mjs} +2 -2
  516. package/dist/{validate-Bz4vqcX1.mjs.map → validate-DGhQPXzI.mjs.map} +1 -1
  517. package/dist/{validate-CNwkPWzz.d.mts → validate-cJOiOvT2.d.mts} +5 -5
  518. package/dist/{validate-CNwkPWzz.d.mts.map → validate-cJOiOvT2.d.mts.map} +1 -1
  519. package/dist/{validation-DgGTJm3u.mjs → validation-DVHjPM1M.mjs} +5 -5
  520. package/dist/{validation-DgGTJm3u.mjs.map → validation-DVHjPM1M.mjs.map} +1 -1
  521. package/dist/version-BOjj_cfz.mjs +7 -0
  522. package/dist/{version-D-5txk2m.mjs.map → version-BOjj_cfz.mjs.map} +1 -1
  523. package/dist/{widgets-DZfmAbE4.mjs → widgets-Ci6hLwfO.mjs} +4 -4
  524. package/dist/{widgets-DZfmAbE4.mjs.map → widgets-Ci6hLwfO.mjs.map} +1 -1
  525. package/dist/{zod-generator-Djo_VHCt.mjs → zod-generator-CarzgPAu.mjs} +2 -2
  526. package/dist/{zod-generator-Djo_VHCt.mjs.map → zod-generator-CarzgPAu.mjs.map} +1 -1
  527. package/package.json +5 -5
  528. package/src/api/handlers/redirects.ts +24 -13
  529. package/src/api/schemas/redirects.ts +11 -4
  530. package/src/astro/integration/index.ts +44 -8
  531. package/src/astro/integration/routes.ts +46 -9
  532. package/src/astro/middleware/redirect.ts +12 -0
  533. package/src/bylines/field-defs-cache.ts +70 -20
  534. package/src/cli/commands/doctor.ts +1 -1
  535. package/src/config/secrets.ts +28 -14
  536. package/src/emdash-runtime.ts +5 -5
  537. package/src/redirects/status.ts +27 -0
  538. package/src/settings/index.ts +13 -13
  539. package/src/utils/{isolate-cache.ts → single-flight-cache.ts} +26 -21
  540. package/dist/byline-DUx48sJp.mjs.map +0 -1
  541. package/dist/redirects-DxVoR7PI.mjs.map +0 -1
  542. package/dist/secrets-ChPTmy9x.mjs.map +0 -1
  543. package/dist/settings-DfxiWY_s.mjs.map +0 -1
  544. package/dist/version-D-5txk2m.mjs +0 -7
  545. /package/dist/{api-tokens-Oq39ba-Z.mjs → api-tokens-C7ywRx7l.mjs} +0 -0
  546. /package/dist/{ssrf-BvgVcfNQ.mjs → ssrf-CRZGzjdL.mjs} +0 -0
  547. /package/dist/{types-CZI4E3qG.mjs → types-BoRm8-pp.mjs} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"_slug_.mjs","names":[],"sources":["../../../../../../../src/astro/routes/api/taxonomies/[name]/terms/[slug].ts"],"sourcesContent":["/**\n * Single term endpoint\n *\n * GET /_emdash/api/taxonomies/:name/terms/:slug[?locale=xx]\n * PUT /_emdash/api/taxonomies/:name/terms/:slug[?locale=xx]\n * DELETE /_emdash/api/taxonomies/:name/terms/:slug[?locale=xx]\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, handleError, requireDb, unwrapResult } from \"#api/error.js\";\nimport { handleTermDelete, handleTermGet, handleTermUpdate } from \"#api/handlers/taxonomies.js\";\nimport { isParseError, parseBody, parseQuery } from \"#api/parse.js\";\nimport { localeFilterQuery, updateTermBody } from \"#api/schemas.js\";\n\nexport const prerender = false;\n\n/**\n * Get a single term\n */\nexport const GET: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst { name, slug } = params;\n\tif (!name || !slug) return apiError(\"VALIDATION_ERROR\", \"Taxonomy name and slug required\", 400);\n\n\tconst dbErr = requireDb(emdash?.db);\n\tif (dbErr) return dbErr;\n\n\tconst denied = requirePerm(user, \"taxonomies: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 handleTermGet(emdash.db, name, slug, { locale: query.locale });\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to get term\", \"TERM_GET_ERROR\");\n\t}\n};\n\n/**\n * Update a term\n */\nexport const PUT: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst { name, slug } = params;\n\tif (!name || !slug) return apiError(\"VALIDATION_ERROR\", \"Taxonomy name and slug required\", 400);\n\n\tconst dbErr = requireDb(emdash?.db);\n\tif (dbErr) return dbErr;\n\n\tconst denied = requirePerm(user, \"taxonomies: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, updateTermBody);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst result = await handleTermUpdate(emdash.db, name, slug, body, { locale: query.locale });\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to update term\", \"TERM_UPDATE_ERROR\");\n\t}\n};\n\n/**\n * Delete a term\n */\nexport const DELETE: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst { name, slug } = params;\n\tif (!name || !slug) return apiError(\"VALIDATION_ERROR\", \"Taxonomy name and slug required\", 400);\n\n\tconst dbErr = requireDb(emdash?.db);\n\tif (dbErr) return dbErr;\n\n\tconst denied = requirePerm(user, \"taxonomies: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 handleTermDelete(emdash.db, name, slug, { locale: query.locale });\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to delete term\", \"TERM_DELETE_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AAgBA,MAAa,YAAY;;;;AAKzB,MAAa,MAAgB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACnE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,EAAE,MAAM,SAAS;AACvB,KAAI,CAAC,QAAQ,CAAC,KAAM,QAAO,SAAS,oBAAoB,mCAAmC,IAAI;CAE/F,MAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,KAAI,MAAO,QAAO;CAElB,MAAM,SAAS,YAAY,MAAM,kBAAkB;AACnD,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,MAAM,EAAE,QAAQ,MAAM,QAAQ,CAAC,CACxD;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,sBAAsB,iBAAiB;;;;;;AAOnE,MAAa,MAAgB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACnE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,EAAE,MAAM,SAAS;AACvB,KAAI,CAAC,QAAQ,CAAC,KAAM,QAAO,SAAS,oBAAoB,mCAAmC,IAAI;CAE/F,MAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,KAAI,MAAO,QAAO;CAElB,MAAM,SAAS,YAAY,MAAM,oBAAoB;AACrD,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,MAAM,MAAM,EAAE,QAAQ,MAAM,QAAQ,CAAC,CACjE;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,yBAAyB,oBAAoB;;;;;;AAOzE,MAAa,SAAmB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACtE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,EAAE,MAAM,SAAS;AACvB,KAAI,CAAC,QAAQ,CAAC,KAAM,QAAO,SAAS,oBAAoB,mCAAmC,IAAI;CAE/F,MAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,KAAI,MAAO,QAAO;CAElB,MAAM,SAAS,YAAY,MAAM,oBAAoB;AACrD,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,MAAM,EAAE,QAAQ,MAAM,QAAQ,CAAC,CAC3D;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,yBAAyB,oBAAoB"}
1
+ {"version":3,"file":"_slug_.mjs","names":[],"sources":["../../../../../../../src/astro/routes/api/taxonomies/[name]/terms/[slug].ts"],"sourcesContent":["/**\n * Single term endpoint\n *\n * GET /_emdash/api/taxonomies/:name/terms/:slug[?locale=xx]\n * PUT /_emdash/api/taxonomies/:name/terms/:slug[?locale=xx]\n * DELETE /_emdash/api/taxonomies/:name/terms/:slug[?locale=xx]\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, handleError, requireDb, unwrapResult } from \"#api/error.js\";\nimport { handleTermDelete, handleTermGet, handleTermUpdate } from \"#api/handlers/taxonomies.js\";\nimport { isParseError, parseBody, parseQuery } from \"#api/parse.js\";\nimport { localeFilterQuery, updateTermBody } from \"#api/schemas.js\";\n\nexport const prerender = false;\n\n/**\n * Get a single term\n */\nexport const GET: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst { name, slug } = params;\n\tif (!name || !slug) return apiError(\"VALIDATION_ERROR\", \"Taxonomy name and slug required\", 400);\n\n\tconst dbErr = requireDb(emdash?.db);\n\tif (dbErr) return dbErr;\n\n\tconst denied = requirePerm(user, \"taxonomies: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 handleTermGet(emdash.db, name, slug, { locale: query.locale });\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to get term\", \"TERM_GET_ERROR\");\n\t}\n};\n\n/**\n * Update a term\n */\nexport const PUT: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst { name, slug } = params;\n\tif (!name || !slug) return apiError(\"VALIDATION_ERROR\", \"Taxonomy name and slug required\", 400);\n\n\tconst dbErr = requireDb(emdash?.db);\n\tif (dbErr) return dbErr;\n\n\tconst denied = requirePerm(user, \"taxonomies: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, updateTermBody);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst result = await handleTermUpdate(emdash.db, name, slug, body, { locale: query.locale });\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to update term\", \"TERM_UPDATE_ERROR\");\n\t}\n};\n\n/**\n * Delete a term\n */\nexport const DELETE: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst { name, slug } = params;\n\tif (!name || !slug) return apiError(\"VALIDATION_ERROR\", \"Taxonomy name and slug required\", 400);\n\n\tconst dbErr = requireDb(emdash?.db);\n\tif (dbErr) return dbErr;\n\n\tconst denied = requirePerm(user, \"taxonomies: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 handleTermDelete(emdash.db, name, slug, { locale: query.locale });\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to delete term\", \"TERM_DELETE_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAgBA,MAAa,YAAY;;;;AAKzB,MAAa,MAAgB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACnE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,EAAE,MAAM,SAAS;AACvB,KAAI,CAAC,QAAQ,CAAC,KAAM,QAAO,SAAS,oBAAoB,mCAAmC,IAAI;CAE/F,MAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,KAAI,MAAO,QAAO;CAElB,MAAM,SAAS,YAAY,MAAM,kBAAkB;AACnD,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,MAAM,EAAE,QAAQ,MAAM,QAAQ,CAAC,CACxD;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,sBAAsB,iBAAiB;;;;;;AAOnE,MAAa,MAAgB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACnE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,EAAE,MAAM,SAAS;AACvB,KAAI,CAAC,QAAQ,CAAC,KAAM,QAAO,SAAS,oBAAoB,mCAAmC,IAAI;CAE/F,MAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,KAAI,MAAO,QAAO;CAElB,MAAM,SAAS,YAAY,MAAM,oBAAoB;AACrD,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,MAAM,MAAM,EAAE,QAAQ,MAAM,QAAQ,CAAC,CACjE;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,yBAAyB,oBAAoB;;;;;;AAOzE,MAAa,SAAmB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACtE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,EAAE,MAAM,SAAS;AACvB,KAAI,CAAC,QAAQ,CAAC,KAAM,QAAO,SAAS,oBAAoB,mCAAmC,IAAI;CAE/F,MAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,KAAI,MAAO,QAAO;CAElB,MAAM,SAAS,YAAY,MAAM,oBAAoB;AACrD,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,MAAM,EAAE,QAAQ,MAAM,QAAQ,CAAC,CAC3D;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,yBAAyB,oBAAoB"}
@@ -2,17 +2,18 @@ import "../../../../../../dialect-helpers-DRI5pyY3.mjs";
2
2
  import "../../../../../../base64-CqR-7kqF.mjs";
3
3
  import "../../../../../../types-BXSUSAjt.mjs";
4
4
  import "../../../../../../taxonomy-CdllE4oq.mjs";
5
- import "../../../../../../request-cache-D32LpnmI.mjs";
6
- import "../../../../../../loader-ZN1ll-d-.mjs";
7
- import "../../../../../../resolve-BqYMVG0D.mjs";
8
- import "../../../../../../taxonomies-BdAmbOwx.mjs";
9
- import { o as handleTermList, r as handleTermCreate } from "../../../../../../taxonomies-BILwiyGk.mjs";
10
- import { a as unwrapResult, i as requireDb, r as handleError, t as apiError } from "../../../../../../error-RwM4dD35.mjs";
11
- import { i as parseQuery, n as parseBody, t as isParseError } from "../../../../../../parse-CrGndy1A.mjs";
12
- import { H as createTermBody, Pn as localeFilterQuery } from "../../../../../../redirects-CCbCqCCd.mjs";
13
- import "../../../../../../byline-fields-8TMtkBnH.mjs";
5
+ import "../../../../../../request-cache-UwmBAiUK.mjs";
6
+ import "../../../../../../loader-BqWjcH3h.mjs";
7
+ import "../../../../../../resolve-B3NUUtVY.mjs";
8
+ import "../../../../../../taxonomies-BBxYA38v.mjs";
9
+ import { o as handleTermList, r as handleTermCreate } from "../../../../../../taxonomies-DuESHWKI.mjs";
10
+ import { a as unwrapResult, i as requireDb, r as handleError, t as apiError } from "../../../../../../error-CNn_w7jf.mjs";
11
+ import { i as parseQuery, n as parseBody, t as isParseError } from "../../../../../../parse-DzSrk1t8.mjs";
12
+ import { H as createTermBody, Pn as localeFilterQuery } from "../../../../../../redirects-6Zg2SoYo.mjs";
13
+ import "../../../../../../byline-fields-B0NO1yUB.mjs";
14
+ import "../../../../../../status-2gZklYuj.mjs";
14
15
  import "../../../../../../api/schemas/index.mjs";
15
- import { n as requirePerm } from "../../../../../../authorize-DsMSVSaY.mjs";
16
+ import { n as requirePerm } from "../../../../../../authorize-D5gfBVU5.mjs";
16
17
 
17
18
  //#region src/astro/routes/api/taxonomies/[name]/terms/index.ts
18
19
  const prerender = false;
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../../../../../src/astro/routes/api/taxonomies/[name]/terms/index.ts"],"sourcesContent":["/**\n * Taxonomy terms list and create endpoint\n *\n * GET /_emdash/api/taxonomies/:name/terms[?locale=xx] - List terms (tree for hierarchical)\n * POST /_emdash/api/taxonomies/:name/terms - Create a new term (body may include locale & translationOf)\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, handleError, requireDb, unwrapResult } from \"#api/error.js\";\nimport { handleTermCreate, handleTermList } from \"#api/handlers/taxonomies.js\";\nimport { isParseError, parseBody, parseQuery } from \"#api/parse.js\";\nimport { createTermBody, localeFilterQuery } from \"#api/schemas.js\";\n\nexport const prerender = false;\n\n/**\n * List all terms for a taxonomy\n */\nexport const GET: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst { name } = params;\n\tif (!name) return apiError(\"VALIDATION_ERROR\", \"Taxonomy name required\", 400);\n\n\tconst dbErr = requireDb(emdash?.db);\n\tif (dbErr) return dbErr;\n\n\tconst denied = requirePerm(user, \"taxonomies: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 handleTermList(emdash.db, name, { locale: query.locale });\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to list terms\", \"TERM_LIST_ERROR\");\n\t}\n};\n\n/**\n * Create a new term\n */\nexport const POST: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst { name } = params;\n\tif (!name) return apiError(\"VALIDATION_ERROR\", \"Taxonomy name required\", 400);\n\n\tconst dbErr = requireDb(emdash?.db);\n\tif (dbErr) return dbErr;\n\n\tconst denied = requirePerm(user, \"taxonomies:manage\");\n\tif (denied) return denied;\n\n\ttry {\n\t\tconst body = await parseBody(request, createTermBody);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst result = await handleTermCreate(emdash.db, name, body);\n\t\treturn unwrapResult(result, 201);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to create term\", \"TERM_CREATE_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AAeA,MAAa,YAAY;;;;AAKzB,MAAa,MAAgB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACnE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,EAAE,SAAS;AACjB,KAAI,CAAC,KAAM,QAAO,SAAS,oBAAoB,0BAA0B,IAAI;CAE7E,MAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,KAAI,MAAO,QAAO;CAElB,MAAM,SAAS,YAAY,MAAM,kBAAkB;AACnD,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,MAAM,EAAE,QAAQ,MAAM,QAAQ,CAAC,CACnD;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,wBAAwB,kBAAkB;;;;;;AAOtE,MAAa,OAAiB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACpE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,EAAE,SAAS;AACjB,KAAI,CAAC,KAAM,QAAO,SAAS,oBAAoB,0BAA0B,IAAI;CAE7E,MAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,KAAI,MAAO,QAAO;CAElB,MAAM,SAAS,YAAY,MAAM,oBAAoB;AACrD,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,MAAM,KAAK,EAChC,IAAI;UACxB,OAAO;AACf,SAAO,YAAY,OAAO,yBAAyB,oBAAoB"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../../../../src/astro/routes/api/taxonomies/[name]/terms/index.ts"],"sourcesContent":["/**\n * Taxonomy terms list and create endpoint\n *\n * GET /_emdash/api/taxonomies/:name/terms[?locale=xx] - List terms (tree for hierarchical)\n * POST /_emdash/api/taxonomies/:name/terms - Create a new term (body may include locale & translationOf)\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, handleError, requireDb, unwrapResult } from \"#api/error.js\";\nimport { handleTermCreate, handleTermList } from \"#api/handlers/taxonomies.js\";\nimport { isParseError, parseBody, parseQuery } from \"#api/parse.js\";\nimport { createTermBody, localeFilterQuery } from \"#api/schemas.js\";\n\nexport const prerender = false;\n\n/**\n * List all terms for a taxonomy\n */\nexport const GET: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst { name } = params;\n\tif (!name) return apiError(\"VALIDATION_ERROR\", \"Taxonomy name required\", 400);\n\n\tconst dbErr = requireDb(emdash?.db);\n\tif (dbErr) return dbErr;\n\n\tconst denied = requirePerm(user, \"taxonomies: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 handleTermList(emdash.db, name, { locale: query.locale });\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to list terms\", \"TERM_LIST_ERROR\");\n\t}\n};\n\n/**\n * Create a new term\n */\nexport const POST: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst { name } = params;\n\tif (!name) return apiError(\"VALIDATION_ERROR\", \"Taxonomy name required\", 400);\n\n\tconst dbErr = requireDb(emdash?.db);\n\tif (dbErr) return dbErr;\n\n\tconst denied = requirePerm(user, \"taxonomies:manage\");\n\tif (denied) return denied;\n\n\ttry {\n\t\tconst body = await parseBody(request, createTermBody);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst result = await handleTermCreate(emdash.db, name, body);\n\t\treturn unwrapResult(result, 201);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to create term\", \"TERM_CREATE_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAeA,MAAa,YAAY;;;;AAKzB,MAAa,MAAgB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACnE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,EAAE,SAAS;AACjB,KAAI,CAAC,KAAM,QAAO,SAAS,oBAAoB,0BAA0B,IAAI;CAE7E,MAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,KAAI,MAAO,QAAO;CAElB,MAAM,SAAS,YAAY,MAAM,kBAAkB;AACnD,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,MAAM,EAAE,QAAQ,MAAM,QAAQ,CAAC,CACnD;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,wBAAwB,kBAAkB;;;;;;AAOtE,MAAa,OAAiB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACpE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,EAAE,SAAS;AACjB,KAAI,CAAC,KAAM,QAAO,SAAS,oBAAoB,0BAA0B,IAAI;CAE7E,MAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,KAAI,MAAO,QAAO;CAElB,MAAM,SAAS,YAAY,MAAM,oBAAoB;AACrD,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,MAAM,KAAK,EAChC,IAAI;UACxB,OAAO;AACf,SAAO,YAAY,OAAO,yBAAyB,oBAAoB"}
@@ -2,17 +2,18 @@ import "../../../../dialect-helpers-DRI5pyY3.mjs";
2
2
  import "../../../../base64-CqR-7kqF.mjs";
3
3
  import "../../../../types-BXSUSAjt.mjs";
4
4
  import "../../../../taxonomy-CdllE4oq.mjs";
5
- import "../../../../request-cache-D32LpnmI.mjs";
6
- import "../../../../loader-ZN1ll-d-.mjs";
7
- import "../../../../resolve-BqYMVG0D.mjs";
8
- import "../../../../taxonomies-BdAmbOwx.mjs";
9
- import { n as handleTaxonomyList, t as handleTaxonomyCreate } from "../../../../taxonomies-BILwiyGk.mjs";
10
- import { a as unwrapResult, i as requireDb, r as handleError } from "../../../../error-RwM4dD35.mjs";
11
- import { i as parseQuery, n as parseBody, t as isParseError } from "../../../../parse-CrGndy1A.mjs";
12
- import { Pn as localeFilterQuery, V as createTaxonomyDefBody } from "../../../../redirects-CCbCqCCd.mjs";
13
- import "../../../../byline-fields-8TMtkBnH.mjs";
5
+ import "../../../../request-cache-UwmBAiUK.mjs";
6
+ import "../../../../loader-BqWjcH3h.mjs";
7
+ import "../../../../resolve-B3NUUtVY.mjs";
8
+ import "../../../../taxonomies-BBxYA38v.mjs";
9
+ import { n as handleTaxonomyList, t as handleTaxonomyCreate } from "../../../../taxonomies-DuESHWKI.mjs";
10
+ import { a as unwrapResult, i as requireDb, r as handleError } from "../../../../error-CNn_w7jf.mjs";
11
+ import { i as parseQuery, n as parseBody, t as isParseError } from "../../../../parse-DzSrk1t8.mjs";
12
+ import { Pn as localeFilterQuery, V as createTaxonomyDefBody } from "../../../../redirects-6Zg2SoYo.mjs";
13
+ import "../../../../byline-fields-B0NO1yUB.mjs";
14
+ import "../../../../status-2gZklYuj.mjs";
14
15
  import "../../../../api/schemas/index.mjs";
15
- import { n as requirePerm } from "../../../../authorize-DsMSVSaY.mjs";
16
+ import { n as requirePerm } from "../../../../authorize-D5gfBVU5.mjs";
16
17
 
17
18
  //#region src/astro/routes/api/taxonomies/index.ts
18
19
  const prerender = false;
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../../../src/astro/routes/api/taxonomies/index.ts"],"sourcesContent":["/**\n * Taxonomy definitions endpoint\n *\n * GET /_emdash/api/taxonomies[?locale=xx] - List taxonomy definitions\n * POST /_emdash/api/taxonomies - Create a custom taxonomy definition\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { handleError, requireDb, unwrapResult } from \"#api/error.js\";\nimport { handleTaxonomyCreate, handleTaxonomyList } from \"#api/handlers/taxonomies.js\";\nimport { isParseError, parseBody, parseQuery } from \"#api/parse.js\";\nimport { createTaxonomyDefBody, localeFilterQuery } from \"#api/schemas.js\";\n\nexport const prerender = false;\n\n/**\n * List taxonomy definitions\n */\nexport const GET: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tconst dbErr = requireDb(emdash?.db);\n\tif (dbErr) return dbErr;\n\n\tconst denied = requirePerm(user, \"taxonomies: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 handleTaxonomyList(emdash.db, { locale: query.locale });\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to list taxonomies\", \"TAXONOMY_LIST_ERROR\");\n\t}\n};\n\n/**\n * Create a custom taxonomy definition\n */\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tconst dbErr = requireDb(emdash?.db);\n\tif (dbErr) return dbErr;\n\n\tconst denied = requirePerm(user, \"taxonomies:manage\");\n\tif (denied) return denied;\n\n\ttry {\n\t\tconst body = await parseBody(request, createTaxonomyDefBody);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst result = await handleTaxonomyCreate(emdash.db, body);\n\t\treturn unwrapResult(result, 201);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to create taxonomy\", \"TAXONOMY_CREATE_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AAeA,MAAa,YAAY;;;;AAKzB,MAAa,MAAgB,OAAO,EAAE,SAAS,aAAa;CAC3D,MAAM,EAAE,QAAQ,SAAS;CAEzB,MAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,KAAI,MAAO,QAAO;CAElB,MAAM,SAAS,YAAY,MAAM,kBAAkB;AACnD,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,mBAAmB,OAAO,IAAI,EAAE,QAAQ,MAAM,QAAQ,CAAC,CACjD;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,6BAA6B,sBAAsB;;;;;;AAO/E,MAAa,OAAiB,OAAO,EAAE,SAAS,aAAa;CAC5D,MAAM,EAAE,QAAQ,SAAS;CAEzB,MAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,KAAI,MAAO,QAAO;CAElB,MAAM,SAAS,YAAY,MAAM,oBAAoB;AACrD,KAAI,OAAQ,QAAO;AAEnB,KAAI;EACH,MAAM,OAAO,MAAM,UAAU,SAAS,sBAAsB;AAC5D,MAAI,aAAa,KAAK,CAAE,QAAO;AAG/B,SAAO,aADQ,MAAM,qBAAqB,OAAO,IAAI,KAAK,EAC9B,IAAI;UACxB,OAAO;AACf,SAAO,YAAY,OAAO,6BAA6B,wBAAwB"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../../src/astro/routes/api/taxonomies/index.ts"],"sourcesContent":["/**\n * Taxonomy definitions endpoint\n *\n * GET /_emdash/api/taxonomies[?locale=xx] - List taxonomy definitions\n * POST /_emdash/api/taxonomies - Create a custom taxonomy definition\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { handleError, requireDb, unwrapResult } from \"#api/error.js\";\nimport { handleTaxonomyCreate, handleTaxonomyList } from \"#api/handlers/taxonomies.js\";\nimport { isParseError, parseBody, parseQuery } from \"#api/parse.js\";\nimport { createTaxonomyDefBody, localeFilterQuery } from \"#api/schemas.js\";\n\nexport const prerender = false;\n\n/**\n * List taxonomy definitions\n */\nexport const GET: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tconst dbErr = requireDb(emdash?.db);\n\tif (dbErr) return dbErr;\n\n\tconst denied = requirePerm(user, \"taxonomies: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 handleTaxonomyList(emdash.db, { locale: query.locale });\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to list taxonomies\", \"TAXONOMY_LIST_ERROR\");\n\t}\n};\n\n/**\n * Create a custom taxonomy definition\n */\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tconst dbErr = requireDb(emdash?.db);\n\tif (dbErr) return dbErr;\n\n\tconst denied = requirePerm(user, \"taxonomies:manage\");\n\tif (denied) return denied;\n\n\ttry {\n\t\tconst body = await parseBody(request, createTaxonomyDefBody);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst result = await handleTaxonomyCreate(emdash.db, body);\n\t\treturn unwrapResult(result, 201);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to create taxonomy\", \"TAXONOMY_CREATE_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAeA,MAAa,YAAY;;;;AAKzB,MAAa,MAAgB,OAAO,EAAE,SAAS,aAAa;CAC3D,MAAM,EAAE,QAAQ,SAAS;CAEzB,MAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,KAAI,MAAO,QAAO;CAElB,MAAM,SAAS,YAAY,MAAM,kBAAkB;AACnD,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,mBAAmB,OAAO,IAAI,EAAE,QAAQ,MAAM,QAAQ,CAAC,CACjD;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,6BAA6B,sBAAsB;;;;;;AAO/E,MAAa,OAAiB,OAAO,EAAE,SAAS,aAAa;CAC5D,MAAM,EAAE,QAAQ,SAAS;CAEzB,MAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,KAAI,MAAO,QAAO;CAElB,MAAM,SAAS,YAAY,MAAM,oBAAoB;AACrD,KAAI,OAAQ,QAAO;AAEnB,KAAI;EACH,MAAM,OAAO,MAAM,UAAU,SAAS,sBAAsB;AAC5D,MAAI,aAAa,KAAK,CAAE,QAAO;AAG/B,SAAO,aADQ,MAAM,qBAAqB,OAAO,IAAI,KAAK,EAC9B,IAAI;UACxB,OAAO;AACf,SAAO,YAAY,OAAO,6BAA6B,wBAAwB"}
@@ -1,10 +1,11 @@
1
1
  import "../../../../base64-CqR-7kqF.mjs";
2
2
  import "../../../../types-BXSUSAjt.mjs";
3
3
  import "../../../../options-BPCVnesz.mjs";
4
- import { n as apiSuccess, t as apiError } from "../../../../error-RwM4dD35.mjs";
5
- import { n as getPublicOrigin } from "../../../../public-url-BFVC2OTJ.mjs";
6
- import { i as resolveSecretsCached } from "../../../../secrets-ChPTmy9x.mjs";
7
- import { n as requirePerm } from "../../../../authorize-DsMSVSaY.mjs";
4
+ import "../../../../init-lock-DlBHjf9-.mjs";
5
+ import { n as apiSuccess, t as apiError } from "../../../../error-CNn_w7jf.mjs";
6
+ import { n as getPublicOrigin } from "../../../../public-url-D_zARuvZ.mjs";
7
+ import { i as resolveSecretsCached } from "../../../../secrets-C8xmE6mR.mjs";
8
+ import { n as requirePerm } from "../../../../authorize-D5gfBVU5.mjs";
8
9
 
9
10
  //#region src/astro/routes/api/themes/preview.ts
10
11
  const prerender = false;
@@ -1 +1 @@
1
- {"version":3,"file":"preview.mjs","names":[],"sources":["../../../../../src/astro/routes/api/themes/preview.ts"],"sourcesContent":["/**\n * Theme preview signing endpoint\n *\n * POST /_emdash/api/themes/preview\n *\n * Generates a signed preview URL for the \"Try with my data\" feature.\n *\n * Uses the resolved preview secret: env override (`EMDASH_PREVIEW_SECRET`)\n * wins, otherwise an auto-generated stable per-site value persisted in the\n * options table is used. Processes that share the same database converge on\n * the same auto-generated value; only set `EMDASH_PREVIEW_SECRET` in both\n * processes when the verifying side runs without access to the EmDash DB\n * (e.g. a remote preview Worker).\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess } from \"#api/error.js\";\nimport { getPublicOrigin } from \"#api/public-url.js\";\nimport { resolveSecretsCached } from \"#config/secrets.js\";\n\nexport const prerender = false;\n\nexport const POST: APIRoute = async ({ request, url, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tif (!emdash?.db) {\n\t\treturn apiError(\"NOT_CONFIGURED\", \"EmDash is not initialized\", 500);\n\t}\n\n\tconst denied = requirePerm(user, \"plugins:read\");\n\tif (denied) return denied;\n\n\t// Always non-empty after resolution; env override wins, otherwise a\n\t// stable DB-stored value is used.\n\tconst { previewSecret: secret } = await resolveSecretsCached(emdash.db);\n\n\tlet body: { previewUrl: string };\n\ttry {\n\t\tbody = await request.json();\n\t} catch {\n\t\treturn apiError(\"INVALID_REQUEST\", \"Invalid JSON body\", 400);\n\t}\n\n\tif (!body.previewUrl || typeof body.previewUrl !== \"string\") {\n\t\treturn apiError(\"INVALID_REQUEST\", \"previewUrl is required\", 400);\n\t}\n\n\t// Validate previewUrl is a valid HTTPS URL\n\tlet parsedPreviewUrl: URL;\n\ttry {\n\t\tparsedPreviewUrl = new URL(body.previewUrl);\n\t} catch {\n\t\treturn apiError(\"INVALID_REQUEST\", \"previewUrl must be a valid URL\", 400);\n\t}\n\n\tif (parsedPreviewUrl.protocol !== \"https:\") {\n\t\treturn apiError(\"INVALID_REQUEST\", \"previewUrl must use HTTPS\", 400);\n\t}\n\n\tconst source = getPublicOrigin(url, emdash?.config);\n\tconst ttl = 3600; // 1 hour\n\tconst exp = Math.floor(Date.now() / 1000) + ttl;\n\n\t// HMAC-SHA256 sign: message = \"source:exp\"\n\tconst encoder = new TextEncoder();\n\tconst key = await crypto.subtle.importKey(\n\t\t\"raw\",\n\t\tencoder.encode(secret),\n\t\t{ name: \"HMAC\", hash: \"SHA-256\" },\n\t\tfalse,\n\t\t[\"sign\"],\n\t);\n\tconst buffer = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(`${source}:${exp}`));\n\tconst sig = Array.from(new Uint8Array(buffer), (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n\n\tconst previewUrl = new URL(body.previewUrl);\n\tpreviewUrl.searchParams.set(\"source\", source);\n\tpreviewUrl.searchParams.set(\"exp\", String(exp));\n\tpreviewUrl.searchParams.set(\"sig\", sig);\n\n\treturn apiSuccess({ url: previewUrl.toString() });\n};\n"],"mappings":";;;;;;;;;AAsBA,MAAa,YAAY;AAEzB,MAAa,OAAiB,OAAO,EAAE,SAAS,KAAK,aAAa;CACjE,MAAM,EAAE,QAAQ,SAAS;AAEzB,KAAI,CAAC,QAAQ,GACZ,QAAO,SAAS,kBAAkB,6BAA6B,IAAI;CAGpE,MAAM,SAAS,YAAY,MAAM,eAAe;AAChD,KAAI,OAAQ,QAAO;CAInB,MAAM,EAAE,eAAe,WAAW,MAAM,qBAAqB,OAAO,GAAG;CAEvE,IAAI;AACJ,KAAI;AACH,SAAO,MAAM,QAAQ,MAAM;SACpB;AACP,SAAO,SAAS,mBAAmB,qBAAqB,IAAI;;AAG7D,KAAI,CAAC,KAAK,cAAc,OAAO,KAAK,eAAe,SAClD,QAAO,SAAS,mBAAmB,0BAA0B,IAAI;CAIlE,IAAI;AACJ,KAAI;AACH,qBAAmB,IAAI,IAAI,KAAK,WAAW;SACpC;AACP,SAAO,SAAS,mBAAmB,kCAAkC,IAAI;;AAG1E,KAAI,iBAAiB,aAAa,SACjC,QAAO,SAAS,mBAAmB,6BAA6B,IAAI;CAGrE,MAAM,SAAS,gBAAgB,KAAK,QAAQ,OAAO;CAEnD,MAAM,MAAM,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK,GAD7B;CAIZ,MAAM,UAAU,IAAI,aAAa;CACjC,MAAM,MAAM,MAAM,OAAO,OAAO,UAC/B,OACA,QAAQ,OAAO,OAAO,EACtB;EAAE,MAAM;EAAQ,MAAM;EAAW,EACjC,OACA,CAAC,OAAO,CACR;CACD,MAAM,SAAS,MAAM,OAAO,OAAO,KAAK,QAAQ,KAAK,QAAQ,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;CACxF,MAAM,MAAM,MAAM,KAAK,IAAI,WAAW,OAAO,GAAG,MAAM,EAAE,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,KAAK,GAAG;CAE/F,MAAM,aAAa,IAAI,IAAI,KAAK,WAAW;AAC3C,YAAW,aAAa,IAAI,UAAU,OAAO;AAC7C,YAAW,aAAa,IAAI,OAAO,OAAO,IAAI,CAAC;AAC/C,YAAW,aAAa,IAAI,OAAO,IAAI;AAEvC,QAAO,WAAW,EAAE,KAAK,WAAW,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"preview.mjs","names":[],"sources":["../../../../../src/astro/routes/api/themes/preview.ts"],"sourcesContent":["/**\n * Theme preview signing endpoint\n *\n * POST /_emdash/api/themes/preview\n *\n * Generates a signed preview URL for the \"Try with my data\" feature.\n *\n * Uses the resolved preview secret: env override (`EMDASH_PREVIEW_SECRET`)\n * wins, otherwise an auto-generated stable per-site value persisted in the\n * options table is used. Processes that share the same database converge on\n * the same auto-generated value; only set `EMDASH_PREVIEW_SECRET` in both\n * processes when the verifying side runs without access to the EmDash DB\n * (e.g. a remote preview Worker).\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess } from \"#api/error.js\";\nimport { getPublicOrigin } from \"#api/public-url.js\";\nimport { resolveSecretsCached } from \"#config/secrets.js\";\n\nexport const prerender = false;\n\nexport const POST: APIRoute = async ({ request, url, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tif (!emdash?.db) {\n\t\treturn apiError(\"NOT_CONFIGURED\", \"EmDash is not initialized\", 500);\n\t}\n\n\tconst denied = requirePerm(user, \"plugins:read\");\n\tif (denied) return denied;\n\n\t// Always non-empty after resolution; env override wins, otherwise a\n\t// stable DB-stored value is used.\n\tconst { previewSecret: secret } = await resolveSecretsCached(emdash.db);\n\n\tlet body: { previewUrl: string };\n\ttry {\n\t\tbody = await request.json();\n\t} catch {\n\t\treturn apiError(\"INVALID_REQUEST\", \"Invalid JSON body\", 400);\n\t}\n\n\tif (!body.previewUrl || typeof body.previewUrl !== \"string\") {\n\t\treturn apiError(\"INVALID_REQUEST\", \"previewUrl is required\", 400);\n\t}\n\n\t// Validate previewUrl is a valid HTTPS URL\n\tlet parsedPreviewUrl: URL;\n\ttry {\n\t\tparsedPreviewUrl = new URL(body.previewUrl);\n\t} catch {\n\t\treturn apiError(\"INVALID_REQUEST\", \"previewUrl must be a valid URL\", 400);\n\t}\n\n\tif (parsedPreviewUrl.protocol !== \"https:\") {\n\t\treturn apiError(\"INVALID_REQUEST\", \"previewUrl must use HTTPS\", 400);\n\t}\n\n\tconst source = getPublicOrigin(url, emdash?.config);\n\tconst ttl = 3600; // 1 hour\n\tconst exp = Math.floor(Date.now() / 1000) + ttl;\n\n\t// HMAC-SHA256 sign: message = \"source:exp\"\n\tconst encoder = new TextEncoder();\n\tconst key = await crypto.subtle.importKey(\n\t\t\"raw\",\n\t\tencoder.encode(secret),\n\t\t{ name: \"HMAC\", hash: \"SHA-256\" },\n\t\tfalse,\n\t\t[\"sign\"],\n\t);\n\tconst buffer = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(`${source}:${exp}`));\n\tconst sig = Array.from(new Uint8Array(buffer), (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n\n\tconst previewUrl = new URL(body.previewUrl);\n\tpreviewUrl.searchParams.set(\"source\", source);\n\tpreviewUrl.searchParams.set(\"exp\", String(exp));\n\tpreviewUrl.searchParams.set(\"sig\", sig);\n\n\treturn apiSuccess({ url: previewUrl.toString() });\n};\n"],"mappings":";;;;;;;;;;AAsBA,MAAa,YAAY;AAEzB,MAAa,OAAiB,OAAO,EAAE,SAAS,KAAK,aAAa;CACjE,MAAM,EAAE,QAAQ,SAAS;AAEzB,KAAI,CAAC,QAAQ,GACZ,QAAO,SAAS,kBAAkB,6BAA6B,IAAI;CAGpE,MAAM,SAAS,YAAY,MAAM,eAAe;AAChD,KAAI,OAAQ,QAAO;CAInB,MAAM,EAAE,eAAe,WAAW,MAAM,qBAAqB,OAAO,GAAG;CAEvE,IAAI;AACJ,KAAI;AACH,SAAO,MAAM,QAAQ,MAAM;SACpB;AACP,SAAO,SAAS,mBAAmB,qBAAqB,IAAI;;AAG7D,KAAI,CAAC,KAAK,cAAc,OAAO,KAAK,eAAe,SAClD,QAAO,SAAS,mBAAmB,0BAA0B,IAAI;CAIlE,IAAI;AACJ,KAAI;AACH,qBAAmB,IAAI,IAAI,KAAK,WAAW;SACpC;AACP,SAAO,SAAS,mBAAmB,kCAAkC,IAAI;;AAG1E,KAAI,iBAAiB,aAAa,SACjC,QAAO,SAAS,mBAAmB,6BAA6B,IAAI;CAGrE,MAAM,SAAS,gBAAgB,KAAK,QAAQ,OAAO;CAEnD,MAAM,MAAM,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK,GAD7B;CAIZ,MAAM,UAAU,IAAI,aAAa;CACjC,MAAM,MAAM,MAAM,OAAO,OAAO,UAC/B,OACA,QAAQ,OAAO,OAAO,EACtB;EAAE,MAAM;EAAQ,MAAM;EAAW,EACjC,OACA,CAAC,OAAO,CACR;CACD,MAAM,SAAS,MAAM,OAAO,OAAO,KAAK,QAAQ,KAAK,QAAQ,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;CACxF,MAAM,MAAM,MAAM,KAAK,IAAI,WAAW,OAAO,GAAG,MAAM,EAAE,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,KAAK,GAAG;CAE/F,MAAM,aAAa,IAAI,IAAI,KAAK,WAAW;AAC3C,YAAW,aAAa,IAAI,UAAU,OAAO;AAC7C,YAAW,aAAa,IAAI,OAAO,OAAO,IAAI,CAAC;AAC/C,YAAW,aAAa,IAAI,OAAO,IAAI;AAEvC,QAAO,WAAW,EAAE,KAAK,WAAW,UAAU,EAAE,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import "../../../base64-CqR-7kqF.mjs";
2
2
  import "../../../types-BXSUSAjt.mjs";
3
- import { n as apiSuccess, r as handleError, t as apiError } from "../../../error-RwM4dD35.mjs";
3
+ import { n as apiSuccess, r as handleError, t as apiError } from "../../../error-CNn_w7jf.mjs";
4
4
 
5
5
  //#region src/astro/routes/api/typegen.ts
6
6
  const prerender = false;
@@ -19,7 +19,7 @@ async function safeListCollections(registry) {
19
19
  * Generate types content and metadata from the current schema.
20
20
  */
21
21
  async function generateTypes(registry) {
22
- const { generateTypesFile, generateSchemaHash } = await import("../../../zod-generator-Djo_VHCt.mjs").then((n) => n.r);
22
+ const { generateTypesFile, generateSchemaHash } = await import("../../../zod-generator-CarzgPAu.mjs").then((n) => n.r);
23
23
  const collections = await safeListCollections(registry);
24
24
  const collectionsWithFields = await Promise.all(collections.map(async (c) => {
25
25
  const fields = await registry.listFields(c.id);
@@ -42,7 +42,7 @@ const GET = async ({ locals }) => {
42
42
  const { emdash } = locals;
43
43
  if (!emdash?.db) return apiError("NOT_CONFIGURED", "EmDash not configured", 500);
44
44
  try {
45
- const { SchemaRegistry } = await import("../../../registry-brYh-rAT.mjs").then((n) => n.r);
45
+ const { SchemaRegistry } = await import("../../../registry-diMzD1Wf.mjs").then((n) => n.r);
46
46
  const { types } = await generateTypes(new SchemaRegistry(emdash.db));
47
47
  return new Response(types, {
48
48
  status: 200,
@@ -66,7 +66,7 @@ const POST = async ({ locals }) => {
66
66
  const { emdash } = locals;
67
67
  if (!emdash?.db) return apiError("NOT_CONFIGURED", "EmDash not configured", 500);
68
68
  try {
69
- const { SchemaRegistry } = await import("../../../registry-brYh-rAT.mjs").then((n) => n.r);
69
+ const { SchemaRegistry } = await import("../../../registry-diMzD1Wf.mjs").then((n) => n.r);
70
70
  return apiSuccess(await generateTypes(new SchemaRegistry(emdash.db)));
71
71
  } catch (error) {
72
72
  return handleError(error, "Typegen failed", "TYPEGEN_ERROR");
@@ -1,5 +1,5 @@
1
1
  import { t as OptionsRepository } from "../../../../options-BPCVnesz.mjs";
2
- import { t as getAuthMode } from "../../../../mode-CO2vQHfq.mjs";
2
+ import { t as getAuthMode } from "../../../../mode-CGXzIbD8.mjs";
3
3
 
4
4
  //#region src/astro/routes/api/well-known/auth.ts
5
5
  const prerender = false;
@@ -1,5 +1,5 @@
1
- import { n as getPublicOrigin } from "../../../../public-url-BFVC2OTJ.mjs";
2
- import { n as VALID_SCOPES } from "../../../../api-tokens-Oq39ba-Z.mjs";
1
+ import { n as getPublicOrigin } from "../../../../public-url-D_zARuvZ.mjs";
2
+ import { n as VALID_SCOPES } from "../../../../api-tokens-C7ywRx7l.mjs";
3
3
 
4
4
  //#region src/astro/routes/api/well-known/oauth-authorization-server.ts
5
5
  const prerender = false;
@@ -1,5 +1,5 @@
1
- import { n as getPublicOrigin } from "../../../../public-url-BFVC2OTJ.mjs";
2
- import { n as VALID_SCOPES } from "../../../../api-tokens-Oq39ba-Z.mjs";
1
+ import { n as getPublicOrigin } from "../../../../public-url-D_zARuvZ.mjs";
2
+ import { n as VALID_SCOPES } from "../../../../api-tokens-C7ywRx7l.mjs";
3
3
 
4
4
  //#region src/astro/routes/api/well-known/oauth-protected-resource.ts
5
5
  const prerender = false;
@@ -1,11 +1,12 @@
1
1
  import "../../../../../base64-CqR-7kqF.mjs";
2
2
  import "../../../../../types-BXSUSAjt.mjs";
3
- import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../error-RwM4dD35.mjs";
4
- import { n as parseBody, t as isParseError } from "../../../../../parse-CrGndy1A.mjs";
5
- import { h as reorderWidgetsBody } from "../../../../../redirects-CCbCqCCd.mjs";
6
- import "../../../../../byline-fields-8TMtkBnH.mjs";
3
+ import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../error-CNn_w7jf.mjs";
4
+ import { n as parseBody, t as isParseError } from "../../../../../parse-DzSrk1t8.mjs";
5
+ import { h as reorderWidgetsBody } from "../../../../../redirects-6Zg2SoYo.mjs";
6
+ import "../../../../../byline-fields-B0NO1yUB.mjs";
7
+ import "../../../../../status-2gZklYuj.mjs";
7
8
  import "../../../../../api/schemas/index.mjs";
8
- import { n as requirePerm } from "../../../../../authorize-DsMSVSaY.mjs";
9
+ import { n as requirePerm } from "../../../../../authorize-D5gfBVU5.mjs";
9
10
 
10
11
  //#region src/astro/routes/api/widget-areas/[name]/reorder.ts
11
12
  const prerender = false;
@@ -1 +1 @@
1
- {"version":3,"file":"reorder.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/widget-areas/[name]/reorder.ts"],"sourcesContent":["/**\n * Reorder widgets endpoint\n *\n * POST /_emdash/api/widget-areas/:name/reorder\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { reorderWidgetsBody } 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 db = emdash.db;\n\tconst { name } = params;\n\n\tconst denied = requirePerm(user, \"widgets:manage\");\n\tif (denied) return denied;\n\n\tif (!name) {\n\t\treturn apiError(\"VALIDATION_ERROR\", \"name is required\", 400);\n\t}\n\n\ttry {\n\t\t// Get the area\n\t\tconst area = await db\n\t\t\t.selectFrom(\"_emdash_widget_areas\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"name\", \"=\", name)\n\t\t\t.executeTakeFirst();\n\n\t\tif (!area) {\n\t\t\treturn apiError(\"NOT_FOUND\", `Widget area \"${name}\" not found`, 404);\n\t\t}\n\n\t\tconst body = await parseBody(request, reorderWidgetsBody);\n\t\tif (isParseError(body)) return body;\n\n\t\t// Verify all widget IDs belong to this area\n\t\tconst existingWidgets = await db\n\t\t\t.selectFrom(\"_emdash_widgets\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"area_id\", \"=\", area.id)\n\t\t\t.execute();\n\n\t\tconst existingIds = new Set(existingWidgets.map((w) => w.id));\n\t\tfor (const id of body.widgetIds) {\n\t\t\tif (!existingIds.has(id)) {\n\t\t\t\treturn apiError(\"VALIDATION_ERROR\", `Widget \"${id}\" not found in area \"${name}\"`, 400);\n\t\t\t}\n\t\t}\n\n\t\t// Update sort_order for each widget\n\t\tawait Promise.all(\n\t\t\tbody.widgetIds.map((id, index) =>\n\t\t\t\tdb.updateTable(\"_emdash_widgets\").set({ sort_order: index }).where(\"id\", \"=\", id).execute(),\n\t\t\t),\n\t\t);\n\n\t\treturn apiSuccess({ success: true });\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to reorder widgets\", \"WIDGET_REORDER_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;AAaA,MAAa,YAAY;AAEzB,MAAa,OAAiB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACpE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,KAAK,OAAO;CAClB,MAAM,EAAE,SAAS;CAEjB,MAAM,SAAS,YAAY,MAAM,iBAAiB;AAClD,KAAI,OAAQ,QAAO;AAEnB,KAAI,CAAC,KACJ,QAAO,SAAS,oBAAoB,oBAAoB,IAAI;AAG7D,KAAI;EAEH,MAAM,OAAO,MAAM,GACjB,WAAW,uBAAuB,CAClC,OAAO,KAAK,CACZ,MAAM,QAAQ,KAAK,KAAK,CACxB,kBAAkB;AAEpB,MAAI,CAAC,KACJ,QAAO,SAAS,aAAa,gBAAgB,KAAK,cAAc,IAAI;EAGrE,MAAM,OAAO,MAAM,UAAU,SAAS,mBAAmB;AACzD,MAAI,aAAa,KAAK,CAAE,QAAO;EAG/B,MAAM,kBAAkB,MAAM,GAC5B,WAAW,kBAAkB,CAC7B,OAAO,KAAK,CACZ,MAAM,WAAW,KAAK,KAAK,GAAG,CAC9B,SAAS;EAEX,MAAM,cAAc,IAAI,IAAI,gBAAgB,KAAK,MAAM,EAAE,GAAG,CAAC;AAC7D,OAAK,MAAM,MAAM,KAAK,UACrB,KAAI,CAAC,YAAY,IAAI,GAAG,CACvB,QAAO,SAAS,oBAAoB,WAAW,GAAG,uBAAuB,KAAK,IAAI,IAAI;AAKxF,QAAM,QAAQ,IACb,KAAK,UAAU,KAAK,IAAI,UACvB,GAAG,YAAY,kBAAkB,CAAC,IAAI,EAAE,YAAY,OAAO,CAAC,CAAC,MAAM,MAAM,KAAK,GAAG,CAAC,SAAS,CAC3F,CACD;AAED,SAAO,WAAW,EAAE,SAAS,MAAM,CAAC;UAC5B,OAAO;AACf,SAAO,YAAY,OAAO,6BAA6B,uBAAuB"}
1
+ {"version":3,"file":"reorder.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/widget-areas/[name]/reorder.ts"],"sourcesContent":["/**\n * Reorder widgets endpoint\n *\n * POST /_emdash/api/widget-areas/:name/reorder\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { reorderWidgetsBody } 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 db = emdash.db;\n\tconst { name } = params;\n\n\tconst denied = requirePerm(user, \"widgets:manage\");\n\tif (denied) return denied;\n\n\tif (!name) {\n\t\treturn apiError(\"VALIDATION_ERROR\", \"name is required\", 400);\n\t}\n\n\ttry {\n\t\t// Get the area\n\t\tconst area = await db\n\t\t\t.selectFrom(\"_emdash_widget_areas\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"name\", \"=\", name)\n\t\t\t.executeTakeFirst();\n\n\t\tif (!area) {\n\t\t\treturn apiError(\"NOT_FOUND\", `Widget area \"${name}\" not found`, 404);\n\t\t}\n\n\t\tconst body = await parseBody(request, reorderWidgetsBody);\n\t\tif (isParseError(body)) return body;\n\n\t\t// Verify all widget IDs belong to this area\n\t\tconst existingWidgets = await db\n\t\t\t.selectFrom(\"_emdash_widgets\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"area_id\", \"=\", area.id)\n\t\t\t.execute();\n\n\t\tconst existingIds = new Set(existingWidgets.map((w) => w.id));\n\t\tfor (const id of body.widgetIds) {\n\t\t\tif (!existingIds.has(id)) {\n\t\t\t\treturn apiError(\"VALIDATION_ERROR\", `Widget \"${id}\" not found in area \"${name}\"`, 400);\n\t\t\t}\n\t\t}\n\n\t\t// Update sort_order for each widget\n\t\tawait Promise.all(\n\t\t\tbody.widgetIds.map((id, index) =>\n\t\t\t\tdb.updateTable(\"_emdash_widgets\").set({ sort_order: index }).where(\"id\", \"=\", id).execute(),\n\t\t\t),\n\t\t);\n\n\t\treturn apiSuccess({ success: true });\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to reorder widgets\", \"WIDGET_REORDER_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;AAaA,MAAa,YAAY;AAEzB,MAAa,OAAiB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACpE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,KAAK,OAAO;CAClB,MAAM,EAAE,SAAS;CAEjB,MAAM,SAAS,YAAY,MAAM,iBAAiB;AAClD,KAAI,OAAQ,QAAO;AAEnB,KAAI,CAAC,KACJ,QAAO,SAAS,oBAAoB,oBAAoB,IAAI;AAG7D,KAAI;EAEH,MAAM,OAAO,MAAM,GACjB,WAAW,uBAAuB,CAClC,OAAO,KAAK,CACZ,MAAM,QAAQ,KAAK,KAAK,CACxB,kBAAkB;AAEpB,MAAI,CAAC,KACJ,QAAO,SAAS,aAAa,gBAAgB,KAAK,cAAc,IAAI;EAGrE,MAAM,OAAO,MAAM,UAAU,SAAS,mBAAmB;AACzD,MAAI,aAAa,KAAK,CAAE,QAAO;EAG/B,MAAM,kBAAkB,MAAM,GAC5B,WAAW,kBAAkB,CAC7B,OAAO,KAAK,CACZ,MAAM,WAAW,KAAK,KAAK,GAAG,CAC9B,SAAS;EAEX,MAAM,cAAc,IAAI,IAAI,gBAAgB,KAAK,MAAM,EAAE,GAAG,CAAC;AAC7D,OAAK,MAAM,MAAM,KAAK,UACrB,KAAI,CAAC,YAAY,IAAI,GAAG,CACvB,QAAO,SAAS,oBAAoB,WAAW,GAAG,uBAAuB,KAAK,IAAI,IAAI;AAKxF,QAAM,QAAQ,IACb,KAAK,UAAU,KAAK,IAAI,UACvB,GAAG,YAAY,kBAAkB,CAAC,IAAI,EAAE,YAAY,OAAO,CAAC,CAAC,MAAM,MAAM,KAAK,GAAG,CAAC,SAAS,CAC3F,CACD;AAED,SAAO,WAAW,EAAE,SAAS,MAAM,CAAC;UAC5B,OAAO;AACf,SAAO,YAAY,OAAO,6BAA6B,uBAAuB"}
@@ -1,15 +1,16 @@
1
1
  import "../../../../../../dialect-helpers-DRI5pyY3.mjs";
2
2
  import "../../../../../../base64-CqR-7kqF.mjs";
3
3
  import "../../../../../../types-BXSUSAjt.mjs";
4
- import "../../../../../../request-cache-D32LpnmI.mjs";
5
- import "../../../../../../loader-ZN1ll-d-.mjs";
6
- import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../../error-RwM4dD35.mjs";
7
- import { n as parseBody, t as isParseError } from "../../../../../../parse-CrGndy1A.mjs";
8
- import { g as updateWidgetBody } from "../../../../../../redirects-CCbCqCCd.mjs";
9
- import "../../../../../../byline-fields-8TMtkBnH.mjs";
4
+ import "../../../../../../request-cache-UwmBAiUK.mjs";
5
+ import "../../../../../../loader-BqWjcH3h.mjs";
6
+ import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../../error-CNn_w7jf.mjs";
7
+ import { n as parseBody, t as isParseError } from "../../../../../../parse-DzSrk1t8.mjs";
8
+ import { g as updateWidgetBody } from "../../../../../../redirects-6Zg2SoYo.mjs";
9
+ import "../../../../../../byline-fields-B0NO1yUB.mjs";
10
+ import "../../../../../../status-2gZklYuj.mjs";
10
11
  import "../../../../../../api/schemas/index.mjs";
11
- import { i as rowToWidget } from "../../../../../../widgets-DZfmAbE4.mjs";
12
- import { n as requirePerm } from "../../../../../../authorize-DsMSVSaY.mjs";
12
+ import { i as rowToWidget } from "../../../../../../widgets-Ci6hLwfO.mjs";
13
+ import { n as requirePerm } from "../../../../../../authorize-D5gfBVU5.mjs";
13
14
 
14
15
  //#region src/astro/routes/api/widget-areas/[name]/widgets/[id].ts
15
16
  const prerender = false;
@@ -1 +1 @@
1
- {"version":3,"file":"_id_.mjs","names":[],"sources":["../../../../../../../src/astro/routes/api/widget-areas/[name]/widgets/[id].ts"],"sourcesContent":["/**\n * Single widget endpoints\n *\n * PUT /_emdash/api/widget-areas/:name/widgets/:id - Update widget\n * DELETE /_emdash/api/widget-areas/:name/widgets/:id - Delete widget\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { updateWidgetBody } from \"#api/schemas.js\";\nimport { rowToWidget } from \"#widgets/index.js\";\nimport type { WidgetRow } from \"#widgets/types.js\";\n\nexport const prerender = false;\n\nexport const PUT: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst db = emdash.db;\n\tconst { name, id } = params;\n\n\tconst denied = requirePerm(user, \"widgets:manage\");\n\tif (denied) return denied;\n\n\tif (!name || !id) {\n\t\treturn apiError(\"VALIDATION_ERROR\", \"name and id are required\", 400);\n\t}\n\n\ttry {\n\t\t// Get the area\n\t\tconst area = await db\n\t\t\t.selectFrom(\"_emdash_widget_areas\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"name\", \"=\", name)\n\t\t\t.executeTakeFirst();\n\n\t\tif (!area) {\n\t\t\treturn apiError(\"NOT_FOUND\", `Widget area \"${name}\" not found`, 404);\n\t\t}\n\n\t\t// Check widget exists and belongs to this area\n\t\tconst existingWidget = await db\n\t\t\t.selectFrom(\"_emdash_widgets\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"id\", \"=\", id)\n\t\t\t.where(\"area_id\", \"=\", area.id)\n\t\t\t.executeTakeFirst();\n\n\t\tif (!existingWidget) {\n\t\t\treturn apiError(\"NOT_FOUND\", `Widget \"${id}\" not found in area \"${name}\"`, 404);\n\t\t}\n\n\t\tconst body = await parseBody(request, updateWidgetBody);\n\t\tif (isParseError(body)) return body;\n\n\t\t// Build update object (only update provided fields)\n\t\tconst updates: Record<string, unknown> = {};\n\t\tif (body.title !== undefined) updates.title = body.title || null;\n\t\tif (body.type !== undefined) updates.type = body.type;\n\t\tif (body.content !== undefined)\n\t\t\tupdates.content = body.content ? JSON.stringify(body.content) : null;\n\t\tif (body.menuName !== undefined) updates.menu_name = body.menuName || null;\n\t\tif (body.componentId !== undefined) updates.component_id = body.componentId || null;\n\t\tif (body.componentProps !== undefined)\n\t\t\tupdates.component_props = body.componentProps ? JSON.stringify(body.componentProps) : null;\n\n\t\tif (Object.keys(updates).length === 0) {\n\t\t\treturn apiError(\"VALIDATION_ERROR\", \"No fields to update\", 400);\n\t\t}\n\n\t\tawait db.updateTable(\"_emdash_widgets\").set(updates).where(\"id\", \"=\", id).execute();\n\n\t\tconst widget = await db\n\t\t\t.selectFrom(\"_emdash_widgets\")\n\t\t\t.selectAll()\n\t\t\t.$castTo<WidgetRow>()\n\t\t\t.where(\"id\", \"=\", id)\n\t\t\t.executeTakeFirstOrThrow();\n\n\t\treturn apiSuccess(rowToWidget(widget));\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to update widget\", \"WIDGET_UPDATE_ERROR\");\n\t}\n};\n\nexport const DELETE: APIRoute = async ({ params, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst db = emdash.db;\n\tconst { name, id } = params;\n\n\tconst denied = requirePerm(user, \"widgets:manage\");\n\tif (denied) return denied;\n\n\tif (!name || !id) {\n\t\treturn apiError(\"VALIDATION_ERROR\", \"name and id are required\", 400);\n\t}\n\n\ttry {\n\t\t// Get the area\n\t\tconst area = await db\n\t\t\t.selectFrom(\"_emdash_widget_areas\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"name\", \"=\", name)\n\t\t\t.executeTakeFirst();\n\n\t\tif (!area) {\n\t\t\treturn apiError(\"NOT_FOUND\", `Widget area \"${name}\" not found`, 404);\n\t\t}\n\n\t\t// Check widget exists and belongs to this area\n\t\tconst existingWidget = await db\n\t\t\t.selectFrom(\"_emdash_widgets\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"id\", \"=\", id)\n\t\t\t.where(\"area_id\", \"=\", area.id)\n\t\t\t.executeTakeFirst();\n\n\t\tif (!existingWidget) {\n\t\t\treturn apiError(\"NOT_FOUND\", `Widget \"${id}\" not found in area \"${name}\"`, 404);\n\t\t}\n\n\t\tawait db.deleteFrom(\"_emdash_widgets\").where(\"id\", \"=\", id).execute();\n\n\t\treturn apiSuccess({ deleted: true });\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to delete widget\", \"WIDGET_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,KAAK,OAAO;CAClB,MAAM,EAAE,MAAM,OAAO;CAErB,MAAM,SAAS,YAAY,MAAM,iBAAiB;AAClD,KAAI,OAAQ,QAAO;AAEnB,KAAI,CAAC,QAAQ,CAAC,GACb,QAAO,SAAS,oBAAoB,4BAA4B,IAAI;AAGrE,KAAI;EAEH,MAAM,OAAO,MAAM,GACjB,WAAW,uBAAuB,CAClC,OAAO,KAAK,CACZ,MAAM,QAAQ,KAAK,KAAK,CACxB,kBAAkB;AAEpB,MAAI,CAAC,KACJ,QAAO,SAAS,aAAa,gBAAgB,KAAK,cAAc,IAAI;AAWrE,MAAI,CAPmB,MAAM,GAC3B,WAAW,kBAAkB,CAC7B,OAAO,KAAK,CACZ,MAAM,MAAM,KAAK,GAAG,CACpB,MAAM,WAAW,KAAK,KAAK,GAAG,CAC9B,kBAAkB,CAGnB,QAAO,SAAS,aAAa,WAAW,GAAG,uBAAuB,KAAK,IAAI,IAAI;EAGhF,MAAM,OAAO,MAAM,UAAU,SAAS,iBAAiB;AACvD,MAAI,aAAa,KAAK,CAAE,QAAO;EAG/B,MAAM,UAAmC,EAAE;AAC3C,MAAI,KAAK,UAAU,OAAW,SAAQ,QAAQ,KAAK,SAAS;AAC5D,MAAI,KAAK,SAAS,OAAW,SAAQ,OAAO,KAAK;AACjD,MAAI,KAAK,YAAY,OACpB,SAAQ,UAAU,KAAK,UAAU,KAAK,UAAU,KAAK,QAAQ,GAAG;AACjE,MAAI,KAAK,aAAa,OAAW,SAAQ,YAAY,KAAK,YAAY;AACtE,MAAI,KAAK,gBAAgB,OAAW,SAAQ,eAAe,KAAK,eAAe;AAC/E,MAAI,KAAK,mBAAmB,OAC3B,SAAQ,kBAAkB,KAAK,iBAAiB,KAAK,UAAU,KAAK,eAAe,GAAG;AAEvF,MAAI,OAAO,KAAK,QAAQ,CAAC,WAAW,EACnC,QAAO,SAAS,oBAAoB,uBAAuB,IAAI;AAGhE,QAAM,GAAG,YAAY,kBAAkB,CAAC,IAAI,QAAQ,CAAC,MAAM,MAAM,KAAK,GAAG,CAAC,SAAS;AASnF,SAAO,WAAW,YAPH,MAAM,GACnB,WAAW,kBAAkB,CAC7B,WAAW,CACX,SAAoB,CACpB,MAAM,MAAM,KAAK,GAAG,CACpB,yBAAyB,CAEU,CAAC;UAC9B,OAAO;AACf,SAAO,YAAY,OAAO,2BAA2B,sBAAsB;;;AAI7E,MAAa,SAAmB,OAAO,EAAE,QAAQ,aAAa;CAC7D,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,KAAK,OAAO;CAClB,MAAM,EAAE,MAAM,OAAO;CAErB,MAAM,SAAS,YAAY,MAAM,iBAAiB;AAClD,KAAI,OAAQ,QAAO;AAEnB,KAAI,CAAC,QAAQ,CAAC,GACb,QAAO,SAAS,oBAAoB,4BAA4B,IAAI;AAGrE,KAAI;EAEH,MAAM,OAAO,MAAM,GACjB,WAAW,uBAAuB,CAClC,OAAO,KAAK,CACZ,MAAM,QAAQ,KAAK,KAAK,CACxB,kBAAkB;AAEpB,MAAI,CAAC,KACJ,QAAO,SAAS,aAAa,gBAAgB,KAAK,cAAc,IAAI;AAWrE,MAAI,CAPmB,MAAM,GAC3B,WAAW,kBAAkB,CAC7B,OAAO,KAAK,CACZ,MAAM,MAAM,KAAK,GAAG,CACpB,MAAM,WAAW,KAAK,KAAK,GAAG,CAC9B,kBAAkB,CAGnB,QAAO,SAAS,aAAa,WAAW,GAAG,uBAAuB,KAAK,IAAI,IAAI;AAGhF,QAAM,GAAG,WAAW,kBAAkB,CAAC,MAAM,MAAM,KAAK,GAAG,CAAC,SAAS;AAErE,SAAO,WAAW,EAAE,SAAS,MAAM,CAAC;UAC5B,OAAO;AACf,SAAO,YAAY,OAAO,2BAA2B,sBAAsB"}
1
+ {"version":3,"file":"_id_.mjs","names":[],"sources":["../../../../../../../src/astro/routes/api/widget-areas/[name]/widgets/[id].ts"],"sourcesContent":["/**\n * Single widget endpoints\n *\n * PUT /_emdash/api/widget-areas/:name/widgets/:id - Update widget\n * DELETE /_emdash/api/widget-areas/:name/widgets/:id - Delete widget\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { updateWidgetBody } from \"#api/schemas.js\";\nimport { rowToWidget } from \"#widgets/index.js\";\nimport type { WidgetRow } from \"#widgets/types.js\";\n\nexport const prerender = false;\n\nexport const PUT: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst db = emdash.db;\n\tconst { name, id } = params;\n\n\tconst denied = requirePerm(user, \"widgets:manage\");\n\tif (denied) return denied;\n\n\tif (!name || !id) {\n\t\treturn apiError(\"VALIDATION_ERROR\", \"name and id are required\", 400);\n\t}\n\n\ttry {\n\t\t// Get the area\n\t\tconst area = await db\n\t\t\t.selectFrom(\"_emdash_widget_areas\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"name\", \"=\", name)\n\t\t\t.executeTakeFirst();\n\n\t\tif (!area) {\n\t\t\treturn apiError(\"NOT_FOUND\", `Widget area \"${name}\" not found`, 404);\n\t\t}\n\n\t\t// Check widget exists and belongs to this area\n\t\tconst existingWidget = await db\n\t\t\t.selectFrom(\"_emdash_widgets\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"id\", \"=\", id)\n\t\t\t.where(\"area_id\", \"=\", area.id)\n\t\t\t.executeTakeFirst();\n\n\t\tif (!existingWidget) {\n\t\t\treturn apiError(\"NOT_FOUND\", `Widget \"${id}\" not found in area \"${name}\"`, 404);\n\t\t}\n\n\t\tconst body = await parseBody(request, updateWidgetBody);\n\t\tif (isParseError(body)) return body;\n\n\t\t// Build update object (only update provided fields)\n\t\tconst updates: Record<string, unknown> = {};\n\t\tif (body.title !== undefined) updates.title = body.title || null;\n\t\tif (body.type !== undefined) updates.type = body.type;\n\t\tif (body.content !== undefined)\n\t\t\tupdates.content = body.content ? JSON.stringify(body.content) : null;\n\t\tif (body.menuName !== undefined) updates.menu_name = body.menuName || null;\n\t\tif (body.componentId !== undefined) updates.component_id = body.componentId || null;\n\t\tif (body.componentProps !== undefined)\n\t\t\tupdates.component_props = body.componentProps ? JSON.stringify(body.componentProps) : null;\n\n\t\tif (Object.keys(updates).length === 0) {\n\t\t\treturn apiError(\"VALIDATION_ERROR\", \"No fields to update\", 400);\n\t\t}\n\n\t\tawait db.updateTable(\"_emdash_widgets\").set(updates).where(\"id\", \"=\", id).execute();\n\n\t\tconst widget = await db\n\t\t\t.selectFrom(\"_emdash_widgets\")\n\t\t\t.selectAll()\n\t\t\t.$castTo<WidgetRow>()\n\t\t\t.where(\"id\", \"=\", id)\n\t\t\t.executeTakeFirstOrThrow();\n\n\t\treturn apiSuccess(rowToWidget(widget));\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to update widget\", \"WIDGET_UPDATE_ERROR\");\n\t}\n};\n\nexport const DELETE: APIRoute = async ({ params, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst db = emdash.db;\n\tconst { name, id } = params;\n\n\tconst denied = requirePerm(user, \"widgets:manage\");\n\tif (denied) return denied;\n\n\tif (!name || !id) {\n\t\treturn apiError(\"VALIDATION_ERROR\", \"name and id are required\", 400);\n\t}\n\n\ttry {\n\t\t// Get the area\n\t\tconst area = await db\n\t\t\t.selectFrom(\"_emdash_widget_areas\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"name\", \"=\", name)\n\t\t\t.executeTakeFirst();\n\n\t\tif (!area) {\n\t\t\treturn apiError(\"NOT_FOUND\", `Widget area \"${name}\" not found`, 404);\n\t\t}\n\n\t\t// Check widget exists and belongs to this area\n\t\tconst existingWidget = await db\n\t\t\t.selectFrom(\"_emdash_widgets\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"id\", \"=\", id)\n\t\t\t.where(\"area_id\", \"=\", area.id)\n\t\t\t.executeTakeFirst();\n\n\t\tif (!existingWidget) {\n\t\t\treturn apiError(\"NOT_FOUND\", `Widget \"${id}\" not found in area \"${name}\"`, 404);\n\t\t}\n\n\t\tawait db.deleteFrom(\"_emdash_widgets\").where(\"id\", \"=\", id).execute();\n\n\t\treturn apiSuccess({ deleted: true });\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to delete widget\", \"WIDGET_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,KAAK,OAAO;CAClB,MAAM,EAAE,MAAM,OAAO;CAErB,MAAM,SAAS,YAAY,MAAM,iBAAiB;AAClD,KAAI,OAAQ,QAAO;AAEnB,KAAI,CAAC,QAAQ,CAAC,GACb,QAAO,SAAS,oBAAoB,4BAA4B,IAAI;AAGrE,KAAI;EAEH,MAAM,OAAO,MAAM,GACjB,WAAW,uBAAuB,CAClC,OAAO,KAAK,CACZ,MAAM,QAAQ,KAAK,KAAK,CACxB,kBAAkB;AAEpB,MAAI,CAAC,KACJ,QAAO,SAAS,aAAa,gBAAgB,KAAK,cAAc,IAAI;AAWrE,MAAI,CAPmB,MAAM,GAC3B,WAAW,kBAAkB,CAC7B,OAAO,KAAK,CACZ,MAAM,MAAM,KAAK,GAAG,CACpB,MAAM,WAAW,KAAK,KAAK,GAAG,CAC9B,kBAAkB,CAGnB,QAAO,SAAS,aAAa,WAAW,GAAG,uBAAuB,KAAK,IAAI,IAAI;EAGhF,MAAM,OAAO,MAAM,UAAU,SAAS,iBAAiB;AACvD,MAAI,aAAa,KAAK,CAAE,QAAO;EAG/B,MAAM,UAAmC,EAAE;AAC3C,MAAI,KAAK,UAAU,OAAW,SAAQ,QAAQ,KAAK,SAAS;AAC5D,MAAI,KAAK,SAAS,OAAW,SAAQ,OAAO,KAAK;AACjD,MAAI,KAAK,YAAY,OACpB,SAAQ,UAAU,KAAK,UAAU,KAAK,UAAU,KAAK,QAAQ,GAAG;AACjE,MAAI,KAAK,aAAa,OAAW,SAAQ,YAAY,KAAK,YAAY;AACtE,MAAI,KAAK,gBAAgB,OAAW,SAAQ,eAAe,KAAK,eAAe;AAC/E,MAAI,KAAK,mBAAmB,OAC3B,SAAQ,kBAAkB,KAAK,iBAAiB,KAAK,UAAU,KAAK,eAAe,GAAG;AAEvF,MAAI,OAAO,KAAK,QAAQ,CAAC,WAAW,EACnC,QAAO,SAAS,oBAAoB,uBAAuB,IAAI;AAGhE,QAAM,GAAG,YAAY,kBAAkB,CAAC,IAAI,QAAQ,CAAC,MAAM,MAAM,KAAK,GAAG,CAAC,SAAS;AASnF,SAAO,WAAW,YAPH,MAAM,GACnB,WAAW,kBAAkB,CAC7B,WAAW,CACX,SAAoB,CACpB,MAAM,MAAM,KAAK,GAAG,CACpB,yBAAyB,CAEU,CAAC;UAC9B,OAAO;AACf,SAAO,YAAY,OAAO,2BAA2B,sBAAsB;;;AAI7E,MAAa,SAAmB,OAAO,EAAE,QAAQ,aAAa;CAC7D,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,KAAK,OAAO;CAClB,MAAM,EAAE,MAAM,OAAO;CAErB,MAAM,SAAS,YAAY,MAAM,iBAAiB;AAClD,KAAI,OAAQ,QAAO;AAEnB,KAAI,CAAC,QAAQ,CAAC,GACb,QAAO,SAAS,oBAAoB,4BAA4B,IAAI;AAGrE,KAAI;EAEH,MAAM,OAAO,MAAM,GACjB,WAAW,uBAAuB,CAClC,OAAO,KAAK,CACZ,MAAM,QAAQ,KAAK,KAAK,CACxB,kBAAkB;AAEpB,MAAI,CAAC,KACJ,QAAO,SAAS,aAAa,gBAAgB,KAAK,cAAc,IAAI;AAWrE,MAAI,CAPmB,MAAM,GAC3B,WAAW,kBAAkB,CAC7B,OAAO,KAAK,CACZ,MAAM,MAAM,KAAK,GAAG,CACpB,MAAM,WAAW,KAAK,KAAK,GAAG,CAC9B,kBAAkB,CAGnB,QAAO,SAAS,aAAa,WAAW,GAAG,uBAAuB,KAAK,IAAI,IAAI;AAGhF,QAAM,GAAG,WAAW,kBAAkB,CAAC,MAAM,MAAM,KAAK,GAAG,CAAC,SAAS;AAErE,SAAO,WAAW,EAAE,SAAS,MAAM,CAAC;UAC5B,OAAO;AACf,SAAO,YAAY,OAAO,2BAA2B,sBAAsB"}
@@ -1,15 +1,16 @@
1
1
  import "../../../../../dialect-helpers-DRI5pyY3.mjs";
2
2
  import "../../../../../base64-CqR-7kqF.mjs";
3
3
  import "../../../../../types-BXSUSAjt.mjs";
4
- import "../../../../../request-cache-D32LpnmI.mjs";
5
- import "../../../../../loader-ZN1ll-d-.mjs";
6
- import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../error-RwM4dD35.mjs";
7
- import { n as parseBody, t as isParseError } from "../../../../../parse-CrGndy1A.mjs";
8
- import { m as createWidgetBody } from "../../../../../redirects-CCbCqCCd.mjs";
9
- import "../../../../../byline-fields-8TMtkBnH.mjs";
4
+ import "../../../../../request-cache-UwmBAiUK.mjs";
5
+ import "../../../../../loader-BqWjcH3h.mjs";
6
+ import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../error-CNn_w7jf.mjs";
7
+ import { n as parseBody, t as isParseError } from "../../../../../parse-DzSrk1t8.mjs";
8
+ import { m as createWidgetBody } from "../../../../../redirects-6Zg2SoYo.mjs";
9
+ import "../../../../../byline-fields-B0NO1yUB.mjs";
10
+ import "../../../../../status-2gZklYuj.mjs";
10
11
  import "../../../../../api/schemas/index.mjs";
11
- import { i as rowToWidget } from "../../../../../widgets-DZfmAbE4.mjs";
12
- import { n as requirePerm } from "../../../../../authorize-DsMSVSaY.mjs";
12
+ import { i as rowToWidget } from "../../../../../widgets-Ci6hLwfO.mjs";
13
+ import { n as requirePerm } from "../../../../../authorize-D5gfBVU5.mjs";
13
14
  import { ulid } from "ulidx";
14
15
 
15
16
  //#region src/astro/routes/api/widget-areas/[name]/widgets.ts
@@ -1 +1 @@
1
- {"version":3,"file":"widgets.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/widget-areas/[name]/widgets.ts"],"sourcesContent":["/**\n * Widgets CRUD endpoints\n *\n * POST /_emdash/api/widget-areas/:name/widgets - Add widget\n */\n\nimport type { APIRoute } from \"astro\";\nimport { ulid } from \"ulidx\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { createWidgetBody } from \"#api/schemas.js\";\nimport { rowToWidget } from \"#widgets/index.js\";\nimport type { WidgetRow } from \"#widgets/types.js\";\n\nexport const prerender = false;\n\nexport const POST: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst db = emdash.db;\n\tconst { name } = params;\n\n\tconst denied = requirePerm(user, \"widgets:manage\");\n\tif (denied) return denied;\n\n\tif (!name) {\n\t\treturn apiError(\"VALIDATION_ERROR\", \"name is required\", 400);\n\t}\n\n\ttry {\n\t\t// Get the area\n\t\tconst area = await db\n\t\t\t.selectFrom(\"_emdash_widget_areas\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"name\", \"=\", name)\n\t\t\t.executeTakeFirst();\n\n\t\tif (!area) {\n\t\t\treturn apiError(\"NOT_FOUND\", `Widget area \"${name}\" not found`, 404);\n\t\t}\n\n\t\tconst body = await parseBody(request, createWidgetBody);\n\t\tif (isParseError(body)) return body;\n\n\t\t// Get max sort_order\n\t\tconst maxOrder = await db\n\t\t\t.selectFrom(\"_emdash_widgets\")\n\t\t\t.select(({ fn }) => fn.max(\"sort_order\").as(\"maxOrder\"))\n\t\t\t.where(\"area_id\", \"=\", area.id)\n\t\t\t.executeTakeFirst();\n\n\t\tconst sortOrder = (maxOrder?.maxOrder ?? -1) + 1;\n\n\t\t// Prepare values\n\t\tconst id = ulid();\n\t\tawait db\n\t\t\t.insertInto(\"_emdash_widgets\")\n\t\t\t.values({\n\t\t\t\tid,\n\t\t\t\tarea_id: area.id,\n\t\t\t\tsort_order: sortOrder,\n\t\t\t\ttype: body.type,\n\t\t\t\ttitle: body.title ?? null,\n\t\t\t\tcontent: body.content ? JSON.stringify(body.content) : null,\n\t\t\t\tmenu_name: body.menuName ?? null,\n\t\t\t\tcomponent_id: body.componentId ?? null,\n\t\t\t\tcomponent_props: body.componentProps ? JSON.stringify(body.componentProps) : null,\n\t\t\t})\n\t\t\t.execute();\n\n\t\tconst widget = await db\n\t\t\t.selectFrom(\"_emdash_widgets\")\n\t\t\t.selectAll()\n\t\t\t.$castTo<WidgetRow>()\n\t\t\t.where(\"id\", \"=\", id)\n\t\t\t.executeTakeFirstOrThrow();\n\n\t\treturn apiSuccess(rowToWidget(widget), 201);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to create widget\", \"WIDGET_CREATE_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,MAAa,YAAY;AAEzB,MAAa,OAAiB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACpE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,KAAK,OAAO;CAClB,MAAM,EAAE,SAAS;CAEjB,MAAM,SAAS,YAAY,MAAM,iBAAiB;AAClD,KAAI,OAAQ,QAAO;AAEnB,KAAI,CAAC,KACJ,QAAO,SAAS,oBAAoB,oBAAoB,IAAI;AAG7D,KAAI;EAEH,MAAM,OAAO,MAAM,GACjB,WAAW,uBAAuB,CAClC,OAAO,KAAK,CACZ,MAAM,QAAQ,KAAK,KAAK,CACxB,kBAAkB;AAEpB,MAAI,CAAC,KACJ,QAAO,SAAS,aAAa,gBAAgB,KAAK,cAAc,IAAI;EAGrE,MAAM,OAAO,MAAM,UAAU,SAAS,iBAAiB;AACvD,MAAI,aAAa,KAAK,CAAE,QAAO;EAS/B,MAAM,cANW,MAAM,GACrB,WAAW,kBAAkB,CAC7B,QAAQ,EAAE,SAAS,GAAG,IAAI,aAAa,CAAC,GAAG,WAAW,CAAC,CACvD,MAAM,WAAW,KAAK,KAAK,GAAG,CAC9B,kBAAkB,GAES,YAAY,MAAM;EAG/C,MAAM,KAAK,MAAM;AACjB,QAAM,GACJ,WAAW,kBAAkB,CAC7B,OAAO;GACP;GACA,SAAS,KAAK;GACd,YAAY;GACZ,MAAM,KAAK;GACX,OAAO,KAAK,SAAS;GACrB,SAAS,KAAK,UAAU,KAAK,UAAU,KAAK,QAAQ,GAAG;GACvD,WAAW,KAAK,YAAY;GAC5B,cAAc,KAAK,eAAe;GAClC,iBAAiB,KAAK,iBAAiB,KAAK,UAAU,KAAK,eAAe,GAAG;GAC7E,CAAC,CACD,SAAS;AASX,SAAO,WAAW,YAPH,MAAM,GACnB,WAAW,kBAAkB,CAC7B,WAAW,CACX,SAAoB,CACpB,MAAM,MAAM,KAAK,GAAG,CACpB,yBAAyB,CAEU,EAAE,IAAI;UACnC,OAAO;AACf,SAAO,YAAY,OAAO,2BAA2B,sBAAsB"}
1
+ {"version":3,"file":"widgets.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/widget-areas/[name]/widgets.ts"],"sourcesContent":["/**\n * Widgets CRUD endpoints\n *\n * POST /_emdash/api/widget-areas/:name/widgets - Add widget\n */\n\nimport type { APIRoute } from \"astro\";\nimport { ulid } from \"ulidx\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { createWidgetBody } from \"#api/schemas.js\";\nimport { rowToWidget } from \"#widgets/index.js\";\nimport type { WidgetRow } from \"#widgets/types.js\";\n\nexport const prerender = false;\n\nexport const POST: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst db = emdash.db;\n\tconst { name } = params;\n\n\tconst denied = requirePerm(user, \"widgets:manage\");\n\tif (denied) return denied;\n\n\tif (!name) {\n\t\treturn apiError(\"VALIDATION_ERROR\", \"name is required\", 400);\n\t}\n\n\ttry {\n\t\t// Get the area\n\t\tconst area = await db\n\t\t\t.selectFrom(\"_emdash_widget_areas\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"name\", \"=\", name)\n\t\t\t.executeTakeFirst();\n\n\t\tif (!area) {\n\t\t\treturn apiError(\"NOT_FOUND\", `Widget area \"${name}\" not found`, 404);\n\t\t}\n\n\t\tconst body = await parseBody(request, createWidgetBody);\n\t\tif (isParseError(body)) return body;\n\n\t\t// Get max sort_order\n\t\tconst maxOrder = await db\n\t\t\t.selectFrom(\"_emdash_widgets\")\n\t\t\t.select(({ fn }) => fn.max(\"sort_order\").as(\"maxOrder\"))\n\t\t\t.where(\"area_id\", \"=\", area.id)\n\t\t\t.executeTakeFirst();\n\n\t\tconst sortOrder = (maxOrder?.maxOrder ?? -1) + 1;\n\n\t\t// Prepare values\n\t\tconst id = ulid();\n\t\tawait db\n\t\t\t.insertInto(\"_emdash_widgets\")\n\t\t\t.values({\n\t\t\t\tid,\n\t\t\t\tarea_id: area.id,\n\t\t\t\tsort_order: sortOrder,\n\t\t\t\ttype: body.type,\n\t\t\t\ttitle: body.title ?? null,\n\t\t\t\tcontent: body.content ? JSON.stringify(body.content) : null,\n\t\t\t\tmenu_name: body.menuName ?? null,\n\t\t\t\tcomponent_id: body.componentId ?? null,\n\t\t\t\tcomponent_props: body.componentProps ? JSON.stringify(body.componentProps) : null,\n\t\t\t})\n\t\t\t.execute();\n\n\t\tconst widget = await db\n\t\t\t.selectFrom(\"_emdash_widgets\")\n\t\t\t.selectAll()\n\t\t\t.$castTo<WidgetRow>()\n\t\t\t.where(\"id\", \"=\", id)\n\t\t\t.executeTakeFirstOrThrow();\n\n\t\treturn apiSuccess(rowToWidget(widget), 201);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to create widget\", \"WIDGET_CREATE_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAgBA,MAAa,YAAY;AAEzB,MAAa,OAAiB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACpE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,KAAK,OAAO;CAClB,MAAM,EAAE,SAAS;CAEjB,MAAM,SAAS,YAAY,MAAM,iBAAiB;AAClD,KAAI,OAAQ,QAAO;AAEnB,KAAI,CAAC,KACJ,QAAO,SAAS,oBAAoB,oBAAoB,IAAI;AAG7D,KAAI;EAEH,MAAM,OAAO,MAAM,GACjB,WAAW,uBAAuB,CAClC,OAAO,KAAK,CACZ,MAAM,QAAQ,KAAK,KAAK,CACxB,kBAAkB;AAEpB,MAAI,CAAC,KACJ,QAAO,SAAS,aAAa,gBAAgB,KAAK,cAAc,IAAI;EAGrE,MAAM,OAAO,MAAM,UAAU,SAAS,iBAAiB;AACvD,MAAI,aAAa,KAAK,CAAE,QAAO;EAS/B,MAAM,cANW,MAAM,GACrB,WAAW,kBAAkB,CAC7B,QAAQ,EAAE,SAAS,GAAG,IAAI,aAAa,CAAC,GAAG,WAAW,CAAC,CACvD,MAAM,WAAW,KAAK,KAAK,GAAG,CAC9B,kBAAkB,GAES,YAAY,MAAM;EAG/C,MAAM,KAAK,MAAM;AACjB,QAAM,GACJ,WAAW,kBAAkB,CAC7B,OAAO;GACP;GACA,SAAS,KAAK;GACd,YAAY;GACZ,MAAM,KAAK;GACX,OAAO,KAAK,SAAS;GACrB,SAAS,KAAK,UAAU,KAAK,UAAU,KAAK,QAAQ,GAAG;GACvD,WAAW,KAAK,YAAY;GAC5B,cAAc,KAAK,eAAe;GAClC,iBAAiB,KAAK,iBAAiB,KAAK,UAAU,KAAK,eAAe,GAAG;GAC7E,CAAC,CACD,SAAS;AASX,SAAO,WAAW,YAPH,MAAM,GACnB,WAAW,kBAAkB,CAC7B,WAAW,CACX,SAAoB,CACpB,MAAM,MAAM,KAAK,GAAG,CACpB,yBAAyB,CAEU,EAAE,IAAI;UACnC,OAAO;AACf,SAAO,YAAY,OAAO,2BAA2B,sBAAsB"}
@@ -1,11 +1,11 @@
1
1
  import "../../../../dialect-helpers-DRI5pyY3.mjs";
2
2
  import "../../../../base64-CqR-7kqF.mjs";
3
3
  import "../../../../types-BXSUSAjt.mjs";
4
- import "../../../../request-cache-D32LpnmI.mjs";
5
- import "../../../../loader-ZN1ll-d-.mjs";
6
- import { n as apiSuccess, r as handleError, t as apiError } from "../../../../error-RwM4dD35.mjs";
7
- import { i as rowToWidget } from "../../../../widgets-DZfmAbE4.mjs";
8
- import { n as requirePerm } from "../../../../authorize-DsMSVSaY.mjs";
4
+ import "../../../../request-cache-UwmBAiUK.mjs";
5
+ import "../../../../loader-BqWjcH3h.mjs";
6
+ import { n as apiSuccess, r as handleError, t as apiError } from "../../../../error-CNn_w7jf.mjs";
7
+ import { i as rowToWidget } from "../../../../widgets-Ci6hLwfO.mjs";
8
+ import { n as requirePerm } from "../../../../authorize-D5gfBVU5.mjs";
9
9
 
10
10
  //#region src/astro/routes/api/widget-areas/[name].ts
11
11
  const prerender = false;
@@ -1,15 +1,16 @@
1
1
  import "../../../../dialect-helpers-DRI5pyY3.mjs";
2
2
  import "../../../../base64-CqR-7kqF.mjs";
3
3
  import "../../../../types-BXSUSAjt.mjs";
4
- import "../../../../request-cache-D32LpnmI.mjs";
5
- import "../../../../loader-ZN1ll-d-.mjs";
6
- import { n as apiSuccess, r as handleError, t as apiError } from "../../../../error-RwM4dD35.mjs";
7
- import { n as parseBody, t as isParseError } from "../../../../parse-CrGndy1A.mjs";
8
- import { p as createWidgetAreaBody } from "../../../../redirects-CCbCqCCd.mjs";
9
- import "../../../../byline-fields-8TMtkBnH.mjs";
4
+ import "../../../../request-cache-UwmBAiUK.mjs";
5
+ import "../../../../loader-BqWjcH3h.mjs";
6
+ import { n as apiSuccess, r as handleError, t as apiError } from "../../../../error-CNn_w7jf.mjs";
7
+ import { n as parseBody, t as isParseError } from "../../../../parse-DzSrk1t8.mjs";
8
+ import { p as createWidgetAreaBody } from "../../../../redirects-6Zg2SoYo.mjs";
9
+ import "../../../../byline-fields-B0NO1yUB.mjs";
10
+ import "../../../../status-2gZklYuj.mjs";
10
11
  import "../../../../api/schemas/index.mjs";
11
- import { i as rowToWidget } from "../../../../widgets-DZfmAbE4.mjs";
12
- import { n as requirePerm } from "../../../../authorize-DsMSVSaY.mjs";
12
+ import { i as rowToWidget } from "../../../../widgets-Ci6hLwfO.mjs";
13
+ import { n as requirePerm } from "../../../../authorize-D5gfBVU5.mjs";
13
14
  import { ulid } from "ulidx";
14
15
 
15
16
  //#region src/astro/routes/api/widget-areas/index.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../../../src/astro/routes/api/widget-areas/index.ts"],"sourcesContent":["/**\n * Widget areas list and create endpoints\n *\n * GET /_emdash/api/widget-areas - List all widget areas\n * POST /_emdash/api/widget-areas - Create widget area\n */\n\nimport type { APIRoute } from \"astro\";\nimport { ulid } from \"ulidx\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { createWidgetAreaBody } from \"#api/schemas.js\";\nimport { rowToWidget } from \"#widgets/index.js\";\nimport type { WidgetRow } from \"#widgets/types.js\";\n\nexport const prerender = false;\n\nexport const GET: APIRoute = async ({ locals }) => {\n\tconst { emdash, user } = locals;\n\tconst db = emdash.db;\n\n\tconst denied = requirePerm(user, \"widgets:read\");\n\tif (denied) return denied;\n\n\ttry {\n\t\tconst areas = await db\n\t\t\t.selectFrom(\"_emdash_widget_areas\")\n\t\t\t.selectAll()\n\t\t\t.orderBy(\"name\", \"asc\")\n\t\t\t.execute();\n\n\t\t// Get widgets for each area (needed for drag-and-drop reordering in admin UI)\n\t\tconst areasWithWidgets = await Promise.all(\n\t\t\tareas.map(async (area) => {\n\t\t\t\tconst widgets = await db\n\t\t\t\t\t.selectFrom(\"_emdash_widgets\")\n\t\t\t\t\t.selectAll()\n\t\t\t\t\t.$castTo<WidgetRow>()\n\t\t\t\t\t.where(\"area_id\", \"=\", area.id)\n\t\t\t\t\t.orderBy(\"sort_order\", \"asc\")\n\t\t\t\t\t.execute();\n\n\t\t\t\treturn {\n\t\t\t\t\t...area,\n\t\t\t\t\twidgets: widgets.map((row) => rowToWidget(row)),\n\t\t\t\t\twidgetCount: widgets.length,\n\t\t\t\t};\n\t\t\t}),\n\t\t);\n\n\t\treturn apiSuccess({ items: areasWithWidgets });\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to fetch widget areas\", \"WIDGET_AREA_LIST_ERROR\");\n\t}\n};\n\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst db = emdash.db;\n\n\tconst denied = requirePerm(user, \"widgets:manage\");\n\tif (denied) return denied;\n\n\ttry {\n\t\tconst body = await parseBody(request, createWidgetAreaBody);\n\t\tif (isParseError(body)) return body;\n\n\t\t// Check if area name already exists\n\t\tconst existing = await db\n\t\t\t.selectFrom(\"_emdash_widget_areas\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"name\", \"=\", body.name)\n\t\t\t.executeTakeFirst();\n\n\t\tif (existing) {\n\t\t\treturn apiError(\"CONFLICT\", `Widget area with name \"${body.name}\" already exists`, 409);\n\t\t}\n\n\t\tconst id = ulid();\n\t\tawait db\n\t\t\t.insertInto(\"_emdash_widget_areas\")\n\t\t\t.values({\n\t\t\t\tid,\n\t\t\t\tname: body.name,\n\t\t\t\tlabel: body.label,\n\t\t\t\tdescription: body.description ?? null,\n\t\t\t})\n\t\t\t.execute();\n\n\t\tconst area = await db\n\t\t\t.selectFrom(\"_emdash_widget_areas\")\n\t\t\t.selectAll()\n\t\t\t.where(\"id\", \"=\", id)\n\t\t\t.executeTakeFirstOrThrow();\n\n\t\treturn apiSuccess(area, 201);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to create widget area\", \"WIDGET_AREA_CREATE_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;;AAiBA,MAAa,YAAY;AAEzB,MAAa,MAAgB,OAAO,EAAE,aAAa;CAClD,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,KAAK,OAAO;CAElB,MAAM,SAAS,YAAY,MAAM,eAAe;AAChD,KAAI,OAAQ,QAAO;AAEnB,KAAI;EACH,MAAM,QAAQ,MAAM,GAClB,WAAW,uBAAuB,CAClC,WAAW,CACX,QAAQ,QAAQ,MAAM,CACtB,SAAS;AAqBX,SAAO,WAAW,EAAE,OAlBK,MAAM,QAAQ,IACtC,MAAM,IAAI,OAAO,SAAS;GACzB,MAAM,UAAU,MAAM,GACpB,WAAW,kBAAkB,CAC7B,WAAW,CACX,SAAoB,CACpB,MAAM,WAAW,KAAK,KAAK,GAAG,CAC9B,QAAQ,cAAc,MAAM,CAC5B,SAAS;AAEX,UAAO;IACN,GAAG;IACH,SAAS,QAAQ,KAAK,QAAQ,YAAY,IAAI,CAAC;IAC/C,aAAa,QAAQ;IACrB;IACA,CACF,EAE4C,CAAC;UACtC,OAAO;AACf,SAAO,YAAY,OAAO,gCAAgC,yBAAyB;;;AAIrF,MAAa,OAAiB,OAAO,EAAE,SAAS,aAAa;CAC5D,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,KAAK,OAAO;CAElB,MAAM,SAAS,YAAY,MAAM,iBAAiB;AAClD,KAAI,OAAQ,QAAO;AAEnB,KAAI;EACH,MAAM,OAAO,MAAM,UAAU,SAAS,qBAAqB;AAC3D,MAAI,aAAa,KAAK,CAAE,QAAO;AAS/B,MANiB,MAAM,GACrB,WAAW,uBAAuB,CAClC,OAAO,KAAK,CACZ,MAAM,QAAQ,KAAK,KAAK,KAAK,CAC7B,kBAAkB,CAGnB,QAAO,SAAS,YAAY,0BAA0B,KAAK,KAAK,mBAAmB,IAAI;EAGxF,MAAM,KAAK,MAAM;AACjB,QAAM,GACJ,WAAW,uBAAuB,CAClC,OAAO;GACP;GACA,MAAM,KAAK;GACX,OAAO,KAAK;GACZ,aAAa,KAAK,eAAe;GACjC,CAAC,CACD,SAAS;AAQX,SAAO,WANM,MAAM,GACjB,WAAW,uBAAuB,CAClC,WAAW,CACX,MAAM,MAAM,KAAK,GAAG,CACpB,yBAAyB,EAEH,IAAI;UACpB,OAAO;AACf,SAAO,YAAY,OAAO,gCAAgC,2BAA2B"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../../src/astro/routes/api/widget-areas/index.ts"],"sourcesContent":["/**\n * Widget areas list and create endpoints\n *\n * GET /_emdash/api/widget-areas - List all widget areas\n * POST /_emdash/api/widget-areas - Create widget area\n */\n\nimport type { APIRoute } from \"astro\";\nimport { ulid } from \"ulidx\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { createWidgetAreaBody } from \"#api/schemas.js\";\nimport { rowToWidget } from \"#widgets/index.js\";\nimport type { WidgetRow } from \"#widgets/types.js\";\n\nexport const prerender = false;\n\nexport const GET: APIRoute = async ({ locals }) => {\n\tconst { emdash, user } = locals;\n\tconst db = emdash.db;\n\n\tconst denied = requirePerm(user, \"widgets:read\");\n\tif (denied) return denied;\n\n\ttry {\n\t\tconst areas = await db\n\t\t\t.selectFrom(\"_emdash_widget_areas\")\n\t\t\t.selectAll()\n\t\t\t.orderBy(\"name\", \"asc\")\n\t\t\t.execute();\n\n\t\t// Get widgets for each area (needed for drag-and-drop reordering in admin UI)\n\t\tconst areasWithWidgets = await Promise.all(\n\t\t\tareas.map(async (area) => {\n\t\t\t\tconst widgets = await db\n\t\t\t\t\t.selectFrom(\"_emdash_widgets\")\n\t\t\t\t\t.selectAll()\n\t\t\t\t\t.$castTo<WidgetRow>()\n\t\t\t\t\t.where(\"area_id\", \"=\", area.id)\n\t\t\t\t\t.orderBy(\"sort_order\", \"asc\")\n\t\t\t\t\t.execute();\n\n\t\t\t\treturn {\n\t\t\t\t\t...area,\n\t\t\t\t\twidgets: widgets.map((row) => rowToWidget(row)),\n\t\t\t\t\twidgetCount: widgets.length,\n\t\t\t\t};\n\t\t\t}),\n\t\t);\n\n\t\treturn apiSuccess({ items: areasWithWidgets });\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to fetch widget areas\", \"WIDGET_AREA_LIST_ERROR\");\n\t}\n};\n\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst db = emdash.db;\n\n\tconst denied = requirePerm(user, \"widgets:manage\");\n\tif (denied) return denied;\n\n\ttry {\n\t\tconst body = await parseBody(request, createWidgetAreaBody);\n\t\tif (isParseError(body)) return body;\n\n\t\t// Check if area name already exists\n\t\tconst existing = await db\n\t\t\t.selectFrom(\"_emdash_widget_areas\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"name\", \"=\", body.name)\n\t\t\t.executeTakeFirst();\n\n\t\tif (existing) {\n\t\t\treturn apiError(\"CONFLICT\", `Widget area with name \"${body.name}\" already exists`, 409);\n\t\t}\n\n\t\tconst id = ulid();\n\t\tawait db\n\t\t\t.insertInto(\"_emdash_widget_areas\")\n\t\t\t.values({\n\t\t\t\tid,\n\t\t\t\tname: body.name,\n\t\t\t\tlabel: body.label,\n\t\t\t\tdescription: body.description ?? null,\n\t\t\t})\n\t\t\t.execute();\n\n\t\tconst area = await db\n\t\t\t.selectFrom(\"_emdash_widget_areas\")\n\t\t\t.selectAll()\n\t\t\t.where(\"id\", \"=\", id)\n\t\t\t.executeTakeFirstOrThrow();\n\n\t\treturn apiSuccess(area, 201);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to create widget area\", \"WIDGET_AREA_CREATE_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,MAAa,YAAY;AAEzB,MAAa,MAAgB,OAAO,EAAE,aAAa;CAClD,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,KAAK,OAAO;CAElB,MAAM,SAAS,YAAY,MAAM,eAAe;AAChD,KAAI,OAAQ,QAAO;AAEnB,KAAI;EACH,MAAM,QAAQ,MAAM,GAClB,WAAW,uBAAuB,CAClC,WAAW,CACX,QAAQ,QAAQ,MAAM,CACtB,SAAS;AAqBX,SAAO,WAAW,EAAE,OAlBK,MAAM,QAAQ,IACtC,MAAM,IAAI,OAAO,SAAS;GACzB,MAAM,UAAU,MAAM,GACpB,WAAW,kBAAkB,CAC7B,WAAW,CACX,SAAoB,CACpB,MAAM,WAAW,KAAK,KAAK,GAAG,CAC9B,QAAQ,cAAc,MAAM,CAC5B,SAAS;AAEX,UAAO;IACN,GAAG;IACH,SAAS,QAAQ,KAAK,QAAQ,YAAY,IAAI,CAAC;IAC/C,aAAa,QAAQ;IACrB;IACA,CACF,EAE4C,CAAC;UACtC,OAAO;AACf,SAAO,YAAY,OAAO,gCAAgC,yBAAyB;;;AAIrF,MAAa,OAAiB,OAAO,EAAE,SAAS,aAAa;CAC5D,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,KAAK,OAAO;CAElB,MAAM,SAAS,YAAY,MAAM,iBAAiB;AAClD,KAAI,OAAQ,QAAO;AAEnB,KAAI;EACH,MAAM,OAAO,MAAM,UAAU,SAAS,qBAAqB;AAC3D,MAAI,aAAa,KAAK,CAAE,QAAO;AAS/B,MANiB,MAAM,GACrB,WAAW,uBAAuB,CAClC,OAAO,KAAK,CACZ,MAAM,QAAQ,KAAK,KAAK,KAAK,CAC7B,kBAAkB,CAGnB,QAAO,SAAS,YAAY,0BAA0B,KAAK,KAAK,mBAAmB,IAAI;EAGxF,MAAM,KAAK,MAAM;AACjB,QAAM,GACJ,WAAW,uBAAuB,CAClC,OAAO;GACP;GACA,MAAM,KAAK;GACX,OAAO,KAAK;GACZ,aAAa,KAAK,eAAe;GACjC,CAAC,CACD,SAAS;AAQX,SAAO,WANM,MAAM,GACjB,WAAW,uBAAuB,CAClC,WAAW,CACX,MAAM,MAAM,KAAK,GAAG,CACpB,yBAAyB,EAEH,IAAI;UACpB,OAAO;AACf,SAAO,YAAY,OAAO,gCAAgC,2BAA2B"}
@@ -1,7 +1,7 @@
1
1
  import "../../../base64-CqR-7kqF.mjs";
2
2
  import "../../../types-BXSUSAjt.mjs";
3
- import { n as apiSuccess, r as handleError } from "../../../error-RwM4dD35.mjs";
4
- import { t as getWidgetComponents } from "../../../components-CK0cuUoH.mjs";
3
+ import { n as apiSuccess, r as handleError } from "../../../error-CNn_w7jf.mjs";
4
+ import { t as getWidgetComponents } from "../../../components-DYKp2gmo.mjs";
5
5
 
6
6
  //#region src/astro/routes/api/widget-components.ts
7
7
  const prerender = false;
@@ -3,10 +3,11 @@ import "../../base64-CqR-7kqF.mjs";
3
3
  import "../../types-BXSUSAjt.mjs";
4
4
  import "../../media-JOf3pNkw.mjs";
5
5
  import "../../options-BPCVnesz.mjs";
6
- import "../../request-cache-D32LpnmI.mjs";
7
- import "../../loader-ZN1ll-d-.mjs";
8
- import { a as getSiteSettingsWithDb } from "../../settings-DfxiWY_s.mjs";
9
- import { n as getPublicOrigin } from "../../public-url-BFVC2OTJ.mjs";
6
+ import "../../init-lock-DlBHjf9-.mjs";
7
+ import "../../request-cache-UwmBAiUK.mjs";
8
+ import "../../loader-BqWjcH3h.mjs";
9
+ import { a as getSiteSettingsWithDb } from "../../settings-BjBsmVAo.mjs";
10
+ import { n as getPublicOrigin } from "../../public-url-D_zARuvZ.mjs";
10
11
 
11
12
  //#region src/astro/routes/robots.txt.ts
12
13
  const prerender = false;
@@ -1 +1 @@
1
- {"version":3,"file":"robots.txt.mjs","names":[],"sources":["../../../src/astro/routes/robots.txt.ts"],"sourcesContent":["/**\n * Robots.txt endpoint\n *\n * GET /robots.txt - Serves robots.txt with sitemap reference\n *\n * If a custom robots.txt is configured in SEO settings, that is returned.\n * Otherwise generates a default that allows all crawlers and references\n * the sitemap.\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { getPublicOrigin } from \"#api/public-url.js\";\nimport { getSiteSettingsWithDb } from \"#settings/index.js\";\n\nexport const prerender = false;\n\nconst TRAILING_SLASH_RE = /\\/$/;\n\nexport const GET: APIRoute = async ({ locals, url }) => {\n\tconst { emdash } = locals;\n\n\tif (!emdash?.db) {\n\t\t// Return a permissive default if CMS isn't initialized\n\t\treturn new Response(\"User-agent: *\\nAllow: /\\n\", {\n\t\t\tstatus: 200,\n\t\t\theaders: { \"Content-Type\": \"text/plain; charset=utf-8\" },\n\t\t});\n\t}\n\n\ttry {\n\t\tconst settings = await getSiteSettingsWithDb(emdash.db);\n\t\tconst siteUrl = (settings.url || getPublicOrigin(url, emdash?.config)).replace(\n\t\t\tTRAILING_SLASH_RE,\n\t\t\t\"\",\n\t\t);\n\t\tconst sitemapUrl = `${siteUrl}/sitemap.xml`;\n\n\t\t// Use custom robots.txt if configured\n\t\tif (settings.seo?.robotsTxt) {\n\t\t\t// Append sitemap directive if not already present\n\t\t\tlet content = settings.seo.robotsTxt;\n\t\t\tif (!content.toLowerCase().includes(\"sitemap:\")) {\n\t\t\t\tcontent = `${content.trimEnd()}\\n\\nSitemap: ${sitemapUrl}\\n`;\n\t\t\t}\n\n\t\t\treturn new Response(content, {\n\t\t\t\tstatus: 200,\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"text/plain; charset=utf-8\",\n\t\t\t\t\t\"Cache-Control\": \"public, max-age=86400\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\t// Generate default robots.txt\n\t\tconst defaultRobots = [\n\t\t\t\"User-agent: *\",\n\t\t\t\"Allow: /\",\n\t\t\t\"\",\n\t\t\t\"# Disallow admin and API routes\",\n\t\t\t\"Disallow: /_emdash/\",\n\t\t\t\"\",\n\t\t\t`Sitemap: ${sitemapUrl}`,\n\t\t\t\"\",\n\t\t].join(\"\\n\");\n\n\t\treturn new Response(defaultRobots, {\n\t\t\tstatus: 200,\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"text/plain; charset=utf-8\",\n\t\t\t\t\"Cache-Control\": \"public, max-age=86400\",\n\t\t\t},\n\t\t});\n\t} catch {\n\t\treturn new Response(\"User-agent: *\\nAllow: /\\n\", {\n\t\t\tstatus: 200,\n\t\t\theaders: { \"Content-Type\": \"text/plain; charset=utf-8\" },\n\t\t});\n\t}\n};\n"],"mappings":";;;;;;;;;;;AAeA,MAAa,YAAY;AAEzB,MAAM,oBAAoB;AAE1B,MAAa,MAAgB,OAAO,EAAE,QAAQ,UAAU;CACvD,MAAM,EAAE,WAAW;AAEnB,KAAI,CAAC,QAAQ,GAEZ,QAAO,IAAI,SAAS,6BAA6B;EAChD,QAAQ;EACR,SAAS,EAAE,gBAAgB,6BAA6B;EACxD,CAAC;AAGH,KAAI;EACH,MAAM,WAAW,MAAM,sBAAsB,OAAO,GAAG;EAKvD,MAAM,aAAa,IAJF,SAAS,OAAO,gBAAgB,KAAK,QAAQ,OAAO,EAAE,QACtE,mBACA,GACA,CAC6B;AAG9B,MAAI,SAAS,KAAK,WAAW;GAE5B,IAAI,UAAU,SAAS,IAAI;AAC3B,OAAI,CAAC,QAAQ,aAAa,CAAC,SAAS,WAAW,CAC9C,WAAU,GAAG,QAAQ,SAAS,CAAC,eAAe,WAAW;AAG1D,UAAO,IAAI,SAAS,SAAS;IAC5B,QAAQ;IACR,SAAS;KACR,gBAAgB;KAChB,iBAAiB;KACjB;IACD,CAAC;;EAIH,MAAM,gBAAgB;GACrB;GACA;GACA;GACA;GACA;GACA;GACA,YAAY;GACZ;GACA,CAAC,KAAK,KAAK;AAEZ,SAAO,IAAI,SAAS,eAAe;GAClC,QAAQ;GACR,SAAS;IACR,gBAAgB;IAChB,iBAAiB;IACjB;GACD,CAAC;SACK;AACP,SAAO,IAAI,SAAS,6BAA6B;GAChD,QAAQ;GACR,SAAS,EAAE,gBAAgB,6BAA6B;GACxD,CAAC"}
1
+ {"version":3,"file":"robots.txt.mjs","names":[],"sources":["../../../src/astro/routes/robots.txt.ts"],"sourcesContent":["/**\n * Robots.txt endpoint\n *\n * GET /robots.txt - Serves robots.txt with sitemap reference\n *\n * If a custom robots.txt is configured in SEO settings, that is returned.\n * Otherwise generates a default that allows all crawlers and references\n * the sitemap.\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { getPublicOrigin } from \"#api/public-url.js\";\nimport { getSiteSettingsWithDb } from \"#settings/index.js\";\n\nexport const prerender = false;\n\nconst TRAILING_SLASH_RE = /\\/$/;\n\nexport const GET: APIRoute = async ({ locals, url }) => {\n\tconst { emdash } = locals;\n\n\tif (!emdash?.db) {\n\t\t// Return a permissive default if CMS isn't initialized\n\t\treturn new Response(\"User-agent: *\\nAllow: /\\n\", {\n\t\t\tstatus: 200,\n\t\t\theaders: { \"Content-Type\": \"text/plain; charset=utf-8\" },\n\t\t});\n\t}\n\n\ttry {\n\t\tconst settings = await getSiteSettingsWithDb(emdash.db);\n\t\tconst siteUrl = (settings.url || getPublicOrigin(url, emdash?.config)).replace(\n\t\t\tTRAILING_SLASH_RE,\n\t\t\t\"\",\n\t\t);\n\t\tconst sitemapUrl = `${siteUrl}/sitemap.xml`;\n\n\t\t// Use custom robots.txt if configured\n\t\tif (settings.seo?.robotsTxt) {\n\t\t\t// Append sitemap directive if not already present\n\t\t\tlet content = settings.seo.robotsTxt;\n\t\t\tif (!content.toLowerCase().includes(\"sitemap:\")) {\n\t\t\t\tcontent = `${content.trimEnd()}\\n\\nSitemap: ${sitemapUrl}\\n`;\n\t\t\t}\n\n\t\t\treturn new Response(content, {\n\t\t\t\tstatus: 200,\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"text/plain; charset=utf-8\",\n\t\t\t\t\t\"Cache-Control\": \"public, max-age=86400\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\t// Generate default robots.txt\n\t\tconst defaultRobots = [\n\t\t\t\"User-agent: *\",\n\t\t\t\"Allow: /\",\n\t\t\t\"\",\n\t\t\t\"# Disallow admin and API routes\",\n\t\t\t\"Disallow: /_emdash/\",\n\t\t\t\"\",\n\t\t\t`Sitemap: ${sitemapUrl}`,\n\t\t\t\"\",\n\t\t].join(\"\\n\");\n\n\t\treturn new Response(defaultRobots, {\n\t\t\tstatus: 200,\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"text/plain; charset=utf-8\",\n\t\t\t\t\"Cache-Control\": \"public, max-age=86400\",\n\t\t\t},\n\t\t});\n\t} catch {\n\t\treturn new Response(\"User-agent: *\\nAllow: /\\n\", {\n\t\t\tstatus: 200,\n\t\t\theaders: { \"Content-Type\": \"text/plain; charset=utf-8\" },\n\t\t});\n\t}\n};\n"],"mappings":";;;;;;;;;;;;AAeA,MAAa,YAAY;AAEzB,MAAM,oBAAoB;AAE1B,MAAa,MAAgB,OAAO,EAAE,QAAQ,UAAU;CACvD,MAAM,EAAE,WAAW;AAEnB,KAAI,CAAC,QAAQ,GAEZ,QAAO,IAAI,SAAS,6BAA6B;EAChD,QAAQ;EACR,SAAS,EAAE,gBAAgB,6BAA6B;EACxD,CAAC;AAGH,KAAI;EACH,MAAM,WAAW,MAAM,sBAAsB,OAAO,GAAG;EAKvD,MAAM,aAAa,IAJF,SAAS,OAAO,gBAAgB,KAAK,QAAQ,OAAO,EAAE,QACtE,mBACA,GACA,CAC6B;AAG9B,MAAI,SAAS,KAAK,WAAW;GAE5B,IAAI,UAAU,SAAS,IAAI;AAC3B,OAAI,CAAC,QAAQ,aAAa,CAAC,SAAS,WAAW,CAC9C,WAAU,GAAG,QAAQ,SAAS,CAAC,eAAe,WAAW;AAG1D,UAAO,IAAI,SAAS,SAAS;IAC5B,QAAQ;IACR,SAAS;KACR,gBAAgB;KAChB,iBAAiB;KACjB;IACD,CAAC;;EAIH,MAAM,gBAAgB;GACrB;GACA;GACA;GACA;GACA;GACA;GACA,YAAY;GACZ;GACA,CAAC,KAAK,KAAK;AAEZ,SAAO,IAAI,SAAS,eAAe;GAClC,QAAQ;GACR,SAAS;IACR,gBAAgB;IAChB,iBAAiB;IACjB;GACD,CAAC;SACK;AACP,SAAO,IAAI,SAAS,6BAA6B;GAChD,QAAQ;GACR,SAAS,EAAE,gBAAgB,6BAA6B;GACxD,CAAC"}
@@ -4,13 +4,14 @@ import "../../base64-CqR-7kqF.mjs";
4
4
  import "../../types-BXSUSAjt.mjs";
5
5
  import "../../media-JOf3pNkw.mjs";
6
6
  import "../../options-BPCVnesz.mjs";
7
- import "../../request-cache-D32LpnmI.mjs";
8
- import "../../loader-ZN1ll-d-.mjs";
9
- import { t as handleSitemapData } from "../../seo-D_LPkOtu.mjs";
10
- import { a as getSiteSettingsWithDb } from "../../settings-DfxiWY_s.mjs";
11
- import { n as localizePath, t as interpolateUrlPattern } from "../../resolve-BqYMVG0D.mjs";
12
- import { t as buildSeoImageUrl } from "../../media-url-VClf8glU.mjs";
13
- import { n as getPublicOrigin } from "../../public-url-BFVC2OTJ.mjs";
7
+ import "../../init-lock-DlBHjf9-.mjs";
8
+ import "../../request-cache-UwmBAiUK.mjs";
9
+ import "../../loader-BqWjcH3h.mjs";
10
+ import { t as handleSitemapData } from "../../seo-CLhm-Fmb.mjs";
11
+ import { a as getSiteSettingsWithDb } from "../../settings-BjBsmVAo.mjs";
12
+ import { n as localizePath, t as interpolateUrlPattern } from "../../resolve-B3NUUtVY.mjs";
13
+ import { t as buildSeoImageUrl } from "../../media-url-CqLd69IO.mjs";
14
+ import { n as getPublicOrigin } from "../../public-url-D_zARuvZ.mjs";
14
15
 
15
16
  //#region src/astro/routes/sitemap-[collection].xml.ts
16
17
  const prerender = false;