@jakubmazanec/args 2.0.19-unstable.72f063e3 → 2.0.20-next.24efc8d1f

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,6 @@
1
1
  import { type OptionsConfig } from '../OptionsConfig.js';
2
2
  /**
3
- * Converts options config to a map (i.e. an object) of short option names (object keys) to long
4
- * option names (values).
3
+ * Converts options config to a map (i.e. an object) of short option names (object keys) to long option names (values).
5
4
  *
6
5
  * @optionsConfig Options config to create the map from.
7
6
  * @return Resulting map.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../source/internals/createOptionShortNameMap.ts"],
4
- "sourcesContent": ["import {type OptionsConfig} from '../OptionsConfig.js';\n\n/**\n * Converts options config to a map (i.e. an object) of short option names (object keys) to long\n * option names (values).\n *\n * @optionsConfig Options config to create the map from.\n * @return Resulting map.\n */\nexport function createOptionShortNameMap(optionsConfig: OptionsConfig) {\n let map: Record<string, string> = {};\n\n for (let [optionName, optionConfig] of Object.entries(optionsConfig)) {\n if (typeof optionConfig.shortName === 'string') {\n map[optionConfig.shortName] = optionName;\n }\n }\n\n return map;\n}\n"],
5
- "mappings": "AASO,gBAAS,yBAAyB,eAA8B;AACrE,MAAI,MAA8B,CAAC;AAEnC,WAAS,CAAC,YAAY,YAAY,KAAK,OAAO,QAAQ,aAAa,GAAG;AACpE,QAAI,OAAO,aAAa,cAAc,UAAU;AAC9C,UAAI,aAAa,SAAS,IAAI;AAAA,IAChC;AAAA,EACF;AAEA,SAAO;AACT;",
4
+ "sourcesContent": ["import {type OptionsConfig} from '../OptionsConfig.js';\n\n/**\n * Converts options config to a map (i.e. an object) of short option names (object keys) to long option names (values).\n *\n * @optionsConfig Options config to create the map from.\n * @return Resulting map.\n */\nexport function createOptionShortNameMap(optionsConfig: OptionsConfig) {\n let map: Record<string, string> = {};\n\n for (let [optionName, optionConfig] of Object.entries(optionsConfig)) {\n if (typeof optionConfig.shortName === 'string') {\n map[optionConfig.shortName] = optionName;\n }\n }\n\n return map;\n}\n"],
5
+ "mappings": "AAQO,gBAAS,yBAAyB,eAA8B;AACrE,MAAI,MAA8B,CAAC;AAEnC,WAAS,CAAC,YAAY,YAAY,KAAK,OAAO,QAAQ,aAAa,GAAG;AACpE,QAAI,OAAO,aAAa,cAAc,UAAU;AAC9C,UAAI,aAAa,SAAS,IAAI;AAAA,IAChC;AAAA,EACF;AAEA,SAAO;AACT;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,6 @@
1
1
  export declare const COMMAND_REGEXP: RegExp;
