overtime-utils 0.2.48 → 0.2.49

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.
@@ -1,372 +1,372 @@
1
- import {
2
- AWAY_TEAM_MARKET_TYPES,
3
- CORRECT_SCORE_MARKET_TYPES,
4
- DOUBLE_CHANCE_MARKET_TYPES,
5
- DRAW_NO_BET_MARKET_TYPES,
6
- HOME_TEAM_MARKET_TYPES,
7
- METHOD_OF_VICTORY_MARKET_TYPES,
8
- RACE_TO_MARKET_TYPES,
9
- SCORE_MARKET_TYPES,
10
- TOTAL_EXACT_MARKET_TYPES,
11
- TOTAL_ODD_EVEN_MARKET_TYPES,
12
- TWO_WAY_WINNER_MARKET_TYPES,
13
- WINNER_MARKET_TYPES,
14
- YES_NO_OUTCOME_MARKET_TYPES,
15
- } from '../constants/marketTypes';
16
- import { MarketType, ResultType } from '../enums/marketTypes';
17
-
18
- // Outcome grouping enum
19
- export enum OutcomeGroup {
20
- YES_NO = 'YES_NO',
21
- ODD_EVEN = 'ODD_EVEN',
22
- SCORE_HOME_AWAY_NO = 'SCORE_HOME_AWAY_NO',
23
- DOUBLE_CHANCE = 'DOUBLE_CHANCE',
24
- HALFTIME_FULLTIME = 'HALFTIME_FULLTIME',
25
- WINNING_ROUND = 'WINNING_ROUND',
26
- ENDING_METHOD = 'ENDING_METHOD',
27
- METHOD_OF_VICTORY = 'METHOD_OF_VICTORY',
28
- WINNER_THREE_WAY = 'WINNER_THREE_WAY',
29
- WINNER_TWO_WAY = 'WINNER_TWO_WAY',
30
- TOTAL_EXACT_HOME = 'TOTAL_EXACT_HOME',
31
- TOTAL_EXACT_AWAY = 'TOTAL_EXACT_AWAY',
32
- CORRECT_SCORE = 'CORRECT_SCORE',
33
- OVER_UNDER = 'OVER_UNDER',
34
- OVER_UNDER_HOME = 'OVER_UNDER_HOME',
35
- OVER_UNDER_AWAY = 'OVER_UNDER_AWAY',
36
- SPREAD_TWO_WAY = 'SPREAD_TWO_WAY',
37
- }
38
-
39
- const makeExactTotals = (prefix: 'home' | 'away'): string[] => [
40
- `${prefix} 0`,
41
- `${prefix} 1`,
42
- `${prefix} 2`,
43
- `${prefix} 3`,
44
- `${prefix} 4`,
45
- `${prefix} 5`,
46
- `${prefix} 3+`,
47
- `${prefix} 4+`,
48
- `${prefix} 5+`,
49
- ];
50
-
51
- // Exhaustive correct score outcomes
52
- const CORRECT_SCORE_OUTCOMES: string[] = [
53
- 'draw 0:0',
54
- 'draw 1:1',
55
- 'draw 2:2',
56
- 'draw 3:3',
57
- 'draw 4:4',
58
- 'home 1:0',
59
- 'home 2:0',
60
- 'home 2:1',
61
- 'home 3:0',
62
- 'home 3:1',
63
- 'home 3:2',
64
- 'home 4:0',
65
- 'home 4:1',
66
- 'home 4:2',
67
- 'home 4:3',
68
- 'away 1:0',
69
- 'away 2:0',
70
- 'away 2:1',
71
- 'away 3:0',
72
- 'away 3:1',
73
- 'away 3:2',
74
- 'away 4:0',
75
- 'away 4:1',
76
- 'away 4:2',
77
- 'away 4:3',
78
- 'draw 5:5',
79
- 'draw 6:6',
80
- 'draw 7:7',
81
- 'draw 8:8',
82
- 'draw 9:9',
83
- 'draw 10:10',
84
- 'draw 11:11',
85
- 'draw 12:12',
86
- 'draw 13:13',
87
- 'draw 14:14',
88
- 'home 5:0',
89
- 'home 5:1',
90
- 'home 5:2',
91
- 'home 5:3',
92
- 'home 5:4',
93
- 'home 6:0',
94
- 'home 6:1',
95
- 'home 6:2',
96
- 'home 6:3',
97
- 'home 6:4',
98
- 'home 6:5',
99
- 'home 7:0',
100
- 'home 7:1',
101
- 'home 7:2',
102
- 'home 7:3',
103
- 'home 7:4',
104
- 'home 7:5',
105
- 'home 7:6',
106
- 'home 8:0',
107
- 'home 8:1',
108
- 'home 8:2',
109
- 'home 8:3',
110
- 'home 8:4',
111
- 'home 8:5',
112
- 'home 8:6',
113
- 'home 8:7',
114
- 'home 9:0',
115
- 'home 9:1',
116
- 'home 9:2',
117
- 'home 9:3',
118
- 'home 9:4',
119
- 'home 9:5',
120
- 'home 9:6',
121
- 'home 9:7',
122
- 'home 9:8',
123
- 'home 10:0',
124
- 'home 10:1',
125
- 'home 10:2',
126
- 'home 10:3',
127
- 'home 10:4',
128
- 'home 10:5',
129
- 'home 10:6',
130
- 'home 10:7',
131
- 'home 10:8',
132
- 'home 10:9',
133
- 'home 11:0',
134
- 'home 11:1',
135
- 'home 11:2',
136
- 'home 11:3',
137
- 'home 11:4',
138
- 'home 11:5',
139
- 'home 11:6',
140
- 'home 11:7',
141
- 'home 11:8',
142
- 'home 11:9',
143
- 'home 11:10',
144
- 'home 12:0',
145
- 'home 12:1',
146
- 'home 12:2',
147
- 'home 12:3',
148
- 'home 12:4',
149
- 'home 12:5',
150
- 'home 12:6',
151
- 'home 12:7',
152
- 'home 12:8',
153
- 'home 12:9',
154
- 'home 12:10',
155
- 'home 12:11',
156
- 'home 13:0',
157
- 'home 13:1',
158
- 'home 13:2',
159
- 'home 13:3',
160
- 'home 13:4',
161
- 'home 13:5',
162
- 'home 13:6',
163
- 'home 13:7',
164
- 'home 13:8',
165
- 'home 13:9',
166
- 'home 13:10',
167
- 'home 13:11',
168
- 'home 13:12',
169
- 'home 14:0',
170
- 'home 14:1',
171
- 'home 14:2',
172
- 'home 14:3',
173
- 'home 14:4',
174
- 'home 14:5',
175
- 'home 14:6',
176
- 'home 14:7',
177
- 'home 14:8',
178
- 'home 14:9',
179
- 'home 14:10',
180
- 'home 14:11',
181
- 'home 14:12',
182
- 'home 14:13',
183
- 'away 5:0',
184
- 'away 5:1',
185
- 'away 5:2',
186
- 'away 5:3',
187
- 'away 5:4',
188
- 'away 6:0',
189
- 'away 6:1',
190
- 'away 6:2',
191
- 'away 6:3',
192
- 'away 6:4',
193
- 'away 6:5',
194
- 'away 7:0',
195
- 'away 7:1',
196
- 'away 7:2',
197
- 'away 7:3',
198
- 'away 7:4',
199
- 'away 7:5',
200
- 'away 7:6',
201
- 'away 8:0',
202
- 'away 8:1',
203
- 'away 8:2',
204
- 'away 8:3',
205
- 'away 8:4',
206
- 'away 8:5',
207
- 'away 8:6',
208
- 'away 8:7',
209
- 'away 9:0',
210
- 'away 9:1',
211
- 'away 9:2',
212
- 'away 9:3',
213
- 'away 9:4',
214
- 'away 9:5',
215
- 'away 9:6',
216
- 'away 9:7',
217
- 'away 9:8',
218
- 'away 10:0',
219
- 'away 10:1',
220
- 'away 10:2',
221
- 'away 10:3',
222
- 'away 10:4',
223
- 'away 10:5',
224
- 'away 10:6',
225
- 'away 10:7',
226
- 'away 10:8',
227
- 'away 10:9',
228
- 'away 11:0',
229
- 'away 11:1',
230
- 'away 11:2',
231
- 'away 11:3',
232
- 'away 11:4',
233
- 'away 11:5',
234
- 'away 11:6',
235
- 'away 11:7',
236
- 'away 11:8',
237
- 'away 11:9',
238
- 'away 11:10',
239
- 'away 12:0',
240
- 'away 12:1',
241
- 'away 12:2',
242
- 'away 12:3',
243
- 'away 12:4',
244
- 'away 12:5',
245
- 'away 12:6',
246
- 'away 12:7',
247
- 'away 12:8',
248
- 'away 12:9',
249
- 'away 12:10',
250
- 'away 12:11',
251
- 'away 13:0',
252
- 'away 13:1',
253
- 'away 13:2',
254
- 'away 13:3',
255
- 'away 13:4',
256
- 'away 13:5',
257
- 'away 13:6',
258
- 'away 13:7',
259
- 'away 13:8',
260
- 'away 13:9',
261
- 'away 13:10',
262
- 'away 13:11',
263
- 'away 13:12',
264
- 'away 14:0',
265
- 'away 14:1',
266
- 'away 14:2',
267
- 'away 14:3',
268
- 'away 14:4',
269
- 'away 14:5',
270
- 'away 14:6',
271
- 'away 14:7',
272
- 'away 14:8',
273
- 'away 14:9',
274
- 'away 14:10',
275
- 'away 14:11',
276
- 'away 14:12',
277
- 'away 14:13',
278
- 'other',
279
- ];
280
-
281
- export const OUTCOMES_BY_GROUP: Record<OutcomeGroup, string[]> = {
282
- [OutcomeGroup.YES_NO]: ['yes', 'no'],
283
- [OutcomeGroup.ODD_EVEN]: ['odd', 'even'],
284
- [OutcomeGroup.SCORE_HOME_AWAY_NO]: ['home', 'away', 'no'],
285
- [OutcomeGroup.DOUBLE_CHANCE]: ['home or draw', 'home or away', 'away or draw'],
286
- [OutcomeGroup.HALFTIME_FULLTIME]: [
287
- 'home/home',
288
- 'home/away',
289
- 'home/draw',
290
- 'away/home',
291
- 'away/away',
292
- 'away/draw',
293
- 'draw/home',
294
- 'draw/away',
295
- 'draw/draw',
296
- ],
297
- [OutcomeGroup.WINNING_ROUND]: [
298
- 'draw',
299
- 'by decision',
300
- 'round 1',
301
- 'round 2',
302
- 'round 3',
303
- 'round 4',
304
- 'round 5',
305
- 'round 6',
306
- 'round 7',
307
- 'round 8',
308
- 'round 9',
309
- 'round 10',
310
- ],
311
- [OutcomeGroup.ENDING_METHOD]: ['draw', 'by decision', 'KO/TKO/DQ', 'submission'],
312
- [OutcomeGroup.METHOD_OF_VICTORY]: [
313
- 'draw',
314
- 'home (decision)',
315
- 'home (KO/TKO/DQ)',
316
- 'home (submission)',
317
- 'away (decision)',
318
- 'away (KO/TKO/DQ)',
319
- 'away (submission)',
320
- ],
321
- [OutcomeGroup.WINNER_THREE_WAY]: ['home', 'away', 'draw'],
322
- [OutcomeGroup.WINNER_TWO_WAY]: ['home', 'away'],
323
- [OutcomeGroup.TOTAL_EXACT_HOME]: makeExactTotals('home'),
324
- [OutcomeGroup.TOTAL_EXACT_AWAY]: makeExactTotals('away'),
325
- [OutcomeGroup.CORRECT_SCORE]: CORRECT_SCORE_OUTCOMES,
326
- [OutcomeGroup.OVER_UNDER]: ['over', 'under'],
327
- [OutcomeGroup.OVER_UNDER_HOME]: ['home over', 'home under'],
328
- [OutcomeGroup.OVER_UNDER_AWAY]: ['away over', 'away under'],
329
- [OutcomeGroup.SPREAD_TWO_WAY]: ['home', 'away'],
330
- };
331
-
332
- // Select an outcome group using market grouping arrays and result type
333
- const getOutcomeGroup = (marketType: MarketType, resultType?: ResultType): OutcomeGroup | undefined => {
334
- if (YES_NO_OUTCOME_MARKET_TYPES.has(marketType)) return OutcomeGroup.YES_NO;
335
- if (TOTAL_ODD_EVEN_MARKET_TYPES.includes(marketType)) return OutcomeGroup.ODD_EVEN;
336
- if (SCORE_MARKET_TYPES.includes(marketType)) return OutcomeGroup.SCORE_HOME_AWAY_NO;
337
- if (RACE_TO_MARKET_TYPES.includes(marketType)) return OutcomeGroup.SCORE_HOME_AWAY_NO;
338
- if (DOUBLE_CHANCE_MARKET_TYPES.includes(marketType)) return OutcomeGroup.DOUBLE_CHANCE;
339
- if (WINNER_MARKET_TYPES.includes(marketType)) {
340
- if (DRAW_NO_BET_MARKET_TYPES.includes(marketType) || TWO_WAY_WINNER_MARKET_TYPES.includes(marketType))
341
- return OutcomeGroup.WINNER_TWO_WAY;
342
- return OutcomeGroup.WINNER_THREE_WAY;
343
- }
344
- if (TOTAL_EXACT_MARKET_TYPES.includes(marketType)) {
345
- if (HOME_TEAM_MARKET_TYPES.includes(marketType)) return OutcomeGroup.TOTAL_EXACT_HOME;
346
- if (AWAY_TEAM_MARKET_TYPES.includes(marketType)) return OutcomeGroup.TOTAL_EXACT_AWAY;
347
- }
348
- if (CORRECT_SCORE_MARKET_TYPES.includes(marketType)) return OutcomeGroup.CORRECT_SCORE;
349
- if (marketType === MarketType.HALFTIME_FULLTIME) return OutcomeGroup.HALFTIME_FULLTIME;
350
- if (marketType === MarketType.WINNING_ROUND) return OutcomeGroup.WINNING_ROUND;
351
- if (marketType === MarketType.ENDING_METHOD) return OutcomeGroup.ENDING_METHOD;
352
- if (METHOD_OF_VICTORY_MARKET_TYPES.includes(marketType)) return OutcomeGroup.METHOD_OF_VICTORY;
353
- if (!resultType) return undefined;
354
- switch (resultType) {
355
- case ResultType.OVER_UNDER: {
356
- if (HOME_TEAM_MARKET_TYPES.includes(marketType)) return OutcomeGroup.OVER_UNDER_HOME;
357
- if (AWAY_TEAM_MARKET_TYPES.includes(marketType)) return OutcomeGroup.OVER_UNDER_AWAY;
358
- return OutcomeGroup.OVER_UNDER;
359
- }
360
- case ResultType.SPREAD: {
361
- return OutcomeGroup.SPREAD_TWO_WAY;
362
- }
363
- default:
364
- return undefined;
365
- }
366
- };
367
-
368
- export const computeOutcomesForMarket = (marketType: MarketType, resultType?: ResultType): string[] | undefined => {
369
- const group = getOutcomeGroup(marketType, resultType);
370
- if (!group) return undefined;
371
- return OUTCOMES_BY_GROUP[group];
372
- };
1
+ import {
2
+ AWAY_TEAM_MARKET_TYPES,
3
+ CORRECT_SCORE_MARKET_TYPES,
4
+ DOUBLE_CHANCE_MARKET_TYPES,
5
+ DRAW_NO_BET_MARKET_TYPES,
6
+ HOME_TEAM_MARKET_TYPES,
7
+ METHOD_OF_VICTORY_MARKET_TYPES,
8
+ RACE_TO_MARKET_TYPES,
9
+ SCORE_MARKET_TYPES,
10
+ TOTAL_EXACT_MARKET_TYPES,
11
+ TOTAL_ODD_EVEN_MARKET_TYPES,
12
+ TWO_WAY_WINNER_MARKET_TYPES,
13
+ WINNER_MARKET_TYPES,
14
+ YES_NO_OUTCOME_MARKET_TYPES,
15
+ } from '../constants/marketTypes';
16
+ import { MarketType, ResultType } from '../enums/marketTypes';
17
+
18
+ // Outcome grouping enum
19
+ export enum OutcomeGroup {
20
+ YES_NO = 'YES_NO',
21
+ ODD_EVEN = 'ODD_EVEN',
22
+ SCORE_HOME_AWAY_NO = 'SCORE_HOME_AWAY_NO',
23
+ DOUBLE_CHANCE = 'DOUBLE_CHANCE',
24
+ HALFTIME_FULLTIME = 'HALFTIME_FULLTIME',
25
+ WINNING_ROUND = 'WINNING_ROUND',
26
+ ENDING_METHOD = 'ENDING_METHOD',
27
+ METHOD_OF_VICTORY = 'METHOD_OF_VICTORY',
28
+ WINNER_THREE_WAY = 'WINNER_THREE_WAY',
29
+ WINNER_TWO_WAY = 'WINNER_TWO_WAY',
30
+ TOTAL_EXACT_HOME = 'TOTAL_EXACT_HOME',
31
+ TOTAL_EXACT_AWAY = 'TOTAL_EXACT_AWAY',
32
+ CORRECT_SCORE = 'CORRECT_SCORE',
33
+ OVER_UNDER = 'OVER_UNDER',
34
+ OVER_UNDER_HOME = 'OVER_UNDER_HOME',
35
+ OVER_UNDER_AWAY = 'OVER_UNDER_AWAY',
36
+ SPREAD_TWO_WAY = 'SPREAD_TWO_WAY',
37
+ }
38
+
39
+ const makeExactTotals = (prefix: 'home' | 'away'): string[] => [
40
+ `${prefix} 0`,
41
+ `${prefix} 1`,
42
+ `${prefix} 2`,
43
+ `${prefix} 3`,
44
+ `${prefix} 4`,
45
+ `${prefix} 5`,
46
+ `${prefix} 3+`,
47
+ `${prefix} 4+`,
48
+ `${prefix} 5+`,
49
+ ];
50
+
51
+ // Exhaustive correct score outcomes
52
+ const CORRECT_SCORE_OUTCOMES: string[] = [
53
+ 'draw 0:0',
54
+ 'draw 1:1',
55
+ 'draw 2:2',
56
+ 'draw 3:3',
57
+ 'draw 4:4',
58
+ 'home 1:0',
59
+ 'home 2:0',
60
+ 'home 2:1',
61
+ 'home 3:0',
62
+ 'home 3:1',
63
+ 'home 3:2',
64
+ 'home 4:0',
65
+ 'home 4:1',
66
+ 'home 4:2',
67
+ 'home 4:3',
68
+ 'away 1:0',
69
+ 'away 2:0',
70
+ 'away 2:1',
71
+ 'away 3:0',
72
+ 'away 3:1',
73
+ 'away 3:2',
74
+ 'away 4:0',
75
+ 'away 4:1',
76
+ 'away 4:2',
77
+ 'away 4:3',
78
+ 'draw 5:5',
79
+ 'draw 6:6',
80
+ 'draw 7:7',
81
+ 'draw 8:8',
82
+ 'draw 9:9',
83
+ 'draw 10:10',
84
+ 'draw 11:11',
85
+ 'draw 12:12',
86
+ 'draw 13:13',
87
+ 'draw 14:14',
88
+ 'home 5:0',
89
+ 'home 5:1',
90
+ 'home 5:2',
91
+ 'home 5:3',
92
+ 'home 5:4',
93
+ 'home 6:0',
94
+ 'home 6:1',
95
+ 'home 6:2',
96
+ 'home 6:3',
97
+ 'home 6:4',
98
+ 'home 6:5',
99
+ 'home 7:0',
100
+ 'home 7:1',
101
+ 'home 7:2',
102
+ 'home 7:3',
103
+ 'home 7:4',
104
+ 'home 7:5',
105
+ 'home 7:6',
106
+ 'home 8:0',
107
+ 'home 8:1',
108
+ 'home 8:2',
109
+ 'home 8:3',
110
+ 'home 8:4',
111
+ 'home 8:5',
112
+ 'home 8:6',
113
+ 'home 8:7',
114
+ 'home 9:0',
115
+ 'home 9:1',
116
+ 'home 9:2',
117
+ 'home 9:3',
118
+ 'home 9:4',
119
+ 'home 9:5',
120
+ 'home 9:6',
121
+ 'home 9:7',
122
+ 'home 9:8',
123
+ 'home 10:0',
124
+ 'home 10:1',
125
+ 'home 10:2',
126
+ 'home 10:3',
127
+ 'home 10:4',
128
+ 'home 10:5',
129
+ 'home 10:6',
130
+ 'home 10:7',
131
+ 'home 10:8',
132
+ 'home 10:9',
133
+ 'home 11:0',
134
+ 'home 11:1',
135
+ 'home 11:2',
136
+ 'home 11:3',
137
+ 'home 11:4',
138
+ 'home 11:5',
139
+ 'home 11:6',
140
+ 'home 11:7',
141
+ 'home 11:8',
142
+ 'home 11:9',
143
+ 'home 11:10',
144
+ 'home 12:0',
145
+ 'home 12:1',
146
+ 'home 12:2',
147
+ 'home 12:3',
148
+ 'home 12:4',
149
+ 'home 12:5',
150
+ 'home 12:6',
151
+ 'home 12:7',
152
+ 'home 12:8',
153
+ 'home 12:9',
154
+ 'home 12:10',
155
+ 'home 12:11',
156
+ 'home 13:0',
157
+ 'home 13:1',
158
+ 'home 13:2',
159
+ 'home 13:3',
160
+ 'home 13:4',
161
+ 'home 13:5',
162
+ 'home 13:6',
163
+ 'home 13:7',
164
+ 'home 13:8',
165
+ 'home 13:9',
166
+ 'home 13:10',
167
+ 'home 13:11',
168
+ 'home 13:12',
169
+ 'home 14:0',
170
+ 'home 14:1',
171
+ 'home 14:2',
172
+ 'home 14:3',
173
+ 'home 14:4',
174
+ 'home 14:5',
175
+ 'home 14:6',
176
+ 'home 14:7',
177
+ 'home 14:8',
178
+ 'home 14:9',
179
+ 'home 14:10',
180
+ 'home 14:11',
181
+ 'home 14:12',
182
+ 'home 14:13',
183
+ 'away 5:0',
184
+ 'away 5:1',
185
+ 'away 5:2',
186
+ 'away 5:3',
187
+ 'away 5:4',
188
+ 'away 6:0',
189
+ 'away 6:1',
190
+ 'away 6:2',
191
+ 'away 6:3',
192
+ 'away 6:4',
193
+ 'away 6:5',
194
+ 'away 7:0',
195
+ 'away 7:1',
196
+ 'away 7:2',
197
+ 'away 7:3',
198
+ 'away 7:4',
199
+ 'away 7:5',
200
+ 'away 7:6',
201
+ 'away 8:0',
202
+ 'away 8:1',
203
+ 'away 8:2',
204
+ 'away 8:3',
205
+ 'away 8:4',
206
+ 'away 8:5',
207
+ 'away 8:6',
208
+ 'away 8:7',
209
+ 'away 9:0',
210
+ 'away 9:1',
211
+ 'away 9:2',
212
+ 'away 9:3',
213
+ 'away 9:4',
214
+ 'away 9:5',
215
+ 'away 9:6',
216
+ 'away 9:7',
217
+ 'away 9:8',
218
+ 'away 10:0',
219
+ 'away 10:1',
220
+ 'away 10:2',
221
+ 'away 10:3',
222
+ 'away 10:4',
223
+ 'away 10:5',
224
+ 'away 10:6',
225
+ 'away 10:7',
226
+ 'away 10:8',
227
+ 'away 10:9',
228
+ 'away 11:0',
229
+ 'away 11:1',
230
+ 'away 11:2',
231
+ 'away 11:3',
232
+ 'away 11:4',
233
+ 'away 11:5',
234
+ 'away 11:6',
235
+ 'away 11:7',
236
+ 'away 11:8',
237
+ 'away 11:9',
238
+ 'away 11:10',
239
+ 'away 12:0',
240
+ 'away 12:1',
241
+ 'away 12:2',
242
+ 'away 12:3',
243
+ 'away 12:4',
244
+ 'away 12:5',
245
+ 'away 12:6',
246
+ 'away 12:7',
247
+ 'away 12:8',
248
+ 'away 12:9',
249
+ 'away 12:10',
250
+ 'away 12:11',
251
+ 'away 13:0',
252
+ 'away 13:1',
253
+ 'away 13:2',
254
+ 'away 13:3',
255
+ 'away 13:4',
256
+ 'away 13:5',
257
+ 'away 13:6',
258
+ 'away 13:7',
259
+ 'away 13:8',
260
+ 'away 13:9',
261
+ 'away 13:10',
262
+ 'away 13:11',
263
+ 'away 13:12',
264
+ 'away 14:0',
265
+ 'away 14:1',
266
+ 'away 14:2',
267
+ 'away 14:3',
268
+ 'away 14:4',
269
+ 'away 14:5',
270
+ 'away 14:6',
271
+ 'away 14:7',
272
+ 'away 14:8',
273
+ 'away 14:9',
274
+ 'away 14:10',
275
+ 'away 14:11',
276
+ 'away 14:12',
277
+ 'away 14:13',
278
+ 'other',
279
+ ];
280
+
281
+ export const OUTCOMES_BY_GROUP: Record<OutcomeGroup, string[]> = {
282
+ [OutcomeGroup.YES_NO]: ['yes', 'no'],
283
+ [OutcomeGroup.ODD_EVEN]: ['odd', 'even'],
284
+ [OutcomeGroup.SCORE_HOME_AWAY_NO]: ['home', 'away', 'no'],
285
+ [OutcomeGroup.DOUBLE_CHANCE]: ['home or draw', 'home or away', 'away or draw'],
286
+ [OutcomeGroup.HALFTIME_FULLTIME]: [
287
+ 'home/home',
288
+ 'home/away',
289
+ 'home/draw',
290
+ 'away/home',
291
+ 'away/away',
292
+ 'away/draw',
293
+ 'draw/home',
294
+ 'draw/away',
295
+ 'draw/draw',
296
+ ],
297
+ [OutcomeGroup.WINNING_ROUND]: [
298
+ 'draw',
299
+ 'by decision',
300
+ 'round 1',
301
+ 'round 2',
302
+ 'round 3',
303
+ 'round 4',
304
+ 'round 5',
305
+ 'round 6',
306
+ 'round 7',
307
+ 'round 8',
308
+ 'round 9',
309
+ 'round 10',
310
+ ],
311
+ [OutcomeGroup.ENDING_METHOD]: ['draw', 'by decision', 'KO/TKO/DQ', 'submission'],
312
+ [OutcomeGroup.METHOD_OF_VICTORY]: [
313
+ 'draw',
314
+ 'home (decision)',
315
+ 'home (KO/TKO/DQ)',
316
+ 'home (submission)',
317
+ 'away (decision)',
318
+ 'away (KO/TKO/DQ)',
319
+ 'away (submission)',
320
+ ],
321
+ [OutcomeGroup.WINNER_THREE_WAY]: ['home', 'away', 'draw'],
322
+ [OutcomeGroup.WINNER_TWO_WAY]: ['home', 'away'],
323
+ [OutcomeGroup.TOTAL_EXACT_HOME]: makeExactTotals('home'),
324
+ [OutcomeGroup.TOTAL_EXACT_AWAY]: makeExactTotals('away'),
325
+ [OutcomeGroup.CORRECT_SCORE]: CORRECT_SCORE_OUTCOMES,
326
+ [OutcomeGroup.OVER_UNDER]: ['over', 'under'],
327
+ [OutcomeGroup.OVER_UNDER_HOME]: ['home over', 'home under'],
328
+ [OutcomeGroup.OVER_UNDER_AWAY]: ['away over', 'away under'],
329
+ [OutcomeGroup.SPREAD_TWO_WAY]: ['home', 'away'],
330
+ };
331
+
332
+ // Select an outcome group using market grouping arrays and result type
333
+ const getOutcomeGroup = (marketType: MarketType, resultType?: ResultType): OutcomeGroup | undefined => {
334
+ if (YES_NO_OUTCOME_MARKET_TYPES.has(marketType)) return OutcomeGroup.YES_NO;
335
+ if (TOTAL_ODD_EVEN_MARKET_TYPES.includes(marketType)) return OutcomeGroup.ODD_EVEN;
336
+ if (SCORE_MARKET_TYPES.includes(marketType)) return OutcomeGroup.SCORE_HOME_AWAY_NO;
337
+ if (RACE_TO_MARKET_TYPES.includes(marketType)) return OutcomeGroup.SCORE_HOME_AWAY_NO;
338
+ if (DOUBLE_CHANCE_MARKET_TYPES.includes(marketType)) return OutcomeGroup.DOUBLE_CHANCE;
339
+ if (WINNER_MARKET_TYPES.includes(marketType)) {
340
+ if (DRAW_NO_BET_MARKET_TYPES.includes(marketType) || TWO_WAY_WINNER_MARKET_TYPES.includes(marketType))
341
+ return OutcomeGroup.WINNER_TWO_WAY;
342
+ return OutcomeGroup.WINNER_THREE_WAY;
343
+ }
344
+ if (TOTAL_EXACT_MARKET_TYPES.includes(marketType)) {
345
+ if (HOME_TEAM_MARKET_TYPES.includes(marketType)) return OutcomeGroup.TOTAL_EXACT_HOME;
346
+ if (AWAY_TEAM_MARKET_TYPES.includes(marketType)) return OutcomeGroup.TOTAL_EXACT_AWAY;
347
+ }
348
+ if (CORRECT_SCORE_MARKET_TYPES.includes(marketType)) return OutcomeGroup.CORRECT_SCORE;
349
+ if (marketType === MarketType.HALFTIME_FULLTIME) return OutcomeGroup.HALFTIME_FULLTIME;
350
+ if (marketType === MarketType.WINNING_ROUND) return OutcomeGroup.WINNING_ROUND;
351
+ if (marketType === MarketType.ENDING_METHOD) return OutcomeGroup.ENDING_METHOD;
352
+ if (METHOD_OF_VICTORY_MARKET_TYPES.includes(marketType)) return OutcomeGroup.METHOD_OF_VICTORY;
353
+ if (!resultType) return undefined;
354
+ switch (resultType) {
355
+ case ResultType.OVER_UNDER: {
356
+ if (HOME_TEAM_MARKET_TYPES.includes(marketType)) return OutcomeGroup.OVER_UNDER_HOME;
357
+ if (AWAY_TEAM_MARKET_TYPES.includes(marketType)) return OutcomeGroup.OVER_UNDER_AWAY;
358
+ return OutcomeGroup.OVER_UNDER;
359
+ }
360
+ case ResultType.SPREAD: {
361
+ return OutcomeGroup.SPREAD_TWO_WAY;
362
+ }
363
+ default:
364
+ return undefined;
365
+ }
366
+ };
367
+
368
+ export const computeOutcomesForMarket = (marketType: MarketType, resultType?: ResultType): string[] | undefined => {
369
+ const group = getOutcomeGroup(marketType, resultType);
370
+ if (!group) return undefined;
371
+ return OUTCOMES_BY_GROUP[group];
372
+ };