magnus-cli
Version:
Command line tool to pull and push source code files from a Rock RMS server
87 lines (76 loc) • 2.66 kB
text/typescript
import fs from 'fs/promises';
import ora, { Ora } from 'ora';
import path from 'path';
import { getFileContent, listFiles } from '../utils/api.js';
import { isAuthenticated } from '../utils/config.js';
import { getCurrentDirectory } from './cd.js';
async function pullEndpoint(pullPath: string, spinner: Ora): Promise<void> {
const items = await listFiles(pullPath);
for (const item of items) {
if (item.IsFolder) {
const endpointName = item.DisplayName.toLocaleLowerCase()
.replace(/\s+/g, '-')
.replace(/\[|\]/g, '');
const files = await listFiles(item.Uri);
for (const file of files) {
const extension = path.extname(file.Uri);
const fileName = `${endpointName}${extension}`;
await pullFile(file.Uri, spinner, fileName);
}
}
}
}
export async function pullPath(pullPath: string): Promise<void> {
if (!isAuthenticated()) {
throw new Error('Not authenticated. Run "magnus config" first.');
}
if (!pullPath) {
pullPath = await getCurrentDirectory();
}
const spinner = ora(`Pulling ${pullPath}...`).start();
if (pullPath.startsWith('/lavaapplication/application-endpoints/')) {
await pullEndpoint(pullPath, spinner);
} else {
const items = await listFiles(pullPath);
for (const item of items) {
if (item.IsFolder) {
console.log(`Folder pull is not supported yet: ${item.DisplayName}`);
} else {
await pullFile(item.Uri, spinner);
}
}
}
}
/**
* Pull a file from Rock RMS and save it locally
* @param {string} serverFilePath - Path to the file on the server
* @param {Ora} spinner - Ora spinner
* @param {string | undefined} outputPath - Local path to save the file (optional)
* @returns {Promise<void>}
*/
export async function pullFile(
serverFilePath: string,
spinner: Ora,
outputPath?: string
): Promise<void> {
if (!isAuthenticated()) {
throw new Error('Not authenticated. Run "magnus config" first.');
}
try {
// Get file content from server
const content = await getFileContent(serverFilePath);
// Determine output path
const finalOutputPath = outputPath || path.basename(serverFilePath);
// Create directory if it doesn't exist
const directory = path.dirname(finalOutputPath);
if (directory !== '.') {
await fs.mkdir(directory, { recursive: true });
}
// Write file
await fs.writeFile(finalOutputPath, content);
spinner.succeed(`File pulled successfully to ${finalOutputPath}`);
} catch (error) {
spinner.fail(`Failed to pull file: ${error instanceof Error ? error.message : String(error)}`);
throw error;
}
}