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.
Files changed (50) hide show
  1. package/README.md +301 -0
  2. package/dist/constants/teams.d.ts +14 -0
  3. package/dist/constants/teams.d.ts.map +1 -0
  4. package/dist/constants/teams.js +104 -0
  5. package/dist/constants/teams.js.map +1 -0
  6. package/dist/constants/teams.test.d.ts +2 -0
  7. package/dist/constants/teams.test.d.ts.map +1 -0
  8. package/dist/constants/teams.test.js +93 -0
  9. package/dist/constants/teams.test.js.map +1 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +268 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/scrapers/players.d.ts +14 -0
  15. package/dist/scrapers/players.d.ts.map +1 -0
  16. package/dist/scrapers/players.js +151 -0
  17. package/dist/scrapers/players.js.map +1 -0
  18. package/dist/tools/get-team-players.d.ts +13 -0
  19. package/dist/tools/get-team-players.d.ts.map +1 -0
  20. package/dist/tools/get-team-players.js +28 -0
  21. package/dist/tools/get-team-players.js.map +1 -0
  22. package/dist/tools/list-teams.d.ts +13 -0
  23. package/dist/tools/list-teams.d.ts.map +1 -0
  24. package/dist/tools/list-teams.js +22 -0
  25. package/dist/tools/list-teams.js.map +1 -0
  26. package/dist/tools/list-teams.test.d.ts +2 -0
  27. package/dist/tools/list-teams.test.d.ts.map +1 -0
  28. package/dist/tools/list-teams.test.js +46 -0
  29. package/dist/tools/list-teams.test.js.map +1 -0
  30. package/dist/tools/search-players.d.ts +16 -0
  31. package/dist/tools/search-players.d.ts.map +1 -0
  32. package/dist/tools/search-players.js +41 -0
  33. package/dist/tools/search-players.js.map +1 -0
  34. package/dist/types/npb.d.ts +51 -0
  35. package/dist/types/npb.d.ts.map +1 -0
  36. package/dist/types/npb.js +2 -0
  37. package/dist/types/npb.js.map +1 -0
  38. package/dist/utils/cache.d.ts +37 -0
  39. package/dist/utils/cache.d.ts.map +1 -0
  40. package/dist/utils/cache.js +75 -0
  41. package/dist/utils/cache.js.map +1 -0
  42. package/dist/utils/cache.test.d.ts +2 -0
  43. package/dist/utils/cache.test.d.ts.map +1 -0
  44. package/dist/utils/cache.test.js +62 -0
  45. package/dist/utils/cache.test.js.map +1 -0
  46. package/dist/utils/http.d.ts +9 -0
  47. package/dist/utils/http.d.ts.map +1 -0
  48. package/dist/utils/http.js +50 -0
  49. package/dist/utils/http.js.map +1 -0
  50. package/package.json +72 -0
package/README.md ADDED
@@ -0,0 +1,301 @@
1
+ # NPB MCP Server
2
+
3
+ [![Test](https://github.com/MITSUBOSHI/npb-mcp-server/actions/workflows/test.yml/badge.svg)](https://github.com/MITSUBOSHI/npb-mcp-server/actions/workflows/test.yml)
4
+ [![npm version](https://badge.fury.io/js/@mitsuboshi%2Fnpb-mcp-server.svg)](https://badge.fury.io/js/@mitsuboshi%2Fnpb-mcp-server)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=teams.test.d.ts.map
@@ -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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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}