fansunited-data-layer 0.14.5 → 0.15.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 (39) hide show
  1. package/api/sportal365-sports/basketball/http.d.ts +1 -4
  2. package/api/sportal365-sports/basketball/http.d.ts.map +1 -1
  3. package/api/sportal365-sports/basketball/http.js +2 -3
  4. package/api/sportal365-sports/basketball/http.js.map +1 -1
  5. package/api/sportal365-sports/constants.d.ts +4 -11
  6. package/api/sportal365-sports/constants.d.ts.map +1 -1
  7. package/api/sportal365-sports/constants.js +1 -11
  8. package/api/sportal365-sports/constants.js.map +1 -1
  9. package/api/sportal365-sports/football/http.d.ts +7 -4
  10. package/api/sportal365-sports/football/http.d.ts.map +1 -1
  11. package/api/sportal365-sports/football/http.js +5 -3
  12. package/api/sportal365-sports/football/http.js.map +1 -1
  13. package/api/sportal365-sports/football/statistics/index.js +2 -2
  14. package/api/sportal365-sports/football/statistics/index.js.map +1 -1
  15. package/api/sportal365-sports/http.d.ts +14 -7
  16. package/api/sportal365-sports/http.d.ts.map +1 -1
  17. package/api/sportal365-sports/http.js +37 -1
  18. package/api/sportal365-sports/http.js.map +1 -1
  19. package/api/sportal365-sports/search/http.d.ts +1 -4
  20. package/api/sportal365-sports/search/http.d.ts.map +1 -1
  21. package/api/sportal365-sports/search/http.js +2 -3
  22. package/api/sportal365-sports/search/http.js.map +1 -1
  23. package/api/sportal365-sports/standings/http.d.ts +1 -4
  24. package/api/sportal365-sports/standings/http.d.ts.map +1 -1
  25. package/api/sportal365-sports/standings/http.js +2 -3
  26. package/api/sportal365-sports/standings/http.js.map +1 -1
  27. package/api/sportal365-sports/statistics/http.d.ts +1 -4
  28. package/api/sportal365-sports/statistics/http.d.ts.map +1 -1
  29. package/api/sportal365-sports/statistics/http.js +2 -3
  30. package/api/sportal365-sports/statistics/http.js.map +1 -1
  31. package/api/sportal365-sports/tennis/http.d.ts +1 -4
  32. package/api/sportal365-sports/tennis/http.d.ts.map +1 -1
  33. package/api/sportal365-sports/tennis/http.js +2 -3
  34. package/api/sportal365-sports/tennis/http.js.map +1 -1
  35. package/fansunited-data-layer.js +2 -0
  36. package/fansunited-data-layer.js.map +1 -1
  37. package/index.d.ts +1 -0
  38. package/index.d.ts.map +1 -1
  39. package/package.json +1 -1
@@ -1,8 +1,5 @@
1
1
  /**
2
- * Basketball HTTP client for Sportal365 API
3
- */
4
- /**
5
- * HTTP client configured for the Sportal365 Basketball API
2
+ * Basketball HTTP client routed through the lsdapi proxy.
6
3
  */
7
4
  export declare const basketballHttp: import("../http").Sportal365HttpClient;
8
5
  //# sourceMappingURL=http.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/sportal365-sports/basketball/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,eAAO,MAAM,cAAc,wCAAiD,CAAC"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/sportal365-sports/basketball/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,cAAc,wCAAmC,CAAC"}
@@ -1,6 +1,5 @@
1
- import { createHttpClient } from "../http.js";
2
- import { SPORTAL365_BASKETBALL_DOMAIN } from "../constants.js";
3
- const basketballHttp = createHttpClient(SPORTAL365_BASKETBALL_DOMAIN);
1
+ import { createProxyClient } from "../http.js";
2
+ const basketballHttp = createProxyClient("/basketball");
4
3
  export {
5
4
  basketballHttp
6
5
  };
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sources":["../../../../src/lib/api/sportal365-sports/basketball/http.ts"],"sourcesContent":["/**\n * Basketball HTTP client for Sportal365 API\n */\n\nimport { createHttpClient } from '../http';\nimport { SPORTAL365_BASKETBALL_DOMAIN } from '../constants';\n\n/**\n * HTTP client configured for the Sportal365 Basketball API\n */\nexport const basketballHttp = createHttpClient(SPORTAL365_BASKETBALL_DOMAIN);\n\n"],"names":[],"mappings":";;AAUO,MAAM,iBAAiB,iBAAiB,4BAA4B;"}
1
+ {"version":3,"file":"http.js","sources":["../../../../src/lib/api/sportal365-sports/basketball/http.ts"],"sourcesContent":["/**\n * Basketball HTTP client routed through the lsdapi proxy.\n */\n\nimport { createProxyClient } from \"../http\";\n\nexport const basketballHttp = createProxyClient(\"/basketball\");\n"],"names":[],"mappings":";AAMO,MAAM,iBAAiB,kBAAkB,aAAa;"}
@@ -3,16 +3,9 @@
3
3
  *
4
4
  * Each Sportal365 API has its own domain based on the sport/functionality.
5
5
  */
