emdash 0.32.0 → 0.33.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 (681) hide show
  1. package/dist/{adapters-C0ONzkUP.d.mts → adapters-BMyNSSZi.d.mts} +9 -1
  2. package/dist/adapters-BMyNSSZi.d.mts.map +1 -0
  3. package/dist/after-CBU2vkoO.mjs +96 -0
  4. package/dist/after-CBU2vkoO.mjs.map +1 -0
  5. package/dist/{allowed-origins-CCEi9bPI.mjs → allowed-origins-CG1pACtS.mjs} +2 -2
  6. package/dist/{allowed-origins-CCEi9bPI.mjs.map → allowed-origins-CG1pACtS.mjs.map} +1 -1
  7. package/dist/api/route-utils.d.mts +3 -4
  8. package/dist/api/route-utils.d.mts.map +1 -1
  9. package/dist/api/route-utils.mjs +22 -22
  10. package/dist/api/schemas/index.d.mts +2 -2
  11. package/dist/api/schemas/index.mjs +5 -5
  12. package/dist/{api-DgPbMlng.mjs → api-D2hunekQ.mjs} +247 -45
  13. package/dist/api-D2hunekQ.mjs.map +1 -0
  14. package/dist/{api-tokens-p-iMzvXR.mjs → api-tokens-CSND0i1z.mjs} +2 -2
  15. package/dist/{api-tokens-p-iMzvXR.mjs.map → api-tokens-CSND0i1z.mjs.map} +1 -1
  16. package/dist/{apply-1_6ra7NP.mjs → apply-kwNEJW2l.mjs} +35 -22
  17. package/dist/apply-kwNEJW2l.mjs.map +1 -0
  18. package/dist/astro/index.d.mts +12 -12
  19. package/dist/astro/index.mjs +13 -3
  20. package/dist/astro/index.mjs.map +1 -1
  21. package/dist/astro/middleware/auth.d.mts +10 -10
  22. package/dist/astro/middleware/auth.mjs +8 -8
  23. package/dist/astro/middleware/redirect.d.mts.map +1 -1
  24. package/dist/astro/middleware/redirect.mjs +8 -8
  25. package/dist/astro/middleware/redirect.mjs.map +1 -1
  26. package/dist/astro/middleware/request-context.mjs +4 -4
  27. package/dist/astro/middleware/setup.mjs +1 -1
  28. package/dist/astro/middleware.d.mts +10 -10
  29. package/dist/astro/middleware.d.mts.map +1 -1
  30. package/dist/astro/middleware.mjs +344 -173
  31. package/dist/astro/middleware.mjs.map +1 -1
  32. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +7 -7
  33. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +7 -7
  34. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
  35. package/dist/astro/routes/api/admin/api-tokens/index.mjs +5 -5
  36. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +5 -5
  37. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +10 -10
  38. package/dist/astro/routes/api/admin/byline-fields/index.mjs +10 -10
  39. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +10 -10
  40. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +18 -18
  41. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +18 -18
  42. package/dist/astro/routes/api/admin/bylines/index.mjs +18 -18
  43. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +16 -16
  44. package/dist/astro/routes/api/admin/comments/_id_/status.mjs.map +1 -1
  45. package/dist/astro/routes/api/admin/comments/_id_.mjs +7 -7
  46. package/dist/astro/routes/api/admin/comments/bulk.mjs +12 -12
  47. package/dist/astro/routes/api/admin/comments/counts.mjs +7 -7
  48. package/dist/astro/routes/api/admin/comments/index.mjs +12 -12
  49. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +5 -5
  50. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +4 -4
  51. package/dist/astro/routes/api/admin/media-usage/repair.mjs +12 -12
  52. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +4 -4
  53. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +4 -4
  54. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +46 -45
  55. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
  56. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +46 -45
  57. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
  58. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +45 -44
  59. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  60. package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +5 -5
  61. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +45 -44
  62. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
  63. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +45 -44
  64. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  65. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +45 -44
  66. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  67. package/dist/astro/routes/api/admin/plugins/index.mjs +45 -44
  68. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  69. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +3 -3
  70. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +45 -44
  71. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  72. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +45 -44
  73. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
  74. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +45 -44
  75. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
  76. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +45 -44
  77. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
  78. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +46 -45
  79. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
  80. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +45 -44
  81. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
  82. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +46 -45
  83. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  84. package/dist/astro/routes/api/admin/plugins/updates.mjs +45 -44
  85. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  86. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +45 -44
  87. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  88. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +3 -3
  89. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +45 -44
  90. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  91. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +3 -3
  92. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +2 -2
  93. package/dist/astro/routes/api/admin/users/_id_/index.mjs +8 -8
  94. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +5 -5
  95. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs.map +1 -1
  96. package/dist/astro/routes/api/admin/users/index.mjs +7 -7
  97. package/dist/astro/routes/api/auth/dev-bypass.mjs +6 -6
  98. package/dist/astro/routes/api/auth/invite/accept.mjs +2 -2
  99. package/dist/astro/routes/api/auth/invite/complete.mjs +12 -12
  100. package/dist/astro/routes/api/auth/invite/index.mjs +10 -10
  101. package/dist/astro/routes/api/auth/invite/index.mjs.map +1 -1
  102. package/dist/astro/routes/api/auth/invite/register-options.mjs +11 -11
  103. package/dist/astro/routes/api/auth/logout.mjs +3 -3
  104. package/dist/astro/routes/api/auth/magic-link/send.mjs +12 -12
  105. package/dist/astro/routes/api/auth/magic-link/send.mjs.map +1 -1
  106. package/dist/astro/routes/api/auth/magic-link/verify.mjs +3 -3
  107. package/dist/astro/routes/api/auth/me.mjs +8 -8
  108. package/dist/astro/routes/api/auth/mode.mjs +3 -3
  109. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +4 -4
  110. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  111. package/dist/astro/routes/api/auth/passkey/_id_.mjs +7 -7
  112. package/dist/astro/routes/api/auth/passkey/index.mjs +2 -2
  113. package/dist/astro/routes/api/auth/passkey/options.mjs +13 -13
  114. package/dist/astro/routes/api/auth/passkey/register/options.mjs +11 -11
  115. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +12 -12
  116. package/dist/astro/routes/api/auth/passkey/verify.mjs +12 -12
  117. package/dist/astro/routes/api/auth/signup/complete.mjs +12 -12
  118. package/dist/astro/routes/api/auth/signup/request.mjs +12 -12
  119. package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -1
  120. package/dist/astro/routes/api/auth/signup/verify.mjs +2 -2
  121. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +18 -18
  122. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs.map +1 -1
  123. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +15 -15
  124. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +3 -3
  125. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +4 -4
  126. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +4 -4
  127. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +3 -3
  128. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +13 -13
  129. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +9 -9
  130. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +18 -18
  131. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +18 -18
  132. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +4 -4
  133. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +3 -3
  134. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +9 -9
  135. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +16 -16
  136. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +3 -3
  137. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +4 -4
  138. package/dist/astro/routes/api/content/_collection_/_id_.mjs +9 -9
  139. package/dist/astro/routes/api/content/_collection_/authors.mjs +3 -3
  140. package/dist/astro/routes/api/content/_collection_/index.mjs +9 -9
  141. package/dist/astro/routes/api/content/_collection_/trash.mjs +8 -8
  142. package/dist/astro/routes/api/dashboard.mjs +9 -9
  143. package/dist/astro/routes/api/dev/emails.mjs +3 -3
  144. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  145. package/dist/astro/routes/api/import/probe.mjs +19 -19
  146. package/dist/astro/routes/api/import/wordpress/analyze.mjs +4 -4
  147. package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -11
  148. package/dist/astro/routes/api/import/wordpress/execute.mjs +15 -15
  149. package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -10
  150. package/dist/astro/routes/api/import/wordpress/media.mjs +10 -10
  151. package/dist/astro/routes/api/import/wordpress/prepare.mjs +11 -11
  152. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +11 -11
  153. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +12 -12
  154. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  155. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +19 -19
  156. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +11 -11
  157. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +27 -27
  158. package/dist/astro/routes/api/manifest.mjs +5 -5
  159. package/dist/astro/routes/api/mcp.mjs +42 -42
  160. package/dist/astro/routes/api/media/_id_/confirm.mjs +10 -10
  161. package/dist/astro/routes/api/media/_id_/upload.mjs +6 -6
  162. package/dist/astro/routes/api/media/_id_/usage.mjs +14 -14
  163. package/dist/astro/routes/api/media/_id_.mjs +13 -13
  164. package/dist/astro/routes/api/media/file/_...key_.mjs +2 -2
  165. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +3 -3
  166. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +3 -3
  167. package/dist/astro/routes/api/media/providers/index.mjs +3 -3
  168. package/dist/astro/routes/api/media/upload-url.mjs +9 -9
  169. package/dist/astro/routes/api/media.mjs +13 -13
  170. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +11 -11
  171. package/dist/astro/routes/api/menus/_name_/items.mjs +11 -11
  172. package/dist/astro/routes/api/menus/_name_/reorder.mjs +11 -11
  173. package/dist/astro/routes/api/menus/_name_/translations.mjs +11 -11
  174. package/dist/astro/routes/api/menus/_name_.mjs +11 -11
  175. package/dist/astro/routes/api/menus/index.mjs +11 -11
  176. package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
  177. package/dist/astro/routes/api/oauth/device/authorize.mjs +6 -6
  178. package/dist/astro/routes/api/oauth/device/code.mjs +9 -9
  179. package/dist/astro/routes/api/oauth/device/token.mjs +8 -8
  180. package/dist/astro/routes/api/oauth/register.mjs +3 -3
  181. package/dist/astro/routes/api/oauth/token/refresh.mjs +6 -6
  182. package/dist/astro/routes/api/oauth/token/revoke.mjs +6 -6
  183. package/dist/astro/routes/api/oauth/token.mjs +6 -6
  184. package/dist/astro/routes/api/openapi.json.mjs +36 -5
  185. package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
  186. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +5 -5
  187. package/dist/astro/routes/api/redirects/404s/index.mjs +12 -12
  188. package/dist/astro/routes/api/redirects/404s/summary.mjs +12 -12
  189. package/dist/astro/routes/api/redirects/_id_.mjs +14 -13
  190. package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
  191. package/dist/astro/routes/api/redirects/index.mjs +14 -13
  192. package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
  193. package/dist/astro/routes/api/relations/_id_/index.mjs +18 -18
  194. package/dist/astro/routes/api/relations/_id_/translations.mjs +13 -13
  195. package/dist/astro/routes/api/relations/index.mjs +18 -18
  196. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +3 -3
  197. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +4 -4
  198. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +45 -44
  199. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  200. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +45 -44
  201. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  202. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +45 -44
  203. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  204. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +45 -44
  205. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  206. package/dist/astro/routes/api/schema/collections/index.mjs +45 -44
  207. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  208. package/dist/astro/routes/api/schema/collections/reorder.d.mts +8 -0
  209. package/dist/astro/routes/api/schema/collections/reorder.d.mts.map +1 -0
  210. package/dist/astro/routes/api/schema/collections/reorder.mjs +66 -0
  211. package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -0
  212. package/dist/astro/routes/api/schema/index.mjs +11 -9
  213. package/dist/astro/routes/api/schema/index.mjs.map +1 -1
  214. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +45 -44
  215. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  216. package/dist/astro/routes/api/schema/orphans/index.mjs +45 -44
  217. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  218. package/dist/astro/routes/api/search/enable.d.mts +1 -0
  219. package/dist/astro/routes/api/search/enable.d.mts.map +1 -1
  220. package/dist/astro/routes/api/search/enable.mjs +17 -13
  221. package/dist/astro/routes/api/search/enable.mjs.map +1 -1
  222. package/dist/astro/routes/api/search/index.mjs +11 -11
  223. package/dist/astro/routes/api/search/rebuild.mjs +13 -13
  224. package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
  225. package/dist/astro/routes/api/search/stats.mjs +7 -7
  226. package/dist/astro/routes/api/search/suggest.mjs +11 -11
  227. package/dist/astro/routes/api/sections/_slug_.mjs +11 -11
  228. package/dist/astro/routes/api/sections/index.mjs +11 -11
  229. package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -7
  230. package/dist/astro/routes/api/settings/backups/archives/index.mjs +6 -6
  231. package/dist/astro/routes/api/settings/backups/export.mjs +7 -7
  232. package/dist/astro/routes/api/settings/backups/index.mjs +8 -8
  233. package/dist/astro/routes/api/settings/email.mjs +5 -5
  234. package/dist/astro/routes/api/settings.mjs +16 -16
  235. package/dist/astro/routes/api/setup/admin-verify.mjs +13 -13
  236. package/dist/astro/routes/api/setup/admin.mjs +12 -12
  237. package/dist/astro/routes/api/setup/dev-bypass.mjs +30 -30
  238. package/dist/astro/routes/api/setup/dev-reset.mjs +3 -3
  239. package/dist/astro/routes/api/setup/index.mjs +32 -32
  240. package/dist/astro/routes/api/setup/status.mjs +4 -4
  241. package/dist/astro/routes/api/snapshot.mjs +9 -9
  242. package/dist/astro/routes/api/taxonomies/_name_/reorder.d.mts +8 -0
  243. package/dist/astro/routes/api/taxonomies/_name_/reorder.d.mts.map +1 -0
  244. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +43 -0
  245. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -0
  246. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +16 -16
  247. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +16 -16
  248. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +16 -16
  249. package/dist/astro/routes/api/taxonomies/index.mjs +16 -16
  250. package/dist/astro/routes/api/themes/preview.mjs +7 -7
  251. package/dist/astro/routes/api/typegen.mjs +5 -5
  252. package/dist/astro/routes/api/well-known/auth.mjs +2 -2
  253. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
  254. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
  255. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +8 -8
  256. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +11 -11
  257. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +11 -11
  258. package/dist/astro/routes/api/widget-areas/_name_.mjs +6 -6
  259. package/dist/astro/routes/api/widget-areas/index.mjs +11 -11
  260. package/dist/astro/routes/api/widget-components.mjs +3 -3
  261. package/dist/astro/routes/robots.txt.mjs +9 -9
  262. package/dist/astro/routes/sitemap-_collection_.xml.mjs +12 -12
  263. package/dist/astro/routes/sitemap.xml.mjs +10 -10
  264. package/dist/astro/types.d.mts +19 -13
  265. package/dist/astro/types.d.mts.map +1 -1
  266. package/dist/auth/providers/github.d.mts +1 -1
  267. package/dist/auth/providers/google.d.mts +1 -1
  268. package/dist/{authorize-R5iYYrpa.mjs → authorize-qRhWQnel.mjs} +2 -2
  269. package/dist/{authorize-R5iYYrpa.mjs.map → authorize-qRhWQnel.mjs.map} +1 -1
  270. package/dist/{backup-LpQ1V_sR.mjs → backup-CtA6LDNw.mjs} +5 -5
  271. package/dist/{backup-LpQ1V_sR.mjs.map → backup-CtA6LDNw.mjs.map} +1 -1
  272. package/dist/{byline-C5TAqs8N.mjs → byline-Cp6csL84.mjs} +9 -9
  273. package/dist/{byline-C5TAqs8N.mjs.map → byline-Cp6csL84.mjs.map} +1 -1
  274. package/dist/{byline-fields-T9ZLZMxJ.mjs → byline-fields-CNc0Yq5i.mjs} +2 -2
  275. package/dist/{byline-fields-T9ZLZMxJ.mjs.map → byline-fields-CNc0Yq5i.mjs.map} +1 -1
  276. package/dist/{byline-registry-BCuOp4UF.mjs → byline-registry-ZkPKqEwC.mjs} +4 -4
  277. package/dist/{byline-registry-BCuOp4UF.mjs.map → byline-registry-ZkPKqEwC.mjs.map} +1 -1
  278. package/dist/{bylines-B8-WGdja.mjs → bylines-CEj5CdT4.mjs} +7 -7
  279. package/dist/{bylines-B8-WGdja.mjs.map → bylines-CEj5CdT4.mjs.map} +1 -1
  280. package/dist/{bylines-DGuqBLjV.mjs → bylines-cf-C9lmF.mjs} +4 -4
  281. package/dist/{bylines-DGuqBLjV.mjs.map → bylines-cf-C9lmF.mjs.map} +1 -1
  282. package/dist/cache-C9FptTFR.mjs +108 -0
  283. package/dist/cache-C9FptTFR.mjs.map +1 -0
  284. package/dist/{challenge-store-BFzgFRog.mjs → challenge-store-D9VNKELo.mjs} +1 -1
  285. package/dist/{challenge-store-BFzgFRog.mjs.map → challenge-store-D9VNKELo.mjs.map} +1 -1
  286. package/dist/{chunks-D5dlPeRb.mjs → chunks-DbYzib_k.mjs} +2 -2
  287. package/dist/{chunks-D5dlPeRb.mjs.map → chunks-DbYzib_k.mjs.map} +1 -1
  288. package/dist/cli/index.mjs +40 -32
  289. package/dist/cli/index.mjs.map +1 -1
  290. package/dist/client/cf-access.d.mts +1 -1
  291. package/dist/client/index.d.mts +1 -1
  292. package/dist/client/index.mjs +2 -2
  293. package/dist/{comment-DnTxxVHv.mjs → comment-BIkJ6Fil.mjs} +3 -3
  294. package/dist/{comment-DnTxxVHv.mjs.map → comment-BIkJ6Fil.mjs.map} +1 -1
  295. package/dist/{comment-reaction-BUlUz2bh.mjs → comment-reaction-D-laEceb.mjs} +2 -2
  296. package/dist/{comment-reaction-BUlUz2bh.mjs.map → comment-reaction-D-laEceb.mjs.map} +1 -1
  297. package/dist/{comments-QPKgK3nk.mjs → comments-0_w6KChA.mjs} +3 -3
  298. package/dist/{comments-QPKgK3nk.mjs.map → comments-0_w6KChA.mjs.map} +1 -1
  299. package/dist/{components-DZkL4Fx0.mjs → components-BPxrRjpE.mjs} +1 -1
  300. package/dist/{components-DZkL4Fx0.mjs.map → components-BPxrRjpE.mjs.map} +1 -1
  301. package/dist/{content-CpfKV9QE.mjs → content-CJ94NEx5.mjs} +165 -112
  302. package/dist/content-CJ94NEx5.mjs.map +1 -0
  303. package/dist/{content-refresh-DgqUBeTv.mjs → content-refresh-Xw7aKmou.mjs} +6 -6
  304. package/dist/{content-refresh-DgqUBeTv.mjs.map → content-refresh-Xw7aKmou.mjs.map} +1 -1
  305. package/dist/{context-kO4YZB03.mjs → context-C_1nrqnW.mjs} +14 -14
  306. package/dist/{context-kO4YZB03.mjs.map → context-C_1nrqnW.mjs.map} +1 -1
  307. package/dist/{cron-BlKIMD_e.mjs → cron-DRV-UC4K.mjs} +1 -1
  308. package/dist/{cron-BlKIMD_e.mjs.map → cron-DRV-UC4K.mjs.map} +1 -1
  309. package/dist/{dashboard-DoBwPnON.mjs → dashboard-DINnNVVU.mjs} +5 -5
  310. package/dist/{dashboard-DoBwPnON.mjs.map → dashboard-DINnNVVU.mjs.map} +1 -1
  311. package/dist/db/index.d.mts +3 -3
  312. package/dist/db/index.mjs +2 -2
  313. package/dist/db/index.mjs.map +1 -1
  314. package/dist/db/libsql.d.mts +1 -1
  315. package/dist/db/postgres.d.mts +1 -1
  316. package/dist/db/sqlite.d.mts +1 -1
  317. package/dist/{default-C4v9KP56.mjs → default-BD2FG0xV.mjs} +1 -1
  318. package/dist/{default-C4v9KP56.mjs.map → default-BD2FG0xV.mjs.map} +1 -1
  319. package/dist/deferred-tasks-C-WRCcKo.d.mts +9 -0
  320. package/dist/deferred-tasks-C-WRCcKo.d.mts.map +1 -0
  321. package/dist/{device-flow-DhUsyJU6.mjs → device-flow-CTqd8mud.mjs} +5 -5
  322. package/dist/{device-flow-DhUsyJU6.mjs.map → device-flow-CTqd8mud.mjs.map} +1 -1
  323. package/dist/{dialect-helpers-DFwyWjTM.mjs → dialect-helpers-BSbfaO3F.mjs} +24 -16
  324. package/dist/dialect-helpers-BSbfaO3F.mjs.map +1 -0
  325. package/dist/{email-console-C-9Ng8DM.mjs → email-console-C6WdcWbL.mjs} +1 -1
  326. package/dist/{email-console-C-9Ng8DM.mjs.map → email-console-C6WdcWbL.mjs.map} +1 -1
  327. package/dist/{error-DmmN74gW.mjs → error-oh_9i6bR.mjs} +3 -3
  328. package/dist/{error-DmmN74gW.mjs.map → error-oh_9i6bR.mjs.map} +1 -1
  329. package/dist/{errors-DtEXIQQV.mjs → errors-BucQ8VYz.mjs} +2 -1
  330. package/dist/errors-BucQ8VYz.mjs.map +1 -0
  331. package/dist/{escape-CdW31WsG.mjs → escape-CXps5F_v.mjs} +1 -1
  332. package/dist/{escape-CdW31WsG.mjs.map → escape-CXps5F_v.mjs.map} +1 -1
  333. package/dist/{field-defs-cache-QMVnzTH6.mjs → field-defs-cache-WD82dMQq.mjs} +4 -4
  334. package/dist/{field-defs-cache-QMVnzTH6.mjs.map → field-defs-cache-WD82dMQq.mjs.map} +1 -1
  335. package/dist/{fts-manager-vncsZIJm.mjs → fts-manager-BITakW_R.mjs} +37 -13
  336. package/dist/fts-manager-BITakW_R.mjs.map +1 -0
  337. package/dist/{hash-Cb7U1b5M.mjs → hash-Cg0TXJPV.mjs} +1 -1
  338. package/dist/{hash-Cb7U1b5M.mjs.map → hash-Cg0TXJPV.mjs.map} +1 -1
  339. package/dist/{hreflang-CZbSx6Bg.d.mts → hreflang-BaLCNcDx.d.mts} +2 -2
  340. package/dist/{hreflang-CZbSx6Bg.d.mts.map → hreflang-BaLCNcDx.d.mts.map} +1 -1
  341. package/dist/{hreflang-Bg-zMpkr.mjs → hreflang-BdZuVBhL.mjs} +6 -6
  342. package/dist/{hreflang-Bg-zMpkr.mjs.map → hreflang-BdZuVBhL.mjs.map} +1 -1
  343. package/dist/{import-PKhLeXvn.mjs → import-C-9uqyT3.mjs} +6 -6
  344. package/dist/{import-PKhLeXvn.mjs.map → import-C-9uqyT3.mjs.map} +1 -1
  345. package/dist/{index-j9rTh3cp.d.mts → index-M37iz29I.d.mts} +75 -35
  346. package/dist/index-M37iz29I.d.mts.map +1 -0
  347. package/dist/{index-BeNto_Vs.d.mts → index-MGw47uWq.d.mts} +3 -3
  348. package/dist/{index-BeNto_Vs.d.mts.map → index-MGw47uWq.d.mts.map} +1 -1
  349. package/dist/index.d.mts +19 -19
  350. package/dist/index.mjs +68 -66
  351. package/dist/{load-BwTdWE8B.mjs → load-DV1DZuUJ.mjs} +2 -2
  352. package/dist/{load-BwTdWE8B.mjs.map → load-DV1DZuUJ.mjs.map} +1 -1
  353. package/dist/{loader-C1XOLV5b.mjs → loader-CGugY7Zl.mjs} +29 -15
  354. package/dist/loader-CGugY7Zl.mjs.map +1 -0
  355. package/dist/{manifest-schema-bCq54i7F.mjs → manifest-schema-Da7kj23y.mjs} +1 -1
  356. package/dist/{manifest-schema-bCq54i7F.mjs.map → manifest-schema-Da7kj23y.mjs.map} +1 -1
  357. package/dist/media/index.d.mts +1 -1
  358. package/dist/media/local-runtime.d.mts +12 -12
  359. package/dist/media/local-runtime.mjs +8 -8
  360. package/dist/{media-tQDZEdu7.mjs → media-BP7S-nHT.mjs} +2 -2
  361. package/dist/{media-tQDZEdu7.mjs.map → media-BP7S-nHT.mjs.map} +1 -1
  362. package/dist/{media-DWIzoVFL.mjs → media-OhYL-7Io.mjs} +1 -1
  363. package/dist/{media-DWIzoVFL.mjs.map → media-OhYL-7Io.mjs.map} +1 -1
  364. package/dist/{media-allowlist-B7TPD6aq.mjs → media-allowlist-D-peH1H5.mjs} +1 -1
  365. package/dist/{media-allowlist-B7TPD6aq.mjs.map → media-allowlist-D-peH1H5.mjs.map} +1 -1
  366. package/dist/{media-upload-Bc9Nc5Zf.mjs → media-upload-DtrwU2B0.mjs} +7 -7
  367. package/dist/{media-upload-Bc9Nc5Zf.mjs.map → media-upload-DtrwU2B0.mjs.map} +1 -1
  368. package/dist/{media-url-BCm5vBn6.mjs → media-url-DYs_YLOx.mjs} +1 -1
  369. package/dist/{media-url-BCm5vBn6.mjs.map → media-url-DYs_YLOx.mjs.map} +1 -1
  370. package/dist/{media-usage-DPJcNaAq.mjs → media-usage-BlxfTkN0.mjs} +8 -8
  371. package/dist/{media-usage-DPJcNaAq.mjs.map → media-usage-BlxfTkN0.mjs.map} +1 -1
  372. package/dist/{menus-BxPLFfIc.mjs → menus-BcQWxeXu.mjs} +4 -4
  373. package/dist/{menus-BxPLFfIc.mjs.map → menus-BcQWxeXu.mjs.map} +1 -1
  374. package/dist/{menus-C6qhqP4X.mjs → menus-Y54RDPIN.mjs} +215 -38
  375. package/dist/menus-Y54RDPIN.mjs.map +1 -0
  376. package/dist/{mode-fiXRMfeA.mjs → mode-BWyTBe3I.mjs} +1 -1
  377. package/dist/{mode-fiXRMfeA.mjs.map → mode-BWyTBe3I.mjs.map} +1 -1
  378. package/dist/{oauth-authorization-C9tFinly.mjs → oauth-authorization-ClvktmrL.mjs} +5 -5
  379. package/dist/{oauth-authorization-C9tFinly.mjs.map → oauth-authorization-ClvktmrL.mjs.map} +1 -1
  380. package/dist/{oauth-clients-BwTxE1aE.mjs → oauth-clients-8ao-U66l.mjs} +1 -1
  381. package/dist/{oauth-clients-BwTxE1aE.mjs.map → oauth-clients-8ao-U66l.mjs.map} +1 -1
  382. package/dist/{oauth-state-store-DaRUwPWO.mjs → oauth-state-store-B1ofdTiQ.mjs} +1 -1
  383. package/dist/{oauth-state-store-DaRUwPWO.mjs.map → oauth-state-store-B1ofdTiQ.mjs.map} +1 -1
  384. package/dist/{oauth-user-lookup-CzuzOSlF.mjs → oauth-user-lookup-CscEuIiR.mjs} +1 -1
  385. package/dist/{oauth-user-lookup-CzuzOSlF.mjs.map → oauth-user-lookup-CscEuIiR.mjs.map} +1 -1
  386. package/dist/object-cache/memory.d.mts +1 -1
  387. package/dist/{object-cache-Bok5j2ae.mjs → object-cache-71tPfV4A.mjs} +106 -5
  388. package/dist/object-cache-71tPfV4A.mjs.map +1 -0
  389. package/dist/{options-aeIs8WFu.d.mts → options-CA4eVX6P.d.mts} +3 -3
  390. package/dist/{options-aeIs8WFu.d.mts.map → options-CA4eVX6P.d.mts.map} +1 -1
  391. package/dist/{options-BlmBHTvX.mjs → options-CBXIHUoT.mjs} +1 -1
  392. package/dist/{options-BlmBHTvX.mjs.map → options-CBXIHUoT.mjs.map} +1 -1
  393. package/dist/page/index.d.mts +2 -2
  394. package/dist/{parse-BL49yb9D.mjs → parse-CJKNuewM.mjs} +2 -2
  395. package/dist/{parse-BL49yb9D.mjs.map → parse-CJKNuewM.mjs.map} +1 -1
  396. package/dist/{passkey-config-KMhgFjdQ.mjs → passkey-config-D-zrzMJI.mjs} +1 -1
  397. package/dist/{passkey-config-KMhgFjdQ.mjs.map → passkey-config-D-zrzMJI.mjs.map} +1 -1
  398. package/dist/{placeholder-Dxo5Zt58.d.mts → placeholder-DaeNS-VG.d.mts} +1 -1
  399. package/dist/{placeholder-Dxo5Zt58.d.mts.map → placeholder-DaeNS-VG.d.mts.map} +1 -1
  400. package/dist/plugin-types.d.mts +1 -1
  401. package/dist/plugin-utils.d.mts +10 -10
  402. package/dist/plugins/adapt-sandbox-entry.d.mts +10 -10
  403. package/dist/plugins/adapt-sandbox-entry.mjs +2 -2
  404. package/dist/{portable-text-CNahFfj6.mjs → portable-text-B_kqBmXB.mjs} +1 -1
  405. package/dist/{portable-text-CNahFfj6.mjs.map → portable-text-B_kqBmXB.mjs.map} +1 -1
  406. package/dist/{preview-D4Jnbfx7.mjs → preview-BU6PaLpM.mjs} +2 -2
  407. package/dist/{preview-D4Jnbfx7.mjs.map → preview-BU6PaLpM.mjs.map} +1 -1
  408. package/dist/{public-url-DSGTnJFw.mjs → public-url-Ox9oOlgp.mjs} +14 -3
  409. package/dist/public-url-Ox9oOlgp.mjs.map +1 -0
  410. package/dist/{query-DCiXI7OZ.mjs → query-C5w7PsRQ.mjs} +20 -41
  411. package/dist/query-C5w7PsRQ.mjs.map +1 -0
  412. package/dist/{query-1xOcEy18.mjs → query-rC9HKv1N.mjs} +4 -4
  413. package/dist/{query-1xOcEy18.mjs.map → query-rC9HKv1N.mjs.map} +1 -1
  414. package/dist/{rate-limit-Vkp9gQ1Y.mjs → rate-limit-kug6q99V.mjs} +2 -2
  415. package/dist/{rate-limit-Vkp9gQ1Y.mjs.map → rate-limit-kug6q99V.mjs.map} +1 -1
  416. package/dist/{redirect-BJ6d1yHh.mjs → redirect-DIJxXKOG.mjs} +3 -3
  417. package/dist/{redirect-BJ6d1yHh.mjs.map → redirect-DIJxXKOG.mjs.map} +1 -1
  418. package/dist/{redirect-CDgfv9vh.mjs → redirect-Egf2R9yP.mjs} +1 -1
  419. package/dist/{redirect-CDgfv9vh.mjs.map → redirect-Egf2R9yP.mjs.map} +1 -1
  420. package/dist/{redirects-Cwkq2H-G.mjs → redirects-Bzm812bY.mjs} +5 -5
  421. package/dist/{redirects-Cwkq2H-G.mjs.map → redirects-Bzm812bY.mjs.map} +1 -1
  422. package/dist/{redirects-BOn2DIUs.mjs → redirects-G8wAhWAf.mjs} +20 -6
  423. package/dist/redirects-G8wAhWAf.mjs.map +1 -0
  424. package/dist/{registry-BP1JK2xh.mjs → registry-Dbodb4Uo.mjs} +59 -14
  425. package/dist/registry-Dbodb4Uo.mjs.map +1 -0
  426. package/dist/{relation-DJ5DZh7B.mjs → relation-Cbe3Sd3m.mjs} +3 -3
  427. package/dist/{relation-DJ5DZh7B.mjs.map → relation-Cbe3Sd3m.mjs.map} +1 -1
  428. package/dist/{relations-C4duJnwI.mjs → relations-Bw_E1TXo.mjs} +3 -3
  429. package/dist/{relations-C4duJnwI.mjs.map → relations-Bw_E1TXo.mjs.map} +1 -1
  430. package/dist/{relations-DHFQGX0h.d.mts → relations-G2ta7GIl.d.mts} +36 -9
  431. package/dist/relations-G2ta7GIl.d.mts.map +1 -0
  432. package/dist/{relations-DpTjftCl.mjs → relations-qHwpUe66.mjs} +5 -5
  433. package/dist/{relations-DpTjftCl.mjs.map → relations-qHwpUe66.mjs.map} +1 -1
  434. package/dist/request-context.d.mts +3 -0
  435. package/dist/request-context.d.mts.map +1 -1
  436. package/dist/request-context.mjs.map +1 -1
  437. package/dist/{request-meta-DzXYYI-n.mjs → request-meta-Df-jFbAd.mjs} +2 -2
  438. package/dist/{request-meta-DzXYYI-n.mjs.map → request-meta-Df-jFbAd.mjs.map} +1 -1
  439. package/dist/{resolve-BUvFE0Lr.mjs → resolve-DZzG4HqM.mjs} +1 -1
  440. package/dist/{resolve-BUvFE0Lr.mjs.map → resolve-DZzG4HqM.mjs.map} +1 -1
  441. package/dist/{runner-BsI18UgP.mjs → runner-BFTrkYhu.mjs} +482 -216
  442. package/dist/runner-BFTrkYhu.mjs.map +1 -0
  443. package/dist/{runner-CHdkERbt.d.mts → runner-BaADli8l.d.mts} +2 -2
  444. package/dist/{runner-CHdkERbt.d.mts.map → runner-BaADli8l.d.mts.map} +1 -1
  445. package/dist/runtime.d.mts +11 -11
  446. package/dist/runtime.mjs +3 -3
  447. package/dist/{schema-eqZhkR0S.mjs → schema-CiQXr6_F.mjs} +3 -3
  448. package/dist/{schema-eqZhkR0S.mjs.map → schema-CiQXr6_F.mjs.map} +1 -1
  449. package/dist/{scopes-Be2d8bSb.mjs → scopes-CNJVT5i5.mjs} +3 -3
  450. package/dist/{scopes-Be2d8bSb.mjs.map → scopes-CNJVT5i5.mjs.map} +1 -1
  451. package/dist/{search-CeO678cp.mjs → search-FZhx5dDU.mjs} +6 -6
  452. package/dist/{search-CeO678cp.mjs.map → search-FZhx5dDU.mjs.map} +1 -1
  453. package/dist/{secrets-870d-7yA.mjs → secrets-DLd8RXee.mjs} +4 -4
  454. package/dist/{secrets-870d-7yA.mjs.map → secrets-DLd8RXee.mjs.map} +1 -1
  455. package/dist/{sections-DSuEfirn.mjs → sections-BrIrMUCn.mjs} +3 -3
  456. package/dist/{sections-DSuEfirn.mjs.map → sections-BrIrMUCn.mjs.map} +1 -1
  457. package/dist/seed/index.d.mts +2 -2
  458. package/dist/seed/index.mjs +24 -24
  459. package/dist/seo/index.d.mts +3 -3
  460. package/dist/seo/index.mjs +17 -17
  461. package/dist/{seo-C3GDfT0V.mjs → seo-CobNfOvb.mjs} +2 -2
  462. package/dist/{seo-C3GDfT0V.mjs.map → seo-CobNfOvb.mjs.map} +1 -1
  463. package/dist/{seo-BAPKiED8.mjs → seo-DTHRntNC.mjs} +3 -3
  464. package/dist/{seo-BAPKiED8.mjs.map → seo-DTHRntNC.mjs.map} +1 -1
  465. package/dist/{service-DyFT-k-R.mjs → service-B-pYGPgR.mjs} +4 -4
  466. package/dist/{service-DyFT-k-R.mjs.map → service-B-pYGPgR.mjs.map} +1 -1
  467. package/dist/{session-user-BrK2zz7S.mjs → session-user-BvM9-zNl.mjs} +2 -2
  468. package/dist/{session-user-BrK2zz7S.mjs.map → session-user-BvM9-zNl.mjs.map} +1 -1
  469. package/dist/{settings-CREKyj8I.mjs → settings-DPHau-WH.mjs} +3 -3
  470. package/dist/{settings-CREKyj8I.mjs.map → settings-DPHau-WH.mjs.map} +1 -1
  471. package/dist/{settings-DgKouY2S.mjs → settings-kJhGiQ4z.mjs} +7 -7
  472. package/dist/{settings-DgKouY2S.mjs.map → settings-kJhGiQ4z.mjs.map} +1 -1
  473. package/dist/{setup-complete-L7bMK2VI.mjs → setup-complete-u50Qm8rY.mjs} +2 -2
  474. package/dist/{setup-complete-L7bMK2VI.mjs.map → setup-complete-u50Qm8rY.mjs.map} +1 -1
  475. package/dist/{setup-nonce-Ct5tjWcq.mjs → setup-nonce-DCjiiOD2.mjs} +1 -1
  476. package/dist/{setup-nonce-Ct5tjWcq.mjs.map → setup-nonce-DCjiiOD2.mjs.map} +1 -1
  477. package/dist/{single-flight-cache-C2exrGAi.mjs → single-flight-cache-DW3w11Pu.mjs} +1 -1
  478. package/dist/{single-flight-cache-C2exrGAi.mjs.map → single-flight-cache-DW3w11Pu.mjs.map} +1 -1
  479. package/dist/site-url-I-lJ5kma.mjs +16 -0
  480. package/dist/site-url-I-lJ5kma.mjs.map +1 -0
  481. package/dist/{snapshot-BdpUJKD-.mjs → snapshot-I_fjLDaD.mjs} +2 -2
  482. package/dist/{snapshot-BdpUJKD-.mjs.map → snapshot-I_fjLDaD.mjs.map} +1 -1
  483. package/dist/{ssrf-CviKqWmq.mjs → ssrf-CTa6v21i.mjs} +1 -1
  484. package/dist/{ssrf-CviKqWmq.mjs.map → ssrf-CTa6v21i.mjs.map} +1 -1
  485. package/dist/{state-xxv6ZTMv.mjs → state-CQvoefYP.mjs} +1 -1
  486. package/dist/{state-xxv6ZTMv.mjs.map → state-CQvoefYP.mjs.map} +1 -1
  487. package/dist/{status-COfycGIU.mjs → status-CIsmlC1E.mjs} +1 -1
  488. package/dist/{status-COfycGIU.mjs.map → status-CIsmlC1E.mjs.map} +1 -1
  489. package/dist/storage/local.d.mts +1 -1
  490. package/dist/storage/local.mjs +1 -1
  491. package/dist/storage/s3.d.mts +1 -1
  492. package/dist/storage/s3.mjs +1 -1
  493. package/dist/{taxonomies-Dbdki3Un.mjs → taxonomies-CKuaZER5.mjs} +85 -5
  494. package/dist/taxonomies-CKuaZER5.mjs.map +1 -0
  495. package/dist/{taxonomies-B61CRSha.mjs → taxonomies-CLN1N92E.mjs} +16 -17
  496. package/dist/taxonomies-CLN1N92E.mjs.map +1 -0
  497. package/dist/{taxonomy-DvwWAPvA.mjs → taxonomy-pOrB2kZe.mjs} +142 -15
  498. package/dist/taxonomy-pOrB2kZe.mjs.map +1 -0
  499. package/dist/{tokens-DVltpO2D.mjs → tokens-DagaJGK8.mjs} +1 -1
  500. package/dist/{tokens-DVltpO2D.mjs.map → tokens-DagaJGK8.mjs.map} +1 -1
  501. package/dist/{transaction-D0FOsb3X.mjs → transaction-NQj4VJ7Z.mjs} +1 -1
  502. package/dist/{transaction-D0FOsb3X.mjs.map → transaction-NQj4VJ7Z.mjs.map} +1 -1
  503. package/dist/{transport-DokJOScS.d.mts → transport-CAwTaTp_.d.mts} +1 -1
  504. package/dist/{transport-DokJOScS.d.mts.map → transport-CAwTaTp_.d.mts.map} +1 -1
  505. package/dist/{transport-BWQo0Foy.mjs → transport-DVsa5YYo.mjs} +1 -1
  506. package/dist/{transport-BWQo0Foy.mjs.map → transport-DVsa5YYo.mjs.map} +1 -1
  507. package/dist/{trusted-proxy-CwjQj0YG.mjs → trusted-proxy-D20_7fyX.mjs} +1 -1
  508. package/dist/{trusted-proxy-CwjQj0YG.mjs.map → trusted-proxy-D20_7fyX.mjs.map} +1 -1
  509. package/dist/{types-DqZVPILm.d.mts → types-BGWPMiBO.d.mts} +2 -2
  510. package/dist/{types-DqZVPILm.d.mts.map → types-BGWPMiBO.d.mts.map} +1 -1
  511. package/dist/{types-DsAMyD_o.d.mts → types-BK6U01Ro.d.mts} +1 -1
  512. package/dist/{types-DsAMyD_o.d.mts.map → types-BK6U01Ro.d.mts.map} +1 -1
  513. package/dist/{types-BD40g7zz.mjs → types-BjxTKxrZ.mjs} +1 -1
  514. package/dist/{types-BD40g7zz.mjs.map → types-BjxTKxrZ.mjs.map} +1 -1
  515. package/dist/{types-jISEalTX.d.mts → types-BnFP1M3J.d.mts} +22 -1
  516. package/dist/types-BnFP1M3J.d.mts.map +1 -0
  517. package/dist/{types-Dr2GLlwu.d.mts → types-C8oz_ayJ.d.mts} +1 -1
  518. package/dist/{types-Dr2GLlwu.d.mts.map → types-C8oz_ayJ.d.mts.map} +1 -1
  519. package/dist/{types-C9P3ysxq.d.mts → types-CbUcuxxc.d.mts} +1 -1
  520. package/dist/{types-C9P3ysxq.d.mts.map → types-CbUcuxxc.d.mts.map} +1 -1
  521. package/dist/{types-XrQQ-Aex.mjs → types-Cd8iuS1J.mjs} +10 -3
  522. package/dist/{types-XrQQ-Aex.mjs.map → types-Cd8iuS1J.mjs.map} +1 -1
  523. package/dist/types-CtzytVXn.mjs +18 -0
  524. package/dist/types-CtzytVXn.mjs.map +1 -0
  525. package/dist/{types-BQY7VYw6.d.mts → types-Cz8hNch2.d.mts} +5 -5
  526. package/dist/{types-BQY7VYw6.d.mts.map → types-Cz8hNch2.d.mts.map} +1 -1
  527. package/dist/{types-CcSZCcF1.d.mts → types-DLG4IFEQ.d.mts} +1 -1
  528. package/dist/{types-CcSZCcF1.d.mts.map → types-DLG4IFEQ.d.mts.map} +1 -1
  529. package/dist/{types-84Bque3-.d.mts → types-Dc4ntQjQ.d.mts} +10 -1
  530. package/dist/types-Dc4ntQjQ.d.mts.map +1 -0
  531. package/dist/{types-DQLZ58GV.d.mts → types-LoagAGzH.d.mts} +1 -1
  532. package/dist/{types-DQLZ58GV.d.mts.map → types-LoagAGzH.d.mts.map} +1 -1
  533. package/dist/{types-o7xo7VgH.mjs → types-NBI3rF-_.mjs} +3 -2
  534. package/dist/types-NBI3rF-_.mjs.map +1 -0
  535. package/dist/{upload-attempts-C5yd6Gae.mjs → upload-attempts-D8QAFLUJ.mjs} +1 -1
  536. package/dist/{upload-attempts-C5yd6Gae.mjs.map → upload-attempts-D8QAFLUJ.mjs.map} +1 -1
  537. package/dist/{user-BAumEmpA.mjs → user-DBrq4UVq.mjs} +3 -3
  538. package/dist/{user-BAumEmpA.mjs.map → user-DBrq4UVq.mjs.map} +1 -1
  539. package/dist/{utils-BbUgmeZG.mjs → utils-hLzi_2Fn.mjs} +2 -2
  540. package/dist/{utils-BbUgmeZG.mjs.map → utils-hLzi_2Fn.mjs.map} +1 -1
  541. package/dist/{validate-VPnKoIzW.mjs → validate-BpwoDOgt.mjs} +25 -2
  542. package/dist/validate-BpwoDOgt.mjs.map +1 -0
  543. package/dist/{validate-CdYcY-Ln.d.mts → validate-C3oSmA7F.d.mts} +15 -5
  544. package/dist/validate-C3oSmA7F.d.mts.map +1 -0
  545. package/dist/{validate-Bs_wT2ul.mjs → validate-mKo3RxBM.mjs} +3 -3
  546. package/dist/{validate-Bs_wT2ul.mjs.map → validate-mKo3RxBM.mjs.map} +1 -1
  547. package/dist/{validation-BngR0nit.mjs → validation-BgpucsvF.mjs} +10 -10
  548. package/dist/{validation-BngR0nit.mjs.map → validation-BgpucsvF.mjs.map} +1 -1
  549. package/dist/version-C4PnpmoV.mjs +7 -0
  550. package/dist/{version-Bdfb34kk.mjs.map → version-C4PnpmoV.mjs.map} +1 -1
  551. package/dist/{widgets-L-VndTKD.mjs → widgets-CJJtkiKh.mjs} +3 -3
  552. package/dist/{widgets-L-VndTKD.mjs.map → widgets-CJJtkiKh.mjs.map} +1 -1
  553. package/dist/{wxr-taxonomies-BexjtNid.mjs → wxr-taxonomies-9PPSy8X6.mjs} +4 -4
  554. package/dist/{wxr-taxonomies-BexjtNid.mjs.map → wxr-taxonomies-9PPSy8X6.mjs.map} +1 -1
  555. package/dist/{wxr-taxonomies-DueaLFd9.d.mts → wxr-taxonomies-Bkpp_2tK.d.mts} +1 -1
  556. package/dist/{wxr-taxonomies-DueaLFd9.d.mts.map → wxr-taxonomies-Bkpp_2tK.d.mts.map} +1 -1
  557. package/dist/{zod-generator-DMzfga3g.mjs → zod-generator-CG64Hnbh.mjs} +3 -3
  558. package/dist/{zod-generator-DMzfga3g.mjs.map → zod-generator-CG64Hnbh.mjs.map} +1 -1
  559. package/package.json +11 -8
  560. package/src/after.ts +6 -1
  561. package/src/api/errors.ts +1 -0
  562. package/src/api/handlers/content.ts +45 -4
  563. package/src/api/handlers/marketplace.ts +14 -0
  564. package/src/api/handlers/registry.ts +14 -0
  565. package/src/api/handlers/revision.ts +19 -5
  566. package/src/api/handlers/schema.ts +37 -0
  567. package/src/api/handlers/snapshot.ts +1 -1
  568. package/src/api/handlers/taxonomies.ts +101 -1
  569. package/src/api/openapi/document.ts +48 -0
  570. package/src/api/public-url.ts +14 -2
  571. package/src/api/schemas/schema.ts +13 -0
  572. package/src/api/schemas/search.ts +2 -0
  573. package/src/api/schemas/taxonomies.ts +18 -0
  574. package/src/api/site-url.ts +16 -6
  575. package/src/astro/integration/routes.ts +14 -0
  576. package/src/astro/integration/runtime.ts +13 -0
  577. package/src/astro/integration/virtual-modules.ts +2 -0
  578. package/src/astro/middleware/redirect.ts +2 -10
  579. package/src/astro/middleware/scoped-db.ts +35 -4
  580. package/src/astro/middleware.ts +56 -22
  581. package/src/astro/routes/api/admin/comments/[id]/status.ts +1 -1
  582. package/src/astro/routes/api/admin/users/[id]/send-recovery.ts +2 -2
  583. package/src/astro/routes/api/auth/invite/index.ts +2 -2
  584. package/src/astro/routes/api/auth/magic-link/send.ts +2 -2
  585. package/src/astro/routes/api/auth/signup/request.ts +2 -2
  586. package/src/astro/routes/api/comments/[collection]/[contentId]/index.ts +1 -1
  587. package/src/astro/routes/api/schema/collections/reorder.ts +31 -0
  588. package/src/astro/routes/api/schema/index.ts +2 -0
  589. package/src/astro/routes/api/search/enable.ts +5 -1
  590. package/src/astro/routes/api/search/rebuild.ts +6 -1
  591. package/src/astro/routes/api/taxonomies/[name]/reorder.ts +41 -0
  592. package/src/astro/types.ts +6 -0
  593. package/src/cleanup.ts +31 -26
  594. package/src/cli/commands/dev.ts +13 -3
  595. package/src/cli/commands/export-seed.ts +2 -0
  596. package/src/cli/index.ts +1 -1
  597. package/src/components/CommentForm.astro +1 -1
  598. package/src/components/Comments.astro +1 -1
  599. package/src/components/InlinePortableTextEditor.tsx +171 -31
  600. package/src/components/OrderedList.astro +14 -0
  601. package/src/components/PortableText.astro +26 -4
  602. package/src/components/index.ts +12 -1
  603. package/src/components/ordered-list.ts +549 -0
  604. package/src/content/converters/numbered-list.ts +148 -0
  605. package/src/content/converters/portable-text-to-prosemirror.ts +59 -9
  606. package/src/content/converters/prosemirror-to-portable-text.ts +23 -12
  607. package/src/content/converters/types.ts +2 -0
  608. package/src/content/portable-text-lists.ts +205 -0
  609. package/src/database/dialect-helpers.ts +3 -22
  610. package/src/database/migrations/055_content_translation_group_locale_index.ts +67 -0
  611. package/src/database/migrations/056_taxonomy_term_sort_order.ts +189 -0
  612. package/src/database/migrations/057_collection_hidden.ts +24 -0
  613. package/src/database/migrations/058_collection_sort_order.ts +20 -0
  614. package/src/database/migrations/059_revision_prune_queue.ts +36 -0
  615. package/src/database/migrations/runner.ts +10 -0
  616. package/src/database/repositories/content.ts +191 -178
  617. package/src/database/repositories/revision.ts +82 -17
  618. package/src/database/repositories/taxonomy.ts +202 -7
  619. package/src/database/repositories/types.ts +7 -0
  620. package/src/database/types.ts +13 -1
  621. package/src/database/validate.ts +39 -0
  622. package/src/db/adapters.ts +8 -0
  623. package/src/deferred-tasks.ts +71 -0
  624. package/src/emdash-runtime.ts +268 -92
  625. package/src/index.ts +2 -0
  626. package/src/loader.ts +46 -24
  627. package/src/media/usage/gc.ts +50 -0
  628. package/src/object-cache/index.ts +160 -3
  629. package/src/plugins/routes.ts +34 -0
  630. package/src/plugins/storage-indexes.ts +50 -11
  631. package/src/query.ts +21 -42
  632. package/src/redirects/cache.ts +79 -19
  633. package/src/request-context.ts +3 -0
  634. package/src/scheduled-publish.ts +6 -1
  635. package/src/schema/registry.ts +95 -3
  636. package/src/schema/types.ts +24 -0
  637. package/src/search/fts-manager.ts +50 -10
  638. package/src/search/index.ts +2 -0
  639. package/src/search/types.ts +6 -0
  640. package/src/seed/apply.ts +22 -2
  641. package/src/seed/types.ts +10 -0
  642. package/src/taxonomies/index.ts +11 -7
  643. package/src/taxonomies/term-counts.ts +2 -4
  644. package/src/ui-comments.ts +19 -0
  645. package/src/ui.ts +11 -3
  646. package/src/virtual-modules.d.ts +8 -0
  647. package/dist/adapters-C0ONzkUP.d.mts.map +0 -1
  648. package/dist/after-B1IIdH3Y.mjs +0 -29
  649. package/dist/after-B1IIdH3Y.mjs.map +0 -1
  650. package/dist/api-DgPbMlng.mjs.map +0 -1
  651. package/dist/apply-1_6ra7NP.mjs.map +0 -1
  652. package/dist/cache-B26cufFd.mjs +0 -65
  653. package/dist/cache-B26cufFd.mjs.map +0 -1
  654. package/dist/content-CpfKV9QE.mjs.map +0 -1
  655. package/dist/dialect-helpers-DFwyWjTM.mjs.map +0 -1
  656. package/dist/errors-DtEXIQQV.mjs.map +0 -1
  657. package/dist/fts-manager-vncsZIJm.mjs.map +0 -1
  658. package/dist/index-j9rTh3cp.d.mts.map +0 -1
  659. package/dist/loader-C1XOLV5b.mjs.map +0 -1
  660. package/dist/menus-C6qhqP4X.mjs.map +0 -1
  661. package/dist/object-cache-Bok5j2ae.mjs.map +0 -1
  662. package/dist/public-url-DSGTnJFw.mjs.map +0 -1
  663. package/dist/query-DCiXI7OZ.mjs.map +0 -1
  664. package/dist/redirects-BOn2DIUs.mjs.map +0 -1
  665. package/dist/registry-BP1JK2xh.mjs.map +0 -1
  666. package/dist/relations-DHFQGX0h.d.mts.map +0 -1
  667. package/dist/runner-BsI18UgP.mjs.map +0 -1
  668. package/dist/site-url-8N3kSyVZ.mjs +0 -13
  669. package/dist/site-url-8N3kSyVZ.mjs.map +0 -1
  670. package/dist/taxonomies-B61CRSha.mjs.map +0 -1
  671. package/dist/taxonomies-Dbdki3Un.mjs.map +0 -1
  672. package/dist/taxonomy-DvwWAPvA.mjs.map +0 -1
  673. package/dist/types-84Bque3-.d.mts.map +0 -1
  674. package/dist/types-jISEalTX.d.mts.map +0 -1
  675. package/dist/types-o7xo7VgH.mjs.map +0 -1
  676. package/dist/validate-CdYcY-Ln.d.mts.map +0 -1
  677. package/dist/validate-VPnKoIzW.mjs.map +0 -1
  678. package/dist/version-Bdfb34kk.mjs +0 -7
  679. /package/dist/{api-tokens-CEsW_jCg.mjs → api-tokens-Dai9dND0.mjs} +0 -0
  680. /package/dist/{ssrf-BB__xfNM.mjs → ssrf-Cj568Dgs.mjs} +0 -0
  681. /package/dist/{types-CK0LxPUQ.mjs → types-DKuWPYV5.mjs} +0 -0
