https://github.com/maxlath/line-apply
A CLI tool to transform a text stream by applying a JS function to each line
https://github.com/maxlath/line-apply
Last synced: over 1 year ago
JSON representation
A CLI tool to transform a text stream by applying a JS function to each line
- Host: GitHub
- URL: https://github.com/maxlath/line-apply
- Owner: maxlath
- Created: 2023-06-10T14:42:47.000Z (about 3 years ago)
- Default Branch: main
- Last Pushed: 2023-06-10T14:43:17.000Z (about 3 years ago)
- Last Synced: 2025-02-22T17:36:43.353Z (over 1 year ago)
- Language: JavaScript
- Size: 6.84 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# line-apply
A CLI tool to transform a text stream by applying a JS function to each line
Features:
* take the JS function to apply from a file
* the function may return async results
* preview the transformation results with the `--diff` option
[](https://npmjs.com/package/line-apply/)
[](https://opensource.org/licenses/MIT)
[](http://nodejs.org)
## Summary
- [Install](#install)
- [How To](#how-to)
- [Basic](#basic)
- [Async](#async)
- [Diff mode](#diff-mode)
- [Filter mode](#filter-mode)
- [Use sub-function](#use-sub-function)
- [Pass additional arguments](#pass-additional-arguments)
- [See also](#see-also)
## Install
```sh
npm i -g line-apply
```
## How To
### Basic
```sh
cat some_data | line-apply some_transform_function.js > some_data_transformed
# Which can also be written
line-apply some_transform_function.js < cat some_data > some_data_transformed
```
where `some_transform_function.js` just needs to export a JS function. This should work both with the ESM export syntax
```js
// some_transform_function.js
export default function (line) {
if (line.length > 10) {
return line.toUpperCase()
} else {
// returning null or undefined drops the entry
}
}
```
or with the CommonJS export syntax
```js
// some_transform_function.js
module.exports = function (line) {
if (line.length > 10) {
return line.toUpperCase()
} else {
// returning null or undefined drops the entry
}
}
```
### Async
That function can also be async:
```js
import { getSomeExtraData } from './path/to/get_some_extra_data.js'
// some_async_transform_function.js
export default async function (doc) {
if (line.length > 10) {
const id = line.match(/(Q[\d+]) /)[1]
const data = await getSomeExtraData(id)
return `${line} ${data}`
} else {
// returning null or undefined drops the entry
}
}
```
### Diff mode
As a way to preview the results of your transformation, you can use the diff mode
```sh
cat some_data | line-apply some_transform_function.js --diff
```
which will display a colored diff of each line before and after transformation.
### Filter mode
Use the js function only to filter lines: lines returning `true` will be let through. No transformation will be applied.
```sh
cat some_data | line-apply some_transform_function.js --filter
```
### Use sub-function
Given a `function_collection.js` file like:
```js
// function_collection.js
export function uppercase (line) {
return line.toUpperCase()
}
export function lowercase (line) {
return line.toLowerCase()
}
```
You can use those subfunction by passing their key as an additional argument
```sh
cat some_data | line-apply ./function_collection.js uppercase
cat some_data | line-apply ./function_collection.js lowercase
```
This should also work with the CommonJS syntax:
```js
// function_collection.cjs
module.exports = {
uppercase: line => line.toUpperCase(),
lowercase: line => line.toLowerCase(),
}
```
### Pass additional arguments
Any remaining argument will be passed to the function
```sh
# Pass '123' as argument to the exported function
cat some_data | line-apply ./function.js 123
# Pass '123' as argument to the exported sub-function foo
cat some_data | line-apply ./function_collection.js foo 123
```
## See also
* [ndjson-apply](https://github.com/maxlath/ndjson-apply/)
* [json-apply](https://github.com/maxlath/json-apply/)