emdash 0.23.0 → 0.24.1

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 (302) hide show
  1. package/dist/api/route-utils.mjs +10 -10
  2. package/dist/api/schemas/index.d.mts +1 -1
  3. package/dist/{api-BQ_yKRdG.mjs → api-d_0wi9fW.mjs} +13 -13
  4. package/dist/{api-BQ_yKRdG.mjs.map → api-d_0wi9fW.mjs.map} +1 -1
  5. package/dist/{apply-CWRyxIoO.mjs → apply-BE9UaWX0.mjs} +16 -16
  6. package/dist/{apply-CWRyxIoO.mjs.map → apply-BE9UaWX0.mjs.map} +1 -1
  7. package/dist/astro/index.d.mts +2 -2
  8. package/dist/astro/index.mjs +25 -6
  9. package/dist/astro/index.mjs.map +1 -1
  10. package/dist/astro/middleware/auth.d.mts +2 -2
  11. package/dist/astro/middleware/auth.mjs +2 -2
  12. package/dist/astro/middleware/redirect.mjs +4 -4
  13. package/dist/astro/middleware.d.mts.map +1 -1
  14. package/dist/astro/middleware.mjs +46 -46
  15. package/dist/astro/middleware.mjs.map +1 -1
  16. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +3 -3
  17. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +3 -3
  18. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +2 -2
  19. package/dist/astro/routes/api/admin/api-tokens/index.mjs +3 -3
  20. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +3 -3
  21. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +4 -4
  22. package/dist/astro/routes/api/admin/byline-fields/index.mjs +4 -4
  23. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +4 -4
  24. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +9 -9
  25. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +9 -9
  26. package/dist/astro/routes/api/admin/bylines/index.mjs +9 -9
  27. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +7 -7
  28. package/dist/astro/routes/api/admin/comments/_id_.mjs +5 -5
  29. package/dist/astro/routes/api/admin/comments/bulk.mjs +6 -6
  30. package/dist/astro/routes/api/admin/comments/counts.mjs +5 -5
  31. package/dist/astro/routes/api/admin/comments/index.mjs +6 -6
  32. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +4 -4
  33. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
  34. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +3 -3
  35. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +3 -3
  36. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +26 -26
  37. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +26 -26
  38. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +26 -26
  39. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +26 -26
  40. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +26 -26
  41. package/dist/astro/routes/api/admin/plugins/index.mjs +26 -26
  42. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +3 -3
  43. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +26 -26
  44. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +26 -26
  45. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +26 -26
  46. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +26 -26
  47. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +27 -27
  48. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +26 -26
  49. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +27 -27
  50. package/dist/astro/routes/api/admin/plugins/updates.mjs +26 -26
  51. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +26 -26
  52. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +3 -3
  53. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +26 -26
  54. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +2 -2
  55. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +2 -2
  56. package/dist/astro/routes/api/admin/users/_id_/index.mjs +3 -3
  57. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +2 -2
  58. package/dist/astro/routes/api/admin/users/index.mjs +3 -3
  59. package/dist/astro/routes/api/auth/dev-bypass.mjs +3 -3
  60. package/dist/astro/routes/api/auth/invite/accept.mjs +2 -2
  61. package/dist/astro/routes/api/auth/invite/complete.mjs +3 -3
  62. package/dist/astro/routes/api/auth/invite/index.mjs +3 -3
  63. package/dist/astro/routes/api/auth/invite/register-options.mjs +3 -3
  64. package/dist/astro/routes/api/auth/logout.mjs +2 -2
  65. package/dist/astro/routes/api/auth/magic-link/send.mjs +4 -4
  66. package/dist/astro/routes/api/auth/magic-link/verify.mjs +2 -2
  67. package/dist/astro/routes/api/auth/me.mjs +4 -4
  68. package/dist/astro/routes/api/auth/passkey/_id_.mjs +3 -3
  69. package/dist/astro/routes/api/auth/passkey/index.mjs +2 -2
  70. package/dist/astro/routes/api/auth/passkey/options.mjs +4 -4
  71. package/dist/astro/routes/api/auth/passkey/register/options.mjs +3 -3
  72. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +3 -3
  73. package/dist/astro/routes/api/auth/passkey/verify.mjs +3 -3
  74. package/dist/astro/routes/api/auth/signup/complete.mjs +3 -3
  75. package/dist/astro/routes/api/auth/signup/request.mjs +4 -4
  76. package/dist/astro/routes/api/auth/signup/verify.mjs +2 -2
  77. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +6 -6
  78. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +6 -6
  79. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +3 -3
  80. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +3 -3
  81. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +3 -3
  82. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +3 -3
  83. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +4 -4
  84. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +4 -4
  85. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +3 -3
  86. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +3 -3
  87. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +4 -4
  88. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +8 -8
  89. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +3 -3
  90. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +3 -3
  91. package/dist/astro/routes/api/content/_collection_/_id_.mjs +4 -4
  92. package/dist/astro/routes/api/content/_collection_/authors.mjs +3 -3
  93. package/dist/astro/routes/api/content/_collection_/index.mjs +4 -4
  94. package/dist/astro/routes/api/content/_collection_/trash.mjs +4 -4
  95. package/dist/astro/routes/api/dashboard.mjs +7 -7
  96. package/dist/astro/routes/api/dev/emails.mjs +2 -2
  97. package/dist/astro/routes/api/import/probe.mjs +4 -4
  98. package/dist/astro/routes/api/import/wordpress/analyze.mjs +3 -3
  99. package/dist/astro/routes/api/import/wordpress/execute.d.mts +2 -2
  100. package/dist/astro/routes/api/import/wordpress/execute.mjs +8 -8
  101. package/dist/astro/routes/api/import/wordpress/media.mjs +4 -4
  102. package/dist/astro/routes/api/import/wordpress/prepare.mjs +6 -6
  103. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +5 -5
  104. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +4 -4
  105. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +6 -6
  106. package/dist/astro/routes/api/manifest.mjs +3 -3
  107. package/dist/astro/routes/api/mcp.mjs +34 -34
  108. package/dist/astro/routes/api/media/_id_/confirm.mjs +4 -4
  109. package/dist/astro/routes/api/media/_id_.mjs +4 -4
  110. package/dist/astro/routes/api/media/file/_...key_.mjs +2 -2
  111. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +3 -3
  112. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +3 -3
  113. package/dist/astro/routes/api/media/providers/index.mjs +3 -3
  114. package/dist/astro/routes/api/media/upload-url.mjs +4 -4
  115. package/dist/astro/routes/api/media.mjs +5 -5
  116. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +5 -5
  117. package/dist/astro/routes/api/menus/_name_/items.mjs +5 -5
  118. package/dist/astro/routes/api/menus/_name_/reorder.mjs +5 -5
  119. package/dist/astro/routes/api/menus/_name_/translations.mjs +5 -5
  120. package/dist/astro/routes/api/menus/_name_.mjs +5 -5
  121. package/dist/astro/routes/api/menus/index.mjs +5 -5
  122. package/dist/astro/routes/api/oauth/device/authorize.mjs +3 -3
  123. package/dist/astro/routes/api/oauth/device/code.mjs +4 -4
  124. package/dist/astro/routes/api/oauth/device/token.mjs +4 -4
  125. package/dist/astro/routes/api/oauth/register.mjs +2 -2
  126. package/dist/astro/routes/api/oauth/token/refresh.mjs +3 -3
  127. package/dist/astro/routes/api/oauth/token/revoke.mjs +3 -3
  128. package/dist/astro/routes/api/oauth/token.mjs +2 -2
  129. package/dist/astro/routes/api/openapi.json.mjs +2 -2
  130. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +3 -3
  131. package/dist/astro/routes/api/redirects/404s/index.mjs +6 -6
  132. package/dist/astro/routes/api/redirects/404s/summary.mjs +6 -6
  133. package/dist/astro/routes/api/redirects/_id_.mjs +7 -7
  134. package/dist/astro/routes/api/redirects/index.mjs +7 -7
  135. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +3 -3
  136. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +3 -3
  137. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +26 -26
  138. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +26 -26
  139. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +26 -26
  140. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +26 -26
  141. package/dist/astro/routes/api/schema/collections/index.mjs +26 -26
  142. package/dist/astro/routes/api/schema/index.mjs +6 -6
  143. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +26 -26
  144. package/dist/astro/routes/api/schema/orphans/index.mjs +26 -26
  145. package/dist/astro/routes/api/search/enable.mjs +7 -7
  146. package/dist/astro/routes/api/search/index.mjs +6 -6
  147. package/dist/astro/routes/api/search/rebuild.mjs +7 -7
  148. package/dist/astro/routes/api/search/stats.mjs +6 -6
  149. package/dist/astro/routes/api/search/suggest.mjs +6 -6
  150. package/dist/astro/routes/api/sections/_slug_.mjs +6 -6
  151. package/dist/astro/routes/api/sections/index.mjs +6 -6
  152. package/dist/astro/routes/api/settings/email.mjs +4 -4
  153. package/dist/astro/routes/api/settings.mjs +8 -8
  154. package/dist/astro/routes/api/setup/admin-verify.mjs +3 -3
  155. package/dist/astro/routes/api/setup/admin.mjs +3 -3
  156. package/dist/astro/routes/api/setup/dev-bypass.mjs +16 -16
  157. package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
  158. package/dist/astro/routes/api/setup/index.mjs +17 -17
  159. package/dist/astro/routes/api/setup/status.mjs +3 -3
  160. package/dist/astro/routes/api/snapshot.mjs +3 -3
  161. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +8 -8
  162. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +8 -8
  163. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +8 -8
  164. package/dist/astro/routes/api/taxonomies/index.mjs +8 -8
  165. package/dist/astro/routes/api/themes/preview.mjs +3 -3
  166. package/dist/astro/routes/api/typegen.mjs +5 -5
  167. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +4 -4
  168. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +6 -6
  169. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +6 -6
  170. package/dist/astro/routes/api/widget-areas/_name_.mjs +5 -5
  171. package/dist/astro/routes/api/widget-areas/index.mjs +6 -6
  172. package/dist/astro/routes/api/widget-components.mjs +2 -2
  173. package/dist/astro/routes/robots.txt.mjs +4 -4
  174. package/dist/astro/routes/sitemap-_collection_.xml.mjs +4 -4
  175. package/dist/astro/routes/sitemap.xml.mjs +4 -4
  176. package/dist/astro/types.d.mts +2 -2
  177. package/dist/{authorize-Cse0k7B0.mjs → authorize-B__u-iZJ.mjs} +2 -2
  178. package/dist/{authorize-Cse0k7B0.mjs.map → authorize-B__u-iZJ.mjs.map} +1 -1
  179. package/dist/{byline-DVo-liaP.mjs → byline-C-YajfV7.mjs} +5 -5
  180. package/dist/{byline-DVo-liaP.mjs.map → byline-C-YajfV7.mjs.map} +1 -1
  181. package/dist/{byline-fields-RFPkDLRw.d.mts → byline-fields-Ca56gaT6.d.mts} +6 -6
  182. package/dist/{byline-fields-RFPkDLRw.d.mts.map → byline-fields-Ca56gaT6.d.mts.map} +1 -1
  183. package/dist/{bylines-f5ppBpD5.mjs → bylines-BMtJnPnG.mjs} +5 -5
  184. package/dist/{bylines-f5ppBpD5.mjs.map → bylines-BMtJnPnG.mjs.map} +1 -1
  185. package/dist/{bylines-pIKgc_TL.mjs → bylines-D4KADDAi.mjs} +4 -4
  186. package/dist/{bylines-pIKgc_TL.mjs.map → bylines-D4KADDAi.mjs.map} +1 -1
  187. package/dist/{cache-Q6V4U-Xz.mjs → cache-BUJe2w6Z.mjs} +2 -2
  188. package/dist/{cache-Q6V4U-Xz.mjs.map → cache-BUJe2w6Z.mjs.map} +1 -1
  189. package/dist/{chunks-SyjZaYwV.mjs → chunks-BHgcHh2C.mjs} +2 -2
  190. package/dist/{chunks-SyjZaYwV.mjs.map → chunks-BHgcHh2C.mjs.map} +1 -1
  191. package/dist/cli/index.mjs +17 -17
  192. package/dist/cli/index.mjs.map +1 -1
  193. package/dist/{comment-80UyJJUR.mjs → comment-BDx50EX5.mjs} +2 -2
  194. package/dist/{comment-80UyJJUR.mjs.map → comment-BDx50EX5.mjs.map} +1 -1
  195. package/dist/{comment-reaction-Dyb-AutY.mjs → comment-reaction-Gv_pgfI3.mjs} +2 -2
  196. package/dist/{comment-reaction-Dyb-AutY.mjs.map → comment-reaction-Gv_pgfI3.mjs.map} +1 -1
  197. package/dist/{comments-Cczx7AvD.mjs → comments-CXHuQ6jI.mjs} +3 -3
  198. package/dist/{comments-Cczx7AvD.mjs.map → comments-CXHuQ6jI.mjs.map} +1 -1
  199. package/dist/{content-2PTDNnoh.mjs → content-PoVGKjp0.mjs} +3 -3
  200. package/dist/{content-2PTDNnoh.mjs.map → content-PoVGKjp0.mjs.map} +1 -1
  201. package/dist/{context-B1W8soLv.mjs → context-Dvws41_A.mjs} +7 -7
  202. package/dist/{context-B1W8soLv.mjs.map → context-Dvws41_A.mjs.map} +1 -1
  203. package/dist/{dashboard-CYjpQZ6-.mjs → dashboard-DsYU8JKS.mjs} +4 -4
  204. package/dist/{dashboard-CYjpQZ6-.mjs.map → dashboard-DsYU8JKS.mjs.map} +1 -1
  205. package/dist/db/index.mjs +1 -1
  206. package/dist/{error-Bl6kZgtt.mjs → error-lq_fL-RS.mjs} +2 -2
  207. package/dist/{error-Bl6kZgtt.mjs.map → error-lq_fL-RS.mjs.map} +1 -1
  208. package/dist/{field-defs-cache-ztrdzUGb.mjs → field-defs-cache-CYYx8xlG.mjs} +2 -2
  209. package/dist/{field-defs-cache-ztrdzUGb.mjs.map → field-defs-cache-CYYx8xlG.mjs.map} +1 -1
  210. package/dist/{fts-manager-CQuHt-vS.mjs → fts-manager-DW_NR-Fs.mjs} +2 -2
  211. package/dist/{fts-manager-CQuHt-vS.mjs.map → fts-manager-DW_NR-Fs.mjs.map} +1 -1
  212. package/dist/{index-BaIj5hIq.d.mts → index-BroXT-vD.d.mts} +98 -22
  213. package/dist/index-BroXT-vD.d.mts.map +1 -0
  214. package/dist/index.d.mts +2 -2
  215. package/dist/index.mjs +36 -36
  216. package/dist/{load-BNo-ER8C.mjs → load-DMFi4n1p.mjs} +2 -2
  217. package/dist/{load-BNo-ER8C.mjs.map → load-DMFi4n1p.mjs.map} +1 -1
  218. package/dist/{loader-Dn74CG1b.mjs → loader-BR2SgfEc.mjs} +10 -4
  219. package/dist/loader-BR2SgfEc.mjs.map +1 -0
  220. package/dist/media/local-runtime.d.mts +2 -2
  221. package/dist/media/local-runtime.mjs +4 -4
  222. package/dist/{media-Bw0sA6rb.mjs → media-CTjJoJTh.mjs} +2 -2
  223. package/dist/{media-Bw0sA6rb.mjs.map → media-CTjJoJTh.mjs.map} +1 -1
  224. package/dist/{menus-CYs0WZoL.mjs → menus-8O6xNcYW.mjs} +2 -2
  225. package/dist/{menus-CYs0WZoL.mjs.map → menus-8O6xNcYW.mjs.map} +1 -1
  226. package/dist/{menus-DS8VTZgo.mjs → menus-GvRSpgIA.mjs} +5 -5
  227. package/dist/{menus-DS8VTZgo.mjs.map → menus-GvRSpgIA.mjs.map} +1 -1
  228. package/dist/{parse-C9hpjUyY.mjs → parse-DHI873qU.mjs} +2 -2
  229. package/dist/{parse-C9hpjUyY.mjs.map → parse-DHI873qU.mjs.map} +1 -1
  230. package/dist/plugin-utils.d.mts +2 -2
  231. package/dist/plugins/adapt-sandbox-entry.d.mts +2 -2
  232. package/dist/{query-DgUHZLWB.mjs → query-DZdlS6Cu.mjs} +23 -16
  233. package/dist/query-DZdlS6Cu.mjs.map +1 -0
  234. package/dist/{rate-limit-BuQ5d4X_.mjs → rate-limit-D1Y6VFVP.mjs} +2 -2
  235. package/dist/{rate-limit-BuQ5d4X_.mjs.map → rate-limit-D1Y6VFVP.mjs.map} +1 -1
  236. package/dist/{redirect-Bifv_yHv.mjs → redirect-C1KVGYWe.mjs} +2 -2
  237. package/dist/{redirect-Bifv_yHv.mjs.map → redirect-C1KVGYWe.mjs.map} +1 -1
  238. package/dist/{redirects-BZ8Mxn8H.mjs → redirects-DgnypVir.mjs} +3 -3
  239. package/dist/{redirects-BZ8Mxn8H.mjs.map → redirects-DgnypVir.mjs.map} +1 -1
  240. package/dist/{registry-CK1SS6pi.mjs → registry-CJkCubOJ.mjs} +4 -4
  241. package/dist/{registry-CK1SS6pi.mjs.map → registry-CJkCubOJ.mjs.map} +1 -1
  242. package/dist/{runner-DYYnW530.mjs → runner-BsquExlK.mjs} +246 -174
  243. package/dist/runner-BsquExlK.mjs.map +1 -0
  244. package/dist/runner-CEtq-6Sm.d.mts.map +1 -1
  245. package/dist/runtime.d.mts +2 -2
  246. package/dist/runtime.mjs +2 -2
  247. package/dist/{schema-CbFRFoM7.mjs → schema-DMjXuvNU.mjs} +4 -4
  248. package/dist/{schema-CbFRFoM7.mjs.map → schema-DMjXuvNU.mjs.map} +1 -1
  249. package/dist/{search-C-waE_YW.mjs → search-D1wKk3lc.mjs} +4 -4
  250. package/dist/{search-C-waE_YW.mjs.map → search-D1wKk3lc.mjs.map} +1 -1
  251. package/dist/{sections-osX9U-YJ.mjs → sections-CCMic8dB.mjs} +3 -3
  252. package/dist/{sections-osX9U-YJ.mjs.map → sections-CCMic8dB.mjs.map} +1 -1
  253. package/dist/seed/index.mjs +14 -14
  254. package/dist/{seo-4FovMwNS.mjs → seo-3QrZ1EPT.mjs} +2 -2
  255. package/dist/{seo-4FovMwNS.mjs.map → seo-3QrZ1EPT.mjs.map} +1 -1
  256. package/dist/{service-jby1RRmU.mjs → service-CQHK_10l.mjs} +2 -2
  257. package/dist/{service-jby1RRmU.mjs.map → service-CQHK_10l.mjs.map} +1 -1
  258. package/dist/{settings-4bRT2NIf.mjs → settings-C3Yi5Co3.mjs} +3 -3
  259. package/dist/{settings-4bRT2NIf.mjs.map → settings-C3Yi5Co3.mjs.map} +1 -1
  260. package/dist/{settings-t-H2jPuJ.mjs → settings-D9rvaLuY.mjs} +3 -3
  261. package/dist/{settings-t-H2jPuJ.mjs.map → settings-D9rvaLuY.mjs.map} +1 -1
  262. package/dist/{taxonomies-Dxrc_szG.mjs → taxonomies-CurpLtNC.mjs} +29 -21
  263. package/dist/taxonomies-CurpLtNC.mjs.map +1 -0
  264. package/dist/{taxonomies-BBB8O-CU.mjs → taxonomies-DhLaNJji.mjs} +34 -27
  265. package/dist/taxonomies-DhLaNJji.mjs.map +1 -0
  266. package/dist/{taxonomy-B2HQuVf5.mjs → taxonomy-BBUlGug5.mjs} +33 -7
  267. package/dist/taxonomy-BBUlGug5.mjs.map +1 -0
  268. package/dist/{types-DXOIbece.mjs → types-CmI1OyQg.mjs} +2 -2
  269. package/dist/{types-DXOIbece.mjs.map → types-CmI1OyQg.mjs.map} +1 -1
  270. package/dist/{user-Db-Rti_z.mjs → user-JAuc8VUf.mjs} +3 -3
  271. package/dist/{user-Db-Rti_z.mjs.map → user-JAuc8VUf.mjs.map} +1 -1
  272. package/dist/{validate-0Utjspbs.mjs → validate-BzXHWnkV.mjs} +2 -2
  273. package/dist/{validate-0Utjspbs.mjs.map → validate-BzXHWnkV.mjs.map} +1 -1
  274. package/dist/{validation-D9EnzH1T.mjs → validation-CY1gk4Ar.mjs} +5 -5
  275. package/dist/{validation-D9EnzH1T.mjs.map → validation-CY1gk4Ar.mjs.map} +1 -1
  276. package/dist/version-C0JPFUG8.mjs +7 -0
  277. package/dist/{version-BgVM_1MU.mjs.map → version-C0JPFUG8.mjs.map} +1 -1
  278. package/dist/{widgets-BSTzPUYa.mjs → widgets-Dri0spI4.mjs} +2 -2
  279. package/dist/{widgets-BSTzPUYa.mjs.map → widgets-Dri0spI4.mjs.map} +1 -1
  280. package/dist/{zod-generator-ElVQOav7.mjs → zod-generator-xEHODMJf.mjs} +2 -2
  281. package/dist/{zod-generator-ElVQOav7.mjs.map → zod-generator-xEHODMJf.mjs.map} +1 -1
  282. package/package.json +6 -6
  283. package/src/api/handlers/taxonomies.ts +62 -32
  284. package/src/astro/integration/shims/use-sync-external-store-with-selector.js +71 -0
  285. package/src/astro/integration/shims/use-sync-external-store.js +1 -0
  286. package/src/astro/integration/vite-config.ts +47 -8
  287. package/src/astro/middleware.ts +13 -3
  288. package/src/cli/commands/export-seed.ts +5 -4
  289. package/src/database/migrations/045_taxonomy_parent_group.ts +68 -0
  290. package/src/database/migrations/runner.ts +2 -0
  291. package/src/database/repositories/taxonomy.ts +50 -7
  292. package/src/loader.ts +64 -8
  293. package/src/query.ts +93 -18
  294. package/src/taxonomies/index.ts +20 -8
  295. package/dist/index-BaIj5hIq.d.mts.map +0 -1
  296. package/dist/loader-Dn74CG1b.mjs.map +0 -1
  297. package/dist/query-DgUHZLWB.mjs.map +0 -1
  298. package/dist/runner-DYYnW530.mjs.map +0 -1
  299. package/dist/taxonomies-BBB8O-CU.mjs.map +0 -1
  300. package/dist/taxonomies-Dxrc_szG.mjs.map +0 -1
  301. package/dist/taxonomy-B2HQuVf5.mjs.map +0 -1
  302. package/dist/version-BgVM_1MU.mjs +0 -7
