emdash 1.3.0 → 1.4.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 (970) hide show
  1. package/dist/{activation-Dim4YMM7.mjs → activation-CGlyigmg.mjs} +3 -3
  2. package/dist/{activation-Dim4YMM7.mjs.map → activation-CGlyigmg.mjs.map} +1 -1
  3. package/dist/{adapters-F_xorvWv.d.mts → adapters-D9a1PfqH.d.mts} +1 -1
  4. package/dist/{adapters-F_xorvWv.d.mts.map → adapters-D9a1PfqH.d.mts.map} +1 -1
  5. package/dist/{after-PcEvMY_6.mjs → after-32yNRvd2.mjs} +5 -2
  6. package/dist/{after-PcEvMY_6.mjs.map → after-32yNRvd2.mjs.map} +1 -1
  7. package/dist/api/route-utils.d.mts +4 -4
  8. package/dist/api/route-utils.mjs +50 -49
  9. package/dist/api/route-utils.mjs.map +1 -1
  10. package/dist/api/schemas/index.d.mts +1 -1
  11. package/dist/api/schemas/index.mjs +7 -7
  12. package/dist/{api-D-7BNHoz.mjs → api--PYoyeTo.mjs} +121 -48
  13. package/dist/api--PYoyeTo.mjs.map +1 -0
  14. package/dist/api-tokens-DqSlkDVI.mjs +9 -0
  15. package/dist/api-tokens-DqSlkDVI.mjs.map +1 -0
  16. package/dist/{api-tokens-Bx38ZCQp.mjs → api-tokens-GNCsIegW.mjs} +3 -3
  17. package/dist/{api-tokens-Bx38ZCQp.mjs.map → api-tokens-GNCsIegW.mjs.map} +1 -1
  18. package/dist/{apply-T7ATgzCh.mjs → apply-DVnupNeS.mjs} +149 -91
  19. package/dist/apply-DVnupNeS.mjs.map +1 -0
  20. package/dist/{approvals-D-m6wvGl.mjs → approvals-DTtYSB27.mjs} +2 -2
  21. package/dist/{approvals-D-m6wvGl.mjs.map → approvals-DTtYSB27.mjs.map} +1 -1
  22. package/dist/{artifacts-htGyfCSt.mjs → artifacts-Dvdp2KK-.mjs} +29 -13
  23. package/dist/artifacts-Dvdp2KK-.mjs.map +1 -0
  24. package/dist/astro/image-endpoint.mjs +12 -2
  25. package/dist/astro/image-endpoint.mjs.map +1 -1
  26. package/dist/astro/index.d.mts +15 -14
  27. package/dist/astro/index.d.mts.map +1 -1
  28. package/dist/astro/index.mjs +59 -8
  29. package/dist/astro/index.mjs.map +1 -1
  30. package/dist/astro/middleware/auth.d.mts +13 -12
  31. package/dist/astro/middleware/auth.d.mts.map +1 -1
  32. package/dist/astro/middleware/auth.mjs +10 -8
  33. package/dist/astro/middleware/auth.mjs.map +1 -1
  34. package/dist/astro/middleware/media-usage-write-fence.mjs +5 -5
  35. package/dist/astro/middleware/redirect.d.mts.map +1 -1
  36. package/dist/astro/middleware/redirect.mjs +129 -49
  37. package/dist/astro/middleware/redirect.mjs.map +1 -1
  38. package/dist/astro/middleware/request-context.d.mts.map +1 -1
  39. package/dist/astro/middleware/request-context.mjs +18 -9
  40. package/dist/astro/middleware/request-context.mjs.map +1 -1
  41. package/dist/astro/middleware.d.mts +13 -12
  42. package/dist/astro/middleware.d.mts.map +1 -1
  43. package/dist/astro/middleware.mjs +111 -101
  44. package/dist/astro/middleware.mjs.map +1 -1
  45. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +11 -11
  46. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +11 -11
  47. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +6 -6
  48. package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
  49. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +6 -6
  50. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +14 -14
  51. package/dist/astro/routes/api/admin/byline-fields/index.mjs +14 -14
  52. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +14 -14
  53. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +25 -25
  54. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +25 -25
  55. package/dist/astro/routes/api/admin/bylines/index.mjs +25 -25
  56. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +17 -17
  57. package/dist/astro/routes/api/admin/comments/_id_.mjs +8 -8
  58. package/dist/astro/routes/api/admin/comments/bulk.mjs +16 -16
  59. package/dist/astro/routes/api/admin/comments/counts.mjs +8 -8
  60. package/dist/astro/routes/api/admin/comments/index.mjs +16 -16
  61. package/dist/astro/routes/api/admin/core-update.mjs +6 -6
  62. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +5 -5
  63. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +4 -4
  64. package/dist/astro/routes/api/admin/media-usage/activation.mjs +18 -18
  65. package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +19 -19
  66. package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +19 -19
  67. package/dist/astro/routes/api/admin/media-usage/progress.mjs +22 -21
  68. package/dist/astro/routes/api/admin/media-usage/progress.mjs.map +1 -1
  69. package/dist/astro/routes/api/admin/media-usage/repair.mjs +26 -25
  70. package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
  71. package/dist/astro/routes/api/admin/media-usage/work/index.mjs +19 -19
  72. package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +19 -19
  73. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +4 -4
  74. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +4 -4
  75. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +7 -7
  76. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +7 -7
  77. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +66 -65
  78. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  79. package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +5 -5
  80. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +66 -65
  81. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
  82. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +66 -65
  83. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  84. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +73 -72
  85. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  86. package/dist/astro/routes/api/admin/plugins/index.mjs +66 -65
  87. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  88. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +4 -4
  89. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +66 -65
  90. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  91. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +73 -72
  92. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
  93. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +66 -65
  94. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
  95. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +66 -65
  96. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
  97. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +74 -73
  98. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
  99. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +4 -4
  100. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +68 -67
  101. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  102. package/dist/astro/routes/api/admin/plugins/registry/publisher-handle.mjs +4 -4
  103. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +67 -66
  104. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
  105. package/dist/astro/routes/api/admin/plugins/updates.mjs +66 -65
  106. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  107. package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.mjs +5 -5
  108. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +66 -65
  109. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  110. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +4 -4
  111. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +66 -65
  112. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  113. package/dist/astro/routes/api/admin/transfer/_...path_.mjs +3 -3
  114. package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs +33 -32
  115. package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs.map +1 -1
  116. package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs +33 -32
  117. package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs.map +1 -1
  118. package/dist/astro/routes/api/admin/transfer/approvals/index.mjs +35 -34
  119. package/dist/astro/routes/api/admin/transfer/approvals/index.mjs.map +1 -1
  120. package/dist/astro/routes/api/admin/transfer/capabilities.mjs +35 -34
  121. package/dist/astro/routes/api/admin/transfer/capabilities.mjs.map +1 -1
  122. package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs +35 -34
  123. package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs.map +1 -1
  124. package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs +36 -35
  125. package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs.map +1 -1
  126. package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs +36 -35
  127. package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs.map +1 -1
  128. package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs +35 -34
  129. package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs.map +1 -1
  130. package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs +36 -35
  131. package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs.map +1 -1
  132. package/dist/astro/routes/api/admin/transfer/exports/index.mjs +37 -36
  133. package/dist/astro/routes/api/admin/transfer/exports/index.mjs.map +1 -1
  134. package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs +35 -34
  135. package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs.map +1 -1
  136. package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs +35 -34
  137. package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs.map +1 -1
  138. package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs +37 -36
  139. package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs.map +1 -1
  140. package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs +35 -34
  141. package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs.map +1 -1
  142. package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs +37 -36
  143. package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs.map +1 -1
  144. package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs +35 -34
  145. package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs.map +1 -1
  146. package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs +35 -34
  147. package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs.map +1 -1
  148. package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs +37 -36
  149. package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs.map +1 -1
  150. package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs +35 -34
  151. package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs.map +1 -1
  152. package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs +35 -34
  153. package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs.map +1 -1
  154. package/dist/astro/routes/api/admin/transfer/imports/index.mjs +37 -36
  155. package/dist/astro/routes/api/admin/transfer/imports/index.mjs.map +1 -1
  156. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +4 -4
  157. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +3 -3
  158. package/dist/astro/routes/api/admin/users/_id_/index.mjs +12 -12
  159. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +4 -4
  160. package/dist/astro/routes/api/admin/users/index.mjs +11 -11
  161. package/dist/astro/routes/api/auth/dev-bypass.mjs +3 -3
  162. package/dist/astro/routes/api/auth/handover.mjs +5 -5
  163. package/dist/astro/routes/api/auth/invite/accept.mjs +3 -3
  164. package/dist/astro/routes/api/auth/invite/complete.mjs +15 -15
  165. package/dist/astro/routes/api/auth/invite/index.mjs +12 -12
  166. package/dist/astro/routes/api/auth/invite/register-options.mjs +13 -13
  167. package/dist/astro/routes/api/auth/logout.mjs +3 -3
  168. package/dist/astro/routes/api/auth/magic-link/send.mjs +14 -14
  169. package/dist/astro/routes/api/auth/magic-link/verify.mjs +13 -13
  170. package/dist/astro/routes/api/auth/me.mjs +12 -12
  171. package/dist/astro/routes/api/auth/mode.mjs +3 -3
  172. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +8 -8
  173. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +1 -1
  174. package/dist/astro/routes/api/auth/passkey/_id_.mjs +11 -11
  175. package/dist/astro/routes/api/auth/passkey/index.mjs +3 -3
  176. package/dist/astro/routes/api/auth/passkey/options.mjs +15 -15
  177. package/dist/astro/routes/api/auth/passkey/register/options.mjs +13 -13
  178. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +13 -13
  179. package/dist/astro/routes/api/auth/passkey/verify.mjs +15 -15
  180. package/dist/astro/routes/api/auth/signup/complete.mjs +15 -15
  181. package/dist/astro/routes/api/auth/signup/request.mjs +13 -13
  182. package/dist/astro/routes/api/auth/signup/verify.mjs +3 -3
  183. package/dist/astro/routes/api/calendar.mjs +12 -12
  184. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +12 -12
  185. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +17 -17
  186. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +4 -4
  187. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +15 -15
  188. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +4 -4
  189. package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +15 -15
  190. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +4 -4
  191. package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs +9 -9
  192. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +29 -28
  193. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs.map +1 -1
  194. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +15 -15
  195. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +34 -33
  196. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
  197. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +34 -33
  198. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
  199. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +4 -4
  200. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +4 -4
  201. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +15 -15
  202. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.d.mts.map +1 -1
  203. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +35 -27
  204. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
  205. package/dist/astro/routes/api/content/_collection_/_id_/translations.d.mts.map +1 -1
  206. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +8 -4
  207. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs.map +1 -1
  208. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +15 -15
  209. package/dist/astro/routes/api/content/_collection_/_id_.mjs +15 -15
  210. package/dist/astro/routes/api/content/_collection_/authors.mjs +4 -4
  211. package/dist/astro/routes/api/content/_collection_/index.mjs +12 -12
  212. package/dist/astro/routes/api/content/_collection_/trash.mjs +12 -12
  213. package/dist/astro/routes/api/dashboard.mjs +22 -16
  214. package/dist/astro/routes/api/dashboard.mjs.map +1 -1
  215. package/dist/astro/routes/api/dev/emails.mjs +3 -3
  216. package/dist/astro/routes/api/dev/scheduled-tasks.mjs +97 -95
  217. package/dist/astro/routes/api/dev/scheduled-tasks.mjs.map +1 -1
  218. package/dist/astro/routes/api/health.mjs +4 -4
  219. package/dist/astro/routes/api/import/probe.d.mts +4 -3
  220. package/dist/astro/routes/api/import/probe.d.mts.map +1 -1
  221. package/dist/astro/routes/api/import/probe.mjs +27 -25
  222. package/dist/astro/routes/api/import/probe.mjs.map +1 -1
  223. package/dist/astro/routes/api/import/wordpress/analyze.d.mts +4 -3
  224. package/dist/astro/routes/api/import/wordpress/analyze.d.mts.map +1 -1
  225. package/dist/astro/routes/api/import/wordpress/analyze.mjs +7 -29
  226. package/dist/astro/routes/api/import/wordpress/analyze.mjs.map +1 -1
  227. package/dist/astro/routes/api/import/wordpress/execute.d.mts +14 -13
  228. package/dist/astro/routes/api/import/wordpress/execute.d.mts.map +1 -1
  229. package/dist/astro/routes/api/import/wordpress/execute.mjs +29 -29
  230. package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
  231. package/dist/astro/routes/api/import/wordpress/media.d.mts +13 -12
  232. package/dist/astro/routes/api/import/wordpress/media.d.mts.map +1 -1
  233. package/dist/astro/routes/api/import/wordpress/media.mjs +14 -14
  234. package/dist/astro/routes/api/import/wordpress/prepare.mjs +19 -19
  235. package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
  236. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +14 -13
  237. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts.map +1 -1
  238. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +25 -24
  239. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
  240. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  241. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +27 -25
  242. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
  243. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +14 -13
  244. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts.map +1 -1
  245. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +39 -38
  246. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
  247. package/dist/astro/routes/api/manifest.mjs +4 -4
  248. package/dist/astro/routes/api/mcp.mjs +99 -83
  249. package/dist/astro/routes/api/mcp.mjs.map +1 -1
  250. package/dist/astro/routes/api/media/_id_/confirm.mjs +16 -16
  251. package/dist/astro/routes/api/media/_id_/replace.mjs +12 -12
  252. package/dist/astro/routes/api/media/_id_/upload.mjs +6 -6
  253. package/dist/astro/routes/api/media/_id_/usage.mjs +28 -27
  254. package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -1
  255. package/dist/astro/routes/api/media/_id_.mjs +26 -25
  256. package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
  257. package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs +5 -5
  258. package/dist/astro/routes/api/media/file/_...key_.d.mts.map +1 -1
  259. package/dist/astro/routes/api/media/file/_...key_.mjs +62 -8
  260. package/dist/astro/routes/api/media/file/_...key_.mjs.map +1 -1
  261. package/dist/astro/routes/api/media/folders/_id_.mjs +13 -13
  262. package/dist/astro/routes/api/media/folders/index.mjs +13 -13
  263. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +4 -4
  264. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +4 -4
  265. package/dist/astro/routes/api/media/providers/index.mjs +4 -4
  266. package/dist/astro/routes/api/media/upload-url.mjs +15 -15
  267. package/dist/astro/routes/api/media.mjs +30 -29
  268. package/dist/astro/routes/api/media.mjs.map +1 -1
  269. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +17 -15
  270. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
  271. package/dist/astro/routes/api/menus/_name_/items.mjs +17 -15
  272. package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
  273. package/dist/astro/routes/api/menus/_name_/reorder.mjs +17 -15
  274. package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
  275. package/dist/astro/routes/api/menus/_name_/translations.mjs +17 -15
  276. package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
  277. package/dist/astro/routes/api/menus/_name_.mjs +17 -15
  278. package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
  279. package/dist/astro/routes/api/menus/index.mjs +17 -15
  280. package/dist/astro/routes/api/menus/index.mjs.map +1 -1
  281. package/dist/astro/routes/api/oauth/authorize.mjs +2 -2
  282. package/dist/astro/routes/api/oauth/device/authorize.mjs +6 -6
  283. package/dist/astro/routes/api/oauth/device/code.mjs +8 -8
  284. package/dist/astro/routes/api/oauth/device/token.mjs +8 -8
  285. package/dist/astro/routes/api/oauth/register.mjs +5 -5
  286. package/dist/astro/routes/api/oauth/token/refresh.mjs +6 -6
  287. package/dist/astro/routes/api/oauth/token/revoke.mjs +6 -6
  288. package/dist/astro/routes/api/oauth/token.d.mts.map +1 -1
  289. package/dist/astro/routes/api/oauth/token.mjs +7 -7
  290. package/dist/astro/routes/api/oauth/token.mjs.map +1 -1
  291. package/dist/astro/routes/api/openapi.json.mjs +12 -12
  292. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +9 -9
  293. package/dist/astro/routes/api/redirects/404s/index.mjs +20 -19
  294. package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
  295. package/dist/astro/routes/api/redirects/404s/summary.mjs +20 -19
  296. package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
  297. package/dist/astro/routes/api/redirects/_id_.mjs +21 -20
  298. package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
  299. package/dist/astro/routes/api/redirects/index.mjs +21 -20
  300. package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
  301. package/dist/astro/routes/api/relations/_id_/index.mjs +34 -33
  302. package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
  303. package/dist/astro/routes/api/relations/index.mjs +34 -33
  304. package/dist/astro/routes/api/relations/index.mjs.map +1 -1
  305. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +4 -4
  306. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +15 -15
  307. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs +66 -65
  308. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs.map +1 -1
  309. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs +66 -65
  310. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs.map +1 -1
  311. package/dist/astro/routes/api/schema/block-types/index.mjs +66 -65
  312. package/dist/astro/routes/api/schema/block-types/index.mjs.map +1 -1
  313. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +66 -65
  314. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  315. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +66 -65
  316. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  317. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +66 -65
  318. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  319. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +66 -65
  320. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  321. package/dist/astro/routes/api/schema/collections/index.mjs +66 -65
  322. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  323. package/dist/astro/routes/api/schema/collections/reorder.mjs +66 -65
  324. package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
  325. package/dist/astro/routes/api/schema/index.mjs +17 -16
  326. package/dist/astro/routes/api/schema/index.mjs.map +1 -1
  327. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +66 -65
  328. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  329. package/dist/astro/routes/api/schema/orphans/index.mjs +66 -65
  330. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  331. package/dist/astro/routes/api/search/enable.mjs +20 -18
  332. package/dist/astro/routes/api/search/enable.mjs.map +1 -1
  333. package/dist/astro/routes/api/search/index.mjs +19 -17
  334. package/dist/astro/routes/api/search/index.mjs.map +1 -1
  335. package/dist/astro/routes/api/search/rebuild.mjs +20 -18
  336. package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
  337. package/dist/astro/routes/api/search/stats.mjs +13 -11
  338. package/dist/astro/routes/api/search/stats.mjs.map +1 -1
  339. package/dist/astro/routes/api/search/suggest.mjs +19 -17
  340. package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
  341. package/dist/astro/routes/api/sections/_slug_.mjs +19 -17
  342. package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
  343. package/dist/astro/routes/api/sections/index.mjs +19 -17
  344. package/dist/astro/routes/api/sections/index.mjs.map +1 -1
  345. package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -7
  346. package/dist/astro/routes/api/settings/backups/archives/index.mjs +7 -7
  347. package/dist/astro/routes/api/settings/backups/export.mjs +7 -7
  348. package/dist/astro/routes/api/settings/backups/index.mjs +8 -8
  349. package/dist/astro/routes/api/settings/domain-notify.mjs +7 -7
  350. package/dist/astro/routes/api/settings/domain.mjs +19 -17
  351. package/dist/astro/routes/api/settings/domain.mjs.map +1 -1
  352. package/dist/astro/routes/api/settings/email.mjs +5 -5
  353. package/dist/astro/routes/api/settings.mjs +25 -23
  354. package/dist/astro/routes/api/settings.mjs.map +1 -1
  355. package/dist/astro/routes/api/setup/admin-verify.mjs +18 -18
  356. package/dist/astro/routes/api/setup/admin.mjs +14 -14
  357. package/dist/astro/routes/api/setup/dev-bypass.mjs +45 -44
  358. package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
  359. package/dist/astro/routes/api/setup/dev-reset.mjs +3 -3
  360. package/dist/astro/routes/api/setup/index.mjs +48 -47
  361. package/dist/astro/routes/api/setup/index.mjs.map +1 -1
  362. package/dist/astro/routes/api/setup/status.mjs +4 -4
  363. package/dist/astro/routes/api/site/domain-proof.mjs +17 -15
  364. package/dist/astro/routes/api/site/domain-proof.mjs.map +1 -1
  365. package/dist/astro/routes/api/snapshot.mjs +9 -9
  366. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +25 -24
  367. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
  368. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +25 -24
  369. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
  370. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +25 -24
  371. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
  372. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +25 -24
  373. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
  374. package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +25 -24
  375. package/dist/astro/routes/api/taxonomies/_name_/translations.mjs.map +1 -1
  376. package/dist/astro/routes/api/taxonomies/_name_.mjs +25 -24
  377. package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -1
  378. package/dist/astro/routes/api/taxonomies/bulk-tag.mjs +35 -34
  379. package/dist/astro/routes/api/taxonomies/bulk-tag.mjs.map +1 -1
  380. package/dist/astro/routes/api/taxonomies/index.mjs +25 -24
  381. package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
  382. package/dist/astro/routes/api/themes/preview.mjs +6 -6
  383. package/dist/astro/routes/api/typegen.mjs +5 -5
  384. package/dist/astro/routes/api/visual-editing/action-token.mjs +5 -5
  385. package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs +17 -17
  386. package/dist/astro/routes/api/visual-editing/toolbar-labels.mjs +3 -3
  387. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +1 -1
  388. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +1 -1
  389. package/dist/astro/routes/api/widget-areas/_name_/reorder.d.mts.map +1 -1
  390. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +24 -13
  391. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
  392. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.d.mts.map +1 -1
  393. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +22 -17
  394. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
  395. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +21 -17
  396. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
  397. package/dist/astro/routes/api/widget-areas/_name_.mjs +14 -10
  398. package/dist/astro/routes/api/widget-areas/_name_.mjs.map +1 -1
  399. package/dist/astro/routes/api/widget-areas/index.mjs +21 -17
  400. package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
  401. package/dist/astro/routes/api/widget-components.mjs +3 -3
  402. package/dist/astro/routes/robots.txt.mjs +16 -14
  403. package/dist/astro/routes/robots.txt.mjs.map +1 -1
  404. package/dist/astro/routes/sitemap-_collection_.xml.mjs +18 -16
  405. package/dist/astro/routes/sitemap-_collection_.xml.mjs.map +1 -1
  406. package/dist/astro/routes/sitemap.xml.mjs +16 -14
  407. package/dist/astro/routes/sitemap.xml.mjs.map +1 -1
  408. package/dist/astro/types.d.mts +22 -20
  409. package/dist/astro/types.d.mts.map +1 -1
  410. package/dist/{audit-_gieLVGU.mjs → audit-B8XE-0UV.mjs} +2 -2
  411. package/dist/{audit-_gieLVGU.mjs.map → audit-B8XE-0UV.mjs.map} +1 -1
  412. package/dist/auth/providers/github.d.mts +1 -1
  413. package/dist/auth/providers/google.d.mts +1 -1
  414. package/dist/auth/providers/microsoft.d.mts +1 -1
  415. package/dist/{authorize-DPFBGbE6.mjs → authorize-NJgp8kLI.mjs} +2 -2
  416. package/dist/{authorize-DPFBGbE6.mjs.map → authorize-NJgp8kLI.mjs.map} +1 -1
  417. package/dist/{backup-3FgVxiDJ.mjs → backup-8rPSJ28a.mjs} +4 -4
  418. package/dist/{backup-3FgVxiDJ.mjs.map → backup-8rPSJ28a.mjs.map} +1 -1
  419. package/dist/{block-types-CYcG56JB.mjs → block-types-BbOrfnWs.mjs} +5 -5
  420. package/dist/{block-types-CYcG56JB.mjs.map → block-types-BbOrfnWs.mjs.map} +1 -1
  421. package/dist/{block-values-gCX4HBSl.mjs → block-values-Dg0-8PPS.mjs} +4 -4
  422. package/dist/{block-values-gCX4HBSl.mjs.map → block-values-Dg0-8PPS.mjs.map} +1 -1
  423. package/dist/{byline-BR1qhyiw.mjs → byline-DHJS-GGb.mjs} +123 -38
  424. package/dist/byline-DHJS-GGb.mjs.map +1 -0
  425. package/dist/{byline-fields-BLXZnX7N.mjs → byline-fields-CiR8FvvF.mjs} +3 -3
  426. package/dist/{byline-fields-BLXZnX7N.mjs.map → byline-fields-CiR8FvvF.mjs.map} +1 -1
  427. package/dist/{byline-fields-4ClDC88c.mjs → byline-fields-D6KYsEa7.mjs} +2 -2
  428. package/dist/{byline-fields-4ClDC88c.mjs.map → byline-fields-D6KYsEa7.mjs.map} +1 -1
  429. package/dist/{byline-registry-dvt4N3xV.mjs → byline-registry-BhzpO41z.mjs} +3 -3
  430. package/dist/{byline-registry-dvt4N3xV.mjs.map → byline-registry-BhzpO41z.mjs.map} +1 -1
  431. package/dist/{bylines-CVOvRUL7.mjs → bylines-Bsg5cH4S.mjs} +7 -7
  432. package/dist/bylines-Bsg5cH4S.mjs.map +1 -0
  433. package/dist/{bylines-DxOs9B7z.mjs → bylines-f_ZEc6Sn.mjs} +8 -8
  434. package/dist/{bylines-DxOs9B7z.mjs.map → bylines-f_ZEc6Sn.mjs.map} +1 -1
  435. package/dist/{cache-CEU9wo_h.mjs → cache-5DHbpEWu.mjs} +4 -4
  436. package/dist/{cache-CEU9wo_h.mjs.map → cache-5DHbpEWu.mjs.map} +1 -1
  437. package/dist/{capture-triggers-CT6dK9zd.mjs → capture-triggers-BezAvWcB.mjs} +2 -2
  438. package/dist/{capture-triggers-CT6dK9zd.mjs.map → capture-triggers-BezAvWcB.mjs.map} +1 -1
  439. package/dist/{challenge-store-C17BYx2-.mjs → challenge-store-B1C0V4b3.mjs} +1 -1
  440. package/dist/{challenge-store-C17BYx2-.mjs.map → challenge-store-B1C0V4b3.mjs.map} +1 -1
  441. package/dist/{chunks-xC4UD5-S.mjs → chunks-DiW8VMwz.mjs} +2 -2
  442. package/dist/{chunks-xC4UD5-S.mjs.map → chunks-DiW8VMwz.mjs.map} +1 -1
  443. package/dist/cli/index.mjs +53 -52
  444. package/dist/cli/index.mjs.map +1 -1
  445. package/dist/client/cf-access.d.mts +1 -1
  446. package/dist/client/index.d.mts +61 -61
  447. package/dist/client/index.d.mts.map +1 -1
  448. package/dist/client/index.mjs +3 -2
  449. package/dist/client/index.mjs.map +1 -1
  450. package/dist/{collection-slugs-cache-e09QeJQt.mjs → collection-slugs-cache-DIrLjqH-.mjs} +20 -14
  451. package/dist/collection-slugs-cache-DIrLjqH-.mjs.map +1 -0
  452. package/dist/{comment-UvIWDKcW.mjs → comment-DB74Zpa4.mjs} +18 -8
  453. package/dist/comment-DB74Zpa4.mjs.map +1 -0
  454. package/dist/{comment-reaction-dGp6_FRo.mjs → comment-reaction-BScxIWUn.mjs} +2 -2
  455. package/dist/{comment-reaction-dGp6_FRo.mjs.map → comment-reaction-BScxIWUn.mjs.map} +1 -1
  456. package/dist/{comments-pej-_BUO.mjs → comments-Cor_zKml.mjs} +3 -3
  457. package/dist/{comments-pej-_BUO.mjs.map → comments-Cor_zKml.mjs.map} +1 -1
  458. package/dist/config-Cs_AwWXI.mjs +106 -0
  459. package/dist/config-Cs_AwWXI.mjs.map +1 -0
  460. package/dist/{config-CFMojMFK.d.mts → config-D44_8G9J.d.mts} +3 -1
  461. package/dist/config-D44_8G9J.d.mts.map +1 -0
  462. package/dist/{config-Bsm_u_oE.d.mts → config-sDhZvkLR.d.mts} +56 -20
  463. package/dist/config-sDhZvkLR.d.mts.map +1 -0
  464. package/dist/{content-DQSRZTVw.mjs → content-BKHUVsE5.mjs} +67 -30
  465. package/dist/content-BKHUVsE5.mjs.map +1 -0
  466. package/dist/{content-list-query-CYKcY6Vi.d.mts → content-list-query-ByP4jRpZ.d.mts} +1 -1
  467. package/dist/{content-list-query-CYKcY6Vi.d.mts.map → content-list-query-ByP4jRpZ.d.mts.map} +1 -1
  468. package/dist/{content-policy-Dm32n9C6.mjs → content-policy-BmE0MPZY.mjs} +1 -1
  469. package/dist/{content-policy-Dm32n9C6.mjs.map → content-policy-BmE0MPZY.mjs.map} +1 -1
  470. package/dist/{content-repair-DNh5--x5.mjs → content-repair-Ukdxoq-R.mjs} +4 -4
  471. package/dist/{content-repair-DNh5--x5.mjs.map → content-repair-Ukdxoq-R.mjs.map} +1 -1
  472. package/dist/{context-BYptmCN0.mjs → context-CzjejcsE.mjs} +32 -33
  473. package/dist/context-CzjejcsE.mjs.map +1 -0
  474. package/dist/{credits-B9iORdWB.mjs → credits-BKREepht.mjs} +3 -3
  475. package/dist/{credits-B9iORdWB.mjs.map → credits-BKREepht.mjs.map} +1 -1
  476. package/dist/{dashboard-D0jcgBD7.mjs → dashboard-ynr1qJWM.mjs} +10 -9
  477. package/dist/dashboard-ynr1qJWM.mjs.map +1 -0
  478. package/dist/database/migration-lock.mjs +1 -1
  479. package/dist/db/index.d.mts +3 -3
  480. package/dist/db/index.mjs +3 -3
  481. package/dist/db/libsql-migrations.d.mts +1 -1
  482. package/dist/db/libsql-migrations.mjs +5 -5
  483. package/dist/db/libsql.d.mts +1 -1
  484. package/dist/db/postgres-migrations.d.mts +1 -1
  485. package/dist/db/postgres-migrations.mjs +5 -5
  486. package/dist/db/postgres.d.mts +1 -1
  487. package/dist/db/sqlite-migrations.d.mts +1 -1
  488. package/dist/db/sqlite-migrations.mjs +5 -5
  489. package/dist/db/sqlite.d.mts +1 -1
  490. package/dist/{db-errors-CBD5yMro.mjs → db-errors-unnO6yiZ.mjs} +12 -2
  491. package/dist/db-errors-unnO6yiZ.mjs.map +1 -0
  492. package/dist/deferred-tasks-wlMFJL95.d.mts +10 -0
  493. package/dist/deferred-tasks-wlMFJL95.d.mts.map +1 -0
  494. package/dist/{destination-r2zIAZ2S.mjs → destination-DR3IHjmy.mjs} +1 -1
  495. package/dist/{destination-r2zIAZ2S.mjs.map → destination-DR3IHjmy.mjs.map} +1 -1
  496. package/dist/{device-flow-BkFKBoAn.mjs → device-flow-D1U392GC.mjs} +3 -5
  497. package/dist/device-flow-D1U392GC.mjs.map +1 -0
  498. package/dist/{dialect-helpers-7_IqPdh9.mjs → dialect-helpers-B1XN2HGB.mjs} +10 -3
  499. package/dist/dialect-helpers-B1XN2HGB.mjs.map +1 -0
  500. package/dist/{direct-executor-Cbxzg4qe.mjs → direct-executor-Bs2g0ake.mjs} +4 -4
  501. package/dist/{direct-executor-Cbxzg4qe.mjs.map → direct-executor-Bs2g0ake.mjs.map} +1 -1
  502. package/dist/{dist-Cfu8mMBs.mjs → dist-BUmWMTbN.mjs} +1 -1
  503. package/dist/{dist-Cfu8mMBs.mjs.map → dist-BUmWMTbN.mjs.map} +1 -1
  504. package/dist/{email-locale-BJ8DjTzZ.mjs → email-locale-Bs3HFdnq.mjs} +1 -1
  505. package/dist/{email-locale-BJ8DjTzZ.mjs.map → email-locale-Bs3HFdnq.mjs.map} +1 -1
  506. package/dist/{emdash-runtime-DVi7vtXC.mjs → emdash-runtime-C8T-pZpS.mjs} +108 -62
  507. package/dist/emdash-runtime-C8T-pZpS.mjs.map +1 -0
  508. package/dist/{enrich-Duu4sV3a.mjs → enrich-DFlfnd3u.mjs} +3 -3
  509. package/dist/{enrich-Duu4sV3a.mjs.map → enrich-DFlfnd3u.mjs.map} +1 -1
  510. package/dist/{entry-lock-C7VX0NGK.d.mts → entry-lock-BulbgPBX.d.mts} +23 -23
  511. package/dist/{entry-lock-C7VX0NGK.d.mts.map → entry-lock-BulbgPBX.d.mts.map} +1 -1
  512. package/dist/{entry-lock-Df6-XhIu.mjs → entry-lock-CRVmruM0.mjs} +4 -4
  513. package/dist/{entry-lock-Df6-XhIu.mjs.map → entry-lock-CRVmruM0.mjs.map} +1 -1
  514. package/dist/{entry-lock-DLxCffFW.mjs → entry-lock-D-zJQ4q6.mjs} +3 -3
  515. package/dist/{entry-lock-DLxCffFW.mjs.map → entry-lock-D-zJQ4q6.mjs.map} +1 -1
  516. package/dist/{entry-locks-DJAqVweV.mjs → entry-locks-CJ9uhqg1.mjs} +2 -2
  517. package/dist/{entry-locks-DJAqVweV.mjs.map → entry-locks-CJ9uhqg1.mjs.map} +1 -1
  518. package/dist/{env-types-C3FCVBWe.mjs → env-types-BE3bCvfP.mjs} +5 -5
  519. package/dist/{env-types-C3FCVBWe.mjs.map → env-types-BE3bCvfP.mjs.map} +1 -1
  520. package/dist/{error-CVWeIOku.mjs → error-BCMgPxdn.mjs} +3 -3
  521. package/dist/{error-CVWeIOku.mjs.map → error-BCMgPxdn.mjs.map} +1 -1
  522. package/dist/{errors-BOYNdIo3.mjs → errors-8gJqv-XV.mjs} +15 -2
  523. package/dist/{errors-BOYNdIo3.mjs.map → errors-8gJqv-XV.mjs.map} +1 -1
  524. package/dist/{fence-C3MUitUN.mjs → fence-Dagicj14.mjs} +4 -4
  525. package/dist/{fence-C3MUitUN.mjs.map → fence-Dagicj14.mjs.map} +1 -1
  526. package/dist/{field-map-Bft9LKak.mjs → field-map-BSXdNGt5.mjs} +11 -10
  527. package/dist/field-map-BSXdNGt5.mjs.map +1 -0
  528. package/dist/{focal-point-JX8kcOTQ.mjs → focal-point-CgCcr1Ca.mjs} +1 -1
  529. package/dist/{focal-point-JX8kcOTQ.mjs.map → focal-point-CgCcr1Ca.mjs.map} +1 -1
  530. package/dist/{fts-manager-Beg3e4bI.mjs → fts-manager-6861qcwk.mjs} +68 -22
  531. package/dist/fts-manager-6861qcwk.mjs.map +1 -0
  532. package/dist/{gc-ByyAYiYE.mjs → gc-CNkXB3mE.mjs} +8 -8
  533. package/dist/{gc-ByyAYiYE.mjs.map → gc-CNkXB3mE.mjs.map} +1 -1
  534. package/dist/{hook-result-BrdLyOdI.d.mts → hook-result-f8t7hIuu.d.mts} +1 -1
  535. package/dist/{hook-result-BrdLyOdI.d.mts.map → hook-result-f8t7hIuu.d.mts.map} +1 -1
  536. package/dist/{hreflang-CY_F5OjF.d.mts → hreflang-8dUOJAPJ.d.mts} +2 -2
  537. package/dist/{hreflang-CY_F5OjF.d.mts.map → hreflang-8dUOJAPJ.d.mts.map} +1 -1
  538. package/dist/{hreflang-C8Jb-hrf.mjs → hreflang-BW5A4FLK.mjs} +8 -8
  539. package/dist/{hreflang-C8Jb-hrf.mjs.map → hreflang-BW5A4FLK.mjs.map} +1 -1
  540. package/dist/{http-route-dispatch-CyeW6iPv.mjs → http-route-dispatch-rXKvTNm9.mjs} +5 -5
  541. package/dist/{http-route-dispatch-CyeW6iPv.mjs.map → http-route-dispatch-rXKvTNm9.mjs.map} +1 -1
  542. package/dist/{identity-Cael5uTT.mjs → identity-CPRRSovU.mjs} +3 -3
  543. package/dist/{identity-Cael5uTT.mjs.map → identity-CPRRSovU.mjs.map} +1 -1
  544. package/dist/{import-BUXjdZUn.mjs → import-yVbfPyfd.mjs} +5 -5
  545. package/dist/{import-BUXjdZUn.mjs.map → import-yVbfPyfd.mjs.map} +1 -1
  546. package/dist/index-VM7Fzxwe.d.mts +260 -0
  547. package/dist/index-VM7Fzxwe.d.mts.map +1 -0
  548. package/dist/index.d.mts +25 -24
  549. package/dist/index.mjs +89 -88
  550. package/dist/{install-finalization-3JX5qQEA.mjs → install-finalization-RU6VrHOX.mjs} +1 -1
  551. package/dist/{install-finalization-3JX5qQEA.mjs.map → install-finalization-RU6VrHOX.mjs.map} +1 -1
  552. package/dist/{json-recordset-BUjxhr77.mjs → json-recordset-D0WhN2UA.mjs} +2 -2
  553. package/dist/{json-recordset-BUjxhr77.mjs.map → json-recordset-D0WhN2UA.mjs.map} +1 -1
  554. package/dist/{lifecycle-7vUJeFRe.mjs → lifecycle-B8d7Rdqx.mjs} +1 -1
  555. package/dist/{lifecycle-7vUJeFRe.mjs.map → lifecycle-B8d7Rdqx.mjs.map} +1 -1
  556. package/dist/{load-CdAG9wz-.mjs → load-D4xtzm6h.mjs} +2 -2
  557. package/dist/{load-CdAG9wz-.mjs.map → load-D4xtzm6h.mjs.map} +1 -1
  558. package/dist/{loader-CswroUbe.mjs → loader-DhnedqY4.mjs} +199 -101
  559. package/dist/loader-DhnedqY4.mjs.map +1 -0
  560. package/dist/{loops-uA4iTOzd.mjs → loops-B2YS-Zzr.mjs} +2 -2
  561. package/dist/{loops-uA4iTOzd.mjs.map → loops-B2YS-Zzr.mjs.map} +1 -1
  562. package/dist/{manifest-builder-B8zjuH3f.mjs → manifest-builder-g1FLviel.mjs} +10 -3
  563. package/dist/manifest-builder-g1FLviel.mjs.map +1 -0
  564. package/dist/media/image-endpoint.d.mts +3 -2
  565. package/dist/media/image-endpoint.d.mts.map +1 -1
  566. package/dist/media/image-endpoint.mjs +17 -8
  567. package/dist/media/image-endpoint.mjs.map +1 -1
  568. package/dist/media/index.d.mts +1 -1
  569. package/dist/media/index.mjs +7 -6
  570. package/dist/media/index.mjs.map +1 -1
  571. package/dist/media/local-runtime.d.mts +15 -14
  572. package/dist/media/local-runtime.d.mts.map +1 -1
  573. package/dist/media/local-runtime.mjs +20 -15
  574. package/dist/media/local-runtime.mjs.map +1 -1
  575. package/dist/{media-1WC65OCB.mjs → media-BR4_t-Wd.mjs} +3 -3
  576. package/dist/{media-1WC65OCB.mjs.map → media-BR4_t-Wd.mjs.map} +1 -1
  577. package/dist/{media--dJRU6i2.mjs → media-CikS-q6E.mjs} +4 -4
  578. package/dist/{media--dJRU6i2.mjs.map → media-CikS-q6E.mjs.map} +1 -1
  579. package/dist/{media-Bws9f18T.mjs → media-DepNLhPq.mjs} +14 -4
  580. package/dist/media-DepNLhPq.mjs.map +1 -0
  581. package/dist/{media-allowlist-BJB7MFx6.mjs → media-allowlist-BMBLqyWh.mjs} +2 -2
  582. package/dist/{media-allowlist-BJB7MFx6.mjs.map → media-allowlist-BMBLqyWh.mjs.map} +1 -1
  583. package/dist/{media-folders-Dn3C16B8.mjs → media-folders-CI0Wydfo.mjs} +2 -2
  584. package/dist/{media-folders-Dn3C16B8.mjs.map → media-folders-CI0Wydfo.mjs.map} +1 -1
  585. package/dist/{media-usage-CF0WVcLO.mjs → media-usage-X1_20MY-.mjs} +8 -8
  586. package/dist/{media-usage-CF0WVcLO.mjs.map → media-usage-X1_20MY-.mjs.map} +1 -1
  587. package/dist/{media-usage-activation-C9HwVw5w.mjs → media-usage-activation-bWusy3M2.mjs} +3 -3
  588. package/dist/{media-usage-activation-C9HwVw5w.mjs.map → media-usage-activation-bWusy3M2.mjs.map} +1 -1
  589. package/dist/{media-usage-work-m3AWTmmC.mjs → media-usage-work-B2RaoJIa.mjs} +4 -4
  590. package/dist/{media-usage-work-m3AWTmmC.mjs.map → media-usage-work-B2RaoJIa.mjs.map} +1 -1
  591. package/dist/{media-usage-work-CkLa5-nc.mjs → media-usage-work-BCK2J-v_.mjs} +7 -7
  592. package/dist/{media-usage-work-CkLa5-nc.mjs.map → media-usage-work-BCK2J-v_.mjs.map} +1 -1
  593. package/dist/{menus-BCVSSp1z.mjs → menus-B0Qqv_cS.mjs} +176 -92
  594. package/dist/menus-B0Qqv_cS.mjs.map +1 -0
  595. package/dist/{menus-Cl4kwdt7.mjs → menus-oypxT1pI.mjs} +134 -53
  596. package/dist/menus-oypxT1pI.mjs.map +1 -0
  597. package/dist/{menus-BSzwObhV.mjs → menus-uEAxWAm1.mjs} +3 -3
  598. package/dist/{menus-BSzwObhV.mjs.map → menus-uEAxWAm1.mjs.map} +1 -1
  599. package/dist/migrations/index.d.mts +1 -1
  600. package/dist/migrations/index.mjs +5 -5
  601. package/dist/{mime-B5M9R53H.mjs → mime-D1We9jUx.mjs} +1 -1
  602. package/dist/{mime-B5M9R53H.mjs.map → mime-D1We9jUx.mjs.map} +1 -1
  603. package/dist/{normalize-BuWa0lvd.mjs → normalize-Cx-bNwhP.mjs} +41 -12
  604. package/dist/normalize-Cx-bNwhP.mjs.map +1 -0
  605. package/dist/{oauth-authorization-TpEJrYB7.mjs → oauth-authorization-CPLgBrdo.mjs} +19 -6
  606. package/dist/oauth-authorization-CPLgBrdo.mjs.map +1 -0
  607. package/dist/{oauth-state-store-CHMn_mwc.mjs → oauth-state-store-BndCfRum.mjs} +1 -1
  608. package/dist/{oauth-state-store-CHMn_mwc.mjs.map → oauth-state-store-BndCfRum.mjs.map} +1 -1
  609. package/dist/object-cache/memory.d.mts +1 -1
  610. package/dist/{object-cache-Bo6DGaC9.mjs → object-cache-DmKr09La.mjs} +21 -4
  611. package/dist/{object-cache-Bo6DGaC9.mjs.map → object-cache-DmKr09La.mjs.map} +1 -1
  612. package/dist/{options-DJWaq3Ie.d.mts → options-BUUgroHg.d.mts} +3 -3
  613. package/dist/{options-DJWaq3Ie.d.mts.map → options-BUUgroHg.d.mts.map} +1 -1
  614. package/dist/page/index.d.mts +2 -2
  615. package/dist/page/index.mjs +16 -14
  616. package/dist/page/index.mjs.map +1 -1
  617. package/dist/{parse-DgQ2NABT.mjs → parse-B_b6gZxG.mjs} +2 -2
  618. package/dist/{parse-DgQ2NABT.mjs.map → parse-B_b6gZxG.mjs.map} +1 -1
  619. package/dist/{parse-CWHOFc6z.d.mts → parse-Dndx1QmN.d.mts} +3 -3
  620. package/dist/{parse-CWHOFc6z.d.mts.map → parse-Dndx1QmN.d.mts.map} +1 -1
  621. package/dist/{passkey-config-D0kdzEao.mjs → passkey-config-D2Lua5__.mjs} +1 -1
  622. package/dist/{passkey-config-D0kdzEao.mjs.map → passkey-config-D2Lua5__.mjs.map} +1 -1
  623. package/dist/{patterns-CMNnYCgf.mjs → patterns-CryGz_EV.mjs} +1 -1
  624. package/dist/{patterns-CMNnYCgf.mjs.map → patterns-CryGz_EV.mjs.map} +1 -1
  625. package/dist/{placeholder-D41vk11_.d.mts → placeholder-CSKu5OkD.d.mts} +9 -1
  626. package/dist/placeholder-CSKu5OkD.d.mts.map +1 -0
  627. package/dist/plugin-test-runtime.d.mts +17 -15
  628. package/dist/plugin-test-runtime.d.mts.map +1 -1
  629. package/dist/plugin-test-runtime.mjs +99 -98
  630. package/dist/plugin-types.d.mts +2 -2
  631. package/dist/plugin-utils.d.mts +13 -12
  632. package/dist/plugin-utils.d.mts.map +1 -1
  633. package/dist/plugins/adapt-sandbox-entry.d.mts +13 -12
  634. package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
  635. package/dist/plugins/host.d.mts +5 -5
  636. package/dist/plugins/host.mjs +48 -47
  637. package/dist/{policy-DLQ--Hnm.mjs → policy-BPugqmeV.mjs} +13 -5
  638. package/dist/policy-BPugqmeV.mjs.map +1 -0
  639. package/dist/{protocol-79kUO7jP.d.mts → protocol-PoAfD_9W.d.mts} +2 -2
  640. package/dist/{protocol-79kUO7jP.d.mts.map → protocol-PoAfD_9W.d.mts.map} +1 -1
  641. package/dist/{public-plugin-api-routes-BuAMJ8nN.mjs → public-plugin-api-routes-CMljrTby.mjs} +9 -9
  642. package/dist/{public-plugin-api-routes-BuAMJ8nN.mjs.map → public-plugin-api-routes-CMljrTby.mjs.map} +1 -1
  643. package/dist/{public-submission-Di3TsgzX.mjs → public-submission-ayqoyee4.mjs} +10 -10
  644. package/dist/{public-submission-Di3TsgzX.mjs.map → public-submission-ayqoyee4.mjs.map} +1 -1
  645. package/dist/query-BFHjCzSh.mjs +37 -0
  646. package/dist/query-BFHjCzSh.mjs.map +1 -0
  647. package/dist/{query-CpnRlBh8.mjs → query-D62NntCZ.mjs} +55 -65
  648. package/dist/query-D62NntCZ.mjs.map +1 -0
  649. package/dist/{query-haKvLAWl.mjs → query-LmPY2y0C.mjs} +5 -5
  650. package/dist/{query-haKvLAWl.mjs.map → query-LmPY2y0C.mjs.map} +1 -1
  651. package/dist/{rate-limit-Xp4d0NBY.mjs → rate-limit-C04Llsoc.mjs} +3 -3
  652. package/dist/{rate-limit-Xp4d0NBY.mjs.map → rate-limit-C04Llsoc.mjs.map} +1 -1
  653. package/dist/{redirect-DiS_3mA4.mjs → redirect-DjLdw427.mjs} +6 -6
  654. package/dist/{redirect-DiS_3mA4.mjs.map → redirect-DjLdw427.mjs.map} +1 -1
  655. package/dist/{redirect-paths-CNYq7w80.mjs → redirect-paths-DOaVBp6E.mjs} +1 -1
  656. package/dist/{redirect-paths-CNYq7w80.mjs.map → redirect-paths-DOaVBp6E.mjs.map} +1 -1
  657. package/dist/{redirects-BHpy-VsZ.mjs → redirects-Cpq1catN.mjs} +6 -6
  658. package/dist/{redirects-BHpy-VsZ.mjs.map → redirects-Cpq1catN.mjs.map} +1 -1
  659. package/dist/{redirects-BEVSRMa2.mjs → redirects-CyvvZrCJ.mjs} +2 -2
  660. package/dist/{redirects-BEVSRMa2.mjs.map → redirects-CyvvZrCJ.mjs.map} +1 -1
  661. package/dist/{registry-TUVaid9Z.mjs → registry-B0-O575m.mjs} +25 -20
  662. package/dist/registry-B0-O575m.mjs.map +1 -0
  663. package/dist/{relations-CA_QuMTU.mjs → relations-WIOojTL4.mjs} +24 -11
  664. package/dist/relations-WIOojTL4.mjs.map +1 -0
  665. package/dist/{request-cache-C4CIo5ad.mjs → request-cache-5z2WzWmh.mjs} +1 -1
  666. package/dist/{request-cache-C4CIo5ad.mjs.map → request-cache-5z2WzWmh.mjs.map} +1 -1
  667. package/dist/request-context.d.mts +12 -1
  668. package/dist/request-context.d.mts.map +1 -1
  669. package/dist/request-context.mjs.map +1 -1
  670. package/dist/{resolve-DwNM-CXl.mjs → resolve-BNnm8EkB.mjs} +14 -13
  671. package/dist/{resolve-DwNM-CXl.mjs.map → resolve-BNnm8EkB.mjs.map} +1 -1
  672. package/dist/{resolve-D-kqyKns.mjs → resolve-DdNXBJSr.mjs} +4 -4
  673. package/dist/resolve-DdNXBJSr.mjs.map +1 -0
  674. package/dist/{revision-BVp8S0e_.mjs → revision-Dx7Uth1X.mjs} +5 -5
  675. package/dist/{revision-BVp8S0e_.mjs.map → revision-Dx7Uth1X.mjs.map} +1 -1
  676. package/dist/{routes-BerZFrvV.mjs → routes-avqgc-8r.mjs} +3 -3
  677. package/dist/{routes-BerZFrvV.mjs.map → routes-avqgc-8r.mjs.map} +1 -1
  678. package/dist/{runner-C5NeAkBQ.mjs → runner-Bkkfk4O8.mjs} +78 -4
  679. package/dist/runner-Bkkfk4O8.mjs.map +1 -0
  680. package/dist/{runner-BObHz5FC.d.mts → runner-Dfgp6-S_.d.mts} +7 -2
  681. package/dist/runner-Dfgp6-S_.d.mts.map +1 -0
  682. package/dist/runtime.d.mts +14 -13
  683. package/dist/runtime.d.mts.map +1 -1
  684. package/dist/runtime.mjs +8 -6
  685. package/dist/runtime.mjs.map +1 -1
  686. package/dist/schema/project-env-types.mjs +43 -42
  687. package/dist/schema/project-env-types.mjs.map +1 -1
  688. package/dist/{schema-DJRfvM_o.mjs → schema-B-3rntlX.mjs} +11 -11
  689. package/dist/{schema-DJRfvM_o.mjs.map → schema-B-3rntlX.mjs.map} +1 -1
  690. package/dist/{schema-C4OBuv6Z.mjs → schema-BqBlUZtb.mjs} +4 -4
  691. package/dist/{schema-C4OBuv6Z.mjs.map → schema-BqBlUZtb.mjs.map} +1 -1
  692. package/dist/{scopes-BU03K7Uo.mjs → scopes-DNaY7Ey0.mjs} +3 -3
  693. package/dist/{scopes-BU03K7Uo.mjs.map → scopes-DNaY7Ey0.mjs.map} +1 -1
  694. package/dist/{search-DfVzks89.mjs → search-BPWTnpnD.mjs} +32 -32
  695. package/dist/search-BPWTnpnD.mjs.map +1 -0
  696. package/dist/{secrets-Cc_O3Kp-.mjs → secrets-Dswzrz3k.mjs} +2 -2
  697. package/dist/{secrets-Cc_O3Kp-.mjs.map → secrets-Dswzrz3k.mjs.map} +1 -1
  698. package/dist/{sections-BMy4JVUz.mjs → sections-rSao6rBG.mjs} +3 -3
  699. package/dist/{sections-BMy4JVUz.mjs.map → sections-rSao6rBG.mjs.map} +1 -1
  700. package/dist/seed/index.d.mts +2 -2
  701. package/dist/seed/index.mjs +42 -41
  702. package/dist/seo/index.d.mts +3 -3
  703. package/dist/seo/index.mjs +30 -28
  704. package/dist/seo/index.mjs.map +1 -1
  705. package/dist/{seo-VZYOEy8f.mjs → seo-B_H_pqOd.mjs} +3 -3
  706. package/dist/{seo-VZYOEy8f.mjs.map → seo-B_H_pqOd.mjs.map} +1 -1
  707. package/dist/{service-Bo_usgSk.mjs → service-DpiUQVpp.mjs} +2 -2
  708. package/dist/{service-Bo_usgSk.mjs.map → service-DpiUQVpp.mjs.map} +1 -1
  709. package/dist/{session-user-DlpPdf8L.mjs → session-user-DiE4JKPP.mjs} +4 -4
  710. package/dist/{session-user-DlpPdf8L.mjs.map → session-user-DiE4JKPP.mjs.map} +1 -1
  711. package/dist/{settings-DS914jjE.mjs → settings--XlUdUaI.mjs} +3 -3
  712. package/dist/{settings-DS914jjE.mjs.map → settings--XlUdUaI.mjs.map} +1 -1
  713. package/dist/{settings-CWb84sDm.mjs → settings-D932YP2-.mjs} +111 -44
  714. package/dist/settings-D932YP2-.mjs.map +1 -0
  715. package/dist/{setup-complete-BuNxAUiN.mjs → setup-complete-qsJYWutC.mjs} +2 -2
  716. package/dist/{setup-complete-BuNxAUiN.mjs.map → setup-complete-qsJYWutC.mjs.map} +1 -1
  717. package/dist/{setup-nonce-BnEAX0iy.mjs → setup-nonce-CBFgUFXw.mjs} +1 -1
  718. package/dist/{setup-nonce-BnEAX0iy.mjs.map → setup-nonce-CBFgUFXw.mjs.map} +1 -1
  719. package/dist/{site-domain-Bq5j5bVg.mjs → site-domain-oRGS_JfA.mjs} +2 -2
  720. package/dist/{site-domain-Bq5j5bVg.mjs.map → site-domain-oRGS_JfA.mjs.map} +1 -1
  721. package/dist/{sitemap-name-BTg2NJJv.mjs → sitemap-name-B8QP8wud.mjs} +1 -1
  722. package/dist/{sitemap-name-BTg2NJJv.mjs.map → sitemap-name-B8QP8wud.mjs.map} +1 -1
  723. package/dist/{slugify-bu2-jKia.mjs → slugify-BDEG9pLk.mjs} +1 -1
  724. package/dist/{slugify-bu2-jKia.mjs.map → slugify-BDEG9pLk.mjs.map} +1 -1
  725. package/dist/{snapshot-DYsG4uOq.mjs → snapshot-BjaXDZQ5.mjs} +2 -2
  726. package/dist/{snapshot-DYsG4uOq.mjs.map → snapshot-BjaXDZQ5.mjs.map} +1 -1
  727. package/dist/{stage-D8DWgPcO.mjs → stage-CZQnXM_G.mjs} +3 -3
  728. package/dist/{stage-D8DWgPcO.mjs.map → stage-CZQnXM_G.mjs.map} +1 -1
  729. package/dist/{staged-CD_imitH.mjs → staged-ByBmPFtX.mjs} +3 -3
  730. package/dist/{staged-CD_imitH.mjs.map → staged-ByBmPFtX.mjs.map} +1 -1
  731. package/dist/storage/local.d.mts +1 -1
  732. package/dist/storage/s3.d.mts +1 -1
  733. package/dist/{storage-query-DRyu3bSU.d.mts → storage-query-BFp06Y0s.d.mts} +22 -10
  734. package/dist/storage-query-BFp06Y0s.d.mts.map +1 -0
  735. package/dist/{taxonomies-Dd9JJv_a.mjs → taxonomies-5SR76j11.mjs} +15 -17
  736. package/dist/taxonomies-5SR76j11.mjs.map +1 -0
  737. package/dist/{taxonomies-ChnU7Mc8.mjs → taxonomies-B__VmCKQ.mjs} +64 -58
  738. package/dist/taxonomies-B__VmCKQ.mjs.map +1 -0
  739. package/dist/{taxonomy-C_C_LBAU.mjs → taxonomy-CMI5fczd.mjs} +30 -17
  740. package/dist/taxonomy-CMI5fczd.mjs.map +1 -0
  741. package/dist/{transaction-BVYIo_yu.mjs → transaction-CkoQ5wqQ.mjs} +1 -1
  742. package/dist/{transaction-BVYIo_yu.mjs.map → transaction-CkoQ5wqQ.mjs.map} +1 -1
  743. package/dist/{transfer-WmWiR3xf.mjs → transfer-BbKfufJ4.mjs} +2 -2
  744. package/dist/{transfer-WmWiR3xf.mjs.map → transfer-BbKfufJ4.mjs.map} +1 -1
  745. package/dist/{transfer-ClH6w6BV.mjs → transfer-DTGblAj2.mjs} +71 -34
  746. package/dist/{transfer-ClH6w6BV.mjs.map → transfer-DTGblAj2.mjs.map} +1 -1
  747. package/dist/{transfer-download--ofRj9Cw.mjs → transfer-download-D9LQEDX0.mjs} +1 -1
  748. package/dist/{transfer-download--ofRj9Cw.mjs.map → transfer-download-D9LQEDX0.mjs.map} +1 -1
  749. package/dist/{transport-DxiXnbXk.d.mts → transport-Dm5QzpT_.d.mts} +1 -1
  750. package/dist/{transport-DxiXnbXk.d.mts.map → transport-Dm5QzpT_.d.mts.map} +1 -1
  751. package/dist/{transport-BjbqNiPI.mjs → transport-Dzpn5b3i.mjs} +4 -3
  752. package/dist/transport-Dzpn5b3i.mjs.map +1 -0
  753. package/dist/{turnstile-CJwvsOqw.mjs → turnstile-Cs2wfkJG.mjs} +1 -1
  754. package/dist/{turnstile-CJwvsOqw.mjs.map → turnstile-Cs2wfkJG.mjs.map} +1 -1
  755. package/dist/{types-BA3ey2QH.d.mts → types-BAsCk5KU.d.mts} +1 -1
  756. package/dist/{types-BA3ey2QH.d.mts.map → types-BAsCk5KU.d.mts.map} +1 -1
  757. package/dist/{types-RLgeIpnF.d.mts → types-BuvSwT9Y.d.mts} +8 -7
  758. package/dist/{types-RLgeIpnF.d.mts.map → types-BuvSwT9Y.d.mts.map} +1 -1
  759. package/dist/{types-CNB-dj6F.d.mts → types-C4KT3Md2.d.mts} +10 -6
  760. package/dist/types-C4KT3Md2.d.mts.map +1 -0
  761. package/dist/{types-DvqVxZXa.d.mts → types-CVXHwIBB.d.mts} +1 -1
  762. package/dist/{types-DvqVxZXa.d.mts.map → types-CVXHwIBB.d.mts.map} +1 -1
  763. package/dist/{types-BGmQ0uXs.mjs → types-C_asjp1J.mjs} +1 -1
  764. package/dist/types-C_asjp1J.mjs.map +1 -0
  765. package/dist/{types-DHO7Pd25.d.mts → types-CadaL_k8.d.mts} +1 -1
  766. package/dist/{types-DHO7Pd25.d.mts.map → types-CadaL_k8.d.mts.map} +1 -1
  767. package/dist/{types-QoPHm-2w.d.mts → types-CjftrmZR.d.mts} +3 -3
  768. package/dist/{types-QoPHm-2w.d.mts.map → types-CjftrmZR.d.mts.map} +1 -1
  769. package/dist/{types-DCFavOii.d.mts → types-DKwRUA-x.d.mts} +1 -1
  770. package/dist/{types-DCFavOii.d.mts.map → types-DKwRUA-x.d.mts.map} +1 -1
  771. package/dist/{types-D2NEXtgB.mjs → types-DwhEvIVb.mjs} +8 -2
  772. package/dist/types-DwhEvIVb.mjs.map +1 -0
  773. package/dist/{types-Bwpzb5o6.d.mts → types-GwAyS5SH.d.mts} +1 -1
  774. package/dist/{types-Bwpzb5o6.d.mts.map → types-GwAyS5SH.d.mts.map} +1 -1
  775. package/dist/{types-slSqujQL.d.mts → types-uU2YNYSt.d.mts} +6 -1
  776. package/dist/types-uU2YNYSt.d.mts.map +1 -0
  777. package/dist/{update-check-BxNg9T6N.mjs → update-check-ABBJgg6M.mjs} +4 -4
  778. package/dist/{update-check-BxNg9T6N.mjs.map → update-check-ABBJgg6M.mjs.map} +1 -1
  779. package/dist/{url-Dn3IStq8.mjs → url-DTfGDJhI.mjs} +1 -1
  780. package/dist/{url-Dn3IStq8.mjs.map → url-DTfGDJhI.mjs.map} +1 -1
  781. package/dist/{user-BlCTKVAm.mjs → user-By8SzQxS.mjs} +3 -3
  782. package/dist/{user-BlCTKVAm.mjs.map → user-By8SzQxS.mjs.map} +1 -1
  783. package/dist/{utils-TPt7w2cS.mjs → utils-D5uOi6WS.mjs} +13 -5
  784. package/dist/utils-D5uOi6WS.mjs.map +1 -0
  785. package/dist/{index-BB9sVisO.d.mts → utils-Szp4iBQB.d.mts} +9 -256
  786. package/dist/utils-Szp4iBQB.d.mts.map +1 -0
  787. package/dist/{validate-emKxGC5F.d.mts → validate-DDvxy6qG.d.mts} +8 -8
  788. package/dist/{validate-emKxGC5F.d.mts.map → validate-DDvxy6qG.d.mts.map} +1 -1
  789. package/dist/{validate-DxYhJQA-.mjs → validate-Dz-TIOFB.mjs} +7 -7
  790. package/dist/{validate-DxYhJQA-.mjs.map → validate-Dz-TIOFB.mjs.map} +1 -1
  791. package/dist/{validation-Ckq4vsVg.mjs → validation-Fc9ZSUS_.mjs} +17 -16
  792. package/dist/{validation-Ckq4vsVg.mjs.map → validation-Fc9ZSUS_.mjs.map} +1 -1
  793. package/dist/version-Bu6Nlbb5.mjs +7 -0
  794. package/dist/{version-DHmGpcch.mjs.map → version-Bu6Nlbb5.mjs.map} +1 -1
  795. package/dist/version-DqB7LIO7.mjs +49 -0
  796. package/dist/version-DqB7LIO7.mjs.map +1 -0
  797. package/dist/{widgets-DA5XmvVC.mjs → widgets-BUx_Mf2q.mjs} +18 -5
  798. package/dist/widgets-BUx_Mf2q.mjs.map +1 -0
  799. package/dist/{wxr-taxonomies-RgRG0d5e.mjs → wxr-taxonomies-DbJtWrWM.mjs} +7 -6
  800. package/dist/wxr-taxonomies-DbJtWrWM.mjs.map +1 -0
  801. package/dist/{wxr-taxonomies-CrMonejI.d.mts → wxr-taxonomies-Dy2i2ON3.d.mts} +1 -1
  802. package/dist/wxr-taxonomies-Dy2i2ON3.d.mts.map +1 -0
  803. package/dist/{zod-generator-D0JKy94C.mjs → zod-generator--nlM0930.mjs} +5 -4
  804. package/dist/zod-generator--nlM0930.mjs.map +1 -0
  805. package/package.json +5 -5
  806. package/src/api/handlers/bulk-tag.ts +11 -3
  807. package/src/api/handlers/bylines.ts +6 -2
  808. package/src/api/handlers/content.ts +154 -23
  809. package/src/api/handlers/dashboard.ts +13 -6
  810. package/src/api/handlers/device-flow.ts +1 -3
  811. package/src/api/handlers/menus.ts +27 -13
  812. package/src/api/handlers/oauth-authorization.ts +1 -3
  813. package/src/api/handlers/relations.ts +15 -1
  814. package/src/api/handlers/taxonomies.ts +27 -17
  815. package/src/astro/image-endpoint.ts +23 -2
  816. package/src/astro/integration/admin-nav.ts +52 -0
  817. package/src/astro/integration/index.ts +7 -0
  818. package/src/astro/integration/runtime.ts +14 -0
  819. package/src/astro/integration/shims/use-sync-external-store-with-selector.js +2 -0
  820. package/src/astro/integration/shims/use-sync-external-store.js +4 -1
  821. package/src/astro/integration/vite-config.ts +16 -8
  822. package/src/astro/middleware/auth.ts +9 -2
  823. package/src/astro/middleware/redirect.ts +158 -63
  824. package/src/astro/middleware/request-context.ts +1 -0
  825. package/src/astro/middleware.ts +17 -4
  826. package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +4 -1
  827. package/src/astro/routes/api/content/[collection]/[id]/translations.ts +14 -1
  828. package/src/astro/routes/api/dashboard.ts +2 -0
  829. package/src/astro/routes/api/import/wordpress/analyze.ts +5 -29
  830. package/src/astro/routes/api/import/wordpress-plugin/execute.ts +3 -3
  831. package/src/astro/routes/api/media/file/[...key].ts +31 -7
  832. package/src/astro/routes/api/oauth/token.ts +5 -1
  833. package/src/astro/routes/api/widget-areas/[name]/reorder.ts +7 -1
  834. package/src/astro/routes/api/widget-areas/[name]/widgets/[id].ts +3 -1
  835. package/src/astro/routes/api/widget-areas/[name]/widgets.ts +2 -1
  836. package/src/astro/routes/api/widget-areas/[name].ts +2 -1
  837. package/src/astro/routes/api/widget-areas/index.ts +2 -1
  838. package/src/astro/types.ts +4 -3
  839. package/src/auth/api-tokens.ts +3 -0
  840. package/src/auth/types.ts +6 -0
  841. package/src/cleanup.ts +44 -0
  842. package/src/cli/commands/export-seed.ts +6 -4
  843. package/src/cli/commands/login.ts +2 -4
  844. package/src/client/index.ts +1 -0
  845. package/src/client/transport.ts +11 -7
  846. package/src/components/EmDashImage.astro +14 -2
  847. package/src/components/InlinePortableTextEditor.tsx +4 -1
  848. package/src/components/inline-bubble-menu.tsx +109 -95
  849. package/src/components/inline-image.tsx +54 -48
  850. package/src/database/dialect-helpers.ts +10 -3
  851. package/src/database/migrations/content-sized.ts +82 -0
  852. package/src/database/migrations/policy.ts +28 -2
  853. package/src/database/migrations/runner.ts +48 -0
  854. package/src/database/repositories/byline.ts +95 -31
  855. package/src/database/repositories/comment.ts +17 -7
  856. package/src/database/repositories/content.ts +96 -23
  857. package/src/database/repositories/media.ts +17 -0
  858. package/src/database/repositories/menu.ts +236 -139
  859. package/src/database/repositories/taxonomy-def.ts +9 -2
  860. package/src/database/repositories/taxonomy.ts +47 -14
  861. package/src/database/repositories/types.ts +14 -3
  862. package/src/database/types.ts +1 -1
  863. package/src/emdash-runtime.ts +60 -17
  864. package/src/fields/image.ts +1 -0
  865. package/src/i18n/config.ts +58 -10
  866. package/src/i18n/normalize.ts +16 -2
  867. package/src/i18n/query.ts +47 -0
  868. package/src/i18n/resolve.ts +8 -3
  869. package/src/import/utils.ts +15 -2
  870. package/src/import/wxr-taxonomies.ts +3 -2
  871. package/src/index.ts +1 -0
  872. package/src/loader.ts +183 -114
  873. package/src/mcp/server.ts +28 -1
  874. package/src/media/caption.ts +30 -0
  875. package/src/media/content-disposition.ts +56 -0
  876. package/src/media/image-endpoint.ts +13 -6
  877. package/src/media/local-runtime.ts +3 -0
  878. package/src/media/normalize.ts +17 -8
  879. package/src/media/responsive.ts +12 -2
  880. package/src/media/types.ts +16 -3
  881. package/src/media/usage/content-fields.ts +2 -1
  882. package/src/menus/index.ts +158 -36
  883. package/src/migrations/manifest.ts +1 -0
  884. package/src/object-cache/index.ts +22 -0
  885. package/src/plugin-test-runtime.ts +1 -0
  886. package/src/plugins/byline-access.ts +3 -1
  887. package/src/plugins/context.ts +1 -2
  888. package/src/plugins/storage-indexes.ts +7 -3
  889. package/src/query.ts +67 -53
  890. package/src/redirects/artifacts.ts +39 -5
  891. package/src/references/field-map.ts +6 -4
  892. package/src/request-context.ts +8 -0
  893. package/src/schema/collection-slugs-cache.ts +31 -17
  894. package/src/schema/registry.ts +9 -0
  895. package/src/schema/types.ts +7 -6
  896. package/src/schema/zod-generator.ts +2 -1
  897. package/src/search/fts-manager.ts +103 -31
  898. package/src/search/query.ts +31 -64
  899. package/src/seed/apply.ts +221 -109
  900. package/src/seed/types.ts +6 -4
  901. package/src/settings/index.ts +135 -35
  902. package/src/settings/version.ts +54 -0
  903. package/src/taxonomies/index.ts +99 -85
  904. package/src/taxonomies/term-counts.ts +2 -1
  905. package/src/transfer/import/advance.ts +12 -1
  906. package/src/transfer/import/scaffold.ts +7 -1
  907. package/src/transfer/import/stages.ts +53 -2
  908. package/src/utils/db-errors.ts +15 -0
  909. package/src/utils/revalidating-cache.ts +85 -0
  910. package/src/virtual-modules.d.ts +1 -0
  911. package/src/visual-editing/toolbar.ts +7 -2
  912. package/src/widgets/index.ts +27 -13
  913. package/dist/api-D-7BNHoz.mjs.map +0 -1
  914. package/dist/api-tokens-CdP49zVF.mjs +0 -3
  915. package/dist/apply-T7ATgzCh.mjs.map +0 -1
  916. package/dist/artifacts-htGyfCSt.mjs.map +0 -1
  917. package/dist/byline-BR1qhyiw.mjs.map +0 -1
  918. package/dist/bylines-CVOvRUL7.mjs.map +0 -1
  919. package/dist/collection-slugs-cache-e09QeJQt.mjs.map +0 -1
  920. package/dist/comment-UvIWDKcW.mjs.map +0 -1
  921. package/dist/config-Bsm_u_oE.d.mts.map +0 -1
  922. package/dist/config-CFMojMFK.d.mts.map +0 -1
  923. package/dist/config-CvmjJcVw.mjs +0 -73
  924. package/dist/config-CvmjJcVw.mjs.map +0 -1
  925. package/dist/content-DQSRZTVw.mjs.map +0 -1
  926. package/dist/context-BYptmCN0.mjs.map +0 -1
  927. package/dist/dashboard-D0jcgBD7.mjs.map +0 -1
  928. package/dist/db-errors-CBD5yMro.mjs.map +0 -1
  929. package/dist/deferred-tasks-ZvUECSzI.d.mts +0 -9
  930. package/dist/deferred-tasks-ZvUECSzI.d.mts.map +0 -1
  931. package/dist/device-flow-BkFKBoAn.mjs.map +0 -1
  932. package/dist/dialect-helpers-7_IqPdh9.mjs.map +0 -1
  933. package/dist/emdash-runtime-DVi7vtXC.mjs.map +0 -1
  934. package/dist/field-defs-cache-Dez5iWJJ.mjs +0 -77
  935. package/dist/field-defs-cache-Dez5iWJJ.mjs.map +0 -1
  936. package/dist/field-map-Bft9LKak.mjs.map +0 -1
  937. package/dist/fts-manager-Beg3e4bI.mjs.map +0 -1
  938. package/dist/index-BB9sVisO.d.mts.map +0 -1
  939. package/dist/loader-CswroUbe.mjs.map +0 -1
  940. package/dist/manifest-builder-B8zjuH3f.mjs.map +0 -1
  941. package/dist/media-Bws9f18T.mjs.map +0 -1
  942. package/dist/menus-BCVSSp1z.mjs.map +0 -1
  943. package/dist/menus-Cl4kwdt7.mjs.map +0 -1
  944. package/dist/normalize-BuWa0lvd.mjs.map +0 -1
  945. package/dist/oauth-authorization-TpEJrYB7.mjs.map +0 -1
  946. package/dist/placeholder-D41vk11_.d.mts.map +0 -1
  947. package/dist/policy-DLQ--Hnm.mjs.map +0 -1
  948. package/dist/query-CpnRlBh8.mjs.map +0 -1
  949. package/dist/registry-TUVaid9Z.mjs.map +0 -1
  950. package/dist/relations-CA_QuMTU.mjs.map +0 -1
  951. package/dist/resolve-D-kqyKns.mjs.map +0 -1
  952. package/dist/runner-BObHz5FC.d.mts.map +0 -1
  953. package/dist/runner-C5NeAkBQ.mjs.map +0 -1
  954. package/dist/search-DfVzks89.mjs.map +0 -1
  955. package/dist/settings-CWb84sDm.mjs.map +0 -1
  956. package/dist/storage-query-DRyu3bSU.d.mts.map +0 -1
  957. package/dist/taxonomies-ChnU7Mc8.mjs.map +0 -1
  958. package/dist/taxonomies-Dd9JJv_a.mjs.map +0 -1
  959. package/dist/taxonomy-C_C_LBAU.mjs.map +0 -1
  960. package/dist/transport-BjbqNiPI.mjs.map +0 -1
  961. package/dist/types-BGmQ0uXs.mjs.map +0 -1
  962. package/dist/types-CNB-dj6F.d.mts.map +0 -1
  963. package/dist/types-D2NEXtgB.mjs.map +0 -1
  964. package/dist/types-slSqujQL.d.mts.map +0 -1
  965. package/dist/utils-TPt7w2cS.mjs.map +0 -1
  966. package/dist/version-DHmGpcch.mjs +0 -7
  967. package/dist/widgets-DA5XmvVC.mjs.map +0 -1
  968. package/dist/wxr-taxonomies-CrMonejI.d.mts.map +0 -1
  969. package/dist/wxr-taxonomies-RgRG0d5e.mjs.map +0 -1
  970. package/dist/zod-generator-D0JKy94C.mjs.map +0 -1
