From ced92d1cc8e95008a0a0a0d6217b42f44c36864a Mon Sep 17 00:00:00 2001 From: devingfx Date: Mon, 18 Jan 2021 00:01:21 +0100 Subject: [PATCH] Added module error detection to npm install and respawn --- bin/esm-cli.js | 76 +++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 62 insertions(+), 14 deletions(-) diff --git a/bin/esm-cli.js b/bin/esm-cli.js index 82bf567..9674567 100755 --- a/bin/esm-cli.js +++ b/bin/esm-cli.js @@ -1,5 +1,6 @@ #!/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) @@ -33,21 +34,68 @@ 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 +} -let mod = require( modulo || require(package).module ) -// console.log(mod) +// 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 + 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) + //console.log( 'type' , typeof returned, returned instanceof Promise ) + returned instanceof Promise + ? returned.then( render, e=>console.error(e) ) + : render(returned) -module.exports = mod - \ No newline at end of file + 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 \ No newline at end of file