scripts/gis.js
#!/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` : ""}`);