@ttt-productions/q-core 0.1.28 → 0.1.30

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 (496) hide show
  1. package/dist/constants/admin-views.d.ts.map +1 -1
  2. package/dist/constants/admin-views.js +0 -3
  3. package/dist/constants/admin-views.js.map +1 -1
  4. package/dist/constants/business.d.ts.map +1 -1
  5. package/dist/constants/business.js +0 -52
  6. package/dist/constants/business.js.map +1 -1
  7. package/dist/constants/deployment.d.ts +0 -2
  8. package/dist/constants/deployment.d.ts.map +1 -1
  9. package/dist/constants/deployment.js +0 -2
  10. package/dist/constants/deployment.js.map +1 -1
  11. package/dist/constants/media.d.ts.map +1 -1
  12. package/dist/constants/media.js +4 -30
  13. package/dist/constants/media.js.map +1 -1
  14. package/dist/constants/scheduled-jobs.d.ts +0 -25
  15. package/dist/constants/scheduled-jobs.d.ts.map +1 -1
  16. package/dist/constants/scheduled-jobs.js +0 -26
  17. package/dist/constants/scheduled-jobs.js.map +1 -1
  18. package/dist/constants/sports.d.ts +1 -0
  19. package/dist/constants/sports.d.ts.map +1 -1
  20. package/dist/constants/sports.js +4 -25
  21. package/dist/constants/sports.js.map +1 -1
  22. package/dist/constants/storage-keys.d.ts +0 -38
  23. package/dist/constants/storage-keys.d.ts.map +1 -1
  24. package/dist/constants/storage-keys.js +0 -41
  25. package/dist/constants/storage-keys.js.map +1 -1
  26. package/dist/constants/telemetry.d.ts +0 -3
  27. package/dist/constants/telemetry.d.ts.map +1 -1
  28. package/dist/constants/telemetry.js +2 -11
  29. package/dist/constants/telemetry.js.map +1 -1
  30. package/dist/doc-schemas/admin-notifications.d.ts +1 -2
  31. package/dist/doc-schemas/admin-notifications.d.ts.map +1 -1
  32. package/dist/doc-schemas/admin-notifications.js +0 -41
  33. package/dist/doc-schemas/admin-notifications.js.map +1 -1
  34. package/dist/doc-schemas/aggregate-stats.d.ts.map +1 -1
  35. package/dist/doc-schemas/aggregate-stats.js +0 -35
  36. package/dist/doc-schemas/aggregate-stats.js.map +1 -1
  37. package/dist/doc-schemas/atoms.d.ts +0 -17
  38. package/dist/doc-schemas/atoms.d.ts.map +1 -1
  39. package/dist/doc-schemas/atoms.js +0 -36
  40. package/dist/doc-schemas/atoms.js.map +1 -1
  41. package/dist/doc-schemas/audit-event.d.ts +2 -0
  42. package/dist/doc-schemas/audit-event.d.ts.map +1 -1
  43. package/dist/doc-schemas/audit-event.js +0 -8
  44. package/dist/doc-schemas/audit-event.js.map +1 -1
  45. package/dist/doc-schemas/award-group-grant.d.ts +2 -8
  46. package/dist/doc-schemas/award-group-grant.d.ts.map +1 -1
  47. package/dist/doc-schemas/award-group-grant.js +0 -25
  48. package/dist/doc-schemas/award-group-grant.js.map +1 -1
  49. package/dist/doc-schemas/catalogs.d.ts.map +1 -1
  50. package/dist/doc-schemas/catalogs.js +0 -12
  51. package/dist/doc-schemas/catalogs.js.map +1 -1
  52. package/dist/doc-schemas/firestore-primitives.d.ts.map +1 -1
  53. package/dist/doc-schemas/firestore-primitives.js +0 -5
  54. package/dist/doc-schemas/firestore-primitives.js.map +1 -1
  55. package/dist/doc-schemas/gallery.d.ts.map +1 -1
  56. package/dist/doc-schemas/gallery.js +9 -18
  57. package/dist/doc-schemas/gallery.js.map +1 -1
  58. package/dist/doc-schemas/game-location.d.ts.map +1 -1
  59. package/dist/doc-schemas/game-location.js +2 -11
  60. package/dist/doc-schemas/game-location.js.map +1 -1
  61. package/dist/doc-schemas/game-stat-history.d.ts.map +1 -1
  62. package/dist/doc-schemas/game-stat-history.js +2 -11
  63. package/dist/doc-schemas/game-stat-history.js.map +1 -1
  64. package/dist/doc-schemas/game-stats.d.ts.map +1 -1
  65. package/dist/doc-schemas/game-stats.js +0 -56
  66. package/dist/doc-schemas/game-stats.js.map +1 -1
  67. package/dist/doc-schemas/league-team.d.ts.map +1 -1
  68. package/dist/doc-schemas/league-team.js +6 -29
  69. package/dist/doc-schemas/league-team.js.map +1 -1
  70. package/dist/doc-schemas/membership-roster-sync.d.ts.map +1 -1
  71. package/dist/doc-schemas/membership-roster-sync.js +0 -17
  72. package/dist/doc-schemas/membership-roster-sync.js.map +1 -1
  73. package/dist/doc-schemas/migration-console.d.ts +21 -15
  74. package/dist/doc-schemas/migration-console.d.ts.map +1 -1
  75. package/dist/doc-schemas/migration-console.js +0 -32
  76. package/dist/doc-schemas/migration-console.js.map +1 -1
  77. package/dist/doc-schemas/pending-media.d.ts.map +1 -1
  78. package/dist/doc-schemas/pending-media.js +8 -20
  79. package/dist/doc-schemas/pending-media.js.map +1 -1
  80. package/dist/doc-schemas/picture-retirement.d.ts.map +1 -1
  81. package/dist/doc-schemas/picture-retirement.js +8 -13
  82. package/dist/doc-schemas/picture-retirement.js.map +1 -1
  83. package/dist/doc-schemas/publicUser.d.ts.map +1 -1
  84. package/dist/doc-schemas/publicUser.js +0 -5
  85. package/dist/doc-schemas/publicUser.js.map +1 -1
  86. package/dist/doc-schemas/registration-start.d.ts.map +1 -1
  87. package/dist/doc-schemas/registration-start.js +2 -5
  88. package/dist/doc-schemas/registration-start.js.map +1 -1
  89. package/dist/doc-schemas/registry.d.ts +25 -14
  90. package/dist/doc-schemas/registry.d.ts.map +1 -1
  91. package/dist/doc-schemas/registry.js +0 -10
  92. package/dist/doc-schemas/registry.js.map +1 -1
  93. package/dist/doc-schemas/reserved-display-name.d.ts.map +1 -1
  94. package/dist/doc-schemas/reserved-display-name.js +0 -5
  95. package/dist/doc-schemas/reserved-display-name.js.map +1 -1
  96. package/dist/doc-schemas/sport-game.d.ts.map +1 -1
  97. package/dist/doc-schemas/sport-game.js +1 -29
  98. package/dist/doc-schemas/sport-game.js.map +1 -1
  99. package/dist/doc-schemas/sport-league.d.ts +0 -9
  100. package/dist/doc-schemas/sport-league.d.ts.map +1 -1
  101. package/dist/doc-schemas/sport-league.js +4 -26
  102. package/dist/doc-schemas/sport-league.js.map +1 -1
  103. package/dist/doc-schemas/stats-operation.d.ts +22 -18
  104. package/dist/doc-schemas/stats-operation.d.ts.map +1 -1
  105. package/dist/doc-schemas/stats-operation.js +7 -44
  106. package/dist/doc-schemas/stats-operation.js.map +1 -1
  107. package/dist/doc-schemas/status-reconcile-queue.d.ts +0 -6
  108. package/dist/doc-schemas/status-reconcile-queue.d.ts.map +1 -1
  109. package/dist/doc-schemas/status-reconcile-queue.js +0 -13
  110. package/dist/doc-schemas/status-reconcile-queue.js.map +1 -1
  111. package/dist/doc-schemas/sweep-state.d.ts.map +1 -1
  112. package/dist/doc-schemas/sweep-state.js +4 -20
  113. package/dist/doc-schemas/sweep-state.js.map +1 -1
  114. package/dist/doc-schemas/system.d.ts.map +1 -1
  115. package/dist/doc-schemas/system.js +1 -27
  116. package/dist/doc-schemas/system.js.map +1 -1
  117. package/dist/doc-schemas/team-membership.d.ts.map +1 -1
  118. package/dist/doc-schemas/team-membership.js +0 -10
  119. package/dist/doc-schemas/team-membership.js.map +1 -1
  120. package/dist/doc-schemas/user-profile.d.ts +0 -1
  121. package/dist/doc-schemas/user-profile.d.ts.map +1 -1
  122. package/dist/doc-schemas/user-profile.js +0 -28
  123. package/dist/doc-schemas/user-profile.js.map +1 -1
  124. package/dist/doc-schemas/waiver-template.d.ts.map +1 -1
  125. package/dist/doc-schemas/waiver-template.js +4 -25
  126. package/dist/doc-schemas/waiver-template.js.map +1 -1
  127. package/dist/doc-schemas/waivers-and-hardware.d.ts.map +1 -1
  128. package/dist/doc-schemas/waivers-and-hardware.js +0 -20
  129. package/dist/doc-schemas/waivers-and-hardware.js.map +1 -1
  130. package/dist/domain-events/domain-events.d.ts.map +1 -1
  131. package/dist/domain-events/domain-events.js +0 -67
  132. package/dist/domain-events/domain-events.js.map +1 -1
  133. package/dist/ids/award-grant-ids.d.ts.map +1 -1
  134. package/dist/ids/award-grant-ids.js +0 -7
  135. package/dist/ids/award-grant-ids.js.map +1 -1
  136. package/dist/ids/compound-ids.d.ts.map +1 -1
  137. package/dist/ids/compound-ids.js +0 -7
  138. package/dist/ids/compound-ids.js.map +1 -1
  139. package/dist/ids/minted-ids.d.ts.map +1 -1
  140. package/dist/ids/minted-ids.js +4 -14
  141. package/dist/ids/minted-ids.js.map +1 -1
  142. package/dist/ids/notification-ids.d.ts.map +1 -1
  143. package/dist/ids/notification-ids.js +0 -15
  144. package/dist/ids/notification-ids.js.map +1 -1
  145. package/dist/ids/picture-ids.d.ts +0 -5
  146. package/dist/ids/picture-ids.d.ts.map +1 -1
  147. package/dist/ids/picture-ids.js +0 -11
  148. package/dist/ids/picture-ids.js.map +1 -1
  149. package/dist/ids/stat-event-ids.d.ts +0 -6
  150. package/dist/ids/stat-event-ids.d.ts.map +1 -1
  151. package/dist/ids/stat-event-ids.js +0 -15
  152. package/dist/ids/stat-event-ids.js.map +1 -1
  153. package/dist/ids/stats-operation-ids.d.ts.map +1 -1
  154. package/dist/ids/stats-operation-ids.js +0 -7
  155. package/dist/ids/stats-operation-ids.js.map +1 -1
  156. package/dist/ids/waiver-template-ids.d.ts +0 -1
  157. package/dist/ids/waiver-template-ids.d.ts.map +1 -1
  158. package/dist/ids/waiver-template-ids.js +0 -2
  159. package/dist/ids/waiver-template-ids.js.map +1 -1
  160. package/dist/index.d.ts +2 -0
  161. package/dist/index.d.ts.map +1 -1
  162. package/dist/index.js +2 -2
  163. package/dist/index.js.map +1 -1
  164. package/dist/input-formats/input-formats.d.ts +0 -80
  165. package/dist/input-formats/input-formats.d.ts.map +1 -1
  166. package/dist/input-formats/input-formats.js +0 -86
  167. package/dist/input-formats/input-formats.js.map +1 -1
  168. package/dist/media/file-origins.d.ts +0 -3
  169. package/dist/media/file-origins.d.ts.map +1 -1
  170. package/dist/media/file-origins.js +0 -26
  171. package/dist/media/file-origins.js.map +1 -1
  172. package/dist/media/picture-aspects.d.ts +0 -2
  173. package/dist/media/picture-aspects.d.ts.map +1 -1
  174. package/dist/media/picture-aspects.js +0 -5
  175. package/dist/media/picture-aspects.js.map +1 -1
  176. package/dist/media/picture-url.d.ts +0 -6
  177. package/dist/media/picture-url.d.ts.map +1 -1
  178. package/dist/media/picture-url.js +0 -9
  179. package/dist/media/picture-url.js.map +1 -1
  180. package/dist/media/upload-tray-display.d.ts +0 -3
  181. package/dist/media/upload-tray-display.d.ts.map +1 -1
  182. package/dist/media/upload-tray-display.js +0 -6
  183. package/dist/media/upload-tray-display.js.map +1 -1
  184. package/dist/migration-console/action-ids.d.ts +4 -1
  185. package/dist/migration-console/action-ids.d.ts.map +1 -1
  186. package/dist/migration-console/action-ids.js +8 -45
  187. package/dist/migration-console/action-ids.js.map +1 -1
  188. package/dist/migration-console/console-lock.d.ts +10 -0
  189. package/dist/migration-console/console-lock.d.ts.map +1 -0
  190. package/dist/migration-console/console-lock.js +14 -0
  191. package/dist/migration-console/console-lock.js.map +1 -0
  192. package/dist/migration-console/consumed-source.d.ts +4 -0
  193. package/dist/migration-console/consumed-source.d.ts.map +1 -0
  194. package/dist/migration-console/consumed-source.js +10 -0
  195. package/dist/migration-console/consumed-source.js.map +1 -0
  196. package/dist/migration-console/manifest.d.ts +2 -24
  197. package/dist/migration-console/manifest.d.ts.map +1 -1
  198. package/dist/migration-console/manifest.js +174 -61
  199. package/dist/migration-console/manifest.js.map +1 -1
  200. package/dist/migration-console/run-state.d.ts +2 -14
  201. package/dist/migration-console/run-state.d.ts.map +1 -1
  202. package/dist/migration-console/run-state.js +3 -16
  203. package/dist/migration-console/run-state.js.map +1 -1
  204. package/dist/notifications/admin-notification-config.d.ts +0 -11
  205. package/dist/notifications/admin-notification-config.d.ts.map +1 -1
  206. package/dist/notifications/admin-notification-config.js +2 -13
  207. package/dist/notifications/admin-notification-config.js.map +1 -1
  208. package/dist/notifications/archive-all.d.ts.map +1 -1
  209. package/dist/notifications/archive-all.js +0 -2
  210. package/dist/notifications/archive-all.js.map +1 -1
  211. package/dist/notifications/occurrences.d.ts +0 -3
  212. package/dist/notifications/occurrences.d.ts.map +1 -1
  213. package/dist/notifications/occurrences.js +0 -7
  214. package/dist/notifications/occurrences.js.map +1 -1
  215. package/dist/paths/app-routes.d.ts +0 -12
  216. package/dist/paths/app-routes.d.ts.map +1 -1
  217. package/dist/paths/app-routes.js +0 -18
  218. package/dist/paths/app-routes.js.map +1 -1
  219. package/dist/paths/collection-groups.d.ts.map +1 -1
  220. package/dist/paths/collection-groups.js +0 -5
  221. package/dist/paths/collection-groups.js.map +1 -1
  222. package/dist/paths/collection-refs.d.ts.map +1 -1
  223. package/dist/paths/collection-refs.js +0 -4
  224. package/dist/paths/collection-refs.js.map +1 -1
  225. package/dist/paths/collections.d.ts +0 -5
  226. package/dist/paths/collections.d.ts.map +1 -1
  227. package/dist/paths/collections.js +0 -68
  228. package/dist/paths/collections.js.map +1 -1
  229. package/dist/paths/path-builders.d.ts.map +1 -1
  230. package/dist/paths/path-builders.js +0 -16
  231. package/dist/paths/path-builders.js.map +1 -1
  232. package/dist/paths/picture-owner-paths.d.ts +0 -4
  233. package/dist/paths/picture-owner-paths.d.ts.map +1 -1
  234. package/dist/paths/picture-owner-paths.js +2 -11
  235. package/dist/paths/picture-owner-paths.js.map +1 -1
  236. package/dist/paths/storage-paths.d.ts +0 -18
  237. package/dist/paths/storage-paths.d.ts.map +1 -1
  238. package/dist/paths/storage-paths.js +0 -23
  239. package/dist/paths/storage-paths.js.map +1 -1
  240. package/dist/paths/utils.d.ts +0 -6
  241. package/dist/paths/utils.d.ts.map +1 -1
  242. package/dist/paths/utils.js +0 -9
  243. package/dist/paths/utils.js.map +1 -1
  244. package/dist/schemas/account-settings.d.ts.map +1 -1
  245. package/dist/schemas/account-settings.js +0 -7
  246. package/dist/schemas/account-settings.js.map +1 -1
  247. package/dist/schemas/admin-notifications.d.ts.map +1 -1
  248. package/dist/schemas/admin-notifications.js +0 -17
  249. package/dist/schemas/admin-notifications.js.map +1 -1
  250. package/dist/schemas/admin-stats.d.ts.map +1 -1
  251. package/dist/schemas/admin-stats.js +0 -9
  252. package/dist/schemas/admin-stats.js.map +1 -1
  253. package/dist/schemas/app-config.d.ts.map +1 -1
  254. package/dist/schemas/app-config.js +0 -10
  255. package/dist/schemas/app-config.js.map +1 -1
  256. package/dist/schemas/atoms.d.ts.map +1 -1
  257. package/dist/schemas/atoms.js +0 -10
  258. package/dist/schemas/atoms.js.map +1 -1
  259. package/dist/schemas/awards.d.ts +3 -3
  260. package/dist/schemas/awards.d.ts.map +1 -1
  261. package/dist/schemas/awards.js +0 -29
  262. package/dist/schemas/awards.js.map +1 -1
  263. package/dist/schemas/dead-letters.d.ts +0 -3
  264. package/dist/schemas/dead-letters.d.ts.map +1 -1
  265. package/dist/schemas/dead-letters.js +0 -15
  266. package/dist/schemas/dead-letters.js.map +1 -1
  267. package/dist/schemas/game-locations.d.ts.map +1 -1
  268. package/dist/schemas/game-locations.js +0 -6
  269. package/dist/schemas/game-locations.js.map +1 -1
  270. package/dist/schemas/hardware-loan-contracts.d.ts.map +1 -1
  271. package/dist/schemas/hardware-loan-contracts.js +0 -13
  272. package/dist/schemas/hardware-loan-contracts.js.map +1 -1
  273. package/dist/schemas/index.d.ts.map +1 -1
  274. package/dist/schemas/index.js +0 -2
  275. package/dist/schemas/index.js.map +1 -1
  276. package/dist/schemas/leagues.d.ts.map +1 -1
  277. package/dist/schemas/leagues.js +0 -24
  278. package/dist/schemas/leagues.js.map +1 -1
  279. package/dist/schemas/migration-console.d.ts +58 -15
  280. package/dist/schemas/migration-console.d.ts.map +1 -1
  281. package/dist/schemas/migration-console.js +4 -34
  282. package/dist/schemas/migration-console.js.map +1 -1
  283. package/dist/schemas/pictures.d.ts.map +1 -1
  284. package/dist/schemas/pictures.js +0 -10
  285. package/dist/schemas/pictures.js.map +1 -1
  286. package/dist/schemas/schedules.d.ts.map +1 -1
  287. package/dist/schemas/schedules.js +0 -26
  288. package/dist/schemas/schedules.js.map +1 -1
  289. package/dist/schemas/scoring.d.ts +20 -26
  290. package/dist/schemas/scoring.d.ts.map +1 -1
  291. package/dist/schemas/scoring.js +0 -33
  292. package/dist/schemas/scoring.js.map +1 -1
  293. package/dist/schemas/signed-waivers.d.ts.map +1 -1
  294. package/dist/schemas/signed-waivers.js +0 -22
  295. package/dist/schemas/signed-waivers.js.map +1 -1
  296. package/dist/schemas/stats.d.ts +12 -0
  297. package/dist/schemas/stats.d.ts.map +1 -1
  298. package/dist/schemas/stats.js +21 -61
  299. package/dist/schemas/stats.js.map +1 -1
  300. package/dist/schemas/team-joining.d.ts.map +1 -1
  301. package/dist/schemas/team-joining.js +0 -30
  302. package/dist/schemas/team-joining.js.map +1 -1
  303. package/dist/schemas/teams.d.ts +0 -1
  304. package/dist/schemas/teams.d.ts.map +1 -1
  305. package/dist/schemas/teams.js +0 -83
  306. package/dist/schemas/teams.js.map +1 -1
  307. package/dist/schemas/uploads.d.ts +0 -8
  308. package/dist/schemas/uploads.d.ts.map +1 -1
  309. package/dist/schemas/uploads.js +0 -29
  310. package/dist/schemas/uploads.js.map +1 -1
  311. package/dist/schemas/users.d.ts +0 -1
  312. package/dist/schemas/users.d.ts.map +1 -1
  313. package/dist/schemas/users.js +0 -41
  314. package/dist/schemas/users.js.map +1 -1
  315. package/dist/schemas/waiver-templates.d.ts.map +1 -1
  316. package/dist/schemas/waiver-templates.js +0 -7
  317. package/dist/schemas/waiver-templates.js.map +1 -1
  318. package/dist/sports/basketball-scoring.d.ts +0 -4
  319. package/dist/sports/basketball-scoring.d.ts.map +1 -1
  320. package/dist/sports/basketball-scoring.js +0 -34
  321. package/dist/sports/basketball-scoring.js.map +1 -1
  322. package/dist/sports/basketball.d.ts.map +1 -1
  323. package/dist/sports/basketball.js +0 -5
  324. package/dist/sports/basketball.js.map +1 -1
  325. package/dist/sports/bulk-entry.d.ts +0 -22
  326. package/dist/sports/bulk-entry.d.ts.map +1 -1
  327. package/dist/sports/bulk-entry.js +0 -10
  328. package/dist/sports/bulk-entry.js.map +1 -1
  329. package/dist/sports/column-catalog.d.ts +0 -17
  330. package/dist/sports/column-catalog.d.ts.map +1 -1
  331. package/dist/sports/column-catalog.js +0 -10
  332. package/dist/sports/column-catalog.js.map +1 -1
  333. package/dist/sports/contribution.d.ts +2 -59
  334. package/dist/sports/contribution.d.ts.map +1 -1
  335. package/dist/sports/contribution.js +2 -45
  336. package/dist/sports/contribution.js.map +1 -1
  337. package/dist/sports/curling-scoring.d.ts +0 -1
  338. package/dist/sports/curling-scoring.d.ts.map +1 -1
  339. package/dist/sports/curling-scoring.js +0 -27
  340. package/dist/sports/curling-scoring.js.map +1 -1
  341. package/dist/sports/curling.d.ts.map +1 -1
  342. package/dist/sports/curling.js +0 -4
  343. package/dist/sports/curling.js.map +1 -1
  344. package/dist/sports/finalized-record.d.ts +2 -19
  345. package/dist/sports/finalized-record.d.ts.map +1 -1
  346. package/dist/sports/finalized-record.js +21 -22
  347. package/dist/sports/finalized-record.js.map +1 -1
  348. package/dist/sports/football-scoring.d.ts.map +1 -1
  349. package/dist/sports/football-scoring.js +0 -21
  350. package/dist/sports/football-scoring.js.map +1 -1
  351. package/dist/sports/football.d.ts.map +1 -1
  352. package/dist/sports/football.js +0 -4
  353. package/dist/sports/football.js.map +1 -1
  354. package/dist/sports/index.d.ts.map +1 -1
  355. package/dist/sports/index.js +0 -2
  356. package/dist/sports/index.js.map +1 -1
  357. package/dist/sports/ledger-continuity.d.ts +0 -2
  358. package/dist/sports/ledger-continuity.d.ts.map +1 -1
  359. package/dist/sports/ledger-continuity.js +0 -5
  360. package/dist/sports/ledger-continuity.js.map +1 -1
  361. package/dist/sports/lifetime-summary.d.ts +0 -6
  362. package/dist/sports/lifetime-summary.d.ts.map +1 -1
  363. package/dist/sports/lifetime-summary.js +0 -7
  364. package/dist/sports/lifetime-summary.js.map +1 -1
  365. package/dist/sports/rankings.d.ts +0 -12
  366. package/dist/sports/rankings.d.ts.map +1 -1
  367. package/dist/sports/rankings.js +0 -15
  368. package/dist/sports/rankings.js.map +1 -1
  369. package/dist/sports/registry.d.ts +0 -10
  370. package/dist/sports/registry.d.ts.map +1 -1
  371. package/dist/sports/registry.js +0 -9
  372. package/dist/sports/registry.js.map +1 -1
  373. package/dist/sports/replay.d.ts +0 -11
  374. package/dist/sports/replay.d.ts.map +1 -1
  375. package/dist/sports/replay.js +0 -16
  376. package/dist/sports/replay.js.map +1 -1
  377. package/dist/sports/rollup-check.d.ts +0 -7
  378. package/dist/sports/rollup-check.d.ts.map +1 -1
  379. package/dist/sports/rollup-check.js +0 -14
  380. package/dist/sports/rollup-check.js.map +1 -1
  381. package/dist/sports/score-mirror.d.ts +0 -1
  382. package/dist/sports/score-mirror.d.ts.map +1 -1
  383. package/dist/sports/score-mirror.js +0 -4
  384. package/dist/sports/score-mirror.js.map +1 -1
  385. package/dist/sports/scoring-display.d.ts +0 -30
  386. package/dist/sports/scoring-display.d.ts.map +1 -1
  387. package/dist/sports/scoring-display.js +0 -9
  388. package/dist/sports/scoring-display.js.map +1 -1
  389. package/dist/sports/scoring.d.ts +0 -36
  390. package/dist/sports/scoring.d.ts.map +1 -1
  391. package/dist/sports/scoring.js +0 -10
  392. package/dist/sports/scoring.js.map +1 -1
  393. package/dist/sports/shared-columns.d.ts +0 -1
  394. package/dist/sports/shared-columns.d.ts.map +1 -1
  395. package/dist/sports/shared-columns.js +0 -7
  396. package/dist/sports/shared-columns.js.map +1 -1
  397. package/dist/sports/sport-adapter.d.ts +0 -32
  398. package/dist/sports/sport-adapter.d.ts.map +1 -1
  399. package/dist/sports/sport-adapter.js +0 -7
  400. package/dist/sports/sport-adapter.js.map +1 -1
  401. package/dist/sports/store-driver.d.ts +0 -28
  402. package/dist/sports/store-driver.d.ts.map +1 -1
  403. package/dist/sports/store-driver.js +0 -38
  404. package/dist/sports/store-driver.js.map +1 -1
  405. package/dist/types/audit.d.ts +1 -1
  406. package/dist/types/audit.d.ts.map +1 -1
  407. package/dist/types/audit.js +1 -67
  408. package/dist/types/audit.js.map +1 -1
  409. package/dist/types/claims.d.ts +0 -10
  410. package/dist/types/claims.d.ts.map +1 -1
  411. package/dist/types/claims.js +0 -16
  412. package/dist/types/claims.js.map +1 -1
  413. package/dist/types/notifications.d.ts.map +1 -1
  414. package/dist/types/notifications.js +7 -25
  415. package/dist/types/notifications.js.map +1 -1
  416. package/dist/types/picture-owners.d.ts +0 -1
  417. package/dist/types/picture-owners.d.ts.map +1 -1
  418. package/dist/types/picture-owners.js +0 -6
  419. package/dist/types/picture-owners.js.map +1 -1
  420. package/dist/types/schedules.d.ts.map +1 -1
  421. package/dist/types/schedules.js +0 -9
  422. package/dist/types/schedules.js.map +1 -1
  423. package/dist/types/sports.d.ts.map +1 -1
  424. package/dist/types/sports.js +0 -24
  425. package/dist/types/sports.js.map +1 -1
  426. package/dist/types/stats.d.ts.map +1 -1
  427. package/dist/types/stats.js +0 -65
  428. package/dist/types/stats.js.map +1 -1
  429. package/dist/types/unions.d.ts +0 -2
  430. package/dist/types/unions.d.ts.map +1 -1
  431. package/dist/types/unions.js +3 -91
  432. package/dist/types/unions.js.map +1 -1
  433. package/dist/types/uploads.d.ts.map +1 -1
  434. package/dist/types/uploads.js +0 -7
  435. package/dist/types/uploads.js.map +1 -1
  436. package/dist/upload-variables/on-progress.d.ts.map +1 -1
  437. package/dist/upload-variables/on-progress.js +2 -5
  438. package/dist/upload-variables/on-progress.js.map +1 -1
  439. package/dist/upload-variables/picture-upload-variables.d.ts +0 -1
  440. package/dist/upload-variables/picture-upload-variables.d.ts.map +1 -1
  441. package/dist/upload-variables/picture-upload-variables.js +0 -4
  442. package/dist/upload-variables/picture-upload-variables.js.map +1 -1
  443. package/dist/upload-variables/sign-hardware-contract-variables.d.ts.map +1 -1
  444. package/dist/upload-variables/sign-hardware-contract-variables.js +0 -2
  445. package/dist/upload-variables/sign-hardware-contract-variables.js.map +1 -1
  446. package/dist/upload-variables/sign-waiver-variables.d.ts.map +1 -1
  447. package/dist/upload-variables/sign-waiver-variables.js +0 -4
  448. package/dist/upload-variables/sign-waiver-variables.js.map +1 -1
  449. package/dist/utils/account-status.d.ts.map +1 -1
  450. package/dist/utils/account-status.js +0 -4
  451. package/dist/utils/account-status.js.map +1 -1
  452. package/dist/utils/app-config.d.ts +0 -53
  453. package/dist/utils/app-config.d.ts.map +1 -1
  454. package/dist/utils/app-config.js +0 -62
  455. package/dist/utils/app-config.js.map +1 -1
  456. package/dist/utils/display-name.d.ts +0 -7
  457. package/dist/utils/display-name.d.ts.map +1 -1
  458. package/dist/utils/display-name.js +0 -8
  459. package/dist/utils/display-name.js.map +1 -1
  460. package/dist/utils/index.d.ts +1 -0
  461. package/dist/utils/index.d.ts.map +1 -1
  462. package/dist/utils/index.js +1 -0
  463. package/dist/utils/index.js.map +1 -1
  464. package/dist/utils/league-calendar.d.ts +0 -11
  465. package/dist/utils/league-calendar.d.ts.map +1 -1
  466. package/dist/utils/league-calendar.js +7 -19
  467. package/dist/utils/league-calendar.js.map +1 -1
  468. package/dist/utils/league-join-warning.d.ts +0 -11
  469. package/dist/utils/league-join-warning.d.ts.map +1 -1
  470. package/dist/utils/league-join-warning.js +0 -28
  471. package/dist/utils/league-join-warning.js.map +1 -1
  472. package/dist/utils/league-joining.d.ts +0 -1
  473. package/dist/utils/league-joining.d.ts.map +1 -1
  474. package/dist/utils/league-joining.js +0 -7
  475. package/dist/utils/league-joining.js.map +1 -1
  476. package/dist/utils/league-mode.d.ts +0 -1
  477. package/dist/utils/league-mode.d.ts.map +1 -1
  478. package/dist/utils/league-mode.js +0 -4
  479. package/dist/utils/league-mode.js.map +1 -1
  480. package/dist/utils/schedules.d.ts +0 -15
  481. package/dist/utils/schedules.d.ts.map +1 -1
  482. package/dist/utils/schedules.js +0 -19
  483. package/dist/utils/schedules.js.map +1 -1
  484. package/dist/utils/stats-operation-request.d.ts +20 -0
  485. package/dist/utils/stats-operation-request.d.ts.map +1 -0
  486. package/dist/utils/stats-operation-request.js +10 -0
  487. package/dist/utils/stats-operation-request.js.map +1 -0
  488. package/dist/utils/team-creation.d.ts +0 -2
  489. package/dist/utils/team-creation.d.ts.map +1 -1
  490. package/dist/utils/team-creation.js +0 -6
  491. package/dist/utils/team-creation.js.map +1 -1
  492. package/dist/utils/team-member-actions.d.ts +0 -6
  493. package/dist/utils/team-member-actions.d.ts.map +1 -1
  494. package/dist/utils/team-member-actions.js +0 -12
  495. package/dist/utils/team-member-actions.js.map +1 -1
  496. package/package.json +2 -1
