gazill 2.1.0 → 2.3.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/dist/commands/autoscale.d.ts +5 -0
- package/dist/commands/autoscale.d.ts.map +1 -0
- package/dist/commands/autoscale.js +140 -0
- package/dist/commands/autoscale.js.map +1 -0
- package/dist/commands/blob.d.ts +19 -0
- package/dist/commands/blob.d.ts.map +1 -0
- package/dist/commands/blob.js +383 -0
- package/dist/commands/blob.js.map +1 -0
- package/dist/commands/cron.d.ts +27 -0
- package/dist/commands/cron.d.ts.map +1 -0
- package/dist/commands/cron.js +333 -0
- package/dist/commands/cron.js.map +1 -0
- package/dist/commands/db.d.ts +21 -0
- package/dist/commands/db.d.ts.map +1 -0
- package/dist/commands/db.js +567 -0
- package/dist/commands/db.js.map +1 -0
- package/dist/commands/domains.d.ts +5 -0
- package/dist/commands/domains.d.ts.map +1 -0
- package/dist/commands/domains.js +239 -0
- package/dist/commands/domains.js.map +1 -0
- package/dist/commands/env.d.ts +4 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +180 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/health.d.ts +7 -0
- package/dist/commands/health.d.ts.map +1 -0
- package/dist/commands/health.js +189 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/limits.d.ts +2 -0
- package/dist/commands/limits.d.ts.map +1 -0
- package/dist/commands/limits.js +186 -0
- package/dist/commands/limits.js.map +1 -0
- package/dist/commands/mysql.d.ts +15 -0
- package/dist/commands/mysql.d.ts.map +1 -0
- package/dist/commands/mysql.js +413 -0
- package/dist/commands/mysql.js.map +1 -0
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +29 -3
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/promote.d.ts.map +1 -1
- package/dist/commands/promote.js +36 -9
- package/dist/commands/promote.js.map +1 -1
- package/dist/commands/redis.d.ts +15 -0
- package/dist/commands/redis.d.ts.map +1 -0
- package/dist/commands/redis.js +402 -0
- package/dist/commands/redis.js.map +1 -0
- package/dist/commands/rollback.d.ts +9 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +154 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +24 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/usage.d.ts.map +1 -1
- package/dist/commands/usage.js +20 -11
- package/dist/commands/usage.js.map +1 -1
- package/dist/commands/worker.d.ts +31 -0
- package/dist/commands/worker.d.ts.map +1 -0
- package/dist/commands/worker.js +380 -0
- package/dist/commands/worker.js.map +1 -0
- package/dist/index.js +362 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +46 -2
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +16 -0
- package/dist/lib/api.js.map +1 -1
- package/dist/shared/constants.d.ts +10 -0
- package/dist/shared/constants.d.ts.map +1 -1
- package/dist/shared/constants.js +11 -0
- package/dist/shared/constants.js.map +1 -1
- package/dist/shared/types.d.ts +40 -1
- package/dist/shared/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import inquirer from 'inquirer';
|
|
4
|
+
import { promises as fs } from 'fs';
|
|
5
|
+
import { getAuth, getApiUrl } from '../lib/config.js';
|
|
6
|
+
import { listProjects } from '../lib/api.js';
|
|
7
|
+
// API helper for domain routes
|
|
8
|
+
async function domainApiRequest(endpoint, options = { method: 'GET' }) {
|
|
9
|
+
const apiUrl = await getApiUrl();
|
|
10
|
+
const auth = await getAuth();
|
|
11
|
+
if (!auth?.token) {
|
|
12
|
+
throw new Error('Not authenticated');
|
|
13
|
+
}
|
|
14
|
+
const response = await fetch(`${apiUrl}${endpoint}`, {
|
|
15
|
+
method: options.method,
|
|
16
|
+
headers: {
|
|
17
|
+
'Content-Type': 'application/json',
|
|
18
|
+
Authorization: `Bearer ${auth.token}`,
|
|
19
|
+
},
|
|
20
|
+
body: options.body ? JSON.stringify(options.body) : undefined,
|
|
21
|
+
});
|
|
22
|
+
const data = await response.json();
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
throw new Error(data.message || 'Request failed');
|
|
25
|
+
}
|
|
26
|
+
return data;
|
|
27
|
+
}
|
|
28
|
+
// Get current project ID from .gazill file
|
|
29
|
+
async function getProjectId() {
|
|
30
|
+
try {
|
|
31
|
+
const content = await fs.readFile('.gazill', 'utf-8');
|
|
32
|
+
const data = JSON.parse(content);
|
|
33
|
+
return data.projectId || null;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Find project by name
|
|
40
|
+
async function findProjectByName(name) {
|
|
41
|
+
const response = await listProjects();
|
|
42
|
+
return response.projects.find((p) => p.name === name) || null;
|
|
43
|
+
}
|
|
44
|
+
// Get status badge color
|
|
45
|
+
function getStatusColor(status) {
|
|
46
|
+
switch (status) {
|
|
47
|
+
case 'active':
|
|
48
|
+
return chalk.green;
|
|
49
|
+
case 'verified':
|
|
50
|
+
return chalk.blue;
|
|
51
|
+
case 'pending':
|
|
52
|
+
return chalk.yellow;
|
|
53
|
+
case 'failed':
|
|
54
|
+
return chalk.red;
|
|
55
|
+
default:
|
|
56
|
+
return chalk.gray;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// List custom domains for a project
|
|
60
|
+
export async function domainsListCommand(projectName) {
|
|
61
|
+
const auth = await getAuth();
|
|
62
|
+
if (!auth?.token) {
|
|
63
|
+
console.log(chalk.red('Not logged in. Run `gazill login` first.'));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const spinner = ora('Fetching domains...').start();
|
|
67
|
+
try {
|
|
68
|
+
// Get project ID
|
|
69
|
+
let projectId = await getProjectId();
|
|
70
|
+
if (!projectId && !projectName) {
|
|
71
|
+
spinner.stop();
|
|
72
|
+
console.log(chalk.red('No project specified. Run from a project directory or specify project name.'));
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
// If project name specified, look it up
|
|
76
|
+
if (projectName) {
|
|
77
|
+
const project = await findProjectByName(projectName);
|
|
78
|
+
if (!project) {
|
|
79
|
+
spinner.fail(`Project "${projectName}" not found.`);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
projectId = project.id;
|
|
83
|
+
}
|
|
84
|
+
const response = await domainApiRequest(`/api/projects/${projectId}/domains`);
|
|
85
|
+
spinner.stop();
|
|
86
|
+
if (response.domains.length === 0) {
|
|
87
|
+
console.log(chalk.yellow('No custom domains configured.'));
|
|
88
|
+
console.log(chalk.gray('Use `gazill domains add <domain>` to add one.'));
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
console.log(chalk.bold('\nCustom Domains:\n'));
|
|
92
|
+
for (const domain of response.domains) {
|
|
93
|
+
const statusColor = getStatusColor(domain.status);
|
|
94
|
+
const statusText = statusColor(`[${domain.status}]`);
|
|
95
|
+
console.log(` ${chalk.cyan(domain.domain)} ${statusText}`);
|
|
96
|
+
if (domain.status === 'pending' || domain.status === 'failed') {
|
|
97
|
+
console.log(chalk.gray(` DNS: A record → ${response.serverIp}`));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
console.log();
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
spinner.fail('Failed to fetch domains');
|
|
104
|
+
console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Add a custom domain
|
|
108
|
+
export async function domainsAddCommand(domain, projectName) {
|
|
109
|
+
const auth = await getAuth();
|
|
110
|
+
if (!auth?.token) {
|
|
111
|
+
console.log(chalk.red('Not logged in. Run `gazill login` first.'));
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const spinner = ora(`Adding ${domain}...`).start();
|
|
115
|
+
try {
|
|
116
|
+
// Get project ID
|
|
117
|
+
let projectId = await getProjectId();
|
|
118
|
+
if (!projectId && !projectName) {
|
|
119
|
+
spinner.stop();
|
|
120
|
+
console.log(chalk.red('No project specified. Run from a project directory or specify project name.'));
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
// If project name specified, look it up
|
|
124
|
+
if (projectName) {
|
|
125
|
+
const project = await findProjectByName(projectName);
|
|
126
|
+
if (!project) {
|
|
127
|
+
spinner.fail(`Project "${projectName}" not found.`);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
projectId = project.id;
|
|
131
|
+
}
|
|
132
|
+
const response = await domainApiRequest(`/api/projects/${projectId}/domains`, {
|
|
133
|
+
method: 'POST',
|
|
134
|
+
body: { domain },
|
|
135
|
+
});
|
|
136
|
+
spinner.succeed(`Added ${chalk.cyan(domain)}`);
|
|
137
|
+
console.log();
|
|
138
|
+
console.log(chalk.bold('DNS Configuration Required:'));
|
|
139
|
+
console.log();
|
|
140
|
+
console.log(` ${chalk.gray('Type:')} ${chalk.white('A')}`);
|
|
141
|
+
console.log(` ${chalk.gray('Name:')} ${chalk.white(response.instructions.name)}`);
|
|
142
|
+
console.log(` ${chalk.gray('Value:')} ${chalk.white(response.instructions.value)}`);
|
|
143
|
+
console.log();
|
|
144
|
+
console.log(chalk.gray('After configuring DNS, run:'));
|
|
145
|
+
console.log(chalk.cyan(` gazill domains verify ${domain}`));
|
|
146
|
+
console.log();
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
spinner.fail(`Failed to add ${domain}`);
|
|
150
|
+
console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Remove a custom domain
|
|
154
|
+
export async function domainsRemoveCommand(domain, projectName) {
|
|
155
|
+
const auth = await getAuth();
|
|
156
|
+
if (!auth?.token) {
|
|
157
|
+
console.log(chalk.red('Not logged in. Run `gazill login` first.'));
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
// Confirm deletion
|
|
161
|
+
const { confirmed } = await inquirer.prompt([
|
|
162
|
+
{
|
|
163
|
+
type: 'confirm',
|
|
164
|
+
name: 'confirmed',
|
|
165
|
+
message: `Remove domain ${chalk.cyan(domain)}?`,
|
|
166
|
+
default: false,
|
|
167
|
+
},
|
|
168
|
+
]);
|
|
169
|
+
if (!confirmed) {
|
|
170
|
+
console.log(chalk.gray('Cancelled.'));
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const spinner = ora(`Removing ${domain}...`).start();
|
|
174
|
+
try {
|
|
175
|
+
// Get project ID
|
|
176
|
+
let projectId = await getProjectId();
|
|
177
|
+
if (!projectId && !projectName) {
|
|
178
|
+
spinner.stop();
|
|
179
|
+
console.log(chalk.red('No project specified. Run from a project directory or specify project name.'));
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
// If project name specified, look it up
|
|
183
|
+
if (projectName) {
|
|
184
|
+
const project = await findProjectByName(projectName);
|
|
185
|
+
if (!project) {
|
|
186
|
+
spinner.fail(`Project "${projectName}" not found.`);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
projectId = project.id;
|
|
190
|
+
}
|
|
191
|
+
await domainApiRequest(`/api/projects/${projectId}/domains/${encodeURIComponent(domain)}`, { method: 'DELETE' });
|
|
192
|
+
spinner.succeed(`Removed ${chalk.cyan(domain)}`);
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
spinner.fail(`Failed to remove ${domain}`);
|
|
196
|
+
console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// Verify DNS and activate domain
|
|
200
|
+
export async function domainsVerifyCommand(domain, projectName) {
|
|
201
|
+
const auth = await getAuth();
|
|
202
|
+
if (!auth?.token) {
|
|
203
|
+
console.log(chalk.red('Not logged in. Run `gazill login` first.'));
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const spinner = ora(`Verifying ${domain}...`).start();
|
|
207
|
+
try {
|
|
208
|
+
// Get project ID
|
|
209
|
+
let projectId = await getProjectId();
|
|
210
|
+
if (!projectId && !projectName) {
|
|
211
|
+
spinner.stop();
|
|
212
|
+
console.log(chalk.red('No project specified. Run from a project directory or specify project name.'));
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
// If project name specified, look it up
|
|
216
|
+
if (projectName) {
|
|
217
|
+
const project = await findProjectByName(projectName);
|
|
218
|
+
if (!project) {
|
|
219
|
+
spinner.fail(`Project "${projectName}" not found.`);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
projectId = project.id;
|
|
223
|
+
}
|
|
224
|
+
await domainApiRequest(`/api/projects/${projectId}/domains/${encodeURIComponent(domain)}/verify`, { method: 'POST' });
|
|
225
|
+
spinner.succeed(`${chalk.green('✓')} Domain verified and active`);
|
|
226
|
+
console.log();
|
|
227
|
+
console.log(`Your site is now accessible at ${chalk.cyan(`https://${domain}`)}`);
|
|
228
|
+
console.log(chalk.gray('SSL certificate will be provisioned automatically.'));
|
|
229
|
+
console.log();
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
spinner.fail(`Failed to verify ${domain}`);
|
|
233
|
+
console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));
|
|
234
|
+
console.log();
|
|
235
|
+
console.log(chalk.gray('Ensure your DNS A record is configured correctly and has propagated.'));
|
|
236
|
+
console.log(chalk.gray('DNS changes can take up to 48 hours to propagate globally.'));
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=domains.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domains.js","sourceRoot":"","sources":["../../src/commands/domains.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function envListCommand(projectName?: string): Promise<void>;
|
|
2
|
+
export declare function envSetCommand(keyValue: string, projectName?: string): Promise<void>;
|
|
3
|
+
export declare function envDeleteCommand(key: string, projectName?: string): Promise<void>;
|
|
4
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAmEA,wBAAsB,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDxE;AAGD,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDzF;AAGD,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuDvF"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import inquirer from 'inquirer';
|
|
4
|
+
import { promises as fs } from 'fs';
|
|
5
|
+
import { getAuth, getApiUrl } from '../lib/config.js';
|
|
6
|
+
import { listProjects } from '../lib/api.js';
|
|
7
|
+
// API helper for env var routes
|
|
8
|
+
async function envApiRequest(endpoint, options = { method: 'GET' }) {
|
|
9
|
+
const apiUrl = await getApiUrl();
|
|
10
|
+
const auth = await getAuth();
|
|
11
|
+
if (!auth?.token) {
|
|
12
|
+
throw new Error('Not authenticated');
|
|
13
|
+
}
|
|
14
|
+
const response = await fetch(`${apiUrl}${endpoint}`, {
|
|
15
|
+
method: options.method,
|
|
16
|
+
headers: {
|
|
17
|
+
'Content-Type': 'application/json',
|
|
18
|
+
Authorization: `Bearer ${auth.token}`,
|
|
19
|
+
},
|
|
20
|
+
body: options.body ? JSON.stringify(options.body) : undefined,
|
|
21
|
+
});
|
|
22
|
+
const data = await response.json();
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
throw new Error(data.message || 'Request failed');
|
|
25
|
+
}
|
|
26
|
+
return data;
|
|
27
|
+
}
|
|
28
|
+
// Get current project ID from .gazill file
|
|
29
|
+
async function getProjectId() {
|
|
30
|
+
try {
|
|
31
|
+
const content = await fs.readFile('.gazill', 'utf-8');
|
|
32
|
+
const data = JSON.parse(content);
|
|
33
|
+
return data.projectId || null;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Find project by name
|
|
40
|
+
async function findProjectByName(name) {
|
|
41
|
+
const response = await listProjects();
|
|
42
|
+
return response.projects.find((p) => p.name === name) || null;
|
|
43
|
+
}
|
|
44
|
+
// List env vars for a project
|
|
45
|
+
export async function envListCommand(projectName) {
|
|
46
|
+
const auth = await getAuth();
|
|
47
|
+
if (!auth?.token) {
|
|
48
|
+
console.log(chalk.red('Not logged in. Run `gazill login` first.'));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const spinner = ora('Fetching environment variables...').start();
|
|
52
|
+
try {
|
|
53
|
+
// Get project ID
|
|
54
|
+
let projectId = await getProjectId();
|
|
55
|
+
if (!projectId && !projectName) {
|
|
56
|
+
spinner.stop();
|
|
57
|
+
console.log(chalk.red('No project specified. Run from a project directory or specify project name.'));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// If project name specified, look it up
|
|
61
|
+
if (projectName) {
|
|
62
|
+
const project = await findProjectByName(projectName);
|
|
63
|
+
if (!project) {
|
|
64
|
+
spinner.fail(`Project "${projectName}" not found.`);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
projectId = project.id;
|
|
68
|
+
}
|
|
69
|
+
const response = await envApiRequest(`/api/projects/${projectId}/env`);
|
|
70
|
+
spinner.stop();
|
|
71
|
+
if (response.envVars.length === 0) {
|
|
72
|
+
console.log(chalk.yellow('No environment variables set.'));
|
|
73
|
+
console.log(chalk.gray('Use `gazill env set KEY=VALUE` to add one.'));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
console.log(chalk.bold('\nEnvironment Variables:\n'));
|
|
77
|
+
for (const envVar of response.envVars) {
|
|
78
|
+
console.log(` ${chalk.cyan(envVar.key)} ${chalk.gray('(set ' + new Date(envVar.updatedAt).toLocaleDateString() + ')')}`);
|
|
79
|
+
}
|
|
80
|
+
console.log();
|
|
81
|
+
console.log(chalk.gray('Note: Values are encrypted and not displayed.'));
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
spinner.fail('Failed to fetch environment variables');
|
|
85
|
+
console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Set an env var
|
|
89
|
+
export async function envSetCommand(keyValue, projectName) {
|
|
90
|
+
const auth = await getAuth();
|
|
91
|
+
if (!auth?.token) {
|
|
92
|
+
console.log(chalk.red('Not logged in. Run `gazill login` first.'));
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// Parse KEY=VALUE
|
|
96
|
+
const match = keyValue.match(/^([A-Z][A-Z0-9_]*)=(.*)$/);
|
|
97
|
+
if (!match) {
|
|
98
|
+
console.log(chalk.red('Invalid format. Use: gazill env set KEY=VALUE'));
|
|
99
|
+
console.log(chalk.gray('Key must be uppercase with underscores (e.g., DATABASE_URL)'));
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const [, key, value] = match;
|
|
103
|
+
const spinner = ora(`Setting ${key}...`).start();
|
|
104
|
+
try {
|
|
105
|
+
// Get project ID
|
|
106
|
+
let projectId = await getProjectId();
|
|
107
|
+
if (!projectId && !projectName) {
|
|
108
|
+
spinner.stop();
|
|
109
|
+
console.log(chalk.red('No project specified. Run from a project directory or specify project name.'));
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
// If project name specified, look it up
|
|
113
|
+
if (projectName) {
|
|
114
|
+
const project = await findProjectByName(projectName);
|
|
115
|
+
if (!project) {
|
|
116
|
+
spinner.fail(`Project "${projectName}" not found.`);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
projectId = project.id;
|
|
120
|
+
}
|
|
121
|
+
await envApiRequest(`/api/projects/${projectId}/env`, {
|
|
122
|
+
method: 'POST',
|
|
123
|
+
body: { key, value },
|
|
124
|
+
});
|
|
125
|
+
spinner.succeed(`Set ${chalk.cyan(key)}`);
|
|
126
|
+
console.log(chalk.gray('\nNote: Redeploy your project for changes to take effect.'));
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
spinner.fail(`Failed to set ${key}`);
|
|
130
|
+
console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Delete an env var
|
|
134
|
+
export async function envDeleteCommand(key, projectName) {
|
|
135
|
+
const auth = await getAuth();
|
|
136
|
+
if (!auth?.token) {
|
|
137
|
+
console.log(chalk.red('Not logged in. Run `gazill login` first.'));
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
// Confirm deletion
|
|
141
|
+
const { confirmed } = await inquirer.prompt([
|
|
142
|
+
{
|
|
143
|
+
type: 'confirm',
|
|
144
|
+
name: 'confirmed',
|
|
145
|
+
message: `Delete environment variable ${chalk.cyan(key)}?`,
|
|
146
|
+
default: false,
|
|
147
|
+
},
|
|
148
|
+
]);
|
|
149
|
+
if (!confirmed) {
|
|
150
|
+
console.log(chalk.gray('Cancelled.'));
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const spinner = ora(`Deleting ${key}...`).start();
|
|
154
|
+
try {
|
|
155
|
+
// Get project ID
|
|
156
|
+
let projectId = await getProjectId();
|
|
157
|
+
if (!projectId && !projectName) {
|
|
158
|
+
spinner.stop();
|
|
159
|
+
console.log(chalk.red('No project specified. Run from a project directory or specify project name.'));
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
// If project name specified, look it up
|
|
163
|
+
if (projectName) {
|
|
164
|
+
const project = await findProjectByName(projectName);
|
|
165
|
+
if (!project) {
|
|
166
|
+
spinner.fail(`Project "${projectName}" not found.`);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
projectId = project.id;
|
|
170
|
+
}
|
|
171
|
+
await envApiRequest(`/api/projects/${projectId}/env/${key}`, { method: 'DELETE' });
|
|
172
|
+
spinner.succeed(`Deleted ${chalk.cyan(key)}`);
|
|
173
|
+
console.log(chalk.gray('\nNote: Redeploy your project for changes to take effect.'));
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
spinner.fail(`Failed to delete ${key}`);
|
|
177
|
+
console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAc7C,gCAAgC;AAChC,KAAK,UAAU,aAAa,CAC1B,QAAgB,EAChB,UAA8C,EAAE,MAAM,EAAE,KAAK,EAAE;IAE/D,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;IAE7B,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,GAAG,QAAQ,EAAE,EAAE;QACnD,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;SACtC;QACD,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC9D,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEnC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAE,IAA6B,CAAC,OAAO,IAAI,gBAAgB,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,IAAS,CAAC;AACnB,CAAC;AAED,2CAA2C;AAC3C,KAAK,UAAU,YAAY;IACzB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,uBAAuB;AACvB,KAAK,UAAU,iBAAiB,CAAC,IAAY;IAC3C,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IACtC,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC;AACzE,CAAC;AAED,8BAA8B;AAC9B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAoB;IACvD,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;IAC7B,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,mCAAmC,CAAC,CAAC,KAAK,EAAE,CAAC;IAEjE,IAAI,CAAC;QACH,iBAAiB;QACjB,IAAI,SAAS,GAAG,MAAM,YAAY,EAAE,CAAC;QAErC,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC,CAAC;YACtG,OAAO;QACT,CAAC;QAED,wCAAwC;QACxC,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;YACrD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,YAAY,WAAW,cAAc,CAAC,CAAC;gBACpD,OAAO;YACT,CAAC;YACD,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,aAAa,CAClC,iBAAiB,SAAS,MAAM,CACjC,CAAC;QAEF,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACtD,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5H,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACtD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;IACrF,CAAC;AACH,CAAC;AAED,iBAAiB;AACjB,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,WAAoB;IACxE,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;IAC7B,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,kBAAkB;IAClB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC,CAAC;QACvF,OAAO;IACT,CAAC;IAED,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC;IAE7B,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IAEjD,IAAI,CAAC;QACH,iBAAiB;QACjB,IAAI,SAAS,GAAG,MAAM,YAAY,EAAE,CAAC;QAErC,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC,CAAC;YACtG,OAAO;QACT,CAAC;QAED,wCAAwC;QACxC,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;YACrD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,YAAY,WAAW,cAAc,CAAC,CAAC;gBACpD,OAAO;YACT,CAAC;YACD,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,aAAa,CACjB,iBAAiB,SAAS,MAAM,EAChC;YACE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE;SACrB,CACF,CAAC;QAEF,OAAO,CAAC,OAAO,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC,CAAC;IACvF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;IACrF,CAAC;AACH,CAAC;AAED,oBAAoB;AACpB,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW,EAAE,WAAoB;IACtE,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;IAC7B,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,mBAAmB;IACnB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QAC1C;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,+BAA+B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;YAC1D,OAAO,EAAE,KAAK;SACf;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IAElD,IAAI,CAAC;QACH,iBAAiB;QACjB,IAAI,SAAS,GAAG,MAAM,YAAY,EAAE,CAAC;QAErC,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC,CAAC;YACtG,OAAO;QACT,CAAC;QAED,wCAAwC;QACxC,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;YACrD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,YAAY,WAAW,cAAc,CAAC,CAAC;gBACpD,OAAO;YACT,CAAC;YACD,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,aAAa,CACjB,iBAAiB,SAAS,QAAQ,GAAG,EAAE,EACvC,EAAE,MAAM,EAAE,QAAQ,EAAE,CACrB,CAAC;QAEF,OAAO,CAAC,OAAO,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC,CAAC;IACvF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;IACrF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/commands/health.ts"],"names":[],"mappings":"AAyFA,wBAAsB,aAAa,CACjC,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACjF,OAAO,CAAC,IAAI,CAAC,CAyEf"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import { promises as fs } from 'fs';
|
|
4
|
+
import { getAuth, getApiUrl } from '../lib/config.js';
|
|
5
|
+
import { listProjects } from '../lib/api.js';
|
|
6
|
+
// API helper for health routes
|
|
7
|
+
async function healthApiRequest(endpoint, options = { method: 'GET' }) {
|
|
8
|
+
const apiUrl = await getApiUrl();
|
|
9
|
+
const auth = await getAuth();
|
|
10
|
+
if (!auth?.token) {
|
|
11
|
+
throw new Error('Not authenticated');
|
|
12
|
+
}
|
|
13
|
+
const headers = {
|
|
14
|
+
'Content-Type': 'application/json',
|
|
15
|
+
Authorization: `Bearer ${auth.token}`,
|
|
16
|
+
};
|
|
17
|
+
const response = await fetch(`${apiUrl}${endpoint}`, {
|
|
18
|
+
method: options.method,
|
|
19
|
+
headers,
|
|
20
|
+
body: options.body ? JSON.stringify(options.body) : undefined,
|
|
21
|
+
});
|
|
22
|
+
const data = await response.json();
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
throw new Error(data.message || 'Request failed');
|
|
25
|
+
}
|
|
26
|
+
return data;
|
|
27
|
+
}
|
|
28
|
+
// Get current project ID from .gazill file
|
|
29
|
+
async function getProjectId() {
|
|
30
|
+
try {
|
|
31
|
+
const content = await fs.readFile('.gazill', 'utf-8');
|
|
32
|
+
const data = JSON.parse(content);
|
|
33
|
+
return data.projectId || null;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Find project by name
|
|
40
|
+
async function findProjectByName(name) {
|
|
41
|
+
const response = await listProjects();
|
|
42
|
+
return response.projects.find((p) => p.name === name) || null;
|
|
43
|
+
}
|
|
44
|
+
// Format time ago
|
|
45
|
+
function formatTimeAgo(dateStr) {
|
|
46
|
+
if (!dateStr)
|
|
47
|
+
return 'never';
|
|
48
|
+
const date = new Date(dateStr);
|
|
49
|
+
const now = Date.now();
|
|
50
|
+
const diffMs = now - date.getTime();
|
|
51
|
+
const seconds = Math.floor(diffMs / 1000);
|
|
52
|
+
const minutes = Math.floor(seconds / 60);
|
|
53
|
+
const hours = Math.floor(minutes / 60);
|
|
54
|
+
if (hours > 0)
|
|
55
|
+
return `${hours}h ${minutes % 60}m ago`;
|
|
56
|
+
if (minutes > 0)
|
|
57
|
+
return `${minutes}m ${seconds % 60}s ago`;
|
|
58
|
+
return `${seconds}s ago`;
|
|
59
|
+
}
|
|
60
|
+
// gazill health [project] - Show health status
|
|
61
|
+
export async function healthCommand(projectName, options) {
|
|
62
|
+
const auth = await getAuth();
|
|
63
|
+
if (!auth?.token) {
|
|
64
|
+
console.log(chalk.red('Not logged in. Run `gazill login` first.'));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// If options are provided, configure instead of show
|
|
68
|
+
if (options?.path || options?.interval || options?.timeout || options?.retries) {
|
|
69
|
+
await healthConfigureCommand(projectName, options);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const spinner = ora('Fetching health status...').start();
|
|
73
|
+
try {
|
|
74
|
+
let projectId = await getProjectId();
|
|
75
|
+
if (!projectId && !projectName) {
|
|
76
|
+
spinner.stop();
|
|
77
|
+
console.log(chalk.red('No project specified. Run from a project directory or specify project name.'));
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (projectName) {
|
|
81
|
+
const project = await findProjectByName(projectName);
|
|
82
|
+
if (!project) {
|
|
83
|
+
spinner.fail(`Project "${projectName}" not found.`);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
projectId = project.id;
|
|
87
|
+
}
|
|
88
|
+
const health = await healthApiRequest(`/api/projects/${projectId}/health`);
|
|
89
|
+
spinner.stop();
|
|
90
|
+
// Status indicator
|
|
91
|
+
const statusIcon = health.status === 'healthy' ? chalk.green('●') :
|
|
92
|
+
health.status === 'unhealthy' ? chalk.red('●') :
|
|
93
|
+
chalk.yellow('○');
|
|
94
|
+
const statusText = health.status === 'healthy' ? chalk.green('Healthy') :
|
|
95
|
+
health.status === 'unhealthy' ? chalk.red('Unhealthy') :
|
|
96
|
+
chalk.yellow('Unknown');
|
|
97
|
+
console.log();
|
|
98
|
+
console.log(` ${statusIcon} ${chalk.bold('Health Status:')} ${statusText}`);
|
|
99
|
+
console.log();
|
|
100
|
+
console.log(chalk.gray(' Last Check:'), formatTimeAgo(health.lastCheckAt));
|
|
101
|
+
if (health.consecutiveFailures > 0) {
|
|
102
|
+
console.log(chalk.red(' Consecutive Failures:'), health.consecutiveFailures);
|
|
103
|
+
}
|
|
104
|
+
console.log();
|
|
105
|
+
console.log(chalk.bold(' Configuration:'));
|
|
106
|
+
console.log(chalk.gray(' Path:'), health.config.path);
|
|
107
|
+
console.log(chalk.gray(' Interval:'), `${health.config.intervalSeconds}s`);
|
|
108
|
+
console.log(chalk.gray(' Timeout:'), `${health.config.timeoutSeconds}s`);
|
|
109
|
+
console.log(chalk.gray(' Retries:'), health.config.retries);
|
|
110
|
+
console.log();
|
|
111
|
+
if (health.status === 'unhealthy') {
|
|
112
|
+
console.log(chalk.yellow('Tip: Check that your app has a ' + health.config.path + ' endpoint that returns HTTP 200.'));
|
|
113
|
+
}
|
|
114
|
+
else if (health.status === 'unknown') {
|
|
115
|
+
console.log(chalk.gray('Tip: Health checks start after deployment. Deploy your app to see health status.'));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
spinner.fail('Failed to fetch health status');
|
|
120
|
+
console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// gazill health --path --interval --timeout --retries - Configure health check
|
|
124
|
+
async function healthConfigureCommand(projectName, options) {
|
|
125
|
+
const spinner = ora('Updating health configuration...').start();
|
|
126
|
+
try {
|
|
127
|
+
let projectId = await getProjectId();
|
|
128
|
+
if (!projectId && !projectName) {
|
|
129
|
+
spinner.stop();
|
|
130
|
+
console.log(chalk.red('No project specified. Run from a project directory or specify project name.'));
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (projectName) {
|
|
134
|
+
const project = await findProjectByName(projectName);
|
|
135
|
+
if (!project) {
|
|
136
|
+
spinner.fail(`Project "${projectName}" not found.`);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
projectId = project.id;
|
|
140
|
+
}
|
|
141
|
+
const config = {};
|
|
142
|
+
if (options?.path) {
|
|
143
|
+
if (!options.path.startsWith('/')) {
|
|
144
|
+
spinner.fail('Health check path must start with /');
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
config.path = options.path;
|
|
148
|
+
}
|
|
149
|
+
if (options?.interval) {
|
|
150
|
+
const interval = parseInt(options.interval, 10);
|
|
151
|
+
if (isNaN(interval) || interval < 10 || interval > 300) {
|
|
152
|
+
spinner.fail('Interval must be between 10 and 300 seconds');
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
config.intervalSeconds = interval;
|
|
156
|
+
}
|
|
157
|
+
if (options?.timeout) {
|
|
158
|
+
const timeout = parseInt(options.timeout, 10);
|
|
159
|
+
if (isNaN(timeout) || timeout < 1 || timeout > 30) {
|
|
160
|
+
spinner.fail('Timeout must be between 1 and 30 seconds');
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
config.timeoutSeconds = timeout;
|
|
164
|
+
}
|
|
165
|
+
if (options?.retries) {
|
|
166
|
+
const retries = parseInt(options.retries, 10);
|
|
167
|
+
if (isNaN(retries) || retries < 1 || retries > 10) {
|
|
168
|
+
spinner.fail('Retries must be between 1 and 10');
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
config.retries = retries;
|
|
172
|
+
}
|
|
173
|
+
const result = await healthApiRequest(`/api/projects/${projectId}/health`, { method: 'PATCH', body: config });
|
|
174
|
+
spinner.succeed('Health check configuration updated');
|
|
175
|
+
console.log();
|
|
176
|
+
console.log(chalk.bold(' New Configuration:'));
|
|
177
|
+
console.log(chalk.gray(' Path:'), result.config.path);
|
|
178
|
+
console.log(chalk.gray(' Interval:'), `${result.config.intervalSeconds}s`);
|
|
179
|
+
console.log(chalk.gray(' Timeout:'), `${result.config.timeoutSeconds}s`);
|
|
180
|
+
console.log(chalk.gray(' Retries:'), result.config.retries);
|
|
181
|
+
console.log();
|
|
182
|
+
console.log(chalk.gray('Changes will take effect on the next health check cycle.'));
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
spinner.fail('Failed to update health configuration');
|
|
186
|
+
console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=health.js.map
|