UNPKG

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
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}",`; }); }