javascript で関数の行を取得する

const fs = require('fs');

// ファイルパスをコマンドライン引数から取得
//const filePath = process.argv[2];
const filePath = 'input.js';

if (!filePath) {
    console.error('ファイルパスが指定されていません。');
    process.exit(1);
}

// ファイル読み込み
fs.readFile(filePath, 'utf-8', (err, data) => {
    if (err) {
        console.error('ファイルの読み込み中にエラーが発生しました。', err);
        process.exit(1);
    }

    // 関数の正規表現
    const functionRegex = /function\s+(\w+)\s*\([^)]*\)\s*{[^}]*}/g;

    // マッチした結果をCSV形式で出力
    let match;
    let foundFunctions = false;

    while ((match = functionRegex.exec(data)) !== null) {
        foundFunctions = true;
        console.log(`${filePath}, ${match[1]}, ${getLineNumber(data, match.index)}, ${getLineNumber(data, match.index + match[0].length)}`);
    }

    if (!foundFunctions) {
        console.log(`${filePath}, (global), 1, ${getLineNumber(data, data.length)}`);
    }
});

// 行番号を取得するヘルパー関数
function getLineNumber(text, index) {
    return text.substring(0, index).split('\n').length;
}

for each => for

const fs = require('fs');

// ファイルパスをコマンドライン引数から取得
//const filePath = process.argv[2];
const filePath = 'input.js';

if (!filePath) {
  console.error('ファイルパスが指定されていません。');
  process.exit(1);
}

// ファイル読み込み
fs.readFile(filePath, 'utf-8', (err, data) => {
  if (err) {
    console.error('ファイルの読み込み中にエラーが発生しました。', err);
    process.exit(1);
  }

  // for each の正規表現
  //  const forEachRegex = /for each\s*\(\s*var\s+(\$\$\d+)\s+in\s+(\$\$\d+)\s*\)\s*\{/g;
  const forEachRegex = /for each\s*\(\s*var\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\s+in\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\s*\)(\s*)\{/g;

  // マッチした結果をES5形式に変換c
  const transformedCode = data.replace(forEachRegex, function (match, $$1, $$2, $$3) {
    const replacement = `for (var ${$$2}_key_ in ${$$2})${$$3}\{\nvar ${$$1} = ${$$2}[${$$2}_key_];`;
    return replacement;
  });

  // 変換結果を出力
  console.log(transformedCode);
});