fansunited-data-layer 0.12.1 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) 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.js +74 -0
  30. package/api/fansunited/http.js.map +1 -0
  31. package/api/fansunited/search/constants.js +5 -0
  32. package/api/fansunited/search/constants.js.map +1 -0
  33. package/api/fansunited/search/http.js +7 -0
  34. package/api/fansunited/search/http.js.map +1 -0
  35. package/api/fansunited/search/index.js +308 -0
  36. package/api/fansunited/search/index.js.map +1 -0
  37. package/api/fansunited/search/transformer.js +374 -0
  38. package/api/fansunited/search/transformer.js.map +1 -0
  39. package/api/fansunited-sdk/loyalty/matches.js +21 -0
  40. package/api/fansunited-sdk/loyalty/matches.js.map +1 -0
  41. package/api/fansunited-sdk/loyalty/template.js +52 -0
  42. package/api/fansunited-sdk/loyalty/template.js.map +1 -0
  43. package/api/fansunited-sdk/odds/matches.js +109 -0
  44. package/api/fansunited-sdk/odds/matches.js.map +1 -0
  45. package/api/sportal365-sports/basketball/games/index.js +32 -0
  46. package/api/sportal365-sports/basketball/games/index.js.map +1 -0
  47. package/api/sportal365-sports/basketball/games/transformers/game.js +137 -0
  48. package/api/sportal365-sports/basketball/games/transformers/game.js.map +1 -0
  49. package/api/sportal365-sports/basketball/http.js +7 -0
  50. package/api/sportal365-sports/basketball/http.js.map +1 -0
  51. package/api/sportal365-sports/constants.js +15 -0
  52. package/api/sportal365-sports/constants.js.map +1 -0
  53. package/api/sportal365-sports/football/competitions/index.js +52 -0
  54. package/api/sportal365-sports/football/competitions/index.js.map +1 -0
  55. package/api/sportal365-sports/football/competitions/utils.js +92 -0
  56. package/api/sportal365-sports/football/competitions/utils.js.map +1 -0
  57. package/api/sportal365-sports/football/http.js +7 -0
  58. package/api/sportal365-sports/football/http.js.map +1 -0
  59. package/api/sportal365-sports/football/index.d.ts +2 -2
  60. package/api/sportal365-sports/football/index.d.ts.map +1 -1
  61. package/api/sportal365-sports/football/matches/index.js +206 -0
  62. package/api/sportal365-sports/football/matches/index.js.map +1 -0
  63. package/api/sportal365-sports/football/matches/transformers/commentary.js +27 -0
  64. package/api/sportal365-sports/football/matches/transformers/commentary.js.map +1 -0
  65. package/api/sportal365-sports/football/matches/transformers/lineup.js +74 -0
  66. package/api/sportal365-sports/football/matches/transformers/lineup.js.map +1 -0
  67. package/api/sportal365-sports/football/matches/transformers/match-event.js +60 -0
  68. package/api/sportal365-sports/football/matches/transformers/match-event.js.map +1 -0
  69. package/api/sportal365-sports/football/matches/transformers/match.js +195 -0
  70. package/api/sportal365-sports/football/matches/transformers/match.js.map +1 -0
  71. package/api/sportal365-sports/football/matches/transformers/odds.js +11 -0
  72. package/api/sportal365-sports/football/matches/transformers/odds.js.map +1 -0
  73. package/api/sportal365-sports/football/matches/transformers/statistics.js +41 -0
  74. package/api/sportal365-sports/football/matches/transformers/statistics.js.map +1 -0
  75. package/api/sportal365-sports/football/search/index.js +42 -0
  76. package/api/sportal365-sports/football/search/index.js.map +1 -0
  77. package/api/sportal365-sports/football/search/search.transformer.js +166 -0
  78. package/api/sportal365-sports/football/search/search.transformer.js.map +1 -0
  79. package/api/sportal365-sports/football/standings/index.js +28 -0
  80. package/api/sportal365-sports/football/standings/index.js.map +1 -0
  81. package/api/sportal365-sports/football/standings/standing.transformer.js +107 -0
  82. package/api/sportal365-sports/football/standings/standing.transformer.js.map +1 -0
  83. package/api/sportal365-sports/football/statistics/index.d.ts +46 -1
  84. package/api/sportal365-sports/football/statistics/index.d.ts.map +1 -1
  85. package/api/sportal365-sports/football/statistics/index.js +154 -0
  86. package/api/sportal365-sports/football/statistics/index.js.map +1 -0
  87. package/api/sportal365-sports/football/statistics/player-career.transformer.d.ts +11 -0
  88. package/api/sportal365-sports/football/statistics/player-career.transformer.d.ts.map +1 -0
  89. package/api/sportal365-sports/football/statistics/player-career.transformer.js +77 -0
  90. package/api/sportal365-sports/football/statistics/player-career.transformer.js.map +1 -0
  91. package/api/sportal365-sports/football/statistics/player-career.types.d.ts +115 -0
  92. package/api/sportal365-sports/football/statistics/player-career.types.d.ts.map +1 -0
  93. package/api/sportal365-sports/football/statistics/player-recent.transformer.d.ts +11 -0
  94. package/api/sportal365-sports/football/statistics/player-recent.transformer.d.ts.map +1 -0
  95. package/api/sportal365-sports/football/statistics/player-recent.transformer.js +54 -0
  96. package/api/sportal365-sports/football/statistics/player-recent.transformer.js.map +1 -0
  97. package/api/sportal365-sports/football/statistics/player-recent.types.d.ts +31 -0
  98. package/api/sportal365-sports/football/statistics/player-recent.types.d.ts.map +1 -0
  99. package/api/sportal365-sports/football/statistics/player-season.transformer.js +147 -0
  100. package/api/sportal365-sports/football/statistics/player-season.transformer.js.map +1 -0
  101. package/api/sportal365-sports/football/teams/index.js +73 -0
  102. package/api/sportal365-sports/football/teams/index.js.map +1 -0
  103. package/api/sportal365-sports/football/teams/utils.js +196 -0
  104. package/api/sportal365-sports/football/teams/utils.js.map +1 -0
  105. package/api/sportal365-sports/http.js +58 -0
  106. package/api/sportal365-sports/http.js.map +1 -0
  107. package/api/sportal365-sports/index.d.ts +2 -2
  108. package/api/sportal365-sports/index.d.ts.map +1 -1
  109. package/api/sportal365-sports/search/http.js +7 -0
  110. package/api/sportal365-sports/search/http.js.map +1 -0
  111. package/api/sportal365-sports/search/index.js +61 -0
  112. package/api/sportal365-sports/search/index.js.map +1 -0
  113. package/api/sportal365-sports/search/search.transformer.js +254 -0
  114. package/api/sportal365-sports/search/search.transformer.js.map +1 -0
  115. package/api/sportal365-sports/shared/odds.transformer.js +65 -0
  116. package/api/sportal365-sports/shared/odds.transformer.js.map +1 -0
  117. package/api/sportal365-sports/shared/providerRef.helper.js +31 -0
  118. package/api/sportal365-sports/shared/providerRef.helper.js.map +1 -0
  119. package/api/sportal365-sports/standings/http.js +7 -0
  120. package/api/sportal365-sports/standings/http.js.map +1 -0
  121. package/api/sportal365-sports/standings/index.js +29 -0
  122. package/api/sportal365-sports/standings/index.js.map +1 -0
  123. package/api/sportal365-sports/standings/standing.transformer.js +185 -0
  124. package/api/sportal365-sports/standings/standing.transformer.js.map +1 -0
  125. package/api/sportal365-sports/statistics/http.js +7 -0
  126. package/api/sportal365-sports/statistics/http.js.map +1 -0
  127. package/api/sportal365-sports/statistics/index.js +25 -0
  128. package/api/sportal365-sports/statistics/index.js.map +1 -0
  129. package/api/sportal365-sports/statistics/team-stats.transformer.js +16 -0
  130. package/api/sportal365-sports/statistics/team-stats.transformer.js.map +1 -0
  131. package/api/sportal365-sports/tennis/http.js +7 -0
  132. package/api/sportal365-sports/tennis/http.js.map +1 -0
  133. package/api/sportal365-sports/tennis/matches/index.js +34 -0
  134. package/api/sportal365-sports/tennis/matches/index.js.map +1 -0
  135. package/api/sportal365-sports/tennis/matches/transformers/match.js +193 -0
  136. package/api/sportal365-sports/tennis/matches/transformers/match.js.map +1 -0
  137. package/cache/cache-manager.js +136 -0
  138. package/cache/cache-manager.js.map +1 -0
  139. package/cache/memory-store.js +29 -0
  140. package/cache/memory-store.js.map +1 -0
  141. package/client.js +38 -12337
  142. package/client.js.map +1 -0
  143. package/config/index.js +20 -0
  144. package/config/index.js.map +1 -0
  145. package/fansunited-data-layer.js +146 -3551
  146. package/fansunited-data-layer.js.map +1 -0
  147. package/helpers/competition.helpers.js +11 -0
  148. package/helpers/competition.helpers.js.map +1 -0
  149. package/helpers/player.helpers.js +165 -0
  150. package/helpers/player.helpers.js.map +1 -0
  151. package/helpers/player.hooks.js +34 -0
  152. package/helpers/player.hooks.js.map +1 -0
  153. package/helpers/team.helpers.js +216 -0
  154. package/helpers/team.helpers.js.map +1 -0
  155. package/index.d.ts +3 -3
  156. package/index.d.ts.map +1 -1
  157. package/package.json +6 -8
  158. package/providers/competition/hooks/useCompetitionStats.js +10 -0
  159. package/providers/competition/hooks/useCompetitionStats.js.map +1 -0
  160. package/providers/competition/hooks/useGoalDistribution.js +23 -0
  161. package/providers/competition/hooks/useGoalDistribution.js.map +1 -0
  162. package/providers/competition/hooks/useMatchHelpers.js +85 -0
  163. package/providers/competition/hooks/useMatchHelpers.js.map +1 -0
  164. package/providers/competition/hooks/useStandingsCalculations.js +89 -0
  165. package/providers/competition/hooks/useStandingsCalculations.js.map +1 -0
  166. package/providers/competition/hooks/useStandingsHelpers.js +61 -0
  167. package/providers/competition/hooks/useStandingsHelpers.js.map +1 -0
  168. package/providers/competition/hooks/useTeamPosition.js +15 -0
  169. package/providers/competition/hooks/useTeamPosition.js.map +1 -0
  170. package/providers/competition/hooks/useTeamResultsTable.js +86 -0
  171. package/providers/competition/hooks/useTeamResultsTable.js.map +1 -0
  172. package/providers/competition/utils/competitionStats.js +109 -0
  173. package/providers/competition/utils/competitionStats.js.map +1 -0
  174. package/providers/competition/utils/goalDistribution.js +64 -0
  175. package/providers/competition/utils/goalDistribution.js.map +1 -0
  176. package/providers/competition/utils/standingsCalculations.js +152 -0
  177. package/providers/competition/utils/standingsCalculations.js.map +1 -0
  178. package/providers/competition.context.js +14 -0
  179. package/providers/competition.context.js.map +1 -0
  180. package/providers/competition.provider.js +187 -0
  181. package/providers/competition.provider.js.map +1 -0
  182. package/providers/fansunited-config.context.js +6 -0
  183. package/providers/fansunited-config.context.js.map +1 -0
  184. package/providers/fansunited-config.hooks.js +20 -0
  185. package/providers/fansunited-config.hooks.js.map +1 -0
  186. package/providers/fansunited-config.provider.js +9 -0
  187. package/providers/fansunited-config.provider.js.map +1 -0
  188. package/providers/fansunited-sdk.hook.js +50 -0
  189. package/providers/fansunited-sdk.hook.js.map +1 -0
  190. package/providers/leaderboard/hooks/useMatchHelpers.js +30 -0
  191. package/providers/leaderboard/hooks/useMatchHelpers.js.map +1 -0
  192. package/providers/leaderboard/hooks/useTemplateHelpers.js +39 -0
  193. package/providers/leaderboard/hooks/useTemplateHelpers.js.map +1 -0
  194. package/providers/leaderboard.context.js +14 -0
  195. package/providers/leaderboard.context.js.map +1 -0
  196. package/providers/leaderboard.provider.js +98 -0
  197. package/providers/leaderboard.provider.js.map +1 -0
  198. package/providers/match/hooks/useBatchMatchOdds.js +72 -0
  199. package/providers/match/hooks/useBatchMatchOdds.js.map +1 -0
  200. package/providers/match/hooks/useEventHelpers.js +46 -0
  201. package/providers/match/hooks/useEventHelpers.js.map +1 -0
  202. package/providers/match/hooks/useHeadToHeadHelpers.js +52 -0
  203. package/providers/match/hooks/useHeadToHeadHelpers.js.map +1 -0
  204. package/providers/match/hooks/useLineupHelpers.js +53 -0
  205. package/providers/match/hooks/useLineupHelpers.js.map +1 -0
  206. package/providers/match/hooks/useMatchStandingsCalculations.js +332 -0
  207. package/providers/match/hooks/useMatchStandingsCalculations.js.map +1 -0
  208. package/providers/match/hooks/useMatchStatus.js +37 -0
  209. package/providers/match/hooks/useMatchStatus.js.map +1 -0
  210. package/providers/match/hooks/useOddsHelpers.js +54 -0
  211. package/providers/match/hooks/useOddsHelpers.js.map +1 -0
  212. package/providers/match/hooks/useScoreHelpers.js +34 -0
  213. package/providers/match/hooks/useScoreHelpers.js.map +1 -0
  214. package/providers/match/hooks/useStandingsHelpers.js +53 -0
  215. package/providers/match/hooks/useStandingsHelpers.js.map +1 -0
  216. package/providers/match/hooks/useStatisticsHelpers.js +40 -0
  217. package/providers/match/hooks/useStatisticsHelpers.js.map +1 -0
  218. package/providers/match/hooks/useTeamHelpers.js +38 -0
  219. package/providers/match/hooks/useTeamHelpers.js.map +1 -0
  220. package/providers/match/hooks/useTeamStatsHelpers.js +141 -0
  221. package/providers/match/hooks/useTeamStatsHelpers.js.map +1 -0
  222. package/providers/match.context.js +14 -0
  223. package/providers/match.context.js.map +1 -0
  224. package/providers/match.provider.js +176 -0
  225. package/providers/match.provider.js.map +1 -0
  226. package/providers/team/hooks/useFormStats.js +116 -0
  227. package/providers/team/hooks/useFormStats.js.map +1 -0
  228. package/providers/team/hooks/useMatchHelpers.js +46 -0
  229. package/providers/team/hooks/useMatchHelpers.js.map +1 -0
  230. package/providers/team/hooks/useSquadHelpers.js +67 -0
  231. package/providers/team/hooks/useSquadHelpers.js.map +1 -0
  232. package/providers/team.context.js +14 -0
  233. package/providers/team.context.js.map +1 -0
  234. package/providers/team.provider.js +98 -0
  235. package/providers/team.provider.js.map +1 -0
  236. package/types/canonical/index.d.ts +1 -1
  237. package/types/canonical/index.d.ts.map +1 -1
  238. package/types/canonical/statistics.types.d.ts +102 -0
  239. package/types/canonical/statistics.types.d.ts.map +1 -1
  240. package/utilities/stats/core/helpers.js +105 -0
  241. package/utilities/stats/core/helpers.js.map +1 -0
  242. package/utilities/stats/core/types.js +5 -0
  243. package/utilities/stats/core/types.js.map +1 -0
  244. package/utilities/stats/match/headToHead.js +83 -0
  245. package/utilities/stats/match/headToHead.js.map +1 -0
  246. package/utilities/stats/match/homeVsAway.js +140 -0
  247. package/utilities/stats/match/homeVsAway.js.map +1 -0
  248. package/utilities/stats/match/overUnder.js +91 -0
  249. package/utilities/stats/match/overUnder.js.map +1 -0
  250. package/utilities/stats/match/result.js +21 -0
  251. package/utilities/stats/match/result.js.map +1 -0
  252. package/utilities/stats/team/commonOpponents.js +77 -0
  253. package/utilities/stats/team/commonOpponents.js.map +1 -0
  254. package/utilities/stats/team/goalStats.js +50 -0
  255. package/utilities/stats/team/goalStats.js.map +1 -0
  256. package/utilities/stats/team/streaks.js +183 -0
  257. package/utilities/stats/team/streaks.js.map +1 -0
  258. package/client.cjs +0 -8
  259. package/fansunited-data-layer.cjs +0 -1
  260. package/matches-CB-dSXEA.js +0 -1633
  261. package/matches-DvC2VSyO.cjs +0 -1