@@ -88,6 +88,7 @@ import {
88
88
  createCollectionBody,
89
89
  createFieldBody,
90
90
  fieldListResponseSchema,
91
+ collectionReorderBody,
91
92
  fieldReorderBody,
92
93
  fieldResponseSchema,
93
94
  orphanedTableListResponseSchema,
@@ -112,10 +113,12 @@ import {
112
113
  import { settingsUpdateBody, siteSettingsSchema } from "../schemas/settings.js";
113
114
  import {
114
115
  createTermBody,
116
+ reorderTermsBody,
115
117
  taxonomyListResponseSchema,
116
118
  termGetResponseSchema,
117
119
  termListQuery,
118
120
  termListResponseSchema,
121
+ termReorderResponseSchema,
119
122
  termResponseSchema,
120
123
  updateTermBody,
121
124
  } from "../schemas/taxonomies.js";
@@ -1062,6 +1065,28 @@ const schemaPaths = {
1062
1065
  },
1063
1066
  },
1064
1067
  },
1068
+ "/_emdash/api/schema/collections/reorder": {
1069
+ post: {
1070
+ operationId: "reorderCollections",
1071
+ summary: "Reorder collections in the admin sidebar",
1072
+ description:
1073
+ "Sets the sidebar order. Collections omitted from the list lose their explicit position and fall back to alphabetical order after the ordered ones.",
1074
+ tags: ["Schema"],
1075
+ requestBody: { content: { [JSON_CONTENT]: { schema: collectionReorderBody } } },
1076
+ responses: {
1077
+ "200": {
1078
+ description: "Reordered",
1079
+ content: {
1080
+ [JSON_CONTENT]: {
1081
+ schema: successEnvelope(z.object({ success: z.literal(true) })),
1082
+ },
1083
+ },
1084
+ },
1085
+ ...authErrors,
1086
+ ...standardErrors(400, 404, 500),
1087
+ },
1088
+ },
1089
+ },
1065
1090
  "/_emdash/api/schema/collections/{slug}/fields/reorder": {
1066
1091
  post: {
1067
1092
  operationId: "reorderFields",
@@ -1320,6 +1345,29 @@ const taxonomyPaths = {
1320
1345
  },
1321
1346
  },
1322
1347
  },