6
- /** Football API domain */
6
+ /**
7
+ * Football API direct domain — used by `footballLegacyHttp` for endpoints the
8
+ * lsdapi proxy does not yet expose (currently: player recent statistics).
9
+ */
7
10
  export declare const SPORTAL365_FOOTBALL_DOMAIN = "https://football.api.sportal365.com";
8
- /** Basketball API domain */
9
- export declare const SPORTAL365_BASKETBALL_DOMAIN = "https://basketball.api.sportal365.com";
10
- /** Tennis API domain */
11
- export declare const SPORTAL365_TENNIS_DOMAIN = "https://tennis.api.sportal365.com";
12
- /** Statistics API domain */
13
- export declare const SPORTAL365_STATISTICS_DOMAIN = "https://sports-statistics.api.sportal365.com";
14
- /** Sports Search API domain */
15
- export declare const SPORTAL365_SPORTS_SEARCH_DOMAIN = "https://sports-search.api.sportal365.com";
16
- /** Standings API domain */
17
- export declare const SPORTAL365_STANDINGS_DOMAIN = "https://standing.api.sportal365.com";
18
11
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/lib/api/sportal365-sports/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,0BAA0B;AAC1B,eAAO,MAAM,0BAA0B,wCAAwC,CAAC;AAEhF,4BAA4B;AAC5B,eAAO,MAAM,4BAA4B,0CAA0C,CAAC;AAEpF,wBAAwB;AACxB,eAAO,MAAM,wBAAwB,sCAAsC,CAAC;AAE5E,4BAA4B;AAC5B,eAAO,MAAM,4BAA4B,iDAAiD,CAAC;AAE3F,+BAA+B;AAC/B,eAAO,MAAM,+BAA+B,6CAA6C,CAAC;AAE1F,2BAA2B;AAC3B,eAAO,MAAM,2BAA2B,wCAAwC,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/lib/api/sportal365-sports/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,eAAO,MAAM,0BAA0B,wCAAwC,CAAC"}
@@ -1,15 +1,5 @@
1
1
  const SPORTAL365_FOOTBALL_DOMAIN = "https://football.api.sportal365.com";
2
- const SPORTAL365_BASKETBALL_DOMAIN = "https://basketball.api.sportal365.com";
3
- const SPORTAL365_TENNIS_DOMAIN = "https://tennis.api.sportal365.com";
4
- const SPORTAL365_STATISTICS_DOMAIN = "https://sports-statistics.api.sportal365.com";
5
- const SPORTAL365_SPORTS_SEARCH_DOMAIN = "https://sports-search.api.sportal365.com";
6
- const SPORTAL365_STANDINGS_DOMAIN = "https://standing.api.sportal365.com";
7
2
  export {
8
- SPORTAL365_BASKETBALL_DOMAIN,
9
- SPORTAL365_FOOTBALL_DOMAIN,
10
- SPORTAL365_SPORTS_SEARCH_DOMAIN,
11
- SPORTAL365_STANDINGS_DOMAIN,
12
- SPORTAL365_STATISTICS_DOMAIN,
13
- SPORTAL365_TENNIS_DOMAIN
3
+ SPORTAL365_FOOTBALL_DOMAIN
14
4
  };
15
5
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sources":["../../../src/lib/api/sportal365-sports/constants.ts"],"sourcesContent":["/**\n * Sportal365 API Domain Constants\n *\n * Each Sportal365 API has its own domain based on the sport/functionality.\n */\n\n/** Football API domain */\nexport const SPORTAL365_FOOTBALL_DOMAIN = \"https://football.api.sportal365.com\";\n\n/** Basketball API domain */\nexport const SPORTAL365_BASKETBALL_DOMAIN = \"https://basketball.api.sportal365.com\";\n\n/** Tennis API domain */\nexport const SPORTAL365_TENNIS_DOMAIN = \"https://tennis.api.sportal365.com\";\n\n/** Statistics API domain */\nexport const SPORTAL365_STATISTICS_DOMAIN = \"https://sports-statistics.api.sportal365.com\";\n\n/** Sports Search API domain */\nexport const SPORTAL365_SPORTS_SEARCH_DOMAIN = \"https://sports-search.api.sportal365.com\";\n\n/** Standings API domain */\nexport const SPORTAL365_STANDINGS_DOMAIN = \"https://standing.api.sportal365.com\";\n"],"names":[],"mappings":"AAOO,MAAM,6BAA6B;AAGnC,MAAM,+BAA+B;AAGrC,MAAM,2BAA2B;AAGjC,MAAM,+BAA+B;AAGrC,MAAM,kCAAkC;AAGxC,MAAM,8BAA8B;"}
1
+ {"version":3,"file":"constants.js","sources":["../../../src/lib/api/sportal365-sports/constants.ts"],"sourcesContent":["/**\n * Sportal365 API Domain Constants\n *\n * Each Sportal365 API has its own domain based on the sport/functionality.\n */\n\n/**\n * Football API direct domain used by `footballLegacyHttp` for endpoints the\n * lsdapi proxy does not yet expose (currently: player recent statistics).\n */\nexport const SPORTAL365_FOOTBALL_DOMAIN = \"https://football.api.sportal365.com\";\n"],"names":[],"mappings":"AAUO,MAAM,6BAA6B;"}
@@ -1,8 +1,11 @@
1
1
  /**
2
- * Football HTTP client for Sportal365 API
3
- */
4
- /**
5
- * HTTP client configured for the Sportal365 Football API
2
+ * Football HTTP clients.
3
+ *
4
+ * `footballHttp` goes through the lsdapi proxy and is the default for every
5
+ * football endpoint. `footballLegacyHttp` hits Sportal365 directly with Basic
6
+ * Auth — only used for routes the proxy does not yet expose (currently:
7
+ * `getFootballPlayerRecentStatistics`).
6
8
  */
