emdash 0.28.1 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (680) hide show
  1. package/dist/{adapters-hUy8vOB-.d.mts → adapters-DPAkL6QF.d.mts} +1 -1
  2. package/dist/{adapters-hUy8vOB-.d.mts.map → adapters-DPAkL6QF.d.mts.map} +1 -1
  3. package/dist/{allowed-origins-CRsJ6BPM.mjs → allowed-origins-FXB-FplB.mjs} +2 -2
  4. package/dist/{allowed-origins-CRsJ6BPM.mjs.map → allowed-origins-FXB-FplB.mjs.map} +1 -1
  5. package/dist/api/route-utils.d.mts +3 -3
  6. package/dist/api/route-utils.mjs +22 -21
  7. package/dist/api/route-utils.mjs.map +1 -1
  8. package/dist/api/schemas/index.d.mts +2 -2
  9. package/dist/api/schemas/index.mjs +4 -4
  10. package/dist/{api-DxFSorgk.mjs → api-DVbHNApo.mjs} +75 -23
  11. package/dist/api-DVbHNApo.mjs.map +1 -0
  12. package/dist/{api-tokens-DvqeZmVq.mjs → api-tokens-UYBkl17d.mjs} +2 -2
  13. package/dist/{api-tokens-DvqeZmVq.mjs.map → api-tokens-UYBkl17d.mjs.map} +1 -1
  14. package/dist/{apply-CDJqIjPU.mjs → apply-D23iUV4q.mjs} +20 -20
  15. package/dist/{apply-CDJqIjPU.mjs.map → apply-D23iUV4q.mjs.map} +1 -1
  16. package/dist/astro/index.d.mts +13 -12
  17. package/dist/astro/index.d.mts.map +1 -1
  18. package/dist/astro/index.mjs +10 -5
  19. package/dist/astro/index.mjs.map +1 -1
  20. package/dist/astro/middleware/auth.d.mts +11 -10
  21. package/dist/astro/middleware/auth.d.mts.map +1 -1
  22. package/dist/astro/middleware/auth.mjs +8 -8
  23. package/dist/astro/middleware/redirect.mjs +7 -7
  24. package/dist/astro/middleware/request-context.d.mts +3 -0
  25. package/dist/astro/middleware/request-context.d.mts.map +1 -1
  26. package/dist/astro/middleware/request-context.mjs +257 -30
  27. package/dist/astro/middleware/request-context.mjs.map +1 -1
  28. package/dist/astro/middleware/setup.mjs +1 -1
  29. package/dist/astro/middleware.d.mts +2 -2
  30. package/dist/astro/middleware.d.mts.map +1 -1
  31. package/dist/astro/middleware.mjs +125 -79
  32. package/dist/astro/middleware.mjs.map +1 -1
  33. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +7 -7
  34. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +7 -7
  35. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +5 -5
  36. package/dist/astro/routes/api/admin/api-tokens/index.mjs +6 -6
  37. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +6 -6
  38. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +10 -10
  39. package/dist/astro/routes/api/admin/byline-fields/index.mjs +10 -10
  40. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +10 -10
  41. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +17 -17
  42. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +17 -17
  43. package/dist/astro/routes/api/admin/bylines/index.mjs +17 -17
  44. package/dist/astro/routes/api/admin/comments/_id_/status.d.mts.map +1 -1
  45. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +13 -13
  46. package/dist/astro/routes/api/admin/comments/_id_/status.mjs.map +1 -1
  47. package/dist/astro/routes/api/admin/comments/_id_.mjs +6 -6
  48. package/dist/astro/routes/api/admin/comments/bulk.mjs +10 -10
  49. package/dist/astro/routes/api/admin/comments/counts.mjs +6 -6
  50. package/dist/astro/routes/api/admin/comments/index.d.mts.map +1 -1
  51. package/dist/astro/routes/api/admin/comments/index.mjs +10 -10
  52. package/dist/astro/routes/api/admin/comments/index.mjs.map +1 -1
  53. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +6 -6
  54. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +5 -5
  55. package/dist/astro/routes/api/admin/media-usage/repair.d.mts +8 -0
  56. package/dist/astro/routes/api/admin/media-usage/repair.d.mts.map +1 -0
  57. package/dist/astro/routes/api/admin/media-usage/repair.mjs +28 -0
  58. package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -0
  59. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +5 -5
  60. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +5 -5
  61. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +43 -41
  62. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
  63. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +43 -41
  64. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
  65. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +42 -40
  66. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  67. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +42 -40
  68. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  69. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +42 -40
  70. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  71. package/dist/astro/routes/api/admin/plugins/index.mjs +42 -40
  72. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  73. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +4 -4
  74. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +42 -40
  75. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  76. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +42 -40
  77. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
  78. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +42 -40
  79. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
  80. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +42 -40
  81. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
  82. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +43 -41
  83. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
  84. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +42 -40
  85. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
  86. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +43 -41
  87. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  88. package/dist/astro/routes/api/admin/plugins/updates.mjs +42 -40
  89. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  90. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +42 -40
  91. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  92. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +4 -4
  93. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +42 -40
  94. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  95. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +4 -4
  96. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +3 -3
  97. package/dist/astro/routes/api/admin/users/_id_/index.mjs +8 -8
  98. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +5 -5
  99. package/dist/astro/routes/api/admin/users/index.mjs +7 -7
  100. package/dist/astro/routes/api/auth/dev-bypass.mjs +7 -7
  101. package/dist/astro/routes/api/auth/invite/accept.mjs +3 -3
  102. package/dist/astro/routes/api/auth/invite/complete.mjs +12 -12
  103. package/dist/astro/routes/api/auth/invite/index.mjs +9 -9
  104. package/dist/astro/routes/api/auth/invite/register-options.mjs +11 -11
  105. package/dist/astro/routes/api/auth/logout.mjs +4 -4
  106. package/dist/astro/routes/api/auth/magic-link/send.mjs +11 -11
  107. package/dist/astro/routes/api/auth/magic-link/verify.mjs +4 -4
  108. package/dist/astro/routes/api/auth/me.mjs +8 -8
  109. package/dist/astro/routes/api/auth/mode.mjs +1 -1
  110. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +4 -4
  111. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs.map +1 -1
  112. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  113. package/dist/astro/routes/api/auth/oauth/_provider_.mjs.map +1 -1
  114. package/dist/astro/routes/api/auth/passkey/_id_.mjs +7 -7
  115. package/dist/astro/routes/api/auth/passkey/index.mjs +3 -3
  116. package/dist/astro/routes/api/auth/passkey/options.mjs +13 -13
  117. package/dist/astro/routes/api/auth/passkey/register/options.mjs +11 -11
  118. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +12 -12
  119. package/dist/astro/routes/api/auth/passkey/verify.mjs +12 -12
  120. package/dist/astro/routes/api/auth/signup/complete.mjs +12 -12
  121. package/dist/astro/routes/api/auth/signup/request.mjs +11 -11
  122. package/dist/astro/routes/api/auth/signup/verify.mjs +3 -3
  123. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.d.mts.map +1 -1
  124. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +69 -14
  125. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs.map +1 -1
  126. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +13 -13
  127. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +4 -4
  128. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +4 -4
  129. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +4 -4
  130. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +4 -4
  131. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +12 -12
  132. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +8 -8
  133. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts +9 -0
  134. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts.map +1 -0
  135. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +71 -0
  136. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -0
  137. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.d.mts +8 -0
  138. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.d.mts.map +1 -0
  139. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +50 -0
  140. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -0
  141. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +4 -4
  142. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +4 -4
  143. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +8 -8
  144. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +15 -15
  145. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +4 -4
  146. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +4 -4
  147. package/dist/astro/routes/api/content/_collection_/_id_.mjs +8 -8
  148. package/dist/astro/routes/api/content/_collection_/authors.mjs +4 -4
  149. package/dist/astro/routes/api/content/_collection_/index.mjs +8 -8
  150. package/dist/astro/routes/api/content/_collection_/trash.mjs +8 -8
  151. package/dist/astro/routes/api/dashboard.mjs +8 -8
  152. package/dist/astro/routes/api/dev/emails.mjs +4 -4
  153. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  154. package/dist/astro/routes/api/import/probe.mjs +18 -18
  155. package/dist/astro/routes/api/import/wordpress/analyze.mjs +5 -5
  156. package/dist/astro/routes/api/import/wordpress/execute.d.mts +12 -11
  157. package/dist/astro/routes/api/import/wordpress/execute.d.mts.map +1 -1
  158. package/dist/astro/routes/api/import/wordpress/execute.mjs +16 -16
  159. package/dist/astro/routes/api/import/wordpress/media.d.mts +11 -10
  160. package/dist/astro/routes/api/import/wordpress/media.d.mts.map +1 -1
  161. package/dist/astro/routes/api/import/wordpress/media.mjs +11 -11
  162. package/dist/astro/routes/api/import/wordpress/prepare.mjs +11 -11
  163. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +12 -16
  164. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts.map +1 -1
  165. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +11 -11
  166. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  167. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +18 -18
  168. package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs +1 -1
  169. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +12 -11
  170. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts.map +1 -1
  171. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +28 -28
  172. package/dist/astro/routes/api/manifest.mjs +6 -6
  173. package/dist/astro/routes/api/mcp.mjs +56 -47
  174. package/dist/astro/routes/api/mcp.mjs.map +1 -1
  175. package/dist/astro/routes/api/media/_id_/confirm.mjs +9 -9
  176. package/dist/astro/routes/api/media/_id_.mjs +8 -8
  177. package/dist/astro/routes/api/media/file/_...key_.mjs +3 -3
  178. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +4 -4
  179. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +4 -4
  180. package/dist/astro/routes/api/media/providers/index.mjs +4 -4
  181. package/dist/astro/routes/api/media/upload-url.mjs +10 -10
  182. package/dist/astro/routes/api/media.mjs +13 -13
  183. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +9 -9
  184. package/dist/astro/routes/api/menus/_name_/items.mjs +9 -9
  185. package/dist/astro/routes/api/menus/_name_/reorder.mjs +9 -9
  186. package/dist/astro/routes/api/menus/_name_/translations.mjs +9 -9
  187. package/dist/astro/routes/api/menus/_name_.mjs +9 -9
  188. package/dist/astro/routes/api/menus/index.mjs +9 -9
  189. package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
  190. package/dist/astro/routes/api/oauth/device/authorize.mjs +7 -7
  191. package/dist/astro/routes/api/oauth/device/code.mjs +10 -10
  192. package/dist/astro/routes/api/oauth/device/token.mjs +9 -9
  193. package/dist/astro/routes/api/oauth/register.mjs +4 -4
  194. package/dist/astro/routes/api/oauth/token/refresh.mjs +7 -7
  195. package/dist/astro/routes/api/oauth/token/revoke.mjs +7 -7
  196. package/dist/astro/routes/api/oauth/token.mjs +7 -7
  197. package/dist/astro/routes/api/openapi.json.mjs +24 -5
  198. package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
  199. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +5 -5
  200. package/dist/astro/routes/api/redirects/404s/index.mjs +12 -12
  201. package/dist/astro/routes/api/redirects/404s/summary.mjs +12 -12
  202. package/dist/astro/routes/api/redirects/_id_.mjs +13 -13
  203. package/dist/astro/routes/api/redirects/index.mjs +13 -13
  204. package/dist/astro/routes/api/relations/_id_/index.d.mts +10 -0
  205. package/dist/astro/routes/api/relations/_id_/index.d.mts.map +1 -0
  206. package/dist/astro/routes/api/relations/_id_/index.mjs +69 -0
  207. package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -0
  208. package/dist/astro/routes/api/relations/_id_/translations.d.mts +8 -0
  209. package/dist/astro/routes/api/relations/_id_/translations.d.mts.map +1 -0
  210. package/dist/astro/routes/api/relations/_id_/translations.mjs +34 -0
  211. package/dist/astro/routes/api/relations/_id_/translations.mjs.map +1 -0
  212. package/dist/astro/routes/api/relations/index.d.mts +9 -0
  213. package/dist/astro/routes/api/relations/index.d.mts.map +1 -0
  214. package/dist/astro/routes/api/relations/index.mjs +53 -0
  215. package/dist/astro/routes/api/relations/index.mjs.map +1 -0
  216. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +4 -4
  217. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +4 -4
  218. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.d.mts.map +1 -1
  219. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +42 -40
  220. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  221. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.d.mts.map +1 -1
  222. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +42 -40
  223. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  224. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +42 -40
  225. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  226. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +42 -40
  227. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  228. package/dist/astro/routes/api/schema/collections/index.mjs +42 -40
  229. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  230. package/dist/astro/routes/api/schema/index.mjs +9 -9
  231. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +42 -40
  232. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  233. package/dist/astro/routes/api/schema/orphans/index.mjs +42 -40
  234. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  235. package/dist/astro/routes/api/search/enable.mjs +12 -12
  236. package/dist/astro/routes/api/search/index.mjs +13 -12
  237. package/dist/astro/routes/api/search/index.mjs.map +1 -1
  238. package/dist/astro/routes/api/search/rebuild.mjs +12 -12
  239. package/dist/astro/routes/api/search/stats.mjs +8 -8
  240. package/dist/astro/routes/api/search/suggest.mjs +11 -11
  241. package/dist/astro/routes/api/sections/_slug_.mjs +11 -11
  242. package/dist/astro/routes/api/sections/index.mjs +11 -11
  243. package/dist/astro/routes/api/settings/email.mjs +6 -6
  244. package/dist/astro/routes/api/settings.mjs +15 -15
  245. package/dist/astro/routes/api/setup/admin-verify.mjs +13 -13
  246. package/dist/astro/routes/api/setup/admin.mjs +12 -12
  247. package/dist/astro/routes/api/setup/dev-bypass.mjs +29 -29
  248. package/dist/astro/routes/api/setup/dev-reset.mjs +4 -4
  249. package/dist/astro/routes/api/setup/index.mjs +30 -30
  250. package/dist/astro/routes/api/setup/status.mjs +5 -5
  251. package/dist/astro/routes/api/snapshot.mjs +8 -8
  252. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +15 -15
  253. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +15 -15
  254. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +15 -15
  255. package/dist/astro/routes/api/taxonomies/index.mjs +15 -15
  256. package/dist/astro/routes/api/themes/preview.mjs +7 -7
  257. package/dist/astro/routes/api/typegen.mjs +6 -6
  258. package/dist/astro/routes/api/well-known/auth.mjs +2 -2
  259. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
  260. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
  261. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +8 -8
  262. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +12 -12
  263. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +12 -12
  264. package/dist/astro/routes/api/widget-areas/_name_.mjs +8 -8
  265. package/dist/astro/routes/api/widget-areas/index.mjs +12 -12
  266. package/dist/astro/routes/api/widget-components.mjs +4 -4
  267. package/dist/astro/routes/robots.txt.mjs +9 -9
  268. package/dist/astro/routes/sitemap-_collection_.xml.mjs +12 -12
  269. package/dist/astro/routes/sitemap.xml.mjs +10 -10
  270. package/dist/astro/types.d.mts +16 -13
  271. package/dist/astro/types.d.mts.map +1 -1
  272. package/dist/auth/providers/github.d.mts +1 -1
  273. package/dist/auth/providers/google.d.mts +1 -1
  274. package/dist/{authorize-Dz88F_Fw.mjs → authorize-BmCwQCib.mjs} +2 -2
  275. package/dist/{authorize-Dz88F_Fw.mjs.map → authorize-BmCwQCib.mjs.map} +1 -1
  276. package/dist/{base64-CmWvODNW.mjs → base64-C74Msx8h.mjs} +1 -1
  277. package/dist/{base64-CmWvODNW.mjs.map → base64-C74Msx8h.mjs.map} +1 -1
  278. package/dist/{byline-Bm8ZgUP9.mjs → byline-BWb5H-65.mjs} +8 -8
  279. package/dist/{byline-Bm8ZgUP9.mjs.map → byline-BWb5H-65.mjs.map} +1 -1
  280. package/dist/{byline-fields-CIx_GuN4.mjs → byline-fields-DO6bAYK8.mjs} +2 -2
  281. package/dist/{byline-fields-CIx_GuN4.mjs.map → byline-fields-DO6bAYK8.mjs.map} +1 -1
  282. package/dist/{byline-registry-BOjqDOim.mjs → byline-registry-BCuOp4UF.mjs} +3 -3
  283. package/dist/{byline-registry-BOjqDOim.mjs.map → byline-registry-BCuOp4UF.mjs.map} +1 -1
  284. package/dist/{bylines-6tm9mgQb.mjs → bylines-BGuKFaBy.mjs} +4 -4
  285. package/dist/{bylines-6tm9mgQb.mjs.map → bylines-BGuKFaBy.mjs.map} +1 -1
  286. package/dist/{bylines-CAZxGSrm.mjs → bylines-CHojDMpj.mjs} +8 -8
  287. package/dist/{bylines-CAZxGSrm.mjs.map → bylines-CHojDMpj.mjs.map} +1 -1
  288. package/dist/{cache-CEBAZjir.mjs → cache-BeR7RfN8.mjs} +3 -3
  289. package/dist/{cache-CEBAZjir.mjs.map → cache-BeR7RfN8.mjs.map} +1 -1
  290. package/dist/{challenge-store-anhwVER0.mjs → challenge-store-B426wQ6O.mjs} +1 -1
  291. package/dist/{challenge-store-anhwVER0.mjs.map → challenge-store-B426wQ6O.mjs.map} +1 -1
  292. package/dist/{chunks-B2isWQhr.mjs → chunks-BU5_nrAC.mjs} +2 -2
  293. package/dist/{chunks-B2isWQhr.mjs.map → chunks-BU5_nrAC.mjs.map} +1 -1
  294. package/dist/cli/index.mjs +28 -28
  295. package/dist/cli/index.mjs.map +1 -1
  296. package/dist/client/cf-access.d.mts +1 -1
  297. package/dist/client/index.d.mts +34 -2
  298. package/dist/client/index.d.mts.map +1 -1
  299. package/dist/client/index.mjs +6 -2
  300. package/dist/client/index.mjs.map +1 -1
  301. package/dist/{comment-CzeatwBV.mjs → comment-SWh31kS0.mjs} +2 -2
  302. package/dist/{comment-CzeatwBV.mjs.map → comment-SWh31kS0.mjs.map} +1 -1
  303. package/dist/{comment-reaction-Cj9QJY7I.mjs → comment-reaction-DgcpziXI.mjs} +2 -2
  304. package/dist/{comment-reaction-Cj9QJY7I.mjs.map → comment-reaction-DgcpziXI.mjs.map} +1 -1
  305. package/dist/{comments-BLE-jv5k.mjs → comments-kZYGppMS.mjs} +3 -3
  306. package/dist/{comments-BLE-jv5k.mjs.map → comments-kZYGppMS.mjs.map} +1 -1
  307. package/dist/{components-B_sATNUc.mjs → components-CliOkZAs.mjs} +1 -1
  308. package/dist/{components-B_sATNUc.mjs.map → components-CliOkZAs.mjs.map} +1 -1
  309. package/dist/{content-DhgEth4k.mjs → content-BO61Sx4j.mjs} +179 -20
  310. package/dist/content-BO61Sx4j.mjs.map +1 -0
  311. package/dist/{content-refresh-Br4gMzh8.mjs → content-refresh-BkkApzeS.mjs} +8 -8
  312. package/dist/{content-refresh-Br4gMzh8.mjs.map → content-refresh-BkkApzeS.mjs.map} +1 -1
  313. package/dist/{context-BRIpHARC.mjs → context-DtSFYFuS.mjs} +71 -14
  314. package/dist/context-DtSFYFuS.mjs.map +1 -0
  315. package/dist/{cron-v4FTEFR_.mjs → cron-YFJ7uNVA.mjs} +1 -1
  316. package/dist/{cron-v4FTEFR_.mjs.map → cron-YFJ7uNVA.mjs.map} +1 -1
  317. package/dist/{dashboard-EvEKF5en.mjs → dashboard-xo_gPs_D.mjs} +6 -5
  318. package/dist/dashboard-xo_gPs_D.mjs.map +1 -0
  319. package/dist/database/pg-migration-lock.d.mts +21 -0
  320. package/dist/database/pg-migration-lock.d.mts.map +1 -0
  321. package/dist/database/pg-migration-lock.mjs +45 -0
  322. package/dist/database/pg-migration-lock.mjs.map +1 -0
  323. package/dist/db/index.d.mts +3 -3
  324. package/dist/db/index.mjs +2 -2
  325. package/dist/db/libsql.d.mts +1 -1
  326. package/dist/db/postgres.d.mts +1 -1
  327. package/dist/db/postgres.d.mts.map +1 -1
  328. package/dist/db/postgres.mjs +2 -8
  329. package/dist/db/postgres.mjs.map +1 -1
  330. package/dist/db/sqlite.d.mts +1 -1
  331. package/dist/{db-errors-CK46D-ly.mjs → db-errors-BKuXh_fi.mjs} +1 -1
  332. package/dist/{db-errors-CK46D-ly.mjs.map → db-errors-BKuXh_fi.mjs.map} +1 -1
  333. package/dist/{default-CM_D83Mg.mjs → default-DY5ovGUG.mjs} +1 -1
  334. package/dist/{default-CM_D83Mg.mjs.map → default-DY5ovGUG.mjs.map} +1 -1
  335. package/dist/{device-flow-CfGP18Uw.mjs → device-flow-CPXQ_QfW.mjs} +5 -5
  336. package/dist/{device-flow-CfGP18Uw.mjs.map → device-flow-CPXQ_QfW.mjs.map} +1 -1
  337. package/dist/{dialect-helpers-DRI5pyY3.mjs → dialect-helpers-Cue7QQOR.mjs} +21 -2
  338. package/dist/dialect-helpers-Cue7QQOR.mjs.map +1 -0
  339. package/dist/{email-console-CIf4Lfvv.mjs → email-console-CjkQc7oY.mjs} +1 -1
  340. package/dist/{email-console-CIf4Lfvv.mjs.map → email-console-CjkQc7oY.mjs.map} +1 -1
  341. package/dist/{enrich-BQ0mxJRs.mjs → enrich-CFJJgxs_.mjs} +2 -2
  342. package/dist/{enrich-BQ0mxJRs.mjs.map → enrich-CFJJgxs_.mjs.map} +1 -1
  343. package/dist/{error-CkAseSqZ.mjs → error-CfJMLSkd.mjs} +12 -3
  344. package/dist/error-CfJMLSkd.mjs.map +1 -0
  345. package/dist/{escape-DqD0aCKu.mjs → escape-r8_GbEU2.mjs} +1 -1
  346. package/dist/{escape-DqD0aCKu.mjs.map → escape-r8_GbEU2.mjs.map} +1 -1
  347. package/dist/{field-defs-cache-WUI88LX5.mjs → field-defs-cache-BVrNCgSj.mjs} +5 -5
  348. package/dist/{field-defs-cache-WUI88LX5.mjs.map → field-defs-cache-BVrNCgSj.mjs.map} +1 -1
  349. package/dist/{fts-manager-BbFaF_V8.mjs → fts-manager-BD9s77qh.mjs} +27 -3
  350. package/dist/{fts-manager-BbFaF_V8.mjs.map → fts-manager-BD9s77qh.mjs.map} +1 -1
  351. package/dist/{hash-DrvzIXcz.mjs → hash-DFFrkivP.mjs} +1 -1
  352. package/dist/{hash-DrvzIXcz.mjs.map → hash-DFFrkivP.mjs.map} +1 -1
  353. package/dist/hreflang-CgIxhH4k.d.mts +48 -0
  354. package/dist/hreflang-CgIxhH4k.d.mts.map +1 -0
  355. package/dist/hreflang-pAWUiPd_.mjs +102 -0
  356. package/dist/hreflang-pAWUiPd_.mjs.map +1 -0
  357. package/dist/{import-fYLf14Co.mjs → import-2jHtLzsO.mjs} +6 -6
  358. package/dist/{import-fYLf14Co.mjs.map → import-2jHtLzsO.mjs.map} +1 -1
  359. package/dist/{index-B9sIxwe4.d.mts → index-BXOCyLj0.d.mts} +115 -21
  360. package/dist/index-BXOCyLj0.d.mts.map +1 -0
  361. package/dist/{index-Bm-Gy8Mh.d.mts → index-DxjWLKGT.d.mts} +3 -3
  362. package/dist/{index-Bm-Gy8Mh.d.mts.map → index-DxjWLKGT.d.mts.map} +1 -1
  363. package/dist/index.d.mts +20 -19
  364. package/dist/index.mjs +68 -64
  365. package/dist/{init-lock-6b309ZrF.mjs → init-lock-DJkX6Hto.mjs} +1 -1
  366. package/dist/{init-lock-6b309ZrF.mjs.map → init-lock-DJkX6Hto.mjs.map} +1 -1
  367. package/dist/{load-Djn3HWQS.mjs → load-DgoWMdRX.mjs} +2 -2
  368. package/dist/{load-Djn3HWQS.mjs.map → load-DgoWMdRX.mjs.map} +1 -1
  369. package/dist/{loader-CB6YHeul.mjs → loader-Rb8QlGZp.mjs} +5 -20
  370. package/dist/loader-Rb8QlGZp.mjs.map +1 -0
  371. package/dist/{manifest-schema-BHlgZM1W.mjs → manifest-schema-DeGNma2O.mjs} +3 -1
  372. package/dist/manifest-schema-DeGNma2O.mjs.map +1 -0
  373. package/dist/media/image-endpoint.mjs +1 -1
  374. package/dist/media/index.d.mts +1 -1
  375. package/dist/media/index.mjs +2 -2
  376. package/dist/media/local-runtime.d.mts +13 -12
  377. package/dist/media/local-runtime.d.mts.map +1 -1
  378. package/dist/media/local-runtime.mjs +8 -8
  379. package/dist/{media-BrXIaMFN.mjs → media-D2ZFowpn.mjs} +2 -2
  380. package/dist/media-D2ZFowpn.mjs.map +1 -0
  381. package/dist/{media-allowlist-CRHEeJ_i.mjs → media-allowlist-Dc05vKtt.mjs} +2 -2
  382. package/dist/{media-allowlist-CRHEeJ_i.mjs.map → media-allowlist-Dc05vKtt.mjs.map} +1 -1
  383. package/dist/{media-url-CKi5XSw4.mjs → media-url-DgIEYZr4.mjs} +1 -1
  384. package/dist/{media-url-CKi5XSw4.mjs.map → media-url-DgIEYZr4.mjs.map} +1 -1
  385. package/dist/media-usage-B__v9NMm.mjs +421 -0
  386. package/dist/media-usage-B__v9NMm.mjs.map +1 -0
  387. package/dist/{menus-Cfivc2Ad.mjs → menus-BpfevlJD.mjs} +3 -3
  388. package/dist/{menus-Cfivc2Ad.mjs.map → menus-BpfevlJD.mjs.map} +1 -1
  389. package/dist/{menus-b2T4clbO.mjs → menus-BtvH7Z7t.mjs} +31 -12
  390. package/dist/menus-BtvH7Z7t.mjs.map +1 -0
  391. package/dist/{mime-CCEzze7W.mjs → mime-DfIVjNkr.mjs} +1 -1
  392. package/dist/{mime-CCEzze7W.mjs.map → mime-DfIVjNkr.mjs.map} +1 -1
  393. package/dist/{mode-BM9QgEmt.mjs → mode-BVnhGZ2o.mjs} +1 -1
  394. package/dist/{mode-BM9QgEmt.mjs.map → mode-BVnhGZ2o.mjs.map} +1 -1
  395. package/dist/{normalize-CeglrBT9.mjs → normalize-C-SHXmra.mjs} +1 -1
  396. package/dist/{normalize-CeglrBT9.mjs.map → normalize-C-SHXmra.mjs.map} +1 -1
  397. package/dist/{oauth-authorization-CXWkIGT4.mjs → oauth-authorization-BWqWTHBK.mjs} +5 -5
  398. package/dist/{oauth-authorization-CXWkIGT4.mjs.map → oauth-authorization-BWqWTHBK.mjs.map} +1 -1
  399. package/dist/{oauth-clients-BmTI5rsl.mjs → oauth-clients-43_XADoa.mjs} +1 -1
  400. package/dist/{oauth-clients-BmTI5rsl.mjs.map → oauth-clients-43_XADoa.mjs.map} +1 -1
  401. package/dist/{oauth-state-store-YLFLcH5F.mjs → oauth-state-store-BRSUEkmx.mjs} +1 -1
  402. package/dist/{oauth-state-store-YLFLcH5F.mjs.map → oauth-state-store-BRSUEkmx.mjs.map} +1 -1
  403. package/dist/{oauth-user-lookup-Bsc_GsX-.mjs → oauth-user-lookup-Ctgemb0k.mjs} +1 -1
  404. package/dist/{oauth-user-lookup-Bsc_GsX-.mjs.map → oauth-user-lookup-Ctgemb0k.mjs.map} +1 -1
  405. package/dist/object-cache/memory.d.mts +1 -1
  406. package/dist/{options-DTTML-Tx.mjs → options-BlmBHTvX.mjs} +1 -1
  407. package/dist/{options-DTTML-Tx.mjs.map → options-BlmBHTvX.mjs.map} +1 -1
  408. package/dist/{options-iMpRRxIe.d.mts → options-COXGTtqd.d.mts} +3 -3
  409. package/dist/{options-iMpRRxIe.d.mts.map → options-COXGTtqd.d.mts.map} +1 -1
  410. package/dist/page/index.d.mts +2 -2
  411. package/dist/{parse-GmjecGct.mjs → parse-GLksnn-B.mjs} +2 -2
  412. package/dist/{parse-GmjecGct.mjs.map → parse-GLksnn-B.mjs.map} +1 -1
  413. package/dist/{passkey-config-De0ahnRg.mjs → passkey-config-CjA1UbDj.mjs} +1 -1
  414. package/dist/{passkey-config-De0ahnRg.mjs.map → passkey-config-CjA1UbDj.mjs.map} +1 -1
  415. package/dist/{patterns-BKmjvM7K.mjs → patterns-CiyXeDgr.mjs} +1 -1
  416. package/dist/{patterns-BKmjvM7K.mjs.map → patterns-CiyXeDgr.mjs.map} +1 -1
  417. package/dist/{placeholder-BSKwzRe4.d.mts → placeholder-DR-eeZr-.d.mts} +1 -1
  418. package/dist/{placeholder-BSKwzRe4.d.mts.map → placeholder-DR-eeZr-.d.mts.map} +1 -1
  419. package/dist/plugin-types.d.mts +1 -1
  420. package/dist/plugin-utils.d.mts +11 -10
  421. package/dist/plugin-utils.d.mts.map +1 -1
  422. package/dist/plugins/adapt-sandbox-entry.d.mts +11 -10
  423. package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
  424. package/dist/plugins/adapt-sandbox-entry.mjs +2 -2
  425. package/dist/{portable-text-cCa0cGV6.mjs → portable-text-BAkgEKcv.mjs} +1 -1
  426. package/dist/{portable-text-cCa0cGV6.mjs.map → portable-text-BAkgEKcv.mjs.map} +1 -1
  427. package/dist/{preview-SSXNVPAC.mjs → preview-Rloa09Wp.mjs} +2 -2
  428. package/dist/{preview-SSXNVPAC.mjs.map → preview-Rloa09Wp.mjs.map} +1 -1
  429. package/dist/{public-url-Danv47cS.mjs → public-url-C0cEvrRu.mjs} +1 -1
  430. package/dist/{public-url-Danv47cS.mjs.map → public-url-C0cEvrRu.mjs.map} +1 -1
  431. package/dist/{schema-CX9cfNkZ.mjs → query-BxT95opY.mjs} +5 -10
  432. package/dist/query-BxT95opY.mjs.map +1 -0
  433. package/dist/{query-1Cp6U9oo.mjs → query-ZzvXyxWq.mjs} +15 -15
  434. package/dist/query-ZzvXyxWq.mjs.map +1 -0
  435. package/dist/{rate-limit-C_Lf63Dd.mjs → rate-limit-Cg4Rvc_-.mjs} +2 -2
  436. package/dist/{rate-limit-C_Lf63Dd.mjs.map → rate-limit-Cg4Rvc_-.mjs.map} +1 -1
  437. package/dist/{redirect-CoW3G-0U.mjs → redirect-Ce_6Yb6z.mjs} +1 -1
  438. package/dist/{redirect-CoW3G-0U.mjs.map → redirect-Ce_6Yb6z.mjs.map} +1 -1
  439. package/dist/{redirect-IyfNirgS.mjs → redirect-Ch3E98qZ.mjs} +4 -4
  440. package/dist/{redirect-IyfNirgS.mjs.map → redirect-Ch3E98qZ.mjs.map} +1 -1
  441. package/dist/{redirects-Bs1g42Ri.mjs → redirects-CXmVGRNZ.mjs} +6 -6
  442. package/dist/{redirects-Bs1g42Ri.mjs.map → redirects-CXmVGRNZ.mjs.map} +1 -1
  443. package/dist/{redirects-DXEXBAII.mjs → redirects-CeD7K7EX.mjs} +43 -5
  444. package/dist/redirects-CeD7K7EX.mjs.map +1 -0
  445. package/dist/{registry-B57vp_X9.mjs → registry-CyIXPi4E.mjs} +8 -8
  446. package/dist/{registry-B57vp_X9.mjs.map → registry-CyIXPi4E.mjs.map} +1 -1
  447. package/dist/relation-Ba68Tm4Z.mjs +334 -0
  448. package/dist/relation-Ba68Tm4Z.mjs.map +1 -0
  449. package/dist/{byline-fields-2Lp5Hbgf.mjs → relations-BmBmX4Eb.mjs} +60 -4
  450. package/dist/relations-BmBmX4Eb.mjs.map +1 -0
  451. package/dist/relations-C8hVyEy0.mjs +397 -0
  452. package/dist/relations-C8hVyEy0.mjs.map +1 -0
  453. package/dist/{byline-fields-CHE8UStY.d.mts → relations-CbBpoOys.d.mts} +182 -29
  454. package/dist/relations-CbBpoOys.d.mts.map +1 -0
  455. package/dist/{request-cache-KCNHp_RJ.mjs → request-cache-BSUptuJR.mjs} +1 -1
  456. package/dist/{request-cache-KCNHp_RJ.mjs.map → request-cache-BSUptuJR.mjs.map} +1 -1
  457. package/dist/{request-meta-DbvXaAvU.mjs → request-meta-DCwktC5P.mjs} +2 -2
  458. package/dist/{request-meta-DbvXaAvU.mjs.map → request-meta-DCwktC5P.mjs.map} +1 -1
  459. package/dist/{resolve-DR3wqMTy.mjs → resolve-Cd9dzclN.mjs} +1 -1
  460. package/dist/{resolve-DR3wqMTy.mjs.map → resolve-Cd9dzclN.mjs.map} +1 -1
  461. package/dist/{runner-DvFWoz8-.d.mts → runner-CiNdIk3y.d.mts} +8 -2
  462. package/dist/runner-CiNdIk3y.d.mts.map +1 -0
  463. package/dist/{runner-K8XK101B.mjs → runner-jt65bF7F.mjs} +24 -7
  464. package/dist/{runner-K8XK101B.mjs.map → runner-jt65bF7F.mjs.map} +1 -1
  465. package/dist/runtime.d.mts +12 -11
  466. package/dist/runtime.d.mts.map +1 -1
  467. package/dist/runtime.mjs +4 -4
  468. package/dist/{scheduled-publish-Drffrf2a.d.mts → scheduled-publish-DlJHGcuL.d.mts} +1 -1
  469. package/dist/scheduled-publish-DlJHGcuL.d.mts.map +1 -0
  470. package/dist/schema-DwjufZ1S.mjs +9 -0
  471. package/dist/schema-DwjufZ1S.mjs.map +1 -0
  472. package/dist/{search-DZN2HZ-V.mjs → search-Cl875CVE.mjs} +62 -12
  473. package/dist/search-Cl875CVE.mjs.map +1 -0
  474. package/dist/{secrets-kp760LlD.mjs → secrets-CO_bEmII.mjs} +4 -4
  475. package/dist/{secrets-kp760LlD.mjs.map → secrets-CO_bEmII.mjs.map} +1 -1
  476. package/dist/{sections-CpF5SaGr.mjs → sections-DTKzgoiS.mjs} +3 -3
  477. package/dist/{sections-CpF5SaGr.mjs.map → sections-DTKzgoiS.mjs.map} +1 -1
  478. package/dist/seed/index.d.mts +2 -2
  479. package/dist/seed/index.mjs +23 -23
  480. package/dist/seo/index.d.mts +4 -2
  481. package/dist/seo/index.d.mts.map +1 -1
  482. package/dist/seo/index.mjs +19 -2
  483. package/dist/seo/index.mjs.map +1 -1
  484. package/dist/{seo-DXu2UQnC.mjs → seo-BLm6SXzS.mjs} +2 -2
  485. package/dist/{seo-DXu2UQnC.mjs.map → seo-BLm6SXzS.mjs.map} +1 -1
  486. package/dist/{seo-89-53DDs.mjs → seo-BjrbXAd_.mjs} +1 -1
  487. package/dist/{seo-89-53DDs.mjs.map → seo-BjrbXAd_.mjs.map} +1 -1
  488. package/dist/{service-DQmiBMzt.mjs → service-D6zDmKXy.mjs} +3 -3
  489. package/dist/{service-DQmiBMzt.mjs.map → service-D6zDmKXy.mjs.map} +1 -1
  490. package/dist/{session-user-Cascbax7.mjs → session-user-DoSs6YM8.mjs} +1 -1
  491. package/dist/{session-user-Cascbax7.mjs.map → session-user-DoSs6YM8.mjs.map} +1 -1
  492. package/dist/{settings-zhmdKyJQ.mjs → settings-BuQYvLfy.mjs} +6 -6
  493. package/dist/{settings-zhmdKyJQ.mjs.map → settings-BuQYvLfy.mjs.map} +1 -1
  494. package/dist/{settings-rZyHEcNT.mjs → settings-CmS3TwXf.mjs} +3 -3
  495. package/dist/{settings-rZyHEcNT.mjs.map → settings-CmS3TwXf.mjs.map} +1 -1
  496. package/dist/{setup-complete-Cb3LRyzy.mjs → setup-complete-BPNgLHlU.mjs} +2 -2
  497. package/dist/{setup-complete-Cb3LRyzy.mjs.map → setup-complete-BPNgLHlU.mjs.map} +1 -1
  498. package/dist/{setup-nonce-Z8x0tHf8.mjs → setup-nonce-DEPZX96T.mjs} +1 -1
  499. package/dist/{setup-nonce-Z8x0tHf8.mjs.map → setup-nonce-DEPZX96T.mjs.map} +1 -1
  500. package/dist/{single-flight-cache-BG3B_GhN.mjs → single-flight-cache-DEtW-OEG.mjs} +2 -2
  501. package/dist/{single-flight-cache-BG3B_GhN.mjs.map → single-flight-cache-DEtW-OEG.mjs.map} +1 -1
  502. package/dist/{site-url-BBfDTgZB.mjs → site-url-CcLy5D5s.mjs} +2 -2
  503. package/dist/{site-url-BBfDTgZB.mjs.map → site-url-CcLy5D5s.mjs.map} +1 -1
  504. package/dist/{slugify-Cce3dTdg.mjs → slugify-C_tqlU4G.mjs} +1 -1
  505. package/dist/{slugify-Cce3dTdg.mjs.map → slugify-C_tqlU4G.mjs.map} +1 -1
  506. package/dist/{ssrf-1g7usGBg.mjs → ssrf-TrKYJAy0.mjs} +1 -1
  507. package/dist/{ssrf-1g7usGBg.mjs.map → ssrf-TrKYJAy0.mjs.map} +1 -1
  508. package/dist/{status-CqJQX1QN.mjs → status-D3Gy1Zc6.mjs} +1 -1
  509. package/dist/{status-CqJQX1QN.mjs.map → status-D3Gy1Zc6.mjs.map} +1 -1
  510. package/dist/storage/local.d.mts +1 -1
  511. package/dist/storage/local.mjs +1 -1
  512. package/dist/storage/s3.d.mts +1 -1
  513. package/dist/storage/s3.mjs +1 -1
  514. package/dist/{taxonomies-Bs13SN-F.mjs → taxonomies-ClS4RKaZ.mjs} +13 -9
  515. package/dist/taxonomies-ClS4RKaZ.mjs.map +1 -0
  516. package/dist/{taxonomies-kH9ABDUF.mjs → taxonomies-pUkuD6nj.mjs} +115 -36
  517. package/dist/taxonomies-pUkuD6nj.mjs.map +1 -0
  518. package/dist/{taxonomy-BxGxZZdu.mjs → taxonomy-BkxbUMSw.mjs} +12 -3
  519. package/dist/{taxonomy-BxGxZZdu.mjs.map → taxonomy-BkxbUMSw.mjs.map} +1 -1
  520. package/dist/{tokens-BGT0TUUo.mjs → tokens-BV6fgl5A.mjs} +2 -2
  521. package/dist/{tokens-BGT0TUUo.mjs.map → tokens-BV6fgl5A.mjs.map} +1 -1
  522. package/dist/{transaction-qfqpPVpu.mjs → transaction-D0FOsb3X.mjs} +1 -1
  523. package/dist/{transaction-qfqpPVpu.mjs.map → transaction-D0FOsb3X.mjs.map} +1 -1
  524. package/dist/{transport-DPefPMcz.mjs → transport-DTFhhPOg.mjs} +1 -1
  525. package/dist/{transport-DPefPMcz.mjs.map → transport-DTFhhPOg.mjs.map} +1 -1
  526. package/dist/{transport-BMDWHSgZ.d.mts → transport-DmlmzD2U.d.mts} +1 -1
  527. package/dist/{transport-BMDWHSgZ.d.mts.map → transport-DmlmzD2U.d.mts.map} +1 -1
  528. package/dist/{trusted-proxy-VTPRiX2s.mjs → trusted-proxy-CSgZVESw.mjs} +1 -1
  529. package/dist/{trusted-proxy-VTPRiX2s.mjs.map → trusted-proxy-CSgZVESw.mjs.map} +1 -1
  530. package/dist/{types-CgvhU-hF.d.mts → types-B6-N9cBB.d.mts} +1 -1
  531. package/dist/{types-CgvhU-hF.d.mts.map → types-B6-N9cBB.d.mts.map} +1 -1
  532. package/dist/{types-g_aFIdW0.d.mts → types-BCVuUPrL.d.mts} +1 -1
  533. package/dist/{types-g_aFIdW0.d.mts.map → types-BCVuUPrL.d.mts.map} +1 -1
  534. package/dist/{types-Jo3UYd6b.mjs → types-BNZsPL9z.mjs} +1 -1
  535. package/dist/{types-Jo3UYd6b.mjs.map → types-BNZsPL9z.mjs.map} +1 -1
  536. package/dist/{types-vgEWF18A.d.mts → types-B_pmP7Yq.d.mts} +1 -1
  537. package/dist/{types-vgEWF18A.d.mts.map → types-B_pmP7Yq.d.mts.map} +1 -1
  538. package/dist/{types-CuW0zWDA.mjs → types-Ch8pFMEm.mjs} +3 -3
  539. package/dist/{types-CuW0zWDA.mjs.map → types-Ch8pFMEm.mjs.map} +1 -1
  540. package/dist/{types-ea9sAPck.d.mts → types-Cm4Cz-8M.d.mts} +1 -1
  541. package/dist/{types-ea9sAPck.d.mts.map → types-Cm4Cz-8M.d.mts.map} +1 -1
  542. package/dist/{types-CGbYowGQ.d.mts → types-CtDVagM4.d.mts} +55 -3
  543. package/dist/types-CtDVagM4.d.mts.map +1 -0
  544. package/dist/{types-BcLUUbbR.d.mts → types-DLIrNtv5.d.mts} +11 -3
  545. package/dist/{types-BcLUUbbR.d.mts.map → types-DLIrNtv5.d.mts.map} +1 -1
  546. package/dist/{types-DmHk7vAt.d.mts → types-QnlQIyPE.d.mts} +1 -1
  547. package/dist/{types-DmHk7vAt.d.mts.map → types-QnlQIyPE.d.mts.map} +1 -1
  548. package/dist/{types-_HFLRzTn.d.mts → types-momGysZk.d.mts} +1 -1
  549. package/dist/{types-_HFLRzTn.d.mts.map → types-momGysZk.d.mts.map} +1 -1
  550. package/dist/{types-tM44hEcf.mjs → types-o7xo7VgH.mjs} +1 -1
  551. package/dist/{types-tM44hEcf.mjs.map → types-o7xo7VgH.mjs.map} +1 -1
  552. package/dist/{types-ClUkdbWb.d.mts → types-qljd1hsL.d.mts} +1 -1
  553. package/dist/{types-ClUkdbWb.d.mts.map → types-qljd1hsL.d.mts.map} +1 -1
  554. package/dist/{user-BjAOvU3Z.mjs → user-DTxX_Fha.mjs} +3 -3
  555. package/dist/{user-BjAOvU3Z.mjs.map → user-DTxX_Fha.mjs.map} +1 -1
  556. package/dist/{utils-BJXElxdw.mjs → utils-Cz8PVrl4.mjs} +3 -3
  557. package/dist/{utils-BJXElxdw.mjs.map → utils-Cz8PVrl4.mjs.map} +1 -1
  558. package/dist/{validate-Z1b86_3B.d.mts → validate-9jLuE301.d.mts} +5 -5
  559. package/dist/{validate-Z1b86_3B.d.mts.map → validate-9jLuE301.d.mts.map} +1 -1
  560. package/dist/{validate-CWSnKVIJ.mjs → validate-C3CpWlNt.mjs} +3 -3
  561. package/dist/{validate-CWSnKVIJ.mjs.map → validate-C3CpWlNt.mjs.map} +1 -1
  562. package/dist/{validation-0l8-RYj4.mjs → validation-DM2K_NJC.mjs} +10 -10
  563. package/dist/{validation-0l8-RYj4.mjs.map → validation-DM2K_NJC.mjs.map} +1 -1
  564. package/dist/version-BlIJvNAZ.mjs +7 -0
  565. package/dist/{version-qmeO1XZY.mjs.map → version-BlIJvNAZ.mjs.map} +1 -1
  566. package/dist/{widgets-hWcIicX8.mjs → widgets-B_X6_UXJ.mjs} +4 -4
  567. package/dist/{widgets-hWcIicX8.mjs.map → widgets-B_X6_UXJ.mjs.map} +1 -1
  568. package/dist/{wxr-taxonomies-CNFcsNCr.mjs → wxr-taxonomies-oNJB2S81.mjs} +4 -4
  569. package/dist/{wxr-taxonomies-CNFcsNCr.mjs.map → wxr-taxonomies-oNJB2S81.mjs.map} +1 -1
  570. package/dist/{wxr-taxonomies-0_uxSrmf.d.mts → wxr-taxonomies-tADW4KTa.d.mts} +1 -1
  571. package/dist/{wxr-taxonomies-0_uxSrmf.d.mts.map → wxr-taxonomies-tADW4KTa.d.mts.map} +1 -1
  572. package/dist/{zod-generator-CacrR-i8.mjs → zod-generator-CrfV79De.mjs} +3 -3
  573. package/dist/{zod-generator-CacrR-i8.mjs.map → zod-generator-CrfV79De.mjs.map} +1 -1
  574. package/package.json +11 -7
  575. package/src/api/errors.ts +11 -0
  576. package/src/api/handlers/content.ts +111 -1
  577. package/src/api/handlers/dashboard.ts +2 -0
  578. package/src/api/handlers/index.ts +6 -0
  579. package/src/api/handlers/media-usage.ts +80 -0
  580. package/src/api/handlers/relations.ts +474 -0
  581. package/src/api/handlers/taxonomies.ts +26 -4
  582. package/src/api/handlers/validate-media-fields.ts +1 -1
  583. package/src/api/openapi/document.ts +25 -0
  584. package/src/api/parse.ts +1 -1
  585. package/src/api/schemas/comments.ts +6 -0
  586. package/src/api/schemas/content.ts +8 -0
  587. package/src/api/schemas/index.ts +2 -0
  588. package/src/api/schemas/media-usage.ts +48 -0
  589. package/src/api/schemas/relations.ts +109 -0
  590. package/src/api/schemas/search.ts +1 -0
  591. package/src/astro/integration/index.ts +1 -0
  592. package/src/astro/integration/routes.ts +5 -0
  593. package/src/astro/integration/runtime.ts +24 -0
  594. package/src/astro/middleware/request-context.ts +162 -20
  595. package/src/astro/middleware.ts +22 -9
  596. package/src/astro/routes/api/admin/comments/[id]/status.ts +1 -2
  597. package/src/astro/routes/api/admin/comments/index.ts +1 -2
  598. package/src/astro/routes/api/admin/media-usage/repair.ts +24 -0
  599. package/src/astro/routes/api/auth/oauth/[provider]/callback.ts +1 -2
  600. package/src/astro/routes/api/auth/oauth/[provider].ts +1 -2
  601. package/src/astro/routes/api/comments/[collection]/[contentId]/index.ts +13 -0
  602. package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/children.ts +97 -0
  603. package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/parents.ts +48 -0
  604. package/src/astro/routes/api/relations/[id]/index.ts +84 -0
  605. package/src/astro/routes/api/relations/[id]/translations.ts +33 -0
  606. package/src/astro/routes/api/relations/index.ts +56 -0
  607. package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +1 -7
  608. package/src/astro/routes/api/schema/collections/[slug]/fields/index.ts +1 -2
  609. package/src/astro/routes/api/search/index.ts +2 -0
  610. package/src/astro/types.ts +2 -0
  611. package/src/cli/commands/export-seed.ts +1 -10
  612. package/src/client/index.ts +39 -0
  613. package/src/comments/service.ts +1 -1
  614. package/src/comments/turnstile.ts +64 -0
  615. package/src/components/BlockquoteGroup.astro +34 -0
  616. package/src/components/CommentForm.astro +12 -5
  617. package/src/components/EmDashHead.astro +27 -1
  618. package/src/components/InlinePortableTextEditor.tsx +34 -0
  619. package/src/components/PortableText.astro +7 -1
  620. package/src/components/index.ts +2 -0
  621. package/src/components/portable-text-blockquote-group.ts +68 -0
  622. package/src/content/converters/portable-text-to-prosemirror.ts +32 -1
  623. package/src/database/dialect-helpers.ts +34 -0
  624. package/src/database/migrations/039_fix_fts5_triggers.ts +1 -1
  625. package/src/database/migrations/runner.ts +46 -6
  626. package/src/database/pg-migration-lock.ts +72 -0
  627. package/src/database/repositories/comment.ts +1 -1
  628. package/src/database/repositories/content.ts +172 -21
  629. package/src/database/repositories/media.ts +1 -1
  630. package/src/database/repositories/relation.ts +130 -5
  631. package/src/database/repositories/taxonomy.ts +9 -0
  632. package/src/database/repositories/types.ts +8 -0
  633. package/src/db/postgres.ts +5 -2
  634. package/src/emdash-runtime.ts +72 -4
  635. package/src/index.ts +6 -2
  636. package/src/loader.ts +1 -31
  637. package/src/mcp/server.ts +29 -3
  638. package/src/plugins/context.ts +85 -0
  639. package/src/plugins/define-plugin.ts +1 -0
  640. package/src/plugins/index.ts +4 -0
  641. package/src/plugins/manifest-schema.ts +2 -0
  642. package/src/plugins/types.ts +59 -0
  643. package/src/schema/byline-registry.ts +1 -1
  644. package/src/search/fts-manager.ts +34 -0
  645. package/src/search/match.ts +50 -0
  646. package/src/search/query.ts +94 -9
  647. package/src/seo/hreflang.ts +192 -0
  648. package/src/seo/index.ts +3 -0
  649. package/src/taxonomies/index.ts +62 -45
  650. package/src/taxonomies/term-counts.ts +117 -0
  651. package/src/virtual-modules.d.ts +1 -0
  652. package/src/visual-editing/editable.ts +41 -35
  653. package/src/visual-editing/toolbar-bootstrap.ts +120 -0
  654. package/src/visual-editing/toolbar.ts +46 -0
  655. package/dist/api-DxFSorgk.mjs.map +0 -1
  656. package/dist/byline-fields-2Lp5Hbgf.mjs.map +0 -1
  657. package/dist/byline-fields-CHE8UStY.d.mts.map +0 -1
  658. package/dist/content-DhgEth4k.mjs.map +0 -1
  659. package/dist/context-BRIpHARC.mjs.map +0 -1
  660. package/dist/dashboard-EvEKF5en.mjs.map +0 -1
  661. package/dist/dialect-helpers-DRI5pyY3.mjs.map +0 -1
  662. package/dist/error-CkAseSqZ.mjs.map +0 -1
  663. package/dist/index-B9sIxwe4.d.mts.map +0 -1
  664. package/dist/loader-CB6YHeul.mjs.map +0 -1
  665. package/dist/manifest-schema-BHlgZM1W.mjs.map +0 -1
  666. package/dist/media-BrXIaMFN.mjs.map +0 -1
  667. package/dist/menus-b2T4clbO.mjs.map +0 -1
  668. package/dist/query-1Cp6U9oo.mjs.map +0 -1
  669. package/dist/redirects-DXEXBAII.mjs.map +0 -1
  670. package/dist/runner-DvFWoz8-.d.mts.map +0 -1
  671. package/dist/scheduled-publish-Drffrf2a.d.mts.map +0 -1
  672. package/dist/schema-CX9cfNkZ.mjs.map +0 -1
  673. package/dist/search-DZN2HZ-V.mjs.map +0 -1
  674. package/dist/taxonomies-Bs13SN-F.mjs.map +0 -1
  675. package/dist/taxonomies-kH9ABDUF.mjs.map +0 -1
  676. package/dist/types-CGbYowGQ.d.mts.map +0 -1
  677. package/dist/version-qmeO1XZY.mjs +0 -7
  678. /package/dist/{api-tokens-DsvvCtdh.mjs → api-tokens-Dk2GrJMY.mjs} +0 -0
  679. /package/dist/{ssrf-CmuGgCq3.mjs → ssrf-B5DOv5E5.mjs} +0 -0
  680. /package/dist/{types-DROWRxYV.mjs → types-DeCZBZxn.mjs} +0 -0