@@ -1 +1 @@
1
- {"version":3,"file":"field-defs-cache-ztrdzUGb.mjs","names":[],"sources":["../src/bylines/field-defs-cache.ts"],"sourcesContent":["/**\n * Byline field-definitions cache\n *\n * Discussion #1174 / Phase 3. Two-tier cache for the byline custom-field\n * registry, mirroring the `settings/index.ts` pattern.\n *\n * **Tier 1 — per-isolate (globalThis).** Field definitions change rarely\n * but are read on every byline hydration (admin pages, content rendering,\n * API responses). Caching at the isolate level drops the SELECT-from-\n * `_emdash_byline_fields` from once-per-hydration to once-per-isolate-\n * after-bump. The cache holds the resolved *value* behind a reclaimable\n * single-flight lock (see `utils/single-flight-cache.ts`), never an\n * in-flight promise: concurrent cold-isolate readers coalesce onto one\n * query by polling the published value, so a reader whose request is\n * cancelled mid-query can never strand later byline hydrations on the\n * isolate (the workerd never-settling-promise hazard that produced 524s).\n *\n * Stored on globalThis under `Symbol.for(\"emdash:byline-field-defs\")` so\n * Vite SSR chunk duplication can't produce two independent caches (same\n * pattern as `request-cache.ts` and `request-context.ts`).\n *\n * **Tier 2 — per-request.** Wraps both the version read and the defs\n * fetch in `requestCached` so a single page render that hits byline\n * hydration multiple times (e.g. list view + individual byline lookups\n * in a sidebar) pays at most one version read and one defs fetch in\n * total. The defs cache key includes the version, so a (highly\n * unlikely) mid-request bump still produces a self-consistent view —\n * the second call sees a different key and refetches.\n *\n * **Invalidation.** `options.byline_fields_version` is bumped by every\n * `BylineSchemaRegistry` mutation (Phase 2). Each isolate independently\n * reads the persisted version on the next request and compares against\n * its cached version; mismatch triggers a refetch and overwrite. Other\n * isolates see the change within one request after the bump propagates.\n *\n * **Isolated databases bypass the global cache.** Playground and DO\n * preview sessions set `requestContext.dbIsIsolated = true`, signalling\n * the per-request `db` points at an isolated schema that may diverge\n * from the singleton. Schema-derived caches keyed by the singleton's\n * version would silently leak the singleton's defs into the isolated\n * request. We follow the `loader.ts:74` `getTaxonomyNames` precedent:\n * skip both reading from and writing to the global holder when the\n * request is isolated. The per-request cache (`requestCached`) is keyed\n * by the WeakMap'd `EmDashRequestContext`, so it can't cross-pollinate\n * between requests — it stays in play even for isolated DBs.\n *\n * **Why a versioned cache and not a TTL?** The version counter gives\n * deterministic invalidation without the staleness window a TTL would\n * impose. Field-definition changes need to be visible to the next\n * request, not eventually. The cost is one cheap `options` read per\n * request — cheaper than the field-defs fetch it replaces, and cheaper\n * than maintaining a TTL state machine.\n */\n\nimport type { Kysely } from \"kysely\";\n\nimport { after } from \"../after.js\";\nimport type { Database } from \"../database/types.js\";\nimport { requestCached } from \"../request-cache.js\";\nimport { getRequestContext } from \"../request-context.js\";\nimport { BylineSchemaRegistry } from \"../schema/byline-registry.js\";\nimport type { BylineFieldDefinition } from \"../schema/types.js\";\nimport { createInitLock, type InitLock, initWithLock } from \"../utils/init-lock.js\";\n\ninterface FieldDefsHolder {\n\t/** Last resolved defs, valid only when `hasValue` is true. */\n\tvalue: BylineFieldDefinition[] | null;\n\t/** Presence flag, separate from `value` so an empty-array result still caches. */\n\thasValue: boolean;\n\t/** Persisted-version value that `value` was fetched against. */\n\tcachedVersion: number;\n\t/** Reclaimable single-flight lock so a cancelled owner can't wedge readers. */\n\tlock: InitLock;\n}\n\nconst HOLDER_KEY = Symbol.for(\"emdash:byline-field-defs\");\nconst g = globalThis as Record<symbol, unknown>;\nconst holder: FieldDefsHolder =\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- globalThis singleton pattern (see request-cache.ts)\n\t(g[HOLDER_KEY] as FieldDefsHolder | undefined) ??\n\t(() => {\n\t\tconst h: FieldDefsHolder = {\n\t\t\tvalue: null,\n\t\t\thasValue: false,\n\t\t\tcachedVersion: -1,\n\t\t\tlock: createInitLock(),\n\t\t};\n\t\tg[HOLDER_KEY] = h;\n\t\treturn h;\n\t})();\n\nconst REQUEST_CACHE_KEY_VERSION = \"byline-fields-version\";\nconst REQUEST_CACHE_KEY_DEFS_PREFIX = \"byline-field-defs:\";\n\n/**\n * Reclaim window for the single-flight lock: if an owner holds it past\n * this without publishing (e.g. its request was cancelled and the\n * anchored fetch hasn't completed yet), the next reader reclaims and\n * refetches. `listFields` is a single fast SELECT, so this only needs to\n * cover a genuinely slow/stranded query. Mutable solely so tests can\n * shorten it; production never changes it.\n */\nlet reclaimDeadlineMs = 10_000;\n\n/**\n * Read the persisted `options.byline_fields_version` counter. Cached for\n * the duration of the current request via `requestCached`. Returns `0`\n * when the row is missing (matches `BylineSchemaRegistry.getVersion`).\n */\nasync function getBylineFieldsVersion(db: Kysely<Database>): Promise<number> {\n\treturn requestCached(REQUEST_CACHE_KEY_VERSION, () => new BylineSchemaRegistry(db).getVersion());\n}\n\n/**\n * Resolve registered byline custom-field definitions. Two-tier cache:\n * per-request via `requestCached`, then per-isolate via the global\n * holder.\n *\n * The global holder is bypassed for isolated requests (playground / DO\n * preview, which point at a divergent schema) and for dirty versions\n * (odd counter — see `BylineSchemaRegistry`'s class JSDoc — indicates\n * an in-flight or crashed mutation). Both bypass paths still hit the\n * per-request cache, so a single render dedupes within itself.\n *\n * Always returns an array. Empty = no custom fields registered.\n */\nexport async function getBylineFieldDefs(db: Kysely<Database>): Promise<BylineFieldDefinition[]> {\n\tconst isolated = getRequestContext()?.dbIsIsolated === true;\n\tconst version = await getBylineFieldsVersion(db);\n\tconst dirty = version % 2 !== 0;\n\treturn requestCached(`${REQUEST_CACHE_KEY_DEFS_PREFIX}${version}`, async () => {\n\t\tif (isolated || dirty) {\n\t\t\treturn new BylineSchemaRegistry(db).listFields();\n\t\t}\n\t\t// Per-isolate single-flight cache keyed on the persisted version.\n\t\t// Coalesce concurrent cold readers via the lock and read the\n\t\t// published value; never await another request's in-flight promise\n\t\t// (a cancelled owner would otherwise strand every later byline\n\t\t// hydration on the isolate). The fetch is anchored so a cancelled\n\t\t// originator still drives it to completion and populates the cache.\n\t\treturn initWithLock<BylineFieldDefinition[]>(\n\t\t\tholder.lock,\n\t\t\t() => (holder.hasValue && holder.cachedVersion === version ? holder.value : null),\n\t\t\t(isCurrentClaim) =>\n\t\t\t\t(async () => {\n\t\t\t\t\tconst defs = await new BylineSchemaRegistry(db).listFields();\n\t\t\t\t\t// Publish only while still the current claim, and never\n\t\t\t\t\t// regress over a newer version a concurrent reader stored.\n\t\t\t\t\tif (isCurrentClaim() && version >= holder.cachedVersion) {\n\t\t\t\t\t\tholder.value = defs;\n\t\t\t\t\t\tholder.hasValue = true;\n\t\t\t\t\t\tholder.cachedVersion = version;\n\t\t\t\t\t}\n\t\t\t\t\treturn defs;\n\t\t\t\t})(),\n\t\t\t{ deadlineMs: reclaimDeadlineMs, anchor: (promise) => after(() => promise) },\n\t\t);\n\t});\n}\n\n/**\n * Test/internal helper: clear the per-isolate cache. Useful for unit\n * tests that mutate the registry directly and need to force a refetch\n * without going through the full version-bump path.\n *\n * Production code paths should rely on the version counter for\n * invalidation — calling this from a write path would bypass the\n * coordination that lets other isolates see the change.\n */\nexport function resetBylineFieldDefsCacheForTests(): void {\n\tholder.value = null;\n\tholder.hasValue = false;\n\tholder.cachedVersion = -1;\n\tholder.lock.ownerStartedAt = null;\n\tholder.lock.generation = 0;\n\treclaimDeadlineMs = 10_000;\n}\n\n/**\n * Test-only: shorten the single-flight reclaim window so a \"stranded\n * owner\" scenario can be exercised without waiting out the production\n * deadline. Reset by `resetBylineFieldDefsCacheForTests`.\n *\n * @internal\n */\nexport function setBylineFieldDefsReclaimDeadlineForTests(ms: number): void {\n\treclaimDeadlineMs = ms;\n}\n"],"mappings":";;;;;;;;;AA2EA,MAAM,aAAa,OAAO,IAAI,2BAA2B;AACzD,MAAM,IAAI;AACV,MAAM,SAEJ,EAAE,sBACI;CACN,MAAM,IAAqB;EAC1B,OAAO;EACP,UAAU;EACV,eAAe;EACf,MAAM,gBAAgB;EACtB;AACD,GAAE,cAAc;AAChB,QAAO;IACJ;AAEL,MAAM,4BAA4B;AAClC,MAAM,gCAAgC;;;;;;;;;AAUtC,IAAI,oBAAoB;;;;;;AAOxB,eAAe,uBAAuB,IAAuC;AAC5E,QAAO,cAAc,iCAAiC,IAAI,qBAAqB,GAAG,CAAC,YAAY,CAAC;;;;;;;;;;;;;;;AAgBjG,eAAsB,mBAAmB,IAAwD;CAChG,MAAM,WAAW,mBAAmB,EAAE,iBAAiB;CACvD,MAAM,UAAU,MAAM,uBAAuB,GAAG;CAChD,MAAM,QAAQ,UAAU,MAAM;AAC9B,QAAO,cAAc,GAAG,gCAAgC,WAAW,YAAY;AAC9E,MAAI,YAAY,MACf,QAAO,IAAI,qBAAqB,GAAG,CAAC,YAAY;AAQjD,SAAO,aACN,OAAO,YACA,OAAO,YAAY,OAAO,kBAAkB,UAAU,OAAO,QAAQ,OAC3E,oBACC,YAAY;GACZ,MAAM,OAAO,MAAM,IAAI,qBAAqB,GAAG,CAAC,YAAY;AAG5D,OAAI,gBAAgB,IAAI,WAAW,OAAO,eAAe;AACxD,WAAO,QAAQ;AACf,WAAO,WAAW;AAClB,WAAO,gBAAgB;;AAExB,UAAO;MACJ,EACL;GAAE,YAAY;GAAmB,SAAS,YAAY,YAAY,QAAQ;GAAE,CAC5E;GACA"}
1
+ {"version":3,"file":"field-defs-cache-CYYx8xlG.mjs","names":[],"sources":["../src/bylines/field-defs-cache.ts"],"sourcesContent":["/**\n * Byline field-definitions cache\n *\n * Discussion #1174 / Phase 3. Two-tier cache for the byline custom-field\n * registry, mirroring the `settings/index.ts` pattern.\n *\n * **Tier 1 — per-isolate (globalThis).** Field definitions change rarely\n * but are read on every byline hydration (admin pages, content rendering,\n * API responses). Caching at the isolate level drops the SELECT-from-\n * `_emdash_byline_fields` from once-per-hydration to once-per-isolate-\n * after-bump. The cache holds the resolved *value* behind a reclaimable\n * single-flight lock (see `utils/single-flight-cache.ts`), never an\n * in-flight promise: concurrent cold-isolate readers coalesce onto one\n * query by polling the published value, so a reader whose request is\n * cancelled mid-query can never strand later byline hydrations on the\n * isolate (the workerd never-settling-promise hazard that produced 524s).\n *\n * Stored on globalThis under `Symbol.for(\"emdash:byline-field-defs\")` so\n * Vite SSR chunk duplication can't produce two independent caches (same\n * pattern as `request-cache.ts` and `request-context.ts`).\n *\n * **Tier 2 — per-request.** Wraps both the version read and the defs\n * fetch in `requestCached` so a single page render that hits byline\n * hydration multiple times (e.g. list view + individual byline lookups\n * in a sidebar) pays at most one version read and one defs fetch in\n * total. The defs cache key includes the version, so a (highly\n * unlikely) mid-request bump still produces a self-consistent view —\n * the second call sees a different key and refetches.\n *\n * **Invalidation.** `options.byline_fields_version` is bumped by every\n * `BylineSchemaRegistry` mutation (Phase 2). Each isolate independently\n * reads the persisted version on the next request and compares against\n * its cached version; mismatch triggers a refetch and overwrite. Other\n * isolates see the change within one request after the bump propagates.\n *\n * **Isolated databases bypass the global cache.** Playground and DO\n * preview sessions set `requestContext.dbIsIsolated = true`, signalling\n * the per-request `db` points at an isolated schema that may diverge\n * from the singleton. Schema-derived caches keyed by the singleton's\n * version would silently leak the singleton's defs into the isolated\n * request. We follow the `loader.ts:74` `getTaxonomyNames` precedent:\n * skip both reading from and writing to the global holder when the\n * request is isolated. The per-request cache (`requestCached`) is keyed\n * by the WeakMap'd `EmDashRequestContext`, so it can't cross-pollinate\n * between requests — it stays in play even for isolated DBs.\n *\n * **Why a versioned cache and not a TTL?** The version counter gives\n * deterministic invalidation without the staleness window a TTL would\n * impose. Field-definition changes need to be visible to the next\n * request, not eventually. The cost is one cheap `options` read per\n * request — cheaper than the field-defs fetch it replaces, and cheaper\n * than maintaining a TTL state machine.\n */\n\nimport type { Kysely } from \"kysely\";\n\nimport { after } from \"../after.js\";\nimport type { Database } from \"../database/types.js\";\nimport { requestCached } from \"../request-cache.js\";\nimport { getRequestContext } from \"../request-context.js\";\nimport { BylineSchemaRegistry } from \"../schema/byline-registry.js\";\nimport type { BylineFieldDefinition } from \"../schema/types.js\";\nimport { createInitLock, type InitLock, initWithLock } from \"../utils/init-lock.js\";\n\ninterface FieldDefsHolder {\n\t/** Last resolved defs, valid only when `hasValue` is true. */\n\tvalue: BylineFieldDefinition[] | null;\n\t/** Presence flag, separate from `value` so an empty-array result still caches. */\n\thasValue: boolean;\n\t/** Persisted-version value that `value` was fetched against. */\n\tcachedVersion: number;\n\t/** Reclaimable single-flight lock so a cancelled owner can't wedge readers. */\n\tlock: InitLock;\n}\n\nconst HOLDER_KEY = Symbol.for(\"emdash:byline-field-defs\");\nconst g = globalThis as Record<symbol, unknown>;\nconst holder: FieldDefsHolder =\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- globalThis singleton pattern (see request-cache.ts)\n\t(g[HOLDER_KEY] as FieldDefsHolder | undefined) ??\n\t(() => {\n\t\tconst h: FieldDefsHolder = {\n\t\t\tvalue: null,\n\t\t\thasValue: false,\n\t\t\tcachedVersion: -1,\n\t\t\tlock: createInitLock(),\n\t\t};\n\t\tg[HOLDER_KEY] = h;\n\t\treturn h;\n\t})();\n\nconst REQUEST_CACHE_KEY_VERSION = \"byline-fields-version\";\nconst REQUEST_CACHE_KEY_DEFS_PREFIX = \"byline-field-defs:\";\n\n/**\n * Reclaim window for the single-flight lock: if an owner holds it past\n * this without publishing (e.g. its request was cancelled and the\n * anchored fetch hasn't completed yet), the next reader reclaims and\n * refetches. `listFields` is a single fast SELECT, so this only needs to\n * cover a genuinely slow/stranded query. Mutable solely so tests can\n * shorten it; production never changes it.\n */\nlet reclaimDeadlineMs = 10_000;\n\n/**\n * Read the persisted `options.byline_fields_version` counter. Cached for\n * the duration of the current request via `requestCached`. Returns `0`\n * when the row is missing (matches `BylineSchemaRegistry.getVersion`).\n */\nasync function getBylineFieldsVersion(db: Kysely<Database>): Promise<number> {\n\treturn requestCached(REQUEST_CACHE_KEY_VERSION, () => new BylineSchemaRegistry(db).getVersion());\n}\n\n/**\n * Resolve registered byline custom-field definitions. Two-tier cache:\n * per-request via `requestCached`, then per-isolate via the global\n * holder.\n *\n * The global holder is bypassed for isolated requests (playground / DO\n * preview, which point at a divergent schema) and for dirty versions\n * (odd counter — see `BylineSchemaRegistry`'s class JSDoc — indicates\n * an in-flight or crashed mutation). Both bypass paths still hit the\n * per-request cache, so a single render dedupes within itself.\n *\n * Always returns an array. Empty = no custom fields registered.\n */\nexport async function getBylineFieldDefs(db: Kysely<Database>): Promise<BylineFieldDefinition[]> {\n\tconst isolated = getRequestContext()?.dbIsIsolated === true;\n\tconst version = await getBylineFieldsVersion(db);\n\tconst dirty = version % 2 !== 0;\n\treturn requestCached(`${REQUEST_CACHE_KEY_DEFS_PREFIX}${version}`, async () => {\n\t\tif (isolated || dirty) {\n\t\t\treturn new BylineSchemaRegistry(db).listFields();\n\t\t}\n\t\t// Per-isolate single-flight cache keyed on the persisted version.\n\t\t// Coalesce concurrent cold readers via the lock and read the\n\t\t// published value; never await another request's in-flight promise\n\t\t// (a cancelled owner would otherwise strand every later byline\n\t\t// hydration on the isolate). The fetch is anchored so a cancelled\n\t\t// originator still drives it to completion and populates the cache.\n\t\treturn initWithLock<BylineFieldDefinition[]>(\n\t\t\tholder.lock,\n\t\t\t() => (holder.hasValue && holder.cachedVersion === version ? holder.value : null),\n\t\t\t(isCurrentClaim) =>\n\t\t\t\t(async () => {\n\t\t\t\t\tconst defs = await new BylineSchemaRegistry(db).listFields();\n\t\t\t\t\t// Publish only while still the current claim, and never\n\t\t\t\t\t// regress over a newer version a concurrent reader stored.\n\t\t\t\t\tif (isCurrentClaim() && version >= holder.cachedVersion) {\n\t\t\t\t\t\tholder.value = defs;\n\t\t\t\t\t\tholder.hasValue = true;\n\t\t\t\t\t\tholder.cachedVersion = version;\n\t\t\t\t\t}\n\t\t\t\t\treturn defs;\n\t\t\t\t})(),\n\t\t\t{ deadlineMs: reclaimDeadlineMs, anchor: (promise) => after(() => promise) },\n\t\t);\n\t});\n}\n\n/**\n * Test/internal helper: clear the per-isolate cache. Useful for unit\n * tests that mutate the registry directly and need to force a refetch\n * without going through the full version-bump path.\n *\n * Production code paths should rely on the version counter for\n * invalidation — calling this from a write path would bypass the\n * coordination that lets other isolates see the change.\n */\nexport function resetBylineFieldDefsCacheForTests(): void {\n\tholder.value = null;\n\tholder.hasValue = false;\n\tholder.cachedVersion = -1;\n\tholder.lock.ownerStartedAt = null;\n\tholder.lock.generation = 0;\n\treclaimDeadlineMs = 10_000;\n}\n\n/**\n * Test-only: shorten the single-flight reclaim window so a \"stranded\n * owner\" scenario can be exercised without waiting out the production\n * deadline. Reset by `resetBylineFieldDefsCacheForTests`.\n *\n * @internal\n */\nexport function setBylineFieldDefsReclaimDeadlineForTests(ms: number): void {\n\treclaimDeadlineMs = ms;\n}\n"],"mappings":";;;;;;;;;AA2EA,MAAM,aAAa,OAAO,IAAI,2BAA2B;AACzD,MAAM,IAAI;AACV,MAAM,SAEJ,EAAE,sBACI;CACN,MAAM,IAAqB;EAC1B,OAAO;EACP,UAAU;EACV,eAAe;EACf,MAAM,gBAAgB;EACtB;AACD,GAAE,cAAc;AAChB,QAAO;IACJ;AAEL,MAAM,4BAA4B;AAClC,MAAM,gCAAgC;;;;;;;;;AAUtC,IAAI,oBAAoB;;;;;;AAOxB,eAAe,uBAAuB,IAAuC;AAC5E,QAAO,cAAc,iCAAiC,IAAI,qBAAqB,GAAG,CAAC,YAAY,CAAC;;;;;;;;;;;;;;;AAgBjG,eAAsB,mBAAmB,IAAwD;CAChG,MAAM,WAAW,mBAAmB,EAAE,iBAAiB;CACvD,MAAM,UAAU,MAAM,uBAAuB,GAAG;CAChD,MAAM,QAAQ,UAAU,MAAM;AAC9B,QAAO,cAAc,GAAG,gCAAgC,WAAW,YAAY;AAC9E,MAAI,YAAY,MACf,QAAO,IAAI,qBAAqB,GAAG,CAAC,YAAY;AAQjD,SAAO,aACN,OAAO,YACA,OAAO,YAAY,OAAO,kBAAkB,UAAU,OAAO,QAAQ,OAC3E,oBACC,YAAY;GACZ,MAAM,OAAO,MAAM,IAAI,qBAAqB,GAAG,CAAC,YAAY;AAG5D,OAAI,gBAAgB,IAAI,WAAW,OAAO,eAAe;AACxD,WAAO,QAAQ;AACf,WAAO,WAAW;AAClB,WAAO,gBAAgB;;AAExB,UAAO;MACJ,EACL;GAAE,YAAY;GAAmB,SAAS,YAAY,YAAY,QAAQ;GAAE,CAC5E;GACA"}
@@ -1,4 +1,4 @@
1
- import { a as __exportAll } from "./runner-DYYnW530.mjs";
1
+ import { a as __exportAll } from "./runner-BsquExlK.mjs";
2
2
  import { t as validateIdentifier } from "./validate-VPnKoIzW.mjs";