2
2
  /**
3
- * A function that checks if a value is an argument that looks like command, i.e. space-separated
4
- * words consisting only of letters, numbers (but not at the start of the word) or dashes.
3
+ * A function that checks if a value is an argument that looks like command, i.e. space-separated words consisting only of letters, numbers (but not at the start of the word) or dashes.
5
4
  *
6
5
  * @param value The value to check.
7
6
  * @return `true` if `value` is a command.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../source/internals/isCommand.ts"],
4
- "sourcesContent": ["export const COMMAND_REGEXP = /^(?:[a-z][-a-z0-9]*[a-z])+(?:\\s(?:[a-z][-a-z0-9]*[a-z])+)*$/iu;\n\n/**\n * A function that checks if a value is an argument that looks like command, i.e. space-separated\n * words consisting only of letters, numbers (but not at the start of the word) or dashes.\n *\n * @param value The value to check.\n * @return `true` if `value` is a command.\n */\nexport function isCommand(value: string): boolean {\n return COMMAND_REGEXP.test(value);\n}\n"],
5
- "mappings": "AAAO,aAAM,iBAAiB;AASvB,gBAAS,UAAU,OAAwB;AAChD,SAAO,eAAe,KAAK,KAAK;AAClC;",
4
+ "sourcesContent": ["export const COMMAND_REGEXP = /^(?:[a-z][-a-z0-9]*[a-z])+(?:\\s(?:[a-z][-a-z0-9]*[a-z])+)*$/iu;\n\n/**\n * A function that checks if a value is an argument that looks like command, i.e. space-separated words consisting only of letters, numbers (but not at the start of the word) or dashes.\n *\n * @param value The value to check.\n * @return `true` if `value` is a command.\n */\nexport function isCommand(value: string): boolean {\n return COMMAND_REGEXP.test(value);\n}\n"],
5
+ "mappings": "AAAO,aAAM,iBAAiB;AAQvB,gBAAS,UAAU,OAAwB;AAChD,SAAO,eAAe,KAAK,KAAK;AAClC;",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,5 @@
1
1
  /**
2
- * A function that checks if a string value is a false string. A false string is `'false'`, `'0'`,
3
- * `'no'`, or `'off'` (case insensitive).
2
+ * A function that checks if a string value is a false string. A false string is `'false'`, `'0'`, `'no'`, or `'off'` (case insensitive).
4
3
  *
5
4
  * @param value The value to be tested.
6
5
  * @return `true` if string is a false string. */
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../source/internals/isFalseString.ts"],
4
- "sourcesContent": ["const FALSE_STRING_REGEXP = /^\\s*(?:false|0|no|off)\\s*$/iu;\n\n/**\n * A function that checks if a string value is a false string. A false string is `'false'`, `'0'`,\n * `'no'`, or `'off'` (case insensitive).\n *\n * @param value The value to be tested.\n * @return `true` if string is a false string. */\nexport function isFalseString(value: string) {\n return FALSE_STRING_REGEXP.test(value);\n}\n"],
5
- "mappings": "AAAA,MAAM,sBAAsB;AAQrB,gBAAS,cAAc,OAAe;AAC3C,SAAO,oBAAoB,KAAK,KAAK;AACvC;",
4
+ "sourcesContent": ["const FALSE_STRING_REGEXP = /^\\s*(?:false|0|no|off)\\s*$/iu;\n\n/**\n * A function that checks if a string value is a false string. A false string is `'false'`, `'0'`, `'no'`, or `'off'` (case insensitive).\n *\n * @param value The value to be tested.\n * @return `true` if string is a false string. */\nexport function isFalseString(value: string) {\n return FALSE_STRING_REGEXP.test(value);\n}\n"],
5
+ "mappings": "AAAA,MAAM,sBAAsB;AAOrB,gBAAS,cAAc,OAAe;AAC3C,SAAO,oBAAoB,KAAK,KAAK;AACvC;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,5 @@
1
1
  /**
2
- * A function that checks if a value is an argument that looks like a long option, i.e. two dashes
3
- * and a single word consisting only of letters, numbers (but not at the start of the word) or
4
- * dashes; e.g. `'--some-option'`.
2
+ * A function that checks if a value is an argument that looks like a long option, i.e. two dashes and a single word consisting only of letters, numbers (but not at the start of the word) or dashes; e.g. `'--some-option'`.
5
3
  *
6
4
  * @param value The value to check.
7
5
  * @return `true` if `value` is a long option.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../source/internals/isLongOption.ts"],
4
- "sourcesContent": ["const LONG_OPTION_REGEXP = /^--[a-z][-a-z0-9]+$/iu;\n\n/**\n * A function that checks if a value is an argument that looks like a long option, i.e. two dashes\n * and a single word consisting only of letters, numbers (but not at the start of the word) or\n * dashes; e.g. `'--some-option'`.\n *\n * @param value The value to check.\n * @return `true` if `value` is a long option.\n */\nexport function isLongOption(arg: string): boolean {\n return LONG_OPTION_REGEXP.test(arg);\n}\n"],
5
- "mappings": "AAAA,MAAM,qBAAqB;AAUpB,gBAAS,aAAa,KAAsB;AACjD,SAAO,mBAAmB,KAAK,GAAG;AACpC;",
4
+ "sourcesContent": ["const LONG_OPTION_REGEXP = /^--[a-z][-a-z0-9]+$/iu;\n\n/**\n * A function that checks if a value is an argument that looks like a long option, i.e. two dashes and a single word consisting only of letters, numbers (but not at the start of the word) or dashes; e.g. `'--some-option'`.\n *\n * @param value The value to check.\n * @return `true` if `value` is a long option.\n */\nexport function isLongOption(arg: string): boolean {\n return LONG_OPTION_REGEXP.test(arg);\n}\n"],
5
+ "mappings": "AAAA,MAAM,qBAAqB;AAQpB,gBAAS,aAAa,KAAsB;AACjD,SAAO,mBAAmB,KAAK,GAAG;AACpC;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,5 @@
1
1
  /**
2
- * A function that checks if a value is an argument that looks like a long option, short option, or
3
- * a short options group i.e. one or two dashes and a single word consisting only of letters,
4
- * numbers (but not at the start of the word) or dashes, optionally followed by `=`.
2
+ * A function that checks if a value is an argument that looks like a long option, short option, or a short options group i.e. one or two dashes and a single word consisting only of letters, numbers (but not at the start of the word) or dashes, optionally followed by `=`.
5
3
  *
6
4
  * @param value The value to check.
7
5
  * @return `true` if `value` is an option.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../source/internals/isOptionLike.ts"],
4
- "sourcesContent": ["const OPTION_LIKE = /^-{1,2}[a-z][-a-z0-9]*=?/iu;\n\n/**\n * A function that checks if a value is an argument that looks like a long option, short option, or\n * a short options group i.e. one or two dashes and a single word consisting only of letters,\n * numbers (but not at the start of the word) or dashes, optionally followed by `=`.\n *\n * @param value The value to check.\n * @return `true` if `value` is an option.\n */\nexport function isOptionLike(value: string): boolean {\n return OPTION_LIKE.test(value);\n}\n"],
5
- "mappings": "AAAA,MAAM,cAAc;AAUb,gBAAS,aAAa,OAAwB;AACnD,SAAO,YAAY,KAAK,KAAK;AAC/B;",
4
+ "sourcesContent": ["const OPTION_LIKE = /^-{1,2}[a-z][-a-z0-9]*=?/iu;\n\n/**\n * A function that checks if a value is an argument that looks like a long option, short option, or a short options group i.e. one or two dashes and a single word consisting only of letters, numbers (but not at the start of the word) or dashes, optionally followed by `=`.\n *\n * @param value The value to check.\n * @return `true` if `value` is an option.\n */\nexport function isOptionLike(value: string): boolean {\n return OPTION_LIKE.test(value);\n}\n"],
5
+ "mappings": "AAAA,MAAM,cAAc;AAQb,gBAAS,aAAa,OAAwB;AACnD,SAAO,YAAY,KAAK,KAAK;AAC/B;",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,5 @@
1
1
  /**
2
- * A function that checks if a value is an argument that looks like a short option, i.e. a dash and
3
- * a single letter; e.g. `'-x'`.
2
+ * A function that checks if a value is an argument that looks like a short option, i.e. a dash and a single letter; e.g. `'-x'`.
4
3
  *
5
4
  * @param value The value to check.
6
5
  * @return `true` if `value` is a short option.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../source/internals/isShortOption.ts"],
4
- "sourcesContent": ["const SHORT_OPTION_REGEXP = /^-[a-z]{1}$/iu;\n\n/**\n * A function that checks if a value is an argument that looks like a short option, i.e. a dash and\n * a single letter; e.g. `'-x'`.\n *\n * @param value The value to check.\n * @return `true` if `value` is a short option.\n */\nexport function isShortOption(arg: string): boolean {\n return SHORT_OPTION_REGEXP.test(arg);\n}\n"],
5
- "mappings": "AAAA,MAAM,sBAAsB;AASrB,gBAAS,cAAc,KAAsB;AAClD,SAAO,oBAAoB,KAAK,GAAG;AACrC;",
4
+ "sourcesContent": ["const SHORT_OPTION_REGEXP = /^-[a-z]{1}$/iu;\n\n/**\n * A function that checks if a value is an argument that looks like a short option, i.e. a dash and a single letter; e.g. `'-x'`.\n *\n * @param value The value to check.\n * @return `true` if `value` is a short option.\n */\nexport function isShortOption(arg: string): boolean {\n return SHORT_OPTION_REGEXP.test(arg);\n}\n"],
5
+ "mappings": "AAAA,MAAM,sBAAsB;AAQrB,gBAAS,cAAc,KAAsB;AAClD,SAAO,oBAAoB,KAAK,GAAG;AACrC;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,6 @@
1
1
  export declare const SHORT_OPTIONS_GROUP_REGEXP: RegExp;
