UNPKG

todofordevs

Version:

CLI for TodoForDevs - A simple task management tool for developers

207 lines (206 loc) 7.7 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.listProjects = listProjects; exports.selectProject = selectProject; exports.showCurrentProject = showCurrentProject; exports.getActiveProjectId = getActiveProjectId; const inquirer_1 = __importDefault(require("inquirer")); const api_1 = require("./api"); // Added post const config_1 = require("../config"); const output = __importStar(require("./output")); const auth_1 = require("./auth"); /** * List all projects accessible to the authenticated user */ async function listProjects() { if (!(0, auth_1.requireAuth)()) return []; try { output.info('Fetching projects...'); // Get the response from the API const response = await (0, api_1.get)(api_1.endpoints.projects.list()); // Handle both possible response formats let projects = []; if (Array.isArray(response)) { // If the response is already an array, use it directly projects = response; } else if (response && typeof response === 'object') { // If the response is an object, check if it has a projects property if (Array.isArray(response.projects)) { projects = response.projects; } else { // If no projects property or it's not an array, try to convert the object to an array const possibleProjects = Object.values(response).find((val) => Array.isArray(val)); if (possibleProjects) { projects = possibleProjects; } } } if (projects.length === 0) { output.info('No projects found.'); return []; } // Display projects in a table const table = output.createTable(['ID', 'Name', 'Owner', 'Last Updated']); projects.forEach((project) => { table.push([ output.truncate(project.id, 20), output.truncate(project.name, 30), output.truncate(project.ownerEmail || project.ownerId, 25), output.formatDate(project.updatedAt), ]); }); console.log(table.toString()); return projects; } catch (error) { output.error('Failed to fetch projects.'); console.error(error); return []; } } /** * Select a project to set as active */ async function selectProject() { if (!(0, auth_1.requireAuth)()) return; try { // Fetch projects const response = await (0, api_1.get)(api_1.endpoints.projects.list()); // Handle both possible response formats let projects = []; if (Array.isArray(response)) { // If the response is already an array, use it directly projects = response; } else if (response && typeof response === 'object') { // If the response is an object, check if it has a projects property if (Array.isArray(response.projects)) { projects = response.projects; } else { // If no projects property or it's not an array, try to convert the object to an array const possibleProjects = Object.values(response).find((val) => Array.isArray(val)); if (possibleProjects) { projects = possibleProjects; } } } if (projects.length === 0) { output.info('No projects found to select from.'); return; } // Prompt user to select a project const { selectedId } = await inquirer_1.default.prompt([ { type: 'list', name: 'selectedId', message: 'Select a project to set as active:', choices: projects.map((project) => ({ name: `${project.name} (${output.truncate(project.id, 10)})`, value: project.id, short: project.name, })), }, ]); // Find the selected project const selectedProject = projects.find((p) => p.id === selectedId); if (selectedProject) { // Set as active project (0, config_1.setActiveProject)(selectedProject.id, selectedProject.name); output.success(`Project '${selectedProject.name}' (ID: ${selectedProject.id}) is now active.`); } else { output.error('Failed to set active project. Invalid selection.'); } } catch (error) { output.error('Failed to select project.'); console.error(error); } } /** * Display the currently active project */ function showCurrentProject() { if (!(0, auth_1.requireAuth)()) return; const activeProject = (0, config_1.getActiveProject)(); if (activeProject) { output.success(`Current active project: '${activeProject.name}' (ID: ${activeProject.id}).`); } else { output.info("No active project selected. Use 'todo project select'."); } } /** * Get the active project ID, prompting to select one if none is set * Returns undefined if no project is selected or if the user cancels */ async function getActiveProjectId(projectIdOverride) { // If a project ID override is provided, use it if (projectIdOverride) { return projectIdOverride; } // Check if there's an active project const activeProject = (0, config_1.getActiveProject)(); if (activeProject) { return activeProject.id; } // No active project, prompt to select one output.info('No active project set.'); // Ask if the user wants to select a project now const { selectNow } = await inquirer_1.default.prompt([ { type: 'confirm', name: 'selectNow', message: 'Would you like to select a project now?', default: true, }, ]); if (selectNow) { await selectProject(); const newActiveProject = (0, config_1.getActiveProject)(); return newActiveProject?.id; } return undefined; }