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,5 @@
1
+ const FANSUNITED_FOOTBALL_DOMAIN = "https://football.fansunitedapi.com";
2
+ export {
3
+ FANSUNITED_FOOTBALL_DOMAIN
4
+ };
5
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sources":["../../../src/lib/api/fansunited/constants.ts"],"sourcesContent":["/**\n * Constants for Fans United APIs\n */\n\nexport const FANSUNITED_FOOTBALL_DOMAIN = \"https://football.fansunitedapi.com\";\n"],"names":[],"mappings":"AAIO,MAAM,6BAA6B;"}
@@ -0,0 +1,21 @@
1
+ import { getConfig } from "../../../../config/index.js";
2
+ import { footballHttp } from "../http.js";
3
+ import { transformCompetition } from "./transformer.js";
4
+ async function getFansUnitedFootballCompetition(competitionId, options, config) {
5
+ const finalConfig = config || getConfig();
6
+ const params = {};
7
+ if (options?.lang) {
8
+ params.lang = options.lang;
9
+ }
10
+ const raw = await footballHttp.get({
11
+ path: `/v1/competitions/${competitionId}`,
12
+ params,
13
+ next: options?.next,
14
+ config: finalConfig
15
+ });
16
+ return transformCompetition(raw);
17
+ }
18
+ export {
19
+ getFansUnitedFootballCompetition
20
+ };
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/lib/api/fansunited/football/competition/index.ts"],"sourcesContent":["/**\n * Football competition endpoints for Fans United Football API\n */\n\nimport type { FUSportsCompetition } from \"../../../../types/canonical\";\nimport { getConfig, type DataLayerConfig } from \"../../../../config\";\nimport { footballHttp } from \"../http\";\nimport type { GetFootballCompetitionOptions, RawCompetitionResponse } from \"./types\";\nimport { transformCompetition } from \"./transformer\";\n\n// Re-export types\nexport type { GetFootballCompetitionOptions } from \"./types\";\n\n/**\n * Get a football competition by ID from Fans United Football API\n *\n * @param competitionId - The competition ID\n * @param options - Query options\n * @param config - Optional data layer config (uses singleton if not provided)\n * @returns Competition in canonical format\n *\n * @example\n * ```typescript\n * import { getFansUnitedFootballCompetition } from 'fansunited-data-layer';\n *\n * // Get competition by ID\n * const competition = await getFansUnitedFootballCompetition('1', {\n * lang: 'EN'\n * });\n *\n * console.log(competition.name); // \"Premier League\"\n * console.log(competition.type); // \"LEAGUE\"\n * ```\n */\nexport async function getFansUnitedFootballCompetition(\n competitionId: string,\n options?: GetFootballCompetitionOptions,\n config?: DataLayerConfig\n): Promise<FUSportsCompetition> {\n const finalConfig = config || getConfig();\n\n const params: Record<string, string | undefined> = {};\n\n // Add language parameter\n if (options?.lang) {\n params.lang = options.lang;\n }\n\n const raw = await footballHttp.get<RawCompetitionResponse>({\n path: `/v1/competitions/${competitionId}`,\n params,\n next: options?.next,\n config: finalConfig,\n });\n\n return transformCompetition(raw);\n}\n\n"],"names":[],"mappings":";;;AAkCA,eAAsB,iCAClB,eACA,SACA,QAC4B;AAC5B,QAAM,cAAc,UAAU,UAAA;AAE9B,QAAM,SAA6C,CAAA;AAGnD,MAAI,SAAS,MAAM;AACf,WAAO,OAAO,QAAQ;AAAA,EAC1B;AAEA,QAAM,MAAM,MAAM,aAAa,IAA4B;AAAA,IACvD,MAAM,oBAAoB,aAAa;AAAA,IACvC;AAAA,IACA,MAAM,SAAS;AAAA,IACf,QAAQ;AAAA,EAAA,CACX;AAED,SAAO,qBAAqB,GAAG;AACnC;"}
@@ -0,0 +1,41 @@
1
+ function transformCountry(raw) {
2
+ return {
3
+ id: raw.id,
4
+ name: raw.name,
5
+ code: raw.country_code,
6
+ assets: raw.assets?.flag ? {
7
+ flag: raw.assets.flag
8
+ } : void 0,
9
+ providerRef: [
10
+ {
11
+ provider: "fansunited",
12
+ id: raw.id
13
+ }
14
+ ]
15
+ };
16
+ }
17
+ function transformCompetitionData(raw) {
18
+ return {
19
+ id: raw.id,
20
+ name: raw.name,
21
+ type: raw.type?.toUpperCase() || "LEAGUE",
22
+ gender: raw.gender?.toUpperCase(),
23
+ country: raw.country ? transformCountry(raw.country) : void 0,
24
+ assets: raw.assets?.logo ? {
25
+ logo: raw.assets.logo
26
+ } : void 0,
27
+ providerRef: [
28
+ {
29
+ provider: "fansunited",
30
+ id: raw.id
31
+ }
32
+ ]
33
+ };
34
+ }
35
+ function transformCompetition(raw) {
36
+ return transformCompetitionData(raw.data);
37
+ }
38
+ export {
39
+ transformCompetition
40
+ };
41
+ //# sourceMappingURL=transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformer.js","sources":["../../../../../src/lib/api/fansunited/football/competition/transformer.ts"],"sourcesContent":["/**\n * Transform raw competition data to canonical FUSports types\n */\n\nimport type { FUSportsCompetition } from \"../../../../types/canonical\";\nimport type { RawCompetitionResponse, RawCompetition, RawCountry } from \"./types\";\n\n/**\n * Transform raw country to canonical format\n */\nfunction transformCountry(raw: RawCountry) {\n return {\n id: raw.id,\n name: raw.name,\n code: raw.country_code,\n assets: raw.assets?.flag\n ? {\n flag: raw.assets.flag,\n }\n : undefined,\n providerRef: [\n {\n provider: \"fansunited\" as const,\n id: raw.id,\n },\n ],\n };\n}\n\n/**\n * Transform unwrapped competition data to canonical FUSportsCompetition\n */\nfunction transformCompetitionData(raw: RawCompetition): FUSportsCompetition {\n return {\n id: raw.id,\n name: raw.name,\n type: (raw.type?.toUpperCase() as \"LEAGUE\" | \"CUP\" | \"TOURNAMENT\" | \"FRIENDLY\" | undefined) || \"LEAGUE\",\n gender: raw.gender?.toUpperCase() as \"MALE\" | \"FEMALE\" | undefined,\n country: raw.country ? transformCountry(raw.country) : undefined,\n assets: raw.assets?.logo\n ? {\n logo: raw.assets.logo,\n }\n : undefined,\n providerRef: [\n {\n provider: \"fansunited\",\n id: raw.id,\n },\n ],\n };\n}\n\n/**\n * Transform raw competition response to canonical FUSportsCompetition\n * The API wraps the competition data in a \"data\" property\n */\nexport function transformCompetition(raw: RawCompetitionResponse): FUSportsCompetition {\n return transformCompetitionData(raw.data);\n}\n"],"names":[],"mappings":"AAUA,SAAS,iBAAiB,KAAiB;AACvC,SAAO;AAAA,IACH,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,MAAM,IAAI;AAAA,IACV,QAAQ,IAAI,QAAQ,OACd;AAAA,MACI,MAAM,IAAI,OAAO;AAAA,IAAA,IAErB;AAAA,IACN,aAAa;AAAA,MACT;AAAA,QACI,UAAU;AAAA,QACV,IAAI,IAAI;AAAA,MAAA;AAAA,IACZ;AAAA,EACJ;AAER;AAKA,SAAS,yBAAyB,KAA0C;AACxE,SAAO;AAAA,IACH,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,MAAO,IAAI,MAAM,YAAA,KAA8E;AAAA,IAC/F,QAAQ,IAAI,QAAQ,YAAA;AAAA,IACpB,SAAS,IAAI,UAAU,iBAAiB,IAAI,OAAO,IAAI;AAAA,IACvD,QAAQ,IAAI,QAAQ,OACd;AAAA,MACI,MAAM,IAAI,OAAO;AAAA,IAAA,IAErB;AAAA,IACN,aAAa;AAAA,MACT;AAAA,QACI,UAAU;AAAA,QACV,IAAI,IAAI;AAAA,MAAA;AAAA,IACZ;AAAA,EACJ;AAER;AAMO,SAAS,qBAAqB,KAAkD;AACnF,SAAO,yBAAyB,IAAI,IAAI;AAC5C;"}
@@ -0,0 +1,56 @@
1
+ import { footballHttp } from "../http.js";
2
+ import { transformCompetitions } from "./transformer.js";
3
+ async function getFansUnitedFootballCompetitions(options, config) {
4
+ const params = {};
5
+ if (options?.lang) {
6
+ params.lang = options.lang;
7
+ } else {
8
+ params.lang = "EN";
9
+ }
10
+ if (options?.sortField) {
11
+ params.sort_field = options.sortField;
12
+ }
13
+ if (options?.sortOrder) {
14
+ params.sort_order = options.sortOrder;
15
+ }
16
+ if (options?.page !== void 0) {
17
+ params.page = String(options.page);
18
+ }
19
+ if (options?.perPage !== void 0) {
20
+ params.per_page = String(options.perPage);
21
+ }
22
+ if (options?.countryId !== void 0) {
23
+ params.country_id = String(options.countryId);
24
+ }
25
+ if (options?.active !== void 0) {
26
+ params.active = options.active ? "1" : "0";
27
+ }
28
+ const response = await footballHttp.get({
29
+ path: "/v1/competitions",
30
+ params,
31
+ config,
32
+ next: options?.next
33
+ });
34
+ const rawIds = response.data.map((c) => c.id);
35
+ const uniqueRawIds = new Set(rawIds);
36
+ if (rawIds.length !== uniqueRawIds.size) {
37
+ console.warn("⚠️ API returned duplicate competitions!");
38
+ }
39
+ const transformed = transformCompetitions(response.data);
40
+ const seen = /* @__PURE__ */ new Set();
41
+ const deduplicated = transformed.filter((competition) => {
42
+ if (seen.has(competition.id)) {
43
+ return false;
44
+ }
45
+ seen.add(competition.id);
46
+ return true;
47
+ });
48
+ if (transformed.length !== deduplicated.length) {
49
+ console.warn(`Removed ${transformed.length - deduplicated.length} duplicate competitions`);
50
+ }
51
+ return deduplicated;
52
+ }
53
+ export {
54
+ getFansUnitedFootballCompetitions
55
+ };
56
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/lib/api/fansunited/football/competitions/index.ts"],"sourcesContent":["/**\n * Competitions API for Fans United Football API\n */\n\nimport { footballHttp } from \"../http\";\nimport { transformCompetitions } from \"./transformer\";\nimport type { FUSportsCompetition } from \"../../../../types/canonical\";\nimport type { DataLayerConfig } from \"../../../../config\";\nimport type { GetFootballCompetitionsOptions, RawCompetitionsResponse } from \"./types\";\n\n/**\n * Get all football competitions from Fans United Football API\n *\n * @param options - Query options for filtering and pagination\n * @param config - Optional data layer config (uses singleton if not provided)\n * @returns Array of competitions in canonical format\n *\n * @example\n * ```typescript\n * import { getFansUnitedFootballCompetitions } from 'fansunited-data-layer';\n *\n * // Get all competitions sorted by name\n * const competitions = await getFansUnitedFootballCompetitions({\n * lang: 'EN',\n * sortField: 'name',\n * sortOrder: 'asc'\n * });\n * ```\n */\nexport async function getFansUnitedFootballCompetitions(\n options?: GetFootballCompetitionsOptions,\n config?: DataLayerConfig\n): Promise<FUSportsCompetition[]> {\n const params: Record<string, string | undefined> = {};\n\n // Add language parameter\n if (options?.lang) {\n params.lang = options.lang;\n } else {\n params.lang = \"EN\"; // Default language\n }\n\n // Add sorting parameters\n if (options?.sortField) {\n params.sort_field = options.sortField;\n }\n if (options?.sortOrder) {\n params.sort_order = options.sortOrder;\n }\n\n // Add pagination parameters\n if (options?.page !== undefined) {\n params.page = String(options.page);\n }\n if (options?.perPage !== undefined) {\n params.per_page = String(options.perPage);\n }\n\n // Add filter parameters\n if (options?.countryId !== undefined) {\n params.country_id = String(options.countryId);\n }\n if (options?.active !== undefined) {\n params.active = options.active ? \"1\" : \"0\";\n }\n\n const response = await footballHttp.get<RawCompetitionsResponse>({\n path: \"/v1/competitions\",\n params,\n config,\n next: options?.next,\n });\n\n // Check for duplicates in raw data\n const rawIds = response.data.map((c) => c.id);\n const uniqueRawIds = new Set(rawIds);\n\n if (rawIds.length !== uniqueRawIds.size) {\n console.warn(\"⚠️ API returned duplicate competitions!\");\n }\n\n const transformed = transformCompetitions(response.data);\n\n // Deduplicate by ID (keep the first occurrence)\n const seen = new Set<string>();\n const deduplicated = transformed.filter((competition) => {\n if (seen.has(competition.id)) {\n return false;\n }\n seen.add(competition.id);\n return true;\n });\n\n if (transformed.length !== deduplicated.length) {\n console.warn(`Removed ${transformed.length - deduplicated.length} duplicate competitions`);\n }\n\n return deduplicated;\n}\n"],"names":[],"mappings":";;AA6BA,eAAsB,kCAClB,SACA,QAC8B;AAC9B,QAAM,SAA6C,CAAA;AAGnD,MAAI,SAAS,MAAM;AACf,WAAO,OAAO,QAAQ;AAAA,EAC1B,OAAO;AACH,WAAO,OAAO;AAAA,EAClB;AAGA,MAAI,SAAS,WAAW;AACpB,WAAO,aAAa,QAAQ;AAAA,EAChC;AACA,MAAI,SAAS,WAAW;AACpB,WAAO,aAAa,QAAQ;AAAA,EAChC;AAGA,MAAI,SAAS,SAAS,QAAW;AAC7B,WAAO,OAAO,OAAO,QAAQ,IAAI;AAAA,EACrC;AACA,MAAI,SAAS,YAAY,QAAW;AAChC,WAAO,WAAW,OAAO,QAAQ,OAAO;AAAA,EAC5C;AAGA,MAAI,SAAS,cAAc,QAAW;AAClC,WAAO,aAAa,OAAO,QAAQ,SAAS;AAAA,EAChD;AACA,MAAI,SAAS,WAAW,QAAW;AAC/B,WAAO,SAAS,QAAQ,SAAS,MAAM;AAAA,EAC3C;AAEA,QAAM,WAAW,MAAM,aAAa,IAA6B;AAAA,IAC7D,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,MAAM,SAAS;AAAA,EAAA,CAClB;AAGD,QAAM,SAAS,SAAS,KAAK,IAAI,CAAC,MAAM,EAAE,EAAE;AAC5C,QAAM,eAAe,IAAI,IAAI,MAAM;AAEnC,MAAI,OAAO,WAAW,aAAa,MAAM;AACrC,YAAQ,KAAK,yCAAyC;AAAA,EAC1D;AAEA,QAAM,cAAc,sBAAsB,SAAS,IAAI;AAGvD,QAAM,2BAAW,IAAA;AACjB,QAAM,eAAe,YAAY,OAAO,CAAC,gBAAgB;AACrD,QAAI,KAAK,IAAI,YAAY,EAAE,GAAG;AAC1B,aAAO;AAAA,IACX;AACA,SAAK,IAAI,YAAY,EAAE;AACvB,WAAO;AAAA,EACX,CAAC;AAED,MAAI,YAAY,WAAW,aAAa,QAAQ;AAC5C,YAAQ,KAAK,WAAW,YAAY,SAAS,aAAa,MAAM,yBAAyB;AAAA,EAC7F;AAEA,SAAO;AACX;"}
@@ -0,0 +1,68 @@
1
+ function transformSeason(raw) {
2
+ return {
3
+ id: String(raw.id),
4
+ name: raw.name,
5
+ active: raw.active,
6
+ providerRef: [
7
+ {
8
+ provider: "fansunited",
9
+ id: String(raw.id)
10
+ }
11
+ ]
12
+ };
13
+ }
14
+ function transformCompetition(raw) {
15
+ const competition = {
16
+ id: String(raw.id),
17
+ name: raw.name,
18
+ shortName: raw.short_name,
19
+ slug: raw.slug,
20
+ type: raw.type || "LEAGUE",
21
+ region: raw.region,
22
+ gender: raw.gender,
23
+ providerRef: [
24
+ {
25
+ provider: "fansunited",
26
+ id: String(raw.id)
27
+ }
28
+ ]
29
+ };
30
+ if (raw.country) {
31
+ competition.country = {
32
+ id: String(raw.country.id),
33
+ name: raw.country.name,
34
+ code: raw.country.code,
35
+ flag: raw.country.assets?.flag,
36
+ providerRef: [
37
+ {
38
+ provider: "fansunited",
39
+ id: String(raw.country.id)
40
+ }
41
+ ]
42
+ };
43
+ }
44
+ if (raw.assets?.logo) {
45
+ competition.assets = {
46
+ logo: raw.assets.logo
47
+ };
48
+ }
49
+ if (raw.seasons && raw.seasons.length > 0) {
50
+ competition.seasons = raw.seasons.map(transformSeason);
51
+ }
52
+ if (raw.current_season) {
53
+ competition.season = {
54
+ id: String(raw.current_season.id),
55
+ name: raw.current_season.name,
56
+ status: raw.current_season.active ? "ACTIVE" : "INACTIVE"
57
+ };
58
+ }
59
+ return competition;
60
+ }
61
+ function transformCompetitions(raw) {
62
+ return raw.map(transformCompetition);
63
+ }
64
+ export {
65
+ transformCompetition,
66
+ transformCompetitions
67
+ };
68
+ //# sourceMappingURL=transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformer.js","sources":["../../../../../src/lib/api/fansunited/football/competitions/transformer.ts"],"sourcesContent":["/**\n * Competition transformers for Fans United Football API\n */\n\nimport type { FUSportsCompetition, FUSportsSeason } from \"../../../../types/canonical\";\nimport type { RawCompetition, RawCompetitionSeason } from \"./types\";\n\n/**\n * Transform raw season to canonical format\n */\nfunction transformSeason(raw: RawCompetitionSeason): FUSportsSeason {\n return {\n id: String(raw.id),\n name: raw.name,\n active: raw.active,\n providerRef: [\n {\n provider: \"fansunited\",\n id: String(raw.id),\n },\n ],\n };\n}\n\n/**\n * Transform raw competition response to canonical FUSportsCompetition\n */\nexport function transformCompetition(raw: RawCompetition): FUSportsCompetition {\n const competition: FUSportsCompetition = {\n id: String(raw.id),\n name: raw.name,\n shortName: raw.short_name,\n slug: raw.slug,\n type: raw.type || \"LEAGUE\",\n region: raw.region,\n gender: raw.gender,\n providerRef: [\n {\n provider: \"fansunited\",\n id: String(raw.id),\n },\n ],\n };\n\n // Add country if available\n if (raw.country) {\n competition.country = {\n id: String(raw.country.id),\n name: raw.country.name,\n code: raw.country.code,\n flag: raw.country.assets?.flag,\n providerRef: [\n {\n provider: \"fansunited\",\n id: String(raw.country.id),\n },\n ],\n };\n }\n\n // Add logo if available\n if (raw.assets?.logo) {\n competition.assets = {\n logo: raw.assets.logo,\n };\n }\n\n // Add seasons if available\n if (raw.seasons && raw.seasons.length > 0) {\n competition.seasons = raw.seasons.map(transformSeason);\n }\n\n // Add current season if available\n if (raw.current_season) {\n competition.season = {\n id: String(raw.current_season.id),\n name: raw.current_season.name,\n status: raw.current_season.active ? \"ACTIVE\" : \"INACTIVE\",\n };\n }\n\n return competition;\n}\n\n/**\n * Transform array of raw competitions to canonical format\n */\nexport function transformCompetitions(raw: RawCompetition[]): FUSportsCompetition[] {\n return raw.map(transformCompetition);\n}\n"],"names":[],"mappings":"AAUA,SAAS,gBAAgB,KAA2C;AAChE,SAAO;AAAA,IACH,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,MAAM,IAAI;AAAA,IACV,QAAQ,IAAI;AAAA,IACZ,aAAa;AAAA,MACT;AAAA,QACI,UAAU;AAAA,QACV,IAAI,OAAO,IAAI,EAAE;AAAA,MAAA;AAAA,IACrB;AAAA,EACJ;AAER;AAKO,SAAS,qBAAqB,KAA0C;AAC3E,QAAM,cAAmC;AAAA,IACrC,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,MAAM,IAAI;AAAA,IACV,WAAW,IAAI;AAAA,IACf,MAAM,IAAI;AAAA,IACV,MAAM,IAAI,QAAQ;AAAA,IAClB,QAAQ,IAAI;AAAA,IACZ,QAAQ,IAAI;AAAA,IACZ,aAAa;AAAA,MACT;AAAA,QACI,UAAU;AAAA,QACV,IAAI,OAAO,IAAI,EAAE;AAAA,MAAA;AAAA,IACrB;AAAA,EACJ;AAIJ,MAAI,IAAI,SAAS;AACb,gBAAY,UAAU;AAAA,MAClB,IAAI,OAAO,IAAI,QAAQ,EAAE;AAAA,MACzB,MAAM,IAAI,QAAQ;AAAA,MAClB,MAAM,IAAI,QAAQ;AAAA,MAClB,MAAM,IAAI,QAAQ,QAAQ;AAAA,MAC1B,aAAa;AAAA,QACT;AAAA,UACI,UAAU;AAAA,UACV,IAAI,OAAO,IAAI,QAAQ,EAAE;AAAA,QAAA;AAAA,MAC7B;AAAA,IACJ;AAAA,EAER;AAGA,MAAI,IAAI,QAAQ,MAAM;AAClB,gBAAY,SAAS;AAAA,MACjB,MAAM,IAAI,OAAO;AAAA,IAAA;AAAA,EAEzB;AAGA,MAAI,IAAI,WAAW,IAAI,QAAQ,SAAS,GAAG;AACvC,gBAAY,UAAU,IAAI,QAAQ,IAAI,eAAe;AAAA,EACzD;AAGA,MAAI,IAAI,gBAAgB;AACpB,gBAAY,SAAS;AAAA,MACjB,IAAI,OAAO,IAAI,eAAe,EAAE;AAAA,MAChC,MAAM,IAAI,eAAe;AAAA,MACzB,QAAQ,IAAI,eAAe,SAAS,WAAW;AAAA,IAAA;AAAA,EAEvD;AAEA,SAAO;AACX;AAKO,SAAS,sBAAsB,KAA8C;AAChF,SAAO,IAAI,IAAI,oBAAoB;AACvC;"}
@@ -0,0 +1,7 @@
1
+ import { createHttpClient } from "../http.js";
2
+ import { FANSUNITED_FOOTBALL_DOMAIN } from "../constants.js";
3
+ const footballHttp = createHttpClient(FANSUNITED_FOOTBALL_DOMAIN);
4
+ export {
5
+ footballHttp
6
+ };
7
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sources":["../../../../src/lib/api/fansunited/football/http.ts"],"sourcesContent":["/**\n * Football HTTP client for Fans United API\n */\n\nimport { createHttpClient } from \"../http\";\nimport { FANSUNITED_FOOTBALL_DOMAIN } from \"../constants\";\n\n/**\n * HTTP client configured for the Fans United Football API\n */\nexport const footballHttp = createHttpClient(FANSUNITED_FOOTBALL_DOMAIN);\n\n"],"names":[],"mappings":";;AAUO,MAAM,eAAe,iBAAiB,0BAA0B;"}
@@ -0,0 +1,132 @@
1
+ import { getConfig } from "../../../../config/index.js";
2
+ import { footballHttp } from "../http.js";
3
+ import { transformMatch, transformMatches } from "./transformer.js";
4
+ async function getFansUnitedFootballMatch(matchId, options, config) {
5
+ const finalConfig = config || getConfig();
6
+ const params = {};
7
+ if (options?.lang) {
8
+ params.lang = options.lang;
9
+ }
10
+ const raw = await footballHttp.get({
11
+ path: `/v1/matches/${matchId}`,
12
+ params,
13
+ next: options?.next,
14
+ config: finalConfig
15
+ });
16
+ return transformMatch(raw);
17
+ }
18
+ async function getFansUnitedFootballMatches(options, config) {
19
+ const finalConfig = config || getConfig();
20
+ const params = {};
21
+ if (options?.lang) {
22
+ params.lang = options.lang;
23
+ }
24
+ if (options?.competitions) {
25
+ params.competitions = options.competitions;
26
+ }
27
+ if (options?.countries) {
28
+ params.countries = options.countries;
29
+ }
30
+ if (options?.fromDate) {
31
+ params.from_date = options.fromDate;
32
+ }
33
+ if (options?.toDate) {
34
+ params.to_date = options.toDate;
35
+ }
36
+ if (options?.matches) {
37
+ params.matches = options.matches;
38
+ }
39
+ if (options?.teams) {
40
+ params.teams = options.teams;
41
+ }
42
+ if (options?.status) {
43
+ params.status = options.status;
44
+ }
45
+ if (options?.limit !== void 0) {
46
+ params.limit = String(options.limit);
47
+ }
48
+ if (options?.page !== void 0) {
49
+ params.page = String(options.page);
50
+ }
51
+ if (options?.sortField) {
52
+ params.sort_field = options.sortField;
53
+ }
54
+ if (options?.sortOrder) {
55
+ params.sort_order = options.sortOrder;
56
+ }
57
+ if (options?.showDeleted !== void 0) {
58
+ params.show_deleted = options.showDeleted ? "true" : "false";
59
+ }
60
+ const raw = await footballHttp.get({
61
+ path: "/v1/matches",
62
+ params,
63
+ next: options?.next,
64
+ config: finalConfig
65
+ });
66
+ return transformMatches(raw);
67
+ }
68
+ async function getFansUnitedFootballTeamNextMatch(teamId, options, config) {
69
+ const finalConfig = config || getConfig();
70
+ const params = {};
71
+ if (options?.lang) {
72
+ params.lang = options.lang;
73
+ }
74
+ const raw = await footballHttp.get({
75
+ path: `/v1/teams/${teamId}/next-match`,
76
+ params,
77
+ next: options?.next,
78
+ config: finalConfig
79
+ });
80
+ return transformMatch(raw);
81
+ }
82
+ async function getFansUnitedFootballTeamPreviousMatch(teamId, options, config) {
83
+ const finalConfig = config || getConfig();
84
+ const params = {};
85
+ if (options?.lang) {
86
+ params.lang = options.lang;
87
+ }
88
+ const raw = await footballHttp.get({
89
+ path: `/v1/teams/${teamId}/previous-match`,
90
+ params,
91
+ next: options?.next,
92
+ config: finalConfig
93
+ });
94
+ return transformMatch(raw);
95
+ }
96
+ async function getFansUnitedFootballPlayerNextMatch(playerId, options, config) {
97
+ const finalConfig = config || getConfig();
98
+ const params = {};
99
+ if (options?.lang) {
100
+ params.lang = options.lang;
101
+ }
102
+ const raw = await footballHttp.get({
103
+ path: `/v1/players/${playerId}/next-match`,
104
+ params,
105
+ next: options?.next,
106
+ config: finalConfig
107
+ });
108
+ return transformMatch(raw);
109
+ }
110
+ async function getFansUnitedFootballPlayerPreviousMatch(playerId, options, config) {
111
+ const finalConfig = config || getConfig();
112
+ const params = {};
113
+ if (options?.lang) {
114
+ params.lang = options.lang;
115
+ }
116
+ const raw = await footballHttp.get({
117
+ path: `/v1/players/${playerId}/previous-match`,
118
+ params,
119
+ next: options?.next,
120
+ config: finalConfig
121
+ });
122
+ return transformMatch(raw);
123
+ }
124
+ export {
125
+ getFansUnitedFootballMatch,
126
+ getFansUnitedFootballMatches,
127
+ getFansUnitedFootballPlayerNextMatch,
128
+ getFansUnitedFootballPlayerPreviousMatch,
129
+ getFansUnitedFootballTeamNextMatch,
130
+ getFansUnitedFootballTeamPreviousMatch
131
+ };
132
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/lib/api/fansunited/football/matches/index.ts"],"sourcesContent":["/**\n * Football match endpoints for Fans United Football API\n */\n\nimport type { FUSportsMatch } from \"../../../../types/canonical\";\nimport { getConfig, type DataLayerConfig } from \"../../../../config\";\nimport { footballHttp } from \"../http\";\nimport type { GetFootballMatchOptions, GetFootballMatchesOptions, RawMatchResponse, RawMatchesResponse } from \"./types\";\nimport { transformMatch, transformMatches } from \"./transformer\";\n\n// Re-export types\nexport type { GetFootballMatchOptions, GetFootballMatchesOptions } from \"./types\";\n\n/**\n * Get a football match by ID from Fans United Football API\n *\n * @param matchId - The match ID\n * @param options - Query options\n * @param config - Optional data layer config (uses singleton if not provided)\n * @returns Match in canonical format\n *\n * @example\n * ```typescript\n * import { getFansUnitedFootballMatch } from 'fansunited-data-layer';\n *\n * // Get match by ID\n * const match = await getFansUnitedFootballMatch('12345', {\n * lang: 'EN'\n * });\n *\n * console.log(match.competitorOne.name); // \"Manchester United\"\n * console.log(match.competitorTwo.name); // \"Liverpool\"\n * console.log(match.score?.competitorOne); // \"2\"\n * ```\n */\nexport async function getFansUnitedFootballMatch(\n matchId: string,\n options?: GetFootballMatchOptions,\n config?: DataLayerConfig\n): Promise<FUSportsMatch> {\n const finalConfig = config || getConfig();\n\n const params: Record<string, string | undefined> = {};\n\n // Add language parameter\n if (options?.lang) {\n params.lang = options.lang;\n }\n\n const raw = await footballHttp.get<RawMatchResponse>({\n path: `/v1/matches/${matchId}`,\n params,\n next: options?.next,\n config: finalConfig,\n });\n\n return transformMatch(raw);\n}\n/**\n * Get multiple football matches from Fans United Football API\n *\n * @param options - Query options for filtering, sorting, and pagination\n * @param config - Optional data layer config (uses singleton if not provided)\n * @returns Array of matches in canonical format\n *\n * @example\n * ```typescript\n * import { getFansUnitedFootballMatches } from 'fansunited-data-layer';\n *\n * // Get upcoming matches for specific teams\n * const matches = await getFansUnitedFootballMatches({\n * teams: 'fb:t:8102,fb:t:8104',\n * status: 'upcoming',\n * limit: 10,\n * lang: 'EN'\n * });\n *\n * // Get matches for a specific competition\n * const competitionMatches = await getFansUnitedFootballMatches({\n * competitions: 'fb:c:3',\n * fromDate: '2026-01-01T00:00:00Z',\n * toDate: '2026-01-31T23:59:59Z',\n * sortField: 'kickoff_at',\n * sortOrder: 'asc'\n * });\n * ```\n */\nexport async function getFansUnitedFootballMatches(\n options?: GetFootballMatchesOptions,\n config?: DataLayerConfig\n): Promise<FUSportsMatch[]> {\n const finalConfig = config || getConfig();\n\n const params: Record<string, string | undefined> = {};\n\n // Add language parameter\n if (options?.lang) {\n params.lang = options.lang;\n }\n\n // Add filter parameters\n if (options?.competitions) {\n params.competitions = options.competitions;\n }\n if (options?.countries) {\n params.countries = options.countries;\n }\n if (options?.fromDate) {\n params.from_date = options.fromDate;\n }\n if (options?.toDate) {\n params.to_date = options.toDate;\n }\n if (options?.matches) {\n params.matches = options.matches;\n }\n if (options?.teams) {\n params.teams = options.teams;\n }\n if (options?.status) {\n params.status = options.status;\n }\n\n // Add pagination parameters\n if (options?.limit !== undefined) {\n params.limit = String(options.limit);\n }\n if (options?.page !== undefined) {\n params.page = String(options.page);\n }\n\n // Add sorting parameters\n if (options?.sortField) {\n params.sort_field = options.sortField;\n }\n if (options?.sortOrder) {\n params.sort_order = options.sortOrder;\n }\n\n // Add show_deleted parameter\n if (options?.showDeleted !== undefined) {\n params.show_deleted = options.showDeleted ? \"true\" : \"false\";\n }\n\n const raw = await footballHttp.get<RawMatchesResponse>({\n path: \"/v1/matches\",\n params,\n next: options?.next,\n config: finalConfig,\n });\n\n return transformMatches(raw);\n}\n\n/**\n * Get the next match for a team\n *\n * @param teamId - The team ID\n * @param options - Query options\n * @param config - Optional data layer config (uses singleton if not provided)\n * @returns Next match in canonical format\n */\nexport async function getFansUnitedFootballTeamNextMatch(\n teamId: string,\n options?: GetFootballMatchOptions,\n config?: DataLayerConfig\n): Promise<FUSportsMatch> {\n const finalConfig = config || getConfig();\n\n const params: Record<string, string | undefined> = {};\n\n if (options?.lang) {\n params.lang = options.lang;\n }\n\n const raw = await footballHttp.get<RawMatchResponse>({\n path: `/v1/teams/${teamId}/next-match`,\n params,\n next: options?.next,\n config: finalConfig,\n });\n\n return transformMatch(raw);\n}\n\n/**\n * Get the previous match for a team\n *\n * @param teamId - The team ID\n * @param options - Query options\n * @param config - Optional data layer config (uses singleton if not provided)\n * @returns Previous match in canonical format\n */\nexport async function getFansUnitedFootballTeamPreviousMatch(\n teamId: string,\n options?: GetFootballMatchOptions,\n config?: DataLayerConfig\n): Promise<FUSportsMatch> {\n const finalConfig = config || getConfig();\n\n const params: Record<string, string | undefined> = {};\n\n if (options?.lang) {\n params.lang = options.lang;\n }\n\n const raw = await footballHttp.get<RawMatchResponse>({\n path: `/v1/teams/${teamId}/previous-match`,\n params,\n next: options?.next,\n config: finalConfig,\n });\n\n return transformMatch(raw);\n}\n\n/**\n * Get the next match for a player\n *\n * @param playerId - The player ID\n * @param options - Query options\n * @param config - Optional data layer config (uses singleton if not provided)\n * @returns Next match in canonical format\n */\nexport async function getFansUnitedFootballPlayerNextMatch(\n playerId: string,\n options?: GetFootballMatchOptions,\n config?: DataLayerConfig\n): Promise<FUSportsMatch> {\n const finalConfig = config || getConfig();\n\n const params: Record<string, string | undefined> = {};\n\n if (options?.lang) {\n params.lang = options.lang;\n }\n\n const raw = await footballHttp.get<RawMatchResponse>({\n path: `/v1/players/${playerId}/next-match`,\n params,\n next: options?.next,\n config: finalConfig,\n });\n\n return transformMatch(raw);\n}\n\n/**\n * Get the previous match for a player\n *\n * @param playerId - The player ID\n * @param options - Query options\n * @param config - Optional data layer config (uses singleton if not provided)\n * @returns Previous match in canonical format\n */\nexport async function getFansUnitedFootballPlayerPreviousMatch(\n playerId: string,\n options?: GetFootballMatchOptions,\n config?: DataLayerConfig\n): Promise<FUSportsMatch> {\n const finalConfig = config || getConfig();\n\n const params: Record<string, string | undefined> = {};\n\n if (options?.lang) {\n params.lang = options.lang;\n }\n\n const raw = await footballHttp.get<RawMatchResponse>({\n path: `/v1/players/${playerId}/previous-match`,\n params,\n next: options?.next,\n config: finalConfig,\n });\n\n return transformMatch(raw);\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,148 @@
1
+ function transformCountry(raw) {
2
+ return {
3
+ id: raw.id,
4
+ name: raw.name,
5
+ code: raw.country_code,
6
+ assets: raw.assets?.flag ? {
7
+ flag: raw.assets.flag
8
+ } : void 0,
9
+ providerRef: [
10
+ {
11
+ provider: "fansunited",
12
+ id: raw.id
13
+ }
14
+ ]
15
+ };
16
+ }
17
+ function transformCompetition(raw) {
18
+ return {
19
+ id: raw.id,
20
+ name: raw.name,
21
+ type: raw.type?.toUpperCase() || "LEAGUE",
22
+ gender: raw.gender?.toUpperCase(),
23
+ country: raw.country ? transformCountry(raw.country) : void 0,
24
+ assets: raw.assets?.logo ? {
25
+ logo: raw.assets.logo
26
+ } : void 0,
27
+ providerRef: [
28
+ {
29
+ provider: "fansunited",
30
+ id: raw.id
31
+ }
32
+ ]
33
+ };
34
+ }
35
+ function deriveStatus(raw) {
36
+ if (raw.status) {
37
+ const statusMap = {
38
+ notstarted: { code: "not_started", type: "NOT_STARTED", name: "Not Started" },
39
+ live: { code: "live", type: "LIVE", name: "Live" },
40
+ finished: { code: "finished", type: "FINISHED", name: "Finished" },
41
+ postponed: { code: "postponed", type: "POSTPONED", name: "Postponed" },
42
+ cancelled: { code: "cancelled", type: "CANCELLED", name: "Cancelled" },
43
+ abandoned: { code: "abandoned", type: "ABANDONED", name: "Abandoned" }
44
+ };
45
+ const mapped = statusMap[raw.status.type];
46
+ if (mapped) {
47
+ return mapped;
48
+ }
49
+ }
50
+ let code = "not_started";
51
+ let type = "NOT_STARTED";
52
+ let name = "Not Started";
53
+ if (raw.finished_at) {
54
+ code = "finished";
55
+ type = "FINISHED";
56
+ name = "Finished";
57
+ } else if (raw.started_at) {
58
+ code = "live";
59
+ type = "LIVE";
60
+ name = "Live";
61
+ }
62
+ return {
63
+ code,
64
+ name,
65
+ type
66
+ };
67
+ }
68
+ function transformTiming(raw) {
69
+ return {
70
+ kickoffTime: new Date(raw.kickoff_at),
71
+ currentMinute: raw.minute ?? void 0,
72
+ currentPeriod: void 0
73
+ };
74
+ }
75
+ function transformTeam(raw) {
76
+ return {
77
+ id: raw.id,
78
+ name: raw.name,
79
+ shortName: raw.short_name ?? void 0,
80
+ fullName: raw.full_name ?? void 0,
81
+ threeLetterCode: raw.code,
82
+ type: raw.national ? "national" : "club",
83
+ gender: raw.gender?.toUpperCase(),
84
+ country: raw.country ? transformCountry(raw.country) : void 0,
85
+ assets: raw.assets?.logo ? {
86
+ logo: raw.assets.logo
87
+ } : void 0,
88
+ providerRef: [
89
+ {
90
+ provider: "fansunited",
91
+ id: raw.id
92
+ }
93
+ ]
94
+ };
95
+ }
96
+ function transformScore(raw) {
97
+ if (!raw) return void 0;
98
+ const formatScore = (score) => score ? {
99
+ competitorOne: score.home_goals !== null ? String(score.home_goals) : "0",
100
+ competitorTwo: score.away_goals !== null ? String(score.away_goals) : "0"
101
+ } : void 0;
102
+ const total = formatScore(raw.ft_score);
103
+ if (!total) return void 0;
104
+ return {
105
+ competitorOne: total.competitorOne,
106
+ competitorTwo: total.competitorTwo,
107
+ breakdown: {
108
+ total,
109
+ halfTime: formatScore(raw.ht_score),
110
+ regularTime: formatScore(raw.ft_score),
111
+ extraTime: formatScore(raw.aet_score),
112
+ penaltyShootout: formatScore(raw.pen_score)
113
+ }
114
+ };
115
+ }
116
+ function transformMatchData(raw) {
117
+ return {
118
+ id: raw.id,
119
+ sport: raw.sport ?? "football",
120
+ status: deriveStatus(raw),
121
+ timing: transformTiming(raw),
122
+ competitorOne: transformTeam(raw.home_team),
123
+ competitorTwo: transformTeam(raw.away_team),
124
+ score: transformScore(raw.scores),
125
+ competition: raw.context?.competition ? transformCompetition(raw.context.competition) : void 0,
126
+ lineupStatus: raw.lineups_confirmed ? "CONFIRMED" : "NOT_AVAILABLE",
127
+ updatedAt: raw.updated_at ? new Date(raw.updated_at) : void 0,
128
+ isUndecided: raw.undecided ?? void 0,
129
+ providerRef: [
130
+ {
131
+ provider: "fansunited",
132
+ id: raw.id
133
+ }
134
+ ]
135
+ };
136
+ }
137
+ function transformMatch(raw) {
138
+ return transformMatchData(raw.data);
139
+ }
140
+ function transformMatches(raw) {
141
+ return raw.data.map(transformMatchData);
142
+ }
143
+ export {
144
+ transformMatch,
145
+ transformMatchData,
146
+ transformMatches
147
+ };
148
+ //# sourceMappingURL=transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformer.js","sources":["../../../../../src/lib/api/fansunited/football/matches/transformer.ts"],"sourcesContent":["/**\n * Transform raw match data to canonical FUSports types\n */\n\nimport type {\n FUSportsMatch,\n FUSportsMatchStatus,\n FUSportsMatchTiming,\n FUSportsTeamCompetitor,\n FUSportsMatchScore,\n FUSportsPlayerMatchStats,\n FUSportsMatchStatistics,\n FUSportsStatisticEntry,\n FUSportsMatchLineups,\n FUSportsCompetitorLineup,\n FUSportsLineupMember,\n} from \"../../../../types/canonical\";\nimport type {\n RawMatchResponse,\n RawMatchesResponse,\n RawMatch,\n RawTeam,\n RawCountry,\n RawScores,\n RawScore,\n RawPlayerStats,\n RawMatchStats,\n RawTeamStats,\n RawLineups,\n RawTeamLineup,\n RawLineupPlayer,\n RawCompetition,\n} from \"./types\";\n\n/**\n * Transform raw country to canonical format\n */\nfunction transformCountry(raw: RawCountry) {\n return {\n id: raw.id,\n name: raw.name,\n code: raw.country_code,\n assets: raw.assets?.flag\n ? {\n flag: raw.assets.flag,\n }\n : undefined,\n providerRef: [\n {\n provider: \"fansunited\" as const,\n id: raw.id,\n },\n ],\n };\n}\n\n/**\n * Transform raw competition to canonical format\n */\nfunction transformCompetition(raw: RawCompetition) {\n return {\n id: raw.id,\n name: raw.name,\n type: (raw.type?.toUpperCase() as \"LEAGUE\" | \"CUP\" | \"TOURNAMENT\" | undefined) || \"LEAGUE\",\n gender: raw.gender?.toUpperCase() as \"MALE\" | \"FEMALE\" | undefined,\n country: raw.country ? transformCountry(raw.country) : undefined,\n assets: raw.assets?.logo\n ? {\n logo: raw.assets.logo,\n }\n : undefined,\n providerRef: [\n {\n provider: \"fansunited\" as const,\n id: raw.id,\n },\n ],\n };\n}\n\n/**\n * Derive match status from available fields\n */\nfunction deriveStatus(raw: RawMatch): FUSportsMatchStatus {\n // Use status field if available (from /v1/matches endpoint)\n if (raw.status) {\n const statusMap: Record<\n string,\n { code: FUSportsMatchStatus[\"code\"]; type: FUSportsMatchStatus[\"type\"]; name: string }\n > = {\n notstarted: { code: \"not_started\", type: \"NOT_STARTED\", name: \"Not Started\" },\n live: { code: \"live\", type: \"LIVE\", name: \"Live\" },\n finished: { code: \"finished\", type: \"FINISHED\", name: \"Finished\" },\n postponed: { code: \"postponed\", type: \"POSTPONED\", name: \"Postponed\" },\n cancelled: { code: \"cancelled\", type: \"CANCELLED\", name: \"Cancelled\" },\n abandoned: { code: \"abandoned\", type: \"ABANDONED\", name: \"Abandoned\" },\n };\n\n const mapped = statusMap[raw.status.type];\n if (mapped) {\n return mapped;\n }\n }\n\n // Fallback: Determine status based on timestamps\n let code: FUSportsMatchStatus[\"code\"] = \"not_started\";\n let type: FUSportsMatchStatus[\"type\"] = \"NOT_STARTED\";\n let name = \"Not Started\";\n\n if (raw.finished_at) {\n code = \"finished\";\n type = \"FINISHED\";\n name = \"Finished\";\n } else if (raw.started_at) {\n code = \"live\";\n type = \"LIVE\";\n name = \"Live\";\n }\n\n return {\n code,\n name,\n type,\n };\n}\n\n/**\n * Transform raw timing to canonical format\n */\nfunction transformTiming(raw: RawMatch): FUSportsMatchTiming {\n return {\n kickoffTime: new Date(raw.kickoff_at),\n currentMinute: raw.minute ?? undefined,\n currentPeriod: undefined,\n };\n}\n\n/**\n * Transform raw team to canonical competitor\n */\nfunction transformTeam(raw: RawTeam): FUSportsTeamCompetitor {\n return {\n id: raw.id,\n name: raw.name,\n shortName: raw.short_name ?? undefined,\n fullName: raw.full_name ?? undefined,\n threeLetterCode: raw.code,\n type: raw.national ? \"national\" : \"club\",\n gender: raw.gender?.toUpperCase() as \"MALE\" | \"FEMALE\" | undefined,\n country: raw.country ? transformCountry(raw.country) : undefined,\n assets: raw.assets?.logo\n ? {\n logo: raw.assets.logo,\n }\n : undefined,\n providerRef: [\n {\n provider: \"fansunited\",\n id: raw.id,\n },\n ],\n };\n}\n\n/**\n * Transform raw score to canonical format\n */\nfunction transformScore(raw?: RawScores): FUSportsMatchScore | undefined {\n if (!raw) return undefined;\n\n const formatScore = (score: RawScore | undefined) =>\n score\n ? {\n competitorOne: score.home_goals !== null ? String(score.home_goals) : \"0\",\n competitorTwo: score.away_goals !== null ? String(score.away_goals) : \"0\",\n }\n : undefined;\n\n const total = formatScore(raw.ft_score);\n if (!total) return undefined;\n\n return {\n competitorOne: total.competitorOne,\n competitorTwo: total.competitorTwo,\n breakdown: {\n total,\n halfTime: formatScore(raw.ht_score),\n regularTime: formatScore(raw.ft_score),\n extraTime: formatScore(raw.aet_score),\n penaltyShootout: formatScore(raw.pen_score),\n },\n };\n}\n\n/**\n * Transform raw player stats to canonical format\n */\nexport function transformPlayerStats(raw: RawPlayerStats): FUSportsPlayerMatchStats {\n return {\n // Scoring\n goals: raw.goals ?? undefined,\n penaltyGoals: raw.penalty_goals ?? undefined,\n ownGoals: raw.own_goals ?? undefined,\n assists: raw.assists ?? undefined,\n\n // Shooting\n shots: raw.shots ?? undefined,\n shotsOn: raw.shots_on ?? undefined,\n shotsBlocked: raw.shots_blocked ?? undefined,\n\n // Passing\n passes: raw.passes ?? undefined,\n passesAccuracy: raw.passes_accuracy ?? undefined,\n keyPasses: raw.key_passes ?? undefined,\n crosses: raw.crosses ?? undefined,\n\n // Defensive\n tackles: raw.tackles ?? undefined,\n tacklesBlocks: raw.tackles_blocks ?? undefined,\n tacklesInterceptions: raw.tackles_interceptions ?? undefined,\n interceptions: raw.interceptions ?? undefined,\n cleanSheets: raw.clean_sheets ?? undefined,\n\n // Discipline\n yellowCards: raw.yellow_cards ?? undefined,\n redCards: raw.red_cards ?? undefined,\n foulsCommitted: raw.fouls_committed ?? undefined,\n foulsWon: raw.fouls_won ?? undefined,\n\n // Goalkeeper\n saves: raw.saves ?? undefined,\n concededGoals: raw.conceded_goals ?? undefined,\n caughtBall: raw.caught_ball ?? undefined,\n penaltySaved: raw.penalty_saved ?? undefined,\n penaltyReceived: raw.penalty_received ?? undefined,\n\n // Dribbling\n duels: raw.duels ?? undefined,\n duelsWon: raw.duels_won ?? undefined,\n dribblesAttempts: raw.dribbles_attempts ?? undefined,\n dribblesSuccess: raw.dribbles_success ?? undefined,\n dribblesPast: raw.dribbles_past ?? undefined,\n\n // Penalties\n penaltyCommitted: raw.penalty_committed ?? undefined,\n penaltyWon: raw.penalty_won ?? undefined,\n penaltyMissed: raw.penalty_missed ?? undefined,\n\n // Other\n minutesPlayed: raw.minutes_played ?? undefined,\n offsides: raw.offsides ?? undefined,\n };\n}\n\n/**\n * Helper to create statistic entries for a given stat with period breakdowns\n */\nfunction createStatEntries(\n key: string,\n label: string,\n fullTime: RawTeamStats | undefined,\n firstHalf: RawTeamStats | undefined,\n secondHalf: RawTeamStats | undefined,\n extraTime: RawTeamStats | undefined,\n unit?: string\n): FUSportsStatisticEntry[] {\n const entries: FUSportsStatisticEntry[] = [];\n\n // Full time (aggregate)\n if (fullTime) {\n entries.push({\n key,\n label,\n value: String(fullTime.home_team ?? 0),\n unit,\n period: \"FULL_TIME\",\n });\n }\n\n // First half\n if (firstHalf) {\n entries.push({\n key: `${key}_1h`,\n label: `${label} (1st Half)`,\n value: String(firstHalf.home_team ?? 0),\n unit,\n period: \"FIRST_HALF\",\n });\n }\n\n // Second half\n if (secondHalf) {\n entries.push({\n key: `${key}_2h`,\n label: `${label} (2nd Half)`,\n value: String(secondHalf.home_team ?? 0),\n unit,\n period: \"SECOND_HALF\",\n });\n }\n\n // Extra time\n if (extraTime && extraTime.home_team !== null) {\n entries.push({\n key: `${key}_et`,\n label: `${label} (Extra Time)`,\n value: String(extraTime.home_team),\n unit,\n period: \"EXTRA_TIME\",\n });\n }\n\n return entries;\n}\n\n/**\n * Transform raw match stats to canonical format with period breakdowns\n */\nexport function transformMatchStatistics(\n raw: RawMatchStats,\n homeTeamId: string,\n awayTeamId: string\n): FUSportsMatchStatistics {\n const homeStats: FUSportsStatisticEntry[] = [];\n const awayStats: FUSportsStatisticEntry[] = [];\n\n // Helper to add stats for both teams\n const addStat = (\n key: string,\n label: string,\n fullTime: RawTeamStats | undefined,\n firstHalf: RawTeamStats | undefined,\n secondHalf: RawTeamStats | undefined,\n extraTime: RawTeamStats | undefined,\n unit?: string\n ) => {\n const entries = createStatEntries(key, label, fullTime, firstHalf, secondHalf, extraTime, unit);\n entries.forEach((entry) => {\n homeStats.push(entry);\n // Create corresponding away stat\n const awayValue =\n entry.period === \"FULL_TIME\"\n ? String(fullTime?.away_team ?? 0)\n : entry.period === \"FIRST_HALF\"\n ? String(firstHalf?.away_team ?? 0)\n : entry.period === \"SECOND_HALF\"\n ? String(secondHalf?.away_team ?? 0)\n : String(extraTime?.away_team ?? 0);\n awayStats.push({ ...entry, value: awayValue });\n });\n };\n\n // Add all statistics with period breakdowns\n addStat(\"possession\", \"Possession\", raw.possession, raw.possession_1h, raw.possession_2h, raw.possession_et, \"%\");\n addStat(\"shots_on\", \"Shots on Target\", raw.shots_on, raw.shots_on_1h, raw.shots_on_2h, raw.shots_on_et);\n addStat(\"shots_off\", \"Shots off Target\", raw.shots_off, raw.shots_off_1h, raw.shots_off_2h, raw.shots_off_et);\n addStat(\"corners\", \"Corners\", raw.corners, raw.corners_1h, raw.corners_2h, raw.corners_et);\n addStat(\"offside\", \"Offsides\", raw.offside, raw.offside_1h, raw.offside_2h, raw.offside_et);\n addStat(\n \"fouls_committed\",\n \"Fouls\",\n raw.fouls_committed,\n raw.fouls_committed_1h,\n raw.fouls_committed_2h,\n raw.fouls_committed_et\n );\n addStat(\n \"yellow_cards\",\n \"Yellow Cards\",\n raw.yellow_cards,\n raw.yellow_cards_1h,\n raw.yellow_cards_2h,\n raw.yellow_cards_et\n );\n addStat(\"red_cards\", \"Red Cards\", raw.red_cards, raw.red_cards_1h, raw.red_cards_2h, raw.red_cards_et);\n\n // Advanced stats (FansUnited-specific)\n addStat(\n \"counter_attacks\",\n \"Counter Attacks\",\n raw.counter_attacks,\n raw.counter_attacks_1h,\n raw.counter_attacks_2h,\n raw.counter_attacks_et\n );\n addStat(\"treatments\", \"Treatments\", raw.treatments, raw.treatments_1h, raw.treatments_2h, raw.treatments_et);\n addStat(\"throw_in\", \"Throw-ins\", raw.throw_in, raw.throw_in_1h, raw.throw_in_2h, raw.throw_in_et);\n addStat(\"goal_kicks\", \"Goal Kicks\", raw.goal_kicks, raw.goal_kicks_1h, raw.goal_kicks_2h, raw.goal_kicks_et);\n\n return {\n competitorOne: {\n competitorId: homeTeamId,\n statistics: homeStats,\n },\n competitorTwo: {\n competitorId: awayTeamId,\n statistics: awayStats,\n },\n };\n}\n\n/**\n * Transform raw lineup player to canonical format\n */\nfunction transformLineupPlayer(raw: RawLineupPlayer): FUSportsLineupMember {\n return {\n id: raw.id,\n name: raw.name,\n position: raw.position,\n shirtNumber: raw.shirt_number,\n assets: raw.assets?.headshot\n ? {\n photo: raw.assets.headshot,\n }\n : undefined,\n providerRef: [\n {\n provider: \"fansunited\",\n id: raw.id,\n },\n ],\n };\n}\n\n/**\n * Transform raw team lineup to canonical format\n */\nfunction transformCompetitorLineup(raw: RawTeamLineup, competitorId: string): FUSportsCompetitorLineup {\n const starters: FUSportsLineupMember[] = [];\n const substitutes: FUSportsLineupMember[] = [];\n\n for (const player of raw.players) {\n const member = transformLineupPlayer(player);\n if (player.type === \"start\") {\n starters.push(member);\n } else if (player.type === \"sub\") {\n substitutes.push(member);\n }\n }\n\n return {\n competitorId,\n starters,\n substitutes,\n };\n}\n\n/**\n * Transform raw lineups to canonical format\n */\nexport function transformLineups(\n raw: RawLineups,\n matchId: string,\n homeTeamId: string,\n awayTeamId: string\n): FUSportsMatchLineups {\n return {\n matchId,\n confirmed: true, // FansUnited lineups are always confirmed when present\n competitorOne: transformCompetitorLineup(raw.home_team, homeTeamId),\n competitorTwo: transformCompetitorLineup(raw.away_team, awayTeamId),\n };\n}\n\n/**\n * Transform unwrapped match data to canonical FUSportsMatch\n * Exported for reuse in SDK-based functions\n */\nexport function transformMatchData(raw: RawMatch): FUSportsMatch {\n return {\n id: raw.id,\n sport: raw.sport ?? \"football\",\n status: deriveStatus(raw),\n timing: transformTiming(raw),\n competitorOne: transformTeam(raw.home_team),\n competitorTwo: transformTeam(raw.away_team),\n score: transformScore(raw.scores),\n competition: raw.context?.competition ? transformCompetition(raw.context.competition) : undefined,\n lineupStatus: raw.lineups_confirmed ? \"CONFIRMED\" : \"NOT_AVAILABLE\",\n updatedAt: raw.updated_at ? new Date(raw.updated_at) : undefined,\n isUndecided: raw.undecided ?? undefined,\n providerRef: [\n {\n provider: \"fansunited\",\n id: raw.id,\n },\n ],\n };\n}\n\n/**\n * Transform raw match response to canonical FUSportsMatch\n * The API wraps the match data in a \"data\" property\n */\nexport function transformMatch(raw: RawMatchResponse): FUSportsMatch {\n return transformMatchData(raw.data);\n}\n\n/**\n * Transform raw matches response to array of canonical FUSportsMatch\n * The API wraps the matches array in a \"data\" property with pagination metadata\n */\nexport function transformMatches(raw: RawMatchesResponse): FUSportsMatch[] {\n return raw.data.map(transformMatchData);\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { getConfig } from "../../../../config/index.js";
2
+ import { footballHttp } from "../http.js";
3
+ import { transformPlayer, transformPlayers } from "./transformer.js";
4
+ async function getFansUnitedFootballPlayer(playerId, options, config) {
5
+ const finalConfig = config || getConfig();
6
+ const params = {};
7
+ if (options?.lang) {
8
+ params.lang = options.lang;
9
+ }
10
+ const raw = await footballHttp.get({
11
+ path: `/v1/players/${playerId}`,
12
+ params,
13
+ next: options?.next,
14
+ config: finalConfig
15
+ });
16
+ return transformPlayer(raw);
17
+ }
18
+ async function getFansUnitedFootballPlayers(options, config) {
19
+ const finalConfig = config || getConfig();
20
+ const params = {};
21
+ if (options?.lang) {
22
+ params.lang = options.lang;
23
+ }
24
+ if (options?.playerIds) {
25
+ params.player_ids = options.playerIds;
26
+ }
27
+ if (options?.countryId) {
28
+ params.country_id = options.countryId;
29
+ }
30
+ if (options?.name) {
31
+ params.name = options.name;
32
+ }
33
+ if (options?.scope) {
34
+ params.scope = options.scope;
35
+ }
36
+ if (options?.limit !== void 0) {
37
+ params.limit = String(options.limit);
38
+ }
39
+ if (options?.page !== void 0) {
40
+ params.page = String(options.page);
41
+ }
42
+ if (options?.sortField) {
43
+ params.sort_field = options.sortField;
44
+ }
45
+ if (options?.sortOrder) {
46
+ params.sort_order = options.sortOrder;
47
+ }
48
+ const raw = await footballHttp.get({
49
+ path: "/v1/players",
50
+ params,
51
+ next: options?.next,
52
+ config: finalConfig
53
+ });
54
+ return transformPlayers(raw);
55
+ }
56
+ export {
57
+ getFansUnitedFootballPlayer,
58
+ getFansUnitedFootballPlayers
59
+ };
60
+ //# sourceMappingURL=index.js.map