synthesizer

Lightweight, practical task runner.

Usage no npm install needed!

<script type="module">
  import synthesizer from 'https://cdn.skypack.dev/synthesizer';
</script>

README

synthesizer

A lightweight, practical task runner. Great for build systems, testing, and deployments!

synthesizer has the speed of a Makefile and the power of Gulp.

Install

Install synthesizer globally:

# yarn global add synthesizer

Add synthesizer to your project:

$ yarn add synthesizer

Getting Started

After synthesizer has been installed globally and in your project, add a synfile (syn.js) to your project:
syn.js

const { register } = require('synthesizer')

register('hello', () => {
    console.log('hello, world!')
})

Now you can run the hello task by typing: (note: try using autocomplete!)

$ syn hello
  {#syn} starting in ~/Documents/projects/use-syn
  {#syn} using ~/Documents/projects/use-syn/syn.js
  {:hello} init
  hello, world!
  {:hello} done
  {#syn} ok

You can also run multiple tasks in a single command. Not only is this good for batching work, it is a useful way to configure your tasks!

let env = 'prod'

register('dev', () => {
    env = 'dev'
})

register('start', () => {
    console.log('running in', env, 'mode')
})
$ syn start
  ...
  running in prod mode
  ...
$ syn dev start
  ...
  running in dev mode
  ...

API

register(name : string, ...tasks : function | string)

register will add a new task that is identified by name. When run, the registered task will sequentially run each of its component tasks. In addition to providing functions, other registered tasks can also be sourced. This is great for composing tasks and building workflows.

register('a', 'x', some_function, 'y', 'z')

Running syn a will execute 'x', some_function, 'y', and 'z' in order.

run(name : string, ?args : [string], ?options : {})

run is based off of child_process.spawnSync, providing some convenient defaults and error handling.

register('shello', () => {
    run('echo', ['hello, world!'])
})
$ syn shello
  ...
  hello, world!
  ...

shell(command : string, ?options : {})

shell is based off of child_process.execSync. Use this instead of run if you have a command string and want to spawn it in a subshell.

register('shello', () => {
    shell('echo \'hello, world!\'')
})
$ syn shello
  ...
  hello, world!
  ...

ask(?prompt : string, ?options : {}) : string

ask provides a simple readline interface for input. You can optionally provide a prompt, and options to readline-sync.prompt.

register('login', () => {
    const username = ask('user: ')
    const password = ask('pass: ', { hideEchoBack: true, mask: '' })

    run('echo', [`do something with ${ username }:${ password }`])
})
$ syn login
  ...
  user: your_manager
  pass: 
  do something with your_manager:Password1
  ...