Compare commits
4 Commits
master
...
dev-absolu
Author | SHA1 | Date |
---|---|---|
devingfx | 552f13977e | |
devingfx | 8f922a4ef6 | |
devingfx | 0845e8b31c | |
devingfx | 480000cfa0 |
128
bin/esm-cli.js
128
bin/esm-cli.js
|
@ -1,50 +1,120 @@
|
||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
const { resolve } = require('path')
|
const { isAbsolute, 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]}),{}),
|
||||||
|
|
||||||
const switches = { json: false }, switchReg = /^=/
|
softResolve: str=> {
|
||||||
let params = process.argv.slice(2)
|
try{
|
||||||
params = params.map( p=> switchReg.test(p) ? (switches[p.slice(1)] = true, null) : p )
|
return require.resolve(str)
|
||||||
.filter( o=>o )
|
}catch(e){return false}
|
||||||
|
},
|
||||||
|
|
||||||
const moduleStr = params.shift()
|
searchInPathes: str=> ['.',...process.env.PATH.split(';')]
|
||||||
const [ esmodule, exported ] = (moduleStr || '').split(':')
|
.map( dir=> require('path').resolve(dir+'/'+str) )
|
||||||
|
.filter( path=> esm.softResolve(path) )[0]
|
||||||
|
|
||||||
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')
|
process.arguments = esm.parseArgs( process.argv.slice(2) )
|
||||||
, modulo = resolve(esmodule)
|
process.arguments.flags = Object.assign( { json: false }, process.arguments.flags )
|
||||||
|
|
||||||
//console.log( process.cwd(), package, modulo )
|
const splitted = (process.arguments.shift() || '').split(':')
|
||||||
//console.log( process.argv, esmodule, exported, args )
|
|
||||||
|
|
||||||
|
// 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 = 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 )
|
||||||
|
console.log( `
|
||||||
|
process.argv: %o
|
||||||
|
esmodule: %o
|
||||||
|
isAbsolute: %o
|
||||||
|
modulo: %o
|
||||||
|
package: %o
|
||||||
|
exported: %o
|
||||||
|
process.arguments: %o
|
||||||
|
`,
|
||||||
|
process.argv, esmodule, isAbsolute(esmodule), modulo, package ? require(package).module : 'no package', exported, process.arguments )
|
||||||
|
}
|
||||||
|
|
||||||
|
process.arguments.flags.dry && process.exit()
|
||||||
require = require('esm')( module, {await: true} )
|
require = require('esm')( module, {await: true} )
|
||||||
|
|
||||||
|
|
||||||
const render = obj=> switches.json
|
const render = esm.render = obj=>
|
||||||
? process.stdout.write( obj&& JSON.stringify(obj,null,'\t') || '' )
|
process.arguments.flags.json
|
||||||
: console.log( obj || '' )
|
? 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 )
|
let mod = require( modulo || resolve(require(package).module) )
|
||||||
// console.log(mod)
|
process.arguments.flags.debug
|
||||||
|
&& console.log(mod)
|
||||||
|
|
||||||
let toCall = mod[ exported || 'default' ]
|
let toCall = mod[ exported || 'default' ]
|
||||||
// console.log(mod, exported, toCall)
|
process.arguments.flags.debug
|
||||||
|
&& console.log(mod, exported, toCall)
|
||||||
|
|
||||||
let returned =
|
let returned =
|
||||||
typeof toCall == 'function'
|
typeof toCall == 'function'
|
||||||
? toCall( args )
|
? toCall( process.arguments )
|
||||||
: toCall
|
: toCall
|
||||||
|
process.arguments.flags.debug
|
||||||
|
&& console.log( 'type' , typeof returned, returned instanceof Promise )
|
||||||
|
|
||||||
//console.log( 'type' , typeof returned, returned instanceof Promise )
|
|
||||||
returned instanceof Promise
|
returned instanceof Promise
|
||||||
? returned.then( render, e=>console.error(e) )
|
? returned.then( render, e=>console.error(e) )
|
||||||
: render(returned)
|
: render(returned)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "esm-cli",
|
"name": "esm-cli",
|
||||||
"version": "1.1.1",
|
"version": "1.2.1",
|
||||||
"description": "ECMAScript modules launcher",
|
"description": "ECMAScript modules launcher",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
|
|
Loading…
Reference in New Issue