emdash 0.31.1 → 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 (746) 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 +23 -21
  10. package/dist/api/route-utils.mjs.map +1 -1
  11. package/dist/api/schemas/index.d.mts +2 -2
  12. package/dist/api/schemas/index.mjs +5 -5
  13. package/dist/{api-BkqFzIu4.mjs → api-D2hunekQ.mjs} +254 -48
  14. package/dist/api-D2hunekQ.mjs.map +1 -0
  15. package/dist/{api-tokens-uPt8UDpx.mjs → api-tokens-CSND0i1z.mjs} +2 -2
  16. package/dist/{api-tokens-uPt8UDpx.mjs.map → api-tokens-CSND0i1z.mjs.map} +1 -1
  17. package/dist/{apply-DuXsqll7.mjs → apply-kwNEJW2l.mjs} +36 -23
  18. package/dist/apply-kwNEJW2l.mjs.map +1 -0
  19. package/dist/astro/index.d.mts +12 -12
  20. package/dist/astro/index.mjs +17 -3
  21. package/dist/astro/index.mjs.map +1 -1
  22. package/dist/astro/middleware/auth.d.mts +10 -10
  23. package/dist/astro/middleware/auth.mjs +8 -8
  24. package/dist/astro/middleware/redirect.d.mts.map +1 -1
  25. package/dist/astro/middleware/redirect.mjs +8 -8
  26. package/dist/astro/middleware/redirect.mjs.map +1 -1
  27. package/dist/astro/middleware/request-context.mjs +4 -4
  28. package/dist/astro/middleware/setup.mjs +1 -1
  29. package/dist/astro/middleware.d.mts +10 -10
  30. package/dist/astro/middleware.d.mts.map +1 -1
  31. package/dist/astro/middleware.mjs +370 -171
  32. package/dist/astro/middleware.mjs.map +1 -1
  33. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +7 -7
  34. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +7 -7
  35. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
  36. package/dist/astro/routes/api/admin/api-tokens/index.mjs +5 -5
  37. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +5 -5
  38. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +10 -10
  39. package/dist/astro/routes/api/admin/byline-fields/index.mjs +10 -10
  40. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +10 -10
  41. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +19 -18
  42. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
  43. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +19 -18
  44. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
  45. package/dist/astro/routes/api/admin/bylines/index.mjs +19 -19
  46. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +16 -16
  47. package/dist/astro/routes/api/admin/comments/_id_/status.mjs.map +1 -1
  48. package/dist/astro/routes/api/admin/comments/_id_.mjs +7 -7
  49. package/dist/astro/routes/api/admin/comments/bulk.mjs +12 -12
  50. package/dist/astro/routes/api/admin/comments/counts.mjs +7 -7
  51. package/dist/astro/routes/api/admin/comments/index.mjs +12 -12
  52. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +5 -5
  53. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +4 -4
  54. package/dist/astro/routes/api/admin/media-usage/repair.mjs +13 -11
  55. package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
  56. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +4 -4
  57. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +4 -4
  58. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +47 -44
  59. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
  60. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +47 -44
  61. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
  62. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +46 -43
  63. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  64. package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +5 -5
  65. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +46 -43
  66. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
  67. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +46 -43
  68. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  69. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +46 -43
  70. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  71. package/dist/astro/routes/api/admin/plugins/index.mjs +46 -43
  72. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  73. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +3 -3
  74. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +46 -43
  75. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  76. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +46 -43
  77. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
  78. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +46 -43
  79. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
  80. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +46 -43
  81. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
  82. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +47 -44
  83. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
  84. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +46 -43
  85. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
  86. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +47 -44
  87. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  88. package/dist/astro/routes/api/admin/plugins/updates.mjs +46 -43
  89. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  90. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +46 -43
  91. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  92. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +3 -3
  93. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +46 -43
  94. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  95. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +3 -3
  96. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +2 -2
  97. package/dist/astro/routes/api/admin/users/_id_/index.mjs +8 -8
  98. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +5 -5
  99. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs.map +1 -1
  100. package/dist/astro/routes/api/admin/users/index.mjs +7 -7
  101. package/dist/astro/routes/api/auth/dev-bypass.mjs +7 -6
  102. package/dist/astro/routes/api/auth/dev-bypass.mjs.map +1 -1
  103. package/dist/astro/routes/api/auth/invite/accept.mjs +2 -2
  104. package/dist/astro/routes/api/auth/invite/complete.mjs +12 -12
  105. package/dist/astro/routes/api/auth/invite/index.mjs +10 -10
  106. package/dist/astro/routes/api/auth/invite/index.mjs.map +1 -1
  107. package/dist/astro/routes/api/auth/invite/register-options.mjs +11 -11
  108. package/dist/astro/routes/api/auth/logout.mjs +3 -3
  109. package/dist/astro/routes/api/auth/magic-link/send.mjs +12 -12
  110. package/dist/astro/routes/api/auth/magic-link/send.mjs.map +1 -1
  111. package/dist/astro/routes/api/auth/magic-link/verify.mjs +3 -3
  112. package/dist/astro/routes/api/auth/me.mjs +8 -8
  113. package/dist/astro/routes/api/auth/mode.mjs +3 -3
  114. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +4 -4
  115. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  116. package/dist/astro/routes/api/auth/passkey/_id_.mjs +7 -7
  117. package/dist/astro/routes/api/auth/passkey/index.mjs +2 -2
  118. package/dist/astro/routes/api/auth/passkey/options.mjs +13 -13
  119. package/dist/astro/routes/api/auth/passkey/register/options.mjs +11 -11
  120. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +12 -12
  121. package/dist/astro/routes/api/auth/passkey/verify.mjs +12 -12
  122. package/dist/astro/routes/api/auth/signup/complete.mjs +12 -12
  123. package/dist/astro/routes/api/auth/signup/request.mjs +12 -12
  124. package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -1
  125. package/dist/astro/routes/api/auth/signup/verify.mjs +2 -2
  126. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +18 -18
  127. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs.map +1 -1
  128. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +15 -15
  129. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +3 -3
  130. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +4 -4
  131. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +4 -4
  132. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +3 -3
  133. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +14 -14
  134. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +9 -9
  135. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +19 -17
  136. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
  137. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +19 -17
  138. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
  139. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +4 -4
  140. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +3 -3
  141. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +9 -9
  142. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +17 -16
  143. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
  144. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +3 -3
  145. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +4 -4
  146. package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
  147. package/dist/astro/routes/api/content/_collection_/_id_.mjs +10 -10
  148. package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
  149. package/dist/astro/routes/api/content/_collection_/authors.mjs +3 -3
  150. package/dist/astro/routes/api/content/_collection_/index.mjs +9 -9
  151. package/dist/astro/routes/api/content/_collection_/trash.mjs +8 -8
  152. package/dist/astro/routes/api/dashboard.mjs +9 -9
  153. package/dist/astro/routes/api/dev/emails.mjs +3 -3
  154. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  155. package/dist/astro/routes/api/import/probe.mjs +19 -19
  156. package/dist/astro/routes/api/import/wordpress/analyze.mjs +4 -4
  157. package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -11
  158. package/dist/astro/routes/api/import/wordpress/execute.mjs +16 -15
  159. package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
  160. package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -10
  161. package/dist/astro/routes/api/import/wordpress/media.mjs +10 -10
  162. package/dist/astro/routes/api/import/wordpress/prepare.mjs +11 -11
  163. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +11 -11
  164. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +13 -11
  165. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
  166. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  167. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +19 -19
  168. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +11 -11
  169. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +28 -27
  170. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
  171. package/dist/astro/routes/api/manifest.mjs +5 -5
  172. package/dist/astro/routes/api/mcp.mjs +42 -42
  173. package/dist/astro/routes/api/media/_id_/confirm.d.mts.map +1 -1
  174. package/dist/astro/routes/api/media/_id_/confirm.mjs +106 -37
  175. package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
  176. package/dist/astro/routes/api/media/_id_/upload.d.mts +8 -0
  177. package/dist/astro/routes/api/media/_id_/upload.d.mts.map +1 -0
  178. package/dist/astro/routes/api/media/_id_/upload.mjs +168 -0
  179. package/dist/astro/routes/api/media/_id_/upload.mjs.map +1 -0
  180. package/dist/astro/routes/api/media/_id_/usage.mjs +15 -13
  181. package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -1
  182. package/dist/astro/routes/api/media/_id_.d.mts.map +1 -1
  183. package/dist/astro/routes/api/media/_id_.mjs +22 -15
  184. package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
  185. package/dist/astro/routes/api/media/file/_...key_.mjs +2 -2
  186. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +3 -3
  187. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +3 -3
  188. package/dist/astro/routes/api/media/providers/index.mjs +3 -3
  189. package/dist/astro/routes/api/media/upload-url.d.mts.map +1 -1
  190. package/dist/astro/routes/api/media/upload-url.mjs +35 -24
  191. package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
  192. package/dist/astro/routes/api/media.mjs +14 -13
  193. package/dist/astro/routes/api/media.mjs.map +1 -1
  194. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +12 -11
  195. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
  196. package/dist/astro/routes/api/menus/_name_/items.mjs +12 -11
  197. package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
  198. package/dist/astro/routes/api/menus/_name_/reorder.mjs +12 -11
  199. package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
  200. package/dist/astro/routes/api/menus/_name_/translations.mjs +12 -11
  201. package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
  202. package/dist/astro/routes/api/menus/_name_.mjs +12 -11
  203. package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
  204. package/dist/astro/routes/api/menus/index.mjs +12 -11
  205. package/dist/astro/routes/api/menus/index.mjs.map +1 -1
  206. package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
  207. package/dist/astro/routes/api/oauth/device/authorize.mjs +6 -6
  208. package/dist/astro/routes/api/oauth/device/code.mjs +9 -9
  209. package/dist/astro/routes/api/oauth/device/token.mjs +8 -8
  210. package/dist/astro/routes/api/oauth/register.mjs +3 -3
  211. package/dist/astro/routes/api/oauth/token/refresh.mjs +6 -6
  212. package/dist/astro/routes/api/oauth/token/revoke.mjs +6 -6
  213. package/dist/astro/routes/api/oauth/token.mjs +6 -6
  214. package/dist/astro/routes/api/openapi.json.mjs +62 -9
  215. package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
  216. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +5 -5
  217. package/dist/astro/routes/api/redirects/404s/index.mjs +12 -12
  218. package/dist/astro/routes/api/redirects/404s/summary.mjs +12 -12
  219. package/dist/astro/routes/api/redirects/_id_.mjs +14 -13
  220. package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
  221. package/dist/astro/routes/api/redirects/index.mjs +14 -13
  222. package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
  223. package/dist/astro/routes/api/relations/_id_/index.mjs +19 -17
  224. package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
  225. package/dist/astro/routes/api/relations/_id_/translations.mjs +14 -12
  226. package/dist/astro/routes/api/relations/_id_/translations.mjs.map +1 -1
  227. package/dist/astro/routes/api/relations/index.mjs +19 -17
  228. package/dist/astro/routes/api/relations/index.mjs.map +1 -1
  229. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +3 -3
  230. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +4 -4
  231. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +46 -43
  232. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  233. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +46 -43
  234. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  235. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +46 -43
  236. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  237. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +46 -43
  238. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  239. package/dist/astro/routes/api/schema/collections/index.mjs +46 -43
  240. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  241. package/dist/astro/routes/api/schema/collections/reorder.d.mts +8 -0
  242. package/dist/astro/routes/api/schema/collections/reorder.d.mts.map +1 -0
  243. package/dist/astro/routes/api/schema/collections/reorder.mjs +66 -0
  244. package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -0
  245. package/dist/astro/routes/api/schema/index.mjs +12 -8
  246. package/dist/astro/routes/api/schema/index.mjs.map +1 -1
  247. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +46 -43
  248. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  249. package/dist/astro/routes/api/schema/orphans/index.mjs +46 -43
  250. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  251. package/dist/astro/routes/api/search/enable.d.mts +1 -0
  252. package/dist/astro/routes/api/search/enable.d.mts.map +1 -1
  253. package/dist/astro/routes/api/search/enable.mjs +18 -13
  254. package/dist/astro/routes/api/search/enable.mjs.map +1 -1
  255. package/dist/astro/routes/api/search/index.mjs +12 -11
  256. package/dist/astro/routes/api/search/index.mjs.map +1 -1
  257. package/dist/astro/routes/api/search/rebuild.mjs +14 -13
  258. package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
  259. package/dist/astro/routes/api/search/stats.mjs +8 -7
  260. package/dist/astro/routes/api/search/stats.mjs.map +1 -1
  261. package/dist/astro/routes/api/search/suggest.mjs +12 -11
  262. package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
  263. package/dist/astro/routes/api/sections/_slug_.mjs +11 -11
  264. package/dist/astro/routes/api/sections/index.mjs +11 -11
  265. package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -7
  266. package/dist/astro/routes/api/settings/backups/archives/index.mjs +6 -6
  267. package/dist/astro/routes/api/settings/backups/export.mjs +7 -7
  268. package/dist/astro/routes/api/settings/backups/index.mjs +8 -8
  269. package/dist/astro/routes/api/settings/email.mjs +5 -5
  270. package/dist/astro/routes/api/settings.mjs +16 -16
  271. package/dist/astro/routes/api/setup/admin-verify.mjs +13 -13
  272. package/dist/astro/routes/api/setup/admin.mjs +12 -12
  273. package/dist/astro/routes/api/setup/dev-bypass.mjs +31 -29
  274. package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
  275. package/dist/astro/routes/api/setup/dev-reset.mjs +3 -3
  276. package/dist/astro/routes/api/setup/index.mjs +33 -31
  277. package/dist/astro/routes/api/setup/index.mjs.map +1 -1
  278. package/dist/astro/routes/api/setup/status.mjs +4 -4
  279. package/dist/astro/routes/api/snapshot.mjs +9 -9
  280. package/dist/astro/routes/api/taxonomies/_name_/reorder.d.mts +8 -0
  281. package/dist/astro/routes/api/taxonomies/_name_/reorder.d.mts.map +1 -0
  282. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +43 -0
  283. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -0
  284. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +17 -16
  285. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
  286. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +17 -16
  287. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
  288. package/dist/astro/routes/api/taxonomies/_name_/terms/index.d.mts.map +1 -1
  289. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +22 -18
  290. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
  291. package/dist/astro/routes/api/taxonomies/index.mjs +17 -16
  292. package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
  293. package/dist/astro/routes/api/themes/preview.mjs +7 -7
  294. package/dist/astro/routes/api/typegen.mjs +5 -5
  295. package/dist/astro/routes/api/well-known/auth.mjs +2 -2
  296. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
  297. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
  298. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +8 -8
  299. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +11 -11
  300. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +11 -11
  301. package/dist/astro/routes/api/widget-areas/_name_.mjs +6 -6
  302. package/dist/astro/routes/api/widget-areas/index.mjs +11 -11
  303. package/dist/astro/routes/api/widget-components.mjs +3 -3
  304. package/dist/astro/routes/robots.txt.mjs +9 -9
  305. package/dist/astro/routes/sitemap-_collection_.xml.mjs +13 -13
  306. package/dist/astro/routes/sitemap.xml.mjs +10 -10
  307. package/dist/astro/types.d.mts +20 -13
  308. package/dist/astro/types.d.mts.map +1 -1
  309. package/dist/auth/providers/github.d.mts +1 -1
  310. package/dist/auth/providers/google.d.mts +1 -1
  311. package/dist/{authorize-6WPZa1xZ.mjs → authorize-qRhWQnel.mjs} +2 -2
  312. package/dist/{authorize-6WPZa1xZ.mjs.map → authorize-qRhWQnel.mjs.map} +1 -1
  313. package/dist/{backup-DoW-H0r4.mjs → backup-CtA6LDNw.mjs} +5 -5
  314. package/dist/{backup-DoW-H0r4.mjs.map → backup-CtA6LDNw.mjs.map} +1 -1
  315. package/dist/{byline-BTOxUlFF.mjs → byline-Cp6csL84.mjs} +9 -9
  316. package/dist/{byline-BTOxUlFF.mjs.map → byline-Cp6csL84.mjs.map} +1 -1
  317. package/dist/{byline-fields-CdU_LTF1.mjs → byline-fields-CNc0Yq5i.mjs} +2 -2
  318. package/dist/{byline-fields-CdU_LTF1.mjs.map → byline-fields-CNc0Yq5i.mjs.map} +1 -1
  319. package/dist/{byline-registry-BCuOp4UF.mjs → byline-registry-ZkPKqEwC.mjs} +4 -4
  320. package/dist/{byline-registry-BCuOp4UF.mjs.map → byline-registry-ZkPKqEwC.mjs.map} +1 -1
  321. package/dist/{bylines-Bc-3xtpz.mjs → bylines-CEj5CdT4.mjs} +7 -7
  322. package/dist/{bylines-Bc-3xtpz.mjs.map → bylines-CEj5CdT4.mjs.map} +1 -1
  323. package/dist/{bylines-oVN0iPwX.mjs → bylines-cf-C9lmF.mjs} +5 -5
  324. package/dist/{bylines-oVN0iPwX.mjs.map → bylines-cf-C9lmF.mjs.map} +1 -1
  325. package/dist/cache-C9FptTFR.mjs +108 -0
  326. package/dist/cache-C9FptTFR.mjs.map +1 -0
  327. package/dist/{challenge-store-BFzgFRog.mjs → challenge-store-D9VNKELo.mjs} +1 -1
  328. package/dist/{challenge-store-BFzgFRog.mjs.map → challenge-store-D9VNKELo.mjs.map} +1 -1
  329. package/dist/{chunks-Bq-5DPrD.mjs → chunks-DbYzib_k.mjs} +2 -2
  330. package/dist/{chunks-Bq-5DPrD.mjs.map → chunks-DbYzib_k.mjs.map} +1 -1
  331. package/dist/cli/index.mjs +41 -32
  332. package/dist/cli/index.mjs.map +1 -1
  333. package/dist/client/cf-access.d.mts +1 -1
  334. package/dist/client/index.d.mts +1 -1
  335. package/dist/client/index.mjs +2 -2
  336. package/dist/{comment-B9cUud8H.mjs → comment-BIkJ6Fil.mjs} +3 -3
  337. package/dist/{comment-B9cUud8H.mjs.map → comment-BIkJ6Fil.mjs.map} +1 -1
  338. package/dist/{comment-reaction-VUXO981F.mjs → comment-reaction-D-laEceb.mjs} +2 -2
  339. package/dist/{comment-reaction-VUXO981F.mjs.map → comment-reaction-D-laEceb.mjs.map} +1 -1
  340. package/dist/{comments-PXj1E9Si.mjs → comments-0_w6KChA.mjs} +3 -3
  341. package/dist/{comments-PXj1E9Si.mjs.map → comments-0_w6KChA.mjs.map} +1 -1
  342. package/dist/{components-DZkL4Fx0.mjs → components-BPxrRjpE.mjs} +1 -1
  343. package/dist/{components-DZkL4Fx0.mjs.map → components-BPxrRjpE.mjs.map} +1 -1
  344. package/dist/{config-B6b_BobR.mjs → config-DyF3OKg_.mjs} +15 -10
  345. package/dist/config-DyF3OKg_.mjs.map +1 -0
  346. package/dist/{content-BC43pICM.mjs → content-CJ94NEx5.mjs} +170 -117
  347. package/dist/content-CJ94NEx5.mjs.map +1 -0
  348. package/dist/{content-refresh-CPMSauD3.mjs → content-refresh-Xw7aKmou.mjs} +7 -7
  349. package/dist/{content-refresh-CPMSauD3.mjs.map → content-refresh-Xw7aKmou.mjs.map} +1 -1
  350. package/dist/{context-DOurRIrb.mjs → context-C_1nrqnW.mjs} +14 -14
  351. package/dist/{context-DOurRIrb.mjs.map → context-C_1nrqnW.mjs.map} +1 -1
  352. package/dist/{cron-BlKIMD_e.mjs → cron-DRV-UC4K.mjs} +1 -1
  353. package/dist/{cron-BlKIMD_e.mjs.map → cron-DRV-UC4K.mjs.map} +1 -1
  354. package/dist/{dashboard-CBm4zhc3.mjs → dashboard-DINnNVVU.mjs} +5 -5
  355. package/dist/{dashboard-CBm4zhc3.mjs.map → dashboard-DINnNVVU.mjs.map} +1 -1
  356. package/dist/db/index.d.mts +3 -3
  357. package/dist/db/index.mjs +3 -2
  358. package/dist/db/index.mjs.map +1 -1
  359. package/dist/db/libsql.d.mts +1 -1
  360. package/dist/db/postgres.d.mts +1 -1
  361. package/dist/db/sqlite.d.mts +1 -1
  362. package/dist/{default-C4v9KP56.mjs → default-BD2FG0xV.mjs} +1 -1
  363. package/dist/{default-C4v9KP56.mjs.map → default-BD2FG0xV.mjs.map} +1 -1
  364. package/dist/deferred-tasks-C-WRCcKo.d.mts +9 -0
  365. package/dist/deferred-tasks-C-WRCcKo.d.mts.map +1 -0
  366. package/dist/{device-flow-BeA6lUS1.mjs → device-flow-CTqd8mud.mjs} +5 -5
  367. package/dist/{device-flow-BeA6lUS1.mjs.map → device-flow-CTqd8mud.mjs.map} +1 -1
  368. package/dist/{dialect-helpers-BtOwo2us.mjs → dialect-helpers-BSbfaO3F.mjs} +43 -16
  369. package/dist/dialect-helpers-BSbfaO3F.mjs.map +1 -0
  370. package/dist/{email-console-C-9Ng8DM.mjs → email-console-C6WdcWbL.mjs} +1 -1
  371. package/dist/{email-console-C-9Ng8DM.mjs.map → email-console-C6WdcWbL.mjs.map} +1 -1
  372. package/dist/{error-DJ98TRbQ.mjs → error-oh_9i6bR.mjs} +3 -3
  373. package/dist/{error-DJ98TRbQ.mjs.map → error-oh_9i6bR.mjs.map} +1 -1
  374. package/dist/{errors-DtEXIQQV.mjs → errors-BucQ8VYz.mjs} +2 -1
  375. package/dist/errors-BucQ8VYz.mjs.map +1 -0
  376. package/dist/{escape-CFedIB1C.mjs → escape-CXps5F_v.mjs} +1 -1
  377. package/dist/{escape-CFedIB1C.mjs.map → escape-CXps5F_v.mjs.map} +1 -1
  378. package/dist/{field-defs-cache-KfNJ_qLQ.mjs → field-defs-cache-WD82dMQq.mjs} +4 -4
  379. package/dist/{field-defs-cache-KfNJ_qLQ.mjs.map → field-defs-cache-WD82dMQq.mjs.map} +1 -1
  380. package/dist/{fts-manager-hyCU9OOp.mjs → fts-manager-BITakW_R.mjs} +37 -13
  381. package/dist/fts-manager-BITakW_R.mjs.map +1 -0
  382. package/dist/{hash-DFFrkivP.mjs → hash-Cg0TXJPV.mjs} +8 -4
  383. package/dist/hash-Cg0TXJPV.mjs.map +1 -0
  384. package/dist/{hreflang-CIxH_LKz.d.mts → hreflang-BaLCNcDx.d.mts} +2 -2
  385. package/dist/{hreflang-CIxH_LKz.d.mts.map → hreflang-BaLCNcDx.d.mts.map} +1 -1
  386. package/dist/{hreflang-CbYeCzl9.mjs → hreflang-BdZuVBhL.mjs} +7 -7
  387. package/dist/{hreflang-CbYeCzl9.mjs.map → hreflang-BdZuVBhL.mjs.map} +1 -1
  388. package/dist/{import-oDYCgNYQ.mjs → import-C-9uqyT3.mjs} +6 -6
  389. package/dist/{import-oDYCgNYQ.mjs.map → import-C-9uqyT3.mjs.map} +1 -1
  390. package/dist/{index-BZJ_5FOX.d.mts → index-M37iz29I.d.mts} +112 -37
  391. package/dist/index-M37iz29I.d.mts.map +1 -0
  392. package/dist/{index-BEui-cRd.d.mts → index-MGw47uWq.d.mts} +3 -3
  393. package/dist/{index-BEui-cRd.d.mts.map → index-MGw47uWq.d.mts.map} +1 -1
  394. package/dist/index.d.mts +19 -19
  395. package/dist/index.mjs +69 -67
  396. package/dist/{load-Dg5gtWma.mjs → load-DV1DZuUJ.mjs} +2 -2
  397. package/dist/{load-Dg5gtWma.mjs.map → load-DV1DZuUJ.mjs.map} +1 -1
  398. package/dist/{loader-D4rigvjR.mjs → loader-CGugY7Zl.mjs} +29 -15
  399. package/dist/loader-CGugY7Zl.mjs.map +1 -0
  400. package/dist/{manifest-schema-bCq54i7F.mjs → manifest-schema-Da7kj23y.mjs} +1 -1
  401. package/dist/{manifest-schema-bCq54i7F.mjs.map → manifest-schema-Da7kj23y.mjs.map} +1 -1
  402. package/dist/media/index.d.mts +1 -1
  403. package/dist/media/local-runtime.d.mts +12 -12
  404. package/dist/media/local-runtime.mjs +8 -8
  405. package/dist/{media-its1WLYv.mjs → media-BP7S-nHT.mjs} +60 -15
  406. package/dist/media-BP7S-nHT.mjs.map +1 -0
  407. package/dist/{media-BJ6SRY3g.mjs → media-OhYL-7Io.mjs} +8 -4
  408. package/dist/{media-BJ6SRY3g.mjs.map → media-OhYL-7Io.mjs.map} +1 -1
  409. package/dist/{media-allowlist-jUppPWFy.mjs → media-allowlist-D-peH1H5.mjs} +1 -1
  410. package/dist/{media-allowlist-jUppPWFy.mjs.map → media-allowlist-D-peH1H5.mjs.map} +1 -1
  411. package/dist/{media-upload-DNu3QySc.mjs → media-upload-DtrwU2B0.mjs} +7 -7
  412. package/dist/{media-upload-DNu3QySc.mjs.map → media-upload-DtrwU2B0.mjs.map} +1 -1
  413. package/dist/{media-url-BCm5vBn6.mjs → media-url-DYs_YLOx.mjs} +1 -1
  414. package/dist/{media-url-BCm5vBn6.mjs.map → media-url-DYs_YLOx.mjs.map} +1 -1
  415. package/dist/{media-usage-DPQ3K4xB.mjs → media-usage-BlxfTkN0.mjs} +8 -8
  416. package/dist/{media-usage-DPQ3K4xB.mjs.map → media-usage-BlxfTkN0.mjs.map} +1 -1
  417. package/dist/{menus-BMGzWyWH.mjs → menus-BcQWxeXu.mjs} +5 -5
  418. package/dist/{menus-BMGzWyWH.mjs.map → menus-BcQWxeXu.mjs.map} +1 -1
  419. package/dist/{menus-CPf_SW7u.mjs → menus-Y54RDPIN.mjs} +215 -38
  420. package/dist/menus-Y54RDPIN.mjs.map +1 -0
  421. package/dist/{mode-fiXRMfeA.mjs → mode-BWyTBe3I.mjs} +1 -1
  422. package/dist/{mode-fiXRMfeA.mjs.map → mode-BWyTBe3I.mjs.map} +1 -1
  423. package/dist/{oauth-authorization-oqfbBuMH.mjs → oauth-authorization-ClvktmrL.mjs} +5 -5
  424. package/dist/{oauth-authorization-oqfbBuMH.mjs.map → oauth-authorization-ClvktmrL.mjs.map} +1 -1
  425. package/dist/{oauth-clients-BlrUHAsf.mjs → oauth-clients-8ao-U66l.mjs} +1 -1
  426. package/dist/{oauth-clients-BlrUHAsf.mjs.map → oauth-clients-8ao-U66l.mjs.map} +1 -1
  427. package/dist/{oauth-state-store-DnvjRMy6.mjs → oauth-state-store-B1ofdTiQ.mjs} +1 -1
  428. package/dist/{oauth-state-store-DnvjRMy6.mjs.map → oauth-state-store-B1ofdTiQ.mjs.map} +1 -1
  429. package/dist/{oauth-user-lookup-oUllxvAv.mjs → oauth-user-lookup-CscEuIiR.mjs} +1 -1
  430. package/dist/{oauth-user-lookup-oUllxvAv.mjs.map → oauth-user-lookup-CscEuIiR.mjs.map} +1 -1
  431. package/dist/object-cache/memory.d.mts +1 -1
  432. package/dist/{object-cache-Bok5j2ae.mjs → object-cache-71tPfV4A.mjs} +106 -5
  433. package/dist/object-cache-71tPfV4A.mjs.map +1 -0
  434. package/dist/{options-BqMkWfYa.d.mts → options-CA4eVX6P.d.mts} +3 -3
  435. package/dist/{options-BqMkWfYa.d.mts.map → options-CA4eVX6P.d.mts.map} +1 -1
  436. package/dist/{options-BlmBHTvX.mjs → options-CBXIHUoT.mjs} +1 -1
  437. package/dist/{options-BlmBHTvX.mjs.map → options-CBXIHUoT.mjs.map} +1 -1
  438. package/dist/page/index.d.mts +2 -2
  439. package/dist/{parse-53zyxlpv.mjs → parse-CJKNuewM.mjs} +2 -2
  440. package/dist/{parse-53zyxlpv.mjs.map → parse-CJKNuewM.mjs.map} +1 -1
  441. package/dist/{passkey-config-C-SKpc0-.mjs → passkey-config-D-zrzMJI.mjs} +1 -1
  442. package/dist/{passkey-config-C-SKpc0-.mjs.map → passkey-config-D-zrzMJI.mjs.map} +1 -1
  443. package/dist/{placeholder-Dop47JMM.d.mts → placeholder-DaeNS-VG.d.mts} +1 -1
  444. package/dist/{placeholder-Dop47JMM.d.mts.map → placeholder-DaeNS-VG.d.mts.map} +1 -1
  445. package/dist/plugin-types.d.mts +1 -1
  446. package/dist/plugin-utils.d.mts +10 -10
  447. package/dist/plugins/adapt-sandbox-entry.d.mts +10 -10
  448. package/dist/plugins/adapt-sandbox-entry.mjs +2 -2
  449. package/dist/{portable-text-sDj92Kxv.mjs → portable-text-B_kqBmXB.mjs} +1 -1
  450. package/dist/{portable-text-sDj92Kxv.mjs.map → portable-text-B_kqBmXB.mjs.map} +1 -1
  451. package/dist/{preview-D4Jnbfx7.mjs → preview-BU6PaLpM.mjs} +2 -2
  452. package/dist/{preview-D4Jnbfx7.mjs.map → preview-BU6PaLpM.mjs.map} +1 -1
  453. package/dist/{public-url-DSGTnJFw.mjs → public-url-Ox9oOlgp.mjs} +14 -3
  454. package/dist/public-url-Ox9oOlgp.mjs.map +1 -0
  455. package/dist/{query-Bz9bWZfm.mjs → query-C5w7PsRQ.mjs} +43 -44
  456. package/dist/query-C5w7PsRQ.mjs.map +1 -0
  457. package/dist/{query-DdFGHzQF.mjs → query-rC9HKv1N.mjs} +4 -4
  458. package/dist/{query-DdFGHzQF.mjs.map → query-rC9HKv1N.mjs.map} +1 -1
  459. package/dist/{rate-limit-D3IEiUi2.mjs → rate-limit-kug6q99V.mjs} +2 -2
  460. package/dist/{rate-limit-D3IEiUi2.mjs.map → rate-limit-kug6q99V.mjs.map} +1 -1
  461. package/dist/{redirect-BoUac4NT.mjs → redirect-DIJxXKOG.mjs} +3 -3
  462. package/dist/{redirect-BoUac4NT.mjs.map → redirect-DIJxXKOG.mjs.map} +1 -1
  463. package/dist/{redirect-Botom7X6.mjs → redirect-Egf2R9yP.mjs} +1 -1
  464. package/dist/{redirect-Botom7X6.mjs.map → redirect-Egf2R9yP.mjs.map} +1 -1
  465. package/dist/{redirects-ChbpqKiS.mjs → redirects-Bzm812bY.mjs} +5 -5
  466. package/dist/{redirects-ChbpqKiS.mjs.map → redirects-Bzm812bY.mjs.map} +1 -1
  467. package/dist/{redirects-D457qwt0.mjs → redirects-G8wAhWAf.mjs} +25 -7
  468. package/dist/redirects-G8wAhWAf.mjs.map +1 -0
  469. package/dist/{registry-y21kjhfG.mjs → registry-Dbodb4Uo.mjs} +59 -14
  470. package/dist/registry-Dbodb4Uo.mjs.map +1 -0
  471. package/dist/{relation-Du0r04E0.mjs → relation-Cbe3Sd3m.mjs} +3 -3
  472. package/dist/{relation-Du0r04E0.mjs.map → relation-Cbe3Sd3m.mjs.map} +1 -1
  473. package/dist/{relations-CZMpBqEd.mjs → relations-Bw_E1TXo.mjs} +3 -3
  474. package/dist/{relations-CZMpBqEd.mjs.map → relations-Bw_E1TXo.mjs.map} +1 -1
  475. package/dist/{relations-qKmSj9KM.d.mts → relations-G2ta7GIl.d.mts} +50 -12
  476. package/dist/relations-G2ta7GIl.d.mts.map +1 -0
  477. package/dist/{relations-DtX1UMBH.mjs → relations-qHwpUe66.mjs} +6 -6
  478. package/dist/{relations-DtX1UMBH.mjs.map → relations-qHwpUe66.mjs.map} +1 -1
  479. package/dist/request-context.d.mts +3 -0
  480. package/dist/request-context.d.mts.map +1 -1
  481. package/dist/request-context.mjs.map +1 -1
  482. package/dist/{request-meta-DzXYYI-n.mjs → request-meta-Df-jFbAd.mjs} +2 -2
  483. package/dist/{request-meta-DzXYYI-n.mjs.map → request-meta-Df-jFbAd.mjs.map} +1 -1
  484. package/dist/{resolve-DFr4kq72.mjs → resolve-DZzG4HqM.mjs} +2 -2
  485. package/dist/{resolve-DFr4kq72.mjs.map → resolve-DZzG4HqM.mjs.map} +1 -1
  486. package/dist/{runner-BdeLEgad.mjs → runner-BFTrkYhu.mjs} +497 -213
  487. package/dist/runner-BFTrkYhu.mjs.map +1 -0
  488. package/dist/{runner-Dd8m8k9F.d.mts → runner-BaADli8l.d.mts} +2 -2
  489. package/dist/{runner-Dd8m8k9F.d.mts.map → runner-BaADli8l.d.mts.map} +1 -1
  490. package/dist/runtime.d.mts +11 -11
  491. package/dist/runtime.mjs +3 -3
  492. package/dist/{schema-BH8P8vaC.mjs → schema-CiQXr6_F.mjs} +3 -3
  493. package/dist/{schema-BH8P8vaC.mjs.map → schema-CiQXr6_F.mjs.map} +1 -1
  494. package/dist/{scopes-DTIkIaGA.mjs → scopes-CNJVT5i5.mjs} +3 -3
  495. package/dist/{scopes-DTIkIaGA.mjs.map → scopes-CNJVT5i5.mjs.map} +1 -1
  496. package/dist/{search-D-Yhpmvs.mjs → search-FZhx5dDU.mjs} +7 -7
  497. package/dist/{search-D-Yhpmvs.mjs.map → search-FZhx5dDU.mjs.map} +1 -1
  498. package/dist/{secrets-CQ-69kF9.mjs → secrets-DLd8RXee.mjs} +4 -4
  499. package/dist/{secrets-CQ-69kF9.mjs.map → secrets-DLd8RXee.mjs.map} +1 -1
  500. package/dist/{sections-CzVBAKjw.mjs → sections-BrIrMUCn.mjs} +3 -3
  501. package/dist/{sections-CzVBAKjw.mjs.map → sections-BrIrMUCn.mjs.map} +1 -1
  502. package/dist/seed/index.d.mts +2 -2
  503. package/dist/seed/index.mjs +25 -23
  504. package/dist/seo/index.d.mts +3 -3
  505. package/dist/seo/index.mjs +18 -16
  506. package/dist/seo/index.mjs.map +1 -1
  507. package/dist/{seo-C3GDfT0V.mjs → seo-CobNfOvb.mjs} +2 -2
  508. package/dist/{seo-C3GDfT0V.mjs.map → seo-CobNfOvb.mjs.map} +1 -1
  509. package/dist/{seo-kJzVAmmu.mjs → seo-DTHRntNC.mjs} +3 -3
  510. package/dist/{seo-kJzVAmmu.mjs.map → seo-DTHRntNC.mjs.map} +1 -1
  511. package/dist/{service-CQnc276a.mjs → service-B-pYGPgR.mjs} +4 -4
  512. package/dist/{service-CQnc276a.mjs.map → service-B-pYGPgR.mjs.map} +1 -1
  513. package/dist/{session-user-DbHqKDKe.mjs → session-user-BvM9-zNl.mjs} +2 -2
  514. package/dist/{session-user-DbHqKDKe.mjs.map → session-user-BvM9-zNl.mjs.map} +1 -1
  515. package/dist/{settings-Dtc0DU31.mjs → settings-DPHau-WH.mjs} +3 -3
  516. package/dist/{settings-Dtc0DU31.mjs.map → settings-DPHau-WH.mjs.map} +1 -1
  517. package/dist/{settings-C2PaBS49.mjs → settings-kJhGiQ4z.mjs} +7 -7
  518. package/dist/{settings-C2PaBS49.mjs.map → settings-kJhGiQ4z.mjs.map} +1 -1
  519. package/dist/{setup-complete-CdIlqloh.mjs → setup-complete-u50Qm8rY.mjs} +2 -2
  520. package/dist/{setup-complete-CdIlqloh.mjs.map → setup-complete-u50Qm8rY.mjs.map} +1 -1
  521. package/dist/{setup-nonce-DqiIPr-J.mjs → setup-nonce-DCjiiOD2.mjs} +1 -1
  522. package/dist/{setup-nonce-DqiIPr-J.mjs.map → setup-nonce-DCjiiOD2.mjs.map} +1 -1
  523. package/dist/{single-flight-cache-C2exrGAi.mjs → single-flight-cache-DW3w11Pu.mjs} +1 -1
  524. package/dist/{single-flight-cache-C2exrGAi.mjs.map → single-flight-cache-DW3w11Pu.mjs.map} +1 -1
  525. package/dist/site-url-I-lJ5kma.mjs +16 -0
  526. package/dist/site-url-I-lJ5kma.mjs.map +1 -0
  527. package/dist/{snapshot-BdpUJKD-.mjs → snapshot-I_fjLDaD.mjs} +2 -2
  528. package/dist/{snapshot-BdpUJKD-.mjs.map → snapshot-I_fjLDaD.mjs.map} +1 -1
  529. package/dist/{ssrf-CviKqWmq.mjs → ssrf-CTa6v21i.mjs} +1 -1
  530. package/dist/{ssrf-CviKqWmq.mjs.map → ssrf-CTa6v21i.mjs.map} +1 -1
  531. package/dist/{state-xxv6ZTMv.mjs → state-CQvoefYP.mjs} +1 -1
  532. package/dist/{state-xxv6ZTMv.mjs.map → state-CQvoefYP.mjs.map} +1 -1
  533. package/dist/{status-COfycGIU.mjs → status-CIsmlC1E.mjs} +1 -1
  534. package/dist/{status-COfycGIU.mjs.map → status-CIsmlC1E.mjs.map} +1 -1
  535. package/dist/storage/local.d.mts +1 -1
  536. package/dist/storage/local.mjs +1 -1
  537. package/dist/storage/s3.d.mts +1 -1
  538. package/dist/storage/s3.mjs +2 -2
  539. package/dist/storage/s3.mjs.map +1 -1
  540. package/dist/{taxonomies-BN6M9Nrv.mjs → taxonomies-CKuaZER5.mjs} +90 -9
  541. package/dist/taxonomies-CKuaZER5.mjs.map +1 -0
  542. package/dist/{taxonomies-r7pqLBCn.mjs → taxonomies-CLN1N92E.mjs} +57 -32
  543. package/dist/taxonomies-CLN1N92E.mjs.map +1 -0
  544. package/dist/{taxonomy-0mCI25HN.mjs → taxonomy-pOrB2kZe.mjs} +142 -15
  545. package/dist/taxonomy-pOrB2kZe.mjs.map +1 -0
  546. package/dist/{tokens-DVltpO2D.mjs → tokens-DagaJGK8.mjs} +1 -1
  547. package/dist/{tokens-DVltpO2D.mjs.map → tokens-DagaJGK8.mjs.map} +1 -1
  548. package/dist/{transaction-D0FOsb3X.mjs → transaction-NQj4VJ7Z.mjs} +1 -1
  549. package/dist/{transaction-D0FOsb3X.mjs.map → transaction-NQj4VJ7Z.mjs.map} +1 -1
  550. package/dist/{transport-Vd7VdqHv.d.mts → transport-CAwTaTp_.d.mts} +1 -1
  551. package/dist/{transport-Vd7VdqHv.d.mts.map → transport-CAwTaTp_.d.mts.map} +1 -1
  552. package/dist/{transport-CKrlqSpD.mjs → transport-DVsa5YYo.mjs} +1 -1
  553. package/dist/{transport-CKrlqSpD.mjs.map → transport-DVsa5YYo.mjs.map} +1 -1
  554. package/dist/{trusted-proxy-CwjQj0YG.mjs → trusted-proxy-D20_7fyX.mjs} +1 -1
  555. package/dist/{trusted-proxy-CwjQj0YG.mjs.map → trusted-proxy-D20_7fyX.mjs.map} +1 -1
  556. package/dist/{types-BfYUPJdP.d.mts → types-BGWPMiBO.d.mts} +2 -2
  557. package/dist/{types-BfYUPJdP.d.mts.map → types-BGWPMiBO.d.mts.map} +1 -1
  558. package/dist/{types-iVeZ5g6N.d.mts → types-BK6U01Ro.d.mts} +1 -1
  559. package/dist/{types-iVeZ5g6N.d.mts.map → types-BK6U01Ro.d.mts.map} +1 -1
  560. package/dist/{types-BD40g7zz.mjs → types-BjxTKxrZ.mjs} +1 -1
  561. package/dist/{types-BD40g7zz.mjs.map → types-BjxTKxrZ.mjs.map} +1 -1
  562. package/dist/{types-Kmaxdarz.d.mts → types-BnFP1M3J.d.mts} +22 -1
  563. package/dist/types-BnFP1M3J.d.mts.map +1 -0
  564. package/dist/{types-C7U0HlEr.d.mts → types-C8oz_ayJ.d.mts} +1 -1
  565. package/dist/{types-C7U0HlEr.d.mts.map → types-C8oz_ayJ.d.mts.map} +1 -1
  566. package/dist/{types-B4vm81VH.d.mts → types-CbUcuxxc.d.mts} +1 -1
  567. package/dist/{types-B4vm81VH.d.mts.map → types-CbUcuxxc.d.mts.map} +1 -1
  568. package/dist/{types-CrRUFdej.mjs → types-Cd8iuS1J.mjs} +10 -3
  569. package/dist/{types-CrRUFdej.mjs.map → types-Cd8iuS1J.mjs.map} +1 -1
  570. package/dist/types-CtzytVXn.mjs +18 -0
  571. package/dist/types-CtzytVXn.mjs.map +1 -0
  572. package/dist/{types-BvB7gDOD.d.mts → types-Cz8hNch2.d.mts} +5 -5
  573. package/dist/{types-BvB7gDOD.d.mts.map → types-Cz8hNch2.d.mts.map} +1 -1
  574. package/dist/{types-B97jg3aW.d.mts → types-DLG4IFEQ.d.mts} +1 -1
  575. package/dist/{types-B97jg3aW.d.mts.map → types-DLG4IFEQ.d.mts.map} +1 -1
  576. package/dist/{types-DPKhI5ib.d.mts → types-Dc4ntQjQ.d.mts} +18 -1
  577. package/dist/types-Dc4ntQjQ.d.mts.map +1 -0
  578. package/dist/{types-BNfPHfay.d.mts → types-LoagAGzH.d.mts} +1 -1
  579. package/dist/{types-BNfPHfay.d.mts.map → types-LoagAGzH.d.mts.map} +1 -1
  580. package/dist/{types-o7xo7VgH.mjs → types-NBI3rF-_.mjs} +3 -2
  581. package/dist/types-NBI3rF-_.mjs.map +1 -0
  582. package/dist/upload-attempts-D8QAFLUJ.mjs +27 -0
  583. package/dist/upload-attempts-D8QAFLUJ.mjs.map +1 -0
  584. package/dist/{user-aTXqmXBz.mjs → user-DBrq4UVq.mjs} +3 -3
  585. package/dist/{user-aTXqmXBz.mjs.map → user-DBrq4UVq.mjs.map} +1 -1
  586. package/dist/{utils-BbUgmeZG.mjs → utils-hLzi_2Fn.mjs} +2 -2
  587. package/dist/{utils-BbUgmeZG.mjs.map → utils-hLzi_2Fn.mjs.map} +1 -1
  588. package/dist/{validate-VPnKoIzW.mjs → validate-BpwoDOgt.mjs} +25 -2
  589. package/dist/validate-BpwoDOgt.mjs.map +1 -0
  590. package/dist/{validate-DULfgpJP.d.mts → validate-C3oSmA7F.d.mts} +15 -5
  591. package/dist/validate-C3oSmA7F.d.mts.map +1 -0
  592. package/dist/{validate-CDT1jl6_.mjs → validate-mKo3RxBM.mjs} +4 -4
  593. package/dist/{validate-CDT1jl6_.mjs.map → validate-mKo3RxBM.mjs.map} +1 -1
  594. package/dist/{validation-DlD0E35W.mjs → validation-BgpucsvF.mjs} +11 -9
  595. package/dist/{validation-DlD0E35W.mjs.map → validation-BgpucsvF.mjs.map} +1 -1
  596. package/dist/version-C4PnpmoV.mjs +7 -0
  597. package/dist/{version-BRMngh9I.mjs.map → version-C4PnpmoV.mjs.map} +1 -1
  598. package/dist/{widgets-5fipNkMT.mjs → widgets-CJJtkiKh.mjs} +3 -3
  599. package/dist/{widgets-5fipNkMT.mjs.map → widgets-CJJtkiKh.mjs.map} +1 -1
  600. package/dist/{wxr-taxonomies-DrihupaC.mjs → wxr-taxonomies-9PPSy8X6.mjs} +4 -4
  601. package/dist/{wxr-taxonomies-DrihupaC.mjs.map → wxr-taxonomies-9PPSy8X6.mjs.map} +1 -1
  602. package/dist/{wxr-taxonomies-B4tMuN5T.d.mts → wxr-taxonomies-Bkpp_2tK.d.mts} +1 -1
  603. package/dist/{wxr-taxonomies-B4tMuN5T.d.mts.map → wxr-taxonomies-Bkpp_2tK.d.mts.map} +1 -1
  604. package/dist/{zod-generator-CwkHWz4f.mjs → zod-generator-CG64Hnbh.mjs} +3 -3
  605. package/dist/{zod-generator-CwkHWz4f.mjs.map → zod-generator-CG64Hnbh.mjs.map} +1 -1
  606. package/package.json +12 -8
  607. package/src/after.ts +6 -1
  608. package/src/api/errors.ts +1 -0
  609. package/src/api/handlers/content.ts +45 -4
  610. package/src/api/handlers/marketplace.ts +14 -0
  611. package/src/api/handlers/media.ts +4 -4
  612. package/src/api/handlers/registry.ts +14 -0
  613. package/src/api/handlers/revision.ts +19 -5
  614. package/src/api/handlers/schema.ts +37 -0
  615. package/src/api/handlers/snapshot.ts +1 -1
  616. package/src/api/handlers/taxonomies.ts +111 -10
  617. package/src/api/openapi/document.ts +84 -3
  618. package/src/api/public-url.ts +14 -2
  619. package/src/api/schemas/media.ts +9 -2
  620. package/src/api/schemas/schema.ts +13 -0
  621. package/src/api/schemas/search.ts +2 -0
  622. package/src/api/schemas/taxonomies.ts +34 -1
  623. package/src/api/site-url.ts +16 -6
  624. package/src/astro/integration/routes.ts +19 -0
  625. package/src/astro/integration/runtime.ts +13 -0
  626. package/src/astro/integration/virtual-modules.ts +2 -0
  627. package/src/astro/middleware/redirect.ts +2 -10
  628. package/src/astro/middleware/scoped-db.ts +35 -4
  629. package/src/astro/middleware.ts +56 -22
  630. package/src/astro/routes/api/admin/comments/[id]/status.ts +1 -1
  631. package/src/astro/routes/api/admin/users/[id]/send-recovery.ts +2 -2
  632. package/src/astro/routes/api/auth/invite/index.ts +2 -2
  633. package/src/astro/routes/api/auth/magic-link/send.ts +2 -2
  634. package/src/astro/routes/api/auth/signup/request.ts +2 -2
  635. package/src/astro/routes/api/comments/[collection]/[contentId]/index.ts +1 -1
  636. package/src/astro/routes/api/content/[collection]/[id].ts +3 -1
  637. package/src/astro/routes/api/media/[id]/confirm.ts +148 -59
  638. package/src/astro/routes/api/media/[id]/upload.ts +262 -0
  639. package/src/astro/routes/api/media/[id].ts +19 -10
  640. package/src/astro/routes/api/media/upload-url.ts +28 -31
  641. package/src/astro/routes/api/schema/collections/reorder.ts +31 -0
  642. package/src/astro/routes/api/schema/index.ts +2 -0
  643. package/src/astro/routes/api/search/enable.ts +5 -1
  644. package/src/astro/routes/api/search/rebuild.ts +6 -1
  645. package/src/astro/routes/api/taxonomies/[name]/reorder.ts +41 -0
  646. package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +6 -3
  647. package/src/astro/types.ts +7 -0
  648. package/src/cleanup.ts +54 -26
  649. package/src/cli/commands/dev.ts +13 -3
  650. package/src/cli/commands/export-seed.ts +2 -0
  651. package/src/cli/index.ts +1 -1
  652. package/src/components/CommentForm.astro +1 -1
  653. package/src/components/Comments.astro +1 -1
  654. package/src/components/InlinePortableTextEditor.tsx +175 -31
  655. package/src/components/OrderedList.astro +14 -0
  656. package/src/components/PortableText.astro +26 -4
  657. package/src/components/code-mark.ts +11 -0
  658. package/src/components/index.ts +12 -1
  659. package/src/components/ordered-list.ts +549 -0
  660. package/src/content/converters/numbered-list.ts +148 -0
  661. package/src/content/converters/portable-text-to-prosemirror.ts +59 -9
  662. package/src/content/converters/prosemirror-to-portable-text.ts +23 -12
  663. package/src/content/converters/types.ts +2 -0
  664. package/src/content/portable-text-lists.ts +205 -0
  665. package/src/database/dialect-helpers.ts +41 -22
  666. package/src/database/migrations/054_media_upload_attempts.ts +41 -0
  667. package/src/database/migrations/055_content_translation_group_locale_index.ts +67 -0
  668. package/src/database/migrations/056_taxonomy_term_sort_order.ts +189 -0
  669. package/src/database/migrations/057_collection_hidden.ts +24 -0
  670. package/src/database/migrations/058_collection_sort_order.ts +20 -0
  671. package/src/database/migrations/059_revision_prune_queue.ts +36 -0
  672. package/src/database/migrations/runner.ts +12 -0
  673. package/src/database/repositories/content.ts +193 -183
  674. package/src/database/repositories/media.ts +158 -28
  675. package/src/database/repositories/revision.ts +82 -17
  676. package/src/database/repositories/taxonomy.ts +202 -7
  677. package/src/database/repositories/types.ts +7 -0
  678. package/src/database/types.ts +23 -1
  679. package/src/database/validate.ts +39 -0
  680. package/src/db/adapters.ts +8 -0
  681. package/src/deferred-tasks.ts +71 -0
  682. package/src/emdash-runtime.ts +277 -88
  683. package/src/i18n/config.ts +17 -10
  684. package/src/index.ts +3 -0
  685. package/src/loader.ts +46 -24
  686. package/src/media/upload-attempts.ts +33 -0
  687. package/src/media/usage/gc.ts +50 -0
  688. package/src/object-cache/index.ts +160 -3
  689. package/src/plugins/routes.ts +34 -0
  690. package/src/plugins/storage-indexes.ts +50 -11
  691. package/src/query.ts +50 -44
  692. package/src/redirects/cache.ts +79 -19
  693. package/src/request-context.ts +3 -0
  694. package/src/scheduled-publish.ts +6 -1
  695. package/src/schema/registry.ts +95 -3
  696. package/src/schema/types.ts +24 -0
  697. package/src/search/fts-manager.ts +50 -10
  698. package/src/search/index.ts +2 -0
  699. package/src/search/types.ts +6 -0
  700. package/src/seed/apply.ts +22 -2
  701. package/src/seed/types.ts +10 -0
  702. package/src/storage/s3.ts +1 -1
  703. package/src/taxonomies/index.ts +11 -7
  704. package/src/taxonomies/term-counts.ts +56 -28
  705. package/src/ui-comments.ts +19 -0
  706. package/src/ui.ts +11 -3
  707. package/src/utils/hash.ts +14 -3
  708. package/src/virtual-modules.d.ts +8 -0
  709. package/dist/adapters-C0ONzkUP.d.mts.map +0 -1
  710. package/dist/after-B1IIdH3Y.mjs +0 -29
  711. package/dist/after-B1IIdH3Y.mjs.map +0 -1
  712. package/dist/api-BkqFzIu4.mjs.map +0 -1
  713. package/dist/apply-DuXsqll7.mjs.map +0 -1
  714. package/dist/cache-DDwy3JDW.mjs +0 -65
  715. package/dist/cache-DDwy3JDW.mjs.map +0 -1
  716. package/dist/config-B6b_BobR.mjs.map +0 -1
  717. package/dist/content-BC43pICM.mjs.map +0 -1
  718. package/dist/dialect-helpers-BtOwo2us.mjs.map +0 -1
  719. package/dist/errors-DtEXIQQV.mjs.map +0 -1
  720. package/dist/fts-manager-hyCU9OOp.mjs.map +0 -1
  721. package/dist/hash-DFFrkivP.mjs.map +0 -1
  722. package/dist/index-BZJ_5FOX.d.mts.map +0 -1
  723. package/dist/loader-D4rigvjR.mjs.map +0 -1
  724. package/dist/media-its1WLYv.mjs.map +0 -1
  725. package/dist/menus-CPf_SW7u.mjs.map +0 -1
  726. package/dist/object-cache-Bok5j2ae.mjs.map +0 -1
  727. package/dist/public-url-DSGTnJFw.mjs.map +0 -1
  728. package/dist/query-Bz9bWZfm.mjs.map +0 -1
  729. package/dist/redirects-D457qwt0.mjs.map +0 -1
  730. package/dist/registry-y21kjhfG.mjs.map +0 -1
  731. package/dist/relations-qKmSj9KM.d.mts.map +0 -1
  732. package/dist/runner-BdeLEgad.mjs.map +0 -1
  733. package/dist/site-url-NGJT6NTU.mjs +0 -13
  734. package/dist/site-url-NGJT6NTU.mjs.map +0 -1
  735. package/dist/taxonomies-BN6M9Nrv.mjs.map +0 -1
  736. package/dist/taxonomies-r7pqLBCn.mjs.map +0 -1
  737. package/dist/taxonomy-0mCI25HN.mjs.map +0 -1
  738. package/dist/types-DPKhI5ib.d.mts.map +0 -1
  739. package/dist/types-Kmaxdarz.d.mts.map +0 -1
  740. package/dist/types-o7xo7VgH.mjs.map +0 -1
  741. package/dist/validate-DULfgpJP.d.mts.map +0 -1
  742. package/dist/validate-VPnKoIzW.mjs.map +0 -1
  743. package/dist/version-BRMngh9I.mjs +0 -7
  744. /package/dist/{api-tokens-Cvmixds7.mjs → api-tokens-Dai9dND0.mjs} +0 -0
  745. /package/dist/{ssrf-BB__xfNM.mjs → ssrf-Cj568Dgs.mjs} +0 -0
  746. /package/dist/{types-CK0LxPUQ.mjs → types-DKuWPYV5.mjs} +0 -0
