From ca8537af0ab596fddd8d72e6630f278326ef5360 Mon Sep 17 00:00:00 2001 From: Leo Goetz Date: Sun, 24 May 2026 06:50:57 +0200 Subject: feat: added fix functionality --- src/actions/checkDependencies.ts | 80 ++++++---------------------------------- src/actions/fixDependencies.ts | 21 +++++++++++ src/actions/sendEmail.ts | 8 ++-- 3 files changed, 38 insertions(+), 71 deletions(-) create mode 100644 src/actions/fixDependencies.ts (limited to 'src/actions') diff --git a/src/actions/checkDependencies.ts b/src/actions/checkDependencies.ts index 4234bf9..999733e 100644 --- a/src/actions/checkDependencies.ts +++ b/src/actions/checkDependencies.ts @@ -1,77 +1,21 @@ -import fs from "fs/promises"; -import ora, { type Ora } from "ora"; -import type { Config, Project } from "../types.js"; +import ora from "ora"; +import type { Config } from "../types.js"; import { getConfig } from "../utils/config.js"; -import { exec, type ExecException } from "child_process"; +import { getProjectAudits, goThroughProjects } from "../lib/project.js"; export async function checkDependencies() { - const spinner = ora("Getting all Project Data").start(); - const config: Config = await getConfig(); - let projectAudits: PromiseSettledResult[]; - let projects: Promise[] = []; - - try { - const entries = await fs.readdir(config.path, { withFileTypes: true }); - - for (let entry of entries) { - if (!entry.isDirectory()) { - continue; - } - - let dirFullPath = `${config.path}${entry.name}`; - const projectDir = await fs.readdir(dirFullPath); - - if (projectDir.includes("package.json")) { - let auditPromise = getAuditPromise(dirFullPath, entry.name, spinner); - projects.push(auditPromise); - } - } - - projectAudits = await Promise.allSettled(projects); - - spinner.succeed("Got the Data successfully"); - return projectAudits; - } catch (error) { - spinner.fail("Ups and Error :("); - throw error; - } -} - -async function getAuditPromise( - path: string, - dirname: string, - spinner: Ora, -): Promise { - await pullLatest(path, spinner); - - spinner.text = "getting audit"; - - let { stdout } = await promiseExec(`cd "${path}" && npm audit --json`); + let spinnerProjects = ora("Getting all projects").start(); + let projects = await goThroughProjects(config); + spinnerProjects.succeed("Got all projects"); - let output = JSON.parse(stdout); - let project: Project = { projectName: dirname, ...output }; - if (project.error) { - throw new Error( - `${dirname} could not be audited, maybe package lock is corrupted`, - ); - } + let spinnerAudit = ora("Getting all audits").start(); + let projectAudits = await getProjectAudits(projects); - return project; -} - -async function pullLatest(path: string, spinner: Ora) { - spinner.text = "pulling latest"; - await promiseExec(`cd "${path}" && git pull`); -} + spinnerAudit.text = "Resolving audits"; + let audit = await Promise.allSettled(projectAudits); + spinnerAudit.succeed("Successfully resolved audits"); -function promiseExec( - cmd: string, -): Promise<{ error: ExecException | null; stdout: string; stderr: string }> { - return new Promise((resolve, _) => { - exec(cmd, (error, stdout, stderr) => { - resolve({ error, stdout, stderr }); - }); - }); + return audit; } diff --git a/src/actions/fixDependencies.ts b/src/actions/fixDependencies.ts new file mode 100644 index 0000000..9dfb6c6 --- /dev/null +++ b/src/actions/fixDependencies.ts @@ -0,0 +1,21 @@ +import ora from "ora"; +import type { Config } from "../types.js"; +import { getConfig } from "../utils/config.js"; +import { getProjectFixes, goThroughProjects } from "../lib/project.js"; + +export async function fixDependencies(force: boolean) { + const config: Config = await getConfig(); + + let spinnerProjects = ora("Getting all projects").start(); + let projects = await goThroughProjects(config); + spinnerProjects.succeed("Got all projects"); + + let spinnerFixes = ora("Getting all fixes").start(); + let projectFixes = await getProjectFixes(projects, force); + + spinnerFixes.text = "Resolving fixes"; + let fixes = await Promise.allSettled(projectFixes); + spinnerFixes.succeed("Successfully resolved fixes"); + + return fixes; +} diff --git a/src/actions/sendEmail.ts b/src/actions/sendEmail.ts index 4509a8e..62c527f 100644 --- a/src/actions/sendEmail.ts +++ b/src/actions/sendEmail.ts @@ -1,11 +1,11 @@ import nodemailer from "nodemailer"; import { emailConfig } from "../utils/email.js"; -import type { Project } from "../types.js"; +import type { ProjectAudit } from "../types.js"; const transporter = nodemailer.createTransport(emailConfig); export const sendAuditEmail = async ( - projects: PromiseSettledResult[], + projects: PromiseSettledResult[], ) => { const text = emailContent(projects); const email = await transporter.sendMail({ @@ -18,7 +18,9 @@ export const sendAuditEmail = async ( return email; }; -const emailContent = (projects: PromiseSettledResult[]): string => { +const emailContent = ( + projects: PromiseSettledResult[], +): string => { return `Here is your Report: ${projects.map((project) => { if (project.status === "fulfilled") { -- cgit v1.3.1