1348
+ "/_emdash/api/taxonomies/{name}/reorder": {
1349
+ post: {
1350
+ operationId: "reorderTerms",
1351
+ summary: "Set the manual order of one sibling group of terms",
1352
+ description:
1353
+ "`ids` names the terms to move, in the desired order, and may be a subset of the group — the listed terms are permuted within the positions they already occupy. A position belongs to a term across every locale, so there is no `locale` parameter. Ordering never reparents — use the term update endpoint to change a parent.",
1354
+ tags: ["Taxonomies"],
1355
+ requestParams: {
1356
+ path: z.object({ name: z.string().meta({ description: "Taxonomy name" }) }),
1357
+ },
1358
+ requestBody: { content: { [JSON_CONTENT]: { schema: reorderTermsBody } } },
1359
+ responses: {
1360
+ "200": {
1361
+ description: "The group in its new order",
1362
+ content: {
1363
+ [JSON_CONTENT]: { schema: successEnvelope(termReorderResponseSchema) },
1364
+ },
1365
+ },
1366
+ ...authErrors,
1367
+ ...standardErrors(400, 404, 500),
1368
+ },
1369
+ },
1370
+ },
1323
1371
  "/_emdash/api/taxonomies/{name}/terms": {
1324
1372
  get: {
1325
1373
  operationId: "listTerms",
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  /** Minimal config shape — avoids importing the full EmDashConfig type tree. */
13
- interface SiteUrlConfig {
13
+ export interface SiteUrlConfig {
14
14
  siteUrl?: string;
15
15
  }
16
16
 
@@ -74,7 +74,19 @@ function getEnvSiteUrl(): string | undefined {
74
74
  * @returns Origin string, e.g. `"https://mysite.example.com"`
75
75
  */
76
76
  export function getPublicOrigin(url: URL, config?: SiteUrlConfig): string {
77
- return config?.siteUrl || getEnvSiteUrl() || url.origin;
77
+ return getConfiguredOrigin(config) || url.origin;
78
+ }
79
+
80
+ /**
81
+ * Return the operator-configured public origin, if any.
82
+ *
83
+ * The first two steps of {@link getPublicOrigin}'s resolution —
84
+ * `config.siteUrl`, then the `EMDASH_SITE_URL`/`SITE_URL` env vars — without
85
+ * the request-URL fallback. For callers that have a more trustworthy fallback
86
+ * than the request (e.g. the stored setup origin used for outbound emails).
87
+ */
88
+ export function getConfiguredOrigin(config?: SiteUrlConfig): string | undefined {
89
+ return config?.siteUrl || getEnvSiteUrl() || undefined;
78
90
  }
79
91
 
80
92
  /**
@@ -86,6 +86,8 @@ export const createCollectionBody = z
86
86
  source: z.string().regex(collectionSourcePattern).optional(),
87
87
  urlPattern: z.string().optional(),
88
88
  hasSeo: z.boolean().optional(),
89
+ hidden: z.boolean().optional(),
90
+ sortOrder: z.number().int().nullish(),
89
91
  })
90
92
  .meta({ id: "CreateCollectionBody" });
91
93
 
@@ -98,6 +100,8 @@ export const updateCollectionBody = z
98
100
  supports: z.array(collectionSupportValues).optional(),
99
101
  urlPattern: z.string().nullish(),
100
102
  hasSeo: z.boolean().optional(),
103
+ hidden: z.boolean().optional(),
104
+ sortOrder: z.number().int().nullish(),
101
105
  commentsEnabled: z.boolean().optional(),
102
106
  commentsModeration: z.enum(["all", "first_time", "none"]).optional(),
103
107
  commentsClosedAfterDays: z.number().int().min(0).optional(),
@@ -144,6 +148,13 @@ export const fieldReorderBody = z
144
148
  })
145
149
  .meta({ id: "FieldReorderBody" });
146
150
 
151
+ export const collectionReorderBody = z
152
+ .object({
153
+ /** Full desired sidebar order. Collections left out fall back to alphabetical. */
154
+ slugs: z.array(z.string().min(1)),
155
+ })
156
+ .meta({ id: "CollectionReorderBody" });
157
+
147
158
  export const orphanRegisterBody = z
148
159
  .object({
149
160
  label: z.string().optional(),
@@ -179,6 +190,8 @@ export const collectionSchema = z
179
190
  source: z.string().nullable(),
180
191
  urlPattern: z.string().nullable(),
181
192
  hasSeo: z.boolean(),
193
+ hidden: z.boolean(),
194
+ sortOrder: z.number().int().nullable(),
182
195
  createdAt: z.string(),
183
196
  updatedAt: z.string(),
184
197
  })
@@ -1,5 +1,6 @@
1
1
  import { z } from "zod";
2
2
 
3
+ import { SEARCH_TOKENIZERS } from "../../search/types.js";
3
4
  import { localeCode } from "./common.js";
4
5
 
5
6
  // ---------------------------------------------------------------------------
@@ -37,6 +38,7 @@ export const searchEnableBody = z
37
38
  collection: z.string().min(1),
38
39
  enabled: z.boolean(),
39
40
  weights: z.record(z.string(), z.number()).optional(),
41
+ tokenize: z.enum(SEARCH_TOKENIZERS).optional(),
40
42
  })
