@byline/host-tanstack-start 4.19.0 → 5.1.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 (322) hide show
  1. package/dist/admin-shell/chrome/admin-app-bar.d.ts +7 -0
  2. package/dist/admin-shell/chrome/admin-app-bar.js +10 -2
  3. package/dist/admin-shell/chrome/session-change-boundary.d.ts +14 -0
  4. package/dist/admin-shell/chrome/session-change-boundary.js +87 -0
  5. package/dist/admin-shell/chrome/session-change-boundary.test.d.ts +8 -0
  6. package/dist/admin-shell/chrome/sign-in-page.d.ts +2 -1
  7. package/dist/admin-shell/chrome/sign-in-page.js +60 -3
  8. package/dist/admin-shell/collections/edit.d.ts +1 -1
  9. package/dist/admin-shell/collections/edit.js +151 -31
  10. package/dist/admin-shell/collections/history.js +4 -2
  11. package/dist/admin-shell/collections/list.js +30 -6
  12. package/dist/admin-shell/collections/restore-version-modal.d.ts +3 -1
  13. package/dist/admin-shell/collections/restore-version-modal.js +9 -4
  14. package/dist/admin-shell/collections/tree-list.js +16 -6
  15. package/dist/admin-shell/collections/version-history.d.ts +2 -1
  16. package/dist/admin-shell/collections/version-history.js +11 -2
  17. package/dist/admin-shell/document-mutation-notice.d.ts +6 -0
  18. package/dist/admin-shell/document-mutation-notice.js +53 -0
  19. package/dist/admin-shell/document-mutation-state.d.ts +22 -0
  20. package/dist/admin-shell/document-mutation-state.js +71 -0
  21. package/dist/admin-shell/document-mutation-state.test.d.ts +1 -0
  22. package/dist/admin-shell/scheduled-publications/list.js +15 -5
  23. package/dist/admin-shell/singletons/history.js +4 -2
  24. package/dist/admin-shell/singletons/view.d.ts +1 -1
  25. package/dist/admin-shell/singletons/view.js +98 -19
  26. package/dist/integrations/byline-admin-services.js +7 -1
  27. package/dist/integrations/byline-field-services.js +2 -9
  28. package/dist/integrations/client-ip.d.ts +19 -0
  29. package/dist/integrations/client-ip.js +34 -0
  30. package/dist/integrations/session-coordination.d.ts +24 -0
  31. package/dist/integrations/session-coordination.js +85 -0
  32. package/dist/integrations/session-middleware.d.ts +11 -0
  33. package/dist/integrations/session-middleware.js +94 -0
  34. package/dist/integrations/session-request-kind.d.ts +9 -0
  35. package/dist/integrations/session-request-kind.js +10 -0
  36. package/dist/integrations/session-request-middleware.d.ts +9 -0
  37. package/dist/integrations/session-request-middleware.js +7 -0
  38. package/dist/integrations/sign-in-body.d.ts +12 -0
  39. package/dist/integrations/sign-in-body.js +52 -0
  40. package/dist/integrations/sign-in-middleware.d.ts +9 -0
  41. package/dist/integrations/sign-in-middleware.js +10 -0
  42. package/dist/routes/create-admin-layout-route.js +46 -31
  43. package/dist/routes/create-collection-edit-route.js +1 -1
  44. package/dist/routes/create-collection-list-route.d.ts +0 -7
  45. package/dist/routes/create-collection-list-route.js +7 -9
  46. package/dist/routes/create-sign-in-route.js +4 -2
  47. package/dist/routes/create-singleton-route.d.ts +2 -0
  48. package/dist/routes/create-singleton-route.js +4 -3
  49. package/dist/server-fns/admin-account/change-password.d.ts +3 -1
  50. package/dist/server-fns/admin-account/change-password.js +9 -3
  51. package/dist/server-fns/admin-account/get.d.ts +3 -1
  52. package/dist/server-fns/admin-account/get.js +4 -1
  53. package/dist/server-fns/admin-account/index.d.ts +5 -5
  54. package/dist/server-fns/admin-account/update.d.ts +3 -1
  55. package/dist/server-fns/admin-account/update.js +4 -1
  56. package/dist/server-fns/admin-activity/get.d.ts +3 -1
  57. package/dist/server-fns/admin-activity/get.js +4 -1
  58. package/dist/server-fns/admin-permissions/get-role-abilities.d.ts +3 -1
  59. package/dist/server-fns/admin-permissions/get-role-abilities.js +4 -1
  60. package/dist/server-fns/admin-permissions/index.d.ts +4 -4
  61. package/dist/server-fns/admin-permissions/list-registered.d.ts +3 -1
  62. package/dist/server-fns/admin-permissions/list-registered.js +4 -1
  63. package/dist/server-fns/admin-permissions/set-role-abilities.d.ts +3 -1
  64. package/dist/server-fns/admin-permissions/set-role-abilities.js +4 -1
  65. package/dist/server-fns/admin-permissions/who-has.d.ts +3 -1
  66. package/dist/server-fns/admin-permissions/who-has.js +4 -1
  67. package/dist/server-fns/admin-roles/create.d.ts +3 -1
  68. package/dist/server-fns/admin-roles/create.js +4 -1
  69. package/dist/server-fns/admin-roles/delete.d.ts +3 -1
  70. package/dist/server-fns/admin-roles/delete.js +4 -1
  71. package/dist/server-fns/admin-roles/get.d.ts +3 -1
  72. package/dist/server-fns/admin-roles/get.js +4 -1
  73. package/dist/server-fns/admin-roles/index.d.ts +6 -6
  74. package/dist/server-fns/admin-roles/list.d.ts +3 -1
  75. package/dist/server-fns/admin-roles/list.js +4 -1
  76. package/dist/server-fns/admin-roles/reorder.d.ts +3 -1
  77. package/dist/server-fns/admin-roles/reorder.js +4 -1
  78. package/dist/server-fns/admin-roles/update.d.ts +3 -1
  79. package/dist/server-fns/admin-roles/update.js +4 -1
  80. package/dist/server-fns/admin-users/create.d.ts +3 -1
  81. package/dist/server-fns/admin-users/create.js +4 -1
  82. package/dist/server-fns/admin-users/delete.d.ts +3 -1
  83. package/dist/server-fns/admin-users/delete.js +4 -1
  84. package/dist/server-fns/admin-users/disable.d.ts +3 -1
  85. package/dist/server-fns/admin-users/disable.js +4 -1
  86. package/dist/server-fns/admin-users/enable.d.ts +3 -1
  87. package/dist/server-fns/admin-users/enable.js +4 -1
  88. package/dist/server-fns/admin-users/get-user-roles.d.ts +3 -1
  89. package/dist/server-fns/admin-users/get-user-roles.js +4 -1
  90. package/dist/server-fns/admin-users/get.d.ts +3 -1
  91. package/dist/server-fns/admin-users/get.js +4 -1
  92. package/dist/server-fns/admin-users/index.d.ts +10 -10
  93. package/dist/server-fns/admin-users/list.d.ts +3 -1
  94. package/dist/server-fns/admin-users/list.js +4 -1
  95. package/dist/server-fns/admin-users/set-password.d.ts +3 -1
  96. package/dist/server-fns/admin-users/set-password.js +4 -1
  97. package/dist/server-fns/admin-users/set-user-roles.d.ts +3 -1
  98. package/dist/server-fns/admin-users/set-user-roles.js +4 -1
  99. package/dist/server-fns/admin-users/update.d.ts +3 -1
  100. package/dist/server-fns/admin-users/update.js +4 -1
  101. package/dist/server-fns/ai/execute.d.ts +3 -1
  102. package/dist/server-fns/ai/execute.js +4 -1
  103. package/dist/server-fns/ai/index.d.ts +1 -1
  104. package/dist/server-fns/analytics/maintenance.d.ts +6 -2
  105. package/dist/server-fns/analytics/maintenance.js +7 -2
  106. package/dist/server-fns/analytics/queries.d.ts +18 -6
  107. package/dist/server-fns/analytics/queries.js +19 -6
  108. package/dist/server-fns/auth/current-user.d.ts +1 -0
  109. package/dist/server-fns/auth/current-user.js +5 -2
  110. package/dist/server-fns/auth/renew.d.ts +13 -0
  111. package/dist/server-fns/auth/renew.js +45 -0
  112. package/dist/server-fns/auth/sign-in.d.ts +2 -1
  113. package/dist/server-fns/auth/sign-in.js +88 -17
  114. package/dist/server-fns/auth/sign-out.d.ts +3 -1
  115. package/dist/server-fns/auth/sign-out.js +38 -6
  116. package/dist/server-fns/collections/audit.d.ts +3 -1
  117. package/dist/server-fns/collections/audit.js +4 -1
  118. package/dist/server-fns/collections/copy-to-locale.d.ts +5 -1
  119. package/dist/server-fns/collections/copy-to-locale.js +7 -2
  120. package/dist/server-fns/collections/create.d.ts +4 -1
  121. package/dist/server-fns/collections/create.js +8 -3
  122. package/dist/server-fns/collections/delete-locale.d.ts +5 -1
  123. package/dist/server-fns/collections/delete-locale.js +7 -2
  124. package/dist/server-fns/collections/delete-outcome.d.ts +7 -3
  125. package/dist/server-fns/collections/delete-outcome.js +4 -0
  126. package/dist/server-fns/collections/delete.d.ts +5 -1
  127. package/dist/server-fns/collections/delete.js +8 -3
  128. package/dist/server-fns/collections/duplicate.d.ts +5 -1
  129. package/dist/server-fns/collections/duplicate.js +8 -3
  130. package/dist/server-fns/collections/get.d.ts +1 -0
  131. package/dist/server-fns/collections/get.js +12 -6
  132. package/dist/server-fns/collections/history.d.ts +3 -1
  133. package/dist/server-fns/collections/history.js +4 -1
  134. package/dist/server-fns/collections/index.d.ts +21 -21
  135. package/dist/server-fns/collections/list.d.ts +3 -1
  136. package/dist/server-fns/collections/list.js +15 -4
  137. package/dist/server-fns/collections/reindex.d.ts +3 -1
  138. package/dist/server-fns/collections/reindex.js +4 -1
  139. package/dist/server-fns/collections/reorder.d.ts +10 -2
  140. package/dist/server-fns/collections/reorder.js +23 -76
  141. package/dist/server-fns/collections/restore-version.d.ts +6 -1
  142. package/dist/server-fns/collections/restore-version.js +8 -2
  143. package/dist/server-fns/collections/save-outcome.d.ts +1 -0
  144. package/dist/server-fns/collections/save-outcome.js +1 -0
  145. package/dist/server-fns/collections/scheduled-publication.d.ts +64 -7
  146. package/dist/server-fns/collections/scheduled-publication.js +42 -21
  147. package/dist/server-fns/collections/set-list-view-preference.d.ts +3 -1
  148. package/dist/server-fns/collections/set-list-view-preference.js +4 -1
  149. package/dist/server-fns/collections/stats.js +4 -1
  150. package/dist/server-fns/collections/status.d.ts +14 -2
  151. package/dist/server-fns/collections/status.js +18 -5
  152. package/dist/server-fns/collections/tree-mutation.d.ts +7 -6
  153. package/dist/server-fns/collections/tree-mutation.js +17 -5
  154. package/dist/server-fns/collections/tree.d.ts +29 -6
  155. package/dist/server-fns/collections/tree.js +32 -17
  156. package/dist/server-fns/collections/update.d.ts +18 -6
  157. package/dist/server-fns/collections/update.js +39 -20
  158. package/dist/server-fns/collections/upload.d.ts +11 -1
  159. package/dist/server-fns/collections/upload.js +6 -2
  160. package/dist/server-fns/document-mutation-errors.d.ts +5 -0
  161. package/dist/server-fns/document-mutation-errors.js +50 -0
  162. package/dist/server-fns/editable-revision.d.ts +9 -0
  163. package/dist/server-fns/editable-revision.js +11 -0
  164. package/dist/server-fns/i18n/set-locale.d.ts +3 -1
  165. package/dist/server-fns/i18n/set-locale.js +18 -3
  166. package/dist/server-fns/preview/disable.d.ts +3 -1
  167. package/dist/server-fns/preview/disable.js +4 -1
  168. package/dist/server-fns/preview/enable.d.ts +3 -1
  169. package/dist/server-fns/preview/enable.js +4 -1
  170. package/dist/server-fns/singleton-document-read.d.ts +1 -1
  171. package/dist/server-fns/singleton-document-read.js +7 -3
  172. package/dist/server-fns/singletons/cancel-scheduled-publish.d.ts +9 -2
  173. package/dist/server-fns/singletons/cancel-scheduled-publish.js +7 -1
  174. package/dist/server-fns/singletons/change-status.d.ts +5 -1
  175. package/dist/server-fns/singletons/change-status.js +7 -1
  176. package/dist/server-fns/singletons/confirm-scheduled-publish.d.ts +8 -2
  177. package/dist/server-fns/singletons/confirm-scheduled-publish.js +7 -2
  178. package/dist/server-fns/singletons/copy-to-locale.d.ts +5 -1
  179. package/dist/server-fns/singletons/copy-to-locale.js +7 -2
  180. package/dist/server-fns/singletons/find-by-version.d.ts +3 -1
  181. package/dist/server-fns/singletons/find-by-version.js +4 -1
  182. package/dist/server-fns/singletons/get-scheduled-publish.d.ts +3 -1
  183. package/dist/server-fns/singletons/get-scheduled-publish.js +4 -1
  184. package/dist/server-fns/singletons/get.d.ts +6 -4
  185. package/dist/server-fns/singletons/get.js +4 -1
  186. package/dist/server-fns/singletons/history.d.ts +3 -1
  187. package/dist/server-fns/singletons/history.js +4 -1
  188. package/dist/server-fns/singletons/restore-version.d.ts +5 -1
  189. package/dist/server-fns/singletons/restore-version.js +9 -3
  190. package/dist/server-fns/singletons/schedule-publish.d.ts +8 -2
  191. package/dist/server-fns/singletons/schedule-publish.js +7 -2
  192. package/dist/server-fns/singletons/unpublish.d.ts +5 -1
  193. package/dist/server-fns/singletons/unpublish.js +7 -1
  194. package/dist/server-fns/singletons/update.d.ts +6 -4
  195. package/dist/server-fns/singletons/update.js +8 -4
  196. package/dist/server-fns/structural-receipt.d.ts +4 -0
  197. package/dist/server-fns/structural-receipt.js +31 -0
  198. package/package.json +20 -20
  199. package/src/admin-shell/chrome/admin-app-bar.tsx +11 -6
  200. package/src/admin-shell/chrome/session-change-boundary.test.tsx +78 -0
  201. package/src/admin-shell/chrome/session-change-boundary.tsx +94 -0
  202. package/src/admin-shell/chrome/sign-in-page.tsx +68 -3
  203. package/src/admin-shell/collections/edit.tsx +173 -54
  204. package/src/admin-shell/collections/history.tsx +11 -2
  205. package/src/admin-shell/collections/list.tsx +22 -6
  206. package/src/admin-shell/collections/restore-version-modal.tsx +12 -3
  207. package/src/admin-shell/collections/save-navigation.test.tsx +156 -8
  208. package/src/admin-shell/collections/tree-list.tsx +16 -6
  209. package/src/admin-shell/collections/version-history.tsx +13 -3
  210. package/src/admin-shell/document-mutation-notice.tsx +45 -0
  211. package/src/admin-shell/document-mutation-state.test.tsx +146 -0
  212. package/src/admin-shell/document-mutation-state.ts +95 -0
  213. package/src/admin-shell/scheduled-publications/list.tsx +16 -6
  214. package/src/admin-shell/singletons/history.test.tsx +3 -1
  215. package/src/admin-shell/singletons/history.tsx +10 -2
  216. package/src/admin-shell/singletons/view.test.tsx +59 -18
  217. package/src/admin-shell/singletons/view.tsx +110 -29
  218. package/src/integrations/byline-admin-services.ts +7 -1
  219. package/src/integrations/byline-field-services.ts +2 -3
  220. package/src/integrations/client-ip.test.node.ts +45 -0
  221. package/src/integrations/client-ip.ts +54 -0
  222. package/src/integrations/framework-fetch-shape.test.node.ts +56 -0
  223. package/src/integrations/session-client.test.node.ts +121 -0
  224. package/src/integrations/session-coordination.test.node.ts +77 -0
  225. package/src/integrations/session-coordination.ts +96 -0
  226. package/src/integrations/session-middleware.test.node.ts +87 -0
  227. package/src/integrations/session-middleware.ts +107 -0
  228. package/src/integrations/session-request-kind.ts +18 -0
  229. package/src/integrations/session-request-middleware.ts +17 -0
  230. package/src/integrations/sign-in-body.test.node.ts +59 -0
  231. package/src/integrations/sign-in-body.ts +50 -0
  232. package/src/integrations/sign-in-middleware.ts +24 -0
  233. package/src/routes/create-admin-layout-route.tsx +48 -30
  234. package/src/routes/create-collection-edit-route.tsx +1 -0
  235. package/src/routes/create-collection-list-route.tsx +13 -2
  236. package/src/routes/create-sign-in-route.tsx +10 -2
  237. package/src/routes/create-singleton-route.test.node.ts +10 -2
  238. package/src/routes/create-singleton-route.tsx +6 -4
  239. package/src/server-fns/admin-account/change-password.test.node.ts +69 -0
  240. package/src/server-fns/admin-account/change-password.ts +13 -2
  241. package/src/server-fns/admin-account/get.ts +2 -0
  242. package/src/server-fns/admin-account/update.ts +2 -0
  243. package/src/server-fns/admin-activity/get.ts +2 -0
  244. package/src/server-fns/admin-permissions/get-role-abilities.ts +2 -0
  245. package/src/server-fns/admin-permissions/list-registered.ts +5 -4
  246. package/src/server-fns/admin-permissions/set-role-abilities.ts +2 -0
  247. package/src/server-fns/admin-permissions/who-has.ts +2 -0
  248. package/src/server-fns/admin-roles/create.ts +2 -0
  249. package/src/server-fns/admin-roles/delete.ts +2 -0
  250. package/src/server-fns/admin-roles/get.ts +2 -0
  251. package/src/server-fns/admin-roles/list.ts +5 -4
  252. package/src/server-fns/admin-roles/reorder.ts +2 -0
  253. package/src/server-fns/admin-roles/update.ts +2 -0
  254. package/src/server-fns/admin-users/create.ts +2 -0
  255. package/src/server-fns/admin-users/delete.ts +2 -0
  256. package/src/server-fns/admin-users/disable.ts +2 -0
  257. package/src/server-fns/admin-users/enable.ts +2 -0
  258. package/src/server-fns/admin-users/get-user-roles.ts +2 -0
  259. package/src/server-fns/admin-users/get.ts +2 -0
  260. package/src/server-fns/admin-users/list.ts +2 -0
  261. package/src/server-fns/admin-users/set-password.ts +2 -0
  262. package/src/server-fns/admin-users/set-user-roles.ts +2 -0
  263. package/src/server-fns/admin-users/update.ts +2 -0
  264. package/src/server-fns/ai/execute.ts +3 -0
  265. package/src/server-fns/analytics/maintenance.ts +4 -0
  266. package/src/server-fns/analytics/queries.ts +14 -8
  267. package/src/server-fns/auth/current-user.ts +7 -3
  268. package/src/server-fns/auth/renew.test.node.ts +85 -0
  269. package/src/server-fns/auth/renew.ts +54 -0
  270. package/src/server-fns/auth/sign-in.test.node.ts +114 -0
  271. package/src/server-fns/auth/sign-in.ts +80 -27
  272. package/src/server-fns/auth/sign-out.test.node.ts +85 -0
  273. package/src/server-fns/auth/sign-out.ts +44 -19
  274. package/src/server-fns/collections/audit.ts +2 -0
  275. package/src/server-fns/collections/copy-to-locale.ts +43 -36
  276. package/src/server-fns/collections/create.ts +56 -50
  277. package/src/server-fns/collections/delete-locale.ts +43 -32
  278. package/src/server-fns/collections/delete-outcome.test.node.ts +16 -0
  279. package/src/server-fns/collections/delete-outcome.ts +27 -16
  280. package/src/server-fns/collections/delete.ts +46 -38
  281. package/src/server-fns/collections/duplicate.ts +40 -32
  282. package/src/server-fns/collections/get.ts +11 -4
  283. package/src/server-fns/collections/history.ts +2 -0
  284. package/src/server-fns/collections/list.ts +10 -3
  285. package/src/server-fns/collections/reindex.ts +2 -0
  286. package/src/server-fns/collections/reorder.ts +34 -124
  287. package/src/server-fns/collections/restore-version.ts +49 -39
  288. package/src/server-fns/collections/revision-input.test.node.ts +122 -0
  289. package/src/server-fns/collections/save-outcome.test.node.ts +3 -0
  290. package/src/server-fns/collections/save-outcome.ts +2 -0
  291. package/src/server-fns/collections/scheduled-publication.ts +149 -115
  292. package/src/server-fns/collections/set-list-view-preference.ts +2 -0
  293. package/src/server-fns/collections/stats.ts +2 -0
  294. package/src/server-fns/collections/status.ts +89 -64
  295. package/src/server-fns/collections/tree-mutation.test.node.ts +87 -29
  296. package/src/server-fns/collections/tree-mutation.ts +28 -11
  297. package/src/server-fns/collections/tree.ts +156 -122
  298. package/src/server-fns/collections/update.ts +113 -86
  299. package/src/server-fns/collections/upload-singleton.test.node.ts +10 -7
  300. package/src/server-fns/collections/upload.ts +91 -77
  301. package/src/server-fns/document-mutation-errors.ts +67 -0
  302. package/src/server-fns/document-mutation-transport.test.node.ts +211 -0
  303. package/src/server-fns/editable-revision.test.node.ts +23 -0
  304. package/src/server-fns/editable-revision.ts +18 -0
  305. package/src/server-fns/i18n/set-locale.ts +19 -3
  306. package/src/server-fns/preview/disable.ts +8 -4
  307. package/src/server-fns/preview/enable.ts +9 -5
  308. package/src/server-fns/singleton-document-read.ts +7 -3
  309. package/src/server-fns/singletons/cancel-scheduled-publish.ts +12 -3
  310. package/src/server-fns/singletons/change-status.ts +12 -3
  311. package/src/server-fns/singletons/confirm-scheduled-publish.ts +14 -6
  312. package/src/server-fns/singletons/copy-to-locale.ts +22 -15
  313. package/src/server-fns/singletons/find-by-version.ts +2 -0
  314. package/src/server-fns/singletons/get-scheduled-publish.ts +2 -0
  315. package/src/server-fns/singletons/get.ts +5 -3
  316. package/src/server-fns/singletons/history.ts +2 -0
  317. package/src/server-fns/singletons/restore-version.ts +19 -12
  318. package/src/server-fns/singletons/schedule-publish.ts +20 -7
  319. package/src/server-fns/singletons/singletons.test.node.ts +69 -25
  320. package/src/server-fns/singletons/unpublish.ts +12 -3
  321. package/src/server-fns/singletons/update.ts +23 -16
  322. package/src/server-fns/structural-receipt.ts +41 -0
