fansunited-data-layer 0.13.0 → 0.14.2

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 (242) hide show
  1. package/api/fansunited/constants.js +5 -0
  2. package/api/fansunited/constants.js.map +1 -0
  3. package/api/fansunited/football/competition/index.js +21 -0
  4. package/api/fansunited/football/competition/index.js.map +1 -0
  5. package/api/fansunited/football/competition/transformer.js +41 -0
  6. package/api/fansunited/football/competition/transformer.js.map +1 -0
  7. package/api/fansunited/football/competitions/index.js +56 -0
  8. package/api/fansunited/football/competitions/index.js.map +1 -0
  9. package/api/fansunited/football/competitions/transformer.js +68 -0
  10. package/api/fansunited/football/competitions/transformer.js.map +1 -0
  11. package/api/fansunited/football/http.js +7 -0
  12. package/api/fansunited/football/http.js.map +1 -0
  13. package/api/fansunited/football/matches/index.js +132 -0
  14. package/api/fansunited/football/matches/index.js.map +1 -0
  15. package/api/fansunited/football/matches/transformer.js +148 -0
  16. package/api/fansunited/football/matches/transformer.js.map +1 -0
  17. package/api/fansunited/football/players/index.js +60 -0
  18. package/api/fansunited/football/players/index.js.map +1 -0
  19. package/api/fansunited/football/players/transformer.js +85 -0
  20. package/api/fansunited/football/players/transformer.js.map +1 -0
  21. package/api/fansunited/football/search/index.js +64 -0
  22. package/api/fansunited/football/search/index.js.map +1 -0
  23. package/api/fansunited/football/search/transformer.js +114 -0
  24. package/api/fansunited/football/search/transformer.js.map +1 -0
  25. package/api/fansunited/football/teams/index.js +66 -0
  26. package/api/fansunited/football/teams/index.js.map +1 -0
  27. package/api/fansunited/football/teams/transformer.js +53 -0
  28. package/api/fansunited/football/teams/transformer.js.map +1 -0
  29. package/api/fansunited/http.d.ts.map +1 -1
  30. package/api/fansunited/http.js +70 -0
  31. package/api/fansunited/http.js.map +1 -0
  32. package/api/fansunited/search/constants.js +5 -0
  33. package/api/fansunited/search/constants.js.map +1 -0
  34. package/api/fansunited/search/http.js +7 -0
  35. package/api/fansunited/search/http.js.map +1 -0
  36. package/api/fansunited/search/index.js +308 -0
  37. package/api/fansunited/search/index.js.map +1 -0
  38. package/api/fansunited/search/transformer.js +374 -0
  39. package/api/fansunited/search/transformer.js.map +1 -0
  40. package/api/fansunited-sdk/loyalty/matches.js +21 -0
  41. package/api/fansunited-sdk/loyalty/matches.js.map +1 -0
  42. package/api/fansunited-sdk/loyalty/template.js +52 -0
  43. package/api/fansunited-sdk/loyalty/template.js.map +1 -0
  44. package/api/fansunited-sdk/odds/matches.js +109 -0
  45. package/api/fansunited-sdk/odds/matches.js.map +1 -0
  46. package/api/sportal365-sports/basketball/games/index.js +32 -0
  47. package/api/sportal365-sports/basketball/games/index.js.map +1 -0
  48. package/api/sportal365-sports/basketball/games/transformers/game.js +137 -0
  49. package/api/sportal365-sports/basketball/games/transformers/game.js.map +1 -0
  50. package/api/sportal365-sports/basketball/http.js +7 -0
  51. package/api/sportal365-sports/basketball/http.js.map +1 -0
  52. package/api/sportal365-sports/constants.js +15 -0
  53. package/api/sportal365-sports/constants.js.map +1 -0
  54. package/api/sportal365-sports/football/competitions/index.js +52 -0
  55. package/api/sportal365-sports/football/competitions/index.js.map +1 -0
  56. package/api/sportal365-sports/football/competitions/utils.js +92 -0
  57. package/api/sportal365-sports/football/competitions/utils.js.map +1 -0
  58. package/api/sportal365-sports/football/http.js +7 -0
  59. package/api/sportal365-sports/football/http.js.map +1 -0
  60. package/api/sportal365-sports/football/matches/index.js +206 -0
  61. package/api/sportal365-sports/football/matches/index.js.map +1 -0
  62. package/api/sportal365-sports/football/matches/transformers/commentary.js +27 -0
  63. package/api/sportal365-sports/football/matches/transformers/commentary.js.map +1 -0
  64. package/api/sportal365-sports/football/matches/transformers/lineup.js +74 -0
  65. package/api/sportal365-sports/football/matches/transformers/lineup.js.map +1 -0
  66. package/api/sportal365-sports/football/matches/transformers/match-event.js +60 -0
  67. package/api/sportal365-sports/football/matches/transformers/match-event.js.map +1 -0
  68. package/api/sportal365-sports/football/matches/transformers/match.js +195 -0
  69. package/api/sportal365-sports/football/matches/transformers/match.js.map +1 -0
  70. package/api/sportal365-sports/football/matches/transformers/odds.js +11 -0
  71. package/api/sportal365-sports/football/matches/transformers/odds.js.map +1 -0
  72. package/api/sportal365-sports/football/matches/transformers/statistics.js +41 -0
  73. package/api/sportal365-sports/football/matches/transformers/statistics.js.map +1 -0
  74. package/api/sportal365-sports/football/search/index.js +42 -0
  75. package/api/sportal365-sports/football/search/index.js.map +1 -0
  76. package/api/sportal365-sports/football/search/search.transformer.js +166 -0
  77. package/api/sportal365-sports/football/search/search.transformer.js.map +1 -0
  78. package/api/sportal365-sports/football/standings/index.js +28 -0
  79. package/api/sportal365-sports/football/standings/index.js.map +1 -0
  80. package/api/sportal365-sports/football/standings/standing.transformer.js +107 -0
  81. package/api/sportal365-sports/football/standings/standing.transformer.js.map +1 -0
  82. package/api/sportal365-sports/football/statistics/index.js +154 -0
  83. package/api/sportal365-sports/football/statistics/index.js.map +1 -0
  84. package/api/sportal365-sports/football/statistics/player-career.transformer.js +77 -0
  85. package/api/sportal365-sports/football/statistics/player-career.transformer.js.map +1 -0
  86. package/api/sportal365-sports/football/statistics/player-recent.transformer.js +54 -0
  87. package/api/sportal365-sports/football/statistics/player-recent.transformer.js.map +1 -0
  88. package/api/sportal365-sports/football/statistics/player-season.transformer.js +147 -0
  89. package/api/sportal365-sports/football/statistics/player-season.transformer.js.map +1 -0
  90. package/api/sportal365-sports/football/teams/index.js +73 -0
  91. package/api/sportal365-sports/football/teams/index.js.map +1 -0
  92. package/api/sportal365-sports/football/teams/utils.js +196 -0
  93. package/api/sportal365-sports/football/teams/utils.js.map +1 -0
  94. package/api/sportal365-sports/http.js +58 -0
  95. package/api/sportal365-sports/http.js.map +1 -0
  96. package/api/sportal365-sports/search/http.js +7 -0
  97. package/api/sportal365-sports/search/http.js.map +1 -0
  98. package/api/sportal365-sports/search/index.js +61 -0
  99. package/api/sportal365-sports/search/index.js.map +1 -0
  100. package/api/sportal365-sports/search/search.transformer.js +254 -0
  101. package/api/sportal365-sports/search/search.transformer.js.map +1 -0
  102. package/api/sportal365-sports/shared/odds.transformer.js +65 -0
  103. package/api/sportal365-sports/shared/odds.transformer.js.map +1 -0
  104. package/api/sportal365-sports/shared/providerRef.helper.js +31 -0
  105. package/api/sportal365-sports/shared/providerRef.helper.js.map +1 -0
  106. package/api/sportal365-sports/standings/http.js +7 -0
  107. package/api/sportal365-sports/standings/http.js.map +1 -0
  108. package/api/sportal365-sports/standings/index.js +29 -0
  109. package/api/sportal365-sports/standings/index.js.map +1 -0
  110. package/api/sportal365-sports/standings/standing.transformer.js +185 -0
  111. package/api/sportal365-sports/standings/standing.transformer.js.map +1 -0
  112. package/api/sportal365-sports/statistics/http.js +7 -0
  113. package/api/sportal365-sports/statistics/http.js.map +1 -0
  114. package/api/sportal365-sports/statistics/index.js +25 -0
  115. package/api/sportal365-sports/statistics/index.js.map +1 -0
  116. package/api/sportal365-sports/statistics/team-stats.transformer.js +16 -0
  117. package/api/sportal365-sports/statistics/team-stats.transformer.js.map +1 -0
  118. package/api/sportal365-sports/tennis/http.js +7 -0
  119. package/api/sportal365-sports/tennis/http.js.map +1 -0
  120. package/api/sportal365-sports/tennis/matches/index.js +34 -0
  121. package/api/sportal365-sports/tennis/matches/index.js.map +1 -0
  122. package/api/sportal365-sports/tennis/matches/transformers/match.js +193 -0
  123. package/api/sportal365-sports/tennis/matches/transformers/match.js.map +1 -0
  124. package/cache/cache-manager.js +136 -0
  125. package/cache/cache-manager.js.map +1 -0
  126. package/cache/memory-store.js +29 -0
  127. package/cache/memory-store.js.map +1 -0
  128. package/client.js +38 -12337
  129. package/client.js.map +1 -0
  130. package/config/index.js +20 -0
  131. package/config/index.js.map +1 -0
  132. package/fansunited-data-layer.js +146 -3553
  133. package/fansunited-data-layer.js.map +1 -0
  134. package/helpers/competition.helpers.js +11 -0
  135. package/helpers/competition.helpers.js.map +1 -0
  136. package/helpers/player.helpers.js +165 -0
  137. package/helpers/player.helpers.js.map +1 -0
  138. package/helpers/player.hooks.js +34 -0
  139. package/helpers/player.hooks.js.map +1 -0
  140. package/helpers/team.helpers.js +216 -0
  141. package/helpers/team.helpers.js.map +1 -0
  142. package/package.json +6 -8
  143. package/providers/competition/hooks/useCompetitionStats.js +10 -0
  144. package/providers/competition/hooks/useCompetitionStats.js.map +1 -0
  145. package/providers/competition/hooks/useGoalDistribution.js +23 -0
  146. package/providers/competition/hooks/useGoalDistribution.js.map +1 -0
  147. package/providers/competition/hooks/useMatchHelpers.js +85 -0
  148. package/providers/competition/hooks/useMatchHelpers.js.map +1 -0
  149. package/providers/competition/hooks/useStandingsCalculations.js +89 -0
  150. package/providers/competition/hooks/useStandingsCalculations.js.map +1 -0
  151. package/providers/competition/hooks/useStandingsHelpers.js +61 -0
  152. package/providers/competition/hooks/useStandingsHelpers.js.map +1 -0
  153. package/providers/competition/hooks/useTeamPosition.js +15 -0
  154. package/providers/competition/hooks/useTeamPosition.js.map +1 -0
  155. package/providers/competition/hooks/useTeamResultsTable.js +86 -0
  156. package/providers/competition/hooks/useTeamResultsTable.js.map +1 -0
  157. package/providers/competition/utils/competitionStats.js +109 -0
  158. package/providers/competition/utils/competitionStats.js.map +1 -0
  159. package/providers/competition/utils/goalDistribution.js +64 -0
  160. package/providers/competition/utils/goalDistribution.js.map +1 -0
  161. package/providers/competition/utils/standingsCalculations.js +152 -0
  162. package/providers/competition/utils/standingsCalculations.js.map +1 -0
  163. package/providers/competition.context.js +14 -0
  164. package/providers/competition.context.js.map +1 -0
  165. package/providers/competition.provider.js +187 -0
  166. package/providers/competition.provider.js.map +1 -0
  167. package/providers/fansunited-config.context.js +6 -0
  168. package/providers/fansunited-config.context.js.map +1 -0
  169. package/providers/fansunited-config.hooks.js +20 -0
  170. package/providers/fansunited-config.hooks.js.map +1 -0
  171. package/providers/fansunited-config.provider.js +9 -0
  172. package/providers/fansunited-config.provider.js.map +1 -0
  173. package/providers/fansunited-sdk.hook.js +50 -0
  174. package/providers/fansunited-sdk.hook.js.map +1 -0
  175. package/providers/leaderboard/hooks/useMatchHelpers.js +30 -0
  176. package/providers/leaderboard/hooks/useMatchHelpers.js.map +1 -0
  177. package/providers/leaderboard/hooks/useTemplateHelpers.js +39 -0
  178. package/providers/leaderboard/hooks/useTemplateHelpers.js.map +1 -0
  179. package/providers/leaderboard.context.js +14 -0
  180. package/providers/leaderboard.context.js.map +1 -0
  181. package/providers/leaderboard.provider.js +98 -0
  182. package/providers/leaderboard.provider.js.map +1 -0
  183. package/providers/match/hooks/useBatchMatchOdds.js +72 -0
  184. package/providers/match/hooks/useBatchMatchOdds.js.map +1 -0
  185. package/providers/match/hooks/useEventHelpers.js +46 -0
  186. package/providers/match/hooks/useEventHelpers.js.map +1 -0
  187. package/providers/match/hooks/useHeadToHeadHelpers.js +52 -0
  188. package/providers/match/hooks/useHeadToHeadHelpers.js.map +1 -0
  189. package/providers/match/hooks/useLineupHelpers.js +53 -0
  190. package/providers/match/hooks/useLineupHelpers.js.map +1 -0
  191. package/providers/match/hooks/useMatchStandingsCalculations.js +332 -0
  192. package/providers/match/hooks/useMatchStandingsCalculations.js.map +1 -0
  193. package/providers/match/hooks/useMatchStatus.js +37 -0
  194. package/providers/match/hooks/useMatchStatus.js.map +1 -0
  195. package/providers/match/hooks/useOddsHelpers.js +54 -0
  196. package/providers/match/hooks/useOddsHelpers.js.map +1 -0
  197. package/providers/match/hooks/useScoreHelpers.js +34 -0
  198. package/providers/match/hooks/useScoreHelpers.js.map +1 -0
  199. package/providers/match/hooks/useStandingsHelpers.js +53 -0
  200. package/providers/match/hooks/useStandingsHelpers.js.map +1 -0
  201. package/providers/match/hooks/useStatisticsHelpers.js +40 -0
  202. package/providers/match/hooks/useStatisticsHelpers.js.map +1 -0
  203. package/providers/match/hooks/useTeamHelpers.js +38 -0
  204. package/providers/match/hooks/useTeamHelpers.js.map +1 -0
  205. package/providers/match/hooks/useTeamStatsHelpers.js +141 -0
  206. package/providers/match/hooks/useTeamStatsHelpers.js.map +1 -0
  207. package/providers/match.context.js +14 -0
  208. package/providers/match.context.js.map +1 -0
  209. package/providers/match.provider.js +176 -0
  210. package/providers/match.provider.js.map +1 -0
  211. package/providers/team/hooks/useFormStats.js +116 -0
  212. package/providers/team/hooks/useFormStats.js.map +1 -0
  213. package/providers/team/hooks/useMatchHelpers.js +46 -0
  214. package/providers/team/hooks/useMatchHelpers.js.map +1 -0
  215. package/providers/team/hooks/useSquadHelpers.js +67 -0
  216. package/providers/team/hooks/useSquadHelpers.js.map +1 -0
  217. package/providers/team.context.js +14 -0
  218. package/providers/team.context.js.map +1 -0
  219. package/providers/team.provider.js +98 -0
  220. package/providers/team.provider.js.map +1 -0
  221. package/utilities/stats/core/helpers.js +105 -0
  222. package/utilities/stats/core/helpers.js.map +1 -0
  223. package/utilities/stats/core/types.js +5 -0
  224. package/utilities/stats/core/types.js.map +1 -0
  225. package/utilities/stats/match/headToHead.js +83 -0
  226. package/utilities/stats/match/headToHead.js.map +1 -0
  227. package/utilities/stats/match/homeVsAway.js +140 -0
  228. package/utilities/stats/match/homeVsAway.js.map +1 -0
  229. package/utilities/stats/match/overUnder.js +91 -0
  230. package/utilities/stats/match/overUnder.js.map +1 -0
  231. package/utilities/stats/match/result.js +21 -0
  232. package/utilities/stats/match/result.js.map +1 -0
  233. package/utilities/stats/team/commonOpponents.js +77 -0
  234. package/utilities/stats/team/commonOpponents.js.map +1 -0
  235. package/utilities/stats/team/goalStats.js +50 -0
  236. package/utilities/stats/team/goalStats.js.map +1 -0
  237. package/utilities/stats/team/streaks.js +183 -0
  238. package/utilities/stats/team/streaks.js.map +1 -0
  239. package/client.cjs +0 -8
  240. package/fansunited-data-layer.cjs +0 -1
  241. package/matches-BvHU-bP0.js +0 -1795
  242. package/matches-Ci0Ci_Mw.cjs +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matches.js","sources":["../../../../src/lib/api/fansunited-sdk/odds/matches.ts"],"sourcesContent":["/**\n * SDK-based odds operations for matches\n *\n * These functions use the FansUnited SDK's odds namespace to fetch betting odds\n * for matches and transform them to canonical types.\n */\n\nimport type FansUnitedSDKModel from \"fansunited-sdk-esm/Core/Global/Models/FansUnitedSDKModel\";\nimport type { FUSportsBatchMatchOdds, FUSportsBettingOperatorOdds } from \"../../../types/canonical\";\nimport type { MarketType } from \"../../sportal365-sports/football/matches/types\";\n\n/**\n * Options for fetching batch match odds\n */\nexport interface GetBatchMatchOddsOptions {\n /** Market types to include (e.g., ['1x2', 'OVER_UNDER']) */\n marketTypes?: MarketType[];\n /** Filter odds by specific bookmaker/operator IDs */\n bookmakerIds?: string[];\n /** Type of odds: PRE_EVENT, LIVE, or ALL (default: ALL) */\n oddType?: \"PRE_EVENT\" | \"LIVE\" | \"ALL\";\n /** Scope type for odds (default: ORDINARY_TIME) */\n scopeType?: \"ORDINARY_TIME\" | \"FULL_TIME\";\n /** Format of odds (default: DECIMAL) */\n oddFormat?: \"FRACTIONAL\" | \"DECIMAL\" | \"MONEYLINE\";\n}\n\n/**\n * Map SDK market type string to SDK enum\n */\nfunction getMarketTypeEnum(marketType: MarketType): string {\n // Map our canonical market types to SDK MatchOddsMarketEnum values\n const marketTypeMap: Record<MarketType, string> = {\n \"1x2\": \"FT_1X2\",\n \"12\": \"FT_1X2\",\n OVER_UNDER: \"OVER_GOALS_2_5\",\n DOUBLE_CHANCE: \"DOUBLE_CHANCE\",\n BOTH_TO_SCORE: \"BOTH_TEAMS_SCORE\",\n DRAW_NO_BET: \"DRAW_NO_BET\",\n FIRST_TEAM_TO_SCORE: \"FIRST_TEAM_TO_SCORE\",\n CORRECT_SCORE: \"CORRECT_SCORE\",\n FIRST_HALF_GOALS: \"FIRST_HALF_GOALS\",\n FIRST_PLAYER_TO_SCORE: \"PLAYER_SCORE_FIRST_GOAL\",\n PLAYER_TO_SCORE_DURING_GAME: \"PLAYER_SCORE\",\n PLAYER_TO_RECEIVE_CARD: \"PLAYER_YELLOW_CARD\",\n FIRST_HALF_AND_FINAL_RESULT: \"HT_FT\",\n };\n\n return marketTypeMap[marketType] || marketType.toUpperCase();\n}\n\n/**\n * Transform SDK odds response to canonical format\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction transformSDKOdds(sdkOddsMap: Map<string, any[]>, bookmakerIds?: string[]): FUSportsBatchMatchOdds {\n const result: FUSportsBatchMatchOdds = new Map();\n\n sdkOddsMap.forEach((matchOdds, matchId) => {\n if (!matchOdds || matchOdds.length === 0) {\n return;\n }\n\n // Filter by bookmaker IDs if provided\n const filteredOdds = bookmakerIds\n ? matchOdds.filter((odd) => odd.bookmaker && bookmakerIds.includes(odd.bookmaker.id))\n : matchOdds;\n\n // Transform to canonical format\n const operators: FUSportsBettingOperatorOdds[] = filteredOdds\n .filter((odd) => odd.bookmaker && odd.markets && odd.markets.length > 0)\n .map((odd) => {\n const bookmaker = odd.bookmaker;\n const firstAsset = bookmaker.assets?.[0];\n\n // Get background color from branding or assets\n const backgroundColor = bookmaker.branding?.backgroundColor || firstAsset?.backgroundColor;\n\n // Get text color from branding, or calculate based on background\n const textColor =\n bookmaker.branding?.textColor || (isDarkColor(backgroundColor) ? \"#FFFFFF\" : \"#000000\");\n\n // Prefer transparent background URL, fallback to regular logo\n const logo = firstAsset?.transparentBackgroundUrl || firstAsset?.logo;\n\n // Get operator URL: prefer eventUrls, fallback to links homepage\n /* eslint-disable @typescript-eslint/no-explicit-any */\n const operatorUrl =\n bookmaker.eventUrls?.find((u: any) => u.appType === \"desktop\")?.url ||\n bookmaker.links?.find((l: any) => l.appType === \"desktop\")?.homepageUrl ||\n bookmaker.url ||\n \"\";\n /* eslint-enable @typescript-eslint/no-explicit-any */\n\n return {\n operator: {\n id: bookmaker.id,\n name: bookmaker.name,\n url: operatorUrl,\n branding: {\n backgroundColor,\n textColor,\n logo,\n },\n },\n type: odd.type,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n markets: odd.markets.map((market: any) => ({\n type: {\n id: market.type.id,\n code: market.type.code,\n name: market.type.name,\n },\n period: {\n id: market.scope.id,\n type: market.scope.type,\n name: market.scope.name,\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n selections: market.selections.map((selection: any) => {\n // Get the desktop URL from selection.urls array\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const selectionUrl = selection.urls?.find((u: any) => u.appType === \"desktop\")?.url;\n\n // Map movement to canonical format\n let movement: \"UP\" | \"DOWN\" | \"NONE\" = \"NONE\";\n if (selection.movement === \"UP\") movement = \"UP\";\n else if (selection.movement === \"DOWN\") movement = \"DOWN\";\n\n return {\n id: selection.id,\n name: selection.name,\n code: selection.code,\n value: selection.value,\n odds: selection.odds,\n oddsOld: selection.oddsOld,\n movement,\n url: selectionUrl,\n providerSelectionId: selection.providerInfo?.selectionId,\n };\n }),\n })),\n };\n });\n\n result.set(matchId, operators);\n });\n\n return result;\n}\n\n/**\n * Determine if a color is dark based on luminance\n */\nfunction isDarkColor(hexColor?: string): boolean {\n if (!hexColor) return true;\n\n const hex = hexColor.replace(\"#\", \"\");\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n\n // Calculate relative luminance (ITU-R BT.709)\n const luminance = (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255;\n\n return luminance < 0.5;\n}\n\n/**\n * Get betting odds for multiple matches in a single API call\n *\n * Fetches odds for multiple matches using the SDK's batch odds endpoint.\n * This is more efficient than making individual calls for each match.\n *\n * @param sdk - The FansUnited SDK instance\n * @param matchIds - Array of match IDs to fetch odds for\n * @param options - Optional parameters for filtering odds\n * @returns Map of match IDs to their betting odds in canonical format\n *\n * @example\n * ```typescript\n * import { useFansUnitedSDK } from 'fansunited-data-layer/client';\n * import { getBatchMatchOdds } from 'fansunited-data-layer/client';\n *\n * function MyComponent() {\n * const sdk = useFansUnitedSDK();\n *\n * const fetchOdds = async () => {\n * if (!sdk) return;\n * const oddsMap = await getBatchMatchOdds(sdk, ['match1', 'match2', 'match3'], {\n * marketTypes: ['1x2', 'OVER_UNDER'],\n * oddType: 'PRE_EVENT'\n * });\n * console.log(oddsMap); // Map<matchId, operators[]>\n * };\n * }\n * ```\n */\nexport async function getBatchMatchOdds(\n sdk: FansUnitedSDKModel,\n matchIds: string[],\n options?: GetBatchMatchOddsOptions\n): Promise<FUSportsBatchMatchOdds> {\n if (!matchIds || matchIds.length === 0) {\n return new Map();\n }\n\n // Build filters for SDK call\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const filters: any = {\n oddType: options?.oddType || \"ALL\",\n scopeType: options?.scopeType || \"ORDINARY_TIME\",\n oddFormat: options?.oddFormat || \"DECIMAL\",\n };\n\n // Add market types if provided\n if (options?.marketTypes && options.marketTypes.length > 0) {\n filters.marketTypes = options.marketTypes.map((market) => getMarketTypeEnum(market));\n }\n\n // Call SDK odds.getByMatchIds()\n const sdkResponse = await sdk.odds.getByMatchIds(matchIds, filters);\n\n // Transform to canonical format\n return transformSDKOdds(sdkResponse, options?.bookmakerIds);\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { getConfig } from "../../../../config/index.js";
