fantasy-basketball-sdk 0.0.0 → 1.1.0

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 (93) hide show
  1. package/AGENTS.md +2 -1
  2. package/README.md +1 -0
  3. package/dist/espn/client.js +184 -144
  4. package/dist/espn/client.js.map +1 -1
  5. package/dist/espn/constants.js +176 -180
  6. package/dist/espn/constants.js.map +1 -1
  7. package/dist/espn/errors.js +34 -32
  8. package/dist/espn/errors.js.map +1 -1
  9. package/dist/espn/league.js +354 -284
  10. package/dist/espn/league.js.map +1 -1
  11. package/dist/espn/models/activity.js +42 -35
  12. package/dist/espn/models/activity.js.map +1 -1
  13. package/dist/espn/models/box-player.js +42 -36
  14. package/dist/espn/models/box-player.js.map +1 -1
  15. package/dist/espn/models/box-score.js +105 -108
  16. package/dist/espn/models/box-score.js.map +1 -1
  17. package/dist/espn/models/matchup.js +43 -50
  18. package/dist/espn/models/matchup.js.map +1 -1
  19. package/dist/espn/models/pick.js +20 -24
  20. package/dist/espn/models/pick.js.map +1 -1
  21. package/dist/espn/models/player.js +133 -119
  22. package/dist/espn/models/player.js.map +1 -1
  23. package/dist/espn/models/settings.js +62 -63
  24. package/dist/espn/models/settings.js.map +1 -1
  25. package/dist/espn/models/team.js +89 -80
  26. package/dist/espn/models/team.js.map +1 -1
  27. package/dist/espn/models/transaction.js +27 -31
  28. package/dist/espn/models/transaction.js.map +1 -1
  29. package/dist/espn/types/raw.js +2 -0
  30. package/dist/espn/types/raw.js.map +1 -0
  31. package/dist/espn/utils.js +48 -30
  32. package/dist/espn/utils.js.map +1 -1
  33. package/dist/mcp/config.d.ts +15 -0
  34. package/dist/mcp/config.d.ts.map +1 -0
  35. package/dist/mcp/config.js +41 -0
  36. package/dist/mcp/config.js.map +1 -0
  37. package/dist/mcp/create-server.d.ts +4 -0
  38. package/dist/mcp/create-server.d.ts.map +1 -0
  39. package/dist/mcp/create-server.js +19 -0
  40. package/dist/mcp/create-server.js.map +1 -0
  41. package/dist/mcp/index.d.ts +2 -0
  42. package/dist/mcp/index.d.ts.map +1 -0
  43. package/dist/mcp/index.js +2 -0
  44. package/dist/mcp/index.js.map +1 -0
  45. package/dist/mcp/results.d.ts +5 -0
  46. package/dist/mcp/results.d.ts.map +1 -0
  47. package/dist/mcp/results.js +23 -0
  48. package/dist/mcp/results.js.map +1 -0
  49. package/dist/mcp/serialize.d.ts +24 -0
  50. package/dist/mcp/serialize.d.ts.map +1 -0
  51. package/dist/mcp/serialize.js +125 -0
  52. package/dist/mcp/serialize.js.map +1 -0
  53. package/dist/mcp/server.d.ts +3 -0
  54. package/dist/mcp/server.d.ts.map +1 -0
  55. package/dist/mcp/server.js +4 -0
  56. package/dist/mcp/server.js.map +1 -0
  57. package/dist/mcp/tools/espn.d.ts +3 -0
  58. package/dist/mcp/tools/espn.d.ts.map +1 -0
  59. package/dist/mcp/tools/espn.js +182 -0
  60. package/dist/mcp/tools/espn.js.map +1 -0
  61. package/dist/mcp/tools/yahoo.d.ts +3 -0
  62. package/dist/mcp/tools/yahoo.d.ts.map +1 -0
  63. package/dist/mcp/tools/yahoo.js +165 -0
  64. package/dist/mcp/tools/yahoo.js.map +1 -0
  65. package/dist/yahoo/client.js +94 -88
  66. package/dist/yahoo/client.js.map +1 -1
  67. package/dist/yahoo/constants.js +27 -31
  68. package/dist/yahoo/constants.js.map +1 -1
  69. package/dist/yahoo/errors.js +50 -49
  70. package/dist/yahoo/errors.js.map +1 -1
  71. package/dist/yahoo/keys.js +80 -62
  72. package/dist/yahoo/keys.js.map +1 -1
  73. package/dist/yahoo/models/league.js +175 -128
  74. package/dist/yahoo/models/league.js.map +1 -1
  75. package/dist/yahoo/models/matchup.js +54 -43
  76. package/dist/yahoo/models/matchup.js.map +1 -1
  77. package/dist/yahoo/models/player.js +47 -41
  78. package/dist/yahoo/models/player.js.map +1 -1
  79. package/dist/yahoo/models/roster.js +46 -44
  80. package/dist/yahoo/models/roster.js.map +1 -1
  81. package/dist/yahoo/models/settings.js +92 -75
  82. package/dist/yahoo/models/settings.js.map +1 -1
  83. package/dist/yahoo/models/team.js +54 -45
  84. package/dist/yahoo/models/team.js.map +1 -1
  85. package/dist/yahoo/models/transaction.js +17 -19
  86. package/dist/yahoo/models/transaction.js.map +1 -1
  87. package/dist/yahoo/parse.js +150 -92
  88. package/dist/yahoo/parse.js.map +1 -1
  89. package/dist/yahoo/types/raw.js +2 -0
  90. package/dist/yahoo/types/raw.js.map +1 -0
  91. package/dist/yahoo/xml.js +49 -33
  92. package/dist/yahoo/xml.js.map +1 -1
  93. package/package.json +14 -7
