@jetstart/cli 1.7.0 → 2.0.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/README.md +133 -41
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +11 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/android-emulator.d.ts.map +1 -0
- package/dist/commands/android-emulator.js.map +1 -0
- package/dist/commands/build.d.ts +13 -1
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +279 -29
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/clean.d.ts +23 -0
- package/dist/commands/clean.d.ts.map +1 -0
- package/dist/commands/clean.js +191 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +41 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +51 -9
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/install-audit.d.ts.map +1 -0
- package/dist/commands/install-audit.js.map +1 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/android-sdk.d.ts.map +1 -0
- package/dist/utils/android-sdk.js +2 -2
- package/dist/utils/android-sdk.js.map +1 -0
- package/dist/utils/downloader.d.ts.map +1 -0
- package/dist/utils/downloader.js.map +1 -0
- package/dist/utils/emulator-deployer.d.ts.map +1 -0
- package/dist/utils/emulator-deployer.js.map +1 -0
- package/dist/utils/emulator.d.ts.map +1 -0
- package/dist/utils/emulator.js +5 -4
- package/dist/utils/emulator.js.map +1 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/java.d.ts.map +1 -0
- package/dist/utils/java.js +5 -5
- package/dist/utils/java.js.map +1 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/open.d.ts.map +1 -0
- package/dist/utils/open.js.map +1 -0
- package/dist/utils/prompt.d.ts.map +1 -0
- package/dist/utils/prompt.js.map +1 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js.map +1 -0
- package/dist/utils/system-tools.d.ts.map +1 -0
- package/dist/utils/system-tools.js.map +1 -0
- package/dist/utils/template.d.ts +13 -1
- package/dist/utils/template.d.ts.map +1 -0
- package/dist/utils/template.js +133 -1000
- package/dist/utils/template.js.map +1 -0
- package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/1.0.0/com.jetstart.hot-reload.gradle.plugin-1.0.0.pom +15 -0
- package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/1.0.0/com.jetstart.hot-reload.gradle.plugin-1.0.0.pom.md5 +1 -0
- package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/1.0.0/com.jetstart.hot-reload.gradle.plugin-1.0.0.pom.sha1 +1 -0
- package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/1.0.0/com.jetstart.hot-reload.gradle.plugin-1.0.0.pom.sha256 +1 -0
- package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/1.0.0/com.jetstart.hot-reload.gradle.plugin-1.0.0.pom.sha512 +1 -0
- package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/maven-metadata.xml +13 -0
- package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/maven-metadata.xml.md5 +1 -0
- package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/maven-metadata.xml.sha1 +1 -0
- package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/maven-metadata.xml.sha256 +1 -0
- package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/maven-metadata.xml.sha512 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0-sources.jar +0 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0-sources.jar.md5 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0-sources.jar.sha1 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0-sources.jar.sha256 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0-sources.jar.sha512 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.aar +0 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.aar.md5 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.aar.sha1 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.aar.sha256 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.aar.sha512 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.module +124 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.module.md5 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.module.sha1 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.module.sha256 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.module.sha512 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.pom +46 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.pom.md5 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.pom.sha1 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.pom.sha256 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.pom.sha512 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/maven-metadata.xml +13 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/maven-metadata.xml.md5 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/maven-metadata.xml.sha1 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/maven-metadata.xml.sha256 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/maven-metadata.xml.sha512 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.jar +0 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.jar.md5 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.jar.sha1 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.jar.sha256 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.jar.sha512 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.module +103 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.module.md5 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.module.sha1 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.module.sha256 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.module.sha512 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.pom +38 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.pom.md5 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.pom.sha1 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.pom.sha256 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.pom.sha512 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/maven-metadata.xml +13 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/maven-metadata.xml.md5 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/maven-metadata.xml.sha1 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/maven-metadata.xml.sha256 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/maven-metadata.xml.sha512 +1 -0
- package/package.json +13 -5
- package/scripts/build-java.js +30 -0
- package/.eslintrc.json +0 -6
- package/src/cli.ts +0 -99
- package/src/commands/android-emulator.ts +0 -304
- package/src/commands/build.ts +0 -60
- package/src/commands/create.ts +0 -232
- package/src/commands/dev.ts +0 -198
- package/src/commands/index.ts +0 -10
- package/src/commands/install-audit.ts +0 -227
- package/src/commands/logs.ts +0 -117
- package/src/index.ts +0 -17
- package/src/types/index.ts +0 -53
- package/src/utils/android-sdk.ts +0 -512
- package/src/utils/downloader.ts +0 -201
- package/src/utils/emulator-deployer.ts +0 -210
- package/src/utils/emulator.ts +0 -463
- package/src/utils/index.ts +0 -8
- package/src/utils/java.ts +0 -369
- package/src/utils/logger.ts +0 -42
- package/src/utils/open.ts +0 -36
- package/src/utils/prompt.ts +0 -56
- package/src/utils/spinner.ts +0 -25
- package/src/utils/system-tools.ts +0 -648
- package/src/utils/template.ts +0 -1214
- package/tests/create.test.ts +0 -33
- package/tests/utils.test.ts +0 -17
- package/tsconfig.json +0 -25
package/src/commands/dev.ts
DELETED
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dev Command
|
|
3
|
-
* Starts the development server
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import * as path from 'path';
|
|
7
|
-
import * as os from 'os';
|
|
8
|
-
import * as fs from 'fs-extra';
|
|
9
|
-
import chalk from 'chalk';
|
|
10
|
-
import qrcode from 'qrcode-terminal';
|
|
11
|
-
import { log, success, error, info, warning } from '../utils/logger';
|
|
12
|
-
import { JetStartServer } from '@jetstart/core';
|
|
13
|
-
import { DEFAULT_CORE_PORT, DEFAULT_WS_PORT } from '@jetstart/shared';
|
|
14
|
-
import { DevOptions } from '../types';
|
|
15
|
-
import { EmulatorDeployer } from '../utils/emulator-deployer';
|
|
16
|
-
import { openBrowser } from '../utils/open';
|
|
17
|
-
|
|
18
|
-
export async function devCommand(options: DevOptions) {
|
|
19
|
-
try {
|
|
20
|
-
const port = parseInt(options.port || String(DEFAULT_CORE_PORT));
|
|
21
|
-
const wsPort = DEFAULT_WS_PORT;
|
|
22
|
-
const host = options.host || getLocalIP();
|
|
23
|
-
const showQR = options.qr !== false;
|
|
24
|
-
|
|
25
|
-
log('Starting JetStart development server...');
|
|
26
|
-
console.log();
|
|
27
|
-
|
|
28
|
-
// Get project path and name
|
|
29
|
-
const projectPath = process.cwd();
|
|
30
|
-
const projectName = path.basename(projectPath);
|
|
31
|
-
|
|
32
|
-
// Setup emulator deployment if requested
|
|
33
|
-
let deployer: EmulatorDeployer | null = null;
|
|
34
|
-
let packageName: string | null = null;
|
|
35
|
-
|
|
36
|
-
if (options.emulator) {
|
|
37
|
-
try {
|
|
38
|
-
deployer = await EmulatorDeployer.findOrSelectEmulator(options.avd);
|
|
39
|
-
|
|
40
|
-
// Try to read package name from build.gradle (modern Android)
|
|
41
|
-
const buildGradlePath = path.join(projectPath, 'app/build.gradle');
|
|
42
|
-
info(`Looking for build.gradle at: ${buildGradlePath}`);
|
|
43
|
-
if (await fs.pathExists(buildGradlePath)) {
|
|
44
|
-
const buildGradleContent = await fs.readFile(buildGradlePath, 'utf8');
|
|
45
|
-
// Match both applicationId "..." and applicationId '...'
|
|
46
|
-
const packageMatch = buildGradleContent.match(/applicationId\s+["']([^"']+)["']/);
|
|
47
|
-
packageName = packageMatch ? packageMatch[1] : null;
|
|
48
|
-
info(`Package name: ${packageName || 'NOT FOUND'}`);
|
|
49
|
-
} else {
|
|
50
|
-
warning('build.gradle not found - emulator deployment requires package name');
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (packageName) {
|
|
54
|
-
success('Emulator deployment enabled');
|
|
55
|
-
} else {
|
|
56
|
-
warning('Emulator deployment disabled: package name not found');
|
|
57
|
-
}
|
|
58
|
-
console.log();
|
|
59
|
-
} catch (err: any) {
|
|
60
|
-
error(`Emulator setup failed: ${err.message}`);
|
|
61
|
-
info('Continuing without emulator deployment...');
|
|
62
|
-
console.log();
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// Create and start Core server
|
|
67
|
-
// Bind to 0.0.0.0 to accept connections on all interfaces,
|
|
68
|
-
// but pass the detected IP for display and client connections
|
|
69
|
-
const server = new JetStartServer({
|
|
70
|
-
httpPort: port,
|
|
71
|
-
wsPort,
|
|
72
|
-
host: '0.0.0.0', // Bind to all interfaces for maximum compatibility
|
|
73
|
-
displayHost: host, // Use detected IP for display and client connections
|
|
74
|
-
projectPath,
|
|
75
|
-
projectName,
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
const session = await server.start();
|
|
79
|
-
|
|
80
|
-
// Listen for build completion and deploy to emulator
|
|
81
|
-
if (deployer && packageName) {
|
|
82
|
-
info(`Setting up build:complete listener for package: ${packageName}`);
|
|
83
|
-
let hasDeployed = false; // Track if we've already deployed to prevent reinstall loops
|
|
84
|
-
|
|
85
|
-
server.on('build:complete', async (result: any) => {
|
|
86
|
-
info(`Build complete event received! APK: ${result.apkPath || 'NO APK PATH'}`);
|
|
87
|
-
|
|
88
|
-
// Only deploy if this is the first time OR if it's a file-change build (not initial client connection)
|
|
89
|
-
if (!hasDeployed && result.apkPath && deployer) {
|
|
90
|
-
try {
|
|
91
|
-
info('Deploying to emulator (initial deployment)...');
|
|
92
|
-
await deployer.installAPK(result.apkPath, packageName!);
|
|
93
|
-
await deployer.launchApp(packageName!);
|
|
94
|
-
hasDeployed = true; // Mark as deployed to prevent reinstall loop
|
|
95
|
-
success('Initial deployment complete. Future builds will be sent via hot reload.');
|
|
96
|
-
} catch (err: any) {
|
|
97
|
-
warning(`Emulator deployment failed: ${err.message}`);
|
|
98
|
-
}
|
|
99
|
-
} else if (hasDeployed) {
|
|
100
|
-
info('Skipping deployment (app already installed, using hot reload)');
|
|
101
|
-
} else {
|
|
102
|
-
warning(`Skipping deployment: apkPath=${result.apkPath}, deployer=${!!deployer}`);
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
} else {
|
|
106
|
-
info(`Emulator deployment not configured: deployer=${!!deployer}, packageName=${packageName}`);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// Get URLs
|
|
110
|
-
const serverUrl = `http://${host}:${port}`;
|
|
111
|
-
const localUrl = `http://localhost:${port}`;
|
|
112
|
-
|
|
113
|
-
console.log();
|
|
114
|
-
success('JetStart dev server is running!');
|
|
115
|
-
console.log();
|
|
116
|
-
info(`Local: ${chalk.cyan(localUrl)}`);
|
|
117
|
-
info(`Network: ${chalk.cyan(serverUrl)}`);
|
|
118
|
-
info(`Project: ${chalk.cyan(projectName)}`);
|
|
119
|
-
console.log();
|
|
120
|
-
|
|
121
|
-
// Generate QR code for mobile connection
|
|
122
|
-
if (showQR) {
|
|
123
|
-
// Ultra-compact format: host|port|wsPort|sessionId|token|projectName
|
|
124
|
-
// Using short alphanumeric IDs for minimal QR code size
|
|
125
|
-
const qrData = `${host}|${port}|${wsPort}|${session.id}|${session.token}|${projectName}`;
|
|
126
|
-
|
|
127
|
-
console.log(chalk.bold('Scan QR or connect manually:'));
|
|
128
|
-
qrcode.generate(qrData, { small: true });
|
|
129
|
-
console.log();
|
|
130
|
-
info(`IP: ${chalk.cyan(host)}`);
|
|
131
|
-
info(`Session: ${chalk.dim(session.id)}`);
|
|
132
|
-
info(`Token: ${chalk.dim(session.token)}`);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// Auto-open browser for Web Emulator if requested
|
|
136
|
-
if (options.web) {
|
|
137
|
-
info('Opening Web Emulator...');
|
|
138
|
-
openBrowser(localUrl);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
info('Watching for file changes...');
|
|
142
|
-
info('Press Ctrl+C to stop');
|
|
143
|
-
console.log();
|
|
144
|
-
|
|
145
|
-
// Handle graceful shutdown
|
|
146
|
-
process.on('SIGINT', async () => {
|
|
147
|
-
console.log();
|
|
148
|
-
log('Shutting down dev server...');
|
|
149
|
-
await server.stop();
|
|
150
|
-
process.exit(0);
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
process.on('SIGTERM', async () => {
|
|
154
|
-
console.log();
|
|
155
|
-
log('Shutting down dev server...');
|
|
156
|
-
await server.stop();
|
|
157
|
-
process.exit(0);
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
// Keep process alive
|
|
161
|
-
await new Promise(() => {}); // Keep alive forever
|
|
162
|
-
|
|
163
|
-
} catch (err: any) {
|
|
164
|
-
error(`Failed to start dev server: ${err.message}`);
|
|
165
|
-
console.error(err.stack);
|
|
166
|
-
process.exit(1);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
function getLocalIP(): string {
|
|
171
|
-
const interfaces = os.networkInterfaces();
|
|
172
|
-
const addresses: string[] = [];
|
|
173
|
-
|
|
174
|
-
for (const name of Object.keys(interfaces)) {
|
|
175
|
-
const iface = interfaces[name];
|
|
176
|
-
if (!iface) continue;
|
|
177
|
-
|
|
178
|
-
for (const alias of iface) {
|
|
179
|
-
// Handle both 'IPv4' string (Node.js 18+) and numeric 4 (older versions)
|
|
180
|
-
const isIPv4 = alias.family === 'IPv4' || (alias.family as any) === 4;
|
|
181
|
-
|
|
182
|
-
if (isIPv4 && !alias.internal) {
|
|
183
|
-
// Prefer addresses starting with 192.168 (typical home/hotspot network)
|
|
184
|
-
if (alias.address.startsWith('192.168')) {
|
|
185
|
-
return alias.address;
|
|
186
|
-
}
|
|
187
|
-
addresses.push(alias.address);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// Return first non-internal IPv4 address found
|
|
193
|
-
if (addresses.length > 0) {
|
|
194
|
-
return addresses[0];
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
return 'localhost';
|
|
198
|
-
}
|
package/src/commands/index.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Export all commands
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export { createCommand } from './create';
|
|
6
|
-
export { devCommand } from './dev';
|
|
7
|
-
export { buildCommand } from './build';
|
|
8
|
-
export { logsCommand } from './logs';
|
|
9
|
-
export { installAuditCommand } from './install-audit';
|
|
10
|
-
export { androidEmulatorCommand } from './android-emulator';
|
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Installation audit command - checks all required tools and dependencies
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import chalk from 'chalk';
|
|
6
|
-
import { AuditOptions } from '../types';
|
|
7
|
-
import {
|
|
8
|
-
detectNode,
|
|
9
|
-
detectNpm,
|
|
10
|
-
detectJava,
|
|
11
|
-
detectGradle,
|
|
12
|
-
detectAndroidSDK,
|
|
13
|
-
detectAndroidCmdlineTools,
|
|
14
|
-
detectAndroidBuildTools,
|
|
15
|
-
detectAndroidPlatformTools,
|
|
16
|
-
detectAndroidEmulator,
|
|
17
|
-
detectAndroidPlatform,
|
|
18
|
-
checkJavaHome,
|
|
19
|
-
checkAndroidHome,
|
|
20
|
-
ToolInfo,
|
|
21
|
-
} from '../utils/system-tools';
|
|
22
|
-
import { warning } from '../utils/logger';
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Print tool status in table format
|
|
26
|
-
*/
|
|
27
|
-
function printToolStatus(tool: ToolInfo): void {
|
|
28
|
-
const icon =
|
|
29
|
-
tool.status === 'ok'
|
|
30
|
-
? chalk.green('✓')
|
|
31
|
-
: tool.status === 'warning'
|
|
32
|
-
? chalk.yellow('⚠')
|
|
33
|
-
: chalk.red('✗');
|
|
34
|
-
|
|
35
|
-
const name = tool.name.padEnd(25);
|
|
36
|
-
const version = (tool.version || (tool.installed ? 'Unknown' : 'Not installed')).padEnd(15);
|
|
37
|
-
|
|
38
|
-
let statusText = '';
|
|
39
|
-
if (tool.status === 'ok') {
|
|
40
|
-
statusText = chalk.green('OK');
|
|
41
|
-
} else if (tool.status === 'warning') {
|
|
42
|
-
statusText = chalk.yellow(tool.message || 'Warning');
|
|
43
|
-
} else {
|
|
44
|
-
statusText = chalk.red(tool.message || 'ERROR');
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
console.log(` ${icon} ${name} ${version} ${statusText}`);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Print section header
|
|
52
|
-
*/
|
|
53
|
-
function printSection(title: string): void {
|
|
54
|
-
console.log();
|
|
55
|
-
console.log(chalk.bold(title + ':'));
|
|
56
|
-
console.log('━'.repeat(70));
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Run audit in table format
|
|
61
|
-
*/
|
|
62
|
-
async function runAuditTable(): Promise<void> {
|
|
63
|
-
console.log();
|
|
64
|
-
console.log(chalk.cyan.bold(' JetStart Installation Audit'));
|
|
65
|
-
console.log();
|
|
66
|
-
|
|
67
|
-
const allTools: ToolInfo[] = [];
|
|
68
|
-
|
|
69
|
-
// Development Tools
|
|
70
|
-
printSection('Development Tools');
|
|
71
|
-
|
|
72
|
-
const node = await detectNode();
|
|
73
|
-
printToolStatus(node);
|
|
74
|
-
allTools.push(node);
|
|
75
|
-
|
|
76
|
-
const npm = await detectNpm();
|
|
77
|
-
printToolStatus(npm);
|
|
78
|
-
allTools.push(npm);
|
|
79
|
-
|
|
80
|
-
const java = await detectJava();
|
|
81
|
-
printToolStatus(java);
|
|
82
|
-
allTools.push(java);
|
|
83
|
-
|
|
84
|
-
const gradle = await detectGradle();
|
|
85
|
-
printToolStatus(gradle);
|
|
86
|
-
allTools.push(gradle);
|
|
87
|
-
|
|
88
|
-
// Android SDK
|
|
89
|
-
printSection('Android SDK');
|
|
90
|
-
|
|
91
|
-
const sdk = await detectAndroidSDK();
|
|
92
|
-
printToolStatus(sdk);
|
|
93
|
-
allTools.push(sdk);
|
|
94
|
-
|
|
95
|
-
const cmdlineTools = await detectAndroidCmdlineTools();
|
|
96
|
-
printToolStatus(cmdlineTools);
|
|
97
|
-
allTools.push(cmdlineTools);
|
|
98
|
-
|
|
99
|
-
const buildTools = await detectAndroidBuildTools();
|
|
100
|
-
printToolStatus(buildTools);
|
|
101
|
-
allTools.push(buildTools);
|
|
102
|
-
|
|
103
|
-
const platformTools = await detectAndroidPlatformTools();
|
|
104
|
-
printToolStatus(platformTools);
|
|
105
|
-
allTools.push(platformTools);
|
|
106
|
-
|
|
107
|
-
const emulator = await detectAndroidEmulator();
|
|
108
|
-
printToolStatus(emulator);
|
|
109
|
-
allTools.push(emulator);
|
|
110
|
-
|
|
111
|
-
// Android Platforms
|
|
112
|
-
printSection('Android Platforms');
|
|
113
|
-
|
|
114
|
-
const api34 = await detectAndroidPlatform(34);
|
|
115
|
-
printToolStatus({ ...api34, name: 'API 34 (Target)' });
|
|
116
|
-
allTools.push(api34);
|
|
117
|
-
|
|
118
|
-
const api24 = await detectAndroidPlatform(24);
|
|
119
|
-
printToolStatus({ ...api24, name: 'API 24 (Minimum)' });
|
|
120
|
-
allTools.push(api24);
|
|
121
|
-
|
|
122
|
-
// Environment Variables
|
|
123
|
-
printSection('Environment Variables');
|
|
124
|
-
|
|
125
|
-
const javaHome = await checkJavaHome();
|
|
126
|
-
printToolStatus(javaHome);
|
|
127
|
-
allTools.push(javaHome);
|
|
128
|
-
|
|
129
|
-
const androidHome = await checkAndroidHome();
|
|
130
|
-
printToolStatus(androidHome);
|
|
131
|
-
allTools.push(androidHome);
|
|
132
|
-
|
|
133
|
-
// Summary
|
|
134
|
-
const summary = {
|
|
135
|
-
ok: allTools.filter((t) => t.status === 'ok').length,
|
|
136
|
-
warning: allTools.filter((t) => t.status === 'warning').length,
|
|
137
|
-
error: allTools.filter((t) => t.status === 'error').length,
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
printSection('Summary');
|
|
141
|
-
console.log(` ${chalk.green('✓')} ${summary.ok} components OK`);
|
|
142
|
-
if (summary.warning > 0) {
|
|
143
|
-
console.log(` ${chalk.yellow('⚠')} ${summary.warning} warning${summary.warning > 1 ? 's' : ''}`);
|
|
144
|
-
}
|
|
145
|
-
if (summary.error > 0) {
|
|
146
|
-
console.log(` ${chalk.red('✗')} ${summary.error} error${summary.error > 1 ? 's' : ''}`);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// Recommendations
|
|
150
|
-
if (summary.error > 0) {
|
|
151
|
-
console.log();
|
|
152
|
-
warning('Recommendation:');
|
|
153
|
-
console.log(' Run "jetstart create <project-name> --full-install" to install missing dependencies');
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
console.log();
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Run audit in JSON format
|
|
161
|
-
*/
|
|
162
|
-
async function runAuditJSON(): Promise<void> {
|
|
163
|
-
const tools = {
|
|
164
|
-
node: await detectNode(),
|
|
165
|
-
npm: await detectNpm(),
|
|
166
|
-
java: await detectJava(),
|
|
167
|
-
gradle: await detectGradle(),
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
const androidComponents = {
|
|
171
|
-
sdk: await detectAndroidSDK(),
|
|
172
|
-
cmdlineTools: await detectAndroidCmdlineTools(),
|
|
173
|
-
buildTools: await detectAndroidBuildTools(),
|
|
174
|
-
platformTools: await detectAndroidPlatformTools(),
|
|
175
|
-
emulator: await detectAndroidEmulator(),
|
|
176
|
-
platforms: {
|
|
177
|
-
api34: await detectAndroidPlatform(34),
|
|
178
|
-
api24: await detectAndroidPlatform(24),
|
|
179
|
-
},
|
|
180
|
-
};
|
|
181
|
-
|
|
182
|
-
const environment = {
|
|
183
|
-
javaHome: await checkJavaHome(),
|
|
184
|
-
androidHome: await checkAndroidHome(),
|
|
185
|
-
};
|
|
186
|
-
|
|
187
|
-
const allTools = [
|
|
188
|
-
...Object.values(tools),
|
|
189
|
-
...Object.values(androidComponents).filter((v) => typeof v === 'object' && 'status' in v),
|
|
190
|
-
androidComponents.platforms.api34,
|
|
191
|
-
androidComponents.platforms.api24,
|
|
192
|
-
...Object.values(environment),
|
|
193
|
-
] as ToolInfo[];
|
|
194
|
-
|
|
195
|
-
const summary = {
|
|
196
|
-
ok: allTools.filter((t) => t.status === 'ok').length,
|
|
197
|
-
warning: allTools.filter((t) => t.status === 'warning').length,
|
|
198
|
-
error: allTools.filter((t) => t.status === 'error').length,
|
|
199
|
-
};
|
|
200
|
-
|
|
201
|
-
const result = {
|
|
202
|
-
timestamp: new Date().toISOString(),
|
|
203
|
-
platform: process.platform,
|
|
204
|
-
tools,
|
|
205
|
-
androidComponents,
|
|
206
|
-
environment,
|
|
207
|
-
summary,
|
|
208
|
-
};
|
|
209
|
-
|
|
210
|
-
console.log(JSON.stringify(result, null, 2));
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Install audit command handler
|
|
215
|
-
*/
|
|
216
|
-
export async function installAuditCommand(options: AuditOptions): Promise<void> {
|
|
217
|
-
try {
|
|
218
|
-
if (options.json) {
|
|
219
|
-
await runAuditJSON();
|
|
220
|
-
} else {
|
|
221
|
-
await runAuditTable();
|
|
222
|
-
}
|
|
223
|
-
} catch (err: any) {
|
|
224
|
-
console.error(chalk.red(`\nAudit failed: ${err.message}`));
|
|
225
|
-
process.exit(1);
|
|
226
|
-
}
|
|
227
|
-
}
|
package/src/commands/logs.ts
DELETED
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Logs Command
|
|
3
|
-
* Streams application logs
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import chalk from 'chalk';
|
|
7
|
-
import WebSocket from 'ws';
|
|
8
|
-
import { log, error, info } from '../utils/logger';
|
|
9
|
-
import { LogLevel, LogSource, LogEntry, DEFAULT_LOGS_PORT } from '@jetstart/shared';
|
|
10
|
-
|
|
11
|
-
interface LogsOptions {
|
|
12
|
-
follow?: boolean;
|
|
13
|
-
level?: string;
|
|
14
|
-
source?: string;
|
|
15
|
-
lines?: string;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export async function logsCommand(options: LogsOptions) {
|
|
19
|
-
try {
|
|
20
|
-
// const follow = options.follow !== false;
|
|
21
|
-
const maxLines = parseInt(options.lines || '100');
|
|
22
|
-
|
|
23
|
-
log('Connecting to JetStart logs service...');
|
|
24
|
-
console.log();
|
|
25
|
-
|
|
26
|
-
// Connect to logs service via WebSocket
|
|
27
|
-
const ws = new WebSocket(`ws://localhost:${DEFAULT_LOGS_PORT}`);
|
|
28
|
-
|
|
29
|
-
ws.on('open', () => {
|
|
30
|
-
info('Connected to logs service');
|
|
31
|
-
console.log();
|
|
32
|
-
|
|
33
|
-
// Send filter options
|
|
34
|
-
ws.send(JSON.stringify({
|
|
35
|
-
type: 'subscribe',
|
|
36
|
-
filter: {
|
|
37
|
-
levels: options.level ? [options.level] : undefined,
|
|
38
|
-
sources: options.source ? [options.source] : undefined,
|
|
39
|
-
},
|
|
40
|
-
maxLines,
|
|
41
|
-
}));
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
ws.on('message', (data: string) => {
|
|
45
|
-
try {
|
|
46
|
-
const logEntry: LogEntry = JSON.parse(data);
|
|
47
|
-
formatLogEntry(logEntry);
|
|
48
|
-
} catch (err) {
|
|
49
|
-
console.log(data);
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
ws.on('error', (err) => {
|
|
54
|
-
error(`WebSocket error: ${err.message}`);
|
|
55
|
-
process.exit(1);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
ws.on('close', () => {
|
|
59
|
-
console.log();
|
|
60
|
-
info('Disconnected from logs service');
|
|
61
|
-
process.exit(0);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
// Handle Ctrl+C
|
|
65
|
-
process.on('SIGINT', () => {
|
|
66
|
-
console.log();
|
|
67
|
-
log('Closing connection...');
|
|
68
|
-
ws.close();
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
} catch (err: any) {
|
|
72
|
-
error(`Failed to connect to logs: ${err.message}`);
|
|
73
|
-
process.exit(1);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
function formatLogEntry(entry: LogEntry) {
|
|
78
|
-
const timestamp = new Date(entry.timestamp).toLocaleTimeString();
|
|
79
|
-
const level = formatLogLevel(entry.level);
|
|
80
|
-
const source = formatLogSource(entry.source);
|
|
81
|
-
const tag = chalk.gray(`[${entry.tag}]`);
|
|
82
|
-
|
|
83
|
-
console.log(`${chalk.gray(timestamp)} ${level} ${source} ${tag} ${entry.message}`);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
function formatLogLevel(level: LogLevel): string {
|
|
87
|
-
switch (level) {
|
|
88
|
-
case LogLevel.VERBOSE:
|
|
89
|
-
return chalk.gray('VERBOSE');
|
|
90
|
-
case LogLevel.DEBUG:
|
|
91
|
-
return chalk.blue('DEBUG');
|
|
92
|
-
case LogLevel.INFO:
|
|
93
|
-
return chalk.green('INFO');
|
|
94
|
-
case LogLevel.WARN:
|
|
95
|
-
return chalk.yellow('WARN');
|
|
96
|
-
case LogLevel.ERROR:
|
|
97
|
-
return chalk.red('ERROR');
|
|
98
|
-
case LogLevel.FATAL:
|
|
99
|
-
return chalk.bgRed.white('FATAL');
|
|
100
|
-
default:
|
|
101
|
-
return level;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
function formatLogSource(source: LogSource): string {
|
|
106
|
-
const sourceColors: Record<LogSource, (text: string) => string> = {
|
|
107
|
-
[LogSource.CLI]: chalk.cyan,
|
|
108
|
-
[LogSource.CORE]: chalk.magenta,
|
|
109
|
-
[LogSource.CLIENT]: chalk.green,
|
|
110
|
-
[LogSource.BUILD]: chalk.yellow,
|
|
111
|
-
[LogSource.NETWORK]: chalk.blue,
|
|
112
|
-
[LogSource.SYSTEM]: chalk.gray,
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
const colorFn = sourceColors[source] || chalk.white;
|
|
116
|
-
return colorFn(`[${source}]`);
|
|
117
|
-
}
|
package/src/index.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Main entry point for programmatic API
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export * from './commands';
|
|
6
|
-
export * from './types';
|
|
7
|
-
export * from './utils';
|
|
8
|
-
|
|
9
|
-
// Re-export shared types that CLI users might need
|
|
10
|
-
export type {
|
|
11
|
-
Session,
|
|
12
|
-
SessionStatus,
|
|
13
|
-
BuildConfig,
|
|
14
|
-
BuildResult,
|
|
15
|
-
DeviceInfo,
|
|
16
|
-
LogLevel,
|
|
17
|
-
} from '@jetstart/shared';
|
package/src/types/index.ts
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLI-specific types
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export interface ProjectConfig {
|
|
6
|
-
projectName: string;
|
|
7
|
-
packageName: string;
|
|
8
|
-
template: string;
|
|
9
|
-
minSdkVersion?: number;
|
|
10
|
-
targetSdkVersion?: number;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export interface TemplateOptions {
|
|
14
|
-
projectName: string;
|
|
15
|
-
packageName: string;
|
|
16
|
-
template: string;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface CommandContext {
|
|
20
|
-
cwd: string;
|
|
21
|
-
config?: ProjectConfig;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// Create command options
|
|
25
|
-
export interface CreateOptions {
|
|
26
|
-
package?: string;
|
|
27
|
-
template?: string;
|
|
28
|
-
skipInstall?: boolean;
|
|
29
|
-
fullInstall?: boolean;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// Install audit command options
|
|
33
|
-
export interface AuditOptions {
|
|
34
|
-
json?: boolean;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// Dev command options
|
|
38
|
-
export interface DevOptions {
|
|
39
|
-
port?: string;
|
|
40
|
-
host?: string;
|
|
41
|
-
qr?: boolean;
|
|
42
|
-
open?: boolean;
|
|
43
|
-
web?: boolean;
|
|
44
|
-
emulator?: boolean;
|
|
45
|
-
avd?: string;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// Install action enum
|
|
49
|
-
export enum InstallAction {
|
|
50
|
-
SKIP = 'skip',
|
|
51
|
-
UPDATE = 'update',
|
|
52
|
-
REPLACE = 'replace',
|
|
53
|
-
}
|