You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.4 KiB
53 lines
1.4 KiB
'use strict'; |
|
// classic singleton yargs API, to use yargs |
|
// without running as a singleton do: |
|
// require('yargs/yargs')(process.argv.slice(2)) |
|
const {Yargs, processArgv} = require('./build/index.cjs'); |
|
|
|
Argv(processArgv.hideBin(process.argv)); |
|
|
|
module.exports = Argv; |
|
|
|
function Argv(processArgs, cwd) { |
|
const argv = Yargs(processArgs, cwd, require); |
|
singletonify(argv); |
|
// TODO(bcoe): warn if argv.parse() or argv.argv is used directly. |
|
return argv; |
|
} |
|
|
|
function defineGetter(obj, key, getter) { |
|
Object.defineProperty(obj, key, { |
|
configurable: true, |
|
enumerable: true, |
|
get: getter, |
|
}); |
|
} |
|
function lookupGetter(obj, key) { |
|
const desc = Object.getOwnPropertyDescriptor(obj, key); |
|
if (typeof desc !== 'undefined') { |
|
return desc.get; |
|
} |
|
} |
|
|
|
/* Hack an instance of Argv with process.argv into Argv |
|
so people can do |
|
require('yargs')(['--beeble=1','-z','zizzle']).argv |
|
to parse a list of args and |
|
require('yargs').argv |
|
to get a parsed version of process.argv. |
|
*/ |
|
function singletonify(inst) { |
|
[ |
|
...Object.keys(inst), |
|
...Object.getOwnPropertyNames(inst.constructor.prototype), |
|
].forEach(key => { |
|
if (key === 'argv') { |
|
defineGetter(Argv, key, lookupGetter(inst, key)); |
|
} else if (typeof inst[key] === 'function') { |
|
Argv[key] = inst[key].bind(inst); |
|
} else { |
|
defineGetter(Argv, '$0', () => inst.$0); |
|
defineGetter(Argv, 'parsed', () => inst.parsed); |
|
} |
|
}); |
|
}
|
|
|