@@ -9,7 +9,7 @@
9
9
 
10
10
  import { Permissions } from "@emdash-cms/auth";
11
11
  import type { Element } from "@emdash-cms/blocks";
12
- import { Kysely, sql, type Dialect } from "kysely";
12
+ import { Kysely, type Dialect } from "kysely";
13
13
  import virtualConfig from "virtual:emdash/config";
14
14
  import { z } from "zod";
15
15
 
@@ -30,12 +30,13 @@ import {
30
30
  runMigrations,
31
31
  } from "./database/migrations/runner.js";
32
32
  import { AuditRepository } from "./database/repositories/audit.js";
33
+ import { ContentRepository } from "./database/repositories/content.js";
33
34
  import { RevisionRepository } from "./database/repositories/revision.js";
35
+ import { ContentMutationConflictError } from "./database/repositories/types.js";
34
36
  import type {
35
37
  ContentItem as ContentItemInternal,
36
38
  ContentDateField,
37
39
  } from "./database/repositories/types.js";
38
- import { validateIdentifier } from "./database/validate.js";
39
40
  import { getI18nConfig } from "./i18n/config.js";
40
41
  import { repairLocaleCasing } from "./i18n/repair-locale-casing.js";
41
42
  import { normalizeMediaValue } from "./media/normalize.js";
