fx/npm/README.md

129 lines
2.7 KiB
Markdown
Raw Normal View History

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)