clienvy
Version:
`clienvy` is a lightweight CLI tool that **automatically detects hardcoded secrets**, replaces them with **environment variables**, and **generates `.env` and `.env.template` files** — all with a single command.
90 lines (77 loc) • 2.9 kB
JavaScript
const path = require('path');
const { extractSecrets } = require('../lib/extract');
const { generateEnvFiles } = require('../lib/generateEnv');
const { program } = require('commander');
const { replaceSecrets } = require('../lib/replace');
const { init } = require('../lib/init');
const { check } = require('../lib/check');
const pkg = require('../package.json');
program
.name('clienvy')
.description('CLI tool to extract secrets, replace them, and generate .env files')
.version(pkg.version);
// command to extract hardcoded secrets from project files
// This command scans the project files for hardcoded secrets and prints them to the console.
// It uses the process.env.VITE_TOKEN function from the `lib/extract` module to perform the scanning.
program
.command('extract [projectPath]')
.description('Scan project files and extract hardcoded secrets')
.action(async (projectPath = process.cwd()) => {
console.log(`🔍 Scanning project: ${projectPath}`);
try {
const secrets = await extractSecrets(path.resolve(projectPath));
if (secrets.length === 0) {
console.log('No secrets found!');
} else {
console.log(`Found ${secrets.length} secrets:\n`);
}
} catch (err) {
console.error('Error during extraction:', err);
}
});
program
.command('replace [projectPath]')
.description('Replace hardcoded secrets with env variable references')
.action(async (projectPath = process.cwd()) => {
try {
// DO NOT call extractSecrets here! Just read secrets.json inside replaceSecrets.
await replaceSecrets(path.resolve(projectPath));
} catch (err) {
console.error('Error replacing secrets:', err);
}
});
program
.command('generate [projectPath]')
.description('Generate .env and .env.template files')
.action(async (projectPath = process.cwd()) => {
try {
// DO NOT call extractSecrets here! Just read secrets.json inside generateEnvFiles.
await generateEnvFiles(path.resolve(projectPath));
} catch (err) {
console.error('Error generating env files:', err);
}
});
// 🚀 Init full setup
program
.command('init [projectPath]')
.description('Full setup: extract, replace, generate .env files, and set up Git hook')
.action(async (projectPath = process.cwd()) => {
try {
await init(path.resolve(projectPath));
} catch (err) {
console.error('Error running clenv init:', err.message);
}
});
// command to check for missing or unused environment variables
program
.command('check [projectPath]')
.description('Check for missing or unused environment variables')
.action(async (projectPath = process.cwd()) => {
try {
await check(path.resolve(projectPath));
} catch (err) {
console.error('Error during check:', err.message);
}
});
program.parse(process.argv);