chainparse

0.1.1 • Public • Published

chainparse

A parser for command line programs with chained commands (in the vein of mapshaper and imagemagick).

Install with npm install chainparse.

Example

# At command line or bash script...

node program.js \
    -i counties.json cities.json combine-files \
    -dissolve state_fips name=states target=counties \
    -o topo.json format=topojson
// program.js

var program = require('chainparse')

program
    .command('i', 'Input files', { flags: ['combine-files'] })
    .command('dissolve', 'Dissolve borders', { keys: ['name', 'target'] })
    .command('o', 'Output files', { keys: ['format'] })
    .parse(process.argv);

// this is true
commands == [
    { command: 'i', _: ['counties.json', 'cities.json'], 'combine-files': true },
    { command: 'dissolve', _: ['state_fips'], name: 'states', target: 'counties' },
    { command: 'o', _: ['topo.json'], format: 'topojson' }
];

API Reference

Note that the reference below is out-of-date and doesn't reflect the current API. This will be updated once the API has stablized a bit more.

This module is a single function that parses an array of arguments, most likely those passed from the command line and stored in process.argv.

var parse = require('chainparse'),
    commands = parse(process.argv);

parse(argv[, options])

Parse an array of arguments, argv. Returns an array of "command" objects.

The parser identifies commands as strings prefixed by a hyphen. A command can be followed by a series of options. Options can either be singular strings or key-value pairs. Key-value pairs are separated by an equals sign with no spaces between values.

For example,

// node program.js \
//     -input input.csv format=csv \
//     -filter 'year > 1995' 'value < 100' \
//     -output output.tsv format=tsv

process.argv == [
    ...,
    '-input', 'input.csv', 'format=csv',
    '-filter', 'year > 1995', 'value < 100',
    '-output', 'output.tsv', 'format=tsv',
];  // true

var parse = require('chainparse'),
    command = parse(process.argv);

command == [
    { command: 'input', _: ['input.csv'], format: 'csv' },
    { command: 'filter', _: ['year > 1995', 'value < 100'] },
    { command: 'output', _: ['output.csv'], format: 'tsv' }
];  // true

Note that the order of commands and command options is preserved.

The first two elements of argv are ignored. Typically you'll be passing process.argv for which the first two elements will be 'path/to/node' and 'path/to/script.js'.

The second argument, options, is an object which lets you customize how arguments are parsed.

var options = {
    commandPrefix: '-',  // String that prefixes a command
    keyValueSep: '='     // String that separates key-values options
    isKeyValue: function(command, key, value) { return true; }
    isFlag: function(command, arg) { return true; }
}

Say you prefer double-hyphen commands and colon key-value separators:

// node program.js --input file.csv format:csv
process.argv == [..., '--input', 'file.csv', 'format:csv'];  // true

var options = { commandPrefix: '--', keyValueSep: ':' },
    commands = parse(argv, options);

commands == [{ command: 'input', _: ['file.csv'], format: 'csv' }];  // true

Package Sidebar

Install

npm i chainparse

Weekly Downloads

3

Version

0.1.1

License

MIT

Last publish

Collaborators

  • armollica