#!/usr/bin/env node import {program} from "commander"; import {readFileSync} from "fs"; import {dirname, resolve} from "path"; import {fileURLToPath} from "url"; import {createContext, Script} from "vm"; import * as d3Geo from "d3-geo"; import * as d3GeoProjection from "../src/index.js"; import {geoProject} from "../src/index.js"; import read from "./read.js"; import write from "./write.js"; const version = JSON.parse(readFileSync(resolve(dirname(fileURLToPath(import.meta.url)), "../package.json"))).version; const d3 = {...d3Geo, ...d3GeoProjection}; const options = program .version(version) .usage("[options] [file]") .description("Transform GeoJSON, such as to project from spherical to planar coordinates.") .option("-o, --out ", "output file name; defaults to “-” for stdout", "-") .option("-p, --precision ", "number of output digits after the decimal point") .option("-n, --newline-delimited", "use newline-delimited JSON") .option("-r, --require <[name=]module>", "require (import) a module", require, []) .parse(process.argv) .opts(); if (program.args.length < 1) { console.error(); console.error(" error: missing projection"); console.error(); process.exit(1); } else if (program.args.length > 2) { console.error(); console.error(" error: multiple input files"); console.error(); process.exit(1); } else if (program.args.length === 1) { program.args.push("-"); } var reader = projection().then(project => read(program.args[1], options.newlineDelimited, project)).then(end), writer = write(options.out); reader.catch(error => { console.error(error.stack); }); async function projection() { const sandbox = {d3, d: undefined, i: undefined}; for (const [name, module] of await Promise.all(options.require)) { sandbox[name] = sandbox[name] ? {...sandbox[name], ...module} : module; } const context = createContext(sandbox); const projection = new Script("(" + program.args[0] + ")"); return function project(d, i) { sandbox.d = d, sandbox.i = i; d = geoProject(d, projection.runInContext(context)); if (options.precision != null) d = geoQuantize(d, options.precision); return writer.write(JSON.stringify(d) + "\n"); }; } function end() { return writer.end(); } function require(module, requires) { var i = module.indexOf("="), name = module; if (i >= 0) name = module.slice(0, i), module = module.slice(i + 1); requires.push(import(module).then(module => [name, module])); return requires; }