You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
Go to file
Anton Medvedev d86b06c609
Update README.md
6 years ago
.gitignore Add standalone binary dist 7 years ago
.travis.yml ci: test Node.js 8, 10 and 11 (#26) 6 years ago
LICENSE Create LICENSE 7 years ago
README.md Update README.md 6 years ago
fx.js Limit expand all 6 years ago
index.js Add interactive mode 6 years ago
package.json Release 3.0.3 6 years ago
test.js Add dot feature 6 years ago

README.md

fx

fx example

* Function eXecution

Build Status

Command-line JSON processing tool

Features

  • Don't need to learn new syntax
  • Plain JavaScript
  • Formatting and highlighting
  • Standalone binary
  • Interactive mode 🎉

Install

$ npm install -g fx

Or download standalone binary from releases page.

Usage

Pipe into fx any JSON and anonymous function for reducing it.

$ echo '{...}' | fx [code ...]

Start interactive mode without passing any arguments:

$ curl ... | fx

Anonymous function

Use an anonymous function as reducer which gets JSON and processes it:

$ echo '{"foo": [{"bar": "value"}]}' | fx 'x => x.foo[0].bar'
value

Binding

If you don't pass anonymous function param => ..., code will be automatically transformed into anonymous function. And you can get access to JSON by this keyword:

$ echo '{"foo": [{"bar": "value"}]}' | fx 'this.foo[0].bar'
value

Dot

It is possible to omit this keyword:

$ echo '{"foo": [{"bar": "value"}]}' | fx .foo[0].bar
value

If single dot is passed, JSON will be processed without modification:

$ echo '{"foo": "bar"}' | fx .
{
  "foo": "bar"
}

Chain

You can pass any number of anonymous functions for reducing JSON:

$ echo '{"foo": [{"bar": "value"}]}' | fx 'x => x.foo' 'this[0]' 'this.bar'
value

Generator

If passed code contains yield keyword, generator expression will be used:

$ curl ... | fx 'for (let user of this) if (user.login.startsWith("a")) yield user'

Access to JSON through this keyword:

$ echo '["a", "b"]' | fx 'yield* this'
[
  "a",
  "b"
]
$ echo '["a", "b"]' | fx 'yield* this; yield "c";'
[
  "a",
  "b",
  "c"
]

Update

You can update existing JSON using spread operator:

$ echo '{"count": 0}' | fx '{...this, count: 1}'
{
  "count": 1
}

Using packages

Use any npm package by installing it globally:

$ npm install -g lodash
$ cat package.json | fx 'require("lodash").keys(this.dependencies)'

Formatting

If you need something different then JSON (for example arguments for xargs) do not return anything from reducer. undefined value printed into stderr by default.

echo '[]' | fx 'void 0'
undefined
echo '[1,2,3]' | fx 'this.forEach(x => console.log(x))' 2>/dev/null | xargs echo
1 2 3

Other examples

Convert object to array:

$ cat package.json | fx 'Object.keys(this.dependencies)'
[
  "@medv/prettyjson"
]

By the way, fx has shortcut for Object.keys(this). Previous example can be rewritten as:

$ cat package.json | fx this.dependencies ?

Interactive mode

Start interactive mode without passing any arguments:

$ curl ... | fx

Click on fields to expand or collapse JSON tree, use mouse wheel to scroll view.

Next commands available in interactive mode:

Key Command
q or Esc or Ctrl+c Exit
e/E Expand/Collapse all
up/down or k/j Scroll up/down one line
g/G Goto top/bottom

Selecting text

You may found what you can't just select text in fx. This is due the fact that all mouse events redirected to stdin. To be able select again you need instruct your terminal not to do it. This can be done by holding special keys while selecting:

Key Terminal
Option+Mouse iTerm2
Fn+Mouse terminal.app
  • jq cli JSON processor on C
  • jl functional sed for JSON on Haskell
  • xx fx-like JSON tool (go)
  • ymlx - fx-like YAML cli processor
  • jv interactive JSON viewer (go)
  • jid interactive cli tool based on jq (go)

License

MIT