7
9
  export declare const footballHttp: import("../http").Sportal365HttpClient;
10
+ export declare const footballLegacyHttp: import("../http").Sportal365HttpClient;
8
11
  //# sourceMappingURL=http.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/sportal365-sports/football/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,eAAO,MAAM,YAAY,wCAA+C,CAAC"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/sportal365-sports/football/http.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,eAAO,MAAM,YAAY,wCAAiC,CAAC;AAE3D,eAAO,MAAM,kBAAkB,wCAA+C,CAAC"}
@@ -1,7 +1,9 @@
1
- import { createHttpClient } from "../http.js";
1
+ import { createProxyClient, createHttpClient } from "../http.js";
2
2
  import { SPORTAL365_FOOTBALL_DOMAIN } from "../constants.js";
3
- const footballHttp = createHttpClient(SPORTAL365_FOOTBALL_DOMAIN);
3
+ const footballHttp = createProxyClient("/football");
4
+ const footballLegacyHttp = createHttpClient(SPORTAL365_FOOTBALL_DOMAIN);
4
5
  export {
5
- footballHttp
6
+ footballHttp,
7
+ footballLegacyHttp
6
8
  };
7
9
  //# sourceMappingURL=http.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sources":["../../../../src/lib/api/sportal365-sports/football/http.ts"],"sourcesContent":["/**\n * Football HTTP client for Sportal365 API\n */\n\nimport { createHttpClient } from '../http';\nimport { SPORTAL365_FOOTBALL_DOMAIN } from '../constants';\n\n/**\n * HTTP client configured for the Sportal365 Football API\n */\nexport const footballHttp = createHttpClient(SPORTAL365_FOOTBALL_DOMAIN);\n\n"],"names":[],"mappings":";;AAUO,MAAM,eAAe,iBAAiB,0BAA0B;"}
1
+ {"version":3,"file":"http.js","sources":["../../../../src/lib/api/sportal365-sports/football/http.ts"],"sourcesContent":["/**\n * Football HTTP clients.\n *\n * `footballHttp` goes through the lsdapi proxy and is the default for every\n * football endpoint. `footballLegacyHttp` hits Sportal365 directly with Basic\n * Auth — only used for routes the proxy does not yet expose (currently:\n * `getFootballPlayerRecentStatistics`).\n */\n\nimport { createHttpClient, createProxyClient } from \"../http\";\nimport { SPORTAL365_FOOTBALL_DOMAIN } from \"../constants\";\n\nexport const footballHttp = createProxyClient(\"/football\");\n\nexport const footballLegacyHttp = createHttpClient(SPORTAL365_FOOTBALL_DOMAIN);\n"],"names":[],"mappings":";;AAYO,MAAM,eAAe,kBAAkB,WAAW;AAElD,MAAM,qBAAqB,iBAAiB,0BAA0B;"}
@@ -1,5 +1,5 @@
1
1
  import { getConfig } from "../../../../config/index.js";
2
- import { footballHttp } from "../http.js";
2
+ import { footballHttp, footballLegacyHttp } from "../http.js";
3
3
  import { transformPlayerSeasonStatistics, transformPlayerSeasonStatisticsWithoutTeam, mergePlayerSeasonStatistics } from "./player-season.transformer.js";
4
4
  import { transformPlayerCareerStatistics } from "./player-career.transformer.js";
5
5
  import { transformPlayerRecentStatistics } from "./player-recent.transformer.js";
