diff --git a/bin/esm-cli.js b/bin/esm-cli.js index 82bf567..8d90f20 100755 --- a/bin/esm-cli.js +++ b/bin/esm-cli.js @@ -1,27 +1,48 @@ #!/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}(?.*?)([:=](?.*?))?$/ + , (args,{groups:{key,value}})=> + Object.assign( args, {[key]: value || true} ) + ) + .set( /^\+(?.*?)$/ + , (args,{groups:{module}})=> + (( args.imports = args.imports || [] ).push( module ), args ) + ) + .set( /^=(?.*?)([:=](?.*?))?$/ + , (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]}),{}) -const switches = { json: false }, switchReg = /^=/ -let params = process.argv.slice(2) -params = params.map( p=> switchReg.test(p) ? (switches[p.slice(1)] = true, null) : p ) - .filter( o=>o ) +} -const moduleStr = params.shift() -const [ esmodule, exported ] = (moduleStr || '').split(':') +process.arguments = esm.parseArgs( process.argv.slice(2) ) +process.arguments.flags = Object.assign( { json: false }, process.arguments.flags ) -const optionReg = /^-{1,2}(.*?)([:=](.*?))?$/ -const args = params.filter( s=> optionReg.test(s) ) - .reduce( (opt,str)=> { - let [ , prop, , value ] = optionReg.exec(str) - return Object.assign( opt, {[prop]: value || true} ) - // return hasValue ? { ...opt, [prop]: value || true } - // : opt - }, - params.filter( s=> !optionReg.test(s) ) - ) - -const package = resolve('./package.json') -, modulo = resolve(esmodule) +const splitted = (process.arguments.shift() || '').split(':') +const exported = splitted.pop() +const esmodule = splitted.join(':') +, package = resolve('./package.json') +, modulo = resolve( esmodule ) //console.log( process.cwd(), package, modulo ) //console.log( process.argv, esmodule, exported, args ) @@ -29,10 +50,14 @@ const package = resolve('./package.json') require = require('esm')( module, {await: true} ) -const render = obj=> switches.json - ? process.stdout.write( obj&& JSON.stringify(obj,null,'\t') || '' ) - : console.log( obj || '' ) - +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 ) // console.log(mod) @@ -41,7 +66,7 @@ let toCall = mod[ exported || 'default' ] // console.log(mod, exported, toCall) let returned = typeof toCall == 'function' - ? toCall( args ) + ? toCall( process.arguments ) : toCall //console.log( 'type' , typeof returned, returned instanceof Promise ) diff --git a/package.json b/package.json index d2dd7d0..ca310ab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "esm-cli", - "version": "1.1.1", + "version": "1.2.0", "description": "ECMAScript modules launcher", "engines": { "node": ">=6"