dineway 0.2.33 → 0.2.35

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 (458) hide show
  1. package/dist/{activity-CfryM8jO.mjs → activity-BbtYp_4V.mjs} +2 -2
  2. package/dist/{activity-events-BVo9rMUz.mjs → activity-events-CiFN61xq.mjs} +1 -1
  3. package/dist/{actor-DrJJsvy6.mjs → actor-DxUAJgQX.mjs} +20 -6
  4. package/dist/{adapters-DHt3f2lu.d.mts → adapters-Rol-inz6.d.mts} +5 -7
  5. package/dist/after-BVaUn7bK.mjs +24 -0
  6. package/dist/{allowed-origins-DGSyhRCz.mjs → allowed-origins-Cp7BI3L9.mjs} +1 -1
  7. package/dist/api/route-utils.d.mts +10 -10
  8. package/dist/api/route-utils.mjs +23 -19
  9. package/dist/api/schemas/index.d.mts +1 -1
  10. package/dist/api/schemas/index.mjs +5 -5
  11. package/dist/{api-CTf1SLmg.mjs → api-CwhrR7H5.mjs} +55 -1215
  12. package/dist/api-tokens-DA18zxza.mjs +3 -0
  13. package/dist/{api-tokens-CSomx-l3.mjs → api-tokens-OAgvq4xg.mjs} +1 -1
  14. package/dist/{apply-Bs2jXsms.mjs → apply-BTfAReIv.mjs} +109 -93
  15. package/dist/astro/index.d.mts +16 -12
  16. package/dist/astro/index.mjs +50 -9
  17. package/dist/astro/middleware/auth.d.mts +9 -9
  18. package/dist/astro/middleware/auth.mjs +29 -8
  19. package/dist/astro/middleware/redirect.mjs +8 -7
  20. package/dist/astro/middleware/request-context.mjs +17 -10
  21. package/dist/astro/middleware/seed.d.mts +1 -1
  22. package/dist/astro/middleware/seed.mjs +93 -71
  23. package/dist/astro/middleware/setup.mjs +1 -1
  24. package/dist/astro/middleware/workers.d.mts +6 -0
  25. package/dist/astro/middleware/workers.mjs +8 -0
  26. package/dist/astro/middleware.mjs +287 -159
  27. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +7 -7
  28. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +7 -7
  29. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
  30. package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
  31. package/dist/astro/routes/api/admin/briefing.mjs +25 -23
  32. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +5 -4
  33. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +11 -10
  34. package/dist/astro/routes/api/admin/byline-fields/index.mjs +11 -10
  35. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +11 -10
  36. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +22 -20
  37. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +22 -20
  38. package/dist/astro/routes/api/admin/bylines/index.mjs +22 -20
  39. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +18 -16
  40. package/dist/astro/routes/api/admin/comments/_id_.mjs +8 -7
  41. package/dist/astro/routes/api/admin/comments/bulk.mjs +14 -13
  42. package/dist/astro/routes/api/admin/comments/counts.mjs +8 -7
  43. package/dist/astro/routes/api/admin/comments/index.mjs +14 -13
  44. package/dist/astro/routes/api/admin/context/_id_/history.mjs +42 -31
  45. package/dist/astro/routes/api/admin/context/_id_/index.mjs +42 -31
  46. package/dist/astro/routes/api/admin/context/_id_/review.mjs +47 -36
  47. package/dist/astro/routes/api/admin/context/_id_/supersede.mjs +47 -36
  48. package/dist/astro/routes/api/admin/context/diff.mjs +46 -35
  49. package/dist/astro/routes/api/admin/context/index.mjs +47 -36
  50. package/dist/astro/routes/api/admin/context/stale.mjs +46 -35
  51. package/dist/astro/routes/api/admin/hitl-requests/_id_/index.mjs +42 -31
  52. package/dist/astro/routes/api/admin/hitl-requests/_id_/resolve.mjs +46 -35
  53. package/dist/astro/routes/api/admin/hitl-requests/index.mjs +46 -35
  54. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +43 -32
  55. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
  56. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +7 -7
  57. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +7 -7
  58. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +71 -66
  59. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +71 -66
  60. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +63 -58
  61. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +70 -65
  62. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +70 -65
  63. package/dist/astro/routes/api/admin/plugins/index.mjs +63 -58
  64. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
  65. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +63 -58
  66. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +70 -65
  67. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +63 -58
  68. package/dist/astro/routes/api/admin/plugins/updates.mjs +63 -58
  69. package/dist/astro/routes/api/admin/review-requests/_id_/image.mjs +26 -23
  70. package/dist/astro/routes/api/admin/review-requests/_id_/index.mjs +39 -25
  71. package/dist/astro/routes/api/admin/review-requests/_id_/resolve.mjs +55 -43
  72. package/dist/astro/routes/api/admin/review-requests/_id_/revoke.mjs +10 -9
  73. package/dist/astro/routes/api/admin/review-requests/index.mjs +53 -41
  74. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +63 -58
  75. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +2 -2
  76. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +63 -58
  77. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +20 -12
  78. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +1 -1
  79. package/dist/astro/routes/api/admin/users/_id_/index.mjs +40 -32
  80. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +3 -3
  81. package/dist/astro/routes/api/admin/users/index.mjs +7 -7
  82. package/dist/astro/routes/api/auth/dev-bypass.mjs +6 -5
  83. package/dist/astro/routes/api/auth/invite/accept.mjs +1 -1
  84. package/dist/astro/routes/api/auth/invite/complete.mjs +12 -12
  85. package/dist/astro/routes/api/auth/invite/index.mjs +9 -9
  86. package/dist/astro/routes/api/auth/invite/register-options.mjs +11 -11
  87. package/dist/astro/routes/api/auth/logout.mjs +2 -2
  88. package/dist/astro/routes/api/auth/magic-link/send.mjs +12 -11
  89. package/dist/astro/routes/api/auth/magic-link/verify.mjs +2 -2
  90. package/dist/astro/routes/api/auth/me.mjs +11 -11
  91. package/dist/astro/routes/api/auth/mode.mjs +1 -1
  92. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +5 -4
  93. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +5 -4
  94. package/dist/astro/routes/api/auth/passkey/_id_.mjs +7 -7
  95. package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
  96. package/dist/astro/routes/api/auth/passkey/options.mjs +14 -13
  97. package/dist/astro/routes/api/auth/passkey/register/options.mjs +11 -11
  98. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +12 -12
  99. package/dist/astro/routes/api/auth/passkey/verify.mjs +12 -12
  100. package/dist/astro/routes/api/auth/setup-token/index.mjs +32 -23
  101. package/dist/astro/routes/api/auth/setup-token/verify.mjs +32 -26
  102. package/dist/astro/routes/api/auth/signup/complete.mjs +12 -12
  103. package/dist/astro/routes/api/auth/signup/request.mjs +12 -11
  104. package/dist/astro/routes/api/auth/signup/verify.mjs +1 -1
  105. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.d.mts +73 -2
  106. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +91 -49
  107. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +19 -16
  108. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
  109. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +8 -7
  110. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +8 -7
  111. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +8 -7
  112. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +24 -21
  113. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +34 -22
  114. package/dist/astro/routes/api/content/_collection_/_id_/release-readiness.mjs +9 -9
  115. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +8 -7
  116. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
  117. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +34 -22
  118. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +23 -19
  119. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
  120. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +8 -7
  121. package/dist/astro/routes/api/content/_collection_/_id_.mjs +14 -13
  122. package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
  123. package/dist/astro/routes/api/content/_collection_/index.mjs +14 -13
  124. package/dist/astro/routes/api/content/_collection_/trash.mjs +8 -8
  125. package/dist/astro/routes/api/dashboard.mjs +16 -11
  126. package/dist/astro/routes/api/dev/emails.mjs +2 -2
  127. package/dist/astro/routes/api/health.mjs +1 -1
  128. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  129. package/dist/astro/routes/api/import/probe.mjs +25 -24
  130. package/dist/astro/routes/api/import/wordpress/analyze.mjs +12 -11
  131. package/dist/astro/routes/api/import/wordpress/execute.d.mts +9 -9
  132. package/dist/astro/routes/api/import/wordpress/execute.mjs +50 -42
  133. package/dist/astro/routes/api/import/wordpress/media.d.mts +9 -9
  134. package/dist/astro/routes/api/import/wordpress/media.mjs +14 -14
  135. package/dist/astro/routes/api/import/wordpress/prepare.mjs +51 -40
  136. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +10 -10
  137. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +49 -38
  138. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  139. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +29 -27
  140. package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs +1 -1
  141. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +9 -9
  142. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +55 -47
  143. package/dist/astro/routes/api/integration/artifact.mjs +11 -8
  144. package/dist/astro/routes/api/integration/dispatch.mjs +17 -14
  145. package/dist/astro/routes/api/integrations/_provider_.mjs +11 -8
  146. package/dist/astro/routes/api/integrations/index.mjs +10 -7
  147. package/dist/astro/routes/api/manifest.mjs +5 -5
  148. package/dist/astro/routes/api/mcp.mjs +97 -88
  149. package/dist/astro/routes/api/media/_id_/confirm.mjs +12 -12
  150. package/dist/astro/routes/api/media/_id_.mjs +9 -9
  151. package/dist/astro/routes/api/media/file/_...key_.mjs +1 -1
  152. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
  153. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
  154. package/dist/astro/routes/api/media/providers/index.mjs +2 -2
  155. package/dist/astro/routes/api/media/upload-url.mjs +13 -13
  156. package/dist/astro/routes/api/media.mjs +16 -16
  157. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +47 -36
  158. package/dist/astro/routes/api/menus/_name_/items.mjs +47 -36
  159. package/dist/astro/routes/api/menus/_name_/reorder.mjs +47 -36
  160. package/dist/astro/routes/api/menus/_name_/translations.mjs +47 -36
  161. package/dist/astro/routes/api/menus/_name_.mjs +47 -36
  162. package/dist/astro/routes/api/menus/index.mjs +47 -36
  163. package/dist/astro/routes/api/oauth/authorize.mjs +9 -7
  164. package/dist/astro/routes/api/oauth/device/authorize.mjs +7 -6
  165. package/dist/astro/routes/api/oauth/device/code.mjs +11 -9
  166. package/dist/astro/routes/api/oauth/device/token.mjs +10 -8
  167. package/dist/astro/routes/api/oauth/register.mjs +4 -4
  168. package/dist/astro/routes/api/oauth/token/refresh.mjs +7 -6
  169. package/dist/astro/routes/api/oauth/token/revoke.mjs +7 -6
  170. package/dist/astro/routes/api/oauth/token.mjs +8 -6
  171. package/dist/astro/routes/api/openapi.json.mjs +5 -5
  172. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +4 -4
  173. package/dist/astro/routes/api/redirects/404s/index.mjs +15 -14
  174. package/dist/astro/routes/api/redirects/404s/summary.mjs +15 -14
  175. package/dist/astro/routes/api/redirects/_id_.mjs +47 -37
  176. package/dist/astro/routes/api/redirects/index.mjs +47 -37
  177. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +2 -2
  178. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +2 -2
  179. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +65 -60
  180. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +65 -60
  181. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +65 -60
  182. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +65 -60
  183. package/dist/astro/routes/api/schema/collections/index.mjs +65 -60
  184. package/dist/astro/routes/api/schema/index.mjs +12 -11
  185. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +63 -58
  186. package/dist/astro/routes/api/schema/orphans/index.mjs +63 -58
  187. package/dist/astro/routes/api/search/enable.mjs +15 -14
  188. package/dist/astro/routes/api/search/index.mjs +14 -13
  189. package/dist/astro/routes/api/search/rebuild.mjs +15 -14
  190. package/dist/astro/routes/api/search/stats.mjs +9 -8
  191. package/dist/astro/routes/api/search/suggest.mjs +14 -13
  192. package/dist/astro/routes/api/sections/_slug_.mjs +47 -36
  193. package/dist/astro/routes/api/sections/index.mjs +47 -36
  194. package/dist/astro/routes/api/settings/email.mjs +5 -5
  195. package/dist/astro/routes/api/settings/reviews.mjs +11 -10
  196. package/dist/astro/routes/api/settings.mjs +47 -36
  197. package/dist/astro/routes/api/setup/admin-verify.mjs +14 -14
  198. package/dist/astro/routes/api/setup/admin.mjs +12 -12
  199. package/dist/astro/routes/api/setup/dev-bypass.mjs +35 -31
  200. package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
  201. package/dist/astro/routes/api/setup/index.mjs +37 -33
  202. package/dist/astro/routes/api/setup/status.mjs +3 -3
  203. package/dist/astro/routes/api/snapshot.mjs +11 -9
  204. package/dist/astro/routes/api/system/heartbeat.mjs +2 -2
  205. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +50 -39
  206. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +50 -39
  207. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +50 -39
  208. package/dist/astro/routes/api/taxonomies/index.mjs +50 -39
  209. package/dist/astro/routes/api/themes/preview.mjs +8 -6
  210. package/dist/astro/routes/api/typegen.mjs +4 -4
  211. package/dist/astro/routes/api/well-known/auth.mjs +3 -3
  212. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +3 -3
  213. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +3 -3
  214. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +46 -35
  215. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +47 -36
  216. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +47 -36
  217. package/dist/astro/routes/api/widget-areas/_name_.mjs +44 -33
  218. package/dist/astro/routes/api/widget-areas/index.mjs +47 -36
  219. package/dist/astro/routes/api/widget-components.mjs +2 -2
  220. package/dist/astro/routes/robots.txt.mjs +11 -10
  221. package/dist/astro/routes/sitemap-_collection_.xml.mjs +20 -18
  222. package/dist/astro/routes/sitemap.xml.mjs +19 -17
  223. package/dist/astro/session-driver.d.mts +1 -1
  224. package/dist/astro/session-driver.mjs +4 -4
  225. package/dist/astro/types.d.mts +13 -13
  226. package/dist/atomic-authority-CnBQJ14T.mjs +33 -0
  227. package/dist/{audit-CYjfxG9i.mjs → audit-F5iWkbcJ.mjs} +11 -4
  228. package/dist/auth/providers/github.d.mts +1 -1
  229. package/dist/auth/providers/google.d.mts +1 -1
  230. package/dist/{auth-control-guard-CITT8ZA_.mjs → auth-control-guard-DPOSBNFI.mjs} +1 -1
  231. package/dist/{authorize-KcI0pAfN.mjs → authorize-CXIjxIfC.mjs} +1 -1
  232. package/dist/{briefing-BgQTljQt.mjs → briefing-5zf0YZbR.mjs} +445 -447
  233. package/dist/{briefing-r3hXCDQC.mjs → briefing-DiupPvyN.mjs} +1 -1
  234. package/dist/{bundle-S6zx-V4D.mjs → bundle-DImnxo71.mjs} +3 -3
  235. package/dist/{byline-Ctil4rij.mjs → byline-DEZKlzD9.mjs} +107 -113
  236. package/dist/{byline-fields-51ja6JDa.d.mts → byline-fields-BO96fXLv.d.mts} +8 -8
  237. package/dist/{byline-fields-DiCyW6eQ.mjs → byline-fields-CY6V0ew1.mjs} +1 -1
  238. package/dist/{byline-fields-QpmruT5r.mjs → byline-fields-DGNKitg3.mjs} +3 -3
  239. package/dist/{byline-registry-rkr73qSE.mjs → byline-registry-CkuVVeJJ.mjs} +46 -76
  240. package/dist/{bylines-v_ZUQnR-.mjs → bylines-CXyKpVLQ.mjs} +6 -6
  241. package/dist/{bylines-BcuBpzVi.mjs → bylines-gSAfpHl4.mjs} +4 -4
  242. package/dist/{cache-V2BCplaY.mjs → cache-DZDOBJv3.mjs} +2 -2
  243. package/dist/{chunks-CnuL55JE.mjs → chunks-BnG3LPMN.mjs} +1 -1
  244. package/dist/cli/index.mjs +452 -263
  245. package/dist/cli/plugin-kit.d.mts +9 -9
  246. package/dist/cli/plugin-kit.mjs +2 -2
  247. package/dist/client/external-auth-headers.d.mts +1 -1
  248. package/dist/client/index.d.mts +11 -11
  249. package/dist/client/index.mjs +2 -2
  250. package/dist/{client-factory-C-y9VZDX.mjs → client-factory-6vLLT06O.mjs} +1 -1
  251. package/dist/{comment-_nvJSS-A.mjs → comment-kgLTdtQD.mjs} +15 -8
  252. package/dist/{comment-reaction-DhVgJ17S.mjs → comment-reaction-Cun5eIXL.mjs} +1 -1
  253. package/dist/{comments-D4mIDjvA.mjs → comments-ZYK_cZvx.mjs} +1 -1
  254. package/dist/{content-CVCrcuvD.mjs → content-D9xKUSno.mjs} +287 -165
  255. package/dist/{content-refresh-QvBIyb_g.mjs → content-refresh-9M9cc55-.mjs} +170 -193
  256. package/dist/{context-JjKucxBm.mjs → context-BU8AbLmY.mjs} +2 -2
  257. package/dist/{context-MftkHbWx.mjs → context-C5lPtfeh.mjs} +95 -77
  258. package/dist/{context-route-helpers-e1APrqSm.mjs → context-route-helpers-CWAHJFl3.mjs} +2 -2
  259. package/dist/{cron-mGVPQ5e6.mjs → cron-BVYo08mi.mjs} +36 -32
  260. package/dist/d1-binding-D6HZa3ks.mjs +8 -0
  261. package/dist/d1-dialect-BBxPg6Om.mjs +48 -0
  262. package/dist/{dashboard-ZJ7sMcBI.mjs → dashboard-BnD5krLg.mjs} +5 -5
  263. package/dist/database/batch.d.mts +22 -0
  264. package/dist/database/batch.mjs +92 -0
  265. package/dist/database/d1/index.d.mts +18 -0
  266. package/dist/database/d1/index.mjs +8 -0
  267. package/dist/db/d1.d.mts +7 -0
  268. package/dist/db/d1.mjs +13 -0
  269. package/dist/db/index.d.mts +4 -4
  270. package/dist/db/index.mjs +10 -7
  271. package/dist/db/libsql.d.mts +1 -1
  272. package/dist/db/libsql.mjs +46 -3
  273. package/dist/db/postgres.d.mts +1 -1
  274. package/dist/db/sqlite.d.mts +1 -1
  275. package/dist/{device-flow-eOcL5m0Q.mjs → device-flow-Prqg6ycD.mjs} +130 -94
  276. package/dist/{dialect-helpers-fk43GbDb.mjs → dialect-helpers-C6xtO-Ui.mjs} +1 -1
  277. package/dist/{discovery-CJkuHGhZ.mjs → discovery-CYcZJ1o3.mjs} +5 -5
  278. package/dist/{enrich-KErvJOuI.mjs → enrich-BjF-J4sF.mjs} +1 -1
  279. package/dist/{evidence-6IUv9ML3.mjs → evidence-krrA3uiG.mjs} +7 -7
  280. package/dist/{field-defs-cache-CwrIyZFT.mjs → field-defs-cache-BKKFFf_V.mjs} +5 -5
  281. package/dist/{forgeway-account-lYJ8iX3G.mjs → forgeway-account-CnWOIusE.mjs} +1 -1
  282. package/dist/{fts-manager-DX7ZkrCa.mjs → fts-manager-DA74x_uP.mjs} +72 -57
  283. package/dist/{hitl-requests-CmYVunm-.mjs → hitl-requests-CGjA1jND.mjs} +2 -2
  284. package/dist/{hitl-route-helpers-CRm537zS.mjs → hitl-route-helpers-BxSL0iZB.mjs} +5 -5
  285. package/dist/{import-DqRAgsKr.mjs → import-CayDCPaH.mjs} +9 -9
  286. package/dist/{index-Co7xtjkd.d.mts → index-mlJSqFkG.d.mts} +7 -4
  287. package/dist/index.d.mts +16 -16
  288. package/dist/index.mjs +103 -96
  289. package/dist/{integration-credentials-qudN6yRr.mjs → integration-credentials-Br16M1VE.mjs} +2 -2
  290. package/dist/{jsonld-BpvnSp2m.d.mts → jsonld-BUiFEiCZ.d.mts} +2 -2
  291. package/dist/{load-fCOciq0Q.mjs → load-B2oitobd.mjs} +1 -1
  292. package/dist/{loader-BDje8ME2.mjs → loader-Cgsx23wU.mjs} +4 -4
  293. package/dist/{manifest-schema-CfKD0thC.mjs → manifest-schema-DBXM_g8l.mjs} +1 -1
  294. package/dist/{mcp-reviewed-executor-DmhM3Cy6.mjs → mcp-reviewed-executor-RJ71uyQb.mjs} +7 -7
  295. package/dist/media/image-endpoint.mjs +1 -1
  296. package/dist/media/index.d.mts +1 -1
  297. package/dist/media/index.mjs +2 -2
  298. package/dist/media/local-runtime.d.mts +11 -11
  299. package/dist/media/local-runtime.mjs +3 -3
  300. package/dist/{media-dvRjj4po.mjs → media-BZqwtRTZ.mjs} +12 -4
  301. package/dist/{media-allowlist-DaG6lNoy.mjs → media-allowlist-CyByjUXh.mjs} +1 -1
  302. package/dist/{menus-CZbz5L_V.mjs → menus-2o-DVcwA.mjs} +8 -8
  303. package/dist/{menus-CpuR4Qkm.mjs → menus-5liJusbp.mjs} +138 -90
  304. package/dist/migrations-C7YXse7V.mjs +76 -0
  305. package/dist/oauth-authority-DOjME4Hh.mjs +43 -0
  306. package/dist/{oauth-authorization-Jf5e3azH.mjs → oauth-authorization-B_mmz7O2.mjs} +89 -98
  307. package/dist/{oauth-clients-tovQ4D4h.mjs → oauth-clients-Cr4pdIAE.mjs} +2 -2
  308. package/dist/object-cache/memory.d.mts +1 -1
  309. package/dist/{object-cache-D51qOseS.mjs → object-cache-BGjIlY9s.mjs} +1 -1
  310. package/dist/page/index.d.mts +10 -10
  311. package/dist/page/index.mjs +1 -1
  312. package/dist/{parse-IsGn-5lt.mjs → parse-BscLr3p2.mjs} +1 -1
  313. package/dist/plugin-utils.d.mts +9 -9
  314. package/dist/plugins/adapt-sandbox-entry.d.mts +9 -9
  315. package/dist/plugins/adapt-sandbox-entry.mjs +1 -1
  316. package/dist/{plugins-DXyLI3Hb.mjs → plugins-f48yrwfI.mjs} +35 -84
  317. package/dist/{policy-DKdNMv8y.mjs → policy-CrK1vl8l.mjs} +2 -2
  318. package/dist/{preview-BXmS1SXL.mjs → preview-E1xKZGsX.mjs} +2 -2
  319. package/dist/{provider-loader-DDq7R_RN.d.mts → provider-loader-H2wdGD0o.d.mts} +1 -1
  320. package/dist/{public-url-Ci7UbC0W.d.mts → public-url-CI700CW4.d.mts} +1 -1
  321. package/dist/{public-url-BQ9vf0AS.d.mts → public-url-zoO-QbN6.d.mts} +2 -2
  322. package/dist/{publication-authorization-C-vYPGD8.mjs → publication-authorization-Dq_20SZR.mjs} +458 -33
  323. package/dist/{query-DcB9uGTW.mjs → query-BkWWdxyb.mjs} +4 -4
  324. package/dist/{query-CrW2yI6G.mjs → query-D6oNo9iz.mjs} +15 -15
  325. package/dist/{rate-limit-DEkoxTsP.mjs → rate-limit-RaBJEgyt.mjs} +2 -2
  326. package/dist/{redirect-DG-o0CKV.mjs → redirect-HLI3wT5Y.mjs} +26 -14
  327. package/dist/{redirects-Bjp4iKJU.mjs → redirects-D16GFaOa.mjs} +5 -5
  328. package/dist/{redirects-N8gmWhVM.mjs → redirects-DpRiuRWn.mjs} +3 -3
  329. package/dist/{registry-D-IV_h50.mjs → registry-DcV93OL_.mjs} +183 -186
  330. package/dist/release-CZfAeyXm.mjs +5148 -0
  331. package/dist/request-context.d.mts +8 -0
  332. package/dist/{request-meta-BW0the1R.mjs → request-meta-C6yGqnGD.mjs} +1 -1
  333. package/dist/{resolve-pZ4NQM-X.mjs → resolve-CpOV2jt_.mjs} +1 -1
  334. package/dist/review-payload-LLIi1sxO.mjs +1386 -0
  335. package/dist/{review-requests-DICrYH2-.mjs → review-requests-BF2eEKr8.mjs} +93 -37
  336. package/dist/{review-requests-BTKfeWlS.mjs → review-requests-C7prIbCo.mjs} +2 -2
  337. package/dist/{review-route-helpers-DaZBBps8.mjs → review-route-helpers-BYx3Px90.mjs} +2 -2
  338. package/dist/{revision-De7OmYVD.mjs → revision-090sZyGc.mjs} +28 -22
  339. package/dist/revocation-DZ8e4JCS.mjs +53 -0
  340. package/dist/{runner-DJiRFyLI.mjs → runner-CVeq0266.mjs} +594 -491
  341. package/dist/{runner-Dye73myO.d.mts → runner-Cxl-vyk2.d.mts} +1 -1
  342. package/dist/{runs-DEujUDOj.mjs → runs-B8kCirJ6.mjs} +5 -5
  343. package/dist/runtime-env-v-1UXPAH.mjs +19 -0
  344. package/dist/runtime.d.mts +10 -10
  345. package/dist/runtime.mjs +5 -5
  346. package/dist/schema-DFeC5axi.mjs +8 -0
  347. package/dist/{search-DxUKN9Zz.mjs → search-C9qOBgvo.mjs} +4 -4
  348. package/dist/{secrets-AdCrGg1c.mjs → secrets-BP2YTPWn.mjs} +10 -11
  349. package/dist/{sections-BPFOEMK6.mjs → sections-CkoQY7Z9.mjs} +2 -2
  350. package/dist/seed/index.d.mts +2 -2
  351. package/dist/seed/index.mjs +29 -25
  352. package/dist/seo/index.d.mts +3 -3
  353. package/dist/seo/index.mjs +11 -10
  354. package/dist/{seo-GfovzqpU.mjs → seo-Bypxm1iD.mjs} +1 -1
  355. package/dist/{seo-DWHdo5aW.mjs → seo-DYpc_rQ1.mjs} +25 -15
  356. package/dist/{service-BrNKVCjC.mjs → service-DOFqfUVv.mjs} +46 -21
  357. package/dist/{service-DbgjHWyW.mjs → service-mJBl4ZP4.mjs} +2 -2
  358. package/dist/{session-user-D8WwGEPH.mjs → session-user-DacoiKrJ.mjs} +1 -1
  359. package/dist/{settings-BKEHw6Bu.mjs → settings-2p7TuNWG.mjs} +2 -2
  360. package/dist/{settings-CAsQLi0N.mjs → settings-DRFy8JQx.mjs} +8 -8
  361. package/dist/{setup-complete-CHCYS5KV.mjs → setup-complete-CWMnrNFN.mjs} +1 -1
  362. package/dist/{site-activity-7oezuHXK.mjs → site-activity-BrN2NviL.mjs} +11 -4
  363. package/dist/{site-context-CA7rbxux.mjs → site-context-D9oETfxF.mjs} +50 -37
  364. package/dist/{site-url-DoZf_jVj.mjs → site-url-DoTPKRND.mjs} +1 -1
  365. package/dist/state-D8AogXCV.mjs +30 -0
  366. package/dist/storage/local.d.mts +1 -1
  367. package/dist/storage/local.mjs +1 -1
  368. package/dist/storage/s3.d.mts +1 -1
  369. package/dist/storage/s3.mjs +3 -3
  370. package/dist/{store-c4qx3gVh.mjs → store-CjmmGlVw.mjs} +37 -12
  371. package/dist/submission-BLvkvewK.mjs +411 -0
  372. package/dist/{taxonomies-ALDiRQ84.mjs → taxonomies-C5ayPp3T.mjs} +3 -3
  373. package/dist/{taxonomies-93DV-1QT.mjs → taxonomies-DW6Fps-w.mjs} +7 -7
  374. package/dist/{taxonomy-BOBTJ_aE.mjs → taxonomy-DWxxLpp5.mjs} +3 -3
  375. package/dist/{tokens-c-qxNqzC.mjs → tokens-I3tSjoFI.mjs} +1 -1
  376. package/dist/{trusted-proxy-CdEl6g6B.mjs → trusted-proxy-CvDP0g0F.mjs} +4 -12
  377. package/dist/{types-6KmeXInJ.d.mts → types-BFoQ5a1v.d.mts} +1 -1
  378. package/dist/{types-BpSTdH1H.mjs → types-BqxIv8Il.mjs} +2 -2
  379. package/dist/{types-BRCUO8NR.d.mts → types-CVRNRAA5.d.mts} +1 -0
  380. package/dist/{types-CfpX1og5.d.mts → types-Tt_IGMno.d.mts} +360 -172
  381. package/dist/ui/server-runtime.d.mts +13 -13
  382. package/dist/ui/server-runtime.mjs +28 -26
  383. package/dist/{user-D0NJ7gYf.mjs → user-1-YV30lf.mjs} +2 -2
  384. package/dist/{utils-BK2efsHv.mjs → utils-BoWkoty8.mjs} +2 -2
  385. package/dist/{validate-CDWVODvc.d.mts → validate-CCOsvPg2.d.mts} +3 -3
  386. package/dist/{validate-C9g9iX3q.mjs → validate-CupwWNWL.mjs} +3 -3
  387. package/dist/version-DpT-k_Ny.mjs +6 -0
  388. package/dist/{widgets-Cm5Qx2Np.mjs → widgets-DbOctkXv.mjs} +3 -3
  389. package/dist/{wordpress-slugs-WdPZaVXf.mjs → wordpress-slugs-pQlLXbKn.mjs} +1 -1
  390. package/dist/{worker-Bhuu7eqS.mjs → worker-wjRq4FI9.mjs} +76 -47
  391. package/dist/workers-build-QVrquLLe.mjs +36 -0
  392. package/dist/{zod-generator-DS5oZNaL.mjs → zod-generator-BzACAoR5.mjs} +2 -2
  393. package/package.json +34 -8
  394. package/dist/after-BfniwgIf.mjs +0 -9
  395. package/dist/api-tokens-CmT83Bgj.mjs +0 -3
  396. package/dist/db/libsql-http.d.mts +0 -27
  397. package/dist/db/libsql-http.mjs +0 -29
  398. package/dist/libsql-dialect-CANq6UNI.mjs +0 -47
  399. package/dist/oauth-user-lookup-B451pZmd.mjs +0 -25
  400. package/dist/review-payload-f1L4lzQg.mjs +0 -111
  401. package/dist/revocation-CkTOhdlw.mjs +0 -42
  402. package/dist/schema-IjuRxkqq.mjs +0 -8
  403. package/dist/submission-C47cHBIg.mjs +0 -67
  404. package/dist/transaction-BGQgnwUi.mjs +0 -28
  405. package/dist/version-CJqc1mwj.mjs +0 -6
  406. /package/dist/{base64-F8-DUraK.mjs → base64-Cz-aU0X1.mjs} +0 -0
  407. /package/dist/{challenge-store-CDKfye2r.mjs → challenge-store-DFGsDtCj.mjs} +0 -0
  408. /package/dist/{components-DAq_4iPX.mjs → components-gMTtJqHg.mjs} +0 -0
  409. /package/dist/{config-CVssduLe.mjs → config-XW5tMrH8.mjs} +0 -0
  410. /package/dist/{content-index-names-Bbu1FY1r.mjs → content-index-names-CDc2IQIx.mjs} +0 -0
  411. /package/dist/{context-types-CPWAJRs5.mjs → context-types-DLD_HnKT.mjs} +0 -0
  412. /package/dist/{default-BeIzUa1e.mjs → default-w3MwLng7.mjs} +0 -0
  413. /package/dist/{email-console-Bfi_exVg.mjs → email-console-CpvgEN1w.mjs} +0 -0
  414. /package/dist/{error-DLg1H2LT.mjs → error-B-44r5TD.mjs} +0 -0
  415. /package/dist/{escape-C6lkys0j.mjs → escape-B1GM0yJU.mjs} +0 -0
  416. /package/dist/{experimental-workflows-B9x8delL.mjs → experimental-workflows-fzJHB3ZI.mjs} +0 -0
  417. /package/dist/{hash-jhbF98tT.mjs → hash-DvMZXj2L.mjs} +0 -0
  418. /package/dist/{media-url-CL3NzgLh.mjs → media-url-D-elxQjL.mjs} +0 -0
  419. /package/dist/{mime-CDTtL7jE.mjs → mime-D_ae-u_U.mjs} +0 -0
  420. /package/dist/{mode-DJeacFCZ.mjs → mode-BJwb_MgK.mjs} +0 -0
  421. /package/dist/{normalize-Ev3FiBMx.mjs → normalize-5rct_U0I.mjs} +0 -0
  422. /package/dist/{oauth-state-store-Do1a_o3H.mjs → oauth-state-store-D2H9hKcN.mjs} +0 -0
  423. /package/dist/{options-1dBRkoCl.mjs → options-BcqHWpc-.mjs} +0 -0
  424. /package/dist/{output-8j9oltTf.mjs → output-CdmbQioY.mjs} +0 -0
  425. /package/dist/{parser-C9rzPuSZ.mjs → parser-ehIlj32k.mjs} +0 -0
  426. /package/dist/{passkey-config-CRN44T04.mjs → passkey-config-sUQoLEj_.mjs} +0 -0
  427. /package/dist/{patterns-3XE9bU4r.mjs → patterns-CZ7D4y_R.mjs} +0 -0
  428. /package/dist/{placeholder-D03pGvqM.d.mts → placeholder-CQKI6vLd.d.mts} +0 -0
  429. /package/dist/{portable-text-BdRm4uZq.d.mts → portable-text-BE7nszX6.d.mts} +0 -0
  430. /package/dist/{portable-text-tIk9_uz_.mjs → portable-text-DH3Om_2D.mjs} +0 -0
  431. /package/dist/{process-cache-B-L-A9zg.mjs → process-cache-MHM4Sqzs.mjs} +0 -0
  432. /package/dist/{provider-loader-C4i82ll1.mjs → provider-loader-Dnv2neOu.mjs} +0 -0
  433. /package/dist/{public-discovery-CyDzK1-S.mjs → public-discovery-CTql6jdZ.mjs} +0 -0
  434. /package/dist/{public-url-BVIjzMo3.mjs → public-url-4sMO36Gw.mjs} +0 -0
  435. /package/dist/{public-url-oudwI7K0.mjs → public-url-DNt9A1yS.mjs} +0 -0
  436. /package/dist/{redirect-Dp5u-8dH.mjs → redirect-Cjjb5VYr.mjs} +0 -0
  437. /package/dist/{request-cache-BruBnFAR.mjs → request-cache-DPmV5nk4.mjs} +0 -0
  438. /package/dist/{seo-contributions-BAtRDXEQ.mjs → seo-contributions-atY3jZEV.mjs} +0 -0
  439. /package/dist/{service-DeX1PRNt.mjs → service-CeEi6nax.mjs} +0 -0
  440. /package/dist/{setup-nonce-D-CEYlw7.mjs → setup-nonce-BUmfCiY1.mjs} +0 -0
  441. /package/dist/{sidecar-client-Bw2C0XTf.mjs → sidecar-client-CbrX8nuw.mjs} +0 -0
  442. /package/dist/{slugify-KSsVD_D3.mjs → slugify-Di8Q_MFq.mjs} +0 -0
  443. /package/dist/{ssrf-C7tTSD1r.mjs → ssrf-COxLChKv.mjs} +0 -0
  444. /package/dist/{stable-hash-DF7R5eN8.mjs → stable-hash-DEtJgcp7.mjs} +0 -0
  445. /package/dist/{status-Bba6RbkS.mjs → status-DBSB6tdS.mjs} +0 -0
  446. /package/dist/{transport-ktLL9r2O.d.mts → transport-CZbtxgKZ.d.mts} +0 -0
  447. /package/dist/{transport-BddGhTAI.mjs → transport-aPKvM53n.mjs} +0 -0
  448. /package/dist/{types-CKIt_jmM.d.mts → types-1qU0-N1P.d.mts} +0 -0
  449. /package/dist/{types-BQZFeZjd.mjs → types-BKsk4nnM.mjs} +0 -0
  450. /package/dist/{types-CLMOusxP.d.mts → types-BWsEjujW.d.mts} +0 -0
  451. /package/dist/{types--3oJQ0hs.d.mts → types-CAD4OvmF.d.mts} +0 -0
  452. /package/dist/{types-BbkkkAb6.mjs → types-ChSk0dmw.mjs} +0 -0
  453. /package/dist/{types-C0DPvhR5.mjs → types-CyBH89BS.mjs} +0 -0
  454. /package/dist/{types-CU3Wn2HC.d.mts → types-DNPP-eu4.d.mts} +0 -0
  455. /package/dist/{types-CPaVj_GC.d.mts → types-SddyDti7.d.mts} +0 -0
  456. /package/dist/{url-C_pLSrGZ.mjs → url-Ce0qtSdB.mjs} +0 -0
  457. /package/dist/{url-Dumsft7G.mjs → url-DfqolpO2.mjs} +0 -0
  458. /package/dist/{validate-VPnKoIzW.mjs → validate-Co3j6T_K.mjs} +0 -0