@@ -129,7 +129,7 @@ async function getFootballPlayerRecentStatistics(options, config) {
129
129
  if (teamId) {
130
130
  params.team_id = teamId;
131
131
  }
132
- const raw = await footballHttp.get({
132
+ const raw = await footballLegacyHttp.get({
133
133
  path: `/v2/statistics/players/${playerId}/recent-statistics`,
134
134
  params,
135
135
  headers: {
@@ -1 +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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"}
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, footballLegacyHttp } 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 footballLegacyHttp.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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"}
@@ -27,13 +27,7 @@ export interface RequestOptions {
27
27
  }
28
28
  export interface Sportal365HttpClient {
29
29
  /**
30
- * Make a GET request to the Sportal365 Sports API
31
- *
32
- * Handles:
33
- * - Authentication (Basic Auth)
34
- * - Project ID header
35
- * - Timeout
36
- * - Error handling
30
+ * Make a GET request to a Sportal365 Sports API (direct or via lsdapi proxy).
37
31
  *
38
32
  * @param options - Request options
39
33
  * @returns Parsed JSON response
@@ -56,4 +50,17 @@ export interface Sportal365HttpClient {
56
50
  * ```
57
51
  */
58
52
  export declare function createHttpClient(domain: string): Sportal365HttpClient;
53
+ /**
54
+ * Create an HTTP client that talks to the lsdapi proxy mirror of a Sportal365 API.
55
+ *
56
+ * The proxy mirrors each Sportal365 subdomain as a path prefix on a single host:
57
+ * `football.api.sportal365.com` → `sports.lsdapi.com/football`, etc. Image URLs
58
+ * in responses come back already rewritten to `assets.lsdapi.com`, so no
59
+ * client-side hashing is needed.
60
+ *
61
+ * Auth is by query params (`client_id`, `key`) — no Basic Auth, no `X-Project`.
62
+ *
63
+ * @param prefix - Path prefix on the proxy (e.g., '/football', '/basketball')
64
+ */
65
+ export declare function createProxyClient(prefix: string): Sportal365HttpClient;
59
66
  //# sourceMappingURL=http.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/lib/api/sportal365-sports/http.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/D;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC7B,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC5B,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC3B,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,2DAA2D;IAC3D,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,kEAAkE;IAClE,MAAM,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACjC;;;;;;;;;;;OAWG;IACH,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC/C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CA8DrE"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/lib/api/sportal365-sports/http.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/D;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC7B,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC5B,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC3B,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,2DAA2D;IAC3D,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,kEAAkE;IAClE,MAAM,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACjC;;;;;OAKG;IACH,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC/C;AAYD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CA8DrE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CAoCtE"}
@@ -1,4 +1,7 @@
1
1
  import { getConfig } from "../../config/index.js";
2
+ const LSDAPI_PROXY_BASE = "https://sports.lsdapi.com";
3
+ const LSDAPI_CLIENT_ID = "demo";
4
+ const LSDAPI_KEY = "AIzaSyCq4iSKixO5OYastH9BuqT0SKjQl2aztm8";
2
5
  function createHttpClient(domain) {
3
6
  const baseUrl = domain.replace(/\/$/, "");
4
7
  function getAuthHeader(config) {
@@ -51,7 +54,40 @@ function createHttpClient(domain) {
51
54
  }
52
55
  };
53
56
  }
57
+ function createProxyClient(prefix) {
58
+ const baseUrl = LSDAPI_PROXY_BASE + (prefix.startsWith("/") ? prefix : `/${prefix}`);
59
+ return {
60
+ async get(options) {
61
+ const url = new URL(baseUrl + options.path);
62
+ if (options.params) {
63
+ for (const [key, value] of Object.entries(options.params)) {
64
+ if (value === void 0) continue;
65
+ if (Array.isArray(value)) {
66
+ if (value.length > 0) url.searchParams.set(key, value.join(","));
67
+ } else {
68
+ url.searchParams.set(key, value);
69
+ }
70
+ }
71
+ }
72
+ url.searchParams.set("client_id", LSDAPI_CLIENT_ID);
73
+ url.searchParams.set("key", LSDAPI_KEY);
74
+ const response = await fetch(url.toString(), {
75
+ method: "GET",
76
+ headers: {
77
+ "Content-Type": "application/json",
78
+ ...options.headers
79
+ },
80
+ ...options.next && { next: options.next }
81
+ });
82
+ if (!response.ok) {
83
+ throw new Error(`lsdapi proxy error: ${response.status} ${response.statusText}`);
84
+ }
85
+ return response.json();
86
+ }
87
+ };
88
+ }
54
89
  export {
55
- createHttpClient
90
+ createHttpClient,
91
+ createProxyClient
56
92
  };
57
93
  //# sourceMappingURL=http.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sources":["../../../src/lib/api/sportal365-sports/http.ts"],"sourcesContent":["/**\n * Sportal365 Sports API - HTTP client factory\n * Creates sport-specific HTTP clients for Sportal365 APIs\n */\n\nimport { getConfig, type DataLayerConfig } from \"../../config\";\n\n/**\n * Next.js cache options for fetch requests\n * @see https://nextjs.org/docs/app/api-reference/functions/fetch#optionsnext\n */\nexport interface NextCacheOptions {\n /** Time in seconds to cache the response. Set to 0 to disable caching. */\n revalidate?: number | false;\n /** Cache tags for on-demand revalidation with revalidateTag() */\n tags?: string[];\n}\n\nexport interface RequestOptions {\n /** API path (e.g., '/v2/matches/123') */\n path: string;\n /** Query parameters */\n params?: Record<string, string | string[] | undefined>;\n /** Custom headers to include in the request */\n headers?: Record<string, string>;\n /** Next.js cache options for ISR/on-demand revalidation */\n next?: NextCacheOptions;\n /** Optional data layer config (uses singleton if not provided) */\n config?: DataLayerConfig;\n}\n\nexport interface Sportal365HttpClient {\n /**\n * Make a GET request to the Sportal365 Sports API\n *\n * Handles:\n * - Authentication (Basic Auth)\n * - Project ID header\n * - Timeout\n * - Error handling\n *\n * @param options - Request options\n * @returns Parsed JSON response\n */\n get<T>(options: RequestOptions): Promise<T>;\n}\n\n/**\n * Create an HTTP client for a specific Sportal365 API domain\n *\n * @param domain - The base URL for the API (e.g., 'https://football.api.sportal365.com')\n * @returns HTTP client configured for the specified domain\n *\n * @example\n * ```typescript\n * import { createHttpClient } from '../http';\n * import { SPORTAL365_FOOTBALL_DOMAIN } from '../constants';\n *\n * const footballHttp = createHttpClient(SPORTAL365_FOOTBALL_DOMAIN);\n * const data = await footballHttp.get({ path: '/v2/matches/123' });\n * ```\n */\nexport function createHttpClient(domain: string): Sportal365HttpClient {\n const baseUrl = domain.replace(/\\/$/, \"\");\n\n function getAuthHeader(config: DataLayerConfig): string {\n const { sportal365Sports } = config;\n if (!sportal365Sports) {\n throw new Error(\"Sportal365 Sports API configuration is missing\");\n }\n const credentials = `${sportal365Sports.username}:${sportal365Sports.password}`;\n return `Basic ${btoa(credentials)}`;\n }\n\n function buildUrl(path: string): string {\n return `${baseUrl}${path}`;\n }\n\n return {\n async get<T>(options: RequestOptions): Promise<T> {\n const finalConfig = options.config || getConfig();\n const { sportal365Sports } = finalConfig;\n\n if (!sportal365Sports) {\n throw new Error(\"Sportal365 Sports API configuration is missing\");\n }\n\n const url = new URL(buildUrl(options.path));\n\n // Add query parameters\n if (options.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value === undefined) continue;\n\n if (Array.isArray(value)) {\n if (value.length > 0) {\n url.searchParams.set(key, value.join(\",\"));\n }\n } else {\n url.searchParams.set(key, value);\n }\n }\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Authorization: getAuthHeader(finalConfig),\n \"Content-Type\": \"application/json\",\n \"X-Project\": sportal365Sports.projectId,\n // Merge custom headers (they can override defaults)\n ...options.headers,\n },\n // Next.js cache options for ISR/on-demand revalidation\n ...(options.next && { next: options.next }),\n });\n\n if (!response.ok) {\n throw new Error(`Sportal365 API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n },\n };\n}\n"],"names":[],"mappings":";AA8DO,SAAS,iBAAiB,QAAsC;AACnE,QAAM,UAAU,OAAO,QAAQ,OAAO,EAAE;AAExC,WAAS,cAAc,QAAiC;AACpD,UAAM,EAAE,qBAAqB;AAC7B,QAAI,CAAC,kBAAkB;AACnB,YAAM,IAAI,MAAM,gDAAgD;AAAA,IACpE;AACA,UAAM,cAAc,GAAG,iBAAiB,QAAQ,IAAI,iBAAiB,QAAQ;AAC7E,WAAO,SAAS,KAAK,WAAW,CAAC;AAAA,EACrC;AAEA,WAAS,SAAS,MAAsB;AACpC,WAAO,GAAG,OAAO,GAAG,IAAI;AAAA,EAC5B;AAEA,SAAO;AAAA,IACH,MAAM,IAAO,SAAqC;AAC9C,YAAM,cAAc,QAAQ,UAAU,UAAA;AACtC,YAAM,EAAE,qBAAqB;AAE7B,UAAI,CAAC,kBAAkB;AACnB,cAAM,IAAI,MAAM,gDAAgD;AAAA,MACpE;AAEA,YAAM,MAAM,IAAI,IAAI,SAAS,QAAQ,IAAI,CAAC;AAG1C,UAAI,QAAQ,QAAQ;AAChB,mBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,MAAM,GAAG;AACvD,cAAI,UAAU,OAAW;AAEzB,cAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,gBAAI,MAAM,SAAS,GAAG;AAClB,kBAAI,aAAa,IAAI,KAAK,MAAM,KAAK,GAAG,CAAC;AAAA,YAC7C;AAAA,UACJ,OAAO;AACH,gBAAI,aAAa,IAAI,KAAK,KAAK;AAAA,UACnC;AAAA,QACJ;AAAA,MACJ;AAEA,YAAM,WAAW,MAAM,MAAM,IAAI,YAAY;AAAA,QACzC,QAAQ;AAAA,QACR,SAAS;AAAA,UACL,eAAe,cAAc,WAAW;AAAA,UACxC,gBAAgB;AAAA,UAChB,aAAa,iBAAiB;AAAA;AAAA,UAE9B,GAAG,QAAQ;AAAA,QAAA;AAAA;AAAA,QAGf,GAAI,QAAQ,QAAQ,EAAE,MAAM,QAAQ,KAAA;AAAA,MAAK,CAC5C;AAED,UAAI,CAAC,SAAS,IAAI;AACd,cAAM,IAAI,MAAM,yBAAyB,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,MACrF;AAEA,aAAO,SAAS,KAAA;AAAA,IACpB;AAAA,EAAA;AAER;"}
1
+ {"version":3,"file":"http.js","sources":["../../../src/lib/api/sportal365-sports/http.ts"],"sourcesContent":["/**\n * Sportal365 Sports API - HTTP client factory\n * Creates sport-specific HTTP clients for Sportal365 APIs\n */\n\nimport { getConfig, type DataLayerConfig } from \"../../config\";\n\n/**\n * Next.js cache options for fetch requests\n * @see https://nextjs.org/docs/app/api-reference/functions/fetch#optionsnext\n */\nexport interface NextCacheOptions {\n /** Time in seconds to cache the response. Set to 0 to disable caching. */\n revalidate?: number | false;\n /** Cache tags for on-demand revalidation with revalidateTag() */\n tags?: string[];\n}\n\nexport interface RequestOptions {\n /** API path (e.g., '/v2/matches/123') */\n path: string;\n /** Query parameters */\n params?: Record<string, string | string[] | undefined>;\n /** Custom headers to include in the request */\n headers?: Record<string, string>;\n /** Next.js cache options for ISR/on-demand revalidation */\n next?: NextCacheOptions;\n /** Optional data layer config (uses singleton if not provided) */\n config?: DataLayerConfig;\n}\n\nexport interface Sportal365HttpClient {\n /**\n * Make a GET request to a Sportal365 Sports API (direct or via lsdapi proxy).\n *\n * @param options - Request options\n * @returns Parsed JSON response\n */\n get<T>(options: RequestOptions): Promise<T>;\n}\n\n/** Base host of the FansUnited lsdapi proxy that mirrors Sportal365 APIs. */\nconst LSDAPI_PROXY_BASE = \"https://sports.lsdapi.com\";\n\n/**\n * Hardcoded credentials for the lsdapi proxy. Single-tenant for now; promote\n * to config if a second consumer ever needs different values.\n */\nconst LSDAPI_CLIENT_ID = \"demo\";\nconst LSDAPI_KEY = \"AIzaSyCq4iSKixO5OYastH9BuqT0SKjQl2aztm8\";\n\n/**\n * Create an HTTP client for a specific Sportal365 API domain\n *\n * @param domain - The base URL for the API (e.g., 'https://football.api.sportal365.com')\n * @returns HTTP client configured for the specified domain\n *\n * @example\n * ```typescript\n * import { createHttpClient } from '../http';\n * import { SPORTAL365_FOOTBALL_DOMAIN } from '../constants';\n *\n * const footballHttp = createHttpClient(SPORTAL365_FOOTBALL_DOMAIN);\n * const data = await footballHttp.get({ path: '/v2/matches/123' });\n * ```\n */\nexport function createHttpClient(domain: string): Sportal365HttpClient {\n const baseUrl = domain.replace(/\\/$/, \"\");\n\n function getAuthHeader(config: DataLayerConfig): string {\n const { sportal365Sports } = config;\n if (!sportal365Sports) {\n throw new Error(\"Sportal365 Sports API configuration is missing\");\n }\n const credentials = `${sportal365Sports.username}:${sportal365Sports.password}`;\n return `Basic ${btoa(credentials)}`;\n }\n\n function buildUrl(path: string): string {\n return `${baseUrl}${path}`;\n }\n\n return {\n async get<T>(options: RequestOptions): Promise<T> {\n const finalConfig = options.config || getConfig();\n const { sportal365Sports } = finalConfig;\n\n if (!sportal365Sports) {\n throw new Error(\"Sportal365 Sports API configuration is missing\");\n }\n\n const url = new URL(buildUrl(options.path));\n\n // Add query parameters\n if (options.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value === undefined) continue;\n\n if (Array.isArray(value)) {\n if (value.length > 0) {\n url.searchParams.set(key, value.join(\",\"));\n }\n } else {\n url.searchParams.set(key, value);\n }\n }\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Authorization: getAuthHeader(finalConfig),\n \"Content-Type\": \"application/json\",\n \"X-Project\": sportal365Sports.projectId,\n // Merge custom headers (they can override defaults)\n ...options.headers,\n },\n // Next.js cache options for ISR/on-demand revalidation\n ...(options.next && { next: options.next }),\n });\n\n if (!response.ok) {\n throw new Error(`Sportal365 API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n },\n };\n}\n\n/**\n * Create an HTTP client that talks to the lsdapi proxy mirror of a Sportal365 API.\n *\n * The proxy mirrors each Sportal365 subdomain as a path prefix on a single host:\n * `football.api.sportal365.com` → `sports.lsdapi.com/football`, etc. Image URLs\n * in responses come back already rewritten to `assets.lsdapi.com`, so no\n * client-side hashing is needed.\n *\n * Auth is by query params (`client_id`, `key`) — no Basic Auth, no `X-Project`.\n *\n * @param prefix - Path prefix on the proxy (e.g., '/football', '/basketball')\n */\nexport function createProxyClient(prefix: string): Sportal365HttpClient {\n const baseUrl = LSDAPI_PROXY_BASE + (prefix.startsWith(\"/\") ? prefix : `/${prefix}`);\n\n return {\n async get<T>(options: RequestOptions): Promise<T> {\n const url = new URL(baseUrl + options.path);\n\n if (options.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n if (value.length > 0) url.searchParams.set(key, value.join(\",\"));\n } else {\n url.searchParams.set(key, value);\n }\n }\n }\n url.searchParams.set(\"client_id\", LSDAPI_CLIENT_ID);\n url.searchParams.set(\"key\", LSDAPI_KEY);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n ...(options.next && { next: options.next }),\n });\n\n if (!response.ok) {\n throw new Error(`lsdapi proxy error: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n },\n };\n}\n"],"names":[],"mappings":"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"}
@@ -1,8 +1,5 @@
1
1
  /**
2
- * HTTP client for Sports Search API
3
- */
4
- /**
5
- * HTTP client for Sports Search API
2
+ * Sports Search HTTP client routed through the lsdapi proxy.
6
3
  */
7
4
  export declare const sportsSearchHttp: import("../http").Sportal365HttpClient;
8
5
  //# sourceMappingURL=http.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/sportal365-sports/search/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,eAAO,MAAM,gBAAgB,wCAAoD,CAAC"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/sportal365-sports/search/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,gBAAgB,wCAAsC,CAAC"}
@@ -1,6 +1,5 @@
1
- import { createHttpClient } from "../http.js";
2
- import { SPORTAL365_SPORTS_SEARCH_DOMAIN } from "../constants.js";
3
- const sportsSearchHttp = createHttpClient(SPORTAL365_SPORTS_SEARCH_DOMAIN);
1
+ import { createProxyClient } from "../http.js";
2
+ const sportsSearchHttp = createProxyClient("/sports-search");
4
3
  export {
5
4
  sportsSearchHttp
6
5
  };
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sources":["../../../../src/lib/api/sportal365-sports/search/http.ts"],"sourcesContent":["/**\n * HTTP client for Sports Search API\n */\n\nimport { createHttpClient } from \"../http\";\nimport { SPORTAL365_SPORTS_SEARCH_DOMAIN } from \"../constants\";\n\n/**\n * HTTP client for Sports Search API\n */\nexport const sportsSearchHttp = createHttpClient(SPORTAL365_SPORTS_SEARCH_DOMAIN);\n\n"],"names":[],"mappings":";;AAUO,MAAM,mBAAmB,iBAAiB,+BAA+B;"}
1
+ {"version":3,"file":"http.js","sources":["../../../../src/lib/api/sportal365-sports/search/http.ts"],"sourcesContent":["/**\n * Sports Search HTTP client routed through the lsdapi proxy.\n */\n\nimport { createProxyClient } from \"../http\";\n\nexport const sportsSearchHttp = createProxyClient(\"/sports-search\");\n"],"names":[],"mappings":";AAMO,MAAM,mBAAmB,kBAAkB,gBAAgB;"}
@@ -1,8 +1,5 @@
1
1
  /**
2
- * Standings API HTTP client
3
- */
4
- /**
5
- * HTTP client configured for the Sportal365 Standings API
2
+ * Standings HTTP client — routed through the lsdapi proxy.
6
3
  */
7
4
  export declare const standingsHttp: import("../http").Sportal365HttpClient;
8
5
  //# sourceMappingURL=http.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/sportal365-sports/standings/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,eAAO,MAAM,aAAa,wCAAgD,CAAC"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/sportal365-sports/standings/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,aAAa,wCAAiC,CAAC"}
@@ -1,6 +1,5 @@
1
- import { createHttpClient } from "../http.js";
2
- import { SPORTAL365_STANDINGS_DOMAIN } from "../constants.js";
3
- const standingsHttp = createHttpClient(SPORTAL365_STANDINGS_DOMAIN);
1
+ import { createProxyClient } from "../http.js";
2
+ const standingsHttp = createProxyClient("/standing");
4
3
  export {
5
4
  standingsHttp
6
5
  };
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sources":["../../../../src/lib/api/sportal365-sports/standings/http.ts"],"sourcesContent":["/**\n * Standings API HTTP client\n */\n\nimport { createHttpClient } from \"../http\";\nimport { SPORTAL365_STANDINGS_DOMAIN } from \"../constants\";\n\n/**\n * HTTP client configured for the Sportal365 Standings API\n */\nexport const standingsHttp = createHttpClient(SPORTAL365_STANDINGS_DOMAIN);\n"],"names":[],"mappings":";;AAUO,MAAM,gBAAgB,iBAAiB,2BAA2B;"}
1
+ {"version":3,"file":"http.js","sources":["../../../../src/lib/api/sportal365-sports/standings/http.ts"],"sourcesContent":["/**\n * Standings HTTP client routed through the lsdapi proxy.\n */\n\nimport { createProxyClient } from \"../http\";\n\nexport const standingsHttp = createProxyClient(\"/standing\");\n"],"names":[],"mappings":";AAMO,MAAM,gBAAgB,kBAAkB,WAAW;"}
@@ -1,8 +1,5 @@
1
1
  /**
2
- * Statistics HTTP client for Sportal365 API
3
- */
4
- /**
5
- * HTTP client configured for the Sportal365 Statistics API
2
+ * Statistics HTTP client routed through the lsdapi proxy.
6
3
  */
7
4
  export declare const statisticsHttp: import("../http").Sportal365HttpClient;
8
5
  //# sourceMappingURL=http.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/sportal365-sports/statistics/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,eAAO,MAAM,cAAc,wCAAiD,CAAC"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/sportal365-sports/statistics/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,cAAc,wCAA0C,CAAC"}
@@ -1,6 +1,5 @@
1
- import { createHttpClient } from "../http.js";
2
- import { SPORTAL365_STATISTICS_DOMAIN } from "../constants.js";
3
- const statisticsHttp = createHttpClient(SPORTAL365_STATISTICS_DOMAIN);
1
+ import { createProxyClient } from "../http.js";
2
+ const statisticsHttp = createProxyClient("/sports-statistics");
4
3
  export {
5
4
  statisticsHttp
6
5
  };
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sources":["../../../../src/lib/api/sportal365-sports/statistics/http.ts"],"sourcesContent":["/**\n * Statistics HTTP client for Sportal365 API\n */\n\nimport { createHttpClient } from \"../http\";\nimport { SPORTAL365_STATISTICS_DOMAIN } from \"../constants\";\n\n/**\n * HTTP client configured for the Sportal365 Statistics API\n */\nexport const statisticsHttp = createHttpClient(SPORTAL365_STATISTICS_DOMAIN);\n\n"],"names":[],"mappings":";;AAUO,MAAM,iBAAiB,iBAAiB,4BAA4B;"}
1
+ {"version":3,"file":"http.js","sources":["../../../../src/lib/api/sportal365-sports/statistics/http.ts"],"sourcesContent":["/**\n * Statistics HTTP client routed through the lsdapi proxy.\n */\n\nimport { createProxyClient } from \"../http\";\n\nexport const statisticsHttp = createProxyClient(\"/sports-statistics\");\n"],"names":[],"mappings":";AAMO,MAAM,iBAAiB,kBAAkB,oBAAoB;"}
@@ -1,8 +1,5 @@
1
1
  /**
2
- * Tennis HTTP client for Sportal365 API
3
- */
4
- /**
5
- * HTTP client configured for the Sportal365 Tennis API
2
+ * Tennis HTTP client routed through the lsdapi proxy.
6
3
  */