@@ -0,0 +1,154 @@
1
+ import { getConfig } from "../../../../config/index.js";
2
+ import { footballHttp } from "../http.js";
3
+ import { transformPlayerSeasonStatistics, transformPlayerSeasonStatisticsWithoutTeam, mergePlayerSeasonStatistics } from "./player-season.transformer.js";
4
+ import { transformPlayerCareerStatistics } from "./player-career.transformer.js";
5
+ import { transformPlayerRecentStatistics } from "./player-recent.transformer.js";
6
+ async function getFootballPlayerSeasonStatistics(options, config) {
7
+ const finalConfig = config || getConfig();
8
+ const { sportal365Sports } = finalConfig;
9
+ const { seasonIds, teamId, languageCode, next } = options;
10
+ const cacheOptions = next ?? { revalidate: 0 };
11
+ const params = {
12
+ season_ids: seasonIds.join(","),
13
+ team_id: teamId,
14
+ language_code: languageCode ?? sportal365Sports?.languageCode ?? "en"
15
+ };
16
+ const raw = await footballHttp.get({
17
+ path: `/v2/statistics/players/season`,
18
+ params,
19
+ headers: {
20
+ "Accept-Language": languageCode ?? sportal365Sports?.languageCode ?? "en"
21
+ },
22
+ next: cacheOptions,
23
+ config: finalConfig
24
+ });
25
+ if (!raw.statistics) {
26
+ console.error("[getFootballPlayerSeasonStatistics] Invalid API response - missing statistics array:", {
27
+ teamId,
28
+ seasonIds,
29
+ response: raw
30
+ });
31
+ return {};
32
+ }
33
+ if (raw.statistics.length === 0) {
34
+ console.warn("[getFootballPlayerSeasonStatistics] API returned empty statistics array:", {
35
+ teamId,
36
+ seasonIds,
37
+ hint: "This could be due to: wrong credentials, wrong project header, no data for this team/season, or API issue"
38
+ });
39
+ throw new Error(
40
+ `No player statistics found for team ${teamId} in seasons ${seasonIds.join(", ")}. This could be due to: wrong credentials, wrong X-Project header, or no data available for this team/season.`
41
+ );
42
+ }
43
+ const result = {};
44
+ for (const entry of raw.statistics) {
45
+ const playerId = entry.player.id;
46
+ result[playerId] = transformPlayerSeasonStatistics(entry, teamId);
47
+ }
48
+ return result;
49
+ }
50
+ async function getFootballPlayerSeasonStatisticsByPlayerIds(options, config) {
51
+ const finalConfig = config || getConfig();
52
+ const { sportal365Sports } = finalConfig;
53
+ const { playerIds, seasonIds, languageCode, next } = options;
54
+ const cacheOptions = next ?? { revalidate: 0 };
55
+ const params = {
56
+ player_ids: playerIds.join(","),
57
+ season_ids: seasonIds.join(","),
58
+ language_code: languageCode ?? sportal365Sports?.languageCode ?? "en"
59
+ };
60
+ const raw = await footballHttp.get({
61
+ path: `/v2/statistics/players/season`,
62
+ params,
63
+ headers: {
64
+ "Accept-Language": languageCode ?? sportal365Sports?.languageCode ?? "en"
65
+ },
66
+ next: cacheOptions,
67
+ config: finalConfig
68
+ });
69
+ if (!raw.statistics) {
70
+ console.error("[getFootballPlayerSeasonStatisticsByPlayerIds] Invalid API response - missing statistics array:", {
71
+ playerIds,
72
+ seasonIds,
73
+ response: raw
74
+ });
75
+ return {};
76
+ }
77
+ if (raw.statistics.length === 0) {
78
+ return {};
79
+ }
80
+ const result = {};
81
+ for (const entry of raw.statistics) {
82
+ const playerId = entry.player.id;
83
+ const transformed = transformPlayerSeasonStatisticsWithoutTeam(entry);
84
+ if (result[playerId]) {
85
+ result[playerId] = mergePlayerSeasonStatistics(result[playerId], transformed);
86
+ } else {
87
+ result[playerId] = transformed;
88
+ }
89
+ }
90
+ return result;
91
+ }
92
+ async function getFootballPlayerCareerStatistics(options, config) {
93
+ const finalConfig = config || getConfig();
94
+ const { sportal365Sports } = finalConfig;
95
+ const { playerId, languageCode, next } = options;
96
+ const cacheOptions = next ?? { revalidate: 0 };
97
+ const raw = await footballHttp.get({
98
+ path: `/players/${playerId}/statistics`,
99
+ params: {
100
+ language_code: languageCode ?? sportal365Sports?.languageCode ?? "en"
101
+ },
102
+ headers: {
103
+ "Accept-Language": languageCode ?? sportal365Sports?.languageCode ?? "en"
104
+ },
105
+ next: cacheOptions,
106
+ config: finalConfig
107
+ });
108
+ if (!Array.isArray(raw) || raw.length === 0) {
109
+ throw new Error(
110
+ `No career statistics found for player ${playerId}. This could be due to: invalid player ID/slug, wrong credentials, or no data available.`
111
+ );
112
+ }
113
+ return transformPlayerCareerStatistics(raw);
114
+ }
115
+ async function getFootballPlayerRecentStatistics(options, config) {
116
+ const finalConfig = config || getConfig();
117
+ const { sportal365Sports } = finalConfig;
118
+ const { playerId, matches, tournamentIds, teamId, languageCode, next } = options;
119
+ const cacheOptions = next ?? { revalidate: 0 };
120
+ const params = {
121
+ language_code: languageCode ?? sportal365Sports?.languageCode ?? "en"
122
+ };
123
+ if (matches != null) {
124
+ params.matches = String(matches);
125
+ }
126
+ if (tournamentIds?.length) {
127
+ params.tournament_ids = tournamentIds.join(",");
128
+ }
129
+ if (teamId) {
130
+ params.team_id = teamId;
131
+ }
132
+ const raw = await footballHttp.get({
133
+ path: `/v2/statistics/players/${playerId}/recent-statistics`,
134
+ params,
135
+ headers: {
136
+ "Accept-Language": languageCode ?? sportal365Sports?.languageCode ?? "en"
137
+ },
138
+ next: cacheOptions,
139
+ config: finalConfig
140
+ });
141
+ if (!raw.player || !raw.matches) {
142
+ throw new Error(
143
+ `No recent statistics found for player ${playerId}. This could be due to: invalid player ID, wrong credentials, or no data available.`
144
+ );
145
+ }
146
+ return transformPlayerRecentStatistics(raw);
147
+ }
148
+ export {
149
+ getFootballPlayerCareerStatistics,
150
+ getFootballPlayerRecentStatistics,
151
+ getFootballPlayerSeasonStatistics,
152
+ getFootballPlayerSeasonStatisticsByPlayerIds
153
+ };
154
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/lib/api/sportal365-sports/football/statistics/index.ts"],"sourcesContent":["/**\n * Sportal365 Sports API - Football Statistics\n *\n * Fetches player statistics and transforms to canonical FUSports types.\n */\n\nimport type { FUSportsPlayerSeasonStatistics, FUSportsPlayerCareerStatistics, FUSportsPlayerRecentStatistics } from \"../../../../types/canonical\";\nimport { getConfig, type DataLayerConfig } from \"../../../../config\";\nimport { footballHttp } from \"../http\";\nimport type {\n RawPlayerSeasonStatisticsResponse,\n GetFootballPlayerSeasonStatisticsOptions,\n GetFootballPlayerSeasonStatisticsByPlayerIdsOptions,\n} from \"./player-season.types\";\nimport {\n transformPlayerSeasonStatistics,\n transformPlayerSeasonStatisticsWithoutTeam,\n mergePlayerSeasonStatistics,\n} from \"./player-season.transformer\";\nimport type {\n RawPlayerCareerStatisticsResponse,\n GetFootballPlayerCareerStatisticsOptions,\n} from \"./player-career.types\";\nimport { transformPlayerCareerStatistics } from \"./player-career.transformer\";\nimport type {\n RawPlayerRecentStatisticsResponse,\n GetFootballPlayerRecentStatisticsOptions,\n} from \"./player-recent.types\";\nimport { transformPlayerRecentStatistics } from \"./player-recent.transformer\";\n\n// Re-export types for options\nexport type {\n GetFootballPlayerSeasonStatisticsOptions,\n GetFootballPlayerSeasonStatisticsByPlayerIdsOptions,\n} from \"./player-season.types\";\n\nexport type { GetFootballPlayerCareerStatisticsOptions } from \"./player-career.types\";\n\nexport type { GetFootballPlayerRecentStatisticsOptions } from \"./player-recent.types\";\n\n/**\n * Get player season statistics for a team\n *\n * Fetches statistics for all players in a team for the specified season(s).\n *\n * By default, results are cached for 10 minutes (600 seconds).\n * You can override this by passing a custom `next` option.\n *\n * @param options - Required parameters (seasonIds, teamId)\n * @param config - Optional data layer config (uses singleton if not provided)\n * @returns Map of player ID to canonical FUSportsPlayerSeasonStatistics\n *\n * @example\n * ```typescript\n * const stats = await getFootballPlayerSeasonStatistics({\n * seasonIds: ['8009707'],\n * teamId: '102'\n * });\n * console.log(stats['179118']?.goals); // Player goals\n * ```\n *\n * @example\n * ```typescript\n * // Custom cache duration (5 minutes)\n * const stats = await getFootballPlayerSeasonStatistics({\n * seasonIds: ['8009707'],\n * teamId: '102',\n * next: { revalidate: 300 }\n * });\n * ```\n */\nexport async function getFootballPlayerSeasonStatistics(\n options: GetFootballPlayerSeasonStatisticsOptions,\n config?: DataLayerConfig\n): Promise<Record<string, FUSportsPlayerSeasonStatistics>> {\n const finalConfig = config || getConfig();\n const { sportal365Sports } = finalConfig;\n\n const { seasonIds, teamId, languageCode, next } = options;\n\n // Disable caching to prevent caching of failed/empty responses\n // This ensures we always get fresh data and don't cache API errors\n const cacheOptions = next ?? { revalidate: 0 };\n\n const params = {\n season_ids: seasonIds.join(\",\"),\n team_id: teamId,\n language_code: languageCode ?? sportal365Sports?.languageCode ?? \"en\",\n };\n\n const raw = await footballHttp.get<RawPlayerSeasonStatisticsResponse>({\n path: `/v2/statistics/players/season`,\n params,\n headers: {\n \"Accept-Language\": languageCode ?? sportal365Sports?.languageCode ?? \"en\",\n },\n next: cacheOptions,\n config: finalConfig,\n });\n\n // Validate response structure\n if (!raw.statistics) {\n console.error(\"[getFootballPlayerSeasonStatistics] Invalid API response - missing statistics array:\", {\n teamId,\n seasonIds,\n response: raw,\n });\n return {};\n }\n\n // Check if statistics array is empty\n if (raw.statistics.length === 0) {\n console.warn(\"[getFootballPlayerSeasonStatistics] API returned empty statistics array:\", {\n teamId,\n seasonIds,\n hint: \"This could be due to: wrong credentials, wrong project header, no data for this team/season, or API issue\",\n });\n\n // Throw an error instead of returning empty object\n // This prevents Next.js from caching the failed response\n throw new Error(\n `No player statistics found for team ${teamId} in seasons ${seasonIds.join(\", \")}. ` +\n `This could be due to: wrong credentials, wrong X-Project header, or no data available for this team/season.`\n );\n }\n\n // Transform to a map of playerId -> statistics\n const result: Record<string, FUSportsPlayerSeasonStatistics> = {};\n\n for (const entry of raw.statistics) {\n const playerId = entry.player.id;\n result[playerId] = transformPlayerSeasonStatistics(entry, teamId);\n }\n\n return result;\n}\n\n/**\n * Get player season statistics by player IDs\n *\n * Fetches statistics for specific players in the specified season(s).\n * Stats are aggregated across all teams the player has played for.\n *\n * @param options - Required parameters (playerIds, seasonIds)\n * @param config - Optional data layer config (uses singleton if not provided)\n * @returns Map of player ID to canonical FUSportsPlayerSeasonStatistics\n *\n * @example\n * ```typescript\n * const stats = await getFootballPlayerSeasonStatisticsByPlayerIds({\n * playerIds: ['39870'],\n * seasonIds: ['4368438']\n * });\n * console.log(stats['39870']?.goals); // Player goals across all teams\n * ```\n */\nexport async function getFootballPlayerSeasonStatisticsByPlayerIds(\n options: GetFootballPlayerSeasonStatisticsByPlayerIdsOptions,\n config?: DataLayerConfig\n): Promise<Record<string, FUSportsPlayerSeasonStatistics>> {\n const finalConfig = config || getConfig();\n const { sportal365Sports } = finalConfig;\n\n const { playerIds, seasonIds, languageCode, next } = options;\n\n const cacheOptions = next ?? { revalidate: 0 };\n\n const params = {\n player_ids: playerIds.join(\",\"),\n season_ids: seasonIds.join(\",\"),\n language_code: languageCode ?? sportal365Sports?.languageCode ?? \"en\",\n };\n\n const raw = await footballHttp.get<RawPlayerSeasonStatisticsResponse>({\n path: `/v2/statistics/players/season`,\n params,\n headers: {\n \"Accept-Language\": languageCode ?? sportal365Sports?.languageCode ?? \"en\",\n },\n next: cacheOptions,\n config: finalConfig,\n });\n\n if (!raw.statistics) {\n console.error(\"[getFootballPlayerSeasonStatisticsByPlayerIds] Invalid API response - missing statistics array:\", {\n playerIds,\n seasonIds,\n response: raw,\n });\n return {};\n }\n\n if (raw.statistics.length === 0) {\n return {};\n }\n\n // Transform and merge stats per player (a player may have entries for multiple teams)\n const result: Record<string, FUSportsPlayerSeasonStatistics> = {};\n\n for (const entry of raw.statistics) {\n const playerId = entry.player.id;\n const transformed = transformPlayerSeasonStatisticsWithoutTeam(entry);\n\n if (result[playerId]) {\n result[playerId] = mergePlayerSeasonStatistics(result[playerId], transformed);\n } else {\n result[playerId] = transformed;\n }\n }\n\n return result;\n}\n\n/**\n * Get a player's career statistics across all tournaments and teams\n *\n * Fetches statistics throughout a player's entire career, broken down by\n * tournament season and team.\n *\n * @param options - Required parameters (playerId)\n * @param config - Optional data layer config (uses singleton if not provided)\n * @returns Player career statistics with per-season-per-team entries\n *\n * @example\n * ```typescript\n * const career = await getFootballPlayerCareerStatistics({\n * playerId: '3400' // or slug: 'cristiano-ronaldo-3400'\n * });\n * console.log(career.playerName); // \"Cristiano Ronaldo\"\n * console.log(career.entries[0].goals); // Goals in first entry\n * ```\n */\nexport async function getFootballPlayerCareerStatistics(\n options: GetFootballPlayerCareerStatisticsOptions,\n config?: DataLayerConfig\n): Promise<FUSportsPlayerCareerStatistics> {\n const finalConfig = config || getConfig();\n const { sportal365Sports } = finalConfig;\n\n const { playerId, languageCode, next } = options;\n\n const cacheOptions = next ?? { revalidate: 0 };\n\n const raw = await footballHttp.get<RawPlayerCareerStatisticsResponse>({\n path: `/players/${playerId}/statistics`,\n params: {\n language_code: languageCode ?? sportal365Sports?.languageCode ?? \"en\",\n },\n headers: {\n \"Accept-Language\": languageCode ?? sportal365Sports?.languageCode ?? \"en\",\n },\n next: cacheOptions,\n config: finalConfig,\n });\n\n if (!Array.isArray(raw) || raw.length === 0) {\n throw new Error(\n `No career statistics found for player ${playerId}. ` +\n `This could be due to: invalid player ID/slug, wrong credentials, or no data available.`\n );\n }\n\n return transformPlayerCareerStatistics(raw);\n}\n\n/**\n * Get a player's recent statistics from their last N matches\n *\n * Fetches aggregated statistics and match details for a player's most recent matches.\n * Optionally filter by tournament or team.\n *\n * @param options - Required parameters (playerId), optional filters (matches, tournamentIds, teamId)\n * @param config - Optional data layer config (uses singleton if not provided)\n * @returns Player recent statistics with matches and aggregated stats\n *\n * @example\n * ```typescript\n * const recent = await getFootballPlayerRecentStatistics({\n * playerId: '3400',\n * matches: 5\n * });\n * console.log(recent.goals); // Goals in last 5 matches\n * console.log(recent.matches.length); // 5\n * ```\n */\nexport async function getFootballPlayerRecentStatistics(\n options: GetFootballPlayerRecentStatisticsOptions,\n config?: DataLayerConfig\n): Promise<FUSportsPlayerRecentStatistics> {\n const finalConfig = config || getConfig();\n const { sportal365Sports } = finalConfig;\n\n const { playerId, matches, tournamentIds, teamId, languageCode, next } = options;\n\n const cacheOptions = next ?? { revalidate: 0 };\n\n const params: Record<string, string> = {\n language_code: languageCode ?? sportal365Sports?.languageCode ?? \"en\",\n };\n\n if (matches != null) {\n params.matches = String(matches);\n }\n if (tournamentIds?.length) {\n params.tournament_ids = tournamentIds.join(\",\");\n }\n if (teamId) {\n params.team_id = teamId;\n }\n\n const raw = await footballHttp.get<RawPlayerRecentStatisticsResponse>({\n path: `/v2/statistics/players/${playerId}/recent-statistics`,\n params,\n headers: {\n \"Accept-Language\": languageCode ?? sportal365Sports?.languageCode ?? \"en\",\n },\n next: cacheOptions,\n config: finalConfig,\n });\n\n if (!raw.player || !raw.matches) {\n throw new Error(\n `No recent statistics found for player ${playerId}. ` +\n `This could be due to: invalid player ID, wrong credentials, or no data available.`\n );\n }\n\n return transformPlayerRecentStatistics(raw);\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Player career statistics transformation utilities
3
+ * Transforms raw /players/{id}/statistics responses to canonical FUSports types
4
+ */
5
+ import type { FUSportsPlayerCareerStatistics } from "../../../../types/canonical";
6
+ import type { RawPlayerCareerStatisticsResponse } from "./player-career.types";
7
+ /**
8
+ * Transform raw player career statistics response to canonical FUSportsPlayerCareerStatistics
9
+ */
10
+ export declare function transformPlayerCareerStatistics(raw: RawPlayerCareerStatisticsResponse): FUSportsPlayerCareerStatistics;
11
+ //# sourceMappingURL=player-career.transformer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-career.transformer.d.ts","sourceRoot":"","sources":["../../../../../src/lib/api/sportal365-sports/football/statistics/player-career.transformer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACR,8BAA8B,EAEjC,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAER,iCAAiC,EACpC,MAAM,uBAAuB,CAAC;AAgF/B;;GAEG;AACH,wBAAgB,+BAA+B,CAC3C,GAAG,EAAE,iCAAiC,GACvC,8BAA8B,CAUhC"}
@@ -0,0 +1,77 @@
1
+ function transformCareerEntry(raw) {
2
+ return {
3
+ tournamentSeason: {
4
+ id: String(raw.tournament_season.id),
5
+ name: raw.tournament_season.name,
6
+ uuid: raw.tournament_season.uuid,
7
+ active: raw.tournament_season.active,
8
+ tournament: {
9
+ id: String(raw.tournament_season.tournament.id),
10
+ name: raw.tournament_season.tournament.name,
11
+ uuid: raw.tournament_season.tournament.uuid,
12
+ type: raw.tournament_season.tournament.type,
13
+ region: raw.tournament_season.tournament.region,
14
+ logo: raw.tournament_season.tournament.url_logo,
15
+ country: raw.tournament_season.tournament.country ? {
16
+ id: String(raw.tournament_season.tournament.country.id),
17
+ name: raw.tournament_season.tournament.country.name,
18
+ uuid: raw.tournament_season.tournament.country.uuid
19
+ } : void 0
20
+ }
21
+ },
22
+ team: {
23
+ id: String(raw.team.id),
24
+ name: raw.team.name,
25
+ uuid: raw.team.uuid,
26
+ threeLetterCode: raw.team.three_letter_code,
27
+ type: raw.team.type,
28
+ logo: raw.team.url_logo
29
+ },
30
+ // Core statistics
31
+ appearances: raw.played,
32
+ started: raw.started,
33
+ substituteIn: raw.substitute_in,
34
+ substituteOut: raw.substitute_out,
35
+ minutes: raw.minutes,
36
+ minutesSubstitute: raw.minutes_substitute,
37
+ // Scoring
38
+ goals: raw.goals,
39
+ goalsSubstitute: raw.goals_substitute,
40
+ penaltyGoals: raw.penalty_goals,
41
+ ownGoals: raw.own_goals,
42
+ assists: raw.assists,
43
+ // Shooting
44
+ shots: raw.shots,
45
+ shotsOnTarget: raw.shots_on_target,
46
+ // Discipline
47
+ yellowCards: raw.yellow_cards,
48
+ redCards: raw.red_cards,
49
+ foulsCommitted: raw.fouls_committed,
50
+ penaltiesCommitted: raw.penalties_committed,
51
+ // Penalties
52
+ penaltiesMissed: raw.penalties_missed,
53
+ penaltiesReceived: raw.penalties_received,
54
+ penaltiesSaved: raw.penalties_saved,
55
+ // Defensive
56
+ cleansheets: raw.cleansheets,
57
+ // Other
58
+ offsides: raw.offsides,
59
+ // Player context
60
+ position: raw.position,
61
+ age: raw.age,
62
+ shirtNumber: raw.shirt_number
63
+ };
64
+ }
65
+ function transformPlayerCareerStatistics(raw) {
66
+ const firstEntry = raw[0];
67
+ return {
68
+ playerId: String(firstEntry.player.id),
69
+ playerName: firstEntry.player.name,
70
+ playerUuid: firstEntry.player.uuid,
71
+ entries: raw.map(transformCareerEntry)
72
+ };
73
+ }
74
+ export {
75
+ transformPlayerCareerStatistics
76
+ };
77
+ //# sourceMappingURL=player-career.transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-career.transformer.js","sources":["../../../../../src/lib/api/sportal365-sports/football/statistics/player-career.transformer.ts"],"sourcesContent":["/**\n * Player career statistics transformation utilities\n * Transforms raw /players/{id}/statistics responses to canonical FUSports types\n */\n\nimport type {\n FUSportsPlayerCareerStatistics,\n FUSportsPlayerCareerStatisticsEntry,\n} from \"../../../../types/canonical\";\nimport type {\n RawPlayerCareerStatisticsEntry,\n RawPlayerCareerStatisticsResponse,\n} from \"./player-career.types\";\n\n/**\n * Transform a single raw career statistics entry to canonical type\n */\nfunction transformCareerEntry(raw: RawPlayerCareerStatisticsEntry): FUSportsPlayerCareerStatisticsEntry {\n return {\n tournamentSeason: {\n id: String(raw.tournament_season.id),\n name: raw.tournament_season.name,\n uuid: raw.tournament_season.uuid,\n active: raw.tournament_season.active,\n tournament: {\n id: String(raw.tournament_season.tournament.id),\n name: raw.tournament_season.tournament.name,\n uuid: raw.tournament_season.tournament.uuid,\n type: raw.tournament_season.tournament.type,\n region: raw.tournament_season.tournament.region,\n logo: raw.tournament_season.tournament.url_logo,\n country: raw.tournament_season.tournament.country\n ? {\n id: String(raw.tournament_season.tournament.country.id),\n name: raw.tournament_season.tournament.country.name,\n uuid: raw.tournament_season.tournament.country.uuid,\n }\n : undefined,\n },\n },\n team: {\n id: String(raw.team.id),\n name: raw.team.name,\n uuid: raw.team.uuid,\n threeLetterCode: raw.team.three_letter_code,\n type: raw.team.type,\n logo: raw.team.url_logo,\n },\n\n // Core statistics\n appearances: raw.played,\n started: raw.started,\n substituteIn: raw.substitute_in,\n substituteOut: raw.substitute_out,\n minutes: raw.minutes,\n minutesSubstitute: raw.minutes_substitute,\n\n // Scoring\n goals: raw.goals,\n goalsSubstitute: raw.goals_substitute,\n penaltyGoals: raw.penalty_goals,\n ownGoals: raw.own_goals,\n assists: raw.assists,\n\n // Shooting\n shots: raw.shots,\n shotsOnTarget: raw.shots_on_target,\n\n // Discipline\n yellowCards: raw.yellow_cards,\n redCards: raw.red_cards,\n foulsCommitted: raw.fouls_committed,\n penaltiesCommitted: raw.penalties_committed,\n\n // Penalties\n penaltiesMissed: raw.penalties_missed,\n penaltiesReceived: raw.penalties_received,\n penaltiesSaved: raw.penalties_saved,\n\n // Defensive\n cleansheets: raw.cleansheets,\n\n // Other\n offsides: raw.offsides,\n\n // Player context\n position: raw.position,\n age: raw.age,\n shirtNumber: raw.shirt_number,\n };\n}\n\n/**\n * Transform raw player career statistics response to canonical FUSportsPlayerCareerStatistics\n */\nexport function transformPlayerCareerStatistics(\n raw: RawPlayerCareerStatisticsResponse\n): FUSportsPlayerCareerStatistics {\n // Extract player info from the first entry\n const firstEntry = raw[0];\n\n return {\n playerId: String(firstEntry.player.id),\n playerName: firstEntry.player.name,\n playerUuid: firstEntry.player.uuid,\n entries: raw.map(transformCareerEntry),\n };\n}\n"],"names":[],"mappings":"AAiBA,SAAS,qBAAqB,KAA0E;AACpG,SAAO;AAAA,IACH,kBAAkB;AAAA,MACd,IAAI,OAAO,IAAI,kBAAkB,EAAE;AAAA,MACnC,MAAM,IAAI,kBAAkB;AAAA,MAC5B,MAAM,IAAI,kBAAkB;AAAA,MAC5B,QAAQ,IAAI,kBAAkB;AAAA,MAC9B,YAAY;AAAA,QACR,IAAI,OAAO,IAAI,kBAAkB,WAAW,EAAE;AAAA,QAC9C,MAAM,IAAI,kBAAkB,WAAW;AAAA,QACvC,MAAM,IAAI,kBAAkB,WAAW;AAAA,QACvC,MAAM,IAAI,kBAAkB,WAAW;AAAA,QACvC,QAAQ,IAAI,kBAAkB,WAAW;AAAA,QACzC,MAAM,IAAI,kBAAkB,WAAW;AAAA,QACvC,SAAS,IAAI,kBAAkB,WAAW,UACpC;AAAA,UACI,IAAI,OAAO,IAAI,kBAAkB,WAAW,QAAQ,EAAE;AAAA,UACtD,MAAM,IAAI,kBAAkB,WAAW,QAAQ;AAAA,UAC/C,MAAM,IAAI,kBAAkB,WAAW,QAAQ;AAAA,QAAA,IAEnD;AAAA,MAAA;AAAA,IACV;AAAA,IAEJ,MAAM;AAAA,MACF,IAAI,OAAO,IAAI,KAAK,EAAE;AAAA,MACtB,MAAM,IAAI,KAAK;AAAA,MACf,MAAM,IAAI,KAAK;AAAA,MACf,iBAAiB,IAAI,KAAK;AAAA,MAC1B,MAAM,IAAI,KAAK;AAAA,MACf,MAAM,IAAI,KAAK;AAAA,IAAA;AAAA;AAAA,IAInB,aAAa,IAAI;AAAA,IACjB,SAAS,IAAI;AAAA,IACb,cAAc,IAAI;AAAA,IAClB,eAAe,IAAI;AAAA,IACnB,SAAS,IAAI;AAAA,IACb,mBAAmB,IAAI;AAAA;AAAA,IAGvB,OAAO,IAAI;AAAA,IACX,iBAAiB,IAAI;AAAA,IACrB,cAAc,IAAI;AAAA,IAClB,UAAU,IAAI;AAAA,IACd,SAAS,IAAI;AAAA;AAAA,IAGb,OAAO,IAAI;AAAA,IACX,eAAe,IAAI;AAAA;AAAA,IAGnB,aAAa,IAAI;AAAA,IACjB,UAAU,IAAI;AAAA,IACd,gBAAgB,IAAI;AAAA,IACpB,oBAAoB,IAAI;AAAA;AAAA,IAGxB,iBAAiB,IAAI;AAAA,IACrB,mBAAmB,IAAI;AAAA,IACvB,gBAAgB,IAAI;AAAA;AAAA,IAGpB,aAAa,IAAI;AAAA;AAAA,IAGjB,UAAU,IAAI;AAAA;AAAA,IAGd,UAAU,IAAI;AAAA,IACd,KAAK,IAAI;AAAA,IACT,aAAa,IAAI;AAAA,EAAA;AAEzB;AAKO,SAAS,gCACZ,KAC8B;AAE9B,QAAM,aAAa,IAAI,CAAC;AAExB,SAAO;AAAA,IACH,UAAU,OAAO,WAAW,OAAO,EAAE;AAAA,IACrC,YAAY,WAAW,OAAO;AAAA,IAC9B,YAAY,WAAW,OAAO;AAAA,IAC9B,SAAS,IAAI,IAAI,oBAAoB;AAAA,EAAA;AAE7C;"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Player career statistics types for Sportal365 Sports API
3
+ * Endpoint: /players/{id}/statistics
4
+ */
5
+ import type { NextCacheOptions } from "../../http";
6
+ export interface GetFootballPlayerCareerStatisticsOptions {
7
+ /** Player ID or slug */
8
+ playerId: string;
9
+ /** Language code for translations (e.g., 'en', 'bg'). Defaults to 'en' */
10
+ languageCode?: string;
11
+ /** Next.js cache options for ISR/on-demand revalidation */
12
+ next?: NextCacheOptions;
13
+ }
14
+ export interface RawCareerCountry {
15
+ id: number;
16
+ name: string;
17
+ slug: string;
18
+ uuid: string;
19
+ url_flag?: string;
20
+ }
21
+ export interface RawCareerTournament {
22
+ id: number;
23
+ name: string;
24
+ slug: string;
25
+ country: RawCareerCountry;
26
+ regional_league: boolean;
27
+ gender: string;
28
+ type: string;
29
+ region: string;
30
+ uuid: string;
31
+ url_logo?: string;
32
+ }
33
+ export interface RawCareerTournamentSeason {
34
+ id: number;
35
+ name: string;
36
+ slug: string;
37
+ active: boolean;
38
+ uuid: string;
39
+ tournament: RawCareerTournament;
40
+ }
41
+ export interface RawCareerPlayerSocial {
42
+ web?: string;
43
+ twitter_id?: string;
44
+ facebook_id?: string;
45
+ instagram_id?: string;
46
+ wikipedia_id?: string;
47
+ }
48
+ export interface RawCareerPlayer {
49
+ id: number;
50
+ name: string;
51
+ slug: string;
52
+ country: RawCareerCountry;
53
+ gender: string;
54
+ uuid: string;
55
+ url_thumb?: string;
56
+ url_image?: string;
57
+ url_thumb_transparent_background?: string;
58
+ birthdate?: string;
59
+ active: boolean;
60
+ position: string;
61
+ height?: string;
62
+ weight?: string;
63
+ social?: RawCareerPlayerSocial;
64
+ }
65
+ export interface RawCareerTeam {
66
+ id: number;
67
+ name: string;
68
+ slug: string;
69
+ three_letter_code: string;
70
+ type: string;
71
+ gender: string;
72
+ short_name: string | null;
73
+ uuid: string;
74
+ url_logo?: string;
75
+ }
76
+ /**
77
+ * Single entry in the player career statistics response.
78
+ * Statistics are flat properties on the entry (not nested in a statistics array).
79
+ */
80
+ export interface RawPlayerCareerStatisticsEntry {
81
+ tournament_season: RawCareerTournamentSeason;
82
+ player: RawCareerPlayer;
83
+ team: RawCareerTeam;
84
+ assists?: number;
85
+ cleansheets?: number;
86
+ fouls_committed?: number;
87
+ goals?: number;
88
+ goals_substitute?: number;
89
+ minutes?: number;
90
+ minutes_substitute?: number;
91
+ offsides?: number;
92
+ own_goals?: number;
93
+ penalties_committed?: number;
94
+ penalties_missed?: number;
95
+ penalties_received?: number;
96
+ penalties_saved?: number;
97
+ penalty_goals?: number;
98
+ played?: number;
99
+ red_cards?: number;
100
+ shots?: number;
101
+ shots_on_target?: number;
102
+ started?: number;
103
+ substitute_in?: number;
104
+ substitute_out?: number;
105
+ yellow_cards?: number;
106
+ shirt_number?: number | null;
107
+ position?: string;
108
+ age?: number;
109
+ }
110
+ /**
111
+ * Player career statistics response from /players/{id}/statistics
112
+ * Returns a flat array of per-season-per-team statistics entries.
113
+ */
114
+ export type RawPlayerCareerStatisticsResponse = RawPlayerCareerStatisticsEntry[];
115
+ //# sourceMappingURL=player-career.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-career.types.d.ts","sourceRoot":"","sources":["../../../../../src/lib/api/sportal365-sports/football/statistics/player-career.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Player recent statistics transformation utilities
3
+ * Transforms raw /v2/statistics/players/{id}/recent-statistics responses to canonical FUSports types
4
+ */
5
+ import type { FUSportsPlayerRecentStatistics } from "../../../../types/canonical";
6
+ import type { RawPlayerRecentStatisticsResponse } from "./player-recent.types";
7
+ /**
8
+ * Transform raw player recent statistics response to canonical type
9
+ */
10
+ export declare function transformPlayerRecentStatistics(raw: RawPlayerRecentStatisticsResponse): FUSportsPlayerRecentStatistics;
11
+ //# sourceMappingURL=player-recent.transformer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-recent.transformer.d.ts","sourceRoot":"","sources":["../../../../../src/lib/api/sportal365-sports/football/statistics/player-recent.transformer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,8BAA8B,EAAsB,MAAM,6BAA6B,CAAC;AACtG,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,uBAAuB,CAAC;AAkC/E;;GAEG;AACH,wBAAgB,+BAA+B,CAC3C,GAAG,EAAE,iCAAiC,GACvC,8BAA8B,CAoChC"}
@@ -0,0 +1,54 @@
1
+ import { transformMatch } from "../matches/transformers/match.js";
2
+ function parseStatValue(value) {
3
+ const parsed = parseInt(value, 10);
4
+ return isNaN(parsed) ? void 0 : parsed;
5
+ }
6
+ function getStatValue(statistics, name) {
7
+ const stat = statistics.find((s) => s.name === name);
8
+ return stat ? parseStatValue(stat.value) : void 0;
9
+ }
10
+ function transformTeam(raw) {
11
+ return {
12
+ id: raw.id,
13
+ name: raw.name,
14
+ uuid: raw.uuid,
15
+ threeLetterCode: raw.three_letter_code,
16
+ type: raw.type,
17
+ logo: raw.assets?.logo?.url
18
+ };
19
+ }
20
+ function transformPlayerRecentStatistics(raw) {
21
+ const stats = raw.aggregated_statistics;
22
+ return {
23
+ playerId: raw.player.id,
24
+ playerName: raw.player.name,
25
+ playerUuid: raw.player.uuid,
26
+ position: raw.player.position,
27
+ teams: raw.teams.map(transformTeam),
28
+ matches: raw.matches.map(transformMatch),
29
+ // Core statistics
30
+ appearances: getStatValue(stats, "played"),
31
+ started: getStatValue(stats, "started"),
32
+ substituteIn: getStatValue(stats, "substitute_in"),
33
+ substituteOut: getStatValue(stats, "substitute_out"),
34
+ minutes: getStatValue(stats, "minutes"),
35
+ minutesSubstitute: getStatValue(stats, "minutes_substitute"),
36
+ // Scoring
37
+ goals: getStatValue(stats, "goals"),
38
+ goalsSubstitute: getStatValue(stats, "goals_substitute"),
39
+ penaltyGoals: getStatValue(stats, "penalty_goals"),
40
+ assists: getStatValue(stats, "assists"),
41
+ // Discipline
42
+ yellowCards: getStatValue(stats, "yellow_cards"),
43
+ redCards: getStatValue(stats, "red_cards"),
44
+ // Raw statistics array
45
+ rawStatistics: stats.map((s) => ({
46
+ name: s.name,
47
+ value: s.value
48
+ }))
49
+ };
50
+ }
51
+ export {
52
+ transformPlayerRecentStatistics
53
+ };
54
+ //# sourceMappingURL=player-recent.transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-recent.transformer.js","sources":["../../../../../src/lib/api/sportal365-sports/football/statistics/player-recent.transformer.ts"],"sourcesContent":["/**\n * Player recent statistics transformation utilities\n * Transforms raw /v2/statistics/players/{id}/recent-statistics responses to canonical FUSports types\n */\n\nimport type { FUSportsPlayerRecentStatistics, FUSportsCareerTeam } from \"../../../../types/canonical\";\nimport type { RawPlayerRecentStatisticsResponse } from \"./player-recent.types\";\nimport type { RawPlayerStatistic, RawTeamInfo } from \"./player-season.types\";\nimport { transformMatch } from \"../matches/transformers/match\";\n\n/**\n * Parse a statistic value to number\n */\nfunction parseStatValue(value: string): number | undefined {\n const parsed = parseInt(value, 10);\n return isNaN(parsed) ? undefined : parsed;\n}\n\n/**\n * Get a specific statistic value by name\n */\nfunction getStatValue(statistics: RawPlayerStatistic[], name: string): number | undefined {\n const stat = statistics.find((s) => s.name === name);\n return stat ? parseStatValue(stat.value) : undefined;\n}\n\n/**\n * Transform raw team info to canonical career team\n */\nfunction transformTeam(raw: RawTeamInfo): FUSportsCareerTeam {\n return {\n id: raw.id,\n name: raw.name,\n uuid: raw.uuid,\n threeLetterCode: raw.three_letter_code,\n type: raw.type,\n logo: raw.assets?.logo?.url,\n };\n}\n\n/**\n * Transform raw player recent statistics response to canonical type\n */\nexport function transformPlayerRecentStatistics(\n raw: RawPlayerRecentStatisticsResponse\n): FUSportsPlayerRecentStatistics {\n const stats = raw.aggregated_statistics;\n\n return {\n playerId: raw.player.id,\n playerName: raw.player.name,\n playerUuid: raw.player.uuid,\n position: raw.player.position,\n\n teams: raw.teams.map(transformTeam),\n matches: raw.matches.map(transformMatch),\n\n // Core statistics\n appearances: getStatValue(stats, \"played\"),\n started: getStatValue(stats, \"started\"),\n substituteIn: getStatValue(stats, \"substitute_in\"),\n substituteOut: getStatValue(stats, \"substitute_out\"),\n minutes: getStatValue(stats, \"minutes\"),\n minutesSubstitute: getStatValue(stats, \"minutes_substitute\"),\n\n // Scoring\n goals: getStatValue(stats, \"goals\"),\n goalsSubstitute: getStatValue(stats, \"goals_substitute\"),\n penaltyGoals: getStatValue(stats, \"penalty_goals\"),\n assists: getStatValue(stats, \"assists\"),\n\n // Discipline\n yellowCards: getStatValue(stats, \"yellow_cards\"),\n redCards: getStatValue(stats, \"red_cards\"),\n\n // Raw statistics array\n rawStatistics: stats.map((s) => ({\n name: s.name,\n value: s.value,\n })),\n };\n}\n"],"names":[],"mappings":";AAaA,SAAS,eAAe,OAAmC;AACvD,QAAM,SAAS,SAAS,OAAO,EAAE;AACjC,SAAO,MAAM,MAAM,IAAI,SAAY;AACvC;AAKA,SAAS,aAAa,YAAkC,MAAkC;AACtF,QAAM,OAAO,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACnD,SAAO,OAAO,eAAe,KAAK,KAAK,IAAI;AAC/C;AAKA,SAAS,cAAc,KAAsC;AACzD,SAAO;AAAA,IACH,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,MAAM,IAAI;AAAA,IACV,iBAAiB,IAAI;AAAA,IACrB,MAAM,IAAI;AAAA,IACV,MAAM,IAAI,QAAQ,MAAM;AAAA,EAAA;AAEhC;AAKO,SAAS,gCACZ,KAC8B;AAC9B,QAAM,QAAQ,IAAI;AAElB,SAAO;AAAA,IACH,UAAU,IAAI,OAAO;AAAA,IACrB,YAAY,IAAI,OAAO;AAAA,IACvB,YAAY,IAAI,OAAO;AAAA,IACvB,UAAU,IAAI,OAAO;AAAA,IAErB,OAAO,IAAI,MAAM,IAAI,aAAa;AAAA,IAClC,SAAS,IAAI,QAAQ,IAAI,cAAc;AAAA;AAAA,IAGvC,aAAa,aAAa,OAAO,QAAQ;AAAA,IACzC,SAAS,aAAa,OAAO,SAAS;AAAA,IACtC,cAAc,aAAa,OAAO,eAAe;AAAA,IACjD,eAAe,aAAa,OAAO,gBAAgB;AAAA,IACnD,SAAS,aAAa,OAAO,SAAS;AAAA,IACtC,mBAAmB,aAAa,OAAO,oBAAoB;AAAA;AAAA,IAG3D,OAAO,aAAa,OAAO,OAAO;AAAA,IAClC,iBAAiB,aAAa,OAAO,kBAAkB;AAAA,IACvD,cAAc,aAAa,OAAO,eAAe;AAAA,IACjD,SAAS,aAAa,OAAO,SAAS;AAAA;AAAA,IAGtC,aAAa,aAAa,OAAO,cAAc;AAAA,IAC/C,UAAU,aAAa,OAAO,WAAW;AAAA;AAAA,IAGzC,eAAe,MAAM,IAAI,CAAC,OAAO;AAAA,MAC7B,MAAM,EAAE;AAAA,MACR,OAAO,EAAE;AAAA,IAAA,EACX;AAAA,EAAA;AAEV;"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Player recent statistics types for Sportal365 Sports API
3
+ * Endpoint: /v2/statistics/players/{id}/recent-statistics
4
+ */
5
+ import type { RawPlayerInfo, RawTeamInfo, RawPlayerStatistic } from "./player-season.types";
6
+ import type { RawMatch } from "../matches/types/match.types";
7
+ import type { NextCacheOptions } from "../../http";
8
+ export interface GetFootballPlayerRecentStatisticsOptions {
9
+ /** Player ID or slug */
10
+ playerId: string;
11
+ /** Number of recent matches to include (1-20) */
12
+ matches?: number;
13
+ /** CSV list of tournament IDs to filter by */
14
+ tournamentIds?: string[];
15
+ /** Team ID to filter by */
16
+ teamId?: string;
17
+ /** Language code for translations (e.g., 'en', 'bg'). Defaults to 'en' */
18
+ languageCode?: string;
19
+ /** Next.js cache options for ISR/on-demand revalidation */
20
+ next?: NextCacheOptions;
21
+ }
22
+ /**
23
+ * Player recent statistics response from /v2/statistics/players/{id}/recent-statistics
24
+ */
25
+ export interface RawPlayerRecentStatisticsResponse {
26
+ player: RawPlayerInfo;
27
+ teams: RawTeamInfo[];
28
+ matches: RawMatch[];
29
+ aggregated_statistics: RawPlayerStatistic[];
30
+ }
31
+ //# sourceMappingURL=player-recent.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-recent.types.d.ts","sourceRoot":"","sources":["../../../../../src/lib/api/sportal365-sports/football/statistics/player-recent.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAMnD,MAAM,WAAW,wCAAwC;IACrD,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAMD;;GAEG;AACH,MAAM,WAAW,iCAAiC;IAC9C,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,qBAAqB,EAAE,kBAAkB,EAAE,CAAC;CAC/C"}