@@ -1,4 +1,4 @@
1
- import { t as SiteBriefingAssembler } from "./briefing-BgQTljQt.mjs";
1
+ import { t as SiteBriefingAssembler } from "./briefing-5zf0YZbR.mjs";
2
2
 
3
3
  //#region src/api/handlers/briefing.ts
4
4
  async function handleSiteBriefingGet(options, input) {
@@ -1,13 +1,13 @@
1
- import { a as __exportAll } from "./runner-DJiRFyLI.mjs";
2
- import { t as capabilitiesToDeclaredAccess } from "./types-BbkkkAb6.mjs";
1
+ import { c as __exportAll } from "./runner-CVeq0266.mjs";
2
+ import { t as capabilitiesToDeclaredAccess } from "./types-ChSk0dmw.mjs";
3
3
  import { createHash } from "node:crypto";
4
4
  import { imageSize } from "image-size";
5
5
  import { createWriteStream } from "node:fs";
6
6
  import { basename, extname, join, resolve } from "node:path";
7
7
  import { pathToFileURL } from "node:url";
8
+ import { access, copyFile, mkdir, readFile, readdir, rm, stat, symlink, writeFile } from "node:fs/promises";
8
9
  import { defineCommand } from "citty";
9
10
  import consola from "consola";
10
- import { access, copyFile, mkdir, readFile, readdir, rm, stat, symlink, writeFile } from "node:fs/promises";
11
11
  import { pipeline } from "node:stream/promises";
12
12
  import { packTar } from "modern-tar/fs";
13
13
 
@@ -1,12 +1,12 @@
1
- import { a as __exportAll } from "./runner-DJiRFyLI.mjs";
2
- import { t as validateIdentifier } from "./validate-VPnKoIzW.mjs";
3
- import { l as listTablesLike } from "./dialect-helpers-fk43GbDb.mjs";
4
- import { i as encodeCursor, r as decodeCursor, t as DinewayValidationError } from "./types-BpSTdH1H.mjs";
5
- import { a as invalidateBylineObjectCache, o as invalidateCollectionCache } from "./object-cache-D51qOseS.mjs";
6
- import { n as chunks, t as SQL_BATCH_SIZE } from "./chunks-CnuL55JE.mjs";
7
- import { t as withTransaction } from "./transaction-BGQgnwUi.mjs";
8
- import { i as setRequestCacheEntry, n as peekRequestCache, t as clearRequestCacheEntry } from "./request-cache-BruBnFAR.mjs";
9
- import { n as getBylineFieldDefs } from "./field-defs-cache-CwrIyZFT.mjs";
1
+ import { c as __exportAll } from "./runner-CVeq0266.mjs";
2
+ import { atomicBatch, rowUnchanged } from "./database/batch.mjs";
3
+ import { t as validateIdentifier } from "./validate-Co3j6T_K.mjs";
4
+ import { l as listTablesLike } from "./dialect-helpers-C6xtO-Ui.mjs";
5
+ import { i as encodeCursor, r as decodeCursor, t as DinewayValidationError } from "./types-BqxIv8Il.mjs";
6
+ import { a as invalidateBylineObjectCache, o as invalidateCollectionCache } from "./object-cache-BGjIlY9s.mjs";
7
+ import { n as chunks, t as SQL_BATCH_SIZE } from "./chunks-BnG3LPMN.mjs";
8
+ import { i as setRequestCacheEntry, n as peekRequestCache, t as clearRequestCacheEntry } from "./request-cache-DPmV5nk4.mjs";
9
+ import { n as getBylineFieldDefs } from "./field-defs-cache-BKKFFf_V.mjs";
10
10
  import { sql } from "kysely";
11
11
  import { ulid } from "ulidx";
12
12
 
@@ -214,45 +214,29 @@ var BylineRepository = class {
214
214
  }
215
215
  return writes;
216
216
  }
