@xrift/cli 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 (64) hide show
  1. package/CONTRIBUTING.md +231 -0
  2. package/LICENSE +21 -0
  3. package/README.md +153 -0
  4. package/dist/commands/login.d.ts +3 -0
  5. package/dist/commands/login.d.ts.map +1 -0
  6. package/dist/commands/login.js +16 -0
  7. package/dist/commands/login.js.map +1 -0
  8. package/dist/commands/logout.d.ts +3 -0
  9. package/dist/commands/logout.d.ts.map +1 -0
  10. package/dist/commands/logout.js +16 -0
  11. package/dist/commands/logout.js.map +1 -0
  12. package/dist/commands/upload.d.ts +4 -0
  13. package/dist/commands/upload.d.ts.map +1 -0
  14. package/dist/commands/upload.js +20 -0
  15. package/dist/commands/upload.js.map +1 -0
  16. package/dist/commands/whoami.d.ts +3 -0
  17. package/dist/commands/whoami.d.ts.map +1 -0
  18. package/dist/commands/whoami.js +16 -0
  19. package/dist/commands/whoami.js.map +1 -0
  20. package/dist/index.d.ts +3 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +18 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/lib/__tests__/api.test.d.ts +2 -0
  25. package/dist/lib/__tests__/api.test.d.ts.map +1 -0
  26. package/dist/lib/__tests__/api.test.js +23 -0
  27. package/dist/lib/__tests__/api.test.js.map +1 -0
  28. package/dist/lib/__tests__/config.test.d.ts +2 -0
  29. package/dist/lib/__tests__/config.test.d.ts.map +1 -0
  30. package/dist/lib/__tests__/config.test.js +36 -0
  31. package/dist/lib/__tests__/config.test.js.map +1 -0
  32. package/dist/lib/__tests__/project-config.test.d.ts +2 -0
  33. package/dist/lib/__tests__/project-config.test.d.ts.map +1 -0
  34. package/dist/lib/__tests__/project-config.test.js +108 -0
  35. package/dist/lib/__tests__/project-config.test.js.map +1 -0
  36. package/dist/lib/api.d.ts +15 -0
  37. package/dist/lib/api.d.ts.map +1 -0
  38. package/dist/lib/api.js +54 -0
  39. package/dist/lib/api.js.map +1 -0
  40. package/dist/lib/auth.d.ts +13 -0
  41. package/dist/lib/auth.d.ts.map +1 -0
  42. package/dist/lib/auth.js +205 -0
  43. package/dist/lib/auth.js.map +1 -0
  44. package/dist/lib/config.d.ts +26 -0
  45. package/dist/lib/config.d.ts.map +1 -0
  46. package/dist/lib/config.js +68 -0
  47. package/dist/lib/config.js.map +1 -0
  48. package/dist/lib/constants.d.ts +17 -0
  49. package/dist/lib/constants.d.ts.map +1 -0
  50. package/dist/lib/constants.js +23 -0
  51. package/dist/lib/constants.js.map +1 -0
  52. package/dist/lib/project-config.d.ts +22 -0
  53. package/dist/lib/project-config.d.ts.map +1 -0
  54. package/dist/lib/project-config.js +95 -0
  55. package/dist/lib/project-config.js.map +1 -0
  56. package/dist/lib/upload.d.ts +5 -0
  57. package/dist/lib/upload.d.ts.map +1 -0
  58. package/dist/lib/upload.js +159 -0
  59. package/dist/lib/upload.js.map +1 -0
  60. package/dist/types/index.d.ts +37 -0
  61. package/dist/types/index.d.ts.map +1 -0
  62. package/dist/types/index.js +5 -0
  63. package/dist/types/index.js.map +1 -0
  64. package/package.json +70 -0
