npb-mcp-server 0.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.
- package/README.md +301 -0
- package/dist/constants/teams.d.ts +14 -0
- package/dist/constants/teams.d.ts.map +1 -0
- package/dist/constants/teams.js +104 -0
- package/dist/constants/teams.js.map +1 -0
- package/dist/constants/teams.test.d.ts +2 -0
- package/dist/constants/teams.test.d.ts.map +1 -0
- package/dist/constants/teams.test.js +93 -0
- package/dist/constants/teams.test.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +268 -0
- package/dist/index.js.map +1 -0
- package/dist/scrapers/players.d.ts +14 -0
- package/dist/scrapers/players.d.ts.map +1 -0
- package/dist/scrapers/players.js +151 -0
- package/dist/scrapers/players.js.map +1 -0
- package/dist/tools/get-team-players.d.ts +13 -0
- package/dist/tools/get-team-players.d.ts.map +1 -0
- package/dist/tools/get-team-players.js +28 -0
- package/dist/tools/get-team-players.js.map +1 -0
- package/dist/tools/list-teams.d.ts +13 -0
- package/dist/tools/list-teams.d.ts.map +1 -0
- package/dist/tools/list-teams.js +22 -0
- package/dist/tools/list-teams.js.map +1 -0
- package/dist/tools/list-teams.test.d.ts +2 -0
- package/dist/tools/list-teams.test.d.ts.map +1 -0
- package/dist/tools/list-teams.test.js +46 -0
- package/dist/tools/list-teams.test.js.map +1 -0
- package/dist/tools/search-players.d.ts +16 -0
- package/dist/tools/search-players.d.ts.map +1 -0
- package/dist/tools/search-players.js +41 -0
- package/dist/tools/search-players.js.map +1 -0
- package/dist/types/npb.d.ts +51 -0
- package/dist/types/npb.d.ts.map +1 -0
- package/dist/types/npb.js +2 -0
- package/dist/types/npb.js.map +1 -0
- package/dist/utils/cache.d.ts +37 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +75 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/cache.test.d.ts +2 -0
- package/dist/utils/cache.test.d.ts.map +1 -0
- package/dist/utils/cache.test.js +62 -0
- package/dist/utils/cache.test.js.map +1 -0
- package/dist/utils/http.d.ts +9 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +50 -0
- package/dist/utils/http.js.map +1 -0
- package/package.json +72 -0
package/README.md
ADDED
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
# NPB MCP Server
|
|
2
|
+
|
|
3
|
+
[](https://github.com/MITSUBOSHI/npb-mcp-server/actions/workflows/test.yml)
|
|
4
|
+
[](https://badge.fury.io/js/@mitsuboshi%2Fnpb-mcp-server)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
|
|
7
|
+
日本プロ野球(NPB)の選手情報を提供するModel Context Protocol (MCP) サーバーです。
|
|
8
|
+
|
|
9
|
+
## 機能
|
|
10
|
+
|
|
11
|
+
- NPB全12球団の情報取得
|
|
12
|
+
- 選手一覧の取得(球団別)
|
|
13
|
+
- 選手検索(名前、ポジション、背番号など)
|
|
14
|
+
- データキャッシング機能
|
|
15
|
+
- 2つのトランスポートモード対応(stdio / HTTP)
|
|
16
|
+
|
|
17
|
+
## インストール
|
|
18
|
+
|
|
19
|
+
### ローカル開発の場合
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install
|
|
23
|
+
npm run build
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### npxで直接使用する場合
|
|
27
|
+
|
|
28
|
+
パッケージを公開後は、インストール不要でnpxから直接実行できます:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# stdioモード
|
|
32
|
+
npx npb-mcp-server
|
|
33
|
+
|
|
34
|
+
# HTTPモード
|
|
35
|
+
MCP_TRANSPORT=http npx npb-mcp-server
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
ローカルでnpxテストする場合:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npm link
|
|
42
|
+
npx npb-mcp-server
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## 使い方
|
|
46
|
+
|
|
47
|
+
このサーバーは2つのトランスポートモードで動作します:
|
|
48
|
+
|
|
49
|
+
### モード1: stdio(デフォルト)
|
|
50
|
+
|
|
51
|
+
Claude Desktopなどのstdioベースのクライアントで使用する場合。
|
|
52
|
+
|
|
53
|
+
Claude Desktopの設定ファイル `claude_desktop_config.json` に以下を追加:
|
|
54
|
+
|
|
55
|
+
**ローカルパスを指定する場合:**
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"mcpServers": {
|
|
59
|
+
"npb": {
|
|
60
|
+
"command": "node",
|
|
61
|
+
"args": ["/path/to/npb-mcp-server/dist/index.js"]
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**npxを使用する場合(パッケージ公開後):**
|
|
68
|
+
```json
|
|
69
|
+
{
|
|
70
|
+
"mcpServers": {
|
|
71
|
+
"npb": {
|
|
72
|
+
"command": "npx",
|
|
73
|
+
"args": ["npb-mcp-server"]
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### モード2: HTTP(Streaming)
|
|
80
|
+
|
|
81
|
+
Honoを使用したHTTP Streaming Transportモード。より高速な通信が可能です。
|
|
82
|
+
|
|
83
|
+
**起動方法:**
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
# HTTPモードで起動(デフォルトポート: 3000)
|
|
87
|
+
MCP_TRANSPORT=http node dist/index.js
|
|
88
|
+
|
|
89
|
+
# npxを使用
|
|
90
|
+
MCP_TRANSPORT=http npx npb-mcp-server
|
|
91
|
+
|
|
92
|
+
# カスタムポートで起動
|
|
93
|
+
MCP_TRANSPORT=http PORT=8080 node dist/index.js
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Claude Desktopで使用する場合:**
|
|
97
|
+
|
|
98
|
+
**ローカルパスを指定:**
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"mcpServers": {
|
|
102
|
+
"npb": {
|
|
103
|
+
"command": "node",
|
|
104
|
+
"args": ["/path/to/npb-mcp-server/dist/index.js"],
|
|
105
|
+
"env": {
|
|
106
|
+
"MCP_TRANSPORT": "http",
|
|
107
|
+
"PORT": "3000"
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**npxを使用(パッケージ公開後):**
|
|
115
|
+
```json
|
|
116
|
+
{
|
|
117
|
+
"mcpServers": {
|
|
118
|
+
"npb": {
|
|
119
|
+
"command": "npx",
|
|
120
|
+
"args": ["npb-mcp-server"],
|
|
121
|
+
"env": {
|
|
122
|
+
"MCP_TRANSPORT": "http",
|
|
123
|
+
"PORT": "3000"
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**エンドポイント:**
|
|
131
|
+
- `GET /health` - ヘルスチェック
|
|
132
|
+
- `POST /mcp` - MCPメッセージング(SSE)
|
|
133
|
+
|
|
134
|
+
### 利用可能なツール
|
|
135
|
+
|
|
136
|
+
#### 1. list_teams
|
|
137
|
+
NPB全12球団の一覧を取得します。
|
|
138
|
+
|
|
139
|
+
**パラメータ:**
|
|
140
|
+
- `league` (optional): フィルタリングするリーグ(`central` または `pacific`)
|
|
141
|
+
|
|
142
|
+
**例:**
|
|
143
|
+
```json
|
|
144
|
+
{
|
|
145
|
+
"league": "central"
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
#### 2. get_team_players
|
|
150
|
+
指定された球団の選手一覧を取得します。
|
|
151
|
+
|
|
152
|
+
**パラメータ:**
|
|
153
|
+
- `team_id` (required): 球団ID
|
|
154
|
+
|
|
155
|
+
**球団ID一覧:**
|
|
156
|
+
- セ・リーグ: `g`(ジャイアンツ), `t`(タイガース), `db`(ベイスターズ), `c`(カープ), `s`(スワローズ), `d`(ドラゴンズ)
|
|
157
|
+
- パ・リーグ: `h`(ホークス), `f`(ファイターズ), `m`(マリーンズ), `e`(イーグルス), `bs`(バファローズ), `l`(ライオンズ)
|
|
158
|
+
|
|
159
|
+
**例:**
|
|
160
|
+
```json
|
|
161
|
+
{
|
|
162
|
+
"team_id": "g"
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
#### 3. search_players
|
|
167
|
+
選手を検索します。
|
|
168
|
+
|
|
169
|
+
**パラメータ:**
|
|
170
|
+
- `name` (optional): 選手名(部分一致)
|
|
171
|
+
- `team_id` (optional): 球団ID
|
|
172
|
+
- `position` (optional): ポジション(`pitcher`, `catcher`, `infielder`, `outfielder`)
|
|
173
|
+
- `number` (optional): 背番号
|
|
174
|
+
|
|
175
|
+
**例:**
|
|
176
|
+
```json
|
|
177
|
+
{
|
|
178
|
+
"name": "大谷",
|
|
179
|
+
"position": "pitcher"
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## データソース
|
|
184
|
+
|
|
185
|
+
このサーバーは [NPB公式サイト](https://npb.jp/) からWeb Scrapingでデータを取得しています。
|
|
186
|
+
|
|
187
|
+
## 開発
|
|
188
|
+
|
|
189
|
+
### テスト
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
# テスト実行
|
|
193
|
+
npm test
|
|
194
|
+
|
|
195
|
+
# ウォッチモードでテスト
|
|
196
|
+
npm run test:watch
|
|
197
|
+
|
|
198
|
+
# カバレッジ付きテスト
|
|
199
|
+
npm run test:coverage
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**テスト内容:**
|
|
203
|
+
- キャッシュ機能のテスト(9テスト)
|
|
204
|
+
- 球団データの検証(12テスト)
|
|
205
|
+
- MCPツール関数のテスト(5テスト)
|
|
206
|
+
|
|
207
|
+
合計26個のテストケースが含まれています。
|
|
208
|
+
|
|
209
|
+
### コード品質
|
|
210
|
+
|
|
211
|
+
このプロジェクトはESLintとPrettierでコード品質を管理しています。
|
|
212
|
+
|
|
213
|
+
**推奨コマンド:**
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
# すべての自動修正を一括実行(Prettier → ESLint)
|
|
217
|
+
npm run fix
|
|
218
|
+
|
|
219
|
+
# すべてのチェックを並列実行(Lint + Format + Test)
|
|
220
|
+
npm run check
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**個別コマンド:**
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
# ESLintでコードチェック
|
|
227
|
+
npm run lint
|
|
228
|
+
|
|
229
|
+
# ESLintで自動修正
|
|
230
|
+
npm run lint:fix
|
|
231
|
+
|
|
232
|
+
# Prettierでフォーマットチェック
|
|
233
|
+
npm run format:check
|
|
234
|
+
|
|
235
|
+
# Prettierで自動フォーマット
|
|
236
|
+
npm run format
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
**設定ファイル:**
|
|
240
|
+
- `.prettierrc` - Prettier設定
|
|
241
|
+
- `eslint.config.js` - ESLint 9.x フラット設定
|
|
242
|
+
|
|
243
|
+
**コミット前の推奨フロー:**
|
|
244
|
+
```bash
|
|
245
|
+
npm run fix # コードを自動修正
|
|
246
|
+
npm run check # すべてのチェックを実行
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### ビルド
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
# TypeScriptをビルド
|
|
253
|
+
npm run build
|
|
254
|
+
|
|
255
|
+
# ウォッチモードでビルド
|
|
256
|
+
npm run dev
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## CI/CD
|
|
260
|
+
|
|
261
|
+
このプロジェクトはGitHub Actionsを使用して自動テストとデプロイを行っています。
|
|
262
|
+
|
|
263
|
+
### 自動テスト
|
|
264
|
+
|
|
265
|
+
**トリガー:**
|
|
266
|
+
- `main`、`develop`ブランチへのpush
|
|
267
|
+
- すべてのPull Request
|
|
268
|
+
|
|
269
|
+
**テスト内容:**
|
|
270
|
+
- Node.js 18.x, 20.x, 22.x でのテスト実行
|
|
271
|
+
- ビルドの確認
|
|
272
|
+
- テストカバレッジの生成
|
|
273
|
+
|
|
274
|
+
### 自動公開
|
|
275
|
+
|
|
276
|
+
**トリガー:**
|
|
277
|
+
- GitHubでリリースを作成
|
|
278
|
+
|
|
279
|
+
**リリース手順:**
|
|
280
|
+
|
|
281
|
+
通常のコミットではバージョン変更は不要です。リリース時のみ以下を実行:
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
# パッチバージョン更新(バグ修正: 0.1.0 → 0.1.1)
|
|
285
|
+
npm run release:patch
|
|
286
|
+
|
|
287
|
+
# マイナーバージョン更新(新機能: 0.1.0 → 0.2.0)
|
|
288
|
+
npm run release:minor
|
|
289
|
+
|
|
290
|
+
# メジャーバージョン更新(破壊的変更: 0.1.0 → 1.0.0)
|
|
291
|
+
npm run release:major
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
その後、GitHubでリリースを作成すると自動公開されます。
|
|
295
|
+
|
|
296
|
+
**必要な設定:**
|
|
297
|
+
- GitHub Secretsに`NPM_TOKEN`を設定(Automationトークン推奨)
|
|
298
|
+
|
|
299
|
+
## ライセンス
|
|
300
|
+
|
|
301
|
+
MIT
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Team } from '../types/npb.js';
|
|
2
|
+
/**
|
|
3
|
+
* NPB全12球団の定義
|
|
4
|
+
*/
|
|
5
|
+
export declare const TEAMS: Team[];
|
|
6
|
+
/**
|
|
7
|
+
* 球団IDから球団情報を取得
|
|
8
|
+
*/
|
|
9
|
+
export declare function getTeamById(teamId: string): Team | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* リーグから球団リストを取得
|
|
12
|
+
*/
|
|
13
|
+
export declare function getTeamsByLeague(league: 'central' | 'pacific'): Team[];
|
|
14
|
+
//# sourceMappingURL=teams.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teams.d.ts","sourceRoot":"","sources":["../../src/constants/teams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEvC;;GAEG;AACH,eAAO,MAAM,KAAK,EAAE,IAAI,EAuFvB,CAAC;AAEF;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAE5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,EAAE,CAEtE"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NPB全12球団の定義
|
|
3
|
+
*/
|
|
4
|
+
export const TEAMS = [
|
|
5
|
+
// セントラル・リーグ
|
|
6
|
+
{
|
|
7
|
+
id: 'g',
|
|
8
|
+
name: 'ジャイアンツ',
|
|
9
|
+
fullName: '読売ジャイアンツ',
|
|
10
|
+
league: 'central',
|
|
11
|
+
rosterUrl: 'https://npb.jp/bis/teams/rst_g.html',
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
id: 't',
|
|
15
|
+
name: 'タイガース',
|
|
16
|
+
fullName: '阪神タイガース',
|
|
17
|
+
league: 'central',
|
|
18
|
+
rosterUrl: 'https://npb.jp/bis/teams/rst_t.html',
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: 'db',
|
|
22
|
+
name: 'ベイスターズ',
|
|
23
|
+
fullName: '横浜DeNAベイスターズ',
|
|
24
|
+
league: 'central',
|
|
25
|
+
rosterUrl: 'https://npb.jp/bis/teams/rst_db.html',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: 'c',
|
|
29
|
+
name: 'カープ',
|
|
30
|
+
fullName: '広島東洋カープ',
|
|
31
|
+
league: 'central',
|
|
32
|
+
rosterUrl: 'https://npb.jp/bis/teams/rst_c.html',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: 's',
|
|
36
|
+
name: 'スワローズ',
|
|
37
|
+
fullName: '東京ヤクルトスワローズ',
|
|
38
|
+
league: 'central',
|
|
39
|
+
rosterUrl: 'https://npb.jp/bis/teams/rst_s.html',
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: 'd',
|
|
43
|
+
name: 'ドラゴンズ',
|
|
44
|
+
fullName: '中日ドラゴンズ',
|
|
45
|
+
league: 'central',
|
|
46
|
+
rosterUrl: 'https://npb.jp/bis/teams/rst_d.html',
|
|
47
|
+
},
|
|
48
|
+
// パシフィック・リーグ
|
|
49
|
+
{
|
|
50
|
+
id: 'h',
|
|
51
|
+
name: 'ホークス',
|
|
52
|
+
fullName: '福岡ソフトバンクホークス',
|
|
53
|
+
league: 'pacific',
|
|
54
|
+
rosterUrl: 'https://npb.jp/bis/teams/rst_h.html',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: 'f',
|
|
58
|
+
name: 'ファイターズ',
|
|
59
|
+
fullName: '北海道日本ハムファイターズ',
|
|
60
|
+
league: 'pacific',
|
|
61
|
+
rosterUrl: 'https://npb.jp/bis/teams/rst_f.html',
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: 'm',
|
|
65
|
+
name: 'マリーンズ',
|
|
66
|
+
fullName: '千葉ロッテマリーンズ',
|
|
67
|
+
league: 'pacific',
|
|
68
|
+
rosterUrl: 'https://npb.jp/bis/teams/rst_m.html',
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: 'e',
|
|
72
|
+
name: 'イーグルス',
|
|
73
|
+
fullName: '東北楽天ゴールデンイーグルス',
|
|
74
|
+
league: 'pacific',
|
|
75
|
+
rosterUrl: 'https://npb.jp/bis/teams/rst_e.html',
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: 'bs',
|
|
79
|
+
name: 'バファローズ',
|
|
80
|
+
fullName: 'オリックス・バファローズ',
|
|
81
|
+
league: 'pacific',
|
|
82
|
+
rosterUrl: 'https://npb.jp/bis/teams/rst_bs.html',
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
id: 'l',
|
|
86
|
+
name: 'ライオンズ',
|
|
87
|
+
fullName: '埼玉西武ライオンズ',
|
|
88
|
+
league: 'pacific',
|
|
89
|
+
rosterUrl: 'https://npb.jp/bis/teams/rst_l.html',
|
|
90
|
+
},
|
|
91
|
+
];
|
|
92
|
+
/**
|
|
93
|
+
* 球団IDから球団情報を取得
|
|
94
|
+
*/
|
|
95
|
+
export function getTeamById(teamId) {
|
|
96
|
+
return TEAMS.find((team) => team.id === teamId);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* リーグから球団リストを取得
|
|
100
|
+
*/
|
|
101
|
+
export function getTeamsByLeague(league) {
|
|
102
|
+
return TEAMS.filter((team) => team.league === league);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=teams.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teams.js","sourceRoot":"","sources":["../../src/constants/teams.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,MAAM,KAAK,GAAW;IAC3B,YAAY;IACZ;QACE,EAAE,EAAE,GAAG;QACP,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,qCAAqC;KACjD;IACD;QACE,EAAE,EAAE,GAAG;QACP,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,SAAS;QACnB,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,qCAAqC;KACjD;IACD;QACE,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,cAAc;QACxB,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,sCAAsC;KAClD;IACD;QACE,EAAE,EAAE,GAAG;QACP,IAAI,EAAE,KAAK;QACX,QAAQ,EAAE,SAAS;QACnB,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,qCAAqC;KACjD;IACD;QACE,EAAE,EAAE,GAAG;QACP,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,aAAa;QACvB,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,qCAAqC;KACjD;IACD;QACE,EAAE,EAAE,GAAG;QACP,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,SAAS;QACnB,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,qCAAqC;KACjD;IACD,aAAa;IACb;QACE,EAAE,EAAE,GAAG;QACP,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,cAAc;QACxB,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,qCAAqC;KACjD;IACD;QACE,EAAE,EAAE,GAAG;QACP,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,eAAe;QACzB,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,qCAAqC;KACjD;IACD;QACE,EAAE,EAAE,GAAG;QACP,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,YAAY;QACtB,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,qCAAqC;KACjD;IACD;QACE,EAAE,EAAE,GAAG;QACP,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,qCAAqC;KACjD;IACD;QACE,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,cAAc;QACxB,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,sCAAsC;KAClD;IACD;QACE,EAAE,EAAE,GAAG;QACP,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,WAAW;QACrB,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,qCAAqC;KACjD;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAA6B;IAC5D,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teams.test.d.ts","sourceRoot":"","sources":["../../src/constants/teams.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { TEAMS, getTeamById, getTeamsByLeague } from './teams.js';
|
|
3
|
+
describe('Teams', () => {
|
|
4
|
+
describe('TEAMS定数', () => {
|
|
5
|
+
it('12球団すべてが定義されている', () => {
|
|
6
|
+
expect(TEAMS).toHaveLength(12);
|
|
7
|
+
});
|
|
8
|
+
it('各球団に必要なフィールドがある', () => {
|
|
9
|
+
TEAMS.forEach((team) => {
|
|
10
|
+
expect(team).toHaveProperty('id');
|
|
11
|
+
expect(team).toHaveProperty('name');
|
|
12
|
+
expect(team).toHaveProperty('fullName');
|
|
13
|
+
expect(team).toHaveProperty('league');
|
|
14
|
+
expect(team).toHaveProperty('rosterUrl');
|
|
15
|
+
expect(typeof team.id).toBe('string');
|
|
16
|
+
expect(typeof team.name).toBe('string');
|
|
17
|
+
expect(typeof team.fullName).toBe('string');
|
|
18
|
+
expect(['central', 'pacific']).toContain(team.league);
|
|
19
|
+
expect(team.rosterUrl).toMatch(/^https:\/\/npb\.jp\/bis\/teams\/rst_/);
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
it('セ・リーグは6球団', () => {
|
|
23
|
+
const centralTeams = TEAMS.filter((t) => t.league === 'central');
|
|
24
|
+
expect(centralTeams).toHaveLength(6);
|
|
25
|
+
});
|
|
26
|
+
it('パ・リーグは6球団', () => {
|
|
27
|
+
const pacificTeams = TEAMS.filter((t) => t.league === 'pacific');
|
|
28
|
+
expect(pacificTeams).toHaveLength(6);
|
|
29
|
+
});
|
|
30
|
+
it('球団IDが重複していない', () => {
|
|
31
|
+
const ids = TEAMS.map((t) => t.id);
|
|
32
|
+
const uniqueIds = new Set(ids);
|
|
33
|
+
expect(uniqueIds.size).toBe(TEAMS.length);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('getTeamById', () => {
|
|
37
|
+
it('存在する球団IDで球団を取得できる', () => {
|
|
38
|
+
const team = getTeamById('g');
|
|
39
|
+
expect(team).toBeDefined();
|
|
40
|
+
expect(team?.id).toBe('g');
|
|
41
|
+
expect(team?.name).toBe('ジャイアンツ');
|
|
42
|
+
});
|
|
43
|
+
it('存在しない球団IDではundefinedを返す', () => {
|
|
44
|
+
const team = getTeamById('nonexistent');
|
|
45
|
+
expect(team).toBeUndefined();
|
|
46
|
+
});
|
|
47
|
+
it('すべての球団IDで取得できる', () => {
|
|
48
|
+
const teamIds = ['g', 't', 'db', 'c', 's', 'd', 'h', 'f', 'm', 'e', 'bs', 'l'];
|
|
49
|
+
teamIds.forEach((id) => {
|
|
50
|
+
const team = getTeamById(id);
|
|
51
|
+
expect(team).toBeDefined();
|
|
52
|
+
expect(team?.id).toBe(id);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
describe('getTeamsByLeague', () => {
|
|
57
|
+
it('セ・リーグの球団を取得できる', () => {
|
|
58
|
+
const teams = getTeamsByLeague('central');
|
|
59
|
+
expect(teams).toHaveLength(6);
|
|
60
|
+
teams.forEach((team) => {
|
|
61
|
+
expect(team.league).toBe('central');
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
it('パ・リーグの球団を取得できる', () => {
|
|
65
|
+
const teams = getTeamsByLeague('pacific');
|
|
66
|
+
expect(teams).toHaveLength(6);
|
|
67
|
+
teams.forEach((team) => {
|
|
68
|
+
expect(team.league).toBe('pacific');
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
it('セ・リーグに正しい球団が含まれる', () => {
|
|
72
|
+
const teams = getTeamsByLeague('central');
|
|
73
|
+
const teamIds = teams.map((t) => t.id);
|
|
74
|
+
expect(teamIds).toContain('g'); // ジャイアンツ
|
|
75
|
+
expect(teamIds).toContain('t'); // タイガース
|
|
76
|
+
expect(teamIds).toContain('db'); // ベイスターズ
|
|
77
|
+
expect(teamIds).toContain('c'); // カープ
|
|
78
|
+
expect(teamIds).toContain('s'); // スワローズ
|
|
79
|
+
expect(teamIds).toContain('d'); // ドラゴンズ
|
|
80
|
+
});
|
|
81
|
+
it('パ・リーグに正しい球団が含まれる', () => {
|
|
82
|
+
const teams = getTeamsByLeague('pacific');
|
|
83
|
+
const teamIds = teams.map((t) => t.id);
|
|
84
|
+
expect(teamIds).toContain('h'); // ホークス
|
|
85
|
+
expect(teamIds).toContain('f'); // ファイターズ
|
|
86
|
+
expect(teamIds).toContain('m'); // マリーンズ
|
|
87
|
+
expect(teamIds).toContain('e'); // イーグルス
|
|
88
|
+
expect(teamIds).toContain('bs'); // バファローズ
|
|
89
|
+
expect(teamIds).toContain('l'); // ライオンズ
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=teams.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teams.test.js","sourceRoot":"","sources":["../../src/constants/teams.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|