esm-cli/bin/esm-cli.js

91 lines
2.6 KiB
JavaScript
Executable File

#!/usr/bin/env node
const { resolve } = require('path')
let esm = global.esm = {
parseArgs( args, opt = esm.argsopt )
{
for( let [ reg, fn ] of opt.entries() )
args = args.filter( s=> reg.test(s) )
.map( s=> reg.exec(s) )
// .reduce( fn, Object.assign(args.filter( s=> !reg.test(s) ),args))
.reduce( fn,
Object.assign(
args.filter( s=> !reg.test(s) ),
esm.getArgsKV(args)
)
)
return args
},
argsopt: new Map()
.set( /^-{1,2}(?<key>.*?)([:=](?<value>.*?))?$/
, (args,{groups:{key,value}})=>
Object.assign( args, {[key]: value || true} )
)
.set( /^\+(?<module>.*?)$/
, (args,{groups:{module}})=>
(( args.imports = args.imports || [] ).push( module ), args )
)
.set( /^=(?<key>.*?)([:=](?<value>.*?))?$/
, (args,{groups:{key,value}})=>
(Object.assign( args.flags = args.flags || {}, {[key]: value || true} )
, args)
),
getArgsKV: args=> Object.keys(args)
.filter(isNaN)
.reduce((o,k)=>({...o,[k]:args[k]}),{})
}
process.arguments = esm.parseArgs( process.argv.slice(2) )
process.arguments.flags = Object.assign( { json: false }, process.arguments.flags )
const splitted = (process.arguments.shift() || '').split(':')
const exported = splitted.length == 1 ? undefined : splitted.pop()
const esmodule = splitted.join(':')
, package = resolve('./package.json')
, modulo = resolve( esmodule )
if( process.arguments.flags.debug )
{
console.log( process.cwd(), package, modulo )
console.log( `process.argv=%o
esmodule=%o
exported=%o
process.arguments=%o
`,
process.argv, modulo, exported, process.arguments )
}
process.arguments.flags.dry && process.exit()
require = require('esm')( module, {await: true} )
const render = esm.render = obj=>
process.arguments.flags.json
? render.json( obj )
: render.log( obj )
// ? process.stdout.write( obj&& JSON.stringify(obj,null,'\t') || '' )
// : console.log( obj || '' )
render.json = obj=> process.stdout.write( obj && JSON.stringify(obj,null,'\t') || '' )
render.log = obj=> console.log( obj || '' )
let mod = require( modulo || require(package).module )
process.arguments.flags.debug
&& console.log(mod)
let toCall = mod[ exported || 'default' ]
process.arguments.flags.debug
&& console.log(mod, exported, toCall)
let returned =
typeof toCall == 'function'
? toCall( process.arguments )
: toCall
process.arguments.flags.debug
&& console.log( 'type' , typeof returned, returned instanceof Promise )
returned instanceof Promise
? returned.then( render, e=>console.error(e) )
: render(returned)
module.exports = mod