| '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); |
| } |
| }); |
| } |