@byline/host-tanstack-start 5.0.0 → 5.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) 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/optional-i18n-provider.d.ts +29 -0
  4. package/dist/admin-shell/chrome/optional-i18n-provider.js +24 -0
  5. package/dist/admin-shell/chrome/session-change-boundary.d.ts +14 -0
  6. package/dist/admin-shell/chrome/session-change-boundary.js +119 -0
  7. package/dist/admin-shell/chrome/session-change-boundary.module.js +11 -0
  8. package/dist/admin-shell/chrome/session-change-boundary.test.d.ts +8 -0
  9. package/dist/admin-shell/chrome/session-change-boundary_module.css +81 -0
  10. package/dist/admin-shell/chrome/sign-in-page.d.ts +2 -1
  11. package/dist/admin-shell/chrome/sign-in-page.js +60 -3
  12. package/dist/integrations/byline-admin-services.js +7 -1
  13. package/dist/integrations/client-ip.d.ts +19 -0
  14. package/dist/integrations/client-ip.js +34 -0
  15. package/dist/integrations/session-coordination.d.ts +24 -0
  16. package/dist/integrations/session-coordination.js +85 -0
  17. package/dist/integrations/session-middleware.d.ts +11 -0
  18. package/dist/integrations/session-middleware.js +94 -0
  19. package/dist/integrations/session-request-kind.d.ts +9 -0
  20. package/dist/integrations/session-request-kind.js +10 -0
  21. package/dist/integrations/session-request-middleware.d.ts +9 -0
  22. package/dist/integrations/session-request-middleware.js +7 -0
  23. package/dist/integrations/sign-in-body.d.ts +12 -0
  24. package/dist/integrations/sign-in-body.js +52 -0
  25. package/dist/integrations/sign-in-middleware.d.ts +9 -0
  26. package/dist/integrations/sign-in-middleware.js +10 -0
  27. package/dist/routes/create-admin-layout-route.js +46 -31
  28. package/dist/routes/create-sign-in-route.js +4 -2
  29. package/dist/server-fns/admin-account/change-password.d.ts +3 -1
  30. package/dist/server-fns/admin-account/change-password.js +9 -3
  31. package/dist/server-fns/admin-account/get.d.ts +3 -1
  32. package/dist/server-fns/admin-account/get.js +4 -1
  33. package/dist/server-fns/admin-account/index.d.ts +5 -5
  34. package/dist/server-fns/admin-account/update.d.ts +3 -1
  35. package/dist/server-fns/admin-account/update.js +4 -1
  36. package/dist/server-fns/admin-activity/get.d.ts +3 -1
  37. package/dist/server-fns/admin-activity/get.js +4 -1
  38. package/dist/server-fns/admin-permissions/get-role-abilities.d.ts +3 -1
  39. package/dist/server-fns/admin-permissions/get-role-abilities.js +4 -1
  40. package/dist/server-fns/admin-permissions/index.d.ts +4 -4
  41. package/dist/server-fns/admin-permissions/list-registered.d.ts +3 -1
  42. package/dist/server-fns/admin-permissions/list-registered.js +4 -1
  43. package/dist/server-fns/admin-permissions/set-role-abilities.d.ts +3 -1
  44. package/dist/server-fns/admin-permissions/set-role-abilities.js +4 -1
  45. package/dist/server-fns/admin-permissions/who-has.d.ts +3 -1
  46. package/dist/server-fns/admin-permissions/who-has.js +4 -1
  47. package/dist/server-fns/admin-roles/create.d.ts +3 -1
  48. package/dist/server-fns/admin-roles/create.js +4 -1
  49. package/dist/server-fns/admin-roles/delete.d.ts +3 -1
  50. package/dist/server-fns/admin-roles/delete.js +4 -1
  51. package/dist/server-fns/admin-roles/get.d.ts +3 -1
  52. package/dist/server-fns/admin-roles/get.js +4 -1
  53. package/dist/server-fns/admin-roles/index.d.ts +6 -6
  54. package/dist/server-fns/admin-roles/list.d.ts +3 -1
  55. package/dist/server-fns/admin-roles/list.js +4 -1
  56. package/dist/server-fns/admin-roles/reorder.d.ts +3 -1
  57. package/dist/server-fns/admin-roles/reorder.js +4 -1
  58. package/dist/server-fns/admin-roles/update.d.ts +3 -1
  59. package/dist/server-fns/admin-roles/update.js +4 -1
  60. package/dist/server-fns/admin-users/create.d.ts +3 -1
  61. package/dist/server-fns/admin-users/create.js +4 -1
  62. package/dist/server-fns/admin-users/delete.d.ts +3 -1
  63. package/dist/server-fns/admin-users/delete.js +4 -1
  64. package/dist/server-fns/admin-users/disable.d.ts +3 -1
  65. package/dist/server-fns/admin-users/disable.js +4 -1
  66. package/dist/server-fns/admin-users/enable.d.ts +3 -1
  67. package/dist/server-fns/admin-users/enable.js +4 -1
  68. package/dist/server-fns/admin-users/get-user-roles.d.ts +3 -1
  69. package/dist/server-fns/admin-users/get-user-roles.js +4 -1
  70. package/dist/server-fns/admin-users/get.d.ts +3 -1
  71. package/dist/server-fns/admin-users/get.js +4 -1
  72. package/dist/server-fns/admin-users/index.d.ts +10 -10
  73. package/dist/server-fns/admin-users/list.d.ts +3 -1
  74. package/dist/server-fns/admin-users/list.js +4 -1
  75. package/dist/server-fns/admin-users/set-password.d.ts +3 -1
  76. package/dist/server-fns/admin-users/set-password.js +4 -1
  77. package/dist/server-fns/admin-users/set-user-roles.d.ts +3 -1
  78. package/dist/server-fns/admin-users/set-user-roles.js +4 -1
  79. package/dist/server-fns/admin-users/update.d.ts +3 -1
  80. package/dist/server-fns/admin-users/update.js +4 -1
  81. package/dist/server-fns/ai/execute.d.ts +3 -1
  82. package/dist/server-fns/ai/execute.js +4 -1
  83. package/dist/server-fns/ai/index.d.ts +1 -1
  84. package/dist/server-fns/analytics/maintenance.d.ts +6 -2
  85. package/dist/server-fns/analytics/maintenance.js +7 -2
  86. package/dist/server-fns/analytics/queries.d.ts +18 -6
  87. package/dist/server-fns/analytics/queries.js +19 -6
  88. package/dist/server-fns/auth/current-user.d.ts +1 -0
  89. package/dist/server-fns/auth/current-user.js +5 -2
  90. package/dist/server-fns/auth/renew.d.ts +13 -0
  91. package/dist/server-fns/auth/renew.js +45 -0
  92. package/dist/server-fns/auth/sign-in.d.ts +2 -1
  93. package/dist/server-fns/auth/sign-in.js +88 -17
  94. package/dist/server-fns/auth/sign-out.d.ts +3 -1
  95. package/dist/server-fns/auth/sign-out.js +38 -6
  96. package/dist/server-fns/collections/audit.d.ts +3 -1
  97. package/dist/server-fns/collections/audit.js +4 -1
  98. package/dist/server-fns/collections/copy-to-locale.d.ts +10 -1
  99. package/dist/server-fns/collections/copy-to-locale.js +5 -2
  100. package/dist/server-fns/collections/create.d.ts +10 -1
  101. package/dist/server-fns/collections/create.js +5 -2
  102. package/dist/server-fns/collections/delete-locale.d.ts +10 -1
  103. package/dist/server-fns/collections/delete-locale.js +5 -2
  104. package/dist/server-fns/collections/delete.d.ts +10 -1
  105. package/dist/server-fns/collections/delete.js +5 -2
  106. package/dist/server-fns/collections/duplicate.d.ts +10 -1
  107. package/dist/server-fns/collections/duplicate.js +5 -2
  108. package/dist/server-fns/collections/get.d.ts +7 -0
  109. package/dist/server-fns/collections/get.js +8 -3
  110. package/dist/server-fns/collections/history.d.ts +3 -1
  111. package/dist/server-fns/collections/history.js +4 -1
  112. package/dist/server-fns/collections/index.d.ts +21 -21
  113. package/dist/server-fns/collections/list.d.ts +10 -1
  114. package/dist/server-fns/collections/list.js +5 -2
  115. package/dist/server-fns/collections/reindex.d.ts +3 -1
  116. package/dist/server-fns/collections/reindex.js +4 -1
  117. package/dist/server-fns/collections/reorder.d.ts +10 -1
  118. package/dist/server-fns/collections/reorder.js +5 -2
  119. package/dist/server-fns/collections/restore-version.d.ts +10 -1
  120. package/dist/server-fns/collections/restore-version.js +5 -2
  121. package/dist/server-fns/collections/scheduled-publication.d.ts +22 -5
  122. package/dist/server-fns/collections/scheduled-publication.js +17 -6
  123. package/dist/server-fns/collections/set-list-view-preference.d.ts +3 -1
  124. package/dist/server-fns/collections/set-list-view-preference.js +4 -1
  125. package/dist/server-fns/collections/stats.js +4 -1
  126. package/dist/server-fns/collections/status.d.ts +13 -2
  127. package/dist/server-fns/collections/status.js +8 -3
  128. package/dist/server-fns/collections/tree.d.ts +22 -5
  129. package/dist/server-fns/collections/tree.js +17 -6
  130. package/dist/server-fns/collections/update.d.ts +13 -2
  131. package/dist/server-fns/collections/update.js +8 -3
  132. package/dist/server-fns/collections/upload.d.ts +10 -1
  133. package/dist/server-fns/collections/upload.js +4 -1
  134. package/dist/server-fns/i18n/set-locale.d.ts +3 -1
  135. package/dist/server-fns/i18n/set-locale.js +18 -3
  136. package/dist/server-fns/preview/disable.d.ts +3 -1
  137. package/dist/server-fns/preview/disable.js +4 -1
  138. package/dist/server-fns/preview/enable.d.ts +3 -1
  139. package/dist/server-fns/preview/enable.js +4 -1
  140. package/dist/server-fns/singletons/cancel-scheduled-publish.d.ts +10 -1
  141. package/dist/server-fns/singletons/cancel-scheduled-publish.js +5 -2
  142. package/dist/server-fns/singletons/change-status.d.ts +10 -1
  143. package/dist/server-fns/singletons/change-status.js +5 -2
  144. package/dist/server-fns/singletons/confirm-scheduled-publish.d.ts +10 -1
  145. package/dist/server-fns/singletons/confirm-scheduled-publish.js +5 -2
  146. package/dist/server-fns/singletons/copy-to-locale.d.ts +10 -1
  147. package/dist/server-fns/singletons/copy-to-locale.js +5 -2
  148. package/dist/server-fns/singletons/find-by-version.d.ts +3 -1
  149. package/dist/server-fns/singletons/find-by-version.js +4 -1
  150. package/dist/server-fns/singletons/get-scheduled-publish.d.ts +3 -1
  151. package/dist/server-fns/singletons/get-scheduled-publish.js +4 -1
  152. package/dist/server-fns/singletons/get.d.ts +3 -1
  153. package/dist/server-fns/singletons/get.js +4 -1
  154. package/dist/server-fns/singletons/history.d.ts +3 -1
  155. package/dist/server-fns/singletons/history.js +4 -1
  156. package/dist/server-fns/singletons/restore-version.d.ts +10 -1
  157. package/dist/server-fns/singletons/restore-version.js +5 -2
  158. package/dist/server-fns/singletons/schedule-publish.d.ts +10 -1
  159. package/dist/server-fns/singletons/schedule-publish.js +5 -2
  160. package/dist/server-fns/singletons/unpublish.d.ts +10 -1
  161. package/dist/server-fns/singletons/unpublish.js +5 -2
  162. package/dist/server-fns/singletons/update.d.ts +10 -1
  163. package/dist/server-fns/singletons/update.js +5 -2
  164. package/package.json +19 -19
  165. package/src/admin-shell/chrome/admin-app-bar.tsx +11 -6
  166. package/src/admin-shell/chrome/optional-i18n-provider.tsx +61 -0
  167. package/src/admin-shell/chrome/session-change-boundary.module.css +112 -0
  168. package/src/admin-shell/chrome/session-change-boundary.test.tsx +91 -0
  169. package/src/admin-shell/chrome/session-change-boundary.tsx +155 -0
  170. package/src/admin-shell/chrome/sign-in-page.tsx +68 -3
  171. package/src/integrations/byline-admin-services.ts +7 -1
  172. package/src/integrations/client-ip.test.node.ts +45 -0
  173. package/src/integrations/client-ip.ts +54 -0
  174. package/src/integrations/framework-fetch-shape.test.node.ts +56 -0
  175. package/src/integrations/session-client.test.node.ts +121 -0
  176. package/src/integrations/session-coordination.test.node.ts +77 -0
  177. package/src/integrations/session-coordination.ts +96 -0
  178. package/src/integrations/session-middleware.test.node.ts +87 -0
  179. package/src/integrations/session-middleware.ts +107 -0
  180. package/src/integrations/session-request-kind.ts +18 -0
  181. package/src/integrations/session-request-middleware.ts +17 -0
  182. package/src/integrations/sign-in-body.test.node.ts +59 -0
  183. package/src/integrations/sign-in-body.ts +50 -0
  184. package/src/integrations/sign-in-middleware.ts +24 -0
  185. package/src/routes/create-admin-layout-route.tsx +48 -30
  186. package/src/routes/create-sign-in-route.tsx +10 -2
  187. package/src/server-fns/admin-account/change-password.test.node.ts +69 -0
  188. package/src/server-fns/admin-account/change-password.ts +13 -2
  189. package/src/server-fns/admin-account/get.ts +2 -0
  190. package/src/server-fns/admin-account/update.ts +2 -0
  191. package/src/server-fns/admin-activity/get.ts +2 -0
  192. package/src/server-fns/admin-permissions/get-role-abilities.ts +2 -0
  193. package/src/server-fns/admin-permissions/list-registered.ts +5 -4
  194. package/src/server-fns/admin-permissions/set-role-abilities.ts +2 -0
  195. package/src/server-fns/admin-permissions/who-has.ts +2 -0
  196. package/src/server-fns/admin-roles/create.ts +2 -0
  197. package/src/server-fns/admin-roles/delete.ts +2 -0
  198. package/src/server-fns/admin-roles/get.ts +2 -0
  199. package/src/server-fns/admin-roles/list.ts +5 -4
  200. package/src/server-fns/admin-roles/reorder.ts +2 -0
  201. package/src/server-fns/admin-roles/update.ts +2 -0
  202. package/src/server-fns/admin-users/create.ts +2 -0
  203. package/src/server-fns/admin-users/delete.ts +2 -0
  204. package/src/server-fns/admin-users/disable.ts +2 -0
  205. package/src/server-fns/admin-users/enable.ts +2 -0
  206. package/src/server-fns/admin-users/get-user-roles.ts +2 -0
  207. package/src/server-fns/admin-users/get.ts +2 -0
  208. package/src/server-fns/admin-users/list.ts +2 -0
  209. package/src/server-fns/admin-users/set-password.ts +2 -0
  210. package/src/server-fns/admin-users/set-user-roles.ts +2 -0
  211. package/src/server-fns/admin-users/update.ts +2 -0
  212. package/src/server-fns/ai/execute.ts +3 -0
  213. package/src/server-fns/analytics/maintenance.ts +4 -0
  214. package/src/server-fns/analytics/queries.ts +14 -8
  215. package/src/server-fns/auth/current-user.ts +7 -3
  216. package/src/server-fns/auth/renew.test.node.ts +85 -0
  217. package/src/server-fns/auth/renew.ts +54 -0
  218. package/src/server-fns/auth/sign-in.test.node.ts +114 -0
  219. package/src/server-fns/auth/sign-in.ts +80 -27
  220. package/src/server-fns/auth/sign-out.test.node.ts +85 -0
  221. package/src/server-fns/auth/sign-out.ts +44 -19
  222. package/src/server-fns/collections/audit.ts +2 -0
  223. package/src/server-fns/collections/copy-to-locale.ts +3 -1
  224. package/src/server-fns/collections/create.ts +3 -1
  225. package/src/server-fns/collections/delete-locale.ts +3 -1
  226. package/src/server-fns/collections/delete.ts +3 -1
  227. package/src/server-fns/collections/duplicate.ts +3 -1
  228. package/src/server-fns/collections/get.ts +4 -1
  229. package/src/server-fns/collections/history.ts +2 -0
  230. package/src/server-fns/collections/list.ts +3 -1
  231. package/src/server-fns/collections/reindex.ts +2 -0
  232. package/src/server-fns/collections/reorder.ts +3 -1
  233. package/src/server-fns/collections/restore-version.ts +3 -1
  234. package/src/server-fns/collections/revision-input.test.node.ts +14 -0
  235. package/src/server-fns/collections/scheduled-publication.ts +14 -7
  236. package/src/server-fns/collections/set-list-view-preference.ts +2 -0
  237. package/src/server-fns/collections/stats.ts +2 -0
  238. package/src/server-fns/collections/status.ts +4 -1
  239. package/src/server-fns/collections/tree.ts +7 -1
  240. package/src/server-fns/collections/update.ts +4 -1
  241. package/src/server-fns/collections/upload-singleton.test.node.ts +8 -1
  242. package/src/server-fns/collections/upload.ts +10 -0
  243. package/src/server-fns/i18n/set-locale.ts +19 -3
  244. package/src/server-fns/preview/disable.ts +8 -4
  245. package/src/server-fns/preview/enable.ts +9 -5
  246. package/src/server-fns/singletons/cancel-scheduled-publish.ts +3 -1
  247. package/src/server-fns/singletons/change-status.ts +3 -1
  248. package/src/server-fns/singletons/confirm-scheduled-publish.ts +3 -1
  249. package/src/server-fns/singletons/copy-to-locale.ts +3 -1
  250. package/src/server-fns/singletons/find-by-version.ts +2 -0
  251. package/src/server-fns/singletons/get-scheduled-publish.ts +2 -0
  252. package/src/server-fns/singletons/get.ts +2 -0
  253. package/src/server-fns/singletons/history.ts +2 -0
  254. package/src/server-fns/singletons/restore-version.ts +3 -1
  255. package/src/server-fns/singletons/schedule-publish.ts +3 -1
  256. package/src/server-fns/singletons/singletons.test.node.ts +6 -0
  257. package/src/server-fns/singletons/unpublish.ts +3 -1
  258. package/src/server-fns/singletons/update.ts +3 -1