7
4
  export declare const tennisHttp: import("../http").Sportal365HttpClient;
8
5
  //# sourceMappingURL=http.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/sportal365-sports/tennis/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,eAAO,MAAM,UAAU,wCAA6C,CAAC"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/sportal365-sports/tennis/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,UAAU,wCAA+B,CAAC"}
@@ -1,6 +1,5 @@
1
- import { createHttpClient } from "../http.js";
2
- import { SPORTAL365_TENNIS_DOMAIN } from "../constants.js";
3
- const tennisHttp = createHttpClient(SPORTAL365_TENNIS_DOMAIN);
1
+ import { createProxyClient } from "../http.js";
2
+ const tennisHttp = createProxyClient("/tennis");
4
3
  export {
5
4
  tennisHttp
6
5
  };
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sources":["../../../../src/lib/api/sportal365-sports/tennis/http.ts"],"sourcesContent":["/**\n * Tennis HTTP client for Sportal365 API\n */\n\nimport { createHttpClient } from '../http';\nimport { SPORTAL365_TENNIS_DOMAIN } from '../constants';\n\n/**\n * HTTP client configured for the Sportal365 Tennis API\n */\nexport const tennisHttp = createHttpClient(SPORTAL365_TENNIS_DOMAIN);\n\n"],"names":[],"mappings":";;AAUO,MAAM,aAAa,iBAAiB,wBAAwB;"}
1
+ {"version":3,"file":"http.js","sources":["../../../../src/lib/api/sportal365-sports/tennis/http.ts"],"sourcesContent":["/**\n * Tennis HTTP client routed through the lsdapi proxy.\n */\n\nimport { createProxyClient } from \"../http\";\n\nexport const tennisHttp = createProxyClient(\"/tennis\");\n"],"names":[],"mappings":";AAMO,MAAM,aAAa,kBAAkB,SAAS;"}
@@ -1,4 +1,5 @@
1
1
  import { getConfig, isConfigured, setConfig } from "./config/index.js";
