@labnex/cli
Version:
CLI for Labnex, an AI-Powered Testing Automation Platform
168 lines ⢠7.32 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.projectsCommand = void 0;
const commander_1 = require("commander");
const inquirer_1 = __importDefault(require("inquirer"));
const chalk_1 = __importDefault(require("chalk"));
const ora_1 = __importDefault(require("ora"));
const cli_table3_1 = __importDefault(require("cli-table3"));
const client_1 = require("../api/client");
exports.projectsCommand = new commander_1.Command('projects')
.description('Manage your Labnex projects (list, create, view details).')
.alias('project')
.addCommand(new commander_1.Command('list')
.description('List all your available Labnex projects.')
.option('--format <format>', 'Output format (table, json)', 'table')
.action(async (options) => {
try {
const spinner = (0, ora_1.default)('Fetching projects...').start();
const response = await client_1.apiClient.getProjects();
if (response.success) {
spinner.succeed(`Found ${response.data.length} projects`);
console.log(JSON.stringify(response.data, null, 2));
}
else {
spinner.fail(chalk_1.default.red('Failed to fetch projects'));
}
}
catch (error) {
console.error(chalk_1.default.red('Error:'), error.message);
}
}))
.addCommand(new commander_1.Command('create')
.description('Create a new Labnex project with a name, code, and description.')
.option('-n, --name <name>', 'Project name')
.option('-c, --code <code>', 'Project code (3-5 chars)')
.option('-d, --description <description>', 'Project description')
.action(async (options) => {
try {
let { name, code, description } = options;
// Interactive prompts if options not provided
if (!name || !code) {
const prompts = [];
if (!name) {
prompts.push({
type: 'input',
name: 'name',
message: 'Project name:',
validate: (input) => input.length > 0 || 'Name is required'
});
}
if (!code) {
prompts.push({
type: 'input',
name: 'code',
message: 'Project code (3-5 chars):',
validate: (input) => {
if (input.length < 3 || input.length > 5) {
return 'Code must be 3-5 characters';
}
if (!/^[A-Z0-9]+$/i.test(input)) {
return 'Code must be alphanumeric';
}
return true;
},
filter: (input) => input.toUpperCase()
});
}
if (!description) {
prompts.push({
type: 'input',
name: 'description',
message: 'Description (optional):'
});
}
if (prompts.length > 0) {
const answers = await inquirer_1.default.prompt(prompts);
name = name || answers.name;
code = code || answers.code;
description = description || answers.description;
}
}
const spinner = (0, ora_1.default)('Creating project...').start();
try {
const response = await client_1.apiClient.createProject({
name,
projectCode: code.toUpperCase(),
description
});
if (response.success) {
spinner.succeed(chalk_1.default.green('Project created successfully'));
console.log(chalk_1.default.gray(`ID: ${response.data._id}`));
console.log(chalk_1.default.gray(`Code: ${response.data.projectCode}`));
}
else {
spinner.fail(chalk_1.default.red('Failed to create project: ' + response.error));
}
}
catch (error) {
spinner.fail(chalk_1.default.red('Creation failed: ' + error.message));
}
}
catch (error) {
console.error(chalk_1.default.red('Error:'), error.message);
}
}))
.addCommand(new commander_1.Command('show')
.description('Display detailed information about a specific Labnex project.')
.argument('<code>', 'Project code of the project to show')
.action(async (code) => {
try {
const spinner = (0, ora_1.default)('Fetching project details...').start();
try {
// Get all projects and find by code
const response = await client_1.apiClient.getProjects();
const project = response.data.find(p => p.projectCode === code.toUpperCase());
if (!project) {
spinner.fail(chalk_1.default.red(`Project not found: ${code}`));
return;
}
const detailResponse = await client_1.apiClient.getProject(project._id);
if (detailResponse.success) {
spinner.succeed('Project details retrieved');
displayProjectDetails(detailResponse.data);
}
else {
spinner.fail(chalk_1.default.red('Failed to get project details'));
}
}
catch (error) {
spinner.fail(chalk_1.default.red('Failed to fetch project: ' + error.message));
}
}
catch (error) {
console.error(chalk_1.default.red('Error:'), error.message);
}
}));
function displayProjectDetails(project) {
console.log(chalk_1.default.cyan(`\nš ${project.name} (${project.projectCode})`));
console.log(chalk_1.default.gray('ā'.repeat(50)));
console.log(`${chalk_1.default.bold('Description:')} ${project.description || 'No description'}`);
console.log(`${chalk_1.default.bold('Status:')} ${project.isActive ? chalk_1.default.green('Active') : chalk_1.default.gray('Inactive')}`);
console.log(`${chalk_1.default.bold('Owner:')} ${project.owner.name} (${project.owner.email})`);
console.log(`${chalk_1.default.bold('Created:')} ${new Date(project.createdAt).toLocaleDateString()}`);
console.log(`${chalk_1.default.bold('Updated:')} ${new Date(project.updatedAt).toLocaleDateString()}`);
console.log(`\n${chalk_1.default.bold('Statistics:')}`);
console.log(` Test Cases: ${chalk_1.default.cyan(project.testCaseCount)}`);
console.log(` Tasks: ${chalk_1.default.cyan(project.taskCount)}`);
console.log(` Team Members: ${chalk_1.default.cyan(project.members.length)}`);
if (project.members.length > 0) {
console.log(`\n${chalk_1.default.bold('Team Members:')}`);
const membersTable = new cli_table3_1.default({
head: ['Name', 'Email', 'Role'],
colWidths: [20, 30, 15]
});
project.members.forEach((member) => {
membersTable.push([
member.name,
member.email,
member.role
]);
});
console.log(membersTable.toString());
}
}
//# sourceMappingURL=projects.js.map