#!/usr/bin/env node const { resolve } = require('path') const { exec, spawn } = require('child_process') 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(':') 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) //console.log( process.cwd(), package, modulo ) //console.log( process.argv, esmodule, exported, args ) require = require('esm')( module, {await: true} ) const render = obj=> switches.json ? process.stdout.write( obj&& JSON.stringify(obj,null,'\t') || '' ) : console.log( obj || '' ) const install = module=> { process.stderr.write(`Module missing: ${module} npm install ${module}\n`) let npm = exec(`npm install ${module}`) npm.stdout.pipe( process.stderr ) return npm } // const reTry = ()=> { try { let mod = require( modulo || require(package).module ) // console.log(mod) let toCall = mod[ exported || 'default' ] // console.log(mod, exported, toCall) let returned = typeof toCall == 'function' ? toCall( args ) : toCall //console.log( 'type' , typeof returned, returned instanceof Promise ) returned instanceof Promise ? returned.then( render, e=>console.error(e) ) : render(returned) module.exports = mod } catch(e) { // console.log('error') // console.log('error') // console.log('error') // console.log( e.code == 'MODULE_NOT_FOUND' ) // console.log( e.message ) if( e.code == 'MODULE_NOT_FOUND' ) { let toLoad = e.message.match(/module\s+['"](?.*)['"]/)?.groups?.module toLoad && install( toLoad ) // console.log(`Module missing: ${toLoad} // process.stderr.write(`Module missing: ${toLoad} // npm install ${toLoad}\n`) // let npm = exec(`npm install ${toLoad}`) // npm.on('message', e=> console.log('message:', e)) // npm.stdout.pipe(process.stdout)//on('data', e=> console.log('data:', e)) .on('close', e=> { process.stderr.write(` esm ${process.argv.slice(2).join(' ')}\n`) // reTry() let reTry = exec(//'esm',process.argv.slice(2), `esm ${process.argv.slice(2).join(' ')}`, { detached: true, stdio: 'inherit' // stdio: [ 'ignore', process.stdout, process.stderr ] }) reTry.unref() // reTry.stderr.pipe( process.stderr ) // reTry.stdout.pipe( process.stderr ) // process.stdin.pipe( reTry.stdin ) // process.exit() }) } } // } // reTry() // 1st time