@@ -1,13 +1,17 @@
1
1
  import { createServerFn } from "@tanstack/react-start";
2
2
  import { getAdminRequestContext } from "@byline/client/server";
3
3
  import { ERR_NOT_FOUND, getLogger, getServerConfig } from "@byline/core";
4
- import { updateDocumentSystemFields, updateDocumentWithPatches } from "@byline/core/services";
4
+ import { saveDocument, updateDocumentSystemFields } from "@byline/core/services";
5
5
  import { ensureCollection } from "../../integrations/api-utils.js";
6
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
7
+ import { withDocumentMutationErrors } from "../document-mutation-errors.js";
6
8
  import { toCommittedDocumentHookFailureResponse } from "./save-outcome.js";
7
9
  const updateCollectionDocumentWithPatches = createServerFn({
8
10
  method: 'POST'
9
- }).validator((input)=>input).handler(async ({ data: input })=>{
10
- const { collection: path, id, patches, versionId, locale } = input;
11
+ }).middleware([
12
+ adminSessionMiddleware
13
+ ]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data: input })=>{
14
+ const { collection: path, id, patches, expectedRevision, locale, path: explicitPath, availableLocales } = input;
11
15
  const logger = getLogger();
12
16
  const config = await ensureCollection(path);
13
17
  if (!config) throw ERR_NOT_FOUND({
@@ -30,10 +34,12 @@ const updateCollectionDocumentWithPatches = createServerFn({
30
34
  };
31
35
  let result;
32
36
  try {
33
- result = await updateDocumentWithPatches(ctx, {
37
+ result = await saveDocument(ctx, {
34
38
  documentId: id,
35
39
  patches,
36
- documentVersionId: versionId,
40
+ expectedRevision,
41
+ path: explicitPath ?? void 0,
42
+ availableLocales,
37
43
  locale: locale ?? serverConfig.i18n.content.defaultLocale
38
44
  });
39
45
  } catch (error) {
@@ -44,13 +50,18 @@ const updateCollectionDocumentWithPatches = createServerFn({
44
50
  return {
45
51
  status: 'ok',
46
52
  documentId: result.documentId,
47
- documentVersionId: result.documentVersionId
53
+ ...'documentVersionId' in result ? {
54
+ documentVersionId: result.documentVersionId
55
+ } : {},
56
+ revision: result.revision
48
57
  };
49
- });
58
+ }));
50
59
  const updateCollectionDocumentSystemFields = createServerFn({
51
60
  method: 'POST'
52
- }).validator((input)=>input).handler(async ({ data: input })=>{
53
- const { collection: path, id, locale, path: explicitPath, availableLocales } = input;
61
+ }).middleware([
62
+ adminSessionMiddleware
63
+ ]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data: input })=>{
64
+ const { collection: path, id, expectedRevision, locale, path: explicitPath, availableLocales } = input;
54
65
  const logger = getLogger();
55
66
  const config = await ensureCollection(path);
56
67
  if (!config) throw ERR_NOT_FOUND({
@@ -71,15 +82,23 @@ const updateCollectionDocumentSystemFields = createServerFn({
71
82
  slugifier: serverConfig.slugifier,
72
83
  requestContext: await getAdminRequestContext()
73
84
  };
74
- await updateDocumentSystemFields(ctx, {
75
- documentId: id,
76
- locale: locale ?? serverConfig.i18n.content.defaultLocale,
77
- path: explicitPath,
78
- availableLocales,
79
- reconcile: true
80
- });
81
- return {
82
- status: 'ok'
83
- };
84
- });
85
+ try {
86
+ const result = await updateDocumentSystemFields(ctx, {
87
+ expectedRevision,
88
+ documentId: id,
89
+ locale: locale ?? serverConfig.i18n.content.defaultLocale,
90
+ path: explicitPath,
91
+ availableLocales,
92
+ reconcile: true
93
+ });
94
+ return {
95
+ status: 'ok',
96
+ revision: result.revision
97
+ };
98
+ } catch (error) {
99
+ const committedFailure = toCommittedDocumentHookFailureResponse(error);
100
+ if (null != committedFailure) return committedFailure;
101
+ throw error;
102
+ }
103
+ }));
85
104
  export { updateCollectionDocumentSystemFields, updateCollectionDocumentWithPatches };
@@ -1,3 +1,10 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
1
8
  import type { StoredFileValue } from '@byline/core';
2
9
  /**
3
10
  * Result of an upload through the host transport. The legacy top-level
@@ -9,6 +16,7 @@ export interface UploadFieldResult {
9
16
  /** Present when the upload endpoint created a document (createDocument=true, the default). */
10
17
  documentId?: string;
11
18
  documentVersionId?: string;
19
+ revision?: number;
12
20
  storedFile: StoredFileValue;
13
21
  }
14
22
  interface UploadDocumentInput {
@@ -35,7 +43,9 @@ declare function parseUploadFormData(data: FormData): UploadDocumentInput;
35
43
  * deployments and external clients can use the identical upload orchestration
36
44
  * without depending on TanStack Start server-function transport details.
37
45
  */
38
- export declare const uploadCollectionField: import("@tanstack/react-start").RequiredFetcher<undefined, typeof parseUploadFormData, Promise<import("@byline/core").UploadFieldResult>>;
46
+ export declare const uploadCollectionField: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
47
+ bylineExpectedSessionId: string | null;
48
+ }, undefined, undefined>], typeof parseUploadFormData, Promise<import("@byline/core").UploadFieldResult>>;
39
49
  /**
40
50
  * Upload a file to an upload-enabled collection.
41
51
  *
@@ -5,6 +5,8 @@ import { extractImageMeta, generateImageVariants, isBypassMimeType } from "@byli
5
5
  import { getLogger, withLogContext } from "@byline/core/logger";
6
6
  import { uploadField } from "@byline/core/services";
7
7
  import { ensureDocumentResource } from "../../integrations/api-utils.js";
8
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
9
+ import { withDocumentMutationErrors } from "../document-mutation-errors.js";
8
10
  function parseUploadFormData(data) {
9
11
  if (!(data instanceof FormData)) throw new Error('Expected FormData upload payload.');
10
12
  const collectionEntry = data.get('collection');
@@ -56,7 +58,9 @@ function resolveUploadField(definition, collectionPath, requested) {
56
58
  }
57
59
  const uploadCollectionField = createServerFn({
58
60
  method: 'POST'
59
- }).validator(parseUploadFormData).handler(async ({ data })=>{
61
+ }).middleware([
62
+ adminSessionMiddleware
63
+ ]).validator(parseUploadFormData).handler(withDocumentMutationErrors(async ({ data })=>{
60
64
  const { collectionPath, shouldCreateDocument, fieldName, file, fields } = data;
61
65
  const logger = getLogger();
62
66
  return withLogContext({
@@ -114,7 +118,7 @@ const uploadCollectionField = createServerFn({
114
118
  locale: serverConfig.i18n.content.defaultLocale
115
119
  });
116
120
  });
117
- });
121
+ }));
118
122
  async function upload_uploadField(collection, formData, createDocument = true) {
119
123
  const payload = new FormData();
120
124
  for (const [key, value] of formData.entries())payload.append(key, value);
@@ -0,0 +1,5 @@
1
+ /** Error subclasses lose custom properties in the server-function serializer.
2
+ * Throw only validated plain data for document failures; never transport causes,
3
+ * SQL, hook messages or an unverified current revision. */
4
+ export declare function documentMutationError(error: unknown): unknown;
5
+ export declare function withDocumentMutationErrors<T, R>(handler: (input: T) => Promise<R>): (input: T) => Promise<R>;
@@ -0,0 +1,50 @@
1
+ import { BylineError, ErrorCodes, getDocumentRevisionValidationDetails, getDocumentStaleDetails, getLockConflictDetails } from "@byline/core";
2
+ import { getDocumentHookCommittedDetails } from "@byline/core/services";
3
+ import { committedTreeReceipt } from "./structural-receipt.js";
4
+ function documentMutationError(error) {
5
+ const stale = getDocumentStaleDetails(error);
6
+ if (stale) return {
7
+ code: ErrorCodes.DOCUMENT_STALE,
8
+ message: 'This document has changed. Reload before making changes.',
9
+ details: stale
10
+ };
11
+ const validation = getDocumentRevisionValidationDetails(error);
12
+ if (validation) return {
13
+ code: ErrorCodes.VALIDATION,
14
+ message: 'Reload this document before making changes.',
15
+ details: validation
16
+ };
17
+ const lock = getLockConflictDetails(error);
18
+ if (lock) return {
19
+ code: ErrorCodes.LOCK_CONFLICT,
20
+ message: 'This change could not be saved because another operation was using the document. Reload before trying again.',
21
+ details: lock
22
+ };
23
+ const tree = committedTreeReceipt(error);
24
+ if (tree) return {
25
+ code: ErrorCodes.TREE_HOOK_COMMITTED,
26
+ message: 'The structure was saved, but a follow-up action failed.',
27
+ details: tree
28
+ };
29
+ const committed = getDocumentHookCommittedDetails(error);
30
+ if (committed) return {
31
+ code: ErrorCodes.DOCUMENT_HOOK_COMMITTED,
32
+ message: 'The document was saved, but a follow-up action failed.',
33
+ details: committed
34
+ };
35
+ if (error instanceof BylineError && error.code === ErrorCodes.NOT_FOUND) return {
36
+ code: ErrorCodes.NOT_FOUND,
37
+ message: 'This document is no longer available.'
38
+ };
39
+ return error;
40
+ }
41
+ function withDocumentMutationErrors(handler) {
42
+ return async (input)=>{
43
+ try {
44
+ return await handler(input);
45
+ } catch (error) {
46
+ throw documentMutationError(error);
47
+ }
48
+ };
49
+ }
50
+ export { documentMutationError, withDocumentMutationErrors };
@@ -0,0 +1,9 @@
1
+ /** Restore metadata stripped by schema parsing only onto the exact source version.
2
+ * Never attach by array position: filtering/reordering must not transfer tokens. */
3
+ export declare function withEditableRevision<T extends object>(document: T, observation: {
4
+ id: string;
5
+ versionId: string;
6
+ revision: number;
7
+ } | undefined): T & {
8
+ revision: number;
9
+ };
@@ -0,0 +1,11 @@
1
+ import { ERR_DATABASE, isDocumentRevision } from "@byline/core";
2
+ function withEditableRevision(document, observation) {
3
+ if (!observation || !isDocumentRevision(observation.revision) || Reflect.get(document, 'id') !== observation.id || Reflect.get(document, 'versionId') !== observation.versionId) throw ERR_DATABASE({
4
+ message: 'Editable response no longer matches its source observation'
5
+ });
6
+ return {
7
+ ...document,
8
+ revision: observation.revision
9
+ };
10
+ }
11
+ export { withEditableRevision };
@@ -22,4 +22,6 @@ export interface SetAdminLocaleResult {
22
22
  */
23
23
  account: AccountResponse | null;
24
24
  }
