unified-args
Interface for creating CLIs around unified processors.
Wrapper around the engine to configure it with command-line
arguments. Should be require
d and configured in an executable script,
on its own, as it handles the whole process.
Installation
npm:
npm install unified-args
Usage
This example creates a CLI for remark, loading
remark-
plugins, searching for markdown files, and loading
configuration and ignore files.
cli
(executable: chmod +x cli
):
#!/usr/bin/env node
'use strict';
var start = require('unified-args');
var extensions = require('markdown-extensions');
var remark = require('remark');
var pack = require('remark/package.json');
var name = pack.name;
start({
'processor': remark,
'name': name,
'description': pack.description,
'version': pack.version,
'pluginPrefix': name,
'extensions': extensions,
'packageField': name + 'Config',
'rcName': '.' + name + 'rc',
'ignoreName': '.' + name + 'ignore'
});
Table of Contents
API
start(configuration)
Create a CLI for a unified processor.
configuration
All options are required.
processor
(Processor
)
— Processor to transform files
(engine: processor
).name
(string
)
— Name of executable.description
(string
)
— Description of executable.version
(string
)
— Version of executable.extensions
(Array.<string>
)
— Default file extensions to include.
(engine: extensions
).ignoreName
(string
)
— Name of ignore files to load.
(engine: ignoreName
).rcName
(string
)
— Name of configuration files to load.
(engine: rcName
).packageField
(string
)
— Property at which configuration can be found in
package.json
files.
(engine: packageField
).pluginPrefix
(string
)
— Prefix to use when searching for plug-ins
(engine: pluginPrefix
);presetPrefix
(string
)
— Prefix to use when searching for presets from config files
(engine: presetPrefix
).
CLI
CLIs created with unified-args, such as the example above,
creates an interface similar to the below (run cli --help
for accurate
information):
Usage: remark [options] [path | glob ...]
Markdown processor powered by plugins
Options:
-h --help output usage information
-v --version output version number
-o --output [path] specify output location
-r --rc-path <path> specify configuration file
-i --ignore-path <path> specify ignore file
-s --setting <settings> specify settings
-e --ext <extensions> specify extensions
-u --use <plugins> use plugins
-p --preset <presets> use presets
-w --watch watch for changes and reprocess
-q --quiet output only warnings and errors
-S --silent output only errors
-f --frail exit with 1 on warnings
-t --tree specify input and output as syntax tree
--file-path <path> specify path to process as
--tree-in specify input as syntax tree
--tree-out output syntax tree
--[no-]stdout specify writing to stdout (on by default)
--[no-]color specify color in report (on by default)
--[no-]config search for configuration files (on by default)
--[no-]ignore search for ignore files (on by default)
Examples:
# Process `input.md`
$ remark input.md -o output.md
# Pipe
$ remark < input.md > output.md
# Rewrite all applicable files
$ remark . -o
All non-options are seen as input and can be:
- Paths (
cli README.txt
) and globs (cli *.txt
) pointing
to files to load. - Paths (
cli test
) and globs (cli fixtures/{in,out}
) pointing to
directories. These are searched for files with known extensions
which are not ignored by patterns in ignore files.
The default behaviour is to exclude files in node_modules
and hidden directories (those starting with a dot: .
).
- Default: none;
- Engine:
globs
.
--help
cli --help
Output short usage information.
--version
cli --version
Output version number.
--output [path]
cli . --output
cli . --output doc
cli input.txt --output doc/output.text
Whether to write successfully processed files, and where to. Can be
set from configuration files.
- If output is not given, files are not written to the file-system;
- If output is given without
path
, input files are overwritten when
successful; - If output is given with
path
and it points to an existing directory,
files are written to that directory; - If output is given with
path
, the parent directory of that path
exists, and one file is processed, the file is written to the given
path.
- Default: off;
- Alias:
-o
; - Engine:
output
.
--rc-path <path>
cli . --rc-path config.json
File-path to a JSON configuration file to load, regardless
of --config
.
Note: Be careful not to pass a file which is also detected.
Note: Do not pass package.json
files or .js
files.
- Default: none;
- Alias:
-r
; - Engine:
rcPath
.
--ignore-path <path>
cli . --ignore-path .gitignore
File-path to an ignore file to load, regardless of
--ignore
.
--setting <settings>
cli input.txt --setting alpha:true
cli input.txt --setting bravo:true --setting '"charlie": "delta"'
cli input.txt --setting echo-foxtrot:-2
cli input.txt --setting 'golf: false, hotel-india: ["juliet", 1]'
Configuration for the parser and compiler of the processor. Can be set
from configuration files.
The given settings are JSON, with two exceptions:
- Surrounding braces must not be used:
"foo": 1, "bar": "baz"
is valid; - Keys do not need to be quoted: both
"foo": "bar"
and
foo: "bar"
are considered equal.
Keys are camel-cased: foo-bar: true
and fooBar: true
are treated
the same.
- Default: none;
- Alias:
-s
; - Engine:
settings
.
--use <plugin>
cli input.txt --use man
cli input.txt --use 'lint=alpha:"bravo"'
Plug-in to load by its name or path, optionally with options, and use
on every processed file. Can be set from configuration files.
To pass options, follow the plugin by an equals sign (=
) and settings,
which have the same in syntax as --setting <settings>
.
Prefers plug-ins prefixed with the configured pluginPrefix
.
- Default: none;
- Alias:
-u
; - Engine:
plugins
.
--preset <presets>
cli input.txt --preset lint-recommended
cli input.txt --preset 'minify=force:true'
Preset to load by its name or path, optionally with options. Can be set
from configuration files.
To pass options, follow the plugin by an equals sign (=
) and settings,
which have the same in syntax as --setting <settings>
.
Prefers presets prefixed with the configured presetPrefix
.
- Default: none;
- Alias:
-p
; - Engine:
presets
.
--ext <extensions>
cli . --ext html
cli . --ext html,htm
Specify one or more extensions to include when searching for files.
If no extensions are given, uses the configured extensions
.
--watch
cli . -w
Process as normal, then watch found files and reprocess when they change.
The watch is stopped when SIGINT
is received (usually done by pressing
CTRL-C
).
If --output
is given without path
it is not honoured,
to prevent an infinite loop. When the watch closes, a final process
runs including --output
.
cli . -oqw
Yields:
Watching... (press CTRL+C to exit)
Note: Ignoring `--output` until exit.
--tree
cli --tree < input.json > output.json
Treat input as a syntax tree in JSON and output the transformed syntax
tree. This runs neither the parsing nor the compilation
phase.
- Default: off;
- Alias:
-t
; - Engine:
tree
.
--tree-in
cli --tree-in < input.json > input.txt
Treat input as a syntax tree in JSON. This does not run the parsing
phase.
--tree-out
cli --tree-out < input.txt > output.json
Output the transformed syntax tree. This does not run the compilation
phase.
--quiet
cli input.txt --quiet
Ignore files without any messages in the report. The default behaviour
is to show a success message.
- Default: off;
- Alias:
-q
; - Engine:
quiet
.
--silent
cli input.txt --silent
Show only fatal errors in the report. Turns --quiet
on.
- Default: off;
- Alias:
-S
; - Engine:
silent
.
--frail
cli input.txt --frail
Exit with a status code of 1
if warnings or errors occur. The default
behaviour is to exit with 1
on errors.
- Default: off;
- Alias:
-f
; - Engine:
frail
.
--file-path <path>
cli --file-path input.txt < input.txt > doc/output.txt
File path to process the given file on stdin(4) as, if any.
--stdout
cli input.txt --no-stdout
Whether to write a processed file to stdout(4).
- Default: off if
--output
or --watch
are given,
or if multiple files are processed; - Engine:
out
.
--color
cli input.txt --no-color
Whether to output ANSI codes in the report.
--config
cli input.txt --no-config
Whether to load configuration files.
Searches for files with the configured rcName
($rcName
and $rcName.js
) and looks for the configured
packageField
in package.json
files.
--ignore
cli . --no-ignore
Whether to load ignore files.
Searches for files with named ignoreName
.
Diagnostics
CLIs created with unified-args exit with:
1
on fatal errors;1
on warnings in --frail
mode;0
on success.
Debugging
CLIs can be debugged by setting the DEBUG
environment
variable to *
, such as DEBUG="*" cli example.txt
.
License
MIT © Titus Wormer