@@ -182,6 +183,7 @@ import {
182
183
  type Storage,
183
184
  } from "./index.js";
184
185
  import { getDb } from "./loader.js";
186
+ import { isRecord } from "./plugin-utils.js";
185
187
  import { CronExecutor, type InvokeCronHookFn } from "./plugins/cron.js";
186
188
  import { definePlugin } from "./plugins/define-plugin.js";
187
189
  import { DEV_CONSOLE_EMAIL_PLUGIN_ID, devConsoleEmailDeliver } from "./plugins/email-console.js";
@@ -193,9 +195,15 @@ import {
193
195
  } from "./plugins/hooks.js";
194
196
  import { normalizeManifestRoute } from "./plugins/manifest-schema.js";
195
197
  import { extractRequestMeta, sanitizeHeadersForSandbox } from "./plugins/request-meta.js";
196
- import { buildRouteMeta, PluginRouteRegistry, type RouteMeta } from "./plugins/routes.js";
198
+ import {
199
+ buildRouteMeta,
200
+ parseRouteInput,
201
+ PluginRouteRegistry,
202
+ type RouteMeta,
203
+ } from "./plugins/routes.js";
197
204
  import type { CronScheduler } from "./plugins/scheduler/types.js";
198
205
  import { PluginStateRepository } from "./plugins/state.js";