3
3
  import { l as tableExists, o as isSqlite } from "./dialect-helpers-DRI5pyY3.mjs";
4
4
  import { sql } from "kysely";
@@ -336,4 +336,4 @@ var FTSManager = class {
336
336
 
337
337
  //#endregion
338
338
  export { fts_manager_exports as n, FTSManager as t };
339
- //# sourceMappingURL=fts-manager-CQuHt-vS.mjs.map
339
+ //# sourceMappingURL=fts-manager-DW_NR-Fs.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"fts-manager-CQuHt-vS.mjs","names":["dialectTableExists"],"sources":["../src/search/fts-manager.ts"],"sourcesContent":["/**\n * FTS5 Manager\n *\n * Manages FTS5 virtual tables and triggers for search indexing.\n */\n\nimport type { Kysely } from \"kysely\";\nimport { sql } from \"kysely\";\n\nimport { isSqlite, tableExists as dialectTableExists } from \"../database/dialect-helpers.js\";\nimport type { Database } from \"../database/types.js\";\nimport { validateIdentifier } from \"../database/validate.js\";\nimport type { SearchConfig } from \"./types.js\";\n\n/**\n * FTS5 Manager\n *\n * Handles creation, deletion, and management of FTS5 virtual tables\n * for full-text search on content collections.\n */\nexport class FTSManager {\n\tconstructor(private db: Kysely<Database>) {}\n\n\t/**\n\t * Validate a collection slug and its searchable field names.\n\t * Must be called before any raw SQL interpolation.\n\t */\n\tprivate validateInputs(collectionSlug: string, searchableFields?: string[]): void {\n\t\tvalidateIdentifier(collectionSlug, \"collection slug\");\n\t\tif (searchableFields) {\n\t\t\tfor (const field of searchableFields) {\n\t\t\t\tvalidateIdentifier(field, \"searchable field name\");\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get the FTS table name for a collection\n\t * Uses _emdash_ prefix to clearly mark as internal/system table\n\t */\n\tgetFtsTableName(collectionSlug: string): string {\n\t\tvalidateIdentifier(collectionSlug, \"collection slug\");\n\t\treturn `_emdash_fts_${collectionSlug}`;\n\t}\n\n\t/**\n\t * Get the content table name for a collection\n\t */\n\tgetContentTableName(collectionSlug: string): string {\n\t\tvalidateIdentifier(collectionSlug, \"collection slug\");\n\t\treturn `ec_${collectionSlug}`;\n\t}\n\n\t/**\n\t * Check if an FTS table exists for a collection\n\t */\n\tasync ftsTableExists(collectionSlug: string): Promise<boolean> {\n\t\tconst ftsTable = this.getFtsTableName(collectionSlug);\n\t\treturn dialectTableExists(this.db, ftsTable);\n\t}\n\n\t/**\n\t * Create an FTS5 virtual table for a collection.\n\t * FTS5 is SQLite-only; on other dialects this is a no-op.\n\t *\n\t * @param collectionSlug - The collection slug\n\t * @param searchableFields - Array of field names to index\n\t * @param weights - Optional field weights for ranking\n\t */\n\tasync createFtsTable(\n\t\tcollectionSlug: string,\n\t\tsearchableFields: string[],\n\t\t_weights?: Record<string, number>,\n\t): Promise<void> {\n\t\tif (!isSqlite(this.db)) return;\n\t\tthis.validateInputs(collectionSlug, searchableFields);\n\t\tconst ftsTable = this.getFtsTableName(collectionSlug);\n\t\tconst contentTable = this.getContentTableName(collectionSlug);\n\n\t\t// Build the column list for FTS5\n\t\t// id and locale are UNINDEXED (used for joining/filtering, not searched)\n\t\tconst columns = [\"id UNINDEXED\", \"locale UNINDEXED\", ...searchableFields].join(\", \");\n\n\t\t// Create the FTS5 virtual table.\n\t\t// `content='<table>'` makes this an *external content* FTS5 table:\n\t\t// the inverted index lives in the FTS shadow tables, but the actual\n\t\t// row data lives in the backing content table. The triggers in\n\t\t// `createTriggers` keep the index in sync; they MUST use the\n\t\t// external-content-safe `'delete'` command (see notes there) to\n\t\t// avoid `SQLITE_CORRUPT_VTAB` on UPDATE/DELETE.\n\t\t// tokenize='porter unicode61' enables stemming (run matches running, ran, etc.)\n\t\tawait sql\n\t\t\t.raw(`\n\t\t\tCREATE VIRTUAL TABLE IF NOT EXISTS \"${ftsTable}\" USING fts5(\n\t\t\t\t${columns},\n\t\t\t\tcontent='${contentTable}',\n\t\t\t\tcontent_rowid='rowid',\n\t\t\t\ttokenize='porter unicode61'\n\t\t\t)\n\t\t`)\n\t\t\t.execute(this.db);\n\n\t\t// Create triggers for automatic sync\n\t\tawait this.createTriggers(collectionSlug, searchableFields);\n\t}\n\n\t/**\n\t * Create triggers to keep FTS table in sync with content table.\n\t *\n\t * The insert and update triggers only add rows to the FTS index when\n\t * `deleted_at IS NULL`. This keeps soft-deleted content out of the\n\t * search index and ensures the FTS row count matches the non-deleted\n\t * content count (which `verifyAndRepairIndex` relies on).\n\t *\n\t * IMPORTANT: The FTS5 virtual table is created with `content='ec_<slug>'`\n\t * which makes it an *external content* FTS5 table. For external-content\n\t * tables, removing a row must use the documented `'delete'` command and\n\t * supply the OLD column values explicitly, e.g.:\n\t *\n\t * INSERT INTO fts(fts, rowid, col1, col2)\n\t * VALUES('delete', OLD.rowid, OLD.col1, OLD.col2);\n\t *\n\t * Using `DELETE FROM fts WHERE rowid = OLD.rowid` is the correct form\n\t * for *contentless* tables but is unsafe for external-content tables:\n\t * FTS5 then reads column values from the backing content table, which\n\t * in an AFTER UPDATE trigger already holds the NEW values. The wrong\n\t * tokens get removed and the inverted index drifts out of sync until\n\t * SQLite raises `SQLITE_CORRUPT_VTAB` on the next mutation. See\n\t * https://www.sqlite.org/fts5.html#external_content_tables.\n\t *\n\t * The UPDATE and DELETE triggers gate the `'delete'` on\n\t * `OLD.deleted_at IS NULL` because the INSERT trigger never indexed\n\t * rows that were already soft-deleted. Issuing `'delete'` for a rowid\n\t * that was never inserted into the FTS index is itself a corruption\n\t * trigger -- FTS5's `'delete'` is not a no-op on missing rowids and\n\t * raises `SQLITE_CORRUPT_VTAB`. Affected paths include restore-from-\n\t * trash (UPDATE where `OLD.deleted_at IS NOT NULL`), permanent-delete\n\t * from trash (DELETE on a soft-deleted row), and any edit on a row\n\t * that's currently in the trash.\n\t */\n\tprivate async createTriggers(collectionSlug: string, searchableFields: string[]): Promise<void> {\n\t\tthis.validateInputs(collectionSlug, searchableFields);\n\t\tif (searchableFields.length === 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot create FTS triggers for collection \"${collectionSlug}\": no searchable fields. ` +\n\t\t\t\t\t`Mark at least one field as searchable before enabling search.`,\n\t\t\t);\n\t\t}\n\t\tconst ftsTable = this.getFtsTableName(collectionSlug);\n\t\tconst contentTable = this.getContentTableName(collectionSlug);\n\t\tconst fieldList = searchableFields.join(\", \");\n\t\tconst newFieldList = searchableFields.map((f) => `NEW.${f}`).join(\", \");\n\t\t// `'delete'` takes the FTS5 virtual table name as the first column,\n\t\t// then the rowid being removed, then the OLD value of every column\n\t\t// declared on the FTS5 table (in declaration order: id, locale,\n\t\t// then each searchable field).\n\t\tconst oldFieldList = searchableFields.map((f) => `OLD.${f}`).join(\", \");\n\n\t\t// Insert trigger - only index non-deleted content\n\t\tawait sql\n\t\t\t.raw(`\n\t\t\tCREATE TRIGGER IF NOT EXISTS \"${ftsTable}_insert\" \n\t\t\tAFTER INSERT ON \"${contentTable}\" \n\t\t\tWHEN NEW.deleted_at IS NULL\n\t\t\tBEGIN\n\t\t\t\tINSERT INTO \"${ftsTable}\"(rowid, id, locale, ${fieldList})\n\t\t\t\tVALUES (NEW.rowid, NEW.id, NEW.locale, ${newFieldList});\n\t\t\tEND\n\t\t`)\n\t\t\t.execute(this.db);\n\n\t\t// Update trigger - remove the old row from the FTS index using the\n\t\t// external-content-safe `'delete'` command (which uses OLD column\n\t\t// values, captured before the row was modified), then re-insert\n\t\t// the new values when the row is still visible.\n\t\t//\n\t\t// `'delete'` is gated on `OLD.deleted_at IS NULL` because rows that\n\t\t// were soft-deleted are not in the FTS index (the INSERT trigger\n\t\t// skips them). Issuing `'delete'` for a missing rowid raises\n\t\t// `SQLITE_CORRUPT_VTAB`, which would break restore-from-trash and\n\t\t// edits to soft-deleted rows.\n\t\tawait sql\n\t\t\t.raw(`\n\t\t\tCREATE TRIGGER IF NOT EXISTS \"${ftsTable}_update\" \n\t\t\tAFTER UPDATE ON \"${contentTable}\" \n\t\t\tBEGIN\n\t\t\t\tINSERT INTO \"${ftsTable}\"(\"${ftsTable}\", rowid, id, locale, ${fieldList})\n\t\t\t\tSELECT 'delete', OLD.rowid, OLD.id, OLD.locale, ${oldFieldList}\n\t\t\t\tWHERE OLD.deleted_at IS NULL;\n\t\t\t\tINSERT INTO \"${ftsTable}\"(rowid, id, locale, ${fieldList})\n\t\t\t\tSELECT NEW.rowid, NEW.id, NEW.locale, ${newFieldList}\n\t\t\t\tWHERE NEW.deleted_at IS NULL;\n\t\t\tEND\n\t\t`)\n\t\t\t.execute(this.db);\n\n\t\t// Delete trigger - same external-content-safe `'delete'` form,\n\t\t// gated on `OLD.deleted_at IS NULL` for the same reason as the\n\t\t// UPDATE trigger: permanent-delete from trash hits a row whose\n\t\t// `deleted_at` is already set and which was never indexed.\n\t\tawait sql\n\t\t\t.raw(`\n\t\t\tCREATE TRIGGER IF NOT EXISTS \"${ftsTable}_delete\" \n\t\t\tAFTER DELETE ON \"${contentTable}\" \n\t\t\tBEGIN\n\t\t\t\tINSERT INTO \"${ftsTable}\"(\"${ftsTable}\", rowid, id, locale, ${fieldList})\n\t\t\t\tSELECT 'delete', OLD.rowid, OLD.id, OLD.locale, ${oldFieldList}\n\t\t\t\tWHERE OLD.deleted_at IS NULL;\n\t\t\tEND\n\t\t`)\n\t\t\t.execute(this.db);\n\t}\n\n\t/**\n\t * Drop triggers for a collection\n\t */\n\tprivate async dropTriggers(collectionSlug: string): Promise<void> {\n\t\tthis.validateInputs(collectionSlug);\n\t\tconst ftsTable = this.getFtsTableName(collectionSlug);\n\n\t\tawait sql.raw(`DROP TRIGGER IF EXISTS \"${ftsTable}_insert\"`).execute(this.db);\n\t\tawait sql.raw(`DROP TRIGGER IF EXISTS \"${ftsTable}_update\"`).execute(this.db);\n\t\tawait sql.raw(`DROP TRIGGER IF EXISTS \"${ftsTable}_delete\"`).execute(this.db);\n\t}\n\n\t/**\n\t * Drop the FTS table and triggers for a collection\n\t */\n\tasync dropFtsTable(collectionSlug: string): Promise<void> {\n\t\tif (!isSqlite(this.db)) return;\n\t\tthis.validateInputs(collectionSlug);\n\t\tconst ftsTable = this.getFtsTableName(collectionSlug);\n\n\t\t// Drop triggers first\n\t\tawait this.dropTriggers(collectionSlug);\n\n\t\t// Drop the FTS table\n\t\tawait sql.raw(`DROP TABLE IF EXISTS \"${ftsTable}\"`).execute(this.db);\n\t}\n\n\t/**\n\t * Rebuild the FTS index for a collection\n\t *\n\t * This is useful after bulk imports or if the index gets out of sync.\n\t */\n\tasync rebuildIndex(\n\t\tcollectionSlug: string,\n\t\tsearchableFields: string[],\n\t\tweights?: Record<string, number>,\n\t): Promise<void> {\n\t\tif (!isSqlite(this.db)) return;\n\t\t// Drop existing table and triggers\n\t\tawait this.dropFtsTable(collectionSlug);\n\n\t\t// Recreate table and triggers\n\t\tawait this.createFtsTable(collectionSlug, searchableFields, weights);\n\n\t\t// Populate from existing content\n\t\tawait this.populateFromContent(collectionSlug, searchableFields);\n\t}\n\n\t/**\n\t * Populate the FTS table from existing content\n\t */\n\tasync populateFromContent(collectionSlug: string, searchableFields: string[]): Promise<void> {\n\t\tif (!isSqlite(this.db)) return;\n\t\tthis.validateInputs(collectionSlug, searchableFields);\n\t\tconst ftsTable = this.getFtsTableName(collectionSlug);\n\t\tconst contentTable = this.getContentTableName(collectionSlug);\n\t\tconst fieldList = searchableFields.join(\", \");\n\n\t\t// Insert all existing content into FTS table\n\t\tawait sql\n\t\t\t.raw(`\n\t\t\tINSERT INTO \"${ftsTable}\"(rowid, id, locale, ${fieldList})\n\t\t\tSELECT rowid, id, locale, ${fieldList} FROM \"${contentTable}\"\n\t\t\tWHERE deleted_at IS NULL\n\t\t`)\n\t\t\t.execute(this.db);\n\t}\n\n\t/**\n\t * Get the search configuration for a collection\n\t */\n\tasync getSearchConfig(collectionSlug: string): Promise<SearchConfig | null> {\n\t\tconst result = await this.db\n\t\t\t.selectFrom(\"_emdash_collections\")\n\t\t\t.select(\"search_config\")\n\t\t\t.where(\"slug\", \"=\", collectionSlug)\n\t\t\t.executeTakeFirst();\n\n\t\tif (!result?.search_config) {\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\tconst parsed: unknown = JSON.parse(result.search_config);\n\t\t\tif (\n\t\t\t\ttypeof parsed !== \"object\" ||\n\t\t\t\tparsed === null ||\n\t\t\t\t!(\"enabled\" in parsed) ||\n\t\t\t\ttypeof parsed.enabled !== \"boolean\"\n\t\t\t) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst config: SearchConfig = { enabled: parsed.enabled };\n\t\t\tif (\"weights\" in parsed && typeof parsed.weights === \"object\" && parsed.weights !== null) {\n\t\t\t\t// weights is a JSON-parsed object — safe to treat as Record<string, number>\n\t\t\t\tconst weights: Record<string, number> = {};\n\t\t\t\tfor (const [k, v] of Object.entries(parsed.weights)) {\n\t\t\t\t\tif (typeof v === \"number\") {\n\t\t\t\t\t\tweights[k] = v;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconfig.weights = weights;\n\t\t\t}\n\t\t\treturn config;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Update the search configuration for a collection\n\t */\n\tasync setSearchConfig(collectionSlug: string, config: SearchConfig): Promise<void> {\n\t\tawait this.db\n\t\t\t.updateTable(\"_emdash_collections\")\n\t\t\t.set({ search_config: JSON.stringify(config) })\n\t\t\t.where(\"slug\", \"=\", collectionSlug)\n\t\t\t.execute();\n\t}\n\n\t/**\n\t * Get searchable fields for a collection\n\t */\n\tasync getSearchableFields(collectionSlug: string): Promise<string[]> {\n\t\tconst collection = await this.db\n\t\t\t.selectFrom(\"_emdash_collections\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"slug\", \"=\", collectionSlug)\n\t\t\t.executeTakeFirst();\n\n\t\tif (!collection) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst fields = await this.db\n\t\t\t.selectFrom(\"_emdash_fields\")\n\t\t\t.select(\"slug\")\n\t\t\t.where(\"collection_id\", \"=\", collection.id)\n\t\t\t.where(\"searchable\", \"=\", 1)\n\t\t\t.execute();\n\n\t\treturn fields.map((f) => f.slug);\n\t}\n\n\t/**\n\t * Enable search for a collection.\n\t *\n\t * Uses rebuildIndex to ensure a clean state -- drop any existing FTS\n\t * table/triggers, recreate them, and populate from content. This avoids\n\t * duplicate rows when triggers have already populated the index (e.g.\n\t * during seeding where content is inserted before search is enabled).\n\t */\n\tasync enableSearch(\n\t\tcollectionSlug: string,\n\t\toptions?: { weights?: Record<string, number> },\n\t): Promise<void> {\n\t\tif (!isSqlite(this.db)) {\n\t\t\tthrow new Error(\"Full-text search is only available with SQLite databases\");\n\t\t}\n\t\t// Get searchable fields\n\t\tconst searchableFields = await this.getSearchableFields(collectionSlug);\n\n\t\tif (searchableFields.length === 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`No searchable fields defined for collection \"${collectionSlug}\". ` +\n\t\t\t\t\t`Mark at least one field as searchable before enabling search.`,\n\t\t\t);\n\t\t}\n\n\t\t// Rebuild from scratch to ensure clean state (no duplicate rows)\n\t\tawait this.rebuildIndex(collectionSlug, searchableFields, options?.weights);\n\n\t\t// Update search config\n\t\tawait this.setSearchConfig(collectionSlug, {\n\t\t\tenabled: true,\n\t\t\tweights: options?.weights,\n\t\t});\n\t}\n\n\t/**\n\t * Disable search for a collection\n\t *\n\t * Drops the FTS table and triggers.\n\t */\n\tasync disableSearch(collectionSlug: string): Promise<void> {\n\t\tif (!isSqlite(this.db)) return;\n\t\tawait this.dropFtsTable(collectionSlug);\n\t\tconst existing = await this.getSearchConfig(collectionSlug);\n\t\tawait this.setSearchConfig(collectionSlug, { enabled: false, weights: existing?.weights });\n\t}\n\n\t/**\n\t * Get index statistics for a collection\n\t */\n\tasync getIndexStats(\n\t\tcollectionSlug: string,\n\t): Promise<{ indexed: number; lastRebuilt?: string } | null> {\n\t\tif (!isSqlite(this.db)) return null;\n\t\tthis.validateInputs(collectionSlug);\n\t\tconst ftsTable = this.getFtsTableName(collectionSlug);\n\t\tconst ftsDocsizeTable = `${ftsTable}_docsize`;\n\n\t\t// Check if table exists\n\t\tif (!(await this.ftsTableExists(collectionSlug))) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Count indexed rows\n\t\tconst result = await sql<{ count: number }>`\n\t\t\tSELECT COUNT(*) as count FROM \"${sql.raw(ftsDocsizeTable)}\"\n\t\t`.execute(this.db);\n\n\t\treturn {\n\t\t\tindexed: result.rows[0]?.count ?? 0,\n\t\t};\n\t}\n\n\t/**\n\t * Verify FTS index integrity and rebuild if drift is detected.\n\t *\n\t * Cheap belt-and-braces check, run lazily on the first search request\n\t * per isolate. The expensive cases (corrupted indexes from pre-fix\n\t * EmDash versions, broken legacy triggers) are handled at boot time by\n\t * migration `039_fix_fts5_triggers`, not here. This routine sticks to:\n\t *\n\t * 1. FTS table missing while config says search is enabled -> rebuild.\n\t * 2. Row count mismatch between content table and FTS docsize -> rebuild.\n\t *\n\t * Returns true if the index was rebuilt, false if it was healthy.\n\t */\n\tasync verifyAndRepairIndex(collectionSlug: string): Promise<boolean> {\n\t\tif (!isSqlite(this.db)) return false;\n\t\tthis.validateInputs(collectionSlug);\n\t\tconst ftsTable = this.getFtsTableName(collectionSlug);\n\t\tconst ftsDocsizeTable = `${ftsTable}_docsize`;\n\t\tconst contentTable = this.getContentTableName(collectionSlug);\n\t\tconst fields = await this.getSearchableFields(collectionSlug);\n\t\tconst config = await this.getSearchConfig(collectionSlug);\n\n\t\tif (!(await this.ftsTableExists(collectionSlug))) {\n\t\t\tif (!config?.enabled || fields.length === 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconsole.warn(`FTS index for \"${collectionSlug}\" is missing. Rebuilding.`);\n\t\t\tawait this.rebuildIndex(collectionSlug, fields, config.weights);\n\t\t\treturn true;\n\t\t}\n\n\t\t// Row count parity check. For external-content FTS tables, COUNT(*)\n\t\t// on the virtual table is answered from the backing content table\n\t\t// (including soft-deleted rows), so we use the docsize shadow table\n\t\t// which tracks rows actually present in the full-text index.\n\t\tconst contentCount = await sql<{ count: number }>`\n\t\t\tSELECT COUNT(*) as count FROM ${sql.ref(contentTable)}\n\t\t\tWHERE deleted_at IS NULL\n\t\t`.execute(this.db);\n\n\t\tconst ftsCount = await sql<{ count: number }>`\n\t\t\tSELECT COUNT(*) as count FROM \"${sql.raw(ftsDocsizeTable)}\"\n\t\t`.execute(this.db);\n\n\t\tconst contentRows = contentCount.rows[0]?.count ?? 0;\n\t\tconst ftsRows = ftsCount.rows[0]?.count ?? 0;\n\n\t\tif (contentRows !== ftsRows) {\n\t\t\tconsole.warn(\n\t\t\t\t`FTS index for \"${collectionSlug}\" has ${ftsRows} rows but content table has ${contentRows}. Rebuilding.`,\n\t\t\t);\n\t\t\tif (fields.length > 0) {\n\t\t\t\tawait this.rebuildIndex(collectionSlug, fields, config?.weights);\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Verify and repair FTS indexes for all search-enabled collections.\n\t *\n\t * Intended to run at startup to auto-heal any corruption from\n\t * previous process crashes.\n\t */\n\tasync verifyAndRepairAll(): Promise<number> {\n\t\tif (!isSqlite(this.db)) return 0;\n\n\t\tconst collections = await this.db\n\t\t\t.selectFrom(\"_emdash_collections\")\n\t\t\t.select(\"slug\")\n\t\t\t.where(\"search_config\", \"is not\", null)\n\t\t\t.execute();\n\n\t\tlet repaired = 0;\n\t\tfor (const { slug } of collections) {\n\t\t\tconst config = await this.getSearchConfig(slug);\n\t\t\tif (!config?.enabled) continue;\n\n\t\t\ttry {\n\t\t\t\tconst wasRepaired = await this.verifyAndRepairIndex(slug);\n\t\t\t\tif (wasRepaired) repaired++;\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`Failed to verify/repair FTS index for \"${slug}\":`, error);\n\t\t\t}\n\t\t}\n\n\t\treturn repaired;\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"fts-manager-DW_NR-Fs.mjs","names":["dialectTableExists"],"sources":["../src/search/fts-manager.ts"],"sourcesContent":["/**\n * FTS5 Manager\n *\n * Manages FTS5 virtual tables and triggers for search indexing.\n */\n\nimport type { Kysely } from \"kysely\";\nimport { sql } from \"kysely\";\n\nimport { isSqlite, tableExists as dialectTableExists } from \"../database/dialect-helpers.js\";\nimport type { Database } from \"../database/types.js\";\nimport { validateIdentifier } from \"../database/validate.js\";\nimport type { SearchConfig } from \"./types.js\";\n\n/**\n * FTS5 Manager\n *\n * Handles creation, deletion, and management of FTS5 virtual tables\n * for full-text search on content collections.\n */\nexport class FTSManager {\n\tconstructor(private db: Kysely<Database>) {}\n\n\t/**\n\t * Validate a collection slug and its searchable field names.\n\t * Must be called before any raw SQL interpolation.\n\t */\n\tprivate validateInputs(collectionSlug: string, searchableFields?: string[]): void {\n\t\tvalidateIdentifier(collectionSlug, \"collection slug\");\n\t\tif (searchableFields) {\n\t\t\tfor (const field of searchableFields) {\n\t\t\t\tvalidateIdentifier(field, \"searchable field name\");\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get the FTS table name for a collection\n\t * Uses _emdash_ prefix to clearly mark as internal/system table\n\t */\n\tgetFtsTableName(collectionSlug: string): string {\n\t\tvalidateIdentifier(collectionSlug, \"collection slug\");\n\t\treturn `_emdash_fts_${collectionSlug}`;\n\t}\n\n\t/**\n\t * Get the content table name for a collection\n\t */\n\tgetContentTableName(collectionSlug: string): string {\n\t\tvalidateIdentifier(collectionSlug, \"collection slug\");\n\t\treturn `ec_${collectionSlug}`;\n\t}\n\n\t/**\n\t * Check if an FTS table exists for a collection\n\t */\n\tasync ftsTableExists(collectionSlug: string): Promise<boolean> {\n\t\tconst ftsTable = this.getFtsTableName(collectionSlug);\n\t\treturn dialectTableExists(this.db, ftsTable);\n\t}\n\n\t/**\n\t * Create an FTS5 virtual table for a collection.\n\t * FTS5 is SQLite-only; on other dialects this is a no-op.\n\t *\n\t * @param collectionSlug - The collection slug\n\t * @param searchableFields - Array of field names to index\n\t * @param weights - Optional field weights for ranking\n\t */\n\tasync createFtsTable(\n\t\tcollectionSlug: string,\n\t\tsearchableFields: string[],\n\t\t_weights?: Record<string, number>,\n\t): Promise<void> {\n\t\tif (!isSqlite(this.db)) return;\n\t\tthis.validateInputs(collectionSlug, searchableFields);\n\t\tconst ftsTable = this.getFtsTableName(collectionSlug);\n\t\tconst contentTable = this.getContentTableName(collectionSlug);\n\n\t\t// Build the column list for FTS5\n\t\t// id and locale are UNINDEXED (used for joining/filtering, not searched)\n\t\tconst columns = [\"id UNINDEXED\", \"locale UNINDEXED\", ...searchableFields].join(\", \");\n\n\t\t// Create the FTS5 virtual table.\n\t\t// `content='<table>'` makes this an *external content* FTS5 table:\n\t\t// the inverted index lives in the FTS shadow tables, but the actual\n\t\t// row data lives in the backing content table. The triggers in\n\t\t// `createTriggers` keep the index in sync; they MUST use the\n\t\t// external-content-safe `'delete'` command (see notes there) to\n\t\t// avoid `SQLITE_CORRUPT_VTAB` on UPDATE/DELETE.\n\t\t// tokenize='porter unicode61' enables stemming (run matches running, ran, etc.)\n\t\tawait sql\n\t\t\t.raw(`\n\t\t\tCREATE VIRTUAL TABLE IF NOT EXISTS \"${ftsTable}\" USING fts5(\n\t\t\t\t${columns},\n\t\t\t\tcontent='${contentTable}',\n\t\t\t\tcontent_rowid='rowid',\n\t\t\t\ttokenize='porter unicode61'\n\t\t\t)\n\t\t`)\n\t\t\t.execute(this.db);\n\n\t\t// Create triggers for automatic sync\n\t\tawait this.createTriggers(collectionSlug, searchableFields);\n\t}\n\n\t/**\n\t * Create triggers to keep FTS table in sync with content table.\n\t *\n\t * The insert and update triggers only add rows to the FTS index when\n\t * `deleted_at IS NULL`. This keeps soft-deleted content out of the\n\t * search index and ensures the FTS row count matches the non-deleted\n\t * content count (which `verifyAndRepairIndex` relies on).\n\t *\n\t * IMPORTANT: The FTS5 virtual table is created with `content='ec_<slug>'`\n\t * which makes it an *external content* FTS5 table. For external-content\n\t * tables, removing a row must use the documented `'delete'` command and\n\t * supply the OLD column values explicitly, e.g.:\n\t *\n\t * INSERT INTO fts(fts, rowid, col1, col2)\n\t * VALUES('delete', OLD.rowid, OLD.col1, OLD.col2);\n\t *\n\t * Using `DELETE FROM fts WHERE rowid = OLD.rowid` is the correct form\n\t * for *contentless* tables but is unsafe for external-content tables:\n\t * FTS5 then reads column values from the backing content table, which\n\t * in an AFTER UPDATE trigger already holds the NEW values. The wrong\n\t * tokens get removed and the inverted index drifts out of sync until\n\t * SQLite raises `SQLITE_CORRUPT_VTAB` on the next mutation. See\n\t * https://www.sqlite.org/fts5.html#external_content_tables.\n\t *\n\t * The UPDATE and DELETE triggers gate the `'delete'` on\n\t * `OLD.deleted_at IS NULL` because the INSERT trigger never indexed\n\t * rows that were already soft-deleted. Issuing `'delete'` for a rowid\n\t * that was never inserted into the FTS index is itself a corruption\n\t * trigger -- FTS5's `'delete'` is not a no-op on missing rowids and\n\t * raises `SQLITE_CORRUPT_VTAB`. Affected paths include restore-from-\n\t * trash (UPDATE where `OLD.deleted_at IS NOT NULL`), permanent-delete\n\t * from trash (DELETE on a soft-deleted row), and any edit on a row\n\t * that's currently in the trash.\n\t */\n\tprivate async createTriggers(collectionSlug: string, searchableFields: string[]): Promise<void> {\n\t\tthis.validateInputs(collectionSlug, searchableFields);\n\t\tif (searchableFields.length === 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot create FTS triggers for collection \"${collectionSlug}\": no searchable fields. ` +\n\t\t\t\t\t`Mark at least one field as searchable before enabling search.`,\n\t\t\t);\n\t\t}\n\t\tconst ftsTable = this.getFtsTableName(collectionSlug);\n\t\tconst contentTable = this.getContentTableName(collectionSlug);\n\t\tconst fieldList = searchableFields.join(\", \");\n\t\tconst newFieldList = searchableFields.map((f) => `NEW.${f}`).join(\", \");\n\t\t// `'delete'` takes the FTS5 virtual table name as the first column,\n\t\t// then the rowid being removed, then the OLD value of every column\n\t\t// declared on the FTS5 table (in declaration order: id, locale,\n\t\t// then each searchable field).\n\t\tconst oldFieldList = searchableFields.map((f) => `OLD.${f}`).join(\", \");\n\n\t\t// Insert trigger - only index non-deleted content\n\t\tawait sql\n\t\t\t.raw(`\n\t\t\tCREATE TRIGGER IF NOT EXISTS \"${ftsTable}_insert\" \n\t\t\tAFTER INSERT ON \"${contentTable}\" \n\t\t\tWHEN NEW.deleted_at IS NULL\n\t\t\tBEGIN\n\t\t\t\tINSERT INTO \"${ftsTable}\"(rowid, id, locale, ${fieldList})\n\t\t\t\tVALUES (NEW.rowid, NEW.id, NEW.locale, ${newFieldList});\n\t\t\tEND\n\t\t`)\n\t\t\t.execute(this.db);\n\n\t\t// Update trigger - remove the old row from the FTS index using the\n\t\t// external-content-safe `'delete'` command (which uses OLD column\n\t\t// values, captured before the row was modified), then re-insert\n\t\t// the new values when the row is still visible.\n\t\t//\n\t\t// `'delete'` is gated on `OLD.deleted_at IS NULL` because rows that\n\t\t// were soft-deleted are not in the FTS index (the INSERT trigger\n\t\t// skips them). Issuing `'delete'` for a missing rowid raises\n\t\t// `SQLITE_CORRUPT_VTAB`, which would break restore-from-trash and\n\t\t// edits to soft-deleted rows.\n\t\tawait sql\n\t\t\t.raw(`\n\t\t\tCREATE TRIGGER IF NOT EXISTS \"${ftsTable}_update\" \n\t\t\tAFTER UPDATE ON \"${contentTable}\" \n\t\t\tBEGIN\n\t\t\t\tINSERT INTO \"${ftsTable}\"(\"${ftsTable}\", rowid, id, locale, ${fieldList})\n\t\t\t\tSELECT 'delete', OLD.rowid, OLD.id, OLD.locale, ${oldFieldList}\n\t\t\t\tWHERE OLD.deleted_at IS NULL;\n\t\t\t\tINSERT INTO \"${ftsTable}\"(rowid, id, locale, ${fieldList})\n\t\t\t\tSELECT NEW.rowid, NEW.id, NEW.locale, ${newFieldList}\n\t\t\t\tWHERE NEW.deleted_at IS NULL;\n\t\t\tEND\n\t\t`)\n\t\t\t.execute(this.db);\n\n\t\t// Delete trigger - same external-content-safe `'delete'` form,\n\t\t// gated on `OLD.deleted_at IS NULL` for the same reason as the\n\t\t// UPDATE trigger: permanent-delete from trash hits a row whose\n\t\t// `deleted_at` is already set and which was never indexed.\n\t\tawait sql\n\t\t\t.raw(`\n\t\t\tCREATE TRIGGER IF NOT EXISTS \"${ftsTable}_delete\" \n\t\t\tAFTER DELETE ON \"${contentTable}\" \n\t\t\tBEGIN\n\t\t\t\tINSERT INTO \"${ftsTable}\"(\"${ftsTable}\", rowid, id, locale, ${fieldList})\n\t\t\t\tSELECT 'delete', OLD.rowid, OLD.id, OLD.locale, ${oldFieldList}\n\t\t\t\tWHERE OLD.deleted_at IS NULL;\n\t\t\tEND\n\t\t`)\n\t\t\t.execute(this.db);\n\t}\n\n\t/**\n\t * Drop triggers for a collection\n\t */\n\tprivate async dropTriggers(collectionSlug: string): Promise<void> {\n\t\tthis.validateInputs(collectionSlug);\n\t\tconst ftsTable = this.getFtsTableName(collectionSlug);\n\n\t\tawait sql.raw(`DROP TRIGGER IF EXISTS \"${ftsTable}_insert\"`).execute(this.db);\n\t\tawait sql.raw(`DROP TRIGGER IF EXISTS \"${ftsTable}_update\"`).execute(this.db);\n\t\tawait sql.raw(`DROP TRIGGER IF EXISTS \"${ftsTable}_delete\"`).execute(this.db);\n\t}\n\n\t/**\n\t * Drop the FTS table and triggers for a collection\n\t */\n\tasync dropFtsTable(collectionSlug: string): Promise<void> {\n\t\tif (!isSqlite(this.db)) return;\n\t\tthis.validateInputs(collectionSlug);\n\t\tconst ftsTable = this.getFtsTableName(collectionSlug);\n\n\t\t// Drop triggers first\n\t\tawait this.dropTriggers(collectionSlug);\n\n\t\t// Drop the FTS table\n\t\tawait sql.raw(`DROP TABLE IF EXISTS \"${ftsTable}\"`).execute(this.db);\n\t}\n\n\t/**\n\t * Rebuild the FTS index for a collection\n\t *\n\t * This is useful after bulk imports or if the index gets out of sync.\n\t */\n\tasync rebuildIndex(\n\t\tcollectionSlug: string,\n\t\tsearchableFields: string[],\n\t\tweights?: Record<string, number>,\n\t): Promise<void> {\n\t\tif (!isSqlite(this.db)) return;\n\t\t// Drop existing table and triggers\n\t\tawait this.dropFtsTable(collectionSlug);\n\n\t\t// Recreate table and triggers\n\t\tawait this.createFtsTable(collectionSlug, searchableFields, weights);\n\n\t\t// Populate from existing content\n\t\tawait this.populateFromContent(collectionSlug, searchableFields);\n\t}\n\n\t/**\n\t * Populate the FTS table from existing content\n\t */\n\tasync populateFromContent(collectionSlug: string, searchableFields: string[]): Promise<void> {\n\t\tif (!isSqlite(this.db)) return;\n\t\tthis.validateInputs(collectionSlug, searchableFields);\n\t\tconst ftsTable = this.getFtsTableName(collectionSlug);\n\t\tconst contentTable = this.getContentTableName(collectionSlug);\n\t\tconst fieldList = searchableFields.join(\", \");\n\n\t\t// Insert all existing content into FTS table\n\t\tawait sql\n\t\t\t.raw(`\n\t\t\tINSERT INTO \"${ftsTable}\"(rowid, id, locale, ${fieldList})\n\t\t\tSELECT rowid, id, locale, ${fieldList} FROM \"${contentTable}\"\n\t\t\tWHERE deleted_at IS NULL\n\t\t`)\n\t\t\t.execute(this.db);\n\t}\n\n\t/**\n\t * Get the search configuration for a collection\n\t */\n\tasync getSearchConfig(collectionSlug: string): Promise<SearchConfig | null> {\n\t\tconst result = await this.db\n\t\t\t.selectFrom(\"_emdash_collections\")\n\t\t\t.select(\"search_config\")\n\t\t\t.where(\"slug\", \"=\", collectionSlug)\n\t\t\t.executeTakeFirst();\n\n\t\tif (!result?.search_config) {\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\tconst parsed: unknown = JSON.parse(result.search_config);\n\t\t\tif (\n\t\t\t\ttypeof parsed !== \"object\" ||\n\t\t\t\tparsed === null ||\n\t\t\t\t!(\"enabled\" in parsed) ||\n\t\t\t\ttypeof parsed.enabled !== \"boolean\"\n\t\t\t) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst config: SearchConfig = { enabled: parsed.enabled };\n\t\t\tif (\"weights\" in parsed && typeof parsed.weights === \"object\" && parsed.weights !== null) {\n\t\t\t\t// weights is a JSON-parsed object — safe to treat as Record<string, number>\n\t\t\t\tconst weights: Record<string, number> = {};\n\t\t\t\tfor (const [k, v] of Object.entries(parsed.weights)) {\n\t\t\t\t\tif (typeof v === \"number\") {\n\t\t\t\t\t\tweights[k] = v;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconfig.weights = weights;\n\t\t\t}\n\t\t\treturn config;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Update the search configuration for a collection\n\t */\n\tasync setSearchConfig(collectionSlug: string, config: SearchConfig): Promise<void> {\n\t\tawait this.db\n\t\t\t.updateTable(\"_emdash_collections\")\n\t\t\t.set({ search_config: JSON.stringify(config) })\n\t\t\t.where(\"slug\", \"=\", collectionSlug)\n\t\t\t.execute();\n\t}\n\n\t/**\n\t * Get searchable fields for a collection\n\t */\n\tasync getSearchableFields(collectionSlug: string): Promise<string[]> {\n\t\tconst collection = await this.db\n\t\t\t.selectFrom(\"_emdash_collections\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"slug\", \"=\", collectionSlug)\n\t\t\t.executeTakeFirst();\n\n\t\tif (!collection) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst fields = await this.db\n\t\t\t.selectFrom(\"_emdash_fields\")\n\t\t\t.select(\"slug\")\n\t\t\t.where(\"collection_id\", \"=\", collection.id)\n\t\t\t.where(\"searchable\", \"=\", 1)\n\t\t\t.execute();\n\n\t\treturn fields.map((f) => f.slug);\n\t}\n\n\t/**\n\t * Enable search for a collection.\n\t *\n\t * Uses rebuildIndex to ensure a clean state -- drop any existing FTS\n\t * table/triggers, recreate them, and populate from content. This avoids\n\t * duplicate rows when triggers have already populated the index (e.g.\n\t * during seeding where content is inserted before search is enabled).\n\t */\n\tasync enableSearch(\n\t\tcollectionSlug: string,\n\t\toptions?: { weights?: Record<string, number> },\n\t): Promise<void> {\n\t\tif (!isSqlite(this.db)) {\n\t\t\tthrow new Error(\"Full-text search is only available with SQLite databases\");\n\t\t}\n\t\t// Get searchable fields\n\t\tconst searchableFields = await this.getSearchableFields(collectionSlug);\n\n\t\tif (searchableFields.length === 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`No searchable fields defined for collection \"${collectionSlug}\". ` +\n\t\t\t\t\t`Mark at least one field as searchable before enabling search.`,\n\t\t\t);\n\t\t}\n\n\t\t// Rebuild from scratch to ensure clean state (no duplicate rows)\n\t\tawait this.rebuildIndex(collectionSlug, searchableFields, options?.weights);\n\n\t\t// Update search config\n\t\tawait this.setSearchConfig(collectionSlug, {\n\t\t\tenabled: true,\n\t\t\tweights: options?.weights,\n\t\t});\n\t}\n\n\t/**\n\t * Disable search for a collection\n\t *\n\t * Drops the FTS table and triggers.\n\t */\n\tasync disableSearch(collectionSlug: string): Promise<void> {\n\t\tif (!isSqlite(this.db)) return;\n\t\tawait this.dropFtsTable(collectionSlug);\n\t\tconst existing = await this.getSearchConfig(collectionSlug);\n\t\tawait this.setSearchConfig(collectionSlug, { enabled: false, weights: existing?.weights });\n\t}\n\n\t/**\n\t * Get index statistics for a collection\n\t */\n\tasync getIndexStats(\n\t\tcollectionSlug: string,\n\t): Promise<{ indexed: number; lastRebuilt?: string } | null> {\n\t\tif (!isSqlite(this.db)) return null;\n\t\tthis.validateInputs(collectionSlug);\n\t\tconst ftsTable = this.getFtsTableName(collectionSlug);\n\t\tconst ftsDocsizeTable = `${ftsTable}_docsize`;\n\n\t\t// Check if table exists\n\t\tif (!(await this.ftsTableExists(collectionSlug))) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Count indexed rows\n\t\tconst result = await sql<{ count: number }>`\n\t\t\tSELECT COUNT(*) as count FROM \"${sql.raw(ftsDocsizeTable)}\"\n\t\t`.execute(this.db);\n\n\t\treturn {\n\t\t\tindexed: result.rows[0]?.count ?? 0,\n\t\t};\n\t}\n\n\t/**\n\t * Verify FTS index integrity and rebuild if drift is detected.\n\t *\n\t * Cheap belt-and-braces check, run lazily on the first search request\n\t * per isolate. The expensive cases (corrupted indexes from pre-fix\n\t * EmDash versions, broken legacy triggers) are handled at boot time by\n\t * migration `039_fix_fts5_triggers`, not here. This routine sticks to:\n\t *\n\t * 1. FTS table missing while config says search is enabled -> rebuild.\n\t * 2. Row count mismatch between content table and FTS docsize -> rebuild.\n\t *\n\t * Returns true if the index was rebuilt, false if it was healthy.\n\t */\n\tasync verifyAndRepairIndex(collectionSlug: string): Promise<boolean> {\n\t\tif (!isSqlite(this.db)) return false;\n\t\tthis.validateInputs(collectionSlug);\n\t\tconst ftsTable = this.getFtsTableName(collectionSlug);\n\t\tconst ftsDocsizeTable = `${ftsTable}_docsize`;\n\t\tconst contentTable = this.getContentTableName(collectionSlug);\n\t\tconst fields = await this.getSearchableFields(collectionSlug);\n\t\tconst config = await this.getSearchConfig(collectionSlug);\n\n\t\tif (!(await this.ftsTableExists(collectionSlug))) {\n\t\t\tif (!config?.enabled || fields.length === 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconsole.warn(`FTS index for \"${collectionSlug}\" is missing. Rebuilding.`);\n\t\t\tawait this.rebuildIndex(collectionSlug, fields, config.weights);\n\t\t\treturn true;\n\t\t}\n\n\t\t// Row count parity check. For external-content FTS tables, COUNT(*)\n\t\t// on the virtual table is answered from the backing content table\n\t\t// (including soft-deleted rows), so we use the docsize shadow table\n\t\t// which tracks rows actually present in the full-text index.\n\t\tconst contentCount = await sql<{ count: number }>`\n\t\t\tSELECT COUNT(*) as count FROM ${sql.ref(contentTable)}\n\t\t\tWHERE deleted_at IS NULL\n\t\t`.execute(this.db);\n\n\t\tconst ftsCount = await sql<{ count: number }>`\n\t\t\tSELECT COUNT(*) as count FROM \"${sql.raw(ftsDocsizeTable)}\"\n\t\t`.execute(this.db);\n\n\t\tconst contentRows = contentCount.rows[0]?.count ?? 0;\n\t\tconst ftsRows = ftsCount.rows[0]?.count ?? 0;\n\n\t\tif (contentRows !== ftsRows) {\n\t\t\tconsole.warn(\n\t\t\t\t`FTS index for \"${collectionSlug}\" has ${ftsRows} rows but content table has ${contentRows}. Rebuilding.`,\n\t\t\t);\n\t\t\tif (fields.length > 0) {\n\t\t\t\tawait this.rebuildIndex(collectionSlug, fields, config?.weights);\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Verify and repair FTS indexes for all search-enabled collections.\n\t *\n\t * Intended to run at startup to auto-heal any corruption from\n\t * previous process crashes.\n\t */\n\tasync verifyAndRepairAll(): Promise<number> {\n\t\tif (!isSqlite(this.db)) return 0;\n\n\t\tconst collections = await this.db\n\t\t\t.selectFrom(\"_emdash_collections\")\n\t\t\t.select(\"slug\")\n\t\t\t.where(\"search_config\", \"is not\", null)\n\t\t\t.execute();\n\n\t\tlet repaired = 0;\n\t\tfor (const { slug } of collections) {\n\t\t\tconst config = await this.getSearchConfig(slug);\n\t\t\tif (!config?.enabled) continue;\n\n\t\t\ttry {\n\t\t\t\tconst wasRepaired = await this.verifyAndRepairIndex(slug);\n\t\t\t\tif (wasRepaired) repaired++;\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`Failed to verify/repair FTS index for \"${slug}\":`, error);\n\t\t\t}\n\t\t}\n\n\t\treturn repaired;\n\t}\n}\n"],"mappings":"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"}
@@ -1832,17 +1832,17 @@ interface WhereRange {
1832
1832
  */
1833
1833
  type WhereValue = string | string[] | WhereRange;
1834
1834
  /**
1835
- * Filter for loadCollection - type is required
1835
+ * Fields shared by every collection filter, independent of pagination mode.
1836
+ *
1837
+ * Cursor and offset pagination are mutually exclusive, so they live on the
1838
+ * `CursorCollectionFilter` / `OffsetCollectionFilter` variants rather than
1839
+ * here. Use the {@link CollectionFilter} union for any value that may be
1840
+ * either.
1836
1841
  */
1837
- interface CollectionFilter$1 {
1842
+ interface CollectionFilterBase$1 {
1838
1843
  type: string;
1839
1844
  status?: "draft" | "published" | "archived";
1840
1845
  limit?: number;
1841
- /**
1842
- * Opaque cursor for keyset pagination.
1843
- * Pass the `nextCursor` value from a previous result to fetch the next page.
1844
- */
1845
- cursor?: string;
1846
1846
  /**
1847
1847
  * Filter by field values, taxonomy terms, byline credits, or ranges.
1848
1848
  *
@@ -1869,6 +1869,34 @@ interface CollectionFilter$1 {
1869
1869
  */
1870
1870
  locale?: string;
1871
1871
  }
1872
+ /** Keyset-paginated collection filter. Cannot also carry an `offset`. */
1873
+ interface CursorCollectionFilter$1 extends CollectionFilterBase$1 {
1874
+ /**
1875
+ * Opaque cursor for keyset pagination.
1876
+ * Pass the `nextCursor` value from a previous result to fetch the next page.
1877
+ */
1878
+ cursor?: string;
1879
+ offset?: never;
1880
+ }
1881
+ /** Offset-paginated collection filter. Cannot also carry a `cursor`. */
1882
+ interface OffsetCollectionFilter$1 extends CollectionFilterBase$1 {
1883
+ /**
1884
+ * Skip this many rows before returning results (offset pagination).
1885
+ * Use with `limit` for numbered archive routes (`/page/2`):
1886
+ * `offset = (page - 1) * perPage`. Ignored unless it is a positive
1887
+ * integer.
1888
+ */
1889
+ offset?: number;
1890
+ cursor?: never;
1891
+ }
1892
+ /**
1893
+ * Filter for loadCollection - type is required.
1894
+ *
1895
+ * A union of the cursor and offset pagination variants: supplying both
1896
+ * `cursor` and `offset` is a compile-time error, since they are mutually
1897
+ * exclusive ways to express "the next page" (cursor wins at runtime).
1898
+ */
1899
+ type CollectionFilter$1 = CursorCollectionFilter$1 | OffsetCollectionFilter$1;
1872
1900
  /**
1873
1901
  * Filter for loadEntry - type and id are required
1874
1902
  */
@@ -2011,22 +2039,17 @@ type SortDirection = "asc" | "desc";
2011
2039
  * @example { published_at: "desc", title: "asc" } - Multi-field sort
2012
2040
  */
2013
2041
  type OrderBySpec = Record<string, SortDirection>;
2014
- interface CollectionFilter {
2042
+ /**
2043
+ * Fields shared by every collection query, independent of pagination mode.
2044
+ *
2045
+ * Cursor and offset pagination are mutually exclusive, so they live on the
2046
+ * `CursorCollectionFilter` / `OffsetCollectionFilter` variants rather than
2047
+ * here. Use the {@link CollectionFilter} union for any value that may be
2048
+ * either.
2049
+ */
2050
+ interface CollectionFilterBase {
2015
2051
  status?: "draft" | "published" | "archived";
2016
2052
  limit?: number;
2017
- /**
2018
- * Opaque cursor for keyset pagination.
2019
- * Pass the `nextCursor` value from a previous result to fetch the next page.
2020
- * @example
2021
- * ```ts
2022
- * const cursor = Astro.url.searchParams.get("cursor") ?? undefined;
2023
- * const { entries, nextCursor } = await getEmDashCollection("posts", {
2024
- * limit: 10,
2025
- * cursor,
2026
- * });
2027
- * ```
2028
- */
2029
- cursor?: string;
2030
2053
  /**
2031
2054
  * Filter by field values, taxonomy terms, byline credits, or ranges.
2032
2055
  *
@@ -2061,6 +2084,53 @@ interface CollectionFilter {
2061
2084
  */
2062
2085
  locale?: string;
2063
2086
  }
2087
+ /** Keyset-paginated query filter. Cannot also carry an `offset`. */
2088
+ interface CursorCollectionFilter extends CollectionFilterBase {
2089
+ /**
2090
+ * Opaque cursor for keyset pagination.
2091
+ * Pass the `nextCursor` value from a previous result to fetch the next page.
2092
+ * @example
2093
+ * ```ts
2094
+ * const cursor = Astro.url.searchParams.get("cursor") ?? undefined;
2095
+ * const { entries, nextCursor } = await getEmDashCollection("posts", {
2096
+ * limit: 10,
2097
+ * cursor,
2098
+ * });
2099
+ * ```
2100
+ */
2101
+ cursor?: string;
2102
+ offset?: never;
2103
+ }
2104
+ /** Offset-paginated query filter. Cannot also carry a `cursor`. */
2105
+ interface OffsetCollectionFilter extends CollectionFilterBase {
2106
+ /**
2107
+ * Skip this many entries before returning results (offset pagination).
2108
+ *
2109
+ * Use with `limit` to render numbered archive routes like `/page/2`
2110
+ * without walking cursors or over-fetching from the start:
2111
+ *
2112
+ * ```ts
2113
+ * const perPage = 20;
2114
+ * const { entries, hasMore } = await getEmDashCollection("posts", {
2115
+ * limit: perPage,
2116
+ * offset: (page - 1) * perPage,
2117
+ * orderBy: { published_at: "desc" },
2118
+ * });
2119
+ * ```
2120
+ *
2121
+ * Only a positive integer applies.
2122
+ */
2123
+ offset?: number;
2124
+ cursor?: never;
2125
+ }
2126
+ /**
2127
+ * Filter for `getEmDashCollection`.
2128
+ *
2129
+ * A union of the cursor and offset pagination variants: supplying both
2130
+ * `cursor` and `offset` is a compile-time error, since they are mutually
2131
+ * exclusive ways to express "the next page" (cursor wins at runtime).
2132
+ */
2133
+ type CollectionFilter = CursorCollectionFilter | OffsetCollectionFilter;
2064
2134
  interface ContentEntry<T = Record<string, unknown>> {
2065
2135
  id: string;
2066
2136
  data: T;
@@ -2088,6 +2158,12 @@ interface CollectionResult<T> {
2088
2158
  * Pass this as `cursor` in the next query to get the next page.
2089
2159
  */
2090
2160
  nextCursor?: string;
2161
+ /**
2162
+ * Whether more entries exist beyond this page. Set whenever `limit` is
2163
+ * provided (cursor or offset pagination), so numbered archive routes can
2164
+ * render a "next page" link without computing a total count.
2165
+ */
2166
+ hasMore?: boolean;
2091
2167
  }
2092
2168
  /**
2093
2169
  * Result from getEmDashEntry
@@ -5107,4 +5183,4 @@ declare function extractPlainText(blocks: PortableTextBlock[] | string | null |
5107
5183
  declare function extractSearchableFields(entry: Record<string, unknown>, fields: string[]): Record<string, string>;
5108
5184
  //#endregion
5109
5185
  export { ReorderMenuItemsInput as $, ProseMirrorDocument as $n, portableText as $r, invalidateCollectionCache as $t, getEntriesByTerm as A, createEditable as An, handleRevisionList as Ar, createPluginManager as At, TaxonomyTerm as B, sanitizeHref as Bn, handleContentDuplicate as Br, EmDashConfig as Bt, ReorderWidgetsInput as C, getEmDashCollection as Cn, handleMediaDelete as Cr, NoopSandboxRunner as Ct, WidgetComponentDef as D, CMSAnnotation as Dn, RevisionListResponse as Dr, CronScheduler as Dt, WidgetArea as E, resolveEmDashPath as En, handleMediaUpdate as Er, NodeCronScheduler as Et, getTerm as F, WhereRange as Fn, handleContentCountScheduled as Fr, HookPipeline as Ft, getEntriesByByline as G, PortableTextCodeBlock as Gn, handleContentPermanentDelete as Gr, StorageDescriptor as Gt, UpdateTermInput as H, hashString as Hn, handleContentGetIncludingTrashed as Hr, getStoredConfig as Ht, getTermsForEntries as I, WhereValue as In, handleContentCountTrashed as Ir, HookResult as It, CreateMenuInput as J, PortableTextLinkMark as Jn, handleContentSchedule as Jr, CachedQueryOptions as Jt, getMenu as K, PortableTextHtmlBlock as Kn, handleContentPublish as Kr, definePlugin as Kt, invalidateTermCache as L, emdashLoader as Ln, handleContentCreate as Lr, createHookPipeline as Lt, getTaxonomyDef as M, CollectionFilter$1 as Mn, generateManifest as Mr, createHttpAccess as Mt, getTaxonomyDefs as N, EntryData as Nn, handleContentAuthors as Nr, createUnrestrictedHttpAccess as Nt, WidgetType as O, EditProxy as On, RevisionResponse as Or, SystemCleanupFn as Ot, getTaxonomyTerms as P, EntryFilter as Pn, handleContentCompare as Pr, EmailPipeline as Pt, MenuItemType as Q, PortableTextUnknownBlock as Qn, handleContentUpdate as Qr, invalidateBylineObjectCache as Qt, CreateTermInput as R, getDb as Rn, handleContentDelete as Rr, ValidatedPluginManifest as Rt, PropDef as S, getEditMeta as Sn, handleMediaCreate as Sr, verifyPreviewToken as St, Widget as T, getTranslations as Tn, handleMediaList as Tr, createNoopSandboxRunner as Tt, getByline as U, portableTextToProsemirror as Un, handleContentList as Ur, LocalStorageConfig as Ut, TaxonomyTermRow as V, computeContentHash as Vn, handleContentGet as Vr, PluginDescriptor as Vt, getBylineBySlug as W, prosemirrorToPortableText as Wn, handleContentListTrashed as Wr, S3StorageConfig as Wt, Menu as X, PortableTextSpan as Xn, handleContentUnpublish as Xr, contentNamespace as Xt, CreateMenuItemInput as Y, PortableTextMarkDef as Yn, handleContentTranslations as Yr, cachedQuery as Yt, MenuItem as Z, PortableTextTextBlock as Zn, handleContentUnschedule as Zr, contentNamespaces as Zt, getWidgetArea as _, EntryResult as _n, getCollectionInfo as _r, PreviewTokenPayload as _t, search as a, FileValue as ai, I18nConfig as an, SandboxRunner as ar, getComments as at, CreateWidgetAreaInput as b, TranslationSummary as bn, MediaListResponse as br, generatePreviewToken as bt, FTSManager as c, PluginStorageRepository as ci, isI18nEnabled as cn, SandboxedPluginInstance as cr, getSiteSetting as ct, SearchOptions as d, MediaItem as di, CacheHint as dn, getSections as dr, getPreviewToken as dt, reference as ei, invalidateCommentObjectCache as en, ProseMirrorMark as er, UpdateMenuInput as et, SearchResponse as f, MediaRepository as fi, CollectionFilter as fn, CreateSectionInput as fr, isPreviewRequest as ft, Suggestion as g, EmDashCollections as gn, UpdateSectionInput as gr, GeneratePreviewTokenOptions as gt, SuggestOptions as h, EmDashDatabaseError as hi, EditFieldMeta as hn, SectionSource as hr, getPreviewUrl as ht, getSuggestions as i, FieldUIHints as ii, invalidateTaxonomyObjectCache as in, SandboxOptions as ir, getCommentCount as it, getEntryTerms as j, createNoop as jn, handleRevisionRestore as jr, PluginRouteError as jt, getAllTermsForEntries as k, FieldAnnotation as kn, handleRevisionGet as kr, PluginManager as kt, CollectionSearchOptions as l, UserRepository as li, WaitUntilFn as ln, SerializedRequest as lr, getSiteSettings as lt, SearchStats as m, DatabaseConfig as mi, ContentEntry as mn, Section as mr, buildPreviewUrl as mt, extractSearchableFields as n, image as ni, invalidateObjectCache as nn, SandboxEmailMessage as nr, GetCommentsOptions as nt, searchCollection as o, ImageValue as oi, getFallbackChain as on, SandboxRunnerFactory as or, getPluginSetting as ot, SearchResult as p, ContentRepository as pi, CollectionResult as pn, GetSectionsOptions as pr, GetPreviewUrlOptions as pt, getMenus as q, PortableTextImageBlock as qn, handleContentRestore as qr, CacheNamespace as qt, getSearchStats as r, FieldDefinition as ri, invalidateSchemaObjectCache as rn, SandboxEmailSendCallback as rr, GetCommentsResult as rt, searchWithDb as s, PortableTextBlock$1 as si, getI18nConfig as sn, SandboxUnavailableError as sr, getPluginSettings as st, extractPlainText as t, file as ti, invalidateMenuObjectCache as tn, ProseMirrorNode as tr, UpdateMenuItemInput as tt, SearchConfig as u, CreateMediaInput as ui, after as un, getSection as ur, setSiteSettings as ut, getWidgetAreas as v, InferCollectionData as vn, SchemaError as vr, VerifyPreviewTokenOptions as vt, UpdateWidgetInput as w, getEmDashEntry as wn, handleMediaGet as wr, SandboxNotAvailableError as wt, CreateWidgetInput as x, TranslationsResult as xn, MediaResponse as xr, parseContentId as xt, getWidgetComponents as y, ResolvePathResult as yn, SchemaRegistry as yr, VerifyPreviewTokenResult as yt, TaxonomyDef as z, isSafeHref as zn, handleContentDiscardDraft as zr, pluginManifestSchema as zt };
5110
- //# sourceMappingURL=index-BaIj5hIq.d.mts.map
5186
+ //# sourceMappingURL=index-BroXT-vD.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-BroXT-vD.d.mts","names":[],"sources":["../src/database/errors.ts","../src/database/connection.ts","../src/database/repositories/content.ts","../src/database/repositories/media.ts","../src/database/repositories/user.ts","../src/database/repositories/revision.ts","../src/database/repositories/comment.ts","../src/database/repositories/plugin-storage.ts","../src/fields/types.ts","../src/fields/image.ts","../src/fields/file.ts","../src/fields/reference.ts","../src/fields/portable-text.ts","../src/api/handlers/content.ts","../src/api/handlers/manifest.ts","../src/api/handlers/revision.ts","../src/api/handlers/media.ts","../src/schema/registry.ts","../src/schema/query.ts","../src/sections/types.ts","../src/sections/index.ts","../src/plugins/sandbox/types.ts","../src/registry/types.ts","../src/content/converters/types.ts","../src/content/converters/prosemirror-to-portable-text.ts","../src/content/converters/portable-text-to-prosemirror.ts","../src/utils/hash.ts","../src/utils/url.ts","../src/loader.ts","../src/visual-editing/editable.ts","../src/query.ts","../src/after.ts","../src/i18n/config.ts","../src/object-cache/index.ts","../src/plugins/define-plugin.ts","../src/astro/storage/types.ts","../src/astro/integration/runtime.ts","../src/plugins/manifest-schema.ts","../src/plugins/hooks.ts","../src/plugins/email.ts","../src/plugins/context.ts","../src/plugins/routes.ts","../src/plugins/manager.ts","../src/plugins/cron.ts","../src/plugins/scheduler/types.ts","../src/plugins/scheduler/node.ts","../src/plugins/sandbox/noop.ts","../src/preview/tokens.ts","../src/preview/urls.ts","../src/preview/helpers.ts","../src/settings/index.ts","../src/comments/query.ts","../src/menus/types.ts","../src/menus/index.ts","../src/bylines/index.ts","../src/taxonomies/types.ts","../src/taxonomies/index.ts","../src/widgets/types.ts","../src/widgets/index.ts","../src/search/types.ts","../src/search/fts-manager.ts","../src/search/query.ts","../src/search/text-extraction.ts"],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -3,9 +3,9 @@ import { a as ContentSeo, c as EmDashValidationError, d as InvalidCursorError, f
3
3
  import { d as ContentListResponse, f as ContentResponse, h as ManifestResponse, l as ApiContext, m as ListResponse, p as FieldDescriptor, t as OptionsRepository } from "./options-CqECG0gM.mjs";
4
4
  import { n as MediaTable, r as UserTable, t as Database } from "./types-B-gIxFCE.mjs";
5
5
  import { $ as PageMetadataHandler, At as normalizeCapability, B as LogAccess, F as HookName, I as HttpAccess, J as PageFragmentContribution, K as MediaUploadEvent, L as KVAccess, N as FieldWidgetConfig, Ot as isDeprecatedCapability, P as HookConfig, Q as PageMetadataEvent, St as StorageCollection, T as DeprecatedPluginCapability, V as MediaAccess, X as PageFragmentHandler, Y as PageFragmentEvent, Z as PageMetadataContribution, a as CommentAfterCreateHandler, at as PluginAdminPage, b as ContentHookEvent, bt as ResolvedPluginHooks, c as CommentBeforeCreateEvent, ct as PluginDefinition, d as CommentModerateHandler, dt as PluginRoute, f as ContentAccess, ft as PluginStorageConfig, ht as PublicPageContext, i as CommentAfterCreateEvent, it as PluginAdminExports, kt as normalizeCapabilities, l as CommentBeforeCreateHandler, lt as PluginHooks, mt as PortableTextBlockField, n as CAPABILITY_RENAMES, o as CommentAfterModerateEvent, ot as PluginCapability, pt as PortableTextBlockConfig, q as ModerationDecision, r as CollectionCommentSettings, rt as PluginAdminConfig, s as CommentAfterModerateHandler, st as PluginContext, t as BreadcrumbItem, tt as PagePlacement, u as CommentModerateEvent, ut as PluginManifest, vt as ResolvedHook, w as CurrentPluginCapability, wt as StoredComment, x as ContentPublishStateChangeEvent, xt as RouteContext, y as ContentDeleteEvent, yt as ResolvedPlugin } from "./types-TTx8uP7V.mjs";
6
- import "./byline-fields-RFPkDLRw.mjs";
6
+ import "./byline-fields-Ca56gaT6.mjs";
7
7
  import { _ as MediaValue, n as generatePlaceholder, r as normalizeMediaValue, t as PlaceholderData } from "./placeholder-QoI4gEzP.mjs";
8
- import { $ as ReorderMenuItemsInput, $n as ProseMirrorDocument, $r as portableText, $t as invalidateCollectionCache, A as getEntriesByTerm, An as createEditable, Ar as handleRevisionList, At as createPluginManager, B as TaxonomyTerm, Bn as sanitizeHref, Br as handleContentDuplicate, C as ReorderWidgetsInput, Cn as getEmDashCollection, Cr as handleMediaDelete, Ct as NoopSandboxRunner, D as WidgetComponentDef, Dn as CMSAnnotation, Dr as RevisionListResponse, Dt as CronScheduler, E as WidgetArea, En as resolveEmDashPath, Er as handleMediaUpdate, Et as NodeCronScheduler, F as getTerm, Fn as WhereRange, Fr as handleContentCountScheduled, Ft as HookPipeline, G as getEntriesByByline, Gn as PortableTextCodeBlock, Gr as handleContentPermanentDelete, H as UpdateTermInput, Hn as hashString, Hr as handleContentGetIncludingTrashed, I as getTermsForEntries, In as WhereValue, Ir as handleContentCountTrashed, It as HookResult, J as CreateMenuInput, Jn as PortableTextLinkMark, Jr as handleContentSchedule, Jt as CachedQueryOptions, K as getMenu, Kn as PortableTextHtmlBlock, Kr as handleContentPublish, Kt as definePlugin, L as invalidateTermCache, Lr as handleContentCreate, Lt as createHookPipeline, M as getTaxonomyDef, Mn as CollectionFilter$1, Mr as generateManifest, Mt as createHttpAccess, N as getTaxonomyDefs, Nn as EntryData, Nr as handleContentAuthors, Nt as createUnrestrictedHttpAccess, O as WidgetType, On as EditProxy, Or as RevisionResponse, Ot as SystemCleanupFn, P as getTaxonomyTerms, Pn as EntryFilter, Pr as handleContentCompare, Q as MenuItemType, Qn as PortableTextUnknownBlock, Qr as handleContentUpdate, Qt as invalidateBylineObjectCache, R as CreateTermInput, Rr as handleContentDelete, Rt as ValidatedPluginManifest, S as PropDef, Sn as getEditMeta, Sr as handleMediaCreate, St as verifyPreviewToken, T as Widget, Tn as getTranslations, Tr as handleMediaList, Tt as createNoopSandboxRunner, U as getByline, Un as portableTextToProsemirror, Ur as handleContentList, V as TaxonomyTermRow, Vn as computeContentHash, Vr as handleContentGet, Vt as PluginDescriptor, W as getBylineBySlug, Wn as prosemirrorToPortableText, Wr as handleContentListTrashed, X as Menu, Xn as PortableTextSpan, Xr as handleContentUnpublish, Xt as contentNamespace, Y as CreateMenuItemInput, Yn as PortableTextMarkDef, Yr as handleContentTranslations, Yt as cachedQuery, Z as MenuItem, Zn as PortableTextTextBlock, Zr as handleContentUnschedule, Zt as contentNamespaces, _ as getWidgetArea, _n as EntryResult, _r as getCollectionInfo, _t as PreviewTokenPayload, a as search, ai as FileValue, an as I18nConfig, ar as SandboxRunner, at as getComments, b as CreateWidgetAreaInput, bn as TranslationSummary, br as MediaListResponse, bt as generatePreviewToken, c as FTSManager, ci as PluginStorageRepository, cn as isI18nEnabled, cr as SandboxedPluginInstance, ct as getSiteSetting, d as SearchOptions, di as MediaItem, dn as CacheHint, dr as getSections, dt as getPreviewToken, ei as reference, en as invalidateCommentObjectCache, er as ProseMirrorMark, et as UpdateMenuInput, f as SearchResponse, fi as MediaRepository, fn as CollectionFilter, fr as CreateSectionInput, ft as isPreviewRequest, g as Suggestion, gn as EmDashCollections, gr as UpdateSectionInput, gt as GeneratePreviewTokenOptions, h as SuggestOptions, hi as EmDashDatabaseError, hn as EditFieldMeta, hr as SectionSource, ht as getPreviewUrl, i as getSuggestions, ii as FieldUIHints, in as invalidateTaxonomyObjectCache, ir as SandboxOptions, it as getCommentCount, j as getEntryTerms, jn as createNoop, jr as handleRevisionRestore, jt as PluginRouteError, k as getAllTermsForEntries, kn as FieldAnnotation, kr as handleRevisionGet, kt as PluginManager, l as CollectionSearchOptions, li as UserRepository, ln as WaitUntilFn, lr as SerializedRequest, lt as getSiteSettings, m as SearchStats, mi as DatabaseConfig, mn as ContentEntry, mr as Section, mt as buildPreviewUrl, n as extractSearchableFields, ni as image, nn as invalidateObjectCache, nr as SandboxEmailMessage, nt as GetCommentsOptions, o as searchCollection, oi as ImageValue, on as getFallbackChain, or as SandboxRunnerFactory, ot as getPluginSetting, p as SearchResult, pi as ContentRepository, pn as CollectionResult, pr as GetSectionsOptions, pt as GetPreviewUrlOptions, q as getMenus, qn as PortableTextImageBlock, qr as handleContentRestore, qt as CacheNamespace, r as getSearchStats, ri as FieldDefinition, rn as invalidateSchemaObjectCache, rr as SandboxEmailSendCallback, rt as GetCommentsResult, s as searchWithDb, si as PortableTextBlock, sn as getI18nConfig, sr as SandboxUnavailableError, st as getPluginSettings, t as extractPlainText, ti as file, tn as invalidateMenuObjectCache, tr as ProseMirrorNode, tt as UpdateMenuItemInput, u as SearchConfig, ui as CreateMediaInput, un as after, ur as getSection, ut as setSiteSettings, v as getWidgetAreas, vn as InferCollectionData, vr as SchemaError, vt as VerifyPreviewTokenOptions, w as UpdateWidgetInput, wn as getEmDashEntry, wr as handleMediaGet, wt as SandboxNotAvailableError, x as CreateWidgetInput, xn as TranslationsResult, xr as MediaResponse, xt as parseContentId, y as getWidgetComponents, yn as ResolvePathResult, yr as SchemaRegistry, yt as VerifyPreviewTokenResult, z as TaxonomyDef, zn as isSafeHref, zr as handleContentDiscardDraft, zt as pluginManifestSchema } from "./index-BaIj5hIq.mjs";
8
+ import { $ as ReorderMenuItemsInput, $n as ProseMirrorDocument, $r as portableText, $t as invalidateCollectionCache, A as getEntriesByTerm, An as createEditable, Ar as handleRevisionList, At as createPluginManager, B as TaxonomyTerm, Bn as sanitizeHref, Br as handleContentDuplicate, C as ReorderWidgetsInput, Cn as getEmDashCollection, Cr as handleMediaDelete, Ct as NoopSandboxRunner, D as WidgetComponentDef, Dn as CMSAnnotation, Dr as RevisionListResponse, Dt as CronScheduler, E as WidgetArea, En as resolveEmDashPath, Er as handleMediaUpdate, Et as NodeCronScheduler, F as getTerm, Fn as WhereRange, Fr as handleContentCountScheduled, Ft as HookPipeline, G as getEntriesByByline, Gn as PortableTextCodeBlock, Gr as handleContentPermanentDelete, H as UpdateTermInput, Hn as hashString, Hr as handleContentGetIncludingTrashed, I as getTermsForEntries, In as WhereValue, Ir as handleContentCountTrashed, It as HookResult, J as CreateMenuInput, Jn as PortableTextLinkMark, Jr as handleContentSchedule, Jt as CachedQueryOptions, K as getMenu, Kn as PortableTextHtmlBlock, Kr as handleContentPublish, Kt as definePlugin, L as invalidateTermCache, Lr as handleContentCreate, Lt as createHookPipeline, M as getTaxonomyDef, Mn as CollectionFilter$1, Mr as generateManifest, Mt as createHttpAccess, N as getTaxonomyDefs, Nn as EntryData, Nr as handleContentAuthors, Nt as createUnrestrictedHttpAccess, O as WidgetType, On as EditProxy, Or as RevisionResponse, Ot as SystemCleanupFn, P as getTaxonomyTerms, Pn as EntryFilter, Pr as handleContentCompare, Q as MenuItemType, Qn as PortableTextUnknownBlock, Qr as handleContentUpdate, Qt as invalidateBylineObjectCache, R as CreateTermInput, Rr as handleContentDelete, Rt as ValidatedPluginManifest, S as PropDef, Sn as getEditMeta, Sr as handleMediaCreate, St as verifyPreviewToken, T as Widget, Tn as getTranslations, Tr as handleMediaList, Tt as createNoopSandboxRunner, U as getByline, Un as portableTextToProsemirror, Ur as handleContentList, V as TaxonomyTermRow, Vn as computeContentHash, Vr as handleContentGet, Vt as PluginDescriptor, W as getBylineBySlug, Wn as prosemirrorToPortableText, Wr as handleContentListTrashed, X as Menu, Xn as PortableTextSpan, Xr as handleContentUnpublish, Xt as contentNamespace, Y as CreateMenuItemInput, Yn as PortableTextMarkDef, Yr as handleContentTranslations, Yt as cachedQuery, Z as MenuItem, Zn as PortableTextTextBlock, Zr as handleContentUnschedule, Zt as contentNamespaces, _ as getWidgetArea, _n as EntryResult, _r as getCollectionInfo, _t as PreviewTokenPayload, a as search, ai as FileValue, an as I18nConfig, ar as SandboxRunner, at as getComments, b as CreateWidgetAreaInput, bn as TranslationSummary, br as MediaListResponse, bt as generatePreviewToken, c as FTSManager, ci as PluginStorageRepository, cn as isI18nEnabled, cr as SandboxedPluginInstance, ct as getSiteSetting, d as SearchOptions, di as MediaItem, dn as CacheHint, dr as getSections, dt as getPreviewToken, ei as reference, en as invalidateCommentObjectCache, er as ProseMirrorMark, et as UpdateMenuInput, f as SearchResponse, fi as MediaRepository, fn as CollectionFilter, fr as CreateSectionInput, ft as isPreviewRequest, g as Suggestion, gn as EmDashCollections, gr as UpdateSectionInput, gt as GeneratePreviewTokenOptions, h as SuggestOptions, hi as EmDashDatabaseError, hn as EditFieldMeta, hr as SectionSource, ht as getPreviewUrl, i as getSuggestions, ii as FieldUIHints, in as invalidateTaxonomyObjectCache, ir as SandboxOptions, it as getCommentCount, j as getEntryTerms, jn as createNoop, jr as handleRevisionRestore, jt as PluginRouteError, k as getAllTermsForEntries, kn as FieldAnnotation, kr as handleRevisionGet, kt as PluginManager, l as CollectionSearchOptions, li as UserRepository, ln as WaitUntilFn, lr as SerializedRequest, lt as getSiteSettings, m as SearchStats, mi as DatabaseConfig, mn as ContentEntry, mr as Section, mt as buildPreviewUrl, n as extractSearchableFields, ni as image, nn as invalidateObjectCache, nr as SandboxEmailMessage, nt as GetCommentsOptions, o as searchCollection, oi as ImageValue, on as getFallbackChain, or as SandboxRunnerFactory, ot as getPluginSetting, p as SearchResult, pi as ContentRepository, pn as CollectionResult, pr as GetSectionsOptions, pt as GetPreviewUrlOptions, q as getMenus, qn as PortableTextImageBlock, qr as handleContentRestore, qt as CacheNamespace, r as getSearchStats, ri as FieldDefinition, rn as invalidateSchemaObjectCache, rr as SandboxEmailSendCallback, rt as GetCommentsResult, s as searchWithDb, si as PortableTextBlock, sn as getI18nConfig, sr as SandboxUnavailableError, st as getPluginSettings, t as extractPlainText, ti as file, tn as invalidateMenuObjectCache, tr as ProseMirrorNode, tt as UpdateMenuItemInput, u as SearchConfig, ui as CreateMediaInput, un as after, ur as getSection, ut as setSiteSettings, v as getWidgetAreas, vn as InferCollectionData, vr as SchemaError, vt as VerifyPreviewTokenOptions, w as UpdateWidgetInput, wn as getEmDashEntry, wr as handleMediaGet, wt as SandboxNotAvailableError, x as CreateWidgetInput, xn as TranslationsResult, xr as MediaResponse, xt as parseContentId, y as getWidgetComponents, yn as ResolvePathResult, yr as SchemaRegistry, yt as VerifyPreviewTokenResult, z as TaxonomyDef, zn as isSafeHref, zr as handleContentDiscardDraft, zt as pluginManifestSchema } from "./index-BroXT-vD.mjs";
9
9
  import { n as getMigrationStatus, t as MigrationStatus } from "./runner-CEtq-6Sm.mjs";
10
10
  import { S as decodeSlug, _ as WxrSite, a as getAllSources, b as parseWxr, c as getUrlSources, d as importReusableBlocksAsSections, f as WxrAttachment, g as WxrPost, h as WxrData, i as clearSources, l as probeUrl, m as WxrCategory, n as parseWxrDate, o as getFileSources, p as WxrAuthor, r as wxrSource, s as getSource, t as wordpressRestSource, u as registerSource, v as WxrTag, x as parseWxrString, y as WxrTerm } from "./index-qbL02uhs.mjs";
11
11
  import { i as SiteSettings, n as SeoSettings, r as SiteSettingKey, t as MediaReference } from "./types-BG8_XTLj.mjs";