UNPKG

projecthor

Version:

Save, manage, and run project setup commands automatically from the CLI.

171 lines (170 loc) 6.18 kB
import React from 'react'; import { ProjectProvider } from './context/ProjectContext.js'; import SaveInterface from './SaveInterface/SaveInterface.js'; import fs from 'fs'; import chalk from 'chalk'; import { warning } from './feedback/warnings.js'; import { parseProjectSetupFile } from './parser.js'; import { isValidProject } from './validation.js'; import { error, printError } from './feedback/errors.js'; import { deleteProject, existProjectFolder, getDefaultFolder, getProjects, isExistingProject, saveProject, setDefaultFolder, } from './db.js'; import { render } from 'ink'; import Projects from './Projects.js'; import path from 'path'; import { execa } from 'execa'; import readline from 'readline'; import { feedback } from './feedback/feedbacks.js'; import { ask } from './utils.js'; export async function saveCommand(projectSetupFile) { if (projectSetupFile) { if (!fs.existsSync(projectSetupFile)) { warning.noSetupFileExists(projectSetupFile); } else if (!projectSetupFile.endsWith('.psup')) { warning.wrongExtension(); } else { try { const projects = await parseProjectSetupFile(projectSetupFile); projects.forEach(project => { const { isValid, errorMessage } = isValidProject(project); if (!isValid) { printError(errorMessage); } else { saveProject(project); feedback.projectSaved(project); } }); } catch (err) { console.log(err); } } } else { render(React.createElement(ProjectProvider, null, React.createElement(SaveInterface, null))); } } export function listCommand(projects, fullFlag) { if (projects.length === 0) { feedback.noProjectPresent(); } else if (fullFlag) { console.log(projects); } else { render(React.createElement(Projects, { projects: projects })); } } export function setdfCommand(args) { if (args.length === 0) { warning.noDefaultFolderPassed(); return; } else { const defaultFolderPath = args[0]; if (!fs.existsSync(path.resolve(defaultFolderPath))) { error.folderNotExists(defaultFolderPath); } else { setDefaultFolder(defaultFolderPath); } } } export function getdfCommand() { const defaultFolder = getDefaultFolder(); if (!defaultFolder) { feedback.noDefaultFolderPreset(); } else { console.log(`default folder: ${chalk.blue.bold(defaultFolder)}`); } } export function loadCommand(projectNames, shellFlag) { // check if project name has been passed if (projectNames.length === 0) warning.noProjectPassed(); else { projectNames.forEach(async (projectName) => { // check if the passed project exist if (!isExistingProject(projectName)) { warning.projectNotFound(projectName); } else if (!existProjectFolder(projectName)) { error.projectFolderNotExists(projectName); } else { feedback.loadingProject(projectName); const project = getProjects().find(project => project.name === projectName); // using '!' because project must exist because of 'isExistingProject()' check before try { for (let command of project.setupCommands) { feedback.runningCommand(command); const { stdout, stderr } = shellFlag ? await execa({ cwd: project.folder, shell: shellFlag }) `${command}` : await execa({ cwd: project.folder }) `${command}`; if (stdout) console.log(stdout); if (stderr) console.error(stderr); } feedback.projectLoadedSuccess(project.name); } catch (err) { if (err?.command) { error.wrongCommand(err.command); } else { error.unknownError(); } } } }); } } export async function purgeCommand() { const projects = getProjects(); if (projects.length === 0) { feedback.noProjectPresent(); } else { const answer = await ask('Are you sure you wanna purge the db? (y/n)'); if (answer.toLowerCase() === 'y') { projects.forEach(project => { if (!fs.existsSync(project.folder)) { deleteProject(project); } }); } } } export async function deleteCommand(projectNames) { const projects = getProjects(); if (projectNames.length === 0) warning.noProjectPassed(); else { projectNames.forEach(async (projectName) => { // check if the passed project exist if (!isExistingProject(projectName)) { warning.projectNotFound(projectName); } else { const project = projects.find(p => p.name === projectName); // using '!' because project must exist because of 'isExistingProject()' check before const answer = await new Promise(resolve => { const prompt = readline.createInterface({ input: process.stdin, output: process.stdout, }); prompt.question(`Do you want to delete '${chalk.blue.bold(projectName)}'? (y/n) `, ans => { prompt.close(); resolve(ans); }); }); if (answer.toLowerCase() === 'y') { deleteProject(project); } } }); } }