206
+ import { syncDeclaredStorageIndexes } from "./plugins/storage-indexes.js";
199
207
  import { normalizeRegistryConfig } from "./registry/config.js";
200
208
  import { requestCached } from "./request-cache.js";
201
209
  import { getRequestContext } from "./request-context.js";
@@ -225,6 +233,9 @@ const FIELD_TYPE_TO_KIND: Record<FieldType, string> = {
225
233
  repeater: "repeater",
226
234
  };
227
235
 
236
+ const DRAFT_ONLY_UPDATE_KEYS = new Set(["data", "slug", "locale", "skipRevision"]);
237
+ const MAX_DRAFT_STAGE_ATTEMPTS = 32;
238
+
228
239
  /**
229
240
  * Sandboxed plugin entry from virtual module
230
241
  */
@@ -241,6 +252,10 @@ export interface SandboxedPluginEntry {
241
252
  storage: PluginStorageConfig;
242
253
  /** Serialized MCP declarations emitted at plugin build time. */
243
254
  mcp?: PluginMcpManifestConfig;
255
+ /** Route declarations (name + public/permission/cacheControl), used for route auth decisions */
256
+ routes?: PluginManifest["routes"];
257
+ /** Hook declarations this plugin implements */
258
+ hooks?: PluginManifest["hooks"];
244
259
  /** Admin pages */
245
260
  adminPages?: Array<{ path: string; label?: string; icon?: string }>;
246
261
  /** Dashboard widgets */
@@ -492,6 +507,7 @@ const marketplaceManifestCache = new Map<
492
507
  settingsSchema?: Record<string, SettingField>;
493
508
  };