2
2
  /**
3
- * A function that checks if a value is an argument that looks like a short options group, i.e. a
4
- * dash and a single letter; e.g. `'-x'`.
3
+ * A function that checks if a value is an argument that looks like a short options group, i.e. a dash and a single letter; e.g. `'-x'`.
5
4
  *
6
5
  * @param value The value to check.
7
6
  * @return `true` if `value` is a short option.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../source/internals/isShortOptionsGroup.ts"],
4
- "sourcesContent": ["export const SHORT_OPTIONS_GROUP_REGEXP = /^-[a-z]{2,}$/iu;\n\n/**\n * A function that checks if a value is an argument that looks like a short options group, i.e. a\n * dash and a single letter; e.g. `'-x'`.\n *\n * @param value The value to check.\n * @return `true` if `value` is a short option.\n */\nexport function isShortOptionsGroup(arg: string): boolean {\n return SHORT_OPTIONS_GROUP_REGEXP.test(arg);\n}\n"],
5
- "mappings": "AAAO,aAAM,6BAA6B;AASnC,gBAAS,oBAAoB,KAAsB;AACxD,SAAO,2BAA2B,KAAK,GAAG;AAC5C;",
4
+ "sourcesContent": ["export const SHORT_OPTIONS_GROUP_REGEXP = /^-[a-z]{2,}$/iu;\n\n/**\n * A function that checks if a value is an argument that looks like a short options group, i.e. a dash and a single letter; e.g. `'-x'`.\n *\n * @param value The value to check.\n * @return `true` if `value` is a short option.\n */\nexport function isShortOptionsGroup(arg: string): boolean {\n return SHORT_OPTIONS_GROUP_REGEXP.test(arg);\n}\n"],
5
+ "mappings": "AAAO,aAAM,6BAA6B;AAQnC,gBAAS,oBAAoB,KAAsB;AACxD,SAAO,2BAA2B,KAAK,GAAG;AAC5C;",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,5 @@
1
1
  /**
2
- * A function that checks if a string value is a true string. A true string is `'true'`, `'1'`,
3
- * `'yes'`, or `'on'` (case insensitive).
2
+ * A function that checks if a string value is a true string. A true string is `'true'`, `'1'`, `'yes'`, or `'on'` (case insensitive).
4
3
  *
5
4
  * @param value The value to be tested.
6
5
  * @return `true` if string is a true string. */
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../source/internals/isTrueString.ts"],
4
- "sourcesContent": ["const TRUE_STRING_REGEXP = /^\\s*(?:true|1|yes|on)\\s*$/iu;\n\n/**\n * A function that checks if a string value is a true string. A true string is `'true'`, `'1'`,\n * `'yes'`, or `'on'` (case insensitive).\n *\n * @param value The value to be tested.\n * @return `true` if string is a true string. */\nexport function isTrueString(value: string) {\n return TRUE_STRING_REGEXP.test(value);\n}\n"],
5
- "mappings": "AAAA,MAAM,qBAAqB;AAQpB,gBAAS,aAAa,OAAe;AAC1C,SAAO,mBAAmB,KAAK,KAAK;AACtC;",
4
+ "sourcesContent": ["const TRUE_STRING_REGEXP = /^\\s*(?:true|1|yes|on)\\s*$/iu;\n\n/**\n * A function that checks if a string value is a true string. A true string is `'true'`, `'1'`, `'yes'`, or `'on'` (case insensitive).\n *\n * @param value The value to be tested.\n * @return `true` if string is a true string. */\nexport function isTrueString(value: string) {\n return TRUE_STRING_REGEXP.test(value);\n}\n"],
5
+ "mappings": "AAAA,MAAM,qBAAqB;AAOpB,gBAAS,aAAa,OAAe;AAC1C,SAAO,mBAAmB,KAAK,KAAK;AACtC;",
6
6
  "names": []
7
7
  }
@@ -2,8 +2,7 @@ import { type Arguments } from './Arguments.js';
2
2
  import { type Argv } from './Argv.js';
3
3
  import { type ParserConfig } from './ParserConfig.js';