@@ -93,6 +93,7 @@ declare const contentCreateBody: z.ZodObject<{
93
93
  canonical: z.ZodOptional<z.ZodNullable<z.ZodString>>;
94
94
  noIndex: z.ZodOptional<z.ZodBoolean>;
95
95
  }, z.core.$strip>>;
96
+ taxonomies: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
96
97
  publishedAt: z.ZodOptional<z.ZodNullable<z.ZodISODateTime>>;
97
98
  createdAt: z.ZodOptional<z.ZodNullable<z.ZodISODateTime>>;
98
99
  }, z.core.$strip>;
@@ -116,6 +117,7 @@ declare const contentUpdateBody: z.ZodObject<{
116
117
  canonical: z.ZodOptional<z.ZodNullable<z.ZodString>>;
117
118
  noIndex: z.ZodOptional<z.ZodBoolean>;
118
119
  }, z.core.$strip>>;
120
+ taxonomies: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
119
121
  publishedAt: z.ZodOptional<z.ZodNullable<z.ZodISODateTime>>;
120
122
  }, z.core.$strip>;
121
123
  declare const contentScheduleBody: z.ZodObject<{
@@ -578,6 +580,66 @@ declare const mediaConfirmResponseSchema: z.ZodObject<{
578
580
  }, z.core.$strip>;
579
581
  }, z.core.$strip>;
