emdash 0.16.0 → 0.17.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 (562) hide show
  1. package/dist/{adapters-C4yd_UJR.d.mts → adapters-C5AWLJSD.d.mts} +1 -1
  2. package/dist/{adapters-C4yd_UJR.d.mts.map → adapters-C5AWLJSD.d.mts.map} +1 -1
  3. package/dist/{allowed-origins-D0fFk9a6.mjs → allowed-origins-CyYLEJkp.mjs} +2 -2
  4. package/dist/{allowed-origins-D0fFk9a6.mjs.map → allowed-origins-CyYLEJkp.mjs.map} +1 -1
  5. package/dist/api/route-utils.d.mts +3 -3
  6. package/dist/api/route-utils.mjs +16 -16
  7. package/dist/api/schemas/index.d.mts +2 -2
  8. package/dist/api/schemas/index.mjs +3 -3
  9. package/dist/{api-BNKqxyFX.mjs → api-Dmz40c2V.mjs} +44 -22
  10. package/dist/api-Dmz40c2V.mjs.map +1 -0
  11. package/dist/{api-tokens-ucpcNXDt.mjs → api-tokens-VrXNiNvV.mjs} +2 -2
  12. package/dist/{api-tokens-ucpcNXDt.mjs.map → api-tokens-VrXNiNvV.mjs.map} +1 -1
  13. package/dist/{apply-BOPaD-s9.mjs → apply-CgamLmed.mjs} +93 -31
  14. package/dist/apply-CgamLmed.mjs.map +1 -0
  15. package/dist/astro/index.d.mts +10 -10
  16. package/dist/astro/index.mjs +19 -3
  17. package/dist/astro/index.mjs.map +1 -1
  18. package/dist/astro/middleware/auth.d.mts +9 -9
  19. package/dist/astro/middleware/auth.mjs +6 -6
  20. package/dist/astro/middleware/redirect.d.mts.map +1 -1
  21. package/dist/astro/middleware/redirect.mjs +9 -5
  22. package/dist/astro/middleware/redirect.mjs.map +1 -1
  23. package/dist/astro/middleware/request-context.mjs +2 -2
  24. package/dist/astro/middleware/setup.mjs +1 -1
  25. package/dist/astro/middleware.mjs +66 -65
  26. package/dist/astro/middleware.mjs.map +1 -1
  27. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +5 -5
  28. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +5 -5
  29. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
  30. package/dist/astro/routes/api/admin/api-tokens/index.mjs +5 -5
  31. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.d.mts +8 -0
  32. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.d.mts.map +1 -0
  33. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +23 -0
  34. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs.map +1 -0
  35. package/dist/astro/routes/api/admin/byline-fields/_slug_.d.mts +10 -0
  36. package/dist/astro/routes/api/admin/byline-fields/_slug_.d.mts.map +1 -0
  37. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +55 -0
  38. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs.map +1 -0
  39. package/dist/astro/routes/api/admin/byline-fields/index.d.mts +9 -0
  40. package/dist/astro/routes/api/admin/byline-fields/index.d.mts.map +1 -0
  41. package/dist/astro/routes/api/admin/byline-fields/index.mjs +43 -0
  42. package/dist/astro/routes/api/admin/byline-fields/index.mjs.map +1 -0
  43. package/dist/astro/routes/api/admin/byline-fields/reorder.d.mts +8 -0
  44. package/dist/astro/routes/api/admin/byline-fields/reorder.d.mts.map +1 -0
  45. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +27 -0
  46. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs.map +1 -0
  47. package/dist/astro/routes/api/admin/bylines/_id_/index.d.mts.map +1 -1
  48. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +27 -28
  49. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
  50. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +13 -12
  51. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
  52. package/dist/astro/routes/api/admin/bylines/index.mjs +15 -13
  53. package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
  54. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +10 -10
  55. package/dist/astro/routes/api/admin/comments/_id_.mjs +5 -5
  56. package/dist/astro/routes/api/admin/comments/bulk.mjs +8 -8
  57. package/dist/astro/routes/api/admin/comments/counts.mjs +5 -5
  58. package/dist/astro/routes/api/admin/comments/index.mjs +8 -8
  59. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +4 -4
  60. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
  61. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +4 -4
  62. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +4 -4
  63. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +35 -34
  64. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
  65. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +35 -34
  66. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
  67. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +34 -33
  68. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  69. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +34 -33
  70. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  71. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +34 -33
  72. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  73. package/dist/astro/routes/api/admin/plugins/index.mjs +34 -33
  74. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  75. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +3 -3
  76. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +34 -33
  77. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  78. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +34 -33
  79. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
  80. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +34 -33
  81. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
  82. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +34 -33
  83. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
  84. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +35 -34
  85. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
  86. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +34 -33
  87. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
  88. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +35 -34
  89. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  90. package/dist/astro/routes/api/admin/plugins/updates.mjs +34 -33
  91. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  92. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +34 -33
  93. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  94. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +3 -3
  95. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +34 -33
  96. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  97. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +2 -2
  98. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +2 -2
  99. package/dist/astro/routes/api/admin/users/_id_/index.mjs +5 -5
  100. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +3 -3
  101. package/dist/astro/routes/api/admin/users/index.mjs +5 -5
  102. package/dist/astro/routes/api/auth/dev-bypass.mjs +5 -5
  103. package/dist/astro/routes/api/auth/invite/accept.mjs +2 -2
  104. package/dist/astro/routes/api/auth/invite/complete.mjs +9 -9
  105. package/dist/astro/routes/api/auth/invite/index.mjs +6 -6
  106. package/dist/astro/routes/api/auth/invite/register-options.mjs +8 -8
  107. package/dist/astro/routes/api/auth/logout.mjs +3 -3
  108. package/dist/astro/routes/api/auth/magic-link/send.mjs +8 -8
  109. package/dist/astro/routes/api/auth/magic-link/verify.mjs +3 -3
  110. package/dist/astro/routes/api/auth/me.d.mts.map +1 -1
  111. package/dist/astro/routes/api/auth/me.mjs +18 -11
  112. package/dist/astro/routes/api/auth/me.mjs.map +1 -1
  113. package/dist/astro/routes/api/auth/mode.mjs +1 -1
  114. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
  115. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  116. package/dist/astro/routes/api/auth/passkey/_id_.mjs +5 -5
  117. package/dist/astro/routes/api/auth/passkey/index.mjs +2 -2
  118. package/dist/astro/routes/api/auth/passkey/options.mjs +10 -10
  119. package/dist/astro/routes/api/auth/passkey/register/options.mjs +8 -8
  120. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +9 -9
  121. package/dist/astro/routes/api/auth/passkey/verify.mjs +9 -9
  122. package/dist/astro/routes/api/auth/signup/complete.mjs +9 -9
  123. package/dist/astro/routes/api/auth/signup/request.mjs +8 -8
  124. package/dist/astro/routes/api/auth/signup/verify.mjs +2 -2
  125. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +11 -11
  126. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +3 -3
  127. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +3 -3
  128. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +3 -3
  129. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +3 -3
  130. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +9 -9
  131. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +6 -6
  132. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +3 -3
  133. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +3 -3
  134. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +6 -6
  135. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.d.mts.map +1 -1
  136. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +18 -13
  137. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
  138. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +3 -3
  139. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +3 -3
  140. package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
  141. package/dist/astro/routes/api/content/_collection_/_id_.mjs +9 -7
  142. package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
  143. package/dist/astro/routes/api/content/_collection_/index.mjs +6 -6
  144. package/dist/astro/routes/api/content/_collection_/trash.mjs +6 -6
  145. package/dist/astro/routes/api/dashboard.mjs +7 -7
  146. package/dist/astro/routes/api/dev/emails.mjs +3 -3
  147. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  148. package/dist/astro/routes/api/import/probe.mjs +10 -10
  149. package/dist/astro/routes/api/import/wordpress/analyze.mjs +4 -4
  150. package/dist/astro/routes/api/import/wordpress/execute.d.mts +9 -9
  151. package/dist/astro/routes/api/import/wordpress/execute.mjs +11 -10
  152. package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
  153. package/dist/astro/routes/api/import/wordpress/media.mjs +8 -8
  154. package/dist/astro/routes/api/import/wordpress/prepare.mjs +9 -9
  155. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +8 -8
  156. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  157. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +10 -10
  158. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +1 -1
  159. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +13 -11
  160. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
  161. package/dist/astro/routes/api/manifest.mjs +4 -4
  162. package/dist/astro/routes/api/mcp.mjs +34 -30
  163. package/dist/astro/routes/api/mcp.mjs.map +1 -1
  164. package/dist/astro/routes/api/media/_id_/confirm.mjs +6 -6
  165. package/dist/astro/routes/api/media/_id_.mjs +6 -6
  166. package/dist/astro/routes/api/media/file/_...key_.mjs +2 -2
  167. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +3 -3
  168. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +3 -3
  169. package/dist/astro/routes/api/media/providers/index.mjs +3 -3
  170. package/dist/astro/routes/api/media/upload-url.mjs +8 -8
  171. package/dist/astro/routes/api/media.d.mts.map +1 -1
  172. package/dist/astro/routes/api/media.mjs +13 -12
  173. package/dist/astro/routes/api/media.mjs.map +1 -1
  174. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +7 -7
  175. package/dist/astro/routes/api/menus/_name_/items.mjs +7 -7
  176. package/dist/astro/routes/api/menus/_name_/reorder.mjs +7 -7
  177. package/dist/astro/routes/api/menus/_name_/translations.mjs +7 -7
  178. package/dist/astro/routes/api/menus/_name_.mjs +7 -7
  179. package/dist/astro/routes/api/menus/index.mjs +7 -7
  180. package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
  181. package/dist/astro/routes/api/oauth/device/authorize.mjs +6 -6
  182. package/dist/astro/routes/api/oauth/device/code.mjs +9 -9
  183. package/dist/astro/routes/api/oauth/device/token.mjs +8 -8
  184. package/dist/astro/routes/api/oauth/register.mjs +3 -3
  185. package/dist/astro/routes/api/oauth/token/refresh.mjs +6 -6
  186. package/dist/astro/routes/api/oauth/token/revoke.mjs +6 -6
  187. package/dist/astro/routes/api/oauth/token.mjs +6 -6
  188. package/dist/astro/routes/api/openapi.json.mjs +10 -7
  189. package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
  190. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +4 -4
  191. package/dist/astro/routes/api/redirects/404s/index.mjs +8 -8
  192. package/dist/astro/routes/api/redirects/404s/summary.mjs +8 -8
  193. package/dist/astro/routes/api/redirects/_id_.mjs +9 -9
  194. package/dist/astro/routes/api/redirects/index.mjs +9 -9
  195. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +3 -3
  196. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +3 -3
  197. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +34 -33
  198. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  199. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +34 -33
  200. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  201. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +34 -33
  202. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  203. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +34 -33
  204. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  205. package/dist/astro/routes/api/schema/collections/index.mjs +34 -33
  206. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  207. package/dist/astro/routes/api/schema/index.mjs +6 -6
  208. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +34 -33
  209. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  210. package/dist/astro/routes/api/schema/orphans/index.mjs +34 -33
  211. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  212. package/dist/astro/routes/api/search/enable.mjs +9 -9
  213. package/dist/astro/routes/api/search/index.mjs +8 -8
  214. package/dist/astro/routes/api/search/rebuild.mjs +9 -9
  215. package/dist/astro/routes/api/search/stats.mjs +6 -6
  216. package/dist/astro/routes/api/search/suggest.mjs +8 -8
  217. package/dist/astro/routes/api/sections/_slug_.mjs +8 -8
  218. package/dist/astro/routes/api/sections/index.mjs +8 -8
  219. package/dist/astro/routes/api/settings/email.mjs +4 -4
  220. package/dist/astro/routes/api/settings.mjs +11 -11
  221. package/dist/astro/routes/api/setup/admin-verify.mjs +10 -10
  222. package/dist/astro/routes/api/setup/admin.mjs +9 -9
  223. package/dist/astro/routes/api/setup/dev-bypass.mjs +24 -23
  224. package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
  225. package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
  226. package/dist/astro/routes/api/setup/index.mjs +24 -23
  227. package/dist/astro/routes/api/setup/index.mjs.map +1 -1
  228. package/dist/astro/routes/api/setup/status.mjs +4 -4
  229. package/dist/astro/routes/api/snapshot.mjs +5 -5
  230. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +12 -12
  231. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +12 -12
  232. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +12 -12
  233. package/dist/astro/routes/api/taxonomies/index.mjs +12 -12
  234. package/dist/astro/routes/api/themes/preview.mjs +5 -5
  235. package/dist/astro/routes/api/typegen.mjs +5 -5
  236. package/dist/astro/routes/api/well-known/auth.mjs +1 -1
  237. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
  238. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
  239. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +6 -6
  240. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +8 -8
  241. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +8 -8
  242. package/dist/astro/routes/api/widget-areas/_name_.mjs +5 -5
  243. package/dist/astro/routes/api/widget-areas/index.mjs +8 -8
  244. package/dist/astro/routes/api/widget-components.mjs +3 -3
  245. package/dist/astro/routes/robots.txt.mjs +6 -6
  246. package/dist/astro/routes/sitemap-_collection_.xml.mjs +8 -8
  247. package/dist/astro/routes/sitemap.xml.mjs +7 -7
  248. package/dist/astro/types.d.mts +13 -12
  249. package/dist/astro/types.d.mts.map +1 -1
  250. package/dist/auth/providers/github.d.mts +1 -1
  251. package/dist/auth/providers/google.d.mts +1 -1
  252. package/dist/{authorize-Bn4S4DUT.mjs → authorize-_wWM_44T.mjs} +2 -2
  253. package/dist/{authorize-Bn4S4DUT.mjs.map → authorize-_wWM_44T.mjs.map} +1 -1
  254. package/dist/byline-BrIVWLm-.mjs +925 -0
  255. package/dist/byline-BrIVWLm-.mjs.map +1 -0
  256. package/dist/{bylines-B2_XmnSU.d.mts → byline-fields-BNy7Ng1U.d.mts} +154 -26
  257. package/dist/byline-fields-BNy7Ng1U.d.mts.map +1 -0
  258. package/dist/byline-fields-DC3Wkk-U.mjs +123 -0
  259. package/dist/byline-fields-DC3Wkk-U.mjs.map +1 -0
  260. package/dist/byline-fields-Dr-xcb6S.mjs +238 -0
  261. package/dist/byline-fields-Dr-xcb6S.mjs.map +1 -0
  262. package/dist/byline-registry-CxK5g559.mjs +406 -0
  263. package/dist/byline-registry-CxK5g559.mjs.map +1 -0
  264. package/dist/{bylines-n6nykUyI.mjs → bylines-C_POWmGT.mjs} +25 -11
  265. package/dist/{bylines-n6nykUyI.mjs.map → bylines-C_POWmGT.mjs.map} +1 -1
  266. package/dist/bylines-sqExMElV.mjs +204 -0
  267. package/dist/bylines-sqExMElV.mjs.map +1 -0
  268. package/dist/{cache-BcI1yUjR.mjs → cache-wsDkA8ru.mjs} +2 -2
  269. package/dist/{cache-BcI1yUjR.mjs.map → cache-wsDkA8ru.mjs.map} +1 -1
  270. package/dist/{challenge-store-Dng1SxKT.mjs → challenge-store-DGwuCc4R.mjs} +1 -1
  271. package/dist/{challenge-store-Dng1SxKT.mjs.map → challenge-store-DGwuCc4R.mjs.map} +1 -1
  272. package/dist/{chunks-cYG4SnIP.mjs → chunks-BAYkM-CF.mjs} +2 -2
  273. package/dist/{chunks-cYG4SnIP.mjs.map → chunks-BAYkM-CF.mjs.map} +1 -1
  274. package/dist/cli/index.mjs +29 -23
  275. package/dist/cli/index.mjs.map +1 -1
  276. package/dist/client/cf-access.d.mts +1 -1
  277. package/dist/client/index.d.mts +2 -1
  278. package/dist/client/index.d.mts.map +1 -1
  279. package/dist/client/index.mjs +4 -2
  280. package/dist/client/index.mjs.map +1 -1
  281. package/dist/{comment-C76G-9tz.mjs → comment-Cd29aktf.mjs} +2 -2
  282. package/dist/{comment-C76G-9tz.mjs.map → comment-Cd29aktf.mjs.map} +1 -1
  283. package/dist/{comments-CCxFFGY1.mjs → comments-B7ufhkxN.mjs} +3 -3
  284. package/dist/{comments-CCxFFGY1.mjs.map → comments-B7ufhkxN.mjs.map} +1 -1
  285. package/dist/{components-Dx3DM0gg.mjs → components-CTfpu3PZ.mjs} +1 -1
  286. package/dist/{components-Dx3DM0gg.mjs.map → components-CTfpu3PZ.mjs.map} +1 -1
  287. package/dist/{content-8voQNTXX.mjs → content-BbqKo3Kc.mjs} +22 -3
  288. package/dist/content-BbqKo3Kc.mjs.map +1 -0
  289. package/dist/{context-B7qiYrz2.mjs → context-BsF1rhoI.mjs} +9 -9
  290. package/dist/{context-B7qiYrz2.mjs.map → context-BsF1rhoI.mjs.map} +1 -1
  291. package/dist/{cron-Bd3b3iuj.mjs → cron-DZovZUnC.mjs} +1 -1
  292. package/dist/{cron-Bd3b3iuj.mjs.map → cron-DZovZUnC.mjs.map} +1 -1
  293. package/dist/{dashboard-BeaFSPpx.mjs → dashboard-BwIX9r-X.mjs} +4 -4
  294. package/dist/{dashboard-BeaFSPpx.mjs.map → dashboard-BwIX9r-X.mjs.map} +1 -1
  295. package/dist/db/index.d.mts +3 -3
  296. package/dist/db/index.mjs +1 -1
  297. package/dist/db/libsql.d.mts +1 -1
  298. package/dist/db/postgres.d.mts +1 -1
  299. package/dist/db/sqlite.d.mts +1 -1
  300. package/dist/{db-errors-BiYqoX-n.mjs → db-errors-CtzxKBxe.mjs} +1 -1
  301. package/dist/{db-errors-BiYqoX-n.mjs.map → db-errors-CtzxKBxe.mjs.map} +1 -1
  302. package/dist/{default-BvTAYCzx.mjs → default-xLFNSsZ9.mjs} +1 -1
  303. package/dist/{default-BvTAYCzx.mjs.map → default-xLFNSsZ9.mjs.map} +1 -1
  304. package/dist/{device-flow-B9oG8PwP.mjs → device-flow-ptLrVINd.mjs} +4 -4
  305. package/dist/{device-flow-B9oG8PwP.mjs.map → device-flow-ptLrVINd.mjs.map} +1 -1
  306. package/dist/{email-console-CubRll9q.mjs → email-console-DHT2Fbpj.mjs} +1 -1
  307. package/dist/{email-console-CubRll9q.mjs.map → email-console-DHT2Fbpj.mjs.map} +1 -1
  308. package/dist/{error-ChfADBuu.mjs → error-npZWBSb7.mjs} +7 -3
  309. package/dist/error-npZWBSb7.mjs.map +1 -0
  310. package/dist/{escape-Cg6kMELH.mjs → escape-bIyGoW5W.mjs} +1 -1
  311. package/dist/{escape-Cg6kMELH.mjs.map → escape-bIyGoW5W.mjs.map} +1 -1
  312. package/dist/{fts-manager-C_b-4x8u.mjs → fts-manager-DmUAk-kQ.mjs} +2 -2
  313. package/dist/{fts-manager-C_b-4x8u.mjs.map → fts-manager-DmUAk-kQ.mjs.map} +1 -1
  314. package/dist/{hash-DlUxGhQS.mjs → hash-9w3pd3-m.mjs} +1 -1
  315. package/dist/{hash-DlUxGhQS.mjs.map → hash-9w3pd3-m.mjs.map} +1 -1
  316. package/dist/{import-DG80rC_I.mjs → import-Dh8bWmyq.mjs} +3 -3
  317. package/dist/{import-DG80rC_I.mjs.map → import-Dh8bWmyq.mjs.map} +1 -1
  318. package/dist/{index-BPZFAcgE.d.mts → index-CjKdMZ3U.d.mts} +39 -17
  319. package/dist/index-CjKdMZ3U.d.mts.map +1 -0
  320. package/dist/{index-CC42STEm.d.mts → index-D60_SzHG.d.mts} +3 -3
  321. package/dist/{index-CC42STEm.d.mts.map → index-D60_SzHG.d.mts.map} +1 -1
  322. package/dist/index.d.mts +17 -17
  323. package/dist/index.mjs +55 -54
  324. package/dist/{load-CLFRjk9r.mjs → load-DsoLq7ex.mjs} +2 -2
  325. package/dist/{load-CLFRjk9r.mjs.map → load-DsoLq7ex.mjs.map} +1 -1
  326. package/dist/{loader-D-vIJjfY.mjs → loader-CJ6lWO0d.mjs} +75 -19
  327. package/dist/loader-CJ6lWO0d.mjs.map +1 -0
  328. package/dist/{manifest-schema-Czqf0TLu.mjs → manifest-schema-Cj-YrzrF.mjs} +1 -1
  329. package/dist/{manifest-schema-Czqf0TLu.mjs.map → manifest-schema-Cj-YrzrF.mjs.map} +1 -1
  330. package/dist/media/index.d.mts +1 -1
  331. package/dist/media/index.mjs +2 -2
  332. package/dist/media/local-runtime.d.mts +11 -11
  333. package/dist/media/local-runtime.mjs +5 -5
  334. package/dist/{media-allowlist-BNloC69x.mjs → media-allowlist-CMcoYIjQ.mjs} +2 -2
  335. package/dist/{media-allowlist-BNloC69x.mjs.map → media-allowlist-CMcoYIjQ.mjs.map} +1 -1
  336. package/dist/{media-CKQd8AYU.mjs → media-jk_HzzOl.mjs} +7 -2
  337. package/dist/media-jk_HzzOl.mjs.map +1 -0
  338. package/dist/{menus-arUNspyU.mjs → menus-B-5-3aon.mjs} +2 -2
  339. package/dist/{menus-arUNspyU.mjs.map → menus-B-5-3aon.mjs.map} +1 -1
  340. package/dist/{menus-C-nWT5Tu.mjs → menus-CyMO6GBx.mjs} +27 -11
  341. package/dist/menus-CyMO6GBx.mjs.map +1 -0
  342. package/dist/{mime-KV5TqkMN.mjs → mime-CCEzze7W.mjs} +1 -1
  343. package/dist/{mime-KV5TqkMN.mjs.map → mime-CCEzze7W.mjs.map} +1 -1
  344. package/dist/{mode-CaaiebZI.mjs → mode-BjlXswIw.mjs} +1 -1
  345. package/dist/{mode-CaaiebZI.mjs.map → mode-BjlXswIw.mjs.map} +1 -1
  346. package/dist/{normalize-CN5kRSMC.mjs → normalize-DVV8nbrL.mjs} +1 -1
  347. package/dist/{normalize-CN5kRSMC.mjs.map → normalize-DVV8nbrL.mjs.map} +1 -1
  348. package/dist/{oauth-authorization-CTMeVfvj.mjs → oauth-authorization-DvBAL75d.mjs} +4 -4
  349. package/dist/{oauth-authorization-CTMeVfvj.mjs.map → oauth-authorization-DvBAL75d.mjs.map} +1 -1
  350. package/dist/{oauth-clients-eJCbkVSG.mjs → oauth-clients-8mPDStMv.mjs} +1 -1
  351. package/dist/{oauth-clients-eJCbkVSG.mjs.map → oauth-clients-8mPDStMv.mjs.map} +1 -1
  352. package/dist/{oauth-state-store-vOSdOeGe.mjs → oauth-state-store-BJ7YtrfD.mjs} +1 -1
  353. package/dist/{oauth-state-store-vOSdOeGe.mjs.map → oauth-state-store-BJ7YtrfD.mjs.map} +1 -1
  354. package/dist/{oauth-user-lookup-3JwsVw6N.mjs → oauth-user-lookup-BdDSDvjF.mjs} +1 -1
  355. package/dist/{oauth-user-lookup-3JwsVw6N.mjs.map → oauth-user-lookup-BdDSDvjF.mjs.map} +1 -1
  356. package/dist/{options-DhV-gwJb.d.mts → options-tb7DJROi.d.mts} +3 -3
  357. package/dist/{options-DhV-gwJb.d.mts.map → options-tb7DJROi.d.mts.map} +1 -1
  358. package/dist/page/index.d.mts +2 -2
  359. package/dist/{parse-DHbXfvxO.mjs → parse-4zO5Y2DL.mjs} +2 -2
  360. package/dist/{parse-DHbXfvxO.mjs.map → parse-4zO5Y2DL.mjs.map} +1 -1
  361. package/dist/{passkey-config-BloQOT3y.mjs → passkey-config-BDVM86Tj.mjs} +1 -1
  362. package/dist/{passkey-config-BloQOT3y.mjs.map → passkey-config-BDVM86Tj.mjs.map} +1 -1
  363. package/dist/{placeholder-KCkkCtgQ.d.mts → placeholder-B9lUUEmj.d.mts} +1 -1
  364. package/dist/{placeholder-KCkkCtgQ.d.mts.map → placeholder-B9lUUEmj.d.mts.map} +1 -1
  365. package/dist/{placeholder-LqmHqvBw.mjs → placeholder-BZxr8W1j.mjs} +1 -1
  366. package/dist/{placeholder-LqmHqvBw.mjs.map → placeholder-BZxr8W1j.mjs.map} +1 -1
  367. package/dist/plugin-types.d.mts +1 -1
  368. package/dist/plugin-utils.d.mts +9 -9
  369. package/dist/plugins/adapt-sandbox-entry.d.mts +9 -9
  370. package/dist/plugins/adapt-sandbox-entry.mjs +2 -2
  371. package/dist/{preview-D4z0WONU.mjs → preview-BfuRkVKW.mjs} +2 -2
  372. package/dist/{preview-D4z0WONU.mjs.map → preview-BfuRkVKW.mjs.map} +1 -1
  373. package/dist/{public-url-CUWWFME2.mjs → public-url-egRHCy1m.mjs} +1 -1
  374. package/dist/{public-url-CUWWFME2.mjs.map → public-url-egRHCy1m.mjs.map} +1 -1
  375. package/dist/{query-7m6-l0f_.mjs → query-CuvjwhrE.mjs} +12 -12
  376. package/dist/{query-7m6-l0f_.mjs.map → query-CuvjwhrE.mjs.map} +1 -1
  377. package/dist/{rate-limit-D8RAXN8b.mjs → rate-limit-D6VQqBk_.mjs} +2 -2
  378. package/dist/{rate-limit-D8RAXN8b.mjs.map → rate-limit-D6VQqBk_.mjs.map} +1 -1
  379. package/dist/{redirect-CjfDGrTd.mjs → redirect-BZUJltlj.mjs} +2 -2
  380. package/dist/{redirect-CjfDGrTd.mjs.map → redirect-BZUJltlj.mjs.map} +1 -1
  381. package/dist/{redirect-BINiRYq4.mjs → redirect-Cw3JTlmj.mjs} +1 -1
  382. package/dist/{redirect-BINiRYq4.mjs.map → redirect-Cw3JTlmj.mjs.map} +1 -1
  383. package/dist/{redirects-COMLwsV5.mjs → redirects-C0L9JUk4.mjs} +19 -6
  384. package/dist/redirects-C0L9JUk4.mjs.map +1 -0
  385. package/dist/{redirects-CowoEHdE.mjs → redirects-DnYuqsEf.mjs} +3 -3
  386. package/dist/{redirects-CowoEHdE.mjs.map → redirects-DnYuqsEf.mjs.map} +1 -1
  387. package/dist/{registry-Cyp-dx6J.mjs → registry-Dn6gsx3L.mjs} +13 -5
  388. package/dist/{registry-Cyp-dx6J.mjs.map → registry-Dn6gsx3L.mjs.map} +1 -1
  389. package/dist/{request-cache-dzCt8TZB.mjs → request-cache-BYMs-BGX.mjs} +23 -2
  390. package/dist/{request-cache-dzCt8TZB.mjs.map → request-cache-BYMs-BGX.mjs.map} +1 -1
  391. package/dist/{request-meta-C_Cjii-T.mjs → request-meta-7ByVLxB-.mjs} +2 -2
  392. package/dist/{request-meta-C_Cjii-T.mjs.map → request-meta-7ByVLxB-.mjs.map} +1 -1
  393. package/dist/{resolve-D6sM-SgF.mjs → resolve-BqYMVG0D.mjs} +1 -1
  394. package/dist/{resolve-D6sM-SgF.mjs.map → resolve-BqYMVG0D.mjs.map} +1 -1
  395. package/dist/{runner-DSQBurMS.d.mts → runner-DM1yR5qd.d.mts} +2 -2
  396. package/dist/{runner-DSQBurMS.d.mts.map → runner-DM1yR5qd.d.mts.map} +1 -1
  397. package/dist/{runner-Drnvs96u.mjs → runner-eAgyIkeg.mjs} +284 -158
  398. package/dist/runner-eAgyIkeg.mjs.map +1 -0
  399. package/dist/runtime.d.mts +10 -10
  400. package/dist/runtime.mjs +2 -2
  401. package/dist/{schema-CI9mYPX3.mjs → schema--mYZX4D7.mjs} +5 -5
  402. package/dist/{schema-CI9mYPX3.mjs.map → schema--mYZX4D7.mjs.map} +1 -1
  403. package/dist/{search-DKz_mGBP.mjs → search-C6U_NvZI.mjs} +4 -4
  404. package/dist/{search-DKz_mGBP.mjs.map → search-C6U_NvZI.mjs.map} +1 -1
  405. package/dist/{secrets-rPdhEBkD.mjs → secrets-YYbTgB1w.mjs} +1 -1
  406. package/dist/{secrets-rPdhEBkD.mjs.map → secrets-YYbTgB1w.mjs.map} +1 -1
  407. package/dist/{sections-DBbCDIAT.mjs → sections-Ba-rJLKb.mjs} +3 -3
  408. package/dist/{sections-DBbCDIAT.mjs.map → sections-Ba-rJLKb.mjs.map} +1 -1
  409. package/dist/seed/index.d.mts +2 -2
  410. package/dist/seed/index.mjs +18 -17
  411. package/dist/seo/index.d.mts +1 -1
  412. package/dist/{seo-BGCyDlkb.mjs → seo-BTzb5ksq.mjs} +2 -2
  413. package/dist/{seo-BGCyDlkb.mjs.map → seo-BTzb5ksq.mjs.map} +1 -1
  414. package/dist/{seo-Dq707mNQ.mjs → seo-DfjLvu8i.mjs} +1 -1
  415. package/dist/{seo-Dq707mNQ.mjs.map → seo-DfjLvu8i.mjs.map} +1 -1
  416. package/dist/{service-B0H7U1Y9.mjs → service-Cn-kIfZn.mjs} +3 -3
  417. package/dist/{service-B0H7U1Y9.mjs.map → service-Cn-kIfZn.mjs.map} +1 -1
  418. package/dist/{settings-DfwNyQkf.mjs → settings-C65OSm41.mjs} +3 -3
  419. package/dist/{settings-DfwNyQkf.mjs.map → settings-C65OSm41.mjs.map} +1 -1
  420. package/dist/{settings-BSXRtTzk.mjs → settings-ChlQbwU0.mjs} +4 -4
  421. package/dist/{settings-BSXRtTzk.mjs.map → settings-ChlQbwU0.mjs.map} +1 -1
  422. package/dist/{setup-complete-MzzN9u0b.mjs → setup-complete-VoEZfasi.mjs} +1 -1
  423. package/dist/{setup-complete-MzzN9u0b.mjs.map → setup-complete-VoEZfasi.mjs.map} +1 -1
  424. package/dist/{setup-nonce-DXuriHsg.mjs → setup-nonce-Bm0uKqmf.mjs} +1 -1
  425. package/dist/{setup-nonce-DXuriHsg.mjs.map → setup-nonce-Bm0uKqmf.mjs.map} +1 -1
  426. package/dist/{site-url-xkhw1tcz.mjs → site-url-Cm8-sJy7.mjs} +1 -1
  427. package/dist/{site-url-xkhw1tcz.mjs.map → site-url-Cm8-sJy7.mjs.map} +1 -1
  428. package/dist/{ssrf-MZ-zrG6-.mjs → ssrf-BsVGIE0Z.mjs} +1 -1
  429. package/dist/{ssrf-MZ-zrG6-.mjs.map → ssrf-BsVGIE0Z.mjs.map} +1 -1
  430. package/dist/storage/local.d.mts +1 -1
  431. package/dist/storage/local.mjs +1 -1
  432. package/dist/storage/s3.d.mts +1 -1
  433. package/dist/storage/s3.mjs +1 -1
  434. package/dist/{taxonomies-CcvrMLbR.mjs → taxonomies-CgpzAU6F.mjs} +8 -8
  435. package/dist/{taxonomies-CcvrMLbR.mjs.map → taxonomies-CgpzAU6F.mjs.map} +1 -1
  436. package/dist/{taxonomies-4vx0nmMr.mjs → taxonomies-D72gTOg_.mjs} +4 -4
  437. package/dist/{taxonomies-4vx0nmMr.mjs.map → taxonomies-D72gTOg_.mjs.map} +1 -1
  438. package/dist/{taxonomy-zqGQUqgu.mjs → taxonomy-BBK-UAEo.mjs} +3 -3
  439. package/dist/{taxonomy-zqGQUqgu.mjs.map → taxonomy-BBK-UAEo.mjs.map} +1 -1
  440. package/dist/{tokens-N8otWMmj.mjs → tokens-Bx2afeT-.mjs} +1 -1
  441. package/dist/{tokens-N8otWMmj.mjs.map → tokens-Bx2afeT-.mjs.map} +1 -1
  442. package/dist/{transport-B6CHddbu.mjs → transport--Ck3RBin.mjs} +1 -1
  443. package/dist/{transport-B6CHddbu.mjs.map → transport--Ck3RBin.mjs.map} +1 -1
  444. package/dist/{transport-C2MGqtL6.d.mts → transport-OnMNbsIA.d.mts} +1 -1
  445. package/dist/{transport-C2MGqtL6.d.mts.map → transport-OnMNbsIA.d.mts.map} +1 -1
  446. package/dist/{trusted-proxy-97pajC2f.mjs → trusted-proxy-B4AfnoAp.mjs} +1 -1
  447. package/dist/{trusted-proxy-97pajC2f.mjs.map → trusted-proxy-B4AfnoAp.mjs.map} +1 -1
  448. package/dist/types-D8bhH891.mjs +125 -0
  449. package/dist/{types-DSZl1Dsv.mjs.map → types-D8bhH891.mjs.map} +1 -1
  450. package/dist/{types-DGHWRQgr.d.mts → types-DMwSpvcw.d.mts} +2 -2
  451. package/dist/{types-DGHWRQgr.d.mts.map → types-DMwSpvcw.d.mts.map} +1 -1
  452. package/dist/{types-bYmRn_Uy.d.mts → types-DWnN7weG.d.mts} +1 -1
  453. package/dist/{types-bYmRn_Uy.d.mts.map → types-DWnN7weG.d.mts.map} +1 -1
  454. package/dist/{types-Dgo6y-Ut.d.mts → types-DX6v9KzJ.d.mts} +1 -1
  455. package/dist/{types-Dgo6y-Ut.d.mts.map → types-DX6v9KzJ.d.mts.map} +1 -1
  456. package/dist/{types-DaqNzqVt.d.mts → types-DawhLFwy.d.mts} +35 -1
  457. package/dist/{types-DaqNzqVt.d.mts.map → types-DawhLFwy.d.mts.map} +1 -1
  458. package/dist/{types-CpUuGcd5.d.mts → types-DbCWhHet.d.mts} +8 -2
  459. package/dist/{types-CpUuGcd5.d.mts.map → types-DbCWhHet.d.mts.map} +1 -1
  460. package/dist/{types-Cd9UCu3t.mjs → types-DpFmlNyB.mjs} +1 -1
  461. package/dist/{types-Cd9UCu3t.mjs.map → types-DpFmlNyB.mjs.map} +1 -1
  462. package/dist/{types-D599-ruj.d.mts → types-Qa7-HJJC.d.mts} +1 -1
  463. package/dist/{types-D599-ruj.d.mts.map → types-Qa7-HJJC.d.mts.map} +1 -1
  464. package/dist/{types-B0bmgwMG.mjs → types-SF1DwGf2.mjs} +2 -2
  465. package/dist/types-SF1DwGf2.mjs.map +1 -0
  466. package/dist/{types-DaYDYW6g.d.mts → types-i8_uzhMD.d.mts} +40 -2
  467. package/dist/types-i8_uzhMD.d.mts.map +1 -0
  468. package/dist/{types-CkDSF81F.d.mts → types-kwqCOUxj.d.mts} +1 -1
  469. package/dist/{types-CkDSF81F.d.mts.map → types-kwqCOUxj.d.mts.map} +1 -1
  470. package/dist/{user-hUSOaIJy.mjs → user-X4rtyO4Y.mjs} +2 -2
  471. package/dist/{user-hUSOaIJy.mjs.map → user-X4rtyO4Y.mjs.map} +1 -1
  472. package/dist/{utils-C3wTAP-P.mjs → utils-C4Ih4DML.mjs} +1 -1
  473. package/dist/{utils-C3wTAP-P.mjs.map → utils-C4Ih4DML.mjs.map} +1 -1
  474. package/dist/{validate-IGltez8n.mjs → validate-DactmcJG.mjs} +23 -3
  475. package/dist/validate-DactmcJG.mjs.map +1 -0
  476. package/dist/{validate-DQtHw9NT.d.mts → validate-Dy6nkNls.d.mts} +25 -5
  477. package/dist/{validate-DQtHw9NT.d.mts.map → validate-Dy6nkNls.d.mts.map} +1 -1
  478. package/dist/{validation-Bmymau7y.mjs → validation-BYA4i85b.mjs} +6 -6
  479. package/dist/{validation-Bmymau7y.mjs.map → validation-BYA4i85b.mjs.map} +1 -1
  480. package/dist/version-FGcv0ooe.mjs +7 -0
  481. package/dist/{version-BTc87L3L.mjs.map → version-FGcv0ooe.mjs.map} +1 -1
  482. package/dist/{widgets-yHQa4c6c.mjs → widgets-DG-1jxnz.mjs} +3 -3
  483. package/dist/{widgets-yHQa4c6c.mjs.map → widgets-DG-1jxnz.mjs.map} +1 -1
  484. package/dist/{zod-generator-B80aap1J.mjs → zod-generator-BNAObjSt.mjs} +3 -3
  485. package/dist/{zod-generator-B80aap1J.mjs.map → zod-generator-BNAObjSt.mjs.map} +1 -1
  486. package/package.json +7 -7
  487. package/src/api/errors.ts +7 -0
  488. package/src/api/handlers/byline-fields.ts +212 -0
  489. package/src/api/handlers/bylines.ts +126 -5
  490. package/src/api/handlers/content.ts +43 -2
  491. package/src/api/handlers/media.ts +2 -0
  492. package/src/api/openapi/document.ts +3 -0
  493. package/src/api/schemas/byline-fields.ts +188 -0
  494. package/src/api/schemas/bylines.ts +42 -0
  495. package/src/api/schemas/content.ts +2 -0
  496. package/src/api/schemas/index.ts +1 -0
  497. package/src/api/schemas/media.ts +2 -0
  498. package/src/astro/integration/routes.ts +27 -0
  499. package/src/astro/middleware/redirect.ts +5 -1
  500. package/src/astro/routes/api/admin/byline-fields/[slug]/usage.ts +36 -0
  501. package/src/astro/routes/api/admin/byline-fields/[slug].ts +92 -0
  502. package/src/astro/routes/api/admin/byline-fields/index.ts +66 -0
  503. package/src/astro/routes/api/admin/byline-fields/reorder.ts +39 -0
  504. package/src/astro/routes/api/admin/bylines/[id]/index.ts +23 -21
  505. package/src/astro/routes/api/admin/bylines/index.ts +1 -0
  506. package/src/astro/routes/api/auth/me.ts +21 -10
  507. package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +15 -3
  508. package/src/astro/routes/api/content/[collection]/[id].ts +3 -1
  509. package/src/astro/routes/api/media.ts +1 -0
  510. package/src/astro/types.ts +1 -0
  511. package/src/bylines/field-defs-cache.ts +138 -0
  512. package/src/bylines/index.ts +37 -4
  513. package/src/cli/commands/content.ts +4 -2
  514. package/src/client/index.ts +4 -1
  515. package/src/components/InlinePortableTextEditor.tsx +69 -0
  516. package/src/content/converters/portable-text-to-prosemirror.ts +7 -0
  517. package/src/content/converters/prosemirror-to-portable-text.ts +16 -0
  518. package/src/content/converters/types.ts +10 -0
  519. package/src/database/migrations/041_content_locale_list_index.ts +47 -0
  520. package/src/database/migrations/042_byline_fields.ts +157 -0
  521. package/src/database/migrations/runner.ts +4 -0
  522. package/src/database/repositories/byline.ts +758 -50
  523. package/src/database/repositories/content.ts +43 -3
  524. package/src/database/repositories/media.ts +14 -0
  525. package/src/database/repositories/types.ts +38 -0
  526. package/src/database/types.ts +44 -0
  527. package/src/emdash-runtime.ts +4 -1
  528. package/src/index.ts +1 -0
  529. package/src/loader.ts +98 -10
  530. package/src/mcp/server.ts +10 -1
  531. package/src/request-cache.ts +23 -0
  532. package/src/schema/byline-registry.ts +671 -0
  533. package/src/schema/registry.ts +14 -0
  534. package/src/schema/types.ts +133 -0
  535. package/src/seed/apply.ts +101 -14
  536. package/src/seed/types.ts +21 -0
  537. package/src/seed/validate.ts +39 -0
  538. package/dist/api-BNKqxyFX.mjs.map +0 -1
  539. package/dist/apply-BOPaD-s9.mjs.map +0 -1
  540. package/dist/byline-BDylH_m4.mjs +0 -404
  541. package/dist/byline-BDylH_m4.mjs.map +0 -1
  542. package/dist/bylines-B2_XmnSU.d.mts.map +0 -1
  543. package/dist/bylines-B7TFEvFf.mjs +0 -118
  544. package/dist/bylines-B7TFEvFf.mjs.map +0 -1
  545. package/dist/content-8voQNTXX.mjs.map +0 -1
  546. package/dist/error-ChfADBuu.mjs.map +0 -1
  547. package/dist/index-BPZFAcgE.d.mts.map +0 -1
  548. package/dist/loader-D-vIJjfY.mjs.map +0 -1
  549. package/dist/media-CKQd8AYU.mjs.map +0 -1
  550. package/dist/menus-C-nWT5Tu.mjs.map +0 -1
  551. package/dist/redirects-COMLwsV5.mjs.map +0 -1
  552. package/dist/runner-Drnvs96u.mjs.map +0 -1
  553. package/dist/setup-Cf_TyOv5.mjs +0 -137
  554. package/dist/setup-Cf_TyOv5.mjs.map +0 -1
  555. package/dist/types-B0bmgwMG.mjs.map +0 -1
  556. package/dist/types-DSZl1Dsv.mjs +0 -83
  557. package/dist/types-DaYDYW6g.d.mts.map +0 -1
  558. package/dist/validate-IGltez8n.mjs.map +0 -1
  559. package/dist/version-BTc87L3L.mjs +0 -7
  560. /package/dist/{api-tokens-iPIHAY8N.mjs → api-tokens-B6VgoE6M.mjs} +0 -0
  561. /package/dist/{ssrf-BIcd-aXW.mjs → ssrf-BvgVcfNQ.mjs} +0 -0
  562. /package/dist/{types-1NNkmTIn.mjs → types-Cj2S6FuC.mjs} +0 -0