4
4
  /**
5
- * Parses a list of command line arguments into an arguments object. Based on provided parser
6
- * config, raw arguments can be parsed as commands, options and parameters.
5
+ * Parses a list of command line arguments into an arguments object. Based on provided parser config, raw arguments can be parsed as commands, options and parameters.
7
6
  *
8
7
  * @param argv Raw arguments to be parsed.
9
8
  * @param parserConfig Parser configuration.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../source/parseArguments.ts"],
4
- "sourcesContent": ["import {type Arguments} from './Arguments.js';\nimport {type ArgumentsCommand} from './ArgumentsCommand.js';\nimport {type ArgumentsOptions} from './ArgumentsOptions.js';\nimport {type ArgumentsParameters} from './ArgumentsParameters.js';\nimport {type ArgumentsUnknownOptions} from './ArgumentsUnknownOptions.js';\nimport {type Argv} from './Argv.js';\nimport {\n castValue,\n Checker,\n CommandScope,\n commandToArguments,\n createOptionShortNameMap,\n expandArguments,\n isFalseString,\n isLongOption,\n isOptionLike,\n isShortOption,\n isTrueString,\n type NormalizedCommandsConfig,\n OptionScope,\n} from './internals.js';\nimport {type ParameterConfig} from './ParameterConfig.js';\nimport {type ParserConfig} from './ParserConfig.js';\nimport {ParsingError} from './ParsingError.js';\n\nfunction commitOptionScope(optionScope: OptionScope, parsedOptions: Record<string, unknown>) {\n let optionValue = optionScope.getValue();\n\n parsedOptions[optionScope.name] = optionValue;\n\n if (optionScope.config.validate) {\n optionScope.config.validate(parsedOptions[optionScope.name] as never); // type assertion needed to make TypeScript happy\n }\n}\n\n/**\n * Parses a list of command line arguments into an arguments object. Based on provided parser\n * config, raw arguments can be parsed as commands, options and parameters.\n *\n * @param argv Raw arguments to be parsed.\n * @param parserConfig Parser configuration.\n * @return Parsed arguments.\n *\n */\nexport function parseArguments<const O extends ParserConfig>(\n argv: Argv,\n parserConfig: O,\n): Arguments<O> {\n // create separate configs for commands, parameters and options\n let commandsConfig = parserConfig.commands ?? [];\n let parametersConfig = parserConfig.parameters ?? [];\n let optionsConfig = parserConfig.options ?? {};\n\n // check if parser config is valid\n let checker = new Checker();\n\n checker.checkCommandsConfig(commandsConfig);\n checker.checkParametersConfig(parametersConfig);\n checker.checkOptionsConfig(optionsConfig);\n\n // normalize some configs\n let normalizedCommandsConfig: NormalizedCommandsConfig = commandsConfig.map((command) => ({\n command: command.toLowerCase(),\n args: commandToArguments(command.toLowerCase()),\n }));\n let commandFirstArguments = new Set(\n normalizedCommandsConfig.map((commandConfig) => commandConfig.args[0]),\n );\n let optionShortNameMap =\n parserConfig.options ? createOptionShortNameMap(parserConfig.options) : {};\n\n // variables for keeping track of the parsing\n let parsedCommand: string | undefined;\n let parsedParameters: unknown[] = [];\n let parsedOptions: Record<string, unknown> = {};\n let parsedUnknownOptions: Record<string, unknown> = {};\n let restArgs: string[] = [];\n let optionScope: OptionScope | null = null;\n let commandScope: CommandScope | null = null;\n\n //\n let args = expandArguments(argv);\n\n for (let [i, arg] of args.entries()) {\n // extract rest arguments\n if (arg === '--') {\n restArgs.push(...args.slice(i + 1));\n\n break;\n }\n\n try {\n if (isOptionLike(arg)) {\n // first let's handle options\n\n if (optionScope) {\n commitOptionScope(\n optionScope,\n optionsConfig[optionScope.name] ? parsedOptions : parsedUnknownOptions,\n );\n }\n\n // if there is still unhandled `commandScope`, let's handle its args as parameters...\n if (commandScope) {\n let unhandledArgs = commandScope.getArgs();\n\n for (let unhandledArg of unhandledArgs) {\n if (parserConfig.allowUnknownParameters) {\n // let's handle other parameter\n parsedParameters.push(unhandledArg);\n } else {\n checker.addError(\n new ParsingError('UNKNOWN_PARAMETER', {messageParameters: [unhandledArg]}),\n );\n }\n }\n\n commandScope = null;\n }\n\n let optionName = arg;\n let optionValue;\n\n // Extract option name and value\n if (optionName.includes('=')) {\n let result = optionName.split('=', 2);\n\n if (result[0] && result[1]) {\n [optionName, optionValue] = result;\n }\n }\n\n if (isShortOption(optionName)) {\n let fullOptionName = optionShortNameMap[optionName.slice(1)];\n\n if (typeof fullOptionName === 'string') {\n optionName = fullOptionName;\n }\n } else if (isLongOption(optionName)) {\n optionName = optionName.slice(2);\n }\n\n let newOptionScope = new OptionScope(\n optionName,\n optionsConfig,\n parserConfig.allowUnknownOptions,\n );\n\n if (parsedOptions[newOptionScope.name] !== undefined) {\n if (newOptionScope.config.multiple) {\n newOptionScope.previousParsedValue = parsedOptions[newOptionScope.name];\n } else if (newOptionScope.config.type === 'number' && newOptionScope.config.count) {\n newOptionScope.previousParsedValue = parsedOptions[newOptionScope.name];\n }\n }\n\n if (optionValue !== undefined) {\n newOptionScope.captureArg(optionValue);\n }\n\n if (newOptionScope.isComplete()) {\n commitOptionScope(\n newOptionScope,\n optionsConfig[newOptionScope.name] ? parsedOptions : parsedUnknownOptions,\n );\n\n optionScope = null;\n } else {\n optionScope = newOptionScope;\n }\n } else if (\n optionScope &&\n !(optionScope.config.type === 'boolean' && !optionScope.config.multiple)\n ) {\n // let's handle adding more values to previous option, but not if it's signle boolean option\n\n optionScope.captureArg(arg);\n\n if (optionScope.isComplete()) {\n commitOptionScope(\n optionScope,\n optionsConfig[optionScope.name] ? parsedOptions : parsedUnknownOptions,\n );\n\n optionScope = null;\n }\n } else if (\n optionScope?.config.type === 'boolean' &&\n !optionScope.config.multiple &&\n (isFalseString(arg) || isTrueString(arg))\n ) {\n // we're adding value to a single boolean option only if the value is \"false\" or \"true\"\n // string\n optionScope.captureArg(arg);\n\n if (optionScope.isComplete()) {\n commitOptionScope(\n optionScope,\n optionsConfig[optionScope.name] ? parsedOptions : parsedUnknownOptions,\n );\n\n optionScope = null;\n }\n } else if (commandScope) {\n // let's handle rest of the command\n\n commandScope.captureArg(arg);\n\n if (commandScope.isComplete()) {\n parsedCommand = commandScope.getValue();\n commandScope = null;\n } else if (commandScope.isDone()) {\n let unhandledArgs = commandScope.getArgs();\n\n for (let unhandledArg of unhandledArgs) {\n if (parserConfig.allowUnknownParameters) {\n // let's handle other parameter\n parsedParameters.push(unhandledArg);\n } else {\n checker.addError(\n new ParsingError('UNKNOWN_PARAMETER', {messageParameters: [unhandledArg]}),\n );\n }\n }\n\n commandScope = null;\n }\n } else if (parsedCommand === undefined && commandFirstArguments.has(arg.toLowerCase())) {\n // let's handle command\n\n let newCommandScope = new CommandScope(arg, normalizedCommandsConfig);\n\n if (newCommandScope.isComplete()) {\n parsedCommand = newCommandScope.getValue();\n commandScope = null;\n } else {\n commandScope = newCommandScope;\n }\n } else if (parametersConfig[parsedParameters.length]) {\n // let's handle configured parameter\n let parameterConfig = parametersConfig[parsedParameters.length] as ParameterConfig;\n let parameterValue = castValue(arg, parameterConfig.type);\n\n if (\n parameterConfig.type !== 'boolean' &&\n parameterConfig.choices !== undefined &&\n !parameterConfig.choices.includes(parameterValue as never) // during runtime `parameterValue` has correct type\n ) {\n throw new ParsingError('INVALID_PARAMETER', {\n messageParameters: [\n parameterValue,\n parameterConfig.label ?? parsedParameters.length,\n parameterConfig.choices.map((choice) => `\"${choice}\"`).join(', '),\n ],\n });\n }\n\n parsedParameters.push(parameterValue);\n\n if (parameterConfig.validate) {\n parameterConfig.validate(parameterValue as never); // during runtime `parameterValue` has correct type\n }\n } else if (parserConfig.allowUnknownParameters) {\n // let's handle other parameter\n parsedParameters.push(arg);\n } else {\n throw new ParsingError('UNKNOWN_PARAMETER', {messageParameters: [arg]});\n }\n } catch (error: unknown) {\n optionScope = null;\n commandScope = null;\n\n checker.addError(error as Error);\n }\n }\n\n try {\n if (optionScope) {\n commitOptionScope(\n optionScope,\n optionsConfig[optionScope.name] ? parsedOptions : parsedUnknownOptions,\n );\n }\n\n // if there is still unhandled `commandScope`, let's handle its args as parameters...\n if (commandScope) {\n let unhandledArgs = commandScope.getArgs();\n\n for (let unhandledArg of unhandledArgs) {\n if (parserConfig.allowUnknownParameters) {\n // let's handle other parameter\n parsedParameters.push(unhandledArg);\n } else {\n checker.addError(\n new ParsingError('UNKNOWN_PARAMETER', {messageParameters: [unhandledArg]}),\n );\n }\n }\n }\n\n // if there are missing parsed parameters, add undefined\n for (let [i] of parametersConfig.entries()) {\n if (parsedParameters[i] === undefined) {\n parsedParameters[i] = undefined;\n }\n }\n\n // handle default option values...\n for (let [optionName, optionConfig] of Object.entries(optionsConfig)) {\n if (parsedOptions[optionName] === undefined && optionConfig.defaultValue !== undefined) {\n parsedOptions[optionName] = optionConfig.defaultValue;\n } else if (parsedOptions[optionName] === undefined) {\n parsedOptions[optionName] = undefined;\n }\n }\n\n // handle default parameters values...\n for (let [i, parameterConfig] of parametersConfig.entries()) {\n if (parsedParameters[i] === undefined && parameterConfig.defaultValue !== undefined) {\n parsedParameters[i] = parameterConfig.defaultValue;\n }\n }\n } catch (error: unknown) {\n checker.addError(error as Error);\n }\n\n checker.checkParsedParameters(parametersConfig, parsedParameters);\n checker.checkParsedOptions(optionsConfig, parsedOptions);\n\n return {\n command: (normalizedCommandsConfig.length ? parsedCommand : null) as ArgumentsCommand<O>,\n parameters: (parametersConfig.length || parserConfig.allowUnknownParameters ?\n parsedParameters\n : null) as ArgumentsParameters<O>,\n options: (Object.keys(optionsConfig).length ? parsedOptions : null) as ArgumentsOptions<O>,\n unknownOptions: (parserConfig.allowUnknownOptions ? parsedUnknownOptions : (\n null\n )) as ArgumentsUnknownOptions<O>,\n rest: restArgs,\n errors: checker.errors,\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {type Arguments} from './Arguments.js';\nimport {type ArgumentsCommand} from './ArgumentsCommand.js';\nimport {type ArgumentsOptions} from './ArgumentsOptions.js';\nimport {type ArgumentsParameters} from './ArgumentsParameters.js';\nimport {type ArgumentsUnknownOptions} from './ArgumentsUnknownOptions.js';\nimport {type Argv} from './Argv.js';\nimport {\n castValue,\n Checker,\n CommandScope,\n commandToArguments,\n createOptionShortNameMap,\n expandArguments,\n isFalseString,\n isLongOption,\n isOptionLike,\n isShortOption,\n isTrueString,\n type NormalizedCommandsConfig,\n OptionScope,\n} from './internals.js';\nimport {type ParameterConfig} from './ParameterConfig.js';\nimport {type ParserConfig} from './ParserConfig.js';\nimport {ParsingError} from './ParsingError.js';\n\nfunction commitOptionScope(optionScope: OptionScope, parsedOptions: Record<string, unknown>) {\n let optionValue = optionScope.getValue();\n\n parsedOptions[optionScope.name] = optionValue;\n\n if (optionScope.config.validate) {\n optionScope.config.validate(parsedOptions[optionScope.name] as never); // type assertion needed to make TypeScript happy\n }\n}\n\n/**\n * Parses a list of command line arguments into an arguments object. Based on provided parser config, raw arguments can be parsed as commands, options and parameters.\n *\n * @param argv Raw arguments to be parsed.\n * @param parserConfig Parser configuration.\n * @return Parsed arguments.\n *\n */\nexport function parseArguments<const O extends ParserConfig>(\n argv: Argv,\n parserConfig: O,\n): Arguments<O> {\n // create separate configs for commands, parameters and options\n let commandsConfig = parserConfig.commands ?? [];\n let parametersConfig = parserConfig.parameters ?? [];\n let optionsConfig = parserConfig.options ?? {};\n\n // check if parser config is valid\n let checker = new Checker();\n\n checker.checkCommandsConfig(commandsConfig);\n checker.checkParametersConfig(parametersConfig);\n checker.checkOptionsConfig(optionsConfig);\n\n // normalize some configs\n let normalizedCommandsConfig: NormalizedCommandsConfig = commandsConfig.map((command) => ({\n command: command.toLowerCase(),\n args: commandToArguments(command.toLowerCase()),\n }));\n let commandFirstArguments = new Set(\n normalizedCommandsConfig.map((commandConfig) => commandConfig.args[0]),\n );\n let optionShortNameMap =\n parserConfig.options ? createOptionShortNameMap(parserConfig.options) : {};\n\n // variables for keeping track of the parsing\n let parsedCommand: string | undefined;\n let parsedParameters: unknown[] = [];\n let parsedOptions: Record<string, unknown> = {};\n let parsedUnknownOptions: Record<string, unknown> = {};\n let restArgs: string[] = [];\n let optionScope: OptionScope | null = null;\n let commandScope: CommandScope | null = null;\n\n //\n let args = expandArguments(argv);\n\n for (let [i, arg] of args.entries()) {\n // extract rest arguments\n if (arg === '--') {\n restArgs.push(...args.slice(i + 1));\n\n break;\n }\n\n try {\n if (isOptionLike(arg)) {\n // first let's handle options\n\n if (optionScope) {\n commitOptionScope(\n optionScope,\n optionsConfig[optionScope.name] ? parsedOptions : parsedUnknownOptions,\n );\n }\n\n // if there is still unhandled `commandScope`, let's handle its args as parameters...\n if (commandScope) {\n let unhandledArgs = commandScope.getArgs();\n\n for (let unhandledArg of unhandledArgs) {\n if (parserConfig.allowUnknownParameters) {\n // let's handle other parameter\n parsedParameters.push(unhandledArg);\n } else {\n checker.addError(\n new ParsingError('UNKNOWN_PARAMETER', {messageParameters: [unhandledArg]}),\n );\n }\n }\n\n commandScope = null;\n }\n\n let optionName = arg;\n let optionValue;\n\n // Extract option name and value\n if (optionName.includes('=')) {\n let result = optionName.split('=', 2);\n\n if (result[0] && result[1]) {\n [optionName, optionValue] = result;\n }\n }\n\n if (isShortOption(optionName)) {\n let fullOptionName = optionShortNameMap[optionName.slice(1)];\n\n if (typeof fullOptionName === 'string') {\n optionName = fullOptionName;\n }\n } else if (isLongOption(optionName)) {\n optionName = optionName.slice(2);\n }\n\n let newOptionScope = new OptionScope(\n optionName,\n optionsConfig,\n parserConfig.allowUnknownOptions,\n );\n\n if (parsedOptions[newOptionScope.name] !== undefined) {\n if (newOptionScope.config.multiple) {\n newOptionScope.previousParsedValue = parsedOptions[newOptionScope.name];\n } else if (newOptionScope.config.type === 'number' && newOptionScope.config.count) {\n newOptionScope.previousParsedValue = parsedOptions[newOptionScope.name];\n }\n }\n\n if (optionValue !== undefined) {\n newOptionScope.captureArg(optionValue);\n }\n\n if (newOptionScope.isComplete()) {\n commitOptionScope(\n newOptionScope,\n optionsConfig[newOptionScope.name] ? parsedOptions : parsedUnknownOptions,\n );\n\n optionScope = null;\n } else {\n optionScope = newOptionScope;\n }\n } else if (\n optionScope &&\n !(optionScope.config.type === 'boolean' && !optionScope.config.multiple)\n ) {\n // let's handle adding more values to previous option, but not if it's signle boolean option\n\n optionScope.captureArg(arg);\n\n if (optionScope.isComplete()) {\n commitOptionScope(\n optionScope,\n optionsConfig[optionScope.name] ? parsedOptions : parsedUnknownOptions,\n );\n\n optionScope = null;\n }\n } else if (\n optionScope?.config.type === 'boolean' &&\n !optionScope.config.multiple &&\n (isFalseString(arg) || isTrueString(arg))\n ) {\n // we're adding value to a single boolean option only if the value is \"false\" or \"true\" string\n optionScope.captureArg(arg);\n\n if (optionScope.isComplete()) {\n commitOptionScope(\n optionScope,\n optionsConfig[optionScope.name] ? parsedOptions : parsedUnknownOptions,\n );\n\n optionScope = null;\n }\n } else if (commandScope) {\n // let's handle rest of the command\n\n commandScope.captureArg(arg);\n\n if (commandScope.isComplete()) {\n parsedCommand = commandScope.getValue();\n commandScope = null;\n } else if (commandScope.isDone()) {\n let unhandledArgs = commandScope.getArgs();\n\n for (let unhandledArg of unhandledArgs) {\n if (parserConfig.allowUnknownParameters) {\n // let's handle other parameter\n parsedParameters.push(unhandledArg);\n } else {\n checker.addError(\n new ParsingError('UNKNOWN_PARAMETER', {messageParameters: [unhandledArg]}),\n );\n }\n }\n\n commandScope = null;\n }\n } else if (parsedCommand === undefined && commandFirstArguments.has(arg.toLowerCase())) {\n // let's handle command\n\n let newCommandScope = new CommandScope(arg, normalizedCommandsConfig);\n\n if (newCommandScope.isComplete()) {\n parsedCommand = newCommandScope.getValue();\n commandScope = null;\n } else {\n commandScope = newCommandScope;\n }\n } else if (parametersConfig[parsedParameters.length]) {\n // let's handle configured parameter\n let parameterConfig = parametersConfig[parsedParameters.length] as ParameterConfig;\n let parameterValue = castValue(arg, parameterConfig.type);\n\n if (\n parameterConfig.type !== 'boolean' &&\n parameterConfig.choices !== undefined &&\n !parameterConfig.choices.includes(parameterValue as never) // during runtime `parameterValue` has correct type\n ) {\n throw new ParsingError('INVALID_PARAMETER', {\n messageParameters: [\n parameterValue,\n parameterConfig.label ?? parsedParameters.length,\n parameterConfig.choices.map((choice) => `\"${choice}\"`).join(', '),\n ],\n });\n }\n\n parsedParameters.push(parameterValue);\n\n if (parameterConfig.validate) {\n parameterConfig.validate(parameterValue as never); // during runtime `parameterValue` has correct type\n }\n } else if (parserConfig.allowUnknownParameters) {\n // let's handle other parameter\n parsedParameters.push(arg);\n } else {\n throw new ParsingError('UNKNOWN_PARAMETER', {messageParameters: [arg]});\n }\n } catch (error: unknown) {\n optionScope = null;\n commandScope = null;\n\n checker.addError(error as Error);\n }\n }\n\n try {\n if (optionScope) {\n commitOptionScope(\n optionScope,\n optionsConfig[optionScope.name] ? parsedOptions : parsedUnknownOptions,\n );\n }\n\n // if there is still unhandled `commandScope`, let's handle its args as parameters...\n if (commandScope) {\n let unhandledArgs = commandScope.getArgs();\n\n for (let unhandledArg of unhandledArgs) {\n if (parserConfig.allowUnknownParameters) {\n // let's handle other parameter\n parsedParameters.push(unhandledArg);\n } else {\n checker.addError(\n new ParsingError('UNKNOWN_PARAMETER', {messageParameters: [unhandledArg]}),\n );\n }\n }\n }\n\n // if there are missing parsed parameters, add undefined\n for (let [i] of parametersConfig.entries()) {\n if (parsedParameters[i] === undefined) {\n parsedParameters[i] = undefined;\n }\n }\n\n // handle default option values...\n for (let [optionName, optionConfig] of Object.entries(optionsConfig)) {\n if (parsedOptions[optionName] === undefined && optionConfig.defaultValue !== undefined) {\n parsedOptions[optionName] = optionConfig.defaultValue;\n } else if (parsedOptions[optionName] === undefined) {\n parsedOptions[optionName] = undefined;\n }\n }\n\n // handle default parameters values...\n for (let [i, parameterConfig] of parametersConfig.entries()) {\n if (parsedParameters[i] === undefined && parameterConfig.defaultValue !== undefined) {\n parsedParameters[i] = parameterConfig.defaultValue;\n }\n }\n } catch (error: unknown) {\n checker.addError(error as Error);\n }\n\n checker.checkParsedParameters(parametersConfig, parsedParameters);\n checker.checkParsedOptions(optionsConfig, parsedOptions);\n\n return {\n command: (normalizedCommandsConfig.length ? parsedCommand : null) as ArgumentsCommand<O>,\n parameters: (parametersConfig.length || parserConfig.allowUnknownParameters ?\n parsedParameters\n : null) as ArgumentsParameters<O>,\n options: (Object.keys(optionsConfig).length ? parsedOptions : null) as ArgumentsOptions<O>,\n unknownOptions: (parserConfig.allowUnknownOptions ? parsedUnknownOptions : (\n null\n )) as ArgumentsUnknownOptions<O>,\n rest: restArgs,\n errors: checker.errors,\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jakubmazanec/args",
3
- "version": "2.0.19-unstable.72f063e3",
3
+ "version": "2.0.20-next.24efc8d1f",
4
4
  "description": "TypeScript-first library for parsing command line arguments.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -17,9 +17,9 @@
17
17
  "source"
18
18
  ],
