@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
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { PROJECT_CONFIG_FILE, PROJECT_META_DIR, WORLD_META_FILE } from './constants.js';
|
|
4
|
+
/**
|
|
5
|
+
* プロジェクト設定ファイル (xrift.json) を読み込み
|
|
6
|
+
*/
|
|
7
|
+
export async function loadProjectConfig(cwd = process.cwd()) {
|
|
8
|
+
const configPath = path.join(cwd, PROJECT_CONFIG_FILE);
|
|
9
|
+
try {
|
|
10
|
+
const data = await fs.readFile(configPath, 'utf-8');
|
|
11
|
+
const config = JSON.parse(data);
|
|
12
|
+
// バリデーション
|
|
13
|
+
if (!config.world?.distDir) {
|
|
14
|
+
throw new Error('xrift.json に world.distDir が設定されていません');
|
|
15
|
+
}
|
|
16
|
+
return config;
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
if (error.code === 'ENOENT') {
|
|
20
|
+
throw new Error(`プロジェクト設定ファイルが見つかりません: ${PROJECT_CONFIG_FILE}\n` +
|
|
21
|
+
'プロジェクトルートに xrift.json を作成してください。');
|
|
22
|
+
}
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* .xrift ディレクトリを作成
|
|
28
|
+
*/
|
|
29
|
+
async function ensureMetaDir(cwd = process.cwd()) {
|
|
30
|
+
const metaDir = path.join(cwd, PROJECT_META_DIR);
|
|
31
|
+
await fs.mkdir(metaDir, { recursive: true });
|
|
32
|
+
return metaDir;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* ワールドメタデータを読み込み
|
|
36
|
+
*/
|
|
37
|
+
export async function loadWorldMetadata(cwd = process.cwd()) {
|
|
38
|
+
const metaPath = path.join(cwd, PROJECT_META_DIR, WORLD_META_FILE);
|
|
39
|
+
try {
|
|
40
|
+
const data = await fs.readFile(metaPath, 'utf-8');
|
|
41
|
+
return JSON.parse(data);
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
if (error.code === 'ENOENT') {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* ワールドメタデータを保存
|
|
52
|
+
*/
|
|
53
|
+
export async function saveWorldMetadata(metadata, cwd = process.cwd()) {
|
|
54
|
+
await ensureMetaDir(cwd);
|
|
55
|
+
const metaPath = path.join(cwd, PROJECT_META_DIR, WORLD_META_FILE);
|
|
56
|
+
await fs.writeFile(metaPath, JSON.stringify(metadata, null, 2), 'utf-8');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* ディレクトリ内のファイルを再帰的にスキャン
|
|
60
|
+
*/
|
|
61
|
+
export async function scanDirectory(dirPath) {
|
|
62
|
+
const files = [];
|
|
63
|
+
async function scan(currentPath) {
|
|
64
|
+
const entries = await fs.readdir(currentPath, { withFileTypes: true });
|
|
65
|
+
for (const entry of entries) {
|
|
66
|
+
const fullPath = path.join(currentPath, entry.name);
|
|
67
|
+
if (entry.isDirectory()) {
|
|
68
|
+
await scan(fullPath);
|
|
69
|
+
}
|
|
70
|
+
else if (entry.isFile()) {
|
|
71
|
+
files.push(fullPath);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
await scan(dirPath);
|
|
76
|
+
return files;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* distディレクトリの検証
|
|
80
|
+
*/
|
|
81
|
+
export async function validateDistDir(distDir) {
|
|
82
|
+
try {
|
|
83
|
+
const stat = await fs.stat(distDir);
|
|
84
|
+
if (!stat.isDirectory()) {
|
|
85
|
+
throw new Error(`${distDir} はディレクトリではありません`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (error.code === 'ENOENT') {
|
|
90
|
+
throw new Error(`distディレクトリが見つかりません: ${distDir}`);
|
|
91
|
+
}
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=project-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-config.js","sourceRoot":"","sources":["../../src/lib/project-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/lib/upload.ts"],"names":[],"mappings":"AAiBA;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6J5E"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
import cliProgress from 'cli-progress';
|
|
6
|
+
import axios from 'axios';
|
|
7
|
+
import { loadProjectConfig, loadWorldMetadata, saveWorldMetadata, validateDistDir, scanDirectory, } from './project-config.js';
|
|
8
|
+
import { getAuthenticatedClient } from './api.js';
|
|
9
|
+
import { WORLD_CREATE_PATH, WORLD_UPDATE_PATH } from './constants.js';
|
|
10
|
+
/**
|
|
11
|
+
* ワールドをアップロード
|
|
12
|
+
*/
|
|
13
|
+
export async function uploadWorld(cwd = process.cwd()) {
|
|
14
|
+
console.log(chalk.blue('🌍 ワールドアップロードを開始します\n'));
|
|
15
|
+
let spinner;
|
|
16
|
+
try {
|
|
17
|
+
// 1. プロジェクト設定を読み込み
|
|
18
|
+
spinner = ora('プロジェクト設定を読み込み中...').start();
|
|
19
|
+
const config = await loadProjectConfig(cwd);
|
|
20
|
+
const distDir = path.resolve(cwd, config.world.distDir);
|
|
21
|
+
spinner.succeed(chalk.green(`設定を読み込みました: distDir=${config.world.distDir}`));
|
|
22
|
+
// 2. distディレクトリを検証
|
|
23
|
+
spinner = ora('distディレクトリを検証中...').start();
|
|
24
|
+
await validateDistDir(distDir);
|
|
25
|
+
spinner.succeed(chalk.green('distディレクトリを検証しました'));
|
|
26
|
+
// 3. ファイルをスキャン
|
|
27
|
+
spinner = ora('ファイルをスキャン中...').start();
|
|
28
|
+
const files = await scanDirectory(distDir);
|
|
29
|
+
if (files.length === 0) {
|
|
30
|
+
spinner.fail(chalk.red('アップロードするファイルが見つかりません'));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
spinner.succeed(chalk.green(`${files.length}個のファイルを検出しました`));
|
|
34
|
+
// 4. ファイル情報を準備
|
|
35
|
+
const uploadFiles = await Promise.all(files.map(async (filePath) => {
|
|
36
|
+
const stat = await fs.stat(filePath);
|
|
37
|
+
const relativePath = path.relative(distDir, filePath);
|
|
38
|
+
return {
|
|
39
|
+
localPath: filePath,
|
|
40
|
+
remotePath: relativePath.replace(/\\/g, '/'), // Windows対応
|
|
41
|
+
size: stat.size,
|
|
42
|
+
};
|
|
43
|
+
}));
|
|
44
|
+
// 5. 認証済みクライアントを取得
|
|
45
|
+
spinner = ora('認証情報を確認中...').start();
|
|
46
|
+
const client = await getAuthenticatedClient();
|
|
47
|
+
spinner.succeed(chalk.green('認証情報を確認しました'));
|
|
48
|
+
// 6. ワールドメタデータを確認(新規/更新判定)
|
|
49
|
+
const existingMetadata = await loadWorldMetadata(cwd);
|
|
50
|
+
let worldId;
|
|
51
|
+
if (existingMetadata) {
|
|
52
|
+
console.log(chalk.gray(`既存のワールドを更新します (ID: ${existingMetadata.id})`));
|
|
53
|
+
worldId = existingMetadata.id;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// 新規ワールド作成
|
|
57
|
+
spinner = ora('新規ワールドを作成中...').start();
|
|
58
|
+
try {
|
|
59
|
+
const response = await client.post(WORLD_CREATE_PATH, {
|
|
60
|
+
name: path.basename(cwd),
|
|
61
|
+
});
|
|
62
|
+
worldId = response.data.id;
|
|
63
|
+
spinner.succeed(chalk.green(`新規ワールドを作成しました (ID: ${worldId})`));
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
spinner.fail(chalk.red('ワールドの作成に失敗しました'));
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// 7. 署名付きURLを取得
|
|
71
|
+
spinner = ora('アップロード用URLを取得中...').start();
|
|
72
|
+
let signedUrls;
|
|
73
|
+
try {
|
|
74
|
+
const response = await client.post(`${WORLD_UPDATE_PATH}/${worldId}/upload-urls`, {
|
|
75
|
+
files: uploadFiles.map((f) => ({
|
|
76
|
+
path: f.remotePath,
|
|
77
|
+
size: f.size,
|
|
78
|
+
})),
|
|
79
|
+
});
|
|
80
|
+
signedUrls = response.data;
|
|
81
|
+
spinner.succeed(chalk.green(`${signedUrls.length}個のアップロードURLを取得しました`));
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
spinner.fail(chalk.red('アップロードURLの取得に失敗しました'));
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
// 8. ファイルをアップロード
|
|
88
|
+
console.log(chalk.blue('\n📤 ファイルをアップロード中...\n'));
|
|
89
|
+
const progressBar = new cliProgress.SingleBar({
|
|
90
|
+
format: `${chalk.cyan('{bar}')} | {percentage}% | {value}/{total} ファイル | {filename}`,
|
|
91
|
+
barCompleteChar: '█',
|
|
92
|
+
barIncompleteChar: '░',
|
|
93
|
+
hideCursor: true,
|
|
94
|
+
}, cliProgress.Presets.shades_classic);
|
|
95
|
+
progressBar.start(uploadFiles.length, 0, { filename: '' });
|
|
96
|
+
for (let i = 0; i < uploadFiles.length; i++) {
|
|
97
|
+
const fileInfo = uploadFiles[i];
|
|
98
|
+
const signedUrl = signedUrls[i];
|
|
99
|
+
progressBar.update(i, { filename: fileInfo.remotePath });
|
|
100
|
+
try {
|
|
101
|
+
const fileBuffer = await fs.readFile(fileInfo.localPath);
|
|
102
|
+
await axios.put(signedUrl.url, fileBuffer, {
|
|
103
|
+
headers: {
|
|
104
|
+
'Content-Type': getMimeType(fileInfo.localPath),
|
|
105
|
+
'Content-Length': fileInfo.size,
|
|
106
|
+
},
|
|
107
|
+
maxContentLength: Infinity,
|
|
108
|
+
maxBodyLength: Infinity,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
progressBar.stop();
|
|
113
|
+
console.error(chalk.red(`\n❌ ${fileInfo.remotePath} のアップロードに失敗しました`));
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
progressBar.update(uploadFiles.length, { filename: '完了' });
|
|
118
|
+
progressBar.stop();
|
|
119
|
+
// 9. メタデータを保存
|
|
120
|
+
await saveWorldMetadata({
|
|
121
|
+
id: worldId,
|
|
122
|
+
createdAt: existingMetadata?.createdAt || new Date().toISOString(),
|
|
123
|
+
lastUploadedAt: new Date().toISOString(),
|
|
124
|
+
}, cwd);
|
|
125
|
+
console.log(chalk.green(`\n✅ ワールドアップロード完了: ${uploadFiles.length}ファイル`));
|
|
126
|
+
console.log(chalk.gray(`ワールドID: ${worldId}`));
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
if (spinner) {
|
|
130
|
+
spinner.fail(chalk.red('エラーが発生しました'));
|
|
131
|
+
}
|
|
132
|
+
if (error instanceof Error) {
|
|
133
|
+
console.error(chalk.red(`\n❌ ${error.message}`));
|
|
134
|
+
}
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* ファイルのMIMEタイプを取得
|
|
140
|
+
*/
|
|
141
|
+
function getMimeType(filePath) {
|
|
142
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
143
|
+
const mimeTypes = {
|
|
144
|
+
'.glb': 'model/gltf-binary',
|
|
145
|
+
'.gltf': 'model/gltf+json',
|
|
146
|
+
'.png': 'image/png',
|
|
147
|
+
'.jpg': 'image/jpeg',
|
|
148
|
+
'.jpeg': 'image/jpeg',
|
|
149
|
+
'.webp': 'image/webp',
|
|
150
|
+
'.json': 'application/json',
|
|
151
|
+
'.js': 'application/javascript',
|
|
152
|
+
'.html': 'text/html',
|
|
153
|
+
'.css': 'text/css',
|
|
154
|
+
'.txt': 'text/plain',
|
|
155
|
+
'.bin': 'application/octet-stream',
|
|
156
|
+
};
|
|
157
|
+
return mimeTypes[ext] || 'application/octet-stream';
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/lib/upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XRift CLI Type Definitions
|
|
3
|
+
*/
|
|
4
|
+
export interface XriftConfig {
|
|
5
|
+
world: {
|
|
6
|
+
distDir: string;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export interface WorldMetadata {
|
|
10
|
+
id: string;
|
|
11
|
+
createdAt: string;
|
|
12
|
+
lastUploadedAt: string;
|
|
13
|
+
}
|
|
14
|
+
export interface AuthConfig {
|
|
15
|
+
token: string;
|
|
16
|
+
expiresAt?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface UploadFileInfo {
|
|
19
|
+
localPath: string;
|
|
20
|
+
remotePath: string;
|
|
21
|
+
size: number;
|
|
22
|
+
}
|
|
23
|
+
export interface SignedUrlResponse {
|
|
24
|
+
url: string;
|
|
25
|
+
key: string;
|
|
26
|
+
}
|
|
27
|
+
export interface CreateWorldResponse {
|
|
28
|
+
id: string;
|
|
29
|
+
name?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface VerifyTokenResponse {
|
|
32
|
+
valid: boolean;
|
|
33
|
+
userId?: string;
|
|
34
|
+
username?: string;
|
|
35
|
+
email?: string;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/package.json
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@xrift/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "XRift CLI tool for world and avatar uploads",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"xrift": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "tsx src/index.ts",
|
|
13
|
+
"watch": "tsc --watch",
|
|
14
|
+
"test": "jest",
|
|
15
|
+
"test:watch": "jest --watch",
|
|
16
|
+
"test:coverage": "jest --coverage",
|
|
17
|
+
"lint": "eslint src --ext .ts",
|
|
18
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
19
|
+
"type-check": "tsc --noEmit",
|
|
20
|
+
"prepublishOnly": "npm run type-check && npm run build"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"xrift",
|
|
24
|
+
"webxr",
|
|
25
|
+
"cli",
|
|
26
|
+
"world",
|
|
27
|
+
"upload"
|
|
28
|
+
],
|
|
29
|
+
"author": "WebXR-JP",
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "https://github.com/WebXR-JP/xrift-cli.git"
|
|
34
|
+
},
|
|
35
|
+
"homepage": "https://github.com/WebXR-JP/xrift-cli#readme",
|
|
36
|
+
"bugs": {
|
|
37
|
+
"url": "https://github.com/WebXR-JP/xrift-cli/issues"
|
|
38
|
+
},
|
|
39
|
+
"files": [
|
|
40
|
+
"dist",
|
|
41
|
+
"README.md",
|
|
42
|
+
"CONTRIBUTING.md",
|
|
43
|
+
"LICENSE"
|
|
44
|
+
],
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"axios": "^1.7.9",
|
|
47
|
+
"chalk": "^5.3.0",
|
|
48
|
+
"cli-progress": "^3.12.0",
|
|
49
|
+
"commander": "^12.1.0",
|
|
50
|
+
"open": "^10.1.0",
|
|
51
|
+
"ora": "^8.1.1"
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@jest/globals": "^30.2.0",
|
|
55
|
+
"@types/cli-progress": "^3.11.6",
|
|
56
|
+
"@types/jest": "^30.0.0",
|
|
57
|
+
"@types/node": "^22.10.2",
|
|
58
|
+
"@typescript-eslint/eslint-plugin": "^8.18.1",
|
|
59
|
+
"@typescript-eslint/parser": "^8.18.1",
|
|
60
|
+
"eslint": "^9.17.0",
|
|
61
|
+
"jest": "^30.2.0",
|
|
62
|
+
"prettier": "^3.4.2",
|
|
63
|
+
"ts-jest": "^29.4.5",
|
|
64
|
+
"tsx": "^4.19.2",
|
|
65
|
+
"typescript": "^5.7.2"
|
|
66
|
+
},
|
|
67
|
+
"engines": {
|
|
68
|
+
"node": ">=18.0.0"
|
|
69
|
+
}
|
|
70
|
+
}
|