Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/reggi/ache

:loudspeaker: :shoe: Elevate your npm scripts, JavaScript-based shell script templating.
https://github.com/reggi/ache

Last synced: about 1 month ago
JSON representation

:loudspeaker: :shoe: Elevate your npm scripts, JavaScript-based shell script templating.

Awesome Lists containing this project

README

        

# ache

```
npm i ache -g
```

## Why?

I was sick and tired of build tools available. I simply want to leverage bash / and shell scripts and add a templating component on top of them using node. Named `ache` because the existing tools are a headache, and it rhymes with `make`, `jake`, `rake`, you get the idea.

## How it works

Add a `achefile.js` or `achefiles` directory with many different JavaScript files to your project.

```js
export let helloWorld = `
echo 'hello world'
`
```

Then run `ache hello-world` and your done.

## Ache Spec

I designed `ache` to inevitably support three distinct syntax types. Providing some versatility.

### Syntax 1

Export values can return a `execString` directly.

```js
export let helloWorld = `
echo 'hello-world'
`
```

### Syntax 2

Export values can return a special ache-specific `Cmd` class, where you can pass a `execString`.

```js
export let helloWorld = new Cmd(`
echo 'hello-world'
`)
```

The benefit here is that you can add optional params to `helloWorld` for instance `helloWorld.usage`.

### Syntax 3

Export values can return that same `Cmd` class, when a function is passed you have access to global data from the root `ache` consumer. This allows the most amount of uniformity between scripts and modularity because you don't need to use globals.

```js
export let echo = new Cmd(({argv}) => `
echo '${argv._[1]}'
`)
```

Another benefit of this approach is that you can preform validation like this.

```js
export let helloWorld = new Cmd(({argv}) => {
if (argv._[1] !== 'please') throw new Error('ask nicely')
return `
echo 'hello-world'
`
})
```

## Ache Specific

Here's the operational flags you can pass to `ache`.

* `ache --ache-scope` changes the path where ache looks for your ache scope
* `ache --ache-cwd` changes the current working directory CWD to a specified path
* `ache --ache-list` lists all the commands in the ache scope
* `ache --ache-dry-run` logs the string command to be run (without running it)
* `ache --ache-error` logs error stack trace instead of just error message
* `ache --ache-verbose` shortcut for `DEBUG=ache` and `--ache-error`

## Examples

```
examples$ npm i ache -g
/Users/thomasreggi/.nvm/versions/node/v6.2.2/bin/ache -> /Users/thomasreggi/.nvm/versions/node/v6.2.2/lib/node_modules/ache/lib/bin.js
/Users/thomasreggi/.nvm/versions/node/v6.2.2/lib
└── [email protected]

examples$ cd 01_example/
01_example$ ache
01_example$ ache list
[ 'meow-mix' ]
01_example$ ache meow-mix
meow meow meow meow meow meow

01_example$ cd ..
examples$ cd 02_example/
02_example$ ache list
[ 'bar', 'baz', 'foo', 'hello-world' ]
02_example$ ache bar
bar

02_example$ ache hello-world
hello-world

02_example$ cd ..
examples$ cd 03_example/
03_example$ ache list
[ 'bar', 'baz', 'foo', 'hello-world', 'meow-mix' ]
03_example$ ache hello-world
hello-world

03_example$
```

Here's an example of scope diving & setting the cwd.

```
ache$ cd examples
examples$ ache --ache-scope ./01_example/ --ache-cwd ./03_example/ cat-file
03_example
examples$ ache --ache-scope ./01_example/ --ache-cwd ./03_example/ cat-file --ache-verbose
ache starting +0ms
ache argv {"_":["cat-file"],"ache-scope":"./01_example/","ache-cwd":"./03_example/","ache-verbose":true} +4ms
ache cwd /Users/thomasreggi/Desktop/ache/examples +1ms
ache ache scope /Users/thomasreggi/Desktop/ache/examples/01_example +0ms
ache ache cwd /Users/thomasreggi/Desktop/ache/examples/03_example +0ms
ache commands meow-mix, cat-file +124ms
03_example
```