@tennisvisuals/scoring-visualizations 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/dist/__tests__/LiveEngine.test.d.ts +2 -0
  2. package/dist/__tests__/LiveEngine.test.d.ts.map +1 -0
  3. package/dist/__tests__/LiveEngine.test.js +142 -0
  4. package/dist/__tests__/LiveEngine.test.js.map +1 -0
  5. package/dist/__tests__/buildEpisodes.test.d.ts +2 -0
  6. package/dist/__tests__/buildEpisodes.test.d.ts.map +1 -0
  7. package/dist/__tests__/buildEpisodes.test.js +150 -0
  8. package/dist/__tests__/buildEpisodes.test.js.map +1 -0
  9. package/dist/__tests__/extractors.test.d.ts +2 -0
  10. package/dist/__tests__/extractors.test.d.ts.map +1 -0
  11. package/dist/__tests__/extractors.test.js +50 -0
  12. package/dist/__tests__/extractors.test.js.map +1 -0
  13. package/dist/__tests__/feedMatchUp.test.d.ts +2 -0
  14. package/dist/__tests__/feedMatchUp.test.d.ts.map +1 -0
  15. package/dist/__tests__/feedMatchUp.test.js +96 -0
  16. package/dist/__tests__/feedMatchUp.test.js.map +1 -0
  17. package/dist/engine/LiveEngine.d.ts +42 -0
  18. package/dist/engine/LiveEngine.d.ts.map +1 -0
  19. package/dist/engine/LiveEngine.js +82 -0
  20. package/dist/engine/LiveEngine.js.map +1 -0
  21. package/dist/engine/buildSetMap.d.ts +14 -0
  22. package/dist/engine/buildSetMap.d.ts.map +1 -0
  23. package/dist/engine/buildSetMap.js +42 -0
  24. package/dist/engine/buildSetMap.js.map +1 -0
  25. package/dist/engine/createPlaybackEngine.d.ts +34 -0
  26. package/dist/engine/createPlaybackEngine.d.ts.map +1 -0
  27. package/dist/engine/createPlaybackEngine.js +90 -0
  28. package/dist/engine/createPlaybackEngine.js.map +1 -0
  29. package/dist/engine/feedMatchUp.d.ts +82 -0
  30. package/dist/engine/feedMatchUp.d.ts.map +1 -0
  31. package/dist/engine/feedMatchUp.js +116 -0
  32. package/dist/engine/feedMatchUp.js.map +1 -0
  33. package/dist/episodes/buildEpisodes.d.ts +10 -0
  34. package/dist/episodes/buildEpisodes.d.ts.map +1 -0
  35. package/dist/episodes/buildEpisodes.js +166 -0
  36. package/dist/episodes/buildEpisodes.js.map +1 -0
  37. package/dist/episodes/types.d.ts +45 -0
  38. package/dist/episodes/types.d.ts.map +1 -0
  39. package/dist/episodes/types.js +2 -0
  40. package/dist/episodes/types.js.map +1 -0
  41. package/dist/index.d.ts +23 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +24 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/statistics/index.d.ts +3 -0
  46. package/dist/statistics/index.d.ts.map +1 -0
  47. package/dist/statistics/index.js +2 -0
  48. package/dist/statistics/index.js.map +1 -0
  49. package/dist/statistics/matchStatistics.d.ts +22 -0
  50. package/dist/statistics/matchStatistics.d.ts.map +1 -0
  51. package/dist/statistics/matchStatistics.js +59 -0
  52. package/dist/statistics/matchStatistics.js.map +1 -0
  53. package/dist/visualizations/coronaChart.d.ts +54 -0
  54. package/dist/visualizations/coronaChart.d.ts.map +1 -0
  55. package/dist/visualizations/coronaChart.js +254 -0
  56. package/dist/visualizations/coronaChart.js.map +1 -0
  57. package/dist/visualizations/data/mcpFixtures.json +13166 -0
  58. package/dist/visualizations/data/sampleGame.d.ts +37 -0
  59. package/dist/visualizations/data/sampleGame.d.ts.map +1 -0
  60. package/dist/visualizations/data/sampleGame.js +521 -0
  61. package/dist/visualizations/data/sampleGame.js.map +1 -0
  62. package/dist/visualizations/gameFish.d.ts +16 -0
  63. package/dist/visualizations/gameFish.d.ts.map +1 -0
  64. package/dist/visualizations/gameFish.js +692 -0
  65. package/dist/visualizations/gameFish.js.map +1 -0
  66. package/dist/visualizations/gameTree.d.ts +17 -0
  67. package/dist/visualizations/gameTree.d.ts.map +1 -0
  68. package/dist/visualizations/gameTree.js +837 -0
  69. package/dist/visualizations/gameTree.js.map +1 -0
  70. package/dist/visualizations/groupGames.d.ts +6 -0
  71. package/dist/visualizations/groupGames.d.ts.map +1 -0
  72. package/dist/visualizations/groupGames.js +35 -0
  73. package/dist/visualizations/groupGames.js.map +1 -0
  74. package/dist/visualizations/helpers/JsonViewer.d.ts +27 -0
  75. package/dist/visualizations/helpers/JsonViewer.d.ts.map +1 -0
  76. package/dist/visualizations/helpers/JsonViewer.js +276 -0
  77. package/dist/visualizations/helpers/JsonViewer.js.map +1 -0
  78. package/dist/visualizations/helpers/PlaybackControls.d.ts +12 -0
  79. package/dist/visualizations/helpers/PlaybackControls.d.ts.map +1 -0
  80. package/dist/visualizations/helpers/PlaybackControls.js +98 -0
  81. package/dist/visualizations/helpers/PlaybackControls.js.map +1 -0
  82. package/dist/visualizations/horizonChart.d.ts +59 -0
  83. package/dist/visualizations/horizonChart.d.ts.map +1 -0
  84. package/dist/visualizations/horizonChart.js +215 -0
  85. package/dist/visualizations/horizonChart.js.map +1 -0
  86. package/dist/visualizations/index.d.ts +21 -0
  87. package/dist/visualizations/index.d.ts.map +1 -0
  88. package/dist/visualizations/index.js +23 -0
  89. package/dist/visualizations/index.js.map +1 -0
  90. package/dist/visualizations/legacyRally.d.ts +3 -0
  91. package/dist/visualizations/legacyRally.d.ts.map +1 -0
  92. package/dist/visualizations/legacyRally.js +26 -0
  93. package/dist/visualizations/legacyRally.js.map +1 -0
  94. package/dist/visualizations/matchDashboard.d.ts +39 -0
  95. package/dist/visualizations/matchDashboard.d.ts.map +1 -0
  96. package/dist/visualizations/matchDashboard.js +235 -0
  97. package/dist/visualizations/matchDashboard.js.map +1 -0
  98. package/dist/visualizations/momentumChart.d.ts +12 -0
  99. package/dist/visualizations/momentumChart.d.ts.map +1 -0
  100. package/dist/visualizations/momentumChart.js +454 -0
  101. package/dist/visualizations/momentumChart.js.map +1 -0
  102. package/dist/visualizations/ptsChart.d.ts +14 -0
  103. package/dist/visualizations/ptsChart.d.ts.map +1 -0
  104. package/dist/visualizations/ptsChart.js +925 -0
  105. package/dist/visualizations/ptsChart.js.map +1 -0
  106. package/dist/visualizations/ptsHorizon.d.ts +83 -0
  107. package/dist/visualizations/ptsHorizon.d.ts.map +1 -0
  108. package/dist/visualizations/ptsHorizon.js +290 -0
  109. package/dist/visualizations/ptsHorizon.js.map +1 -0
  110. package/dist/visualizations/rallyTree.d.ts +78 -0
  111. package/dist/visualizations/rallyTree.d.ts.map +1 -0
  112. package/dist/visualizations/rallyTree.js +410 -0
  113. package/dist/visualizations/rallyTree.js.map +1 -0
  114. package/dist/visualizations/simpleChart.d.ts +6 -0
  115. package/dist/visualizations/simpleChart.d.ts.map +1 -0
  116. package/dist/visualizations/simpleChart.js +126 -0
  117. package/dist/visualizations/simpleChart.js.map +1 -0
  118. package/dist/visualizations/statView.d.ts +52 -0
  119. package/dist/visualizations/statView.d.ts.map +1 -0
  120. package/dist/visualizations/statView.js +200 -0
  121. package/dist/visualizations/statView.js.map +1 -0
  122. package/dist/visualizations/typeOf.d.ts +6 -0
  123. package/dist/visualizations/typeOf.d.ts.map +1 -0
  124. package/dist/visualizations/typeOf.js +18 -0
  125. package/dist/visualizations/typeOf.js.map +1 -0
  126. package/dist/visualizations/types/events.d.ts +92 -0
  127. package/dist/visualizations/types/events.d.ts.map +1 -0
  128. package/dist/visualizations/types/events.js +2 -0
  129. package/dist/visualizations/types/events.js.map +1 -0
  130. package/dist/visualizations/types/index.d.ts +79 -0
  131. package/dist/visualizations/types/index.d.ts.map +1 -0
  132. package/dist/visualizations/types/index.js +8 -0
  133. package/dist/visualizations/types/index.js.map +1 -0
  134. package/dist/visualizations/utils/arrays.d.ts +18 -0
  135. package/dist/visualizations/utils/arrays.d.ts.map +1 -0
  136. package/dist/visualizations/utils/arrays.js +46 -0
  137. package/dist/visualizations/utils/arrays.js.map +1 -0
  138. package/dist/visualizations/utils/colorUtils.d.ts +36 -0
  139. package/dist/visualizations/utils/colorUtils.d.ts.map +1 -0
  140. package/dist/visualizations/utils/colorUtils.js +112 -0
  141. package/dist/visualizations/utils/colorUtils.js.map +1 -0
  142. package/dist/visualizations/utils/generateId.d.ts +2 -0
  143. package/dist/visualizations/utils/generateId.d.ts.map +1 -0
  144. package/dist/visualizations/utils/generateId.js +3 -0
  145. package/dist/visualizations/utils/generateId.js.map +1 -0
  146. package/dist/visualizations/utils/keyWalk.d.ts +2 -0
  147. package/dist/visualizations/utils/keyWalk.d.ts.map +1 -0
  148. package/dist/visualizations/utils/keyWalk.js +19 -0
  149. package/dist/visualizations/utils/keyWalk.js.map +1 -0
  150. package/dist/visualizations/utils/math.d.ts +10 -0
  151. package/dist/visualizations/utils/math.d.ts.map +1 -0
  152. package/dist/visualizations/utils/math.js +14 -0
  153. package/dist/visualizations/utils/math.js.map +1 -0
  154. package/dist/visualizations/utils/setDev.d.ts +29 -0
  155. package/dist/visualizations/utils/setDev.d.ts.map +1 -0
  156. package/dist/visualizations/utils/setDev.js +35 -0
  157. package/dist/visualizations/utils/setDev.js.map +1 -0
  158. package/package.json +57 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LiveEngine.js","sourceRoot":"","sources":["../../src/engine/LiveEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,wEAAwE;AACxE,gEAAgE;AAChE,MAAM,EAAE,aAAa,EAAE,GAAG,aAAa,CAAC;AAIxC,MAAM,OAAO,UAAU;IACb,MAAM,CAAM;IACZ,SAAS,GAAkB,IAAI,GAAG,EAAE,CAAC;IAE7C,YAAY,MAAY;QACtB,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,aAAa,CAAC,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,mEAAmE;IACnE,SAAS,CAAC,EAAY;QACpB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvB,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC,CAAC;IACJ,CAAC;IAEO,MAAM;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAChC,EAAE,CAAC,KAAK,CAAC,CAAC;QACZ,CAAC;IACH,CAAC;IAED,kEAAkE;IAElE,QAAQ,CAAC,IAA8E;QACrF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,KAAc;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,MAAM;YAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,KAAc;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,MAAM;YAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,SAAS,CAAC,UAAkB,EAAE,OAA4B,EAAE,OAAmC;QAC7F,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,kEAAkE;IAElE,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IAClC,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;IACrC,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;IACrC,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Build a SetMap from ScoringEngine MatchUp state for coronaChart.