@@ -1,45 +1,27 @@
1
- // Callable contracts for user accounts and the global role rosters.
2
1
  import { z } from 'zod';
3
2
  import { MAX_ADMIN_LIST_CHANGES } from '../constants/business.js';
4
3
  import { countSchema, repairReasonSchema, userIdSchema, userStatusSchema, } from '../doc-schemas/atoms.js';
5
4
  import { displayNameSchema } from './atoms.js';
6
- // The signed-in caller finishes registration: profile, public identity, and the display-name
7
- // reservation are created for `request.auth.uid`. Email comes from the token, never the payload.
8
5
  export const RegisterUserInputSchema = z
9
6
  .object({
10
7
  displayName: displayNameSchema,
11
- // The terms checkbox, re-checked server-side: only `true` registers.
12
8
  acceptedTerms: z.literal(true),
13
9
  })
14
10
  .strict();
15
11
  export const RegisterUserResultSchema = z.discriminatedUnion('status', [
16
- // The account is registered (or already was — an idempotent replay).
17
12
  z
18
13
  .object({ status: z.literal('registered'), userId: userIdSchema, displayName: z.string() })
19
14
  .strict(),
20
- // The orphan-registration cleanup claimed this login for deletion, so the registration cannot
21
- // finish on it; nothing is written and the person signs up again.
22
15
  z.object({ status: z.literal('registrationExpired') }).strict(),
23
16
  ]);
