@mattpeng/orbit-cli 0.0.1
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 +16 -0
- package/dist/commands/deploy.d.ts +38 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +156 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/dev.d.ts +3 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +10 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +41 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/package.json +62 -0
package/README.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
export interface DeployConfig {
|
|
3
|
+
outputDirectory: string;
|
|
4
|
+
name: string;
|
|
5
|
+
routes?: Array<{
|
|
6
|
+
path: string;
|
|
7
|
+
target: string;
|
|
8
|
+
}>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 加载部署配置文件
|
|
12
|
+
* 支持 JSON、MJS、JS 格式
|
|
13
|
+
*/
|
|
14
|
+
export declare function loadConfig(): Promise<DeployConfig | null>;
|
|
15
|
+
/**
|
|
16
|
+
* 将目录压缩为 ZIP 文件
|
|
17
|
+
*/
|
|
18
|
+
export declare function zipDirectory(sourceDir: string, outPath: string): Promise<void>;
|
|
19
|
+
export interface UploadResult {
|
|
20
|
+
deployment?: {
|
|
21
|
+
isActive: boolean;
|
|
22
|
+
id: string;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 上传 ZIP 文件到服务器
|
|
27
|
+
*/
|
|
28
|
+
export declare function uploadToServer(zipPath: string, token: string, hash: string, branch: string, serverUrl: string): Promise<UploadResult>;
|
|
29
|
+
export interface GitInfo {
|
|
30
|
+
branch: string;
|
|
31
|
+
hash: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 获取 Git 信息
|
|
35
|
+
*/
|
|
36
|
+
export declare function getGitInfo(): Promise<GitInfo>;
|
|
37
|
+
export declare const deployCommand: Command;
|
|
38
|
+
//# sourceMappingURL=deploy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAUnC,MAAM,WAAW,YAAY;IAC3B,eAAe,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;KACf,CAAC,CAAA;CACH;AAED;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAsB/D;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAapF;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE;QACX,QAAQ,EAAE,OAAO,CAAA;QACjB,EAAE,EAAE,MAAM,CAAA;KACX,CAAA;CACF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC,CA0BvB;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAcnD;AAED,eAAO,MAAM,aAAa,SA2EtB,CAAA"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import fs from 'fs/promises';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import archiver from 'archiver';
|
|
7
|
+
import { simpleGit } from 'simple-git';
|
|
8
|
+
const git = simpleGit();
|
|
9
|
+
/**
|
|
10
|
+
* 加载部署配置文件
|
|
11
|
+
* 支持 JSON、MJS、JS 格式
|
|
12
|
+
*/
|
|
13
|
+
export async function loadConfig() {
|
|
14
|
+
const configFiles = ['orbit-deploy.json', 'orbit-deploy.mjs', 'orbit-deploy.js'];
|
|
15
|
+
for (const configFile of configFiles) {
|
|
16
|
+
const configPath = path.join(process.cwd(), configFile);
|
|
17
|
+
try {
|
|
18
|
+
await fs.access(configPath);
|
|
19
|
+
if (configFile.endsWith('.json')) {
|
|
20
|
+
const content = await fs.readFile(configPath, 'utf-8');
|
|
21
|
+
return JSON.parse(content);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
const module = await import(configPath);
|
|
25
|
+
return module.default || module;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
// 文件不存在,继续尝试下一个
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 将目录压缩为 ZIP 文件
|
|
37
|
+
*/
|
|
38
|
+
export async function zipDirectory(sourceDir, outPath) {
|
|
39
|
+
const archive = archiver('zip', { zlib: { level: 9 } });
|
|
40
|
+
const stream = require('fs').createWriteStream(outPath);
|
|
41
|
+
return new Promise((resolve, reject) => {
|
|
42
|
+
archive
|
|
43
|
+
.directory(sourceDir, false)
|
|
44
|
+
.on('error', err => reject(err))
|
|
45
|
+
.pipe(stream);
|
|
46
|
+
stream.on('close', () => resolve());
|
|
47
|
+
archive.finalize();
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 上传 ZIP 文件到服务器
|
|
52
|
+
*/
|
|
53
|
+
export async function uploadToServer(zipPath, token, hash, branch, serverUrl) {
|
|
54
|
+
// 读取 zip 文件并转换为 base64
|
|
55
|
+
const fileBuffer = await fs.readFile(zipPath);
|
|
56
|
+
const fileData = fileBuffer.toString('base64');
|
|
57
|
+
// 调用 tRPC 接口
|
|
58
|
+
const response = await fetch(`${serverUrl}/trpc/upload.deploy`, {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
headers: {
|
|
61
|
+
'Content-Type': 'application/json',
|
|
62
|
+
'x-deploy-token': token,
|
|
63
|
+
},
|
|
64
|
+
body: JSON.stringify({
|
|
65
|
+
hash,
|
|
66
|
+
branch,
|
|
67
|
+
fileData,
|
|
68
|
+
}),
|
|
69
|
+
});
|
|
70
|
+
if (!response.ok) {
|
|
71
|
+
const error = await response.json();
|
|
72
|
+
throw new Error(error.error?.message || 'Upload failed');
|
|
73
|
+
}
|
|
74
|
+
const result = await response.json();
|
|
75
|
+
return result.result?.data || result;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 获取 Git 信息
|
|
79
|
+
*/
|
|
80
|
+
export async function getGitInfo() {
|
|
81
|
+
const isRepo = await git.checkIsRepo();
|
|
82
|
+
if (!isRepo) {
|
|
83
|
+
return {
|
|
84
|
+
branch: 'main',
|
|
85
|
+
hash: Date.now().toString(),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
const branch = await git.revparse(['--abbrev-ref', 'HEAD']);
|
|
89
|
+
const hash = await git.revparse(['HEAD']);
|
|
90
|
+
return { branch: branch.trim(), hash: hash.trim() };
|
|
91
|
+
}
|
|
92
|
+
export const deployCommand = new Command('deploy')
|
|
93
|
+
.description('Deploy static assets to Orbit platform')
|
|
94
|
+
.option('--token <token>', 'Deploy token (can also use DEPLOY_TOKEN env var)')
|
|
95
|
+
.option('--server <url>', 'Server URL', 'http://localhost:3001')
|
|
96
|
+
.action(async (options) => {
|
|
97
|
+
console.log(chalk.blue.bold('\n🚀 Orbit Deploy\n'));
|
|
98
|
+
const spinner = ora('Loading configuration...').start();
|
|
99
|
+
try {
|
|
100
|
+
// 1. 加载配置文件
|
|
101
|
+
const config = await loadConfig();
|
|
102
|
+
if (!config) {
|
|
103
|
+
spinner.fail('No deployment configuration found');
|
|
104
|
+
console.log(chalk.yellow('\nPlease create orbit-deploy.json or orbit-deploy.mjs in your project root.'));
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
spinner.succeed('Configuration loaded');
|
|
108
|
+
// 2. 验证 token
|
|
109
|
+
const token = options.token || process.env.DEPLOY_TOKEN;
|
|
110
|
+
if (!token) {
|
|
111
|
+
spinner.fail('Deploy token is required');
|
|
112
|
+
console.log(chalk.yellow('\nUse --token option or set DEPLOY_TOKEN environment variable.'));
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
// 3. 获取 Git 信息
|
|
116
|
+
spinner.start('Reading Git information...');
|
|
117
|
+
const { branch, hash } = await getGitInfo();
|
|
118
|
+
spinner.succeed(`Git info: ${branch}@${hash.substring(0, 7)}`);
|
|
119
|
+
// 4. 检查产物目录
|
|
120
|
+
const outputDir = path.join(process.cwd(), config.outputDirectory);
|
|
121
|
+
spinner.start('Checking output directory...');
|
|
122
|
+
try {
|
|
123
|
+
await fs.access(outputDir);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
spinner.fail(`Output directory not found: ${outputDir}`);
|
|
127
|
+
console.log(chalk.yellow('\nPlease build your project first.'));
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
spinner.succeed('Output directory found');
|
|
131
|
+
// 5. 压缩产物
|
|
132
|
+
const zipPath = path.join(process.cwd(), `.orbit-deploy-${Date.now()}.zip`);
|
|
133
|
+
spinner.start('Compressing assets...');
|
|
134
|
+
await zipDirectory(outputDir, zipPath);
|
|
135
|
+
const stats = await fs.stat(zipPath);
|
|
136
|
+
spinner.succeed(`Assets compressed (${(stats.size / 1024 / 1024).toFixed(2)}MB)`);
|
|
137
|
+
// 6. 上传到服务器
|
|
138
|
+
spinner.start('Uploading to server...');
|
|
139
|
+
const result = await uploadToServer(zipPath, token, hash, branch, options.server);
|
|
140
|
+
spinner.succeed('Upload completed');
|
|
141
|
+
// 7. 清理临时文件
|
|
142
|
+
await fs.unlink(zipPath);
|
|
143
|
+
console.log(chalk.green('\n✓ Deployment successful!\n'));
|
|
144
|
+
console.log(chalk.cyan('Details:'));
|
|
145
|
+
console.log(chalk.gray(` Project: ${config.name}`));
|
|
146
|
+
console.log(chalk.gray(` Branch: ${branch}`));
|
|
147
|
+
console.log(chalk.gray(` Hash: ${hash.substring(0, 7)}`));
|
|
148
|
+
console.log(chalk.gray(` Active: ${result.deployment?.isActive ? 'Yes' : 'No'}\n`));
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
spinner.fail('Deployment failed');
|
|
152
|
+
console.error(chalk.red(`\n✖ ${error.message}\n`));
|
|
153
|
+
process.exit(1);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
//# sourceMappingURL=deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,EAAE,MAAM,aAAa,CAAA;AAC5B,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEtC,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;AAWvB;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,WAAW,GAAG,CAAC,mBAAmB,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,CAAA;IAEhF,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAA;QACvD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;YAE3B,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;gBACtD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAC5B,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAA;gBACvC,OAAO,MAAM,CAAC,OAAO,IAAI,MAAM,CAAA;YACjC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gBAAgB;YAChB,SAAQ;QACV,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,SAAiB,EAAE,OAAe;IACnE,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IACvD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA;IAEvD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,OAAO;aACJ,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC;aAC3B,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;aAC/B,IAAI,CAAC,MAAM,CAAC,CAAA;QAEf,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;QACnC,OAAO,CAAC,QAAQ,EAAE,CAAA;IACpB,CAAC,CAAC,CAAA;AACJ,CAAC;AASD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAe,EACf,KAAa,EACb,IAAY,EACZ,MAAc,EACd,SAAiB;IAEjB,uBAAuB;IACvB,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC7C,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAE9C,aAAa;IACb,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,SAAS,qBAAqB,EAAE;QAC9D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,gBAAgB,EAAE,KAAK;SACxB;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,IAAI;YACJ,MAAM;YACN,QAAQ;SACT,CAAC;KACH,CAAC,CAAA;IAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,KAAK,GAAQ,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QACxC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,CAAC,CAAA;IAC1D,CAAC;IAED,MAAM,MAAM,GAAQ,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IACzC,OAAO,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,MAAM,CAAA;AACtC,CAAC;AAOD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAA;IAEtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;SAC5B,CAAA;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAA;IAC3D,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;IAEzC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAA;AACrD,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,iBAAiB,EAAE,kDAAkD,CAAC;KAC7E,MAAM,CAAC,gBAAgB,EAAE,YAAY,EAAE,uBAAuB,CAAC;KAC/D,MAAM,CAAC,KAAK,EAAC,OAAO,EAAC,EAAE;IACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAA;IAEnD,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAA;IAEvD,IAAI,CAAC;QACH,YAAY;QACZ,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;QACjC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAA;YACjD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,6EAA6E,CAC9E,CACF,CAAA;YACD,OAAM;QACR,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAA;QAEvC,cAAc;QACd,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAA;QACvD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;YACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gEAAgE,CAAC,CAAC,CAAA;YAC3F,OAAM;QACR,CAAC;QAED,eAAe;QACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAA;QAC3C,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,EAAE,CAAA;QAC3C,OAAO,CAAC,OAAO,CAAC,aAAa,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;QAE9D,YAAY;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,eAAe,CAAC,CAAA;QAClE,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAA;QAE7C,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAA;YACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC,CAAA;YAC/D,OAAM;QACR,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAA;QAEzC,UAAU;QACV,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iBAAiB,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QAC3E,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;QACtC,MAAM,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QACtC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACpC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;QAEjF,YAAY;QACZ,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAA;QACvC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;QACjF,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;QAEnC,YAAY;QACZ,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAExB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAA;QACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC,CAAA;QAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAA;IACtF,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;QACjC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAA;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,eAAO,MAAM,UAAU,SAMnB,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
export const devCommand = new Command('dev')
|
|
4
|
+
.description('Start development server')
|
|
5
|
+
.option('-p, --port <port>', 'Port to run on', '3000')
|
|
6
|
+
.action(options => {
|
|
7
|
+
console.log(chalk.green(`\n🚀 Starting development server on port ${options.port}...\n`));
|
|
8
|
+
// Development server logic would go here
|
|
9
|
+
});
|
|
10
|
+
//# sourceMappingURL=dev.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KACzC,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,CAAC;KACrD,MAAM,CAAC,OAAO,CAAC,EAAE;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,4CAA4C,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC,CAAA;IACzF,yCAAyC;AAC3C,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKnC,eAAO,MAAM,WAAW,SAyCpB,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import prompts from 'prompts';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
export const initCommand = new Command('init')
|
|
6
|
+
.description('Initialize a new Orbit project')
|
|
7
|
+
.action(async () => {
|
|
8
|
+
console.log(chalk.blue.bold('\n🚀 Orbit Project Initializer\n'));
|
|
9
|
+
const response = await prompts([
|
|
10
|
+
{
|
|
11
|
+
type: 'text',
|
|
12
|
+
name: 'projectName',
|
|
13
|
+
message: 'What is your project name?',
|
|
14
|
+
initial: 'my-orbit-app',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
type: 'select',
|
|
18
|
+
name: 'template',
|
|
19
|
+
message: 'Choose a template:',
|
|
20
|
+
choices: [
|
|
21
|
+
{ title: 'Full Stack (Web + Server)', value: 'fullstack' },
|
|
22
|
+
{ title: 'Server Only', value: 'server' },
|
|
23
|
+
{ title: 'Web Only', value: 'web' },
|
|
24
|
+
],
|
|
25
|
+
initial: 0,
|
|
26
|
+
},
|
|
27
|
+
]);
|
|
28
|
+
if (!response.projectName) {
|
|
29
|
+
console.log(chalk.red('✖ Project initialization cancelled'));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const spinner = ora('Creating project...').start();
|
|
33
|
+
// Simulate project creation
|
|
34
|
+
await new Promise(resolve => setTimeout(resolve, 1500));
|
|
35
|
+
spinner.succeed(chalk.green(`✓ Project ${response.projectName} created successfully!`));
|
|
36
|
+
console.log(chalk.cyan('\nNext steps:'));
|
|
37
|
+
console.log(chalk.gray(` cd ${response.projectName}`));
|
|
38
|
+
console.log(chalk.gray(' pnpm install'));
|
|
39
|
+
console.log(chalk.gray(' pnpm dev\n'));
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,OAAO,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,GAAG,MAAM,KAAK,CAAA;AAErB,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAA;IAEhE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;QAC7B;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,4BAA4B;YACrC,OAAO,EAAE,cAAc;SACxB;QACD;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,oBAAoB;YAC7B,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,2BAA2B,EAAE,KAAK,EAAE,WAAW,EAAE;gBAC1D,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACzC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE;aACpC;YACD,OAAO,EAAE,CAAC;SACX;KACF,CAAC,CAAA;IAEF,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC,CAAA;QAC5D,OAAM;IACR,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC,KAAK,EAAE,CAAA;IAElD,4BAA4B;IAC5B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;IAEvD,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,QAAQ,CAAC,WAAW,wBAAwB,CAAC,CAAC,CAAA;IAEvF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAA;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAA;IACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAA;AACzC,CAAC,CAAC,CAAA"}
|
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,28 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { APP_NAME } from '@orbit/shared';
|
|
5
|
+
import { initCommand } from './commands/init';
|
|
6
|
+
import { devCommand } from './commands/dev';
|
|
7
|
+
import { deployCommand } from './commands/deploy';
|
|
8
|
+
const program = new Command();
|
|
9
|
+
program
|
|
10
|
+
.name('orbit')
|
|
11
|
+
.description(`${APP_NAME} CLI - A powerful deployment toolkit`)
|
|
12
|
+
.version('0.0.1');
|
|
13
|
+
// Register commands
|
|
14
|
+
program.addCommand(initCommand);
|
|
15
|
+
program.addCommand(devCommand);
|
|
16
|
+
program.addCommand(deployCommand);
|
|
17
|
+
// Handle unknown commands
|
|
18
|
+
program.on('command:*', () => {
|
|
19
|
+
console.error(chalk.red('\n✖ Invalid command: %s\n'), program.args.join(' '));
|
|
20
|
+
program.help();
|
|
21
|
+
});
|
|
22
|
+
// Parse arguments
|
|
23
|
+
program.parse();
|
|
24
|
+
// Show help if no command provided
|
|
25
|
+
if (!process.argv.slice(2).length) {
|
|
26
|
+
program.outputHelp();
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,GAAG,QAAQ,sCAAsC,CAAC;KAC9D,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;AAC/B,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;AAC9B,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAA;AAEjC,0BAA0B;AAC1B,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;IAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IAC7E,OAAO,CAAC,IAAI,EAAE,CAAA;AAChB,CAAC,CAAC,CAAA;AAEF,kBAAkB;AAClB,OAAO,CAAC,KAAK,EAAE,CAAA;AAEf,mCAAmC;AACnC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,UAAU,EAAE,CAAA;AACtB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mattpeng/orbit-cli",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Orbit CLI - A powerful deployment toolkit for frontend projects",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"orbit": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"keywords": [
|
|
14
|
+
"deploy",
|
|
15
|
+
"deployment",
|
|
16
|
+
"cli",
|
|
17
|
+
"frontend",
|
|
18
|
+
"orbit"
|
|
19
|
+
],
|
|
20
|
+
"author": "mattpeng",
|
|
21
|
+
"license": "MIT",
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "https://github.com/mattpeng/orbit.git",
|
|
25
|
+
"directory": "packages/cli"
|
|
26
|
+
},
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"dev": "tsx watch src/index.ts",
|
|
32
|
+
"build": "tsc",
|
|
33
|
+
"start": "node dist/index.js",
|
|
34
|
+
"prepublishOnly": "pnpm build && pnpm test:run && pnpm type-check",
|
|
35
|
+
"test": "vitest",
|
|
36
|
+
"test:ui": "vitest --ui",
|
|
37
|
+
"test:run": "vitest run",
|
|
38
|
+
"test:coverage": "vitest run --coverage",
|
|
39
|
+
"type-check": "tsc --noEmit",
|
|
40
|
+
"lint": "eslint .",
|
|
41
|
+
"format": "prettier --write ."
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@orbit/shared": "workspace:*",
|
|
45
|
+
"archiver": "^7.0.1",
|
|
46
|
+
"chalk": "^5.4.1",
|
|
47
|
+
"commander": "^12.1.0",
|
|
48
|
+
"form-data": "^4.0.5",
|
|
49
|
+
"ora": "^8.1.1",
|
|
50
|
+
"prompts": "^2.4.2",
|
|
51
|
+
"simple-git": "^3.30.0"
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@types/archiver": "^7.0.0",
|
|
55
|
+
"@types/node": "^22.10.2",
|
|
56
|
+
"@types/prompts": "^2.4.9",
|
|
57
|
+
"@vitest/ui": "^4.0.16",
|
|
58
|
+
"tsx": "^4.19.2",
|
|
59
|
+
"typescript": "^5.9.3",
|
|
60
|
+
"vitest": "^4.0.16"
|
|
61
|
+
}
|
|
62
|
+
}
|