19
19
  "scripts": {
20
- "build": "del-cli build tsconfig.tsbuildinfo && esbuild \"source/**/*\" --platform=node --target=node24.3 --outdir=build --sourcemap && tsc",
20
+ "build": "del-cli build tsconfig.tsbuildinfo && esbuild \"source/**/*\" --platform=node --target=node24.22 --outdir=build --sourcemap && tsc",
21
21
  "clean": "del-cli coverage build *.tsbuildinfo",
22
- "develop": "concurrently \"esbuild \"source/**/*\" --platform=node --target=node24.3 --outdir=build --sourcemap --watch\" \"tsc --watch\"",
22
+ "develop": "concurrently \"esbuild \"source/**/*\" --platform=node --target=node24.22 --outdir=build --sourcemap --watch\" \"tsc --watch\"",
23
23
  "document": "del-cli docs && typedoc --options typedoc.config.cjs",
24
24
  "format": "prettier . --write --ignore-unknown",
25
25
  "lint": "eslint .",
@@ -27,29 +27,29 @@
27
27
  "typecheck": "tsc --project tsconfig.typecheck.json"
28
28
  },
29
29
  "dependencies": {
30
- "@jakubmazanec/error": "3.0.19-unstable.72f063e3",
31
- "@jakubmazanec/ts-utils": "3.0.20-unstable.72f063e3",
30
+ "@jakubmazanec/error": "3.0.20-next.24efc8d1f",
31
+ "@jakubmazanec/ts-utils": "3.0.21-next.24efc8d1f",
32
32
  "lodash": "^4.18.1"
33
33
  },
