extract.js 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. const fs = require('fs');
  2. const path = require('path');
  3. // Konfiguracja ścieżek
  4. const TARGET_DIR = path.join(__dirname, 'BoatDelivery');
  5. const OUTPUT_FILE = path.join(__dirname, 'boatdelivery_all_code.txt');
  6. // Filtry - czego NIE dołączać do zrzutu
  7. const IGNORE_DIRS = new Set(['node_modules', 'vendor', 'dist', 'build', '.git', '.idea', '.vscode', 'public']);
  8. const IGNORE_FILES = new Set(['package-lock.json', 'composer.lock', 'yarn.lock', 'pnpm-lock.yaml']);
  9. const IGNORE_EXTENSIONS = new Set([
  10. '.jpg', '.jpeg', '.png', '.gif', '.svg', '.ico', '.webp',
  11. '.mp4', '.webm', '.pdf', '.zip', '.tar', '.gz',
  12. '.woff', '.woff2', '.ttf', '.eot'
  13. ]);
  14. function isBinary(content) {
  15. // Prosta heurystyka sprawdzająca obecność znaków null (typowych dla binarek) w pierwszych bajtach
  16. for (let i = 0; i < Math.min(content.length, 512); i++) {
  17. if (content[i] === 0) return true;
  18. }
  19. return false;
  20. }
  21. function processDirectory(directory, writeStream) {
  22. let entries;
  23. try {
  24. entries = fs.readdirSync(directory, { withFileTypes: true });
  25. } catch (err) {
  26. console.error(`Błąd odczytu katalogu ${directory}:`, err.message);
  27. return;
  28. }
  29. for (const entry of entries) {
  30. const fullPath = path.join(directory, entry.name);
  31. if (entry.isDirectory()) {
  32. if (!IGNORE_DIRS.has(entry.name)) {
  33. processDirectory(fullPath, writeStream);
  34. }
  35. } else if (entry.isFile()) {
  36. const ext = path.extname(entry.name).toLowerCase();
  37. if (IGNORE_FILES.has(entry.name) || IGNORE_EXTENSIONS.has(ext)) {
  38. continue;
  39. }
  40. try {
  41. const buffer = fs.readFileSync(fullPath);
  42. // Ochrona przed zrzutem niezidentyfikowanych plików binarnych
  43. if (isBinary(buffer)) {
  44. continue;
  45. }
  46. const content = buffer.toString('utf-8');
  47. // Separator z wyraźną ścieżką relatywną
  48. const relativePath = path.relative(__dirname, fullPath);
  49. writeStream.write(`\n\n${'='.repeat(80)}\n`);
  50. writeStream.write(`FILE: ${relativePath}\n`);
  51. writeStream.write(`${'='.repeat(80)}\n\n`);
  52. writeStream.write(content);
  53. } catch (err) {
  54. console.error(`Błąd odczytu pliku ${fullPath}:`, err.message);
  55. }
  56. }
  57. }
  58. }
  59. function main() {
  60. if (!fs.existsSync(TARGET_DIR)) {
  61. console.error(`Katalog źródłowy nie istnieje: ${TARGET_DIR}`);
  62. process.exit(1);
  63. }
  64. // Czyszczenie poprzedniego pliku wynikowego
  65. if (fs.existsSync(OUTPUT_FILE)) {
  66. fs.unlinkSync(OUTPUT_FILE);
  67. }
  68. const writeStream = fs.createWriteStream(OUTPUT_FILE, { flags: 'a' });
  69. console.log('Rozpoczęto ekstrakcję kodu...');
  70. processDirectory(TARGET_DIR, writeStream);
  71. writeStream.end();
  72. writeStream.on('finish', () => {
  73. const stats = fs.statSync(OUTPUT_FILE);
  74. const fileSizeInMegabytes = (stats.size / (1024 * 1024)).toFixed(2);
  75. console.log(`Zakończono. Plik wyjściowy: ${OUTPUT_FILE} (${fileSizeInMegabytes} MB)`);
  76. });
  77. }
  78. main();