2
+ import { memoryStore } from "./cache/memory-store.js";
2
3
  import { GOAL_EVENT_TYPES } from "./utilities/stats/core/types.js";
3
4
  import { addProviderRef, getProviderRefId, toProviderRefArray } from "./api/sportal365-sports/shared/providerRef.helper.js";
4
5
  import { aggregatePlayerStatisticsFromMatches, getAllPlayerStatisticsFromMatches, getMostCardedPlayersFromMatches, getTopAssistersFromMatches, getTopGoalContributorsFromMatches, getTopScorersFromMatches } from "./helpers/player.helpers.js";
@@ -132,6 +133,7 @@ export {
132
133
  isTeamAway,
133
134
  isTeamHome,
134
135
  isTeamInMatch,
136
+ memoryStore,
135
137
  search,
136
138
  searchFootball,
137
139
  setConfig,
@@ -1 +1 @@
1
- {"version":3,"file":"fansunited-data-layer.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"fansunited-data-layer.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/index.d.ts CHANGED
@@ -40,4 +40,5 @@ export type { MatchAnalysis, MatchResult, MatchFilter, VenueFilter, H2HStats, H2
40
40
  export { GOAL_EVENT_TYPES } from "./utilities/stats";
41
41
  export { initL2, cached, cachedBatch, invalidate } from "./cache";
42
42
  export type { CacheEntry, EntityCacheConfig, EntityType, L2Store } from "./cache";
43
+ export { memoryStore } from "./cache/memory-store";
43
44
  //# sourceMappingURL=index.d.ts.map
package/index.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/lib/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/lib/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "description": "A TypeScript library for fetching and transforming sports data from multiple API providers. Returns clean, canonical types that are provider-agnostic.",
5
5
  "homepage": "https://fansunited.com/",
6
6
  "private": false,
7
- "version": "0.14.5",
7
+ "version": "0.15.1",
8
8
  "type": "module",
9
9
  "sideEffects": false,
10
10
  "module": "./fansunited-data-layer.js",