core/steps/remote.step.ts

core/steps/remote.step.ts is a file in Bane's Lab Deploy. 31 lines of code and 6 definitions.

import type { Journal, Shell } from "#types/deployment.types";
import {
    PATH_SEPARATOR,
    REMOTE_ROOT,
    REMOTE_SITE,
    REMOTE_STAGING,
} from "#configuration/constants/deployment.constants";
import { ROOT_CLEAN, ROOT_PRUNED, ROOT_PRUNING, STALE_REMOVED } from "#configuration/strings/deployment.strings";

const OWNED = [REMOTE_SITE, REMOTE_STAGING].map((path) => path.slice(path.lastIndexOf(PATH_SEPARATOR) + 1));

const listStale = async function listStale(shell: Shell): Promise<string[]> {
    const guards = OWNED.map((name) => `! -name ${name}`).join(" ");
    const result = await shell.run(`find ${REMOTE_ROOT} -mindepth 1 -maxdepth 1 ${guards}`);
    return result.stdout
        .split("\n")
        .map((line) => line.trim())
        .filter((line) => line.length > 0);
};

export const pruneRemoteRoot = async function pruneRemoteRoot(shell: Shell, journal: Journal): Promise<string[]> {
    journal.log(ROOT_PRUNING);
    const stale = await listStale(shell);
    if (stale.length === 0) {
        journal.mark(ROOT_CLEAN);
        return stale;
    }
    await shell.run(`rm -rf ${stale.join(" ")}`);
    for (const path of stale) {
        journal.log(STALE_REMOVED + path);
    }
    journal.mark(ROOT_PRUNED);
    return stale;
};