25
- export declare const setAdminLocaleFn: import("@tanstack/react-start").RequiredFetcher<undefined, (input: SetAdminLocaleInput) => SetAdminLocaleInput, Promise<SetAdminLocaleResult>>;
25
+ export declare const setAdminLocaleFn: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterClient<{}, unknown, undefined, {
26
+ expectedSessionId: string | null;
27
+ }, undefined>], (input: SetAdminLocaleInput) => SetAdminLocaleInput, Promise<SetAdminLocaleResult>>;
@@ -1,12 +1,22 @@
1
- import { createServerFn } from "@tanstack/react-start";
1
+ import { createMiddleware, createServerFn } from "@tanstack/react-start";
2
2
  import { setPreferredLocaleCommand } from "@byline/admin/admin-account";
3
3
  import { AuthError, AuthErrorCodes } from "@byline/auth";
4
4
  import { getAdminRequestContext } from "@byline/client/server";
5
5
  import { clearAdminLocaleCookie, setAdminLocaleCookie } from "../../i18n/locale-cookie.js";
6
6
  import { bylineCore } from "../../integrations/byline-core.js";
7
+ import { expectedSession } from "../../integrations/session-coordination.js";
8
+ const localeSession = createMiddleware({
9
+ type: 'function'
10
+ }).client(({ next })=>next({
11
+ sendContext: {
12
+ expectedSessionId: expectedSession()
13
+ }
14
+ }));
7
15
  const setAdminLocaleFn = createServerFn({
8
16
  method: 'POST'
9
- }).validator((input)=>input).handler(async ({ data })=>{
17
+ }).middleware([
18
+ localeSession
19
+ ]).validator((input)=>input).handler(async ({ data, context: caller })=>{
10
20
  const core = bylineCore();
11
21
  const locales = core.config.i18n.admin.locales;
12
22
  if (null != data.locale && !locales.includes(data.locale)) throw new Error(`[setAdminLocaleFn] locale '${data.locale}' is not in i18n.admin.locales [${locales.join(', ')}].`);
@@ -20,6 +30,11 @@ const setAdminLocaleFn = createServerFn({
20
30
  };
21
31
  try {
22
32
  const context = await getAdminRequestContext();
33
+ if (!caller.expectedSessionId || caller.expectedSessionId !== context.sessionId) return {
34
+ ok: true,
35
+ locale: data.locale,
36
+ account: null
37
+ };
23
38
  const account = await setPreferredLocaleCommand(context, {
24
39
  locale: data.locale
25
40
  }, {
@@ -31,7 +46,7 @@ const setAdminLocaleFn = createServerFn({
31
46
  account
32
47
  };
33
48
  } catch (err) {
34
- if (err instanceof AuthError && err.code === AuthErrorCodes.UNAUTHENTICATED) return {
49
+ if (err instanceof AuthError && (err.code === AuthErrorCodes.UNAUTHENTICATED || err.code === AuthErrorCodes.ACCESS_EXPIRED)) return {
35
50
  ok: true,
36
51
  locale: data.locale,
37
52
  account: null
@@ -5,7 +5,9 @@
5
5
  *
6
6
  * Copyright (c) Infonomic Company Limited
7
7
  */
8
- export declare const disablePreviewModeFn: import("@tanstack/react-start").OptionalFetcher<undefined, undefined, Promise<{
8
+ export declare const disablePreviewModeFn: import("@tanstack/react-start").OptionalFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
9
+ bylineExpectedSessionId: string | null;
10
+ }, undefined, undefined>], undefined, Promise<{
9
11
  status: 'ok';
10
12
  preview: false;
11
13
  }>>;
@@ -1,8 +1,11 @@
1
1
  import { createServerFn } from "@tanstack/react-start";
2
2
  import { clearPreviewCookie } from "@byline/client/server";
3
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
3
4
  const disablePreviewModeFn = createServerFn({
4
5
  method: 'POST'
5
- }).handler(async ()=>{
6
+ }).middleware([
7
+ adminSessionMiddleware
8
+ ]).handler(async ()=>{
6
9
  clearPreviewCookie();
7
10
  return {
8
11
  status: 'ok',
@@ -5,7 +5,9 @@
5
5
  *
6
6
  * Copyright (c) Infonomic Company Limited
7
7
  */
8
- export declare const enablePreviewModeFn: import("@tanstack/react-start").OptionalFetcher<undefined, undefined, Promise<{
8
+ export declare const enablePreviewModeFn: import("@tanstack/react-start").OptionalFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
9
+ bylineExpectedSessionId: string | null;
10
+ }, undefined, undefined>], undefined, Promise<{
9
11
  status: 'ok';
10
12
  preview: true;
11
13
  }>>;
@@ -1,8 +1,11 @@
1
1
  import { createServerFn } from "@tanstack/react-start";
2
2
  import { getAdminRequestContext, setPreviewCookie } from "@byline/client/server";
3
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
3
4
  const enablePreviewModeFn = createServerFn({
4
5
  method: 'POST'
5
- }).handler(async ()=>{
6
+ }).middleware([
7
+ adminSessionMiddleware
8
+ ]).handler(async ()=>{
6
9
  await getAdminRequestContext();
7
10
  setPreviewCookie();
8
11
  return {
@@ -17,4 +17,4 @@ export interface SingletonDocumentReadInput {
17
17
  * is deliberately composed one layer up, where host database and actor
18
18
  * context are available without widening the singleton transport contract.
19
19
  */
20
- export declare function readSingletonDocument(data: SingletonDocumentReadInput): Promise<import("@byline/client").SingletonDocument<Record<string, any>> | null>;
20
+ export declare function readSingletonDocument(data: SingletonDocumentReadInput): Promise<Omit<import("@byline/client").EditableDocument<Record<string, any>>, "path"> | null>;
@@ -1,10 +1,14 @@
1
1
  import { getAdminBylineClient } from "@byline/client/server";
2
- import { getCollectionDefinition } from "@byline/core";
2
+ import { ERR_NOT_FOUND, getCollectionDefinition } from "@byline/core";
3
3
  import { resolveAdminDocumentRead } from "./admin-document-presentation.js";
4
4
  import { serialise } from "./serialise.js";
5
5
  async function readSingletonDocument(data) {
6
6
  const handle = getAdminBylineClient().singleton(data.singleton);
7
- const { options } = resolveAdminDocumentRead(getCollectionDefinition(data.singleton), data);
8
- return serialise(await handle.get(options));
7
+ const { options: { status: _status, ...options } } = resolveAdminDocumentRead(getCollectionDefinition(data.singleton), data);
8
+ const snapshot = await handle.getForEdit(options);
9
+ if (null == snapshot) throw ERR_NOT_FOUND({
10
+ message: 'Singleton document is unavailable'
11
+ });
12
+ return 'empty' === snapshot.state ? null : serialise(snapshot.document);
9
13
  }
10
14
  export { readSingletonDocument };
@@ -5,8 +5,15 @@
5
5
  *
6
6
  * Copyright (c) Infonomic Company Limited
7
7
  */
8
- export declare const cancelSingletonScheduledPublish: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
8
+ export declare const cancelSingletonScheduledPublish: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
9
+ bylineExpectedSessionId: string | null;
10
+ }, undefined, undefined>], (input: {
11
+ expectedRevision: number;
9
12
  singleton: string;
10
13
  }) => {
14
+ expectedRevision: number;
11
15
  singleton: string;
12
- }, Promise<import("@byline/client").DocumentPublishScheduleInfo | null>>;
16
+ }, Promise<{
17
+ schedule: import("@byline/client").DocumentPublishScheduleInfo | null;
18
+ revision: number;
19
+ }>>;
@@ -1,7 +1,13 @@
1
1
  import { createServerFn } from "@tanstack/react-start";
2
2
  import { getAdminBylineClient } from "@byline/client/server";
3
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
4
+ import { withDocumentMutationErrors } from "../document-mutation-errors.js";
3
5
  import { serialise } from "../serialise.js";
4
6
  const cancelSingletonScheduledPublish = createServerFn({
5
7
  method: 'POST'
6
- }).validator((input)=>input).handler(async ({ data })=>serialise(await getAdminBylineClient().singleton(data.singleton).cancelScheduledPublish()));
8
+ }).middleware([
9
+ adminSessionMiddleware
10
+ ]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data })=>serialise(await getAdminBylineClient().singleton(data.singleton).cancelScheduledPublish({
11
+ expectedRevision: data.expectedRevision
12
+ }))));
7
13
  export { cancelSingletonScheduledPublish };
@@ -5,10 +5,14 @@
5
5
  *
6
6
  * Copyright (c) Infonomic Company Limited
7
7
  */
8
- export declare const changeSingletonStatus: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
8
+ export declare const changeSingletonStatus: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
9
+ bylineExpectedSessionId: string | null;
10
+ }, undefined, undefined>], (input: {
11
+ expectedRevision: number;
9
12
  singleton: string;
10
13
  status: string;
11
14
  }) => {
15
+ expectedRevision: number;
12
16
  singleton: string;
13
17
  status: string;
14
18
  }, Promise<import("@byline/core").ChangeStatusResult>>;
@@ -1,7 +1,13 @@
1
1
  import { createServerFn } from "@tanstack/react-start";
2
2
  import { getAdminBylineClient } from "@byline/client/server";
3
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
4
+ import { withDocumentMutationErrors } from "../document-mutation-errors.js";
3
5
  import { serialise } from "../serialise.js";
4
6
  const changeSingletonStatus = createServerFn({
5
7
  method: 'POST'
6
- }).validator((input)=>input).handler(async ({ data })=>serialise(await getAdminBylineClient().singleton(data.singleton).changeStatus(data.status)));
8
+ }).middleware([
9
+ adminSessionMiddleware
10
+ ]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data })=>serialise(await getAdminBylineClient().singleton(data.singleton).changeStatus(data.status, {
11
+ expectedRevision: data.expectedRevision
12
+ }))));
7
13
  export { changeSingletonStatus };