580
582
  //#endregion
583
+ //#region src/api/schemas/media-usage.d.ts
584
+ declare const mediaUsageRepairStatusSchema: z.ZodEnum<{
585
+ failed: "failed";
586
+ complete: "complete";
587
+ partial: "partial";
588
+ stale: "stale";
589
+ }>;
590
+ declare const mediaUsageRepairBody: z.ZodDiscriminatedUnion<[z.ZodObject<{
591
+ scope: z.ZodLiteral<"collection">;
592
+ collection: z.ZodString;
593
+ }, z.core.$strict>, z.ZodObject<{
594
+ scope: z.ZodLiteral<"all">;
595
+ }, z.core.$strict>], "scope">;
596
+ declare const mediaUsageRepairCollectionSummarySchema: z.ZodObject<{
597
+ collection: z.ZodString;
598
+ status: z.ZodEnum<{
599
+ failed: "failed";
600
+ complete: "complete";
601
+ partial: "partial";
602
+ stale: "stale";
603
+ }>;
604
+ indexedSourceCount: z.ZodNumber;
605
+ failedSourceCount: z.ZodNumber;
606
+ skippedSourceCount: z.ZodNumber;
607
+ deletedSourceCount: z.ZodNumber;
608
+ lastErrorCode: z.ZodNullable<z.ZodString>;
609
+ startedAt: z.ZodString;
610
+ completedAt: z.ZodNullable<z.ZodString>;
611
+ }, z.core.$strip>;
612
+ declare const mediaUsageRepairResponseSchema: z.ZodObject<{
613
+ status: z.ZodEnum<{
614
+ failed: "failed";
615
+ complete: "complete";
616
+ partial: "partial";
617
+ stale: "stale";
618
+ }>;
619
+ indexedSourceCount: z.ZodNumber;
620
+ failedSourceCount: z.ZodNumber;
621
+ skippedSourceCount: z.ZodNumber;
622
+ deletedSourceCount: z.ZodNumber;
623
+ collections: z.ZodArray<z.ZodObject<{
624
+ collection: z.ZodString;
625
+ status: z.ZodEnum<{
626
+ failed: "failed";
627
+ complete: "complete";
628
+ partial: "partial";
629
+ stale: "stale";
630
+ }>;
631
+ indexedSourceCount: z.ZodNumber;
632
+ failedSourceCount: z.ZodNumber;
633
+ skippedSourceCount: z.ZodNumber;
634
+ deletedSourceCount: z.ZodNumber;
635
+ lastErrorCode: z.ZodNullable<z.ZodString>;
636
+ startedAt: z.ZodString;
637
+ completedAt: z.ZodNullable<z.ZodString>;
638
+ }, z.core.$strip>>;
639
+ }, z.core.$strip>;
640
+ type MediaUsageRepairRequest = z.infer<typeof mediaUsageRepairBody>;
641
+ type MediaUsageRepairResponse = z.infer<typeof mediaUsageRepairResponseSchema>;
642
+ //#endregion
581
643
  //#region src/api/schemas/schema.d.ts
