summaryrefslogtreecommitdiff
path: root/node_modules/command-line-args/lib/argv-tools.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/command-line-args/lib/argv-tools.mjs')
-rw-r--r--node_modules/command-line-args/lib/argv-tools.mjs173
1 files changed, 173 insertions, 0 deletions
diff --git a/node_modules/command-line-args/lib/argv-tools.mjs b/node_modules/command-line-args/lib/argv-tools.mjs
new file mode 100644
index 0000000..7a0e426
--- /dev/null
+++ b/node_modules/command-line-args/lib/argv-tools.mjs
@@ -0,0 +1,173 @@
+import arrayify from '../node_modules/array-back/index.mjs'
+import findReplace from '../node_modules/find-replace/dist/index.mjs'
+
+/**
+ * Some useful tools for working with `process.argv`.
+ *
+ * @module argv-tools
+ * @typicalName argvTools
+ * @example
+ * const argvTools = require('argv-tools')
+ */
+
+/**
+ * Regular expressions for matching option formats.
+ * @static
+ */
+const re = {
+ short: /^-([^\d-])$/,
+ long: /^--(\S+)/,
+ combinedShort: /^-[^\d-]{2,}$/,
+ optEquals: /^(--\S+?)=(.*)/
+}
+
+/**
+ * Array subclass encapsulating common operations on `process.argv`.
+ * @static
+ */
+class ArgvArray extends Array {
+ /**
+ * Clears the array has loads the supplied input.
+ * @param {string[]} argv - The argv list to load. Defaults to `process.argv`.
+ */
+ load (argv) {
+ this.clear()
+ if (argv && argv !== process.argv) {
+ argv = arrayify(argv)
+ } else {
+ /* if no argv supplied, assume we are parsing process.argv */
+ argv = process.argv.slice(0)
+ const deleteCount = process.execArgv.some(isExecArg) ? 1 : 2
+ argv.splice(0, deleteCount)
+ }
+ argv.forEach(arg => this.push(String(arg)))
+ }
+
+ /**
+ * Clear the array.
+ */
+ clear () {
+ this.length = 0
+ }
+
+ /**
+ * expand ``--option=value` style args.
+ */
+ expandOptionEqualsNotation () {
+ if (this.some(arg => re.optEquals.test(arg))) {
+ const expandedArgs = []
+ this.forEach(arg => {
+ const matches = arg.match(re.optEquals)
+ if (matches) {
+ expandedArgs.push(matches[1], matches[2])
+ } else {
+ expandedArgs.push(arg)
+ }
+ })
+ this.clear()
+ this.load(expandedArgs)
+ }
+ }
+
+ /**
+ * expand getopt-style combinedShort options.
+ */
+ expandGetoptNotation () {
+ if (this.hasCombinedShortOptions()) {
+ findReplace(this, re.combinedShort, expandCombinedShortArg)
+ }
+ }
+
+ /**
+ * Returns true if the array contains combined short options (e.g. `-ab`).
+ * @returns {boolean}
+ */
+ hasCombinedShortOptions () {
+ return this.some(arg => re.combinedShort.test(arg))
+ }
+
+ static from (argv) {
+ const result = new this()
+ result.load(argv)
+ return result
+ }
+}
+
+/**
+ * Expand a combined short option.
+ * @param {string} - the string to expand, e.g. `-ab`
+ * @returns {string[]}
+ * @static
+ */
+function expandCombinedShortArg (arg) {
+ /* remove initial hypen */
+ arg = arg.slice(1)
+ return arg.split('').map(letter => '-' + letter)
+}
+
+/**
+ * Returns true if the supplied arg matches `--option=value` notation.
+ * @param {string} - the arg to test, e.g. `--one=something`
+ * @returns {boolean}
+ * @static
+ */
+function isOptionEqualsNotation (arg) {
+ return re.optEquals.test(arg)
+}
+
+/**
+ * Returns true if the supplied arg is in either long (`--one`) or short (`-o`) format.
+ * @param {string} - the arg to test, e.g. `--one`
+ * @returns {boolean}
+ * @static
+ */
+function isOption (arg) {
+ return (re.short.test(arg) || re.long.test(arg)) && !re.optEquals.test(arg)
+}
+
+/**
+ * Returns true if the supplied arg is in long (`--one`) format.
+ * @param {string} - the arg to test, e.g. `--one`
+ * @returns {boolean}
+ * @static
+ */
+function isLongOption (arg) {
+ return re.long.test(arg) && !isOptionEqualsNotation(arg)
+}
+
+/**
+ * Returns the name from a long, short or `--options=value` arg.
+ * @param {string} - the arg to inspect, e.g. `--one`
+ * @returns {string}
+ * @static
+ */
+function getOptionName (arg) {
+ if (re.short.test(arg)) {
+ return arg.match(re.short)[1]
+ } else if (isLongOption(arg)) {
+ return arg.match(re.long)[1]
+ } else if (isOptionEqualsNotation(arg)) {
+ return arg.match(re.optEquals)[1].replace(/^--/, '')
+ } else {
+ return null
+ }
+}
+
+function isValue (arg) {
+ return !(isOption(arg) || re.combinedShort.test(arg) || re.optEquals.test(arg))
+}
+
+function isExecArg (arg) {
+ return ['--eval', '-e'].indexOf(arg) > -1 || arg.startsWith('--eval=')
+}
+
+export {
+ expandCombinedShortArg,
+ re,
+ ArgvArray,
+ getOptionName,
+ isOption,
+ isLongOption,
+ isOptionEqualsNotation,
+ isValue
+}