@@ -5,10 +5,16 @@
5
5
  *
6
6
  * Copyright (c) Infonomic Company Limited
7
7
  */
8
- export declare const confirmSingletonScheduledPublish: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
8
+ export declare const confirmSingletonScheduledPublish: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
9
+ bylineExpectedSessionId: string | null;
10
+ }, undefined, undefined>], (input: {
11
+ expectedRevision: number;
9
12
  singleton: string;
10
13
  expectedVersionId: string;
11
14
  }) => {
15
+ expectedRevision: number;
12
16
  singleton: string;
13
17
  expectedVersionId: string;
14
- }, Promise<import("@byline/client").DocumentPublishScheduleInfo>>;
18
+ }, Promise<import("@byline/client").DocumentPublishScheduleInfo & {
19
+ revision: number;
20
+ }>>;
@@ -1,9 +1,14 @@
1
1
  import { createServerFn } from "@tanstack/react-start";
2
2
  import { getAdminBylineClient } from "@byline/client/server";
3
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
4
+ import { withDocumentMutationErrors } from "../document-mutation-errors.js";
3
5
  import { serialise } from "../serialise.js";
4
6
  const confirmSingletonScheduledPublish = createServerFn({
5
7
  method: 'POST'
6
- }).validator((input)=>input).handler(async ({ data })=>serialise(await getAdminBylineClient().singleton(data.singleton).confirmScheduledPublish({
8
+ }).middleware([
9
+ adminSessionMiddleware
10
+ ]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data })=>serialise(await getAdminBylineClient().singleton(data.singleton).confirmScheduledPublish({
11
+ expectedRevision: data.expectedRevision,
7
12
  expectedVersionId: data.expectedVersionId
8
- })));
13
+ }))));
9
14
  export { confirmSingletonScheduledPublish };