34
34
  "devDependencies": {
35
- "@jakubmazanec/eslint-config": "6.0.0-unstable.72f063e3",
36
- "@types/lodash": "^4.17.24",
37
- "@types/node": "^24.0.4",
38
- "@vitest/coverage-v8": "^4.1.10",
39
- "concurrently": "^10.0.3",
35
+ "@jakubmazanec/eslint-config": "5.0.2-next.24efc8d1f",
36
+ "@types/lodash": "^4.17.26",
37
+ "@types/node": "^24.19.2",
38
+ "@vitest/coverage-v8": "^4.1.12",
39
+ "concurrently": "^10.0.6",
40
40
  "del-cli": "^7.0.0",
41
- "esbuild": "^0.28.1",
42
- "eslint": "^9.39.4",
43
- "prettier": "^3.9.5",
41
+ "esbuild": "^0.28.2",
42
+ "eslint": "^9.39.5",
43
+ "prettier": "^3.9.10",
44
44
  "prettier-plugin-packagejson": "^2.5.22",
45
45
  "typedoc": "^0.28.20",
46
- "typedoc-plugin-markdown": "^4.12.0",
47
- "typescript": "^6.0.0",
48
- "vitest": "^4.1.10"
46
+ "typedoc-plugin-markdown": "^4.14.0",
47
+ "typescript": "^6.0.3",
48
+ "vitest": "^4.1.12"
49
49
  },