@@ -24,8 +24,8 @@ var __exportAll = (all, no_symbols) => {
24
24
  //#endregion
25
25
  //#region src/database/migrations/001_initial.ts
26
26
  var _001_initial_exports = /* @__PURE__ */ __exportAll({
27
- down: () => down$38,
28
- up: () => up$38
27
+ down: () => down$40,
28
+ up: () => up$40
29
29
  });
30
30
  /**
31
31
  * Initial schema migration
@@ -34,7 +34,7 @@ var _001_initial_exports = /* @__PURE__ */ __exportAll({
34
34
  * by the SchemaRegistry when collections are added via the admin UI.
35
35
  * This migration only creates system tables.
36
36
  */
37
- async function up$38(db) {
37
+ async function up$40(db) {
38
38
  await db.schema.createTable("revisions").ifNotExists().addColumn("id", "text", (col) => col.primaryKey()).addColumn("collection", "text", (col) => col.notNull()).addColumn("entry_id", "text", (col) => col.notNull()).addColumn("data", "text", (col) => col.notNull()).addColumn("author_id", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
39
39
  await db.schema.createIndex("idx_revisions_entry").ifNotExists().on("revisions").columns(["collection", "entry_id"]).execute();
40
40
  await db.schema.createTable("taxonomies").ifNotExists().addColumn("id", "text", (col) => col.primaryKey()).addColumn("name", "text", (col) => col.notNull()).addColumn("slug", "text", (col) => col.notNull()).addColumn("label", "text", (col) => col.notNull()).addColumn("parent_id", "text").addColumn("data", "text").addUniqueConstraint("taxonomies_name_slug_unique", ["name", "slug"]).addForeignKeyConstraint("taxonomies_parent_fk", ["parent_id"], "taxonomies", ["id"], (cb) => cb.onDelete("set null")).execute();
@@ -54,7 +54,7 @@ async function up$38(db) {
54
54
  await db.schema.createIndex("idx_audit_action").ifNotExists().on("audit_logs").column("action").execute();
55
55
  await db.schema.createIndex("idx_audit_timestamp").ifNotExists().on("audit_logs").column("timestamp").execute();
56
56
  }
57
- async function down$38(db) {
57
+ async function down$40(db) {
58
58
  await db.schema.dropTable("audit_logs").execute();
59
59
  await db.schema.dropTable("options").execute();
60
60
  await db.schema.dropTable("users").execute();
@@ -67,26 +67,26 @@ async function down$38(db) {
67
67
  //#endregion
68
68
  //#region src/database/migrations/002_media_status.ts
69
69
  var _002_media_status_exports = /* @__PURE__ */ __exportAll({
70
- down: () => down$37,
71
- up: () => up$37
70
+ down: () => down$39,
71
+ up: () => up$39
72
72
  });
73
73
  /**
74
74
  * Add status column to media table for tracking upload state.
75
75
  * Status values: 'pending' | 'ready' | 'failed'
76
76
  */
77
- async function up$37(db) {
77
+ async function up$39(db) {
78
78
  await db.schema.alterTable("media").addColumn("status", "text", (col) => col.notNull().defaultTo("ready")).execute();
79
79
  await db.schema.createIndex("idx_media_status").on("media").column("status").execute();
80
80
  }
81
- async function down$37(db) {
81
+ async function down$39(db) {
82
82
  await db.schema.dropIndex("idx_media_status").execute();
83
83
  }
84
84
 
85
85
  //#endregion
86
86
  //#region src/database/migrations/003_schema_registry.ts
87
87
  var _003_schema_registry_exports = /* @__PURE__ */ __exportAll({
88
- down: () => down$36,
89
- up: () => up$36
88
+ down: () => down$38,
89
+ up: () => up$38
90
90
  });
91
91
  /**
92
92
  * Migration: Schema Registry Tables
@@ -94,14 +94,14 @@ var _003_schema_registry_exports = /* @__PURE__ */ __exportAll({
94
94
  * Creates the schema registry tables that store collection and field definitions.
95
95
  * This enables dynamic schema management where D1 is the source of truth.
96
96
  */
97
- async function up$36(db) {
97
+ async function up$38(db) {
98
98
  await db.schema.createTable("_emdash_collections").addColumn("id", "text", (col) => col.primaryKey()).addColumn("slug", "text", (col) => col.notNull().unique()).addColumn("label", "text", (col) => col.notNull()).addColumn("label_singular", "text").addColumn("description", "text").addColumn("icon", "text").addColumn("supports", "text").addColumn("source", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
99
99
  await db.schema.createTable("_emdash_fields").addColumn("id", "text", (col) => col.primaryKey()).addColumn("collection_id", "text", (col) => col.notNull()).addColumn("slug", "text", (col) => col.notNull()).addColumn("label", "text", (col) => col.notNull()).addColumn("type", "text", (col) => col.notNull()).addColumn("column_type", "text", (col) => col.notNull()).addColumn("required", "integer", (col) => col.defaultTo(0)).addColumn("unique", "integer", (col) => col.defaultTo(0)).addColumn("default_value", "text").addColumn("validation", "text").addColumn("widget", "text").addColumn("options", "text").addColumn("sort_order", "integer", (col) => col.defaultTo(0)).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addForeignKeyConstraint("fields_collection_fk", ["collection_id"], "_emdash_collections", ["id"], (cb) => cb.onDelete("cascade")).execute();
100
100
  await db.schema.createIndex("idx_fields_collection_slug").on("_emdash_fields").columns(["collection_id", "slug"]).unique().execute();
101
101
  await db.schema.createIndex("idx_fields_collection").on("_emdash_fields").column("collection_id").execute();
102
102
  await db.schema.createIndex("idx_fields_sort").on("_emdash_fields").columns(["collection_id", "sort_order"]).execute();
103
103
  }
104
- async function down$36(db) {
104
+ async function down$38(db) {
105
105
  await db.schema.dropTable("_emdash_fields").execute();
106
106
  await db.schema.dropTable("_emdash_collections").execute();
107
107
  }
@@ -109,8 +109,8 @@ async function down$36(db) {
109
109
  //#endregion
110
110
  //#region src/database/migrations/004_plugins.ts
111
111
  var _004_plugins_exports = /* @__PURE__ */ __exportAll({
112
- down: () => down$35,
113
- up: () => up$35
112
+ down: () => down$37,
113
+ up: () => up$37
114
114
  });
115
115
  /**
116
116
  * Migration: Plugin System Tables
@@ -120,7 +120,7 @@ var _004_plugins_exports = /* @__PURE__ */ __exportAll({
120
120
  *
121
121
  * @see PLUGIN-SYSTEM.md § Plugin Storage
122
122
  */
123
- async function up$35(db) {
123
+ async function up$37(db) {
124
124
  await db.schema.createTable("_plugin_storage").addColumn("plugin_id", "text", (col) => col.notNull()).addColumn("collection", "text", (col) => col.notNull()).addColumn("id", "text", (col) => col.notNull()).addColumn("data", "text", (col) => col.notNull()).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addPrimaryKeyConstraint("pk_plugin_storage", [
125
125
  "plugin_id",
126
126
  "collection",
@@ -138,7 +138,7 @@ async function up$35(db) {
138
138
  "index_name"
139
139
  ]).execute();
140
140
  }
141
- async function down$35(db) {
141
+ async function down$37(db) {
142
142
  await db.schema.dropTable("_plugin_indexes").execute();
143
143
  await db.schema.dropTable("_plugin_state").execute();
144
144
  await db.schema.dropTable("_plugin_storage").execute();
@@ -147,8 +147,8 @@ async function down$35(db) {
147
147
  //#endregion
148
148
  //#region src/database/migrations/005_menus.ts
149
149
  var _005_menus_exports = /* @__PURE__ */ __exportAll({
150
- down: () => down$34,
151
- up: () => up$34
150
+ down: () => down$36,
151
+ up: () => up$36
152
152
  });
153
153
  /**
154
154
  * Navigation Menus migration
@@ -156,13 +156,13 @@ var _005_menus_exports = /* @__PURE__ */ __exportAll({
156
156
  * Creates tables for admin-editable navigation menus.
157
157
  * Menu items can reference content entries, taxonomy terms, or custom URLs.
158
158
  */
159
- async function up$34(db) {
159
+ async function up$36(db) {
160
160
  await db.schema.createTable("_emdash_menus").addColumn("id", "text", (col) => col.primaryKey()).addColumn("name", "text", (col) => col.notNull().unique()).addColumn("label", "text", (col) => col.notNull()).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
161
161
  await db.schema.createTable("_emdash_menu_items").addColumn("id", "text", (col) => col.primaryKey()).addColumn("menu_id", "text", (col) => col.notNull()).addColumn("parent_id", "text").addColumn("sort_order", "integer", (col) => col.notNull().defaultTo(0)).addColumn("type", "text", (col) => col.notNull()).addColumn("reference_collection", "text").addColumn("reference_id", "text").addColumn("custom_url", "text").addColumn("label", "text", (col) => col.notNull()).addColumn("title_attr", "text").addColumn("target", "text").addColumn("css_classes", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addForeignKeyConstraint("menu_items_menu_fk", ["menu_id"], "_emdash_menus", ["id"], (cb) => cb.onDelete("cascade")).addForeignKeyConstraint("menu_items_parent_fk", ["parent_id"], "_emdash_menu_items", ["id"], (cb) => cb.onDelete("cascade")).execute();
162
162
  await db.schema.createIndex("idx_menu_items_menu").on("_emdash_menu_items").columns(["menu_id", "sort_order"]).execute();
163
163
  await db.schema.createIndex("idx_menu_items_parent").on("_emdash_menu_items").column("parent_id").execute();
164
164
  }
165
- async function down$34(db) {
165
+ async function down$36(db) {
166
166
  await db.schema.dropTable("_emdash_menu_items").execute();
167
167
  await db.schema.dropTable("_emdash_menus").execute();
168
168
  }
@@ -170,8 +170,8 @@ async function down$34(db) {
170
170
  //#endregion
171
171
  //#region src/database/migrations/006_taxonomy_defs.ts
172
172
  var _006_taxonomy_defs_exports = /* @__PURE__ */ __exportAll({
173
- down: () => down$33,
174
- up: () => up$33
173
+ down: () => down$35,
174
+ up: () => up$35
175
175
  });
176
176
  /**
177
177
  * Taxonomy definitions migration
@@ -179,7 +179,7 @@ var _006_taxonomy_defs_exports = /* @__PURE__ */ __exportAll({
179
179
  * Adds _emdash_taxonomy_defs table to store taxonomy definitions (category, tag, custom)
180
180
  * and seeds default category and tag taxonomies.
181
181
  */
182
- async function up$33(db) {
182
+ async function up$35(db) {
183
183
  await db.schema.createTable("_emdash_taxonomy_defs").addColumn("id", "text", (col) => col.primaryKey()).addColumn("name", "text", (col) => col.notNull().unique()).addColumn("label", "text", (col) => col.notNull()).addColumn("label_singular", "text").addColumn("hierarchical", "integer", (col) => col.defaultTo(0)).addColumn("collections", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
184
184
  await db.insertInto("_emdash_taxonomy_defs").values([{
185
185
  id: "taxdef_category",
@@ -197,22 +197,22 @@ async function up$33(db) {
197
197
  collections: JSON.stringify(["posts"])
198
198
  }]).execute();
199
199
  }
200
- async function down$33(db) {
200
+ async function down$35(db) {
201
201
  await db.schema.dropTable("_emdash_taxonomy_defs").execute();
202
202
  }
203
203
 
204
204
  //#endregion
205
205
  //#region src/database/migrations/007_widgets.ts
206
206
  var _007_widgets_exports = /* @__PURE__ */ __exportAll({
207
- down: () => down$32,
208
- up: () => up$32
207
+ down: () => down$34,
208
+ up: () => up$34
209
209
  });
210
- async function up$32(db) {
210
+ async function up$34(db) {
211
211
  await db.schema.createTable("_emdash_widget_areas").addColumn("id", "text", (col) => col.primaryKey()).addColumn("name", "text", (col) => col.notNull().unique()).addColumn("label", "text", (col) => col.notNull()).addColumn("description", "text").addColumn("created_at", "text", (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`)).execute();
212
212
  await db.schema.createTable("_emdash_widgets").addColumn("id", "text", (col) => col.primaryKey()).addColumn("area_id", "text", (col) => col.notNull().references("_emdash_widget_areas.id").onDelete("cascade")).addColumn("sort_order", "integer", (col) => col.notNull().defaultTo(0)).addColumn("type", "text", (col) => col.notNull()).addColumn("title", "text").addColumn("content", "text").addColumn("menu_name", "text").addColumn("component_id", "text").addColumn("component_props", "text").addColumn("created_at", "text", (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`)).execute();
213
213
  await db.schema.createIndex("idx_widgets_area").on("_emdash_widgets").columns(["area_id", "sort_order"]).execute();
214
214
  }
215
- async function down$32(db) {
215
+ async function down$34(db) {
216
216
  await db.schema.dropTable("_emdash_widgets").execute();
217
217
  await db.schema.dropTable("_emdash_widget_areas").execute();
218
218
  }
@@ -220,8 +220,8 @@ async function down$32(db) {
220
220
  //#endregion
221
221
  //#region src/database/migrations/008_auth.ts
222
222
  var _008_auth_exports = /* @__PURE__ */ __exportAll({
223
- down: () => down$31,
224
- up: () => up$31
223
+ down: () => down$33,
224
+ up: () => up$33
225
225
  });
226
226
  /**
227
227
  * Auth migration - passkey-first authentication
@@ -235,7 +235,7 @@ var _008_auth_exports = /* @__PURE__ */ __exportAll({
235
235
  * - Creates oauth_accounts table (external provider links)
236
236
  * - Creates allowed_domains table (self-signup)
237
237
  */
238
- async function up$31(db) {
238
+ async function up$33(db) {
239
239
  await db.schema.createTable("users_new").addColumn("id", "text", (col) => col.primaryKey()).addColumn("email", "text", (col) => col.notNull().unique()).addColumn("name", "text").addColumn("avatar_url", "text").addColumn("role", "integer", (col) => col.notNull().defaultTo(10)).addColumn("email_verified", "integer", (col) => col.notNull().defaultTo(0)).addColumn("data", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
240
240
  await sql`
241
241
  INSERT INTO users_new (id, email, name, role, data, created_at, updated_at)
@@ -268,7 +268,7 @@ async function up$31(db) {
268
268
  await db.schema.createTable("auth_challenges").addColumn("challenge", "text", (col) => col.primaryKey()).addColumn("type", "text", (col) => col.notNull()).addColumn("user_id", "text").addColumn("data", "text").addColumn("expires_at", "text", (col) => col.notNull()).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
269
269
  await db.schema.createIndex("idx_auth_challenges_expires").on("auth_challenges").column("expires_at").execute();
270
270
  }
271
- async function down$31(db) {
271
+ async function down$33(db) {
272
272
  await db.schema.dropTable("auth_challenges").execute();
273
273
  await db.schema.dropTable("allowed_domains").execute();
274
274
  await db.schema.dropTable("oauth_accounts").execute();
@@ -301,8 +301,8 @@ async function down$31(db) {
301
301
  //#endregion
302
302
  //#region src/database/migrations/009_user_disabled.ts
303
303
  var _009_user_disabled_exports = /* @__PURE__ */ __exportAll({
304
- down: () => down$30,
305
- up: () => up$30
304
+ down: () => down$32,
305
+ up: () => up$32
306
306
  });
307
307
  /**
308
308
  * User disabled column - for soft-disabling users
@@ -311,19 +311,19 @@ var _009_user_disabled_exports = /* @__PURE__ */ __exportAll({
311
311
  * - Adds disabled column to users table (INTEGER, default 0)
312
312
  * - Disabled users cannot log in
313
313
  */
314
- async function up$30(db) {
314
+ async function up$32(db) {
315
315
  await sql`ALTER TABLE users ADD COLUMN disabled INTEGER NOT NULL DEFAULT 0`.execute(db);
316
316
  await db.schema.createIndex("idx_users_disabled").on("users").column("disabled").execute();
317
317
  }
318
- async function down$30(db) {
318
+ async function down$32(db) {
319
319
  await db.schema.dropIndex("idx_users_disabled").execute();
320
320
  }
321
321
 
322
322
  //#endregion
323
323
  //#region src/database/migrations/011_sections.ts
324
324
  var _011_sections_exports = /* @__PURE__ */ __exportAll({
325
- down: () => down$29,
326
- up: () => up$29
325
+ down: () => down$31,
326
+ up: () => up$31
327
327
  });
328
328
  /**
329
329
  * Migration: Add sections tables and performance indexes
@@ -332,13 +332,13 @@ var _011_sections_exports = /* @__PURE__ */ __exportAll({
332
332
  * They provide a library of pre-built page sections (heroes, CTAs, testimonials, etc.)
333
333
  * that content authors can browse and insert with a single click.
334
334
  */
335
- async function up$29(db) {
335
+ async function up$31(db) {
336
336
  await db.schema.createTable("_emdash_section_categories").addColumn("id", "text", (col) => col.primaryKey()).addColumn("slug", "text", (col) => col.notNull().unique()).addColumn("label", "text", (col) => col.notNull()).addColumn("sort_order", "integer", (col) => col.defaultTo(0)).addColumn("created_at", "text", (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`)).execute();
337
337
  await db.schema.createTable("_emdash_sections").addColumn("id", "text", (col) => col.primaryKey()).addColumn("slug", "text", (col) => col.notNull().unique()).addColumn("title", "text", (col) => col.notNull()).addColumn("description", "text").addColumn("category_id", "text", (col) => col.references("_emdash_section_categories.id").onDelete("set null")).addColumn("keywords", "text").addColumn("content", "text", (col) => col.notNull()).addColumn("preview_media_id", "text").addColumn("source", "text", (col) => col.notNull().defaultTo("user")).addColumn("theme_id", "text").addColumn("created_at", "text", (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`)).addColumn("updated_at", "text", (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`)).execute();
338
338
  await db.schema.createIndex("idx_sections_category").on("_emdash_sections").columns(["category_id"]).execute();
339
339
  await db.schema.createIndex("idx_sections_source").on("_emdash_sections").columns(["source"]).execute();
340
340
  }
341
- async function down$29(db) {
341
+ async function down$31(db) {
342
342
  await db.schema.dropIndex("idx_sections_source").execute();
343
343
  await db.schema.dropIndex("idx_sections_category").execute();
344
344
  await db.schema.dropTable("_emdash_sections").execute();
@@ -348,8 +348,8 @@ async function down$29(db) {
348
348
  //#endregion
349
349
  //#region src/database/migrations/012_search.ts
350
350
  var _012_search_exports = /* @__PURE__ */ __exportAll({
351
- down: () => down$28,
352
- up: () => up$28
351
+ down: () => down$30,
352
+ up: () => up$30
353
353
  });
354
354
  /**
355
355
  * Migration: Search Support
@@ -357,11 +357,11 @@ var _012_search_exports = /* @__PURE__ */ __exportAll({
357
357
  * Adds search configuration to collections and searchable flag to fields.
358
358
  * FTS5 tables are created dynamically when search is enabled for a collection.
359
359
  */
360
- async function up$28(db) {
360
+ async function up$30(db) {
361
361
  await db.schema.alterTable("_emdash_collections").addColumn("search_config", "text").execute();
362
362
  await db.schema.alterTable("_emdash_fields").addColumn("searchable", "integer", (col) => col.defaultTo(0)).execute();
363
363
  }
364
- async function down$28(db) {
364
+ async function down$30(db) {
365
365
  await db.schema.alterTable("_emdash_fields").dropColumn("searchable").execute();
366
366
  await db.schema.alterTable("_emdash_collections").dropColumn("search_config").execute();
367
367
  }
@@ -369,8 +369,8 @@ async function down$28(db) {
369
369
  //#endregion
370
370
  //#region src/database/migrations/013_scheduled_publishing.ts
371
371
  var _013_scheduled_publishing_exports = /* @__PURE__ */ __exportAll({
372
- down: () => down$27,
373
- up: () => up$27
372
+ down: () => down$29,
373
+ up: () => up$29
374
374
  });
375
375
  /**
376
376
  * Migration: Add scheduled publishing support
@@ -379,7 +379,7 @@ var _013_scheduled_publishing_exports = /* @__PURE__ */ __exportAll({
379
379
  * When scheduled_at is set and status is 'scheduled', the content
380
380
  * will be auto-published when the scheduled time is reached.
381
381
  */
382
- async function up$27(db) {
382
+ async function up$29(db) {
383
383
  const tableNames = await listTablesLike(db, "ec_%");
384
384
  for (const tableName of tableNames) {
385
385
  const table = { name: tableName };
@@ -394,7 +394,7 @@ async function up$27(db) {
394
394
  `.execute(db);
395
395
  }
396
396
  }
397
- async function down$27(db) {
397
+ async function down$29(db) {
398
398
  const tableNames = await listTablesLike(db, "ec_%");
399
399
  for (const tableName of tableNames) {
400
400
  const table = { name: tableName };
@@ -411,10 +411,10 @@ async function down$27(db) {
411
411
  //#endregion
412
412
  //#region src/database/migrations/014_draft_revisions.ts
413
413
  var _014_draft_revisions_exports = /* @__PURE__ */ __exportAll({
414
- down: () => down$26,
415
- up: () => up$26
414
+ down: () => down$28,
415
+ up: () => up$28
416
416
  });
417
- async function up$26(db) {
417
+ async function up$28(db) {
418
418
  const tables = await db.selectFrom("_emdash_collections").select("slug").execute();
419
419
  for (const row of tables) {
420
420
  const tableName = `ec_${row.slug}`;
@@ -436,7 +436,7 @@ async function up$26(db) {
436
436
  `.execute(db);
437
437
  }
438
438
  }
439
- async function down$26(db) {
439
+ async function down$28(db) {
440
440
  const tables = await db.selectFrom("_emdash_collections").select("slug").execute();
441
441
  for (const row of tables) {
442
442
  const tableName = `ec_${row.slug}`;
@@ -460,8 +460,8 @@ async function down$26(db) {
460
460
  //#endregion
461
461
  //#region src/database/migrations/015_indexes.ts
462
462
  var _015_indexes_exports = /* @__PURE__ */ __exportAll({
463
- down: () => down$25,
464
- up: () => up$25
463
+ down: () => down$27,
464
+ up: () => up$27
465
465
  });
466
466
  /**
467
467
  * Add performance indexes for common query patterns.
@@ -474,7 +474,7 @@ var _015_indexes_exports = /* @__PURE__ */ __exportAll({
474
474
  * 5. Retroactive author_id + updated_at on existing ec_* content tables
475
475
  * (new tables get these from createContentTable() in registry.ts)
476
476
  */
477
- async function up$25(db) {
477
+ async function up$27(db) {
478
478
  await db.schema.createIndex("idx_media_mime_type").on("media").column("mime_type").execute();
479
479
  await db.schema.createIndex("idx_media_filename").on("media").column("filename").execute();
480
480
  await db.schema.createIndex("idx_media_created_at").on("media").column("created_at").execute();
@@ -494,7 +494,7 @@ async function up$25(db) {
494
494
  `.execute(db);
495
495
  }
496
496
  }
497
- async function down$25(db) {
497
+ async function down$27(db) {
498
498
  const tableNames = await listTablesLike(db, "ec_%");
499
499
  for (const tableName of tableNames) {
500
500
  const table = { name: tableName };
@@ -512,8 +512,8 @@ async function down$25(db) {
512
512
  //#endregion
513
513
  //#region src/database/migrations/016_api_tokens.ts
514
514
  var _016_api_tokens_exports = /* @__PURE__ */ __exportAll({
515
- down: () => down$24,
516
- up: () => up$24
515
+ down: () => down$26,
516
+ up: () => up$26
517
517
  });
518
518
  /**
519
519
  * API token tables for programmatic access.
@@ -531,7 +531,7 @@ var _016_api_tokens_exports = /* @__PURE__ */ __exportAll({
531
531
  * top. Without these guards, the retry crashed with `table ... already
532
532
  * exists` and blocked every subsequent boot of the Worker.
533
533
  */
534
- async function up$24(db) {
534
+ async function up$26(db) {
535
535
  await db.schema.createTable("_emdash_api_tokens").ifNotExists().addColumn("id", "text", (col) => col.primaryKey()).addColumn("name", "text", (col) => col.notNull()).addColumn("token_hash", "text", (col) => col.notNull().unique()).addColumn("prefix", "text", (col) => col.notNull()).addColumn("user_id", "text", (col) => col.notNull()).addColumn("scopes", "text", (col) => col.notNull()).addColumn("expires_at", "text").addColumn("last_used_at", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addForeignKeyConstraint("api_tokens_user_fk", ["user_id"], "users", ["id"], (cb) => cb.onDelete("cascade")).execute();
536
536
  await db.schema.createIndex("idx_api_tokens_token_hash").ifNotExists().on("_emdash_api_tokens").column("token_hash").execute();
537
537
  await db.schema.createIndex("idx_api_tokens_user_id").ifNotExists().on("_emdash_api_tokens").column("user_id").execute();
@@ -540,7 +540,7 @@ async function up$24(db) {
540
540
  await db.schema.createIndex("idx_oauth_tokens_expires").ifNotExists().on("_emdash_oauth_tokens").column("expires_at").execute();
541
541
  await db.schema.createTable("_emdash_device_codes").ifNotExists().addColumn("device_code", "text", (col) => col.primaryKey()).addColumn("user_code", "text", (col) => col.notNull().unique()).addColumn("scopes", "text", (col) => col.notNull()).addColumn("user_id", "text").addColumn("status", "text", (col) => col.notNull().defaultTo("pending")).addColumn("expires_at", "text", (col) => col.notNull()).addColumn("interval", "integer", (col) => col.notNull().defaultTo(5)).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
542
542
  }
543
- async function down$24(db) {
543
+ async function down$26(db) {
544
544
  await db.schema.dropTable("_emdash_device_codes").ifExists().execute();
545
545
  await db.schema.dropTable("_emdash_oauth_tokens").ifExists().execute();
546
546
  await db.schema.dropTable("_emdash_api_tokens").ifExists().execute();
@@ -549,8 +549,8 @@ async function down$24(db) {
549
549
  //#endregion
550
550
  //#region src/database/migrations/017_authorization_codes.ts
551
551
  var _017_authorization_codes_exports = /* @__PURE__ */ __exportAll({
552
- down: () => down$23,
553
- up: () => up$23
552
+ down: () => down$25,
553
+ up: () => up$25
554
554
  });
555
555
  /**
556
556
  * Authorization codes for OAuth 2.1 Authorization Code + PKCE flow.
@@ -560,20 +560,20 @@ var _017_authorization_codes_exports = /* @__PURE__ */ __exportAll({
560
560
  *
561
561
  * Also adds client_id tracking to oauth_tokens for per-client revocation.
562
562
  */
563
- async function up$23(db) {
563
+ async function up$25(db) {
564
564
  await db.schema.createTable("_emdash_authorization_codes").addColumn("code_hash", "text", (col) => col.primaryKey()).addColumn("client_id", "text", (col) => col.notNull()).addColumn("redirect_uri", "text", (col) => col.notNull()).addColumn("user_id", "text", (col) => col.notNull()).addColumn("scopes", "text", (col) => col.notNull()).addColumn("code_challenge", "text", (col) => col.notNull()).addColumn("code_challenge_method", "text", (col) => col.notNull().defaultTo("S256")).addColumn("resource", "text").addColumn("expires_at", "text", (col) => col.notNull()).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addForeignKeyConstraint("auth_codes_user_fk", ["user_id"], "users", ["id"], (cb) => cb.onDelete("cascade")).execute();
565
565
  await db.schema.createIndex("idx_auth_codes_expires").on("_emdash_authorization_codes").column("expires_at").execute();
566
566
  await sql`ALTER TABLE _emdash_oauth_tokens ADD COLUMN client_id TEXT`.execute(db);
567
567
  }
568
- async function down$23(db) {
568
+ async function down$25(db) {
569
569
  await db.schema.dropTable("_emdash_authorization_codes").execute();
570
570
  }
571
571
 
572
572
  //#endregion
573
573
  //#region src/database/migrations/018_seo.ts
574
574
  var _018_seo_exports = /* @__PURE__ */ __exportAll({
575
- down: () => down$22,
576
- up: () => up$22
575
+ down: () => down$24,
576
+ up: () => up$24
577
577
  });
578
578
  /**
579
579
  * Migration: SEO support
@@ -586,7 +586,7 @@ var _018_seo_exports = /* @__PURE__ */ __exportAll({
586
586
  * need it. The `has_seo` flag controls whether the admin shows SEO fields
587
587
  * and whether the collection's content appears in sitemaps.
588
588
  */
589
- async function up$22(db) {
589
+ async function up$24(db) {
590
590
  await db.schema.createTable("_emdash_seo").addColumn("collection", "text", (col) => col.notNull()).addColumn("content_id", "text", (col) => col.notNull()).addColumn("seo_title", "text").addColumn("seo_description", "text").addColumn("seo_image", "text").addColumn("seo_canonical", "text").addColumn("seo_no_index", "integer", (col) => col.notNull().defaultTo(0)).addColumn("created_at", "text", (col) => col.notNull().defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.notNull().defaultTo(currentTimestamp(db))).addPrimaryKeyConstraint("_emdash_seo_pk", ["collection", "content_id"]).execute();
591
591
  await sql`
592
592
  CREATE INDEX idx_emdash_seo_collection
@@ -597,7 +597,7 @@ async function up$22(db) {
597
597
  ADD COLUMN has_seo INTEGER NOT NULL DEFAULT 0
598
598
  `.execute(db);
599
599
  }
600
- async function down$22(db) {
600
+ async function down$24(db) {
601
601
  await sql`DROP TABLE IF EXISTS _emdash_seo`.execute(db);
602
602
  await sql`
603
603
  ALTER TABLE _emdash_collections
@@ -608,8 +608,8 @@ async function down$22(db) {
608
608
  //#endregion
609
609
  //#region src/database/migrations/019_i18n.ts
610
610
  var _019_i18n_exports = /* @__PURE__ */ __exportAll({
611
- down: () => down$21,
612
- up: () => up$21
611
+ down: () => down$23,
612
+ up: () => up$23
613
613
  });
614
614
  /**
615
615
  * Quote an identifier for use in raw SQL. Escapes embedded double-quotes
@@ -722,7 +722,7 @@ async function upPostgres$1(db) {
722
722
  ADD COLUMN translatable INTEGER NOT NULL DEFAULT 1
723
723
  `.execute(db);
724
724
  }
725
- async function up$21(db) {
725
+ async function up$23(db) {
726
726
  if (!isSqlite(db)) return upPostgres$1(db);
727
727
  const orphanedTmps = await listTablesLike(db, "ec_%_i18n_tmp");
728
728
  for (const tmpName of orphanedTmps) {
@@ -839,7 +839,7 @@ async function downPostgres(db) {
839
839
  await sql`ALTER TABLE ${sql.ref(t)} DROP COLUMN translation_group`.execute(db);
840
840
  }
841
841
  }
842
- async function down$21(db) {
842
+ async function down$23(db) {
843
843
  if (!isSqlite(db)) return downPostgres(db);
844
844
  await sql`
845
845
  ALTER TABLE _emdash_fields
@@ -946,8 +946,8 @@ async function down$21(db) {
946
946
  //#endregion
947
947
  //#region src/database/migrations/020_collection_url_pattern.ts
948
948
  var _020_collection_url_pattern_exports = /* @__PURE__ */ __exportAll({
949
- down: () => down$20,
950
- up: () => up$20
949
+ down: () => down$22,
950
+ up: () => up$22
951
951
  });
952
952
  /**
953
953
  * Migration: URL pattern for collections
@@ -956,13 +956,13 @@ var _020_collection_url_pattern_exports = /* @__PURE__ */ __exportAll({
956
956
  * can declare its own URL structure (e.g. "/{slug}" for pages, "/blog/{slug}"
957
957
  * for posts). Used for menu URL resolution, sitemaps, and path-based lookups.
958
958
  */
959
- async function up$20(db) {
959
+ async function up$22(db) {
960
960
  await sql`
961
961
  ALTER TABLE _emdash_collections
962
962
  ADD COLUMN url_pattern TEXT
963
963
  `.execute(db);
964
964
  }
965
- async function down$20(db) {
965
+ async function down$22(db) {
966
966
  await sql`
967
967
  ALTER TABLE _emdash_collections
968
968
  DROP COLUMN url_pattern
@@ -972,8 +972,8 @@ async function down$20(db) {
972
972
  //#endregion
973
973
  //#region src/database/migrations/021_remove_section_categories.ts
974
974
  var _021_remove_section_categories_exports = /* @__PURE__ */ __exportAll({
975
- down: () => down$19,
976
- up: () => up$19
975
+ down: () => down$21,
976
+ up: () => up$21
977
977
  });
978
978
  /**
979
979
  * Migration: Remove section categories
@@ -982,12 +982,12 @@ var _021_remove_section_categories_exports = /* @__PURE__ */ __exportAll({
982
982
  * Rather than building the missing UI for a feature with very little need at this stage,
983
983
  * we're removing the feature entirely.
984
984
  */
985
- async function up$19(db) {
985
+ async function up$21(db) {
986
986
  await db.schema.dropIndex("idx_sections_category").ifExists().execute();
987
987
  await db.schema.alterTable("_emdash_sections").dropColumn("category_id").execute();
988
988
  await db.schema.dropTable("_emdash_section_categories").execute();
989
989
  }
990
- async function down$19(db) {
990
+ async function down$21(db) {
991
991
  await db.schema.createTable("_emdash_section_categories").addColumn("id", "text", (col) => col.primaryKey()).addColumn("slug", "text", (col) => col.notNull().unique()).addColumn("label", "text", (col) => col.notNull()).addColumn("sort_order", "integer", (col) => col.defaultTo(0)).addColumn("created_at", "text", (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`)).execute();
992
992
  await db.schema.alterTable("_emdash_sections").addColumn("category_id", "text", (col) => col.references("_emdash_section_categories.id").onDelete("set null")).execute();
993
993
  await db.schema.createIndex("idx_sections_category").on("_emdash_sections").columns(["category_id"]).execute();
@@ -996,8 +996,8 @@ async function down$19(db) {
996
996
  //#endregion
997
997
  //#region src/database/migrations/022_marketplace_plugin_state.ts
998
998
  var _022_marketplace_plugin_state_exports = /* @__PURE__ */ __exportAll({
999
- down: () => down$18,
1000
- up: () => up$18
999
+ down: () => down$20,
1000
+ up: () => up$20
1001
1001
  });
1002
1002
  /**
1003
1003
  * Migration: Add marketplace fields to _plugin_state
@@ -1006,7 +1006,7 @@ var _022_marketplace_plugin_state_exports = /* @__PURE__ */ __exportAll({
1006
1006
  * whether a plugin was installed from config or marketplace,
1007
1007
  * and which marketplace version is installed.
1008
1008
  */
1009
- async function up$18(db) {
1009
+ async function up$20(db) {
1010
1010
  await sql`
1011
1011
  ALTER TABLE _plugin_state
1012
1012
  ADD COLUMN source TEXT NOT NULL DEFAULT 'config'
@@ -1021,7 +1021,7 @@ async function up$18(db) {
1021
1021
  WHERE source = 'marketplace'
1022
1022
  `.execute(db);
1023
1023
  }
1024
- async function down$18(db) {
1024
+ async function down$20(db) {
1025
1025
  await sql`
1026
1026
  DROP INDEX IF EXISTS idx_plugin_state_source
1027
1027
  `.execute(db);
@@ -1038,8 +1038,8 @@ async function down$18(db) {
1038
1038
  //#endregion
1039
1039
  //#region src/database/migrations/023_plugin_metadata.ts
1040
1040
  var _023_plugin_metadata_exports = /* @__PURE__ */ __exportAll({
1041
- down: () => down$17,
1042
- up: () => up$17
1041
+ down: () => down$19,
1042
+ up: () => up$19
1043
1043
  });
1044
1044
  /**
1045
1045
  * Migration: Add display metadata to _plugin_state
@@ -1048,7 +1048,7 @@ var _023_plugin_metadata_exports = /* @__PURE__ */ __exportAll({
1048
1048
  * so the admin UI can show meaningful info without re-fetching
1049
1049
  * from the marketplace on every page load.
1050
1050
  */
1051
- async function up$17(db) {
1051
+ async function up$19(db) {
1052
1052
  await sql`
1053
1053
  ALTER TABLE _plugin_state
1054
1054
  ADD COLUMN display_name TEXT
@@ -1058,7 +1058,7 @@ async function up$17(db) {
1058
1058
  ADD COLUMN description TEXT
1059
1059
  `.execute(db);
1060
1060
  }
1061
- async function down$17(db) {
1061
+ async function down$19(db) {
1062
1062
  await sql`
1063
1063
  ALTER TABLE _plugin_state
1064
1064
  DROP COLUMN description
@@ -1072,8 +1072,8 @@ async function down$17(db) {
1072
1072
  //#endregion
1073
1073
  //#region src/database/migrations/024_media_placeholders.ts
1074
1074
  var _024_media_placeholders_exports = /* @__PURE__ */ __exportAll({
1075
- down: () => down$16,
1076
- up: () => up$16
1075
+ down: () => down$18,
1076
+ up: () => up$18
1077
1077
  });
1078
1078
  /**
1079
1079
  * Migration: Add placeholder columns to media table
@@ -1081,7 +1081,7 @@ var _024_media_placeholders_exports = /* @__PURE__ */ __exportAll({
1081
1081
  * Stores blurhash and dominant_color for LQIP (Low Quality Image Placeholder)
1082
1082
  * support. Generated at upload time from image pixel data.
1083
1083
  */
1084
- async function up$16(db) {
1084
+ async function up$18(db) {
1085
1085
  await sql`
1086
1086
  ALTER TABLE media
1087
1087
  ADD COLUMN blurhash TEXT
@@ -1091,7 +1091,7 @@ async function up$16(db) {
1091
1091
  ADD COLUMN dominant_color TEXT
1092
1092
  `.execute(db);
1093
1093
  }
1094
- async function down$16(db) {
1094
+ async function down$18(db) {
1095
1095
  await sql`
1096
1096
  ALTER TABLE media
1097
1097
  DROP COLUMN dominant_color
@@ -1105,8 +1105,8 @@ async function down$16(db) {
1105
1105
  //#endregion
1106
1106
  //#region src/database/migrations/025_oauth_clients.ts
1107
1107
  var _025_oauth_clients_exports = /* @__PURE__ */ __exportAll({
1108
- down: () => down$15,
1109
- up: () => up$15
1108
+ down: () => down$17,
1109
+ up: () => up$17
1110
1110
  });
1111
1111
  /**
1112
1112
  * Migration: Create OAuth clients table
@@ -1117,18 +1117,18 @@ var _025_oauth_clients_exports = /* @__PURE__ */ __exportAll({
1117
1117
  * Each client has a set of pre-registered redirect URIs (JSON array).
1118
1118
  * The authorize endpoint rejects any redirect_uri not in the client's list.
1119
1119
  */
1120
- async function up$15(db) {
1120
+ async function up$17(db) {
1121
1121
  await db.schema.createTable("_emdash_oauth_clients").addColumn("id", "text", (col) => col.primaryKey()).addColumn("name", "text", (col) => col.notNull()).addColumn("redirect_uris", "text", (col) => col.notNull()).addColumn("scopes", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
1122
1122
  }
1123
- async function down$15(db) {
1123
+ async function down$17(db) {
1124
1124
  await db.schema.dropTable("_emdash_oauth_clients").execute();
1125
1125
  }
1126
1126
 
1127
1127
  //#endregion
1128
1128
  //#region src/database/migrations/026_cron_tasks.ts
1129
1129
  var _026_cron_tasks_exports = /* @__PURE__ */ __exportAll({
1130
- down: () => down$14,
1131
- up: () => up$14
1130
+ down: () => down$16,
1131
+ up: () => up$16
1132
1132
  });
1133
1133
  /**
1134
1134
  * Migration: Create cron tasks table for plugin scheduled tasks.
@@ -1139,7 +1139,7 @@ var _026_cron_tasks_exports = /* @__PURE__ */ __exportAll({
1139
1139
  * The `next_run_at` + `status` + `enabled` index drives the "find overdue
1140
1140
  * tasks" query used by CronExecutor.tick().
1141
1141
  */
1142
- async function up$14(db) {
1142
+ async function up$16(db) {
1143
1143
  await db.schema.createTable("_emdash_cron_tasks").addColumn("id", "text", (col) => col.primaryKey()).addColumn("plugin_id", "text", (col) => col.notNull()).addColumn("task_name", "text", (col) => col.notNull()).addColumn("schedule", "text", (col) => col.notNull()).addColumn("is_oneshot", "integer", (col) => col.notNull().defaultTo(0)).addColumn("data", "text").addColumn("next_run_at", "text", (col) => col.notNull()).addColumn("last_run_at", "text").addColumn("status", "text", (col) => col.notNull().defaultTo("idle")).addColumn("locked_at", "text").addColumn("enabled", "integer", (col) => col.notNull().defaultTo(1)).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addUniqueConstraint("uq_cron_tasks_plugin_task", ["plugin_id", "task_name"]).execute();
1144
1144
  await db.schema.createIndex("idx_cron_tasks_due").on("_emdash_cron_tasks").columns([
1145
1145
  "enabled",
@@ -1148,17 +1148,17 @@ async function up$14(db) {
1148
1148
  ]).execute();
1149
1149
  await db.schema.createIndex("idx_cron_tasks_plugin").on("_emdash_cron_tasks").column("plugin_id").execute();
1150
1150
  }
1151
- async function down$14(db) {
1151
+ async function down$16(db) {
1152
1152
  await db.schema.dropTable("_emdash_cron_tasks").execute();
1153
1153
  }
1154
1154
 
1155
1155
  //#endregion
1156
1156
  //#region src/database/migrations/027_comments.ts
1157
1157
  var _027_comments_exports = /* @__PURE__ */ __exportAll({
1158
- down: () => down$13,
1159
- up: () => up$13
1158
+ down: () => down$15,
1159
+ up: () => up$15
1160
1160
  });
1161
- async function up$13(db) {
1161
+ async function up$15(db) {
1162
1162
  await db.schema.createTable("_emdash_comments").addColumn("id", "text", (col) => col.primaryKey()).addColumn("collection", "text", (col) => col.notNull()).addColumn("content_id", "text", (col) => col.notNull()).addColumn("parent_id", "text", (col) => col.references("_emdash_comments.id").onDelete("cascade")).addColumn("author_name", "text", (col) => col.notNull()).addColumn("author_email", "text", (col) => col.notNull()).addColumn("author_url", "text").addColumn("author_user_id", "text", (col) => col.references("users.id").onDelete("set null")).addColumn("body", "text", (col) => col.notNull()).addColumn("status", "text", (col) => col.notNull().defaultTo("pending")).addColumn("ip_hash", "text").addColumn("user_agent", "text").addColumn("moderation_metadata", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
1163
1163
  await db.schema.createIndex("idx_comments_content").on("_emdash_comments").columns([
1164
1164
  "collection",
@@ -1174,30 +1174,30 @@ async function up$13(db) {
1174
1174
  await db.schema.alterTable("_emdash_collections").addColumn("comments_closed_after_days", "integer", (col) => col.defaultTo(90)).execute();
1175
1175
  await db.schema.alterTable("_emdash_collections").addColumn("comments_auto_approve_users", "integer", (col) => col.defaultTo(1)).execute();
1176
1176
  }
1177
- async function down$13(db) {
1177
+ async function down$15(db) {
1178
1178
  await db.schema.dropTable("_emdash_comments").execute();
1179
1179
  }
1180
1180
 
1181
1181
  //#endregion
1182
1182
  //#region src/database/migrations/028_drop_author_url.ts
1183
1183
  var _028_drop_author_url_exports = /* @__PURE__ */ __exportAll({
1184
- down: () => down$12,
1185
- up: () => up$12
1184
+ down: () => down$14,
1185
+ up: () => up$14
1186
1186
  });
1187
- async function up$12(db) {
1187
+ async function up$14(db) {
1188
1188
  await sql`ALTER TABLE _emdash_comments DROP COLUMN author_url`.execute(db);
1189
1189
  }
1190
- async function down$12(db) {
1190
+ async function down$14(db) {
1191
1191
  await db.schema.alterTable("_emdash_comments").addColumn("author_url", "text").execute();
1192
1192
  }
1193
1193
 
1194
1194
  //#endregion
1195
1195
  //#region src/database/migrations/029_redirects.ts
1196
1196
  var _029_redirects_exports = /* @__PURE__ */ __exportAll({
1197
- down: () => down$11,
1198
- up: () => up$11
1197
+ down: () => down$13,
1198
+ up: () => up$13
1199
1199
  });
1200
- async function up$11(db) {
1200
+ async function up$13(db) {
1201
1201
  await db.schema.createTable("_emdash_redirects").addColumn("id", "text", (col) => col.primaryKey()).addColumn("source", "text", (col) => col.notNull()).addColumn("destination", "text", (col) => col.notNull()).addColumn("type", "integer", (col) => col.notNull().defaultTo(301)).addColumn("is_pattern", "integer", (col) => col.notNull().defaultTo(0)).addColumn("enabled", "integer", (col) => col.notNull().defaultTo(1)).addColumn("hits", "integer", (col) => col.notNull().defaultTo(0)).addColumn("last_hit_at", "text").addColumn("group_name", "text").addColumn("auto", "integer", (col) => col.notNull().defaultTo(0)).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
1202
1202
  await db.schema.createIndex("idx_redirects_source").on("_emdash_redirects").column("source").execute();
1203
1203
  await db.schema.createIndex("idx_redirects_enabled").on("_emdash_redirects").column("enabled").execute();
@@ -1206,7 +1206,7 @@ async function up$11(db) {
1206
1206
  await db.schema.createIndex("idx_404_log_path").on("_emdash_404_log").column("path").execute();
1207
1207
  await db.schema.createIndex("idx_404_log_created").on("_emdash_404_log").column("created_at").execute();
1208
1208
  }
1209
- async function down$11(db) {
1209
+ async function down$13(db) {
1210
1210
  await db.schema.dropTable("_emdash_404_log").execute();
1211
1211
  await db.schema.dropTable("_emdash_redirects").execute();
1212
1212
  }
@@ -1214,8 +1214,8 @@ async function down$11(db) {
1214
1214
  //#endregion
1215
1215
  //#region src/database/migrations/030_widen_scheduled_index.ts
1216
1216
  var _030_widen_scheduled_index_exports = /* @__PURE__ */ __exportAll({
1217
- down: () => down$10,
1218
- up: () => up$10
1217
+ down: () => down$12,
1218
+ up: () => up$12
1219
1219
  });
1220
1220
  /**
1221
1221
  * Migration: Widen scheduled publishing index
@@ -1224,7 +1224,7 @@ var _030_widen_scheduled_index_exports = /* @__PURE__ */ __exportAll({
1224
1224
  * Published posts can now have scheduled draft changes, so widen the
1225
1225
  * index to cover all rows where scheduled_at IS NOT NULL.
1226
1226
  */
1227
- async function up$10(db) {
1227
+ async function up$12(db) {
1228
1228
  const tableNames = await listTablesLike(db, "ec_%");
1229
1229
  for (const tableName of tableNames) {
1230
1230
  const table = { name: tableName };
@@ -1238,7 +1238,7 @@ async function up$10(db) {
1238
1238
  `.execute(db);
1239
1239
  }
1240
1240
  }
1241
- async function down$10(db) {
1241
+ async function down$12(db) {
1242
1242
  const tableNames = await listTablesLike(db, "ec_%");
1243
1243
  for (const tableName of tableNames) {
1244
1244
  const table = { name: tableName };
@@ -1256,10 +1256,10 @@ async function down$10(db) {
1256
1256
  //#endregion
1257
1257
  //#region src/database/migrations/031_bylines.ts
1258
1258
  var _031_bylines_exports = /* @__PURE__ */ __exportAll({
1259
- down: () => down$9,
1260
- up: () => up$9
1259
+ down: () => down$11,
1260
+ up: () => up$11
1261
1261
  });
1262
- async function up$9(db) {
1262
+ async function up$11(db) {
1263
1263
  await db.schema.createTable("_emdash_bylines").addColumn("id", "text", (col) => col.primaryKey()).addColumn("slug", "text", (col) => col.notNull().unique()).addColumn("display_name", "text", (col) => col.notNull()).addColumn("bio", "text").addColumn("avatar_media_id", "text", (col) => col.references("media.id").onDelete("set null")).addColumn("website_url", "text").addColumn("user_id", "text", (col) => col.references("users.id").onDelete("set null")).addColumn("is_guest", "integer", (col) => col.notNull().defaultTo(0)).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
1264
1264
  await sql`
1265
1265
  CREATE UNIQUE INDEX ${sql.ref("idx_bylines_user_id_unique")}
@@ -1291,7 +1291,7 @@ async function up$9(db) {
1291
1291
  `.execute(db);
1292
1292
  }
1293
1293
  }
1294
- async function down$9(db) {
1294
+ async function down$11(db) {
1295
1295
  const tableNames = await listTablesLike(db, "ec_%");
1296
1296
  for (const tableName of tableNames) {
1297
1297
  await sql`
@@ -1309,8 +1309,8 @@ async function down$9(db) {
1309
1309
  //#endregion
1310
1310
  //#region src/database/migrations/032_rate_limits.ts
1311
1311
  var _032_rate_limits_exports = /* @__PURE__ */ __exportAll({
1312
- down: () => down$8,
1313
- up: () => up$8
1312
+ down: () => down$10,
1313
+ up: () => up$10
1314
1314
  });
1315
1315
  /**
1316
1316
  * Migration: Rate limits table + device code polling tracking.
@@ -1321,12 +1321,12 @@ var _032_rate_limits_exports = /* @__PURE__ */ __exportAll({
1321
1321
  * 2. Add last_polled_at column to _emdash_device_codes for
1322
1322
  * RFC 8628 slow_down enforcement.
1323
1323
  */
1324
- async function up$8(db) {
1324
+ async function up$10(db) {
1325
1325
  await db.schema.createTable("_emdash_rate_limits").addColumn("key", "text", (col) => col.notNull()).addColumn("window", "text", (col) => col.notNull()).addColumn("count", "integer", (col) => col.notNull().defaultTo(1)).addPrimaryKeyConstraint("pk_rate_limits", ["key", "window"]).execute();
1326
1326
  await db.schema.createIndex("idx_rate_limits_window").on("_emdash_rate_limits").column("window").execute();
1327
1327
  await db.schema.alterTable("_emdash_device_codes").addColumn("last_polled_at", "text").execute();
1328
1328
  }
1329
- async function down$8(db) {
1329
+ async function down$10(db) {
1330
1330
  await db.schema.dropTable("_emdash_rate_limits").execute();
1331
1331
  await db.schema.alterTable("_emdash_device_codes").dropColumn("last_polled_at").execute();
1332
1332
  }
@@ -1334,8 +1334,8 @@ async function down$8(db) {
1334
1334
  //#endregion
1335
1335
  //#region src/database/migrations/033_optimize_content_indexes.ts
1336
1336
  var _033_optimize_content_indexes_exports = /* @__PURE__ */ __exportAll({
1337
- down: () => down$7,
1338
- up: () => up$7
1337
+ down: () => down$9,
1338
+ up: () => up$9
1339
1339
  });
1340
1340
  /**
1341
1341
  * Migration: Optimize content table indexes for D1 performance
@@ -1348,7 +1348,7 @@ var _033_optimize_content_indexes_exports = /* @__PURE__ */ __exportAll({
1348
1348
  *
1349
1349
  * Impact: Reduces D1 row reads by 90%+ for admin panel operations.
1350
1350
  */
1351
- async function up$7(db) {
1351
+ async function up$9(db) {
1352
1352
  const tableNames = await listTablesLike(db, "ec_%");
1353
1353
  for (const tableName of tableNames) {
1354
1354
  const table = { name: tableName };
@@ -1390,7 +1390,7 @@ async function up$7(db) {
1390
1390
  WHERE status = 'trash'
1391
1391
  `.execute(db);
1392
1392
  }
1393
- async function down$7(db) {
1393
+ async function down$9(db) {
1394
1394
  const tableNames = await listTablesLike(db, "ec_%");
1395
1395
  for (const tableName of tableNames) {
1396
1396
  const table = { name: tableName };
@@ -1423,10 +1423,10 @@ async function down$7(db) {
1423
1423
  //#endregion
1424
1424
  //#region src/database/migrations/034_published_at_index.ts
1425
1425
  var _034_published_at_index_exports = /* @__PURE__ */ __exportAll({
1426
- down: () => down$6,
1427
- up: () => up$6
1426
+ down: () => down$8,
1427
+ up: () => up$8
1428
1428
  });
1429
- async function up$6(db) {
1429
+ async function up$8(db) {
1430
1430
  const tableNames = await listTablesLike(db, "ec_%");
1431
1431
  for (const tableName of tableNames) {
1432
1432
  const table = { name: tableName };
@@ -1436,7 +1436,7 @@ async function up$6(db) {
1436
1436
  `.execute(db);
1437
1437
  }
1438
1438
  }
1439
- async function down$6(db) {
1439
+ async function down$8(db) {
1440
1440
  const tableNames = await listTablesLike(db, "ec_%");
1441
1441
  for (const tableName of tableNames) {
1442
1442
  const table = { name: tableName };
@@ -1447,8 +1447,8 @@ async function down$6(db) {
1447
1447
  //#endregion
1448
1448
  //#region src/database/migrations/035_bounded_404_log.ts
1449
1449
  var _035_bounded_404_log_exports = /* @__PURE__ */ __exportAll({
1450
- down: () => down$5,
1451
- up: () => up$5
1450
+ down: () => down$7,
1451
+ up: () => up$7
1452
1452
  });
1453
1453
  /**
1454
1454
  * Migration: Bounded 404 logging
@@ -1466,7 +1466,7 @@ var _035_bounded_404_log_exports = /* @__PURE__ */ __exportAll({
1466
1466
  * path and summing hits
1467
1467
  * - Adds a UNIQUE index on `path` so upsert semantics work
1468
1468
  */
1469
- async function up$5(db) {
1469
+ async function up$7(db) {
1470
1470
  const hitsExists = await columnExists(db, "_emdash_404_log", "hits");
1471
1471
  if (!hitsExists) await db.schema.alterTable("_emdash_404_log").addColumn("hits", "integer", (col) => col.notNull().defaultTo(1)).execute();
1472
1472
  if (!await columnExists(db, "_emdash_404_log", "last_seen_at")) await db.schema.alterTable("_emdash_404_log").addColumn("last_seen_at", "text").execute();
@@ -1515,7 +1515,7 @@ async function up$5(db) {
1515
1515
  await db.schema.dropIndex("idx_404_log_path").ifExists().execute();
1516
1516
  await db.schema.createIndex("idx_404_log_last_seen").ifNotExists().on("_emdash_404_log").column("last_seen_at").execute();
1517
1517
  }
1518
- async function down$5(db) {
1518
+ async function down$7(db) {
1519
1519
  await db.schema.dropIndex("idx_404_log_last_seen").ifExists().execute();
1520
1520
  await db.schema.dropIndex("idx_404_log_path_unique").ifExists().execute();
1521
1521
  await db.schema.createIndex("idx_404_log_path").ifNotExists().on("_emdash_404_log").column("path").execute();
@@ -1526,8 +1526,8 @@ async function down$5(db) {
1526
1526
  //#endregion
1527
1527
  //#region src/database/migrations/036_i18n_menus_and_taxonomies.ts
1528
1528
  var _036_i18n_menus_and_taxonomies_exports = /* @__PURE__ */ __exportAll({
1529
- down: () => down$4,
1530
- up: () => up$4
1529
+ down: () => down$6,
1530
+ up: () => up$6
1531
1531
  });
1532
1532
  /**
1533
1533
  * i18n for menus + taxonomies. Adds `locale` + `translation_group` to system
@@ -1538,7 +1538,7 @@ var _036_i18n_menus_and_taxonomies_exports = /* @__PURE__ */ __exportAll({
1538
1538
  function getDefaultLocale$1() {
1539
1539
  return getI18nConfig()?.defaultLocale ?? "en";
1540
1540
  }
1541
- async function up$4(db) {
1541
+ async function up$6(db) {
1542
1542
  const defaultLocale = getDefaultLocale$1();
1543
1543
  if (isSqlite(db)) {
1544
1544
  await rebuildContentTaxonomies(db);
@@ -1751,7 +1751,7 @@ async function assertSingleLocale$1(db, defaultLocale) {
1751
1751
  if (count > 0) throw new Error(`Cannot revert migration 036_i18n_menus_and_taxonomies: ${count} row(s) in "${table}" use a non-default locale (defaultLocale="${defaultLocale}"). Reverting would drop them silently. Export translations first (or delete them) and re-run the rollback. See packages/core/src/database/migrations/036_i18n_menus_and_taxonomies.ts.`);
1752
1752
  }
1753
1753
  }
1754
- async function down$4(db) {
1754
+ async function down$6(db) {
1755
1755
  const defaultLocale = getDefaultLocale$1();
1756
1756
  await assertSingleLocale$1(db, defaultLocale);
1757
1757
  await assertContentTaxonomiesResolve(db, defaultLocale);
@@ -1848,21 +1848,21 @@ async function rebuildTaxonomyDefsDown(db) {
1848
1848
  //#endregion
1849
1849
  //#region src/database/migrations/037_credential_algorithm.ts
1850
1850
  var _037_credential_algorithm_exports = /* @__PURE__ */ __exportAll({
1851
- down: () => down$3,
1852
- up: () => up$3
1851
+ down: () => down$5,
1852
+ up: () => up$5
1853
1853
  });
1854
- async function up$3(db) {
1854
+ async function up$5(db) {
1855
1855
  if (!await columnExists(db, "credentials", "algorithm")) await db.schema.alterTable("credentials").addColumn("algorithm", "integer", (col) => col.notNull().defaultTo(-7)).execute();
1856
1856
  }
1857
- async function down$3(db) {
1857
+ async function down$5(db) {
1858
1858
  if (await columnExists(db, "credentials", "algorithm")) await db.schema.alterTable("credentials").dropColumn("algorithm").execute();
1859
1859
  }
1860
1860
 
1861
1861
  //#endregion
1862
1862
  //#region src/database/migrations/038_registry_plugin_state.ts
1863
1863
  var _038_registry_plugin_state_exports = /* @__PURE__ */ __exportAll({
1864
- down: () => down$2,
1865
- up: () => up$2
1864
+ down: () => down$4,
1865
+ up: () => up$4
1866
1866
  });
1867
1867
  /**
1868
1868
  * Migration: Add registry fields to _plugin_state
@@ -1890,7 +1890,7 @@ var _038_registry_plugin_state_exports = /* @__PURE__ */ __exportAll({
1890
1890
  * checks before adding to keep the migration safe under partial
1891
1891
  * re-application. The same pattern is used in 019_i18n.ts.
1892
1892
  */
1893
- async function up$2(db) {
1893
+ async function up$4(db) {
1894
1894
  if (isSqlite(db)) await upSqlite(db);
1895
1895
  else await upPostgres(db);
1896
1896
  }
@@ -1933,7 +1933,7 @@ async function upPostgres(db) {
1933
1933
  WHERE source = 'registry'
1934
1934
  `.execute(db);
1935
1935
  }
1936
- async function down$2(db) {
1936
+ async function down$4(db) {
1937
1937
  await sql`
1938
1938
  DROP INDEX IF EXISTS idx_plugin_state_registry
1939
1939
  `.execute(db);
@@ -1950,10 +1950,10 @@ async function down$2(db) {
1950
1950
  //#endregion
1951
1951
  //#region src/database/migrations/039_fix_fts5_triggers.ts
1952
1952
  var _039_fix_fts5_triggers_exports = /* @__PURE__ */ __exportAll({
1953
- down: () => down$1,
1954
- up: () => up$1
1953
+ down: () => down$3,
1954
+ up: () => up$3
1955
1955
  });
1956
- async function up$1(db) {
1956
+ async function up$3(db) {
1957
1957
  if (!isSqlite(db)) return;
1958
1958
  const collections = await sql`
1959
1959
  SELECT slug, search_config FROM _emdash_collections
@@ -1987,7 +1987,7 @@ async function up$1(db) {
1987
1987
  * at runtime, not by this migration, so leaving them in their
1988
1988
  * corruption-safe state on rollback is correct.
1989
1989
  */
1990
- async function down$1(_db) {}
1990
+ async function down$3(_db) {}
1991
1991
  function isSearchEnabled(searchConfig) {
1992
1992
  if (!searchConfig) return false;
1993
1993
  try {
@@ -2079,8 +2079,8 @@ async function dropFtsObjects(db, collectionSlug) {
2079
2079
  //#endregion
2080
2080
  //#region src/database/migrations/040_byline_i18n.ts
2081
2081
  var _040_byline_i18n_exports = /* @__PURE__ */ __exportAll({
2082
- down: () => down,
2083
- up: () => up
2082
+ down: () => down$2,
2083
+ up: () => up$2
2084
2084
  });
2085
2085
  /**
2086
2086
  * i18n for bylines. Adds `locale` + `translation_group` to `_emdash_bylines`
@@ -2108,7 +2108,7 @@ var _040_byline_i18n_exports = /* @__PURE__ */ __exportAll({
2108
2108
  function getDefaultLocale() {
2109
2109
  return getI18nConfig()?.defaultLocale ?? "en";
2110
2110
  }
2111
- async function up(db) {
2111
+ async function up$2(db) {
2112
2112
  const defaultLocale = getDefaultLocale();
2113
2113
  if (isSqlite(db)) {
2114
2114
  await rebuildContentBylines(db);
@@ -2265,7 +2265,7 @@ async function assertSingleLocale(db, defaultLocale) {
2265
2265
  const count = Number(result.rows[0]?.count ?? 0);
2266
2266
  if (count > 0) throw new Error(`Cannot revert migration 040_byline_i18n: ${count} row(s) in "_emdash_bylines" use a non-default locale (defaultLocale="${defaultLocale}"). Reverting would drop them silently. Export translations first (or delete them) and re-run the rollback. See packages/core/src/database/migrations/040_byline_i18n.ts.`);
2267
2267
  }
2268
- async function down(db) {
2268
+ async function down$2(db) {
2269
2269
  const defaultLocale = getDefaultLocale();
2270
2270
  await assertSingleLocale(db, defaultLocale);
2271
2271
  await assertContentBylinesResolve(db, defaultLocale);
@@ -2381,6 +2381,130 @@ async function restoreContentBylinesFk(db) {
2381
2381
  await db.schema.createIndex("idx_content_bylines_byline").on("_emdash_content_bylines").column("byline_id").execute();
2382
2382
  }
2383
2383
 
2384
+ //#endregion
2385
+ //#region src/database/migrations/041_content_locale_list_index.ts
2386
+ var _041_content_locale_list_index_exports = /* @__PURE__ */ __exportAll({
2387
+ down: () => down$1,
2388
+ up: () => up$1
2389
+ });
2390
+ /**
2391
+ * Migration: locale-aware composite indexes for content list queries.
2392
+ *
2393
+ * Addresses GitHub issue #1219. When i18n is enabled the admin content list
2394
+ * filters by `locale` and orders by `updated_at`/`created_at`. The existing
2395
+ * composite indexes (033/034) cover `(deleted_at, updated_at DESC, id DESC)`
2396
+ * etc. but omit `locale`, so a locale-filtered ordered list can't be served
2397
+ * by a single index on large tables. These indexes restore index-only paging
2398
+ * for the locale-scoped case.
2399
+ *
2400
+ * Forward-only and idempotent (`IF NOT EXISTS`).
2401
+ *
2402
+ * Index names use a short `loc_upd`/`loc_crt` suffix rather than spelling out
2403
+ * `deleted_locale_updated_id`: Postgres truncates identifiers to 63 bytes, and
2404
+ * the longer form pushes the `updated`/`created` discriminator past byte 63 for
2405
+ * slugs as short as 40 chars, making both names truncate to the same string.
2406
+ * Keep these identical to the names in `schema/registry.ts`.
2407
+ */
2408
+ async function up$1(db) {
2409
+ const tableNames = await listTablesLike(db, "ec_%");
2410
+ for (const tableName of tableNames) {
2411
+ await sql`
2412
+ CREATE INDEX IF NOT EXISTS ${sql.ref(`idx_${tableName}_loc_upd`)}
2413
+ ON ${sql.ref(tableName)} (deleted_at, locale, updated_at DESC, id DESC)
2414
+ `.execute(db);
2415
+ await sql`
2416
+ CREATE INDEX IF NOT EXISTS ${sql.ref(`idx_${tableName}_loc_crt`)}
2417
+ ON ${sql.ref(tableName)} (deleted_at, locale, created_at DESC, id DESC)
2418
+ `.execute(db);
2419
+ }
2420
+ }
2421
+ async function down$1(db) {
2422
+ const tableNames = await listTablesLike(db, "ec_%");
2423
+ for (const tableName of tableNames) {
2424
+ await sql`DROP INDEX IF EXISTS ${sql.ref(`idx_${tableName}_loc_upd`)}`.execute(db);
2425
+ await sql`DROP INDEX IF EXISTS ${sql.ref(`idx_${tableName}_loc_crt`)}`.execute(db);
2426
+ }
2427
+ }
2428
+
2429
+ //#endregion
2430
+ //#region src/database/migrations/042_byline_fields.ts
2431
+ var _042_byline_fields_exports = /* @__PURE__ */ __exportAll({
2432
+ down: () => down,
2433
+ up: () => up
2434
+ });
2435
+ /**
2436
+ * Byline custom fields (Discussion #1174). Adds three tables and a
2437
+ * version-counter row in `options`. Purely additive: no change to
2438
+ * `_emdash_bylines` columns landed by migration 040, no change to
2439
+ * `_emdash_content_bylines`.
2440
+ *
2441
+ * Storage model (D11 in the design spec):
2442
+ *
2443
+ * - `_emdash_byline_fields` — definitions. One row per registered field.
2444
+ * - `_emdash_byline_field_values` — translatable values, keyed by
2445
+ * `(byline_id, field_id)`. One value per locale variant of a byline.
2446
+ * - `_emdash_byline_field_group_values` — non-translatable values, keyed
2447
+ * by `(translation_group, field_id)`. One value shared across every
2448
+ * locale variant of the byline's translation group.
2449
+ *
2450
+ * The per-field `translatable` flag (column on `_emdash_byline_fields`)
2451
+ * decides which value table a field writes to. The split is at the
2452
+ * storage level rather than per-row so a single SELECT … IN per locale
2453
+ * bucket suffices for batched hydration (see Phase 3 of the PR plan).
2454
+ *
2455
+ * `options('byline_fields_version', '0')` is the version counter the
2456
+ * field-definitions cache reads (Phase 3). Every mutation on
2457
+ * `_emdash_byline_fields` bumps this row; cached defs invalidate on a
2458
+ * mismatch. Storing it in `options` (the same table `settings/index.ts`
2459
+ * uses) means we get the request-cache + persisted-version pattern for
2460
+ * free — no new infrastructure.
2461
+ *
2462
+ * Idempotency: every `CREATE TABLE` and `CREATE INDEX` uses
2463
+ * `.ifNotExists()`, so a partial prior run (a crash mid-migration, retried
2464
+ * after the runner's race-recovery path or after a manual fix) re-applies
2465
+ * cleanly — including any indexes that landed in the failed pass after the
2466
+ * table itself. A coarse table-level guard would skip the index step if the
2467
+ * table existed but indexes didn't (the realistic crash window between
2468
+ * `CREATE TABLE` and the next `CREATE INDEX`). The runner records applied
2469
+ * migrations only after a successful pass, so a crashed-then-retried `up()`
2470
+ * is the normal recovery path here.
2471
+ *
2472
+ * D1 has no transactions — the schema builder and `INSERT` for the
2473
+ * version row execute one statement at a time. Order matters: parent
2474
+ * tables first (`_emdash_byline_fields`), then the value tables that
2475
+ * reference it. If `down()` runs after a partial `up()`, missing tables
2476
+ * are tolerated (`DROP TABLE IF EXISTS`).
2477
+ */
2478
+ async function up(db) {
2479
+ await db.schema.createTable("_emdash_byline_fields").ifNotExists().addColumn("id", "text", (col) => col.primaryKey()).addColumn("slug", "text", (col) => col.notNull().unique()).addColumn("label", "text", (col) => col.notNull()).addColumn("type", "text", (col) => col.notNull()).addColumn("required", "integer", (col) => col.notNull().defaultTo(0)).addColumn("translatable", "integer", (col) => col.notNull().defaultTo(1)).addColumn("validation", "text").addColumn("sort_order", "integer", (col) => col.notNull().defaultTo(0)).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
2480
+ await db.schema.createIndex("idx__emdash_byline_fields_sort_order").ifNotExists().on("_emdash_byline_fields").column("sort_order").execute();
2481
+ await db.schema.createTable("_emdash_byline_field_values").ifNotExists().addColumn("byline_id", "text", (col) => col.notNull().references("_emdash_bylines.id").onDelete("cascade")).addColumn("field_id", "text", (col) => col.notNull().references("_emdash_byline_fields.id").onDelete("cascade")).addColumn("value", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addPrimaryKeyConstraint("_emdash_byline_field_values_pk", ["byline_id", "field_id"]).execute();
2482
+ await db.schema.createIndex("idx__emdash_byline_field_values_byline").ifNotExists().on("_emdash_byline_field_values").column("byline_id").execute();
2483
+ await db.schema.createIndex("idx__emdash_byline_field_values_field").ifNotExists().on("_emdash_byline_field_values").column("field_id").execute();
2484
+ await db.schema.createTable("_emdash_byline_field_group_values").ifNotExists().addColumn("translation_group", "text", (col) => col.notNull()).addColumn("field_id", "text", (col) => col.notNull().references("_emdash_byline_fields.id").onDelete("cascade")).addColumn("value", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addPrimaryKeyConstraint("_emdash_byline_field_group_values_pk", ["translation_group", "field_id"]).execute();
2485
+ await db.schema.createIndex("idx__emdash_byline_field_group_values_group").ifNotExists().on("_emdash_byline_field_group_values").column("translation_group").execute();
2486
+ await db.schema.createIndex("idx__emdash_byline_field_group_values_field").ifNotExists().on("_emdash_byline_field_group_values").column("field_id").execute();
2487
+ await sql`
2488
+ INSERT INTO options (name, value) VALUES ('byline_fields_version', '0')
2489
+ ON CONFLICT (name) DO NOTHING
2490
+ `.execute(db);
2491
+ }
2492
+ /**
2493
+ * Reverses the schema additions and removes the version-counter row.
2494
+ * Used by the test suite and by `rollbackMigration`; the runner itself
2495
+ * never invokes `down()` automatically.
2496
+ *
2497
+ * The drops are unconditional `IF EXISTS` so a `down()` after a partial
2498
+ * `up()` (only one or two tables landed) still settles the database back
2499
+ * to its pre-042 state.
2500
+ */
2501
+ async function down(db) {
2502
+ await db.schema.dropTable("_emdash_byline_field_group_values").ifExists().execute();
2503
+ await db.schema.dropTable("_emdash_byline_field_values").ifExists().execute();
2504
+ await db.schema.dropTable("_emdash_byline_fields").ifExists().execute();
2505
+ await sql`DELETE FROM options WHERE name = 'byline_fields_version'`.execute(db);
2506
+ }
2507
+
2384
2508
  //#endregion
2385
2509
  //#region src/database/migrations/runner.ts
2386
2510
  const MIGRATIONS = Object.freeze({
@@ -2422,7 +2546,9 @@ const MIGRATIONS = Object.freeze({
2422
2546
  "037_credential_algorithm": _037_credential_algorithm_exports,
2423
2547
  "038_registry_plugin_state": _038_registry_plugin_state_exports,
2424
2548
  "039_fix_fts5_triggers": _039_fix_fts5_triggers_exports,
2425
- "040_byline_i18n": _040_byline_i18n_exports
2549
+ "040_byline_i18n": _040_byline_i18n_exports,
2550
+ "041_content_locale_list_index": _041_content_locale_list_index_exports,
2551
+ "042_byline_fields": _042_byline_fields_exports
2426
2552
  });
2427
2553
  /** Total number of registered migrations. Exported for use in tests. */
2428
2554
  const MIGRATION_COUNT = Object.keys(MIGRATIONS).length;
@@ -2615,4 +2741,4 @@ async function rollbackMigration(db, options) {
2615
2741
 
2616
2742
  //#endregion
2617
2743
  export { __exportAll as i, rollbackMigration as n, runMigrations as r, getMigrationStatus as t };
2618
- //# sourceMappingURL=runner-Drnvs96u.mjs.map
2744
+ //# sourceMappingURL=runner-eAgyIkeg.mjs.map