582
644
  declare const createCollectionBody: z.ZodObject<{
583
645
  slug: z.ZodString;
@@ -626,14 +688,14 @@ declare const createFieldBody: z.ZodObject<{
626
688
  string: "string";
627
689
  number: "number";
628
690
  boolean: "boolean";
691
+ file: "file";
629
692
  slug: "slug";
630
- text: "text";
631
693
  url: "url";
632
- select: "select";
633
- file: "file";
634
694
  image: "image";
635
695
  datetime: "datetime";
696
+ text: "text";
636
697
  integer: "integer";
698
+ select: "select";
637
699
  multiSelect: "multiSelect";
638
700
  portableText: "portableText";
639
701
  reference: "reference";
@@ -657,12 +719,12 @@ declare const createFieldBody: z.ZodObject<{
657
719
  string: "string";
658
720
  number: "number";
659
721
  boolean: "boolean";
660
- text: "text";
661
722
  url: "url";
662
- select: "select";
663
723
  image: "image";
664
724
  datetime: "datetime";
725
+ text: "text";
665
726
  integer: "integer";
727
+ select: "select";
666
728
  }>;
667
729
  label: z.ZodString;
668
730
  required: z.ZodOptional<z.ZodBoolean>;
@@ -684,14 +746,14 @@ declare const updateFieldBody: z.ZodObject<{
684
746
  string: "string";
685
747
  number: "number";
686
748
  boolean: "boolean";
749
+ file: "file";
687
750
  slug: "slug";
688
- text: "text";
689
751
  url: "url";
690
- select: "select";
691
- file: "file";
692
752
  image: "image";
693
753
  datetime: "datetime";
754
+ text: "text";
694
755
  integer: "integer";
756
+ select: "select";
695
757
  multiSelect: "multiSelect";
696
758
  portableText: "portableText";
697
759
  reference: "reference";
@@ -715,12 +777,12 @@ declare const updateFieldBody: z.ZodObject<{
715
777
  string: "string";
716
778
  number: "number";
717
779
  boolean: "boolean";
718
- text: "text";
719
780
  url: "url";
720
- select: "select";
721
781
  image: "image";
722
782
  datetime: "datetime";
783
+ text: "text";
723
784
  integer: "integer";
785
+ select: "select";
724
786
  }>;
725
787
  label: z.ZodString;
726
788
  required: z.ZodOptional<z.ZodBoolean>;
@@ -773,14 +835,14 @@ declare const fieldSchema: z.ZodObject<{
773
835
  string: "string";
774
836
  number: "number";
775
837
  boolean: "boolean";
838
+ file: "file";
776
839
  slug: "slug";
777
- text: "text";
778
840
  url: "url";
779
- select: "select";
780
- file: "file";
781
841
  image: "image";
782
842
  datetime: "datetime";
843
+ text: "text";
783
844
  integer: "integer";
845
+ select: "select";
784
846
  multiSelect: "multiSelect";
785
847
  portableText: "portableText";
786
848
  reference: "reference";
@@ -838,14 +900,14 @@ declare const collectionWithFieldsResponseSchema: z.ZodObject<{
838
900
  string: "string";
839
901
  number: "number";
840
902
  boolean: "boolean";
903
+ file: "file";
841
904
  slug: "slug";
842
- text: "text";
843
905
  url: "url";
844
- select: "select";
845
- file: "file";
846
906
  image: "image";
847
907
  datetime: "datetime";
908
+ text: "text";
848
909
  integer: "integer";
910
+ select: "select";
849
911
  multiSelect: "multiSelect";
850
912
  portableText: "portableText";
851
913
  reference: "reference";
@@ -892,14 +954,14 @@ declare const fieldResponseSchema: z.ZodObject<{
892
954
  string: "string";
893
955
  number: "number";
894
956
  boolean: "boolean";
957
+ file: "file";
895
958
  slug: "slug";
896
- text: "text";
897
959
  url: "url";
898
- select: "select";
899
- file: "file";
900
960
  image: "image";
901
961
  datetime: "datetime";
962
+ text: "text";
902
963
  integer: "integer";
964
+ select: "select";
903
965
  multiSelect: "multiSelect";
904
966
  portableText: "portableText";
905
967
  reference: "reference";
@@ -929,14 +991,14 @@ declare const fieldListResponseSchema: z.ZodObject<{
929
991
  string: "string";
930
992
  number: "number";
931
993
  boolean: "boolean";
994
+ file: "file";
932
995
  slug: "slug";
933
- text: "text";
934
996
  url: "url";
935
- select: "select";
936
- file: "file";
937
997
  image: "image";
938
998
  datetime: "datetime";
999
+ text: "text";
939
1000
  integer: "integer";
1001
+ select: "select";
940
1002
  multiSelect: "multiSelect";
941
1003
  portableText: "portableText";
942
1004
  reference: "reference";
@@ -976,6 +1038,7 @@ declare const createCommentBody: z.ZodObject<{
976
1038
  body: z.ZodString;
977
1039
  parentId: z.ZodOptional<z.ZodString>;
978
1040
  website_url: z.ZodOptional<z.ZodString>;
1041
+ turnstileToken: z.ZodOptional<z.ZodString>;
979
1042
  }, z.core.$strip>;
980
1043
  declare const createReactionBody: z.ZodObject<{
981
1044
  commentId: z.ZodString;
@@ -1212,8 +1275,8 @@ declare const authMeActionBody: z.ZodObject<{
1212
1275
  * from `referenceCollection` + `referenceId` (a translation_group id).
1213
1276
  */
1214
1277
  declare const menuItemTypeEnum: z.ZodEnum<{
1215
- custom: "custom";
1216
1278
  collection: "collection";
1279
+ custom: "custom";
1217
1280
  page: "page";
1218
1281
  post: "post";
1219
1282
  taxonomy: "taxonomy";
@@ -1229,8 +1292,8 @@ declare const updateMenuBody: z.ZodObject<{
1229
1292
  }, z.core.$strict>;
1230
1293
  declare const createMenuItemBody: z.ZodObject<{
1231
1294
  type: z.ZodEnum<{
1232
- custom: "custom";
1233
1295
  collection: "collection";
1296
+ custom: "custom";
1234
1297
  page: "page";
1235
1298
  post: "post";
1236
1299
  taxonomy: "taxonomy";
@@ -1594,6 +1657,7 @@ declare const searchQuery: z.ZodObject<{
1594
1657
  status: z.ZodOptional<z.ZodString>;
1595
1658
  locale: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
1596
1659
  limit: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
1660
+ cursor: z.ZodOptional<z.ZodString>;
1597
1661
  }, z.core.$strip>;
1598
1662
  declare const searchSuggestQuery: z.ZodObject<{
1599
1663
  q: z.ZodString;
@@ -2139,8 +2203,8 @@ declare const bylineFieldCreateBody: z.ZodObject<{
2139
2203
  type: z.ZodEnum<{
2140
2204
  string: "string";
2141
2205
  boolean: "boolean";
2142
- text: "text";
2143
2206
  url: "url";
2207
+ text: "text";
2144
2208
  select: "select";
2145
2209
  }>;
2146
2210
  required: z.ZodOptional<z.ZodBoolean>;
@@ -2175,8 +2239,8 @@ declare const bylineFieldDefinitionSchema: z.ZodObject<{
2175
2239
  type: z.ZodEnum<{
2176
2240
  string: "string";
2177
2241
  boolean: "boolean";
2178
- text: "text";
2179
2242
  url: "url";
2243
+ text: "text";
2180
2244
  select: "select";
2181
2245
  }>;
2182
2246
  required: z.ZodBoolean;
@@ -2196,8 +2260,8 @@ declare const bylineFieldListResponseSchema: z.ZodObject<{
2196
2260
  type: z.ZodEnum<{
2197
2261
  string: "string";
2198
2262
  boolean: "boolean";
2199
- text: "text";
2200
2263
  url: "url";
2264
+ text: "text";
2201
2265
  select: "select";
2202
2266
  }>;
2203
2267
  required: z.ZodBoolean;
@@ -2226,5 +2290,94 @@ declare const bylineFieldUsageResponseSchema: z.ZodObject<{
2226
2290
  totalAffectedRows: z.ZodNumber;
2227
2291
  }, z.core.$strip>;
2228
2292
  //#endregion
2229
- export { wpRewriteUrlsBody as $, trashedContentItemSchema as $n, commentSchema as $t, reorderWidgetsBody as A, mediaProviderListQuery as An, menuSchema as At, userSchema as B, contentListQuery as Bn, magicLinkSendBody as Bt, notFoundSummarySchema as C, formatFileSize as Cn, termWithCountSchema as Ct, updateRedirectBody as D, mediaItemSchema as Dn, menuItemSchema as Dt, redirectsListQuery as E, mediaExistingResponseSchema as En, createMenuItemBody as Et, widgetSchema as F, contentAuthorSchema as Fn, updateMenuItemBody as Ft, setupAdminVerifyBody as G, contentScheduleBody as Gn, passkeyVerifyBody as Gt, usersListQuery as H, contentPreviewUrlBody as Hn, passkeyRegisterOptionsBody as Ht, allowedDomainCreateBody as I, contentAuthorsResponseSchema as In, authMeActionBody as It, importProbeBody as J, contentTermsBody as Jn, adminCommentListResponseSchema as Jt, setupAtprotoAdminBody as K, contentSeoInput as Kn, signupCompleteBody as Kt, allowedDomainUpdateBody as L, contentCompareResponseSchema as Ln, inviteCompleteBody as Lt, widgetAreaSchema as M, mediaUpdateBody as Mn, menuWithItemsSchema as Mt, widgetAreaWithWidgetsAndCountSchema as N, mediaUploadUrlBody as Nn, reorderMenuItemsBody as Nt, createWidgetAreaBody as O, mediaListQuery as On, menuItemTypeEnum as Ot, widgetAreaWithWidgetsSchema as P, mediaUploadUrlResponseSchema as Pn, updateMenuBody as Pt, wpPrepareBody as Q, contentUpdateBody as Qn, commentListQuery as Qt, userDetailSchema as R, contentCreateBody as Rn, inviteCreateBody as Rt, notFoundSummaryResponseSchema as S, DEFAULT_MAX_UPLOAD_SIZE as Sn, termTranslationsSchema as St, redirectSchema as T, mediaConfirmResponseSchema as Tn, createMenuBody as Tt, atprotoLoginBody as U, contentPublishBody as Un, passkeyRegisterVerifyBody as Ut, userUpdateBody as V, contentListResponseSchema as Vn, passkeyOptionsBody as Vt, setupAdminBody as W, contentResponseSchema as Wn, passkeyRenameBody as Wt, wpPluginAnalyzeBody as X, contentTranslationsResponseSchema as Xn, commentBulkResponseSchema as Xt, wpMediaImportBody as Y, contentTranslationSchema as Yn, commentBulkBody as Yt, wpPluginExecuteBody as Z, contentTrashQuery as Zn, commentCountsResponseSchema as Zt, notFoundEntrySchema as _, orphanedTableListResponseSchema as _n, taxonomyListResponseSchema as _t, bylineFieldUpdateBody as a, collectionGetQuery as an, deleteResponseSchema as ar, searchSuggestQuery as at, notFoundPruneBody as b, updateCollectionBody as bn, termResponseSchema as bt, bylineCreditSchema as c, collectionSchema as cn, localeFilterQuery as cr, createSectionBody as ct, bylineTranslationCreateBody as d, createFieldBody as dn, slugPattern as dr, sectionsListQuery as dt, commentStatusBody as en, trashedContentListResponseSchema as er, searchEnableBody as et, bylineTranslationsResponseSchema as f, fieldListResponseSchema as fn, successEnvelope as fr, updateSectionBody as ft, createRedirectBody as g, orphanRegisterBody as gn, taxonomyDefTranslationsSchema as gt, contentBylineInputSchema as h, fieldSchema as hn, taxonomyDefSchema as ht, bylineFieldReorderBody as i, publicCommentSchema as in, cursorPaginationQuery as ir, searchResultSchema as it, updateWidgetBody as j, mediaResponseSchema as jn, menuTranslationsSchema as jt, createWidgetBody as k, mediaListResponseSchema as kn, menuListItemSchema as kt, bylineListResponseSchema as l, collectionWithFieldsResponseSchema as ln, offsetPaginationQuery as lr, sectionListResponseSchema as lt, bylinesListQuery as m, fieldResponseSchema as mn, createTermBody as mt, bylineFieldDefinitionSchema as n, createReactionBody as nn, apiErrorSchema as nr, searchRebuildBody as nt, bylineFieldUsageResponseSchema as o, collectionListResponseSchema as on, httpUrl as or, settingsUpdateBody as ot, bylineUpdateBody as p, fieldReorderBody as pn, createTaxonomyDefBody as pt, setupBody as q, contentSeoSchema as qn, signupRequestBody as qt, bylineFieldListResponseSchema as r, publicCommentListResponseSchema as rn, countResponseSchema as rr, searchResponseSchema as rt, bylineCreateBody as s, collectionResponseSchema as sn, localeCode as sr, siteSettingsSchema as st, bylineFieldCreateBody as t, createCommentBody as tn, VALID_ROLE_LEVELS as tr, searchQuery as tt, bylineSummarySchema as u, createCollectionBody as un, roleLevel as ur, sectionSchema as ut, notFoundListQuery as v, orphanedTableSchema as vn, termGetResponseSchema as vt, redirectListResponseSchema as w, mediaConfirmBody as wn, updateTermBody as wt, notFoundSummaryQuery as x, updateFieldBody as xn, termSchema as xt, notFoundListResponseSchema as y, schemaExportQuery as yn, termListResponseSchema as yt, userListResponseSchema as z, contentItemSchema as zn, inviteRegisterOptionsBody as zt };
2230
- //# sourceMappingURL=byline-fields-CHE8UStY.d.mts.map
2293
+ //#region src/api/schemas/relations.d.ts
2294
+ declare const createRelationBody: z.ZodObject<{
2295
+ name: z.ZodString;
2296
+ parentCollection: z.ZodOptional<z.ZodString>;
2297
+ childCollection: z.ZodOptional<z.ZodString>;
2298
+ parentLabel: z.ZodString;
2299
+ childLabel: z.ZodString;
2300
+ locale: z.ZodOptional<z.ZodString>;
2301
+ translationOf: z.ZodOptional<z.ZodString>;
2302
+ }, z.core.$strip>;
2303
+ declare const updateRelationBody: z.ZodObject<{
2304
+ parentLabel: z.ZodOptional<z.ZodString>;
2305
+ childLabel: z.ZodOptional<z.ZodString>;
2306
+ }, z.core.$strip>;
2307
+ declare const setReferenceChildrenBody: z.ZodObject<{
2308
+ childIds: z.ZodArray<z.ZodString>;
2309
+ }, z.core.$strip>;
2310
+ declare const relationDefSchema: z.ZodObject<{
2311
+ id: z.ZodString;
2312
+ name: z.ZodString;
2313
+ parentCollection: z.ZodString;
2314
+ childCollection: z.ZodString;
2315
+ parentLabel: z.ZodString;
2316
+ childLabel: z.ZodString;
2317
+ locale: z.ZodString;
2318
+ translationGroup: z.ZodString;
2319
+ }, z.core.$strip>;
2320
+ declare const relationListResponseSchema: z.ZodObject<{
2321
+ relations: z.ZodArray<z.ZodObject<{
2322
+ id: z.ZodString;
2323
+ name: z.ZodString;
2324
+ parentCollection: z.ZodString;
2325
+ childCollection: z.ZodString;
2326
+ parentLabel: z.ZodString;
2327
+ childLabel: z.ZodString;
2328
+ locale: z.ZodString;
2329
+ translationGroup: z.ZodString;
2330
+ }, z.core.$strip>>;
2331
+ }, z.core.$strip>;
2332
+ declare const relationResponseSchema: z.ZodObject<{
2333
+ relation: z.ZodObject<{
2334
+ id: z.ZodString;
2335
+ name: z.ZodString;
2336
+ parentCollection: z.ZodString;
2337
+ childCollection: z.ZodString;
2338
+ parentLabel: z.ZodString;
2339
+ childLabel: z.ZodString;
2340
+ locale: z.ZodString;
2341
+ translationGroup: z.ZodString;
2342
+ }, z.core.$strip>;
2343
+ }, z.core.$strip>;
2344
+ declare const relationTranslationsSchema: z.ZodObject<{
2345
+ translationGroup: z.ZodString;
2346
+ translations: z.ZodArray<z.ZodObject<{
2347
+ id: z.ZodString;
2348
+ name: z.ZodString;
2349
+ locale: z.ZodString;
2350
+ parentLabel: z.ZodString;
2351
+ childLabel: z.ZodString;
2352
+ }, z.core.$strip>>;
2353
+ }, z.core.$strip>;
2354
+ declare const entryRefSchema: z.ZodObject<{
2355
+ id: z.ZodString;
2356
+ slug: z.ZodNullable<z.ZodString>;
2357
+ collection: z.ZodString;
2358
+ locale: z.ZodNullable<z.ZodString>;
2359
+ sortOrder: z.ZodOptional<z.ZodNumber>;
2360
+ }, z.core.$strip>;
2361
+ declare const referenceChildrenResponseSchema: z.ZodObject<{
2362
+ children: z.ZodArray<z.ZodObject<{
2363
+ id: z.ZodString;
2364
+ slug: z.ZodNullable<z.ZodString>;
2365
+ collection: z.ZodString;
2366
+ locale: z.ZodNullable<z.ZodString>;
2367
+ sortOrder: z.ZodOptional<z.ZodNumber>;
2368
+ }, z.core.$strip>>;
2369
+ nextCursor: z.ZodOptional<z.ZodString>;
2370
+ }, z.core.$strip>;
2371
+ declare const referenceParentsResponseSchema: z.ZodObject<{
2372
+ parents: z.ZodArray<z.ZodObject<{
2373
+ id: z.ZodString;
2374
+ slug: z.ZodNullable<z.ZodString>;
2375
+ collection: z.ZodString;
2376
+ locale: z.ZodNullable<z.ZodString>;
2377
+ sortOrder: z.ZodOptional<z.ZodNumber>;
2378
+ }, z.core.$strip>>;
2379
+ nextCursor: z.ZodOptional<z.ZodString>;
2380
+ }, z.core.$strip>;
2381
+ //#endregion
2382
+ export { atprotoLoginBody as $, contentCompareResponseSchema as $n, passkeyRegisterVerifyBody as $t, notFoundPruneBody as A, updateCollectionBody as An, termResponseSchema as At, reorderWidgetsBody as B, mediaConfirmBody as Bn, menuSchema as Bt, bylineUpdateBody as C, fieldReorderBody as Cn, localeCode as Cr, createTaxonomyDefBody as Ct, notFoundEntrySchema as D, orphanedTableListResponseSchema as Dn, slugPattern as Dr, taxonomyListResponseSchema as Dt, createRedirectBody as E, orphanRegisterBody as En, roleLevel as Er, taxonomyDefTranslationsSchema as Et, redirectSchema as F, mediaUsageRepairCollectionSummarySchema as Fn, createMenuBody as Ft, widgetSchema as G, mediaListResponseSchema as Gn, updateMenuItemBody as Gt, widgetAreaSchema as H, mediaExistingResponseSchema as Hn, menuWithItemsSchema as Ht, redirectsListQuery as I, mediaUsageRepairResponseSchema as In, createMenuItemBody as It, userDetailSchema as J, mediaUpdateBody as Jn, inviteCreateBody as Jt, allowedDomainCreateBody as K, mediaProviderListQuery as Kn, authMeActionBody as Kt, updateRedirectBody as L, mediaUsageRepairStatusSchema as Ln, menuItemSchema as Lt, notFoundSummaryResponseSchema as M, MediaUsageRepairRequest as Mn, termTranslationsSchema as Mt, notFoundSummarySchema as N, MediaUsageRepairResponse as Nn, termWithCountSchema as Nt, notFoundListQuery as O, orphanedTableSchema as On, successEnvelope as Or, termGetResponseSchema as Ot, redirectListResponseSchema as P, mediaUsageRepairBody as Pn, updateTermBody as Pt, usersListQuery as Q, contentAuthorsResponseSchema as Qn, passkeyRegisterOptionsBody as Qt, createWidgetAreaBody as R, DEFAULT_MAX_UPLOAD_SIZE as Rn, menuItemTypeEnum as Rt, bylineTranslationsResponseSchema as S, fieldListResponseSchema as Sn, httpUrl as Sr, updateSectionBody as St, contentBylineInputSchema as T, fieldSchema as Tn, offsetPaginationQuery as Tr, taxonomyDefSchema as Tt, widgetAreaWithWidgetsAndCountSchema as U, mediaItemSchema as Un, reorderMenuItemsBody as Ut, updateWidgetBody as V, mediaConfirmResponseSchema as Vn, menuTranslationsSchema as Vt, widgetAreaWithWidgetsSchema as W, mediaListQuery as Wn, updateMenuBody as Wt, userSchema as X, mediaUploadUrlResponseSchema as Xn, magicLinkSendBody as Xt, userListResponseSchema as Y, mediaUploadUrlBody as Yn, inviteRegisterOptionsBody as Yt, userUpdateBody as Z, contentAuthorSchema as Zn, passkeyOptionsBody as Zt, bylineCreateBody as _, collectionResponseSchema as _n, VALID_ROLE_LEVELS as _r, siteSettingsSchema as _t, relationDefSchema as a, commentBulkBody as an, contentPublishBody as ar, wpMediaImportBody as at, bylineSummarySchema as b, createCollectionBody as bn, cursorPaginationQuery as br, sectionSchema as bt, relationTranslationsSchema as c, commentListQuery as cn, contentSeoInput as cr, wpPrepareBody as ct, bylineFieldCreateBody as d, createCommentBody as dn, contentTranslationSchema as dr, searchQuery as dt, passkeyRenameBody as en, contentCreateBody as er, setupAdminBody as et, bylineFieldDefinitionSchema as f, createReactionBody as fn, contentTranslationsResponseSchema as fr, searchRebuildBody as ft, bylineFieldUsageResponseSchema as g, collectionListResponseSchema as gn, trashedContentListResponseSchema as gr, settingsUpdateBody as gt, bylineFieldUpdateBody as h, collectionGetQuery as hn, trashedContentItemSchema as hr, searchSuggestQuery as ht, referenceParentsResponseSchema as i, adminCommentListResponseSchema as in, contentPreviewUrlBody as ir, importProbeBody as it, notFoundSummaryQuery as j, updateFieldBody as jn, termSchema as jt, notFoundListResponseSchema as k, schemaExportQuery as kn, termListResponseSchema as kt, setReferenceChildrenBody as l, commentSchema as ln, contentSeoSchema as lr, wpRewriteUrlsBody as lt, bylineFieldReorderBody as m, publicCommentSchema as mn, contentUpdateBody as mr, searchResultSchema as mt, entryRefSchema as n, signupCompleteBody as nn, contentListQuery as nr, setupAtprotoAdminBody as nt, relationListResponseSchema as o, commentBulkResponseSchema as on, contentResponseSchema as or, wpPluginAnalyzeBody as ot, bylineFieldListResponseSchema as p, publicCommentListResponseSchema as pn, contentTrashQuery as pr, searchResponseSchema as pt, allowedDomainUpdateBody as q, mediaResponseSchema as qn, inviteCompleteBody as qt, referenceChildrenResponseSchema as r, signupRequestBody as rn, contentListResponseSchema as rr, setupBody as rt, relationResponseSchema as s, commentCountsResponseSchema as sn, contentScheduleBody as sr, wpPluginExecuteBody as st, createRelationBody as t, passkeyVerifyBody as tn, contentItemSchema as tr, setupAdminVerifyBody as tt, updateRelationBody as u, commentStatusBody as un, contentTermsBody as ur, searchEnableBody as ut, bylineCreditSchema as v, collectionSchema as vn, apiErrorSchema as vr, createSectionBody as vt, bylinesListQuery as w, fieldResponseSchema as wn, localeFilterQuery as wr, createTermBody as wt, bylineTranslationCreateBody as x, createFieldBody as xn, deleteResponseSchema as xr, sectionsListQuery as xt, bylineListResponseSchema as y, collectionWithFieldsResponseSchema as yn, countResponseSchema as yr, sectionListResponseSchema as yt, createWidgetBody as z, formatFileSize as zn, menuListItemSchema as zt };
2383
+ //# sourceMappingURL=relations-CbBpoOys.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations-CbBpoOys.d.mts","names":[],"sources":["../src/api/schemas/common.ts","../src/api/schemas/content.ts","../src/api/schemas/media.ts","../src/api/schemas/media-usage.ts","../src/api/schemas/schema.ts","../src/api/schemas/comments.ts","../src/api/schemas/auth.ts","../src/api/schemas/menus.ts","../src/api/schemas/taxonomies.ts","../src/api/schemas/sections.ts","../src/api/schemas/settings.ts","../src/api/schemas/search.ts","../src/api/schemas/import.ts","../src/api/schemas/setup.ts","../src/api/schemas/users.ts","../src/api/schemas/widgets.ts","../src/api/schemas/redirects.ts","../src/api/schemas/bylines.ts","../src/api/schemas/byline-fields.ts","../src/api/schemas/relations.ts"],"mappings":"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"}
@@ -101,4 +101,4 @@ function clearRequestCacheEntry(key) {
101
101
 
102
102
  //#endregion
103
103
  export { setRequestCacheEntry as i, peekRequestCache as n, requestCached as r, clearRequestCacheEntry as t };
104
- //# sourceMappingURL=request-cache-KCNHp_RJ.mjs.map
104
+ //# sourceMappingURL=request-cache-BSUptuJR.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"request-cache-KCNHp_RJ.mjs","names":[],"sources":["../src/request-cache.ts"],"sourcesContent":["/**\n * Per-request query cache\n *\n * Deduplicates identical database queries within a single page render.\n * Uses the ALS request context as a WeakMap key so the cache is\n * automatically GC'd when the request completes.\n *\n * When no request context is available (e.g. local dev without D1\n * replicas), queries bypass the cache — local SQLite is fast enough\n * that deduplication doesn't matter.\n *\n * The WeakMap is stored on globalThis with a Symbol key to guarantee\n * a singleton even when bundlers duplicate this module across chunks\n * (same pattern as request-context.ts).\n */\n\nimport type { EmDashRequestContext } from \"./request-context.js\";\nimport { getRequestContext } from \"./request-context.js\";\n\ntype CacheStore = WeakMap<EmDashRequestContext, Map<string, Promise<unknown>>>;\n\nconst STORE_KEY = Symbol.for(\"emdash:request-cache\");\nconst g = globalThis as Record<symbol, unknown>;\nconst store: CacheStore =\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- globalThis singleton pattern (see request-context.ts)\n\t(g[STORE_KEY] as CacheStore | undefined) ??\n\t(() => {\n\t\tconst wm: CacheStore = new WeakMap();\n\t\tg[STORE_KEY] = wm;\n\t\treturn wm;\n\t})();\n\n/**\n * Return a cached result for `key` if one exists in the current\n * request scope, otherwise call `fn`, cache its promise, and return it.\n *\n * Caches the *promise*, not the resolved value, so concurrent calls\n * with the same key share a single in-flight query.\n */\nexport function requestCached<T>(key: string, fn: () => Promise<T>): Promise<T> {\n\tconst ctx = getRequestContext();\n\tif (!ctx) return fn();\n\n\tlet cache = store.get(ctx);\n\tif (!cache) {\n\t\tcache = new Map();\n\t\tstore.set(ctx, cache);\n\t}\n\n\tconst existing = cache.get(key);\n\tif (existing) {\n\t\tif (ctx.metrics) ctx.metrics.cacheHits += 1;\n\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- heterogeneous cache; key namespacing guarantees the stored promise resolves to T\n\t\treturn existing as Promise<T>;\n\t}\n\tif (ctx.metrics) ctx.metrics.cacheMisses += 1;\n\n\tconst promise = Promise.resolve()\n\t\t.then(fn)\n\t\t.catch((error) => {\n\t\t\tcache.delete(key);\n\t\t\tthrow error;\n\t\t});\n\tcache.set(key, promise);\n\treturn promise;\n}\n\n/**\n * Look up an entry in the request-scoped cache without inserting one.\n *\n * Returns the in-flight or resolved promise if the key exists in the\n * current request, otherwise `undefined`. Callers can use this to\n * opportunistically satisfy a narrower query (e.g. `getSiteSetting(\"seo\")`)\n * from a broader one (`getSiteSettings()`) that's already been loaded\n * by a parent template — avoiding a redundant round-trip.\n *\n * No-ops outside a request context.\n */\nexport function peekRequestCache<T>(key: string): Promise<T> | undefined {\n\tconst ctx = getRequestContext();\n\tif (!ctx) return undefined;\n\tconst cache = store.get(ctx);\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- heterogeneous cache; caller is responsible for using a T-compatible key\n\treturn cache?.get(key) as Promise<T> | undefined;\n}\n\n/**\n * Pre-populate the request-scoped cache with a resolved value.\n *\n * Internal helper shared between hydration paths (taxonomy terms,\n * bylines, etc.) that already have the data in hand and want downstream\n * callers using `requestCached(key, ...)` to skip the database entirely.\n * Not exported from the package entrypoint — keep it internal until we\n * have a documented plugin/extension surface for hydration.\n *\n * No-ops outside a request context (local dev without ALS).\n *\n * Does not overwrite an existing entry — if a query for this key is already\n * in flight, its promise wins.\n */\nexport function setRequestCacheEntry<T>(key: string, value: T): void {\n\tconst ctx = getRequestContext();\n\tif (!ctx) return;\n\n\tlet cache = store.get(ctx);\n\tif (!cache) {\n\t\tcache = new Map();\n\t\tstore.set(ctx, cache);\n\t}\n\n\tif (cache.has(key)) return;\n\tcache.set(key, Promise.resolve(value));\n}\n\n/**\n * Remove a key from the request-scoped cache.\n *\n * Used by write paths that need to invalidate a downstream read cache —\n * `setRequestCacheEntry` deliberately doesn't overwrite, and `requestCached`\n * returns the cached promise even after the underlying data has changed.\n * Without an explicit clear, a `read → write → read` sequence in a single\n * request can return stale data on the second read.\n *\n * Concrete case: `BylineRepository.update` invalidates\n * `byline-field-group-values:${translation_group}` after writing a\n * non-translatable custom-field value, so the post-update `findById`\n * (and any later reads in the same request) see the fresh value.\n *\n * No-ops outside a request context.\n */\nexport function clearRequestCacheEntry(key: string): void {\n\tconst ctx = getRequestContext();\n\tif (!ctx) return;\n\tconst cache = store.get(ctx);\n\tcache?.delete(key);\n}\n"],"mappings":";;;AAqBA,MAAM,YAAY,OAAO,IAAI,uBAAuB;AACpD,MAAM,IAAI;AACV,MAAM,QAEJ,EAAE,qBACI;CACN,MAAM,qBAAiB,IAAI,SAAS;AACpC,GAAE,aAAa;AACf,QAAO;IACJ;;;;;;;;AASL,SAAgB,cAAiB,KAAa,IAAkC;CAC/E,MAAM,MAAM,mBAAmB;AAC/B,KAAI,CAAC,IAAK,QAAO,IAAI;CAErB,IAAI,QAAQ,MAAM,IAAI,IAAI;AAC1B,KAAI,CAAC,OAAO;AACX,0BAAQ,IAAI,KAAK;AACjB,QAAM,IAAI,KAAK,MAAM;;CAGtB,MAAM,WAAW,MAAM,IAAI,IAAI;AAC/B,KAAI,UAAU;AACb,MAAI,IAAI,QAAS,KAAI,QAAQ,aAAa;AAE1C,SAAO;;AAER,KAAI,IAAI,QAAS,KAAI,QAAQ,eAAe;CAE5C,MAAM,UAAU,QAAQ,SAAS,CAC/B,KAAK,GAAG,CACR,OAAO,UAAU;AACjB,QAAM,OAAO,IAAI;AACjB,QAAM;GACL;AACH,OAAM,IAAI,KAAK,QAAQ;AACvB,QAAO;;;;;;;;;;;;;AAcR,SAAgB,iBAAoB,KAAqC;CACxE,MAAM,MAAM,mBAAmB;AAC/B,KAAI,CAAC,IAAK,QAAO;AAGjB,QAFc,MAAM,IAAI,IAAI,EAEd,IAAI,IAAI;;;;;;;;;;;;;;;;AAiBvB,SAAgB,qBAAwB,KAAa,OAAgB;CACpE,MAAM,MAAM,mBAAmB;AAC/B,KAAI,CAAC,IAAK;CAEV,IAAI,QAAQ,MAAM,IAAI,IAAI;AAC1B,KAAI,CAAC,OAAO;AACX,0BAAQ,IAAI,KAAK;AACjB,QAAM,IAAI,KAAK,MAAM;;AAGtB,KAAI,MAAM,IAAI,IAAI,CAAE;AACpB,OAAM,IAAI,KAAK,QAAQ,QAAQ,MAAM,CAAC;;;;;;;;;;;;;;;;;;AAmBvC,SAAgB,uBAAuB,KAAmB;CACzD,MAAM,MAAM,mBAAmB;AAC/B,KAAI,CAAC,IAAK;AAEV,CADc,MAAM,IAAI,IAAI,EACrB,OAAO,IAAI"}
1
+ {"version":3,"file":"request-cache-BSUptuJR.mjs","names":[],"sources":["../src/request-cache.ts"],"sourcesContent":["/**\n * Per-request query cache\n *\n * Deduplicates identical database queries within a single page render.\n * Uses the ALS request context as a WeakMap key so the cache is\n * automatically GC'd when the request completes.\n *\n * When no request context is available (e.g. local dev without D1\n * replicas), queries bypass the cache — local SQLite is fast enough\n * that deduplication doesn't matter.\n *\n * The WeakMap is stored on globalThis with a Symbol key to guarantee\n * a singleton even when bundlers duplicate this module across chunks\n * (same pattern as request-context.ts).\n */\n\nimport type { EmDashRequestContext } from \"./request-context.js\";\nimport { getRequestContext } from \"./request-context.js\";\n\ntype CacheStore = WeakMap<EmDashRequestContext, Map<string, Promise<unknown>>>;\n\nconst STORE_KEY = Symbol.for(\"emdash:request-cache\");\nconst g = globalThis as Record<symbol, unknown>;\nconst store: CacheStore =\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- globalThis singleton pattern (see request-context.ts)\n\t(g[STORE_KEY] as CacheStore | undefined) ??\n\t(() => {\n\t\tconst wm: CacheStore = new WeakMap();\n\t\tg[STORE_KEY] = wm;\n\t\treturn wm;\n\t})();\n\n/**\n * Return a cached result for `key` if one exists in the current\n * request scope, otherwise call `fn`, cache its promise, and return it.\n *\n * Caches the *promise*, not the resolved value, so concurrent calls\n * with the same key share a single in-flight query.\n */\nexport function requestCached<T>(key: string, fn: () => Promise<T>): Promise<T> {\n\tconst ctx = getRequestContext();\n\tif (!ctx) return fn();\n\n\tlet cache = store.get(ctx);\n\tif (!cache) {\n\t\tcache = new Map();\n\t\tstore.set(ctx, cache);\n\t}\n\n\tconst existing = cache.get(key);\n\tif (existing) {\n\t\tif (ctx.metrics) ctx.metrics.cacheHits += 1;\n\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- heterogeneous cache; key namespacing guarantees the stored promise resolves to T\n\t\treturn existing as Promise<T>;\n\t}\n\tif (ctx.metrics) ctx.metrics.cacheMisses += 1;\n\n\tconst promise = Promise.resolve()\n\t\t.then(fn)\n\t\t.catch((error) => {\n\t\t\tcache.delete(key);\n\t\t\tthrow error;\n\t\t});\n\tcache.set(key, promise);\n\treturn promise;\n}\n\n/**\n * Look up an entry in the request-scoped cache without inserting one.\n *\n * Returns the in-flight or resolved promise if the key exists in the\n * current request, otherwise `undefined`. Callers can use this to\n * opportunistically satisfy a narrower query (e.g. `getSiteSetting(\"seo\")`)\n * from a broader one (`getSiteSettings()`) that's already been loaded\n * by a parent template — avoiding a redundant round-trip.\n *\n * No-ops outside a request context.\n */\nexport function peekRequestCache<T>(key: string): Promise<T> | undefined {\n\tconst ctx = getRequestContext();\n\tif (!ctx) return undefined;\n\tconst cache = store.get(ctx);\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- heterogeneous cache; caller is responsible for using a T-compatible key\n\treturn cache?.get(key) as Promise<T> | undefined;\n}\n\n/**\n * Pre-populate the request-scoped cache with a resolved value.\n *\n * Internal helper shared between hydration paths (taxonomy terms,\n * bylines, etc.) that already have the data in hand and want downstream\n * callers using `requestCached(key, ...)` to skip the database entirely.\n * Not exported from the package entrypoint — keep it internal until we\n * have a documented plugin/extension surface for hydration.\n *\n * No-ops outside a request context (local dev without ALS).\n *\n * Does not overwrite an existing entry — if a query for this key is already\n * in flight, its promise wins.\n */\nexport function setRequestCacheEntry<T>(key: string, value: T): void {\n\tconst ctx = getRequestContext();\n\tif (!ctx) return;\n\n\tlet cache = store.get(ctx);\n\tif (!cache) {\n\t\tcache = new Map();\n\t\tstore.set(ctx, cache);\n\t}\n\n\tif (cache.has(key)) return;\n\tcache.set(key, Promise.resolve(value));\n}\n\n/**\n * Remove a key from the request-scoped cache.\n *\n * Used by write paths that need to invalidate a downstream read cache —\n * `setRequestCacheEntry` deliberately doesn't overwrite, and `requestCached`\n * returns the cached promise even after the underlying data has changed.\n * Without an explicit clear, a `read → write → read` sequence in a single\n * request can return stale data on the second read.\n *\n * Concrete case: `BylineRepository.update` invalidates\n * `byline-field-group-values:${translation_group}` after writing a\n * non-translatable custom-field value, so the post-update `findById`\n * (and any later reads in the same request) see the fresh value.\n *\n * No-ops outside a request context.\n */\nexport function clearRequestCacheEntry(key: string): void {\n\tconst ctx = getRequestContext();\n\tif (!ctx) return;\n\tconst cache = store.get(ctx);\n\tcache?.delete(key);\n}\n"],"mappings":";;;AAqBA,MAAM,YAAY,OAAO,IAAI,uBAAuB;AACpD,MAAM,IAAI;AACV,MAAM,QAEJ,EAAE,qBACI;CACN,MAAM,qBAAiB,IAAI,SAAS;AACpC,GAAE,aAAa;AACf,QAAO;IACJ;;;;;;;;AASL,SAAgB,cAAiB,KAAa,IAAkC;CAC/E,MAAM,MAAM,mBAAmB;AAC/B,KAAI,CAAC,IAAK,QAAO,IAAI;CAErB,IAAI,QAAQ,MAAM,IAAI,IAAI;AAC1B,KAAI,CAAC,OAAO;AACX,0BAAQ,IAAI,KAAK;AACjB,QAAM,IAAI,KAAK,MAAM;;CAGtB,MAAM,WAAW,MAAM,IAAI,IAAI;AAC/B,KAAI,UAAU;AACb,MAAI,IAAI,QAAS,KAAI,QAAQ,aAAa;AAE1C,SAAO;;AAER,KAAI,IAAI,QAAS,KAAI,QAAQ,eAAe;CAE5C,MAAM,UAAU,QAAQ,SAAS,CAC/B,KAAK,GAAG,CACR,OAAO,UAAU;AACjB,QAAM,OAAO,IAAI;AACjB,QAAM;GACL;AACH,OAAM,IAAI,KAAK,QAAQ;AACvB,QAAO;;;;;;;;;;;;;AAcR,SAAgB,iBAAoB,KAAqC;CACxE,MAAM,MAAM,mBAAmB;AAC/B,KAAI,CAAC,IAAK,QAAO;AAGjB,QAFc,MAAM,IAAI,IAAI,EAEd,IAAI,IAAI;;;;;;;;;;;;;;;;AAiBvB,SAAgB,qBAAwB,KAAa,OAAgB;CACpE,MAAM,MAAM,mBAAmB;AAC/B,KAAI,CAAC,IAAK;CAEV,IAAI,QAAQ,MAAM,IAAI,IAAI;AAC1B,KAAI,CAAC,OAAO;AACX,0BAAQ,IAAI,KAAK;AACjB,QAAM,IAAI,KAAK,MAAM;;AAGtB,KAAI,MAAM,IAAI,IAAI,CAAE;AACpB,OAAM,IAAI,KAAK,QAAQ,QAAQ,MAAM,CAAC;;;;;;;;;;;;;;;;;;AAmBvC,SAAgB,uBAAuB,KAAmB;CACzD,MAAM,MAAM,mBAAmB;AAC/B,KAAI,CAAC,IAAK;AAEV,CADc,MAAM,IAAI,IAAI,EACrB,OAAO,IAAI"}
@@ -1,4 +1,4 @@
1
- import { n as normalizeTrustedHeaders, t as getTrustedProxyHeaders } from "./trusted-proxy-VTPRiX2s.mjs";
1
+ import { n as normalizeTrustedHeaders, t as getTrustedProxyHeaders } from "./trusted-proxy-CSgZVESw.mjs";
2
2
 
3
3
  //#region src/plugins/request-meta.ts
4
4
  /**
@@ -137,4 +137,4 @@ function sanitizeHeadersForSandbox(headers) {
137
137
 
138
138
  //#endregion
139
139
  export { sanitizeHeadersForSandbox as n, extractRequestMeta as t };
140
- //# sourceMappingURL=request-meta-DbvXaAvU.mjs.map
140
+ //# sourceMappingURL=request-meta-DCwktC5P.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"request-meta-DbvXaAvU.mjs","names":[],"sources":["../src/plugins/request-meta.ts"],"sourcesContent":["/**\n * Request Metadata Extraction\n *\n * Extracts normalized metadata (IP, user agent, referer, geo) from\n * incoming requests. Used by plugin route handlers to access request\n * context without touching raw headers.\n *\n */\n\nimport type { EmDashConfig } from \"../astro/integration/runtime.js\";\nimport { getTrustedProxyHeaders, normalizeTrustedHeaders } from \"../auth/trusted-proxy.js\";\nimport type { GeoInfo, RequestMeta } from \"./types.js\";\n\n/**\n * Cloudflare Workers `cf` object shape (subset we use).\n * Present on requests when running on Cloudflare Workers.\n */\ninterface CfProperties {\n\tcountry?: string;\n\tregion?: string;\n\tcity?: string;\n}\n\n/**\n * Loose validation for IPv4 and IPv6 addresses.\n * Accepts digits, hex chars, dots, and colons — rejects anything else\n * (e.g. HTML tags, scripts, or other non-IP garbage in spoofed headers).\n */\nconst IP_PATTERN = /^[\\da-fA-F.:]+$/;\n\n/**\n * Extract the first IP from an X-Forwarded-For header value.\n * The header may contain a comma-separated list of IPs; the first\n * entry is the original client IP.\n *\n * Returns null if the extracted value doesn't look like an IP address.\n */\nfunction parseFirstForwardedIp(header: string): string | null {\n\tconst first = header.split(\",\")[0];\n\tconst trimmed = first?.trim();\n\tif (!trimmed) return null;\n\treturn IP_PATTERN.test(trimmed) ? trimmed : null;\n}\n\n/**\n * Read an IP from an operator-declared trusted header. XFF-style headers\n * (any name ending in `forwarded-for`) are parsed as comma-separated lists\n * and the first entry is used; everything else is treated as a single\n * trimmed value.\n */\nfunction readIpFromHeader(headers: Headers, name: string): string | null {\n\tconst value = headers.get(name);\n\tif (!value) return null;\n\tif (name.endsWith(\"forwarded-for\")) {\n\t\treturn parseFirstForwardedIp(value);\n\t}\n\tconst trimmed = value.trim();\n\tif (!trimmed) return null;\n\treturn IP_PATTERN.test(trimmed) ? trimmed : null;\n}\n\n/**\n * Get the Cloudflare `cf` object from the request, if present.\n * Returns undefined when not running on Cloudflare Workers.\n */\nfunction getCfObject(request: Request): CfProperties | undefined {\n\treturn (request as unknown as { cf?: CfProperties }).cf;\n}\n\n/**\n * Extract geographic information from the Cloudflare `cf` object\n * attached to the request. Returns null when not running on CF Workers.\n */\nfunction extractGeo(cf: CfProperties | undefined): GeoInfo | null {\n\tif (!cf) return null;\n\n\tconst country = cf.country ?? null;\n\tconst region = cf.region ?? null;\n\tconst city = cf.city ?? null;\n\n\t// Only return geo if at least one field is populated\n\tif (country === null && region === null && city === null) return null;\n\n\treturn { country, region, city };\n}\n\n/**\n * Extract normalized request metadata from a Request object.\n *\n * IP resolution order:\n * 1. `CF-Connecting-IP` — trusted only when a `cf` object is present on the\n * request. CF edge overwrites any client-supplied value, so this is the\n * cryptographically trustworthy path on Workers. Operator-declared\n * trusted headers cannot override it.\n * 2. `X-Forwarded-For` first entry — trusted only with a `cf` object.\n * 3. Operator-declared trusted proxy headers (from `config.trustedProxyHeaders`\n * or the `EMDASH_TRUSTED_PROXY_HEADERS` env var), tried in order. Used as\n * the primary source off-CF and as a fill-in on CF.\n * 4. `null`\n *\n * The second argument accepts either the EmDash config or a pre-resolved\n * list of trusted headers, so callers that already have the list don't have\n * to round-trip through the config every request.\n */\nexport function extractRequestMeta(\n\trequest: Request,\n\tconfigOrTrustedHeaders?: EmDashConfig | null | { trustedProxyHeaders?: string[] } | string[],\n): RequestMeta {\n\tconst headers = request.headers;\n\tconst cf = getCfObject(request);\n\tconst trusted = resolveTrustedHeaders(configOrTrustedHeaders);\n\n\tlet ip: string | null = null;\n\n\t// On Cloudflare, prefer the cryptographically trustworthy headers first.\n\tif (cf) {\n\t\tconst cfIp = headers.get(\"cf-connecting-ip\")?.trim();\n\t\tif (cfIp && IP_PATTERN.test(cfIp)) {\n\t\t\tip = cfIp;\n\t\t}\n\t\tif (!ip) {\n\t\t\tconst xff = headers.get(\"x-forwarded-for\");\n\t\t\tip = xff ? parseFirstForwardedIp(xff) : null;\n\t\t}\n\t}\n\n\t// Fall through to operator-declared trusted headers. On CF this fills\n\t// in when the CF headers are absent; off-CF it's the primary source.\n\tif (!ip) {\n\t\tfor (const name of trusted) {\n\t\t\tconst value = readIpFromHeader(headers, name);\n\t\t\tif (value) {\n\t\t\t\tip = value;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst userAgent = headers.get(\"user-agent\")?.trim() || null;\n\tconst referer = headers.get(\"referer\")?.trim() || null;\n\tconst geo = extractGeo(cf);\n\n\treturn { ip, userAgent, referer, geo };\n}\n\nfunction resolveTrustedHeaders(\n\tvalue: EmDashConfig | null | { trustedProxyHeaders?: string[] } | string[] | undefined,\n): string[] {\n\tif (Array.isArray(value)) {\n\t\t// Apply the same RFC 7230 validation the config/env path does so a\n\t\t// caller passing a pre-resolved list with bad entries can't crash\n\t\t// `Headers.get()` downstream.\n\t\treturn normalizeTrustedHeaders(value);\n\t}\n\treturn getTrustedProxyHeaders(value);\n}\n\n// =============================================================================\n// Header Sanitization for Sandbox\n// =============================================================================\n\n/**\n * Headers that must never cross the RPC boundary to sandboxed plugins.\n * Session tokens, auth credentials, and infrastructure headers are stripped\n * to prevent malicious plugins from exfiltrating sensitive data.\n */\nconst SANDBOX_STRIPPED_HEADERS = new Set([\n\t\"cookie\",\n\t\"set-cookie\",\n\t\"authorization\",\n\t\"proxy-authorization\",\n\t\"cf-access-jwt-assertion\",\n\t\"cf-access-client-id\",\n\t\"cf-access-client-secret\",\n\t\"x-emdash-request\",\n]);\n\n/**\n * Copy request headers into a plain object, stripping sensitive headers\n * that must not be exposed to sandboxed plugin code.\n */\nexport function sanitizeHeadersForSandbox(headers: Headers): Record<string, string> {\n\tconst safe: Record<string, string> = {};\n\theaders.forEach((value, key) => {\n\t\tif (!SANDBOX_STRIPPED_HEADERS.has(key)) {\n\t\t\tsafe[key] = value;\n\t\t}\n\t});\n\treturn safe;\n}\n"],"mappings":";;;;;;;;AA4BA,MAAM,aAAa;;;;;;;;AASnB,SAAS,sBAAsB,QAA+B;CAE7D,MAAM,UADQ,OAAO,MAAM,IAAI,CAAC,IACT,MAAM;AAC7B,KAAI,CAAC,QAAS,QAAO;AACrB,QAAO,WAAW,KAAK,QAAQ,GAAG,UAAU;;;;;;;;AAS7C,SAAS,iBAAiB,SAAkB,MAA6B;CACxE,MAAM,QAAQ,QAAQ,IAAI,KAAK;AAC/B,KAAI,CAAC,MAAO,QAAO;AACnB,KAAI,KAAK,SAAS,gBAAgB,CACjC,QAAO,sBAAsB,MAAM;CAEpC,MAAM,UAAU,MAAM,MAAM;AAC5B,KAAI,CAAC,QAAS,QAAO;AACrB,QAAO,WAAW,KAAK,QAAQ,GAAG,UAAU;;;;;;AAO7C,SAAS,YAAY,SAA4C;AAChE,QAAQ,QAA6C;;;;;;AAOtD,SAAS,WAAW,IAA8C;AACjE,KAAI,CAAC,GAAI,QAAO;CAEhB,MAAM,UAAU,GAAG,WAAW;CAC9B,MAAM,SAAS,GAAG,UAAU;CAC5B,MAAM,OAAO,GAAG,QAAQ;AAGxB,KAAI,YAAY,QAAQ,WAAW,QAAQ,SAAS,KAAM,QAAO;AAEjE,QAAO;EAAE;EAAS;EAAQ;EAAM;;;;;;;;;;;;;;;;;;;;AAqBjC,SAAgB,mBACf,SACA,wBACc;CACd,MAAM,UAAU,QAAQ;CACxB,MAAM,KAAK,YAAY,QAAQ;CAC/B,MAAM,UAAU,sBAAsB,uBAAuB;CAE7D,IAAI,KAAoB;AAGxB,KAAI,IAAI;EACP,MAAM,OAAO,QAAQ,IAAI,mBAAmB,EAAE,MAAM;AACpD,MAAI,QAAQ,WAAW,KAAK,KAAK,CAChC,MAAK;AAEN,MAAI,CAAC,IAAI;GACR,MAAM,MAAM,QAAQ,IAAI,kBAAkB;AAC1C,QAAK,MAAM,sBAAsB,IAAI,GAAG;;;AAM1C,KAAI,CAAC,GACJ,MAAK,MAAM,QAAQ,SAAS;EAC3B,MAAM,QAAQ,iBAAiB,SAAS,KAAK;AAC7C,MAAI,OAAO;AACV,QAAK;AACL;;;CAKH,MAAM,YAAY,QAAQ,IAAI,aAAa,EAAE,MAAM,IAAI;CACvD,MAAM,UAAU,QAAQ,IAAI,UAAU,EAAE,MAAM,IAAI;CAClD,MAAM,MAAM,WAAW,GAAG;AAE1B,QAAO;EAAE;EAAI;EAAW;EAAS;EAAK;;AAGvC,SAAS,sBACR,OACW;AACX,KAAI,MAAM,QAAQ,MAAM,CAIvB,QAAO,wBAAwB,MAAM;AAEtC,QAAO,uBAAuB,MAAM;;;;;;;AAYrC,MAAM,2BAA2B,IAAI,IAAI;CACxC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,CAAC;;;;;AAMF,SAAgB,0BAA0B,SAA0C;CACnF,MAAM,OAA+B,EAAE;AACvC,SAAQ,SAAS,OAAO,QAAQ;AAC/B,MAAI,CAAC,yBAAyB,IAAI,IAAI,CACrC,MAAK,OAAO;GAEZ;AACF,QAAO"}
1
+ {"version":3,"file":"request-meta-DCwktC5P.mjs","names":[],"sources":["../src/plugins/request-meta.ts"],"sourcesContent":["/**\n * Request Metadata Extraction\n *\n * Extracts normalized metadata (IP, user agent, referer, geo) from\n * incoming requests. Used by plugin route handlers to access request\n * context without touching raw headers.\n *\n */\n\nimport type { EmDashConfig } from \"../astro/integration/runtime.js\";\nimport { getTrustedProxyHeaders, normalizeTrustedHeaders } from \"../auth/trusted-proxy.js\";\nimport type { GeoInfo, RequestMeta } from \"./types.js\";\n\n/**\n * Cloudflare Workers `cf` object shape (subset we use).\n * Present on requests when running on Cloudflare Workers.\n */\ninterface CfProperties {\n\tcountry?: string;\n\tregion?: string;\n\tcity?: string;\n}\n\n/**\n * Loose validation for IPv4 and IPv6 addresses.\n * Accepts digits, hex chars, dots, and colons — rejects anything else\n * (e.g. HTML tags, scripts, or other non-IP garbage in spoofed headers).\n */\nconst IP_PATTERN = /^[\\da-fA-F.:]+$/;\n\n/**\n * Extract the first IP from an X-Forwarded-For header value.\n * The header may contain a comma-separated list of IPs; the first\n * entry is the original client IP.\n *\n * Returns null if the extracted value doesn't look like an IP address.\n */\nfunction parseFirstForwardedIp(header: string): string | null {\n\tconst first = header.split(\",\")[0];\n\tconst trimmed = first?.trim();\n\tif (!trimmed) return null;\n\treturn IP_PATTERN.test(trimmed) ? trimmed : null;\n}\n\n/**\n * Read an IP from an operator-declared trusted header. XFF-style headers\n * (any name ending in `forwarded-for`) are parsed as comma-separated lists\n * and the first entry is used; everything else is treated as a single\n * trimmed value.\n */\nfunction readIpFromHeader(headers: Headers, name: string): string | null {\n\tconst value = headers.get(name);\n\tif (!value) return null;\n\tif (name.endsWith(\"forwarded-for\")) {\n\t\treturn parseFirstForwardedIp(value);\n\t}\n\tconst trimmed = value.trim();\n\tif (!trimmed) return null;\n\treturn IP_PATTERN.test(trimmed) ? trimmed : null;\n}\n\n/**\n * Get the Cloudflare `cf` object from the request, if present.\n * Returns undefined when not running on Cloudflare Workers.\n */\nfunction getCfObject(request: Request): CfProperties | undefined {\n\treturn (request as unknown as { cf?: CfProperties }).cf;\n}\n\n/**\n * Extract geographic information from the Cloudflare `cf` object\n * attached to the request. Returns null when not running on CF Workers.\n */\nfunction extractGeo(cf: CfProperties | undefined): GeoInfo | null {\n\tif (!cf) return null;\n\n\tconst country = cf.country ?? null;\n\tconst region = cf.region ?? null;\n\tconst city = cf.city ?? null;\n\n\t// Only return geo if at least one field is populated\n\tif (country === null && region === null && city === null) return null;\n\n\treturn { country, region, city };\n}\n\n/**\n * Extract normalized request metadata from a Request object.\n *\n * IP resolution order:\n * 1. `CF-Connecting-IP` — trusted only when a `cf` object is present on the\n * request. CF edge overwrites any client-supplied value, so this is the\n * cryptographically trustworthy path on Workers. Operator-declared\n * trusted headers cannot override it.\n * 2. `X-Forwarded-For` first entry — trusted only with a `cf` object.\n * 3. Operator-declared trusted proxy headers (from `config.trustedProxyHeaders`\n * or the `EMDASH_TRUSTED_PROXY_HEADERS` env var), tried in order. Used as\n * the primary source off-CF and as a fill-in on CF.\n * 4. `null`\n *\n * The second argument accepts either the EmDash config or a pre-resolved\n * list of trusted headers, so callers that already have the list don't have\n * to round-trip through the config every request.\n */\nexport function extractRequestMeta(\n\trequest: Request,\n\tconfigOrTrustedHeaders?: EmDashConfig | null | { trustedProxyHeaders?: string[] } | string[],\n): RequestMeta {\n\tconst headers = request.headers;\n\tconst cf = getCfObject(request);\n\tconst trusted = resolveTrustedHeaders(configOrTrustedHeaders);\n\n\tlet ip: string | null = null;\n\n\t// On Cloudflare, prefer the cryptographically trustworthy headers first.\n\tif (cf) {\n\t\tconst cfIp = headers.get(\"cf-connecting-ip\")?.trim();\n\t\tif (cfIp && IP_PATTERN.test(cfIp)) {\n\t\t\tip = cfIp;\n\t\t}\n\t\tif (!ip) {\n\t\t\tconst xff = headers.get(\"x-forwarded-for\");\n\t\t\tip = xff ? parseFirstForwardedIp(xff) : null;\n\t\t}\n\t}\n\n\t// Fall through to operator-declared trusted headers. On CF this fills\n\t// in when the CF headers are absent; off-CF it's the primary source.\n\tif (!ip) {\n\t\tfor (const name of trusted) {\n\t\t\tconst value = readIpFromHeader(headers, name);\n\t\t\tif (value) {\n\t\t\t\tip = value;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst userAgent = headers.get(\"user-agent\")?.trim() || null;\n\tconst referer = headers.get(\"referer\")?.trim() || null;\n\tconst geo = extractGeo(cf);\n\n\treturn { ip, userAgent, referer, geo };\n}\n\nfunction resolveTrustedHeaders(\n\tvalue: EmDashConfig | null | { trustedProxyHeaders?: string[] } | string[] | undefined,\n): string[] {\n\tif (Array.isArray(value)) {\n\t\t// Apply the same RFC 7230 validation the config/env path does so a\n\t\t// caller passing a pre-resolved list with bad entries can't crash\n\t\t// `Headers.get()` downstream.\n\t\treturn normalizeTrustedHeaders(value);\n\t}\n\treturn getTrustedProxyHeaders(value);\n}\n\n// =============================================================================\n// Header Sanitization for Sandbox\n// =============================================================================\n\n/**\n * Headers that must never cross the RPC boundary to sandboxed plugins.\n * Session tokens, auth credentials, and infrastructure headers are stripped\n * to prevent malicious plugins from exfiltrating sensitive data.\n */\nconst SANDBOX_STRIPPED_HEADERS = new Set([\n\t\"cookie\",\n\t\"set-cookie\",\n\t\"authorization\",\n\t\"proxy-authorization\",\n\t\"cf-access-jwt-assertion\",\n\t\"cf-access-client-id\",\n\t\"cf-access-client-secret\",\n\t\"x-emdash-request\",\n]);\n\n/**\n * Copy request headers into a plain object, stripping sensitive headers\n * that must not be exposed to sandboxed plugin code.\n */\nexport function sanitizeHeadersForSandbox(headers: Headers): Record<string, string> {\n\tconst safe: Record<string, string> = {};\n\theaders.forEach((value, key) => {\n\t\tif (!SANDBOX_STRIPPED_HEADERS.has(key)) {\n\t\t\tsafe[key] = value;\n\t\t}\n\t});\n\treturn safe;\n}\n"],"mappings":";;;;;;;;AA4BA,MAAM,aAAa;;;;;;;;AASnB,SAAS,sBAAsB,QAA+B;CAE7D,MAAM,UADQ,OAAO,MAAM,IAAI,CAAC,IACT,MAAM;AAC7B,KAAI,CAAC,QAAS,QAAO;AACrB,QAAO,WAAW,KAAK,QAAQ,GAAG,UAAU;;;;;;;;AAS7C,SAAS,iBAAiB,SAAkB,MAA6B;CACxE,MAAM,QAAQ,QAAQ,IAAI,KAAK;AAC/B,KAAI,CAAC,MAAO,QAAO;AACnB,KAAI,KAAK,SAAS,gBAAgB,CACjC,QAAO,sBAAsB,MAAM;CAEpC,MAAM,UAAU,MAAM,MAAM;AAC5B,KAAI,CAAC,QAAS,QAAO;AACrB,QAAO,WAAW,KAAK,QAAQ,GAAG,UAAU;;;;;;AAO7C,SAAS,YAAY,SAA4C;AAChE,QAAQ,QAA6C;;;;;;AAOtD,SAAS,WAAW,IAA8C;AACjE,KAAI,CAAC,GAAI,QAAO;CAEhB,MAAM,UAAU,GAAG,WAAW;CAC9B,MAAM,SAAS,GAAG,UAAU;CAC5B,MAAM,OAAO,GAAG,QAAQ;AAGxB,KAAI,YAAY,QAAQ,WAAW,QAAQ,SAAS,KAAM,QAAO;AAEjE,QAAO;EAAE;EAAS;EAAQ;EAAM;;;;;;;;;;;;;;;;;;;;AAqBjC,SAAgB,mBACf,SACA,wBACc;CACd,MAAM,UAAU,QAAQ;CACxB,MAAM,KAAK,YAAY,QAAQ;CAC/B,MAAM,UAAU,sBAAsB,uBAAuB;CAE7D,IAAI,KAAoB;AAGxB,KAAI,IAAI;EACP,MAAM,OAAO,QAAQ,IAAI,mBAAmB,EAAE,MAAM;AACpD,MAAI,QAAQ,WAAW,KAAK,KAAK,CAChC,MAAK;AAEN,MAAI,CAAC,IAAI;GACR,MAAM,MAAM,QAAQ,IAAI,kBAAkB;AAC1C,QAAK,MAAM,sBAAsB,IAAI,GAAG;;;AAM1C,KAAI,CAAC,GACJ,MAAK,MAAM,QAAQ,SAAS;EAC3B,MAAM,QAAQ,iBAAiB,SAAS,KAAK;AAC7C,MAAI,OAAO;AACV,QAAK;AACL;;;CAKH,MAAM,YAAY,QAAQ,IAAI,aAAa,EAAE,MAAM,IAAI;CACvD,MAAM,UAAU,QAAQ,IAAI,UAAU,EAAE,MAAM,IAAI;CAClD,MAAM,MAAM,WAAW,GAAG;AAE1B,QAAO;EAAE;EAAI;EAAW;EAAS;EAAK;;AAGvC,SAAS,sBACR,OACW;AACX,KAAI,MAAM,QAAQ,MAAM,CAIvB,QAAO,wBAAwB,MAAM;AAEtC,QAAO,uBAAuB,MAAM;;;;;;;AAYrC,MAAM,2BAA2B,IAAI,IAAI;CACxC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,CAAC;;;;;AAMF,SAAgB,0BAA0B,SAA0C;CACnF,MAAM,OAA+B,EAAE;AACvC,SAAQ,SAAS,OAAO,QAAQ;AAC/B,MAAI,CAAC,yBAAyB,IAAI,IAAI,CACrC,MAAK,OAAO;GAEZ;AACF,QAAO"}
@@ -140,4 +140,4 @@ function normalizePath(path) {
140
140
 
141
141
  //#endregion
142
142
  export { resolveLocaleChain as i, localizePath as n, resolveLocale as r, interpolateUrlPattern as t };
143
- //# sourceMappingURL=resolve-DR3wqMTy.mjs.map
143
+ //# sourceMappingURL=resolve-Cd9dzclN.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-DR3wqMTy.mjs","names":[],"sources":["../src/i18n/resolve.ts"],"sourcesContent":["/**\n * Shared locale-resolution helpers.\n *\n * Matches the pattern used by `query.ts` for content: an explicit locale wins,\n * otherwise we fall back to the request-context locale, otherwise to\n * `defaultLocale` when i18n is enabled, otherwise to `undefined` (meaning \"do\n * not filter by locale\" — legacy single-locale behaviour).\n */\n\nimport { getRequestContext } from \"../request-context.js\";\nimport { getFallbackChain, getI18nConfig, isI18nEnabled } from \"./config.js\";\n\n/**\n * Resolve the locale to use for a query given an optional explicit value.\n * Returns `undefined` when no locale information is available; callers should\n * treat that as \"do not filter by locale\".\n */\nexport function resolveLocale(explicit?: string): string | undefined {\n\tif (explicit !== undefined) return explicit;\n\tconst ctxLocale = getRequestContext()?.locale;\n\tif (ctxLocale !== undefined) return ctxLocale;\n\tconst cfg = getI18nConfig();\n\tif (cfg && isI18nEnabled()) return cfg.defaultLocale;\n\treturn undefined;\n}\n\n/**\n * Fallback chain to try when looking up a single item. When i18n is disabled\n * or the locale is unspecified, returns a single-element array (or empty when\n * no locale resolves) so callers can iterate uniformly.\n */\nexport function resolveLocaleChain(explicit?: string): string[] {\n\tconst locale = resolveLocale(explicit);\n\tif (locale === undefined) return [];\n\tif (!isI18nEnabled()) return [locale];\n\treturn getFallbackChain(locale);\n}\n\nconst REPEATED_SLASHES = /\\/{2,}/g;\n\n/**\n * Interpolate a collection `url_pattern` with a row's slug and id.\n *\n * Falls back to `/{collection}/{slug}` when no pattern is configured.\n * Does NOT apply any locale prefix — pass the result through\n * Astro's `getRelativeLocaleUrl` / `getAbsoluteLocaleUrl` (or the\n * `localizePath` helper below) to add the locale segment.\n */\nexport function interpolateUrlPattern(options: {\n\tpattern: string | null;\n\tcollection: string;\n\tslug: string;\n\tid: string;\n}): string {\n\tconst { pattern, collection, slug, id } = options;\n\tconst basePattern = pattern ?? `/${encodeURIComponent(collection)}/{slug}`;\n\tlet path = basePattern\n\t\t.replace(\"{slug}\", encodeURIComponent(slug))\n\t\t.replace(\"{id}\", encodeURIComponent(id));\n\tpath = path.replace(REPEATED_SLASHES, \"/\");\n\tif (path.length > 1 && path.endsWith(\"/\")) path = path.slice(0, -1);\n\tif (!path.startsWith(\"/\")) path = `/${path}`;\n\treturn path;\n}\n\n/**\n * Apply a locale prefix to a path, honouring the user's Astro `i18n`\n * routing config (`prefixDefaultLocale`, custom `path`/`codes` mappings).\n *\n * Reads the resolved config from `astro:config/server`, which is always\n * available regardless of whether i18n is enabled -- so this function\n * works in both i18n and non-i18n builds without tripping Astro's\n * `i18nNotEnabled` resolver (the case with importing `astro:i18n`).\n *\n * Returns:\n * - The original `path` when i18n is not configured.\n * - The original `path` for the default locale when\n * `prefixDefaultLocale` is false.\n * - `/{segment}{path}` for any other configured locale, where\n * `{segment}` is the locale's custom `path` if one is set,\n * otherwise the locale code.\n * - `null` when the row's locale isn't in the configured list.\n * Callers should drop the entry: a sitemap link to a route the\n * site can't serve is worse than no link at all (search engines\n * get a 404 / soft-404 and downrank the page).\n *\n * Falls back to `getI18nConfig()` (EmDash's mirror of the same config,\n * populated at runtime startup) when `astro:config/server` is\n * unavailable -- e.g. running outside an Astro build context, such as\n * in vitest.\n */\nexport async function localizePath(path: string, locale: string): Promise<string | null> {\n\tconst segment = await resolveLocaleSegment(locale);\n\tif (segment === undefined) return null;\n\tif (segment === null || segment === \"\") return normalizePath(path);\n\treturn normalizePath(`/${segment}${path}`);\n}\n\n/**\n * Resolve the URL segment to use for a locale.\n *\n * Returns:\n * - `null` when i18n isn't configured (caller should not prefix).\n * - `\"\"` when the locale is the default locale and\n * `prefixDefaultLocale` is false (caller should not prefix).\n * - The locale's custom `path` value, or the locale string itself.\n * - `undefined` when the locale isn't in the configured list --\n * the row points at a route the site can't serve.\n */\nasync function resolveLocaleSegment(locale: string): Promise<string | null | undefined> {\n\tconst i18n = await readAstroI18nConfig();\n\tif (!i18n || !i18n.locales || i18n.locales.length <= 1) return null;\n\n\tconst isDefault = locale === i18n.defaultLocale;\n\tif (isDefault && !i18n.prefixDefaultLocale) return \"\";\n\n\t// When the locale has a custom `path`/`codes` mapping, use the path\n\t// for the URL segment. Otherwise use the locale code directly.\n\tfor (const entry of i18n.locales) {\n\t\tif (typeof entry === \"string\") {\n\t\t\tif (entry === locale) return entry;\n\t\t} else if (entry.codes.includes(locale)) {\n\t\t\treturn entry.path;\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\ninterface AstroI18nConfig {\n\tdefaultLocale: string;\n\tlocales: Array<string | { codes: readonly string[]; path: string }>;\n\tprefixDefaultLocale?: boolean;\n}\n\nlet astroI18nCache: AstroI18nConfig | null | undefined;\n\nasync function readAstroI18nConfig(): Promise<AstroI18nConfig | null> {\n\tif (astroI18nCache !== undefined) return astroI18nCache;\n\n\ttry {\n\t\tconst mod = (await import(\"astro:config/server\")) as {\n\t\t\ti18n?: {\n\t\t\t\tdefaultLocale: string;\n\t\t\t\tlocales: Array<string | { codes: readonly string[]; path: string }>;\n\t\t\t\trouting?: { prefixDefaultLocale?: boolean } | string;\n\t\t\t};\n\t\t};\n\t\tif (!mod.i18n) {\n\t\t\tastroI18nCache = null;\n\t\t\treturn null;\n\t\t}\n\t\tconst routing = mod.i18n.routing;\n\t\tastroI18nCache = {\n\t\t\tdefaultLocale: mod.i18n.defaultLocale,\n\t\t\tlocales: mod.i18n.locales,\n\t\t\tprefixDefaultLocale:\n\t\t\t\ttypeof routing === \"object\" ? (routing.prefixDefaultLocale ?? false) : false,\n\t\t};\n\t\treturn astroI18nCache;\n\t} catch {\n\t\t// `astro:config/server` isn't resolvable (e.g. running under vitest\n\t\t// outside an Astro build). Fall back to EmDash's runtime config,\n\t\t// which is populated at startup via the same astroConfig object.\n\t\tconst cfg = getI18nConfig();\n\t\tif (!cfg || !isI18nEnabled()) {\n\t\t\tastroI18nCache = null;\n\t\t\treturn null;\n\t\t}\n\t\tastroI18nCache = {\n\t\t\tdefaultLocale: cfg.defaultLocale,\n\t\t\tlocales: cfg.locales,\n\t\t\tprefixDefaultLocale: cfg.prefixDefaultLocale,\n\t\t};\n\t\treturn astroI18nCache;\n\t}\n}\n\n/** @internal -- exposed for tests to reset the module-level cache. */\nexport function _resetAstroI18nCacheForTests(): void {\n\tastroI18nCache = undefined;\n}\n\nfunction normalizePath(path: string): string {\n\tlet p = path.replace(REPEATED_SLASHES, \"/\");\n\tif (p.length > 1 && p.endsWith(\"/\")) p = p.slice(0, -1);\n\tif (!p.startsWith(\"/\")) p = `/${p}`;\n\treturn p;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAiBA,SAAgB,cAAc,UAAuC;AACpE,KAAI,aAAa,OAAW,QAAO;CACnC,MAAM,YAAY,mBAAmB,EAAE;AACvC,KAAI,cAAc,OAAW,QAAO;CACpC,MAAM,MAAM,eAAe;AAC3B,KAAI,OAAO,eAAe,CAAE,QAAO,IAAI;;;;;;;AASxC,SAAgB,mBAAmB,UAA6B;CAC/D,MAAM,SAAS,cAAc,SAAS;AACtC,KAAI,WAAW,OAAW,QAAO,EAAE;AACnC,KAAI,CAAC,eAAe,CAAE,QAAO,CAAC,OAAO;AACrC,QAAO,iBAAiB,OAAO;;AAGhC,MAAM,mBAAmB;;;;;;;;;AAUzB,SAAgB,sBAAsB,SAK3B;CACV,MAAM,EAAE,SAAS,YAAY,MAAM,OAAO;CAE1C,IAAI,QADgB,WAAW,IAAI,mBAAmB,WAAW,CAAC,UAEhE,QAAQ,UAAU,mBAAmB,KAAK,CAAC,CAC3C,QAAQ,QAAQ,mBAAmB,GAAG,CAAC;AACzC,QAAO,KAAK,QAAQ,kBAAkB,IAAI;AAC1C,KAAI,KAAK,SAAS,KAAK,KAAK,SAAS,IAAI,CAAE,QAAO,KAAK,MAAM,GAAG,GAAG;AACnE,KAAI,CAAC,KAAK,WAAW,IAAI,CAAE,QAAO,IAAI;AACtC,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BR,eAAsB,aAAa,MAAc,QAAwC;CACxF,MAAM,UAAU,MAAM,qBAAqB,OAAO;AAClD,KAAI,YAAY,OAAW,QAAO;AAClC,KAAI,YAAY,QAAQ,YAAY,GAAI,QAAO,cAAc,KAAK;AAClE,QAAO,cAAc,IAAI,UAAU,OAAO;;;;;;;;;;;;;AAc3C,eAAe,qBAAqB,QAAoD;CACvF,MAAM,OAAO,MAAM,qBAAqB;AACxC,KAAI,CAAC,QAAQ,CAAC,KAAK,WAAW,KAAK,QAAQ,UAAU,EAAG,QAAO;AAG/D,KADkB,WAAW,KAAK,iBACjB,CAAC,KAAK,oBAAqB,QAAO;AAInD,MAAK,MAAM,SAAS,KAAK,QACxB,KAAI,OAAO,UAAU,UACpB;MAAI,UAAU,OAAQ,QAAO;YACnB,MAAM,MAAM,SAAS,OAAO,CACtC,QAAO,MAAM;;AAahB,IAAI;AAEJ,eAAe,sBAAuD;AACrE,KAAI,mBAAmB,OAAW,QAAO;AAEzC,KAAI;EACH,MAAM,MAAO,MAAM,OAAO;AAO1B,MAAI,CAAC,IAAI,MAAM;AACd,oBAAiB;AACjB,UAAO;;EAER,MAAM,UAAU,IAAI,KAAK;AACzB,mBAAiB;GAChB,eAAe,IAAI,KAAK;GACxB,SAAS,IAAI,KAAK;GAClB,qBACC,OAAO,YAAY,WAAY,QAAQ,uBAAuB,QAAS;GACxE;AACD,SAAO;SACA;EAIP,MAAM,MAAM,eAAe;AAC3B,MAAI,CAAC,OAAO,CAAC,eAAe,EAAE;AAC7B,oBAAiB;AACjB,UAAO;;AAER,mBAAiB;GAChB,eAAe,IAAI;GACnB,SAAS,IAAI;GACb,qBAAqB,IAAI;GACzB;AACD,SAAO;;;AAST,SAAS,cAAc,MAAsB;CAC5C,IAAI,IAAI,KAAK,QAAQ,kBAAkB,IAAI;AAC3C,KAAI,EAAE,SAAS,KAAK,EAAE,SAAS,IAAI,CAAE,KAAI,EAAE,MAAM,GAAG,GAAG;AACvD,KAAI,CAAC,EAAE,WAAW,IAAI,CAAE,KAAI,IAAI;AAChC,QAAO"}
1
+ {"version":3,"file":"resolve-Cd9dzclN.mjs","names":[],"sources":["../src/i18n/resolve.ts"],"sourcesContent":["/**\n * Shared locale-resolution helpers.\n *\n * Matches the pattern used by `query.ts` for content: an explicit locale wins,\n * otherwise we fall back to the request-context locale, otherwise to\n * `defaultLocale` when i18n is enabled, otherwise to `undefined` (meaning \"do\n * not filter by locale\" — legacy single-locale behaviour).\n */\n\nimport { getRequestContext } from \"../request-context.js\";\nimport { getFallbackChain, getI18nConfig, isI18nEnabled } from \"./config.js\";\n\n/**\n * Resolve the locale to use for a query given an optional explicit value.\n * Returns `undefined` when no locale information is available; callers should\n * treat that as \"do not filter by locale\".\n */\nexport function resolveLocale(explicit?: string): string | undefined {\n\tif (explicit !== undefined) return explicit;\n\tconst ctxLocale = getRequestContext()?.locale;\n\tif (ctxLocale !== undefined) return ctxLocale;\n\tconst cfg = getI18nConfig();\n\tif (cfg && isI18nEnabled()) return cfg.defaultLocale;\n\treturn undefined;\n}\n\n/**\n * Fallback chain to try when looking up a single item. When i18n is disabled\n * or the locale is unspecified, returns a single-element array (or empty when\n * no locale resolves) so callers can iterate uniformly.\n */\nexport function resolveLocaleChain(explicit?: string): string[] {\n\tconst locale = resolveLocale(explicit);\n\tif (locale === undefined) return [];\n\tif (!isI18nEnabled()) return [locale];\n\treturn getFallbackChain(locale);\n}\n\nconst REPEATED_SLASHES = /\\/{2,}/g;\n\n/**\n * Interpolate a collection `url_pattern` with a row's slug and id.\n *\n * Falls back to `/{collection}/{slug}` when no pattern is configured.\n * Does NOT apply any locale prefix — pass the result through\n * Astro's `getRelativeLocaleUrl` / `getAbsoluteLocaleUrl` (or the\n * `localizePath` helper below) to add the locale segment.\n */\nexport function interpolateUrlPattern(options: {\n\tpattern: string | null;\n\tcollection: string;\n\tslug: string;\n\tid: string;\n}): string {\n\tconst { pattern, collection, slug, id } = options;\n\tconst basePattern = pattern ?? `/${encodeURIComponent(collection)}/{slug}`;\n\tlet path = basePattern\n\t\t.replace(\"{slug}\", encodeURIComponent(slug))\n\t\t.replace(\"{id}\", encodeURIComponent(id));\n\tpath = path.replace(REPEATED_SLASHES, \"/\");\n\tif (path.length > 1 && path.endsWith(\"/\")) path = path.slice(0, -1);\n\tif (!path.startsWith(\"/\")) path = `/${path}`;\n\treturn path;\n}\n\n/**\n * Apply a locale prefix to a path, honouring the user's Astro `i18n`\n * routing config (`prefixDefaultLocale`, custom `path`/`codes` mappings).\n *\n * Reads the resolved config from `astro:config/server`, which is always\n * available regardless of whether i18n is enabled -- so this function\n * works in both i18n and non-i18n builds without tripping Astro's\n * `i18nNotEnabled` resolver (the case with importing `astro:i18n`).\n *\n * Returns:\n * - The original `path` when i18n is not configured.\n * - The original `path` for the default locale when\n * `prefixDefaultLocale` is false.\n * - `/{segment}{path}` for any other configured locale, where\n * `{segment}` is the locale's custom `path` if one is set,\n * otherwise the locale code.\n * - `null` when the row's locale isn't in the configured list.\n * Callers should drop the entry: a sitemap link to a route the\n * site can't serve is worse than no link at all (search engines\n * get a 404 / soft-404 and downrank the page).\n *\n * Falls back to `getI18nConfig()` (EmDash's mirror of the same config,\n * populated at runtime startup) when `astro:config/server` is\n * unavailable -- e.g. running outside an Astro build context, such as\n * in vitest.\n */\nexport async function localizePath(path: string, locale: string): Promise<string | null> {\n\tconst segment = await resolveLocaleSegment(locale);\n\tif (segment === undefined) return null;\n\tif (segment === null || segment === \"\") return normalizePath(path);\n\treturn normalizePath(`/${segment}${path}`);\n}\n\n/**\n * Resolve the URL segment to use for a locale.\n *\n * Returns:\n * - `null` when i18n isn't configured (caller should not prefix).\n * - `\"\"` when the locale is the default locale and\n * `prefixDefaultLocale` is false (caller should not prefix).\n * - The locale's custom `path` value, or the locale string itself.\n * - `undefined` when the locale isn't in the configured list --\n * the row points at a route the site can't serve.\n */\nasync function resolveLocaleSegment(locale: string): Promise<string | null | undefined> {\n\tconst i18n = await readAstroI18nConfig();\n\tif (!i18n || !i18n.locales || i18n.locales.length <= 1) return null;\n\n\tconst isDefault = locale === i18n.defaultLocale;\n\tif (isDefault && !i18n.prefixDefaultLocale) return \"\";\n\n\t// When the locale has a custom `path`/`codes` mapping, use the path\n\t// for the URL segment. Otherwise use the locale code directly.\n\tfor (const entry of i18n.locales) {\n\t\tif (typeof entry === \"string\") {\n\t\t\tif (entry === locale) return entry;\n\t\t} else if (entry.codes.includes(locale)) {\n\t\t\treturn entry.path;\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\ninterface AstroI18nConfig {\n\tdefaultLocale: string;\n\tlocales: Array<string | { codes: readonly string[]; path: string }>;\n\tprefixDefaultLocale?: boolean;\n}\n\nlet astroI18nCache: AstroI18nConfig | null | undefined;\n\nasync function readAstroI18nConfig(): Promise<AstroI18nConfig | null> {\n\tif (astroI18nCache !== undefined) return astroI18nCache;\n\n\ttry {\n\t\tconst mod = (await import(\"astro:config/server\")) as {\n\t\t\ti18n?: {\n\t\t\t\tdefaultLocale: string;\n\t\t\t\tlocales: Array<string | { codes: readonly string[]; path: string }>;\n\t\t\t\trouting?: { prefixDefaultLocale?: boolean } | string;\n\t\t\t};\n\t\t};\n\t\tif (!mod.i18n) {\n\t\t\tastroI18nCache = null;\n\t\t\treturn null;\n\t\t}\n\t\tconst routing = mod.i18n.routing;\n\t\tastroI18nCache = {\n\t\t\tdefaultLocale: mod.i18n.defaultLocale,\n\t\t\tlocales: mod.i18n.locales,\n\t\t\tprefixDefaultLocale:\n\t\t\t\ttypeof routing === \"object\" ? (routing.prefixDefaultLocale ?? false) : false,\n\t\t};\n\t\treturn astroI18nCache;\n\t} catch {\n\t\t// `astro:config/server` isn't resolvable (e.g. running under vitest\n\t\t// outside an Astro build). Fall back to EmDash's runtime config,\n\t\t// which is populated at startup via the same astroConfig object.\n\t\tconst cfg = getI18nConfig();\n\t\tif (!cfg || !isI18nEnabled()) {\n\t\t\tastroI18nCache = null;\n\t\t\treturn null;\n\t\t}\n\t\tastroI18nCache = {\n\t\t\tdefaultLocale: cfg.defaultLocale,\n\t\t\tlocales: cfg.locales,\n\t\t\tprefixDefaultLocale: cfg.prefixDefaultLocale,\n\t\t};\n\t\treturn astroI18nCache;\n\t}\n}\n\n/** @internal -- exposed for tests to reset the module-level cache. */\nexport function _resetAstroI18nCacheForTests(): void {\n\tastroI18nCache = undefined;\n}\n\nfunction normalizePath(path: string): string {\n\tlet p = path.replace(REPEATED_SLASHES, \"/\");\n\tif (p.length > 1 && p.endsWith(\"/\")) p = p.slice(0, -1);\n\tif (!p.startsWith(\"/\")) p = `/${p}`;\n\treturn p;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAiBA,SAAgB,cAAc,UAAuC;AACpE,KAAI,aAAa,OAAW,QAAO;CACnC,MAAM,YAAY,mBAAmB,EAAE;AACvC,KAAI,cAAc,OAAW,QAAO;CACpC,MAAM,MAAM,eAAe;AAC3B,KAAI,OAAO,eAAe,CAAE,QAAO,IAAI;;;;;;;AASxC,SAAgB,mBAAmB,UAA6B;CAC/D,MAAM,SAAS,cAAc,SAAS;AACtC,KAAI,WAAW,OAAW,QAAO,EAAE;AACnC,KAAI,CAAC,eAAe,CAAE,QAAO,CAAC,OAAO;AACrC,QAAO,iBAAiB,OAAO;;AAGhC,MAAM,mBAAmB;;;;;;;;;AAUzB,SAAgB,sBAAsB,SAK3B;CACV,MAAM,EAAE,SAAS,YAAY,MAAM,OAAO;CAE1C,IAAI,QADgB,WAAW,IAAI,mBAAmB,WAAW,CAAC,UAEhE,QAAQ,UAAU,mBAAmB,KAAK,CAAC,CAC3C,QAAQ,QAAQ,mBAAmB,GAAG,CAAC;AACzC,QAAO,KAAK,QAAQ,kBAAkB,IAAI;AAC1C,KAAI,KAAK,SAAS,KAAK,KAAK,SAAS,IAAI,CAAE,QAAO,KAAK,MAAM,GAAG,GAAG;AACnE,KAAI,CAAC,KAAK,WAAW,IAAI,CAAE,QAAO,IAAI;AACtC,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BR,eAAsB,aAAa,MAAc,QAAwC;CACxF,MAAM,UAAU,MAAM,qBAAqB,OAAO;AAClD,KAAI,YAAY,OAAW,QAAO;AAClC,KAAI,YAAY,QAAQ,YAAY,GAAI,QAAO,cAAc,KAAK;AAClE,QAAO,cAAc,IAAI,UAAU,OAAO;;;;;;;;;;;;;AAc3C,eAAe,qBAAqB,QAAoD;CACvF,MAAM,OAAO,MAAM,qBAAqB;AACxC,KAAI,CAAC,QAAQ,CAAC,KAAK,WAAW,KAAK,QAAQ,UAAU,EAAG,QAAO;AAG/D,KADkB,WAAW,KAAK,iBACjB,CAAC,KAAK,oBAAqB,QAAO;AAInD,MAAK,MAAM,SAAS,KAAK,QACxB,KAAI,OAAO,UAAU,UACpB;MAAI,UAAU,OAAQ,QAAO;YACnB,MAAM,MAAM,SAAS,OAAO,CACtC,QAAO,MAAM;;AAahB,IAAI;AAEJ,eAAe,sBAAuD;AACrE,KAAI,mBAAmB,OAAW,QAAO;AAEzC,KAAI;EACH,MAAM,MAAO,MAAM,OAAO;AAO1B,MAAI,CAAC,IAAI,MAAM;AACd,oBAAiB;AACjB,UAAO;;EAER,MAAM,UAAU,IAAI,KAAK;AACzB,mBAAiB;GAChB,eAAe,IAAI,KAAK;GACxB,SAAS,IAAI,KAAK;GAClB,qBACC,OAAO,YAAY,WAAY,QAAQ,uBAAuB,QAAS;GACxE;AACD,SAAO;SACA;EAIP,MAAM,MAAM,eAAe;AAC3B,MAAI,CAAC,OAAO,CAAC,eAAe,EAAE;AAC7B,oBAAiB;AACjB,UAAO;;AAER,mBAAiB;GAChB,eAAe,IAAI;GACnB,SAAS,IAAI;GACb,qBAAqB,IAAI;GACzB;AACD,SAAO;;;AAST,SAAS,cAAc,MAAsB;CAC5C,IAAI,IAAI,KAAK,QAAQ,kBAAkB,IAAI;AAC3C,KAAI,EAAE,SAAS,KAAK,EAAE,SAAS,IAAI,CAAE,KAAI,EAAE,MAAM,GAAG,GAAG;AACvD,KAAI,CAAC,EAAE,WAAW,IAAI,CAAE,KAAI,IAAI;AAChC,QAAO"}
@@ -1,4 +1,4 @@
1
- import { t as Database } from "./types-_HFLRzTn.mjs";
1
+ import { t as Database } from "./types-momGysZk.mjs";
2
2
  import { Kysely } from "kysely";
3
3
 
4
4
  //#region src/database/migrations/runner.d.ts
@@ -8,6 +8,12 @@ interface MigrationStatus {
8
8
  }
9
9
  interface MigrationOptions {
10
10
  migrationTableSchema?: string;
11
+ /**
12
+ * Override how long to wait for a concurrent migrator to finish before
13
+ * giving up. Defaults to MIGRATION_RACE_WAIT_MS; tests shorten it so the
14
+ * give-up path doesn't take 10 seconds per case.
15
+ */
16
+ raceWaitMs?: number;
11
17
  }
12
18
  /**
13
19
  * Get migration status
@@ -44,4 +50,4 @@ declare function rollbackMigration(db: Kysely<Database>, options?: MigrationOpti
44
50
  }>;
45
51
  //#endregion
46
52
  export { runMigrations as i, getMigrationStatus as n, rollbackMigration as r, MigrationStatus as t };
47
- //# sourceMappingURL=runner-DvFWoz8-.d.mts.map
53
+ //# sourceMappingURL=runner-CiNdIk3y.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-CiNdIk3y.d.mts","names":[],"sources":["../src/database/migrations/runner.ts"],"mappings":";;;;UAyHiB,eAAA;EAChB,OAAA;EACA,OAAA;AAAA;AAAA,UAyBgB,gBAAA;EAChB,oBAAA;EAyBE;;;;;EAnBF,UAAA;AAAA;;;;iBAgBqB,kBAAA,CACrB,EAAA,EAAI,MAAA,CAAO,QAAA,GACX,OAAA,GAAU,gBAAA,GACR,OAAA,CAAQ,eAAA;;;;;;;;;;;;;AAoOX;;;;;;;;iBA7DsB,aAAA,CACrB,EAAA,EAAI,MAAA,CAAO,QAAA,GACX,OAAA,GAAU,gBAAA,GACR,OAAA;EAAU,OAAA;AAAA;;;;iBA0DS,iBAAA,CACrB,EAAA,EAAI,MAAA,CAAO,QAAA,GACX,OAAA,GAAU,gBAAA,GACR,OAAA;EAAU,UAAA;AAAA"}