1. const fs = require('fs');
  2. const path = require('path');
  3. const { program } = require('commander');
  4. /**
  5. * Backs up request headers for hypothesis validation.
  6. * @param {object} options - Configuration options.
  7. */
  8. function backupRequestHeaders(options) {
  9. const {
  10. sourceDirectory,
  11. backupDirectory,
  12. includeSpecificHeaders,
  13. excludeSpecificHeaders,
  14. format = 'json' // Default format
  15. } = options;
  16. if (!sourceDirectory || !backupDirectory) {
  17. console.error('Error: Source and backup directories are required.');
  18. process.exit(1);
  19. }
  20. // Ensure directories exist
  21. if (!fs.existsSync(sourceDirectory)) {
  22. console.error(`Error: Source directory "${sourceDirectory}" does not exist.`);
  23. process.exit(1);
  24. }
  25. if (!fs.existsSync(backupDirectory)) {
  26. fs.mkdirSync(backupDirectory, { recursive: true }); // create if doesn't exist
  27. }
  28. const files = fs.readdirSync(sourceDirectory);
  29. for (const file of files) {
  30. const filePath = path.join(sourceDirectory, file);
  31. if (fs.statSync(filePath).isFile()) {
  32. try {
  33. let headers = {};
  34. const headerData = fs.readFileSync(filePath, 'utf8');
  35. // Parse headers based on format
  36. if (format === 'json') {
  37. const parsedHeaders = JSON.parse(headerData);
  38. headers = parsedHeaders;
  39. } else if (format === 'text') {
  40. const headerLines = headerData.split('\n');
  41. for (const line of headerLines) {
  42. if (line.includes(':')) {
  43. const [key, value] = line.split(':').map(s => s.trim());
  44. headers[key] = value;
  45. }
  46. }
  47. } else {
  48. console.error(`Error: Unsupported format "${format}".`);
  49. continue;
  50. }
  51. // Apply filtering
  52. if (includeSpecificHeaders) {
  53. headers = Object.fromEntries(
  54. Object.entries(headers).filter(([key]) => includeSpecificHeaders.includes(key))
  55. );
  56. }
  57. if (excludeSpecificHeaders) {
  58. Object.keys(headers) = Object.keys(headers).filter(key => !excludeSpecificHeaders.includes(key));
  59. }
  60. const backupFilePath = path.join(backupDirectory, `${file}.backup`);
  61. fs.writeFileSync(backupFilePath, JSON.stringify(headers, null, 2), 'utf8'); // JSON format
  62. console.log(`Backed up ${file} to ${backupFilePath}`);
  63. } catch (err) {
  64. console.error(`Error processing file ${file}:`, err);
  65. }
  66. }
  67. }
  68. }
  69. // Command-line interface using Commander
  70. program
  71. .version('1.0.0')
  72. .description('Backs up request headers for hypothesis validation.')
  73. .requiredOption('-s, --source <directory>', 'The source directory containing header files.')
  74. .requiredOption('-b, --backup <directory>', 'The backup directory.')
  75. .option('-i, --include <headers...>', 'Specific headers to include (space-separated).')
  76. .option('-e, --exclude <headers...>', 'Specific headers to exclude (space-separated).')
  77. .option('-f, --format <format>', 'The format of the header files (json or text). Defaults to json.', 'json')
  78. .action((args) => {
  79. backupRequestHeaders(args);
  80. });
  81. program.parse(process.argv);

Add your comment