package/AGENTS.md CHANGED
@@ -66,7 +66,8 @@ Merges to `main` run the `verify` job, then a `release` job that uses [semantic-
66
66
 
67
67
  - **Do not manually bump `package.json` version** for routine releases — git tags and GitHub Releases are the source of truth
68
68
  - **PR titles must follow [Conventional Commits](https://www.conventionalcommits.org/)** (`feat:`, `fix:`, etc.) because PRs are squash-merged and the title becomes the commit on `main`
69
- - **`chore:` / `docs:` / `ci:` merges do not publish** only `feat`, `fix`, `perf`, and breaking changes trigger a release
69
+ - **Version bumps** (defined in `.releaserc.json`): `fix:`/`perf:` patch, `feat:` minor, `feat!:`/`BREAKING CHANGE:` major; `chore:`/`docs:`/`ci:`/etc. no publish
70
+ - **First release** is always `1.0.0` regardless of the triggering commit type
70
71
  - **One-time npm setup:** register `fantasy-basketball-sdk` on npm and configure [trusted publishing](https://docs.npmjs.com/trusted-publishers) for GitHub Actions (`jacobra19/fantasy-basketball-sdk`, workflow `.github/workflows/ci.yml`, branch `main`). Fallback: add an `NPM_TOKEN` repo secret.
71
72
 
72
73
  ## Runtime Import Examples
package/README.md CHANGED
@@ -8,6 +8,7 @@
8
8
  </p>
9
9
  <br/>
10
10
 
11
+
11
12
  <p align="center">
12
13
  <a href="https://github.com/jacobra19/fantasy-basketball-sdk/actions?query=branch%3Amain"><img src="https://github.com/jacobra19/fantasy-basketball-sdk/actions/workflows/ci.yml/badge.svg?event=push&branch=main" alt="CI status" /></a>
13
14
  <a href="https://opensource.org/licenses/MIT" rel="nofollow"><img src="https://img.shields.io/github/license/jacobra19/fantasy-basketball-sdk" alt="License"></a>
@@ -1,145 +1,185 @@
1
- import { FANTASY_BASE_ENDPOINT, NEWS_BASE_ENDPOINT, View } from "./constants.js";
2
- import { EspnAccessDenied, EspnApiError, EspnInvalidLeague, assertEspnResponse } from "./errors.js";
3
- import { buildCookieHeader, buildQueryString } from "./utils.js";
4
- //#region src/espn/client.ts
5
- var EspnClient = class {
6
- leagueId;
7
- seasonId;
8
- fetchFn;
9
- cookieHeader;
10
- endpoint;
11
- newsEndpoint;
12
- leagueEndpoint;
13
- constructor(options) {
14
- this.leagueId = options.leagueId;
15
- this.seasonId = options.seasonId;
16
- this.fetchFn = options.fetch ?? globalThis.fetch;
17
- this.cookieHeader = buildCookieHeader(options.espnS2, options.swid);
18
- this.endpoint = `${FANTASY_BASE_ENDPOINT}fba/seasons/${options.seasonId}`;
19
- this.newsEndpoint = `${NEWS_BASE_ENDPOINT}fba/news/players`;
20
- this.leagueEndpoint = this.buildLeagueEndpoint(options.seasonId, options.leagueId);
21
- }
22
- buildLeagueEndpoint(seasonId, leagueId) {
23
- const base = `${FANTASY_BASE_ENDPOINT}fba`;
24
- if (seasonId < 2018) return `${base}/leagueHistory/${leagueId}?seasonId=${seasonId}`;
25
- return `${base}/seasons/${seasonId}/segments/0/leagues/${leagueId}`;
26
- }
27
- swapLeagueEndpoint() {
28
- const base = `${FANTASY_BASE_ENDPOINT}fba`;
29
- if (this.leagueEndpoint.includes("/leagueHistory/")) this.leagueEndpoint = `${base}/seasons/${this.seasonId}/segments/0/leagues/${this.leagueId}`;
30
- else this.leagueEndpoint = `${base}/leagueHistory/${this.leagueId}?seasonId=${this.seasonId}`;
31
- }
32
- async requestJson(url, init) {
33
- const headers = new Headers(init?.headers);
34
- if (this.cookieHeader) headers.set("Cookie", this.cookieHeader);
35
- const response = await this.fetchFn(url, {
36
- ...init,
37
- headers
38
- });
39
- return {
40
- response,
41
- body: await response.json()
42
- };
43
- }
44
- async checkLeagueStatus(status, extend, params, headers) {
45
- if (status === 401) {
46
- const originalEndpoint = this.leagueEndpoint;
47
- this.swapLeagueEndpoint();
48
- const query = buildQueryString(params ?? {});
49
- const url = `${this.leagueEndpoint}${extend}${query}`;
50
- const retryHeaders = new Headers(headers);
51
- if (this.cookieHeader) retryHeaders.set("Cookie", this.cookieHeader);
52
- const retryResponse = await this.fetchFn(url, { headers: retryHeaders });
53
- if (retryResponse.ok) return retryResponse.json();
54
- this.leagueEndpoint = originalEndpoint;
55
- if (!this.cookieHeader) throw new EspnAccessDenied();
56
- throw new EspnAccessDenied(`League ${this.leagueId} cannot be accessed with the provided credentials`);
57
- }
58
- if (status === 404) throw new EspnInvalidLeague(this.leagueId);
59
- if (status !== 200) throw new EspnApiError(status);
60
- return null;
61
- }
62
- async leagueGet(options = {}) {
63
- const { params, headers, extend = "" } = options;
64
- const query = buildQueryString(params ?? {});
65
- const url = `${this.leagueEndpoint}${extend}${query}`;
66
- const requestHeaders = new Headers(headers);
67
- if (this.cookieHeader) requestHeaders.set("Cookie", this.cookieHeader);
68
- const response = await this.fetchFn(url, { headers: requestHeaders });
69
- const alternate = await this.checkLeagueStatus(response.status, extend, params, headers);
70
- let data;
71
- if (alternate !== null) data = alternate;
72
- else if (!response.ok) throw new EspnApiError(response.status);
73
- else data = await response.json();
74
- if (Array.isArray(data)) data = data[0];
75
- assertEspnResponse(data);
76
- return data;
77
- }
78
- async get(options = {}) {
79
- const { params, headers, extend = "" } = options;
80
- const query = buildQueryString(params ?? {});
81
- const url = `${this.endpoint}${extend}${query}`;
82
- const requestHeaders = new Headers(headers);
83
- if (this.cookieHeader) requestHeaders.set("Cookie", this.cookieHeader);
84
- const response = await this.fetchFn(url, { headers: requestHeaders });
85
- await this.checkLeagueStatus(response.status, extend, params, headers);
86
- if (!response.ok) throw new EspnApiError(response.status);
87
- const data = await response.json();
88
- assertEspnResponse(data);
89
- return data;
90
- }
91
- async newsGet(options = {}) {
92
- const { params, headers, extend = "" } = options;
93
- const query = buildQueryString(params ?? {});
94
- const url = `${this.newsEndpoint}${extend}${query}`;
95
- const requestHeaders = new Headers(headers);
96
- if (this.cookieHeader) requestHeaders.set("Cookie", this.cookieHeader);
97
- const response = await this.fetchFn(url, { headers: requestHeaders });
98
- if (!response.ok) throw new EspnApiError(response.status);
99
- return response.json();
100
- }
101
- async getLeague() {
102
- return this.leagueGet({ params: { view: [
103
- View.MTeam,
104
- View.MRoster,
105
- View.MMatchup,
106
- View.MSettings,
107
- View.MStandings
108
- ] } });
109
- }
110
- async getProSchedule() {
111
- return await this.get({ params: { view: View.ProTeamSchedules } });
112
- }
113
- async getProPlayers() {
114
- return await this.get({
115
- extend: "/players",
116
- params: { view: View.Players },
117
- headers: { "x-fantasy-filter": JSON.stringify({ filterActive: { value: true } }) }
118
- });
119
- }
120
- async getLeagueDraft() {
121
- return this.leagueGet({ params: { view: View.MDraftDetail } });
122
- }
123
- async getPlayerCard(playerIds, maxScoringPeriod, additionalFilters) {
124
- const additionalValue = [`00${this.seasonId}`, `10${this.seasonId}`];
125
- if (additionalFilters) additionalValue.push(...additionalFilters);
126
- const filters = { players: {
127
- filterIds: { value: playerIds },
128
- filterStatsForTopScoringPeriodIds: {
129
- value: maxScoringPeriod,
130
- additionalValue
131
- }
132
- } };
133
- return this.leagueGet({
134
- params: { view: View.KonaPlayerCard },
135
- headers: { "x-fantasy-filter": JSON.stringify(filters) }
136
- });
137
- }
138
- async getPlayerNews(playerId) {
139
- return this.newsGet({ params: { playerId } });
140
- }
141
- };
142
- //#endregion
143
- export { EspnClient };
144
-
1
+ import { FANTASY_BASE_ENDPOINT, NEWS_BASE_ENDPOINT, SPORT_PATH, View } from './constants.js';
2
+ import { EspnAccessDenied, EspnApiError, EspnInvalidLeague, assertEspnResponse, } from './errors.js';
3
+ import { buildCookieHeader, buildQueryString } from './utils.js';
4
+ export class EspnClient {
5
+ leagueId;
6
+ seasonId;
7
+ fetchFn;
8
+ cookieHeader;
9
+ endpoint;
10
+ newsEndpoint;
11
+ leagueEndpoint;
12
+ constructor(options) {
13
+ this.leagueId = options.leagueId;
14
+ this.seasonId = options.seasonId;
15
+ this.fetchFn = options.fetch ?? globalThis.fetch;
16
+ this.cookieHeader = buildCookieHeader(options.espnS2, options.swid);
17
+ this.endpoint = `${FANTASY_BASE_ENDPOINT}${SPORT_PATH}/seasons/${options.seasonId}`;
18
+ this.newsEndpoint = `${NEWS_BASE_ENDPOINT}${SPORT_PATH}/news/players`;
19
+ this.leagueEndpoint = this.buildLeagueEndpoint(options.seasonId, options.leagueId);
20
+ }
21
+ buildLeagueEndpoint(seasonId, leagueId) {
22
+ const base = `${FANTASY_BASE_ENDPOINT}${SPORT_PATH}`;
23
+ if (seasonId < 2018) {
24
+ return `${base}/leagueHistory/${leagueId}?seasonId=${seasonId}`;
25
+ }
26
+ return `${base}/seasons/${seasonId}/segments/0/leagues/${leagueId}`;
27
+ }
28
+ swapLeagueEndpoint() {
29
+ const base = `${FANTASY_BASE_ENDPOINT}${SPORT_PATH}`;
30
+ if (this.leagueEndpoint.includes('/leagueHistory/')) {
31
+ this.leagueEndpoint = `${base}/seasons/${this.seasonId}/segments/0/leagues/${this.leagueId}`;
32
+ }
33
+ else {
34
+ this.leagueEndpoint = `${base}/leagueHistory/${this.leagueId}?seasonId=${this.seasonId}`;
35
+ }
36
+ }
37
+ async requestJson(url, init) {
38
+ const headers = new Headers(init?.headers);
39
+ if (this.cookieHeader) {
40
+ headers.set('Cookie', this.cookieHeader);
41
+ }
42
+ const response = await this.fetchFn(url, { ...init, headers });
43
+ return { response, body: await response.json() };
44
+ }
45
+ async checkLeagueStatus(status, extend, params, headers) {
46
+ if (status === 401) {
47
+ const originalEndpoint = this.leagueEndpoint;
48
+ this.swapLeagueEndpoint();
49
+ const query = buildQueryString(params ?? {});
50
+ const url = `${this.leagueEndpoint}${extend}${query}`;
51
+ const retryHeaders = new Headers(headers);
52
+ if (this.cookieHeader) {
53
+ retryHeaders.set('Cookie', this.cookieHeader);
54
+ }
55
+ const retryResponse = await this.fetchFn(url, { headers: retryHeaders });
56
+ if (retryResponse.ok) {
57
+ return retryResponse.json();
58
+ }
59
+ this.leagueEndpoint = originalEndpoint;
60
+ if (!this.cookieHeader) {
61
+ throw new EspnAccessDenied();
62
+ }
63
+ throw new EspnAccessDenied(`League ${this.leagueId} cannot be accessed with the provided credentials`);
64
+ }
65
+ if (status === 404) {
66
+ throw new EspnInvalidLeague(this.leagueId);
67
+ }
68
+ if (status !== 200) {
69
+ throw new EspnApiError(status);
70
+ }
71
+ return null;
72
+ }
73
+ async leagueGet(options = {}) {
74
+ const { params, headers, extend = '' } = options;
75
+ const query = buildQueryString(params ?? {});
76
+ const url = `${this.leagueEndpoint}${extend}${query}`;
77
+ const requestHeaders = new Headers(headers);
78
+ if (this.cookieHeader) {
79
+ requestHeaders.set('Cookie', this.cookieHeader);
80
+ }
81
+ const response = await this.fetchFn(url, { headers: requestHeaders });
82
+ const alternate = await this.checkLeagueStatus(response.status, extend, params, headers);
83
+ let data;
84
+ if (alternate !== null) {
85
+ data = alternate;
86
+ }
87
+ else if (!response.ok) {
88
+ throw new EspnApiError(response.status);
89
+ }
90
+ else {
91
+ data = await response.json();
92
+ }
93
+ if (Array.isArray(data)) {
94
+ data = data[0];
95
+ }
96
+ assertEspnResponse(data);
97
+ return data;
98
+ }
99
+ async get(options = {}) {
100
+ const { params, headers, extend = '' } = options;
101
+ const query = buildQueryString(params ?? {});
102
+ const url = `${this.endpoint}${extend}${query}`;
103
+ const requestHeaders = new Headers(headers);
104
+ if (this.cookieHeader) {
105
+ requestHeaders.set('Cookie', this.cookieHeader);
106
+ }
107
+ const response = await this.fetchFn(url, { headers: requestHeaders });
108
+ await this.checkLeagueStatus(response.status, extend, params, headers);
109
+ if (!response.ok) {
110
+ throw new EspnApiError(response.status);
111
+ }
112
+ const data = await response.json();
113
+ assertEspnResponse(data);
114
+ return data;
115
+ }
116
+ async newsGet(options = {}) {
117
+ const { params, headers, extend = '' } = options;
118
+ const query = buildQueryString(params ?? {});
119
+ const url = `${this.newsEndpoint}${extend}${query}`;
120
+ const requestHeaders = new Headers(headers);
121
+ if (this.cookieHeader) {
122
+ requestHeaders.set('Cookie', this.cookieHeader);
123
+ }
124
+ const response = await this.fetchFn(url, { headers: requestHeaders });
125
+ if (!response.ok) {
126
+ throw new EspnApiError(response.status);
127
+ }
128
+ return response.json();
129
+ }
130
+ async getLeague() {
131
+ return this.leagueGet({
132
+ params: {
133
+ view: [
134
+ View.MTeam,
135
+ View.MRoster,
136
+ View.MMatchup,
137
+ View.MSettings,
138
+ View.MStandings,
139
+ ],
140
+ },
141
+ });
142
+ }
143
+ async getProSchedule() {
144
+ return (await this.get({
145
+ params: { view: View.ProTeamSchedules },
146
+ }));
147
+ }
148
+ async getProPlayers() {
149
+ const filters = { filterActive: { value: true } };
150
+ const data = await this.get({
151
+ extend: '/players',
152
+ params: { view: View.Players },
153
+ headers: { 'x-fantasy-filter': JSON.stringify(filters) },
154
+ });
155
+ return data;
156
+ }
157
+ async getLeagueDraft() {
158
+ return this.leagueGet({
159
+ params: { view: View.MDraftDetail },
160
+ });
161
+ }
162
+ async getPlayerCard(playerIds, maxScoringPeriod, additionalFilters) {
163
+ const additionalValue = [`00${this.seasonId}`, `10${this.seasonId}`];
164
+ if (additionalFilters) {
165
+ additionalValue.push(...additionalFilters);
166
+ }
167
+ const filters = {
168
+ players: {
169
+ filterIds: { value: playerIds },
170
+ filterStatsForTopScoringPeriodIds: {
171
+ value: maxScoringPeriod,
172
+ additionalValue,
173
+ },
174
+ },
175
+ };
176
+ return this.leagueGet({
177
+ params: { view: View.KonaPlayerCard },
178
+ headers: { 'x-fantasy-filter': JSON.stringify(filters) },
179
+ });
180
+ }
181
+ async getPlayerNews(playerId) {
182
+ return this.newsGet({ params: { playerId } });
183
+ }
184
+ }
145
185
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":[],"sources":["../../src/espn/client.ts"],"sourcesContent":["import { FANTASY_BASE_ENDPOINT, NEWS_BASE_ENDPOINT, SPORT_PATH, View } from './constants.js';\nimport {\n EspnAccessDenied,\n EspnApiError,\n EspnInvalidLeague,\n assertEspnResponse,\n} from './errors.js';\nimport type { EspnLeagueResponse, EspnProPlayer, EspnProScheduleResponse } from './types/raw.js';\nimport { buildCookieHeader, buildQueryString } from './utils.js';\n\nexport interface EspnClientOptions {\n leagueId: number;\n seasonId: number;\n espnS2?: string;\n swid?: string;\n fetch?: typeof globalThis.fetch;\n}\n\nexport interface RequestOptions {\n params?: Record<string, string | number | string[] | number[] | undefined>;\n headers?: Record<string, string>;\n extend?: string;\n}\n\nexport class EspnClient {\n readonly leagueId: number;\n readonly seasonId: number;\n\n private readonly fetchFn: typeof globalThis.fetch;\n private readonly cookieHeader: string | undefined;\n private readonly endpoint: string;\n private readonly newsEndpoint: string;\n private leagueEndpoint: string;\n\n constructor(options: EspnClientOptions) {\n this.leagueId = options.leagueId;\n this.seasonId = options.seasonId;\n this.fetchFn = options.fetch ?? globalThis.fetch;\n this.cookieHeader = buildCookieHeader(options.espnS2, options.swid);\n this.endpoint = `${FANTASY_BASE_ENDPOINT}${SPORT_PATH}/seasons/${options.seasonId}`;\n this.newsEndpoint = `${NEWS_BASE_ENDPOINT}${SPORT_PATH}/news/players`;\n this.leagueEndpoint = this.buildLeagueEndpoint(options.seasonId, options.leagueId);\n }\n\n private buildLeagueEndpoint(seasonId: number, leagueId: number): string {\n const base = `${FANTASY_BASE_ENDPOINT}${SPORT_PATH}`;\n if (seasonId < 2018) {\n return `${base}/leagueHistory/${leagueId}?seasonId=${seasonId}`;\n }\n return `${base}/seasons/${seasonId}/segments/0/leagues/${leagueId}`;\n }\n\n private swapLeagueEndpoint(): void {\n const base = `${FANTASY_BASE_ENDPOINT}${SPORT_PATH}`;\n if (this.leagueEndpoint.includes('/leagueHistory/')) {\n this.leagueEndpoint = `${base}/seasons/${this.seasonId}/segments/0/leagues/${this.leagueId}`;\n } else {\n this.leagueEndpoint = `${base}/leagueHistory/${this.leagueId}?seasonId=${this.seasonId}`;\n }\n }\n\n private async requestJson(url: string, init?: RequestInit): Promise<unknown> {\n const headers = new Headers(init?.headers);\n if (this.cookieHeader) {\n headers.set('Cookie', this.cookieHeader);\n }\n\n const response = await this.fetchFn(url, { ...init, headers });\n return { response, body: await response.json() };\n }\n\n private async checkLeagueStatus(\n status: number,\n extend: string,\n params?: RequestOptions['params'],\n headers?: Record<string, string>,\n ): Promise<unknown | null> {\n if (status === 401) {\n const originalEndpoint = this.leagueEndpoint;\n this.swapLeagueEndpoint();\n\n const query = buildQueryString(params ?? {});\n const url = `${this.leagueEndpoint}${extend}${query}`;\n const retryHeaders = new Headers(headers);\n if (this.cookieHeader) {\n retryHeaders.set('Cookie', this.cookieHeader);\n }\n\n const retryResponse = await this.fetchFn(url, { headers: retryHeaders });\n if (retryResponse.ok) {\n return retryResponse.json();\n }\n\n this.leagueEndpoint = originalEndpoint;\n if (!this.cookieHeader) {\n throw new EspnAccessDenied();\n }\n throw new EspnAccessDenied(\n `League ${this.leagueId} cannot be accessed with the provided credentials`,\n );\n }\n\n if (status === 404) {\n throw new EspnInvalidLeague(this.leagueId);\n }\n\n if (status !== 200) {\n throw new EspnApiError(status);\n }\n\n return null;\n }\n\n async leagueGet(options: RequestOptions = {}): Promise<EspnLeagueResponse> {\n const { params, headers, extend = '' } = options;\n const query = buildQueryString(params ?? {});\n const url = `${this.leagueEndpoint}${extend}${query}`;\n\n const requestHeaders = new Headers(headers);\n if (this.cookieHeader) {\n requestHeaders.set('Cookie', this.cookieHeader);\n }\n\n const response = await this.fetchFn(url, { headers: requestHeaders });\n const alternate = await this.checkLeagueStatus(response.status, extend, params, headers);\n\n let data: unknown;\n if (alternate !== null) {\n data = alternate;\n } else if (!response.ok) {\n throw new EspnApiError(response.status);\n } else {\n data = await response.json();\n }\n\n if (Array.isArray(data)) {\n data = data[0];\n }\n\n assertEspnResponse(data);\n return data as EspnLeagueResponse;\n }\n\n async get(options: RequestOptions = {}): Promise<unknown> {\n const { params, headers, extend = '' } = options;\n const query = buildQueryString(params ?? {});\n const url = `${this.endpoint}${extend}${query}`;\n\n const requestHeaders = new Headers(headers);\n if (this.cookieHeader) {\n requestHeaders.set('Cookie', this.cookieHeader);\n }\n\n const response = await this.fetchFn(url, { headers: requestHeaders });\n await this.checkLeagueStatus(response.status, extend, params, headers);\n\n if (!response.ok) {\n throw new EspnApiError(response.status);\n }\n\n const data = await response.json();\n assertEspnResponse(data);\n return data;\n }\n\n async newsGet(options: RequestOptions = {}): Promise<unknown> {\n const { params, headers, extend = '' } = options;\n const query = buildQueryString(params ?? {});\n const url = `${this.newsEndpoint}${extend}${query}`;\n\n const requestHeaders = new Headers(headers);\n if (this.cookieHeader) {\n requestHeaders.set('Cookie', this.cookieHeader);\n }\n\n const response = await this.fetchFn(url, { headers: requestHeaders });\n if (!response.ok) {\n throw new EspnApiError(response.status);\n }\n\n return response.json();\n }\n\n async getLeague(): Promise<EspnLeagueResponse> {\n return this.leagueGet({\n params: {\n view: [\n View.MTeam,\n View.MRoster,\n View.MMatchup,\n View.MSettings,\n View.MStandings,\n ],\n },\n });\n }\n\n async getProSchedule(): Promise<EspnProScheduleResponse> {\n return (await this.get({\n params: { view: View.ProTeamSchedules },\n })) as EspnProScheduleResponse;\n }\n\n async getProPlayers(): Promise<EspnProPlayer[]> {\n const filters = { filterActive: { value: true } };\n const data = await this.get({\n extend: '/players',\n params: { view: View.Players },\n headers: { 'x-fantasy-filter': JSON.stringify(filters) },\n });\n return data as EspnProPlayer[];\n }\n\n async getLeagueDraft(): Promise<EspnLeagueResponse> {\n return this.leagueGet({\n params: { view: View.MDraftDetail },\n });\n }\n\n async getPlayerCard(\n playerIds: number[],\n maxScoringPeriod: number,\n additionalFilters?: string[],\n ): Promise<EspnLeagueResponse> {\n const additionalValue = [`00${this.seasonId}`, `10${this.seasonId}`];\n if (additionalFilters) {\n additionalValue.push(...additionalFilters);\n }\n\n const filters = {\n players: {\n filterIds: { value: playerIds },\n filterStatsForTopScoringPeriodIds: {\n value: maxScoringPeriod,\n additionalValue,\n },\n },\n };\n\n return this.leagueGet({\n params: { view: View.KonaPlayerCard },\n headers: { 'x-fantasy-filter': JSON.stringify(filters) },\n });\n }\n\n async getPlayerNews(playerId: number): Promise<unknown> {\n return this.newsGet({ params: { playerId } });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/espn/client.ts"],"names":[],"mappings":"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"}