@acip/cli 1.5.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 +368 -0
- package/bin/acip.js +3 -0
- package/dist/commands/call.d.ts +3 -0
- package/dist/commands/call.d.ts.map +1 -0
- package/dist/commands/call.js +65 -0
- package/dist/commands/call.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +144 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/deploy.d.ts +3 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +280 -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 +218 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +289 -0
- package/dist/commands/doctor.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 +80 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/inspect.d.ts +3 -0
- package/dist/commands/inspect.d.ts.map +1 -0
- package/dist/commands/inspect.js +69 -0
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +118 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/monitor.d.ts +3 -0
- package/dist/commands/monitor.d.ts.map +1 -0
- package/dist/commands/monitor.js +51 -0
- package/dist/commands/monitor.js.map +1 -0
- package/dist/commands/new.d.ts +3 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +252 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/project.d.ts +13 -0
- package/dist/utils/project.d.ts.map +1 -0
- package/dist/utils/project.js +149 -0
- package/dist/utils/project.js.map +1 -0
- package/package.json +87 -0
- package/templates/.env.example.template +9 -0
- package/templates/.gitignore.template +31 -0
- package/templates/README.md.template +33 -0
- package/templates/advanced/src/components/assistant.js.template +66 -0
- package/templates/advanced/src/components/assistant.ts.template +71 -0
- package/templates/advanced/src/index.js.template +45 -0
- package/templates/advanced/src/index.ts.template +45 -0
- package/templates/basic/src/config/index.js.template +28 -0
- package/templates/basic/src/config/index.ts.template +28 -0
- package/templates/basic/src/index.js.template +29 -0
- package/templates/basic/src/index.ts.template +29 -0
- package/templates/package.json.template +21 -0
- package/templates/tsconfig.json.template +17 -0
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
import { execSync } from 'child_process';
|
|
6
|
+
// 支持的环境类型
|
|
7
|
+
const ENVIRONMENTS = ['production', 'staging', 'development'];
|
|
8
|
+
export default function deployCommand(program) {
|
|
9
|
+
program
|
|
10
|
+
.command('deploy [environment]')
|
|
11
|
+
.description('Deploy ACIP application')
|
|
12
|
+
.option('--dry-run', 'Simulate deployment without making changes')
|
|
13
|
+
.option('--verbose', 'Show detailed output')
|
|
14
|
+
.option('--config <path>', 'Path to deployment config file')
|
|
15
|
+
.option('--force', 'Force deployment and ignore warnings')
|
|
16
|
+
.option('--no-build', 'Skip the build step')
|
|
17
|
+
.action(async (environment = 'production', options) => {
|
|
18
|
+
// 验证环境类型
|
|
19
|
+
if (!ENVIRONMENTS.includes(environment)) {
|
|
20
|
+
console.error(chalk.red(`Error: Invalid environment '${environment}'`));
|
|
21
|
+
console.log(`Available environments: ${ENVIRONMENTS.join(', ')}`);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
// 检查当前目录是否是ACIP项目
|
|
25
|
+
const projectRoot = process.cwd();
|
|
26
|
+
const packageJsonPath = path.join(projectRoot, 'package.json');
|
|
27
|
+
if (!await fs.pathExists(packageJsonPath)) {
|
|
28
|
+
console.error(chalk.red('Error: Not an ACIP project directory.'));
|
|
29
|
+
console.log(chalk.yellow('Run this command from the root of an ACIP project.'));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
console.log('');
|
|
33
|
+
console.log(chalk.blue.bold(`🚀 Deploying to ${chalk.bold(environment)} environment...\n`));
|
|
34
|
+
if (options.dryRun) {
|
|
35
|
+
console.log(chalk.yellow('📋 DRY RUN: No changes will be made.\n'));
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
// 加载部署配置
|
|
39
|
+
const config = await loadDeploymentConfig(projectRoot, environment, options);
|
|
40
|
+
// 执行部署前检查
|
|
41
|
+
await runPreDeployChecks(projectRoot, options);
|
|
42
|
+
// 执行pre-deploy钩子
|
|
43
|
+
await runHooks(config.preDeployHooks || [], 'Pre-deploy', options);
|
|
44
|
+
// 构建应用
|
|
45
|
+
if (options.build !== false) {
|
|
46
|
+
await buildApplication(config, options);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
console.log(chalk.yellow('⏭️ Skipping build step.\n'));
|
|
50
|
+
}
|
|
51
|
+
// 执行部署
|
|
52
|
+
await performDeployment(environment, config, options);
|
|
53
|
+
// 执行post-deploy钩子
|
|
54
|
+
await runHooks(config.postDeployHooks || [], 'Post-deploy', options);
|
|
55
|
+
// 部署完成
|
|
56
|
+
displayDeploymentSummary(environment, options);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
console.error(chalk.red('\n❌ Deployment failed:'), error.message);
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
async function loadDeploymentConfig(projectRoot, environment, options) {
|
|
65
|
+
let config = { environment };
|
|
66
|
+
// 尝试加载配置文件
|
|
67
|
+
const configPath = options.config || path.join(projectRoot, `.acip/deploy.${environment}.json`);
|
|
68
|
+
if (await fs.pathExists(configPath)) {
|
|
69
|
+
const spinner = ora('Loading deployment configuration...').start();
|
|
70
|
+
try {
|
|
71
|
+
config = await fs.readJson(configPath);
|
|
72
|
+
config.environment = environment;
|
|
73
|
+
spinner.succeed('Configuration loaded successfully.');
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
spinner.fail('Failed to load configuration file.');
|
|
77
|
+
throw new Error(`Invalid configuration file: ${error.message}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
console.log(chalk.yellow('⚠️ No deployment configuration found, using defaults.\n'));
|
|
82
|
+
}
|
|
83
|
+
return config;
|
|
84
|
+
}
|
|
85
|
+
async function runPreDeployChecks(projectRoot, options) {
|
|
86
|
+
console.log(chalk.cyan.bold('🔍 Running pre-deployment checks...\n'));
|
|
87
|
+
const checks = [
|
|
88
|
+
checkGitStatus,
|
|
89
|
+
checkPackageJson,
|
|
90
|
+
checkEnvironmentVariables,
|
|
91
|
+
checkDependencies
|
|
92
|
+
];
|
|
93
|
+
for (const check of checks) {
|
|
94
|
+
await check(projectRoot, options);
|
|
95
|
+
}
|
|
96
|
+
console.log();
|
|
97
|
+
}
|
|
98
|
+
async function checkGitStatus(projectRoot, options) {
|
|
99
|
+
const spinner = ora('Checking git status...').start();
|
|
100
|
+
try {
|
|
101
|
+
const gitDir = path.join(projectRoot, '.git');
|
|
102
|
+
if (!await fs.pathExists(gitDir)) {
|
|
103
|
+
spinner.warn('Not a git repository (skipping git checks).');
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const status = execSync('git status --porcelain', { cwd: projectRoot, encoding: 'utf-8' });
|
|
107
|
+
if (status.trim() && !options.force) {
|
|
108
|
+
spinner.fail('Uncommitted changes detected.');
|
|
109
|
+
console.log(chalk.yellow('\nYou have uncommitted changes. Please commit or stash them first.'));
|
|
110
|
+
console.log(chalk.gray('Or use --force to deploy anyway.\n'));
|
|
111
|
+
throw new Error('Uncommitted changes detected');
|
|
112
|
+
}
|
|
113
|
+
spinner.succeed('Git status clean.');
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
if (error.message === 'Uncommitted changes detected') {
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
spinner.warn('Git check failed (continuing).');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async function checkPackageJson(projectRoot, options) {
|
|
123
|
+
const spinner = ora('Validating package.json...').start();
|
|
124
|
+
try {
|
|
125
|
+
const packageJson = await fs.readJson(path.join(projectRoot, 'package.json'));
|
|
126
|
+
if (!packageJson.name || !packageJson.version) {
|
|
127
|
+
spinner.fail('Invalid package.json: missing name or version.');
|
|
128
|
+
throw new Error('Invalid package.json');
|
|
129
|
+
}
|
|
130
|
+
if (options.verbose) {
|
|
131
|
+
console.log(chalk.dim(` Found: ${packageJson.name}@${packageJson.version}`));
|
|
132
|
+
}
|
|
133
|
+
spinner.succeed('package.json is valid.');
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
spinner.fail('package.json validation failed.');
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
async function checkEnvironmentVariables(projectRoot, options) {
|
|
141
|
+
const spinner = ora('Checking environment variables...').start();
|
|
142
|
+
const envExamplePath = path.join(projectRoot, '.env.example');
|
|
143
|
+
if (await fs.pathExists(envExamplePath)) {
|
|
144
|
+
spinner.succeed('Environment template found.');
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
spinner.warn('No .env.example file found.');
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async function checkDependencies(projectRoot, options) {
|
|
151
|
+
const spinner = ora('Checking dependencies...').start();
|
|
152
|
+
try {
|
|
153
|
+
const nodeModulesPath = path.join(projectRoot, 'node_modules');
|
|
154
|
+
if (!await fs.pathExists(nodeModulesPath)) {
|
|
155
|
+
spinner.fail('Dependencies not installed.');
|
|
156
|
+
throw new Error('Please run npm install first');
|
|
157
|
+
}
|
|
158
|
+
spinner.succeed('Dependencies installed.');
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
spinner.fail('Dependency check failed.');
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
async function runHooks(hooks, stage, options) {
|
|
166
|
+
if (hooks.length === 0)
|
|
167
|
+
return;
|
|
168
|
+
console.log(chalk.cyan.bold(`🔗 Running ${stage} hooks...\n`));
|
|
169
|
+
for (const hook of hooks) {
|
|
170
|
+
const spinner = ora(`Executing: ${hook}`).start();
|
|
171
|
+
if (options.dryRun) {
|
|
172
|
+
spinner.info(`Would execute: ${hook}`);
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
execSync(hook, { stdio: options.verbose ? 'inherit' : 'pipe' });
|
|
177
|
+
spinner.succeed();
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
spinner.fail();
|
|
181
|
+
throw new Error(`Hook failed: ${hook}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
console.log();
|
|
185
|
+
}
|
|
186
|
+
async function buildApplication(config, options) {
|
|
187
|
+
console.log(chalk.cyan.bold('🔨 Building application...\n'));
|
|
188
|
+
const buildCommand = config.buildCommand || 'npm run build';
|
|
189
|
+
const spinner = ora(`Running: ${buildCommand}`).start();
|
|
190
|
+
if (options.dryRun) {
|
|
191
|
+
spinner.info(`Would run: ${buildCommand}`);
|
|
192
|
+
console.log();
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
try {
|
|
196
|
+
execSync(buildCommand, { stdio: options.verbose ? 'inherit' : 'pipe' });
|
|
197
|
+
spinner.succeed('Build completed successfully.');
|
|
198
|
+
console.log();
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
spinner.fail('Build failed.');
|
|
202
|
+
throw new Error(`Build command failed: ${buildCommand}`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
async function performDeployment(environment, config, options) {
|
|
206
|
+
console.log(chalk.cyan.bold('📦 Deploying application...\n'));
|
|
207
|
+
if (config.deployCommand) {
|
|
208
|
+
// 使用自定义部署命令
|
|
209
|
+
const spinner = ora(`Running: ${config.deployCommand}`).start();
|
|
210
|
+
if (options.dryRun) {
|
|
211
|
+
spinner.info(`Would run: ${config.deployCommand}`);
|
|
212
|
+
console.log();
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
try {
|
|
216
|
+
execSync(config.deployCommand, { stdio: options.verbose ? 'inherit' : 'pipe' });
|
|
217
|
+
spinner.succeed('Deployment command executed successfully.');
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
spinner.fail('Deployment command failed.');
|
|
221
|
+
throw error;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
// 模拟部署流程
|
|
226
|
+
const steps = [
|
|
227
|
+
{ name: 'Validating configuration', time: 800 },
|
|
228
|
+
{ name: 'Preparing assets', time: 1200 },
|
|
229
|
+
{ name: 'Uploading files', time: 2500 },
|
|
230
|
+
{ name: 'Updating services', time: 1000 },
|
|
231
|
+
{ name: 'Running health checks', time: 1500 },
|
|
232
|
+
];
|
|
233
|
+
for (const step of steps) {
|
|
234
|
+
const spinner = ora(step.name).start();
|
|
235
|
+
if (options.dryRun) {
|
|
236
|
+
spinner.info(step.name);
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
await new Promise(resolve => setTimeout(resolve, step.time));
|
|
240
|
+
spinner.succeed();
|
|
241
|
+
if (options.verbose) {
|
|
242
|
+
console.log(chalk.dim(` ✓ ${getRandomLogMessage()}`));
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
console.log();
|
|
247
|
+
}
|
|
248
|
+
function displayDeploymentSummary(environment, options) {
|
|
249
|
+
console.log(chalk.green.bold('✅ Deployment completed successfully!\n'));
|
|
250
|
+
const deploymentUrl = `https://${environment === 'production' ? 'app' : environment}.acip-example.com`;
|
|
251
|
+
console.log(chalk.bold('📋 Deployment Information:\n'));
|
|
252
|
+
console.log(` ${chalk.grey('Environment:')} ${chalk.cyan(environment)}`);
|
|
253
|
+
console.log(` ${chalk.grey('URL:')} ${chalk.cyan(deploymentUrl)}`);
|
|
254
|
+
console.log(` ${chalk.grey('Deploy ID:')} ${chalk.cyan(generateDeploymentId())}`);
|
|
255
|
+
console.log(` ${chalk.grey('Timestamp:')} ${chalk.cyan(new Date().toISOString())}`);
|
|
256
|
+
if (options.dryRun) {
|
|
257
|
+
console.log();
|
|
258
|
+
console.log(chalk.yellow('ℹ️ This was a dry run. No actual deployment was performed.'));
|
|
259
|
+
}
|
|
260
|
+
console.log();
|
|
261
|
+
}
|
|
262
|
+
function generateDeploymentId() {
|
|
263
|
+
return 'dpl_' + Math.random().toString(36).substring(2, 15);
|
|
264
|
+
}
|
|
265
|
+
function getRandomLogMessage() {
|
|
266
|
+
const messages = [
|
|
267
|
+
'Optimizing asset compression',
|
|
268
|
+
'Configuring CDN cache rules',
|
|
269
|
+
'Setting up environment variables',
|
|
270
|
+
'Updating service workers',
|
|
271
|
+
'Running database migrations',
|
|
272
|
+
'Configuring auto-scaling rules',
|
|
273
|
+
'Setting up monitoring alerts',
|
|
274
|
+
'Updating API gateway routes',
|
|
275
|
+
'Configuring security policies',
|
|
276
|
+
'Setting up CORS rules'
|
|
277
|
+
];
|
|
278
|
+
return messages[Math.floor(Math.random() * messages.length)];
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+BzD"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import fs from 'fs-extra';
|
|
5
|
+
import chokidar from 'chokidar';
|
|
6
|
+
import open from 'open';
|
|
7
|
+
import swaggerJsdoc from 'swagger-jsdoc';
|
|
8
|
+
import swaggerUi from 'swagger-ui-express';
|
|
9
|
+
let restartPending = false;
|
|
10
|
+
let serverInstance = null;
|
|
11
|
+
export default function devCommand(program) {
|
|
12
|
+
program
|
|
13
|
+
.command('dev')
|
|
14
|
+
.description('Start a development server with hot reload')
|
|
15
|
+
.option('-p, --port <port>', 'Port to run the server on', (value) => parseInt(value, 10), 3000)
|
|
16
|
+
.option('-h, --host <host>', 'Host to run the server on', 'localhost')
|
|
17
|
+
.option('--https', 'Use HTTPS', false)
|
|
18
|
+
.option('-o, --open', 'Open in browser', false)
|
|
19
|
+
.option('--no-watch', 'Disable file watching')
|
|
20
|
+
.action(async (options) => {
|
|
21
|
+
console.log(chalk.blue.bold('\n🚀 Starting ACIP Development Server...\n'));
|
|
22
|
+
// Start the server
|
|
23
|
+
await startServer(options);
|
|
24
|
+
// Setup file watching if enabled
|
|
25
|
+
if (options.watch) {
|
|
26
|
+
setupFileWatcher(options);
|
|
27
|
+
}
|
|
28
|
+
// Open in browser if requested
|
|
29
|
+
if (options.open) {
|
|
30
|
+
const serverUrl = `${options.https ? 'https' : 'http'}://${options.host}:${options.port}`;
|
|
31
|
+
try {
|
|
32
|
+
await open(serverUrl);
|
|
33
|
+
console.log(chalk.green(`\n✓ Opened ${serverUrl} in browser\n`));
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
console.log(chalk.yellow(`\n⚠ Could not open browser automatically\n`));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
async function startServer(options) {
|
|
42
|
+
const app = express();
|
|
43
|
+
// Middleware
|
|
44
|
+
app.use(express.json());
|
|
45
|
+
app.use(express.urlencoded({ extended: true }));
|
|
46
|
+
// CORS for development
|
|
47
|
+
app.use((req, res, next) => {
|
|
48
|
+
res.header('Access-Control-Allow-Origin', '*');
|
|
49
|
+
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
|
|
50
|
+
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
|
|
51
|
+
next();
|
|
52
|
+
});
|
|
53
|
+
// Health check endpoint
|
|
54
|
+
app.get('/health', (req, res) => {
|
|
55
|
+
res.json({
|
|
56
|
+
status: 'healthy',
|
|
57
|
+
timestamp: new Date().toISOString(),
|
|
58
|
+
uptime: process.uptime()
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
// Main API endpoint
|
|
62
|
+
app.get('/api', (req, res) => {
|
|
63
|
+
res.json({
|
|
64
|
+
message: 'ACIP Development Server is running!',
|
|
65
|
+
version: '1.0.0',
|
|
66
|
+
status: 'ready',
|
|
67
|
+
endpoints: {
|
|
68
|
+
health: '/health',
|
|
69
|
+
api: '/api',
|
|
70
|
+
test: '/api/test',
|
|
71
|
+
docs: '/api-docs'
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
// Test endpoint
|
|
76
|
+
app.post('/api/test', (req, res) => {
|
|
77
|
+
const { message } = req.body;
|
|
78
|
+
try {
|
|
79
|
+
res.json({
|
|
80
|
+
success: true,
|
|
81
|
+
echo: message || 'Hello from ACIP!',
|
|
82
|
+
timestamp: new Date().toISOString(),
|
|
83
|
+
received: req.body
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
res.status(400).json({
|
|
88
|
+
success: false,
|
|
89
|
+
message: error.message
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
// Swagger documentation setup
|
|
94
|
+
const swaggerSpec = swaggerJsdoc({
|
|
95
|
+
definition: {
|
|
96
|
+
openapi: '3.0.0',
|
|
97
|
+
info: {
|
|
98
|
+
title: 'ACIP Development Server API',
|
|
99
|
+
version: '1.0.0',
|
|
100
|
+
description: 'Development API for ACIP projects'
|
|
101
|
+
},
|
|
102
|
+
servers: [
|
|
103
|
+
{
|
|
104
|
+
url: `http://${options.host}:${options.port}`,
|
|
105
|
+
description: 'Development server'
|
|
106
|
+
}
|
|
107
|
+
]
|
|
108
|
+
},
|
|
109
|
+
apis: [] // Path to API docs (can be extended)
|
|
110
|
+
});
|
|
111
|
+
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));
|
|
112
|
+
// Serve static files from current directory
|
|
113
|
+
const projectRoot = process.cwd();
|
|
114
|
+
const publicDir = path.join(projectRoot, 'public');
|
|
115
|
+
if (await fs.pathExists(publicDir)) {
|
|
116
|
+
app.use(express.static(publicDir));
|
|
117
|
+
console.log(chalk.gray(` 📁 Serving static files from ${publicDir}`));
|
|
118
|
+
}
|
|
119
|
+
// 404 handler
|
|
120
|
+
app.use((req, res) => {
|
|
121
|
+
res.status(404).json({
|
|
122
|
+
error: 'Not Found',
|
|
123
|
+
path: req.path,
|
|
124
|
+
message: 'The requested endpoint does not exist'
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
// Error handler
|
|
128
|
+
app.use((err, req, res, next) => {
|
|
129
|
+
console.error(chalk.red('Error:'), err.message);
|
|
130
|
+
res.status(500).json({
|
|
131
|
+
error: 'Internal Server Error',
|
|
132
|
+
message: err.message
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
// Start listening
|
|
136
|
+
return new Promise((resolve) => {
|
|
137
|
+
serverInstance = app.listen(options.port, options.host, () => {
|
|
138
|
+
const serverUrl = `${options.https ? 'https' : 'http'}://${options.host}:${options.port}`;
|
|
139
|
+
console.log(chalk.green.bold('✓ Server started successfully!\n'));
|
|
140
|
+
console.log(chalk.cyan(' Local: ') + chalk.white(serverUrl));
|
|
141
|
+
console.log(chalk.cyan(' Network: ') + chalk.white(`http://localhost:${options.port}`));
|
|
142
|
+
console.log(chalk.cyan(' API Docs:') + chalk.white(`${serverUrl}/api-docs`));
|
|
143
|
+
console.log();
|
|
144
|
+
console.log(chalk.gray(' Press Ctrl+C to stop'));
|
|
145
|
+
if (options.watch) {
|
|
146
|
+
console.log(chalk.gray(' File watching enabled - server will reload on changes'));
|
|
147
|
+
}
|
|
148
|
+
console.log();
|
|
149
|
+
resolve();
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
function setupFileWatcher(options) {
|
|
154
|
+
const projectRoot = process.cwd();
|
|
155
|
+
const watchPaths = [
|
|
156
|
+
path.join(projectRoot, 'src/**/*.{ts,js,json}'),
|
|
157
|
+
path.join(projectRoot, 'public/**/*'),
|
|
158
|
+
path.join(projectRoot, 'package.json')
|
|
159
|
+
];
|
|
160
|
+
console.log(chalk.blue('👀 Watching for file changes...\n'));
|
|
161
|
+
const watcher = chokidar.watch(watchPaths, {
|
|
162
|
+
ignored: [
|
|
163
|
+
'**/node_modules/**',
|
|
164
|
+
'**/dist/**',
|
|
165
|
+
'**/.git/**',
|
|
166
|
+
'**/coverage/**',
|
|
167
|
+
'**/*.test.{ts,js}'
|
|
168
|
+
],
|
|
169
|
+
persistent: true,
|
|
170
|
+
ignoreInitial: true,
|
|
171
|
+
awaitWriteFinish: {
|
|
172
|
+
stabilityThreshold: 100,
|
|
173
|
+
pollInterval: 100
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
watcher.on('change', (filePath) => {
|
|
177
|
+
const relativePath = path.relative(projectRoot, filePath);
|
|
178
|
+
console.log(chalk.yellow(`\n📝 File changed: ${relativePath}`));
|
|
179
|
+
if (!restartPending) {
|
|
180
|
+
restartPending = true;
|
|
181
|
+
console.log(chalk.blue('⟳ Restarting server...\n'));
|
|
182
|
+
// Close existing server
|
|
183
|
+
if (serverInstance) {
|
|
184
|
+
serverInstance.close(async () => {
|
|
185
|
+
// Restart server
|
|
186
|
+
await startServer(options);
|
|
187
|
+
restartPending = false;
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
watcher.on('add', (filePath) => {
|
|
193
|
+
const relativePath = path.relative(projectRoot, filePath);
|
|
194
|
+
console.log(chalk.green(`\n➕ File added: ${relativePath}`));
|
|
195
|
+
});
|
|
196
|
+
watcher.on('unlink', (filePath) => {
|
|
197
|
+
const relativePath = path.relative(projectRoot, filePath);
|
|
198
|
+
console.log(chalk.red(`\n➖ File removed: ${relativePath}`));
|
|
199
|
+
});
|
|
200
|
+
watcher.on('error', (error) => {
|
|
201
|
+
console.error(chalk.red('\n❌ Watcher error:'), error.message);
|
|
202
|
+
});
|
|
203
|
+
// Graceful shutdown
|
|
204
|
+
process.on('SIGINT', () => {
|
|
205
|
+
console.log(chalk.yellow('\n\n⏹ Shutting down server...'));
|
|
206
|
+
watcher.close();
|
|
207
|
+
if (serverInstance) {
|
|
208
|
+
serverInstance.close(() => {
|
|
209
|
+
console.log(chalk.green('✓ Server stopped\n'));
|
|
210
|
+
process.exit(0);
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
process.exit(0);
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=dev.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyE5D"}
|