24
- // The register form's check before the login is created: is the name free? It runs before any
25
- // account exists, over the same name rule `registerUser` takes, and is a soft answer — the claim
26
- // itself is `registerUser`'s transaction, which refuses `already-exists` when two registrations
27
- // pass this check at once.
28
17
  export const CheckDisplayNameAvailableInputSchema = z
29
18
  .object({ displayName: displayNameSchema })
30
19
  .strict();
31
- // Why a name is not available. Uniqueness is the only rule a Q-Sports name is held to beyond its
32
- // input format.
33
20
  export const DISPLAY_NAME_UNAVAILABLE_REASONS = ['taken'];
34
21
  export const CheckDisplayNameAvailableResultSchema = z
35
22
  .object({ available: z.boolean(), reason: z.enum(DISPLAY_NAME_UNAVAILABLE_REASONS).optional() })
36
23
  .strict();
37
- /** The longest text an admin's account search takes: a name, a full email address, or a uid. */
38
24
  export const MAX_USER_SEARCH_QUERY_LENGTH = 100;
39
- // Which read an admin's account search routes to: a full email address or a 28-character Firebase
40
- // Auth uid is an exact lookup (`lookupUserByEmailOrUid`), anything else a name search. Declared once:
41
- // the search box routes by it and the lookup callable re-derives the same answer, so a mis-routed
42
- // request never looks an email up as a uid or the other way round.
43
25
  export const USER_LOOKUP_EMAIL_PATTERN = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
44
26
  export const USER_LOOKUP_UID_PATTERN = /^[A-Za-z0-9]{28}$/;
45
27
  export function detectUserSearchKind(query) {
@@ -50,8 +32,6 @@ export function detectUserSearchKind(query) {
50
32
  return 'uid';
51
33
  return 'name';
52
34
  }
53
- // An admin finds one account by its exact email address or its uid. The answer carries the
54
- // owner-only email, so it is admin only.
55
35
  export const LookupUserByEmailOrUidInputSchema = z
56
36
  .object({ query: z.string().trim().min(1).max(MAX_USER_SEARCH_QUERY_LENGTH) })
57
37
  .strict();
@@ -61,16 +41,12 @@ export const LookedUpUserSchema = z
61
41
  displayName: z.string(),
62
42
  email: z.string(),
63
43
  userStatus: userStatusSchema,
64
- // Present, and true, only for an account on the admin roster.
65
44
  isAdmin: z.literal(true).optional(),
66
45
  })
67
46
  .strict();
68
- // The one exact match, or `null` when no account with a profile resolves.
69
47
  export const LookupUserByEmailOrUidResultSchema = z
70
48
  .object({ user: LookedUpUserSchema.nullable() })
71
49
  .strict();
72
- // An admin searches accounts by the start of their name, over public display identity. Ghosts are
73
- // not accounts and are left out; a banned account is found, with its status.
74
50
  export const SearchPublicUsersInputSchema = z
75
51
  .object({ query: z.string().trim().min(1).max(MAX_USER_SEARCH_QUERY_LENGTH) })
76
52
  .strict();
@@ -80,15 +56,12 @@ export const PublicUserSearchResultSchema = z
80
56
  export const SearchPublicUsersResultSchema = z
81
57
  .object({ users: z.array(PublicUserSearchResultSchema) })
82
58
  .strict();
83
- // An admin renames a user. Self-service rename is not a Q-Sports feature.
84
59
  export const UpdateDisplayNameInputSchema = z
85
60
  .object({ userId: userIdSchema, newDisplayName: displayNameSchema })
86
61
  .strict();
87
62
  export const UpdateDisplayNameResultSchema = z
88
63
  .object({ userId: userIdSchema, displayName: z.string() })
89
64
  .strict();
90
- // An admin grants or revokes the two global roles on `_systemData/adminList`. Four named lists —
91
- // never a role/action discriminator (RULE-STD-BACKEND-002).
92
65
  const adminListChangeSchema = z.array(userIdSchema).max(MAX_ADMIN_LIST_CHANGES).optional();
93
66
  export const UpdateAdminListInputSchema = z
94
67
  .object({
@@ -106,16 +79,10 @@ export const UpdateAdminListResultSchema = z
106
79
  refereesRevoked: countSchema,
107
80
  })
108
81
  .strict();
109
- // The one sentence `updateAdminList` refuses an admin's revoke of their own admin role with, and the
110
- // role screen shows on the control it withholds.
111
82
  export const ADMIN_SELF_REVOKE_REFUSAL = "You can't revoke your own admin standing. Ask another admin to do it.";
112
- // An admin bans an account or lifts its ban. The reason is internal — recorded on the audit event,
113
- // never shown to the account (RULE-STD-BACKEND-212). Banning or unbanning to the status the account already
114
- // holds changes nothing.
115
83
  export const AdminUpdateUserStatusInputSchema = z
116
84
  .object({ userId: userIdSchema, userStatus: userStatusSchema, reason: repairReasonSchema })
117
85
  .strict();
118
- // `changed` is whether the status moved.
119
86
  export const AdminUpdateUserStatusResultSchema = z
120
87
  .object({
121
88
  userId: userIdSchema,
@@ -124,16 +91,8 @@ export const AdminUpdateUserStatusResultSchema = z
124
91
  changed: z.boolean(),
125
92
  })
126
93
  .strict();
127
- // The `details.reason` of the refusal to ban an account that holds admin standing (RULE-STD-BACKEND-210), so
128
- // a client can tell it from every other refusal.
129
94
  export const ADMIN_STANDING_BAN_REFUSAL_REASON = 'adminStandingTarget';
130
- // A signed-in login with no profile starts its registration, before `registerUser`: the record the
131
- // orphan-login cleanup finds it by, and the owner-only private record `registerUser` requires. The
132
- // caller is `request.auth.uid` and the email comes from its token, so it takes no input.
133
95
  export const CreateRegistrationStartInputSchema = z.object({}).strict();