@@ -5,12 +5,16 @@
5
5
  *
6
6
  * Copyright (c) Infonomic Company Limited
7
7
  */
8
- export declare const copySingletonToLocale: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
8
+ export declare const copySingletonToLocale: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
9
+ bylineExpectedSessionId: string | null;
10
+ }, undefined, undefined>], (input: {
11
+ expectedRevision: number;
9
12
  singleton: string;
10
13
  sourceLocale: string;
11
14
  targetLocale: string;
12
15
  overwrite?: boolean;
13
16
  }) => {
17
+ expectedRevision: number;
14
18
  singleton: string;
15
19
  sourceLocale: string;
16
20
  targetLocale: string;
@@ -1,12 +1,17 @@
1
1
  import { createServerFn } from "@tanstack/react-start";
2
2
  import { getAdminBylineClient } from "@byline/client/server";
3
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
3
4
  import { toCommittedDocumentHookFailureResponse } from "../collections/save-outcome.js";
5
+ import { withDocumentMutationErrors } from "../document-mutation-errors.js";
4
6
  import { serialise } from "../serialise.js";
5
7
  const copySingletonToLocale = createServerFn({
6
8
  method: 'POST'
7
- }).validator((input)=>input).handler(async ({ data })=>{
9
+ }).middleware([
10
+ adminSessionMiddleware
11
+ ]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data })=>{
8
12
  try {
9
13
  return serialise(await getAdminBylineClient().singleton(data.singleton).copyToLocale({
14
+ expectedRevision: data.expectedRevision,
10
15
  sourceLocale: data.sourceLocale,
11
16
  targetLocale: data.targetLocale,
12
17
  overwrite: data.overwrite
@@ -16,5 +21,5 @@ const copySingletonToLocale = createServerFn({
16
21
  if (null != committedFailure) return committedFailure;
17
22
  throw error;
18
23
  }
19
- });
24
+ }));
20
25
  export { copySingletonToLocale };
@@ -5,7 +5,9 @@
5
5
  *
6
6
  * Copyright (c) Infonomic Company Limited
7
7
  */
8
- export declare const findSingletonByVersion: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
8
+ export declare const findSingletonByVersion: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
9
+ bylineExpectedSessionId: string | null;
10
+ }, undefined, undefined>], (input: {
9
11
  singleton: string;
10
12
  versionId: string;
11
13
  locale?: string;
@@ -1,9 +1,12 @@
1
1
  import { createServerFn } from "@tanstack/react-start";
2
2
  import { getAdminBylineClient } from "@byline/client/server";
3
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
3
4
  import { serialise } from "../serialise.js";
4
5
  const findSingletonByVersion = createServerFn({
5
6
  method: 'GET'
6
- }).validator((input)=>input).handler(async ({ data })=>serialise(await getAdminBylineClient().singleton(data.singleton).findByVersion(data.versionId, {
7
+ }).middleware([
8
+ adminSessionMiddleware
9
+ ]).validator((input)=>input).handler(async ({ data })=>serialise(await getAdminBylineClient().singleton(data.singleton).findByVersion(data.versionId, {
7
10
  locale: data.locale ?? 'all'
8
11
  })));
9
12
  export { findSingletonByVersion };
@@ -5,7 +5,9 @@
5
5
  *
6
6
  * Copyright (c) Infonomic Company Limited
7
7
  */
8
- export declare const getSingletonScheduledPublish: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
8
+ export declare const getSingletonScheduledPublish: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
9
+ bylineExpectedSessionId: string | null;
10
+ }, undefined, undefined>], (input: {
9
11
  singleton: string;
10
12
  }) => {
11
13
  singleton: string;
@@ -1,7 +1,10 @@
1
1
  import { createServerFn } from "@tanstack/react-start";
2
2
  import { getAdminBylineClient } from "@byline/client/server";
3
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
3
4
  import { serialise } from "../serialise.js";
4
5
  const getSingletonScheduledPublish = createServerFn({
5
6
  method: 'GET'
6
- }).validator((input)=>input).handler(async ({ data })=>serialise(await getAdminBylineClient().singleton(data.singleton).getScheduledPublish()));
7
+ }).middleware([
8
+ adminSessionMiddleware
9
+ ]).validator((input)=>input).handler(async ({ data })=>serialise(await getAdminBylineClient().singleton(data.singleton).getScheduledPublish()));
7
10
  export { getSingletonScheduledPublish };
@@ -17,8 +17,10 @@ export interface GetSingletonInput {
17
17
  * - this shared host layer owns lenient reads, raw missing-locale values,
18
18
  * relation-summary population, transport serialization, and preservation of
19
19
  * restore warnings and locale metadata;
20
- * - the route loader composes published-version metadata plus scheduled-
21
- * publication enablement, capability, and schedule aliases because those
22
- * require host-only database and actor context beyond the singleton handle.
20
+ * - the route loader composes the informational published-version badge, feature
21
+ * enablement, capability, and schedule aliases. Schedule state itself comes
22
+ * from the same editable snapshot as the source document.
23
23
  */
24
- export declare const getSingleton: import("@tanstack/react-start").RequiredFetcher<undefined, (input: GetSingletonInput) => GetSingletonInput, Promise<import("@byline/client").SingletonDocument<Record<string, any>> | null>>;
24
+ export declare const getSingleton: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
25
+ bylineExpectedSessionId: string | null;
26
+ }, undefined, undefined>], (input: GetSingletonInput) => GetSingletonInput, Promise<Omit<import("@byline/client").EditableDocument<Record<string, any>>, "path"> | null>>;
@@ -1,6 +1,9 @@
1
1
  import { createServerFn } from "@tanstack/react-start";
