@flexsiteio/cli 1.0.3 → 1.0.5
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/bin/flexsite.js +15 -17
- package/dist/bin/flexsite.js.map +1 -1
- package/dist/commands/auth.js +64 -70
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/composer.d.ts.map +1 -1
- package/dist/commands/composer.js +59 -64
- package/dist/commands/composer.js.map +1 -1
- package/dist/commands/config.js +17 -23
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/db.js +57 -63
- package/dist/commands/db.js.map +1 -1
- package/dist/commands/files.js +56 -62
- package/dist/commands/files.js.map +1 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +111 -81
- package/dist/commands/sync.js.map +1 -1
- package/dist/index.js +4 -20
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +3 -2
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +25 -34
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/config.js +14 -31
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/detector.d.ts.map +1 -1
- package/dist/lib/detector.js +177 -82
- package/dist/lib/detector.js.map +1 -1
- package/dist/types.js +1 -2
- package/dist/types.js.map +1 -1
- package/package.json +2 -1
package/dist/commands/db.js
CHANGED
|
@@ -1,27 +1,21 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* Database commands for FlexSite CLI.
|
|
4
3
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const
|
|
15
|
-
const path_1 = __importDefault(require("path"));
|
|
16
|
-
const api_js_1 = require("../lib/api.js");
|
|
17
|
-
const config_js_1 = require("../lib/config.js");
|
|
18
|
-
const detector_js_1 = require("../lib/detector.js");
|
|
19
|
-
exports.dbCommand = new commander_1.Command('db')
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import inquirer from 'inquirer';
|
|
7
|
+
import ora from 'ora';
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import { listProjects, listEnvironments, getLatestDatabaseBackup, listDatabaseBackups, downloadFile } from '../lib/api.js';
|
|
11
|
+
import { getToken } from '../lib/config.js';
|
|
12
|
+
import { detectLocalEnvironment, importDatabase } from '../lib/detector.js';
|
|
13
|
+
export const dbCommand = new Command('db')
|
|
20
14
|
.description('Database backup operations');
|
|
21
15
|
/**
|
|
22
16
|
* Pull database from remote environment
|
|
23
17
|
*/
|
|
24
|
-
|
|
18
|
+
dbCommand
|
|
25
19
|
.command('pull')
|
|
26
20
|
.description('Download and import the latest database backup')
|
|
27
21
|
.option('-e, --env <envId>', 'Environment ID')
|
|
@@ -33,26 +27,26 @@ exports.dbCommand
|
|
|
33
27
|
let environmentId = options.env;
|
|
34
28
|
let projectId = options.project;
|
|
35
29
|
// Show which organization we're using
|
|
36
|
-
const tokenConfig =
|
|
30
|
+
const tokenConfig = getToken();
|
|
37
31
|
if (tokenConfig) {
|
|
38
|
-
console.log(
|
|
32
|
+
console.log(chalk.dim(`Organization: ${tokenConfig.organizationName || tokenConfig.organizationId}`));
|
|
39
33
|
}
|
|
40
34
|
// If no environment specified, prompt for selection
|
|
41
35
|
if (!environmentId) {
|
|
42
36
|
// Always prompt for project selection (don't use cached values)
|
|
43
37
|
if (!projectId) {
|
|
44
|
-
const projects = await
|
|
38
|
+
const projects = await listProjects();
|
|
45
39
|
if (projects.length === 0) {
|
|
46
|
-
console.error(
|
|
40
|
+
console.error(chalk.red('No projects found.'));
|
|
47
41
|
process.exit(1);
|
|
48
42
|
}
|
|
49
43
|
if (projects.length === 1) {
|
|
50
44
|
// Only one project, use it automatically
|
|
51
45
|
projectId = projects[0].id;
|
|
52
|
-
console.log(
|
|
46
|
+
console.log(chalk.dim(`Project: ${projects[0].title}`));
|
|
53
47
|
}
|
|
54
48
|
else {
|
|
55
|
-
const { selectedProject } = await
|
|
49
|
+
const { selectedProject } = await inquirer.prompt([
|
|
56
50
|
{
|
|
57
51
|
type: 'list',
|
|
58
52
|
name: 'selectedProject',
|
|
@@ -67,18 +61,18 @@ exports.dbCommand
|
|
|
67
61
|
}
|
|
68
62
|
}
|
|
69
63
|
// Get environment - always prompt
|
|
70
|
-
const environments = await
|
|
64
|
+
const environments = await listEnvironments(projectId);
|
|
71
65
|
if (environments.length === 0) {
|
|
72
|
-
console.error(
|
|
66
|
+
console.error(chalk.red('No environments found for this project.'));
|
|
73
67
|
process.exit(1);
|
|
74
68
|
}
|
|
75
69
|
if (environments.length === 1) {
|
|
76
70
|
// Only one environment, use it automatically
|
|
77
71
|
environmentId = environments[0].id;
|
|
78
|
-
console.log(
|
|
72
|
+
console.log(chalk.dim(`Environment: ${environments[0].title}`));
|
|
79
73
|
}
|
|
80
74
|
else {
|
|
81
|
-
const { selectedEnv } = await
|
|
75
|
+
const { selectedEnv } = await inquirer.prompt([
|
|
82
76
|
{
|
|
83
77
|
type: 'list',
|
|
84
78
|
name: 'selectedEnv',
|
|
@@ -93,15 +87,15 @@ exports.dbCommand
|
|
|
93
87
|
}
|
|
94
88
|
}
|
|
95
89
|
// Get latest backup info
|
|
96
|
-
const spinner = (
|
|
90
|
+
const spinner = ora('Fetching latest backup...').start();
|
|
97
91
|
let backup;
|
|
98
92
|
try {
|
|
99
|
-
backup = await
|
|
93
|
+
backup = await getLatestDatabaseBackup(environmentId);
|
|
100
94
|
if (!backup || !backup.url) {
|
|
101
95
|
spinner.fail('No database backup found');
|
|
102
96
|
console.log();
|
|
103
|
-
console.log(
|
|
104
|
-
console.log(
|
|
97
|
+
console.log(chalk.yellow('No database backups available for this environment.'));
|
|
98
|
+
console.log(chalk.cyan('Create a backup in the FlexSite dashboard:'));
|
|
105
99
|
console.log(` https://flexsite.io/dashboard/project/${projectId}/environment/${environmentId}/backups`);
|
|
106
100
|
process.exit(1);
|
|
107
101
|
}
|
|
@@ -112,24 +106,24 @@ exports.dbCommand
|
|
|
112
106
|
// Check if it's a "not found" error
|
|
113
107
|
if (error.message?.includes('No backup') || error.message?.includes('not found')) {
|
|
114
108
|
console.log();
|
|
115
|
-
console.log(
|
|
116
|
-
console.log(
|
|
109
|
+
console.log(chalk.yellow('No database backups available for this environment.'));
|
|
110
|
+
console.log(chalk.cyan('Create a backup in the FlexSite dashboard:'));
|
|
117
111
|
console.log(` https://flexsite.io/dashboard/project/${projectId}/environment/${environmentId}/backups`);
|
|
118
112
|
process.exit(1);
|
|
119
113
|
}
|
|
120
114
|
throw error;
|
|
121
115
|
}
|
|
122
116
|
// Download the backup
|
|
123
|
-
const downloadSpinner = (
|
|
117
|
+
const downloadSpinner = ora('Downloading backup...').start();
|
|
124
118
|
let filePath = options.output;
|
|
125
119
|
if (!filePath) {
|
|
126
|
-
filePath =
|
|
120
|
+
filePath = path.join(process.cwd(), backup.fileName);
|
|
127
121
|
}
|
|
128
122
|
try {
|
|
129
|
-
const data = await
|
|
123
|
+
const data = await downloadFile(backup.url, (progress) => {
|
|
130
124
|
downloadSpinner.text = `Downloading backup... ${progress}%`;
|
|
131
125
|
});
|
|
132
|
-
|
|
126
|
+
fs.writeFileSync(filePath, data);
|
|
133
127
|
downloadSpinner.succeed(`Downloaded to: ${filePath}`);
|
|
134
128
|
}
|
|
135
129
|
catch (error) {
|
|
@@ -138,19 +132,19 @@ exports.dbCommand
|
|
|
138
132
|
}
|
|
139
133
|
// Import if not disabled
|
|
140
134
|
if (options.import !== false) {
|
|
141
|
-
const localEnv =
|
|
135
|
+
const localEnv = detectLocalEnvironment();
|
|
142
136
|
if (!localEnv) {
|
|
143
|
-
console.log(
|
|
137
|
+
console.log(chalk.yellow('\nNo local environment detected (Lando/DDEV).'));
|
|
144
138
|
console.log('Run the following command manually to import:');
|
|
145
|
-
console.log(
|
|
139
|
+
console.log(chalk.cyan(` lando db-import ${filePath}`));
|
|
146
140
|
console.log('or');
|
|
147
|
-
console.log(
|
|
141
|
+
console.log(chalk.cyan(` ddev import-db --file=${filePath}`));
|
|
148
142
|
return;
|
|
149
143
|
}
|
|
150
|
-
console.log(
|
|
151
|
-
const importSpinner = (
|
|
144
|
+
console.log(chalk.cyan(`\nDetected ${localEnv.toUpperCase()} environment.`));
|
|
145
|
+
const importSpinner = ora('Importing database...').start();
|
|
152
146
|
try {
|
|
153
|
-
await
|
|
147
|
+
await importDatabase(filePath, localEnv);
|
|
154
148
|
importSpinner.succeed('Database imported successfully!');
|
|
155
149
|
}
|
|
156
150
|
catch (error) {
|
|
@@ -158,11 +152,11 @@ exports.dbCommand
|
|
|
158
152
|
throw error;
|
|
159
153
|
}
|
|
160
154
|
}
|
|
161
|
-
console.log(
|
|
155
|
+
console.log(chalk.green('\n✓ Database sync complete!'));
|
|
162
156
|
}
|
|
163
157
|
catch (error) {
|
|
164
158
|
if (error instanceof Error) {
|
|
165
|
-
console.error(
|
|
159
|
+
console.error(chalk.red(`\nError: ${error.message}`));
|
|
166
160
|
}
|
|
167
161
|
process.exit(1);
|
|
168
162
|
}
|
|
@@ -170,7 +164,7 @@ exports.dbCommand
|
|
|
170
164
|
/**
|
|
171
165
|
* List available database backups
|
|
172
166
|
*/
|
|
173
|
-
|
|
167
|
+
dbCommand
|
|
174
168
|
.command('list')
|
|
175
169
|
.description('List available database backups')
|
|
176
170
|
.option('-e, --env <envId>', 'Environment ID')
|
|
@@ -180,25 +174,25 @@ exports.dbCommand
|
|
|
180
174
|
let environmentId = options.env;
|
|
181
175
|
let projectId = options.project;
|
|
182
176
|
// Show which organization we're using
|
|
183
|
-
const tokenConfig =
|
|
177
|
+
const tokenConfig = getToken();
|
|
184
178
|
if (tokenConfig) {
|
|
185
|
-
console.log(
|
|
179
|
+
console.log(chalk.dim(`Organization: ${tokenConfig.organizationName || tokenConfig.organizationId}`));
|
|
186
180
|
}
|
|
187
181
|
// If no environment specified, prompt for selection
|
|
188
182
|
if (!environmentId) {
|
|
189
183
|
// Always prompt for project selection
|
|
190
184
|
if (!projectId) {
|
|
191
|
-
const projects = await
|
|
185
|
+
const projects = await listProjects();
|
|
192
186
|
if (projects.length === 0) {
|
|
193
|
-
console.error(
|
|
187
|
+
console.error(chalk.red('No projects found.'));
|
|
194
188
|
process.exit(1);
|
|
195
189
|
}
|
|
196
190
|
if (projects.length === 1) {
|
|
197
191
|
projectId = projects[0].id;
|
|
198
|
-
console.log(
|
|
192
|
+
console.log(chalk.dim(`Project: ${projects[0].title}`));
|
|
199
193
|
}
|
|
200
194
|
else {
|
|
201
|
-
const { selectedProject } = await
|
|
195
|
+
const { selectedProject } = await inquirer.prompt([
|
|
202
196
|
{
|
|
203
197
|
type: 'list',
|
|
204
198
|
name: 'selectedProject',
|
|
@@ -212,17 +206,17 @@ exports.dbCommand
|
|
|
212
206
|
projectId = selectedProject;
|
|
213
207
|
}
|
|
214
208
|
}
|
|
215
|
-
const environments = await
|
|
209
|
+
const environments = await listEnvironments(projectId);
|
|
216
210
|
if (environments.length === 0) {
|
|
217
|
-
console.error(
|
|
211
|
+
console.error(chalk.red('No environments found.'));
|
|
218
212
|
process.exit(1);
|
|
219
213
|
}
|
|
220
214
|
if (environments.length === 1) {
|
|
221
215
|
environmentId = environments[0].id;
|
|
222
|
-
console.log(
|
|
216
|
+
console.log(chalk.dim(`Environment: ${environments[0].title}`));
|
|
223
217
|
}
|
|
224
218
|
else {
|
|
225
|
-
const { selectedEnv } = await
|
|
219
|
+
const { selectedEnv } = await inquirer.prompt([
|
|
226
220
|
{
|
|
227
221
|
type: 'list',
|
|
228
222
|
name: 'selectedEnv',
|
|
@@ -236,15 +230,15 @@ exports.dbCommand
|
|
|
236
230
|
environmentId = selectedEnv;
|
|
237
231
|
}
|
|
238
232
|
}
|
|
239
|
-
const spinner = (
|
|
233
|
+
const spinner = ora('Fetching backups...').start();
|
|
240
234
|
try {
|
|
241
|
-
const backups = await
|
|
235
|
+
const backups = await listDatabaseBackups(environmentId);
|
|
242
236
|
spinner.stop();
|
|
243
237
|
if (backups.length === 0) {
|
|
244
|
-
console.log(
|
|
238
|
+
console.log(chalk.yellow('No backups found.'));
|
|
245
239
|
return;
|
|
246
240
|
}
|
|
247
|
-
console.log(
|
|
241
|
+
console.log(chalk.cyan('\nDatabase backups:\n'));
|
|
248
242
|
for (const backup of backups) {
|
|
249
243
|
const date = backup.createdAt
|
|
250
244
|
? new Date(backup.createdAt).toLocaleString()
|
|
@@ -252,7 +246,7 @@ exports.dbCommand
|
|
|
252
246
|
const size = backup.sizeBytes
|
|
253
247
|
? `${(backup.sizeBytes / 1024 / 1024).toFixed(2)} MB`
|
|
254
248
|
: 'Unknown size';
|
|
255
|
-
console.log(` ${
|
|
249
|
+
console.log(` ${chalk.green('•')} ${backup.fileName || backup.id}`);
|
|
256
250
|
console.log(` Created: ${date}`);
|
|
257
251
|
console.log(` Size: ${size}`);
|
|
258
252
|
console.log(` Type: ${backup.type || 'automatic'}`);
|
|
@@ -266,7 +260,7 @@ exports.dbCommand
|
|
|
266
260
|
}
|
|
267
261
|
catch (error) {
|
|
268
262
|
if (error instanceof Error) {
|
|
269
|
-
console.error(
|
|
263
|
+
console.error(chalk.red(`\nError: ${error.message}`));
|
|
270
264
|
}
|
|
271
265
|
process.exit(1);
|
|
272
266
|
}
|
package/dist/commands/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/commands/db.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/commands/db.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,EACnB,YAAY,EACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE5E,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;KACvC,WAAW,CAAC,4BAA4B,CAAC,CAAC;AAE7C;;GAEG;AACH,SAAS;KACN,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,gDAAgD,CAAC;KAC7D,MAAM,CAAC,mBAAmB,EAAE,gBAAgB,CAAC;KAC7C,MAAM,CAAC,2BAA2B,EAAE,YAAY,CAAC;KACjD,MAAM,CAAC,aAAa,EAAE,8BAA8B,CAAC;KACrD,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,IAAI,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC;QAChC,IAAI,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;QAEhC,sCAAsC;QACtC,MAAM,WAAW,GAAG,QAAQ,EAAE,CAAC;QAC/B,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,WAAW,CAAC,gBAAgB,IAAI,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QACxG,CAAC;QAED,oDAAoD;QACpD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,gEAAgE;YAChE,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;gBAEtC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC1B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;oBAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC1B,yCAAyC;oBACzC,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC1D,CAAC;qBAAM,CAAC;oBACN,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;wBAChD;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,iBAAiB;4BACvB,OAAO,EAAE,iBAAiB;4BAC1B,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gCAC1B,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,SAAS,IAAI,SAAS,GAAG;gCAChD,KAAK,EAAE,CAAC,CAAC,EAAE;6BACZ,CAAC,CAAC;yBACJ;qBACF,CAAC,CAAC;oBAEH,SAAS,GAAG,eAAe,CAAC;gBAC9B,CAAC;YACH,CAAC;YAED,kCAAkC;YAClC,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAEvD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;gBACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,6CAA6C;gBAC7C,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;oBAC5C;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,aAAa;wBACnB,OAAO,EAAE,qBAAqB;wBAC9B,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;4BAC9B,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,MAAM,IAAI,MAAM,OAAO,CAAC,CAAC,MAAM,IAAI,SAAS,EAAE;4BACrE,KAAK,EAAE,CAAC,CAAC,EAAE;yBACZ,CAAC,CAAC;qBACJ;iBACF,CAAC,CAAC;gBAEH,aAAa,GAAG,WAAW,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,MAAM,OAAO,GAAG,GAAG,CAAC,2BAA2B,CAAC,CAAC,KAAK,EAAE,CAAC;QAEzD,IAAI,MAAM,CAAC;QACX,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,uBAAuB,CAAC,aAAa,CAAC,CAAC;YACtD,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBAC3B,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;gBACzC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qDAAqD,CAAC,CAAC,CAAC;gBACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;gBACtE,OAAO,CAAC,GAAG,CAAC,2CAA2C,SAAS,gBAAgB,aAAa,UAAU,CAAC,CAAC;gBACzG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO,CAAC,OAAO,CAAC,iBAAiB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACrC,oCAAoC;YACpC,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACjF,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qDAAqD,CAAC,CAAC,CAAC;gBACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;gBACtE,OAAO,CAAC,GAAG,CAAC,2CAA2C,SAAS,gBAAgB,aAAa,UAAU,CAAC,CAAC;gBACzG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,sBAAsB;QACtB,MAAM,eAAe,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;QAE7D,IAAI,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE;gBACvD,eAAe,CAAC,IAAI,GAAG,yBAAyB,QAAQ,GAAG,CAAC;YAC9D,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACjC,eAAe,CAAC,OAAO,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAC;QAExD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAe,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACxC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,yBAAyB;QACzB,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,sBAAsB,EAAE,CAAC;YAE1C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,+CAA+C,CAAC,CAAC,CAAC;gBAC3E,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;gBAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC,CAAC;gBAC/D,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC;YAE7E,MAAM,aAAa,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;YAE3D,IAAI,CAAC;gBACH,MAAM,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACzC,aAAa,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;YAC3D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBACpC,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAE1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL;;GAEG;AACH,SAAS;KACN,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,mBAAmB,EAAE,gBAAgB,CAAC;KAC7C,MAAM,CAAC,2BAA2B,EAAE,YAAY,CAAC;KACjD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,IAAI,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC;QAChC,IAAI,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;QAEhC,sCAAsC;QACtC,MAAM,WAAW,GAAG,QAAQ,EAAE,CAAC;QAC/B,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,WAAW,CAAC,gBAAgB,IAAI,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QACxG,CAAC;QAED,oDAAoD;QACpD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,sCAAsC;YACtC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;gBAEtC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC1B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;oBAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC1B,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC1D,CAAC;qBAAM,CAAC;oBACN,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;wBAChD;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,iBAAiB;4BACvB,OAAO,EAAE,iBAAiB;4BAC1B,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gCAC1B,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,SAAS,IAAI,SAAS,GAAG;gCAChD,KAAK,EAAE,CAAC,CAAC,EAAE;6BACZ,CAAC,CAAC;yBACJ;qBACF,CAAC,CAAC;oBAEH,SAAS,GAAG,eAAe,CAAC;gBAC9B,CAAC;YACH,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAEvD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;gBACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;oBAC5C;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,aAAa;wBACnB,OAAO,EAAE,qBAAqB;wBAC9B,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;4BAC9B,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,MAAM,IAAI,MAAM,GAAG;4BAC1C,KAAK,EAAE,CAAC,CAAC,EAAE;yBACZ,CAAC,CAAC;qBACJ;iBACF,CAAC,CAAC;gBAEH,aAAa,GAAG,WAAW,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC,KAAK,EAAE,CAAC;QAEnD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,aAAa,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBAC/C,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;YAEjD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS;oBAC3B,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE;oBAC7C,CAAC,CAAC,SAAS,CAAC;gBACd,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS;oBAC3B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;oBACrD,CAAC,CAAC,cAAc,CAAC;gBAEnB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;gBACrE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;gBACvD,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,CAAC;QAEH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACxC,MAAM,KAAK,CAAC;QACd,CAAC;IAEH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
package/dist/commands/files.js
CHANGED
|
@@ -1,27 +1,21 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* Files backup commands for FlexSite CLI.
|
|
4
3
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const
|
|
15
|
-
const path_1 = __importDefault(require("path"));
|
|
16
|
-
const api_js_1 = require("../lib/api.js");
|
|
17
|
-
const config_js_1 = require("../lib/config.js");
|
|
18
|
-
const detector_js_1 = require("../lib/detector.js");
|
|
19
|
-
exports.filesCommand = new commander_1.Command('files')
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import inquirer from 'inquirer';
|
|
7
|
+
import ora from 'ora';
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import { listProjects, listEnvironments, getLatestFilesBackup, listFilesBackups, downloadFile } from '../lib/api.js';
|
|
11
|
+
import { getToken } from '../lib/config.js';
|
|
12
|
+
import { detectLocalEnvironment, importFiles } from '../lib/detector.js';
|
|
13
|
+
export const filesCommand = new Command('files')
|
|
20
14
|
.description('Files backup operations');
|
|
21
15
|
/**
|
|
22
16
|
* Pull files from remote environment
|
|
23
17
|
*/
|
|
24
|
-
|
|
18
|
+
filesCommand
|
|
25
19
|
.command('pull')
|
|
26
20
|
.description('Download and extract the latest files backup')
|
|
27
21
|
.option('-e, --env <envId>', 'Environment ID')
|
|
@@ -33,26 +27,26 @@ exports.filesCommand
|
|
|
33
27
|
let environmentId = options.env;
|
|
34
28
|
let projectId = options.project;
|
|
35
29
|
// Show which organization we're using
|
|
36
|
-
const tokenConfig =
|
|
30
|
+
const tokenConfig = getToken();
|
|
37
31
|
if (tokenConfig) {
|
|
38
|
-
console.log(
|
|
32
|
+
console.log(chalk.dim(`Organization: ${tokenConfig.organizationName || tokenConfig.organizationId}`));
|
|
39
33
|
}
|
|
40
34
|
// If no environment specified, prompt for selection
|
|
41
35
|
if (!environmentId) {
|
|
42
36
|
// Always prompt for project selection (don't use cached values)
|
|
43
37
|
if (!projectId) {
|
|
44
|
-
const projects = await
|
|
38
|
+
const projects = await listProjects();
|
|
45
39
|
if (projects.length === 0) {
|
|
46
|
-
console.error(
|
|
40
|
+
console.error(chalk.red('No projects found.'));
|
|
47
41
|
process.exit(1);
|
|
48
42
|
}
|
|
49
43
|
if (projects.length === 1) {
|
|
50
44
|
// Only one project, use it automatically
|
|
51
45
|
projectId = projects[0].id;
|
|
52
|
-
console.log(
|
|
46
|
+
console.log(chalk.dim(`Project: ${projects[0].title}`));
|
|
53
47
|
}
|
|
54
48
|
else {
|
|
55
|
-
const { selectedProject } = await
|
|
49
|
+
const { selectedProject } = await inquirer.prompt([
|
|
56
50
|
{
|
|
57
51
|
type: 'list',
|
|
58
52
|
name: 'selectedProject',
|
|
@@ -67,18 +61,18 @@ exports.filesCommand
|
|
|
67
61
|
}
|
|
68
62
|
}
|
|
69
63
|
// Get environment - always prompt
|
|
70
|
-
const environments = await
|
|
64
|
+
const environments = await listEnvironments(projectId);
|
|
71
65
|
if (environments.length === 0) {
|
|
72
|
-
console.error(
|
|
66
|
+
console.error(chalk.red('No environments found for this project.'));
|
|
73
67
|
process.exit(1);
|
|
74
68
|
}
|
|
75
69
|
if (environments.length === 1) {
|
|
76
70
|
// Only one environment, use it automatically
|
|
77
71
|
environmentId = environments[0].id;
|
|
78
|
-
console.log(
|
|
72
|
+
console.log(chalk.dim(`Environment: ${environments[0].title}`));
|
|
79
73
|
}
|
|
80
74
|
else {
|
|
81
|
-
const { selectedEnv } = await
|
|
75
|
+
const { selectedEnv } = await inquirer.prompt([
|
|
82
76
|
{
|
|
83
77
|
type: 'list',
|
|
84
78
|
name: 'selectedEnv',
|
|
@@ -93,15 +87,15 @@ exports.filesCommand
|
|
|
93
87
|
}
|
|
94
88
|
}
|
|
95
89
|
// Get latest backup info
|
|
96
|
-
const spinner = (
|
|
90
|
+
const spinner = ora('Fetching latest files backup...').start();
|
|
97
91
|
let backup;
|
|
98
92
|
try {
|
|
99
|
-
backup = await
|
|
93
|
+
backup = await getLatestFilesBackup(environmentId);
|
|
100
94
|
if (!backup || !backup.url) {
|
|
101
95
|
spinner.fail('No files backup found');
|
|
102
96
|
console.log();
|
|
103
|
-
console.log(
|
|
104
|
-
console.log(
|
|
97
|
+
console.log(chalk.yellow('No files backups available for this environment.'));
|
|
98
|
+
console.log(chalk.cyan('Create a backup in the FlexSite dashboard:'));
|
|
105
99
|
console.log(` https://flexsite.io/dashboard/project/${projectId}/environment/${environmentId}/backups`);
|
|
106
100
|
process.exit(1);
|
|
107
101
|
}
|
|
@@ -112,24 +106,24 @@ exports.filesCommand
|
|
|
112
106
|
// Check if it's a "not found" error
|
|
113
107
|
if (error.message?.includes('No backup') || error.message?.includes('not found')) {
|
|
114
108
|
console.log();
|
|
115
|
-
console.log(
|
|
116
|
-
console.log(
|
|
109
|
+
console.log(chalk.yellow('No files backups available for this environment.'));
|
|
110
|
+
console.log(chalk.cyan('Create a backup in the FlexSite dashboard:'));
|
|
117
111
|
console.log(` https://flexsite.io/dashboard/project/${projectId}/environment/${environmentId}/backups`);
|
|
118
112
|
process.exit(1);
|
|
119
113
|
}
|
|
120
114
|
throw error;
|
|
121
115
|
}
|
|
122
116
|
// Download the backup
|
|
123
|
-
const downloadSpinner = (
|
|
117
|
+
const downloadSpinner = ora('Downloading files backup...').start();
|
|
124
118
|
let filePath = options.output;
|
|
125
119
|
if (!filePath) {
|
|
126
|
-
filePath =
|
|
120
|
+
filePath = path.join(process.cwd(), backup.fileName);
|
|
127
121
|
}
|
|
128
122
|
try {
|
|
129
|
-
const data = await
|
|
123
|
+
const data = await downloadFile(backup.url, (progress) => {
|
|
130
124
|
downloadSpinner.text = `Downloading files backup... ${progress}%`;
|
|
131
125
|
});
|
|
132
|
-
|
|
126
|
+
fs.writeFileSync(filePath, data);
|
|
133
127
|
downloadSpinner.succeed(`Downloaded to: ${filePath}`);
|
|
134
128
|
}
|
|
135
129
|
catch (error) {
|
|
@@ -138,17 +132,17 @@ exports.filesCommand
|
|
|
138
132
|
}
|
|
139
133
|
// Import if not disabled
|
|
140
134
|
if (options.import !== false) {
|
|
141
|
-
const localEnv =
|
|
135
|
+
const localEnv = detectLocalEnvironment();
|
|
142
136
|
if (!localEnv) {
|
|
143
|
-
console.log(
|
|
137
|
+
console.log(chalk.yellow('\nNo local environment detected (Lando/DDEV).'));
|
|
144
138
|
console.log('Run the following command manually to extract:');
|
|
145
|
-
console.log(
|
|
139
|
+
console.log(chalk.cyan(` tar -xzf ${filePath} -C web/sites/default/files`));
|
|
146
140
|
return;
|
|
147
141
|
}
|
|
148
|
-
console.log(
|
|
149
|
-
const importSpinner = (
|
|
142
|
+
console.log(chalk.cyan(`\nDetected ${localEnv.toUpperCase()} environment.`));
|
|
143
|
+
const importSpinner = ora('Extracting files...').start();
|
|
150
144
|
try {
|
|
151
|
-
await
|
|
145
|
+
await importFiles(filePath, localEnv);
|
|
152
146
|
importSpinner.succeed('Files extracted successfully!');
|
|
153
147
|
}
|
|
154
148
|
catch (error) {
|
|
@@ -156,11 +150,11 @@ exports.filesCommand
|
|
|
156
150
|
throw error;
|
|
157
151
|
}
|
|
158
152
|
}
|
|
159
|
-
console.log(
|
|
153
|
+
console.log(chalk.green('\n✓ Files sync complete!'));
|
|
160
154
|
}
|
|
161
155
|
catch (error) {
|
|
162
156
|
if (error instanceof Error) {
|
|
163
|
-
console.error(
|
|
157
|
+
console.error(chalk.red(`\nError: ${error.message}`));
|
|
164
158
|
}
|
|
165
159
|
process.exit(1);
|
|
166
160
|
}
|
|
@@ -168,7 +162,7 @@ exports.filesCommand
|
|
|
168
162
|
/**
|
|
169
163
|
* List available files backups
|
|
170
164
|
*/
|
|
171
|
-
|
|
165
|
+
filesCommand
|
|
172
166
|
.command('list')
|
|
173
167
|
.description('List available files backups')
|
|
174
168
|
.option('-e, --env <envId>', 'Environment ID')
|
|
@@ -178,25 +172,25 @@ exports.filesCommand
|
|
|
178
172
|
let environmentId = options.env;
|
|
179
173
|
let projectId = options.project;
|
|
180
174
|
// Show which organization we're using
|
|
181
|
-
const tokenConfig =
|
|
175
|
+
const tokenConfig = getToken();
|
|
182
176
|
if (tokenConfig) {
|
|
183
|
-
console.log(
|
|
177
|
+
console.log(chalk.dim(`Organization: ${tokenConfig.organizationName || tokenConfig.organizationId}`));
|
|
184
178
|
}
|
|
185
179
|
// If no environment specified, prompt for selection
|
|
186
180
|
if (!environmentId) {
|
|
187
181
|
// Always prompt for project selection
|
|
188
182
|
if (!projectId) {
|
|
189
|
-
const projects = await
|
|
183
|
+
const projects = await listProjects();
|
|
190
184
|
if (projects.length === 0) {
|
|
191
|
-
console.error(
|
|
185
|
+
console.error(chalk.red('No projects found.'));
|
|
192
186
|
process.exit(1);
|
|
193
187
|
}
|
|
194
188
|
if (projects.length === 1) {
|
|
195
189
|
projectId = projects[0].id;
|
|
196
|
-
console.log(
|
|
190
|
+
console.log(chalk.dim(`Project: ${projects[0].title}`));
|
|
197
191
|
}
|
|
198
192
|
else {
|
|
199
|
-
const { selectedProject } = await
|
|
193
|
+
const { selectedProject } = await inquirer.prompt([
|
|
200
194
|
{
|
|
201
195
|
type: 'list',
|
|
202
196
|
name: 'selectedProject',
|
|
@@ -210,17 +204,17 @@ exports.filesCommand
|
|
|
210
204
|
projectId = selectedProject;
|
|
211
205
|
}
|
|
212
206
|
}
|
|
213
|
-
const environments = await
|
|
207
|
+
const environments = await listEnvironments(projectId);
|
|
214
208
|
if (environments.length === 0) {
|
|
215
|
-
console.error(
|
|
209
|
+
console.error(chalk.red('No environments found.'));
|
|
216
210
|
process.exit(1);
|
|
217
211
|
}
|
|
218
212
|
if (environments.length === 1) {
|
|
219
213
|
environmentId = environments[0].id;
|
|
220
|
-
console.log(
|
|
214
|
+
console.log(chalk.dim(`Environment: ${environments[0].title}`));
|
|
221
215
|
}
|
|
222
216
|
else {
|
|
223
|
-
const { selectedEnv } = await
|
|
217
|
+
const { selectedEnv } = await inquirer.prompt([
|
|
224
218
|
{
|
|
225
219
|
type: 'list',
|
|
226
220
|
name: 'selectedEnv',
|
|
@@ -234,15 +228,15 @@ exports.filesCommand
|
|
|
234
228
|
environmentId = selectedEnv;
|
|
235
229
|
}
|
|
236
230
|
}
|
|
237
|
-
const spinner = (
|
|
231
|
+
const spinner = ora('Fetching backups...').start();
|
|
238
232
|
try {
|
|
239
|
-
const backups = await
|
|
233
|
+
const backups = await listFilesBackups(environmentId);
|
|
240
234
|
spinner.stop();
|
|
241
235
|
if (backups.length === 0) {
|
|
242
|
-
console.log(
|
|
236
|
+
console.log(chalk.yellow('No files backups found.'));
|
|
243
237
|
return;
|
|
244
238
|
}
|
|
245
|
-
console.log(
|
|
239
|
+
console.log(chalk.cyan('\nFiles backups:\n'));
|
|
246
240
|
for (const backup of backups) {
|
|
247
241
|
const date = backup.createdAt
|
|
248
242
|
? new Date(backup.createdAt).toLocaleString()
|
|
@@ -250,7 +244,7 @@ exports.filesCommand
|
|
|
250
244
|
const size = backup.sizeBytes
|
|
251
245
|
? `${(backup.sizeBytes / 1024 / 1024).toFixed(2)} MB`
|
|
252
246
|
: 'Unknown size';
|
|
253
|
-
console.log(` ${
|
|
247
|
+
console.log(` ${chalk.green('•')} ${backup.fileName || backup.id}`);
|
|
254
248
|
console.log(` Created: ${date}`);
|
|
255
249
|
console.log(` Size: ${size}`);
|
|
256
250
|
console.log(` Type: ${backup.type || 'automatic'}`);
|
|
@@ -264,7 +258,7 @@ exports.filesCommand
|
|
|
264
258
|
}
|
|
265
259
|
catch (error) {
|
|
266
260
|
if (error instanceof Error) {
|
|
267
|
-
console.error(
|
|
261
|
+
console.error(chalk.red(`\nError: ${error.message}`));
|
|
268
262
|
}
|
|
269
263
|
process.exit(1);
|
|
270
264
|
}
|