217
- async writeCustomFields(trx, bylineId, translationGroup, writes, now) {
218
- let touchedGroupShared = false;
217
+ prepareCustomFields(bylineId, translationGroup, writes, now) {
218
+ const checks = [];
219
+ const statements = [];
219
220
  for (const { field, value } of writes) {
220
- if (!field.translatable) touchedGroupShared = true;
221
- if (field.translatable) {
222
- if (value === null) {
223
- await trx.deleteFrom("_dineway_byline_field_values").where("byline_id", "=", bylineId).where("field_id", "=", field.id).execute();
224
- continue;
225
- }
226
- const encoded = JSON.stringify(value);
227
- await trx.insertInto("_dineway_byline_field_values").values({
228
- byline_id: bylineId,
229
- field_id: field.id,
230
- value: encoded,
231
- created_at: now,
232
- updated_at: now
233
- }).onConflict((oc) => oc.columns(["byline_id", "field_id"]).doUpdateSet({
234
- value: encoded,
235
- updated_at: now
236
- })).execute();
237
- continue;
238
- }
239
- if (value === null) {
240
- await trx.deleteFrom("_dineway_byline_field_group_values").where("translation_group", "=", translationGroup).where("field_id", "=", field.id).execute();
241
- continue;
242
- }
243
- const encoded = JSON.stringify(value);
244
- await trx.insertInto("_dineway_byline_field_group_values").values({
245
- translation_group: translationGroup,
246
- field_id: field.id,
247
- value: encoded,
248
- created_at: now,
249
- updated_at: now
250
- }).onConflict((oc) => oc.columns(["translation_group", "field_id"]).doUpdateSet({
251
- value: encoded,
252
- updated_at: now
253
- })).execute();
221
+ checks.push(rowUnchanged("_dineway_byline_fields", {
222
+ id: field.id,
223
+ type: field.type,
224
+ required: field.required ? 1 : 0,
225
+ translatable: field.translatable ? 1 : 0,
226
+ validation: field.validation ? JSON.stringify(field.validation) : null
227
+ }));
228
+ const table = field.translatable ? "_dineway_byline_field_values" : "_dineway_byline_field_group_values";
229
+ const owner = field.translatable ? "byline_id" : "translation_group";
230
+ const ownerId = field.translatable ? bylineId : translationGroup;
231
+ if (value === null) statements.push(sql`DELETE FROM ${sql.table(table)} WHERE ${sql.ref(owner)} = ${ownerId} AND field_id = ${field.id}`.compile(this.db));
232
+ else statements.push(sql`INSERT INTO ${sql.table(table)} (${sql.ref(owner)}, field_id, value, created_at, updated_at)
233
+ VALUES (${ownerId}, ${field.id}, ${JSON.stringify(value)}, ${now}, ${now})
234
+ ON CONFLICT (${sql.ref(owner)}, field_id) DO UPDATE SET value = excluded.value, updated_at = excluded.updated_at`.compile(this.db));
254
235
  }
255
- return touchedGroupShared;
236
+ return {
237
+ checks,
238
+ statements
239
+ };
256
240
  }
257
241
  async findById(id) {
258
242
  const row = await this.db.selectFrom("_dineway_bylines").selectAll().where("id", "=", id).executeTakeFirst();
@@ -310,15 +294,13 @@ var BylineRepository = class {
310
294
  const id = ulid();
311
295
  const now = (/* @__PURE__ */ new Date()).toISOString();
312
296
  const customFieldWrites = await this.resolveCustomFieldWrites(input.customFields);
313
- let translationGroup = id;
314
- if (input.translationOf) {
315
- const source = await this.findById(input.translationOf);
316
- if (!source) throw new Error("Source byline for translation not found");
317
- translationGroup = source.translationGroup ?? source.id;
318
- }
319
- let touchedGroupShared = false;
320
- await withTransaction(this.db, async (trx) => {
321
- await trx.insertInto("_dineway_bylines").values({
297
+ const source = input.translationOf ? await this.db.selectFrom("_dineway_bylines").selectAll().where("id", "=", input.translationOf).executeTakeFirst() : null;
298
+ if (input.translationOf && !source) throw new Error("Source byline for translation not found");
299
+ const translationGroup = source?.translation_group ?? source?.id ?? id;
300
+ const fields = this.prepareCustomFields(id, translationGroup, customFieldWrites, now);
301
+ await atomicBatch(this.db, {
302
+ checks: [...source ? [rowUnchanged("_dineway_bylines", source)] : [], ...fields.checks ?? []],
303
+ statements: [this.db.insertInto("_dineway_bylines").values({
322
304
  id,
323
305
  slug: input.slug,
324
306
  display_name: input.displayName,
@@ -331,17 +313,16 @@ var BylineRepository = class {
331
313
  updated_at: now,
332
314
  ...input.locale !== void 0 ? { locale: input.locale } : {},
333
315
  translation_group: translationGroup
334
- }).execute();
335
- touchedGroupShared = await this.writeCustomFields(trx, id, translationGroup, customFieldWrites, now);
316
+ }).compile(), ...fields.statements]
336
317
  });
337
- if (touchedGroupShared) clearRequestCacheEntry(`byline-field-group-values:${translationGroup}`);
318
+ if (customFieldWrites.some(({ field }) => !field.translatable)) clearRequestCacheEntry(`byline-field-group-values:${translationGroup}`);
338
319
  invalidateBylineObjectCache();
339
320
  const byline = await this.findById(id);
340
321
  if (!byline) throw new Error("Failed to create byline");
341
322
  return byline;
342
323
  }
343
324
  async update(id, input) {
344
- const existing = await this.findById(id);
325
+ const existing = await this.db.selectFrom("_dineway_bylines").selectAll().where("id", "=", id).executeTakeFirst();
345
326
  if (!existing) return null;
346
327
  const customFieldWrites = await this.resolveCustomFieldWrites(input.customFields);
347
328
  const now = (/* @__PURE__ */ new Date()).toISOString();
@@ -353,39 +334,39 @@ var BylineRepository = class {
353
334
  if (input.websiteUrl !== void 0) updates.website_url = input.websiteUrl;
354
335
  if (input.userId !== void 0) updates.user_id = input.userId;
355
336
  if (input.isGuest !== void 0) updates.is_guest = input.isGuest ? 1 : 0;
356
- const group = existing.translationGroup ?? existing.id;
357
- let touchedGroupShared = false;
358
- await withTransaction(this.db, async (trx) => {
359
- await trx.updateTable("_dineway_bylines").set(updates).where("id", "=", id).execute();
360
- touchedGroupShared = await this.writeCustomFields(trx, id, group, customFieldWrites, now);
337
+ const group = existing.translation_group ?? existing.id;
338
+ const fields = this.prepareCustomFields(id, group, customFieldWrites, now);
339
+ await atomicBatch(this.db, {
340
+ checks: [rowUnchanged("_dineway_bylines", existing), ...fields.checks ?? []],
341
+ statements: [this.db.updateTable("_dineway_bylines").set(updates).where("id", "=", id).compile(), ...fields.statements]
361
342
  });
362
- if (touchedGroupShared) clearRequestCacheEntry(`byline-field-group-values:${group}`);
343
+ if (customFieldWrites.some(({ field }) => !field.translatable)) clearRequestCacheEntry(`byline-field-group-values:${group}`);
363
344
  invalidateBylineObjectCache();
364
345
  return await this.findById(id);
365
346
  }
366
347
  async delete(id) {
367
- const existing = await this.findById(id);
348
+ const existing = await this.db.selectFrom("_dineway_bylines").selectAll().where("id", "=", id).executeTakeFirst();
368
349
  if (!existing) return false;
369
- const group = existing.translationGroup ?? existing.id;
370
- await withTransaction(this.db, async (trx) => {
371
- await trx.deleteFrom("_dineway_byline_field_values").where("byline_id", "=", id).execute();
372
- await trx.deleteFrom("_dineway_bylines").where("id", "=", id).execute();
373
- const remaining = await trx.selectFrom("_dineway_bylines").select(({ fn }) => [fn.count("id").as("count")]).where("translation_group", "=", group).executeTakeFirst();
374
- if (Number(remaining?.count ?? 0) > 0) return;
375
- await trx.deleteFrom("_dineway_content_bylines").where("byline_id", "=", group).execute();
376
- await trx.deleteFrom("_dineway_byline_field_group_values").where("translation_group", "=", group).execute();
377
- const tableNames = await listTablesLike(trx, "ec_%");
378
- for (const tableName of tableNames) {
379
- validateIdentifier(tableName, "content table");
380
- await sql`
381
- UPDATE ${sql.ref(tableName)}
382
- SET primary_byline_id = NULL
383
- WHERE primary_byline_id = ${group}
384
- `.execute(trx);
385
- }
350
+ const group = existing.translation_group ?? existing.id;
351
+ const noTranslation = sql`NOT EXISTS (SELECT 1 FROM _dineway_bylines WHERE translation_group = ${group})`;
352
+ const statements = [
353
+ this.db.deleteFrom("_dineway_byline_field_values").where("byline_id", "=", id).compile(),
354
+ this.db.deleteFrom("_dineway_bylines").where("id", "=", id).compile(),
355
+ this.db.deleteFrom("_dineway_content_bylines").where("byline_id", "=", group).where(noTranslation).compile(),
356
+ this.db.deleteFrom("_dineway_byline_field_group_values").where("translation_group", "=", group).where(noTranslation).compile()
357
+ ];
358
+ const tableNames = await listTablesLike(this.db, "ec_%");
359
+ for (const tableName of tableNames) {
360
+ validateIdentifier(tableName, "content table");
361
+ statements.push(sql`UPDATE ${sql.table(tableName)} SET primary_byline_id = NULL WHERE primary_byline_id = ${group} AND ${noTranslation}`.compile(this.db));
362
+ }
363
+ await atomicBatch(this.db, {
364
+ checks: [rowUnchanged("_dineway_bylines", existing)],
365
+ statements
386
366
  });
387
367
  clearRequestCacheEntry(`byline-field-group-values:${group}`);
388
368
  invalidateBylineObjectCache();
369
+ for (const tableName of tableNames) invalidateCollectionCache(tableName.slice(3));
389
370
  return true;
390
371
  }
391
372
  async getContentBylines(collectionSlug, contentId, options) {
@@ -517,44 +498,50 @@ var BylineRepository = class {
517
498
  }
518
499
  return result;
519
500
  }
520
- async copyContentBylines(collectionSlug, sourceContentId, targetContentId) {
501
+ async prepareCopyContentBylines(collectionSlug, sourceContentId, targetContentId) {
521
502
  validateIdentifier(collectionSlug, "collection slug");
522
- const tableName = `ec_${collectionSlug}`;
523
- validateIdentifier(tableName, "content table");
524
- if (await this.db.selectFrom("_dineway_content_bylines").select("id").where("collection_slug", "=", collectionSlug).where("content_id", "=", targetContentId).executeTakeFirst()) return;
525
- const sourceRows = await this.db.selectFrom("_dineway_content_bylines").select([
526
- "byline_id",
527
- "sort_order",
528
- "role_label"
529
- ]).where("collection_slug", "=", collectionSlug).where("content_id", "=", sourceContentId).orderBy("sort_order", "asc").execute();
530
- if (sourceRows.length === 0) return;
531
- const now = (/* @__PURE__ */ new Date()).toISOString();
532
- await this.db.insertInto("_dineway_content_bylines").values(sourceRows.map((row) => ({
503
+ const source = await this.db.selectFrom("_dineway_content_bylines").selectAll().where("collection_slug", "=", collectionSlug).where("content_id", "=", sourceContentId).orderBy("sort_order", "asc").execute();
504
+ const checks = [
505
+ sql`NOT EXISTS (SELECT 1 FROM _dineway_content_bylines WHERE collection_slug = ${collectionSlug} AND content_id = ${targetContentId})`,
506
+ sql`(SELECT COUNT(*) FROM _dineway_content_bylines WHERE collection_slug = ${collectionSlug} AND content_id = ${sourceContentId}) = ${source.length}`,
507
+ ...source.map((row) => rowUnchanged("_dineway_content_bylines", row))
508
+ ];
509
+ const statements = source.map((row) => this.db.insertInto("_dineway_content_bylines").values({
510
+ ...row,
533
511
  id: ulid(),
534
- collection_slug: collectionSlug,
535
512
  content_id: targetContentId,
536
- byline_id: row.byline_id,
537
- sort_order: row.sort_order,
538
- role_label: row.role_label,
539
- created_at: now
540
- }))).execute();
541
- await sql`
542
- UPDATE ${sql.ref(tableName)}
543
- SET primary_byline_id = ${sourceRows[0]?.byline_id ?? null}
544
- WHERE id = ${targetContentId}
545
- `.execute(this.db);
513
+ created_at: (/* @__PURE__ */ new Date()).toISOString()
514
+ }).compile());
515
+ if (source.length) statements.push(sql`UPDATE ${sql.table(`ec_${collectionSlug}`)} SET primary_byline_id = ${source[0].byline_id} WHERE id = ${targetContentId}`.compile(this.db));
516
+ return {
517
+ checks,
518
+ statements
519
+ };
520
+ }
521
+ async copyContentBylines(collectionSlug, sourceContentId, targetContentId) {
522
+ if (await this.db.selectFrom("_dineway_content_bylines").select("id").where("collection_slug", "=", collectionSlug).where("content_id", "=", targetContentId).executeTakeFirst()) return;
523
+ const prepared = await this.prepareCopyContentBylines(collectionSlug, sourceContentId, targetContentId);
524
+ await atomicBatch(this.db, {
525
+ ...prepared,
526
+ checks: [...prepared.checks ?? [], sql`EXISTS (SELECT 1 FROM ${sql.table(`ec_${collectionSlug}`)} WHERE id = ${targetContentId} AND deleted_at IS NULL)`]
527
+ });
546
528
  invalidateCollectionCache(collectionSlug);
547
529
  }
548
- async setContentBylines(collectionSlug, contentId, inputBylines) {
530
+ async prepareContentBylines(collectionSlug, contentId, inputBylines) {
549
531
  validateIdentifier(collectionSlug, "collection slug");
550
532
  const tableName = `ec_${collectionSlug}`;
551
533
  validateIdentifier(tableName, "content table");
534
+ const checks = [];
535
+ const statements = [];
552
536
  const idToGroup = /* @__PURE__ */ new Map();
553
537
  if (inputBylines.length > 0) {
554
538
  const ids = [...new Set(inputBylines.map((item) => item.bylineId))];
555
539
  const rows = await this.db.selectFrom("_dineway_bylines").select(["id", "translation_group"]).where("id", "in", ids).execute();
556
540
  if (rows.length !== ids.length) throw new Error("One or more byline IDs do not exist");
557
- for (const row of rows) idToGroup.set(row.id, row.translation_group ?? row.id);
541
+ for (const row of rows) {
542
+ idToGroup.set(row.id, row.translation_group ?? row.id);
543
+ checks.push(rowUnchanged("_dineway_bylines", row));
544
+ }
558
545
  }
559
546
  const seenGroups = /* @__PURE__ */ new Set();
560
547
  const bylines = [];
@@ -568,11 +555,11 @@ var BylineRepository = class {
568
555
  group
569
556
  });
570
557
  }
571
- await this.db.deleteFrom("_dineway_content_bylines").where("collection_slug", "=", collectionSlug).where("content_id", "=", contentId).execute();
558
+ statements.push(this.db.deleteFrom("_dineway_content_bylines").where("collection_slug", "=", collectionSlug).where("content_id", "=", contentId).compile());
572
559
  for (let i = 0; i < bylines.length; i++) {
573
560
  const item = bylines[i];
574
561
  if (!item) continue;
575
- await this.db.insertInto("_dineway_content_bylines").values({
562
+ statements.push(this.db.insertInto("_dineway_content_bylines").values({
576
563
  id: ulid(),
577
564
  collection_slug: collectionSlug,
578
565
  content_id: contentId,
@@ -580,13 +567,20 @@ var BylineRepository = class {
580
567
  sort_order: i,
581
568
  role_label: item.roleLabel ?? null,
582
569
  created_at: (/* @__PURE__ */ new Date()).toISOString()
583
- }).execute();
570
+ }).compile());
584
571
  }
585
- await sql`
572
+ statements.push(sql`
586
573
  UPDATE ${sql.ref(tableName)}
587
574
  SET primary_byline_id = ${bylines[0]?.group ?? null}
588
575
  WHERE id = ${contentId}
589
- `.execute(this.db);
576
+ `.compile(this.db));
577
+ return {
578
+ checks,
579
+ statements
580
+ };
581
+ }
582
+ async setContentBylines(collectionSlug, contentId, inputBylines) {
583
+ await atomicBatch(this.db, await this.prepareContentBylines(collectionSlug, contentId, inputBylines));
590
584
  invalidateCollectionCache(collectionSlug);
591
585
  return await this.getContentBylines(collectionSlug, contentId);
592
586
  }
@@ -4,7 +4,7 @@ import { z } from "zod";
4
4
  /** Valid role level values */
5
5
  declare const VALID_ROLE_LEVELS: Set<number>;
6
6
  /** Role level — coerces string/number to valid RoleLevel (10|20|30|40|50) */
7
- declare const roleLevel: z.ZodCoercedNumber<unknown> & z.ZodType<10 | 20 | 30 | 40 | 50, unknown, z.core.$ZodTypeInternals<10 | 20 | 30 | 40 | 50, unknown>>;
7
+ declare const roleLevel: z.ZodCoercedNumber<unknown> & z.ZodType<50 | 10 | 20 | 30 | 40, unknown, z.core.$ZodTypeInternals<50 | 10 | 20 | 30 | 40, unknown>>;
8
8
  /** Pagination query params — cursor-based */
9
9
  declare const cursorPaginationQuery: z.ZodObject<{
10
10
  cursor: z.ZodOptional<z.ZodString>;
@@ -807,8 +807,8 @@ declare const createCollectionBody: z.ZodObject<{
807
807
  icon: z.ZodOptional<z.ZodString>;
808
808
  supports: z.ZodOptional<z.ZodArray<z.ZodEnum<{
809
809
  search: "search";
810
- drafts: "drafts";
811
810
  revisions: "revisions";
811
+ drafts: "drafts";
812
812
  preview: "preview";
813
813
  scheduling: "scheduling";
814
814
  }>>>;
@@ -828,8 +828,8 @@ declare const updateCollectionBody: z.ZodObject<{
828
828
  icon: z.ZodOptional<z.ZodString>;
829
829
  supports: z.ZodOptional<z.ZodArray<z.ZodEnum<{
830
830
  search: "search";
831
- drafts: "drafts";
832
831
  revisions: "revisions";
832
+ drafts: "drafts";
833
833
  preview: "preview";
834
834
  scheduling: "scheduling";
835
835
  }>>>;
@@ -1368,13 +1368,13 @@ declare const contextEntryListQuery: z.ZodObject<{
1368
1368
  declare const contextEntryStaleQuery: z.ZodObject<{
1369
1369
  limit: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
1370
1370
  cursor: z.ZodOptional<z.ZodString>;
1371
- scope: z.ZodOptional<z.ZodString>;
1372
1371
  includeInherited: z.ZodPipe<z.ZodOptional<z.ZodEnum<{
1373
1372
  true: "true";
1374
1373
  false: "false";
1375
1374
  }>>, z.ZodTransform<boolean | undefined, "true" | "false" | undefined>>;
1376
1375
  contextTypes: z.ZodPipe<z.ZodOptional<z.ZodString>, z.ZodTransform<string[] | undefined, string | undefined>>;
1377
1376
  tags: z.ZodPipe<z.ZodOptional<z.ZodString>, z.ZodTransform<string[] | undefined, string | undefined>>;
1377
+ scope: z.ZodOptional<z.ZodString>;
1378
1378
  createdByActorType: z.ZodOptional<z.ZodEnum<{
1379
1379
  user: "user";
1380
1380
  api_token: "api_token";
@@ -1545,7 +1545,7 @@ declare const signupCompleteBody: z.ZodObject<{
1545
1545
  }, z.core.$strip>;
1546
1546
  declare const inviteCreateBody: z.ZodObject<{
1547
1547
  email: z.ZodString;
1548
- role: z.ZodOptional<z.ZodCoercedNumber<unknown> & z.ZodType<10 | 20 | 30 | 40 | 50, unknown, z.core.$ZodTypeInternals<10 | 20 | 30 | 40 | 50, unknown>>>;
1548
+ role: z.ZodOptional<z.ZodCoercedNumber<unknown> & z.ZodType<50 | 10 | 20 | 30 | 40, unknown, z.core.$ZodTypeInternals<50 | 10 | 20 | 30 | 40, unknown>>>;
1549
1549
  }, z.core.$strip>;
1550
1550
  declare const inviteCompleteBody: z.ZodObject<{
1551
1551
  token: z.ZodString;
@@ -2097,15 +2097,15 @@ declare const usersListQuery: z.ZodObject<{
2097
2097
  declare const userUpdateBody: z.ZodObject<{
2098
2098
  name: z.ZodOptional<z.ZodString>;
2099
2099
  email: z.ZodOptional<z.ZodString>;
2100
- role: z.ZodOptional<z.ZodCoercedNumber<unknown> & z.ZodType<10 | 20 | 30 | 40 | 50, unknown, z.core.$ZodTypeInternals<10 | 20 | 30 | 40 | 50, unknown>>>;
2100
+ role: z.ZodOptional<z.ZodCoercedNumber<unknown> & z.ZodType<50 | 10 | 20 | 30 | 40, unknown, z.core.$ZodTypeInternals<50 | 10 | 20 | 30 | 40, unknown>>>;
2101
2101
  }, z.core.$strip>;
2102
2102
  declare const allowedDomainCreateBody: z.ZodObject<{
2103
2103
  domain: z.ZodString;
2104
- defaultRole: z.ZodCoercedNumber<unknown> & z.ZodType<10 | 20 | 30 | 40 | 50, unknown, z.core.$ZodTypeInternals<10 | 20 | 30 | 40 | 50, unknown>>;
2104
+ defaultRole: z.ZodCoercedNumber<unknown> & z.ZodType<50 | 10 | 20 | 30 | 40, unknown, z.core.$ZodTypeInternals<50 | 10 | 20 | 30 | 40, unknown>>;
2105
2105
  }, z.core.$strip>;
2106
2106
  declare const allowedDomainUpdateBody: z.ZodObject<{
2107
2107
  enabled: z.ZodOptional<z.ZodBoolean>;
2108
- defaultRole: z.ZodOptional<z.ZodCoercedNumber<unknown> & z.ZodType<10 | 20 | 30 | 40 | 50, unknown, z.core.$ZodTypeInternals<10 | 20 | 30 | 40 | 50, unknown>>>;
2108
+ defaultRole: z.ZodOptional<z.ZodCoercedNumber<unknown> & z.ZodType<50 | 10 | 20 | 30 | 40, unknown, z.core.$ZodTypeInternals<50 | 10 | 20 | 30 | 40, unknown>>>;
2109
2109
  }, z.core.$strip>;
2110
2110
  declare const userSchema: z.ZodObject<{
2111
2111
  id: z.ZodString;
@@ -1,4 +1,4 @@
1
- import { n as BylineSchemaRegistry, r as mapBylineSchemaError, t as BylineSchemaError } from "./byline-registry-rkr73qSE.mjs";
1
+ import { n as BylineSchemaRegistry, r as mapBylineSchemaError, t as BylineSchemaError } from "./byline-registry-CkuVVeJJ.mjs";
2
2
 
3
3
  //#region src/api/handlers/byline-fields.ts
4
4
  function bylineSchemaErrorResult(error) {
@@ -1,6 +1,6 @@
1
- import { i as RESERVED_BYLINE_FIELD_SLUGS } from "./types-C0DPvhR5.mjs";
2
- import { n as isSiteContextType, t as SITE_CONTEXT_TYPES } from "./context-types-CPWAJRs5.mjs";
3
- import { Ln as roleLevel, Nn as httpUrl } from "./redirects-N8gmWhVM.mjs";
1
+ import { i as RESERVED_BYLINE_FIELD_SLUGS } from "./types-CyBH89BS.mjs";
2
+ import { n as isSiteContextType, t as SITE_CONTEXT_TYPES } from "./context-types-DLD_HnKT.mjs";
3
+ import { Ln as roleLevel, Nn as httpUrl } from "./redirects-DpRiuRWn.mjs";
4
4
  import { z } from "zod";
5
5
 
6
6
  //#region src/api/schemas/context.ts
@@ -1,6 +1,6 @@
1
- import { t as validateIdentifier } from "./validate-VPnKoIzW.mjs";
2
- import { t as withTransaction } from "./transaction-BGQgnwUi.mjs";
3
- import { i as RESERVED_BYLINE_FIELD_SLUGS, t as BYLINE_FIELD_TYPES } from "./types-C0DPvhR5.mjs";
1
+ import { atomicBatch, rowUnchanged } from "./database/batch.mjs";
2
+ import { t as validateIdentifier } from "./validate-Co3j6T_K.mjs";
3
+ import { i as RESERVED_BYLINE_FIELD_SLUGS, t as BYLINE_FIELD_TYPES } from "./types-CyBH89BS.mjs";
4
4
  import { sql } from "kysely";
5
5
  import { ulid } from "ulidx";
6
6
 
@@ -63,36 +63,27 @@ var BylineSchemaRegistry = class {
63
63
  this.validateLabel(input.label);
64
64
  this.validateType(input.type);
65
65
  const validation = this.normaliseValidation(input.type, input.validation ?? null);
66
- if (await this.getField(input.slug)) {
67
- await this.markVersionClean();
68
- throw new BylineSchemaError(`Byline field "${input.slug}" already exists`, "FIELD_EXISTS", { slug: input.slug });
69
- }
66
+ if (await this.getField(input.slug)) throw new BylineSchemaError(`Byline field "${input.slug}" already exists`, "FIELD_EXISTS", { slug: input.slug });
70
67
  const id = ulid();
71
- const sortOrder = input.sortOrder ?? await this.nextSortOrder();
72
- await this.markVersionDirty();
73
- await withTransaction(this.db, async (trx) => {
74
- await trx.insertInto("_dineway_byline_fields").values({
75
- id,
76
- slug: input.slug,
77
- label: input.label,
78
- type: input.type,
79
- required: input.required ? 1 : 0,
80
- translatable: input.translatable === false ? 0 : 1,
81
- validation: validation ? JSON.stringify(validation) : null,
82
- sort_order: sortOrder
83
- }).execute();
84
- });
85
- await this.markVersionClean();
68
+ const sortOrder = input.sortOrder ?? sql`(SELECT COALESCE(MAX(sort_order), -1) + 1 FROM _dineway_byline_fields)`;
69
+ await atomicBatch(this.db, { statements: [this.db.insertInto("_dineway_byline_fields").values({
70
+ id,
71
+ slug: input.slug,
72
+ label: input.label,
73
+ type: input.type,
74
+ required: input.required ? 1 : 0,
75
+ translatable: input.translatable === false ? 0 : 1,
76
+ validation: validation ? JSON.stringify(validation) : null,
77
+ sort_order: sortOrder
78
+ }).compile(), this.prepareVersionClean()] });
86
79
  const created = await this.getFieldById(id);
87
80
  if (!created) throw new BylineSchemaError("Failed to load created byline field", "FIELD_NOT_FOUND", { id });
88
81
  return created;
89
82
  }
90
83
  async updateField(slug, input) {
91
- const field = await this.getField(slug);
92
- if (!field) {
93
- await this.markVersionClean();
94
- throw new BylineSchemaError(`Byline field "${slug}" not found`, "FIELD_NOT_FOUND", { slug });
95
- }
84
+ const row = await this.db.selectFrom("_dineway_byline_fields").selectAll().where("slug", "=", slug).executeTakeFirst();
85
+ const field = row ? mapFieldRow(row) : null;
86
+ if (!row || !field) throw new BylineSchemaError(`Byline field "${slug}" not found`, "FIELD_NOT_FOUND", { slug });
96
87
  const updates = {};
97
88
  if (input.label !== void 0) {
98
89
  this.validateLabel(input.label);
@@ -112,55 +103,49 @@ var BylineSchemaRegistry = class {
112
103
  updates.translatable = input.translatable ? 1 : 0;
113
104
  }
114
105
  if (input.sortOrder !== void 0) updates.sort_order = input.sortOrder;
115
- if (Object.keys(updates).length === 0) {
116
- await this.markVersionClean();
117
- return field;
118
- }
106
+ if (Object.keys(updates).length === 0) return field;
119
107
  updates.updated_at = (/* @__PURE__ */ new Date()).toISOString();
120
- await this.markVersionDirty();
121
- await withTransaction(this.db, async (trx) => {
122
- await trx.updateTable("_dineway_byline_fields").set(updates).where("id", "=", field.id).execute();
108
+ const checks = [rowUnchanged("_dineway_byline_fields", row)];
109
+ if (updates.translatable !== void 0) checks.push(sql`NOT EXISTS (SELECT 1 FROM _dineway_byline_field_values WHERE field_id = ${field.id}) AND NOT EXISTS (SELECT 1 FROM _dineway_byline_field_group_values WHERE field_id = ${field.id})`);
110
+ await atomicBatch(this.db, {
111
+ checks,
112
+ statements: [this.db.updateTable("_dineway_byline_fields").set(updates).where("id", "=", field.id).compile(), this.prepareVersionClean()]
123
113
  });
124
- await this.markVersionClean();
125
114
  const updated = await this.getFieldById(field.id);
126
115
  if (!updated) throw new BylineSchemaError("Failed to load updated byline field", "FIELD_NOT_FOUND", { slug });
127
116
  return updated;
128
117
  }
129
118
  async deleteField(slug) {
130
- const field = await this.getField(slug);
131
- if (!field) {
132
- await this.markVersionClean();
133
- throw new BylineSchemaError(`Byline field "${slug}" not found`, "FIELD_NOT_FOUND", { slug });
134
- }
135
- await this.markVersionDirty();
136
- await withTransaction(this.db, async (trx) => {
137
- await trx.deleteFrom("_dineway_byline_field_values").where("field_id", "=", field.id).execute();
138
- await trx.deleteFrom("_dineway_byline_field_group_values").where("field_id", "=", field.id).execute();
139
- await trx.deleteFrom("_dineway_byline_fields").where("id", "=", field.id).execute();
119
+ const row = await this.db.selectFrom("_dineway_byline_fields").selectAll().where("slug", "=", slug).executeTakeFirst();
120
+ const field = row ? mapFieldRow(row) : null;
121
+ if (!row || !field) throw new BylineSchemaError(`Byline field "${slug}" not found`, "FIELD_NOT_FOUND", { slug });
122
+ await atomicBatch(this.db, {
123
+ checks: [rowUnchanged("_dineway_byline_fields", row)],
124
+ statements: [
125
+ this.db.deleteFrom("_dineway_byline_field_values").where("field_id", "=", field.id).compile(),
126
+ this.db.deleteFrom("_dineway_byline_field_group_values").where("field_id", "=", field.id).compile(),
127
+ this.db.deleteFrom("_dineway_byline_fields").where("id", "=", field.id).compile(),
128
+ this.prepareVersionClean()
129
+ ]
140
130
  });
141
- await this.markVersionClean();
142
131
  }
143
132
  async reorderFields(slugs) {
144
133
  if (new Set(slugs).size !== slugs.length) throw new BylineSchemaError("Reorder input contains duplicate slugs", "REORDER_MISMATCH", { slugs });
145
- const registeredSlugs = (await this.listFields()).map((field) => field.slug).toSorted();
134
+ const rows = await this.db.selectFrom("_dineway_byline_fields").selectAll().execute();
135
+ const registeredSlugs = rows.map(mapFieldRow).map((field) => field.slug).toSorted();
146
136
  const inputSlugs = slugs.toSorted();
147
137
  if (registeredSlugs.length !== inputSlugs.length || registeredSlugs.some((slug, index) => slug !== inputSlugs[index])) throw new BylineSchemaError("Reorder input does not match the registered byline field set", "REORDER_MISMATCH", {
148
138
  registered: registeredSlugs,
149
139
  input: inputSlugs
150
140
  });
151
141
  const now = (/* @__PURE__ */ new Date()).toISOString();
152
- await this.markVersionDirty();
153
- await withTransaction(this.db, async (trx) => {
154
- for (let index = 0; index < slugs.length; index++) {
155
- const slug = slugs[index];
156
- if (slug === void 0) continue;
157
- await trx.updateTable("_dineway_byline_fields").set({
158
- sort_order: index,
159
- updated_at: now
160
- }).where("slug", "=", slug).execute();
161
- }
142
+ await atomicBatch(this.db, {
143
+ checks: [sql`(SELECT COUNT(*) FROM _dineway_byline_fields) = ${rows.length}`, ...rows.map((row) => rowUnchanged("_dineway_byline_fields", row))],
144
+ statements: [...slugs.map((slug, index) => this.db.updateTable("_dineway_byline_fields").set({
145
+ sort_order: index,
146
+ updated_at: now
147
+ }).where("slug", "=", slug).compile()), this.prepareVersionClean()]
162
148
  });
163
- await this.markVersionClean();
164
149
  }
165
150
  async getFieldUsage(slug) {
166
151
  const field = await this.getField(slug);
@@ -181,19 +166,8 @@ var BylineSchemaRegistry = class {
181
166
  const parsed = Number.parseInt(row.value, 10);
182
167
  return Number.isFinite(parsed) ? parsed : 0;
183
168
  }
184
- async markVersionDirty() {
185
- await sql`
186
- INSERT INTO options (name, value)
187
- VALUES (${VERSION_KEY}, '1')
188
- ON CONFLICT(name) DO UPDATE SET value = CASE
189
- WHEN CAST(options.value AS INTEGER) % 2 = 0
190
- THEN CAST(CAST(options.value AS INTEGER) + 1 AS TEXT)
191
- ELSE options.value
192
- END
193
- `.execute(this.db);
194
- }
195
- async markVersionClean() {
196
- await sql`
169
+ prepareVersionClean() {
170
+ return sql`
197
171
  INSERT INTO options (name, value)
198
172
  VALUES (${VERSION_KEY}, '2')
199
173
  ON CONFLICT(name) DO UPDATE SET value = CASE
@@ -201,11 +175,7 @@ var BylineSchemaRegistry = class {
201
175
  THEN CAST(CAST(options.value AS INTEGER) + 2 AS TEXT)
202
176
  ELSE CAST(CAST(options.value AS INTEGER) + 1 AS TEXT)
203
177
  END
204
- `.execute(this.db);
205
- }
206
- async nextSortOrder() {
207
- const row = await this.db.selectFrom("_dineway_byline_fields").select(({ fn }) => [fn.max("sort_order").as("max")]).executeTakeFirst();
208
- return row?.max == null ? 0 : row.max + 1;
178
+ `.compile(this.db);
209
179
  }
210
180
  async countFieldValues(fieldId) {
211
181
  const translatable = await this.db.selectFrom("_dineway_byline_field_values").select(({ fn }) => [fn.count("field_id").as("count")]).where("field_id", "=", fieldId).executeTakeFirst();
@@ -1,8 +1,8 @@
1
- import { a as __exportAll } from "./runner-DJiRFyLI.mjs";
2
- import { t as validateIdentifier } from "./validate-VPnKoIzW.mjs";
3
- import { o as isMissingTableError, r as getDb } from "./loader-BDje8ME2.mjs";
4
- import { t as BylineRepository } from "./byline-Ctil4rij.mjs";
5
- import { n as resolveLocaleChain } from "./resolve-pZ4NQM-X.mjs";
1
+ import { c as __exportAll } from "./runner-CVeq0266.mjs";
2
+ import { t as validateIdentifier } from "./validate-Co3j6T_K.mjs";
3
+ import { o as isMissingTableError, r as getDb } from "./loader-Cgsx23wU.mjs";
4
+ import { t as BylineRepository } from "./byline-DEZKlzD9.mjs";
5
+ import { n as resolveLocaleChain } from "./resolve-CpOV2jt_.mjs";
6
6
  import { sql } from "kysely";
7
7
 
8
8
  //#region src/bylines/index.ts
@@ -184,7 +184,7 @@ async function getBylinesForEntries(collection, entries) {
184
184
  */
185
185
  async function getEntriesByByline(collection, byline, options = {}) {
186
186
  validateIdentifier(collection, "collection");
187
- const { getDinewayCollection } = await import("./query-CrW2yI6G.mjs").then((n) => n.o);
187
+ const { getDinewayCollection } = await import("./query-D6oNo9iz.mjs").then((n) => n.o);
188
188
  const { entries } = await getDinewayCollection(collection, {
189
189
  where: { byline },
190
190
  ...options.locale !== void 0 ? { locale: options.locale } : {},