topoquantize 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #!/usr/bin/env node
  2. var fs = require("fs"),
  3. commander = require("commander"),
  4. topojson = require("../");
  5. commander
  6. .version(require("../package.json").version)
  7. .usage("[options] <n> [file]")
  8. .description("Quantizes TopoJSON.")
  9. .option("-o, --out <file>", "output topology file name; defaults to “-” for stdout", "-")
  10. .parse(process.argv);
  11. if (commander.args.length < 1) {
  12. console.error();
  13. console.error(" error: missing quantization parameter n");
  14. console.error();
  15. process.exit(1);
  16. } else if (commander.args.length > 2) {
  17. console.error();
  18. console.error(" error: multiple input files");
  19. console.error();
  20. process.exit(1);
  21. } else if (commander.args.length === 1) {
  22. commander.args.push("-");
  23. }
  24. if (!(Math.floor(commander.args[0]) >= 2)) {
  25. console.error();
  26. console.error(" error: invalid quantization parameter " + commander.args[0]);
  27. console.error();
  28. process.exit(1);
  29. }
  30. read(commander.args[1]).then(quantize).then(write(commander.out)).catch(abort);
  31. function read(file) {
  32. return new Promise(function(resolve, reject) {
  33. var data = [], stream = file === "-" ? process.stdin : fs.createReadStream(file);
  34. stream
  35. .on("data", function(d) { data.push(d); })
  36. .on("end", function() { resolve(JSON.parse(Buffer.concat(data))); })
  37. .on("error", reject);
  38. });
  39. }
  40. function quantize(topology) {
  41. return topojson.quantize(topology, +commander.args[0]);
  42. }
  43. function write(file) {
  44. var stream = (file === "-" ? process.stdout : fs.createWriteStream(file)).on("error", handleEpipe);
  45. return function(topology) {
  46. return new Promise(function(resolve, reject) {
  47. stream.on("error", reject)[stream === process.stdout ? "write" : "end"](JSON.stringify(topology) + "\n", function(error) {
  48. if (error) reject(error);
  49. else resolve();
  50. });
  51. });
  52. };
  53. }
  54. function handleEpipe(error) {
  55. if (error.code === "EPIPE" || error.errno === "EPIPE") {
  56. process.exit(0);
  57. }
  58. }
  59. function abort(error) {
  60. console.error();
  61. console.error(" error: " + error.message);
  62. console.error();
  63. process.exit(1);
  64. }