@flexsiteio/cli 1.0.1
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/.github/workflows/publish.yml +28 -0
- package/.nvmrc +1 -0
- package/README.md +166 -0
- package/db_727aa8c7-dev_xYhn06gTRFNmPbW3uOVKlQ.sql.gz +0 -0
- package/db_faef57dd-dev_3wnRGEk6KwkI_wgvygWf4g.sql.gz +0 -0
- package/dist/bin/flexsite.d.ts +7 -0
- package/dist/bin/flexsite.d.ts.map +1 -0
- package/dist/bin/flexsite.js +31 -0
- package/dist/bin/flexsite.js.map +1 -0
- package/dist/commands/auth.d.ts +6 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +325 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/config.d.ts +6 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +56 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/db.d.ts +6 -0
- package/dist/commands/db.d.ts.map +1 -0
- package/dist/commands/db.js +274 -0
- package/dist/commands/db.js.map +1 -0
- package/dist/commands/files.d.ts +6 -0
- package/dist/commands/files.d.ts.map +1 -0
- package/dist/commands/files.js +272 -0
- package/dist/commands/files.js.map +1 -0
- package/dist/commands/sync.d.ts +7 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +202 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +47 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +203 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/config.d.ts +54 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +150 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/detector.d.ts +26 -0
- package/dist/lib/detector.d.ts.map +1 -0
- package/dist/lib/detector.js +305 -0
- package/dist/lib/detector.js.map +1 -0
- package/dist/types.d.ts +58 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Sync command for FlexSite CLI.
|
|
4
|
+
* Combines database and files sync in one operation.
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.syncCommand = void 0;
|
|
11
|
+
const commander_1 = require("commander");
|
|
12
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
13
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
14
|
+
const ora_1 = __importDefault(require("ora"));
|
|
15
|
+
const fs_1 = __importDefault(require("fs"));
|
|
16
|
+
const path_1 = __importDefault(require("path"));
|
|
17
|
+
const api_js_1 = require("../lib/api.js");
|
|
18
|
+
const config_js_1 = require("../lib/config.js");
|
|
19
|
+
const detector_js_1 = require("../lib/detector.js");
|
|
20
|
+
exports.syncCommand = new commander_1.Command('sync')
|
|
21
|
+
.description('Sync database and files from remote environment')
|
|
22
|
+
.option('-e, --env <envId>', 'Environment ID')
|
|
23
|
+
.option('-p, --project <projectId>', 'Project ID')
|
|
24
|
+
.option('--db-only', 'Only sync database')
|
|
25
|
+
.option('--files-only', 'Only sync files')
|
|
26
|
+
.option('--no-import', 'Download only, do not import')
|
|
27
|
+
.action(async (options) => {
|
|
28
|
+
try {
|
|
29
|
+
let environmentId = options.env;
|
|
30
|
+
let projectId = options.project;
|
|
31
|
+
// Show which organization we're using
|
|
32
|
+
const tokenConfig = (0, config_js_1.getToken)();
|
|
33
|
+
if (tokenConfig) {
|
|
34
|
+
console.log(chalk_1.default.dim(`Organization: ${tokenConfig.organizationName || tokenConfig.organizationId}`));
|
|
35
|
+
}
|
|
36
|
+
// Detect local environment first
|
|
37
|
+
const localEnv = (0, detector_js_1.detectLocalEnvironment)();
|
|
38
|
+
if (!localEnv) {
|
|
39
|
+
console.log(chalk_1.default.yellow('No local environment detected (Lando/DDEV).'));
|
|
40
|
+
console.log('Please run this command from a project directory with Lando or DDEV configured.');
|
|
41
|
+
console.log('\nAlternatively, use:');
|
|
42
|
+
console.log(chalk_1.default.cyan(' flexsite db pull --no-import'));
|
|
43
|
+
console.log(chalk_1.default.cyan(' flexsite files pull --no-import'));
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
console.log(chalk_1.default.cyan(`\nDetected ${localEnv.toUpperCase()} environment.\n`));
|
|
47
|
+
// If no environment specified, prompt for selection
|
|
48
|
+
if (!environmentId) {
|
|
49
|
+
// Always prompt for project selection (don't use cached values)
|
|
50
|
+
if (!projectId) {
|
|
51
|
+
const projects = await (0, api_js_1.listProjects)();
|
|
52
|
+
if (projects.length === 0) {
|
|
53
|
+
console.error(chalk_1.default.red('No projects found.'));
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
if (projects.length === 1) {
|
|
57
|
+
// Only one project, use it automatically
|
|
58
|
+
projectId = projects[0].id;
|
|
59
|
+
console.log(chalk_1.default.dim(`Project: ${projects[0].title}`));
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
const { selectedProject } = await inquirer_1.default.prompt([
|
|
63
|
+
{
|
|
64
|
+
type: 'list',
|
|
65
|
+
name: 'selectedProject',
|
|
66
|
+
message: 'Select project:',
|
|
67
|
+
choices: projects.map(p => ({
|
|
68
|
+
name: `${p.title} (${p.container || 'unknown'})`,
|
|
69
|
+
value: p.id
|
|
70
|
+
}))
|
|
71
|
+
}
|
|
72
|
+
]);
|
|
73
|
+
projectId = selectedProject;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Get environment - always prompt
|
|
77
|
+
const environments = await (0, api_js_1.listEnvironments)(projectId);
|
|
78
|
+
if (environments.length === 0) {
|
|
79
|
+
console.error(chalk_1.default.red('No environments found for this project.'));
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
if (environments.length === 1) {
|
|
83
|
+
// Only one environment, use it automatically
|
|
84
|
+
environmentId = environments[0].id;
|
|
85
|
+
console.log(chalk_1.default.dim(`Environment: ${environments[0].title}`));
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
const { selectedEnv } = await inquirer_1.default.prompt([
|
|
89
|
+
{
|
|
90
|
+
type: 'list',
|
|
91
|
+
name: 'selectedEnv',
|
|
92
|
+
message: 'Select environment to sync from:',
|
|
93
|
+
choices: environments.map(e => ({
|
|
94
|
+
name: `${e.title} (${e.branch || 'main'}) - ${e.status || 'unknown'}`,
|
|
95
|
+
value: e.id
|
|
96
|
+
}))
|
|
97
|
+
}
|
|
98
|
+
]);
|
|
99
|
+
environmentId = selectedEnv;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const syncDb = !options.filesOnly;
|
|
103
|
+
const syncFiles = !options.dbOnly;
|
|
104
|
+
// Sync database
|
|
105
|
+
if (syncDb) {
|
|
106
|
+
console.log(chalk_1.default.cyan('\n--- Database Sync ---'));
|
|
107
|
+
const dbSpinner = (0, ora_1.default)('Fetching latest database backup...').start();
|
|
108
|
+
try {
|
|
109
|
+
const backup = await (0, api_js_1.getLatestDatabaseBackup)(environmentId);
|
|
110
|
+
if (!backup || !backup.url) {
|
|
111
|
+
dbSpinner.fail('No database backup found');
|
|
112
|
+
console.log(chalk_1.default.yellow(' No database backups available for this environment.'));
|
|
113
|
+
console.log(chalk_1.default.cyan(' Create a backup in the FlexSite dashboard:'));
|
|
114
|
+
console.log(` https://flexsite.io/dashboard/project/${projectId}/environment/${environmentId}/backups`);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
dbSpinner.succeed(`Found backup: ${backup.fileName}`);
|
|
118
|
+
// Download
|
|
119
|
+
const downloadSpinner = (0, ora_1.default)('Downloading database...').start();
|
|
120
|
+
const dbPath = path_1.default.join(process.cwd(), backup.fileName);
|
|
121
|
+
const data = await (0, api_js_1.downloadFile)(backup.url, (progress) => {
|
|
122
|
+
downloadSpinner.text = `Downloading database... ${progress}%`;
|
|
123
|
+
});
|
|
124
|
+
fs_1.default.writeFileSync(dbPath, data);
|
|
125
|
+
downloadSpinner.succeed(`Downloaded to: ${dbPath}`);
|
|
126
|
+
// Import
|
|
127
|
+
if (options.import !== false) {
|
|
128
|
+
const importSpinner = (0, ora_1.default)('Importing database...').start();
|
|
129
|
+
await (0, detector_js_1.importDatabase)(dbPath, localEnv);
|
|
130
|
+
importSpinner.succeed('Database imported successfully!');
|
|
131
|
+
// Clean up downloaded file
|
|
132
|
+
fs_1.default.unlinkSync(dbPath);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
dbSpinner.fail('Database sync failed');
|
|
138
|
+
if (error.message?.includes('No backup') || error.message?.includes('not found')) {
|
|
139
|
+
console.log(chalk_1.default.yellow(' No database backups available for this environment.'));
|
|
140
|
+
console.log(chalk_1.default.cyan(' Create a backup in the FlexSite dashboard:'));
|
|
141
|
+
console.log(` https://flexsite.io/dashboard/project/${projectId}/environment/${environmentId}/backups`);
|
|
142
|
+
}
|
|
143
|
+
else if (error instanceof Error) {
|
|
144
|
+
console.error(chalk_1.default.red(` Error: ${error.message}`));
|
|
145
|
+
}
|
|
146
|
+
// Continue with files sync
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Sync files
|
|
150
|
+
if (syncFiles) {
|
|
151
|
+
console.log(chalk_1.default.cyan('\n--- Files Sync ---'));
|
|
152
|
+
const filesSpinner = (0, ora_1.default)('Fetching latest files backup...').start();
|
|
153
|
+
try {
|
|
154
|
+
const backup = await (0, api_js_1.getLatestFilesBackup)(environmentId);
|
|
155
|
+
if (!backup || !backup.url) {
|
|
156
|
+
filesSpinner.fail('No files backup found');
|
|
157
|
+
console.log(chalk_1.default.yellow(' No files backups available for this environment.'));
|
|
158
|
+
console.log(chalk_1.default.cyan(' Create a backup in the FlexSite dashboard:'));
|
|
159
|
+
console.log(` https://flexsite.io/dashboard/project/${projectId}/environment/${environmentId}/backups`);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
filesSpinner.succeed(`Found backup: ${backup.fileName}`);
|
|
163
|
+
// Download
|
|
164
|
+
const downloadSpinner = (0, ora_1.default)('Downloading files...').start();
|
|
165
|
+
const filesPath = path_1.default.join(process.cwd(), backup.fileName);
|
|
166
|
+
const data = await (0, api_js_1.downloadFile)(backup.url, (progress) => {
|
|
167
|
+
downloadSpinner.text = `Downloading files... ${progress}%`;
|
|
168
|
+
});
|
|
169
|
+
fs_1.default.writeFileSync(filesPath, data);
|
|
170
|
+
downloadSpinner.succeed(`Downloaded to: ${filesPath}`);
|
|
171
|
+
// Import
|
|
172
|
+
if (options.import !== false) {
|
|
173
|
+
const importSpinner = (0, ora_1.default)('Extracting files...').start();
|
|
174
|
+
await (0, detector_js_1.importFiles)(filesPath, localEnv);
|
|
175
|
+
importSpinner.succeed('Files extracted successfully!');
|
|
176
|
+
// Clean up downloaded file
|
|
177
|
+
fs_1.default.unlinkSync(filesPath);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
filesSpinner.fail('Files sync failed');
|
|
183
|
+
if (error.message?.includes('No backup') || error.message?.includes('not found')) {
|
|
184
|
+
console.log(chalk_1.default.yellow(' No files backups available for this environment.'));
|
|
185
|
+
console.log(chalk_1.default.cyan(' Create a backup in the FlexSite dashboard:'));
|
|
186
|
+
console.log(` https://flexsite.io/dashboard/project/${projectId}/environment/${environmentId}/backups`);
|
|
187
|
+
}
|
|
188
|
+
else if (error instanceof Error) {
|
|
189
|
+
console.error(chalk_1.default.red(` Error: ${error.message}`));
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
console.log(chalk_1.default.green('\n✓ Sync complete!'));
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
if (error instanceof Error) {
|
|
197
|
+
console.error(chalk_1.default.red(`\nError: ${error.message}`));
|
|
198
|
+
}
|
|
199
|
+
process.exit(1);
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FlexSite CLI
|
|
3
|
+
*
|
|
4
|
+
* Command-line tool for managing FlexSite projects.
|
|
5
|
+
* Supports database and files sync with Lando and DDEV local environments.
|
|
6
|
+
*/
|
|
7
|
+
export * from './types.js';
|
|
8
|
+
export * from './lib/api.js';
|
|
9
|
+
export * from './lib/config.js';
|
|
10
|
+
export * from './lib/detector.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* FlexSite CLI
|
|
4
|
+
*
|
|
5
|
+
* Command-line tool for managing FlexSite projects.
|
|
6
|
+
* Supports database and files sync with Lando and DDEV local environments.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
20
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
__exportStar(require("./types.js"), exports);
|
|
24
|
+
__exportStar(require("./lib/api.js"), exports);
|
|
25
|
+
__exportStar(require("./lib/config.js"), exports);
|
|
26
|
+
__exportStar(require("./lib/detector.js"), exports);
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;AAEH,6CAA2B;AAC3B,+CAA6B;AAC7B,kDAAgC;AAChC,oDAAkC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API client for FlexSite CLI.
|
|
3
|
+
* Handles all HTTP requests to the FlexSite API.
|
|
4
|
+
*/
|
|
5
|
+
import { type AxiosInstance } from 'axios';
|
|
6
|
+
import type { AuthVerifyResponse, Project, Environment, Backup, BackupDownload, TokenConfig } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Get current token info being used
|
|
9
|
+
*/
|
|
10
|
+
export declare function getCurrentTokenInfo(): TokenConfig | null;
|
|
11
|
+
/**
|
|
12
|
+
* Create an authenticated API client
|
|
13
|
+
*/
|
|
14
|
+
export declare function createApiClient(token?: string): AxiosInstance;
|
|
15
|
+
/**
|
|
16
|
+
* Verify authentication token
|
|
17
|
+
*/
|
|
18
|
+
export declare function verifyAuth(token?: string): Promise<AuthVerifyResponse>;
|
|
19
|
+
/**
|
|
20
|
+
* List projects for the authenticated organization
|
|
21
|
+
*/
|
|
22
|
+
export declare function listProjects(): Promise<Project[]>;
|
|
23
|
+
/**
|
|
24
|
+
* List environments for a project
|
|
25
|
+
*/
|
|
26
|
+
export declare function listEnvironments(projectId: string): Promise<Environment[]>;
|
|
27
|
+
/**
|
|
28
|
+
* Get latest database backup download URL
|
|
29
|
+
*/
|
|
30
|
+
export declare function getLatestDatabaseBackup(environmentId: string): Promise<BackupDownload>;
|
|
31
|
+
/**
|
|
32
|
+
* List database backups for an environment
|
|
33
|
+
*/
|
|
34
|
+
export declare function listDatabaseBackups(environmentId: string): Promise<Backup[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Get latest files backup download URL
|
|
37
|
+
*/
|
|
38
|
+
export declare function getLatestFilesBackup(environmentId: string): Promise<BackupDownload>;
|
|
39
|
+
/**
|
|
40
|
+
* List files backups for an environment
|
|
41
|
+
*/
|
|
42
|
+
export declare function listFilesBackups(environmentId: string): Promise<Backup[]>;
|
|
43
|
+
/**
|
|
44
|
+
* Download a file from a presigned URL
|
|
45
|
+
*/
|
|
46
|
+
export declare function downloadFile(url: string, onProgress?: (progress: number) => void): Promise<Buffer>;
|
|
47
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAc,EAAc,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAE9D,OAAO,KAAK,EACV,kBAAkB,EAClB,OAAO,EACP,WAAW,EACX,MAAM,EACN,cAAc,EACd,WAAW,EACZ,MAAM,aAAa,CAAC;AASrB;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,WAAW,GAAG,IAAI,CAExD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,CAoB7D;AA6CD;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAQ5E;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAQvD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAUhF;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAQ5F;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQlF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAQzF;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQ/E;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GACtC,OAAO,CAAC,MAAM,CAAC,CAiBjB"}
|
package/dist/lib/api.js
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* API client for FlexSite CLI.
|
|
4
|
+
* Handles all HTTP requests to the FlexSite API.
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.getCurrentTokenInfo = getCurrentTokenInfo;
|
|
11
|
+
exports.createApiClient = createApiClient;
|
|
12
|
+
exports.verifyAuth = verifyAuth;
|
|
13
|
+
exports.listProjects = listProjects;
|
|
14
|
+
exports.listEnvironments = listEnvironments;
|
|
15
|
+
exports.getLatestDatabaseBackup = getLatestDatabaseBackup;
|
|
16
|
+
exports.listDatabaseBackups = listDatabaseBackups;
|
|
17
|
+
exports.getLatestFilesBackup = getLatestFilesBackup;
|
|
18
|
+
exports.listFilesBackups = listFilesBackups;
|
|
19
|
+
exports.downloadFile = downloadFile;
|
|
20
|
+
const axios_1 = __importDefault(require("axios"));
|
|
21
|
+
const config_js_1 = require("./config.js");
|
|
22
|
+
// API base URL
|
|
23
|
+
// Note: The custom domain maps root to v1 stage, so no /v1 suffix needed
|
|
24
|
+
const API_BASE_URL = process.env.FLEXSITE_API_URL || 'https://cli-api.flexsite.io';
|
|
25
|
+
// Store current token info for error messages
|
|
26
|
+
let currentTokenInfo = null;
|
|
27
|
+
/**
|
|
28
|
+
* Get current token info being used
|
|
29
|
+
*/
|
|
30
|
+
function getCurrentTokenInfo() {
|
|
31
|
+
return currentTokenInfo;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Create an authenticated API client
|
|
35
|
+
*/
|
|
36
|
+
function createApiClient(token) {
|
|
37
|
+
const tokenConfig = token ? null : (0, config_js_1.getToken)();
|
|
38
|
+
const authToken = token || tokenConfig?.token;
|
|
39
|
+
// Store for error messages
|
|
40
|
+
currentTokenInfo = tokenConfig;
|
|
41
|
+
if (!authToken) {
|
|
42
|
+
throw new Error('No authentication token found. Run "flexsite auth login" first.');
|
|
43
|
+
}
|
|
44
|
+
return axios_1.default.create({
|
|
45
|
+
baseURL: API_BASE_URL,
|
|
46
|
+
timeout: 30000,
|
|
47
|
+
headers: {
|
|
48
|
+
'Authorization': `Bearer ${authToken}`,
|
|
49
|
+
'Content-Type': 'application/json',
|
|
50
|
+
'User-Agent': 'flexsite-cli/1.0.0'
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Handle API errors consistently
|
|
56
|
+
*/
|
|
57
|
+
function handleError(error) {
|
|
58
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
59
|
+
const axiosError = error;
|
|
60
|
+
if (axiosError.response) {
|
|
61
|
+
const status = axiosError.response.status;
|
|
62
|
+
const data = axiosError.response.data;
|
|
63
|
+
const message = data?.error || data?.message || axiosError.message;
|
|
64
|
+
// Get organization info for better error messages
|
|
65
|
+
const orgInfo = currentTokenInfo
|
|
66
|
+
? `(using token for: ${currentTokenInfo.organizationName || currentTokenInfo.organizationId})`
|
|
67
|
+
: '';
|
|
68
|
+
switch (status) {
|
|
69
|
+
case 401:
|
|
70
|
+
throw new Error(`Authentication failed ${orgInfo}.\n` +
|
|
71
|
+
`Your token may have expired or been revoked.\n` +
|
|
72
|
+
`Run "flexsite auth status" to check your tokens, or "flexsite auth login" to add a new one.`);
|
|
73
|
+
case 403:
|
|
74
|
+
throw new Error(`Access denied ${orgInfo}.\n` +
|
|
75
|
+
`Your token may have been revoked or lacks the required permissions.\n` +
|
|
76
|
+
`Run "flexsite auth status" to verify your token is valid.`);
|
|
77
|
+
case 404:
|
|
78
|
+
throw new Error(`Not found: ${message}`);
|
|
79
|
+
default:
|
|
80
|
+
throw new Error(`API error (${status}): ${message}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else if (axiosError.request) {
|
|
84
|
+
throw new Error('Network error: Unable to reach the FlexSite API. Check your internet connection.');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Verify authentication token
|
|
91
|
+
*/
|
|
92
|
+
async function verifyAuth(token) {
|
|
93
|
+
try {
|
|
94
|
+
const client = createApiClient(token);
|
|
95
|
+
const response = await client.get('/cli/auth/verify');
|
|
96
|
+
return response.data;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
handleError(error);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* List projects for the authenticated organization
|
|
104
|
+
*/
|
|
105
|
+
async function listProjects() {
|
|
106
|
+
try {
|
|
107
|
+
const client = createApiClient();
|
|
108
|
+
const response = await client.get('/cli/projects');
|
|
109
|
+
return response.data.projects;
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
handleError(error);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* List environments for a project
|
|
117
|
+
*/
|
|
118
|
+
async function listEnvironments(projectId) {
|
|
119
|
+
try {
|
|
120
|
+
const client = createApiClient();
|
|
121
|
+
const response = await client.get('/cli/environments', {
|
|
122
|
+
params: { projectId }
|
|
123
|
+
});
|
|
124
|
+
return response.data.environments;
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
handleError(error);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get latest database backup download URL
|
|
132
|
+
*/
|
|
133
|
+
async function getLatestDatabaseBackup(environmentId) {
|
|
134
|
+
try {
|
|
135
|
+
const client = createApiClient();
|
|
136
|
+
const response = await client.get(`/cli/environments/${environmentId}/database/latest`);
|
|
137
|
+
return response.data;
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
handleError(error);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* List database backups for an environment
|
|
145
|
+
*/
|
|
146
|
+
async function listDatabaseBackups(environmentId) {
|
|
147
|
+
try {
|
|
148
|
+
const client = createApiClient();
|
|
149
|
+
const response = await client.get(`/cli/environments/${environmentId}/database`);
|
|
150
|
+
return response.data.backups;
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
handleError(error);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get latest files backup download URL
|
|
158
|
+
*/
|
|
159
|
+
async function getLatestFilesBackup(environmentId) {
|
|
160
|
+
try {
|
|
161
|
+
const client = createApiClient();
|
|
162
|
+
const response = await client.get(`/cli/environments/${environmentId}/files/latest`);
|
|
163
|
+
return response.data;
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
handleError(error);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* List files backups for an environment
|
|
171
|
+
*/
|
|
172
|
+
async function listFilesBackups(environmentId) {
|
|
173
|
+
try {
|
|
174
|
+
const client = createApiClient();
|
|
175
|
+
const response = await client.get(`/cli/environments/${environmentId}/files`);
|
|
176
|
+
return response.data.backups;
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
handleError(error);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Download a file from a presigned URL
|
|
184
|
+
*/
|
|
185
|
+
async function downloadFile(url, onProgress) {
|
|
186
|
+
try {
|
|
187
|
+
const response = await axios_1.default.get(url, {
|
|
188
|
+
responseType: 'arraybuffer',
|
|
189
|
+
timeout: 300000, // 5 minutes for large files
|
|
190
|
+
onDownloadProgress: (progressEvent) => {
|
|
191
|
+
if (onProgress && progressEvent.total) {
|
|
192
|
+
const progress = Math.round((progressEvent.loaded * 100) / progressEvent.total);
|
|
193
|
+
onProgress(progress);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
return Buffer.from(response.data);
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
handleError(error);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration management for FlexSite CLI.
|
|
3
|
+
* Stores tokens and preferences in ~/.flexsite/config.json
|
|
4
|
+
*/
|
|
5
|
+
import type { Config, TokenConfig } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Get the entire configuration
|
|
8
|
+
*/
|
|
9
|
+
export declare function getConfig(): Config;
|
|
10
|
+
/**
|
|
11
|
+
* Save a token for an organization
|
|
12
|
+
*/
|
|
13
|
+
export declare function saveToken(orgPrefix: string, tokenConfig: TokenConfig): void;
|
|
14
|
+
/**
|
|
15
|
+
* Get token for an organization (by prefix or full ID)
|
|
16
|
+
*/
|
|
17
|
+
export declare function getToken(orgId?: string): TokenConfig | null;
|
|
18
|
+
/**
|
|
19
|
+
* Remove a token
|
|
20
|
+
*/
|
|
21
|
+
export declare function removeToken(orgId: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Get all stored tokens
|
|
24
|
+
*/
|
|
25
|
+
export declare function getAllTokens(): Record<string, TokenConfig>;
|
|
26
|
+
/**
|
|
27
|
+
* Set default organization
|
|
28
|
+
*/
|
|
29
|
+
export declare function setDefaultOrganization(orgId: string): void;
|
|
30
|
+
/**
|
|
31
|
+
* Set default project
|
|
32
|
+
*/
|
|
33
|
+
export declare function setDefaultProject(projectId: string): void;
|
|
34
|
+
/**
|
|
35
|
+
* Set default environment
|
|
36
|
+
*/
|
|
37
|
+
export declare function setDefaultEnvironment(envId: string): void;
|
|
38
|
+
/**
|
|
39
|
+
* Get defaults
|
|
40
|
+
*/
|
|
41
|
+
export declare function getDefaults(): Config['defaults'];
|
|
42
|
+
/**
|
|
43
|
+
* Clear all configuration
|
|
44
|
+
*/
|
|
45
|
+
export declare function clearConfig(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Clear only defaults (keep tokens)
|
|
48
|
+
*/
|
|
49
|
+
export declare function clearDefaults(): void;
|
|
50
|
+
/**
|
|
51
|
+
* Get the config file path
|
|
52
|
+
*/
|
|
53
|
+
export declare function getConfigPath(): string;
|
|
54
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAevD;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI,CAS3E;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CA+B3D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAoBlD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAE1D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEzD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEzD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAAC,UAAU,CAAC,CAEhD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
|