50
- "packageManager": "npm@11.3.0",
50
+ "packageManager": "npm@11.21.1",
51
51
  "engines": {
52
- "node": "^24.3.0",
53
- "npm": "^11.3.0"
52
+ "node": "^24.22.0",
53
+ "npm": "^11.21.1"
54
54
  }
55
55
  }
@@ -1,8 +1,7 @@
1
1
  import {type OptionsConfig} from '../OptionsConfig.js';
2
2
 
3
3
  /**
4
- * Converts options config to a map (i.e. an object) of short option names (object keys) to long
5
- * option names (values).
4
+ * Converts options config to a map (i.e. an object) of short option names (object keys) to long option names (values).
6
5
  *
7
6
  * @optionsConfig Options config to create the map from.
8
7
  * @return Resulting map.
@@ -1,8 +1,7 @@
1
1
  export const COMMAND_REGEXP = /^(?:[a-z][-a-z0-9]*[a-z])+(?:\s(?:[a-z][-a-z0-9]*[a-z])+)*$/iu;
2
2
 
3
3
  /**
4
- * A function that checks if a value is an argument that looks like command, i.e. space-separated
5
- * words consisting only of letters, numbers (but not at the start of the word) or dashes.
4
+ * A function that checks if a value is an argument that looks like command, i.e. space-separated words consisting only of letters, numbers (but not at the start of the word) or dashes.
6
5
  *
7
6
  * @param value The value to check.
8
7
  * @return `true` if `value` is a command.
@@ -1,8 +1,7 @@
1
1
  const FALSE_STRING_REGEXP = /^\s*(?:false|0|no|off)\s*$/iu;
2
2
 
3
3
  /**
4
- * A function that checks if a string value is a false string. A false string is `'false'`, `'0'`,
5
- * `'no'`, or `'off'` (case insensitive).
4
+ * A function that checks if a string value is a false string. A false string is `'false'`, `'0'`, `'no'`, or `'off'` (case insensitive).
6
5
  *
7
6
  * @param value The value to be tested.
8
7
  * @return `true` if string is a false string. */
