@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.
- package/CONTRIBUTING.md +231 -0
- package/LICENSE +21 -0
- package/README.md +153 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +16 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +3 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +16 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/upload.d.ts +4 -0
- package/dist/commands/upload.d.ts.map +1 -0
- package/dist/commands/upload.js +20 -0
- package/dist/commands/upload.js.map +1 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +16 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/__tests__/api.test.d.ts +2 -0
- package/dist/lib/__tests__/api.test.d.ts.map +1 -0
- package/dist/lib/__tests__/api.test.js +23 -0
- package/dist/lib/__tests__/api.test.js.map +1 -0
- package/dist/lib/__tests__/config.test.d.ts +2 -0
- package/dist/lib/__tests__/config.test.d.ts.map +1 -0
- package/dist/lib/__tests__/config.test.js +36 -0
- package/dist/lib/__tests__/config.test.js.map +1 -0
- package/dist/lib/__tests__/project-config.test.d.ts +2 -0
- package/dist/lib/__tests__/project-config.test.d.ts.map +1 -0
- package/dist/lib/__tests__/project-config.test.js +108 -0
- package/dist/lib/__tests__/project-config.test.js.map +1 -0
- package/dist/lib/api.d.ts +15 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +54 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/auth.d.ts +13 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +205 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/config.d.ts +26 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +68 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +17 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +23 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/project-config.d.ts +22 -0
- package/dist/lib/project-config.d.ts.map +1 -0
- package/dist/lib/project-config.js +95 -0
- package/dist/lib/project-config.js.map +1 -0
- package/dist/lib/upload.d.ts +5 -0
- package/dist/lib/upload.d.ts.map +1 -0
- package/dist/lib/upload.js +159 -0
- package/dist/lib/upload.js.map +1 -0
- package/dist/types/index.d.ts +37 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +70 -0
package/CONTRIBUTING.md
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"project-config.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/project-config.test.ts"],"names":[],"mappings":""}
|