134
- // `started` wrote both records; `alreadyStarted` found the registration already started and wrote
135
- // nothing — a retry, or a resume after a later step failed; `registrationExpired` found the login
136
- // claimed by the orphan-registration cleanup and wrote nothing — the person signs up again.
137
96
  export const REGISTRATION_START_OUTCOMES = [
138
97
  'started',
139
98
  'alreadyStarted',
@@ -1 +1 @@
1
- {"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/schemas/users.ts"],"names":[],"mappings":"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","sourcesContent":["// Callable contracts for user accounts and the global role rosters.\n\nimport { z } from 'zod';\nimport { MAX_ADMIN_LIST_CHANGES } from '../constants/business.js';\nimport {\n countSchema,\n repairReasonSchema,\n userIdSchema,\n userStatusSchema,\n} from '../doc-schemas/atoms.js';\nimport { displayNameSchema } from './atoms.js';\n\n// The signed-in caller finishes registration: profile, public identity, and the display-name\n// reservation are created for `request.auth.uid`. Email comes from the token, never the payload.\nexport const RegisterUserInputSchema = z\n .object({\n displayName: displayNameSchema,\n // The terms checkbox, re-checked server-side: only `true` registers.\n acceptedTerms: z.literal(true),\n })\n .strict();\nexport type RegisterUserInput = z.infer<typeof RegisterUserInputSchema>;\nexport const RegisterUserResultSchema = z.discriminatedUnion('status', [\n // The account is registered (or already was — an idempotent replay).\n z\n .object({ status: z.literal('registered'), userId: userIdSchema, displayName: z.string() })\n .strict(),\n // The orphan-registration cleanup claimed this login for deletion, so the registration cannot\n // finish on it; nothing is written and the person signs up again.\n z.object({ status: z.literal('registrationExpired') }).strict(),\n]);\nexport type RegisterUserResult = z.infer<typeof RegisterUserResultSchema>;\n\n// The register form's check before the login is created: is the name free? It runs before any\n// account exists, over the same name rule `registerUser` takes, and is a soft answer — the claim\n// itself is `registerUser`'s transaction, which refuses `already-exists` when two registrations\n// pass this check at once.\nexport const CheckDisplayNameAvailableInputSchema = z\n .object({ displayName: displayNameSchema })\n .strict();\nexport type CheckDisplayNameAvailableInput = z.infer<typeof CheckDisplayNameAvailableInputSchema>;\n// Why a name is not available. Uniqueness is the only rule a Q-Sports name is held to beyond its\n// input format.\nexport const DISPLAY_NAME_UNAVAILABLE_REASONS = ['taken'] as const;\nexport type DisplayNameUnavailableReason = (typeof DISPLAY_NAME_UNAVAILABLE_REASONS)[number];\nexport const CheckDisplayNameAvailableResultSchema = z\n .object({ available: z.boolean(), reason: z.enum(DISPLAY_NAME_UNAVAILABLE_REASONS).optional() })\n .strict();\nexport type CheckDisplayNameAvailableResult = z.infer<typeof CheckDisplayNameAvailableResultSchema>;\n\n/** The longest text an admin's account search takes: a name, a full email address, or a uid. */\nexport const MAX_USER_SEARCH_QUERY_LENGTH = 100;\n\n// Which read an admin's account search routes to: a full email address or a 28-character Firebase\n// Auth uid is an exact lookup (`lookupUserByEmailOrUid`), anything else a name search. Declared once:\n// the search box routes by it and the lookup callable re-derives the same answer, so a mis-routed\n// request never looks an email up as a uid or the other way round.\nexport const USER_LOOKUP_EMAIL_PATTERN = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nexport const USER_LOOKUP_UID_PATTERN = /^[A-Za-z0-9]{28}$/;\nexport type UserSearchKind = 'email' | 'uid' | 'name';\nexport function detectUserSearchKind(query: string): UserSearchKind {\n const trimmed = query.trim();\n if (USER_LOOKUP_EMAIL_PATTERN.test(trimmed)) return 'email';\n if (USER_LOOKUP_UID_PATTERN.test(trimmed)) return 'uid';\n return 'name';\n}\n\n// An admin finds one account by its exact email address or its uid. The answer carries the\n// owner-only email, so it is admin only.\nexport const LookupUserByEmailOrUidInputSchema = z\n .object({ query: z.string().trim().min(1).max(MAX_USER_SEARCH_QUERY_LENGTH) })\n .strict();\nexport type LookupUserByEmailOrUidInput = z.infer<typeof LookupUserByEmailOrUidInputSchema>;\nexport const LookedUpUserSchema = z\n .object({\n uid: userIdSchema,\n displayName: z.string(),\n email: z.string(),\n userStatus: userStatusSchema,\n // Present, and true, only for an account on the admin roster.\n isAdmin: z.literal(true).optional(),\n })\n .strict();\nexport type LookedUpUser = z.infer<typeof LookedUpUserSchema>;\n// The one exact match, or `null` when no account with a profile resolves.\nexport const LookupUserByEmailOrUidResultSchema = z\n .object({ user: LookedUpUserSchema.nullable() })\n .strict();\nexport type LookupUserByEmailOrUidResult = z.infer<typeof LookupUserByEmailOrUidResultSchema>;\n\n// An admin searches accounts by the start of their name, over public display identity. Ghosts are\n// not accounts and are left out; a banned account is found, with its status.\nexport const SearchPublicUsersInputSchema = z\n .object({ query: z.string().trim().min(1).max(MAX_USER_SEARCH_QUERY_LENGTH) })\n .strict();\nexport type SearchPublicUsersInput = z.infer<typeof SearchPublicUsersInputSchema>;\nexport const PublicUserSearchResultSchema = z\n .object({ uid: userIdSchema, displayName: z.string(), userStatus: userStatusSchema })\n .strict();\nexport type PublicUserSearchResult = z.infer<typeof PublicUserSearchResultSchema>;\nexport const SearchPublicUsersResultSchema = z\n .object({ users: z.array(PublicUserSearchResultSchema) })\n .strict();\nexport type SearchPublicUsersResult = z.infer<typeof SearchPublicUsersResultSchema>;\n\n// An admin renames a user. Self-service rename is not a Q-Sports feature.\nexport const UpdateDisplayNameInputSchema = z\n .object({ userId: userIdSchema, newDisplayName: displayNameSchema })\n .strict();\nexport type UpdateDisplayNameInput = z.infer<typeof UpdateDisplayNameInputSchema>;\nexport const UpdateDisplayNameResultSchema = z\n .object({ userId: userIdSchema, displayName: z.string() })\n .strict();\nexport type UpdateDisplayNameResult = z.infer<typeof UpdateDisplayNameResultSchema>;\n\n// An admin grants or revokes the two global roles on `_systemData/adminList`. Four named lists —\n// never a role/action discriminator (RULE-STD-BACKEND-002).\nconst adminListChangeSchema = z.array(userIdSchema).max(MAX_ADMIN_LIST_CHANGES).optional();\nexport const UpdateAdminListInputSchema = z\n .object({\n addAdmins: adminListChangeSchema,\n removeAdmins: adminListChangeSchema,\n addReferees: adminListChangeSchema,\n removeReferees: adminListChangeSchema,\n })\n .strict();\nexport type UpdateAdminListInput = z.infer<typeof UpdateAdminListInputSchema>;\nexport const UpdateAdminListResultSchema = z\n .object({\n adminsGranted: countSchema,\n adminsRevoked: countSchema,\n refereesGranted: countSchema,\n refereesRevoked: countSchema,\n })\n .strict();\nexport type UpdateAdminListResult = z.infer<typeof UpdateAdminListResultSchema>;\n\n// The one sentence `updateAdminList` refuses an admin's revoke of their own admin role with, and the\n// role screen shows on the control it withholds.\nexport const ADMIN_SELF_REVOKE_REFUSAL =\n \"You can't revoke your own admin standing. Ask another admin to do it.\";\n\n// An admin bans an account or lifts its ban. The reason is internal — recorded on the audit event,\n// never shown to the account (RULE-STD-BACKEND-212). Banning or unbanning to the status the account already\n// holds changes nothing.\nexport const AdminUpdateUserStatusInputSchema = z\n .object({ userId: userIdSchema, userStatus: userStatusSchema, reason: repairReasonSchema })\n .strict();\nexport type AdminUpdateUserStatusInput = z.infer<typeof AdminUpdateUserStatusInputSchema>;\n\n// `changed` is whether the status moved.\nexport const AdminUpdateUserStatusResultSchema = z\n .object({\n userId: userIdSchema,\n userStatus: userStatusSchema,\n previousStatus: userStatusSchema,\n changed: z.boolean(),\n })\n .strict();\nexport type AdminUpdateUserStatusResult = z.infer<typeof AdminUpdateUserStatusResultSchema>;\n\n// The `details.reason` of the refusal to ban an account that holds admin standing (RULE-STD-BACKEND-210), so\n// a client can tell it from every other refusal.\nexport const ADMIN_STANDING_BAN_REFUSAL_REASON = 'adminStandingTarget';\n\n// A signed-in login with no profile starts its registration, before `registerUser`: the record the\n// orphan-login cleanup finds it by, and the owner-only private record `registerUser` requires. The\n// caller is `request.auth.uid` and the email comes from its token, so it takes no input.\nexport const CreateRegistrationStartInputSchema = z.object({}).strict();\nexport type CreateRegistrationStartInput = z.infer<typeof CreateRegistrationStartInputSchema>;\n// `started` wrote both records; `alreadyStarted` found the registration already started and wrote\n// nothing — a retry, or a resume after a later step failed; `registrationExpired` found the login\n// claimed by the orphan-registration cleanup and wrote nothing — the person signs up again.\nexport const REGISTRATION_START_OUTCOMES = [\n 'started',\n 'alreadyStarted',\n 'registrationExpired',\n] as const;\nexport type RegistrationStartOutcome = (typeof REGISTRATION_START_OUTCOMES)[number];\nexport const CreateRegistrationStartResultSchema = z\n .object({ outcome: z.enum(REGISTRATION_START_OUTCOMES) })\n .strict();\nexport type CreateRegistrationStartResult = z.infer<typeof CreateRegistrationStartResultSchema>;\n"]}
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/schemas/users.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\nimport { MAX_ADMIN_LIST_CHANGES } from '../constants/business.js';\nimport {\n countSchema,\n repairReasonSchema,\n userIdSchema,\n userStatusSchema,\n} from '../doc-schemas/atoms.js';\nimport { displayNameSchema } from './atoms.js';\n\nexport const RegisterUserInputSchema = z\n .object({\n displayName: displayNameSchema,\n acceptedTerms: z.literal(true),\n })\n .strict();\nexport type RegisterUserInput = z.infer<typeof RegisterUserInputSchema>;\nexport const RegisterUserResultSchema = z.discriminatedUnion('status', [\n z\n .object({ status: z.literal('registered'), userId: userIdSchema, displayName: z.string() })\n .strict(),\n z.object({ status: z.literal('registrationExpired') }).strict(),\n]);\nexport type RegisterUserResult = z.infer<typeof RegisterUserResultSchema>;\n\nexport const CheckDisplayNameAvailableInputSchema = z\n .object({ displayName: displayNameSchema })\n .strict();\nexport type CheckDisplayNameAvailableInput = z.infer<typeof CheckDisplayNameAvailableInputSchema>;\nexport const DISPLAY_NAME_UNAVAILABLE_REASONS = ['taken'] as const;\nexport type DisplayNameUnavailableReason = (typeof DISPLAY_NAME_UNAVAILABLE_REASONS)[number];\nexport const CheckDisplayNameAvailableResultSchema = z\n .object({ available: z.boolean(), reason: z.enum(DISPLAY_NAME_UNAVAILABLE_REASONS).optional() })\n .strict();\nexport type CheckDisplayNameAvailableResult = z.infer<typeof CheckDisplayNameAvailableResultSchema>;\n\nexport const MAX_USER_SEARCH_QUERY_LENGTH = 100;\n\nexport const USER_LOOKUP_EMAIL_PATTERN = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nexport const USER_LOOKUP_UID_PATTERN = /^[A-Za-z0-9]{28}$/;\nexport type UserSearchKind = 'email' | 'uid' | 'name';\nexport function detectUserSearchKind(query: string): UserSearchKind {\n const trimmed = query.trim();\n if (USER_LOOKUP_EMAIL_PATTERN.test(trimmed)) return 'email';\n if (USER_LOOKUP_UID_PATTERN.test(trimmed)) return 'uid';\n return 'name';\n}\n\nexport const LookupUserByEmailOrUidInputSchema = z\n .object({ query: z.string().trim().min(1).max(MAX_USER_SEARCH_QUERY_LENGTH) })\n .strict();\nexport type LookupUserByEmailOrUidInput = z.infer<typeof LookupUserByEmailOrUidInputSchema>;\nexport const LookedUpUserSchema = z\n .object({\n uid: userIdSchema,\n displayName: z.string(),\n email: z.string(),\n userStatus: userStatusSchema,\n isAdmin: z.literal(true).optional(),\n })\n .strict();\nexport type LookedUpUser = z.infer<typeof LookedUpUserSchema>;\nexport const LookupUserByEmailOrUidResultSchema = z\n .object({ user: LookedUpUserSchema.nullable() })\n .strict();\nexport type LookupUserByEmailOrUidResult = z.infer<typeof LookupUserByEmailOrUidResultSchema>;\n\nexport const SearchPublicUsersInputSchema = z\n .object({ query: z.string().trim().min(1).max(MAX_USER_SEARCH_QUERY_LENGTH) })\n .strict();\nexport type SearchPublicUsersInput = z.infer<typeof SearchPublicUsersInputSchema>;\nexport const PublicUserSearchResultSchema = z\n .object({ uid: userIdSchema, displayName: z.string(), userStatus: userStatusSchema })\n .strict();\nexport type PublicUserSearchResult = z.infer<typeof PublicUserSearchResultSchema>;\nexport const SearchPublicUsersResultSchema = z\n .object({ users: z.array(PublicUserSearchResultSchema) })\n .strict();\nexport type SearchPublicUsersResult = z.infer<typeof SearchPublicUsersResultSchema>;\n\nexport const UpdateDisplayNameInputSchema = z\n .object({ userId: userIdSchema, newDisplayName: displayNameSchema })\n .strict();\nexport type UpdateDisplayNameInput = z.infer<typeof UpdateDisplayNameInputSchema>;\nexport const UpdateDisplayNameResultSchema = z\n .object({ userId: userIdSchema, displayName: z.string() })\n .strict();\nexport type UpdateDisplayNameResult = z.infer<typeof UpdateDisplayNameResultSchema>;\n\nconst adminListChangeSchema = z.array(userIdSchema).max(MAX_ADMIN_LIST_CHANGES).optional();\nexport const UpdateAdminListInputSchema = z\n .object({\n addAdmins: adminListChangeSchema,\n removeAdmins: adminListChangeSchema,\n addReferees: adminListChangeSchema,\n removeReferees: adminListChangeSchema,\n })\n .strict();\nexport type UpdateAdminListInput = z.infer<typeof UpdateAdminListInputSchema>;\nexport const UpdateAdminListResultSchema = z\n .object({\n adminsGranted: countSchema,\n adminsRevoked: countSchema,\n refereesGranted: countSchema,\n refereesRevoked: countSchema,\n })\n .strict();\nexport type UpdateAdminListResult = z.infer<typeof UpdateAdminListResultSchema>;\n\nexport const ADMIN_SELF_REVOKE_REFUSAL =\n \"You can't revoke your own admin standing. Ask another admin to do it.\";\n\nexport const AdminUpdateUserStatusInputSchema = z\n .object({ userId: userIdSchema, userStatus: userStatusSchema, reason: repairReasonSchema })\n .strict();\nexport type AdminUpdateUserStatusInput = z.infer<typeof AdminUpdateUserStatusInputSchema>;\n\nexport const AdminUpdateUserStatusResultSchema = z\n .object({\n userId: userIdSchema,\n userStatus: userStatusSchema,\n previousStatus: userStatusSchema,\n changed: z.boolean(),\n })\n .strict();\nexport type AdminUpdateUserStatusResult = z.infer<typeof AdminUpdateUserStatusResultSchema>;\n\nexport const ADMIN_STANDING_BAN_REFUSAL_REASON = 'adminStandingTarget';\n\nexport const CreateRegistrationStartInputSchema = z.object({}).strict();\nexport type CreateRegistrationStartInput = z.infer<typeof CreateRegistrationStartInputSchema>;\nexport const REGISTRATION_START_OUTCOMES = [\n 'started',\n 'alreadyStarted',\n 'registrationExpired',\n] as const;\nexport type RegistrationStartOutcome = (typeof REGISTRATION_START_OUTCOMES)[number];\nexport const CreateRegistrationStartResultSchema = z\n .object({ outcome: z.enum(REGISTRATION_START_OUTCOMES) })\n .strict();\nexport type CreateRegistrationStartResult = z.infer<typeof CreateRegistrationStartResultSchema>;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"waiver-templates.d.ts","sourceRoot":"","sources":["../../src/schemas/waiver-templates.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,yBAAyB,wDAAsD,CAAC;AAC7F,eAAO,MAAM,wBAAwB,wDAAqD,CAAC;AAE3F,eAAO,MAAM,oCAAoC;;;kBAEtC,CAAC;AACZ,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oCAAoC,CAAC,CAAC;AAClG,eAAO,MAAM,qCAAqC;;;kBAEvC,CAAC;AACZ,MAAM,MAAM,+BAA+B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qCAAqC,CAAC,CAAC;AAMpG,eAAO,MAAM,oCAAoC;;;;;kBAOtC,CAAC;AACZ,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oCAAoC,CAAC,CAAC;AAClG,eAAO,MAAM,qCAAqC;;;;kBAQvC,CAAC;AACZ,MAAM,MAAM,+BAA+B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qCAAqC,CAAC,CAAC;AAEpG,eAAO,MAAM,oCAAoC;;kBAEtC,CAAC;AACZ,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oCAAoC,CAAC,CAAC;AAClG,eAAO,MAAM,qCAAqC;;;;;;kBAKvC,CAAC;AACZ,MAAM,MAAM,+BAA+B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qCAAqC,CAAC,CAAC"}
1
+ {"version":3,"file":"waiver-templates.d.ts","sourceRoot":"","sources":["../../src/schemas/waiver-templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,yBAAyB,wDAAsD,CAAC;AAC7F,eAAO,MAAM,wBAAwB,wDAAqD,CAAC;AAE3F,eAAO,MAAM,oCAAoC;;;kBAEtC,CAAC;AACZ,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oCAAoC,CAAC,CAAC;AAClG,eAAO,MAAM,qCAAqC;;;kBAEvC,CAAC;AACZ,MAAM,MAAM,+BAA+B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qCAAqC,CAAC,CAAC;AAEpG,eAAO,MAAM,oCAAoC;;;;;kBAOtC,CAAC;AACZ,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oCAAoC,CAAC,CAAC;AAClG,eAAO,MAAM,qCAAqC;;;;kBAMvC,CAAC;AACZ,MAAM,MAAM,+BAA+B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qCAAqC,CAAC,CAAC;AAEpG,eAAO,MAAM,oCAAoC;;kBAEtC,CAAC;AACZ,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oCAAoC,CAAC,CAAC;AAClG,eAAO,MAAM,qCAAqC;;;;;;kBAKvC,CAAC;AACZ,MAAM,MAAM,+BAA+B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qCAAqC,CAAC,CAAC"}
@@ -1,4 +1,3 @@
1
- // Callable contracts for waiver templates: create, save new wording, and delete. Admin only.
2
1
  import { z } from 'zod';
3
2
  import { textFieldSchema } from '../doc-schemas/atoms.js';
4
3
  import { waiverTemplateIdSchema, waiverTemplateVersionNumberSchema, } from '../doc-schemas/waiver-template.js';
@@ -12,10 +11,6 @@ export const AdminCreateWaiverTemplateInputSchema = z
12
11
  export const AdminCreateWaiverTemplateResultSchema = z
13
12
  .object({ waiverTemplateId: waiverTemplateIdSchema, version: waiverTemplateVersionNumberSchema })
14
13
  .strict();
15
- // The template's whole wording as the admin wants it to read. Wording that differs from the current
16
- // version publishes the next version; the same wording changes nothing. `expectedVersion` is the
17
- // version the editor loaded: a save whose base is no longer current is refused, so a publication
18
- // never brings back wording another admin has since replaced.
19
14
  export const AdminUpdateWaiverTemplateInputSchema = z
20
15
  .object({
21
16
  waiverTemplateId: waiverTemplateIdSchema,
@@ -27,9 +22,7 @@ export const AdminUpdateWaiverTemplateInputSchema = z
27
22
  export const AdminUpdateWaiverTemplateResultSchema = z
28
23
  .object({
29
24
  waiverTemplateId: waiverTemplateIdSchema,
30
- // The template's current version after the save.
31
25
  version: waiverTemplateVersionNumberSchema,
32
- // False when the wording matched the current version and nothing was written.
33
26
  published: z.boolean(),
34
27
  })
35
28
  .strict();
@@ -1 +1 @@
1
- {"version":3,"file":"waiver-templates.js","sourceRoot":"","sources":["../../src/schemas/waiver-templates.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAE7F,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EACL,sBAAsB,EACtB,iCAAiC,GAClC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,mCAAmC,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EACL,iCAAiC,EACjC,kCAAkC,GACnC,MAAM,mCAAmC,CAAC;AAE3C,MAAM,CAAC,MAAM,yBAAyB,GAAG,eAAe,CAAC,kCAAkC,CAAC,CAAC;AAC7F,MAAM,CAAC,MAAM,wBAAwB,GAAG,eAAe,CAAC,iCAAiC,CAAC,CAAC;AAE3F,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAAC;KAClD,MAAM,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,UAAU,EAAE,wBAAwB,EAAE,CAAC;KAClF,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,qCAAqC,GAAG,CAAC;KACnD,MAAM,CAAC,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC;KAChG,MAAM,EAAE,CAAC;AAGZ,oGAAoG;AACpG,iGAAiG;AACjG,iGAAiG;AACjG,8DAA8D;AAC9D,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAAC;KAClD,MAAM,CAAC;IACN,gBAAgB,EAAE,sBAAsB;IACxC,eAAe,EAAE,iCAAiC;IAClD,KAAK,EAAE,yBAAyB;IAChC,UAAU,EAAE,wBAAwB;CACrC,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,qCAAqC,GAAG,CAAC;KACnD,MAAM,CAAC;IACN,gBAAgB,EAAE,sBAAsB;IACxC,iDAAiD;IACjD,OAAO,EAAE,iCAAiC;IAC1C,8EAA8E;IAC9E,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;CACvB,CAAC;KACD,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAAC;KAClD,MAAM,CAAC,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,CAAC;KACpD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,qCAAqC,GAAG,CAAC;KACnD,MAAM,CAAC;IACN,gBAAgB,EAAE,sBAAsB;IACxC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC;CACrD,CAAC;KACD,MAAM,EAAE,CAAC","sourcesContent":["// Callable contracts for waiver templates: create, save new wording, and delete. Admin only.\n\nimport { z } from 'zod';\nimport { textFieldSchema } from '../doc-schemas/atoms.js';\nimport {\n waiverTemplateIdSchema,\n waiverTemplateVersionNumberSchema,\n} from '../doc-schemas/waiver-template.js';\nimport { WAIVER_TEMPLATE_DELETE_OUTCOME_KEYS } from '../types/unions.js';\nimport {\n WAIVER_TEMPLATE_TEXT_INPUT_FORMAT,\n WAIVER_TEMPLATE_TITLE_INPUT_FORMAT,\n} from '../input-formats/input-formats.js';\n\nexport const waiverTemplateTitleSchema = textFieldSchema(WAIVER_TEMPLATE_TITLE_INPUT_FORMAT);\nexport const waiverTemplateTextSchema = textFieldSchema(WAIVER_TEMPLATE_TEXT_INPUT_FORMAT);\n\nexport const AdminCreateWaiverTemplateInputSchema = z\n .object({ title: waiverTemplateTitleSchema, waiverText: waiverTemplateTextSchema })\n .strict();\nexport type AdminCreateWaiverTemplateInput = z.infer<typeof AdminCreateWaiverTemplateInputSchema>;\nexport const AdminCreateWaiverTemplateResultSchema = z\n .object({ waiverTemplateId: waiverTemplateIdSchema, version: waiverTemplateVersionNumberSchema })\n .strict();\nexport type AdminCreateWaiverTemplateResult = z.infer<typeof AdminCreateWaiverTemplateResultSchema>;\n\n// The template's whole wording as the admin wants it to read. Wording that differs from the current\n// version publishes the next version; the same wording changes nothing. `expectedVersion` is the\n// version the editor loaded: a save whose base is no longer current is refused, so a publication\n// never brings back wording another admin has since replaced.\nexport const AdminUpdateWaiverTemplateInputSchema = z\n .object({\n waiverTemplateId: waiverTemplateIdSchema,\n expectedVersion: waiverTemplateVersionNumberSchema,\n title: waiverTemplateTitleSchema,\n waiverText: waiverTemplateTextSchema,\n })\n .strict();\nexport type AdminUpdateWaiverTemplateInput = z.infer<typeof AdminUpdateWaiverTemplateInputSchema>;\nexport const AdminUpdateWaiverTemplateResultSchema = z\n .object({\n waiverTemplateId: waiverTemplateIdSchema,\n // The template's current version after the save.\n version: waiverTemplateVersionNumberSchema,\n // False when the wording matched the current version and nothing was written.\n published: z.boolean(),\n })\n .strict();\nexport type AdminUpdateWaiverTemplateResult = z.infer<typeof AdminUpdateWaiverTemplateResultSchema>;\n\nexport const AdminDeleteWaiverTemplateInputSchema = z\n .object({ waiverTemplateId: waiverTemplateIdSchema })\n .strict();\nexport type AdminDeleteWaiverTemplateInput = z.infer<typeof AdminDeleteWaiverTemplateInputSchema>;\nexport const AdminDeleteWaiverTemplateResultSchema = z\n .object({\n waiverTemplateId: waiverTemplateIdSchema,\n outcome: z.enum(WAIVER_TEMPLATE_DELETE_OUTCOME_KEYS),\n })\n .strict();\nexport type AdminDeleteWaiverTemplateResult = z.infer<typeof AdminDeleteWaiverTemplateResultSchema>;\n"]}
1
+ {"version":3,"file":"waiver-templates.js","sourceRoot":"","sources":["../../src/schemas/waiver-templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EACL,sBAAsB,EACtB,iCAAiC,GAClC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,mCAAmC,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EACL,iCAAiC,EACjC,kCAAkC,GACnC,MAAM,mCAAmC,CAAC;AAE3C,MAAM,CAAC,MAAM,yBAAyB,GAAG,eAAe,CAAC,kCAAkC,CAAC,CAAC;AAC7F,MAAM,CAAC,MAAM,wBAAwB,GAAG,eAAe,CAAC,iCAAiC,CAAC,CAAC;AAE3F,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAAC;KAClD,MAAM,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,UAAU,EAAE,wBAAwB,EAAE,CAAC;KAClF,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,qCAAqC,GAAG,CAAC;KACnD,MAAM,CAAC,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC;KAChG,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAAC;KAClD,MAAM,CAAC;IACN,gBAAgB,EAAE,sBAAsB;IACxC,eAAe,EAAE,iCAAiC;IAClD,KAAK,EAAE,yBAAyB;IAChC,UAAU,EAAE,wBAAwB;CACrC,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,qCAAqC,GAAG,CAAC;KACnD,MAAM,CAAC;IACN,gBAAgB,EAAE,sBAAsB;IACxC,OAAO,EAAE,iCAAiC;IAC1C,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;CACvB,CAAC;KACD,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAAC;KAClD,MAAM,CAAC,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,CAAC;KACpD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,qCAAqC,GAAG,CAAC;KACnD,MAAM,CAAC;IACN,gBAAgB,EAAE,sBAAsB;IACxC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC;CACrD,CAAC;KACD,MAAM,EAAE,CAAC","sourcesContent":["import { z } from 'zod';\nimport { textFieldSchema } from '../doc-schemas/atoms.js';\nimport {\n waiverTemplateIdSchema,\n waiverTemplateVersionNumberSchema,\n} from '../doc-schemas/waiver-template.js';\nimport { WAIVER_TEMPLATE_DELETE_OUTCOME_KEYS } from '../types/unions.js';\nimport {\n WAIVER_TEMPLATE_TEXT_INPUT_FORMAT,\n WAIVER_TEMPLATE_TITLE_INPUT_FORMAT,\n} from '../input-formats/input-formats.js';\n\nexport const waiverTemplateTitleSchema = textFieldSchema(WAIVER_TEMPLATE_TITLE_INPUT_FORMAT);\nexport const waiverTemplateTextSchema = textFieldSchema(WAIVER_TEMPLATE_TEXT_INPUT_FORMAT);\n\nexport const AdminCreateWaiverTemplateInputSchema = z\n .object({ title: waiverTemplateTitleSchema, waiverText: waiverTemplateTextSchema })\n .strict();\nexport type AdminCreateWaiverTemplateInput = z.infer<typeof AdminCreateWaiverTemplateInputSchema>;\nexport const AdminCreateWaiverTemplateResultSchema = z\n .object({ waiverTemplateId: waiverTemplateIdSchema, version: waiverTemplateVersionNumberSchema })\n .strict();\nexport type AdminCreateWaiverTemplateResult = z.infer<typeof AdminCreateWaiverTemplateResultSchema>;\n\nexport const AdminUpdateWaiverTemplateInputSchema = z\n .object({\n waiverTemplateId: waiverTemplateIdSchema,\n expectedVersion: waiverTemplateVersionNumberSchema,\n title: waiverTemplateTitleSchema,\n waiverText: waiverTemplateTextSchema,\n })\n .strict();\nexport type AdminUpdateWaiverTemplateInput = z.infer<typeof AdminUpdateWaiverTemplateInputSchema>;\nexport const AdminUpdateWaiverTemplateResultSchema = z\n .object({\n waiverTemplateId: waiverTemplateIdSchema,\n version: waiverTemplateVersionNumberSchema,\n published: z.boolean(),\n })\n .strict();\nexport type AdminUpdateWaiverTemplateResult = z.infer<typeof AdminUpdateWaiverTemplateResultSchema>;\n\nexport const AdminDeleteWaiverTemplateInputSchema = z\n .object({ waiverTemplateId: waiverTemplateIdSchema })\n .strict();\nexport type AdminDeleteWaiverTemplateInput = z.infer<typeof AdminDeleteWaiverTemplateInputSchema>;\nexport const AdminDeleteWaiverTemplateResultSchema = z\n .object({\n waiverTemplateId: waiverTemplateIdSchema,\n outcome: z.enum(WAIVER_TEMPLATE_DELETE_OUTCOME_KEYS),\n })\n .strict();\nexport type AdminDeleteWaiverTemplateResult = z.infer<typeof AdminDeleteWaiverTemplateResultSchema>;\n"]}
@@ -3,10 +3,6 @@ import type { BasketballPlayerStatKey } from '../types/sports.js';
3
3
  import { type PlayerLinesBulkEntry } from './bulk-entry.js';
4
4
  import { type SportScoring } from './scoring.js';
5
5
  import { type PlayerEventsScoringPanel, type Scoreboard, type StatEventNameResolver } from './scoring-display.js';
6
- /**
7
- * Fantasy points (FP) of a basketball line: each player counter times its weight. Every stored
8
- * `fantasyPoints` equals this over the counters of its own line; `deriveLine` is what applies it.
9
- */
10
6
  export declare function basketballFantasyPoints(line: Pick<BasketballPlayerStats, BasketballPlayerStatKey>): number;
11
7
  export declare function emptyBasketballTeamLine(): BasketballTeamStats;
12
8
  export declare const BASKETBALL_SCORING: SportScoring;
@@ -1 +1 @@
1
- {"version":3,"file":"basketball-scoring.d.ts","sourceRoot":"","sources":["../../src/sports/basketball-scoring.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,EACd,MAAM,8BAA8B,CAAC;AAkBtC,OAAO,KAAK,EACV,uBAAuB,EAGxB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAIL,KAAK,oBAAoB,EAG1B,MAAM,iBAAiB,CAAC;AAMzB,OAAO,EASL,KAAK,YAAY,EAKlB,MAAM,cAAc,CAAC;AACtB,OAAO,EAGL,KAAK,wBAAwB,EAC7B,KAAK,UAAU,EAEf,KAAK,qBAAqB,EAE3B,MAAM,sBAAsB,CAAC;AAuB9B;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,IAAI,CAAC,qBAAqB,EAAE,uBAAuB,CAAC,GACzD,MAAM,CAKR;AAKD,wBAAgB,uBAAuB,IAAI,mBAAmB,CAI7D;AAuND,eAAO,MAAM,kBAAkB,EAAE,YAqBhC,CAAC;AAMF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQgC,CAAC;AAErE,eAAO,MAAM,uBAAuB;;;;;;;;;;CAGgD,CAAC;AAErF,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,qBAAqB,GAC7B,MAAM,CAiBR;AASD,eAAO,MAAM,qBAAqB,EAAE,UAwBnC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,wBAQtC,CAAC;AAMF,eAAO,MAAM,mCAAmC,yDACQ,CAAC;AAuCzD,eAAO,MAAM,qBAAqB,EAAE,oBA6CnC,CAAC"}
1
+ {"version":3,"file":"basketball-scoring.d.ts","sourceRoot":"","sources":["../../src/sports/basketball-scoring.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,EACd,MAAM,8BAA8B,CAAC;AAkBtC,OAAO,KAAK,EACV,uBAAuB,EAGxB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAIL,KAAK,oBAAoB,EAG1B,MAAM,iBAAiB,CAAC;AAMzB,OAAO,EASL,KAAK,YAAY,EAKlB,MAAM,cAAc,CAAC;AACtB,OAAO,EAGL,KAAK,wBAAwB,EAC7B,KAAK,UAAU,EAEf,KAAK,qBAAqB,EAE3B,MAAM,sBAAsB,CAAC;AAiB9B,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,IAAI,CAAC,qBAAqB,EAAE,uBAAuB,CAAC,GACzD,MAAM,CAKR;AAKD,wBAAgB,uBAAuB,IAAI,mBAAmB,CAI7D;AAwMD,eAAO,MAAM,kBAAkB,EAAE,YAoBhC,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQgC,CAAC;AAErE,eAAO,MAAM,uBAAuB;;;;;;;;;;CAGgD,CAAC;AAErF,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,qBAAqB,GAC7B,MAAM,CAiBR;AASD,eAAO,MAAM,qBAAqB,EAAE,UAwBnC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,wBAQtC,CAAC;AAEF,eAAO,MAAM,mCAAmC,yDACQ,CAAC;AAuCzD,eAAO,MAAM,qBAAqB,EAAE,oBA6CnC,CAAC"}
@@ -1,9 +1,3 @@
1
- // The basketball adapter's scoring, display, and bulk-entry members. Basketball is player-scored: a
2
- // shot credits its scorer's points and its team's score, and — when it names one — its assister's
3
- // assists, all on the one event (RULE-QS-SPORT-903).
4
- //
5
- // `apply` and `undo` are one function over an event's effects with opposite signs, so they are exact
6
- // inverses by construction (RULE-QS-SPORT-913).
7
1
  import { z } from 'zod';
8
2
  import { BASKETBALL_FANTASY_POINT_WEIGHTS, BASKETBALL_POINTS_BY_EVENT_TYPE, MAX_STAT_EVENTS_PER_WRITE, NOT_ON_GAME_ROSTER_MESSAGE, } from '../constants/sports.js';
9
3
  import { buildGameRosterPlayerId, parseGameRosterPlayerId } from '../ids/compound-ids.js';
@@ -16,21 +10,12 @@ import { describeStoreEvent, formatSignedValue, } from './scoring-display.js';
16
10
  function isBasketballEvent(event) {
17
11
  return isSportStatEventIn(BASKETBALL_STAT_EVENT_TYPE_KEYS, event);
18
12
  }
19
- // The registry chose this adapter by the game's `leagueType`, so the rollup it is handed is a
20
- // basketball game's (RULE-QS-SPORT-902).
21
13
  function ownStats(state) {
22
14
  return state;
23
15
  }
24
16
  function ownTeamLine(line) {
25
17
  return line;
26
18
  }
27
- // ---------------------------------------------------------------------------------------------
28
- // Lines
29
- // ---------------------------------------------------------------------------------------------
30
- /**
31
- * Fantasy points (FP) of a basketball line: each player counter times its weight. Every stored
32
- * `fantasyPoints` equals this over the counters of its own line; `deriveLine` is what applies it.
33
- */
34
19
  export function basketballFantasyPoints(line) {
35
20
  return BASKETBALL_PLAYER_STAT_KEYS.reduce((total, key) => total + line[key] * BASKETBALL_FANTASY_POINT_WEIGHTS[key], 0);
36
21
  }
@@ -56,7 +41,6 @@ function playerCountersOf(line) {
56
41
  counters[key] = counterOf(line, key);
57
42
  return counters;
58
43
  }
59
- // FP is an individual stat: it goes on the four player kinds and on no team kind.
60
44
  function deriveBasketballLine(kind, line) {
61
45
  const withoutDerived = Object.fromEntries(Object.entries(line).filter(([field]) => field !== FANTASY_POINTS_FIELD));
62
46
  if (!PLAYER_LINE_KINDS.includes(kind))
@@ -66,9 +50,6 @@ function deriveBasketballLine(kind, line) {
66
50
  [FANTASY_POINTS_FIELD]: basketballFantasyPoints(playerCountersOf(line)),
67
51
  };
68
52
  }
69
- // ---------------------------------------------------------------------------------------------
70
- // Events and their effects
71
- // ---------------------------------------------------------------------------------------------
72
53
  const CORRECTABLE_FIELDS = {
73
54
  team: BASKETBALL_TEAM_STAT_KEYS,
74
55
  player: BASKETBALL_PLAYER_STAT_KEYS,
@@ -91,7 +72,6 @@ function effectsOf(event) {
91
72
  }
92
73
  const scorer = buildGameRosterPlayerId(event.teamId, event.playerUserId);
93
74
  if (event.type === BASKETBALL_BULK_EDIT_EVENT_TYPE) {
94
- // A scorer's points edit keeps the team's score the sum of its players' points.
95
75
  return {
96
76
  team: event.stat === 'points'
97
77
  ? [{ line: event.teamId, field: 'score', amount: event.value }]
@@ -124,7 +104,6 @@ function correctionEffects(event) {
124
104
  if (!fields.includes(event.stat)) {
125
105
  throw new Error(`A basketball correction cannot change ${event.stat} on a ${event.playerUserId === undefined ? 'team' : 'player'} line.`);
126
106
  }
127
- // A correction moves only its own field: a player-points correction does not move the team score.
128
107
  return event.playerUserId === undefined
129
108
  ? {
130
109
  team: [
@@ -161,9 +140,6 @@ function applyEffects(state, effects, sign) {
161
140
  }
162
141
  return { teamStats, playerStats };
163
142
  }
164
- // ---------------------------------------------------------------------------------------------
165
- // Validation — the same rules the bulk form holds, re-checked on the server (RULE-QS-SPORT-906)
166
- // ---------------------------------------------------------------------------------------------
167
143
  function isAssistableShot(type) {
168
144
  return BASKETBALL_ASSISTABLE_SHOT_EVENT_TYPE_KEYS.includes(type);
169
145
  }
@@ -203,9 +179,6 @@ const validate = (stateIn, event, roster) => {
203
179
  }
204
180
  return STAT_EVENT_ACCEPTED;
205
181
  };
206
- // What a completed basketball game adds: each entry's points, rebounds, assists, and FP to its row,
207
- // and the team's rebounds and assists to its standings line. A present entry with no points,
208
- // rebounds, or assists is credited no game played — zero points alone is not exclusion.
209
182
  const BASKETBALL_CONTRIBUTION = {
210
183
  playerStatKeys: BASKETBALL_PLAYER_STAT_KEYS,
211
184
  teamSeasonPlayerSums: ['rebounds', 'assists'],
@@ -228,15 +201,11 @@ export const BASKETBALL_SCORING = {
228
201
  },
229
202
  deriveLine: deriveBasketballLine,
230
203
  correctableFields: CORRECTABLE_FIELDS,
231
- // Played in no rounds, and finalized by hand whenever the scorer chooses.
232
204
  nextRound: () => null,
233
205
  finalizationReadiness: () => FINALIZATION_READY,
234
206
  participation: (state, rosterPlayerIds, absentRosterPlayerIds) => decideParticipation(BASKETBALL_CONTRIBUTION, state, rosterPlayerIds, absentRosterPlayerIds),
235
207
  contribution: (game) => buildGameContribution(BASKETBALL_CONTRIBUTION, game),
236
208
  };
237
- // ---------------------------------------------------------------------------------------------
238
- // Display
239
- // ---------------------------------------------------------------------------------------------
240
209
  export const BASKETBALL_EVENT_LABELS = {
241
210
  [BASKETBALL_ONE_POINT_EVENT_TYPE]: { button: '+1 PT', play: '1-point basket' },
242
211
  [BASKETBALL_TWO_POINT_EVENT_TYPE]: { button: '+2 PT', play: '2-point basket' },
@@ -305,9 +274,6 @@ export const BASKETBALL_SCORING_PANEL = {
305
274
  assistableEventTypes: BASKETBALL_ASSISTABLE_SHOT_EVENT_TYPE_KEYS,
306
275
  teamEventTypes: [BASKETBALL_TIMEOUT_EVENT_TYPE],
307
276
  };
308
- // ---------------------------------------------------------------------------------------------
309
- // Bulk entry — one row per roster entry, absent entries included
310
- // ---------------------------------------------------------------------------------------------
311
277
  export const BASKETBALL_TEAM_SCORE_FLOOR_MESSAGE = "These changes would leave a team's score below zero.";
312
278
  const playerLineValuesSchema = z.strictObject(Object.fromEntries(BASKETBALL_PLAYER_STAT_KEYS.map((key) => [key, bulkEntryCountField])));
313
279
  function currentPlayerCounters(context, entryId) {
@@ -1 +1 @@
1
- {"version":3,"file":"basketball-scoring.js","sourceRoot":"","sources":["../../src/sports/basketball-scoring.ts"],"names":[],"mappings":"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","sourcesContent":["// The basketball adapter's scoring, display, and bulk-entry members. Basketball is player-scored: a\n// shot credits its scorer's points and its team's score, and — when it names one — its assister's\n// assists, all on the one event (RULE-QS-SPORT-903).\n//\n// `apply` and `undo` are one function over an event's effects with opposite signs, so they are exact\n// inverses by construction (RULE-QS-SPORT-913).\n\nimport { z } from 'zod';\nimport {\n BASKETBALL_FANTASY_POINT_WEIGHTS,\n BASKETBALL_POINTS_BY_EVENT_TYPE,\n MAX_STAT_EVENTS_PER_WRITE,\n NOT_ON_GAME_ROSTER_MESSAGE,\n} from '../constants/sports.js';\nimport type {\n BasketballPlayerStats,\n BasketballTeamStats,\n GameStatEvent,\n} from '../doc-schemas/game-stats.js';\nimport type { BasketballGameStats, GameStats } from '../doc-schemas/sport-game.js';\nimport { buildGameRosterPlayerId, parseGameRosterPlayerId } from '../ids/compound-ids.js';\nimport {\n BASKETBALL_ASSISTABLE_SHOT_EVENT_TYPE_KEYS,\n BASKETBALL_ASSIST_EVENT_TYPE,\n BASKETBALL_BULK_EDIT_EVENT_TYPE,\n BASKETBALL_ONE_POINT_EVENT_TYPE,\n BASKETBALL_PLAYER_STAT_KEYS,\n BASKETBALL_PLAYER_TALLY_EVENT_TYPE_KEYS,\n BASKETBALL_REBOUND_EVENT_TYPE,\n BASKETBALL_SCORE_EVENT_TYPE_KEYS,\n BASKETBALL_STAT_EVENT_TYPE_KEYS,\n BASKETBALL_TEAM_STAT_KEYS,\n BASKETBALL_THREE_POINT_EVENT_TYPE,\n BASKETBALL_TIMEOUT_EVENT_TYPE,\n BASKETBALL_TWO_POINT_EVENT_TYPE,\n} from '../types/sports.js';\nimport type {\n BasketballPlayerStatKey,\n BasketballStatEventType,\n BasketballTeamStatKey,\n} from '../types/sports.js';\nimport { PLAYER_STAT_LINE_KIND_KEYS } from '../types/stats.js';\nimport type { StatLineKind } from '../types/stats.js';\nimport {\n BULK_ENTRY_TOO_LARGE_MESSAGE,\n bulkEntryCountField,\n type BulkEntryContext,\n type PlayerLinesBulkEntry,\n type PlayerLinesValues,\n type StatEventDraft,\n} from './bulk-entry.js';\nimport {\n buildGameContribution,\n decideParticipation,\n type ContributionSpec,\n} from './contribution.js';\nimport {\n FINALIZATION_READY,\n STAT_EVENT_ACCEPTED,\n isAllZeroLine,\n isSportStatEventIn,\n isStatCorrection,\n refuseStatEvent,\n type CorrectableFields,\n type GameTeamLine,\n type SportScoring,\n type SportStatEventBody,\n type StatCorrectionBody,\n type StatEventBody,\n type StatLineValues,\n} from './scoring.js';\nimport {\n describeStoreEvent,\n formatSignedValue,\n type PlayerEventsScoringPanel,\n type Scoreboard,\n type StatEventLabel,\n type StatEventNameResolver,\n type StatFieldLabels,\n} from './scoring-display.js';\n\ntype BasketballEvent = Extract<SportStatEventBody, { type: BasketballStatEventType }>;\ntype PlayerCounters = Record<BasketballPlayerStatKey, number>;\n\nfunction isBasketballEvent(event: StatEventBody | undefined): event is BasketballEvent {\n return isSportStatEventIn(BASKETBALL_STAT_EVENT_TYPE_KEYS, event);\n}\n\n// The registry chose this adapter by the game's `leagueType`, so the rollup it is handed is a\n// basketball game's (RULE-QS-SPORT-902).\nfunction ownStats(state: GameStats): BasketballGameStats {\n return state as BasketballGameStats;\n}\n\nfunction ownTeamLine(line: GameTeamLine): BasketballTeamStats {\n return line as BasketballTeamStats;\n}\n\n// ---------------------------------------------------------------------------------------------\n// Lines\n// ---------------------------------------------------------------------------------------------\n\n/**\n * Fantasy points (FP) of a basketball line: each player counter times its weight. Every stored\n * `fantasyPoints` equals this over the counters of its own line; `deriveLine` is what applies it.\n */\nexport function basketballFantasyPoints(\n line: Pick<BasketballPlayerStats, BasketballPlayerStatKey>,\n): number {\n return BASKETBALL_PLAYER_STAT_KEYS.reduce(\n (total, key) => total + line[key] * BASKETBALL_FANTASY_POINT_WEIGHTS[key],\n 0,\n );\n}\n\nconst FANTASY_POINTS_FIELD = 'fantasyPoints' satisfies keyof BasketballPlayerStats;\nconst PLAYER_LINE_KINDS: readonly StatLineKind[] = PLAYER_STAT_LINE_KIND_KEYS;\n\nexport function emptyBasketballTeamLine(): BasketballTeamStats {\n return Object.fromEntries(\n BASKETBALL_TEAM_STAT_KEYS.map((key) => [key, 0]),\n ) as BasketballTeamStats;\n}\n\nfunction emptyPlayerCounters(): PlayerCounters {\n return Object.fromEntries(BASKETBALL_PLAYER_STAT_KEYS.map((key) => [key, 0])) as PlayerCounters;\n}\n\nfunction counterOf(line: StatLineValues, field: string): number {\n const value = line[field] ?? 0;\n if (typeof value !== 'number')\n throw new TypeError(`A basketball line's ${field} is not a number.`);\n return value;\n}\n\nfunction playerCountersOf(line: StatLineValues | undefined): PlayerCounters {\n const counters = emptyPlayerCounters();\n if (line === undefined) return counters;\n for (const key of BASKETBALL_PLAYER_STAT_KEYS) counters[key] = counterOf(line, key);\n return counters;\n}\n\n// FP is an individual stat: it goes on the four player kinds and on no team kind.\nfunction deriveBasketballLine(kind: StatLineKind, line: StatLineValues): StatLineValues {\n const withoutDerived = Object.fromEntries(\n Object.entries(line).filter(([field]) => field !== FANTASY_POINTS_FIELD),\n );\n if (!PLAYER_LINE_KINDS.includes(kind)) return withoutDerived;\n return {\n ...withoutDerived,\n [FANTASY_POINTS_FIELD]: basketballFantasyPoints(playerCountersOf(line)),\n };\n}\n\n// ---------------------------------------------------------------------------------------------\n// Events and their effects\n// ---------------------------------------------------------------------------------------------\n\nconst CORRECTABLE_FIELDS: CorrectableFields = {\n team: BASKETBALL_TEAM_STAT_KEYS,\n player: BASKETBALL_PLAYER_STAT_KEYS,\n};\n\nconst TALLY_FIELD = {\n [BASKETBALL_REBOUND_EVENT_TYPE]: 'rebounds',\n [BASKETBALL_ASSIST_EVENT_TYPE]: 'assists',\n} as const satisfies Record<\n (typeof BASKETBALL_PLAYER_TALLY_EVENT_TYPE_KEYS)[number],\n BasketballPlayerStatKey\n>;\n\ninterface LineChange<Field extends string> {\n /** The team id of a team line, or the roster-entry id of a player line. */\n readonly line: string;\n readonly field: Field;\n readonly amount: number;\n}\n\ninterface Effects {\n readonly team: readonly LineChange<BasketballTeamStatKey>[];\n readonly player: readonly LineChange<BasketballPlayerStatKey>[];\n}\n\nfunction assisterOf(event: StatEventBody): string | undefined {\n return 'assistedByUserId' in event && typeof event.assistedByUserId === 'string'\n ? event.assistedByUserId\n : undefined;\n}\n\nfunction namesPlayer(event: StatEventBody): boolean {\n return 'playerUserId' in event && event.playerUserId !== undefined;\n}\n\nfunction effectsOf(event: BasketballEvent): Effects {\n if (event.type === BASKETBALL_TIMEOUT_EVENT_TYPE) {\n return { team: [{ line: event.teamId, field: 'timeouts', amount: 1 }], player: [] };\n }\n const scorer = buildGameRosterPlayerId(event.teamId, event.playerUserId);\n if (event.type === BASKETBALL_BULK_EDIT_EVENT_TYPE) {\n // A scorer's points edit keeps the team's score the sum of its players' points.\n return {\n team:\n event.stat === 'points'\n ? [{ line: event.teamId, field: 'score', amount: event.value }]\n : [],\n player: [{ line: scorer, field: event.stat, amount: event.value }],\n };\n }\n\n const team: LineChange<BasketballTeamStatKey>[] = [];\n const player: LineChange<BasketballPlayerStatKey>[] = [];\n const points = BASKETBALL_POINTS_BY_EVENT_TYPE[event.type];\n if (points > 0) {\n team.push({ line: event.teamId, field: 'score', amount: points });\n player.push({ line: scorer, field: 'points', amount: points });\n }\n if (event.type === BASKETBALL_REBOUND_EVENT_TYPE || event.type === BASKETBALL_ASSIST_EVENT_TYPE) {\n player.push({ line: scorer, field: TALLY_FIELD[event.type], amount: 1 });\n }\n const assister = assisterOf(event);\n if (assister !== undefined) {\n player.push({\n line: buildGameRosterPlayerId(event.teamId, assister),\n field: 'assists',\n amount: 1,\n });\n }\n return { team, player };\n}\n\nfunction correctionEffects(event: StatCorrectionBody): Effects {\n const fields =\n event.playerUserId === undefined ? CORRECTABLE_FIELDS.team : CORRECTABLE_FIELDS.player;\n if (!fields.includes(event.stat)) {\n throw new Error(\n `A basketball correction cannot change ${event.stat} on a ${event.playerUserId === undefined ? 'team' : 'player'} line.`,\n );\n }\n // A correction moves only its own field: a player-points correction does not move the team score.\n return event.playerUserId === undefined\n ? {\n team: [\n { line: event.teamId, field: event.stat as BasketballTeamStatKey, amount: event.value },\n ],\n player: [],\n }\n : {\n team: [],\n player: [\n {\n line: buildGameRosterPlayerId(event.teamId, event.playerUserId),\n field: event.stat as BasketballPlayerStatKey,\n amount: event.value,\n },\n ],\n };\n}\n\nfunction applyEffects(\n state: BasketballGameStats,\n effects: Effects,\n sign: 1 | -1,\n): BasketballGameStats {\n const teamStats = { ...state.teamStats };\n for (const change of effects.team) {\n const line = { ...(teamStats[change.line] ?? emptyBasketballTeamLine()) };\n line[change.field] += sign * change.amount;\n teamStats[change.line] = line;\n }\n\n const playerStats = { ...state.playerStats };\n for (const change of effects.player) {\n const counters = playerCountersOf(playerStats[change.line]);\n counters[change.field] += sign * change.amount;\n if (isAllZeroLine(counters, BASKETBALL_PLAYER_STAT_KEYS)) delete playerStats[change.line];\n else\n playerStats[change.line] = deriveBasketballLine(\n 'gamePlayer',\n counters,\n ) as BasketballPlayerStats;\n }\n return { teamStats, playerStats };\n}\n\n// ---------------------------------------------------------------------------------------------\n// Validation — the same rules the bulk form holds, re-checked on the server (RULE-QS-SPORT-906)\n// ---------------------------------------------------------------------------------------------\n\nfunction isAssistableShot(type: BasketballStatEventType): boolean {\n return (BASKETBALL_ASSISTABLE_SHOT_EVENT_TYPE_KEYS as readonly string[]).includes(type);\n}\n\nconst validate: SportScoring['validate'] = (stateIn, event, roster) => {\n if (!isBasketballEvent(event)) return refuseStatEvent('eventTypeNotInSport');\n if (!roster.teamIds.includes(event.teamId)) return refuseStatEvent('teamNotInGame');\n if (event.type === BASKETBALL_TIMEOUT_EVENT_TYPE) {\n return namesPlayer(event) || assisterOf(event) !== undefined\n ? refuseStatEvent('playerNotAllowed')\n : STAT_EVENT_ACCEPTED;\n }\n\n const scorer = buildGameRosterPlayerId(event.teamId, event.playerUserId);\n if (!roster.rosterPlayerIds.has(scorer)) return refuseStatEvent('playerNotRostered');\n\n const assister = assisterOf(event);\n if (assister !== undefined) {\n if (!isAssistableShot(event.type) || assister === event.playerUserId)\n return refuseStatEvent('assistNotAllowed');\n if (!roster.rosterPlayerIds.has(buildGameRosterPlayerId(event.teamId, assister))) {\n return refuseStatEvent('assisterNotRostered');\n }\n }\n\n if (event.type === BASKETBALL_BULK_EDIT_EVENT_TYPE) {\n if (!Number.isInteger(event.value) || event.value === 0)\n return refuseStatEvent('bulkValueInvalid');\n const state = ownStats(stateIn);\n const current = playerCountersOf(state.playerStats[scorer])[event.stat];\n if (event.previousValue !== current) return refuseStatEvent('bulkStale');\n if (current + event.value < 0) return refuseStatEvent('bulkValueInvalid');\n const teamScore = (state.teamStats[event.teamId] ?? emptyBasketballTeamLine()).score;\n if (event.stat === 'points' && teamScore + event.value < 0)\n return refuseStatEvent('bulkValueInvalid');\n }\n return STAT_EVENT_ACCEPTED;\n};\n\n// What a completed basketball game adds: each entry's points, rebounds, assists, and FP to its row,\n// and the team's rebounds and assists to its standings line. A present entry with no points,\n// rebounds, or assists is credited no game played — zero points alone is not exclusion.\nconst BASKETBALL_CONTRIBUTION: ContributionSpec = {\n playerStatKeys: BASKETBALL_PLAYER_STAT_KEYS,\n teamSeasonPlayerSums: ['rebounds', 'assists'] satisfies BasketballPlayerStatKey[],\n zeroLineIsNonScoring: true,\n deriveLine: deriveBasketballLine,\n};\n\nexport const BASKETBALL_SCORING: SportScoring = {\n validate,\n apply: (state, event) => {\n if (isStatCorrection(event)) return applyEffects(ownStats(state), correctionEffects(event), 1);\n if (!isBasketballEvent(event))\n throw new Error(`The basketball adapter does not apply ${event.type}.`);\n return applyEffects(ownStats(state), effectsOf(event), 1);\n },\n undo: (state, target) => {\n if (!isBasketballEvent(target))\n throw new Error(`The basketball adapter does not undo ${target.type}.`);\n return applyEffects(ownStats(state), effectsOf(target), -1);\n },\n deriveLine: deriveBasketballLine,\n correctableFields: CORRECTABLE_FIELDS,\n // Played in no rounds, and finalized by hand whenever the scorer chooses.\n nextRound: () => null,\n finalizationReadiness: () => FINALIZATION_READY,\n participation: (state, rosterPlayerIds, absentRosterPlayerIds) =>\n decideParticipation(BASKETBALL_CONTRIBUTION, state, rosterPlayerIds, absentRosterPlayerIds),\n contribution: (game) => buildGameContribution(BASKETBALL_CONTRIBUTION, game),\n};\n\n// ---------------------------------------------------------------------------------------------\n// Display\n// ---------------------------------------------------------------------------------------------\n\nexport const BASKETBALL_EVENT_LABELS = {\n [BASKETBALL_ONE_POINT_EVENT_TYPE]: { button: '+1 PT', play: '1-point basket' },\n [BASKETBALL_TWO_POINT_EVENT_TYPE]: { button: '+2 PT', play: '2-point basket' },\n [BASKETBALL_THREE_POINT_EVENT_TYPE]: { button: '+3 PT', play: '3-point basket' },\n [BASKETBALL_REBOUND_EVENT_TYPE]: { button: 'Rebound', play: 'Rebound' },\n [BASKETBALL_ASSIST_EVENT_TYPE]: { button: 'Assist', play: 'Assist' },\n [BASKETBALL_TIMEOUT_EVENT_TYPE]: { button: 'Timeout', play: 'Timeout' },\n [BASKETBALL_BULK_EDIT_EVENT_TYPE]: { button: 'Bulk entry', play: 'Bulk entry' },\n} as const satisfies Record<BasketballStatEventType, StatEventLabel>;\n\nexport const BASKETBALL_FIELD_LABELS = {\n team: { score: 'Score', timeouts: 'Timeouts' },\n player: { points: 'Points', rebounds: 'Rebounds', assists: 'Assists' },\n} as const satisfies StatFieldLabels<BasketballTeamStatKey, BasketballPlayerStatKey>;\n\nexport function describeBasketballEvent(\n event: GameStatEvent,\n resolve: StatEventNameResolver,\n): string {\n const storeEvent = describeStoreEvent(event, resolve, BASKETBALL_FIELD_LABELS);\n if (storeEvent !== null) return storeEvent;\n if (!isBasketballEvent(event)) return event.type;\n\n const team = resolve.team(event.teamId);\n if (event.type === BASKETBALL_TIMEOUT_EVENT_TYPE)\n return `${team}: ${BASKETBALL_EVENT_LABELS[event.type].play}`;\n\n const player = `${resolve.player(event.playerUserId)} (${team})`;\n if (event.type === BASKETBALL_BULK_EDIT_EVENT_TYPE) {\n const field = BASKETBALL_FIELD_LABELS.player[event.stat].toLowerCase();\n return `${player}: ${formatSignedValue(event.value)} ${field} (${BASKETBALL_EVENT_LABELS[event.type].play.toLowerCase()})`;\n }\n const play = `${player}: ${BASKETBALL_EVENT_LABELS[event.type].play}`;\n const assister = assisterOf(event);\n return assister === undefined ? play : `${play}, assisted by ${resolve.player(assister)}`;\n}\n\nfunction sumOf(\n lines: readonly { readonly rebounds: number; readonly assists: number }[],\n field: 'rebounds' | 'assists',\n): number {\n return lines.reduce((total, line) => total + line[field], 0);\n}\n\nexport const BASKETBALL_SCOREBOARD: Scoreboard = {\n figures: [\n {\n id: 'points',\n label: BASKETBALL_FIELD_LABELS.player.points,\n value: (teamLine) => teamLine.score,\n },\n {\n id: 'rebounds',\n label: BASKETBALL_FIELD_LABELS.player.rebounds,\n value: (_teamLine, sideLines) => sumOf(sideLines, 'rebounds'),\n },\n {\n id: 'assists',\n label: BASKETBALL_FIELD_LABELS.player.assists,\n value: (_teamLine, sideLines) => sumOf(sideLines, 'assists'),\n },\n {\n id: 'timeouts',\n label: BASKETBALL_FIELD_LABELS.team.timeouts,\n value: (teamLine) => ownTeamLine(teamLine).timeouts,\n },\n ],\n jumpBall: true,\n};\n\nexport const BASKETBALL_SCORING_PANEL: PlayerEventsScoringPanel = {\n kind: 'playerEvents',\n playerEventTypes: [\n ...BASKETBALL_SCORE_EVENT_TYPE_KEYS,\n ...BASKETBALL_PLAYER_TALLY_EVENT_TYPE_KEYS,\n ],\n assistableEventTypes: BASKETBALL_ASSISTABLE_SHOT_EVENT_TYPE_KEYS,\n teamEventTypes: [BASKETBALL_TIMEOUT_EVENT_TYPE],\n};\n\n// ---------------------------------------------------------------------------------------------\n// Bulk entry — one row per roster entry, absent entries included\n// ---------------------------------------------------------------------------------------------\n\nexport const BASKETBALL_TEAM_SCORE_FLOOR_MESSAGE =\n \"These changes would leave a team's score below zero.\";\n\nconst playerLineValuesSchema = z.strictObject(\n Object.fromEntries(\n BASKETBALL_PLAYER_STAT_KEYS.map((key) => [key, bulkEntryCountField]),\n ) as Record<BasketballPlayerStatKey, typeof bulkEntryCountField>,\n);\n\nfunction currentPlayerCounters(context: BulkEntryContext, entryId: string): PlayerCounters {\n return playerCountersOf(ownStats(context.state).playerStats[entryId]);\n}\n\nfunction bulkDrafts(values: PlayerLinesValues, context: BulkEntryContext): StatEventDraft[] {\n const increases: StatEventDraft[] = [];\n const decreases: StatEventDraft[] = [];\n for (const entryId of context.rosterPlayerIds) {\n const entered = values.lines[entryId];\n const entry = parseGameRosterPlayerId(entryId);\n if (entered === undefined || entry === null) continue;\n const before = currentPlayerCounters(context, entryId);\n for (const stat of BASKETBALL_PLAYER_STAT_KEYS) {\n const value = (entered[stat] ?? before[stat]) - before[stat];\n if (value === 0) continue;\n const draft: StatEventDraft = {\n type: BASKETBALL_BULK_EDIT_EVENT_TYPE,\n teamId: entry.teamId,\n playerUserId: entry.userId,\n stat,\n value,\n previousValue: before[stat],\n };\n (value > 0 ? increases : decreases).push(draft);\n }\n }\n // Every increase before any decrease, so a team's running score never dips below the floor its\n // final score clears — each draft passes `validate` against the state the ones before it leave.\n return [...increases, ...decreases];\n}\n\nexport const BASKETBALL_BULK_ENTRY: PlayerLinesBulkEntry = {\n kind: 'playerLines',\n formDefaults: (context) => ({\n lines: Object.fromEntries(\n context.rosterPlayerIds.map((entryId) => [entryId, currentPlayerCounters(context, entryId)]),\n ),\n }),\n formSchema: (context) => {\n const roster = new Set(context.rosterPlayerIds);\n return z\n .object({ lines: z.record(z.string(), playerLineValuesSchema) })\n .superRefine((values, issues) => {\n for (const entryId of Object.keys(values.lines)) {\n if (!roster.has(entryId)) {\n issues.addIssue({\n code: 'custom',\n path: ['lines', entryId],\n message: NOT_ON_GAME_ROSTER_MESSAGE,\n });\n }\n }\n const state = ownStats(context.state);\n for (const teamId of context.game.teamIds) {\n let score = (state.teamStats[teamId] ?? emptyBasketballTeamLine()).score;\n for (const [entryId, entered] of Object.entries(values.lines)) {\n if (parseGameRosterPlayerId(entryId)?.teamId !== teamId) continue;\n score += entered.points - currentPlayerCounters(context, entryId).points;\n }\n if (score < 0)\n issues.addIssue({\n code: 'custom',\n path: ['lines'],\n message: BASKETBALL_TEAM_SCORE_FLOOR_MESSAGE,\n });\n }\n if (bulkDrafts(values, context).length > MAX_STAT_EVENTS_PER_WRITE) {\n issues.addIssue({\n code: 'custom',\n path: ['lines'],\n message: BULK_ENTRY_TOO_LARGE_MESSAGE,\n });\n }\n });\n },\n toEvents: bulkDrafts,\n};\n"]}
1
+ {"version":3,"file":"basketball-scoring.js","sourceRoot":"","sources":["../../src/sports/basketball-scoring.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\nimport {\n BASKETBALL_FANTASY_POINT_WEIGHTS,\n BASKETBALL_POINTS_BY_EVENT_TYPE,\n MAX_STAT_EVENTS_PER_WRITE,\n NOT_ON_GAME_ROSTER_MESSAGE,\n} from '../constants/sports.js';\nimport type {\n BasketballPlayerStats,\n BasketballTeamStats,\n GameStatEvent,\n} from '../doc-schemas/game-stats.js';\nimport type { BasketballGameStats, GameStats } from '../doc-schemas/sport-game.js';\nimport { buildGameRosterPlayerId, parseGameRosterPlayerId } from '../ids/compound-ids.js';\nimport {\n BASKETBALL_ASSISTABLE_SHOT_EVENT_TYPE_KEYS,\n BASKETBALL_ASSIST_EVENT_TYPE,\n BASKETBALL_BULK_EDIT_EVENT_TYPE,\n BASKETBALL_ONE_POINT_EVENT_TYPE,\n BASKETBALL_PLAYER_STAT_KEYS,\n BASKETBALL_PLAYER_TALLY_EVENT_TYPE_KEYS,\n BASKETBALL_REBOUND_EVENT_TYPE,\n BASKETBALL_SCORE_EVENT_TYPE_KEYS,\n BASKETBALL_STAT_EVENT_TYPE_KEYS,\n BASKETBALL_TEAM_STAT_KEYS,\n BASKETBALL_THREE_POINT_EVENT_TYPE,\n BASKETBALL_TIMEOUT_EVENT_TYPE,\n BASKETBALL_TWO_POINT_EVENT_TYPE,\n} from '../types/sports.js';\nimport type {\n BasketballPlayerStatKey,\n BasketballStatEventType,\n BasketballTeamStatKey,\n} from '../types/sports.js';\nimport { PLAYER_STAT_LINE_KIND_KEYS } from '../types/stats.js';\nimport type { StatLineKind } from '../types/stats.js';\nimport {\n BULK_ENTRY_TOO_LARGE_MESSAGE,\n bulkEntryCountField,\n type BulkEntryContext,\n type PlayerLinesBulkEntry,\n type PlayerLinesValues,\n type StatEventDraft,\n} from './bulk-entry.js';\nimport {\n buildGameContribution,\n decideParticipation,\n type ContributionSpec,\n} from './contribution.js';\nimport {\n FINALIZATION_READY,\n STAT_EVENT_ACCEPTED,\n isAllZeroLine,\n isSportStatEventIn,\n isStatCorrection,\n refuseStatEvent,\n type CorrectableFields,\n type GameTeamLine,\n type SportScoring,\n type SportStatEventBody,\n type StatCorrectionBody,\n type StatEventBody,\n type StatLineValues,\n} from './scoring.js';\nimport {\n describeStoreEvent,\n formatSignedValue,\n type PlayerEventsScoringPanel,\n type Scoreboard,\n type StatEventLabel,\n type StatEventNameResolver,\n type StatFieldLabels,\n} from './scoring-display.js';\n\ntype BasketballEvent = Extract<SportStatEventBody, { type: BasketballStatEventType }>;\ntype PlayerCounters = Record<BasketballPlayerStatKey, number>;\n\nfunction isBasketballEvent(event: StatEventBody | undefined): event is BasketballEvent {\n return isSportStatEventIn(BASKETBALL_STAT_EVENT_TYPE_KEYS, event);\n}\n\nfunction ownStats(state: GameStats): BasketballGameStats {\n return state as BasketballGameStats;\n}\n\nfunction ownTeamLine(line: GameTeamLine): BasketballTeamStats {\n return line as BasketballTeamStats;\n}\n\nexport function basketballFantasyPoints(\n line: Pick<BasketballPlayerStats, BasketballPlayerStatKey>,\n): number {\n return BASKETBALL_PLAYER_STAT_KEYS.reduce(\n (total, key) => total + line[key] * BASKETBALL_FANTASY_POINT_WEIGHTS[key],\n 0,\n );\n}\n\nconst FANTASY_POINTS_FIELD = 'fantasyPoints' satisfies keyof BasketballPlayerStats;\nconst PLAYER_LINE_KINDS: readonly StatLineKind[] = PLAYER_STAT_LINE_KIND_KEYS;\n\nexport function emptyBasketballTeamLine(): BasketballTeamStats {\n return Object.fromEntries(\n BASKETBALL_TEAM_STAT_KEYS.map((key) => [key, 0]),\n ) as BasketballTeamStats;\n}\n\nfunction emptyPlayerCounters(): PlayerCounters {\n return Object.fromEntries(BASKETBALL_PLAYER_STAT_KEYS.map((key) => [key, 0])) as PlayerCounters;\n}\n\nfunction counterOf(line: StatLineValues, field: string): number {\n const value = line[field] ?? 0;\n if (typeof value !== 'number')\n throw new TypeError(`A basketball line's ${field} is not a number.`);\n return value;\n}\n\nfunction playerCountersOf(line: StatLineValues | undefined): PlayerCounters {\n const counters = emptyPlayerCounters();\n if (line === undefined) return counters;\n for (const key of BASKETBALL_PLAYER_STAT_KEYS) counters[key] = counterOf(line, key);\n return counters;\n}\n\nfunction deriveBasketballLine(kind: StatLineKind, line: StatLineValues): StatLineValues {\n const withoutDerived = Object.fromEntries(\n Object.entries(line).filter(([field]) => field !== FANTASY_POINTS_FIELD),\n );\n if (!PLAYER_LINE_KINDS.includes(kind)) return withoutDerived;\n return {\n ...withoutDerived,\n [FANTASY_POINTS_FIELD]: basketballFantasyPoints(playerCountersOf(line)),\n };\n}\n\nconst CORRECTABLE_FIELDS: CorrectableFields = {\n team: BASKETBALL_TEAM_STAT_KEYS,\n player: BASKETBALL_PLAYER_STAT_KEYS,\n};\n\nconst TALLY_FIELD = {\n [BASKETBALL_REBOUND_EVENT_TYPE]: 'rebounds',\n [BASKETBALL_ASSIST_EVENT_TYPE]: 'assists',\n} as const satisfies Record<\n (typeof BASKETBALL_PLAYER_TALLY_EVENT_TYPE_KEYS)[number],\n BasketballPlayerStatKey\n>;\n\ninterface LineChange<Field extends string> {\n readonly line: string;\n readonly field: Field;\n readonly amount: number;\n}\n\ninterface Effects {\n readonly team: readonly LineChange<BasketballTeamStatKey>[];\n readonly player: readonly LineChange<BasketballPlayerStatKey>[];\n}\n\nfunction assisterOf(event: StatEventBody): string | undefined {\n return 'assistedByUserId' in event && typeof event.assistedByUserId === 'string'\n ? event.assistedByUserId\n : undefined;\n}\n\nfunction namesPlayer(event: StatEventBody): boolean {\n return 'playerUserId' in event && event.playerUserId !== undefined;\n}\n\nfunction effectsOf(event: BasketballEvent): Effects {\n if (event.type === BASKETBALL_TIMEOUT_EVENT_TYPE) {\n return { team: [{ line: event.teamId, field: 'timeouts', amount: 1 }], player: [] };\n }\n const scorer = buildGameRosterPlayerId(event.teamId, event.playerUserId);\n if (event.type === BASKETBALL_BULK_EDIT_EVENT_TYPE) {\n return {\n team:\n event.stat === 'points'\n ? [{ line: event.teamId, field: 'score', amount: event.value }]\n : [],\n player: [{ line: scorer, field: event.stat, amount: event.value }],\n };\n }\n\n const team: LineChange<BasketballTeamStatKey>[] = [];\n const player: LineChange<BasketballPlayerStatKey>[] = [];\n const points = BASKETBALL_POINTS_BY_EVENT_TYPE[event.type];\n if (points > 0) {\n team.push({ line: event.teamId, field: 'score', amount: points });\n player.push({ line: scorer, field: 'points', amount: points });\n }\n if (event.type === BASKETBALL_REBOUND_EVENT_TYPE || event.type === BASKETBALL_ASSIST_EVENT_TYPE) {\n player.push({ line: scorer, field: TALLY_FIELD[event.type], amount: 1 });\n }\n const assister = assisterOf(event);\n if (assister !== undefined) {\n player.push({\n line: buildGameRosterPlayerId(event.teamId, assister),\n field: 'assists',\n amount: 1,\n });\n }\n return { team, player };\n}\n\nfunction correctionEffects(event: StatCorrectionBody): Effects {\n const fields =\n event.playerUserId === undefined ? CORRECTABLE_FIELDS.team : CORRECTABLE_FIELDS.player;\n if (!fields.includes(event.stat)) {\n throw new Error(\n `A basketball correction cannot change ${event.stat} on a ${event.playerUserId === undefined ? 'team' : 'player'} line.`,\n );\n }\n return event.playerUserId === undefined\n ? {\n team: [\n { line: event.teamId, field: event.stat as BasketballTeamStatKey, amount: event.value },\n ],\n player: [],\n }\n : {\n team: [],\n player: [\n {\n line: buildGameRosterPlayerId(event.teamId, event.playerUserId),\n field: event.stat as BasketballPlayerStatKey,\n amount: event.value,\n },\n ],\n };\n}\n\nfunction applyEffects(\n state: BasketballGameStats,\n effects: Effects,\n sign: 1 | -1,\n): BasketballGameStats {\n const teamStats = { ...state.teamStats };\n for (const change of effects.team) {\n const line = { ...(teamStats[change.line] ?? emptyBasketballTeamLine()) };\n line[change.field] += sign * change.amount;\n teamStats[change.line] = line;\n }\n\n const playerStats = { ...state.playerStats };\n for (const change of effects.player) {\n const counters = playerCountersOf(playerStats[change.line]);\n counters[change.field] += sign * change.amount;\n if (isAllZeroLine(counters, BASKETBALL_PLAYER_STAT_KEYS)) delete playerStats[change.line];\n else\n playerStats[change.line] = deriveBasketballLine(\n 'gamePlayer',\n counters,\n ) as BasketballPlayerStats;\n }\n return { teamStats, playerStats };\n}\n\nfunction isAssistableShot(type: BasketballStatEventType): boolean {\n return (BASKETBALL_ASSISTABLE_SHOT_EVENT_TYPE_KEYS as readonly string[]).includes(type);\n}\n\nconst validate: SportScoring['validate'] = (stateIn, event, roster) => {\n if (!isBasketballEvent(event)) return refuseStatEvent('eventTypeNotInSport');\n if (!roster.teamIds.includes(event.teamId)) return refuseStatEvent('teamNotInGame');\n if (event.type === BASKETBALL_TIMEOUT_EVENT_TYPE) {\n return namesPlayer(event) || assisterOf(event) !== undefined\n ? refuseStatEvent('playerNotAllowed')\n : STAT_EVENT_ACCEPTED;\n }\n\n const scorer = buildGameRosterPlayerId(event.teamId, event.playerUserId);\n if (!roster.rosterPlayerIds.has(scorer)) return refuseStatEvent('playerNotRostered');\n\n const assister = assisterOf(event);\n if (assister !== undefined) {\n if (!isAssistableShot(event.type) || assister === event.playerUserId)\n return refuseStatEvent('assistNotAllowed');\n if (!roster.rosterPlayerIds.has(buildGameRosterPlayerId(event.teamId, assister))) {\n return refuseStatEvent('assisterNotRostered');\n }\n }\n\n if (event.type === BASKETBALL_BULK_EDIT_EVENT_TYPE) {\n if (!Number.isInteger(event.value) || event.value === 0)\n return refuseStatEvent('bulkValueInvalid');\n const state = ownStats(stateIn);\n const current = playerCountersOf(state.playerStats[scorer])[event.stat];\n if (event.previousValue !== current) return refuseStatEvent('bulkStale');\n if (current + event.value < 0) return refuseStatEvent('bulkValueInvalid');\n const teamScore = (state.teamStats[event.teamId] ?? emptyBasketballTeamLine()).score;\n if (event.stat === 'points' && teamScore + event.value < 0)\n return refuseStatEvent('bulkValueInvalid');\n }\n return STAT_EVENT_ACCEPTED;\n};\n\nconst BASKETBALL_CONTRIBUTION: ContributionSpec = {\n playerStatKeys: BASKETBALL_PLAYER_STAT_KEYS,\n teamSeasonPlayerSums: ['rebounds', 'assists'] satisfies BasketballPlayerStatKey[],\n zeroLineIsNonScoring: true,\n deriveLine: deriveBasketballLine,\n};\n\nexport const BASKETBALL_SCORING: SportScoring = {\n validate,\n apply: (state, event) => {\n if (isStatCorrection(event)) return applyEffects(ownStats(state), correctionEffects(event), 1);\n if (!isBasketballEvent(event))\n throw new Error(`The basketball adapter does not apply ${event.type}.`);\n return applyEffects(ownStats(state), effectsOf(event), 1);\n },\n undo: (state, target) => {\n if (!isBasketballEvent(target))\n throw new Error(`The basketball adapter does not undo ${target.type}.`);\n return applyEffects(ownStats(state), effectsOf(target), -1);\n },\n deriveLine: deriveBasketballLine,\n correctableFields: CORRECTABLE_FIELDS,\n nextRound: () => null,\n finalizationReadiness: () => FINALIZATION_READY,\n participation: (state, rosterPlayerIds, absentRosterPlayerIds) =>\n decideParticipation(BASKETBALL_CONTRIBUTION, state, rosterPlayerIds, absentRosterPlayerIds),\n contribution: (game) => buildGameContribution(BASKETBALL_CONTRIBUTION, game),\n};\n\nexport const BASKETBALL_EVENT_LABELS = {\n [BASKETBALL_ONE_POINT_EVENT_TYPE]: { button: '+1 PT', play: '1-point basket' },\n [BASKETBALL_TWO_POINT_EVENT_TYPE]: { button: '+2 PT', play: '2-point basket' },\n [BASKETBALL_THREE_POINT_EVENT_TYPE]: { button: '+3 PT', play: '3-point basket' },\n [BASKETBALL_REBOUND_EVENT_TYPE]: { button: 'Rebound', play: 'Rebound' },\n [BASKETBALL_ASSIST_EVENT_TYPE]: { button: 'Assist', play: 'Assist' },\n [BASKETBALL_TIMEOUT_EVENT_TYPE]: { button: 'Timeout', play: 'Timeout' },\n [BASKETBALL_BULK_EDIT_EVENT_TYPE]: { button: 'Bulk entry', play: 'Bulk entry' },\n} as const satisfies Record<BasketballStatEventType, StatEventLabel>;\n\nexport const BASKETBALL_FIELD_LABELS = {\n team: { score: 'Score', timeouts: 'Timeouts' },\n player: { points: 'Points', rebounds: 'Rebounds', assists: 'Assists' },\n} as const satisfies StatFieldLabels<BasketballTeamStatKey, BasketballPlayerStatKey>;\n\nexport function describeBasketballEvent(\n event: GameStatEvent,\n resolve: StatEventNameResolver,\n): string {\n const storeEvent = describeStoreEvent(event, resolve, BASKETBALL_FIELD_LABELS);\n if (storeEvent !== null) return storeEvent;\n if (!isBasketballEvent(event)) return event.type;\n\n const team = resolve.team(event.teamId);\n if (event.type === BASKETBALL_TIMEOUT_EVENT_TYPE)\n return `${team}: ${BASKETBALL_EVENT_LABELS[event.type].play}`;\n\n const player = `${resolve.player(event.playerUserId)} (${team})`;\n if (event.type === BASKETBALL_BULK_EDIT_EVENT_TYPE) {\n const field = BASKETBALL_FIELD_LABELS.player[event.stat].toLowerCase();\n return `${player}: ${formatSignedValue(event.value)} ${field} (${BASKETBALL_EVENT_LABELS[event.type].play.toLowerCase()})`;\n }\n const play = `${player}: ${BASKETBALL_EVENT_LABELS[event.type].play}`;\n const assister = assisterOf(event);\n return assister === undefined ? play : `${play}, assisted by ${resolve.player(assister)}`;\n}\n\nfunction sumOf(\n lines: readonly { readonly rebounds: number; readonly assists: number }[],\n field: 'rebounds' | 'assists',\n): number {\n return lines.reduce((total, line) => total + line[field], 0);\n}\n\nexport const BASKETBALL_SCOREBOARD: Scoreboard = {\n figures: [\n {\n id: 'points',\n label: BASKETBALL_FIELD_LABELS.player.points,\n value: (teamLine) => teamLine.score,\n },\n {\n id: 'rebounds',\n label: BASKETBALL_FIELD_LABELS.player.rebounds,\n value: (_teamLine, sideLines) => sumOf(sideLines, 'rebounds'),\n },\n {\n id: 'assists',\n label: BASKETBALL_FIELD_LABELS.player.assists,\n value: (_teamLine, sideLines) => sumOf(sideLines, 'assists'),\n },\n {\n id: 'timeouts',\n label: BASKETBALL_FIELD_LABELS.team.timeouts,\n value: (teamLine) => ownTeamLine(teamLine).timeouts,\n },\n ],\n jumpBall: true,\n};\n\nexport const BASKETBALL_SCORING_PANEL: PlayerEventsScoringPanel = {\n kind: 'playerEvents',\n playerEventTypes: [\n ...BASKETBALL_SCORE_EVENT_TYPE_KEYS,\n ...BASKETBALL_PLAYER_TALLY_EVENT_TYPE_KEYS,\n ],\n assistableEventTypes: BASKETBALL_ASSISTABLE_SHOT_EVENT_TYPE_KEYS,\n teamEventTypes: [BASKETBALL_TIMEOUT_EVENT_TYPE],\n};\n\nexport const BASKETBALL_TEAM_SCORE_FLOOR_MESSAGE =\n \"These changes would leave a team's score below zero.\";\n\nconst playerLineValuesSchema = z.strictObject(\n Object.fromEntries(\n BASKETBALL_PLAYER_STAT_KEYS.map((key) => [key, bulkEntryCountField]),\n ) as Record<BasketballPlayerStatKey, typeof bulkEntryCountField>,\n);\n\nfunction currentPlayerCounters(context: BulkEntryContext, entryId: string): PlayerCounters {\n return playerCountersOf(ownStats(context.state).playerStats[entryId]);\n}\n\nfunction bulkDrafts(values: PlayerLinesValues, context: BulkEntryContext): StatEventDraft[] {\n const increases: StatEventDraft[] = [];\n const decreases: StatEventDraft[] = [];\n for (const entryId of context.rosterPlayerIds) {\n const entered = values.lines[entryId];\n const entry = parseGameRosterPlayerId(entryId);\n if (entered === undefined || entry === null) continue;\n const before = currentPlayerCounters(context, entryId);\n for (const stat of BASKETBALL_PLAYER_STAT_KEYS) {\n const value = (entered[stat] ?? before[stat]) - before[stat];\n if (value === 0) continue;\n const draft: StatEventDraft = {\n type: BASKETBALL_BULK_EDIT_EVENT_TYPE,\n teamId: entry.teamId,\n playerUserId: entry.userId,\n stat,\n value,\n previousValue: before[stat],\n };\n (value > 0 ? increases : decreases).push(draft);\n }\n }\n // Every increase before any decrease, so a team's running score never dips below the floor its\n // final score clears — each draft passes `validate` against the state the ones before it leave.\n return [...increases, ...decreases];\n}\n\nexport const BASKETBALL_BULK_ENTRY: PlayerLinesBulkEntry = {\n kind: 'playerLines',\n formDefaults: (context) => ({\n lines: Object.fromEntries(\n context.rosterPlayerIds.map((entryId) => [entryId, currentPlayerCounters(context, entryId)]),\n ),\n }),\n formSchema: (context) => {\n const roster = new Set(context.rosterPlayerIds);\n return z\n .object({ lines: z.record(z.string(), playerLineValuesSchema) })\n .superRefine((values, issues) => {\n for (const entryId of Object.keys(values.lines)) {\n if (!roster.has(entryId)) {\n issues.addIssue({\n code: 'custom',\n path: ['lines', entryId],\n message: NOT_ON_GAME_ROSTER_MESSAGE,\n });\n }\n }\n const state = ownStats(context.state);\n for (const teamId of context.game.teamIds) {\n let score = (state.teamStats[teamId] ?? emptyBasketballTeamLine()).score;\n for (const [entryId, entered] of Object.entries(values.lines)) {\n if (parseGameRosterPlayerId(entryId)?.teamId !== teamId) continue;\n score += entered.points - currentPlayerCounters(context, entryId).points;\n }\n if (score < 0)\n issues.addIssue({\n code: 'custom',\n path: ['lines'],\n message: BASKETBALL_TEAM_SCORE_FLOOR_MESSAGE,\n });\n }\n if (bulkDrafts(values, context).length > MAX_STAT_EVENTS_PER_WRITE) {\n issues.addIssue({\n code: 'custom',\n path: ['lines'],\n message: BULK_ENTRY_TOO_LARGE_MESSAGE,\n });\n }\n });\n },\n toEvents: bulkDrafts,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"basketball.d.ts","sourceRoot":"","sources":["../../src/sports/basketball.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAyDvD,eAAO,MAAM,kBAAkB,EAAE,YAAY,CAAC,YAAY,CA+EzD,CAAC"}
1
+ {"version":3,"file":"basketball.d.ts","sourceRoot":"","sources":["../../src/sports/basketball.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAuDvD,eAAO,MAAM,kBAAkB,EAAE,YAAY,CAAC,YAAY,CA+EzD,CAAC"}
@@ -1,12 +1,8 @@
1
- // The basketball adapter: player-scored — a team's score is the sum of its players' points — with
2
- // a hall of fame and a historical baseline. Its scoring, display, and bulk-entry members are in
3
- // ./basketball-scoring.ts.
4
1
  import { SPORT_LINE_SCHEMAS } from '../doc-schemas/aggregate-stats.js';
5
2
  import { BASKETBALL_PLAYER_STAT_KEYS, BASKETBALL_STAT_EVENT_TYPE_KEYS, BASKETBALL_TEAM_STAT_KEYS, SPORT_KEY_BY_LEAGUE_TYPE, } from '../types/sports.js';
6
3
  import { BASKETBALL_BULK_ENTRY, BASKETBALL_EVENT_LABELS, BASKETBALL_FIELD_LABELS, BASKETBALL_SCOREBOARD, BASKETBALL_SCORING, BASKETBALL_SCORING_PANEL, describeBasketballEvent, emptyBasketballTeamLine, } from './basketball-scoring.js';
7
4
  import { lifetimeSummaryFromColumns } from './lifetime-summary.js';
8
5
  import { GAMES_PLAYED_COLUMN, TEAM_SEASON_BASE_COLUMN, TEAM_SEASON_BASE_COLUMNS, } from './shared-columns.js';
9
- // Each figure's copy, declared once and shared by the player and team columns that show it.
10
6
  const POINTS = { id: 'points', label: 'Points', shortLabel: 'PTS' };
11
7
  const POINTS_PER_GAME = {
12
8
  id: 'pointsPerGame',
@@ -25,7 +21,6 @@ const ASSISTS_PER_GAME = {
25
21
  label: 'Assists per game',
26
22
  shortLabel: 'APG',
27
23
  };
28
- // FP is stored on every player line, never computed for display (`deriveLine` writes it).
29
24
  const FANTASY_POINTS = { id: 'fantasyPoints', label: 'Fantasy points', shortLabel: 'FP' };
30
25
  const FANTASY_POINTS_PER_GAME = {
31
26
  id: 'fantasyPointsPerGame',