@@ -1,9 +1,7 @@
1
1
  const LONG_OPTION_REGEXP = /^--[a-z][-a-z0-9]+$/iu;
2
2
 
3
3
  /**
4
- * A function that checks if a value is an argument that looks like a long option, i.e. two dashes
5
- * and a single word consisting only of letters, numbers (but not at the start of the word) or
6
- * dashes; e.g. `'--some-option'`.
4
+ * A function that checks if a value is an argument that looks like a long option, i.e. two dashes and a single word consisting only of letters, numbers (but not at the start of the word) or dashes; e.g. `'--some-option'`.
7
5
  *
8
6
  * @param value The value to check.
9
7
  * @return `true` if `value` is a long option.
@@ -1,9 +1,7 @@
1
1
  const OPTION_LIKE = /^-{1,2}[a-z][-a-z0-9]*=?/iu;
2
2
 
3
3
  /**
4
- * A function that checks if a value is an argument that looks like a long option, short option, or
5
- * a short options group i.e. one or two dashes and a single word consisting only of letters,
6
- * numbers (but not at the start of the word) or dashes, optionally followed by `=`.
4
+ * A function that checks if a value is an argument that looks like a long option, short option, or a short options group i.e. one or two dashes and a single word consisting only of letters, numbers (but not at the start of the word) or dashes, optionally followed by `=`.
7
5
  *
8
6
  * @param value The value to check.
9
7
  * @return `true` if `value` is an option.
@@ -1,8 +1,7 @@
1
1
  const SHORT_OPTION_REGEXP = /^-[a-z]{1}$/iu;
2
2
 
3
3
  /**
4
- * A function that checks if a value is an argument that looks like a short option, i.e. a dash and
5
- * a single letter; e.g. `'-x'`.
4
+ * A function that checks if a value is an argument that looks like a short option, i.e. a dash and a single letter; e.g. `'-x'`.
6
5
  *
7
6
  * @param value The value to check.
8
7
  * @return `true` if `value` is a short option.
@@ -1,8 +1,7 @@
1
1
  export const SHORT_OPTIONS_GROUP_REGEXP = /^-[a-z]{2,}$/iu;
2
2
 
3
3
  /**
4
- * A function that checks if a value is an argument that looks like a short options group, i.e. a
5
- * dash and a single letter; e.g. `'-x'`.
4
+ * A function that checks if a value is an argument that looks like a short options group, i.e. a dash and a single letter; e.g. `'-x'`.
6
5
  *
7
6
  * @param value The value to check.
8
7
  * @return `true` if `value` is a short option.
@@ -1,8 +1,7 @@
1
1
  const TRUE_STRING_REGEXP = /^\s*(?:true|1|yes|on)\s*$/iu;
2
2
 
3
3
  /**
4
- * A function that checks if a string value is a true string. A true string is `'true'`, `'1'`,
5
- * `'yes'`, or `'on'` (case insensitive).
4
+ * A function that checks if a string value is a true string. A true string is `'true'`, `'1'`, `'yes'`, or `'on'` (case insensitive).
6
5
  *
7
6
  * @param value The value to be tested.
8
7
  * @return `true` if string is a true string. */
@@ -34,8 +34,7 @@ function commitOptionScope(optionScope: OptionScope, parsedOptions: Record<strin
34
34
  }
35
35
 
36
36
  /**
37
- * Parses a list of command line arguments into an arguments object. Based on provided parser
38
- * config, raw arguments can be parsed as commands, options and parameters.
37
+ * Parses a list of command line arguments into an arguments object. Based on provided parser config, raw arguments can be parsed as commands, options and parameters.
39
38
  *
40
39
  * @param argv Raw arguments to be parsed.
41
40
  * @param parserConfig Parser configuration.
@@ -189,8 +188,7 @@ export function parseArguments<const O extends ParserConfig>(
189
188
  !optionScope.config.multiple &&
190
189
  (isFalseString(arg) || isTrueString(arg))
191
190
  ) {
192
- // we're adding value to a single boolean option only if the value is "false" or "true"
193
- // string
191
+ // we're adding value to a single boolean option only if the value is "false" or "true" string
194
192
  optionScope.captureArg(arg);
195
193
 
196
194
  if (optionScope.isComplete()) {