1. #!/usr/bin/env node
  2. const { program } = require('commander');
  3. const fs = require('fs');
  4. const { spawn } = require('child_process');
  5. program
  6. .version('1.0.0')
  7. .description('Streams DOM element data for CLI exploration.');
  8. program
  9. .command('stream <selector>')
  10. .description('Streams data for elements matching the selector.')
  11. .option('-n, --lines <n>', 'Number of lines to stream', '10')
  12. .action((selector, options) => {
  13. const lines = parseInt(options.lines, 10);
  14. if (isNaN(lines) || lines <= 0) {
  15. console.error('Invalid number of lines. Must be a positive integer.');
  16. process.exit(1);
  17. }
  18. const command = `puppeteer-playwright --headless --timeout 30000 --selector "${selector}" --limit ${lines} --output json`; // Using puppeteer-playwright for robust DOM traversal
  19. console.log(`Executing: ${command}`);
  20. const process = spawn(command, { shell: true });
  21. let data = '';
  22. process.stdout.on('data', (chunk) => {
  23. data += chunk.toString();
  24. });
  25. process.stderr.on('data', (chunk) => {
  26. console.error(`stderr: ${chunk}`);
  27. });
  28. process.on('close', (code) => {
  29. if (code === 0) {
  30. try {
  31. const parsedData = JSON.parse(data);
  32. console.log(JSON.stringify(parsedData, null, 2)); // Pretty print JSON
  33. } catch (error) {
  34. console.error('Error parsing JSON:', error);
  35. console.error('Raw output: ', data);
  36. }
  37. } else {
  38. console.error(`Command exited with code ${code}`);
  39. }
  40. });
  41. });
  42. program.parse(process.argv);

Add your comment