From 552f13977e11b649769d221539664de4013a1832 Mon Sep 17 00:00:00 2001 From: devingfx Date: Sun, 2 May 2021 19:42:23 +0200 Subject: [PATCH] Issue: can't call absolute path on Windwos MINGW64 --- bin/esm-cli.js | 54 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/bin/esm-cli.js b/bin/esm-cli.js index 2fae54b..3a452a2 100755 --- a/bin/esm-cli.js +++ b/bin/esm-cli.js @@ -1,5 +1,5 @@ #!/usr/bin/env node -const { resolve } = require('path') +const { isAbsolute, resolve } = require('path') let esm = global.esm = { parseArgs( args, opt = esm.argsopt ) { @@ -31,7 +31,17 @@ let esm = global.esm = { ), getArgsKV: args=> Object.keys(args) .filter(isNaN) - .reduce((o,k)=>({...o,[k]:args[k]}),{}) + .reduce((o,k)=>({...o,[k]:args[k]}),{}), + + softResolve: str=> { + try{ + return require.resolve(str) + }catch(e){return false} + }, + + searchInPathes: str=> ['.',...process.env.PATH.split(';')] + .map( dir=> require('path').resolve(dir+'/'+str) ) + .filter( path=> esm.softResolve(path) )[0] } @@ -39,20 +49,41 @@ process.arguments = esm.parseArgs( process.argv.slice(2) ) process.arguments.flags = Object.assign( { json: false }, process.arguments.flags ) const splitted = (process.arguments.shift() || '').split(':') + +// Issue on Windows: Volume letter is splitted ( ['C','Program files/module.js','export'] +if( process.platform == 'win32' && splitted[0].length == 1 && isAbsolute(splitted[0]+':\\') ) +{ + splitted[1] = splitted[0]+':'+splitted[1] + splitted.shift() + +} + +// Issue on MINGW64: /c/dir/module:export is not transformed to C:/dir/module:export +let res +// Transforms a fake linux Windows path to Windows path +// Ex: /c/Program\ files/ >> C:/Program\ files +if( res = splitted[0].match(/^\/([a-zA-Z])\//) ) + splitted[0] = splitted[0].replace( /^\/./, res[1].toUpperCase()+':' ) + const exported = splitted.length == 1 ? undefined : splitted.pop() const esmodule = splitted.join(':') -, package = resolve('./package.json') -, modulo = resolve( esmodule ) +, package = esm.softResolve('./package.json') +//, modulo = isAbsolute(esmodule) ? esmodule : resolve( esmodule ) +, modulo = isAbsolute(esmodule) ? esm.softResolve(esmodule) : esm.searchInPathes(esmodule) if( process.arguments.flags.debug ) { - console.log( process.cwd(), package, modulo ) - console.log( `process.argv=%o -esmodule=%o -exported=%o -process.arguments=%o + console.log( process.cwd(), package ) + console.log( ` +process.argv: %o +esmodule: %o +isAbsolute: %o +modulo: %o +package: %o +exported: %o +process.arguments: %o `, - process.argv, modulo, exported, process.arguments ) + process.argv, esmodule, isAbsolute(esmodule), modulo, package ? require(package).module : 'no package', exported, process.arguments ) } process.arguments.flags.dry && process.exit() @@ -68,7 +99,8 @@ const render = esm.render = 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 ) + +let mod = require( modulo || resolve(require(package).module) ) process.arguments.flags.debug && console.log(mod)