task-env

A framework for building reusable JS tasks.

Usage no npm install needed!

<script type="module">
  import taskEnv from 'https://cdn.skypack.dev/task-env';
</script>

README

Task Env

A framework for building reusable JS tasks.

Feature Built With
Parse CLI arguments mri
Interact with the CLI Inquirer.js
Execute commands commandland
JSON and text store dot-store

Install

npm install --save-dev task-env

Create an executable

touch run
chmod +x run

Write some code

#!/usr/bin/env node

require("task-env")({
  args: process.argv.slice(2),
  tasks: [
    {
      sayHello: ({ hello }) => {
        console.log(">", hello)
      },
    },
  ],
})

Run your task

./run sayHello --hello=hi
> hi

Package tasks

Export task:

export function sayHello({ hello }) {
  console.log(hello)
}

Require task:

#!/usr/bin/env node

require("task-env")({
  args: process.argv.slice(2),
  tasks: [require("./say-hello")],
})

Interact

export async function happy({ ask }) {
  let { happy } = await ask([
    {
      type: "confirm",
      name: "happy",
      message: "Are you happy?",
    },
  ])
}

See the Inquirer.js prompt docs for available options.

Call other tasks

export function sayHello({ tasks }) {
  tasks.say({ text: "hello" })
}

export function say({ text }) {
  console.log(">", text)
}

Calling through tasks binds the CLI arguments and helper functions, as if the task were called via CLI.

Execute commands

export async function ls({ run }) {
  await run("ls", ["/"])
}

See the commandland docs for available options.

JSON and text store

Task env uses dot-store to provide an immutable store with atomic filesystem persistence.

Create a directory with some JSON files:

{
  "users": {
    "bob": {
      "key": "~/.ssh/bob_rsa"
    }
  }
}

The stores option allows you to define multiple named stores:

#!/usr/bin/env node

require("task-env")({
  args: process.argv.slice(2),
  stores: {
    config: {
      pattern: "**/*",
      root: __dirname,
    },
  },
  tasks: [require("./tasks/user")],
})

Within your task, get and set JSON using dot-style property strings:

export async function user({ config, name, key }) {
  if (key) {
    await config.set(`users.${name}.key`, key)
  }

  console.log(">", config.get(`users.${name}`))
}

Run via CLI:

./run user --name=bob --key=~/.ssh/id_rsa
> { key: "~/.ssh/id_rsa" }

All options

Option Example Purpose
alias {h: ["help"]} CLI arguments aliases
preSetup [config=>config] Pre-setup functions (before argv parsing)
setup [config=>config] Setup functions
stores {store: {root: __dirname, pattern: "**/*"}} Store configurations
teardown [args=>{}] Teardown functions
tasks [{ task: ({})=>{} }] Task functions