import { execSync } from 'child_process'; import { resolve } from 'path'; import { fileURLToPath } from 'url'; import { dirname } from 'path'; import process from 'process'; import { createInterface } from 'readline'; const __dirname = dirname(fileURLToPath(import.meta.url)); const ROOT = resolve(__dirname, '..'); // colors const G = (s) => `\x1b[0;32m${s}\x1b[0m`; const Y = (s) => `\x1b[1;33m${s}\x1b[0m`; const R = (s) => `\x1b[0;31m${s}\x1b[0m`; const log = (msg) => console.log(`${G('[OK]')} ${msg}`); const warn = (msg) => console.warn(`${Y('[WARN]')} ${msg}`); const err = (msg) => console.error(`${R('[ERR]')} ${msg}`); // ── defaults ── const NAMESPACE = process.env.NAMESPACE || 'app'; const RELEASE = process.env.RELEASE || 'deploy'; const CONFIG_MAP = process.env.CONFIG_MAP || 'app-env'; const PVC_NAME = process.env.PVC_NAME || 'shared-data'; // ── confirm ── function confirm(msg) { const rl = createInterface({ input: process.stdin, output: process.stdout }); return new Promise((resolve) => { rl.question(msg, (answer) => { rl.close(); resolve(answer); }); }); } console.log(''); warn(`This will remove Helm release '${RELEASE}' from namespace '${NAMESPACE}'.`); warn('The following resources are PROTECTED and will NOT be deleted:'); warn(` - Namespace: ${NAMESPACE}`); warn(` - ConfigMap: ${CONFIG_MAP}`); warn(` - PVC: ${PVC_NAME}`); console.log(''); const answer = await confirm('Continue? [y/N] '); if (answer !== 'y' && answer !== 'Y') { log('Cancelled'); process.exit(0); } // ── uninstall ── log(`Uninstalling Helm release ${RELEASE}...`); execSync(`helm uninstall "${RELEASE}" --namespace "${NAMESPACE}"`, { stdio: 'inherit' }); log('Helm release uninstalled'); // ── verify protected ── function exists(cmd) { try { execSync(cmd, { stdio: 'pipe' }); return true; } catch { return false; } } log('Verifying protected resources still exist...'); if (exists(`kubectl get namespace "${NAMESPACE}"`)) { log(`Namespace '${NAMESPACE}' preserved`); } else { err(`Namespace '${NAMESPACE}' was deleted!`); } if (exists(`kubectl get configmap "${CONFIG_MAP}" -n "${NAMESPACE}"`)) { log(`ConfigMap '${CONFIG_MAP}' preserved`); } else { err(`ConfigMap '${CONFIG_MAP}' was deleted!`); } if (exists(`kubectl get pvc "${PVC_NAME}" -n "${NAMESPACE}"`)) { log(`PVC '${PVC_NAME}' preserved`); } else { err(`PVC '${PVC_NAME}' was deleted!`); } log(`Uninstall complete — remaining resources in namespace ${NAMESPACE}:`); execSync(`kubectl get all,pvc,configmap,ingress -n "${NAMESPACE}"`, { stdio: 'inherit' });