@@ -1,20 +1,22 @@
1
- import "../../dialect-helpers-7_IqPdh9.mjs";
2
- import "../../config-CvmjJcVw.mjs";
3
- import "../../after-PcEvMY_6.mjs";
1
+ import "../../dialect-helpers-B1XN2HGB.mjs";
2
+ import "../../config-Cs_AwWXI.mjs";
3
+ import "../../after-32yNRvd2.mjs";
4
4
  import "../../options-DhrI7eMv.mjs";
5
- import "../../secrets-Cc_O3Kp-.mjs";
5
+ import "../../secrets-Dswzrz3k.mjs";
6
6
  import "../../base64-BQBZwXCx.mjs";
7
- import "../../object-cache-Bo6DGaC9.mjs";
8
- import "../../request-cache-C4CIo5ad.mjs";
9
- import "../../types-D2NEXtgB.mjs";
10
- import "../../media-Bws9f18T.mjs";
11
- import "../../loader-CswroUbe.mjs";
12
- import "../../json-recordset-BUjxhr77.mjs";
7
+ import "../../query-BFHjCzSh.mjs";
8
+ import "../../object-cache-DmKr09La.mjs";
9
+ import "../../request-cache-5z2WzWmh.mjs";
10
+ import "../../types-DwhEvIVb.mjs";
11
+ import "../../media-DepNLhPq.mjs";
12
+ import "../../version-DqB7LIO7.mjs";
13
+ import "../../loader-DhnedqY4.mjs";
14
+ import "../../json-recordset-D0WhN2UA.mjs";
13
15
  import "../../errors-B4f4It-2.mjs";
