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 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/commands/health.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../../src/commands/limits.ts"],"names":[],"mappings":"AAuCA,wBAAsB,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsHvE"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
import { DEV_DOMAIN, DEV_MAX_CONCURRENT_VISITORS, DEV_MAX_UNIQUE_VISITORS, DEV_MAX_BANDWIDTH_BYTES, DEV_MAX_STORAGE_BYTES, DEV_SLEEP_AFTER_MINUTES, DEV_AUTO_DELETE_DAYS, MAX_PROJECTS_PER_USER, } from '../shared/index.js';
|
|
6
|
+
import { getLimits, listProjects } from '../lib/api.js';
|
|
7
|
+
import { isAuthenticated } from '../lib/config.js';
|
|
8
|
+
// Format bytes to human readable
|
|
9
|
+
function formatBytes(bytes) {
|
|
10
|
+
if (bytes === 0)
|
|
11
|
+
return '0 B';
|
|
12
|
+
const k = 1024;
|
|
13
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
14
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
15
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];
|
|
16
|
+
}
|
|
17
|
+
// Get progress bar
|
|
18
|
+
function getProgressBar(used, limit, width = 20) {
|
|
19
|
+
const percent = Math.min(used / limit, 1);
|
|
20
|
+
const filled = Math.round(percent * width);
|
|
21
|
+
const empty = width - filled;
|
|
22
|
+
let color = chalk.green;
|
|
23
|
+
if (percent >= 0.9)
|
|
24
|
+
color = chalk.red;
|
|
25
|
+
else if (percent >= 0.7)
|
|
26
|
+
color = chalk.yellow;
|
|
27
|
+
return color('█'.repeat(filled)) + chalk.gray('░'.repeat(empty));
|
|
28
|
+
}
|
|
29
|
+
export async function limitsCommand(projectName) {
|
|
30
|
+
// Check authentication
|
|
31
|
+
if (!(await isAuthenticated())) {
|
|
32
|
+
console.log(chalk.red('Please log in first.'));
|
|
33
|
+
console.log(chalk.gray('Run "gazill login" to authenticate.'));
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
let projectId = null;
|
|
37
|
+
let resolvedName = null;
|
|
38
|
+
// If project name not provided, check for .gazill/project.json
|
|
39
|
+
if (!projectName) {
|
|
40
|
+
const projectConfigPath = path.join(process.cwd(), '.gazill', 'project.json');
|
|
41
|
+
try {
|
|
42
|
+
const configContent = await fs.readFile(projectConfigPath, 'utf-8');
|
|
43
|
+
const projectConfig = JSON.parse(configContent);
|
|
44
|
+
projectId = projectConfig.id;
|
|
45
|
+
resolvedName = projectConfig.name;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Not in a project directory, show all projects
|
|
49
|
+
await showAllProjectsLimits();
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
// Find project by name
|
|
55
|
+
const spinner = ora('Finding project...').start();
|
|
56
|
+
try {
|
|
57
|
+
const { projects } = await listProjects();
|
|
58
|
+
const project = projects.find(p => p.name === projectName);
|
|
59
|
+
if (!project) {
|
|
60
|
+
spinner.fail(chalk.red(`Project "${projectName}" not found.`));
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
projectId = project.id;
|
|
64
|
+
resolvedName = project.name;
|
|
65
|
+
spinner.stop();
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
const message = error instanceof Error ? error.message : 'Failed to find project';
|
|
69
|
+
spinner.fail(chalk.red(message));
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Fetch limits for specific project
|
|
74
|
+
const spinner = ora('Fetching limits...').start();
|
|
75
|
+
try {
|
|
76
|
+
const limits = await getLimits(projectId);
|
|
77
|
+
spinner.stop();
|
|
78
|
+
console.log('');
|
|
79
|
+
console.log(chalk.bold(`Development Limits for ${chalk.blue(resolvedName)}`));
|
|
80
|
+
console.log(chalk.gray(`https://${resolvedName}.${DEV_DOMAIN}`));
|
|
81
|
+
console.log('');
|
|
82
|
+
// Unique Visitors
|
|
83
|
+
const visitorPercent = Math.round((limits.uniqueVisitors.used / limits.uniqueVisitors.limit) * 100);
|
|
84
|
+
console.log(chalk.bold('Unique Visitors'));
|
|
85
|
+
console.log(` ${getProgressBar(limits.uniqueVisitors.used, limits.uniqueVisitors.limit)} ${limits.uniqueVisitors.used}/${limits.uniqueVisitors.limit} (${visitorPercent}%)`);
|
|
86
|
+
console.log(chalk.gray(' Lifetime limit - does not reset'));
|
|
87
|
+
console.log('');
|
|
88
|
+
// Bandwidth
|
|
89
|
+
const bandwidthPercent = Math.round((limits.bandwidth.used / limits.bandwidth.limit) * 100);
|
|
90
|
+
console.log(chalk.bold('Bandwidth'));
|
|
91
|
+
console.log(` ${getProgressBar(limits.bandwidth.used, limits.bandwidth.limit)} ${formatBytes(limits.bandwidth.used)}/${formatBytes(limits.bandwidth.limit)} (${bandwidthPercent}%)`);
|
|
92
|
+
if (limits.bandwidth.resetsAt) {
|
|
93
|
+
const resetDate = new Date(limits.bandwidth.resetsAt);
|
|
94
|
+
console.log(chalk.gray(` Resets: ${resetDate.toLocaleDateString()}`));
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
console.log(chalk.gray(' Resets monthly'));
|
|
98
|
+
}
|
|
99
|
+
console.log('');
|
|
100
|
+
// Storage
|
|
101
|
+
if (limits.storage) {
|
|
102
|
+
const storagePercent = Math.round((limits.storage.used / limits.storage.limit) * 100);
|
|
103
|
+
console.log(chalk.bold('SQLite Storage'));
|
|
104
|
+
console.log(` ${getProgressBar(limits.storage.used, limits.storage.limit)} ${formatBytes(limits.storage.used)}/${formatBytes(limits.storage.limit)} (${storagePercent}%)`);
|
|
105
|
+
console.log(chalk.gray(' Use /data/db.sqlite or $DATABASE_URL'));
|
|
106
|
+
console.log('');
|
|
107
|
+
}
|
|
108
|
+
// Concurrent
|
|
109
|
+
console.log(chalk.bold('Concurrent Visitors'));
|
|
110
|
+
console.log(` ${getProgressBar(limits.concurrent.current, limits.concurrent.limit)} ${limits.concurrent.current}/${limits.concurrent.limit} active now`);
|
|
111
|
+
console.log('');
|
|
112
|
+
// Status
|
|
113
|
+
console.log(chalk.bold('Status'));
|
|
114
|
+
if (limits.sleeping) {
|
|
115
|
+
console.log(chalk.yellow(' Sleeping (will wake on request)'));
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
console.log(chalk.green(' Awake'));
|
|
119
|
+
}
|
|
120
|
+
if (limits.lastRequestAt) {
|
|
121
|
+
const lastRequest = new Date(limits.lastRequestAt);
|
|
122
|
+
console.log(chalk.gray(` Last request: ${lastRequest.toLocaleString()}`));
|
|
123
|
+
}
|
|
124
|
+
console.log('');
|
|
125
|
+
// Limits reference
|
|
126
|
+
console.log(chalk.gray('Development Environment Limits:'));
|
|
127
|
+
console.log(chalk.gray(` • ${DEV_MAX_CONCURRENT_VISITORS} concurrent visitors max`));
|
|
128
|
+
console.log(chalk.gray(` • ${DEV_MAX_UNIQUE_VISITORS} unique visitors (lifetime)`));
|
|
129
|
+
console.log(chalk.gray(` • ${formatBytes(DEV_MAX_BANDWIDTH_BYTES)} bandwidth/month`));
|
|
130
|
+
console.log(chalk.gray(` • ${formatBytes(DEV_MAX_STORAGE_BYTES)} SQLite storage`));
|
|
131
|
+
console.log(chalk.gray(` • Sleeps after ${DEV_SLEEP_AFTER_MINUTES}min inactive`));
|
|
132
|
+
console.log(chalk.gray(` • Auto-deleted after ${DEV_AUTO_DELETE_DAYS} days without deploys`));
|
|
133
|
+
console.log('');
|
|
134
|
+
console.log(chalk.gray('To remove all limits: gazill promote'));
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
const message = error instanceof Error ? error.message : 'Failed to fetch limits';
|
|
138
|
+
spinner.fail(chalk.red(message));
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async function showAllProjectsLimits() {
|
|
143
|
+
const spinner = ora('Fetching projects...').start();
|
|
144
|
+
try {
|
|
145
|
+
const { projects } = await listProjects();
|
|
146
|
+
spinner.stop();
|
|
147
|
+
if (projects.length === 0) {
|
|
148
|
+
console.log(chalk.gray('No projects found.'));
|
|
149
|
+
console.log(chalk.gray('Run "gazill new <name>" to create a project.'));
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
console.log('');
|
|
153
|
+
console.log(chalk.bold('Development Environment Limits'));
|
|
154
|
+
console.log('');
|
|
155
|
+
// Show summary for each project
|
|
156
|
+
for (const project of projects) {
|
|
157
|
+
// Only show limits for dev-only projects
|
|
158
|
+
if (project.prodStatus) {
|
|
159
|
+
console.log(chalk.blue.bold(project.name), chalk.green('(production)'));
|
|
160
|
+
console.log(chalk.gray(' No development limits - promoted to production'));
|
|
161
|
+
console.log('');
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
const visitors = project.uniqueVisitorCount || 0;
|
|
165
|
+
const bandwidth = project.monthlyBandwidthUsed || 0;
|
|
166
|
+
const sleeping = project.isSleeping || false;
|
|
167
|
+
console.log(chalk.blue.bold(project.name));
|
|
168
|
+
console.log(` Visitors: ${getProgressBar(visitors, DEV_MAX_UNIQUE_VISITORS, 15)} ${visitors}/${DEV_MAX_UNIQUE_VISITORS}`);
|
|
169
|
+
console.log(` Bandwidth: ${getProgressBar(bandwidth, DEV_MAX_BANDWIDTH_BYTES, 15)} ${formatBytes(bandwidth)}/2GB`);
|
|
170
|
+
if (sleeping) {
|
|
171
|
+
console.log(chalk.yellow(' Status: Sleeping'));
|
|
172
|
+
}
|
|
173
|
+
console.log('');
|
|
174
|
+
}
|
|
175
|
+
console.log(chalk.gray(`Projects: ${projects.length}/${MAX_PROJECTS_PER_USER}`));
|
|
176
|
+
console.log('');
|
|
177
|
+
console.log(chalk.gray('Run "gazill limits <project>" for detailed info'));
|
|
178
|
+
console.log(chalk.gray('Run "gazill promote" to remove limits'));
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
const message = error instanceof Error ? error.message : 'Failed to fetch projects';
|
|
182
|
+
spinner.fail(chalk.red(message));
|
|
183
|
+
process.exit(1);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=limits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limits.js","sourceRoot":"","sources":["../../src/commands/limits.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare function mysqlCreateCommand(name?: string, options?: {
|
|
2
|
+
size?: string;
|
|
3
|
+
project?: string;
|
|
4
|
+
}): Promise<void>;
|
|
5
|
+
export declare function mysqlListCommand(project?: string): Promise<void>;
|
|
6
|
+
export declare function mysqlConnectCommand(name?: string, options?: {
|
|
7
|
+
project?: string;
|
|
8
|
+
}): Promise<void>;
|
|
9
|
+
export declare function mysqlDeleteCommand(name?: string, options?: {
|
|
10
|
+
project?: string;
|
|
11
|
+
}): Promise<void>;
|
|
12
|
+
export declare function mysqlResizeCommand(size: string, name?: string, options?: {
|
|
13
|
+
project?: string;
|
|
14
|
+
}): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=mysql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql.d.ts","sourceRoot":"","sources":["../../src/commands/mysql.ts"],"names":[],"mappings":"AAyFA,wBAAsB,kBAAkB,CACtC,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5C,OAAO,CAAC,IAAI,CAAC,CAgFf;AAGD,wBAAsB,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDtE;AAGD,wBAAsB,mBAAmB,CACvC,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CAkGf;AAGD,wBAAsB,kBAAkB,CACtC,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CAoFf;AAGD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CAgFf"}
|
|
@@ -0,0 +1,413 @@
|
|
|
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
|
+
async function mysqlApiRequest(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 response = await fetch(`${apiUrl}${endpoint}`, {
|
|
14
|
+
method: options.method,
|
|
15
|
+
headers: {
|
|
16
|
+
'Content-Type': 'application/json',
|
|
17
|
+
Authorization: `Bearer ${auth.token}`,
|
|
18
|
+
},
|
|
19
|
+
body: options.body ? JSON.stringify(options.body) : undefined,
|
|
20
|
+
});
|
|
21
|
+
const data = await response.json();
|
|
22
|
+
if (!response.ok) {
|
|
23
|
+
throw new Error(data.message || 'Request failed');
|
|
24
|
+
}
|
|
25
|
+
return data;
|
|
26
|
+
}
|
|
27
|
+
async function getProjectId() {
|
|
28
|
+
try {
|
|
29
|
+
const content = await fs.readFile('.gazill', 'utf-8');
|
|
30
|
+
const data = JSON.parse(content);
|
|
31
|
+
return data.projectId || null;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async function findProjectByName(name) {
|
|
38
|
+
const response = await listProjects();
|
|
39
|
+
return response.projects.find((p) => p.name === name) || null;
|
|
40
|
+
}
|
|
41
|
+
function formatBytes(bytes) {
|
|
42
|
+
if (bytes === 0)
|
|
43
|
+
return '0 B';
|
|
44
|
+
const k = 1024;
|
|
45
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
46
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
47
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];
|
|
48
|
+
}
|
|
49
|
+
// gazill mysql create [name] - Create a MySQL database
|
|
50
|
+
export async function mysqlCreateCommand(name, options) {
|
|
51
|
+
const auth = await getAuth();
|
|
52
|
+
if (!auth?.token) {
|
|
53
|
+
console.log(chalk.red('Not logged in. Run `gazill login` first.'));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
let projectId = null;
|
|
57
|
+
if (options?.project) {
|
|
58
|
+
const project = await findProjectByName(options.project);
|
|
59
|
+
if (!project) {
|
|
60
|
+
console.log(chalk.red(`Project "${options.project}" not found.`));
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
projectId = project.id;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
projectId = await getProjectId();
|
|
67
|
+
}
|
|
68
|
+
if (!projectId) {
|
|
69
|
+
console.log(chalk.red('No project found. Run from a project directory or use --project.'));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
let dbName = name;
|
|
73
|
+
let size = options?.size || 'small';
|
|
74
|
+
if (!dbName) {
|
|
75
|
+
const answers = await inquirer.prompt([
|
|
76
|
+
{
|
|
77
|
+
type: 'input',
|
|
78
|
+
name: 'name',
|
|
79
|
+
message: 'Database name:',
|
|
80
|
+
default: 'main',
|
|
81
|
+
validate: (input) => {
|
|
82
|
+
if (!input.match(/^[a-z][a-z0-9-]*$/)) {
|
|
83
|
+
return 'Name must start with a letter and contain only lowercase letters, numbers, and hyphens';
|
|
84
|
+
}
|
|
85
|
+
return true;
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
type: 'list',
|
|
90
|
+
name: 'size',
|
|
91
|
+
message: 'Database size:',
|
|
92
|
+
choices: [
|
|
93
|
+
{ name: 'small - 512MB RAM, 50 connections, 5GB storage', value: 'small' },
|
|
94
|
+
{ name: 'medium - 1GB RAM, 100 connections, 10GB storage', value: 'medium' },
|
|
95
|
+
{ name: 'large - 2GB RAM, 200 connections, 25GB storage', value: 'large' },
|
|
96
|
+
{ name: 'xl - 4GB RAM, 500 connections, 50GB storage', value: 'xl' },
|
|
97
|
+
],
|
|
98
|
+
default: 'small',
|
|
99
|
+
},
|
|
100
|
+
]);
|
|
101
|
+
dbName = answers.name;
|
|
102
|
+
size = answers.size;
|
|
103
|
+
}
|
|
104
|
+
const spinner = ora('Creating MySQL database...').start();
|
|
105
|
+
try {
|
|
106
|
+
const response = await mysqlApiRequest(`/api/projects/${projectId}/mysql`, { method: 'POST', body: { name: dbName, size } });
|
|
107
|
+
spinner.succeed('MySQL database created');
|
|
108
|
+
console.log();
|
|
109
|
+
console.log(chalk.bold(' Database Details:'));
|
|
110
|
+
console.log(chalk.gray(' Name:'), response.database.name);
|
|
111
|
+
console.log(chalk.gray(' Size:'), response.database.size);
|
|
112
|
+
console.log(chalk.gray(' Status:'), chalk.green(response.database.status));
|
|
113
|
+
console.log(chalk.gray(' Max Connections:'), response.database.maxConnections);
|
|
114
|
+
console.log();
|
|
115
|
+
console.log(chalk.gray(' Run `gazill mysql connect` to get connection details.'));
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
spinner.fail('Failed to create MySQL database');
|
|
119
|
+
console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// gazill mysql list [project] - List MySQL databases
|
|
123
|
+
export async function mysqlListCommand(project) {
|
|
124
|
+
const auth = await getAuth();
|
|
125
|
+
if (!auth?.token) {
|
|
126
|
+
console.log(chalk.red('Not logged in. Run `gazill login` first.'));
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
let projectId = null;
|
|
130
|
+
if (project) {
|
|
131
|
+
const proj = await findProjectByName(project);
|
|
132
|
+
if (!proj) {
|
|
133
|
+
console.log(chalk.red(`Project "${project}" not found.`));
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
projectId = proj.id;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
projectId = await getProjectId();
|
|
140
|
+
}
|
|
141
|
+
if (!projectId) {
|
|
142
|
+
console.log(chalk.red('No project found. Run from a project directory or specify a project.'));
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const spinner = ora('Fetching MySQL databases...').start();
|
|
146
|
+
try {
|
|
147
|
+
const response = await mysqlApiRequest(`/api/projects/${projectId}/mysql`);
|
|
148
|
+
spinner.stop();
|
|
149
|
+
if (response.databases.length === 0) {
|
|
150
|
+
console.log(chalk.yellow('No MySQL databases found.'));
|
|
151
|
+
console.log(chalk.gray('Create one with `gazill mysql create`'));
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
console.log();
|
|
155
|
+
console.log(chalk.bold('MySQL Databases:'));
|
|
156
|
+
console.log();
|
|
157
|
+
for (const db of response.databases) {
|
|
158
|
+
const statusColor = db.status === 'running' ? chalk.green : chalk.yellow;
|
|
159
|
+
console.log(` ${chalk.cyan(db.name)} ${chalk.gray(`(${db.size})`)}`);
|
|
160
|
+
console.log(chalk.gray(` Status: `) + statusColor(db.status));
|
|
161
|
+
console.log(chalk.gray(` Port: ${db.port}`));
|
|
162
|
+
console.log(chalk.gray(` Storage: ${formatBytes(db.storage.usedBytes)} / ${db.storage.limitGb}GB`));
|
|
163
|
+
console.log(chalk.gray(` Connections: ${db.maxConnections}`));
|
|
164
|
+
console.log();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
spinner.fail('Failed to fetch MySQL databases');
|
|
169
|
+
console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// gazill mysql connect [name] - Get connection info
|
|
173
|
+
export async function mysqlConnectCommand(name, options) {
|
|
174
|
+
const auth = await getAuth();
|
|
175
|
+
if (!auth?.token) {
|
|
176
|
+
console.log(chalk.red('Not logged in. Run `gazill login` first.'));
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
let projectId = null;
|
|
180
|
+
if (options?.project) {
|
|
181
|
+
const project = await findProjectByName(options.project);
|
|
182
|
+
if (!project) {
|
|
183
|
+
console.log(chalk.red(`Project "${options.project}" not found.`));
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
projectId = project.id;
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
projectId = await getProjectId();
|
|
190
|
+
}
|
|
191
|
+
if (!projectId) {
|
|
192
|
+
console.log(chalk.red('No project found. Run from a project directory or use --project.'));
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const spinner = ora('Fetching connection details...').start();
|
|
196
|
+
try {
|
|
197
|
+
// Get list of databases
|
|
198
|
+
const listResponse = await mysqlApiRequest(`/api/projects/${projectId}/mysql`);
|
|
199
|
+
if (listResponse.databases.length === 0) {
|
|
200
|
+
spinner.stop();
|
|
201
|
+
console.log(chalk.yellow('No MySQL databases found.'));
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
// Find the database
|
|
205
|
+
let db;
|
|
206
|
+
if (name) {
|
|
207
|
+
db = listResponse.databases.find((d) => d.name === name);
|
|
208
|
+
if (!db) {
|
|
209
|
+
spinner.stop();
|
|
210
|
+
console.log(chalk.red(`MySQL database "${name}" not found.`));
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
else if (listResponse.databases.length === 1) {
|
|
215
|
+
db = listResponse.databases[0];
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
spinner.stop();
|
|
219
|
+
const answers = await inquirer.prompt([
|
|
220
|
+
{
|
|
221
|
+
type: 'list',
|
|
222
|
+
name: 'database',
|
|
223
|
+
message: 'Select database:',
|
|
224
|
+
choices: listResponse.databases.map((d) => ({
|
|
225
|
+
name: `${d.name} (${d.size})`,
|
|
226
|
+
value: d.id,
|
|
227
|
+
})),
|
|
228
|
+
},
|
|
229
|
+
]);
|
|
230
|
+
db = listResponse.databases.find((d) => d.id === answers.database);
|
|
231
|
+
spinner.start('Fetching connection details...');
|
|
232
|
+
}
|
|
233
|
+
if (!db)
|
|
234
|
+
return;
|
|
235
|
+
// Get connection details
|
|
236
|
+
const response = await mysqlApiRequest(`/api/projects/${projectId}/mysql/${db.id}`);
|
|
237
|
+
spinner.stop();
|
|
238
|
+
console.log();
|
|
239
|
+
console.log(chalk.bold(`MySQL Database: ${response.database.name}`));
|
|
240
|
+
console.log();
|
|
241
|
+
console.log(chalk.bold(' Connection Details:'));
|
|
242
|
+
console.log(chalk.gray(' Host:'), response.connection.host);
|
|
243
|
+
console.log(chalk.gray(' Port:'), response.connection.port);
|
|
244
|
+
console.log(chalk.gray(' Database:'), response.connection.database);
|
|
245
|
+
console.log(chalk.gray(' Username:'), response.connection.username);
|
|
246
|
+
console.log(chalk.gray(' Password:'), response.connection.password);
|
|
247
|
+
console.log();
|
|
248
|
+
console.log(chalk.bold(' Connection URL:'));
|
|
249
|
+
console.log(chalk.cyan(` ${response.connection.url}`));
|
|
250
|
+
console.log();
|
|
251
|
+
console.log(chalk.bold(' MySQL CLI:'));
|
|
252
|
+
console.log(chalk.gray(` ${response.connection.mysqlCommand}`));
|
|
253
|
+
console.log();
|
|
254
|
+
console.log(chalk.gray(' Note: Set MYSQL_URL in your app to connect from your code.'));
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
spinner.fail('Failed to fetch connection details');
|
|
258
|
+
console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// gazill mysql delete [name] - Delete a MySQL database
|
|
262
|
+
export async function mysqlDeleteCommand(name, options) {
|
|
263
|
+
const auth = await getAuth();
|
|
264
|
+
if (!auth?.token) {
|
|
265
|
+
console.log(chalk.red('Not logged in. Run `gazill login` first.'));
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
let projectId = null;
|
|
269
|
+
if (options?.project) {
|
|
270
|
+
const project = await findProjectByName(options.project);
|
|
271
|
+
if (!project) {
|
|
272
|
+
console.log(chalk.red(`Project "${options.project}" not found.`));
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
projectId = project.id;
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
projectId = await getProjectId();
|
|
279
|
+
}
|
|
280
|
+
if (!projectId) {
|
|
281
|
+
console.log(chalk.red('No project found. Run from a project directory or use --project.'));
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
// Get list of databases
|
|
285
|
+
const listResponse = await mysqlApiRequest(`/api/projects/${projectId}/mysql`);
|
|
286
|
+
if (listResponse.databases.length === 0) {
|
|
287
|
+
console.log(chalk.yellow('No MySQL databases found.'));
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
// Find or select the database
|
|
291
|
+
let db;
|
|
292
|
+
if (name) {
|
|
293
|
+
db = listResponse.databases.find((d) => d.name === name);
|
|
294
|
+
if (!db) {
|
|
295
|
+
console.log(chalk.red(`MySQL database "${name}" not found.`));
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
const answers = await inquirer.prompt([
|
|
301
|
+
{
|
|
302
|
+
type: 'list',
|
|
303
|
+
name: 'database',
|
|
304
|
+
message: 'Select database to delete:',
|
|
305
|
+
choices: listResponse.databases.map((d) => ({
|
|
306
|
+
name: `${d.name} (${d.size})`,
|
|
307
|
+
value: d.id,
|
|
308
|
+
})),
|
|
309
|
+
},
|
|
310
|
+
]);
|
|
311
|
+
db = listResponse.databases.find((d) => d.id === answers.database);
|
|
312
|
+
}
|
|
313
|
+
if (!db)
|
|
314
|
+
return;
|
|
315
|
+
// Confirm deletion
|
|
316
|
+
const confirm = await inquirer.prompt([
|
|
317
|
+
{
|
|
318
|
+
type: 'confirm',
|
|
319
|
+
name: 'confirm',
|
|
320
|
+
message: `Are you sure you want to delete "${db.name}"? This cannot be undone.`,
|
|
321
|
+
default: false,
|
|
322
|
+
},
|
|
323
|
+
]);
|
|
324
|
+
if (!confirm.confirm) {
|
|
325
|
+
console.log(chalk.yellow('Cancelled.'));
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
const spinner = ora('Deleting MySQL database...').start();
|
|
329
|
+
try {
|
|
330
|
+
await mysqlApiRequest(`/api/projects/${projectId}/mysql/${db.id}`, { method: 'DELETE' });
|
|
331
|
+
spinner.succeed('MySQL database deleted');
|
|
332
|
+
}
|
|
333
|
+
catch (error) {
|
|
334
|
+
spinner.fail('Failed to delete MySQL database');
|
|
335
|
+
console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
// gazill mysql resize <size> [name] - Resize a MySQL database
|
|
339
|
+
export async function mysqlResizeCommand(size, name, options) {
|
|
340
|
+
const auth = await getAuth();
|
|
341
|
+
if (!auth?.token) {
|
|
342
|
+
console.log(chalk.red('Not logged in. Run `gazill login` first.'));
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
const validSizes = ['small', 'medium', 'large', 'xl'];
|
|
346
|
+
if (!validSizes.includes(size)) {
|
|
347
|
+
console.log(chalk.red(`Invalid size. Must be one of: ${validSizes.join(', ')}`));
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
let projectId = null;
|
|
351
|
+
if (options?.project) {
|
|
352
|
+
const project = await findProjectByName(options.project);
|
|
353
|
+
if (!project) {
|
|
354
|
+
console.log(chalk.red(`Project "${options.project}" not found.`));
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
projectId = project.id;
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
projectId = await getProjectId();
|
|
361
|
+
}
|
|
362
|
+
if (!projectId) {
|
|
363
|
+
console.log(chalk.red('No project found. Run from a project directory or use --project.'));
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
// Get list of databases
|
|
367
|
+
const listResponse = await mysqlApiRequest(`/api/projects/${projectId}/mysql`);
|
|
368
|
+
if (listResponse.databases.length === 0) {
|
|
369
|
+
console.log(chalk.yellow('No MySQL databases found.'));
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
// Find or select the database
|
|
373
|
+
let db;
|
|
374
|
+
if (name) {
|
|
375
|
+
db = listResponse.databases.find((d) => d.name === name);
|
|
376
|
+
if (!db) {
|
|
377
|
+
console.log(chalk.red(`MySQL database "${name}" not found.`));
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
else if (listResponse.databases.length === 1) {
|
|
382
|
+
db = listResponse.databases[0];
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
const answers = await inquirer.prompt([
|
|
386
|
+
{
|
|
387
|
+
type: 'list',
|
|
388
|
+
name: 'database',
|
|
389
|
+
message: 'Select database to resize:',
|
|
390
|
+
choices: listResponse.databases.map((d) => ({
|
|
391
|
+
name: `${d.name} (${d.size})`,
|
|
392
|
+
value: d.id,
|
|
393
|
+
})),
|
|
394
|
+
},
|
|
395
|
+
]);
|
|
396
|
+
db = listResponse.databases.find((d) => d.id === answers.database);
|
|
397
|
+
}
|
|
398
|
+
if (!db)
|
|
399
|
+
return;
|
|
400
|
+
const spinner = ora(`Resizing MySQL database to ${size}...`).start();
|
|
401
|
+
try {
|
|
402
|
+
await mysqlApiRequest(`/api/projects/${projectId}/mysql/${db.id}/resize`, {
|
|
403
|
+
method: 'PATCH',
|
|
404
|
+
body: { size },
|
|
405
|
+
});
|
|
406
|
+
spinner.succeed(`MySQL database resized to ${size}`);
|
|
407
|
+
}
|
|
408
|
+
catch (error) {
|
|
409
|
+
spinner.fail('Failed to resize MySQL database');
|
|
410
|
+
console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
//# sourceMappingURL=mysql.js.map
|