2
+ import { basketballHttp } from "../http.js";
3
+ import { transformBasketballGame } from "./transformers/game.js";
4
+ async function getBasketballLivescore(options, config) {
5
+ const finalConfig = config || getConfig();
6
+ const { sportal365Sports } = finalConfig;
7
+ const raw = await basketballHttp.get({
8
+ path: `/games`,
9
+ params: {
10
+ offset: "0",
11
+ limit: "1000",
12
+ competition_list: options?.competitionList,
13
+ status_type: options?.statusTypes,
14
+ from_game_time: options?.fromGameTime,
15
+ to_game_time: options?.toGameTime,
16
+ odd_client: options?.oddClient ?? sportal365Sports?.oddClient,
17
+ odd_type: options?.oddType,
18
+ market_types: options?.marketTypes,
19
+ language_code: options?.languageCode ?? sportal365Sports?.languageCode ?? "en"
20
+ },
21
+ headers: {
22
+ "Accept-Language": options?.languageCode ?? sportal365Sports?.languageCode ?? "en"
23
+ },
24
+ next: options?.next,
25
+ config: finalConfig
26
+ });
27
+ return raw.games.map(transformBasketballGame);
28
+ }
29
+ export {
30
+ getBasketballLivescore
31
+ };
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/lib/api/sportal365-sports/basketball/games/index.ts"],"sourcesContent":["/**\n * Basketball games API functions\n */\n\nimport type { FUSportsMatch } from \"../../../../types/canonical\";\nimport type { DataLayerConfig } from \"../../../../config\";\nimport { getConfig } from \"../../../../config\";\nimport { basketballHttp } from \"../http\";\nimport type { RawBasketballGame, GetBasketballLivescoreOptions } from \"./types\";\nimport { transformBasketballGame } from \"./transformers/game\";\n\n/**\n * Get basketball livescore data\n *\n * Fetches live and recent basketball games from the Sportal365 Basketball API.\n * Returns data in canonical FUSportsMatch format.\n *\n * @param options - Optional filters and configuration\n * @param config - Optional data layer configuration\n * @returns Array of basketball matches in canonical format\n *\n * @example\n * ```typescript\n * // Get all live basketball games\n * const liveGames = await getBasketballLivescore({\n * statusTypes: ['LIVE']\n * });\n *\n * // Get games for a specific competition\n * const nbaGames = await getBasketballLivescore({\n * competitionList: 'nba',\n * statusTypes: ['LIVE', 'NOT_STARTED']\n * });\n * ```\n */\nexport async function getBasketballLivescore(\n options?: GetBasketballLivescoreOptions,\n config?: DataLayerConfig\n): Promise<FUSportsMatch[]> {\n const finalConfig = config || getConfig();\n const { sportal365Sports } = finalConfig;\n\n const raw = await basketballHttp.get<{ games: RawBasketballGame[] }>({\n path: `/games`,\n params: {\n offset: \"0\",\n limit: \"1000\",\n competition_list: options?.competitionList,\n status_type: options?.statusTypes,\n from_game_time: options?.fromGameTime,\n to_game_time: options?.toGameTime,\n odd_client: options?.oddClient ?? sportal365Sports?.oddClient,\n odd_type: options?.oddType,\n market_types: options?.marketTypes,\n language_code: options?.languageCode ?? sportal365Sports?.languageCode ?? \"en\",\n },\n headers: {\n \"Accept-Language\": options?.languageCode ?? sportal365Sports?.languageCode ?? \"en\",\n },\n next: options?.next,\n config: finalConfig,\n });\n\n return raw.games.map(transformBasketballGame);\n}\n"],"names":[],"mappings":";;;AAmCA,eAAsB,uBAClB,SACA,QACwB;AACxB,QAAM,cAAc,UAAU,UAAA;AAC9B,QAAM,EAAE,qBAAqB;AAE7B,QAAM,MAAM,MAAM,eAAe,IAAoC;AAAA,IACjE,MAAM;AAAA,IACN,QAAQ;AAAA,MACJ,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,kBAAkB,SAAS;AAAA,MAC3B,aAAa,SAAS;AAAA,MACtB,gBAAgB,SAAS;AAAA,MACzB,cAAc,SAAS;AAAA,MACvB,YAAY,SAAS,aAAa,kBAAkB;AAAA,MACpD,UAAU,SAAS;AAAA,MACnB,cAAc,SAAS;AAAA,MACvB,eAAe,SAAS,gBAAgB,kBAAkB,gBAAgB;AAAA,IAAA;AAAA,IAE9E,SAAS;AAAA,MACL,mBAAmB,SAAS,gBAAgB,kBAAkB,gBAAgB;AAAA,IAAA;AAAA,IAElF,MAAM,SAAS;AAAA,IACf,QAAQ;AAAA,EAAA,CACX;AAED,SAAO,IAAI,MAAM,IAAI,uBAAuB;AAChD;"}
@@ -0,0 +1,137 @@
1
+ import { transformOdds } from "../../../shared/odds.transformer.js";
2
+ import { toProviderRefArray } from "../../../shared/providerRef.helper.js";
3
+ function transformStatus(raw) {
4
+ const typeMap = {
5
+ FINISHED: "finished",
6
+ NOT_STARTED: "not_started",
7
+ LIVE: "live",
8
+ INTERRUPTED: "interrupted",
9
+ CANCELLED: "cancelled",
10
+ POSTPONED: "postponed",
11
+ UNKNOWN: "not_started"
12
+ };
13
+ const normalizedType = raw.type.toUpperCase();
14
+ return {
15
+ code: typeMap[normalizedType] ?? "not_started",
16
+ name: raw.name,
17
+ shortName: raw.short_name,
18
+ type: normalizedType
19
+ };
20
+ }
21
+ function transformTeam(raw) {
22
+ return {
23
+ id: raw.id,
24
+ name: raw.name,
25
+ threeLetterCode: raw.three_letter_code,
26
+ slug: raw.slug,
27
+ type: raw.type === "national" ? "national" : "club",
28
+ gender: raw.gender
29
+ };
30
+ }
31
+ function transformTiming(raw) {
32
+ return {
33
+ kickoffTime: new Date(raw.game_time),
34
+ currentMinute: raw.minute
35
+ };
36
+ }
37
+ function transformCompetition(raw) {
38
+ if (!raw.season?.competition) return void 0;
39
+ const comp = raw.season.competition;
40
+ return {
41
+ id: comp.id,
42
+ name: comp.name,
43
+ slug: comp.slug,
44
+ type: "LEAGUE",
45
+ gender: comp.gender,
46
+ region: comp.region,
47
+ country: comp.country ? {
48
+ id: comp.country.id,
49
+ name: comp.country.name
50
+ } : void 0,
51
+ season: {
52
+ id: raw.season.id,
53
+ name: raw.season.name,
54
+ status: raw.season.status
55
+ },
56
+ stage: raw.stage ? {
57
+ id: raw.stage.id,
58
+ name: raw.stage.name,
59
+ type: raw.stage.type
60
+ } : void 0
61
+ };
62
+ }
63
+ function transformVenue(raw) {
64
+ if (!raw) return void 0;
65
+ return {
66
+ id: raw.id,
67
+ name: raw.name,
68
+ slug: raw.slug
69
+ };
70
+ }
71
+ function transformScore(raw) {
72
+ if (!raw || raw.length === 0) return void 0;
73
+ const periodScores = raw.filter((s) => s.result_type.category === "single_period");
74
+ if (periodScores.length === 0) return void 0;
75
+ let homeTotal = 0;
76
+ let awayTotal = 0;
77
+ const periods = [];
78
+ for (const period of periodScores) {
79
+ homeTotal += period.home;
80
+ awayTotal += period.away;
81
+ periods.push({
82
+ competitorOne: String(period.home),
83
+ competitorTwo: String(period.away)
84
+ });
85
+ }
86
+ return {
87
+ competitorOne: String(homeTotal),
88
+ competitorTwo: String(awayTotal),
89
+ breakdown: {
90
+ total: {
91
+ competitorOne: String(homeTotal),
92
+ competitorTwo: String(awayTotal)
93
+ },
94
+ periods
95
+ }
96
+ };
97
+ }
98
+ function transformWinner(raw) {
99
+ if (!raw.winner) return void 0;
100
+ return {
101
+ competitorId: raw.winner.id
102
+ };
103
+ }
104
+ function transformBasketballGame(raw) {
105
+ return {
106
+ id: raw.id,
107
+ slug: raw.slug,
108
+ sport: "basketball",
109
+ status: transformStatus(raw.status),
110
+ timing: transformTiming(raw),
111
+ competitorOne: transformTeam(raw.home_team),
112
+ competitorTwo: transformTeam(raw.away_team),
113
+ competition: transformCompetition(raw),
114
+ round: raw.round ? {
115
+ id: raw.round.id,
116
+ key: raw.round.uuid,
117
+ name: raw.round.name,
118
+ type: "REGULAR",
119
+ providerRef: toProviderRefArray(raw.round.uuid)
120
+ } : void 0,
121
+ venue: transformVenue(raw.arena),
122
+ score: transformScore(raw.score),
123
+ winner: transformWinner(raw),
124
+ odds: raw.odds ? transformOdds(raw.odds) : void 0,
125
+ coverage: raw.coverage === "NOT_LIVE" ? "UNKNOWN" : raw.coverage,
126
+ providerRef: [
127
+ {
128
+ provider: "sportal365-basketball",
129
+ id: raw.id
130
+ }
131
+ ]
132
+ };
133
+ }
134
+ export {
135
+ transformBasketballGame
136
+ };
137
+ //# sourceMappingURL=game.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"game.js","sources":["../../../../../../src/lib/api/sportal365-sports/basketball/games/transformers/game.ts"],"sourcesContent":["/**\n * Basketball game transformation utilities\n * Transforms raw Basketball API game responses to canonical FUSports types\n */\n\nimport type {\n FUSportsMatch,\n FUSportsMatchStatus,\n FUSportsMatchTiming,\n FUSportsTeamCompetitor,\n FUSportsCompetition,\n FUSportsVenue,\n FUSportsMatchScore,\n FUSportsMatchWinner,\n} from \"../../../../../types/canonical\";\nimport type { RawBasketballGame } from \"../types\";\nimport { toProviderRefArray, transformOdds } from \"../../../shared\";\n\n/**\n * Transform raw basketball status to canonical format\n */\nfunction transformStatus(raw: RawBasketballGame[\"status\"]): FUSportsMatchStatus {\n const typeMap: Record<string, FUSportsMatchStatus[\"code\"]> = {\n FINISHED: \"finished\",\n NOT_STARTED: \"not_started\",\n LIVE: \"live\",\n INTERRUPTED: \"interrupted\",\n CANCELLED: \"cancelled\",\n POSTPONED: \"postponed\",\n UNKNOWN: \"not_started\",\n };\n\n const normalizedType = raw.type.toUpperCase();\n return {\n code: typeMap[normalizedType] ?? \"not_started\",\n name: raw.name,\n shortName: raw.short_name,\n type: normalizedType as FUSportsMatchStatus[\"type\"],\n };\n}\n\n/**\n * Transform raw basketball team to canonical competitor\n */\nfunction transformTeam(raw: RawBasketballGame[\"home_team\"]): FUSportsTeamCompetitor {\n return {\n id: raw.id,\n name: raw.name,\n threeLetterCode: raw.three_letter_code,\n slug: raw.slug,\n type: (raw.type === \"national\" ? \"national\" : \"club\") as \"club\" | \"national\",\n gender: raw.gender as FUSportsTeamCompetitor[\"gender\"],\n };\n}\n\n/**\n * Transform raw basketball timing to canonical format\n */\nfunction transformTiming(raw: RawBasketballGame): FUSportsMatchTiming {\n return {\n kickoffTime: new Date(raw.game_time),\n currentMinute: raw.minute,\n };\n}\n\n/**\n * Transform raw basketball competition to canonical format\n */\nfunction transformCompetition(raw: RawBasketballGame): FUSportsCompetition | undefined {\n if (!raw.season?.competition) return undefined;\n\n const comp = raw.season.competition;\n return {\n id: comp.id,\n name: comp.name,\n slug: comp.slug,\n type: \"LEAGUE\" as const,\n gender: comp.gender as FUSportsCompetition[\"gender\"],\n region: comp.region as FUSportsCompetition[\"region\"],\n country: comp.country\n ? {\n id: comp.country.id,\n name: comp.country.name,\n }\n : undefined,\n season: {\n id: raw.season.id,\n name: raw.season.name,\n status: raw.season.status,\n },\n stage: raw.stage\n ? {\n id: raw.stage.id,\n name: raw.stage.name,\n type: raw.stage.type,\n }\n : undefined,\n };\n}\n\n/**\n * Transform raw basketball venue to canonical format\n */\nfunction transformVenue(raw: RawBasketballGame[\"arena\"]): FUSportsVenue | undefined {\n if (!raw) return undefined;\n\n return {\n id: raw.id,\n name: raw.name,\n slug: raw.slug,\n };\n}\n\n/**\n * Transform raw basketball score to canonical format\n * Basketball scores are an array of quarters/periods\n */\nfunction transformScore(raw: RawBasketballGame[\"score\"]): FUSportsMatchScore | undefined {\n if (!raw || raw.length === 0) return undefined;\n\n // The raw score array mixes individual period scores (category: \"single_period\") with\n // cumulative totals (category: null) such as \"runningscore\", \"ordinarytime\", \"finalresult\".\n const periodScores = raw.filter((s) => s.result_type.category === \"single_period\");\n if (periodScores.length === 0) return undefined;\n\n let homeTotal = 0;\n let awayTotal = 0;\n const periods: Array<{ competitorOne: string; competitorTwo: string }> = [];\n\n for (const period of periodScores) {\n homeTotal += period.home;\n awayTotal += period.away;\n periods.push({\n competitorOne: String(period.home),\n competitorTwo: String(period.away),\n });\n }\n\n return {\n competitorOne: String(homeTotal),\n competitorTwo: String(awayTotal),\n breakdown: {\n total: {\n competitorOne: String(homeTotal),\n competitorTwo: String(awayTotal),\n },\n periods,\n },\n };\n}\n\n/**\n * Transform raw basketball winner to canonical format\n */\nfunction transformWinner(raw: RawBasketballGame): FUSportsMatchWinner | undefined {\n if (!raw.winner) return undefined;\n\n return {\n competitorId: raw.winner.id,\n };\n}\n\n/**\n * Transform raw basketball game response to canonical FUSportsMatch\n */\nexport function transformBasketballGame(raw: RawBasketballGame): FUSportsMatch {\n return {\n id: raw.id,\n slug: raw.slug,\n sport: \"basketball\",\n status: transformStatus(raw.status),\n timing: transformTiming(raw),\n\n competitorOne: transformTeam(raw.home_team),\n competitorTwo: transformTeam(raw.away_team),\n\n competition: transformCompetition(raw),\n round: raw.round\n ? {\n id: raw.round.id,\n key: raw.round.uuid,\n name: raw.round.name,\n type: \"REGULAR\",\n providerRef: toProviderRefArray(raw.round.uuid),\n }\n : undefined,\n\n venue: transformVenue(raw.arena),\n\n score: transformScore(raw.score),\n\n winner: transformWinner(raw),\n\n odds: raw.odds ? transformOdds(raw.odds) : undefined,\n\n coverage: raw.coverage === \"NOT_LIVE\" ? \"UNKNOWN\" : (raw.coverage as FUSportsMatch[\"coverage\"]),\n\n providerRef: [\n {\n provider: \"sportal365-basketball\",\n id: raw.id,\n },\n ],\n };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { createHttpClient } from "../http.js";
2
+ import { SPORTAL365_BASKETBALL_DOMAIN } from "../constants.js";
3
+ const basketballHttp = createHttpClient(SPORTAL365_BASKETBALL_DOMAIN);
4
+ export {
5
+ basketballHttp
6
+ };
7
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sources":["../../../../src/lib/api/sportal365-sports/basketball/http.ts"],"sourcesContent":["/**\n * Basketball HTTP client for Sportal365 API\n */\n\nimport { createHttpClient } from '../http';\nimport { SPORTAL365_BASKETBALL_DOMAIN } from '../constants';\n\n/**\n * HTTP client configured for the Sportal365 Basketball API\n */\nexport const basketballHttp = createHttpClient(SPORTAL365_BASKETBALL_DOMAIN);\n\n"],"names":[],"mappings":";;AAUO,MAAM,iBAAiB,iBAAiB,4BAA4B;"}
@@ -0,0 +1,15 @@
1
+ const SPORTAL365_FOOTBALL_DOMAIN = "https://football.api.sportal365.com";
2
+ const SPORTAL365_BASKETBALL_DOMAIN = "https://basketball.api.sportal365.com";
3
+ const SPORTAL365_TENNIS_DOMAIN = "https://tennis.api.sportal365.com";
4
+ const SPORTAL365_STATISTICS_DOMAIN = "https://sports-statistics.api.sportal365.com";
5
+ const SPORTAL365_SPORTS_SEARCH_DOMAIN = "https://sports-search.api.sportal365.com";
6
+ const SPORTAL365_STANDINGS_DOMAIN = "https://standing.api.sportal365.com";
7
+ export {
8
+ SPORTAL365_BASKETBALL_DOMAIN,
9
+ SPORTAL365_FOOTBALL_DOMAIN,
10
+ SPORTAL365_SPORTS_SEARCH_DOMAIN,
11
+ SPORTAL365_STANDINGS_DOMAIN,
12
+ SPORTAL365_STATISTICS_DOMAIN,
13
+ SPORTAL365_TENNIS_DOMAIN
14
+ };
15
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sources":["../../../src/lib/api/sportal365-sports/constants.ts"],"sourcesContent":["/**\n * Sportal365 API Domain Constants\n *\n * Each Sportal365 API has its own domain based on the sport/functionality.\n */\n\n/** Football API domain */\nexport const SPORTAL365_FOOTBALL_DOMAIN = \"https://football.api.sportal365.com\";\n\n/** Basketball API domain */\nexport const SPORTAL365_BASKETBALL_DOMAIN = \"https://basketball.api.sportal365.com\";\n\n/** Tennis API domain */\nexport const SPORTAL365_TENNIS_DOMAIN = \"https://tennis.api.sportal365.com\";\n\n/** Statistics API domain */\nexport const SPORTAL365_STATISTICS_DOMAIN = \"https://sports-statistics.api.sportal365.com\";\n\n/** Sports Search API domain */\nexport const SPORTAL365_SPORTS_SEARCH_DOMAIN = \"https://sports-search.api.sportal365.com\";\n\n/** Standings API domain */\nexport const SPORTAL365_STANDINGS_DOMAIN = \"https://standing.api.sportal365.com\";\n"],"names":[],"mappings":"AAOO,MAAM,6BAA6B;AAGnC,MAAM,+BAA+B;AAGrC,MAAM,2BAA2B;AAGjC,MAAM,+BAA+B;AAGrC,MAAM,kCAAkC;AAGxC,MAAM,8BAA8B;"}
@@ -0,0 +1,52 @@
1
+ import { getConfig } from "../../../../config/index.js";
2
+ import { footballHttp } from "../http.js";
3
+ import { transformCompetition, transformSeasonDetails } from "./utils.js";
4
+ async function getFootballCompetition(competitionId, options, config) {
5
+ const finalConfig = config || getConfig();
6
+ const { sportal365Sports } = finalConfig;
7
+ const raw = await footballHttp.get({
8
+ path: `/tournaments/${competitionId}`,
9
+ params: {
10
+ language_code: options?.languageCode ?? sportal365Sports?.languageCode ?? "en"
11
+ },
12
+ headers: {
13
+ "Accept-Language": options?.languageCode ?? sportal365Sports?.languageCode ?? "en"
14
+ },
15
+ next: options?.next,
16
+ config: finalConfig
17
+ });
18
+ return transformCompetition(raw);
19
+ }
20
+ async function getFootballSeasonDetails(options, config) {
21
+ const finalConfig = config || getConfig();
22
+ const { sportal365Sports } = finalConfig;
23
+ if (!options?.seasonId && !options?.competitionId) {
24
+ throw new Error("Either seasonId or competitionId must be provided");
25
+ }
26
+ const params = {
27
+ language_code: options?.languageCode ?? sportal365Sports?.languageCode ?? "en"
28
+ };
29
+ if (options.seasonId) {
30
+ params.season_id = options.seasonId;
31
+ } else if (options.competitionId) {
32
+ params.tournament_id = options.competitionId;
33
+ if (options.status) {
34
+ params.status = options.status;
35
+ }
36
+ }
37
+ const raw = await footballHttp.get({
38
+ path: `/v2/seasons/details`,
39
+ params,
40
+ headers: {
41
+ "Accept-Language": options?.languageCode ?? sportal365Sports?.languageCode ?? "en"
42
+ },
43
+ next: options?.next,
44
+ config: finalConfig
45
+ });
46
+ return transformSeasonDetails(raw);
47
+ }
48
+ export {
49
+ getFootballCompetition,
50
+ getFootballSeasonDetails
51
+ };
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/lib/api/sportal365-sports/football/competitions/index.ts"],"sourcesContent":["/**\n * Sportal365 Sports API - Football Competitions\n *\n * Fetches competition/tournament data and transforms to canonical FUSports types.\n */\n\nimport type { FUSportsCompetition, FUSportsSeasonDetails } from \"../../../../types/canonical\";\nimport { getConfig, type DataLayerConfig } from \"../../../../config\";\nimport { footballHttp } from \"../http\";\nimport type {\n RawTournamentResponse,\n RawSeasonDetailsResponse,\n GetFootballCompetitionOptions,\n GetFootballSeasonDetailsOptions,\n} from \"./competition.types\";\nimport { transformCompetition, transformSeasonDetails } from \"./utils\";\n\n// Re-export types for options\nexport type { GetFootballCompetitionOptions, GetFootballSeasonDetailsOptions } from \"./competition.types\";\n\n/**\n * Get a football competition/tournament by ID\n *\n * Fetches full competition details including all available seasons.\n *\n * @param competitionId - The competition ID, UUID, or slug\n * @param options - Optional parameters\n * @param config - Optional data layer config (uses singleton if not provided)\n * @returns Canonical FUSportsCompetition with all seasons\n *\n * @example\n * ```typescript\n * const competition = await getFootballCompetition('3');\n * console.log(competition.name); // \"Premier League\"\n * console.log(competition.seasons?.length); // 27\n * ```\n */\nexport async function getFootballCompetition(\n competitionId: string,\n options?: GetFootballCompetitionOptions,\n config?: DataLayerConfig\n): Promise<FUSportsCompetition> {\n const finalConfig = config || getConfig();\n const { sportal365Sports } = finalConfig;\n\n const raw = await footballHttp.get<RawTournamentResponse>({\n path: `/tournaments/${competitionId}`,\n params: {\n language_code: options?.languageCode ?? sportal365Sports?.languageCode ?? \"en\",\n },\n headers: {\n \"Accept-Language\": options?.languageCode ?? sportal365Sports?.languageCode ?? \"en\",\n },\n next: options?.next,\n config: finalConfig,\n });\n\n return transformCompetition(raw);\n}\n\n/**\n * Get detailed season information with stages and rounds\n *\n * Can be called with either:\n * - `seasonId` to get a specific season's details\n * - `competitionId` + `status: 'CURRENT'` to get the current season for a competition\n *\n * @param options - Options including seasonId or competitionId+status\n * @param config - Optional data layer config (uses singleton if not provided)\n * @returns Canonical FUSportsSeasonDetails with competition, stages, and rounds\n *\n * @example\n * ```typescript\n * // Get by season ID\n * const season = await getFootballSeasonDetails({ seasonId: '7575016' });\n * console.log(season.name); // \"2025/2026\"\n * console.log(season.stages?.length); // 1\n *\n * // Get current season for a competition\n * const currentSeason = await getFootballSeasonDetails({\n * competitionId: '3',\n * status: 'CURRENT'\n * });\n * ```\n */\nexport async function getFootballSeasonDetails(\n options?: GetFootballSeasonDetailsOptions,\n config?: DataLayerConfig\n): Promise<FUSportsSeasonDetails> {\n const finalConfig = config || getConfig();\n const { sportal365Sports } = finalConfig;\n\n if (!options?.seasonId && !options?.competitionId) {\n throw new Error(\"Either seasonId or competitionId must be provided\");\n }\n\n const params: Record<string, string | undefined> = {\n language_code: options?.languageCode ?? sportal365Sports?.languageCode ?? \"en\",\n };\n\n if (options.seasonId) {\n params.season_id = options.seasonId;\n } else if (options.competitionId) {\n params.tournament_id = options.competitionId;\n if (options.status) {\n params.status = options.status;\n }\n }\n\n const raw = await footballHttp.get<RawSeasonDetailsResponse>({\n path: `/v2/seasons/details`,\n params,\n headers: {\n \"Accept-Language\": options?.languageCode ?? sportal365Sports?.languageCode ?? \"en\",\n },\n next: options?.next,\n config: finalConfig,\n });\n\n return transformSeasonDetails(raw);\n}\n"],"names":[],"mappings":";;;AAqCA,eAAsB,uBAClB,eACA,SACA,QAC4B;AAC5B,QAAM,cAAc,UAAU,UAAA;AAC9B,QAAM,EAAE,qBAAqB;AAE7B,QAAM,MAAM,MAAM,aAAa,IAA2B;AAAA,IACtD,MAAM,gBAAgB,aAAa;AAAA,IACnC,QAAQ;AAAA,MACJ,eAAe,SAAS,gBAAgB,kBAAkB,gBAAgB;AAAA,IAAA;AAAA,IAE9E,SAAS;AAAA,MACL,mBAAmB,SAAS,gBAAgB,kBAAkB,gBAAgB;AAAA,IAAA;AAAA,IAElF,MAAM,SAAS;AAAA,IACf,QAAQ;AAAA,EAAA,CACX;AAED,SAAO,qBAAqB,GAAG;AACnC;AA2BA,eAAsB,yBAClB,SACA,QAC8B;AAC9B,QAAM,cAAc,UAAU,UAAA;AAC9B,QAAM,EAAE,qBAAqB;AAE7B,MAAI,CAAC,SAAS,YAAY,CAAC,SAAS,eAAe;AAC/C,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACvE;AAEA,QAAM,SAA6C;AAAA,IAC/C,eAAe,SAAS,gBAAgB,kBAAkB,gBAAgB;AAAA,EAAA;AAG9E,MAAI,QAAQ,UAAU;AAClB,WAAO,YAAY,QAAQ;AAAA,EAC/B,WAAW,QAAQ,eAAe;AAC9B,WAAO,gBAAgB,QAAQ;AAC/B,QAAI,QAAQ,QAAQ;AAChB,aAAO,SAAS,QAAQ;AAAA,IAC5B;AAAA,EACJ;AAEA,QAAM,MAAM,MAAM,aAAa,IAA8B;AAAA,IACzD,MAAM;AAAA,IACN;AAAA,IACA,SAAS;AAAA,MACL,mBAAmB,SAAS,gBAAgB,kBAAkB,gBAAgB;AAAA,IAAA;AAAA,IAElF,MAAM,SAAS;AAAA,IACf,QAAQ;AAAA,EAAA,CACX;AAED,SAAO,uBAAuB,GAAG;AACrC;"}
@@ -0,0 +1,92 @@
1
+ import { toProviderRefArray } from "../../shared/providerRef.helper.js";
2
+ function transformCompetition(raw) {
3
+ return {
4
+ id: String(raw.id),
5
+ name: raw.name,
6
+ slug: raw.slug,
7
+ type: raw.type,
8
+ region: raw.region,
9
+ gender: raw.gender,
10
+ country: {
11
+ id: String(raw.country.id),
12
+ name: raw.country.name,
13
+ flag: raw.country.url_flag,
14
+ providerRef: toProviderRefArray(raw.country.uuid)
15
+ },
16
+ seasons: raw.seasons.map((season) => ({
17
+ id: String(season.id),
18
+ name: season.name,
19
+ slug: season.slug,
20
+ active: season.active,
21
+ providerRef: toProviderRefArray(season.uuid)
22
+ })),
23
+ assets: raw.url_logo ? {
24
+ logo: raw.url_logo
25
+ } : void 0,
26
+ providerRef: toProviderRefArray(raw.uuid)
27
+ };
28
+ }
29
+ function transformStage(raw) {
30
+ const rounds = raw.rounds.map((round) => ({
31
+ id: round.id,
32
+ name: round.name,
33
+ key: round.key,
34
+ type: round.type,
35
+ status: round.status,
36
+ startDate: round.start_date,
37
+ endDate: round.end_date,
38
+ providerRef: toProviderRefArray(round.uuid)
39
+ }));
40
+ return {
41
+ id: raw.stage.id,
42
+ name: raw.stage.name,
43
+ slug: raw.stage.slug,
44
+ shortName: raw.stage.short_name ?? void 0,
45
+ type: raw.stage.type,
46
+ status: raw.stage.status,
47
+ coverage: raw.stage.coverage,
48
+ order: raw.stage.order_in_season,
49
+ startDate: raw.stage.start_date,
50
+ endDate: raw.stage.end_date,
51
+ rounds,
52
+ providerRef: toProviderRefArray(raw.stage.uuid)
53
+ };
54
+ }
55
+ function transformSeasonDetails(raw) {
56
+ const { season, stages } = raw;
57
+ const { tournament } = season;
58
+ const competition = {
59
+ id: tournament.id,
60
+ name: tournament.name,
61
+ slug: tournament.slug,
62
+ type: tournament.type,
63
+ region: tournament.region,
64
+ gender: tournament.gender,
65
+ country: {
66
+ id: tournament.country.id,
67
+ name: tournament.country.name,
68
+ code: tournament.country.code ?? void 0,
69
+ flag: tournament.country.assets?.flag?.url,
70
+ providerRef: toProviderRefArray(tournament.country.uuid)
71
+ },
72
+ assets: tournament.assets?.logo?.url ? {
73
+ logo: tournament.assets.logo.url
74
+ } : void 0,
75
+ providerRef: toProviderRefArray(tournament.uuid)
76
+ };
77
+ return {
78
+ id: season.id,
79
+ name: season.name,
80
+ slug: season.slug,
81
+ active: season.status === "ACTIVE",
82
+ status: season.status === "ACTIVE" ? "ACTIVE" : "INACTIVE",
83
+ competition,
84
+ stages: stages.map(transformStage),
85
+ providerRef: toProviderRefArray(season.uuid)
86
+ };
87
+ }
88
+ export {
89
+ transformCompetition,
90
+ transformSeasonDetails
91
+ };
92
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sources":["../../../../../src/lib/api/sportal365-sports/football/competitions/utils.ts"],"sourcesContent":["/**\n * Competition transformers for Sportal365 Sports API\n */\n\nimport type {\n FUSportsCompetition,\n FUSportsSeasonDetails,\n FUSportsStage,\n FUSportsRound,\n} from \"../../../../types/canonical\";\nimport type {\n RawTournamentResponse,\n RawSeasonDetailsResponse,\n RawSeasonDetailsStageWithRounds,\n} from \"./competition.types\";\nimport { toProviderRefArray } from \"../../shared\";\n\n/**\n * Transform raw tournament response to canonical FUSportsCompetition\n */\nexport function transformCompetition(raw: RawTournamentResponse): FUSportsCompetition {\n return {\n id: String(raw.id),\n name: raw.name,\n slug: raw.slug,\n type: raw.type,\n region: raw.region,\n gender: raw.gender,\n country: {\n id: String(raw.country.id),\n name: raw.country.name,\n flag: raw.country.url_flag,\n providerRef: toProviderRefArray(raw.country.uuid),\n },\n seasons: raw.seasons.map((season) => ({\n id: String(season.id),\n name: season.name,\n slug: season.slug,\n active: season.active,\n providerRef: toProviderRefArray(season.uuid),\n })),\n assets: raw.url_logo\n ? {\n logo: raw.url_logo,\n }\n : undefined,\n providerRef: toProviderRefArray(raw.uuid),\n };\n}\n\n/**\n * Transform raw stage with rounds to canonical FUSportsStage\n */\nfunction transformStage(raw: RawSeasonDetailsStageWithRounds): FUSportsStage {\n const rounds: FUSportsRound[] = raw.rounds.map((round) => ({\n id: round.id,\n name: round.name,\n key: round.key,\n type: round.type,\n status: round.status,\n startDate: round.start_date,\n endDate: round.end_date,\n providerRef: toProviderRefArray(round.uuid),\n }));\n\n return {\n id: raw.stage.id,\n name: raw.stage.name,\n slug: raw.stage.slug,\n shortName: raw.stage.short_name ?? undefined,\n type: raw.stage.type,\n status: raw.stage.status,\n coverage: raw.stage.coverage,\n order: raw.stage.order_in_season,\n startDate: raw.stage.start_date,\n endDate: raw.stage.end_date,\n rounds,\n providerRef: toProviderRefArray(raw.stage.uuid),\n };\n}\n\n/**\n * Transform raw season details response to canonical FUSportsSeasonDetails\n */\nexport function transformSeasonDetails(raw: RawSeasonDetailsResponse): FUSportsSeasonDetails {\n const { season, stages } = raw;\n const { tournament } = season;\n\n const competition: FUSportsCompetition = {\n id: tournament.id,\n name: tournament.name,\n slug: tournament.slug,\n type: tournament.type,\n region: tournament.region,\n gender: tournament.gender,\n country: {\n id: tournament.country.id,\n name: tournament.country.name,\n code: tournament.country.code ?? undefined,\n flag: tournament.country.assets?.flag?.url,\n providerRef: toProviderRefArray(tournament.country.uuid),\n },\n assets: tournament.assets?.logo?.url\n ? {\n logo: tournament.assets.logo.url,\n }\n : undefined,\n providerRef: toProviderRefArray(tournament.uuid),\n };\n\n return {\n id: season.id,\n name: season.name,\n slug: season.slug,\n active: season.status === \"ACTIVE\",\n status: season.status === \"ACTIVE\" ? \"ACTIVE\" : \"INACTIVE\",\n competition,\n stages: stages.map(transformStage),\n providerRef: toProviderRefArray(season.uuid),\n };\n}\n"],"names":[],"mappings":";AAoBO,SAAS,qBAAqB,KAAiD;AAClF,SAAO;AAAA,IACH,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,MAAM,IAAI;AAAA,IACV,MAAM,IAAI;AAAA,IACV,MAAM,IAAI;AAAA,IACV,QAAQ,IAAI;AAAA,IACZ,QAAQ,IAAI;AAAA,IACZ,SAAS;AAAA,MACL,IAAI,OAAO,IAAI,QAAQ,EAAE;AAAA,MACzB,MAAM,IAAI,QAAQ;AAAA,MAClB,MAAM,IAAI,QAAQ;AAAA,MAClB,aAAa,mBAAmB,IAAI,QAAQ,IAAI;AAAA,IAAA;AAAA,IAEpD,SAAS,IAAI,QAAQ,IAAI,CAAC,YAAY;AAAA,MAClC,IAAI,OAAO,OAAO,EAAE;AAAA,MACpB,MAAM,OAAO;AAAA,MACb,MAAM,OAAO;AAAA,MACb,QAAQ,OAAO;AAAA,MACf,aAAa,mBAAmB,OAAO,IAAI;AAAA,IAAA,EAC7C;AAAA,IACF,QAAQ,IAAI,WACN;AAAA,MACI,MAAM,IAAI;AAAA,IAAA,IAEd;AAAA,IACN,aAAa,mBAAmB,IAAI,IAAI;AAAA,EAAA;AAEhD;AAKA,SAAS,eAAe,KAAqD;AACzE,QAAM,SAA0B,IAAI,OAAO,IAAI,CAAC,WAAW;AAAA,IACvD,IAAI,MAAM;AAAA,IACV,MAAM,MAAM;AAAA,IACZ,KAAK,MAAM;AAAA,IACX,MAAM,MAAM;AAAA,IACZ,QAAQ,MAAM;AAAA,IACd,WAAW,MAAM;AAAA,IACjB,SAAS,MAAM;AAAA,IACf,aAAa,mBAAmB,MAAM,IAAI;AAAA,EAAA,EAC5C;AAEF,SAAO;AAAA,IACH,IAAI,IAAI,MAAM;AAAA,IACd,MAAM,IAAI,MAAM;AAAA,IAChB,MAAM,IAAI,MAAM;AAAA,IAChB,WAAW,IAAI,MAAM,cAAc;AAAA,IACnC,MAAM,IAAI,MAAM;AAAA,IAChB,QAAQ,IAAI,MAAM;AAAA,IAClB,UAAU,IAAI,MAAM;AAAA,IACpB,OAAO,IAAI,MAAM;AAAA,IACjB,WAAW,IAAI,MAAM;AAAA,IACrB,SAAS,IAAI,MAAM;AAAA,IACnB;AAAA,IACA,aAAa,mBAAmB,IAAI,MAAM,IAAI;AAAA,EAAA;AAEtD;AAKO,SAAS,uBAAuB,KAAsD;AACzF,QAAM,EAAE,QAAQ,OAAA,IAAW;AAC3B,QAAM,EAAE,eAAe;AAEvB,QAAM,cAAmC;AAAA,IACrC,IAAI,WAAW;AAAA,IACf,MAAM,WAAW;AAAA,IACjB,MAAM,WAAW;AAAA,IACjB,MAAM,WAAW;AAAA,IACjB,QAAQ,WAAW;AAAA,IACnB,QAAQ,WAAW;AAAA,IACnB,SAAS;AAAA,MACL,IAAI,WAAW,QAAQ;AAAA,MACvB,MAAM,WAAW,QAAQ;AAAA,MACzB,MAAM,WAAW,QAAQ,QAAQ;AAAA,MACjC,MAAM,WAAW,QAAQ,QAAQ,MAAM;AAAA,MACvC,aAAa,mBAAmB,WAAW,QAAQ,IAAI;AAAA,IAAA;AAAA,IAE3D,QAAQ,WAAW,QAAQ,MAAM,MAC3B;AAAA,MACI,MAAM,WAAW,OAAO,KAAK;AAAA,IAAA,IAEjC;AAAA,IACN,aAAa,mBAAmB,WAAW,IAAI;AAAA,EAAA;AAGnD,SAAO;AAAA,IACH,IAAI,OAAO;AAAA,IACX,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA,IACb,QAAQ,OAAO,WAAW;AAAA,IAC1B,QAAQ,OAAO,WAAW,WAAW,WAAW;AAAA,IAChD;AAAA,IACA,QAAQ,OAAO,IAAI,cAAc;AAAA,IACjC,aAAa,mBAAmB,OAAO,IAAI;AAAA,EAAA;AAEnD;"}
@@ -0,0 +1,7 @@
1
+ import { createHttpClient } from "../http.js";
2
+ import { SPORTAL365_FOOTBALL_DOMAIN } from "../constants.js";
3
+ const footballHttp = createHttpClient(SPORTAL365_FOOTBALL_DOMAIN);
4
+ export {
5
+ footballHttp
6
+ };
7
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sources":["../../../../src/lib/api/sportal365-sports/football/http.ts"],"sourcesContent":["/**\n * Football HTTP client for Sportal365 API\n */\n\nimport { createHttpClient } from '../http';\nimport { SPORTAL365_FOOTBALL_DOMAIN } from '../constants';\n\n/**\n * HTTP client configured for the Sportal365 Football API\n */\nexport const footballHttp = createHttpClient(SPORTAL365_FOOTBALL_DOMAIN);\n\n"],"names":[],"mappings":";;AAUO,MAAM,eAAe,iBAAiB,0BAA0B;"}
@@ -0,0 +1,206 @@
1
+ import { getConfig } from "../../../../config/index.js";
2
+ import { footballHttp } from "../http.js";
3
+ import { transformMatch } from "./transformers/match.js";
4
+ import { transformCommentary } from "./transformers/commentary.js";
5
+ import { transformEvent } from "./transformers/match-event.js";
6
+ import { transformLineups } from "./transformers/lineup.js";
7
+ import { transformMatchOdds } from "./transformers/odds.js";
8
+ import { transformStatistics } from "./transformers/statistics.js";
9
+ async function getFootballMatch(matchId, options, config) {
10
+ const finalConfig = config || getConfig();
11
+ const { sportal365Sports } = finalConfig;
12
+ const raw = await footballHttp.get({
13
+ path: `/v2/matches/${matchId}`,
14
+ params: {
15
+ language_code: options?.languageCode ?? sportal365Sports?.languageCode ?? "en",
16
+ odd_client: options?.oddClient,
17
+ odd_type: options?.oddType,
18
+ scope_type: options?.scopeType,
19
+ odd_format: options?.oddFormat,
20
+ market_types: options?.marketTypes,
21
+ bookmaker_ids: options?.bookmakerIds,
22
+ optional_data: options?.optionalData
23
+ },
24
+ headers: {
25
+ "Accept-Language": options?.languageCode ?? sportal365Sports?.languageCode ?? "en"
26
+ },
27
+ next: options?.next,
28
+ config: finalConfig
29
+ });
30
+ return transformMatch(raw);
31
+ }
32
+ async function getFootballMatchEvents(matchId, options, config) {
33
+ const finalConfig = config || getConfig();
34
+ const { sportal365Sports } = finalConfig;
35
+ const raw = await footballHttp.get({
36
+ path: `/v2/matches/${matchId}/events`,
37
+ params: {
38
+ language_code: options?.languageCode ?? sportal365Sports?.languageCode ?? "en"
39
+ },
40
+ headers: {
41
+ "Accept-Language": options?.languageCode ?? sportal365Sports?.languageCode ?? "en"
42
+ },
43
+ next: options?.next,
44
+ config: finalConfig
45
+ });
46
+ return raw.events.map(transformEvent).filter((e) => e !== null);
47
+ }
48
+ async function getFootballMatchLineups(matchId, options, config) {
49
+ const finalConfig = config || getConfig();
50
+ const { sportal365Sports } = finalConfig;
51
+ const raw = await footballHttp.get({
52
+ path: `/v2/matches/${matchId}/lineups`,
53
+ params: {
54
+ language_code: options?.languageCode ?? sportal365Sports?.languageCode ?? "en"
55
+ },
56
+ headers: {
57
+ "Accept-Language": options?.languageCode ?? sportal365Sports?.languageCode ?? "en"
58
+ },
59
+ next: options?.next,
60
+ config: finalConfig
61
+ });
62
+ return transformLineups(raw);
63
+ }
64
+ async function getFootballMatchOdds(matchId, options, config) {
65
+ const finalConfig = config || getConfig();
66
+ const { sportal365Sports } = finalConfig;
67
+ const raw = await footballHttp.get({
68
+ path: `/v2/matches/${matchId}`,
69
+ params: {
70
+ language_code: options?.languageCode ?? sportal365Sports?.languageCode ?? "en",
71
+ odd_client: options?.oddClient ?? sportal365Sports?.oddClient,
72
+ odd_type: options?.oddType,
73
+ scope_type: options?.scopeType ?? "ALL",
74
+ odd_format: options?.oddFormat ?? "DECIMAL",
75
+ market_types: options?.marketTypes,
76
+ bookmaker_ids: options?.bookmakerIds
77
+ },
78
+ headers: {
79
+ "Accept-Language": options?.languageCode ?? sportal365Sports?.languageCode ?? "en"
80
+ },
81
+ next: options?.next,
82
+ config: finalConfig
83
+ });
84
+ return transformMatchOdds(matchId, raw.odds ?? []);
85
+ }
86
+ async function getFootballMatchStatistics(matchId, options, config) {
87
+ const finalConfig = config || getConfig();
88
+ const { sportal365Sports } = finalConfig;
89
+ const raw = await footballHttp.get({
90
+ path: `/events/${matchId}/teamstats`,
91
+ params: {
92
+ language_code: options?.languageCode ?? sportal365Sports?.languageCode ?? "en"
93
+ },
94
+ headers: {
95
+ "Accept-Language": options?.languageCode ?? sportal365Sports?.languageCode ?? "en"
96
+ },
97
+ next: options?.next,
98
+ config: finalConfig
99
+ });
100
+ return transformStatistics(raw);
101
+ }
102
+ async function getFootballMatchCommentary(matchId, options, config) {
103
+ const finalConfig = config || getConfig();
104
+ const { sportal365Sports } = finalConfig;
105
+ const raw = await footballHttp.get({
106
+ path: `/matches/${matchId}/commentary`,
107
+ params: {
108
+ language_code: options?.languageCode ?? sportal365Sports?.languageCode ?? "en"
109
+ },
110
+ headers: {
111
+ "Accept-Language": options?.languageCode ?? sportal365Sports?.languageCode ?? "en"
112
+ },
113
+ next: options?.next,
114
+ config: finalConfig
115
+ });
116
+ return raw.map(transformCommentary);
117
+ }
118
+ async function getFootballMatches(options, config) {
119
+ const finalConfig = config || getConfig();
120
+ const { sportal365Sports } = finalConfig;
121
+ const raw = await footballHttp.get({
122
+ path: `/v2/matches`,
123
+ params: {
124
+ language_code: options.languageCode ?? sportal365Sports?.languageCode ?? "en",
125
+ limit: options.limit.toString(),
126
+ offset: options.offset.toString(),
127
+ // Competition filters
128
+ tournament_ids: options.tournamentIds,
129
+ season_ids: options.seasonIds,
130
+ stage_ids: options.stageIds,
131
+ group_ids: options.groupIds,
132
+ round_ids: options.roundIds,
133
+ round_filter: options.roundFilter,
134
+ // Time filters
135
+ from_kickoff_time: options.fromKickoffTime,
136
+ to_kickoff_time: options.toKickoffTime,
137
+ // Entity filters
138
+ team_ids: options.teamIds,
139
+ team_ids_operator: options.teamIdsOperator,
140
+ referee_id: options.refereeId,
141
+ venue_id: options.venueId,
142
+ player_id: options.playerId,
143
+ // Status filters
144
+ status_types: options.statusTypes,
145
+ status_codes: options.statusCodes,
146
+ // Odds
147
+ odd_client: options.oddClient ?? sportal365Sports?.oddClient,
148
+ odd_type: options.oddType,
149
+ scope_type: options.scopeType,
150
+ odd_format: options.oddFormat,
151
+ market_types: options.marketTypes,
152
+ bookmaker_ids: options.bookmakerIds,
153
+ // Sorting and optional data
154
+ sort_direction: options.sortDirection,
155
+ optional_data: options.optionalData
156
+ },
157
+ headers: {
158
+ "Accept-Language": options.languageCode ?? sportal365Sports?.languageCode ?? "en"
159
+ },
160
+ next: options.next,
161
+ config: finalConfig
162
+ });
163
+ return raw.matches.map(transformMatch);
164
+ }
165
+ async function getFootballLivescore(options, config) {
166
+ const finalConfig = config || getConfig();
167
+ const { sportal365Sports } = finalConfig;
168
+ const raw = await footballHttp.get({
169
+ path: `/v2/matches/livescore`,
170
+ params: {
171
+ // Match filters
172
+ match_ids: options?.matchIds,
173
+ date: options?.date,
174
+ utc_offset: options?.utcOffset?.toString(),
175
+ tournament_group: options?.tournamentGroup,
176
+ status_types: options?.statusTypes,
177
+ selection_filter: options?.selectionFilter,
178
+ language_code: options?.languageCode ?? sportal365Sports?.languageCode ?? "en",
179
+ // Odds parameters
180
+ odd_client: options?.oddClient ?? sportal365Sports?.oddClient,
181
+ odd_type: options?.oddType,
182
+ scope_type: options?.scopeType,
183
+ odd_format: options?.oddFormat,
184
+ market_types: options?.marketTypes,
185
+ // Optional data
186
+ optional_data: options?.optionalData
187
+ },
188
+ headers: {
189
+ "Accept-Language": options?.languageCode ?? sportal365Sports?.languageCode ?? "en"
190
+ },
191
+ next: options?.next,
192
+ config: finalConfig
193
+ });
194
+ return raw.matches.map(transformMatch);
195
+ }
196
+ export {
197
+ getFootballLivescore,
198
+ getFootballMatch,
199
+ getFootballMatchCommentary,
200
+ getFootballMatchEvents,
201
+ getFootballMatchLineups,
202
+ getFootballMatchOdds,
203
+ getFootballMatchStatistics,
204
+ getFootballMatches
205
+ };
206
+ //# sourceMappingURL=index.js.map