Node.jsで複数のJSONファイルを1つにまとめたい

バージョン情報

$ node -v
v16.15.1

起こったこと

特定のディレクトリ内にある複数のJSONファイルをを1つにしたいという要望が出た。

JSONファイルの名前をKeyにして、中身をvalueとしてを持つような単純なものである。

hogehoge.json

{
  "name": "aiueo"
}

piyopiyo.json

{
  "weight": 60
}

まとめた後のjson

{
  "hogehoge": {
    "name": "aiueo"
  },
  "piyopiyo": {
    "weight": 60
  }
}

つくったもの

大した理由ではないがTypeScriptではなくNode.jsで書くことにした。

// merge_json.js
const path = require("path");
const fs = require("fs");

const printUsage = () => {
  console.log("Usage: node merge_json.js <path_to_jsons_dir>");
  process.exit(1);
};

if (process.argv.length < 3) {
  printUsage();
}

const dir = process.argv[2];
const target = path.resolve(process.cwd(), dir);
const mergedJson = {};

const removeExtension = (filename) => {
  return filename.replace(/\.json/, "");
};

fs.readdirSync(target).forEach(fileName => {
  if (!/\.json$/.test(fileName)) return;
  const json = fs.readFileSync(path.resolve(target, fileName), { encoding: "utf-8" });
  const key = removeExtension(fileName);
  mergedJson[key] = JSON.parse(json);
});

fs.writeFileSync(process.cwd() + "/merged.json", JSON.stringify(mergedJson, null, 2), { encoding: "utf-8" });

ターミナルからnode merge_json DIR_PATHと入力すればマージされたJSONmerged.jsonという名前で出力される。