3
+ *
4
+ * For each set, computes cumulative point differential (p2sdiff)
5
+ * and extracts gamesScore and winnerIndex.
6
+ */
7
+ export interface SetMap {
8
+ p2sdiff: number[];
9
+ gamesScore: [number, number];
10
+ players: [string, string];
11
+ winnerIndex: 0 | 1;
12
+ }
13
+ export declare function buildSetMap(matchUp: any, players?: [string, string]): SetMap[];
14
+ //# sourceMappingURL=buildSetMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildSetMap.d.ts","sourceRoot":"","sources":["../../src/engine/buildSetMap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,GAAE,CAAC,MAAM,EAAE,MAAM,CAA4B,GAAG,MAAM,EAAE,CAuCxG"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Build a SetMap from ScoringEngine MatchUp state for coronaChart.
3
+ *
4
+ * For each set, computes cumulative point differential (p2sdiff)
5
+ * and extracts gamesScore and winnerIndex.
6
+ */
7
+ export function buildSetMap(matchUp, players = ['Player 1', 'Player 2']) {
8
+ const points = matchUp?.history?.points;
9
+ const sets = matchUp?.score?.sets;
10
+ if (!Array.isArray(points) || points.length === 0)
11
+ return [];
12
+ // Group points by set index
13
+ const setPoints = new Map();
14
+ for (const pt of points) {
15
+ const setIdx = pt.set ?? 0;
16
+ if (!setPoints.has(setIdx))
17
+ setPoints.set(setIdx, []);
18
+ setPoints.get(setIdx).push(pt);
19
+ }
20
+ const result = [];
21
+ for (const [setIdx, pts] of setPoints) {
22
+ let diff = 0;
23
+ const diffs = [];
24
+ for (const pt of pts) {
25
+ diff += pt.winner === 0 ? 1 : -1;
26
+ diffs.push(diff);
27
+ }
28
+ const setData = Array.isArray(sets) ? sets[setIdx] : undefined;
29
+ const gamesScore = setData
30
+ ? [setData.side1Score ?? 0, setData.side2Score ?? 0]
31
+ : [0, 0];
32
+ const winnerIdx = setData?.winningSide === 2 ? 1 : 0;
33
+ result.push({
34
+ p2sdiff: diffs,
35
+ gamesScore: gamesScore,
36
+ players,
37
+ winnerIndex: winnerIdx,
38
+ });
39
+ }
40
+ return result;
41
+ }
42
+ //# sourceMappingURL=buildSetMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildSetMap.js","sourceRoot":"","sources":["../../src/engine/buildSetMap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,UAAU,WAAW,CAAC,OAAY,EAAE,UAA4B,CAAC,UAAU,EAAE,UAAU,CAAC;IAC5F,MAAM,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC;IACxC,MAAM,IAAI,GAAG,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;IAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE7D,4BAA4B;IAC5B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC3C,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACtD,SAAS,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC;QACtC,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,IAAI,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/D,MAAM,UAAU,GAAqB,OAAO;YAC1C,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,EAAE,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEX,MAAM,SAAS,GAAU,OAAO,EAAE,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5D,MAAM,CAAC,IAAI,CAAC;YACV,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,UAAU;YACtB,OAAO;YACP,WAAW,EAAE,SAAS;SACvB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Playback Engine — Incrementally feeds MCP fixture points into a LiveEngine
3
+ *
4
+ * Shared utility for Storybook stories. Provides auto-play with configurable
5
+ * delay, step forward/back (via undo), pause, and reset.
6
+ *
7
+ * Usage:
8
+ * const playback = createPlaybackEngine({ matchIndex: 0, delayMs: 200 });
9
+ * playback.liveEngine.subscribe(matchUp => chart.data(buildEpisodes(matchUp)));
10
+ * playback.start();
11
+ */
12
+ import { LiveEngine } from './LiveEngine';
13
+ import { getMcpFixture } from './feedMatchUp';
14
+ export interface PlaybackControls {
15
+ liveEngine: LiveEngine;
16
+ start(): void;
17
+ pause(): void;
18
+ stepForward(): void;
19
+ stepBack(): void;
20
+ reset(): void;
21
+ isPlaying(): boolean;
22
+ getProgress(): {
23
+ current: number;
24
+ total: number;
25
+ };
26
+ getFixture(): ReturnType<typeof getMcpFixture>;
27
+ destroy(): void;
28
+ }
29
+ export declare function createPlaybackEngine(options: {
30
+ matchIndex?: number;
31
+ delayMs?: number;
32
+ onComplete?: () => void;
33
+ }): PlaybackControls;
34
+ //# sourceMappingURL=createPlaybackEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createPlaybackEngine.d.ts","sourceRoot":"","sources":["../../src/engine/createPlaybackEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAc,MAAM,eAAe,CAAC;AAM1D,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,IAAI,IAAI,CAAC;IACd,KAAK,IAAI,IAAI,CAAC;IACd,WAAW,IAAI,IAAI,CAAC;IACpB,QAAQ,IAAI,IAAI,CAAC;IACjB,KAAK,IAAI,IAAI,CAAC;IACd,SAAS,IAAI,OAAO,CAAC;IACrB,WAAW,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,UAAU,IAAI,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;IAC/C,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,GAAG,gBAAgB,CAmFnB"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Playback Engine — Incrementally feeds MCP fixture points into a LiveEngine
3
+ *
4
+ * Shared utility for Storybook stories. Provides auto-play with configurable
5
+ * delay, step forward/back (via undo), pause, and reset.
6
+ *
7
+ * Usage:
8
+ * const playback = createPlaybackEngine({ matchIndex: 0, delayMs: 200 });
9
+ * playback.liveEngine.subscribe(matchUp => chart.data(buildEpisodes(matchUp)));
10
+ * playback.start();
11
+ */
12
+ import { LiveEngine } from './LiveEngine';
13
+ import { getMcpFixture, RESULT_MAP } from './feedMatchUp';
14
+ import { scoreGovernor } from 'tods-competition-factory';
15
+ const { ScoringEngine } = scoreGovernor;
16
+ export function createPlaybackEngine(options) {
17
+ const { matchIndex = 0, delayMs = 200, onComplete } = options;
18
+ const fixture = getMcpFixture(matchIndex);
19
+ const points = fixture.points;
20
+ const engine = new ScoringEngine({ matchUpFormat: 'SET3-S:6/TB7' });
21
+ const liveEngine = new LiveEngine(engine);
22
+ let cursor = 0;
23
+ let timer = null;
24
+ let playing = false;
25
+ function feedNextPoint() {
26
+ if (cursor >= points.length) {
27
+ pause();
28
+ onComplete?.();
29
+ return false;
30
+ }
31
+ const pt = points[cursor];
32
+ liveEngine.addPoint({
33
+ winner: pt.winner,
34
+ server: pt.server,
35
+ result: RESULT_MAP[pt.result] || 'Winner',
36
+ rallyLength: pt.rallyLength,
37
+ });
38
+ cursor++;
39
+ return true;
40
+ }
41
+ function start() {
42
+ if (playing)
43
+ return;
44
+ playing = true;
45
+ timer = setInterval(() => {
46
+ if (!feedNextPoint()) {
47
+ pause();
48
+ }
49
+ }, delayMs);
50
+ }
51
+ function pause() {
52
+ playing = false;
53
+ if (timer !== null) {
54
+ clearInterval(timer);
55
+ timer = null;
56
+ }
57
+ }
58
+ function stepForward() {
59
+ pause();
60
+ feedNextPoint();
61
+ }
62
+ function stepBack() {
63
+ pause();
64
+ if (cursor > 0) {
65
+ liveEngine.undo();
66
+ cursor--;
67
+ }
68
+ }
69
+ function reset() {
70
+ pause();
71
+ liveEngine.reset();
72
+ cursor = 0;
73
+ }
74
+ function destroy() {
75
+ pause();
76
+ }
77
+ return {
78
+ liveEngine,
79
+ start,
80
+ pause,
81
+ stepForward,
82
+ stepBack,
83
+ reset,
84
+ isPlaying: () => playing,
85
+ getProgress: () => ({ current: cursor, total: points.length }),
86
+ getFixture: () => fixture,
87
+ destroy,
88
+ };
89
+ }
90
+ //# sourceMappingURL=createPlaybackEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createPlaybackEngine.js","sourceRoot":"","sources":["../../src/engine/createPlaybackEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Feed MCP fixture data into the factory ScoringEngine
3
+ *
4
+ * Thin wrapper: iterates points, calls addPoint(), returns getState().
5
+ * No scoring logic lives here — the ScoringEngine is the single source of truth.
6
+ */
7
+ interface McpPoint {
8
+ index: number;
9
+ set: number;
10
+ game: number;
11
+ score: string;
12
+ server: number;
13
+ winner: number;
14
+ result: string;
15
+ error: string | null;
16
+ serves: string[];
17
+ rally: string[];
18
+ rallyLength: number;
19
+ totalShots: number;
20
+ breakpoint: number | null;
21
+ gamepoint: number | null;
22
+ tiebreak: boolean;
23
+ code: string;
24
+ }
25
+ interface McpFixture {
26
+ matchId: number;
27
+ players: [string, string];
28
+ tournament: {
29
+ name: string;
30
+ division: string;
31
+ date: string | null;
32
+ tour: string;
33
+ };
34
+ score: {
35
+ sets?: Array<{
36
+ games: [number, number];
37
+ complete: boolean;
38
+ }>;
39
+ match_score?: string;
40
+ winner?: string;
41
+ loser?: string;
42
+ };
43
+ sets: Array<{
44
+ games: Array<{
45
+ range: [number, number];
46
+ winner: string;
47
+ score: [number, number];
48
+ tiebreak: boolean;
49
+ }>;
50
+ winner?: number;
51
+ }>;
52
+ points: McpPoint[];
53
+ totalPoints: number;
54
+ }
55
+ export declare const RESULT_MAP: Record<string, string>;
56
+ /**
57
+ * Feed a single MCP fixture match through the ScoringEngine.
58
+ *
59
+ * @param matchIndex - Index into mcpFixtures array (wraps around)
60
+ * @returns The ScoringEngine MatchUp state (with enriched history points)
61
+ */
62
+ export declare function feedMatchUp(matchIndex?: number): any;
63
+ /**
64
+ * Feed all MCP fixtures through the ScoringEngine.
65
+ */
66
+ export declare function feedAllMatchUps(): any[];
67
+ /**
68
+ * Get the raw MCP fixture data (for metadata like player names, tournament).
69
+ */
70
+ export declare function getMcpFixture(matchIndex?: number): McpFixture;
71
+ /**
72
+ * Extract rally lengths from a ScoringEngine MatchUp, grouped by winner.
73
+ * Returns [player0Rallies, player1Rallies] for simpleChart.
74
+ */
75
+ export declare function extractRallyLengths(matchUp: any): number[][];
76
+ /**
77
+ * Extract points for a single game from a ScoringEngine MatchUp.
78
+ * Used by gameFish stories. Returns legacy Point[] shape.
79
+ */
80
+ export declare function extractGamePoints(matchUp: any, setIdx?: number, gameIdx?: number): any[];
81
+ export {};
82
+ //# sourceMappingURL=feedMatchUp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedMatchUp.d.ts","sourceRoot":"","sources":["../../src/engine/feedMatchUp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,UAAU,QAAQ;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,KAAK,EAAE;QACL,IAAI,CAAC,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAAC,QAAQ,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;QAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,IAAI,EAAE,KAAK,CAAC;QACV,KAAK,EAAE,KAAK,CAAC;YACX,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACxB,MAAM,EAAE,MAAM,CAAC;YACf,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACxB,QAAQ,EAAE,OAAO,CAAC;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAU7C,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,UAAU,SAAI,GAAG,GAAG,CA4B/C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,GAAG,EAAE,CAEvC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,SAAI,GAAG,UAAU,CAExD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,EAAE,EAAE,CAW5D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,SAAI,EAAE,OAAO,SAAI,GAAG,GAAG,EAAE,CA4B9E"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Feed MCP fixture data into the factory ScoringEngine
3
+ *
4
+ * Thin wrapper: iterates points, calls addPoint(), returns getState().
5
+ * No scoring logic lives here — the ScoringEngine is the single source of truth.
6
+ */
7
+ import { scoreGovernor } from 'tods-competition-factory';
8
+ import mcpFixtures from '../visualizations/data/mcpFixtures.json';
9
+ const { ScoringEngine } = scoreGovernor;
10
+ const fixtures = mcpFixtures;
11
+ const UNFORCED_ERROR = 'Unforced Error';
12
+ export const RESULT_MAP = {
13
+ 'Ace': 'Ace',
14
+ 'Winner': 'Winner',
15
+ 'Serve Winner': 'Serve Winner',
16
+ 'Unforced Error': UNFORCED_ERROR,
17
+ 'Forced Error': 'Forced Error',
18
+ 'Double Fault': 'Double Fault',
19
+ 'Net': UNFORCED_ERROR,
20
+ 'Out': UNFORCED_ERROR,
21
+ 'Return Winner': 'Winner',
22
+ };
23
+ /**
24
+ * Feed a single MCP fixture match through the ScoringEngine.
25
+ *
26
+ * @param matchIndex - Index into mcpFixtures array (wraps around)
27
+ * @returns The ScoringEngine MatchUp state (with enriched history points)
28
+ */
29
+ export function feedMatchUp(matchIndex = 0) {
30
+ const fixture = fixtures[matchIndex % fixtures.length];
31
+ const engine = new ScoringEngine({ matchUpFormat: 'SET3-S:6/TB7' });
32
+ for (const pt of fixture.points) {
33
+ engine.addPoint({
34
+ winner: pt.winner,
35
+ server: pt.server,
36
+ result: (RESULT_MAP[pt.result] || 'Winner'),
37
+ rallyLength: pt.rallyLength,
38
+ });
39
+ }
40
+ const matchUp = engine.getState();
41
+ // Enrich engine points with MCP-specific fields the ScoringEngine doesn't track
42
+ if (matchUp?.history?.points) {
43
+ for (let i = 0; i < matchUp.history.points.length; i++) {
44
+ const enginePt = matchUp.history.points[i];
45
+ const mcpPt = fixture.points[i];
46
+ if (enginePt && mcpPt) {
47
+ enginePt.mcpCode = mcpPt.code;
48
+ enginePt.tiebreak = mcpPt.tiebreak;
49
+ }
50
+ }
51
+ }
52
+ return matchUp;
53
+ }
54
+ /**
55
+ * Feed all MCP fixtures through the ScoringEngine.
56
+ */
57
+ export function feedAllMatchUps() {
58
+ return fixtures.map((_, i) => feedMatchUp(i));
59
+ }
60
+ /**
61
+ * Get the raw MCP fixture data (for metadata like player names, tournament).
62
+ */
63
+ export function getMcpFixture(matchIndex = 0) {
64
+ return fixtures[matchIndex % fixtures.length];
65
+ }
66
+ /**
67
+ * Extract rally lengths from a ScoringEngine MatchUp, grouped by winner.
68
+ * Returns [player0Rallies, player1Rallies] for simpleChart.
69
+ */
70
+ export function extractRallyLengths(matchUp) {
71
+ const points = matchUp?.history?.points;
72
+ if (!Array.isArray(points))
73
+ return [[], []];
74
+ const p0 = [];
75
+ const p1 = [];
76
+ for (const pt of points) {
77
+ if (pt.winner === 0)
78
+ p0.push(pt.rallyLength ?? 0);
79
+ else
80
+ p1.push(pt.rallyLength ?? 0);
81
+ }
82
+ return [p0, p1];
83
+ }
84
+ /**
85
+ * Extract points for a single game from a ScoringEngine MatchUp.
86
+ * Used by gameFish stories. Returns legacy Point[] shape.
87
+ */
88
+ export function extractGamePoints(matchUp, setIdx = 0, gameIdx = 0) {
89
+ const points = matchUp?.history?.points;
90
+ if (!Array.isArray(points))
91
+ return [];
92
+ const gamePoints = points.filter((pt) => pt.set === setIdx && pt.game === gameIdx);
93
+ let p0 = 0;
94
+ let p1 = 0;
95
+ return gamePoints.map((pt, i) => {
96
+ if (pt.winner === 0)
97
+ p0++;
98
+ else
99
+ p1++;
100
+ return {
101
+ index: i,
102
+ game: gameIdx,
103
+ set: setIdx,
104
+ server: pt.server,
105
+ winner: pt.winner,
106
+ notation: pt.mcpCode,
107
+ rallyLength: pt.rallyLength,
108
+ result: pt.result,
109
+ score: pt.score,
110
+ points: [p0, p1],
111
+ tiebreak: pt.tiebreak ?? false,
112
+ breakpoint: pt.isBreakpoint ?? false,
113
+ };
114
+ });
115
+ }
116
+ //# sourceMappingURL=feedMatchUp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedMatchUp.js","sourceRoot":"","sources":["../../src/engine/feedMatchUp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Episode } from './types';
2
+ /**
3
+ * Transforms a ScoringEngine MatchUp into an Episode array
4
+ * suitable for visualization components (GameTree, Momentum, PTS, GameFish, Corona).
5
+ *
6
+ * @param matchUp - A MatchUp object from ScoringEngine.getState()
7
+ * @returns Episode[] - Array of episodes, one per point played
8
+ */
9
+ export declare function buildEpisodes(matchUp: any): Episode[];
10
+ //# sourceMappingURL=buildEpisodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildEpisodes.d.ts","sourceRoot":"","sources":["../../src/episodes/buildEpisodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,EAAE,CAyIrD"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Transforms a ScoringEngine MatchUp into an Episode array
3
+ * suitable for visualization components (GameTree, Momentum, PTS, GameFish, Corona).
4
+ *
5
+ * @param matchUp - A MatchUp object from ScoringEngine.getState()
6
+ * @returns Episode[] - Array of episodes, one per point played
7
+ */
8
+ export function buildEpisodes(matchUp) {
9
+ const points = matchUp?.history?.points;
10
+ if (!Array.isArray(points) || points.length === 0)
11
+ return [];
12
+ const episodes = [];
13
+ // Track running state
14
+ let setCumulativePoints = [0, 0];
15
+ let gamePointCounts = [0, 0];
16
+ let gamesScore = [0, 0];
17
+ let setsScore = [0, 0];
18
+ let currentSet = 0;
19
+ let currentGame = 0;
20
+ for (let i = 0; i < points.length; i++) {
21
+ const point = points[i];
22
+ const nextPoint = points[i + 1];
23
+ // Detect boundaries
24
+ const gameComplete = nextPoint
25
+ ? nextPoint.game !== point.game || nextPoint.set !== point.set
26
+ : false;
27
+ const setComplete = nextPoint ? nextPoint.set !== point.set : false;
28
+ const isLastPoint = i === points.length - 1;
29
+ const matchComplete = isLastPoint && matchUp?.winningSide !== undefined;
30
+ // Handle set transition: reset per-set accumulators
31
+ if (point.set !== currentSet) {
32
+ setCumulativePoints = [0, 0];
33
+ gamePointCounts = [0, 0];
34
+ gamesScore = [0, 0];
35
+ currentSet = point.set;
36
+ currentGame = point.game;
37
+ }
38
+ // Handle game transition: reset within-game point counts
39
+ if (point.game !== currentGame) {
40
+ gamePointCounts = [0, 0];
41
+ currentGame = point.game;
42
+ }
43
+ // Update cumulative set points
44
+ if (point.winner === 0)
45
+ setCumulativePoints[0]++;
46
+ else
47
+ setCumulativePoints[1]++;
48
+ // Update within-game point counts
49
+ if (point.winner === 0)
50
+ gamePointCounts[0]++;
51
+ else
52
+ gamePointCounts[1]++;
53
+ // Determine game winner when game completes
54
+ const isGameEnd = gameComplete || (isLastPoint && matchComplete);
55
+ let gameWinner;
56
+ if (isGameEnd) {
57
+ gameWinner = point.winner;
58
+ }
59
+ // Update games score AFTER determining game winner
60
+ const episodeGamesScore = [...gamesScore];
61
+ if (isGameEnd && gameWinner !== undefined) {
62
+ episodeGamesScore[gameWinner]++;
63
+ }
64
+ // Determine set winner
65
+ const isSetEnd = setComplete || (isLastPoint && matchComplete);
66
+ let setWinner;
67
+ if (isSetEnd) {
68
+ setWinner = sideToIndex(deriveSetWinner(matchUp, point.set));
69
+ }
70
+ // Build cumulative sets array with current scores
71
+ const episodeSetsScore = [...setsScore];
72
+ if (isSetEnd && setWinner !== undefined) {
73
+ episodeSetsScore[setWinner]++;
74
+ }
75
+ const setsArray = buildSetsArray(matchUp, point.set);
76
+ // Score display: show "G" for game-completing points
77
+ const displayScore = isGameEnd ? 'G' : point.score || '';
78
+ const episode = {
79
+ action: 'addPoint',
80
+ point: {
81
+ winner: point.winner,
82
+ server: point.server,
83
+ pointNumber: point.pointNumber,
84
+ index: point.index ?? i,
85
+ isBreakpoint: point.isBreakpoint ?? false,
86
+ score: displayScore,
87
+ set: point.set,
88
+ game: point.game,
89
+ rallyLength: point.rallyLength,
90
+ result: point.result,
91
+ notation: point.mcpCode,
92
+ tiebreak: point.tiebreak ?? false,
93
+ serve: point.serve, // 1 = first serve, 2 = second serve
94
+ points: [...gamePointCounts],
95
+ setCumulativePoints: [...setCumulativePoints],
96
+ },
97
+ game: {
98
+ complete: isGameEnd,
99
+ winner: gameWinner,
100
+ games: episodeGamesScore,
101
+ index: point.game,
102
+ },
103
+ set: {
104
+ complete: isSetEnd,
105
+ winner: setWinner,
106
+ sets: setsArray,
107
+ index: point.set,
108
+ },
109
+ needed: {
110
+ pointsToGame: point.pointsToGame ?? [0, 0],
111
+ pointsToSet: point.pointsToSet ?? [0, 0],
112
+ gamesToSet: point.gamesToSet ?? [0, 0],
113
+ },
114
+ nextService: nextPoint?.server ?? point.server,
115
+ result: true,
116
+ complete: isLastPoint && matchComplete,
117
+ };
118
+ episodes.push(episode);
119
+ // Update running gamesScore after game completion
120
+ if (gameComplete && gameWinner !== undefined) {
121
+ gamesScore[gameWinner]++;
122
+ gamePointCounts = [0, 0];
123
+ }
124
+ // Update running setsScore after set completion
125
+ if (setComplete && setWinner !== undefined) {
126
+ setsScore[setWinner]++;
127
+ // Reset gamesScore for new set
128
+ gamesScore = [0, 0];
129
+ }
130
+ }
131
+ return episodes;
132
+ }
133
+ /**
134
+ * Convert ScoringEngine's winningSide (1 or 2) to 0-based index (0 or 1).
135
+ */
136
+ function sideToIndex(winningSide) {
137
+ if (winningSide === 1)
138
+ return 0;
139
+ if (winningSide === 2)
140
+ return 1;
141
+ return undefined;
142
+ }
143
+ /**
144
+ * Get winningSide for a completed set.
145
+ */
146
+ function deriveSetWinner(matchUp, setIndex) {
147
+ const sets = matchUp?.score?.sets;
148
+ if (!Array.isArray(sets) || !sets[setIndex])
149
+ return undefined;
150
+ return sets[setIndex].winningSide;
151
+ }
152
+ /**
153
+ * Build cumulative sets score array up to the given set index.
154
+ */
155
+ function buildSetsArray(matchUp, currentSetIndex) {
156
+ const sets = matchUp?.score?.sets;
157
+ if (!Array.isArray(sets))
158
+ return [];
159
+ const result = [];
160
+ for (let i = 0; i <= currentSetIndex && i < sets.length; i++) {
161
+ const s = sets[i];
162
+ result.push([s.side1Score ?? 0, s.side2Score ?? 0]);
163
+ }
164
+ return result;
165
+ }
166
+ //# sourceMappingURL=buildEpisodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildEpisodes.js","sourceRoot":"","sources":["../../src/episodes/buildEpisodes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ export interface EpisodePoint {
2
+ winner: number;
3
+ server: number;
4
+ pointNumber: number;
5
+ index: number;
6
+ isBreakpoint: boolean;
7
+ score: string;
8
+ set: number;
9
+ game: number;
10
+ rallyLength?: number;
11
+ result?: string;
12
+ notation?: string;
13
+ tiebreak?: boolean;
14
+ serve?: 1 | 2;
15
+ points?: [number, number];
16
+ setCumulativePoints?: [number, number];
17
+ }
18
+ export interface EpisodeGame {
19
+ complete: boolean;
20
+ winner: number | undefined;
21
+ games: number[];
22
+ index: number;
23
+ }
24
+ export interface EpisodeSet {
25
+ complete: boolean;
26
+ winner: number | undefined;
27
+ sets: number[][];
28
+ index: number;
29
+ }
30
+ export interface EpisodeNeeded {
31
+ pointsToGame: number[];
32
+ pointsToSet: number[];
33
+ gamesToSet: number[];
34
+ }
35
+ export interface Episode {
36
+ action: 'addPoint';
37
+ point: EpisodePoint;
38
+ game: EpisodeGame;
39
+ set: EpisodeSet;
40
+ needed: EpisodeNeeded;
41
+ nextService: number;
42
+ result: boolean;
43
+ complete: boolean;
44
+ }
45
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/episodes/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IAEb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACd,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,WAAW,CAAC;IAClB,GAAG,EAAE,UAAU,CAAC;IAChB,MAAM,EAAE,aAAa,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB"}