const fs = require('fs');
const path = require('path');
const { program } = require('commander');
/**
* Backs up request headers for hypothesis validation.
* @param {object} options - Configuration options.
*/
function backupRequestHeaders(options) {
const {
sourceDirectory,
backupDirectory,
includeSpecificHeaders,
excludeSpecificHeaders,
format = 'json' // Default format
} = options;
if (!sourceDirectory || !backupDirectory) {
console.error('Error: Source and backup directories are required.');
process.exit(1);
}
// Ensure directories exist
if (!fs.existsSync(sourceDirectory)) {
console.error(`Error: Source directory "${sourceDirectory}" does not exist.`);
process.exit(1);
}
if (!fs.existsSync(backupDirectory)) {
fs.mkdirSync(backupDirectory, { recursive: true }); // create if doesn't exist
}
const files = fs.readdirSync(sourceDirectory);
for (const file of files) {
const filePath = path.join(sourceDirectory, file);
if (fs.statSync(filePath).isFile()) {
try {
let headers = {};
const headerData = fs.readFileSync(filePath, 'utf8');
// Parse headers based on format
if (format === 'json') {
const parsedHeaders = JSON.parse(headerData);
headers = parsedHeaders;
} else if (format === 'text') {
const headerLines = headerData.split('\n');
for (const line of headerLines) {
if (line.includes(':')) {
const [key, value] = line.split(':').map(s => s.trim());
headers[key] = value;
}
}
} else {
console.error(`Error: Unsupported format "${format}".`);
continue;
}
// Apply filtering
if (includeSpecificHeaders) {
headers = Object.fromEntries(
Object.entries(headers).filter(([key]) => includeSpecificHeaders.includes(key))
);
}
if (excludeSpecificHeaders) {
Object.keys(headers) = Object.keys(headers).filter(key => !excludeSpecificHeaders.includes(key));
}
const backupFilePath = path.join(backupDirectory, `${file}.backup`);
fs.writeFileSync(backupFilePath, JSON.stringify(headers, null, 2), 'utf8'); // JSON format
console.log(`Backed up ${file} to ${backupFilePath}`);
} catch (err) {
console.error(`Error processing file ${file}:`, err);
}
}
}
}
// Command-line interface using Commander
program
.version('1.0.0')
.description('Backs up request headers for hypothesis validation.')
.requiredOption('-s, --source <directory>', 'The source directory containing header files.')
.requiredOption('-b, --backup <directory>', 'The backup directory.')
.option('-i, --include <headers...>', 'Specific headers to include (space-separated).')
.option('-e, --exclude <headers...>', 'Specific headers to exclude (space-separated).')
.option('-f, --format <format>', 'The format of the header files (json or text). Defaults to json.', 'json')
.action((args) => {
backupRequestHeaders(args);
});
program.parse(process.argv);
Add your comment