tods-competition-factory 2.2.40 → 2.2.42

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.
@@ -4626,11 +4626,11 @@ declare function deleteFlightProfileAndFlightDraws({ autoPublish, tournamentReco
4626
4626
  event: any;
4627
4627
  force: any;
4628
4628
  }): {
4629
- error: any;
4630
- } | {
4631
4629
  success?: boolean;
4632
4630
  error?: ErrorType;
4633
4631
  info?: any;
4632
+ } | {
4633
+ error: any;
4634
4634
  };
4635
4635
 
4636
4636
  type ModifyEventMatchUpFormatTimingArgs = {
@@ -4644,13 +4644,13 @@ type ModifyEventMatchUpFormatTimingArgs = {
4644
4644
  event?: Event$1;
4645
4645
  };
4646
4646
  declare function modifyEventMatchUpFormatTiming(params: ModifyEventMatchUpFormatTimingArgs): {
4647
- success: boolean;
4648
- error?: undefined;
4649
- } | {
4650
4647
  error: {
4651
4648
  message: string;
4652
4649
  code: string;
4653
4650
  };
4651
+ } | {
4652
+ success: boolean;
4653
+ error?: undefined;
4654
4654
  };
4655
4655
 
4656
4656
  type RemoveEventMatchUpFormatTimingArgs = {
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  function factoryVersion() {
6
- return '2.2.40';
6
+ return '2.2.42';
7
7
  }
8
8
 
9
9
  const SINGLES_MATCHUP = 'SINGLES';
@@ -1982,13 +1982,15 @@ const setTypes$1 = {
1982
1982
  };
1983
1983
 
1984
1984
  function stringify(matchUpFormatObject, preserveRedundant) {
1985
+ if (!isObject(matchUpFormatObject))
1986
+ return undefined;
1985
1987
  if ((matchUpFormatObject?.bestOf || matchUpFormatObject?.exactly) && matchUpFormatObject?.setFormat) {
1986
1988
  return getSetFormat(matchUpFormatObject, preserveRedundant);
1987
1989
  }
1988
1990
  return undefined;
1989
1991
  }
1990
1992
  function getNumber$1(formatstring) {
1991
- return !isNaN(Number(formatstring)) && Number(formatstring);
1993
+ return !Number.isNaN(Number(formatstring)) && Number(formatstring);
1992
1994
  }
1993
1995
  function timedSetFormat(matchUpFormatObject) {
1994
1996
  let value = `T${matchUpFormatObject.minutes}`;
@@ -2025,7 +2027,7 @@ function getSetFormat(matchUpFormatObject, preserveRedundant) {
2025
2027
  '';
2026
2028
  const valid = setLimitCode && setCountValue;
2027
2029
  if (valid) {
2028
- return [setLimitCode, setCode, finalSetCode].filter((f) => f).join('-');
2030
+ return [setLimitCode, setCode, finalSetCode].filter(Boolean).join('-');
2029
2031
  }
2030
2032
  return undefined;
2031
2033
  }
@@ -32184,7 +32186,7 @@ var help = {
32184
32186
  tidyScore: tidyScore
32185
32187
  };
32186
32188
 
32187
- function validateTiebreakOnlySet(winnerScore, loserScore, scoreDiff, tiebreakSetTo, allowIncomplete) {
32189
+ function validateTiebreakOnlySet(winnerScore, loserScore, scoreDiff, tiebreakSetTo, allowIncomplete, NoAD = false) {
32188
32190
  if (allowIncomplete) {
32189
32191
  return { isValid: true };
32190
32192
  }
@@ -32197,12 +32199,18 @@ function validateTiebreakOnlySet(winnerScore, loserScore, scoreDiff, tiebreakSet
32197
32199
  error: `Tiebreak-only set winner must reach at least ${tiebreakSetTo}, got ${winnerScore}`,
32198
32200
  };
32199
32201
  }
32200
- if (scoreDiff < 2) {
32202
+ const requiredWinBy = NoAD ? 1 : 2;
32203
+ if (scoreDiff < requiredWinBy) {
32201
32204
  return {
32202
32205
  isValid: false,
32203
- error: `Tiebreak-only set must be won by at least 2 points, got ${winnerScore}-${loserScore}`,
32206
+ error: NoAD
32207
+ ? `Tiebreak-only set (NoAD) must be won by at least 1 point, got ${winnerScore}-${loserScore}`
32208
+ : `Tiebreak-only set must be won by at least 2 points, got ${winnerScore}-${loserScore}`,
32204
32209
  };
32205
32210
  }
32211
+ if (NoAD) {
32212
+ return { isValid: true };
32213
+ }
32206
32214
  if (winnerScore === tiebreakSetTo && loserScore > tiebreakSetTo - 2) {
32207
32215
  return {
32208
32216
  isValid: false,
@@ -32366,6 +32374,24 @@ function validateSetScore(set, matchUpFormat, isDecidingSet, allowIncomplete) {
32366
32374
  const setFormat = isDecidingSet && parsed.finalSetFormat ? parsed.finalSetFormat : parsed.setFormat;
32367
32375
  if (!setFormat)
32368
32376
  return { isValid: true };
32377
+ if (setFormat.timed) {
32378
+ if (!allowIncomplete) {
32379
+ const side1Score = set.side1Score ?? 0;
32380
+ const side2Score = set.side2Score ?? 0;
32381
+ if (side1Score === 0 && side2Score === 0) {
32382
+ return { isValid: false, error: 'Timed set requires at least one side to have scored' };
32383
+ }
32384
+ if (setFormat.based === 'P') {
32385
+ if (side1Score === side2Score && side1Score > 0 && setFormat.tiebreakFormat) {
32386
+ const hasTiebreak = set.side1TiebreakScore !== undefined || set.side2TiebreakScore !== undefined;
32387
+ if (!hasTiebreak) {
32388
+ return { isValid: false, error: 'Tied timed set requires tiebreak' };
32389
+ }
32390
+ }
32391
+ }
32392
+ }
32393
+ return { isValid: true };
32394
+ }
32369
32395
  const { setTo, tiebreakAt, tiebreakFormat, tiebreakSet } = setFormat;
32370
32396
  const tiebreakSetTo = tiebreakSet?.tiebreakTo;
32371
32397
  const isTiebreakOnlyFormat = !!tiebreakSetTo && !setTo;
@@ -32375,7 +32401,8 @@ function validateSetScore(set, matchUpFormat, isDecidingSet, allowIncomplete) {
32375
32401
  const loserScore = Math.min(side1Score, side2Score);
32376
32402
  const scoreDiff = winnerScore - loserScore;
32377
32403
  if (isTiebreakOnlyFormat) {
32378
- return validateTiebreakOnlySet(winnerScore, loserScore, scoreDiff, tiebreakSetTo, allowIncomplete ?? false);
32404
+ const NoAD = setFormat.tiebreakSet?.NoAD ?? false;
32405
+ return validateTiebreakOnlySet(winnerScore, loserScore, scoreDiff, tiebreakSetTo, allowIncomplete ?? false, NoAD);
32379
32406
  }
32380
32407
  const hasExplicitTiebreak = side1TiebreakScore !== undefined || side2TiebreakScore !== undefined;
32381
32408
  const isImplicitTiebreak = setTo && winnerScore === setTo + 1 && loserScore === setTo;
@@ -32613,94 +32640,115 @@ function getHighTiebreakValue(params) {
32613
32640
  return tiebreakTo;
32614
32641
  }
32615
32642
 
32643
+ function determineWinningSide(score1, score2) {
32644
+ return (score1 > score2 && 1) || (score1 < score2 && 2) || undefined;
32645
+ }
32646
+ function parseTiebreakOnlySet(bracketedScores, isTiebreakOnlyFormat) {
32647
+ if (isTiebreakOnlyFormat) {
32648
+ return {
32649
+ side1Score: bracketedScores[0],
32650
+ side2Score: bracketedScores[1],
32651
+ winningSide: determineWinningSide(bracketedScores[0], bracketedScores[1]),
32652
+ };
32653
+ }
32654
+ return {
32655
+ side1TiebreakScore: bracketedScores[0],
32656
+ side2TiebreakScore: bracketedScores[1],
32657
+ winningSide: determineWinningSide(bracketedScores[0], bracketedScores[1]),
32658
+ };
32659
+ }
32616
32660
  function parseScoreString({ tiebreakTo = 7, scoreString = '', matchUpFormat }) {
32617
32661
  let parsedFormat;
32618
32662
  let bestOfSets = 3;
32619
32663
  if (matchUpFormat) {
32620
32664
  try {
32621
32665
  parsedFormat = parse(matchUpFormat);
32622
- const bestOfMatch = matchUpFormat?.match(/SET(\d+)/)?.[1];
32666
+ const bestOfMatch = /SET(\d+)/.exec(matchUpFormat)?.[1];
32623
32667
  bestOfSets = bestOfMatch ? Number.parseInt(bestOfMatch) : 3;
32624
32668
  }
32625
- catch (_e) {
32669
+ catch {
32626
32670
  }
32627
32671
  }
32628
32672
  return scoreString
32629
32673
  ?.split(' ')
32630
32674
  .filter(Boolean)
32631
32675
  .map((set, index) => parseSet({ set, setNumber: index + 1 }));
32676
+ function checkIsTiebreakOnlyFormat(setNumber, isTiebreakOnlySet) {
32677
+ if (!parsedFormat || !isTiebreakOnlySet)
32678
+ return false;
32679
+ const isDecidingSet = setNumber === bestOfSets;
32680
+ const setFormat = isDecidingSet && parsedFormat.finalSetFormat ? parsedFormat.finalSetFormat : parsedFormat.setFormat;
32681
+ if (!setFormat)
32682
+ return false;
32683
+ const tiebreakSetTo = setFormat.tiebreakSet?.tiebreakTo;
32684
+ const regularSetTo = setFormat.setTo;
32685
+ return !!tiebreakSetTo && !regularSetTo;
32686
+ }
32687
+ function getTiebreakToForSet(setNumber) {
32688
+ if (!parsedFormat)
32689
+ return tiebreakTo;
32690
+ const isDecidingSet = setNumber === bestOfSets;
32691
+ const setFormat = isDecidingSet && parsedFormat.finalSetFormat ? parsedFormat.finalSetFormat : parsedFormat.setFormat;
32692
+ return setFormat?.tiebreakFormat?.tiebreakTo ?? tiebreakTo;
32693
+ }
32694
+ function parseTiebreakGame(tiebreakMatch, winningSide, setNumber) {
32695
+ const setTiebreakLowScore = tiebreakMatch[1];
32696
+ const setSpecificTiebreakTo = getTiebreakToForSet(setNumber);
32697
+ const side1TiebreakPerspective = getTiebreakComplement({
32698
+ lowValue: setTiebreakLowScore,
32699
+ isSide1: winningSide === 2,
32700
+ tiebreakTo: setSpecificTiebreakTo,
32701
+ });
32702
+ if (Array.isArray(side1TiebreakPerspective)) {
32703
+ return [side1TiebreakPerspective[0], side1TiebreakPerspective[1]];
32704
+ }
32705
+ return [undefined, undefined];
32706
+ }
32707
+ function parseRegularSet(set, tiebreak, bracketed, setNumber) {
32708
+ const setString = (tiebreak && set.replace(tiebreak[0], '')) || (bracketed && set.replace(bracketed[0], '')) || set;
32709
+ const setScores = setString.split('-').map((score) => Number.parseInt(score));
32710
+ const side1Score = setScores[0];
32711
+ const side2Score = setScores[1];
32712
+ const winningSide = determineWinningSide(side1Score, side2Score);
32713
+ let side1TiebreakScore;
32714
+ let side2TiebreakScore;
32715
+ if (tiebreak) {
32716
+ [side1TiebreakScore, side2TiebreakScore] = parseTiebreakGame(tiebreak, winningSide, setNumber);
32717
+ }
32718
+ if (bracketed) {
32719
+ const matchTiebreakScores = bracketed[1].split('-').map((score) => Number.parseInt(score));
32720
+ side1TiebreakScore = matchTiebreakScores[0];
32721
+ side2TiebreakScore = matchTiebreakScores[1];
32722
+ }
32723
+ return {
32724
+ side1Score,
32725
+ side2Score,
32726
+ side1TiebreakScore,
32727
+ side2TiebreakScore,
32728
+ winningSide,
32729
+ };
32730
+ }
32632
32731
  function parseSet({ set, setNumber }) {
32633
32732
  const inParentheses = /\(([^)]+)\)/;
32634
32733
  const inBrackets = /\[([^\]]+)\]/;
32635
32734
  const tiebreak = inParentheses.exec(set);
32636
32735
  const bracketed = inBrackets.exec(set);
32637
32736
  const isTiebreakOnlySet = set?.startsWith('[') && bracketed;
32638
- let isTiebreakOnlyFormat = false;
32639
- if (parsedFormat && isTiebreakOnlySet) {
32640
- const isDecidingSet = setNumber === bestOfSets;
32641
- const setFormat = isDecidingSet && parsedFormat.finalSetFormat ? parsedFormat.finalSetFormat : parsedFormat.setFormat;
32642
- if (setFormat) {
32643
- const tiebreakSetTo = setFormat.tiebreakSet?.tiebreakTo;
32644
- const regularSetTo = setFormat.setTo;
32645
- isTiebreakOnlyFormat = !!tiebreakSetTo && !regularSetTo;
32646
- }
32647
- }
32648
- let side1Score;
32649
- let side2Score;
32650
- let side1TiebreakScore;
32651
- let side2TiebreakScore;
32652
- let winningSide;
32737
+ const isTiebreakOnlyFormat = checkIsTiebreakOnlyFormat(setNumber, !!isTiebreakOnlySet);
32738
+ let result;
32653
32739
  if (isTiebreakOnlySet) {
32654
- const bracketedScores = bracketed[1].split('-').map((score) => parseInt(score));
32655
- if (isTiebreakOnlyFormat) {
32656
- side1Score = bracketedScores[0];
32657
- side2Score = bracketedScores[1];
32658
- winningSide = (side1Score > side2Score && 1) || (side1Score < side2Score && 2) || undefined;
32659
- }
32660
- else {
32661
- side1TiebreakScore = bracketedScores[0];
32662
- side2TiebreakScore = bracketedScores[1];
32663
- winningSide =
32664
- (side1TiebreakScore > side2TiebreakScore && 1) || (side1TiebreakScore < side2TiebreakScore && 2) || undefined;
32665
- }
32740
+ const bracketedScores = bracketed[1].split('-').map((score) => Number.parseInt(score));
32741
+ result = parseTiebreakOnlySet(bracketedScores, isTiebreakOnlyFormat);
32666
32742
  }
32667
32743
  else {
32668
- const setString = (tiebreak && set.replace(tiebreak[0], '')) || (bracketed && set.replace(bracketed[0], '')) || set;
32669
- const setScores = setString.split('-').map((score) => Number.parseInt(score));
32670
- side1Score = setScores[0];
32671
- side2Score = setScores[1];
32672
- winningSide = (side1Score > side2Score && 1) || (side1Score < side2Score && 2) || undefined;
32673
- if (tiebreak) {
32674
- const setTiebreakLowScore = tiebreak[1];
32675
- let setSpecificTiebreakTo = tiebreakTo;
32676
- if (parsedFormat) {
32677
- const isDecidingSet = setNumber === bestOfSets;
32678
- const setFormat = isDecidingSet && parsedFormat.finalSetFormat ? parsedFormat.finalSetFormat : parsedFormat.setFormat;
32679
- if (setFormat?.tiebreakFormat?.tiebreakTo) {
32680
- setSpecificTiebreakTo = setFormat.tiebreakFormat.tiebreakTo;
32681
- }
32682
- }
32683
- const side1TiebreakPerspective = getTiebreakComplement({
32684
- lowValue: setTiebreakLowScore,
32685
- isSide1: winningSide === 2,
32686
- tiebreakTo: setSpecificTiebreakTo,
32687
- });
32688
- if (Array.isArray(side1TiebreakPerspective)) {
32689
- [side1TiebreakScore, side2TiebreakScore] = side1TiebreakPerspective;
32690
- }
32691
- }
32692
- if (bracketed && !isTiebreakOnlySet) {
32693
- const matchTiebreakScores = bracketed[1].split('-').map((score) => Number.parseInt(score));
32694
- side1TiebreakScore = matchTiebreakScores[0];
32695
- side2TiebreakScore = matchTiebreakScores[1];
32696
- }
32744
+ result = parseRegularSet(set, tiebreak, bracketed, setNumber);
32697
32745
  }
32698
32746
  return {
32699
- side1Score,
32700
- side2Score,
32701
- side1TiebreakScore,
32702
- side2TiebreakScore,
32703
- winningSide,
32747
+ side1Score: result.side1Score,
32748
+ side2Score: result.side2Score,
32749
+ side1TiebreakScore: result.side1TiebreakScore,
32750
+ side2TiebreakScore: result.side2TiebreakScore,
32751
+ winningSide: result.winningSide,
32704
32752
  setNumber,
32705
32753
  };
32706
32754
  }
@@ -47221,6 +47269,67 @@ var index$9 = {
47221
47269
  validMatchUps: validMatchUps
47222
47270
  };
47223
47271
 
47272
+ function inferWinningSideFromAggregate(neutralParsedSets) {
47273
+ const aggregateTotals = neutralParsedSets.reduce((totals, set) => {
47274
+ if (set.side1Score !== undefined || set.side2Score !== undefined) {
47275
+ totals.side1 += set.side1Score ?? 0;
47276
+ totals.side2 += set.side2Score ?? 0;
47277
+ }
47278
+ return totals;
47279
+ }, { side1: 0, side2: 0 });
47280
+ if (aggregateTotals.side1 > aggregateTotals.side2)
47281
+ return 1;
47282
+ if (aggregateTotals.side2 > aggregateTotals.side1)
47283
+ return 2;
47284
+ const tiebreakSet = neutralParsedSets.find((set) => set.side1TiebreakScore !== undefined || set.side2TiebreakScore !== undefined);
47285
+ return tiebreakSet?.winningSide;
47286
+ }
47287
+ function inferWinningSideFromSets(neutralParsedSets) {
47288
+ const setsWon = { side1: 0, side2: 0 };
47289
+ neutralParsedSets.forEach((set) => {
47290
+ if (set.winningSide === 1)
47291
+ setsWon.side1++;
47292
+ else if (set.winningSide === 2)
47293
+ setsWon.side2++;
47294
+ });
47295
+ if (setsWon.side1 > setsWon.side2)
47296
+ return 1;
47297
+ if (setsWon.side2 > setsWon.side1)
47298
+ return 2;
47299
+ return undefined;
47300
+ }
47301
+ function inferWinningSide(winningSide, matchUpFormat, neutralParsedSets) {
47302
+ if (winningSide || !matchUpFormat || !neutralParsedSets)
47303
+ return winningSide;
47304
+ const parsedFormat = parse(matchUpFormat);
47305
+ const isAggregateScoring = parsedFormat?.setFormat?.based === 'A' || parsedFormat?.finalSetFormat?.based === 'A';
47306
+ return isAggregateScoring
47307
+ ? inferWinningSideFromAggregate(neutralParsedSets)
47308
+ : inferWinningSideFromSets(neutralParsedSets);
47309
+ }
47310
+ function generateScoreForSideOrder(scoreString, matchUpFormat, setTBlast) {
47311
+ const sets = parseScoreString({ scoreString, matchUpFormat });
47312
+ return {
47313
+ sets,
47314
+ scoreStringSide1: generateScoreString({ sets, matchUpFormat, setTBlast }),
47315
+ scoreStringSide2: generateScoreString({ sets, reversed: true, matchUpFormat, setTBlast }),
47316
+ };
47317
+ }
47318
+ function generateScoreForWinnerOrder(neutralParsedSets, inferredWinningSide, matchUpFormat, setTBlast) {
47319
+ const winningScoreString = generateScoreString({ sets: neutralParsedSets, matchUpFormat, setTBlast });
47320
+ const losingScoreString = generateScoreString({ sets: neutralParsedSets, reversed: true, matchUpFormat, setTBlast });
47321
+ if (typeof winningScoreString !== 'string')
47322
+ return winningScoreString;
47323
+ if (typeof losingScoreString !== 'string')
47324
+ return losingScoreString;
47325
+ const scoreStringSide1 = inferredWinningSide === 2 ? losingScoreString : winningScoreString;
47326
+ const scoreStringSide2 = inferredWinningSide === 2 ? winningScoreString : losingScoreString;
47327
+ return {
47328
+ sets: parseScoreString({ scoreString: scoreStringSide1, matchUpFormat }),
47329
+ scoreStringSide1,
47330
+ scoreStringSide2,
47331
+ };
47332
+ }
47224
47333
  function generateOutcomeFromScoreString(params) {
47225
47334
  const { matchUpFormat, matchUpStatus, winningSide, scoreString, setTBlast } = params;
47226
47335
  if (!scoreString)
@@ -47235,45 +47344,12 @@ function generateOutcomeFromScoreString(params) {
47235
47344
  return { error: INVALID_VALUES, winningSide };
47236
47345
  const neutralParsedSets = scoreString && parseScoreString({ scoreString, matchUpFormat });
47237
47346
  const isBracketNotation = scoreString?.trim().startsWith('[');
47238
- let inferredWinningSide = winningSide;
47239
- if (!inferredWinningSide && matchUpFormat && neutralParsedSets) {
47240
- const setsWon = { side1: 0, side2: 0 };
47241
- neutralParsedSets.forEach((set) => {
47242
- if (set.winningSide === 1)
47243
- setsWon.side1++;
47244
- else if (set.winningSide === 2)
47245
- setsWon.side2++;
47246
- });
47247
- if (setsWon.side1 > setsWon.side2)
47248
- inferredWinningSide = 1;
47249
- else if (setsWon.side2 > setsWon.side1)
47250
- inferredWinningSide = 2;
47251
- }
47252
- const score = {};
47253
- const winningScoreString = generateScoreString({
47254
- sets: neutralParsedSets,
47255
- matchUpFormat,
47256
- setTBlast,
47257
- });
47258
- const losingScoreString = generateScoreString({
47259
- sets: neutralParsedSets,
47260
- reversed: true,
47261
- matchUpFormat,
47262
- setTBlast,
47263
- });
47264
- if (isBracketNotation) {
47265
- score.scoreStringSide1 = winningScoreString;
47266
- score.scoreStringSide2 = losingScoreString;
47267
- }
47268
- else if (inferredWinningSide === 2) {
47269
- score.scoreStringSide1 = losingScoreString;
47270
- score.scoreStringSide2 = winningScoreString;
47271
- }
47272
- else {
47273
- score.scoreStringSide1 = winningScoreString;
47274
- score.scoreStringSide2 = losingScoreString;
47275
- }
47276
- score.sets = parseScoreString({ scoreString: score.scoreStringSide1, matchUpFormat });
47347
+ const inferredWinningSide = inferWinningSide(winningSide, matchUpFormat, neutralParsedSets);
47348
+ const parsedFormat = parse(matchUpFormat);
47349
+ const isAggregateScoring = parsedFormat?.setFormat?.based === 'A' || parsedFormat?.finalSetFormat?.based === 'A';
47350
+ const score = isBracketNotation || isAggregateScoring
47351
+ ? generateScoreForSideOrder(scoreString, matchUpFormat, setTBlast)
47352
+ : generateScoreForWinnerOrder(neutralParsedSets, inferredWinningSide, matchUpFormat, setTBlast);
47277
47353
  return definedAttributes({
47278
47354
  outcome: {
47279
47355
  matchUpStatus,