494
509
  mcp?: PluginMcpManifestConfig;
510
+ storage?: PluginManifest["storage"];
495
511
  }
496
512
  >();
497
513
  /** Route metadata for sandboxed plugins: pluginId -> routeName -> RouteMeta */
@@ -553,6 +569,8 @@ export class EmDashRuntime {
553
569
  /** All plugins eligible for the hook pipeline (includes built-in plugins).
554
570
  * Stored so we can rebuild the pipeline when plugins are enabled/disabled. */
555
571
  private allPipelinePlugins: ResolvedPlugin[];
572
+ /** Guards the once-per-process plugin storage-index sync. */
573
+ private storageIndexesSynced = false;
556
574
  /** Factory options for the hook pipeline context factory */
557
575
  private pipelineFactoryOptions: {
558
576
  db: Kysely<Database>;
@@ -683,12 +701,36 @@ export class EmDashRuntime {
683
701
  console.error("[cleanup] System cleanup failed:", error);
684
702
  }
685
703
 
704
+ try {
705
+ await this.syncPluginStorageIndexesOnce();
706
+ } catch (error) {
707
+ console.error("[plugins] Storage index sync failed:", error);
708
+ }
709
+
686
710
  // Never throws; no-op unless scheduled backups are enabled and due.
687
711
  await maybeRunScheduledBackup(this.db, this.storage ?? undefined);
688
712
 
689
713
  return { published };
690
714
  }
691
715
 
716
+ /**
717
+ * Materialize plugin-declared storage indexes, once per process.
718
+ *
719
+ * Called from the scheduler path, not from request handlers — configured
720
+ * plugins have no install handler, so the tick is their only sync moment.
721
+ */
722
+ async syncPluginStorageIndexesOnce(): Promise<void> {
723
+ if (this.storageIndexesSynced) return;
724
+ this.storageIndexesSynced = true;
725
+ // Sandboxed marketplace/registry plugins never join allPipelinePlugins;
726
+ // their manifests are cached at bundle load. Without them, plugins
727
+ // installed before this feature shipped would never get their indexes.
728
+ await syncDeclaredStorageIndexes(this.db, [
729
+ ...this.allPipelinePlugins,
730
+ ...marketplaceManifestCache.values(),
731
+ ]);
732
+ }
733
+
692
734
  /**
693
735
  * Stop the cron scheduler gracefully.
694
736
  * Call during worker shutdown or hot-reload.
@@ -896,6 +938,7 @@ export class EmDashRuntime {
896
938
  version: bundle.manifest.version,
897
939
  admin: bundle.manifest.admin,
898
940
  mcp: bundle.manifest.mcp,
941
+ storage: bundle.manifest.storage,
899
942
  });
900
943
 
901
944
  // Cache route metadata from manifest for auth decisions
@@ -1011,6 +1054,7 @@ export class EmDashRuntime {
1011
1054
  version: bundle.manifest.version,
1012
1055
  admin: bundle.manifest.admin,
1013
1056
  mcp: bundle.manifest.mcp,
1057
+ storage: bundle.manifest.storage,
1014
1058
  });
1015
1059
  if (bundle.manifest.routes.length > 0) {
1016
1060
  const routeMetaMap = new Map<string, RouteMeta>();
@@ -1612,6 +1656,11 @@ export class EmDashRuntime {
1612
1656
  // by runSystemCleanup. This catches unexpected errors.
1613
1657
  console.error("[cleanup] System cleanup failed:", error);
1614
1658
  }
1659
+ try {
1660
+ await runtimeRef.current?.syncPluginStorageIndexesOnce();
1661
+ } catch (error) {
1662
+ console.error("[plugins] Storage index sync failed:", error);
1663
+ }
1615
1664
  // Never throws; no-op unless scheduled backups are enabled and due.
1616
1665
  await maybeRunScheduledBackup(db, storage ?? undefined);
1617
1666
  });
@@ -1977,8 +2026,8 @@ export class EmDashRuntime {
1977
2026
  capabilities: entry.capabilities ?? [],
1978
2027
  allowedHosts: entry.allowedHosts ?? [],
1979
2028
  storage: entry.storage ?? {},
1980
- hooks: [],
1981
- routes: [],
2029
+ hooks: entry.hooks ?? [],
2030
+ routes: entry.routes ?? [],
1982
2031
  admin: {},
1983
2032
  mcp: entry.mcp,
1984
2033
  };
@@ -1988,6 +2037,17 @@ export class EmDashRuntime {
1988
2037
  console.log(
1989
2038
  `EmDash: Loaded sandboxed plugin ${pluginKey} with capabilities: [${manifest.capabilities.join(", ")}]`,
1990
2039
  );
2040
+
2041
+ if (manifest.routes.length > 0) {
2042
+ const routeMetaMap = new Map<string, RouteMeta>();
2043
+ for (const routeEntry of manifest.routes) {
2044
+ const normalized = normalizeManifestRoute(routeEntry);
2045
+ routeMetaMap.set(normalized.name, buildRouteMeta(normalized));
2046
+ }
2047
+ sandboxedRouteMetaCache.set(entry.id, routeMetaMap);
2048
+ } else {
2049
+ sandboxedRouteMetaCache.delete(entry.id);
2050
+ }
1991
2051
  } catch (error) {
1992
2052
  console.error(`EmDash: Failed to load sandboxed plugin ${entry.id}:`, error);
1993
2053
  }
@@ -2090,6 +2150,7 @@ export class EmDashRuntime {
2090
2150
  version: bundle.manifest.version,
2091
2151
  admin: bundle.manifest.admin,
2092
2152
  mcp: bundle.manifest.mcp,
2153
+ storage: bundle.manifest.storage,
2093
2154
  });
2094
2155
 
2095
2156
  // Cache route metadata from manifest for auth decisions
@@ -2162,6 +2223,7 @@ export class EmDashRuntime {
2162
2223
  version: bundle.manifest.version,
2163
2224
  admin: bundle.manifest.admin,
2164
2225
  mcp: bundle.manifest.mcp,
2226
+ storage: bundle.manifest.storage,
2165
2227
  });
2166
2228
  if (bundle.manifest.routes.length > 0) {
2167
2229
  const routeMeta = new Map<string, RouteMeta>();
@@ -2362,6 +2424,7 @@ export class EmDashRuntime {
2362
2424
  supports: collection.supports || [],
2363
2425
  hasSeo: collection.hasSeo,
2364
2426
  urlPattern: collection.urlPattern,
2427
+ ...(collection.hidden ? { hidden: true } : {}),
2365
2428
  fields,
2366
2429
  };
2367
2430
  }
@@ -2769,13 +2832,12 @@ export class EmDashRuntime {
2769
2832
  taxonomies?: Record<string, string[]>;
2770
2833
  publishedAt?: string | null;
2771
2834
  locale?: string;
2772
- /** Skip revision creation (used by autosave) */
2835
+ /** Replace the previous autosave revision after staging this save. */
2773
2836
  skipRevision?: boolean;
2774
2837
  _rev?: string;
2775
2838
  },
