source.fact.ngo a coherence.ngo project

scripts/gis.js

raw ↗ · AGPL-3.0

#!/usr/bin/env node // gis.js — thin Node wrapper: shared GIS core + local storage. import fs from "node:fs"; import path from "node:path"; import { DATA_ROOT, nowIso, parseArgs, readJsonl } from "./lib.js"; import { buildGis } from "../pipeline/aggregate-core.js"; const { args } = parseArgs(process.argv.slice(2), { date: { takes: "value", default: null } }); const date = args.date || new Date().toISOString().slice(0, 10); const essFile = path.join(DATA_ROOT, "distilled", date, "essence.jsonl"); const eventsFile = path.join(DATA_ROOT, "aggregates", date, "events.json"); const essences = readJsonl(essFile); if (!essences.length) { console.log(`gis ${date}: no essence records, skipping`); process.exit(0); } const events = fs.existsSync(eventsFile) ? JSON.parse(fs.readFileSync(eventsFile, "utf8")).events : null; const gis = buildGis({ essences, events }); fs.mkdirSync(path.join(DATA_ROOT, "aggregates", date), { recursive: true }); fs.writeFileSync(path.join(DATA_ROOT, "aggregates", date, "gis.json"), JSON.stringify({ date, generated_at: nowIso(), ...gis, }, null, 1) + "\n"); console.log(`gis ${date}: ${gis.countries.length} countries, ${gis.countries.reduce((n, c) => n + c.count, 0)} placements${gis.eventPlacements ? `, ${gis.eventPlacements} event placements` : ""}`);