namastejs
Version:
A spiritual greeting from your JavaScript code. Because every function deserves a 'Namaste ๐'
117 lines (100 loc) โข 3.35 kB
JavaScript
const readline = require("readline");
const { encode, decode } = require("./vaultCrypto");
const { readVault, writeVault } = require("./vaultStorage");
function prompt(question) {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
return new Promise((resolve) =>
rl.question(question, (answer) => {
rl.close();
resolve(answer.trim());
})
);
}
async function vaultCLI(command, keyArg) {
const vault = readVault();
switch (command) {
case "add": {
const key = await prompt("๐ Service name (e.g., github): ");
const username = await prompt("๐ค Username: ");
const password = await prompt(
"๐ Password (leave blank to auto-generate): "
);
const pwd =
password ||
Math.random().toString(36).slice(-12) +
Date.now().toString(36).slice(-4);
if (vault[key]) {
const confirm = await prompt(
`โ ๏ธ '${key}' already exists. Overwrite? (yes/no): `
);
if (confirm.toLowerCase() !== "yes") {
console.log("โ Cancelled.");
return;
}
}
vault[key] = {
username,
password: encode(pwd),
};
writeVault(vault);
console.log(`โ
Saved: ${key}`);
break;
}
case "get": {
const key = keyArg || (await prompt("๐ Service name: "));
if (!vault[key]) return console.log("โ Not found.");
const { username, password } = vault[key];
console.log(`\n๐ค Username: ${username}`);
console.log(`๐ Password: ${decode(password)}\n`);
break;
}
case "list": {
const keys = Object.keys(vault);
if (!keys.length) return console.log("๐ญ Vault is empty.");
console.log("๐ Stored services:\n");
keys.forEach((key) => console.log("โข", key));
console.log();
break;
}
case "delete": {
const key = keyArg || (await prompt("๐ Service to delete: "));
if (!vault[key]) return console.log("โ Not found.");
const confirm = await prompt(
`โ ๏ธ Are you sure you want to delete '${key}'? (yes/no): `
);
if (confirm.toLowerCase() === "yes") {
delete vault[key];
writeVault(vault);
console.log(`โ
'${key}' deleted.`);
} else {
console.log("โ Cancelled.");
}
break;
}
case "clear": {
const confirm1 = await prompt(
"โ ๏ธ This will erase everything. Type 'confirm': "
);
const confirm2 = await prompt("โ ๏ธ Are you really sure? Type 'yes': ");
if (confirm1 === "confirm" && confirm2 === "yes") {
writeVault({});
console.log("๐งจ Vault cleared.");
} else {
console.log("โ Cancelled.");
}
break;
}
default:
console.log("๐ Commands:");
console.log("add โ Add new credential");
console.log("get KEY โ Show credential for a service");
console.log("list โ List all saved services");
console.log("delete KEY โ Remove a service");
console.log("clear โ Wipe entire vault\n");
break;
}
}
module.exports = { vaultCLI };