2023-04-08 20:06:28 +00:00
|
|
|
# fx
|
|
|
|
|
2023-04-18 12:10:17 +00:00
|
|
|
A non-interactive, JavaScript version of the [**fx**](https://fx.wtf).
|
|
|
|
Short for _Function eXecution_ or _f(x)_.
|
2023-04-08 20:06:28 +00:00
|
|
|
|
|
|
|
```sh
|
|
|
|
npm i -g fx
|
|
|
|
```
|
|
|
|
|
|
|
|
Or use **npx**:
|
|
|
|
|
|
|
|
```sh
|
2023-04-12 09:01:52 +00:00
|
|
|
cat file.json | npx fx .field
|
2023-04-08 20:06:28 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
Or use **deno**:
|
|
|
|
|
|
|
|
```sh
|
2023-09-15 07:07:56 +00:00
|
|
|
cat file.json | deno run -A https://fx.wtf .field
|
2023-04-08 20:06:28 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
## Usage
|
|
|
|
|
|
|
|
Fx treats arguments as JavaScript functions. Fx passes the input data to the first
|
|
|
|
function and then passes the result of the first function to the second function
|
|
|
|
and so on.
|
|
|
|
|
|
|
|
```sh
|
|
|
|
echo '{"name": "world"}' | fx 'x => x.name' 'x => `Hello, ${x}!`'
|
|
|
|
```
|
|
|
|
|
|
|
|
Use `this` to access the input data. Use `.` at the start of the expression to
|
|
|
|
access the input data without a `x => x` part.
|
|
|
|
|
|
|
|
```sh
|
2023-04-10 10:17:44 +00:00
|
|
|
echo '{"name": "world"}' | fx '.name' '`Hello, ${this}!`'
|
2023-04-08 20:06:28 +00:00
|
|
|
```
|
|
|
|
|
2023-04-10 10:17:04 +00:00
|
|
|
Use other JS functions to process the data.
|
|
|
|
|
|
|
|
```sh
|
2023-04-19 12:51:18 +00:00
|
|
|
echo '{"name": "world"}' | fx 'Object.keys'
|
2023-04-10 10:17:04 +00:00
|
|
|
```
|
2023-04-10 10:12:48 +00:00
|
|
|
|
|
|
|
## Advanced Usage
|
|
|
|
|
2023-04-19 12:48:33 +00:00
|
|
|
Fx can process a stream of json objects. Fx will apply arguments to each object.
|
2023-04-08 20:06:28 +00:00
|
|
|
|
|
|
|
```sh
|
2023-04-19 12:48:33 +00:00
|
|
|
echo '{"name": "hello"}\n{"name": "world"}' | fx '.name'
|
2023-04-10 11:06:34 +00:00
|
|
|
```
|
|
|
|
|
2023-04-19 12:48:33 +00:00
|
|
|
If you want to process a stream of json objects as a single array,
|
|
|
|
use the **--slurp** or **-s** flag.
|
|
|
|
|
2023-04-10 11:06:34 +00:00
|
|
|
```sh
|
2023-04-19 12:48:33 +00:00
|
|
|
echo '{"name": "hello"}\n{"name": "world"}' | fx --slurp '.map(x => x.name)' '.join(", ")'
|
2023-04-08 20:06:28 +00:00
|
|
|
```
|
|
|
|
|
2023-04-19 12:48:33 +00:00
|
|
|
If you want to process non-JSON data, use the **--raw** or **-r** flag.
|
2023-04-08 20:06:28 +00:00
|
|
|
|
|
|
|
```sh
|
2023-04-19 12:48:33 +00:00
|
|
|
ls | fx -r '[this, this.includes(".md")]'
|
|
|
|
```
|
|
|
|
|
|
|
|
You can use **--raw** and **--slurp** (or **-rs**) together to get a single array of strings.
|
|
|
|
|
|
|
|
```sh
|
|
|
|
ls | fx -rs '.filter(x => x.includes(".md"))'
|
|
|
|
```
|
|
|
|
|
|
|
|
Fx has a special symbol **skip** for skipping the printing of the result.
|
|
|
|
|
|
|
|
```sh
|
|
|
|
ls | fx -r '.includes(".md") ? this : skip'
|
|
|
|
```
|
|
|
|
|
2023-05-08 12:32:04 +00:00
|
|
|
Fx comes with a set of useful functions: **uniq**, **sort**, **groupBy**, **chunk**, **zip**.
|
2023-04-19 12:48:33 +00:00
|
|
|
|
|
|
|
```sh
|
|
|
|
cat file.json | fx 'uniq' 'sort' 'groupBy(x => x.name)'
|
2023-04-08 20:06:28 +00:00
|
|
|
```
|
|
|
|
|
2023-04-11 08:59:28 +00:00
|
|
|
Fx works with promises.
|
|
|
|
|
|
|
|
```sh
|
|
|
|
echo '"https://medv.io/*"' | fx 'fetch' '.text()'
|
|
|
|
```
|
|
|
|
|
2023-04-19 12:48:33 +00:00
|
|
|
### Syntactic Sugar
|
|
|
|
|
|
|
|
Fx has a shortcut for the map function. Fox example, `this.map(x => x.commit.message)`
|
|
|
|
can be rewritten without leading dot and without `x => x` parts.
|
|
|
|
|
|
|
|
```sh
|
|
|
|
curl https://api.github.com/repos/antonmedv/fx/commits | fx 'map(.commit.message)'
|
|
|
|
```
|
|
|
|
|
|
|
|
```sh
|
|
|
|
echo '[{"name": "world"}]' | fx 'map(`Hello, ${x.name}!`)'
|
|
|
|
```
|
|
|
|
|
|
|
|
Fx has a special syntax for the flatMap function. Fox example,
|
|
|
|
`.flatMap(x => x.labels.flatMap(x => x.name))` can be rewritten in the next way.
|
2023-04-12 09:01:52 +00:00
|
|
|
|
|
|
|
```sh
|
2023-04-19 12:56:42 +00:00
|
|
|
curl https://api.github.com/repos/kubernetes/kubernetes/issues | fx '.[].labels[].name'
|
2023-04-12 09:01:52 +00:00
|
|
|
```
|
|
|
|
|
2023-05-08 12:32:04 +00:00
|
|
|
### .fxrc.js
|
|
|
|
|
|
|
|
Fx supports `.fxrc.js` file in the current directory or in the home directory.
|
|
|
|
|
|
|
|
Put the next code in the `.fxrc.js` file to make `myFunction` available in the fx.
|
|
|
|
|
|
|
|
```js
|
|
|
|
global.myFunction = x => x + 1
|
|
|
|
```
|
|
|
|
|
|
|
|
Now you can use `myFunction` in the fx.
|
|
|
|
|
|
|
|
```sh
|
|
|
|
echo '1' | fx 'myFunction'
|
|
|
|
```
|
|
|
|
|
2023-04-08 20:06:28 +00:00
|
|
|
## License
|
|
|
|
|
|
|
|
[MIT](../LICENSE)
|