@@ -1,4 +1,3 @@
1
- import { testAdapter } from '../../../../core/src/storage/db-adapter.test-helper.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -21,6 +20,9 @@ vi.mock('@tanstack/react-start', () => ({
21
20
  createServerFn: () => {
22
21
  let validate = (input: unknown) => input
23
22
  const chain = {
23
+ middleware() {
24
+ return chain
25
+ },
24
26
  validator(validator: (input: unknown) => unknown) {
25
27
  validate = validator
26
28
  return chain
@@ -50,6 +52,11 @@ vi.mock('../../integrations/byline-core.js', () => ({
50
52
  import { ensureCollection, ensureDocumentResource } from '../../integrations/api-utils.js'
51
53
  import { uploadField } from './upload.js'
52
54
 
55
+ // Handler-level tests isolate transport; session-middleware tests exercise the real pre-handler boundary.
56
+ vi.mock('../../integrations/session-middleware.js', () => ({ adminSessionMiddleware: {} }))
57
+
58
+ import { testAdapter } from '../../../../core/src/storage/db-adapter.test-helper.js'
59
+
53
60
  const SERVER_CONFIG = Symbol.for('__byline_server_config__')
54
61
  const BYLINE_LOGGER = Symbol.for('__byline_logger__')
55
62
  const previousServer = (globalThis as Record<PropertyKey, unknown>)[SERVER_CONFIG]
@@ -1,3 +1,11 @@
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
+ */
8
+
1
9
  import { createServerFn } from '@tanstack/react-start'
2
10
 
3
11
  import { getAdminRequestContext } from '@byline/client/server'
@@ -14,6 +22,7 @@ import { getLogger, withLogContext } from '@byline/core/logger'
14
22
  import { uploadField as coreUploadField } from '@byline/core/services'
15
23
 
16
24
  import { ensureDocumentResource } from '../../integrations/api-utils.js'
25
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
17
26
  import { withDocumentMutationErrors } from '../document-mutation-errors.js'
18
27
 
19
28
  /**
@@ -150,6 +159,7 @@ function resolveUploadField(
150
159
  * without depending on TanStack Start server-function transport details.
151
160
  */
152
161
  export const uploadCollectionField = createServerFn({ method: 'POST' })
162
+ .middleware([adminSessionMiddleware])
153
163
  .validator(parseUploadFormData)
154
164
  .handler(
155
165
  withDocumentMutationErrors(async ({ data }) => {
@@ -25,7 +25,7 @@
25
25
  * switcher works on the sign-in surface — the DB write simply skips.
26
26
  */
27
27
 
28
- import { createServerFn } from '@tanstack/react-start'
28
+ import { createMiddleware, createServerFn } from '@tanstack/react-start'
29
29
 
30
30
  import type { AccountResponse } from '@byline/admin/admin-account'
31
31
  import { setPreferredLocaleCommand } from '@byline/admin/admin-account'
@@ -34,6 +34,7 @@ import { getAdminRequestContext } from '@byline/client/server'
34
34
 
35
35
  import { clearAdminLocaleCookie, setAdminLocaleCookie } from '../../i18n/locale-cookie.js'
36
36
  import { bylineCore } from '../../integrations/byline-core.js'
37
+ import { expectedSession } from '../../integrations/session-coordination.js'
37
38
 
38
39
  export interface SetAdminLocaleInput {
39
40
  /** BCP 47 tag, or `null` to clear the preference. */
@@ -53,9 +54,18 @@ export interface SetAdminLocaleResult {
53
54
  account: AccountResponse | null
54
55
  }
55
56
 
57
+ const localeSession = createMiddleware({ type: 'function' }).client(({ next }) =>
58
+ next({
59
+ sendContext: {
60
+ expectedSessionId: expectedSession(),
61
+ },
62
+ })
63
+ )
64
+
56
65
  export const setAdminLocaleFn = createServerFn({ method: 'POST' })
66
+ .middleware([localeSession])
57
67
  .validator((input: SetAdminLocaleInput) => input)
58
- .handler(async ({ data }): Promise<SetAdminLocaleResult> => {
68
+ .handler(async ({ data, context: caller }): Promise<SetAdminLocaleResult> => {
59
69
  const core = bylineCore()
60
70
  const locales = core.config.i18n.admin.locales
61
71
 
@@ -87,6 +97,9 @@ export const setAdminLocaleFn = createServerFn({ method: 'POST' })
87
97
 
88
98
  try {
89
99
  const context = await getAdminRequestContext()
100
+ if (!caller.expectedSessionId || caller.expectedSessionId !== context.sessionId) {
101
+ return { ok: true as const, locale: data.locale, account: null }
102
+ }
90
103
  const account = await setPreferredLocaleCommand(
91
104
  context,
92
105
  { locale: data.locale },
@@ -94,7 +107,10 @@ export const setAdminLocaleFn = createServerFn({ method: 'POST' })
94
107
  )
95
108
  return { ok: true as const, locale: data.locale, account }
96
109
  } catch (err) {
97
- if (err instanceof AuthError && err.code === AuthErrorCodes.UNAUTHENTICATED) {
110
+ if (
111
+ err instanceof AuthError &&
112
+ (err.code === AuthErrorCodes.UNAUTHENTICATED || err.code === AuthErrorCodes.ACCESS_EXPIRED)
113
+ ) {
98
114
  // Expected on the pre-auth path. Cookie already written.
99
115
  return { ok: true as const, locale: data.locale, account: null }
100
116
  }
@@ -18,7 +18,11 @@ import { createServerFn } from '@tanstack/react-start'
18
18
 
19
19
  import { clearPreviewCookie } from '@byline/client/server'
20
20
 
21
- export const disablePreviewModeFn = createServerFn({ method: 'POST' }).handler(async () => {
22
- clearPreviewCookie()
23
- return { status: 'ok' as const, preview: false as const }
24
- })
21
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
22
+
23
+ export const disablePreviewModeFn = createServerFn({ method: 'POST' })
24
+ .middleware([adminSessionMiddleware])
25
+ .handler(async () => {
26
+ clearPreviewCookie()
27
+ return { status: 'ok' as const, preview: false as const }
28
+ })
@@ -19,8 +19,12 @@ import { createServerFn } from '@tanstack/react-start'
19
19
 
20
20
  import { getAdminRequestContext, setPreviewCookie } from '@byline/client/server'
21
21
 
22
- export const enablePreviewModeFn = createServerFn({ method: 'POST' }).handler(async () => {
23
- await getAdminRequestContext()
24
- setPreviewCookie()
25
- return { status: 'ok' as const, preview: true as const }
26
- })
22
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
23
+
24
+ export const enablePreviewModeFn = createServerFn({ method: 'POST' })
25
+ .middleware([adminSessionMiddleware])
26
+ .handler(async () => {
27
+ await getAdminRequestContext()
28
+ setPreviewCookie()
29
+ return { status: 'ok' as const, preview: true as const }
30
+ })
@@ -1,4 +1,3 @@
1
- import { withDocumentMutationErrors } from '../document-mutation-errors.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -11,9 +10,12 @@ import { createServerFn } from '@tanstack/react-start'
11
10
 
12
11
  import { getAdminBylineClient } from '@byline/client/server'
13
12
 
13
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
14
+ import { withDocumentMutationErrors } from '../document-mutation-errors.js'
14
15
  import { serialise } from '../serialise.js'
15
16
 
16
17
  export const cancelSingletonScheduledPublish = createServerFn({ method: 'POST' })
18
+ .middleware([adminSessionMiddleware])
17
19
  .validator((input: { expectedRevision: number; singleton: string }) => input)
18
20
  .handler(
19
21
  withDocumentMutationErrors(async ({ data }) =>
@@ -1,4 +1,3 @@
1
- import { withDocumentMutationErrors } from '../document-mutation-errors.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -11,9 +10,12 @@ import { createServerFn } from '@tanstack/react-start'
11
10
 
12
11
  import { getAdminBylineClient } from '@byline/client/server'
13
12
 
13
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
14
+ import { withDocumentMutationErrors } from '../document-mutation-errors.js'
14
15
  import { serialise } from '../serialise.js'
15
16
 
16
17
  export const changeSingletonStatus = createServerFn({ method: 'POST' })
18
+ .middleware([adminSessionMiddleware])
17
19
  .validator((input: { expectedRevision: number; singleton: string; status: string }) => input)
18
20
  .handler(
19
21
  withDocumentMutationErrors(async ({ data }) =>
@@ -1,4 +1,3 @@
1
- import { withDocumentMutationErrors } from '../document-mutation-errors.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -11,9 +10,12 @@ import { createServerFn } from '@tanstack/react-start'
11
10
 
12
11
  import { getAdminBylineClient } from '@byline/client/server'
13
12
 
13
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
14
+ import { withDocumentMutationErrors } from '../document-mutation-errors.js'
14
15
  import { serialise } from '../serialise.js'
15
16
 
16
17
  export const confirmSingletonScheduledPublish = createServerFn({ method: 'POST' })
18
+ .middleware([adminSessionMiddleware])
17
19
  .validator(
18
20
  (input: { expectedRevision: number; singleton: string; expectedVersionId: string }) => input
19
21
  )
@@ -1,4 +1,3 @@
1
- import { withDocumentMutationErrors } from '../document-mutation-errors.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -11,10 +10,13 @@ import { createServerFn } from '@tanstack/react-start'
11
10
 
12
11
  import { getAdminBylineClient } from '@byline/client/server'
13
12
 
13
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
14
14
  import { toCommittedDocumentHookFailureResponse } from '../collections/save-outcome.js'
15
+ import { withDocumentMutationErrors } from '../document-mutation-errors.js'
15
16
  import { serialise } from '../serialise.js'
16
17
 
17
18
  export const copySingletonToLocale = createServerFn({ method: 'POST' })
19
+ .middleware([adminSessionMiddleware])
18
20
  .validator(
19
21
  (input: {
20
22
  expectedRevision: number
@@ -10,9 +10,11 @@ import { createServerFn } from '@tanstack/react-start'
10
10
 
11
11
  import { getAdminBylineClient } from '@byline/client/server'
12
12
 
13
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
13
14
  import { serialise } from '../serialise.js'
14
15
 
15
16
  export const findSingletonByVersion = createServerFn({ method: 'GET' })
17
+ .middleware([adminSessionMiddleware])
16
18
  .validator((input: { singleton: string; versionId: string; locale?: string }) => input)
17
19
  .handler(async ({ data }) =>
18
20
  serialise(
@@ -10,9 +10,11 @@ import { createServerFn } from '@tanstack/react-start'
10
10
 
11
11
  import { getAdminBylineClient } from '@byline/client/server'
12
12
 
13
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
13
14
  import { serialise } from '../serialise.js'
14
15
 
15
16
  export const getSingletonScheduledPublish = createServerFn({ method: 'GET' })
17
+ .middleware([adminSessionMiddleware])
16
18
  .validator((input: { singleton: string }) => input)
17
19
  .handler(async ({ data }) =>
18
20
  serialise(await getAdminBylineClient().singleton(data.singleton).getScheduledPublish())
@@ -8,6 +8,7 @@
8
8
 
9
9
  import { createServerFn } from '@tanstack/react-start'
10
10
 
11
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
11
12
  import { readSingletonDocument } from '../singleton-document-read.js'
12
13
 
13
14
  export interface GetSingletonInput {
@@ -28,5 +29,6 @@ export interface GetSingletonInput {
28
29
  * from the same editable snapshot as the source document.
29
30
  */
30
31
  export const getSingleton = createServerFn({ method: 'GET' })
32
+ .middleware([adminSessionMiddleware])
31
33
  .validator((input: GetSingletonInput) => input)
32
34
  .handler(async ({ data }) => readSingletonDocument(data))
@@ -10,6 +10,7 @@ import { createServerFn } from '@tanstack/react-start'
10
10
 
11
11
  import { getAdminBylineClient } from '@byline/client/server'
12
12
 
13
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
13
14
  import { type ActorLabelMap, resolveActorLabels } from '../actors.js'
14
15
  import { serialise } from '../serialise.js'
15
16
 
@@ -22,6 +23,7 @@ export interface SingletonHistorySearchParams {
22
23
  }
23
24
 
24
25
  export const getSingletonHistory = createServerFn({ method: 'GET' })
26
+ .middleware([adminSessionMiddleware])
25
27
  .validator((input: { singleton: string; params?: SingletonHistorySearchParams }) => input)
26
28
  .handler(async ({ data }) => {
27
29
  const params = data.params ?? {}
@@ -1,4 +1,3 @@
1
- import { withDocumentMutationErrors } from '../document-mutation-errors.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -11,10 +10,13 @@ import { createServerFn } from '@tanstack/react-start'
11
10
 
12
11
  import { getAdminBylineClient } from '@byline/client/server'
13
12
 
13
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
14
14
  import { toCommittedDocumentHookFailureResponse } from '../collections/save-outcome.js'
15
+ import { withDocumentMutationErrors } from '../document-mutation-errors.js'
15
16
  import { serialise } from '../serialise.js'
16
17
 
17
18
  export const restoreSingletonVersion = createServerFn({ method: 'POST' })
19
+ .middleware([adminSessionMiddleware])
18
20
  .validator((input: { expectedRevision: number; singleton: string; versionId: string }) => input)
19
21
  .handler(
20
22
  withDocumentMutationErrors(async ({ data }) => {
@@ -1,4 +1,3 @@
1
- import { withDocumentMutationErrors } from '../document-mutation-errors.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -11,9 +10,12 @@ import { createServerFn } from '@tanstack/react-start'
11
10
 
12
11
  import { getAdminBylineClient } from '@byline/client/server'
13
12
 
13
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
14
+ import { withDocumentMutationErrors } from '../document-mutation-errors.js'
14
15
  import { serialise } from '../serialise.js'
15
16
 
16
17
  export const scheduleSingletonPublish = createServerFn({ method: 'POST' })
18
+ .middleware([adminSessionMiddleware])
17
19
  .validator(
18
20
  (input: {
19
21
  expectedRevision: number
@@ -23,6 +23,9 @@ vi.mock('@tanstack/react-start', () => ({
23
23
  createServerFn: () => {
24
24
  let validate = (input: unknown) => input
25
25
  const chain = {
26
+ middleware() {
27
+ return chain
28
+ },
26
29
  validator(validator: (input: unknown) => unknown) {
27
30
  validate = validator
28
31
  return chain
@@ -56,6 +59,9 @@ import { scheduleSingletonPublish } from './schedule-publish.js'
56
59
  import { unpublishSingleton } from './unpublish.js'
57
60
  import { updateSingleton } from './update.js'
58
61
 
62
+ // Handler-level tests isolate transport; session-middleware tests exercise the real pre-handler boundary.
63
+ vi.mock('../../integrations/session-middleware.js', () => ({ adminSessionMiddleware: {} }))
64
+
59
65
  type ServerFunction = (options: { data: any }) => Promise<any>
60
66
 
61
67
  const invoke = (serverFunction: unknown, data: Record<string, any>) =>
@@ -1,4 +1,3 @@
1
- import { withDocumentMutationErrors } from '../document-mutation-errors.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -11,9 +10,12 @@ import { createServerFn } from '@tanstack/react-start'
11
10
 
12
11
  import { getAdminBylineClient } from '@byline/client/server'
13
12
 
13
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
14
+ import { withDocumentMutationErrors } from '../document-mutation-errors.js'
14
15
  import { serialise } from '../serialise.js'
15
16
 
16
17
  export const unpublishSingleton = createServerFn({ method: 'POST' })
18
+ .middleware([adminSessionMiddleware])
17
19
  .validator((input: { expectedRevision: number; singleton: string }) => input)
18
20
  .handler(
19
21
  withDocumentMutationErrors(async ({ data }) =>
@@ -1,4 +1,3 @@
1
- import { withDocumentMutationErrors } from '../document-mutation-errors.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -12,7 +11,9 @@ import { createServerFn } from '@tanstack/react-start'
12
11
  import { getAdminBylineClient } from '@byline/client/server'
13
12
  import type { SingletonSavePrecondition } from '@byline/core'
14
13
 
14
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
15
15
  import { toCommittedDocumentHookFailureResponse } from '../collections/save-outcome.js'
16
+ import { withDocumentMutationErrors } from '../document-mutation-errors.js'
16
17
  import { serialise } from '../serialise.js'
17
18
 
18
19
  export type UpdateSingletonInput = SingletonSavePrecondition & {
@@ -22,6 +23,7 @@ export type UpdateSingletonInput = SingletonSavePrecondition & {
22
23
  }
23
24
 
24
25
  export const updateSingleton = createServerFn({ method: 'POST' })
26
+ .middleware([adminSessionMiddleware])
25
27
  .validator((input: UpdateSingletonInput) => input)
26
28
  .handler(
27
29
  withDocumentMutationErrors(async ({ data }) => {