41
43
  .meta({ id: "SearchEnableBody" });
42
44
 
@@ -55,6 +55,20 @@ export const updateTermBody = z
55
55
  })
56
56
  .meta({ id: "UpdateTermBody" });
57
57
 
58
+ export const reorderTermsBody = z
59
+ .object({
60
+ parentId: z.string().min(1).nullish().meta({
61
+ description:
62
+ "Parent term whose children are being ordered (translation_group or row id). Omit or null for the top level, which for a flat taxonomy is every term.",
63
+ }),
64
+ ids: z.array(z.string().min(1)).max(100).meta({
65
+ description:
66
+ "Terms to move, in the desired order — each a row id or translation_group. May be a subset of the group: the listed terms are permuted within the positions they already occupy and every other member keeps its place. An id outside the group is rejected with REORDER_MISMATCH.",
67
+ }),
68
+ })
69
+ .strict()
70
+ .meta({ id: "ReorderTermsBody" });
71
+
58
72
  export const termListQuery = z
59
73
  .object({
60
74
  locale: localeCode.optional(),
@@ -153,6 +167,10 @@ export const termListResponseSchema = z
153
167
 
154
168
  export const termResponseSchema = z.object({ term: termSchema }).meta({ id: "TermResponse" });
155
169
 
170
+ export const termReorderResponseSchema = z
171
+ .object({ reordered: z.literal(true) })
172
+ .meta({ id: "TermReorderResponse" });
173
+
156
174
  export const termGetResponseSchema = z
157
175
  .object({
158
176
  term: termSchema.extend({
@@ -1,19 +1,29 @@
1
1
  /**
2
2
  * Resolve the canonical site base URL for use in outbound links (emails, etc.).
3
3
  *
4
- * Uses the stored `emdash:site_url` (set during setup on the real domain)
5
- * so that Host header spoofing in later requests cannot redirect users to
6
- * attacker-controlled domains.
7
- *
8
- * Falls back to the request URL only if no stored value exists (pre-setup).
4
+ * Precedence mirrors `getPublicOrigin`: the operator-configured origin
5
+ * (`config.siteUrl`, then the `EMDASH_SITE_URL`/`SITE_URL` env vars) wins,
6
+ * then the stored `emdash:site_url` option (written once during setup on the
7
+ * real domain), and only before setup completes does the request URL fill in.
8
+ * A configured or stored value always beats the request, so Host header
9
+ * spoofing cannot redirect users to attacker-controlled domains.
9
10
  */
10
11
 
11
12
  import type { Kysely } from "kysely";
12
13
 
13
14
  import { OptionsRepository } from "../database/repositories/options.js";
14
15
  import type { Database } from "../database/types.js";
16
+ import { getConfiguredOrigin, type SiteUrlConfig } from "./public-url.js";
15
17
 
16
- export async function getSiteBaseUrl(db: Kysely<Database>, request: Request): Promise<string> {
18
+ export async function getSiteBaseUrl(
19
+ db: Kysely<Database>,
20
+ request: Request,
21
+ config?: SiteUrlConfig,
22
+ ): Promise<string> {
23
+ const configured = getConfiguredOrigin(config);
24
+ if (configured) {
25
+ return `${configured}/_emdash`;
26
+ }
17
27
  const options = new OptionsRepository(db);
18
28
  const storedUrl = await options.get<string>("emdash:site_url");
19
29
  if (storedUrl) {
@@ -313,6 +313,15 @@ export function injectCoreRoutes(
313
313
  entrypoint: resolveRoute("api/schema/collections/index.ts"),
314
314
  });
315
315
 
316
+ // Order matters: the static `reorder` route must precede the dynamic
317
+ // `[slug]` route so Astro's resolver dispatches POST
318
+ // /schema/collections/reorder to the reorder handler instead of treating
319
+ // "reorder" as a collection slug.
320
+ injectRoute({
321
+ pattern: "/_emdash/api/schema/collections/reorder",
322
+ entrypoint: resolveRoute("api/schema/collections/reorder.ts"),
323
+ });
324
+
316
325
  injectRoute({
317
326
  pattern: "/_emdash/api/schema/collections/[slug]",
318
327
  entrypoint: resolveRoute("api/schema/collections/[slug]/index.ts"),
@@ -389,6 +398,11 @@ export function injectCoreRoutes(
389
398
  entrypoint: resolveRoute("api/taxonomies/index.ts"),
390
399
  });
391
400
 
401
+ injectRoute({
402
+ pattern: "/_emdash/api/taxonomies/[name]/reorder",
403
+ entrypoint: resolveRoute("api/taxonomies/[name]/reorder.ts"),
404
+ });
405
+
392
406
  injectRoute({
393
407
  pattern: "/_emdash/api/taxonomies/[name]/terms",
394
408
  entrypoint: resolveRoute("api/taxonomies/[name]/terms/index.ts"),
@@ -7,6 +7,8 @@
7
7
  * DO NOT import Node.js-only modules here (fs, path, module, etc.)
8
8
  */
9
9
 
10
+ import type { ManifestHookEntry, ManifestRouteEntry } from "@emdash-cms/plugin-types";
11
+
10
12
  import type { AuthDescriptor, AuthProviderDescriptor } from "../../auth/types.js";
11
13
  import type { DatabaseDescriptor } from "../../db/adapters.js";
12
14
  import type { MediaProviderDescriptor } from "../../media/types.js";
@@ -137,6 +139,17 @@ export interface PluginDescriptor<TOptions = Record<string, unknown>> {
137
139
  storage?: Record<string, StorageCollectionDeclaration>;
138
140
  /** Serialized MCP declarations emitted by the plugin build. */
139
141
  mcp?: PluginMcpManifestConfig;
142
+ /**
143
+ * Route declarations for sandboxed config-declared plugins. Mirrors
144
+ * definePlugin({ routes }) and drives route auth decisions; omitted routes
145
+ * default to non-public.
146
+ */
147
+ routes?: Array<ManifestRouteEntry | string>;
148
+ /**
149
+ * Hook declarations for sandboxed config-declared plugins. Mirrors
150
+ * definePlugin({ hooks }).
151
+ */
152
+ hooks?: Array<ManifestHookEntry | string>;
140
153
  }
141
154
 
142
155
  /**
@@ -673,6 +673,8 @@ export const sandboxedPlugins = [];
673
673
  allowedHosts: ${JSON.stringify(descriptor.allowedHosts ?? [])},
674
674
  storage: ${JSON.stringify(descriptor.storage ?? {})},
675
675
  mcp: ${JSON.stringify(descriptor.mcp)},
676
+ routes: ${JSON.stringify(descriptor.routes ?? [])},
677
+ hooks: ${JSON.stringify(descriptor.hooks ?? [])},
676
678
  adminPages: ${JSON.stringify(descriptor.adminPages ?? [])},
677
679
  adminWidgets: ${JSON.stringify(descriptor.adminWidgets ?? [])},
678
680
  settingsSchema: ${JSON.stringify(descriptor.settingsSchema)},
@@ -18,11 +18,7 @@ import { defineMiddleware } from "astro:middleware";
18
18
 
19
19
  import { RedirectRepository } from "../../database/repositories/redirect.js";
20
20
  import { getDb } from "../../loader.js";
21
- import {
22
- getCachedRedirects,
23
- matchCachedPatterns,
24
- setCachedRedirects,
25
- } from "../../redirects/cache.js";
21
+ import { loadCachedRedirects, matchCachedPatterns } from "../../redirects/cache.js";
26
22
  import { isTerminalStatus } from "../../redirects/status.js";
27
23
 
28
24
  /** Paths that should never be intercepted by redirects */
@@ -68,11 +64,7 @@ export const onRequest = defineMiddleware(async (context, next) => {
68
64
  // One query loads both exact and pattern rules into the cache; warm
69
65
  // requests issue zero queries. Empty-redirect sites cache an empty
70
66
  // Map + array, so the next request returns immediately without probing.
71
- let cached = getCachedRedirects();
72
- if (!cached) {
73
- const all = await repo.findAllEnabled();
74
- cached = setCachedRedirects(all);
75
- }
67
+ const cached = await loadCachedRedirects(() => repo.findAllEnabled());
76
68
 
77
69
  // 1. Exact match (O(1) Map lookup)
78
70
  let exact = cached.exact.get(pathname);
@@ -6,6 +6,9 @@
6
6
  * request-scoped db adapter's lifecycle around the response.
7
7
  */
8
8
 
9
+ import { createDeferredTaskTracker } from "../../deferred-tasks.js";
10
+ import type { DeferredTaskTracker } from "../../deferred-tasks.js";
11
+
9
12
  /**
10
13
  * Astro attaches AstroCookies to outgoing responses via a well-known global
11
14
  * symbol. Cloning a Response (`new Response(body, init)`) drops non-header
@@ -16,6 +19,34 @@
16
19
  */
17
20
  export const ASTRO_COOKIES_SYMBOL = Symbol.for("astro.cookies");
18
21
 
22
+ interface ScopedDbLifecycle {
23
+ commit: () => void;
24
+ close?: () => void;
25
+ }
26
+
27
+ /** Hold the real adapter close behind both response and deferred-task completion. */
28
+ export function coordinateScopedDbLifecycle(scoped: ScopedDbLifecycle): {
29
+ closed?: Promise<void>;
30
+ deferredTasks?: DeferredTaskTracker;
31
+ lifecycle: ScopedDbLifecycle;
32
+ } {
33
+ if (!scoped.close) return { lifecycle: scoped };
34
+
35
+ const close = scoped.close;
36
+ const deferredTasks = createDeferredTaskTracker(() => {
37
+ try {
38
+ close();
39
+ } catch (error) {
40
+ console.error("[emdash] request-scoped db close failed:", error);
41
+ }
42
+ });
43
+ return {
44
+ closed: deferredTasks.settled,
45
+ deferredTasks,
46
+ lifecycle: { commit: scoped.commit, close: deferredTasks.settle },
47
+ };
48
+ }
49
+
19
50
  /**
20
51
  * Run a request-scoped db's `close()` once the response body has finished
21
52
  * streaming. Astro streams HTML and components issue DB queries during that
@@ -62,9 +93,9 @@ export function wrapResponseForScopedClose(response: Response, close: () => void
62
93
  * Run the request body under a request-scoped db, then settle its lifecycle:
63
94
  * `commit()` runs before the response is returned (so per-request state like a
64
95
  * D1 bookmark cookie is persisted in the headers, even if render throws), while
65
- * `close()` (if any) is deferred to stream-end so a connection-backed adapter
66
- * isn't torn down mid-render. On error the connection is closed immediately
67
- * before rethrowing so it never leaks.
96
+ * `close()` (if any) is deferred to lifecycle settlement so a
97
+ * connection-backed adapter isn't torn down mid-render or mid-task. On error
98
+ * the lifecycle is settled before rethrowing so it never leaks.
68
99
  *
69
100
  * On the error path both `commit()` and `close()` are defended: a throw from
70
101
  * either is logged and swallowed so it can't replace the propagating render
@@ -77,7 +108,7 @@ export function wrapResponseForScopedClose(response: Response, close: () => void
77
108
  * or mask.
78
109
  */
79
110
  export async function finishScoped(
80
- scoped: { commit: () => void; close?: () => void },
111
+ scoped: ScopedDbLifecycle,
81
112
  run: () => Promise<Response>,
82
113
  ): Promise<Response> {
83
114
  let response: Response;
@@ -47,6 +47,7 @@ import {
47
47
  import { setI18nConfig } from "../i18n/config.js";
48
48
  import type { Database, Storage } from "../index.js";
49
49
  import { createPublicMediaUrlResolver } from "../media/url.js";
50
+ import { getLastContentWriteAt } from "../object-cache/index.js";
50
51
  import type { SandboxRunnerFactory } from "../plugins/sandbox/types.js";
51
52
  import type { ResolvedPlugin } from "../plugins/types.js";
52
53
  import { invalidateUrlPatternCache } from "../query.js";
@@ -60,7 +61,11 @@ import type { PublishedRef } from "../scheduled-publish.js";
60
61
  import { isMissingTableError } from "../utils/db-errors.js";
61
62
  import { createInitLock, type InitLock, initWithLock } from "../utils/init-lock.js";
62
63
  import type { EmDashConfig } from "./integration/runtime.js";
63
- import { ASTRO_COOKIES_SYMBOL, finishScoped } from "./middleware/scoped-db.js";
64
+ import {
65
+ ASTRO_COOKIES_SYMBOL,
66
+ coordinateScopedDbLifecycle,
67
+ finishScoped,
68
+ } from "./middleware/scoped-db.js";
64
69
  import { wrapBodyForStreamMetrics } from "./middleware/stream-end-metrics.js";
65
70
  import { prefetchLayoutData } from "./prefetch.js";
66
71
  import { createPublicPluginApiRouteHandler } from "./public-plugin-api-routes.js";
@@ -352,6 +357,7 @@ async function runOutsideRequest<T>(
352
357
  // Event handlers publish, clean up, or run jobs — a write workload —
353
358
  // so a connection-backed adapter routes them to the primary.
354
359
  isWrite: true,
360
+ canUseCachedBinding: false,
355
361
  cookies: NOOP_COOKIE_JAR,
356
362
  url: CRON_EVENT_URL,
357
363
  });
@@ -360,26 +366,33 @@ async function runOutsideRequest<T>(
360
366
  // outside a request. Any close-less scope created above is discarded.
361
367
  return fn(runtime);
362
368
  }
369
+ const { closed, deferredTasks, lifecycle } = coordinateScopedDbLifecycle(scoped);
363
370
 
364
371
  const parent = getRequestContext();
365
372
  const ctx = parent
366
- ? { ...parent, db: scoped.db }
367
- : { editMode: false, db: scoped.db, metrics: createRequestMetrics(performance.now()) };
373
+ ? { ...parent, db: scoped.db, deferredTasks }
374
+ : {
375
+ editMode: false,
376
+ db: scoped.db,
377
+ metrics: createRequestMetrics(performance.now()),
378
+ deferredTasks,
379
+ };
368
380
  try {
369
381
  return await runWithContext(ctx, () => fn(runtime));
370
382
  } finally {
371
383
  // Guard both so a throw in teardown can't mask the callback result or
372
- // skip close() and leak the connection. Mirrors closeSafely() in scoped-db.ts.
384
+ // skip lifecycle settlement and leak the connection.
373
385
  try {
374
- scoped.commit();
386
+ lifecycle.commit();
375
387
  } catch (error) {
376
388
  console.error("[emdash] event-scoped db commit failed:", error);
377
389
  }
378
390
  try {
379
- scoped.close();
391
+ lifecycle.close?.();
380
392
  } catch (error) {
381
393
  console.error("[emdash] event-scoped db close failed:", error);
382
394
  }
395
+ await closed;
383
396
  }
384
397
  }
385
398
 
@@ -561,6 +574,15 @@ export const onRequest = defineMiddleware(async (context, next) => {
561
574
  const hasBearerAuth = (request.headers.get("authorization") ?? "")
562
575
  .toLowerCase()
563
576
  .startsWith("bearer ");
577
+ const isWrite = request.method !== "GET" && request.method !== "HEAD";
578
+ const isAuthenticated = !!sessionUser || hasBearerAuth;
579
+ const canUseCachedBinding =
580
+ !isAuthenticated &&
581
+ !isWrite &&
582
+ !playgroundDb &&
583
+ !isEmDashRoute &&
584
+ !hasEditCookie &&
585
+ !hasPreviewToken;
564
586
 
565
587
  if (!isEmDashRoute && !isPublicRuntimeRoute && !hasEditCookie && !hasPreviewToken) {
566
588
  if (!sessionUser && !playgroundDb) {
@@ -647,12 +669,18 @@ export const onRequest = defineMiddleware(async (context, next) => {
647
669
  // Even on the anonymous fast path we ask the adapter for a per-request
648
670
  // scoped db. For D1 with read replication this routes anonymous reads
649
671
  // to the nearest replica; for other adapters it's a no-op.
672
+ const lastContentWriteAt =
673
+ canUseCachedBinding && config?.database?.needsLastContentWriteAt
674
+ ? await getLastContentWriteAt()
675
+ : undefined;
650
676
  const anonScoped = createRequestScopedDb({
651
677
  config: config?.database?.config,
652
- isAuthenticated: false,
653
- isWrite: request.method !== "GET" && request.method !== "HEAD",
678
+ isAuthenticated,
679
+ isWrite,
680
+ canUseCachedBinding,
654
681
  cookies,
655
682
  url,
683
+ lastContentWriteAt,
656
684
  });
657
685
  const runAnon = async () => {
658
686
  const t0 = performance.now();
@@ -666,10 +694,11 @@ export const onRequest = defineMiddleware(async (context, next) => {
666
694
  return wrapBodyForStreamMetrics(finalizeResponse(response, timings));
667
695
  };
668
696
  if (anonScoped) {
697
+ const { deferredTasks, lifecycle } = coordinateScopedDbLifecycle(anonScoped);
669
698
  const parent = getRequestContext();
670
699
  const ctx = parent
671
- ? { ...parent, db: anonScoped.db }
672
- : { editMode: false, db: anonScoped.db, metrics };
700
+ ? { ...parent, db: anonScoped.db, deferredTasks }
701
+ : { editMode: false, db: anonScoped.db, metrics, deferredTasks };
673
702
  // Eagerly warm site-global layout data (menus, widget areas,
674
703
  // taxonomy terms, settings) concurrently so the layout's
675
704
  // per-component reads overlap into ~one wall-clock round trip and
@@ -678,10 +707,8 @@ export const onRequest = defineMiddleware(async (context, next) => {
678
707
  // pointless on synchronous local SQLite.
679
708
  // - HTML navigations only -- feeds/sitemaps/JSON don't render the
680
709
  // layout, so prefetching their chrome is pure waste.
681
- // - via after(): it runs immediately (still warms the render) but
682
- // hands the promise to waitUntil, so the surplus warm-up (chrome a
683
- // given page doesn't render) is kept alive past the response rather
684
- // than erroring on workerd as orphaned request I/O.
710
+ // - the work starts immediately, then after() keeps both it and the
711
+ // request-scoped connection alive until the response also finishes.
685
712
  // Gate on the CLIENT'S PREFERRED type (leading media range), not a
686
713
  // substring -- browser navigations lead with `text/html`, while feed
687
714
  // readers lead with `application/rss+xml` etc. and only list
@@ -694,8 +721,8 @@ export const onRequest = defineMiddleware(async (context, next) => {
694
721
  if (acceptsHtml) after(() => prefetchLayoutData());
695
722
  // commit() persists per-request state (e.g. the D1 bookmark cookie)
696
723
  // before the response is returned, even if render throws; close()
697
- // (connection teardown) is deferred to stream-end. See finishScoped.
698
- return finishScoped(anonScoped, runAnon);
724
+ // waits for stream-end and request-owned deferred work. See finishScoped.
725
+ return finishScoped(lifecycle, runAnon);
699
726
  });
700
727
  }
701
728
  return runAnon();
@@ -855,12 +882,18 @@ export const onRequest = defineMiddleware(async (context, next) => {
855
882
  // it in ALS so the runtime's db getter and loader's getDb() pick it up,
856
883
  // then call commit() after next() so the adapter can persist any
857
884
  // per-request state (e.g. a D1 bookmark cookie for read-your-writes).
885
+ const lastContentWriteAt =
886
+ canUseCachedBinding && config?.database?.needsLastContentWriteAt
887
+ ? await getLastContentWriteAt()
888
+ : undefined;
858
889
  const scoped = createRequestScopedDb({
859
890
  config: config?.database?.config,
860
- isAuthenticated: !!sessionUser || hasBearerAuth,
861
- isWrite: request.method !== "GET" && request.method !== "HEAD",
891
+ isAuthenticated,
892
+ isWrite,
893
+ canUseCachedBinding,
862
894
  cookies: context.cookies,
863
895
  url,
896
+ lastContentWriteAt,
864
897
  });
865
898
 
866
899
  const renderAndFinalize = async () => {
@@ -876,15 +909,16 @@ export const onRequest = defineMiddleware(async (context, next) => {
876
909
  };
877
910
 
878
911
  if (scoped) {
912
+ const { deferredTasks, lifecycle } = coordinateScopedDbLifecycle(scoped);
879
913
  const parent = getRequestContext();
880
914
  const ctx = parent
881
- ? { ...parent, db: scoped.db }
882
- : { editMode: false, db: scoped.db, metrics };
915
+ ? { ...parent, db: scoped.db, deferredTasks }
916
+ : { editMode: false, db: scoped.db, metrics, deferredTasks };
883
917
  return runWithContext(ctx, () =>
884
918
  // commit() persists per-request state (e.g. the D1 bookmark cookie)
885
919
  // before the response returns, even if render throws; close()
886
- // (connection teardown) is deferred to stream-end. See finishScoped.
887
- finishScoped(scoped, renderAndFinalize),
920
+ // waits for stream-end and request-owned deferred work. See finishScoped.
921
+ finishScoped(lifecycle, renderAndFinalize),
888
922
  );
889
923
  }
890
924
 
@@ -93,7 +93,7 @@ export const PUT: APIRoute = async ({ params, request, locals }) => {
93
93
  // Send notification when a comment is newly approved
94
94
  if (newStatus === "approved" && previousStatus !== "approved" && emdash.email) {
95
95
  try {
96
- const adminBaseUrl = await getSiteBaseUrl(emdash.db, request);
96
+ const adminBaseUrl = await getSiteBaseUrl(emdash.db, request, emdash.config);
97
97
  const content = await lookupContentAuthor(emdash.db, updated.collection, updated.contentId);
98
98
  if (content?.author) {
99
99
  await sendCommentNotification({
@@ -51,9 +51,9 @@ export const POST: APIRoute = async ({ request, params, locals }) => {
51
51
  );
52
52
  }
53
53
 
54
- // Build config using stored site URL (not request Host header)
54
+ // Build config using the configured site URL, stored option as fallback (not request Host header)
55
55
  const options = new OptionsRepository(emdash.db);
56
- const baseUrl = await getSiteBaseUrl(emdash.db, request);
56
+ const baseUrl = await getSiteBaseUrl(emdash.db, request, emdash.config);
57
57
  const siteName = (await options.get<string>("emdash:site_title")) ?? "EmDash";
58
58
 
59
59
  const config: MagicLinkConfig = {
@@ -46,8 +46,8 @@ export const POST: APIRoute = async ({ request, locals }) => {
46
46
  const options = new OptionsRepository(emdash.db);
47
47
  const siteName = (await options.get<string>("emdash:site_title")) || "EmDash";
48
48
 
49
- // Use stored site URL to prevent Host header spoofing in invite emails
50
- const baseUrl = await getSiteBaseUrl(emdash.db, request);
49
+ // Use the configured site URL (stored option as fallback) to prevent Host header spoofing in invite emails
50
+ const baseUrl = await getSiteBaseUrl(emdash.db, request, emdash.config);
51
51
 
52
52
  // Build email sender from the plugin pipeline (if available)
53
53
  const emailSend = emdash.email?.isAvailable()
@@ -57,9 +57,9 @@ export const POST: APIRoute = async ({ request, locals }) => {
57
57
  );
58
58
  }
59
59
 
60
- // Build magic link config using stored site URL (not request Host header)
60
+ // Build magic link config using the configured site URL, stored option as fallback (not request Host header)
61
61
  const options = new OptionsRepository(emdash.db);
62
- const baseUrl = await getSiteBaseUrl(emdash.db, request);
62
+ const baseUrl = await getSiteBaseUrl(emdash.db, request, emdash.config);
63
63
  const siteName = (await options.get<string>("emdash:site_title")) ?? "EmDash";
64
64
 
65
65
  const config: MagicLinkConfig = {
@@ -68,8 +68,8 @@ export const POST: APIRoute = async ({ request, locals }) => {
68
68
  const options = new OptionsRepository(emdash.db);
69
69
  const siteName = (await options.get<string>("emdash:site_title")) || "EmDash";
70
70
 
71
- // Use stored site URL to prevent Host header spoofing in signup emails
72
- const baseUrl = await getSiteBaseUrl(emdash.db, request);
71
+ // Use the configured site URL (stored option as fallback) to prevent Host header spoofing in signup emails
72
+ const baseUrl = await getSiteBaseUrl(emdash.db, request, emdash.config);
73
73
 
74
74
  // Request signup - this handles all checks internally and fails silently
75
75
  // if domain not allowed or user exists (to prevent enumeration)
@@ -302,7 +302,7 @@ export const POST: APIRoute = async ({ params, request, locals }) => {
302
302
  // isolate terminates after the response).
303
303
  if (result.comment.status === "approved" && emdash.email && contentAuthor) {
304
304
  try {
305
- const adminBaseUrl = await getSiteBaseUrl(emdash.db, request);
305
+ const adminBaseUrl = await getSiteBaseUrl(emdash.db, request, emdash.config);
306
306
  await sendCommentNotification({
307
307
  email: emdash.email,
308
308
  comment: result.comment,