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.
- package/api/fansunited/constants.js +5 -0
- package/api/fansunited/constants.js.map +1 -0
- package/api/fansunited/football/competition/index.js +21 -0
- package/api/fansunited/football/competition/index.js.map +1 -0
- package/api/fansunited/football/competition/transformer.js +41 -0
- package/api/fansunited/football/competition/transformer.js.map +1 -0
- package/api/fansunited/football/competitions/index.js +56 -0
- package/api/fansunited/football/competitions/index.js.map +1 -0
- package/api/fansunited/football/competitions/transformer.js +68 -0
- package/api/fansunited/football/competitions/transformer.js.map +1 -0
- package/api/fansunited/football/http.js +7 -0
- package/api/fansunited/football/http.js.map +1 -0
- package/api/fansunited/football/matches/index.js +132 -0
- package/api/fansunited/football/matches/index.js.map +1 -0
- package/api/fansunited/football/matches/transformer.js +148 -0
- package/api/fansunited/football/matches/transformer.js.map +1 -0
- package/api/fansunited/football/players/index.js +60 -0
- package/api/fansunited/football/players/index.js.map +1 -0
- package/api/fansunited/football/players/transformer.js +85 -0
- package/api/fansunited/football/players/transformer.js.map +1 -0
- package/api/fansunited/football/search/index.js +64 -0
- package/api/fansunited/football/search/index.js.map +1 -0
- package/api/fansunited/football/search/transformer.js +114 -0
- package/api/fansunited/football/search/transformer.js.map +1 -0
- package/api/fansunited/football/teams/index.js +66 -0
- package/api/fansunited/football/teams/index.js.map +1 -0
- package/api/fansunited/football/teams/transformer.js +53 -0
- package/api/fansunited/football/teams/transformer.js.map +1 -0
- package/api/fansunited/http.d.ts.map +1 -1
- package/api/fansunited/http.js +70 -0
- package/api/fansunited/http.js.map +1 -0
- package/api/fansunited/search/constants.js +5 -0
- package/api/fansunited/search/constants.js.map +1 -0
- package/api/fansunited/search/http.js +7 -0
- package/api/fansunited/search/http.js.map +1 -0
- package/api/fansunited/search/index.js +308 -0
- package/api/fansunited/search/index.js.map +1 -0
- package/api/fansunited/search/transformer.js +374 -0
- package/api/fansunited/search/transformer.js.map +1 -0
- package/api/fansunited-sdk/loyalty/matches.js +21 -0
- package/api/fansunited-sdk/loyalty/matches.js.map +1 -0
- package/api/fansunited-sdk/loyalty/template.js +52 -0
- package/api/fansunited-sdk/loyalty/template.js.map +1 -0
- package/api/fansunited-sdk/odds/matches.js +109 -0
- package/api/fansunited-sdk/odds/matches.js.map +1 -0
- package/api/sportal365-sports/basketball/games/index.js +32 -0
- package/api/sportal365-sports/basketball/games/index.js.map +1 -0
- package/api/sportal365-sports/basketball/games/transformers/game.js +137 -0
- package/api/sportal365-sports/basketball/games/transformers/game.js.map +1 -0
- package/api/sportal365-sports/basketball/http.js +7 -0
- package/api/sportal365-sports/basketball/http.js.map +1 -0
- package/api/sportal365-sports/constants.js +15 -0
- package/api/sportal365-sports/constants.js.map +1 -0
- package/api/sportal365-sports/football/competitions/index.js +52 -0
- package/api/sportal365-sports/football/competitions/index.js.map +1 -0
- package/api/sportal365-sports/football/competitions/utils.js +92 -0
- package/api/sportal365-sports/football/competitions/utils.js.map +1 -0
- package/api/sportal365-sports/football/http.js +7 -0
- package/api/sportal365-sports/football/http.js.map +1 -0
- package/api/sportal365-sports/football/matches/index.js +206 -0
- package/api/sportal365-sports/football/matches/index.js.map +1 -0
- package/api/sportal365-sports/football/matches/transformers/commentary.js +27 -0
- package/api/sportal365-sports/football/matches/transformers/commentary.js.map +1 -0
- package/api/sportal365-sports/football/matches/transformers/lineup.js +74 -0
- package/api/sportal365-sports/football/matches/transformers/lineup.js.map +1 -0
- package/api/sportal365-sports/football/matches/transformers/match-event.js +60 -0
- package/api/sportal365-sports/football/matches/transformers/match-event.js.map +1 -0
- package/api/sportal365-sports/football/matches/transformers/match.js +195 -0
- package/api/sportal365-sports/football/matches/transformers/match.js.map +1 -0
- package/api/sportal365-sports/football/matches/transformers/odds.js +11 -0
- package/api/sportal365-sports/football/matches/transformers/odds.js.map +1 -0
- package/api/sportal365-sports/football/matches/transformers/statistics.js +41 -0
- package/api/sportal365-sports/football/matches/transformers/statistics.js.map +1 -0
- package/api/sportal365-sports/football/search/index.js +42 -0
- package/api/sportal365-sports/football/search/index.js.map +1 -0
- package/api/sportal365-sports/football/search/search.transformer.js +166 -0
- package/api/sportal365-sports/football/search/search.transformer.js.map +1 -0
- package/api/sportal365-sports/football/standings/index.js +28 -0
- package/api/sportal365-sports/football/standings/index.js.map +1 -0
- package/api/sportal365-sports/football/standings/standing.transformer.js +107 -0
- package/api/sportal365-sports/football/standings/standing.transformer.js.map +1 -0
- package/api/sportal365-sports/football/statistics/index.js +154 -0
- package/api/sportal365-sports/football/statistics/index.js.map +1 -0
- package/api/sportal365-sports/football/statistics/player-career.transformer.js +77 -0
- package/api/sportal365-sports/football/statistics/player-career.transformer.js.map +1 -0
- package/api/sportal365-sports/football/statistics/player-recent.transformer.js +54 -0
- package/api/sportal365-sports/football/statistics/player-recent.transformer.js.map +1 -0
- package/api/sportal365-sports/football/statistics/player-season.transformer.js +147 -0
- package/api/sportal365-sports/football/statistics/player-season.transformer.js.map +1 -0
- package/api/sportal365-sports/football/teams/index.js +73 -0
- package/api/sportal365-sports/football/teams/index.js.map +1 -0
- package/api/sportal365-sports/football/teams/utils.js +196 -0
- package/api/sportal365-sports/football/teams/utils.js.map +1 -0
- package/api/sportal365-sports/http.js +58 -0
- package/api/sportal365-sports/http.js.map +1 -0
- package/api/sportal365-sports/search/http.js +7 -0
- package/api/sportal365-sports/search/http.js.map +1 -0
- package/api/sportal365-sports/search/index.js +61 -0
- package/api/sportal365-sports/search/index.js.map +1 -0
- package/api/sportal365-sports/search/search.transformer.js +254 -0
- package/api/sportal365-sports/search/search.transformer.js.map +1 -0
- package/api/sportal365-sports/shared/odds.transformer.js +65 -0
- package/api/sportal365-sports/shared/odds.transformer.js.map +1 -0
- package/api/sportal365-sports/shared/providerRef.helper.js +31 -0
- package/api/sportal365-sports/shared/providerRef.helper.js.map +1 -0
- package/api/sportal365-sports/standings/http.js +7 -0
- package/api/sportal365-sports/standings/http.js.map +1 -0
- package/api/sportal365-sports/standings/index.js +29 -0
- package/api/sportal365-sports/standings/index.js.map +1 -0
- package/api/sportal365-sports/standings/standing.transformer.js +185 -0
- package/api/sportal365-sports/standings/standing.transformer.js.map +1 -0
- package/api/sportal365-sports/statistics/http.js +7 -0
- package/api/sportal365-sports/statistics/http.js.map +1 -0
- package/api/sportal365-sports/statistics/index.js +25 -0
- package/api/sportal365-sports/statistics/index.js.map +1 -0
- package/api/sportal365-sports/statistics/team-stats.transformer.js +16 -0
- package/api/sportal365-sports/statistics/team-stats.transformer.js.map +1 -0
- package/api/sportal365-sports/tennis/http.js +7 -0
- package/api/sportal365-sports/tennis/http.js.map +1 -0
- package/api/sportal365-sports/tennis/matches/index.js +34 -0
- package/api/sportal365-sports/tennis/matches/index.js.map +1 -0
- package/api/sportal365-sports/tennis/matches/transformers/match.js +193 -0
- package/api/sportal365-sports/tennis/matches/transformers/match.js.map +1 -0
- package/cache/cache-manager.js +136 -0
- package/cache/cache-manager.js.map +1 -0
- package/cache/memory-store.js +29 -0
- package/cache/memory-store.js.map +1 -0
- package/client.js +38 -12337
- package/client.js.map +1 -0
- package/config/index.js +20 -0
- package/config/index.js.map +1 -0
- package/fansunited-data-layer.js +146 -3553
- package/fansunited-data-layer.js.map +1 -0
- package/helpers/competition.helpers.js +11 -0
- package/helpers/competition.helpers.js.map +1 -0
- package/helpers/player.helpers.js +165 -0
- package/helpers/player.helpers.js.map +1 -0
- package/helpers/player.hooks.js +34 -0
- package/helpers/player.hooks.js.map +1 -0
- package/helpers/team.helpers.js +216 -0
- package/helpers/team.helpers.js.map +1 -0
- package/package.json +6 -8
- package/providers/competition/hooks/useCompetitionStats.js +10 -0
- package/providers/competition/hooks/useCompetitionStats.js.map +1 -0
- package/providers/competition/hooks/useGoalDistribution.js +23 -0
- package/providers/competition/hooks/useGoalDistribution.js.map +1 -0
- package/providers/competition/hooks/useMatchHelpers.js +85 -0
- package/providers/competition/hooks/useMatchHelpers.js.map +1 -0
- package/providers/competition/hooks/useStandingsCalculations.js +89 -0
- package/providers/competition/hooks/useStandingsCalculations.js.map +1 -0
- package/providers/competition/hooks/useStandingsHelpers.js +61 -0
- package/providers/competition/hooks/useStandingsHelpers.js.map +1 -0
- package/providers/competition/hooks/useTeamPosition.js +15 -0
- package/providers/competition/hooks/useTeamPosition.js.map +1 -0
- package/providers/competition/hooks/useTeamResultsTable.js +86 -0
- package/providers/competition/hooks/useTeamResultsTable.js.map +1 -0
- package/providers/competition/utils/competitionStats.js +109 -0
- package/providers/competition/utils/competitionStats.js.map +1 -0
- package/providers/competition/utils/goalDistribution.js +64 -0
- package/providers/competition/utils/goalDistribution.js.map +1 -0
- package/providers/competition/utils/standingsCalculations.js +152 -0
- package/providers/competition/utils/standingsCalculations.js.map +1 -0
- package/providers/competition.context.js +14 -0
- package/providers/competition.context.js.map +1 -0
- package/providers/competition.provider.js +187 -0
- package/providers/competition.provider.js.map +1 -0
- package/providers/fansunited-config.context.js +6 -0
- package/providers/fansunited-config.context.js.map +1 -0
- package/providers/fansunited-config.hooks.js +20 -0
- package/providers/fansunited-config.hooks.js.map +1 -0
- package/providers/fansunited-config.provider.js +9 -0
- package/providers/fansunited-config.provider.js.map +1 -0
- package/providers/fansunited-sdk.hook.js +50 -0
- package/providers/fansunited-sdk.hook.js.map +1 -0
- package/providers/leaderboard/hooks/useMatchHelpers.js +30 -0
- package/providers/leaderboard/hooks/useMatchHelpers.js.map +1 -0
- package/providers/leaderboard/hooks/useTemplateHelpers.js +39 -0
- package/providers/leaderboard/hooks/useTemplateHelpers.js.map +1 -0
- package/providers/leaderboard.context.js +14 -0
- package/providers/leaderboard.context.js.map +1 -0
- package/providers/leaderboard.provider.js +98 -0
- package/providers/leaderboard.provider.js.map +1 -0
- package/providers/match/hooks/useBatchMatchOdds.js +72 -0
- package/providers/match/hooks/useBatchMatchOdds.js.map +1 -0
- package/providers/match/hooks/useEventHelpers.js +46 -0
- package/providers/match/hooks/useEventHelpers.js.map +1 -0
- package/providers/match/hooks/useHeadToHeadHelpers.js +52 -0
- package/providers/match/hooks/useHeadToHeadHelpers.js.map +1 -0
- package/providers/match/hooks/useLineupHelpers.js +53 -0
- package/providers/match/hooks/useLineupHelpers.js.map +1 -0
- package/providers/match/hooks/useMatchStandingsCalculations.js +332 -0
- package/providers/match/hooks/useMatchStandingsCalculations.js.map +1 -0
- package/providers/match/hooks/useMatchStatus.js +37 -0
- package/providers/match/hooks/useMatchStatus.js.map +1 -0
- package/providers/match/hooks/useOddsHelpers.js +54 -0
- package/providers/match/hooks/useOddsHelpers.js.map +1 -0
- package/providers/match/hooks/useScoreHelpers.js +34 -0
- package/providers/match/hooks/useScoreHelpers.js.map +1 -0
- package/providers/match/hooks/useStandingsHelpers.js +53 -0
- package/providers/match/hooks/useStandingsHelpers.js.map +1 -0
- package/providers/match/hooks/useStatisticsHelpers.js +40 -0
- package/providers/match/hooks/useStatisticsHelpers.js.map +1 -0
- package/providers/match/hooks/useTeamHelpers.js +38 -0
- package/providers/match/hooks/useTeamHelpers.js.map +1 -0
- package/providers/match/hooks/useTeamStatsHelpers.js +141 -0
- package/providers/match/hooks/useTeamStatsHelpers.js.map +1 -0
- package/providers/match.context.js +14 -0
- package/providers/match.context.js.map +1 -0
- package/providers/match.provider.js +176 -0
- package/providers/match.provider.js.map +1 -0
- package/providers/team/hooks/useFormStats.js +116 -0
- package/providers/team/hooks/useFormStats.js.map +1 -0
- package/providers/team/hooks/useMatchHelpers.js +46 -0
- package/providers/team/hooks/useMatchHelpers.js.map +1 -0
- package/providers/team/hooks/useSquadHelpers.js +67 -0
- package/providers/team/hooks/useSquadHelpers.js.map +1 -0
- package/providers/team.context.js +14 -0
- package/providers/team.context.js.map +1 -0
- package/providers/team.provider.js +98 -0
- package/providers/team.provider.js.map +1 -0
- package/utilities/stats/core/helpers.js +105 -0
- package/utilities/stats/core/helpers.js.map +1 -0
- package/utilities/stats/core/types.js +5 -0
- package/utilities/stats/core/types.js.map +1 -0
- package/utilities/stats/match/headToHead.js +83 -0
- package/utilities/stats/match/headToHead.js.map +1 -0
- package/utilities/stats/match/homeVsAway.js +140 -0
- package/utilities/stats/match/homeVsAway.js.map +1 -0
- package/utilities/stats/match/overUnder.js +91 -0
- package/utilities/stats/match/overUnder.js.map +1 -0
- package/utilities/stats/match/result.js +21 -0
- package/utilities/stats/match/result.js.map +1 -0
- package/utilities/stats/team/commonOpponents.js +77 -0
- package/utilities/stats/team/commonOpponents.js.map +1 -0
- package/utilities/stats/team/goalStats.js +50 -0
- package/utilities/stats/team/goalStats.js.map +1 -0
- package/utilities/stats/team/streaks.js +183 -0
- package/utilities/stats/team/streaks.js.map +1 -0
- package/client.cjs +0 -8
- package/fansunited-data-layer.cjs +0 -1
- package/matches-BvHU-bP0.js +0 -1795
- 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 @@
|
|
|
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 @@
|
|
|
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
|