14
- import "../../errors-BOYNdIo3.mjs";
15
- import { s as getSiteSettingsWithDb } from "../../settings-CWb84sDm.mjs";
16
- import "../../error-CVWeIOku.mjs";
17
- import "../../fence-C3MUitUN.mjs";
16
+ import "../../errors-8gJqv-XV.mjs";
17
+ import { s as getSiteSettingsWithDb } from "../../settings-D932YP2-.mjs";
18
+ import "../../error-BCMgPxdn.mjs";
19
+ import "../../fence-Dagicj14.mjs";
18
20
  import { i as getPublicOrigin } from "../../public-url-Bt98vysr.mjs";
19
21
 
20
22
  //#region src/astro/routes/robots.txt.ts
@@ -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. When `seo.disallowAiTraining` is set, either version gets\n * rules asking AI training crawlers to stay away.\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\n/** AI training crawlers and opt-out tokens, as listed in Cloudflare's managed robots.txt. */\nconst AI_TRAINING_CRAWLERS = [\n\t\"Amazonbot\",\n\t\"Applebot-Extended\",\n\t\"Bytespider\",\n\t\"CCBot\",\n\t\"ClaudeBot\",\n\t\"Google-Extended\",\n\t\"GPTBot\",\n\t\"meta-externalagent\",\n];\n\n/**\n * `Content-Signal` is not a rule, so the empty `Disallow:` is what closes the\n * `*` group; without a rule, crawlers merge it with the next group and apply\n * `Disallow: /` to everyone.\n */\nconst AI_TRAINING_RULES = [\n\t\"# Disallow AI training\",\n\t\"User-agent: *\",\n\t\"Content-Signal: search=yes, ai-train=no\",\n\t\"Disallow:\",\n\t...AI_TRAINING_CRAWLERS.flatMap((agent) => [\"\", `User-agent: ${agent}`, \"Disallow: /\"]),\n].join(\"\\n\");\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\t\tconst disallowAiTraining = settings.seo?.disallowAiTraining === true;\n\n\t\t// Use custom robots.txt if configured\n\t\tif (settings.seo?.robotsTxt) {\n\t\t\tlet content = settings.seo.robotsTxt;\n\t\t\tif (disallowAiTraining) {\n\t\t\t\tcontent = `${content.trimEnd()}\\n\\n${AI_TRAINING_RULES}\\n`;\n\t\t\t}\n\t\t\t// Append sitemap directive if not already present\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...(disallowAiTraining ? [AI_TRAINING_RULES, \"\"] : []),\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":";;;;;;;;;;;;;;;;;;;;AAgBA,MAAa,YAAY;AAEzB,MAAM,oBAAoB;;;;;;AAmB1B,MAAM,oBAAoB;CACzB;CACA;CACA;CACA;CACA,GArB4B;EAC5B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,CAYwB,SAAS,UAAU;EAAC;EAAI,eAAe;EAAS;EAAc,CAAC;CACvF,CAAC,KAAK,KAAK;AAEZ,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;EAC9B,MAAM,qBAAqB,SAAS,KAAK,uBAAuB;AAGhE,MAAI,SAAS,KAAK,WAAW;GAC5B,IAAI,UAAU,SAAS,IAAI;AAC3B,OAAI,mBACH,WAAU,GAAG,QAAQ,SAAS,CAAC,MAAM,kBAAkB;AAGxD,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,GAAI,qBAAqB,CAAC,mBAAmB,GAAG,GAAG,EAAE;GACrD,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. When `seo.disallowAiTraining` is set, either version gets\n * rules asking AI training crawlers to stay away.\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\n/** AI training crawlers and opt-out tokens, as listed in Cloudflare's managed robots.txt. */\nconst AI_TRAINING_CRAWLERS = [\n\t\"Amazonbot\",\n\t\"Applebot-Extended\",\n\t\"Bytespider\",\n\t\"CCBot\",\n\t\"ClaudeBot\",\n\t\"Google-Extended\",\n\t\"GPTBot\",\n\t\"meta-externalagent\",\n];\n\n/**\n * `Content-Signal` is not a rule, so the empty `Disallow:` is what closes the\n * `*` group; without a rule, crawlers merge it with the next group and apply\n * `Disallow: /` to everyone.\n */\nconst AI_TRAINING_RULES = [\n\t\"# Disallow AI training\",\n\t\"User-agent: *\",\n\t\"Content-Signal: search=yes, ai-train=no\",\n\t\"Disallow:\",\n\t...AI_TRAINING_CRAWLERS.flatMap((agent) => [\"\", `User-agent: ${agent}`, \"Disallow: /\"]),\n].join(\"\\n\");\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\t\tconst disallowAiTraining = settings.seo?.disallowAiTraining === true;\n\n\t\t// Use custom robots.txt if configured\n\t\tif (settings.seo?.robotsTxt) {\n\t\t\tlet content = settings.seo.robotsTxt;\n\t\t\tif (disallowAiTraining) {\n\t\t\t\tcontent = `${content.trimEnd()}\\n\\n${AI_TRAINING_RULES}\\n`;\n\t\t\t}\n\t\t\t// Append sitemap directive if not already present\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...(disallowAiTraining ? [AI_TRAINING_RULES, \"\"] : []),\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":";;;;;;;;;;;;;;;;;;;;;;AAgBA,MAAa,YAAY;AAEzB,MAAM,oBAAoB;;;;;;AAmB1B,MAAM,oBAAoB;CACzB;CACA;CACA;CACA;CACA,GArB4B;EAC5B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,CAYwB,SAAS,UAAU;EAAC;EAAI,eAAe;EAAS;EAAc,CAAC;CACvF,CAAC,KAAK,KAAK;AAEZ,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;EAC9B,MAAM,qBAAqB,SAAS,KAAK,uBAAuB;AAGhE,MAAI,SAAS,KAAK,WAAW;GAC5B,IAAI,UAAU,SAAS,IAAI;AAC3B,OAAI,mBACH,WAAU,GAAG,QAAQ,SAAS,CAAC,MAAM,kBAAkB;AAGxD,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,GAAI,qBAAqB,CAAC,mBAAmB,GAAG,GAAG,EAAE;GACrD,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,25 +1,27 @@
1
- import "../../dialect-helpers-7_IqPdh9.mjs";
2
- import { i as isI18nEnabled, r as getI18nConfig } from "../../config-CvmjJcVw.mjs";
3
- import "../../after-PcEvMY_6.mjs";
1
+ import "../../dialect-helpers-B1XN2HGB.mjs";
2
+ import { r as getI18nConfig, s as isI18nEnabled } from "../../config-Cs_AwWXI.mjs";
3
+ import "../../after-32yNRvd2.mjs";
4
4
  import "../../options-DhrI7eMv.mjs";
5
- import "../../secrets-Cc_O3Kp-.mjs";
5
+ import "../../secrets-Dswzrz3k.mjs";
6
6
  import "../../base64-BQBZwXCx.mjs";
7
- import "../../object-cache-Bo6DGaC9.mjs";
8
- import "../../request-cache-C4CIo5ad.mjs";
9
- import "../../types-D2NEXtgB.mjs";
10
- import "../../media-Bws9f18T.mjs";
11
- import { a as resolveLocalizedContentRoutePath } from "../../resolve-D-kqyKns.mjs";
12
- import "../../loader-CswroUbe.mjs";
13
- import "../../json-recordset-BUjxhr77.mjs";
7
+ import "../../query-BFHjCzSh.mjs";
8
+ import "../../object-cache-DmKr09La.mjs";
9
+ import "../../request-cache-5z2WzWmh.mjs";
10
+ import "../../types-DwhEvIVb.mjs";
11
+ import "../../media-DepNLhPq.mjs";
12
+ import { a as resolveLocalizedContentRoutePath } from "../../resolve-DdNXBJSr.mjs";
13
+ import "../../version-DqB7LIO7.mjs";
14
+ import "../../loader-DhnedqY4.mjs";
15
+ import "../../json-recordset-D0WhN2UA.mjs";
14
16
  import "../../errors-B4f4It-2.mjs";
15
- import "../../errors-BOYNdIo3.mjs";
17
+ import "../../errors-8gJqv-XV.mjs";
16
18
  import { t as handleSitemapData } from "../../seo-ClB-dw9w.mjs";
17
- import { s as getSiteSettingsWithDb } from "../../settings-CWb84sDm.mjs";
18
- import "../../error-CVWeIOku.mjs";
19
- import "../../fence-C3MUitUN.mjs";
19
+ import { s as getSiteSettingsWithDb } from "../../settings-D932YP2-.mjs";
20
+ import "../../error-BCMgPxdn.mjs";
21
+ import "../../fence-Dagicj14.mjs";
20
22
  import { t as buildSeoImageUrl } from "../../media-url-BQgKvpQ5.mjs";
21
23
  import { i as getPublicOrigin } from "../../public-url-Bt98vysr.mjs";
22
- import { t as parseCollectionSitemapName } from "../../sitemap-name-BTg2NJJv.mjs";
24
+ import { t as parseCollectionSitemapName } from "../../sitemap-name-B8QP8wud.mjs";
23
25
  import virtualConfig from "virtual:emdash/config";
24
26
 
25
27
  //#region src/astro/routes/sitemap-[collection].xml.ts
@@ -1 +1 @@
1
- {"version":3,"file":"sitemap-_collection_.xml.mjs","names":[],"sources":["../../../src/astro/routes/sitemap-[collection].xml.ts"],"sourcesContent":["/**\n * Per-collection sitemap endpoint\n *\n * GET /sitemap-{collection}.xml - First page of a single collection's sitemap.\n * GET /sitemap-{collection}-{n}.xml - Page n (2 and up) of that sitemap.\n *\n * Uses the collection's url_pattern to build URLs. Falls back to\n * /{collection}/{slug} when no pattern is configured.\n *\n * i18n behaviour: when Astro i18n is enabled, the locale prefix is\n * applied via Astro's own `getRelativeLocaleUrl` (which honours\n * `prefixDefaultLocale`, custom `path` mappings, and other `routing`\n * config). Each translation row is emitted as its own `<url>` with\n * `<xhtml:link rel=\"alternate\" hreflang=\"...\">` entries pointing to\n * its siblings (grouped by `translation_group`). The default-locale\n * variant is also linked as `hreflang=\"x-default\"`.\n */\n\nimport type { APIRoute } from \"astro\";\n// @ts-ignore - virtual module\nimport virtualConfig from \"virtual:emdash/config\";\n\nimport { handleSitemapData } from \"#api/handlers/seo.js\";\nimport { getPublicOrigin } from \"#api/public-url.js\";\nimport { getSiteSettingsWithDb } from \"#settings/index.js\";\n\nimport { getI18nConfig, isI18nEnabled } from \"../../i18n/config.js\";\nimport { resolveLocalizedContentRoutePath } from \"../../i18n/resolve.js\";\nimport { buildSeoImageUrl } from \"../../seo/media-url.js\";\nimport { parseCollectionSitemapName } from \"../../seo/sitemap-name.js\";\n\nexport const prerender = false;\n\nconst TRAILING_SLASH_RE = /\\/$/;\nconst AMP_RE = /&/g;\nconst LT_RE = /</g;\nconst GT_RE = />/g;\nconst QUOT_RE = /\"/g;\nconst APOS_RE = /'/g;\n\nexport const GET: APIRoute = async ({ params, locals, url }) => {\n\tconst { emdash } = locals;\n\n\t// The middleware skips runtime setup for names no collection can have, so\n\t// this check must run before the configuration check below.\n\tconst parsed = params.collection ? parseCollectionSitemapName(params.collection) : null;\n\tif (!parsed) {\n\t\treturn new Response(\"<!-- Sitemap not found -->\", {\n\t\t\tstatus: 404,\n\t\t\theaders: { \"Content-Type\": \"application/xml\" },\n\t\t});\n\t}\n\tconst { collection: collectionSlug, page } = parsed;\n\n\tif (!emdash?.db) {\n\t\treturn new Response(\"<!-- EmDash not configured -->\", {\n\t\t\tstatus: 500,\n\t\t\theaders: { \"Content-Type\": \"application/xml\" },\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\n\t\tconst result = await handleSitemapData(emdash.db, collectionSlug, { page });\n\n\t\tif (!result.success || !result.data) {\n\t\t\treturn new Response(\"<!-- Failed to generate sitemap -->\", {\n\t\t\t\tstatus: 500,\n\t\t\t\theaders: { \"Content-Type\": \"application/xml\" },\n\t\t\t});\n\t\t}\n\n\t\tconst col = result.data.collections[0];\n\t\tif (!col) {\n\t\t\treturn new Response(\"<!-- Collection not found or empty -->\", {\n\t\t\t\tstatus: 404,\n\t\t\t\theaders: { \"Content-Type\": \"application/xml\" },\n\t\t\t});\n\t\t}\n\n\t\tconst i18nEnabled = isI18nEnabled();\n\t\tconst i18nConfig = getI18nConfig();\n\n\t\t// Group entries by `translation_group` so each <url> can advertise\n\t\t// its sibling translations via xhtml:link. Rows without a group\n\t\t// (legacy/single-locale data) are emitted individually.\n\t\ttype Entry = (typeof col.entries)[number];\n\t\tconst groups = new Map<string, Entry[]>();\n\t\tconst ungrouped: Entry[] = [];\n\t\tfor (const entry of col.entries) {\n\t\t\tif (i18nEnabled && entry.translationGroup) {\n\t\t\t\tconst list = groups.get(entry.translationGroup);\n\t\t\t\tif (list) list.push(entry);\n\t\t\t\telse groups.set(entry.translationGroup, [entry]);\n\t\t\t} else {\n\t\t\t\tungrouped.push(entry);\n\t\t\t}\n\t\t}\n\t\t// Translations listed on other pages still count as alternates here.\n\t\tconst alternatesByGroup = new Map<string, Entry[]>();\n\t\tconst all = [...col.entries, ...col.translations].toSorted((a, b) =>\n\t\t\ta.id < b.id ? -1 : a.id > b.id ? 1 : 0,\n\t\t);\n\t\tfor (const entry of all) {\n\t\t\tif (!i18nEnabled || !entry.translationGroup) continue;\n\t\t\tconst list = alternatesByGroup.get(entry.translationGroup);\n\t\t\tif (list) list.push(entry);\n\t\t\telse alternatesByGroup.set(entry.translationGroup, [entry]);\n\t\t}\n\n\t\t// Resolve every URL up-front so we can reference sibling URLs\n\t\t// while emitting hreflang alternates without re-resolving.\n\t\t// `localizePath` returns `null` when the row's locale isn't in\n\t\t// the configured `i18n.locales` list -- the site can't serve a\n\t\t// route for it, so the entry is dropped from the sitemap and\n\t\t// omitted from sibling alternates.\n\t\tconst urlByEntry = new Map<string, string | null>();\n\t\tconst resolveEntryUrl = async (entry: Entry): Promise<string | null> => {\n\t\t\tif (urlByEntry.has(entry.id)) return urlByEntry.get(entry.id) ?? null;\n\t\t\tconst absolutePath = await resolveLocalizedContentRoutePath({\n\t\t\t\tpattern: col.urlPattern,\n\t\t\t\tcollection: col.collection,\n\t\t\t\tslug: entry.slug || entry.id,\n\t\t\t\tid: entry.id,\n\t\t\t\t// Published date keeps date-token permalinks stable across edits;\n\t\t\t\t// no updatedAt fallback — tokens stay literal without a publish\n\t\t\t\t// date, consistent with the resolver's documented behavior.\n\t\t\t\tdate: entry.publishedAt,\n\t\t\t\tlocale: entry.locale,\n\t\t\t\ttrailingSlash: virtualConfig?.trailingSlash,\n\t\t\t});\n\t\t\tconst absolute = absolutePath === null ? null : `${siteUrl}${absolutePath}`;\n\t\t\turlByEntry.set(entry.id, absolute);\n\t\t\treturn absolute;\n\t\t};\n\n\t\tconst useXhtml = i18nEnabled;\n\t\tconst lines: string[] = ['<?xml version=\"1.0\" encoding=\"UTF-8\"?>'];\n\t\tlines.push(\n\t\t\tuseXhtml\n\t\t\t\t? '<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns:xhtml=\"http://www.w3.org/1999/xhtml\" xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\">'\n\t\t\t\t: '<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\">',\n\t\t);\n\n\t\tconst writeUrl = async (entry: Entry, siblings: Entry[] | null) => {\n\t\t\tconst loc = await resolveEntryUrl(entry);\n\t\t\t// Skip rows whose locale isn't in the configured `i18n.locales`\n\t\t\t// list. Linking to a route the site can't serve is worse than\n\t\t\t// no link at all (search engines hit a 404 and downrank).\n\t\t\tif (loc === null) return;\n\n\t\t\tlines.push(\" <url>\");\n\t\t\tlines.push(` <loc>${escapeXml(loc)}</loc>`);\n\t\t\tlines.push(` <lastmod>${escapeXml(entry.updatedAt)}</lastmod>`);\n\n\t\t\t// Google image sitemap extension: advertise the entry's SEO\n\t\t\t// image (the same \"preferred image\" used for og:image) so it\n\t\t\t// can be discovered and indexed for Google Images.\n\t\t\tif (entry.image) {\n\t\t\t\tconst imageLoc = buildSeoImageUrl(entry.image, siteUrl);\n\t\t\t\tlines.push(\" <image:image>\");\n\t\t\t\tlines.push(` <image:loc>${escapeXml(imageLoc)}</image:loc>`);\n\t\t\t\tlines.push(\" </image:image>\");\n\t\t\t}\n\n\t\t\tconst alternateEntries = siblings ?? (useXhtml ? [entry] : null);\n\t\t\tif (useXhtml && alternateEntries) {\n\t\t\t\t// Emit one xhtml:link per sibling (including self -- Google\n\t\t\t\t// recommends including the page's own hreflang annotation).\n\t\t\t\t// Siblings with unroutable locales are skipped here too.\n\t\t\t\tfor (const sib of alternateEntries) {\n\t\t\t\t\tconst sibLoc = await resolveEntryUrl(sib);\n\t\t\t\t\tif (sibLoc === null) continue;\n\t\t\t\t\tlines.push(\n\t\t\t\t\t\t` <xhtml:link rel=\"alternate\" hreflang=\"${escapeXml(sib.locale)}\" href=\"${escapeXml(sibLoc)}\" />`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// x-default: prefer the default-locale sibling, otherwise\n\t\t\t\t// the first sibling with a routable URL (siblings are sorted by ID).\n\t\t\t\tconst defaultSibling =\n\t\t\t\t\ti18nConfig && alternateEntries.find((s) => s.locale === i18nConfig.defaultLocale);\n\t\t\t\tlet xDefaultLoc: string | null = null;\n\t\t\t\tif (defaultSibling) {\n\t\t\t\t\txDefaultLoc = await resolveEntryUrl(defaultSibling);\n\t\t\t\t}\n\t\t\t\tif (xDefaultLoc === null) {\n\t\t\t\t\tfor (const sib of alternateEntries) {\n\t\t\t\t\t\tconst sibLoc = await resolveEntryUrl(sib);\n\t\t\t\t\t\tif (sibLoc !== null) {\n\t\t\t\t\t\t\txDefaultLoc = sibLoc;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (xDefaultLoc !== null) {\n\t\t\t\t\tlines.push(\n\t\t\t\t\t\t` <xhtml:link rel=\"alternate\" hreflang=\"x-default\" href=\"${escapeXml(xDefaultLoc)}\" />`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlines.push(\" </url>\");\n\t\t};\n\n\t\tfor (const [group, siblings] of groups) {\n\t\t\tconst alternates = alternatesByGroup.get(group) ?? siblings;\n\t\t\tfor (const entry of siblings) {\n\t\t\t\tawait writeUrl(entry, alternates);\n\t\t\t}\n\t\t}\n\t\tfor (const entry of ungrouped) {\n\t\t\tawait writeUrl(entry, null);\n\t\t}\n\n\t\tlines.push(\"</urlset>\");\n\n\t\treturn new Response(lines.join(\"\\n\"), {\n\t\t\tstatus: 200,\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/xml; charset=utf-8\",\n\t\t\t\t\"Cache-Control\": \"public, max-age=3600\",\n\t\t\t},\n\t\t});\n\t} catch {\n\t\treturn new Response(\"<!-- Internal error generating sitemap -->\", {\n\t\t\tstatus: 500,\n\t\t\theaders: { \"Content-Type\": \"application/xml\" },\n\t\t});\n\t}\n};\n\n/** Escape special XML characters in a string */\nfunction escapeXml(str: string): string {\n\treturn str\n\t\t.replace(AMP_RE, \"&amp;\")\n\t\t.replace(LT_RE, \"&lt;\")\n\t\t.replace(GT_RE, \"&gt;\")\n\t\t.replace(QUOT_RE, \"&quot;\")\n\t\t.replace(APOS_RE, \"&apos;\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,MAAa,YAAY;AAEzB,MAAM,oBAAoB;AAC1B,MAAM,SAAS;AACf,MAAM,QAAQ;AACd,MAAM,QAAQ;AACd,MAAM,UAAU;AAChB,MAAM,UAAU;AAEhB,MAAa,MAAgB,OAAO,EAAE,QAAQ,QAAQ,UAAU;CAC/D,MAAM,EAAE,WAAW;CAInB,MAAM,SAAS,OAAO,aAAa,2BAA2B,OAAO,WAAW,GAAG;AACnF,KAAI,CAAC,OACJ,QAAO,IAAI,SAAS,8BAA8B;EACjD,QAAQ;EACR,SAAS,EAAE,gBAAgB,mBAAmB;EAC9C,CAAC;CAEH,MAAM,EAAE,YAAY,gBAAgB,SAAS;AAE7C,KAAI,CAAC,QAAQ,GACZ,QAAO,IAAI,SAAS,kCAAkC;EACrD,QAAQ;EACR,SAAS,EAAE,gBAAgB,mBAAmB;EAC9C,CAAC;AAGH,KAAI;EAEH,MAAM,YADW,MAAM,sBAAsB,OAAO,GAAG,EAC7B,OAAO,gBAAgB,KAAK,QAAQ,OAAO,EAAE,QACtE,mBACA,GACA;EAED,MAAM,SAAS,MAAM,kBAAkB,OAAO,IAAI,gBAAgB,EAAE,MAAM,CAAC;AAE3E,MAAI,CAAC,OAAO,WAAW,CAAC,OAAO,KAC9B,QAAO,IAAI,SAAS,uCAAuC;GAC1D,QAAQ;GACR,SAAS,EAAE,gBAAgB,mBAAmB;GAC9C,CAAC;EAGH,MAAM,MAAM,OAAO,KAAK,YAAY;AACpC,MAAI,CAAC,IACJ,QAAO,IAAI,SAAS,0CAA0C;GAC7D,QAAQ;GACR,SAAS,EAAE,gBAAgB,mBAAmB;GAC9C,CAAC;EAGH,MAAM,cAAc,eAAe;EACnC,MAAM,aAAa,eAAe;EAMlC,MAAM,yBAAS,IAAI,KAAsB;EACzC,MAAM,YAAqB,EAAE;AAC7B,OAAK,MAAM,SAAS,IAAI,QACvB,KAAI,eAAe,MAAM,kBAAkB;GAC1C,MAAM,OAAO,OAAO,IAAI,MAAM,iBAAiB;AAC/C,OAAI,KAAM,MAAK,KAAK,MAAM;OACrB,QAAO,IAAI,MAAM,kBAAkB,CAAC,MAAM,CAAC;QAEhD,WAAU,KAAK,MAAM;EAIvB,MAAM,oCAAoB,IAAI,KAAsB;EACpD,MAAM,MAAM,CAAC,GAAG,IAAI,SAAS,GAAG,IAAI,aAAa,CAAC,UAAU,GAAG,MAC9D,EAAE,KAAK,EAAE,KAAK,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,EACrC;AACD,OAAK,MAAM,SAAS,KAAK;AACxB,OAAI,CAAC,eAAe,CAAC,MAAM,iBAAkB;GAC7C,MAAM,OAAO,kBAAkB,IAAI,MAAM,iBAAiB;AAC1D,OAAI,KAAM,MAAK,KAAK,MAAM;OACrB,mBAAkB,IAAI,MAAM,kBAAkB,CAAC,MAAM,CAAC;;EAS5D,MAAM,6BAAa,IAAI,KAA4B;EACnD,MAAM,kBAAkB,OAAO,UAAyC;AACvE,OAAI,WAAW,IAAI,MAAM,GAAG,CAAE,QAAO,WAAW,IAAI,MAAM,GAAG,IAAI;GACjE,MAAM,eAAe,MAAM,iCAAiC;IAC3D,SAAS,IAAI;IACb,YAAY,IAAI;IAChB,MAAM,MAAM,QAAQ,MAAM;IAC1B,IAAI,MAAM;IAIV,MAAM,MAAM;IACZ,QAAQ,MAAM;IACd,eAAe,eAAe;IAC9B,CAAC;GACF,MAAM,WAAW,iBAAiB,OAAO,OAAO,GAAG,UAAU;AAC7D,cAAW,IAAI,MAAM,IAAI,SAAS;AAClC,UAAO;;EAGR,MAAM,WAAW;EACjB,MAAM,QAAkB,CAAC,6CAAyC;AAClE,QAAM,KACL,WACG,gLACA,iIACH;EAED,MAAM,WAAW,OAAO,OAAc,aAA6B;GAClE,MAAM,MAAM,MAAM,gBAAgB,MAAM;AAIxC,OAAI,QAAQ,KAAM;AAElB,SAAM,KAAK,UAAU;AACrB,SAAM,KAAK,YAAY,UAAU,IAAI,CAAC,QAAQ;AAC9C,SAAM,KAAK,gBAAgB,UAAU,MAAM,UAAU,CAAC,YAAY;AAKlE,OAAI,MAAM,OAAO;IAChB,MAAM,WAAW,iBAAiB,MAAM,OAAO,QAAQ;AACvD,UAAM,KAAK,oBAAoB;AAC/B,UAAM,KAAK,oBAAoB,UAAU,SAAS,CAAC,cAAc;AACjE,UAAM,KAAK,qBAAqB;;GAGjC,MAAM,mBAAmB,aAAa,WAAW,CAAC,MAAM,GAAG;AAC3D,OAAI,YAAY,kBAAkB;AAIjC,SAAK,MAAM,OAAO,kBAAkB;KACnC,MAAM,SAAS,MAAM,gBAAgB,IAAI;AACzC,SAAI,WAAW,KAAM;AACrB,WAAM,KACL,6CAA6C,UAAU,IAAI,OAAO,CAAC,UAAU,UAAU,OAAO,CAAC,MAC/F;;IAKF,MAAM,iBACL,cAAc,iBAAiB,MAAM,MAAM,EAAE,WAAW,WAAW,cAAc;IAClF,IAAI,cAA6B;AACjC,QAAI,eACH,eAAc,MAAM,gBAAgB,eAAe;AAEpD,QAAI,gBAAgB,KACnB,MAAK,MAAM,OAAO,kBAAkB;KACnC,MAAM,SAAS,MAAM,gBAAgB,IAAI;AACzC,SAAI,WAAW,MAAM;AACpB,oBAAc;AACd;;;AAIH,QAAI,gBAAgB,KACnB,OAAM,KACL,8DAA8D,UAAU,YAAY,CAAC,MACrF;;AAIH,SAAM,KAAK,WAAW;;AAGvB,OAAK,MAAM,CAAC,OAAO,aAAa,QAAQ;GACvC,MAAM,aAAa,kBAAkB,IAAI,MAAM,IAAI;AACnD,QAAK,MAAM,SAAS,SACnB,OAAM,SAAS,OAAO,WAAW;;AAGnC,OAAK,MAAM,SAAS,UACnB,OAAM,SAAS,OAAO,KAAK;AAG5B,QAAM,KAAK,YAAY;AAEvB,SAAO,IAAI,SAAS,MAAM,KAAK,KAAK,EAAE;GACrC,QAAQ;GACR,SAAS;IACR,gBAAgB;IAChB,iBAAiB;IACjB;GACD,CAAC;SACK;AACP,SAAO,IAAI,SAAS,8CAA8C;GACjE,QAAQ;GACR,SAAS,EAAE,gBAAgB,mBAAmB;GAC9C,CAAC;;;;AAKJ,SAAS,UAAU,KAAqB;AACvC,QAAO,IACL,QAAQ,QAAQ,QAAQ,CACxB,QAAQ,OAAO,OAAO,CACtB,QAAQ,OAAO,OAAO,CACtB,QAAQ,SAAS,SAAS,CAC1B,QAAQ,SAAS,SAAS"}
1
+ {"version":3,"file":"sitemap-_collection_.xml.mjs","names":[],"sources":["../../../src/astro/routes/sitemap-[collection].xml.ts"],"sourcesContent":["/**\n * Per-collection sitemap endpoint\n *\n * GET /sitemap-{collection}.xml - First page of a single collection's sitemap.\n * GET /sitemap-{collection}-{n}.xml - Page n (2 and up) of that sitemap.\n *\n * Uses the collection's url_pattern to build URLs. Falls back to\n * /{collection}/{slug} when no pattern is configured.\n *\n * i18n behaviour: when Astro i18n is enabled, the locale prefix is\n * applied via Astro's own `getRelativeLocaleUrl` (which honours\n * `prefixDefaultLocale`, custom `path` mappings, and other `routing`\n * config). Each translation row is emitted as its own `<url>` with\n * `<xhtml:link rel=\"alternate\" hreflang=\"...\">` entries pointing to\n * its siblings (grouped by `translation_group`). The default-locale\n * variant is also linked as `hreflang=\"x-default\"`.\n */\n\nimport type { APIRoute } from \"astro\";\n// @ts-ignore - virtual module\nimport virtualConfig from \"virtual:emdash/config\";\n\nimport { handleSitemapData } from \"#api/handlers/seo.js\";\nimport { getPublicOrigin } from \"#api/public-url.js\";\nimport { getSiteSettingsWithDb } from \"#settings/index.js\";\n\nimport { getI18nConfig, isI18nEnabled } from \"../../i18n/config.js\";\nimport { resolveLocalizedContentRoutePath } from \"../../i18n/resolve.js\";\nimport { buildSeoImageUrl } from \"../../seo/media-url.js\";\nimport { parseCollectionSitemapName } from \"../../seo/sitemap-name.js\";\n\nexport const prerender = false;\n\nconst TRAILING_SLASH_RE = /\\/$/;\nconst AMP_RE = /&/g;\nconst LT_RE = /</g;\nconst GT_RE = />/g;\nconst QUOT_RE = /\"/g;\nconst APOS_RE = /'/g;\n\nexport const GET: APIRoute = async ({ params, locals, url }) => {\n\tconst { emdash } = locals;\n\n\t// The middleware skips runtime setup for names no collection can have, so\n\t// this check must run before the configuration check below.\n\tconst parsed = params.collection ? parseCollectionSitemapName(params.collection) : null;\n\tif (!parsed) {\n\t\treturn new Response(\"<!-- Sitemap not found -->\", {\n\t\t\tstatus: 404,\n\t\t\theaders: { \"Content-Type\": \"application/xml\" },\n\t\t});\n\t}\n\tconst { collection: collectionSlug, page } = parsed;\n\n\tif (!emdash?.db) {\n\t\treturn new Response(\"<!-- EmDash not configured -->\", {\n\t\t\tstatus: 500,\n\t\t\theaders: { \"Content-Type\": \"application/xml\" },\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\n\t\tconst result = await handleSitemapData(emdash.db, collectionSlug, { page });\n\n\t\tif (!result.success || !result.data) {\n\t\t\treturn new Response(\"<!-- Failed to generate sitemap -->\", {\n\t\t\t\tstatus: 500,\n\t\t\t\theaders: { \"Content-Type\": \"application/xml\" },\n\t\t\t});\n\t\t}\n\n\t\tconst col = result.data.collections[0];\n\t\tif (!col) {\n\t\t\treturn new Response(\"<!-- Collection not found or empty -->\", {\n\t\t\t\tstatus: 404,\n\t\t\t\theaders: { \"Content-Type\": \"application/xml\" },\n\t\t\t});\n\t\t}\n\n\t\tconst i18nEnabled = isI18nEnabled();\n\t\tconst i18nConfig = getI18nConfig();\n\n\t\t// Group entries by `translation_group` so each <url> can advertise\n\t\t// its sibling translations via xhtml:link. Rows without a group\n\t\t// (legacy/single-locale data) are emitted individually.\n\t\ttype Entry = (typeof col.entries)[number];\n\t\tconst groups = new Map<string, Entry[]>();\n\t\tconst ungrouped: Entry[] = [];\n\t\tfor (const entry of col.entries) {\n\t\t\tif (i18nEnabled && entry.translationGroup) {\n\t\t\t\tconst list = groups.get(entry.translationGroup);\n\t\t\t\tif (list) list.push(entry);\n\t\t\t\telse groups.set(entry.translationGroup, [entry]);\n\t\t\t} else {\n\t\t\t\tungrouped.push(entry);\n\t\t\t}\n\t\t}\n\t\t// Translations listed on other pages still count as alternates here.\n\t\tconst alternatesByGroup = new Map<string, Entry[]>();\n\t\tconst all = [...col.entries, ...col.translations].toSorted((a, b) =>\n\t\t\ta.id < b.id ? -1 : a.id > b.id ? 1 : 0,\n\t\t);\n\t\tfor (const entry of all) {\n\t\t\tif (!i18nEnabled || !entry.translationGroup) continue;\n\t\t\tconst list = alternatesByGroup.get(entry.translationGroup);\n\t\t\tif (list) list.push(entry);\n\t\t\telse alternatesByGroup.set(entry.translationGroup, [entry]);\n\t\t}\n\n\t\t// Resolve every URL up-front so we can reference sibling URLs\n\t\t// while emitting hreflang alternates without re-resolving.\n\t\t// `localizePath` returns `null` when the row's locale isn't in\n\t\t// the configured `i18n.locales` list -- the site can't serve a\n\t\t// route for it, so the entry is dropped from the sitemap and\n\t\t// omitted from sibling alternates.\n\t\tconst urlByEntry = new Map<string, string | null>();\n\t\tconst resolveEntryUrl = async (entry: Entry): Promise<string | null> => {\n\t\t\tif (urlByEntry.has(entry.id)) return urlByEntry.get(entry.id) ?? null;\n\t\t\tconst absolutePath = await resolveLocalizedContentRoutePath({\n\t\t\t\tpattern: col.urlPattern,\n\t\t\t\tcollection: col.collection,\n\t\t\t\tslug: entry.slug || entry.id,\n\t\t\t\tid: entry.id,\n\t\t\t\t// Published date keeps date-token permalinks stable across edits;\n\t\t\t\t// no updatedAt fallback — tokens stay literal without a publish\n\t\t\t\t// date, consistent with the resolver's documented behavior.\n\t\t\t\tdate: entry.publishedAt,\n\t\t\t\tlocale: entry.locale,\n\t\t\t\ttrailingSlash: virtualConfig?.trailingSlash,\n\t\t\t});\n\t\t\tconst absolute = absolutePath === null ? null : `${siteUrl}${absolutePath}`;\n\t\t\turlByEntry.set(entry.id, absolute);\n\t\t\treturn absolute;\n\t\t};\n\n\t\tconst useXhtml = i18nEnabled;\n\t\tconst lines: string[] = ['<?xml version=\"1.0\" encoding=\"UTF-8\"?>'];\n\t\tlines.push(\n\t\t\tuseXhtml\n\t\t\t\t? '<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns:xhtml=\"http://www.w3.org/1999/xhtml\" xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\">'\n\t\t\t\t: '<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\">',\n\t\t);\n\n\t\tconst writeUrl = async (entry: Entry, siblings: Entry[] | null) => {\n\t\t\tconst loc = await resolveEntryUrl(entry);\n\t\t\t// Skip rows whose locale isn't in the configured `i18n.locales`\n\t\t\t// list. Linking to a route the site can't serve is worse than\n\t\t\t// no link at all (search engines hit a 404 and downrank).\n\t\t\tif (loc === null) return;\n\n\t\t\tlines.push(\" <url>\");\n\t\t\tlines.push(` <loc>${escapeXml(loc)}</loc>`);\n\t\t\tlines.push(` <lastmod>${escapeXml(entry.updatedAt)}</lastmod>`);\n\n\t\t\t// Google image sitemap extension: advertise the entry's SEO\n\t\t\t// image (the same \"preferred image\" used for og:image) so it\n\t\t\t// can be discovered and indexed for Google Images.\n\t\t\tif (entry.image) {\n\t\t\t\tconst imageLoc = buildSeoImageUrl(entry.image, siteUrl);\n\t\t\t\tlines.push(\" <image:image>\");\n\t\t\t\tlines.push(` <image:loc>${escapeXml(imageLoc)}</image:loc>`);\n\t\t\t\tlines.push(\" </image:image>\");\n\t\t\t}\n\n\t\t\tconst alternateEntries = siblings ?? (useXhtml ? [entry] : null);\n\t\t\tif (useXhtml && alternateEntries) {\n\t\t\t\t// Emit one xhtml:link per sibling (including self -- Google\n\t\t\t\t// recommends including the page's own hreflang annotation).\n\t\t\t\t// Siblings with unroutable locales are skipped here too.\n\t\t\t\tfor (const sib of alternateEntries) {\n\t\t\t\t\tconst sibLoc = await resolveEntryUrl(sib);\n\t\t\t\t\tif (sibLoc === null) continue;\n\t\t\t\t\tlines.push(\n\t\t\t\t\t\t` <xhtml:link rel=\"alternate\" hreflang=\"${escapeXml(sib.locale)}\" href=\"${escapeXml(sibLoc)}\" />`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// x-default: prefer the default-locale sibling, otherwise\n\t\t\t\t// the first sibling with a routable URL (siblings are sorted by ID).\n\t\t\t\tconst defaultSibling =\n\t\t\t\t\ti18nConfig && alternateEntries.find((s) => s.locale === i18nConfig.defaultLocale);\n\t\t\t\tlet xDefaultLoc: string | null = null;\n\t\t\t\tif (defaultSibling) {\n\t\t\t\t\txDefaultLoc = await resolveEntryUrl(defaultSibling);\n\t\t\t\t}\n\t\t\t\tif (xDefaultLoc === null) {\n\t\t\t\t\tfor (const sib of alternateEntries) {\n\t\t\t\t\t\tconst sibLoc = await resolveEntryUrl(sib);\n\t\t\t\t\t\tif (sibLoc !== null) {\n\t\t\t\t\t\t\txDefaultLoc = sibLoc;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (xDefaultLoc !== null) {\n\t\t\t\t\tlines.push(\n\t\t\t\t\t\t` <xhtml:link rel=\"alternate\" hreflang=\"x-default\" href=\"${escapeXml(xDefaultLoc)}\" />`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlines.push(\" </url>\");\n\t\t};\n\n\t\tfor (const [group, siblings] of groups) {\n\t\t\tconst alternates = alternatesByGroup.get(group) ?? siblings;\n\t\t\tfor (const entry of siblings) {\n\t\t\t\tawait writeUrl(entry, alternates);\n\t\t\t}\n\t\t}\n\t\tfor (const entry of ungrouped) {\n\t\t\tawait writeUrl(entry, null);\n\t\t}\n\n\t\tlines.push(\"</urlset>\");\n\n\t\treturn new Response(lines.join(\"\\n\"), {\n\t\t\tstatus: 200,\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/xml; charset=utf-8\",\n\t\t\t\t\"Cache-Control\": \"public, max-age=3600\",\n\t\t\t},\n\t\t});\n\t} catch {\n\t\treturn new Response(\"<!-- Internal error generating sitemap -->\", {\n\t\t\tstatus: 500,\n\t\t\theaders: { \"Content-Type\": \"application/xml\" },\n\t\t});\n\t}\n};\n\n/** Escape special XML characters in a string */\nfunction escapeXml(str: string): string {\n\treturn str\n\t\t.replace(AMP_RE, \"&amp;\")\n\t\t.replace(LT_RE, \"&lt;\")\n\t\t.replace(GT_RE, \"&gt;\")\n\t\t.replace(QUOT_RE, \"&quot;\")\n\t\t.replace(APOS_RE, \"&apos;\");\n}\n"],"mappings":"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"}
@@ -1,21 +1,23 @@
1
- import "../../dialect-helpers-7_IqPdh9.mjs";
2
- import "../../config-CvmjJcVw.mjs";
3
- import "../../after-PcEvMY_6.mjs";
1
+ import "../../dialect-helpers-B1XN2HGB.mjs";
2
+ import "../../config-Cs_AwWXI.mjs";
3
+ import "../../after-32yNRvd2.mjs";
4
4
  import "../../options-DhrI7eMv.mjs";
5
- import "../../secrets-Cc_O3Kp-.mjs";
5
+ import "../../secrets-Dswzrz3k.mjs";
6
6
  import "../../base64-BQBZwXCx.mjs";
7
- import "../../object-cache-Bo6DGaC9.mjs";
8
- import "../../request-cache-C4CIo5ad.mjs";
9
- import "../../types-D2NEXtgB.mjs";
10
- import "../../media-Bws9f18T.mjs";
11
- import "../../loader-CswroUbe.mjs";
12
- import "../../json-recordset-BUjxhr77.mjs";
7
+ import "../../query-BFHjCzSh.mjs";
8
+ import "../../object-cache-DmKr09La.mjs";
9
+ import "../../request-cache-5z2WzWmh.mjs";
10
+ import "../../types-DwhEvIVb.mjs";
11
+ import "../../media-DepNLhPq.mjs";
12
+ import "../../version-DqB7LIO7.mjs";
13
+ import "../../loader-DhnedqY4.mjs";
14
+ import "../../json-recordset-D0WhN2UA.mjs";
13
15
  import "../../errors-B4f4It-2.mjs";
14
- import "../../errors-BOYNdIo3.mjs";
16
+ import "../../errors-8gJqv-XV.mjs";
15
17
  import { n as handleSitemapIndexData } from "../../seo-ClB-dw9w.mjs";
16
- import { s as getSiteSettingsWithDb } from "../../settings-CWb84sDm.mjs";
17
- import "../../error-CVWeIOku.mjs";
18
- import "../../fence-C3MUitUN.mjs";
18
+ import { s as getSiteSettingsWithDb } from "../../settings-D932YP2-.mjs";
19
+ import "../../error-BCMgPxdn.mjs";
20
+ import "../../fence-Dagicj14.mjs";
19
21
  import { i as getPublicOrigin } from "../../public-url-Bt98vysr.mjs";
20
22
 
21
23
  //#region src/astro/routes/sitemap.xml.ts
@@ -1 +1 @@
1
- {"version":3,"file":"sitemap.xml.mjs","names":[],"sources":["../../../src/astro/routes/sitemap.xml.ts"],"sourcesContent":["/**\n * Sitemap index endpoint\n *\n * GET /sitemap.xml - Sitemap index listing the child sitemaps.\n *\n * Each collection with published, indexable content gets a child sitemap\n * at /sitemap-{collection}.xml, continued at /sitemap-{collection}-{n}.xml\n * once it exceeds one page. The index includes a <lastmod> per child\n * derived from the most recently updated entry on that page.\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { handleSitemapIndexData } from \"#api/handlers/seo.js\";\nimport { getPublicOrigin } from \"#api/public-url.js\";\nimport { getSiteSettingsWithDb } from \"#settings/index.js\";\n\nexport const prerender = false;\n\nconst TRAILING_SLASH_RE = /\\/$/;\nconst AMP_RE = /&/g;\nconst LT_RE = /</g;\nconst GT_RE = />/g;\nconst QUOT_RE = /\"/g;\nconst APOS_RE = /'/g;\n\nexport const GET: APIRoute = async ({ locals, url }) => {\n\tconst { emdash } = locals;\n\n\tif (!emdash?.db) {\n\t\treturn new Response(\"<!-- EmDash not configured -->\", {\n\t\t\tstatus: 500,\n\t\t\theaders: { \"Content-Type\": \"application/xml\" },\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\n\t\tconst result = await handleSitemapIndexData(emdash.db);\n\n\t\tif (!result.success || !result.data) {\n\t\t\treturn new Response(\"<!-- Failed to generate sitemap -->\", {\n\t\t\t\tstatus: 500,\n\t\t\t\theaders: { \"Content-Type\": \"application/xml\" },\n\t\t\t});\n\t\t}\n\n\t\tconst { sitemaps } = result.data;\n\n\t\tconst lines: string[] = [\n\t\t\t'<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n\t\t\t'<sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">',\n\t\t];\n\n\t\tfor (const sitemap of sitemaps) {\n\t\t\tconst suffix = sitemap.page === 1 ? \"\" : `-${sitemap.page}`;\n\t\t\tconst loc = `${siteUrl}/sitemap-${encodeURIComponent(sitemap.collection)}${suffix}.xml`;\n\t\t\tlines.push(\" <sitemap>\");\n\t\t\tlines.push(` <loc>${escapeXml(loc)}</loc>`);\n\t\t\tlines.push(` <lastmod>${escapeXml(sitemap.lastmod)}</lastmod>`);\n\t\t\tlines.push(\" </sitemap>\");\n\t\t}\n\n\t\tlines.push(\"</sitemapindex>\");\n\n\t\treturn new Response(lines.join(\"\\n\"), {\n\t\t\tstatus: 200,\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/xml; charset=utf-8\",\n\t\t\t\t\"Cache-Control\": \"public, max-age=3600\",\n\t\t\t},\n\t\t});\n\t} catch {\n\t\treturn new Response(\"<!-- Internal error generating sitemap -->\", {\n\t\t\tstatus: 500,\n\t\t\theaders: { \"Content-Type\": \"application/xml\" },\n\t\t});\n\t}\n};\n\n/** Escape special XML characters in a string */\nfunction escapeXml(str: string): string {\n\treturn str\n\t\t.replace(AMP_RE, \"&amp;\")\n\t\t.replace(LT_RE, \"&lt;\")\n\t\t.replace(GT_RE, \"&gt;\")\n\t\t.replace(QUOT_RE, \"&quot;\")\n\t\t.replace(APOS_RE, \"&apos;\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAiBA,MAAa,YAAY;AAEzB,MAAM,oBAAoB;AAC1B,MAAM,SAAS;AACf,MAAM,QAAQ;AACd,MAAM,QAAQ;AACd,MAAM,UAAU;AAChB,MAAM,UAAU;AAEhB,MAAa,MAAgB,OAAO,EAAE,QAAQ,UAAU;CACvD,MAAM,EAAE,WAAW;AAEnB,KAAI,CAAC,QAAQ,GACZ,QAAO,IAAI,SAAS,kCAAkC;EACrD,QAAQ;EACR,SAAS,EAAE,gBAAgB,mBAAmB;EAC9C,CAAC;AAGH,KAAI;EAEH,MAAM,YADW,MAAM,sBAAsB,OAAO,GAAG,EAC7B,OAAO,gBAAgB,KAAK,QAAQ,OAAO,EAAE,QACtE,mBACA,GACA;EAED,MAAM,SAAS,MAAM,uBAAuB,OAAO,GAAG;AAEtD,MAAI,CAAC,OAAO,WAAW,CAAC,OAAO,KAC9B,QAAO,IAAI,SAAS,uCAAuC;GAC1D,QAAQ;GACR,SAAS,EAAE,gBAAgB,mBAAmB;GAC9C,CAAC;EAGH,MAAM,EAAE,aAAa,OAAO;EAE5B,MAAM,QAAkB,CACvB,8CACA,uEACA;AAED,OAAK,MAAM,WAAW,UAAU;GAC/B,MAAM,SAAS,QAAQ,SAAS,IAAI,KAAK,IAAI,QAAQ;GACrD,MAAM,MAAM,GAAG,QAAQ,WAAW,mBAAmB,QAAQ,WAAW,GAAG,OAAO;AAClF,SAAM,KAAK,cAAc;AACzB,SAAM,KAAK,YAAY,UAAU,IAAI,CAAC,QAAQ;AAC9C,SAAM,KAAK,gBAAgB,UAAU,QAAQ,QAAQ,CAAC,YAAY;AAClE,SAAM,KAAK,eAAe;;AAG3B,QAAM,KAAK,kBAAkB;AAE7B,SAAO,IAAI,SAAS,MAAM,KAAK,KAAK,EAAE;GACrC,QAAQ;GACR,SAAS;IACR,gBAAgB;IAChB,iBAAiB;IACjB;GACD,CAAC;SACK;AACP,SAAO,IAAI,SAAS,8CAA8C;GACjE,QAAQ;GACR,SAAS,EAAE,gBAAgB,mBAAmB;GAC9C,CAAC;;;;AAKJ,SAAS,UAAU,KAAqB;AACvC,QAAO,IACL,QAAQ,QAAQ,QAAQ,CACxB,QAAQ,OAAO,OAAO,CACtB,QAAQ,OAAO,OAAO,CACtB,QAAQ,SAAS,SAAS,CAC1B,QAAQ,SAAS,SAAS"}
1
+ {"version":3,"file":"sitemap.xml.mjs","names":[],"sources":["../../../src/astro/routes/sitemap.xml.ts"],"sourcesContent":["/**\n * Sitemap index endpoint\n *\n * GET /sitemap.xml - Sitemap index listing the child sitemaps.\n *\n * Each collection with published, indexable content gets a child sitemap\n * at /sitemap-{collection}.xml, continued at /sitemap-{collection}-{n}.xml\n * once it exceeds one page. The index includes a <lastmod> per child\n * derived from the most recently updated entry on that page.\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { handleSitemapIndexData } from \"#api/handlers/seo.js\";\nimport { getPublicOrigin } from \"#api/public-url.js\";\nimport { getSiteSettingsWithDb } from \"#settings/index.js\";\n\nexport const prerender = false;\n\nconst TRAILING_SLASH_RE = /\\/$/;\nconst AMP_RE = /&/g;\nconst LT_RE = /</g;\nconst GT_RE = />/g;\nconst QUOT_RE = /\"/g;\nconst APOS_RE = /'/g;\n\nexport const GET: APIRoute = async ({ locals, url }) => {\n\tconst { emdash } = locals;\n\n\tif (!emdash?.db) {\n\t\treturn new Response(\"<!-- EmDash not configured -->\", {\n\t\t\tstatus: 500,\n\t\t\theaders: { \"Content-Type\": \"application/xml\" },\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\n\t\tconst result = await handleSitemapIndexData(emdash.db);\n\n\t\tif (!result.success || !result.data) {\n\t\t\treturn new Response(\"<!-- Failed to generate sitemap -->\", {\n\t\t\t\tstatus: 500,\n\t\t\t\theaders: { \"Content-Type\": \"application/xml\" },\n\t\t\t});\n\t\t}\n\n\t\tconst { sitemaps } = result.data;\n\n\t\tconst lines: string[] = [\n\t\t\t'<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n\t\t\t'<sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">',\n\t\t];\n\n\t\tfor (const sitemap of sitemaps) {\n\t\t\tconst suffix = sitemap.page === 1 ? \"\" : `-${sitemap.page}`;\n\t\t\tconst loc = `${siteUrl}/sitemap-${encodeURIComponent(sitemap.collection)}${suffix}.xml`;\n\t\t\tlines.push(\" <sitemap>\");\n\t\t\tlines.push(` <loc>${escapeXml(loc)}</loc>`);\n\t\t\tlines.push(` <lastmod>${escapeXml(sitemap.lastmod)}</lastmod>`);\n\t\t\tlines.push(\" </sitemap>\");\n\t\t}\n\n\t\tlines.push(\"</sitemapindex>\");\n\n\t\treturn new Response(lines.join(\"\\n\"), {\n\t\t\tstatus: 200,\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/xml; charset=utf-8\",\n\t\t\t\t\"Cache-Control\": \"public, max-age=3600\",\n\t\t\t},\n\t\t});\n\t} catch {\n\t\treturn new Response(\"<!-- Internal error generating sitemap -->\", {\n\t\t\tstatus: 500,\n\t\t\theaders: { \"Content-Type\": \"application/xml\" },\n\t\t});\n\t}\n};\n\n/** Escape special XML characters in a string */\nfunction escapeXml(str: string): string {\n\treturn str\n\t\t.replace(AMP_RE, \"&amp;\")\n\t\t.replace(LT_RE, \"&lt;\")\n\t\t.replace(GT_RE, \"&gt;\")\n\t\t.replace(QUOT_RE, \"&quot;\")\n\t\t.replace(APOS_RE, \"&apos;\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAiBA,MAAa,YAAY;AAEzB,MAAM,oBAAoB;AAC1B,MAAM,SAAS;AACf,MAAM,QAAQ;AACd,MAAM,QAAQ;AACd,MAAM,UAAU;AAChB,MAAM,UAAU;AAEhB,MAAa,MAAgB,OAAO,EAAE,QAAQ,UAAU;CACvD,MAAM,EAAE,WAAW;AAEnB,KAAI,CAAC,QAAQ,GACZ,QAAO,IAAI,SAAS,kCAAkC;EACrD,QAAQ;EACR,SAAS,EAAE,gBAAgB,mBAAmB;EAC9C,CAAC;AAGH,KAAI;EAEH,MAAM,YADW,MAAM,sBAAsB,OAAO,GAAG,EAC7B,OAAO,gBAAgB,KAAK,QAAQ,OAAO,EAAE,QACtE,mBACA,GACA;EAED,MAAM,SAAS,MAAM,uBAAuB,OAAO,GAAG;AAEtD,MAAI,CAAC,OAAO,WAAW,CAAC,OAAO,KAC9B,QAAO,IAAI,SAAS,uCAAuC;GAC1D,QAAQ;GACR,SAAS,EAAE,gBAAgB,mBAAmB;GAC9C,CAAC;EAGH,MAAM,EAAE,aAAa,OAAO;EAE5B,MAAM,QAAkB,CACvB,8CACA,uEACA;AAED,OAAK,MAAM,WAAW,UAAU;GAC/B,MAAM,SAAS,QAAQ,SAAS,IAAI,KAAK,IAAI,QAAQ;GACrD,MAAM,MAAM,GAAG,QAAQ,WAAW,mBAAmB,QAAQ,WAAW,GAAG,OAAO;AAClF,SAAM,KAAK,cAAc;AACzB,SAAM,KAAK,YAAY,UAAU,IAAI,CAAC,QAAQ;AAC9C,SAAM,KAAK,gBAAgB,UAAU,QAAQ,QAAQ,CAAC,YAAY;AAClE,SAAM,KAAK,eAAe;;AAG3B,QAAM,KAAK,kBAAkB;AAE7B,SAAO,IAAI,SAAS,MAAM,KAAK,KAAK,EAAE;GACrC,QAAQ;GACR,SAAS;IACR,gBAAgB;IAChB,iBAAiB;IACjB;GACD,CAAC;SACK;AACP,SAAO,IAAI,SAAS,8CAA8C;GACjE,QAAQ;GACR,SAAS,EAAE,gBAAgB,mBAAmB;GAC9C,CAAC;;;;AAKJ,SAAS,UAAU,KAAqB;AACvC,QAAO,IACL,QAAQ,QAAQ,QAAQ,CACxB,QAAQ,OAAO,OAAO,CACtB,QAAQ,OAAO,OAAO,CACtB,QAAQ,SAAS,SAAS,CAC1B,QAAQ,SAAS,SAAS"}
@@ -1,20 +1,21 @@
1
- import { r as ContentFieldFilters } from "../content-list-query-CYKcY6Vi.mjs";
2
- import { a as CollectionWithFields } from "../types-RLgeIpnF.mjs";
3
- import { i as ContentItem, o as ContentSeoInput } from "../types-CNB-dj6F.mjs";
4
- import { d as ContentResponse, u as ContentListResponse } from "../parse-CWHOFc6z.mjs";
5
- import { t as Database } from "../types-DCFavOii.mjs";
6
- import { Bt as PageMetadataContribution, Cn as ResolvedPlugin, Lt as PageFragmentContribution, fn as PublicPageContext, k as ContentActionOrigin, rn as PluginEditorPanel, t as ActorInfo, tn as PluginEditorAction } from "../types-QoPHm-2w.mjs";
7
- import "../options-DJWaq3Ie.mjs";
8
- import "../entry-lock-C7VX0NGK.mjs";
9
- import { f as MediaProvider, p as MediaProviderCapabilities } from "../placeholder-D41vk11_.mjs";
10
- import { $r as MediaResponse, Ar as RouteMeta, Mr as EmDashConfig, Or as PluginContentCacheInvalidator, Qr as MediaListResponse, Sr as ResolvedPluginEditorExtension, kr as RouteCallerInput, t as ManifestRegistryConfigurationError, wr as SandboxedPluginEntry, xr as PluginEditorExtensionDispatch } from "../config-Bsm_u_oE.mjs";
11
- import "../runner-BObHz5FC.mjs";
12
- import { $ as MediaItem, J as HookPipeline, q as EmailPipeline, x as SandboxRunner } from "../storage-query-DRyu3bSU.mjs";
13
- import "../index-BB9sVisO.mjs";
14
- import { p as Storage } from "../types-Bwpzb5o6.mjs";
15
- import "../types-DHO7Pd25.mjs";
16
- import "../hreflang-CY_F5OjF.mjs";
17
- import "../validate-emKxGC5F.mjs";
1
+ import { r as ContentFieldFilters } from "../content-list-query-ByP4jRpZ.mjs";
2
+ import { a as CollectionWithFields } from "../types-BuvSwT9Y.mjs";
3
+ import { i as ContentItem, o as ContentSeoInput } from "../types-C4KT3Md2.mjs";
4
+ import { d as ContentResponse, u as ContentListResponse } from "../parse-Dndx1QmN.mjs";
5
+ import { t as Database } from "../types-DKwRUA-x.mjs";
6
+ import { Bt as PageMetadataContribution, Cn as ResolvedPlugin, Lt as PageFragmentContribution, fn as PublicPageContext, k as ContentActionOrigin, rn as PluginEditorPanel, t as ActorInfo, tn as PluginEditorAction } from "../types-CjftrmZR.mjs";
7
+ import "../options-BUUgroHg.mjs";
8
+ import "../entry-lock-BulbgPBX.mjs";
9
+ import { f as MediaProvider, p as MediaProviderCapabilities } from "../placeholder-CSKu5OkD.mjs";
10
+ import { $r as MediaListResponse, Ar as RouteCallerInput, Cr as ResolvedPluginEditorExtension, Nr as EmDashConfig, Sr as PluginEditorExtensionDispatch, Tr as SandboxedPluginEntry, ei as MediaResponse, jr as RouteMeta, kr as PluginContentCacheInvalidator, t as ManifestRegistryConfigurationError } from "../config-sDhZvkLR.mjs";
11
+ import "../runner-Dfgp6-S_.mjs";
12
+ import { $ as MediaItem, J as HookPipeline, q as EmailPipeline, x as SandboxRunner } from "../storage-query-BFp06Y0s.mjs";
13
+ import "../utils-Szp4iBQB.mjs";
14
+ import { p as Storage } from "../types-GwAyS5SH.mjs";
15
+ import "../index-VM7Fzxwe.mjs";
16
+ import "../types-CadaL_k8.mjs";
17
+ import "../hreflang-8dUOJAPJ.mjs";
18
+ import "../validate-DDvxy6qG.mjs";
18
19
  import "../index.mjs";
19
20
  import { Kysely } from "kysely";
20
21
  import * as zod from "zod";
@@ -35,9 +36,9 @@ interface ManifestCollection {
35
36
  titleField?: string;
36
37
  dateField?: string;
37
38
  /**
38
- * Omit the auto-generated sidebar entry and dashboard quick action in the
39
- * admin. The collection is still listed in the manifest so its routes,
40
- * editor, and API keep working.
39
+ * Omit the auto-generated sidebar entry, dashboard quick action, and
40
+ * dashboard Content card row in the admin. The collection is still listed
41
+ * in the manifest so its routes, editor, and API keep working.
41
42
  */
42
43
  hidden?: boolean;
43
44
  /** Phosphor icon name for the sidebar entry (kebab-case, e.g. `calendar-blank`). */
@@ -235,6 +236,7 @@ interface EmDashManifest {
235
236
  siteName?: string;
236
237
  footerLabel?: string | false;
237
238
  favicon?: string;
239
+ hiddenNavItems?: string[];
238
240
  };
239
241
  }
240
242
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../src/astro/types.ts"],"mappings":"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"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../src/astro/types.ts"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { c as decodeCursor, l as encodeCursor } from "./types-D2NEXtgB.mjs";
1
+ import { l as decodeCursor, u as encodeCursor } from "./types-DwhEvIVb.mjs";
2
2
  import { ulid } from "ulidx";
3
3
 
4
4
  //#region src/database/repositories/audit.ts
@@ -124,4 +124,4 @@ var AuditRepository = class {
124
124
 
125
125
  //#endregion
126
126
  export { AuditRepository as t };
127
- //# sourceMappingURL=audit-_gieLVGU.mjs.map
127
+ //# sourceMappingURL=audit-B8XE-0UV.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"audit-_gieLVGU.mjs","names":[],"sources":["../src/database/repositories/audit.ts"],"sourcesContent":["import type { Kysely } from \"kysely\";\nimport { ulid } from \"ulidx\";\n\nimport type { Database, AuditLogTable } from \"../types.js\";\nimport { encodeCursor, decodeCursor, type FindManyResult } from \"./types.js\";\n\nexport type AuditAction =\n\t| \"create\"\n\t| \"update\"\n\t| \"delete\"\n\t| \"publish\"\n\t| \"unpublish\"\n\t| \"login\"\n\t| \"logout\"\n\t| \"password_change\"\n\t| \"settings_update\"\n\t| \"schema_change\"\n\t| \"plugin_tool_invoke\"\n\t| \"transfer_export_create\"\n\t| \"transfer_import_create\"\n\t| \"transfer_import_execute\"\n\t| \"transfer_import_cancel\"\n\t| \"transfer_import_abandon\"\n\t| \"transfer_import_complete\"\n\t| \"transfer_import_fail\"\n\t| \"transfer_approval_approve\"\n\t| \"transfer_approval_deny\";\n\nexport type AuditStatus = \"success\" | \"failure\" | \"denied\";\n\nexport interface AuditLog {\n\tid: string;\n\ttimestamp: string;\n\tactorId: string | null;\n\tactorIp: string | null;\n\taction: AuditAction;\n\tresourceType: string | null;\n\tresourceId: string | null;\n\tdetails: Record<string, unknown> | null;\n\tstatus: AuditStatus | null;\n}\n\nexport interface CreateAuditLogInput {\n\tactorId?: string;\n\tactorIp?: string;\n\taction: AuditAction;\n\tresourceType?: string;\n\tresourceId?: string;\n\tdetails?: Record<string, unknown>;\n\tstatus?: AuditStatus;\n}\n\nexport interface AuditLogQuery {\n\tactorId?: string;\n\taction?: AuditAction;\n\tresourceType?: string;\n\tresourceId?: string;\n\tstatus?: AuditStatus;\n\tsince?: string; // ISO date\n\tuntil?: string; // ISO date\n\tlimit?: number;\n\tcursor?: string;\n}\n\n/**\n * Audit repository for logging system events\n *\n * Tracks user actions for security, debugging, and compliance.\n * All mutations should create an audit log entry.\n */\nexport class AuditRepository {\n\tconstructor(private db: Kysely<Database>) {}\n\n\t/**\n\t * Create an audit log entry\n\t */\n\tasync log(input: CreateAuditLogInput): Promise<AuditLog> {\n\t\tconst id = ulid();\n\n\t\tconst row: Omit<AuditLogTable, \"timestamp\"> = {\n\t\t\tid,\n\t\t\tactor_id: input.actorId ?? null,\n\t\t\tactor_ip: input.actorIp ?? null,\n\t\t\taction: input.action,\n\t\t\tresource_type: input.resourceType ?? null,\n\t\t\tresource_id: input.resourceId ?? null,\n\t\t\tdetails: input.details ? JSON.stringify(input.details) : null,\n\t\t\tstatus: input.status ?? null,\n\t\t};\n\n\t\tawait this.db.insertInto(\"audit_logs\").values(row).execute();\n\n\t\tconst log = await this.findById(id);\n\t\tif (!log) {\n\t\t\tthrow new Error(\"Failed to create audit log\");\n\t\t}\n\t\treturn log;\n\t}\n\n\t/**\n\t * Find audit log by ID\n\t */\n\tasync findById(id: string): Promise<AuditLog | null> {\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"audit_logs\")\n\t\t\t.selectAll()\n\t\t\t.where(\"id\", \"=\", id)\n\t\t\t.executeTakeFirst();\n\n\t\treturn row ? this.rowToAuditLog(row) : null;\n\t}\n\n\t/**\n\t * Query audit logs with filters and cursor-based pagination\n\t */\n\tasync findMany(query: AuditLogQuery = {}): Promise<FindManyResult<AuditLog>> {\n\t\tconst limit = Math.min(Math.max(1, query.limit || 50), 100);\n\n\t\tlet q = this.db\n\t\t\t.selectFrom(\"audit_logs\")\n\t\t\t.selectAll()\n\t\t\t.orderBy(\"timestamp\", \"desc\")\n\t\t\t.orderBy(\"id\", \"desc\")\n\t\t\t.limit(limit + 1);\n\n\t\tif (query.actorId) {\n\t\t\tq = q.where(\"actor_id\", \"=\", query.actorId);\n\t\t}\n\n\t\tif (query.action) {\n\t\t\tq = q.where(\"action\", \"=\", query.action);\n\t\t}\n\n\t\tif (query.resourceType) {\n\t\t\tq = q.where(\"resource_type\", \"=\", query.resourceType);\n\t\t}\n\n\t\tif (query.resourceId) {\n\t\t\tq = q.where(\"resource_id\", \"=\", query.resourceId);\n\t\t}\n\n\t\tif (query.status) {\n\t\t\tq = q.where(\"status\", \"=\", query.status);\n\t\t}\n\n\t\tif (query.since) {\n\t\t\tq = q.where(\"timestamp\", \">=\", query.since);\n\t\t}\n\n\t\tif (query.until) {\n\t\t\tq = q.where(\"timestamp\", \"<=\", query.until);\n\t\t}\n\n\t\tif (query.cursor) {\n\t\t\tconst decoded = decodeCursor(query.cursor);\n\t\t\tq = q.where((eb) =>\n\t\t\t\teb.or([\n\t\t\t\t\teb(\"timestamp\", \"<\", decoded.orderValue),\n\t\t\t\t\teb.and([eb(\"timestamp\", \"=\", decoded.orderValue), eb(\"id\", \"<\", decoded.id)]),\n\t\t\t\t]),\n\t\t\t);\n\t\t}\n\n\t\tconst rows = await q.execute();\n\t\tconst items = rows.slice(0, limit).map((row) => this.rowToAuditLog(row));\n\t\tconst result: FindManyResult<AuditLog> = { items };\n\n\t\tif (rows.length > limit && items.length > 0) {\n\t\t\tconst last = items.at(-1)!;\n\t\t\tresult.nextCursor = encodeCursor(last.timestamp, last.id);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Get all logs for a specific resource\n\t */\n\tasync findByResource(\n\t\tresourceType: string,\n\t\tresourceId: string,\n\t\toptions: { limit?: number } = {},\n\t): Promise<AuditLog[]> {\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"audit_logs\")\n\t\t\t.selectAll()\n\t\t\t.where(\"resource_type\", \"=\", resourceType)\n\t\t\t.where(\"resource_id\", \"=\", resourceId)\n\t\t\t.orderBy(\"timestamp\", \"desc\");\n\n\t\tif (options.limit) {\n\t\t\tquery = query.limit(options.limit);\n\t\t}\n\n\t\tconst rows = await query.execute();\n\t\treturn rows.map((row) => this.rowToAuditLog(row));\n\t}\n\n\t/**\n\t * Get all logs for a specific user\n\t */\n\tasync findByActor(\n\t\tactorId: string,\n\t\toptions: { limit?: number; since?: string } = {},\n\t): Promise<AuditLog[]> {\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"audit_logs\")\n\t\t\t.selectAll()\n\t\t\t.where(\"actor_id\", \"=\", actorId)\n\t\t\t.orderBy(\"timestamp\", \"desc\");\n\n\t\tif (options.since) {\n\t\t\tquery = query.where(\"timestamp\", \">=\", options.since);\n\t\t}\n\n\t\tif (options.limit) {\n\t\t\tquery = query.limit(options.limit);\n\t\t}\n\n\t\tconst rows = await query.execute();\n\t\treturn rows.map((row) => this.rowToAuditLog(row));\n\t}\n\n\t/**\n\t * Count logs matching a query\n\t */\n\tasync count(query: Omit<AuditLogQuery, \"limit\" | \"cursor\"> = {}): Promise<number> {\n\t\tlet q = this.db.selectFrom(\"audit_logs\").select((eb) => eb.fn.count(\"id\").as(\"count\"));\n\n\t\tif (query.actorId) {\n\t\t\tq = q.where(\"actor_id\", \"=\", query.actorId);\n\t\t}\n\n\t\tif (query.action) {\n\t\t\tq = q.where(\"action\", \"=\", query.action);\n\t\t}\n\n\t\tif (query.resourceType) {\n\t\t\tq = q.where(\"resource_type\", \"=\", query.resourceType);\n\t\t}\n\n\t\tif (query.resourceId) {\n\t\t\tq = q.where(\"resource_id\", \"=\", query.resourceId);\n\t\t}\n\n\t\tif (query.status) {\n\t\t\tq = q.where(\"status\", \"=\", query.status);\n\t\t}\n\n\t\tif (query.since) {\n\t\t\tq = q.where(\"timestamp\", \">=\", query.since);\n\t\t}\n\n\t\tif (query.until) {\n\t\t\tq = q.where(\"timestamp\", \"<=\", query.until);\n\t\t}\n\n\t\tconst result = await q.executeTakeFirst();\n\t\treturn Number(result?.count || 0);\n\t}\n\n\t/**\n\t * Delete old audit logs (for retention policy)\n\t */\n\tasync deleteOlderThan(date: string): Promise<number> {\n\t\tconst result = await this.db\n\t\t\t.deleteFrom(\"audit_logs\")\n\t\t\t.where(\"timestamp\", \"<\", date)\n\t\t\t.executeTakeFirst();\n\n\t\treturn Number(result.numDeletedRows ?? 0);\n\t}\n\n\t/**\n\t * Convert database row to AuditLog object\n\t */\n\tprivate rowToAuditLog(row: {\n\t\tid: string;\n\t\ttimestamp: string;\n\t\tactor_id: string | null;\n\t\tactor_ip: string | null;\n\t\taction: string;\n\t\tresource_type: string | null;\n\t\tresource_id: string | null;\n\t\tdetails: string | null;\n\t\tstatus: string | null;\n\t}): AuditLog {\n\t\treturn {\n\t\t\tid: row.id,\n\t\t\ttimestamp: row.timestamp,\n\t\t\tactorId: row.actor_id,\n\t\t\tactorIp: row.actor_ip,\n\t\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- DB stores string; validated at insert but linter can't follow\n\t\t\taction: row.action as AuditAction,\n\t\t\tresourceType: row.resource_type,\n\t\t\tresourceId: row.resource_id,\n\t\t\tdetails: row.details ? JSON.parse(row.details) : null,\n\t\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- DB stores string; validated at insert but linter can't follow\n\t\t\tstatus: row.status as AuditStatus | null,\n\t\t};\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"audit-B8XE-0UV.mjs","names":[],"sources":["../src/database/repositories/audit.ts"],"sourcesContent":["import type { Kysely } from \"kysely\";\nimport { ulid } from \"ulidx\";\n\nimport type { Database, AuditLogTable } from \"../types.js\";\nimport { encodeCursor, decodeCursor, type FindManyResult } from \"./types.js\";\n\nexport type AuditAction =\n\t| \"create\"\n\t| \"update\"\n\t| \"delete\"\n\t| \"publish\"\n\t| \"unpublish\"\n\t| \"login\"\n\t| \"logout\"\n\t| \"password_change\"\n\t| \"settings_update\"\n\t| \"schema_change\"\n\t| \"plugin_tool_invoke\"\n\t| \"transfer_export_create\"\n\t| \"transfer_import_create\"\n\t| \"transfer_import_execute\"\n\t| \"transfer_import_cancel\"\n\t| \"transfer_import_abandon\"\n\t| \"transfer_import_complete\"\n\t| \"transfer_import_fail\"\n\t| \"transfer_approval_approve\"\n\t| \"transfer_approval_deny\";\n\nexport type AuditStatus = \"success\" | \"failure\" | \"denied\";\n\nexport interface AuditLog {\n\tid: string;\n\ttimestamp: string;\n\tactorId: string | null;\n\tactorIp: string | null;\n\taction: AuditAction;\n\tresourceType: string | null;\n\tresourceId: string | null;\n\tdetails: Record<string, unknown> | null;\n\tstatus: AuditStatus | null;\n}\n\nexport interface CreateAuditLogInput {\n\tactorId?: string;\n\tactorIp?: string;\n\taction: AuditAction;\n\tresourceType?: string;\n\tresourceId?: string;\n\tdetails?: Record<string, unknown>;\n\tstatus?: AuditStatus;\n}\n\nexport interface AuditLogQuery {\n\tactorId?: string;\n\taction?: AuditAction;\n\tresourceType?: string;\n\tresourceId?: string;\n\tstatus?: AuditStatus;\n\tsince?: string; // ISO date\n\tuntil?: string; // ISO date\n\tlimit?: number;\n\tcursor?: string;\n}\n\n/**\n * Audit repository for logging system events\n *\n * Tracks user actions for security, debugging, and compliance.\n * All mutations should create an audit log entry.\n */\nexport class AuditRepository {\n\tconstructor(private db: Kysely<Database>) {}\n\n\t/**\n\t * Create an audit log entry\n\t */\n\tasync log(input: CreateAuditLogInput): Promise<AuditLog> {\n\t\tconst id = ulid();\n\n\t\tconst row: Omit<AuditLogTable, \"timestamp\"> = {\n\t\t\tid,\n\t\t\tactor_id: input.actorId ?? null,\n\t\t\tactor_ip: input.actorIp ?? null,\n\t\t\taction: input.action,\n\t\t\tresource_type: input.resourceType ?? null,\n\t\t\tresource_id: input.resourceId ?? null,\n\t\t\tdetails: input.details ? JSON.stringify(input.details) : null,\n\t\t\tstatus: input.status ?? null,\n\t\t};\n\n\t\tawait this.db.insertInto(\"audit_logs\").values(row).execute();\n\n\t\tconst log = await this.findById(id);\n\t\tif (!log) {\n\t\t\tthrow new Error(\"Failed to create audit log\");\n\t\t}\n\t\treturn log;\n\t}\n\n\t/**\n\t * Find audit log by ID\n\t */\n\tasync findById(id: string): Promise<AuditLog | null> {\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"audit_logs\")\n\t\t\t.selectAll()\n\t\t\t.where(\"id\", \"=\", id)\n\t\t\t.executeTakeFirst();\n\n\t\treturn row ? this.rowToAuditLog(row) : null;\n\t}\n\n\t/**\n\t * Query audit logs with filters and cursor-based pagination\n\t */\n\tasync findMany(query: AuditLogQuery = {}): Promise<FindManyResult<AuditLog>> {\n\t\tconst limit = Math.min(Math.max(1, query.limit || 50), 100);\n\n\t\tlet q = this.db\n\t\t\t.selectFrom(\"audit_logs\")\n\t\t\t.selectAll()\n\t\t\t.orderBy(\"timestamp\", \"desc\")\n\t\t\t.orderBy(\"id\", \"desc\")\n\t\t\t.limit(limit + 1);\n\n\t\tif (query.actorId) {\n\t\t\tq = q.where(\"actor_id\", \"=\", query.actorId);\n\t\t}\n\n\t\tif (query.action) {\n\t\t\tq = q.where(\"action\", \"=\", query.action);\n\t\t}\n\n\t\tif (query.resourceType) {\n\t\t\tq = q.where(\"resource_type\", \"=\", query.resourceType);\n\t\t}\n\n\t\tif (query.resourceId) {\n\t\t\tq = q.where(\"resource_id\", \"=\", query.resourceId);\n\t\t}\n\n\t\tif (query.status) {\n\t\t\tq = q.where(\"status\", \"=\", query.status);\n\t\t}\n\n\t\tif (query.since) {\n\t\t\tq = q.where(\"timestamp\", \">=\", query.since);\n\t\t}\n\n\t\tif (query.until) {\n\t\t\tq = q.where(\"timestamp\", \"<=\", query.until);\n\t\t}\n\n\t\tif (query.cursor) {\n\t\t\tconst decoded = decodeCursor(query.cursor);\n\t\t\tq = q.where((eb) =>\n\t\t\t\teb.or([\n\t\t\t\t\teb(\"timestamp\", \"<\", decoded.orderValue),\n\t\t\t\t\teb.and([eb(\"timestamp\", \"=\", decoded.orderValue), eb(\"id\", \"<\", decoded.id)]),\n\t\t\t\t]),\n\t\t\t);\n\t\t}\n\n\t\tconst rows = await q.execute();\n\t\tconst items = rows.slice(0, limit).map((row) => this.rowToAuditLog(row));\n\t\tconst result: FindManyResult<AuditLog> = { items };\n\n\t\tif (rows.length > limit && items.length > 0) {\n\t\t\tconst last = items.at(-1)!;\n\t\t\tresult.nextCursor = encodeCursor(last.timestamp, last.id);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Get all logs for a specific resource\n\t */\n\tasync findByResource(\n\t\tresourceType: string,\n\t\tresourceId: string,\n\t\toptions: { limit?: number } = {},\n\t): Promise<AuditLog[]> {\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"audit_logs\")\n\t\t\t.selectAll()\n\t\t\t.where(\"resource_type\", \"=\", resourceType)\n\t\t\t.where(\"resource_id\", \"=\", resourceId)\n\t\t\t.orderBy(\"timestamp\", \"desc\");\n\n\t\tif (options.limit) {\n\t\t\tquery = query.limit(options.limit);\n\t\t}\n\n\t\tconst rows = await query.execute();\n\t\treturn rows.map((row) => this.rowToAuditLog(row));\n\t}\n\n\t/**\n\t * Get all logs for a specific user\n\t */\n\tasync findByActor(\n\t\tactorId: string,\n\t\toptions: { limit?: number; since?: string } = {},\n\t): Promise<AuditLog[]> {\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"audit_logs\")\n\t\t\t.selectAll()\n\t\t\t.where(\"actor_id\", \"=\", actorId)\n\t\t\t.orderBy(\"timestamp\", \"desc\");\n\n\t\tif (options.since) {\n\t\t\tquery = query.where(\"timestamp\", \">=\", options.since);\n\t\t}\n\n\t\tif (options.limit) {\n\t\t\tquery = query.limit(options.limit);\n\t\t}\n\n\t\tconst rows = await query.execute();\n\t\treturn rows.map((row) => this.rowToAuditLog(row));\n\t}\n\n\t/**\n\t * Count logs matching a query\n\t */\n\tasync count(query: Omit<AuditLogQuery, \"limit\" | \"cursor\"> = {}): Promise<number> {\n\t\tlet q = this.db.selectFrom(\"audit_logs\").select((eb) => eb.fn.count(\"id\").as(\"count\"));\n\n\t\tif (query.actorId) {\n\t\t\tq = q.where(\"actor_id\", \"=\", query.actorId);\n\t\t}\n\n\t\tif (query.action) {\n\t\t\tq = q.where(\"action\", \"=\", query.action);\n\t\t}\n\n\t\tif (query.resourceType) {\n\t\t\tq = q.where(\"resource_type\", \"=\", query.resourceType);\n\t\t}\n\n\t\tif (query.resourceId) {\n\t\t\tq = q.where(\"resource_id\", \"=\", query.resourceId);\n\t\t}\n\n\t\tif (query.status) {\n\t\t\tq = q.where(\"status\", \"=\", query.status);\n\t\t}\n\n\t\tif (query.since) {\n\t\t\tq = q.where(\"timestamp\", \">=\", query.since);\n\t\t}\n\n\t\tif (query.until) {\n\t\t\tq = q.where(\"timestamp\", \"<=\", query.until);\n\t\t}\n\n\t\tconst result = await q.executeTakeFirst();\n\t\treturn Number(result?.count || 0);\n\t}\n\n\t/**\n\t * Delete old audit logs (for retention policy)\n\t */\n\tasync deleteOlderThan(date: string): Promise<number> {\n\t\tconst result = await this.db\n\t\t\t.deleteFrom(\"audit_logs\")\n\t\t\t.where(\"timestamp\", \"<\", date)\n\t\t\t.executeTakeFirst();\n\n\t\treturn Number(result.numDeletedRows ?? 0);\n\t}\n\n\t/**\n\t * Convert database row to AuditLog object\n\t */\n\tprivate rowToAuditLog(row: {\n\t\tid: string;\n\t\ttimestamp: string;\n\t\tactor_id: string | null;\n\t\tactor_ip: string | null;\n\t\taction: string;\n\t\tresource_type: string | null;\n\t\tresource_id: string | null;\n\t\tdetails: string | null;\n\t\tstatus: string | null;\n\t}): AuditLog {\n\t\treturn {\n\t\t\tid: row.id,\n\t\t\ttimestamp: row.timestamp,\n\t\t\tactorId: row.actor_id,\n\t\t\tactorIp: row.actor_ip,\n\t\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- DB stores string; validated at insert but linter can't follow\n\t\t\taction: row.action as AuditAction,\n\t\t\tresourceType: row.resource_type,\n\t\t\tresourceId: row.resource_id,\n\t\t\tdetails: row.details ? JSON.parse(row.details) : null,\n\t\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- DB stores string; validated at insert but linter can't follow\n\t\t\tstatus: row.status as AuditStatus | null,\n\t\t};\n\t}\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { r as AuthProviderDescriptor } from "../../types-slSqujQL.mjs";
1
+ import { r as AuthProviderDescriptor } from "../../types-uU2YNYSt.mjs";
2
2
 
3
3
  //#region src/auth/providers/github.d.ts
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { r as AuthProviderDescriptor } from "../../types-slSqujQL.mjs";
1
+ import { r as AuthProviderDescriptor } from "../../types-uU2YNYSt.mjs";
2
2
 
3
3
  //#region src/auth/providers/google.d.ts
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { r as AuthProviderDescriptor } from "../../types-slSqujQL.mjs";
1
+ import { r as AuthProviderDescriptor } from "../../types-uU2YNYSt.mjs";
2
2
 
3
3
  //#region src/auth/providers/microsoft.d.ts
4
4
  interface MicrosoftProviderOptions {
@@ -1,4 +1,4 @@
1
- import { t as apiError } from "./error-CVWeIOku.mjs";
1
+ import { t as apiError } from "./error-BCMgPxdn.mjs";
2
2
  import { canActOnOwn, hasPermission, hasScope } from "@emdash-cms/auth";
3
3
 
4
4
  //#region src/api/authorize.ts
@@ -71,4 +71,4 @@ function requireAnyPerm(user, permissions) {
71
71
 
72
72
  //#endregion
73
73
  export { requireOwnerPerm as a, requireEntryEditPerm as i, entryEditAccess as n, requirePerm as o, requireAnyPerm as r, canReadMediaUsageCount as t };
74
- //# sourceMappingURL=authorize-DPFBGbE6.mjs.map
74
+ //# sourceMappingURL=authorize-NJgp8kLI.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"authorize-DPFBGbE6.mjs","names":[],"sources":["../src/api/authorize.ts"],"sourcesContent":["/**\n * Authorization helpers for API routes\n *\n * Thin wrappers around @emdash-cms/auth RBAC that return HTTP responses.\n * Auth middleware handles authentication; these handle authorization.\n */\n\nimport type { Permission, RoleLevel } from \"@emdash-cms/auth\";\nimport { hasPermission, canActOnOwn, hasScope } from \"@emdash-cms/auth\";\n\nimport { apiError } from \"./error.js\";\n\ninterface UserLike {\n\tid: string;\n\trole: RoleLevel;\n}\n\nexport function canReadMediaUsageCount(\n\tuser: UserLike | null | undefined,\n\ttokenScopes: string[] | undefined,\n): boolean {\n\treturn (\n\t\thasPermission(user, \"content:read_drafts\") && (!tokenScopes || hasScope(tokenScopes, \"admin\"))\n\t);\n}\n\n/**\n * Check if user has a permission. Returns a 401/403 Response if not, or null if authorized.\n *\n * Usage:\n * ```ts\n * const denied = requirePerm(user, \"schema:manage\");\n * if (denied) return denied;\n * ```\n */\nexport function requirePerm(\n\tuser: UserLike | null | undefined,\n\tpermission: Permission,\n): Response | null {\n\tif (!user) {\n\t\treturn apiError(\"UNAUTHORIZED\", \"Authentication required\", 401);\n\t}\n\tif (!hasPermission(user, permission)) {\n\t\treturn apiError(\"FORBIDDEN\", \"Insufficient permissions\", 403);\n\t}\n\treturn null;\n}\n\n/**\n * Check if user can act on a resource, considering ownership.\n * Returns a 401/403 Response if not, or null if authorized.\n *\n * Usage:\n * ```ts\n * const denied = requireOwnerPerm(user, item.authorId, \"content:edit_own\", \"content:edit_any\");\n * if (denied) return denied;\n * ```\n */\nexport function requireOwnerPerm(\n\tuser: UserLike | null | undefined,\n\townerId: string,\n\townPermission: Permission,\n\tanyPermission: Permission,\n): Response | null {\n\tif (!user) {\n\t\treturn apiError(\"UNAUTHORIZED\", \"Authentication required\", 401);\n\t}\n\tif (!canActOnOwn(user, ownerId, ownPermission, anyPermission)) {\n\t\treturn apiError(\"FORBIDDEN\", \"Insufficient permissions\", 403);\n\t}\n\treturn null;\n}\n\n/**\n * How `user` may edit an entry: `\"full\"` through `content:edit_own` or\n * `content:edit_any`, `\"draft\"` through `content:edit_own_drafts` only, or\n * `null` when they can't edit it.\n *\n * A `\"draft\"` grant holds only while the entry is still a draft, so the caller\n * must make its write fail if the entry changes after this check, for example\n * by conditioning the update on the `_rev` it checked.\n */\nexport function entryEditAccess(\n\tuser: UserLike | null | undefined,\n\tentry: { authorId: string; status: unknown },\n): \"full\" | \"draft\" | null {\n\tif (canActOnOwn(user, entry.authorId, \"content:edit_own\", \"content:edit_any\")) return \"full\";\n\tif (\n\t\tentry.status === \"draft\" &&\n\t\tcanActOnOwn(user, entry.authorId, \"content:edit_own_drafts\", \"content:edit_any\")\n\t) {\n\t\treturn \"draft\";\n\t}\n\treturn null;\n}\n\n/**\n * Check if user can edit an entry, including an owner editing their own draft\n * through `content:edit_own_drafts`. Returns a 401/403 Response if not, or null\n * if authorized. See {@link entryEditAccess} for what a draft-only grant requires\n * of the caller.\n */\nexport function requireEntryEditPerm(\n\tuser: UserLike | null | undefined,\n\tentry: { authorId: string; status: unknown },\n): Response | null {\n\tif (!user) {\n\t\treturn apiError(\"UNAUTHORIZED\", \"Authentication required\", 401);\n\t}\n\tif (!entryEditAccess(user, entry)) {\n\t\treturn apiError(\"FORBIDDEN\", \"Insufficient permissions\", 403);\n\t}\n\treturn null;\n}\n\n/**\n * Like {@link requirePerm}, but authorized when the user has any of\n * `permissions`.\n */\nexport function requireAnyPerm(\n\tuser: UserLike | null | undefined,\n\tpermissions: readonly Permission[],\n): Response | null {\n\tif (!user) {\n\t\treturn apiError(\"UNAUTHORIZED\", \"Authentication required\", 401);\n\t}\n\tif (!permissions.some((permission) => hasPermission(user, permission))) {\n\t\treturn apiError(\"FORBIDDEN\", \"Insufficient permissions\", 403);\n\t}\n\treturn null;\n}\n"],"mappings":";;;;AAiBA,SAAgB,uBACf,MACA,aACU;AACV,QACC,cAAc,MAAM,sBAAsB,KAAK,CAAC,eAAe,SAAS,aAAa,QAAQ;;;;;;;;;;;AAa/F,SAAgB,YACf,MACA,YACkB;AAClB,KAAI,CAAC,KACJ,QAAO,SAAS,gBAAgB,2BAA2B,IAAI;AAEhE,KAAI,CAAC,cAAc,MAAM,WAAW,CACnC,QAAO,SAAS,aAAa,4BAA4B,IAAI;AAE9D,QAAO;;;;;;;;;;;;AAaR,SAAgB,iBACf,MACA,SACA,eACA,eACkB;AAClB,KAAI,CAAC,KACJ,QAAO,SAAS,gBAAgB,2BAA2B,IAAI;AAEhE,KAAI,CAAC,YAAY,MAAM,SAAS,eAAe,cAAc,CAC5D,QAAO,SAAS,aAAa,4BAA4B,IAAI;AAE9D,QAAO;;;;;;;;;;;AAYR,SAAgB,gBACf,MACA,OAC0B;AAC1B,KAAI,YAAY,MAAM,MAAM,UAAU,oBAAoB,mBAAmB,CAAE,QAAO;AACtF,KACC,MAAM,WAAW,WACjB,YAAY,MAAM,MAAM,UAAU,2BAA2B,mBAAmB,CAEhF,QAAO;AAER,QAAO;;;;;;;;AASR,SAAgB,qBACf,MACA,OACkB;AAClB,KAAI,CAAC,KACJ,QAAO,SAAS,gBAAgB,2BAA2B,IAAI;AAEhE,KAAI,CAAC,gBAAgB,MAAM,MAAM,CAChC,QAAO,SAAS,aAAa,4BAA4B,IAAI;AAE9D,QAAO;;;;;;AAOR,SAAgB,eACf,MACA,aACkB;AAClB,KAAI,CAAC,KACJ,QAAO,SAAS,gBAAgB,2BAA2B,IAAI;AAEhE,KAAI,CAAC,YAAY,MAAM,eAAe,cAAc,MAAM,WAAW,CAAC,CACrE,QAAO,SAAS,aAAa,4BAA4B,IAAI;AAE9D,QAAO"}
1
+ {"version":3,"file":"authorize-NJgp8kLI.mjs","names":[],"sources":["../src/api/authorize.ts"],"sourcesContent":["/**\n * Authorization helpers for API routes\n *\n * Thin wrappers around @emdash-cms/auth RBAC that return HTTP responses.\n * Auth middleware handles authentication; these handle authorization.\n */\n\nimport type { Permission, RoleLevel } from \"@emdash-cms/auth\";\nimport { hasPermission, canActOnOwn, hasScope } from \"@emdash-cms/auth\";\n\nimport { apiError } from \"./error.js\";\n\ninterface UserLike {\n\tid: string;\n\trole: RoleLevel;\n}\n\nexport function canReadMediaUsageCount(\n\tuser: UserLike | null | undefined,\n\ttokenScopes: string[] | undefined,\n): boolean {\n\treturn (\n\t\thasPermission(user, \"content:read_drafts\") && (!tokenScopes || hasScope(tokenScopes, \"admin\"))\n\t);\n}\n\n/**\n * Check if user has a permission. Returns a 401/403 Response if not, or null if authorized.\n *\n * Usage:\n * ```ts\n * const denied = requirePerm(user, \"schema:manage\");\n * if (denied) return denied;\n * ```\n */\nexport function requirePerm(\n\tuser: UserLike | null | undefined,\n\tpermission: Permission,\n): Response | null {\n\tif (!user) {\n\t\treturn apiError(\"UNAUTHORIZED\", \"Authentication required\", 401);\n\t}\n\tif (!hasPermission(user, permission)) {\n\t\treturn apiError(\"FORBIDDEN\", \"Insufficient permissions\", 403);\n\t}\n\treturn null;\n}\n\n/**\n * Check if user can act on a resource, considering ownership.\n * Returns a 401/403 Response if not, or null if authorized.\n *\n * Usage:\n * ```ts\n * const denied = requireOwnerPerm(user, item.authorId, \"content:edit_own\", \"content:edit_any\");\n * if (denied) return denied;\n * ```\n */\nexport function requireOwnerPerm(\n\tuser: UserLike | null | undefined,\n\townerId: string,\n\townPermission: Permission,\n\tanyPermission: Permission,\n): Response | null {\n\tif (!user) {\n\t\treturn apiError(\"UNAUTHORIZED\", \"Authentication required\", 401);\n\t}\n\tif (!canActOnOwn(user, ownerId, ownPermission, anyPermission)) {\n\t\treturn apiError(\"FORBIDDEN\", \"Insufficient permissions\", 403);\n\t}\n\treturn null;\n}\n\n/**\n * How `user` may edit an entry: `\"full\"` through `content:edit_own` or\n * `content:edit_any`, `\"draft\"` through `content:edit_own_drafts` only, or\n * `null` when they can't edit it.\n *\n * A `\"draft\"` grant holds only while the entry is still a draft, so the caller\n * must make its write fail if the entry changes after this check, for example\n * by conditioning the update on the `_rev` it checked.\n */\nexport function entryEditAccess(\n\tuser: UserLike | null | undefined,\n\tentry: { authorId: string; status: unknown },\n): \"full\" | \"draft\" | null {\n\tif (canActOnOwn(user, entry.authorId, \"content:edit_own\", \"content:edit_any\")) return \"full\";\n\tif (\n\t\tentry.status === \"draft\" &&\n\t\tcanActOnOwn(user, entry.authorId, \"content:edit_own_drafts\", \"content:edit_any\")\n\t) {\n\t\treturn \"draft\";\n\t}\n\treturn null;\n}\n\n/**\n * Check if user can edit an entry, including an owner editing their own draft\n * through `content:edit_own_drafts`. Returns a 401/403 Response if not, or null\n * if authorized. See {@link entryEditAccess} for what a draft-only grant requires\n * of the caller.\n */\nexport function requireEntryEditPerm(\n\tuser: UserLike | null | undefined,\n\tentry: { authorId: string; status: unknown },\n): Response | null {\n\tif (!user) {\n\t\treturn apiError(\"UNAUTHORIZED\", \"Authentication required\", 401);\n\t}\n\tif (!entryEditAccess(user, entry)) {\n\t\treturn apiError(\"FORBIDDEN\", \"Insufficient permissions\", 403);\n\t}\n\treturn null;\n}\n\n/**\n * Like {@link requirePerm}, but authorized when the user has any of\n * `permissions`.\n */\nexport function requireAnyPerm(\n\tuser: UserLike | null | undefined,\n\tpermissions: readonly Permission[],\n): Response | null {\n\tif (!user) {\n\t\treturn apiError(\"UNAUTHORIZED\", \"Authentication required\", 401);\n\t}\n\tif (!permissions.some((permission) => hasPermission(user, permission))) {\n\t\treturn apiError(\"FORBIDDEN\", \"Insufficient permissions\", 403);\n\t}\n\treturn null;\n}\n"],"mappings":";;;;AAiBA,SAAgB,uBACf,MACA,aACU;AACV,QACC,cAAc,MAAM,sBAAsB,KAAK,CAAC,eAAe,SAAS,aAAa,QAAQ;;;;;;;;;;;AAa/F,SAAgB,YACf,MACA,YACkB;AAClB,KAAI,CAAC,KACJ,QAAO,SAAS,gBAAgB,2BAA2B,IAAI;AAEhE,KAAI,CAAC,cAAc,MAAM,WAAW,CACnC,QAAO,SAAS,aAAa,4BAA4B,IAAI;AAE9D,QAAO;;;;;;;;;;;;AAaR,SAAgB,iBACf,MACA,SACA,eACA,eACkB;AAClB,KAAI,CAAC,KACJ,QAAO,SAAS,gBAAgB,2BAA2B,IAAI;AAEhE,KAAI,CAAC,YAAY,MAAM,SAAS,eAAe,cAAc,CAC5D,QAAO,SAAS,aAAa,4BAA4B,IAAI;AAE9D,QAAO;;;;;;;;;;;AAYR,SAAgB,gBACf,MACA,OAC0B;AAC1B,KAAI,YAAY,MAAM,MAAM,UAAU,oBAAoB,mBAAmB,CAAE,QAAO;AACtF,KACC,MAAM,WAAW,WACjB,YAAY,MAAM,MAAM,UAAU,2BAA2B,mBAAmB,CAEhF,QAAO;AAER,QAAO;;;;;;;;AASR,SAAgB,qBACf,MACA,OACkB;AAClB,KAAI,CAAC,KACJ,QAAO,SAAS,gBAAgB,2BAA2B,IAAI;AAEhE,KAAI,CAAC,gBAAgB,MAAM,MAAM,CAChC,QAAO,SAAS,aAAa,4BAA4B,IAAI;AAE9D,QAAO;;;;;;AAOR,SAAgB,eACf,MACA,aACkB;AAClB,KAAI,CAAC,KACJ,QAAO,SAAS,gBAAgB,2BAA2B,IAAI;AAEhE,KAAI,CAAC,YAAY,MAAM,eAAe,cAAc,MAAM,WAAW,CAAC,CACrE,QAAO,SAAS,aAAa,4BAA4B,IAAI;AAE9D,QAAO"}
@@ -1,7 +1,7 @@
1
1
  import { t as OptionsRepository } from "./options-DhrI7eMv.mjs";
2
- import { n as VERSION } from "./version-DHmGpcch.mjs";
3
- import { t as ErrorCode } from "./errors-BOYNdIo3.mjs";
4
- import { t as generateSnapshot } from "./snapshot-DYsG4uOq.mjs";
2
+ import { n as VERSION } from "./version-Bu6Nlbb5.mjs";
3
+ import { t as ErrorCode } from "./errors-8gJqv-XV.mjs";
4
+ import { t as generateSnapshot } from "./snapshot-BjaXDZQ5.mjs";
5
5
 
6
6
  //#region src/api/handlers/backup.ts
7
7
  /** Storage key prefix for scheduled/manual archives. */
@@ -243,4 +243,4 @@ async function maybeRunScheduledBackup(db, storage) {
243
243
 
244
244
  //#endregion
245
245
  export { deleteBackupArchive as a, isValidArchiveName as c, runBackupToStorage as d, updateBackupSettings as f, archiveNameForDate as i, listBackupArchives as l, BACKUP_RETENTION_MIN as n, generateBackupJson as o, BACKUP_STORAGE_PREFIX as r, getBackupSettings as s, BACKUP_RETENTION_MAX as t, maybeRunScheduledBackup as u };
246
- //# sourceMappingURL=backup-3FgVxiDJ.mjs.map
246
+ //# sourceMappingURL=backup-8rPSJ28a.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"backup-3FgVxiDJ.mjs","names":[],"sources":["../src/api/handlers/backup.ts"],"sourcesContent":["/**\n * Backup handlers — portable content backups, on demand and scheduled.\n *\n * A backup is the snapshot format (see `snapshot.ts`) wrapped in a small\n * envelope: all content (including drafts, scheduled, and trashed entries),\n * schema definitions, taxonomies, menus, widgets, revisions, media metadata,\n * and site settings.\n *\n * Deliberately NOT included:\n * - Users, sessions, credentials, API/OAuth tokens (auth data is neither\n * portable nor safe in a user-downloadable file)\n * - Secrets (`emdash:preview_secret`, plugin config, passkey challenges)\n * - Media binaries (metadata only — the files live in the same bucket the\n * scheduled archives are written to)\n *\n * For full point-in-time database recovery on Cloudflare, D1 Time Travel\n * covers the last 30 days out of the box; these backups complement it with\n * user-holdable, longer-lived archives.\n */\n\nimport type { Kysely } from \"kysely\";\n\nimport { OptionsRepository } from \"../../database/repositories/options.js\";\nimport type { Database } from \"../../database/types.js\";\nimport type { Storage } from \"../../storage/types.js\";\nimport { VERSION } from \"../../version.js\";\nimport { ErrorCode } from \"../errors.js\";\nimport type { ApiResult } from \"../types.js\";\nimport { generateSnapshot } from \"./snapshot.js\";\n\n// ── Constants ───────────────────────────────────────────────────\n\n/** Storage key prefix for scheduled/manual archives. */\nexport const BACKUP_STORAGE_PREFIX = \"backups/\";\n\n/**\n * Filename prefix within the backups/ folder. Included in the list() prefix\n * so LocalStorage (which matches directory + filename prefix, not flat keys\n * like S3/R2) finds the archives too.\n */\nconst BACKUP_FILE_PREFIX = \"emdash-backup-\";\n\n/** Options key holding the scheduled-backup settings. */\nexport const BACKUP_SETTINGS_KEY = \"emdash:backups\";\n\n/** Options key holding the ISO timestamp of the last scheduled run. */\nconst BACKUP_LAST_RUN_KEY = \"emdash:backups_last_run\";\n\n/** Minimum interval between scheduled backups (23h — daily with cron jitter). */\nconst SCHEDULED_BACKUP_INTERVAL_MS = 23 * 60 * 60 * 1000;\n\n/** Retention bounds for stored archives. */\nexport const BACKUP_RETENTION_MIN = 1;\nexport const BACKUP_RETENTION_MAX = 30;\nconst BACKUP_RETENTION_DEFAULT = 7;\n\n/**\n * Options-table key prefixes included in backups. Never widen this to a\n * prefix that can match secrets (`emdash:preview_secret`, `plugin:`,\n * `emdash:passkey_pending:`).\n */\nconst BACKUP_OPTION_PREFIXES = [\"site:\"];\n\n/**\n * Exact `emdash:*` keys included in backups. Do not add `emdash:site_url`: it\n * is the origin of the deployment that took the backup, not portable site data.\n */\nconst BACKUP_OPTION_KEYS = [\"emdash:site_title\", \"emdash:site_tagline\", \"emdash:locale\"];\n\n/**\n * Archive filename shape. Strict allowlist — the download/delete routes\n * interpolate this into a storage key, so it must never contain `/` or `..`.\n * The random suffix makes names unguessable (defense in depth on top of the\n * media route's backups/ deny) and avoids same-second collisions.\n */\nconst ARCHIVE_NAME_PATTERN =\n\t/^emdash-backup-\\d{4}-\\d{2}-\\d{2}T\\d{2}-\\d{2}-\\d{2}-[0-9a-f]{8}\\.json$/;\n\nexport function isValidArchiveName(name: string): boolean {\n\treturn ARCHIVE_NAME_PATTERN.test(name);\n}\n\n// ── Types ───────────────────────────────────────────────────────\n\nexport interface BackupSettings {\n\t/** Whether daily scheduled backups to storage are enabled. */\n\tenabled: boolean;\n\t/** How many archives to keep in storage (oldest pruned first). */\n\tretention: number;\n}\n\nexport interface BackupArchive {\n\t/** Filename within the backups/ prefix (no path separators). */\n\tname: string;\n\t/** Size in bytes. */\n\tsize: number;\n\t/** Last-modified timestamp (ISO). */\n\tlastModified: string;\n}\n\nconst DEFAULT_SETTINGS: BackupSettings = {\n\tenabled: false,\n\tretention: BACKUP_RETENTION_DEFAULT,\n};\n\nfunction clampRetention(value: number): number {\n\tif (!Number.isFinite(value)) return BACKUP_RETENTION_DEFAULT;\n\treturn Math.min(BACKUP_RETENTION_MAX, Math.max(BACKUP_RETENTION_MIN, Math.trunc(value)));\n}\n\n// ── Export ──────────────────────────────────────────────────────\n\n/**\n * Generate a full content backup as a JSON string.\n *\n * ponytail: the whole backup is materialized in memory. Fine for the sites\n * EmDash targets today; truly huge databases should use `wrangler d1 export`\n * (documented on the backups docs page). Upgrade path: stream table-by-table.\n */\nexport async function generateBackupJson(db: Kysely<Database>): Promise<string> {\n\tconst snapshot = await generateSnapshot(db, {\n\t\tincludeDrafts: true,\n\t\tincludeTrashed: true,\n\t\toptionPrefixes: BACKUP_OPTION_PREFIXES,\n\t\toptionKeys: BACKUP_OPTION_KEYS,\n\t});\n\n\treturn JSON.stringify({\n\t\tformat: \"emdash-backup\",\n\t\tformatVersion: 1,\n\t\temdashVersion: VERSION,\n\t\tgeneratedAt: snapshot.generatedAt,\n\t\tschema: snapshot.schema,\n\t\ttables: snapshot.tables,\n\t});\n}\n\n/** Derive the archive filename for a given date (plus a random suffix). */\nexport function archiveNameForDate(date: Date): string {\n\t// 2026-07-09T08:45:12.345Z → emdash-backup-2026-07-09T08-45-12-1a2b3c4d.json\n\tconst stamp = date.toISOString().slice(0, 19).replaceAll(\":\", \"-\");\n\tconst suffix = crypto.randomUUID().replaceAll(\"-\", \"\").slice(0, 8);\n\treturn `emdash-backup-${stamp}-${suffix}.json`;\n}\n\n// ── Settings ────────────────────────────────────────────────────\n\nexport async function getBackupSettings(db: Kysely<Database>): Promise<BackupSettings> {\n\tconst options = new OptionsRepository(db);\n\tconst stored = await options.get<Partial<BackupSettings>>(BACKUP_SETTINGS_KEY);\n\tif (!stored) return { ...DEFAULT_SETTINGS };\n\treturn {\n\t\tenabled: stored.enabled === true,\n\t\tretention: clampRetention(stored.retention ?? BACKUP_RETENTION_DEFAULT),\n\t};\n}\n\nexport async function updateBackupSettings(\n\tdb: Kysely<Database>,\n\tinput: { enabled: boolean; retention: number },\n): Promise<ApiResult<BackupSettings>> {\n\ttry {\n\t\tconst settings: BackupSettings = {\n\t\t\tenabled: input.enabled,\n\t\t\tretention: clampRetention(input.retention),\n\t\t};\n\t\tconst options = new OptionsRepository(db);\n\t\tawait options.set(BACKUP_SETTINGS_KEY, settings);\n\t\treturn { success: true, data: settings };\n\t} catch (error) {\n\t\tconsole.error(\"[backup] Failed to update settings:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: { code: ErrorCode.BACKUP_SETTINGS_ERROR, message: \"Failed to update backup settings\" },\n\t\t};\n\t}\n}\n\n// ── Archives in storage ─────────────────────────────────────────\n\n/**\n * List stored archives, newest first.\n *\n * ponytail: single unpaginated list. The retention cap (max 30) bounds the\n * archive count, so one page always suffices.\n */\nexport async function listBackupArchives(storage: Storage): Promise<ApiResult<BackupArchive[]>> {\n\ttry {\n\t\tconst result = await storage.list({\n\t\t\tprefix: `${BACKUP_STORAGE_PREFIX}${BACKUP_FILE_PREFIX}`,\n\t\t\tlimit: 100,\n\t\t});\n\t\tconst archives = result.files\n\t\t\t.map((file) => ({\n\t\t\t\tname: file.key.slice(BACKUP_STORAGE_PREFIX.length),\n\t\t\t\tsize: file.size,\n\t\t\t\tlastModified: file.lastModified.toISOString(),\n\t\t\t}))\n\t\t\t.filter((archive) => isValidArchiveName(archive.name))\n\t\t\t.toSorted((a, b) => (a.name < b.name ? 1 : -1));\n\t\treturn { success: true, data: archives };\n\t} catch (error) {\n\t\tconsole.error(\"[backup] Failed to list archives:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: { code: ErrorCode.BACKUP_LIST_ERROR, message: \"Failed to list backup archives\" },\n\t\t};\n\t}\n}\n\n/**\n * Create a backup and store it as an archive, then prune old archives\n * beyond `retention`.\n */\nexport async function runBackupToStorage(\n\tdb: Kysely<Database>,\n\tstorage: Storage,\n\tretention: number,\n): Promise<ApiResult<BackupArchive>> {\n\ttry {\n\t\tconst json = await generateBackupJson(db);\n\t\tconst name = archiveNameForDate(new Date());\n\t\tconst body = new TextEncoder().encode(json);\n\n\t\tawait storage.upload({\n\t\t\tkey: `${BACKUP_STORAGE_PREFIX}${name}`,\n\t\t\tbody,\n\t\t\tcontentType: \"application/json\",\n\t\t});\n\n\t\tawait pruneArchives(storage, clampRetention(retention));\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: { name, size: body.byteLength, lastModified: new Date().toISOString() },\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[backup] Failed to create archive:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: { code: ErrorCode.BACKUP_CREATE_ERROR, message: \"Failed to create backup archive\" },\n\t\t};\n\t}\n}\n\n/** Delete archives beyond the newest `keep`. Failures are logged, not fatal. */\nasync function pruneArchives(storage: Storage, keep: number): Promise<void> {\n\tconst listed = await listBackupArchives(storage);\n\tif (!listed.success) return;\n\n\tfor (const archive of listed.data.slice(keep)) {\n\t\ttry {\n\t\t\tawait storage.delete(`${BACKUP_STORAGE_PREFIX}${archive.name}`);\n\t\t} catch (error) {\n\t\t\tconsole.error(`[backup] Failed to prune archive ${archive.name}:`, error);\n\t\t}\n\t}\n}\n\nexport async function deleteBackupArchive(\n\tstorage: Storage,\n\tname: string,\n): Promise<ApiResult<{ deleted: true }>> {\n\tif (!isValidArchiveName(name)) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: { code: ErrorCode.VALIDATION_ERROR, message: \"Invalid archive name\" },\n\t\t};\n\t}\n\ttry {\n\t\tawait storage.delete(`${BACKUP_STORAGE_PREFIX}${name}`);\n\t\treturn { success: true, data: { deleted: true } };\n\t} catch (error) {\n\t\tconsole.error(`[backup] Failed to delete archive ${name}:`, error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: { code: ErrorCode.BACKUP_DELETE_ERROR, message: \"Failed to delete backup archive\" },\n\t\t};\n\t}\n}\n\n// ── Scheduled runs ──────────────────────────────────────────────\n\n/**\n * Run a scheduled backup if enabled and due. Called from the maintenance\n * tick alongside scheduled publishing and system cleanup — never from a\n * request. Never throws.\n *\n * ponytail: last-run bookkeeping is a plain read-then-write, so two isolates\n * ticking simultaneously could both back up. Worst case is a duplicate\n * archive that retention prunes; not worth a lock.\n */\nexport async function maybeRunScheduledBackup(\n\tdb: Kysely<Database>,\n\tstorage: Storage | undefined,\n): Promise<void> {\n\ttry {\n\t\tif (!storage) return;\n\n\t\tconst settings = await getBackupSettings(db);\n\t\tif (!settings.enabled) return;\n\n\t\tconst options = new OptionsRepository(db);\n\t\tconst lastRun = await options.get<string>(BACKUP_LAST_RUN_KEY);\n\t\tif (lastRun) {\n\t\t\tconst elapsed = Date.now() - Date.parse(lastRun);\n\t\t\tif (Number.isFinite(elapsed) && elapsed < SCHEDULED_BACKUP_INTERVAL_MS) return;\n\t\t}\n\n\t\tconst result = await runBackupToStorage(db, storage, settings.retention);\n\t\tif (result.success) {\n\t\t\tawait options.set(BACKUP_LAST_RUN_KEY, new Date().toISOString());\n\t\t\tconsole.log(`[backup] Scheduled backup stored: ${result.data.name}`);\n\t\t}\n\t} catch (error) {\n\t\tconsole.error(\"[backup] Scheduled backup failed:\", error);\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"backup-8rPSJ28a.mjs","names":[],"sources":["../src/api/handlers/backup.ts"],"sourcesContent":["/**\n * Backup handlers — portable content backups, on demand and scheduled.\n *\n * A backup is the snapshot format (see `snapshot.ts`) wrapped in a small\n * envelope: all content (including drafts, scheduled, and trashed entries),\n * schema definitions, taxonomies, menus, widgets, revisions, media metadata,\n * and site settings.\n *\n * Deliberately NOT included:\n * - Users, sessions, credentials, API/OAuth tokens (auth data is neither\n * portable nor safe in a user-downloadable file)\n * - Secrets (`emdash:preview_secret`, plugin config, passkey challenges)\n * - Media binaries (metadata only — the files live in the same bucket the\n * scheduled archives are written to)\n *\n * For full point-in-time database recovery on Cloudflare, D1 Time Travel\n * covers the last 30 days out of the box; these backups complement it with\n * user-holdable, longer-lived archives.\n */\n\nimport type { Kysely } from \"kysely\";\n\nimport { OptionsRepository } from \"../../database/repositories/options.js\";\nimport type { Database } from \"../../database/types.js\";\nimport type { Storage } from \"../../storage/types.js\";\nimport { VERSION } from \"../../version.js\";\nimport { ErrorCode } from \"../errors.js\";\nimport type { ApiResult } from \"../types.js\";\nimport { generateSnapshot } from \"./snapshot.js\";\n\n// ── Constants ───────────────────────────────────────────────────\n\n/** Storage key prefix for scheduled/manual archives. */\nexport const BACKUP_STORAGE_PREFIX = \"backups/\";\n\n/**\n * Filename prefix within the backups/ folder. Included in the list() prefix\n * so LocalStorage (which matches directory + filename prefix, not flat keys\n * like S3/R2) finds the archives too.\n */\nconst BACKUP_FILE_PREFIX = \"emdash-backup-\";\n\n/** Options key holding the scheduled-backup settings. */\nexport const BACKUP_SETTINGS_KEY = \"emdash:backups\";\n\n/** Options key holding the ISO timestamp of the last scheduled run. */\nconst BACKUP_LAST_RUN_KEY = \"emdash:backups_last_run\";\n\n/** Minimum interval between scheduled backups (23h — daily with cron jitter). */\nconst SCHEDULED_BACKUP_INTERVAL_MS = 23 * 60 * 60 * 1000;\n\n/** Retention bounds for stored archives. */\nexport const BACKUP_RETENTION_MIN = 1;\nexport const BACKUP_RETENTION_MAX = 30;\nconst BACKUP_RETENTION_DEFAULT = 7;\n\n/**\n * Options-table key prefixes included in backups. Never widen this to a\n * prefix that can match secrets (`emdash:preview_secret`, `plugin:`,\n * `emdash:passkey_pending:`).\n */\nconst BACKUP_OPTION_PREFIXES = [\"site:\"];\n\n/**\n * Exact `emdash:*` keys included in backups. Do not add `emdash:site_url`: it\n * is the origin of the deployment that took the backup, not portable site data.\n */\nconst BACKUP_OPTION_KEYS = [\"emdash:site_title\", \"emdash:site_tagline\", \"emdash:locale\"];\n\n/**\n * Archive filename shape. Strict allowlist — the download/delete routes\n * interpolate this into a storage key, so it must never contain `/` or `..`.\n * The random suffix makes names unguessable (defense in depth on top of the\n * media route's backups/ deny) and avoids same-second collisions.\n */\nconst ARCHIVE_NAME_PATTERN =\n\t/^emdash-backup-\\d{4}-\\d{2}-\\d{2}T\\d{2}-\\d{2}-\\d{2}-[0-9a-f]{8}\\.json$/;\n\nexport function isValidArchiveName(name: string): boolean {\n\treturn ARCHIVE_NAME_PATTERN.test(name);\n}\n\n// ── Types ───────────────────────────────────────────────────────\n\nexport interface BackupSettings {\n\t/** Whether daily scheduled backups to storage are enabled. */\n\tenabled: boolean;\n\t/** How many archives to keep in storage (oldest pruned first). */\n\tretention: number;\n}\n\nexport interface BackupArchive {\n\t/** Filename within the backups/ prefix (no path separators). */\n\tname: string;\n\t/** Size in bytes. */\n\tsize: number;\n\t/** Last-modified timestamp (ISO). */\n\tlastModified: string;\n}\n\nconst DEFAULT_SETTINGS: BackupSettings = {\n\tenabled: false,\n\tretention: BACKUP_RETENTION_DEFAULT,\n};\n\nfunction clampRetention(value: number): number {\n\tif (!Number.isFinite(value)) return BACKUP_RETENTION_DEFAULT;\n\treturn Math.min(BACKUP_RETENTION_MAX, Math.max(BACKUP_RETENTION_MIN, Math.trunc(value)));\n}\n\n// ── Export ──────────────────────────────────────────────────────\n\n/**\n * Generate a full content backup as a JSON string.\n *\n * ponytail: the whole backup is materialized in memory. Fine for the sites\n * EmDash targets today; truly huge databases should use `wrangler d1 export`\n * (documented on the backups docs page). Upgrade path: stream table-by-table.\n */\nexport async function generateBackupJson(db: Kysely<Database>): Promise<string> {\n\tconst snapshot = await generateSnapshot(db, {\n\t\tincludeDrafts: true,\n\t\tincludeTrashed: true,\n\t\toptionPrefixes: BACKUP_OPTION_PREFIXES,\n\t\toptionKeys: BACKUP_OPTION_KEYS,\n\t});\n\n\treturn JSON.stringify({\n\t\tformat: \"emdash-backup\",\n\t\tformatVersion: 1,\n\t\temdashVersion: VERSION,\n\t\tgeneratedAt: snapshot.generatedAt,\n\t\tschema: snapshot.schema,\n\t\ttables: snapshot.tables,\n\t});\n}\n\n/** Derive the archive filename for a given date (plus a random suffix). */\nexport function archiveNameForDate(date: Date): string {\n\t// 2026-07-09T08:45:12.345Z → emdash-backup-2026-07-09T08-45-12-1a2b3c4d.json\n\tconst stamp = date.toISOString().slice(0, 19).replaceAll(\":\", \"-\");\n\tconst suffix = crypto.randomUUID().replaceAll(\"-\", \"\").slice(0, 8);\n\treturn `emdash-backup-${stamp}-${suffix}.json`;\n}\n\n// ── Settings ────────────────────────────────────────────────────\n\nexport async function getBackupSettings(db: Kysely<Database>): Promise<BackupSettings> {\n\tconst options = new OptionsRepository(db);\n\tconst stored = await options.get<Partial<BackupSettings>>(BACKUP_SETTINGS_KEY);\n\tif (!stored) return { ...DEFAULT_SETTINGS };\n\treturn {\n\t\tenabled: stored.enabled === true,\n\t\tretention: clampRetention(stored.retention ?? BACKUP_RETENTION_DEFAULT),\n\t};\n}\n\nexport async function updateBackupSettings(\n\tdb: Kysely<Database>,\n\tinput: { enabled: boolean; retention: number },\n): Promise<ApiResult<BackupSettings>> {\n\ttry {\n\t\tconst settings: BackupSettings = {\n\t\t\tenabled: input.enabled,\n\t\t\tretention: clampRetention(input.retention),\n\t\t};\n\t\tconst options = new OptionsRepository(db);\n\t\tawait options.set(BACKUP_SETTINGS_KEY, settings);\n\t\treturn { success: true, data: settings };\n\t} catch (error) {\n\t\tconsole.error(\"[backup] Failed to update settings:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: { code: ErrorCode.BACKUP_SETTINGS_ERROR, message: \"Failed to update backup settings\" },\n\t\t};\n\t}\n}\n\n// ── Archives in storage ─────────────────────────────────────────\n\n/**\n * List stored archives, newest first.\n *\n * ponytail: single unpaginated list. The retention cap (max 30) bounds the\n * archive count, so one page always suffices.\n */\nexport async function listBackupArchives(storage: Storage): Promise<ApiResult<BackupArchive[]>> {\n\ttry {\n\t\tconst result = await storage.list({\n\t\t\tprefix: `${BACKUP_STORAGE_PREFIX}${BACKUP_FILE_PREFIX}`,\n\t\t\tlimit: 100,\n\t\t});\n\t\tconst archives = result.files\n\t\t\t.map((file) => ({\n\t\t\t\tname: file.key.slice(BACKUP_STORAGE_PREFIX.length),\n\t\t\t\tsize: file.size,\n\t\t\t\tlastModified: file.lastModified.toISOString(),\n\t\t\t}))\n\t\t\t.filter((archive) => isValidArchiveName(archive.name))\n\t\t\t.toSorted((a, b) => (a.name < b.name ? 1 : -1));\n\t\treturn { success: true, data: archives };\n\t} catch (error) {\n\t\tconsole.error(\"[backup] Failed to list archives:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: { code: ErrorCode.BACKUP_LIST_ERROR, message: \"Failed to list backup archives\" },\n\t\t};\n\t}\n}\n\n/**\n * Create a backup and store it as an archive, then prune old archives\n * beyond `retention`.\n */\nexport async function runBackupToStorage(\n\tdb: Kysely<Database>,\n\tstorage: Storage,\n\tretention: number,\n): Promise<ApiResult<BackupArchive>> {\n\ttry {\n\t\tconst json = await generateBackupJson(db);\n\t\tconst name = archiveNameForDate(new Date());\n\t\tconst body = new TextEncoder().encode(json);\n\n\t\tawait storage.upload({\n\t\t\tkey: `${BACKUP_STORAGE_PREFIX}${name}`,\n\t\t\tbody,\n\t\t\tcontentType: \"application/json\",\n\t\t});\n\n\t\tawait pruneArchives(storage, clampRetention(retention));\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: { name, size: body.byteLength, lastModified: new Date().toISOString() },\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[backup] Failed to create archive:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: { code: ErrorCode.BACKUP_CREATE_ERROR, message: \"Failed to create backup archive\" },\n\t\t};\n\t}\n}\n\n/** Delete archives beyond the newest `keep`. Failures are logged, not fatal. */\nasync function pruneArchives(storage: Storage, keep: number): Promise<void> {\n\tconst listed = await listBackupArchives(storage);\n\tif (!listed.success) return;\n\n\tfor (const archive of listed.data.slice(keep)) {\n\t\ttry {\n\t\t\tawait storage.delete(`${BACKUP_STORAGE_PREFIX}${archive.name}`);\n\t\t} catch (error) {\n\t\t\tconsole.error(`[backup] Failed to prune archive ${archive.name}:`, error);\n\t\t}\n\t}\n}\n\nexport async function deleteBackupArchive(\n\tstorage: Storage,\n\tname: string,\n): Promise<ApiResult<{ deleted: true }>> {\n\tif (!isValidArchiveName(name)) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: { code: ErrorCode.VALIDATION_ERROR, message: \"Invalid archive name\" },\n\t\t};\n\t}\n\ttry {\n\t\tawait storage.delete(`${BACKUP_STORAGE_PREFIX}${name}`);\n\t\treturn { success: true, data: { deleted: true } };\n\t} catch (error) {\n\t\tconsole.error(`[backup] Failed to delete archive ${name}:`, error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: { code: ErrorCode.BACKUP_DELETE_ERROR, message: \"Failed to delete backup archive\" },\n\t\t};\n\t}\n}\n\n// ── Scheduled runs ──────────────────────────────────────────────\n\n/**\n * Run a scheduled backup if enabled and due. Called from the maintenance\n * tick alongside scheduled publishing and system cleanup — never from a\n * request. Never throws.\n *\n * ponytail: last-run bookkeeping is a plain read-then-write, so two isolates\n * ticking simultaneously could both back up. Worst case is a duplicate\n * archive that retention prunes; not worth a lock.\n */\nexport async function maybeRunScheduledBackup(\n\tdb: Kysely<Database>,\n\tstorage: Storage | undefined,\n): Promise<void> {\n\ttry {\n\t\tif (!storage) return;\n\n\t\tconst settings = await getBackupSettings(db);\n\t\tif (!settings.enabled) return;\n\n\t\tconst options = new OptionsRepository(db);\n\t\tconst lastRun = await options.get<string>(BACKUP_LAST_RUN_KEY);\n\t\tif (lastRun) {\n\t\t\tconst elapsed = Date.now() - Date.parse(lastRun);\n\t\t\tif (Number.isFinite(elapsed) && elapsed < SCHEDULED_BACKUP_INTERVAL_MS) return;\n\t\t}\n\n\t\tconst result = await runBackupToStorage(db, storage, settings.retention);\n\t\tif (result.success) {\n\t\t\tawait options.set(BACKUP_LAST_RUN_KEY, new Date().toISOString());\n\t\t\tconsole.log(`[backup] Scheduled backup stored: ${result.data.name}`);\n\t\t}\n\t} catch (error) {\n\t\tconsole.error(\"[backup] Scheduled backup failed:\", error);\n\t}\n}\n"],"mappings":"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"}