1 stable release
new 2.3.0 | Feb 8, 2025 |
---|
#1241 in Web programming
108 downloads per month
25KB
527 lines
jsq
jsq is a tool for evaluating a JavaScript function and printing the result.
Help
Evaluate a JavaScript function and print the result
Usage: jsq [OPTIONS] [BODY]
Arguments:
[BODY] The body of the JavaScript function to be evaluated [default: $]
Options:
-j, --json-in Parse input as JSON
-y, --yaml-in Parse input as YAML
-t, --toml-in Parse input as TOML
-J, --json-out Print output as JSON
-Y, --yaml-out Print output as YAML
-T, --toml-out Print output as TOML
-h, --help Print help
-V, --version Print version
Input is avaialable in BODY as $. Environment variables are available in BODY prefixed by $.
Example
Suppose we have some JSON which contains a bunch of superheros and we want to find the hero with the power of "Immortality":
> curl https://mdn.github.io/learning-area/javascript/oojs/json/superheroes.json |
jsq -jJ '$.members.find(m => m.powers.includes("Immortality"))'
{
"name": "Eternal Flame",
"age": 1000000,
"secretIdentity": "Unknown",
"powers": [
"Immortality",
"Heat Immunity",
"Inferno",
"Teleportation",
"Interdimensional travel"
]
}
Semantics
The provided BODY
is evaluated by Boa as part of the expression (() => BODY)()
. In
particular, this means that BODY
must have the syntax of an Arrow Function body: it can either
be a single expression, or multiple statements enclosed in braces with an explicit return
.
$
contains the result of reading STDIN as text, or of parsing it as JSON if the -j
flag is set,
YAML if the -y
flag is set, or TOML if the -t
flag is set. If STDIN is a terminal then $
is the empty string.
The result is printed to STDOUT after being cast to a string, or serialized as JSON if the -J
flag is set, YAML if the -Y
flag is set, or TOML if the -T
flag is set.
Environment variables are available in BODY
prefixed by $
. e.g. USER
is available as $USER
.
Why?
JavaScript is a convenient language with which to process JSON (which stands for "JavaScript Object Notation" after all), but the boilerplate of reading from STDIN, parsing, and writing to STDOUT makes many could-be "one-liners" significantly more involved than they need to be. jsq provides a thin wrapper around Boa which handles this boilerplate and makes it more ergonomic to sprinkle a little JavaScript in to a shell script.
jsq can be used for many of the same tasks as jq. A given jq command is often a little shorter than the equivalent jsq command, but if (like the author) you find yourself often forgetting the syntax of jq, and you already know JavaScript, you might find jsq easier to use. To see how jsq compares to jq, check out the translated jq tutorial.
Built-in functions
As well as the usual built-in functions provided by the engine, the following are available:
YAML.parse
– likeJSON.parse
but for YAMLYAML.stringify
– likeJSON.stringify
but for YAMLTOML.parse
– likeJSON.parse
but for TOMLTOML.stringify
– likeJSON.stringify
but for TOML
Install
With brew:
brew install callum-oakley/tap/jsq
With cargo:
cargo install jsq
Alternatively, there are binaries for Linux, MacOS, and Windows attached to each release.
Dependencies
~18–26MB
~413K SLoC