EcmaScript Module launcher
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
devingfx ab3740f4f0 Oops spoil 4 months ago
bin Oops spoil 4 months ago
.gitignore NPM publish prepare 2 years ago
LICENSE Initial commit 2 years ago Added commanline switch =json 9 months ago
package.json NPM publish v1.1.1 9 months ago


ECMAScript modules launcher in Node 6+

Lunch ES modules using command line interpreter, accessing a specific export function or data, and passing parameters.


Just install module as a global command with npm npm install -g esm-cli

Or you can install it globaly directly from a git clone:

git clone
cd esm-cli
npm install -g .

You should get acces to a global esm command.


With esm-cli you can instanciate a full ES module file, executing it's content, and retreive an exported variable or execute an exported function. It understand returned promises or async functions.

esm path/to/esm_file:export_name [params]

In this exemple, the file ./path/to/esm_file.js is executed and the exported function is executed passing the parsed params:
await export_name( [params] )

Note: .js extension is not needed (nodejs resolver).

Get exported variables

Let's write a simple ES module (myModule.js):

export default 42
export var user_config = {
    some: "json"

And let's use it in cli:

esm myModule
> 42

In a bash file you can invoke some text return using command subsitutions:

#!/usr/bin/env bash
es_var=$(esm myModule)
echo "EcmaScript said: $es_var"

If only a path to the file is provided, the default export is returned if any.

You can access any named exports:

esm myModule:user_config
> { some: 'json' }

Use exported functions

When the exported "thing" is a function (async or not), it is executed passing command line parameters if given.

Imagine a simple ES module library (myLib.js):

export default function hello()
    console.log( 'Hello world !' )
export function greet( params ) {
    return `Hello ${params[0]}`

Then you can write:

esm myLib
> Hello world !
esm myLib:greet Pierre
> Hello Pierre !!

Promise/async support

If the returned result is a promise, because explicitly returned, or from an async function, esm-cli will take care of waiting it's resolution returning the resolved value (gently catching rejections showing nothing).

Parameters parsing

Command line parameters are parsed into an Array before it is given to a called function.
This Array contains a list of strings corresponding to each string given without hyphen -:


export function showParams( params )
    console.log( params )
esm myLib:showParams param1 param2 param3
> [ "param1", "param2", "param3" ]

... and this array is augmented with properties corresponding to hyphen params, with value or "true" if not:

esm myLib:showParams param1 param2 param3 -s --t -foo --bar -baz:42 --val=some
> [ "param1", "param2", "param3", s: true, t: true, foo: true, bar: true, baz: 42, val: "some" ]

Note: order don't matters...

You can then use ES destructuration to filter named paremeters:

// Array destructuration gets simple params
export function myAwesomeFunction( [ first, second, , forth ] )
    console.log( first, second, forth )
// Object destructuration gets named params
export function myAwesomeFunction2( { foo, val, baz } )
    console.log( foo, val, baz )
// Object destructuration for both, using index name
export function myAwesomeFunction3( { 0:param1, 3:param4, foo, val, baz } )
    console.log( param1, param4, foo, val, baz )

To call this kind of function in js and create an augmented param array:

import { myAwesomeFunction3 } from 'myLib'

myAwesomeFunction3({ 0: "first", 3: "forth", foo: true })

Choose the type of result rendered

As default esm-cli uses console.log to render the resulting object to output. It's great to get primitives correctly rendered like strings without ".
But you may sometimes need to get a JSON string representation of object, like when working with stings quoted ans escaped, or to get a complete JSON object.
To do so, you can use the commandline switch =json that can be placed in any order and is not given to the module as param:

> esm myLib
> Hello world!

> esm myLib =json
> "Hello world!"

esm myModule:user_config
> { some: 'json' }

> esm myModule:user_config =json
> {"some":"json"}

Usage with managers


forver -c esm myScript --param option