holidays-jp-gen
Version:
A CLI tool to generate lightweight TypeScript holiday data modules for Japan based on official government CSV data.
55 lines (54 loc) • 2.12 kB
JavaScript
import fs from "node:fs";
import https from "node:https";
import path from "node:path";
import { fileURLToPath } from "node:url";
import { parse } from "csv-parse/sync";
import iconv from "iconv-lite";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const HOLIDAY_CSV_URL = "https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv";
export async function downloadCsv() {
return new Promise((resolve, reject) => {
https.get(HOLIDAY_CSV_URL, (res) => {
const chunks = [];
res.on("data", (chunk) => chunks.push(chunk));
res.on("end", () => resolve(Buffer.concat(chunks)));
res.on("error", reject);
});
});
}
export function parseCsv(buffer) {
const utf8Str = iconv.decode(buffer, "Shift_JIS");
const records = parse(utf8Str, {
columns: true,
skip_empty_lines: true,
});
return records.map((r) => ({
date: r.国民の祝日・休日月日,
name: r.国民の祝日・休日名称,
}));
}
export function generateTs(holidays, fromYear) {
const holidays_str = filterAndFormat(holidays, fromYear)
.map((v) => ` ${v}`)
.join("\n");
// テンプレートファイルを読み込み
const templatePath = path.join(__dirname, "templates", "functions.ts");
const templateCode = fs.readFileSync(templatePath, "utf-8");
// 空のholidaysオブジェクトを実データで置換
const generatedCode = templateCode.replace("export const holidays: { [key: string]: string } = {};", `export const holidays: { [key: string]: string } = {\n${holidays_str}\n};`);
return `// holidays-jp-from-${fromYear}.ts\n${generatedCode}`;
}
export function filterAndFormat(holidays, fromYear) {
return holidays
.filter((h) => {
const y = Number(h.date.split("/")[0]);
return y >= fromYear;
})
.map((h) => {
const [y, m, d] = h.date.split("/");
const mm = m.padStart(2, "0");
const dd = d.padStart(2, "0");
return `"${y}-${mm}-${dd}": "${h.name}",`;
});
}