@@ -0,0 +1,231 @@
1
+ # 開発ガイド
2
+
3
+ XRift CLI の開発に貢献していただき、ありがとうございます!
4
+
5
+ ## 開発環境のセットアップ
6
+
7
+ ```bash
8
+ # リポジトリをクローン
9
+ git clone https://github.com/WebXR-JP/xrift-cli.git
10
+ cd xrift-cli
11
+
12
+ # 依存関係をインストール
13
+ npm install
14
+
15
+ # ビルド
16
+ npm run build
17
+ ```
18
+
19
+ ## 開発ワークフロー
20
+
21
+ ### ビルド
22
+
23
+ ```bash
24
+ npm run build
25
+ ```
26
+
27
+ ### 開発モードで実行
28
+
29
+ ```bash
30
+ npm run dev -- --help
31
+ npm run dev -- login
32
+ npm run dev -- upload world
33
+ ```
34
+
35
+ ### 型チェック
36
+
37
+ ```bash
38
+ npm run type-check
39
+ ```
40
+
41
+ ### Lint と フォーマット
42
+
43
+ ```bash
44
+ # Lint
45
+ npm run lint
46
+
47
+ # フォーマット
48
+ npm run format
49
+ ```
50
+
51
+ ### ローカルでテスト
52
+
53
+ グローバルにリンクして、実際の `xrift` コマンドとしてテストできます:
54
+
55
+ ```bash
56
+ npm link
57
+ xrift --version
58
+ xrift --help
59
+ ```
60
+
61
+ テスト後、リンクを解除:
62
+
63
+ ```bash
64
+ npm unlink -g @xrift/cli
65
+ ```
66
+
67
+ ## プロジェクト構造
68
+
69
+ ```
70
+ xrift-cli/
71
+ ├── src/
72
+ │ ├── commands/ # CLI コマンド
73
+ │ │ ├── login.ts # ログインコマンド
74
+ │ │ ├── logout.ts # ログアウトコマンド
75
+ │ │ ├── whoami.ts # ユーザー情報表示
76
+ │ │ └── upload.ts # アップロードコマンド
77
+ │ ├── lib/ # コアライブラリ
78
+ │ │ ├── api.ts # API クライアント
79
+ │ │ ├── auth.ts # 認証処理
80
+ │ │ ├── config.ts # 設定ファイル管理
81
+ │ │ ├── constants.ts # 定数定義
82
+ │ │ ├── project-config.ts # プロジェクト設定
83
+ │ │ └── upload.ts # アップロード処理
84
+ │ ├── types/ # TypeScript 型定義
85
+ │ │ └── index.ts
86
+ │ └── index.ts # エントリーポイント
87
+ ├── dist/ # ビルド出力(.gitignore)
88
+ ├── package.json
89
+ ├── tsconfig.json
90
+ └── README.md
91
+ ```
92
+
93
+ ## npm パッケージ公開
94
+
95
+ ### 1. ビルドと検証
96
+
97
+ ```bash
98
+ # 型チェック + ビルド
99
+ npm run prepublishOnly
100
+
101
+ # パッケージ内容を確認
102
+ npm pack --dry-run
103
+ ```
104
+
105
+ ### 2. バージョンアップ
106
+
107
+ ```bash
108
+ # パッチバージョン(バグフィックス): 0.1.0 -> 0.1.1
109
+ npm version patch
110
+
111
+ # マイナーバージョン(機能追加): 0.1.0 -> 0.2.0
112
+ npm version minor
113
+
114
+ # メジャーバージョン(破壊的変更): 0.1.0 -> 1.0.0
115
+ npm version major
116
+ ```
117
+
118
+ ### 3. npm にログイン(初回のみ)
119
+
120
+ ```bash
121
+ npm login
122
+ ```
123
+
124
+ ### 4. パッケージを公開
125
+
126
+ ```bash
127
+ npm publish
128
+ ```
129
+
130
+ ### 5. GitHub にプッシュ
131
+
132
+ ```bash
133
+ git push origin main
134
+ git push --tags
135
+ ```
136
+
137
+ ## コーディング規約
138
+
139
+ - TypeScript の strict モードを使用
140
+ - ESLint と Prettier でコードスタイルを統一
141
+ - すべての関数に JSDoc コメントを記述
142
+ - エラーハンドリングを適切に実装
143
+ - ユーザーフレンドリーなエラーメッセージを提供
144
+
145
+ ## テスト
146
+
147
+ 現在、自動テストは未実装です。手動テストを行ってください:
148
+
149
+ ```bash
150
+ # ローカルでリンク
151
+ npm link
152
+
153
+ # 各コマンドをテスト
154
+ xrift --version
155
+ xrift --help
156
+ xrift login
157
+ xrift whoami
158
+ xrift logout
159
+
160
+ # テスト用のxrift.jsonを作成
161
+ echo '{"world":{"distDir":"./dist"}}' > xrift.json
162
+
163
+ # ワールドアップロードテスト(distディレクトリに適当なファイルを配置)
164
+ mkdir -p dist
165
+ echo "test" > dist/test.txt
166
+ xrift upload world
167
+ ```
168
+
169
+ ## バックエンドAPI開発
170
+
171
+ CLI が正しく動作するには、以下のバックエンドAPIエンドポイントが必要です:
172
+
173
+ ### 認証API
174
+
175
+ - `GET /cli-login?callback=URL&state=STATE`
176
+ - ブラウザ認証ページを表示
177
+ - 認証後、`callback?token=TOKEN&state=STATE` にリダイレクト
178
+
179
+ - `GET /api/auth/verify`
180
+ - Headers: `Authorization: Bearer TOKEN`
181
+ - Response: `{ valid: boolean, userId?: string, username?: string, email?: string }`
182
+
183
+ ### ワールドAPI
184
+
185
+ - `POST /api/worlds`
186
+ - Headers: `Authorization: Bearer TOKEN`
187
+ - Body: `{ name: string }`
188
+ - Response: `{ id: string, name?: string }`
189
+
190
+ - `POST /api/worlds/:id/upload-urls`
191
+ - Headers: `Authorization: Bearer TOKEN`
192
+ - Body: `{ files: [{ path: string, size: number }] }`
193
+ - Response: `[{ url: string, key: string }]`
194
+
195
+ ## 環境変数
196
+
197
+ 開発時に異なるAPIエンドポイントを使用する場合:
198
+
199
+ ```bash
200
+ export XRIFT_API_URL=http://localhost:8787
201
+ npm run dev -- login
202
+ ```
203
+
204
+ ## トラブルシューティング
205
+
206
+ ### ビルドエラー
207
+
208
+ ```bash
209
+ # node_modules を削除して再インストール
210
+ rm -rf node_modules package-lock.json
211
+ npm install
212
+ npm run build
213
+ ```
214
+
215
+ ### 型エラー
216
+
217
+ ```bash
218
+ # 型チェックのみ実行
219
+ npm run type-check
220
+ ```
221
+
222
+ ## コントリビューション
223
+
224
+ 1. Issue を作成して機能追加やバグ修正を提案
225
+ 2. フォークしてブランチを作成
226
+ 3. 変更を加えてコミット
227
+ 4. プルリクエストを作成
228
+
229
+ ## ライセンス
230
+
231
+ MIT
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 WebXR-JP
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,153 @@
1
+ # XRift CLI
2
+
3
+ XRift のワールドやアバターをコマンドラインからアップロードするための公式CLIツールです。
4
+
5
+ ## 機能
6
+
7
+ - ブラウザ認証によるログイン
8
+ - ワールドのアップロード(複数ファイル対応)
9
+ - 新規作成と更新の自動判定
10
+ - アップロード進捗の可視化
11
+
12
+ ## インストール
13
+
14
+ ```bash
15
+ npm install -g @xrift/cli
16
+ ```
17
+
18
+ ## 使い方
19
+
20
+ ### 1. ログイン
21
+
22
+ まず、ブラウザ認証でログインします。
23
+
24
+ ```bash
25
+ xrift login
26
+ ```
27
+
28
+ ブラウザが自動的に開き、XRift での認証を行います。認証が完了すると、トークンが `~/.xrift/config.json` に保存されます。
29
+
30
+ ### 2. プロジェクト設定
31
+
32
+ プロジェクトのルートディレクトリに `xrift.json` を作成します。
33
+
34
+ ```json
35
+ {
36
+ "world": {
37
+ "distDir": "./dist"
38
+ }
39
+ }
40
+ ```
41
+
42
+ - `distDir`: アップロードするビルド済みファイルが格納されているディレクトリ
43
+
44
+ ### 3. ワールドをアップロード
45
+
46
+ ```bash
47
+ xrift upload world
48
+ ```
49
+
50
+ 初回実行時は新規ワールドが作成され、`.xrift/world.json` にワールドIDが保存されます。
51
+ 2回目以降は既存のワールドが更新されます。
52
+
53
+ ### その他のコマンド
54
+
55
+ #### 現在のログインユーザーを確認
56
+
57
+ ```bash
58
+ xrift whoami
59
+ ```
60
+
61
+ #### ログアウト
62
+
63
+ ```bash
64
+ xrift logout
65
+ ```
66
+
67
+ #### バージョン確認
68
+
69
+ ```bash
70
+ xrift --version
71
+ ```
72
+
73
+ #### ヘルプ表示
74
+
75
+ ```bash
76
+ xrift --help
77
+ xrift upload --help
78
+ ```
79
+
80
+ ## 設定ファイル
81
+
82
+ ### `xrift.json`(プロジェクト設定)
83
+
84
+ プロジェクトルートに配置し、gitにコミットします。
85
+
86
+ ```json
87
+ {
88
+ "world": {
89
+ "distDir": "./dist"
90
+ }
91
+ }
92
+ ```
93
+
94
+ ### `.xrift/world.json`(ワールドメタデータ)
95
+
96
+ CLI が自動生成します。gitignore に含めてください。
97
+
98
+ ```json
99
+ {
100
+ "id": "world_123abc",
101
+ "createdAt": "2025-01-15T10:00:00Z",
102
+ "lastUploadedAt": "2025-01-15T12:30:00Z"
103
+ }
104
+ ```
105
+
106
+ ## `.gitignore` の設定
107
+
108
+ プロジェクトの `.gitignore` に以下を追加してください:
109
+
110
+ ```
111
+ .xrift/
112
+ ```
113
+
114
+ ## 対応ファイル形式
115
+
116
+ ワールドアップロードでは、以下のファイル形式に対応しています:
117
+
118
+ - `.glb`, `.gltf` - 3Dモデル
119
+ - `.png`, `.jpg`, `.jpeg`, `.webp` - 画像
120
+ - `.json` - 設定ファイル
121
+ - `.js` - スクリプト
122
+ - `.html`, `.css` - Webファイル
123
+ - その他のファイル
124
+
125
+ ## トラブルシューティング
126
+
127
+ ### ログインできない
128
+
129
+ - ブラウザが自動で開かない場合、ターミナルに表示されたURLを手動でブラウザにコピーしてください
130
+ - ファイアウォールでポート3000がブロックされていないか確認してください
131
+
132
+ ### トークンが無効
133
+
134
+ 再度ログインしてください:
135
+
136
+ ```bash
137
+ xrift logout
138
+ xrift login
139
+ ```
140
+
141
+ ### ワールドアップロードが失敗する
142
+
143
+ - `xrift.json` が正しく設定されているか確認してください
144
+ - `distDir` が存在し、アップロードするファイルが含まれているか確認してください
145
+ - ログインしているか確認してください(`xrift whoami`)
146
+
147
+ ## 開発に貢献する
148
+
149
+ 開発環境のセットアップや公開手順については [CONTRIBUTING.md](CONTRIBUTING.md) をご覧ください。
150
+
151
+ ## ライセンス
152
+
153
+ MIT
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const loginCommand: Command;
3
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,YAAY,SAWrB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { Command } from 'commander';
2
+ import { login } from '../lib/auth.js';
3
+ export const loginCommand = new Command('login')
4
+ .description('ブラウザ認証でログイン')
5
+ .action(async () => {
6
+ try {
7
+ await login();
8
+ }
9
+ catch (error) {
10
+ if (error instanceof Error) {
11
+ console.error('エラー:', error.message);
12
+ }
13
+ process.exit(1);
14
+ }
15
+ });
16
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,aAAa,CAAC;KAC1B,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,KAAK,EAAE,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const logoutCommand: Command;
3
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,aAAa,SAWtB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { Command } from 'commander';
2
+ import { logout } from '../lib/auth.js';
3
+ export const logoutCommand = new Command('logout')
4
+ .description('ログアウト')
5
+ .action(async () => {
6
+ try {
7
+ await logout();
8
+ }
9
+ catch (error) {
10
+ if (error instanceof Error) {
11
+ console.error('エラー:', error.message);
12
+ }
13
+ process.exit(1);
14
+ }
15
+ });
16
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,OAAO,CAAC;KACpB,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,EAAE,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ export declare const uploadCommand: Command;
3
+ export default uploadCommand;
4
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,aAAa,SACU,CAAC;AAgBrC,eAAe,aAAa,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { Command } from 'commander';
2
+ import { uploadWorld } from '../lib/upload.js';
3
+ export const uploadCommand = new Command('upload')
4
+ .description('ワールドまたはアバターをアップロード');
5
+ uploadCommand
6
+ .command('world')
7
+ .description('ワールドをアップロード')
8
+ .action(async () => {
9
+ try {
10
+ await uploadWorld();
11
+ }
12
+ catch (error) {
13
+ if (error instanceof Error) {
14
+ console.error('エラー:', error.message);
15
+ }
16
+ process.exit(1);
17
+ }
18
+ });
19
+ export default uploadCommand;
20
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,oBAAoB,CAAC,CAAC;AAErC,aAAa;KACV,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,aAAa,CAAC;KAC1B,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,WAAW,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,eAAe,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const whoamiCommand: Command;
3
+ //# sourceMappingURL=whoami.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,aAAa,SAWtB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { Command } from 'commander';
2
+ import { whoami } from '../lib/auth.js';
3
+ export const whoamiCommand = new Command('whoami')
4
+ .description('現在ログインしているユーザーを表示')
5
+ .action(async () => {
6
+ try {
7
+ await whoami();
8
+ }
9
+ catch (error) {
10
+ if (error instanceof Error) {
11
+ console.error('エラー:', error.message);
12
+ }
13
+ process.exit(1);
14
+ }
15
+ });
16
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,mBAAmB,CAAC;KAChC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,EAAE,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -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":""}
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { loginCommand } from './commands/login.js';
4
+ import { logoutCommand } from './commands/logout.js';
5
+ import { whoamiCommand } from './commands/whoami.js';
6
+ import { uploadCommand } from './commands/upload.js';
7
+ const program = new Command();
8
+ program
9
+ .name('xrift')
10
+ .description('XRift CLI - Upload worlds and avatars to XRift')
11
+ .version('0.1.0');
12
+ // Register commands
13
+ program.addCommand(loginCommand);
14
+ program.addCommand(logoutCommand);
15
+ program.addCommand(whoamiCommand);
16
+ program.addCommand(uploadCommand);
17
+ program.parse();
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,gDAAgD,CAAC;KAC7D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=api.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/api.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import { describe, it, expect } from '@jest/globals';
2
+ import { createApiClient } from '../api.js';
3
+ import { API_BASE_URL } from '../constants.js';
4
+ describe('api', () => {
5
+ describe('createApiClient', () => {
6
+ it('トークンなしでAPIクライアントを作成できる', () => {
7
+ const client = createApiClient();
8
+ expect(client.defaults.baseURL).toBe(API_BASE_URL);
9
+ expect(client.defaults.headers['Content-Type']).toBe('application/json');
10
+ expect(client.defaults.timeout).toBe(30000);
11
+ });
12
+ it('トークン付きでAPIクライアントを作成できる', () => {
13
+ const client = createApiClient('test-token-123');
14
+ expect(client.defaults.baseURL).toBe(API_BASE_URL);
15
+ expect(client.defaults.headers['Content-Type']).toBe('application/json');
16
+ expect(client.defaults.headers['Authorization']).toBe('Bearer test-token-123');
17
+ expect(client.defaults.timeout).toBe(30000);
18
+ });
19
+ });
20
+ // Note: verifyToken と getAuthenticatedClient のテストは実際のHTTPリクエストが必要なため、
21
+ // 統合テストまたはモックサーバーを使った別のテストで実施することを推奨
22
+ });
23
+ //# sourceMappingURL=api.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/api.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;IACnB,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;YAChC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;YAEjC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACzE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;YAChC,MAAM,MAAM,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAAC;YAEjD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACzE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAC/E,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,sEAAsE;IACtE,qCAAqC;AACvC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,36 @@
1
+ import { describe, it, expect } from '@jest/globals';
2
+ import { isTokenValid } from '../config.js';
3
+ // Note: config.ts の関数は実際のホームディレクトリを使用するため、
4
+ // ファイルI/Oのテストは統合テストで行うことを推奨します。
5
+ // ここではビジネスロジックのみをテストします。
6
+ describe('config', () => {
7
+ describe('isTokenValid', () => {
8
+ it('トークンがない場合は false を返す', () => {
9
+ const config = { token: '' };
10
+ expect(isTokenValid(config)).toBe(false);
11
+ });
12
+ it('expiresAt がない場合は true を返す', () => {
13
+ const config = { token: 'valid-token' };
14
+ expect(isTokenValid(config)).toBe(true);
15
+ });
16
+ it('有効期限が未来の場合は true を返す', () => {
17
+ const futureDate = new Date();
18
+ futureDate.setFullYear(futureDate.getFullYear() + 1);
19
+ const config = {
20
+ token: 'valid-token',
21
+ expiresAt: futureDate.toISOString(),
22
+ };
23
+ expect(isTokenValid(config)).toBe(true);
24
+ });
25
+ it('有効期限が過去の場合は false を返す', () => {
26
+ const pastDate = new Date();
27
+ pastDate.setFullYear(pastDate.getFullYear() - 1);
28
+ const config = {
29
+ token: 'expired-token',
30
+ expiresAt: pastDate.toISOString(),
31
+ };
32
+ expect(isTokenValid(config)).toBe(false);
33
+ });
34
+ });
35
+ });
36
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,2CAA2C;AAC3C,gCAAgC;AAChC,yBAAyB;AAEzB,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IAEtB,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;YAC9B,MAAM,MAAM,GAAe,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YACzC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,MAAM,GAAe,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;YACpD,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;YAC9B,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC;YAC9B,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;YAErD,MAAM,MAAM,GAAe;gBACzB,KAAK,EAAE,aAAa;gBACpB,SAAS,EAAE,UAAU,CAAC,WAAW,EAAE;aACpC,CAAC;YAEF,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;YAC/B,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;YAC5B,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;YAEjD,MAAM,MAAM,GAAe;gBACzB,KAAK,EAAE,eAAe;gBACtB,SAAS,EAAE,QAAQ,CAAC,WAAW,EAAE;aAClC,CAAC;YAEF,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=project-config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-config.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/project-config.test.ts"],"names":[],"mappings":""}