2776
2839
  ) {
2777
2840
  // Resolve slug → ID if needed (before any lookups)
2778
- const { ContentRepository } = await import("./database/repositories/content.js");
2779
2841
  const repo = new ContentRepository(this.db);
2780
2842
  const resolvedItem = await repo.findByIdOrSlug(collection, id, body.locale);
2781
2843
  const resolvedId = resolvedItem?.id ?? id;
@@ -2838,76 +2900,122 @@ export class EmDashRuntime {
2838
2900
  let usesDraftRevisions = false;
2839
2901
  let draftStorageChanged = false;
2840
2902
  if (processedData) {
2841
- try {
2842
- const collectionInfo = await this.schemaRegistry.getCollectionWithFields(collection);
2843
- if (collectionInfo?.supports?.includes("revisions")) {
2844
- usesDraftRevisions = true;
2845
- const revisionRepo = new RevisionRepository(this.db);
2846
- // Re-fetch to get latest state (resolvedItem may be stale after _rev check)
2847
- const existing = await repo.findById(collection, resolvedId);
2848
-
2849
- if (existing) {
2850
- // Build the draft data: merge with existing draft revision if one exists,
2851
- // otherwise merge with the published data from the content table
2852
- let baseData: Record<string, unknown>;
2853
- if (existing.draftRevisionId) {
2854
- const draftRevision = await revisionRepo.findById(existing.draftRevisionId);
2855
- baseData = draftRevision?.data ?? existing.data;
2856
- } else {
2857
- baseData = existing.data;
2903
+ const collectionInfo = await this.schemaRegistry.getCollectionWithFields(collection);
2904
+ if (collectionInfo?.supports?.includes("revisions")) {
2905
+ usesDraftRevisions = true;
2906
+ const revisionRepo = new RevisionRepository(this.db);
2907
+ let existing = await repo.findById(collection, resolvedId);
2908
+
2909
+ for (let attempt = 0; existing && attempt < MAX_DRAFT_STAGE_ATTEMPTS; attempt++) {
2910
+ let baseData: Record<string, unknown>;
2911
+ if (existing.draftRevisionId) {
2912
+ const draftRevision = await revisionRepo.findById(existing.draftRevisionId);
2913
+ baseData = draftRevision?.data ?? existing.data;
2914
+ } else {
2915
+ baseData = existing.data;
2916
+ }
2917
+
2918
+ const mergedData = { ...baseData, ...processedData };
2919
+ if (bodyWithoutRev.slug !== undefined) {
2920
+ mergedData._slug = bodyWithoutRev.slug;
2921
+ }
2922
+
2923
+ const revision = await revisionRepo.create({
2924
+ collection,
2925
+ entryId: resolvedId,
2926
+ data: mergedData,
2927
+ authorId: bodyWithoutRev.authorId ?? undefined,
2928
+ });
2929
+
2930
+ let staged: boolean;
2931
+ try {
2932
+ staged = await repo.replaceDraftRevision(collection, resolvedId, revision.id, existing);
2933
+ } catch (error) {
2934
+ try {
2935
+ await revisionRepo.deleteIfUnreferenced(collection, resolvedId, revision.id);
2936
+ } catch (cleanupError) {
2937
+ console.error(
2938
+ `[emdash] Failed to clean up unstaged revision ${revision.id}:`,
2939
+ cleanupError,
2940
+ );
2858
2941
  }
2942
+ throw error;
2943
+ }
2859
2944
 
2860
- // Include slug in the revision data if it changed
2861
- const mergedData = { ...baseData, ...processedData };
2862
- if (bodyWithoutRev.slug !== undefined) {
2863
- mergedData._slug = bodyWithoutRev.slug;
2945
+ if (!staged) {
2946
+ try {
2947
+ await revisionRepo.deleteIfUnreferenced(collection, resolvedId, revision.id);
2948
+ } catch (cleanupError) {
2949
+ console.error(
2950
+ `[emdash] Failed to clean up unstaged revision ${revision.id}:`,
2951
+ cleanupError,
2952
+ );
2953
+ }
2954
+ if (body._rev || attempt === MAX_DRAFT_STAGE_ATTEMPTS - 1) {
2955
+ const error = new ContentMutationConflictError();
2956
+ return {
2957
+ success: false as const,
2958
+ error: { code: "CONFLICT", message: error.message },
2959
+ };
2864
2960
  }
2961
+ existing = await repo.findById(collection, resolvedId);
2962
+ continue;
2963
+ }
2865
2964
 
2866
- if (bodyWithoutRev.skipRevision && existing.draftRevisionId) {
2867
- // Autosave: update existing draft revision in place
2868
- await revisionRepo.updateData(existing.draftRevisionId, mergedData);
2869
- draftStorageChanged = true;
2870
- } else {
2871
- // Create new draft revision
2872
- const revision = await revisionRepo.create({
2873
- collection,
2874
- entryId: resolvedId,
2875
- data: mergedData,
2876
- authorId: bodyWithoutRev.authorId ?? undefined,
2877
- });
2965
+ draftStorageChanged = true;
2878
2966
 
2879
- // Update entry to point to new draft (metadata only, not data columns).
2880
- // No updated_at stamp: draft staging leaves live content untouched,
2881
- // so public "last modified" consumers must not see a change (#2143).
2882
- validateIdentifier(collection, "collection");
2883
- const tableName = `ec_${collection}`;
2884
- await sql`
2885
- UPDATE ${sql.ref(tableName)}
2886
- SET draft_revision_id = ${revision.id}
2887
- WHERE id = ${resolvedId}
2888
- `.execute(this.db);
2889
- draftStorageChanged = true;
2890
-
2891
- // Fire-and-forget: prune old revisions to prevent unbounded growth
2892
- void revisionRepo.pruneOldRevisions(collection, resolvedId, 50).catch(() => {});
2967
+ if (bodyWithoutRev.skipRevision && existing.draftRevisionId) {
2968
+ try {
2969
+ await revisionRepo.deleteIfUnreferenced(
2970
+ collection,
2971
+ resolvedId,
2972
+ existing.draftRevisionId,
2973
+ );
2974
+ } catch (error) {
2975
+ console.error(
2976
+ `[emdash] Failed to clean up superseded revision ${existing.draftRevisionId}:`,
2977
+ error,
2978
+ );
2893
2979
  }
2980
+ } else {
2981
+ after(async () => {
2982
+ try {
2983
+ await revisionRepo.pruneQueuedEntry(collection, resolvedId, revision.id, 50);
2984
+ } catch (error) {
2985
+ console.error(
2986
+ `[revisions] Failed to prune revisions for ${collection}/${resolvedId}:`,
2987
+ error,
2988
+ );
2989
+ }
2990
+ });
2894
2991
  }
2992
+ break;
2895
2993
  }
2896
- } catch {
2897
- // Don't fail the update if revision creation fails
2898
2994
  }
2899
2995
  }
2900
2996
 
2997
+ // Public HTML comes from live columns / SEO / taxonomies, not draft revisions.
2998
+ const liveMetaTouched = Object.entries(bodyWithoutRev).some(
2999
+ ([key, value]) => value !== undefined && !DRAFT_ONLY_UPDATE_KEYS.has(key),
3000
+ );
3001
+
2901
3002
  // Update the content table:
2902
3003
  // - If collection uses draft revisions: only update metadata (no data fields, no slug)
2903
3004
  // - Otherwise: update everything as before
2904
- const result = await handleContentUpdate(this.db, collection, resolvedId, {
2905
- ...bodyWithoutRev,
2906
- data: usesDraftRevisions ? undefined : processedData,
2907
- slug: usesDraftRevisions ? undefined : bodyWithoutRev.slug,
2908
- authorId: bodyWithoutRev.authorId,
2909
- bylines: bodyWithoutRev.bylines,
2910
- });
3005
+ const result =
3006
+ usesDraftRevisions && !liveMetaTouched
3007
+ ? await handleContentGet(this.db, collection, resolvedId)
3008
+ : await handleContentUpdate(this.db, collection, resolvedId, {
3009
+ ...bodyWithoutRev,
3010
+ data: usesDraftRevisions ? undefined : processedData,
3011
+ slug: usesDraftRevisions ? undefined : bodyWithoutRev.slug,
3012
+ authorId: bodyWithoutRev.authorId,
3013
+ bylines: bodyWithoutRev.bylines,
3014
+ });
3015
+
3016
+ const liveContentChanged = usesDraftRevisions
3017
+ ? liveMetaTouched
3018
+ : Boolean(processedData || bodyWithoutRev.slug !== undefined || liveMetaTouched);
2911
3019
 
2912
3020
  // Hydrate draft data BEFORE firing afterSave hooks so the hook sees
2913
3021
  // the same effective data the response surfaces — for revision-
@@ -2957,6 +3065,9 @@ export class EmDashRuntime {
2957
3065
  this.runAfterSaveHooks(contentItemToRecord(hydrated.data.item), collection, false);
2958
3066
  }
2959
3067
 
3068
+ if (hydrated.success) {
3069
+ return { ...hydrated, liveContentChanged };
3070
+ }
2960
3071
  return hydrated;
2961
3072
  }
2962
3073
 
@@ -3059,7 +3170,11 @@ export class EmDashRuntime {
3059
3170
  async handleContentPublish(
3060
3171
  collection: string,
3061
3172
  id: string,
3062
- options: { publishedAt?: string; requireScheduledDue?: boolean } = {},
3173
+ options: {
3174
+ publishedAt?: string;
3175
+ requireScheduledDue?: boolean;
3176
+ expectedScheduledAt?: string;
3177
+ } = {},
3063
3178
  ) {
3064
3179
  const result = await handleContentPublish(this.db, collection, id, options);
3065
3180
  if (result.success && result.data) {
@@ -3282,6 +3397,18 @@ export class EmDashRuntime {
3282
3397
  // must then `content_publish` to promote the restored draft to
3283
3398
  // live, matching the documented tool contract.
3284
3399
  try {
3400
+ const contentRepo = new ContentRepository(this.db);
3401
+ const existing = await contentRepo.findById(revision.collection, revision.entryId);
3402
+ if (!existing) {
3403
+ return {
3404
+ success: false as const,
3405
+ error: {
3406
+ code: "NOT_FOUND",
3407
+ message: `Content item not found: ${revision.entryId}`,
3408
+ },
3409
+ };
3410
+ }
3411
+
3285
3412
  const newDraft = await revisionRepo.create({
3286
3413
  collection: revision.collection,
3287
3414
  entryId: revision.entryId,
@@ -3289,18 +3416,45 @@ export class EmDashRuntime {
3289
3416
  authorId: callerUserId,
3290
3417
  });
3291
3418
 
3292
- validateIdentifier(revision.collection, "collection");
3293
- const tableName = `ec_${revision.collection}`;
3294
- await sql`
3295
- UPDATE ${sql.ref(tableName)}
3296
- SET draft_revision_id = ${newDraft.id}
3297
- WHERE id = ${revision.entryId}
3298
- `.execute(this.db);
3419
+ try {
3420
+ const staged = await contentRepo.replaceDraftRevision(
3421
+ revision.collection,
3422
+ revision.entryId,
3423
+ newDraft.id,
3424
+ existing,
3425
+ );
3426
+ if (!staged) throw new ContentMutationConflictError();
3427
+ } catch (error) {
3428
+ try {
3429
+ await revisionRepo.deleteIfUnreferenced(
3430
+ revision.collection,
3431
+ revision.entryId,
3432
+ newDraft.id,
3433
+ );
3434
+ } catch (cleanupError) {
3435
+ console.error(
3436
+ `[emdash] Failed to clean up unrestored revision ${newDraft.id}:`,
3437
+ cleanupError,
3438
+ );
3439
+ }
3440
+ throw error;
3441
+ }
3299
3442
 
3300
- // Fire-and-forget: prune old revisions to prevent unbounded growth
3301
- void revisionRepo
3302
- .pruneOldRevisions(revision.collection, revision.entryId, 50)
3303
- .catch(() => {});
3443
+ after(async () => {
3444
+ try {
3445
+ await revisionRepo.pruneQueuedEntry(
3446
+ revision.collection,
3447
+ revision.entryId,
3448
+ newDraft.id,
3449
+ 50,
3450
+ );
3451
+ } catch (error) {
3452
+ console.error(
3453
+ `[revisions] Failed to prune revisions for ${revision.collection}/${revision.entryId}:`,
3454
+ error,
3455
+ );
3456
+ }
3457
+ });
3304
3458
 
3305
3459
  // Return the freshly-fetched item with the new draft hydrated
3306
3460
  // onto `data`. Without this the response would echo the live
@@ -3313,6 +3467,12 @@ export class EmDashRuntime {
3313
3467
  }
3314
3468
  return hydrated;
3315
3469
  } catch (error) {
3470
+ if (error instanceof ContentMutationConflictError) {
3471
+ return {
3472
+ success: false as const,
3473
+ error: { code: "CONFLICT", message: error.message },
3474
+ };
3475
+ }
3316
3476
  console.error("[emdash] revision restore failed:", error);
3317
3477
  return {
3318
3478
  success: false as const,
@@ -3446,12 +3606,8 @@ export class EmDashRuntime {
3446
3606
 
3447
3607
  const routeKey = path.replace(LEADING_SLASH_PATTERN, "");
3448
3608
 
3449
- let body: unknown = undefined;
3450
- try {
3451
- body = await request.json();
3452
- } catch {
3453
- // No body or not JSON
3454
- }
3609
+ // Body methods parse JSON; GET/HEAD/DELETE parse the query string (#2146).
3610
+ const body = await parseRouteInput(request);
3455
3611
 
3456
3612
  return routeRegistry.invoke(pluginId, routeKey, { request, body });
3457
3613
  }
@@ -3662,7 +3818,13 @@ export class EmDashRuntime {
3662
3818
  const imageFields = collectionInfo.fields.filter(
3663
3819
  (f) => f.type === "image" || f.type === "file",
3664
3820
  );
3665
- if (imageFields.length === 0) return data;
3821
+ // Repeater fields can contain image sub-fields, whose values need the same normalization
3822
+ // (a bare media id posted inside a repeater item would otherwise be stored verbatim and
3823
+ // render as "Image not found" in the admin).
3824
+ const repeaterFields = collectionInfo.fields.filter(
3825
+ (f) => f.type === "repeater" && Array.isArray(f.validation?.subFields),
3826
+ );
3827
+ if (imageFields.length === 0 && repeaterFields.length === 0) return data;
3666
3828
 
3667
3829
  const getProvider = (id: string) => this.getMediaProvider(id);
3668
3830
  const result = { ...data };
@@ -3681,6 +3843,37 @@ export class EmDashRuntime {
3681
3843
  }
3682
3844
  }
3683
3845
 
3846
+ for (const field of repeaterFields) {
3847
+ const value = result[field.slug];
3848
+ if (!Array.isArray(value)) continue;
3849
+
3850
+ const mediaSubFieldSlugs = (field.validation?.subFields ?? [])
3851
+ .filter((sub) => sub.type === "image")
3852
+ .map((sub) => sub.slug);
3853
+ if (mediaSubFieldSlugs.length === 0) continue;
3854
+
3855
+ const items: unknown[] = value;
3856
+ result[field.slug] = await Promise.all(
3857
+ items.map(async (item) => {
3858
+ if (!isRecord(item)) return item;
3859
+ const normalizedItem: Record<string, unknown> = { ...item };
3860
+ for (const slug of mediaSubFieldSlugs) {
3861
+ const subValue = normalizedItem[slug];
3862
+ if (subValue == null) continue;
3863
+ try {
3864
+ const normalized = await normalizeMediaValue(subValue, getProvider);
3865
+ if (normalized) {
3866
+ normalizedItem[slug] = normalized;
3867
+ }
3868
+ } catch {
3869
+ // Don't fail the save if normalization fails for a single sub-field
3870
+ }
3871
+ }
3872
+ return normalizedItem;
3873
+ }),
3874
+ );
3875
+ }
3876
+
3684
3877
  return result;
3685
3878
  }
3686
3879
 
@@ -3893,12 +4086,8 @@ export class EmDashRuntime {
3893
4086
  }> {
3894
4087
  const routeName = path.replace(LEADING_SLASH_PATTERN, "");
3895
4088
 
3896
- let body: unknown = undefined;
3897
- try {
3898
- body = await request.json();
3899
- } catch {
3900
- // No body or not JSON
3901
- }
4089
+ // Body methods parse JSON; GET/HEAD/DELETE parse the query string (#2146).
4090
+ const body = await parseRouteInput(request);
3902
4091
 
3903
4092
  try {
3904
4093
  const headers = sanitizeHeadersForSandbox(request.headers);
@@ -12,14 +12,18 @@ export interface I18nConfig {
12
12
  prefixDefaultLocale?: boolean;
13
13
  }
14
14
 
15
- let _config: I18nConfig | null | undefined;
15
+ const I18N_CONFIG_KEY = Symbol.for("emdash:i18n-config");
16
+
17
+ function configStore(): Record<symbol, I18nConfig | null | undefined> {
18
+ return globalThis;
19
+ }
16
20
 
17
21
  /**
18
22
  * Initialize i18n config from virtual module data.
19
23
  * Called during runtime initialization.
20
24
  */
21
25
  export function setI18nConfig(config: I18nConfig | null): void {
22
- _config = config;
26
+ configStore()[I18N_CONFIG_KEY] = config;
23
27
  }
24
28
 
25
29
  /**
@@ -27,13 +31,14 @@ export function setI18nConfig(config: I18nConfig | null): void {
27
31
  * Returns null if i18n is not configured.
28
32
  */
29
33
  export function getI18nConfig(): I18nConfig | null {
30
- return _config ?? null;
34
+ return configStore()[I18N_CONFIG_KEY] ?? null;
31
35
  }
32
36
 
33
37
  /** Match a locale to the exact casing used by the site configuration. */
34
38
  export function resolveConfiguredLocale(locale: string): string {
39
+ const config = getI18nConfig();
35
40
  return (
36
- _config?.locales.find((configured) => configured.toLowerCase() === locale.toLowerCase()) ??
41
+ config?.locales.find((configured) => configured.toLowerCase() === locale.toLowerCase()) ??
37
42
  locale
38
43
  );
39
44
  }
@@ -43,7 +48,8 @@ export function resolveConfiguredLocale(locale: string): string {
43
48
  * Returns true when multiple locales are configured.
44
49
  */
45
50
  export function isI18nEnabled(): boolean {
46
- return _config != null && _config.locales.length > 1;
51
+ const config = getI18nConfig();
52
+ return config != null && config.locales.length > 1;
47
53
  }
48
54
 
49
55
  /**
@@ -52,15 +58,16 @@ export function isI18nEnabled(): boolean {
52
58
  * Always ends with defaultLocale.
53
59
  */
54
60
  export function getFallbackChain(locale: string): string[] {
55
- if (!_config) return [locale];
61
+ const config = getI18nConfig();
62
+ if (!config) return [locale];
56
63
 
57
64
  const chain: string[] = [locale];
58
65
  let current = locale;
59
66
  const visited = new Set<string>([locale]);
60
67
 
61
- while (_config.fallback?.[current]) {
68
+ while (config.fallback?.[current]) {
62
69
  // eslint-disable-next-line typescript/no-unnecessary-type-assertion -- noUncheckedIndexedAccess
63
- const next = _config.fallback[current]!;
70
+ const next = config.fallback[current]!;
64
71
  if (visited.has(next)) break; // prevent cycles
65
72
  chain.push(next);
66
73
  visited.add(next);
@@ -68,8 +75,8 @@ export function getFallbackChain(locale: string): string[] {
68
75
  }
69
76
 
70
77
  // Always end with defaultLocale if not already in chain
71
- if (!visited.has(_config.defaultLocale)) {
72
- chain.push(_config.defaultLocale);
78
+ if (!visited.has(config.defaultLocale)) {
79
+ chain.push(config.defaultLocale);
73
80
  }
74
81
 
75
82
  return chain;
package/src/index.ts CHANGED
@@ -28,6 +28,7 @@ export type {
28
28
  FindManyResult,
29
29
  } from "./database/repositories/index.js";
30
30
  export type { MediaItem, CreateMediaInput } from "./database/repositories/media.js";
31
+ export type { CompoundSelectLimitedAdapter } from "./database/dialect-helpers.js";
31
32
 
32
33
  // Fields
33
34
  export { portableText, image, file, reference } from "./fields/index.js";
@@ -509,6 +510,7 @@ export type {
509
510
 
510
511
  // Search
511
512
  export {
513
+ SEARCH_TOKENIZERS,
512
514
  FTSManager,
513
515
  search,
514
516
  searchWithDb,
@@ -520,6 +522,7 @@ export {
520
522
  } from "./search/index.js";
521
523
  export type {
522
524
  SearchConfig,
525
+ SearchTokenizer,
523
526
  SearchOptions,
524
527
  CollectionSearchOptions,
525
528
  SearchResult,