fantasy-basketball-sdk 0.0.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.
- package/AGENTS.md +101 -0
- package/LICENSE +13 -0
- package/README.md +195 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +2 -0
- package/dist/core/providers.d.ts +2 -0
- package/dist/core/providers.d.ts.map +1 -0
- package/dist/core/providers.js +10 -0
- package/dist/core/providers.js.map +1 -0
- package/dist/core/types.d.ts +2 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/espn/client.d.ts +37 -0
- package/dist/espn/client.d.ts.map +1 -0
- package/dist/espn/client.js +145 -0
- package/dist/espn/client.js.map +1 -0
- package/dist/espn/constants.d.ts +34 -0
- package/dist/espn/constants.d.ts.map +1 -0
- package/dist/espn/constants.js +189 -0
- package/dist/espn/constants.js.map +1 -0
- package/dist/espn/errors.d.ts +19 -0
- package/dist/espn/errors.d.ts.map +1 -0
- package/dist/espn/errors.js +34 -0
- package/dist/espn/errors.js.map +1 -0
- package/dist/espn/index.d.ts +18 -0
- package/dist/espn/index.d.ts.map +1 -0
- package/dist/espn/index.js +19 -0
- package/dist/espn/index.js.map +1 -0
- package/dist/espn/league.d.ts +76 -0
- package/dist/espn/league.d.ts.map +1 -0
- package/dist/espn/league.js +285 -0
- package/dist/espn/league.js.map +1 -0
- package/dist/espn/models/activity.d.ts +14 -0
- package/dist/espn/models/activity.d.ts.map +1 -0
- package/dist/espn/models/activity.js +36 -0
- package/dist/espn/models/activity.js.map +1 -0
- package/dist/espn/models/box-player.d.ts +11 -0
- package/dist/espn/models/box-player.d.ts.map +1 -0
- package/dist/espn/models/box-player.js +37 -0
- package/dist/espn/models/box-player.js.map +1 -0
- package/dist/espn/models/box-score.d.ts +45 -0
- package/dist/espn/models/box-score.d.ts.map +1 -0
- package/dist/espn/models/box-score.js +111 -0
- package/dist/espn/models/box-score.js.map +1 -0
- package/dist/espn/models/matchup.d.ts +22 -0
- package/dist/espn/models/matchup.d.ts.map +1 -0
- package/dist/espn/models/matchup.js +51 -0
- package/dist/espn/models/matchup.js.map +1 -0
- package/dist/espn/models/pick.d.ts +13 -0
- package/dist/espn/models/pick.d.ts.map +1 -0
- package/dist/espn/models/pick.js +25 -0
- package/dist/espn/models/pick.js.map +1 -0
- package/dist/espn/models/player.d.ts +47 -0
- package/dist/espn/models/player.d.ts.map +1 -0
- package/dist/espn/models/player.js +120 -0
- package/dist/espn/models/player.js.map +1 -0
- package/dist/espn/models/settings.d.ts +29 -0
- package/dist/espn/models/settings.d.ts.map +1 -0
- package/dist/espn/models/settings.js +64 -0
- package/dist/espn/models/settings.js.map +1 -0
- package/dist/espn/models/team.d.ts +33 -0
- package/dist/espn/models/team.d.ts.map +1 -0
- package/dist/espn/models/team.js +81 -0
- package/dist/espn/models/team.js.map +1 -0
- package/dist/espn/models/transaction.d.ts +18 -0
- package/dist/espn/models/transaction.d.ts.map +1 -0
- package/dist/espn/models/transaction.js +32 -0
- package/dist/espn/models/transaction.js.map +1 -0
- package/dist/espn/types/raw.d.ts +26 -0
- package/dist/espn/types/raw.d.ts.map +1 -0
- package/dist/espn/utils.d.ts +5 -0
- package/dist/espn/utils.d.ts.map +1 -0
- package/dist/espn/utils.js +35 -0
- package/dist/espn/utils.js.map +1 -0
- package/dist/fantrax/index.d.ts +2 -0
- package/dist/fantrax/index.d.ts.map +1 -0
- package/dist/fantrax/index.js +6 -0
- package/dist/fantrax/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/runtime/fetch.d.ts +5 -0
- package/dist/runtime/fetch.d.ts.map +1 -0
- package/dist/runtime/fetch.js +8 -0
- package/dist/runtime/fetch.js.map +1 -0
- package/dist/runtime/index.d.ts +3 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +2 -0
- package/dist/yahoo/client.d.ts +22 -0
- package/dist/yahoo/client.d.ts.map +1 -0
- package/dist/yahoo/client.js +89 -0
- package/dist/yahoo/client.js.map +1 -0
- package/dist/yahoo/constants.d.ts +41 -0
- package/dist/yahoo/constants.d.ts.map +1 -0
- package/dist/yahoo/constants.js +42 -0
- package/dist/yahoo/constants.js.map +1 -0
- package/dist/yahoo/errors.d.ts +24 -0
- package/dist/yahoo/errors.d.ts.map +1 -0
- package/dist/yahoo/errors.js +51 -0
- package/dist/yahoo/errors.js.map +1 -0
- package/dist/yahoo/index.d.ts +30 -0
- package/dist/yahoo/index.d.ts.map +1 -0
- package/dist/yahoo/index.js +23 -0
- package/dist/yahoo/index.js.map +1 -0
- package/dist/yahoo/keys.d.ts +29 -0
- package/dist/yahoo/keys.d.ts.map +1 -0
- package/dist/yahoo/keys.js +63 -0
- package/dist/yahoo/keys.js.map +1 -0
- package/dist/yahoo/models/game.d.ts +31 -0
- package/dist/yahoo/models/game.d.ts.map +1 -0
- package/dist/yahoo/models/game.js +68 -0
- package/dist/yahoo/models/game.js.map +1 -0
- package/dist/yahoo/models/league.d.ts +62 -0
- package/dist/yahoo/models/league.d.ts.map +1 -0
- package/dist/yahoo/models/league.js +129 -0
- package/dist/yahoo/models/league.js.map +1 -0
- package/dist/yahoo/models/matchup.d.ts +12 -0
- package/dist/yahoo/models/matchup.d.ts.map +1 -0
- package/dist/yahoo/models/matchup.js +46 -0
- package/dist/yahoo/models/matchup.js.map +1 -0
- package/dist/yahoo/models/player.d.ts +34 -0
- package/dist/yahoo/models/player.d.ts.map +1 -0
- package/dist/yahoo/models/player.js +44 -0
- package/dist/yahoo/models/player.js.map +1 -0
- package/dist/yahoo/models/roster.d.ts +16 -0
- package/dist/yahoo/models/roster.d.ts.map +1 -0
- package/dist/yahoo/models/roster.js +46 -0
- package/dist/yahoo/models/roster.js.map +1 -0
- package/dist/yahoo/models/settings.d.ts +21 -0
- package/dist/yahoo/models/settings.d.ts.map +1 -0
- package/dist/yahoo/models/settings.js +79 -0
- package/dist/yahoo/models/settings.js.map +1 -0
- package/dist/yahoo/models/team.d.ts +40 -0
- package/dist/yahoo/models/team.d.ts.map +1 -0
- package/dist/yahoo/models/team.js +46 -0
- package/dist/yahoo/models/team.js.map +1 -0
- package/dist/yahoo/models/transaction.d.ts +10 -0
- package/dist/yahoo/models/transaction.d.ts.map +1 -0
- package/dist/yahoo/models/transaction.js +20 -0
- package/dist/yahoo/models/transaction.js.map +1 -0
- package/dist/yahoo/models/user.d.ts +19 -0
- package/dist/yahoo/models/user.d.ts.map +1 -0
- package/dist/yahoo/models/user.js +36 -0
- package/dist/yahoo/models/user.js.map +1 -0
- package/dist/yahoo/parse.d.ts +26 -0
- package/dist/yahoo/parse.d.ts.map +1 -0
- package/dist/yahoo/parse.js +116 -0
- package/dist/yahoo/parse.js.map +1 -0
- package/dist/yahoo/types/raw.d.ts +10 -0
- package/dist/yahoo/types/raw.d.ts.map +1 -0
- package/dist/yahoo/write/roster.d.ts +7 -0
- package/dist/yahoo/write/roster.d.ts.map +1 -0
- package/dist/yahoo/write/roster.js +13 -0
- package/dist/yahoo/write/roster.js.map +1 -0
- package/dist/yahoo/write/transactions.d.ts +42 -0
- package/dist/yahoo/write/transactions.d.ts.map +1 -0
- package/dist/yahoo/write/transactions.js +51 -0
- package/dist/yahoo/write/transactions.js.map +1 -0
- package/dist/yahoo/xml.d.ts +42 -0
- package/dist/yahoo/xml.d.ts.map +1 -0
- package/dist/yahoo/xml.js +118 -0
- package/dist/yahoo/xml.js.map +1 -0
- package/package.json +79 -0
package/AGENTS.md
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Fantasy Basketball SDK — Agent Guide
|
|
2
|
+
|
|
3
|
+
Tree-shakeable, ESM-only TypeScript SDK for fantasy basketball APIs (ESPN, Yahoo, Fantrax, extensible). Infra-first phase: scaffold and build pipeline only until provider logic is explicitly requested.
|
|
4
|
+
|
|
5
|
+
## Architecture
|
|
6
|
+
|
|
7
|
+
- **Subpath exports** — import one provider without pulling others: `fantasy-basketball-sdk/espn`, `/yahoo`, `/fantrax`
|
|
8
|
+
- **`src/core/`** — shared types and errors (no provider-specific code)
|
|
9
|
+
- **`src/runtime/`** — web-standard adapters (`fetch`, `URL`, `Headers`); no `node:*` imports
|
|
10
|
+
- **`src/<provider>/`** — one folder per fantasy platform
|
|
11
|
+
|
|
12
|
+
```text
|
|
13
|
+
Consumers → package.json exports → provider → core → runtime
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Build, Test & Lint
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm ci
|
|
20
|
+
npm run typecheck
|
|
21
|
+
npm run lint
|
|
22
|
+
npm run test
|
|
23
|
+
npm run build
|
|
24
|
+
npm run verify # publint + scripts/verify-dist.mjs (dist ESM smoke imports)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Watch rebuild during development:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm run dev
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Code Conventions
|
|
34
|
+
|
|
35
|
+
- **ESM only** — `"type": "module"`; use `.js` extensions in relative imports (`./foo.js`)
|
|
36
|
+
- **Strict TypeScript** — `verbatimModuleSyntax`, no `any` without justification
|
|
37
|
+
- **Web-standard APIs only** in `src/` — `fetch`, `URL`, `Headers`; no `process.env`, no `node:*`, no `require()`
|
|
38
|
+
- **Tree-shaking** — add providers as subpath entries, not giant root barrels
|
|
39
|
+
- **Side effects** — keep `"sideEffects": false`; avoid top-level side effects in modules
|
|
40
|
+
|
|
41
|
+
## File Structure
|
|
42
|
+
|
|
43
|
+
```text
|
|
44
|
+
src/
|
|
45
|
+
index.ts # minimal root re-exports
|
|
46
|
+
core/ # shared types
|
|
47
|
+
runtime/ # FetchClient and adapters
|
|
48
|
+
espn/index.ts
|
|
49
|
+
yahoo/index.ts
|
|
50
|
+
fantrax/index.ts
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Build output mirrors `src/` under `dist/` via Vite `preserveModules` + `tsc --emitDeclarationOnly`.
|
|
54
|
+
|
|
55
|
+
## Adding a New Provider
|
|
56
|
+
|
|
57
|
+
1. Create `src/<provider>/index.ts` with a `PROVIDER` constant or stub exports
|
|
58
|
+
2. Add Vite lib entry in `vite.config.ts`: `'<provider>/index': resolve(__dirname, 'src/<provider>/index.ts')`
|
|
59
|
+
3. Add `exports["./<provider>"]` in `package.json` (`types` + `import` paths under `dist/`)
|
|
60
|
+
4. Add a smoke test in `test/exports.test.ts`
|
|
61
|
+
5. Run `npm run build && npm run verify`
|
|
62
|
+
|
|
63
|
+
## Releases
|
|
64
|
+
|
|
65
|
+
Merges to `main` run the `verify` job, then a `release` job that uses [semantic-release](https://github.com/semantic-release/semantic-release) to publish to npm when the squash-merge commit is releasable.
|
|
66
|
+
|
|
67
|
+
- **Do not manually bump `package.json` version** for routine releases — git tags and GitHub Releases are the source of truth
|
|
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
|
|
70
|
+
- **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
|
+
## Runtime Import Examples
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
// Node 18+, Bun
|
|
76
|
+
import { PROVIDER } from 'fantasy-basketball-sdk/espn';
|
|
77
|
+
|
|
78
|
+
// Deno
|
|
79
|
+
import { PROVIDER } from 'npm:fantasy-basketball-sdk/espn';
|
|
80
|
+
|
|
81
|
+
// Browser / Cloudflare Workers (bundle or bare ESM)
|
|
82
|
+
import { PROVIDER } from 'fantasy-basketball-sdk/espn';
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Boundaries
|
|
86
|
+
|
|
87
|
+
- Do not commit secrets, tokens, or real league credentials
|
|
88
|
+
- Do not implement ESPN/Yahoo/Fantrax API logic unless explicitly asked
|
|
89
|
+
- Do not add CJS output or `require()` compatibility
|
|
90
|
+
- Do not import Node built-ins in `src/`
|
|
91
|
+
- Do not expand root `src/index.ts` with provider implementations (breaks tree-shaking)
|
|
92
|
+
|
|
93
|
+
## Common Mistakes
|
|
94
|
+
|
|
95
|
+
| Wrong | Correct |
|
|
96
|
+
| ------------------------------------------------------- | ----------------------------------------------- |
|
|
97
|
+
| `import from 'fantasy-basketball-sdk'` for one provider | `import from 'fantasy-basketball-sdk/espn'` |
|
|
98
|
+
| `import './foo'` without `.js` extension | `import './foo.js'` |
|
|
99
|
+
| `import fs from 'node:fs'` in library code | Use web APIs or accept injection via `runtime/` |
|
|
100
|
+
| Re-export all providers from root index | Keep root minimal; use subpaths |
|
|
101
|
+
| `process.env.YAHOO_TOKEN` in SDK | Pass config from consumer explicitly |
|
package/LICENSE
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Copyright (c) 2026, Yakov Rakhamimov
|
|
2
|
+
|
|
3
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
4
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
5
|
+
copyright notice and this permission notice appear in all copies.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
8
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
9
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
10
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
11
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
12
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
13
|
+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<h1 align="center">fantasy-basketball-sdk</h1>
|
|
3
|
+
<p align="center">
|
|
4
|
+
Tree-shakeable fantasy basketball API SDK for ESPN, Yahoo, Fantrax, and more
|
|
5
|
+
<br/>
|
|
6
|
+
by <a href="https://github.com/jacobra19">Yakov Rakhamimov</a>
|
|
7
|
+
</p>
|
|
8
|
+
</p>
|
|
9
|
+
<br/>
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<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
|
+
<a href="https://opensource.org/licenses/MIT" rel="nofollow"><img src="https://img.shields.io/github/license/jacobra19/fantasy-basketball-sdk" alt="License"></a>
|
|
14
|
+
<a href="https://www.npmjs.com/package/fantasy-basketball-sdk" rel="nofollow"><img src="https://img.shields.io/npm/dw/fantasy-basketball-sdk.svg" alt="npm"></a>
|
|
15
|
+
<a href="https://github.com/jacobra19/fantasy-basketball-sdk" rel="nofollow"><img src="https://img.shields.io/github/stars/jacobra19/fantasy-basketball-sdk" alt="stars"></a>
|
|
16
|
+
</p>
|
|
17
|
+
|
|
18
|
+
<div align="center">
|
|
19
|
+
<a href="#quick-start">Quick start</a>
|
|
20
|
+
<span> • </span>
|
|
21
|
+
<a href="./CONTRIBUTING.md">Contributing</a>
|
|
22
|
+
<span> • </span>
|
|
23
|
+
<a href="./AGENTS.md">Agents</a>
|
|
24
|
+
<span> • </span>
|
|
25
|
+
<a href="https://github.com/jacobra19/fantasy-basketball-sdk">GitHub</a>
|
|
26
|
+
<br />
|
|
27
|
+
</div>
|
|
28
|
+
|
|
29
|
+
<br/>
|
|
30
|
+
|
|
31
|
+
> **Early development** — ESPN and Yahoo NBA APIs are available. Fantrax is still a placeholder.
|
|
32
|
+
|
|
33
|
+
## Features
|
|
34
|
+
|
|
35
|
+
- **ESM-only** with TypeScript types included (`dist/*.d.ts`)
|
|
36
|
+
- **Subpath imports** per provider — `fantasy-basketball-sdk/espn`, `/yahoo`, `/fantrax`
|
|
37
|
+
- Shared **`/core`** (types, shared constants) and **`/runtime`** (web-standard HTTP adapters)
|
|
38
|
+
- Runs in **Node.js 18+**, **Bun**, **Deno**, **browsers**, and **Cloudflare Workers** (uses `fetch`, no Node built-ins in library code)
|
|
39
|
+
|
|
40
|
+
## Requirements
|
|
41
|
+
|
|
42
|
+
- **Node.js >= 18** (when using Node)
|
|
43
|
+
- An **ESM** consumer project (`"type": "module"` in `package.json`, or a bundler that resolves ESM)
|
|
44
|
+
|
|
45
|
+
## Installation
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
npm install fantasy-basketball-sdk
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Releases are published automatically to npm when releasable changes merge to `main`. See [CONTRIBUTING.md](./CONTRIBUTING.md#releases) for how versioning works.
|
|
52
|
+
|
|
53
|
+
For local development or testing before a release:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npm install /path/to/fantasy-basketball-sdk
|
|
57
|
+
# or: npm install github:jacobra19/fantasy-basketball-sdk
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Quick start
|
|
61
|
+
|
|
62
|
+
Import only what you need. Prefer a **provider subpath** when you work with one platform so bundlers can tree-shake the rest.
|
|
63
|
+
|
|
64
|
+
### ESPN (Node / Bun)
|
|
65
|
+
|
|
66
|
+
```ts
|
|
67
|
+
import { League } from 'fantasy-basketball-sdk/espn';
|
|
68
|
+
|
|
69
|
+
// Public leagues: omit espnS2 and swid. Private leagues: pass ESPN session cookies.
|
|
70
|
+
const league = await League.create({
|
|
71
|
+
leagueId: 123456,
|
|
72
|
+
seasonId: 2025,
|
|
73
|
+
espnS2: '...',
|
|
74
|
+
swid: '{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}',
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
console.log(league.settings.name);
|
|
78
|
+
|
|
79
|
+
for (const team of league.standings()) {
|
|
80
|
+
console.log(team.teamName, team.wins, team.losses);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const matchups = await league.scoreboard();
|
|
84
|
+
const freeAgents = await league.freeAgents({ size: 25 });
|
|
85
|
+
const transactions = await league.transactions();
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
`League.create` loads league data by default. Pass `fetchLeague: false` to construct without an initial fetch, then call `await league.fetchLeague()` when ready.
|
|
89
|
+
|
|
90
|
+
### Yahoo (Node / Bun)
|
|
91
|
+
|
|
92
|
+
Yahoo requires an OAuth 2.0 access token with Fantasy Sports scope. Obtain tokens via the [Yahoo OAuth 2.0 guide](https://developer.yahoo.com/oauth2/guide/) in your app, then pass the token to the SDK:
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
import { Game, League, YahooClient, addPlayer, setLineup } from 'fantasy-basketball-sdk/yahoo';
|
|
96
|
+
|
|
97
|
+
const accessToken = '...'; // from your OAuth flow
|
|
98
|
+
|
|
99
|
+
// Discover leagues for the logged-in user
|
|
100
|
+
const game = Game.forNba(new YahooClient({ accessToken }));
|
|
101
|
+
const leagueKeys = await game.leagueKeys({ seasons: ['2025'] });
|
|
102
|
+
|
|
103
|
+
// Load a league by key or by numeric id + season
|
|
104
|
+
const league = await League.create({
|
|
105
|
+
leagueKey: leagueKeys[0],
|
|
106
|
+
accessToken,
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
console.log(league.settings?.name);
|
|
110
|
+
|
|
111
|
+
const standings = await league.standings();
|
|
112
|
+
const matchups = await league.scoreboard();
|
|
113
|
+
const freeAgents = await league.players({ status: 'FA', count: 25 });
|
|
114
|
+
|
|
115
|
+
// Write: lineup edit (NBA uses date-based rosters)
|
|
116
|
+
const team = league.toTeam(`${league.leagueKey}.t.1`);
|
|
117
|
+
await setLineup(team, {
|
|
118
|
+
date: '2025-01-15',
|
|
119
|
+
moves: [{ playerKey: '466.p.1234', position: 'PG' }],
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
// Write: add a free agent
|
|
123
|
+
await addPlayer(league, {
|
|
124
|
+
teamKey: `${league.leagueKey}.t.1`,
|
|
125
|
+
playerKey: '466.p.5678',
|
|
126
|
+
});
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Pass `refreshAccessToken` to `YahooClient` or `League.create` for automatic retry when the token expires.
|
|
130
|
+
|
|
131
|
+
### Deno
|
|
132
|
+
|
|
133
|
+
```ts
|
|
134
|
+
import { League } from 'npm:fantasy-basketball-sdk/espn';
|
|
135
|
+
|
|
136
|
+
const league = await League.create({ leagueId: 123456, seasonId: 2025 });
|
|
137
|
+
console.log(league.standings().map((team) => team.teamName));
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Browser / Cloudflare Workers
|
|
141
|
+
|
|
142
|
+
Use your bundler’s usual ESM resolution (Vite, webpack, esbuild, etc.):
|
|
143
|
+
|
|
144
|
+
```ts
|
|
145
|
+
import { League } from 'fantasy-basketball-sdk/espn';
|
|
146
|
+
|
|
147
|
+
const league = await League.create({ leagueId: 123456, seasonId: 2025 });
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Subpath exports
|
|
151
|
+
|
|
152
|
+
| Subpath | Purpose | Main symbols (today) |
|
|
153
|
+
| -------------------------------- | -------------------------- | ---------------------------------- |
|
|
154
|
+
| `fantasy-basketball-sdk` | Root entry | `Provider`, `PROVIDERS` |
|
|
155
|
+
| `fantasy-basketball-sdk/espn` | ESPN NBA read API | `League`, `Team`, `Player`, `Matchup` |
|
|
156
|
+
| `fantasy-basketball-sdk/yahoo` | Yahoo NBA API (read + write) | `League`, `Game`, `Team`, `Player`, `YahooClient` |
|
|
157
|
+
| `fantasy-basketball-sdk/fantrax` | Fantrax module | `PROVIDER` |
|
|
158
|
+
| `fantasy-basketball-sdk/core` | Shared types and constants | `Provider`, `PROVIDERS` |
|
|
159
|
+
| `fantasy-basketball-sdk/runtime` | HTTP adapter | `FetchClient`, `createFetchClient` |
|
|
160
|
+
|
|
161
|
+
## Tree-shaking
|
|
162
|
+
|
|
163
|
+
- Import `fantasy-basketball-sdk/espn` (or `/yahoo`, `/fantrax`) instead of the root package when you only need one platform.
|
|
164
|
+
- The package sets `"sideEffects": false` so unused modules can be dropped by your bundler.
|
|
165
|
+
|
|
166
|
+
## TypeScript
|
|
167
|
+
|
|
168
|
+
Types are published next to the JS output under `dist/`. You do not need `@types/fantasy-basketball-sdk`.
|
|
169
|
+
|
|
170
|
+
For best results, use a modern `moduleResolution` setting (`Node16`, `NodeNext`, or `Bundler`) and ESM in your project.
|
|
171
|
+
|
|
172
|
+
## Development
|
|
173
|
+
|
|
174
|
+
Clone the repo and run:
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
npm ci
|
|
178
|
+
npm run typecheck
|
|
179
|
+
npm run lint
|
|
180
|
+
npm run test
|
|
181
|
+
npm run build
|
|
182
|
+
npm run verify
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**Contributors:** see [CONTRIBUTING.md](./CONTRIBUTING.md) for the PR workflow, branch protection, and merge policy.
|
|
186
|
+
|
|
187
|
+
**Coding agents:** see [AGENTS.md](./AGENTS.md) for architecture, conventions, and how to add a new provider.
|
|
188
|
+
|
|
189
|
+
## Roadmap
|
|
190
|
+
|
|
191
|
+
ESPN and Yahoo NBA APIs are implemented. Fantrax client is planned.
|
|
192
|
+
|
|
193
|
+
## License
|
|
194
|
+
|
|
195
|
+
[ISC](./LICENSE)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/core/providers.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,uCAAsE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","names":[],"sources":["../../src/core/providers.ts"],"sourcesContent":["import type { Provider } from './types.js';\n\nexport const PROVIDERS = ['espn', 'yahoo', 'fantrax'] as const satisfies readonly Provider[];\n"],"mappings":";AAEA,IAAa,YAAY;CAAC;CAAQ;CAAS;AAAS"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { EspnLeagueResponse, EspnProPlayer, EspnProScheduleResponse } from './types/raw.js';
|
|
2
|
+
export interface EspnClientOptions {
|
|
3
|
+
leagueId: number;
|
|
4
|
+
seasonId: number;
|
|
5
|
+
espnS2?: string;
|
|
6
|
+
swid?: string;
|
|
7
|
+
fetch?: typeof globalThis.fetch;
|
|
8
|
+
}
|
|
9
|
+
export interface RequestOptions {
|
|
10
|
+
params?: Record<string, string | number | string[] | number[] | undefined>;
|
|
11
|
+
headers?: Record<string, string>;
|
|
12
|
+
extend?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare class EspnClient {
|
|
15
|
+
readonly leagueId: number;
|
|
16
|
+
readonly seasonId: number;
|
|
17
|
+
private readonly fetchFn;
|
|
18
|
+
private readonly cookieHeader;
|
|
19
|
+
private readonly endpoint;
|
|
20
|
+
private readonly newsEndpoint;
|
|
21
|
+
private leagueEndpoint;
|
|
22
|
+
constructor(options: EspnClientOptions);
|
|
23
|
+
private buildLeagueEndpoint;
|
|
24
|
+
private swapLeagueEndpoint;
|
|
25
|
+
private requestJson;
|
|
26
|
+
private checkLeagueStatus;
|
|
27
|
+
leagueGet(options?: RequestOptions): Promise<EspnLeagueResponse>;
|
|
28
|
+
get(options?: RequestOptions): Promise<unknown>;
|
|
29
|
+
newsGet(options?: RequestOptions): Promise<unknown>;
|
|
30
|
+
getLeague(): Promise<EspnLeagueResponse>;
|
|
31
|
+
getProSchedule(): Promise<EspnProScheduleResponse>;
|
|
32
|
+
getProPlayers(): Promise<EspnProPlayer[]>;
|
|
33
|
+
getLeagueDraft(): Promise<EspnLeagueResponse>;
|
|
34
|
+
getPlayerCard(playerIds: number[], maxScoringPeriod: number, additionalFilters?: string[]): Promise<EspnLeagueResponse>;
|
|
35
|
+
getPlayerNews(playerId: number): Promise<unknown>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/espn/client.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAGjG,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,UAAU;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,cAAc,CAAS;gBAEnB,OAAO,EAAE,iBAAiB;IAUtC,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,kBAAkB;YASZ,WAAW;YAUX,iBAAiB;IA0CzB,SAAS,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA8BpE,GAAG,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IAsBnD,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBvD,SAAS,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAcxC,cAAc,IAAI,OAAO,CAAC,uBAAuB,CAAC;IAMlD,aAAa,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAUzC,cAAc,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAM7C,aAAa,CACjB,SAAS,EAAE,MAAM,EAAE,EACnB,gBAAgB,EAAE,MAAM,EACxB,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAC3B,OAAO,CAAC,kBAAkB,CAAC;IAsBxB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAGxD"}
|
|
@@ -0,0 +1,145 @@
|
|
|
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
|
+
|
|
145
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export declare const FANTASY_BASE_ENDPOINT = "https://lm-api-reads.fantasy.espn.com/apis/v3/games/";
|
|
2
|
+
export declare const NEWS_BASE_ENDPOINT = "https://site.api.espn.com/apis/fantasy/v3/games/";
|
|
3
|
+
export declare const SPORT_PATH = "fba";
|
|
4
|
+
export declare const View: {
|
|
5
|
+
readonly Modular: "modular";
|
|
6
|
+
readonly MNav: "mNav";
|
|
7
|
+
readonly MSettings: "mSettings";
|
|
8
|
+
readonly MStatus: "mStatus";
|
|
9
|
+
readonly MTeam: "mTeam";
|
|
10
|
+
readonly MBoxscore: "mBoxscore";
|
|
11
|
+
readonly MMatchupScore: "mMatchupScore";
|
|
12
|
+
readonly MRoster: "mRoster";
|
|
13
|
+
readonly MScoreboard: "mScoreboard";
|
|
14
|
+
readonly MTopPerformers: "mTopPerformers";
|
|
15
|
+
readonly KonaGameState: "kona_game_state";
|
|
16
|
+
readonly MMatchup: "mMatchup";
|
|
17
|
+
readonly MStandings: "mStandings";
|
|
18
|
+
readonly MDraftDetail: "mDraftDetail";
|
|
19
|
+
readonly KonaPlayerInfo: "kona_player_info";
|
|
20
|
+
readonly KonaPlayerCard: "kona_playercard";
|
|
21
|
+
readonly KonaLeagueCommunication: "kona_league_communication";
|
|
22
|
+
readonly MTransactions2: "mTransactions2";
|
|
23
|
+
readonly ProTeamSchedules: "proTeamSchedules_wl";
|
|
24
|
+
readonly Players: "players_wl";
|
|
25
|
+
};
|
|
26
|
+
export type ViewValue = (typeof View)[keyof typeof View];
|
|
27
|
+
export declare const POSITION_MAP: Record<number | string, number | string>;
|
|
28
|
+
export declare const PRO_TEAM_MAP: Record<number, string>;
|
|
29
|
+
export declare const STATS_MAP: Record<string, string>;
|
|
30
|
+
export declare const STAT_ID_MAP: Record<string, string>;
|
|
31
|
+
export declare const ACTIVITY_MAP: Record<number | string, number | string>;
|
|
32
|
+
export declare const TRANSACTION_TYPES: Set<string>;
|
|
33
|
+
export declare const NINE_CAT_STATS: Set<string>;
|
|
34
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/espn/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,yDACsB,CAAC;AACzD,eAAO,MAAM,kBAAkB,qDAAqD,CAAC;AACrF,eAAO,MAAM,UAAU,QAAQ,CAAC;AAEhC,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;CAqBP,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,OAAO,IAAI,CAAC,CAAC;AAEzD,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,GAAG,MAAM,CAgCjE,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAgC/C,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA+C5C,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAM9C,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,GAAG,MAAM,CAWjE,CAAC;AAEF,eAAO,MAAM,iBAAiB,aAc5B,CAAC;AAEH,eAAO,MAAM,cAAc,aAUzB,CAAC"}
|