2
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
2
3
  import { readSingletonDocument } from "../singleton-document-read.js";
3
4
  const getSingleton = createServerFn({
4
5
  method: 'GET'
5
- }).validator((input)=>input).handler(async ({ data })=>readSingletonDocument(data));
6
+ }).middleware([
7
+ adminSessionMiddleware
8
+ ]).validator((input)=>input).handler(async ({ data })=>readSingletonDocument(data));
6
9
  export { getSingleton };
@@ -13,7 +13,9 @@ export interface SingletonHistorySearchParams {
13
13
  desc?: boolean;
14
14
  locale?: string;
15
15
  }
16
- export declare const getSingletonHistory: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
16
+ export declare const getSingletonHistory: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
17
+ bylineExpectedSessionId: string | null;
18
+ }, undefined, undefined>], (input: {
17
19
  singleton: string;
18
20
  params?: SingletonHistorySearchParams;
19
21
  }) => {
@@ -1,10 +1,13 @@
1
1
  import { createServerFn } from "@tanstack/react-start";
2
2
  import { getAdminBylineClient } from "@byline/client/server";
3
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
3
4
  import { resolveActorLabels } from "../actors.js";
4
5
  import { serialise } from "../serialise.js";
5
6
  const getSingletonHistory = createServerFn({
6
7
  method: 'GET'
7
- }).validator((input)=>input).handler(async ({ data })=>{
8
+ }).middleware([
9
+ adminSessionMiddleware
10
+ ]).validator((input)=>input).handler(async ({ data })=>{
8
11
  const params = data.params ?? {};
9
12
  const result = await getAdminBylineClient().singleton(data.singleton).history({
10
13
  locale: params.locale ?? 'en',